From 08c2e9c13d09072f52babc99c7337344690c2338 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Fri, 12 Jun 2026 20:06:22 +0200 Subject: [PATCH] Add wasm tacle-bench targets --- targets/wasm-tacle/app/lift/CMakeLists.txt | 27 + targets/wasm-tacle/app/lift/README | 31 + targets/wasm-tacle/app/lift/changeLog.txt | 46 + .../app/lift/generated/default/lift.wasm | Bin 0 -> 7085 bytes .../app/lift/generated/default/lift.wat | 2167 + .../generated/modified_sources/default/lift.c | 130 + .../modified_sources/default/liftlibcontrol.c | 267 + .../modified_sources/default/liftlibcontrol.h | 62 + .../modified_sources/default/liftlibio.c | 69 + .../modified_sources/default/liftlibio.h | 28 + .../generated/modified_sources/inline/lift.c | 138 + .../modified_sources/inline/liftlibcontrol.c | 267 + .../modified_sources/inline/liftlibcontrol.h | 63 + .../modified_sources/inline/liftlibio.c | 69 + .../modified_sources/inline/liftlibio.h | 28 + targets/wasm-tacle/app/lift/lift.c | 132 + targets/wasm-tacle/app/lift/liftlibcontrol.c | 277 + targets/wasm-tacle/app/lift/liftlibcontrol.h | 64 + targets/wasm-tacle/app/lift/liftlibio.c | 65 + targets/wasm-tacle/app/lift/liftlibio.h | 27 + .../wasm-tacle/app/powerwindow/CMakeLists.txt | 35 + targets/wasm-tacle/app/powerwindow/changeLog | 42 + .../generated/default/powerwindow.wasm | Bin 0 -> 30816 bytes .../generated/default/powerwindow.wat | 2868 + .../modified_sources/default/powerwindow.c | 782 + .../modified_sources/default/powerwindow.h | 23 + .../default/powerwindow_PW_Control_DRV.c | 328 + .../default/powerwindow_PW_Control_DRV.h | 154 + .../powerwindow_PW_Control_DRV_private.h | 31 + .../powerwindow_PW_Control_DRV_types.h | 34 + .../powerwindow_PW_Control_PSG_BackL.c | 192 + .../powerwindow_PW_Control_PSG_BackL.h | 139 + ...powerwindow_PW_Control_PSG_BackL_private.h | 31 + .../powerwindow_PW_Control_PSG_BackL_types.h | 34 + .../powerwindow_PW_Control_PSG_BackR.c | 192 + .../powerwindow_PW_Control_PSG_BackR.h | 139 + ...powerwindow_PW_Control_PSG_BackR_private.h | 31 + .../powerwindow_PW_Control_PSG_BackR_types.h | 34 + .../powerwindow_PW_Control_PSG_Front.c | 198 + .../powerwindow_PW_Control_PSG_Front.h | 139 + ...powerwindow_PW_Control_PSG_Front_private.h | 31 + .../powerwindow_PW_Control_PSG_Front_types.h | 34 + .../default/powerwindow_const_params.c | 26 + .../default/powerwindow_controlexclusion.c | 89 + .../default/powerwindow_controlexclusion.h | 77 + .../powerwindow_controlexclusion_private.h | 31 + .../powerwindow_controlexclusion_types.h | 31 + .../default/powerwindow_debounce.c | 228 + .../default/powerwindow_debounce.h | 102 + .../default/powerwindow_debounce_private.h | 49 + .../default/powerwindow_debounce_types.h | 33 + .../default/powerwindow_inputs.c | 1097 + .../powerwindow_model_reference_types.h | 52 + .../default/powerwindow_powerwindow_control.c | 591 + .../default/powerwindow_powerwindow_control.h | 136 + .../powerwindow_powerwindow_control_private.h | 59 + .../powerwindow_powerwindow_control_types.h | 34 + .../default/powerwindow_rtw_continuous.h | 127 + .../default/powerwindow_rtw_solver.h | 255 + .../default/powerwindow_rtwtypes.h | 201 + .../default/powerwindow_tmwtypes.h | 813 + .../modified_sources/default/wcclib.c | 16 + .../modified_sources/default/wcclib.h | 15 + .../modified_sources/inline/powerwindow.c | 819 + .../modified_sources/inline/powerwindow.h | 23 + .../inline/powerwindow_PW_Control_DRV.c | 331 + .../inline/powerwindow_PW_Control_DRV.h | 157 + .../powerwindow_PW_Control_DRV_private.h | 31 + .../inline/powerwindow_PW_Control_DRV_types.h | 34 + .../inline/powerwindow_PW_Control_PSG_BackL.c | 195 + .../inline/powerwindow_PW_Control_PSG_BackL.h | 142 + ...powerwindow_PW_Control_PSG_BackL_private.h | 31 + .../powerwindow_PW_Control_PSG_BackL_types.h | 34 + .../inline/powerwindow_PW_Control_PSG_BackR.c | 195 + .../inline/powerwindow_PW_Control_PSG_BackR.h | 142 + ...powerwindow_PW_Control_PSG_BackR_private.h | 31 + .../powerwindow_PW_Control_PSG_BackR_types.h | 34 + .../inline/powerwindow_PW_Control_PSG_Front.c | 201 + .../inline/powerwindow_PW_Control_PSG_Front.h | 142 + ...powerwindow_PW_Control_PSG_Front_private.h | 31 + .../powerwindow_PW_Control_PSG_Front_types.h | 34 + .../inline/powerwindow_const_params.c | 26 + .../inline/powerwindow_controlexclusion.c | 91 + .../inline/powerwindow_controlexclusion.h | 79 + .../powerwindow_controlexclusion_private.h | 31 + .../powerwindow_controlexclusion_types.h | 31 + .../inline/powerwindow_debounce.c | 231 + .../inline/powerwindow_debounce.h | 106 + .../inline/powerwindow_debounce_private.h | 49 + .../inline/powerwindow_debounce_types.h | 33 + .../inline/powerwindow_inputs.c | 1097 + .../powerwindow_model_reference_types.h | 52 + .../inline/powerwindow_powerwindow_control.c | 597 + .../inline/powerwindow_powerwindow_control.h | 140 + .../powerwindow_powerwindow_control_private.h | 59 + .../powerwindow_powerwindow_control_types.h | 34 + .../inline/powerwindow_rtw_continuous.h | 127 + .../inline/powerwindow_rtw_solver.h | 255 + .../inline/powerwindow_rtwtypes.h | 201 + .../inline/powerwindow_tmwtypes.h | 814 + .../modified_sources/inline/wcclib.c | 16 + .../modified_sources/inline/wcclib.h | 16 + .../wasm-tacle/app/powerwindow/powerwindow.c | 747 + .../powerwindow_HeaderFiles/powerwindow.h | 22 + .../powerwindow_PW_Control_DRV.h | 148 + .../powerwindow_PW_Control_DRV_private.h | 30 + .../powerwindow_PW_Control_DRV_types.h | 33 + .../powerwindow_PW_Control_PSG_BackL.h | 135 + ...powerwindow_PW_Control_PSG_BackL_private.h | 30 + .../powerwindow_PW_Control_PSG_BackL_types.h | 33 + .../powerwindow_PW_Control_PSG_BackR.h | 135 + ...powerwindow_PW_Control_PSG_BackR_private.h | 30 + .../powerwindow_PW_Control_PSG_BackR_types.h | 32 + .../powerwindow_PW_Control_PSG_Front.h | 135 + ...powerwindow_PW_Control_PSG_Front_private.h | 30 + .../powerwindow_PW_Control_PSG_Front_types.h | 34 + .../powerwindow_controlexclusion.h | 74 + .../powerwindow_controlexclusion_private.h | 30 + .../powerwindow_controlexclusion_types.h | 30 + .../powerwindow_debounce.h | 100 + .../powerwindow_debounce_private.h | 46 + .../powerwindow_debounce_types.h | 31 + .../powerwindow_model_reference_types.h | 51 + .../powerwindow_powerwindow_control.h | 137 + .../powerwindow_powerwindow_control_private.h | 52 + .../powerwindow_powerwindow_control_types.h | 34 + .../powerwindow_rtw_continuous.h | 138 + .../powerwindow_rtw_solver.h | 243 + .../powerwindow_rtwtypes.h | 194 + .../powerwindow_tmwtypes.h | 825 + .../powerwindow/powerwindow_PW_Control_DRV.c | 313 + .../powerwindow_PW_Control_PSG_BackL.c | 188 + .../powerwindow_PW_Control_PSG_BackR.c | 188 + .../powerwindow_PW_Control_PSG_Front.c | 189 + .../powerwindow/powerwindow_const_params.c | 25 + .../powerwindow_controlexclusion.c | 89 + .../app/powerwindow/powerwindow_debounce.c | 220 + .../app/powerwindow/powerwindow_inputs.c | 90 + .../powerwindow_powerwindow_control.c | 554 + targets/wasm-tacle/app/powerwindow/wcclib.c | 12 + targets/wasm-tacle/app/powerwindow/wcclib.h | 14 + .../kernel/binarysearch/CMakeLists.txt | 25 + .../kernel/binarysearch/ChangeLog.txt | 42 + .../kernel/binarysearch/binarysearch.c | 156 + .../generated/default/binarysearch.wasm | Bin 0 -> 751 bytes .../generated/default/binarysearch.wat | 132 + .../modified_sources/default/binarysearch.c | 153 + .../modified_sources/inline/binarysearch.c | 163 + .../wasm-tacle/kernel/bitcount/CMakeLists.txt | 29 + .../wasm-tacle/kernel/bitcount/ChangeLog.txt | 81 + targets/wasm-tacle/kernel/bitcount/LICENSE | 3 + targets/wasm-tacle/kernel/bitcount/bitcnt_1.c | 36 + targets/wasm-tacle/kernel/bitcount/bitcnt_2.c | 31 + targets/wasm-tacle/kernel/bitcount/bitcnt_3.c | 106 + targets/wasm-tacle/kernel/bitcount/bitcnt_4.c | 86 + targets/wasm-tacle/kernel/bitcount/bitcount.c | 146 + targets/wasm-tacle/kernel/bitcount/bitops.h | 50 + .../bitcount/generated/default/bitcount.wasm | Bin 0 -> 2519 bytes .../bitcount/generated/default/bitcount.wat | 584 + .../modified_sources/default/bitcnt_1.c | 41 + .../modified_sources/default/bitcnt_2.c | 30 + .../modified_sources/default/bitcnt_3.c | 98 + .../modified_sources/default/bitcnt_4.c | 79 + .../modified_sources/default/bitcount.c | 150 + .../modified_sources/default/bitops.h | 50 + .../modified_sources/inline/bitcnt_1.c | 41 + .../modified_sources/inline/bitcnt_2.c | 30 + .../modified_sources/inline/bitcnt_3.c | 98 + .../modified_sources/inline/bitcnt_4.c | 79 + .../modified_sources/inline/bitcount.c | 164 + .../modified_sources/inline/bitops.h | 55 + .../wasm-tacle/kernel/bitonic/CMakeLists.txt | 25 + .../wasm-tacle/kernel/bitonic/ChangeLog.txt | 53 + targets/wasm-tacle/kernel/bitonic/bitonic.c | 157 + .../bitonic/generated/default/bitonic.wasm | Bin 0 -> 1086 bytes .../bitonic/generated/default/bitonic.wat | 215 + .../modified_sources/default/bitonic.c | 154 + .../modified_sources/inline/bitonic.c | 164 + targets/wasm-tacle/kernel/bitonic/license.txt | 21 + .../wasm-tacle/kernel/bsort/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/bsort/ChangeLog.txt | 42 + targets/wasm-tacle/kernel/bsort/bsort.c | 132 + .../kernel/bsort/generated/default/bsort.wasm | Bin 0 -> 928 bytes .../kernel/bsort/generated/default/bsort.wat | 246 + .../modified_sources/default/bsort.c | 130 + .../generated/modified_sources/inline/bsort.c | 136 + .../kernel/complex_updates/CMakeLists.txt | 25 + .../kernel/complex_updates/ChangeLog.txt | 27 + .../kernel/complex_updates/complex_updates.c | 136 + .../generated/default/complex_updates.wasm | Bin 0 -> 3383 bytes .../generated/default/complex_updates.wat | 889 + .../default/complex_updates.c | 135 + .../modified_sources/inline/complex_updates.c | 144 + targets/wasm-tacle/kernel/cosf/CMakeLists.txt | 26 + targets/wasm-tacle/kernel/cosf/ChangeLog.txt | 79 + targets/wasm-tacle/kernel/cosf/cosf.c | 86 + .../kernel/cosf/generated/default/cosf.wasm | Bin 0 -> 2627 bytes .../kernel/cosf/generated/default/cosf.wat | 918 + .../generated/modified_sources/default/cosf.c | 85 + .../modified_sources/default/math_private.h | 67 + .../modified_sources/default/wcclibm.c | 796 + .../modified_sources/default/wcclibm.h | 58 + .../generated/modified_sources/inline/cosf.c | 94 + .../modified_sources/inline/math_private.h | 67 + .../modified_sources/inline/wcclibm.c | 796 + .../modified_sources/inline/wcclibm.h | 66 + targets/wasm-tacle/kernel/cosf/math_private.h | 68 + targets/wasm-tacle/kernel/cosf/wcclibm.c | 757 + targets/wasm-tacle/kernel/cosf/wcclibm.h | 61 + .../kernel/countnegative/CMakeLists.txt | 25 + .../kernel/countnegative/ChangeLog.txt | 29 + .../kernel/countnegative/countnegative.c | 140 + .../generated/default/countnegative.wasm | Bin 0 -> 2945 bytes .../generated/default/countnegative.wat | 1044 + .../modified_sources/default/countnegative.c | 147 + .../modified_sources/inline/countnegative.c | 157 + .../wasm-tacle/kernel/cubic/CMakeLists.txt | 26 + targets/wasm-tacle/kernel/cubic/ChangeLog.txt | 78 + targets/wasm-tacle/kernel/cubic/cubic.c | 156 + .../kernel/cubic/generated/default/cubic.wasm | Bin 0 -> 7686 bytes .../kernel/cubic/generated/default/cubic.wat | 3116 + .../modified_sources/default/cubic.c | 162 + .../modified_sources/default/math_private.h | 67 + .../generated/modified_sources/default/pi.h | 30 + .../modified_sources/default/snipmath.h | 37 + .../modified_sources/default/wcclibm.c | 796 + .../modified_sources/default/wcclibm.h | 58 + .../generated/modified_sources/inline/cubic.c | 171 + .../modified_sources/inline/math_private.h | 67 + .../generated/modified_sources/inline/pi.h | 30 + .../modified_sources/inline/snipmath.h | 37 + .../modified_sources/inline/wcclibm.c | 796 + .../modified_sources/inline/wcclibm.h | 66 + .../wasm-tacle/kernel/cubic/math_private.h | 68 + targets/wasm-tacle/kernel/cubic/pi.h | 31 + targets/wasm-tacle/kernel/cubic/snipmath.h | 40 + targets/wasm-tacle/kernel/cubic/wcclibm.c | 757 + targets/wasm-tacle/kernel/cubic/wcclibm.h | 61 + .../wasm-tacle/kernel/deg2rad/CMakeLists.txt | 25 + .../wasm-tacle/kernel/deg2rad/ChangeLog.txt | 78 + targets/wasm-tacle/kernel/deg2rad/deg2rad.c | 90 + .../deg2rad/generated/default/deg2rad.wasm | Bin 0 -> 637 bytes .../deg2rad/generated/default/deg2rad.wat | 83 + .../modified_sources/default/deg2rad.c | 89 + .../generated/modified_sources/default/pi.h | 30 + .../modified_sources/inline/deg2rad.c | 97 + .../generated/modified_sources/inline/pi.h | 30 + targets/wasm-tacle/kernel/deg2rad/pi.h | 31 + targets/wasm-tacle/kernel/fac/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/fac/ChangeLog.txt | 23 + targets/wasm-tacle/kernel/fac/fac.c | 97 + .../kernel/fac/generated/default/fac.wasm | Bin 0 -> 756 bytes .../kernel/fac/generated/default/fac.wat | 170 + .../generated/modified_sources/default/fac.c | 94 + .../generated/modified_sources/inline/fac.c | 102 + targets/wasm-tacle/kernel/fft/CMakeLists.txt | 26 + targets/wasm-tacle/kernel/fft/ChangeLog.txt | 35 + targets/wasm-tacle/kernel/fft/fft.c | 333 + targets/wasm-tacle/kernel/fft/fft_input.c | 322 + .../kernel/fft/generated/default/fft.wasm | Bin 0 -> 14084 bytes .../kernel/fft/generated/default/fft.wat | 581 + .../generated/modified_sources/default/fft.c | 330 + .../modified_sources/default/fft_input.c | 320 + .../generated/modified_sources/inline/fft.c | 342 + .../modified_sources/inline/fft_input.c | 320 + .../kernel/filterbank/CMakeLists.txt | 25 + .../kernel/filterbank/ChangeLog.txt | 53 + .../wasm-tacle/kernel/filterbank/filterbank.c | 170 + .../generated/default/filterbank.wasm | Bin 0 -> 2625 bytes .../generated/default/filterbank.wat | 985 + .../modified_sources/default/filterbank.c | 165 + .../modified_sources/inline/filterbank.c | 171 + .../wasm-tacle/kernel/filterbank/license.txt | 21 + .../wasm-tacle/kernel/fir2dim/CMakeLists.txt | 25 + .../wasm-tacle/kernel/fir2dim/changeLog.txt | 45 + targets/wasm-tacle/kernel/fir2dim/fir2dim.c | 199 + .../fir2dim/generated/default/fir2dim.wasm | Bin 0 -> 6514 bytes .../fir2dim/generated/default/fir2dim.wat | 1891 + .../modified_sources/default/fir2dim.c | 193 + .../modified_sources/inline/fir2dim.c | 201 + targets/wasm-tacle/kernel/iir/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/iir/ChangeLog.txt | 39 + .../kernel/iir/generated/default/iir.wasm | Bin 0 -> 2613 bytes .../kernel/iir/generated/default/iir.wat | 663 + .../generated/modified_sources/default/iir.c | 160 + .../generated/modified_sources/inline/iir.c | 168 + targets/wasm-tacle/kernel/iir/iir.c | 163 + .../kernel/insertsort/CMakeLists.txt | 25 + .../kernel/insertsort/ChangeLog.txt | 10 + .../generated/default/insertsort.wasm | Bin 0 -> 1237 bytes .../generated/default/insertsort.wat | 280 + .../modified_sources/default/insertsort.c | 140 + .../modified_sources/inline/insertsort.c | 149 + .../wasm-tacle/kernel/insertsort/insertsort.c | 139 + .../wasm-tacle/kernel/isqrt/CMakeLists.txt | 27 + targets/wasm-tacle/kernel/isqrt/ChangeLog.txt | 78 + .../wasm-tacle/kernel/isqrt/basicmath_libc.c | 35 + .../wasm-tacle/kernel/isqrt/basicmath_libc.h | 28 + .../kernel/isqrt/generated/default/isqrt.wasm | Bin 0 -> 1119 bytes .../kernel/isqrt/generated/default/isqrt.wat | 291 + .../modified_sources/default/basicmath_libc.c | 39 + .../modified_sources/default/basicmath_libc.h | 28 + .../modified_sources/default/isqrt.c | 154 + .../modified_sources/default/math_private.h | 67 + .../generated/modified_sources/default/pi.h | 30 + .../modified_sources/default/snipmath.h | 37 + .../modified_sources/default/wcclibm.c | 796 + .../modified_sources/default/wcclibm.h | 58 + .../modified_sources/inline/basicmath_libc.c | 39 + .../modified_sources/inline/basicmath_libc.h | 29 + .../generated/modified_sources/inline/isqrt.c | 165 + .../modified_sources/inline/math_private.h | 67 + .../generated/modified_sources/inline/pi.h | 30 + .../modified_sources/inline/snipmath.h | 37 + .../modified_sources/inline/wcclibm.c | 796 + .../modified_sources/inline/wcclibm.h | 66 + targets/wasm-tacle/kernel/isqrt/isqrt.c | 156 + .../wasm-tacle/kernel/isqrt/math_private.h | 68 + targets/wasm-tacle/kernel/isqrt/pi.h | 31 + targets/wasm-tacle/kernel/isqrt/snipmath.h | 40 + targets/wasm-tacle/kernel/isqrt/wcclibm.c | 757 + targets/wasm-tacle/kernel/isqrt/wcclibm.h | 61 + .../wasm-tacle/kernel/jfdctint/CMakeLists.txt | 25 + .../wasm-tacle/kernel/jfdctint/ChangeLog.txt | 70 + targets/wasm-tacle/kernel/jfdctint/README | 383 + .../jfdctint/generated/default/jfdctint.wasm | Bin 0 -> 2141 bytes .../jfdctint/generated/default/jfdctint.wat | 679 + .../modified_sources/default/jfdctint.c | 314 + .../modified_sources/inline/jfdctint.c | 322 + targets/wasm-tacle/kernel/jfdctint/jfdctint.c | 319 + targets/wasm-tacle/kernel/lms/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/lms/ChangeLog.txt | 13 + .../kernel/lms/generated/default/lms.wasm | Bin 0 -> 1997 bytes .../kernel/lms/generated/default/lms.wat | 656 + .../generated/modified_sources/default/lms.c | 187 + .../generated/modified_sources/inline/lms.c | 192 + targets/wasm-tacle/kernel/lms/lms.c | 203 + .../wasm-tacle/kernel/ludcmp/CMakeLists.txt | 25 + .../wasm-tacle/kernel/ludcmp/ChangeLog.txt | 26 + .../ludcmp/generated/default/ludcmp.wasm | Bin 0 -> 3452 bytes .../ludcmp/generated/default/ludcmp.wat | 1267 + .../modified_sources/default/ludcmp.c | 182 + .../modified_sources/inline/ludcmp.c | 190 + targets/wasm-tacle/kernel/ludcmp/ludcmp.c | 177 + .../wasm-tacle/kernel/matrix1/CMakeLists.txt | 25 + .../wasm-tacle/kernel/matrix1/ChangeLog.txt | 63 + .../matrix1/generated/default/matrix1.wasm | Bin 0 -> 1300 bytes .../matrix1/generated/default/matrix1.wat | 356 + .../modified_sources/default/matrix1.c | 168 + .../modified_sources/inline/matrix1.c | 177 + targets/wasm-tacle/kernel/matrix1/matrix1.c | 169 + targets/wasm-tacle/kernel/md5/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/md5/ChangeLog.txt | 17 + .../kernel/md5/generated/default/md5.wasm | Bin 0 -> 5301 bytes .../kernel/md5/generated/default/md5.wat | 2343 + .../generated/modified_sources/default/md5.c | 644 + .../generated/modified_sources/inline/md5.c | 658 + targets/wasm-tacle/kernel/md5/md5.c | 632 + .../wasm-tacle/kernel/minver/CMakeLists.txt | 25 + .../wasm-tacle/kernel/minver/ChangeLog.txt | 38 + .../minver/generated/default/minver.wasm | Bin 0 -> 4244 bytes .../minver/generated/default/minver.wat | 1433 + .../modified_sources/default/minver.c | 253 + .../modified_sources/inline/minver.c | 263 + targets/wasm-tacle/kernel/minver/minver.c | 261 + targets/wasm-tacle/kernel/pm/CMakeLists.txt | 28 + targets/wasm-tacle/kernel/pm/ChangeLog.txt | 96 + .../kernel/pm/generated/default/pm.wasm | Bin 0 -> 41781 bytes .../kernel/pm/generated/default/pm.wat | 4396 ++ .../generated/modified_sources/default/pm.c | 741 + .../modified_sources/default/pm_input.c | 799 + .../modified_sources/default/pm_libm.c | 214 + .../modified_sources/default/pm_math.h | 37 + .../modified_sources/default/pm_stdlib.c | 54 + .../modified_sources/default/pm_string.h | 33 + .../pm/generated/modified_sources/inline/pm.c | 753 + .../modified_sources/inline/pm_input.c | 799 + .../modified_sources/inline/pm_libm.c | 214 + .../modified_sources/inline/pm_math.h | 37 + .../modified_sources/inline/pm_stdlib.c | 54 + .../modified_sources/inline/pm_string.h | 34 + targets/wasm-tacle/kernel/pm/license.txt | 27 + targets/wasm-tacle/kernel/pm/pm.c | 743 + targets/wasm-tacle/kernel/pm/pm_input.c | 1215 + targets/wasm-tacle/kernel/pm/pm_libm.c | 219 + targets/wasm-tacle/kernel/pm/pm_math.h | 37 + targets/wasm-tacle/kernel/pm/pm_stdlib.c | 52 + targets/wasm-tacle/kernel/pm/pm_string.h | 34 + .../wasm-tacle/kernel/prime/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/prime/ChangeLog.txt | 38 + .../kernel/prime/generated/default/prime.wasm | Bin 0 -> 848 bytes .../kernel/prime/generated/default/prime.wat | 184 + .../modified_sources/default/prime.c | 130 + .../generated/modified_sources/inline/prime.c | 142 + targets/wasm-tacle/kernel/prime/prime.c | 139 + .../kernel/quicksort/CMakeLists.txt | 28 + .../wasm-tacle/kernel/quicksort/ChangeLog.txt | 42 + .../generated/default/quicksort.wasm | Bin 0 -> 23176 bytes .../quicksort/generated/default/quicksort.wat | 2788 + .../modified_sources/default/input.c | 1206 + .../modified_sources/default/math_private.h | 66 + .../modified_sources/default/quicksort.c | 236 + .../modified_sources/default/quicksort.h | 10 + .../modified_sources/default/quicksortlibm.c | 1128 + .../modified_sources/default/quicksortlibm.h | 56 + .../default/quicksortstdlib.c | 134 + .../default/quicksortstdlib.h | 33 + .../generated/modified_sources/inline/input.c | 1206 + .../modified_sources/inline/math_private.h | 66 + .../modified_sources/inline/quicksort.c | 249 + .../modified_sources/inline/quicksort.h | 10 + .../modified_sources/inline/quicksortlibm.c | 1128 + .../modified_sources/inline/quicksortlibm.h | 67 + .../modified_sources/inline/quicksortstdlib.c | 134 + .../modified_sources/inline/quicksortstdlib.h | 38 + targets/wasm-tacle/kernel/quicksort/input.c | 605 + .../kernel/quicksort/math_private.h | 67 + .../wasm-tacle/kernel/quicksort/quicksort.c | 245 + .../wasm-tacle/kernel/quicksort/quicksort.h | 9 + .../kernel/quicksort/quicksortlibm.c | 1129 + .../kernel/quicksort/quicksortlibm.h | 58 + .../kernel/quicksort/quicksortstdlib.c | 142 + .../kernel/quicksort/quicksortstdlib.h | 34 + .../wasm-tacle/kernel/rad2deg/CMakeLists.txt | 25 + .../wasm-tacle/kernel/rad2deg/ChangeLog.txt | 78 + .../rad2deg/generated/default/rad2deg.wasm | Bin 0 -> 638 bytes .../rad2deg/generated/default/rad2deg.wat | 83 + .../generated/modified_sources/default/pi.h | 30 + .../modified_sources/default/rad2deg.c | 89 + .../generated/modified_sources/inline/pi.h | 30 + .../modified_sources/inline/rad2deg.c | 97 + targets/wasm-tacle/kernel/rad2deg/pi.h | 31 + targets/wasm-tacle/kernel/rad2deg/rad2deg.c | 89 + .../kernel/recursion/CMakeLists.txt | 25 + .../wasm-tacle/kernel/recursion/ChangeLog.txt | 17 + .../generated/default/recursion.wasm | Bin 0 -> 595 bytes .../recursion/generated/default/recursion.wat | 80 + .../modified_sources/default/recursion.c | 71 + .../modified_sources/inline/recursion.c | 79 + .../wasm-tacle/kernel/recursion/recursion.c | 72 + targets/wasm-tacle/kernel/sha/CMakeLists.txt | 29 + targets/wasm-tacle/kernel/sha/Changelog.txt | 108 + .../kernel/sha/generated/default/sha.wasm | Bin 0 -> 39146 bytes .../kernel/sha/generated/default/sha.wat | 2591 + .../modified_sources/default/input_small.c | 2203 + .../modified_sources/default/memcpy.c | 78 + .../modified_sources/default/memcpy.h | 25 + .../modified_sources/default/memhelper.c | 151 + .../modified_sources/default/memhelper.h | 54 + .../modified_sources/default/memset.c | 92 + .../modified_sources/default/memset.h | 23 + .../generated/modified_sources/default/sha.c | 232 + .../generated/modified_sources/default/sha.h | 64 + .../modified_sources/inline/input_small.c | 2203 + .../modified_sources/inline/memcpy.c | 78 + .../modified_sources/inline/memcpy.h | 26 + .../modified_sources/inline/memhelper.c | 151 + .../modified_sources/inline/memhelper.h | 55 + .../modified_sources/inline/memset.c | 92 + .../modified_sources/inline/memset.h | 24 + .../generated/modified_sources/inline/sha.c | 241 + .../generated/modified_sources/inline/sha.h | 72 + targets/wasm-tacle/kernel/sha/input_small.c | 1657 + targets/wasm-tacle/kernel/sha/memcpy.c | 74 + targets/wasm-tacle/kernel/sha/memcpy.h | 26 + targets/wasm-tacle/kernel/sha/memhelper.c | 146 + targets/wasm-tacle/kernel/sha/memhelper.h | 55 + targets/wasm-tacle/kernel/sha/memset.c | 86 + targets/wasm-tacle/kernel/sha/memset.h | 24 + targets/wasm-tacle/kernel/sha/sha.c | 223 + targets/wasm-tacle/kernel/sha/sha.h | 63 + targets/wasm-tacle/kernel/st/CMakeLists.txt | 25 + targets/wasm-tacle/kernel/st/ChangeLog.txt | 96 + .../kernel/st/generated/default/st.wasm | Bin 0 -> 2229 bytes .../kernel/st/generated/default/st.wat | 754 + .../generated/modified_sources/default/st.c | 217 + .../st/generated/modified_sources/inline/st.c | 228 + targets/wasm-tacle/kernel/st/st.c | 226 + targets/wasm-tacle/parallel/DEBIE/README.txt | Bin 0 -> 7646 bytes .../wasm-tacle/parallel/DEBIE/code/ad_conv.h | 46 + .../code/arch/arm7-lpc2138-mam/build.bat | 56 + .../DEBIE/code/arch/arm7-lpc2138-mam/cpulib.c | 77 + .../DEBIE/code/arch/arm7-lpc2138-mam/cpulib.h | 51 + .../DEBIE/code/arch/arm7-lpc2138-mam/crt0.s | 53 + .../code/arch/arm7-lpc2138-mam/crt_asyst.c | 99 + .../DEBIE/code/arch/arm7-lpc2138-mam/intvec.s | 19 + .../code/arch/arm7-lpc2138-mam/keyword.h | 173 + .../DEBIE/code/arch/arm7-lpc2138-mam/link.map | 816 + .../DEBIE/code/arch/arm7-lpc2138-mam/link.txt | 98 + .../code/arch/arm7-lpc2138-mam/problems.h | 23 + .../code/arch/arm7-lpc2138-mam/setup.bat | 46 + .../DEBIE/code/arch/arm7-lpc2138-mam/target.c | 67 + .../arch/arm7-lpc2138-mam/target_tm_data.h | 29 + .../DEBIE/code/arch/arm7-x1/keyword.h | 165 + .../DEBIE/code/arch/arm7-x1/problems.h | 23 + .../parallel/DEBIE/code/arch/arm7-x1/target.c | 67 + .../DEBIE/code/arch/arm7-x1/target_tm_data.h | 30 + .../DEBIE/code/arch/arm7-x1/wcc_memcpy.c | 10 + .../DEBIE/code/arch/arm7-x2/keyword.h | 165 + .../DEBIE/code/arch/arm7-x2/problems.h | 23 + .../parallel/DEBIE/code/arch/arm7-x2/target.c | 67 + .../DEBIE/code/arch/arm7-x2/target_tm_data.h | 30 + .../DEBIE/code/arch/arm7-x2/wcc_memcpy.c | 10 + .../DEBIE/code/arch/arm7-x4/keyword.h | 165 + .../DEBIE/code/arch/arm7-x4/problems.h | 23 + .../parallel/DEBIE/code/arch/arm7-x4/target.c | 67 + .../DEBIE/code/arch/arm7-x4/target_tm_data.h | 30 + .../DEBIE/code/arch/arm7-x4/wcc_memcpy.c | 10 + .../DEBIE/code/arch/arm7-x8/keyword.h | 165 + .../DEBIE/code/arch/arm7-x8/problems.h | 23 + .../parallel/DEBIE/code/arch/arm7-x8/target.c | 67 + .../DEBIE/code/arch/arm7-x8/target_tm_data.h | 30 + .../DEBIE/code/arch/arm7-x8/wcc_memcpy.c | 10 + .../parallel/DEBIE/code/arch/arm7/keyword.h | 165 + .../parallel/DEBIE/code/arch/arm7/problems.h | 23 + .../parallel/DEBIE/code/arch/arm7/target.c | 67 + .../DEBIE/code/arch/arm7/target_tm_data.h | 30 + .../DEBIE/code/arch/arm7/wcc_memcpy.c | 10 + .../DEBIE/code/arch/mpc5554/host-build.sh | 52 + .../DEBIE/code/arch/mpc5554/keyword.h | 166 + .../code/arch/mpc5554/linker-mpc55xx-gcc.ld | 254 + .../DEBIE/code/arch/mpc5554/problems.h | 20 + .../DEBIE/code/arch/mpc5554/readme.txt | 12 + .../DEBIE/code/arch/mpc5554/target-build.sh | 49 + .../parallel/DEBIE/code/arch/mpc5554/target.c | 84 + .../DEBIE/code/arch/mpc5554/target_tm_data.h | 31 + .../parallel/DEBIE/code/arch/tc1796/keyword.h | 165 + .../DEBIE/code/arch/tc1796/problems.h | 23 + .../parallel/DEBIE/code/arch/tc1796/target.c | 67 + .../DEBIE/code/arch/tc1796/target_tm_data.h | 30 + .../DEBIE/code/arch/tc1796/wcc_memcpy.c | 10 + .../parallel/DEBIE/code/arch/tc1797/keyword.h | 165 + .../DEBIE/code/arch/tc1797/problems.h | 23 + .../parallel/DEBIE/code/arch/tc1797/target.c | 67 + .../DEBIE/code/arch/tc1797/target_tm_data.h | 30 + .../DEBIE/code/arch/tc1797/wcc_memcpy.c | 10 + .../parallel/DEBIE/code/arch/x86/build.sh | 48 + .../parallel/DEBIE/code/arch/x86/keyword.h | 166 + .../parallel/DEBIE/code/arch/x86/problems.h | 27 + .../parallel/DEBIE/code/arch/x86/probs.txt | 60396 ++++++++++++++++ .../parallel/DEBIE/code/arch/x86/rpt_ipoint.h | 18 + .../parallel/DEBIE/code/arch/x86/target.c | 84 + .../DEBIE/code/arch/x86/target_tm_data.h | 30 + .../parallel/DEBIE/code/arch/x86/wcc_memcpy.c | 10 + .../wasm-tacle/parallel/DEBIE/code/class.c | 308 + .../wasm-tacle/parallel/DEBIE/code/class.h | 72 + .../wasm-tacle/parallel/DEBIE/code/classtab.c | 283 + .../wasm-tacle/parallel/DEBIE/code/classtab.h | 32 + .../wasm-tacle/parallel/DEBIE/code/debie.c | 57 + .../wasm-tacle/parallel/DEBIE/code/dpu_ctrl.h | 200 + .../parallel/DEBIE/code/harness/harness.c | 3714 + .../DEBIE/code/harness/target_ad_conv.h | 47 + .../DEBIE/code/harness/target_dpu_ctrl.h | 68 + .../DEBIE/code/harness/target_isr_ctrl.h | 71 + .../DEBIE/code/harness/target_reg52.h | 36 + .../DEBIE/code/harness/target_su_ctrl.h | 66 + .../DEBIE/code/harness/target_ttc_ctrl.h | 70 + .../wasm-tacle/parallel/DEBIE/code/health.c | 2637 + .../wasm-tacle/parallel/DEBIE/code/health.h | 120 + .../wasm-tacle/parallel/DEBIE/code/hw_if.c | 1048 + .../wasm-tacle/parallel/DEBIE/code/isr_ctrl.h | 44 + .../wasm-tacle/parallel/DEBIE/code/kernobj.h | 56 + .../wasm-tacle/parallel/DEBIE/code/measure.c | 755 + .../wasm-tacle/parallel/DEBIE/code/measure.h | 132 + .../wasm-tacle/parallel/DEBIE/code/msg_ctrl.h | 61 + .../wasm-tacle/parallel/DEBIE/code/reg52.h | 30 + .../wasm-tacle/parallel/DEBIE/code/su_ctrl.h | 222 + .../wasm-tacle/parallel/DEBIE/code/taskctrl.h | 91 + .../wasm-tacle/parallel/DEBIE/code/tc_hand.c | 1517 + .../wasm-tacle/parallel/DEBIE/code/tc_hand.h | 176 + .../wasm-tacle/parallel/DEBIE/code/telem.c | 504 + .../wasm-tacle/parallel/DEBIE/code/telem.h | 62 + .../wasm-tacle/parallel/DEBIE/code/tm_data.h | 199 + .../wasm-tacle/parallel/DEBIE/code/ttc_ctrl.h | 39 + .../wasm-tacle/parallel/DEBIE/code/version.h | 45 + .../parallel/DEBIE/orig-docs/design_1_4.pdf | Bin 0 -> 1017588 bytes .../parallel/DEBIE/orig-docs/srd_1_3.pdf | Bin 0 -> 744453 bytes .../parallel/DEBIE/orig-docs/sum_1_3.pdf | Bin 0 -> 300485 bytes .../parallel/DEBIE/terms_of_use-2014-05.pdf | Bin 0 -> 1402098 bytes targets/wasm-tacle/parallel/PapaBench/AUTHORS | 8 + targets/wasm-tacle/parallel/PapaBench/COPYING | 339 + .../parallel/PapaBench/Loops_Bounds.txt | 78 + .../parallel/PapaBench/PapaBench_for_wcet.txt | 68 + targets/wasm-tacle/parallel/PapaBench/README | 134 + ...aparazzi_Bench_V1_Tache_PnP_Inter_PnP.aadl | 1047 + ...aparazzi_Bench_V2_Tache_PnP_Inter_AnP.aadl | 1037 + .../paparazzi_Bench_V3_Tache_PP_Inter_PP.aadl | 1048 + .../paparazzi_Bench_V4_Tache_PP_Inter_AP.aadl | 1038 + .../aadl/paparazzi_Old_Version.aadl | 677 + .../aadl/propertysets/Thread_Properties.aadl | 10 + .../aaxl/packages/Data_Types.aaxl | 185 + ...aparazzi_Bench_V1_Tache_PnP_Inter_PnP.aaxl | 1365 + ...aparazzi_Bench_V2_Tache_PnP_Inter_AnP.aaxl | 1325 + .../paparazzi_Bench_V3_Tache_PP_Inter_PP.aaxl | 1365 + .../paparazzi_Bench_V4_Tache_PP_Inter_AP.aaxl | 1329 + .../aaxl/paparazzi_Old_Version.aaxl | 722 + .../aaxl/propertysets/Thread_Properties.aaxl | 28 + .../arch/include/avr/arch/interrupt.h | 149 + .../PapaBench/arch/include/avr/arch/io.h | 285 + .../PapaBench/arch/include/avr/arch/iom128.h | 1035 + .../PapaBench/arch/include/avr/arch/iom8.h | 498 + .../arch/include/avr/arch/portpins.h | 265 + .../arch/include/avr/arch/sfr_defs.h | 250 + .../PapaBench/arch/include/avr/arch/signal.h | 103 + .../parallel/PapaBench/conf/Makefile.local.in | 24 + .../parallel/PapaBench/conf/Makefile.std | 185 + .../PapaBench/conf/arm-elf-alone.conf | 14 + .../parallel/PapaBench/conf/arm-elf.conf | 2 + .../PapaBench/conf/powerpc-elf-alone.conf | 15 + .../PapaBench/conf/powerpc-linux-gnu.conf | 2 + .../PapaBench/conf/tricore-alone.conf | 14 + .../PapaBench/sw/airborne/autopilot/ad7714.c | 120 + .../PapaBench/sw/airborne/autopilot/ad7714.h | 56 + .../PapaBench/sw/airborne/autopilot/adc.c | 130 + .../PapaBench/sw/airborne/autopilot/adc.h | 53 + .../sw/airborne/autopilot/autopilot.h | 123 + .../sw/airborne/autopilot/downlink.h | 35 + .../sw/airborne/autopilot/estimator.c | 202 + .../sw/airborne/autopilot/estimator.h | 67 + .../PapaBench/sw/airborne/autopilot/gps.h | 58 + .../sw/airborne/autopilot/gps_sirf.c | 318 + .../PapaBench/sw/airborne/autopilot/gps_ubx.c | 265 + .../sw/airborne/autopilot/if_calib.c | 94 + .../sw/airborne/autopilot/if_calib.h | 22 + .../sw/airborne/autopilot/infrared.c | 76 + .../sw/airborne/autopilot/infrared.h | 42 + .../sw/airborne/autopilot/link_fbw.c | 125 + .../sw/airborne/autopilot/link_fbw.h | 44 + .../PapaBench/sw/airborne/autopilot/main.c | 677 + .../sw/airborne/autopilot/mainloop.c | 101 + .../PapaBench/sw/airborne/autopilot/modem.c | 95 + .../PapaBench/sw/airborne/autopilot/modem.h | 140 + .../PapaBench/sw/airborne/autopilot/nav.c | 216 + .../PapaBench/sw/airborne/autopilot/nav.h | 58 + .../PapaBench/sw/airborne/autopilot/pid.c | 139 + .../PapaBench/sw/airborne/autopilot/pid.h | 61 + .../PapaBench/sw/airborne/autopilot/sirf.h | 36 + .../PapaBench/sw/airborne/autopilot/spi.c | 43 + .../PapaBench/sw/airborne/autopilot/spi.h | 74 + .../PapaBench/sw/airborne/autopilot/timer.h | 92 + .../PapaBench/sw/airborne/autopilot/uart.c | 149 + .../PapaBench/sw/airborne/autopilot/uart.h | 48 + .../PapaBench/sw/airborne/autopilot/ubx.h | 38 + .../sw/airborne/fly_by_wire/adc_fbw.c | 121 + .../sw/airborne/fly_by_wire/adc_fbw.h | 62 + .../sw/airborne/fly_by_wire/link_autopilot.h | 69 + .../PapaBench/sw/airborne/fly_by_wire/main.c | 219 + .../PapaBench/sw/airborne/fly_by_wire/ppm.c | 107 + .../PapaBench/sw/airborne/fly_by_wire/ppm.h | 102 + .../PapaBench/sw/airborne/fly_by_wire/servo.c | 200 + .../PapaBench/sw/airborne/fly_by_wire/servo.h | 61 + .../PapaBench/sw/airborne/fly_by_wire/spi.c | 115 + .../PapaBench/sw/airborne/fly_by_wire/spi.h | 48 + .../PapaBench/sw/airborne/fly_by_wire/timer.h | 92 + .../PapaBench/sw/airborne/fly_by_wire/uart.c | 133 + .../PapaBench/sw/airborne/fly_by_wire/uart.h | 39 + .../PapaBench/sw/include/c/downlink.h | 49 + .../PapaBench/sw/include/c/geometry.h | 185 + .../PapaBench/sw/include/c/glade_support.h | 66 + .../parallel/PapaBench/sw/include/c/logger.h | 51 + .../parallel/PapaBench/sw/include/c/network.h | 70 + .../PapaBench/sw/include/c/protocol.h | 120 + .../parallel/PapaBench/sw/include/c/traces.h | 60 + .../PapaBench/sw/include/c/transport.h | 75 + .../parallel/PapaBench/sw/include/inttypes.h | 12 + .../parallel/PapaBench/sw/include/math.h | 21 + .../parallel/PapaBench/sw/include/std.h | 22 + .../parallel/PapaBench/sw/lib/c/downlink.c | 65 + .../parallel/PapaBench/sw/lib/c/geometry.c | 451 + .../parallel/PapaBench/sw/lib/c/logger.c | 193 + .../parallel/PapaBench/sw/lib/c/math.c | 93 + .../parallel/PapaBench/sw/lib/c/network.c | 192 + .../parallel/PapaBench/sw/lib/c/protocol.c | 551 + .../parallel/PapaBench/sw/lib/c/traces.c | 52 + .../parallel/PapaBench/sw/lib/c/transport.c | 244 + .../PapaBench/sw/lib/crt0/powerpc-elf-crt0.c | 12 + .../PapaBench/sw/var/include/airframe.h | 116 + .../PapaBench/sw/var/include/flight_plan.h | 546 + .../PapaBench/sw/var/include/inflight_calib.h | 55 + .../PapaBench/sw/var/include/messages.h | 348 + .../parallel/PapaBench/sw/var/include/radio.h | 99 + .../PapaBench/sw/var/include/ubx_protocol.h | 72 + targets/wasm-tacle/parallel/rosace/README.txt | 6 + .../parallel/rosace/thread1/assemblage.c | 547 + .../parallel/rosace/thread1/assemblage.h | 77 + .../rosace/thread1/assemblage_includes.c | 1212 + .../rosace/thread1/assemblage_includes.h | 293 + .../parallel/rosace/thread1/com_patterns.h | 93 + .../parallel/rosace/thread1/common.c | 77 + .../parallel/rosace/thread1/common.h | 82 + .../wasm-tacle/parallel/rosace/thread1/io.c | 62 + .../wasm-tacle/parallel/rosace/thread1/io.h | 59 + .../parallel/rosace/thread1/math_all.c | 2278 + .../parallel/rosace/thread1/math_private.h | 68 + .../rosace/thread1/multirate_precedence.h | 64 + .../rosace/thread1/nonencoded_task_params.h | 59 + .../parallel/rosace/thread1/ros_th1.c | 159 + .../parallel/rosace/thread1/types.h | 78 + .../parallel/rosace/thread1/wcclibm.h | 85 + .../parallel/rosace/thread2/assemblage.c | 547 + .../parallel/rosace/thread2/assemblage.h | 77 + .../rosace/thread2/assemblage_includes.c | 1212 + .../rosace/thread2/assemblage_includes.h | 293 + .../parallel/rosace/thread2/com_patterns.h | 93 + .../parallel/rosace/thread2/common.c | 77 + .../parallel/rosace/thread2/common.h | 82 + .../wasm-tacle/parallel/rosace/thread2/io.c | 61 + .../wasm-tacle/parallel/rosace/thread2/io.h | 59 + .../parallel/rosace/thread2/math_all.c | 2278 + .../parallel/rosace/thread2/math_private.h | 68 + .../rosace/thread2/multirate_precedence.h | 65 + .../rosace/thread2/nonencoded_task_params.h | 59 + .../parallel/rosace/thread2/ros_th2.c | 155 + .../parallel/rosace/thread2/types.h | 73 + .../parallel/rosace/thread2/wcclibm.h | 85 + .../parallel/rosace/thread3/assemblage.c | 547 + .../parallel/rosace/thread3/assemblage.h | 77 + .../rosace/thread3/assemblage_includes.c | 1212 + .../rosace/thread3/assemblage_includes.h | 293 + .../parallel/rosace/thread3/com_patterns.h | 93 + .../parallel/rosace/thread3/common.c | 77 + .../parallel/rosace/thread3/common.h | 82 + .../wasm-tacle/parallel/rosace/thread3/io.c | 61 + .../wasm-tacle/parallel/rosace/thread3/io.h | 59 + .../parallel/rosace/thread3/math_all.c | 2278 + .../parallel/rosace/thread3/math_private.h | 68 + .../rosace/thread3/multirate_precedence.h | 65 + .../rosace/thread3/nonencoded_task_params.h | 59 + .../parallel/rosace/thread3/ros_th3.c | 132 + .../parallel/rosace/thread3/types.h | 73 + .../parallel/rosace/thread3/wcclibm.h | 86 + .../parallel/rosace/thread4/assemblage.c | 547 + .../parallel/rosace/thread4/assemblage.h | 77 + .../rosace/thread4/assemblage_includes.c | 1212 + .../rosace/thread4/assemblage_includes.h | 293 + .../parallel/rosace/thread4/com_patterns.h | 93 + .../parallel/rosace/thread4/common.c | 77 + .../parallel/rosace/thread4/common.h | 82 + .../wasm-tacle/parallel/rosace/thread4/io.c | 61 + .../wasm-tacle/parallel/rosace/thread4/io.h | 59 + .../parallel/rosace/thread4/math_all.c | 2278 + .../parallel/rosace/thread4/math_private.h | 68 + .../rosace/thread4/multirate_precedence.h | 65 + .../rosace/thread4/nonencoded_task_params.h | 59 + .../parallel/rosace/thread4/ros_th4.c | 133 + .../parallel/rosace/thread4/types.h | 73 + .../parallel/rosace/thread4/wcclibm.h | 85 + .../parallel/rosace/thread5/assemblage.c | 547 + .../parallel/rosace/thread5/assemblage.h | 77 + .../rosace/thread5/assemblage_includes.c | 1211 + .../rosace/thread5/assemblage_includes.h | 293 + .../parallel/rosace/thread5/com_patterns.h | 93 + .../parallel/rosace/thread5/common.c | 77 + .../parallel/rosace/thread5/common.h | 82 + .../wasm-tacle/parallel/rosace/thread5/io.c | 61 + .../wasm-tacle/parallel/rosace/thread5/io.h | 59 + .../parallel/rosace/thread5/math_all.c | 2278 + .../parallel/rosace/thread5/math_private.h | 68 + .../rosace/thread5/multirate_precedence.h | 65 + .../rosace/thread5/nonencoded_task_params.h | 59 + .../parallel/rosace/thread5/ros_th5.c | 132 + .../parallel/rosace/thread5/types.h | 73 + .../parallel/rosace/thread5/wcclibm.h | 85 + .../sequential/adpcm_dec/CMakeLists.txt | 25 + .../sequential/adpcm_dec/ChangeLog.txt | 32 + .../sequential/adpcm_dec/adpcm_dec.c | 710 + .../generated/default/adpcm_dec.wasm | Bin 0 -> 5311 bytes .../adpcm_dec/generated/default/adpcm_dec.wat | 1414 + .../modified_sources/default/adpcm_dec.c | 674 + .../modified_sources/inline/adpcm_dec.c | 690 + .../sequential/adpcm_enc/CMakeLists.txt | 25 + .../sequential/adpcm_enc/ChangeLog.txt | 34 + .../sequential/adpcm_enc/adpcm_enc.c | 756 + .../generated/default/adpcm_enc.wasm | Bin 0 -> 6248 bytes .../adpcm_enc/generated/default/adpcm_enc.wat | 1874 + .../modified_sources/default/adpcm_enc.c | 706 + .../modified_sources/inline/adpcm_enc.c | 723 + .../sequential/ammunition/CMakeLists.txt | 28 + .../sequential/ammunition/ChangeLog.txt | 66 + .../wasm-tacle/sequential/ammunition/README | 86 + .../sequential/ammunition/ammunition.c | 1179 + .../sequential/ammunition/ammunition_libc.c | 166 + .../sequential/ammunition/ammunition_limits.h | 35 + .../sequential/ammunition/ammunition_stdio.h | 8 + .../sequential/ammunition/ammunition_stdlib.h | 6 + .../sequential/ammunition/ammunition_string.h | 18 + .../wasm-tacle/sequential/ammunition/arithm.c | 1383 + .../wasm-tacle/sequential/ammunition/arithm.h | 123 + .../wasm-tacle/sequential/ammunition/bits.c | 313 + .../wasm-tacle/sequential/ammunition/bits.h | 60 + .../generated/default/ammunition.wasm | Bin 0 -> 38439 bytes .../generated/default/ammunition.wat | 16570 +++++ .../modified_sources/default/ammunition.c | 1172 + .../default/ammunition_libc.c | 164 + .../default/ammunition_limits.h | 36 + .../default/ammunition_stdio.h | 9 + .../default/ammunition_stdlib.h | 7 + .../default/ammunition_string.h | 17 + .../modified_sources/default/arithm.c | 1310 + .../modified_sources/default/arithm.h | 105 + .../generated/modified_sources/default/bits.c | 305 + .../generated/modified_sources/default/bits.h | 58 + .../modified_sources/inline/ammunition.c | 1185 + .../modified_sources/inline/ammunition_libc.c | 164 + .../inline/ammunition_limits.h | 36 + .../inline/ammunition_stdio.h | 11 + .../inline/ammunition_stdlib.h | 8 + .../inline/ammunition_string.h | 22 + .../modified_sources/inline/arithm.c | 1310 + .../modified_sources/inline/arithm.h | 139 + .../generated/modified_sources/inline/bits.c | 305 + .../generated/modified_sources/inline/bits.h | 61 + .../sequential/anagram/CMakeLists.txt | 27 + .../sequential/anagram/ChangeLog.txt | 125 + .../wasm-tacle/sequential/anagram/anagram.c | 661 + .../sequential/anagram/anagram_compare.h | 27 + .../sequential/anagram/anagram_ctype.h | 45 + .../sequential/anagram/anagram_input.c | 2317 + .../sequential/anagram/anagram_stdlib.c | 149 + .../sequential/anagram/anagram_stdlib.h | 29 + .../sequential/anagram/anagram_strings.h | 27 + .../anagram/generated/default/anagram.wasm | Bin 0 -> 27169 bytes .../anagram/generated/default/anagram.wat | 2403 + .../modified_sources/default/anagram.c | 649 + .../default/anagram_compare.h | 27 + .../modified_sources/default/anagram_ctype.h | 45 + .../modified_sources/default/anagram_input.c | 320 + .../modified_sources/default/anagram_stdlib.c | 157 + .../modified_sources/default/anagram_stdlib.h | 30 + .../default/anagram_strings.h | 28 + .../modified_sources/inline/anagram.c | 661 + .../modified_sources/inline/anagram_compare.h | 28 + .../modified_sources/inline/anagram_ctype.h | 45 + .../modified_sources/inline/anagram_input.c | 320 + .../modified_sources/inline/anagram_stdlib.c | 157 + .../modified_sources/inline/anagram_stdlib.h | 32 + .../modified_sources/inline/anagram_strings.h | 29 + .../sequential/audiobeam/CMakeLists.txt | 28 + .../wasm-tacle/sequential/audiobeam/README | 86 + .../sequential/audiobeam/audiobeam.c | 585 + .../sequential/audiobeam/audiobeam.h | 50 + .../sequential/audiobeam/audiobeaminput.c | 5784 ++ .../sequential/audiobeam/audiobeamlibm.c | 425 + .../sequential/audiobeam/audiobeamlibm.h | 59 + .../sequential/audiobeam/audiobeamlibmalloc.c | 14 + .../sequential/audiobeam/audiobeamlibmalloc.h | 27 + .../sequential/audiobeam/audiobeamlibmath.h | 69 + .../sequential/audiobeam/changeLog.txt | 36 + .../generated/default/audiobeam.wasm | Bin 0 -> 35182 bytes .../audiobeam/generated/default/audiobeam.wat | 4921 ++ .../modified_sources/default/audiobeam.c | 542 + .../modified_sources/default/audiobeam.h | 50 + .../modified_sources/default/audiobeaminput.c | 1452 + .../modified_sources/default/audiobeamlibm.c | 425 + .../modified_sources/default/audiobeamlibm.h | 56 + .../default/audiobeamlibmalloc.c | 15 + .../default/audiobeamlibmalloc.h | 27 + .../default/audiobeamlibmath.h | 68 + .../modified_sources/inline/audiobeam.c | 569 + .../modified_sources/inline/audiobeam.h | 50 + .../modified_sources/inline/audiobeaminput.c | 1452 + .../modified_sources/inline/audiobeamlibm.c | 425 + .../modified_sources/inline/audiobeamlibm.h | 63 + .../inline/audiobeamlibmalloc.c | 15 + .../inline/audiobeamlibmalloc.h | 28 + .../inline/audiobeamlibmath.h | 68 + .../sequential/audiobeam/license.txt | 21 + .../sequential/cjpeg_transupp/CMakeLists.txt | 25 + .../sequential/cjpeg_transupp/ChangeLog.txt | 36 + .../sequential/cjpeg_transupp/README | 417 + .../cjpeg_transupp/cjpeg_transupp.c | 713 + .../generated/default/cjpeg_transupp.wasm | Bin 0 -> 17572 bytes .../generated/default/cjpeg_transupp.wat | 4946 ++ .../modified_sources/default/cjpeg_transupp.c | 743 + .../modified_sources/default/jpeglib.h | 743 + .../modified_sources/inline/cjpeg_transupp.c | 757 + .../modified_sources/inline/jpeglib.h | 743 + .../sequential/cjpeg_transupp/jpeglib.h | 757 + .../sequential/cjpeg_wrbmp/CMakeLists.txt | 26 + .../sequential/cjpeg_wrbmp/ChangeLog.txt | 104 + .../wasm-tacle/sequential/cjpeg_wrbmp/README | 383 + .../sequential/cjpeg_wrbmp/cderror.h | 140 + .../sequential/cjpeg_wrbmp/cdjpeg.h | 105 + .../sequential/cjpeg_wrbmp/cjpeg_wrbmp.c | 219 + .../generated/default/cjpeg_wrbmp.wasm | Bin 0 -> 3931 bytes .../generated/default/cjpeg_wrbmp.wat | 972 + .../modified_sources/default/cderror.h | 377 + .../modified_sources/default/cdjpeg.h | 99 + .../modified_sources/default/cjpeg_wrbmp.c | 216 + .../modified_sources/default/input.c | 95 + .../modified_sources/default/jconfig.h | 65 + .../modified_sources/default/jerror.h | 333 + .../modified_sources/default/jmorecfg.h | 91 + .../modified_sources/default/jpeglib.h | 844 + .../modified_sources/inline/cderror.h | 377 + .../modified_sources/inline/cdjpeg.h | 99 + .../modified_sources/inline/cjpeg_wrbmp.c | 228 + .../generated/modified_sources/inline/input.c | 95 + .../modified_sources/inline/jconfig.h | 65 + .../modified_sources/inline/jerror.h | 333 + .../modified_sources/inline/jmorecfg.h | 91 + .../modified_sources/inline/jpeglib.h | 844 + .../wasm-tacle/sequential/cjpeg_wrbmp/input.c | 86 + .../sequential/cjpeg_wrbmp/jconfig.h | 65 + .../sequential/cjpeg_wrbmp/jerror.h | 203 + .../sequential/cjpeg_wrbmp/jmorecfg.h | 95 + .../sequential/cjpeg_wrbmp/jpeglib.h | 869 + .../sequential/dijkstra/CMakeLists.txt | 26 + .../sequential/dijkstra/ChangeLog.txt | 44 + .../wasm-tacle/sequential/dijkstra/dijkstra.c | 195 + .../dijkstra/generated/default/dijkstra.wasm | Bin 0 -> 11656 bytes .../dijkstra/generated/default/dijkstra.wat | 467 + .../modified_sources/default/dijkstra.c | 203 + .../modified_sources/default/input.c | 603 + .../modified_sources/default/input.h | 9 + .../modified_sources/inline/dijkstra.c | 215 + .../generated/modified_sources/inline/input.c | 603 + .../generated/modified_sources/inline/input.h | 9 + .../wasm-tacle/sequential/dijkstra/input.c | 105 + .../wasm-tacle/sequential/dijkstra/input.h | 8 + .../wasm-tacle/sequential/epic/CMakeLists.txt | 25 + .../wasm-tacle/sequential/epic/ChangeLog.txt | 56 + targets/wasm-tacle/sequential/epic/epic.c | 1136 + targets/wasm-tacle/sequential/epic/epic.h | 72 + .../epic/generated/default/epic.wasm | Bin 0 -> 24913 bytes .../epic/generated/default/epic.wat | 4079 ++ .../generated/modified_sources/default/epic.c | 940 + .../generated/modified_sources/default/epic.h | 71 + .../generated/modified_sources/inline/epic.c | 953 + .../generated/modified_sources/inline/epic.h | 77 + .../sequential/fmref/CMakeLists.txt | 26 + .../wasm-tacle/sequential/fmref/Changelog.txt | 5 + targets/wasm-tacle/sequential/fmref/fmref.c | 274 + .../fmref/generated/default/fmref.wasm | Bin 0 -> 9209 bytes .../fmref/generated/default/fmref.wat | 3650 + .../modified_sources/default/fmref.c | 275 + .../modified_sources/default/math_private.h | 173 + .../modified_sources/default/wcclibm.c | 575 + .../modified_sources/default/wcclibm.h | 55 + .../generated/modified_sources/inline/fmref.c | 289 + .../modified_sources/inline/math_private.h | 173 + .../modified_sources/inline/wcclibm.c | 575 + .../modified_sources/inline/wcclibm.h | 66 + .../wasm-tacle/sequential/fmref/license.txt | 21 + .../sequential/fmref/math_private.h | 174 + targets/wasm-tacle/sequential/fmref/wcclibm.c | 551 + targets/wasm-tacle/sequential/fmref/wcclibm.h | 55 + .../sequential/g723_enc/CMakeLists.txt | 25 + .../sequential/g723_enc/ChangeLog.txt | 34 + .../wasm-tacle/sequential/g723_enc/g723_enc.c | 878 + .../g723_enc/generated/default/g723_enc.wasm | Bin 0 -> 7734 bytes .../g723_enc/generated/default/g723_enc.wat | 2844 + .../modified_sources/default/g723_enc.c | 803 + .../modified_sources/inline/g723_enc.c | 822 + .../sequential/g723_enc/license.txt | 23 + .../sequential/gsm_enc/CMakeLists.txt | 25 + .../wasm-tacle/sequential/gsm_enc/COPYRIGHT | 16 + .../sequential/gsm_enc/ChangeLog.txt | 8 + targets/wasm-tacle/sequential/gsm_enc/data.h | 452 + .../gsm_enc/generated/default/gsm_enc.wasm | Bin 0 -> 28611 bytes .../gsm_enc/generated/default/gsm_enc.wat | 9906 +++ .../generated/modified_sources/default/data.h | 864 + .../modified_sources/default/gsm_enc.c | 2175 + .../modified_sources/default/private.h | 54 + .../generated/modified_sources/inline/data.h | 864 + .../modified_sources/inline/gsm_enc.c | 2185 + .../modified_sources/inline/private.h | 54 + .../wasm-tacle/sequential/gsm_enc/gsm_enc.c | 2224 + .../wasm-tacle/sequential/gsm_enc/private.h | 56 + .../sequential/h264_dec/CMakeLists.txt | 26 + .../sequential/h264_dec/changeLog.txt | 41 + .../sequential/h264_dec/copyright.txt | 32 + .../h264_dec/generated/default/h264_dec.wasm | Bin 0 -> 10261 bytes .../h264_dec/generated/default/h264_dec.wat | 733 + .../modified_sources/default/h264_dec.c | 824 + .../modified_sources/default/h264_dec.h | 30 + .../modified_sources/default/h264_decinput.c | 902 + .../modified_sources/inline/h264_dec.c | 834 + .../modified_sources/inline/h264_dec.h | 30 + .../modified_sources/inline/h264_decinput.c | 902 + .../wasm-tacle/sequential/h264_dec/h264_dec.c | 603 + .../wasm-tacle/sequential/h264_dec/h264_dec.h | 29 + .../sequential/h264_dec/h264_decinput.c | 801 + .../sequential/huff_enc/CMakeLists.txt | 25 + .../sequential/huff_enc/ChangeLog.txt | 27 + .../sequential/huff_enc/compress.txt | 1107 + .../huff_enc/generated/default/huff_enc.wasm | Bin 0 -> 9151 bytes .../huff_enc/generated/default/huff_enc.wat | 3557 + .../modified_sources/default/huff_enc.c | 601 + .../modified_sources/inline/huff_enc.c | 618 + .../wasm-tacle/sequential/huff_enc/huff_enc.c | 589 + .../sequential/mpeg2/CMakeLists.txt | 25 + .../wasm-tacle/sequential/mpeg2/ChangeLog.txt | 35 + .../mpeg2/generated/default/mpeg2.wasm | Bin 0 -> 115108 bytes .../mpeg2/generated/default/mpeg2.wat | 12495 ++++ .../modified_sources/default/mpeg2.c | 9369 +++ .../generated/modified_sources/inline/mpeg2.c | 9388 +++ targets/wasm-tacle/sequential/mpeg2/mpeg2.c | 13212 ++++ .../wasm-tacle/sequential/ndes/CMakeLists.txt | 25 + .../wasm-tacle/sequential/ndes/ChangeLog.txt | 20 + .../ndes/generated/default/ndes.wasm | Bin 0 -> 11467 bytes .../ndes/generated/default/ndes.wat | 2710 + .../generated/modified_sources/default/ndes.c | 369 + .../generated/modified_sources/inline/ndes.c | 381 + targets/wasm-tacle/sequential/ndes/ndes.c | 390 + .../sequential/petrinet/CMakeLists.txt | 25 + .../sequential/petrinet/ChangeLog.txt | 63 + .../petrinet/generated/default/petrinet.wasm | Bin 0 -> 6234 bytes .../petrinet/generated/default/petrinet.wat | 1921 + .../modified_sources/default/petrinet.c | 973 + .../modified_sources/inline/petrinet.c | 981 + .../wasm-tacle/sequential/petrinet/petrinet.c | 982 + .../sequential/rijndael_dec/CMakeLists.txt | 28 + .../sequential/rijndael_dec/ChangeLog.txt | 58 + .../wasm-tacle/sequential/rijndael_dec/aes.c | 406 + .../wasm-tacle/sequential/rijndael_dec/aes.h | 165 + .../sequential/rijndael_dec/aestab.h | 379 + .../generated/default/rijndael_dec.wasm | Bin 0 -> 58217 bytes .../generated/default/rijndael_dec.wat | 3687 + .../generated/modified_sources/default/aes.c | 479 + .../generated/modified_sources/default/aes.h | 167 + .../modified_sources/default/aestab.h | 426 + .../default/input_small_enc.c | 2187 + .../modified_sources/default/rijndael_dec.c | 194 + .../default/rijndael_dec_libc.c | 70 + .../default/rijndael_dec_libc.h | 30 + .../generated/modified_sources/inline/aes.c | 479 + .../generated/modified_sources/inline/aes.h | 168 + .../modified_sources/inline/aestab.h | 426 + .../modified_sources/inline/input_small_enc.c | 2187 + .../modified_sources/inline/rijndael_dec.c | 205 + .../inline/rijndael_dec_libc.c | 70 + .../inline/rijndael_dec_libc.h | 33 + .../sequential/rijndael_dec/input_small_enc.c | 2051 + .../sequential/rijndael_dec/rijndael_dec.c | 190 + .../rijndael_dec/rijndael_dec_libc.c | 66 + .../rijndael_dec/rijndael_dec_libc.h | 24 + .../sequential/rijndael_enc/CMakeLists.txt | 28 + .../sequential/rijndael_enc/ChangeLog.txt | 98 + .../wasm-tacle/sequential/rijndael_enc/aes.c | 406 + .../wasm-tacle/sequential/rijndael_enc/aes.h | 165 + .../sequential/rijndael_enc/aestab.h | 261 + .../generated/default/rijndael_enc.wasm | Bin 0 -> 53709 bytes .../generated/default/rijndael_enc.wat | 4094 ++ .../generated/modified_sources/default/aes.c | 479 + .../generated/modified_sources/default/aes.h | 167 + .../modified_sources/default/aestab.h | 294 + .../modified_sources/default/input_small.c | 2243 + .../modified_sources/default/rijndael_enc.c | 238 + .../default/rijndael_enc_libc.c | 70 + .../default/rijndael_enc_libc.h | 30 + .../generated/modified_sources/inline/aes.c | 479 + .../generated/modified_sources/inline/aes.h | 168 + .../modified_sources/inline/aestab.h | 294 + .../modified_sources/inline/input_small.c | 2243 + .../modified_sources/inline/rijndael_enc.c | 249 + .../inline/rijndael_enc_libc.c | 70 + .../inline/rijndael_enc_libc.h | 33 + .../sequential/rijndael_enc/input_small.c | 1963 + .../sequential/rijndael_enc/rijndael_enc.c | 232 + .../rijndael_enc/rijndael_enc_libc.c | 66 + .../rijndael_enc/rijndael_enc_libc.h | 24 + .../sequential/statemate/CMakeLists.txt | 25 + .../sequential/statemate/ChangeLog.txt | 60 + .../generated/default/statemate.wasm | Bin 0 -> 8280 bytes .../statemate/generated/default/statemate.wat | 2486 + .../modified_sources/default/statemate.c | 1388 + .../modified_sources/inline/statemate.c | 1398 + .../sequential/statemate/statemate.c | 1278 + .../sequential/susan/CMakeLists.txt | 29 + .../wasm-tacle/sequential/susan/ChangeLog.txt | 11 + targets/wasm-tacle/sequential/susan/LICENSE | 14 + .../susan/generated/default/susan.wasm | Bin 0 -> 28649 bytes .../susan/generated/default/susan.wat | 10631 +++ .../modified_sources/default/input.c | 610 + .../modified_sources/default/math_private.h | 173 + .../modified_sources/default/susan.c | 2869 + .../modified_sources/default/wccfile.c | 80 + .../modified_sources/default/wccfile.h | 25 + .../modified_sources/default/wcclibm.c | 483 + .../modified_sources/default/wcclibm.h | 54 + .../modified_sources/default/wccmalloc.c | 56 + .../modified_sources/default/wccmalloc.h | 11 + .../generated/modified_sources/inline/input.c | 610 + .../modified_sources/inline/math_private.h | 173 + .../generated/modified_sources/inline/susan.c | 2878 + .../modified_sources/inline/wccfile.c | 80 + .../modified_sources/inline/wccfile.h | 30 + .../modified_sources/inline/wcclibm.c | 483 + .../modified_sources/inline/wcclibm.h | 65 + .../modified_sources/inline/wccmalloc.c | 56 + .../modified_sources/inline/wccmalloc.h | 14 + targets/wasm-tacle/sequential/susan/input.c | 7293 ++ .../sequential/susan/math_private.h | 174 + targets/wasm-tacle/sequential/susan/susan.c | 2508 + targets/wasm-tacle/sequential/susan/wccfile.c | 79 + targets/wasm-tacle/sequential/susan/wccfile.h | 26 + targets/wasm-tacle/sequential/susan/wcclibm.c | 473 + targets/wasm-tacle/sequential/susan/wcclibm.h | 54 + .../wasm-tacle/sequential/susan/wccmalloc.c | 50 + .../wasm-tacle/sequential/susan/wccmalloc.h | 10 + targets/wasm-tacle/test/cover/CMakeLists.txt | 25 + targets/wasm-tacle/test/cover/ChangeLog.txt | 57 + targets/wasm-tacle/test/cover/cover.c | 702 + .../test/cover/generated/default/cover.wasm | Bin 0 -> 594 bytes .../test/cover/generated/default/cover.wat | 61 + .../modified_sources/default/cover.c | 699 + .../generated/modified_sources/inline/cover.c | 705 + targets/wasm-tacle/test/duff/CMakeLists.txt | 25 + targets/wasm-tacle/test/duff/changeLog.txt | 40 + targets/wasm-tacle/test/duff/duff.c | 133 + .../test/duff/generated/default/duff.wasm | Bin 0 -> 909 bytes .../test/duff/generated/default/duff.wat | 172 + .../generated/modified_sources/default/duff.c | 127 + .../generated/modified_sources/inline/duff.c | 137 + targets/wasm-tacle/test/test3/CMakeLists.txt | 25 + targets/wasm-tacle/test/test3/ChangeLog.txt | 37 + .../test/test3/generated/default/test3.wasm | Bin 0 -> 69499 bytes .../test/test3/generated/default/test3.wat | 19779 +++++ .../modified_sources/default/test3.c | 4833 ++ .../generated/modified_sources/inline/test3.c | 4841 ++ targets/wasm-tacle/test/test3/test3.c | 5078 ++ 1122 files changed, 520422 insertions(+) create mode 100644 targets/wasm-tacle/app/lift/CMakeLists.txt create mode 100755 targets/wasm-tacle/app/lift/README create mode 100755 targets/wasm-tacle/app/lift/changeLog.txt create mode 100755 targets/wasm-tacle/app/lift/generated/default/lift.wasm create mode 100644 targets/wasm-tacle/app/lift/generated/default/lift.wat create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/default/lift.c create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.c create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.h create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.c create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.h create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/inline/lift.c create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.c create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.h create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.c create mode 100644 targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.h create mode 100755 targets/wasm-tacle/app/lift/lift.c create mode 100755 targets/wasm-tacle/app/lift/liftlibcontrol.c create mode 100755 targets/wasm-tacle/app/lift/liftlibcontrol.h create mode 100755 targets/wasm-tacle/app/lift/liftlibio.c create mode 100755 targets/wasm-tacle/app/lift/liftlibio.h create mode 100644 targets/wasm-tacle/app/powerwindow/CMakeLists.txt create mode 100644 targets/wasm-tacle/app/powerwindow/changeLog create mode 100755 targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wasm create mode 100644 targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wat create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_const_params.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_inputs.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_model_reference_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_continuous.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_solver.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtwtypes.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_tmwtypes.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_const_params.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_inputs.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_model_reference_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_continuous.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_solver.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtwtypes.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_tmwtypes.h create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.c create mode 100644 targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_DRV.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackL.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackR.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_Front.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_const_params.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_controlexclusion.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_debounce.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_inputs.c create mode 100644 targets/wasm-tacle/app/powerwindow/powerwindow_powerwindow_control.c create mode 100644 targets/wasm-tacle/app/powerwindow/wcclib.c create mode 100644 targets/wasm-tacle/app/powerwindow/wcclib.h create mode 100644 targets/wasm-tacle/kernel/binarysearch/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/binarysearch/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/binarysearch/binarysearch.c create mode 100755 targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wasm create mode 100644 targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wat create mode 100644 targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/default/binarysearch.c create mode 100644 targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/inline/binarysearch.c create mode 100644 targets/wasm-tacle/kernel/bitcount/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/bitcount/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/bitcount/LICENSE create mode 100755 targets/wasm-tacle/kernel/bitcount/bitcnt_1.c create mode 100755 targets/wasm-tacle/kernel/bitcount/bitcnt_2.c create mode 100755 targets/wasm-tacle/kernel/bitcount/bitcnt_3.c create mode 100755 targets/wasm-tacle/kernel/bitcount/bitcnt_4.c create mode 100755 targets/wasm-tacle/kernel/bitcount/bitcount.c create mode 100755 targets/wasm-tacle/kernel/bitcount/bitops.h create mode 100755 targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wasm create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wat create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_1.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_2.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_3.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_4.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcount.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitops.h create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_1.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_2.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_3.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_4.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcount.c create mode 100644 targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitops.h create mode 100644 targets/wasm-tacle/kernel/bitonic/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/bitonic/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/bitonic/bitonic.c create mode 100755 targets/wasm-tacle/kernel/bitonic/generated/default/bitonic.wasm create mode 100644 targets/wasm-tacle/kernel/bitonic/generated/default/bitonic.wat create mode 100644 targets/wasm-tacle/kernel/bitonic/generated/modified_sources/default/bitonic.c create mode 100644 targets/wasm-tacle/kernel/bitonic/generated/modified_sources/inline/bitonic.c create mode 100755 targets/wasm-tacle/kernel/bitonic/license.txt create mode 100644 targets/wasm-tacle/kernel/bsort/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/bsort/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/bsort/bsort.c create mode 100755 targets/wasm-tacle/kernel/bsort/generated/default/bsort.wasm create mode 100644 targets/wasm-tacle/kernel/bsort/generated/default/bsort.wat create mode 100644 targets/wasm-tacle/kernel/bsort/generated/modified_sources/default/bsort.c create mode 100644 targets/wasm-tacle/kernel/bsort/generated/modified_sources/inline/bsort.c create mode 100644 targets/wasm-tacle/kernel/complex_updates/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/complex_updates/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/complex_updates/complex_updates.c create mode 100755 targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wasm create mode 100644 targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wat create mode 100644 targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/default/complex_updates.c create mode 100644 targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/inline/complex_updates.c create mode 100644 targets/wasm-tacle/kernel/cosf/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/cosf/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/cosf/cosf.c create mode 100755 targets/wasm-tacle/kernel/cosf/generated/default/cosf.wasm create mode 100644 targets/wasm-tacle/kernel/cosf/generated/default/cosf.wat create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/cosf.c create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/math_private.h create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/wcclibm.c create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/wcclibm.h create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/cosf.c create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/math_private.h create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.c create mode 100644 targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.h create mode 100755 targets/wasm-tacle/kernel/cosf/math_private.h create mode 100755 targets/wasm-tacle/kernel/cosf/wcclibm.c create mode 100755 targets/wasm-tacle/kernel/cosf/wcclibm.h create mode 100644 targets/wasm-tacle/kernel/countnegative/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/countnegative/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/countnegative/countnegative.c create mode 100755 targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wasm create mode 100644 targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wat create mode 100644 targets/wasm-tacle/kernel/countnegative/generated/modified_sources/default/countnegative.c create mode 100644 targets/wasm-tacle/kernel/countnegative/generated/modified_sources/inline/countnegative.c create mode 100644 targets/wasm-tacle/kernel/cubic/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/cubic/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/cubic/cubic.c create mode 100755 targets/wasm-tacle/kernel/cubic/generated/default/cubic.wasm create mode 100644 targets/wasm-tacle/kernel/cubic/generated/default/cubic.wat create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/cubic.c create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/math_private.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/pi.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/snipmath.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.c create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/cubic.c create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/math_private.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/pi.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/snipmath.h create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.c create mode 100644 targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.h create mode 100755 targets/wasm-tacle/kernel/cubic/math_private.h create mode 100755 targets/wasm-tacle/kernel/cubic/pi.h create mode 100755 targets/wasm-tacle/kernel/cubic/snipmath.h create mode 100755 targets/wasm-tacle/kernel/cubic/wcclibm.c create mode 100755 targets/wasm-tacle/kernel/cubic/wcclibm.h create mode 100644 targets/wasm-tacle/kernel/deg2rad/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/deg2rad/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/deg2rad/deg2rad.c create mode 100755 targets/wasm-tacle/kernel/deg2rad/generated/default/deg2rad.wasm create mode 100644 targets/wasm-tacle/kernel/deg2rad/generated/default/deg2rad.wat create mode 100644 targets/wasm-tacle/kernel/deg2rad/generated/modified_sources/default/deg2rad.c create mode 100644 targets/wasm-tacle/kernel/deg2rad/generated/modified_sources/default/pi.h create mode 100644 targets/wasm-tacle/kernel/deg2rad/generated/modified_sources/inline/deg2rad.c create mode 100644 targets/wasm-tacle/kernel/deg2rad/generated/modified_sources/inline/pi.h create mode 100755 targets/wasm-tacle/kernel/deg2rad/pi.h create mode 100644 targets/wasm-tacle/kernel/fac/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/fac/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/fac/fac.c create mode 100755 targets/wasm-tacle/kernel/fac/generated/default/fac.wasm create mode 100644 targets/wasm-tacle/kernel/fac/generated/default/fac.wat create mode 100644 targets/wasm-tacle/kernel/fac/generated/modified_sources/default/fac.c create mode 100644 targets/wasm-tacle/kernel/fac/generated/modified_sources/inline/fac.c create mode 100644 targets/wasm-tacle/kernel/fft/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/fft/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/fft/fft.c create mode 100755 targets/wasm-tacle/kernel/fft/fft_input.c create mode 100755 targets/wasm-tacle/kernel/fft/generated/default/fft.wasm create mode 100644 targets/wasm-tacle/kernel/fft/generated/default/fft.wat create mode 100644 targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft.c create mode 100644 targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft_input.c create mode 100644 targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft.c create mode 100644 targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft_input.c create mode 100644 targets/wasm-tacle/kernel/filterbank/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/filterbank/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/filterbank/filterbank.c create mode 100755 targets/wasm-tacle/kernel/filterbank/generated/default/filterbank.wasm create mode 100644 targets/wasm-tacle/kernel/filterbank/generated/default/filterbank.wat create mode 100644 targets/wasm-tacle/kernel/filterbank/generated/modified_sources/default/filterbank.c create mode 100644 targets/wasm-tacle/kernel/filterbank/generated/modified_sources/inline/filterbank.c create mode 100755 targets/wasm-tacle/kernel/filterbank/license.txt create mode 100644 targets/wasm-tacle/kernel/fir2dim/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/fir2dim/changeLog.txt create mode 100755 targets/wasm-tacle/kernel/fir2dim/fir2dim.c create mode 100755 targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wasm create mode 100644 targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wat create mode 100644 targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/default/fir2dim.c create mode 100644 targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/inline/fir2dim.c create mode 100644 targets/wasm-tacle/kernel/iir/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/iir/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/iir/generated/default/iir.wasm create mode 100644 targets/wasm-tacle/kernel/iir/generated/default/iir.wat create mode 100644 targets/wasm-tacle/kernel/iir/generated/modified_sources/default/iir.c create mode 100644 targets/wasm-tacle/kernel/iir/generated/modified_sources/inline/iir.c create mode 100755 targets/wasm-tacle/kernel/iir/iir.c create mode 100644 targets/wasm-tacle/kernel/insertsort/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/insertsort/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wasm create mode 100644 targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wat create mode 100644 targets/wasm-tacle/kernel/insertsort/generated/modified_sources/default/insertsort.c create mode 100644 targets/wasm-tacle/kernel/insertsort/generated/modified_sources/inline/insertsort.c create mode 100755 targets/wasm-tacle/kernel/insertsort/insertsort.c create mode 100644 targets/wasm-tacle/kernel/isqrt/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/isqrt/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/isqrt/basicmath_libc.c create mode 100755 targets/wasm-tacle/kernel/isqrt/basicmath_libc.h create mode 100755 targets/wasm-tacle/kernel/isqrt/generated/default/isqrt.wasm create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/default/isqrt.wat create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/basicmath_libc.c create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/basicmath_libc.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/isqrt.c create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/math_private.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/pi.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/snipmath.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.c create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.c create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/isqrt.c create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/math_private.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/pi.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/snipmath.h create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.c create mode 100644 targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.h create mode 100755 targets/wasm-tacle/kernel/isqrt/isqrt.c create mode 100755 targets/wasm-tacle/kernel/isqrt/math_private.h create mode 100755 targets/wasm-tacle/kernel/isqrt/pi.h create mode 100755 targets/wasm-tacle/kernel/isqrt/snipmath.h create mode 100755 targets/wasm-tacle/kernel/isqrt/wcclibm.c create mode 100755 targets/wasm-tacle/kernel/isqrt/wcclibm.h create mode 100644 targets/wasm-tacle/kernel/jfdctint/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/jfdctint/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/jfdctint/README create mode 100755 targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wasm create mode 100644 targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wat create mode 100644 targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/default/jfdctint.c create mode 100644 targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/inline/jfdctint.c create mode 100755 targets/wasm-tacle/kernel/jfdctint/jfdctint.c create mode 100644 targets/wasm-tacle/kernel/lms/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/lms/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/lms/generated/default/lms.wasm create mode 100644 targets/wasm-tacle/kernel/lms/generated/default/lms.wat create mode 100644 targets/wasm-tacle/kernel/lms/generated/modified_sources/default/lms.c create mode 100644 targets/wasm-tacle/kernel/lms/generated/modified_sources/inline/lms.c create mode 100755 targets/wasm-tacle/kernel/lms/lms.c create mode 100644 targets/wasm-tacle/kernel/ludcmp/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/ludcmp/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wasm create mode 100644 targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wat create mode 100644 targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/default/ludcmp.c create mode 100644 targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/inline/ludcmp.c create mode 100755 targets/wasm-tacle/kernel/ludcmp/ludcmp.c create mode 100644 targets/wasm-tacle/kernel/matrix1/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/matrix1/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/matrix1/generated/default/matrix1.wasm create mode 100644 targets/wasm-tacle/kernel/matrix1/generated/default/matrix1.wat create mode 100644 targets/wasm-tacle/kernel/matrix1/generated/modified_sources/default/matrix1.c create mode 100644 targets/wasm-tacle/kernel/matrix1/generated/modified_sources/inline/matrix1.c create mode 100755 targets/wasm-tacle/kernel/matrix1/matrix1.c create mode 100644 targets/wasm-tacle/kernel/md5/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/md5/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/md5/generated/default/md5.wasm create mode 100644 targets/wasm-tacle/kernel/md5/generated/default/md5.wat create mode 100644 targets/wasm-tacle/kernel/md5/generated/modified_sources/default/md5.c create mode 100644 targets/wasm-tacle/kernel/md5/generated/modified_sources/inline/md5.c create mode 100755 targets/wasm-tacle/kernel/md5/md5.c create mode 100644 targets/wasm-tacle/kernel/minver/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/minver/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/minver/generated/default/minver.wasm create mode 100644 targets/wasm-tacle/kernel/minver/generated/default/minver.wat create mode 100644 targets/wasm-tacle/kernel/minver/generated/modified_sources/default/minver.c create mode 100644 targets/wasm-tacle/kernel/minver/generated/modified_sources/inline/minver.c create mode 100755 targets/wasm-tacle/kernel/minver/minver.c create mode 100644 targets/wasm-tacle/kernel/pm/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/pm/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/pm/generated/default/pm.wasm create mode 100644 targets/wasm-tacle/kernel/pm/generated/default/pm.wat create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_input.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_libm.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_math.h create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_stdlib.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_string.h create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_input.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_libm.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_math.h create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_stdlib.c create mode 100644 targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_string.h create mode 100755 targets/wasm-tacle/kernel/pm/license.txt create mode 100755 targets/wasm-tacle/kernel/pm/pm.c create mode 100755 targets/wasm-tacle/kernel/pm/pm_input.c create mode 100755 targets/wasm-tacle/kernel/pm/pm_libm.c create mode 100755 targets/wasm-tacle/kernel/pm/pm_math.h create mode 100755 targets/wasm-tacle/kernel/pm/pm_stdlib.c create mode 100755 targets/wasm-tacle/kernel/pm/pm_string.h create mode 100644 targets/wasm-tacle/kernel/prime/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/prime/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/prime/generated/default/prime.wasm create mode 100644 targets/wasm-tacle/kernel/prime/generated/default/prime.wat create mode 100644 targets/wasm-tacle/kernel/prime/generated/modified_sources/default/prime.c create mode 100644 targets/wasm-tacle/kernel/prime/generated/modified_sources/inline/prime.c create mode 100755 targets/wasm-tacle/kernel/prime/prime.c create mode 100644 targets/wasm-tacle/kernel/quicksort/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/quicksort/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/quicksort/generated/default/quicksort.wasm create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/default/quicksort.wat create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/input.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/math_private.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/input.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/math_private.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.h create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.c create mode 100644 targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.h create mode 100755 targets/wasm-tacle/kernel/quicksort/input.c create mode 100755 targets/wasm-tacle/kernel/quicksort/math_private.h create mode 100755 targets/wasm-tacle/kernel/quicksort/quicksort.c create mode 100755 targets/wasm-tacle/kernel/quicksort/quicksort.h create mode 100755 targets/wasm-tacle/kernel/quicksort/quicksortlibm.c create mode 100755 targets/wasm-tacle/kernel/quicksort/quicksortlibm.h create mode 100755 targets/wasm-tacle/kernel/quicksort/quicksortstdlib.c create mode 100755 targets/wasm-tacle/kernel/quicksort/quicksortstdlib.h create mode 100644 targets/wasm-tacle/kernel/rad2deg/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/rad2deg/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/rad2deg/generated/default/rad2deg.wasm create mode 100644 targets/wasm-tacle/kernel/rad2deg/generated/default/rad2deg.wat create mode 100644 targets/wasm-tacle/kernel/rad2deg/generated/modified_sources/default/pi.h create mode 100644 targets/wasm-tacle/kernel/rad2deg/generated/modified_sources/default/rad2deg.c create mode 100644 targets/wasm-tacle/kernel/rad2deg/generated/modified_sources/inline/pi.h create mode 100644 targets/wasm-tacle/kernel/rad2deg/generated/modified_sources/inline/rad2deg.c create mode 100755 targets/wasm-tacle/kernel/rad2deg/pi.h create mode 100755 targets/wasm-tacle/kernel/rad2deg/rad2deg.c create mode 100644 targets/wasm-tacle/kernel/recursion/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/recursion/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/recursion/generated/default/recursion.wasm create mode 100644 targets/wasm-tacle/kernel/recursion/generated/default/recursion.wat create mode 100644 targets/wasm-tacle/kernel/recursion/generated/modified_sources/default/recursion.c create mode 100644 targets/wasm-tacle/kernel/recursion/generated/modified_sources/inline/recursion.c create mode 100755 targets/wasm-tacle/kernel/recursion/recursion.c create mode 100644 targets/wasm-tacle/kernel/sha/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/sha/Changelog.txt create mode 100755 targets/wasm-tacle/kernel/sha/generated/default/sha.wasm create mode 100644 targets/wasm-tacle/kernel/sha/generated/default/sha.wat create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/input_small.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memcpy.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memcpy.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/input_small.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.h create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.c create mode 100644 targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.h create mode 100755 targets/wasm-tacle/kernel/sha/input_small.c create mode 100755 targets/wasm-tacle/kernel/sha/memcpy.c create mode 100755 targets/wasm-tacle/kernel/sha/memcpy.h create mode 100755 targets/wasm-tacle/kernel/sha/memhelper.c create mode 100755 targets/wasm-tacle/kernel/sha/memhelper.h create mode 100755 targets/wasm-tacle/kernel/sha/memset.c create mode 100755 targets/wasm-tacle/kernel/sha/memset.h create mode 100755 targets/wasm-tacle/kernel/sha/sha.c create mode 100755 targets/wasm-tacle/kernel/sha/sha.h create mode 100644 targets/wasm-tacle/kernel/st/CMakeLists.txt create mode 100755 targets/wasm-tacle/kernel/st/ChangeLog.txt create mode 100755 targets/wasm-tacle/kernel/st/generated/default/st.wasm create mode 100644 targets/wasm-tacle/kernel/st/generated/default/st.wat create mode 100644 targets/wasm-tacle/kernel/st/generated/modified_sources/default/st.c create mode 100644 targets/wasm-tacle/kernel/st/generated/modified_sources/inline/st.c create mode 100755 targets/wasm-tacle/kernel/st/st.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/README.txt create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/ad_conv.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/build.bat create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt0.s create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt_asyst.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/intvec.s create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.map create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.txt create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/setup.bat create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/wcc_memcpy.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/wcc_memcpy.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/wcc_memcpy.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/wcc_memcpy.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/wcc_memcpy.c create mode 100755 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/host-build.sh create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/linker-mpc55xx-gcc.ld create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/readme.txt create mode 100755 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target-build.sh create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/wcc_memcpy.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/wcc_memcpy.c create mode 100755 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/build.sh create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/keyword.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/problems.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/probs.txt create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/rpt_ipoint.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target_tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/arch/x86/wcc_memcpy.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/class.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/class.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/classtab.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/classtab.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/debie.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/dpu_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/harness.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/target_ad_conv.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/target_dpu_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/target_isr_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/target_reg52.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/target_su_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/harness/target_ttc_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/health.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/health.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/hw_if.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/isr_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/kernobj.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/measure.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/measure.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/msg_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/reg52.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/su_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/taskctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/tc_hand.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/tc_hand.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/telem.c create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/telem.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/tm_data.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/ttc_ctrl.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/code/version.h create mode 100644 targets/wasm-tacle/parallel/DEBIE/orig-docs/design_1_4.pdf create mode 100644 targets/wasm-tacle/parallel/DEBIE/orig-docs/srd_1_3.pdf create mode 100644 targets/wasm-tacle/parallel/DEBIE/orig-docs/sum_1_3.pdf create mode 100644 targets/wasm-tacle/parallel/DEBIE/terms_of_use-2014-05.pdf create mode 100644 targets/wasm-tacle/parallel/PapaBench/AUTHORS create mode 100644 targets/wasm-tacle/parallel/PapaBench/COPYING create mode 100644 targets/wasm-tacle/parallel/PapaBench/Loops_Bounds.txt create mode 100644 targets/wasm-tacle/parallel/PapaBench/PapaBench_for_wcet.txt create mode 100644 targets/wasm-tacle/parallel/PapaBench/README create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aadl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aadl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aadl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aadl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Old_Version.aadl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/propertysets/Thread_Properties.aadl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/packages/Data_Types.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Old_Version.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/propertysets/Thread_Properties.aaxl create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/interrupt.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/io.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom128.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom8.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/portpins.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/sfr_defs.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/signal.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/Makefile.local.in create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/Makefile.std create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/arm-elf-alone.conf create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/arm-elf.conf create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/powerpc-elf-alone.conf create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/powerpc-linux-gnu.conf create mode 100644 targets/wasm-tacle/parallel/PapaBench/conf/tricore-alone.conf create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/autopilot.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/downlink.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_sirf.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_ubx.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/main.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/mainloop.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/sirf.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/timer.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ubx.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/link_autopilot.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/main.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/timer.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/downlink.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/geometry.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/glade_support.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/logger.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/network.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/protocol.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/traces.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/c/transport.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/inttypes.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/math.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/include/std.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/downlink.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/geometry.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/logger.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/math.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/network.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/protocol.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/traces.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/c/transport.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/lib/crt0/powerpc-elf-crt0.c create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/var/include/airframe.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/var/include/flight_plan.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/var/include/inflight_calib.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/var/include/messages.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/var/include/radio.h create mode 100644 targets/wasm-tacle/parallel/PapaBench/sw/var/include/ubx_protocol.h create mode 100644 targets/wasm-tacle/parallel/rosace/README.txt create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/assemblage.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/assemblage.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/com_patterns.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/common.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/common.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/io.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/io.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/math_all.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/math_private.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/multirate_precedence.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/nonencoded_task_params.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/ros_th1.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/types.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread1/wcclibm.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/assemblage.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/assemblage.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/com_patterns.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/common.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/common.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/io.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/io.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/math_all.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/math_private.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/multirate_precedence.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/nonencoded_task_params.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/ros_th2.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/types.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread2/wcclibm.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/assemblage.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/assemblage.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/assemblage_includes.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/assemblage_includes.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/com_patterns.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/common.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/common.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/io.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/io.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/math_all.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/math_private.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/multirate_precedence.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/nonencoded_task_params.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/ros_th3.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/types.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread3/wcclibm.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/assemblage.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/assemblage.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/assemblage_includes.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/assemblage_includes.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/com_patterns.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/common.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/common.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/io.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/io.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/math_all.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/math_private.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/multirate_precedence.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/nonencoded_task_params.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/ros_th4.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/types.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread4/wcclibm.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/assemblage.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/assemblage.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/com_patterns.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/common.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/common.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/io.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/io.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/math_all.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/math_private.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/multirate_precedence.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/nonencoded_task_params.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/ros_th5.c create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/types.h create mode 100644 targets/wasm-tacle/parallel/rosace/thread5/wcclibm.h create mode 100644 targets/wasm-tacle/sequential/adpcm_dec/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/adpcm_dec/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/adpcm_dec/adpcm_dec.c create mode 100755 targets/wasm-tacle/sequential/adpcm_dec/generated/default/adpcm_dec.wasm create mode 100644 targets/wasm-tacle/sequential/adpcm_dec/generated/default/adpcm_dec.wat create mode 100644 targets/wasm-tacle/sequential/adpcm_dec/generated/modified_sources/default/adpcm_dec.c create mode 100644 targets/wasm-tacle/sequential/adpcm_dec/generated/modified_sources/inline/adpcm_dec.c create mode 100644 targets/wasm-tacle/sequential/adpcm_enc/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/adpcm_enc/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/adpcm_enc/adpcm_enc.c create mode 100755 targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wasm create mode 100644 targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wat create mode 100644 targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/default/adpcm_enc.c create mode 100644 targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/inline/adpcm_enc.c create mode 100644 targets/wasm-tacle/sequential/ammunition/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/ammunition/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/ammunition/README create mode 100755 targets/wasm-tacle/sequential/ammunition/ammunition.c create mode 100755 targets/wasm-tacle/sequential/ammunition/ammunition_libc.c create mode 100755 targets/wasm-tacle/sequential/ammunition/ammunition_limits.h create mode 100755 targets/wasm-tacle/sequential/ammunition/ammunition_stdio.h create mode 100755 targets/wasm-tacle/sequential/ammunition/ammunition_stdlib.h create mode 100755 targets/wasm-tacle/sequential/ammunition/ammunition_string.h create mode 100755 targets/wasm-tacle/sequential/ammunition/arithm.c create mode 100755 targets/wasm-tacle/sequential/ammunition/arithm.h create mode 100755 targets/wasm-tacle/sequential/ammunition/bits.c create mode 100755 targets/wasm-tacle/sequential/ammunition/bits.h create mode 100755 targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wasm create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wat create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_libc.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_limits.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdio.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdlib.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_string.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_libc.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_limits.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdio.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdlib.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_string.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.h create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.c create mode 100644 targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.h create mode 100644 targets/wasm-tacle/sequential/anagram/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/anagram/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/anagram/anagram.c create mode 100755 targets/wasm-tacle/sequential/anagram/anagram_compare.h create mode 100755 targets/wasm-tacle/sequential/anagram/anagram_ctype.h create mode 100755 targets/wasm-tacle/sequential/anagram/anagram_input.c create mode 100755 targets/wasm-tacle/sequential/anagram/anagram_stdlib.c create mode 100755 targets/wasm-tacle/sequential/anagram/anagram_stdlib.h create mode 100755 targets/wasm-tacle/sequential/anagram/anagram_strings.h create mode 100755 targets/wasm-tacle/sequential/anagram/generated/default/anagram.wasm create mode 100644 targets/wasm-tacle/sequential/anagram/generated/default/anagram.wat create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram.c create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_compare.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_ctype.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_input.c create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.c create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_strings.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram.c create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_compare.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_ctype.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_input.c create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.c create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.h create mode 100644 targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_strings.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/audiobeam/README create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeam.c create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeam.h create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeaminput.c create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.c create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.h create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.c create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.h create mode 100755 targets/wasm-tacle/sequential/audiobeam/audiobeamlibmath.h create mode 100755 targets/wasm-tacle/sequential/audiobeam/changeLog.txt create mode 100755 targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wasm create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wat create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeaminput.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmath.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeaminput.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.c create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.h create mode 100644 targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmath.h create mode 100755 targets/wasm-tacle/sequential/audiobeam/license.txt create mode 100644 targets/wasm-tacle/sequential/cjpeg_transupp/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/cjpeg_transupp/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/cjpeg_transupp/README create mode 100755 targets/wasm-tacle/sequential/cjpeg_transupp/cjpeg_transupp.c create mode 100755 targets/wasm-tacle/sequential/cjpeg_transupp/generated/default/cjpeg_transupp.wasm create mode 100644 targets/wasm-tacle/sequential/cjpeg_transupp/generated/default/cjpeg_transupp.wat create mode 100644 targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/default/cjpeg_transupp.c create mode 100644 targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/default/jpeglib.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/cjpeg_transupp.c create mode 100644 targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/jpeglib.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_transupp/jpeglib.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/README create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/cderror.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/cdjpeg.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/cjpeg_wrbmp.c create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wasm create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wat create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cderror.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cdjpeg.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cjpeg_wrbmp.c create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/input.c create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jconfig.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jerror.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jmorecfg.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jpeglib.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cderror.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cdjpeg.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cjpeg_wrbmp.c create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/input.c create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jconfig.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jerror.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jmorecfg.h create mode 100644 targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jpeglib.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/input.c create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/jconfig.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/jerror.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/jmorecfg.h create mode 100755 targets/wasm-tacle/sequential/cjpeg_wrbmp/jpeglib.h create mode 100644 targets/wasm-tacle/sequential/dijkstra/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/dijkstra/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/dijkstra/dijkstra.c create mode 100755 targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wasm create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wat create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/dijkstra.c create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.c create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.h create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/dijkstra.c create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.c create mode 100644 targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.h create mode 100755 targets/wasm-tacle/sequential/dijkstra/input.c create mode 100755 targets/wasm-tacle/sequential/dijkstra/input.h create mode 100644 targets/wasm-tacle/sequential/epic/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/epic/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/epic/epic.c create mode 100755 targets/wasm-tacle/sequential/epic/epic.h create mode 100755 targets/wasm-tacle/sequential/epic/generated/default/epic.wasm create mode 100644 targets/wasm-tacle/sequential/epic/generated/default/epic.wat create mode 100644 targets/wasm-tacle/sequential/epic/generated/modified_sources/default/epic.c create mode 100644 targets/wasm-tacle/sequential/epic/generated/modified_sources/default/epic.h create mode 100644 targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.c create mode 100644 targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.h create mode 100644 targets/wasm-tacle/sequential/fmref/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/fmref/Changelog.txt create mode 100755 targets/wasm-tacle/sequential/fmref/fmref.c create mode 100755 targets/wasm-tacle/sequential/fmref/generated/default/fmref.wasm create mode 100644 targets/wasm-tacle/sequential/fmref/generated/default/fmref.wat create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/fmref.c create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/math_private.h create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.c create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.h create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/fmref.c create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/math_private.h create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.c create mode 100644 targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.h create mode 100755 targets/wasm-tacle/sequential/fmref/license.txt create mode 100755 targets/wasm-tacle/sequential/fmref/math_private.h create mode 100755 targets/wasm-tacle/sequential/fmref/wcclibm.c create mode 100755 targets/wasm-tacle/sequential/fmref/wcclibm.h create mode 100644 targets/wasm-tacle/sequential/g723_enc/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/g723_enc/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/g723_enc/g723_enc.c create mode 100755 targets/wasm-tacle/sequential/g723_enc/generated/default/g723_enc.wasm create mode 100644 targets/wasm-tacle/sequential/g723_enc/generated/default/g723_enc.wat create mode 100644 targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/default/g723_enc.c create mode 100644 targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/inline/g723_enc.c create mode 100755 targets/wasm-tacle/sequential/g723_enc/license.txt create mode 100644 targets/wasm-tacle/sequential/gsm_enc/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/gsm_enc/COPYRIGHT create mode 100755 targets/wasm-tacle/sequential/gsm_enc/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/gsm_enc/data.h create mode 100755 targets/wasm-tacle/sequential/gsm_enc/generated/default/gsm_enc.wasm create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/default/gsm_enc.wat create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/data.h create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/gsm_enc.c create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/private.h create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/data.h create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/gsm_enc.c create mode 100644 targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/private.h create mode 100755 targets/wasm-tacle/sequential/gsm_enc/gsm_enc.c create mode 100755 targets/wasm-tacle/sequential/gsm_enc/private.h create mode 100644 targets/wasm-tacle/sequential/h264_dec/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/h264_dec/changeLog.txt create mode 100755 targets/wasm-tacle/sequential/h264_dec/copyright.txt create mode 100755 targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wasm create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wat create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.c create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.h create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_decinput.c create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.c create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.h create mode 100644 targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_decinput.c create mode 100755 targets/wasm-tacle/sequential/h264_dec/h264_dec.c create mode 100755 targets/wasm-tacle/sequential/h264_dec/h264_dec.h create mode 100755 targets/wasm-tacle/sequential/h264_dec/h264_decinput.c create mode 100644 targets/wasm-tacle/sequential/huff_enc/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/huff_enc/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/huff_enc/compress.txt create mode 100755 targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wasm create mode 100644 targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wat create mode 100644 targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/default/huff_enc.c create mode 100644 targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/inline/huff_enc.c create mode 100755 targets/wasm-tacle/sequential/huff_enc/huff_enc.c create mode 100644 targets/wasm-tacle/sequential/mpeg2/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/mpeg2/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wasm create mode 100644 targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wat create mode 100644 targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/default/mpeg2.c create mode 100644 targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/inline/mpeg2.c create mode 100755 targets/wasm-tacle/sequential/mpeg2/mpeg2.c create mode 100644 targets/wasm-tacle/sequential/ndes/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/ndes/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/ndes/generated/default/ndes.wasm create mode 100644 targets/wasm-tacle/sequential/ndes/generated/default/ndes.wat create mode 100644 targets/wasm-tacle/sequential/ndes/generated/modified_sources/default/ndes.c create mode 100644 targets/wasm-tacle/sequential/ndes/generated/modified_sources/inline/ndes.c create mode 100755 targets/wasm-tacle/sequential/ndes/ndes.c create mode 100644 targets/wasm-tacle/sequential/petrinet/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/petrinet/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/petrinet/generated/default/petrinet.wasm create mode 100644 targets/wasm-tacle/sequential/petrinet/generated/default/petrinet.wat create mode 100644 targets/wasm-tacle/sequential/petrinet/generated/modified_sources/default/petrinet.c create mode 100644 targets/wasm-tacle/sequential/petrinet/generated/modified_sources/inline/petrinet.c create mode 100755 targets/wasm-tacle/sequential/petrinet/petrinet.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/aes.c create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/aes.h create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/aestab.h create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wasm create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wat create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.h create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aestab.h create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/input_small_enc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.h create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.h create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aestab.h create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/input_small_enc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.h create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/input_small_enc.c create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec.c create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.c create mode 100755 targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.h create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/aes.c create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/aes.h create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/aestab.h create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/generated/default/rijndael_enc.wasm create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/default/rijndael_enc.wat create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aes.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aes.h create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aestab.h create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/input_small.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.h create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.h create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aestab.h create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/input_small.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.c create mode 100644 targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.h create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/input_small.c create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc.c create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.c create mode 100755 targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.h create mode 100644 targets/wasm-tacle/sequential/statemate/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/statemate/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/statemate/generated/default/statemate.wasm create mode 100644 targets/wasm-tacle/sequential/statemate/generated/default/statemate.wat create mode 100644 targets/wasm-tacle/sequential/statemate/generated/modified_sources/default/statemate.c create mode 100644 targets/wasm-tacle/sequential/statemate/generated/modified_sources/inline/statemate.c create mode 100755 targets/wasm-tacle/sequential/statemate/statemate.c create mode 100644 targets/wasm-tacle/sequential/susan/CMakeLists.txt create mode 100755 targets/wasm-tacle/sequential/susan/ChangeLog.txt create mode 100755 targets/wasm-tacle/sequential/susan/LICENSE create mode 100755 targets/wasm-tacle/sequential/susan/generated/default/susan.wasm create mode 100644 targets/wasm-tacle/sequential/susan/generated/default/susan.wat create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/input.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/math_private.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/susan.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/input.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/math_private.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/susan.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.h create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.c create mode 100644 targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.h create mode 100755 targets/wasm-tacle/sequential/susan/input.c create mode 100755 targets/wasm-tacle/sequential/susan/math_private.h create mode 100755 targets/wasm-tacle/sequential/susan/susan.c create mode 100755 targets/wasm-tacle/sequential/susan/wccfile.c create mode 100755 targets/wasm-tacle/sequential/susan/wccfile.h create mode 100755 targets/wasm-tacle/sequential/susan/wcclibm.c create mode 100755 targets/wasm-tacle/sequential/susan/wcclibm.h create mode 100755 targets/wasm-tacle/sequential/susan/wccmalloc.c create mode 100755 targets/wasm-tacle/sequential/susan/wccmalloc.h create mode 100644 targets/wasm-tacle/test/cover/CMakeLists.txt create mode 100755 targets/wasm-tacle/test/cover/ChangeLog.txt create mode 100755 targets/wasm-tacle/test/cover/cover.c create mode 100755 targets/wasm-tacle/test/cover/generated/default/cover.wasm create mode 100644 targets/wasm-tacle/test/cover/generated/default/cover.wat create mode 100644 targets/wasm-tacle/test/cover/generated/modified_sources/default/cover.c create mode 100644 targets/wasm-tacle/test/cover/generated/modified_sources/inline/cover.c create mode 100644 targets/wasm-tacle/test/duff/CMakeLists.txt create mode 100755 targets/wasm-tacle/test/duff/changeLog.txt create mode 100755 targets/wasm-tacle/test/duff/duff.c create mode 100755 targets/wasm-tacle/test/duff/generated/default/duff.wasm create mode 100644 targets/wasm-tacle/test/duff/generated/default/duff.wat create mode 100644 targets/wasm-tacle/test/duff/generated/modified_sources/default/duff.c create mode 100644 targets/wasm-tacle/test/duff/generated/modified_sources/inline/duff.c create mode 100644 targets/wasm-tacle/test/test3/CMakeLists.txt create mode 100755 targets/wasm-tacle/test/test3/ChangeLog.txt create mode 100755 targets/wasm-tacle/test/test3/generated/default/test3.wasm create mode 100644 targets/wasm-tacle/test/test3/generated/default/test3.wat create mode 100644 targets/wasm-tacle/test/test3/generated/modified_sources/default/test3.c create mode 100644 targets/wasm-tacle/test/test3/generated/modified_sources/inline/test3.c create mode 100755 targets/wasm-tacle/test/test3/test3.c diff --git a/targets/wasm-tacle/app/lift/CMakeLists.txt b/targets/wasm-tacle/app/lift/CMakeLists.txt new file mode 100644 index 0000000..8eb43f7 --- /dev/null +++ b/targets/wasm-tacle/app/lift/CMakeLists.txt @@ -0,0 +1,27 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(lift) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/lift.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/lift.c" + "generated/modified_sources/default/liftlibcontrol.c" + "generated/modified_sources/default/liftlibio.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/app/lift/README b/targets/wasm-tacle/app/lift/README new file mode 100755 index 0000000..c7ada83 --- /dev/null +++ b/targets/wasm-tacle/app/lift/README @@ -0,0 +1,31 @@ +Lift Controller +=============== + +This is a port of Martin Schoeberl's Lift Controller [1] to C. The orignal +version is an embedded Java program that controls a lift in a factory in Turkey. +Benedikt Huber has ported the controller to C and Lucid [3]. It has been used in +various research projects, including T-CREST[3] and the F-Shell test generator +[4]. + +Overview +-------- + +The sensors of the system consist of several buttons, a load sensor (to detect +if the lift is positioned at the load), sensors to detect bottom and top +position, and an index sensor for the motor. The motor is controlled using two +digital outputs, one for its direction and one to turn it off or on. + +The controller itself consists of an initialization routine ctrl_init(), the +controller step ctrl_loop(), which should be invoked every 10ms. Outside a test +environment, ctrl_get_vals() should be called to read sensors before the +controller runs, and ctrl_set_vals() should be called to set actuators after the +controller ran. + +The digital IO interface (9 digital inputs, 2 digital outputs and 14 LEDs are +used) is realized as global volatile variables (simio_in, simio_out, simio_led), +that can be modified and read by test drivers or by the runtime environment. + +[1] http://www.jopdesign.com/doc/jembench.pdf +[2] https://github.com/visq/99lifts +[3] http://www.t-crest.org +[4] http://forsyte.at/software/fshell/ diff --git a/targets/wasm-tacle/app/lift/changeLog.txt b/targets/wasm-tacle/app/lift/changeLog.txt new file mode 100755 index 0000000..babf8fb --- /dev/null +++ b/targets/wasm-tacle/app/lift/changeLog.txt @@ -0,0 +1,46 @@ +File: duff.c +Original provenience: Lift Controller, see README file + + +2015-12-21: +- replaced defines, introduced 4 enums to replace #define statements + (enum Direction, Sensor, Motor, Command) +- renamed libs to fit general naming scheme: lift_io -> liftio +- benchmark consisted of two benchmarks, test_lift and run_lift, + only run_lift remains, i.e., test_lift.data.c/h and test_lift.c removed. +- Makefile removed, file can now be compiled using 'gcc lift.c' +- 'uint16_t' replaced by 'unsigned short int' to get rid of 'stdint.h; +- changed LEVEL_POS_LENGTH from 14 to 16 (16 values were initialized). +- added an additional global variable 'int checksum' +- added function pre-fix 'lift_' to each function +- added function int lift_return() returning the checksum and lift_init() +- global variable checksum filled in function 'lift_ctrl_set_vals()' + and initialized to 0 in 'lift_init()' +- Added forward declarations of all functions before the declarations of global + variables +- in function lift_main, explicit initialization 'int i = 0' added. +- Re-ordered functions to fit template-order +- Applied code formatting according to the following rules + (incomplete, to be discussed; I basically used astyle with the attached + options file): + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: st_) followed by lowercase letter (e.g., st_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Added general TACLeBench header to beginning of source code diff --git a/targets/wasm-tacle/app/lift/generated/default/lift.wasm b/targets/wasm-tacle/app/lift/generated/default/lift.wasm new file mode 100755 index 0000000000000000000000000000000000000000..90e8aafea22fe0dfda1ba39a01e3c71e16a93874 GIT binary patch literal 7085 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 1000) + break; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + lift_init(); + lift_main(); + + return (lift_return()); +} diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.c b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.c new file mode 100644 index 0000000..ec8021a --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.c @@ -0,0 +1,267 @@ +#include "liftlibcontrol.h" +#include "liftlibio.h" + +/* Global variables */ +int lift_levelPos[16]; +int lift_one_level; + +/** + Is the counter valid for level positioning? +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int lift_cntValid; + +/** + Position absolute or relative<. +*/ +int lift_cnt; + +/** + Last stoped level (1..13) if position is absolute else 0. +*/ +int lift_level; + +/** + load position in level, 0 means we don't know +*/ +int lift_loadLevel; + +/** + we're going TOP or BOTTOM, but stop at load position. +*/ +int lift_loadPending; + +/** + we're waiting for the load sensor to go. +*/ +int lift_loadSensor; + +/** + cmd keeps the value of the command until the command is finished. + It is only updated by the switches if it's current value is CMD_NONE. +*/ +int lift_cmd; + +int lift_timMotor; + +int lift_timImp; + +/** + Remember last direction for impuls count after motor off; +*/ +int lift_directionUp; + +/** + Last value of impuls sensor. +*/ +int lift_lastImp; + +int lift_dbgCnt; + +/** + stop value for the counter. +*/ +int lift_endCnt; + +void +lift_ctrl_init() { + int i; + lift_checksum = 0; + + lift_io_init(); + lift_cntValid = 0; + lift_cnt = 0; + lift_cmd = lift_CMD_NONE; + lift_timMotor = 0; + lift_timImp = 0; + lift_directionUp = 1; + lift_lastImp = 0; + lift_loadLevel = 0; + lift_loadPending = 0; + lift_loadSensor = 0; + i = 0; + lift_levelPos[i++] = 0; + lift_levelPos[i++] = 58; + lift_levelPos[i++] = 115; + lift_levelPos[i++] = 173; + lift_levelPos[i++] = 230; + lift_levelPos[i++] = 288; + lift_levelPos[i++] = 346; + lift_levelPos[i++] = 403; + lift_levelPos[i++] = 461; + lift_levelPos[i++] = 518; + lift_levelPos[i++] = 576; + lift_levelPos[i++] = 634; + lift_levelPos[i++] = 691; + lift_levelPos[i++] = 749; + lift_levelPos[i++] = 806; + lift_levelPos[i++] = 864; + lift_one_level = lift_levelPos[1]; +} + +void +lift_ctrl_loop() { + if (lift_cmd == lift_CMD_NONE) + lift_check_cmd(); + else { + lift_do_impulse(lift_ctrl_io_in[lift_SENS_IMPULS], + lift_ctrl_io_out[lift_MOTOR_ON], + lift_ctrl_io_in[lift_SENS_BOTTOM]); + lift_do_cmd(); + } + lift_check_level(); + lift_ctrl_io_led[13] = (lift_dbgCnt & 0x80) != 0; + ++lift_dbgCnt; +} + +void +lift_check_level() { + int i; + int middle = lift_one_level >> 2; + if (lift_cntValid) { + __pragma_loopbound(14, 14); + for (lift_level = 1; lift_level < 14; ++lift_level) { + if (lift_cnt < lift_levelPos[lift_level] - middle) + break; + } + } else + lift_level = 0; + __pragma_loopbound(14, 14); + for (i = 0; i < 14; ++i) + lift_ctrl_io_led[i] = (i == lift_level - 1); +} + +void +lift_check_cmd() { + if (lift_loadPending) { + if (lift_ctrl_io_in[lift_SENS_BOTTOM]) + lift_cmd = lift_CMD_TOP; + } else if (lift_ctrl_io_in[lift_GO_UP]) { + if (!lift_ctrl_io_in[lift_SENS_TOP] && lift_level != 14) + lift_cmd = lift_CMD_UP; + } else if (lift_ctrl_io_in[lift_GO_DOWN]) { + if (!lift_ctrl_io_in[lift_SENS_BOTTOM] && lift_level != 1) + lift_cmd = lift_CMD_DOWN; + } else if (lift_ctrl_io_in[lift_GO_LOAD]) { + if (lift_loadLevel != 0 && lift_level < lift_loadLevel) + lift_cmd = lift_CMD_TOP; + else + lift_cmd = lift_CMD_BOTTOM; + lift_loadPending = 1; + lift_loadSensor = 0; + } else if (lift_ctrl_io_in[lift_GO_TOP]) { + if (!lift_ctrl_io_in[lift_SENS_TOP]) + lift_cmd = lift_CMD_TOP; + } else if (lift_ctrl_io_in[lift_GO_BOTTOM]) { + if (!lift_ctrl_io_in[lift_SENS_BOTTOM]) + lift_cmd = lift_CMD_BOTTOM; + } + if (lift_cmd != lift_CMD_NONE) + lift_timMotor = 50; +} + +void +lift_do_impulse(int val, int motor, int reset) { + if (val && !lift_lastImp) { + if (motor || lift_timImp > 0) { + if (lift_directionUp) + ++lift_cnt; + else + --lift_cnt; + } + } + if (reset) { + lift_cnt = 0; + lift_cntValid = 1; + } + lift_lastImp = val; + if (lift_timImp > 0) { + --lift_timImp; + if (lift_timImp == 0 && lift_cmd != lift_CMD_NONE) + lift_cmd = lift_CMD_NONE; + } +} + +void +lift_do_cmd() { + int run = 0; + if (lift_timMotor > 0) + lift_wait_for_motor_start(); + else { + run = lift_check_run(); + if (lift_ctrl_io_out[lift_MOTOR_ON] && !run) { + /* motor stopped: */ + lift_cmd = 99; + lift_timImp = 50; + } + lift_ctrl_io_out[lift_MOTOR_ON] = run; + } +} + +void +lift_wait_for_motor_start() { + int newLevel = 0; + --lift_timMotor; + lift_directionUp = (lift_cmd == lift_CMD_UP || lift_cmd == lift_CMD_TOP); + lift_ctrl_io_out[lift_MOTOR_UP] = lift_directionUp; + if (!lift_cntValid) { + lift_cnt = 0; /* use relative counter */ + if (lift_cmd == lift_CMD_UP) + lift_endCnt = lift_one_level; + else + lift_endCnt = -lift_one_level; + } else { + lift_endCnt = lift_cnt; + newLevel = -99; + if (lift_cmd == lift_CMD_UP) + newLevel = lift_level + 1; + else if (lift_cmd == lift_CMD_DOWN) + newLevel = lift_level - 1; + --newLevel; /* lift_level is one based */ + if (newLevel >= 0 && newLevel < 14) + lift_endCnt = lift_levelPos[newLevel]; + } +} + +int +lift_check_run() { + if (lift_cmd == lift_CMD_UP) { + if (lift_cnt < lift_endCnt - 1 && !lift_ctrl_io_in[lift_SENS_TOP]) + return 1; + } else if (lift_cmd == lift_CMD_DOWN) { + if (lift_cnt > lift_endCnt + 1 && !lift_ctrl_io_in[lift_SENS_BOTTOM]) + return 1; + } else if (lift_cmd == lift_CMD_TOP) { + if (lift_loadPending && lift_ctrl_io_in[lift_SENS_LOAD]) { + /* we are at lift_load position */ + lift_loadLevel = lift_level; + lift_loadPending = 0; + return 0; + } + if (!lift_ctrl_io_in[lift_SENS_TOP]) + return 1; + /* safe fallback if lift_load sensor does not work */ + lift_loadPending = 0; + } else if (lift_cmd == lift_CMD_BOTTOM) { + if (lift_loadPending) { + if (lift_loadSensor) { + if (!lift_ctrl_io_in[lift_SENS_LOAD]) { + lift_loadSensor = 0; + /* we are at lift_load position */ + lift_loadPending = 0; + lift_loadLevel = lift_level; + return 0; + } + } + lift_loadSensor = lift_ctrl_io_in[lift_SENS_LOAD]; + } + if (!lift_ctrl_io_in[lift_SENS_BOTTOM]) + return 1; + } + return 0; +} diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.h b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.h new file mode 100644 index 0000000..eea15ba --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibcontrol.h @@ -0,0 +1,62 @@ + +#ifndef LIFTLIBCONTROL_H +#define LIFTLIBCONTROL_H + +enum lift_Direction { + lift_GO_LOAD = 8, + lift_GO_TOP = 6, + lift_GO_BOTTOM = 7, + lift_GO_UP = 4, + lift_GO_DOWN = 5 +}; + +enum lift_Sensor { + lift_SENS_IMPULS = 0, + lift_SENS_TOP = 1, + lift_SENS_BOTTOM = 2, + lift_SENS_LOAD = 3 +}; + +enum lift_Motor { lift_MOTOR_ON = 0, lift_MOTOR_UP = 1 }; + +enum lift_Command { + lift_CMD_NONE = 0, + lift_CMD_TOP = 1, + lift_CMD_BOTTOM = 2, + lift_CMD_UP = 3, + lift_CMD_DOWN = 4 +}; + +/* Global variables */ +extern int lift_levelPos[16]; +extern int lift_one_level; +extern int lift_cntValid; +extern int lift_cnt; +extern int lift_level; +extern int lift_loadLevel; +extern int lift_loadPending; +extern int lift_loadSensor; +extern int lift_cmd; +extern int lift_timMotor; +extern int lift_timImp; +extern int lift_directionUp; +extern int lift_lastImp; +extern int lift_dbgCnt; +extern int lift_endCnt; + +/* Checksum */ +extern int lift_checksum; + +/* prototypes */ +void lift_ctrl_init(); +void lift_ctrl_loop(); + +/* internal prototypes */ +int lift_check_run(); +void lift_wait_for_motor_start(); +void lift_do_cmd(); +void lift_do_impulse(int val, int motor, int reset); +void lift_check_cmd(); +void lift_check_level(); + +#endif diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.c b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.c new file mode 100644 index 0000000..39badba --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.c @@ -0,0 +1,69 @@ +#include "liftlibio.h" + +/* Global variables */ +int lift_ctrl_io_in[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +int lift_ctrl_io_out[4] = {0, 0, 0, 0}; +int lift_ctrl_io_analog[4] = {0, 0, 0, 0}; +int lift_ctrl_io_led[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +int lift_ctrl_dly1; +int lift_ctrl_dly2; + +/* Simulated hardware */ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +volatile int lift_simio_in; +volatile int lift_simio_out; +volatile int lift_simio_led; +volatile int lift_simio_adc1; +volatile int lift_simio_adc2; +volatile int lift_simio_adc3; + +void +lift_io_init() { + lift_ctrl_dly1 = 0; + lift_ctrl_dly2 = 0; +} + +void +lift_ctrl_set_vals() { + int val = 0, i; + __pragma_loopbound(4, 4); + for (i = 4 - 1; i >= 0; --i) { + val <<= 1; + val |= lift_ctrl_io_out[i] ? 1 : 0; + } + lift_simio_out = val; + __pragma_loopbound(14, 14); + for (i = 14 - 1; i >= 0; --i) { + val <<= 1; + val |= lift_ctrl_io_led[i] ? 1 : 0; + } + lift_simio_led = val; + lift_checksum += val; +} + +void +lift_ctrl_get_vals() { + int i; + unsigned short int in0 = lift_simio_in; + unsigned short int in1 = lift_ctrl_dly1; + unsigned short int in2 = lift_ctrl_dly2; + lift_ctrl_dly2 = lift_ctrl_dly1; + lift_ctrl_dly1 = in0; + /* majority voting for input values + delays input value change by one period */ + __pragma_loopbound(10, 10); + for (i = 0; i < 10; ++i) { + lift_ctrl_io_in[i] = ((in0 & 1) + (in1 & 1) + (in2 & 1)) > 1; + in0 >>= 1; + in1 >>= 1; + in2 >>= 1; + } + lift_ctrl_io_analog[0] = lift_simio_adc1; + lift_ctrl_io_analog[1] = lift_simio_adc2; + lift_ctrl_io_analog[2] = lift_simio_adc3; +} diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.h b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.h new file mode 100644 index 0000000..e4d9d94 --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/default/liftlibio.h @@ -0,0 +1,28 @@ + +#ifndef LIFTLIBIO_H +#define LIFTLIBIO_H + +/* Global variables */ +extern int lift_ctrl_io_in[10]; +extern int lift_ctrl_io_out[4]; +extern int lift_ctrl_io_analog[4]; +extern int lift_ctrl_io_led[16]; +extern int lift_ctrl_dly1, lift_ctrl_dly2; + +/* Simulated hardware */ +extern volatile int lift_simio_in; +extern volatile int lift_simio_out; +extern volatile int lift_simio_led; +extern volatile int lift_simio_adc1; +extern volatile int lift_simio_adc2; +extern volatile int lift_simio_adc3; + +/* Checksum */ +extern int lift_checksum; + +/* prototypes */ +void lift_io_init(void); +void lift_ctrl_get_vals(void); +void lift_ctrl_set_vals(void); + +#endif diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/inline/lift.c b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/lift.c new file mode 100644 index 0000000..c598a71 --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/lift.c @@ -0,0 +1,138 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: lift + + Author: Martin Schoeberl, Benedikt Huber + + Function: Lift Controler + + Source: C-Port from http://www.jopdesign.com/doc/jembench.pdf + + Original name: run_lift.c + + Changes: no major functional changes + + License: GPL version 3 or later + +*/ + +/* + Include section +*/ + +#include "liftlibcontrol.h" +#include "liftlibio.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "liftlibcontrol.c" +#include "liftlibio.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void lift_controller(); +__attribute__((always_inline)) static inline void lift_init(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +lift_main(); +__attribute__((always_inline)) static inline int lift_return(); + +/* + Declaration of global variables +*/ + +int lift_checksum; /* Checksum */ + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +lift_init() { + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &lift_ctrl_io_in[0]; + __pragma_loopbound(40, 40); + for (i = 0; i < sizeof(lift_ctrl_io_in); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &lift_ctrl_io_out[0]; + __pragma_loopbound(16, 16); + for (i = 0; i < sizeof(lift_ctrl_io_out); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &lift_ctrl_io_analog[0]; + __pragma_loopbound(16, 16); + for (i = 0; i < sizeof(lift_ctrl_io_analog); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &lift_ctrl_io_led[0]; + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(lift_ctrl_io_led); ++i, ++p) + *p ^= bitmask; + + lift_checksum = 0; + lift_ctrl_init(); +} + +__attribute__((always_inline)) static inline int +lift_return() { + return (lift_checksum - 4005888 != 0); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +lift_controller() { + lift_ctrl_get_vals(); + lift_ctrl_loop(); + lift_ctrl_set_vals(); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +lift_main() { + int i = 0; + __pragma_loopbound(1001, 1001); + while (1) { + /* zero input stimulus */ + lift_simio_in = 0; + lift_simio_adc1 = 0; + lift_simio_adc2 = 0; + lift_simio_adc3 = 0; + /* run lift_controller */ + lift_controller(); + if (i++ >= 1000) + break; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + lift_init(); + lift_main(); + + return (lift_return()); +} diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.c b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.c new file mode 100644 index 0000000..2b9babc --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.c @@ -0,0 +1,267 @@ +#include "liftlibcontrol.h" +#include "liftlibio.h" + +/* Global variables */ +int lift_levelPos[16]; +int lift_one_level; + +/** + Is the counter valid for level positioning? +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int lift_cntValid; + +/** + Position absolute or relative<. +*/ +int lift_cnt; + +/** + Last stoped level (1..13) if position is absolute else 0. +*/ +int lift_level; + +/** + load position in level, 0 means we don't know +*/ +int lift_loadLevel; + +/** + we're going TOP or BOTTOM, but stop at load position. +*/ +int lift_loadPending; + +/** + we're waiting for the load sensor to go. +*/ +int lift_loadSensor; + +/** + cmd keeps the value of the command until the command is finished. + It is only updated by the switches if it's current value is CMD_NONE. +*/ +int lift_cmd; + +int lift_timMotor; + +int lift_timImp; + +/** + Remember last direction for impuls count after motor off; +*/ +int lift_directionUp; + +/** + Last value of impuls sensor. +*/ +int lift_lastImp; + +int lift_dbgCnt; + +/** + stop value for the counter. +*/ +int lift_endCnt; + +__attribute__((always_inline)) static inline void +lift_ctrl_init() { + int i; + lift_checksum = 0; + + lift_io_init(); + lift_cntValid = 0; + lift_cnt = 0; + lift_cmd = lift_CMD_NONE; + lift_timMotor = 0; + lift_timImp = 0; + lift_directionUp = 1; + lift_lastImp = 0; + lift_loadLevel = 0; + lift_loadPending = 0; + lift_loadSensor = 0; + i = 0; + lift_levelPos[i++] = 0; + lift_levelPos[i++] = 58; + lift_levelPos[i++] = 115; + lift_levelPos[i++] = 173; + lift_levelPos[i++] = 230; + lift_levelPos[i++] = 288; + lift_levelPos[i++] = 346; + lift_levelPos[i++] = 403; + lift_levelPos[i++] = 461; + lift_levelPos[i++] = 518; + lift_levelPos[i++] = 576; + lift_levelPos[i++] = 634; + lift_levelPos[i++] = 691; + lift_levelPos[i++] = 749; + lift_levelPos[i++] = 806; + lift_levelPos[i++] = 864; + lift_one_level = lift_levelPos[1]; +} + +__attribute__((always_inline)) static inline void +lift_ctrl_loop() { + if (lift_cmd == lift_CMD_NONE) + lift_check_cmd(); + else { + lift_do_impulse(lift_ctrl_io_in[lift_SENS_IMPULS], + lift_ctrl_io_out[lift_MOTOR_ON], + lift_ctrl_io_in[lift_SENS_BOTTOM]); + lift_do_cmd(); + } + lift_check_level(); + lift_ctrl_io_led[13] = (lift_dbgCnt & 0x80) != 0; + ++lift_dbgCnt; +} + +__attribute__((always_inline)) static inline void +lift_check_level() { + int i; + int middle = lift_one_level >> 2; + if (lift_cntValid) { + __pragma_loopbound(14, 14); + for (lift_level = 1; lift_level < 14; ++lift_level) { + if (lift_cnt < lift_levelPos[lift_level] - middle) + break; + } + } else + lift_level = 0; + __pragma_loopbound(14, 14); + for (i = 0; i < 14; ++i) + lift_ctrl_io_led[i] = (i == lift_level - 1); +} + +__attribute__((always_inline)) static inline void +lift_check_cmd() { + if (lift_loadPending) { + if (lift_ctrl_io_in[lift_SENS_BOTTOM]) + lift_cmd = lift_CMD_TOP; + } else if (lift_ctrl_io_in[lift_GO_UP]) { + if (!lift_ctrl_io_in[lift_SENS_TOP] && lift_level != 14) + lift_cmd = lift_CMD_UP; + } else if (lift_ctrl_io_in[lift_GO_DOWN]) { + if (!lift_ctrl_io_in[lift_SENS_BOTTOM] && lift_level != 1) + lift_cmd = lift_CMD_DOWN; + } else if (lift_ctrl_io_in[lift_GO_LOAD]) { + if (lift_loadLevel != 0 && lift_level < lift_loadLevel) + lift_cmd = lift_CMD_TOP; + else + lift_cmd = lift_CMD_BOTTOM; + lift_loadPending = 1; + lift_loadSensor = 0; + } else if (lift_ctrl_io_in[lift_GO_TOP]) { + if (!lift_ctrl_io_in[lift_SENS_TOP]) + lift_cmd = lift_CMD_TOP; + } else if (lift_ctrl_io_in[lift_GO_BOTTOM]) { + if (!lift_ctrl_io_in[lift_SENS_BOTTOM]) + lift_cmd = lift_CMD_BOTTOM; + } + if (lift_cmd != lift_CMD_NONE) + lift_timMotor = 50; +} + +__attribute__((always_inline)) static inline void +lift_do_impulse(int val, int motor, int reset) { + if (val && !lift_lastImp) { + if (motor || lift_timImp > 0) { + if (lift_directionUp) + ++lift_cnt; + else + --lift_cnt; + } + } + if (reset) { + lift_cnt = 0; + lift_cntValid = 1; + } + lift_lastImp = val; + if (lift_timImp > 0) { + --lift_timImp; + if (lift_timImp == 0 && lift_cmd != lift_CMD_NONE) + lift_cmd = lift_CMD_NONE; + } +} + +__attribute__((always_inline)) static inline void +lift_do_cmd() { + int run = 0; + if (lift_timMotor > 0) + lift_wait_for_motor_start(); + else { + run = lift_check_run(); + if (lift_ctrl_io_out[lift_MOTOR_ON] && !run) { + /* motor stopped: */ + lift_cmd = 99; + lift_timImp = 50; + } + lift_ctrl_io_out[lift_MOTOR_ON] = run; + } +} + +__attribute__((always_inline)) static inline void +lift_wait_for_motor_start() { + int newLevel = 0; + --lift_timMotor; + lift_directionUp = (lift_cmd == lift_CMD_UP || lift_cmd == lift_CMD_TOP); + lift_ctrl_io_out[lift_MOTOR_UP] = lift_directionUp; + if (!lift_cntValid) { + lift_cnt = 0; /* use relative counter */ + if (lift_cmd == lift_CMD_UP) + lift_endCnt = lift_one_level; + else + lift_endCnt = -lift_one_level; + } else { + lift_endCnt = lift_cnt; + newLevel = -99; + if (lift_cmd == lift_CMD_UP) + newLevel = lift_level + 1; + else if (lift_cmd == lift_CMD_DOWN) + newLevel = lift_level - 1; + --newLevel; /* lift_level is one based */ + if (newLevel >= 0 && newLevel < 14) + lift_endCnt = lift_levelPos[newLevel]; + } +} + +__attribute__((always_inline)) static inline int +lift_check_run() { + if (lift_cmd == lift_CMD_UP) { + if (lift_cnt < lift_endCnt - 1 && !lift_ctrl_io_in[lift_SENS_TOP]) + return 1; + } else if (lift_cmd == lift_CMD_DOWN) { + if (lift_cnt > lift_endCnt + 1 && !lift_ctrl_io_in[lift_SENS_BOTTOM]) + return 1; + } else if (lift_cmd == lift_CMD_TOP) { + if (lift_loadPending && lift_ctrl_io_in[lift_SENS_LOAD]) { + /* we are at lift_load position */ + lift_loadLevel = lift_level; + lift_loadPending = 0; + return 0; + } + if (!lift_ctrl_io_in[lift_SENS_TOP]) + return 1; + /* safe fallback if lift_load sensor does not work */ + lift_loadPending = 0; + } else if (lift_cmd == lift_CMD_BOTTOM) { + if (lift_loadPending) { + if (lift_loadSensor) { + if (!lift_ctrl_io_in[lift_SENS_LOAD]) { + lift_loadSensor = 0; + /* we are at lift_load position */ + lift_loadPending = 0; + lift_loadLevel = lift_level; + return 0; + } + } + lift_loadSensor = lift_ctrl_io_in[lift_SENS_LOAD]; + } + if (!lift_ctrl_io_in[lift_SENS_BOTTOM]) + return 1; + } + return 0; +} diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.h b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.h new file mode 100644 index 0000000..7b44239 --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibcontrol.h @@ -0,0 +1,63 @@ + +#ifndef LIFTLIBCONTROL_H +#define LIFTLIBCONTROL_H + +enum lift_Direction { + lift_GO_LOAD = 8, + lift_GO_TOP = 6, + lift_GO_BOTTOM = 7, + lift_GO_UP = 4, + lift_GO_DOWN = 5 +}; + +enum lift_Sensor { + lift_SENS_IMPULS = 0, + lift_SENS_TOP = 1, + lift_SENS_BOTTOM = 2, + lift_SENS_LOAD = 3 +}; + +enum lift_Motor { lift_MOTOR_ON = 0, lift_MOTOR_UP = 1 }; + +enum lift_Command { + lift_CMD_NONE = 0, + lift_CMD_TOP = 1, + lift_CMD_BOTTOM = 2, + lift_CMD_UP = 3, + lift_CMD_DOWN = 4 +}; + +/* Global variables */ +extern int lift_levelPos[16]; +extern int lift_one_level; +extern int lift_cntValid; +extern int lift_cnt; +extern int lift_level; +extern int lift_loadLevel; +extern int lift_loadPending; +extern int lift_loadSensor; +extern int lift_cmd; +extern int lift_timMotor; +extern int lift_timImp; +extern int lift_directionUp; +extern int lift_lastImp; +extern int lift_dbgCnt; +extern int lift_endCnt; + +/* Checksum */ +extern int lift_checksum; + +/* prototypes */ +__attribute__((always_inline)) static inline void lift_ctrl_init(); +__attribute__((always_inline)) static inline void lift_ctrl_loop(); + +/* internal prototypes */ +__attribute__((always_inline)) static inline int lift_check_run(); +__attribute__((always_inline)) static inline void lift_wait_for_motor_start(); +__attribute__((always_inline)) static inline void lift_do_cmd(); +__attribute__((always_inline)) static inline void +lift_do_impulse(int val, int motor, int reset); +__attribute__((always_inline)) static inline void lift_check_cmd(); +__attribute__((always_inline)) static inline void lift_check_level(); + +#endif diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.c b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.c new file mode 100644 index 0000000..8c7993f --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.c @@ -0,0 +1,69 @@ +#include "liftlibio.h" + +/* Global variables */ +int lift_ctrl_io_in[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +int lift_ctrl_io_out[4] = {0, 0, 0, 0}; +int lift_ctrl_io_analog[4] = {0, 0, 0, 0}; +int lift_ctrl_io_led[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +int lift_ctrl_dly1; +int lift_ctrl_dly2; + +/* Simulated hardware */ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +volatile int lift_simio_in; +volatile int lift_simio_out; +volatile int lift_simio_led; +volatile int lift_simio_adc1; +volatile int lift_simio_adc2; +volatile int lift_simio_adc3; + +__attribute__((always_inline)) static inline void +lift_io_init() { + lift_ctrl_dly1 = 0; + lift_ctrl_dly2 = 0; +} + +__attribute__((always_inline)) static inline void +lift_ctrl_set_vals() { + int val = 0, i; + __pragma_loopbound(4, 4); + for (i = 4 - 1; i >= 0; --i) { + val <<= 1; + val |= lift_ctrl_io_out[i] ? 1 : 0; + } + lift_simio_out = val; + __pragma_loopbound(14, 14); + for (i = 14 - 1; i >= 0; --i) { + val <<= 1; + val |= lift_ctrl_io_led[i] ? 1 : 0; + } + lift_simio_led = val; + lift_checksum += val; +} + +__attribute__((always_inline)) static inline void +lift_ctrl_get_vals() { + int i; + unsigned short int in0 = lift_simio_in; + unsigned short int in1 = lift_ctrl_dly1; + unsigned short int in2 = lift_ctrl_dly2; + lift_ctrl_dly2 = lift_ctrl_dly1; + lift_ctrl_dly1 = in0; + /* majority voting for input values + delays input value change by one period */ + __pragma_loopbound(10, 10); + for (i = 0; i < 10; ++i) { + lift_ctrl_io_in[i] = ((in0 & 1) + (in1 & 1) + (in2 & 1)) > 1; + in0 >>= 1; + in1 >>= 1; + in2 >>= 1; + } + lift_ctrl_io_analog[0] = lift_simio_adc1; + lift_ctrl_io_analog[1] = lift_simio_adc2; + lift_ctrl_io_analog[2] = lift_simio_adc3; +} diff --git a/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.h b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.h new file mode 100644 index 0000000..70bcb0a --- /dev/null +++ b/targets/wasm-tacle/app/lift/generated/modified_sources/inline/liftlibio.h @@ -0,0 +1,28 @@ + +#ifndef LIFTLIBIO_H +#define LIFTLIBIO_H + +/* Global variables */ +extern int lift_ctrl_io_in[10]; +extern int lift_ctrl_io_out[4]; +extern int lift_ctrl_io_analog[4]; +extern int lift_ctrl_io_led[16]; +extern int lift_ctrl_dly1, lift_ctrl_dly2; + +/* Simulated hardware */ +extern volatile int lift_simio_in; +extern volatile int lift_simio_out; +extern volatile int lift_simio_led; +extern volatile int lift_simio_adc1; +extern volatile int lift_simio_adc2; +extern volatile int lift_simio_adc3; + +/* Checksum */ +extern int lift_checksum; + +/* prototypes */ +__attribute__((always_inline)) static inline void lift_io_init(void); +__attribute__((always_inline)) static inline void lift_ctrl_get_vals(void); +__attribute__((always_inline)) static inline void lift_ctrl_set_vals(void); + +#endif diff --git a/targets/wasm-tacle/app/lift/lift.c b/targets/wasm-tacle/app/lift/lift.c new file mode 100755 index 0000000..8c7795f --- /dev/null +++ b/targets/wasm-tacle/app/lift/lift.c @@ -0,0 +1,132 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: lift + + Author: Martin Schoeberl, Benedikt Huber + + Function: Lift Controler + + Source: C-Port from http://www.jopdesign.com/doc/jembench.pdf + + Original name: run_lift.c + + Changes: no major functional changes + + License: GPL version 3 or later + +*/ + + +/* + Include section +*/ + +#include "liftlibio.h" +#include "liftlibcontrol.h" + + +/* + Forward declaration of functions +*/ + +void lift_controller(); +void lift_init(); +void lift_main(); +int lift_return(); + + +/* + Declaration of global variables +*/ + +int lift_checksum;/* Checksum */ + + +/* + Initialization- and return-value-related functions +*/ + +void lift_init() +{ + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &lift_ctrl_io_in[ 0 ]; + _Pragma( "loopbound min 40 max 40" ) + for ( i = 0; i < sizeof( lift_ctrl_io_in ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &lift_ctrl_io_out[ 0 ]; + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < sizeof( lift_ctrl_io_out ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &lift_ctrl_io_analog[ 0 ]; + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < sizeof( lift_ctrl_io_analog ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &lift_ctrl_io_led[ 0 ]; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < sizeof( lift_ctrl_io_led ); ++i, ++p ) + *p ^= bitmask; + + lift_checksum = 0; + lift_ctrl_init(); +} + + +int lift_return() +{ + return ( lift_checksum - 4005888 != 0 ); +} + + +/* + Algorithm core functions +*/ + +void lift_controller() +{ + lift_ctrl_get_vals(); + lift_ctrl_loop(); + lift_ctrl_set_vals(); +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) lift_main() +{ + int i = 0; + _Pragma( "loopbound min 1001 max 1001" ) + while ( 1 ) { + /* zero input stimulus */ + lift_simio_in = 0; + lift_simio_adc1 = 0; + lift_simio_adc2 = 0; + lift_simio_adc3 = 0; + /* run lift_controller */ + lift_controller(); + if ( i++ >= 1000 ) + break; + } +} + + +int main( void ) +{ + lift_init(); + lift_main(); + + return ( lift_return() ); +} diff --git a/targets/wasm-tacle/app/lift/liftlibcontrol.c b/targets/wasm-tacle/app/lift/liftlibcontrol.c new file mode 100755 index 0000000..f64cf2a --- /dev/null +++ b/targets/wasm-tacle/app/lift/liftlibcontrol.c @@ -0,0 +1,277 @@ +#include "liftlibio.h" +#include "liftlibcontrol.h" + +/* Global variables */ +int lift_levelPos[ 16 ]; +int lift_one_level; + +/** + Is the counter valid for level positioning? +*/ +int lift_cntValid; + +/** + Position absolute or relative<. +*/ +int lift_cnt; + +/** + Last stoped level (1..13) if position is absolute else 0. +*/ +int lift_level; + +/** + load position in level, 0 means we don't know +*/ +int lift_loadLevel; + +/** + we're going TOP or BOTTOM, but stop at load position. +*/ +int lift_loadPending; + +/** + we're waiting for the load sensor to go. +*/ +int lift_loadSensor; + +/** + cmd keeps the value of the command until the command is finished. + It is only updated by the switches if it's current value is CMD_NONE. +*/ +int lift_cmd; + +int lift_timMotor; + +int lift_timImp; + +/** + Remember last direction for impuls count after motor off; +*/ +int lift_directionUp; + +/** + Last value of impuls sensor. +*/ +int lift_lastImp; + +int lift_dbgCnt; + +/** + stop value for the counter. +*/ +int lift_endCnt; + + +void lift_ctrl_init() +{ + int i; + lift_checksum = 0; + + lift_io_init(); + lift_cntValid = 0; + lift_cnt = 0; + lift_cmd = lift_CMD_NONE; + lift_timMotor = 0; + lift_timImp = 0; + lift_directionUp = 1; + lift_lastImp = 0; + lift_loadLevel = 0; + lift_loadPending = 0; + lift_loadSensor = 0; + i = 0; + lift_levelPos[ i++ ] = 0; + lift_levelPos[ i++ ] = 58; + lift_levelPos[ i++ ] = 115; + lift_levelPos[ i++ ] = 173; + lift_levelPos[ i++ ] = 230; + lift_levelPos[ i++ ] = 288; + lift_levelPos[ i++ ] = 346; + lift_levelPos[ i++ ] = 403; + lift_levelPos[ i++ ] = 461; + lift_levelPos[ i++ ] = 518; + lift_levelPos[ i++ ] = 576; + lift_levelPos[ i++ ] = 634; + lift_levelPos[ i++ ] = 691; + lift_levelPos[ i++ ] = 749; + lift_levelPos[ i++ ] = 806; + lift_levelPos[ i++ ] = 864; + lift_one_level = lift_levelPos[ 1 ]; +} + +void lift_ctrl_loop() +{ + if ( lift_cmd == lift_CMD_NONE ) + lift_check_cmd(); + else { + lift_do_impulse( lift_ctrl_io_in[ lift_SENS_IMPULS ], + lift_ctrl_io_out[ lift_MOTOR_ON ], + lift_ctrl_io_in[ lift_SENS_BOTTOM ] ); + lift_do_cmd(); + } + lift_check_level(); + lift_ctrl_io_led[ 13 ] = ( lift_dbgCnt & 0x80 ) != 0; + ++lift_dbgCnt; +} + + +void lift_check_level() +{ + int i; + int middle = lift_one_level >> 2; + if ( lift_cntValid ) { + _Pragma( "loopbound min 14 max 14" ) + for ( lift_level = 1; lift_level < 14; ++lift_level ) { + if ( lift_cnt < lift_levelPos[ lift_level ] - middle ) + break; + } + } else + lift_level = 0; + _Pragma( "loopbound min 14 max 14" ) + for ( i = 0; i < 14; ++i ) + lift_ctrl_io_led[ i ] = ( i == lift_level - 1 ); +} + + +void lift_check_cmd() +{ + if ( lift_loadPending ) { + if ( lift_ctrl_io_in[ lift_SENS_BOTTOM ] ) + lift_cmd = lift_CMD_TOP; + } else + if ( lift_ctrl_io_in[ lift_GO_UP ] ) { + if ( !lift_ctrl_io_in[ lift_SENS_TOP ] && lift_level != 14 ) + lift_cmd = lift_CMD_UP; + } else + if ( lift_ctrl_io_in[ lift_GO_DOWN ] ) { + if ( !lift_ctrl_io_in[ lift_SENS_BOTTOM ] && lift_level != 1 ) + lift_cmd = lift_CMD_DOWN; + } else + if ( lift_ctrl_io_in[ lift_GO_LOAD ] ) { + if ( lift_loadLevel != 0 && lift_level < lift_loadLevel ) + lift_cmd = lift_CMD_TOP; + else + lift_cmd = lift_CMD_BOTTOM; + lift_loadPending = 1; + lift_loadSensor = 0; + } else + if ( lift_ctrl_io_in[ lift_GO_TOP ] ) { + if ( !lift_ctrl_io_in[ lift_SENS_TOP ] ) + lift_cmd = lift_CMD_TOP; + } else + if ( lift_ctrl_io_in[ lift_GO_BOTTOM ] ) { + if ( !lift_ctrl_io_in[ lift_SENS_BOTTOM ] ) + lift_cmd = lift_CMD_BOTTOM; + } + if ( lift_cmd != lift_CMD_NONE ) + lift_timMotor = 50; +} + + +void lift_do_impulse( int val, int motor, int reset ) +{ + if ( val && !lift_lastImp ) { + if ( motor || lift_timImp > 0 ) { + if ( lift_directionUp ) + ++lift_cnt; + else + --lift_cnt; + } + } + if ( reset ) { + lift_cnt = 0; + lift_cntValid = 1; + } + lift_lastImp = val; + if ( lift_timImp > 0 ) { + --lift_timImp; + if ( lift_timImp == 0 && lift_cmd != lift_CMD_NONE ) + lift_cmd = lift_CMD_NONE; + } +} + + +void lift_do_cmd() +{ + int run = 0; + if ( lift_timMotor > 0 ) + lift_wait_for_motor_start(); + else { + run = lift_check_run(); + if ( lift_ctrl_io_out[ lift_MOTOR_ON ] && !run ) { + /* motor stopped: */ + lift_cmd = 99; + lift_timImp = 50; + } + lift_ctrl_io_out[ lift_MOTOR_ON ] = run; + } +} + + +void lift_wait_for_motor_start() +{ + int newLevel = 0; + --lift_timMotor; + lift_directionUp = ( lift_cmd == lift_CMD_UP || lift_cmd == lift_CMD_TOP ); + lift_ctrl_io_out[ lift_MOTOR_UP ] = lift_directionUp; + if ( !lift_cntValid ) { + lift_cnt = 0; /* use relative counter */ + if ( lift_cmd == lift_CMD_UP ) + lift_endCnt = lift_one_level; + else + lift_endCnt = -lift_one_level; + } else { + lift_endCnt = lift_cnt; + newLevel = -99; + if ( lift_cmd == lift_CMD_UP ) + newLevel = lift_level + 1; + else + if ( lift_cmd == lift_CMD_DOWN ) + newLevel = lift_level - 1; + --newLevel; /* lift_level is one based */ + if ( newLevel >= 0 && newLevel < 14 ) + lift_endCnt = lift_levelPos[ newLevel ]; + } +} + + +int lift_check_run() +{ + if ( lift_cmd == lift_CMD_UP ) { + if ( lift_cnt < lift_endCnt - 1 && !lift_ctrl_io_in[ lift_SENS_TOP ] ) + return 1; + } else + if ( lift_cmd == lift_CMD_DOWN ) { + if ( lift_cnt > lift_endCnt + 1 && !lift_ctrl_io_in[ lift_SENS_BOTTOM ] ) + return 1; + } else + if ( lift_cmd == lift_CMD_TOP ) { + if ( lift_loadPending && lift_ctrl_io_in[ lift_SENS_LOAD ] ) { + /* we are at lift_load position */ + lift_loadLevel = lift_level; + lift_loadPending = 0; + return 0; + } + if ( !lift_ctrl_io_in[ lift_SENS_TOP ] ) + return 1; + /* safe fallback if lift_load sensor does not work */ + lift_loadPending = 0; + } else + if ( lift_cmd == lift_CMD_BOTTOM ) { + if ( lift_loadPending ) { + if ( lift_loadSensor ) { + if ( !lift_ctrl_io_in[ lift_SENS_LOAD ] ) { + lift_loadSensor = 0; + /* we are at lift_load position */ + lift_loadPending = 0; + lift_loadLevel = lift_level; + return 0; + } + } + lift_loadSensor = lift_ctrl_io_in[ lift_SENS_LOAD ]; + } + if ( !lift_ctrl_io_in[ lift_SENS_BOTTOM ] ) + return 1; + } + return 0; +} diff --git a/targets/wasm-tacle/app/lift/liftlibcontrol.h b/targets/wasm-tacle/app/lift/liftlibcontrol.h new file mode 100755 index 0000000..e1955dd --- /dev/null +++ b/targets/wasm-tacle/app/lift/liftlibcontrol.h @@ -0,0 +1,64 @@ +#ifndef LIFTLIBCONTROL_H +#define LIFTLIBCONTROL_H + +enum lift_Direction { + lift_GO_LOAD = 8, + lift_GO_TOP = 6, + lift_GO_BOTTOM = 7, + lift_GO_UP = 4, + lift_GO_DOWN = 5 +}; + +enum lift_Sensor { + lift_SENS_IMPULS = 0, + lift_SENS_TOP = 1, + lift_SENS_BOTTOM = 2, + lift_SENS_LOAD = 3 +}; + +enum lift_Motor { + lift_MOTOR_ON = 0, + lift_MOTOR_UP = 1 +}; + +enum lift_Command { + lift_CMD_NONE = 0, + lift_CMD_TOP = 1, + lift_CMD_BOTTOM = 2, + lift_CMD_UP = 3, + lift_CMD_DOWN = 4 +}; + +/* Global variables */ +extern int lift_levelPos[ 16 ]; +extern int lift_one_level; +extern int lift_cntValid; +extern int lift_cnt; +extern int lift_level; +extern int lift_loadLevel; +extern int lift_loadPending; +extern int lift_loadSensor; +extern int lift_cmd; +extern int lift_timMotor; +extern int lift_timImp; +extern int lift_directionUp; +extern int lift_lastImp; +extern int lift_dbgCnt; +extern int lift_endCnt; + +/* Checksum */ +extern int lift_checksum; + +/* prototypes */ +void lift_ctrl_init(); +void lift_ctrl_loop(); + +/* internal prototypes */ +int lift_check_run(); +void lift_wait_for_motor_start(); +void lift_do_cmd(); +void lift_do_impulse( int val, int motor, int reset ); +void lift_check_cmd(); +void lift_check_level(); + +#endif diff --git a/targets/wasm-tacle/app/lift/liftlibio.c b/targets/wasm-tacle/app/lift/liftlibio.c new file mode 100755 index 0000000..37d1bf3 --- /dev/null +++ b/targets/wasm-tacle/app/lift/liftlibio.c @@ -0,0 +1,65 @@ +#include "liftlibio.h" + +/* Global variables */ +int lift_ctrl_io_in[ 10 ] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +int lift_ctrl_io_out[ 4 ] = {0, 0, 0, 0}; +int lift_ctrl_io_analog[ 4 ] = {0, 0, 0, 0}; +int lift_ctrl_io_led[ 16 ] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +int lift_ctrl_dly1; +int lift_ctrl_dly2; + +/* Simulated hardware */ +volatile int lift_simio_in; +volatile int lift_simio_out; +volatile int lift_simio_led; +volatile int lift_simio_adc1; +volatile int lift_simio_adc2; +volatile int lift_simio_adc3; + +void lift_io_init() +{ + lift_ctrl_dly1 = 0; + lift_ctrl_dly2 = 0; +} + + +void lift_ctrl_set_vals() +{ + int val = 0, i; + _Pragma( "loopbound min 4 max 4" ) + for ( i = 4 - 1; i >= 0; --i ) { + val <<= 1; + val |= lift_ctrl_io_out[ i ] ? 1 : 0; + } + lift_simio_out = val; + _Pragma( "loopbound min 14 max 14" ) + for ( i = 14 - 1; i >= 0; --i ) { + val <<= 1; + val |= lift_ctrl_io_led[ i ] ? 1 : 0; + } + lift_simio_led = val; + lift_checksum += val; +} + + +void lift_ctrl_get_vals() +{ + int i; + unsigned short int in0 = lift_simio_in; + unsigned short int in1 = lift_ctrl_dly1; + unsigned short int in2 = lift_ctrl_dly2; + lift_ctrl_dly2 = lift_ctrl_dly1; + lift_ctrl_dly1 = in0; + /* majority voting for input values + delays input value change by one period */ + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < 10; ++i ) { + lift_ctrl_io_in[ i ] = ( ( in0 & 1 ) + ( in1 & 1 ) + ( in2 & 1 ) ) > 1; + in0 >>= 1; + in1 >>= 1; + in2 >>= 1; + } + lift_ctrl_io_analog[ 0 ] = lift_simio_adc1; + lift_ctrl_io_analog[ 1 ] = lift_simio_adc2; + lift_ctrl_io_analog[ 2 ] = lift_simio_adc3; +} diff --git a/targets/wasm-tacle/app/lift/liftlibio.h b/targets/wasm-tacle/app/lift/liftlibio.h new file mode 100755 index 0000000..a83b8eb --- /dev/null +++ b/targets/wasm-tacle/app/lift/liftlibio.h @@ -0,0 +1,27 @@ +#ifndef LIFTLIBIO_H +#define LIFTLIBIO_H + +/* Global variables */ +extern int lift_ctrl_io_in[ 10 ]; +extern int lift_ctrl_io_out[ 4 ]; +extern int lift_ctrl_io_analog[ 4 ]; +extern int lift_ctrl_io_led[ 16 ]; +extern int lift_ctrl_dly1, lift_ctrl_dly2; + +/* Simulated hardware */ +extern volatile int lift_simio_in; +extern volatile int lift_simio_out; +extern volatile int lift_simio_led; +extern volatile int lift_simio_adc1; +extern volatile int lift_simio_adc2; +extern volatile int lift_simio_adc3; + +/* Checksum */ +extern int lift_checksum; + +/* prototypes */ +void lift_io_init( void ); +void lift_ctrl_get_vals( void ); +void lift_ctrl_set_vals( void ); + +#endif diff --git a/targets/wasm-tacle/app/powerwindow/CMakeLists.txt b/targets/wasm-tacle/app/powerwindow/CMakeLists.txt new file mode 100644 index 0000000..a3d4537 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/CMakeLists.txt @@ -0,0 +1,35 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(powerwindow) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/powerwindow.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/powerwindow.c" + "generated/modified_sources/default/powerwindow_PW_Control_DRV.c" + "generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.c" + "generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.c" + "generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.c" + "generated/modified_sources/default/powerwindow_const_params.c" + "generated/modified_sources/default/powerwindow_controlexclusion.c" + "generated/modified_sources/default/powerwindow_debounce.c" + "generated/modified_sources/default/powerwindow_inputs.c" + "generated/modified_sources/default/powerwindow_powerwindow_control.c" + "generated/modified_sources/default/wcclib.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/app/powerwindow/changeLog b/targets/wasm-tacle/app/powerwindow/changeLog new file mode 100644 index 0000000..e8989dd --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/changeLog @@ -0,0 +1,42 @@ +Adjusted the original files to tacle benchmark requirements + +Created the input serials in void powerwindow_input_initialize(void) to cover the real life scenarios + +23-03-2016: +Deleted folder powerwindow_SourceFiles moved all the contained c files to PowerWindow folder + +Created headerfile powerwindow.h + +Added + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +to header file powerwindow.h + +Deleted #include in all files replaced with headerfile powerwindow.h + +Deleted function powerwindow_GetErrorStatus(void) and the related code + +Commented + long tic, toc, tictoc; + tic = powerwindow_get_cycles(); + toc = powerwindow_get_cycles(); + tictoc = toc-tic; + printf("%ld\n",tictoc ); + +in the int main(void). Uncomment can print the execution time of the powerwindow benchmark. + +Adjusted the description of all the files + +21-04-2016 + +Adjusted the author and license + +18-04-2017: +Annotated powerwindow_main as entry-point for timing analysis + +10-07-2017 +- Fix changelog order so dates are correctly sorted. +- Fix input array length to avoid possible buffer overflow. diff --git a/targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wasm b/targets/wasm-tacle/app/powerwindow/generated/default/powerwindow.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b05126cd94a32d64a885491418015e429b13a7df GIT binary patch literal 30816 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 wOLmMFd$;r#R^HV=xTUv$/Down'. Here applied a push-down button, the signal + is high when the button is not pressed. Change to 0 to lower + the window. */ + + powerwindow_PW_Control_PSG_Front_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_Front_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_Front + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ +} + +void +powerwindow_init_PSG_BackL(int i) { + + powerwindow_PW_Control_PSG_BackL_U.Up_DRV = + powerwindow_PW_Control_DRV_Y + .Out10; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_BackL_U.Down_DRV = + powerwindow_PW_Control_DRV_Y + .Out11; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lower the window. + */ + + powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL = + powerwindow_debounce_passenger_BackL_U_Up_Input_BackL[i]; + powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL = + powerwindow_debounce_passenger_BackL_U_Down_Input_BackL + [i]; /* '/Down'. Here applied a push-down button, the signal + is high when the button is not pressed. Change to 0 to lower + the window. */ + + powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_BackL_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_BackL + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ +} + +void +powerwindow_init_PSG_BackR(int i) { + + powerwindow_PW_Control_PSG_BackR_U.Up_DRV = + powerwindow_PW_Control_DRV_Y + .Out8; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_BackR_U.Down_DRV = + powerwindow_PW_Control_DRV_Y + .Out9; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR = + powerwindow_debounce_passenger_BackR_U_Up_Input_BackR[i]; + powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR = + powerwindow_debounce_passenger_BackR_U_Down_Input_BackR + [i]; /* '/Down'. Here applied a push-down button, the signal + is high when the button is not pressed. Change to 0 to lower + the window. */ + + powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_BackR_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_BackR + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ +} + +void +powerwindow_input_initialize_DRV(void) { + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV, + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV, + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_Front_U_Up_Input_Front, + powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_Front_U_Down_Input_Front, + powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL, + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL, + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL, + powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR, + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV, + powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array); + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_DRV_Array, + powerwindow_powerwindow_control_U_currentsense_DRV_Array); +} + +void +powerwindow_input_initialize_PSG_Front(void) { + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_Front_U_Up_Input_Front, + powerwindow_debounce_passenger_Front_U_Up_Front_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_Front_U_Down_Input_Front, + powerwindow_debounce_passenger_Front_U_Down_Front_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front, + powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_Front, + powerwindow_powerwindow_control_U_currentsense_Front_Array); +} + +void +powerwindow_input_initialize_PSG_BackL(void) { + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackL_U_Up_Input_BackL, + powerwindow_debounce_passenger_BackL_U_Up_BackL_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackL_U_Down_Input_BackL, + powerwindow_debounce_passenger_BackL_U_Down_BackL_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL, + powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_BackL, + powerwindow_powerwindow_control_U_currentsense_BackL_Array); +} + +void +powerwindow_input_initialize_PSG_BackR(void) { + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackR_U_Up_Input_BackR, + powerwindow_debounce_passenger_BackR_U_Up_BackR_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackR_U_Down_Input_BackR, + powerwindow_debounce_passenger_BackR_U_Down_BackR_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR, + powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_BackR, + powerwindow_powerwindow_control_U_currentsense_BackR_Array); +} + +void +powerwindow_Booleaninputarray_initialize(powerwindow_boolean_T *arrayA, + powerwindow_boolean_T *arrayB) { + + register int i; + __pragma_loopbound(977, 977); + for (i = 0; i < powerwindow_input_length; i++) + arrayA[i] = arrayB[i]; +} + +void +powerwindow_Uint8inputarray_initialize(powerwindow_uint8_T *arrayA, + powerwindow_uint8_T *arrayB) { + + register int i; + __pragma_loopbound(977, 977); + for (i = 0; i < powerwindow_input_length; i++) + arrayA[i] = arrayB[i]; +} + +void +powerwindow_initialize_DRV(void) { + /* Initialize model */ + powerwindow_PW_Control_DRV_initialize(); +} + +void +powerwindow_initialize_PSG_Front(void) { + /* Initialize model */ + powerwindow_PW_Control_PSG_Front_initialize(); +} + +void +powerwindow_initialize_PSG_BackL(void) { + /* Initialize model */ + powerwindow_PW_Control_PSG_BackL_initialize(); +} + +void +powerwindow_initialize_PSG_BackR(void) { + /* Initialize model */ + powerwindow_PW_Control_PSG_BackR_initialize(); +} + +void +powerwindow_return_DRV(void) { + /* Terminate model */ + powerwindow_PW_Control_DRV_terminate(); +} + +void +powerwindow_return_PSG_Front(void) { + /* Terminate model */ + powerwindow_PW_Control_PSG_Front_terminate(); +} + +void +powerwindow_return_PSG_BackL(void) { + /* Terminate model */ + powerwindow_PW_Control_PSG_BackL_terminate(); +} + +void +powerwindow_return_PSG_BackR(void) { + /* Terminate model */ + powerwindow_PW_Control_PSG_BackR_terminate(); +} + +/* + Main functions +*/ + +/* + Associating powerwindow_main with a real-time clock or interrupt service + routine is what makes the generated code "real-time". The function + powerwindow_main is always associated with the base rate of the model. + Subrates are managed by the base rate from inside the generated code. + Enabling/disabling interrupts and floating point context switches are target + specific. This example code indicates where these should take place relative + to executing the generated code step function. Overrun behavior should be + tailored to your application needs. This example simply sets an error status + in the real-time model and returns from powerwindow_main. +*/ + +void +powerwindow_DRV_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_DRV_rtmSetErrorStatus(powerwindow_PW_Control_DRV_M, + "Overrun"); ////////// + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_DRV_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +/* + The example "main" function illustrates what is required by your + application code to initialize, execute, and terminate the generated code. + Attaching powerwindow_main to a real-time clock is target specific. This + example illustates how you do this relative to initializing the model. +*/ + +void +powerwindow_PSG_Front_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_PSG_Front_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_Front_M, "Overrun"); + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_PSG_Front_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +void +powerwindow_PSG_BackL_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_PSG_BackL_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackL_M, "Overrun"); + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_PSG_BackL_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +void +powerwindow_PSG_BackR_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_PSG_BackR_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackR_M, "Overrun"); + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_PSG_BackR_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +void +powerwindow_init(void) { + powerwindow_initialize_DRV(); + powerwindow_initialize_PSG_Front(); + powerwindow_initialize_PSG_BackL(); + powerwindow_initialize_PSG_BackR(); + powerwindow_main_inputcyclecounter = 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +powerwindow_main(void) { + /* Attach powerwindow_main to a timer or interrupt service routine with + period 0.005 seconds (the model's base sample time) here. The + call syntax for powerwindow_main is + + powerwindow_main(); + */ + // Task 1: Driver side window + + powerwindow_input_initialize_DRV(); + powerwindow_input_initialize_PSG_Front(); + powerwindow_input_initialize_PSG_BackL(); + powerwindow_input_initialize_PSG_BackR(); + + __pragma_loopbound(977, 977); + while (powerwindow_main_inputcyclecounter < powerwindow_input_length) { + + powerwindow_init_DRV(powerwindow_main_inputcyclecounter); + powerwindow_DRV_main(); + + // Task 2: Front passenger side window + + powerwindow_init_PSG_Front(powerwindow_main_inputcyclecounter); + powerwindow_PSG_Front_main(); + + // Task 3: Back left passenger side window + + powerwindow_init_PSG_BackL(powerwindow_main_inputcyclecounter); + powerwindow_PSG_BackL_main(); + + // Task 4: Back right passenger side window + + powerwindow_init_PSG_BackR(powerwindow_main_inputcyclecounter); + powerwindow_PSG_BackR_main(); + + powerwindow_main_inputcyclecounter++; + } +} + +int +powerwindow_return(void) { + powerwindow_return_DRV(); + powerwindow_return_PSG_Front(); + powerwindow_return_PSG_BackL(); + powerwindow_return_PSG_BackR(); + + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + powerwindow_init(); + powerwindow_main(); + return powerwindow_return(); +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow.h new file mode 100644 index 0000000..21cc536 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow.h @@ -0,0 +1,23 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef NULL +#define NULL ((viod *) 0) +#endif diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.c new file mode 100644 index 0000000..2835123 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.c @@ -0,0 +1,328 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of driver side + powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_DRV_initialize(void); +void powerwindow_PW_Control_DRV_terminate(void); +void powerwindow_PW_Control_DRV_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_powerwindow_PW_Control_D powerwindow_PW_Control_DR_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_DRV powerwindow_PW_Control_DRV_M_; +powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M = + &powerwindow_PW_Control_DRV_M_; + +/* Model step function */ +void +powerwindow_PW_Control_DRV_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_Debounce_Up_DRV; + powerwindow_boolean_T rtb_Debounce_Down_DRV; + + /* ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In2, &rtb_Debounce_Up_DRV, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In4, &rtb_Debounce_Down_DRV, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In9, &powerwindow_PW_Control_DRV_Y.Out10, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In10, &powerwindow_PW_Control_DRV_Y.Out11, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1 + .rtzce)); + + /* ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In5, &powerwindow_PW_Control_DRV_Y.Out6, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In6, &powerwindow_PW_Control_DRV_Y.Out7, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1 + .rtzce)); + + /* ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In7, &powerwindow_PW_Control_DRV_Y.Out8, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In8, &powerwindow_PW_Control_DRV_Y.Out9, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1 + .rtzce)); + + /* ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_main( + &rtb_Debounce_Up_DRV, &rtb_Debounce_Down_DRV, + &powerwindow_PW_Control_DRV_U.In1, &powerwindow_PW_Control_DRV_U.In3, + &powerwindow_PW_Control_DRV_Y.Out1, &powerwindow_PW_Control_DRV_Y.Out2, + &powerwindow_PW_Control_DRV_Y.Out3, &powerwindow_PW_Control_DRV_Y.Out4, + &powerwindow_PW_Control_DRV_Y.Out5, + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce)); +} + +/* Model initialize function */ +void +powerwindow_PW_Control_DRV_initialize(void) { + /* Registration code */ + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_DR_DWork, 0, + sizeof(powerwindow_D_Work_powerwindow_PW_Control_D)); + + /* external inputs */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_DRV_U, 0, + sizeof(powerwindow_ExternalInputs_powerwindow_PW_C)); + + /* external outputs */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_DRV_Y, 0, + sizeof(powerwindow_ExternalOutputs_powerwindow_PW_)); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Down_DRV' + */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1 + .rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1 + .rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1 + .rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Up_DRV' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_DRV' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce)); + + /* Start for ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_Start( + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_DRV_Y.Out1, &powerwindow_PW_Control_DRV_Y.Out2, + &powerwindow_PW_Control_DRV_Y.Out3, &powerwindow_PW_Control_DRV_Y.Out4, + &powerwindow_PW_Control_DRV_Y.Out5, + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw)); +} + +/* Model terminate function */ +void +powerwindow_PW_Control_DRV_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.h new file mode 100644 index 0000000..7418331 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV.h @@ -0,0 +1,154 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_ +#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_ +#ifndef powerwindow_PW_Control_DRV_COMMON_INCLUDES_ +#define powerwindow_PW_Control_DRV_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_DRV_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_DRV_rtmGetErrorStatus +#define powerwindow_PW_DRV_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_DRV_rtmSetErrorStatus +#define powerwindow_PW_DRV_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_DRV_rtmGetErrorStatusPointer +#define powerwindow_PW_DRV_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DRV_DWORK1; /* '/Debounce_Up_DRV' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DRV_DWORK1; /* '/Debounce_Down_DRV' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_BackL_DWORK1; /* '/Debounce_Up_PSG_BackL' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_BackL_DWORK1; /* '/Debounce_Down_PSG_BackL' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_Front_DWORK1; /* '/Debounce_Up_PSG_Front' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_Front_DWORK1; /* '/Debounce_Down_PSG_Front' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_BackR_DWORK1; /* '/Debounce_Up_PSG_BackR' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_BackR_DWORK1; /* '/Debounce_Down_PSG_BackR' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_DRV_DWORK1; /* '/PW_DRV' */ +} powerwindow_D_Work_powerwindow_PW_Control_D; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T In1; /* '/In1' */ + powerwindow_boolean_T In2; /* '/In2' */ + powerwindow_uint8_T In3; /* '/In3' */ + powerwindow_boolean_T In4; /* '/In4' */ + powerwindow_boolean_T In5; /* '/In5' */ + powerwindow_boolean_T In6; /* '/In6' */ + powerwindow_boolean_T In7; /* '/In7' */ + powerwindow_boolean_T In8; /* '/In8' */ + powerwindow_boolean_T In9; /* '/In9' */ + powerwindow_boolean_T In10; /* '/In10' */ +} powerwindow_ExternalInputs_powerwindow_PW_C; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Out1; /* '/Out1' */ + powerwindow_boolean_T Out2; /* '/Out2' */ + powerwindow_boolean_T Out3; /* '/Out3' */ + powerwindow_boolean_T Out4; /* '/Out4' */ + powerwindow_boolean_T Out5; /* '/Out5' */ + powerwindow_boolean_T Out6; /* '/Out6' */ + powerwindow_boolean_T Out7; /* '/Out7' */ + powerwindow_boolean_T Out8; /* '/Out8' */ + powerwindow_boolean_T Out9; /* '/Out9' */ + powerwindow_boolean_T Out10; /* '/Out10' */ + powerwindow_boolean_T Out11; /* '/Out11' */ +} powerwindow_ExternalOutputs_powerwindow_PW_; + +struct powerwindow_tag_RTM_PW_Control_DRV { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_powerwindow_PW_Control_D + powerwindow_PW_Control_DR_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; + +/* Model entry point functions */ +void powerwindow_PW_Control_DRV_initialize(void); +void powerwindow_PW_Control_DRV_main(void); +void powerwindow_PW_Control_DRV_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/powerwindow_PW_Control_DRV') - opens subsystem + PowerWindow/powerwindow_PW_Control_DRV + hilite_system('PowerWindow/powerwindow_PW_Control_DRV/Kp') - opens and + selects block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/powerwindow_PW_Control_DRV' + '' : 'PowerWindow/powerwindow_PW_Control_DRV/Debounce_DRV' +*/ +#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_private.h new file mode 100644 index 0000000..e25af80 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ +#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_types.h new file mode 100644 index 0000000..4fffdd6 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_DRV_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_DRV_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_DRV_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_DRV + powerwindow_RT_MODEL_PW_Control_DRV; + +#endif /* RTW_HEADER_PW_Control_DRV_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.c new file mode 100644 index 0000000..ef19e2c --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.c @@ -0,0 +1,192 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of back-left passenger + side powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_PSG_BackL_initialize(void); +void powerwindow_PW_Control_PSG_BackL_terminate(void); +void powerwindow_PW_Control_PSG_BackL_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_M_; +powerwindow_RT_MODEL_PW_Control_PSG_BackL *const + powerwindow_PW_Control_PSG_BackL_M = &powerwindow_PW_Control_PSG_BackL_M_; + +/* Model step function */ +void +powerwindow_PW_Control_PSG_BackL_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL, &rtb_debounce_Up, + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce)); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL, &rtb_debounce_Down, + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce)); + + /* ModelReference: '/ControlEx_PSG_BackL' */ + powerwindow_controlexclusion_main( + &powerwindow_PW_Control_PSG_BackL_U.Up_DRV, + &powerwindow_PW_Control_PSG_BackL_U.Down_DRV, &rtb_debounce_Up, + &rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_BackL_o1, + &powerwindow_rtb_ControlEx_PSG_BackL_o2); + + /* ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_BackL_o1, + &powerwindow_rtb_ControlEx_PSG_BackL_o2, + &powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_BackL_U.currentsense, + &powerwindow_PW_Control_PSG_BackL_Y.window_up, + &powerwindow_PW_Control_PSG_BackL_Y.window_down, + &powerwindow_PW_Control_PSG_BackL_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackL_Y.pinch, + &powerwindow_PW_Control_PSG_BackL_Y.wake, + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce)); +} + +/* Model initialize function */ +void +powerwindow_PW_Control_PSG_BackL_initialize(void) { + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_BackL_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackL_M, (NULL)); + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_BackL_DWork, 0, + sizeof(powerwindow_D_Work_PW_Control_PSG_BackL)); + + /* external inputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackL_U, 0, + sizeof(powerwindow_ExternalInputs_PW_Control_PSG_BackL)); + + /* external outputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackL_Y, 0, + sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_BackL)); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_BackL' + */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce)); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw)); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_Start( + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_BackL_Y.window_up, + &powerwindow_PW_Control_PSG_BackL_Y.window_down, + &powerwindow_PW_Control_PSG_BackL_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackL_Y.pinch, + &powerwindow_PW_Control_PSG_BackL_Y.wake, + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw)); +} + +/* Model terminate function */ +void +powerwindow_PW_Control_PSG_BackL_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.h new file mode 100644 index 0000000..2d6fce4 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL.h @@ -0,0 +1,139 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_ +#ifndef powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_ +#define powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_BackL_BackL_rtmGetErrorStatus +#define powerwindow_PW_PSG_BackL_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_BackL_rtmSetErrorStatus +#define powerwindow_PW_PSG_BackL_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer +#define powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DWORK1; /* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1; /* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_BackL_DWORK1; /* '/PW_PSG_BackL' */ +} powerwindow_D_Work_PW_Control_PSG_BackL; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T Up_PSG_BackL; /* '/Up_PSG_BackL' */ + powerwindow_boolean_T Down_PSG_BackL; /* '/Down_PSG_BackL' */ +} powerwindow_ExternalInputs_PW_Control_PSG_BackL; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_BackL; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_BackL { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_Y; + +/* Model entry point functions */ +void powerwindow_PW_Control_PSG_BackL_initialize(void); +void powerwindow_PW_Control_PSG_BackL_main(void); +void powerwindow_PW_Control_PSG_BackL_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_BackL + *const powerwindow_PW_Control_PSG_BackL_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_BackL') - opens subsystem + PowerWindow/PW_Control_PSG_BackL + hilite_system('PowerWindow/PW_Control_PSG_BackL/Kp') - opens and selects + block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_BackL' + '' : 'PowerWindow/PW_Control_PSG_BackL/Debounce_PSG_BackL' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_BackL_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_private.h new file mode 100644 index 0000000..86054c3 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_PW_Control_PSG_BackL_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_types.h new file mode 100644 index 0000000..497cefe --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackL_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackL + powerwindow_RT_MODEL_PW_Control_PSG_BackL; + +#endif /* RTW_HEADER_PW_Control_PSG_BackL_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.c new file mode 100644 index 0000000..e71b71a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.c @@ -0,0 +1,192 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of back-right passenger + side powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_PW_Control_PSG_BackR.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_PSG_BackR_initialize(void); +void powerwindow_PW_Control_PSG_BackR_terminate(void); +void powerwindow_PW_Control_PSG_BackR_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_M_; +powerwindow_RT_MODEL_PW_Control_PSG_BackR *const + powerwindow_PW_Control_PSG_BackR_M = &powerwindow_PW_Control_PSG_BackR_M_; + +/* Model step function */ +void +powerwindow_PW_Control_PSG_BackR_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR, &rtb_debounce_Up, + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce)); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR, &rtb_debounce_Down, + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce)); + + /* ModelReference: '/ControlEx_PSG_BackR' */ + powerwindow_controlexclusion_main( + &powerwindow_PW_Control_PSG_BackR_U.Up_DRV, + &powerwindow_PW_Control_PSG_BackR_U.Down_DRV, &rtb_debounce_Up, + &rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_BackR_o1, + &powerwindow_rtb_ControlEx_PSG_BackR_o2); + + /* ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_BackR_o1, + &powerwindow_rtb_ControlEx_PSG_BackR_o2, + &powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_BackR_U.currentsense, + &powerwindow_PW_Control_PSG_BackR_Y.window_up, + &powerwindow_PW_Control_PSG_BackR_Y.window_down, + &powerwindow_PW_Control_PSG_BackR_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackR_Y.pinch, + &powerwindow_PW_Control_PSG_BackR_Y.wake, + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce)); +} + +/* Model initialize function */ +void +powerwindow_PW_Control_PSG_BackR_initialize(void) { + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_BackR_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackR_M, (NULL)); + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_BackR_DWork, 0, + sizeof(powerwindow_D_Work_PW_Control_PSG_BackR)); + + /* external inputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackR_U, 0, + sizeof(powerwindow_ExternalInputs_PW_Control_PSG_BackR)); + + /* external outputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackR_Y, 0, + sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_BackR)); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_BackR' + */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce)); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw)); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_Start( + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_BackR_Y.window_up, + &powerwindow_PW_Control_PSG_BackR_Y.window_down, + &powerwindow_PW_Control_PSG_BackR_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackR_Y.pinch, + &powerwindow_PW_Control_PSG_BackR_Y.wake, + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw)); +} + +/* Model terminate function */ +void +powerwindow_PW_Control_PSG_BackR_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.h new file mode 100644 index 0000000..73bcabc --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR.h @@ -0,0 +1,139 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_ +#ifndef powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_ +#define powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatus +#define powerwindow_PW_PSG_BackR_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_BackR_rtmSetErrorStatus +#define powerwindow_PW_PSG_BackR_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer +#define powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DWORK1; /* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1; /* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_BackR_DWORK1; /* '/PW_PSG_BackR' */ +} powerwindow_D_Work_PW_Control_PSG_BackR; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T Up_PSG_BackR; /* '/Up_PSG_BackR' */ + powerwindow_boolean_T Down_PSG_BackR; /* '/Down_PSG_BackR' */ +} powerwindow_ExternalInputs_PW_Control_PSG_BackR; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_BackR; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_BackR { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_Y; + +/* Model entry point functions */ +void powerwindow_PW_Control_PSG_BackR_initialize(void); +void powerwindow_PW_Control_PSG_BackR_main(void); +void powerwindow_PW_Control_PSG_BackR_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_BackR + *const powerwindow_PW_Control_PSG_BackR_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_BackR') - opens subsystem + PowerWindow/PW_Control_PSG_BackR + hilite_system('PowerWindow/PW_Control_PSG_BackR/Kp') - opens and selects + block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_BackR' + '' : 'PowerWindow/PW_Control_PSG_BackR/Debounce_PSG' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_private.h new file mode 100644 index 0000000..0265791 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_PW_Control_PSG_BackR_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_types.h new file mode 100644 index 0000000..a2e2b29 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_BackR_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR_tyoes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackR + powerwindow_RT_MODEL_PW_Control_PSG_BackR; + +#endif /* RTW_HEADER_PW_Control_PSG_BackR_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.c new file mode 100644 index 0000000..d0534ee --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.c @@ -0,0 +1,198 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of front passenger side + powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_PSG_Front_initialize(void); +void powerwindow_PW_Control_PSG_Front_terminate(void); +void powerwindow_PW_Control_PSG_Front_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_M_; +powerwindow_RT_MODEL_PW_Control_PSG_Front *const + powerwindow_PW_Control_PSG_Front_M = &powerwindow_PW_Control_PSG_Front_M_; + +/* Model step function */ +void +powerwindow_PW_Control_PSG_Front_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front, &rtb_debounce_Up, + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce)); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front, &rtb_debounce_Down, + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce)); + + /* ModelReference: '/ControlEx_PSG_Front_Front' */ + powerwindow_controlexclusion_main( + &powerwindow_PW_Control_PSG_Front_U.Up_DRV, + &powerwindow_PW_Control_PSG_Front_U.Down_DRV, &rtb_debounce_Up, + &rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_Front_Front_o1, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o2); + + /* ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_Front_Front_o1, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o2, + &powerwindow_PW_Control_PSG_Front_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_Front_U.currentsense, + &powerwindow_PW_Control_PSG_Front_Y.window_up, + &powerwindow_PW_Control_PSG_Front_Y.window_down, + &powerwindow_PW_Control_PSG_Front_Y.overcurrent, + &powerwindow_PW_Control_PSG_Front_Y.pinch, + &powerwindow_PW_Control_PSG_Front_Y.wake, + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtzce)); +} + +/* Model initialize function */ +void +powerwindow_PW_Control_PSG_Front_initialize(void) { + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_Front_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_Front_M, (NULL)); + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_Front_DWork, 0, + sizeof(powerwindow_D_Work_PW_Control_PSG_Front)); + + /* external inputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_Front_U, 0, + sizeof(powerwindow_ExternalInputs_PW_Control_PSG_Front)); + + /* external outputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_Front_Y, 0, + sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_Front)); + + /* Model Initialize fcn for ModelReference Block: + * '/ControlEx_PSG_Front_Front' */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_Front_Front' + */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtzce)); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw)); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_Start(&( + powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_Front_Y.window_up, + &powerwindow_PW_Control_PSG_Front_Y.window_down, + &powerwindow_PW_Control_PSG_Front_Y.overcurrent, + &powerwindow_PW_Control_PSG_Front_Y.pinch, + &powerwindow_PW_Control_PSG_Front_Y.wake, + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtdw)); +} + +/* Model terminate function */ +void +powerwindow_PW_Control_PSG_Front_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.h new file mode 100644 index 0000000..6043066 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front.h @@ -0,0 +1,139 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_ +#ifndef powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_ +#define powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatus +#define powerwindow_PW_PSG_Front_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_Front_rtmSetErrorStatus +#define powerwindow_PW_PSG_Front_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer +#define powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DWORK1; /* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1; /* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_Front_Front_DWORK1; /* '/PW_PSG_Front_Front' */ +} powerwindow_D_Work_PW_Control_PSG_Front; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T Up_PSG_Front; /* '/Up_PSG_Front' */ + powerwindow_boolean_T Down_PSG_Front; /* '/Down_PSG_Front' */ +} powerwindow_ExternalInputs_PW_Control_PSG_Front; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_Front; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_Front { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_Y; + +/* Model entry point functions */ +void powerwindow_PW_Control_PSG_Front_initialize(void); +void powerwindow_PW_Control_PSG_Front_main(void); +void powerwindow_PW_Control_PSG_Front_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_Front + *const powerwindow_PW_Control_PSG_Front_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_Front') - opens subsystem + PowerWindow/PW_Control_PSG_Front + hilite_system('PowerWindow/PW_Control_PSG_Front/Kp') - opens and selects + block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_Front' + '' : 'PowerWindow/PW_Control_PSG_Front/Debounce_PSG_Front_Front' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_Front_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_private.h new file mode 100644 index 0000000..05c8915 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_PW_Control_PSG_Front_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_types.h new file mode 100644 index 0000000..c422d2a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_PW_Control_PSG_Front_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_Front + powerwindow_RT_MODEL_PW_Control_PSG_Front; + +#endif /* RTW_HEADER_PW_Control_PSG_Front_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_const_params.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_const_params.c new file mode 100644 index 0000000..d8d48eb --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_const_params.c @@ -0,0 +1,26 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_const_params.c + + Author: CoSys-Lab, University of Antwerp + + Function: the lookup table for stateflow chart in + powerwindow_powerwindow_control + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_const_params.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +extern const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[12]; +const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[12] = { + 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0}; diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.c new file mode 100644 index 0000000..389c091 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.c @@ -0,0 +1,89 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_controlexclusion is one functionality of the power + window benchmark. It takes the input signal from the driver and the passenger + to determine the final control signal. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_controlexclusion.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_controlexclusion_initialize(void); +void powerwindow_controlexclusion_terminate(void); +void +powerwindow_controlexclusion_main(const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, + powerwindow_boolean_T *rty_Down); + +/* Model initialize function */ +void +powerwindow_controlexclusion_initialize(void) { + /* (no initialization code required) */ +} + +/* Model terminate function */ +void +powerwindow_controlexclusion_terminate(void) { + /* (no terminate code required) */ +} + +/* + Algorithm core functions +*/ + +/* Output and update for referenced model: 'ControlExclusion' */ +void +powerwindow_controlexclusion_main(const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, + powerwindow_boolean_T *rty_Down) { + /* Logic: '/Logical Operator11' incorporates: + Logic: '/Logical Operator2' + Logic: '/Logical Operator3' + Logic: '/Logical Operator5' + Logic: '/Logical Operator6' + Logic: '/Logical Operator7' + */ + *rty_Up = !(((!*rtu_Up_DRV) && (*rtu_Down_DRV)) || + ((*rtu_Down_DRV) && (!*rtu_Up_PSG) && (*rtu_Down_PSG))); + + /* Logic: '/Logical Operator12' incorporates: + Logic: '/Logical Operator1' + Logic: '/Logical Operator10' + Logic: '/Logical Operator4' + Logic: '/Logical Operator8' + Logic: '/Logical Operator9' + */ + *rty_Down = !(((*rtu_Up_DRV) && (!*rtu_Down_DRV)) || + ((*rtu_Up_DRV) && (*rtu_Up_PSG) && (!*rtu_Down_PSG))); +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.h new file mode 100644 index 0000000..364a5cd --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion.h @@ -0,0 +1,77 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_h_ +#define powerwindow_RTW_HEADER_controlexclusion_h_ +#ifndef powerwindow_controlexclusion_COMMON_INCLUDES_ +#define powerwindow_controlexclusion_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* powerwindow_controlexclusion_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* user code (top of header file) */ + +/* Model reference registration function */ + +void powerwindow_controlexclusion_initialize(void); +void powerwindow_controlexclusion_terminate(void); +void +powerwindow_controlexclusion_main(const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, + powerwindow_boolean_T *rty_Down); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'ControlExclusion' + '' : 'ControlExclusion/Control_Clock_TicToc' + '' : 'ControlExclusion/Control_Clock_TicToc/ControlEx_PSG' + '' : 'ControlExclusion/Control_Clock_TicToc/Tic' + '' : 'powerwindow_controlexclusion_main/Control_Clock_TicToc/Toc' + '' : 'ControlExclusion/Control_Clock_TicToc/Tic/Tic_T' + '' : 'ControlExclusion/Control_Clock_TicToc/Toc/Toc_T' +*/ +#endif /* RTW_HEADER_ControlExclusion_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_private.h new file mode 100644 index 0000000..085da56 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_private_h_ +#define powerwindow_RTW_HEADER_controlexclusion_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_controlexclusion_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_types.h new file mode 100644 index 0000000..a84099c --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_controlexclusion_types.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_types_h_ +#define powerwindow_RTW_HEADER_controlexclusion_types_h_ + +/* Forward declaration for rtModel */ +#endif /* powerwindow_RTW_HEADER_controlexclusion_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.c new file mode 100644 index 0000000..9f3f142 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.c @@ -0,0 +1,228 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce.c + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_debounce_main is used to powerwindow_debounce_main the + push-down button of the power window. In order to input a manual switch signal + into a digital circuit, debouncing is necessary so that a single press does + not appear like multiple presses. Without debouncing, pressing the button once + may cause unpredictable results. powerwindow_debounce_main.c defines all the + functions that will be used in debounce_PSG_Front which is a part of the Power + window. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_debounce.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "powerwindow_HeaderFiles/powerwindow_debounce_private.h" +#include "wcclib.h" + +/* Named constants for Chart: '/Chart' */ +#define debounce_IN_debounce ((powerwindow_uint8_T) 1U) +#define debounce_IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T) 0U) +#define debounce_IN_Off ((powerwindow_uint8_T) 2U) +#define debounce_IN_Off_h ((powerwindow_uint8_T) 1U) +#define debounce_IN_On ((powerwindow_uint8_T) 3U) +#define debounce_IN_On_b ((powerwindow_uint8_T) 2U) + +/* + Forward declaration of functions +*/ + +void powerwindow_debounce_Init(powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *); +void powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *); +void powerwindow_debounce_initialize(const powerwindow_char_T **, + powerwindow_RT_MODEL_debounce_T *const, + powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *, + powerwindow_rtZCE_debounce_T *); +void powerwindow_debounce_main(const powerwindow_boolean_T *, + powerwindow_boolean_T *, + powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *, + powerwindow_rtZCE_debounce_T *); + +/* + Initialization- and return-value-related functions +*/ + +/* Initial conditions for referenced model: 'powerwindow_debounce_main' */ +void +powerwindow_debounce_Init(powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW) { + /* InitializeConditions for Chart: '/Chart' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i1 = 0U; + localDW->is_active_c3_debounce = 0U; + localDW->is_c3_debounce = debounce_IN_NO_ACTIVE_CHILD; + localB->Q = false; +} + +/* Start for referenced model: 'powerwindow_debounce_main' */ +void +powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *localDW) { + /* Start for DiscretePulseGenerator: '/period of 10ms' */ + localDW->clockTickCounter = 0L; +} + +/* Model initialize function */ +void +powerwindow_debounce_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_debounce_T *const debounce_M, + powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE) { + /* Registration code */ + + /* initialize error status */ + powerwindow_rtmSetErrorStatusPointer(debounce_M, rt_errorStatus); + + /* block I/O */ + (void) wcclib_memset(((void *) localB), 0, + sizeof(powerwindow_rtB_debounce_T)); + + /* states (dwork) */ + (void) wcclib_memset((void *) localDW, 0, + sizeof(powerwindow_rtDW_debounce_T)); + localZCE->Chart_Trig_ZCE = powerwindow_POS_ZCSIG; +} + +/* + Algorithm core functions +*/ + +/* Output and update for referenced model: 'powerwindow_debounce_main' */ +void +powerwindow_debounce_main(const powerwindow_boolean_T *rtu_Switch, + powerwindow_boolean_T *rty_debounced_Switch, + powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE) { + powerwindow_int16_T rtb_periodof10ms; + + /* DiscretePulseGenerator: '/period of 10ms' */ + rtb_periodof10ms = + (localDW->clockTickCounter < 1L) && (localDW->clockTickCounter >= 0L) + ? 1 + : 0; + if (localDW->clockTickCounter >= 1L) + localDW->clockTickCounter = 0L; + + else + localDW->clockTickCounter++; + + /* End of DiscretePulseGenerator: '/period of 10ms' */ + + /* Chart: '/Chart' incorporates: + TriggerPort: '/ticks' + */ + /* DataTypeConversion: '/Data Type Conversion' */ + if ((rtb_periodof10ms != 0) && + (localZCE->Chart_Trig_ZCE != powerwindow_POS_ZCSIG)) { + /* Gateway: Chart */ + if (localDW->temporalCounter_i1 < 7U) + localDW->temporalCounter_i1++; + + /* Event: ':13' */ + /* During: Chart */ + if (localDW->is_active_c3_debounce == 0U) { + /* Entry: Chart */ + localDW->is_active_c3_debounce = 1U; + + /* Entry Internal: Chart */ + /* Transition: ':9' */ + localDW->is_c3_debounce = debounce_IN_Off; + + /* Entry 'Off': ':1' */ + localB->Q = true; + } else { + switch (localDW->is_c3_debounce) { + case debounce_IN_debounce: + /* During 'powerwindow_debounce_main': ':6' */ + if (localDW->is_debounce == debounce_IN_Off_h) { + /* During 'Off': ':8' */ + if ((powerwindow_int16_T) *rtu_Switch < 1) { + /* Transition: ':12' */ + localDW->is_debounce = debounce_IN_On_b; + localDW->temporalCounter_i1 = 0U; + } else { + if (localDW->temporalCounter_i1 >= 3) { + /* Transition: ':16' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->is_c3_debounce = debounce_IN_Off; + + /* Entry 'Off': ':1' */ + localB->Q = true; + } + } + } else { + /* During 'On': ':7' */ + if ((powerwindow_int16_T) *rtu_Switch > 0) { + /* Transition: ':11' */ + localDW->is_debounce = debounce_IN_Off_h; + localDW->temporalCounter_i1 = 0U; + } else { + if (localDW->temporalCounter_i1 >= 3) { + /* Transition: ':14' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->is_c3_debounce = debounce_IN_On; + + /* Entry 'On': ':5' */ + localB->Q = false; + } + } + } + break; + + case debounce_IN_Off: + /* During 'Off': ':1' */ + if ((powerwindow_int16_T) *rtu_Switch < 1) { + /* Transition: ':10' */ + localDW->is_c3_debounce = debounce_IN_debounce; + localDW->is_debounce = debounce_IN_On_b; + localDW->temporalCounter_i1 = 0U; + } + break; + + default: + /* During 'On': ':5' */ + if ((powerwindow_int16_T) *rtu_Switch > 0) { + /* Transition: ':15' */ + localDW->is_c3_debounce = debounce_IN_debounce; + localDW->is_debounce = debounce_IN_Off_h; + localDW->temporalCounter_i1 = 0U; + } + break; + } + } + } + + localZCE->Chart_Trig_ZCE = + (powerwindow_uint8_T) (rtb_periodof10ms != 0 + ? (powerwindow_int16_T) powerwindow_POS_ZCSIG + : (powerwindow_int16_T) + powerwindow_ZERO_ZCSIG); + + /* End of DataTypeConversion: '/Data Type Conversion' */ + + /* DataTypeConversion: '/Data Type Conversion2' */ + *rty_debounced_Switch = localB->Q; +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.h new file mode 100644 index 0000000..8cb1554 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce.h @@ -0,0 +1,102 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_h_ +#define powerwindow_RTW_HEADER_debounce_h_ +#ifndef powerwindow_debounce_COMMON_INCLUDES_ +#define powerwindow_debounce_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* debounce_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_debounce_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Block signals for model 'powerwindow_debounce_main' */ +typedef struct { + powerwindow_boolean_T Q; /* '/Chart' */ +} powerwindow_rtB_debounce_T; + +/* Block states (auto storage) for model 'powerwindow_debounce_main' */ +typedef struct { + powerwindow_int32_T clockTickCounter; /* '/period of 10ms' */ + powerwindow_uint8_T is_active_c3_debounce; /* '/Chart' */ + powerwindow_uint8_T is_c3_debounce; /* '/Chart' */ + powerwindow_uint8_T is_debounce; /* '/Chart' */ + powerwindow_uint8_T temporalCounter_i1; /* '/Chart' */ +} powerwindow_rtDW_debounce_T; + +/* Zero-crossing (trigger) state for model 'powerwindow_debounce_main' */ +typedef struct { + ZCSigState Chart_Trig_ZCE; /* '/Chart' */ +} powerwindow_rtZCE_debounce_T; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_debounce_T { + const powerwindow_char_T **errorStatus; +}; + +typedef struct { + powerwindow_rtB_debounce_T rtb; + powerwindow_rtDW_debounce_T rtdw; + powerwindow_RT_MODEL_debounce_T rtm; + powerwindow_rtZCE_debounce_T rtzce; +} powerwindow_rtMdlrefDWork_debounce_T; + +/* Model reference registration function */ +void powerwindow_debounce_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_debounce_T *const debounce_M, + powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE); +void powerwindow_debounce_Init(powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW); +void powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *localDW); +void powerwindow_debounce_main(const powerwindow_boolean_T *rtu_Switch, + powerwindow_boolean_T *rty_debounced_Switch, + powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'powerwindow_debounce_main' + '' : 'powerwindow_debounce_main/Chart' +*/ +#endif /* RTW_HEADER_debounce_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_private.h new file mode 100644 index 0000000..2bd34bd --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_private.h @@ -0,0 +1,49 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_private_h_ +#define powerwindow_RTW_HEADER_debounce_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_rtmGetErrorStatus +#define powerwindow_rtmGetErrorStatus(rtm) (*((rtm)->errorStatus)) +#endif + +#ifndef powerwindow_rtmSetErrorStatus +#define powerwindow_rtmSetErrorStatus(rtm, val) (*((rtm)->errorStatus) = (val)) +#endif + +#ifndef powerwindow_rtmGetErrorStatusPointer +#define powerwindow_rtmGetErrorStatusPointer(rtm) (rtm)->errorStatus +#endif + +#ifndef powerwindow_rtmSetErrorStatusPointer +#define powerwindow_rtmSetErrorStatusPointer(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif +#endif /* RTW_HEADER_debounce_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_types.h new file mode 100644 index 0000000..fc6e0fb --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_debounce_types.h @@ -0,0 +1,33 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_types_h_ +#define powerwindow_RTW_HEADER_debounce_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_debounce_T powerwindow_RT_MODEL_debounce_T; + +#endif /* RTW_HEADER_debounce_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_inputs.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_inputs.c new file mode 100644 index 0000000..e252dc2 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_inputs.c @@ -0,0 +1,1097 @@ +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +powerwindow_boolean_T powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_DRV_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Up_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Down_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Front_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Up_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Down_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_BackL_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Up_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Down_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_BackR_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_model_reference_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_model_reference_types.h new file mode 100644 index 0000000..9ee9007 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_model_reference_types.h @@ -0,0 +1,52 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_model_reference_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___MODEL_REFERENCE_TYPES_H__ +#define powerwindow___MODEL_REFERENCE_TYPES_H__ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#ifndef powerwindow___MODEL_REFERENCE_TYPES__ +#define powerwindow___MODEL_REFERENCE_TYPES__ + +/*===========================================================================* + Model reference type definitions + ===========================================================================*/ +/* + This structure is used by model reference to + communicate timing information through the hierarchy. +*/ +typedef struct powerwindow__rtTimingBridge_tag powerwindow_rtTimingBridge; +struct powerwindow__rtTimingBridge_tag { + powerwindow_uint32_T nTasks; + powerwindow_uint32_T **clockTick; + powerwindow_uint32_T **clockTickH; + powerwindow_uint32_T *taskCounter; + powerwindow_real_T **taskTime; + powerwindow_boolean_T **rateTransition; + powerwindow_boolean_T *firstInitCond; +}; + +#endif /* __MODEL_REFERENCE_TYPES__ */ +#endif /* __MODEL_REFERENCE_TYPES_H__ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.c new file mode 100644 index 0000000..a58c23d --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.c @@ -0,0 +1,591 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control.c + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_control is the main functionality of the power window + benchmark. It contains 3 states: System, EndReached and Pinch, which are used + to controll the position of the glass, if the window is fully closed and + sensing pinch force to realize the powerwindow function. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" +#include "wcclib.h" + +/* Named constants for Chart: '/stateflow control model' */ +#define powerwindow_powerwindow__IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T) 0U) +#define powerwindow_powerwindow_contr_IN_EndReached ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_contr_IN_SensePinch ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_AutoDown ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_AutoUp ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_Down ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_Down_d ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_InitDown ((powerwindow_uint8_T) 3U) +#define powerwindow_powerwindow_control_IN_InitUp ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_Neutral ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_Pinch ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_SenseEnd ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_Start ((powerwindow_uint8_T) 3U) +#define powerwindow_powerwindow_control_IN_System ((powerwindow_uint8_T) 3U) +#define powerwindow_powerwindow_control_IN_Up ((powerwindow_uint8_T) 3U) + +/* Forward declaration for local functions */ + +void powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW); + +void powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW); + +void powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW); + +void powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); + +void powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); + +void powerwindow_powerwindow_con_broadcast_ticks( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW); + +/* Function for Chart: '/stateflow control model' */ +void +powerwindow_powerwindow_con_broadcast_ticks( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW) { + /* Event: ':30' */ + /* During: PW_PSG/PWExternalClock/stateflow control model */ + if (localDW->is_active_c2_PowerWindow_contro == 0U) { + /* Entry: PW_PSG/PWExternalClock/stateflow control model */ + localDW->is_active_c2_PowerWindow_contro = 1U; + + /* Entry Internal: PW_PSG/PWExternalClock/stateflow control model */ + /* Transition: ':102' */ + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } else { + switch (localDW->is_c2_PowerWindow_control) { + case powerwindow_powerwindow_contr_IN_EndReached: + /* During 'EndReached': ':97' */ + if (localDW->temporalCounter_i1 >= 10) { + /* Transition: ':101' */ + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } + break; + + case powerwindow_powerwindow_control_IN_Pinch: + /* During 'Pinch': ':152' */ + if (localDW->temporalCounter_i1 >= 40) { + /* Transition: ':157' */ + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } + break; + + default: + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* During 'System': ':94' */ + if (*rty_pinch == 1) { + /* Transition: ':155' */ + /* Exit Internal 'System': ':94' */ + /* Exit Internal 'Sensing': ':96' */ + localDW->is_Sensing = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Sensing = 0U; + + /* Exit Internal 'Logic': ':95' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Logic = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_Pinch; + localDW->temporalCounter_i1 = 0U; + + /* Entry 'Pinch': ':152' */ + *rty_window_up = false; + *rty_window_down = true; + } else if (*rty_overcurrent == 1) { + /* Transition: ':100' */ + /* Exit Internal 'System': ':94' */ + /* Exit Internal 'Sensing': ':96' */ + localDW->is_Sensing = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Sensing = 0U; + + /* Exit Internal 'Logic': ':95' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Logic = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_contr_IN_EndReached; + localDW->temporalCounter_i1 = 0U; + + /* Entry 'EndReached': ':97' */ + *rty_window_up = false; + *rty_window_down = false; + } else { + /* During 'Logic': ':95' */ + switch (localDW->is_Logic) { + case powerwindow_powerwindow_control_IN_Down_d: + /* During 'Down': ':18' */ + if (localB->map[1]) { + /* Transition: ':169' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Up; + + /* Entry 'Up': ':17' */ + *rty_window_up = true; + *rty_window_down = false; + *rty_wake = true; + localDW->is_Up = powerwindow_powerwindow_control_IN_Up; + } else { + switch (localDW->is_Down) { + case powerwindow_powerwindow_control_IN_AutoDown: + /* During 'AutoDown': ':111' */ + break; + + case powerwindow_powerwindow_control_IN_Down: + /* During 'Down': ':110' */ + if (localB->map[0]) { + /* Transition: ':26' */ + localDW->is_Down = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Neutral; + + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + } + break; + + default: + /* During 'InitDown': ':109' */ + if (localDW->temporalCounter_i1 >= 20) { + /* Transition: ':119' */ + if (localB->map[0]) { + /* Transition: ':120' */ + localDW->is_Down = + powerwindow_powerwindow_control_IN_AutoDown; + } else { + if (localB->map[2]) { + /* Transition: ':121' */ + localDW->is_Down = + powerwindow_powerwindow_control_IN_Down; + } + } + } + break; + } + } + break; + + case powerwindow_powerwindow_control_IN_Neutral: + /* During 'Neutral': ':16' */ + if (localB->map[1]) { + /* Transition: ':24' */ + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Up; + + /* Entry 'Up': ':17' */ + *rty_window_up = true; + *rty_window_down = false; + *rty_wake = true; + localDW->is_Up = + powerwindow_powerwindow_control_IN_InitUp; + localDW->temporalCounter_i1 = 0U; + } else { + if (localB->map[2]) { + /* Transition: ':25' */ + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Down_d; + + /* Entry 'Down': ':18' */ + *rty_window_up = false; + *rty_window_down = true; + *rty_wake = true; + localDW->is_Down = + powerwindow_powerwindow_control_IN_InitDown; + localDW->temporalCounter_i1 = 0U; + } + } + break; + + default: + /* During 'Up': ':17' */ + if (localB->map[2]) { + /* Transition: ':166' */ + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Down_d; + + /* Entry 'Down': ':18' */ + *rty_window_up = false; + *rty_window_down = true; + *rty_wake = true; + localDW->is_Down = + powerwindow_powerwindow_control_IN_Down; + } else { + switch (localDW->is_Up) { + case powerwindow_powerwindow_control_IN_AutoUp: + /* During 'AutoUp': ':108' */ + break; + + case powerwindow_powerwindow_control_IN_InitUp: + /* During 'InitUp': ':106' */ + if (localDW->temporalCounter_i1 >= 20) { + /* Transition: ':115' */ + if (localB->map[0]) { + /* Transition: ':118' */ + localDW->is_Up = + powerwindow_powerwindow_control_IN_AutoUp; + } else { + if (localB->map[1]) { + /* Transition: ':117' */ + localDW->is_Up = + powerwindow_powerwindow_control_IN_Up; + } + } + } + break; + + default: + /* During 'Up': ':107' */ + if (localB->map[0]) { + /* Transition: ':23' */ + localDW->is_Up = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Neutral; + + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + } + break; + } + } + break; + } + + /* During 'Sensing': ':96' */ + switch (localDW->is_Sensing) { + case powerwindow_powerwindow_control_IN_SenseEnd: + /* During 'SenseEnd': ':147' */ + if ((localB->LogicalOperator == 0) && + (*rty_window_up == 1)) { + /* Transition: ':173' */ + localDW->is_Sensing = + powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } else + *rty_overcurrent = (localB->RateTransition1 > 184); + break; + + case powerwindow_powerwindow_contr_IN_SensePinch: + /* During 'SensePinch': ':148' */ + if ((localB->LogicalOperator == 1) || + (*rty_window_down == 1)) { + /* Transition: ':150' */ + localDW->is_Sensing = + powerwindow_powerwindow_control_IN_SenseEnd; + } else + *rty_pinch = (localB->RateTransition1 > 92); + break; + + default: + /* During 'Start': ':170' */ + if (localDW->temporalCounter_i2 >= 6) { + /* Transition: ':171' */ + localDW->is_Sensing = + powerwindow_powerwindow_contr_IN_SensePinch; + } + break; + } + } + break; + } + } +} + +/* Initial conditions for referenced model: 'powerwindow_powerwindow_control' */ +void +powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW) { + /* InitializeConditions for Chart: '/stateflow control model' */ + localDW->is_active_Logic = 0U; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i1 = 0U; + localDW->is_active_Sensing = 0U; + localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i2 = 0U; + localDW->is_active_c2_PowerWindow_contro = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + *rty_window_up = false; + *rty_window_down = false; + *rty_overcurrent = false; + *rty_pinch = false; + *rty_wake = false; +} + +/* Start for referenced model: 'powerwindow_powerwindow_control' */ +void +powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW) { + /* Start for DiscretePulseGenerator: '/period of 50ms' */ + localDW->clockTickCounter = 0L; +} + +/* Output and update for referenced model: 'powerwindow_powerwindow_control' */ +void +powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE) { + powerwindow_int16_T rowIdx; + powerwindow_int16_T rtb_periodof50ms; + + /* DiscretePulseGenerator: '/period of 50ms' */ + rtb_periodof50ms = + (localDW->clockTickCounter < 5L) && (localDW->clockTickCounter >= 0L) + ? 1 + : 0; + if (localDW->clockTickCounter >= 9L) + localDW->clockTickCounter = 0L; + + else + localDW->clockTickCounter++; + + /* End of DiscretePulseGenerator: '/period of 50ms' */ + + /* Logic: '/Logical Operator' */ + localB->LogicalOperator = !*rtu_endofdetectionrange; + + /* RateTransition: '/Rate Transition1' */ + localB->RateTransition1 = *rtu_currentsense; + + /* CombinatorialLogic: '/map' */ + rowIdx = (powerwindow_int16_T) (((powerwindow_uint16_T) *rtu_up << 1) + + *rtu_down); + localB->map[0U] = rtCP_map_table[(powerwindow_uint16_T) rowIdx]; + localB->map[1U] = rtCP_map_table[rowIdx + 4U]; + localB->map[2U] = rtCP_map_table[rowIdx + 8U]; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* DataTypeConversion: '/Data Type Conversion' */ + if (((rtb_periodof50ms != 0) != + (localZCE->stateflowcontrolmodel_Trig_ZCE == powerwindow_POS_ZCSIG)) && + (localZCE->stateflowcontrolmodel_Trig_ZCE != + powerwindow_UNINITIALIZED_ZCSIG)) { + /* Gateway: PW_PSG/PWExternalClock/stateflow control model */ + if (localDW->temporalCounter_i1 < 63U) + localDW->temporalCounter_i1++; + + if (localDW->temporalCounter_i2 < 7U) + localDW->temporalCounter_i2++; + + powerwindow_powerwindow_con_broadcast_ticks( + rty_window_up, rty_window_down, rty_overcurrent, rty_pinch, + rty_wake, localB, localDW); + } + + localZCE->stateflowcontrolmodel_Trig_ZCE = + (powerwindow_uint8_T) (rtb_periodof50ms != 0 + ? (powerwindow_int16_T) powerwindow_POS_ZCSIG + : (powerwindow_int16_T) + powerwindow_ZERO_ZCSIG); + + /* End of DataTypeConversion: '/Data Type Conversion' */ +} + +/* Model initialize function */ +void +powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE) { + /* Registration code */ + + /* initialize error status */ + powerwindow_powerwindow_control_rtmSetErrorStatusPointer( + PowerWindow_control_M, rt_errorStatus); + + /* block I/O */ + (void) wcclib_memset(((void *) localB), 0, + sizeof(powerwindow_rtB_PowerWindow_control)); + + /* states (dwork) */ + (void) wcclib_memset((void *) localDW, 0, + sizeof(powerwindow_rtDW_PowerWindow_control)); + localZCE->stateflowcontrolmodel_Trig_ZCE = powerwindow_UNINITIALIZED_ZCSIG; +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.h new file mode 100644 index 0000000..3c2a072 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control.h @@ -0,0 +1,136 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PowerWindow_control_h_ +#define powerwindow_RTW_HEADER_PowerWindow_control_h_ +#ifndef powerwindow_powerWindow_control_COMMON_INCLUDES_ +#define powerwindow_powerWindow_control_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* PowerWindow_control_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* user code (top of header file) */ + +/* Block signals for model 'PowerWindow_control' */ +typedef struct { + powerwindow_uint8_T RateTransition1; /* '/Rate Transition1' */ + powerwindow_boolean_T LogicalOperator; /* '/Logical Operator' */ + powerwindow_boolean_T map[3]; /* '/map' */ +} powerwindow_rtB_PowerWindow_control; + +/* Block states (auto storage) for model 'PowerWindow_control' */ +typedef struct { + powerwindow_int32_T clockTickCounter; /* '/period of 50ms' */ + powerwindow_uint8_T + is_active_c2_PowerWindow_contro; /* '/stateflow control model' */ + powerwindow_uint8_T + is_c2_PowerWindow_control; /* '/stateflow control model' */ + powerwindow_uint8_T is_Up; /* '/stateflow control model' */ + powerwindow_uint8_T is_Down; /* '/stateflow control model' */ + powerwindow_uint8_T is_Logic; /* '/stateflow control model' */ + powerwindow_uint8_T is_active_Logic; /* '/stateflow control model' */ + powerwindow_uint8_T is_Sensing; /* '/stateflow control model' */ + powerwindow_uint8_T is_active_Sensing; /* '/stateflow control model' */ + powerwindow_uint8_T temporalCounter_i1; /* '/stateflow control model' */ + powerwindow_uint8_T temporalCounter_i2; /* '/stateflow control model' */ +} powerwindow_rtDW_PowerWindow_control; + +/* Zero-crossing (trigger) state for model 'PowerWindow_control' */ +typedef struct { + ZCSigState + stateflowcontrolmodel_Trig_ZCE; /* '/stateflow control model' */ +} powerwindow_rtZCE_PowerWindow_control; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PowerWindow_control { + const powerwindow_char_T **errorStatus; +}; + +typedef struct { + powerwindow_rtB_PowerWindow_control rtb; + powerwindow_rtDW_PowerWindow_control rtdw; + powerwindow_RT_MODEL_PowerWindow_control rtm; + powerwindow_rtZCE_PowerWindow_control rtzce; +} powerwindow_rtMdlrefDWork_PowerWindow_contr; + +/* Model reference registration function */ +void powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); +void powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW); +void powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW); +void powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'PowerWindow_control' + '' : 'PowerWindow_control/PW_PSG' + '' : 'PowerWindow_control/PW_PSG/PW_PSG' + '' : 'PowerWindow_control/PW_PSG/Tic' + '' : 'PowerWindow_control/PW_PSG/Toc' + '' : 'PowerWindow_control/PW_PSG/PW_PSG/stateflow control model' + '' : 'PowerWindow_control/PW_PSG/Tic/Tic_T' + '' : 'PowerWindow_control/PW_PSG/Toc/Toc_T' +*/ +#endif /* powerwindow_RTW_HEADER_PowerWindow_control_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_private.h new file mode 100644 index 0000000..2f301db --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_private.h @@ -0,0 +1,59 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PowerWindow_control_private_h_ +#define powerwindow_RTW_HEADER_PowerWindow_control_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_powerwindow_control_rtmGetErrorStatus +#define powerwindow_powerwindow_control_rtmGetErrorStatus(rtm) \ + (*((rtm)->errorStatus)) +#endif + +#ifndef powerwindow_powerwindow_control_rtmSetErrorStatus +#define powerwindow_powerwindow_control_rtmSetErrorStatus(rtm, val) \ + (*((rtm)->errorStatus) = (val)) +#endif + +#ifndef powerwindow_powerwindow_control_rtmGetErrorStatusPointer +#define powerwindow_powerwindow_control_rtmGetErrorStatusPointer(rtm) \ + (rtm)->errorStatus +#endif + +#ifndef powerwindow_powerwindow_control_rtmSetErrorStatusPointer +#define powerwindow_powerwindow_control_rtmSetErrorStatusPointer(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +extern const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[12]; + +#define rtCP_map_table \ + powerwindow_rtCP_pooled_6bUUQf1tASYw /* Computed Parameter: map_table \ + Referenced by: '/map' \ +*/ +#endif /* RTW_HEADER_PowerWindow_control_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_types.h new file mode 100644 index 0000000..9007156 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_powerwindow_control_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_control_types_h_ +#define powerwindow_RTW_HEADER_powerwindow_control_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PowerWindow_control + powerwindow_RT_MODEL_PowerWindow_control; + +#endif /* RTW_HEADER_powerwindow_control_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_continuous.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_continuous.h new file mode 100644 index 0000000..e5688e7 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_continuous.h @@ -0,0 +1,127 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtw_continuous.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___RTW_CONTINUOUS_H__ +#define powerwindow___RTW_CONTINUOUS_H__ + +// #include "../powerwindow_HeaderFiles/powerwindow_tmwtypes.h" + +/* For models registering MassMatrix */ +typedef enum { + SS_MATRIX_NONE, + SS_MATRIX_CONSTANT, + SS_MATRIX_TIMEDEP, + SS_MATRIX_STATEDEP +} powerwindow_ssMatrixType; + +typedef enum { + SOLVER_MODE_AUTO, /* only occurs in + mdlInitializeSizes/mdlInitializeSampleTimes */ + SOLVER_MODE_SINGLETASKING, + SOLVER_MODE_MULTITASKING +} powerwindow_SolverMode; + +typedef enum { MINOR_TIME_STEP, MAJOR_TIME_STEP } powerwindow_SimTimeStep; + +/* ============================================================================= + Model methods object + ============================================================================= +*/ +typedef void (*powerwindow_rtMdlInitializeSizesFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlInitializeSampleTimesFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlStartFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlOutputsFcn)(void *rtModel, + powerwindow_int_T tid); +typedef void (*powerwindow_rtMdlUpdateFcn)(void *rtModel, + powerwindow_int_T tid); +typedef void (*powerwindow_rtMdlDerivativesFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlProjectionFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlMassMatrixFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlForcingFunctionFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlTerminateFcn)(void *rtModel); +#ifdef RT_MALLOC +typedef real_T (*rtMdlDiscreteEventsFcn)( + void *pModel, powerwindow_int_T rtmNumSampTimes, void *rtmTimingData, + powerwindow_int_T *rtmSampleHitPtr, + powerwindow_int_T *rtmPerTaskSampleHits); +#endif + +typedef struct powerwindow__RTWRTModelMethodsInfo_tag { + void *rtModelPtr; + powerwindow_rtMdlInitializeSizesFcn rtmInitSizesFcn; + powerwindow_rtMdlInitializeSampleTimesFcn rtmInitSampTimesFcn; + powerwindow_rtMdlStartFcn rtmStartFcn; + powerwindow_rtMdlOutputsFcn rtmOutputsFcn; + powerwindow_rtMdlUpdateFcn rtmUpdateFcn; + powerwindow_rtMdlDerivativesFcn rtmDervisFcn; + powerwindow_rtMdlProjectionFcn rtmProjectionFcn; + powerwindow_rtMdlMassMatrixFcn rtmMassMatrixFcn; + powerwindow_rtMdlForcingFunctionFcn rtmForcingFunctionFcn; + powerwindow_rtMdlTerminateFcn rtmTerminateFcn; +#ifdef RT_MALLOC + rtMdlDiscreteEventsFcn rtmDiscreteEventsFcn; +#endif +} powerwindow_RTWRTModelMethodsInfo; + +#define rtmiSetRTModelPtr(M, rtmp) ((M).rtModelPtr = (rtmp)) +#define rtmiGetRTModelPtr(M) (M).rtModelPtr + +#define rtmiSetInitSizesFcn(M, fp) \ + ((M).rtmInitSizesFcn = ((powerwindow_rtMdlInitializeSizesFcn) (fp))) +#define rtmiSetInitSampTimesFcn(M, fp) \ + ((M).rtmInitSampTimesFcn = \ + ((powerwindow_rtMdlInitializeSampleTimesFcn) (fp))) +#define rtmiSetStartFcn(M, fp) \ + ((M).rtmStartFcn = ((powerwindow_rtMdlStartFcn) (fp))) +#define rtmiSetOutputsFcn(M, fp) \ + ((M).rtmOutputsFcn = ((powerwindow_rtMdlOutputsFcn) (fp))) +#define rtmiSetUpdateFcn(M, fp) \ + ((M).rtmUpdateFcn = ((powerwindow_rtMdlUpdateFcn) (fp))) +#define rtmiSetDervisFcn(M, fp) \ + ((M).rtmDervisFcn = ((powerwindow_rtMdlDerivativesFcn) (fp))) +#define rtmiSetProjectionFcn(M, fp) \ + ((M).rtmProjectionFcn = ((powerwindow_rtMdlProjectionFcn) (fp))) +#define rtmiSetMassMatrixFcn(M, fp) \ + ((M).rtmMassMatrixFcn = ((powerwindow_rtMdlMassMatrixFcn) (fp))) +#define rtmiSetForcingFunctionFcn(M, fp) \ + ((M).rtmForcingFunctionFcn = ((powerwindow_rtMdlForcingFunctionFcn) (fp))) +#define rtmiSetTerminateFcn(M, fp) \ + ((M).rtmTerminateFcn = ((powerwindow_rtMdlTerminateFcn) (fp))) +#ifdef RT_MALLOC +#define rtmiSetDiscreteEventsFcn(M, fp) \ + ((M).rtmDiscreteEventsFcn = ((rtMdlDiscreteEventsFcn) (fp))) +#endif + +#define rtmiInitializeSizes(M) ((*(M).rtmInitSizesFcn)((M).rtModelPtr)) +#define rtmiInitializeSampleTimes(M) \ + ((*(M).rtmInitSampTimesFcn)((M).rtModelPtr)) +#define rtmiStart(M) ((*(M).rtmStartFcn)((M).rtModelPtr)) +#define rtmiOutputs(M, tid) ((*(M).rtmOutputsFcn)((M).rtModelPtr, tid)) +#define rtmiUpdate(M, tid) ((*(M).rtmUpdateFcn)((M).rtModelPtr, tid)) +#define rtmiDerivatives(M) ((*(M).rtmDervisFcn)((M).rtModelPtr)) +#define rtmiProjection(M) ((*(M).rtmProjectionFcn)((M).rtModelPtr)) +#define rtmiMassMatrix(M) ((*(M).rtmMassMatrixFcn)((M).rtModelPtr)) +#define rtmiForcingFunction(M) ((*(M).rtmForcingFunctionFcn)((M).rtModelPtr)) +#define rtmiTerminate(M) ((*(M).rtmTerminateFcn)((M).rtModelPtr)) +#ifdef RT_MALLOC +#define rtmiDiscreteEvents(M, x1, x2, x3, x4) \ + ((*(M).rtmDiscreteEventsFcn)((M).rtModelPtr, (x1), (x2), (x3), (x4))) +#endif +#endif /* __RTW_CONTINUOUS_H__ */ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_solver.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_solver.h new file mode 100644 index 0000000..123fcff --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtw_solver.h @@ -0,0 +1,255 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtw_solver.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___RTW_SOLVER_H__ +#define powerwindow___RTW_SOLVER_H__ + +/* ============================================================================= + Solver object + ============================================================================= +*/ +#ifndef NO_FLOATS /* ERT integer-only */ +/* + Enum for solver tolerance +*/ +typedef enum { + SL_SOLVER_TOLERANCE_AUTO = 0, /* Set Automatically by Solver */ + SL_SOLVER_TOLERANCE_LOCAL = 1, /* Set Locally, e.g., by Blocks */ + SL_SOLVER_TOLERANCE_GLOBAL = 2, /* Set Globally, e.g., by Block Diagram */ + SL_SOLVER_TOLERANCE_UNDEFINED = 255 /* Signal uninitialized */ +} powerwindow_SL_SolverToleranceControlFlag_T; + +/* + Enum for jacobian method control +*/ +typedef enum { + SL_JM_BD_AUTO = 0, + SL_JM_BD_SPARSE_PERTURBATION, + SL_JM_BD_FULL_PERTURBATION, + SL_JM_BD_SPARSE_ANALYTICAL, + SL_JM_BD_FULL_ANALYTICAL +} powerwindow_slJmBdControl; + +typedef struct _ssSolverInfo_tag { + void *rtModelPtr; + + const char *solverName; + powerwindow_boolean_T isVariableStepSolver; + powerwindow_boolean_T solverNeedsReset; + + powerwindow_time_T solverStopTime; + powerwindow_time_T *stepSizePtr; + powerwindow_time_T minStepSize; + powerwindow_time_T maxStepSize; + powerwindow_time_T fixedStepSize; + + powerwindow_int_T solverShapePreserveControl; + powerwindow_int_T solverMaxConsecutiveMinStep; + powerwindow_int_T maxNumMinSteps; + powerwindow_int_T solverMaxOrder; + powerwindow_real_T solverConsecutiveZCsStepRelTol; + powerwindow_int_T solverMaxConsecutiveZCs; + + powerwindow_int_T solverExtrapolationOrder; + powerwindow_int_T solverNumberNewtonIterations; + + powerwindow_int_T solverRefineFactor; + powerwindow_real_T solverRelTol; + powerwindow_real_T unused_real_T_1; + + powerwindow_real_T **dXPtr; + powerwindow_time_T **tPtr; + + powerwindow_int_T *numContStatesPtr; + powerwindow_real_T **contStatesPtr; + + powerwindow_real_T *zcSignalVector; + powerwindow_uint8_T *zcEventsVector; + powerwindow_uint8_T *zcSignalAttrib; + powerwindow_int_T zcSignalVectorLength; + powerwindow_uint8_T *reserved; + + powerwindow_boolean_T foundContZcEvents; + powerwindow_boolean_T isAtLeftPostOfContZcEvent; + powerwindow_boolean_T isAtRightPostOfContZcEvent; + powerwindow_boolean_T adaptiveZcDetection; + + powerwindow_int_T numZcSignals; + + powerwindow_boolean_T stateProjection; + powerwindow_boolean_T robustResetMethod; /* user's preference */ + powerwindow_boolean_T updateJacobianAtReset; /* S-Fcn request (sticky) */ + powerwindow_boolean_T consistencyChecking; + + powerwindow_int_T massMatrixNzMax; + powerwindow_int_T *massMatrixIr; + powerwindow_int_T *massMatrixJc; + powerwindow_real_T *massMatrixPr; + + const powerwindow_char_T **errStatusPtr; + + powerwindow_real_T zcThreshold; + powerwindow_int_T zeroCrossAlgorithm; + powerwindow_int_T consecutiveZCsError; + + powerwindow_boolean_T isComputingJacobian; + powerwindow_slJmBdControl solverJacobianMethodControl; + powerwindow_int_T ignoredZcDiagnostic; + powerwindow_int_T maskedZcDiagnostic; + powerwindow_boolean_T isOutputMethodComputed; +} ssSolverInfo; + +/* Support old name RTWSolverInfo */ +typedef ssSolverInfo RTWSolverInfo; + +#define rtsiSetRTModelPtr(S, rtmp) ((S)->rtModelPtr = (rtmp)) +#define rtsiGetRTModelPtr(S) (S)->rtModelPtr + +#define rtsiSetSimTimeStepPtr(S, stp) ((S)->simTimeStepPtr = (stp)) +#define rtsiGetSimTimeStepPtr(S) ((S)->simTimeStepPtr) +#define rtsiGetSimTimeStep(S) *((S)->simTimeStepPtr) +#define rtsiSetSimTimeStep(S, st) (*((S)->simTimeStepPtr) = (st)) + +#define rtsiSetSolverData(S, sd) ((S)->solverData = (sd)) +#define rtsiGetSolverData(S) (S)->solverData + +#define rtsiSetSolverName(S, sn) ((S)->solverName = (sn)) +#define rtsiGetSolverName(S) (S)->solverName + +#define rtsiSetVariableStepSolver(S, vs) ((S)->isVariableStepSolver = (vs)) +#define rtsiIsVariableStepSolver(S) (S)->isVariableStepSolver + +#define rtsiSetSolverNeedsReset(S, sn) ((S)->solverNeedsReset = (sn)) +#define rtsiGetSolverNeedsReset(S) (S)->solverNeedsReset + +#define rtsiSetBlkStateChange(S, sn) ((S)->blkStateChange = (sn)) +#define rtsiGetBlkStateChange(S) (S)->blkStateChange + +#define rtsiSetSolverMode(S, sm) ((S)->solverMode = (sm)) +#define rtsiGetSolverMode(S) (S)->solverMode + +#define rtsiSetSolverStopTime(S, st) ((S)->solverStopTime = (st)) +#define rtsiGetSolverStopTime(S) (S)->solverStopTime + +#define rtsiSetStepSizePtr(S, ssp) ((S)->stepSizePtr = (ssp)) +#define rtsiSetStepSize(S, ss) (*((S)->stepSizePtr) = (ss)) +#define rtsiGetStepSize(S) *((S)->stepSizePtr) + +#define rtsiSetMinStepSize(S, ss) (((S)->minStepSize = (ss))) +#define rtsiGetMinStepSize(S) (S)->minStepSize + +#define rtsiSetMaxStepSize(S, ss) ((S)->maxStepSize = (ss)) +#define rtsiGetMaxStepSize(S) (S)->maxStepSize + +#define rtsiSetFixedStepSize(S, ss) ((S)->fixedStepSize = (ss)) +#define rtsiGetFixedStepSize(S) (S)->fixedStepSize + +#define rtsiSetMaxNumMinSteps(S, mns) ((S)->maxNumMinSteps = (mns)) +#define rtsiGetMaxNumMinSteps(S) (S)->maxNumMinSteps + +#define rtsiSetSolverMaxOrder(S, smo) ((S)->solverMaxOrder = (smo)) +#define rtsiGetSolverMaxOrder(S) (S)->solverMaxOrder + +#define rtsiSetSolverJacobianMethodControl(S, smcm) \ + (ssGetSolverInfo(S)->solverJacobianMethodControl = (smcm)) +#define rtsiGetSolverJacobianMethodControl(S) \ + ssGetSolverInfo(S)->solverJacobianMethodControl + +#define rtsiSetSolverShapePreserveControl(S, smcm) \ + (ssGetSolverInfo(S)->solverShapePreserveControl = (smcm)) +#define rtsiGetSolverShapePreserveControl(S) \ + ssGetSolverInfo(S)->solverShapePreserveControl + +#define rtsiSetSolverConsecutiveZCsStepRelTol(S, scr) \ + (ssGetSolverInfo(S)->solverConsecutiveZCsStepRelTol = (scr)) +#define rtsiGetSolverConsecutiveZCsStepRelTol(S) \ + ssGetSolverInfo(S)->solverConsecutiveZCsStepRelTol + +#define rtsiSetSolverMaxConsecutiveZCs(S, smcz) \ + (ssGetSolverInfo(S)->solverMaxConsecutiveZCs = (smcz)) +#define rtsiGetSolverMaxConsecutiveZCs(S) \ + ssGetSolverInfo(S)->solverMaxConsecutiveZCs + +#define rtsiSetSolverMaxConsecutiveMinStep(S, smcm) \ + (ssGetSolverInfo(S)->solverMaxConsecutiveMinStep = (smcm)) +#define rtsiGetSolverMaxConsecutiveMinStep(S) \ + ssGetSolverInfo(S)->solverMaxConsecutiveMinStep + +#define rtsiSetSolverExtrapolationOrder(S, seo) \ + ((S)->solverExtrapolationOrder = (seo)) +#define rtsiGetSolverExtrapolationOrder(S) (S)->solverExtrapolationOrder + +#define rtsiSetSolverNumberNewtonIterations(S, nni) \ + ((S)->solverNumberNewtonIterations = (nni)) +#define rtsiGetSolverNumberNewtonIterations(S) (S)->solverNumberNewtonIterations + +#define rtsiSetSolverRefineFactor(S, smo) ((S)->solverRefineFactor = (smo)) +#define rtsiGetSolverRefineFactor(S) (S)->solverRefineFactor + +#define rtsiSetSolverRelTol(S, smo) ((S)->solverRelTol = (smo)) +#define rtsiGetSolverRelTol(S) (S)->solverRelTol + +#define rtsiSetSolverMassMatrixType(S, type) ((S)->massMatrixType = (type)) +#define rtsiGetSolverMassMatrixType(S) (S)->massMatrixType + +#define rtsiSetSolverMassMatrixNzMax(S, nzMax) ((S)->massMatrixNzMax = (nzMax)) +#define rtsiGetSolverMassMatrixNzMax(S) (S)->massMatrixNzMax + +#define rtsiSetSolverMassMatrixIr(S, ir) ((S)->massMatrixIr = (ir)) +#define rtsiGetSolverMassMatrixIr(S) (S)->massMatrixIr + +#define rtsiSetSolverMassMatrixJc(S, jc) ((S)->massMatrixJc = (jc)) +#define rtsiGetSolverMassMatrixJc(S) (S)->massMatrixJc + +#define rtsiSetSolverMassMatrixPr(S, pr) ((S)->massMatrixPr = (pr)) +#define rtsiGetSolverMassMatrixPr(S) (S)->massMatrixPr + +#define rtsiSetdXPtr(S, dxp) ((S)->dXPtr = (dxp)) +#define rtsiSetdX(S, dx) (*((S)->dXPtr) = (dx)) +#define rtsiGetdX(S) *((S)->dXPtr) + +#define rtsiSetTPtr(S, tp) ((S)->tPtr = (tp)) +#define rtsiSetT(S, t) ((*((S)->tPtr))[0] = (t)) +#define rtsiGetT(S) (*((S)->tPtr))[0] + +#define rtsiSetContStatesPtr(S, cp) ((S)->contStatesPtr = (cp)) +#define rtsiGetContStates(S) *((S)->contStatesPtr) + +#define rtsiSetNumContStatesPtr(S, cp) ((S)->numContStatesPtr = (cp)) +#define rtsiGetNumContStates(S) *((S)->numContStatesPtr) + +#define rtsiSetErrorStatusPtr(S, esp) ((S)->errStatusPtr = (esp)) +#define rtsiSetErrorStatus(S, es) (*((S)->errStatusPtr) = (es)) +#define rtsiGetErrorStatus(S) *((S)->errStatusPtr) + +#define rtsiSetModelMethodsPtr(S, mmp) ((S)->modelMethodsPtr = (mmp)) +#define rtsiGetModelMethodsPtr(S) (S)->modelMethodsPtr + +#define rtsiSetSolverComputingJacobian(S, val) \ + ((S)->isComputingJacobian = (val)) +#define rtsiIsSolverComputingJacobian(S) (S)->isComputingJacobian + +#define rtsiSetSolverOutputComputed(S, val) \ + ((S)->isOutputMethodComputed = (val)) +#define rtsiIsSolverOutputComputed(S) (S)->isOutputMethodComputed + +#endif /* !NO_FLOATS */ + +#endif /* powerwindow___RTW_SOLVER_H__ */ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtwtypes.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtwtypes.h new file mode 100644 index 0000000..7d43f6e --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_rtwtypes.h @@ -0,0 +1,201 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtwtypes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow__RTWTYPES_H__ +#define powerwindow__RTWTYPES_H__ + +/* Logical type definitions */ +#if (!defined(__cplusplus)) +#ifndef false +#define false (0U) +#endif + +#ifndef true +#define true (1U) +#endif +#endif + +#define powerwindow__TMWTYPES__ + +/*=======================================================================* + Target hardware information + + Number of bits: char: 8 short: 16 int: 16 + long: 32 + native word size: 8 + Byte ordering: LittleEndian + Signed integer division rounds to: Zero + Shift right on a signed integer as arithmetic shift: on + =======================================================================*/ + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + powerwindow_real32_T, powerwindow_real64_T - 32 and 64 bit + floating point numbers + =======================================================================*/ +typedef signed char powerwindow_int8_T; +typedef unsigned char powerwindow_uint8_T; +typedef int powerwindow_int16_T; +typedef unsigned int powerwindow_uint16_T; +typedef long powerwindow_int32_T; +typedef unsigned long powerwindow_uint32_T; +typedef float powerwindow_real32_T; +typedef double powerwindow_real64_T; + +/*===========================================================================* + Generic type definitions: powerwindow_real_T, powerwindow_time_T, + powerwindow_boolean_T, powerwindow_int_T, powerwindow_uint_T, + powerwindow_ulong_T, powerwindow_char_T and + powerwindow_byte_T. + ===========================================================================*/ +typedef double powerwindow_real_T; +typedef double powerwindow_time_T; +typedef unsigned char powerwindow_boolean_T; +typedef int powerwindow_int_T; +typedef unsigned int powerwindow_uint_T; +typedef unsigned long powerwindow_ulong_T; +typedef char powerwindow_char_T; +typedef unsigned char powerwindow_uchar_T; +typedef powerwindow_char_T powerwindow_byte_T; + +/*===========================================================================* + Complex number type definitions + ===========================================================================*/ +#define powerwindow_CREAL_T + +typedef struct { + powerwindow_real32_T re; + powerwindow_real32_T im; +} powerwindow_creal32_T; + +typedef struct { + powerwindow_real64_T re; + powerwindow_real64_T im; +} powerwindow_creal64_T; + +typedef struct { + powerwindow_real_T re; + powerwindow_real_T im; +} powerwindow_creal_T; + +#define powerwindow_CINT8_T + +typedef struct { + powerwindow_int8_T re; + powerwindow_int8_T im; +} powerwindow_cint8_T; + +#define powerwindow_CUINT8_T + +typedef struct { + powerwindow_uint8_T re; + powerwindow_uint8_T im; +} powerwindow_cuint8_T; + +#define powerwindow_CINT16_T + +typedef struct { + powerwindow_int16_T re; + powerwindow_int16_T im; +} powerwindow_cint16_T; + +#define powerwindow_CUINT16_T + +typedef struct { + powerwindow_uint16_T re; + powerwindow_uint16_T im; +} powerwindow_cuint16_T; + +#define powerwindow_CINT32_T + +typedef struct { + powerwindow_int32_T re; + powerwindow_int32_T im; +} powerwindow_cint32_T; + +#define powerwindow_CUINT32_T + +typedef struct { + powerwindow_uint32_T re; + powerwindow_uint32_T im; +} powerwindow_cuint32_T; + +/*=======================================================================* + Min and Max: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + =======================================================================*/ +#define powerwindow_MAX_int8_T ((powerwindow_int8_T) (127)) +#define powerwindow_MIN_int8_T ((powerwindow_int8_T) (-128)) +#define powerwindow_MAX_uint8_T ((powerwindow_uint8_T) (255U)) +#define powerwindow_MIN_uint8_T ((powerwindow_uint8_T) (0U)) +#define powerwindow_MAX_int16_T ((powerwindow_int16_T) (32767)) +#define powerwindow_MIN_int16_T ((powerwindow_int16_T) (-32768)) +#define powerwindow_MAX_uint16_T ((powerwindow_uint16_T) (65535U)) +#define powerwindow_MIN_uint16_T ((powerwindow_uint16_T) (0U)) +#define powerwindow_MAX_int32_T ((powerwindow_int32_T) (2147483647)) +#define powerwindow_MIN_int32_T ((powerwindow_int32_T) (-2147483647 - 1)) +#define powerwindow_MAX_uint32_T ((powerwindow_uint32_T) (0xFFFFFFFFU)) +#define powerwindow_MIN_uint32_T ((powerwindow_uint32_T) (0U)) + +/* Block D-Work pointer type */ +typedef void *powerwindow_pointer_T; + +#define powerwindow_input_length 977 + +/* Simulink specific types */ +#ifndef powerwindow___ZERO_CROSSING_TYPES__ +#define powerwindow___ZERO_CROSSING_TYPES__ + +/* Trigger directions: falling, either, and rising */ +typedef enum { + FALLING_ZERO_CROSSING = -1, + ANY_ZERO_CROSSING = 0, + RISING_ZERO_CROSSING = 1 +} powerwindow_ZCDirection; + +/* Previous state of a trigger signal */ +typedef powerwindow_uint8_T ZCSigState; + +/* Initial value of a trigger zero crossing signal */ +#define powerwindow_UNINITIALIZED_ZCSIG 0x03U +#define powerwindow_NEG_ZCSIG 0x02U +#define powerwindow_POS_ZCSIG 0x01U +#define powerwindow_ZERO_ZCSIG 0x00U + +/* Current state of a trigger signal */ +typedef enum { + FALLING_ZCEVENT = -1, + NO_ZCEVENT = 0, + RISING_ZCEVENT = 1 +} powerwindow_ZCEventType; + +#endif /* powerwindow___ZERO_CROSSING_TYPES__ */ +#endif /* powerwindow__RTWTYPES_H__ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_tmwtypes.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_tmwtypes.h new file mode 100644 index 0000000..dd2dd07 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/powerwindow_tmwtypes.h @@ -0,0 +1,813 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_tmwtypes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#if defined(_MSC_VER) +#pragma once +#endif +#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)) +#pragma once +#endif + +#ifndef powerwindow_tmwtypes_h +#define powerwindow_tmwtypes_h + +#ifndef powerwindow__TMWTYPES__ +#define powerwindow__TMWTYPES__ +/* + File : tmwtypes.h + Abstract: + Data types for use with MATLAB/SIMULINK and the Real-Time Workshop. + + When compiling stand-alone model code, data types can be overridden + via compiler switches. + + Define NO_FLOATS to eliminate reference to powerwindow_real_T, etc. +*/ + +#define LOGICAL_IS_A_TYPE +#define SPARSE_GENERALIZATION + +#ifdef NO_FLOATS +#define double double_not_allowed +#define float float_not_allowed +#endif /*NO_FLOATS*/ + +/* + The following data types cannot be overridden when building MEX files. +*/ +#ifdef MATLAB_MEX_FILE +#undef CHARACTER_T +#undef INTEGER_T +#undef BOOLEAN_T +#undef REAL_T +#undef TIME_T +#endif + +/* + The powerwindow_uchar_T, powerwindow_ushort_T and powerwindow_ulong_T types + are needed for compilers which do not allow defines to be specified, at the + command line, with spaces in them. +*/ + +typedef unsigned char powerwindow_uchar_T; +typedef unsigned short powerwindow_ushort_T; +typedef unsigned long powerwindow_ulong_T; + +#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__x86_64__) || \ + defined(__LP64__) || defined(__LCC64__) + +typedef unsigned long long powerwindow_ulonglong_T; +#endif + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + powerwindow_real32_T, powerwindow_real64_T - 32 and 64 bit + floating point numbers + =======================================================================*/ + +/* When used with Real Time Workshop generated code, this + header file can be used with a variety of compilers. + + The compiler could be for an 8 bit embedded processor that + only had 8 bits per integer and 16 bits per long. + In that example, a 32 bit integer size is not even available. + This header file should be robust to that. + + For the case of an 8 bit processor, the preprocessor + may be limited to 16 bit math like its target. That limitation + would mean that 32 bit comparisons can't be done accurately. + To increase robustness to this, comparisons are done against + smaller values first. An inaccurate 32 bit comparison isn't + attempted if the 16 bit comparison has already succeeded. + + Limitations on preprocessor math can also be stricter than + for the target. There are known cases where a compiler + targeting processors with 64 bit longs can't do accurate + preprocessor comparisons on more than 32 bits. +*/ + +/* Determine the number of bits for int, long, short, and char. + If one fails to be determined, set the number of bits to -1 +*/ + +#ifndef TMW_BITS_PER_INT +#if INT_MAX == 0x7FL +#define TMW_BITS_PER_INT 8 +#elif INT_MAX == 0x7FFFL +#define TMW_BITS_PER_INT 16 +#elif INT_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_INT 32 +#else +#define TMW_BITS_PER_INT -1 +#endif +#endif + +#ifndef TMW_BITS_PER_LONG +#if LONG_MAX == 0x7FL +#define TMW_BITS_PER_LONG 8 +#elif LONG_MAX == 0x7FFFL +#define TMW_BITS_PER_LONG 16 +#elif LONG_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_LONG 32 +#else +#define TMW_BITS_PER_LONG -1 +#endif +#endif + +#ifndef TMW_BITS_PER_SHRT +#if SHRT_MAX == 0x7FL +#define TMW_BITS_PER_SHRT 8 +#elif SHRT_MAX == 0x7FFFL +#define TMW_BITS_PER_SHRT 16 +#elif SHRT_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_SHRT 32 +#else +#define TMW_BITS_PER_SHRT -1 +#endif +#endif + +#ifndef TMW_BITS_PER_SCHAR +#if SCHAR_MAX == 0x7FL +#define TMW_BITS_PER_SCHAR 8 +#elif SCHAR_MAX == 0x7FFFL +#define TMW_BITS_PER_SCHAR 16 +#elif SCHAR_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_SCHAR 32 +#else +#define TMW_BITS_PER_SCHAR -1 +#endif +#endif + +#ifndef TMW_CHAR_SIGNED +#if SCHAR_MAX == CHAR_MAX +#define TMW_CHAR_SIGNED 1 +#else +#define TMW_CHAR_SIGNED 0 +#endif +#endif + +/* It is common for one or more of the integer types + to be the same size. For example, on many embedded + processors, both shorts and ints are 16 bits. On + processors used for workstations, it is quite common + for both int and long to be 32 bits. + When there is more than one choice for typdef'ing + a portable type like powerwindow_int16_T or powerwindow_uint32_T, in + concept, it should not matter which choice is made. + However, some style guides and some code checking + tools do identify and complain about seemingly + irrelevant differences. For example, a code + checking tool may complain about an implicit + conversion from int to short even though both + are 16 bits. To reduce these types of + complaints, it is best to make int the + preferred choice when more than one is available. +*/ + +#ifndef INT8_T +#if TMW_BITS_PER_INT == 8 +#define INT8_T int +#elif TMW_BITS_PER_LONG == 8 +#define INT8_T long +#elif TMW_BITS_PER_SCHAR == 8 +#define INT8_T signed char +#elif TMW_BITS_PER_SHRT == 8 +#define INT8_T short +#endif +#endif +#ifdef INT8_T +typedef INT8_T powerwindow_int8_T; +#endif + +#ifndef UINT8_T +#if TMW_BITS_PER_INT == 8 +#define UINT8_T unsigned int +#elif TMW_BITS_PER_LONG == 8 +#define UINT8_T unsigned long +#elif TMW_BITS_PER_SCHAR == 8 +#define UINT8_T unsigned char +#elif TMW_BITS_PER_SHRT == 8 +#define UINT8_T unsigned short +#endif +#endif +#ifdef UINT8_T +typedef UINT8_T powerwindow_uint8_T; +#endif + +#ifndef INT16_T +#if TMW_BITS_PER_INT == 16 +#define INT16_T int +#elif TMW_BITS_PER_LONG == 16 +#define INT16_T long +#elif TMW_BITS_PER_SCHAR == 16 +#define INT16_T signed char +#elif TMW_BITS_PER_SHRT == 16 +#define INT16_T short +#endif +#endif +#ifdef INT16_T +typedef INT16_T powerwindow_int16_T; +#endif + +#ifndef UINT16_T +#if TMW_BITS_PER_INT == 16 +#define UINT16_T unsigned int +#elif TMW_BITS_PER_LONG == 16 +#define UINT16_T unsigned long +#elif TMW_BITS_PER_SCHAR == 16 +#define UINT16_T unsigned char +#elif TMW_BITS_PER_SHRT == 16 +#define UINT16_T unsigned short +#endif +#endif +#ifdef UINT16_T +typedef UINT16_T powerwindow_uint16_T; +#endif + +#ifndef INT32_T +#if TMW_BITS_PER_INT == 32 +#define INT32_T int +#elif TMW_BITS_PER_LONG == 32 +#define INT32_T long +#elif TMW_BITS_PER_SCHAR == 32 +#define INT32_T signed char +#elif TMW_BITS_PER_SHRT == 32 +#define INT32_T short +#endif +#endif +#ifdef INT32_T +typedef INT32_T powerwindow_int32_T; +#endif + +#ifndef UINT32_T +#if TMW_BITS_PER_INT == 32 +#define UINT32_T unsigned int +#elif TMW_BITS_PER_LONG == 32 +#define UINT32_T unsigned long +#elif TMW_BITS_PER_SCHAR == 32 +#define UINT32_T unsigned char +#elif TMW_BITS_PER_SHRT == 32 +#define UINT32_T unsigned short +#endif +#endif +#ifdef UINT32_T +typedef UINT32_T powerwindow_uint32_T; +#endif + +/* The following is used to emulate smaller integer types when only + larger types are available. For example, compilers for TI C3x/C4x DSPs + define char and short to be 32 bits, so 8 and 16 bits are not directly + available. This target is commonly used with RTW rapid prototyping. + Other DSPs define char to be 16 bits, so 8 bits is not directly + available. +*/ +#ifndef INT8_T +#ifdef INT16_T +#define INT8_T INT16_T +typedef INT8_T powerwindow_int8_T; +#else +#ifdef INT32_T +#define INT8_T INT32_T +typedef INT8_T powerwindow_int8_T; +#endif +#endif +#endif + +#ifndef UINT8_T +#ifdef UINT16_T +#define UINT8_T UINT16_T +typedef UINT8_T powerwindow_uint8_T; +#else +#ifdef UINT32_T +#define UINT8_T UINT32_T +typedef UINT8_T powerwindow_uint8_T; +#endif +#endif +#endif + +#ifndef INT16_T +#ifdef INT32_T +#define INT16_T INT32_T +typedef INT16_T powerwindow_int16_T; +#endif +#endif + +#ifndef UINT16_T +#ifdef UINT32_T +#define UINT16_T UINT32_T +typedef UINT16_T powerwindow_uint16_T; +#endif +#endif + +#ifndef NO_FLOATS + +#ifndef REAL32_T +#ifndef __MWERKS__ +#if FLT_MANT_DIG >= 23 +#define REAL32_T float +#endif +#else +#define REAL32_T float +#endif +#endif +#ifdef REAL32_T +typedef REAL32_T powerwindow_real32_T; +#endif + +#ifndef REAL64_T +#ifndef __MWERKS__ +#if DBL_MANT_DIG >= 52 +#define REAL64_T double +#endif +#else +#define REAL64_T double +#endif +#endif +#ifdef REAL64_T +typedef REAL64_T powerwindow_real64_T; +#endif + +#endif /* NO_FLOATS*/ + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int64_T - signed 64 bit integers + powerwindow_uint64_T - unsigned 64 bit integers + =======================================================================*/ + +#ifndef INT64_T +#if defined(__APPLE__) +#define INT64_T long long +#define FMT64 "ll" +#if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(__x86_64__) || defined(__LP64__) +#define INT64_T long +#define FMT64 "l" +#if !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) || \ + (defined(__WATCOMC__) && __WATCOMC__ >= 1100) +#define INT64_T __int64 +#define FMT64 "I64" +#elif defined(__GNUC__) || defined(TMW_ENABLE_INT64) || defined(__LCC64__) +#define INT64_T long long +#define FMT64 "ll" +#endif +#endif + +#if defined(INT64_T) +#if defined(__GNUC__) && \ + ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) +__extension__ +#endif + typedef INT64_T powerwindow_int64_T; +#endif + +#ifndef UINT64_T +#if defined(__APPLE__) +#define UINT64_T unsigned long long +#define FMT64 "ll" +#if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(__x86_64__) || defined(__LP64__) +#define UINT64_T unsigned long +#define FMT64 "l" +#if !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) || \ + (defined(__WATCOMC__) && __WATCOMC__ >= 1100) +#define UINT64_T unsigned __int64 +#define FMT64 "I64" +#elif defined(__GNUC__) || defined(TMW_ENABLE_INT64) || defined(__LCC64__) +#define UINT64_T unsigned long long +#define FMT64 "ll" +#endif +#endif + +#if defined(_WIN64) || (defined(__APPLE__) && defined(__LP64__)) || \ + defined(__x86_64__) || defined(__LP64__) +#define INT_TYPE_64_IS_SUPPORTED +#endif + +#if defined(UINT64_T) +#if defined(__GNUC__) && \ + ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) +__extension__ +#endif + typedef UINT64_T powerwindow_uint64_T; +#endif + +/*===========================================================================* + Format string modifiers for using powerwindow_size_t variables in printf + statements. + ===========================================================================*/ + +#ifndef FMT_SIZE_T +#if defined(__GNUC__) || defined(_STDC_C99) +#define FMT_SIZE_T "z" +#elif defined(__WATCOMC__) +#define FMT_SIZE_T "l" +#elif defined(_WIN32) +#define FMT_SIZE_T "I" +#else +#define FMT_SIZE_T "l" +#endif +#endif + +#ifndef FMT_PTRDIFF_T +#if defined(__APPLE__) +#define FMT_PTRDIFF_T "l" +#elif defined(__GNUC__) || defined(_STDC_C99) +#define FMT_PTRDIFF_T "t" +#elif defined(__WATCOMC__) +#define FMT_PTRDIFF_T "l" +#elif defined(_WIN32) +#define FMT_PTRDIFF_T "I" +#else +#define FMT_PTRDIFF_T "l" +#endif +#endif + +/*===========================================================================* + General or logical data types where the word size is not guaranteed. + powerwindow_real_T - possible settings include powerwindow_real32_T or + powerwindow_real64_T powerwindow_time_T - possible settings include + powerwindow_real64_T or powerwindow_uint32_T powerwindow_boolean_T + powerwindow_char_T + powerwindow_int_T + powerwindow_uint_T + powerwindow_byte_T + ===========================================================================*/ + +#ifndef NO_FLOATS + +#ifndef REAL_T +#ifdef REAL64_T +#define REAL_T powerwindow_real64_T +#else +#ifdef REAL32_T +#define REAL_T powerwindow_real32_T +#endif +#endif +#endif +#ifdef REAL_T +typedef REAL_T powerwindow_real_T; +#endif + +#ifndef TIME_T +#ifdef REAL_T +#define TIME_T powerwindow_real_T +#endif +#endif +#ifdef TIME_T +typedef TIME_T powerwindow_time_T; +#endif + +#endif /* NO_FLOATS */ + +#ifndef BOOLEAN_T +#if defined(UINT8_T) +#define BOOLEAN_T UINT8_T +#else +#define BOOLEAN_T unsigned int +#endif +#endif +typedef BOOLEAN_T powerwindow_boolean_T; + +#ifndef CHARACTER_T +#define CHARACTER_T char +#endif +typedef CHARACTER_T powerwindow_char_T; + +#ifndef INTEGER_T +#define INTEGER_T int +#endif +typedef INTEGER_T powerwindow_int_T; + +#ifndef UINTEGER_T +#define UINTEGER_T unsigned +#endif +typedef UINTEGER_T powerwindow_uint_T; + +#ifndef BYTE_T +#define BYTE_T unsigned char +#endif +typedef BYTE_T powerwindow_byte_T; + +/*===========================================================================* + Define Complex Structures + ===========================================================================*/ +#ifndef NO_FLOATS + +#ifndef CREAL32_T +#ifdef REAL32_T +typedef struct { + powerwindow_real32_T re, im; +} powerwindow_creal32_T; +#define CREAL32_T creal32_T +#endif +#endif + +#ifndef CREAL64_T +#ifdef REAL64_T +typedef struct { + powerwindow_real64_T re, im; +} powerwindow_creal64_T; +#define CREAL64_T powerwindow_creal64_T +#endif +#endif + +#ifndef CREAL_T +#ifdef REAL_T +typedef struct { + powerwindow_real_T re, im; +} powerwindow_creal_T; +#define CREAL_T powerwindow_creal_T +#endif +#endif + +#endif /* NO_FLOATS */ + +#ifndef CINT8_T +#ifdef INT8_T +typedef struct { + powerwindow_int8_T re, im; +} powerwindow_cint8_T; +#define CINT8_T powerwindow_cint8_T +#endif +#endif + +#ifndef CUINT8_T +#ifdef UINT8_T +typedef struct { + powerwindow_uint8_T re, im; +} powerwindow_cuint8_T; +#define CUINT8_T powerwindow_cuint8_T +#endif +#endif + +#ifndef CINT16_T +#ifdef INT16_T +typedef struct { + powerwindow_int16_T re, im; +} powerwindow_cint16_T; +#define CINT16_T powerwindow_cint16_T +#endif +#endif + +#ifndef CUINT16_T +#ifdef UINT16_T +typedef struct { + powerwindow_uint16_T re, im; +} powerwindow_cuint16_T; +#define CUINT16_T powerwindow_cuint16_T +#endif +#endif + +#ifndef CINT32_T +#ifdef INT32_T +typedef struct { + powerwindow_int32_T re, im; +} powerwindow_cint32_T; +#define CINT32_T powerwindow_cint32_T +#endif +#endif + +#ifndef CUINT32_T +#ifdef UINT32_T +typedef struct { + powerwindow_uint32_T re, im; +} powerwindow_cuint32_T; +#define CUINT32_T powerwindow_cuint32_T +#endif +#endif + +#ifndef CINT64_T +#ifdef INT64_T +typedef struct { + powerwindow_int64_T re, im; +} powerwindow_cint64_T; +#define CINT64_T powerwindow_cint64_T +#endif +#endif + +#ifndef CUINT64_T +#ifdef UINT64_T +typedef struct { + powerwindow_uint64_T re, im; +} powerwindow_cuint64_T; +#define CUINT64_T powerwindow_cuint64_T +#endif +#endif + +/*=======================================================================* + Min and Max: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + =======================================================================*/ + +#define powerwindow_MAX_int8_T ((powerwindow_int8_T) (127)) /* 127 */ +#define powerwindow_MIN_int8_T ((powerwindow_int8_T) (-128)) /* -128 */ +#define powerwindow_MAX_uint8_T ((powerwindow_uint8_T) (255)) /* 255 */ +#define powerwindow_MIN_uint8_T ((powerwindow_uint8_T) (0)) + +#define powerwindow_MAX_int16_T ((powerwindow_int16_T) (32767)) /* 32767 */ +#define powerwindow_MIN_int16_T ((powerwindow_int16_T) (-32768)) /* -32768 */ +#define powerwindow_MAX_uint16_T ((powerwindow_uint16_T) (65535)) /* 65535 */ +#define powerwindow_MIN_uint16_T ((powerwindow_uint16_T) (0)) + +#define powerwindow_MAX_int32_T \ + ((powerwindow_int32_T) (2147483647)) /* 2147483647 */ +#define powerwindow_MIN_int32_T \ + ((powerwindow_int32_T) (-2147483647 - 1)) /* -2147483648 */ +#define powerwindow_MAX_uint32_T \ + ((powerwindow_uint32_T) (0xFFFFFFFFU)) /* 4294967295 */ +#define powerwindow_MIN_uint32_T ((powerwindow_uint32_T) (0)) + +#if defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) || \ + (defined(__WATCOMC__) && __WATCOMC__ >= 1100) || defined(__LCC64__) +#ifdef INT64_T +#define powerwindow_MAX_int64_T ((powerwindow_int64_T) (9223372036854775807LL)) +#define powerwindow_MIN_int64_T \ + ((powerwindow_int64_T) (-9223372036854775807LL - 1LL)) +#endif +#ifdef UINT64_T +#define powerwindow_MAX_uint64_T \ + ((powerwindow_uint64_T) (0xFFFFFFFFFFFFFFFFULL)) +#define powerwindow_MIN_uint64_T ((powerwindow_uint64_T) (0)) +#endif +#else +#ifdef INT64_T +#ifdef INT_TYPE_64_IS_LONG +#define powerwindow_MAX_int64_T ((powerwindow_int64_T) (9223372036854775807L)) +#define powerwindow_MIN_int64_T \ + ((powerwindow_int64_T) (-9223372036854775807L - 1L)) +#else +#define powerwindow_MAX_int64_T ((powerwindow_int64_T) (9223372036854775807LL)) +#define powerwindow_MIN_int64_T \ + ((powerwindow_int64_T) (-9223372036854775807LL - 1LL)) +#endif +#endif +#ifdef UINT64_T +#ifdef INT_TYPE_64_IS_LONG +#define powerwindow_MAX_uint64_T ((powerwindow_uint64_T) (0xFFFFFFFFFFFFFFFFUL)) +#define powerwindow_MIN_uint64_T ((powerwindow_uint64_T) (0)) +#else +#define powerwindow_MAX_uint64_T \ + ((powerwindow_uint64_T) (0xFFFFFFFFFFFFFFFFULL)) +#define powerwindow_MIN_uint64_T ((powerwindow_uint64_T) (0)) +#endif +#endif +#endif + +#ifdef _MSC_VER +/* Conversion from unsigned __int64 to double is not implemented in windows + and results in a compile error, thus the value must first be cast to + signed __int64, and then to double. + + If the 64 bit int value is greater than 2^63-1, which is the signed int64 + max, the macro below provides a workaround for casting a uint64 value to a + double in windows. +*/ +#define uint64_to_double(u) \ + (((u) > _I64_MAX) \ + ? (double) (__int64) ((u) - _I64_MAX - 1) + (double) _I64_MAX + 1 \ + : (double) (__int64) (u)) + +/* The following inline function should only be used in the macro + double_to_uint64, as it only handles the specfic range of double between 2^63 + and 2^64-1 */ +__forceinline powerwindow_uint64_T double_to_uint64_helpe +r(double d) { + union double_to_uint64_union_type { + double dd; + powerwindow_uint64_T i64; + } di; + di.dd = d; + return (((di.i64 & 0x000fffffffffffff) | 0x0010000000000000) << 11); +} + +/* The largest double value that can be cast to uint64 in windows is the + signed int64 max, which is 2^63-1. The macro below provides + a workaround for casting large double values to uint64 in windows. +*/ +/* The magic number 18446744073709551616.0 is 2^64 */ +/* The magic number 9223372036854775808.0 is 2^63 */ +#define double_to_uint64(d) \ + (((d) >= 18446744073709551616.0) ? 0xffffffffffffffffULL \ + : ((d) < 0.0) ? 0ULL \ + : ((d) >= 9223372036854775808.0) ? double_to_uint64_helper(d) \ + : (unsigned __int64) (d)) +#else +#define uint64_to_double(u) ((double) (u)) +#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__TICCSC__) +/* double_to_uint64 defined only for MSVC and UNIX */ +#else +#define double_to_uint64(d) \ + (((d) > 0xffffffffffffffffULL) \ + ? (unsigned long long) 0xffffffffffffffffULL \ + : ((d) < 0) ? (unsigned long long) 0 \ + : (unsigned long long) (d)) +#endif +#endif + +#if !defined(__cplusplus) && !defined(__bool_true_false_are_defined) + +#ifndef _bool_T +#define _bool_T + +typedef powerwindow_boolean_T bool; + +#ifndef false +#define false (0) +#endif +#ifndef true +#define true (1) +#endif + +#endif /* _bool_T */ + +#endif /* !__cplusplus */ + +/* + This software assumes that the code is being compiled on a target using a + 2's complement representation for signed integer values. +*/ +#if ((SCHAR_MIN + 1) != -SCHAR_MAX) +#error \ + "This code must be compiled using a 2's complement representation for signed integer values" +#endif + +/* + Maximum length of a MATLAB identifier (function/variable/model) + including the null-termination character. +*/ +#define TMW_NAME_LENGTH_MAX 64 + +#ifdef MX_COMPAT_32 +typedef int powerwindow_mwSize; +typedef int powerwindow_mwIndex; +typedef int powerwindow_mwSignedIndex; +#else +typedef size_t powerwindow_mwSize; /* unsigned pointer-width integer */ +typedef size_t powerwindow_mwIndex; /* unsigned pointer-width integer */ +typedef ptrdiff_t + powerwindow_mwSignedIndex; /* a signed pointer-width integer */ +#endif + +#if (defined(_LP64) || defined(_WIN64)) && !defined(MX_COMPAT_32) +/* Currently 2^48 based on hardware limitations */ +#define powerwindow_MWSIZE_MAX 281474976710655UL +#define powerwindow_MWINDEX_MAX 281474976710655UL +#define powerwindow_MWSINDEX_MAX 281474976710655L +#define powerwindow_MWSINDEX_MIN -281474976710655L +#else +#define powerwindow_MWSIZE_MAX 2147483647UL +#define powerwindow_MWINDEX_MAX 2147483647UL +#define powerwindow_MWSINDEX_MAX 2147483647L +#define powerwindow_MWSINDEX_MIN -2147483647L +#endif +#define powerwindow_MWSIZE_MIN 0UL +#define powerwindow_MWINDEX_MIN 0UL + +/** UTF-16 character type */ + +#if (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + (defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && \ + _HAS_CHAR16_T_LANGUAGE_SUPPORT) +typedef char16_t powerwindow_CHAR16_T; +#elif defined(_MSC_VER) +typedef wchar_t powerwindow_CHAR16_T; +#else +typedef UINT16_T powerwindow_CHAR16_T; +#endif + +#endif /* powerwindow__TMWTYPES__ */ + +#endif /* powerwindow_tmwtypes_h */ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.c new file mode 100644 index 0000000..21e0db0 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.c @@ -0,0 +1,16 @@ +#include "wcclib.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void * +wcclib_memset(void *s, int c, size_t n) { + unsigned char *p = s; + + __pragma_loopbound(1, 368); + while (n--) + *p++ = (unsigned char) c; + return (s); +} diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.h new file mode 100644 index 0000000..9f0553a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/default/wcclib.h @@ -0,0 +1,15 @@ + +#ifndef _WCCLIB +#define _WCCLIB + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#define NULL ((void *) 0) + +void *wcclib_memset(void *s, int c, size_t n); + +#endif // _WCCLIB diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.c new file mode 100644 index 0000000..81d5c95 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.c @@ -0,0 +1,819 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow implement the powerwindow that can be seen in cars + nowadays. The window can be controlled by either driver or passenger. When an + object is detected between the window frame and the glass during the raising + of the glass, the glass will lower down for some distance. This benchmark + contains 4 tasks which includes the driver side powerwindow, front passenger + side powerwindow, back-left passenger side powerwindow, back-right passenger + side powerwindow. These 4 tasks can be easily adjusted to execute in + sequential order parallel on single or muti core. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow.c + + Changes: a brief summary of major functional changes and formatting) + * 2023-12-07: Added loop bounds + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h" +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion.h" /* Control Model's header file */ +#include "powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" /* PW passenger control Model's header file */ +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "powerwindow_PW_Control_DRV.c" +#include "powerwindow_PW_Control_PSG_BackL.c" +#include "powerwindow_PW_Control_PSG_BackR.c" +#include "powerwindow_PW_Control_PSG_Front.c" +#include "powerwindow_const_params.c" +#include "powerwindow_controlexclusion.c" +#include "powerwindow_debounce.c" +#include "powerwindow_inputs.c" +#include "powerwindow_powerwindow_control.c" +#include "wcclib.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +powerwindow_Booleaninputarray_initialize(powerwindow_boolean_T *, + powerwindow_boolean_T *); +__attribute__((always_inline)) static inline void +powerwindow_Uint8inputarray_initialize(powerwindow_uint8_T *, + powerwindow_uint8_T *); +__attribute__((always_inline)) static inline void powerwindow_init(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +powerwindow_main(); +__attribute__((always_inline)) static inline int powerwindow_return(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +// DRV +__attribute__((always_inline)) static inline void powerwindow_init_DRV(int); +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_DRV(void); +__attribute__((always_inline)) static inline void +powerwindow_initialize_DRV(void); +__attribute__((always_inline)) static inline void powerwindow_return_DRV(void); +__attribute__((always_inline)) static inline void powerwindow_DRV_main(void); + +// PSG_Front +__attribute__((always_inline)) static inline void +powerwindow_init_PSG_Front(int); +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_PSG_Front(void); +__attribute__((always_inline)) static inline void +powerwindow_initialize_PSG_Front(void); +__attribute__((always_inline)) static inline void +powerwindow_return_PSG_Front(void); +__attribute__((always_inline)) static inline void +powerwindow_PSG_Front_main(void); + +// PSG_BackL +__attribute__((always_inline)) static inline void +powerwindow_init_PSG_BackL(int); +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_PSG_BackL(void); +__attribute__((always_inline)) static inline void +powerwindow_initialize_PSG_BackL(void); +__attribute__((always_inline)) static inline void +powerwindow_return_PSG_BackL(void); +__attribute__((always_inline)) static inline void +powerwindow_PSG_BackL_main(void); + +// PSG_BackR +__attribute__((always_inline)) static inline void +powerwindow_init_PSG_BackR(int); +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_PSG_BackR(void); +__attribute__((always_inline)) static inline void +powerwindow_initialize_PSG_BackR(void); +__attribute__((always_inline)) static inline void +powerwindow_return_PSG_BackR(void); +__attribute__((always_inline)) static inline void +powerwindow_PSG_BackR_main(void); + +/* + Declaration of global variables +*/ + +/* External inputs (root inport signals with auto storage) */ + +extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; +extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; +extern powerwindow_ExternalInputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_U; +extern powerwindow_ExternalInputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_U; +extern powerwindow_ExternalInputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_U; + +powerwindow_boolean_T + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV[powerwindow_input_length]; +powerwindow_boolean_T + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV[powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Up_Input_Front + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Down_Input_Front + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Up_Input_BackL + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Down_Input_BackL + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Up_Input_BackR + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Down_Input_BackR + [powerwindow_input_length]; +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV + [powerwindow_input_length]; +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_DRV + [powerwindow_input_length]; + +extern powerwindow_boolean_T + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array + [powerwindow_input_length]; +extern powerwindow_uint8_T + powerwindow_powerwindow_control_U_currentsense_DRV_Array + [powerwindow_input_length]; + +powerwindow_boolean_T powerwindow_controlexclusion_U_Up_DRV_Input_Front + [powerwindow_input_length]; /* Here applied a push-down button, the signal + is high when the button is not pressed. */ +powerwindow_boolean_T powerwindow_controlexclusion_U_Down_DRV_Input_Front + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Up_Input_Front + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Down_Input_Front + [powerwindow_input_length]; +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front + [powerwindow_input_length]; +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_Front + [powerwindow_input_length]; + +extern powerwindow_boolean_T + powerwindow_debounce_passenger_Front_U_Up_Front_Array + [powerwindow_input_length]; /* Here applied a push-down button, the + signal is high when the button is not + pressed. */ +extern powerwindow_boolean_T + powerwindow_debounce_passenger_Front_U_Down_Front_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array + [powerwindow_input_length]; +extern powerwindow_uint8_T + powerwindow_powerwindow_control_U_currentsense_Front_Array + [powerwindow_input_length]; + +powerwindow_boolean_T powerwindow_controlexclusion_U_Up_DRV_Input_BackL + [powerwindow_input_length]; /* Here applied a push-down button, the signal + is high when the button is not pressed. */ +powerwindow_boolean_T powerwindow_controlexclusion_U_Down_DRV_Input_BackL + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Up_Input_BackL + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Down_Input_BackL + [powerwindow_input_length]; +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL + [powerwindow_input_length]; +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_BackL + [powerwindow_input_length]; + +extern powerwindow_boolean_T + powerwindow_debounce_passenger_BackL_U_Up_BackL_Array + [powerwindow_input_length]; /* Here applied a push-down button, the + signal is high when the button is not + pressed. */ +extern powerwindow_boolean_T + powerwindow_debounce_passenger_BackL_U_Down_BackL_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array + [powerwindow_input_length]; +extern powerwindow_uint8_T + powerwindow_powerwindow_control_U_currentsense_BackL_Array + [powerwindow_input_length]; + +powerwindow_boolean_T powerwindow_controlexclusion_U_Up_DRV_Input_BackR + [powerwindow_input_length]; /* Here applied a push-down button, the signal + is high when the button is not pressed. */ +powerwindow_boolean_T powerwindow_controlexclusion_U_Down_DRV_Input_BackR + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Up_Input_BackR + [powerwindow_input_length]; +powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Down_Input_BackR + [powerwindow_input_length]; +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR + [powerwindow_input_length]; +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Input_BackR + [powerwindow_input_length]; + +extern powerwindow_boolean_T + powerwindow_debounce_passenger_BackR_U_Up_BackR_Array + [powerwindow_input_length]; /* Here applied a push-down button, the + signal is high when the button is not + pressed. */ +extern powerwindow_boolean_T + powerwindow_debounce_passenger_BackR_U_Down_BackR_Array + [powerwindow_input_length]; +extern powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array + [powerwindow_input_length]; +extern powerwindow_uint8_T + powerwindow_powerwindow_control_U_currentsense_BackR_Array + [powerwindow_input_length]; + +int powerwindow_main_inputcyclecounter; + +/* + Initialization- and return-value-related functions +*/ +__attribute__((always_inline)) static inline void +powerwindow_init_DRV(int i) { + powerwindow_PW_Control_DRV_U.In1 = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + powerwindow_PW_Control_DRV_U.In3 = + powerwindow_powerwindow_control_U_currentsense_Input_DRV + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ + + powerwindow_PW_Control_DRV_U.In2 = + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In4 = + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + + powerwindow_PW_Control_DRV_U.In5 = + powerwindow_debounce_Driver_Front_U_Up_Input_Front + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In6 = + powerwindow_debounce_Driver_Front_U_Down_Input_Front + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + + powerwindow_PW_Control_DRV_U.In9 = + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In10 = + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + + powerwindow_PW_Control_DRV_U.In7 = + powerwindow_debounce_Driver_BackR_U_Up_Input_BackR + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In8 = + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR + [i]; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ +} + +__attribute__((always_inline)) static inline void +powerwindow_init_PSG_Front(int i) { + + powerwindow_PW_Control_PSG_Front_U.Up_DRV = + powerwindow_PW_Control_DRV_Y + .Out6; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_Front_U.Down_DRV = + powerwindow_PW_Control_DRV_Y + .Out7; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front = + powerwindow_debounce_passenger_Front_U_Up_Input_Front[i]; + powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front = + powerwindow_debounce_passenger_Front_U_Down_Input_Front + [i]; /* '/Down'. Here applied a push-down button, the signal + is high when the button is not pressed. Change to 0 to lower + the window. */ + + powerwindow_PW_Control_PSG_Front_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_Front_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_Front + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ +} + +__attribute__((always_inline)) static inline void +powerwindow_init_PSG_BackL(int i) { + + powerwindow_PW_Control_PSG_BackL_U.Up_DRV = + powerwindow_PW_Control_DRV_Y + .Out10; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_BackL_U.Down_DRV = + powerwindow_PW_Control_DRV_Y + .Out11; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lower the window. + */ + + powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL = + powerwindow_debounce_passenger_BackL_U_Up_Input_BackL[i]; + powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL = + powerwindow_debounce_passenger_BackL_U_Down_Input_BackL + [i]; /* '/Down'. Here applied a push-down button, the signal + is high when the button is not pressed. Change to 0 to lower + the window. */ + + powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_BackL_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_BackL + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ +} + +__attribute__((always_inline)) static inline void +powerwindow_init_PSG_BackR(int i) { + + powerwindow_PW_Control_PSG_BackR_U.Up_DRV = + powerwindow_PW_Control_DRV_Y + .Out8; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_BackR_U.Down_DRV = + powerwindow_PW_Control_DRV_Y + .Out9; /* The debounced control signal from the driver. 1 when the + button is not pressed, change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR = + powerwindow_debounce_passenger_BackR_U_Up_Input_BackR[i]; + powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR = + powerwindow_debounce_passenger_BackR_U_Down_Input_BackR + [i]; /* '/Down'. Here applied a push-down button, the signal + is high when the button is not pressed. Change to 0 to lower + the window. */ + + powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR + [i]; /* The when the window reaches the end of the range, the + endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_BackR_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_BackR + [i]; /* When the currentsense is higher than 92 (based on + experiments), one object is stuck between the window and the + frame. Pinch is set to True.*/ +} + +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_DRV(void) { + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV, + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV, + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_Front_U_Up_Input_Front, + powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_Front_U_Down_Input_Front, + powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL, + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL, + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL, + powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR, + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array); + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV, + powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array); + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_DRV_Array, + powerwindow_powerwindow_control_U_currentsense_DRV_Array); +} + +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_PSG_Front(void) { + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_Front_U_Up_Input_Front, + powerwindow_debounce_passenger_Front_U_Up_Front_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_Front_U_Down_Input_Front, + powerwindow_debounce_passenger_Front_U_Down_Front_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front, + powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_Front, + powerwindow_powerwindow_control_U_currentsense_Front_Array); +} + +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_PSG_BackL(void) { + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackL_U_Up_Input_BackL, + powerwindow_debounce_passenger_BackL_U_Up_BackL_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackL_U_Down_Input_BackL, + powerwindow_debounce_passenger_BackL_U_Down_BackL_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL, + powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_BackL, + powerwindow_powerwindow_control_U_currentsense_BackL_Array); +} + +__attribute__((always_inline)) static inline void +powerwindow_input_initialize_PSG_BackR(void) { + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackR_U_Up_Input_BackR, + powerwindow_debounce_passenger_BackR_U_Up_BackR_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackR_U_Down_Input_BackR, + powerwindow_debounce_passenger_BackR_U_Down_BackR_Array); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR, + powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_BackR, + powerwindow_powerwindow_control_U_currentsense_BackR_Array); +} + +__attribute__((always_inline)) static inline void +powerwindow_Booleaninputarray_initialize(powerwindow_boolean_T *arrayA, + powerwindow_boolean_T *arrayB) { + + register int i; + __pragma_loopbound(977, 977); + for (i = 0; i < powerwindow_input_length; i++) + arrayA[i] = arrayB[i]; +} + +__attribute__((always_inline)) static inline void +powerwindow_Uint8inputarray_initialize(powerwindow_uint8_T *arrayA, + powerwindow_uint8_T *arrayB) { + + register int i; + __pragma_loopbound(977, 977); + for (i = 0; i < powerwindow_input_length; i++) + arrayA[i] = arrayB[i]; +} + +__attribute__((always_inline)) static inline void +powerwindow_initialize_DRV(void) { + /* Initialize model */ + powerwindow_PW_Control_DRV_initialize(); +} + +__attribute__((always_inline)) static inline void +powerwindow_initialize_PSG_Front(void) { + /* Initialize model */ + powerwindow_PW_Control_PSG_Front_initialize(); +} + +__attribute__((always_inline)) static inline void +powerwindow_initialize_PSG_BackL(void) { + /* Initialize model */ + powerwindow_PW_Control_PSG_BackL_initialize(); +} + +__attribute__((always_inline)) static inline void +powerwindow_initialize_PSG_BackR(void) { + /* Initialize model */ + powerwindow_PW_Control_PSG_BackR_initialize(); +} + +__attribute__((always_inline)) static inline void +powerwindow_return_DRV(void) { + /* Terminate model */ + powerwindow_PW_Control_DRV_terminate(); +} + +__attribute__((always_inline)) static inline void +powerwindow_return_PSG_Front(void) { + /* Terminate model */ + powerwindow_PW_Control_PSG_Front_terminate(); +} + +__attribute__((always_inline)) static inline void +powerwindow_return_PSG_BackL(void) { + /* Terminate model */ + powerwindow_PW_Control_PSG_BackL_terminate(); +} + +__attribute__((always_inline)) static inline void +powerwindow_return_PSG_BackR(void) { + /* Terminate model */ + powerwindow_PW_Control_PSG_BackR_terminate(); +} + +/* + Main functions +*/ + +/* + Associating powerwindow_main with a real-time clock or interrupt service + routine is what makes the generated code "real-time". The function + powerwindow_main is always associated with the base rate of the model. + Subrates are managed by the base rate from inside the generated code. + Enabling/disabling interrupts and floating point context switches are target + specific. This example code indicates where these should take place relative + to executing the generated code step function. Overrun behavior should be + tailored to your application needs. This example simply sets an error status + in the real-time model and returns from powerwindow_main. +*/ + +__attribute__((always_inline)) static inline void +powerwindow_DRV_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_DRV_rtmSetErrorStatus(powerwindow_PW_Control_DRV_M, + "Overrun"); ////////// + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_DRV_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +/* + The example "main" function illustrates what is required by your + application code to initialize, execute, and terminate the generated code. + Attaching powerwindow_main to a real-time clock is target specific. This + example illustates how you do this relative to initializing the model. +*/ + +__attribute__((always_inline)) static inline void +powerwindow_PSG_Front_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_PSG_Front_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_Front_M, "Overrun"); + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_PSG_Front_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +__attribute__((always_inline)) static inline void +powerwindow_PSG_BackL_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_PSG_BackL_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackL_M, "Overrun"); + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_PSG_BackL_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +__attribute__((always_inline)) static inline void +powerwindow_PSG_BackR_main(void) { + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if (OverrunFlag) { + powerwindow_PW_PSG_BackR_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackR_M, "Overrun"); + + return; + } + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + powerwindow_PW_Control_PSG_BackR_main(); + + /* Get model outputs here */ + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ +} + +__attribute__((always_inline)) static inline void +powerwindow_init(void) { + powerwindow_initialize_DRV(); + powerwindow_initialize_PSG_Front(); + powerwindow_initialize_PSG_BackL(); + powerwindow_initialize_PSG_BackR(); + powerwindow_main_inputcyclecounter = 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +powerwindow_main(void) { + /* Attach powerwindow_main to a timer or interrupt service routine with + period 0.005 seconds (the model's base sample time) here. The + call syntax for powerwindow_main is + + powerwindow_main(); + */ + // Task 1: Driver side window + + powerwindow_input_initialize_DRV(); + powerwindow_input_initialize_PSG_Front(); + powerwindow_input_initialize_PSG_BackL(); + powerwindow_input_initialize_PSG_BackR(); + + __pragma_loopbound(977, 977); + while (powerwindow_main_inputcyclecounter < powerwindow_input_length) { + + powerwindow_init_DRV(powerwindow_main_inputcyclecounter); + powerwindow_DRV_main(); + + // Task 2: Front passenger side window + + powerwindow_init_PSG_Front(powerwindow_main_inputcyclecounter); + powerwindow_PSG_Front_main(); + + // Task 3: Back left passenger side window + + powerwindow_init_PSG_BackL(powerwindow_main_inputcyclecounter); + powerwindow_PSG_BackL_main(); + + // Task 4: Back right passenger side window + + powerwindow_init_PSG_BackR(powerwindow_main_inputcyclecounter); + powerwindow_PSG_BackR_main(); + + powerwindow_main_inputcyclecounter++; + } +} + +__attribute__((always_inline)) static inline int +powerwindow_return(void) { + powerwindow_return_DRV(); + powerwindow_return_PSG_Front(); + powerwindow_return_PSG_BackL(); + powerwindow_return_PSG_BackR(); + + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + powerwindow_init(); + powerwindow_main(); + return powerwindow_return(); +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.h new file mode 100644 index 0000000..21cc536 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow.h @@ -0,0 +1,23 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef NULL +#define NULL ((viod *) 0) +#endif diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.c new file mode 100644 index 0000000..ab26941 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.c @@ -0,0 +1,331 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of driver side + powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_terminate(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_powerwindow_PW_Control_D powerwindow_PW_Control_DR_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_DRV powerwindow_PW_Control_DRV_M_; +powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M = + &powerwindow_PW_Control_DRV_M_; + +/* Model step function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_Debounce_Up_DRV; + powerwindow_boolean_T rtb_Debounce_Down_DRV; + + /* ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In2, &rtb_Debounce_Up_DRV, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In4, &rtb_Debounce_Down_DRV, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In9, &powerwindow_PW_Control_DRV_Y.Out10, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In10, &powerwindow_PW_Control_DRV_Y.Out11, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1 + .rtzce)); + + /* ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In5, &powerwindow_PW_Control_DRV_Y.Out6, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In6, &powerwindow_PW_Control_DRV_Y.Out7, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1 + .rtzce)); + + /* ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In7, &powerwindow_PW_Control_DRV_Y.Out8, + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce)); + + /* ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_DRV_U.In8, &powerwindow_PW_Control_DRV_Y.Out9, + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1 + .rtzce)); + + /* ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_main( + &rtb_Debounce_Up_DRV, &rtb_Debounce_Down_DRV, + &powerwindow_PW_Control_DRV_U.In1, &powerwindow_PW_Control_DRV_U.In3, + &powerwindow_PW_Control_DRV_Y.Out1, &powerwindow_PW_Control_DRV_Y.Out2, + &powerwindow_PW_Control_DRV_Y.Out3, &powerwindow_PW_Control_DRV_Y.Out4, + &powerwindow_PW_Control_DRV_Y.Out5, + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce)); +} + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_initialize(void) { + /* Registration code */ + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_DR_DWork, 0, + sizeof(powerwindow_D_Work_powerwindow_PW_Control_D)); + + /* external inputs */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_DRV_U, 0, + sizeof(powerwindow_ExternalInputs_powerwindow_PW_C)); + + /* external outputs */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_DRV_Y, 0, + sizeof(powerwindow_ExternalOutputs_powerwindow_PW_)); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Down_DRV' + */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1 + .rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1 + .rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1 + .rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Up_DRV' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: + * '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_DRV' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtm), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw), + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce)); + + /* Start for ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw)); + + /* Start for ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_Start( + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw)); + + /* SystemInitialize for ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_DRV_Y.Out1, &powerwindow_PW_Control_DRV_Y.Out2, + &powerwindow_PW_Control_DRV_Y.Out3, &powerwindow_PW_Control_DRV_Y.Out4, + &powerwindow_PW_Control_DRV_Y.Out5, + &(powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw)); +} + +/* Model terminate function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.h new file mode 100644 index 0000000..5b88bf7 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV.h @@ -0,0 +1,157 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_ +#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_ +#ifndef powerwindow_PW_Control_DRV_COMMON_INCLUDES_ +#define powerwindow_PW_Control_DRV_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_DRV_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_DRV_rtmGetErrorStatus +#define powerwindow_PW_DRV_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_DRV_rtmSetErrorStatus +#define powerwindow_PW_DRV_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_DRV_rtmGetErrorStatusPointer +#define powerwindow_PW_DRV_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DRV_DWORK1; /* '/Debounce_Up_DRV' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DRV_DWORK1; /* '/Debounce_Down_DRV' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_BackL_DWORK1; /* '/Debounce_Up_PSG_BackL' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_BackL_DWORK1; /* '/Debounce_Down_PSG_BackL' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_Front_DWORK1; /* '/Debounce_Up_PSG_Front' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_Front_DWORK1; /* '/Debounce_Down_PSG_Front' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_BackR_DWORK1; /* '/Debounce_Up_PSG_BackR' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_BackR_DWORK1; /* '/Debounce_Down_PSG_BackR' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_DRV_DWORK1; /* '/PW_DRV' */ +} powerwindow_D_Work_powerwindow_PW_Control_D; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T In1; /* '/In1' */ + powerwindow_boolean_T In2; /* '/In2' */ + powerwindow_uint8_T In3; /* '/In3' */ + powerwindow_boolean_T In4; /* '/In4' */ + powerwindow_boolean_T In5; /* '/In5' */ + powerwindow_boolean_T In6; /* '/In6' */ + powerwindow_boolean_T In7; /* '/In7' */ + powerwindow_boolean_T In8; /* '/In8' */ + powerwindow_boolean_T In9; /* '/In9' */ + powerwindow_boolean_T In10; /* '/In10' */ +} powerwindow_ExternalInputs_powerwindow_PW_C; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Out1; /* '/Out1' */ + powerwindow_boolean_T Out2; /* '/Out2' */ + powerwindow_boolean_T Out3; /* '/Out3' */ + powerwindow_boolean_T Out4; /* '/Out4' */ + powerwindow_boolean_T Out5; /* '/Out5' */ + powerwindow_boolean_T Out6; /* '/Out6' */ + powerwindow_boolean_T Out7; /* '/Out7' */ + powerwindow_boolean_T Out8; /* '/Out8' */ + powerwindow_boolean_T Out9; /* '/Out9' */ + powerwindow_boolean_T Out10; /* '/Out10' */ + powerwindow_boolean_T Out11; /* '/Out11' */ +} powerwindow_ExternalOutputs_powerwindow_PW_; + +struct powerwindow_tag_RTM_PW_Control_DRV { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_powerwindow_PW_Control_D + powerwindow_PW_Control_DR_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; + +/* Model entry point functions */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_main(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_DRV_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/powerwindow_PW_Control_DRV') - opens subsystem + PowerWindow/powerwindow_PW_Control_DRV + hilite_system('PowerWindow/powerwindow_PW_Control_DRV/Kp') - opens and + selects block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/powerwindow_PW_Control_DRV' + '' : 'PowerWindow/powerwindow_PW_Control_DRV/Debounce_DRV' +*/ +#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_private.h new file mode 100644 index 0000000..e25af80 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ +#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_types.h new file mode 100644 index 0000000..4fffdd6 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_DRV_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_DRV_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_DRV_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_DRV + powerwindow_RT_MODEL_PW_Control_DRV; + +#endif /* RTW_HEADER_PW_Control_DRV_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.c new file mode 100644 index 0000000..f1138c8 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.c @@ -0,0 +1,195 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of back-left passenger + side powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_terminate(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_M_; +powerwindow_RT_MODEL_PW_Control_PSG_BackL *const + powerwindow_PW_Control_PSG_BackL_M = &powerwindow_PW_Control_PSG_BackL_M_; + +/* Model step function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL, &rtb_debounce_Up, + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce)); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL, &rtb_debounce_Down, + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce)); + + /* ModelReference: '/ControlEx_PSG_BackL' */ + powerwindow_controlexclusion_main( + &powerwindow_PW_Control_PSG_BackL_U.Up_DRV, + &powerwindow_PW_Control_PSG_BackL_U.Down_DRV, &rtb_debounce_Up, + &rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_BackL_o1, + &powerwindow_rtb_ControlEx_PSG_BackL_o2); + + /* ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_BackL_o1, + &powerwindow_rtb_ControlEx_PSG_BackL_o2, + &powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_BackL_U.currentsense, + &powerwindow_PW_Control_PSG_BackL_Y.window_up, + &powerwindow_PW_Control_PSG_BackL_Y.window_down, + &powerwindow_PW_Control_PSG_BackL_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackL_Y.pinch, + &powerwindow_PW_Control_PSG_BackL_Y.wake, + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce)); +} + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_initialize(void) { + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_BackL_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackL_M, (NULL)); + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_BackL_DWork, 0, + sizeof(powerwindow_D_Work_PW_Control_PSG_BackL)); + + /* external inputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackL_U, 0, + sizeof(powerwindow_ExternalInputs_PW_Control_PSG_BackL)); + + /* external outputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackL_Y, 0, + sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_BackL)); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_BackL' + */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce)); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw)); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_Start( + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_BackL_Y.window_up, + &powerwindow_PW_Control_PSG_BackL_Y.window_down, + &powerwindow_PW_Control_PSG_BackL_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackL_Y.pinch, + &powerwindow_PW_Control_PSG_BackL_Y.wake, + &(powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw)); +} + +/* Model terminate function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.h new file mode 100644 index 0000000..bb40e97 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL.h @@ -0,0 +1,142 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_ +#ifndef powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_ +#define powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_BackL_BackL_rtmGetErrorStatus +#define powerwindow_PW_PSG_BackL_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_BackL_rtmSetErrorStatus +#define powerwindow_PW_PSG_BackL_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer +#define powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DWORK1; /* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1; /* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_BackL_DWORK1; /* '/PW_PSG_BackL' */ +} powerwindow_D_Work_PW_Control_PSG_BackL; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T Up_PSG_BackL; /* '/Up_PSG_BackL' */ + powerwindow_boolean_T Down_PSG_BackL; /* '/Down_PSG_BackL' */ +} powerwindow_ExternalInputs_PW_Control_PSG_BackL; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_BackL; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_BackL { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_BackL + powerwindow_PW_Control_PSG_BackL_Y; + +/* Model entry point functions */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_main(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackL_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_BackL + *const powerwindow_PW_Control_PSG_BackL_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_BackL') - opens subsystem + PowerWindow/PW_Control_PSG_BackL + hilite_system('PowerWindow/PW_Control_PSG_BackL/Kp') - opens and selects + block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_BackL' + '' : 'PowerWindow/PW_Control_PSG_BackL/Debounce_PSG_BackL' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_BackL_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_private.h new file mode 100644 index 0000000..86054c3 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_PW_Control_PSG_BackL_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_types.h new file mode 100644 index 0000000..497cefe --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackL_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackL + powerwindow_RT_MODEL_PW_Control_PSG_BackL; + +#endif /* RTW_HEADER_PW_Control_PSG_BackL_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.c new file mode 100644 index 0000000..e3d82b8 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.c @@ -0,0 +1,195 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of back-right passenger + side powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_PW_Control_PSG_BackR.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_terminate(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_M_; +powerwindow_RT_MODEL_PW_Control_PSG_BackR *const + powerwindow_PW_Control_PSG_BackR_M = &powerwindow_PW_Control_PSG_BackR_M_; + +/* Model step function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR, &rtb_debounce_Up, + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce)); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR, &rtb_debounce_Down, + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce)); + + /* ModelReference: '/ControlEx_PSG_BackR' */ + powerwindow_controlexclusion_main( + &powerwindow_PW_Control_PSG_BackR_U.Up_DRV, + &powerwindow_PW_Control_PSG_BackR_U.Down_DRV, &rtb_debounce_Up, + &rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_BackR_o1, + &powerwindow_rtb_ControlEx_PSG_BackR_o2); + + /* ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_BackR_o1, + &powerwindow_rtb_ControlEx_PSG_BackR_o2, + &powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_BackR_U.currentsense, + &powerwindow_PW_Control_PSG_BackR_Y.window_up, + &powerwindow_PW_Control_PSG_BackR_Y.window_down, + &powerwindow_PW_Control_PSG_BackR_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackR_Y.pinch, + &powerwindow_PW_Control_PSG_BackR_Y.wake, + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce)); +} + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_initialize(void) { + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_BackR_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_BackR_M, (NULL)); + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_BackR_DWork, 0, + sizeof(powerwindow_D_Work_PW_Control_PSG_BackR)); + + /* external inputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackR_U, 0, + sizeof(powerwindow_ExternalInputs_PW_Control_PSG_BackR)); + + /* external outputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_BackR_Y, 0, + sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_BackR)); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_BackR' + */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce)); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw)); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_Start( + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_BackR_Y.window_up, + &powerwindow_PW_Control_PSG_BackR_Y.window_down, + &powerwindow_PW_Control_PSG_BackR_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackR_Y.pinch, + &powerwindow_PW_Control_PSG_BackR_Y.wake, + &(powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw)); +} + +/* Model terminate function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.h new file mode 100644 index 0000000..7b5a201 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR.h @@ -0,0 +1,142 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_ +#ifndef powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_ +#define powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatus +#define powerwindow_PW_PSG_BackR_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_BackR_rtmSetErrorStatus +#define powerwindow_PW_PSG_BackR_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer +#define powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DWORK1; /* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1; /* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_BackR_DWORK1; /* '/PW_PSG_BackR' */ +} powerwindow_D_Work_PW_Control_PSG_BackR; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T Up_PSG_BackR; /* '/Up_PSG_BackR' */ + powerwindow_boolean_T Down_PSG_BackR; /* '/Down_PSG_BackR' */ +} powerwindow_ExternalInputs_PW_Control_PSG_BackR; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_BackR; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_BackR { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_BackR + powerwindow_PW_Control_PSG_BackR_Y; + +/* Model entry point functions */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_main(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_BackR_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_BackR + *const powerwindow_PW_Control_PSG_BackR_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_BackR') - opens subsystem + PowerWindow/PW_Control_PSG_BackR + hilite_system('PowerWindow/PW_Control_PSG_BackR/Kp') - opens and selects + block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_BackR' + '' : 'PowerWindow/PW_Control_PSG_BackR/Debounce_PSG' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_private.h new file mode 100644 index 0000000..0265791 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_PW_Control_PSG_BackR_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_types.h new file mode 100644 index 0000000..a2e2b29 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_BackR_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR_tyoes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackR + powerwindow_RT_MODEL_PW_Control_PSG_BackR; + +#endif /* RTW_HEADER_PW_Control_PSG_BackR_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.c new file mode 100644 index 0000000..0826a9e --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.c @@ -0,0 +1,201 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of front passenger side + powerwindow. It connects the 3 smaller modules together. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h" +#include "wcclib.h" + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_terminate(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_main(void); + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_M_; +powerwindow_RT_MODEL_PW_Control_PSG_Front *const + powerwindow_PW_Control_PSG_Front_M = &powerwindow_PW_Control_PSG_Front_M_; + +/* Model step function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_main(void) { + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front, &rtb_debounce_Up, + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce)); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( + &powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front, &rtb_debounce_Down, + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce)); + + /* ModelReference: '/ControlEx_PSG_Front_Front' */ + powerwindow_controlexclusion_main( + &powerwindow_PW_Control_PSG_Front_U.Up_DRV, + &powerwindow_PW_Control_PSG_Front_U.Down_DRV, &rtb_debounce_Up, + &rtb_debounce_Down, &powerwindow_rtb_ControlEx_PSG_Front_Front_o1, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o2); + + /* ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_Front_Front_o1, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o2, + &powerwindow_PW_Control_PSG_Front_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_Front_U.currentsense, + &powerwindow_PW_Control_PSG_Front_Y.window_up, + &powerwindow_PW_Control_PSG_Front_Y.window_down, + &powerwindow_PW_Control_PSG_Front_Y.overcurrent, + &powerwindow_PW_Control_PSG_Front_Y.pinch, + &powerwindow_PW_Control_PSG_Front_Y.wake, + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtzce)); +} + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_initialize(void) { + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_Front_rtmSetErrorStatus( + powerwindow_PW_Control_PSG_Front_M, (NULL)); + + /* states (dwork) */ + (void) wcclib_memset((void *) &powerwindow_PW_Control_PSG_Front_DWork, 0, + sizeof(powerwindow_D_Work_PW_Control_PSG_Front)); + + /* external inputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_Front_U, 0, + sizeof(powerwindow_ExternalInputs_PW_Control_PSG_Front)); + + /* external outputs */ + (void) wcclib_memset( + (void *) &powerwindow_PW_Control_PSG_Front_Y, 0, + sizeof(powerwindow_ExternalOutputs_PW_Control_PSG_Front)); + + /* Model Initialize fcn for ModelReference Block: + * '/ControlEx_PSG_Front_Front' */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce)); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_Front_Front' + */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtm), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtdw), + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtzce)); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw)); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw)); + + /* Start for ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_Start(&( + powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb), + &(powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw)); + + /* InitializeConditions for ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_Front_Y.window_up, + &powerwindow_PW_Control_PSG_Front_Y.window_down, + &powerwindow_PW_Control_PSG_Front_Y.overcurrent, + &powerwindow_PW_Control_PSG_Front_Y.pinch, + &powerwindow_PW_Control_PSG_Front_Y.wake, + &(powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1 + .rtdw)); +} + +/* Model terminate function */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_terminate(void) { + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.h new file mode 100644 index 0000000..4b09f98 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front.h @@ -0,0 +1,142 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_ +#ifndef powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_ +#define powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatus +#define powerwindow_PW_PSG_Front_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_Front_rtmSetErrorStatus +#define powerwindow_PW_PSG_Front_rtmSetErrorStatus(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer +#define powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(rtm) \ + ((const powerwindow_char_T **) (&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DWORK1; /* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1; /* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_Front_Front_DWORK1; /* '/PW_PSG_Front_Front' */ +} powerwindow_D_Work_PW_Control_PSG_Front; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T Up_PSG_Front; /* '/Up_PSG_Front' */ + powerwindow_boolean_T Down_PSG_Front; /* '/Down_PSG_Front' */ +} powerwindow_ExternalInputs_PW_Control_PSG_Front; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_Front; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_Front { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_Front + powerwindow_PW_Control_PSG_Front_Y; + +/* Model entry point functions */ +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_main(void); +__attribute__((always_inline)) static inline void +powerwindow_PW_Control_PSG_Front_terminate(void); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_Front + *const powerwindow_PW_Control_PSG_Front_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_Front') - opens subsystem + PowerWindow/PW_Control_PSG_Front + hilite_system('PowerWindow/PW_Control_PSG_Front/Kp') - opens and selects + block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_Front' + '' : 'PowerWindow/PW_Control_PSG_Front/Debounce_PSG_Front_Front' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_Front_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_private.h new file mode 100644 index 0000000..05c8915 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_PW_Control_PSG_Front_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_types.h new file mode 100644 index 0000000..c422d2a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_PW_Control_PSG_Front_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_Front + powerwindow_RT_MODEL_PW_Control_PSG_Front; + +#endif /* RTW_HEADER_PW_Control_PSG_Front_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_const_params.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_const_params.c new file mode 100644 index 0000000..d8d48eb --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_const_params.c @@ -0,0 +1,26 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_const_params.c + + Author: CoSys-Lab, University of Antwerp + + Function: the lookup table for stateflow chart in + powerwindow_powerwindow_control + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_const_params.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +extern const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[12]; +const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[12] = { + 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0}; diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.c new file mode 100644 index 0000000..7bc23c7 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.c @@ -0,0 +1,91 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_controlexclusion is one functionality of the power + window benchmark. It takes the input signal from the driver and the passenger + to determine the final control signal. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_controlexclusion.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h" + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_terminate(void); +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_main(const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, + powerwindow_boolean_T *rty_Down); + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_initialize(void) { + /* (no initialization code required) */ +} + +/* Model terminate function */ +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_terminate(void) { + /* (no terminate code required) */ +} + +/* + Algorithm core functions +*/ + +/* Output and update for referenced model: 'ControlExclusion' */ +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_main(const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, + powerwindow_boolean_T *rty_Down) { + /* Logic: '/Logical Operator11' incorporates: + Logic: '/Logical Operator2' + Logic: '/Logical Operator3' + Logic: '/Logical Operator5' + Logic: '/Logical Operator6' + Logic: '/Logical Operator7' + */ + *rty_Up = !(((!*rtu_Up_DRV) && (*rtu_Down_DRV)) || + ((*rtu_Down_DRV) && (!*rtu_Up_PSG) && (*rtu_Down_PSG))); + + /* Logic: '/Logical Operator12' incorporates: + Logic: '/Logical Operator1' + Logic: '/Logical Operator10' + Logic: '/Logical Operator4' + Logic: '/Logical Operator8' + Logic: '/Logical Operator9' + */ + *rty_Down = !(((*rtu_Up_DRV) && (!*rtu_Down_DRV)) || + ((*rtu_Up_DRV) && (*rtu_Up_PSG) && (!*rtu_Down_PSG))); +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.h new file mode 100644 index 0000000..c4ab8d3 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion.h @@ -0,0 +1,79 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_h_ +#define powerwindow_RTW_HEADER_controlexclusion_h_ +#ifndef powerwindow_controlexclusion_COMMON_INCLUDES_ +#define powerwindow_controlexclusion_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* powerwindow_controlexclusion_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* user code (top of header file) */ + +/* Model reference registration function */ + +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_initialize(void); +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_terminate(void); +__attribute__((always_inline)) static inline void +powerwindow_controlexclusion_main(const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, + powerwindow_boolean_T *rty_Down); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'ControlExclusion' + '' : 'ControlExclusion/Control_Clock_TicToc' + '' : 'ControlExclusion/Control_Clock_TicToc/ControlEx_PSG' + '' : 'ControlExclusion/Control_Clock_TicToc/Tic' + '' : 'powerwindow_controlexclusion_main/Control_Clock_TicToc/Toc' + '' : 'ControlExclusion/Control_Clock_TicToc/Tic/Tic_T' + '' : 'ControlExclusion/Control_Clock_TicToc/Toc/Toc_T' +*/ +#endif /* RTW_HEADER_ControlExclusion_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_private.h new file mode 100644 index 0000000..085da56 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_private.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_private_h_ +#define powerwindow_RTW_HEADER_controlexclusion_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* RTW_HEADER_controlexclusion_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_types.h new file mode 100644 index 0000000..a84099c --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_controlexclusion_types.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_types_h_ +#define powerwindow_RTW_HEADER_controlexclusion_types_h_ + +/* Forward declaration for rtModel */ +#endif /* powerwindow_RTW_HEADER_controlexclusion_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.c new file mode 100644 index 0000000..541d92b --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.c @@ -0,0 +1,231 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce.c + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_debounce_main is used to powerwindow_debounce_main the + push-down button of the power window. In order to input a manual switch signal + into a digital circuit, debouncing is necessary so that a single press does + not appear like multiple presses. Without debouncing, pressing the button once + may cause unpredictable results. powerwindow_debounce_main.c defines all the + functions that will be used in debounce_PSG_Front which is a part of the Power + window. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_debounce.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "powerwindow_HeaderFiles/powerwindow_debounce_private.h" +#include "wcclib.h" + +/* Named constants for Chart: '/Chart' */ +#define debounce_IN_debounce ((powerwindow_uint8_T) 1U) +#define debounce_IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T) 0U) +#define debounce_IN_Off ((powerwindow_uint8_T) 2U) +#define debounce_IN_Off_h ((powerwindow_uint8_T) 1U) +#define debounce_IN_On ((powerwindow_uint8_T) 3U) +#define debounce_IN_On_b ((powerwindow_uint8_T) 2U) + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +powerwindow_debounce_Init(powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *); +__attribute__((always_inline)) static inline void +powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *); +__attribute__((always_inline)) static inline void +powerwindow_debounce_initialize(const powerwindow_char_T **, + powerwindow_RT_MODEL_debounce_T *const, + powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *, + powerwindow_rtZCE_debounce_T *); +__attribute__((always_inline)) static inline void +powerwindow_debounce_main(const powerwindow_boolean_T *, + powerwindow_boolean_T *, powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *, + powerwindow_rtZCE_debounce_T *); + +/* + Initialization- and return-value-related functions +*/ + +/* Initial conditions for referenced model: 'powerwindow_debounce_main' */ +__attribute__((always_inline)) static inline void +powerwindow_debounce_Init(powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW) { + /* InitializeConditions for Chart: '/Chart' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i1 = 0U; + localDW->is_active_c3_debounce = 0U; + localDW->is_c3_debounce = debounce_IN_NO_ACTIVE_CHILD; + localB->Q = false; +} + +/* Start for referenced model: 'powerwindow_debounce_main' */ +__attribute__((always_inline)) static inline void +powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *localDW) { + /* Start for DiscretePulseGenerator: '/period of 10ms' */ + localDW->clockTickCounter = 0L; +} + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_debounce_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_debounce_T *const debounce_M, + powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE) { + /* Registration code */ + + /* initialize error status */ + powerwindow_rtmSetErrorStatusPointer(debounce_M, rt_errorStatus); + + /* block I/O */ + (void) wcclib_memset(((void *) localB), 0, + sizeof(powerwindow_rtB_debounce_T)); + + /* states (dwork) */ + (void) wcclib_memset((void *) localDW, 0, + sizeof(powerwindow_rtDW_debounce_T)); + localZCE->Chart_Trig_ZCE = powerwindow_POS_ZCSIG; +} + +/* + Algorithm core functions +*/ + +/* Output and update for referenced model: 'powerwindow_debounce_main' */ +__attribute__((always_inline)) static inline void +powerwindow_debounce_main(const powerwindow_boolean_T *rtu_Switch, + powerwindow_boolean_T *rty_debounced_Switch, + powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE) { + powerwindow_int16_T rtb_periodof10ms; + + /* DiscretePulseGenerator: '/period of 10ms' */ + rtb_periodof10ms = + (localDW->clockTickCounter < 1L) && (localDW->clockTickCounter >= 0L) + ? 1 + : 0; + if (localDW->clockTickCounter >= 1L) + localDW->clockTickCounter = 0L; + + else + localDW->clockTickCounter++; + + /* End of DiscretePulseGenerator: '/period of 10ms' */ + + /* Chart: '/Chart' incorporates: + TriggerPort: '/ticks' + */ + /* DataTypeConversion: '/Data Type Conversion' */ + if ((rtb_periodof10ms != 0) && + (localZCE->Chart_Trig_ZCE != powerwindow_POS_ZCSIG)) { + /* Gateway: Chart */ + if (localDW->temporalCounter_i1 < 7U) + localDW->temporalCounter_i1++; + + /* Event: ':13' */ + /* During: Chart */ + if (localDW->is_active_c3_debounce == 0U) { + /* Entry: Chart */ + localDW->is_active_c3_debounce = 1U; + + /* Entry Internal: Chart */ + /* Transition: ':9' */ + localDW->is_c3_debounce = debounce_IN_Off; + + /* Entry 'Off': ':1' */ + localB->Q = true; + } else { + switch (localDW->is_c3_debounce) { + case debounce_IN_debounce: + /* During 'powerwindow_debounce_main': ':6' */ + if (localDW->is_debounce == debounce_IN_Off_h) { + /* During 'Off': ':8' */ + if ((powerwindow_int16_T) *rtu_Switch < 1) { + /* Transition: ':12' */ + localDW->is_debounce = debounce_IN_On_b; + localDW->temporalCounter_i1 = 0U; + } else { + if (localDW->temporalCounter_i1 >= 3) { + /* Transition: ':16' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->is_c3_debounce = debounce_IN_Off; + + /* Entry 'Off': ':1' */ + localB->Q = true; + } + } + } else { + /* During 'On': ':7' */ + if ((powerwindow_int16_T) *rtu_Switch > 0) { + /* Transition: ':11' */ + localDW->is_debounce = debounce_IN_Off_h; + localDW->temporalCounter_i1 = 0U; + } else { + if (localDW->temporalCounter_i1 >= 3) { + /* Transition: ':14' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->is_c3_debounce = debounce_IN_On; + + /* Entry 'On': ':5' */ + localB->Q = false; + } + } + } + break; + + case debounce_IN_Off: + /* During 'Off': ':1' */ + if ((powerwindow_int16_T) *rtu_Switch < 1) { + /* Transition: ':10' */ + localDW->is_c3_debounce = debounce_IN_debounce; + localDW->is_debounce = debounce_IN_On_b; + localDW->temporalCounter_i1 = 0U; + } + break; + + default: + /* During 'On': ':5' */ + if ((powerwindow_int16_T) *rtu_Switch > 0) { + /* Transition: ':15' */ + localDW->is_c3_debounce = debounce_IN_debounce; + localDW->is_debounce = debounce_IN_Off_h; + localDW->temporalCounter_i1 = 0U; + } + break; + } + } + } + + localZCE->Chart_Trig_ZCE = + (powerwindow_uint8_T) (rtb_periodof10ms != 0 + ? (powerwindow_int16_T) powerwindow_POS_ZCSIG + : (powerwindow_int16_T) + powerwindow_ZERO_ZCSIG); + + /* End of DataTypeConversion: '/Data Type Conversion' */ + + /* DataTypeConversion: '/Data Type Conversion2' */ + *rty_debounced_Switch = localB->Q; +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.h new file mode 100644 index 0000000..b1341cf --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce.h @@ -0,0 +1,106 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_h_ +#define powerwindow_RTW_HEADER_debounce_h_ +#ifndef powerwindow_debounce_COMMON_INCLUDES_ +#define powerwindow_debounce_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* debounce_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_debounce_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Block signals for model 'powerwindow_debounce_main' */ +typedef struct { + powerwindow_boolean_T Q; /* '/Chart' */ +} powerwindow_rtB_debounce_T; + +/* Block states (auto storage) for model 'powerwindow_debounce_main' */ +typedef struct { + powerwindow_int32_T clockTickCounter; /* '/period of 10ms' */ + powerwindow_uint8_T is_active_c3_debounce; /* '/Chart' */ + powerwindow_uint8_T is_c3_debounce; /* '/Chart' */ + powerwindow_uint8_T is_debounce; /* '/Chart' */ + powerwindow_uint8_T temporalCounter_i1; /* '/Chart' */ +} powerwindow_rtDW_debounce_T; + +/* Zero-crossing (trigger) state for model 'powerwindow_debounce_main' */ +typedef struct { + ZCSigState Chart_Trig_ZCE; /* '/Chart' */ +} powerwindow_rtZCE_debounce_T; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_debounce_T { + const powerwindow_char_T **errorStatus; +}; + +typedef struct { + powerwindow_rtB_debounce_T rtb; + powerwindow_rtDW_debounce_T rtdw; + powerwindow_RT_MODEL_debounce_T rtm; + powerwindow_rtZCE_debounce_T rtzce; +} powerwindow_rtMdlrefDWork_debounce_T; + +/* Model reference registration function */ +__attribute__((always_inline)) static inline void +powerwindow_debounce_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_debounce_T *const debounce_M, + powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE); +__attribute__((always_inline)) static inline void +powerwindow_debounce_Init(powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW); +__attribute__((always_inline)) static inline void +powerwindow_debounce_Start(powerwindow_rtDW_debounce_T *localDW); +__attribute__((always_inline)) static inline void +powerwindow_debounce_main(const powerwindow_boolean_T *rtu_Switch, + powerwindow_boolean_T *rty_debounced_Switch, + powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'powerwindow_debounce_main' + '' : 'powerwindow_debounce_main/Chart' +*/ +#endif /* RTW_HEADER_debounce_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_private.h new file mode 100644 index 0000000..2bd34bd --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_private.h @@ -0,0 +1,49 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_private_h_ +#define powerwindow_RTW_HEADER_debounce_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_rtmGetErrorStatus +#define powerwindow_rtmGetErrorStatus(rtm) (*((rtm)->errorStatus)) +#endif + +#ifndef powerwindow_rtmSetErrorStatus +#define powerwindow_rtmSetErrorStatus(rtm, val) (*((rtm)->errorStatus) = (val)) +#endif + +#ifndef powerwindow_rtmGetErrorStatusPointer +#define powerwindow_rtmGetErrorStatusPointer(rtm) (rtm)->errorStatus +#endif + +#ifndef powerwindow_rtmSetErrorStatusPointer +#define powerwindow_rtmSetErrorStatusPointer(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif +#endif /* RTW_HEADER_debounce_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_types.h new file mode 100644 index 0000000..fc6e0fb --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_debounce_types.h @@ -0,0 +1,33 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_types_h_ +#define powerwindow_RTW_HEADER_debounce_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_debounce_T powerwindow_RT_MODEL_debounce_T; + +#endif /* RTW_HEADER_debounce_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_inputs.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_inputs.c new file mode 100644 index 0000000..e252dc2 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_inputs.c @@ -0,0 +1,1097 @@ +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +powerwindow_boolean_T powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_DRV_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Up_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_passenger_Front_U_Down_Front_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_Front_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Up_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackL_U_Down_BackL_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_BackL_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Up_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T powerwindow_debounce_passenger_BackR_U_Down_BackR_Array + [powerwindow_input_length] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T + powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array + [powerwindow_input_length] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_uint8_T powerwindow_powerwindow_control_U_currentsense_BackR_Array + [powerwindow_input_length] = { + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, + 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, + 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, + 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, + 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, + 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, + 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, + 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, + 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, + 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, + 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, + 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, + 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, + 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, + 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, + 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, + 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, + 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, + 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, + 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, + 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, + 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, + 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, + 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, + 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, + 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, + 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, + 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, + 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, + 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, + 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, + 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, + 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, + 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, + 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, + 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, + 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, + 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, + 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, + 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, + 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, + 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, + 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, + 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, + 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, + 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, + 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, + 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, + 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, + 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, + 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, + 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, + 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, + 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, + 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, + 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, + 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, + 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, + 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, + 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, + 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, + 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, + 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, + 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, + 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, + 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0}; diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_model_reference_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_model_reference_types.h new file mode 100644 index 0000000..9ee9007 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_model_reference_types.h @@ -0,0 +1,52 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_model_reference_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___MODEL_REFERENCE_TYPES_H__ +#define powerwindow___MODEL_REFERENCE_TYPES_H__ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#ifndef powerwindow___MODEL_REFERENCE_TYPES__ +#define powerwindow___MODEL_REFERENCE_TYPES__ + +/*===========================================================================* + Model reference type definitions + ===========================================================================*/ +/* + This structure is used by model reference to + communicate timing information through the hierarchy. +*/ +typedef struct powerwindow__rtTimingBridge_tag powerwindow_rtTimingBridge; +struct powerwindow__rtTimingBridge_tag { + powerwindow_uint32_T nTasks; + powerwindow_uint32_T **clockTick; + powerwindow_uint32_T **clockTickH; + powerwindow_uint32_T *taskCounter; + powerwindow_real_T **taskTime; + powerwindow_boolean_T **rateTransition; + powerwindow_boolean_T *firstInitCond; +}; + +#endif /* __MODEL_REFERENCE_TYPES__ */ +#endif /* __MODEL_REFERENCE_TYPES_H__ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.c new file mode 100644 index 0000000..e14a8f0 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.c @@ -0,0 +1,597 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control.c + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_control is the main functionality of the power window + benchmark. It contains 3 states: System, EndReached and Pinch, which are used + to controll the position of the glass, if the window is fully closed and + sensing pinch force to realize the powerwindow function. + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" +#include "wcclib.h" + +/* Named constants for Chart: '/stateflow control model' */ +#define powerwindow_powerwindow__IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T) 0U) +#define powerwindow_powerwindow_contr_IN_EndReached ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_contr_IN_SensePinch ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_AutoDown ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_AutoUp ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_Down ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_Down_d ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_InitDown ((powerwindow_uint8_T) 3U) +#define powerwindow_powerwindow_control_IN_InitUp ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_Neutral ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_Pinch ((powerwindow_uint8_T) 2U) +#define powerwindow_powerwindow_control_IN_SenseEnd ((powerwindow_uint8_T) 1U) +#define powerwindow_powerwindow_control_IN_Start ((powerwindow_uint8_T) 3U) +#define powerwindow_powerwindow_control_IN_System ((powerwindow_uint8_T) 3U) +#define powerwindow_powerwindow_control_IN_Up ((powerwindow_uint8_T) 3U) + +/* Forward declaration for local functions */ + +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW); + +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW); + +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW); + +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); + +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); + +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_con_broadcast_ticks( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW); + +/* Function for Chart: '/stateflow control model' */ +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_con_broadcast_ticks( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW) { + /* Event: ':30' */ + /* During: PW_PSG/PWExternalClock/stateflow control model */ + if (localDW->is_active_c2_PowerWindow_contro == 0U) { + /* Entry: PW_PSG/PWExternalClock/stateflow control model */ + localDW->is_active_c2_PowerWindow_contro = 1U; + + /* Entry Internal: PW_PSG/PWExternalClock/stateflow control model */ + /* Transition: ':102' */ + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } else { + switch (localDW->is_c2_PowerWindow_control) { + case powerwindow_powerwindow_contr_IN_EndReached: + /* During 'EndReached': ':97' */ + if (localDW->temporalCounter_i1 >= 10) { + /* Transition: ':101' */ + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } + break; + + case powerwindow_powerwindow_control_IN_Pinch: + /* During 'Pinch': ':152' */ + if (localDW->temporalCounter_i1 >= 40) { + /* Transition: ':157' */ + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } + break; + + default: + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* During 'System': ':94' */ + if (*rty_pinch == 1) { + /* Transition: ':155' */ + /* Exit Internal 'System': ':94' */ + /* Exit Internal 'Sensing': ':96' */ + localDW->is_Sensing = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Sensing = 0U; + + /* Exit Internal 'Logic': ':95' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Logic = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_control_IN_Pinch; + localDW->temporalCounter_i1 = 0U; + + /* Entry 'Pinch': ':152' */ + *rty_window_up = false; + *rty_window_down = true; + } else if (*rty_overcurrent == 1) { + /* Transition: ':100' */ + /* Exit Internal 'System': ':94' */ + /* Exit Internal 'Sensing': ':96' */ + localDW->is_Sensing = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Sensing = 0U; + + /* Exit Internal 'Logic': ':95' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Logic = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_contr_IN_EndReached; + localDW->temporalCounter_i1 = 0U; + + /* Entry 'EndReached': ':97' */ + *rty_window_up = false; + *rty_window_down = false; + } else { + /* During 'Logic': ':95' */ + switch (localDW->is_Logic) { + case powerwindow_powerwindow_control_IN_Down_d: + /* During 'Down': ':18' */ + if (localB->map[1]) { + /* Transition: ':169' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Up; + + /* Entry 'Up': ':17' */ + *rty_window_up = true; + *rty_window_down = false; + *rty_wake = true; + localDW->is_Up = powerwindow_powerwindow_control_IN_Up; + } else { + switch (localDW->is_Down) { + case powerwindow_powerwindow_control_IN_AutoDown: + /* During 'AutoDown': ':111' */ + break; + + case powerwindow_powerwindow_control_IN_Down: + /* During 'Down': ':110' */ + if (localB->map[0]) { + /* Transition: ':26' */ + localDW->is_Down = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Neutral; + + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + } + break; + + default: + /* During 'InitDown': ':109' */ + if (localDW->temporalCounter_i1 >= 20) { + /* Transition: ':119' */ + if (localB->map[0]) { + /* Transition: ':120' */ + localDW->is_Down = + powerwindow_powerwindow_control_IN_AutoDown; + } else { + if (localB->map[2]) { + /* Transition: ':121' */ + localDW->is_Down = + powerwindow_powerwindow_control_IN_Down; + } + } + } + break; + } + } + break; + + case powerwindow_powerwindow_control_IN_Neutral: + /* During 'Neutral': ':16' */ + if (localB->map[1]) { + /* Transition: ':24' */ + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Up; + + /* Entry 'Up': ':17' */ + *rty_window_up = true; + *rty_window_down = false; + *rty_wake = true; + localDW->is_Up = + powerwindow_powerwindow_control_IN_InitUp; + localDW->temporalCounter_i1 = 0U; + } else { + if (localB->map[2]) { + /* Transition: ':25' */ + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Down_d; + + /* Entry 'Down': ':18' */ + *rty_window_up = false; + *rty_window_down = true; + *rty_wake = true; + localDW->is_Down = + powerwindow_powerwindow_control_IN_InitDown; + localDW->temporalCounter_i1 = 0U; + } + } + break; + + default: + /* During 'Up': ':17' */ + if (localB->map[2]) { + /* Transition: ':166' */ + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Down_d; + + /* Entry 'Down': ':18' */ + *rty_window_up = false; + *rty_window_down = true; + *rty_wake = true; + localDW->is_Down = + powerwindow_powerwindow_control_IN_Down; + } else { + switch (localDW->is_Up) { + case powerwindow_powerwindow_control_IN_AutoUp: + /* During 'AutoUp': ':108' */ + break; + + case powerwindow_powerwindow_control_IN_InitUp: + /* During 'InitUp': ':106' */ + if (localDW->temporalCounter_i1 >= 20) { + /* Transition: ':115' */ + if (localB->map[0]) { + /* Transition: ':118' */ + localDW->is_Up = + powerwindow_powerwindow_control_IN_AutoUp; + } else { + if (localB->map[1]) { + /* Transition: ':117' */ + localDW->is_Up = + powerwindow_powerwindow_control_IN_Up; + } + } + } + break; + + default: + /* During 'Up': ':107' */ + if (localB->map[0]) { + /* Transition: ':23' */ + localDW->is_Up = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = + powerwindow_powerwindow_control_IN_Neutral; + + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + } + break; + } + } + break; + } + + /* During 'Sensing': ':96' */ + switch (localDW->is_Sensing) { + case powerwindow_powerwindow_control_IN_SenseEnd: + /* During 'SenseEnd': ':147' */ + if ((localB->LogicalOperator == 0) && + (*rty_window_up == 1)) { + /* Transition: ':173' */ + localDW->is_Sensing = + powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } else + *rty_overcurrent = (localB->RateTransition1 > 184); + break; + + case powerwindow_powerwindow_contr_IN_SensePinch: + /* During 'SensePinch': ':148' */ + if ((localB->LogicalOperator == 1) || + (*rty_window_down == 1)) { + /* Transition: ':150' */ + localDW->is_Sensing = + powerwindow_powerwindow_control_IN_SenseEnd; + } else + *rty_pinch = (localB->RateTransition1 > 92); + break; + + default: + /* During 'Start': ':170' */ + if (localDW->temporalCounter_i2 >= 6) { + /* Transition: ':171' */ + localDW->is_Sensing = + powerwindow_powerwindow_contr_IN_SensePinch; + } + break; + } + } + break; + } + } +} + +/* Initial conditions for referenced model: 'powerwindow_powerwindow_control' */ +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW) { + /* InitializeConditions for Chart: '/stateflow control model' */ + localDW->is_active_Logic = 0U; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i1 = 0U; + localDW->is_active_Sensing = 0U; + localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i2 = 0U; + localDW->is_active_c2_PowerWindow_contro = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + *rty_window_up = false; + *rty_window_down = false; + *rty_overcurrent = false; + *rty_pinch = false; + *rty_wake = false; +} + +/* Start for referenced model: 'powerwindow_powerwindow_control' */ +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW) { + /* Start for DiscretePulseGenerator: '/period of 50ms' */ + localDW->clockTickCounter = 0L; +} + +/* Output and update for referenced model: 'powerwindow_powerwindow_control' */ +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE) { + powerwindow_int16_T rowIdx; + powerwindow_int16_T rtb_periodof50ms; + + /* DiscretePulseGenerator: '/period of 50ms' */ + rtb_periodof50ms = + (localDW->clockTickCounter < 5L) && (localDW->clockTickCounter >= 0L) + ? 1 + : 0; + if (localDW->clockTickCounter >= 9L) + localDW->clockTickCounter = 0L; + + else + localDW->clockTickCounter++; + + /* End of DiscretePulseGenerator: '/period of 50ms' */ + + /* Logic: '/Logical Operator' */ + localB->LogicalOperator = !*rtu_endofdetectionrange; + + /* RateTransition: '/Rate Transition1' */ + localB->RateTransition1 = *rtu_currentsense; + + /* CombinatorialLogic: '/map' */ + rowIdx = (powerwindow_int16_T) (((powerwindow_uint16_T) *rtu_up << 1) + + *rtu_down); + localB->map[0U] = rtCP_map_table[(powerwindow_uint16_T) rowIdx]; + localB->map[1U] = rtCP_map_table[rowIdx + 4U]; + localB->map[2U] = rtCP_map_table[rowIdx + 8U]; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* DataTypeConversion: '/Data Type Conversion' */ + if (((rtb_periodof50ms != 0) != + (localZCE->stateflowcontrolmodel_Trig_ZCE == powerwindow_POS_ZCSIG)) && + (localZCE->stateflowcontrolmodel_Trig_ZCE != + powerwindow_UNINITIALIZED_ZCSIG)) { + /* Gateway: PW_PSG/PWExternalClock/stateflow control model */ + if (localDW->temporalCounter_i1 < 63U) + localDW->temporalCounter_i1++; + + if (localDW->temporalCounter_i2 < 7U) + localDW->temporalCounter_i2++; + + powerwindow_powerwindow_con_broadcast_ticks( + rty_window_up, rty_window_down, rty_overcurrent, rty_pinch, + rty_wake, localB, localDW); + } + + localZCE->stateflowcontrolmodel_Trig_ZCE = + (powerwindow_uint8_T) (rtb_periodof50ms != 0 + ? (powerwindow_int16_T) powerwindow_POS_ZCSIG + : (powerwindow_int16_T) + powerwindow_ZERO_ZCSIG); + + /* End of DataTypeConversion: '/Data Type Conversion' */ +} + +/* Model initialize function */ +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE) { + /* Registration code */ + + /* initialize error status */ + powerwindow_powerwindow_control_rtmSetErrorStatusPointer( + PowerWindow_control_M, rt_errorStatus); + + /* block I/O */ + (void) wcclib_memset(((void *) localB), 0, + sizeof(powerwindow_rtB_PowerWindow_control)); + + /* states (dwork) */ + (void) wcclib_memset((void *) localDW, 0, + sizeof(powerwindow_rtDW_PowerWindow_control)); + localZCE->stateflowcontrolmodel_Trig_ZCE = powerwindow_UNINITIALIZED_ZCSIG; +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.h new file mode 100644 index 0000000..3d009e0 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control.h @@ -0,0 +1,140 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PowerWindow_control_h_ +#define powerwindow_RTW_HEADER_PowerWindow_control_h_ +#ifndef powerwindow_powerWindow_control_COMMON_INCLUDES_ +#define powerwindow_powerWindow_control_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* PowerWindow_control_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* user code (top of header file) */ + +/* Block signals for model 'PowerWindow_control' */ +typedef struct { + powerwindow_uint8_T RateTransition1; /* '/Rate Transition1' */ + powerwindow_boolean_T LogicalOperator; /* '/Logical Operator' */ + powerwindow_boolean_T map[3]; /* '/map' */ +} powerwindow_rtB_PowerWindow_control; + +/* Block states (auto storage) for model 'PowerWindow_control' */ +typedef struct { + powerwindow_int32_T clockTickCounter; /* '/period of 50ms' */ + powerwindow_uint8_T + is_active_c2_PowerWindow_contro; /* '/stateflow control model' */ + powerwindow_uint8_T + is_c2_PowerWindow_control; /* '/stateflow control model' */ + powerwindow_uint8_T is_Up; /* '/stateflow control model' */ + powerwindow_uint8_T is_Down; /* '/stateflow control model' */ + powerwindow_uint8_T is_Logic; /* '/stateflow control model' */ + powerwindow_uint8_T is_active_Logic; /* '/stateflow control model' */ + powerwindow_uint8_T is_Sensing; /* '/stateflow control model' */ + powerwindow_uint8_T is_active_Sensing; /* '/stateflow control model' */ + powerwindow_uint8_T temporalCounter_i1; /* '/stateflow control model' */ + powerwindow_uint8_T temporalCounter_i2; /* '/stateflow control model' */ +} powerwindow_rtDW_PowerWindow_control; + +/* Zero-crossing (trigger) state for model 'PowerWindow_control' */ +typedef struct { + ZCSigState + stateflowcontrolmodel_Trig_ZCE; /* '/stateflow control model' */ +} powerwindow_rtZCE_PowerWindow_control; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PowerWindow_control { + const powerwindow_char_T **errorStatus; +}; + +typedef struct { + powerwindow_rtB_PowerWindow_control rtb; + powerwindow_rtDW_PowerWindow_control rtdw; + powerwindow_RT_MODEL_PowerWindow_control rtm; + powerwindow_rtZCE_PowerWindow_control rtzce; +} powerwindow_rtMdlrefDWork_PowerWindow_contr; + +/* Model reference registration function */ +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW); +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW); +__attribute__((always_inline)) static inline void +powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'PowerWindow_control' + '' : 'PowerWindow_control/PW_PSG' + '' : 'PowerWindow_control/PW_PSG/PW_PSG' + '' : 'PowerWindow_control/PW_PSG/Tic' + '' : 'PowerWindow_control/PW_PSG/Toc' + '' : 'PowerWindow_control/PW_PSG/PW_PSG/stateflow control model' + '' : 'PowerWindow_control/PW_PSG/Tic/Tic_T' + '' : 'PowerWindow_control/PW_PSG/Toc/Toc_T' +*/ +#endif /* powerwindow_RTW_HEADER_PowerWindow_control_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_private.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_private.h new file mode 100644 index 0000000..2f301db --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_private.h @@ -0,0 +1,59 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PowerWindow_control_private_h_ +#define powerwindow_RTW_HEADER_PowerWindow_control_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_powerwindow_control_rtmGetErrorStatus +#define powerwindow_powerwindow_control_rtmGetErrorStatus(rtm) \ + (*((rtm)->errorStatus)) +#endif + +#ifndef powerwindow_powerwindow_control_rtmSetErrorStatus +#define powerwindow_powerwindow_control_rtmSetErrorStatus(rtm, val) \ + (*((rtm)->errorStatus) = (val)) +#endif + +#ifndef powerwindow_powerwindow_control_rtmGetErrorStatusPointer +#define powerwindow_powerwindow_control_rtmGetErrorStatusPointer(rtm) \ + (rtm)->errorStatus +#endif + +#ifndef powerwindow_powerwindow_control_rtmSetErrorStatusPointer +#define powerwindow_powerwindow_control_rtmSetErrorStatusPointer(rtm, val) \ + ((rtm)->errorStatus = (val)) +#endif + +extern const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[12]; + +#define rtCP_map_table \ + powerwindow_rtCP_pooled_6bUUQf1tASYw /* Computed Parameter: map_table \ + Referenced by: '/map' \ +*/ +#endif /* RTW_HEADER_PowerWindow_control_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_types.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_types.h new file mode 100644 index 0000000..9007156 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_powerwindow_control_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_control_types_h_ +#define powerwindow_RTW_HEADER_powerwindow_control_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PowerWindow_control + powerwindow_RT_MODEL_PowerWindow_control; + +#endif /* RTW_HEADER_powerwindow_control_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_continuous.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_continuous.h new file mode 100644 index 0000000..e5688e7 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_continuous.h @@ -0,0 +1,127 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtw_continuous.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___RTW_CONTINUOUS_H__ +#define powerwindow___RTW_CONTINUOUS_H__ + +// #include "../powerwindow_HeaderFiles/powerwindow_tmwtypes.h" + +/* For models registering MassMatrix */ +typedef enum { + SS_MATRIX_NONE, + SS_MATRIX_CONSTANT, + SS_MATRIX_TIMEDEP, + SS_MATRIX_STATEDEP +} powerwindow_ssMatrixType; + +typedef enum { + SOLVER_MODE_AUTO, /* only occurs in + mdlInitializeSizes/mdlInitializeSampleTimes */ + SOLVER_MODE_SINGLETASKING, + SOLVER_MODE_MULTITASKING +} powerwindow_SolverMode; + +typedef enum { MINOR_TIME_STEP, MAJOR_TIME_STEP } powerwindow_SimTimeStep; + +/* ============================================================================= + Model methods object + ============================================================================= +*/ +typedef void (*powerwindow_rtMdlInitializeSizesFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlInitializeSampleTimesFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlStartFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlOutputsFcn)(void *rtModel, + powerwindow_int_T tid); +typedef void (*powerwindow_rtMdlUpdateFcn)(void *rtModel, + powerwindow_int_T tid); +typedef void (*powerwindow_rtMdlDerivativesFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlProjectionFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlMassMatrixFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlForcingFunctionFcn)(void *rtModel); +typedef void (*powerwindow_rtMdlTerminateFcn)(void *rtModel); +#ifdef RT_MALLOC +typedef real_T (*rtMdlDiscreteEventsFcn)( + void *pModel, powerwindow_int_T rtmNumSampTimes, void *rtmTimingData, + powerwindow_int_T *rtmSampleHitPtr, + powerwindow_int_T *rtmPerTaskSampleHits); +#endif + +typedef struct powerwindow__RTWRTModelMethodsInfo_tag { + void *rtModelPtr; + powerwindow_rtMdlInitializeSizesFcn rtmInitSizesFcn; + powerwindow_rtMdlInitializeSampleTimesFcn rtmInitSampTimesFcn; + powerwindow_rtMdlStartFcn rtmStartFcn; + powerwindow_rtMdlOutputsFcn rtmOutputsFcn; + powerwindow_rtMdlUpdateFcn rtmUpdateFcn; + powerwindow_rtMdlDerivativesFcn rtmDervisFcn; + powerwindow_rtMdlProjectionFcn rtmProjectionFcn; + powerwindow_rtMdlMassMatrixFcn rtmMassMatrixFcn; + powerwindow_rtMdlForcingFunctionFcn rtmForcingFunctionFcn; + powerwindow_rtMdlTerminateFcn rtmTerminateFcn; +#ifdef RT_MALLOC + rtMdlDiscreteEventsFcn rtmDiscreteEventsFcn; +#endif +} powerwindow_RTWRTModelMethodsInfo; + +#define rtmiSetRTModelPtr(M, rtmp) ((M).rtModelPtr = (rtmp)) +#define rtmiGetRTModelPtr(M) (M).rtModelPtr + +#define rtmiSetInitSizesFcn(M, fp) \ + ((M).rtmInitSizesFcn = ((powerwindow_rtMdlInitializeSizesFcn) (fp))) +#define rtmiSetInitSampTimesFcn(M, fp) \ + ((M).rtmInitSampTimesFcn = \ + ((powerwindow_rtMdlInitializeSampleTimesFcn) (fp))) +#define rtmiSetStartFcn(M, fp) \ + ((M).rtmStartFcn = ((powerwindow_rtMdlStartFcn) (fp))) +#define rtmiSetOutputsFcn(M, fp) \ + ((M).rtmOutputsFcn = ((powerwindow_rtMdlOutputsFcn) (fp))) +#define rtmiSetUpdateFcn(M, fp) \ + ((M).rtmUpdateFcn = ((powerwindow_rtMdlUpdateFcn) (fp))) +#define rtmiSetDervisFcn(M, fp) \ + ((M).rtmDervisFcn = ((powerwindow_rtMdlDerivativesFcn) (fp))) +#define rtmiSetProjectionFcn(M, fp) \ + ((M).rtmProjectionFcn = ((powerwindow_rtMdlProjectionFcn) (fp))) +#define rtmiSetMassMatrixFcn(M, fp) \ + ((M).rtmMassMatrixFcn = ((powerwindow_rtMdlMassMatrixFcn) (fp))) +#define rtmiSetForcingFunctionFcn(M, fp) \ + ((M).rtmForcingFunctionFcn = ((powerwindow_rtMdlForcingFunctionFcn) (fp))) +#define rtmiSetTerminateFcn(M, fp) \ + ((M).rtmTerminateFcn = ((powerwindow_rtMdlTerminateFcn) (fp))) +#ifdef RT_MALLOC +#define rtmiSetDiscreteEventsFcn(M, fp) \ + ((M).rtmDiscreteEventsFcn = ((rtMdlDiscreteEventsFcn) (fp))) +#endif + +#define rtmiInitializeSizes(M) ((*(M).rtmInitSizesFcn)((M).rtModelPtr)) +#define rtmiInitializeSampleTimes(M) \ + ((*(M).rtmInitSampTimesFcn)((M).rtModelPtr)) +#define rtmiStart(M) ((*(M).rtmStartFcn)((M).rtModelPtr)) +#define rtmiOutputs(M, tid) ((*(M).rtmOutputsFcn)((M).rtModelPtr, tid)) +#define rtmiUpdate(M, tid) ((*(M).rtmUpdateFcn)((M).rtModelPtr, tid)) +#define rtmiDerivatives(M) ((*(M).rtmDervisFcn)((M).rtModelPtr)) +#define rtmiProjection(M) ((*(M).rtmProjectionFcn)((M).rtModelPtr)) +#define rtmiMassMatrix(M) ((*(M).rtmMassMatrixFcn)((M).rtModelPtr)) +#define rtmiForcingFunction(M) ((*(M).rtmForcingFunctionFcn)((M).rtModelPtr)) +#define rtmiTerminate(M) ((*(M).rtmTerminateFcn)((M).rtModelPtr)) +#ifdef RT_MALLOC +#define rtmiDiscreteEvents(M, x1, x2, x3, x4) \ + ((*(M).rtmDiscreteEventsFcn)((M).rtModelPtr, (x1), (x2), (x3), (x4))) +#endif +#endif /* __RTW_CONTINUOUS_H__ */ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_solver.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_solver.h new file mode 100644 index 0000000..123fcff --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtw_solver.h @@ -0,0 +1,255 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtw_solver.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___RTW_SOLVER_H__ +#define powerwindow___RTW_SOLVER_H__ + +/* ============================================================================= + Solver object + ============================================================================= +*/ +#ifndef NO_FLOATS /* ERT integer-only */ +/* + Enum for solver tolerance +*/ +typedef enum { + SL_SOLVER_TOLERANCE_AUTO = 0, /* Set Automatically by Solver */ + SL_SOLVER_TOLERANCE_LOCAL = 1, /* Set Locally, e.g., by Blocks */ + SL_SOLVER_TOLERANCE_GLOBAL = 2, /* Set Globally, e.g., by Block Diagram */ + SL_SOLVER_TOLERANCE_UNDEFINED = 255 /* Signal uninitialized */ +} powerwindow_SL_SolverToleranceControlFlag_T; + +/* + Enum for jacobian method control +*/ +typedef enum { + SL_JM_BD_AUTO = 0, + SL_JM_BD_SPARSE_PERTURBATION, + SL_JM_BD_FULL_PERTURBATION, + SL_JM_BD_SPARSE_ANALYTICAL, + SL_JM_BD_FULL_ANALYTICAL +} powerwindow_slJmBdControl; + +typedef struct _ssSolverInfo_tag { + void *rtModelPtr; + + const char *solverName; + powerwindow_boolean_T isVariableStepSolver; + powerwindow_boolean_T solverNeedsReset; + + powerwindow_time_T solverStopTime; + powerwindow_time_T *stepSizePtr; + powerwindow_time_T minStepSize; + powerwindow_time_T maxStepSize; + powerwindow_time_T fixedStepSize; + + powerwindow_int_T solverShapePreserveControl; + powerwindow_int_T solverMaxConsecutiveMinStep; + powerwindow_int_T maxNumMinSteps; + powerwindow_int_T solverMaxOrder; + powerwindow_real_T solverConsecutiveZCsStepRelTol; + powerwindow_int_T solverMaxConsecutiveZCs; + + powerwindow_int_T solverExtrapolationOrder; + powerwindow_int_T solverNumberNewtonIterations; + + powerwindow_int_T solverRefineFactor; + powerwindow_real_T solverRelTol; + powerwindow_real_T unused_real_T_1; + + powerwindow_real_T **dXPtr; + powerwindow_time_T **tPtr; + + powerwindow_int_T *numContStatesPtr; + powerwindow_real_T **contStatesPtr; + + powerwindow_real_T *zcSignalVector; + powerwindow_uint8_T *zcEventsVector; + powerwindow_uint8_T *zcSignalAttrib; + powerwindow_int_T zcSignalVectorLength; + powerwindow_uint8_T *reserved; + + powerwindow_boolean_T foundContZcEvents; + powerwindow_boolean_T isAtLeftPostOfContZcEvent; + powerwindow_boolean_T isAtRightPostOfContZcEvent; + powerwindow_boolean_T adaptiveZcDetection; + + powerwindow_int_T numZcSignals; + + powerwindow_boolean_T stateProjection; + powerwindow_boolean_T robustResetMethod; /* user's preference */ + powerwindow_boolean_T updateJacobianAtReset; /* S-Fcn request (sticky) */ + powerwindow_boolean_T consistencyChecking; + + powerwindow_int_T massMatrixNzMax; + powerwindow_int_T *massMatrixIr; + powerwindow_int_T *massMatrixJc; + powerwindow_real_T *massMatrixPr; + + const powerwindow_char_T **errStatusPtr; + + powerwindow_real_T zcThreshold; + powerwindow_int_T zeroCrossAlgorithm; + powerwindow_int_T consecutiveZCsError; + + powerwindow_boolean_T isComputingJacobian; + powerwindow_slJmBdControl solverJacobianMethodControl; + powerwindow_int_T ignoredZcDiagnostic; + powerwindow_int_T maskedZcDiagnostic; + powerwindow_boolean_T isOutputMethodComputed; +} ssSolverInfo; + +/* Support old name RTWSolverInfo */ +typedef ssSolverInfo RTWSolverInfo; + +#define rtsiSetRTModelPtr(S, rtmp) ((S)->rtModelPtr = (rtmp)) +#define rtsiGetRTModelPtr(S) (S)->rtModelPtr + +#define rtsiSetSimTimeStepPtr(S, stp) ((S)->simTimeStepPtr = (stp)) +#define rtsiGetSimTimeStepPtr(S) ((S)->simTimeStepPtr) +#define rtsiGetSimTimeStep(S) *((S)->simTimeStepPtr) +#define rtsiSetSimTimeStep(S, st) (*((S)->simTimeStepPtr) = (st)) + +#define rtsiSetSolverData(S, sd) ((S)->solverData = (sd)) +#define rtsiGetSolverData(S) (S)->solverData + +#define rtsiSetSolverName(S, sn) ((S)->solverName = (sn)) +#define rtsiGetSolverName(S) (S)->solverName + +#define rtsiSetVariableStepSolver(S, vs) ((S)->isVariableStepSolver = (vs)) +#define rtsiIsVariableStepSolver(S) (S)->isVariableStepSolver + +#define rtsiSetSolverNeedsReset(S, sn) ((S)->solverNeedsReset = (sn)) +#define rtsiGetSolverNeedsReset(S) (S)->solverNeedsReset + +#define rtsiSetBlkStateChange(S, sn) ((S)->blkStateChange = (sn)) +#define rtsiGetBlkStateChange(S) (S)->blkStateChange + +#define rtsiSetSolverMode(S, sm) ((S)->solverMode = (sm)) +#define rtsiGetSolverMode(S) (S)->solverMode + +#define rtsiSetSolverStopTime(S, st) ((S)->solverStopTime = (st)) +#define rtsiGetSolverStopTime(S) (S)->solverStopTime + +#define rtsiSetStepSizePtr(S, ssp) ((S)->stepSizePtr = (ssp)) +#define rtsiSetStepSize(S, ss) (*((S)->stepSizePtr) = (ss)) +#define rtsiGetStepSize(S) *((S)->stepSizePtr) + +#define rtsiSetMinStepSize(S, ss) (((S)->minStepSize = (ss))) +#define rtsiGetMinStepSize(S) (S)->minStepSize + +#define rtsiSetMaxStepSize(S, ss) ((S)->maxStepSize = (ss)) +#define rtsiGetMaxStepSize(S) (S)->maxStepSize + +#define rtsiSetFixedStepSize(S, ss) ((S)->fixedStepSize = (ss)) +#define rtsiGetFixedStepSize(S) (S)->fixedStepSize + +#define rtsiSetMaxNumMinSteps(S, mns) ((S)->maxNumMinSteps = (mns)) +#define rtsiGetMaxNumMinSteps(S) (S)->maxNumMinSteps + +#define rtsiSetSolverMaxOrder(S, smo) ((S)->solverMaxOrder = (smo)) +#define rtsiGetSolverMaxOrder(S) (S)->solverMaxOrder + +#define rtsiSetSolverJacobianMethodControl(S, smcm) \ + (ssGetSolverInfo(S)->solverJacobianMethodControl = (smcm)) +#define rtsiGetSolverJacobianMethodControl(S) \ + ssGetSolverInfo(S)->solverJacobianMethodControl + +#define rtsiSetSolverShapePreserveControl(S, smcm) \ + (ssGetSolverInfo(S)->solverShapePreserveControl = (smcm)) +#define rtsiGetSolverShapePreserveControl(S) \ + ssGetSolverInfo(S)->solverShapePreserveControl + +#define rtsiSetSolverConsecutiveZCsStepRelTol(S, scr) \ + (ssGetSolverInfo(S)->solverConsecutiveZCsStepRelTol = (scr)) +#define rtsiGetSolverConsecutiveZCsStepRelTol(S) \ + ssGetSolverInfo(S)->solverConsecutiveZCsStepRelTol + +#define rtsiSetSolverMaxConsecutiveZCs(S, smcz) \ + (ssGetSolverInfo(S)->solverMaxConsecutiveZCs = (smcz)) +#define rtsiGetSolverMaxConsecutiveZCs(S) \ + ssGetSolverInfo(S)->solverMaxConsecutiveZCs + +#define rtsiSetSolverMaxConsecutiveMinStep(S, smcm) \ + (ssGetSolverInfo(S)->solverMaxConsecutiveMinStep = (smcm)) +#define rtsiGetSolverMaxConsecutiveMinStep(S) \ + ssGetSolverInfo(S)->solverMaxConsecutiveMinStep + +#define rtsiSetSolverExtrapolationOrder(S, seo) \ + ((S)->solverExtrapolationOrder = (seo)) +#define rtsiGetSolverExtrapolationOrder(S) (S)->solverExtrapolationOrder + +#define rtsiSetSolverNumberNewtonIterations(S, nni) \ + ((S)->solverNumberNewtonIterations = (nni)) +#define rtsiGetSolverNumberNewtonIterations(S) (S)->solverNumberNewtonIterations + +#define rtsiSetSolverRefineFactor(S, smo) ((S)->solverRefineFactor = (smo)) +#define rtsiGetSolverRefineFactor(S) (S)->solverRefineFactor + +#define rtsiSetSolverRelTol(S, smo) ((S)->solverRelTol = (smo)) +#define rtsiGetSolverRelTol(S) (S)->solverRelTol + +#define rtsiSetSolverMassMatrixType(S, type) ((S)->massMatrixType = (type)) +#define rtsiGetSolverMassMatrixType(S) (S)->massMatrixType + +#define rtsiSetSolverMassMatrixNzMax(S, nzMax) ((S)->massMatrixNzMax = (nzMax)) +#define rtsiGetSolverMassMatrixNzMax(S) (S)->massMatrixNzMax + +#define rtsiSetSolverMassMatrixIr(S, ir) ((S)->massMatrixIr = (ir)) +#define rtsiGetSolverMassMatrixIr(S) (S)->massMatrixIr + +#define rtsiSetSolverMassMatrixJc(S, jc) ((S)->massMatrixJc = (jc)) +#define rtsiGetSolverMassMatrixJc(S) (S)->massMatrixJc + +#define rtsiSetSolverMassMatrixPr(S, pr) ((S)->massMatrixPr = (pr)) +#define rtsiGetSolverMassMatrixPr(S) (S)->massMatrixPr + +#define rtsiSetdXPtr(S, dxp) ((S)->dXPtr = (dxp)) +#define rtsiSetdX(S, dx) (*((S)->dXPtr) = (dx)) +#define rtsiGetdX(S) *((S)->dXPtr) + +#define rtsiSetTPtr(S, tp) ((S)->tPtr = (tp)) +#define rtsiSetT(S, t) ((*((S)->tPtr))[0] = (t)) +#define rtsiGetT(S) (*((S)->tPtr))[0] + +#define rtsiSetContStatesPtr(S, cp) ((S)->contStatesPtr = (cp)) +#define rtsiGetContStates(S) *((S)->contStatesPtr) + +#define rtsiSetNumContStatesPtr(S, cp) ((S)->numContStatesPtr = (cp)) +#define rtsiGetNumContStates(S) *((S)->numContStatesPtr) + +#define rtsiSetErrorStatusPtr(S, esp) ((S)->errStatusPtr = (esp)) +#define rtsiSetErrorStatus(S, es) (*((S)->errStatusPtr) = (es)) +#define rtsiGetErrorStatus(S) *((S)->errStatusPtr) + +#define rtsiSetModelMethodsPtr(S, mmp) ((S)->modelMethodsPtr = (mmp)) +#define rtsiGetModelMethodsPtr(S) (S)->modelMethodsPtr + +#define rtsiSetSolverComputingJacobian(S, val) \ + ((S)->isComputingJacobian = (val)) +#define rtsiIsSolverComputingJacobian(S) (S)->isComputingJacobian + +#define rtsiSetSolverOutputComputed(S, val) \ + ((S)->isOutputMethodComputed = (val)) +#define rtsiIsSolverOutputComputed(S) (S)->isOutputMethodComputed + +#endif /* !NO_FLOATS */ + +#endif /* powerwindow___RTW_SOLVER_H__ */ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtwtypes.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtwtypes.h new file mode 100644 index 0000000..7d43f6e --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_rtwtypes.h @@ -0,0 +1,201 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtwtypes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow__RTWTYPES_H__ +#define powerwindow__RTWTYPES_H__ + +/* Logical type definitions */ +#if (!defined(__cplusplus)) +#ifndef false +#define false (0U) +#endif + +#ifndef true +#define true (1U) +#endif +#endif + +#define powerwindow__TMWTYPES__ + +/*=======================================================================* + Target hardware information + + Number of bits: char: 8 short: 16 int: 16 + long: 32 + native word size: 8 + Byte ordering: LittleEndian + Signed integer division rounds to: Zero + Shift right on a signed integer as arithmetic shift: on + =======================================================================*/ + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + powerwindow_real32_T, powerwindow_real64_T - 32 and 64 bit + floating point numbers + =======================================================================*/ +typedef signed char powerwindow_int8_T; +typedef unsigned char powerwindow_uint8_T; +typedef int powerwindow_int16_T; +typedef unsigned int powerwindow_uint16_T; +typedef long powerwindow_int32_T; +typedef unsigned long powerwindow_uint32_T; +typedef float powerwindow_real32_T; +typedef double powerwindow_real64_T; + +/*===========================================================================* + Generic type definitions: powerwindow_real_T, powerwindow_time_T, + powerwindow_boolean_T, powerwindow_int_T, powerwindow_uint_T, + powerwindow_ulong_T, powerwindow_char_T and + powerwindow_byte_T. + ===========================================================================*/ +typedef double powerwindow_real_T; +typedef double powerwindow_time_T; +typedef unsigned char powerwindow_boolean_T; +typedef int powerwindow_int_T; +typedef unsigned int powerwindow_uint_T; +typedef unsigned long powerwindow_ulong_T; +typedef char powerwindow_char_T; +typedef unsigned char powerwindow_uchar_T; +typedef powerwindow_char_T powerwindow_byte_T; + +/*===========================================================================* + Complex number type definitions + ===========================================================================*/ +#define powerwindow_CREAL_T + +typedef struct { + powerwindow_real32_T re; + powerwindow_real32_T im; +} powerwindow_creal32_T; + +typedef struct { + powerwindow_real64_T re; + powerwindow_real64_T im; +} powerwindow_creal64_T; + +typedef struct { + powerwindow_real_T re; + powerwindow_real_T im; +} powerwindow_creal_T; + +#define powerwindow_CINT8_T + +typedef struct { + powerwindow_int8_T re; + powerwindow_int8_T im; +} powerwindow_cint8_T; + +#define powerwindow_CUINT8_T + +typedef struct { + powerwindow_uint8_T re; + powerwindow_uint8_T im; +} powerwindow_cuint8_T; + +#define powerwindow_CINT16_T + +typedef struct { + powerwindow_int16_T re; + powerwindow_int16_T im; +} powerwindow_cint16_T; + +#define powerwindow_CUINT16_T + +typedef struct { + powerwindow_uint16_T re; + powerwindow_uint16_T im; +} powerwindow_cuint16_T; + +#define powerwindow_CINT32_T + +typedef struct { + powerwindow_int32_T re; + powerwindow_int32_T im; +} powerwindow_cint32_T; + +#define powerwindow_CUINT32_T + +typedef struct { + powerwindow_uint32_T re; + powerwindow_uint32_T im; +} powerwindow_cuint32_T; + +/*=======================================================================* + Min and Max: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + =======================================================================*/ +#define powerwindow_MAX_int8_T ((powerwindow_int8_T) (127)) +#define powerwindow_MIN_int8_T ((powerwindow_int8_T) (-128)) +#define powerwindow_MAX_uint8_T ((powerwindow_uint8_T) (255U)) +#define powerwindow_MIN_uint8_T ((powerwindow_uint8_T) (0U)) +#define powerwindow_MAX_int16_T ((powerwindow_int16_T) (32767)) +#define powerwindow_MIN_int16_T ((powerwindow_int16_T) (-32768)) +#define powerwindow_MAX_uint16_T ((powerwindow_uint16_T) (65535U)) +#define powerwindow_MIN_uint16_T ((powerwindow_uint16_T) (0U)) +#define powerwindow_MAX_int32_T ((powerwindow_int32_T) (2147483647)) +#define powerwindow_MIN_int32_T ((powerwindow_int32_T) (-2147483647 - 1)) +#define powerwindow_MAX_uint32_T ((powerwindow_uint32_T) (0xFFFFFFFFU)) +#define powerwindow_MIN_uint32_T ((powerwindow_uint32_T) (0U)) + +/* Block D-Work pointer type */ +typedef void *powerwindow_pointer_T; + +#define powerwindow_input_length 977 + +/* Simulink specific types */ +#ifndef powerwindow___ZERO_CROSSING_TYPES__ +#define powerwindow___ZERO_CROSSING_TYPES__ + +/* Trigger directions: falling, either, and rising */ +typedef enum { + FALLING_ZERO_CROSSING = -1, + ANY_ZERO_CROSSING = 0, + RISING_ZERO_CROSSING = 1 +} powerwindow_ZCDirection; + +/* Previous state of a trigger signal */ +typedef powerwindow_uint8_T ZCSigState; + +/* Initial value of a trigger zero crossing signal */ +#define powerwindow_UNINITIALIZED_ZCSIG 0x03U +#define powerwindow_NEG_ZCSIG 0x02U +#define powerwindow_POS_ZCSIG 0x01U +#define powerwindow_ZERO_ZCSIG 0x00U + +/* Current state of a trigger signal */ +typedef enum { + FALLING_ZCEVENT = -1, + NO_ZCEVENT = 0, + RISING_ZCEVENT = 1 +} powerwindow_ZCEventType; + +#endif /* powerwindow___ZERO_CROSSING_TYPES__ */ +#endif /* powerwindow__RTWTYPES_H__ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_tmwtypes.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_tmwtypes.h new file mode 100644 index 0000000..72c3651 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/powerwindow_tmwtypes.h @@ -0,0 +1,814 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_tmwtypes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: + https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#if defined(_MSC_VER) +#pragma once +#endif +#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)) +#pragma once +#endif + +#ifndef powerwindow_tmwtypes_h +#define powerwindow_tmwtypes_h + +#ifndef powerwindow__TMWTYPES__ +#define powerwindow__TMWTYPES__ +/* + File : tmwtypes.h + Abstract: + Data types for use with MATLAB/SIMULINK and the Real-Time Workshop. + + When compiling stand-alone model code, data types can be overridden + via compiler switches. + + Define NO_FLOATS to eliminate reference to powerwindow_real_T, etc. +*/ + +#define LOGICAL_IS_A_TYPE +#define SPARSE_GENERALIZATION + +#ifdef NO_FLOATS +#define double double_not_allowed +#define float float_not_allowed +#endif /*NO_FLOATS*/ + +/* + The following data types cannot be overridden when building MEX files. +*/ +#ifdef MATLAB_MEX_FILE +#undef CHARACTER_T +#undef INTEGER_T +#undef BOOLEAN_T +#undef REAL_T +#undef TIME_T +#endif + +/* + The powerwindow_uchar_T, powerwindow_ushort_T and powerwindow_ulong_T types + are needed for compilers which do not allow defines to be specified, at the + command line, with spaces in them. +*/ + +typedef unsigned char powerwindow_uchar_T; +typedef unsigned short powerwindow_ushort_T; +typedef unsigned long powerwindow_ulong_T; + +#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__x86_64__) || \ + defined(__LP64__) || defined(__LCC64__) + +typedef unsigned long long powerwindow_ulonglong_T; +#endif + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + powerwindow_real32_T, powerwindow_real64_T - 32 and 64 bit + floating point numbers + =======================================================================*/ + +/* When used with Real Time Workshop generated code, this + header file can be used with a variety of compilers. + + The compiler could be for an 8 bit embedded processor that + only had 8 bits per integer and 16 bits per long. + In that example, a 32 bit integer size is not even available. + This header file should be robust to that. + + For the case of an 8 bit processor, the preprocessor + may be limited to 16 bit math like its target. That limitation + would mean that 32 bit comparisons can't be done accurately. + To increase robustness to this, comparisons are done against + smaller values first. An inaccurate 32 bit comparison isn't + attempted if the 16 bit comparison has already succeeded. + + Limitations on preprocessor math can also be stricter than + for the target. There are known cases where a compiler + targeting processors with 64 bit longs can't do accurate + preprocessor comparisons on more than 32 bits. +*/ + +/* Determine the number of bits for int, long, short, and char. + If one fails to be determined, set the number of bits to -1 +*/ + +#ifndef TMW_BITS_PER_INT +#if INT_MAX == 0x7FL +#define TMW_BITS_PER_INT 8 +#elif INT_MAX == 0x7FFFL +#define TMW_BITS_PER_INT 16 +#elif INT_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_INT 32 +#else +#define TMW_BITS_PER_INT -1 +#endif +#endif + +#ifndef TMW_BITS_PER_LONG +#if LONG_MAX == 0x7FL +#define TMW_BITS_PER_LONG 8 +#elif LONG_MAX == 0x7FFFL +#define TMW_BITS_PER_LONG 16 +#elif LONG_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_LONG 32 +#else +#define TMW_BITS_PER_LONG -1 +#endif +#endif + +#ifndef TMW_BITS_PER_SHRT +#if SHRT_MAX == 0x7FL +#define TMW_BITS_PER_SHRT 8 +#elif SHRT_MAX == 0x7FFFL +#define TMW_BITS_PER_SHRT 16 +#elif SHRT_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_SHRT 32 +#else +#define TMW_BITS_PER_SHRT -1 +#endif +#endif + +#ifndef TMW_BITS_PER_SCHAR +#if SCHAR_MAX == 0x7FL +#define TMW_BITS_PER_SCHAR 8 +#elif SCHAR_MAX == 0x7FFFL +#define TMW_BITS_PER_SCHAR 16 +#elif SCHAR_MAX == 0x7FFFFFFFL +#define TMW_BITS_PER_SCHAR 32 +#else +#define TMW_BITS_PER_SCHAR -1 +#endif +#endif + +#ifndef TMW_CHAR_SIGNED +#if SCHAR_MAX == CHAR_MAX +#define TMW_CHAR_SIGNED 1 +#else +#define TMW_CHAR_SIGNED 0 +#endif +#endif + +/* It is common for one or more of the integer types + to be the same size. For example, on many embedded + processors, both shorts and ints are 16 bits. On + processors used for workstations, it is quite common + for both int and long to be 32 bits. + When there is more than one choice for typdef'ing + a portable type like powerwindow_int16_T or powerwindow_uint32_T, in + concept, it should not matter which choice is made. + However, some style guides and some code checking + tools do identify and complain about seemingly + irrelevant differences. For example, a code + checking tool may complain about an implicit + conversion from int to short even though both + are 16 bits. To reduce these types of + complaints, it is best to make int the + preferred choice when more than one is available. +*/ + +#ifndef INT8_T +#if TMW_BITS_PER_INT == 8 +#define INT8_T int +#elif TMW_BITS_PER_LONG == 8 +#define INT8_T long +#elif TMW_BITS_PER_SCHAR == 8 +#define INT8_T signed char +#elif TMW_BITS_PER_SHRT == 8 +#define INT8_T short +#endif +#endif +#ifdef INT8_T +typedef INT8_T powerwindow_int8_T; +#endif + +#ifndef UINT8_T +#if TMW_BITS_PER_INT == 8 +#define UINT8_T unsigned int +#elif TMW_BITS_PER_LONG == 8 +#define UINT8_T unsigned long +#elif TMW_BITS_PER_SCHAR == 8 +#define UINT8_T unsigned char +#elif TMW_BITS_PER_SHRT == 8 +#define UINT8_T unsigned short +#endif +#endif +#ifdef UINT8_T +typedef UINT8_T powerwindow_uint8_T; +#endif + +#ifndef INT16_T +#if TMW_BITS_PER_INT == 16 +#define INT16_T int +#elif TMW_BITS_PER_LONG == 16 +#define INT16_T long +#elif TMW_BITS_PER_SCHAR == 16 +#define INT16_T signed char +#elif TMW_BITS_PER_SHRT == 16 +#define INT16_T short +#endif +#endif +#ifdef INT16_T +typedef INT16_T powerwindow_int16_T; +#endif + +#ifndef UINT16_T +#if TMW_BITS_PER_INT == 16 +#define UINT16_T unsigned int +#elif TMW_BITS_PER_LONG == 16 +#define UINT16_T unsigned long +#elif TMW_BITS_PER_SCHAR == 16 +#define UINT16_T unsigned char +#elif TMW_BITS_PER_SHRT == 16 +#define UINT16_T unsigned short +#endif +#endif +#ifdef UINT16_T +typedef UINT16_T powerwindow_uint16_T; +#endif + +#ifndef INT32_T +#if TMW_BITS_PER_INT == 32 +#define INT32_T int +#elif TMW_BITS_PER_LONG == 32 +#define INT32_T long +#elif TMW_BITS_PER_SCHAR == 32 +#define INT32_T signed char +#elif TMW_BITS_PER_SHRT == 32 +#define INT32_T short +#endif +#endif +#ifdef INT32_T +typedef INT32_T powerwindow_int32_T; +#endif + +#ifndef UINT32_T +#if TMW_BITS_PER_INT == 32 +#define UINT32_T unsigned int +#elif TMW_BITS_PER_LONG == 32 +#define UINT32_T unsigned long +#elif TMW_BITS_PER_SCHAR == 32 +#define UINT32_T unsigned char +#elif TMW_BITS_PER_SHRT == 32 +#define UINT32_T unsigned short +#endif +#endif +#ifdef UINT32_T +typedef UINT32_T powerwindow_uint32_T; +#endif + +/* The following is used to emulate smaller integer types when only + larger types are available. For example, compilers for TI C3x/C4x DSPs + define char and short to be 32 bits, so 8 and 16 bits are not directly + available. This target is commonly used with RTW rapid prototyping. + Other DSPs define char to be 16 bits, so 8 bits is not directly + available. +*/ +#ifndef INT8_T +#ifdef INT16_T +#define INT8_T INT16_T +typedef INT8_T powerwindow_int8_T; +#else +#ifdef INT32_T +#define INT8_T INT32_T +typedef INT8_T powerwindow_int8_T; +#endif +#endif +#endif + +#ifndef UINT8_T +#ifdef UINT16_T +#define UINT8_T UINT16_T +typedef UINT8_T powerwindow_uint8_T; +#else +#ifdef UINT32_T +#define UINT8_T UINT32_T +typedef UINT8_T powerwindow_uint8_T; +#endif +#endif +#endif + +#ifndef INT16_T +#ifdef INT32_T +#define INT16_T INT32_T +typedef INT16_T powerwindow_int16_T; +#endif +#endif + +#ifndef UINT16_T +#ifdef UINT32_T +#define UINT16_T UINT32_T +typedef UINT16_T powerwindow_uint16_T; +#endif +#endif + +#ifndef NO_FLOATS + +#ifndef REAL32_T +#ifndef __MWERKS__ +#if FLT_MANT_DIG >= 23 +#define REAL32_T float +#endif +#else +#define REAL32_T float +#endif +#endif +#ifdef REAL32_T +typedef REAL32_T powerwindow_real32_T; +#endif + +#ifndef REAL64_T +#ifndef __MWERKS__ +#if DBL_MANT_DIG >= 52 +#define REAL64_T double +#endif +#else +#define REAL64_T double +#endif +#endif +#ifdef REAL64_T +typedef REAL64_T powerwindow_real64_T; +#endif + +#endif /* NO_FLOATS*/ + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int64_T - signed 64 bit integers + powerwindow_uint64_T - unsigned 64 bit integers + =======================================================================*/ + +#ifndef INT64_T +#if defined(__APPLE__) +#define INT64_T long long +#define FMT64 "ll" +#if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(__x86_64__) || defined(__LP64__) +#define INT64_T long +#define FMT64 "l" +#if !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) || \ + (defined(__WATCOMC__) && __WATCOMC__ >= 1100) +#define INT64_T __int64 +#define FMT64 "I64" +#elif defined(__GNUC__) || defined(TMW_ENABLE_INT64) || defined(__LCC64__) +#define INT64_T long long +#define FMT64 "ll" +#endif +#endif + +#if defined(INT64_T) +#if defined(__GNUC__) && \ + ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) +__extension__ +#endif + typedef INT64_T powerwindow_int64_T; +#endif + +#ifndef UINT64_T +#if defined(__APPLE__) +#define UINT64_T unsigned long long +#define FMT64 "ll" +#if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(__x86_64__) || defined(__LP64__) +#define UINT64_T unsigned long +#define FMT64 "l" +#if !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#elif defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) || \ + (defined(__WATCOMC__) && __WATCOMC__ >= 1100) +#define UINT64_T unsigned __int64 +#define FMT64 "I64" +#elif defined(__GNUC__) || defined(TMW_ENABLE_INT64) || defined(__LCC64__) +#define UINT64_T unsigned long long +#define FMT64 "ll" +#endif +#endif + +#if defined(_WIN64) || (defined(__APPLE__) && defined(__LP64__)) || \ + defined(__x86_64__) || defined(__LP64__) +#define INT_TYPE_64_IS_SUPPORTED +#endif + +#if defined(UINT64_T) +#if defined(__GNUC__) && \ + ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) +__extension__ +#endif + typedef UINT64_T powerwindow_uint64_T; +#endif + +/*===========================================================================* + Format string modifiers for using powerwindow_size_t variables in printf + statements. + ===========================================================================*/ + +#ifndef FMT_SIZE_T +#if defined(__GNUC__) || defined(_STDC_C99) +#define FMT_SIZE_T "z" +#elif defined(__WATCOMC__) +#define FMT_SIZE_T "l" +#elif defined(_WIN32) +#define FMT_SIZE_T "I" +#else +#define FMT_SIZE_T "l" +#endif +#endif + +#ifndef FMT_PTRDIFF_T +#if defined(__APPLE__) +#define FMT_PTRDIFF_T "l" +#elif defined(__GNUC__) || defined(_STDC_C99) +#define FMT_PTRDIFF_T "t" +#elif defined(__WATCOMC__) +#define FMT_PTRDIFF_T "l" +#elif defined(_WIN32) +#define FMT_PTRDIFF_T "I" +#else +#define FMT_PTRDIFF_T "l" +#endif +#endif + +/*===========================================================================* + General or logical data types where the word size is not guaranteed. + powerwindow_real_T - possible settings include powerwindow_real32_T or + powerwindow_real64_T powerwindow_time_T - possible settings include + powerwindow_real64_T or powerwindow_uint32_T powerwindow_boolean_T + powerwindow_char_T + powerwindow_int_T + powerwindow_uint_T + powerwindow_byte_T + ===========================================================================*/ + +#ifndef NO_FLOATS + +#ifndef REAL_T +#ifdef REAL64_T +#define REAL_T powerwindow_real64_T +#else +#ifdef REAL32_T +#define REAL_T powerwindow_real32_T +#endif +#endif +#endif +#ifdef REAL_T +typedef REAL_T powerwindow_real_T; +#endif + +#ifndef TIME_T +#ifdef REAL_T +#define TIME_T powerwindow_real_T +#endif +#endif +#ifdef TIME_T +typedef TIME_T powerwindow_time_T; +#endif + +#endif /* NO_FLOATS */ + +#ifndef BOOLEAN_T +#if defined(UINT8_T) +#define BOOLEAN_T UINT8_T +#else +#define BOOLEAN_T unsigned int +#endif +#endif +typedef BOOLEAN_T powerwindow_boolean_T; + +#ifndef CHARACTER_T +#define CHARACTER_T char +#endif +typedef CHARACTER_T powerwindow_char_T; + +#ifndef INTEGER_T +#define INTEGER_T int +#endif +typedef INTEGER_T powerwindow_int_T; + +#ifndef UINTEGER_T +#define UINTEGER_T unsigned +#endif +typedef UINTEGER_T powerwindow_uint_T; + +#ifndef BYTE_T +#define BYTE_T unsigned char +#endif +typedef BYTE_T powerwindow_byte_T; + +/*===========================================================================* + Define Complex Structures + ===========================================================================*/ +#ifndef NO_FLOATS + +#ifndef CREAL32_T +#ifdef REAL32_T +typedef struct { + powerwindow_real32_T re, im; +} powerwindow_creal32_T; +#define CREAL32_T creal32_T +#endif +#endif + +#ifndef CREAL64_T +#ifdef REAL64_T +typedef struct { + powerwindow_real64_T re, im; +} powerwindow_creal64_T; +#define CREAL64_T powerwindow_creal64_T +#endif +#endif + +#ifndef CREAL_T +#ifdef REAL_T +typedef struct { + powerwindow_real_T re, im; +} powerwindow_creal_T; +#define CREAL_T powerwindow_creal_T +#endif +#endif + +#endif /* NO_FLOATS */ + +#ifndef CINT8_T +#ifdef INT8_T +typedef struct { + powerwindow_int8_T re, im; +} powerwindow_cint8_T; +#define CINT8_T powerwindow_cint8_T +#endif +#endif + +#ifndef CUINT8_T +#ifdef UINT8_T +typedef struct { + powerwindow_uint8_T re, im; +} powerwindow_cuint8_T; +#define CUINT8_T powerwindow_cuint8_T +#endif +#endif + +#ifndef CINT16_T +#ifdef INT16_T +typedef struct { + powerwindow_int16_T re, im; +} powerwindow_cint16_T; +#define CINT16_T powerwindow_cint16_T +#endif +#endif + +#ifndef CUINT16_T +#ifdef UINT16_T +typedef struct { + powerwindow_uint16_T re, im; +} powerwindow_cuint16_T; +#define CUINT16_T powerwindow_cuint16_T +#endif +#endif + +#ifndef CINT32_T +#ifdef INT32_T +typedef struct { + powerwindow_int32_T re, im; +} powerwindow_cint32_T; +#define CINT32_T powerwindow_cint32_T +#endif +#endif + +#ifndef CUINT32_T +#ifdef UINT32_T +typedef struct { + powerwindow_uint32_T re, im; +} powerwindow_cuint32_T; +#define CUINT32_T powerwindow_cuint32_T +#endif +#endif + +#ifndef CINT64_T +#ifdef INT64_T +typedef struct { + powerwindow_int64_T re, im; +} powerwindow_cint64_T; +#define CINT64_T powerwindow_cint64_T +#endif +#endif + +#ifndef CUINT64_T +#ifdef UINT64_T +typedef struct { + powerwindow_uint64_T re, im; +} powerwindow_cuint64_T; +#define CUINT64_T powerwindow_cuint64_T +#endif +#endif + +/*=======================================================================* + Min and Max: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed + 8, 16, or 32 bit integers powerwindow_uint8_T, powerwindow_uint16_T, + powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + =======================================================================*/ + +#define powerwindow_MAX_int8_T ((powerwindow_int8_T) (127)) /* 127 */ +#define powerwindow_MIN_int8_T ((powerwindow_int8_T) (-128)) /* -128 */ +#define powerwindow_MAX_uint8_T ((powerwindow_uint8_T) (255)) /* 255 */ +#define powerwindow_MIN_uint8_T ((powerwindow_uint8_T) (0)) + +#define powerwindow_MAX_int16_T ((powerwindow_int16_T) (32767)) /* 32767 */ +#define powerwindow_MIN_int16_T ((powerwindow_int16_T) (-32768)) /* -32768 */ +#define powerwindow_MAX_uint16_T ((powerwindow_uint16_T) (65535)) /* 65535 */ +#define powerwindow_MIN_uint16_T ((powerwindow_uint16_T) (0)) + +#define powerwindow_MAX_int32_T \ + ((powerwindow_int32_T) (2147483647)) /* 2147483647 */ +#define powerwindow_MIN_int32_T \ + ((powerwindow_int32_T) (-2147483647 - 1)) /* -2147483648 */ +#define powerwindow_MAX_uint32_T \ + ((powerwindow_uint32_T) (0xFFFFFFFFU)) /* 4294967295 */ +#define powerwindow_MIN_uint32_T ((powerwindow_uint32_T) (0)) + +#if defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) || \ + (defined(__WATCOMC__) && __WATCOMC__ >= 1100) || defined(__LCC64__) +#ifdef INT64_T +#define powerwindow_MAX_int64_T ((powerwindow_int64_T) (9223372036854775807LL)) +#define powerwindow_MIN_int64_T \ + ((powerwindow_int64_T) (-9223372036854775807LL - 1LL)) +#endif +#ifdef UINT64_T +#define powerwindow_MAX_uint64_T \ + ((powerwindow_uint64_T) (0xFFFFFFFFFFFFFFFFULL)) +#define powerwindow_MIN_uint64_T ((powerwindow_uint64_T) (0)) +#endif +#else +#ifdef INT64_T +#ifdef INT_TYPE_64_IS_LONG +#define powerwindow_MAX_int64_T ((powerwindow_int64_T) (9223372036854775807L)) +#define powerwindow_MIN_int64_T \ + ((powerwindow_int64_T) (-9223372036854775807L - 1L)) +#else +#define powerwindow_MAX_int64_T ((powerwindow_int64_T) (9223372036854775807LL)) +#define powerwindow_MIN_int64_T \ + ((powerwindow_int64_T) (-9223372036854775807LL - 1LL)) +#endif +#endif +#ifdef UINT64_T +#ifdef INT_TYPE_64_IS_LONG +#define powerwindow_MAX_uint64_T ((powerwindow_uint64_T) (0xFFFFFFFFFFFFFFFFUL)) +#define powerwindow_MIN_uint64_T ((powerwindow_uint64_T) (0)) +#else +#define powerwindow_MAX_uint64_T \ + ((powerwindow_uint64_T) (0xFFFFFFFFFFFFFFFFULL)) +#define powerwindow_MIN_uint64_T ((powerwindow_uint64_T) (0)) +#endif +#endif +#endif + +#ifdef _MSC_VER +/* Conversion from unsigned __int64 to double is not implemented in windows + and results in a compile error, thus the value must first be cast to + signed __int64, and then to double. + + If the 64 bit int value is greater than 2^63-1, which is the signed int64 + max, the macro below provides a workaround for casting a uint64 value to a + double in windows. +*/ +#define uint64_to_double(u) \ + (((u) > _I64_MAX) \ + ? (double) (__int64) ((u) - _I64_MAX - 1) + (double) _I64_MAX + 1 \ + : (double) (__int64) (u)) + +/* The following inline function should only be used in the macro + double_to_uint64, as it only handles the specfic range of double between 2^63 + and 2^64-1 */ +__forceinline powerwindow_uint64_T + __attribute__((always_inline)) static inline double_to_uint64_helpe + r(double d) { + union double_to_uint64_union_type { + double dd; + powerwindow_uint64_T i64; + } di; + di.dd = d; + return (((di.i64 & 0x000fffffffffffff) | 0x0010000000000000) << 11); +} + +/* The largest double value that can be cast to uint64 in windows is the + signed int64 max, which is 2^63-1. The macro below provides + a workaround for casting large double values to uint64 in windows. +*/ +/* The magic number 18446744073709551616.0 is 2^64 */ +/* The magic number 9223372036854775808.0 is 2^63 */ +#define double_to_uint64(d) \ + (((d) >= 18446744073709551616.0) ? 0xffffffffffffffffULL \ + : ((d) < 0.0) ? 0ULL \ + : ((d) >= 9223372036854775808.0) ? double_to_uint64_helper(d) \ + : (unsigned __int64) (d)) +#else +#define uint64_to_double(u) ((double) (u)) +#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__TICCSC__) +/* double_to_uint64 defined only for MSVC and UNIX */ +#else +#define double_to_uint64(d) \ + (((d) > 0xffffffffffffffffULL) \ + ? (unsigned long long) 0xffffffffffffffffULL \ + : ((d) < 0) ? (unsigned long long) 0 \ + : (unsigned long long) (d)) +#endif +#endif + +#if !defined(__cplusplus) && !defined(__bool_true_false_are_defined) + +#ifndef _bool_T +#define _bool_T + +typedef powerwindow_boolean_T bool; + +#ifndef false +#define false (0) +#endif +#ifndef true +#define true (1) +#endif + +#endif /* _bool_T */ + +#endif /* !__cplusplus */ + +/* + This software assumes that the code is being compiled on a target using a + 2's complement representation for signed integer values. +*/ +#if ((SCHAR_MIN + 1) != -SCHAR_MAX) +#error \ + "This code must be compiled using a 2's complement representation for signed integer values" +#endif + +/* + Maximum length of a MATLAB identifier (function/variable/model) + including the null-termination character. +*/ +#define TMW_NAME_LENGTH_MAX 64 + +#ifdef MX_COMPAT_32 +typedef int powerwindow_mwSize; +typedef int powerwindow_mwIndex; +typedef int powerwindow_mwSignedIndex; +#else +typedef size_t powerwindow_mwSize; /* unsigned pointer-width integer */ +typedef size_t powerwindow_mwIndex; /* unsigned pointer-width integer */ +typedef ptrdiff_t + powerwindow_mwSignedIndex; /* a signed pointer-width integer */ +#endif + +#if (defined(_LP64) || defined(_WIN64)) && !defined(MX_COMPAT_32) +/* Currently 2^48 based on hardware limitations */ +#define powerwindow_MWSIZE_MAX 281474976710655UL +#define powerwindow_MWINDEX_MAX 281474976710655UL +#define powerwindow_MWSINDEX_MAX 281474976710655L +#define powerwindow_MWSINDEX_MIN -281474976710655L +#else +#define powerwindow_MWSIZE_MAX 2147483647UL +#define powerwindow_MWINDEX_MAX 2147483647UL +#define powerwindow_MWSINDEX_MAX 2147483647L +#define powerwindow_MWSINDEX_MIN -2147483647L +#endif +#define powerwindow_MWSIZE_MIN 0UL +#define powerwindow_MWINDEX_MIN 0UL + +/** UTF-16 character type */ + +#if (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + (defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && \ + _HAS_CHAR16_T_LANGUAGE_SUPPORT) +typedef char16_t powerwindow_CHAR16_T; +#elif defined(_MSC_VER) +typedef wchar_t powerwindow_CHAR16_T; +#else +typedef UINT16_T powerwindow_CHAR16_T; +#endif + +#endif /* powerwindow__TMWTYPES__ */ + +#endif /* powerwindow_tmwtypes_h */ diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.c b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.c new file mode 100644 index 0000000..09b80aa --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.c @@ -0,0 +1,16 @@ +#include "wcclib.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void * +wcclib_memset(void *s, int c, size_t n) { + unsigned char *p = s; + + __pragma_loopbound(1, 368); + while (n--) + *p++ = (unsigned char) c; + return (s); +} diff --git a/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.h b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.h new file mode 100644 index 0000000..61c43f2 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/generated/modified_sources/inline/wcclib.h @@ -0,0 +1,16 @@ + +#ifndef _WCCLIB +#define _WCCLIB + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#define NULL ((void *) 0) + +__attribute__((always_inline)) static inline void *wcclib_memset(void *s, int c, + size_t n); + +#endif // _WCCLIB diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow.c b/targets/wasm-tacle/app/powerwindow/powerwindow.c new file mode 100644 index 0000000..1976506 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow.c @@ -0,0 +1,747 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow implement the powerwindow that can be seen in cars nowadays. + The window can be controlled by either driver or passenger. When an object is + detected between the window frame and the glass during the raising of the glass, + the glass will lower down for some distance. This benchmark contains 4 tasks which includes the + driver side powerwindow, front passenger side powerwindow, back-left passenger side powerwindow, + back-right passenger side powerwindow. These 4 tasks can be easily adjusted to execute in + sequential order parallel on single or muti core. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow.c + + Changes: a brief summary of major functional changes and formatting) + * 2023-12-07: Added loop bounds + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h" +#include "powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion.h" /* Control Model's header file */ +#include "powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" /* PW passenger control Model's header file */ +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +/* + Forward declaration of functions +*/ + + +void powerwindow_Booleaninputarray_initialize( powerwindow_boolean_T *, + powerwindow_boolean_T * ); +void powerwindow_Uint8inputarray_initialize( powerwindow_uint8_T *, + powerwindow_uint8_T * ); +void powerwindow_init(); +void powerwindow_main(); +int powerwindow_return(); +int main( void ); + + + + +//DRV +void powerwindow_init_DRV( int ); +void powerwindow_input_initialize_DRV( void ); +void powerwindow_initialize_DRV( void ); +void powerwindow_return_DRV( void ); +void powerwindow_DRV_main( void ); + +// PSG_Front +void powerwindow_init_PSG_Front( int ); +void powerwindow_input_initialize_PSG_Front( void ); +void powerwindow_initialize_PSG_Front( void ); +void powerwindow_return_PSG_Front( void ); +void powerwindow_PSG_Front_main( void ); + +// PSG_BackL +void powerwindow_init_PSG_BackL( int ); +void powerwindow_input_initialize_PSG_BackL( void ); +void powerwindow_initialize_PSG_BackL( void ); +void powerwindow_return_PSG_BackL( void ); +void powerwindow_PSG_BackL_main( void ); + +// PSG_BackR +void powerwindow_init_PSG_BackR( int ); +void powerwindow_input_initialize_PSG_BackR( void ); +void powerwindow_initialize_PSG_BackR( void ); +void powerwindow_return_PSG_BackR( void ); +void powerwindow_PSG_BackR_main( void ); + + + +/* + Declaration of global variables +*/ + +/* External inputs (root inport signals with auto storage) */ + +extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; +extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; +extern powerwindow_ExternalInputs_PW_Control_PSG_Front +powerwindow_PW_Control_PSG_Front_U; +extern powerwindow_ExternalInputs_PW_Control_PSG_BackL +powerwindow_PW_Control_PSG_BackL_U; +extern powerwindow_ExternalInputs_PW_Control_PSG_BackR +powerwindow_PW_Control_PSG_BackR_U; + + + +powerwindow_boolean_T +powerwindow_debounce_Driver_DRV_U_Up_Input_DRV[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_DRV_U_Down_Input_DRV[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_Front_U_Up_Input_Front[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_Front_U_Down_Input_Front[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_BackL_U_Up_Input_BackL[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_BackL_U_Down_Input_BackL[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_BackR_U_Up_Input_BackR[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_Driver_BackR_U_Down_Input_BackR[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV[ powerwindow_input_length ]; +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_Input_DRV[ powerwindow_input_length ]; + + +extern powerwindow_boolean_T +powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array[ powerwindow_input_length ]; +extern powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_DRV_Array[ powerwindow_input_length ]; + +powerwindow_boolean_T +powerwindow_controlexclusion_U_Up_DRV_Input_Front[ powerwindow_input_length ]; /* Here applied a push-down button, the signal is high when the button is not pressed. */ +powerwindow_boolean_T +powerwindow_controlexclusion_U_Down_DRV_Input_Front[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_passenger_Front_U_Up_Input_Front[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_passenger_Front_U_Down_Input_Front[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front[ powerwindow_input_length ]; +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_Input_Front[ powerwindow_input_length ]; + +extern powerwindow_boolean_T +powerwindow_debounce_passenger_Front_U_Up_Front_Array[ powerwindow_input_length ]; /* Here applied a push-down button, the signal is high when the button is not pressed. */ +extern powerwindow_boolean_T +powerwindow_debounce_passenger_Front_U_Down_Front_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array[ powerwindow_input_length ]; +extern powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_Front_Array[ powerwindow_input_length ]; + +powerwindow_boolean_T +powerwindow_controlexclusion_U_Up_DRV_Input_BackL[ powerwindow_input_length ]; /* Here applied a push-down button, the signal is high when the button is not pressed. */ +powerwindow_boolean_T +powerwindow_controlexclusion_U_Down_DRV_Input_BackL[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_passenger_BackL_U_Up_Input_BackL[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_passenger_BackL_U_Down_Input_BackL[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL[ powerwindow_input_length ]; +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_Input_BackL[ powerwindow_input_length ]; + +extern powerwindow_boolean_T +powerwindow_debounce_passenger_BackL_U_Up_BackL_Array[ powerwindow_input_length ]; /* Here applied a push-down button, the signal is high when the button is not pressed. */ +extern powerwindow_boolean_T +powerwindow_debounce_passenger_BackL_U_Down_BackL_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array[ powerwindow_input_length ]; +extern powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_BackL_Array[ powerwindow_input_length ]; + +powerwindow_boolean_T +powerwindow_controlexclusion_U_Up_DRV_Input_BackR[ powerwindow_input_length ]; /* Here applied a push-down button, the signal is high when the button is not pressed. */ +powerwindow_boolean_T +powerwindow_controlexclusion_U_Down_DRV_Input_BackR[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_passenger_BackR_U_Up_Input_BackR[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_debounce_passenger_BackR_U_Down_Input_BackR[ powerwindow_input_length ]; +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR[ powerwindow_input_length ]; +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_Input_BackR[ powerwindow_input_length ]; + +extern powerwindow_boolean_T +powerwindow_debounce_passenger_BackR_U_Up_BackR_Array[ powerwindow_input_length ]; /* Here applied a push-down button, the signal is high when the button is not pressed. */ +extern powerwindow_boolean_T +powerwindow_debounce_passenger_BackR_U_Down_BackR_Array[ powerwindow_input_length ]; +extern powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array[ powerwindow_input_length ]; +extern powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_BackR_Array[ powerwindow_input_length ]; + +int powerwindow_main_inputcyclecounter; + +/* + Initialization- and return-value-related functions +*/ +void powerwindow_init_DRV( int i ) +{ + powerwindow_PW_Control_DRV_U.In1 = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV[ i ]; /* The when the window reaches the end of the range, the endofdetectionrange changes to 0. */ + powerwindow_PW_Control_DRV_U.In3 = + powerwindow_powerwindow_control_U_currentsense_Input_DRV[ i ]; /* When the currentsense is higher than 92 (based on experiments), one object is stuck between the window and the frame. Pinch is set to True.*/ + + powerwindow_PW_Control_DRV_U.In2 = + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In4 = + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + + powerwindow_PW_Control_DRV_U.In5 = + powerwindow_debounce_Driver_Front_U_Up_Input_Front[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In6 = + powerwindow_debounce_Driver_Front_U_Down_Input_Front[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + + powerwindow_PW_Control_DRV_U.In9 = + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In10 = + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + + powerwindow_PW_Control_DRV_U.In7 = + powerwindow_debounce_Driver_BackR_U_Up_Input_BackR[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_DRV_U.In8 = + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR[ i ]; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + +} + +void powerwindow_init_PSG_Front( int i ) +{ + + + powerwindow_PW_Control_PSG_Front_U.Up_DRV = + powerwindow_PW_Control_DRV_Y.Out6; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_Front_U.Down_DRV = + powerwindow_PW_Control_DRV_Y.Out7; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front = + powerwindow_debounce_passenger_Front_U_Up_Input_Front[ i ]; + powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front = + powerwindow_debounce_passenger_Front_U_Down_Input_Front[ i ]; /* '/Down'. Here applied a push-down button, the signal is high when the button is not pressed. Change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_Front_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front[ i ]; /* The when the window reaches the end of the range, the endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_Front_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_Front[ i ]; /* When the currentsense is higher than 92 (based on experiments), one object is stuck between the window and the frame. Pinch is set to True.*/ + +} + +void powerwindow_init_PSG_BackL( int i ) +{ + + + powerwindow_PW_Control_PSG_BackL_U.Up_DRV = + powerwindow_PW_Control_DRV_Y.Out10; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_BackL_U.Down_DRV = + powerwindow_PW_Control_DRV_Y.Out11; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL = + powerwindow_debounce_passenger_BackL_U_Up_Input_BackL[ i ]; + powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL = + powerwindow_debounce_passenger_BackL_U_Down_Input_BackL[ i ]; /* '/Down'. Here applied a push-down button, the signal is high when the button is not pressed. Change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL[ i ]; /* The when the window reaches the end of the range, the endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_BackL_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_BackL[ i ]; /* When the currentsense is higher than 92 (based on experiments), one object is stuck between the window and the frame. Pinch is set to True.*/ + +} + +void powerwindow_init_PSG_BackR( int i ) +{ + + + powerwindow_PW_Control_PSG_BackR_U.Up_DRV = + powerwindow_PW_Control_DRV_Y.Out8; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lift the window. */ + powerwindow_PW_Control_PSG_BackR_U.Down_DRV = + powerwindow_PW_Control_DRV_Y.Out9; /* The debounced control signal from the driver. 1 when the button is not pressed, change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR = + powerwindow_debounce_passenger_BackR_U_Up_Input_BackR[ i ]; + powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR = + powerwindow_debounce_passenger_BackR_U_Down_Input_BackR[ i ]; /* '/Down'. Here applied a push-down button, the signal is high when the button is not pressed. Change to 0 to lower the window. */ + + powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange = + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR[ i ]; /* The when the window reaches the end of the range, the endofdetectionrange changes to 0. */ + + powerwindow_PW_Control_PSG_BackR_U.currentsense = + powerwindow_powerwindow_control_U_currentsense_Input_BackR[ i ]; /* When the currentsense is higher than 92 (based on experiments), one object is stuck between the window and the frame. Pinch is set to True.*/ + +} + +void powerwindow_input_initialize_DRV( void ) +{ + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV, + powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV, + powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_Front_U_Up_Input_Front, + powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_Front_U_Down_Input_Front, + powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL, + powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL, + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackL_U_Down_Input_BackL, + powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR, + powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array ); + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_DRV, + powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array ); + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_DRV_Array, + powerwindow_powerwindow_control_U_currentsense_DRV_Array ); + +} + + + +void powerwindow_input_initialize_PSG_Front( void ) +{ + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_Front_U_Up_Input_Front, + powerwindow_debounce_passenger_Front_U_Up_Front_Array ); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_Front_U_Down_Input_Front, + powerwindow_debounce_passenger_Front_U_Down_Front_Array ); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_Front, + powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array ); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_Front, + powerwindow_powerwindow_control_U_currentsense_Front_Array ); + +} + + +void powerwindow_input_initialize_PSG_BackL( void ) +{ + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackL_U_Up_Input_BackL, + powerwindow_debounce_passenger_BackL_U_Up_BackL_Array ); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackL_U_Down_Input_BackL, + powerwindow_debounce_passenger_BackL_U_Down_BackL_Array ); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackL, + powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array ); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_BackL, + powerwindow_powerwindow_control_U_currentsense_BackL_Array ); + +} + +void powerwindow_input_initialize_PSG_BackR( void ) +{ + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackR_U_Up_Input_BackR, + powerwindow_debounce_passenger_BackR_U_Up_BackR_Array ); + + powerwindow_Booleaninputarray_initialize( + powerwindow_debounce_passenger_BackR_U_Down_Input_BackR, + powerwindow_debounce_passenger_BackR_U_Down_BackR_Array ); + + powerwindow_Booleaninputarray_initialize( + powerwindow_powerwindow_control_U_endofdetectionrange_Input_BackR, + powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array ); + + powerwindow_Uint8inputarray_initialize( + powerwindow_powerwindow_control_U_currentsense_Input_BackR, + powerwindow_powerwindow_control_U_currentsense_BackR_Array ); + +} + +void powerwindow_Booleaninputarray_initialize( powerwindow_boolean_T *arrayA, + powerwindow_boolean_T *arrayB ) +{ + + register int i; + _Pragma( "loopbound min 977 max 977" ) + for ( i = 0; i < powerwindow_input_length; i++ ) + arrayA[ i ] = arrayB[ i ]; +} + +void powerwindow_Uint8inputarray_initialize( powerwindow_uint8_T *arrayA, + powerwindow_uint8_T *arrayB ) +{ + + register int i; + _Pragma( "loopbound min 977 max 977" ) + for ( i = 0; i < powerwindow_input_length; i++ ) + arrayA[ i ] = arrayB[ i ]; +} + +void powerwindow_initialize_DRV( void ) +{ + /* Initialize model */ + powerwindow_PW_Control_DRV_initialize(); + +} + +void powerwindow_initialize_PSG_Front( void ) +{ + /* Initialize model */ + powerwindow_PW_Control_PSG_Front_initialize(); + +} + +void powerwindow_initialize_PSG_BackL( void ) +{ + /* Initialize model */ + powerwindow_PW_Control_PSG_BackL_initialize(); + +} + +void powerwindow_initialize_PSG_BackR( void ) +{ + /* Initialize model */ + powerwindow_PW_Control_PSG_BackR_initialize(); + +} + + +void powerwindow_return_DRV( void ) +{ + /* Terminate model */ + powerwindow_PW_Control_DRV_terminate(); + +} + +void powerwindow_return_PSG_Front( void ) +{ + /* Terminate model */ + powerwindow_PW_Control_PSG_Front_terminate(); + +} + +void powerwindow_return_PSG_BackL( void ) +{ + /* Terminate model */ + powerwindow_PW_Control_PSG_BackL_terminate(); + +} + +void powerwindow_return_PSG_BackR( void ) +{ + /* Terminate model */ + powerwindow_PW_Control_PSG_BackR_terminate(); + +} + +/* + Main functions +*/ + +/* + Associating powerwindow_main with a real-time clock or interrupt service routine + is what makes the generated code "real-time". The function powerwindow_main is + always associated with the base rate of the model. Subrates are managed + by the base rate from inside the generated code. Enabling/disabling + interrupts and floating point context switches are target specific. This + example code indicates where these should take place relative to executing + the generated code step function. Overrun behavior should be tailored to + your application needs. This example simply sets an error status in the + real-time model and returns from powerwindow_main. +*/ + + +void powerwindow_DRV_main( void ) +{ + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if ( OverrunFlag ) { + powerwindow_PW_DRV_rtmSetErrorStatus( powerwindow_PW_Control_DRV_M, + "Overrun" ); ////////// + + return; + } + + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + + powerwindow_PW_Control_DRV_main(); + + /* Get model outputs here */ + + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ + +} + +/* + The example "main" function illustrates what is required by your + application code to initialize, execute, and terminate the generated code. + Attaching powerwindow_main to a real-time clock is target specific. This example + illustates how you do this relative to initializing the model. +*/ + +void powerwindow_PSG_Front_main( void ) +{ + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if ( OverrunFlag ) { + powerwindow_PW_PSG_Front_rtmSetErrorStatus( powerwindow_PW_Control_PSG_Front_M, + "Overrun" ); + + return; + } + + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + + powerwindow_PW_Control_PSG_Front_main(); + + /* Get model outputs here */ + + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ + +} + +void powerwindow_PSG_BackL_main( void ) +{ + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if ( OverrunFlag ) { + powerwindow_PW_PSG_BackL_rtmSetErrorStatus( powerwindow_PW_Control_PSG_BackL_M, + "Overrun" ); + + return; + } + + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + + powerwindow_PW_Control_PSG_BackL_main(); + + /* Get model outputs here */ + + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ + +} + +void powerwindow_PSG_BackR_main( void ) +{ + + static powerwindow_boolean_T OverrunFlag = 0; + + /* Disable interrupts here */ + + /* Check for overrun */ + if ( OverrunFlag ) { + powerwindow_PW_PSG_BackR_rtmSetErrorStatus( powerwindow_PW_Control_PSG_BackR_M, + "Overrun" ); + + return; + } + + + OverrunFlag = true; + + /* Save FPU context here (if necessary) */ + /* Re-enable timer or interrupt here */ + /* Set model inputs here */ + + + powerwindow_PW_Control_PSG_BackR_main(); + + /* Get model outputs here */ + + + /* Indicate task complete */ + OverrunFlag = false; + + /* Disable interrupts here */ + /* Restore FPU context here (if necessary) */ + /* Enable interrupts here */ + +} + +void powerwindow_init( void ) +{ + powerwindow_initialize_DRV(); + powerwindow_initialize_PSG_Front(); + powerwindow_initialize_PSG_BackL(); + powerwindow_initialize_PSG_BackR(); + powerwindow_main_inputcyclecounter = 0; + +} + +void _Pragma( "entrypoint" ) powerwindow_main( void ) +{ + /* Attach powerwindow_main to a timer or interrupt service routine with + period 0.005 seconds (the model's base sample time) here. The + call syntax for powerwindow_main is + + powerwindow_main(); + */ + //Task 1: Driver side window + + + powerwindow_input_initialize_DRV(); + powerwindow_input_initialize_PSG_Front(); + powerwindow_input_initialize_PSG_BackL(); + powerwindow_input_initialize_PSG_BackR(); + + _Pragma( "loopbound min 977 max 977" ) + while ( powerwindow_main_inputcyclecounter < powerwindow_input_length ) { + + powerwindow_init_DRV( powerwindow_main_inputcyclecounter ); + powerwindow_DRV_main(); + + + //Task 2: Front passenger side window + + + powerwindow_init_PSG_Front( powerwindow_main_inputcyclecounter ); + powerwindow_PSG_Front_main(); + + + //Task 3: Back left passenger side window + + + powerwindow_init_PSG_BackL( powerwindow_main_inputcyclecounter ); + powerwindow_PSG_BackL_main(); + + + //Task 4: Back right passenger side window + + + powerwindow_init_PSG_BackR( powerwindow_main_inputcyclecounter ); + powerwindow_PSG_BackR_main(); + + + powerwindow_main_inputcyclecounter++; + } + + +} + +int powerwindow_return( void ) +{ + powerwindow_return_DRV(); + powerwindow_return_PSG_Front(); + powerwindow_return_PSG_BackL(); + powerwindow_return_PSG_BackR(); + + return 0; +} + + +int main( void ) +{ + powerwindow_init(); + powerwindow_main(); + return powerwindow_return(); +} + + +/* + File trailer for generated code. + + [ EOF ] +*/ + + + diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow.h new file mode 100644 index 0000000..8013c0a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow.h @@ -0,0 +1,22 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef NULL +#define NULL ((viod *) 0) +#endif diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h new file mode 100644 index 0000000..a5690a8 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h @@ -0,0 +1,148 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_ +#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_h_ +#ifndef powerwindow_PW_Control_DRV_COMMON_INCLUDES_ +# define powerwindow_PW_Control_DRV_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* powerwindow_PW_Control_DRV_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_DRV_rtmGetErrorStatus +# define powerwindow_PW_DRV_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_DRV_rtmSetErrorStatus +# define powerwindow_PW_DRV_rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_DRV_rtmGetErrorStatusPointer +# define powerwindow_PW_DRV_rtmGetErrorStatusPointer(rtm) ((const powerwindow_char_T **)(&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_DRV_DWORK1;/* '/Debounce_Up_DRV' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DRV_DWORK1;/* '/Debounce_Down_DRV' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_BackL_DWORK1;/* '/Debounce_Up_PSG_BackL' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_BackL_DWORK1;/* '/Debounce_Down_PSG_BackL' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_Front_DWORK1;/* '/Debounce_Up_PSG_Front' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_Front_DWORK1;/* '/Debounce_Down_PSG_Front' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Up_PSG_BackR_DWORK1;/* '/Debounce_Up_PSG_BackR' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_PSG_BackR_DWORK1;/* '/Debounce_Down_PSG_BackR' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr PW_DRV_DWORK1;/* '/PW_DRV' */ +} powerwindow_D_Work_powerwindow_PW_Control_D; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T In1; /* '/In1' */ + powerwindow_boolean_T In2; /* '/In2' */ + powerwindow_uint8_T In3; /* '/In3' */ + powerwindow_boolean_T In4; /* '/In4' */ + powerwindow_boolean_T In5; /* '/In5' */ + powerwindow_boolean_T In6; /* '/In6' */ + powerwindow_boolean_T In7; /* '/In7' */ + powerwindow_boolean_T In8; /* '/In8' */ + powerwindow_boolean_T In9; /* '/In9' */ + powerwindow_boolean_T In10; /* '/In10' */ +} powerwindow_ExternalInputs_powerwindow_PW_C; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Out1; /* '/Out1' */ + powerwindow_boolean_T Out2; /* '/Out2' */ + powerwindow_boolean_T Out3; /* '/Out3' */ + powerwindow_boolean_T Out4; /* '/Out4' */ + powerwindow_boolean_T Out5; /* '/Out5' */ + powerwindow_boolean_T Out6; /* '/Out6' */ + powerwindow_boolean_T Out7; /* '/Out7' */ + powerwindow_boolean_T Out8; /* '/Out8' */ + powerwindow_boolean_T Out9; /* '/Out9' */ + powerwindow_boolean_T Out10; /* '/Out10' */ + powerwindow_boolean_T Out11; /* '/Out11' */ +} powerwindow_ExternalOutputs_powerwindow_PW_; + +struct powerwindow_tag_RTM_PW_Control_DRV { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_powerwindow_PW_Control_D +powerwindow_PW_Control_DR_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; + +/* Model entry point functions */ +extern void powerwindow_PW_Control_DRV_initialize( void ); +extern void powerwindow_PW_Control_DRV_main( void ); +extern void powerwindow_PW_Control_DRV_terminate( void ); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/powerwindow_PW_Control_DRV') - opens subsystem PowerWindow/powerwindow_PW_Control_DRV + hilite_system('PowerWindow/powerwindow_PW_Control_DRV/Kp') - opens and selects block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/powerwindow_PW_Control_DRV' + '' : 'PowerWindow/powerwindow_PW_Control_DRV/Debounce_DRV' +*/ +#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h new file mode 100644 index 0000000..2c55110 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ +#define powerwindow_RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#endif /* RTW_HEADER_powerwindow_PW_Control_DRV_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h new file mode 100644 index 0000000..e2cafb3 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h @@ -0,0 +1,33 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_DRV_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_DRV_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_DRV + powerwindow_RT_MODEL_PW_Control_DRV; + +#endif /* RTW_HEADER_PW_Control_DRV_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h new file mode 100644 index 0000000..e827ed6 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h @@ -0,0 +1,135 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_h_ +#ifndef powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_ +# define powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* powerwindow_PW_Control_PSG_BackL_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_BackL_BackL_rtmGetErrorStatus +# define powerwindow_PW_PSG_BackL_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_BackL_rtmSetErrorStatus +# define powerwindow_PW_PSG_BackL_rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer +# define powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer(rtm) ((const powerwindow_char_T **)(&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T Debounce_Up_DWORK1;/* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1;/* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_BackL_DWORK1;/* '/PW_PSG_BackL' */ +} powerwindow_D_Work_PW_Control_PSG_BackL; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T + Up_PSG_BackL; /* '/Up_PSG_BackL' */ + powerwindow_boolean_T + Down_PSG_BackL; /* '/Down_PSG_BackL' */ +} powerwindow_ExternalInputs_PW_Control_PSG_BackL; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_BackL; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_BackL { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_BackL +powerwindow_PW_Control_PSG_BackL_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_BackL +powerwindow_PW_Control_PSG_BackL_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_BackL +powerwindow_PW_Control_PSG_BackL_Y; + +/* Model entry point functions */ +extern void powerwindow_PW_Control_PSG_BackL_initialize( void ); +extern void powerwindow_PW_Control_PSG_BackL_main( void ); +extern void powerwindow_PW_Control_PSG_BackL_terminate( void ); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_BackL *const +powerwindow_PW_Control_PSG_BackL_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_BackL') - opens subsystem PowerWindow/PW_Control_PSG_BackL + hilite_system('PowerWindow/PW_Control_PSG_BackL/Kp') - opens and selects block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_BackL' + '' : 'PowerWindow/PW_Control_PSG_BackL/Debounce_PSG_BackL' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_BackL_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h new file mode 100644 index 0000000..24a4a95 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#endif /* RTW_HEADER_PW_Control_PSG_BackL_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h new file mode 100644 index 0000000..f77a0c9 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h @@ -0,0 +1,33 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackL_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackL + powerwindow_RT_MODEL_PW_Control_PSG_BackL; + +#endif /* RTW_HEADER_PW_Control_PSG_BackL_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h new file mode 100644 index 0000000..c37115d --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h @@ -0,0 +1,135 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_h_ +#ifndef powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_ +# define powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* powerwindow_PW_Control_PSG_BackR_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatus +# define powerwindow_PW_PSG_BackR_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_BackR_rtmSetErrorStatus +# define powerwindow_PW_PSG_BackR_rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer +# define powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer(rtm) ((const powerwindow_char_T **)(&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T Debounce_Up_DWORK1;/* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1;/* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_BackR_DWORK1;/* '/PW_PSG_BackR' */ +} powerwindow_D_Work_PW_Control_PSG_BackR; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T + Up_PSG_BackR; /* '/Up_PSG_BackR' */ + powerwindow_boolean_T + Down_PSG_BackR; /* '/Down_PSG_BackR' */ +} powerwindow_ExternalInputs_PW_Control_PSG_BackR; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_BackR; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_BackR { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_BackR +powerwindow_PW_Control_PSG_BackR_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_BackR +powerwindow_PW_Control_PSG_BackR_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_BackR +powerwindow_PW_Control_PSG_BackR_Y; + +/* Model entry point functions */ +extern void powerwindow_PW_Control_PSG_BackR_initialize( void ); +extern void powerwindow_PW_Control_PSG_BackR_main( void ); +extern void powerwindow_PW_Control_PSG_BackR_terminate( void ); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_BackR *const +powerwindow_PW_Control_PSG_BackR_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_BackR') - opens subsystem PowerWindow/PW_Control_PSG_BackR + hilite_system('PowerWindow/PW_Control_PSG_BackR/Kp') - opens and selects block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_BackR' + '' : 'PowerWindow/PW_Control_PSG_BackR/Debounce_PSG' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h new file mode 100644 index 0000000..40d0376 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#endif /* RTW_HEADER_PW_Control_PSG_BackR_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h new file mode 100644 index 0000000..9c71f28 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h @@ -0,0 +1,32 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR_tyoes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_BackR_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_BackR + powerwindow_RT_MODEL_PW_Control_PSG_BackR; + +#endif /* RTW_HEADER_PW_Control_PSG_BackR_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h new file mode 100644 index 0000000..bcff85e --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h @@ -0,0 +1,135 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_h_ +#ifndef powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_ +# define powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* powerwindow_PW_Control_PSG_Front_COMMON_INCLUDES_*/ + +#include "../powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Child system includes */ +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "../powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatus +# define powerwindow_PW_PSG_Front_rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef powerwindow_PW_PSG_Front_rtmSetErrorStatus +# define powerwindow_PW_PSG_Front_rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val)) +#endif + +#ifndef powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer +# define powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer(rtm) ((const powerwindow_char_T **)(&((rtm)->errorStatus))) +#endif + +/* Block states (auto storage) for system '' */ +typedef struct { + powerwindow_rtMdlrefDWork_debounce_T Debounce_Up_DWORK1;/* '/Debounce_Up' */ + powerwindow_rtMdlrefDWork_debounce_T + Debounce_Down_DWORK1;/* '/Debounce_Down' */ + powerwindow_rtMdlrefDWork_PowerWindow_contr + PW_PSG_Front_Front_DWORK1;/* '/PW_PSG_Front_Front' */ +} powerwindow_D_Work_PW_Control_PSG_Front; + +/* External inputs (root inport signals with auto storage) */ +typedef struct { + powerwindow_boolean_T Up_DRV; /* '/Up_DRV' */ + powerwindow_boolean_T Down_DRV; /* '/Down_DRV' */ + powerwindow_boolean_T + endofdetectionrange; /* '/end of detection range' */ + powerwindow_uint8_T currentsense; /* '/current sense' */ + powerwindow_boolean_T + Up_PSG_Front; /* '/Up_PSG_Front' */ + powerwindow_boolean_T + Down_PSG_Front; /* '/Down_PSG_Front' */ +} powerwindow_ExternalInputs_PW_Control_PSG_Front; + +/* External outputs (root outports fed by signals with auto storage) */ +typedef struct { + powerwindow_boolean_T window_up; /* '/window_up' */ + powerwindow_boolean_T window_down; /* '/window_down' */ + powerwindow_boolean_T overcurrent; /* '/overcurrent' */ + powerwindow_boolean_T pinch; /* '/pinch' */ + powerwindow_boolean_T wake; /* '/wake' */ +} powerwindow_ExternalOutputs_PW_Control_PSG_Front; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PW_Control_PSG_Front { + const powerwindow_char_T *volatile errorStatus; +}; + +/* Block states (auto storage) */ +extern powerwindow_D_Work_PW_Control_PSG_Front +powerwindow_PW_Control_PSG_Front_DWork; + +/* External inputs (root inport signals with auto storage) */ +extern powerwindow_ExternalInputs_PW_Control_PSG_Front +powerwindow_PW_Control_PSG_Front_U; + +/* External outputs (root outports fed by signals with auto storage) */ +extern powerwindow_ExternalOutputs_PW_Control_PSG_Front +powerwindow_PW_Control_PSG_Front_Y; + +/* Model entry point functions */ +extern void powerwindow_PW_Control_PSG_Front_initialize( void ); +extern void powerwindow_PW_Control_PSG_Front_main( void ); +extern void powerwindow_PW_Control_PSG_Front_terminate( void ); + +/* Real-time Model object */ +extern powerwindow_RT_MODEL_PW_Control_PSG_Front *const +powerwindow_PW_Control_PSG_Front_M; + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Note that this particular code originates from a subsystem build, + and has its own system numbers different from the parent model. + Refer to the system hierarchy for this subsystem below, and use the + MATLAB hilite_system command to trace the generated code back + to the parent model. For example, + + hilite_system('PowerWindow/PW_Control_PSG_Front') - opens subsystem PowerWindow/PW_Control_PSG_Front + hilite_system('PowerWindow/PW_Control_PSG_Front/Kp') - opens and selects block Kp + + Here is the system hierarchy for this model + + '' : 'PowerWindow' + '' : 'PowerWindow/PW_Control_PSG_Front' + '' : 'PowerWindow/PW_Control_PSG_Front/Debounce_PSG_Front_Front' +*/ +#endif /* RTW_HEADER_PW_Control_PSG_Front_h_*/ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h new file mode 100644 index 0000000..ea9caa9 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#endif /* RTW_HEADER_PW_Control_PSG_Front_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h new file mode 100644 index 0000000..adff704 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#ifndef powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_ +#define powerwindow_RTW_HEADER_PW_Control_PSG_Front_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PW_Control_PSG_Front + powerwindow_RT_MODEL_PW_Control_PSG_Front; + +#endif /* RTW_HEADER_PW_Control_PSG_Front_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h new file mode 100644 index 0000000..f3d528f --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h @@ -0,0 +1,74 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_h_ +#define powerwindow_RTW_HEADER_controlexclusion_h_ +#ifndef powerwindow_controlexclusion_COMMON_INCLUDES_ +#define powerwindow_controlexclusion_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* powerwindow_controlexclusion_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* user code (top of header file) */ + +/* Model reference registration function */ + +extern void powerwindow_controlexclusion_initialize( void ); +extern void powerwindow_controlexclusion_terminate( void ); +extern void powerwindow_controlexclusion_main( const powerwindow_boolean_T + *rtu_Up_DRV, const powerwindow_boolean_T + *rtu_Down_DRV, const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, powerwindow_boolean_T *rty_Down ); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'ControlExclusion' + '' : 'ControlExclusion/Control_Clock_TicToc' + '' : 'ControlExclusion/Control_Clock_TicToc/ControlEx_PSG' + '' : 'ControlExclusion/Control_Clock_TicToc/Tic' + '' : 'powerwindow_controlexclusion_main/Control_Clock_TicToc/Toc' + '' : 'ControlExclusion/Control_Clock_TicToc/Tic/Tic_T' + '' : 'ControlExclusion/Control_Clock_TicToc/Toc/Toc_T' +*/ +#endif /* RTW_HEADER_ControlExclusion_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h new file mode 100644 index 0000000..3d600bc --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_private_h_ +#define powerwindow_RTW_HEADER_controlexclusion_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" +#endif /* RTW_HEADER_controlexclusion_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h new file mode 100644 index 0000000..51b36a8 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_controlexclusion_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_controlexclusion_types_h_ +#define powerwindow_RTW_HEADER_controlexclusion_types_h_ + +/* Forward declaration for rtModel */ +#endif /* powerwindow_RTW_HEADER_controlexclusion_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce.h new file mode 100644 index 0000000..58153f4 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce.h @@ -0,0 +1,100 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_debounce_h_ +#define powerwindow_RTW_HEADER_debounce_h_ +#ifndef powerwindow_debounce_COMMON_INCLUDES_ +#define powerwindow_debounce_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#endif /* debounce_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_debounce_types.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Block signals for model 'powerwindow_debounce_main' */ +typedef struct { + powerwindow_boolean_T Q; /* '/Chart' */ +} powerwindow_rtB_debounce_T; + +/* Block states (auto storage) for model 'powerwindow_debounce_main' */ +typedef struct { + powerwindow_int32_T clockTickCounter; /* '/period of 10ms' */ + powerwindow_uint8_T is_active_c3_debounce; /* '/Chart' */ + powerwindow_uint8_T is_c3_debounce; /* '/Chart' */ + powerwindow_uint8_T is_debounce; /* '/Chart' */ + powerwindow_uint8_T temporalCounter_i1; /* '/Chart' */ +} powerwindow_rtDW_debounce_T; + +/* Zero-crossing (trigger) state for model 'powerwindow_debounce_main' */ +typedef struct { + ZCSigState Chart_Trig_ZCE; /* '/Chart' */ +} powerwindow_rtZCE_debounce_T; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_debounce_T { + const powerwindow_char_T **errorStatus; +}; + +typedef struct { + powerwindow_rtB_debounce_T rtb; + powerwindow_rtDW_debounce_T rtdw; + powerwindow_RT_MODEL_debounce_T rtm; + powerwindow_rtZCE_debounce_T rtzce; +} powerwindow_rtMdlrefDWork_debounce_T; + +/* Model reference registration function */ +extern void powerwindow_debounce_initialize( const powerwindow_char_T + **rt_errorStatus, + powerwindow_RT_MODEL_debounce_T *const debounce_M, + powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T + *localDW, powerwindow_rtZCE_debounce_T *localZCE ); +extern void powerwindow_debounce_Init( powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW ); +extern void powerwindow_debounce_Start( powerwindow_rtDW_debounce_T *localDW ); +extern void powerwindow_debounce_main( const powerwindow_boolean_T *rtu_Switch, + powerwindow_boolean_T + *rty_debounced_Switch, powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW, powerwindow_rtZCE_debounce_T *localZCE ); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'powerwindow_debounce_main' + '' : 'powerwindow_debounce_main/Chart' +*/ +#endif /* RTW_HEADER_debounce_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h new file mode 100644 index 0000000..1d0f484 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h @@ -0,0 +1,46 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ +#ifndef powerwindow_RTW_HEADER_debounce_private_h_ +#define powerwindow_RTW_HEADER_debounce_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_rtmGetErrorStatus +# define powerwindow_rtmGetErrorStatus(rtm) (*((rtm)->errorStatus)) +#endif + +#ifndef powerwindow_rtmSetErrorStatus +# define powerwindow_rtmSetErrorStatus(rtm, val) (*((rtm)->errorStatus) = (val)) +#endif + +#ifndef powerwindow_rtmGetErrorStatusPointer +# define powerwindow_rtmGetErrorStatusPointer(rtm) (rtm)->errorStatus +#endif + +#ifndef powerwindow_rtmSetErrorStatusPointer +# define powerwindow_rtmSetErrorStatusPointer(rtm, val) ((rtm)->errorStatus = (val)) +#endif +#endif /* RTW_HEADER_debounce_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h new file mode 100644 index 0000000..879e50b --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_debounce_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ +#ifndef powerwindow_RTW_HEADER_debounce_types_h_ +#define powerwindow_RTW_HEADER_debounce_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_debounce_T powerwindow_RT_MODEL_debounce_T; + +#endif /* RTW_HEADER_debounce_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h new file mode 100644 index 0000000..bb56100 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h @@ -0,0 +1,51 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_model_reference_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_model_reference_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___MODEL_REFERENCE_TYPES_H__ +#define powerwindow___MODEL_REFERENCE_TYPES_H__ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#ifndef powerwindow___MODEL_REFERENCE_TYPES__ +#define powerwindow___MODEL_REFERENCE_TYPES__ + +/*===========================================================================* + Model reference type definitions + ===========================================================================*/ +/* + This structure is used by model reference to + communicate timing information through the hierarchy. +*/ +typedef struct powerwindow__rtTimingBridge_tag powerwindow_rtTimingBridge; +struct powerwindow__rtTimingBridge_tag { + powerwindow_uint32_T nTasks; + powerwindow_uint32_T **clockTick; + powerwindow_uint32_T **clockTickH; + powerwindow_uint32_T *taskCounter; + powerwindow_real_T **taskTime; + powerwindow_boolean_T **rateTransition; + powerwindow_boolean_T *firstInitCond; +}; + +#endif /* __MODEL_REFERENCE_TYPES__ */ +#endif /* __MODEL_REFERENCE_TYPES_H__ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h new file mode 100644 index 0000000..3b402d1 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h @@ -0,0 +1,137 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow_RTW_HEADER_PowerWindow_control_h_ +#define powerwindow_RTW_HEADER_PowerWindow_control_h_ +#ifndef powerwindow_powerWindow_control_COMMON_INCLUDES_ +# define powerwindow_powerWindow_control_COMMON_INCLUDES_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +#include "../powerwindow_HeaderFiles/powerwindow_rtw_solver.h" +#endif /* PowerWindow_control_COMMON_INCLUDES_ */ + +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h" +#include "../powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" + +/* Shared type includes */ +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* user code (top of header file) */ + +/* Block signals for model 'PowerWindow_control' */ +typedef struct { + powerwindow_uint8_T RateTransition1; /* '/Rate Transition1' */ + powerwindow_boolean_T LogicalOperator; /* '/Logical Operator' */ + powerwindow_boolean_T map[ 3 ]; /* '/map' */ +} powerwindow_rtB_PowerWindow_control; + +/* Block states (auto storage) for model 'PowerWindow_control' */ +typedef struct { + powerwindow_int32_T clockTickCounter; /* '/period of 50ms' */ + powerwindow_uint8_T + is_active_c2_PowerWindow_contro;/* '/stateflow control model' */ + powerwindow_uint8_T + is_c2_PowerWindow_control; /* '/stateflow control model' */ + powerwindow_uint8_T is_Up; /* '/stateflow control model' */ + powerwindow_uint8_T is_Down; /* '/stateflow control model' */ + powerwindow_uint8_T is_Logic; /* '/stateflow control model' */ + powerwindow_uint8_T is_active_Logic; /* '/stateflow control model' */ + powerwindow_uint8_T is_Sensing; /* '/stateflow control model' */ + powerwindow_uint8_T is_active_Sensing; /* '/stateflow control model' */ + powerwindow_uint8_T temporalCounter_i1; /* '/stateflow control model' */ + powerwindow_uint8_T temporalCounter_i2; /* '/stateflow control model' */ +} powerwindow_rtDW_PowerWindow_control; + +/* Zero-crossing (trigger) state for model 'PowerWindow_control' */ +typedef struct { + ZCSigState stateflowcontrolmodel_Trig_ZCE;/* '/stateflow control model' */ +} powerwindow_rtZCE_PowerWindow_control; + +/* Real-time Model Data Structure */ +struct powerwindow_tag_RTM_PowerWindow_control { + const powerwindow_char_T **errorStatus; +}; + +typedef struct { + powerwindow_rtB_PowerWindow_control rtb; + powerwindow_rtDW_PowerWindow_control rtdw; + powerwindow_RT_MODEL_PowerWindow_control rtm; + powerwindow_rtZCE_PowerWindow_control rtzce; +} powerwindow_rtMdlrefDWork_PowerWindow_contr; + + + +/* Model reference registration function */ +extern void powerwindow_powerwindow_control_initialize( + const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE ); +extern void powerwindow_powerwindow_control_Init( + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, + powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T *rty_wake, + powerwindow_rtDW_PowerWindow_control *localDW ); +extern void powerwindow_powerwindow_control_Start( + powerwindow_rtDW_PowerWindow_control *localDW ); +extern void powerwindow_powerwindow_control_main( + const powerwindow_boolean_T *rtu_up, + const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T *rty_overcurrent, + powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE ); + +/*- + The generated code includes comments that allow you to trace directly + back to the appropriate location in the model. The basic format + is /block_name, where system is the system number (uniquely + assigned by Simulink) and block_name is the name of the block. + + Use the MATLAB hilite_system command to trace the generated code back + to the model. For example, + + hilite_system('') - opens system 3 + hilite_system('/Kp') - opens and selects block Kp which resides in S3 + + Here is the system hierarchy for this model + + '' : 'PowerWindow_control' + '' : 'PowerWindow_control/PW_PSG' + '' : 'PowerWindow_control/PW_PSG/PW_PSG' + '' : 'PowerWindow_control/PW_PSG/Tic' + '' : 'PowerWindow_control/PW_PSG/Toc' + '' : 'PowerWindow_control/PW_PSG/PW_PSG/stateflow control model' + '' : 'PowerWindow_control/PW_PSG/Tic/Tic_T' + '' : 'PowerWindow_control/PW_PSG/Toc/Toc_T' +*/ +#endif /* powerwindow_RTW_HEADER_PowerWindow_control_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h new file mode 100644 index 0000000..33c8590 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h @@ -0,0 +1,52 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control_private.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ +#ifndef powerwindow_RTW_HEADER_PowerWindow_control_private_h_ +#define powerwindow_RTW_HEADER_PowerWindow_control_private_h_ +#include "../powerwindow_HeaderFiles/powerwindow_rtwtypes.h" +#include "../powerwindow_HeaderFiles/powerwindow_model_reference_types.h" + +/* Macros for accessing real-time model data structure */ +#ifndef powerwindow_powerwindow_control_rtmGetErrorStatus +# define powerwindow_powerwindow_control_rtmGetErrorStatus(rtm) (*((rtm)->errorStatus)) +#endif + +#ifndef powerwindow_powerwindow_control_rtmSetErrorStatus +# define powerwindow_powerwindow_control_rtmSetErrorStatus(rtm, val) (*((rtm)->errorStatus) = (val)) +#endif + +#ifndef powerwindow_powerwindow_control_rtmGetErrorStatusPointer +# define powerwindow_powerwindow_control_rtmGetErrorStatusPointer(rtm) (rtm)->errorStatus +#endif + +#ifndef powerwindow_powerwindow_control_rtmSetErrorStatusPointer +# define powerwindow_powerwindow_control_rtmSetErrorStatusPointer(rtm, val) ((rtm)->errorStatus = (val)) +#endif + +extern const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[ 12 ]; + +#define rtCP_map_table powerwindow_rtCP_pooled_6bUUQf1tASYw /* Computed Parameter: map_table + Referenced by: '/map' +*/ +#endif /* RTW_HEADER_PowerWindow_control_private_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h new file mode 100644 index 0000000..c8b2aff --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control_types.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_powerwindow_control_types.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#ifndef powerwindow_RTW_HEADER_powerwindow_control_types_h_ +#define powerwindow_RTW_HEADER_powerwindow_control_types_h_ + +/* Forward declaration for rtModel */ +typedef struct powerwindow_tag_RTM_PowerWindow_control + powerwindow_RT_MODEL_PowerWindow_control; + +#endif /* RTW_HEADER_powerwindow_control_types_h_ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h new file mode 100644 index 0000000..efaf79b --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h @@ -0,0 +1,138 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtw_continuous.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtw_continuous.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___RTW_CONTINUOUS_H__ +#define powerwindow___RTW_CONTINUOUS_H__ + +//#include "../powerwindow_HeaderFiles/powerwindow_tmwtypes.h" + +/* For models registering MassMatrix */ +typedef enum { + SS_MATRIX_NONE, + SS_MATRIX_CONSTANT, + SS_MATRIX_TIMEDEP, + SS_MATRIX_STATEDEP +} powerwindow_ssMatrixType; + +typedef enum { + SOLVER_MODE_AUTO, /* only occurs in + mdlInitializeSizes/mdlInitializeSampleTimes */ + SOLVER_MODE_SINGLETASKING, + SOLVER_MODE_MULTITASKING +} powerwindow_SolverMode; + +typedef enum { + MINOR_TIME_STEP, + MAJOR_TIME_STEP +} powerwindow_SimTimeStep; + +/* ============================================================================= + Model methods object + ============================================================================= +*/ +typedef void ( *powerwindow_rtMdlInitializeSizesFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlInitializeSampleTimesFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlStartFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlOutputsFcn )( void *rtModel, + powerwindow_int_T tid ); +typedef void ( *powerwindow_rtMdlUpdateFcn )( void *rtModel, + powerwindow_int_T tid ); +typedef void ( *powerwindow_rtMdlDerivativesFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlProjectionFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlMassMatrixFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlForcingFunctionFcn )( void *rtModel ); +typedef void ( *powerwindow_rtMdlTerminateFcn )( void *rtModel ); +#ifdef RT_MALLOC +typedef real_T ( *rtMdlDiscreteEventsFcn )( void *pModel, + powerwindow_int_T rtmNumSampTimes, + void *rtmTimingData, + powerwindow_int_T *rtmSampleHitPtr, + powerwindow_int_T *rtmPerTaskSampleHits ); +#endif + +typedef struct powerwindow__RTWRTModelMethodsInfo_tag { + void *rtModelPtr; + powerwindow_rtMdlInitializeSizesFcn rtmInitSizesFcn; + powerwindow_rtMdlInitializeSampleTimesFcn rtmInitSampTimesFcn; + powerwindow_rtMdlStartFcn rtmStartFcn; + powerwindow_rtMdlOutputsFcn rtmOutputsFcn; + powerwindow_rtMdlUpdateFcn rtmUpdateFcn; + powerwindow_rtMdlDerivativesFcn rtmDervisFcn; + powerwindow_rtMdlProjectionFcn rtmProjectionFcn; + powerwindow_rtMdlMassMatrixFcn rtmMassMatrixFcn; + powerwindow_rtMdlForcingFunctionFcn rtmForcingFunctionFcn; + powerwindow_rtMdlTerminateFcn rtmTerminateFcn; + #ifdef RT_MALLOC + rtMdlDiscreteEventsFcn rtmDiscreteEventsFcn; + #endif +} powerwindow_RTWRTModelMethodsInfo; + +#define rtmiSetRTModelPtr(M,rtmp) ((M).rtModelPtr = (rtmp)) +#define rtmiGetRTModelPtr(M) (M).rtModelPtr + +#define rtmiSetInitSizesFcn(M,fp) \ + ((M).rtmInitSizesFcn = ((powerwindow_rtMdlInitializeSizesFcn)(fp))) +#define rtmiSetInitSampTimesFcn(M,fp) \ + ((M).rtmInitSampTimesFcn = ((powerwindow_rtMdlInitializeSampleTimesFcn)(fp))) +#define rtmiSetStartFcn(M,fp) \ + ((M).rtmStartFcn = ((powerwindow_rtMdlStartFcn)(fp))) +#define rtmiSetOutputsFcn(M,fp) \ + ((M).rtmOutputsFcn = ((powerwindow_rtMdlOutputsFcn)(fp))) +#define rtmiSetUpdateFcn(M,fp) \ + ((M).rtmUpdateFcn = ((powerwindow_rtMdlUpdateFcn)(fp))) +#define rtmiSetDervisFcn(M,fp) \ + ((M).rtmDervisFcn = ((powerwindow_rtMdlDerivativesFcn)(fp))) +#define rtmiSetProjectionFcn(M,fp) \ + ((M).rtmProjectionFcn = ((powerwindow_rtMdlProjectionFcn)(fp))) +#define rtmiSetMassMatrixFcn(M,fp) \ + ((M).rtmMassMatrixFcn = ((powerwindow_rtMdlMassMatrixFcn)(fp))) +#define rtmiSetForcingFunctionFcn(M,fp) \ + ((M).rtmForcingFunctionFcn = ((powerwindow_rtMdlForcingFunctionFcn)(fp))) +#define rtmiSetTerminateFcn(M,fp) \ + ((M).rtmTerminateFcn = ((powerwindow_rtMdlTerminateFcn)(fp))) +#ifdef RT_MALLOC +#define rtmiSetDiscreteEventsFcn(M,fp) \ + ((M).rtmDiscreteEventsFcn = ((rtMdlDiscreteEventsFcn)(fp))) +#endif + +#define rtmiInitializeSizes(M) \ + ((*(M).rtmInitSizesFcn)((M).rtModelPtr)) +#define rtmiInitializeSampleTimes(M) \ + ((*(M).rtmInitSampTimesFcn)((M).rtModelPtr)) +#define rtmiStart(M) \ + ((*(M).rtmStartFcn)((M).rtModelPtr)) +#define rtmiOutputs(M, tid) \ + ((*(M).rtmOutputsFcn)((M).rtModelPtr,tid)) +#define rtmiUpdate(M, tid) \ + ((*(M).rtmUpdateFcn)((M).rtModelPtr,tid)) +#define rtmiDerivatives(M) \ + ((*(M).rtmDervisFcn)((M).rtModelPtr)) +#define rtmiProjection(M) \ + ((*(M).rtmProjectionFcn)((M).rtModelPtr)) +#define rtmiMassMatrix(M) \ + ((*(M).rtmMassMatrixFcn)((M).rtModelPtr)) +#define rtmiForcingFunction(M) \ + ((*(M).rtmForcingFunctionFcn)((M).rtModelPtr)) +#define rtmiTerminate(M) \ + ((*(M).rtmTerminateFcn)((M).rtModelPtr)) +#ifdef RT_MALLOC +#define rtmiDiscreteEvents(M,x1,x2,x3,x4) \ + ((*(M).rtmDiscreteEventsFcn)((M).rtModelPtr,(x1),(x2),(x3),(x4))) +#endif +#endif /* __RTW_CONTINUOUS_H__ */ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h new file mode 100644 index 0000000..8114fbe --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h @@ -0,0 +1,243 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtw_solver.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtw_solver.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#ifndef powerwindow___RTW_SOLVER_H__ +#define powerwindow___RTW_SOLVER_H__ + +/* ============================================================================= + Solver object + ============================================================================= +*/ +#ifndef NO_FLOATS /* ERT integer-only */ +/* + Enum for solver tolerance +*/ +typedef enum { + SL_SOLVER_TOLERANCE_AUTO = 0, /* Set Automatically by Solver */ + SL_SOLVER_TOLERANCE_LOCAL = 1, /* Set Locally, e.g., by Blocks */ + SL_SOLVER_TOLERANCE_GLOBAL = 2, /* Set Globally, e.g., by Block Diagram */ + SL_SOLVER_TOLERANCE_UNDEFINED = 255 /* Signal uninitialized */ +} powerwindow_SL_SolverToleranceControlFlag_T; + + +/* + Enum for jacobian method control +*/ +typedef enum { + SL_JM_BD_AUTO = 0, + SL_JM_BD_SPARSE_PERTURBATION, + SL_JM_BD_FULL_PERTURBATION, + SL_JM_BD_SPARSE_ANALYTICAL, + SL_JM_BD_FULL_ANALYTICAL +} powerwindow_slJmBdControl; + + +typedef struct _ssSolverInfo_tag { + void *rtModelPtr; + + + const char *solverName; + powerwindow_boolean_T isVariableStepSolver; + powerwindow_boolean_T solverNeedsReset; + + powerwindow_time_T solverStopTime; + powerwindow_time_T *stepSizePtr; + powerwindow_time_T minStepSize; + powerwindow_time_T maxStepSize; + powerwindow_time_T fixedStepSize; + + powerwindow_int_T solverShapePreserveControl; + powerwindow_int_T solverMaxConsecutiveMinStep; + powerwindow_int_T maxNumMinSteps; + powerwindow_int_T solverMaxOrder; + powerwindow_real_T solverConsecutiveZCsStepRelTol; + powerwindow_int_T solverMaxConsecutiveZCs; + + powerwindow_int_T solverExtrapolationOrder; + powerwindow_int_T solverNumberNewtonIterations; + + powerwindow_int_T solverRefineFactor; + powerwindow_real_T solverRelTol; + powerwindow_real_T unused_real_T_1; + + powerwindow_real_T **dXPtr; + powerwindow_time_T **tPtr; + + powerwindow_int_T *numContStatesPtr; + powerwindow_real_T **contStatesPtr; + + powerwindow_real_T *zcSignalVector; + powerwindow_uint8_T *zcEventsVector; + powerwindow_uint8_T *zcSignalAttrib; + powerwindow_int_T zcSignalVectorLength; + powerwindow_uint8_T *reserved; + + powerwindow_boolean_T foundContZcEvents; + powerwindow_boolean_T isAtLeftPostOfContZcEvent; + powerwindow_boolean_T isAtRightPostOfContZcEvent; + powerwindow_boolean_T adaptiveZcDetection; + + powerwindow_int_T numZcSignals; + + powerwindow_boolean_T stateProjection; + powerwindow_boolean_T robustResetMethod; /* user's preference */ + powerwindow_boolean_T updateJacobianAtReset; /* S-Fcn request (sticky) */ + powerwindow_boolean_T consistencyChecking; + + powerwindow_int_T massMatrixNzMax; + powerwindow_int_T *massMatrixIr; + powerwindow_int_T *massMatrixJc; + powerwindow_real_T *massMatrixPr; + + const powerwindow_char_T **errStatusPtr; + + powerwindow_real_T zcThreshold; + powerwindow_int_T zeroCrossAlgorithm; + powerwindow_int_T consecutiveZCsError; + + powerwindow_boolean_T isComputingJacobian; + powerwindow_slJmBdControl solverJacobianMethodControl; + powerwindow_int_T ignoredZcDiagnostic; + powerwindow_int_T maskedZcDiagnostic; + powerwindow_boolean_T isOutputMethodComputed; +} ssSolverInfo; + +/* Support old name RTWSolverInfo */ +typedef ssSolverInfo RTWSolverInfo; + +#define rtsiSetRTModelPtr(S,rtmp) ((S)->rtModelPtr = (rtmp)) +#define rtsiGetRTModelPtr(S) (S)->rtModelPtr + +#define rtsiSetSimTimeStepPtr(S,stp) ((S)->simTimeStepPtr = (stp)) +#define rtsiGetSimTimeStepPtr(S) ((S)->simTimeStepPtr) +#define rtsiGetSimTimeStep(S) *((S)->simTimeStepPtr) +#define rtsiSetSimTimeStep(S,st) (*((S)->simTimeStepPtr) = (st)) + +#define rtsiSetSolverData(S,sd) ((S)->solverData = (sd)) +#define rtsiGetSolverData(S) (S)->solverData + +#define rtsiSetSolverName(S,sn) ((S)->solverName = (sn)) +#define rtsiGetSolverName(S) (S)->solverName + +#define rtsiSetVariableStepSolver(S,vs) ((S)->isVariableStepSolver = (vs)) +#define rtsiIsVariableStepSolver(S) (S)->isVariableStepSolver + +#define rtsiSetSolverNeedsReset(S,sn) ((S)->solverNeedsReset = (sn)) +#define rtsiGetSolverNeedsReset(S) (S)->solverNeedsReset + +#define rtsiSetBlkStateChange(S,sn) ((S)->blkStateChange = (sn)) +#define rtsiGetBlkStateChange(S) (S)->blkStateChange + +#define rtsiSetSolverMode(S,sm) ((S)->solverMode = (sm)) +#define rtsiGetSolverMode(S) (S)->solverMode + +#define rtsiSetSolverStopTime(S,st) ((S)->solverStopTime = (st)) +#define rtsiGetSolverStopTime(S) (S)->solverStopTime + +#define rtsiSetStepSizePtr(S,ssp) ((S)->stepSizePtr = (ssp)) +#define rtsiSetStepSize(S,ss) (*((S)->stepSizePtr) = (ss)) +#define rtsiGetStepSize(S) *((S)->stepSizePtr) + +#define rtsiSetMinStepSize(S,ss) (((S)->minStepSize = (ss))) +#define rtsiGetMinStepSize(S) (S)->minStepSize + +#define rtsiSetMaxStepSize(S,ss) ((S)->maxStepSize = (ss)) +#define rtsiGetMaxStepSize(S) (S)->maxStepSize + +#define rtsiSetFixedStepSize(S,ss) ((S)->fixedStepSize = (ss)) +#define rtsiGetFixedStepSize(S) (S)->fixedStepSize + +#define rtsiSetMaxNumMinSteps(S,mns) ((S)->maxNumMinSteps = (mns)) +#define rtsiGetMaxNumMinSteps(S) (S)->maxNumMinSteps + +#define rtsiSetSolverMaxOrder(S,smo) ((S)->solverMaxOrder = (smo)) +#define rtsiGetSolverMaxOrder(S) (S)->solverMaxOrder + +#define rtsiSetSolverJacobianMethodControl(S,smcm) (ssGetSolverInfo(S)->solverJacobianMethodControl = (smcm)) +#define rtsiGetSolverJacobianMethodControl(S) ssGetSolverInfo(S)->solverJacobianMethodControl + +#define rtsiSetSolverShapePreserveControl(S,smcm) (ssGetSolverInfo(S)->solverShapePreserveControl = (smcm)) +#define rtsiGetSolverShapePreserveControl(S) ssGetSolverInfo(S)->solverShapePreserveControl + +#define rtsiSetSolverConsecutiveZCsStepRelTol(S,scr) (ssGetSolverInfo(S)->solverConsecutiveZCsStepRelTol = (scr)) +#define rtsiGetSolverConsecutiveZCsStepRelTol(S) ssGetSolverInfo(S)->solverConsecutiveZCsStepRelTol + +#define rtsiSetSolverMaxConsecutiveZCs(S,smcz) (ssGetSolverInfo(S)->solverMaxConsecutiveZCs = (smcz)) +#define rtsiGetSolverMaxConsecutiveZCs(S) ssGetSolverInfo(S)->solverMaxConsecutiveZCs + +#define rtsiSetSolverMaxConsecutiveMinStep(S,smcm) (ssGetSolverInfo(S)->solverMaxConsecutiveMinStep = (smcm)) +#define rtsiGetSolverMaxConsecutiveMinStep(S) ssGetSolverInfo(S)->solverMaxConsecutiveMinStep + +#define rtsiSetSolverExtrapolationOrder(S,seo) ((S)->solverExtrapolationOrder = (seo)) +#define rtsiGetSolverExtrapolationOrder(S) (S)->solverExtrapolationOrder + +#define rtsiSetSolverNumberNewtonIterations(S,nni) ((S)->solverNumberNewtonIterations = (nni)) +#define rtsiGetSolverNumberNewtonIterations(S) (S)->solverNumberNewtonIterations + +#define rtsiSetSolverRefineFactor(S,smo) ((S)->solverRefineFactor = (smo)) +#define rtsiGetSolverRefineFactor(S) (S)->solverRefineFactor + +#define rtsiSetSolverRelTol(S,smo) ((S)->solverRelTol = (smo)) +#define rtsiGetSolverRelTol(S) (S)->solverRelTol + +#define rtsiSetSolverMassMatrixType(S,type) ((S)->massMatrixType = (type)) +#define rtsiGetSolverMassMatrixType(S) (S)->massMatrixType + +#define rtsiSetSolverMassMatrixNzMax(S,nzMax) ((S)->massMatrixNzMax = (nzMax)) +#define rtsiGetSolverMassMatrixNzMax(S) (S)->massMatrixNzMax + +#define rtsiSetSolverMassMatrixIr(S,ir) ((S)->massMatrixIr = (ir)) +#define rtsiGetSolverMassMatrixIr(S) (S)->massMatrixIr + +#define rtsiSetSolverMassMatrixJc(S,jc) ((S)->massMatrixJc = (jc)) +#define rtsiGetSolverMassMatrixJc(S) (S)->massMatrixJc + +#define rtsiSetSolverMassMatrixPr(S,pr) ((S)->massMatrixPr = (pr)) +#define rtsiGetSolverMassMatrixPr(S) (S)->massMatrixPr + +#define rtsiSetdXPtr(S,dxp) ((S)->dXPtr = (dxp)) +#define rtsiSetdX(S,dx) (*((S)->dXPtr) = (dx)) +#define rtsiGetdX(S) *((S)->dXPtr) + +#define rtsiSetTPtr(S,tp) ((S)->tPtr = (tp)) +#define rtsiSetT(S,t) ((*((S)->tPtr))[ 0 ] = (t)) +#define rtsiGetT(S) (*((S)->tPtr))[ 0 ] + +#define rtsiSetContStatesPtr(S,cp) ((S)->contStatesPtr = (cp)) +#define rtsiGetContStates(S) *((S)->contStatesPtr) + +#define rtsiSetNumContStatesPtr(S,cp) ((S)->numContStatesPtr = (cp)) +#define rtsiGetNumContStates(S) *((S)->numContStatesPtr) + +#define rtsiSetErrorStatusPtr(S,esp) ((S)->errStatusPtr = (esp)) +#define rtsiSetErrorStatus(S,es) (*((S)->errStatusPtr) = (es)) +#define rtsiGetErrorStatus(S) *((S)->errStatusPtr) + +#define rtsiSetModelMethodsPtr(S,mmp) ((S)->modelMethodsPtr = (mmp)) +#define rtsiGetModelMethodsPtr(S) (S)->modelMethodsPtr + +#define rtsiSetSolverComputingJacobian(S,val) ((S)->isComputingJacobian = (val)) +#define rtsiIsSolverComputingJacobian(S) (S)->isComputingJacobian + +#define rtsiSetSolverOutputComputed(S,val) ((S)->isOutputMethodComputed = (val)) +#define rtsiIsSolverOutputComputed(S) (S)->isOutputMethodComputed + +#endif /* !NO_FLOATS */ + +#endif /* powerwindow___RTW_SOLVER_H__ */ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h new file mode 100644 index 0000000..e01ba3a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h @@ -0,0 +1,194 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_rtwtypes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_rtwtypes.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ +#ifndef powerwindow__RTWTYPES_H__ +#define powerwindow__RTWTYPES_H__ + +/* Logical type definitions */ +#if (!defined(__cplusplus)) +# ifndef false +# define false (0U) +# endif + +# ifndef true +# define true (1U) +# endif +#endif + +#define powerwindow__TMWTYPES__ + +/*=======================================================================* + Target hardware information + + Number of bits: char: 8 short: 16 int: 16 + long: 32 + native word size: 8 + Byte ordering: LittleEndian + Signed integer division rounds to: Zero + Shift right on a signed integer as arithmetic shift: on + =======================================================================*/ + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed 8, 16, or 32 bit integers + powerwindow_uint8_T, powerwindow_uint16_T, powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + powerwindow_real32_T, powerwindow_real64_T - 32 and 64 bit floating point numbers + =======================================================================*/ +typedef signed char powerwindow_int8_T; +typedef unsigned char powerwindow_uint8_T; +typedef int powerwindow_int16_T; +typedef unsigned int powerwindow_uint16_T; +typedef long powerwindow_int32_T; +typedef unsigned long powerwindow_uint32_T; +typedef float powerwindow_real32_T; +typedef double powerwindow_real64_T; + +/*===========================================================================* + Generic type definitions: powerwindow_real_T, powerwindow_time_T, powerwindow_boolean_T, powerwindow_int_T, powerwindow_uint_T, + powerwindow_ulong_T, powerwindow_char_T and powerwindow_byte_T. + ===========================================================================*/ +typedef double powerwindow_real_T; +typedef double powerwindow_time_T; +typedef unsigned char powerwindow_boolean_T; +typedef int powerwindow_int_T; +typedef unsigned int powerwindow_uint_T; +typedef unsigned long powerwindow_ulong_T; +typedef char powerwindow_char_T; +typedef unsigned char powerwindow_uchar_T; +typedef powerwindow_char_T powerwindow_byte_T; + +/*===========================================================================* + Complex number type definitions + ===========================================================================*/ +#define powerwindow_CREAL_T + +typedef struct { + powerwindow_real32_T re; + powerwindow_real32_T im; +} powerwindow_creal32_T; + +typedef struct { + powerwindow_real64_T re; + powerwindow_real64_T im; +} powerwindow_creal64_T; + +typedef struct { + powerwindow_real_T re; + powerwindow_real_T im; +} powerwindow_creal_T; + +#define powerwindow_CINT8_T + +typedef struct { + powerwindow_int8_T re; + powerwindow_int8_T im; +} powerwindow_cint8_T; + +#define powerwindow_CUINT8_T + +typedef struct { + powerwindow_uint8_T re; + powerwindow_uint8_T im; +} powerwindow_cuint8_T; + +#define powerwindow_CINT16_T + +typedef struct { + powerwindow_int16_T re; + powerwindow_int16_T im; +} powerwindow_cint16_T; + +#define powerwindow_CUINT16_T + +typedef struct { + powerwindow_uint16_T re; + powerwindow_uint16_T im; +} powerwindow_cuint16_T; + +#define powerwindow_CINT32_T + +typedef struct { + powerwindow_int32_T re; + powerwindow_int32_T im; +} powerwindow_cint32_T; + +#define powerwindow_CUINT32_T + +typedef struct { + powerwindow_uint32_T re; + powerwindow_uint32_T im; +} powerwindow_cuint32_T; + +/*=======================================================================* + Min and Max: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed 8, 16, or 32 bit integers + powerwindow_uint8_T, powerwindow_uint16_T, powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + =======================================================================*/ +#define powerwindow_MAX_int8_T ((powerwindow_int8_T)(127)) +#define powerwindow_MIN_int8_T ((powerwindow_int8_T)(-128)) +#define powerwindow_MAX_uint8_T ((powerwindow_uint8_T)(255U)) +#define powerwindow_MIN_uint8_T ((powerwindow_uint8_T)(0U)) +#define powerwindow_MAX_int16_T ((powerwindow_int16_T)(32767)) +#define powerwindow_MIN_int16_T ((powerwindow_int16_T)(-32768)) +#define powerwindow_MAX_uint16_T ((powerwindow_uint16_T)(65535U)) +#define powerwindow_MIN_uint16_T ((powerwindow_uint16_T)(0U)) +#define powerwindow_MAX_int32_T ((powerwindow_int32_T)(2147483647)) +#define powerwindow_MIN_int32_T ((powerwindow_int32_T)(-2147483647-1)) +#define powerwindow_MAX_uint32_T ((powerwindow_uint32_T)(0xFFFFFFFFU)) +#define powerwindow_MIN_uint32_T ((powerwindow_uint32_T)(0U)) + +/* Block D-Work pointer type */ +typedef void *powerwindow_pointer_T; + +#define powerwindow_input_length 977 + +/* Simulink specific types */ +#ifndef powerwindow___ZERO_CROSSING_TYPES__ +#define powerwindow___ZERO_CROSSING_TYPES__ + +/* Trigger directions: falling, either, and rising */ +typedef enum { + FALLING_ZERO_CROSSING = -1, + ANY_ZERO_CROSSING = 0, + RISING_ZERO_CROSSING = 1 +} powerwindow_ZCDirection; + +/* Previous state of a trigger signal */ +typedef powerwindow_uint8_T ZCSigState; + +/* Initial value of a trigger zero crossing signal */ +#define powerwindow_UNINITIALIZED_ZCSIG 0x03U +#define powerwindow_NEG_ZCSIG 0x02U +#define powerwindow_POS_ZCSIG 0x01U +#define powerwindow_ZERO_ZCSIG 0x00U + +/* Current state of a trigger signal */ +typedef enum { + FALLING_ZCEVENT = -1, + NO_ZCEVENT = 0, + RISING_ZCEVENT = 1 +} powerwindow_ZCEventType; + +#endif /* powerwindow___ZERO_CROSSING_TYPES__ */ +#endif /* powerwindow__RTWTYPES_H__ */ + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h new file mode 100644 index 0000000..062186a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h @@ -0,0 +1,825 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_tmwtypes.h + + Author: CoSys-Lab, University of Antwerp + + Function: headerfile + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_HeaderFiles/powerwindow_tmwtypes.h + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#if defined(_MSC_VER) +# pragma once +#endif +#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)) +# pragma once +#endif + +#ifndef powerwindow_tmwtypes_h +#define powerwindow_tmwtypes_h + +#ifndef powerwindow__TMWTYPES__ +#define powerwindow__TMWTYPES__ +/* + File : tmwtypes.h + Abstract: + Data types for use with MATLAB/SIMULINK and the Real-Time Workshop. + + When compiling stand-alone model code, data types can be overridden + via compiler switches. + + Define NO_FLOATS to eliminate reference to powerwindow_real_T, etc. +*/ + + +#define LOGICAL_IS_A_TYPE +#define SPARSE_GENERALIZATION + +#ifdef NO_FLOATS +# define double double_not_allowed +# define float float_not_allowed +#endif /*NO_FLOATS*/ + + +/* + The following data types cannot be overridden when building MEX files. +*/ +#ifdef MATLAB_MEX_FILE +# undef CHARACTER_T +# undef INTEGER_T +# undef BOOLEAN_T +# undef REAL_T +# undef TIME_T +#endif + +/* + The powerwindow_uchar_T, powerwindow_ushort_T and powerwindow_ulong_T types are needed for compilers which do + not allow defines to be specified, at the command line, with spaces in them. +*/ + +typedef unsigned char powerwindow_uchar_T; +typedef unsigned short powerwindow_ushort_T; +typedef unsigned long powerwindow_ulong_T; + +#if (defined(_MSC_VER) && _MSC_VER >= 1500) \ +|| defined(__x86_64__) || defined(__LP64__) \ +|| defined(__LCC64__) + +typedef unsigned long long powerwindow_ulonglong_T; +#endif + + + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed 8, 16, or 32 bit integers + powerwindow_uint8_T, powerwindow_uint16_T, powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + powerwindow_real32_T, powerwindow_real64_T - 32 and 64 bit floating point numbers + =======================================================================*/ + +/* When used with Real Time Workshop generated code, this + header file can be used with a variety of compilers. + + The compiler could be for an 8 bit embedded processor that + only had 8 bits per integer and 16 bits per long. + In that example, a 32 bit integer size is not even available. + This header file should be robust to that. + + For the case of an 8 bit processor, the preprocessor + may be limited to 16 bit math like its target. That limitation + would mean that 32 bit comparisons can't be done accurately. + To increase robustness to this, comparisons are done against + smaller values first. An inaccurate 32 bit comparison isn't + attempted if the 16 bit comparison has already succeeded. + + Limitations on preprocessor math can also be stricter than + for the target. There are known cases where a compiler + targeting processors with 64 bit longs can't do accurate + preprocessor comparisons on more than 32 bits. +*/ + +/* Determine the number of bits for int, long, short, and char. + If one fails to be determined, set the number of bits to -1 +*/ + +#ifndef TMW_BITS_PER_INT +# if INT_MAX == 0x7FL +# define TMW_BITS_PER_INT 8 +# elif INT_MAX == 0x7FFFL +# define TMW_BITS_PER_INT 16 +# elif INT_MAX == 0x7FFFFFFFL +# define TMW_BITS_PER_INT 32 +# else +# define TMW_BITS_PER_INT -1 +# endif +#endif + +#ifndef TMW_BITS_PER_LONG +# if LONG_MAX == 0x7FL +# define TMW_BITS_PER_LONG 8 +# elif LONG_MAX == 0x7FFFL +# define TMW_BITS_PER_LONG 16 +# elif LONG_MAX == 0x7FFFFFFFL +# define TMW_BITS_PER_LONG 32 +# else +# define TMW_BITS_PER_LONG -1 +# endif +#endif + +#ifndef TMW_BITS_PER_SHRT +# if SHRT_MAX == 0x7FL +# define TMW_BITS_PER_SHRT 8 +# elif SHRT_MAX == 0x7FFFL +# define TMW_BITS_PER_SHRT 16 +# elif SHRT_MAX == 0x7FFFFFFFL +# define TMW_BITS_PER_SHRT 32 +# else +# define TMW_BITS_PER_SHRT -1 +# endif +#endif + +#ifndef TMW_BITS_PER_SCHAR +# if SCHAR_MAX == 0x7FL +# define TMW_BITS_PER_SCHAR 8 +# elif SCHAR_MAX == 0x7FFFL +# define TMW_BITS_PER_SCHAR 16 +# elif SCHAR_MAX == 0x7FFFFFFFL +# define TMW_BITS_PER_SCHAR 32 +# else +# define TMW_BITS_PER_SCHAR -1 +# endif +#endif + +#ifndef TMW_CHAR_SIGNED +# if SCHAR_MAX == CHAR_MAX +# define TMW_CHAR_SIGNED 1 +# else +# define TMW_CHAR_SIGNED 0 +# endif +#endif + +/* It is common for one or more of the integer types + to be the same size. For example, on many embedded + processors, both shorts and ints are 16 bits. On + processors used for workstations, it is quite common + for both int and long to be 32 bits. + When there is more than one choice for typdef'ing + a portable type like powerwindow_int16_T or powerwindow_uint32_T, in + concept, it should not matter which choice is made. + However, some style guides and some code checking + tools do identify and complain about seemingly + irrelevant differences. For example, a code + checking tool may complain about an implicit + conversion from int to short even though both + are 16 bits. To reduce these types of + complaints, it is best to make int the + preferred choice when more than one is available. +*/ + +#ifndef INT8_T +# if TMW_BITS_PER_INT == 8 +# define INT8_T int +# elif TMW_BITS_PER_LONG == 8 +# define INT8_T long +# elif TMW_BITS_PER_SCHAR == 8 +# define INT8_T signed char +# elif TMW_BITS_PER_SHRT == 8 +# define INT8_T short +# endif +#endif +#ifdef INT8_T +typedef INT8_T powerwindow_int8_T; +#endif + + + +#ifndef UINT8_T +# if TMW_BITS_PER_INT == 8 +# define UINT8_T unsigned int +# elif TMW_BITS_PER_LONG == 8 +# define UINT8_T unsigned long +# elif TMW_BITS_PER_SCHAR == 8 +# define UINT8_T unsigned char +# elif TMW_BITS_PER_SHRT == 8 +# define UINT8_T unsigned short +# endif +#endif +#ifdef UINT8_T +typedef UINT8_T powerwindow_uint8_T; +#endif + + +#ifndef INT16_T +# if TMW_BITS_PER_INT == 16 +# define INT16_T int +# elif TMW_BITS_PER_LONG == 16 +# define INT16_T long +# elif TMW_BITS_PER_SCHAR == 16 +# define INT16_T signed char +# elif TMW_BITS_PER_SHRT == 16 +# define INT16_T short +# endif +#endif +#ifdef INT16_T +typedef INT16_T powerwindow_int16_T; +#endif + + +#ifndef UINT16_T +# if TMW_BITS_PER_INT == 16 +# define UINT16_T unsigned int +# elif TMW_BITS_PER_LONG == 16 +# define UINT16_T unsigned long +# elif TMW_BITS_PER_SCHAR == 16 +# define UINT16_T unsigned char +# elif TMW_BITS_PER_SHRT == 16 +# define UINT16_T unsigned short +# endif +#endif +#ifdef UINT16_T +typedef UINT16_T powerwindow_uint16_T; +#endif + + +#ifndef INT32_T +# if TMW_BITS_PER_INT == 32 +# define INT32_T int +# elif TMW_BITS_PER_LONG == 32 +# define INT32_T long +# elif TMW_BITS_PER_SCHAR == 32 +# define INT32_T signed char +# elif TMW_BITS_PER_SHRT == 32 +# define INT32_T short +# endif +#endif +#ifdef INT32_T +typedef INT32_T powerwindow_int32_T; +#endif + + +#ifndef UINT32_T +# if TMW_BITS_PER_INT == 32 +# define UINT32_T unsigned int +# elif TMW_BITS_PER_LONG == 32 +# define UINT32_T unsigned long +# elif TMW_BITS_PER_SCHAR == 32 +# define UINT32_T unsigned char +# elif TMW_BITS_PER_SHRT == 32 +# define UINT32_T unsigned short +# endif +#endif +#ifdef UINT32_T +typedef UINT32_T powerwindow_uint32_T; +#endif + +/* The following is used to emulate smaller integer types when only + larger types are available. For example, compilers for TI C3x/C4x DSPs + define char and short to be 32 bits, so 8 and 16 bits are not directly + available. This target is commonly used with RTW rapid prototyping. + Other DSPs define char to be 16 bits, so 8 bits is not directly + available. +*/ +#ifndef INT8_T +# ifdef INT16_T +# define INT8_T INT16_T +typedef INT8_T powerwindow_int8_T; +# else +# ifdef INT32_T +# define INT8_T INT32_T +typedef INT8_T powerwindow_int8_T; +# endif +# endif +#endif + +#ifndef UINT8_T +# ifdef UINT16_T +# define UINT8_T UINT16_T +typedef UINT8_T powerwindow_uint8_T; +# else +# ifdef UINT32_T +# define UINT8_T UINT32_T +typedef UINT8_T powerwindow_uint8_T; +# endif +# endif +#endif + +#ifndef INT16_T +# ifdef INT32_T +# define INT16_T INT32_T +typedef INT16_T powerwindow_int16_T; +# endif +#endif + +#ifndef UINT16_T +# ifdef UINT32_T +# define UINT16_T UINT32_T +typedef UINT16_T powerwindow_uint16_T; +# endif +#endif + + +#ifndef NO_FLOATS + +#ifndef REAL32_T +# ifndef __MWERKS__ +# if FLT_MANT_DIG >= 23 +# define REAL32_T float +# endif +# else +# define REAL32_T float +# endif +#endif +#ifdef REAL32_T +typedef REAL32_T powerwindow_real32_T; +#endif + + +#ifndef REAL64_T +# ifndef __MWERKS__ +# if DBL_MANT_DIG >= 52 +# define REAL64_T double +# endif +# else +# define REAL64_T double +# endif +#endif +#ifdef REAL64_T +typedef REAL64_T powerwindow_real64_T; +#endif + +#endif /* NO_FLOATS*/ + +/*=======================================================================* + Fixed width word size data types: + powerwindow_int64_T - signed 64 bit integers + powerwindow_uint64_T - unsigned 64 bit integers + =======================================================================*/ + + + +#ifndef INT64_T +# if defined(__APPLE__) +# define INT64_T long long +# define FMT64 "ll" +# if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +# define INT_TYPE_64_IS_LONG +# endif +# elif defined(__x86_64__) || defined(__LP64__) +# define INT64_T long +# define FMT64 "l" +# if !defined(INT_TYPE_64_IS_LONG) +# define INT_TYPE_64_IS_LONG +# endif +# elif defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) \ +|| (defined(__WATCOMC__) && __WATCOMC__ >= 1100) +# define INT64_T __int64 +# define FMT64 "I64" +# elif defined(__GNUC__) || defined(TMW_ENABLE_INT64) \ +|| defined(__LCC64__) +# define INT64_T long long +# define FMT64 "ll" +# endif +#endif + + + +#if defined(INT64_T) +# if defined(__GNUC__) && \ +((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >=9))) +__extension__ +# endif +typedef INT64_T powerwindow_int64_T; +#endif + + + +#ifndef UINT64_T +# if defined(__APPLE__) +# define UINT64_T unsigned long long +# define FMT64 "ll" +# if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +# define INT_TYPE_64_IS_LONG +# endif +# elif defined(__x86_64__) || defined(__LP64__) +# define UINT64_T unsigned long +# define FMT64 "l" +# if !defined(INT_TYPE_64_IS_LONG) +# define INT_TYPE_64_IS_LONG +# endif +# elif defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) \ +|| (defined(__WATCOMC__) && __WATCOMC__ >= 1100) +# define UINT64_T unsigned __int64 +# define FMT64 "I64" +# elif defined(__GNUC__) || defined(TMW_ENABLE_INT64) \ +|| defined(__LCC64__) +# define UINT64_T unsigned long long +# define FMT64 "ll" +# endif +#endif + +#if defined(_WIN64) || (defined(__APPLE__) && defined(__LP64__)) \ +|| defined(__x86_64__) \ +|| defined(__LP64__) +# define INT_TYPE_64_IS_SUPPORTED +#endif + +#if defined(UINT64_T) +# if defined(__GNUC__) && \ +((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >=9))) +__extension__ +# endif +typedef UINT64_T powerwindow_uint64_T; +#endif + +/*===========================================================================* + Format string modifiers for using powerwindow_size_t variables in printf statements. + ===========================================================================*/ + +#ifndef FMT_SIZE_T +# if defined( __GNUC__ ) || defined(_STDC_C99) +# define FMT_SIZE_T "z" +# elif defined (__WATCOMC__) +# define FMT_SIZE_T "l" +# elif defined (_WIN32 ) +# define FMT_SIZE_T "I" +# else +# define FMT_SIZE_T "l" +# endif +#endif + +#ifndef FMT_PTRDIFF_T +# if defined(__APPLE__) +# define FMT_PTRDIFF_T "l" +# elif defined( __GNUC__ ) || defined(_STDC_C99) +# define FMT_PTRDIFF_T "t" +# elif defined (__WATCOMC__) +# define FMT_PTRDIFF_T "l" +# elif defined (_WIN32 ) +# define FMT_PTRDIFF_T "I" +# else +# define FMT_PTRDIFF_T "l" +# endif +#endif + +/*===========================================================================* + General or logical data types where the word size is not guaranteed. + powerwindow_real_T - possible settings include powerwindow_real32_T or powerwindow_real64_T + powerwindow_time_T - possible settings include powerwindow_real64_T or powerwindow_uint32_T + powerwindow_boolean_T + powerwindow_char_T + powerwindow_int_T + powerwindow_uint_T + powerwindow_byte_T + ===========================================================================*/ + +#ifndef NO_FLOATS + +#ifndef REAL_T +# ifdef REAL64_T +# define REAL_T powerwindow_real64_T +# else +# ifdef REAL32_T +# define REAL_T powerwindow_real32_T +# endif +# endif +#endif +#ifdef REAL_T +typedef REAL_T powerwindow_real_T; +#endif + +#ifndef TIME_T +# ifdef REAL_T +# define TIME_T powerwindow_real_T +# endif +#endif +#ifdef TIME_T +typedef TIME_T powerwindow_time_T; +#endif + +#endif /* NO_FLOATS */ + +#ifndef BOOLEAN_T +# if defined(UINT8_T) +# define BOOLEAN_T UINT8_T +# else +# define BOOLEAN_T unsigned int +# endif +#endif +typedef BOOLEAN_T powerwindow_boolean_T; + + +#ifndef CHARACTER_T +# define CHARACTER_T char +#endif +typedef CHARACTER_T powerwindow_char_T; + + +#ifndef INTEGER_T +# define INTEGER_T int +#endif +typedef INTEGER_T powerwindow_int_T; + + +#ifndef UINTEGER_T +# define UINTEGER_T unsigned +#endif +typedef UINTEGER_T powerwindow_uint_T; + + +#ifndef BYTE_T +# define BYTE_T unsigned char +#endif +typedef BYTE_T powerwindow_byte_T; + + +/*===========================================================================* + Define Complex Structures + ===========================================================================*/ +#ifndef NO_FLOATS + +#ifndef CREAL32_T +# ifdef REAL32_T +typedef struct { + powerwindow_real32_T re, im; +} powerwindow_creal32_T; +# define CREAL32_T creal32_T +# endif +#endif + +#ifndef CREAL64_T +# ifdef REAL64_T +typedef struct { + powerwindow_real64_T re, im; +} powerwindow_creal64_T; +# define CREAL64_T powerwindow_creal64_T +# endif +#endif + +#ifndef CREAL_T +# ifdef REAL_T +typedef struct { + powerwindow_real_T re, im; +} powerwindow_creal_T; +# define CREAL_T powerwindow_creal_T +# endif +#endif + +#endif /* NO_FLOATS */ + +#ifndef CINT8_T +# ifdef INT8_T +typedef struct { + powerwindow_int8_T re, im; +} powerwindow_cint8_T; +# define CINT8_T powerwindow_cint8_T +# endif +#endif + +#ifndef CUINT8_T +# ifdef UINT8_T +typedef struct { + powerwindow_uint8_T re, im; +} powerwindow_cuint8_T; +# define CUINT8_T powerwindow_cuint8_T +# endif +#endif + +#ifndef CINT16_T +# ifdef INT16_T +typedef struct { + powerwindow_int16_T re, im; +} powerwindow_cint16_T; +# define CINT16_T powerwindow_cint16_T +# endif +#endif + +#ifndef CUINT16_T +# ifdef UINT16_T +typedef struct { + powerwindow_uint16_T re, im; +} powerwindow_cuint16_T; +# define CUINT16_T powerwindow_cuint16_T +# endif +#endif + +#ifndef CINT32_T +# ifdef INT32_T +typedef struct { + powerwindow_int32_T re, im; +} powerwindow_cint32_T; +# define CINT32_T powerwindow_cint32_T +# endif +#endif + +#ifndef CUINT32_T +# ifdef UINT32_T +typedef struct { + powerwindow_uint32_T re, im; +} powerwindow_cuint32_T; +# define CUINT32_T powerwindow_cuint32_T +# endif +#endif + +#ifndef CINT64_T +# ifdef INT64_T +typedef struct { + powerwindow_int64_T re, im; +} powerwindow_cint64_T; +# define CINT64_T powerwindow_cint64_T +# endif +#endif + +#ifndef CUINT64_T +# ifdef UINT64_T +typedef struct { + powerwindow_uint64_T re, im; +} powerwindow_cuint64_T; +# define CUINT64_T powerwindow_cuint64_T +# endif +#endif + +/*=======================================================================* + Min and Max: + powerwindow_int8_T, powerwindow_int16_T, powerwindow_int32_T - signed 8, 16, or 32 bit integers + powerwindow_uint8_T, powerwindow_uint16_T, powerwindow_uint32_T - unsigned 8, 16, or 32 bit integers + =======================================================================*/ + +#define powerwindow_MAX_int8_T ((powerwindow_int8_T)(127)) /* 127 */ +#define powerwindow_MIN_int8_T ((powerwindow_int8_T)(-128)) /* -128 */ +#define powerwindow_MAX_uint8_T ((powerwindow_uint8_T)(255)) /* 255 */ +#define powerwindow_MIN_uint8_T ((powerwindow_uint8_T)(0)) + +#define powerwindow_MAX_int16_T ((powerwindow_int16_T)(32767)) /* 32767 */ +#define powerwindow_MIN_int16_T ((powerwindow_int16_T)(-32768)) /* -32768 */ +#define powerwindow_MAX_uint16_T ((powerwindow_uint16_T)(65535)) /* 65535 */ +#define powerwindow_MIN_uint16_T ((powerwindow_uint16_T)(0)) + +#define powerwindow_MAX_int32_T ((powerwindow_int32_T)(2147483647)) /* 2147483647 */ +#define powerwindow_MIN_int32_T ((powerwindow_int32_T)(-2147483647-1)) /* -2147483648 */ +#define powerwindow_MAX_uint32_T ((powerwindow_uint32_T)(0xFFFFFFFFU)) /* 4294967295 */ +#define powerwindow_MIN_uint32_T ((powerwindow_uint32_T)(0)) + +#if defined(_MSC_VER) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x530) \ +|| (defined(__WATCOMC__) && __WATCOMC__ >= 1100) \ +|| defined(__LCC64__) +# ifdef INT64_T +# define powerwindow_MAX_int64_T ((powerwindow_int64_T)(9223372036854775807LL)) +# define powerwindow_MIN_int64_T ((powerwindow_int64_T)(-9223372036854775807LL-1LL)) +# endif +# ifdef UINT64_T +# define powerwindow_MAX_uint64_T ((powerwindow_uint64_T)(0xFFFFFFFFFFFFFFFFULL)) +# define powerwindow_MIN_uint64_T ((powerwindow_uint64_T)(0)) +# endif +#else +# ifdef INT64_T +# ifdef INT_TYPE_64_IS_LONG +# define powerwindow_MAX_int64_T ((powerwindow_int64_T)(9223372036854775807L)) +# define powerwindow_MIN_int64_T ((powerwindow_int64_T)(-9223372036854775807L-1L)) +# else +# define powerwindow_MAX_int64_T ((powerwindow_int64_T)(9223372036854775807LL)) +# define powerwindow_MIN_int64_T ((powerwindow_int64_T)(-9223372036854775807LL-1LL)) +# endif +# endif +# ifdef UINT64_T +# ifdef INT_TYPE_64_IS_LONG +# define powerwindow_MAX_uint64_T ((powerwindow_uint64_T)(0xFFFFFFFFFFFFFFFFUL)) +# define powerwindow_MIN_uint64_T ((powerwindow_uint64_T)(0)) +# else +# define powerwindow_MAX_uint64_T ((powerwindow_uint64_T)(0xFFFFFFFFFFFFFFFFULL)) +# define powerwindow_MIN_uint64_T ((powerwindow_uint64_T)(0)) +# endif +# endif +#endif + +#ifdef _MSC_VER +/* Conversion from unsigned __int64 to double is not implemented in windows + and results in a compile error, thus the value must first be cast to + signed __int64, and then to double. + + If the 64 bit int value is greater than 2^63-1, which is the signed int64 max, + the macro below provides a workaround for casting a uint64 value to a double + in windows. +*/ +# define uint64_to_double(u) ( ((u) > _I64_MAX) ? \ + (double)(__int64)((u) - _I64_MAX - 1) + (double)_I64_MAX + 1: \ + (double)(__int64)(u) ) + +/* The following inline function should only be used in the macro double_to_uint64, + as it only handles the specfic range of double between 2^63 and 2^64-1 */ +__forceinline +powerwindow_uint64_T double_to_uint64_helper( double d ) +{ + union double_to_uint64_union_type { + double dd; + powerwindow_uint64_T i64; + } di; + di.dd = d; + return ( ( ( di.i64 & 0x000fffffffffffff ) | 0x0010000000000000 ) << 11 ); +} + +/* The largest double value that can be cast to uint64 in windows is the + signed int64 max, which is 2^63-1. The macro below provides + a workaround for casting large double values to uint64 in windows. +*/ +/* The magic number 18446744073709551616.0 is 2^64 */ +/* The magic number 9223372036854775808.0 is 2^63 */ +# define double_to_uint64(d) ( ((d) >= 18446744073709551616.0) ? \ + 0xffffffffffffffffULL : \ + ((d) < 0.0) ? 0ULL : \ + ((d) >= 9223372036854775808.0) ? \ + double_to_uint64_helper(d) : \ + (unsigned __int64)(d) ) +#else +# define uint64_to_double(u) ((double)(u)) +# if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__TICCSC__) +/* double_to_uint64 defined only for MSVC and UNIX */ +# else +# define double_to_uint64(d) ( ((d) > 0xffffffffffffffffULL) ? \ + (unsigned long long) 0xffffffffffffffffULL : \ + ((d) < 0) ? (unsigned long long) 0 : (unsigned long long)(d) ) +# endif +#endif + +#if !defined(__cplusplus) && !defined(__bool_true_false_are_defined) + +#ifndef _bool_T +#define _bool_T + +typedef powerwindow_boolean_T bool; + +#ifndef false +#define false (0) +#endif +#ifndef true +#define true (1) +#endif + +#endif /* _bool_T */ + +#endif /* !__cplusplus */ + +/* + This software assumes that the code is being compiled on a target using a + 2's complement representation for signed integer values. +*/ +#if ((SCHAR_MIN + 1) != -SCHAR_MAX) +#error "This code must be compiled using a 2's complement representation for signed integer values" +#endif + +/* + Maximum length of a MATLAB identifier (function/variable/model) + including the null-termination character. +*/ +#define TMW_NAME_LENGTH_MAX 64 + + +#ifdef MX_COMPAT_32 +typedef int powerwindow_mwSize; +typedef int powerwindow_mwIndex; +typedef int powerwindow_mwSignedIndex; +#else +typedef size_t +powerwindow_mwSize; /* unsigned pointer-width integer */ +typedef size_t +powerwindow_mwIndex; /* unsigned pointer-width integer */ +typedef ptrdiff_t +powerwindow_mwSignedIndex; /* a signed pointer-width integer */ +#endif + +#if (defined(_LP64) || defined(_WIN64)) && !defined(MX_COMPAT_32) +/* Currently 2^48 based on hardware limitations */ +# define powerwindow_MWSIZE_MAX 281474976710655UL +# define powerwindow_MWINDEX_MAX 281474976710655UL +# define powerwindow_MWSINDEX_MAX 281474976710655L +# define powerwindow_MWSINDEX_MIN -281474976710655L +#else +# define powerwindow_MWSIZE_MAX 2147483647UL +# define powerwindow_MWINDEX_MAX 2147483647UL +# define powerwindow_MWSINDEX_MAX 2147483647L +# define powerwindow_MWSINDEX_MIN -2147483647L +#endif +#define powerwindow_MWSIZE_MIN 0UL +#define powerwindow_MWINDEX_MIN 0UL + +/** UTF-16 character type */ + +#if (defined(__cplusplus) && (__cplusplus >= 201103L)) || (defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && _HAS_CHAR16_T_LANGUAGE_SUPPORT) +typedef char16_t powerwindow_CHAR16_T; +#elif defined(_MSC_VER) +typedef wchar_t powerwindow_CHAR16_T; +#else +typedef UINT16_T powerwindow_CHAR16_T; +#endif + +#endif /* powerwindow__TMWTYPES__ */ + +#endif /* powerwindow_tmwtypes_h */ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_DRV.c b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_DRV.c new file mode 100644 index 0000000..3a3f98d --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_DRV.c @@ -0,0 +1,313 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_DRV.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of driver side powerwindow. It connects the 3 smaller modules together. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#include "wcclib.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_DRV_private.h" + + + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_DRV_initialize( void ); +void powerwindow_PW_Control_DRV_terminate( void ); +void powerwindow_PW_Control_DRV_main( void ); + + +/* Block states (auto storage) */ +powerwindow_D_Work_powerwindow_PW_Control_D powerwindow_PW_Control_DR_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_powerwindow_PW_C powerwindow_PW_Control_DRV_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_powerwindow_PW_ powerwindow_PW_Control_DRV_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_DRV powerwindow_PW_Control_DRV_M_; +powerwindow_RT_MODEL_PW_Control_DRV *const powerwindow_PW_Control_DRV_M = + &powerwindow_PW_Control_DRV_M_; + + + +/* Model step function */ +void powerwindow_PW_Control_DRV_main( void ) +{ + /* local block i/o variables */ + powerwindow_boolean_T rtb_Debounce_Up_DRV; + powerwindow_boolean_T rtb_Debounce_Down_DRV; + + /* ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In2, + &rtb_Debounce_Up_DRV, + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In4, + &rtb_Debounce_Down_DRV, + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In9, + &powerwindow_PW_Control_DRV_Y.Out10, + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In10, + &powerwindow_PW_Control_DRV_Y.Out11, + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In5, + &powerwindow_PW_Control_DRV_Y.Out6, + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In6, + &powerwindow_PW_Control_DRV_Y.Out7, + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In7, + &powerwindow_PW_Control_DRV_Y.Out8, + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce ) ); + + /* ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_main( &powerwindow_PW_Control_DRV_U.In8, + &powerwindow_PW_Control_DRV_Y.Out9, + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtzce ) ); + + /* ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_main( &rtb_Debounce_Up_DRV, + &rtb_Debounce_Down_DRV, + &powerwindow_PW_Control_DRV_U.In1, + &powerwindow_PW_Control_DRV_U.In3, + &powerwindow_PW_Control_DRV_Y.Out1, + &powerwindow_PW_Control_DRV_Y.Out2, + &powerwindow_PW_Control_DRV_Y.Out3, + &powerwindow_PW_Control_DRV_Y.Out4, + &powerwindow_PW_Control_DRV_Y.Out5, + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce ) ); +} + + +/* Model initialize function */ +void powerwindow_PW_Control_DRV_initialize( void ) +{ + /* Registration code */ + + /* states (dwork) */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_DR_DWork, 0, + sizeof( powerwindow_D_Work_powerwindow_PW_Control_D ) ); + + /* external inputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_DRV_U, 0, + sizeof( powerwindow_ExternalInputs_powerwindow_PW_C ) ); + + /* external outputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_DRV_Y, 0, + sizeof( powerwindow_ExternalOutputs_powerwindow_PW_ ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Down_DRV' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Up_DRV' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_initialize( powerwindow_PW_DRV_rtmGetErrorStatusPointer( + powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/PW_DRV' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_DRV_rtmGetErrorStatusPointer( powerwindow_PW_Control_DRV_M ), + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtm ), + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw ), + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtzce ) ); + + /* Start for ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_Start + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_Start + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_Start + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_Start + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_Start + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_Start + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_Start( & + ( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Up_DRV' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_DRV_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Down_DRV' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_DRV_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_BackL' */ + powerwindow_debounce_Init + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackL_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_BackL' */ + powerwindow_debounce_Init + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackL_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_Front' */ + powerwindow_debounce_Init + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_Front_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_Front' */ + powerwindow_debounce_Init + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_Front_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Up_PSG_BackR' */ + powerwindow_debounce_Init + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Up_PSG_BackR_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/Debounce_Down_PSG_BackR' */ + powerwindow_debounce_Init + ( &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_DR_DWork.Debounce_Down_PSG_BackR_DWORK1.rtdw ) ); + + /* SystemInitialize for ModelReference: '/PW_DRV' */ + powerwindow_powerwindow_control_Init( &powerwindow_PW_Control_DRV_Y.Out1, + &powerwindow_PW_Control_DRV_Y.Out2, &powerwindow_PW_Control_DRV_Y.Out3, + &powerwindow_PW_Control_DRV_Y.Out4, &powerwindow_PW_Control_DRV_Y.Out5, + &( powerwindow_PW_Control_DR_DWork.PW_DRV_DWORK1.rtdw ) ); +} + +/* Model terminate function */ +void powerwindow_PW_Control_DRV_terminate( void ) +{ + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackL.c b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackL.c new file mode 100644 index 0000000..56eb3de --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackL.c @@ -0,0 +1,188 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackL.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of back-left passenger side powerwindow. It connects the 3 smaller modules together. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#include "wcclib.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackL_private.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_PSG_BackL_initialize( void ); +void powerwindow_PW_Control_PSG_BackL_terminate( void ); +void powerwindow_PW_Control_PSG_BackL_main( void ); + + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_BackL +powerwindow_PW_Control_PSG_BackL_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_BackL +powerwindow_PW_Control_PSG_BackL_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_BackL powerwindow_PW_Control_PSG_BackL_M_; +powerwindow_RT_MODEL_PW_Control_PSG_BackL *const +powerwindow_PW_Control_PSG_BackL_M = &powerwindow_PW_Control_PSG_BackL_M_; + +/* Model step function */ +void powerwindow_PW_Control_PSG_BackL_main( void ) +{ + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackL_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( &powerwindow_PW_Control_PSG_BackL_U.Up_PSG_BackL, + &rtb_debounce_Up, + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce ) ); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( &powerwindow_PW_Control_PSG_BackL_U.Down_PSG_BackL, + &rtb_debounce_Down, + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce ) ); + + /* ModelReference: '/ControlEx_PSG_BackL' */ + powerwindow_controlexclusion_main( &powerwindow_PW_Control_PSG_BackL_U.Up_DRV, + &powerwindow_PW_Control_PSG_BackL_U.Down_DRV, + &rtb_debounce_Up, &rtb_debounce_Down, + &powerwindow_rtb_ControlEx_PSG_BackL_o1, + &powerwindow_rtb_ControlEx_PSG_BackL_o2 ); + + /* ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_main( &powerwindow_rtb_ControlEx_PSG_BackL_o1, + &powerwindow_rtb_ControlEx_PSG_BackL_o2, + &powerwindow_PW_Control_PSG_BackL_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_BackL_U.currentsense, + &powerwindow_PW_Control_PSG_BackL_Y.window_up, + &powerwindow_PW_Control_PSG_BackL_Y.window_down, + &powerwindow_PW_Control_PSG_BackL_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackL_Y.pinch, + &powerwindow_PW_Control_PSG_BackL_Y.wake, + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce ) ); +} + +/* Model initialize function */ +void powerwindow_PW_Control_PSG_BackL_initialize( void ) +{ + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_BackL_rtmSetErrorStatus( powerwindow_PW_Control_PSG_BackL_M, + ( NULL ) ); + + /* states (dwork) */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_BackL_DWork, 0, + sizeof( powerwindow_D_Work_PW_Control_PSG_BackL ) ); + + /* external inputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_BackL_U, 0, + sizeof( powerwindow_ExternalInputs_PW_Control_PSG_BackL ) ); + + /* external outputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_BackL_Y, 0, + sizeof( powerwindow_ExternalOutputs_PW_Control_PSG_BackL ) ); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_BackL' */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_BackL_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackL_M ), + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtzce ) ); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_Start( & + ( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Up_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackL_DWork.Debounce_Down_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/PW_PSG_BackL' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_BackL_Y.window_up, + &powerwindow_PW_Control_PSG_BackL_Y.window_down, + &powerwindow_PW_Control_PSG_BackL_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackL_Y.pinch, + &powerwindow_PW_Control_PSG_BackL_Y.wake, + &( powerwindow_PW_Control_PSG_BackL_DWork.PW_PSG_BackL_DWORK1.rtdw ) ); +} + +/* Model terminate function */ +void powerwindow_PW_Control_PSG_BackL_terminate( void ) +{ + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackR.c b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackR.c new file mode 100644 index 0000000..46ead24 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_BackR.c @@ -0,0 +1,188 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_BackR.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of back-right passenger side powerwindow. It connects the 3 smaller modules together. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_PW_Control_PSG_BackR.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#include "wcclib.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_BackR_private.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_PSG_BackR_initialize( void ); +void powerwindow_PW_Control_PSG_BackR_terminate( void ); +void powerwindow_PW_Control_PSG_BackR_main( void ); + + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_BackR +powerwindow_PW_Control_PSG_BackR_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_BackR +powerwindow_PW_Control_PSG_BackR_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_BackR powerwindow_PW_Control_PSG_BackR_M_; +powerwindow_RT_MODEL_PW_Control_PSG_BackR *const +powerwindow_PW_Control_PSG_BackR_M = &powerwindow_PW_Control_PSG_BackR_M_; + +/* Model step function */ +void powerwindow_PW_Control_PSG_BackR_main( void ) +{ + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_BackR_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( &powerwindow_PW_Control_PSG_BackR_U.Up_PSG_BackR, + &rtb_debounce_Up, + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce ) ); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( &powerwindow_PW_Control_PSG_BackR_U.Down_PSG_BackR, + &rtb_debounce_Down, + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce ) ); + + /* ModelReference: '/ControlEx_PSG_BackR' */ + powerwindow_controlexclusion_main( &powerwindow_PW_Control_PSG_BackR_U.Up_DRV, + &powerwindow_PW_Control_PSG_BackR_U.Down_DRV, + &rtb_debounce_Up, &rtb_debounce_Down, + &powerwindow_rtb_ControlEx_PSG_BackR_o1, + &powerwindow_rtb_ControlEx_PSG_BackR_o2 ); + + /* ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_main( &powerwindow_rtb_ControlEx_PSG_BackR_o1, + &powerwindow_rtb_ControlEx_PSG_BackR_o2, + &powerwindow_PW_Control_PSG_BackR_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_BackR_U.currentsense, + &powerwindow_PW_Control_PSG_BackR_Y.window_up, + &powerwindow_PW_Control_PSG_BackR_Y.window_down, + &powerwindow_PW_Control_PSG_BackR_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackR_Y.pinch, + &powerwindow_PW_Control_PSG_BackR_Y.wake, + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce ) ); +} + +/* Model initialize function */ +void powerwindow_PW_Control_PSG_BackR_initialize( void ) +{ + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_BackR_rtmSetErrorStatus( powerwindow_PW_Control_PSG_BackR_M, + ( NULL ) ); + + /* states (dwork) */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_BackR_DWork, 0, + sizeof( powerwindow_D_Work_PW_Control_PSG_BackR ) ); + + /* external inputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_BackR_U, 0, + sizeof( powerwindow_ExternalInputs_PW_Control_PSG_BackR ) ); + + /* external outputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_BackR_Y, 0, + sizeof( powerwindow_ExternalOutputs_PW_Control_PSG_BackR ) ); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_BackR' */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_BackR_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_BackR_M ), + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtzce ) ); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_Start( & + ( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Up_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_BackR_DWork.Debounce_Down_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/PW_PSG_BackR' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_BackR_Y.window_up, + &powerwindow_PW_Control_PSG_BackR_Y.window_down, + &powerwindow_PW_Control_PSG_BackR_Y.overcurrent, + &powerwindow_PW_Control_PSG_BackR_Y.pinch, + &powerwindow_PW_Control_PSG_BackR_Y.wake, + &( powerwindow_PW_Control_PSG_BackR_DWork.PW_PSG_BackR_DWORK1.rtdw ) ); +} + +/* Model terminate function */ +void powerwindow_PW_Control_PSG_BackR_terminate( void ) +{ + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_Front.c b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_Front.c new file mode 100644 index 0000000..b55abce --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_PW_Control_PSG_Front.c @@ -0,0 +1,189 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_PW_Control_PSG_Front.c + + Author: CoSys-Lab, University of Antwerp + + Function: PW_Control_DRV realizes the functionality of front passenger side powerwindow. It connects the 3 smaller modules together. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#include "wcclib.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front.h" +#include "powerwindow_HeaderFiles/powerwindow_PW_Control_PSG_Front_private.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_PW_Control_PSG_Front_initialize( void ); +void powerwindow_PW_Control_PSG_Front_terminate( void ); +void powerwindow_PW_Control_PSG_Front_main( void ); + + +/* Block states (auto storage) */ +powerwindow_D_Work_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_DWork; + +/* External inputs (root inport signals with auto storage) */ +powerwindow_ExternalInputs_PW_Control_PSG_Front +powerwindow_PW_Control_PSG_Front_U; + +/* External outputs (root outports fed by signals with auto storage) */ +powerwindow_ExternalOutputs_PW_Control_PSG_Front +powerwindow_PW_Control_PSG_Front_Y; + +/* Real-time model */ +powerwindow_RT_MODEL_PW_Control_PSG_Front powerwindow_PW_Control_PSG_Front_M_; +powerwindow_RT_MODEL_PW_Control_PSG_Front *const +powerwindow_PW_Control_PSG_Front_M = &powerwindow_PW_Control_PSG_Front_M_; + +/* Model step function */ +void powerwindow_PW_Control_PSG_Front_main( void ) +{ + /* local block i/o variables */ + powerwindow_boolean_T rtb_debounce_Up; + powerwindow_boolean_T rtb_debounce_Down; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o1; + powerwindow_boolean_T powerwindow_rtb_ControlEx_PSG_Front_Front_o2; + + /* ModelReference: '/debounce_Up' */ + powerwindow_debounce_main( &powerwindow_PW_Control_PSG_Front_U.Up_PSG_Front, + &rtb_debounce_Up, + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce ) ); + + /* ModelReference: '/debounce_Down' */ + powerwindow_debounce_main( &powerwindow_PW_Control_PSG_Front_U.Down_PSG_Front, + &rtb_debounce_Down, + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce ) ); + + /* ModelReference: '/ControlEx_PSG_Front_Front' */ + powerwindow_controlexclusion_main( &powerwindow_PW_Control_PSG_Front_U.Up_DRV, + &powerwindow_PW_Control_PSG_Front_U.Down_DRV, + &rtb_debounce_Up, &rtb_debounce_Down, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o1, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o2 ); + + /* ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_main( + &powerwindow_rtb_ControlEx_PSG_Front_Front_o1, + &powerwindow_rtb_ControlEx_PSG_Front_Front_o2, + &powerwindow_PW_Control_PSG_Front_U.endofdetectionrange, + &powerwindow_PW_Control_PSG_Front_U.currentsense, + &powerwindow_PW_Control_PSG_Front_Y.window_up, + &powerwindow_PW_Control_PSG_Front_Y.window_down, + &powerwindow_PW_Control_PSG_Front_Y.overcurrent, + &powerwindow_PW_Control_PSG_Front_Y.pinch, + &powerwindow_PW_Control_PSG_Front_Y.wake, + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtzce ) ); +} + +/* Model initialize function */ +void powerwindow_PW_Control_PSG_Front_initialize( void ) +{ + /* Registration code */ + + /* initialize error status */ + powerwindow_PW_PSG_Front_rtmSetErrorStatus( powerwindow_PW_Control_PSG_Front_M, + ( NULL ) ); + + /* states (dwork) */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_Front_DWork, 0, + sizeof( powerwindow_D_Work_PW_Control_PSG_Front ) ); + + /* external inputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_Front_U, 0, + sizeof( powerwindow_ExternalInputs_PW_Control_PSG_Front ) ); + + /* external outputs */ + ( void ) wcclib_memset( ( void * )&powerwindow_PW_Control_PSG_Front_Y, 0, + sizeof( powerwindow_ExternalOutputs_PW_Control_PSG_Front ) ); + + /* Model Initialize fcn for ModelReference Block: '/ControlEx_PSG_Front_Front' */ + powerwindow_controlexclusion_initialize(); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Down' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/debounce_Up' */ + powerwindow_debounce_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtzce ) ); + + /* Model Initialize fcn for ModelReference Block: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_initialize( + powerwindow_PW_PSG_Front_rtmGetErrorStatusPointer( + powerwindow_PW_Control_PSG_Front_M ), + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtm ), + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw ), + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtzce ) ); + + /* Start for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Start( & + ( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw ) ); + + /* Start for ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_Start( & + ( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/debounce_Up' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Up_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/debounce_Down' */ + powerwindow_debounce_Init( & + ( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtb ), + &( powerwindow_PW_Control_PSG_Front_DWork.Debounce_Down_DWORK1.rtdw ) ); + + /* InitializeConditions for ModelReference: '/PW_PSG_Front_Front' */ + powerwindow_powerwindow_control_Init( + &powerwindow_PW_Control_PSG_Front_Y.window_up, + &powerwindow_PW_Control_PSG_Front_Y.window_down, + &powerwindow_PW_Control_PSG_Front_Y.overcurrent, + &powerwindow_PW_Control_PSG_Front_Y.pinch, + &powerwindow_PW_Control_PSG_Front_Y.wake, + &( powerwindow_PW_Control_PSG_Front_DWork.PW_PSG_Front_Front_DWORK1.rtdw ) ); +} + +/* Model terminate function */ +void powerwindow_PW_Control_PSG_Front_terminate( void ) +{ + /* (no terminate code required) */ +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_const_params.c b/targets/wasm-tacle/app/powerwindow/powerwindow_const_params.c new file mode 100644 index 0000000..f103808 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_const_params.c @@ -0,0 +1,25 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_const_params.c + + Author: CoSys-Lab, University of Antwerp + + Function: the lookup table for stateflow chart in powerwindow_powerwindow_control + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_const_params.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +extern const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[ 12 ]; +const powerwindow_boolean_T powerwindow_rtCP_pooled_6bUUQf1tASYw[ 12 ] = { 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0 + } ; diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_controlexclusion.c b/targets/wasm-tacle/app/powerwindow/powerwindow_controlexclusion.c new file mode 100644 index 0000000..69c4f82 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_controlexclusion.c @@ -0,0 +1,89 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_controlexclusion + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_controlexclusion is one functionality of the power window benchmark. + It takes the input signal from the driver and the passenger to determine the final control signal. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_controlexclusion.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + + +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion.h" +#include "powerwindow_HeaderFiles/powerwindow_controlexclusion_private.h" + +/* + Forward declaration of functions +*/ + +void powerwindow_controlexclusion_initialize( void ); +void powerwindow_controlexclusion_terminate( void ); +void powerwindow_controlexclusion_main( const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, powerwindow_boolean_T *rty_Down ); + +/* Model initialize function */ +void powerwindow_controlexclusion_initialize( void ) +{ + /* (no initialization code required) */ +} + +/* Model terminate function */ +void powerwindow_controlexclusion_terminate( void ) +{ + /* (no terminate code required) */ +} + + +/* + Algorithm core functions +*/ + +/* Output and update for referenced model: 'ControlExclusion' */ +void powerwindow_controlexclusion_main( const powerwindow_boolean_T *rtu_Up_DRV, + const powerwindow_boolean_T *rtu_Down_DRV, + const powerwindow_boolean_T *rtu_Up_PSG, + const powerwindow_boolean_T *rtu_Down_PSG, + powerwindow_boolean_T *rty_Up, powerwindow_boolean_T *rty_Down ) +{ + /* Logic: '/Logical Operator11' incorporates: + Logic: '/Logical Operator2' + Logic: '/Logical Operator3' + Logic: '/Logical Operator5' + Logic: '/Logical Operator6' + Logic: '/Logical Operator7' + */ + *rty_Up = !( ( ( !*rtu_Up_DRV ) && ( *rtu_Down_DRV ) ) || ( ( *rtu_Down_DRV ) && + ( !*rtu_Up_PSG ) && ( *rtu_Down_PSG ) ) ); + + /* Logic: '/Logical Operator12' incorporates: + Logic: '/Logical Operator1' + Logic: '/Logical Operator10' + Logic: '/Logical Operator4' + Logic: '/Logical Operator8' + Logic: '/Logical Operator9' + */ + *rty_Down = !( ( ( *rtu_Up_DRV ) && ( !*rtu_Down_DRV ) ) || ( ( *rtu_Up_DRV ) && + ( *rtu_Up_PSG ) && ( !*rtu_Down_PSG ) ) ); +} + + + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_debounce.c b/targets/wasm-tacle/app/powerwindow/powerwindow_debounce.c new file mode 100644 index 0000000..02efbb2 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_debounce.c @@ -0,0 +1,220 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_debounce.c + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_debounce_main is used to powerwindow_debounce_main the push-down button of the power window. + In order to input a manual switch signal into a digital circuit, + debouncing is necessary so that a single press does not appear like multiple presses. + Without debouncing, pressing the button once may cause unpredictable results. + powerwindow_debounce_main.c defines all the functions that will be used in debounce_PSG_Front which is a part of the Power window. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow/powerwindow_debounce.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + + +#include "wcclib.h" +#include "powerwindow_HeaderFiles/powerwindow_debounce.h" +#include "powerwindow_HeaderFiles/powerwindow_debounce_private.h" + +/* Named constants for Chart: '/Chart' */ +#define debounce_IN_debounce ((powerwindow_uint8_T)1U) +#define debounce_IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T)0U) +#define debounce_IN_Off ((powerwindow_uint8_T)2U) +#define debounce_IN_Off_h ((powerwindow_uint8_T)1U) +#define debounce_IN_On ((powerwindow_uint8_T)3U) +#define debounce_IN_On_b ((powerwindow_uint8_T)2U) + +/* + Forward declaration of functions +*/ + +void powerwindow_debounce_Init( powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T * ); +void powerwindow_debounce_Start( powerwindow_rtDW_debounce_T * ); +void powerwindow_debounce_initialize( const powerwindow_char_T **, + powerwindow_RT_MODEL_debounce_T *const, + powerwindow_rtB_debounce_T *, powerwindow_rtDW_debounce_T *, + powerwindow_rtZCE_debounce_T * ); +void powerwindow_debounce_main( const powerwindow_boolean_T *, + powerwindow_boolean_T *, powerwindow_rtB_debounce_T *, + powerwindow_rtDW_debounce_T *, powerwindow_rtZCE_debounce_T * ); + +/* + Initialization- and return-value-related functions +*/ + +/* Initial conditions for referenced model: 'powerwindow_debounce_main' */ +void powerwindow_debounce_Init( powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW ) +{ + /* InitializeConditions for Chart: '/Chart' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i1 = 0U; + localDW->is_active_c3_debounce = 0U; + localDW->is_c3_debounce = debounce_IN_NO_ACTIVE_CHILD; + localB->Q = false; +} + +/* Start for referenced model: 'powerwindow_debounce_main' */ +void powerwindow_debounce_Start( powerwindow_rtDW_debounce_T *localDW ) +{ + /* Start for DiscretePulseGenerator: '/period of 10ms' */ + localDW->clockTickCounter = 0L; +} + +/* Model initialize function */ +void powerwindow_debounce_initialize( const powerwindow_char_T **rt_errorStatus, + powerwindow_RT_MODEL_debounce_T * + const debounce_M, powerwindow_rtB_debounce_T *localB, + powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T *localZCE ) +{ + /* Registration code */ + + /* initialize error status */ + powerwindow_rtmSetErrorStatusPointer( debounce_M, rt_errorStatus ); + + /* block I/O */ + ( void ) wcclib_memset( ( ( void * ) localB ), 0, + sizeof( powerwindow_rtB_debounce_T ) ); + + /* states (dwork) */ + ( void ) wcclib_memset( ( void * )localDW, 0, + sizeof( powerwindow_rtDW_debounce_T ) ); + localZCE->Chart_Trig_ZCE = powerwindow_POS_ZCSIG; +} + +/* + Algorithm core functions +*/ + +/* Output and update for referenced model: 'powerwindow_debounce_main' */ +void powerwindow_debounce_main( const powerwindow_boolean_T *rtu_Switch, + powerwindow_boolean_T *rty_debounced_Switch, + powerwindow_rtB_debounce_T *localB, powerwindow_rtDW_debounce_T *localDW, + powerwindow_rtZCE_debounce_T + *localZCE ) +{ + powerwindow_int16_T rtb_periodof10ms; + + /* DiscretePulseGenerator: '/period of 10ms' */ + rtb_periodof10ms = ( localDW->clockTickCounter < 1L ) && + ( localDW->clockTickCounter >= 0L ) ? 1 : 0; + if ( localDW->clockTickCounter >= 1L ) + localDW->clockTickCounter = 0L; + + else + localDW->clockTickCounter++; + + /* End of DiscretePulseGenerator: '/period of 10ms' */ + + /* Chart: '/Chart' incorporates: + TriggerPort: '/ticks' + */ + /* DataTypeConversion: '/Data Type Conversion' */ + if ( ( rtb_periodof10ms != 0 ) && + ( localZCE->Chart_Trig_ZCE != powerwindow_POS_ZCSIG ) ) { + /* Gateway: Chart */ + if ( localDW->temporalCounter_i1 < 7U ) + localDW->temporalCounter_i1++; + + /* Event: ':13' */ + /* During: Chart */ + if ( localDW->is_active_c3_debounce == 0U ) { + /* Entry: Chart */ + localDW->is_active_c3_debounce = 1U; + + /* Entry Internal: Chart */ + /* Transition: ':9' */ + localDW->is_c3_debounce = debounce_IN_Off; + + /* Entry 'Off': ':1' */ + localB->Q = true; + } else { + switch ( localDW->is_c3_debounce ) { + case debounce_IN_debounce: + /* During 'powerwindow_debounce_main': ':6' */ + if ( localDW->is_debounce == debounce_IN_Off_h ) { + /* During 'Off': ':8' */ + if ( ( powerwindow_int16_T )*rtu_Switch < 1 ) { + /* Transition: ':12' */ + localDW->is_debounce = debounce_IN_On_b; + localDW->temporalCounter_i1 = 0U; + } else { + if ( localDW->temporalCounter_i1 >= 3 ) { + /* Transition: ':16' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->is_c3_debounce = debounce_IN_Off; + + /* Entry 'Off': ':1' */ + localB->Q = true; + } + } + } else { + /* During 'On': ':7' */ + if ( ( powerwindow_int16_T )*rtu_Switch > 0 ) { + /* Transition: ':11' */ + localDW->is_debounce = debounce_IN_Off_h; + localDW->temporalCounter_i1 = 0U; + } else { + if ( localDW->temporalCounter_i1 >= 3 ) { + /* Transition: ':14' */ + localDW->is_debounce = debounce_IN_NO_ACTIVE_CHILD; + localDW->is_c3_debounce = debounce_IN_On; + + /* Entry 'On': ':5' */ + localB->Q = false; + } + } + } + break; + + case debounce_IN_Off: + /* During 'Off': ':1' */ + if ( ( powerwindow_int16_T )*rtu_Switch < 1 ) { + /* Transition: ':10' */ + localDW->is_c3_debounce = debounce_IN_debounce; + localDW->is_debounce = debounce_IN_On_b; + localDW->temporalCounter_i1 = 0U; + } + break; + + default: + /* During 'On': ':5' */ + if ( ( powerwindow_int16_T )*rtu_Switch > 0 ) { + /* Transition: ':15' */ + localDW->is_c3_debounce = debounce_IN_debounce; + localDW->is_debounce = debounce_IN_Off_h; + localDW->temporalCounter_i1 = 0U; + } + break; + } + } + } + + localZCE->Chart_Trig_ZCE = ( powerwindow_uint8_T )( rtb_periodof10ms != 0 ? + ( powerwindow_int16_T ) + powerwindow_POS_ZCSIG : ( powerwindow_int16_T )powerwindow_ZERO_ZCSIG ); + + /* End of DataTypeConversion: '/Data Type Conversion' */ + + /* DataTypeConversion: '/Data Type Conversion2' */ + *rty_debounced_Switch = localB->Q; +} + + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_inputs.c b/targets/wasm-tacle/app/powerwindow/powerwindow_inputs.c new file mode 100644 index 0000000..222ea14 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_inputs.c @@ -0,0 +1,90 @@ +#include "powerwindow_HeaderFiles/powerwindow_rtwtypes.h" + +powerwindow_boolean_T +powerwindow_debounce_Driver_DRV_U_Up_Input_DRV_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T +powerwindow_debounce_Driver_DRV_U_Down_Input_DRV_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1}; + +powerwindow_boolean_T +powerwindow_debounce_Driver_Front_U_Up_Input_Front_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +powerwindow_boolean_T +powerwindow_debounce_Driver_Front_U_Down_Input_Front_Array[powerwindow_input_length] + = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; + +powerwindow_boolean_T +powerwindow_debounce_Driver_BackL_U_Up_Input_BackL_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +powerwindow_boolean_T +powerwindow_debounce_Driver_BackL_U_Down_Input_BackL_Array[powerwindow_input_length] + = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_debounce_Driver_BackR_U_Up_Input_BackR_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +powerwindow_boolean_T +powerwindow_debounce_Driver_BackR_U_Down_Input_BackR_Array[powerwindow_input_length] + = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_DRV_Array[powerwindow_input_length] + = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; + +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_DRV_Array[powerwindow_input_length] + = {92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0 }; + +powerwindow_boolean_T +powerwindow_debounce_passenger_Front_U_Up_Front_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_debounce_passenger_Front_U_Down_Front_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_Front_Array[powerwindow_input_length] + = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; + +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_Front_Array[powerwindow_input_length] + = {92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0 }; + +powerwindow_boolean_T +powerwindow_debounce_passenger_BackL_U_Up_BackL_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_debounce_passenger_BackL_U_Down_BackL_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_BackL_Array[powerwindow_input_length] + = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; + +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_BackL_Array[powerwindow_input_length] + = {92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0 }; + +powerwindow_boolean_T +powerwindow_debounce_passenger_BackR_U_Up_BackR_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_debounce_passenger_BackR_U_Down_BackR_Array[powerwindow_input_length] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1 }; + +powerwindow_boolean_T +powerwindow_powerwindow_control_U_endofdetectionrange_BackR_Array[powerwindow_input_length] + = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; + +powerwindow_uint8_T +powerwindow_powerwindow_control_U_currentsense_BackR_Array[powerwindow_input_length] + = {92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 94, 92, 92, 92, 92, 92, 92, 92, 92, 92, 20, 73, 20, 73, 92, 94, 29, 72, 88, 72, 22, 93, 89, 89, 72, 93, 70, 30, 17, 72, 92, 121, 69, 24, 8, 93, 84, 94, 14, 72, 68, 84, 92, 84, 8, 92, 85, 29, 85, 72, 92, 92, 29, 93, 29, 92, 92, 72, 92, 92, 92, 92, 92, 124, 124, 92, 92, 93, 105, 72, 69, 21, 30, 88, 120, 93, 116, 16, 94, 0, 84, 116, 94, 65, 64, 94, 86, 73, 74, 72, 21, 85, 116, 92, 0, 92, 116, 88, 80, 8, 92, 84, 117, 4, 8, 29, 76, 1, 85, 72, 92, 84, 124, 84, 64, 93, 29, 93, 81, 188, 124, 124, 124, 93, 0, 29, 28, 24, 69, 8, 92, 92, 92, 116, 116, 120, 116, 93, 94, 93, 94, 124, 122, 124, 100, 116, 116, 116, 116, 116, 124, 116, 93, 93, 93, 10, 101, 94, 102, 98, 97, 1, 97, 97, 97, 117, 94, 93, 94, 93, 94, 2, 2, 93, 8, 93, 92, 88, 80, 81, 80, 100, 80, 112, 112, 117, 96, 96, 80, 93, 92, 124, 89, 84, 112, 112, 117, 118, 16, 124, 94, 94, 94, 124, 93, 8, 94, 14, 72, 104, 28, 68, 0, 72, 188, 93, 120, 93, 88, 10, 28, 20, 20, 88, 120, 88, 176, 93, 120, 88, 93, 120, 29, 120, 93, 92, 93, 93, 117, 120, 120, 93, 120, 89, 114, 197, 189, 93, 121, 112, 124, 93, 93, 197, 197, 94, 189, 197, 5, 133, 157, 197, 112, 65, 121, 25, 186, 93, 120, 122, 94, 149, 200, 149, 149, 157, 150, 145, 156, 149, 148, 146, 150, 148, 150, 130, 150, 150, 150, 150, 146, 150, 150, 149, 149, 134, 149, 130, 129, 148, 149, 148, 150, 128, 197, 132, 148, 140, 132, 8, 20, 84, 88, 76, 64, 20, 20, 68, 68, 28, 28, 28, 29, 28, 28, 8, 28, 20, 28, 28, 28, 28, 28, 13, 13, 22, 13, 70, 12, 76, 24, 24, 24, 72, 24, 28, 13, 13, 24, 24, 24, 14, 14, 13, 14, 14, 78, 13, 14, 14, 14, 13, 13, 30, 5, 8, 4, 20, 20, 4, 4, 4, 68, 28, 4, 8, 4, 12, 4, 4, 4, 68, 68, 92, 4, 68, 4, 4, 4, 28, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 76, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 8, 12, 12, 12, 12, 12, 12, 12, 14, 12, 72, 14, 13, 12, 14, 14, 13, 14, 72, 13, 13, 72, 93, 13, 88, 94, 72, 94, 93, 94, 94, 94, 72, 94, 93, 94, 93, 88, 88, 72, 88, 92, 12, 88, 4, 84, 84, 84, 84, 84, 84, 84, 84, 84, 68, 4, 68, 24, 24, 24, 12, 24, 88, 28, 88, 12, 72, 12, 12, 88, 12, 12, 12, 12, 12, 12, 12, 72, 12, 12, 8, 20, 20, 133, 133, 157, 157, 93, 137, 157, 93, 148, 0, 148, 144, 152, 156, 140, 137, 128, 158, 144, 129, 144, 128, 130, 129, 132, 156, 156, 72, 120, 93, 93, 93, 86, 137, 178, 113, 93, 92, 85, 5, 188, 188, 6, 188, 17, 21, 197, 22, 194, 196, 188, 10, 100, 192, 138, 154, 137, 92, 137, 200, 200, 200, 6, 133, 128, 136, 200, 0, 192, 188, 153, 140, 72, 200, 200, 92, 200, 124, 196, 124, 116, 116, 116, 124, 124, 121, 124, 124, 200, 124, 92, 185, 5, 117, 124, 120, 82, 88, 112, 188, 193, 198, 72, 20, 4, 120, 97, 97, 121, 112, 93, 121, 113, 80, 80, 93, 88, 89, 93, 88, 92, 88, 104, 89, 89, 89, 92, 88, 121, 121, 122, 88, 94, 84, 84, 124, 116, 94, 104, 124, 94, 108, 94, 88, 88, 84, 116, 80, 94, 88, 88, 92, 25, 88, 120, 104, 108, 1, 94, 96, 96, 98, 82, 104, 20, 92, 98, 14, 94, 6, 101, 109, 22, 120, 105, 93, 120, 81, 120, 2, 1, 94, 18, 18, 120, 94, 66, 2, 104, 68, 94, 73, 82, 101, 121, 93, 113, 22, 93, 120, 94, 93, 5, 13, 122, 89, 90, 5, 101, 93, 106, 94, 73, 21, 72, 89, 121, 73, 92, 93, 84, 117, 0, 21, 85, 52, 4, 6, 198, 0, 185, 192, 29, 194, 189, 36, 36, 93, 185, 52, 0, 4, 13, 188, 9, 28, 89, 86, 185, 113, 186, 186, 14, 185, 188, 186, 188, 88, 189, 188, 116, 124, 68, 188, 188, 188, 198, 84, 52, 188, 197, 185, 20, 190, 5, 6, 190, 28, 128, 189, 189, 189, 93, 189, 14, 94, 189, 68, 190, 190, 190, 157, 84, 141, 197, 189, 197, 93, 189, 37, 190, 190, 22, 190, 190, 190, 190, 86, 190, 190, 190, 189, 94, 190, 190, 190, 190, 86, 198, 190, 189, 200, 94, 94, 6, 190, 5, 86, 2, 190, 190, 33, 0, 28, 68, 16, 80, 144, 144, 49, 52, 116, 76, 84, 49, 196, 197, 93, 17, 73, 137, 185, 93, 185, 188, 188, 185, 13, 185, 186, 186, 186, 14, 188, 186, 186, 188, 6, 186, 188, 188, 188, 84, 188, 188, 188, 188, 84, 188, 188, 188, 188, 69, 188, 189, 188, 188, 84, 188, 189, 189, 189, 24, 189, 189, 189, 189, 86, 52, 189, 93, 149, 84, 189, 93, 141, 189, 84, 189, 189, 190, 190, 86, 190, 198, 142, 190, 86, 190, 142, 190, 190, 76, 118, 142, 94, 94, 86, 198, 134, 198, 198, 85, 6, 6, 46, 38, 85, 190, 190, 186, 190, 64, 69, 69, 77, 86, 88, 28, 93, 84, 116, 0, 0 }; + diff --git a/targets/wasm-tacle/app/powerwindow/powerwindow_powerwindow_control.c b/targets/wasm-tacle/app/powerwindow/powerwindow_powerwindow_control.c new file mode 100644 index 0000000..6aed72a --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/powerwindow_powerwindow_control.c @@ -0,0 +1,554 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: powerwindow_powerwindow_control.c + + Author: CoSys-Lab, University of Antwerp + + Function: powerwindow_control is the main functionality of the power window benchmark. + It contains 3 states: System, EndReached and Pinch, which are used to controll the + position of the glass, if the window is fully closed and sensing pinch force to realize + the powerwindow function. + + Source: https://github.com/tacle/tacle-bench/blob/master/bench/app/PowerWindow//powerwindow_powerwindow_control.c + + Changes: a brief summary of major functional changes and formatting) + + License: GNU General Public License + +*/ + +#include "wcclib.h" +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control.h" +#include "powerwindow_HeaderFiles/powerwindow_powerwindow_control_private.h" + +/* Named constants for Chart: '/stateflow control model' */ +#define powerwindow_powerwindow__IN_NO_ACTIVE_CHILD ((powerwindow_uint8_T)0U) +#define powerwindow_powerwindow_contr_IN_EndReached ((powerwindow_uint8_T)1U) +#define powerwindow_powerwindow_contr_IN_SensePinch ((powerwindow_uint8_T)2U) +#define powerwindow_powerwindow_control_IN_AutoDown ((powerwindow_uint8_T)1U) +#define powerwindow_powerwindow_control_IN_AutoUp ((powerwindow_uint8_T)1U) +#define powerwindow_powerwindow_control_IN_Down ((powerwindow_uint8_T)2U) +#define powerwindow_powerwindow_control_IN_Down_d ((powerwindow_uint8_T)1U) +#define powerwindow_powerwindow_control_IN_InitDown ((powerwindow_uint8_T)3U) +#define powerwindow_powerwindow_control_IN_InitUp ((powerwindow_uint8_T)2U) +#define powerwindow_powerwindow_control_IN_Neutral ((powerwindow_uint8_T)2U) +#define powerwindow_powerwindow_control_IN_Pinch ((powerwindow_uint8_T)2U) +#define powerwindow_powerwindow_control_IN_SenseEnd ((powerwindow_uint8_T)1U) +#define powerwindow_powerwindow_control_IN_Start ((powerwindow_uint8_T)3U) +#define powerwindow_powerwindow_control_IN_System ((powerwindow_uint8_T)3U) +#define powerwindow_powerwindow_control_IN_Up ((powerwindow_uint8_T)3U) + +/* Forward declaration for local functions */ +void powerwindow_powerwindow_control_Start( powerwindow_rtDW_PowerWindow_control + *localDW ); + +void powerwindow_powerwindow_control_Init( powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T + *rty_window_down, powerwindow_boolean_T *rty_overcurrent, + powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T * + rty_wake, powerwindow_rtDW_PowerWindow_control *localDW ); + +void powerwindow_powerwindow_control_Start( powerwindow_rtDW_PowerWindow_control + *localDW ); + +void powerwindow_powerwindow_control_initialize( const powerwindow_char_T + **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE ); + +void powerwindow_powerwindow_control_main( const powerwindow_boolean_T *rtu_up, + const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T + *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE ); + +void powerwindow_powerwindow_con_broadcast_ticks( powerwindow_boolean_T + *rty_window_up, powerwindow_boolean_T * + rty_window_down, powerwindow_boolean_T *rty_overcurrent, + powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T + *rty_wake, powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW ); + +/* Function for Chart: '/stateflow control model' */ +void powerwindow_powerwindow_con_broadcast_ticks( powerwindow_boolean_T + *rty_window_up, powerwindow_boolean_T * + rty_window_down, powerwindow_boolean_T *rty_overcurrent, + powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T + *rty_wake, powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW ) +{ + /* Event: ':30' */ + /* During: PW_PSG/PWExternalClock/stateflow control model */ + if ( localDW->is_active_c2_PowerWindow_contro == 0U ) { + /* Entry: PW_PSG/PWExternalClock/stateflow control model */ + localDW->is_active_c2_PowerWindow_contro = 1U; + + /* Entry Internal: PW_PSG/PWExternalClock/stateflow control model */ + /* Transition: ':102' */ + localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } else { + switch ( localDW->is_c2_PowerWindow_control ) { + case powerwindow_powerwindow_contr_IN_EndReached: + /* During 'EndReached': ':97' */ + if ( localDW->temporalCounter_i1 >= 10 ) { + /* Transition: ':101' */ + localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } + break; + + case powerwindow_powerwindow_control_IN_Pinch: + /* During 'Pinch': ':152' */ + if ( localDW->temporalCounter_i1 >= 40 ) { + /* Transition: ':157' */ + localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_System; + + /* Entry Internal 'System': ':94' */ + localDW->is_active_Logic = 1U; + + /* Entry Internal 'Logic': ':95' */ + /* Transition: ':82' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + localDW->is_active_Sensing = 1U; + + /* Entry Internal 'Sensing': ':96' */ + /* Transition: ':153' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } + break; + + default: + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* During 'System': ':94' */ + if ( *rty_pinch == 1 ) { + /* Transition: ':155' */ + /* Exit Internal 'System': ':94' */ + /* Exit Internal 'Sensing': ':96' */ + localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Sensing = 0U; + + /* Exit Internal 'Logic': ':95' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Logic = 0U; + localDW->is_c2_PowerWindow_control = powerwindow_powerwindow_control_IN_Pinch; + localDW->temporalCounter_i1 = 0U; + + /* Entry 'Pinch': ':152' */ + *rty_window_up = false; + *rty_window_down = true; + } else + if ( *rty_overcurrent == 1 ) { + /* Transition: ':100' */ + /* Exit Internal 'System': ':94' */ + /* Exit Internal 'Sensing': ':96' */ + localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Sensing = 0U; + + /* Exit Internal 'Logic': ':95' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_active_Logic = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow_contr_IN_EndReached; + localDW->temporalCounter_i1 = 0U; + + /* Entry 'EndReached': ':97' */ + *rty_window_up = false; + *rty_window_down = false; + } else { + /* During 'Logic': ':95' */ + switch ( localDW->is_Logic ) { + case powerwindow_powerwindow_control_IN_Down_d: + /* During 'Down': ':18' */ + if ( localB->map[ 1 ] ) { + /* Transition: ':169' */ + /* Exit Internal 'Down': ':18' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow_control_IN_Up; + + /* Entry 'Up': ':17' */ + *rty_window_up = true; + *rty_window_down = false; + *rty_wake = true; + localDW->is_Up = powerwindow_powerwindow_control_IN_Up; + } else { + switch ( localDW->is_Down ) { + case powerwindow_powerwindow_control_IN_AutoDown: + /* During 'AutoDown': ':111' */ + break; + + case powerwindow_powerwindow_control_IN_Down: + /* During 'Down': ':110' */ + if ( localB->map[ 0 ] ) { + /* Transition: ':26' */ + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + } + break; + + default: + /* During 'InitDown': ':109' */ + if ( localDW->temporalCounter_i1 >= 20 ) { + /* Transition: ':119' */ + if ( localB->map[ 0 ] ) { + /* Transition: ':120' */ + localDW->is_Down = powerwindow_powerwindow_control_IN_AutoDown; + } else { + if ( localB->map[ 2 ] ) { + /* Transition: ':121' */ + localDW->is_Down = powerwindow_powerwindow_control_IN_Down; + } + } + } + break; + } + } + break; + + case powerwindow_powerwindow_control_IN_Neutral: + /* During 'Neutral': ':16' */ + if ( localB->map[ 1 ] ) { + /* Transition: ':24' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Up; + + /* Entry 'Up': ':17' */ + *rty_window_up = true; + *rty_window_down = false; + *rty_wake = true; + localDW->is_Up = powerwindow_powerwindow_control_IN_InitUp; + localDW->temporalCounter_i1 = 0U; + } else { + if ( localB->map[ 2 ] ) { + /* Transition: ':25' */ + localDW->is_Logic = powerwindow_powerwindow_control_IN_Down_d; + + /* Entry 'Down': ':18' */ + *rty_window_up = false; + *rty_window_down = true; + *rty_wake = true; + localDW->is_Down = powerwindow_powerwindow_control_IN_InitDown; + localDW->temporalCounter_i1 = 0U; + } + } + break; + + default: + /* During 'Up': ':17' */ + if ( localB->map[ 2 ] ) { + /* Transition: ':166' */ + /* Exit Internal 'Up': ':17' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow_control_IN_Down_d; + + /* Entry 'Down': ':18' */ + *rty_window_up = false; + *rty_window_down = true; + *rty_wake = true; + localDW->is_Down = powerwindow_powerwindow_control_IN_Down; + } else { + switch ( localDW->is_Up ) { + case powerwindow_powerwindow_control_IN_AutoUp: + /* During 'AutoUp': ':108' */ + break; + + case powerwindow_powerwindow_control_IN_InitUp: + /* During 'InitUp': ':106' */ + if ( localDW->temporalCounter_i1 >= 20 ) { + /* Transition: ':115' */ + if ( localB->map[ 0 ] ) { + /* Transition: ':118' */ + localDW->is_Up = powerwindow_powerwindow_control_IN_AutoUp; + } else { + if ( localB->map[ 1 ] ) { + /* Transition: ':117' */ + localDW->is_Up = powerwindow_powerwindow_control_IN_Up; + } + } + } + break; + + default: + /* During 'Up': ':107' */ + if ( localB->map[ 0 ] ) { + /* Transition: ':23' */ + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Logic = powerwindow_powerwindow_control_IN_Neutral; + + /* Entry 'Neutral': ':16' */ + *rty_window_up = false; + *rty_window_down = false; + *rty_wake = false; + } + break; + } + } + break; + } + + /* During 'Sensing': ':96' */ + switch ( localDW->is_Sensing ) { + case powerwindow_powerwindow_control_IN_SenseEnd: + /* During 'SenseEnd': ':147' */ + if ( ( localB->LogicalOperator == 0 ) && ( *rty_window_up == 1 ) ) { + /* Transition: ':173' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_Start; + localDW->temporalCounter_i2 = 0U; + + /* Entry 'Start': ':170' */ + *rty_overcurrent = false; + *rty_pinch = false; + } else + *rty_overcurrent = ( localB->RateTransition1 > 184 ); + break; + + case powerwindow_powerwindow_contr_IN_SensePinch: + /* During 'SensePinch': ':148' */ + if ( ( localB->LogicalOperator == 1 ) || ( *rty_window_down == 1 ) ) { + /* Transition: ':150' */ + localDW->is_Sensing = powerwindow_powerwindow_control_IN_SenseEnd; + } else + *rty_pinch = ( localB->RateTransition1 > 92 ); + break; + + default: + /* During 'Start': ':170' */ + if ( localDW->temporalCounter_i2 >= 6 ) { + /* Transition: ':171' */ + localDW->is_Sensing = powerwindow_powerwindow_contr_IN_SensePinch; + } + break; + } + } + break; + } + } +} + +/* Initial conditions for referenced model: 'powerwindow_powerwindow_control' */ +void powerwindow_powerwindow_control_Init( powerwindow_boolean_T *rty_window_up, + powerwindow_boolean_T + *rty_window_down, powerwindow_boolean_T *rty_overcurrent, + powerwindow_boolean_T *rty_pinch, powerwindow_boolean_T * + rty_wake, powerwindow_rtDW_PowerWindow_control *localDW ) +{ + /* InitializeConditions for Chart: '/stateflow control model' */ + localDW->is_active_Logic = 0U; + localDW->is_Logic = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Down = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->is_Up = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i1 = 0U; + localDW->is_active_Sensing = 0U; + localDW->is_Sensing = powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + localDW->temporalCounter_i2 = 0U; + localDW->is_active_c2_PowerWindow_contro = 0U; + localDW->is_c2_PowerWindow_control = + powerwindow_powerwindow__IN_NO_ACTIVE_CHILD; + *rty_window_up = false; + *rty_window_down = false; + *rty_overcurrent = false; + *rty_pinch = false; + *rty_wake = false; +} + +/* Start for referenced model: 'powerwindow_powerwindow_control' */ +void powerwindow_powerwindow_control_Start( powerwindow_rtDW_PowerWindow_control + *localDW ) +{ + /* Start for DiscretePulseGenerator: '/period of 50ms' */ + localDW->clockTickCounter = 0L; +} + +/* Output and update for referenced model: 'powerwindow_powerwindow_control' */ +void powerwindow_powerwindow_control_main( const powerwindow_boolean_T *rtu_up, + const powerwindow_boolean_T *rtu_down, + const powerwindow_boolean_T *rtu_endofdetectionrange, + const powerwindow_uint8_T *rtu_currentsense, + powerwindow_boolean_T *rty_window_up, powerwindow_boolean_T *rty_window_down, + powerwindow_boolean_T + *rty_overcurrent, powerwindow_boolean_T *rty_pinch, + powerwindow_boolean_T *rty_wake, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE ) +{ + powerwindow_int16_T rowIdx; + powerwindow_int16_T rtb_periodof50ms; + + /* DiscretePulseGenerator: '/period of 50ms' */ + rtb_periodof50ms = ( localDW->clockTickCounter < 5L ) && + ( localDW->clockTickCounter >= 0L ) ? 1 : 0; + if ( localDW->clockTickCounter >= 9L ) + localDW->clockTickCounter = 0L; + + else + localDW->clockTickCounter++; + + /* End of DiscretePulseGenerator: '/period of 50ms' */ + + /* Logic: '/Logical Operator' */ + localB->LogicalOperator = !*rtu_endofdetectionrange; + + /* RateTransition: '/Rate Transition1' */ + localB->RateTransition1 = *rtu_currentsense; + + /* CombinatorialLogic: '/map' */ + rowIdx = ( powerwindow_int16_T )( ( ( powerwindow_uint16_T ) * rtu_up << 1 ) + + *rtu_down ); + localB->map[ 0U ] = rtCP_map_table[ ( powerwindow_uint16_T )rowIdx ]; + localB->map[ 1U ] = rtCP_map_table[ rowIdx + 4U ]; + localB->map[ 2U ] = rtCP_map_table[ rowIdx + 8U ]; + + /* Chart: '/stateflow control model' incorporates: + TriggerPort: '/ticks' + */ + /* DataTypeConversion: '/Data Type Conversion' */ + if ( ( ( rtb_periodof50ms != 0 ) != ( localZCE->stateflowcontrolmodel_Trig_ZCE + == + powerwindow_POS_ZCSIG ) ) && ( localZCE->stateflowcontrolmodel_Trig_ZCE != + powerwindow_UNINITIALIZED_ZCSIG ) ) { + /* Gateway: PW_PSG/PWExternalClock/stateflow control model */ + if ( localDW->temporalCounter_i1 < 63U ) + localDW->temporalCounter_i1++; + + if ( localDW->temporalCounter_i2 < 7U ) + localDW->temporalCounter_i2++; + + powerwindow_powerwindow_con_broadcast_ticks( rty_window_up, rty_window_down, + rty_overcurrent, rty_pinch, rty_wake, localB, localDW ); + } + + localZCE->stateflowcontrolmodel_Trig_ZCE = ( powerwindow_uint8_T )( + rtb_periodof50ms != 0 ? + ( powerwindow_int16_T )powerwindow_POS_ZCSIG : ( powerwindow_int16_T ) + powerwindow_ZERO_ZCSIG ); + + /* End of DataTypeConversion: '/Data Type Conversion' */ +} + +/* Model initialize function */ +void powerwindow_powerwindow_control_initialize( const powerwindow_char_T + **rt_errorStatus, + powerwindow_RT_MODEL_PowerWindow_control *const PowerWindow_control_M, + powerwindow_rtB_PowerWindow_control *localB, + powerwindow_rtDW_PowerWindow_control *localDW, + powerwindow_rtZCE_PowerWindow_control *localZCE ) +{ + /* Registration code */ + + /* initialize error status */ + powerwindow_powerwindow_control_rtmSetErrorStatusPointer( PowerWindow_control_M, + rt_errorStatus ); + + /* block I/O */ + ( void ) wcclib_memset( ( ( void * ) localB ), 0, + sizeof( powerwindow_rtB_PowerWindow_control ) ); + + /* states (dwork) */ + ( void ) wcclib_memset( ( void * )localDW, 0, + sizeof( powerwindow_rtDW_PowerWindow_control ) ); + localZCE->stateflowcontrolmodel_Trig_ZCE = powerwindow_UNINITIALIZED_ZCSIG; +} + +/* + File trailer for generated code. + + [ EOF ] +*/ diff --git a/targets/wasm-tacle/app/powerwindow/wcclib.c b/targets/wasm-tacle/app/powerwindow/wcclib.c new file mode 100644 index 0000000..e5db1d0 --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/wcclib.c @@ -0,0 +1,12 @@ +#include "wcclib.h" + + +void *wcclib_memset( void *s, int c, size_t n ) +{ + unsigned char *p = s; + + _Pragma( "loopbound min 1 max 368" ) + while ( n-- ) + *p++ = ( unsigned char ) c; + return ( s ); +} diff --git a/targets/wasm-tacle/app/powerwindow/wcclib.h b/targets/wasm-tacle/app/powerwindow/wcclib.h new file mode 100644 index 0000000..811833d --- /dev/null +++ b/targets/wasm-tacle/app/powerwindow/wcclib.h @@ -0,0 +1,14 @@ +#ifndef _WCCLIB +#define _WCCLIB + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#define NULL ( (void *) 0) + +void *wcclib_memset( void *s, int c, size_t n ); + +#endif // _WCCLIB diff --git a/targets/wasm-tacle/kernel/binarysearch/CMakeLists.txt b/targets/wasm-tacle/kernel/binarysearch/CMakeLists.txt new file mode 100644 index 0000000..f8b8aa7 --- /dev/null +++ b/targets/wasm-tacle/kernel/binarysearch/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(binarysearch) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/binarysearch.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/binarysearch.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/binarysearch/ChangeLog.txt b/targets/wasm-tacle/kernel/binarysearch/ChangeLog.txt new file mode 100755 index 0000000..b25e6e9 --- /dev/null +++ b/targets/wasm-tacle/kernel/binarysearch/ChangeLog.txt @@ -0,0 +1,42 @@ +File: binarysearch.c +Original provenience: Mälardalen benchmark suite, + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bs + +2015-10-10: +- Removed original header comment, replaced by TACLeBench header. +- Added prefix "binarysearch_" to all global symbols. +- Added explicit forward declarations of functions, removed obsolete forward + declaration of function binary_search. +- Replaced initialization of global array "binarysearch_data" by + TACLeBench-compliant initialization code. +- Added new global variable "binarysearch_result" to store the found return + value. +- Added new function binarysearch_return producing the searched data element as + return value. +- Removed global variable "binarysearch_cnt1" that was used for profiling. +- Added new function binarysearch_main according to TACLeBench guidelines. + binarysearch_main is annotated as entry-point for timing analysis. +- Corrected flow fact in function "binarysearch_binary_search" to cover the + interval [1, 4] instead of [4, 4]. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: binarysearch_) followed by lowercase letter (e.g., + binarysearch_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur diff --git a/targets/wasm-tacle/kernel/binarysearch/binarysearch.c b/targets/wasm-tacle/kernel/binarysearch/binarysearch.c new file mode 100755 index 0000000..c4087f5 --- /dev/null +++ b/targets/wasm-tacle/kernel/binarysearch/binarysearch.c @@ -0,0 +1,156 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: binarysearch + + Author: Sung-Soo Lim + + Function: binarysearch performs binary search in an array of 15 integer + elements. + This program is completely structured (no unconditional jumps, no exits + from loop bodies), and does not contain switch statements, no do-while + loops. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bs/bs.c + + Original name: bs + + Changes: No major functional changes. + + License: May be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim +*/ + + +/* + Forward declaration of functions +*/ + +void binarysearch_initSeed( void ); +long binarysearch_randomInteger( void ); +void binarysearch_init( void ); +int binarysearch_return( void ); +int binarysearch_binary_search( int ); +void binarysearch_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +volatile int binarysearch_seed; + +struct binarysearch_DATA { + int key; + int value; +}; + +struct binarysearch_DATA binarysearch_data[ 15 ]; + +int binarysearch_result; + + +/* + Initialization- and return-value-related functions +*/ + +/* + binarysearch_initSeed initializes the seed used in the "random" number + generator. +*/ +void binarysearch_initSeed( void ) +{ + binarysearch_seed = 0; +} + + +/* + binarysearch_RandomInteger generates "random" integers between 0 and 8094. +*/ +long binarysearch_randomInteger( void ) +{ + binarysearch_seed = ( ( binarysearch_seed * 133 ) + 81 ) % 8095; + return ( binarysearch_seed ); +} + + +void binarysearch_init( void ) +{ + int i; + + binarysearch_initSeed(); + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < 15; ++i ) { + binarysearch_data[ i ].key = binarysearch_randomInteger(); + binarysearch_data[ i ].value = binarysearch_randomInteger(); + } +} + + +int binarysearch_return( void ) +{ + return ( binarysearch_result ); +} + + +/* + Algorithm core functions +*/ + +int binarysearch_binary_search( int x ) +{ + int fvalue, mid, up, low; + + low = 0; + up = 14; + fvalue = -1; + + _Pragma( "loopbound min 1 max 4" ) + while ( low <= up ) { + mid = ( low + up ) >> 1; + + if ( binarysearch_data[ mid ].key == x ) { + /* Item found */ + up = low - 1; + fvalue = binarysearch_data[ mid ].value; + } else + + if ( binarysearch_data[ mid ].key > x ) + /* Item not found */ + up = mid - 1; + else + low = mid + 1; + } + + return ( fvalue ); +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) binarysearch_main( void ) +{ + binarysearch_result = binarysearch_binary_search( 8 ); +} + + +int main( void ) +{ + binarysearch_init(); + binarysearch_main(); + + return ( binarysearch_return() - ( -1 ) != 0 ); +} diff --git a/targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wasm b/targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wasm new file mode 100755 index 0000000000000000000000000000000000000000..e0284ab53aa8870031fcd4dfa3f7790a987176a6 GIT binary patch literal 751 zcmaJ;O>fgc5S`g|+9XbJ2@*o$V*8XTO4K40)DziL1>y#rw`*sc+Vz*#Yl=^Y_^+ z#;&Qo_pO(H8#b}wFg|=3gKaa@u_W8?hR6P8UfwV>Y)P(LV&*XCVTWzw0bRAV=|k-s zChRxF?8n=D2jA5^{6EkI)(wnZToN$RZ96`G=-yyTsl zQo+ffQ2DwFr7Ce`+)$RKT+f3VN1uZ#)0G=0BHK)kPZr0EH}3S+QPrhiAHq9F3$>A& zpG%=DB};2IOshmkUqn*LnUhvp1c{t)k~|PeIdhaemr7=#oa?%f<*Z*un`|z>>OUC0 B%kBUG literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wat b/targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wat new file mode 100644 index 0000000..5390dd4 --- /dev/null +++ b/targets/wasm-tacle/kernel/binarysearch/generated/default/binarysearch.wat @@ -0,0 +1,132 @@ +(module $binarysearch.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $binarysearch_main (type 1) + (local i32 i32 i32 i32 i32) + i32.const 1 + i32.const 4 + call $__pragma_loopbound + i32.const 14 + local.set 0 + i32.const 0 + local.set 1 + block ;; label = @1 + loop ;; label = @2 + block ;; label = @3 + local.get 0 + local.get 1 + i32.add + i32.const 1 + i32.shr_s + local.tee 2 + i32.const 3 + i32.shl + i32.const 1040 + i32.add + local.tee 3 + i32.load + local.tee 4 + i32.const 8 + i32.ne + br_if 0 (;@3;) + local.get 3 + i32.load offset=4 + local.set 3 + br 2 (;@1;) + end + i32.const -1 + local.set 3 + local.get 1 + local.get 2 + i32.const 1 + i32.add + local.get 4 + i32.const 8 + i32.gt_s + local.tee 4 + select + local.tee 1 + local.get 2 + i32.const -1 + i32.add + local.get 0 + local.get 4 + select + local.tee 0 + i32.le_s + br_if 0 (;@2;) + end + end + i32.const 0 + local.get 3 + i32.store offset=1160) + (func $__original_main (type 2) (result i32) + (local i32 i32) + i32.const 0 + i32.const 0 + i32.store offset=1024 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + i32.const -120 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 1160 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 1164 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + call $binarysearch_main + i32.const 0 + i32.load offset=1160 + i32.const -1 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5264)) + (global (;1;) i32 (i32.const 1164)) + (global (;2;) i32 (i32.const 5264)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $binarysearch_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/default/binarysearch.c b/targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/default/binarysearch.c new file mode 100644 index 0000000..2f04ff9 --- /dev/null +++ b/targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/default/binarysearch.c @@ -0,0 +1,153 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: binarysearch + + Author: Sung-Soo Lim + + Function: binarysearch performs binary search in an array of 15 integer + elements. + This program is completely structured (no unconditional jumps, no exits + from loop bodies), and does not contain switch statements, no do-while + loops. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bs/bs.c + + Original name: bs + + Changes: No major functional changes. + + License: May be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void binarysearch_initSeed(void); +long binarysearch_randomInteger(void); +void binarysearch_init(void); +int binarysearch_return(void); +int binarysearch_binary_search(int); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +binarysearch_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +volatile int binarysearch_seed; + +struct binarysearch_DATA { + int key; + int value; +}; + +struct binarysearch_DATA binarysearch_data[15]; + +int binarysearch_result; + +/* + Initialization- and return-value-related functions +*/ + +/* + binarysearch_initSeed initializes the seed used in the "random" number + generator. +*/ +void +binarysearch_initSeed(void) { + binarysearch_seed = 0; +} + +/* + binarysearch_RandomInteger generates "random" integers between 0 and 8094. +*/ +long +binarysearch_randomInteger(void) { + binarysearch_seed = ((binarysearch_seed * 133) + 81) % 8095; + return (binarysearch_seed); +} + +void +binarysearch_init(void) { + int i; + + binarysearch_initSeed(); + + __pragma_loopbound(15, 15); + for (i = 0; i < 15; ++i) { + binarysearch_data[i].key = binarysearch_randomInteger(); + binarysearch_data[i].value = binarysearch_randomInteger(); + } +} + +int +binarysearch_return(void) { + return (binarysearch_result); +} + +/* + Algorithm core functions +*/ + +int +binarysearch_binary_search(int x) { + int fvalue, mid, up, low; + + low = 0; + up = 14; + fvalue = -1; + + __pragma_loopbound(1, 4); + while (low <= up) { + mid = (low + up) >> 1; + + if (binarysearch_data[mid].key == x) { + /* Item found */ + up = low - 1; + fvalue = binarysearch_data[mid].value; + } else + + if (binarysearch_data[mid].key > x) + /* Item not found */ + up = mid - 1; + else + low = mid + 1; + } + + return (fvalue); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +binarysearch_main(void) { + binarysearch_result = binarysearch_binary_search(8); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + binarysearch_init(); + binarysearch_main(); + + return (binarysearch_return() - (-1) != 0); +} diff --git a/targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/inline/binarysearch.c b/targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/inline/binarysearch.c new file mode 100644 index 0000000..a7a5b6a --- /dev/null +++ b/targets/wasm-tacle/kernel/binarysearch/generated/modified_sources/inline/binarysearch.c @@ -0,0 +1,163 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: binarysearch + + Author: Sung-Soo Lim + + Function: binarysearch performs binary search in an array of 15 integer + elements. + This program is completely structured (no unconditional jumps, no exits + from loop bodies), and does not contain switch statements, no do-while + loops. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bs/bs.c + + Original name: bs + + Changes: No major functional changes. + + License: May be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void binarysearch_initSeed(void); +__attribute__((always_inline)) static inline long +binarysearch_randomInteger(void); +__attribute__((always_inline)) static inline void binarysearch_init(void); +__attribute__((always_inline)) static inline int binarysearch_return(void); +__attribute__((always_inline)) static inline int +binarysearch_binary_search(int); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +binarysearch_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +volatile int binarysearch_seed; + +struct binarysearch_DATA { + int key; + int value; +}; + +struct binarysearch_DATA binarysearch_data[15]; + +int binarysearch_result; + +/* + Initialization- and return-value-related functions +*/ + +/* + binarysearch_initSeed initializes the seed used in the "random" number + generator. +*/ +__attribute__((always_inline)) static inline void +binarysearch_initSeed(void) { + binarysearch_seed = 0; +} + +/* + binarysearch_RandomInteger generates "random" integers between 0 and 8094. +*/ +__attribute__((always_inline)) static inline long +binarysearch_randomInteger(void) { + binarysearch_seed = ((binarysearch_seed * 133) + 81) % 8095; + return (binarysearch_seed); +} + +__attribute__((always_inline)) static inline void +binarysearch_init(void) { + int i; + + binarysearch_initSeed(); + + __pragma_loopbound(15, 15); + for (i = 0; i < 15; ++i) { + binarysearch_data[i].key = binarysearch_randomInteger(); + binarysearch_data[i].value = binarysearch_randomInteger(); + } +} + +__attribute__((always_inline)) static inline int +binarysearch_return(void) { + return (binarysearch_result); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline int +binarysearch_binary_search(int x) { + int fvalue, mid, up, low; + + low = 0; + up = 14; + fvalue = -1; + + __pragma_loopbound(1, 4); + while (low <= up) { + mid = (low + up) >> 1; + + if (binarysearch_data[mid].key == x) { + /* Item found */ + up = low - 1; + fvalue = binarysearch_data[mid].value; + } else + + if (binarysearch_data[mid].key > x) + /* Item not found */ + up = mid - 1; + else + low = mid + 1; + } + + return (fvalue); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +binarysearch_main(void) { + binarysearch_result = binarysearch_binary_search(8); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + binarysearch_init(); + binarysearch_main(); + + return (binarysearch_return() - (-1) != 0); +} diff --git a/targets/wasm-tacle/kernel/bitcount/CMakeLists.txt b/targets/wasm-tacle/kernel/bitcount/CMakeLists.txt new file mode 100644 index 0000000..6562a67 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/CMakeLists.txt @@ -0,0 +1,29 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(bitcount) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/bitcount.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/bitcount.c" + "generated/modified_sources/default/bitcnt_1.c" + "generated/modified_sources/default/bitcnt_2.c" + "generated/modified_sources/default/bitcnt_3.c" + "generated/modified_sources/default/bitcnt_4.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/bitcount/ChangeLog.txt b/targets/wasm-tacle/kernel/bitcount/ChangeLog.txt new file mode 100755 index 0000000..9008a28 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/ChangeLog.txt @@ -0,0 +1,81 @@ +File: bitcnt_1.c +Original provenience: + +2017-04-18: +- Annotated bitcount_main as entry-point for timing analysis + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Changed function bit_count to bitcount_bit_count +- Applied Code Style + +File: bitcnt_2.c +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Changed function bitcount to bitcount_bitcount +- Applied Code Style + +File: bitcnt_3.c +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Changed function {name} to bitcount_{name} +- Changed global variable bits to bitcount_bits +- Made int i volatile to prevent compiler optimalizations +- Added the bitcount_init3() function to initialize bitcount_bits during the init fase +- Applied Code Style + + +File: bitcnt_4.c +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Changed function {name} to bitcount_{name} +- Changed global variable bits to bitcount_bits +- Made int i volatile to prevent compiler optimalizations +- Added the bitcount_init4() function to initialize bitcount_bits during the init fase +- Applied Code Style + +File: bitcount.c +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Changed global variable _randseed to bitcount_randseed +- Changed function {name} to bitcount_{name} +- Changed external functions to new name +- Moved local variables of main to global variables +- Added bitcount_init function to initialize global variables +- Added bitcount_main function for the calculations +- Added bitcount_main function for the return value +- Applied Code Style + + + +File: bitops.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed unused defines +- Removed typedef unsigned int size_t ==> no references +- Replaced CHAR_BIT with value 8 and removed the define +- Applied Code Style + + +File: sniptype.h +Original provenience: + +2015-10-12: +- Removed file, no usage of the definations and typedefs + diff --git a/targets/wasm-tacle/kernel/bitcount/LICENSE b/targets/wasm-tacle/kernel/bitcount/LICENSE new file mode 100755 index 0000000..59bf08a --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/LICENSE @@ -0,0 +1,3 @@ +From http://www.snippets.org/. + +This code is FREE with no restrictions. diff --git a/targets/wasm-tacle/kernel/bitcount/bitcnt_1.c b/targets/wasm-tacle/kernel/bitcount/bitcnt_1.c new file mode 100755 index 0000000..95abfde --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/bitcnt_1.c @@ -0,0 +1,36 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_1.c + + Author: Ratko Tomic + + Function: Test program for bit counting functions + + Source: http://www.snippets.org/. + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +int bitcount_bit_count( long x ) +{ + int n = 0; + /* + ** The loop will execute once for each bit of x set, this is in average + ** twice as fast as the shift/test method. + */ + if ( x ) { + _Pragma( "loopbound min 3 max 8" ) + do { + n++; + } while ( 0 != ( x = x & ( x - 1 ) ) ) ; + } + return ( n ); +} diff --git a/targets/wasm-tacle/kernel/bitcount/bitcnt_2.c b/targets/wasm-tacle/kernel/bitcount/bitcnt_2.c new file mode 100755 index 0000000..e11c649 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/bitcnt_2.c @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_2.c + + Author: Bob Stout & Auke Reitsma + + Function: Test program for bit counting functions + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + + +#include "bitops.h" + +int bitcount_bitcount( long i ) +{ + i = ( ( i & 0xAAAAAAAAL ) >> 1 ) + ( i & 0x55555555L ); + i = ( ( i & 0xCCCCCCCCL ) >> 2 ) + ( i & 0x33333333L ); + i = ( ( i & 0xF0F0F0F0L ) >> 4 ) + ( i & 0x0F0F0F0FL ); + i = ( ( i & 0xFF00FF00L ) >> 8 ) + ( i & 0x00FF00FFL ); + i = ( ( i & 0xFFFF0000L ) >> 16 ) + ( i & 0x0000FFFFL ); + return ( int )i; +} diff --git a/targets/wasm-tacle/kernel/bitcount/bitcnt_3.c b/targets/wasm-tacle/kernel/bitcount/bitcnt_3.c new file mode 100755 index 0000000..5727a17 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/bitcnt_3.c @@ -0,0 +1,106 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_3.c + + Author: Bob Stout & Auke Reitsma + + Function: Bit counting functions using table lookup + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + + +#include "bitops.h" + +static char bitcount_bits[ 256 ]; + +/* +** Count bits in each nybble +** +** Note: Only the first 16 table entries are used, the rest could be +** omitted. +*/ + +void bitcount_init3( void ) +{ + int volatile i = 0; + char bitcount_bits_tmp[ 256 ] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + + for ( i = 0; i < 256; i++ ) + bitcount_bits[ i ] = bitcount_bits_tmp[ i ]; +} + +int bitcount_ntbl_bitcount( long int x ) +{ + return + bitcount_bits[ ( int ) ( x & 0x0000000FUL ) ] + + bitcount_bits[ ( int )( ( x & 0x000000F0UL ) >> 4 ) ] + + bitcount_bits[ ( int )( ( x & 0x00000F00UL ) >> 8 ) ] + + bitcount_bits[ ( int )( ( x & 0x0000F000UL ) >> 12 ) ] + + bitcount_bits[ ( int )( ( x & 0x000F0000UL ) >> 16 ) ] + + bitcount_bits[ ( int )( ( x & 0x00F00000UL ) >> 20 ) ] + + bitcount_bits[ ( int )( ( x & 0x0F000000UL ) >> 24 ) ] + + bitcount_bits[ ( int )( ( x & 0xF0000000UL ) >> 28 ) ]; +} + +/* +** Count bits in each byte +** +** by Bruce Wedding, works best on Watcom & Borland +*/ + +int bitcount_BW_btbl_bitcount( long int x ) +{ + union { + unsigned char ch[ 4 ]; + long y; + } U; + + U.y = x; + + return bitcount_bits[ U.ch[ 0 ] ] + bitcount_bits[ U.ch[ 1 ] ] + + bitcount_bits[ U.ch[ 3 ] ] + bitcount_bits[ U.ch[ 2 ] ]; +} + +/* +** Count bits in each byte +** +** by Auke Reitsma, works best on Microsoft, Symantec, and others +*/ + +int bitcount_AR_btbl_bitcount( long int x ) +{ + unsigned char *ptr = ( unsigned char * ) & x ; + int accu ; + + accu = bitcount_bits[ *ptr++ ]; + accu += bitcount_bits[ *ptr++ ]; + accu += bitcount_bits[ *ptr++ ]; + accu += bitcount_bits[ *ptr ]; + return accu; +} diff --git a/targets/wasm-tacle/kernel/bitcount/bitcnt_4.c b/targets/wasm-tacle/kernel/bitcount/bitcnt_4.c new file mode 100755 index 0000000..74f57df --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/bitcnt_4.c @@ -0,0 +1,86 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_4.c + + Author: Bob Stout + + Function: Recursive bit counting functions using table lookup + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + + +#include "bitops.h" /* from Snippets */ + +static char bitcount_bits[ 256 ]; + +/* +** Count bits in each nybble +** +** Note: Only the first 16 table entries are used, the rest could be +** omitted. +*/ + +void bitcount_init4( void ) +{ + int volatile i = 0; + char bitcount_bits_tmp[ 256 ] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + + for ( i = 0; i < 256; i++ ) + bitcount_bits[ i ] = bitcount_bits_tmp[ i ]; +} + +int bitcount_ntbl_bitcnt( unsigned long x ) +{ + + int cnt = bitcount_bits[ ( int )( x & 0x0000000FL ) ]; + + if ( 0L != ( x >>= 4 ) ) + cnt += bitcount_ntbl_bitcnt( x ); + + return cnt; +} + +/* +** Count bits in each byte +*/ + +int bitcount_btbl_bitcnt( unsigned long x ) +{ +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + int idx = sizeof(x) - 1; +#else + int idx = 0; +#endif + int cnt = bitcount_bits[( ( char * ) & x )[idx] & 0xFF]; + + if ( 0L != ( x >>= 8 ) ) + cnt += bitcount_btbl_bitcnt( x ); + + return cnt; +} diff --git a/targets/wasm-tacle/kernel/bitcount/bitcount.c b/targets/wasm-tacle/kernel/bitcount/bitcount.c new file mode 100755 index 0000000..dfae600 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/bitcount.c @@ -0,0 +1,146 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcount.c + + Author: Bob Stout & Auke Reitsma + + Function: test program for bit counting functions + + Source: www.snippest.com + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + + +#include "bitops.h" + +#define FUNCS 8 + +/* + Global variables +*/ + +unsigned long bitcount_randseed; +int bitcount_res; +unsigned long bitcount_seed; +unsigned long bitcount_n; +unsigned int bitcount_iterations; + +/* + First declaration of the functions +*/ +int bitcount_bit_shifter( long int x ); +unsigned long bitcount_random( void ); +void bitcount_main(); +int bitcount_return(); +void bitcount_init(); +int main( void ); + + +int bitcount_bit_shifter( long int x ) +{ + int n; + unsigned int i; + + _Pragma( "loopbound min 31 max 31" ) + for ( i = n = 0; x && ( i < ( sizeof( long ) * 8 ) ); ++i, x >>= 1 ) + n += ( int )( x & 1L ); + return n; +} + +int bitcount_return() +{ + return ( bitcount_n + ( -1095 ) ) != 0; +} + +void bitcount_init() +{ + bitcount_randseed = 1; + bitcount_n = 0; + bitcount_iterations = 10; + + bitcount_init3(); + bitcount_init4(); +} + +unsigned long bitcount_random( void ) +{ + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = bitcount_randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if ( t <= 0 ) + t += 0x7fffffff; + bitcount_randseed = t; + return ( t ); +} + +void _Pragma( "entrypoint" ) bitcount_main() +{ + unsigned int i, j; + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < FUNCS; i++ ) { + _Pragma( "loopbound min 10 max 10" ) + for ( j = 0, bitcount_seed = bitcount_random(); j < bitcount_iterations; + j++, bitcount_seed += 13 ) { + // The original calls were done by function pointers + switch ( i ) { + case 0: + bitcount_res = bitcount_bit_count( bitcount_seed ); + break; + case 1: + bitcount_res = bitcount_bitcount( bitcount_seed ); + break; + case 2: { + _Pragma( "marker call_ntbl" ) + bitcount_res = bitcount_ntbl_bitcnt( bitcount_seed ); + break; + } + case 3: { + _Pragma( "marker call_btbl" ) + bitcount_res = bitcount_btbl_bitcnt( bitcount_seed ); + break; + } + case 4: + bitcount_res = bitcount_ntbl_bitcount( bitcount_seed ); + break; + case 5: + bitcount_res = bitcount_BW_btbl_bitcount( bitcount_seed ); + break; + case 6: + bitcount_res = bitcount_AR_btbl_bitcount( bitcount_seed ); + break; + case 7: + bitcount_res = bitcount_bit_shifter( bitcount_seed ); + break; + default: + break; + } + bitcount_n += bitcount_res; + } + } + _Pragma( "flowrestriction 1*ntbl_bitcount <= 8*call_ntbl" ) + _Pragma( "flowrestriction 1*btbl_bitcount <= 4*call_btbl" ) +} + +int main( void ) +{ + bitcount_init(); + bitcount_main(); + + return ( bitcount_return() ); +} diff --git a/targets/wasm-tacle/kernel/bitcount/bitops.h b/targets/wasm-tacle/kernel/bitcount/bitops.h new file mode 100755 index 0000000..edf4528 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/bitops.h @@ -0,0 +1,50 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitops.h + + Author: Bob Stout & Auke Reitsma + + Function: test program for bit counting functions + + Source: + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#ifndef BITOPS__H +#define BITOPS__H + +/* +** bitcount_1.c +*/ + +int bitcount_bit_count( long x ); + +/* +** bitcount_2.c +*/ + +int bitcount_bitcount( long i ); + +/* +** bitcount_3.c +*/ +void bitcount_init3( void ); +int bitcount_ntbl_bitcount( long int x ); +int bitcount_BW_btbl_bitcount( long int x ); +int bitcount_AR_btbl_bitcount( long int x ); + +/* +** bitcount_4.c +*/ +void bitcount_init4( void ); +int bitcount_ntbl_bitcnt( unsigned long x ); +int bitcount_btbl_bitcnt( unsigned long x ); + +#endif /* BITOPS__H */ diff --git a/targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wasm b/targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wasm new file mode 100755 index 0000000000000000000000000000000000000000..d7ddd1e26a6369b9ce0fd8c5d00a9284ecce1566 GIT binary patch literal 2519 zcmd^B&u`;Y5T1F@zZxe^D67>Xkm{66QEAnMs<4Pd-b!e<%MF3xfaE%<8=N{$YCD0P z62Zb2SS>4YLISBbq?I`FN5FyW{tJ8Je<(9{oHh+;S8&9w?fJfW^SzmQwqL+Yx(IYs zt%Fe*L`PfOsDTE6E84yok6|C^AIJMR#<94Hmh1Louif>Q!d|c6>0{c5p{`x#`AKF>U7&4gF3Bc*KON;-!Qsb zPF-{K3fL6oh+Xk8ub9i6ut~wYxuvMy^=U^c)UIiF97!5$a@LnU)^dPJP}VI*Hz`sT zEhMwFo41e^r{cA*xTxAU+4Xb2&N5KHS-0#Rq^Ggr0M}TxmAtUpn3vh1sz8l94jix1 zFlvfVDN-()hoXC(~Pcayi7;u|xy zA%WH7j(vz?{4(V_A?}DAR7{y%eB)f#MOmHUoeEHb3^+mNPPwo2n5hXZD|9vi-U7-r zcOtc$M0ngp+~)4t-y``rx9agU_EjD~2dQjj&5vNJyhzm+sVj@rwMFWs;rZ+x`wnM7 zGoImmQgfJ7Af>!uN}4gvKR@Q#r4~Xj%m3>Yc~GnfJ%G=!A|Ig~)7-osStONKM}Ff( zgDa$0fB`?3`MU>H^1F3OK5a+4@Cu5iY?!rZTa|*ySA7KxV&M@s_XXR zpdCbBm=W4aF@Z~ln@y!Zcah5|V|hjeQINiFUY+46ZH641jk8`TEcfPzZu6pR>D;B> zn|GDw)pzVGGnJWol$OugnQ)YvD+p9nl6tKpH~Vek$4eyyb1UxguNSzn)F*4u^5X={ zWVZYy@eekeBP@T=q{a@MR_I0TmFqXQu5Z2JtiQHB$mpF{V6U2baobPbL*GjWv7cxg yrS2e1gP|7={EcdNkb2F~-)x7yrWYm~)!0AuV?S#7o9U?UCmU80w4+V`v-B_UG6zKf literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wat b/targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wat new file mode 100644 index 0000000..63715d8 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/default/bitcount.wat @@ -0,0 +1,584 @@ +(module $bitcount.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (type (;3;) (func (param i32) (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $bitcount_main (type 1) + (local i32 i32 i32 i32 i32 i32) + i32.const 8 + i32.const 8 + call $__pragma_loopbound + i32.const 0 + local.set 0 + loop ;; label = @1 + i32.const 10 + i32.const 10 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1540 + local.tee 1 + i32.const 127773 + i32.div_s + local.tee 2 + i32.const -2836 + i32.mul + local.get 1 + local.get 2 + i32.const 127773 + i32.mul + i32.sub + i32.const 16807 + i32.mul + i32.add + local.tee 1 + i32.const 2147483647 + i32.add + local.get 1 + local.get 1 + i32.const 1 + i32.lt_s + select + local.tee 1 + i32.store offset=1548 + i32.const 0 + local.get 1 + i32.store offset=1540 + block ;; label = @2 + i32.const 0 + i32.load offset=1544 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + local.set 3 + loop ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + local.get 0 + br_table 0 (;@12;) 1 (;@11;) 2 (;@10;) 3 (;@9;) 4 (;@8;) 5 (;@7;) 6 (;@6;) 7 (;@5;) 0 (;@12;) + end + local.get 1 + call $bitcount_bit_count + local.set 2 + br 7 (;@4;) + end + local.get 1 + call $bitcount_bitcount + local.set 2 + br 6 (;@4;) + end + local.get 1 + call $bitcount_ntbl_bitcnt + local.set 2 + br 5 (;@4;) + end + local.get 1 + call $bitcount_btbl_bitcnt + local.set 2 + br 4 (;@4;) + end + local.get 1 + call $bitcount_ntbl_bitcount + local.set 2 + br 3 (;@4;) + end + local.get 1 + call $bitcount_BW_btbl_bitcount + local.set 2 + br 2 (;@4;) + end + local.get 1 + call $bitcount_AR_btbl_bitcount + local.set 2 + br 1 (;@4;) + end + i32.const 31 + i32.const 31 + call $__pragma_loopbound + block ;; label = @5 + local.get 1 + br_if 0 (;@5;) + i32.const 0 + local.set 2 + br 1 (;@4;) + end + i32.const 0 + local.set 4 + i32.const 0 + local.set 2 + loop ;; label = @5 + local.get 1 + i32.const 1 + i32.and + local.get 2 + i32.add + local.set 2 + local.get 1 + i32.const 2 + i32.lt_u + br_if 1 (;@4;) + local.get 1 + i32.const 1 + i32.shr_s + local.set 1 + local.get 4 + i32.const 31 + i32.lt_u + local.set 5 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 5 + br_if 0 (;@5;) + end + end + i32.const 0 + local.get 2 + i32.store offset=1552 + i32.const 0 + i32.const 0 + i32.load offset=1536 + local.get 2 + i32.add + i32.store offset=1536 + i32.const 0 + i32.const 0 + i32.load offset=1548 + i32.const 13 + i32.add + local.tee 1 + i32.store offset=1548 + local.get 3 + i32.const 1 + i32.add + local.tee 3 + i32.const 0 + i32.load offset=1544 + i32.lt_u + br_if 0 (;@3;) + end + end + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 8 + i32.ne + br_if 0 (;@1;) + end) + (func $__original_main (type 2) (result i32) + i32.const 0 + i32.const 1 + i32.store offset=1540 + i32.const 0 + i32.const 10 + i32.store offset=1544 + i32.const 0 + i32.const 0 + i32.store offset=1536 + call $bitcount_init3 + call $bitcount_init4 + call $bitcount_main + i32.const 0 + i32.load offset=1536 + i32.const 1095 + i32.ne) + (func $bitcount_bit_count (type 3) (param i32) (result i32) + (local i32) + block ;; label = @1 + local.get 0 + br_if 0 (;@1;) + i32.const 0 + return + end + i32.const 3 + i32.const 8 + call $__pragma_loopbound + i32.const 0 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.get 0 + i32.and + local.tee 0 + br_if 0 (;@1;) + end + local.get 1) + (func $bitcount_bitcount (type 3) (param i32) (result i32) + local.get 0 + i32.const 1 + i32.shr_u + i32.const 1431655765 + i32.and + local.get 0 + i32.const 1431655765 + i32.and + i32.add + local.tee 0 + i32.const 2 + i32.shr_u + i32.const 858993459 + i32.and + local.get 0 + i32.const 858993459 + i32.and + i32.add + local.tee 0 + i32.const 4 + i32.shr_u + i32.const 117901063 + i32.and + local.get 0 + i32.const 117901063 + i32.and + i32.add + local.tee 0 + i32.const 8 + i32.shr_u + i32.const 983055 + i32.and + local.get 0 + i32.const 983055 + i32.and + i32.add + local.tee 0 + i32.const 16 + i32.shr_u + local.get 0 + i32.const 31 + i32.and + i32.add) + (func $bitcount_init3 (type 1) + (local i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + i32.const 0 + i32.store offset=12 + local.get 0 + i32.const 0 + i32.store offset=12 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.const 255 + i32.gt_s + br_if 0 (;@1;) + loop ;; label = @2 + local.get 0 + i32.load offset=12 + local.set 1 + local.get 0 + i32.load offset=12 + i32.const 1568 + i32.add + local.get 1 + i32.const 1024 + i32.add + i32.load8_u + i32.store8 + local.get 0 + local.get 0 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + local.get 0 + i32.load offset=12 + i32.const 256 + i32.lt_s + br_if 0 (;@2;) + end + end) + (func $bitcount_ntbl_bitcount (type 3) (param i32) (result i32) + local.get 0 + i32.const 4 + i32.shr_u + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + local.get 0 + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 8 + i32.shr_u + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 12 + i32.shr_u + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 16 + i32.shr_u + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 20 + i32.shr_u + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 24 + i32.shr_u + i32.const 15 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 28 + i32.shr_u + i32.const 1568 + i32.add + i32.load8_s + i32.add) + (func $bitcount_BW_btbl_bitcount (type 3) (param i32) (result i32) + local.get 0 + i32.const 8 + i32.shr_u + i32.const 255 + i32.and + i32.const 1568 + i32.add + i32.load8_s + local.get 0 + i32.const 255 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 24 + i32.shr_u + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 16 + i32.shr_u + i32.const 255 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add) + (func $bitcount_AR_btbl_bitcount (type 3) (param i32) (result i32) + local.get 0 + i32.const 8 + i32.shr_u + i32.const 255 + i32.and + i32.const 1568 + i32.add + i32.load8_s + local.get 0 + i32.const 255 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 16 + i32.shr_u + i32.const 255 + i32.and + i32.const 1568 + i32.add + i32.load8_s + i32.add + local.get 0 + i32.const 24 + i32.shr_u + i32.const 1568 + i32.add + i32.load8_s + i32.add) + (func $bitcount_init4 (type 1) + (local i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + i32.const 0 + i32.store offset=12 + local.get 0 + i32.const 0 + i32.store offset=12 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.const 255 + i32.gt_s + br_if 0 (;@1;) + loop ;; label = @2 + local.get 0 + i32.load offset=12 + local.set 1 + local.get 0 + i32.load offset=12 + i32.const 1824 + i32.add + local.get 1 + i32.const 1280 + i32.add + i32.load8_u + i32.store8 + local.get 0 + local.get 0 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + local.get 0 + i32.load offset=12 + i32.const 256 + i32.lt_s + br_if 0 (;@2;) + end + end) + (func $bitcount_ntbl_bitcnt (type 3) (param i32) (result i32) + (local i32 i32 i32) + local.get 0 + i32.const 15 + i32.and + i32.const 1824 + i32.add + i32.load8_s + local.set 1 + i32.const 0 + local.set 2 + block ;; label = @1 + local.get 0 + i32.const 16 + i32.lt_u + br_if 0 (;@1;) + i32.const 0 + local.set 2 + loop ;; label = @2 + local.get 1 + local.get 2 + i32.add + local.set 2 + local.get 0 + i32.const 255 + i32.gt_u + local.set 3 + local.get 0 + i32.const 4 + i32.shr_u + local.tee 0 + i32.const 15 + i32.and + i32.const 1824 + i32.add + i32.load8_s + local.set 1 + local.get 3 + br_if 0 (;@2;) + end + end + local.get 1 + local.get 2 + i32.add) + (func $bitcount_btbl_bitcnt (type 3) (param i32) (result i32) + (local i32 i32 i32) + local.get 0 + i32.const 255 + i32.and + i32.const 1824 + i32.add + i32.load8_s + local.set 1 + i32.const 0 + local.set 2 + block ;; label = @1 + local.get 0 + i32.const 256 + i32.lt_u + br_if 0 (;@1;) + i32.const 0 + local.set 2 + loop ;; label = @2 + local.get 1 + local.get 2 + i32.add + local.set 2 + local.get 0 + i32.const 65535 + i32.gt_u + local.set 3 + local.get 0 + i32.const 8 + i32.shr_u + local.tee 0 + i32.const 255 + i32.and + i32.const 1824 + i32.add + i32.load8_s + local.set 1 + local.get 3 + br_if 0 (;@2;) + end + end + local.get 1 + local.get 2 + i32.add) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 6176)) + (global (;1;) i32 (i32.const 2080)) + (global (;2;) i32 (i32.const 6176)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $bitcount_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\00\01\01\02\01\02\02\03\01\02\02\03\02\03\03\04\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\04\05\05\06\05\06\06\07\05\06\06\07\06\07\07\08\00\01\01\02\01\02\02\03\01\02\02\03\02\03\03\04\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\01\02\02\03\02\03\03\04\02\03\03\04\03\04\04\05\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\02\03\03\04\03\04\04\05\03\04\04\05\04\05\05\06\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\03\04\04\05\04\05\05\06\04\05\05\06\05\06\06\07\04\05\05\06\05\06\06\07\05\06\06\07\06\07\07\08")) diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_1.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_1.c new file mode 100644 index 0000000..8cda3e0 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_1.c @@ -0,0 +1,41 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_1.c + + Author: Ratko Tomic + + Function: Test program for bit counting functions + + Source: http://www.snippets.org/. + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int +bitcount_bit_count(long x) { + int n = 0; + /* + ** The loop will execute once for each bit of x set, this is in average + ** twice as fast as the shift/test method. + */ + if (x) { + __pragma_loopbound(3, 8); + do { + n++; + } while (0 != (x = x & (x - 1))); + } + return (n); +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_2.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_2.c new file mode 100644 index 0000000..1e727c8 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_2.c @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_2.c + + Author: Bob Stout & Auke Reitsma + + Function: Test program for bit counting functions + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +int +bitcount_bitcount(long i) { + i = ((i & 0xAAAAAAAAL) >> 1) + (i & 0x55555555L); + i = ((i & 0xCCCCCCCCL) >> 2) + (i & 0x33333333L); + i = ((i & 0xF0F0F0F0L) >> 4) + (i & 0x0F0F0F0FL); + i = ((i & 0xFF00FF00L) >> 8) + (i & 0x00FF00FFL); + i = ((i & 0xFFFF0000L) >> 16) + (i & 0x0000FFFFL); + return (int) i; +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_3.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_3.c new file mode 100644 index 0000000..3066236 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_3.c @@ -0,0 +1,98 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_3.c + + Author: Bob Stout & Auke Reitsma + + Function: Bit counting functions using table lookup + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +static char bitcount_bits[256]; + +/* +** Count bits in each nybble +** +** Note: Only the first 16 table entries are used, the rest could be +** omitted. +*/ + +void +bitcount_init3(void) { + int volatile i = 0; + char bitcount_bits_tmp[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, + 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + + for (i = 0; i < 256; i++) + bitcount_bits[i] = bitcount_bits_tmp[i]; +} + +int +bitcount_ntbl_bitcount(long int x) { + return bitcount_bits[(int) (x & 0x0000000FUL)] + + bitcount_bits[(int) ((x & 0x000000F0UL) >> 4)] + + bitcount_bits[(int) ((x & 0x00000F00UL) >> 8)] + + bitcount_bits[(int) ((x & 0x0000F000UL) >> 12)] + + bitcount_bits[(int) ((x & 0x000F0000UL) >> 16)] + + bitcount_bits[(int) ((x & 0x00F00000UL) >> 20)] + + bitcount_bits[(int) ((x & 0x0F000000UL) >> 24)] + + bitcount_bits[(int) ((x & 0xF0000000UL) >> 28)]; +} + +/* +** Count bits in each byte +** +** by Bruce Wedding, works best on Watcom & Borland +*/ + +int +bitcount_BW_btbl_bitcount(long int x) { + union { + unsigned char ch[4]; + long y; + } U; + + U.y = x; + + return bitcount_bits[U.ch[0]] + bitcount_bits[U.ch[1]] + + bitcount_bits[U.ch[3]] + bitcount_bits[U.ch[2]]; +} + +/* +** Count bits in each byte +** +** by Auke Reitsma, works best on Microsoft, Symantec, and others +*/ + +int +bitcount_AR_btbl_bitcount(long int x) { + unsigned char *ptr = (unsigned char *) &x; + int accu; + + accu = bitcount_bits[*ptr++]; + accu += bitcount_bits[*ptr++]; + accu += bitcount_bits[*ptr++]; + accu += bitcount_bits[*ptr]; + return accu; +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_4.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_4.c new file mode 100644 index 0000000..55948c7 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcnt_4.c @@ -0,0 +1,79 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_4.c + + Author: Bob Stout + + Function: Recursive bit counting functions using table lookup + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" /* from Snippets */ + +static char bitcount_bits[256]; + +/* +** Count bits in each nybble +** +** Note: Only the first 16 table entries are used, the rest could be +** omitted. +*/ + +void +bitcount_init4(void) { + int volatile i = 0; + char bitcount_bits_tmp[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, + 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + + for (i = 0; i < 256; i++) + bitcount_bits[i] = bitcount_bits_tmp[i]; +} + +int +bitcount_ntbl_bitcnt(unsigned long x) { + + int cnt = bitcount_bits[(int) (x & 0x0000000FL)]; + + if (0L != (x >>= 4)) + cnt += bitcount_ntbl_bitcnt(x); + + return cnt; +} + +/* +** Count bits in each byte +*/ + +int +bitcount_btbl_bitcnt(unsigned long x) { +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + int idx = sizeof(x) - 1; +#else + int idx = 0; +#endif + int cnt = bitcount_bits[((char *) &x)[idx] & 0xFF]; + + if (0L != (x >>= 8)) + cnt += bitcount_btbl_bitcnt(x); + + return cnt; +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcount.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcount.c new file mode 100644 index 0000000..1d7e36f --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitcount.c @@ -0,0 +1,150 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcount.c + + Author: Bob Stout & Auke Reitsma + + Function: test program for bit counting functions + + Source: www.snippest.com + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define FUNCS 8 + +/* + Global variables +*/ + +unsigned long bitcount_randseed; +int bitcount_res; +unsigned long bitcount_seed; +unsigned long bitcount_n; +unsigned int bitcount_iterations; + +/* + First declaration of the functions +*/ +int bitcount_bit_shifter(long int x); +unsigned long bitcount_random(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bitcount_main(); +int bitcount_return(); +void bitcount_init(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +int +bitcount_bit_shifter(long int x) { + int n; + unsigned int i; + + __pragma_loopbound(31, 31); + for (i = n = 0; x && (i < (sizeof(long) * 8)); ++i, x >>= 1) + n += (int) (x & 1L); + return n; +} + +int +bitcount_return() { + return (bitcount_n + (-1095)) != 0; +} + +void +bitcount_init() { + bitcount_randseed = 1; + bitcount_n = 0; + bitcount_iterations = 10; + + bitcount_init3(); + bitcount_init4(); +} + +unsigned long +bitcount_random(void) { + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = bitcount_randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if (t <= 0) + t += 0x7fffffff; + bitcount_randseed = t; + return (t); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bitcount_main() { + unsigned int i, j; + __pragma_loopbound(8, 8); + for (i = 0; i < FUNCS; i++) { + __pragma_loopbound(10, 10); + for (j = 0, bitcount_seed = bitcount_random(); j < bitcount_iterations; + j++, bitcount_seed += 13) { + // The original calls were done by function pointers + switch (i) { + case 0: + bitcount_res = bitcount_bit_count(bitcount_seed); + break; + case 1: + bitcount_res = bitcount_bitcount(bitcount_seed); + break; + case 2: { + _Pragma("marker call_ntbl") bitcount_res = + bitcount_ntbl_bitcnt(bitcount_seed); + break; + } + case 3: { + _Pragma("marker call_btbl") bitcount_res = + bitcount_btbl_bitcnt(bitcount_seed); + break; + } + case 4: + bitcount_res = bitcount_ntbl_bitcount(bitcount_seed); + break; + case 5: + bitcount_res = bitcount_BW_btbl_bitcount(bitcount_seed); + break; + case 6: + bitcount_res = bitcount_AR_btbl_bitcount(bitcount_seed); + break; + case 7: + bitcount_res = bitcount_bit_shifter(bitcount_seed); + break; + default: + break; + } + bitcount_n += bitcount_res; + } + } + _Pragma("flowrestriction 1*ntbl_bitcount <= 8*call_ntbl") + _Pragma("flowrestriction 1*btbl_bitcount <= 4*call_btbl") +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + bitcount_init(); + bitcount_main(); + + return (bitcount_return()); +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitops.h b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitops.h new file mode 100644 index 0000000..a6fdb40 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/default/bitops.h @@ -0,0 +1,50 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitops.h + + Author: Bob Stout & Auke Reitsma + + Function: test program for bit counting functions + + Source: + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#ifndef BITOPS__H +#define BITOPS__H + +/* +** bitcount_1.c +*/ + +int bitcount_bit_count(long x); + +/* +** bitcount_2.c +*/ + +int bitcount_bitcount(long i); + +/* +** bitcount_3.c +*/ +void bitcount_init3(void); +int bitcount_ntbl_bitcount(long int x); +int bitcount_BW_btbl_bitcount(long int x); +int bitcount_AR_btbl_bitcount(long int x); + +/* +** bitcount_4.c +*/ +void bitcount_init4(void); +int bitcount_ntbl_bitcnt(unsigned long x); +int bitcount_btbl_bitcnt(unsigned long x); + +#endif /* BITOPS__H */ diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_1.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_1.c new file mode 100644 index 0000000..f939edb --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_1.c @@ -0,0 +1,41 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_1.c + + Author: Ratko Tomic + + Function: Test program for bit counting functions + + Source: http://www.snippets.org/. + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int +bitcount_bit_count(long x) { + int n = 0; + /* + ** The loop will execute once for each bit of x set, this is in average + ** twice as fast as the shift/test method. + */ + if (x) { + __pragma_loopbound(3, 8); + do { + n++; + } while (0 != (x = x & (x - 1))); + } + return (n); +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_2.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_2.c new file mode 100644 index 0000000..0e6da2a --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_2.c @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_2.c + + Author: Bob Stout & Auke Reitsma + + Function: Test program for bit counting functions + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +__attribute__((always_inline)) static inline int +bitcount_bitcount(long i) { + i = ((i & 0xAAAAAAAAL) >> 1) + (i & 0x55555555L); + i = ((i & 0xCCCCCCCCL) >> 2) + (i & 0x33333333L); + i = ((i & 0xF0F0F0F0L) >> 4) + (i & 0x0F0F0F0FL); + i = ((i & 0xFF00FF00L) >> 8) + (i & 0x00FF00FFL); + i = ((i & 0xFFFF0000L) >> 16) + (i & 0x0000FFFFL); + return (int) i; +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_3.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_3.c new file mode 100644 index 0000000..ab4334a --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_3.c @@ -0,0 +1,98 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_3.c + + Author: Bob Stout & Auke Reitsma + + Function: Bit counting functions using table lookup + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +static char bitcount_bits[256]; + +/* +** Count bits in each nybble +** +** Note: Only the first 16 table entries are used, the rest could be +** omitted. +*/ + +__attribute__((always_inline)) static inline void +bitcount_init3(void) { + int volatile i = 0; + char bitcount_bits_tmp[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, + 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + + for (i = 0; i < 256; i++) + bitcount_bits[i] = bitcount_bits_tmp[i]; +} + +__attribute__((always_inline)) static inline int +bitcount_ntbl_bitcount(long int x) { + return bitcount_bits[(int) (x & 0x0000000FUL)] + + bitcount_bits[(int) ((x & 0x000000F0UL) >> 4)] + + bitcount_bits[(int) ((x & 0x00000F00UL) >> 8)] + + bitcount_bits[(int) ((x & 0x0000F000UL) >> 12)] + + bitcount_bits[(int) ((x & 0x000F0000UL) >> 16)] + + bitcount_bits[(int) ((x & 0x00F00000UL) >> 20)] + + bitcount_bits[(int) ((x & 0x0F000000UL) >> 24)] + + bitcount_bits[(int) ((x & 0xF0000000UL) >> 28)]; +} + +/* +** Count bits in each byte +** +** by Bruce Wedding, works best on Watcom & Borland +*/ + +__attribute__((always_inline)) static inline int +bitcount_BW_btbl_bitcount(long int x) { + union { + unsigned char ch[4]; + long y; + } U; + + U.y = x; + + return bitcount_bits[U.ch[0]] + bitcount_bits[U.ch[1]] + + bitcount_bits[U.ch[3]] + bitcount_bits[U.ch[2]]; +} + +/* +** Count bits in each byte +** +** by Auke Reitsma, works best on Microsoft, Symantec, and others +*/ + +__attribute__((always_inline)) static inline int +bitcount_AR_btbl_bitcount(long int x) { + unsigned char *ptr = (unsigned char *) &x; + int accu; + + accu = bitcount_bits[*ptr++]; + accu += bitcount_bits[*ptr++]; + accu += bitcount_bits[*ptr++]; + accu += bitcount_bits[*ptr]; + return accu; +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_4.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_4.c new file mode 100644 index 0000000..c619d3c --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcnt_4.c @@ -0,0 +1,79 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcnt_4.c + + Author: Bob Stout + + Function: Recursive bit counting functions using table lookup + + Source: http://www.snippets.org/ + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" /* from Snippets */ + +static char bitcount_bits[256]; + +/* +** Count bits in each nybble +** +** Note: Only the first 16 table entries are used, the rest could be +** omitted. +*/ + +__attribute__((always_inline)) static inline void +bitcount_init4(void) { + int volatile i = 0; + char bitcount_bits_tmp[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, + 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + + for (i = 0; i < 256; i++) + bitcount_bits[i] = bitcount_bits_tmp[i]; +} + +__attribute__((always_inline)) static inline int +bitcount_ntbl_bitcnt(unsigned long x) { + + int cnt = bitcount_bits[(int) (x & 0x0000000FL)]; + + if (0L != (x >>= 4)) + cnt += bitcount_ntbl_bitcnt(x); + + return cnt; +} + +/* +** Count bits in each byte +*/ + +__attribute__((always_inline)) static inline int +bitcount_btbl_bitcnt(unsigned long x) { +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + int idx = sizeof(x) - 1; +#else + int idx = 0; +#endif + int cnt = bitcount_bits[((char *) &x)[idx] & 0xFF]; + + if (0L != (x >>= 8)) + cnt += bitcount_btbl_bitcnt(x); + + return cnt; +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcount.c b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcount.c new file mode 100644 index 0000000..6aa18c5 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitcount.c @@ -0,0 +1,164 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitcount.c + + Author: Bob Stout & Auke Reitsma + + Function: test program for bit counting functions + + Source: www.snippest.com + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#include "bitops.h" + +// Wasm loop bounds + + +#include "bitcnt_1.c" +#include "bitcnt_2.c" +#include "bitcnt_3.c" +#include "bitcnt_4.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define FUNCS 8 + +/* + Global variables +*/ + +unsigned long bitcount_randseed; +int bitcount_res; +unsigned long bitcount_seed; +unsigned long bitcount_n; +unsigned int bitcount_iterations; + +/* + First declaration of the functions +*/ +__attribute__((always_inline)) static inline int +bitcount_bit_shifter(long int x); +__attribute__((always_inline)) static inline unsigned long +bitcount_random(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bitcount_main(); +__attribute__((always_inline)) static inline int bitcount_return(); +__attribute__((always_inline)) static inline void bitcount_init(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +__attribute__((always_inline)) static inline int +bitcount_bit_shifter(long int x) { + int n; + unsigned int i; + + __pragma_loopbound(31, 31); + for (i = n = 0; x && (i < (sizeof(long) * 8)); ++i, x >>= 1) + n += (int) (x & 1L); + return n; +} + +__attribute__((always_inline)) static inline int +bitcount_return() { + return (bitcount_n + (-1095)) != 0; +} + +__attribute__((always_inline)) static inline void +bitcount_init() { + bitcount_randseed = 1; + bitcount_n = 0; + bitcount_iterations = 10; + + bitcount_init3(); + bitcount_init4(); +} + +__attribute__((always_inline)) static inline unsigned long +bitcount_random(void) { + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = bitcount_randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if (t <= 0) + t += 0x7fffffff; + bitcount_randseed = t; + return (t); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bitcount_main() { + unsigned int i, j; + __pragma_loopbound(8, 8); + for (i = 0; i < FUNCS; i++) { + __pragma_loopbound(10, 10); + for (j = 0, bitcount_seed = bitcount_random(); j < bitcount_iterations; + j++, bitcount_seed += 13) { + // The original calls were done by function pointers + switch (i) { + case 0: + bitcount_res = bitcount_bit_count(bitcount_seed); + break; + case 1: + bitcount_res = bitcount_bitcount(bitcount_seed); + break; + case 2: { + _Pragma("marker call_ntbl") bitcount_res = + bitcount_ntbl_bitcnt(bitcount_seed); + break; + } + case 3: { + _Pragma("marker call_btbl") bitcount_res = + bitcount_btbl_bitcnt(bitcount_seed); + break; + } + case 4: + bitcount_res = bitcount_ntbl_bitcount(bitcount_seed); + break; + case 5: + bitcount_res = bitcount_BW_btbl_bitcount(bitcount_seed); + break; + case 6: + bitcount_res = bitcount_AR_btbl_bitcount(bitcount_seed); + break; + case 7: + bitcount_res = bitcount_bit_shifter(bitcount_seed); + break; + default: + break; + } + bitcount_n += bitcount_res; + } + } + _Pragma("flowrestriction 1*ntbl_bitcount <= 8*call_ntbl") + _Pragma("flowrestriction 1*btbl_bitcount <= 4*call_btbl") +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + bitcount_init(); + bitcount_main(); + + return (bitcount_return()); +} diff --git a/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitops.h b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitops.h new file mode 100644 index 0000000..5689967 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitcount/generated/modified_sources/inline/bitops.h @@ -0,0 +1,55 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: bitops.h + + Author: Bob Stout & Auke Reitsma + + Function: test program for bit counting functions + + Source: + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +#ifndef BITOPS__H +#define BITOPS__H + +/* +** bitcount_1.c +*/ + +__attribute__((always_inline)) static inline int bitcount_bit_count(long x); + +/* +** bitcount_2.c +*/ + +__attribute__((always_inline)) static inline int bitcount_bitcount(long i); + +/* +** bitcount_3.c +*/ +__attribute__((always_inline)) static inline void bitcount_init3(void); +__attribute__((always_inline)) static inline int +bitcount_ntbl_bitcount(long int x); +__attribute__((always_inline)) static inline int +bitcount_BW_btbl_bitcount(long int x); +__attribute__((always_inline)) static inline int +bitcount_AR_btbl_bitcount(long int x); + +/* +** bitcount_4.c +*/ +__attribute__((always_inline)) static inline void bitcount_init4(void); +__attribute__((always_inline)) static inline int +bitcount_ntbl_bitcnt(unsigned long x); +__attribute__((always_inline)) static inline int +bitcount_btbl_bitcnt(unsigned long x); + +#endif /* BITOPS__H */ diff --git a/targets/wasm-tacle/kernel/bitonic/CMakeLists.txt b/targets/wasm-tacle/kernel/bitonic/CMakeLists.txt new file mode 100644 index 0000000..cff7c33 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitonic/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(bitonic) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/bitonic.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/bitonic.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/bitonic/ChangeLog.txt b/targets/wasm-tacle/kernel/bitonic/ChangeLog.txt new file mode 100755 index 0000000..a0bdedc --- /dev/null +++ b/targets/wasm-tacle/kernel/bitonic/ChangeLog.txt @@ -0,0 +1,53 @@ +File: bitonic.c +Original provenience: StreamIt benchmark suite, + http://groups.csail.mit.edu/cag/streamit/results/bitonic/code/c/ + +2015-10-20: +- Removed original header comment, replaced by TACLeBench header. +- Added prefix "bitonic_"/"BITONIC_" to all global symbols +- adjusted names of bitonicSort and bitonicMerge functions to + bitonic_*. +- Replaced initialization code by TACLeBench-compliant initialization code. +- Added new function quicksort_return producing a checksum as return value. +- Added new function quicksort_main according to TACLeBench guidelines. + quicksort_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + + +2016-02-01: +- More formatting: + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - Operators within expressions shall be preceded and followed by one + whitespace + + +2016-04-05: +- Return '0' on success + +2016-04-06: +- Fixed generation of return value + +2016-06-01: +- Changed all prefixes to lower-case + diff --git a/targets/wasm-tacle/kernel/bitonic/bitonic.c b/targets/wasm-tacle/kernel/bitonic/bitonic.c new file mode 100755 index 0000000..09bb484 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitonic/bitonic.c @@ -0,0 +1,157 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: bitonic + + Author: Chris Leger + + Function: bitonic implements a recursive sorting network algorithm. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Changes: no major functional changes + + License: MIT + +*/ + + +/* + Forward declaration of functions +*/ +void bitonic_init( void ); +int bitonic_return( void ); +void bitonic_compare( int i, int j, int dir ); +void bitonic_merge( int lo, int cnt, int dir ); +void bitonic_sort( int lo, int cnt, int dir ); +int main( void ); + + +/* + Declaration of global variables +*/ + +int bitonic_numiters = 10; +int bitonic_a[ 32 ]; // the array to be sorted +const int bitonic_ASCENDING = 1; +const int bitonic_DESCENDING = 0; + +const int bitonic_CHECKSUM = 55; + +/* + Initialization- and return-value-related functions +*/ + +void bitonic_init( void ) +{ + /** Initialize array "a" with data **/ + int i; + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + bitonic_a[ i ] = ( 32 - i ); +} + + +int bitonic_return( void ) +{ + int checksum = 0; + + checksum += bitonic_a[ 0 ] + bitonic_a[ 21 ] + bitonic_a[ 31 ]; + + return ( ( checksum == bitonic_CHECKSUM ) ? 0 : -1 ); +} + + +/* + Algorithm core functions +*/ + +/** A comparator is modelled by the procedure compare, where the + parameter dir indicates the sorting direction. If dir is ASCENDING + and a[i] > a[j] is true or dir is DESCENDING and a[i] > a[j] is + false then a[i] and a[j] are interchanged. + **/ +void bitonic_compare( int i, int j, int dir ) +{ + if ( dir == ( bitonic_a[ i ] > bitonic_a[ j ] ) ) { + int h = bitonic_a[ i ]; + bitonic_a[ i ] = bitonic_a[ j ]; + bitonic_a[ j ] = h; + } +} + + +/** The procedure bitonicMerge recursively sorts a bitonic sequence in + ascending order, if dir = ASCENDING, and in descending order + otherwise. The sequence to be sorted starts at index position lo, + the number of elements is cnt. + **/ +void bitonic_merge( int lo, int cnt, int dir ) +{ + int k = cnt / 2; + int i; + _Pragma( "loopbound min 0 max 16" ) + for ( i = lo; i < lo + k; i++ ) + bitonic_compare( i, i + k, dir ); + + if ( k > 1 ) { + bitonic_merge( lo, k, dir ); + bitonic_merge( lo + k, k, dir ); + } +} + + +/** Procedure bitonicSort first produces a bitonic sequence by + recursively sorting its two halves in opposite directions, and then + calls bitonicMerge. + **/ +void bitonic_sort( int lo, int cnt, int dir ) +{ + int k = cnt; + k /= 2; + _Pragma( "marker recMerge" ) + + if ( cnt > 1 ) { + bitonic_sort( lo, k, bitonic_ASCENDING ); + bitonic_sort( lo + k, k, bitonic_DESCENDING ); + } + + bitonic_merge( lo, cnt, dir ); + _Pragma( "flowrestriction 1*bitonicMerge <= 31*recMerge" ) + + return; +} + + +/* + Main functions +*/ + +void _Pragma ( "entrypoint" ) bitonic_main( void ) +{ + int i; + + /** When called with parameters lo = 0, cnt = a.length() and dir = + ASCENDING, procedure bitonicSort sorts the whole array a. **/ + _Pragma( "marker recSort" ) + bitonic_sort( 0, 32, bitonic_ASCENDING ); + _Pragma( "flowrestriction 1*bitonicSort <= 63*recSort" ) + + /** Loop through array, printing out each element **/ + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) { + } +} + + +int main( void ) +{ + bitonic_init(); + bitonic_main(); + + return ( bitonic_return() ); +} diff --git a/targets/wasm-tacle/kernel/bitonic/generated/default/bitonic.wasm b/targets/wasm-tacle/kernel/bitonic/generated/default/bitonic.wasm new file mode 100755 index 0000000000000000000000000000000000000000..266e6c11aa92e1356882581f7554de3d0270d75c GIT binary patch literal 1086 zcmZ{jJ!}&(6vyAQeQALaRjWb@hJwg4Sx#3 ztTBIY_)9lxwb;aIK4EZLsk`K^be2UEHPoe6xrx$20oXK2nNPAbOiBbB9D>g&RA*8Cwn2L2bs#x#JS-Ja0{Y*%8yuC4$Lc&E!Hj5~twO40Eo1gz`` z$-6ZQg4qF;k2^~eI-Kv4PPkOJzRsZAkV{gGyGM#2)|Q_zCd`;%| a[j] is true or dir is DESCENDING and a[i] > a[j] is + false then a[i] and a[j] are interchanged. + **/ +void +bitonic_compare(int i, int j, int dir) { + if (dir == (bitonic_a[i] > bitonic_a[j])) { + int h = bitonic_a[i]; + bitonic_a[i] = bitonic_a[j]; + bitonic_a[j] = h; + } +} + +/** The procedure bitonicMerge recursively sorts a bitonic sequence in + ascending order, if dir = ASCENDING, and in descending order + otherwise. The sequence to be sorted starts at index position lo, + the number of elements is cnt. + **/ +void +bitonic_merge(int lo, int cnt, int dir) { + int k = cnt / 2; + int i; + __pragma_loopbound(0, 16); + for (i = lo; i < lo + k; i++) + bitonic_compare(i, i + k, dir); + + if (k > 1) { + bitonic_merge(lo, k, dir); + bitonic_merge(lo + k, k, dir); + } +} + +/** Procedure bitonicSort first produces a bitonic sequence by + recursively sorting its two halves in opposite directions, and then + calls bitonicMerge. + **/ +void +bitonic_sort(int lo, int cnt, int dir) { + int k = cnt; + k /= 2; + _Pragma("marker recMerge") + + if (cnt > 1) { + bitonic_sort(lo, k, bitonic_ASCENDING); + bitonic_sort(lo + k, k, bitonic_DESCENDING); + } + + bitonic_merge(lo, cnt, dir); + _Pragma("flowrestriction 1*bitonicMerge <= 31*recMerge") + + return; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bitonic_main(void) { + int i; + + /** When called with parameters lo = 0, cnt = a.length() and dir = + ASCENDING, procedure bitonicSort sorts the whole array a. **/ + _Pragma("marker recSort") bitonic_sort(0, 32, bitonic_ASCENDING); + _Pragma("flowrestriction 1*bitonicSort <= 63*recSort") + + /** Loop through array, printing out each element **/ + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) { + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + bitonic_init(); + bitonic_main(); + + return (bitonic_return()); +} diff --git a/targets/wasm-tacle/kernel/bitonic/generated/modified_sources/inline/bitonic.c b/targets/wasm-tacle/kernel/bitonic/generated/modified_sources/inline/bitonic.c new file mode 100644 index 0000000..e6d1714 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitonic/generated/modified_sources/inline/bitonic.c @@ -0,0 +1,164 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: bitonic + + Author: Chris Leger + + Function: bitonic implements a recursive sorting network algorithm. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Changes: no major functional changes + + License: MIT + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void bitonic_init(void); +__attribute__((always_inline)) static inline int bitonic_return(void); +__attribute__((always_inline)) static inline void bitonic_compare(int i, int j, + int dir); +__attribute__((always_inline)) static inline void bitonic_merge(int lo, int cnt, + int dir); +__attribute__((always_inline)) static inline void bitonic_sort(int lo, int cnt, + int dir); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +int bitonic_numiters = 10; +int bitonic_a[32]; // the array to be sorted +const int bitonic_ASCENDING = 1; +const int bitonic_DESCENDING = 0; + +const int bitonic_CHECKSUM = 55; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +bitonic_init(void) { + /** Initialize array "a" with data **/ + int i; + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + bitonic_a[i] = (32 - i); +} + +__attribute__((always_inline)) static inline int +bitonic_return(void) { + int checksum = 0; + + checksum += bitonic_a[0] + bitonic_a[21] + bitonic_a[31]; + + return ((checksum == bitonic_CHECKSUM) ? 0 : -1); +} + +/* + Algorithm core functions +*/ + +/** A comparator is modelled by the procedure compare, where the + parameter dir indicates the sorting direction. If dir is ASCENDING + and a[i] > a[j] is true or dir is DESCENDING and a[i] > a[j] is + false then a[i] and a[j] are interchanged. + **/ +__attribute__((always_inline)) static inline void +bitonic_compare(int i, int j, int dir) { + if (dir == (bitonic_a[i] > bitonic_a[j])) { + int h = bitonic_a[i]; + bitonic_a[i] = bitonic_a[j]; + bitonic_a[j] = h; + } +} + +/** The procedure bitonicMerge recursively sorts a bitonic sequence in + ascending order, if dir = ASCENDING, and in descending order + otherwise. The sequence to be sorted starts at index position lo, + the number of elements is cnt. + **/ +__attribute__((always_inline)) static inline void +bitonic_merge(int lo, int cnt, int dir) { + int k = cnt / 2; + int i; + __pragma_loopbound(0, 16); + for (i = lo; i < lo + k; i++) + bitonic_compare(i, i + k, dir); + + if (k > 1) { + bitonic_merge(lo, k, dir); + bitonic_merge(lo + k, k, dir); + } +} + +/** Procedure bitonicSort first produces a bitonic sequence by + recursively sorting its two halves in opposite directions, and then + calls bitonicMerge. + **/ +__attribute__((always_inline)) static inline void +bitonic_sort(int lo, int cnt, int dir) { + int k = cnt; + k /= 2; + _Pragma("marker recMerge") + + if (cnt > 1) { + bitonic_sort(lo, k, bitonic_ASCENDING); + bitonic_sort(lo + k, k, bitonic_DESCENDING); + } + + bitonic_merge(lo, cnt, dir); + _Pragma("flowrestriction 1*bitonicMerge <= 31*recMerge") + + return; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bitonic_main(void) { + int i; + + /** When called with parameters lo = 0, cnt = a.length() and dir = + ASCENDING, procedure bitonicSort sorts the whole array a. **/ + _Pragma("marker recSort") bitonic_sort(0, 32, bitonic_ASCENDING); + _Pragma("flowrestriction 1*bitonicSort <= 63*recSort") + + /** Loop through array, printing out each element **/ + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) { + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + bitonic_init(); + bitonic_main(); + + return (bitonic_return()); +} diff --git a/targets/wasm-tacle/kernel/bitonic/license.txt b/targets/wasm-tacle/kernel/bitonic/license.txt new file mode 100755 index 0000000..7029925 --- /dev/null +++ b/targets/wasm-tacle/kernel/bitonic/license.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/targets/wasm-tacle/kernel/bsort/CMakeLists.txt b/targets/wasm-tacle/kernel/bsort/CMakeLists.txt new file mode 100644 index 0000000..90fa759 --- /dev/null +++ b/targets/wasm-tacle/kernel/bsort/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(bsort) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/bsort.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/bsort.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/bsort/ChangeLog.txt b/targets/wasm-tacle/kernel/bsort/ChangeLog.txt new file mode 100755 index 0000000..f92bb92 --- /dev/null +++ b/targets/wasm-tacle/kernel/bsort/ChangeLog.txt @@ -0,0 +1,42 @@ +File: bsort.c +Original provenience: Mälardalen benchmark suite, +Source: http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bsort100/bsort100.c + +2017-04-18: +- Annotated bsort_main as entry-point for timing analysis. + +2016-04-20: +- Check upon call of bsort_return that bsort_Array is sorted. + +2016-03-15: +- Renamed file from bsort100.c to bsort.c. +- Introduced comments to split file in sections for forward + declarations, global variables, initialization-related and + return-value-related functions, core benchmark functions, and + main routine. +- Added functions bsort_init and bsort_main that call + bsort_Initialize and bsort_BubbleSort, respectively. +- Added function bsort_return that handles the return value. +- Renamed function Initialize to bsort_Initialize. +- Renamed function BubbleSort to bsort_BubbleSort. +- Replaced preprocessor defines NUMELEMS and MAXDIM by unificated + define bsort_SIZE, fixed bug that caused the first element of the + array to be ignored during sorting. +- Replaced preprocessor defines TRUE, FALSE, WORSTCASE and + KNOWN_VALUE by their values. +- Fixed compiler warning "unused variable 'Seed'" by removing the + offending variable. +- Fixed compiler warning "no previous extern declaration for + non-static variable" by making global variables static. +- Fixed compiler warning "unused variable 'LastIndex'" by removing + the offending variable. +- Fixed compiler warning "declaration shadows a variable in the + global scope" by renaming global variable Array to bsort_Array. +- Fixed compiler warning "// comments are not allowed in this + language" by removing dead code. +- Replaced comment describing purpose of benchmark with generic + TACLeBench header. +- Applied TACLeBench formatting rules via + astyle --options=doc/example/astylerc.txt +- Tested conformance to C90 via + clang -fsyntax-only -Weverything -Wno-unknown-pragmas -pedantic -std=c90 diff --git a/targets/wasm-tacle/kernel/bsort/bsort.c b/targets/wasm-tacle/kernel/bsort/bsort.c new file mode 100755 index 0000000..8a8b640 --- /dev/null +++ b/targets/wasm-tacle/kernel/bsort/bsort.c @@ -0,0 +1,132 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: bsort + + Author: unknown + + Function: A program for testing the basic loop constructs, + integer comparisons, and simple array handling by + sorting 100 integers + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bsort100/bsort100.c + + Original name: bsort100 + + Changes: See ChangeLog.txt + + License: May be used, modified, and re-distributed freely. + +*/ + + +/* + Forward declaration of functions +*/ + +void bsort_init( void ); +void bsort_main( void ); +int bsort_return( void ); +int bsort_Initialize( int Array[] ); +int bsort_BubbleSort( int Array[] ); + + +/* + Declaration of global variables +*/ + +#define bsort_SIZE 100 + +static int bsort_Array[ bsort_SIZE ]; + + +/* + Initialization- and return-value-related functions +*/ + +/* Initializes given array with randomly generated integers. */ +int bsort_Initialize( int Array[] ) +{ + int Index; + + _Pragma( "loopbound min 100 max 100" ) + for ( Index = 0; Index < bsort_SIZE; Index ++ ) + Array[ Index ] = ( Index + 1 ) * -1; + + return 0; +} + + +void bsort_init( void ) +{ + bsort_Initialize( bsort_Array ); +} + + +int bsort_return( void ) +{ + int Sorted = 1; + int Index; + + _Pragma( "loopbound min 99 max 99" ) + for ( Index = 0; Index < bsort_SIZE - 1; Index ++ ) + Sorted = Sorted && ( bsort_Array[ Index ] < bsort_Array[ Index + 1 ] ); + + return 1 - Sorted; +} + + +/* + Core benchmark functions +*/ + +/* Sorts an array of integers of size bsort_SIZE in ascending + order with bubble sort. */ +int bsort_BubbleSort( int Array[] ) +{ + int Sorted = 0; + int Temp, Index, i; + + _Pragma( "loopbound min 99 max 99" ) + for ( i = 0; i < bsort_SIZE - 1; i ++ ) { + Sorted = 1; + _Pragma( "loopbound min 3 max 99" ) + for ( Index = 0; Index < bsort_SIZE - 1; Index ++ ) { + if ( Index > bsort_SIZE - i ) + break; + if ( Array[ Index ] > Array[Index + 1] ) { + Temp = Array[ Index ]; + Array[ Index ] = Array[ Index + 1 ]; + Array[ Index + 1 ] = Temp; + Sorted = 0; + } + } + + if ( Sorted ) + break; + } + + return 0; +} + + +void _Pragma( "entrypoint" ) bsort_main( void ) +{ + bsort_BubbleSort( bsort_Array ); +} + + +/* + Main function +*/ + +int main( void ) +{ + bsort_init(); + bsort_main(); + + return bsort_return(); +} diff --git a/targets/wasm-tacle/kernel/bsort/generated/default/bsort.wasm b/targets/wasm-tacle/kernel/bsort/generated/default/bsort.wasm new file mode 100755 index 0000000000000000000000000000000000000000..d2d7bb9c0ad479d08c74afcb240a33f70c36aa95 GIT binary patch literal 928 zcmZ`%O>fgc5S`g|;xwBmRY8d3I;Wy2QClHUZ`o5RAaQ~7cAad4Q-8@`15ppIxWKVD zei=Ui(I3LtX-kEKwYF!TpJ(5^9WZ5rK-Z|Z+{96OF*`sHJOCW>GgjAd2DGqdPq3$T zUYJ#4cH%6{!>me|0Nmq<%KMivI;}K*B|U3ijF6cVYyLI9y@iu{oP_y4hSZNyvKKQOv29wccki z?!F#^Tylx;nio|KI5B$bpd-6f zipkDhX`vwS+WK3XAOa&Xep`d;N<1B+5Yii>ghpS}=gE*YS{~#?5kKiDYIOs&ZjIPB z3+ggJk_u{fEwNDuYCsWH+a|pxVYi9bBz&7tOMS zmG){4MRKl@7&Iq>Tfz6{kpXx5A7Zb9wy&l|5VRkb0-Tqc#DeIDWmdRZGd=j$gT1?f z)b|64{~a#2{aH6d#Yb9aMYM`i6SsiBhd@~A%;G|~<7W#v-pPw>SuJc);()@1Elazc zh8rAw2&>dpauJ(!wRd=3qOAbrz2;Im38{u8dnvz^d|kJie2={#Fd?l llFFGdw$oLdg(fa1qr#rs!lny5b(`FllU^CE(y9I8{s0rZ+Y0~y literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/bsort/generated/default/bsort.wat b/targets/wasm-tacle/kernel/bsort/generated/default/bsort.wat new file mode 100644 index 0000000..95ed370 --- /dev/null +++ b/targets/wasm-tacle/kernel/bsort/generated/default/bsort.wat @@ -0,0 +1,246 @@ +(module $bsort.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $bsort_main (type 1) + (local i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 99 + i32.const 99 + call $__pragma_loopbound + i32.const 0 + local.set 0 + loop ;; label = @1 + i32.const 3 + i32.const 99 + call $__pragma_loopbound + i32.const 100 + local.get 0 + i32.sub + local.set 1 + i32.const 0 + i32.load offset=1024 + local.set 2 + i32.const 0 + local.set 3 + i32.const 1 + local.set 4 + block ;; label = @2 + block ;; label = @3 + loop ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 2 + local.get 3 + i32.const 1 + i32.add + local.tee 5 + i32.const 2 + i32.shl + i32.const 1024 + i32.add + i32.load + local.tee 6 + i32.gt_s + br_if 0 (;@6;) + local.get 3 + local.set 7 + local.get 5 + local.set 3 + br 1 (;@5;) + end + local.get 3 + i32.const 2 + i32.shl + i32.const 1024 + i32.add + local.set 7 + loop ;; label = @6 + local.get 7 + local.get 6 + i32.store + local.get 7 + i32.const 4 + i32.add + local.tee 6 + local.get 2 + i32.store + local.get 3 + i32.const 97 + i32.gt_u + br_if 3 (;@3;) + local.get 3 + local.get 1 + i32.ge_u + br_if 3 (;@3;) + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + i32.const 8 + i32.add + local.set 5 + local.get 6 + local.set 7 + local.get 2 + local.get 5 + i32.load + local.tee 6 + i32.gt_s + br_if 0 (;@6;) + end + i32.const 0 + local.set 4 + local.get 3 + local.set 7 + local.get 3 + i32.const 1 + i32.add + local.set 3 + end + local.get 6 + local.set 2 + block ;; label = @5 + local.get 7 + i32.const 97 + i32.gt_u + br_if 0 (;@5;) + local.get 7 + local.get 1 + i32.lt_u + br_if 1 (;@4;) + end + end + local.get 4 + br_if 1 (;@2;) + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 99 + i32.ne + br_if 2 (;@1;) + br 1 (;@2;) + end + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 99 + i32.ne + br_if 1 (;@1;) + end + end) + (func $__original_main (type 2) (result i32) + (local i32 i32) + i32.const 100 + i32.const 100 + call $__pragma_loopbound + i32.const 1024 + local.set 0 + i32.const -5 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 16 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 12 + i32.add + local.get 1 + i32.const 1 + i32.add + i32.store + local.get 0 + i32.const 8 + i32.add + local.get 1 + i32.const 2 + i32.add + i32.store + local.get 0 + i32.const 4 + i32.add + local.get 1 + i32.const 3 + i32.add + i32.store + local.get 0 + local.get 1 + i32.const 4 + i32.add + i32.store + local.get 0 + i32.const 20 + i32.add + local.set 0 + local.get 1 + i32.const -5 + i32.add + local.tee 1 + i32.const -105 + i32.ne + br_if 0 (;@1;) + end + call $bsort_main + i32.const 99 + i32.const 99 + call $__pragma_loopbound + i32.const 0 + local.set 0 + i32.const 1 + local.set 1 + loop ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 1 + br_if 0 (;@3;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + i32.const 0 + local.set 1 + br 1 (;@2;) + end + local.get 0 + i32.const 2 + i32.shl + i32.const 1024 + i32.add + i32.load + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 2 + i32.shl + i32.const 1024 + i32.add + i32.load + i32.lt_s + local.set 1 + end + local.get 0 + i32.const 99 + i32.ne + br_if 0 (;@1;) + end + local.get 1 + i32.const 1 + i32.xor) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5520)) + (global (;1;) i32 (i32.const 1424)) + (global (;2;) i32 (i32.const 5520)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $bsort_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/bsort/generated/modified_sources/default/bsort.c b/targets/wasm-tacle/kernel/bsort/generated/modified_sources/default/bsort.c new file mode 100644 index 0000000..00f92f8 --- /dev/null +++ b/targets/wasm-tacle/kernel/bsort/generated/modified_sources/default/bsort.c @@ -0,0 +1,130 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: bsort + + Author: unknown + + Function: A program for testing the basic loop constructs, + integer comparisons, and simple array handling by + sorting 100 integers + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bsort100/bsort100.c + + Original name: bsort100 + + Changes: See ChangeLog.txt + + License: May be used, modified, and re-distributed freely. + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void bsort_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bsort_main(void); +int bsort_return(void); +int bsort_Initialize(int Array[]); +int bsort_BubbleSort(int Array[]); + +/* + Declaration of global variables +*/ + +#define bsort_SIZE 100 + +static int bsort_Array[bsort_SIZE]; + +/* + Initialization- and return-value-related functions +*/ + +/* Initializes given array with randomly generated integers. */ +int +bsort_Initialize(int Array[]) { + int Index; + + __pragma_loopbound(100, 100); + for (Index = 0; Index < bsort_SIZE; Index++) + Array[Index] = (Index + 1) * -1; + + return 0; +} + +void +bsort_init(void) { + bsort_Initialize(bsort_Array); +} + +int +bsort_return(void) { + int Sorted = 1; + int Index; + + __pragma_loopbound(99, 99); + for (Index = 0; Index < bsort_SIZE - 1; Index++) + Sorted = Sorted && (bsort_Array[Index] < bsort_Array[Index + 1]); + + return 1 - Sorted; +} + +/* + Core benchmark functions +*/ + +/* Sorts an array of integers of size bsort_SIZE in ascending + order with bubble sort. */ +int +bsort_BubbleSort(int Array[]) { + int Sorted = 0; + int Temp, Index, i; + + __pragma_loopbound(99, 99); + for (i = 0; i < bsort_SIZE - 1; i++) { + Sorted = 1; + __pragma_loopbound(3, 99); + for (Index = 0; Index < bsort_SIZE - 1; Index++) { + if (Index > bsort_SIZE - i) + break; + if (Array[Index] > Array[Index + 1]) { + Temp = Array[Index]; + Array[Index] = Array[Index + 1]; + Array[Index + 1] = Temp; + Sorted = 0; + } + } + + if (Sorted) + break; + } + + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bsort_main(void) { + bsort_BubbleSort(bsort_Array); +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + bsort_init(); + bsort_main(); + + return bsort_return(); +} diff --git a/targets/wasm-tacle/kernel/bsort/generated/modified_sources/inline/bsort.c b/targets/wasm-tacle/kernel/bsort/generated/modified_sources/inline/bsort.c new file mode 100644 index 0000000..84fa99c --- /dev/null +++ b/targets/wasm-tacle/kernel/bsort/generated/modified_sources/inline/bsort.c @@ -0,0 +1,136 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: bsort + + Author: unknown + + Function: A program for testing the basic loop constructs, + integer comparisons, and simple array handling by + sorting 100 integers + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/bsort100/bsort100.c + + Original name: bsort100 + + Changes: See ChangeLog.txt + + License: May be used, modified, and re-distributed freely. + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void bsort_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bsort_main(void); +__attribute__((always_inline)) static inline int bsort_return(void); +__attribute__((always_inline)) static inline int bsort_Initialize(int Array[]); +__attribute__((always_inline)) static inline int bsort_BubbleSort(int Array[]); + +/* + Declaration of global variables +*/ + +#define bsort_SIZE 100 + +static int bsort_Array[bsort_SIZE]; + +/* + Initialization- and return-value-related functions +*/ + +/* Initializes given array with randomly generated integers. */ +__attribute__((always_inline)) static inline int +bsort_Initialize(int Array[]) { + int Index; + + __pragma_loopbound(100, 100); + for (Index = 0; Index < bsort_SIZE; Index++) + Array[Index] = (Index + 1) * -1; + + return 0; +} + +__attribute__((always_inline)) static inline void +bsort_init(void) { + bsort_Initialize(bsort_Array); +} + +__attribute__((always_inline)) static inline int +bsort_return(void) { + int Sorted = 1; + int Index; + + __pragma_loopbound(99, 99); + for (Index = 0; Index < bsort_SIZE - 1; Index++) + Sorted = Sorted && (bsort_Array[Index] < bsort_Array[Index + 1]); + + return 1 - Sorted; +} + +/* + Core benchmark functions +*/ + +/* Sorts an array of integers of size bsort_SIZE in ascending + order with bubble sort. */ +__attribute__((always_inline)) static inline int +bsort_BubbleSort(int Array[]) { + int Sorted = 0; + int Temp, Index, i; + + __pragma_loopbound(99, 99); + for (i = 0; i < bsort_SIZE - 1; i++) { + Sorted = 1; + __pragma_loopbound(3, 99); + for (Index = 0; Index < bsort_SIZE - 1; Index++) { + if (Index > bsort_SIZE - i) + break; + if (Array[Index] > Array[Index + 1]) { + Temp = Array[Index]; + Array[Index] = Array[Index + 1]; + Array[Index + 1] = Temp; + Sorted = 0; + } + } + + if (Sorted) + break; + } + + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +bsort_main(void) { + bsort_BubbleSort(bsort_Array); +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + bsort_init(); + bsort_main(); + + return bsort_return(); +} diff --git a/targets/wasm-tacle/kernel/complex_updates/CMakeLists.txt b/targets/wasm-tacle/kernel/complex_updates/CMakeLists.txt new file mode 100644 index 0000000..52f363c --- /dev/null +++ b/targets/wasm-tacle/kernel/complex_updates/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(complex_updates) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/complex_updates.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/complex_updates.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/complex_updates/ChangeLog.txt b/targets/wasm-tacle/kernel/complex_updates/ChangeLog.txt new file mode 100755 index 0000000..084efe0 --- /dev/null +++ b/targets/wasm-tacle/kernel/complex_updates/ChangeLog.txt @@ -0,0 +1,27 @@ +File: complex_updates.c +Original provenience: DSP-Stone + +2016-03-02: +- Rename n_complex_updates_float to n_complex_updates +- Add generic TACLeBench header +- Prefix global function with benchmark name +- Avoid accepting arbitrary number of parameters +- Introduce return statement +- Make A, B, C, D global variables +- Split code into n_complex_updates_init and n_complex_updates_main +2016-04-25: +- Rename to complex_updates in order to shorten prefixes +- Remove second call of pin_down, since this was originally used as a border for + constant propagation +- Move pin_down call into init function +- Add operation on input data with volatile variable to completely prevent + constant propagation +- Prefix all global symbols with benchmark name +- Add calculation of checksum on result data, which is used in return statement +- Apply code formatting with clang-format (manually move loop-bound annotation + into separate line and align assignments in complex_updates_main) +2016-04-25: +- Replace usages of macros by their expansions: + STORAGE_CLASS => register, TYPE => float +2016-05-25: +- Apply code formatting with astyle diff --git a/targets/wasm-tacle/kernel/complex_updates/complex_updates.c b/targets/wasm-tacle/kernel/complex_updates/complex_updates.c new file mode 100755 index 0000000..91e3ae6 --- /dev/null +++ b/targets/wasm-tacle/kernel/complex_updates/complex_updates.c @@ -0,0 +1,136 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: complex_updates + + Author: Juan Martinez Velarde + + Function: complex_updates is a program for filter benchmarking. + This program performs n complex updates of the form + D(i) = C(i) + A(i)*B(i), + where A(i), B(i), C(i) and D(i) are complex numbers, + and i = 1,...,N + A(i) = Ar(i) + j Ai(i) + B(i) = Br(i) + j Bi(i) + C(i) = Cr(i) + j Ci(i) + D(i) = C(i) + A(i)*B(i) = Dr(i) + j Di(i) + => Dr(i) = Cr(i) + Ar(i)*Br(i) - Ai(i)*Bi(i) + => Di(i) = Ci(i) + Ar(i)*Bi(i) + Ai(i)*Br(i) + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: n_complex_updates_float + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +#define N 16 + + +/* + Forward declaration of functions +*/ + +void complex_updates_pin_down( float *pa, float *pb, float *pc, float *pd ); +void complex_updates_init( void ); +void complex_updates_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +float complex_updates_A[ 2 * N ], complex_updates_B[ 2 * N ], + complex_updates_C[ 2 * N ], complex_updates_D[ 2 * N ]; + + +/* + Initialization- and return-value-related functions +*/ + +void complex_updates_init( void ) +{ + int i; + volatile float x = 0; + + complex_updates_pin_down( &complex_updates_A[ 0 ], &complex_updates_B[ 0 ], + &complex_updates_C[ 0 ], &complex_updates_D[ 0 ] ); + + /* avoid constant propagation */ + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0 ; i < N ; i++ ) { + complex_updates_A[ i ] += x; + complex_updates_B[ i ] += x; + complex_updates_C[ i ] += x; + complex_updates_D[ i ] += x; + } +} + + +void complex_updates_pin_down( float *pa, float *pb, float *pc, float *pd ) +{ + register int i; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < N; i++ ) { + *pa++ = 2; + *pa++ = 1; + *pb++ = 2; + *pb++ = 5; + *pc++ = 3; + *pc++ = 4; + *pd++ = 0; + *pd++ = 0; + } +} + + +int complex_updates_return( void ) +{ + float check_sum = 0; + int i; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < N; i++ ) + check_sum += complex_updates_D[ i ]; + + return ( check_sum != 144.0f ); +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) complex_updates_main( void ) +{ + register float *p_a = &complex_updates_A[ 0 ], *p_b = &complex_updates_B[ 0 ]; + register float *p_c = &complex_updates_C[ 0 ], *p_d = &complex_updates_D[ 0 ]; + int i; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0 ; i < N ; i++, p_a++ ) { + *p_d = *p_c++ + *p_a++ * *p_b++ ; + *p_d++ -= *p_a * *p_b-- ; + + *p_d = *p_c++ + *p_a-- * *p_b++ ; + *p_d++ += *p_a++ * *p_b++ ; + } + +} + +int main( void ) +{ + complex_updates_init(); + + complex_updates_main(); + + return complex_updates_return(); +} diff --git a/targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wasm b/targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wasm new file mode 100755 index 0000000000000000000000000000000000000000..7373deaa2a6740633c9eb931debf151e7cb78530 GIT binary patch literal 3383 zcmZ|SF-+rD7{KxOY$t>yTzvF;%J@t>P&iPos(QJp_->&aLn|>N$rq;hyjkCp68n^-5hItu-1}vC%fm z2#GNX3s{t5*uogcM2v9!3$cgQ{;O0Esr@wj`6@N?Q#@Wb>J7Uqpsc2SbUt0vEvwem z%6d!JY@^mFH4#o4X3OqcjjGu~qEy$bCX$kx`yRtAi#VleONMS~MZIZ=Lh|ILB%st? z9I3J@%YElS1ihobSNr|p4{roSu=nzOi0Es9zWz)vyRXG}>~yF~a8-h<5`oaMc1=Ex6S}xLV|@MXp+OtHp3t;Hm;w72K*2 zu9moJiK~{}YAIY>Tp$ut2%DgN&S_^(kHmzRHULQp}*$bdK2#WJ00-XO4%y+IuOofrClI@eX_o+aXd2*iz6S+toKR^6+#Sp$D9;IH}qI{540 zuSNOmp1%(M2KXBRf5Z0&;19sxi1G)XKLCFV{H=h$<@?*?*#lE z-`@p)7yO+lf7kPO!QTUaFW~R_{yzBo;O|BG`<}lK{sH(00sp}F55YeK{~*dg^!!8c zkH9|)_(#5f4E{0rM^XN<=O2SV1b-OthrWLT{t5WQDF4LsPryF~|1{vA`u-XCXW*Yk z`DdPg2L3tt=K=rR_b6JpTs#TkvlK{;ludfqw`7ZIplK`FG&ogMT0J?|uIP{0H#wqx=WYe*pgx z{KtU*==)FLKY{-k!J_l{SJ|z!JRuNaN^qVGQ$pH#6d-zm5|J0E8hL?!!Ke$;@&q13 zDfu_Wpd(wfl~Fpf6UwfQ9Co;*9 zXJm||Ns1)NC`phJ5+^Yt5%E3U>u++0b5ef)OA7siB~z~(=*t(SM%}6z9j$FS`*Nc> zOE>D+ilK3D^RM}vfBe7ucp=L%npHKma^s^Z@*kklJ-(FDw1!=+R876cPK=CW8bkY@4k%Db;kdGXDDQ?CaS#Wb)fw zo1Omd8}wtQrP~#wrF}5;R@*k3(sZ)kuC=Pa>b15povF85da-8ARBDZ)UTaQgY~zDr W8)nIvX>~25Ih|-$E9Q*RY5fcRzT~L@ literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wat b/targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wat new file mode 100644 index 0000000..6a63e5f --- /dev/null +++ b/targets/wasm-tacle/kernel/complex_updates/generated/default/complex_updates.wat @@ -0,0 +1,889 @@ +(module $complex_updates.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32 i32 i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $complex_updates_pin_down (type 2) (param i32 i32 i32 i32) + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + i64.const 4575657222482165760 + i64.store align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store align=4 + local.get 3 + i64.const 0 + i64.store align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=8 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=8 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=8 align=4 + local.get 3 + i64.const 0 + i64.store offset=8 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=16 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=16 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=16 align=4 + local.get 3 + i64.const 0 + i64.store offset=16 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=24 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=24 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=24 align=4 + local.get 3 + i64.const 0 + i64.store offset=24 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=32 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=32 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=32 align=4 + local.get 3 + i64.const 0 + i64.store offset=32 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=40 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=40 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=40 align=4 + local.get 3 + i64.const 0 + i64.store offset=40 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=48 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=48 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=48 align=4 + local.get 3 + i64.const 0 + i64.store offset=48 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=56 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=56 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=56 align=4 + local.get 3 + i64.const 0 + i64.store offset=56 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=64 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=64 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=64 align=4 + local.get 3 + i64.const 0 + i64.store offset=64 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=72 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=72 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=72 align=4 + local.get 3 + i64.const 0 + i64.store offset=72 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=80 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=80 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=80 align=4 + local.get 3 + i64.const 0 + i64.store offset=80 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=88 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=88 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=88 align=4 + local.get 3 + i64.const 0 + i64.store offset=88 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=96 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=96 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=96 align=4 + local.get 3 + i64.const 0 + i64.store offset=96 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=104 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=104 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=104 align=4 + local.get 3 + i64.const 0 + i64.store offset=104 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=112 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=112 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=112 align=4 + local.get 3 + i64.const 0 + i64.store offset=112 align=4 + local.get 0 + i64.const 4575657222482165760 + i64.store offset=120 align=4 + local.get 1 + i64.const 4656722015774834688 + i64.store offset=120 align=4 + local.get 2 + i64.const 4647714816524288000 + i64.store offset=120 align=4 + local.get 3 + i64.const 0 + i64.store offset=120 align=4) + (func $complex_updates_main (type 1) + (local f32 f32 f32 f32) + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + f32.load offset=1024 + local.tee 0 + i32.const 0 + f32.load offset=1152 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1280 + f32.add + i32.const 0 + f32.load offset=1028 + local.tee 2 + i32.const 0 + f32.load offset=1156 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1408 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1284 + f32.add + f32.add + f32.store offset=1412 + i32.const 0 + i32.const 0 + f32.load offset=1032 + local.tee 0 + i32.const 0 + f32.load offset=1160 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1288 + f32.add + i32.const 0 + f32.load offset=1036 + local.tee 2 + i32.const 0 + f32.load offset=1164 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1416 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1292 + f32.add + f32.add + f32.store offset=1420 + i32.const 0 + i32.const 0 + f32.load offset=1040 + local.tee 0 + i32.const 0 + f32.load offset=1168 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1296 + f32.add + i32.const 0 + f32.load offset=1044 + local.tee 2 + i32.const 0 + f32.load offset=1172 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1424 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1300 + f32.add + f32.add + f32.store offset=1428 + i32.const 0 + i32.const 0 + f32.load offset=1048 + local.tee 0 + i32.const 0 + f32.load offset=1176 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1304 + f32.add + i32.const 0 + f32.load offset=1052 + local.tee 2 + i32.const 0 + f32.load offset=1180 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1432 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1308 + f32.add + f32.add + f32.store offset=1436 + i32.const 0 + i32.const 0 + f32.load offset=1056 + local.tee 0 + i32.const 0 + f32.load offset=1184 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1312 + f32.add + i32.const 0 + f32.load offset=1060 + local.tee 2 + i32.const 0 + f32.load offset=1188 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1440 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1316 + f32.add + f32.add + f32.store offset=1444 + i32.const 0 + i32.const 0 + f32.load offset=1064 + local.tee 0 + i32.const 0 + f32.load offset=1192 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1320 + f32.add + i32.const 0 + f32.load offset=1068 + local.tee 2 + i32.const 0 + f32.load offset=1196 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1448 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1324 + f32.add + f32.add + f32.store offset=1452 + i32.const 0 + i32.const 0 + f32.load offset=1072 + local.tee 0 + i32.const 0 + f32.load offset=1200 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1328 + f32.add + i32.const 0 + f32.load offset=1076 + local.tee 2 + i32.const 0 + f32.load offset=1204 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1456 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1332 + f32.add + f32.add + f32.store offset=1460 + i32.const 0 + i32.const 0 + f32.load offset=1080 + local.tee 0 + i32.const 0 + f32.load offset=1208 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1336 + f32.add + i32.const 0 + f32.load offset=1084 + local.tee 2 + i32.const 0 + f32.load offset=1212 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1464 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1340 + f32.add + f32.add + f32.store offset=1468 + i32.const 0 + i32.const 0 + f32.load offset=1088 + local.tee 0 + i32.const 0 + f32.load offset=1216 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1344 + f32.add + i32.const 0 + f32.load offset=1092 + local.tee 2 + i32.const 0 + f32.load offset=1220 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1472 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1348 + f32.add + f32.add + f32.store offset=1476 + i32.const 0 + i32.const 0 + f32.load offset=1096 + local.tee 0 + i32.const 0 + f32.load offset=1224 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1352 + f32.add + i32.const 0 + f32.load offset=1100 + local.tee 2 + i32.const 0 + f32.load offset=1228 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1480 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1356 + f32.add + f32.add + f32.store offset=1484 + i32.const 0 + i32.const 0 + f32.load offset=1104 + local.tee 0 + i32.const 0 + f32.load offset=1232 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1360 + f32.add + i32.const 0 + f32.load offset=1108 + local.tee 2 + i32.const 0 + f32.load offset=1236 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1488 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1364 + f32.add + f32.add + f32.store offset=1492 + i32.const 0 + i32.const 0 + f32.load offset=1112 + local.tee 0 + i32.const 0 + f32.load offset=1240 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1368 + f32.add + i32.const 0 + f32.load offset=1116 + local.tee 2 + i32.const 0 + f32.load offset=1244 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1496 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1372 + f32.add + f32.add + f32.store offset=1500 + i32.const 0 + i32.const 0 + f32.load offset=1120 + local.tee 0 + i32.const 0 + f32.load offset=1248 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1376 + f32.add + i32.const 0 + f32.load offset=1124 + local.tee 2 + i32.const 0 + f32.load offset=1252 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1504 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1380 + f32.add + f32.add + f32.store offset=1508 + i32.const 0 + i32.const 0 + f32.load offset=1128 + local.tee 0 + i32.const 0 + f32.load offset=1256 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1384 + f32.add + i32.const 0 + f32.load offset=1132 + local.tee 2 + i32.const 0 + f32.load offset=1260 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1512 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1388 + f32.add + f32.add + f32.store offset=1516 + i32.const 0 + i32.const 0 + f32.load offset=1136 + local.tee 0 + i32.const 0 + f32.load offset=1264 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1392 + f32.add + i32.const 0 + f32.load offset=1140 + local.tee 2 + i32.const 0 + f32.load offset=1268 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1520 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1396 + f32.add + f32.add + f32.store offset=1524 + i32.const 0 + i32.const 0 + f32.load offset=1144 + local.tee 0 + i32.const 0 + f32.load offset=1272 + local.tee 1 + f32.mul + i32.const 0 + f32.load offset=1400 + f32.add + i32.const 0 + f32.load offset=1148 + local.tee 2 + i32.const 0 + f32.load offset=1276 + local.tee 3 + f32.mul + f32.sub + f32.store offset=1528 + i32.const 0 + local.get 0 + local.get 3 + f32.mul + local.get 2 + local.get 1 + f32.mul + i32.const 0 + f32.load offset=1404 + f32.add + f32.add + f32.store offset=1532) + (func $__original_main (type 3) (result i32) + (local i32 i32 i32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store offset=12 + i32.const 1024 + i32.const 1152 + i32.const 1280 + i32.const 1408 + call $complex_updates_pin_down + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -64 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 1088 + i32.add + local.tee 2 + local.get 2 + f32.load + local.get 0 + f32.load offset=12 + f32.add + f32.store + local.get 1 + i32.const 1216 + i32.add + local.tee 2 + local.get 2 + f32.load + local.get 0 + f32.load offset=12 + f32.add + f32.store + local.get 1 + i32.const 1344 + i32.add + local.tee 2 + local.get 2 + f32.load + local.get 0 + f32.load offset=12 + f32.add + f32.store + local.get 1 + i32.const 1472 + i32.add + local.tee 2 + local.get 2 + f32.load + local.get 0 + f32.load offset=12 + f32.add + f32.store + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + call $complex_updates_main + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const 0 + f32.load offset=1408 + local.set 3 + i32.const 0 + f32.load offset=1412 + local.set 4 + i32.const 0 + f32.load offset=1416 + local.set 5 + i32.const 0 + f32.load offset=1420 + local.set 6 + i32.const 0 + f32.load offset=1424 + local.set 7 + i32.const 0 + f32.load offset=1428 + local.set 8 + i32.const 0 + f32.load offset=1432 + local.set 9 + i32.const 0 + f32.load offset=1436 + local.set 10 + i32.const 0 + f32.load offset=1440 + local.set 11 + i32.const 0 + f32.load offset=1444 + local.set 12 + i32.const 0 + f32.load offset=1448 + local.set 13 + i32.const 0 + f32.load offset=1452 + local.set 14 + i32.const 0 + f32.load offset=1456 + local.set 15 + i32.const 0 + f32.load offset=1460 + local.set 16 + i32.const 0 + f32.load offset=1464 + local.set 17 + i32.const 0 + f32.load offset=1468 + local.set 18 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 18 + local.get 17 + local.get 16 + local.get 15 + local.get 14 + local.get 13 + local.get 12 + local.get 11 + local.get 10 + local.get 9 + local.get 8 + local.get 7 + local.get 6 + local.get 5 + local.get 4 + local.get 3 + f32.const 0x0p+0 (;=0;) + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.const 0x1.2p+7 (;=144;) + f32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5632)) + (global (;1;) i32 (i32.const 1536)) + (global (;2;) i32 (i32.const 5632)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $complex_updates_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/default/complex_updates.c b/targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/default/complex_updates.c new file mode 100644 index 0000000..0117c69 --- /dev/null +++ b/targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/default/complex_updates.c @@ -0,0 +1,135 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: complex_updates + + Author: Juan Martinez Velarde + + Function: complex_updates is a program for filter benchmarking. + This program performs n complex updates of the form + D(i) = C(i) + A(i)*B(i), + where A(i), B(i), C(i) and D(i) are complex numbers, + and i = 1,...,N + A(i) = Ar(i) + j Ai(i) + B(i) = Br(i) + j Bi(i) + C(i) = Cr(i) + j Ci(i) + D(i) = C(i) + A(i)*B(i) = Dr(i) + j Di(i) + => Dr(i) = Cr(i) + Ar(i)*Br(i) - Ai(i)*Bi(i) + => Di(i) = Ci(i) + Ar(i)*Bi(i) + Ai(i)*Br(i) + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: n_complex_updates_float + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define N 16 + +/* + Forward declaration of functions +*/ + +void complex_updates_pin_down(float *pa, float *pb, float *pc, float *pd); +void complex_updates_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +complex_updates_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +float complex_updates_A[2 * N], complex_updates_B[2 * N], + complex_updates_C[2 * N], complex_updates_D[2 * N]; + +/* + Initialization- and return-value-related functions +*/ + +void +complex_updates_init(void) { + int i; + volatile float x = 0; + + complex_updates_pin_down(&complex_updates_A[0], &complex_updates_B[0], + &complex_updates_C[0], &complex_updates_D[0]); + + /* avoid constant propagation */ + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++) { + complex_updates_A[i] += x; + complex_updates_B[i] += x; + complex_updates_C[i] += x; + complex_updates_D[i] += x; + } +} + +void +complex_updates_pin_down(float *pa, float *pb, float *pc, float *pd) { + register int i; + + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++) { + *pa++ = 2; + *pa++ = 1; + *pb++ = 2; + *pb++ = 5; + *pc++ = 3; + *pc++ = 4; + *pd++ = 0; + *pd++ = 0; + } +} + +int +complex_updates_return(void) { + float check_sum = 0; + int i; + + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++) + check_sum += complex_updates_D[i]; + + return (check_sum != 144.0f); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +complex_updates_main(void) { + register float *p_a = &complex_updates_A[0], *p_b = &complex_updates_B[0]; + register float *p_c = &complex_updates_C[0], *p_d = &complex_updates_D[0]; + int i; + + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++, p_a++) { + *p_d = *p_c++ + *p_a++ * *p_b++; + *p_d++ -= *p_a * *p_b--; + + *p_d = *p_c++ + *p_a-- * *p_b++; + *p_d++ += *p_a++ * *p_b++; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + complex_updates_init(); + + complex_updates_main(); + + return complex_updates_return(); +} diff --git a/targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/inline/complex_updates.c b/targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/inline/complex_updates.c new file mode 100644 index 0000000..8e2f7f6 --- /dev/null +++ b/targets/wasm-tacle/kernel/complex_updates/generated/modified_sources/inline/complex_updates.c @@ -0,0 +1,144 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: complex_updates + + Author: Juan Martinez Velarde + + Function: complex_updates is a program for filter benchmarking. + This program performs n complex updates of the form + D(i) = C(i) + A(i)*B(i), + where A(i), B(i), C(i) and D(i) are complex numbers, + and i = 1,...,N + A(i) = Ar(i) + j Ai(i) + B(i) = Br(i) + j Bi(i) + C(i) = Cr(i) + j Ci(i) + D(i) = C(i) + A(i)*B(i) = Dr(i) + j Di(i) + => Dr(i) = Cr(i) + Ar(i)*Br(i) - Ai(i)*Bi(i) + => Di(i) = Ci(i) + Ar(i)*Bi(i) + Ai(i)*Br(i) + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: n_complex_updates_float + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define N 16 + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +complex_updates_pin_down(float *pa, float *pb, float *pc, float *pd); +__attribute__((always_inline)) static inline void complex_updates_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +complex_updates_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +float complex_updates_A[2 * N], complex_updates_B[2 * N], + complex_updates_C[2 * N], complex_updates_D[2 * N]; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +complex_updates_init(void) { + int i; + volatile float x = 0; + + complex_updates_pin_down(&complex_updates_A[0], &complex_updates_B[0], + &complex_updates_C[0], &complex_updates_D[0]); + + /* avoid constant propagation */ + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++) { + complex_updates_A[i] += x; + complex_updates_B[i] += x; + complex_updates_C[i] += x; + complex_updates_D[i] += x; + } +} + +__attribute__((always_inline)) static inline void +complex_updates_pin_down(float *pa, float *pb, float *pc, float *pd) { + register int i; + + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++) { + *pa++ = 2; + *pa++ = 1; + *pb++ = 2; + *pb++ = 5; + *pc++ = 3; + *pc++ = 4; + *pd++ = 0; + *pd++ = 0; + } +} + +__attribute__((always_inline)) static inline int +complex_updates_return(void) { + float check_sum = 0; + int i; + + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++) + check_sum += complex_updates_D[i]; + + return (check_sum != 144.0f); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +complex_updates_main(void) { + register float *p_a = &complex_updates_A[0], *p_b = &complex_updates_B[0]; + register float *p_c = &complex_updates_C[0], *p_d = &complex_updates_D[0]; + int i; + + __pragma_loopbound(16, 16); + for (i = 0; i < N; i++, p_a++) { + *p_d = *p_c++ + *p_a++ * *p_b++; + *p_d++ -= *p_a * *p_b--; + + *p_d = *p_c++ + *p_a-- * *p_b++; + *p_d++ += *p_a++ * *p_b++; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + complex_updates_init(); + + complex_updates_main(); + + return complex_updates_return(); +} diff --git a/targets/wasm-tacle/kernel/cosf/CMakeLists.txt b/targets/wasm-tacle/kernel/cosf/CMakeLists.txt new file mode 100644 index 0000000..32c4ff5 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(cosf) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/cosf.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/cosf.c" + "generated/modified_sources/default/wcclibm.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/cosf/ChangeLog.txt b/targets/wasm-tacle/kernel/cosf/ChangeLog.txt new file mode 100755 index 0000000..1f9fa35 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/ChangeLog.txt @@ -0,0 +1,79 @@ +Original provenience: MiBench benchmark suite, + http://wwweb.eecs.umich.edu/mibench + +2016-02-09: +- Added TACLeBench header +- Renamed benchmark from 'basicmath_small' to 'basicmath' +- Fixed a typo in code comments: 'soem' -> 'some' +- Removed unused variable 'n' from the main funcion +- Added variable 'double Y' to the main function and accumulated the results of + 'deg2rad(X)' and 'rad2deg(X)' in this variable so that the compiler warning + 'statement with no effect' is fixed. +- Removed conditionally compiled main (test) function from isqrt.c +- Removed conditionally compiled main (test) function from cubic.c +- Removed commented-out code +- Removed unused function, variable, macro and type declarations, structs and + unions +- Removed seemingly unnecessary empty lines +- Renamed memcpy.t to basicmath_libc.c +- Removed unused files: + rad2deg.c + sniptype.h + sniptype.h +- Created basicmath_libc.h and put declaration of basicmath_memcpy() in it +- Reorganized snipmath.h so that the following are in the given order just +after the header + - includes + - declarations of functions +- Reorganized sniptype.h so that the following are in the given order just +after the header + - macro definitions + - type definitions +- Removed duplicated copyright information from wcclibm.c +- Removed __STDC__ checks from wcclibm.c and used only ANSI style function + arguments +- Removed 'last modified' comments from files +- Removed mention 'use __kernel_rem_pio2f()' from comments of function + __ieee754_rem_pio2f() since it doesn't really use it. +- Removed math functions specialization macros from wcclibm.h and updated call + sites with explicit nameks of the functions. +- Removed '#define double float' from wcclibm.h and replaced all 'double's +with 'float's in the benchmark +- Added a new main function that calls the old main function +- Annotated basicmath_main() as the entry point of the analysis +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2017-06-27 +- Introduce basicmath_init and basicmath_return functions. +- Add prefix basicmath_ to global variables. +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. + +2017-07-10 +- Fix possible stack buffer overflow caused by sizeof of incorrect type. + +2019-03-07 +-split basicmath into seperate files +-Add TACLeBench Header +-Add cosf.c as further benchmark +-put each benchmark into a seperate folder +-adjust the code formatting to the common TACLeBench code style diff --git a/targets/wasm-tacle/kernel/cosf/cosf.c b/targets/wasm-tacle/kernel/cosf/cosf.c new file mode 100755 index 0000000..b838546 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/cosf.c @@ -0,0 +1,86 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: cosf + + Author: Dustin Green + + Function: cosf performs calculations of the cosinus function + + Source: + + Original name: + + Changes: + + License: this code is FREE with no restrictions + +*/ + +#include "wcclibm.h" + + +/* + Forward declaration of functions +*/ + +void cosf_init( void ); +void cosf_main( void ); +int cosf_return( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +float cosf_solutions; + + +/* + Initialization function +*/ + +void cosf_init( void ) +{ + cosf_solutions = 0.0f; +} + + +/* + Return function +*/ + +int cosf_return( void ) +{ + int temp = cosf_solutions; + + if ( temp == -4 ) + return 0; + else + return -1; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) cosf_main( void ) +{ + float i; + _Pragma( "loopbound min 100 max 100" ) + for ( i = 0.0f; i < 10; i += 0.1f ) + cosf_solutions += basicmath___cosf( i ); +} + + +int main( void ) +{ + cosf_init(); + cosf_main(); + return cosf_return(); +} + diff --git a/targets/wasm-tacle/kernel/cosf/generated/default/cosf.wasm b/targets/wasm-tacle/kernel/cosf/generated/default/cosf.wasm new file mode 100755 index 0000000000000000000000000000000000000000..4657c3578fed1e43daf07f0800b1511fef1abc5b GIT binary patch literal 2627 zcmcguZHQE56h7~J@12jmyUk!>l1T4d{h=;9x}rO)XuI!BwyuH&)<5NXXZG$oyYuDD z9dpTbhEmcrl9@|U1S@C|MF|>3u^99xmJEalgZ@?YuMZ@GQrymYXFpuYFoWg}_x-r% zJm;L}oOACBP9@I(f05A8crIHQi?3%o=m2b)v7gs!upjWxYWw*_4exA%P4J~GWZR{( zGm>}0xni-DE>;Ue09wFcjBC1Xuo7d;&=|15gIbNrGi%Hm$YWu;<2?9uAdq+S#qv0Z zWw!k+x?nq{Qf}NHay-W_ySZYf0<6s~c;)d@Fv<v?mA-AEX}N^ijj&h(}Aoo2{K*j;e@HBA`Sd z6*_nP{l%hcXHHZZ>ARbe#9~b}n?Oo+Sz9oIBFad7u_zje&xsPH7-4<#{2LUkTJqGf zKde5V*zH4v#WWiWG#jQcE?NPKFX6|6f{TEn#aAvXC__HFQ&CvIMHC7{a!=lT5py}Z zn!`W`Q-p|MvqhLDA3kJhf=}TnXV}3p8Q#&s1VbJJ#9G3)c+(2uf@1J-JJdvmo7OA< z#d5p$BfHUfCNKSjNXuGJ| zFq}Ks*B98=O^O!d(>thh>V2&+u{M3n5c5}R_qBod{M7GWq`Tp#j$ChkfCKBen!v#^ zKl}uTci&mNt>MQ4h{xsYmwx<>T0=n!LluFKZ~bX+ke^)BnLaAuTHMvKfxSe`V(XB!~?PCLD0bHgW6ERkhvfM}h&el-stLgYUKech) zwToCR%YW(ZQ5E#m$2gok5!%}D8$LEl1Jj4dr)SIXKV=4;#oQ>CVusM?e7?`ZzSq={ z>)QS2h8mtAh~K&B|4oMem;5jp9bKhfK?1+CCl~`+51Dlak?B5&4EDnpulD1-ANJh9 z`BDi#t;5gapoH$Uggwtm*z%G@83}vO;j;@8j!xn8X$fb)Mw#yoyOTw16 zB)kw!B2E$>T9JgkE0gfnnj~T-p{FMaN4F;7^JEh7lW>9Q1t;%9TR2m!49DqQ!j1%B z$=qSboONcCvTUs z#SOzo^!CT(LU0L^V%rtZ$&A_RAmoWousK}9SvBL9E36%-8Mjh#hq}_^ zto@mEwcu4nCg&7JmUM59cgGWA^@jCTwY_l-3`RVsJmPxxu71K_x(ithc!*1CvWZW)qyyR9oLzV1Eq02q&{ROLzqci{j literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/cosf/generated/default/cosf.wat b/targets/wasm-tacle/kernel/cosf/generated/default/cosf.wat new file mode 100644 index 0000000..5b50a56 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/generated/default/cosf.wat @@ -0,0 +1,918 @@ +(module $cosf.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (type (;3;) (func (param f32 i32) (result i32))) + (type (;4;) (func (param f32) (result f32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $cosf_main (type 1) + (local f32) + i32.const 100 + i32.const 100 + call $__pragma_loopbound + f32.const 0x0p+0 (;=0;) + local.set 0 + loop ;; label = @1 + i32.const 0 + local.get 0 + call $basicmath___cosf + i32.const 0 + f32.load offset=1152 + f32.add + f32.store offset=1152 + local.get 0 + f32.const 0x1.99999ap-4 (;=0.1;) + f32.add + local.tee 0 + f32.const 0x1.4p+3 (;=10;) + f32.lt + br_if 0 (;@1;) + end) + (func $__original_main (type 2) (result i32) + (local f32 i32) + i32.const 0 + i32.const 0 + i32.store offset=1152 + call $cosf_main + block ;; label = @1 + block ;; label = @2 + i32.const 0 + f32.load offset=1152 + local.tee 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.trunc_f32_s + local.set 1 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 1 + end + i32.const -1 + i32.const 0 + local.get 1 + i32.const -4 + i32.ne + select) + (func $basicmath___ieee754_rem_pio2f (type 3) (param f32 i32) (result i32) + (local f32 i32 i32 i32 f32 f32 f32) + block ;; label = @1 + local.get 0 + f32.abs + local.tee 2 + i32.reinterpret_f32 + local.tee 3 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@1;) + local.get 1 + i32.const 0 + i32.store offset=4 + local.get 1 + local.get 0 + f32.store + i32.const 0 + return + end + local.get 0 + i32.reinterpret_f32 + local.set 4 + block ;; label = @1 + local.get 3 + i32.const 1075235811 + i32.gt_u + br_if 0 (;@1;) + local.get 3 + i32.const 2147483632 + i32.and + local.set 3 + block ;; label = @2 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + f32.const -0x1.921fp+0 (;=-1.57079;) + f32.add + local.set 0 + block ;; label = @3 + local.get 3 + i32.const 1070141392 + i32.eq + br_if 0 (;@3;) + local.get 1 + local.get 0 + f32.const -0x1.6a8886p-17 (;=-1.08043e-05;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const -0x1.6a8886p-17 (;=-1.08043e-05;) + f32.add + f32.store offset=4 + i32.const 1 + return + end + local.get 1 + local.get 0 + f32.const -0x1.6a88p-17 (;=-1.08043e-05;) + f32.add + local.tee 0 + f32.const -0x1.0b461p-34 (;=-6.0771e-11;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const -0x1.0b461p-34 (;=-6.0771e-11;) + f32.add + f32.store offset=4 + i32.const 1 + return + end + local.get 0 + f32.const 0x1.921fp+0 (;=1.57079;) + f32.add + local.set 0 + block ;; label = @2 + local.get 3 + i32.const 1070141392 + i32.eq + br_if 0 (;@2;) + local.get 1 + local.get 0 + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.add + f32.store offset=4 + i32.const -1 + return + end + local.get 1 + local.get 0 + f32.const 0x1.6a88p-17 (;=1.08043e-05;) + f32.add + local.tee 0 + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.add + f32.store offset=4 + i32.const -1 + return + end + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.const 1128861568 + i32.gt_u + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + local.get 2 + f32.const 0x1.45f308p-1 (;=0.63662;) + f32.mul + f32.const 0x1p-1 (;=0.5;) + f32.add + local.tee 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 5 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 5 + end + local.get 5 + f32.convert_i32_s + local.tee 6 + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.mul + local.set 7 + local.get 2 + local.get 6 + f32.const -0x1.921fp+0 (;=-1.57079;) + f32.mul + f32.add + local.set 0 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 5 + i32.const 31 + i32.gt_s + br_if 0 (;@5;) + local.get 3 + i32.const 2147483392 + i32.and + local.get 5 + i32.const 2 + i32.shl + i32.const 1020 + i32.add + i32.load + i32.ne + br_if 1 (;@4;) + end + local.get 1 + local.get 0 + local.get 7 + f32.sub + local.tee 2 + f32.store + local.get 3 + i32.const 23 + i32.shr_u + local.tee 3 + local.get 2 + i32.reinterpret_f32 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + i32.sub + i32.const 9 + i32.lt_s + br_if 1 (;@3;) + local.get 1 + local.get 0 + local.get 6 + f32.const 0x1.6a88p-17 (;=1.08043e-05;) + f32.mul + local.tee 2 + f32.sub + local.tee 8 + local.get 6 + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.mul + local.get 0 + local.get 8 + f32.sub + local.get 2 + f32.sub + f32.sub + local.tee 7 + f32.sub + local.tee 2 + f32.store + block ;; label = @5 + local.get 3 + local.get 2 + i32.reinterpret_f32 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + i32.sub + i32.const 26 + i32.ge_s + br_if 0 (;@5;) + local.get 8 + local.set 0 + br 2 (;@3;) + end + local.get 6 + f32.const 0x1.1a6264p-54 (;=6.12323e-17;) + f32.mul + local.get 8 + local.get 8 + local.get 6 + f32.const 0x1.0b46p-34 (;=6.07709e-11;) + f32.mul + local.tee 2 + f32.sub + local.tee 0 + f32.sub + local.get 2 + f32.sub + f32.sub + local.set 7 + end + local.get 1 + local.get 0 + local.get 7 + f32.sub + local.tee 2 + f32.store + end + local.get 1 + local.get 0 + local.get 2 + f32.sub + local.get 7 + f32.sub + local.tee 0 + f32.store offset=4 + local.get 4 + i32.const -1 + i32.gt_s + br_if 1 (;@1;) + local.get 1 + local.get 0 + f32.neg + f32.store offset=4 + local.get 1 + local.get 2 + f32.neg + f32.store + i32.const 0 + local.get 5 + i32.sub + return + end + local.get 1 + local.get 0 + local.get 0 + f32.sub + local.tee 0 + f32.store + local.get 1 + local.get 0 + f32.store offset=4 + i32.const 0 + local.set 5 + end + local.get 5) + (func $basicmath___cosf (type 4) (param f32) (result f32) + (local i32 i32 i32 i32 f32 f32 f32 f32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@2;) + local.get 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 4 + end + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + local.get 4 + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.set 0 + br 2 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 6 + block ;; label = @3 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 6 + f32.mul + local.get 0 + f32.const -0x0p+0 (;=-0;) + f32.mul + f32.add + f32.sub + f32.sub + local.set 0 + br 2 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 7 + f32.sub + local.get 5 + local.get 6 + f32.mul + local.get 0 + f32.const -0x0p+0 (;=-0;) + f32.mul + f32.add + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 7 + f32.sub + f32.sub + f32.add + local.set 0 + br 1 (;@1;) + end + block ;; label = @2 + local.get 2 + i32.const 2139095040 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + local.get 0 + f32.sub + local.set 0 + br 1 (;@1;) + end + local.get 0 + local.get 1 + i32.const 8 + i32.add + call $basicmath___ieee754_rem_pio2f + local.set 2 + local.get 1 + f32.load offset=8 + local.set 0 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.const 3 + i32.and + br_table 0 (;@5;) 1 (;@4;) 2 (;@3;) 3 (;@2;) 0 (;@5;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @5 + block ;; label = @6 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@6;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@5;) + end + i32.const -2147483648 + local.set 4 + end + local.get 1 + f32.load offset=12 + local.set 6 + block ;; label = @5 + local.get 3 + br_if 0 (;@5;) + local.get 4 + br_if 0 (;@5;) + f32.const 0x1p+0 (;=1;) + local.set 0 + br 4 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 7 + block ;; label = @5 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@5;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + f32.sub + f32.sub + local.set 0 + br 4 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 0 + br 3 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @4 + block ;; label = @5 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@5;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@4;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @4 + block ;; label = @5 + local.get 2 + br_if 0 (;@5;) + local.get 3 + i32.eqz + br_if 1 (;@4;) + end + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 5 + f32.neg + f32.mul + local.tee 6 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 5 + local.get 1 + f32.load offset=12 + local.tee 7 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 6 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 7 + f32.sub + f32.add + f32.sub + local.set 0 + end + local.get 0 + f32.neg + local.set 0 + br 2 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 4 + end + local.get 1 + f32.load offset=12 + local.set 6 + block ;; label = @3 + block ;; label = @4 + local.get 3 + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.set 5 + local.get 4 + i32.eqz + br_if 1 (;@3;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 7 + block ;; label = @4 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + f32.sub + f32.sub + f32.neg + local.set 0 + br 3 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 5 + end + local.get 5 + f32.neg + local.set 0 + br 1 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @2 + block ;; label = @3 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@2;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @2 + local.get 2 + br_if 0 (;@2;) + local.get 3 + i32.eqz + br_if 1 (;@1;) + end + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 5 + f32.neg + f32.mul + local.tee 6 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 5 + local.get 1 + f32.load offset=12 + local.tee 7 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 6 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 7 + f32.sub + f32.add + f32.sub + local.set 0 + end + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5264)) + (global (;1;) i32 (i32.const 1156)) + (global (;2;) i32 (i32.const 5264)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $cosf_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\00\0f\c9?\00\0fI@\00\cb\96@\00\0f\c9@\00S\fb@\00\cb\16A\00\ed/A\00\0fIA\001bA\00S{A\00:\8aA\00\cb\96A\00\5c\a3A\00\ed\afA\00~\bcA\00\0f\c9A\00\a0\d5A\001\e2A\00\c2\eeA\00S\fbA\00\f2\03B\00:\0aB\00\83\10B\00\cb\16B\00\14\1dB\00\5c#B\00\a5)B\00\ed/B\0066B\00~ 0) + return 0.0f; /* acos(1) = 0 */ + else + return basicmath_pi + + (float) 2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else if (ix > 0x3f800000) { /* |x| >= 1 */ + return (x - x) / (x - x); /* acos(|x|>1) is NaN */ + } + if (ix < 0x3f000000) { /* |x| < 0.5 */ + if (ix <= 0x23000000) + return basicmath_pio2_hi + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + return basicmath_pio2_hi - (x - (basicmath_pio2_lo - x * r)); + } else if (hx < 0) { /* x < -0.5 */ + z = (basicmath_one + x) * (float) 0.5f; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + s = basicmath___ieee754_sqrtf(z); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - (float) 2.0f * (s + w); + } else { /* x > 0.5 */ + int32_t idf; + z = (basicmath_one - x) * (float) 0.5f; + s = basicmath___ieee754_sqrtf(z); + df = s; + GET_FLOAT_WORD(idf, df); + SET_FLOAT_WORD(df, idf & 0xfffff000); + c = (z - df * df) / (s + df); + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + w = r * s + c; + return (float) 2.0f * (df + w); + } +} + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = + { + 1.0f, + 1.5f, +}, + basicmath_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + basicmath_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +float +basicmath___ieee754_powf(float x, float y) { + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD(hx, x); + GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return basicmath_one; + + /* x==+-1 */ + if (x == 1.0f) + return basicmath_one; + if (x == -1.0f && basicmath___isinff(y)) + return basicmath_one; + + /* +-NaN return x+y */ + if (ix > 0x7f800000 || iy > 0x7f800000) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return y - y; /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : basicmath_zero; + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return basicmath_one / x; + else + return x; + } + if (hy == 0x40000000) + return x * x; /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return basicmath___ieee754_sqrtf(x); + } + + ax = basicmath___fabsf(x); + /* special value of x */ + if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = basicmath_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) { + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + } else if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0) + return (x - x) / (x - x); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return (hy < 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + if (ix > 0x3f800007) + return (hy > 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + (k << 21)); + t_l = ax - (t_h - basicmath_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (basicmath_L1 + + s2 * (basicmath_L2 + + s2 * (basicmath_L3 + + s2 * (basicmath_L4 + + s2 * (basicmath_L5 + s2 * basicmath_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + GET_FLOAT_WORD(is, t_h); + SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD(is, p_h); + SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + basicmath_dp_h[k]) + t); + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - basicmath_dp_h[k]) - z_h); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD(is, y); + SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else if (j == 0x43000000) { /* if z == 128 */ + if (p_l + basicmath_ovt > z - p_h) + return s * basicmath_huge * basicmath_huge; /* overflow */ + } else if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else if ((u_int32_t) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD(is, t); + SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * basicmath_lg2_h; + v = (p_l - (t - p_h)) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (basicmath_P1 + + t * (basicmath_P2 + + t * (basicmath_P3 + t * (basicmath_P4 + t * basicmath_P5)))); + r = (z * t1) / (t1 - basicmath_two) - (w + z * w); + z = basicmath_one - (r - z); + GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = basicmath___scalbnf(z, n); /* subnormal output */ + else + SET_FLOAT_WORD(z, j); + return s * z; +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t +basicmath___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - basicmath_pio2_1t; + y[1] = (z - y[0]) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[0] = z - basicmath_pio2_2t; + y[1] = (z - y[0]) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + basicmath_pio2_1t; + y[1] = (z - y[0]) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[0] = z + basicmath_pio2_2t; + y[1] = (z - y[0]) + basicmath_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf(x); + n = (int32_t) (t * basicmath_invpio2 + basicmath_half); + fn = (float) n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && + (int32_t) (ix & 0xffffff00) != basicmath_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float +basicmath___ieee754_sqrtf(float x) { + float z; + int32_t sign = (int) 0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; /* sqrt(+-0) = +-0 */ + else if (ix < 0) + return (x - x) / (x - x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if (z >= basicmath_one) { + z = basicmath_one + basicmath_tiny; + if (z > basicmath_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + SET_FLOAT_WORD(z, ix); + return z; +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float +basicmath___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * (basicmath_C1 + + z * (basicmath_C2 + + z * (basicmath_C3 + + z * (basicmath_C4 + + z * (basicmath_C5 + z * basicmath_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return basicmath_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = basicmath_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float +basicmath___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + + z * (basicmath_S3 + + z * (basicmath_S4 + z * (basicmath_S5 + z * basicmath_S6))); + if (iy == 0) + return x + v * (basicmath_S1 + z * r); + else + return x - ((z * (basicmath_half * y - v * r) - y) - v * basicmath_S1); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +float +basicmath___copysignf(float x, float y) { + u_int32_t ix, iy; + GET_FLOAT_WORD(ix, x); + GET_FLOAT_WORD(iy, y); + SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float +basicmath___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return basicmath___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return basicmath___kernel_cosf(y[0], y[1]); + case 1: + return -basicmath___kernel_sinf(y[0], y[1], 1); + case 2: + return -basicmath___kernel_cosf(y[0], y[1]); + default: + return basicmath___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float +basicmath___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +int +basicmath___isinff(float x) { + int32_t ix, t; + GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +float +basicmath___scalbnf(float x, int n) { + int32_t k, ix; + GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; /* NaN or Inf */ + k = k + n; + if (n > 50000 || k > 0xfe) + return basicmath_huge * + basicmath___copysignf(basicmath_huge, x); /* overflow */ + if (n < -50000) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + if (k > 0) { /* normal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/wcclibm.h b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/wcclibm.h new file mode 100644 index 0000000..6ca3e8d --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/default/wcclibm.h @@ -0,0 +1,58 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +float basicmath___copysignf(float x, float y); +float basicmath___cosf(float x); +float basicmath___fabsf(float x); +float basicmath___ieee754_acosf(float x); +float basicmath___ieee754_powf(float x, float y); +int32_t basicmath___ieee754_rem_pio2f(float x, float *y); +float basicmath___ieee754_sqrtf(float x); +int basicmath___isinff(float x); +float basicmath___kernel_cosf(float x, float y); +float basicmath___kernel_sinf(float x, float y, int iy); +float basicmath___scalbnf(float x, int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/cosf.c b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/cosf.c new file mode 100644 index 0000000..c9a2c3a --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/cosf.c @@ -0,0 +1,94 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: cosf + + Author: Dustin Green + + Function: cosf performs calculations of the cosinus function + + Source: + + Original name: + + Changes: + + License: this code is FREE with no restrictions + +*/ + +#include "wcclibm.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "wcclibm.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void cosf_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cosf_main(void); +__attribute__((always_inline)) static inline int cosf_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +float cosf_solutions; + +/* + Initialization function +*/ + +__attribute__((always_inline)) static inline void +cosf_init(void) { + cosf_solutions = 0.0f; +} + +/* + Return function +*/ + +__attribute__((always_inline)) static inline int +cosf_return(void) { + int temp = cosf_solutions; + + if (temp == -4) + return 0; + else + return -1; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cosf_main(void) { + float i; + __pragma_loopbound(100, 100); + for (i = 0.0f; i < 10; i += 0.1f) + cosf_solutions += basicmath___cosf(i); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cosf_init(); + cosf_main(); + return cosf_return(); +} diff --git a/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/math_private.h b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/math_private.h new file mode 100644 index 0000000..29972f8 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/math_private.h @@ -0,0 +1,67 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.c b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.c new file mode 100644 index 0000000..00afd07 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.c @@ -0,0 +1,796 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_acosf(float x) { + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix == 0x3f800000) { /* |x|==1 */ + if (hx > 0) + return 0.0f; /* acos(1) = 0 */ + else + return basicmath_pi + + (float) 2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else if (ix > 0x3f800000) { /* |x| >= 1 */ + return (x - x) / (x - x); /* acos(|x|>1) is NaN */ + } + if (ix < 0x3f000000) { /* |x| < 0.5 */ + if (ix <= 0x23000000) + return basicmath_pio2_hi + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + return basicmath_pio2_hi - (x - (basicmath_pio2_lo - x * r)); + } else if (hx < 0) { /* x < -0.5 */ + z = (basicmath_one + x) * (float) 0.5f; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + s = basicmath___ieee754_sqrtf(z); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - (float) 2.0f * (s + w); + } else { /* x > 0.5 */ + int32_t idf; + z = (basicmath_one - x) * (float) 0.5f; + s = basicmath___ieee754_sqrtf(z); + df = s; + GET_FLOAT_WORD(idf, df); + SET_FLOAT_WORD(df, idf & 0xfffff000); + c = (z - df * df) / (s + df); + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + w = r * s + c; + return (float) 2.0f * (df + w); + } +} + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = + { + 1.0f, + 1.5f, +}, + basicmath_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + basicmath_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_powf(float x, float y) { + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD(hx, x); + GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return basicmath_one; + + /* x==+-1 */ + if (x == 1.0f) + return basicmath_one; + if (x == -1.0f && basicmath___isinff(y)) + return basicmath_one; + + /* +-NaN return x+y */ + if (ix > 0x7f800000 || iy > 0x7f800000) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return y - y; /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : basicmath_zero; + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return basicmath_one / x; + else + return x; + } + if (hy == 0x40000000) + return x * x; /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return basicmath___ieee754_sqrtf(x); + } + + ax = basicmath___fabsf(x); + /* special value of x */ + if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = basicmath_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) { + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + } else if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0) + return (x - x) / (x - x); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return (hy < 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + if (ix > 0x3f800007) + return (hy > 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + (k << 21)); + t_l = ax - (t_h - basicmath_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (basicmath_L1 + + s2 * (basicmath_L2 + + s2 * (basicmath_L3 + + s2 * (basicmath_L4 + + s2 * (basicmath_L5 + s2 * basicmath_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + GET_FLOAT_WORD(is, t_h); + SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD(is, p_h); + SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + basicmath_dp_h[k]) + t); + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - basicmath_dp_h[k]) - z_h); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD(is, y); + SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else if (j == 0x43000000) { /* if z == 128 */ + if (p_l + basicmath_ovt > z - p_h) + return s * basicmath_huge * basicmath_huge; /* overflow */ + } else if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else if ((u_int32_t) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD(is, t); + SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * basicmath_lg2_h; + v = (p_l - (t - p_h)) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (basicmath_P1 + + t * (basicmath_P2 + + t * (basicmath_P3 + t * (basicmath_P4 + t * basicmath_P5)))); + r = (z * t1) / (t1 - basicmath_two) - (w + z * w); + z = basicmath_one - (r - z); + GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = basicmath___scalbnf(z, n); /* subnormal output */ + else + SET_FLOAT_WORD(z, j); + return s * z; +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +__attribute__((always_inline)) static inline int32_t +basicmath___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - basicmath_pio2_1t; + y[1] = (z - y[0]) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[0] = z - basicmath_pio2_2t; + y[1] = (z - y[0]) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + basicmath_pio2_1t; + y[1] = (z - y[0]) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[0] = z + basicmath_pio2_2t; + y[1] = (z - y[0]) + basicmath_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf(x); + n = (int32_t) (t * basicmath_invpio2 + basicmath_half); + fn = (float) n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && + (int32_t) (ix & 0xffffff00) != basicmath_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_sqrtf(float x) { + float z; + int32_t sign = (int) 0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; /* sqrt(+-0) = +-0 */ + else if (ix < 0) + return (x - x) / (x - x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if (z >= basicmath_one) { + z = basicmath_one + basicmath_tiny; + if (z > basicmath_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + SET_FLOAT_WORD(z, ix); + return z; +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +__attribute__((always_inline)) static inline float +basicmath___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * (basicmath_C1 + + z * (basicmath_C2 + + z * (basicmath_C3 + + z * (basicmath_C4 + + z * (basicmath_C5 + z * basicmath_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return basicmath_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = basicmath_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +__attribute__((always_inline)) static inline float +basicmath___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + + z * (basicmath_S3 + + z * (basicmath_S4 + z * (basicmath_S5 + z * basicmath_S6))); + if (iy == 0) + return x + v * (basicmath_S1 + z * r); + else + return x - ((z * (basicmath_half * y - v * r) - y) - v * basicmath_S1); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +__attribute__((always_inline)) static inline float +basicmath___copysignf(float x, float y) { + u_int32_t ix, iy; + GET_FLOAT_WORD(ix, x); + GET_FLOAT_WORD(iy, y); + SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +__attribute__((always_inline)) static inline float +basicmath___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return basicmath___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return basicmath___kernel_cosf(y[0], y[1]); + case 1: + return -basicmath___kernel_sinf(y[0], y[1], 1); + case 2: + return -basicmath___kernel_cosf(y[0], y[1]); + default: + return basicmath___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +__attribute__((always_inline)) static inline float +basicmath___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +__attribute__((always_inline)) static inline int +basicmath___isinff(float x) { + int32_t ix, t; + GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +__attribute__((always_inline)) static inline float +basicmath___scalbnf(float x, int n) { + int32_t k, ix; + GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; /* NaN or Inf */ + k = k + n; + if (n > 50000 || k > 0xfe) + return basicmath_huge * + basicmath___copysignf(basicmath_huge, x); /* overflow */ + if (n < -50000) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + if (k > 0) { /* normal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.h b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.h new file mode 100644 index 0000000..e4bbb75 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/generated/modified_sources/inline/wcclibm.h @@ -0,0 +1,66 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +__attribute__((always_inline)) static inline float +basicmath___copysignf(float x, float y); +__attribute__((always_inline)) static inline float basicmath___cosf(float x); +__attribute__((always_inline)) static inline float basicmath___fabsf(float x); +__attribute__((always_inline)) static inline float +basicmath___ieee754_acosf(float x); +__attribute__((always_inline)) static inline float +basicmath___ieee754_powf(float x, float y); +__attribute__((always_inline)) static inline int32_t +basicmath___ieee754_rem_pio2f(float x, float *y); +__attribute__((always_inline)) static inline float +basicmath___ieee754_sqrtf(float x); +__attribute__((always_inline)) static inline int basicmath___isinff(float x); +__attribute__((always_inline)) static inline float +basicmath___kernel_cosf(float x, float y); +__attribute__((always_inline)) static inline float +basicmath___kernel_sinf(float x, float y, int iy); +__attribute__((always_inline)) static inline float basicmath___scalbnf(float x, + int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/cosf/math_private.h b/targets/wasm-tacle/kernel/cosf/math_private.h new file mode 100755 index 0000000..8dfd646 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/cosf/wcclibm.c b/targets/wasm-tacle/kernel/cosf/wcclibm.c new file mode 100755 index 0000000..d5fb606 --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/wcclibm.c @@ -0,0 +1,757 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +float basicmath___ieee754_acosf( float x ) +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return basicmath_pi + ( float )2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return basicmath_pio2_hi + + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + r = p / q; + return basicmath_pio2_hi - ( x - ( basicmath_pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( basicmath_one + x ) * ( float )0.5f; + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + s = basicmath___ieee754_sqrtf( z ); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( basicmath_one - x ) * ( float )0.5f; + s = basicmath___ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} + + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = {1.0f, 1.5f,}, + basicmath_dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + basicmath_dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +float basicmath___ieee754_powf( float x, float y ) +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return basicmath_one; + + /* x==+-1 */ + if ( x == 1.0f ) return basicmath_one; + if ( x == -1.0f && basicmath___isinff( y ) ) return basicmath_one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : basicmath_zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return basicmath_one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return basicmath___ieee754_sqrtf( x ); + } + + ax = basicmath___fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = basicmath_one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? basicmath_huge * basicmath_huge : + basicmath_tiny * basicmath_tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? basicmath_huge * basicmath_huge : + basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - basicmath_bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( basicmath_L1 + s2 * ( basicmath_L2 + s2 * + ( basicmath_L3 + s2 * ( basicmath_L4 + s2 * + ( basicmath_L5 + s2 * basicmath_L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + basicmath_dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - basicmath_dp_h[ k ] ) - z_h ); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + basicmath_ovt > z - p_h ) return s * basicmath_huge * + basicmath_huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * basicmath_tiny * + basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * basicmath_lg2_h; + v = ( p_l - ( t - p_h ) ) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( basicmath_P1 + t * ( basicmath_P2 + t * ( basicmath_P3 + t * + ( basicmath_P4 + t * basicmath_P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - basicmath_two ) - ( w + z * w ); + z = basicmath_one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = basicmath___scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} + + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t basicmath___ieee754_rem_pio2f( float x, float *y ) +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - basicmath_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - basicmath_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[ 0 ] = z - basicmath_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + basicmath_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[ 0 ] = z + basicmath_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + basicmath_pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf( x ); + n = ( int32_t ) ( t * basicmath_invpio2 + basicmath_half ); + fn = ( float )n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != basicmath_npio2_hw[n - 1] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[ 0 ] = y[ 1 ] = x - x; /* dummy initialization */ + return 0; +} + + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float basicmath___ieee754_sqrtf( float x ) +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 25 max 25" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if ( z >= basicmath_one ) { + z = basicmath_one + basicmath_tiny; + if ( z > basicmath_one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} + + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float basicmath___kernel_cosf( float x, float y ) +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * ( basicmath_C1 + z * ( basicmath_C2 + z * ( basicmath_C3 + z * + ( basicmath_C4 + z * ( basicmath_C5 + z * basicmath_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return basicmath_one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = basicmath_one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} + + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float basicmath___kernel_sinf( float x, float y, int iy ) +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + z * ( basicmath_S3 + z * ( basicmath_S4 + z * + ( basicmath_S5 + z * basicmath_S6 ) ) ); + if ( iy == 0 ) return x + v * ( basicmath_S1 + z * r ); + else return x - ( ( z * ( basicmath_half * y - v * r ) - y ) - v * + basicmath_S1 ); +} + + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +float basicmath___copysignf( float x, float y ) +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} + + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float basicmath___cosf( float x ) +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return basicmath___kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return basicmath___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -basicmath___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 2: + return -basicmath___kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return basicmath___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float basicmath___fabsf( float x ) +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +int basicmath___isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} + + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +float basicmath___scalbnf ( float x, int n ) +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return basicmath_huge * basicmath___copysignf( basicmath_huge, + x ); /* overflow */ + if ( n < -50000 ) + return basicmath_tiny * basicmath___copysignf( basicmath_tiny, + x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return basicmath_tiny * basicmath___copysignf( basicmath_tiny, + x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/cosf/wcclibm.h b/targets/wasm-tacle/kernel/cosf/wcclibm.h new file mode 100755 index 0000000..0f40abe --- /dev/null +++ b/targets/wasm-tacle/kernel/cosf/wcclibm.h @@ -0,0 +1,61 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, + basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, + basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +float basicmath___copysignf( float x, float y ); +float basicmath___cosf( float x ); +float basicmath___fabsf( float x ); +float basicmath___ieee754_acosf( float x ); +float basicmath___ieee754_powf( float x, float y ); +int32_t basicmath___ieee754_rem_pio2f( float x, float *y ); +float basicmath___ieee754_sqrtf( float x ); +int basicmath___isinff ( float x ); +float basicmath___kernel_cosf( float x, float y ); +float basicmath___kernel_sinf( float x, float y, int iy ); +float basicmath___scalbnf ( float x, int n ); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/countnegative/CMakeLists.txt b/targets/wasm-tacle/kernel/countnegative/CMakeLists.txt new file mode 100644 index 0000000..b24c1e5 --- /dev/null +++ b/targets/wasm-tacle/kernel/countnegative/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(countnegative) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/countnegative.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/countnegative.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/countnegative/ChangeLog.txt b/targets/wasm-tacle/kernel/countnegative/ChangeLog.txt new file mode 100755 index 0000000..0066c4d --- /dev/null +++ b/targets/wasm-tacle/kernel/countnegative/ChangeLog.txt @@ -0,0 +1,29 @@ +File: countnegative.c +Original provenience: Mälardalen benchmark suite, www.mrtc..... + +2015-11-26: +- Changed return type of InitSeed, Initialize, and Test to void + because the result was ignored anyway +- Prefixed all functions and global variables with "countnegative_" +- Added new function countnegative_return computing a checksum as + return value +- Separated initialization (called from countnegative_init) from + actual computation (called from countnegative_main), remove + pointless function countnegative_test afterwards +- Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + function, followed by main functions +- Eliminated definition of macro WORSTCASE and kept only the relevant + part of the related #ifdef block +- Removed comments that referred to MAXSIZE being 100 (instead of 20) +- Made countnegative_seed volatile +- Changed C++ style comments to C style comments +- Applied code formatting with astyle as in the example +- Added general TACLeBench header to beginning of source code + +2016-03-15: +- Return 0 if checksum is as expected, -1 otherwise +- Add entrypoint pragma + +2016-04-20: +- Cast "expected" return value to int for comparison diff --git a/targets/wasm-tacle/kernel/countnegative/countnegative.c b/targets/wasm-tacle/kernel/countnegative/countnegative.c new file mode 100755 index 0000000..5835cab --- /dev/null +++ b/targets/wasm-tacle/kernel/countnegative/countnegative.c @@ -0,0 +1,140 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: countnegative + + Author: unknown + + Function: Counts negative and non-negative numbers in a + matrix. Features nested loops, well-structured code. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cnt/cnt.c + + Changes: Changed split between initialization and computation + + License: May be used, modified, and re-distributed freely + +*/ + +/* + The dimension of the matrix +*/ +#define MAXSIZE 20 + +/* + Type definition for the matrix +*/ +typedef int matrix [ MAXSIZE ][ MAXSIZE ]; + +/* + Forward declaration of functions +*/ +void countnegative_initSeed( void ); +int countnegative_randomInteger( void ); +void countnegative_initialize( matrix ); +void countnegative_init( void ); +int countnegative_return( void ); +void countnegative_sum( matrix ); +void countnegative_main( void ); +int main( void ); + +/* + Globals +*/ +volatile int countnegative_seed; +matrix countnegative_array; +int countnegative_postotal, countnegative_negtotal; +int countnegative_poscnt, countnegative_negcnt; + +/* + Initializes the seed used in the random number generator. +*/ +void countnegative_initSeed ( void ) +{ + countnegative_seed = 0; +} + +/* + Generates random integers between 0 and 8094 +*/ +int countnegative_randomInteger( void ) +{ + countnegative_seed = ( ( countnegative_seed * 133 ) + 81 ) % 8095; + return countnegative_seed; +} + +/* + Initializes the given array with random integers. +*/ +void countnegative_initialize( matrix Array ) +{ + register int OuterIndex, InnerIndex; + + _Pragma( "loopbound min 20 max 20" ) + for ( OuterIndex = 0; OuterIndex < MAXSIZE; OuterIndex++ ) + _Pragma( "loopbound min 20 max 20" ) + for ( InnerIndex = 0; InnerIndex < MAXSIZE; InnerIndex++ ) + Array[ OuterIndex ][ InnerIndex ] = countnegative_randomInteger(); +} + +void countnegative_init( void ) +{ + countnegative_initSeed(); + countnegative_initialize( countnegative_array ); +} + +int countnegative_return( void ) +{ + int checksum = ( countnegative_postotal + + countnegative_poscnt + + countnegative_negtotal + + countnegative_negcnt ); + + return ( ( checksum == ( int )0x1778de ) ? 0 : -1 ); +} + +void countnegative_sum( matrix Array ) +{ + register int Outer, Inner; + + int Ptotal = 0; /* changed these to locals in order to drive worst case */ + int Ntotal = 0; + int Pcnt = 0; + int Ncnt = 0; + + _Pragma( "loopbound min 20 max 20" ) + for ( Outer = 0; Outer < MAXSIZE; Outer++ ) + _Pragma( "loopbound min 20 max 20" ) + for ( Inner = 0; Inner < MAXSIZE; Inner++ ) + if ( Array[ Outer ][ Inner ] >= 0 ) { + Ptotal += Array[ Outer ][ Inner ]; + Pcnt++; + } else { + Ntotal += Array[ Outer ][ Inner ]; + Ncnt++; + } + + countnegative_postotal = Ptotal; + countnegative_poscnt = Pcnt; + countnegative_negtotal = Ntotal; + countnegative_negcnt = Ncnt; +} + +/* + The main function +*/ +void _Pragma( "entrypoint" ) countnegative_main ( void ) +{ + countnegative_sum( countnegative_array ); +} + +int main( void ) +{ + countnegative_init(); + countnegative_main(); + + return ( countnegative_return() ); +} diff --git a/targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wasm b/targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c7566f65e8351f7a7762365a91b9592454135d62 GIT binary patch literal 2945 zcmds(zi-n(6vy8?|43UWq_h=6VsSbZRjpc71u?-*{Me9SzFv}RuCMq@JJ|RqBpG(Fy4)$+NCpeX0j(Q_-`zrFh_cuX-Tip zp`XB}Z*ThbfonKdLwe3Ya^67Yyn*W915GfoPPWT(Bz3Zrj!K<;NJq6!K9*1G`&SM9 zM7w!`y}ZDFUf>`vaF`ePniu$%7xmVl$_pIl1y1q;y-Lo-w~-gvteC(1vQD-t z#?LVu~S)Fc|?KuLoB?@;cvUe!jHN`BMnqAY% zXqY5*5b03unrdXAPIrb(_nu@%LQ-ZV$&mR_fcaQ}*)72A6=3!YFb4&g!vf6L0?fAp z%=ZG!j{?k50p_>>b5elmRR;Z&qZc*`Fq;LKtv;jEv;U@Nt$e0W^{m+q6X`D4vseLx zW{2qBn^YEnsnyBuz?4Vo{=k%{?Llf97l6J_1;pgbR2dofB|>4SAo?>e(wWJPOgVM? z=lLM{TtBs)?vz>P%*qnm^vloBaQlh@?@{%*D`0x6DK%m2i8ha|$6_&+c=#N3m>LR4 zb}Ah4j}nkv9?8Ni&x$SXSkHuVadak1Ty^x5EY*uzl`%iG+Lp(i%u$*`kiID9&2^S3 zOA*42@gVeDNmGOomZjMgQ6yRmjSiL{He?lv*>t$qo?5=KxV(7XoV&J^WbT!#aJL%s zuq|S?CU~5LB2wok+{BSJb0-n=RX2%w!x0N@$8T^any-dpO@zX0iiNlnh-iK+vfAE) HcpCo#7rdwo literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wat b/targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wat new file mode 100644 index 0000000..9cd2b2e --- /dev/null +++ b/targets/wasm-tacle/kernel/countnegative/generated/default/countnegative.wat @@ -0,0 +1,1044 @@ +(module $countnegative.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $countnegative_initialize (type 2) (param i32) + (local i32 i32 i32 i32) + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 2 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 3 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 4 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1600 + local.get 0 + local.get 2 + i32.store offset=1604 + local.get 0 + local.get 3 + i32.store offset=1608 + local.get 0 + local.get 4 + i32.store offset=1612 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1616 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1620 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1624 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1628 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1632 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1636 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1640 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1644 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1648 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1652 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1656 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1660 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1664 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1668 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + local.get 1 + i32.store offset=1672 + local.get 0 + i32.const 0 + i32.load offset=1024 + i32.store offset=1676) + (func $countnegative_sum (type 2) (param i32) + (local i32 i32 i32 i32 i32 i32 i32) + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const -1600 + local.set 1 + i32.const 0 + local.set 2 + i32.const 0 + local.set 3 + i32.const 0 + local.set 4 + i32.const 0 + local.set 5 + loop ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 0 + local.get 1 + i32.add + local.tee 6 + i32.const 1600 + i32.add + i32.load + local.tee 7 + i32.const 0 + i32.lt_s + br_if 0 (;@3;) + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + br 1 (;@2;) + end + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1604 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1608 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1612 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1616 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1620 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1624 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1628 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1632 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1636 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1640 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1644 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1648 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1652 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1656 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1660 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1664 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1668 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1672 + i32.add + i32.load + local.tee 7 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 7 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 7 + local.get 5 + i32.add + local.set 5 + end + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 1676 + i32.add + i32.load + local.tee 6 + i32.const -1 + i32.gt_s + br_if 0 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 6 + local.get 4 + i32.add + local.set 4 + br 1 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 6 + local.get 5 + i32.add + local.set 5 + end + local.get 1 + i32.const 80 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 0 + local.get 3 + i32.store offset=2644 + i32.const 0 + local.get 5 + i32.store offset=2640 + i32.const 0 + local.get 4 + i32.store offset=2648 + i32.const 0 + local.get 2 + i32.store offset=2652) + (func $countnegative_main (type 1) + i32.const 1040 + call $countnegative_sum) + (func $__original_main (type 3) (result i32) + i32.const 0 + i32.const 0 + i32.store offset=1024 + i32.const 1040 + call $countnegative_initialize + call $countnegative_main + i32.const -1 + i32.const 0 + i32.const 0 + i32.load offset=2644 + i32.const 0 + i32.load offset=2640 + i32.add + i32.const 0 + i32.load offset=2648 + i32.add + i32.const 0 + i32.load offset=2652 + i32.add + i32.const 1538270 + i32.ne + select) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 6752)) + (global (;1;) i32 (i32.const 2656)) + (global (;2;) i32 (i32.const 6752)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $countnegative_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/countnegative/generated/modified_sources/default/countnegative.c b/targets/wasm-tacle/kernel/countnegative/generated/modified_sources/default/countnegative.c new file mode 100644 index 0000000..d4b4ffe --- /dev/null +++ b/targets/wasm-tacle/kernel/countnegative/generated/modified_sources/default/countnegative.c @@ -0,0 +1,147 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: countnegative + + Author: unknown + + Function: Counts negative and non-negative numbers in a + matrix. Features nested loops, well-structured code. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cnt/cnt.c + + Changes: Changed split between initialization and computation + + License: May be used, modified, and re-distributed freely + +*/ + +/* + The dimension of the matrix +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define MAXSIZE 20 + +/* + Type definition for the matrix +*/ +typedef int matrix[MAXSIZE][MAXSIZE]; + +/* + Forward declaration of functions +*/ +void countnegative_initSeed(void); +int countnegative_randomInteger(void); +void countnegative_initialize(matrix); +void countnegative_init(void); +int countnegative_return(void); +void countnegative_sum(matrix); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +countnegative_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Globals +*/ +volatile int countnegative_seed; +matrix countnegative_array; +int countnegative_postotal, countnegative_negtotal; +int countnegative_poscnt, countnegative_negcnt; + +/* + Initializes the seed used in the random number generator. +*/ +void +countnegative_initSeed(void) { + countnegative_seed = 0; +} + +/* + Generates random integers between 0 and 8094 +*/ +int +countnegative_randomInteger(void) { + countnegative_seed = ((countnegative_seed * 133) + 81) % 8095; + return countnegative_seed; +} + +/* + Initializes the given array with random integers. +*/ +void +countnegative_initialize(matrix Array) { + register int OuterIndex, InnerIndex; + + __pragma_loopbound(20, 20); + for (OuterIndex = 0; OuterIndex < MAXSIZE; OuterIndex++) + __pragma_loopbound(20, 20); + for (InnerIndex = 0; InnerIndex < MAXSIZE; InnerIndex++) + Array[OuterIndex][InnerIndex] = countnegative_randomInteger(); +} + +void +countnegative_init(void) { + countnegative_initSeed(); + countnegative_initialize(countnegative_array); +} + +int +countnegative_return(void) { + int checksum = (countnegative_postotal + countnegative_poscnt + + countnegative_negtotal + countnegative_negcnt); + + return ((checksum == (int) 0x1778de) ? 0 : -1); +} + +void +countnegative_sum(matrix Array) { + register int Outer, Inner; + + int Ptotal = 0; /* changed these to locals in order to drive worst case */ + int Ntotal = 0; + int Pcnt = 0; + int Ncnt = 0; + + __pragma_loopbound(20, 20); + for (Outer = 0; Outer < MAXSIZE; Outer++) + _Pragma( + "loopbound min 20 max 20") for (Inner = 0; Inner < MAXSIZE; + Inner++) if (Array[Outer][Inner] >= + 0) { + Ptotal += Array[Outer][Inner]; + Pcnt++; + } + else { + Ntotal += Array[Outer][Inner]; + Ncnt++; + } + + countnegative_postotal = Ptotal; + countnegative_poscnt = Pcnt; + countnegative_negtotal = Ntotal; + countnegative_negcnt = Ncnt; +} + +/* + The main function +*/ +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +countnegative_main(void) { + countnegative_sum(countnegative_array); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + countnegative_init(); + countnegative_main(); + + return (countnegative_return()); +} diff --git a/targets/wasm-tacle/kernel/countnegative/generated/modified_sources/inline/countnegative.c b/targets/wasm-tacle/kernel/countnegative/generated/modified_sources/inline/countnegative.c new file mode 100644 index 0000000..7d52dc0 --- /dev/null +++ b/targets/wasm-tacle/kernel/countnegative/generated/modified_sources/inline/countnegative.c @@ -0,0 +1,157 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: countnegative + + Author: unknown + + Function: Counts negative and non-negative numbers in a + matrix. Features nested loops, well-structured code. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cnt/cnt.c + + Changes: Changed split between initialization and computation + + License: May be used, modified, and re-distributed freely + +*/ + +/* + The dimension of the matrix +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define MAXSIZE 20 + +/* + Type definition for the matrix +*/ +typedef int matrix[MAXSIZE][MAXSIZE]; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void countnegative_initSeed(void); +__attribute__((always_inline)) static inline int +countnegative_randomInteger(void); +__attribute__((always_inline)) static inline void + countnegative_initialize(matrix); +__attribute__((always_inline)) static inline void countnegative_init(void); +__attribute__((always_inline)) static inline int countnegative_return(void); +__attribute__((always_inline)) static inline void countnegative_sum(matrix); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +countnegative_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Globals +*/ +volatile int countnegative_seed; +matrix countnegative_array; +int countnegative_postotal, countnegative_negtotal; +int countnegative_poscnt, countnegative_negcnt; + +/* + Initializes the seed used in the random number generator. +*/ +__attribute__((always_inline)) static inline void +countnegative_initSeed(void) { + countnegative_seed = 0; +} + +/* + Generates random integers between 0 and 8094 +*/ +__attribute__((always_inline)) static inline int +countnegative_randomInteger(void) { + countnegative_seed = ((countnegative_seed * 133) + 81) % 8095; + return countnegative_seed; +} + +/* + Initializes the given array with random integers. +*/ +__attribute__((always_inline)) static inline void +countnegative_initialize(matrix Array) { + register int OuterIndex, InnerIndex; + + __pragma_loopbound(20, 20); + for (OuterIndex = 0; OuterIndex < MAXSIZE; OuterIndex++) + __pragma_loopbound(20, 20); + for (InnerIndex = 0; InnerIndex < MAXSIZE; InnerIndex++) + Array[OuterIndex][InnerIndex] = countnegative_randomInteger(); +} + +__attribute__((always_inline)) static inline void +countnegative_init(void) { + countnegative_initSeed(); + countnegative_initialize(countnegative_array); +} + +__attribute__((always_inline)) static inline int +countnegative_return(void) { + int checksum = (countnegative_postotal + countnegative_poscnt + + countnegative_negtotal + countnegative_negcnt); + + return ((checksum == (int) 0x1778de) ? 0 : -1); +} + +__attribute__((always_inline)) static inline void +countnegative_sum(matrix Array) { + register int Outer, Inner; + + int Ptotal = 0; /* changed these to locals in order to drive worst case */ + int Ntotal = 0; + int Pcnt = 0; + int Ncnt = 0; + + __pragma_loopbound(20, 20); + for (Outer = 0; Outer < MAXSIZE; Outer++) + _Pragma( + "loopbound min 20 max 20") for (Inner = 0; Inner < MAXSIZE; + Inner++) if (Array[Outer][Inner] >= + 0) { + Ptotal += Array[Outer][Inner]; + Pcnt++; + } + else { + Ntotal += Array[Outer][Inner]; + Ncnt++; + } + + countnegative_postotal = Ptotal; + countnegative_poscnt = Pcnt; + countnegative_negtotal = Ntotal; + countnegative_negcnt = Ncnt; +} + +/* + The main function +*/ +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +countnegative_main(void) { + countnegative_sum(countnegative_array); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + countnegative_init(); + countnegative_main(); + + return (countnegative_return()); +} diff --git a/targets/wasm-tacle/kernel/cubic/CMakeLists.txt b/targets/wasm-tacle/kernel/cubic/CMakeLists.txt new file mode 100644 index 0000000..a34492e --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(cubic) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/cubic.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/cubic.c" + "generated/modified_sources/default/wcclibm.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/cubic/ChangeLog.txt b/targets/wasm-tacle/kernel/cubic/ChangeLog.txt new file mode 100755 index 0000000..4735ade --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/ChangeLog.txt @@ -0,0 +1,78 @@ +Original provenience: MiBench benchmark suite, + http://wwweb.eecs.umich.edu/mibench + +2016-02-09: +- Added TACLeBench header +- Renamed benchmark from 'basicmath_small' to 'basicmath' +- Fixed a typo in code comments: 'soem' -> 'some' +- Removed unused variable 'n' from the main funcion +- Added variable 'double Y' to the main function and accumulated the results of + 'deg2rad(X)' and 'rad2deg(X)' in this variable so that the compiler warning + 'statement with no effect' is fixed. +- Removed conditionally compiled main (test) function from isqrt.c +- Removed conditionally compiled main (test) function from cubic.c +- Removed commented-out code +- Removed unused function, variable, macro and type declarations, structs and + unions +- Removed seemingly unnecessary empty lines +- Renamed memcpy.t to basicmath_libc.c +- Removed unused files: + rad2deg.c + sniptype.h + sniptype.h +- Created basicmath_libc.h and put declaration of basicmath_memcpy() in it +- Reorganized snipmath.h so that the following are in the given order just +after the header + - includes + - declarations of functions +- Reorganized sniptype.h so that the following are in the given order just +after the header + - macro definitions + - type definitions +- Removed duplicated copyright information from wcclibm.c +- Removed __STDC__ checks from wcclibm.c and used only ANSI style function + arguments +- Removed 'last modified' comments from files +- Removed mention 'use __kernel_rem_pio2f()' from comments of function + __ieee754_rem_pio2f() since it doesn't really use it. +- Removed math functions specialization macros from wcclibm.h and updated call + sites with explicit nameks of the functions. +- Removed '#define double float' from wcclibm.h and replaced all 'double's +with 'float's in the benchmark +- Added a new main function that calls the old main function +- Annotated basicmath_main() as the entry point of the analysis +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2017-06-27 +- Introduce basicmath_init and basicmath_return functions. +- Add prefix basicmath_ to global variables. +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. + +2017-07-10 +- Fix possible stack buffer overflow caused by sizeof of incorrect type. + +2019-03-07 +-split basicmath into seperate files +-Add TACLeBench Header +-put each benchmark into a seperate folder +-adjust the code formatting to the common TACLeBench code style diff --git a/targets/wasm-tacle/kernel/cubic/cubic.c b/targets/wasm-tacle/kernel/cubic/cubic.c new file mode 100755 index 0000000..f266394 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/cubic.c @@ -0,0 +1,156 @@ +/* +** CUBIC.C - Solve a cubic polynomial +** public domain by Ross Cottrell +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: cubic + + Author: Ross Cottrell + + Function: cubic solves some cubic functions + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + + +#include "wcclibm.h" +#include "snipmath.h" + + +/* + Forward declaration of functions +*/ + +void cubic_solveCubic( float a, float b, float c, float d, + int *solutions, float *x ); +void cubic_main( void ); +void cubic_init( void ); +int cubic_return( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +float cubic_a1, cubic_b1, cubic_c1, cubic_d1; +float cubic_a2, cubic_b2, cubic_c2, cubic_d2; +float cubic_a3, cubic_b3, cubic_c3, cubic_d3; +float cubic_a4, cubic_b4, cubic_c4, cubic_d4; +float cubic_x[3]; +float cubic_X, cubic_Y; +int cubic_solutions; +int cubic_checksum; + + +/* + Initialization function +*/ + +void cubic_init( void ) +{ + cubic_a1 = 1.0f, cubic_b1 = -10.5f, cubic_c1 = 32.0f, cubic_d1 = -30.0f; + cubic_a2 = 1.0f, cubic_b2 = -4.5f, cubic_c2 = 17.0f, cubic_d2 = -30.0f; + cubic_a3 = 1.0f, cubic_b3 = -3.5f, cubic_c3 = 22.0f, cubic_d3 = -31.0f; + cubic_a4 = 1.0f, cubic_b4 = -13.7f, cubic_c4 = 1.0f, cubic_d4 = -35.0f; + cubic_X = 0, cubic_Y = 0; + cubic_checksum = 0; +} + + +/* + Return function +*/ + +int cubic_return( void ) +{ + if ( cubic_checksum == 1051 ) + return 0; + else + return -1; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) cubic_main( void ) +{ + /* solve some cubic functions */ + /* should get 3 solutions: 2, 6 & 2.5 */ + cubic_solveCubic( cubic_a1, cubic_b1, cubic_c1, cubic_d1, &cubic_solutions, cubic_x ); + cubic_checksum += cubic_solutions; + cubic_solveCubic( cubic_a2, cubic_b2, cubic_c2, cubic_d2, &cubic_solutions, cubic_x ); + cubic_checksum += cubic_solutions; + cubic_solveCubic( cubic_a3, cubic_b3, cubic_c3, cubic_d3, &cubic_solutions, cubic_x ); + cubic_checksum += cubic_solutions; + cubic_solveCubic( cubic_a4, cubic_b4, cubic_c4, cubic_d4, &cubic_solutions, cubic_x ); + cubic_checksum += cubic_solutions; + + /* Now solve some random equations */ + _Pragma( "loopbound min 5 max 5" ) + for ( cubic_a1 = 1; cubic_a1 < 10; cubic_a1 += 2 ) { + _Pragma( "loopbound min 5 max 5" ) + for ( cubic_b1 = 10; cubic_b1 > 0; cubic_b1 -= 2 ) { + _Pragma( "loopbound min 7 max 7" ) + for ( cubic_c1 = 5; cubic_c1 < 15; cubic_c1 += 1.5f ) { + _Pragma( "loopbound min 5 max 5" ) + for ( cubic_d1 = -1; cubic_d1 > -11; cubic_d1 -= 2 ) { + cubic_solveCubic( cubic_a1, cubic_b1, cubic_c1, cubic_d1, &cubic_solutions, cubic_x ); + cubic_checksum += cubic_solutions; + } + } + } + } +} + + +void cubic_solveCubic( float a, float b, float c, float d, + int *solutions, float *x ) +{ + float a1 = b / a, a2 = c / a, a3 = d / a; + float Q = ( a1 * a1 - 3.0f * a2 ) / 9.0f; + float R = ( 2.0f * a1 * a1 * a1 - 9.0f * a1 * a2 + 27.0f * a3 ) / 54.0f; + float R2_Q3 = R * R - Q * Q * Q; + float theta; + + if ( R2_Q3 <= 0 ) { + *solutions = 3; + theta = basicmath___ieee754_acosf( R / basicmath___ieee754_sqrtf( Q * Q * Q ) ); + x[0] = -2.0f * basicmath___ieee754_sqrtf( Q ) * basicmath___cosf( + theta / 3.0f ) - a1 / 3.0f; + x[1] = -2.0f * basicmath___ieee754_sqrtf( Q ) * basicmath___cosf( ( + theta + 2.0f * PI ) / 3.0f ) - a1 / 3.0f; + x[2] = -2.0f * basicmath___ieee754_sqrtf( Q ) * basicmath___cosf( ( + theta + 4.0f * PI ) / 3.0f ) - a1 / 3.0f; + } else { + *solutions = 1; + x[0] = basicmath___ieee754_powf( basicmath___ieee754_sqrtf( R2_Q3 ) + + basicmath___fabsf( R ), 1 / 3.0f ); + x[0] += Q / x[0]; + x[0] *= ( R < 0.0f ) ? 1 : -1; + x[0] -= a1 / 3.0f; + } +} + + +int main( void ) +{ + cubic_init(); + cubic_main(); + return cubic_return(); +} diff --git a/targets/wasm-tacle/kernel/cubic/generated/default/cubic.wasm b/targets/wasm-tacle/kernel/cubic/generated/default/cubic.wasm new file mode 100755 index 0000000000000000000000000000000000000000..69a583eeab3e4ee07273ead03ba933b3c12eaafd GIT binary patch literal 7686 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 0; cubic_b1 -= 2) { + __pragma_loopbound(7, 7); + for (cubic_c1 = 5; cubic_c1 < 15; cubic_c1 += 1.5f) { + __pragma_loopbound(5, 5); + for (cubic_d1 = -1; cubic_d1 > -11; cubic_d1 -= 2) { + cubic_solveCubic(cubic_a1, cubic_b1, cubic_c1, cubic_d1, + &cubic_solutions, cubic_x); + cubic_checksum += cubic_solutions; + } + } + } + } +} + +void +cubic_solveCubic(float a, float b, float c, float d, int *solutions, float *x) { + float a1 = b / a, a2 = c / a, a3 = d / a; + float Q = (a1 * a1 - 3.0f * a2) / 9.0f; + float R = (2.0f * a1 * a1 * a1 - 9.0f * a1 * a2 + 27.0f * a3) / 54.0f; + float R2_Q3 = R * R - Q * Q * Q; + float theta; + + if (R2_Q3 <= 0) { + *solutions = 3; + theta = + basicmath___ieee754_acosf(R / basicmath___ieee754_sqrtf(Q * Q * Q)); + x[0] = -2.0f * basicmath___ieee754_sqrtf(Q) * + basicmath___cosf(theta / 3.0f) - + a1 / 3.0f; + x[1] = -2.0f * basicmath___ieee754_sqrtf(Q) * + basicmath___cosf((theta + 2.0f * PI) / 3.0f) - + a1 / 3.0f; + x[2] = -2.0f * basicmath___ieee754_sqrtf(Q) * + basicmath___cosf((theta + 4.0f * PI) / 3.0f) - + a1 / 3.0f; + } else { + *solutions = 1; + x[0] = basicmath___ieee754_powf( + basicmath___ieee754_sqrtf(R2_Q3) + basicmath___fabsf(R), 1 / 3.0f); + x[0] += Q / x[0]; + x[0] *= (R < 0.0f) ? 1 : -1; + x[0] -= a1 / 3.0f; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cubic_init(); + cubic_main(); + return cubic_return(); +} diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/math_private.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/math_private.h new file mode 100644 index 0000000..29972f8 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/math_private.h @@ -0,0 +1,67 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/pi.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/pi.h new file mode 100644 index 0000000..491095d --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/pi.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: pi + + Author: unknown + + Function: Header file for definition of pi + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef PI__H +#define PI__H + +#ifndef PI +#define PI 3.14f +#endif + +#endif /* PI__H */ diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/snipmath.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/snipmath.h new file mode 100644 index 0000000..26e73f6 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/snipmath.h @@ -0,0 +1,37 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: snipmath + + Author: unknown + + Function: Header file for SNIPPETS math functions and macros + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +/* + SNIPMATH.H - Header file for SNIPPETS math functions and macros +*/ + +#ifndef SNIPMATH__H +#define SNIPMATH__H + +#include "pi.h" +#include "wcclibm.h" + +struct int_sqrt { + unsigned short sqrt, frac; +}; + +#endif /* SNIPMATH__H */ diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.c b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.c new file mode 100644 index 0000000..ffe60ab --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.c @@ -0,0 +1,796 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +float +basicmath___ieee754_acosf(float x) { + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix == 0x3f800000) { /* |x|==1 */ + if (hx > 0) + return 0.0f; /* acos(1) = 0 */ + else + return basicmath_pi + + (float) 2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else if (ix > 0x3f800000) { /* |x| >= 1 */ + return (x - x) / (x - x); /* acos(|x|>1) is NaN */ + } + if (ix < 0x3f000000) { /* |x| < 0.5 */ + if (ix <= 0x23000000) + return basicmath_pio2_hi + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + return basicmath_pio2_hi - (x - (basicmath_pio2_lo - x * r)); + } else if (hx < 0) { /* x < -0.5 */ + z = (basicmath_one + x) * (float) 0.5f; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + s = basicmath___ieee754_sqrtf(z); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - (float) 2.0f * (s + w); + } else { /* x > 0.5 */ + int32_t idf; + z = (basicmath_one - x) * (float) 0.5f; + s = basicmath___ieee754_sqrtf(z); + df = s; + GET_FLOAT_WORD(idf, df); + SET_FLOAT_WORD(df, idf & 0xfffff000); + c = (z - df * df) / (s + df); + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + w = r * s + c; + return (float) 2.0f * (df + w); + } +} + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = + { + 1.0f, + 1.5f, +}, + basicmath_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + basicmath_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +float +basicmath___ieee754_powf(float x, float y) { + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD(hx, x); + GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return basicmath_one; + + /* x==+-1 */ + if (x == 1.0f) + return basicmath_one; + if (x == -1.0f && basicmath___isinff(y)) + return basicmath_one; + + /* +-NaN return x+y */ + if (ix > 0x7f800000 || iy > 0x7f800000) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return y - y; /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : basicmath_zero; + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return basicmath_one / x; + else + return x; + } + if (hy == 0x40000000) + return x * x; /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return basicmath___ieee754_sqrtf(x); + } + + ax = basicmath___fabsf(x); + /* special value of x */ + if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = basicmath_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) { + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + } else if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0) + return (x - x) / (x - x); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return (hy < 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + if (ix > 0x3f800007) + return (hy > 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + (k << 21)); + t_l = ax - (t_h - basicmath_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (basicmath_L1 + + s2 * (basicmath_L2 + + s2 * (basicmath_L3 + + s2 * (basicmath_L4 + + s2 * (basicmath_L5 + s2 * basicmath_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + GET_FLOAT_WORD(is, t_h); + SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD(is, p_h); + SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + basicmath_dp_h[k]) + t); + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - basicmath_dp_h[k]) - z_h); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD(is, y); + SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else if (j == 0x43000000) { /* if z == 128 */ + if (p_l + basicmath_ovt > z - p_h) + return s * basicmath_huge * basicmath_huge; /* overflow */ + } else if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else if ((u_int32_t) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD(is, t); + SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * basicmath_lg2_h; + v = (p_l - (t - p_h)) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (basicmath_P1 + + t * (basicmath_P2 + + t * (basicmath_P3 + t * (basicmath_P4 + t * basicmath_P5)))); + r = (z * t1) / (t1 - basicmath_two) - (w + z * w); + z = basicmath_one - (r - z); + GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = basicmath___scalbnf(z, n); /* subnormal output */ + else + SET_FLOAT_WORD(z, j); + return s * z; +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t +basicmath___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - basicmath_pio2_1t; + y[1] = (z - y[0]) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[0] = z - basicmath_pio2_2t; + y[1] = (z - y[0]) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + basicmath_pio2_1t; + y[1] = (z - y[0]) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[0] = z + basicmath_pio2_2t; + y[1] = (z - y[0]) + basicmath_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf(x); + n = (int32_t) (t * basicmath_invpio2 + basicmath_half); + fn = (float) n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && + (int32_t) (ix & 0xffffff00) != basicmath_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float +basicmath___ieee754_sqrtf(float x) { + float z; + int32_t sign = (int) 0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; /* sqrt(+-0) = +-0 */ + else if (ix < 0) + return (x - x) / (x - x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if (z >= basicmath_one) { + z = basicmath_one + basicmath_tiny; + if (z > basicmath_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + SET_FLOAT_WORD(z, ix); + return z; +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float +basicmath___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * (basicmath_C1 + + z * (basicmath_C2 + + z * (basicmath_C3 + + z * (basicmath_C4 + + z * (basicmath_C5 + z * basicmath_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return basicmath_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = basicmath_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float +basicmath___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + + z * (basicmath_S3 + + z * (basicmath_S4 + z * (basicmath_S5 + z * basicmath_S6))); + if (iy == 0) + return x + v * (basicmath_S1 + z * r); + else + return x - ((z * (basicmath_half * y - v * r) - y) - v * basicmath_S1); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +float +basicmath___copysignf(float x, float y) { + u_int32_t ix, iy; + GET_FLOAT_WORD(ix, x); + GET_FLOAT_WORD(iy, y); + SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float +basicmath___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return basicmath___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return basicmath___kernel_cosf(y[0], y[1]); + case 1: + return -basicmath___kernel_sinf(y[0], y[1], 1); + case 2: + return -basicmath___kernel_cosf(y[0], y[1]); + default: + return basicmath___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float +basicmath___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +int +basicmath___isinff(float x) { + int32_t ix, t; + GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +float +basicmath___scalbnf(float x, int n) { + int32_t k, ix; + GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; /* NaN or Inf */ + k = k + n; + if (n > 50000 || k > 0xfe) + return basicmath_huge * + basicmath___copysignf(basicmath_huge, x); /* overflow */ + if (n < -50000) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + if (k > 0) { /* normal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.h new file mode 100644 index 0000000..6ca3e8d --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/default/wcclibm.h @@ -0,0 +1,58 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +float basicmath___copysignf(float x, float y); +float basicmath___cosf(float x); +float basicmath___fabsf(float x); +float basicmath___ieee754_acosf(float x); +float basicmath___ieee754_powf(float x, float y); +int32_t basicmath___ieee754_rem_pio2f(float x, float *y); +float basicmath___ieee754_sqrtf(float x); +int basicmath___isinff(float x); +float basicmath___kernel_cosf(float x, float y); +float basicmath___kernel_sinf(float x, float y, int iy); +float basicmath___scalbnf(float x, int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/cubic.c b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/cubic.c new file mode 100644 index 0000000..95fc389 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/cubic.c @@ -0,0 +1,171 @@ +/* +** CUBIC.C - Solve a cubic polynomial +** public domain by Ross Cottrell +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: cubic + + Author: Ross Cottrell + + Function: cubic solves some cubic functions + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#include "snipmath.h" +#include "wcclibm.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "wcclibm.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +cubic_solveCubic(float a, float b, float c, float d, int *solutions, float *x); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cubic_main(void); +__attribute__((always_inline)) static inline void cubic_init(void); +__attribute__((always_inline)) static inline int cubic_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +float cubic_a1, cubic_b1, cubic_c1, cubic_d1; +float cubic_a2, cubic_b2, cubic_c2, cubic_d2; +float cubic_a3, cubic_b3, cubic_c3, cubic_d3; +float cubic_a4, cubic_b4, cubic_c4, cubic_d4; +float cubic_x[3]; +float cubic_X, cubic_Y; +int cubic_solutions; +int cubic_checksum; + +/* + Initialization function +*/ + +__attribute__((always_inline)) static inline void +cubic_init(void) { + cubic_a1 = 1.0f, cubic_b1 = -10.5f, cubic_c1 = 32.0f, cubic_d1 = -30.0f; + cubic_a2 = 1.0f, cubic_b2 = -4.5f, cubic_c2 = 17.0f, cubic_d2 = -30.0f; + cubic_a3 = 1.0f, cubic_b3 = -3.5f, cubic_c3 = 22.0f, cubic_d3 = -31.0f; + cubic_a4 = 1.0f, cubic_b4 = -13.7f, cubic_c4 = 1.0f, cubic_d4 = -35.0f; + cubic_X = 0, cubic_Y = 0; + cubic_checksum = 0; +} + +/* + Return function +*/ + +__attribute__((always_inline)) static inline int +cubic_return(void) { + if (cubic_checksum == 1051) + return 0; + else + return -1; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cubic_main(void) { + /* solve some cubic functions */ + /* should get 3 solutions: 2, 6 & 2.5 */ + cubic_solveCubic(cubic_a1, cubic_b1, cubic_c1, cubic_d1, &cubic_solutions, + cubic_x); + cubic_checksum += cubic_solutions; + cubic_solveCubic(cubic_a2, cubic_b2, cubic_c2, cubic_d2, &cubic_solutions, + cubic_x); + cubic_checksum += cubic_solutions; + cubic_solveCubic(cubic_a3, cubic_b3, cubic_c3, cubic_d3, &cubic_solutions, + cubic_x); + cubic_checksum += cubic_solutions; + cubic_solveCubic(cubic_a4, cubic_b4, cubic_c4, cubic_d4, &cubic_solutions, + cubic_x); + cubic_checksum += cubic_solutions; + + /* Now solve some random equations */ + __pragma_loopbound(5, 5); + for (cubic_a1 = 1; cubic_a1 < 10; cubic_a1 += 2) { + __pragma_loopbound(5, 5); + for (cubic_b1 = 10; cubic_b1 > 0; cubic_b1 -= 2) { + __pragma_loopbound(7, 7); + for (cubic_c1 = 5; cubic_c1 < 15; cubic_c1 += 1.5f) { + __pragma_loopbound(5, 5); + for (cubic_d1 = -1; cubic_d1 > -11; cubic_d1 -= 2) { + cubic_solveCubic(cubic_a1, cubic_b1, cubic_c1, cubic_d1, + &cubic_solutions, cubic_x); + cubic_checksum += cubic_solutions; + } + } + } + } +} + +__attribute__((always_inline)) static inline void +cubic_solveCubic(float a, float b, float c, float d, int *solutions, float *x) { + float a1 = b / a, a2 = c / a, a3 = d / a; + float Q = (a1 * a1 - 3.0f * a2) / 9.0f; + float R = (2.0f * a1 * a1 * a1 - 9.0f * a1 * a2 + 27.0f * a3) / 54.0f; + float R2_Q3 = R * R - Q * Q * Q; + float theta; + + if (R2_Q3 <= 0) { + *solutions = 3; + theta = + basicmath___ieee754_acosf(R / basicmath___ieee754_sqrtf(Q * Q * Q)); + x[0] = -2.0f * basicmath___ieee754_sqrtf(Q) * + basicmath___cosf(theta / 3.0f) - + a1 / 3.0f; + x[1] = -2.0f * basicmath___ieee754_sqrtf(Q) * + basicmath___cosf((theta + 2.0f * PI) / 3.0f) - + a1 / 3.0f; + x[2] = -2.0f * basicmath___ieee754_sqrtf(Q) * + basicmath___cosf((theta + 4.0f * PI) / 3.0f) - + a1 / 3.0f; + } else { + *solutions = 1; + x[0] = basicmath___ieee754_powf( + basicmath___ieee754_sqrtf(R2_Q3) + basicmath___fabsf(R), 1 / 3.0f); + x[0] += Q / x[0]; + x[0] *= (R < 0.0f) ? 1 : -1; + x[0] -= a1 / 3.0f; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cubic_init(); + cubic_main(); + return cubic_return(); +} diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/math_private.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/math_private.h new file mode 100644 index 0000000..29972f8 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/math_private.h @@ -0,0 +1,67 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/pi.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/pi.h new file mode 100644 index 0000000..491095d --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/pi.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: pi + + Author: unknown + + Function: Header file for definition of pi + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef PI__H +#define PI__H + +#ifndef PI +#define PI 3.14f +#endif + +#endif /* PI__H */ diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/snipmath.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/snipmath.h new file mode 100644 index 0000000..26e73f6 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/snipmath.h @@ -0,0 +1,37 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: snipmath + + Author: unknown + + Function: Header file for SNIPPETS math functions and macros + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +/* + SNIPMATH.H - Header file for SNIPPETS math functions and macros +*/ + +#ifndef SNIPMATH__H +#define SNIPMATH__H + +#include "pi.h" +#include "wcclibm.h" + +struct int_sqrt { + unsigned short sqrt, frac; +}; + +#endif /* SNIPMATH__H */ diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.c b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.c new file mode 100644 index 0000000..00afd07 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.c @@ -0,0 +1,796 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_acosf(float x) { + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix == 0x3f800000) { /* |x|==1 */ + if (hx > 0) + return 0.0f; /* acos(1) = 0 */ + else + return basicmath_pi + + (float) 2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else if (ix > 0x3f800000) { /* |x| >= 1 */ + return (x - x) / (x - x); /* acos(|x|>1) is NaN */ + } + if (ix < 0x3f000000) { /* |x| < 0.5 */ + if (ix <= 0x23000000) + return basicmath_pio2_hi + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + return basicmath_pio2_hi - (x - (basicmath_pio2_lo - x * r)); + } else if (hx < 0) { /* x < -0.5 */ + z = (basicmath_one + x) * (float) 0.5f; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + s = basicmath___ieee754_sqrtf(z); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - (float) 2.0f * (s + w); + } else { /* x > 0.5 */ + int32_t idf; + z = (basicmath_one - x) * (float) 0.5f; + s = basicmath___ieee754_sqrtf(z); + df = s; + GET_FLOAT_WORD(idf, df); + SET_FLOAT_WORD(df, idf & 0xfffff000); + c = (z - df * df) / (s + df); + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + w = r * s + c; + return (float) 2.0f * (df + w); + } +} + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = + { + 1.0f, + 1.5f, +}, + basicmath_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + basicmath_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_powf(float x, float y) { + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD(hx, x); + GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return basicmath_one; + + /* x==+-1 */ + if (x == 1.0f) + return basicmath_one; + if (x == -1.0f && basicmath___isinff(y)) + return basicmath_one; + + /* +-NaN return x+y */ + if (ix > 0x7f800000 || iy > 0x7f800000) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return y - y; /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : basicmath_zero; + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return basicmath_one / x; + else + return x; + } + if (hy == 0x40000000) + return x * x; /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return basicmath___ieee754_sqrtf(x); + } + + ax = basicmath___fabsf(x); + /* special value of x */ + if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = basicmath_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) { + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + } else if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0) + return (x - x) / (x - x); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return (hy < 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + if (ix > 0x3f800007) + return (hy > 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + (k << 21)); + t_l = ax - (t_h - basicmath_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (basicmath_L1 + + s2 * (basicmath_L2 + + s2 * (basicmath_L3 + + s2 * (basicmath_L4 + + s2 * (basicmath_L5 + s2 * basicmath_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + GET_FLOAT_WORD(is, t_h); + SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD(is, p_h); + SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + basicmath_dp_h[k]) + t); + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - basicmath_dp_h[k]) - z_h); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD(is, y); + SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else if (j == 0x43000000) { /* if z == 128 */ + if (p_l + basicmath_ovt > z - p_h) + return s * basicmath_huge * basicmath_huge; /* overflow */ + } else if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else if ((u_int32_t) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD(is, t); + SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * basicmath_lg2_h; + v = (p_l - (t - p_h)) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (basicmath_P1 + + t * (basicmath_P2 + + t * (basicmath_P3 + t * (basicmath_P4 + t * basicmath_P5)))); + r = (z * t1) / (t1 - basicmath_two) - (w + z * w); + z = basicmath_one - (r - z); + GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = basicmath___scalbnf(z, n); /* subnormal output */ + else + SET_FLOAT_WORD(z, j); + return s * z; +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +__attribute__((always_inline)) static inline int32_t +basicmath___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - basicmath_pio2_1t; + y[1] = (z - y[0]) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[0] = z - basicmath_pio2_2t; + y[1] = (z - y[0]) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + basicmath_pio2_1t; + y[1] = (z - y[0]) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[0] = z + basicmath_pio2_2t; + y[1] = (z - y[0]) + basicmath_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf(x); + n = (int32_t) (t * basicmath_invpio2 + basicmath_half); + fn = (float) n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && + (int32_t) (ix & 0xffffff00) != basicmath_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_sqrtf(float x) { + float z; + int32_t sign = (int) 0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; /* sqrt(+-0) = +-0 */ + else if (ix < 0) + return (x - x) / (x - x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if (z >= basicmath_one) { + z = basicmath_one + basicmath_tiny; + if (z > basicmath_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + SET_FLOAT_WORD(z, ix); + return z; +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +__attribute__((always_inline)) static inline float +basicmath___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * (basicmath_C1 + + z * (basicmath_C2 + + z * (basicmath_C3 + + z * (basicmath_C4 + + z * (basicmath_C5 + z * basicmath_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return basicmath_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = basicmath_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +__attribute__((always_inline)) static inline float +basicmath___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + + z * (basicmath_S3 + + z * (basicmath_S4 + z * (basicmath_S5 + z * basicmath_S6))); + if (iy == 0) + return x + v * (basicmath_S1 + z * r); + else + return x - ((z * (basicmath_half * y - v * r) - y) - v * basicmath_S1); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +__attribute__((always_inline)) static inline float +basicmath___copysignf(float x, float y) { + u_int32_t ix, iy; + GET_FLOAT_WORD(ix, x); + GET_FLOAT_WORD(iy, y); + SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +__attribute__((always_inline)) static inline float +basicmath___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return basicmath___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return basicmath___kernel_cosf(y[0], y[1]); + case 1: + return -basicmath___kernel_sinf(y[0], y[1], 1); + case 2: + return -basicmath___kernel_cosf(y[0], y[1]); + default: + return basicmath___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +__attribute__((always_inline)) static inline float +basicmath___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +__attribute__((always_inline)) static inline int +basicmath___isinff(float x) { + int32_t ix, t; + GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +__attribute__((always_inline)) static inline float +basicmath___scalbnf(float x, int n) { + int32_t k, ix; + GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; /* NaN or Inf */ + k = k + n; + if (n > 50000 || k > 0xfe) + return basicmath_huge * + basicmath___copysignf(basicmath_huge, x); /* overflow */ + if (n < -50000) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + if (k > 0) { /* normal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.h b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.h new file mode 100644 index 0000000..e4bbb75 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/generated/modified_sources/inline/wcclibm.h @@ -0,0 +1,66 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +__attribute__((always_inline)) static inline float +basicmath___copysignf(float x, float y); +__attribute__((always_inline)) static inline float basicmath___cosf(float x); +__attribute__((always_inline)) static inline float basicmath___fabsf(float x); +__attribute__((always_inline)) static inline float +basicmath___ieee754_acosf(float x); +__attribute__((always_inline)) static inline float +basicmath___ieee754_powf(float x, float y); +__attribute__((always_inline)) static inline int32_t +basicmath___ieee754_rem_pio2f(float x, float *y); +__attribute__((always_inline)) static inline float +basicmath___ieee754_sqrtf(float x); +__attribute__((always_inline)) static inline int basicmath___isinff(float x); +__attribute__((always_inline)) static inline float +basicmath___kernel_cosf(float x, float y); +__attribute__((always_inline)) static inline float +basicmath___kernel_sinf(float x, float y, int iy); +__attribute__((always_inline)) static inline float basicmath___scalbnf(float x, + int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/cubic/math_private.h b/targets/wasm-tacle/kernel/cubic/math_private.h new file mode 100755 index 0000000..8dfd646 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/cubic/pi.h b/targets/wasm-tacle/kernel/cubic/pi.h new file mode 100755 index 0000000..908b428 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/pi.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: pi + + Author: unknown + + Function: Header file for definition of pi + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef PI__H +#define PI__H + +#ifndef PI +#define PI 3.14f +#endif + + +#endif /* PI__H */ diff --git a/targets/wasm-tacle/kernel/cubic/snipmath.h b/targets/wasm-tacle/kernel/cubic/snipmath.h new file mode 100755 index 0000000..70fd3fa --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/snipmath.h @@ -0,0 +1,40 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: snipmath + + Author: unknown + + Function: Header file for SNIPPETS math functions and macros + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +/* + SNIPMATH.H - Header file for SNIPPETS math functions and macros +*/ + +#ifndef SNIPMATH__H +#define SNIPMATH__H + +#include "wcclibm.h" +#include "pi.h" + + +struct int_sqrt { + unsigned short sqrt, + frac; +}; + + +#endif /* SNIPMATH__H */ diff --git a/targets/wasm-tacle/kernel/cubic/wcclibm.c b/targets/wasm-tacle/kernel/cubic/wcclibm.c new file mode 100755 index 0000000..d5fb606 --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/wcclibm.c @@ -0,0 +1,757 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +float basicmath___ieee754_acosf( float x ) +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return basicmath_pi + ( float )2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return basicmath_pio2_hi + + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + r = p / q; + return basicmath_pio2_hi - ( x - ( basicmath_pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( basicmath_one + x ) * ( float )0.5f; + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + s = basicmath___ieee754_sqrtf( z ); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( basicmath_one - x ) * ( float )0.5f; + s = basicmath___ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} + + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = {1.0f, 1.5f,}, + basicmath_dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + basicmath_dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +float basicmath___ieee754_powf( float x, float y ) +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return basicmath_one; + + /* x==+-1 */ + if ( x == 1.0f ) return basicmath_one; + if ( x == -1.0f && basicmath___isinff( y ) ) return basicmath_one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : basicmath_zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return basicmath_one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return basicmath___ieee754_sqrtf( x ); + } + + ax = basicmath___fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = basicmath_one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? basicmath_huge * basicmath_huge : + basicmath_tiny * basicmath_tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? basicmath_huge * basicmath_huge : + basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - basicmath_bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( basicmath_L1 + s2 * ( basicmath_L2 + s2 * + ( basicmath_L3 + s2 * ( basicmath_L4 + s2 * + ( basicmath_L5 + s2 * basicmath_L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + basicmath_dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - basicmath_dp_h[ k ] ) - z_h ); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + basicmath_ovt > z - p_h ) return s * basicmath_huge * + basicmath_huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * basicmath_tiny * + basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * basicmath_lg2_h; + v = ( p_l - ( t - p_h ) ) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( basicmath_P1 + t * ( basicmath_P2 + t * ( basicmath_P3 + t * + ( basicmath_P4 + t * basicmath_P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - basicmath_two ) - ( w + z * w ); + z = basicmath_one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = basicmath___scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} + + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t basicmath___ieee754_rem_pio2f( float x, float *y ) +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - basicmath_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - basicmath_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[ 0 ] = z - basicmath_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + basicmath_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[ 0 ] = z + basicmath_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + basicmath_pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf( x ); + n = ( int32_t ) ( t * basicmath_invpio2 + basicmath_half ); + fn = ( float )n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != basicmath_npio2_hw[n - 1] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[ 0 ] = y[ 1 ] = x - x; /* dummy initialization */ + return 0; +} + + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float basicmath___ieee754_sqrtf( float x ) +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 25 max 25" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if ( z >= basicmath_one ) { + z = basicmath_one + basicmath_tiny; + if ( z > basicmath_one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} + + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float basicmath___kernel_cosf( float x, float y ) +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * ( basicmath_C1 + z * ( basicmath_C2 + z * ( basicmath_C3 + z * + ( basicmath_C4 + z * ( basicmath_C5 + z * basicmath_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return basicmath_one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = basicmath_one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} + + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float basicmath___kernel_sinf( float x, float y, int iy ) +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + z * ( basicmath_S3 + z * ( basicmath_S4 + z * + ( basicmath_S5 + z * basicmath_S6 ) ) ); + if ( iy == 0 ) return x + v * ( basicmath_S1 + z * r ); + else return x - ( ( z * ( basicmath_half * y - v * r ) - y ) - v * + basicmath_S1 ); +} + + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +float basicmath___copysignf( float x, float y ) +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} + + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float basicmath___cosf( float x ) +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return basicmath___kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return basicmath___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -basicmath___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 2: + return -basicmath___kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return basicmath___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float basicmath___fabsf( float x ) +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +int basicmath___isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} + + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +float basicmath___scalbnf ( float x, int n ) +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return basicmath_huge * basicmath___copysignf( basicmath_huge, + x ); /* overflow */ + if ( n < -50000 ) + return basicmath_tiny * basicmath___copysignf( basicmath_tiny, + x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return basicmath_tiny * basicmath___copysignf( basicmath_tiny, + x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/cubic/wcclibm.h b/targets/wasm-tacle/kernel/cubic/wcclibm.h new file mode 100755 index 0000000..0f40abe --- /dev/null +++ b/targets/wasm-tacle/kernel/cubic/wcclibm.h @@ -0,0 +1,61 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, + basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, + basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +float basicmath___copysignf( float x, float y ); +float basicmath___cosf( float x ); +float basicmath___fabsf( float x ); +float basicmath___ieee754_acosf( float x ); +float basicmath___ieee754_powf( float x, float y ); +int32_t basicmath___ieee754_rem_pio2f( float x, float *y ); +float basicmath___ieee754_sqrtf( float x ); +int basicmath___isinff ( float x ); +float basicmath___kernel_cosf( float x, float y ); +float basicmath___kernel_sinf( float x, float y, int iy ); +float basicmath___scalbnf ( float x, int n ); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/deg2rad/CMakeLists.txt b/targets/wasm-tacle/kernel/deg2rad/CMakeLists.txt new file mode 100644 index 0000000..13c0be0 --- /dev/null +++ b/targets/wasm-tacle/kernel/deg2rad/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(deg2rad) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/deg2rad.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/deg2rad.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/deg2rad/ChangeLog.txt b/targets/wasm-tacle/kernel/deg2rad/ChangeLog.txt new file mode 100755 index 0000000..4735ade --- /dev/null +++ b/targets/wasm-tacle/kernel/deg2rad/ChangeLog.txt @@ -0,0 +1,78 @@ +Original provenience: MiBench benchmark suite, + http://wwweb.eecs.umich.edu/mibench + +2016-02-09: +- Added TACLeBench header +- Renamed benchmark from 'basicmath_small' to 'basicmath' +- Fixed a typo in code comments: 'soem' -> 'some' +- Removed unused variable 'n' from the main funcion +- Added variable 'double Y' to the main function and accumulated the results of + 'deg2rad(X)' and 'rad2deg(X)' in this variable so that the compiler warning + 'statement with no effect' is fixed. +- Removed conditionally compiled main (test) function from isqrt.c +- Removed conditionally compiled main (test) function from cubic.c +- Removed commented-out code +- Removed unused function, variable, macro and type declarations, structs and + unions +- Removed seemingly unnecessary empty lines +- Renamed memcpy.t to basicmath_libc.c +- Removed unused files: + rad2deg.c + sniptype.h + sniptype.h +- Created basicmath_libc.h and put declaration of basicmath_memcpy() in it +- Reorganized snipmath.h so that the following are in the given order just +after the header + - includes + - declarations of functions +- Reorganized sniptype.h so that the following are in the given order just +after the header + - macro definitions + - type definitions +- Removed duplicated copyright information from wcclibm.c +- Removed __STDC__ checks from wcclibm.c and used only ANSI style function + arguments +- Removed 'last modified' comments from files +- Removed mention 'use __kernel_rem_pio2f()' from comments of function + __ieee754_rem_pio2f() since it doesn't really use it. +- Removed math functions specialization macros from wcclibm.h and updated call + sites with explicit nameks of the functions. +- Removed '#define double float' from wcclibm.h and replaced all 'double's +with 'float's in the benchmark +- Added a new main function that calls the old main function +- Annotated basicmath_main() as the entry point of the analysis +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2017-06-27 +- Introduce basicmath_init and basicmath_return functions. +- Add prefix basicmath_ to global variables. +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. + +2017-07-10 +- Fix possible stack buffer overflow caused by sizeof of incorrect type. + +2019-03-07 +-split basicmath into seperate files +-Add TACLeBench Header +-put each benchmark into a seperate folder +-adjust the code formatting to the common TACLeBench code style diff --git a/targets/wasm-tacle/kernel/deg2rad/deg2rad.c b/targets/wasm-tacle/kernel/deg2rad/deg2rad.c new file mode 100755 index 0000000..5fc1817 --- /dev/null +++ b/targets/wasm-tacle/kernel/deg2rad/deg2rad.c @@ -0,0 +1,90 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: deg2rad + + Author: unknown + + Function: deg2rad performs conversion of degree to radiant + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#include "pi.h" + +#define deg2rad(d) ((d)*PI/180) + + +/* + Forward declaration of functions +*/ + +void deg2rad_init( void ); +void deg2rad_main( void ); +int deg2rad_return( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +float deg2rad_X, deg2rad_Y; + + +/* + Initialization function +*/ + +void deg2rad_init( void ) +{ + deg2rad_X = 0; + deg2rad_Y = 0; +} + + +/* + Return function +*/ + +int deg2rad_return( void ) +{ + int temp = deg2rad_Y; + + if ( temp == 1133 ) + return 0; + else + return -1; + +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) deg2rad_main( void ) +{ + /* convert some rads to degrees */ + _Pragma( "loopbound min 361 max 361" ) + for ( deg2rad_X = 0.0f; deg2rad_X <= 360.0f; deg2rad_X += 1.0f ) + deg2rad_Y += deg2rad( deg2rad_X ); +} + + +int main( void ) +{ + deg2rad_init(); + deg2rad_main(); + return deg2rad_return(); +} diff --git a/targets/wasm-tacle/kernel/deg2rad/generated/default/deg2rad.wasm b/targets/wasm-tacle/kernel/deg2rad/generated/default/deg2rad.wasm new file mode 100755 index 0000000000000000000000000000000000000000..0cc8e845534c2679b2947a1575a3ddab572c53c4 GIT binary patch literal 637 zcmZ`#F>ljA6n^jQrfHlgRge%8i`}UZC2Fgxv=gx+1T3(Cn9${HzZ$Fd**c#g9x6wO zp%M$K;6LyKSef`W427bEPj{cbyZ3!}ABZwTFg5H(b(+YF=>gin0B~R}Sku4) zOk>0DVwdwmi8vEGX`UBBUdaf+vMoerZ()ImTNVO#?pO`_U-q2_{Ht!e8od3g)5$2y zRn6cY=O2tK7e$fQJQ7-PMQI+EfIX60)kU624b09&BEjnMn>!>U3mwkiktlc|O0rn* zCt3`g1+q*3H#5DvG6g<7WS_1K@L=A4%|mPE;{4a&XS1({IG%rV;o1X30jwTh@3s4n zIUj)IgA1oOvj*ZRTeULI8-|zI_(u3-bJ)W5;qJ%QlFiuc)^-m*x4tjmJ{cIj?;iHi z@!OXzJp+u6i~gVP)B6rAZ7DK>K|iASNQr3L27@nb7;UoVw^`$Vb7Pxv-X>-ZInPxR zCsL$qVta&OxKfMog0HhB1!p^j%A+bIRbt=3kjj#xNl;_|bx=uNxnU|~JUTp^9!?** z`$q@Wnm&F2&xcy5m^42pp({nDJ?>>ys+0F3t!O;VDlLMPCUKevA}z;5MdzeQhBVQ2 OLFKqxCb68*QvU=8F>F{%hb!4b)&$Goon%J+8!R-q8jI8M2(7hg# z{a2f{$!%eu5u+gn5nRf^$VVcOVIFuq^4s1H1JZadH47IH6T0q zn#ZRQe{LfeGAmKBhJmwD!J^d!-&!y}$Sfaa#{WvjTB>Y?;v*^3JluwfGF_lQMxaX|xGL4k==s*9D`kq=DAyaE>m<;M1& literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/fac/generated/default/fac.wat b/targets/wasm-tacle/kernel/fac/generated/default/fac.wat new file mode 100644 index 0000000..b120e85 --- /dev/null +++ b/targets/wasm-tacle/kernel/fac/generated/default/fac.wat @@ -0,0 +1,170 @@ +(module $fac.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $fac_main (type 1) + (local i32 i32 i32 i32 i32 i32 i32) + i32.const 6 + i32.const 6 + call $__pragma_loopbound + block ;; label = @1 + i32.const 0 + i32.load offset=1028 + i32.const 0 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + i32.load offset=1024 + local.set 0 + i32.const 0 + local.set 1 + i32.const 0 + local.set 2 + loop ;; label = @2 + i32.const 1 + local.set 3 + block ;; label = @3 + local.get 2 + local.tee 4 + i32.eqz + br_if 0 (;@3;) + i32.const 1 + local.set 3 + local.get 4 + local.set 2 + block ;; label = @4 + local.get 4 + i32.const 8 + i32.lt_u + br_if 0 (;@4;) + i32.const 0 + local.get 4 + i32.const -8 + i32.and + i32.sub + local.set 5 + i32.const 1 + local.set 3 + i32.const 0 + local.set 6 + loop ;; label = @5 + local.get 3 + local.get 4 + local.get 6 + i32.add + local.tee 2 + i32.mul + local.get 2 + i32.const -1 + i32.add + i32.mul + local.get 2 + i32.const -2 + i32.add + i32.mul + local.get 2 + i32.const -3 + i32.add + i32.mul + local.get 2 + i32.const -4 + i32.add + i32.mul + local.get 2 + i32.const -5 + i32.add + i32.mul + local.get 2 + i32.const -6 + i32.add + i32.mul + local.get 2 + i32.const -7 + i32.add + i32.mul + local.set 3 + local.get 5 + local.get 6 + i32.const -8 + i32.add + local.tee 6 + i32.ne + br_if 0 (;@5;) + end + local.get 4 + local.get 6 + i32.add + local.set 2 + end + local.get 4 + i32.const 7 + i32.and + i32.eqz + br_if 0 (;@3;) + local.get 1 + i32.const 7 + i32.and + local.set 6 + loop ;; label = @4 + local.get 3 + local.get 2 + i32.mul + local.set 3 + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@4;) + end + end + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const 1 + i32.add + local.set 2 + local.get 0 + local.get 3 + i32.add + local.set 0 + local.get 4 + i32.const 0 + i32.load offset=1028 + i32.lt_s + br_if 0 (;@2;) + end + i32.const 0 + local.get 0 + i32.store offset=1024 + end) + (func $__original_main (type 2) (result i32) + i32.const 0 + i32.const 5 + i32.store offset=1028 + i32.const 0 + i32.const 0 + i32.store offset=1024 + call $fac_main + i32.const 0 + i32.load offset=1024 + i32.const -154 + i32.add) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5136)) + (global (;1;) i32 (i32.const 1032)) + (global (;2;) i32 (i32.const 5136)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $fac_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/fac/generated/modified_sources/default/fac.c b/targets/wasm-tacle/kernel/fac/generated/modified_sources/default/fac.c new file mode 100644 index 0000000..eb8df9d --- /dev/null +++ b/targets/wasm-tacle/kernel/fac/generated/modified_sources/default/fac.c @@ -0,0 +1,94 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: fac + + Author: unknown + + Function: fac is a program to calculate factorials. + This program computes the sum of the factorials + from zero to five. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/fac/fac.c + + Changes: CS 2006/05/19: Changed loop bound from constant to variable. + + License: public domain + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int fac_fac(int n); +void fac_init(); +int fac_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fac_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); +/* + Declaration of global variables +*/ + +int fac_s; +volatile int fac_n; + +/* + Initialization- and return-value-related functions +*/ + +void +fac_init() { + fac_s = 0; + fac_n = 5; +} + +int +fac_return() { + int expected_result = 154; + return fac_s - expected_result; +} + +/* + Arithmetic math functions +*/ + +int +fac_fac(int n) { + if (n == 0) + return 1; + else + return (n * fac_fac(n - 1)); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fac_main() { + int i; + + __pragma_loopbound(6, 6); + for (i = 0; i <= fac_n; i++) { + _Pragma("marker recursivecall") fac_s += fac_fac(i); + _Pragma("flowrestriction 1*fac_fac <= 6*recursivecall") + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fac_init(); + fac_main(); + + return (fac_return()); +} diff --git a/targets/wasm-tacle/kernel/fac/generated/modified_sources/inline/fac.c b/targets/wasm-tacle/kernel/fac/generated/modified_sources/inline/fac.c new file mode 100644 index 0000000..bdc6aaa --- /dev/null +++ b/targets/wasm-tacle/kernel/fac/generated/modified_sources/inline/fac.c @@ -0,0 +1,102 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: fac + + Author: unknown + + Function: fac is a program to calculate factorials. + This program computes the sum of the factorials + from zero to five. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/fac/fac.c + + Changes: CS 2006/05/19: Changed loop bound from constant to variable. + + License: public domain + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int fac_fac(int n); +__attribute__((always_inline)) static inline void fac_init(); +__attribute__((always_inline)) static inline int fac_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fac_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); +/* + Declaration of global variables +*/ + +int fac_s; +volatile int fac_n; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +fac_init() { + fac_s = 0; + fac_n = 5; +} + +__attribute__((always_inline)) static inline int +fac_return() { + int expected_result = 154; + return fac_s - expected_result; +} + +/* + Arithmetic math functions +*/ + +__attribute__((always_inline)) static inline int +fac_fac(int n) { + if (n == 0) + return 1; + else + return (n * fac_fac(n - 1)); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fac_main() { + int i; + + __pragma_loopbound(6, 6); + for (i = 0; i <= fac_n; i++) { + _Pragma("marker recursivecall") fac_s += fac_fac(i); + _Pragma("flowrestriction 1*fac_fac <= 6*recursivecall") + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fac_init(); + fac_main(); + + return (fac_return()); +} diff --git a/targets/wasm-tacle/kernel/fft/CMakeLists.txt b/targets/wasm-tacle/kernel/fft/CMakeLists.txt new file mode 100644 index 0000000..6f29d0d --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(fft) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/fft.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/fft.c" + "generated/modified_sources/default/fft_input.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/fft/ChangeLog.txt b/targets/wasm-tacle/kernel/fft/ChangeLog.txt new file mode 100755 index 0000000..6cd415d --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/ChangeLog.txt @@ -0,0 +1,35 @@ +File: fft.c +Original provenience: DSP-Stone + +2016-01-05: +- Rename fft_1024_13 to fft +- Add generic TACLeBench header +- Remove original header from DSP-Stone group +- Remove duplicate semicolon in bit_reduct +- Introduce fft_init (initialization of input) + and fft_main (main entry point) +- Update comments about separate input-data file +- Add entry-point annotation to fft_main +- Introduce non-zero return value and make input_data global to reduce impact of + compiler optimizations +- Prefix the functions pin_down, float2frac, convert, exp2f and the global + variables input_data, inputfract, input, twidtable with fft_ +2016-03-02: +- Fix undefined behavior due to unsequenced modification and access +- Reformat large arrays using clang-format to 80 columns +- Apply code formatting with astyle as in the example +2016-04-25: +- Remove unnecessary braces in fft_bit_reduct +- Add void parameter to fft_float2fract +- Add all forward declarations +- Move input data into separate file +- Compute check sum and compare it to expected value in return function +2016-04-26: +- Remove unnecessary braces in fft_pin_down +- Avoid constant propagation through addition with volatile variable + on each element of fft_input_data, fft_twidtable, and fft_input +- Reorganize functions into logical segments in main source file +- Replace usage of macros by their expanded values: + STORAGE_CLASS => register, TYPE => int +2017-07-10: +- Fix loop bounds to avoid buffer overflow. diff --git a/targets/wasm-tacle/kernel/fft/fft.c b/targets/wasm-tacle/kernel/fft/fft.c new file mode 100755 index 0000000..7aff936 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/fft.c @@ -0,0 +1,333 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: fft + + Author: Juan Martinez Velarde + + Function: benchmarking of an integer stage scaling FFT + To avoid errors caused by overflow and bit growth, + the input data is scaled. Bit growth occurs potentially + at butterfly operations, which involve a complex + multiplication, a complex addition and a complex + subtraction. Maximal bit growth from butterfly input + to butterfly output is two bits. + + The input data includes enough extra sign bits, called + guard bits, to ensure that bit growth never results in + overflow (Rabiner and Gold, 1975). Data can grow by a + maximum factor of 2.4 from butterfly input to output + (two bits of grow). However, a data value cannot grow by + maximum amount in two consecutive stages. + The number of guard bits necessary to compensate the + maximum bit growth in an N-point FFT is (log_2 (N))+1). + + In a 16-point FFT (requires 4 stages), each of the + input samples should contain 5 guard bits. The input + data is then restricted to 10 bits, one sign bit and + nine magnitude bits, in order to prevent an + overflow from the integer multiplication with the + precalculed twiddle coefficients. + + Another method to compensate bit growth is to scale the + outputs down by a factor of two unconditionally after + each stage. This approach is called unconditional scaling + + Initially, 2 guard bits are included in the input data to + accomodate the maximum overflow in the first stage. + In each butterfly of a stage calculation, the data can + grow into the guard bits. To prevent overflow in the next + stage, the guard bits are replaced before the next stage is + executed by shifting the entire block of data one bit + to the right. + + Input data should not be restricted to a 1.9 format. + Input data can be represented in a 1.13 format,that is + 14 significant bits, one sign and 13 magnitude bits. In + the FFT calculation, the data loses a total of (log2 N) -1 + bits because of shifting. Unconditional scaling results + in the same number of bits lost as in the input data scaling. + However, it produces more precise results because the + FFT starts with more precise input data. The tradeoff is + a slower FFT calculation because of the extra cycles needed + to shift the output of each stage. + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: fft_1024_13 + (merged main1024_bit_reduct and fft_bit_reduct from DSP-Stone) + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +#define N_FFT 1024 +#define NUMBER_OF_BITS 13 /* fract format 1.NUMBER_OF_BITS = 1.13 */ + +#define BITS_PER_TWID 13 /* bits per twiddle coefficient */ +#define SHIFT BITS_PER_TWID /* fractional shift after each multiplication */ + +/* + Forward declaration of functions +*/ + +float fft_exp2f( float x ); +float fft_modff( float x, float *intpart ); +int fft_convert( float value ); +void fft_bit_reduct( register int *int_pointer ); +void fft_pin_down( int input_data[ ] ); +void fft_init( void ); +void fft_main( void ); +int fft_return( void ); +int main( void ); + +/* + Forward declaration of global variables +*/ + +int fft_input_data[ 2 * N_FFT ]; + +/* precalculated twiddle factors + for an integer 1024 point FFT + in format 1.13 => table twidtable[ 2*(N_FFT-1) ] ; */ +extern int fft_twidtable[ 2046 ]; + +/* 1024 real values as input data in float format */ +extern float fft_input[ 1024 ]; + +/* will hold the transformed data */ +int fft_inputfract[ N_FFT ]; + + +/* + Algorithm core function +*/ + +void fft_bit_reduct( register int *int_pointer ) +{ + register int i, j = 0 ; + register int tmpr, max = 2, m, n = N_FFT << 1 ; + + /* do the bit reversal scramble of the input data */ + _Pragma( "loopbound min 1024 max 1024" ) + for ( i = 0; i < ( n - 1 ) ; i += 2 ) { + if ( j > i ) { + tmpr = *( int_pointer + j ) ; + *( int_pointer + j ) = *( int_pointer + i ) ; + *( int_pointer + i ) = tmpr ; + + tmpr = *( int_pointer + j + 1 ) ; + *( int_pointer + j + 1 ) = *( int_pointer + i + 1 ) ; + *( int_pointer + i + 1 ) = tmpr ; + } + + m = N_FFT; + + _Pragma( "loopbound min 0 max 10" ) + while ( m >= 2 && j >= m ) { + j -= m ; + m >>= 1; + } + j += m ; + } + + { + register int *data_pointer = &fft_twidtable[ 0 ] ; + register int *p, *q ; + register int tmpi, fr = 0, level, k, l ; + + _Pragma( "loopbound min 10 max 10" ) + while ( n > max ) { + level = max << 1; + + _Pragma( "loopbound min 1 max 512" ) + for ( m = 1; m < max; m += 2 ) { + l = *( data_pointer + fr ); + k = *( data_pointer + fr + 1 ) ; + fr += 2 ; + + _Pragma( "loopbound min 1 max 512" ) + for ( i = m; i <= n; i += level ) { + j = i + max; + p = int_pointer + j; + q = int_pointer + i; + + tmpr = l * *( p - 1 ); + tmpr -= ( k * *p ); + + tmpi = l * *p; + tmpi += ( k * *( p - 1 ) ); + + tmpr = tmpr >> SHIFT ; + tmpi = tmpi >> SHIFT ; + + *( p - 1 ) = *( q - 1 ) - tmpr ; + *p = *q - tmpi ; + + *( q - 1 ) += tmpr ; + *q += tmpi ; + } + } + + /* implement unconditional bit reduction */ + + { + register int f; + + p = int_pointer; + + _Pragma( "loopbound min 2048 max 2048" ) + for ( f = 0 ; f < 2 * N_FFT; f++ ) { + *p = *p >> 1; + p++; + } + } + + max = level; + } + } +} + + +/* + Initialization- and return-value-related functions +*/ + +/* conversion function to 1.NUMBER_OF_BITS format */ +float fft_exp2f( float x ) +{ + int i; + float ret = 2.0f; + + _Pragma( "loopbound min 13 max 13" ) + for ( i = 1; i < x; ++i ) + ret *= 2.0f; + + return ret; +} + + +float fft_modff( float x, float *intpart ) +{ + if ( intpart ) { + *intpart = ( int )x; + return x - *intpart; + } else + return x; +} + + +/* conversion function to 1.NUMBER_OF_BITS format */ +int fft_convert( float value ) +{ + float man, t_val, frac, m, exponent = NUMBER_OF_BITS; + int rnd_val; + unsigned long int_val; + unsigned long pm_val; + + m = fft_exp2f( exponent + 1 ) - 1; + + t_val = value * m ; + frac = fft_modff( t_val, &man ); + if ( frac < 0.0f ) { + rnd_val = ( -1 ); + if ( frac > -0.5f ) rnd_val = 0; + } else { + rnd_val = 1; + if ( frac < 0.5f ) rnd_val = 0; + } + int_val = (long)man + (long)rnd_val; + + pm_val = int_val ; + return ( ( int ) ( pm_val ) ) ; +} + + +void fft_float2fract( void ) +{ + float f ; + int j, i ; + + _Pragma( "loopbound min 1024 max 1024" ) + for ( j = 0 ; j < N_FFT ; j++ ) { + f = fft_input[ j ]; + i = fft_convert( f ); + fft_inputfract[ j ] = i; + } +} + + +void fft_pin_down( int input_data[ ] ) +{ + /* conversion from input to a 1.13 format */ + fft_float2fract() ; + + int *pd, *ps, f; + + pd = &input_data[ 0 ]; + ps = &fft_inputfract[ 0 ]; + + _Pragma( "loopbound min 1024 max 1024" ) + for ( f = 0; f < N_FFT; f++ ) { + *pd++ = *ps++ ; /* fill in with real data */ + *pd++ = 0 ; /* imaginary data is equal zero */ + } +} + + +void fft_init( void ) +{ + int i; + volatile int x = 0; + + fft_pin_down( &fft_input_data[ 0 ] ); + + /* avoid constant propagation of input values */ + _Pragma( "loopbound min 2046 max 2046" ) + for ( i = 0; i < 2 * ( N_FFT - 1 ); i++ ) { + fft_input_data[ i ] += x; + fft_twidtable[ i ] += x; + } + _Pragma( "loopbound min 2 max 2" ) + for ( ; i < 2 * N_FFT; i++ ) + fft_input_data[ i ] += x; + +} + + +int fft_return( void ) +{ + int check_sum = 0; + int i = 0; + + _Pragma( "loopbound min 2048 max 2048" ) + for ( i = 0; i < 2 * N_FFT; ++i ) + check_sum += fft_input_data[ i ]; + + return check_sum != 3968; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) fft_main( void ) +{ + fft_bit_reduct( &fft_input_data[ 0 ] ); +} + + +int main( void ) +{ + fft_init(); + + fft_main(); + + return fft_return(); +} diff --git a/targets/wasm-tacle/kernel/fft/fft_input.c b/targets/wasm-tacle/kernel/fft/fft_input.c new file mode 100755 index 0000000..c3a3491 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/fft_input.c @@ -0,0 +1,322 @@ + +int fft_twidtable[ 2046 ] = { + 8192, 0, 8192, 0, 0, -8192, 8192, 0, 5792, -5792, 0, + -8191, -5792, -5792, 8192, 0, 7568, -3134, 5792, -5792, 3134, -7568, + 0, -8192, -3134, -7568, -5792, -5792, -7568, -3134, 8192, 0, 8034, + -1598, 7568, -3134, 6811, -4551, 5792, -5792, 4551, -6811, 3134, -7568, + 1598, -8034, 0, -8192, -1598, -8034, -3134, -7568, -4551, -6811, -5792, + -5792, -6811, -4551, -7568, -3134, -8034, -1598, 8192, 0, 8152, -802, + 8034, -1598, 7839, -2378, 7568, -3134, 7224, -3861, 6811, -4551, 6332, + -5196, 5792, -5792, 5196, -6332, 4551, -6811, 3861, -7224, 3134, -7568, + 2378, -7839, 1598, -8034, 802, -8152, 0, -8191, -802, -8152, -1598, + -8034, -2378, -7839, -3134, -7568, -3861, -7224, -4551, -6811, -5196, -6332, + -5792, -5792, -6332, -5196, -6811, -4551, -7224, -3861, -7568, -3134, -7839, + -2378, -8034, -1598, -8152, -802, 8192, 0, 8182, -401, 8152, -802, + 8103, -1202, 8034, -1598, 7946, -1990, 7839, -2378, 7713, -2759, 7568, + -3134, 7405, -3502, 7224, -3861, 7026, -4211, 6811, -4551, 6579, -4879, + 6332, -5196, 6069, -5501, 5792, -5792, 5501, -6069, 5196, -6332, 4879, + -6579, 4551, -6811, 4211, -7026, 3861, -7224, 3502, -7405, 3134, -7568, + 2759, -7713, 2378, -7839, 1990, -7946, 1598, -8034, 1202, -8103, 802, + -8152, 401, -8182, 0, -8192, -401, -8182, -802, -8152, -1202, -8103, + -1598, -8034, -1990, -7946, -2378, -7839, -2759, -7713, -3134, -7568, -3502, + -7405, -3861, -7224, -4211, -7026, -4551, -6811, -4879, -6579, -5196, -6332, + -5501, -6069, -5792, -5792, -6069, -5501, -6332, -5196, -6579, -4879, -6811, + -4551, -7026, -4211, -7224, -3861, -7405, -3502, -7568, -3134, -7713, -2759, + -7839, -2378, -7946, -1990, -8034, -1598, -8103, -1202, -8152, -802, -8182, + -401, 8192, 0, 8189, -201, 8182, -401, 8169, -602, 8152, -802, + 8130, -1002, 8103, -1202, 8071, -1400, 8034, -1598, 7992, -1794, 7946, + -1990, 7895, -2184, 7839, -2378, 7778, -2569, 7713, -2759, 7643, -2948, + 7568, -3134, 7489, -3319, 7405, -3502, 7317, -3683, 7224, -3861, 7127, + -4037, 7026, -4211, 6921, -4382, 6811, -4551, 6697, -4717, 6579, -4879, + 6458, -5039, 6332, -5196, 6203, -5350, 6069, -5501, 5933, -5648, 5792, + -5792, 5648, -5933, 5501, -6069, 5350, -6203, 5196, -6332, 5039, -6458, + 4879, -6579, 4717, -6697, 4551, -6811, 4382, -6921, 4211, -7026, 4037, + -7127, 3861, -7224, 3683, -7317, 3502, -7405, 3319, -7489, 3134, -7568, + 2948, -7643, 2759, -7713, 2569, -7778, 2378, -7839, 2184, -7895, 1990, + -7946, 1794, -7992, 1598, -8034, 1400, -8071, 1202, -8103, 1002, -8130, + 802, -8152, 602, -8169, 401, -8182, 201, -8189, 0, -8192, -201, + -8189, -401, -8182, -602, -8169, -802, -8152, -1002, -8130, -1202, -8103, + -1400, -8071, -1598, -8034, -1794, -7992, -1990, -7946, -2184, -7895, -2378, + -7839, -2569, -7778, -2759, -7713, -2948, -7643, -3134, -7568, -3319, -7489, + -3502, -7405, -3683, -7317, -3861, -7224, -4037, -7127, -4211, -7026, -4382, + -6921, -4551, -6811, -4717, -6697, -4879, -6579, -5039, -6458, -5196, -6332, + -5350, -6203, -5501, -6069, -5648, -5933, -5792, -5792, -5933, -5648, -6069, + -5501, -6203, -5350, -6332, -5196, -6458, -5039, -6579, -4879, -6697, -4717, + -6811, -4551, -6921, -4382, -7026, -4211, -7127, -4037, -7224, -3861, -7317, + -3683, -7405, -3502, -7489, -3319, -7568, -3134, -7643, -2948, -7713, -2759, + -7778, -2569, -7839, -2378, -7895, -2184, -7946, -1990, -7992, -1794, -8034, + -1598, -8071, -1400, -8103, -1202, -8130, -1002, -8152, -802, -8169, -602, + -8182, -401, -8189, -201, 8192, 0, 8191, -100, 8189, -201, 8186, + -301, 8182, -401, 8176, -502, 8169, -602, 8161, -702, 8152, -802, + 8142, -902, 8130, -1002, 8117, -1102, 8103, -1202, 8087, -1301, 8071, + -1400, 8053, -1499, 8034, -1598, 8014, -1696, 7992, -1794, 7970, -1892, + 7946, -1990, 7921, -2087, 7895, -2184, 7867, -2281, 7839, -2378, 7809, + -2474, 7778, -2569, 7746, -2664, 7713, -2759, 7678, -2854, 7643, -2948, + 7606, -3041, 7568, -3134, 7529, -3227, 7489, -3319, 7447, -3411, 7405, + -3502, 7361, -3593, 7317, -3683, 7271, -3772, 7224, -3861, 7176, -3950, + 7127, -4037, 7077, -4124, 7026, -4211, 6974, -4297, 6921, -4382, 6866, + -4467, 6811, -4551, 6755, -4634, 6697, -4717, 6639, -4798, 6579, -4879, + 6519, -4960, 6458, -5039, 6395, -5118, 6332, -5196, 6268, -5274, 6203, + -5350, 6136, -5426, 6069, -5501, 6001, -5575, 5933, -5648, 5863, -5721, + 5792, -5792, 5721, -5863, 5648, -5933, 5575, -6001, 5501, -6069, 5426, + -6136, 5350, -6203, 5274, -6268, 5196, -6332, 5118, -6395, 5039, -6458, + 4960, -6519, 4879, -6579, 4798, -6639, 4717, -6697, 4634, -6755, 4551, + -6811, 4467, -6866, 4382, -6921, 4297, -6974, 4211, -7026, 4124, -7077, + 4037, -7127, 3950, -7176, 3861, -7224, 3772, -7271, 3683, -7317, 3593, + -7361, 3502, -7405, 3411, -7447, 3319, -7489, 3227, -7529, 3134, -7568, + 3041, -7606, 2948, -7643, 2854, -7678, 2759, -7713, 2664, -7746, 2569, + -7778, 2474, -7809, 2378, -7839, 2281, -7867, 2184, -7895, 2087, -7921, + 1990, -7946, 1892, -7970, 1794, -7992, 1696, -8014, 1598, -8034, 1499, + -8053, 1400, -8071, 1301, -8087, 1202, -8103, 1102, -8117, 1002, -8130, + 902, -8142, 802, -8152, 702, -8161, 602, -8169, 502, -8176, 401, + -8182, 301, -8186, 201, -8189, 100, -8191, 0, -8192, -100, -8191, + -201, -8189, -301, -8186, -401, -8182, -502, -8176, -602, -8169, -702, + -8161, -802, -8152, -902, -8142, -1002, -8130, -1102, -8117, -1202, -8103, + -1301, -8087, -1400, -8071, -1499, -8053, -1598, -8034, -1696, -8014, -1794, + -7992, -1892, -7970, -1990, -7946, -2087, -7921, -2184, -7895, -2281, -7867, + -2378, -7839, -2474, -7809, -2569, -7778, -2664, -7746, -2759, -7713, -2854, + -7678, -2948, -7643, -3041, -7606, -3134, -7568, -3227, -7529, -3319, -7489, + -3411, -7447, -3502, -7405, -3593, -7361, -3683, -7317, -3772, -7271, -3861, + -7224, -3950, -7176, -4037, -7127, -4124, -7077, -4211, -7026, -4297, -6974, + -4382, -6921, -4467, -6866, -4551, -6811, -4634, -6755, -4717, -6697, -4798, + -6639, -4879, -6579, -4960, -6519, -5039, -6458, -5118, -6395, -5196, -6332, + -5274, -6268, -5350, -6203, -5426, -6136, -5501, -6069, -5575, -6001, -5648, + -5933, -5721, -5863, -5792, -5792, -5863, -5721, -5933, -5648, -6001, -5575, + -6069, -5501, -6136, -5426, -6203, -5350, -6268, -5274, -6332, -5196, -6395, + -5118, -6458, -5039, -6519, -4960, -6579, -4879, -6639, -4798, -6697, -4717, + -6755, -4634, -6811, -4551, -6866, -4467, -6921, -4382, -6974, -4297, -7026, + -4211, -7077, -4124, -7127, -4037, -7176, -3950, -7224, -3861, -7271, -3772, + -7317, -3683, -7361, -3593, -7405, -3502, -7447, -3411, -7489, -3319, -7529, + -3227, -7568, -3134, -7606, -3041, -7643, -2948, -7678, -2854, -7713, -2759, + -7746, -2664, -7778, -2569, -7809, -2474, -7839, -2378, -7867, -2281, -7895, + -2184, -7921, -2087, -7946, -1990, -7970, -1892, -7992, -1794, -8014, -1696, + -8034, -1598, -8053, -1499, -8071, -1400, -8087, -1301, -8103, -1202, -8117, + -1102, -8130, -1002, -8142, -902, -8152, -802, -8161, -702, -8169, -602, + -8176, -502, -8182, -401, -8186, -301, -8189, -201, -8191, -100, 8192, + 0, 8191, -50, 8191, -100, 8190, -150, 8189, -201, 8188, -251, + 8186, -301, 8184, -351, 8182, -401, 8179, -452, 8176, -502, 8173, + -552, 8169, -602, 8165, -652, 8161, -702, 8157, -752, 8152, -802, + 8147, -852, 8142, -902, 8136, -952, 8130, -1002, 8124, -1052, 8117, + -1102, 8110, -1152, 8103, -1202, 8095, -1251, 8087, -1301, 8079, -1350, + 8071, -1400, 8062, -1450, 8053, -1499, 8044, -1548, 8034, -1598, 8024, + -1647, 8014, -1696, 8003, -1745, 7992, -1794, 7981, -1843, 7970, -1892, + 7958, -1941, 7946, -1990, 7934, -2039, 7921, -2087, 7908, -2136, 7895, + -2184, 7881, -2233, 7867, -2281, 7853, -2329, 7839, -2378, 7824, -2426, + 7809, -2474, 7794, -2521, 7778, -2569, 7762, -2617, 7746, -2664, 7729, + -2712, 7713, -2759, 7696, -2807, 7678, -2854, 7661, -2901, 7643, -2948, + 7624, -2995, 7606, -3041, 7587, -3088, 7568, -3134, 7549, -3181, 7529, + -3227, 7509, -3273, 7489, -3319, 7468, -3365, 7447, -3411, 7426, -3457, + 7405, -3502, 7383, -3547, 7361, -3593, 7339, -3638, 7317, -3683, 7294, + -3728, 7271, -3772, 7248, -3817, 7224, -3861, 7200, -3905, 7176, -3950, + 7152, -3994, 7127, -4037, 7102, -4081, 7077, -4124, 7052, -4168, 7026, + -4211, 7000, -4254, 6974, -4297, 6947, -4340, 6921, -4382, 6894, -4425, + 6866, -4467, 6839, -4509, 6811, -4551, 6783, -4592, 6755, -4634, 6726, + -4675, 6697, -4717, 6668, -4758, 6639, -4798, 6609, -4839, 6579, -4879, + 6549, -4920, 6519, -4960, 6488, -5000, 6458, -5039, 6427, -5079, 6395, + -5118, 6364, -5157, 6332, -5196, 6300, -5235, 6268, -5274, 6235, -5312, + 6203, -5350, 6170, -5388, 6136, -5426, 6103, -5464, 6069, -5501, 6036, + -5538, 6001, -5575, 5967, -5612, 5933, -5648, 5898, -5685, 5863, -5721, + 5828, -5756, 5792, -5792, 5756, -5828, 5721, -5863, 5685, -5898, 5648, + -5933, 5612, -5967, 5575, -6001, 5538, -6036, 5501, -6069, 5464, -6103, + 5426, -6136, 5388, -6170, 5350, -6203, 5312, -6235, 5274, -6268, 5235, + -6300, 5196, -6332, 5157, -6364, 5118, -6395, 5079, -6427, 5039, -6458, + 5000, -6488, 4960, -6519, 4920, -6549, 4879, -6579, 4839, -6609, 4798, + -6639, 4758, -6668, 4717, -6697, 4675, -6726, 4634, -6755, 4592, -6783, + 4551, -6811, 4509, -6839, 4467, -6866, 4425, -6894, 4382, -6921, 4340, + -6947, 4297, -6974, 4254, -7000, 4211, -7026, 4168, -7052, 4124, -7077, + 4081, -7102, 4037, -7127, 3994, -7152, 3950, -7176, 3905, -7200, 3861, + -7224, 3817, -7248, 3772, -7271, 3728, -7294, 3683, -7317, 3638, -7339, + 3593, -7361, 3547, -7383, 3502, -7405, 3457, -7426, 3411, -7447, 3365, + -7468, 3319, -7489, 3273, -7509, 3227, -7529, 3181, -7549, 3134, -7568, + 3088, -7587, 3041, -7606, 2995, -7624, 2948, -7643, 2901, -7661, 2854, + -7678, 2807, -7696, 2759, -7713, 2712, -7729, 2664, -7746, 2617, -7762, + 2569, -7778, 2521, -7794, 2474, -7809, 2426, -7824, 2378, -7839, 2329, + -7853, 2281, -7867, 2233, -7881, 2184, -7895, 2136, -7908, 2087, -7921, + 2039, -7934, 1990, -7946, 1941, -7958, 1892, -7970, 1843, -7981, 1794, + -7992, 1745, -8003, 1696, -8014, 1647, -8024, 1598, -8034, 1548, -8044, + 1499, -8053, 1450, -8062, 1400, -8071, 1350, -8079, 1301, -8087, 1251, + -8095, 1202, -8103, 1152, -8110, 1102, -8117, 1052, -8124, 1002, -8130, + 952, -8136, 902, -8142, 852, -8147, 802, -8152, 752, -8157, 702, + -8161, 652, -8165, 602, -8169, 552, -8173, 502, -8176, 452, -8179, + 401, -8182, 351, -8184, 301, -8186, 251, -8188, 201, -8189, 150, + -8190, 100, -8191, 50, -8191, 0, -8191, -50, -8191, -100, -8191, + -150, -8190, -201, -8189, -251, -8188, -301, -8186, -351, -8184, -401, + -8182, -452, -8179, -502, -8176, -552, -8173, -602, -8169, -652, -8165, + -702, -8161, -752, -8157, -802, -8152, -852, -8147, -902, -8142, -952, + -8136, -1002, -8130, -1052, -8124, -1102, -8117, -1152, -8110, -1202, -8103, + -1251, -8095, -1301, -8087, -1350, -8079, -1400, -8071, -1450, -8062, -1499, + -8053, -1548, -8044, -1598, -8034, -1647, -8024, -1696, -8014, -1745, -8003, + -1794, -7992, -1843, -7981, -1892, -7970, -1941, -7958, -1990, -7946, -2039, + -7934, -2087, -7921, -2136, -7908, -2184, -7895, -2233, -7881, -2281, -7867, + -2329, -7853, -2378, -7839, -2426, -7824, -2474, -7809, -2521, -7794, -2569, + -7778, -2617, -7762, -2664, -7746, -2712, -7729, -2759, -7713, -2807, -7696, + -2854, -7678, -2901, -7661, -2948, -7643, -2995, -7624, -3041, -7606, -3088, + -7587, -3134, -7568, -3181, -7549, -3227, -7529, -3273, -7509, -3319, -7489, + -3365, -7468, -3411, -7447, -3457, -7426, -3502, -7405, -3547, -7383, -3593, + -7361, -3638, -7339, -3683, -7317, -3728, -7294, -3772, -7271, -3817, -7248, + -3861, -7224, -3905, -7200, -3950, -7176, -3994, -7152, -4037, -7127, -4081, + -7102, -4124, -7077, -4168, -7052, -4211, -7026, -4254, -7000, -4297, -6974, + -4340, -6947, -4382, -6921, -4425, -6894, -4467, -6866, -4509, -6839, -4551, + -6811, -4592, -6783, -4634, -6755, -4675, -6726, -4717, -6697, -4758, -6668, + -4798, -6639, -4839, -6609, -4879, -6579, -4920, -6549, -4960, -6519, -5000, + -6488, -5039, -6458, -5079, -6427, -5118, -6395, -5157, -6364, -5196, -6332, + -5235, -6300, -5274, -6268, -5312, -6235, -5350, -6203, -5388, -6170, -5426, + -6136, -5464, -6103, -5501, -6069, -5538, -6035, -5575, -6001, -5612, -5967, + -5648, -5933, -5685, -5898, -5721, -5863, -5756, -5828, -5792, -5792, -5828, + -5756, -5863, -5721, -5898, -5685, -5933, -5648, -5967, -5612, -6001, -5575, + -6036, -5538, -6069, -5501, -6103, -5464, -6136, -5426, -6170, -5388, -6203, + -5350, -6235, -5312, -6268, -5274, -6300, -5235, -6332, -5196, -6364, -5157, + -6395, -5118, -6427, -5079, -6458, -5039, -6488, -5000, -6519, -4960, -6549, + -4920, -6579, -4879, -6609, -4839, -6639, -4798, -6668, -4758, -6697, -4717, + -6726, -4675, -6755, -4634, -6783, -4592, -6811, -4551, -6839, -4509, -6866, + -4467, -6894, -4425, -6921, -4382, -6947, -4340, -6974, -4297, -7000, -4254, + -7026, -4211, -7052, -4168, -7077, -4124, -7102, -4081, -7127, -4037, -7152, + -3994, -7176, -3950, -7200, -3905, -7224, -3861, -7248, -3817, -7271, -3772, + -7294, -3728, -7317, -3683, -7339, -3638, -7361, -3593, -7383, -3547, -7405, + -3502, -7426, -3457, -7447, -3411, -7468, -3365, -7489, -3319, -7509, -3273, + -7529, -3227, -7549, -3181, -7568, -3134, -7587, -3088, -7606, -3041, -7624, + -2995, -7643, -2948, -7661, -2901, -7678, -2854, -7696, -2807, -7713, -2759, + -7729, -2712, -7746, -2664, -7762, -2617, -7778, -2569, -7794, -2521, -7809, + -2474, -7824, -2426, -7839, -2378, -7853, -2329, -7867, -2281, -7881, -2233, + -7895, -2184, -7908, -2136, -7921, -2087, -7934, -2039, -7946, -1990, -7958, + -1941, -7970, -1892, -7981, -1843, -7992, -1794, -8003, -1745, -8014, -1696, + -8024, -1647, -8034, -1598, -8044, -1548, -8053, -1499, -8062, -1450, -8071, + -1400, -8079, -1350, -8087, -1301, -8095, -1251, -8103, -1202, -8110, -1152, + -8117, -1102, -8124, -1052, -8130, -1002, -8136, -952, -8142, -902, -8147, + -852, -8152, -802, -8157, -752, -8161, -702, -8165, -652, -8169, -602, + -8173, -552, -8176, -502, -8179, -452, -8182, -401, -8184, -351, -8186, + -301, -8188, -251, -8189, -201, -8190, -150, -8191, -100, -8191, -50 +}; + + +/* 1024 real values as input data in float format */ +float fft_input[ 1024 ] = { + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f +}; diff --git a/targets/wasm-tacle/kernel/fft/generated/default/fft.wasm b/targets/wasm-tacle/kernel/fft/generated/default/fft.wasm new file mode 100755 index 0000000000000000000000000000000000000000..822cd7fc23544258abf1d276b001ce33810b97e1 GIT binary patch literal 14084 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/fft/generated/default/fft.wat b/targets/wasm-tacle/kernel/fft/generated/default/fft.wat new file mode 100644 index 0000000..dc02e68 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/generated/default/fft.wat @@ -0,0 +1,581 @@ +(module $fft.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $fft_bit_reduct (type 2) (param i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 1024 + i32.const 1024 + call $__pragma_loopbound + i32.const 0 + local.set 1 + i32.const 0 + local.set 2 + loop ;; label = @1 + block ;; label = @2 + local.get 2 + local.get 1 + local.tee 3 + i32.le_s + br_if 0 (;@2;) + local.get 0 + local.get 2 + i32.const 2 + i32.shl + i32.add + local.tee 1 + i32.load + local.set 4 + local.get 1 + local.get 0 + local.get 3 + i32.const 2 + i32.shl + i32.add + local.tee 5 + i32.load + i32.store + local.get 5 + local.get 4 + i32.store + local.get 1 + i32.load offset=4 + local.set 4 + local.get 1 + local.get 5 + i32.load offset=4 + i32.store offset=4 + local.get 5 + local.get 4 + i32.store offset=4 + end + i32.const 0 + i32.const 10 + call $__pragma_loopbound + i32.const 1024 + local.set 5 + block ;; label = @2 + local.get 2 + i32.const 1024 + i32.lt_s + br_if 0 (;@2;) + i32.const 1024 + local.set 1 + loop ;; label = @3 + local.get 1 + i32.const 1 + i32.shr_u + local.set 5 + local.get 2 + local.get 1 + i32.sub + local.set 2 + local.get 1 + i32.const 4 + i32.lt_u + br_if 1 (;@2;) + local.get 5 + local.set 1 + local.get 2 + local.get 5 + i32.ge_s + br_if 0 (;@3;) + end + end + local.get 3 + i32.const 2 + i32.add + local.set 1 + local.get 2 + local.get 5 + i32.add + local.set 2 + local.get 3 + i32.const 2045 + i32.lt_u + br_if 0 (;@1;) + end + i32.const 10 + i32.const 10 + call $__pragma_loopbound + i32.const 0 + local.set 6 + i32.const 2 + local.set 7 + loop ;; label = @1 + i32.const 1 + i32.const 512 + call $__pragma_loopbound + local.get 7 + local.tee 8 + i32.const 2 + i32.shl + local.set 9 + local.get 8 + i32.const 3 + i32.shl + local.set 10 + local.get 8 + i32.const 1 + i32.shl + local.set 7 + local.get 0 + local.set 11 + i32.const 1 + local.set 12 + loop ;; label = @2 + i32.const 1024 + local.get 6 + i32.const 2 + i32.shl + i32.add + local.tee 1 + i32.load offset=4 + local.set 5 + local.get 1 + i32.load + local.set 3 + i32.const 1 + i32.const 512 + call $__pragma_loopbound + local.get 6 + i32.const 2 + i32.add + local.set 6 + local.get 11 + local.set 1 + local.get 12 + local.set 4 + loop ;; label = @3 + local.get 1 + local.get 9 + i32.add + local.tee 2 + local.get 1 + i32.load + local.get 2 + i32.load + local.tee 13 + local.get 3 + i32.mul + local.get 2 + i32.const 4 + i32.add + local.tee 14 + i32.load + local.tee 15 + local.get 5 + i32.mul + i32.sub + i32.const 13 + i32.shr_s + local.tee 16 + i32.sub + i32.store + local.get 14 + local.get 1 + i32.const 4 + i32.add + local.tee 2 + i32.load + local.get 15 + local.get 3 + i32.mul + local.get 13 + local.get 5 + i32.mul + i32.add + i32.const 13 + i32.shr_s + local.tee 13 + i32.sub + i32.store + local.get 1 + local.get 1 + i32.load + local.get 16 + i32.add + i32.store + local.get 2 + local.get 2 + i32.load + local.get 13 + i32.add + i32.store + local.get 1 + local.get 10 + i32.add + local.set 1 + local.get 4 + local.get 7 + i32.add + local.tee 4 + i32.const 2049 + i32.lt_s + br_if 0 (;@3;) + end + local.get 11 + i32.const 8 + i32.add + local.set 11 + local.get 12 + i32.const 2 + i32.add + local.tee 12 + local.get 8 + i32.lt_u + br_if 0 (;@2;) + end + i32.const 2048 + i32.const 2048 + call $__pragma_loopbound + i32.const 0 + local.set 2 + loop ;; label = @2 + local.get 0 + local.get 2 + i32.add + local.tee 1 + local.get 1 + i32.load + i32.const 1 + i32.shr_s + i32.store + local.get 1 + i32.const 4 + i32.add + local.tee 5 + local.get 5 + i32.load + i32.const 1 + i32.shr_s + i32.store + local.get 1 + i32.const 8 + i32.add + local.tee 5 + local.get 5 + i32.load + i32.const 1 + i32.shr_s + i32.store + local.get 1 + i32.const 12 + i32.add + local.tee 1 + local.get 1 + i32.load + i32.const 1 + i32.shr_s + i32.store + local.get 2 + i32.const 16 + i32.add + local.tee 2 + i32.const 8192 + i32.ne + br_if 0 (;@2;) + end + local.get 7 + i32.const 2047 + i32.le_s + br_if 0 (;@1;) + end) + (func $fft_init (type 1) + (local i32 i32 f32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store offset=12 + i32.const 1024 + i32.const 1024 + call $__pragma_loopbound + i32.const -4096 + local.set 1 + loop ;; label = @1 + i32.const 9216 + local.get 1 + i32.add + i32.const 4096 + i32.add + f32.load + local.set 2 + i32.const 13 + i32.const 13 + call $__pragma_loopbound + block ;; label = @2 + block ;; label = @3 + local.get 2 + f32.const 0x1.fff8p+13 (;=16383;) + f32.mul + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@3;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@2;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 2 + local.get 3 + f32.convert_i32_s + f32.sub + local.tee 2 + f32.const 0x0p+0 (;=0;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 2 + f32.const -0x1p-1 (;=-0.5;) + f32.gt + br_if 1 (;@3;) + i32.const -1 + local.set 4 + br 2 (;@2;) + end + local.get 2 + f32.const 0x1p-1 (;=0.5;) + f32.lt + br_if 0 (;@3;) + i32.const 1 + local.set 4 + br 1 (;@2;) + end + i32.const 0 + local.set 4 + end + local.get 1 + i32.const 17408 + i32.add + local.get 4 + local.get 3 + i32.add + i32.store + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 1024 + i32.const 1024 + call $__pragma_loopbound + i32.const 13312 + local.set 3 + i32.const -8192 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 25604 + i32.add + i32.const 0 + i32.store + local.get 1 + i32.const 25600 + i32.add + local.get 3 + i32.load + i32.store + local.get 1 + i32.const 25612 + i32.add + i32.const 0 + i32.store + local.get 1 + i32.const 25620 + i32.add + i32.const 0 + i32.store + local.get 1 + i32.const 25628 + i32.add + i32.const 0 + i32.store + local.get 1 + i32.const 25608 + i32.add + local.get 3 + i32.const 4 + i32.add + i32.load + i32.store + local.get 1 + i32.const 25616 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load + i32.store + local.get 1 + i32.const 25624 + i32.add + local.get 3 + i32.const 12 + i32.add + i32.load + i32.store + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 1 + i32.const 32 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 2046 + i32.const 2046 + call $__pragma_loopbound + i32.const -8184 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 25592 + i32.add + local.tee 3 + local.get 3 + i32.load + local.get 0 + i32.load offset=12 + i32.add + i32.store + local.get 1 + i32.const 25596 + i32.add + local.tee 3 + i32.load + local.set 4 + local.get 0 + i32.load offset=12 + local.set 5 + local.get 3 + local.get 4 + local.get 0 + i32.load offset=12 + i32.add + i32.store + i32.const 1024 + local.get 1 + i32.add + local.tee 3 + i32.const 8184 + i32.add + local.tee 4 + local.get 5 + local.get 4 + i32.load + i32.add + i32.store + local.get 3 + i32.const 8188 + i32.add + local.tee 3 + local.get 3 + i32.load + local.get 0 + i32.load offset=12 + i32.add + i32.store + local.get 1 + i32.const 8 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=25592 + local.get 0 + i32.load offset=12 + i32.add + i32.store offset=25592 + i32.const 0 + i32.const 0 + i32.load offset=25596 + local.get 0 + i32.load offset=12 + i32.add + i32.store offset=25596 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $fft_main (type 1) + i32.const 17408 + call $fft_bit_reduct) + (func $__original_main (type 3) (result i32) + (local i32 i32) + call $fft_init + call $fft_main + i32.const 2048 + i32.const 2048 + call $__pragma_loopbound + i32.const 0 + local.set 0 + i32.const -8192 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 25612 + i32.add + i32.load + local.get 1 + i32.const 25608 + i32.add + i32.load + local.get 1 + i32.const 25604 + i32.add + i32.load + local.get 1 + i32.const 25600 + i32.add + i32.load + local.get 0 + i32.add + i32.add + i32.add + i32.add + local.set 0 + local.get 1 + i32.const 16 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + local.get 0 + i32.const 3968 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 29696)) + (global (;1;) i32 (i32.const 25600)) + (global (;2;) i32 (i32.const 29696)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $fft_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\e0\ff\ff\00 \00\00\00\00\00\00\a0\16\00\00`\e9\ff\ff\00\00\00\00\01\e0\ff\ff`\e9\ff\ff`\e9\ff\ff\00 \00\00\00\00\00\00\90\1d\00\00\c2\f3\ff\ff\a0\16\00\00`\e9\ff\ff>\0c\00\00p\e2\ff\ff\00\00\00\00\00\e0\ff\ff\c2\f3\ff\ffp\e2\ff\ff`\e9\ff\ff`\e9\ff\ffp\e2\ff\ff\c2\f3\ff\ff\00 \00\00\00\00\00\00b\1f\00\00\c2\f9\ff\ff\90\1d\00\00\c2\f3\ff\ff\9b\1a\00\009\ee\ff\ff\a0\16\00\00`\e9\ff\ff\c7\11\00\00e\e5\ff\ff>\0c\00\00p\e2\ff\ff>\06\00\00\9e\e0\ff\ff\00\00\00\00\00\e0\ff\ff\c2\f9\ff\ff\9e\e0\ff\ff\c2\f3\ff\ffp\e2\ff\ff9\ee\ff\ffe\e5\ff\ff`\e9\ff\ff`\e9\ff\ffe\e5\ff\ff9\ee\ff\ffp\e2\ff\ff\c2\f3\ff\ff\9e\e0\ff\ff\c2\f9\ff\ff\00 \00\00\00\00\00\00\d8\1f\00\00\de\fc\ff\ffb\1f\00\00\c2\f9\ff\ff\9f\1e\00\00\b6\f6\ff\ff\90\1d\00\00\c2\f3\ff\ff8\1c\00\00\eb\f0\ff\ff\9b\1a\00\009\ee\ff\ff\bc\18\00\00\b4\eb\ff\ff\a0\16\00\00`\e9\ff\ffL\14\00\00D\e7\ff\ff\c7\11\00\00e\e5\ff\ff\15\0f\00\00\c8\e3\ff\ff>\0c\00\00p\e2\ff\ffJ\09\00\00a\e1\ff\ff>\06\00\00\9e\e0\ff\ff\22\03\00\00(\e0\ff\ff\00\00\00\00\01\e0\ff\ff\de\fc\ff\ff(\e0\ff\ff\c2\f9\ff\ff\9e\e0\ff\ff\b6\f6\ff\ffa\e1\ff\ff\c2\f3\ff\ffp\e2\ff\ff\eb\f0\ff\ff\c8\e3\ff\ff9\ee\ff\ffe\e5\ff\ff\b4\eb\ff\ffD\e7\ff\ff`\e9\ff\ff`\e9\ff\ffD\e7\ff\ff\b4\eb\ff\ffe\e5\ff\ff9\ee\ff\ff\c8\e3\ff\ff\eb\f0\ff\ffp\e2\ff\ff\c2\f3\ff\ffa\e1\ff\ff\b6\f6\ff\ff\9e\e0\ff\ff\c2\f9\ff\ff(\e0\ff\ff\de\fc\ff\ff\00 \00\00\00\00\00\00\f6\1f\00\00o\fe\ff\ff\d8\1f\00\00\de\fc\ff\ff\a7\1f\00\00N\fb\ff\ffb\1f\00\00\c2\f9\ff\ff\0a\1f\00\00:\f8\ff\ff\9f\1e\00\00\b6\f6\ff\ff!\1e\00\009\f5\ff\ff\90\1d\00\00\c2\f3\ff\ff\ed\1c\00\00R\f2\ff\ff8\1c\00\00\eb\f0\ff\ffr\1b\00\00\8d\ef\ff\ff\9b\1a\00\009\ee\ff\ff\b3\19\00\00\f1\ec\ff\ff\bc\18\00\00\b4\eb\ff\ff\b5\17\00\00\83\ea\ff\ff\a0\16\00\00`\e9\ff\ff}\15\00\00K\e8\ff\ffL\14\00\00D\e7\ff\ff\0f\13\00\00M\e6\ff\ff\c7\11\00\00e\e5\ff\ffs\10\00\00\8e\e4\ff\ff\15\0f\00\00\c8\e3\ff\ff\ae\0d\00\00\13\e3\ff\ff>\0c\00\00p\e2\ff\ff\c7\0a\00\00\df\e1\ff\ffJ\09\00\00a\e1\ff\ff\c6\07\00\00\f6\e0\ff\ff>\06\00\00\9e\e0\ff\ff\b2\04\00\00Y\e0\ff\ff\22\03\00\00(\e0\ff\ff\91\01\00\00\0a\e0\ff\ff\00\00\00\00\00\e0\ff\ffo\fe\ff\ff\0a\e0\ff\ff\de\fc\ff\ff(\e0\ff\ffN\fb\ff\ffY\e0\ff\ff\c2\f9\ff\ff\9e\e0\ff\ff:\f8\ff\ff\f6\e0\ff\ff\b6\f6\ff\ffa\e1\ff\ff9\f5\ff\ff\df\e1\ff\ff\c2\f3\ff\ffp\e2\ff\ffR\f2\ff\ff\13\e3\ff\ff\eb\f0\ff\ff\c8\e3\ff\ff\8d\ef\ff\ff\8e\e4\ff\ff9\ee\ff\ffe\e5\ff\ff\f1\ec\ff\ffM\e6\ff\ff\b4\eb\ff\ffD\e7\ff\ff\83\ea\ff\ffK\e8\ff\ff`\e9\ff\ff`\e9\ff\ffK\e8\ff\ff\83\ea\ff\ffD\e7\ff\ff\b4\eb\ff\ffM\e6\ff\ff\f1\ec\ff\ffe\e5\ff\ff9\ee\ff\ff\8e\e4\ff\ff\8d\ef\ff\ff\c8\e3\ff\ff\eb\f0\ff\ff\13\e3\ff\ffR\f2\ff\ffp\e2\ff\ff\c2\f3\ff\ff\df\e1\ff\ff9\f5\ff\ffa\e1\ff\ff\b6\f6\ff\ff\f6\e0\ff\ff:\f8\ff\ff\9e\e0\ff\ff\c2\f9\ff\ffY\e0\ff\ffN\fb\ff\ff(\e0\ff\ff\de\fc\ff\ff\0a\e0\ff\ffo\fe\ff\ff\00 \00\00\00\00\00\00\fd\1f\00\007\ff\ff\ff\f6\1f\00\00o\fe\ff\ff\e9\1f\00\00\a6\fd\ff\ff\d8\1f\00\00\de\fc\ff\ff\c2\1f\00\00\16\fc\ff\ff\a7\1f\00\00N\fb\ff\ff\87\1f\00\00\88\fa\ff\ffb\1f\00\00\c2\f9\ff\ff8\1f\00\00\fe\f8\ff\ff\0a\1f\00\00:\f8\ff\ff\d7\1e\00\00x\f7\ff\ff\9f\1e\00\00\b6\f6\ff\ffb\1e\00\00\f7\f5\ff\ff!\1e\00\009\f5\ff\ff\db\1d\00\00|\f4\ff\ff\90\1d\00\00\c2\f3\ff\ffA\1d\00\00\09\f3\ff\ff\ed\1c\00\00R\f2\ff\ff\95\1c\00\00\9d\f1\ff\ff8\1c\00\00\eb\f0\ff\ff\d7\1b\00\00;\f0\ff\ffr\1b\00\00\8d\ef\ff\ff\09\1b\00\00\e2\ee\ff\ff\9b\1a\00\009\ee\ff\ff)\1a\00\00\93\ed\ff\ff\b3\19\00\00\f1\ec\ff\ff:\19\00\00Q\ec\ff\ff\bc\18\00\00\b4\eb\ff\ff;\18\00\00\1a\eb\ff\ff\b5\17\00\00\83\ea\ff\ff-\17\00\00\f0\e9\ff\ff\a0\16\00\00`\e9\ff\ff\10\16\00\00\d3\e8\ff\ff}\15\00\00K\e8\ff\ff\e6\14\00\00\c5\e7\ff\ffL\14\00\00D\e7\ff\ff\af\13\00\00\c6\e6\ff\ff\0f\13\00\00M\e6\ff\ffm\12\00\00\d7\e5\ff\ff\c7\11\00\00e\e5\ff\ff\1e\11\00\00\f7\e4\ff\ffs\10\00\00\8e\e4\ff\ff\c5\0f\00\00)\e4\ff\ff\15\0f\00\00\c8\e3\ff\ffc\0e\00\00k\e3\ff\ff\ae\0d\00\00\13\e3\ff\ff\f7\0c\00\00\bf\e2\ff\ff>\0c\00\00p\e2\ff\ff\84\0b\00\00%\e2\ff\ff\c7\0a\00\00\df\e1\ff\ff\09\0a\00\00\9e\e1\ff\ffJ\09\00\00a\e1\ff\ff\88\08\00\00)\e1\ff\ff\c6\07\00\00\f6\e0\ff\ff\02\07\00\00\c8\e0\ff\ff>\06\00\00\9e\e0\ff\ffx\05\00\00y\e0\ff\ff\b2\04\00\00Y\e0\ff\ff\ea\03\00\00>\e0\ff\ff\22\03\00\00(\e0\ff\ffZ\02\00\00\17\e0\ff\ff\91\01\00\00\0a\e0\ff\ff\c9\00\00\00\03\e0\ff\ff\00\00\00\00\00\e0\ff\ff7\ff\ff\ff\03\e0\ff\ffo\fe\ff\ff\0a\e0\ff\ff\a6\fd\ff\ff\17\e0\ff\ff\de\fc\ff\ff(\e0\ff\ff\16\fc\ff\ff>\e0\ff\ffN\fb\ff\ffY\e0\ff\ff\88\fa\ff\ffy\e0\ff\ff\c2\f9\ff\ff\9e\e0\ff\ff\fe\f8\ff\ff\c8\e0\ff\ff:\f8\ff\ff\f6\e0\ff\ffx\f7\ff\ff)\e1\ff\ff\b6\f6\ff\ffa\e1\ff\ff\f7\f5\ff\ff\9e\e1\ff\ff9\f5\ff\ff\df\e1\ff\ff|\f4\ff\ff%\e2\ff\ff\c2\f3\ff\ffp\e2\ff\ff\09\f3\ff\ff\bf\e2\ff\ffR\f2\ff\ff\13\e3\ff\ff\9d\f1\ff\ffk\e3\ff\ff\eb\f0\ff\ff\c8\e3\ff\ff;\f0\ff\ff)\e4\ff\ff\8d\ef\ff\ff\8e\e4\ff\ff\e2\ee\ff\ff\f7\e4\ff\ff9\ee\ff\ffe\e5\ff\ff\93\ed\ff\ff\d7\e5\ff\ff\f1\ec\ff\ffM\e6\ff\ffQ\ec\ff\ff\c6\e6\ff\ff\b4\eb\ff\ffD\e7\ff\ff\1a\eb\ff\ff\c5\e7\ff\ff\83\ea\ff\ffK\e8\ff\ff\f0\e9\ff\ff\d3\e8\ff\ff`\e9\ff\ff`\e9\ff\ff\d3\e8\ff\ff\f0\e9\ff\ffK\e8\ff\ff\83\ea\ff\ff\c5\e7\ff\ff\1a\eb\ff\ffD\e7\ff\ff\b4\eb\ff\ff\c6\e6\ff\ffQ\ec\ff\ffM\e6\ff\ff\f1\ec\ff\ff\d7\e5\ff\ff\93\ed\ff\ffe\e5\ff\ff9\ee\ff\ff\f7\e4\ff\ff\e2\ee\ff\ff\8e\e4\ff\ff\8d\ef\ff\ff)\e4\ff\ff;\f0\ff\ff\c8\e3\ff\ff\eb\f0\ff\ffk\e3\ff\ff\9d\f1\ff\ff\13\e3\ff\ffR\f2\ff\ff\bf\e2\ff\ff\09\f3\ff\ffp\e2\ff\ff\c2\f3\ff\ff%\e2\ff\ff|\f4\ff\ff\df\e1\ff\ff9\f5\ff\ff\9e\e1\ff\ff\f7\f5\ff\ffa\e1\ff\ff\b6\f6\ff\ff)\e1\ff\ffx\f7\ff\ff\f6\e0\ff\ff:\f8\ff\ff\c8\e0\ff\ff\fe\f8\ff\ff\9e\e0\ff\ff\c2\f9\ff\ffy\e0\ff\ff\88\fa\ff\ffY\e0\ff\ffN\fb\ff\ff>\e0\ff\ff\16\fc\ff\ff(\e0\ff\ff\de\fc\ff\ff\17\e0\ff\ff\a6\fd\ff\ff\0a\e0\ff\ffo\fe\ff\ff\03\e0\ff\ff7\ff\ff\ff\00 \00\00\00\00\00\00\ff\1f\00\00\9c\ff\ff\ff\fd\1f\00\007\ff\ff\ff\fa\1f\00\00\d3\fe\ff\ff\f6\1f\00\00o\fe\ff\ff\f0\1f\00\00\0a\fe\ff\ff\e9\1f\00\00\a6\fd\ff\ff\e1\1f\00\00B\fd\ff\ff\d8\1f\00\00\de\fc\ff\ff\ce\1f\00\00z\fc\ff\ff\c2\1f\00\00\16\fc\ff\ff\b5\1f\00\00\b2\fb\ff\ff\a7\1f\00\00N\fb\ff\ff\97\1f\00\00\eb\fa\ff\ff\87\1f\00\00\88\fa\ff\ffu\1f\00\00%\fa\ff\ffb\1f\00\00\c2\f9\ff\ffN\1f\00\00`\f9\ff\ff8\1f\00\00\fe\f8\ff\ff\22\1f\00\00\9c\f8\ff\ff\0a\1f\00\00:\f8\ff\ff\f1\1e\00\00\d9\f7\ff\ff\d7\1e\00\00x\f7\ff\ff\bb\1e\00\00\17\f7\ff\ff\9f\1e\00\00\b6\f6\ff\ff\81\1e\00\00V\f6\ff\ffb\1e\00\00\f7\f5\ff\ffB\1e\00\00\98\f5\ff\ff!\1e\00\009\f5\ff\ff\fe\1d\00\00\da\f4\ff\ff\db\1d\00\00|\f4\ff\ff\b6\1d\00\00\1f\f4\ff\ff\90\1d\00\00\c2\f3\ff\ffi\1d\00\00e\f3\ff\ffA\1d\00\00\09\f3\ff\ff\17\1d\00\00\ad\f2\ff\ff\ed\1c\00\00R\f2\ff\ff\c1\1c\00\00\f7\f1\ff\ff\95\1c\00\00\9d\f1\ff\ffg\1c\00\00D\f1\ff\ff8\1c\00\00\eb\f0\ff\ff\08\1c\00\00\92\f0\ff\ff\d7\1b\00\00;\f0\ff\ff\a5\1b\00\00\e4\ef\ff\ffr\1b\00\00\8d\ef\ff\ff>\1b\00\007\ef\ff\ff\09\1b\00\00\e2\ee\ff\ff\d2\1a\00\00\8d\ee\ff\ff\9b\1a\00\009\ee\ff\ffc\1a\00\00\e6\ed\ff\ff)\1a\00\00\93\ed\ff\ff\ef\19\00\00B\ed\ff\ff\b3\19\00\00\f1\ec\ff\ffw\19\00\00\a0\ec\ff\ff:\19\00\00Q\ec\ff\ff\fb\18\00\00\02\ec\ff\ff\bc\18\00\00\b4\eb\ff\ff|\18\00\00f\eb\ff\ff;\18\00\00\1a\eb\ff\ff\f8\17\00\00\ce\ea\ff\ff\b5\17\00\00\83\ea\ff\ffq\17\00\009\ea\ff\ff-\17\00\00\f0\e9\ff\ff\e7\16\00\00\a7\e9\ff\ff\a0\16\00\00`\e9\ff\ffY\16\00\00\19\e9\ff\ff\10\16\00\00\d3\e8\ff\ff\c7\15\00\00\8f\e8\ff\ff}\15\00\00K\e8\ff\ff2\15\00\00\08\e8\ff\ff\e6\14\00\00\c5\e7\ff\ff\9a\14\00\00\84\e7\ff\ffL\14\00\00D\e7\ff\ff\fe\13\00\00\05\e7\ff\ff\af\13\00\00\c6\e6\ff\ff`\13\00\00\89\e6\ff\ff\0f\13\00\00M\e6\ff\ff\be\12\00\00\11\e6\ff\ffm\12\00\00\d7\e5\ff\ff\1a\12\00\00\9d\e5\ff\ff\c7\11\00\00e\e5\ff\ffs\11\00\00.\e5\ff\ff\1e\11\00\00\f7\e4\ff\ff\c9\10\00\00\c2\e4\ff\ffs\10\00\00\8e\e4\ff\ff\1c\10\00\00[\e4\ff\ff\c5\0f\00\00)\e4\ff\ffn\0f\00\00\f8\e3\ff\ff\15\0f\00\00\c8\e3\ff\ff\bc\0e\00\00\99\e3\ff\ffc\0e\00\00k\e3\ff\ff\09\0e\00\00?\e3\ff\ff\ae\0d\00\00\13\e3\ff\ffS\0d\00\00\e9\e2\ff\ff\f7\0c\00\00\bf\e2\ff\ff\9b\0c\00\00\97\e2\ff\ff>\0c\00\00p\e2\ff\ff\e1\0b\00\00J\e2\ff\ff\84\0b\00\00%\e2\ff\ff&\0b\00\00\02\e2\ff\ff\c7\0a\00\00\df\e1\ff\ffh\0a\00\00\be\e1\ff\ff\09\0a\00\00\9e\e1\ff\ff\aa\09\00\00\7f\e1\ff\ffJ\09\00\00a\e1\ff\ff\e9\08\00\00E\e1\ff\ff\88\08\00\00)\e1\ff\ff'\08\00\00\0f\e1\ff\ff\c6\07\00\00\f6\e0\ff\ffd\07\00\00\de\e0\ff\ff\02\07\00\00\c8\e0\ff\ff\a0\06\00\00\b2\e0\ff\ff>\06\00\00\9e\e0\ff\ff\db\05\00\00\8b\e0\ff\ffx\05\00\00y\e0\ff\ff\15\05\00\00i\e0\ff\ff\b2\04\00\00Y\e0\ff\ffN\04\00\00K\e0\ff\ff\ea\03\00\00>\e0\ff\ff\86\03\00\002\e0\ff\ff\22\03\00\00(\e0\ff\ff\be\02\00\00\1f\e0\ff\ffZ\02\00\00\17\e0\ff\ff\f6\01\00\00\10\e0\ff\ff\91\01\00\00\0a\e0\ff\ff-\01\00\00\06\e0\ff\ff\c9\00\00\00\03\e0\ff\ffd\00\00\00\01\e0\ff\ff\00\00\00\00\00\e0\ff\ff\9c\ff\ff\ff\01\e0\ff\ff7\ff\ff\ff\03\e0\ff\ff\d3\fe\ff\ff\06\e0\ff\ffo\fe\ff\ff\0a\e0\ff\ff\0a\fe\ff\ff\10\e0\ff\ff\a6\fd\ff\ff\17\e0\ff\ffB\fd\ff\ff\1f\e0\ff\ff\de\fc\ff\ff(\e0\ff\ffz\fc\ff\ff2\e0\ff\ff\16\fc\ff\ff>\e0\ff\ff\b2\fb\ff\ffK\e0\ff\ffN\fb\ff\ffY\e0\ff\ff\eb\fa\ff\ffi\e0\ff\ff\88\fa\ff\ffy\e0\ff\ff%\fa\ff\ff\8b\e0\ff\ff\c2\f9\ff\ff\9e\e0\ff\ff`\f9\ff\ff\b2\e0\ff\ff\fe\f8\ff\ff\c8\e0\ff\ff\9c\f8\ff\ff\de\e0\ff\ff:\f8\ff\ff\f6\e0\ff\ff\d9\f7\ff\ff\0f\e1\ff\ffx\f7\ff\ff)\e1\ff\ff\17\f7\ff\ffE\e1\ff\ff\b6\f6\ff\ffa\e1\ff\ffV\f6\ff\ff\7f\e1\ff\ff\f7\f5\ff\ff\9e\e1\ff\ff\98\f5\ff\ff\be\e1\ff\ff9\f5\ff\ff\df\e1\ff\ff\da\f4\ff\ff\02\e2\ff\ff|\f4\ff\ff%\e2\ff\ff\1f\f4\ff\ffJ\e2\ff\ff\c2\f3\ff\ffp\e2\ff\ffe\f3\ff\ff\97\e2\ff\ff\09\f3\ff\ff\bf\e2\ff\ff\ad\f2\ff\ff\e9\e2\ff\ffR\f2\ff\ff\13\e3\ff\ff\f7\f1\ff\ff?\e3\ff\ff\9d\f1\ff\ffk\e3\ff\ffD\f1\ff\ff\99\e3\ff\ff\eb\f0\ff\ff\c8\e3\ff\ff\92\f0\ff\ff\f8\e3\ff\ff;\f0\ff\ff)\e4\ff\ff\e4\ef\ff\ff[\e4\ff\ff\8d\ef\ff\ff\8e\e4\ff\ff7\ef\ff\ff\c2\e4\ff\ff\e2\ee\ff\ff\f7\e4\ff\ff\8d\ee\ff\ff.\e5\ff\ff9\ee\ff\ffe\e5\ff\ff\e6\ed\ff\ff\9d\e5\ff\ff\93\ed\ff\ff\d7\e5\ff\ffB\ed\ff\ff\11\e6\ff\ff\f1\ec\ff\ffM\e6\ff\ff\a0\ec\ff\ff\89\e6\ff\ffQ\ec\ff\ff\c6\e6\ff\ff\02\ec\ff\ff\05\e7\ff\ff\b4\eb\ff\ffD\e7\ff\fff\eb\ff\ff\84\e7\ff\ff\1a\eb\ff\ff\c5\e7\ff\ff\ce\ea\ff\ff\08\e8\ff\ff\83\ea\ff\ffK\e8\ff\ff9\ea\ff\ff\8f\e8\ff\ff\f0\e9\ff\ff\d3\e8\ff\ff\a7\e9\ff\ff\19\e9\ff\ff`\e9\ff\ff`\e9\ff\ff\19\e9\ff\ff\a7\e9\ff\ff\d3\e8\ff\ff\f0\e9\ff\ff\8f\e8\ff\ff9\ea\ff\ffK\e8\ff\ff\83\ea\ff\ff\08\e8\ff\ff\ce\ea\ff\ff\c5\e7\ff\ff\1a\eb\ff\ff\84\e7\ff\fff\eb\ff\ffD\e7\ff\ff\b4\eb\ff\ff\05\e7\ff\ff\02\ec\ff\ff\c6\e6\ff\ffQ\ec\ff\ff\89\e6\ff\ff\a0\ec\ff\ffM\e6\ff\ff\f1\ec\ff\ff\11\e6\ff\ffB\ed\ff\ff\d7\e5\ff\ff\93\ed\ff\ff\9d\e5\ff\ff\e6\ed\ff\ffe\e5\ff\ff9\ee\ff\ff.\e5\ff\ff\8d\ee\ff\ff\f7\e4\ff\ff\e2\ee\ff\ff\c2\e4\ff\ff7\ef\ff\ff\8e\e4\ff\ff\8d\ef\ff\ff[\e4\ff\ff\e4\ef\ff\ff)\e4\ff\ff;\f0\ff\ff\f8\e3\ff\ff\92\f0\ff\ff\c8\e3\ff\ff\eb\f0\ff\ff\99\e3\ff\ffD\f1\ff\ffk\e3\ff\ff\9d\f1\ff\ff?\e3\ff\ff\f7\f1\ff\ff\13\e3\ff\ffR\f2\ff\ff\e9\e2\ff\ff\ad\f2\ff\ff\bf\e2\ff\ff\09\f3\ff\ff\97\e2\ff\ffe\f3\ff\ffp\e2\ff\ff\c2\f3\ff\ffJ\e2\ff\ff\1f\f4\ff\ff%\e2\ff\ff|\f4\ff\ff\02\e2\ff\ff\da\f4\ff\ff\df\e1\ff\ff9\f5\ff\ff\be\e1\ff\ff\98\f5\ff\ff\9e\e1\ff\ff\f7\f5\ff\ff\7f\e1\ff\ffV\f6\ff\ffa\e1\ff\ff\b6\f6\ff\ffE\e1\ff\ff\17\f7\ff\ff)\e1\ff\ffx\f7\ff\ff\0f\e1\ff\ff\d9\f7\ff\ff\f6\e0\ff\ff:\f8\ff\ff\de\e0\ff\ff\9c\f8\ff\ff\c8\e0\ff\ff\fe\f8\ff\ff\b2\e0\ff\ff`\f9\ff\ff\9e\e0\ff\ff\c2\f9\ff\ff\8b\e0\ff\ff%\fa\ff\ffy\e0\ff\ff\88\fa\ff\ffi\e0\ff\ff\eb\fa\ff\ffY\e0\ff\ffN\fb\ff\ffK\e0\ff\ff\b2\fb\ff\ff>\e0\ff\ff\16\fc\ff\ff2\e0\ff\ffz\fc\ff\ff(\e0\ff\ff\de\fc\ff\ff\1f\e0\ff\ffB\fd\ff\ff\17\e0\ff\ff\a6\fd\ff\ff\10\e0\ff\ff\0a\fe\ff\ff\0a\e0\ff\ffo\fe\ff\ff\06\e0\ff\ff\d3\fe\ff\ff\03\e0\ff\ff7\ff\ff\ff\01\e0\ff\ff\9c\ff\ff\ff\00 \00\00\00\00\00\00\ff\1f\00\00\ce\ff\ff\ff\ff\1f\00\00\9c\ff\ff\ff\fe\1f\00\00j\ff\ff\ff\fd\1f\00\007\ff\ff\ff\fc\1f\00\00\05\ff\ff\ff\fa\1f\00\00\d3\fe\ff\ff\f8\1f\00\00\a1\fe\ff\ff\f6\1f\00\00o\fe\ff\ff\f3\1f\00\00<\fe\ff\ff\f0\1f\00\00\0a\fe\ff\ff\ed\1f\00\00\d8\fd\ff\ff\e9\1f\00\00\a6\fd\ff\ff\e5\1f\00\00t\fd\ff\ff\e1\1f\00\00B\fd\ff\ff\dd\1f\00\00\10\fd\ff\ff\d8\1f\00\00\de\fc\ff\ff\d3\1f\00\00\ac\fc\ff\ff\ce\1f\00\00z\fc\ff\ff\c8\1f\00\00H\fc\ff\ff\c2\1f\00\00\16\fc\ff\ff\bc\1f\00\00\e4\fb\ff\ff\b5\1f\00\00\b2\fb\ff\ff\ae\1f\00\00\80\fb\ff\ff\a7\1f\00\00N\fb\ff\ff\9f\1f\00\00\1d\fb\ff\ff\97\1f\00\00\eb\fa\ff\ff\8f\1f\00\00\ba\fa\ff\ff\87\1f\00\00\88\fa\ff\ff~\1f\00\00V\fa\ff\ffu\1f\00\00%\fa\ff\ffl\1f\00\00\f4\f9\ff\ffb\1f\00\00\c2\f9\ff\ffX\1f\00\00\91\f9\ff\ffN\1f\00\00`\f9\ff\ffC\1f\00\00/\f9\ff\ff8\1f\00\00\fe\f8\ff\ff-\1f\00\00\cd\f8\ff\ff\22\1f\00\00\9c\f8\ff\ff\16\1f\00\00k\f8\ff\ff\0a\1f\00\00:\f8\ff\ff\fe\1e\00\00\09\f8\ff\ff\f1\1e\00\00\d9\f7\ff\ff\e4\1e\00\00\a8\f7\ff\ff\d7\1e\00\00x\f7\ff\ff\c9\1e\00\00G\f7\ff\ff\bb\1e\00\00\17\f7\ff\ff\ad\1e\00\00\e7\f6\ff\ff\9f\1e\00\00\b6\f6\ff\ff\90\1e\00\00\86\f6\ff\ff\81\1e\00\00V\f6\ff\ffr\1e\00\00'\f6\ff\ffb\1e\00\00\f7\f5\ff\ffR\1e\00\00\c7\f5\ff\ffB\1e\00\00\98\f5\ff\ff1\1e\00\00h\f5\ff\ff!\1e\00\009\f5\ff\ff\10\1e\00\00\09\f5\ff\ff\fe\1d\00\00\da\f4\ff\ff\ed\1d\00\00\ab\f4\ff\ff\db\1d\00\00|\f4\ff\ff\c8\1d\00\00M\f4\ff\ff\b6\1d\00\00\1f\f4\ff\ff\a3\1d\00\00\f0\f3\ff\ff\90\1d\00\00\c2\f3\ff\ff}\1d\00\00\93\f3\ff\ffi\1d\00\00e\f3\ff\ffU\1d\00\007\f3\ff\ffA\1d\00\00\09\f3\ff\ff,\1d\00\00\db\f2\ff\ff\17\1d\00\00\ad\f2\ff\ff\02\1d\00\00\7f\f2\ff\ff\ed\1c\00\00R\f2\ff\ff\d7\1c\00\00%\f2\ff\ff\c1\1c\00\00\f7\f1\ff\ff\ab\1c\00\00\ca\f1\ff\ff\95\1c\00\00\9d\f1\ff\ff~\1c\00\00p\f1\ff\ffg\1c\00\00D\f1\ff\ffP\1c\00\00\17\f1\ff\ff8\1c\00\00\eb\f0\ff\ff \1c\00\00\bf\f0\ff\ff\08\1c\00\00\92\f0\ff\ff\f0\1b\00\00f\f0\ff\ff\d7\1b\00\00;\f0\ff\ff\be\1b\00\00\0f\f0\ff\ff\a5\1b\00\00\e4\ef\ff\ff\8c\1b\00\00\b8\ef\ff\ffr\1b\00\00\8d\ef\ff\ffX\1b\00\00b\ef\ff\ff>\1b\00\007\ef\ff\ff#\1b\00\00\0c\ef\ff\ff\09\1b\00\00\e2\ee\ff\ff\ee\1a\00\00\b7\ee\ff\ff\d2\1a\00\00\8d\ee\ff\ff\b7\1a\00\00c\ee\ff\ff\9b\1a\00\009\ee\ff\ff\7f\1a\00\00\10\ee\ff\ffc\1a\00\00\e6\ed\ff\ffF\1a\00\00\bd\ed\ff\ff)\1a\00\00\93\ed\ff\ff\0c\1a\00\00j\ed\ff\ff\ef\19\00\00B\ed\ff\ff\d1\19\00\00\19\ed\ff\ff\b3\19\00\00\f1\ec\ff\ff\95\19\00\00\c8\ec\ff\ffw\19\00\00\a0\ec\ff\ffX\19\00\00x\ec\ff\ff:\19\00\00Q\ec\ff\ff\1b\19\00\00)\ec\ff\ff\fb\18\00\00\02\ec\ff\ff\dc\18\00\00\db\eb\ff\ff\bc\18\00\00\b4\eb\ff\ff\9c\18\00\00\8d\eb\ff\ff|\18\00\00f\eb\ff\ff[\18\00\00@\eb\ff\ff;\18\00\00\1a\eb\ff\ff\1a\18\00\00\f4\ea\ff\ff\f8\17\00\00\ce\ea\ff\ff\d7\17\00\00\a8\ea\ff\ff\b5\17\00\00\83\ea\ff\ff\94\17\00\00^\ea\ff\ffq\17\00\009\ea\ff\ffO\17\00\00\14\ea\ff\ff-\17\00\00\f0\e9\ff\ff\0a\17\00\00\cb\e9\ff\ff\e7\16\00\00\a7\e9\ff\ff\c4\16\00\00\84\e9\ff\ff\a0\16\00\00`\e9\ff\ff|\16\00\00<\e9\ff\ffY\16\00\00\19\e9\ff\ff5\16\00\00\f6\e8\ff\ff\10\16\00\00\d3\e8\ff\ff\ec\15\00\00\b1\e8\ff\ff\c7\15\00\00\8f\e8\ff\ff\a2\15\00\00l\e8\ff\ff}\15\00\00K\e8\ff\ffX\15\00\00)\e8\ff\ff2\15\00\00\08\e8\ff\ff\0c\15\00\00\e6\e7\ff\ff\e6\14\00\00\c5\e7\ff\ff\c0\14\00\00\a5\e7\ff\ff\9a\14\00\00\84\e7\ff\ffs\14\00\00d\e7\ff\ffL\14\00\00D\e7\ff\ff%\14\00\00$\e7\ff\ff\fe\13\00\00\05\e7\ff\ff\d7\13\00\00\e5\e6\ff\ff\af\13\00\00\c6\e6\ff\ff\88\13\00\00\a8\e6\ff\ff`\13\00\00\89\e6\ff\ff8\13\00\00k\e6\ff\ff\0f\13\00\00M\e6\ff\ff\e7\12\00\00/\e6\ff\ff\be\12\00\00\11\e6\ff\ff\96\12\00\00\f4\e5\ff\ffm\12\00\00\d7\e5\ff\ffC\12\00\00\ba\e5\ff\ff\1a\12\00\00\9d\e5\ff\ff\f0\11\00\00\81\e5\ff\ff\c7\11\00\00e\e5\ff\ff\9d\11\00\00I\e5\ff\ffs\11\00\00.\e5\ff\ffI\11\00\00\12\e5\ff\ff\1e\11\00\00\f7\e4\ff\ff\f4\10\00\00\dd\e4\ff\ff\c9\10\00\00\c2\e4\ff\ff\9e\10\00\00\a8\e4\ff\ffs\10\00\00\8e\e4\ff\ffH\10\00\00t\e4\ff\ff\1c\10\00\00[\e4\ff\ff\f1\0f\00\00B\e4\ff\ff\c5\0f\00\00)\e4\ff\ff\9a\0f\00\00\10\e4\ff\ffn\0f\00\00\f8\e3\ff\ffA\0f\00\00\e0\e3\ff\ff\15\0f\00\00\c8\e3\ff\ff\e9\0e\00\00\b0\e3\ff\ff\bc\0e\00\00\99\e3\ff\ff\90\0e\00\00\82\e3\ff\ffc\0e\00\00k\e3\ff\ff6\0e\00\00U\e3\ff\ff\09\0e\00\00?\e3\ff\ff\db\0d\00\00)\e3\ff\ff\ae\0d\00\00\13\e3\ff\ff\81\0d\00\00\fe\e2\ff\ffS\0d\00\00\e9\e2\ff\ff%\0d\00\00\d4\e2\ff\ff\f7\0c\00\00\bf\e2\ff\ff\c9\0c\00\00\ab\e2\ff\ff\9b\0c\00\00\97\e2\ff\ffm\0c\00\00\83\e2\ff\ff>\0c\00\00p\e2\ff\ff\10\0c\00\00]\e2\ff\ff\e1\0b\00\00J\e2\ff\ff\b3\0b\00\008\e2\ff\ff\84\0b\00\00%\e2\ff\ffU\0b\00\00\13\e2\ff\ff&\0b\00\00\02\e2\ff\ff\f7\0a\00\00\f0\e1\ff\ff\c7\0a\00\00\df\e1\ff\ff\98\0a\00\00\cf\e1\ff\ffh\0a\00\00\be\e1\ff\ff9\0a\00\00\ae\e1\ff\ff\09\0a\00\00\9e\e1\ff\ff\d9\09\00\00\8e\e1\ff\ff\aa\09\00\00\7f\e1\ff\ffz\09\00\00p\e1\ff\ffJ\09\00\00a\e1\ff\ff\19\09\00\00S\e1\ff\ff\e9\08\00\00E\e1\ff\ff\b9\08\00\007\e1\ff\ff\88\08\00\00)\e1\ff\ffX\08\00\00\1c\e1\ff\ff'\08\00\00\0f\e1\ff\ff\f7\07\00\00\02\e1\ff\ff\c6\07\00\00\f6\e0\ff\ff\95\07\00\00\ea\e0\ff\ffd\07\00\00\de\e0\ff\ff3\07\00\00\d3\e0\ff\ff\02\07\00\00\c8\e0\ff\ff\d1\06\00\00\bd\e0\ff\ff\a0\06\00\00\b2\e0\ff\ffo\06\00\00\a8\e0\ff\ff>\06\00\00\9e\e0\ff\ff\0c\06\00\00\94\e0\ff\ff\db\05\00\00\8b\e0\ff\ff\aa\05\00\00\82\e0\ff\ffx\05\00\00y\e0\ff\ffF\05\00\00q\e0\ff\ff\15\05\00\00i\e0\ff\ff\e3\04\00\00a\e0\ff\ff\b2\04\00\00Y\e0\ff\ff\80\04\00\00R\e0\ff\ffN\04\00\00K\e0\ff\ff\1c\04\00\00D\e0\ff\ff\ea\03\00\00>\e0\ff\ff\b8\03\00\008\e0\ff\ff\86\03\00\002\e0\ff\ffT\03\00\00-\e0\ff\ff\22\03\00\00(\e0\ff\ff\f0\02\00\00#\e0\ff\ff\be\02\00\00\1f\e0\ff\ff\8c\02\00\00\1b\e0\ff\ffZ\02\00\00\17\e0\ff\ff(\02\00\00\13\e0\ff\ff\f6\01\00\00\10\e0\ff\ff\c4\01\00\00\0d\e0\ff\ff\91\01\00\00\0a\e0\ff\ff_\01\00\00\08\e0\ff\ff-\01\00\00\06\e0\ff\ff\fb\00\00\00\04\e0\ff\ff\c9\00\00\00\03\e0\ff\ff\96\00\00\00\02\e0\ff\ffd\00\00\00\01\e0\ff\ff2\00\00\00\01\e0\ff\ff\00\00\00\00\01\e0\ff\ff\ce\ff\ff\ff\01\e0\ff\ff\9c\ff\ff\ff\01\e0\ff\ffj\ff\ff\ff\02\e0\ff\ff7\ff\ff\ff\03\e0\ff\ff\05\ff\ff\ff\04\e0\ff\ff\d3\fe\ff\ff\06\e0\ff\ff\a1\fe\ff\ff\08\e0\ff\ffo\fe\ff\ff\0a\e0\ff\ff<\fe\ff\ff\0d\e0\ff\ff\0a\fe\ff\ff\10\e0\ff\ff\d8\fd\ff\ff\13\e0\ff\ff\a6\fd\ff\ff\17\e0\ff\fft\fd\ff\ff\1b\e0\ff\ffB\fd\ff\ff\1f\e0\ff\ff\10\fd\ff\ff#\e0\ff\ff\de\fc\ff\ff(\e0\ff\ff\ac\fc\ff\ff-\e0\ff\ffz\fc\ff\ff2\e0\ff\ffH\fc\ff\ff8\e0\ff\ff\16\fc\ff\ff>\e0\ff\ff\e4\fb\ff\ffD\e0\ff\ff\b2\fb\ff\ffK\e0\ff\ff\80\fb\ff\ffR\e0\ff\ffN\fb\ff\ffY\e0\ff\ff\1d\fb\ff\ffa\e0\ff\ff\eb\fa\ff\ffi\e0\ff\ff\ba\fa\ff\ffq\e0\ff\ff\88\fa\ff\ffy\e0\ff\ffV\fa\ff\ff\82\e0\ff\ff%\fa\ff\ff\8b\e0\ff\ff\f4\f9\ff\ff\94\e0\ff\ff\c2\f9\ff\ff\9e\e0\ff\ff\91\f9\ff\ff\a8\e0\ff\ff`\f9\ff\ff\b2\e0\ff\ff/\f9\ff\ff\bd\e0\ff\ff\fe\f8\ff\ff\c8\e0\ff\ff\cd\f8\ff\ff\d3\e0\ff\ff\9c\f8\ff\ff\de\e0\ff\ffk\f8\ff\ff\ea\e0\ff\ff:\f8\ff\ff\f6\e0\ff\ff\09\f8\ff\ff\02\e1\ff\ff\d9\f7\ff\ff\0f\e1\ff\ff\a8\f7\ff\ff\1c\e1\ff\ffx\f7\ff\ff)\e1\ff\ffG\f7\ff\ff7\e1\ff\ff\17\f7\ff\ffE\e1\ff\ff\e7\f6\ff\ffS\e1\ff\ff\b6\f6\ff\ffa\e1\ff\ff\86\f6\ff\ffp\e1\ff\ffV\f6\ff\ff\7f\e1\ff\ff'\f6\ff\ff\8e\e1\ff\ff\f7\f5\ff\ff\9e\e1\ff\ff\c7\f5\ff\ff\ae\e1\ff\ff\98\f5\ff\ff\be\e1\ff\ffh\f5\ff\ff\cf\e1\ff\ff9\f5\ff\ff\df\e1\ff\ff\09\f5\ff\ff\f0\e1\ff\ff\da\f4\ff\ff\02\e2\ff\ff\ab\f4\ff\ff\13\e2\ff\ff|\f4\ff\ff%\e2\ff\ffM\f4\ff\ff8\e2\ff\ff\1f\f4\ff\ffJ\e2\ff\ff\f0\f3\ff\ff]\e2\ff\ff\c2\f3\ff\ffp\e2\ff\ff\93\f3\ff\ff\83\e2\ff\ffe\f3\ff\ff\97\e2\ff\ff7\f3\ff\ff\ab\e2\ff\ff\09\f3\ff\ff\bf\e2\ff\ff\db\f2\ff\ff\d4\e2\ff\ff\ad\f2\ff\ff\e9\e2\ff\ff\7f\f2\ff\ff\fe\e2\ff\ffR\f2\ff\ff\13\e3\ff\ff%\f2\ff\ff)\e3\ff\ff\f7\f1\ff\ff?\e3\ff\ff\ca\f1\ff\ffU\e3\ff\ff\9d\f1\ff\ffk\e3\ff\ffp\f1\ff\ff\82\e3\ff\ffD\f1\ff\ff\99\e3\ff\ff\17\f1\ff\ff\b0\e3\ff\ff\eb\f0\ff\ff\c8\e3\ff\ff\bf\f0\ff\ff\e0\e3\ff\ff\92\f0\ff\ff\f8\e3\ff\fff\f0\ff\ff\10\e4\ff\ff;\f0\ff\ff)\e4\ff\ff\0f\f0\ff\ffB\e4\ff\ff\e4\ef\ff\ff[\e4\ff\ff\b8\ef\ff\fft\e4\ff\ff\8d\ef\ff\ff\8e\e4\ff\ffb\ef\ff\ff\a8\e4\ff\ff7\ef\ff\ff\c2\e4\ff\ff\0c\ef\ff\ff\dd\e4\ff\ff\e2\ee\ff\ff\f7\e4\ff\ff\b7\ee\ff\ff\12\e5\ff\ff\8d\ee\ff\ff.\e5\ff\ffc\ee\ff\ffI\e5\ff\ff9\ee\ff\ffe\e5\ff\ff\10\ee\ff\ff\81\e5\ff\ff\e6\ed\ff\ff\9d\e5\ff\ff\bd\ed\ff\ff\ba\e5\ff\ff\93\ed\ff\ff\d7\e5\ff\ffj\ed\ff\ff\f4\e5\ff\ffB\ed\ff\ff\11\e6\ff\ff\19\ed\ff\ff/\e6\ff\ff\f1\ec\ff\ffM\e6\ff\ff\c8\ec\ff\ffk\e6\ff\ff\a0\ec\ff\ff\89\e6\ff\ffx\ec\ff\ff\a8\e6\ff\ffQ\ec\ff\ff\c6\e6\ff\ff)\ec\ff\ff\e5\e6\ff\ff\02\ec\ff\ff\05\e7\ff\ff\db\eb\ff\ff$\e7\ff\ff\b4\eb\ff\ffD\e7\ff\ff\8d\eb\ff\ffd\e7\ff\fff\eb\ff\ff\84\e7\ff\ff@\eb\ff\ff\a5\e7\ff\ff\1a\eb\ff\ff\c5\e7\ff\ff\f4\ea\ff\ff\e6\e7\ff\ff\ce\ea\ff\ff\08\e8\ff\ff\a8\ea\ff\ff)\e8\ff\ff\83\ea\ff\ffK\e8\ff\ff^\ea\ff\ffm\e8\ff\ff9\ea\ff\ff\8f\e8\ff\ff\14\ea\ff\ff\b1\e8\ff\ff\f0\e9\ff\ff\d3\e8\ff\ff\cb\e9\ff\ff\f6\e8\ff\ff\a7\e9\ff\ff\19\e9\ff\ff\84\e9\ff\ff<\e9\ff\ff`\e9\ff\ff`\e9\ff\ff<\e9\ff\ff\84\e9\ff\ff\19\e9\ff\ff\a7\e9\ff\ff\f6\e8\ff\ff\cb\e9\ff\ff\d3\e8\ff\ff\f0\e9\ff\ff\b1\e8\ff\ff\14\ea\ff\ff\8f\e8\ff\ff9\ea\ff\ffl\e8\ff\ff^\ea\ff\ffK\e8\ff\ff\83\ea\ff\ff)\e8\ff\ff\a8\ea\ff\ff\08\e8\ff\ff\ce\ea\ff\ff\e6\e7\ff\ff\f4\ea\ff\ff\c5\e7\ff\ff\1a\eb\ff\ff\a5\e7\ff\ff@\eb\ff\ff\84\e7\ff\fff\eb\ff\ffd\e7\ff\ff\8d\eb\ff\ffD\e7\ff\ff\b4\eb\ff\ff$\e7\ff\ff\db\eb\ff\ff\05\e7\ff\ff\02\ec\ff\ff\e5\e6\ff\ff)\ec\ff\ff\c6\e6\ff\ffQ\ec\ff\ff\a8\e6\ff\ffx\ec\ff\ff\89\e6\ff\ff\a0\ec\ff\ffk\e6\ff\ff\c8\ec\ff\ffM\e6\ff\ff\f1\ec\ff\ff/\e6\ff\ff\19\ed\ff\ff\11\e6\ff\ffB\ed\ff\ff\f4\e5\ff\ffj\ed\ff\ff\d7\e5\ff\ff\93\ed\ff\ff\ba\e5\ff\ff\bd\ed\ff\ff\9d\e5\ff\ff\e6\ed\ff\ff\81\e5\ff\ff\10\ee\ff\ffe\e5\ff\ff9\ee\ff\ffI\e5\ff\ffc\ee\ff\ff.\e5\ff\ff\8d\ee\ff\ff\12\e5\ff\ff\b7\ee\ff\ff\f7\e4\ff\ff\e2\ee\ff\ff\dd\e4\ff\ff\0c\ef\ff\ff\c2\e4\ff\ff7\ef\ff\ff\a8\e4\ff\ffb\ef\ff\ff\8e\e4\ff\ff\8d\ef\ff\fft\e4\ff\ff\b8\ef\ff\ff[\e4\ff\ff\e4\ef\ff\ffB\e4\ff\ff\0f\f0\ff\ff)\e4\ff\ff;\f0\ff\ff\10\e4\ff\fff\f0\ff\ff\f8\e3\ff\ff\92\f0\ff\ff\e0\e3\ff\ff\bf\f0\ff\ff\c8\e3\ff\ff\eb\f0\ff\ff\b0\e3\ff\ff\17\f1\ff\ff\99\e3\ff\ffD\f1\ff\ff\82\e3\ff\ffp\f1\ff\ffk\e3\ff\ff\9d\f1\ff\ffU\e3\ff\ff\ca\f1\ff\ff?\e3\ff\ff\f7\f1\ff\ff)\e3\ff\ff%\f2\ff\ff\13\e3\ff\ffR\f2\ff\ff\fe\e2\ff\ff\7f\f2\ff\ff\e9\e2\ff\ff\ad\f2\ff\ff\d4\e2\ff\ff\db\f2\ff\ff\bf\e2\ff\ff\09\f3\ff\ff\ab\e2\ff\ff7\f3\ff\ff\97\e2\ff\ffe\f3\ff\ff\83\e2\ff\ff\93\f3\ff\ffp\e2\ff\ff\c2\f3\ff\ff]\e2\ff\ff\f0\f3\ff\ffJ\e2\ff\ff\1f\f4\ff\ff8\e2\ff\ffM\f4\ff\ff%\e2\ff\ff|\f4\ff\ff\13\e2\ff\ff\ab\f4\ff\ff\02\e2\ff\ff\da\f4\ff\ff\f0\e1\ff\ff\09\f5\ff\ff\df\e1\ff\ff9\f5\ff\ff\cf\e1\ff\ffh\f5\ff\ff\be\e1\ff\ff\98\f5\ff\ff\ae\e1\ff\ff\c7\f5\ff\ff\9e\e1\ff\ff\f7\f5\ff\ff\8e\e1\ff\ff'\f6\ff\ff\7f\e1\ff\ffV\f6\ff\ffp\e1\ff\ff\86\f6\ff\ffa\e1\ff\ff\b6\f6\ff\ffS\e1\ff\ff\e7\f6\ff\ffE\e1\ff\ff\17\f7\ff\ff7\e1\ff\ffG\f7\ff\ff)\e1\ff\ffx\f7\ff\ff\1c\e1\ff\ff\a8\f7\ff\ff\0f\e1\ff\ff\d9\f7\ff\ff\02\e1\ff\ff\09\f8\ff\ff\f6\e0\ff\ff:\f8\ff\ff\ea\e0\ff\ffk\f8\ff\ff\de\e0\ff\ff\9c\f8\ff\ff\d3\e0\ff\ff\cd\f8\ff\ff\c8\e0\ff\ff\fe\f8\ff\ff\bd\e0\ff\ff/\f9\ff\ff\b2\e0\ff\ff`\f9\ff\ff\a8\e0\ff\ff\91\f9\ff\ff\9e\e0\ff\ff\c2\f9\ff\ff\94\e0\ff\ff\f4\f9\ff\ff\8b\e0\ff\ff%\fa\ff\ff\82\e0\ff\ffV\fa\ff\ffy\e0\ff\ff\88\fa\ff\ffq\e0\ff\ff\ba\fa\ff\ffi\e0\ff\ff\eb\fa\ff\ffa\e0\ff\ff\1d\fb\ff\ffY\e0\ff\ffN\fb\ff\ffR\e0\ff\ff\80\fb\ff\ffK\e0\ff\ff\b2\fb\ff\ffD\e0\ff\ff\e4\fb\ff\ff>\e0\ff\ff\16\fc\ff\ff8\e0\ff\ffH\fc\ff\ff2\e0\ff\ffz\fc\ff\ff-\e0\ff\ff\ac\fc\ff\ff(\e0\ff\ff\de\fc\ff\ff#\e0\ff\ff\10\fd\ff\ff\1f\e0\ff\ffB\fd\ff\ff\1b\e0\ff\fft\fd\ff\ff\17\e0\ff\ff\a6\fd\ff\ff\13\e0\ff\ff\d8\fd\ff\ff\10\e0\ff\ff\0a\fe\ff\ff\0d\e0\ff\ff<\fe\ff\ff\0a\e0\ff\ffo\fe\ff\ff\08\e0\ff\ff\a1\fe\ff\ff\06\e0\ff\ff\d3\fe\ff\ff\04\e0\ff\ff\05\ff\ff\ff\03\e0\ff\ff7\ff\ff\ff\02\e0\ff\ffj\ff\ff\ff\01\e0\ff\ff\9c\ff\ff\ff\01\e0\ff\ff\ce\ff\ff\ff\00\00\00\00\00\00\00\00\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?\fe\d4x>B`\a5>\aeG\01?X94\beR\b8^\bfj\bc\b4>\c5 \b0\be\e5\d0\e2\be?5\de\be\0a\d7\a3\beh\91m>\b0r\e8\be\0a\d7\a3\beB`\a5\be\e3\a5;\bfq=\0a?")) diff --git a/targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft.c b/targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft.c new file mode 100644 index 0000000..439f8d6 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft.c @@ -0,0 +1,330 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: fft + + Author: Juan Martinez Velarde + + Function: benchmarking of an integer stage scaling FFT + To avoid errors caused by overflow and bit growth, + the input data is scaled. Bit growth occurs potentially + at butterfly operations, which involve a complex + multiplication, a complex addition and a complex + subtraction. Maximal bit growth from butterfly input + to butterfly output is two bits. + + The input data includes enough extra sign bits, called + guard bits, to ensure that bit growth never results in + overflow (Rabiner and Gold, 1975). Data can grow by a + maximum factor of 2.4 from butterfly input to output + (two bits of grow). However, a data value cannot grow by + maximum amount in two consecutive stages. + The number of guard bits necessary to compensate the + maximum bit growth in an N-point FFT is (log_2 (N))+1). + + In a 16-point FFT (requires 4 stages), each of the + input samples should contain 5 guard bits. The input + data is then restricted to 10 bits, one sign bit and + nine magnitude bits, in order to prevent an + overflow from the integer multiplication with the + precalculed twiddle coefficients. + + Another method to compensate bit growth is to scale the + outputs down by a factor of two unconditionally after + each stage. This approach is called unconditional scaling + + Initially, 2 guard bits are included in the input data to + accomodate the maximum overflow in the first stage. + In each butterfly of a stage calculation, the data can + grow into the guard bits. To prevent overflow in the next + stage, the guard bits are replaced before the next stage is + executed by shifting the entire block of data one bit + to the right. + + Input data should not be restricted to a 1.9 format. + Input data can be represented in a 1.13 format,that is + 14 significant bits, one sign and 13 magnitude bits. In + the FFT calculation, the data loses a total of (log2 N) -1 + bits because of shifting. Unconditional scaling results + in the same number of bits lost as in the input data scaling. + However, it produces more precise results because the + FFT starts with more precise input data. The tradeoff is + a slower FFT calculation because of the extra cycles needed + to shift the output of each stage. + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: fft_1024_13 + (merged main1024_bit_reduct and fft_bit_reduct from DSP-Stone) + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define N_FFT 1024 +#define NUMBER_OF_BITS 13 /* fract format 1.NUMBER_OF_BITS = 1.13 */ + +#define BITS_PER_TWID 13 /* bits per twiddle coefficient */ +#define SHIFT BITS_PER_TWID /* fractional shift after each multiplication */ + +/* + Forward declaration of functions +*/ + +float fft_exp2f(float x); +float fft_modff(float x, float *intpart); +int fft_convert(float value); +void fft_bit_reduct(register int *int_pointer); +void fft_pin_down(int input_data[]); +void fft_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fft_main(void); +int fft_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Forward declaration of global variables +*/ + +int fft_input_data[2 * N_FFT]; + +/* precalculated twiddle factors + for an integer 1024 point FFT + in format 1.13 => table twidtable[ 2*(N_FFT-1) ] ; */ +extern int fft_twidtable[2046]; + +/* 1024 real values as input data in float format */ +extern float fft_input[1024]; + +/* will hold the transformed data */ +int fft_inputfract[N_FFT]; + +/* + Algorithm core function +*/ + +void +fft_bit_reduct(register int *int_pointer) { + register int i, j = 0; + register int tmpr, max = 2, m, n = N_FFT << 1; + + /* do the bit reversal scramble of the input data */ + __pragma_loopbound(1024, 1024); + for (i = 0; i < (n - 1); i += 2) { + if (j > i) { + tmpr = *(int_pointer + j); + *(int_pointer + j) = *(int_pointer + i); + *(int_pointer + i) = tmpr; + + tmpr = *(int_pointer + j + 1); + *(int_pointer + j + 1) = *(int_pointer + i + 1); + *(int_pointer + i + 1) = tmpr; + } + + m = N_FFT; + + __pragma_loopbound(0, 10); + while (m >= 2 && j >= m) { + j -= m; + m >>= 1; + } + j += m; + } + + { + register int *data_pointer = &fft_twidtable[0]; + register int *p, *q; + register int tmpi, fr = 0, level, k, l; + + __pragma_loopbound(10, 10); + while (n > max) { + level = max << 1; + + __pragma_loopbound(1, 512); + for (m = 1; m < max; m += 2) { + l = *(data_pointer + fr); + k = *(data_pointer + fr + 1); + fr += 2; + + __pragma_loopbound(1, 512); + for (i = m; i <= n; i += level) { + j = i + max; + p = int_pointer + j; + q = int_pointer + i; + + tmpr = l * *(p - 1); + tmpr -= (k * *p); + + tmpi = l * *p; + tmpi += (k * *(p - 1)); + + tmpr = tmpr >> SHIFT; + tmpi = tmpi >> SHIFT; + + *(p - 1) = *(q - 1) - tmpr; + *p = *q - tmpi; + + *(q - 1) += tmpr; + *q += tmpi; + } + } + + /* implement unconditional bit reduction */ + + { + register int f; + + p = int_pointer; + + __pragma_loopbound(2048, 2048); + for (f = 0; f < 2 * N_FFT; f++) { + *p = *p >> 1; + p++; + } + } + + max = level; + } + } +} + +/* + Initialization- and return-value-related functions +*/ + +/* conversion function to 1.NUMBER_OF_BITS format */ +float +fft_exp2f(float x) { + int i; + float ret = 2.0f; + + __pragma_loopbound(13, 13); + for (i = 1; i < x; ++i) + ret *= 2.0f; + + return ret; +} + +float +fft_modff(float x, float *intpart) { + if (intpart) { + *intpart = (int) x; + return x - *intpart; + } else + return x; +} + +/* conversion function to 1.NUMBER_OF_BITS format */ +int +fft_convert(float value) { + float man, t_val, frac, m, exponent = NUMBER_OF_BITS; + int rnd_val; + unsigned long int_val; + unsigned long pm_val; + + m = fft_exp2f(exponent + 1) - 1; + + t_val = value * m; + frac = fft_modff(t_val, &man); + if (frac < 0.0f) { + rnd_val = (-1); + if (frac > -0.5f) + rnd_val = 0; + } else { + rnd_val = 1; + if (frac < 0.5f) + rnd_val = 0; + } + int_val = (long) man + (long) rnd_val; + + pm_val = int_val; + return ((int) (pm_val)); +} + +void +fft_float2fract(void) { + float f; + int j, i; + + __pragma_loopbound(1024, 1024); + for (j = 0; j < N_FFT; j++) { + f = fft_input[j]; + i = fft_convert(f); + fft_inputfract[j] = i; + } +} + +void +fft_pin_down(int input_data[]) { + /* conversion from input to a 1.13 format */ + fft_float2fract(); + + int *pd, *ps, f; + + pd = &input_data[0]; + ps = &fft_inputfract[0]; + + __pragma_loopbound(1024, 1024); + for (f = 0; f < N_FFT; f++) { + *pd++ = *ps++; /* fill in with real data */ + *pd++ = 0; /* imaginary data is equal zero */ + } +} + +void +fft_init(void) { + int i; + volatile int x = 0; + + fft_pin_down(&fft_input_data[0]); + + /* avoid constant propagation of input values */ + __pragma_loopbound(2046, 2046); + for (i = 0; i < 2 * (N_FFT - 1); i++) { + fft_input_data[i] += x; + fft_twidtable[i] += x; + } + __pragma_loopbound(2, 2); + for (; i < 2 * N_FFT; i++) + fft_input_data[i] += x; +} + +int +fft_return(void) { + int check_sum = 0; + int i = 0; + + __pragma_loopbound(2048, 2048); + for (i = 0; i < 2 * N_FFT; ++i) + check_sum += fft_input_data[i]; + + return check_sum != 3968; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fft_main(void) { + fft_bit_reduct(&fft_input_data[0]); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fft_init(); + + fft_main(); + + return fft_return(); +} diff --git a/targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft_input.c b/targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft_input.c new file mode 100644 index 0000000..ae045c8 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/generated/modified_sources/default/fft_input.c @@ -0,0 +1,320 @@ + + +int fft_twidtable[2046] = { + 8192, 0, 8192, 0, 0, -8192, 8192, 0, 5792, -5792, 0, + -8191, -5792, -5792, 8192, 0, 7568, -3134, 5792, -5792, 3134, -7568, + 0, -8192, -3134, -7568, -5792, -5792, -7568, -3134, 8192, 0, 8034, + -1598, 7568, -3134, 6811, -4551, 5792, -5792, 4551, -6811, 3134, -7568, + 1598, -8034, 0, -8192, -1598, -8034, -3134, -7568, -4551, -6811, -5792, + -5792, -6811, -4551, -7568, -3134, -8034, -1598, 8192, 0, 8152, -802, + 8034, -1598, 7839, -2378, 7568, -3134, 7224, -3861, 6811, -4551, 6332, + -5196, 5792, -5792, 5196, -6332, 4551, -6811, 3861, -7224, 3134, -7568, + 2378, -7839, 1598, -8034, 802, -8152, 0, -8191, -802, -8152, -1598, + -8034, -2378, -7839, -3134, -7568, -3861, -7224, -4551, -6811, -5196, -6332, + -5792, -5792, -6332, -5196, -6811, -4551, -7224, -3861, -7568, -3134, -7839, + -2378, -8034, -1598, -8152, -802, 8192, 0, 8182, -401, 8152, -802, + 8103, -1202, 8034, -1598, 7946, -1990, 7839, -2378, 7713, -2759, 7568, + -3134, 7405, -3502, 7224, -3861, 7026, -4211, 6811, -4551, 6579, -4879, + 6332, -5196, 6069, -5501, 5792, -5792, 5501, -6069, 5196, -6332, 4879, + -6579, 4551, -6811, 4211, -7026, 3861, -7224, 3502, -7405, 3134, -7568, + 2759, -7713, 2378, -7839, 1990, -7946, 1598, -8034, 1202, -8103, 802, + -8152, 401, -8182, 0, -8192, -401, -8182, -802, -8152, -1202, -8103, + -1598, -8034, -1990, -7946, -2378, -7839, -2759, -7713, -3134, -7568, -3502, + -7405, -3861, -7224, -4211, -7026, -4551, -6811, -4879, -6579, -5196, -6332, + -5501, -6069, -5792, -5792, -6069, -5501, -6332, -5196, -6579, -4879, -6811, + -4551, -7026, -4211, -7224, -3861, -7405, -3502, -7568, -3134, -7713, -2759, + -7839, -2378, -7946, -1990, -8034, -1598, -8103, -1202, -8152, -802, -8182, + -401, 8192, 0, 8189, -201, 8182, -401, 8169, -602, 8152, -802, + 8130, -1002, 8103, -1202, 8071, -1400, 8034, -1598, 7992, -1794, 7946, + -1990, 7895, -2184, 7839, -2378, 7778, -2569, 7713, -2759, 7643, -2948, + 7568, -3134, 7489, -3319, 7405, -3502, 7317, -3683, 7224, -3861, 7127, + -4037, 7026, -4211, 6921, -4382, 6811, -4551, 6697, -4717, 6579, -4879, + 6458, -5039, 6332, -5196, 6203, -5350, 6069, -5501, 5933, -5648, 5792, + -5792, 5648, -5933, 5501, -6069, 5350, -6203, 5196, -6332, 5039, -6458, + 4879, -6579, 4717, -6697, 4551, -6811, 4382, -6921, 4211, -7026, 4037, + -7127, 3861, -7224, 3683, -7317, 3502, -7405, 3319, -7489, 3134, -7568, + 2948, -7643, 2759, -7713, 2569, -7778, 2378, -7839, 2184, -7895, 1990, + -7946, 1794, -7992, 1598, -8034, 1400, -8071, 1202, -8103, 1002, -8130, + 802, -8152, 602, -8169, 401, -8182, 201, -8189, 0, -8192, -201, + -8189, -401, -8182, -602, -8169, -802, -8152, -1002, -8130, -1202, -8103, + -1400, -8071, -1598, -8034, -1794, -7992, -1990, -7946, -2184, -7895, -2378, + -7839, -2569, -7778, -2759, -7713, -2948, -7643, -3134, -7568, -3319, -7489, + -3502, -7405, -3683, -7317, -3861, -7224, -4037, -7127, -4211, -7026, -4382, + -6921, -4551, -6811, -4717, -6697, -4879, -6579, -5039, -6458, -5196, -6332, + -5350, -6203, -5501, -6069, -5648, -5933, -5792, -5792, -5933, -5648, -6069, + -5501, -6203, -5350, -6332, -5196, -6458, -5039, -6579, -4879, -6697, -4717, + -6811, -4551, -6921, -4382, -7026, -4211, -7127, -4037, -7224, -3861, -7317, + -3683, -7405, -3502, -7489, -3319, -7568, -3134, -7643, -2948, -7713, -2759, + -7778, -2569, -7839, -2378, -7895, -2184, -7946, -1990, -7992, -1794, -8034, + -1598, -8071, -1400, -8103, -1202, -8130, -1002, -8152, -802, -8169, -602, + -8182, -401, -8189, -201, 8192, 0, 8191, -100, 8189, -201, 8186, + -301, 8182, -401, 8176, -502, 8169, -602, 8161, -702, 8152, -802, + 8142, -902, 8130, -1002, 8117, -1102, 8103, -1202, 8087, -1301, 8071, + -1400, 8053, -1499, 8034, -1598, 8014, -1696, 7992, -1794, 7970, -1892, + 7946, -1990, 7921, -2087, 7895, -2184, 7867, -2281, 7839, -2378, 7809, + -2474, 7778, -2569, 7746, -2664, 7713, -2759, 7678, -2854, 7643, -2948, + 7606, -3041, 7568, -3134, 7529, -3227, 7489, -3319, 7447, -3411, 7405, + -3502, 7361, -3593, 7317, -3683, 7271, -3772, 7224, -3861, 7176, -3950, + 7127, -4037, 7077, -4124, 7026, -4211, 6974, -4297, 6921, -4382, 6866, + -4467, 6811, -4551, 6755, -4634, 6697, -4717, 6639, -4798, 6579, -4879, + 6519, -4960, 6458, -5039, 6395, -5118, 6332, -5196, 6268, -5274, 6203, + -5350, 6136, -5426, 6069, -5501, 6001, -5575, 5933, -5648, 5863, -5721, + 5792, -5792, 5721, -5863, 5648, -5933, 5575, -6001, 5501, -6069, 5426, + -6136, 5350, -6203, 5274, -6268, 5196, -6332, 5118, -6395, 5039, -6458, + 4960, -6519, 4879, -6579, 4798, -6639, 4717, -6697, 4634, -6755, 4551, + -6811, 4467, -6866, 4382, -6921, 4297, -6974, 4211, -7026, 4124, -7077, + 4037, -7127, 3950, -7176, 3861, -7224, 3772, -7271, 3683, -7317, 3593, + -7361, 3502, -7405, 3411, -7447, 3319, -7489, 3227, -7529, 3134, -7568, + 3041, -7606, 2948, -7643, 2854, -7678, 2759, -7713, 2664, -7746, 2569, + -7778, 2474, -7809, 2378, -7839, 2281, -7867, 2184, -7895, 2087, -7921, + 1990, -7946, 1892, -7970, 1794, -7992, 1696, -8014, 1598, -8034, 1499, + -8053, 1400, -8071, 1301, -8087, 1202, -8103, 1102, -8117, 1002, -8130, + 902, -8142, 802, -8152, 702, -8161, 602, -8169, 502, -8176, 401, + -8182, 301, -8186, 201, -8189, 100, -8191, 0, -8192, -100, -8191, + -201, -8189, -301, -8186, -401, -8182, -502, -8176, -602, -8169, -702, + -8161, -802, -8152, -902, -8142, -1002, -8130, -1102, -8117, -1202, -8103, + -1301, -8087, -1400, -8071, -1499, -8053, -1598, -8034, -1696, -8014, -1794, + -7992, -1892, -7970, -1990, -7946, -2087, -7921, -2184, -7895, -2281, -7867, + -2378, -7839, -2474, -7809, -2569, -7778, -2664, -7746, -2759, -7713, -2854, + -7678, -2948, -7643, -3041, -7606, -3134, -7568, -3227, -7529, -3319, -7489, + -3411, -7447, -3502, -7405, -3593, -7361, -3683, -7317, -3772, -7271, -3861, + -7224, -3950, -7176, -4037, -7127, -4124, -7077, -4211, -7026, -4297, -6974, + -4382, -6921, -4467, -6866, -4551, -6811, -4634, -6755, -4717, -6697, -4798, + -6639, -4879, -6579, -4960, -6519, -5039, -6458, -5118, -6395, -5196, -6332, + -5274, -6268, -5350, -6203, -5426, -6136, -5501, -6069, -5575, -6001, -5648, + -5933, -5721, -5863, -5792, -5792, -5863, -5721, -5933, -5648, -6001, -5575, + -6069, -5501, -6136, -5426, -6203, -5350, -6268, -5274, -6332, -5196, -6395, + -5118, -6458, -5039, -6519, -4960, -6579, -4879, -6639, -4798, -6697, -4717, + -6755, -4634, -6811, -4551, -6866, -4467, -6921, -4382, -6974, -4297, -7026, + -4211, -7077, -4124, -7127, -4037, -7176, -3950, -7224, -3861, -7271, -3772, + -7317, -3683, -7361, -3593, -7405, -3502, -7447, -3411, -7489, -3319, -7529, + -3227, -7568, -3134, -7606, -3041, -7643, -2948, -7678, -2854, -7713, -2759, + -7746, -2664, -7778, -2569, -7809, -2474, -7839, -2378, -7867, -2281, -7895, + -2184, -7921, -2087, -7946, -1990, -7970, -1892, -7992, -1794, -8014, -1696, + -8034, -1598, -8053, -1499, -8071, -1400, -8087, -1301, -8103, -1202, -8117, + -1102, -8130, -1002, -8142, -902, -8152, -802, -8161, -702, -8169, -602, + -8176, -502, -8182, -401, -8186, -301, -8189, -201, -8191, -100, 8192, + 0, 8191, -50, 8191, -100, 8190, -150, 8189, -201, 8188, -251, + 8186, -301, 8184, -351, 8182, -401, 8179, -452, 8176, -502, 8173, + -552, 8169, -602, 8165, -652, 8161, -702, 8157, -752, 8152, -802, + 8147, -852, 8142, -902, 8136, -952, 8130, -1002, 8124, -1052, 8117, + -1102, 8110, -1152, 8103, -1202, 8095, -1251, 8087, -1301, 8079, -1350, + 8071, -1400, 8062, -1450, 8053, -1499, 8044, -1548, 8034, -1598, 8024, + -1647, 8014, -1696, 8003, -1745, 7992, -1794, 7981, -1843, 7970, -1892, + 7958, -1941, 7946, -1990, 7934, -2039, 7921, -2087, 7908, -2136, 7895, + -2184, 7881, -2233, 7867, -2281, 7853, -2329, 7839, -2378, 7824, -2426, + 7809, -2474, 7794, -2521, 7778, -2569, 7762, -2617, 7746, -2664, 7729, + -2712, 7713, -2759, 7696, -2807, 7678, -2854, 7661, -2901, 7643, -2948, + 7624, -2995, 7606, -3041, 7587, -3088, 7568, -3134, 7549, -3181, 7529, + -3227, 7509, -3273, 7489, -3319, 7468, -3365, 7447, -3411, 7426, -3457, + 7405, -3502, 7383, -3547, 7361, -3593, 7339, -3638, 7317, -3683, 7294, + -3728, 7271, -3772, 7248, -3817, 7224, -3861, 7200, -3905, 7176, -3950, + 7152, -3994, 7127, -4037, 7102, -4081, 7077, -4124, 7052, -4168, 7026, + -4211, 7000, -4254, 6974, -4297, 6947, -4340, 6921, -4382, 6894, -4425, + 6866, -4467, 6839, -4509, 6811, -4551, 6783, -4592, 6755, -4634, 6726, + -4675, 6697, -4717, 6668, -4758, 6639, -4798, 6609, -4839, 6579, -4879, + 6549, -4920, 6519, -4960, 6488, -5000, 6458, -5039, 6427, -5079, 6395, + -5118, 6364, -5157, 6332, -5196, 6300, -5235, 6268, -5274, 6235, -5312, + 6203, -5350, 6170, -5388, 6136, -5426, 6103, -5464, 6069, -5501, 6036, + -5538, 6001, -5575, 5967, -5612, 5933, -5648, 5898, -5685, 5863, -5721, + 5828, -5756, 5792, -5792, 5756, -5828, 5721, -5863, 5685, -5898, 5648, + -5933, 5612, -5967, 5575, -6001, 5538, -6036, 5501, -6069, 5464, -6103, + 5426, -6136, 5388, -6170, 5350, -6203, 5312, -6235, 5274, -6268, 5235, + -6300, 5196, -6332, 5157, -6364, 5118, -6395, 5079, -6427, 5039, -6458, + 5000, -6488, 4960, -6519, 4920, -6549, 4879, -6579, 4839, -6609, 4798, + -6639, 4758, -6668, 4717, -6697, 4675, -6726, 4634, -6755, 4592, -6783, + 4551, -6811, 4509, -6839, 4467, -6866, 4425, -6894, 4382, -6921, 4340, + -6947, 4297, -6974, 4254, -7000, 4211, -7026, 4168, -7052, 4124, -7077, + 4081, -7102, 4037, -7127, 3994, -7152, 3950, -7176, 3905, -7200, 3861, + -7224, 3817, -7248, 3772, -7271, 3728, -7294, 3683, -7317, 3638, -7339, + 3593, -7361, 3547, -7383, 3502, -7405, 3457, -7426, 3411, -7447, 3365, + -7468, 3319, -7489, 3273, -7509, 3227, -7529, 3181, -7549, 3134, -7568, + 3088, -7587, 3041, -7606, 2995, -7624, 2948, -7643, 2901, -7661, 2854, + -7678, 2807, -7696, 2759, -7713, 2712, -7729, 2664, -7746, 2617, -7762, + 2569, -7778, 2521, -7794, 2474, -7809, 2426, -7824, 2378, -7839, 2329, + -7853, 2281, -7867, 2233, -7881, 2184, -7895, 2136, -7908, 2087, -7921, + 2039, -7934, 1990, -7946, 1941, -7958, 1892, -7970, 1843, -7981, 1794, + -7992, 1745, -8003, 1696, -8014, 1647, -8024, 1598, -8034, 1548, -8044, + 1499, -8053, 1450, -8062, 1400, -8071, 1350, -8079, 1301, -8087, 1251, + -8095, 1202, -8103, 1152, -8110, 1102, -8117, 1052, -8124, 1002, -8130, + 952, -8136, 902, -8142, 852, -8147, 802, -8152, 752, -8157, 702, + -8161, 652, -8165, 602, -8169, 552, -8173, 502, -8176, 452, -8179, + 401, -8182, 351, -8184, 301, -8186, 251, -8188, 201, -8189, 150, + -8190, 100, -8191, 50, -8191, 0, -8191, -50, -8191, -100, -8191, + -150, -8190, -201, -8189, -251, -8188, -301, -8186, -351, -8184, -401, + -8182, -452, -8179, -502, -8176, -552, -8173, -602, -8169, -652, -8165, + -702, -8161, -752, -8157, -802, -8152, -852, -8147, -902, -8142, -952, + -8136, -1002, -8130, -1052, -8124, -1102, -8117, -1152, -8110, -1202, -8103, + -1251, -8095, -1301, -8087, -1350, -8079, -1400, -8071, -1450, -8062, -1499, + -8053, -1548, -8044, -1598, -8034, -1647, -8024, -1696, -8014, -1745, -8003, + -1794, -7992, -1843, -7981, -1892, -7970, -1941, -7958, -1990, -7946, -2039, + -7934, -2087, -7921, -2136, -7908, -2184, -7895, -2233, -7881, -2281, -7867, + -2329, -7853, -2378, -7839, -2426, -7824, -2474, -7809, -2521, -7794, -2569, + -7778, -2617, -7762, -2664, -7746, -2712, -7729, -2759, -7713, -2807, -7696, + -2854, -7678, -2901, -7661, -2948, -7643, -2995, -7624, -3041, -7606, -3088, + -7587, -3134, -7568, -3181, -7549, -3227, -7529, -3273, -7509, -3319, -7489, + -3365, -7468, -3411, -7447, -3457, -7426, -3502, -7405, -3547, -7383, -3593, + -7361, -3638, -7339, -3683, -7317, -3728, -7294, -3772, -7271, -3817, -7248, + -3861, -7224, -3905, -7200, -3950, -7176, -3994, -7152, -4037, -7127, -4081, + -7102, -4124, -7077, -4168, -7052, -4211, -7026, -4254, -7000, -4297, -6974, + -4340, -6947, -4382, -6921, -4425, -6894, -4467, -6866, -4509, -6839, -4551, + -6811, -4592, -6783, -4634, -6755, -4675, -6726, -4717, -6697, -4758, -6668, + -4798, -6639, -4839, -6609, -4879, -6579, -4920, -6549, -4960, -6519, -5000, + -6488, -5039, -6458, -5079, -6427, -5118, -6395, -5157, -6364, -5196, -6332, + -5235, -6300, -5274, -6268, -5312, -6235, -5350, -6203, -5388, -6170, -5426, + -6136, -5464, -6103, -5501, -6069, -5538, -6035, -5575, -6001, -5612, -5967, + -5648, -5933, -5685, -5898, -5721, -5863, -5756, -5828, -5792, -5792, -5828, + -5756, -5863, -5721, -5898, -5685, -5933, -5648, -5967, -5612, -6001, -5575, + -6036, -5538, -6069, -5501, -6103, -5464, -6136, -5426, -6170, -5388, -6203, + -5350, -6235, -5312, -6268, -5274, -6300, -5235, -6332, -5196, -6364, -5157, + -6395, -5118, -6427, -5079, -6458, -5039, -6488, -5000, -6519, -4960, -6549, + -4920, -6579, -4879, -6609, -4839, -6639, -4798, -6668, -4758, -6697, -4717, + -6726, -4675, -6755, -4634, -6783, -4592, -6811, -4551, -6839, -4509, -6866, + -4467, -6894, -4425, -6921, -4382, -6947, -4340, -6974, -4297, -7000, -4254, + -7026, -4211, -7052, -4168, -7077, -4124, -7102, -4081, -7127, -4037, -7152, + -3994, -7176, -3950, -7200, -3905, -7224, -3861, -7248, -3817, -7271, -3772, + -7294, -3728, -7317, -3683, -7339, -3638, -7361, -3593, -7383, -3547, -7405, + -3502, -7426, -3457, -7447, -3411, -7468, -3365, -7489, -3319, -7509, -3273, + -7529, -3227, -7549, -3181, -7568, -3134, -7587, -3088, -7606, -3041, -7624, + -2995, -7643, -2948, -7661, -2901, -7678, -2854, -7696, -2807, -7713, -2759, + -7729, -2712, -7746, -2664, -7762, -2617, -7778, -2569, -7794, -2521, -7809, + -2474, -7824, -2426, -7839, -2378, -7853, -2329, -7867, -2281, -7881, -2233, + -7895, -2184, -7908, -2136, -7921, -2087, -7934, -2039, -7946, -1990, -7958, + -1941, -7970, -1892, -7981, -1843, -7992, -1794, -8003, -1745, -8014, -1696, + -8024, -1647, -8034, -1598, -8044, -1548, -8053, -1499, -8062, -1450, -8071, + -1400, -8079, -1350, -8087, -1301, -8095, -1251, -8103, -1202, -8110, -1152, + -8117, -1102, -8124, -1052, -8130, -1002, -8136, -952, -8142, -902, -8147, + -852, -8152, -802, -8157, -752, -8161, -702, -8165, -652, -8169, -602, + -8173, -552, -8176, -502, -8179, -452, -8182, -401, -8184, -351, -8186, + -301, -8188, -251, -8189, -201, -8190, -150, -8191, -100, -8191, -50}; + +/* 1024 real values as input data in float format */ +float fft_input[1024] = { + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f}; diff --git a/targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft.c b/targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft.c new file mode 100644 index 0000000..c870918 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft.c @@ -0,0 +1,342 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: fft + + Author: Juan Martinez Velarde + + Function: benchmarking of an integer stage scaling FFT + To avoid errors caused by overflow and bit growth, + the input data is scaled. Bit growth occurs potentially + at butterfly operations, which involve a complex + multiplication, a complex addition and a complex + subtraction. Maximal bit growth from butterfly input + to butterfly output is two bits. + + The input data includes enough extra sign bits, called + guard bits, to ensure that bit growth never results in + overflow (Rabiner and Gold, 1975). Data can grow by a + maximum factor of 2.4 from butterfly input to output + (two bits of grow). However, a data value cannot grow by + maximum amount in two consecutive stages. + The number of guard bits necessary to compensate the + maximum bit growth in an N-point FFT is (log_2 (N))+1). + + In a 16-point FFT (requires 4 stages), each of the + input samples should contain 5 guard bits. The input + data is then restricted to 10 bits, one sign bit and + nine magnitude bits, in order to prevent an + overflow from the integer multiplication with the + precalculed twiddle coefficients. + + Another method to compensate bit growth is to scale the + outputs down by a factor of two unconditionally after + each stage. This approach is called unconditional scaling + + Initially, 2 guard bits are included in the input data to + accomodate the maximum overflow in the first stage. + In each butterfly of a stage calculation, the data can + grow into the guard bits. To prevent overflow in the next + stage, the guard bits are replaced before the next stage is + executed by shifting the entire block of data one bit + to the right. + + Input data should not be restricted to a 1.9 format. + Input data can be represented in a 1.13 format,that is + 14 significant bits, one sign and 13 magnitude bits. In + the FFT calculation, the data loses a total of (log2 N) -1 + bits because of shifting. Unconditional scaling results + in the same number of bits lost as in the input data scaling. + However, it produces more precise results because the + FFT starts with more precise input data. The tradeoff is + a slower FFT calculation because of the extra cycles needed + to shift the output of each stage. + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: fft_1024_13 + (merged main1024_bit_reduct and fft_bit_reduct from DSP-Stone) + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +// Wasm loop bounds + + +#include "fft_input.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define N_FFT 1024 +#define NUMBER_OF_BITS 13 /* fract format 1.NUMBER_OF_BITS = 1.13 */ + +#define BITS_PER_TWID 13 /* bits per twiddle coefficient */ +#define SHIFT BITS_PER_TWID /* fractional shift after each multiplication */ + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline float fft_exp2f(float x); +__attribute__((always_inline)) static inline float fft_modff(float x, + float *intpart); +__attribute__((always_inline)) static inline int fft_convert(float value); +__attribute__((always_inline)) static inline void +fft_bit_reduct(register int *int_pointer); +__attribute__((always_inline)) static inline void +fft_pin_down(int input_data[]); +__attribute__((always_inline)) static inline void fft_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fft_main(void); +__attribute__((always_inline)) static inline int fft_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Forward declaration of global variables +*/ + +int fft_input_data[2 * N_FFT]; + +/* precalculated twiddle factors + for an integer 1024 point FFT + in format 1.13 => table twidtable[ 2*(N_FFT-1) ] ; */ +extern int fft_twidtable[2046]; + +/* 1024 real values as input data in float format */ +extern float fft_input[1024]; + +/* will hold the transformed data */ +int fft_inputfract[N_FFT]; + +/* + Algorithm core function +*/ + +__attribute__((always_inline)) static inline void +fft_bit_reduct(register int *int_pointer) { + register int i, j = 0; + register int tmpr, max = 2, m, n = N_FFT << 1; + + /* do the bit reversal scramble of the input data */ + __pragma_loopbound(1024, 1024); + for (i = 0; i < (n - 1); i += 2) { + if (j > i) { + tmpr = *(int_pointer + j); + *(int_pointer + j) = *(int_pointer + i); + *(int_pointer + i) = tmpr; + + tmpr = *(int_pointer + j + 1); + *(int_pointer + j + 1) = *(int_pointer + i + 1); + *(int_pointer + i + 1) = tmpr; + } + + m = N_FFT; + + __pragma_loopbound(0, 10); + while (m >= 2 && j >= m) { + j -= m; + m >>= 1; + } + j += m; + } + + { + register int *data_pointer = &fft_twidtable[0]; + register int *p, *q; + register int tmpi, fr = 0, level, k, l; + + __pragma_loopbound(10, 10); + while (n > max) { + level = max << 1; + + __pragma_loopbound(1, 512); + for (m = 1; m < max; m += 2) { + l = *(data_pointer + fr); + k = *(data_pointer + fr + 1); + fr += 2; + + __pragma_loopbound(1, 512); + for (i = m; i <= n; i += level) { + j = i + max; + p = int_pointer + j; + q = int_pointer + i; + + tmpr = l * *(p - 1); + tmpr -= (k * *p); + + tmpi = l * *p; + tmpi += (k * *(p - 1)); + + tmpr = tmpr >> SHIFT; + tmpi = tmpi >> SHIFT; + + *(p - 1) = *(q - 1) - tmpr; + *p = *q - tmpi; + + *(q - 1) += tmpr; + *q += tmpi; + } + } + + /* implement unconditional bit reduction */ + + { + register int f; + + p = int_pointer; + + __pragma_loopbound(2048, 2048); + for (f = 0; f < 2 * N_FFT; f++) { + *p = *p >> 1; + p++; + } + } + + max = level; + } + } +} + +/* + Initialization- and return-value-related functions +*/ + +/* conversion function to 1.NUMBER_OF_BITS format */ +__attribute__((always_inline)) static inline float +fft_exp2f(float x) { + int i; + float ret = 2.0f; + + __pragma_loopbound(13, 13); + for (i = 1; i < x; ++i) + ret *= 2.0f; + + return ret; +} + +__attribute__((always_inline)) static inline float +fft_modff(float x, float *intpart) { + if (intpart) { + *intpart = (int) x; + return x - *intpart; + } else + return x; +} + +/* conversion function to 1.NUMBER_OF_BITS format */ +__attribute__((always_inline)) static inline int +fft_convert(float value) { + float man, t_val, frac, m, exponent = NUMBER_OF_BITS; + int rnd_val; + unsigned long int_val; + unsigned long pm_val; + + m = fft_exp2f(exponent + 1) - 1; + + t_val = value * m; + frac = fft_modff(t_val, &man); + if (frac < 0.0f) { + rnd_val = (-1); + if (frac > -0.5f) + rnd_val = 0; + } else { + rnd_val = 1; + if (frac < 0.5f) + rnd_val = 0; + } + int_val = (long) man + (long) rnd_val; + + pm_val = int_val; + return ((int) (pm_val)); +} + +__attribute__((always_inline)) static inline void +fft_float2fract(void) { + float f; + int j, i; + + __pragma_loopbound(1024, 1024); + for (j = 0; j < N_FFT; j++) { + f = fft_input[j]; + i = fft_convert(f); + fft_inputfract[j] = i; + } +} + +__attribute__((always_inline)) static inline void +fft_pin_down(int input_data[]) { + /* conversion from input to a 1.13 format */ + fft_float2fract(); + + int *pd, *ps, f; + + pd = &input_data[0]; + ps = &fft_inputfract[0]; + + __pragma_loopbound(1024, 1024); + for (f = 0; f < N_FFT; f++) { + *pd++ = *ps++; /* fill in with real data */ + *pd++ = 0; /* imaginary data is equal zero */ + } +} + +__attribute__((always_inline)) static inline void +fft_init(void) { + int i; + volatile int x = 0; + + fft_pin_down(&fft_input_data[0]); + + /* avoid constant propagation of input values */ + __pragma_loopbound(2046, 2046); + for (i = 0; i < 2 * (N_FFT - 1); i++) { + fft_input_data[i] += x; + fft_twidtable[i] += x; + } + __pragma_loopbound(2, 2); + for (; i < 2 * N_FFT; i++) + fft_input_data[i] += x; +} + +__attribute__((always_inline)) static inline int +fft_return(void) { + int check_sum = 0; + int i = 0; + + __pragma_loopbound(2048, 2048); + for (i = 0; i < 2 * N_FFT; ++i) + check_sum += fft_input_data[i]; + + return check_sum != 3968; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fft_main(void) { + fft_bit_reduct(&fft_input_data[0]); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fft_init(); + + fft_main(); + + return fft_return(); +} diff --git a/targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft_input.c b/targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft_input.c new file mode 100644 index 0000000..ae045c8 --- /dev/null +++ b/targets/wasm-tacle/kernel/fft/generated/modified_sources/inline/fft_input.c @@ -0,0 +1,320 @@ + + +int fft_twidtable[2046] = { + 8192, 0, 8192, 0, 0, -8192, 8192, 0, 5792, -5792, 0, + -8191, -5792, -5792, 8192, 0, 7568, -3134, 5792, -5792, 3134, -7568, + 0, -8192, -3134, -7568, -5792, -5792, -7568, -3134, 8192, 0, 8034, + -1598, 7568, -3134, 6811, -4551, 5792, -5792, 4551, -6811, 3134, -7568, + 1598, -8034, 0, -8192, -1598, -8034, -3134, -7568, -4551, -6811, -5792, + -5792, -6811, -4551, -7568, -3134, -8034, -1598, 8192, 0, 8152, -802, + 8034, -1598, 7839, -2378, 7568, -3134, 7224, -3861, 6811, -4551, 6332, + -5196, 5792, -5792, 5196, -6332, 4551, -6811, 3861, -7224, 3134, -7568, + 2378, -7839, 1598, -8034, 802, -8152, 0, -8191, -802, -8152, -1598, + -8034, -2378, -7839, -3134, -7568, -3861, -7224, -4551, -6811, -5196, -6332, + -5792, -5792, -6332, -5196, -6811, -4551, -7224, -3861, -7568, -3134, -7839, + -2378, -8034, -1598, -8152, -802, 8192, 0, 8182, -401, 8152, -802, + 8103, -1202, 8034, -1598, 7946, -1990, 7839, -2378, 7713, -2759, 7568, + -3134, 7405, -3502, 7224, -3861, 7026, -4211, 6811, -4551, 6579, -4879, + 6332, -5196, 6069, -5501, 5792, -5792, 5501, -6069, 5196, -6332, 4879, + -6579, 4551, -6811, 4211, -7026, 3861, -7224, 3502, -7405, 3134, -7568, + 2759, -7713, 2378, -7839, 1990, -7946, 1598, -8034, 1202, -8103, 802, + -8152, 401, -8182, 0, -8192, -401, -8182, -802, -8152, -1202, -8103, + -1598, -8034, -1990, -7946, -2378, -7839, -2759, -7713, -3134, -7568, -3502, + -7405, -3861, -7224, -4211, -7026, -4551, -6811, -4879, -6579, -5196, -6332, + -5501, -6069, -5792, -5792, -6069, -5501, -6332, -5196, -6579, -4879, -6811, + -4551, -7026, -4211, -7224, -3861, -7405, -3502, -7568, -3134, -7713, -2759, + -7839, -2378, -7946, -1990, -8034, -1598, -8103, -1202, -8152, -802, -8182, + -401, 8192, 0, 8189, -201, 8182, -401, 8169, -602, 8152, -802, + 8130, -1002, 8103, -1202, 8071, -1400, 8034, -1598, 7992, -1794, 7946, + -1990, 7895, -2184, 7839, -2378, 7778, -2569, 7713, -2759, 7643, -2948, + 7568, -3134, 7489, -3319, 7405, -3502, 7317, -3683, 7224, -3861, 7127, + -4037, 7026, -4211, 6921, -4382, 6811, -4551, 6697, -4717, 6579, -4879, + 6458, -5039, 6332, -5196, 6203, -5350, 6069, -5501, 5933, -5648, 5792, + -5792, 5648, -5933, 5501, -6069, 5350, -6203, 5196, -6332, 5039, -6458, + 4879, -6579, 4717, -6697, 4551, -6811, 4382, -6921, 4211, -7026, 4037, + -7127, 3861, -7224, 3683, -7317, 3502, -7405, 3319, -7489, 3134, -7568, + 2948, -7643, 2759, -7713, 2569, -7778, 2378, -7839, 2184, -7895, 1990, + -7946, 1794, -7992, 1598, -8034, 1400, -8071, 1202, -8103, 1002, -8130, + 802, -8152, 602, -8169, 401, -8182, 201, -8189, 0, -8192, -201, + -8189, -401, -8182, -602, -8169, -802, -8152, -1002, -8130, -1202, -8103, + -1400, -8071, -1598, -8034, -1794, -7992, -1990, -7946, -2184, -7895, -2378, + -7839, -2569, -7778, -2759, -7713, -2948, -7643, -3134, -7568, -3319, -7489, + -3502, -7405, -3683, -7317, -3861, -7224, -4037, -7127, -4211, -7026, -4382, + -6921, -4551, -6811, -4717, -6697, -4879, -6579, -5039, -6458, -5196, -6332, + -5350, -6203, -5501, -6069, -5648, -5933, -5792, -5792, -5933, -5648, -6069, + -5501, -6203, -5350, -6332, -5196, -6458, -5039, -6579, -4879, -6697, -4717, + -6811, -4551, -6921, -4382, -7026, -4211, -7127, -4037, -7224, -3861, -7317, + -3683, -7405, -3502, -7489, -3319, -7568, -3134, -7643, -2948, -7713, -2759, + -7778, -2569, -7839, -2378, -7895, -2184, -7946, -1990, -7992, -1794, -8034, + -1598, -8071, -1400, -8103, -1202, -8130, -1002, -8152, -802, -8169, -602, + -8182, -401, -8189, -201, 8192, 0, 8191, -100, 8189, -201, 8186, + -301, 8182, -401, 8176, -502, 8169, -602, 8161, -702, 8152, -802, + 8142, -902, 8130, -1002, 8117, -1102, 8103, -1202, 8087, -1301, 8071, + -1400, 8053, -1499, 8034, -1598, 8014, -1696, 7992, -1794, 7970, -1892, + 7946, -1990, 7921, -2087, 7895, -2184, 7867, -2281, 7839, -2378, 7809, + -2474, 7778, -2569, 7746, -2664, 7713, -2759, 7678, -2854, 7643, -2948, + 7606, -3041, 7568, -3134, 7529, -3227, 7489, -3319, 7447, -3411, 7405, + -3502, 7361, -3593, 7317, -3683, 7271, -3772, 7224, -3861, 7176, -3950, + 7127, -4037, 7077, -4124, 7026, -4211, 6974, -4297, 6921, -4382, 6866, + -4467, 6811, -4551, 6755, -4634, 6697, -4717, 6639, -4798, 6579, -4879, + 6519, -4960, 6458, -5039, 6395, -5118, 6332, -5196, 6268, -5274, 6203, + -5350, 6136, -5426, 6069, -5501, 6001, -5575, 5933, -5648, 5863, -5721, + 5792, -5792, 5721, -5863, 5648, -5933, 5575, -6001, 5501, -6069, 5426, + -6136, 5350, -6203, 5274, -6268, 5196, -6332, 5118, -6395, 5039, -6458, + 4960, -6519, 4879, -6579, 4798, -6639, 4717, -6697, 4634, -6755, 4551, + -6811, 4467, -6866, 4382, -6921, 4297, -6974, 4211, -7026, 4124, -7077, + 4037, -7127, 3950, -7176, 3861, -7224, 3772, -7271, 3683, -7317, 3593, + -7361, 3502, -7405, 3411, -7447, 3319, -7489, 3227, -7529, 3134, -7568, + 3041, -7606, 2948, -7643, 2854, -7678, 2759, -7713, 2664, -7746, 2569, + -7778, 2474, -7809, 2378, -7839, 2281, -7867, 2184, -7895, 2087, -7921, + 1990, -7946, 1892, -7970, 1794, -7992, 1696, -8014, 1598, -8034, 1499, + -8053, 1400, -8071, 1301, -8087, 1202, -8103, 1102, -8117, 1002, -8130, + 902, -8142, 802, -8152, 702, -8161, 602, -8169, 502, -8176, 401, + -8182, 301, -8186, 201, -8189, 100, -8191, 0, -8192, -100, -8191, + -201, -8189, -301, -8186, -401, -8182, -502, -8176, -602, -8169, -702, + -8161, -802, -8152, -902, -8142, -1002, -8130, -1102, -8117, -1202, -8103, + -1301, -8087, -1400, -8071, -1499, -8053, -1598, -8034, -1696, -8014, -1794, + -7992, -1892, -7970, -1990, -7946, -2087, -7921, -2184, -7895, -2281, -7867, + -2378, -7839, -2474, -7809, -2569, -7778, -2664, -7746, -2759, -7713, -2854, + -7678, -2948, -7643, -3041, -7606, -3134, -7568, -3227, -7529, -3319, -7489, + -3411, -7447, -3502, -7405, -3593, -7361, -3683, -7317, -3772, -7271, -3861, + -7224, -3950, -7176, -4037, -7127, -4124, -7077, -4211, -7026, -4297, -6974, + -4382, -6921, -4467, -6866, -4551, -6811, -4634, -6755, -4717, -6697, -4798, + -6639, -4879, -6579, -4960, -6519, -5039, -6458, -5118, -6395, -5196, -6332, + -5274, -6268, -5350, -6203, -5426, -6136, -5501, -6069, -5575, -6001, -5648, + -5933, -5721, -5863, -5792, -5792, -5863, -5721, -5933, -5648, -6001, -5575, + -6069, -5501, -6136, -5426, -6203, -5350, -6268, -5274, -6332, -5196, -6395, + -5118, -6458, -5039, -6519, -4960, -6579, -4879, -6639, -4798, -6697, -4717, + -6755, -4634, -6811, -4551, -6866, -4467, -6921, -4382, -6974, -4297, -7026, + -4211, -7077, -4124, -7127, -4037, -7176, -3950, -7224, -3861, -7271, -3772, + -7317, -3683, -7361, -3593, -7405, -3502, -7447, -3411, -7489, -3319, -7529, + -3227, -7568, -3134, -7606, -3041, -7643, -2948, -7678, -2854, -7713, -2759, + -7746, -2664, -7778, -2569, -7809, -2474, -7839, -2378, -7867, -2281, -7895, + -2184, -7921, -2087, -7946, -1990, -7970, -1892, -7992, -1794, -8014, -1696, + -8034, -1598, -8053, -1499, -8071, -1400, -8087, -1301, -8103, -1202, -8117, + -1102, -8130, -1002, -8142, -902, -8152, -802, -8161, -702, -8169, -602, + -8176, -502, -8182, -401, -8186, -301, -8189, -201, -8191, -100, 8192, + 0, 8191, -50, 8191, -100, 8190, -150, 8189, -201, 8188, -251, + 8186, -301, 8184, -351, 8182, -401, 8179, -452, 8176, -502, 8173, + -552, 8169, -602, 8165, -652, 8161, -702, 8157, -752, 8152, -802, + 8147, -852, 8142, -902, 8136, -952, 8130, -1002, 8124, -1052, 8117, + -1102, 8110, -1152, 8103, -1202, 8095, -1251, 8087, -1301, 8079, -1350, + 8071, -1400, 8062, -1450, 8053, -1499, 8044, -1548, 8034, -1598, 8024, + -1647, 8014, -1696, 8003, -1745, 7992, -1794, 7981, -1843, 7970, -1892, + 7958, -1941, 7946, -1990, 7934, -2039, 7921, -2087, 7908, -2136, 7895, + -2184, 7881, -2233, 7867, -2281, 7853, -2329, 7839, -2378, 7824, -2426, + 7809, -2474, 7794, -2521, 7778, -2569, 7762, -2617, 7746, -2664, 7729, + -2712, 7713, -2759, 7696, -2807, 7678, -2854, 7661, -2901, 7643, -2948, + 7624, -2995, 7606, -3041, 7587, -3088, 7568, -3134, 7549, -3181, 7529, + -3227, 7509, -3273, 7489, -3319, 7468, -3365, 7447, -3411, 7426, -3457, + 7405, -3502, 7383, -3547, 7361, -3593, 7339, -3638, 7317, -3683, 7294, + -3728, 7271, -3772, 7248, -3817, 7224, -3861, 7200, -3905, 7176, -3950, + 7152, -3994, 7127, -4037, 7102, -4081, 7077, -4124, 7052, -4168, 7026, + -4211, 7000, -4254, 6974, -4297, 6947, -4340, 6921, -4382, 6894, -4425, + 6866, -4467, 6839, -4509, 6811, -4551, 6783, -4592, 6755, -4634, 6726, + -4675, 6697, -4717, 6668, -4758, 6639, -4798, 6609, -4839, 6579, -4879, + 6549, -4920, 6519, -4960, 6488, -5000, 6458, -5039, 6427, -5079, 6395, + -5118, 6364, -5157, 6332, -5196, 6300, -5235, 6268, -5274, 6235, -5312, + 6203, -5350, 6170, -5388, 6136, -5426, 6103, -5464, 6069, -5501, 6036, + -5538, 6001, -5575, 5967, -5612, 5933, -5648, 5898, -5685, 5863, -5721, + 5828, -5756, 5792, -5792, 5756, -5828, 5721, -5863, 5685, -5898, 5648, + -5933, 5612, -5967, 5575, -6001, 5538, -6036, 5501, -6069, 5464, -6103, + 5426, -6136, 5388, -6170, 5350, -6203, 5312, -6235, 5274, -6268, 5235, + -6300, 5196, -6332, 5157, -6364, 5118, -6395, 5079, -6427, 5039, -6458, + 5000, -6488, 4960, -6519, 4920, -6549, 4879, -6579, 4839, -6609, 4798, + -6639, 4758, -6668, 4717, -6697, 4675, -6726, 4634, -6755, 4592, -6783, + 4551, -6811, 4509, -6839, 4467, -6866, 4425, -6894, 4382, -6921, 4340, + -6947, 4297, -6974, 4254, -7000, 4211, -7026, 4168, -7052, 4124, -7077, + 4081, -7102, 4037, -7127, 3994, -7152, 3950, -7176, 3905, -7200, 3861, + -7224, 3817, -7248, 3772, -7271, 3728, -7294, 3683, -7317, 3638, -7339, + 3593, -7361, 3547, -7383, 3502, -7405, 3457, -7426, 3411, -7447, 3365, + -7468, 3319, -7489, 3273, -7509, 3227, -7529, 3181, -7549, 3134, -7568, + 3088, -7587, 3041, -7606, 2995, -7624, 2948, -7643, 2901, -7661, 2854, + -7678, 2807, -7696, 2759, -7713, 2712, -7729, 2664, -7746, 2617, -7762, + 2569, -7778, 2521, -7794, 2474, -7809, 2426, -7824, 2378, -7839, 2329, + -7853, 2281, -7867, 2233, -7881, 2184, -7895, 2136, -7908, 2087, -7921, + 2039, -7934, 1990, -7946, 1941, -7958, 1892, -7970, 1843, -7981, 1794, + -7992, 1745, -8003, 1696, -8014, 1647, -8024, 1598, -8034, 1548, -8044, + 1499, -8053, 1450, -8062, 1400, -8071, 1350, -8079, 1301, -8087, 1251, + -8095, 1202, -8103, 1152, -8110, 1102, -8117, 1052, -8124, 1002, -8130, + 952, -8136, 902, -8142, 852, -8147, 802, -8152, 752, -8157, 702, + -8161, 652, -8165, 602, -8169, 552, -8173, 502, -8176, 452, -8179, + 401, -8182, 351, -8184, 301, -8186, 251, -8188, 201, -8189, 150, + -8190, 100, -8191, 50, -8191, 0, -8191, -50, -8191, -100, -8191, + -150, -8190, -201, -8189, -251, -8188, -301, -8186, -351, -8184, -401, + -8182, -452, -8179, -502, -8176, -552, -8173, -602, -8169, -652, -8165, + -702, -8161, -752, -8157, -802, -8152, -852, -8147, -902, -8142, -952, + -8136, -1002, -8130, -1052, -8124, -1102, -8117, -1152, -8110, -1202, -8103, + -1251, -8095, -1301, -8087, -1350, -8079, -1400, -8071, -1450, -8062, -1499, + -8053, -1548, -8044, -1598, -8034, -1647, -8024, -1696, -8014, -1745, -8003, + -1794, -7992, -1843, -7981, -1892, -7970, -1941, -7958, -1990, -7946, -2039, + -7934, -2087, -7921, -2136, -7908, -2184, -7895, -2233, -7881, -2281, -7867, + -2329, -7853, -2378, -7839, -2426, -7824, -2474, -7809, -2521, -7794, -2569, + -7778, -2617, -7762, -2664, -7746, -2712, -7729, -2759, -7713, -2807, -7696, + -2854, -7678, -2901, -7661, -2948, -7643, -2995, -7624, -3041, -7606, -3088, + -7587, -3134, -7568, -3181, -7549, -3227, -7529, -3273, -7509, -3319, -7489, + -3365, -7468, -3411, -7447, -3457, -7426, -3502, -7405, -3547, -7383, -3593, + -7361, -3638, -7339, -3683, -7317, -3728, -7294, -3772, -7271, -3817, -7248, + -3861, -7224, -3905, -7200, -3950, -7176, -3994, -7152, -4037, -7127, -4081, + -7102, -4124, -7077, -4168, -7052, -4211, -7026, -4254, -7000, -4297, -6974, + -4340, -6947, -4382, -6921, -4425, -6894, -4467, -6866, -4509, -6839, -4551, + -6811, -4592, -6783, -4634, -6755, -4675, -6726, -4717, -6697, -4758, -6668, + -4798, -6639, -4839, -6609, -4879, -6579, -4920, -6549, -4960, -6519, -5000, + -6488, -5039, -6458, -5079, -6427, -5118, -6395, -5157, -6364, -5196, -6332, + -5235, -6300, -5274, -6268, -5312, -6235, -5350, -6203, -5388, -6170, -5426, + -6136, -5464, -6103, -5501, -6069, -5538, -6035, -5575, -6001, -5612, -5967, + -5648, -5933, -5685, -5898, -5721, -5863, -5756, -5828, -5792, -5792, -5828, + -5756, -5863, -5721, -5898, -5685, -5933, -5648, -5967, -5612, -6001, -5575, + -6036, -5538, -6069, -5501, -6103, -5464, -6136, -5426, -6170, -5388, -6203, + -5350, -6235, -5312, -6268, -5274, -6300, -5235, -6332, -5196, -6364, -5157, + -6395, -5118, -6427, -5079, -6458, -5039, -6488, -5000, -6519, -4960, -6549, + -4920, -6579, -4879, -6609, -4839, -6639, -4798, -6668, -4758, -6697, -4717, + -6726, -4675, -6755, -4634, -6783, -4592, -6811, -4551, -6839, -4509, -6866, + -4467, -6894, -4425, -6921, -4382, -6947, -4340, -6974, -4297, -7000, -4254, + -7026, -4211, -7052, -4168, -7077, -4124, -7102, -4081, -7127, -4037, -7152, + -3994, -7176, -3950, -7200, -3905, -7224, -3861, -7248, -3817, -7271, -3772, + -7294, -3728, -7317, -3683, -7339, -3638, -7361, -3593, -7383, -3547, -7405, + -3502, -7426, -3457, -7447, -3411, -7468, -3365, -7489, -3319, -7509, -3273, + -7529, -3227, -7549, -3181, -7568, -3134, -7587, -3088, -7606, -3041, -7624, + -2995, -7643, -2948, -7661, -2901, -7678, -2854, -7696, -2807, -7713, -2759, + -7729, -2712, -7746, -2664, -7762, -2617, -7778, -2569, -7794, -2521, -7809, + -2474, -7824, -2426, -7839, -2378, -7853, -2329, -7867, -2281, -7881, -2233, + -7895, -2184, -7908, -2136, -7921, -2087, -7934, -2039, -7946, -1990, -7958, + -1941, -7970, -1892, -7981, -1843, -7992, -1794, -8003, -1745, -8014, -1696, + -8024, -1647, -8034, -1598, -8044, -1548, -8053, -1499, -8062, -1450, -8071, + -1400, -8079, -1350, -8087, -1301, -8095, -1251, -8103, -1202, -8110, -1152, + -8117, -1102, -8124, -1052, -8130, -1002, -8136, -952, -8142, -902, -8147, + -852, -8152, -802, -8157, -752, -8161, -702, -8165, -652, -8169, -602, + -8173, -552, -8176, -502, -8179, -452, -8182, -401, -8184, -351, -8186, + -301, -8188, -251, -8189, -201, -8190, -150, -8191, -100, -8191, -50}; + +/* 1024 real values as input data in float format */ +float fft_input[1024] = { + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f, + 0.243f, 0.323f, 0.505f, -0.176f, -0.87f, 0.353f, -0.344f, -0.443f, + -0.434f, -0.32f, 0.232f, -0.454f, -0.32f, -0.323f, -0.733f, 0.54f}; diff --git a/targets/wasm-tacle/kernel/filterbank/CMakeLists.txt b/targets/wasm-tacle/kernel/filterbank/CMakeLists.txt new file mode 100644 index 0000000..46b89e6 --- /dev/null +++ b/targets/wasm-tacle/kernel/filterbank/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(filterbank) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/filterbank.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/filterbank.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/filterbank/ChangeLog.txt b/targets/wasm-tacle/kernel/filterbank/ChangeLog.txt new file mode 100755 index 0000000..c25cbef --- /dev/null +++ b/targets/wasm-tacle/kernel/filterbank/ChangeLog.txt @@ -0,0 +1,53 @@ +File: filterbank.c +Original provenience: unknown +Source: unknown + +2016-04-20: +- Add static global variable filterbank_return_value that depends on the + computation inside of filterbank_main, return this value in filterbank_return. + +2016-01-06: +- Added original name to generic TACLeBench header. +- Applied TACLeBench formatting rules via + astyle --options=doc/example/astylerc.txt + +2015-12-08: +- Added generic TACLeBench header. +- Introduced comments to split file in sections for forward declarations, + global variables, initialization-related and return-value-related functions, + core benchmark functions, and main routine. +- Renamed function begin to filterbank_main. +- Renamed function FBCore to filterbank_core. +- Renamed global variable numiters to filterbank_numiters and made it static. +- Added function filterbank_init that handles the initialization of filterbank_numiters. +- Added function filterbank_return that handles the original return value of main. +- Added new function main that first calls filterbank_init, then filterbank_main and + finally returns the return value of filterbank_return. +- Added forward declarations for all these functions. +- Changed all //-style comments to /* */-style comments +- Applied code formatting according to the following rules: + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + - Function arguments are specified in ANSI style, i.e., + float my_sqrtf( float val ) + and NOT in Kernighan&Ritchie style like, e.g., + float my_sqrtf( val ) + float val; +- Tested conformance to C90 via + clang -fsyntax-only -Weverything -Wno-unknown-pragmas -pedantic -std=c90 diff --git a/targets/wasm-tacle/kernel/filterbank/filterbank.c b/targets/wasm-tacle/kernel/filterbank/filterbank.c new file mode 100755 index 0000000..c9ab6de --- /dev/null +++ b/targets/wasm-tacle/kernel/filterbank/filterbank.c @@ -0,0 +1,170 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: filterbank + + Author: unknown + + Function: Creates a filter bank to perform multirate signal processing. + The coefficients for the sets of filters are created in the + top-level init function, and passed down through the init + functions to FIR filter objects. + On each branch, a delay, filter, and downsample is performed, + followed by an upsample, delay, and filter. + + Source: StreamIt + (http://groups.csail.mit.edu/cag/streamit/shtml/benchmarks.shtml) + + Original name: filterbank + + Changes: See ChangeLog.txt + + License: MIT License + +*/ + +/* + Forward declaration of functions +*/ + +void filterbank_init( void ); +void filterbank_main( void ); +int filterbank_return( void ); +void filterbank_core( float r[ 256 ], + float y[ 256 ], + float H[ 8 ][ 32 ], + float F[ 8 ][ 32 ] ); + + +/* + Declaration of global variables +*/ + +static int filterbank_return_value; +static int filterbank_numiters; + + +/* + Initialization- and return-value-related functions +*/ + +void filterbank_init( void ) +{ + filterbank_numiters = 2; +} + + +int filterbank_return( void ) +{ + return filterbank_return_value; +} + + +/* + Core benchmark functions +*/ + +void _Pragma( "entrypoint" ) filterbank_main( void ) +{ + float r[ 256 ]; + float y[ 256 ]; + float H[ 8 ][ 32 ]; + float F[ 8 ][ 32 ]; + + int i, j; + + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) + r[ i ] = i + 1; + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) { + + _Pragma( "loopbound min 8 max 8" ) + for ( j = 0; j < 8; j++ ) { + H[ j ][ i ] = i * 32 + j * 8 + j + i + j + 1; + F[ j ][ i ] = i * j + j * j + j + i; + } + } + + _Pragma( "loopbound min 2 max 2" ) + while ( filterbank_numiters-- > 0 ) + filterbank_core( r, y, H, F ); + + filterbank_return_value = ( int )( y[ 0 ] ) - 9408; +} + + +/* the FB core gets the input vector (r) , the filter responses H and F and */ +/* generates the output vector(y) */ +void filterbank_core( float r[ 256 ], + float y[ 256 ], + float H[ 8 ][ 32 ], + float F[ 8 ][ 32 ] ) +{ + int i, j, k; + + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) + y[ i ] = 0; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < 8; i++ ) { + float Vect_H[ 256 ]; /* (output of the H) */ + float Vect_Dn[ ( int ) 256 / 8 ]; /* output of the down sampler; */ + float Vect_Up[ 256 ]; /* output of the up sampler; */ + float Vect_F[ 256 ]; /* this is the output of the */ + + /* convolving H */ + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j < 256; j++ ) { + Vect_H[ j ] = 0; + _Pragma( "loopbound min 1 max 32" ) + for ( k = 0; ( ( k < 32 ) & ( ( j - k ) >= 0 ) ); k++ ) + Vect_H[ j ] += H[ i ][ k ] * r[ j - k ]; + } + + /* Down Sampling */ + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 256 / 8; j++ ) + Vect_Dn[ j ] = Vect_H[ j * 8 ]; + + /* Up Sampling */ + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j < 256; j++ ) + Vect_Up[ j ] = 0; + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 256 / 8; j++ ) + Vect_Up[ j * 8 ] = Vect_Dn[ j ]; + + /* convolving F */ + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j < 256; j++ ) { + Vect_F[ j ] = 0; + _Pragma( "loopbound min 1 max 32" ) + for ( k = 0; ( ( k < 32 ) & ( ( j - k ) >= 0 ) ); k++ ) + Vect_F[ j ] += F[ i ][ k ] * Vect_Up[ j - k ]; + } + + /* adding the results to the y matrix */ + + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j < 256; j++ ) + y[ j ] += Vect_F[ j ]; + } +} + + +/* + Main function +*/ + +int main( void ) +{ + filterbank_init(); + filterbank_main(); + + return filterbank_return(); +} diff --git a/targets/wasm-tacle/kernel/filterbank/generated/default/filterbank.wasm b/targets/wasm-tacle/kernel/filterbank/generated/default/filterbank.wasm new file mode 100755 index 0000000000000000000000000000000000000000..720bcc26492de7be43c0a9e338fc6f1e85f967a9 GIT binary patch literal 2625 zcmb`J$!{D*6vnHnm+4vTS-oU+y~*a-v13OlaV{vuA`}kc0umS0>9IRz+OuVr5KDv^ zK@O3EL=@$~F-NWli36wH_&36T!uM*H7zc!q7-{-@)xYZMs(N2lmxy{zDe%h&dxwpB z>tJ(Bx z^c*RqUv`GlJX_5Ug?SS26>;iQ-*3jvcK1+;UR%2?Ru*(l-rEzE#YRuah?naSKxl@^q~vnxn@I`bqbVrhag^Pps?1~c z(VWN{ZS=T#vqO$qBiEcI&s4}af>P#pf%hp2j8AFY$T+u5V1j9XbP5gWjD0IQhfd%| z7Tx)6(v_?k$pqyO#vQ;|Pz-E+AjRm;4565wB8SoEGlXIa!<|x$Pnz0{qUcYN$EYzw zD0)-mGkP#XD7sUW0=iP}r5zWFgo-V--qN8dbq6FzwpVl3kd zp3zCwWA_~~lleNK6lN5)I1FI7w01D9iZCs3%bSIukd0KonoDR-r)VBE^Qa-GPS$y| z!vEW+s9ty^BCE0z~&!}20+T3(>5mKSKt@&avJUZ877{eb+j4Xt&o72z_6 zZMe*Svr%CdSr6jg*n@D}@pk4=ds=-+aoV5zhdJY`U(dWTgFMzXN1ZTYjo`J4{vt9;gT?1!b z2Twz(P$ z6K6|nVu=5+ypC)#yt(;ybMvuR@vc-YW0FuPa)GylGA_?~se0zI#YNU*1p6NzEaD(> zoO}=Bfk5r%GHuN_1#G9hi)8qFi5<{>Mk$M34|_q{Sj)2Am#16yX<>v>lP^l)+ws?8 zb-cG{#ShYLMa@_g^7rbEe%!4^I4to2M%Fx0njVV6*`Y}O-+Uq)UY*DB`I*P*N=7&LVGTXyW(cL({1k!cH?eO<`C}2y 0) + filterbank_core(r, y, H, F); + + filterbank_return_value = (int) (y[0]) - 9408; +} + +/* the FB core gets the input vector (r) , the filter responses H and F and */ +/* generates the output vector(y) */ +void +filterbank_core(float r[256], float y[256], float H[8][32], float F[8][32]) { + int i, j, k; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + y[i] = 0; + + __pragma_loopbound(8, 8); + for (i = 0; i < 8; i++) { + float Vect_H[256]; /* (output of the H) */ + float Vect_Dn[(int) 256 / 8]; /* output of the down sampler; */ + float Vect_Up[256]; /* output of the up sampler; */ + float Vect_F[256]; /* this is the output of the */ + + /* convolving H */ + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) { + Vect_H[j] = 0; + __pragma_loopbound(1, 32); + for (k = 0; ((k < 32) & ((j - k) >= 0)); k++) + Vect_H[j] += H[i][k] * r[j - k]; + } + + /* Down Sampling */ + __pragma_loopbound(32, 32); + for (j = 0; j < 256 / 8; j++) + Vect_Dn[j] = Vect_H[j * 8]; + + /* Up Sampling */ + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) + Vect_Up[j] = 0; + __pragma_loopbound(32, 32); + for (j = 0; j < 256 / 8; j++) + Vect_Up[j * 8] = Vect_Dn[j]; + + /* convolving F */ + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) { + Vect_F[j] = 0; + __pragma_loopbound(1, 32); + for (k = 0; ((k < 32) & ((j - k) >= 0)); k++) + Vect_F[j] += F[i][k] * Vect_Up[j - k]; + } + + /* adding the results to the y matrix */ + + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) + y[j] += Vect_F[j]; + } +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + filterbank_init(); + filterbank_main(); + + return filterbank_return(); +} diff --git a/targets/wasm-tacle/kernel/filterbank/generated/modified_sources/inline/filterbank.c b/targets/wasm-tacle/kernel/filterbank/generated/modified_sources/inline/filterbank.c new file mode 100644 index 0000000..41ab578 --- /dev/null +++ b/targets/wasm-tacle/kernel/filterbank/generated/modified_sources/inline/filterbank.c @@ -0,0 +1,171 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: filterbank + + Author: unknown + + Function: Creates a filter bank to perform multirate signal processing. + The coefficients for the sets of filters are created in the + top-level init function, and passed down through the init + functions to FIR filter objects. + On each branch, a delay, filter, and downsample is performed, + followed by an upsample, delay, and filter. + + Source: StreamIt + (http://groups.csail.mit.edu/cag/streamit/shtml/benchmarks.shtml) + + Original name: filterbank + + Changes: See ChangeLog.txt + + License: MIT License + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void filterbank_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +filterbank_main(void); +__attribute__((always_inline)) static inline int filterbank_return(void); +__attribute__((always_inline)) static inline void +filterbank_core(float r[256], float y[256], float H[8][32], float F[8][32]); + +/* + Declaration of global variables +*/ + +static int filterbank_return_value; +static int filterbank_numiters; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +filterbank_init(void) { + filterbank_numiters = 2; +} + +__attribute__((always_inline)) static inline int +filterbank_return(void) { + return filterbank_return_value; +} + +/* + Core benchmark functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +filterbank_main(void) { + float r[256]; + float y[256]; + float H[8][32]; + float F[8][32]; + + int i, j; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + r[i] = i + 1; + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) { + + __pragma_loopbound(8, 8); + for (j = 0; j < 8; j++) { + H[j][i] = i * 32 + j * 8 + j + i + j + 1; + F[j][i] = i * j + j * j + j + i; + } + } + + __pragma_loopbound(2, 2); + while (filterbank_numiters-- > 0) + filterbank_core(r, y, H, F); + + filterbank_return_value = (int) (y[0]) - 9408; +} + +/* the FB core gets the input vector (r) , the filter responses H and F and */ +/* generates the output vector(y) */ +__attribute__((always_inline)) static inline void +filterbank_core(float r[256], float y[256], float H[8][32], float F[8][32]) { + int i, j, k; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + y[i] = 0; + + __pragma_loopbound(8, 8); + for (i = 0; i < 8; i++) { + float Vect_H[256]; /* (output of the H) */ + float Vect_Dn[(int) 256 / 8]; /* output of the down sampler; */ + float Vect_Up[256]; /* output of the up sampler; */ + float Vect_F[256]; /* this is the output of the */ + + /* convolving H */ + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) { + Vect_H[j] = 0; + __pragma_loopbound(1, 32); + for (k = 0; ((k < 32) & ((j - k) >= 0)); k++) + Vect_H[j] += H[i][k] * r[j - k]; + } + + /* Down Sampling */ + __pragma_loopbound(32, 32); + for (j = 0; j < 256 / 8; j++) + Vect_Dn[j] = Vect_H[j * 8]; + + /* Up Sampling */ + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) + Vect_Up[j] = 0; + __pragma_loopbound(32, 32); + for (j = 0; j < 256 / 8; j++) + Vect_Up[j * 8] = Vect_Dn[j]; + + /* convolving F */ + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) { + Vect_F[j] = 0; + __pragma_loopbound(1, 32); + for (k = 0; ((k < 32) & ((j - k) >= 0)); k++) + Vect_F[j] += F[i][k] * Vect_Up[j - k]; + } + + /* adding the results to the y matrix */ + + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) + y[j] += Vect_F[j]; + } +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + filterbank_init(); + filterbank_main(); + + return filterbank_return(); +} diff --git a/targets/wasm-tacle/kernel/filterbank/license.txt b/targets/wasm-tacle/kernel/filterbank/license.txt new file mode 100755 index 0000000..7029925 --- /dev/null +++ b/targets/wasm-tacle/kernel/filterbank/license.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/targets/wasm-tacle/kernel/fir2dim/CMakeLists.txt b/targets/wasm-tacle/kernel/fir2dim/CMakeLists.txt new file mode 100644 index 0000000..c95eecd --- /dev/null +++ b/targets/wasm-tacle/kernel/fir2dim/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(fir2dim) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/fir2dim.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/fir2dim.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/fir2dim/changeLog.txt b/targets/wasm-tacle/kernel/fir2dim/changeLog.txt new file mode 100755 index 0000000..25b73ca --- /dev/null +++ b/targets/wasm-tacle/kernel/fir2dim/changeLog.txt @@ -0,0 +1,45 @@ +File: fir2dim.c +Original provenience: DSP-Stone, +http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + +2015-12-21: +- Renamed benchmark to fir2dim +- Renamed each function FUNC to fir2dim_FUNC +- Added functions fir2dim_init, fir2dim_return and main +- Added a global variable 'int fir2dim_result' to introduce a + non-optimizable return value +- Substituted all 4 defines: + #define STORAGE_CLASS register + #define TYPE float + #define IMAGEDIM 4 + #define ARRAYDIM (IMAGEDIM + 2) + #define COEFFICIENTS 3 +- Added forward declarations of all functions before the declarations of global + variables +- Removed return statement in void function fir2dim_main() +- Re-ordered functions to fit template-order +- Applied code formatting according to the following rules + (incomplete, to be discussed; I basically used astyle with the attached + options file): + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: st_) followed by lowercase letter (e.g., st_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Added general TACLeBench header to beginning of source code \ No newline at end of file diff --git a/targets/wasm-tacle/kernel/fir2dim/fir2dim.c b/targets/wasm-tacle/kernel/fir2dim/fir2dim.c new file mode 100755 index 0000000..054c144 --- /dev/null +++ b/targets/wasm-tacle/kernel/fir2dim/fir2dim.c @@ -0,0 +1,199 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: fir2dim + + Author: Juan Martinez Velarde + + Function: prime calculates whether numbers are prime. + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: fir2dim_float + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + + +/* + Forward declaration of functions +*/ + +void fir2dim_initSeed( void ); +long fir2dim_randomInteger(); +void fir2dim_pin_down( float *pimage, float *parray, float *pcoeff, + float *poutput ); +void fir2dim_init(); +int fir2dim_return(); +void fir2dim_main(); +int main( void ); + + +/* + Declaration of global variables +*/ +static float fir2dim_coefficients[ 3 * 3 ] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_image[ 4 * 4 ] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +static float fir2dim_array[ 6 * 6 ] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +static float fir2dim_output[ 4 * 4 ] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +int fir2dim_result; + + +/* + Initialization- and return-value-related functions +*/ + +void fir2dim_init() +{ + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &fir2dim_coefficients[ 0 ]; + _Pragma( "loopbound min 36 max 36" ) + for ( i = 0; i < sizeof( fir2dim_coefficients ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &fir2dim_image[ 0 ]; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < sizeof( fir2dim_image ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &fir2dim_array[ 0 ]; + _Pragma( "loopbound min 144 max 144" ) + for ( i = 0; i < sizeof( fir2dim_array ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &fir2dim_output[ 0 ]; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < sizeof( fir2dim_output ); ++i, ++p ) + *p ^= bitmask; +} + + +int fir2dim_return() +{ + return ( fir2dim_result - 14 != 0 ); +} + + +/* + Helper functions +*/ + +void fir2dim_pin_down( float *pimage, float *parray, float *pcoeff, + float *poutput ) +{ + register float i, f; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0 ; i < 4 ; i++ ) { + _Pragma( "loopbound min 4 max 4" ) + for ( f = 0 ; f < 4 ; f++ ) + *pimage++ = 1 ; + } + + pimage = pimage - 4 * 4 ; + + _Pragma( "loopbound min 9 max 9" ) + for ( i = 0; i < 3 * 3; i++ ) + *pcoeff++ = 1; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0 ; i < 6 ; i++ ) + *parray++ = 0 ; + + _Pragma( "loopbound min 4 max 4" ) + for ( f = 0 ; f < 4; f++ ) { + *parray++ = 0 ; + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0 ; i < 4 ; i++ ) + *parray++ = *pimage++ ; + *parray++ = 0 ; + } + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0 ; i < 6 ; i++ ) + *parray++ = 0 ; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0 ; i < 4 * 4; i++ ) + *poutput++ = 0 ; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) fir2dim_main() +{ + register float *parray = &fir2dim_array[ 0 ], *parray2, *parray3 ; + register float *pcoeff = &fir2dim_coefficients[ 0 ] ; + register float *poutput = &fir2dim_output[ 0 ] ; + int k, f, i; + + fir2dim_pin_down( &fir2dim_image[ 0 ], &fir2dim_array[ 0 ], + &fir2dim_coefficients[ 0 ], &fir2dim_output[ 0 ] ); + + poutput = &fir2dim_output[ 0 ] ; + + _Pragma( "loopbound min 4 max 4" ) + for ( k = 0 ; k < 4 ; k++ ) { + + _Pragma( "loopbound min 4 max 4" ) + for ( f = 0 ; f < 4 ; f++ ) { + pcoeff = &fir2dim_coefficients[ 0 ] ; + parray = &fir2dim_array[ k * 6 + f ] ; + parray2 = parray + 6 ; + parray3 = parray + 6 + 6 ; + + *poutput = 0 ; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0 ; i < 3 ; i++ ) + *poutput += *pcoeff++ **parray++ ; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0 ; i < 3 ; i++ ) + *poutput += *pcoeff++ **parray2++ ; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0 ; i < 3 ; i++ ) + *poutput += *pcoeff++ **parray3++ ; + + poutput++ ; + } + } + + fir2dim_result = fir2dim_output[ 0 ] + fir2dim_output[ 5 ] + fir2dim_array[ 9 ]; + + fir2dim_pin_down( &fir2dim_image[ 0 ], &fir2dim_array[ 0 ], + &fir2dim_coefficients[ 0 ], &fir2dim_output[ 0 ] ); +} + + +int main( void ) +{ + fir2dim_init(); + fir2dim_main(); + + return ( fir2dim_return() ); +} + diff --git a/targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wasm b/targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f525c791f8289ea29f07b2afd3ededb2f93e072c GIT binary patch literal 6514 zcmajkNo*U}0mkt+LrRuJxgy-45Q-c|st>9hxk_NzOc0=+v_(*$Kzm4m9$JhkX{=DD zNP?sq>(ENE6-Qo@D2kFOiIX@>TW4wO#Lm9CZMtvizPIVVw>k9CLk@lOy>IA`vg8Ve z|1-bgJkEP0MM^To#t(iG5d~G;4XTn!|lK<`Y zrfWJor{n2rebzVqQFNWX`>0r}m1m=gVzU_4<8pPpVZ5HW(yY(cs-;TPWV6%7QpI%i zMD8|mWg_F{qUhSVSc}GrjX2}?EWWG5H@QaxFEjU!dHZF;{Juf66`O$x%@w9E+!}7p zyJHqc%>1IgSztH%8dtcT5PrQncAOtj$By%Z>ez9hJLbeEA_)S={{y&hEj zMmj3KNJqsF(^2swbX5E(9Th)DN5yZVqvAKyQSn>osQ3~c6~C2^iZ9bq@!ROA_zE2r zznzYX-$6&k@1&#Rt8`TSE;=fHHystfhmMLLr=#Nc(oymI=&1PpbX5EV9Tk6oj*34> zN5vnaqv2U&|LJS(RB||dtzpN#7M@VYj`JtgvE%%-I(D3&QOAz+r_`|{*Zg#H(7x7C z@n`6$__K6W{5d)*{yZHOe}RsQzeq>LU!tSpFVj)+SLmqtSvo5I1v)DJMLH_}B|0kp zDjgO7G94BF3LO>yDjgO78XXn?Ivo}N1|1duCLI<379AD;HXRlJ4jmQ$E*%wrjgE?c zkB*9epN@+EfR2j)kdBJ~h>nW?n2w77gpP{;l#Yu3jE;)`oQ{hBf{u#+l8%c1ijIo^ znvRP9hK`EAPDjOmOGm|jM@PkfPe;Z7Ku5*@NJqv0L`TK{Oh?84LPy2_N=L>2Mn}c} zPDjQ6K}W^^Nk_&1MMuT|O-I8e&;H|k!5g0(@G`ptFPuMOzx7TH`hh=UTJHosQ3~c6~C2^ ziZ9bq@!ROA_zE2rznzYX-$6&k@1&#Rt8`TSE;=fHHystfhmMLLr=#Nc(oymI=&1Pp zbX5EV9Tk6oj*34>N5vnaqv8+KQSndFQSndHQSr~vQSp;>RQwS-D*h-P6@QG5ia$u@h9l0_>**0{4^aEKSM{wpQ5AUPt#HHXXvQ-vvgGaIXWu- zJRKE(fsTs5NJqtAqNCz3(^2tP=&1coKz_>oQXqH8{=(uDVK&V2y{WYon5*n>3En(7 zKY#Y!yZo;9U32b?_5=OxyZMc7H`IQ+V58d=+HW@+c8A^WN&`Pkt}nCG4+38=wZDBg z-@e<`zH7qHu#*FNSD9UYK0vx$be>*lcKZEtpD71|C6V1-aa3#w4SA* zNj^%Q+qX|`d*LR`gc)9tg<*d&8Np8Kze()}F8jExB)&lZkMm6GxJP??-2YUf$-kWpgRgLqrNbCJn+~!>Kjyq6^<(r!_=N_ypWQk!pJZCY{t2FV(hayN9q>5)Vdq_` zuhLKapF6Vmac+s;Oir2_>`n)9OVnC1w=!6$pwr&wyd}Y4>5{CtE9yxHb4$`%A-57( znDqxUVb|1P#w`H`PM6?uH*jlB-4e7`#LXNFvHrkz%yUzoU$bs*%B>Y}Q^pDe$;8i_ zG6qYhyy^yPEts2fYX#htu>$K4X2RaqqmF^oDW7r!w-(P$xwQgr%25h=UCjOhL#0zZ(>9cwU~9f^f@_~F_LY&J8c1H- z{q_f)@O5*w{b9%7?e9(=VE$Ay?BnC_azc1UE)V98zQ-8z!H>Ofvk7u12fSV{m%N?K z?;o%mcC?-T+2q^Jg})8u-fr>-lJ7_P1$fISL}_|^ z@=JcN(rLD&e>sR+e>w0r{2PFuo*tDdrDi72!J=BJ5=~UEt7KcplfMph^hHs%UYaab zisdMQOE+um-M%Xrx@>d?yyKnb{e8`1eKKxFd*fnrrXDx4+j^#F%FWWpi{+VkTi^6d pvp80cM<&bFv0}Ngt*;*Mjq7n`JRWJz*5bytu10CHG7|4^{ttK&b6EfY literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wat b/targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wat new file mode 100644 index 0000000..b409fa4 --- /dev/null +++ b/targets/wasm-tacle/kernel/fir2dim/generated/default/fir2dim.wat @@ -0,0 +1,1891 @@ +(module $fir2dim.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32 i32 i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $fir2dim_init (type 1) + (local i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store8 offset=15 + i32.const 36 + i32.const 36 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=1024 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1024 + i32.const 0 + i32.const 0 + i32.load8_u offset=1025 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1025 + i32.const 0 + i32.const 0 + i32.load8_u offset=1026 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1026 + i32.const 0 + i32.const 0 + i32.load8_u offset=1027 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1027 + i32.const 0 + i32.const 0 + i32.load8_u offset=1028 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1028 + i32.const 0 + i32.const 0 + i32.load8_u offset=1029 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1029 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1030 + i32.xor + i32.store8 offset=1030 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1031 + i32.xor + i32.store8 offset=1031 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1032 + i32.xor + i32.store8 offset=1032 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1033 + i32.xor + i32.store8 offset=1033 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1034 + i32.xor + i32.store8 offset=1034 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1035 + i32.xor + i32.store8 offset=1035 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1036 + i32.xor + i32.store8 offset=1036 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1037 + i32.xor + i32.store8 offset=1037 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1038 + i32.xor + i32.store8 offset=1038 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1039 + i32.xor + i32.store8 offset=1039 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1040 + i32.xor + i32.store8 offset=1040 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1041 + i32.xor + i32.store8 offset=1041 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1042 + i32.xor + i32.store8 offset=1042 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1043 + i32.xor + i32.store8 offset=1043 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1044 + i32.xor + i32.store8 offset=1044 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1045 + i32.xor + i32.store8 offset=1045 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1046 + i32.xor + i32.store8 offset=1046 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1047 + i32.xor + i32.store8 offset=1047 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1048 + i32.xor + i32.store8 offset=1048 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1049 + i32.xor + i32.store8 offset=1049 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1050 + i32.xor + i32.store8 offset=1050 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1051 + i32.xor + i32.store8 offset=1051 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1052 + i32.xor + i32.store8 offset=1052 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1053 + i32.xor + i32.store8 offset=1053 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1054 + i32.xor + i32.store8 offset=1054 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1055 + i32.xor + i32.store8 offset=1055 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1056 + i32.xor + i32.store8 offset=1056 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1057 + i32.xor + i32.store8 offset=1057 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1058 + i32.xor + i32.store8 offset=1058 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1059 + i32.xor + i32.store8 offset=1059 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=1072 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1072 + i32.const 0 + i32.const 0 + i32.load8_u offset=1073 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1073 + i32.const 0 + i32.const 0 + i32.load8_u offset=1074 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1074 + i32.const 0 + i32.const 0 + i32.load8_u offset=1075 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1075 + i32.const 0 + i32.const 0 + i32.load8_u offset=1076 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1076 + i32.const 0 + i32.const 0 + i32.load8_u offset=1077 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1077 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1078 + i32.xor + i32.store8 offset=1078 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1079 + i32.xor + i32.store8 offset=1079 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1080 + i32.xor + i32.store8 offset=1080 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1081 + i32.xor + i32.store8 offset=1081 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1082 + i32.xor + i32.store8 offset=1082 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1083 + i32.xor + i32.store8 offset=1083 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1084 + i32.xor + i32.store8 offset=1084 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1085 + i32.xor + i32.store8 offset=1085 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1086 + i32.xor + i32.store8 offset=1086 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1087 + i32.xor + i32.store8 offset=1087 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1088 + i32.xor + i32.store8 offset=1088 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1089 + i32.xor + i32.store8 offset=1089 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1090 + i32.xor + i32.store8 offset=1090 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1091 + i32.xor + i32.store8 offset=1091 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1092 + i32.xor + i32.store8 offset=1092 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1093 + i32.xor + i32.store8 offset=1093 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1094 + i32.xor + i32.store8 offset=1094 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1095 + i32.xor + i32.store8 offset=1095 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1096 + i32.xor + i32.store8 offset=1096 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1097 + i32.xor + i32.store8 offset=1097 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1098 + i32.xor + i32.store8 offset=1098 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1099 + i32.xor + i32.store8 offset=1099 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1100 + i32.xor + i32.store8 offset=1100 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1101 + i32.xor + i32.store8 offset=1101 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1102 + i32.xor + i32.store8 offset=1102 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1103 + i32.xor + i32.store8 offset=1103 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1104 + i32.xor + i32.store8 offset=1104 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1105 + i32.xor + i32.store8 offset=1105 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1106 + i32.xor + i32.store8 offset=1106 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1107 + i32.xor + i32.store8 offset=1107 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1108 + i32.xor + i32.store8 offset=1108 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1109 + i32.xor + i32.store8 offset=1109 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1110 + i32.xor + i32.store8 offset=1110 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1111 + i32.xor + i32.store8 offset=1111 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1112 + i32.xor + i32.store8 offset=1112 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1113 + i32.xor + i32.store8 offset=1113 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1114 + i32.xor + i32.store8 offset=1114 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1115 + i32.xor + i32.store8 offset=1115 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1116 + i32.xor + i32.store8 offset=1116 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1117 + i32.xor + i32.store8 offset=1117 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1118 + i32.xor + i32.store8 offset=1118 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1119 + i32.xor + i32.store8 offset=1119 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1120 + i32.xor + i32.store8 offset=1120 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1121 + i32.xor + i32.store8 offset=1121 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1122 + i32.xor + i32.store8 offset=1122 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1123 + i32.xor + i32.store8 offset=1123 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1124 + i32.xor + i32.store8 offset=1124 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1125 + i32.xor + i32.store8 offset=1125 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1126 + i32.xor + i32.store8 offset=1126 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1127 + i32.xor + i32.store8 offset=1127 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1128 + i32.xor + i32.store8 offset=1128 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1129 + i32.xor + i32.store8 offset=1129 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1130 + i32.xor + i32.store8 offset=1130 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1131 + i32.xor + i32.store8 offset=1131 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1132 + i32.xor + i32.store8 offset=1132 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1133 + i32.xor + i32.store8 offset=1133 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1134 + i32.xor + i32.store8 offset=1134 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1135 + i32.xor + i32.store8 offset=1135 + i32.const 144 + i32.const 144 + call $__pragma_loopbound + i32.const -144 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 1280 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 1281 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 1282 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 1283 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=1280 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1280 + i32.const 0 + i32.const 0 + i32.load8_u offset=1281 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1281 + i32.const 0 + i32.const 0 + i32.load8_u offset=1282 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1282 + i32.const 0 + i32.const 0 + i32.load8_u offset=1283 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1283 + i32.const 0 + i32.const 0 + i32.load8_u offset=1284 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1284 + i32.const 0 + i32.const 0 + i32.load8_u offset=1285 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1285 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1286 + i32.xor + i32.store8 offset=1286 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1287 + i32.xor + i32.store8 offset=1287 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1288 + i32.xor + i32.store8 offset=1288 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1289 + i32.xor + i32.store8 offset=1289 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1290 + i32.xor + i32.store8 offset=1290 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1291 + i32.xor + i32.store8 offset=1291 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1292 + i32.xor + i32.store8 offset=1292 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1293 + i32.xor + i32.store8 offset=1293 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1294 + i32.xor + i32.store8 offset=1294 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1295 + i32.xor + i32.store8 offset=1295 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1296 + i32.xor + i32.store8 offset=1296 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1297 + i32.xor + i32.store8 offset=1297 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1298 + i32.xor + i32.store8 offset=1298 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1299 + i32.xor + i32.store8 offset=1299 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1300 + i32.xor + i32.store8 offset=1300 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1301 + i32.xor + i32.store8 offset=1301 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1302 + i32.xor + i32.store8 offset=1302 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1303 + i32.xor + i32.store8 offset=1303 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1304 + i32.xor + i32.store8 offset=1304 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1305 + i32.xor + i32.store8 offset=1305 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1306 + i32.xor + i32.store8 offset=1306 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1307 + i32.xor + i32.store8 offset=1307 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1308 + i32.xor + i32.store8 offset=1308 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1309 + i32.xor + i32.store8 offset=1309 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1310 + i32.xor + i32.store8 offset=1310 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1311 + i32.xor + i32.store8 offset=1311 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1312 + i32.xor + i32.store8 offset=1312 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1313 + i32.xor + i32.store8 offset=1313 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1314 + i32.xor + i32.store8 offset=1314 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1315 + i32.xor + i32.store8 offset=1315 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1316 + i32.xor + i32.store8 offset=1316 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1317 + i32.xor + i32.store8 offset=1317 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1318 + i32.xor + i32.store8 offset=1318 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1319 + i32.xor + i32.store8 offset=1319 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1320 + i32.xor + i32.store8 offset=1320 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1321 + i32.xor + i32.store8 offset=1321 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1322 + i32.xor + i32.store8 offset=1322 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1323 + i32.xor + i32.store8 offset=1323 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1324 + i32.xor + i32.store8 offset=1324 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1325 + i32.xor + i32.store8 offset=1325 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1326 + i32.xor + i32.store8 offset=1326 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1327 + i32.xor + i32.store8 offset=1327 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1328 + i32.xor + i32.store8 offset=1328 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1329 + i32.xor + i32.store8 offset=1329 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1330 + i32.xor + i32.store8 offset=1330 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1331 + i32.xor + i32.store8 offset=1331 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1332 + i32.xor + i32.store8 offset=1332 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1333 + i32.xor + i32.store8 offset=1333 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1334 + i32.xor + i32.store8 offset=1334 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1335 + i32.xor + i32.store8 offset=1335 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1336 + i32.xor + i32.store8 offset=1336 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1337 + i32.xor + i32.store8 offset=1337 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1338 + i32.xor + i32.store8 offset=1338 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1339 + i32.xor + i32.store8 offset=1339 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1340 + i32.xor + i32.store8 offset=1340 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1341 + i32.xor + i32.store8 offset=1341 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1342 + i32.xor + i32.store8 offset=1342 + i32.const 0 + local.get 0 + i32.load8_u offset=15 + i32.const 0 + i32.load8_u offset=1343 + i32.xor + i32.store8 offset=1343 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $fir2dim_pin_down (type 2) (param i32 i32 i32 i32) + (local f32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i64.const 4575657222473777152 + i64.store offset=8 align=4 + local.get 0 + i64.const 4575657222473777152 + i64.store align=4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i64.const 4575657222473777152 + i64.store offset=24 align=4 + local.get 0 + i64.const 4575657222473777152 + i64.store offset=16 align=4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i64.const 4575657222473777152 + i64.store offset=40 align=4 + local.get 0 + i64.const 4575657222473777152 + i64.store offset=32 align=4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i64.const 4575657222473777152 + i64.store offset=56 align=4 + local.get 0 + i64.const 4575657222473777152 + i64.store offset=48 align=4 + i32.const 9 + i32.const 9 + call $__pragma_loopbound + local.get 2 + i32.const 1065353216 + i32.store offset=32 + local.get 2 + i64.const 4575657222473777152 + i64.store offset=24 align=4 + local.get 2 + i64.const 4575657222473777152 + i64.store offset=16 align=4 + local.get 2 + i64.const 4575657222473777152 + i64.store offset=8 align=4 + local.get 2 + i64.const 4575657222473777152 + i64.store align=4 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 1 + i64.const 0 + i64.store offset=16 align=4 + local.get 1 + i64.const 0 + i64.store offset=8 align=4 + local.get 1 + i64.const 0 + i64.store align=4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + i32.const 0 + i32.store offset=24 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 0 + f32.load + f32.store offset=28 + local.get 1 + local.get 0 + f32.load offset=4 + f32.store offset=32 + local.get 1 + local.get 0 + f32.load offset=8 + f32.store offset=36 + local.get 0 + f32.load offset=12 + local.set 4 + local.get 1 + i64.const 0 + i64.store offset=44 align=4 + local.get 1 + local.get 4 + f32.store offset=40 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 0 + f32.load offset=16 + f32.store offset=52 + local.get 1 + local.get 0 + f32.load offset=20 + f32.store offset=56 + local.get 1 + local.get 0 + f32.load offset=24 + f32.store offset=60 + local.get 0 + f32.load offset=28 + local.set 4 + local.get 1 + i64.const 0 + i64.store offset=68 align=4 + local.get 1 + local.get 4 + f32.store offset=64 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 0 + f32.load offset=32 + f32.store offset=76 + local.get 1 + local.get 0 + f32.load offset=36 + f32.store offset=80 + local.get 1 + local.get 0 + f32.load offset=40 + f32.store offset=84 + local.get 0 + f32.load offset=44 + local.set 4 + local.get 1 + i64.const 0 + i64.store offset=92 align=4 + local.get 1 + local.get 4 + f32.store offset=88 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 0 + f32.load offset=48 + f32.store offset=100 + local.get 1 + local.get 0 + f32.load offset=52 + f32.store offset=104 + local.get 1 + local.get 0 + f32.load offset=56 + f32.store offset=108 + local.get 0 + f32.load offset=60 + local.set 4 + local.get 1 + i32.const 0 + i32.store offset=116 + local.get 1 + local.get 4 + f32.store offset=112 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 1 + i64.const 0 + i64.store offset=136 align=4 + local.get 1 + i64.const 0 + i64.store offset=128 align=4 + local.get 1 + i64.const 0 + i64.store offset=120 align=4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 3 + i64.const 0 + i64.store offset=56 align=4 + local.get 3 + i64.const 0 + i64.store offset=48 align=4 + local.get 3 + i64.const 0 + i64.store offset=40 align=4 + local.get 3 + i64.const 0 + i64.store offset=32 align=4 + local.get 3 + i64.const 0 + i64.store offset=24 align=4 + local.get 3 + i64.const 0 + i64.store offset=16 align=4 + local.get 3 + i64.const 0 + i64.store offset=8 align=4 + local.get 3 + i64.const 0 + i64.store align=4) + (func $fir2dim_main (type 1) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32) + i32.const 1280 + local.set 0 + i32.const 1072 + i32.const 1136 + i32.const 1024 + i32.const 1280 + call $fir2dim_pin_down + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 1 + loop ;; label = @1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 0 + i32.const 0 + f32.load offset=1032 + local.get 1 + i32.const 1144 + i32.add + local.tee 2 + f32.load + f32.mul + i32.const 0 + f32.load offset=1028 + local.get 1 + i32.const 1140 + i32.add + local.tee 3 + f32.load + f32.mul + i32.const 0 + f32.load offset=1024 + local.get 1 + i32.const 1136 + i32.add + f32.load + f32.mul + local.get 0 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 0 + i32.const 0 + f32.load offset=1044 + local.get 1 + i32.const 1168 + i32.add + local.tee 4 + f32.load + f32.mul + i32.const 0 + f32.load offset=1040 + local.get 1 + i32.const 1164 + i32.add + local.tee 5 + f32.load + f32.mul + i32.const 0 + f32.load offset=1036 + local.get 1 + i32.const 1160 + i32.add + f32.load + f32.mul + local.get 0 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 0 + i32.const 4 + i32.add + local.tee 6 + i32.const 0 + i32.store + local.get 0 + i32.const 0 + f32.load offset=1056 + local.get 1 + i32.const 1192 + i32.add + local.tee 7 + f32.load + f32.mul + i32.const 0 + f32.load offset=1052 + local.get 1 + i32.const 1188 + i32.add + local.tee 8 + f32.load + f32.mul + i32.const 0 + f32.load offset=1048 + local.get 1 + i32.const 1184 + i32.add + f32.load + f32.mul + local.get 0 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 6 + i32.const 0 + f32.load offset=1032 + local.get 1 + i32.const 1148 + i32.add + local.tee 9 + f32.load + f32.mul + i32.const 0 + f32.load offset=1028 + local.get 2 + f32.load + f32.mul + i32.const 0 + f32.load offset=1024 + local.get 3 + f32.load + f32.mul + local.get 6 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 6 + i32.const 0 + f32.load offset=1044 + local.get 1 + i32.const 1172 + i32.add + local.tee 10 + f32.load + f32.mul + i32.const 0 + f32.load offset=1040 + local.get 4 + f32.load + f32.mul + i32.const 0 + f32.load offset=1036 + local.get 5 + f32.load + f32.mul + local.get 6 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 0 + i32.const 8 + i32.add + local.tee 3 + i32.const 0 + i32.store + local.get 6 + i32.const 0 + f32.load offset=1056 + local.get 1 + i32.const 1196 + i32.add + local.tee 5 + f32.load + f32.mul + i32.const 0 + f32.load offset=1052 + local.get 7 + f32.load + f32.mul + i32.const 0 + f32.load offset=1048 + local.get 8 + f32.load + f32.mul + local.get 6 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 3 + i32.const 0 + f32.load offset=1032 + local.get 1 + i32.const 1152 + i32.add + local.tee 8 + f32.load + f32.mul + i32.const 0 + f32.load offset=1028 + local.get 9 + f32.load + f32.mul + i32.const 0 + f32.load offset=1024 + local.get 2 + f32.load + f32.mul + local.get 3 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 3 + i32.const 0 + f32.load offset=1044 + local.get 1 + i32.const 1176 + i32.add + local.tee 2 + f32.load + f32.mul + i32.const 0 + f32.load offset=1040 + local.get 10 + f32.load + f32.mul + i32.const 0 + f32.load offset=1036 + local.get 4 + f32.load + f32.mul + local.get 3 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 0 + i32.const 12 + i32.add + local.tee 6 + i32.const 0 + i32.store + local.get 3 + i32.const 0 + f32.load offset=1056 + local.get 1 + i32.const 1200 + i32.add + local.tee 4 + f32.load + f32.mul + i32.const 0 + f32.load offset=1052 + local.get 5 + f32.load + f32.mul + i32.const 0 + f32.load offset=1048 + local.get 7 + f32.load + f32.mul + local.get 3 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 6 + i32.const 0 + f32.load offset=1032 + local.get 1 + i32.const 1156 + i32.add + f32.load + f32.mul + i32.const 0 + f32.load offset=1028 + local.get 8 + f32.load + f32.mul + i32.const 0 + f32.load offset=1024 + local.get 9 + f32.load + f32.mul + local.get 6 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 6 + i32.const 0 + f32.load offset=1044 + local.get 1 + i32.const 1180 + i32.add + f32.load + f32.mul + i32.const 0 + f32.load offset=1040 + local.get 2 + f32.load + f32.mul + i32.const 0 + f32.load offset=1036 + local.get 10 + f32.load + f32.mul + local.get 6 + f32.load + f32.add + f32.add + f32.add + f32.store + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 6 + i32.const 0 + f32.load offset=1056 + local.get 1 + i32.const 1204 + i32.add + f32.load + f32.mul + i32.const 0 + f32.load offset=1052 + local.get 4 + f32.load + f32.mul + i32.const 0 + f32.load offset=1048 + local.get 5 + f32.load + f32.mul + local.get 6 + f32.load + f32.add + f32.add + f32.add + f32.store + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 1 + i32.const 24 + i32.add + local.tee 1 + i32.const 96 + i32.ne + br_if 0 (;@1;) + end + block ;; label = @1 + block ;; label = @2 + i32.const 0 + f32.load offset=1280 + i32.const 0 + f32.load offset=1300 + f32.add + i32.const 0 + f32.load offset=1172 + f32.add + local.tee 11 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 11 + i32.trunc_f32_s + local.set 1 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 1 + end + i32.const 0 + local.get 1 + i32.store offset=1344 + i32.const 1072 + i32.const 1136 + i32.const 1024 + i32.const 1280 + call $fir2dim_pin_down) + (func $__original_main (type 3) (result i32) + call $fir2dim_init + call $fir2dim_main + i32.const 0 + i32.load offset=1344 + i32.const 14 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5456)) + (global (;1;) i32 (i32.const 1348)) + (global (;2;) i32 (i32.const 5456)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $fir2dim_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/default/fir2dim.c b/targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/default/fir2dim.c new file mode 100644 index 0000000..af8a3ce --- /dev/null +++ b/targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/default/fir2dim.c @@ -0,0 +1,193 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: fir2dim + + Author: Juan Martinez Velarde + + Function: prime calculates whether numbers are prime. + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: fir2dim_float + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void fir2dim_initSeed(void); +long fir2dim_randomInteger(); +void fir2dim_pin_down(float *pimage, float *parray, float *pcoeff, + float *poutput); +void fir2dim_init(); +int fir2dim_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fir2dim_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ +static float fir2dim_coefficients[3 * 3] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_image[4 * 4] = {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_array[6 * 6] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_output[4 * 4] = {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; +int fir2dim_result; + +/* + Initialization- and return-value-related functions +*/ + +void +fir2dim_init() { + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &fir2dim_coefficients[0]; + __pragma_loopbound(36, 36); + for (i = 0; i < sizeof(fir2dim_coefficients); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &fir2dim_image[0]; + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(fir2dim_image); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &fir2dim_array[0]; + __pragma_loopbound(144, 144); + for (i = 0; i < sizeof(fir2dim_array); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &fir2dim_output[0]; + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(fir2dim_output); ++i, ++p) + *p ^= bitmask; +} + +int +fir2dim_return() { + return (fir2dim_result - 14 != 0); +} + +/* + Helper functions +*/ + +void +fir2dim_pin_down(float *pimage, float *parray, float *pcoeff, float *poutput) { + register float i, f; + + __pragma_loopbound(4, 4); + for (i = 0; i < 4; i++) { + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) + *pimage++ = 1; + } + + pimage = pimage - 4 * 4; + + __pragma_loopbound(9, 9); + for (i = 0; i < 3 * 3; i++) + *pcoeff++ = 1; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) + *parray++ = 0; + + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) { + *parray++ = 0; + __pragma_loopbound(4, 4); + for (i = 0; i < 4; i++) + *parray++ = *pimage++; + *parray++ = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) + *parray++ = 0; + + __pragma_loopbound(16, 16); + for (i = 0; i < 4 * 4; i++) + *poutput++ = 0; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fir2dim_main() { + register float *parray = &fir2dim_array[0], *parray2, *parray3; + register float *pcoeff = &fir2dim_coefficients[0]; + register float *poutput = &fir2dim_output[0]; + int k, f, i; + + fir2dim_pin_down(&fir2dim_image[0], &fir2dim_array[0], + &fir2dim_coefficients[0], &fir2dim_output[0]); + + poutput = &fir2dim_output[0]; + + __pragma_loopbound(4, 4); + for (k = 0; k < 4; k++) { + + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) { + pcoeff = &fir2dim_coefficients[0]; + parray = &fir2dim_array[k * 6 + f]; + parray2 = parray + 6; + parray3 = parray + 6 + 6; + + *poutput = 0; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) + *poutput += *pcoeff++ * *parray++; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) + *poutput += *pcoeff++ * *parray2++; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) + *poutput += *pcoeff++ * *parray3++; + + poutput++; + } + } + + fir2dim_result = fir2dim_output[0] + fir2dim_output[5] + fir2dim_array[9]; + + fir2dim_pin_down(&fir2dim_image[0], &fir2dim_array[0], + &fir2dim_coefficients[0], &fir2dim_output[0]); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fir2dim_init(); + fir2dim_main(); + + return (fir2dim_return()); +} diff --git a/targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/inline/fir2dim.c b/targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/inline/fir2dim.c new file mode 100644 index 0000000..ef2a092 --- /dev/null +++ b/targets/wasm-tacle/kernel/fir2dim/generated/modified_sources/inline/fir2dim.c @@ -0,0 +1,201 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: fir2dim + + Author: Juan Martinez Velarde + + Function: prime calculates whether numbers are prime. + + Source: DSP-Stone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone/ + + Original name: fir2dim_float + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void fir2dim_initSeed(void); +__attribute__((always_inline)) static inline long fir2dim_randomInteger(); +__attribute__((always_inline)) static inline void +fir2dim_pin_down(float *pimage, float *parray, float *pcoeff, float *poutput); +__attribute__((always_inline)) static inline void fir2dim_init(); +__attribute__((always_inline)) static inline int fir2dim_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fir2dim_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ +static float fir2dim_coefficients[3 * 3] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_image[4 * 4] = {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_array[6 * 6] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static float fir2dim_output[4 * 4] = {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; +int fir2dim_result; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +fir2dim_init() { + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &fir2dim_coefficients[0]; + __pragma_loopbound(36, 36); + for (i = 0; i < sizeof(fir2dim_coefficients); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &fir2dim_image[0]; + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(fir2dim_image); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &fir2dim_array[0]; + __pragma_loopbound(144, 144); + for (i = 0; i < sizeof(fir2dim_array); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &fir2dim_output[0]; + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(fir2dim_output); ++i, ++p) + *p ^= bitmask; +} + +__attribute__((always_inline)) static inline int +fir2dim_return() { + return (fir2dim_result - 14 != 0); +} + +/* + Helper functions +*/ + +__attribute__((always_inline)) static inline void +fir2dim_pin_down(float *pimage, float *parray, float *pcoeff, float *poutput) { + register float i, f; + + __pragma_loopbound(4, 4); + for (i = 0; i < 4; i++) { + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) + *pimage++ = 1; + } + + pimage = pimage - 4 * 4; + + __pragma_loopbound(9, 9); + for (i = 0; i < 3 * 3; i++) + *pcoeff++ = 1; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) + *parray++ = 0; + + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) { + *parray++ = 0; + __pragma_loopbound(4, 4); + for (i = 0; i < 4; i++) + *parray++ = *pimage++; + *parray++ = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) + *parray++ = 0; + + __pragma_loopbound(16, 16); + for (i = 0; i < 4 * 4; i++) + *poutput++ = 0; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fir2dim_main() { + register float *parray = &fir2dim_array[0], *parray2, *parray3; + register float *pcoeff = &fir2dim_coefficients[0]; + register float *poutput = &fir2dim_output[0]; + int k, f, i; + + fir2dim_pin_down(&fir2dim_image[0], &fir2dim_array[0], + &fir2dim_coefficients[0], &fir2dim_output[0]); + + poutput = &fir2dim_output[0]; + + __pragma_loopbound(4, 4); + for (k = 0; k < 4; k++) { + + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) { + pcoeff = &fir2dim_coefficients[0]; + parray = &fir2dim_array[k * 6 + f]; + parray2 = parray + 6; + parray3 = parray + 6 + 6; + + *poutput = 0; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) + *poutput += *pcoeff++ * *parray++; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) + *poutput += *pcoeff++ * *parray2++; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) + *poutput += *pcoeff++ * *parray3++; + + poutput++; + } + } + + fir2dim_result = fir2dim_output[0] + fir2dim_output[5] + fir2dim_array[9]; + + fir2dim_pin_down(&fir2dim_image[0], &fir2dim_array[0], + &fir2dim_coefficients[0], &fir2dim_output[0]); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fir2dim_init(); + fir2dim_main(); + + return (fir2dim_return()); +} diff --git a/targets/wasm-tacle/kernel/iir/CMakeLists.txt b/targets/wasm-tacle/kernel/iir/CMakeLists.txt new file mode 100644 index 0000000..91fe6d0 --- /dev/null +++ b/targets/wasm-tacle/kernel/iir/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(iir) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/iir.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/iir.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/iir/ChangeLog.txt b/targets/wasm-tacle/kernel/iir/ChangeLog.txt new file mode 100755 index 0000000..e38c559 --- /dev/null +++ b/targets/wasm-tacle/kernel/iir/ChangeLog.txt @@ -0,0 +1,39 @@ +File: iir.c +Original provenience: DSPstone benchmark suite (floating point), + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone + +2015-10-10: +- Removed original header comment, replaced by TACLeBench header. +- Removed all preprocessor macros, integrated them directly in the source code. +- Added prefix "iir" to all global symbols. +- Added explicit forward declarations of functions. +- Replaced local variables "wi", "coefficients" and "x" that store the + benchmark's input data by global variables. +- Replaced initialization function iir_pin_down by TACLeBench-compliant + initialization code. +- Removed second call of iir_pin_down from function iir_main since it does + not make sense at all. +- Added new function iir_return producing a checksum as return value. +- Added new function iir_main according to TACLeBench guidelines. + iir_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur diff --git a/targets/wasm-tacle/kernel/iir/generated/default/iir.wasm b/targets/wasm-tacle/kernel/iir/generated/default/iir.wasm new file mode 100755 index 0000000000000000000000000000000000000000..bd5ffa97abc88e87031c4f0e0a2258d420e2f0eb GIT binary patch literal 2613 zcmai$J#5=X6vyvK%9cet65OCDI-T4OjSU$|QMgJb6Gc&U>XMEHLrE8vHbn^})kXyZ z32lHHXa>X4;2}eX3?4Fg$dDmJh71`pxZh2`+w}VzMS(6IdiTE*MHVqC2zvkbyLa!N zj*sLKFYZtxKILL-5cuKd>Tzljix9eCo-u|)a)yX69U2eQqU-h|uif$Hf^N6h==Q@F zA!fm%lp0on_Jl2%l+c-n%pr9~$Lt|-{wm5}p=VFe%yf9C8x0Kdi0i&8mUX>eFBrHj zFY(-n2i;~&Xo-hOH0X8xFd?SZ@%)fjC0E7puw_!)bzkOQ&uw@yH;vMt70V#@y%IHt zkB!8KIF-#M@;D?T4mm~2&Qa%RMU9C{Mx!^aHDk0TLsR!c-rdT(7xV6R-W})N-Mo7_ z?_SBfSM%;(-o2K0_w(-cyn7?>-psqV^6u@tdnfPSgXAab(Rnn9BF2 z@}sHzbSl4`%5SFfhpGGp@_;x8L@&8NtWtBGQ3va6EE&wG5yD7~l;cxEQ0Hwq=RpJS z95(RoVFT925?vs+!yK0WW3dvJo-CRE-x|Tn6Ani-l8DE`6AnjltUKXw6vw_zc)E!- z^1iHd!r?f|m5Y2J2gMe^X84Di!)7?Hh=|u$25DuUdpaIA6aTU1uo?b|=CB!#%PjKi z%bn)`Ovl4!;y>3MHp9Qr95%zzJ0idCp)~(jIvzF?|F!0@8Gc`L*bGNQiu}4U)BNA+ zc-Tz*cbday`1hK_W;nWBeXi-WvZBE`OI;5_cESXVej4v^hS>sDfq&|5TEgNGbKsD%h zRn0CaszH~kYA%D8Wd19Vwv=kxyp&f#7o=3vj;Lx7Qddk=Q)F{vHp6DetiZ^4XXn4g zAzUWeLp~ITW>&>r14VIYK~>y7D7NZ4B(_RT!&cn@#a5|ldaDppH^4-33+%|4*=&By zN)Id!;j*}!$cN(4sj9eJpePRgrHZ>P>7#Piom62G*xi(2ieNGl<8=e*e>SbIg6&;u z(DQUyd0oEMD{shOCw(Uw>&Cjwi|%=bh|i96(Kb-nb|_ptDEwO}><<(QgF4+YB z&@tpx*AM-~gpvmxtL(bn$Zz|h7q}A4E>a>`oOsPm7e^u-|->---bi0---(+)-------> xi(n) + A | A + | |1/z| | + | | wi(n-1) | + | v | + |-<--ai1----<-|->---bi1-->-| + | | | + | |1/z| | + | | wi(n-2) | + | v | + |-<--ai2----<--->---bi2-->-| + + The values wi(n-1) and wi(n-2) are stored in wi1 and wi2 + + Source: DSPstone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone + + Original name: iir_N_sections_float + + Changes: + 24-03-94 creation fixed-point (Martinez Velarde) + 16-03-95 adaption floating-point (Harald L. Schraut) + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void iir_init(void); +int iir_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +iir_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +volatile float iir_wi[2 * 4]; +volatile float iir_coefficients[5 * 4]; +float iir_x; + +/* + Initialization- and return-value-related functions +*/ + +void +iir_init(void) { + int f; + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + __pragma_loopbound(20, 20); + for (f = 0; f < 5 * 4; f++) + iir_coefficients[f] = 7; + + __pragma_loopbound(8, 8); + for (f = 0; f < 2 * 4; f++) + iir_wi[f] = 0; + + iir_x = (float) 1; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &iir_coefficients[0]; + __pragma_loopbound(80, 80); + for (i = 0; i < sizeof(iir_coefficients); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &iir_wi[0]; + __pragma_loopbound(32, 32); + for (i = 0; i < sizeof(iir_wi); ++i, ++p) + *p ^= bitmask; +} + +int +iir_return(void) { + float checksum = 0.0; + int f; + + __pragma_loopbound(8, 8); + for (f = 0; f < 2 * 4; f++) + checksum += iir_wi[f]; + + return ((int) checksum); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +iir_main(void) { + register float w; + int f; + register volatile float *ptr_coeff, *ptr_wi1, *ptr_wi2; + register float y; + + ptr_coeff = &iir_coefficients[0]; + ptr_wi1 = &iir_wi[0]; + ptr_wi2 = &iir_wi[1]; + + y = iir_x; + + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) { + w = y - *ptr_coeff++ * *ptr_wi1; + w -= *ptr_coeff++ * *ptr_wi2; + + y = *ptr_coeff++ * w; + y += *ptr_coeff++ * *ptr_wi1; + y += *ptr_coeff++ * *ptr_wi2; + + *ptr_wi2++ = *ptr_wi1; + *ptr_wi1++ = w; + + ptr_wi2++; + ptr_wi1++; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + iir_init(); + iir_main(); + + return (iir_return() - 400 != 0); +} diff --git a/targets/wasm-tacle/kernel/iir/generated/modified_sources/inline/iir.c b/targets/wasm-tacle/kernel/iir/generated/modified_sources/inline/iir.c new file mode 100644 index 0000000..b4ff7be --- /dev/null +++ b/targets/wasm-tacle/kernel/iir/generated/modified_sources/inline/iir.c @@ -0,0 +1,168 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: iir + + Author: Juan Martinez Velarde + + Function: + The equations of each biquad section filter are: + w(n) = x(n) - ai1*w(n-1) - ai2*w(n-2) + y(n) = b0*w(n) + bi1*w(n-1) + bi2*w(n-2) + + Biquads are sequentally positioned. Input sample for biquad i is + xi-1(n). Output sample for biquad i is xi(n). + System input sample is x0(n). System output sample is xN(n) = y(n) + for N biquads. + + Each section performs following filtering (biquad i) : + + wi(n) + xi-1(n) ---(-)---------->-|->---bi0---(+)-------> xi(n) + A | A + | |1/z| | + | | wi(n-1) | + | v | + |-<--ai1----<-|->---bi1-->-| + | | | + | |1/z| | + | | wi(n-2) | + | v | + |-<--ai2----<--->---bi2-->-| + + The values wi(n-1) and wi(n-2) are stored in wi1 and wi2 + + Source: DSPstone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone + + Original name: iir_N_sections_float + + Changes: + 24-03-94 creation fixed-point (Martinez Velarde) + 16-03-95 adaption floating-point (Harald L. Schraut) + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void iir_init(void); +__attribute__((always_inline)) static inline int iir_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +iir_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +volatile float iir_wi[2 * 4]; +volatile float iir_coefficients[5 * 4]; +float iir_x; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +iir_init(void) { + int f; + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + __pragma_loopbound(20, 20); + for (f = 0; f < 5 * 4; f++) + iir_coefficients[f] = 7; + + __pragma_loopbound(8, 8); + for (f = 0; f < 2 * 4; f++) + iir_wi[f] = 0; + + iir_x = (float) 1; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &iir_coefficients[0]; + __pragma_loopbound(80, 80); + for (i = 0; i < sizeof(iir_coefficients); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &iir_wi[0]; + __pragma_loopbound(32, 32); + for (i = 0; i < sizeof(iir_wi); ++i, ++p) + *p ^= bitmask; +} + +__attribute__((always_inline)) static inline int +iir_return(void) { + float checksum = 0.0; + int f; + + __pragma_loopbound(8, 8); + for (f = 0; f < 2 * 4; f++) + checksum += iir_wi[f]; + + return ((int) checksum); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +iir_main(void) { + register float w; + int f; + register volatile float *ptr_coeff, *ptr_wi1, *ptr_wi2; + register float y; + + ptr_coeff = &iir_coefficients[0]; + ptr_wi1 = &iir_wi[0]; + ptr_wi2 = &iir_wi[1]; + + y = iir_x; + + __pragma_loopbound(4, 4); + for (f = 0; f < 4; f++) { + w = y - *ptr_coeff++ * *ptr_wi1; + w -= *ptr_coeff++ * *ptr_wi2; + + y = *ptr_coeff++ * w; + y += *ptr_coeff++ * *ptr_wi1; + y += *ptr_coeff++ * *ptr_wi2; + + *ptr_wi2++ = *ptr_wi1; + *ptr_wi1++ = w; + + ptr_wi2++; + ptr_wi1++; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + iir_init(); + iir_main(); + + return (iir_return() - 400 != 0); +} diff --git a/targets/wasm-tacle/kernel/iir/iir.c b/targets/wasm-tacle/kernel/iir/iir.c new file mode 100755 index 0000000..2f085bd --- /dev/null +++ b/targets/wasm-tacle/kernel/iir/iir.c @@ -0,0 +1,163 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: iir + + Author: Juan Martinez Velarde + + Function: + The equations of each biquad section filter are: + w(n) = x(n) - ai1*w(n-1) - ai2*w(n-2) + y(n) = b0*w(n) + bi1*w(n-1) + bi2*w(n-2) + + Biquads are sequentally positioned. Input sample for biquad i is + xi-1(n). Output sample for biquad i is xi(n). + System input sample is x0(n). System output sample is xN(n) = y(n) + for N biquads. + + Each section performs following filtering (biquad i) : + + wi(n) + xi-1(n) ---(-)---------->-|->---bi0---(+)-------> xi(n) + A | A + | |1/z| | + | | wi(n-1) | + | v | + |-<--ai1----<-|->---bi1-->-| + | | | + | |1/z| | + | | wi(n-2) | + | v | + |-<--ai2----<--->---bi2-->-| + + The values wi(n-1) and wi(n-2) are stored in wi1 and wi2 + + Source: DSPstone + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone + + Original name: iir_N_sections_float + + Changes: + 24-03-94 creation fixed-point (Martinez Velarde) + 16-03-95 adaption floating-point (Harald L. Schraut) + + License: may be used, modified, and re-distributed freely + +*/ + + +/* + Forward declaration of functions +*/ + +void iir_init( void ); +int iir_return( void ); +void iir_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +volatile float iir_wi[ 2 * 4 ]; +volatile float iir_coefficients[ 5 * 4 ]; +float iir_x; + + +/* + Initialization- and return-value-related functions +*/ + +void iir_init( void ) +{ + int f; + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + + _Pragma( "loopbound min 20 max 20" ) + for ( f = 0 ; f < 5 * 4; f++ ) + iir_coefficients[ f ] = 7; + + _Pragma( "loopbound min 8 max 8" ) + for ( f = 0 ; f < 2 * 4; f++ ) + iir_wi[ f ] = 0; + + iir_x = ( float ) 1; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &iir_coefficients[ 0 ]; + _Pragma( "loopbound min 80 max 80" ) + for ( i = 0; i < sizeof( iir_coefficients ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &iir_wi[ 0 ]; + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < sizeof( iir_wi ); ++i, ++p ) + *p ^= bitmask; +} + + +int iir_return( void ) +{ + float checksum = 0.0; + int f; + + + _Pragma( "loopbound min 8 max 8" ) + for ( f = 0 ; f < 2 * 4; f++ ) + checksum += iir_wi[ f ]; + + return ( ( int ) checksum ); +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) iir_main( void ) +{ + register float w; + int f; + register volatile float *ptr_coeff, *ptr_wi1, *ptr_wi2; + register float y; + + + ptr_coeff = &iir_coefficients[ 0 ]; + ptr_wi1 = &iir_wi[ 0 ]; + ptr_wi2 = &iir_wi[ 1 ]; + + y = iir_x ; + + _Pragma( "loopbound min 4 max 4" ) + for ( f = 0 ; f < 4 ; f++ ) { + w = y - *ptr_coeff++ * *ptr_wi1; + w -= *ptr_coeff++ * *ptr_wi2; + + y = *ptr_coeff++ * w; + y += *ptr_coeff++ * *ptr_wi1; + y += *ptr_coeff++ * *ptr_wi2; + + *ptr_wi2++ = *ptr_wi1; + *ptr_wi1++ = w; + + ptr_wi2++; + ptr_wi1++; + } +} + + +int main( void ) +{ + iir_init(); + iir_main(); + + return ( iir_return() - 400 != 0 ); +} diff --git a/targets/wasm-tacle/kernel/insertsort/CMakeLists.txt b/targets/wasm-tacle/kernel/insertsort/CMakeLists.txt new file mode 100644 index 0000000..2ecab04 --- /dev/null +++ b/targets/wasm-tacle/kernel/insertsort/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(insertsort) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/insertsort.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/insertsort.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/insertsort/ChangeLog.txt b/targets/wasm-tacle/kernel/insertsort/ChangeLog.txt new file mode 100755 index 0000000..5e4bc90 --- /dev/null +++ b/targets/wasm-tacle/kernel/insertsort/ChangeLog.txt @@ -0,0 +1,10 @@ +- Added general TACLeBench header to beginning of source code +- Removed #ifdef DEBUG till #endif +- Declaration of global variable unsigned int a[11] changed the variable name to insertion_a[11] as well as for iters_i, min_i, max_i, iters_a, min_a, max_a; +- Created insertsort_initialize(), insertsort_init() and insertsort_return(); +- Removed all PROFILINGs +- Made i volatile for the initialization of the data array +- Added a checksum in the return function + + + diff --git a/targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wasm b/targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a248078cbddd7a49ab0b2980be015c47811494b1 GIT binary patch literal 1237 zcmZ{jKd&1_5Wr`4@9gufEn6>AM7j5%c+ulo`KK49ds~H|2!sUnW^Heb@15^X_a}*^ zNVZZTB)&sFKne;93JQ=?P=JIG1qB5K1qB5Xd;n(m-gBVf?6H0`vokw4;{j8z5$G95 zi%qu5&!^WhfB*nT{2|+J;UUl$x9loLT9=hsuFW7TigH%8`2v6k9FYYfmWUW~1ngbm zTU5JiVhif;$o&%cKkW6^c3o5(25)Hngl^TQEVGSXn8xVJX2rY)jBVajo3dEt4X|Ks zRypukcV}$A;3%~I*qTz$Ol>)fzYjSB@gu|DR)K<3_RA-`9jJjCOm_5u`rPRWD3%~U zb4QLYj$nFu*vI|u<8U8G=e#Ll>`bC!%^~k{rAG`71Ig7(7vZ(={Sin=I6otEkjmhc z0a297&=FIZCQNb)OhU3hOA{^w8Qvd(P~<-CZW446bM^h<62CX1vYgLrd*7eV_u$g! zH6ej6O@OMz^bnP}M|s)V{!OWHO8V>Tr2MqgTvG4*?R8S}c}n+szdHinae|$RH5YyN zQ&2lstLwV!EPY&*8|AP=@eaMbm^}Bh-{0aI(ESn6;TJAP!W@3-(Rbl1kAbs(?J;!t z%45&rw;uZrzw;P5{K4bE;ZGi8hd+CCqnV^#=cJIa9LPxaWlx4Qe=eECbpNPt;GPh- zkhUcfZ@YyQBr(Z=BqHgP^hiRIfP|AU68IE@+^j83#;d%xRZ|yLGj$t=9|Ul4xwLw} zwD`XZ$o`c#aB6z6STljj5Kl(T}WY+RE0!alCG` tX7$))tvw#E+s4c?d$P=mnaS$oab+Lb%I0%>(rijwA4m0SnV;CF%|8|3G(-RZ literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wat b/targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wat new file mode 100644 index 0000000..51f1e12 --- /dev/null +++ b/targets/wasm-tacle/kernel/insertsort/generated/default/insertsort.wat @@ -0,0 +1,280 @@ +(module $insertsort.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $insertsort_main (type 1) + (local i32 i32 i32 i32 i32 i32) + i32.const 0 + i32.const 0 + i32.store offset=1116 + i32.const 9 + i32.const 9 + call $__pragma_loopbound + i32.const 1072 + local.set 0 + i32.const 2 + local.set 1 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1116 + i32.const 1 + i32.add + i32.store offset=1116 + i32.const 0 + i32.const 0 + i32.store offset=1128 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + i32.const 0 + i32.load offset=1128 + local.set 2 + block ;; label = @2 + local.get 1 + i32.const 2 + i32.shl + local.tee 3 + i32.const 1072 + i32.add + i32.load + local.tee 4 + local.get 3 + i32.const 1068 + i32.add + i32.load + local.tee 5 + i32.ge_u + br_if 0 (;@2;) + local.get 0 + local.set 3 + loop ;; label = @3 + local.get 3 + i32.const 4 + i32.add + local.get 4 + i32.store + local.get 3 + i32.const 8 + i32.add + local.get 5 + i32.store + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 3 + i32.load + local.set 5 + local.get 3 + i32.const -4 + i32.add + local.set 3 + local.get 4 + local.get 5 + i32.lt_u + br_if 0 (;@3;) + end + i32.const 0 + local.get 2 + i32.store offset=1128 + end + block ;; label = @2 + local.get 2 + i32.const 0 + i32.load offset=1132 + i32.ge_s + br_if 0 (;@2;) + i32.const 0 + local.get 2 + i32.store offset=1132 + end + block ;; label = @2 + local.get 2 + i32.const 0 + i32.load offset=1136 + i32.le_s + br_if 0 (;@2;) + i32.const 0 + local.get 2 + i32.store offset=1136 + end + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 11 + i32.ne + br_if 0 (;@1;) + end + block ;; label = @1 + i32.const 0 + i32.load offset=1116 + local.tee 3 + i32.const 0 + i32.load offset=1120 + i32.ge_s + br_if 0 (;@1;) + i32.const 0 + local.get 3 + i32.store offset=1120 + end + block ;; label = @1 + local.get 3 + i32.const 0 + i32.load offset=1124 + i32.le_s + br_if 0 (;@1;) + i32.const 0 + local.get 3 + i32.store offset=1124 + end) + (func $__original_main (type 2) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + i32.const 100000 + i32.store offset=1120 + i32.const 0 + i32.const 100000 + i32.store offset=1132 + i32.const 0 + i32.const 0 + i32.store offset=1116 + i32.const 0 + i32.const 0 + i32.store offset=1124 + i32.const 0 + i32.const 0 + i32.store offset=1128 + i32.const 0 + i32.const 0 + i32.store offset=1136 + i32.const 11 + i32.const 11 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.const 10 + i32.gt_s + br_if 0 (;@1;) + loop ;; label = @2 + local.get 0 + i32.load offset=12 + local.set 1 + local.get 0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.const 1072 + i32.add + local.get 1 + i32.const 2 + i32.shl + i32.const 1024 + i32.add + i32.load + i32.store + local.get 0 + local.get 0 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + local.get 0 + i32.load offset=12 + i32.const 11 + i32.lt_s + br_if 0 (;@2;) + end + end + call $insertsort_main + i32.const 11 + i32.const 11 + call $__pragma_loopbound + i32.const 0 + i32.load offset=1072 + local.set 1 + i32.const 0 + i32.load offset=1076 + local.set 2 + i32.const 0 + i32.load offset=1080 + local.set 3 + i32.const 0 + i32.load offset=1084 + local.set 4 + i32.const 0 + i32.load offset=1088 + local.set 5 + i32.const 0 + i32.load offset=1092 + local.set 6 + i32.const 0 + i32.load offset=1096 + local.set 7 + i32.const 0 + i32.load offset=1100 + local.set 8 + i32.const 0 + i32.load offset=1104 + local.set 9 + i32.const 0 + i32.load offset=1108 + local.set 10 + i32.const 0 + i32.load offset=1112 + local.set 11 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 11 + local.get 10 + local.get 9 + local.get 8 + local.get 7 + local.get 6 + local.get 5 + local.get 4 + local.get 3 + local.get 2 + local.get 1 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 65 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5248)) + (global (;1;) i32 (i32.const 1140)) + (global (;2;) i32 (i32.const 5248)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $insertsort_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\00\00\00\00\0b\00\00\00\0a\00\00\00\09\00\00\00\08\00\00\00\07\00\00\00\06\00\00\00\05\00\00\00\04\00\00\00\03\00\00\00\02\00\00\00")) diff --git a/targets/wasm-tacle/kernel/insertsort/generated/modified_sources/default/insertsort.c b/targets/wasm-tacle/kernel/insertsort/generated/modified_sources/default/insertsort.c new file mode 100644 index 0000000..2b3bf33 --- /dev/null +++ b/targets/wasm-tacle/kernel/insertsort/generated/modified_sources/default/insertsort.c @@ -0,0 +1,140 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: insertsort + + Author: Sung-Soo Lim + + Function: Insertion sort for 10 integer numbers. + The integer array insertsort_a[ ] is initialized in main function. + Input-data dependent nested loop with worst-case of + (n^2)/2 iterations (triangular loop). + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/insertsort/insertsort.c + + Changes: a brief summary of major functional changes (not formatting) + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void insertsort_initialize(unsigned int *array); +void insertsort_init(void); +int insertsort_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +insertsort_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ +unsigned int insertsort_a[11]; +int insertsort_iters_i, insertsort_min_i, insertsort_max_i; +int insertsort_iters_a, insertsort_min_a, insertsort_max_a; + +/* + Initialization- and return-value-related functions +*/ + +void +insertsort_initialize(unsigned int *array) { + + register volatile int i; + __pragma_loopbound(11, 11); + for (i = 0; i < 11; i++) + insertsort_a[i] = array[i]; +} + +void +insertsort_init() { + unsigned int a[11] = {0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; + + insertsort_iters_i = 0; + insertsort_min_i = 100000; + insertsort_max_i = 0; + insertsort_iters_a = 0; + insertsort_min_a = 100000; + insertsort_max_a = 0; + + insertsort_initialize(a); +} + +int +insertsort_return() { + int i, returnValue = 0; + + __pragma_loopbound(11, 11); + for (i = 0; i < 11; i++) + returnValue += insertsort_a[i]; + + return (returnValue + (-65)) != 0; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +insertsort_main() { + int i, j, temp; + i = 2; + + insertsort_iters_i = 0; + + __pragma_loopbound(9, 9); + while (i <= 10) { + + insertsort_iters_i++; + + j = i; + + insertsort_iters_a = 0; + + __pragma_loopbound(1, 9); + while (insertsort_a[j] < insertsort_a[j - 1]) { + insertsort_iters_a++; + + temp = insertsort_a[j]; + insertsort_a[j] = insertsort_a[j - 1]; + insertsort_a[j - 1] = temp; + j--; + } + + if (insertsort_iters_a < insertsort_min_a) + insertsort_min_a = insertsort_iters_a; + if (insertsort_iters_a > insertsort_max_a) + insertsort_max_a = insertsort_iters_a; + + i++; + } + + if (insertsort_iters_i < insertsort_min_i) + insertsort_min_i = insertsort_iters_i; + if (insertsort_iters_i > insertsort_max_i) + insertsort_max_i = insertsort_iters_i; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + insertsort_init(); + insertsort_main(); + return (insertsort_return()); +} diff --git a/targets/wasm-tacle/kernel/insertsort/generated/modified_sources/inline/insertsort.c b/targets/wasm-tacle/kernel/insertsort/generated/modified_sources/inline/insertsort.c new file mode 100644 index 0000000..5cf587f --- /dev/null +++ b/targets/wasm-tacle/kernel/insertsort/generated/modified_sources/inline/insertsort.c @@ -0,0 +1,149 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: insertsort + + Author: Sung-Soo Lim + + Function: Insertion sort for 10 integer numbers. + The integer array insertsort_a[ ] is initialized in main function. + Input-data dependent nested loop with worst-case of + (n^2)/2 iterations (triangular loop). + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/insertsort/insertsort.c + + Changes: a brief summary of major functional changes (not formatting) + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +insertsort_initialize(unsigned int *array); +__attribute__((always_inline)) static inline void insertsort_init(void); +__attribute__((always_inline)) static inline int insertsort_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +insertsort_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ +unsigned int insertsort_a[11]; +int insertsort_iters_i, insertsort_min_i, insertsort_max_i; +int insertsort_iters_a, insertsort_min_a, insertsort_max_a; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +insertsort_initialize(unsigned int *array) { + + register volatile int i; + __pragma_loopbound(11, 11); + for (i = 0; i < 11; i++) + insertsort_a[i] = array[i]; +} + +__attribute__((always_inline)) static inline void +insertsort_init() { + unsigned int a[11] = {0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; + + insertsort_iters_i = 0; + insertsort_min_i = 100000; + insertsort_max_i = 0; + insertsort_iters_a = 0; + insertsort_min_a = 100000; + insertsort_max_a = 0; + + insertsort_initialize(a); +} + +__attribute__((always_inline)) static inline int +insertsort_return() { + int i, returnValue = 0; + + __pragma_loopbound(11, 11); + for (i = 0; i < 11; i++) + returnValue += insertsort_a[i]; + + return (returnValue + (-65)) != 0; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +insertsort_main() { + int i, j, temp; + i = 2; + + insertsort_iters_i = 0; + + __pragma_loopbound(9, 9); + while (i <= 10) { + + insertsort_iters_i++; + + j = i; + + insertsort_iters_a = 0; + + __pragma_loopbound(1, 9); + while (insertsort_a[j] < insertsort_a[j - 1]) { + insertsort_iters_a++; + + temp = insertsort_a[j]; + insertsort_a[j] = insertsort_a[j - 1]; + insertsort_a[j - 1] = temp; + j--; + } + + if (insertsort_iters_a < insertsort_min_a) + insertsort_min_a = insertsort_iters_a; + if (insertsort_iters_a > insertsort_max_a) + insertsort_max_a = insertsort_iters_a; + + i++; + } + + if (insertsort_iters_i < insertsort_min_i) + insertsort_min_i = insertsort_iters_i; + if (insertsort_iters_i > insertsort_max_i) + insertsort_max_i = insertsort_iters_i; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + insertsort_init(); + insertsort_main(); + return (insertsort_return()); +} diff --git a/targets/wasm-tacle/kernel/insertsort/insertsort.c b/targets/wasm-tacle/kernel/insertsort/insertsort.c new file mode 100755 index 0000000..59d90a5 --- /dev/null +++ b/targets/wasm-tacle/kernel/insertsort/insertsort.c @@ -0,0 +1,139 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: insertsort + + Author: Sung-Soo Lim + + Function: Insertion sort for 10 integer numbers. + The integer array insertsort_a[ ] is initialized in main function. + Input-data dependent nested loop with worst-case of + (n^2)/2 iterations (triangular loop). + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/insertsort/insertsort.c + + Changes: a brief summary of major functional changes (not formatting) + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim +*/ + + +/* + Forward declaration of functions +*/ +void insertsort_initialize( unsigned int *array ); +void insertsort_init( void ); +int insertsort_return( void ); +void insertsort_main( void ); +int main( void ); + +/* + Declaration of global variables +*/ +unsigned int insertsort_a[ 11 ]; +int insertsort_iters_i, insertsort_min_i, insertsort_max_i; +int insertsort_iters_a, insertsort_min_a, insertsort_max_a; + +/* + Initialization- and return-value-related functions +*/ + +void insertsort_initialize( unsigned int *array ) +{ + + register volatile int i; + _Pragma( "loopbound min 11 max 11" ) + for ( i = 0; i < 11; i++ ) + insertsort_a[ i ] = array[ i ]; + +} + + +void insertsort_init() +{ + unsigned int a[ 11 ] = {0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; + + insertsort_iters_i = 0; + insertsort_min_i = 100000; + insertsort_max_i = 0; + insertsort_iters_a = 0; + insertsort_min_a = 100000; + insertsort_max_a = 0; + + insertsort_initialize( a ); +} + +int insertsort_return() +{ + int i, returnValue = 0; + + _Pragma( "loopbound min 11 max 11" ) + for ( i = 0; i < 11; i++ ) + returnValue += insertsort_a[ i ]; + + return ( returnValue + ( -65 ) ) != 0; +} + + +/* + Main functions +*/ + + +void _Pragma( "entrypoint" ) insertsort_main() +{ + int i, j, temp; + i = 2; + + insertsort_iters_i = 0; + + _Pragma( "loopbound min 9 max 9" ) + while ( i <= 10 ) { + + insertsort_iters_i++; + + j = i; + + insertsort_iters_a = 0; + + _Pragma( "loopbound min 1 max 9" ) + while ( insertsort_a[ j ] < insertsort_a[ j - 1 ] ) { + insertsort_iters_a++; + + temp = insertsort_a[ j ]; + insertsort_a[ j ] = insertsort_a[ j - 1 ]; + insertsort_a[ j - 1 ] = temp; + j--; + } + + if ( insertsort_iters_a < insertsort_min_a ) + insertsort_min_a = insertsort_iters_a; + if ( insertsort_iters_a > insertsort_max_a ) + insertsort_max_a = insertsort_iters_a; + + i++; + } + + if ( insertsort_iters_i < insertsort_min_i ) + insertsort_min_i = insertsort_iters_i; + if ( insertsort_iters_i > insertsort_max_i ) + insertsort_max_i = insertsort_iters_i; +} + +int main( void ) +{ + insertsort_init(); + insertsort_main(); + return ( insertsort_return() ); +} + diff --git a/targets/wasm-tacle/kernel/isqrt/CMakeLists.txt b/targets/wasm-tacle/kernel/isqrt/CMakeLists.txt new file mode 100644 index 0000000..9337d7e --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/CMakeLists.txt @@ -0,0 +1,27 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(isqrt) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/isqrt.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/isqrt.c" + "generated/modified_sources/default/basicmath_libc.c" + "generated/modified_sources/default/wcclibm.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/isqrt/ChangeLog.txt b/targets/wasm-tacle/kernel/isqrt/ChangeLog.txt new file mode 100755 index 0000000..4735ade --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/ChangeLog.txt @@ -0,0 +1,78 @@ +Original provenience: MiBench benchmark suite, + http://wwweb.eecs.umich.edu/mibench + +2016-02-09: +- Added TACLeBench header +- Renamed benchmark from 'basicmath_small' to 'basicmath' +- Fixed a typo in code comments: 'soem' -> 'some' +- Removed unused variable 'n' from the main funcion +- Added variable 'double Y' to the main function and accumulated the results of + 'deg2rad(X)' and 'rad2deg(X)' in this variable so that the compiler warning + 'statement with no effect' is fixed. +- Removed conditionally compiled main (test) function from isqrt.c +- Removed conditionally compiled main (test) function from cubic.c +- Removed commented-out code +- Removed unused function, variable, macro and type declarations, structs and + unions +- Removed seemingly unnecessary empty lines +- Renamed memcpy.t to basicmath_libc.c +- Removed unused files: + rad2deg.c + sniptype.h + sniptype.h +- Created basicmath_libc.h and put declaration of basicmath_memcpy() in it +- Reorganized snipmath.h so that the following are in the given order just +after the header + - includes + - declarations of functions +- Reorganized sniptype.h so that the following are in the given order just +after the header + - macro definitions + - type definitions +- Removed duplicated copyright information from wcclibm.c +- Removed __STDC__ checks from wcclibm.c and used only ANSI style function + arguments +- Removed 'last modified' comments from files +- Removed mention 'use __kernel_rem_pio2f()' from comments of function + __ieee754_rem_pio2f() since it doesn't really use it. +- Removed math functions specialization macros from wcclibm.h and updated call + sites with explicit nameks of the functions. +- Removed '#define double float' from wcclibm.h and replaced all 'double's +with 'float's in the benchmark +- Added a new main function that calls the old main function +- Annotated basicmath_main() as the entry point of the analysis +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2017-06-27 +- Introduce basicmath_init and basicmath_return functions. +- Add prefix basicmath_ to global variables. +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. + +2017-07-10 +- Fix possible stack buffer overflow caused by sizeof of incorrect type. + +2019-03-07 +-split basicmath into seperate files +-Add TACLeBench Header +-put each benchmark into a seperate folder +-adjust the code formatting to the common TACLeBench code style diff --git a/targets/wasm-tacle/kernel/isqrt/basicmath_libc.c b/targets/wasm-tacle/kernel/isqrt/basicmath_libc.c new file mode 100755 index 0000000..a719de9 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/basicmath_libc.c @@ -0,0 +1,35 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: basicmath_libc + + Author: unknown + + Function: Implementation of basicmath_memcpy + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + + +void basicmath_memcpy( void *a, const void *b, int c ) +{ + char *dest = ( char * ) a; + char *source = ( char * ) b; + int copied; + _Pragma( "loopbound min 4 max 4" ) + for ( copied = 0; copied < c; copied++ ) { + *dest = *source; + dest++; + source++; + } +} diff --git a/targets/wasm-tacle/kernel/isqrt/basicmath_libc.h b/targets/wasm-tacle/kernel/isqrt/basicmath_libc.h new file mode 100755 index 0000000..5af611d --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/basicmath_libc.h @@ -0,0 +1,28 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: basicmath_libc + + Author: unknown + + Function: Header file for declaration of basicmath_memcpy + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef __BASICMATH_LIBC_H_ +#define __BASICMATH_LIBC_H_ + +void basicmath_memcpy( void *a, const void *b, int c ); + +#endif // __BASICMATH_LIBC_H_ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/default/isqrt.wasm b/targets/wasm-tacle/kernel/isqrt/generated/default/isqrt.wasm new file mode 100755 index 0000000000000000000000000000000000000000..12a8dd4dce1003afc3d830f184c030a69d6b2f81 GIT binary patch literal 1119 zcmcIj&2AGh5T3EUNt$hysFe^>CFBhpimHSbK~Zz64+tu*aK&{JH*C6p-Sw8{v{hB1 zA|cdA;30SiUZvbQa4X(jQi%f+7p&F#n;(0|^UZ+DLIk@yt;sy_qoctVG9UoB#tukP zzya6~ivwC%f!x8Clu4?lp;`*!I2pxxGy$LvLnM?rm>{A<5wNjF3lvuyZUN$|RsA>I z=Icfy)M1>?3EY+Py$vo^k_2-(QAWvB2k|%qZ0pFR^Cb2o1B8XjkASvi?W3a!MOVsq zS|xI%GEGVQqr(We7Ze-C{WH5jbdP%QpoZ5?aoz0J7zFN+%gfROJ*0brdqi--7iNzN z@EG0WOc2v^M3D*L)MAd}-bvb{+vFlwnJLt zQyGbaXw3xcUQ~&JfDLj{WdM)xa|vcU3q@(Gvg_HqXT3$PHqv$TrMNL4>PIT56s&98-XDj`ypwjA#>u?7ieSAm zqsB+F8XKL$?oyJ*lYFex43{k&>nzig{%DTNZ$^1!ay|}JG+o`^9c&Mt@r}n@d8K~x z5cWGprBiL>p;jhOb;dT^VICO&Lb K{AtwJr{)(S>> (BITSPERLONG - 2)) + +/* usqrt: + ENTRY x: unsigned long + EXIT returns floor(sqrt(x) * pow(2, BITSPERLONG/2)) + + Since the square root never uses more than half the bits + of the input, we use the other half of the bits to contain + extra bits of precision after the binary point. + + EXAMPLE + suppose BITSPERLONG = 32 + then usqrt(144) = 786432 = 12 * 65536 + usqrt(32) = 370727 = 5.66 * 65536 + + NOTES + (1) change BITSPERLONG to BITSPERLONG/2 if you do not want + the answer scaled. Indeed, if you want n bits of + precision after the binary point, use BITSPERLONG/2+n. + The code assumes that BITSPERLONG is even. + (2) This is really better off being written in assembly. + The line marked below is really a "arithmetic shift left" + on the double-long value with r in the upper half + and x in the lower half. This operation is typically + expressible in only one or two assembly instructions. + (3) Unrolling this loop is probably not a bad idea. + + ALGORITHM + The calculations are the base-two analogue of the square + root algorithm we all learned in grammar school. Since we're + in base 2, there is only one nontrivial trial multiplier. + + Notice that absolutely no multiplications or divisions are performed. + This means it'll be fast on a wide range of processors. +*/ + +/* + Forward declaration of functions +*/ + +void isqrt_usqrt(unsigned long x, struct int_sqrt *q); +void isqrt_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +isqrt_main(void); +int isqrt_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +int isqrt_i; +struct int_sqrt isqrt_q; +unsigned long isqrt_l; +unsigned long isqrt_checksum; + +/* + Initialization function +*/ + +void +isqrt_init(void) { + isqrt_l = 0x3fed0169L; + isqrt_checksum = 0; +} + +/* + Return function +*/ + +int +isqrt_return(void) { + if (isqrt_checksum == 53364) + return 0; + else + return -1; +} + +/* + Main functions +*/ + +void +isqrt_usqrt(unsigned long x, struct int_sqrt *q) { + unsigned long a = 0L; /* accumulator */ + unsigned long r = 0L; /* remainder */ + unsigned long e = 0L; /* trial product */ + + int i; + + __pragma_loopbound(32, 32); + for (i = 0; i < BITSPERLONG; i++) { /* NOTE 1 */ + r = (r << 2) + TOP2BITS(x); + x <<= 2; /* NOTE 2 */ + a <<= 1; + e = (a << 1) + 1; + if (r >= e) { + r -= e; + a++; + } + } + basicmath_memcpy(q, &a, sizeof(*q)); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +isqrt_main(void) { + /* perform some integer square roots */ + __pragma_loopbound(1000, 1000); + for (isqrt_i = 1; isqrt_i < 1001; isqrt_i += 1) { + isqrt_usqrt(isqrt_i, &isqrt_q); + isqrt_checksum += isqrt_q.frac; + // remainder differs on some machines + } + isqrt_usqrt(isqrt_l, &isqrt_q); + isqrt_checksum += isqrt_q.frac; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + isqrt_init(); + isqrt_main(); + return isqrt_return(); +} diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/math_private.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/math_private.h new file mode 100644 index 0000000..29972f8 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/math_private.h @@ -0,0 +1,67 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/pi.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/pi.h new file mode 100644 index 0000000..491095d --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/pi.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: pi + + Author: unknown + + Function: Header file for definition of pi + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef PI__H +#define PI__H + +#ifndef PI +#define PI 3.14f +#endif + +#endif /* PI__H */ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/snipmath.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/snipmath.h new file mode 100644 index 0000000..26e73f6 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/snipmath.h @@ -0,0 +1,37 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: snipmath + + Author: unknown + + Function: Header file for SNIPPETS math functions and macros + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +/* + SNIPMATH.H - Header file for SNIPPETS math functions and macros +*/ + +#ifndef SNIPMATH__H +#define SNIPMATH__H + +#include "pi.h" +#include "wcclibm.h" + +struct int_sqrt { + unsigned short sqrt, frac; +}; + +#endif /* SNIPMATH__H */ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.c b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.c new file mode 100644 index 0000000..ffe60ab --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.c @@ -0,0 +1,796 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +float +basicmath___ieee754_acosf(float x) { + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix == 0x3f800000) { /* |x|==1 */ + if (hx > 0) + return 0.0f; /* acos(1) = 0 */ + else + return basicmath_pi + + (float) 2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else if (ix > 0x3f800000) { /* |x| >= 1 */ + return (x - x) / (x - x); /* acos(|x|>1) is NaN */ + } + if (ix < 0x3f000000) { /* |x| < 0.5 */ + if (ix <= 0x23000000) + return basicmath_pio2_hi + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + return basicmath_pio2_hi - (x - (basicmath_pio2_lo - x * r)); + } else if (hx < 0) { /* x < -0.5 */ + z = (basicmath_one + x) * (float) 0.5f; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + s = basicmath___ieee754_sqrtf(z); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - (float) 2.0f * (s + w); + } else { /* x > 0.5 */ + int32_t idf; + z = (basicmath_one - x) * (float) 0.5f; + s = basicmath___ieee754_sqrtf(z); + df = s; + GET_FLOAT_WORD(idf, df); + SET_FLOAT_WORD(df, idf & 0xfffff000); + c = (z - df * df) / (s + df); + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + w = r * s + c; + return (float) 2.0f * (df + w); + } +} + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = + { + 1.0f, + 1.5f, +}, + basicmath_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + basicmath_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +float +basicmath___ieee754_powf(float x, float y) { + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD(hx, x); + GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return basicmath_one; + + /* x==+-1 */ + if (x == 1.0f) + return basicmath_one; + if (x == -1.0f && basicmath___isinff(y)) + return basicmath_one; + + /* +-NaN return x+y */ + if (ix > 0x7f800000 || iy > 0x7f800000) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return y - y; /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : basicmath_zero; + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return basicmath_one / x; + else + return x; + } + if (hy == 0x40000000) + return x * x; /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return basicmath___ieee754_sqrtf(x); + } + + ax = basicmath___fabsf(x); + /* special value of x */ + if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = basicmath_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) { + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + } else if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0) + return (x - x) / (x - x); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return (hy < 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + if (ix > 0x3f800007) + return (hy > 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + (k << 21)); + t_l = ax - (t_h - basicmath_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (basicmath_L1 + + s2 * (basicmath_L2 + + s2 * (basicmath_L3 + + s2 * (basicmath_L4 + + s2 * (basicmath_L5 + s2 * basicmath_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + GET_FLOAT_WORD(is, t_h); + SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD(is, p_h); + SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + basicmath_dp_h[k]) + t); + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - basicmath_dp_h[k]) - z_h); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD(is, y); + SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else if (j == 0x43000000) { /* if z == 128 */ + if (p_l + basicmath_ovt > z - p_h) + return s * basicmath_huge * basicmath_huge; /* overflow */ + } else if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else if ((u_int32_t) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD(is, t); + SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * basicmath_lg2_h; + v = (p_l - (t - p_h)) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (basicmath_P1 + + t * (basicmath_P2 + + t * (basicmath_P3 + t * (basicmath_P4 + t * basicmath_P5)))); + r = (z * t1) / (t1 - basicmath_two) - (w + z * w); + z = basicmath_one - (r - z); + GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = basicmath___scalbnf(z, n); /* subnormal output */ + else + SET_FLOAT_WORD(z, j); + return s * z; +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t +basicmath___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - basicmath_pio2_1t; + y[1] = (z - y[0]) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[0] = z - basicmath_pio2_2t; + y[1] = (z - y[0]) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + basicmath_pio2_1t; + y[1] = (z - y[0]) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[0] = z + basicmath_pio2_2t; + y[1] = (z - y[0]) + basicmath_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf(x); + n = (int32_t) (t * basicmath_invpio2 + basicmath_half); + fn = (float) n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && + (int32_t) (ix & 0xffffff00) != basicmath_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float +basicmath___ieee754_sqrtf(float x) { + float z; + int32_t sign = (int) 0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; /* sqrt(+-0) = +-0 */ + else if (ix < 0) + return (x - x) / (x - x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if (z >= basicmath_one) { + z = basicmath_one + basicmath_tiny; + if (z > basicmath_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + SET_FLOAT_WORD(z, ix); + return z; +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float +basicmath___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * (basicmath_C1 + + z * (basicmath_C2 + + z * (basicmath_C3 + + z * (basicmath_C4 + + z * (basicmath_C5 + z * basicmath_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return basicmath_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = basicmath_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float +basicmath___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + + z * (basicmath_S3 + + z * (basicmath_S4 + z * (basicmath_S5 + z * basicmath_S6))); + if (iy == 0) + return x + v * (basicmath_S1 + z * r); + else + return x - ((z * (basicmath_half * y - v * r) - y) - v * basicmath_S1); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +float +basicmath___copysignf(float x, float y) { + u_int32_t ix, iy; + GET_FLOAT_WORD(ix, x); + GET_FLOAT_WORD(iy, y); + SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float +basicmath___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return basicmath___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return basicmath___kernel_cosf(y[0], y[1]); + case 1: + return -basicmath___kernel_sinf(y[0], y[1], 1); + case 2: + return -basicmath___kernel_cosf(y[0], y[1]); + default: + return basicmath___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float +basicmath___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +int +basicmath___isinff(float x) { + int32_t ix, t; + GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +float +basicmath___scalbnf(float x, int n) { + int32_t k, ix; + GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; /* NaN or Inf */ + k = k + n; + if (n > 50000 || k > 0xfe) + return basicmath_huge * + basicmath___copysignf(basicmath_huge, x); /* overflow */ + if (n < -50000) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + if (k > 0) { /* normal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.h new file mode 100644 index 0000000..6ca3e8d --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/default/wcclibm.h @@ -0,0 +1,58 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +float basicmath___copysignf(float x, float y); +float basicmath___cosf(float x); +float basicmath___fabsf(float x); +float basicmath___ieee754_acosf(float x); +float basicmath___ieee754_powf(float x, float y); +int32_t basicmath___ieee754_rem_pio2f(float x, float *y); +float basicmath___ieee754_sqrtf(float x); +int basicmath___isinff(float x); +float basicmath___kernel_cosf(float x, float y); +float basicmath___kernel_sinf(float x, float y, int iy); +float basicmath___scalbnf(float x, int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.c b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.c new file mode 100644 index 0000000..c2df95d --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.c @@ -0,0 +1,39 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: basicmath_libc + + Author: unknown + + Function: Implementation of basicmath_memcpy + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +basicmath_memcpy(void *a, const void *b, int c) { + char *dest = (char *) a; + char *source = (char *) b; + int copied; + __pragma_loopbound(4, 4); + for (copied = 0; copied < c; copied++) { + *dest = *source; + dest++; + source++; + } +} diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.h new file mode 100644 index 0000000..4b09ee6 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/basicmath_libc.h @@ -0,0 +1,29 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: basicmath_libc + + Author: unknown + + Function: Header file for declaration of basicmath_memcpy + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef __BASICMATH_LIBC_H_ +#define __BASICMATH_LIBC_H_ + +__attribute__((always_inline)) static inline void +basicmath_memcpy(void *a, const void *b, int c); + +#endif // __BASICMATH_LIBC_H_ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/isqrt.c b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/isqrt.c new file mode 100644 index 0000000..9259946 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/isqrt.c @@ -0,0 +1,165 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: isqrt + + Author: unknown + + Function: isqrt calculates the integer square root of a number + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#include "basicmath_libc.h" +#include "snipmath.h" + +// Wasm loop bounds + + +#include "basicmath_libc.c" +#include "wcclibm.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define BITSPERLONG 32 +#define TOP2BITS(x) ((x & (3L << (BITSPERLONG - 2))) >> (BITSPERLONG - 2)) + +/* usqrt: + ENTRY x: unsigned long + EXIT returns floor(sqrt(x) * pow(2, BITSPERLONG/2)) + + Since the square root never uses more than half the bits + of the input, we use the other half of the bits to contain + extra bits of precision after the binary point. + + EXAMPLE + suppose BITSPERLONG = 32 + then usqrt(144) = 786432 = 12 * 65536 + usqrt(32) = 370727 = 5.66 * 65536 + + NOTES + (1) change BITSPERLONG to BITSPERLONG/2 if you do not want + the answer scaled. Indeed, if you want n bits of + precision after the binary point, use BITSPERLONG/2+n. + The code assumes that BITSPERLONG is even. + (2) This is really better off being written in assembly. + The line marked below is really a "arithmetic shift left" + on the double-long value with r in the upper half + and x in the lower half. This operation is typically + expressible in only one or two assembly instructions. + (3) Unrolling this loop is probably not a bad idea. + + ALGORITHM + The calculations are the base-two analogue of the square + root algorithm we all learned in grammar school. Since we're + in base 2, there is only one nontrivial trial multiplier. + + Notice that absolutely no multiplications or divisions are performed. + This means it'll be fast on a wide range of processors. +*/ + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +isqrt_usqrt(unsigned long x, struct int_sqrt *q); +__attribute__((always_inline)) static inline void isqrt_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +isqrt_main(void); +__attribute__((always_inline)) static inline int isqrt_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +int isqrt_i; +struct int_sqrt isqrt_q; +unsigned long isqrt_l; +unsigned long isqrt_checksum; + +/* + Initialization function +*/ + +__attribute__((always_inline)) static inline void +isqrt_init(void) { + isqrt_l = 0x3fed0169L; + isqrt_checksum = 0; +} + +/* + Return function +*/ + +__attribute__((always_inline)) static inline int +isqrt_return(void) { + if (isqrt_checksum == 53364) + return 0; + else + return -1; +} + +/* + Main functions +*/ + +__attribute__((always_inline)) static inline void +isqrt_usqrt(unsigned long x, struct int_sqrt *q) { + unsigned long a = 0L; /* accumulator */ + unsigned long r = 0L; /* remainder */ + unsigned long e = 0L; /* trial product */ + + int i; + + __pragma_loopbound(32, 32); + for (i = 0; i < BITSPERLONG; i++) { /* NOTE 1 */ + r = (r << 2) + TOP2BITS(x); + x <<= 2; /* NOTE 2 */ + a <<= 1; + e = (a << 1) + 1; + if (r >= e) { + r -= e; + a++; + } + } + basicmath_memcpy(q, &a, sizeof(*q)); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +isqrt_main(void) { + /* perform some integer square roots */ + __pragma_loopbound(1000, 1000); + for (isqrt_i = 1; isqrt_i < 1001; isqrt_i += 1) { + isqrt_usqrt(isqrt_i, &isqrt_q); + isqrt_checksum += isqrt_q.frac; + // remainder differs on some machines + } + isqrt_usqrt(isqrt_l, &isqrt_q); + isqrt_checksum += isqrt_q.frac; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + isqrt_init(); + isqrt_main(); + return isqrt_return(); +} diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/math_private.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/math_private.h new file mode 100644 index 0000000..29972f8 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/math_private.h @@ -0,0 +1,67 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/pi.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/pi.h new file mode 100644 index 0000000..491095d --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/pi.h @@ -0,0 +1,30 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: pi + + Author: unknown + + Function: Header file for definition of pi + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef PI__H +#define PI__H + +#ifndef PI +#define PI 3.14f +#endif + +#endif /* PI__H */ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/snipmath.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/snipmath.h new file mode 100644 index 0000000..26e73f6 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/snipmath.h @@ -0,0 +1,37 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: snipmath + + Author: unknown + + Function: Header file for SNIPPETS math functions and macros + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +/* + SNIPMATH.H - Header file for SNIPPETS math functions and macros +*/ + +#ifndef SNIPMATH__H +#define SNIPMATH__H + +#include "pi.h" +#include "wcclibm.h" + +struct int_sqrt { + unsigned short sqrt, frac; +}; + +#endif /* SNIPMATH__H */ diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.c b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.c new file mode 100644 index 0000000..00afd07 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.c @@ -0,0 +1,796 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_acosf(float x) { + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix == 0x3f800000) { /* |x|==1 */ + if (hx > 0) + return 0.0f; /* acos(1) = 0 */ + else + return basicmath_pi + + (float) 2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else if (ix > 0x3f800000) { /* |x| >= 1 */ + return (x - x) / (x - x); /* acos(|x|>1) is NaN */ + } + if (ix < 0x3f000000) { /* |x| < 0.5 */ + if (ix <= 0x23000000) + return basicmath_pio2_hi + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + return basicmath_pio2_hi - (x - (basicmath_pio2_lo - x * r)); + } else if (hx < 0) { /* x < -0.5 */ + z = (basicmath_one + x) * (float) 0.5f; + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + s = basicmath___ieee754_sqrtf(z); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - (float) 2.0f * (s + w); + } else { /* x > 0.5 */ + int32_t idf; + z = (basicmath_one - x) * (float) 0.5f; + s = basicmath___ieee754_sqrtf(z); + df = s; + GET_FLOAT_WORD(idf, df); + SET_FLOAT_WORD(df, idf & 0xfffff000); + c = (z - df * df) / (s + df); + p = z * (basicmath_pS0 + + z * (basicmath_pS1 + + z * (basicmath_pS2 + + z * (basicmath_pS3 + + z * (basicmath_pS4 + z * basicmath_pS5))))); + q = basicmath_one + + z * (basicmath_qS1 + + z * (basicmath_qS2 + z * (basicmath_qS3 + z * basicmath_qS4))); + r = p / q; + w = r * s + c; + return (float) 2.0f * (df + w); + } +} + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = + { + 1.0f, + 1.5f, +}, + basicmath_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + basicmath_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_powf(float x, float y) { + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD(hx, x); + GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return basicmath_one; + + /* x==+-1 */ + if (x == 1.0f) + return basicmath_one; + if (x == -1.0f && basicmath___isinff(y)) + return basicmath_one; + + /* +-NaN return x+y */ + if (ix > 0x7f800000 || iy > 0x7f800000) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return y - y; /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return (hy >= 0) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy < 0) ? -y : basicmath_zero; + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return basicmath_one / x; + else + return x; + } + if (hy == 0x40000000) + return x * x; /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return basicmath___ieee754_sqrtf(x); + } + + ax = basicmath___fabsf(x); + /* special value of x */ + if (ix == 0x7f800000 || ix == 0 || ix == 0x3f800000) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = basicmath_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) { + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + } else if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0) + return (x - x) / (x - x); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return (hy < 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + if (ix > 0x3f800007) + return (hy > 0) ? basicmath_huge * basicmath_huge + : basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + (k << 21)); + t_l = ax - (t_h - basicmath_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (basicmath_L1 + + s2 * (basicmath_L2 + + s2 * (basicmath_L3 + + s2 * (basicmath_L4 + + s2 * (basicmath_L5 + s2 * basicmath_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + GET_FLOAT_WORD(is, t_h); + SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD(is, p_h); + SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + basicmath_dp_h[k]) + t); + GET_FLOAT_WORD(is, t1); + SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - basicmath_dp_h[k]) - z_h); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD(is, y); + SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else if (j == 0x43000000) { /* if z == 128 */ + if (p_l + basicmath_ovt > z - p_h) + return s * basicmath_huge * basicmath_huge; /* overflow */ + } else if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else if ((u_int32_t) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD(is, t); + SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * basicmath_lg2_h; + v = (p_l - (t - p_h)) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (basicmath_P1 + + t * (basicmath_P2 + + t * (basicmath_P3 + t * (basicmath_P4 + t * basicmath_P5)))); + r = (z * t1) / (t1 - basicmath_two) - (w + z * w); + z = basicmath_one - (r - z); + GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = basicmath___scalbnf(z, n); /* subnormal output */ + else + SET_FLOAT_WORD(z, j); + return s * z; +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +__attribute__((always_inline)) static inline int32_t +basicmath___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - basicmath_pio2_1t; + y[1] = (z - y[0]) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[0] = z - basicmath_pio2_2t; + y[1] = (z - y[0]) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + basicmath_pio2_1t; + y[1] = (z - y[0]) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[0] = z + basicmath_pio2_2t; + y[1] = (z - y[0]) + basicmath_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf(x); + n = (int32_t) (t * basicmath_invpio2 + basicmath_half); + fn = (float) n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && + (int32_t) (ix & 0xffffff00) != basicmath_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +__attribute__((always_inline)) static inline float +basicmath___ieee754_sqrtf(float x) { + float z; + int32_t sign = (int) 0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; /* sqrt(+-0) = +-0 */ + else if (ix < 0) + return (x - x) / (x - x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if (z >= basicmath_one) { + z = basicmath_one + basicmath_tiny; + if (z > basicmath_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + SET_FLOAT_WORD(z, ix); + return z; +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +__attribute__((always_inline)) static inline float +basicmath___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * (basicmath_C1 + + z * (basicmath_C2 + + z * (basicmath_C3 + + z * (basicmath_C4 + + z * (basicmath_C5 + z * basicmath_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return basicmath_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = basicmath_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +__attribute__((always_inline)) static inline float +basicmath___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + + z * (basicmath_S3 + + z * (basicmath_S4 + z * (basicmath_S5 + z * basicmath_S6))); + if (iy == 0) + return x + v * (basicmath_S1 + z * r); + else + return x - ((z * (basicmath_half * y - v * r) - y) - v * basicmath_S1); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +__attribute__((always_inline)) static inline float +basicmath___copysignf(float x, float y) { + u_int32_t ix, iy; + GET_FLOAT_WORD(ix, x); + GET_FLOAT_WORD(iy, y); + SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +__attribute__((always_inline)) static inline float +basicmath___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return basicmath___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return basicmath___kernel_cosf(y[0], y[1]); + case 1: + return -basicmath___kernel_sinf(y[0], y[1], 1); + case 2: + return -basicmath___kernel_cosf(y[0], y[1]); + default: + return basicmath___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +__attribute__((always_inline)) static inline float +basicmath___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +__attribute__((always_inline)) static inline int +basicmath___isinff(float x) { + int32_t ix, t; + GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +__attribute__((always_inline)) static inline float +basicmath___scalbnf(float x, int n) { + int32_t k, ix; + GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; /* NaN or Inf */ + k = k + n; + if (n > 50000 || k > 0xfe) + return basicmath_huge * + basicmath___copysignf(basicmath_huge, x); /* overflow */ + if (n < -50000) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + if (k > 0) { /* normal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return basicmath_tiny * + basicmath___copysignf(basicmath_tiny, x); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.h b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.h new file mode 100644 index 0000000..e4bbb75 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/generated/modified_sources/inline/wcclibm.h @@ -0,0 +1,66 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +__attribute__((always_inline)) static inline float +basicmath___copysignf(float x, float y); +__attribute__((always_inline)) static inline float basicmath___cosf(float x); +__attribute__((always_inline)) static inline float basicmath___fabsf(float x); +__attribute__((always_inline)) static inline float +basicmath___ieee754_acosf(float x); +__attribute__((always_inline)) static inline float +basicmath___ieee754_powf(float x, float y); +__attribute__((always_inline)) static inline int32_t +basicmath___ieee754_rem_pio2f(float x, float *y); +__attribute__((always_inline)) static inline float +basicmath___ieee754_sqrtf(float x); +__attribute__((always_inline)) static inline int basicmath___isinff(float x); +__attribute__((always_inline)) static inline float +basicmath___kernel_cosf(float x, float y); +__attribute__((always_inline)) static inline float +basicmath___kernel_sinf(float x, float y, int iy); +__attribute__((always_inline)) static inline float basicmath___scalbnf(float x, + int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/isqrt/isqrt.c b/targets/wasm-tacle/kernel/isqrt/isqrt.c new file mode 100755 index 0000000..82b7a72 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/isqrt.c @@ -0,0 +1,156 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: isqrt + + Author: unknown + + Function: isqrt calculates the integer square root of a number + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#include "basicmath_libc.h" +#include "snipmath.h" + +#define BITSPERLONG 32 +#define TOP2BITS(x) ((x & (3L << (BITSPERLONG-2))) >> (BITSPERLONG-2)) + +/* usqrt: + ENTRY x: unsigned long + EXIT returns floor(sqrt(x) * pow(2, BITSPERLONG/2)) + + Since the square root never uses more than half the bits + of the input, we use the other half of the bits to contain + extra bits of precision after the binary point. + + EXAMPLE + suppose BITSPERLONG = 32 + then usqrt(144) = 786432 = 12 * 65536 + usqrt(32) = 370727 = 5.66 * 65536 + + NOTES + (1) change BITSPERLONG to BITSPERLONG/2 if you do not want + the answer scaled. Indeed, if you want n bits of + precision after the binary point, use BITSPERLONG/2+n. + The code assumes that BITSPERLONG is even. + (2) This is really better off being written in assembly. + The line marked below is really a "arithmetic shift left" + on the double-long value with r in the upper half + and x in the lower half. This operation is typically + expressible in only one or two assembly instructions. + (3) Unrolling this loop is probably not a bad idea. + + ALGORITHM + The calculations are the base-two analogue of the square + root algorithm we all learned in grammar school. Since we're + in base 2, there is only one nontrivial trial multiplier. + + Notice that absolutely no multiplications or divisions are performed. + This means it'll be fast on a wide range of processors. +*/ + + +/* + Forward declaration of functions +*/ + +void isqrt_usqrt( unsigned long x, struct int_sqrt *q ); +void isqrt_init( void ); +void isqrt_main( void ); +int isqrt_return( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +int isqrt_i; +struct int_sqrt isqrt_q; +unsigned long isqrt_l; +unsigned long isqrt_checksum; + + +/* + Initialization function +*/ + +void isqrt_init( void ) +{ + isqrt_l = 0x3fed0169L; + isqrt_checksum = 0; +} + + +/* + Return function +*/ + +int isqrt_return( void ) +{ + if ( isqrt_checksum == 53364 ) + return 0; + else + return -1; +} + + +/* + Main functions +*/ + +void isqrt_usqrt( unsigned long x, struct int_sqrt *q ) +{ + unsigned long a = 0L; /* accumulator */ + unsigned long r = 0L; /* remainder */ + unsigned long e = 0L; /* trial product */ + + int i; + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < BITSPERLONG; i++ ) { /* NOTE 1 */ + r = ( r << 2 ) + TOP2BITS( x ); + x <<= 2; /* NOTE 2 */ + a <<= 1; + e = ( a << 1 ) + 1; + if ( r >= e ) { + r -= e; + a++; + } + } + basicmath_memcpy( q, &a, sizeof( *q ) ); +} + + +void _Pragma( "entrypoint" ) isqrt_main( void ) +{ + /* perform some integer square roots */ + _Pragma( "loopbound min 1000 max 1000" ) + for ( isqrt_i = 1; isqrt_i < 1001; isqrt_i += 1 ) { + isqrt_usqrt( isqrt_i, &isqrt_q ); + isqrt_checksum += isqrt_q.frac; + // remainder differs on some machines + } + isqrt_usqrt( isqrt_l, &isqrt_q ); + isqrt_checksum += isqrt_q.frac; +} + + +int main( void ) +{ + isqrt_init(); + isqrt_main(); + return isqrt_return(); +} + diff --git a/targets/wasm-tacle/kernel/isqrt/math_private.h b/targets/wasm-tacle/kernel/isqrt/math_private.h new file mode 100755 index 0000000..8dfd646 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/isqrt/pi.h b/targets/wasm-tacle/kernel/isqrt/pi.h new file mode 100755 index 0000000..908b428 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/pi.h @@ -0,0 +1,31 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: pi + + Author: unknown + + Function: Header file for definition of pi + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +#ifndef PI__H +#define PI__H + +#ifndef PI +#define PI 3.14f +#endif + + +#endif /* PI__H */ diff --git a/targets/wasm-tacle/kernel/isqrt/snipmath.h b/targets/wasm-tacle/kernel/isqrt/snipmath.h new file mode 100755 index 0000000..70fd3fa --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/snipmath.h @@ -0,0 +1,40 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: snipmath + + Author: unknown + + Function: Header file for SNIPPETS math functions and macros + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: basicmath_small + + Changes: no major functional changes + + License: this code is FREE with no restrictions + +*/ + +/* + SNIPMATH.H - Header file for SNIPPETS math functions and macros +*/ + +#ifndef SNIPMATH__H +#define SNIPMATH__H + +#include "wcclibm.h" +#include "pi.h" + + +struct int_sqrt { + unsigned short sqrt, + frac; +}; + + +#endif /* SNIPMATH__H */ diff --git a/targets/wasm-tacle/kernel/isqrt/wcclibm.c b/targets/wasm-tacle/kernel/isqrt/wcclibm.c new file mode 100755 index 0000000..d5fb606 --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/wcclibm.c @@ -0,0 +1,757 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#include "wcclibm.h" +#include "math_private.h" + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_pi = 3.1415925026e+00f, /* 0x40490fda */ + basicmath_pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ + basicmath_pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ + basicmath_pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ + basicmath_pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ + basicmath_pS3 = -4.0055535734e-02f, /* 0xbd241146 */ + basicmath_pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ + basicmath_pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ + basicmath_qS1 = -2.4033949375e+00f, /* 0xc019d139 */ + basicmath_qS2 = 2.0209457874e+00f, /* 0x4001572d */ + basicmath_qS3 = -6.8828397989e-01f, /* 0xbf303361 */ + basicmath_qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +float basicmath___ieee754_acosf( float x ) +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return basicmath_pi + ( float )2.0f * basicmath_pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return basicmath_pio2_hi + + basicmath_pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + r = p / q; + return basicmath_pio2_hi - ( x - ( basicmath_pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( basicmath_one + x ) * ( float )0.5f; + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + s = basicmath___ieee754_sqrtf( z ); + r = p / q; + w = r * s - basicmath_pio2_lo; + return basicmath_pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( basicmath_one - x ) * ( float )0.5f; + s = basicmath___ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( basicmath_pS0 + z * ( basicmath_pS1 + z * ( basicmath_pS2 + z * + ( basicmath_pS3 + z * + ( basicmath_pS4 + z * basicmath_pS5 ) ) ) ) ); + q = basicmath_one + z * ( basicmath_qS1 + z * ( basicmath_qS2 + z * + ( basicmath_qS3 + z * basicmath_qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} + + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_bp[] = {1.0f, 1.5f,}, + basicmath_dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + basicmath_dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + basicmath_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + basicmath_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + basicmath_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + basicmath_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + basicmath_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + basicmath_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + basicmath_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + basicmath_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + basicmath_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + basicmath_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + basicmath_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + basicmath_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + basicmath_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + basicmath_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + basicmath_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + basicmath_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + basicmath_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + basicmath_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + basicmath_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + basicmath_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + basicmath_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +float basicmath___ieee754_powf( float x, float y ) +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return basicmath_one; + + /* x==+-1 */ + if ( x == 1.0f ) return basicmath_one; + if ( x == -1.0f && basicmath___isinff( y ) ) return basicmath_one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : basicmath_zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : basicmath_zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return basicmath_one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return basicmath___ieee754_sqrtf( x ); + } + + ax = basicmath___fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = basicmath_one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? basicmath_huge * basicmath_huge : + basicmath_tiny * basicmath_tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? basicmath_huge * basicmath_huge : + basicmath_tiny * basicmath_tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = basicmath_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * basicmath_ivln2_l - w * basicmath_ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= basicmath_two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - basicmath_bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( basicmath_L1 + s2 * ( basicmath_L2 + s2 * + ( basicmath_L3 + s2 * ( basicmath_L4 + s2 * + ( basicmath_L5 + s2 * basicmath_L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = basicmath_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = basicmath_cp_l * p_h + p_l * basicmath_cp + basicmath_dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + basicmath_dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - basicmath_dp_h[ k ] ) - z_h ); + } + + s = basicmath_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -basicmath_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * basicmath_huge * basicmath_huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + basicmath_ovt > z - p_h ) return s * basicmath_huge * + basicmath_huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * basicmath_tiny * basicmath_tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * basicmath_tiny * + basicmath_tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * basicmath_lg2_h; + v = ( p_l - ( t - p_h ) ) * basicmath_lg2 + t * basicmath_lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( basicmath_P1 + t * ( basicmath_P2 + t * ( basicmath_P3 + t * + ( basicmath_P4 + t * basicmath_P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - basicmath_two ) - ( w + z * w ); + z = basicmath_one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = basicmath___scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} + + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* basicmath___ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t basicmath_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float basicmath_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + basicmath_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + basicmath_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + basicmath_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + basicmath_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + basicmath_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + basicmath_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t basicmath___ieee754_rem_pio2f( float x, float *y ) +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - basicmath_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - basicmath_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= basicmath_pio2_2; + y[ 0 ] = z - basicmath_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - basicmath_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + basicmath_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + basicmath_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + basicmath_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += basicmath_pio2_2; + y[ 0 ] = z + basicmath_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + basicmath_pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = basicmath___fabsf( x ); + n = ( int32_t ) ( t * basicmath_invpio2 + basicmath_half ); + fn = ( float )n; + r = t - fn * basicmath_pio2_1; + w = fn * basicmath_pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != basicmath_npio2_hw[n - 1] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * basicmath_pio2_2; + r = t - w; + w = fn * basicmath_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * basicmath_pio2_3; + r = t - w; + w = fn * basicmath_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + + // This will never happen in basicmath_small, because + // up to this point we have already returned a value + // for each of the possible inputs + y[ 0 ] = y[ 1 ] = x - x; /* dummy initialization */ + return 0; +} + + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float basicmath___ieee754_sqrtf( float x ) +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 25 max 25" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = basicmath_one - basicmath_tiny; /* trigger inexact flag */ + if ( z >= basicmath_one ) { + z = basicmath_one + basicmath_tiny; + if ( z > basicmath_one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} + + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + basicmath_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + basicmath_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + basicmath_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + basicmath_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + basicmath_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float basicmath___kernel_cosf( float x, float y ) +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return basicmath_one; /* generate inexact */ + } + z = x * x; + r = z * ( basicmath_C1 + z * ( basicmath_C2 + z * ( basicmath_C3 + z * + ( basicmath_C4 + z * ( basicmath_C5 + z * basicmath_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return basicmath_one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = basicmath_one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} + + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + basicmath_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + basicmath_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + basicmath_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + basicmath_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + basicmath_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float basicmath___kernel_sinf( float x, float y, int iy ) +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = basicmath_S2 + z * ( basicmath_S3 + z * ( basicmath_S4 + z * + ( basicmath_S5 + z * basicmath_S6 ) ) ); + if ( iy == 0 ) return x + v * ( basicmath_S1 + z * r ); + else return x - ( ( z * ( basicmath_half * y - v * r ) - y ) - v * + basicmath_S1 ); +} + + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +float basicmath___copysignf( float x, float y ) +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} + + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +float basicmath___cosf( float x ) +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return basicmath___kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = basicmath___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return basicmath___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -basicmath___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 2: + return -basicmath___kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return basicmath___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float basicmath___fabsf( float x ) +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + +int basicmath___isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} + + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +static const float basicmath_two25 = 3.355443200e+07f, /* 0x4c000000 */ + basicmath_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +float basicmath___scalbnf ( float x, int n ) +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= basicmath_two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return basicmath_huge * basicmath___copysignf( basicmath_huge, + x ); /* overflow */ + if ( n < -50000 ) + return basicmath_tiny * basicmath___copysignf( basicmath_tiny, + x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return basicmath_tiny * basicmath___copysignf( basicmath_tiny, + x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * basicmath_twom25; +} diff --git a/targets/wasm-tacle/kernel/isqrt/wcclibm.h b/targets/wasm-tacle/kernel/isqrt/wcclibm.h new file mode 100755 index 0000000..0f40abe --- /dev/null +++ b/targets/wasm-tacle/kernel/isqrt/wcclibm.h @@ -0,0 +1,61 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, + basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, + basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +float basicmath___copysignf( float x, float y ); +float basicmath___cosf( float x ); +float basicmath___fabsf( float x ); +float basicmath___ieee754_acosf( float x ); +float basicmath___ieee754_powf( float x, float y ); +int32_t basicmath___ieee754_rem_pio2f( float x, float *y ); +float basicmath___ieee754_sqrtf( float x ); +int basicmath___isinff ( float x ); +float basicmath___kernel_cosf( float x, float y ); +float basicmath___kernel_sinf( float x, float y, int iy ); +float basicmath___scalbnf ( float x, int n ); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/kernel/jfdctint/CMakeLists.txt b/targets/wasm-tacle/kernel/jfdctint/CMakeLists.txt new file mode 100644 index 0000000..37c597d --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(jfdctint) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/jfdctint.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/jfdctint.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/jfdctint/ChangeLog.txt b/targets/wasm-tacle/kernel/jfdctint/ChangeLog.txt new file mode 100755 index 0000000..f87752d --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/ChangeLog.txt @@ -0,0 +1,70 @@ +File: jfdctint.c +Original provenience: SNU-RT Benchmark Suite for Worst Case Timing Analysis + +2016-02-01: +- Added generic TACLeBench header. +- Removed old file header (keep some information in TACLeBench header). +- Renamed global variable date to jfdctint_data. +- Renamed main to jfdctint_main. +- Moved initialisation code to jfdctint_init +- Implemented new main function according to TACLeBench guidlines. +- Implemented new function jfdctint_return, calculates checksum over + all data. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - Operators within expressions shall be preceded and followed by one + whitespace + +2016-02-03: +- Removed all PROFILINGs. +- Macro types replaced by actual types: + - Replaced INT32 with int. + - Replaced DCTELEM with int. +- Removed macros: + - GLOBAL (useless) + - Unused "FIX_... FIX(..)" definitions (unused) + - BITS_IN_JSAMPLE (used in #ifdef...#else..., keep only #if part) + - SHIFT_TEMPS (empty) + - JPEG_INTERNALS (unused) + - MULTIPLY (simply multiply *) + - ONE (used only once) + - RIGHT_SHIFT (used only once) + +2016-04-05: +- Return '0' on success + +2016-04-06: +- Fixed generation of return value + +2016-04-21: +- Fixed checksum value +- Fixed license + +2016-06-01: +- Changed all prefixes to lower-case +- Changed return type of jfdctint_main + +2016-06-08: +- Prefix +- removed return from jfdctint_main diff --git a/targets/wasm-tacle/kernel/jfdctint/README b/targets/wasm-tacle/kernel/jfdctint/README new file mode 100755 index 0000000..fa69a18 --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/README @@ -0,0 +1,383 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 6a of 7-Feb-96 +================================= + +This distribution contains the sixth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +Serious users of this software (particularly those incorporating it into +larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to +our electronic mailing list. Mailing list members are notified of updates +and have a chance to participate in technical discussions, etc. + +This software is the work of Tom Lane, Philip Gladstone, Luis Ortiz, Jim +Boucher, Lee Crocker, Julian Minguillon, George Phillips, Davide Rossi, +Ge' Weijers, and other members of the Independent JPEG Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +RELATED SOFTWARE Other stuff you should get. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.doc How to configure and install the IJG software. + usage.doc Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.doc). + wizard.doc Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.doc How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.doc Overview of the JPEG library's internal structure. + filelist.doc Road map of IJG files. + coderules.doc Coding style rules --- please read if you contribute code. + +Please read at least the files install.doc and usage.doc. Useful information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image compression and +decompression. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. JPEG is intended for compressing +"real-world" scenes; line drawings, cartoons and other non-realistic images +are not its strong suit. JPEG is lossy, meaning that the output image is not +exactly identical to the input image. Hence you must not use JPEG if you +have to have identical output bits. However, on typical photographic images, +very good compression levels can be obtained with no visible change, and +remarkably high compression levels are possible if you can tolerate a +low-quality image. For more details, see the references, or just experiment +with various compression settings. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +For legal reasons, we are not distributing code for the arithmetic-coding +variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting +the hierarchical or lossless processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. We have also included +"jpegtran", a utility for lossless transcoding between different JPEG +processes, and "rdjpgcom" and "wrjpgcom", two simple applications for +inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1996, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The configuration script "configure" was produced with GNU Autoconf. It +is copyright by the Free Software Foundation but is freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +WARNING: Unisys has begun to enforce their patent on LZW compression against +GIF encoders and decoders. You will need a license from Unisys to use the +included rdgif.c or wrgif.c files in a commercial or shareware application. +At this time, Unisys is not enforcing their patent against freeware, so +distribution of this package remains legal. However, we intend to remove +GIF support from the IJG package as soon as a suitable replacement format +becomes reasonably popular. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We highly recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article +is available at ftp.uu.net, graphics/jpeg/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and +IEEE, and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson, published by M&T Books (Redwood +City, CA), 1991, ISBN 1-55851-216-0. This book provides good explanations and +example C code for a multitude of compression methods including JPEG. It is +an excellent source if you are comfortable reading C code but don't know much +about data compression in general. The book's JPEG sample code is far from +industrial-strength, but when you are ready to look at a full implementation, +you've got one here... + +The best full description of JPEG is the textbook "JPEG Still Image Data +Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published +by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. +The book includes the complete text of the ISO JPEG standards (DIS 10918-1 +and draft DIS 10918-2). This is by far the most complete exposition of JPEG +in existence, and we highly recommend it. + +The JPEG standard itself is not available electronically; you must order a +paper copy through ISO or ITU. (Unless you feel a need to own a certified +official copy, we recommend buying the Pennebaker and Mitchell book instead; +it's much cheaper and includes a great deal of useful explanatory material.) +In the USA, copies of the standard may be ordered from ANSI Sales at (212) +642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI +doesn't take credit card orders, but Global does.) It's not cheap: as of +1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% +shipping/handling. The standard is divided into two parts, Part 1 being the +actual specification, while Part 2 covers compliance testing methods. Part 1 +is titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. + +Extensions to the original JPEG standard are defined in JPEG Part 3, a new ISO +document. Part 3 is undergoing ISO balloting and is expected to be approved +by the end of 1995; it will have document numbers ISO/IEC IS 10918-3, ITU-T +T.84. IJG currently does not support any Part 3 extensions. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. A copy of the JFIF spec is available from: + Literature Department + C-Cube Microsystems, Inc. + 1778 McCarthy Blvd. + Milpitas, CA 95035 + phone (408) 944-6300, fax (408) 944-6314 +A PostScript version of this document is available at ftp.uu.net, file +graphics/jpeg/jfif.ps.gz. It can also be obtained by e-mail from the C-Cube +mail server, netlib@c3.pla.ca.us. Send the message "send jfif_ps from jpeg" +to the server to obtain the JFIF document; send the message "help" if you have +trouble. + +The TIFF 6.0 file format specification can be obtained by FTP from sgi.com +(192.48.153.1), file graphics/tiff/TIFF6.ps.Z; or you can order a printed +copy from Aldus Corp. at (206) 628-6593. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from sgi.com or +from ftp.uu.net:/graphics/jpeg/. It is expected that the next revision of +the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. libtiff is available +from sgi.com:/graphics/tiff/. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is ftp.uu.net (Internet +address 192.48.96.9). The most recent released version can always be found +there in directory graphics/jpeg. This particular version will be archived +as graphics/jpeg/jpegsrc.v6a.tar.gz. If you are on the Internet, you +can retrieve files from ftp.uu.net by standard anonymous FTP. If you don't +have FTP access, UUNET's archives are also available via UUCP; contact +help@uunet.uu.net for information on retrieving files that way. + +Numerous Internet sites maintain copies of the UUNET files. However, only +ftp.uu.net is guaranteed to have the latest official version. + +You can also obtain this software in DOS-compatible "zip" archive format from +the SimTel archives (ftp.coast.net:/SimTel/msdos/graphics/), or on CompuServe +in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 "JPEG Tools". +Again, these versions may sometimes lag behind the ftp.uu.net release. + +The JPEG FAQ (Frequently Asked Questions) article is a useful source of +general information about JPEG. It is updated constantly and therefore is +not included in this distribution. The FAQ is posted every two weeks to +Usenet newsgroups comp.graphics.misc, news.answers, and other groups. +You can always obtain the latest version from the news.answers archive at +rtfm.mit.edu. By FTP, fetch /pub/usenet/news.answers/jpeg-faq/part1 and +.../part2. If you don't have FTP, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +RELATED SOFTWARE +================ + +Numerous viewing and image manipulation programs now support JPEG. (Quite a +few of them use this library to do so.) The JPEG FAQ described above lists +some of the more popular free and shareware viewers, and tells where to +obtain them on Internet. + +If you are on a Unix machine, we highly recommend Jef Poskanzer's free +PBMPLUS image software, which provides many useful operations on PPM-format +image files. In particular, it can convert PPM images to and from a wide +range of other formats. You can obtain this package by FTP from ftp.x.org +(contrib/pbmplus*.tar.Z) or ftp.ee.lbl.gov (pbmplus*.tar.Z). There is also +a newer update of this package called NETPBM, available from +wuarchive.wustl.edu under directory /graphics/graphics/packages/NetPBM/. +Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software +is; you are likely to have difficulty making it work on any non-Unix machine. + +A different free JPEG implementation, written by the PVRG group at Stanford, +is available from havefun.stanford.edu in directory pub/jpeg. This program +is designed for research and experimentation rather than production use; +it is slower, harder to use, and less portable than the IJG code, but it +is easier to read and modify. Also, the PVRG code supports lossless JPEG, +which we do not. + + +FILE FORMAT WARS +================ + +Some JPEG programs produce files that are not compatible with our library. +The root of the problem is that the ISO JPEG committee failed to specify a +concrete file format. Some vendors "filled in the blanks" on their own, +creating proprietary formats that no one else could read. (For example, none +of the early commercial JPEG implementations for the Macintosh were able to +exchange compressed files.) + +The file format we have adopted is called JFIF (see REFERENCES). This format +has been agreed to by a number of major commercial JPEG vendors, and it has +become the de facto standard. JFIF is a minimal or "low end" representation. +We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF +Technical Note #2) for "high end" applications that need to record a lot of +additional data about an image. TIFF/JPEG is fairly new and not yet widely +supported, unfortunately. + +The upcoming JPEG Part 3 standard defines a file format called SPIFF. +SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should +be able to read the most common variant of SPIFF. SPIFF has some technical +advantages over JFIF, but its major claim to fame is simply that it is an +official standard rather than an informal one. At this point it is unclear +whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto +standard. IJG intends to support SPIFF once the standard is frozen, but we +have not decided whether it should become our default output format or not. +(In any case, our decoder will remain capable of reading JFIF indefinitely.) + +Various proprietary file formats incorporating JPEG compression also exist. +We have little or no sympathy for the existence of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, open format standards for JPEG files. Don't +use a proprietary file format! + + +TO DO +===== + +In future versions, we are considering supporting some of the upcoming JPEG +Part 3 extensions --- principally, variable quantization and the SPIFF file +format. + +Tuning the software for better behavior at low quality/high compression +settings is also of interest. The current method for scaling the +quantization tables is known not to be very good at low Q values. + +As always, speeding things up is high on our priority list. + +Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wasm b/targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wasm new file mode 100755 index 0000000000000000000000000000000000000000..d10a43d754786319e556b25f7c2faea322c29fff GIT binary patch literal 2141 zcmbuAKWy7Z6vp52pD0nX6gdt8bUAZ!W7u$tqD8je(xQ7i)0A{pMNy1c))K4hS1wum-?}h4lA=mHWalI=mA`eFe@t&Sg>8al2i=?=;-R zbt3ME^%zKj2T9cLhOHn0P3yR=0Q7>BCVT^De;U2Y-aD5)sPbjdh?`092P_m$a_ye|?DT<6$&(?&rn@PHq3=t2rI45J%v-6%^ z5bAcOT2d{Fcq5BTGM@45vXFK%sUoE_A|7RNRmQWPeb%$*+Du74Qh?@YfzEl8K&L7t zZ81EP8f`HucIQ){4Mpi3CG5vp-=l=i(lc$_@NARL(4x#0gD-gOr(eMr!!g+}R|dYg z>M^S)pI@PQs;jW`%0hVEcRW>a=uKyqwB@I0QLv%mhX~8%kgub7^&AQo7?#n3V1v z&pvL_#FVK?=`s{EBxNn^R`JbP-=VY@j%k^=mb>L9RqH*#_^pD7+(LSyV={O65vg3w|bA z;C497l)SY@JrQkcS++9rtpQc+kIu9|l6Q7GrHuEB)|d36Ks`Sdye@A#^65@1_QT8C zw3H+JpzCV4cS?Z!FdNr1)j6 z7bHDe_uZgby?AN);_}CI;e(Z4Du4Jsd|po6sL2y&jk{uGJk}Nqot~exzIOc{Uo3Ze liCgpeQqvD>t{*R!BfiEX9@P0#((m$k(TrQoV2OW|`~wBxLlgi2 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wat b/targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wat new file mode 100644 index 0000000..d4566fa --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/generated/default/jfdctint.wat @@ -0,0 +1,679 @@ +(module $jfdctint.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $jfdctint_return (type 2) (result i32) + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const -1 + i32.const 0 + i32.const 0 + i32.load offset=1276 + i32.const 0 + i32.load offset=1272 + i32.const 0 + i32.load offset=1268 + i32.const 0 + i32.load offset=1264 + i32.const 0 + i32.load offset=1260 + i32.const 0 + i32.load offset=1256 + i32.const 0 + i32.load offset=1252 + i32.const 0 + i32.load offset=1248 + i32.const 0 + i32.load offset=1244 + i32.const 0 + i32.load offset=1240 + i32.const 0 + i32.load offset=1236 + i32.const 0 + i32.load offset=1232 + i32.const 0 + i32.load offset=1228 + i32.const 0 + i32.load offset=1224 + i32.const 0 + i32.load offset=1220 + i32.const 0 + i32.load offset=1216 + i32.const 0 + i32.load offset=1212 + i32.const 0 + i32.load offset=1208 + i32.const 0 + i32.load offset=1204 + i32.const 0 + i32.load offset=1200 + i32.const 0 + i32.load offset=1196 + i32.const 0 + i32.load offset=1192 + i32.const 0 + i32.load offset=1188 + i32.const 0 + i32.load offset=1184 + i32.const 0 + i32.load offset=1180 + i32.const 0 + i32.load offset=1176 + i32.const 0 + i32.load offset=1172 + i32.const 0 + i32.load offset=1168 + i32.const 0 + i32.load offset=1164 + i32.const 0 + i32.load offset=1160 + i32.const 0 + i32.load offset=1156 + i32.const 0 + i32.load offset=1152 + i32.const 0 + i32.load offset=1148 + i32.const 0 + i32.load offset=1144 + i32.const 0 + i32.load offset=1140 + i32.const 0 + i32.load offset=1136 + i32.const 0 + i32.load offset=1132 + i32.const 0 + i32.load offset=1128 + i32.const 0 + i32.load offset=1124 + i32.const 0 + i32.load offset=1120 + i32.const 0 + i32.load offset=1116 + i32.const 0 + i32.load offset=1112 + i32.const 0 + i32.load offset=1108 + i32.const 0 + i32.load offset=1104 + i32.const 0 + i32.load offset=1100 + i32.const 0 + i32.load offset=1096 + i32.const 0 + i32.load offset=1092 + i32.const 0 + i32.load offset=1088 + i32.const 0 + i32.load offset=1084 + i32.const 0 + i32.load offset=1080 + i32.const 0 + i32.load offset=1076 + i32.const 0 + i32.load offset=1072 + i32.const 0 + i32.load offset=1068 + i32.const 0 + i32.load offset=1064 + i32.const 0 + i32.load offset=1060 + i32.const 0 + i32.load offset=1056 + i32.const 0 + i32.load offset=1052 + i32.const 0 + i32.load offset=1048 + i32.const 0 + i32.load offset=1044 + i32.const 0 + i32.load offset=1040 + i32.const 0 + i32.load offset=1036 + i32.const 0 + i32.load offset=1032 + i32.const 0 + i32.load offset=1028 + i32.const 0 + i32.load offset=1024 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 1668124 + i32.ne + select) + (func $jfdctint_jpeg_fdct_islow (type 1) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 8 + i32.const 8 + call $__pragma_loopbound + i32.const -256 + local.set 0 + loop ;; label = @1 + local.get 0 + i32.const 1296 + i32.add + local.tee 1 + local.get 1 + i32.load + local.tee 1 + local.get 0 + i32.const 1292 + i32.add + local.tee 2 + i32.load + local.tee 3 + i32.add + local.tee 4 + local.get 0 + i32.const 1308 + i32.add + local.tee 5 + i32.load + local.tee 6 + local.get 0 + i32.const 1280 + i32.add + local.tee 7 + i32.load + local.tee 8 + i32.add + local.tee 9 + i32.add + local.tee 10 + local.get 0 + i32.const 1300 + i32.add + local.tee 11 + i32.load + local.tee 12 + local.get 0 + i32.const 1288 + i32.add + local.tee 13 + i32.load + local.tee 14 + i32.add + local.tee 15 + local.get 0 + i32.const 1304 + i32.add + local.tee 16 + i32.load + local.tee 17 + local.get 0 + i32.const 1284 + i32.add + local.tee 18 + i32.load + local.tee 19 + i32.add + local.tee 20 + i32.add + local.tee 21 + i32.sub + i32.const 2 + i32.shl + i32.store + local.get 7 + local.get 10 + local.get 21 + i32.add + i32.const 2 + i32.shl + i32.store + local.get 5 + local.get 3 + local.get 1 + i32.sub + local.tee 1 + local.get 8 + local.get 6 + i32.sub + local.tee 3 + i32.add + i32.const -7373 + i32.mul + i32.const 1024 + i32.add + local.tee 7 + local.get 1 + i32.const 2446 + i32.mul + i32.add + local.get 1 + local.get 19 + local.get 17 + i32.sub + local.tee 6 + i32.add + local.tee 8 + local.get 14 + local.get 12 + i32.sub + local.tee 1 + local.get 3 + i32.add + local.tee 10 + i32.add + i32.const 9633 + i32.mul + local.tee 12 + local.get 8 + i32.const -16069 + i32.mul + i32.add + local.tee 8 + i32.add + i32.const 11 + i32.shr_s + i32.store + local.get 16 + local.get 9 + local.get 4 + i32.sub + local.tee 4 + local.get 20 + local.get 15 + i32.sub + local.tee 5 + i32.add + i32.const 4433 + i32.mul + i32.const 1024 + i32.add + local.tee 9 + local.get 5 + i32.const -15137 + i32.mul + i32.add + i32.const 11 + i32.shr_s + i32.store + local.get 13 + local.get 9 + local.get 4 + i32.const 6270 + i32.mul + i32.add + i32.const 11 + i32.shr_s + i32.store + local.get 11 + local.get 1 + local.get 6 + i32.add + i32.const -20995 + i32.mul + i32.const 1024 + i32.add + local.tee 4 + local.get 1 + i32.const 16819 + i32.mul + i32.add + local.get 12 + local.get 10 + i32.const -3196 + i32.mul + i32.add + local.tee 1 + i32.add + i32.const 11 + i32.shr_s + i32.store + local.get 2 + local.get 4 + local.get 6 + i32.const 25172 + i32.mul + i32.add + local.get 8 + i32.add + i32.const 11 + i32.shr_s + i32.store + local.get 18 + local.get 7 + local.get 3 + i32.const 12299 + i32.mul + i32.add + local.get 1 + i32.add + i32.const 11 + i32.shr_s + i32.store + local.get 0 + i32.const 32 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + i32.const -32 + local.set 0 + loop ;; label = @1 + local.get 0 + i32.const 1184 + i32.add + local.tee 1 + local.get 1 + i32.load + local.tee 1 + local.get 0 + i32.const 1152 + i32.add + local.tee 2 + i32.load + local.tee 3 + i32.add + local.tee 4 + local.get 0 + i32.const 1280 + i32.add + local.tee 5 + i32.load + local.tee 6 + local.get 0 + i32.const 1056 + i32.add + local.tee 7 + i32.load + local.tee 8 + i32.add + local.tee 9 + i32.add + local.tee 10 + local.get 0 + i32.const 1216 + i32.add + local.tee 11 + i32.load + local.tee 12 + local.get 0 + i32.const 1120 + i32.add + local.tee 13 + i32.load + local.tee 14 + i32.add + local.tee 15 + local.get 0 + i32.const 1248 + i32.add + local.tee 16 + i32.load + local.tee 17 + local.get 0 + i32.const 1088 + i32.add + local.tee 18 + i32.load + local.tee 19 + i32.add + local.tee 20 + i32.add + local.tee 21 + i32.sub + i32.const 2 + i32.add + i32.const 2 + i32.shr_s + i32.store + local.get 7 + local.get 21 + local.get 10 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_s + i32.store + local.get 5 + local.get 3 + local.get 1 + i32.sub + local.tee 1 + local.get 8 + local.get 6 + i32.sub + local.tee 3 + i32.add + i32.const -7373 + i32.mul + i32.const 16384 + i32.add + local.tee 7 + local.get 1 + i32.const 2446 + i32.mul + i32.add + local.get 1 + local.get 19 + local.get 17 + i32.sub + local.tee 6 + i32.add + local.tee 8 + local.get 14 + local.get 12 + i32.sub + local.tee 1 + local.get 3 + i32.add + local.tee 10 + i32.add + i32.const 9633 + i32.mul + local.tee 12 + local.get 8 + i32.const -16069 + i32.mul + i32.add + local.tee 8 + i32.add + i32.const 15 + i32.shr_s + i32.store + local.get 16 + local.get 9 + local.get 4 + i32.sub + local.tee 4 + local.get 20 + local.get 15 + i32.sub + local.tee 5 + i32.add + i32.const 4433 + i32.mul + i32.const 16384 + i32.add + local.tee 9 + local.get 5 + i32.const -15137 + i32.mul + i32.add + i32.const 15 + i32.shr_s + i32.store + local.get 13 + local.get 9 + local.get 4 + i32.const 6270 + i32.mul + i32.add + i32.const 15 + i32.shr_s + i32.store + local.get 11 + local.get 1 + local.get 6 + i32.add + i32.const -20995 + i32.mul + i32.const 16384 + i32.add + local.tee 4 + local.get 1 + i32.const 16819 + i32.mul + i32.add + local.get 12 + local.get 10 + i32.const -3196 + i32.mul + i32.add + local.tee 1 + i32.add + i32.const 15 + i32.shr_s + i32.store + local.get 2 + local.get 4 + local.get 6 + i32.const 25172 + i32.mul + i32.add + local.get 8 + i32.add + i32.const 15 + i32.shr_s + i32.store + local.get 18 + local.get 7 + local.get 3 + i32.const 12299 + i32.mul + i32.add + local.get 1 + i32.add + i32.const 15 + i32.shr_s + i32.store + local.get 0 + i32.const 4 + i32.add + local.tee 0 + br_if 0 (;@1;) + end) + (func $jfdctint_main (type 1) + call $jfdctint_jpeg_fdct_islow) + (func $__original_main (type 2) (result i32) + (local i32 i32) + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 1 + local.set 0 + i32.const -256 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 1280 + i32.add + local.get 0 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 65535 + i32.rem_s + local.tee 0 + i32.store + local.get 1 + i32.const 1284 + i32.add + local.get 0 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 65535 + i32.rem_s + local.tee 0 + i32.store + local.get 1 + i32.const 8 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + call $jfdctint_main + call $jfdctint_return) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5376)) + (global (;1;) i32 (i32.const 1280)) + (global (;2;) i32 (i32.const 5376)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $jfdctint_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/default/jfdctint.c b/targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/default/jfdctint.c new file mode 100644 index 0000000..d427a1e --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/default/jfdctint.c @@ -0,0 +1,314 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jfdctint + + Author: Thomas G. Lane, Public domain JPEG source code. + Modified by Steven Li at Princeton University. + + Function: JPEG slow-but-accurate integer implementation of the + forward DCT (Discrete Cosine Transform) on a 8x8 + pixel block [from original file documentations] + + Copyright (C) 1991-1994, Thomas G. Lane. + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains a slow-but-accurate integer implementation of the + forward DCT (Discrete Cosine Transform). + + A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + on each column. Direct algorithms are also available, but they are + much more complex and seem not to be any faster when reduced to code. + + This implementation is based on an algorithm described in + C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + The primary algorithm described there uses 11 multiplies and 29 adds. + We use their alternate method with 12 multiplies and 32 adds. + The advantage of this method is that no data path contains more than one + multiplication; this allows a very simple and accurate implementation in + scaled fixed-point arithmetic, with a minimal number of shifts. + + Source: SNU-RT Benchmark Suite for Worst Case Timing Analysis + Collected and Modified by S.-S. Lim + Real-Time Research Group + Seoul National University + + Changes: Moved initialisation code from jfdctint_main() to jfdctint_init(), + added checksum calculation in jfdctint_return() + + License: see README + +*/ + +/* COMMENTS: Long calculation sequences (i.e., long basic blocks), */ +/* single-nested loops. */ + +/********************************************************************** + Functions to be timed +***********************************************************************/ + +/* This definitions are added by Steven Li so as to bypass the header + files. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define DCTSIZE 8 +#define DESCALE(x, n) (((x) + (((int) 1) << ((n) - 1))) >> (n)) + +/* + The poop on this scaling stuff is as follows: + + Each 1-D DCT step produces outputs which are a factor of sqrt(N) + larger than the true DCT outputs. The final outputs are therefore + a factor of N larger than desired; since N=8 this can be cured by + a simple right shift at the end of the algorithm. The advantage of + this arrangement is that we save two multiplications per 1-D DCT, + because the y0 and y4 outputs need not be divided by sqrt(N). + In the IJG code, this factor of 8 is removed by the quantization step + (in jcdctmgr.c), NOT in this module. + + We have to do addition and subtraction of the integer inputs, which + is no problem, and multiplication by fractional constants, which is + a problem to do in integer arithmetic. We multiply all the constants + by CONST_SCALE and convert them to integer constants (thus retaining + CONST_BITS (13) bits of precision in the constants). After doing a + multiplication we have to divide the product by CONST_SCALE, with proper + rounding, to produce the correct output. This division can be done + cheaply as a right shift of CONST_BITS (13) bits. We postpone shifting + as long as possible so that partial sums can be added together with + full fractional precision. + + The outputs of the first pass are scaled up by PASS1_BITS (2) bits so that + they are represented to better-than-integral precision. These outputs + require BITS_IN_JSAMPLE (8) + PASS1_BITS (2) + 3 bits; this fits in a + 16-bit word with the recommended scaling. (For 12-bit sample data, the + intermediate array is int anyway.) + + To avoid overflow of the 32-bit intermediate results in pass 2, we must + have BITS_IN_JSAMPLE (8) + CONST_BITS (13) + PASS1_BITS (2) <= 26. + Error analysis shows that the values given below are the most effective. +*/ + +/* + Forward declaration of functions +*/ + +void jfdctint_init(); +int jfdctint_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +jfdctint_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +#define CONST_BITS 13 +#define PASS1_BITS 2 + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + causing a lot of useless floating-point operations at run time. + To get around this we use the following pre-calculated constants. + If you change CONST_BITS you may want to add appropriate values. + (With a reasonable C compiler, you can just rely on the FIX() macro...) +*/ + +#define FIX_0_298631336 ((int) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((int) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((int) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((int) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((int) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((int) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((int) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((int) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((int) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((int) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((int) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((int) 25172) /* FIX(3.072711026) */ + +/* Multiply an int variable by an int constant to yield an int result. + For 8-bit samples with the recommended scaling, all the variable + and constant values involved are no more than 16 bits wide, so a + 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + For 12-bit samples, a full 32-bit multiplication will be needed. +*/ + +int jfdctint_data[64]; + +const int jfdctint_CHECKSUM = 1668124; + +void +jfdctint_init() { + int i, seed; + + /* Worst case settings */ + /* Set array to random values */ + seed = 1; + + __pragma_loopbound(64, 64); + for (i = 0; i < 64; i++) { + seed = ((seed * 133) + 81) % 65535; + jfdctint_data[i] = seed; + } +} + +int +jfdctint_return() { + int checksum = 0; + int i; + __pragma_loopbound(64, 64); + for (i = 0; i < 64; ++i) + checksum += jfdctint_data[i]; + return ((checksum == jfdctint_CHECKSUM) ? 0 : -1); +} + +/* + Perform the forward DCT on one block of samples. +*/ + +void +jfdctint_jpeg_fdct_islow(void) { + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int tmp10, tmp11, tmp12, tmp13; + int z1, z2, z3, z4, z5; + int *dataptr; + int ctr; + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = jfdctint_data; + __pragma_loopbound(8, 8); + for (ctr = DCTSIZE - 1; ctr >= 0; ctr--) { + + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = (int) ((tmp10 + tmp11) << PASS1_BITS); + dataptr[4] = (int) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = (tmp12 + tmp13) * FIX_0_541196100; + dataptr[2] = (int) DESCALE(z1 + tmp13 * FIX_0_765366865, + CONST_BITS - PASS1_BITS); + dataptr[6] = (int) DESCALE(z1 + tmp12 * (-FIX_1_847759065), + CONST_BITS - PASS1_BITS); + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = (z3 + z4) * FIX_1_175875602; /* sqrt(2) * c3 */ + + tmp4 = tmp4 * FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = tmp5 * FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = tmp6 * FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = tmp7 * FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = z1 * (-FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = z2 * (-FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = z3 * (-FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = z4 * (-FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[7] = (int) DESCALE(tmp4 + z1 + z3, CONST_BITS - PASS1_BITS); + dataptr[5] = (int) DESCALE(tmp5 + z2 + z4, CONST_BITS - PASS1_BITS); + dataptr[3] = (int) DESCALE(tmp6 + z2 + z3, CONST_BITS - PASS1_BITS); + dataptr[1] = (int) DESCALE(tmp7 + z1 + z4, CONST_BITS - PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + dataptr = jfdctint_data; + __pragma_loopbound(8, 8); + for (ctr = DCTSIZE - 1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE * 0] + dataptr[DCTSIZE * 7]; + tmp7 = dataptr[DCTSIZE * 0] - dataptr[DCTSIZE * 7]; + tmp1 = dataptr[DCTSIZE * 1] + dataptr[DCTSIZE * 6]; + tmp6 = dataptr[DCTSIZE * 1] - dataptr[DCTSIZE * 6]; + tmp2 = dataptr[DCTSIZE * 2] + dataptr[DCTSIZE * 5]; + tmp5 = dataptr[DCTSIZE * 2] - dataptr[DCTSIZE * 5]; + tmp3 = dataptr[DCTSIZE * 3] + dataptr[DCTSIZE * 4]; + tmp4 = dataptr[DCTSIZE * 3] - dataptr[DCTSIZE * 4]; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE * 0] = (int) DESCALE(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE * 4] = (int) DESCALE(tmp10 - tmp11, PASS1_BITS); + + z1 = (tmp12 + tmp13) * FIX_0_541196100; + dataptr[DCTSIZE * 2] = (int) DESCALE(z1 + tmp13 * FIX_0_765366865, + CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 6] = (int) DESCALE(z1 + tmp12 * (-FIX_1_847759065), + CONST_BITS + PASS1_BITS); + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = (z3 + z4) * FIX_1_175875602; /* sqrt(2) * c3 */ + + tmp4 = tmp4 * FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = tmp5 * FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = tmp6 * FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = tmp7 * FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = z1 * (-FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = z2 * (-FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = z3 * (-FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = z4 * (-FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[DCTSIZE * 7] = + (int) DESCALE(tmp4 + z1 + z3, CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 5] = + (int) DESCALE(tmp5 + z2 + z4, CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 3] = + (int) DESCALE(tmp6 + z2 + z3, CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 1] = + (int) DESCALE(tmp7 + z1 + z4, CONST_BITS + PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +/* Main function + Time to function execution time using logic analyzer, + which measures the OFF time of a LED on board. + + The switching latency, including the function call/return time, + is measured to be equal to 1.1us (22 clock cycles). +*/ +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +jfdctint_main(void) { + jfdctint_jpeg_fdct_islow(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + jfdctint_init(); + jfdctint_main(); + + return (jfdctint_return()); +} diff --git a/targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/inline/jfdctint.c b/targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/inline/jfdctint.c new file mode 100644 index 0000000..493bb8f --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/generated/modified_sources/inline/jfdctint.c @@ -0,0 +1,322 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jfdctint + + Author: Thomas G. Lane, Public domain JPEG source code. + Modified by Steven Li at Princeton University. + + Function: JPEG slow-but-accurate integer implementation of the + forward DCT (Discrete Cosine Transform) on a 8x8 + pixel block [from original file documentations] + + Copyright (C) 1991-1994, Thomas G. Lane. + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains a slow-but-accurate integer implementation of the + forward DCT (Discrete Cosine Transform). + + A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + on each column. Direct algorithms are also available, but they are + much more complex and seem not to be any faster when reduced to code. + + This implementation is based on an algorithm described in + C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + The primary algorithm described there uses 11 multiplies and 29 adds. + We use their alternate method with 12 multiplies and 32 adds. + The advantage of this method is that no data path contains more than one + multiplication; this allows a very simple and accurate implementation in + scaled fixed-point arithmetic, with a minimal number of shifts. + + Source: SNU-RT Benchmark Suite for Worst Case Timing Analysis + Collected and Modified by S.-S. Lim + Real-Time Research Group + Seoul National University + + Changes: Moved initialisation code from jfdctint_main() to jfdctint_init(), + added checksum calculation in jfdctint_return() + + License: see README + +*/ + +/* COMMENTS: Long calculation sequences (i.e., long basic blocks), */ +/* single-nested loops. */ + +/********************************************************************** + Functions to be timed +***********************************************************************/ + +/* This definitions are added by Steven Li so as to bypass the header + files. +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define DCTSIZE 8 +#define DESCALE(x, n) (((x) + (((int) 1) << ((n) - 1))) >> (n)) + +/* + The poop on this scaling stuff is as follows: + + Each 1-D DCT step produces outputs which are a factor of sqrt(N) + larger than the true DCT outputs. The final outputs are therefore + a factor of N larger than desired; since N=8 this can be cured by + a simple right shift at the end of the algorithm. The advantage of + this arrangement is that we save two multiplications per 1-D DCT, + because the y0 and y4 outputs need not be divided by sqrt(N). + In the IJG code, this factor of 8 is removed by the quantization step + (in jcdctmgr.c), NOT in this module. + + We have to do addition and subtraction of the integer inputs, which + is no problem, and multiplication by fractional constants, which is + a problem to do in integer arithmetic. We multiply all the constants + by CONST_SCALE and convert them to integer constants (thus retaining + CONST_BITS (13) bits of precision in the constants). After doing a + multiplication we have to divide the product by CONST_SCALE, with proper + rounding, to produce the correct output. This division can be done + cheaply as a right shift of CONST_BITS (13) bits. We postpone shifting + as long as possible so that partial sums can be added together with + full fractional precision. + + The outputs of the first pass are scaled up by PASS1_BITS (2) bits so that + they are represented to better-than-integral precision. These outputs + require BITS_IN_JSAMPLE (8) + PASS1_BITS (2) + 3 bits; this fits in a + 16-bit word with the recommended scaling. (For 12-bit sample data, the + intermediate array is int anyway.) + + To avoid overflow of the 32-bit intermediate results in pass 2, we must + have BITS_IN_JSAMPLE (8) + CONST_BITS (13) + PASS1_BITS (2) <= 26. + Error analysis shows that the values given below are the most effective. +*/ + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void jfdctint_init(); +__attribute__((always_inline)) static inline int jfdctint_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +jfdctint_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +#define CONST_BITS 13 +#define PASS1_BITS 2 + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + causing a lot of useless floating-point operations at run time. + To get around this we use the following pre-calculated constants. + If you change CONST_BITS you may want to add appropriate values. + (With a reasonable C compiler, you can just rely on the FIX() macro...) +*/ + +#define FIX_0_298631336 ((int) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((int) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((int) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((int) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((int) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((int) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((int) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((int) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((int) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((int) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((int) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((int) 25172) /* FIX(3.072711026) */ + +/* Multiply an int variable by an int constant to yield an int result. + For 8-bit samples with the recommended scaling, all the variable + and constant values involved are no more than 16 bits wide, so a + 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + For 12-bit samples, a full 32-bit multiplication will be needed. +*/ + +int jfdctint_data[64]; + +const int jfdctint_CHECKSUM = 1668124; + +__attribute__((always_inline)) static inline void +jfdctint_init() { + int i, seed; + + /* Worst case settings */ + /* Set array to random values */ + seed = 1; + + __pragma_loopbound(64, 64); + for (i = 0; i < 64; i++) { + seed = ((seed * 133) + 81) % 65535; + jfdctint_data[i] = seed; + } +} + +__attribute__((always_inline)) static inline int +jfdctint_return() { + int checksum = 0; + int i; + __pragma_loopbound(64, 64); + for (i = 0; i < 64; ++i) + checksum += jfdctint_data[i]; + return ((checksum == jfdctint_CHECKSUM) ? 0 : -1); +} + +/* + Perform the forward DCT on one block of samples. +*/ + +__attribute__((always_inline)) static inline void +jfdctint_jpeg_fdct_islow(void) { + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int tmp10, tmp11, tmp12, tmp13; + int z1, z2, z3, z4, z5; + int *dataptr; + int ctr; + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = jfdctint_data; + __pragma_loopbound(8, 8); + for (ctr = DCTSIZE - 1; ctr >= 0; ctr--) { + + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = (int) ((tmp10 + tmp11) << PASS1_BITS); + dataptr[4] = (int) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = (tmp12 + tmp13) * FIX_0_541196100; + dataptr[2] = (int) DESCALE(z1 + tmp13 * FIX_0_765366865, + CONST_BITS - PASS1_BITS); + dataptr[6] = (int) DESCALE(z1 + tmp12 * (-FIX_1_847759065), + CONST_BITS - PASS1_BITS); + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = (z3 + z4) * FIX_1_175875602; /* sqrt(2) * c3 */ + + tmp4 = tmp4 * FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = tmp5 * FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = tmp6 * FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = tmp7 * FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = z1 * (-FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = z2 * (-FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = z3 * (-FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = z4 * (-FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[7] = (int) DESCALE(tmp4 + z1 + z3, CONST_BITS - PASS1_BITS); + dataptr[5] = (int) DESCALE(tmp5 + z2 + z4, CONST_BITS - PASS1_BITS); + dataptr[3] = (int) DESCALE(tmp6 + z2 + z3, CONST_BITS - PASS1_BITS); + dataptr[1] = (int) DESCALE(tmp7 + z1 + z4, CONST_BITS - PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + dataptr = jfdctint_data; + __pragma_loopbound(8, 8); + for (ctr = DCTSIZE - 1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE * 0] + dataptr[DCTSIZE * 7]; + tmp7 = dataptr[DCTSIZE * 0] - dataptr[DCTSIZE * 7]; + tmp1 = dataptr[DCTSIZE * 1] + dataptr[DCTSIZE * 6]; + tmp6 = dataptr[DCTSIZE * 1] - dataptr[DCTSIZE * 6]; + tmp2 = dataptr[DCTSIZE * 2] + dataptr[DCTSIZE * 5]; + tmp5 = dataptr[DCTSIZE * 2] - dataptr[DCTSIZE * 5]; + tmp3 = dataptr[DCTSIZE * 3] + dataptr[DCTSIZE * 4]; + tmp4 = dataptr[DCTSIZE * 3] - dataptr[DCTSIZE * 4]; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE * 0] = (int) DESCALE(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE * 4] = (int) DESCALE(tmp10 - tmp11, PASS1_BITS); + + z1 = (tmp12 + tmp13) * FIX_0_541196100; + dataptr[DCTSIZE * 2] = (int) DESCALE(z1 + tmp13 * FIX_0_765366865, + CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 6] = (int) DESCALE(z1 + tmp12 * (-FIX_1_847759065), + CONST_BITS + PASS1_BITS); + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = (z3 + z4) * FIX_1_175875602; /* sqrt(2) * c3 */ + + tmp4 = tmp4 * FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = tmp5 * FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = tmp6 * FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = tmp7 * FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = z1 * (-FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = z2 * (-FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = z3 * (-FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = z4 * (-FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[DCTSIZE * 7] = + (int) DESCALE(tmp4 + z1 + z3, CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 5] = + (int) DESCALE(tmp5 + z2 + z4, CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 3] = + (int) DESCALE(tmp6 + z2 + z3, CONST_BITS + PASS1_BITS); + dataptr[DCTSIZE * 1] = + (int) DESCALE(tmp7 + z1 + z4, CONST_BITS + PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +/* Main function + Time to function execution time using logic analyzer, + which measures the OFF time of a LED on board. + + The switching latency, including the function call/return time, + is measured to be equal to 1.1us (22 clock cycles). +*/ +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +jfdctint_main(void) { + jfdctint_jpeg_fdct_islow(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + jfdctint_init(); + jfdctint_main(); + + return (jfdctint_return()); +} diff --git a/targets/wasm-tacle/kernel/jfdctint/jfdctint.c b/targets/wasm-tacle/kernel/jfdctint/jfdctint.c new file mode 100755 index 0000000..0e2f4fb --- /dev/null +++ b/targets/wasm-tacle/kernel/jfdctint/jfdctint.c @@ -0,0 +1,319 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jfdctint + + Author: Thomas G. Lane, Public domain JPEG source code. + Modified by Steven Li at Princeton University. + + Function: JPEG slow-but-accurate integer implementation of the + forward DCT (Discrete Cosine Transform) on a 8x8 + pixel block [from original file documentations] + + Copyright (C) 1991-1994, Thomas G. Lane. + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains a slow-but-accurate integer implementation of the + forward DCT (Discrete Cosine Transform). + + A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + on each column. Direct algorithms are also available, but they are + much more complex and seem not to be any faster when reduced to code. + + This implementation is based on an algorithm described in + C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + The primary algorithm described there uses 11 multiplies and 29 adds. + We use their alternate method with 12 multiplies and 32 adds. + The advantage of this method is that no data path contains more than one + multiplication; this allows a very simple and accurate implementation in + scaled fixed-point arithmetic, with a minimal number of shifts. + + Source: SNU-RT Benchmark Suite for Worst Case Timing Analysis + Collected and Modified by S.-S. Lim + Real-Time Research Group + Seoul National University + + Changes: Moved initialisation code from jfdctint_main() to jfdctint_init(), + added checksum calculation in jfdctint_return() + + License: see README + +*/ + + +/* COMMENTS: Long calculation sequences (i.e., long basic blocks), */ +/* single-nested loops. */ + +/********************************************************************** + Functions to be timed +***********************************************************************/ + +/* This definitions are added by Steven Li so as to bypass the header + files. +*/ + +#define DCTSIZE 8 +#define DESCALE(x,n) (((x) + (((int)1) << ((n)-1))) >> (n)) + +/* + The poop on this scaling stuff is as follows: + + Each 1-D DCT step produces outputs which are a factor of sqrt(N) + larger than the true DCT outputs. The final outputs are therefore + a factor of N larger than desired; since N=8 this can be cured by + a simple right shift at the end of the algorithm. The advantage of + this arrangement is that we save two multiplications per 1-D DCT, + because the y0 and y4 outputs need not be divided by sqrt(N). + In the IJG code, this factor of 8 is removed by the quantization step + (in jcdctmgr.c), NOT in this module. + + We have to do addition and subtraction of the integer inputs, which + is no problem, and multiplication by fractional constants, which is + a problem to do in integer arithmetic. We multiply all the constants + by CONST_SCALE and convert them to integer constants (thus retaining + CONST_BITS (13) bits of precision in the constants). After doing a + multiplication we have to divide the product by CONST_SCALE, with proper + rounding, to produce the correct output. This division can be done + cheaply as a right shift of CONST_BITS (13) bits. We postpone shifting + as long as possible so that partial sums can be added together with + full fractional precision. + + The outputs of the first pass are scaled up by PASS1_BITS (2) bits so that + they are represented to better-than-integral precision. These outputs + require BITS_IN_JSAMPLE (8) + PASS1_BITS (2) + 3 bits; this fits in a + 16-bit word with the recommended scaling. (For 12-bit sample data, the + intermediate array is int anyway.) + + To avoid overflow of the 32-bit intermediate results in pass 2, we must + have BITS_IN_JSAMPLE (8) + CONST_BITS (13) + PASS1_BITS (2) <= 26. + Error analysis shows that the values given below are the most effective. +*/ + +/* + Forward declaration of functions +*/ + +void jfdctint_init(); +int jfdctint_return(); +void jfdctint_main(); +int main( void ); + + +#define CONST_BITS 13 +#define PASS1_BITS 2 + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + causing a lot of useless floating-point operations at run time. + To get around this we use the following pre-calculated constants. + If you change CONST_BITS you may want to add appropriate values. + (With a reasonable C compiler, you can just rely on the FIX() macro...) +*/ + +#define FIX_0_298631336 ((int) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((int) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((int) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((int) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((int) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((int) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((int) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((int) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((int) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((int) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((int) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((int) 25172) /* FIX(3.072711026) */ + + +/* Multiply an int variable by an int constant to yield an int result. + For 8-bit samples with the recommended scaling, all the variable + and constant values involved are no more than 16 bits wide, so a + 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + For 12-bit samples, a full 32-bit multiplication will be needed. +*/ + + +int jfdctint_data[ 64 ]; + + +const int jfdctint_CHECKSUM = 1668124; + +void jfdctint_init() +{ + int i, seed; + + /* Worst case settings */ + /* Set array to random values */ + seed = 1; + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < 64; i++ ) { + seed = ( ( seed * 133 ) + 81 ) % 65535; + jfdctint_data[ i ] = seed; + } + +} + + +int jfdctint_return() +{ + int checksum = 0; + int i; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < 64; ++i ) + checksum += jfdctint_data[ i ]; + return ( ( checksum == jfdctint_CHECKSUM ) ? 0 : -1 ); +} + + +/* + Perform the forward DCT on one block of samples. +*/ + +void jfdctint_jpeg_fdct_islow( void ) +{ + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int tmp10, tmp11, tmp12, tmp13; + int z1, z2, z3, z4, z5; + int *dataptr; + int ctr; + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = jfdctint_data; + _Pragma( "loopbound min 8 max 8" ) + for ( ctr = DCTSIZE - 1; ctr >= 0; ctr-- ) { + + tmp0 = dataptr[ 0 ] + dataptr[ 7 ]; + tmp7 = dataptr[ 0 ] - dataptr[ 7 ]; + tmp1 = dataptr[ 1 ] + dataptr[ 6 ]; + tmp6 = dataptr[ 1 ] - dataptr[ 6 ]; + tmp2 = dataptr[ 2 ] + dataptr[ 5 ]; + tmp5 = dataptr[ 2 ] - dataptr[ 5 ]; + tmp3 = dataptr[ 3 ] + dataptr[ 4 ]; + tmp4 = dataptr[ 3 ] - dataptr[ 4 ]; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[ 0 ] = ( int ) ( ( tmp10 + tmp11 ) << PASS1_BITS ); + dataptr[ 4 ] = ( int ) ( ( tmp10 - tmp11 ) << PASS1_BITS ); + + z1 = ( tmp12 + tmp13 ) * FIX_0_541196100; + dataptr[ 2 ] = ( int ) DESCALE( z1 + tmp13 * FIX_0_765366865, + CONST_BITS - PASS1_BITS ); + dataptr[ 6 ] = ( int ) DESCALE( z1 + tmp12 * ( - FIX_1_847759065 ), + CONST_BITS - PASS1_BITS ); + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = ( z3 + z4 ) * FIX_1_175875602; /* sqrt(2) * c3 */ + + tmp4 = tmp4 * FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = tmp5 * FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = tmp6 * FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = tmp7 * FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = z1 * ( - FIX_0_899976223 ); /* sqrt(2) * (c7-c3) */ + z2 = z2 * ( - FIX_2_562915447 ); /* sqrt(2) * (-c1-c3) */ + z3 = z3 * ( - FIX_1_961570560 ); /* sqrt(2) * (-c3-c5) */ + z4 = z4 * ( - FIX_0_390180644 ); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[ 7 ] = ( int ) DESCALE( tmp4 + z1 + z3, CONST_BITS - PASS1_BITS ); + dataptr[ 5 ] = ( int ) DESCALE( tmp5 + z2 + z4, CONST_BITS - PASS1_BITS ); + dataptr[ 3 ] = ( int ) DESCALE( tmp6 + z2 + z3, CONST_BITS - PASS1_BITS ); + dataptr[ 1 ] = ( int ) DESCALE( tmp7 + z1 + z4, CONST_BITS - PASS1_BITS ); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + dataptr = jfdctint_data; + _Pragma( "loopbound min 8 max 8" ) + for ( ctr = DCTSIZE - 1; ctr >= 0; ctr-- ) { + tmp0 = dataptr[ DCTSIZE * 0 ] + dataptr[ DCTSIZE * 7 ]; + tmp7 = dataptr[ DCTSIZE * 0 ] - dataptr[ DCTSIZE * 7 ]; + tmp1 = dataptr[ DCTSIZE * 1 ] + dataptr[ DCTSIZE * 6 ]; + tmp6 = dataptr[ DCTSIZE * 1 ] - dataptr[ DCTSIZE * 6 ]; + tmp2 = dataptr[ DCTSIZE * 2 ] + dataptr[ DCTSIZE * 5 ]; + tmp5 = dataptr[ DCTSIZE * 2 ] - dataptr[ DCTSIZE * 5 ]; + tmp3 = dataptr[ DCTSIZE * 3 ] + dataptr[ DCTSIZE * 4 ]; + tmp4 = dataptr[ DCTSIZE * 3 ] - dataptr[ DCTSIZE * 4 ]; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[ DCTSIZE * 0 ] = ( int ) DESCALE( tmp10 + tmp11, PASS1_BITS ); + dataptr[ DCTSIZE * 4 ] = ( int ) DESCALE( tmp10 - tmp11, PASS1_BITS ); + + z1 = ( tmp12 + tmp13 ) * FIX_0_541196100; + dataptr[ DCTSIZE * 2 ] = ( int ) DESCALE( z1 + tmp13 * FIX_0_765366865, + CONST_BITS + PASS1_BITS ); + dataptr[ DCTSIZE * 6 ] = ( int ) DESCALE( z1 + + tmp12 * ( - FIX_1_847759065 ), + CONST_BITS + PASS1_BITS ); + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = ( z3 + z4 ) * FIX_1_175875602; /* sqrt(2) * c3 */ + + tmp4 = tmp4 * FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = tmp5 * FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = tmp6 * FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = tmp7 * FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = z1 * ( - FIX_0_899976223 ); /* sqrt(2) * (c7-c3) */ + z2 = z2 * ( - FIX_2_562915447 ); /* sqrt(2) * (-c1-c3) */ + z3 = z3 * ( - FIX_1_961570560 ); /* sqrt(2) * (-c3-c5) */ + z4 = z4 * ( - FIX_0_390180644 ); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[ DCTSIZE * 7 ] = ( int ) DESCALE( tmp4 + z1 + z3, + CONST_BITS + PASS1_BITS ); + dataptr[ DCTSIZE * 5 ] = ( int ) DESCALE( tmp5 + z2 + z4, + CONST_BITS + PASS1_BITS ); + dataptr[ DCTSIZE * 3 ] = ( int ) DESCALE( tmp6 + z2 + z3, + CONST_BITS + PASS1_BITS ); + dataptr[ DCTSIZE * 1 ] = ( int ) DESCALE( tmp7 + z1 + z4, + CONST_BITS + PASS1_BITS ); + + dataptr++; /* advance pointer to next column */ + } + +} + +/* Main function + Time to function execution time using logic analyzer, + which measures the OFF time of a LED on board. + + The switching latency, including the function call/return time, + is measured to be equal to 1.1us (22 clock cycles). +*/ +void _Pragma ( "entrypoint" ) jfdctint_main( void ) +{ + jfdctint_jpeg_fdct_islow(); +} + + +int main( void ) +{ + jfdctint_init(); + jfdctint_main(); + + return ( jfdctint_return() ); +} diff --git a/targets/wasm-tacle/kernel/lms/CMakeLists.txt b/targets/wasm-tacle/kernel/lms/CMakeLists.txt new file mode 100644 index 0000000..2a586a7 --- /dev/null +++ b/targets/wasm-tacle/kernel/lms/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(lms) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/lms.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/lms.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/lms/ChangeLog.txt b/targets/wasm-tacle/kernel/lms/ChangeLog.txt new file mode 100755 index 0000000..0e88d8b --- /dev/null +++ b/targets/wasm-tacle/kernel/lms/ChangeLog.txt @@ -0,0 +1,13 @@ +File: lms.c +Original provenience: C Algorithms for Real-Time DSP by Paul M. Embree, pp. 159,229-231 + +2016-06-16: +- The original source code from Paul M. Embree had several problems: + * Source code was copied from a copyrighted book + * Input generation used external math functions + * Thus execution time of input generation dominated total execution time + * Several arrays where uninitalised + * Output printed to stdout but was not checked for correctness + * lms() used static variables for internal state +- Completely rewritten and published with ISC license +- Replaced double constants using exponent notation by numerical constant. diff --git a/targets/wasm-tacle/kernel/lms/generated/default/lms.wasm b/targets/wasm-tacle/kernel/lms/generated/default/lms.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a918767497a4f112f0213a513f87187a53517d9d GIT binary patch literal 1997 zcma)-TZkJ~7{||64be_#ldc3Ka@PK`4S!`k;Q3v)zhl@et4asof@r2>xhW8l(ZksMXE&vKcH@tF^Ui zvyvx7RuxLAq^PupRAox2Z$NHS{?ff#oAAw~cSY?#=<}7Wa<$%)$dF+?jbRP5Rx7oP zylI<8-6~ac4MIa!#jdw%)k4K4vQjn+6{3U;F~+LoWvUs*5zDL@Yi7ferO@Y^A`$IV zSyI}{2~Idk%bS~>4q5%-*6P(G-J6%XAKWip^zL{M?~~r^$!mmPBe4!P!ms~$>-`oZ zTw+vS2FfHLLh)Z-J9|ngF&QZT>Ea8gPn7r{@7_4KQPgn&$o!+Lq{#oo=6~wLRj-1C z#2((-RyQtnbp@0yAa@<2g1Xh!eYaoA<|9OtmZfEoc%r6L9y$;qJOT75=5VZtm*}G@ zF5A50*(j!E@(S~Zsm4RSA^2SV$8+Y_@V_LR_ly^J0)g*M-G{-!?-ht_$E0;#{@;Ps zy9ZV^tkF(j@Oi~hd%?VfidaI4U#93!)2{hsxu81O-9@nm||}BG4xg6^IG+3&aHm1QG&CfkA;?0z(4B0wV$` zfl+}mfpLKe0T5sUy1=Bsl)$vWjKHkGoWQ)mg13VCx2L?tu^9`Z7;_;A<1U0?!UYY$g)lG|BA~m_ z2a_&DVakOVOuNtzGcLqo)`bC>b0GoqE+k>Wg+a);y`-IgYx*KCN=U=v%PV^?v>tFF z1DTc3Hj4pUHJ;;O?`RG7WbVLnu7 z!S66XD)bR>SO6882|6r@3LS+U7D9!#G>2)Z&|BDHVN_@^;;;xRblK;yK2&Hm>aZv( z^c!BL0cUV6vbRKtD92MFhaM%DUtUs0*aciGLo@@MDI{+xYd=K3d3Joan$%&q5NPd)cr_VR=6!{@rcXUR#bRLrtP zf`L-GvE-dA^q@-Ox6dkL=d7atdF)8ut45(xu;rfejvXax7}a`Vy-+brhIhjsrv&dc zY%_P%=p9g2Js6-wUGfevvOid>SM$xBRd3KR%AD0`Soy`Z77ahS)~wh~$d$~>dVJ6R zr9DggVD6sX&ED<3^W;F(HtXw_Z5*~tyIHpyN;*_-mh8eYv(&WG(Q?x^*Gksnda1f* emKy13-8yX5txC>Xv|BZ+kq$Hp>y<_8xcwJ=AkU!y literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/lms/generated/default/lms.wat b/targets/wasm-tacle/kernel/lms/generated/default/lms.wat new file mode 100644 index 0000000..97666c3 --- /dev/null +++ b/targets/wasm-tacle/kernel/lms/generated/default/lms.wat @@ -0,0 +1,656 @@ +(module $lms.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $lms_init (type 1) + (local i32 i32 i32 i32 f64 f64 f64 f64) + i32.const 0 + i32.const 0 + f64.load offset=1032 + f64.const -0x1.8a068e044faddp+0 (;=-1.53916;) + f64.add + f32.demote_f64 + f32.store offset=1076 + i32.const 0 + i32.const 0 + i32.store offset=1072 + i32.const 100 + i32.const 100 + call $__pragma_loopbound + i32.const -1770082073 + local.set 0 + i32.const 2 + local.set 1 + loop ;; label = @1 + local.get 1 + local.set 2 + local.get 0 + local.set 1 + loop ;; label = @2 + local.get 1 + i32.const 1103515245 + i32.mul + local.set 3 + local.get 1 + i32.const -1029531031 + i32.mul + i32.const -740551042 + i32.add + local.tee 0 + local.set 1 + local.get 3 + i32.const 12345 + i32.add + i32.const 2147483647 + i32.and + f64.convert_i32_u + f64.const 0x1p-30 (;=9.31323e-10;) + f64.mul + f64.const -0x1p+0 (;=-1;) + f64.add + local.tee 4 + local.get 4 + f64.mul + local.get 0 + i32.const 2147483647 + i32.and + f64.convert_i32_u + f64.const 0x1p-30 (;=9.31323e-10;) + f64.mul + f64.const -0x1p+0 (;=-1;) + f64.add + local.tee 5 + local.get 5 + f64.mul + f64.add + local.tee 6 + f64.const 0x1p+0 (;=1;) + f64.gt + br_if 0 (;@2;) + end + block ;; label = @2 + block ;; label = @3 + local.get 2 + i32.const 20 + i32.rem_u + local.tee 1 + i32.const 10 + i32.lt_u + br_if 0 (;@3;) + i32.const 20 + local.get 1 + i32.sub + local.get 1 + i32.const -10 + i32.add + local.get 1 + i32.const 15 + i32.gt_u + select + i32.const 3 + i32.shl + i32.const 1024 + i32.add + f64.load + f64.neg + local.set 7 + br 1 (;@2;) + end + i32.const 10 + local.get 1 + i32.sub + local.get 1 + local.get 1 + i32.const 5 + i32.gt_u + select + i32.const 3 + i32.shl + i32.const 1024 + i32.add + f64.load + local.set 7 + end + local.get 2 + i32.const 2 + i32.shl + i32.const 1072 + i32.add + f64.const 0x1p+0 (;=1;) + local.get 6 + f64.div + local.tee 6 + local.get 5 + f64.mul + local.get 7 + f64.add + f32.demote_f64 + f32.store + block ;; label = @2 + block ;; label = @3 + local.get 2 + i32.const 1 + i32.or + local.tee 3 + i32.const 20 + i32.rem_u + local.tee 1 + i32.const 10 + i32.lt_u + br_if 0 (;@3;) + i32.const 20 + local.get 1 + i32.sub + local.get 1 + i32.const -10 + i32.add + local.get 1 + i32.const 15 + i32.gt_u + select + i32.const 3 + i32.shl + i32.const 1024 + i32.add + f64.load + f64.neg + local.set 5 + br 1 (;@2;) + end + i32.const 10 + local.get 1 + i32.sub + local.get 1 + local.get 1 + i32.const 5 + i32.gt_u + select + i32.const 3 + i32.shl + i32.const 1024 + i32.add + f64.load + local.set 5 + end + local.get 3 + i32.const 2 + i32.shl + i32.const 1072 + i32.add + local.get 6 + local.get 4 + f64.mul + local.get 5 + f64.add + f32.demote_f64 + f32.store + local.get 2 + i32.const 2 + i32.add + local.set 1 + local.get 2 + i32.const 199 + i32.lt_u + br_if 0 (;@1;) + end) + (func $lms_main (type 1) + (local f32 i32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + i32.const 21 + i32.const 21 + call $__pragma_loopbound + i32.const 201 + i32.const 201 + call $__pragma_loopbound + f32.const 0x1p+1 (;=2;) + local.set 0 + i32.const -804 + local.set 1 + f32.const 0x0p+0 (;=0;) + local.set 2 + f32.const 0x0p+0 (;=0;) + local.set 3 + f32.const 0x0p+0 (;=0;) + local.set 4 + f32.const 0x0p+0 (;=0;) + local.set 5 + f32.const 0x0p+0 (;=0;) + local.set 6 + f32.const 0x0p+0 (;=0;) + local.set 7 + f32.const 0x0p+0 (;=0;) + local.set 8 + f32.const 0x0p+0 (;=0;) + local.set 9 + f32.const 0x0p+0 (;=0;) + local.set 10 + f32.const 0x0p+0 (;=0;) + local.set 11 + f32.const 0x0p+0 (;=0;) + local.set 12 + f32.const 0x0p+0 (;=0;) + local.set 13 + f32.const 0x0p+0 (;=0;) + local.set 14 + f32.const 0x0p+0 (;=0;) + local.set 15 + f32.const 0x0p+0 (;=0;) + local.set 16 + f32.const 0x0p+0 (;=0;) + local.set 17 + f32.const 0x0p+0 (;=0;) + local.set 18 + f32.const 0x0p+0 (;=0;) + local.set 19 + f32.const 0x0p+0 (;=0;) + local.set 20 + f32.const 0x0p+0 (;=0;) + local.set 21 + f32.const 0x0p+0 (;=0;) + local.set 22 + f32.const 0x0p+0 (;=0;) + local.set 23 + f32.const 0x0p+0 (;=0;) + local.set 24 + f32.const 0x0p+0 (;=0;) + local.set 25 + f32.const 0x0p+0 (;=0;) + local.set 26 + f32.const 0x0p+0 (;=0;) + local.set 27 + f32.const 0x0p+0 (;=0;) + local.set 28 + f32.const 0x0p+0 (;=0;) + local.set 29 + f32.const 0x0p+0 (;=0;) + local.set 30 + f32.const 0x0p+0 (;=0;) + local.set 31 + f32.const 0x0p+0 (;=0;) + local.set 32 + f32.const 0x0p+0 (;=0;) + local.set 33 + f32.const 0x0p+0 (;=0;) + local.set 34 + f32.const 0x0p+0 (;=0;) + local.set 35 + f32.const 0x0p+0 (;=0;) + local.set 36 + f32.const 0x0p+0 (;=0;) + local.set 37 + f32.const 0x0p+0 (;=0;) + local.set 38 + f32.const 0x0p+0 (;=0;) + local.set 39 + f32.const 0x0p+0 (;=0;) + local.set 40 + f32.const 0x0p+0 (;=0;) + local.set 41 + f32.const 0x0p+0 (;=0;) + local.set 42 + loop ;; label = @1 + local.get 1 + i32.const 1880 + i32.add + f32.load + local.set 43 + local.get 1 + i32.const 1876 + i32.add + f32.load + local.set 44 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 21 + i32.const 21 + call $__pragma_loopbound + i32.const 21 + i32.const 21 + call $__pragma_loopbound + local.get 1 + i32.const 2692 + i32.add + local.get 2 + local.get 23 + f32.mul + local.get 3 + local.get 24 + f32.mul + local.get 4 + local.get 25 + f32.mul + local.get 5 + local.get 26 + f32.mul + local.get 6 + local.get 27 + f32.mul + local.get 7 + local.get 28 + f32.mul + local.get 8 + local.get 29 + f32.mul + local.get 9 + local.get 30 + f32.mul + local.get 10 + local.get 31 + f32.mul + local.get 11 + local.get 32 + f32.mul + local.get 12 + local.get 33 + f32.mul + local.get 13 + local.get 34 + f32.mul + local.get 14 + local.get 35 + f32.mul + local.get 15 + local.get 36 + f32.mul + local.get 16 + local.get 37 + f32.mul + local.get 17 + local.get 38 + f32.mul + local.get 18 + local.get 39 + f32.mul + local.get 19 + local.get 40 + f32.mul + local.get 20 + local.get 41 + f32.mul + local.get 21 + local.get 42 + f32.mul + local.get 22 + local.get 44 + f32.mul + f32.const 0x0p+0 (;=0;) + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + local.tee 45 + f32.store + local.get 43 + local.get 45 + f32.sub + f32.const 0x1.f35268p-11 (;=0.000952381;) + f32.mul + local.get 44 + local.get 44 + f32.const 0x1.47ae14p-7 (;=0.01;) + f32.mul + f32.mul + local.get 0 + f32.const 0x1.fae148p-1 (;=0.99;) + f32.mul + f32.add + local.tee 0 + f32.div + local.tee 43 + local.get 23 + f32.mul + local.get 2 + f32.add + local.set 2 + local.get 43 + local.get 24 + f32.mul + local.get 3 + f32.add + local.set 3 + local.get 43 + local.get 25 + f32.mul + local.get 4 + f32.add + local.set 4 + local.get 43 + local.get 26 + f32.mul + local.get 5 + f32.add + local.set 5 + local.get 43 + local.get 27 + f32.mul + local.get 6 + f32.add + local.set 6 + local.get 43 + local.get 28 + f32.mul + local.get 7 + f32.add + local.set 7 + local.get 43 + local.get 29 + f32.mul + local.get 8 + f32.add + local.set 8 + local.get 43 + local.get 30 + f32.mul + local.get 9 + f32.add + local.set 9 + local.get 43 + local.get 31 + f32.mul + local.get 10 + f32.add + local.set 10 + local.get 43 + local.get 32 + f32.mul + local.get 11 + f32.add + local.set 11 + local.get 43 + local.get 33 + f32.mul + local.get 12 + f32.add + local.set 12 + local.get 43 + local.get 34 + f32.mul + local.get 13 + f32.add + local.set 13 + local.get 43 + local.get 35 + f32.mul + local.get 14 + f32.add + local.set 14 + local.get 43 + local.get 36 + f32.mul + local.get 15 + f32.add + local.set 15 + local.get 43 + local.get 37 + f32.mul + local.get 16 + f32.add + local.set 16 + local.get 43 + local.get 38 + f32.mul + local.get 17 + f32.add + local.set 17 + local.get 43 + local.get 39 + f32.mul + local.get 18 + f32.add + local.set 18 + local.get 43 + local.get 40 + f32.mul + local.get 19 + f32.add + local.set 19 + local.get 43 + local.get 41 + f32.mul + local.get 20 + f32.add + local.set 20 + local.get 43 + local.get 42 + f32.mul + local.get 21 + f32.add + local.set 21 + local.get 43 + local.get 44 + f32.mul + local.get 22 + f32.add + local.set 22 + local.get 24 + local.set 23 + local.get 25 + local.set 24 + local.get 26 + local.set 25 + local.get 27 + local.set 26 + local.get 28 + local.set 27 + local.get 29 + local.set 28 + local.get 30 + local.set 29 + local.get 31 + local.set 30 + local.get 32 + local.set 31 + local.get 33 + local.set 32 + local.get 34 + local.set 33 + local.get 35 + local.set 34 + local.get 36 + local.set 35 + local.get 37 + local.set 36 + local.get 38 + local.set 37 + local.get 39 + local.set 38 + local.get 40 + local.set 39 + local.get 41 + local.set 40 + local.get 42 + local.set 41 + local.get 44 + local.set 42 + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end) + (func $__original_main (type 2) (result i32) + (local f64 i32) + call $lms_init + call $lms_main + i32.const 201 + i32.const 201 + call $__pragma_loopbound + f64.const 0x0p+0 (;=0;) + local.set 0 + i32.const -804 + local.set 1 + loop ;; label = @1 + local.get 0 + local.get 1 + i32.const 2692 + i32.add + f32.load + f64.promote_f32 + f64.add + local.get 1 + i32.const 2696 + i32.add + f32.load + f64.promote_f32 + f64.add + local.get 1 + i32.const 2700 + i32.add + f32.load + f64.promote_f32 + f64.add + local.set 0 + local.get 1 + i32.const 12 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + block ;; label = @1 + local.get 0 + f64.const 0x1.2d2a80064a9cep+2 (;=4.70572;) + f64.add + f64.const 0x1.e848p+19 (;=1e+06;) + f64.mul + local.tee 0 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.trunc_f64_s + return + end + i32.const -2147483648) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 6800)) + (global (;1;) i32 (i32.const 2696)) + (global (;2;) i32 (i32.const 6800)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $lms_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "\00\00\00\00\00\00\00\00R\96\d5\1b\12\f8\db?\884\03\c5\a1\99\ea?\9f&\e7\bcSN\f2?\96\fa\89\9d\1b\85\f5?\c7;\7ff\9e\a0\f6?")) diff --git a/targets/wasm-tacle/kernel/lms/generated/modified_sources/default/lms.c b/targets/wasm-tacle/kernel/lms/generated/modified_sources/default/lms.c new file mode 100644 index 0000000..4791932 --- /dev/null +++ b/targets/wasm-tacle/kernel/lms/generated/modified_sources/default/lms.c @@ -0,0 +1,187 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: lms + + Author: Jörg Mische + + Function: LMS adaptive signal enhancement + + Source: Completely rewritten for TACLeBench to avoid license issues. + It has the same functionality as lms.c from the book + "C Algorithms for Real-Time DSP" by Paul M. Embree, which + has been used in WCET benchmarking for many years. + + Original name: lms.c + + Changes: Simplified generation of the input (noisy sinus wave). + No static variables. + + License: ISC (simplified BSD) + +*/ + +/* + Copyright (c) 2016 Jörg Mische + + 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. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define N 201 +#define L 20 +#define SAMPLING 5 + +float lms_input[N + 1], lms_output[N + 1]; + +/* The following table can be calculated by + for (i=0; i<=SAMPLING; i++) + lms_sintab[ k ] = sqrt(2.0) * sin(PI * i / (2*SAMPLING)); +*/ +double lms_sintab[SAMPLING + 1] = { + 0.00000000000000000, 0.43701603620715901, 0.83125389555938600, + 1.14412282743652560, 1.34499703920997637, 1.41421356237309381, +}; + +double +lms_sinus(int i) { + int s = i % (4 * SAMPLING); + if (s >= (2 * SAMPLING)) + return -lms_sintab[(s > 3 * SAMPLING) ? (4 * SAMPLING - s) + : (s - 2 * SAMPLING)]; + return lms_sintab[(s > SAMPLING) ? (2 * SAMPLING - s) : s]; +} + +void +lms_init(void) { + unsigned long seed = 1; + int k; + + lms_input[0] = 0.0; + { + double v1, v2, r; + const double scaleFactor = 0.000000000931322574615478515625; + do { + // generate two random numbers between -1.0 and +1.0 + seed = seed * 1103515245 + 12345; + v1 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + seed = seed * 1103515245 + 12345; + v2 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + r = v1 * v1 + v2 * v2; + } while (r > 1.0); + // radius < 1 + + // remap v1 and v2 to two Gaussian numbers + double noise = + 1 / r; // approximation of sqrt(0.96) * sqrt(-log(r)/r); + lms_input[1] = lms_sinus(1) + noise * v2; + } + + __pragma_loopbound(100, 100); + for (k = 2; k < N; k += 2) { + double v1, v2, r; + const double scaleFactor = 0.000000000931322574615478515625; + do { + // generate two random numbers between -1.0 and +1.0 + seed = seed * 1103515245 + 12345; + v1 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + seed = seed * 1103515245 + 12345; + v2 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + r = v1 * v1 + v2 * v2; + } while (r > 1.0); + // radius < 1 + + // remap v1 and v2 to two Gaussian numbers + double noise = + 1 / r; // approximation of sqrt(0.96) * sqrt(-log(r)/r); + lms_input[k] = lms_sinus(k) + noise * v2; + lms_input[k + 1] = lms_sinus(k + 1) + noise * v1; + } +} + +float +lms_calc(float x, float d, float b[], int l, float mu, float alpha, + float history[], float *sigma) { + int i; + + // shift history + __pragma_loopbound(20, 20); + for (i = l; i >= 1; i--) + history[i] = history[i - 1]; + history[0] = x; + + // calculate filter + float y = 0.0; + *sigma = alpha * x * x + (1 - alpha) * (*sigma); + + __pragma_loopbound(21, 21); + for (i = 0; i <= l; i++) + y += b[i] * history[i]; + + // update coefficients + float e = mu * (d - y) / (*sigma); + + __pragma_loopbound(21, 21); + for (i = 0; i <= l; i++) + b[i] += e * history[i]; + + return y; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +lms_main(void) { + int i; + float b[L + 1]; + float history[L + 1]; + float sigma = 2.0; + + __pragma_loopbound(21, 21); + for (i = 0; i <= L; i++) { + b[i] = 0.0; + history[i] = 0.0; + } + + __pragma_loopbound(201, 201); + for (i = 0; i < N; i++) { + lms_output[i] = lms_calc(lms_input[i], lms_input[i + 1], b, L, + 0.02 / (L + 1), 0.01, history, &sigma); + } +} + +int +lms_return(void) { + int i; + double sum = 0.0; + + __pragma_loopbound(201, 201); + for (i = 0; i < N; i++) { + sum += lms_output[i]; + } + + return (int) (1000000.0 * (sum + 4.705719)); + // How did this 'correct value' come to be? The previous calculation + // contained UB. correct value: -4.505242517625447362661361694336 +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main() { + lms_init(); + lms_main(); + return (lms_return()); +} diff --git a/targets/wasm-tacle/kernel/lms/generated/modified_sources/inline/lms.c b/targets/wasm-tacle/kernel/lms/generated/modified_sources/inline/lms.c new file mode 100644 index 0000000..da626da --- /dev/null +++ b/targets/wasm-tacle/kernel/lms/generated/modified_sources/inline/lms.c @@ -0,0 +1,192 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: lms + + Author: Jörg Mische + + Function: LMS adaptive signal enhancement + + Source: Completely rewritten for TACLeBench to avoid license issues. + It has the same functionality as lms.c from the book + "C Algorithms for Real-Time DSP" by Paul M. Embree, which + has been used in WCET benchmarking for many years. + + Original name: lms.c + + Changes: Simplified generation of the input (noisy sinus wave). + No static variables. + + License: ISC (simplified BSD) + +*/ + +/* + Copyright (c) 2016 Jörg Mische + + 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. +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define N 201 +#define L 20 +#define SAMPLING 5 + +float lms_input[N + 1], lms_output[N + 1]; + +/* The following table can be calculated by + for (i=0; i<=SAMPLING; i++) + lms_sintab[ k ] = sqrt(2.0) * sin(PI * i / (2*SAMPLING)); +*/ +double lms_sintab[SAMPLING + 1] = { + 0.00000000000000000, 0.43701603620715901, 0.83125389555938600, + 1.14412282743652560, 1.34499703920997637, 1.41421356237309381, +}; + +__attribute__((always_inline)) static inline double +lms_sinus(int i) { + int s = i % (4 * SAMPLING); + if (s >= (2 * SAMPLING)) + return -lms_sintab[(s > 3 * SAMPLING) ? (4 * SAMPLING - s) + : (s - 2 * SAMPLING)]; + return lms_sintab[(s > SAMPLING) ? (2 * SAMPLING - s) : s]; +} + +__attribute__((always_inline)) static inline void +lms_init(void) { + unsigned long seed = 1; + int k; + + lms_input[0] = 0.0; + { + double v1, v2, r; + const double scaleFactor = 0.000000000931322574615478515625; + do { + // generate two random numbers between -1.0 and +1.0 + seed = seed * 1103515245 + 12345; + v1 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + seed = seed * 1103515245 + 12345; + v2 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + r = v1 * v1 + v2 * v2; + } while (r > 1.0); + // radius < 1 + + // remap v1 and v2 to two Gaussian numbers + double noise = + 1 / r; // approximation of sqrt(0.96) * sqrt(-log(r)/r); + lms_input[1] = lms_sinus(1) + noise * v2; + } + + __pragma_loopbound(100, 100); + for (k = 2; k < N; k += 2) { + double v1, v2, r; + const double scaleFactor = 0.000000000931322574615478515625; + do { + // generate two random numbers between -1.0 and +1.0 + seed = seed * 1103515245 + 12345; + v1 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + seed = seed * 1103515245 + 12345; + v2 = (seed & 0x00007fffffff) * scaleFactor - 1.0; + r = v1 * v1 + v2 * v2; + } while (r > 1.0); + // radius < 1 + + // remap v1 and v2 to two Gaussian numbers + double noise = + 1 / r; // approximation of sqrt(0.96) * sqrt(-log(r)/r); + lms_input[k] = lms_sinus(k) + noise * v2; + lms_input[k + 1] = lms_sinus(k + 1) + noise * v1; + } +} + +__attribute__((always_inline)) static inline float +lms_calc(float x, float d, float b[], int l, float mu, float alpha, + float history[], float *sigma) { + int i; + + // shift history + __pragma_loopbound(20, 20); + for (i = l; i >= 1; i--) + history[i] = history[i - 1]; + history[0] = x; + + // calculate filter + float y = 0.0; + *sigma = alpha * x * x + (1 - alpha) * (*sigma); + + __pragma_loopbound(21, 21); + for (i = 0; i <= l; i++) + y += b[i] * history[i]; + + // update coefficients + float e = mu * (d - y) / (*sigma); + + __pragma_loopbound(21, 21); + for (i = 0; i <= l; i++) + b[i] += e * history[i]; + + return y; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +lms_main(void) { + int i; + float b[L + 1]; + float history[L + 1]; + float sigma = 2.0; + + __pragma_loopbound(21, 21); + for (i = 0; i <= L; i++) { + b[i] = 0.0; + history[i] = 0.0; + } + + __pragma_loopbound(201, 201); + for (i = 0; i < N; i++) { + lms_output[i] = lms_calc(lms_input[i], lms_input[i + 1], b, L, + 0.02 / (L + 1), 0.01, history, &sigma); + } +} + +__attribute__((always_inline)) static inline int +lms_return(void) { + int i; + double sum = 0.0; + + __pragma_loopbound(201, 201); + for (i = 0; i < N; i++) { + sum += lms_output[i]; + } + + return (int) (1000000.0 * (sum + 4.705719)); + // How did this 'correct value' come to be? The previous calculation + // contained UB. correct value: -4.505242517625447362661361694336 +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main() { + lms_init(); + lms_main(); + return (lms_return()); +} diff --git a/targets/wasm-tacle/kernel/lms/lms.c b/targets/wasm-tacle/kernel/lms/lms.c new file mode 100755 index 0000000..42b1929 --- /dev/null +++ b/targets/wasm-tacle/kernel/lms/lms.c @@ -0,0 +1,203 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: lms + + Author: Jörg Mische + + Function: LMS adaptive signal enhancement + + Source: Completely rewritten for TACLeBench to avoid license issues. + It has the same functionality as lms.c from the book + "C Algorithms for Real-Time DSP" by Paul M. Embree, which + has been used in WCET benchmarking for many years. + + Original name: lms.c + + Changes: Simplified generation of the input (noisy sinus wave). + No static variables. + + License: ISC (simplified BSD) + +*/ + +/* + Copyright (c) 2016 Jörg Mische + + 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 N 201 +#define L 20 +#define SAMPLING 5 + + +float lms_input[ N + 1 ], lms_output[ N + 1 ]; + + +/* The following table can be calculated by + for (i=0; i<=SAMPLING; i++) + lms_sintab[ k ] = sqrt(2.0) * sin(PI * i / (2*SAMPLING)); +*/ +double lms_sintab[ SAMPLING + 1 ] = { + 0.00000000000000000, + 0.43701603620715901, + 0.83125389555938600, + 1.14412282743652560, + 1.34499703920997637, + 1.41421356237309381, +}; + + +double lms_sinus( int i ) +{ + int s = i % ( 4 * SAMPLING ); + if ( s >= ( 2 * SAMPLING ) ) + return -lms_sintab[ ( s > 3 * SAMPLING ) ? + ( 4 * SAMPLING - s ) : ( s - 2 * SAMPLING ) ]; + return lms_sintab[ ( s > SAMPLING ) ? ( 2 * SAMPLING - s ) : s ]; +} + + +void lms_init( void ) +{ + unsigned long seed = 1; + int k; + + lms_input[ 0 ] = 0.0; + { + double v1, v2, r; + const double scaleFactor = 0.000000000931322574615478515625; + do { + // generate two random numbers between -1.0 and +1.0 + seed = seed * 1103515245 + 12345; + v1 = ( seed & 0x00007fffffff ) * scaleFactor - 1.0; + seed = seed * 1103515245 + 12345; + v2 = ( seed & 0x00007fffffff ) * scaleFactor - 1.0; + r = v1 * v1 + v2 * v2; + } while ( r > 1.0 ); + // radius < 1 + + // remap v1 and v2 to two Gaussian numbers + double noise = 1 / r; // approximation of sqrt(0.96) * sqrt(-log(r)/r); + lms_input[1] = lms_sinus(1) + noise * v2; + } + + _Pragma( "loopbound min 100 max 100" ) + for ( k = 2 ; k < N ; k += 2 ) { + double v1, v2, r; + const double scaleFactor = 0.000000000931322574615478515625; + do { + // generate two random numbers between -1.0 and +1.0 + seed = seed * 1103515245 + 12345; + v1 = ( seed & 0x00007fffffff ) * scaleFactor - 1.0; + seed = seed * 1103515245 + 12345; + v2 = ( seed & 0x00007fffffff ) * scaleFactor - 1.0; + r = v1 * v1 + v2 * v2; + } while ( r > 1.0 ); + // radius < 1 + + // remap v1 and v2 to two Gaussian numbers + double noise = 1 / r; // approximation of sqrt(0.96) * sqrt(-log(r)/r); + lms_input[ k ] = lms_sinus(k) + noise * v2; + lms_input[ k + 1 ] = lms_sinus(k + 1) + noise * v1; + } + +} + + +float lms_calc( float x, + float d, + float b[ ], + int l, + float mu, + float alpha, + float history[ ], + float *sigma ) +{ + int i; + + // shift history + _Pragma( "loopbound min 20 max 20" ) + for ( i = l ; i >= 1 ; i-- ) + history[ i ] = history[ i - 1 ]; + history[ 0 ] = x; + + // calculate filter + float y = 0.0; + *sigma = alpha * x * x + ( 1 - alpha ) * ( *sigma ); + + _Pragma( "loopbound min 21 max 21" ) + for ( i = 0 ; i <= l ; i++ ) + y += b[ i ] * history[ i ]; + + // update coefficients + float e = mu * ( d - y ) / ( *sigma ); + + _Pragma( "loopbound min 21 max 21" ) + for ( i = 0 ; i <= l ; i++ ) + b[ i ] += e * history[ i ]; + + return y; +} + + +void _Pragma( "entrypoint" ) lms_main( void ) +{ + int i; + float b[ L + 1 ]; + float history[ L + 1 ]; + float sigma = 2.0; + + _Pragma( "loopbound min 21 max 21" ) + for ( i = 0; i <= L; i++ ) { + b[ i ] = 0.0; + history[ i ] = 0.0; + } + + _Pragma( "loopbound min 201 max 201" ) + for ( i = 0 ; i < N ; i++ ) { + lms_output[ i ] = lms_calc( lms_input[ i ], + lms_input[ i + 1 ], + b, L, 0.02 / ( L + 1 ), 0.01, + history, &sigma ); + } +} + + +int lms_return( void ) +{ + int i; + double sum = 0.0; + + _Pragma( "loopbound min 201 max 201" ) + for ( i = 0 ; i < N ; i++ ) { + sum += lms_output[i]; + } + + return ( int )( 1000000.0 * ( sum + 4.705719 ) ); + // How did this 'correct value' come to be? The previous calculation contained UB. + // correct value: -4.505242517625447362661361694336 +} + + +int main() +{ + lms_init(); + lms_main(); + return ( lms_return() ); +} + diff --git a/targets/wasm-tacle/kernel/ludcmp/CMakeLists.txt b/targets/wasm-tacle/kernel/ludcmp/CMakeLists.txt new file mode 100644 index 0000000..c9f17f7 --- /dev/null +++ b/targets/wasm-tacle/kernel/ludcmp/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(ludcmp) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/ludcmp.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/ludcmp.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/ludcmp/ChangeLog.txt b/targets/wasm-tacle/kernel/ludcmp/ChangeLog.txt new file mode 100755 index 0000000..9139a43 --- /dev/null +++ b/targets/wasm-tacle/kernel/ludcmp/ChangeLog.txt @@ -0,0 +1,26 @@ +File: ludcmp.c +Original provenience: SNU-RT benchmark suite, via Mälardalen benchmark +suite, www.mrtc..... + +2015-11-27: +- Removed commented-out parameter nmax +- Made chkerr a global variable, set in the ludmp function +- Changed return value of ludcmp to void +- Renamed ludcmp to ludcmp_test, wrap call in new function ludcmp_main +- Move initialization code into new function ludcmp_init +- Compute checksum in new function ludcmp_return +- Prefix fabs and global variables with "ludcmp_" +- Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + functions, followed by main functions +- Applied code formatting with astyle as in the example + +2015-12-15: +- Sorted out licensing terms, added general TACLeBench header to + beginning of source code + +2016-03-15: +- Return 0 if checksum is as expected, -1 otherwise +- Touch input matrix with volatile to rule out optimizations +- Add entrypoint pragma + diff --git a/targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wasm b/targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wasm new file mode 100755 index 0000000000000000000000000000000000000000..496f8190dc7b9492dbe14cf97d8cc2130a4a4d0d GIT binary patch literal 3452 zcmb7HO>7%g5Pol;z5ZD{cJ0Kj)E?e59EzeuEvl#@A;?1^E!>dcyxln4;En%cub~m4 z4$wozPnBcn$!(E{IOT%cV@?Qh%8?@yNN_>w2{^UP%&zTqXbtSae*1R5H#6TiGxjp4 z+u#hYTylN8UTbbHp64+ZV~iJLSB-w3U1bcucXv776_r=b0yKpg`->k6bX(^dzFButaYBL`^8?V@FxC7UnBX&vb-U6htEZI3D^LiFw zw0f|D95Hrrd9W0iSbBuJiMU%+aY@9HNd$KbaeGs7dBl-P1otW8_NU@z5l1Ew+~9GOILw-I+R6?YbKWHQDL?vuZ-K6*BvyQ}06O{|DElg#dYHcb&?mQ2Q;ckdBH zQ*kTA5Sm1A#Oz=yj+iBr2#%ONn2IB2$s~d!W)G+0h*>g;;Px=Thf{G9^COcn?)ZR| zoTkX~Tcl*52=#*E`VeoGp;JnT<*`nZ>w)Q2Vp8Z2yoZ(el3?S;kuez$S_k4_7T6wy zwmV>J!X7*~2P!cEF()C12+=QtgAYCUNUfd;+{lEC50p6pJ>l&kL5~^0ZXh;2!kYhz zJtFKci0vcR`XAWu3Hujd0hsyEKtm!Wk%V9)%7vkmo-%;NJ>e-1M{}vh#vfX5`Er zIWzKm?Tq9u&RDKQMp&8;V*oJsRL-E&f+1|_8(W(yk59JLDVb0OnNvlvEQ{!^GAqZf z=D?Mjfzx8)sArTnAXjmotCB1zAycXh=ou-%T9)DC-d$id>Cr8+Oj`;JfL*XJW38*Q z%*zrKRHcN>!;eF0Qwa-_J_TXIX|rH1{9)F3mLN7p(S@g4at^GKl>68T1#}206(w5* zUqwv6C`OWETON_c~E-v1xn9WAmAQ4>uJ|^B`kpJ9C&Hz3pj4Jrv-Du%Hl`g2Ut$;D=AY!c|qLpjN5%-ofq~*yOVFt|dK2M*7I)Q@gL zrF&3&OwCCk8A{%eg-Q_ybESZ8tbekHZ3GjJ#s~0CX%m@}KRj+UMPPQ6i6m>t&oCzI1TQj= zy$v%Da_}H~hzPQxT7#}Nu%&~^E`@a#2AhtDll9T7`A^{QEd1d;#2Bm_ocHq|<4zvf z+y&Ef!4t*CKjwh%WBn2fl06vU4dplr{S`URqw4=8|_8>&(AkZRv5lZ*rRs|{>)bbBShP^X3ZDF8{h5vvEdEA zCB$>K-RjgfYE7qZ<3^&u8SHg^r@Cp=`-IzJOR09Jwce|`oi5M7vg&rb?)t*oHqX4X z)@%AbS*<(GjlzYc#S4p<PGoO*XY*Kx189k*F^7yRwE+nrB#Ya7i4_qzW#MfUxO literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wat b/targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wat new file mode 100644 index 0000000..ec8dbd8 --- /dev/null +++ b/targets/wasm-tacle/kernel/ludcmp/generated/default/ludcmp.wat @@ -0,0 +1,1267 @@ +(module $ludcmp.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 f64) (result i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $ludcmp_init (type 1) + (local i32 i32 i32 i32 i32 f64 f64 f64) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store offset=12 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + i32.const 6 + i32.const 6 + call $__pragma_loopbound + i32.const 0 + i64.const 4626322717216342016 + i64.store offset=1024 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.4p+4 (;=20;) + f64.add + f64.store offset=1024 + end + i32.const 0 + i64.const 4613937818241073152 + i64.store offset=1032 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.8p+1 (;=3;) + f64.add + f64.store offset=1032 + end + i32.const 0 + i64.const 4616189618054758400 + i64.store offset=1040 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1p+2 (;=4;) + f64.add + f64.store offset=1040 + end + i32.const 0 + i64.const 4617315517961601024 + i64.store offset=1048 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.4p+2 (;=5;) + f64.add + f64.store offset=1048 + end + i32.const 0 + i64.const 4618441417868443648 + i64.store offset=1056 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.8p+2 (;=6;) + f64.add + f64.store offset=1056 + end + i32.const 0 + i64.const 4619567317775286272 + i64.store offset=1064 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.cp+2 (;=7;) + f64.add + f64.store offset=1064 + end + i32.const 0 + i64.const 4631530004285489152 + i64.store offset=21024 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.68p+5 (;=45;) + f64.add + f64.store offset=21024 + end + i32.const 6 + i32.const 6 + call $__pragma_loopbound + i32.const 0 + i64.const 4613937818241073152 + i64.store offset=1424 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.8p+1 (;=3;) + f64.add + f64.store offset=1424 + end + i32.const 0 + i64.const 4630826316843712512 + i64.store offset=1432 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.4p+5 (;=40;) + f64.add + f64.store offset=1432 + end + i32.const 0 + i64.const 4617315517961601024 + i64.store offset=1440 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.4p+2 (;=5;) + f64.add + f64.store offset=1440 + end + i32.const 0 + i64.const 4618441417868443648 + i64.store offset=1448 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.8p+2 (;=6;) + f64.add + f64.store offset=1448 + end + i32.const 0 + i64.const 4619567317775286272 + i64.store offset=1456 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.cp+2 (;=7;) + f64.add + f64.store offset=1456 + end + i32.const 0 + i64.const 4620693217682128896 + i64.store offset=1464 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1p+3 (;=8;) + f64.add + f64.store offset=1464 + end + i32.const 0 + i64.const 4634555860285128704 + i64.store offset=21032 + block ;; label = @1 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.const 0x1.14p+6 (;=69;) + f64.add + f64.store offset=21032 + end + i32.const 1024 + local.set 1 + i32.const 21040 + local.set 2 + i32.const 9 + local.set 3 + loop ;; label = @1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 1 + i32.const 800 + i32.add + local.tee 4 + local.get 3 + i32.const -5 + i32.add + f64.convert_i32_u + local.tee 5 + f64.store + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.get 5 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 1 + i32.const 808 + i32.add + local.tee 4 + local.get 3 + i32.const -4 + i32.add + f64.convert_i32_u + local.tee 6 + f64.store + local.get 5 + local.get 6 + f64.add + local.set 7 + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.get 6 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 1 + i32.const 816 + i32.add + local.tee 4 + i32.const 60 + local.get 3 + i32.const -3 + i32.add + local.get 3 + i32.const 9 + i32.eq + select + f64.convert_i32_u + local.tee 5 + f64.store + local.get 7 + local.get 5 + f64.add + local.set 6 + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.get 5 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 1 + i32.const 824 + i32.add + local.tee 4 + i32.const 80 + local.get 3 + i32.const -2 + i32.add + local.get 3 + i32.const 10 + i32.eq + select + f64.convert_i32_u + local.tee 5 + f64.store + local.get 6 + local.get 5 + f64.add + local.set 6 + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.get 5 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 1 + i32.const 832 + i32.add + local.tee 4 + i32.const 100 + local.get 3 + i32.const -1 + i32.add + local.get 3 + i32.const 11 + i32.eq + select + f64.convert_i32_u + local.tee 5 + f64.store + local.get 6 + local.get 5 + f64.add + local.set 6 + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.get 5 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 1 + i32.const 840 + i32.add + local.tee 4 + i32.const 120 + local.get 3 + local.get 3 + i32.const 12 + i32.eq + select + f64.convert_i32_u + local.tee 5 + f64.store + local.get 6 + local.get 5 + f64.add + local.set 6 + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.get 5 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 2 + local.get 6 + f64.store + block ;; label = @2 + local.get 0 + i32.load offset=12 + i32.eqz + br_if 0 (;@2;) + local.get 2 + local.get 6 + local.get 0 + i32.load offset=12 + f64.convert_i32_s + f64.add + f64.store + end + local.get 2 + i32.const 8 + i32.add + local.set 2 + local.get 1 + i32.const 400 + i32.add + local.set 1 + local.get 3 + i32.const 1 + i32.add + local.tee 3 + i32.const 13 + i32.ne + br_if 0 (;@1;) + end + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $ludcmp_test (type 2) (param i32 f64) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f64 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 800 + i32.sub + local.tee 2 + global.set $__stack_pointer + i32.const 999 + local.set 3 + block ;; label = @1 + local.get 0 + i32.const 99 + i32.gt_s + br_if 0 (;@1;) + local.get 1 + f64.const 0x0p+0 (;=0;) + f64.le + br_if 0 (;@1;) + i32.const 5 + i32.const 5 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + local.tee 4 + br_if 0 (;@2;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 5 + local.get 0 + i32.const 1 + i32.and + local.set 6 + i32.const 1424 + local.set 7 + i32.const 1432 + local.set 8 + i32.const 1024 + local.set 9 + i32.const 1 + local.set 10 + i32.const 0 + local.set 11 + loop ;; label = @3 + block ;; label = @4 + local.get 11 + i32.const 400 + i32.mul + local.get 11 + i32.const 3 + i32.shl + local.tee 12 + i32.add + i32.const 1024 + i32.add + local.tee 13 + f64.load + local.tee 14 + local.get 14 + f64.neg + local.get 14 + f64.const 0x0p+0 (;=0;) + f64.ge + select + local.get 1 + f64.le + i32.eqz + br_if 0 (;@4;) + i32.const 1 + local.set 3 + br 3 (;@1;) + end + i32.const 1 + i32.const 5 + call $__pragma_loopbound + local.get 11 + i32.const 1 + i32.add + local.set 15 + block ;; label = @4 + block ;; label = @5 + local.get 11 + i32.eqz + br_if 0 (;@5;) + i32.const 0 + local.get 11 + i32.const -2 + i32.and + i32.sub + local.set 16 + local.get 11 + i32.const 1 + i32.and + local.set 17 + local.get 7 + local.set 18 + local.get 15 + local.set 19 + loop ;; label = @6 + local.get 19 + i32.const 400 + i32.mul + local.tee 20 + local.get 12 + i32.add + i32.const 1024 + i32.add + local.tee 21 + f64.load + local.set 14 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 3 + block ;; label = @7 + local.get 11 + i32.const 1 + i32.eq + br_if 0 (;@7;) + i32.const 0 + local.set 22 + local.get 18 + local.set 3 + local.get 9 + local.set 23 + loop ;; label = @8 + local.get 14 + local.get 3 + f64.load + local.get 23 + f64.load + f64.mul + f64.sub + local.get 3 + i32.const 8 + i32.add + f64.load + local.get 23 + i32.const 400 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 23 + i32.const 800 + i32.add + local.set 23 + local.get 16 + local.get 22 + i32.const -2 + i32.add + local.tee 22 + i32.ne + br_if 0 (;@8;) + end + i32.const 0 + local.get 22 + i32.sub + local.set 3 + end + block ;; label = @7 + local.get 17 + i32.eqz + br_if 0 (;@7;) + local.get 14 + local.get 20 + local.get 3 + i32.const 3 + i32.shl + i32.add + i32.const 1024 + i32.add + f64.load + local.get 3 + i32.const 400 + i32.mul + local.get 12 + i32.add + i32.const 1024 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + end + local.get 21 + local.get 14 + local.get 13 + f64.load + f64.div + f64.store + local.get 18 + i32.const 400 + i32.add + local.set 18 + local.get 19 + local.get 0 + i32.eq + local.set 3 + local.get 19 + i32.const 1 + i32.add + local.set 19 + local.get 3 + i32.eqz + br_if 0 (;@6;) + br 2 (;@4;) + end + end + i32.const 1 + local.set 3 + block ;; label = @5 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@5;) + i32.const 0 + local.set 23 + i32.const 1824 + local.set 3 + loop ;; label = @6 + local.get 3 + i32.const -400 + i32.add + local.tee 22 + local.get 22 + f64.load + local.get 13 + f64.load + f64.div + f64.store + local.get 3 + local.get 3 + f64.load + local.get 13 + f64.load + f64.div + f64.store + local.get 3 + i32.const 800 + i32.add + local.set 3 + local.get 5 + local.get 23 + i32.const 2 + i32.add + local.tee 23 + i32.ne + br_if 0 (;@6;) + end + local.get 23 + i32.const 1 + i32.add + local.set 3 + end + local.get 6 + i32.eqz + br_if 0 (;@4;) + local.get 3 + i32.const 400 + i32.mul + i32.const 1024 + i32.add + local.tee 3 + local.get 3 + f64.load + local.get 13 + f64.load + f64.div + f64.store + end + local.get 10 + i32.const -2 + i32.and + local.set 16 + i32.const 1 + i32.const 5 + call $__pragma_loopbound + local.get 10 + i32.const 1 + i32.and + local.set 20 + local.get 9 + local.set 18 + local.get 15 + local.set 19 + loop ;; label = @4 + local.get 15 + i32.const 400 + i32.mul + local.tee 13 + local.get 19 + i32.const 3 + i32.shl + local.tee 12 + i32.add + i32.const 1024 + i32.add + local.tee 21 + f64.load + local.set 14 + i32.const 1 + i32.const 5 + call $__pragma_loopbound + i32.const 0 + local.set 22 + block ;; label = @5 + local.get 11 + i32.eqz + br_if 0 (;@5;) + local.get 18 + local.set 3 + local.get 8 + local.set 23 + loop ;; label = @6 + local.get 14 + local.get 23 + i32.const -8 + i32.add + f64.load + local.get 3 + i32.const 8 + i32.add + f64.load + f64.mul + f64.sub + local.get 23 + f64.load + local.get 3 + i32.const 408 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + local.get 3 + i32.const 800 + i32.add + local.set 3 + local.get 23 + i32.const 16 + i32.add + local.set 23 + local.get 16 + local.get 22 + i32.const 2 + i32.add + local.tee 22 + i32.ne + br_if 0 (;@6;) + end + end + block ;; label = @5 + local.get 20 + i32.eqz + br_if 0 (;@5;) + local.get 14 + local.get 13 + local.get 22 + i32.const 3 + i32.shl + i32.add + i32.const 1024 + i32.add + f64.load + local.get 22 + i32.const 400 + i32.mul + local.get 12 + i32.add + i32.const 1024 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + end + local.get 21 + local.get 14 + f64.store + local.get 18 + i32.const 8 + i32.add + local.set 18 + local.get 19 + local.get 0 + i32.eq + local.set 3 + local.get 19 + i32.const 1 + i32.add + local.set 19 + local.get 3 + i32.eqz + br_if 0 (;@4;) + end + local.get 8 + i32.const 400 + i32.add + local.set 8 + local.get 7 + i32.const 400 + i32.add + local.set 7 + local.get 9 + i32.const 8 + i32.add + local.set 9 + local.get 10 + i32.const 1 + i32.add + local.set 10 + local.get 15 + local.set 11 + local.get 15 + local.get 0 + i32.ne + br_if 0 (;@3;) + end + end + i32.const 0 + local.set 18 + local.get 2 + i32.const 0 + f64.load offset=21024 + f64.store + i32.const 5 + i32.const 5 + call $__pragma_loopbound + block ;; label = @2 + local.get 4 + br_if 0 (;@2;) + i32.const 1432 + local.set 21 + i32.const 1 + local.set 19 + loop ;; label = @3 + local.get 19 + i32.const 3 + i32.shl + local.tee 11 + i32.const 21024 + i32.add + f64.load + local.set 14 + i32.const 1 + i32.const 5 + call $__pragma_loopbound + block ;; label = @4 + block ;; label = @5 + local.get 18 + br_if 0 (;@5;) + i32.const 0 + local.set 22 + br 1 (;@4;) + end + local.get 19 + i32.const -2 + i32.and + local.set 16 + i32.const 0 + local.set 22 + local.get 2 + local.set 3 + local.get 21 + local.set 23 + loop ;; label = @5 + local.get 14 + local.get 23 + i32.const -8 + i32.add + f64.load + local.get 3 + f64.load + f64.mul + f64.sub + local.get 23 + f64.load + local.get 3 + i32.const 8 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 23 + i32.const 16 + i32.add + local.set 23 + local.get 16 + local.get 22 + i32.const 2 + i32.add + local.tee 22 + i32.ne + br_if 0 (;@5;) + end + end + block ;; label = @4 + local.get 19 + i32.const 1 + i32.and + i32.eqz + br_if 0 (;@4;) + local.get 14 + local.get 19 + i32.const 400 + i32.mul + local.get 22 + i32.const 3 + i32.shl + local.tee 3 + i32.add + i32.const 1024 + i32.add + f64.load + local.get 2 + local.get 3 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + end + local.get 2 + local.get 11 + i32.add + local.get 14 + f64.store + local.get 21 + i32.const 400 + i32.add + local.set 21 + local.get 18 + i32.const 1 + i32.add + local.set 18 + local.get 19 + local.get 0 + i32.ne + local.set 3 + local.get 19 + i32.const 1 + i32.add + local.set 19 + local.get 3 + br_if 0 (;@3;) + end + end + local.get 0 + i32.const 3 + i32.shl + local.tee 3 + i32.const 21440 + i32.add + local.get 2 + local.get 3 + i32.add + f64.load + local.get 0 + i32.const 400 + i32.mul + local.tee 23 + local.get 3 + i32.add + i32.const 1024 + i32.add + f64.load + f64.div + f64.store + i32.const 5 + i32.const 5 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.add + local.set 13 + local.get 23 + i32.const 624 + i32.add + local.set 16 + i32.const 0 + local.set 21 + local.get 0 + local.set 18 + loop ;; label = @3 + local.get 2 + local.get 18 + local.tee 19 + i32.const -1 + i32.add + local.tee 18 + i32.const 3 + i32.shl + local.tee 11 + i32.add + f64.load + local.set 14 + i32.const 1 + i32.const 5 + call $__pragma_loopbound + block ;; label = @4 + local.get 19 + local.get 0 + i32.gt_s + br_if 0 (;@4;) + block ;; label = @5 + block ;; label = @6 + local.get 21 + i32.const 1 + i32.and + i32.eqz + br_if 0 (;@6;) + local.get 19 + local.set 23 + br 1 (;@5;) + end + local.get 14 + local.get 18 + i32.const 400 + i32.mul + local.get 19 + i32.const 3 + i32.shl + local.tee 3 + i32.add + i32.const 1024 + i32.add + f64.load + local.get 3 + i32.const 21440 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + local.get 19 + i32.const 1 + i32.add + local.set 23 + end + local.get 21 + i32.eqz + br_if 0 (;@4;) + local.get 23 + i32.const 3 + i32.shl + local.set 3 + local.get 13 + local.get 23 + i32.sub + local.set 23 + loop ;; label = @5 + local.get 14 + local.get 16 + local.get 3 + i32.add + local.tee 22 + f64.load + local.get 3 + i32.const 21440 + i32.add + f64.load + f64.mul + f64.sub + local.get 22 + i32.const 8 + i32.add + f64.load + local.get 3 + i32.const 21448 + i32.add + f64.load + f64.mul + f64.sub + local.set 14 + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 23 + i32.const -2 + i32.add + local.tee 23 + br_if 0 (;@5;) + end + end + local.get 11 + i32.const 21440 + i32.add + local.get 14 + local.get 18 + i32.const 400 + i32.mul + local.get 11 + i32.add + i32.const 1024 + i32.add + f64.load + f64.div + f64.store + local.get 16 + i32.const -400 + i32.add + local.set 16 + local.get 21 + i32.const 1 + i32.add + local.set 21 + local.get 19 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + end + end + i32.const 0 + local.set 3 + end + local.get 2 + i32.const 800 + i32.add + global.set $__stack_pointer + local.get 3) + (func $ludcmp_main (type 1) + i32.const 0 + i32.const 5 + f64.const 0x1p+0 (;=1;) + call $ludcmp_test + i32.store offset=21424) + (func $__original_main (type 3) (result i32) + (local i32) + call $ludcmp_init + call $ludcmp_main + i32.const 0 + i32.load offset=21424 + local.set 0 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + i32.const 0 + i32.const -1 + i32.const 0 + f64.load offset=21440 + local.get 0 + f64.convert_i32_s + f64.add + i32.const 0 + f64.load offset=21448 + f64.add + i32.const 0 + f64.load offset=21456 + f64.add + i32.const 0 + f64.load offset=21464 + f64.add + i32.const 0 + f64.load offset=21472 + f64.add + i32.const 0 + f64.load offset=21480 + f64.add + f64.const -0x1.8p+2 (;=-6;) + f64.add + f64.abs + f64.const 0x1.0c6f7a0b5ed8dp-20 (;=1e-06;) + f64.lt + select) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 25936)) + (global (;1;) i32 (i32.const 21840)) + (global (;2;) i32 (i32.const 25936)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $ludcmp_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/default/ludcmp.c b/targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/default/ludcmp.c new file mode 100644 index 0000000..2c8721b --- /dev/null +++ b/targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/default/ludcmp.c @@ -0,0 +1,182 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: ludcmp + + Author: Sung-Soo Lim + + Function: Simultaneous linear equations by LU decomposition. + + Source: SNU-RT Benchmark Suite, via MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/ludcmp/ludcmp.c + + Changes: Moved initialization into separate function. + + License: May be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + III-4. ludcmp.c : Simultaneous Linear Equations by LU Decomposition + (from the book C Programming for EEs by Hyun Soon Ahn) +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void ludcmp_init(void); +int ludcmp_return(void); +int ludcmp_test(int n, double eps); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ludcmp_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +double ludcmp_a[50][50], ludcmp_b[50], ludcmp_x[50]; +int ludcmp_chkerr; + +void +ludcmp_init(void) { + int i, j, n = 5; + double w; + volatile int x = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i <= n; i++) { + w = 0; + __pragma_loopbound(6, 6); + for (j = 0; j <= n; j++) { + ludcmp_a[i][j] = (i + 1) + (j + 1); + + if (i == j) + ludcmp_a[i][j] *= 10; + w += ludcmp_a[i][j]; + + if (x) + ludcmp_a[i][j] += x; + } + + ludcmp_b[i] = w; + if (x) + ludcmp_b[i] += x; + } +} + +int +ludcmp_return(void) { + int i, n = 5; + double checksum = ludcmp_chkerr; + + __pragma_loopbound(6, 6); + for (i = 0; i <= n; i++) + checksum += ludcmp_x[i]; + + /* allow rounding errors for the checksum */ + checksum -= 6.0; + return ((checksum < 0.000001 && checksum > -0.000001) ? 0 : -1); +} + +double +ludcmp_fabs(double n) { + double f; + + if (n >= 0) + f = n; + else + f = -n; + + return f; +} + +int +ludcmp_test(int n, double eps) { + int i, j, k; + double w, y[100]; + + if (n > 99 || eps <= 0) + return (999); + + __pragma_loopbound(5, 5); + for (i = 0; i < n; i++) { + if (ludcmp_fabs(ludcmp_a[i][i]) <= eps) + return (1); + + __pragma_loopbound(1, 5); + for (j = i + 1; j <= n; j++) { + w = ludcmp_a[j][i]; + + if (i != 0) { + __pragma_loopbound(1, 4); + for (k = 0; k < i; k++) + w -= ludcmp_a[j][k] * ludcmp_a[k][i]; + } + + ludcmp_a[j][i] = w / ludcmp_a[i][i]; + } + + __pragma_loopbound(1, 5); + for (j = i + 1; j <= n; j++) { + w = ludcmp_a[i + 1][j]; + + __pragma_loopbound(1, 5); + for (k = 0; k <= i; k++) + w -= ludcmp_a[i + 1][k] * ludcmp_a[k][j]; + + ludcmp_a[i + 1][j] = w; + } + } + + y[0] = ludcmp_b[0]; + + __pragma_loopbound(5, 5); + for (i = 1; i <= n; i++) { + w = ludcmp_b[i]; + + __pragma_loopbound(1, 5); + for (j = 0; j < i; j++) + w -= ludcmp_a[i][j] * y[j]; + + y[i] = w; + } + + ludcmp_x[n] = y[n] / ludcmp_a[n][n]; + + __pragma_loopbound(5, 5); + for (i = n - 1; i >= 0; i--) { + w = y[i]; + + __pragma_loopbound(1, 5); + for (j = i + 1; j <= n; j++) + w -= ludcmp_a[i][j] * ludcmp_x[j]; + + ludcmp_x[i] = w / ludcmp_a[i][i]; + } + + return (0); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ludcmp_main(void) { + int n = 5; + double eps = 1; + ludcmp_chkerr = ludcmp_test(n, eps); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + ludcmp_init(); + ludcmp_main(); + + return (ludcmp_return()); +} diff --git a/targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/inline/ludcmp.c b/targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/inline/ludcmp.c new file mode 100644 index 0000000..379339e --- /dev/null +++ b/targets/wasm-tacle/kernel/ludcmp/generated/modified_sources/inline/ludcmp.c @@ -0,0 +1,190 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: ludcmp + + Author: Sung-Soo Lim + + Function: Simultaneous linear equations by LU decomposition. + + Source: SNU-RT Benchmark Suite, via MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/ludcmp/ludcmp.c + + Changes: Moved initialization into separate function. + + License: May be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + III-4. ludcmp.c : Simultaneous Linear Equations by LU Decomposition + (from the book C Programming for EEs by Hyun Soon Ahn) +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void ludcmp_init(void); +__attribute__((always_inline)) static inline int ludcmp_return(void); +__attribute__((always_inline)) static inline int ludcmp_test(int n, double eps); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ludcmp_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +double ludcmp_a[50][50], ludcmp_b[50], ludcmp_x[50]; +int ludcmp_chkerr; + +__attribute__((always_inline)) static inline void +ludcmp_init(void) { + int i, j, n = 5; + double w; + volatile int x = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i <= n; i++) { + w = 0; + __pragma_loopbound(6, 6); + for (j = 0; j <= n; j++) { + ludcmp_a[i][j] = (i + 1) + (j + 1); + + if (i == j) + ludcmp_a[i][j] *= 10; + w += ludcmp_a[i][j]; + + if (x) + ludcmp_a[i][j] += x; + } + + ludcmp_b[i] = w; + if (x) + ludcmp_b[i] += x; + } +} + +__attribute__((always_inline)) static inline int +ludcmp_return(void) { + int i, n = 5; + double checksum = ludcmp_chkerr; + + __pragma_loopbound(6, 6); + for (i = 0; i <= n; i++) + checksum += ludcmp_x[i]; + + /* allow rounding errors for the checksum */ + checksum -= 6.0; + return ((checksum < 0.000001 && checksum > -0.000001) ? 0 : -1); +} + +__attribute__((always_inline)) static inline double +ludcmp_fabs(double n) { + double f; + + if (n >= 0) + f = n; + else + f = -n; + + return f; +} + +__attribute__((always_inline)) static inline int +ludcmp_test(int n, double eps) { + int i, j, k; + double w, y[100]; + + if (n > 99 || eps <= 0) + return (999); + + __pragma_loopbound(5, 5); + for (i = 0; i < n; i++) { + if (ludcmp_fabs(ludcmp_a[i][i]) <= eps) + return (1); + + __pragma_loopbound(1, 5); + for (j = i + 1; j <= n; j++) { + w = ludcmp_a[j][i]; + + if (i != 0) { + __pragma_loopbound(1, 4); + for (k = 0; k < i; k++) + w -= ludcmp_a[j][k] * ludcmp_a[k][i]; + } + + ludcmp_a[j][i] = w / ludcmp_a[i][i]; + } + + __pragma_loopbound(1, 5); + for (j = i + 1; j <= n; j++) { + w = ludcmp_a[i + 1][j]; + + __pragma_loopbound(1, 5); + for (k = 0; k <= i; k++) + w -= ludcmp_a[i + 1][k] * ludcmp_a[k][j]; + + ludcmp_a[i + 1][j] = w; + } + } + + y[0] = ludcmp_b[0]; + + __pragma_loopbound(5, 5); + for (i = 1; i <= n; i++) { + w = ludcmp_b[i]; + + __pragma_loopbound(1, 5); + for (j = 0; j < i; j++) + w -= ludcmp_a[i][j] * y[j]; + + y[i] = w; + } + + ludcmp_x[n] = y[n] / ludcmp_a[n][n]; + + __pragma_loopbound(5, 5); + for (i = n - 1; i >= 0; i--) { + w = y[i]; + + __pragma_loopbound(1, 5); + for (j = i + 1; j <= n; j++) + w -= ludcmp_a[i][j] * ludcmp_x[j]; + + ludcmp_x[i] = w / ludcmp_a[i][i]; + } + + return (0); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ludcmp_main(void) { + int n = 5; + double eps = 1; + ludcmp_chkerr = ludcmp_test(n, eps); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + ludcmp_init(); + ludcmp_main(); + + return (ludcmp_return()); +} diff --git a/targets/wasm-tacle/kernel/ludcmp/ludcmp.c b/targets/wasm-tacle/kernel/ludcmp/ludcmp.c new file mode 100755 index 0000000..6c9127b --- /dev/null +++ b/targets/wasm-tacle/kernel/ludcmp/ludcmp.c @@ -0,0 +1,177 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: ludcmp + + Author: Sung-Soo Lim + + Function: Simultaneous linear equations by LU decomposition. + + Source: SNU-RT Benchmark Suite, via MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/ludcmp/ludcmp.c + + Changes: Moved initialization into separate function. + + License: May be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + III-4. ludcmp.c : Simultaneous Linear Equations by LU Decomposition + (from the book C Programming for EEs by Hyun Soon Ahn) +*/ + +/* + Forward declaration of functions +*/ + +void ludcmp_init( void ); +int ludcmp_return( void ); +int ludcmp_test( int n, double eps ); +void ludcmp_main( void ); +int main( void ); + +double ludcmp_a[ 50 ][ 50 ], ludcmp_b[ 50 ], ludcmp_x[ 50 ]; +int ludcmp_chkerr; + +void ludcmp_init( void ) +{ + int i, j, n = 5; + double w; + volatile int x = 0; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i <= n; i++ ) { + w = 0; + _Pragma( "loopbound min 6 max 6" ) + for ( j = 0; j <= n; j++ ) { + ludcmp_a[ i ][ j ] = ( i + 1 ) + ( j + 1 ); + + if ( i == j ) + ludcmp_a[ i ][ j ] *= 10; + w += ludcmp_a[ i ][ j ]; + + if ( x ) + ludcmp_a[ i ][ j ] += x; + } + + ludcmp_b[ i ] = w; + if ( x ) + ludcmp_b[ i ] += x; + } +} + +int ludcmp_return( void ) +{ + int i, n = 5; + double checksum = ludcmp_chkerr; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i <= n; i++ ) + checksum += ludcmp_x[ i ]; + + /* allow rounding errors for the checksum */ + checksum -= 6.0; + return ( ( checksum < 0.000001 && checksum > -0.000001 ) ? 0 : -1 ); +} + +double ludcmp_fabs( double n ) +{ + double f; + + if ( n >= 0 ) + f = n; + else + f = -n; + + return f; +} + +int ludcmp_test( int n, double eps ) +{ + int i, j, k; + double w, y[ 100 ]; + + + if ( n > 99 || eps <= 0 ) + return ( 999 ); + + _Pragma( "loopbound min 5 max 5" ) + for ( i = 0; i < n; i++ ) { + if ( ludcmp_fabs( ludcmp_a[ i ][ i ] ) <= eps ) + return ( 1 ); + + _Pragma( "loopbound min 1 max 5" ) + for ( j = i + 1; j <= n; j++ ) { + w = ludcmp_a[ j ][ i ]; + + if ( i != 0 ) { + _Pragma( "loopbound min 1 max 4" ) + for ( k = 0; k < i; k++ ) + w -= ludcmp_a[ j ][ k ] * ludcmp_a[ k ][ i ]; + } + + ludcmp_a[ j ][ i ] = w / ludcmp_a[ i ][ i ]; + } + + _Pragma( "loopbound min 1 max 5" ) + for ( j = i + 1; j <= n; j++ ) { + w = ludcmp_a[ i + 1 ][ j ]; + + _Pragma( "loopbound min 1 max 5" ) + for ( k = 0; k <= i; k++ ) + w -= ludcmp_a[ i + 1 ][ k ] * ludcmp_a[ k ][ j ]; + + ludcmp_a[ i + 1 ][ j ] = w; + } + } + + y[ 0 ] = ludcmp_b[ 0 ]; + + _Pragma( "loopbound min 5 max 5" ) + for ( i = 1; i <= n; i++ ) { + w = ludcmp_b[ i ]; + + _Pragma( "loopbound min 1 max 5" ) + for ( j = 0; j < i; j++ ) + w -= ludcmp_a[ i ][ j ] * y[ j ]; + + y[ i ] = w; + } + + ludcmp_x[ n ] = y[ n ] / ludcmp_a[ n ][ n ]; + + _Pragma( "loopbound min 5 max 5" ) + for ( i = n - 1; i >= 0; i-- ) { + w = y[ i ]; + + _Pragma( "loopbound min 1 max 5" ) + for ( j = i + 1; j <= n; j++ ) + w -= ludcmp_a[ i ][ j ] * ludcmp_x[ j ]; + + ludcmp_x[ i ] = w / ludcmp_a[ i ][ i ]; + } + + return ( 0 ); +} + +void _Pragma( "entrypoint" ) ludcmp_main( void ) +{ + int n = 5; + double eps = 1; + ludcmp_chkerr = ludcmp_test( n, eps ); +} + +int main( void ) +{ + ludcmp_init(); + ludcmp_main(); + + return ( ludcmp_return() ); +} diff --git a/targets/wasm-tacle/kernel/matrix1/CMakeLists.txt b/targets/wasm-tacle/kernel/matrix1/CMakeLists.txt new file mode 100644 index 0000000..9fd9d6c --- /dev/null +++ b/targets/wasm-tacle/kernel/matrix1/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(matrix1) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/matrix1.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/matrix1.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/matrix1/ChangeLog.txt b/targets/wasm-tacle/kernel/matrix1/ChangeLog.txt new file mode 100755 index 0000000..c9c5fe7 --- /dev/null +++ b/targets/wasm-tacle/kernel/matrix1/ChangeLog.txt @@ -0,0 +1,63 @@ +File: matrix1.c +Original provenience: DSP-Stone benchmark suite, matrix1_fixed + http://www.ice.rwth-aachen.de/research/tools-projects/entry/detail/dspstone + +2016-02-09: +- Added TACLeBench header +- Redefined function pin_down() as returning void since the return value is + insignificant +- Function pin_down() fills matrices A and B with 1s and matrix C with 0s. + First call to it is kept as the initilization part, but the second call at + the end of main function seems unnecessary, hence removed +- Added a new main function that first calls init function then the old main + function sans init +- Redefined matrices A, B and C as global variables so that they are not local + to new main function and can be initialized and processed with diferent + functions +- Annotated matrix1_fixed_main() as the entry point of the analysis +- Removed unnecessary dereference operator from '*p_c++;' (line TODO:XXX) to + remove compiler warning 'value computed not used' +- Removed seemingly unnecessary empty lines +- Moved around all the following so that they are in the given order just after + the header + - macro definitions + - forward declaration of functions + - declaration of global variables + - initialization functions + - main functions +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2016-04-26: +- Renamed benchmark: matrix1_fixed -> matrix1 +- Changed prefix in function/variable names (matrix1_fixed -> matrix1) +- Removed macro definition (#define TYPE int) and changed 'TYPE' into 'int' +- Removed macro definition (#define STORAGE_CLASS register) and changed 'STORAGE_CLASS' + into 'register' +- Declared initialisation value as volatile +- Added matrix1_return() function and call to this function from matrix1_main() + +2016-10-08 +- Added prefix to global matrix names: A -> matrix1_A, etc. + +2017-08-03 +- Fixed off-by-one error in loop header diff --git a/targets/wasm-tacle/kernel/matrix1/generated/default/matrix1.wasm b/targets/wasm-tacle/kernel/matrix1/generated/default/matrix1.wasm new file mode 100755 index 0000000000000000000000000000000000000000..49485a246849e54689cd6911f0ad6bddc5a88b1f GIT binary patch literal 1300 zcmaJ>J#Q015S_WbB#!OKCPXL_6lasd$g&k9lqg-6CZeH&db74S<}UZ8`+!(NIs_#W z0*QixB1MW6DO{wWprEDaCs0uG6PUYm$PqYJr`7Cxvop7EW*21WAkb)3##7sL5Br;_ zgARZzY+p+f*a!MB(QaTx2tSY$M=sl*=MTNu9Ro0(A!_;p`iQu|5ODE2OOVe7wFLO= zS~d@AOOF;89p!kzRD*RPo>5jIeczsnv5ce$lKJk;+|9u ztTU{F_et6+Md0)*aCQ}#T?PJ|@yok3LDpk*z)#ugK5S>lo&B+zhiSgddblVUstate to avoid + wrong indexing in encode that is called for 16 elements. + +2017-06-27 +- Introduce md5_return function and update type signature of md5_main. diff --git a/targets/wasm-tacle/kernel/md5/generated/default/md5.wasm b/targets/wasm-tacle/kernel/md5/generated/default/md5.wasm new file mode 100755 index 0000000000000000000000000000000000000000..371130943c562538d8b267541db8535a730d0b57 GIT binary patch literal 5301 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 Tmha0Xb2E%wds`}&T$=wcYD&R7 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/md5/generated/default/md5.wat b/targets/wasm-tacle/kernel/md5/generated/default/md5.wat new file mode 100644 index 0000000..3c43c13 --- /dev/null +++ b/targets/wasm-tacle/kernel/md5/generated/default/md5.wat @@ -0,0 +1,2343 @@ +(module $md5.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32 i32))) + (type (;3;) (func (param i32 i32 i32) (result i32))) + (type (;4;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $md5_update (type 2) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + local.get 0 + local.get 0 + i32.load offset=64 + local.tee 3 + local.get 2 + i32.const 3 + i32.shl + i32.add + local.tee 4 + i32.store offset=64 + local.get 0 + local.get 0 + i32.load offset=68 + local.get 4 + local.get 3 + i32.lt_u + i32.add + local.get 2 + i32.const 29 + i32.shr_u + i32.add + i32.store offset=68 + block ;; label = @1 + block ;; label = @2 + i32.const 64 + local.get 3 + i32.const 3 + i32.shr_u + i32.const 63 + i32.and + local.tee 5 + i32.sub + local.tee 3 + local.get 2 + i32.le_u + br_if 0 (;@2;) + i32.const 0 + local.set 3 + br 1 (;@1;) + end + i32.const 0 + local.set 4 + i32.const 0 + i32.const 55 + call $__pragma_loopbound + local.get 3 + i32.const 3 + i32.and + local.set 6 + block ;; label = @2 + local.get 5 + i32.const 63 + i32.xor + i32.const 3 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + local.get 5 + i32.add + local.set 7 + local.get 3 + i32.const 124 + i32.and + local.set 8 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 7 + local.get 4 + i32.add + local.tee 9 + i32.const 72 + i32.add + local.get 1 + local.get 4 + i32.add + local.tee 10 + i32.load8_u + i32.store8 + local.get 9 + i32.const 73 + i32.add + local.get 10 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 9 + i32.const 74 + i32.add + local.get 10 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 9 + i32.const 75 + i32.add + local.get 10 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 8 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 0 + i32.const 72 + i32.add + local.set 10 + block ;; label = @2 + local.get 6 + i32.eqz + br_if 0 (;@2;) + local.get 1 + local.get 4 + i32.add + local.set 9 + local.get 4 + local.get 5 + i32.add + local.get 0 + i32.add + i32.const 72 + i32.add + local.set 4 + loop ;; label = @3 + local.get 4 + local.get 9 + i32.load8_u + i32.store8 + local.get 9 + i32.const 1 + i32.add + local.set 9 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@3;) + end + end + local.get 0 + local.get 10 + call $md5_transform + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @2 + local.get 5 + i32.const 127 + i32.xor + local.get 2 + i32.lt_u + br_if 0 (;@2;) + i32.const 0 + local.set 5 + br 1 (;@1;) + end + loop ;; label = @2 + local.get 0 + local.get 1 + local.get 3 + i32.add + call $md5_transform + local.get 3 + i32.const 127 + i32.add + local.set 4 + local.get 3 + i32.const 64 + i32.add + local.tee 9 + local.set 3 + local.get 4 + local.get 2 + i32.lt_u + br_if 0 (;@2;) + end + i32.const 0 + local.set 5 + local.get 9 + local.set 3 + end + i32.const 0 + i32.const 55 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + local.get 3 + i32.eq + br_if 0 (;@1;) + local.get 2 + local.get 3 + i32.sub + local.tee 9 + i32.const 3 + i32.and + local.set 6 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 3 + local.get 2 + i32.sub + i32.const -4 + i32.gt_u + br_if 0 (;@2;) + local.get 1 + local.get 3 + i32.add + local.set 2 + local.get 0 + local.get 5 + i32.add + local.set 7 + local.get 9 + i32.const -4 + i32.and + local.set 8 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 7 + local.get 4 + i32.add + local.tee 9 + i32.const 72 + i32.add + local.get 2 + local.get 4 + i32.add + local.tee 10 + i32.load8_u + i32.store8 + local.get 9 + i32.const 73 + i32.add + local.get 10 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 9 + i32.const 74 + i32.add + local.get 10 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 9 + i32.const 75 + i32.add + local.get 10 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 8 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 6 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 3 + local.get 4 + i32.add + i32.add + local.set 3 + local.get 5 + local.get 4 + i32.add + local.get 0 + i32.add + i32.const 72 + i32.add + local.set 4 + loop ;; label = @2 + local.get 4 + local.get 3 + i32.load8_u + i32.store8 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@2;) + end + end) + (func $md5_transform (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 64 + i32.sub + local.tee 2 + global.set $__stack_pointer + local.get 0 + i32.load offset=12 + local.set 3 + local.get 0 + i32.load offset=8 + local.set 4 + local.get 0 + i32.load offset=4 + local.set 5 + local.get 0 + i32.load + local.set 6 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const 0 + local.set 7 + loop ;; label = @1 + local.get 2 + local.get 7 + i32.add + local.get 1 + local.get 7 + i32.add + i32.load align=1 + i32.store + local.get 7 + i32.const 4 + i32.add + local.tee 7 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + local.get 0 + local.get 2 + i32.load offset=16 + local.tee 8 + local.get 2 + i32.load offset=32 + local.tee 9 + local.get 2 + i32.load offset=48 + local.tee 10 + local.get 2 + i32.load + local.tee 11 + local.get 2 + i32.load offset=36 + local.tee 12 + local.get 2 + i32.load offset=52 + local.tee 13 + local.get 2 + i32.load offset=4 + local.tee 14 + local.get 2 + i32.load offset=20 + local.tee 15 + local.get 13 + local.get 12 + local.get 15 + local.get 14 + local.get 10 + local.get 9 + local.get 8 + local.get 11 + local.get 6 + local.get 3 + local.get 5 + i32.const -1 + i32.xor + i32.and + local.get 4 + local.get 5 + i32.and + i32.or + i32.add + i32.add + i32.const -680876936 + i32.add + i32.const 7 + i32.rotl + local.get 5 + i32.add + local.tee 7 + i32.add + local.get 5 + local.get 2 + i32.load offset=12 + local.tee 6 + i32.add + local.get 4 + local.get 2 + i32.load offset=8 + local.tee 16 + i32.add + local.get 3 + local.get 14 + i32.add + local.get 7 + local.get 5 + i32.and + local.get 4 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -389564586 + i32.add + i32.const 12 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 7 + i32.and + local.get 5 + local.get 1 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 606105819 + i32.add + i32.const 17 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 1 + i32.and + local.get 7 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1044525330 + i32.add + i32.const 22 + i32.rotl + local.get 5 + i32.add + local.tee 7 + local.get 5 + i32.and + local.get 1 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -176418897 + i32.add + i32.const 7 + i32.rotl + local.get 7 + i32.add + local.tee 4 + i32.add + local.get 2 + i32.load offset=28 + local.tee 3 + local.get 7 + i32.add + local.get 2 + i32.load offset=24 + local.tee 17 + local.get 5 + i32.add + local.get 15 + local.get 1 + i32.add + local.get 4 + local.get 7 + i32.and + local.get 5 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 1200080426 + i32.add + i32.const 12 + i32.rotl + local.get 4 + i32.add + local.tee 1 + local.get 4 + i32.and + local.get 7 + local.get 1 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1473231341 + i32.add + i32.const 17 + i32.rotl + local.get 1 + i32.add + local.tee 7 + local.get 1 + i32.and + local.get 4 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -45705983 + i32.add + i32.const 22 + i32.rotl + local.get 7 + i32.add + local.tee 5 + local.get 7 + i32.and + local.get 1 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 1770035416 + i32.add + i32.const 7 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 2 + i32.load offset=44 + local.tee 18 + local.get 5 + i32.add + local.get 2 + i32.load offset=40 + local.tee 19 + local.get 7 + i32.add + local.get 12 + local.get 1 + i32.add + local.get 4 + local.get 5 + i32.and + local.get 7 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1958414417 + i32.add + i32.const 12 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 4 + i32.and + local.get 5 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -42063 + i32.add + i32.const 17 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 7 + i32.and + local.get 4 + local.get 1 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1990404162 + i32.add + i32.const 22 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 1 + i32.and + local.get 7 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 1804603682 + i32.add + i32.const 7 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 2 + i32.load offset=60 + local.tee 20 + local.get 5 + i32.add + local.get 2 + i32.load offset=56 + local.tee 21 + local.get 1 + i32.add + local.get 13 + local.get 7 + i32.add + local.get 4 + local.get 5 + i32.and + local.get 1 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -40341101 + i32.add + i32.const 12 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 4 + i32.and + local.get 5 + local.get 7 + i32.const -1 + i32.xor + local.tee 22 + i32.and + i32.or + i32.add + i32.const -1502002290 + i32.add + i32.const 17 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 7 + i32.and + local.get 4 + local.get 1 + i32.const -1 + i32.xor + local.tee 23 + i32.and + i32.or + i32.add + i32.const 1236535329 + i32.add + i32.const 22 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.and + local.get 1 + local.get 22 + i32.and + i32.or + i32.add + i32.const -165796510 + i32.add + i32.const 5 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 11 + local.get 5 + i32.add + local.get 18 + local.get 1 + i32.add + local.get 17 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.and + local.get 5 + local.get 23 + i32.and + i32.or + i32.add + i32.const -1069501632 + i32.add + i32.const 9 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.and + local.get 4 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 643717713 + i32.add + i32.const 14 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 4 + i32.and + local.get 7 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -373897302 + i32.add + i32.const 20 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.and + local.get 1 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -701558691 + i32.add + i32.const 5 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 8 + local.get 5 + i32.add + local.get 20 + local.get 1 + i32.add + local.get 19 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.and + local.get 5 + local.get 1 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 38016083 + i32.add + i32.const 9 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.and + local.get 4 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -660478335 + i32.add + i32.const 14 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 4 + i32.and + local.get 7 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -405537848 + i32.add + i32.const 20 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.and + local.get 1 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 568446438 + i32.add + i32.const 5 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 9 + local.get 5 + i32.add + local.get 6 + local.get 1 + i32.add + local.get 21 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.and + local.get 5 + local.get 1 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1019803690 + i32.add + i32.const 9 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.and + local.get 4 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -187363961 + i32.add + i32.const 14 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 4 + i32.and + local.get 7 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 1163531501 + i32.add + i32.const 20 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.and + local.get 1 + local.get 7 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1444681467 + i32.add + i32.const 5 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 10 + local.get 5 + i32.add + local.get 3 + local.get 1 + i32.add + local.get 16 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.and + local.get 5 + local.get 1 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -51403784 + i32.add + i32.const 9 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.and + local.get 4 + local.get 5 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const 1735328473 + i32.add + i32.const 14 + i32.rotl + local.get 7 + i32.add + local.tee 5 + local.get 4 + i32.and + local.get 7 + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.add + i32.const -1926607734 + i32.add + i32.const 20 + i32.rotl + local.get 5 + i32.add + local.tee 4 + local.get 5 + i32.xor + local.tee 22 + local.get 7 + i32.xor + i32.add + i32.const -378558 + i32.add + i32.const 4 + i32.rotl + local.get 4 + i32.add + local.tee 1 + i32.add + local.get 18 + local.get 5 + i32.add + local.get 1 + local.get 4 + i32.xor + local.get 9 + local.get 7 + i32.add + local.get 22 + local.get 1 + i32.xor + i32.add + i32.const -2022574463 + i32.add + i32.const 11 + i32.rotl + local.get 1 + i32.add + local.tee 7 + i32.xor + i32.add + i32.const 1839030562 + i32.add + i32.const 16 + i32.rotl + local.get 7 + i32.add + local.tee 5 + local.get 7 + i32.xor + local.get 21 + local.get 4 + i32.add + local.get 7 + local.get 1 + i32.xor + local.get 5 + i32.xor + i32.add + i32.const -35309556 + i32.add + i32.const 23 + i32.rotl + local.get 5 + i32.add + local.tee 1 + i32.xor + i32.add + i32.const -1530992060 + i32.add + i32.const 4 + i32.rotl + local.get 1 + i32.add + local.tee 4 + i32.add + local.get 3 + local.get 5 + i32.add + local.get 4 + local.get 1 + i32.xor + local.get 8 + local.get 7 + i32.add + local.get 1 + local.get 5 + i32.xor + local.get 4 + i32.xor + i32.add + i32.const 1272893353 + i32.add + i32.const 11 + i32.rotl + local.get 4 + i32.add + local.tee 7 + i32.xor + i32.add + i32.const -155497632 + i32.add + i32.const 16 + i32.rotl + local.get 7 + i32.add + local.tee 5 + local.get 7 + i32.xor + local.get 19 + local.get 1 + i32.add + local.get 7 + local.get 4 + i32.xor + local.get 5 + i32.xor + i32.add + i32.const -1094730640 + i32.add + i32.const 23 + i32.rotl + local.get 5 + i32.add + local.tee 1 + i32.xor + i32.add + i32.const 681279174 + i32.add + i32.const 4 + i32.rotl + local.get 1 + i32.add + local.tee 4 + i32.add + local.get 6 + local.get 5 + i32.add + local.get 4 + local.get 1 + i32.xor + local.get 11 + local.get 7 + i32.add + local.get 1 + local.get 5 + i32.xor + local.get 4 + i32.xor + i32.add + i32.const -358537222 + i32.add + i32.const 11 + i32.rotl + local.get 4 + i32.add + local.tee 7 + i32.xor + i32.add + i32.const -722521979 + i32.add + i32.const 16 + i32.rotl + local.get 7 + i32.add + local.tee 5 + local.get 7 + i32.xor + local.get 17 + local.get 1 + i32.add + local.get 7 + local.get 4 + i32.xor + local.get 5 + i32.xor + i32.add + i32.const 76029189 + i32.add + i32.const 23 + i32.rotl + local.get 5 + i32.add + local.tee 1 + i32.xor + i32.add + i32.const -640364487 + i32.add + i32.const 4 + i32.rotl + local.get 1 + i32.add + local.tee 4 + i32.add + local.get 16 + local.get 1 + i32.add + local.get 10 + local.get 7 + i32.add + local.get 1 + local.get 5 + i32.xor + local.get 4 + i32.xor + i32.add + i32.const -421815835 + i32.add + i32.const 11 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 4 + i32.xor + local.get 20 + local.get 5 + i32.add + local.get 4 + local.get 1 + i32.xor + local.get 7 + i32.xor + i32.add + i32.const 530742520 + i32.add + i32.const 16 + i32.rotl + local.get 7 + i32.add + local.tee 1 + i32.xor + i32.add + i32.const -995338651 + i32.add + i32.const 23 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.const -1 + i32.xor + i32.or + local.get 1 + i32.xor + i32.add + i32.const -198630844 + i32.add + i32.const 6 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 15 + local.get 5 + i32.add + local.get 21 + local.get 1 + i32.add + local.get 3 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.const -1 + i32.xor + i32.or + local.get 5 + i32.xor + i32.add + i32.const 1126891415 + i32.add + i32.const 10 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.const -1 + i32.xor + i32.or + local.get 4 + i32.xor + i32.add + i32.const -1416354905 + i32.add + i32.const 15 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 4 + i32.const -1 + i32.xor + i32.or + local.get 7 + i32.xor + i32.add + i32.const -57434055 + i32.add + i32.const 21 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.const -1 + i32.xor + i32.or + local.get 1 + i32.xor + i32.add + i32.const 1700485571 + i32.add + i32.const 6 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 14 + local.get 5 + i32.add + local.get 19 + local.get 1 + i32.add + local.get 6 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.const -1 + i32.xor + i32.or + local.get 5 + i32.xor + i32.add + i32.const -1894986606 + i32.add + i32.const 10 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.const -1 + i32.xor + i32.or + local.get 4 + i32.xor + i32.add + i32.const -1051523 + i32.add + i32.const 15 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 4 + i32.const -1 + i32.xor + i32.or + local.get 7 + i32.xor + i32.add + i32.const -2054922799 + i32.add + i32.const 21 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.const -1 + i32.xor + i32.or + local.get 1 + i32.xor + i32.add + i32.const 1873313359 + i32.add + i32.const 6 + i32.rotl + local.get 5 + i32.add + local.tee 4 + i32.add + local.get 13 + local.get 5 + i32.add + local.get 17 + local.get 1 + i32.add + local.get 20 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.const -1 + i32.xor + i32.or + local.get 5 + i32.xor + i32.add + i32.const -30611744 + i32.add + i32.const 10 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 5 + i32.const -1 + i32.xor + i32.or + local.get 4 + i32.xor + i32.add + i32.const -1560198380 + i32.add + i32.const 15 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 4 + i32.const -1 + i32.xor + i32.or + local.get 7 + i32.xor + i32.add + i32.const 1309151649 + i32.add + i32.const 21 + i32.rotl + local.get 1 + i32.add + local.tee 5 + local.get 7 + i32.const -1 + i32.xor + i32.or + local.get 1 + i32.xor + i32.add + i32.const -145523070 + i32.add + i32.const 6 + i32.rotl + local.get 5 + i32.add + local.tee 4 + local.get 0 + i32.load + i32.add + i32.store + local.get 0 + local.get 18 + local.get 7 + i32.add + local.get 4 + local.get 1 + i32.const -1 + i32.xor + i32.or + local.get 5 + i32.xor + i32.add + i32.const -1120210379 + i32.add + i32.const 10 + i32.rotl + local.get 4 + i32.add + local.tee 7 + local.get 0 + i32.load offset=12 + i32.add + i32.store offset=12 + local.get 0 + local.get 16 + local.get 1 + i32.add + local.get 7 + local.get 5 + i32.const -1 + i32.xor + i32.or + local.get 4 + i32.xor + i32.add + i32.const 718787259 + i32.add + i32.const 15 + i32.rotl + local.get 7 + i32.add + local.tee 1 + local.get 0 + i32.load offset=8 + i32.add + i32.store offset=8 + local.get 0 + local.get 1 + local.get 0 + i32.load offset=4 + i32.add + local.get 12 + local.get 5 + i32.add + local.get 1 + local.get 4 + i32.const -1 + i32.xor + i32.or + local.get 7 + i32.xor + i32.add + i32.const -343485551 + i32.add + i32.const 21 + i32.rotl + i32.add + i32.store offset=4 + i32.const 128 + i32.const 208 + call $__pragma_loopbound + local.get 2 + i32.const 64 + i32.add + global.set $__stack_pointer) + (func $md5_final (type 0) (param i32 i32) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 2 + global.set $__stack_pointer + i32.const 2 + i32.const 16 + call $__pragma_loopbound + local.get 2 + local.get 1 + i32.load offset=64 + local.tee 3 + i32.store offset=8 align=1 + local.get 2 + local.get 1 + i32.load offset=68 + i32.store offset=12 align=1 + local.get 1 + i32.const 1024 + i32.const 56 + i32.const 120 + local.get 3 + i32.const 3 + i32.shr_u + i32.const 63 + i32.and + local.tee 3 + i32.const 56 + i32.lt_u + select + local.get 3 + i32.sub + call $md5_update + local.get 1 + local.get 2 + i32.const 8 + i32.add + i32.const 8 + call $md5_update + i32.const 2 + i32.const 16 + call $__pragma_loopbound + i32.const 0 + local.set 3 + loop ;; label = @1 + local.get 0 + local.get 3 + i32.add + local.tee 4 + local.get 1 + local.get 3 + i32.add + local.tee 5 + i32.load + i32.store8 + local.get 4 + i32.const 1 + i32.add + local.get 5 + i32.load + i32.const 8 + i32.shr_u + i32.store8 + local.get 4 + i32.const 2 + i32.add + local.get 5 + i32.load16_u offset=2 + i32.store8 + local.get 4 + i32.const 3 + i32.add + local.get 5 + i32.load8_u offset=3 + i32.store8 + local.get 3 + i32.const 4 + i32.add + local.tee 3 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + i32.const 128 + i32.const 208 + call $__pragma_loopbound + i32.const -136 + local.set 3 + loop ;; label = @1 + local.get 1 + local.get 3 + i32.add + i32.const 136 + i32.add + i64.const 0 + i64.store align=1 + local.get 3 + i32.const 8 + i32.add + local.tee 3 + br_if 0 (;@1;) + end + local.get 2 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $md5_R_RandomUpdate (type 3) (param i32 i32 i32) (result i32) + (local i32) + global.get $__stack_pointer + i32.const 208 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + i64.const 0 + i64.store offset=136 align=4 + local.get 3 + i64.const 0 + i64.store offset=128 align=4 + local.get 3 + i64.const 0 + i64.store offset=120 align=4 + local.get 3 + i64.const 0 + i64.store offset=112 align=4 + local.get 3 + i64.const 0 + i64.store offset=104 align=4 + local.get 3 + i64.const 0 + i64.store offset=96 align=4 + local.get 3 + i64.const 0 + i64.store offset=88 align=4 + local.get 3 + i64.const 1167088121787636990 + i64.store offset=80 align=4 + local.get 3 + i64.const -1167088121787636991 + i64.store offset=72 align=4 + local.get 3 + i32.const 72 + i32.add + local.get 1 + local.get 2 + call $md5_update + local.get 3 + local.get 3 + i32.const 72 + i32.add + call $md5_final + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 0 + i32.load8_u offset=19 + local.get 3 + i32.load8_u offset=15 + i32.add + local.tee 1 + i32.store8 offset=19 + local.get 0 + local.get 1 + i32.const 255 + i32.and + local.get 1 + i32.ne + local.get 0 + i32.load8_u offset=18 + i32.add + local.get 3 + i32.load8_u offset=14 + i32.add + local.tee 1 + i32.store8 offset=18 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=17 + i32.add + local.get 3 + i32.load8_u offset=13 + i32.add + local.tee 1 + i32.store8 offset=17 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=16 + i32.add + local.get 3 + i32.load8_u offset=12 + i32.add + local.tee 1 + i32.store8 offset=16 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=15 + i32.add + local.get 3 + i32.load8_u offset=11 + i32.add + local.tee 1 + i32.store8 offset=15 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=14 + i32.add + local.get 3 + i32.load8_u offset=10 + i32.add + local.tee 1 + i32.store8 offset=14 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=13 + i32.add + local.get 3 + i32.load8_u offset=9 + i32.add + local.tee 1 + i32.store8 offset=13 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=12 + i32.add + local.get 3 + i32.load8_u offset=8 + i32.add + local.tee 1 + i32.store8 offset=12 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=11 + i32.add + local.get 3 + i32.load8_u offset=7 + i32.add + local.tee 1 + i32.store8 offset=11 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=10 + i32.add + local.get 3 + i32.load8_u offset=6 + i32.add + local.tee 1 + i32.store8 offset=10 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=9 + i32.add + local.get 3 + i32.load8_u offset=5 + i32.add + local.tee 1 + i32.store8 offset=9 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=8 + i32.add + local.get 3 + i32.load8_u offset=4 + i32.add + local.tee 1 + i32.store8 offset=8 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=7 + i32.add + local.get 3 + i32.load8_u offset=3 + i32.add + local.tee 1 + i32.store8 offset=7 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=6 + i32.add + local.get 3 + i32.load8_u offset=2 + i32.add + local.tee 1 + i32.store8 offset=6 + local.get 0 + local.get 1 + i32.const 8 + i32.shr_u + local.get 0 + i32.load8_u offset=5 + i32.add + local.get 3 + i32.load8_u offset=1 + i32.add + local.tee 1 + i32.store8 offset=5 + local.get 0 + local.get 0 + i32.load8_u offset=4 + local.get 1 + i32.const 8 + i32.shr_u + i32.add + local.get 3 + i32.load8_u + i32.add + i32.store8 offset=4 + local.get 0 + i32.const 0 + local.get 0 + i32.load + local.tee 1 + local.get 2 + i32.sub + local.tee 2 + local.get 2 + local.get 1 + i32.gt_u + select + i32.store + i32.const 16 + i32.const 64 + call $__pragma_loopbound + local.get 3 + i32.const 208 + i32.add + global.set $__stack_pointer + i32.const 0) + (func $md5_main (type 1) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 192 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 256 + i32.store offset=8 + i32.const 16 + i32.const 64 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=28 + local.get 0 + i64.const 0 + i64.store offset=20 align=4 + local.get 0 + i64.const 0 + i64.store offset=12 align=4 + i32.const 256 + i32.const 256 + call $__pragma_loopbound + loop ;; label = @1 + local.get 0 + i32.const 8 + i32.add + i32.const 1088 + i32.const 1 + call $md5_R_RandomUpdate + drop + local.get 0 + i32.load offset=8 + br_if 0 (;@1;) + end + i32.const 10 + i32.const 10 + call $__pragma_loopbound + local.get 0 + i32.const 48 + i32.add + i32.const 72 + i32.add + local.set 1 + i32.const 0 + local.set 2 + loop ;; label = @1 + i32.const 16 + i32.const 64 + call $__pragma_loopbound + i32.const 256 + local.set 3 + i32.const 256 + i32.const 256 + call $__pragma_loopbound + loop ;; label = @2 + local.get 0 + i64.const 0 + i64.store offset=104 align=4 + local.get 0 + i64.const 0 + i64.store offset=96 align=4 + local.get 0 + i64.const 0 + i64.store offset=88 align=4 + local.get 0 + i64.const 0 + i64.store offset=80 align=4 + local.get 0 + i64.const 0 + i64.store offset=72 align=4 + local.get 0 + i64.const 0 + i64.store offset=64 align=4 + local.get 0 + i64.const 1167088121787636990 + i64.store offset=56 align=4 + local.get 0 + i64.const -1167088121787636991 + i64.store offset=48 align=4 + i32.const 0 + local.set 4 + i32.const 0 + i32.const 55 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.load8_u offset=1088 + i32.store8 offset=120 + i32.const 2 + i32.const 16 + call $__pragma_loopbound + local.get 0 + i64.const 448 + i64.store offset=112 align=4 + local.get 0 + i64.const 8 + i64.store offset=184 align=1 + i32.const 0 + i32.const 55 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.load8_u offset=1024 + i32.store8 offset=121 + local.get 0 + i32.const 0 + i32.load offset=1025 align=1 + i32.store offset=122 align=2 + local.get 0 + i32.const 0 + i64.load offset=1029 align=1 + i64.store offset=126 align=2 + local.get 0 + i32.const 0 + i64.load offset=1037 align=1 + i64.store offset=134 align=2 + local.get 0 + i32.const 0 + i64.load offset=1045 align=1 + i64.store offset=142 align=2 + local.get 0 + i32.const 0 + i64.load offset=1053 align=1 + i64.store offset=150 align=2 + local.get 0 + i32.const 0 + i32.load offset=1061 align=1 + i32.store offset=158 align=2 + local.get 0 + i32.const 0 + i32.load16_u offset=1065 align=1 + i32.store16 offset=162 + local.get 0 + i32.const 0 + i32.load8_u offset=1067 + i32.store8 offset=164 + local.get 0 + i32.const 0 + i32.load8_u offset=1068 + i32.store8 offset=165 + local.get 0 + i32.const 0 + i64.load offset=1069 align=1 + i64.store offset=166 align=2 + local.get 0 + i32.const 0 + i32.load16_u offset=1077 align=1 + i32.store16 offset=174 + local.get 0 + local.get 0 + i32.load offset=112 + local.tee 5 + i32.const 64 + i32.add + i32.store offset=112 + local.get 0 + local.get 0 + i32.load offset=116 + local.get 5 + i32.const -65 + i32.gt_u + i32.add + i32.store offset=116 + block ;; label = @3 + local.get 5 + i32.const 3 + i32.shr_u + i32.const 63 + i32.and + local.tee 6 + i32.const 56 + i32.lt_u + br_if 0 (;@3;) + i32.const 0 + i32.const 55 + call $__pragma_loopbound + local.get 1 + local.get 6 + i32.add + local.tee 5 + local.get 0 + i32.load8_u offset=184 + i32.store8 + block ;; label = @4 + local.get 6 + i32.const 63 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=185 + i32.store8 offset=1 + local.get 6 + i32.const 62 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=186 + i32.store8 offset=2 + local.get 6 + i32.const 61 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=187 + i32.store8 offset=3 + local.get 6 + i32.const 60 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=188 + i32.store8 offset=4 + local.get 6 + i32.const 59 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=189 + i32.store8 offset=5 + local.get 6 + i32.const 58 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=190 + i32.store8 offset=6 + local.get 6 + i32.const 57 + i32.eq + br_if 0 (;@4;) + local.get 5 + local.get 0 + i32.load8_u offset=191 + i32.store8 offset=7 + end + i32.const 64 + local.get 6 + i32.sub + local.set 4 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $md5_transform + i32.const 0 + local.set 6 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + end + i32.const 0 + i32.const 55 + call $__pragma_loopbound + block ;; label = @3 + local.get 4 + i32.const 8 + i32.eq + br_if 0 (;@3;) + i32.const 8 + local.get 4 + i32.sub + local.tee 7 + i32.const 3 + i32.and + local.set 8 + i32.const 0 + local.set 5 + block ;; label = @4 + local.get 4 + i32.const -5 + i32.add + i32.const 3 + i32.lt_u + br_if 0 (;@4;) + local.get 0 + i32.const 184 + i32.add + local.get 4 + i32.add + local.set 9 + local.get 7 + i32.const -4 + i32.and + local.set 7 + local.get 0 + i32.const 48 + i32.add + local.get 6 + i32.add + local.set 10 + i32.const 0 + local.set 5 + loop ;; label = @5 + local.get 10 + local.get 5 + i32.add + i32.const 72 + i32.add + local.get 9 + local.get 5 + i32.add + i32.load align=1 + i32.store align=1 + local.get 7 + local.get 5 + i32.const 4 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@5;) + end + end + local.get 8 + i32.eqz + br_if 0 (;@3;) + local.get 1 + local.get 6 + local.get 5 + i32.add + i32.add + local.set 9 + local.get 0 + i32.const 184 + i32.add + local.get 5 + local.get 4 + i32.add + i32.add + local.set 5 + loop ;; label = @4 + local.get 9 + local.get 5 + i32.load8_u + i32.store8 + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 9 + i32.const 1 + i32.add + local.set 9 + local.get 8 + i32.const -1 + i32.add + local.tee 8 + br_if 0 (;@4;) + end + end + i32.const 2 + i32.const 16 + call $__pragma_loopbound + i32.const 128 + i32.const 208 + call $__pragma_loopbound + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 0 + i32.const 48 + i32.add + local.get 5 + i32.add + i64.const 0 + i64.store align=4 + local.get 5 + i32.const 8 + i32.add + local.tee 5 + i32.const 136 + i32.ne + br_if 0 (;@3;) + end + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const 16 + i32.const 64 + call $__pragma_loopbound + local.get 3 + i32.const 2 + i32.lt_u + local.set 5 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 5 + i32.eqz + br_if 0 (;@2;) + end + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 10 + i32.ne + br_if 0 (;@1;) + end + i32.const 0 + local.get 0 + i32.load offset=8 + i32.store offset=1092 + local.get 0 + i32.const 192 + i32.add + global.set $__stack_pointer) + (func $__original_main (type 4) (result i32) + call $md5_main + i32.const 0 + i32.load offset=1092) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5200)) + (global (;1;) i32 (i32.const 1096)) + (global (;2;) i32 (i32.const 5200)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $md5_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "\80\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")) diff --git a/targets/wasm-tacle/kernel/md5/generated/modified_sources/default/md5.c b/targets/wasm-tacle/kernel/md5/generated/modified_sources/default/md5.c new file mode 100644 index 0000000..4178255 --- /dev/null +++ b/targets/wasm-tacle/kernel/md5/generated/modified_sources/default/md5.c @@ -0,0 +1,644 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: md5.c + + Author: unknown + + Function: MD5 cryptographic hash function (see also RFC 1321). + + Source: RSA Data Security, Inc., MD5 message-digest algorithm + + Original name: md5c.c + + Changes: no major functional changes, inlined include files + + License: see below + +*/ + +// Description: This is the MD5 algorithm comming form the Diffie-Hellman +// application in the Netbench benchmark suite + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define RANDOM_BYTES_NEEDED 256 + +// Here, it can be defined how many keys should be exchanged +#define EXCHANGEKEYS 10 +////////////////////////// md5c.c ///////////////////// +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +//////// global.h /////////////// +// #include "global.h" +/* GLOBAL.H - RSAREF types and constants */ + +/* Copyright (C) RSA Laboratories, a division of RSA Data Security, + Inc., created 1991. All rights reserved. +*/ + +#ifndef _GLOBAL_H_ +#define _GLOBAL_H_ 1 + +/* PROTOTYPES should be set to one if and only if the compiler supports + function argument prototyping. + The following makes PROTOTYPES default to 1 if it has not already been + defined as 0 with C compiler flags. +*/ +#ifndef PROTOTYPES +#define PROTOTYPES 1 +#endif + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +#ifndef NULL_PTR +#define NULL_PTR ((POINTER) 0) +#endif + +#ifndef UNUSED_ARG +#define UNUSED_ARG(x) x = *(&x); +#endif + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. + If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. +*/ +#if PROTOTYPES +#define PROTO_LIST(list) list +#else +#define PROTO_LIST(list) () +#endif + +#endif /* end _GLOBAL_H_ */ +//////// end global.h /////////////// + +///////////// md5.h ////////////// +// #include "md5.h" +/* MD5.H - header file for MD5C.C + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +#ifndef _MD5_H_ +#define _MD5_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* MD5 context. */ +typedef struct { + UINT4 state[16]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +#ifdef __cplusplus +} +#endif + +#endif +/////////// end md5.h ///////// + +/* Constants for MD5Transform routine. + */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +/* Random structure. + */ +typedef struct { + unsigned int bytesNeeded; + unsigned char state[16]; + unsigned int outputAvailable; + unsigned char output[16]; +} R_RANDOM_STRUCT; + +void md5_orig_init PROTO_LIST((MD5_CTX *) ); +void md5_update PROTO_LIST((MD5_CTX *, unsigned char *, unsigned int) ); +void md5_final PROTO_LIST((unsigned char[64], MD5_CTX *) ); +void md5_memset PROTO_LIST((POINTER, int, unsigned int) ); +void md5_transform PROTO_LIST((UINT4[4], unsigned char[64])); +void md5_encode PROTO_LIST((unsigned char *, UINT4 *, int) ); +void md5_decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int) ); +void md5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int) ); +void md5_R_memset(POINTER output, int value, unsigned int len); +void md5_memset_x(unsigned char *ptr, int value, unsigned long len); +int md5_R_RandomInit(R_RANDOM_STRUCT *randomStruct); +int md5_R_RandomUpdate(R_RANDOM_STRUCT *randomStruct, unsigned char *block, + unsigned int blockLen); +void md5_InitRandomStruct(R_RANDOM_STRUCT *randomStruct); +int md5_R_GetRandomBytesNeeded(unsigned int *bytesNeeded, + R_RANDOM_STRUCT *randomStruct); + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +md5_main(void); +void md5_init(void); +int md5_return(void); +int md5_bytesNeeded; + +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +unsigned char md5_PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + Rotation is separate from addition to prevent recomputation. +*/ +#define FF(a, b, c, d, x, s, ac) \ + { \ + (a) += F((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) \ + { \ + (a) += G((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) \ + { \ + (a) += H((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) \ + { \ + (a) += I((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void +md5_orig_init(MD5_CTX *context) /* context */ +{ + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. + */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; + context->state[4] = 0x0; + context->state[5] = 0x0; + context->state[6] = 0x0; + context->state[7] = 0x0; + context->state[8] = 0x0; + context->state[9] = 0x0; + context->state[10] = 0x0; + context->state[11] = 0x0; + context->state[12] = 0x0; + context->state[13] = 0x0; + context->state[14] = 0x0; + context->state[15] = 0x0; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. +*/ +void +md5_update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) +// MD5_CTX *context; /* context */ +// unsigned char *input; /* input block */ +// unsigned int inputLen; /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int) ((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4) inputLen << 3)) < + ((UINT4) inputLen << 3)) + context->count[1]++; + context->count[1] += ((UINT4) inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. + */ + if (inputLen >= partLen) { + md5_memcpy((POINTER) &context->buffer[index], (POINTER) input, partLen); + md5_transform(context->state, context->buffer); + + __pragma_loopbound(0, 0); + for (i = partLen; i + 63 < inputLen; i += 64) + md5_transform(context->state, &input[i]); + + index = 0; + } else + i = 0; + + /* Buffer remaining input */ + md5_memcpy((POINTER) &context->buffer[index], (POINTER) &input[i], + inputLen - i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. +*/ +void +md5_final(unsigned char digest[64], MD5_CTX *context) +// unsigned char digest[ 16 ]; /* message digest */ +// MD5_CTX *context; /* context */ +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + md5_encode(bits, context->count, 8); + + /* Pad out to 56 mod 64. + */ + index = (unsigned int) ((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + md5_update(context, md5_PADDING, padLen); + + /* Append length (before padding) */ + md5_update(context, bits, 8); + + /* Store state in digest */ + md5_encode(digest, context->state, 64); + + /* Zeroize sensitive information. + */ + md5_memset((POINTER) context, 0, sizeof(*context)); +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +void +md5_memset(POINTER output, int value, unsigned int len) { + unsigned int i; + + __pragma_loopbound(128, 208); + for (i = 0; i < len; i++) + ((char *) output)[i] = (char) value; +} + +/* MD5 basic transformation. Transforms state based on block. + */ +void +md5_transform(UINT4 state[4], unsigned char block[64]) { + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + md5_decode(x, block, 64); + + /* Round 1 */ + FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ + FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ + FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ + FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ + FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ + FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ + FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ + FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ + FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ + FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ + FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ + GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ + GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ + GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ + GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ + GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ + GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ + GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ + GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ + GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ + GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ + HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ + HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ + HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ + HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ + HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ + HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ + HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ + HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ + HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ + II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ + II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ + II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ + II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ + II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ + II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ + II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ + II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ + II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + md5_memset((POINTER) x, 0, sizeof(x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. +*/ +void +md5_encode(unsigned char *output, UINT4 *input, int len) { + int i = 0, j; + + __pragma_loopbound(2, 16); + for (j = 0; j < len; j += 4) { + output[j] = (unsigned char) (input[i] & 0xff); + output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff); + output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff); + output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff); + ++i; + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. +*/ +void +md5_decode(UINT4 *output, unsigned char *input, unsigned int len) { + unsigned int i, j; + + __pragma_loopbound(16, 16); + for (i = 0, j = 0; j < len; i++, j += 4) { + output[i] = ((UINT4) input[j]) | (((UINT4) input[j + 1]) << 8) | + (((UINT4) input[j + 2]) << 16) | + (((UINT4) input[j + 3]) << 24); + } +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ +void +md5_memcpy(POINTER output, POINTER input, unsigned int len) { + unsigned int i; + + __pragma_loopbound(0, 55); + for (i = 0; i < len; i++) + output[i] = input[i]; +} + +/////////////////// end md5c.c //////////////////////// + +void +md5_R_memset(POINTER output, int value, unsigned int len) +// POINTER output; /* output block +// */ int value; /* +// value */ unsigned int len; /* length +// of block */ +{ + if (len) + md5_memset_x(output, value, len); +} + +// Basic implementation of C's memset +void +md5_memset_x(unsigned char *ptr, int value, unsigned long len) { + __pragma_loopbound(16, 64); + while (len--) + *ptr++ = value; + + return; +} + +int +md5_R_RandomInit(R_RANDOM_STRUCT *randomStruct) +// R_RANDOM_STRUCT *randomStruct; /* new random structure +// */ +{ + randomStruct->bytesNeeded = RANDOM_BYTES_NEEDED; + md5_R_memset((POINTER) randomStruct->state, 0, sizeof(randomStruct->state)); + randomStruct->outputAvailable = 0; + + return (0); +} + +int +md5_R_RandomUpdate(R_RANDOM_STRUCT *randomStruct, unsigned char *block, + unsigned int blockLen) +// R_RANDOM_STRUCT *randomStruct; /* random structure +// */ unsigned char *block; /* block of values to mix +// in */ unsigned int blockLen; /* length of +// block */ +{ + MD5_CTX context; + unsigned char digest[64]; + unsigned int i, x; + + md5_orig_init(&context); + md5_update(&context, block, blockLen); + md5_final(digest, &context); + + /* add digest to state */ + x = 0; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; i++) { + x += randomStruct->state[15 - i] + digest[15 - i]; + randomStruct->state[15 - i] = (unsigned char) x; + x >>= 8; + } + + if (randomStruct->bytesNeeded < blockLen) + randomStruct->bytesNeeded = 0; + else + randomStruct->bytesNeeded -= blockLen; + + /* Zeroize sensitive information. + */ + md5_R_memset((POINTER) digest, 0, sizeof(digest)); + + return (0); +} + +/* Initialize the random structure with all zero seed bytes for test purposes. + NOTE that this will cause the output of the "random" process to be + the same every time. To produce random bytes, the random struct + needs random seeds! +*/ +void +md5_InitRandomStruct(R_RANDOM_STRUCT *randomStruct) { + static unsigned char seedByte = 0; + unsigned int bytesNeeded; + + md5_R_RandomInit(randomStruct); + + /* Initialize with all zero seed bytes, which will not yield an actual + random number output. + */ + __pragma_loopbound(256, 256); + while (1) { + md5_R_GetRandomBytesNeeded(&bytesNeeded, randomStruct); + if (bytesNeeded == 0) + break; + + md5_R_RandomUpdate(randomStruct, &seedByte, 1); + } +} + +int +md5_R_GetRandomBytesNeeded(unsigned int *bytesNeeded, + R_RANDOM_STRUCT *randomStruct) +// unsigned int *bytesNeeded; /* number of mix-in bytes needed +// */ R_RANDOM_STRUCT *randomStruct; /* random +// structure */ +{ + *bytesNeeded = randomStruct->bytesNeeded; + + return (0); +} + +void +md5_init(void) { + // no initialisation needed +} + +int +md5_return(void) { + return md5_bytesNeeded; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +md5_main(void) { + R_RANDOM_STRUCT randomStruct; + R_RANDOM_STRUCT randomStruct2; + /* We first generate parameters, and then do some key exchange each followed + * by a key computation...*/ + int keys_exchanged = 0; + + md5_InitRandomStruct(&randomStruct); + + __pragma_loopbound(10, 10); + while (keys_exchanged != EXCHANGEKEYS) { + keys_exchanged++; + md5_InitRandomStruct(&randomStruct2); + } + + md5_bytesNeeded = randomStruct.bytesNeeded + randomStruct2.bytesNeeded; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + md5_init(); + md5_main(); + // printf("%d\n", ret); + return md5_return(); +} diff --git a/targets/wasm-tacle/kernel/md5/generated/modified_sources/inline/md5.c b/targets/wasm-tacle/kernel/md5/generated/modified_sources/inline/md5.c new file mode 100644 index 0000000..66def36 --- /dev/null +++ b/targets/wasm-tacle/kernel/md5/generated/modified_sources/inline/md5.c @@ -0,0 +1,658 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: md5.c + + Author: unknown + + Function: MD5 cryptographic hash function (see also RFC 1321). + + Source: RSA Data Security, Inc., MD5 message-digest algorithm + + Original name: md5c.c + + Changes: no major functional changes, inlined include files + + License: see below + +*/ + +// Description: This is the MD5 algorithm comming form the Diffie-Hellman +// application in the Netbench benchmark suite + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define RANDOM_BYTES_NEEDED 256 + +// Here, it can be defined how many keys should be exchanged +#define EXCHANGEKEYS 10 +////////////////////////// md5c.c ///////////////////// +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +//////// global.h /////////////// +// #include "global.h" +/* GLOBAL.H - RSAREF types and constants */ + +/* Copyright (C) RSA Laboratories, a division of RSA Data Security, + Inc., created 1991. All rights reserved. +*/ + +#ifndef _GLOBAL_H_ +#define _GLOBAL_H_ 1 + +/* PROTOTYPES should be set to one if and only if the compiler supports + function argument prototyping. + The following makes PROTOTYPES default to 1 if it has not already been + defined as 0 with C compiler flags. +*/ +#ifndef PROTOTYPES +#define PROTOTYPES 1 +#endif + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +#ifndef NULL_PTR +#define NULL_PTR ((POINTER) 0) +#endif + +#ifndef UNUSED_ARG +#define UNUSED_ARG(x) x = *(&x); +#endif + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. + If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. +*/ +#if PROTOTYPES +#define PROTO_LIST(list) list +#else +#define PROTO_LIST(list) () +#endif + +#endif /* end _GLOBAL_H_ */ +//////// end global.h /////////////// + +///////////// md5.h ////////////// +// #include "md5.h" +/* MD5.H - header file for MD5C.C + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +#ifndef _MD5_H_ +#define _MD5_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* MD5 context. */ +typedef struct { + UINT4 state[16]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +#ifdef __cplusplus +} +#endif + +#endif +/////////// end md5.h ///////// + +/* Constants for MD5Transform routine. + */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +/* Random structure. + */ +typedef struct { + unsigned int bytesNeeded; + unsigned char state[16]; + unsigned int outputAvailable; + unsigned char output[16]; +} R_RANDOM_STRUCT; + +void md5_orig_init PROTO_LIST((MD5_CTX *) ); +void md5_update PROTO_LIST((MD5_CTX *, unsigned char *, unsigned int) ); +void md5_final PROTO_LIST((unsigned char[64], MD5_CTX *) ); +void md5_memset PROTO_LIST((POINTER, int, unsigned int) ); +void md5_transform PROTO_LIST((UINT4[4], unsigned char[64])); +void md5_encode PROTO_LIST((unsigned char *, UINT4 *, int) ); +void md5_decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int) ); +void md5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int) ); +__attribute__((always_inline)) static inline void +md5_R_memset(POINTER output, int value, unsigned int len); +__attribute__((always_inline)) static inline void +md5_memset_x(unsigned char *ptr, int value, unsigned long len); +__attribute__((always_inline)) static inline int +md5_R_RandomInit(R_RANDOM_STRUCT *randomStruct); +__attribute__((always_inline)) static inline int +md5_R_RandomUpdate(R_RANDOM_STRUCT *randomStruct, unsigned char *block, + unsigned int blockLen); +__attribute__((always_inline)) static inline void +md5_InitRandomStruct(R_RANDOM_STRUCT *randomStruct); +__attribute__((always_inline)) static inline int +md5_R_GetRandomBytesNeeded(unsigned int *bytesNeeded, + R_RANDOM_STRUCT *randomStruct); + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +md5_main(void); +__attribute__((always_inline)) static inline void md5_init(void); +__attribute__((always_inline)) static inline int md5_return(void); +int md5_bytesNeeded; + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +unsigned char md5_PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + Rotation is separate from addition to prevent recomputation. +*/ +#define FF(a, b, c, d, x, s, ac) \ + { \ + (a) += F((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) \ + { \ + (a) += G((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) \ + { \ + (a) += H((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) \ + { \ + (a) += I((b), (c), (d)) + (x) + (UINT4) (ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void +md5_orig_init(MD5_CTX *context) /* context */ +{ + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. + */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; + context->state[4] = 0x0; + context->state[5] = 0x0; + context->state[6] = 0x0; + context->state[7] = 0x0; + context->state[8] = 0x0; + context->state[9] = 0x0; + context->state[10] = 0x0; + context->state[11] = 0x0; + context->state[12] = 0x0; + context->state[13] = 0x0; + context->state[14] = 0x0; + context->state[15] = 0x0; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. +*/ +__attribute__((always_inline)) static inline void +md5_update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) +// MD5_CTX *context; /* context */ +// unsigned char *input; /* input block */ +// unsigned int inputLen; /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int) ((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4) inputLen << 3)) < + ((UINT4) inputLen << 3)) + context->count[1]++; + context->count[1] += ((UINT4) inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. + */ + if (inputLen >= partLen) { + md5_memcpy((POINTER) &context->buffer[index], (POINTER) input, partLen); + md5_transform(context->state, context->buffer); + + __pragma_loopbound(0, 0); + for (i = partLen; i + 63 < inputLen; i += 64) + md5_transform(context->state, &input[i]); + + index = 0; + } else + i = 0; + + /* Buffer remaining input */ + md5_memcpy((POINTER) &context->buffer[index], (POINTER) &input[i], + inputLen - i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. +*/ +__attribute__((always_inline)) static inline void +md5_final(unsigned char digest[64], MD5_CTX *context) +// unsigned char digest[ 16 ]; /* message digest */ +// MD5_CTX *context; /* context */ +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + md5_encode(bits, context->count, 8); + + /* Pad out to 56 mod 64. + */ + index = (unsigned int) ((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + md5_update(context, md5_PADDING, padLen); + + /* Append length (before padding) */ + md5_update(context, bits, 8); + + /* Store state in digest */ + md5_encode(digest, context->state, 64); + + /* Zeroize sensitive information. + */ + md5_memset((POINTER) context, 0, sizeof(*context)); +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +__attribute__((always_inline)) static inline void +md5_memset(POINTER output, int value, unsigned int len) { + unsigned int i; + + __pragma_loopbound(128, 208); + for (i = 0; i < len; i++) + ((char *) output)[i] = (char) value; +} + +/* MD5 basic transformation. Transforms state based on block. + */ +__attribute__((always_inline)) static inline void +md5_transform(UINT4 state[4], unsigned char block[64]) { + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + md5_decode(x, block, 64); + + /* Round 1 */ + FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ + FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ + FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ + FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ + FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ + FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ + FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ + FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ + FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ + FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ + FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ + GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ + GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ + GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ + GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ + GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ + GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ + GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ + GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ + GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ + GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ + HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ + HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ + HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ + HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ + HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ + HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ + HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ + HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ + HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ + II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ + II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ + II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ + II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ + II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ + II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ + II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ + II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ + II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + md5_memset((POINTER) x, 0, sizeof(x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. +*/ +__attribute__((always_inline)) static inline void +md5_encode(unsigned char *output, UINT4 *input, int len) { + int i = 0, j; + + __pragma_loopbound(2, 16); + for (j = 0; j < len; j += 4) { + output[j] = (unsigned char) (input[i] & 0xff); + output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff); + output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff); + output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff); + ++i; + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. +*/ +__attribute__((always_inline)) static inline void +md5_decode(UINT4 *output, unsigned char *input, unsigned int len) { + unsigned int i, j; + + __pragma_loopbound(16, 16); + for (i = 0, j = 0; j < len; i++, j += 4) { + output[i] = ((UINT4) input[j]) | (((UINT4) input[j + 1]) << 8) | + (((UINT4) input[j + 2]) << 16) | + (((UINT4) input[j + 3]) << 24); + } +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ +__attribute__((always_inline)) static inline void +md5_memcpy(POINTER output, POINTER input, unsigned int len) { + unsigned int i; + + __pragma_loopbound(0, 55); + for (i = 0; i < len; i++) + output[i] = input[i]; +} + +/////////////////// end md5c.c //////////////////////// + +__attribute__((always_inline)) static inline void +md5_R_memset(POINTER output, int value, unsigned int len) +// POINTER output; /* output block +// */ int value; /* +// value */ unsigned int len; /* length +// of block */ +{ + if (len) + md5_memset_x(output, value, len); +} + +// Basic implementation of C's memset +__attribute__((always_inline)) static inline void +md5_memset_x(unsigned char *ptr, int value, unsigned long len) { + __pragma_loopbound(16, 64); + while (len--) + *ptr++ = value; + + return; +} + +__attribute__((always_inline)) static inline int +md5_R_RandomInit(R_RANDOM_STRUCT *randomStruct) +// R_RANDOM_STRUCT *randomStruct; /* new random structure +// */ +{ + randomStruct->bytesNeeded = RANDOM_BYTES_NEEDED; + md5_R_memset((POINTER) randomStruct->state, 0, sizeof(randomStruct->state)); + randomStruct->outputAvailable = 0; + + return (0); +} + +__attribute__((always_inline)) static inline int +md5_R_RandomUpdate(R_RANDOM_STRUCT *randomStruct, unsigned char *block, + unsigned int blockLen) +// R_RANDOM_STRUCT *randomStruct; /* random structure +// */ unsigned char *block; /* block of values to mix +// in */ unsigned int blockLen; /* length of +// block */ +{ + MD5_CTX context; + unsigned char digest[64]; + unsigned int i, x; + + md5_orig_init(&context); + md5_update(&context, block, blockLen); + md5_final(digest, &context); + + /* add digest to state */ + x = 0; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; i++) { + x += randomStruct->state[15 - i] + digest[15 - i]; + randomStruct->state[15 - i] = (unsigned char) x; + x >>= 8; + } + + if (randomStruct->bytesNeeded < blockLen) + randomStruct->bytesNeeded = 0; + else + randomStruct->bytesNeeded -= blockLen; + + /* Zeroize sensitive information. + */ + md5_R_memset((POINTER) digest, 0, sizeof(digest)); + + return (0); +} + +/* Initialize the random structure with all zero seed bytes for test purposes. + NOTE that this will cause the output of the "random" process to be + the same every time. To produce random bytes, the random struct + needs random seeds! +*/ +__attribute__((always_inline)) static inline void +md5_InitRandomStruct(R_RANDOM_STRUCT *randomStruct) { + static unsigned char seedByte = 0; + unsigned int bytesNeeded; + + md5_R_RandomInit(randomStruct); + + /* Initialize with all zero seed bytes, which will not yield an actual + random number output. + */ + __pragma_loopbound(256, 256); + while (1) { + md5_R_GetRandomBytesNeeded(&bytesNeeded, randomStruct); + if (bytesNeeded == 0) + break; + + md5_R_RandomUpdate(randomStruct, &seedByte, 1); + } +} + +__attribute__((always_inline)) static inline int +md5_R_GetRandomBytesNeeded(unsigned int *bytesNeeded, + R_RANDOM_STRUCT *randomStruct) +// unsigned int *bytesNeeded; /* number of mix-in bytes needed +// */ R_RANDOM_STRUCT *randomStruct; /* random +// structure */ +{ + *bytesNeeded = randomStruct->bytesNeeded; + + return (0); +} + +__attribute__((always_inline)) static inline void +md5_init(void) { + // no initialisation needed +} + +__attribute__((always_inline)) static inline int +md5_return(void) { + return md5_bytesNeeded; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +md5_main(void) { + R_RANDOM_STRUCT randomStruct; + R_RANDOM_STRUCT randomStruct2; + /* We first generate parameters, and then do some key exchange each followed + * by a key computation...*/ + int keys_exchanged = 0; + + md5_InitRandomStruct(&randomStruct); + + __pragma_loopbound(10, 10); + while (keys_exchanged != EXCHANGEKEYS) { + keys_exchanged++; + md5_InitRandomStruct(&randomStruct2); + } + + md5_bytesNeeded = randomStruct.bytesNeeded + randomStruct2.bytesNeeded; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + md5_init(); + md5_main(); + // printf("%d\n", ret); + return md5_return(); +} diff --git a/targets/wasm-tacle/kernel/md5/md5.c b/targets/wasm-tacle/kernel/md5/md5.c new file mode 100755 index 0000000..09ab091 --- /dev/null +++ b/targets/wasm-tacle/kernel/md5/md5.c @@ -0,0 +1,632 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: md5.c + + Author: unknown + + Function: MD5 cryptographic hash function (see also RFC 1321). + + Source: RSA Data Security, Inc., MD5 message-digest algorithm + + Original name: md5c.c + + Changes: no major functional changes, inlined include files + + License: see below + +*/ + +// Description: This is the MD5 algorithm comming form the Diffie-Hellman +// application in the Netbench benchmark suite + +#define RANDOM_BYTES_NEEDED 256 + +// Here, it can be defined how many keys should be exchanged +#define EXCHANGEKEYS 10 +////////////////////////// md5c.c ///////////////////// +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm +*/ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +//////// global.h /////////////// +//#include "global.h" +/* GLOBAL.H - RSAREF types and constants */ + +/* Copyright (C) RSA Laboratories, a division of RSA Data Security, + Inc., created 1991. All rights reserved. +*/ + +#ifndef _GLOBAL_H_ +#define _GLOBAL_H_ 1 + +/* PROTOTYPES should be set to one if and only if the compiler supports + function argument prototyping. + The following makes PROTOTYPES default to 1 if it has not already been + defined as 0 with C compiler flags. +*/ +#ifndef PROTOTYPES +#define PROTOTYPES 1 +#endif + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +#ifndef NULL_PTR +#define NULL_PTR ((POINTER)0) +#endif + +#ifndef UNUSED_ARG +#define UNUSED_ARG(x) x = *(&x); +#endif + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. + If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. +*/ +#if PROTOTYPES +#define PROTO_LIST(list) list +#else +#define PROTO_LIST(list) () +#endif + +#endif /* end _GLOBAL_H_ */ +//////// end global.h /////////////// + + +///////////// md5.h ////////////// +//#include "md5.h" +/* MD5.H - header file for MD5C.C +*/ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +#ifndef _MD5_H_ +#define _MD5_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* MD5 context. */ +typedef struct { + UINT4 state[ 16 ]; /* state (ABCD) */ + UINT4 count[ 2 ]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[ 64 ]; /* input buffer */ +} MD5_CTX; + +#ifdef __cplusplus +} +#endif + +#endif +/////////// end md5.h ///////// + +/* Constants for MD5Transform routine. +*/ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +/* Random structure. +*/ +typedef struct { + unsigned int bytesNeeded; + unsigned char state[ 16 ]; + unsigned int outputAvailable; + unsigned char output[ 16 ]; +} R_RANDOM_STRUCT; + +void md5_orig_init PROTO_LIST ( ( MD5_CTX * ) ); +void md5_update PROTO_LIST ( ( MD5_CTX *, unsigned char *, unsigned int ) ); +void md5_final PROTO_LIST ( ( unsigned char [ 64 ], MD5_CTX * ) ); +void md5_memset PROTO_LIST ( ( POINTER, int, unsigned int ) ); +void md5_transform PROTO_LIST ( ( UINT4 [ 4 ], unsigned char [ 64 ] ) ); +void md5_encode PROTO_LIST ( ( unsigned char *, UINT4 *, int ) ); +void md5_decode PROTO_LIST ( ( UINT4 *, unsigned char *, unsigned int ) ); +void md5_memcpy PROTO_LIST ( ( POINTER, POINTER, unsigned int ) ); +void md5_R_memset ( POINTER output, int value, unsigned int len ); +void md5_memset_x( unsigned char *ptr, int value, unsigned long len ); +int md5_R_RandomInit ( R_RANDOM_STRUCT *randomStruct ); +int md5_R_RandomUpdate ( R_RANDOM_STRUCT *randomStruct, unsigned char *block, + unsigned int blockLen ); +void md5_InitRandomStruct ( R_RANDOM_STRUCT *randomStruct ); +int md5_R_GetRandomBytesNeeded ( unsigned int *bytesNeeded, + R_RANDOM_STRUCT *randomStruct ); + +void md5_main( void ); +void md5_init( void ); +int md5_return( void ); +int md5_bytesNeeded; + +int main( void ); + +unsigned char md5_PADDING[ 64 ] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. +*/ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. +*/ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + Rotation is separate from addition to prevent recomputation. +*/ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + + +/* MD5 initialization. Begins an MD5 operation, writing a new context. +*/ +void md5_orig_init ( MD5_CTX + *context ) /* context */ +{ + context->count[ 0 ] = context->count[ 1 ] = 0; + + /* Load magic initialization constants. + */ + context->state[ 0 ] = 0x67452301; + context->state[ 1 ] = 0xefcdab89; + context->state[ 2 ] = 0x98badcfe; + context->state[ 3 ] = 0x10325476; + context->state[ 4 ] = 0x0; + context->state[ 5 ] = 0x0; + context->state[ 6 ] = 0x0; + context->state[ 7 ] = 0x0; + context->state[ 8 ] = 0x0; + context->state[ 9 ] = 0x0; + context->state[ 10 ] = 0x0; + context->state[ 11 ] = 0x0; + context->state[ 12 ] = 0x0; + context->state[ 13 ] = 0x0; + context->state[ 14 ] = 0x0; + context->state[ 15 ] = 0x0; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. +*/ +void md5_update ( MD5_CTX *context, unsigned char *input, + unsigned int inputLen ) +//MD5_CTX *context; /* context */ +//unsigned char *input; /* input block */ +//unsigned int inputLen; /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = ( unsigned int )( ( context->count[ 0 ] >> 3 ) & 0x3F ); + + /* Update number of bits */ + if ( ( context->count[ 0 ] += ( ( UINT4 )inputLen << 3 ) ) + < ( ( UINT4 )inputLen << 3 ) ) + context->count[ 1 ]++; + context->count[ 1 ] += ( ( UINT4 )inputLen >> 29 ); + + partLen = 64 - index; + + /* Transform as many times as possible. + */ + if ( inputLen >= partLen ) { + md5_memcpy ( ( POINTER )&context->buffer[ index ], ( POINTER )input, partLen ); + md5_transform ( context->state, context->buffer ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = partLen; i + 63 < inputLen; i += 64 ) + md5_transform ( context->state, &input[ i ] ); + + index = 0; + } else + i = 0; + + /* Buffer remaining input */ + md5_memcpy ( ( POINTER )&context->buffer[ index ], ( POINTER )&input[ i ], + inputLen - i ); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. +*/ +void md5_final ( unsigned char digest[ 64 ], MD5_CTX *context ) +//unsigned char digest[ 16 ]; /* message digest */ +//MD5_CTX *context; /* context */ +{ + unsigned char bits[ 8 ]; + unsigned int index, padLen; + + /* Save number of bits */ + md5_encode ( bits, context->count, 8 ); + + /* Pad out to 56 mod 64. + */ + index = ( unsigned int )( ( context->count[ 0 ] >> 3 ) & 0x3f ); + padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index ); + md5_update ( context, md5_PADDING, padLen ); + + /* Append length (before padding) */ + md5_update ( context, bits, 8 ); + + /* Store state in digest */ + md5_encode ( digest, context->state, 64 ); + + /* Zeroize sensitive information. + */ + md5_memset ( ( POINTER )context, 0, sizeof ( *context ) ); +} + +/* Note: Replace "for loop" with standard memset if possible. +*/ +void md5_memset ( POINTER output, int value, unsigned int len ) +{ + unsigned int i; + + _Pragma( "loopbound min 128 max 208" ) + for ( i = 0; i < len; i++ ) + ( ( char * )output )[ i ] = ( char )value; +} + +/* MD5 basic transformation. Transforms state based on block. +*/ +void md5_transform ( UINT4 state[ 4 ], unsigned char block[ 64 ] ) +{ + UINT4 a = state[ 0 ], b = state[ 1 ], c = state[ 2 ], d = state[ 3 ], x[ 16 ]; + + md5_decode ( x, block, 64 ); + + /* Round 1 */ + FF ( a, b, c, d, x[ 0 ], S11, 0xd76aa478 ); /* 1 */ + FF ( d, a, b, c, x[ 1 ], S12, 0xe8c7b756 ); /* 2 */ + FF ( c, d, a, b, x[ 2 ], S13, 0x242070db ); /* 3 */ + FF ( b, c, d, a, x[ 3 ], S14, 0xc1bdceee ); /* 4 */ + FF ( a, b, c, d, x[ 4 ], S11, 0xf57c0faf ); /* 5 */ + FF ( d, a, b, c, x[ 5 ], S12, 0x4787c62a ); /* 6 */ + FF ( c, d, a, b, x[ 6 ], S13, 0xa8304613 ); /* 7 */ + FF ( b, c, d, a, x[ 7 ], S14, 0xfd469501 ); /* 8 */ + FF ( a, b, c, d, x[ 8 ], S11, 0x698098d8 ); /* 9 */ + FF ( d, a, b, c, x[ 9 ], S12, 0x8b44f7af ); /* 10 */ + FF ( c, d, a, b, x[ 10 ], S13, 0xffff5bb1 ); /* 11 */ + FF ( b, c, d, a, x[ 11 ], S14, 0x895cd7be ); /* 12 */ + FF ( a, b, c, d, x[ 12 ], S11, 0x6b901122 ); /* 13 */ + FF ( d, a, b, c, x[ 13 ], S12, 0xfd987193 ); /* 14 */ + FF ( c, d, a, b, x[ 14 ], S13, 0xa679438e ); /* 15 */ + FF ( b, c, d, a, x[ 15 ], S14, 0x49b40821 ); /* 16 */ + + /* Round 2 */ + GG ( a, b, c, d, x[ 1 ], S21, 0xf61e2562 ); /* 17 */ + GG ( d, a, b, c, x[ 6 ], S22, 0xc040b340 ); /* 18 */ + GG ( c, d, a, b, x[ 11 ], S23, 0x265e5a51 ); /* 19 */ + GG ( b, c, d, a, x[ 0 ], S24, 0xe9b6c7aa ); /* 20 */ + GG ( a, b, c, d, x[ 5 ], S21, 0xd62f105d ); /* 21 */ + GG ( d, a, b, c, x[ 10 ], S22, 0x2441453 ); /* 22 */ + GG ( c, d, a, b, x[ 15 ], S23, 0xd8a1e681 ); /* 23 */ + GG ( b, c, d, a, x[ 4 ], S24, 0xe7d3fbc8 ); /* 24 */ + GG ( a, b, c, d, x[ 9 ], S21, 0x21e1cde6 ); /* 25 */ + GG ( d, a, b, c, x[ 14 ], S22, 0xc33707d6 ); /* 26 */ + GG ( c, d, a, b, x[ 3 ], S23, 0xf4d50d87 ); /* 27 */ + GG ( b, c, d, a, x[ 8 ], S24, 0x455a14ed ); /* 28 */ + GG ( a, b, c, d, x[ 13 ], S21, 0xa9e3e905 ); /* 29 */ + GG ( d, a, b, c, x[ 2 ], S22, 0xfcefa3f8 ); /* 30 */ + GG ( c, d, a, b, x[ 7 ], S23, 0x676f02d9 ); /* 31 */ + GG ( b, c, d, a, x[ 12 ], S24, 0x8d2a4c8a ); /* 32 */ + + /* Round 3 */ + HH ( a, b, c, d, x[ 5 ], S31, 0xfffa3942 ); /* 33 */ + HH ( d, a, b, c, x[ 8 ], S32, 0x8771f681 ); /* 34 */ + HH ( c, d, a, b, x[ 11 ], S33, 0x6d9d6122 ); /* 35 */ + HH ( b, c, d, a, x[ 14 ], S34, 0xfde5380c ); /* 36 */ + HH ( a, b, c, d, x[ 1 ], S31, 0xa4beea44 ); /* 37 */ + HH ( d, a, b, c, x[ 4 ], S32, 0x4bdecfa9 ); /* 38 */ + HH ( c, d, a, b, x[ 7 ], S33, 0xf6bb4b60 ); /* 39 */ + HH ( b, c, d, a, x[ 10 ], S34, 0xbebfbc70 ); /* 40 */ + HH ( a, b, c, d, x[ 13 ], S31, 0x289b7ec6 ); /* 41 */ + HH ( d, a, b, c, x[ 0 ], S32, 0xeaa127fa ); /* 42 */ + HH ( c, d, a, b, x[ 3 ], S33, 0xd4ef3085 ); /* 43 */ + HH ( b, c, d, a, x[ 6 ], S34, 0x4881d05 ); /* 44 */ + HH ( a, b, c, d, x[ 9 ], S31, 0xd9d4d039 ); /* 45 */ + HH ( d, a, b, c, x[ 12 ], S32, 0xe6db99e5 ); /* 46 */ + HH ( c, d, a, b, x[ 15 ], S33, 0x1fa27cf8 ); /* 47 */ + HH ( b, c, d, a, x[ 2 ], S34, 0xc4ac5665 ); /* 48 */ + + /* Round 4 */ + II ( a, b, c, d, x[ 0 ], S41, 0xf4292244 ); /* 49 */ + II ( d, a, b, c, x[ 7 ], S42, 0x432aff97 ); /* 50 */ + II ( c, d, a, b, x[ 14 ], S43, 0xab9423a7 ); /* 51 */ + II ( b, c, d, a, x[ 5 ], S44, 0xfc93a039 ); /* 52 */ + II ( a, b, c, d, x[ 12 ], S41, 0x655b59c3 ); /* 53 */ + II ( d, a, b, c, x[ 3 ], S42, 0x8f0ccc92 ); /* 54 */ + II ( c, d, a, b, x[ 10 ], S43, 0xffeff47d ); /* 55 */ + II ( b, c, d, a, x[ 1 ], S44, 0x85845dd1 ); /* 56 */ + II ( a, b, c, d, x[ 8 ], S41, 0x6fa87e4f ); /* 57 */ + II ( d, a, b, c, x[ 15 ], S42, 0xfe2ce6e0 ); /* 58 */ + II ( c, d, a, b, x[ 6 ], S43, 0xa3014314 ); /* 59 */ + II ( b, c, d, a, x[ 13 ], S44, 0x4e0811a1 ); /* 60 */ + II ( a, b, c, d, x[ 4 ], S41, 0xf7537e82 ); /* 61 */ + II ( d, a, b, c, x[ 11 ], S42, 0xbd3af235 ); /* 62 */ + II ( c, d, a, b, x[ 2 ], S43, 0x2ad7d2bb ); /* 63 */ + II ( b, c, d, a, x[ 9 ], S44, 0xeb86d391 ); /* 64 */ + + state[ 0 ] += a; + state[ 1 ] += b; + state[ 2 ] += c; + state[ 3 ] += d; + + /* Zeroize sensitive information. + */ + md5_memset ( ( POINTER )x, 0, sizeof ( x ) ); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. +*/ +void md5_encode ( unsigned char *output, UINT4 *input, int len ) +{ + int i = 0, + j; + + _Pragma( "loopbound min 2 max 16" ) + for ( j = 0; j < len; j += 4 ) { + output[ j ] = ( unsigned char )( input[ i ] & 0xff ); + output[ j + 1 ] = ( unsigned char )( ( input[ i ] >> 8 ) & 0xff ); + output[ j + 2 ] = ( unsigned char )( ( input[ i ] >> 16 ) & 0xff ); + output[ j + 3 ] = ( unsigned char )( ( input[ i ] >> 24 ) & 0xff ); + ++i; + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. +*/ +void md5_decode ( UINT4 *output, unsigned char *input, unsigned int len ) +{ + unsigned int i, j; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0, j = 0; j < len; i++, j += 4 ) { + output[ i ] = ( ( UINT4 )input[ j ] ) | ( ( ( UINT4 )input[ j + 1 ] ) << 8 ) | + ( ( ( UINT4 )input[ j + 2 ] ) << 16 ) | ( ( ( UINT4 )input[ j + 3 ] ) << 24 ); + } +} + +/* Note: Replace "for loop" with standard memcpy if possible. +*/ +void md5_memcpy ( POINTER output, POINTER input, unsigned int len ) +{ + unsigned int i; + + _Pragma( "loopbound min 0 max 55" ) + for ( i = 0; i < len; i++ ) + output[ i ] = input[ i ]; +} + +/////////////////// end md5c.c //////////////////////// + +void md5_R_memset ( POINTER output, int value, unsigned int len ) +//POINTER output; /* output block */ +//int value; /* value */ +//unsigned int len; /* length of block */ +{ + if ( len ) + md5_memset_x ( output, value, len ); +} + + +// Basic implementation of C's memset +void md5_memset_x( unsigned char *ptr, int value, unsigned long len ) +{ + _Pragma( "loopbound min 16 max 64" ) + while ( len-- ) + *ptr++ = value; + + return; +} + + +int md5_R_RandomInit ( R_RANDOM_STRUCT *randomStruct ) +//R_RANDOM_STRUCT *randomStruct; /* new random structure */ +{ + randomStruct->bytesNeeded = RANDOM_BYTES_NEEDED; + md5_R_memset ( ( POINTER )randomStruct->state, 0, + sizeof ( randomStruct->state ) ); + randomStruct->outputAvailable = 0; + + return ( 0 ); +} + +int md5_R_RandomUpdate ( R_RANDOM_STRUCT *randomStruct, unsigned char *block, + unsigned int blockLen ) +//R_RANDOM_STRUCT *randomStruct; /* random structure */ +//unsigned char *block; /* block of values to mix in */ +//unsigned int blockLen; /* length of block */ +{ + MD5_CTX context; + unsigned char digest[ 64 ]; + unsigned int i, x; + + md5_orig_init ( &context ); + md5_update ( &context, block, blockLen ); + md5_final ( digest, &context ); + + /* add digest to state */ + x = 0; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; i++ ) { + x += randomStruct->state[ 15 - i ] + digest[ 15 - i ]; + randomStruct->state[ 15 - i ] = ( unsigned char )x; + x >>= 8; + } + + if ( randomStruct->bytesNeeded < blockLen ) + randomStruct->bytesNeeded = 0; + else + randomStruct->bytesNeeded -= blockLen; + + /* Zeroize sensitive information. + */ + md5_R_memset ( ( POINTER )digest, 0, sizeof ( digest ) ); + + return ( 0 ); +} + + +/* Initialize the random structure with all zero seed bytes for test purposes. + NOTE that this will cause the output of the "random" process to be + the same every time. To produce random bytes, the random struct + needs random seeds! +*/ +void md5_InitRandomStruct ( R_RANDOM_STRUCT *randomStruct ) +{ + static unsigned char seedByte = 0; + unsigned int bytesNeeded; + + md5_R_RandomInit ( randomStruct ); + + /* Initialize with all zero seed bytes, which will not yield an actual + random number output. + */ + _Pragma( "loopbound min 256 max 256" ) + while ( 1 ) { + md5_R_GetRandomBytesNeeded ( &bytesNeeded, randomStruct ); + if ( bytesNeeded == 0 ) + break; + + md5_R_RandomUpdate ( randomStruct, &seedByte, 1 ); + } +} + +int md5_R_GetRandomBytesNeeded ( unsigned int *bytesNeeded, + R_RANDOM_STRUCT *randomStruct ) +//unsigned int *bytesNeeded; /* number of mix-in bytes needed */ +//R_RANDOM_STRUCT *randomStruct; /* random structure */ +{ + *bytesNeeded = randomStruct->bytesNeeded; + + return ( 0 ); +} + +void md5_init( void ) +{ + // no initialisation needed +} + +int md5_return( void ) +{ + return md5_bytesNeeded; +} + +void _Pragma( "entrypoint" ) md5_main( void ) +{ + R_RANDOM_STRUCT randomStruct; + R_RANDOM_STRUCT randomStruct2; + /* We first generate parameters, and then do some key exchange each followed by a key computation...*/ + int keys_exchanged = 0; + + md5_InitRandomStruct ( &randomStruct ); + + _Pragma( "loopbound min 10 max 10" ) + while ( keys_exchanged != EXCHANGEKEYS ) { + keys_exchanged++; + md5_InitRandomStruct ( &randomStruct2 ); + } + + md5_bytesNeeded = randomStruct.bytesNeeded + randomStruct2.bytesNeeded; +} + +int main( void ) +{ + md5_init(); + md5_main(); + // printf("%d\n", ret); + return md5_return(); +} + diff --git a/targets/wasm-tacle/kernel/minver/CMakeLists.txt b/targets/wasm-tacle/kernel/minver/CMakeLists.txt new file mode 100644 index 0000000..929c982 --- /dev/null +++ b/targets/wasm-tacle/kernel/minver/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(minver) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/minver.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/minver.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/minver/ChangeLog.txt b/targets/wasm-tacle/kernel/minver/ChangeLog.txt new file mode 100755 index 0000000..50cc75f --- /dev/null +++ b/targets/wasm-tacle/kernel/minver/ChangeLog.txt @@ -0,0 +1,38 @@ +File: minver.c +Original provenience: SNU-RT Benchmark Suite for Worst Case Timing Analysis + +2016-02-26: + - Added TACLeBench header to line 1 + - Rename global variable a to minver_a + - Rename global variable b to minver_b + - Rename global variable c to minver_c + - Rename global variable aa to minver_aa + - Rename global variable a_i to minver_a_i + - Rename global variable e to minver_e + - Rename global variable det to minver_det + - Renamed function minver to minver_minver + - Renamed function mmul to minver_mmul + - Renamed function fabs to minver_fabs + - Renamed function main to minver_main + - Created new function main, calling minver_init, minver_main and + returning minver_return + - Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + functions, followed by main functions + - Applied code formatting with astyle as in the example + +2016-03-09 + - Removed static keyword from global minver_a array. + +2016-05-23 + - Added addition of volatile to test data to avoid constant propagation + - Added check_sum and comparison with expected value + +2016-05-25 + - Initialized variable r in function minver_minver() + - Removed parameter cols of minver_minver() function + - Renamed parameter rows of minver_minver() to side + +2017-07-04 + - Removed self-assignment for WCC's flow-fact manager to avoid clangs + self-assign warning. diff --git a/targets/wasm-tacle/kernel/minver/generated/default/minver.wasm b/targets/wasm-tacle/kernel/minver/generated/default/minver.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b1b6313729fd223478275f6006e7b35ed2c4e127 GIT binary patch literal 4244 zcma)9O>7&-6`t8y?owJ(T$74L)IQ8^dvGCGaEc;dniy~y^_|dDE^s0 zX#@x$kzAAnLDZY;6X9NroOCJbqfSMRKKkea1?o!y-Ks+o*7 zo$hXD*xqMM6l`vBVHbFpb6yafai=CmJUZL-Ml3q@=s(u(Zyl$VwmQ9Ii`C=!PdGeI zy4~h+yq^q`xR*9Ndws@N)Apcu-0d8;2Ta(l^hwJs z5|QwgDQw(FfgLfkVbllq#NCCND;XWE!0VHjId5Z z!3aJHwh>As2qP3pu#8}nz>Odq0gj1^jZjGEqcZb6#9{vm{#dkSfY-C0*xH;o;G`YF zd7HMt_aESU5l{XoSi$3e5Lf4-hQdQ^rD%K#_JXpZ=kmi~4eAR1Tx&<{M10DWwL^?b z_XwD92MlM727ZZq;HBQgKQU-%%*Li*p)dU>($6d(-U@GIg3Ooup|}TNBz(MAF}>k^Rr(Tt`=N6S-rb;8jm{Q0 zQVKZW+>%gK0CNxL5$lu;HcdtaeuV2P(D0qvP_MZnd5XkEJP;)dp&%Fp1{k>}t51V9 z;>-dLk{XIT7NfJEs3?U41=W`$Z9Jl^UXhm?u@VWY(RCAPa1(ke)f(t2O9y};pMsJ% zNwOhr3np#p(?iwQhPK#1oT#?Cv8Yci{6;uq0qL4WedZK9g0ygo6QP(LxhiXDg0QCe zlQ*6OYto~7uAx#;wOI%o(o@+jOVJ1&?VKYwNU9m-V=2J8XjkOM2F$e*uyGwbXD9TjxzM%BbX~esS zWY-%(P1fm{y6z=SZ^n&j;mZ$AV#>6mEK6`XD8UvRU9(Y-vyCWg3Jf@mvoe?h{j(Db z?Nn3kR75*re+~4ZCg!@%L5aB3YDMYHwVHA;50>gxl^yh0g)X9{giU*KLshTpyDA`6 zqq(xG%1)U=sU+7_F)9BqOFKG2M$LCYS(i4=!KG(a(e*Rm1P;DV9BG=bMl9Aeiy%v& zzU11rc>U#gj2v0`3T@~wP$|6EE3;E4qdG!qZVFWa+v4IYY}A@ln#kMY`&@ITH7}HA zVZWN++u~(zJ<-;$a?LZXdA)4^xqf$pm{z2Ep;Y&o`AjC56%!Txn{ZFB<6d6JeYphp*;{eX zuH#-^$9=T~_k00&!E=>?c}7&4<{44Bd=n$j7fw*rWw<#b8E(!L_pH*)gjnEgOy@{;$143DEuy5Ek&(SP z)ufR>XLCE0Gy|^)dpu{NBn>*5d!Z!#LKR(hnl8ZwPZbZDiD88tQk-Qkl%zo~=1xVd{j6W;=WQd0=Bc%etzYQXy3tD`*LT>r+-@hWl$E^J zVf)jxw?!9X{)YmqPA}PUcFE>%yf0g2y*t(qVZdU#H`|ps?(_~14%*lBO2$XQ{FZs2TtrQ7T55BJhupO>)QOZ)wF|L*QFFa2(J*d7e!UNdPQRNvj+ zdUxx6dFL1RhD!a*pR-RYgQRzm4&sMtG8p#KzP-8H8a4-qpC-*=x>;!r2gz?Y0rW~G-tOnYg2FTFcB?xy|CV*l`= 0) + f = n; + else + f = -n; + return f; +} + +int +minver_mmul(int row_a, int col_a, int row_b, int col_b) { + int i, j, k, row_c, col_c; + double w; + + row_c = row_a; + col_c = col_b; + + if (row_c < 1 || row_b < 1 || col_c < 1 || col_a != row_b) + return (999); + + __pragma_loopbound(3, 3); + for (i = 0; i < row_c; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < col_c; j++) { + w = 0.0; + __pragma_loopbound(3, 3); + for (k = 0; k < row_b; k++) + w += minver_a[i][k] * minver_b[k][j]; + + minver_c[i][j] = w; + } + } + return (0); +} + +int +minver_minver(int side, double eps) { + + int work[500], i, j, k, iw; + int r = 0; + double w = 0, wmax, pivot, api, w1; + + if (side < 2 || side > 500 || eps <= 0.0) + return (999); + w1 = 1.0; + __pragma_loopbound(3, 3); + for (i = 0; i < side; i++) + work[i] = i; + __pragma_loopbound(3, 3); + for (k = 0; k < side; k++) { + wmax = 0.0; + __pragma_loopbound(1, 3); + for (i = k; i < side; i++) { + w = minver_fabs(minver_a[i][k]); + if (w > wmax) { + wmax = w; + r = i; + } + } + pivot = minver_a[r][k]; + api = minver_fabs(pivot); + if (api <= eps) { + minver_det = w1; + return (1); + } + w1 *= pivot; + if (r != k) { + w1 = -w; + iw = work[k]; + work[k] = work[r]; + work[r] = iw; + __pragma_loopbound(3, 3); + for (j = 0; j < side; j++) { + w = minver_a[k][j]; + minver_a[k][j] = minver_a[r][j]; + minver_a[r][j] = w; + } + } + __pragma_loopbound(3, 3); + for (i = 0; i < side; i++) + minver_a[k][i] /= pivot; + __pragma_loopbound(3, 3); + for (i = 0; i < side; i++) { + if (i != k) { + w = minver_a[i][k]; + if (w != 0.0) { + __pragma_loopbound(3, 3); + for (j = 0; j < side; j++) { + if (j != k) + minver_a[i][j] -= w * minver_a[k][j]; + } + minver_a[i][k] = -w / pivot; + } + } + } + minver_a[k][k] = 1.0 / pivot; + } + __pragma_loopbound(3, 3); + for (i = 0; i < side;) { + __pragma_loopbound(1, 3); + while (1) { + k = work[i]; + if (k == i) + break; + iw = work[k]; + work[k] = work[i]; + work[i] = iw; + __pragma_loopbound(3, 3); + for (j = 0; j < side; j++) { + w = minver_a[k][i]; + minver_a[k][i] = minver_a[k][k]; + minver_a[k][k] = w; + } + } + i++; + } + minver_det = w1; + return (0); +} + +/* + Initialization- and return-value-related functions +*/ + +void +minver_init() { + int i, j; + volatile int x = 0; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + minver_a[i][j] += x; + } +} + +int +minver_return() { + int i, j; + double check_sum = 0; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + check_sum += minver_a_i[i][j]; + } + /* Avoid double comparison */ + return (int) (check_sum * 100) != 48; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +minver_main() { + int i, j; + double eps; + eps = 1.0e-6; + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + minver_aa[i][j] = minver_a[i][j]; + } + + minver_minver(3, eps); + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + minver_a_i[i][j] = minver_a[i][j]; + } + + minver_mmul(3, 3, 3, 3); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + minver_init(); + minver_main(); + + return (minver_return()); +} diff --git a/targets/wasm-tacle/kernel/minver/generated/modified_sources/inline/minver.c b/targets/wasm-tacle/kernel/minver/generated/modified_sources/inline/minver.c new file mode 100644 index 0000000..6167d0d --- /dev/null +++ b/targets/wasm-tacle/kernel/minver/generated/modified_sources/inline/minver.c @@ -0,0 +1,263 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: minver + + Author: Sung-Soo Lim + + Function: Matrix inversion for 3x3 floating point matrix. + + Source: SNU-RT Benchmark Suite, via MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/minver/minver.c + + Changes: a brief summary of major functional changes (not formatting) + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + Original source: Turbo C Programming for Engineering by Hyun Soo Ahn +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int minver_minver(int side, + double eps); +__attribute__((always_inline)) static inline int +minver_mmul(int row_a, int col_a, int row_b, int col_b); +__attribute__((always_inline)) static inline double minver_fabs(double n); +__attribute__((always_inline)) static inline void minver_init(); +__attribute__((always_inline)) static inline int minver_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +minver_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +double minver_a[3][3] = { + {3.0, -6.0, 7.0}, + {9.0, 0.0, -5.0}, + {5.0, -8.0, 6.0}, +}; +double minver_b[3][3]; +double minver_c[3][3]; +double minver_aa[3][3]; +double minver_a_i[3][3]; +double minver_det; + +/* + Arithmetic math functions +*/ + +__attribute__((always_inline)) static inline double +minver_fabs(double n) { + double f; + + if (n >= 0) + f = n; + else + f = -n; + return f; +} + +__attribute__((always_inline)) static inline int +minver_mmul(int row_a, int col_a, int row_b, int col_b) { + int i, j, k, row_c, col_c; + double w; + + row_c = row_a; + col_c = col_b; + + if (row_c < 1 || row_b < 1 || col_c < 1 || col_a != row_b) + return (999); + + __pragma_loopbound(3, 3); + for (i = 0; i < row_c; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < col_c; j++) { + w = 0.0; + __pragma_loopbound(3, 3); + for (k = 0; k < row_b; k++) + w += minver_a[i][k] * minver_b[k][j]; + + minver_c[i][j] = w; + } + } + return (0); +} + +__attribute__((always_inline)) static inline int +minver_minver(int side, double eps) { + + int work[500], i, j, k, iw; + int r = 0; + double w = 0, wmax, pivot, api, w1; + + if (side < 2 || side > 500 || eps <= 0.0) + return (999); + w1 = 1.0; + __pragma_loopbound(3, 3); + for (i = 0; i < side; i++) + work[i] = i; + __pragma_loopbound(3, 3); + for (k = 0; k < side; k++) { + wmax = 0.0; + __pragma_loopbound(1, 3); + for (i = k; i < side; i++) { + w = minver_fabs(minver_a[i][k]); + if (w > wmax) { + wmax = w; + r = i; + } + } + pivot = minver_a[r][k]; + api = minver_fabs(pivot); + if (api <= eps) { + minver_det = w1; + return (1); + } + w1 *= pivot; + if (r != k) { + w1 = -w; + iw = work[k]; + work[k] = work[r]; + work[r] = iw; + __pragma_loopbound(3, 3); + for (j = 0; j < side; j++) { + w = minver_a[k][j]; + minver_a[k][j] = minver_a[r][j]; + minver_a[r][j] = w; + } + } + __pragma_loopbound(3, 3); + for (i = 0; i < side; i++) + minver_a[k][i] /= pivot; + __pragma_loopbound(3, 3); + for (i = 0; i < side; i++) { + if (i != k) { + w = minver_a[i][k]; + if (w != 0.0) { + __pragma_loopbound(3, 3); + for (j = 0; j < side; j++) { + if (j != k) + minver_a[i][j] -= w * minver_a[k][j]; + } + minver_a[i][k] = -w / pivot; + } + } + } + minver_a[k][k] = 1.0 / pivot; + } + __pragma_loopbound(3, 3); + for (i = 0; i < side;) { + __pragma_loopbound(1, 3); + while (1) { + k = work[i]; + if (k == i) + break; + iw = work[k]; + work[k] = work[i]; + work[i] = iw; + __pragma_loopbound(3, 3); + for (j = 0; j < side; j++) { + w = minver_a[k][i]; + minver_a[k][i] = minver_a[k][k]; + minver_a[k][k] = w; + } + } + i++; + } + minver_det = w1; + return (0); +} + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +minver_init() { + int i, j; + volatile int x = 0; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + minver_a[i][j] += x; + } +} + +__attribute__((always_inline)) static inline int +minver_return() { + int i, j; + double check_sum = 0; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + check_sum += minver_a_i[i][j]; + } + /* Avoid double comparison */ + return (int) (check_sum * 100) != 48; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +minver_main() { + int i, j; + double eps; + eps = 1.0e-6; + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + minver_aa[i][j] = minver_a[i][j]; + } + + minver_minver(3, eps); + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(3, 3); + for (j = 0; j < 3; j++) + minver_a_i[i][j] = minver_a[i][j]; + } + + minver_mmul(3, 3, 3, 3); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + minver_init(); + minver_main(); + + return (minver_return()); +} diff --git a/targets/wasm-tacle/kernel/minver/minver.c b/targets/wasm-tacle/kernel/minver/minver.c new file mode 100755 index 0000000..f417d1f --- /dev/null +++ b/targets/wasm-tacle/kernel/minver/minver.c @@ -0,0 +1,261 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: minver + + Author: Sung-Soo Lim + + Function: Matrix inversion for 3x3 floating point matrix. + + Source: SNU-RT Benchmark Suite, via MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/minver/minver.c + + Changes: a brief summary of major functional changes (not formatting) + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + Original source: Turbo C Programming for Engineering by Hyun Soo Ahn +*/ + +/* + Forward declaration of functions +*/ + +int minver_minver( int side, double eps ); +int minver_mmul( int row_a, int col_a, int row_b, int col_b ); +double minver_fabs( double n ); +void minver_init(); +int minver_return(); +void minver_main(); +int main( void ); + +/* + Declaration of global variables +*/ + +double minver_a[ 3 ][ 3 ] = { + {3.0, -6.0, 7.0}, + {9.0, 0.0, -5.0}, + {5.0, -8.0, 6.0}, +}; +double minver_b[ 3 ][ 3 ]; +double minver_c[ 3 ][ 3 ]; +double minver_aa[ 3 ][ 3 ]; +double minver_a_i[ 3 ][ 3 ]; +double minver_det; + +/* + Arithmetic math functions +*/ + + +double minver_fabs( double n ) +{ + double f; + + if ( n >= 0 ) + f = n; + else + f = -n; + return f; +} + + +int minver_mmul( int row_a, int col_a, int row_b, int col_b ) +{ + int i, j, k, row_c, col_c; + double w; + + row_c = row_a; + col_c = col_b; + + if ( row_c < 1 || row_b < 1 || col_c < 1 || col_a != row_b ) + return ( 999 ); + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < row_c; i++ ) { + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < col_c; j++ ) { + w = 0.0; + _Pragma( "loopbound min 3 max 3" ) + for ( k = 0; k < row_b; k++ ) + w += minver_a[ i ][ k ] * minver_b[ k ][ j ]; + + minver_c[ i ][ j ] = w; + + } + } + return ( 0 ); + +} + + +int minver_minver( int side, double eps ) +{ + + int work[ 500 ], i, j, k, iw; + int r = 0; + double w = 0, wmax, pivot, api, w1; + + if ( side < 2 || side > 500 || eps <= 0.0 ) + return ( 999 ); + w1 = 1.0; + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < side; i++ ) + work[ i ] = i; + _Pragma( "loopbound min 3 max 3" ) + for ( k = 0; k < side; k++ ) { + wmax = 0.0; + _Pragma( "loopbound min 1 max 3" ) + for ( i = k; i < side; i++ ) { + w = minver_fabs( minver_a[ i ][ k ] ); + if ( w > wmax ) { + wmax = w; + r = i; + } + } + pivot = minver_a[ r ][ k ]; + api = minver_fabs( pivot ); + if ( api <= eps ) { + minver_det = w1; + return ( 1 ); + } + w1 *= pivot; + if ( r != k ) { + w1 = -w; + iw = work[ k ]; + work[ k ] = work[ r ]; + work[ r ] = iw; + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < side; j++ ) { + w = minver_a[ k ][ j ]; + minver_a[ k ][ j ] = minver_a[ r ][ j ]; + minver_a[ r ][ j ] = w; + } + } + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < side; i++ ) + minver_a[ k ][ i ] /= pivot; + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < side; i++ ) { + if ( i != k ) { + w = minver_a[ i ][ k ]; + if ( w != 0.0 ) { + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < side; j++ ) { + if ( j != k ) minver_a[ i ][ j ] -= w * minver_a[ k ][ j ]; + } + minver_a[ i ][ k ] = -w / pivot; + + } + } + } + minver_a[ k ][ k ] = 1.0 / pivot; + } + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < side; ) { + _Pragma( "loopbound min 1 max 3" ) + while ( 1 ) { + k = work[ i ]; + if ( k == i ) break; + iw = work[ k ]; + work[ k ] = work[ i ]; + work[ i ] = iw; + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < side; j++ ) { + w = minver_a [k ][ i ]; + minver_a[ k ][ i ] = minver_a[ k ][ k ]; + minver_a[ k ][ k ] = w; + } + } + i++; + } + minver_det = w1; + return ( 0 ); + +} + +/* + Initialization- and return-value-related functions +*/ + +void minver_init() +{ + int i, j; + volatile int x = 0; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; i++ ) { + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < 3; j++ ) + minver_a[ i ][ j ] += x; + } +} + + +int minver_return() +{ + int i, j; + double check_sum = 0; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; i++ ) { + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < 3; j++ ) + check_sum += minver_a_i[ i ][ j ]; + } + /* Avoid double comparison */ + return ( int )( check_sum * 100 ) != 48; +} + + +/* + Main functions +*/ + + +void _Pragma( "entrypoint" ) minver_main() +{ + int i, j; + double eps; + eps = 1.0e-6; + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; i++ ) { + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < 3; j++ ) + minver_aa[ i ][ j ] = minver_a[ i ][ j ]; + } + + minver_minver( 3, eps ); + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; i++ ) { + _Pragma( "loopbound min 3 max 3" ) + for ( j = 0; j < 3; j++ ) + minver_a_i[ i ][ j ] = minver_a[ i ][ j ]; + } + + minver_mmul( 3, 3, 3, 3 ); +} + + +int main( void ) +{ + minver_init(); + minver_main(); + + return ( minver_return() ); +} + + + + + diff --git a/targets/wasm-tacle/kernel/pm/CMakeLists.txt b/targets/wasm-tacle/kernel/pm/CMakeLists.txt new file mode 100644 index 0000000..4650765 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/CMakeLists.txt @@ -0,0 +1,28 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(pm) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/pm.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/pm.c" + "generated/modified_sources/default/pm_input.c" + "generated/modified_sources/default/pm_libm.c" + "generated/modified_sources/default/pm_stdlib.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/pm/ChangeLog.txt b/targets/wasm-tacle/kernel/pm/ChangeLog.txt new file mode 100755 index 0000000..3d38c99 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/ChangeLog.txt @@ -0,0 +1,96 @@ +File: pm.c +Original provenience: unknown +Source: HPEC Challenge Benchmark Suite + +2016-04-20: +- Fixed some compiler warnings. +- Moved main to end of file. + +2016-03-15: +- Renamed preprocessor defines MIN_NOISE and LOG10 to pm_MIN_NOISE and + pm_LOG10. +- Made sure that pm_return returns value 0 upon success. + +2016-01-22: +- Moved math functions pm_log10f, pm_pow10f, pm_fabs, pm_floor, pm_ceil into + own files pm_math.h and pm_libm.c. +- Moved associated static global variables pm_log_coeff and pm_pow_coeff into + file pm_libm.c. +- Renamed function pm_init_coeff to pm_math_init and moved its call out of + pm_init_data. +- Moved stdlib functions pm_memcpy and pm_memset into own files pm_string.h + and pm_stdlib.c. +- Renamed input.c to pm_input.c + +2016-01-21: +- Changed pm_ceil and pm_floor such that the expression !arg is not used + anymore to resolve compiler warning "implicit conversion turns + floating-point number into integer". However, NaN and infinity are not + handled correctly. +- Cast results of pm_ceil and pm_floor to int instead of the functions + themselves to resolve compiler warning about "cast from function call of + type 'float' to non-matching type 'int'". +- Cast parameter c of pm_memset to unsigned char to resolve compiler warning + that "implicit conversion loses integer precision". +- Cast result of sizeof operator in call to pm_memset to int to resolve + compiler warnings that "implicit conversion changes signedness". +- Converted type of local variables match_index and min_MSE_index in pm_kernel, + as well as array base type of member size in pm_float_array_t from + unsigned int to int to resolve compiler warnings that "implicit conversion + changes signedness". +- Removed register storage class for local variables in pm_kernel. + +2016-01-07: +- Added original name to generic TACLeBench header. +- Added forward declarations for all functions. +- Renamed function main to pm_main. +- Renamed function init to pm_init_data. +- Renamed function clean to pm_clean. +- Changed all //-style comments to /* */-style comments +- Renamed function fabs_ to pm_fabs. +- Renamed function setcoeff to pm_init_coeff. +- Renamed pow10fpm to pm_pow10f. +- Renamed log10fpm to pm_log10f. +- Renamed my_floor to pm_floor. +- Renamed my_ceil to pm_ceil. +- Renamed my_memcpy to pm_memcpy. +- Renamed my_memset to pm_memset. +- Renamed function pm to pm_kernel. +- Added function pm_init that handles the initialization of the math library + functions. +- Added function pm_return that handles the original return value of main. +- Added new function main that first calls pm_init, then pm_main and finally + returns the return value of pm_return. +- Replaced local variables pmdata, lib, patternand result in main with global + static variables pm_data, pm_lib, pm_pattern and pm_result. +- Renamed global variables init_array_1, init_array_2, init_array_3, + init_array_4, init_array_5, init_array_6, init_array_7 and init_array_8 to + pm_init_array_1, pm_init_array_2, pm_init_array_3, pm_init_array_4, + pm_init_array_5, pm_init_array_6, pm_init_array_7 and pm_init_array_8 and + made them static. +- Renamed global variables pow_coeff and log_coeff to pm_pow_coeff and + pm_log_coeff and made them static. +- Tested conformance to C90 via + clang -fsyntax-only -Weverything -Wno-unknown-pragmas -pedantic -std=c90 + +2016-01-06: +- Applied TACLeBench formatting rules via + astyle --options=doc/example/astylerc.txt + +2015-12-08: +- Replaced comments in line 1-37 with generic TACLeBench header. +- Introduced comments to split file in sections for type definition, forward + declarations, global variables, initialization-related and + return-value-related functions, core benchmark functions, and main routine. +- Moved BSD 3-clause license comment to own file license.txt. +- Renamed global variables lib_data and pattern_data to pm_lib_data and + pm_pattern_data. +- Renamed functions read_lib and read_pattern to pm_init_lib and + pm_init_pattern. +- Removed unnecessary return statements. +- Inlined definition of types PmData and PcaCArrayFloat from PcaCArray.h. +- Renamed type PmData to pm_data_t. +- Renamed type PcaCArrayFloat to pm_float_array_t. + +2007-10-18 (Rathijit Sen, Universität des Saarlandes): +- Removed dynamic alloc, file I/O. diff --git a/targets/wasm-tacle/kernel/pm/generated/default/pm.wasm b/targets/wasm-tacle/kernel/pm/generated/default/pm.wasm new file mode 100755 index 0000000000000000000000000000000000000000..de50d8ab05d9d8285a30b3417a8bc9f8898c7536 GIT binary patch literal 41781 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 HCkFoy$ZMK& literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/pm/generated/default/pm.wat b/targets/wasm-tacle/kernel/pm/generated/default/pm.wat new file mode 100644 index 0000000..fee9c82 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/default/pm.wat @@ -0,0 +1,4396 @@ +(module $pm.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32))) + (type (;3;) (func (param i32) (result i32))) + (type (;4;) (func (result i32))) + (type (;5;) (func (param f32) (result f32))) + (type (;6;) (func (param i32 i32 i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $pm_init_lib (type 2) (param i32) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 0 + i32.const 1 + i32.store offset=24 + local.get 0 + i64.const 8589934592 + i64.store offset=16 align=4 + local.get 0 + i64.const 274877907004 + i64.store offset=8 align=4 + local.get 1 + i32.const 0 + i32.store offset=12 + i32.const 60 + i32.const 60 + call $__pragma_loopbound + i32.const 0 + i32.const 1024 + i32.const 15104 + i32.add + i32.store offset=31980 + i32.const 0 + i32.const 1024 + i32.const 14848 + i32.add + i32.store offset=31976 + i32.const 0 + i32.const 1024 + i32.const 14592 + i32.add + i32.store offset=31972 + i32.const 0 + i32.const 1024 + i32.const 14336 + i32.add + i32.store offset=31968 + i32.const 0 + i32.const 1024 + i32.const 14080 + i32.add + i32.store offset=31964 + i32.const 0 + i32.const 1024 + i32.const 13824 + i32.add + i32.store offset=31960 + i32.const 0 + i32.const 1024 + i32.const 13568 + i32.add + i32.store offset=31956 + i32.const 0 + i32.const 1024 + i32.const 13312 + i32.add + i32.store offset=31952 + i32.const 0 + i32.const 1024 + i32.const 13056 + i32.add + i32.store offset=31948 + i32.const 0 + i32.const 1024 + i32.const 12800 + i32.add + i32.store offset=31944 + i32.const 0 + i32.const 1024 + i32.const 12544 + i32.add + i32.store offset=31940 + i32.const 0 + i32.const 1024 + i32.const 12288 + i32.add + i32.store offset=31936 + i32.const 0 + i32.const 1024 + i32.const 12032 + i32.add + i32.store offset=31932 + i32.const 0 + i32.const 1024 + i32.const 11776 + i32.add + i32.store offset=31928 + i32.const 0 + i32.const 1024 + i32.const 11520 + i32.add + i32.store offset=31924 + i32.const 0 + i32.const 1024 + i32.const 11264 + i32.add + i32.store offset=31920 + i32.const 0 + i32.const 1024 + i32.const 11008 + i32.add + i32.store offset=31916 + i32.const 0 + i32.const 1024 + i32.const 10752 + i32.add + i32.store offset=31912 + i32.const 0 + i32.const 1024 + i32.const 10496 + i32.add + i32.store offset=31908 + i32.const 0 + i32.const 1024 + i32.const 10240 + i32.add + i32.store offset=31904 + i32.const 0 + i32.const 1024 + i32.const 9984 + i32.add + i32.store offset=31900 + i32.const 0 + i32.const 1024 + i32.const 9728 + i32.add + i32.store offset=31896 + i32.const 0 + i32.const 1024 + i32.const 9472 + i32.add + i32.store offset=31892 + i32.const 0 + i32.const 1024 + i32.const 9216 + i32.add + i32.store offset=31888 + i32.const 0 + i32.const 1024 + i32.const 8960 + i32.add + i32.store offset=31884 + i32.const 0 + i32.const 1024 + i32.const 8704 + i32.add + i32.store offset=31880 + i32.const 0 + i32.const 1024 + i32.const 8448 + i32.add + i32.store offset=31876 + i32.const 0 + i32.const 1024 + i32.const 8192 + i32.add + i32.store offset=31872 + i32.const 0 + i32.const 1024 + i32.const 7936 + i32.add + i32.store offset=31868 + i32.const 0 + i32.const 1024 + i32.const 7680 + i32.add + i32.store offset=31864 + i32.const 0 + i32.const 1024 + i32.const 7424 + i32.add + i32.store offset=31860 + i32.const 0 + i32.const 1024 + i32.const 7168 + i32.add + i32.store offset=31856 + i32.const 0 + i32.const 1024 + i32.const 6912 + i32.add + i32.store offset=31852 + i32.const 0 + i32.const 1024 + i32.const 6656 + i32.add + i32.store offset=31848 + i32.const 0 + i32.const 1024 + i32.const 6400 + i32.add + i32.store offset=31844 + i32.const 0 + i32.const 1024 + i32.const 6144 + i32.add + i32.store offset=31840 + i32.const 0 + i32.const 1024 + i32.const 5888 + i32.add + i32.store offset=31836 + i32.const 0 + i32.const 1024 + i32.const 5632 + i32.add + i32.store offset=31832 + i32.const 0 + i32.const 1024 + i32.const 5376 + i32.add + i32.store offset=31828 + i32.const 0 + i32.const 1024 + i32.const 5120 + i32.add + i32.store offset=31824 + i32.const 0 + i32.const 1024 + i32.const 4864 + i32.add + i32.store offset=31820 + i32.const 0 + i32.const 1024 + i32.const 4608 + i32.add + i32.store offset=31816 + i32.const 0 + i32.const 1024 + i32.const 4352 + i32.add + i32.store offset=31812 + i32.const 0 + i32.const 1024 + i32.const 4096 + i32.add + i32.store offset=31808 + i32.const 0 + i32.const 1024 + i32.const 3840 + i32.add + i32.store offset=31804 + i32.const 0 + i32.const 1024 + i32.const 3584 + i32.add + i32.store offset=31800 + i32.const 0 + i32.const 1024 + i32.const 3328 + i32.add + i32.store offset=31796 + i32.const 0 + i32.const 1024 + i32.const 3072 + i32.add + i32.store offset=31792 + i32.const 0 + i32.const 1024 + i32.const 2816 + i32.add + i32.store offset=31788 + i32.const 0 + i32.const 1024 + i32.const 2560 + i32.add + i32.store offset=31784 + i32.const 0 + i32.const 1024 + i32.const 2304 + i32.add + i32.store offset=31780 + i32.const 0 + i32.const 1024 + i32.const 2048 + i32.add + i32.store offset=31776 + i32.const 0 + i32.const 1024 + i32.const 1792 + i32.add + i32.store offset=31772 + i32.const 0 + i32.const 1024 + i32.const 1536 + i32.add + i32.store offset=31768 + i32.const 0 + i32.const 1024 + i32.const 1280 + i32.add + i32.store offset=31764 + i32.const 0 + i32.const 1024 + i32.const 1024 + i32.add + i32.store offset=31760 + i32.const 0 + i32.const 1024 + i32.const 768 + i32.add + i32.store offset=31756 + i32.const 0 + i32.const 1024 + i32.const 512 + i32.add + i32.store offset=31752 + i32.const 0 + i32.const 1024 + i32.const 256 + i32.add + i32.store offset=31748 + i32.const 0 + i32.const 1024 + i32.store offset=31744 + i32.const 60 + i32.const 60 + call $__pragma_loopbound + i32.const -240 + local.set 2 + loop ;; label = @1 + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 31984 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 31988 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 31992 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 31996 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 2 + i32.const 16 + i32.add + local.tee 2 + br_if 0 (;@1;) + end + local.get 0 + i32.const 31744 + i32.store offset=4 + local.get 0 + i32.const 0 + i32.load offset=31744 + i32.store + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $pm_init_pattern (type 2) (param i32) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 0 + i32.const 1 + i32.store offset=24 + local.get 0 + i64.const 8589934592 + i64.store offset=16 align=4 + local.get 0 + i64.const 274877907004 + i64.store offset=8 align=4 + local.get 1 + i32.const 0 + i32.store offset=12 + i32.const 60 + i32.const 60 + call $__pragma_loopbound + i32.const 0 + i32.const 16384 + i32.const 15104 + i32.add + i32.store offset=32220 + i32.const 0 + i32.const 16384 + i32.const 14848 + i32.add + i32.store offset=32216 + i32.const 0 + i32.const 16384 + i32.const 14592 + i32.add + i32.store offset=32212 + i32.const 0 + i32.const 16384 + i32.const 14336 + i32.add + i32.store offset=32208 + i32.const 0 + i32.const 16384 + i32.const 14080 + i32.add + i32.store offset=32204 + i32.const 0 + i32.const 16384 + i32.const 13824 + i32.add + i32.store offset=32200 + i32.const 0 + i32.const 16384 + i32.const 13568 + i32.add + i32.store offset=32196 + i32.const 0 + i32.const 16384 + i32.const 13312 + i32.add + i32.store offset=32192 + i32.const 0 + i32.const 16384 + i32.const 13056 + i32.add + i32.store offset=32188 + i32.const 0 + i32.const 16384 + i32.const 12800 + i32.add + i32.store offset=32184 + i32.const 0 + i32.const 16384 + i32.const 12544 + i32.add + i32.store offset=32180 + i32.const 0 + i32.const 16384 + i32.const 12288 + i32.add + i32.store offset=32176 + i32.const 0 + i32.const 16384 + i32.const 12032 + i32.add + i32.store offset=32172 + i32.const 0 + i32.const 16384 + i32.const 11776 + i32.add + i32.store offset=32168 + i32.const 0 + i32.const 16384 + i32.const 11520 + i32.add + i32.store offset=32164 + i32.const 0 + i32.const 16384 + i32.const 11264 + i32.add + i32.store offset=32160 + i32.const 0 + i32.const 16384 + i32.const 11008 + i32.add + i32.store offset=32156 + i32.const 0 + i32.const 16384 + i32.const 10752 + i32.add + i32.store offset=32152 + i32.const 0 + i32.const 16384 + i32.const 10496 + i32.add + i32.store offset=32148 + i32.const 0 + i32.const 16384 + i32.const 10240 + i32.add + i32.store offset=32144 + i32.const 0 + i32.const 16384 + i32.const 9984 + i32.add + i32.store offset=32140 + i32.const 0 + i32.const 16384 + i32.const 9728 + i32.add + i32.store offset=32136 + i32.const 0 + i32.const 16384 + i32.const 9472 + i32.add + i32.store offset=32132 + i32.const 0 + i32.const 16384 + i32.const 9216 + i32.add + i32.store offset=32128 + i32.const 0 + i32.const 16384 + i32.const 8960 + i32.add + i32.store offset=32124 + i32.const 0 + i32.const 16384 + i32.const 8704 + i32.add + i32.store offset=32120 + i32.const 0 + i32.const 16384 + i32.const 8448 + i32.add + i32.store offset=32116 + i32.const 0 + i32.const 16384 + i32.const 8192 + i32.add + i32.store offset=32112 + i32.const 0 + i32.const 16384 + i32.const 7936 + i32.add + i32.store offset=32108 + i32.const 0 + i32.const 16384 + i32.const 7680 + i32.add + i32.store offset=32104 + i32.const 0 + i32.const 16384 + i32.const 7424 + i32.add + i32.store offset=32100 + i32.const 0 + i32.const 16384 + i32.const 7168 + i32.add + i32.store offset=32096 + i32.const 0 + i32.const 16384 + i32.const 6912 + i32.add + i32.store offset=32092 + i32.const 0 + i32.const 16384 + i32.const 6656 + i32.add + i32.store offset=32088 + i32.const 0 + i32.const 16384 + i32.const 6400 + i32.add + i32.store offset=32084 + i32.const 0 + i32.const 16384 + i32.const 6144 + i32.add + i32.store offset=32080 + i32.const 0 + i32.const 16384 + i32.const 5888 + i32.add + i32.store offset=32076 + i32.const 0 + i32.const 16384 + i32.const 5632 + i32.add + i32.store offset=32072 + i32.const 0 + i32.const 16384 + i32.const 5376 + i32.add + i32.store offset=32068 + i32.const 0 + i32.const 16384 + i32.const 5120 + i32.add + i32.store offset=32064 + i32.const 0 + i32.const 16384 + i32.const 4864 + i32.add + i32.store offset=32060 + i32.const 0 + i32.const 16384 + i32.const 4608 + i32.add + i32.store offset=32056 + i32.const 0 + i32.const 16384 + i32.const 4352 + i32.add + i32.store offset=32052 + i32.const 0 + i32.const 16384 + i32.const 4096 + i32.add + i32.store offset=32048 + i32.const 0 + i32.const 16384 + i32.const 3840 + i32.add + i32.store offset=32044 + i32.const 0 + i32.const 16384 + i32.const 3584 + i32.add + i32.store offset=32040 + i32.const 0 + i32.const 16384 + i32.const 3328 + i32.add + i32.store offset=32036 + i32.const 0 + i32.const 16384 + i32.const 3072 + i32.add + i32.store offset=32032 + i32.const 0 + i32.const 16384 + i32.const 2816 + i32.add + i32.store offset=32028 + i32.const 0 + i32.const 16384 + i32.const 2560 + i32.add + i32.store offset=32024 + i32.const 0 + i32.const 16384 + i32.const 2304 + i32.add + i32.store offset=32020 + i32.const 0 + i32.const 16384 + i32.const 2048 + i32.add + i32.store offset=32016 + i32.const 0 + i32.const 16384 + i32.const 1792 + i32.add + i32.store offset=32012 + i32.const 0 + i32.const 16384 + i32.const 1536 + i32.add + i32.store offset=32008 + i32.const 0 + i32.const 16384 + i32.const 1280 + i32.add + i32.store offset=32004 + i32.const 0 + i32.const 16384 + i32.const 1024 + i32.add + i32.store offset=32000 + i32.const 0 + i32.const 16384 + i32.const 768 + i32.add + i32.store offset=31996 + i32.const 0 + i32.const 16384 + i32.const 512 + i32.add + i32.store offset=31992 + i32.const 0 + i32.const 16384 + i32.const 256 + i32.add + i32.store offset=31988 + i32.const 0 + i32.const 16384 + i32.store offset=31984 + i32.const 60 + i32.const 60 + call $__pragma_loopbound + i32.const -240 + local.set 2 + loop ;; label = @1 + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 32224 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 32228 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 32232 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 1 + i32.load offset=12 + local.set 3 + local.get 2 + i32.const 32236 + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 3 + i32.const 2 + i32.shl + i32.add + i32.store + local.get 2 + i32.const 16 + i32.add + local.tee 2 + br_if 0 (;@1;) + end + local.get 0 + i32.const 31984 + i32.store offset=4 + local.get 0 + i32.const 0 + i32.load offset=31984 + i32.store + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $pm_main (type 1) + (local i32 f32) + i32.const 32228 + call $pm_init_lib + i32.const 32260 + call $pm_init_pattern + i32.const 0 + i32.const 4 + i32.store offset=32348 + i32.const 0 + i32.const 1077936128 + i32.store offset=32332 + i32.const 0 + i32.const 0 + i32.load offset=32240 + local.tee 0 + i32.store offset=32340 + i32.const 0 + i32.const 0 + i32.load offset=32236 + i32.store offset=32344 + i32.const 0 + i32.const 0 + i32.load offset=32228 + i32.store offset=32292 + i32.const 0 + i32.const 0 + i32.load offset=32260 + i32.store offset=32296 + block ;; label = @1 + block ;; label = @2 + local.get 0 + f32.convert_i32_s + f32.const 0x1.8p+1 (;=3;) + f32.div + local.tee 1 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 1 + i32.trunc_f32_s + local.set 0 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 0 + end + block ;; label = @1 + block ;; label = @2 + local.get 1 + local.get 0 + f32.convert_i32_s + f32.sub + f32.const 0x1p-1 (;=0.5;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 1 + call $pm_floor + local.set 1 + br 1 (;@1;) + end + local.get 1 + call $pm_ceil + local.set 1 + end + i32.const 0 + i32.const 32432 + i32.store offset=32328 + i32.const 0 + i32.const 32368 + i32.store offset=32324 + i32.const 0 + i32.const 33520 + i32.store offset=32320 + i32.const 0 + i32.const 33232 + i32.store offset=32316 + i32.const 0 + i32.const 33136 + i32.store offset=32312 + i32.const 0 + i32.const 33040 + i32.store offset=32308 + i32.const 0 + i32.const 32784 + i32.store offset=32304 + i32.const 0 + i32.const 32528 + i32.store offset=32300 + block ;; label = @1 + block ;; label = @2 + local.get 1 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 1 + i32.trunc_f32_s + local.set 0 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 0 + end + i32.const 0 + local.get 0 + i32.store offset=32336 + i32.const 0 + i32.const 32292 + call $pm_kernel + i32.store offset=32224 + i32.const 0 + i64.const 0 + i64.store offset=32324 align=4 + i32.const 0 + i64.const 0 + i64.store offset=32316 align=4 + i32.const 0 + i64.const 0 + i64.store offset=32308 align=4 + i32.const 0 + i64.const 0 + i64.store offset=32300 align=4) + (func $pm_kernel (type 3) (param i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 i32 f32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 i32 f32 f32 f32 f32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 i32 f32 f32 f32 i32 i32 i32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + local.get 0 + i32.load offset=48 + local.set 1 + local.get 0 + i32.load offset=28 + local.set 2 + local.get 0 + i32.load offset=12 + local.set 3 + local.get 0 + i32.load + local.set 4 + local.get 0 + i32.load offset=52 + local.set 5 + local.get 0 + i32.load offset=44 + local.set 6 + local.get 0 + i32.load offset=56 + local.set 7 + local.get 0 + i32.load offset=4 + local.tee 8 + f32.load + f32.const 0x1.99999ap-4 (;=0.1;) + f32.mul + call $pm_pow10f + local.get 8 + local.get 1 + i32.const -1 + i32.add + local.tee 9 + i32.const 2 + i32.shl + i32.add + f32.load + f32.const 0x1.99999ap-4 (;=0.1;) + f32.mul + call $pm_pow10f + f32.add + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.tee 10 + f32.const 0x0p+0 (;=0;) + f32.eq + local.set 11 + block ;; label = @1 + block ;; label = @2 + local.get 6 + f32.convert_i32_s + f32.const 0x1p-1 (;=0.5;) + f32.mul + call $pm_ceil + local.tee 12 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 12 + i32.trunc_f32_s + local.set 13 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 13 + end + local.get 0 + i32.load offset=20 + local.set 14 + local.get 0 + i32.load offset=16 + local.set 15 + local.get 0 + i32.load offset=24 + local.set 16 + f32.const -0x1.9p+6 (;=-100;) + local.set 12 + block ;; label = @1 + local.get 11 + br_if 0 (;@1;) + local.get 10 + call $pm_fabs + call $pm_log10f + f32.const 0x1.4p+3 (;=10;) + f32.mul + local.set 12 + end + local.get 1 + local.get 7 + i32.mul + local.set 17 + local.get 0 + i32.load offset=36 + local.set 18 + local.get 0 + i32.load offset=32 + local.set 19 + local.get 0 + i32.load offset=8 + local.set 20 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 1 + i32.const 7 + i32.and + local.set 11 + i32.const 0 + local.set 21 + block ;; label = @3 + local.get 1 + i32.const -1 + i32.add + local.tee 22 + i32.const 7 + i32.lt_u + br_if 0 (;@3;) + local.get 1 + i32.const 2147483640 + i32.and + local.set 23 + i32.const 0 + local.set 21 + local.get 3 + local.set 0 + loop ;; label = @4 + local.get 0 + local.get 12 + f32.store + local.get 0 + i32.const 28 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 24 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 20 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 16 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 12 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 8 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 4 + i32.add + local.get 12 + f32.store + local.get 0 + i32.const 32 + i32.add + local.set 0 + local.get 23 + local.get 21 + i32.const 8 + i32.add + local.tee 21 + i32.ne + br_if 0 (;@4;) + end + end + block ;; label = @3 + local.get 11 + i32.eqz + br_if 0 (;@3;) + local.get 3 + local.get 21 + i32.const 2 + i32.shl + i32.add + local.set 0 + loop ;; label = @4 + local.get 0 + local.get 12 + f32.store + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const -1 + i32.add + local.tee 11 + br_if 0 (;@4;) + end + end + local.get 8 + f32.load + local.set 24 + i32.const 63 + i32.const 63 + call $__pragma_loopbound + i32.const 0 + local.set 25 + local.get 1 + i32.const 1 + i32.eq + br_if 1 (;@1;) + local.get 22 + i32.const 3 + i32.and + local.set 11 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const -2 + i32.add + i32.const 3 + i32.ge_u + br_if 0 (;@4;) + local.get 8 + local.set 0 + br 1 (;@3;) + end + local.get 22 + i32.const -4 + i32.and + local.set 21 + local.get 8 + local.set 0 + loop ;; label = @4 + local.get 0 + f32.load offset=16 + local.tee 26 + local.get 0 + f32.load offset=12 + local.tee 27 + local.get 0 + f32.load offset=8 + local.tee 28 + local.get 0 + f32.load offset=4 + local.tee 29 + local.get 24 + local.get 24 + local.get 29 + f32.lt + select + local.tee 29 + local.get 29 + local.get 28 + f32.lt + select + local.tee 28 + local.get 28 + local.get 27 + f32.lt + select + local.tee 27 + local.get 27 + local.get 26 + f32.lt + select + local.set 24 + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 21 + i32.const -4 + i32.add + local.tee 21 + br_if 0 (;@4;) + end + end + local.get 1 + i32.const 1 + i32.ne + local.set 25 + local.get 11 + i32.eqz + br_if 1 (;@1;) + local.get 0 + i32.const 4 + i32.add + local.set 0 + loop ;; label = @3 + local.get 0 + f32.load + local.tee 26 + local.get 24 + local.get 24 + local.get 26 + f32.lt + select + local.set 24 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const -1 + i32.add + local.tee 11 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 8 + f32.load + local.set 24 + i32.const 63 + i32.const 63 + call $__pragma_loopbound + i32.const 0 + local.set 25 + end + local.get 2 + local.get 3 + local.get 7 + local.get 13 + i32.mul + local.tee 0 + call $pm_memcpy + local.get 2 + local.get 13 + i32.const 2 + i32.shl + i32.add + local.tee 7 + local.get 8 + local.get 17 + call $pm_memcpy + local.get 7 + local.get 1 + i32.const 2 + i32.shl + i32.add + local.tee 22 + local.get 3 + local.get 0 + call $pm_memcpy + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 1 + i32.const 3 + i32.and + local.set 11 + local.get 7 + local.set 0 + block ;; label = @2 + local.get 1 + i32.const -1 + i32.add + i32.const 3 + i32.lt_u + br_if 0 (;@2;) + local.get 1 + i32.const 2147483644 + i32.and + local.set 21 + local.get 7 + local.set 0 + loop ;; label = @3 + block ;; label = @4 + local.get 0 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + local.get 12 + f32.store + end + block ;; label = @4 + local.get 0 + f32.load offset=4 + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + local.get 12 + f32.store offset=4 + end + block ;; label = @4 + local.get 0 + f32.load offset=8 + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + local.get 12 + f32.store offset=8 + end + block ;; label = @4 + local.get 0 + f32.load offset=12 + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + local.get 12 + f32.store offset=12 + end + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 21 + i32.const -4 + i32.add + local.tee 21 + br_if 0 (;@3;) + end + end + local.get 11 + i32.eqz + br_if 0 (;@1;) + loop ;; label = @2 + block ;; label = @3 + local.get 0 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@3;) + local.get 0 + local.get 12 + f32.store + end + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const -1 + i32.add + local.tee 11 + br_if 0 (;@2;) + end + end + local.get 12 + f32.const 0x1.8p+1 (;=3;) + f32.add + local.set 28 + i32.const 21 + i32.const 21 + call $__pragma_loopbound + block ;; label = @1 + local.get 6 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + local.set 8 + local.get 18 + local.set 3 + loop ;; label = @2 + i32.const 53 + i32.const 64 + call $__pragma_loopbound + block ;; label = @3 + block ;; label = @4 + local.get 7 + local.get 2 + local.get 8 + i32.const 2 + i32.shl + i32.add + local.tee 11 + local.get 8 + local.get 13 + i32.lt_s + local.tee 21 + select + local.tee 0 + local.get 11 + local.get 1 + i32.const 2 + i32.shl + i32.add + local.get 22 + local.get 21 + select + local.tee 23 + i32.ne + br_if 0 (;@4;) + f32.const 0x0p+0 (;=0;) + local.set 26 + br 1 (;@3;) + end + i32.const 0 + local.set 11 + f32.const 0x0p+0 (;=0;) + local.set 26 + loop ;; label = @4 + local.get 26 + local.get 0 + f32.load + local.tee 27 + f32.add + local.get 26 + local.get 27 + local.get 28 + f32.gt + local.tee 21 + select + local.set 26 + local.get 11 + local.get 21 + i32.add + local.set 11 + local.get 0 + i32.const 4 + i32.add + local.tee 0 + local.get 23 + i32.ne + br_if 0 (;@4;) + end + block ;; label = @4 + local.get 11 + br_if 0 (;@4;) + f32.const 0x0p+0 (;=0;) + local.set 26 + br 1 (;@3;) + end + local.get 26 + local.get 11 + f32.convert_i32_u + f32.div + local.set 26 + end + local.get 3 + local.get 26 + f32.store + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + local.get 6 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 60 + i32.const 60 + call $__pragma_loopbound + block ;; label = @1 + local.get 5 + i32.const 0 + i32.gt_s + br_if 0 (;@1;) + i32.const 59 + i32.const 59 + call $__pragma_loopbound + i32.const 0 + return + end + f32.const 0x1p+0 (;=1;) + local.get 1 + f32.convert_i32_s + f32.div + local.set 29 + local.get 1 + i32.const 2 + i32.shl + local.set 30 + local.get 1 + i32.const 3 + i32.and + local.set 31 + local.get 1 + i32.const 1 + i32.and + local.set 32 + local.get 1 + i32.const 2147483646 + i32.and + local.set 13 + local.get 1 + i32.const 2147483644 + i32.and + local.set 3 + local.get 6 + i32.const -1 + i32.add + local.tee 0 + i32.const -4 + i32.and + local.set 33 + local.get 0 + i32.const 3 + i32.and + local.set 34 + local.get 1 + i32.const -1 + i32.add + local.tee 35 + i32.const -4 + i32.and + local.set 36 + local.get 35 + i32.const 3 + i32.and + local.set 37 + local.get 1 + i32.const -2 + i32.add + i32.const 3 + i32.lt_u + local.set 38 + local.get 6 + i32.const -2 + i32.add + i32.const 3 + i32.lt_u + local.set 39 + local.get 4 + local.set 23 + f32.const 0x0p+0 (;=0;) + local.set 40 + i32.const 0 + local.set 41 + loop ;; label = @1 + local.get 4 + local.get 41 + local.get 1 + i32.mul + i32.const 2 + i32.shl + i32.add + local.tee 7 + f32.load + local.set 26 + i32.const 63 + i32.const 63 + call $__pragma_loopbound + block ;; label = @2 + local.get 25 + i32.eqz + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + local.get 38 + i32.eqz + br_if 0 (;@4;) + local.get 7 + local.set 0 + br 1 (;@3;) + end + local.get 36 + local.set 11 + local.get 7 + local.set 0 + loop ;; label = @4 + local.get 0 + f32.load offset=16 + local.tee 27 + local.get 0 + f32.load offset=12 + local.tee 42 + local.get 0 + f32.load offset=8 + local.tee 43 + local.get 0 + f32.load offset=4 + local.tee 44 + local.get 26 + local.get 26 + local.get 44 + f32.lt + select + local.tee 26 + local.get 26 + local.get 43 + f32.lt + select + local.tee 26 + local.get 26 + local.get 42 + f32.lt + select + local.tee 26 + local.get 26 + local.get 27 + f32.lt + select + local.set 26 + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 11 + i32.const -4 + i32.add + local.tee 11 + br_if 0 (;@4;) + end + end + local.get 37 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 37 + local.set 11 + loop ;; label = @3 + local.get 0 + f32.load + local.tee 27 + local.get 26 + local.get 26 + local.get 27 + f32.lt + select + local.set 26 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const -1 + i32.add + local.tee 11 + br_if 0 (;@3;) + end + end + local.get 19 + i32.const 0 + local.get 1 + call $pm_memset + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @2 + local.get 1 + i32.const 1 + i32.lt_s + local.tee 22 + br_if 0 (;@2;) + local.get 24 + local.get 26 + f32.sub + local.set 26 + local.get 1 + local.set 11 + local.get 7 + local.set 0 + loop ;; label = @3 + local.get 0 + local.get 26 + local.get 0 + f32.load + f32.add + f32.const 0x1.99999ap-4 (;=0.1;) + f32.mul + call $pm_pow10f + f32.store + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const -1 + i32.add + local.tee 11 + br_if 0 (;@3;) + end + end + local.get 7 + local.get 9 + i32.const 2 + i32.shl + i32.add + f32.load + local.set 26 + local.get 7 + f32.load + local.set 27 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 22 + br_if 0 (;@5;) + local.get 10 + local.get 27 + local.get 26 + f32.add + f32.const -0x1p-1 (;=-0.5;) + f32.mul + f32.add + local.set 42 + i32.const 0 + local.set 11 + f32.const 0x0p+0 (;=0;) + local.set 27 + local.get 7 + local.set 0 + i32.const 0 + local.set 21 + loop ;; label = @6 + local.get 0 + f32.const 0x1.b7cdfep-34 (;=1e-10;) + local.get 42 + local.get 0 + f32.load + f32.add + local.tee 26 + local.get 26 + f32.const 0x0p+0 (;=0;) + f32.eq + select + call $pm_fabs + call $pm_log10f + f32.const 0x1.4p+3 (;=10;) + f32.mul + local.get 12 + f32.add + local.tee 26 + f32.store + block ;; label = @7 + local.get 26 + local.get 28 + f32.gt + i32.eqz + br_if 0 (;@7;) + local.get 19 + local.get 11 + i32.add + i32.const 1 + i32.store8 + local.get 21 + i32.const 1 + i32.add + local.set 21 + local.get 27 + local.get 0 + f32.load + f32.add + local.set 27 + end + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + local.get 11 + i32.const 1 + i32.add + local.tee 11 + i32.ne + br_if 0 (;@6;) + end + local.get 21 + i32.eqz + br_if 0 (;@5;) + i32.const 21 + i32.const 21 + call $__pragma_loopbound + local.get 27 + local.get 21 + f32.convert_i32_u + f32.div + local.set 40 + block ;; label = @6 + local.get 6 + i32.const 1 + i32.ge_s + br_if 0 (;@6;) + i32.const 0 + local.set 45 + br 3 (;@3;) + end + local.get 21 + i32.eqz + local.set 45 + i32.const 0 + local.set 46 + local.get 18 + local.set 47 + loop ;; label = @6 + local.get 20 + local.get 7 + local.get 17 + call $pm_memcpy + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + local.get 47 + f32.load + local.tee 26 + f32.const 0x0p+0 (;=0;) + f32.eq + br_if 0 (;@11;) + i32.const 64 + i32.const 64 + call $__pragma_loopbound + local.get 22 + br_if 2 (;@9;) + local.get 26 + local.get 40 + f32.sub + local.set 27 + local.get 19 + local.set 11 + local.get 20 + local.set 0 + block ;; label = @12 + local.get 35 + i32.eqz + br_if 0 (;@12;) + local.get 13 + local.set 21 + local.get 19 + local.set 8 + local.get 20 + local.set 0 + loop ;; label = @13 + local.get 27 + local.get 0 + f32.load + local.tee 26 + f32.add + local.get 26 + local.get 8 + local.tee 11 + i32.load8_u + local.tee 8 + select + local.set 26 + block ;; label = @14 + block ;; label = @15 + local.get 8 + br_if 0 (;@15;) + local.get 26 + local.get 12 + f32.lt + i32.eqz + br_if 1 (;@14;) + end + local.get 0 + local.get 12 + local.get 26 + local.get 26 + local.get 12 + f32.lt + select + f32.store + end + local.get 27 + local.get 0 + f32.load offset=4 + local.tee 26 + f32.add + local.get 26 + local.get 11 + i32.const 1 + i32.add + i32.load8_u + local.tee 8 + select + local.set 26 + block ;; label = @14 + block ;; label = @15 + local.get 8 + br_if 0 (;@15;) + local.get 26 + local.get 12 + f32.lt + i32.eqz + br_if 1 (;@14;) + end + local.get 0 + local.get 12 + local.get 26 + local.get 26 + local.get 12 + f32.lt + select + f32.store offset=4 + end + local.get 11 + i32.const 2 + i32.add + local.set 8 + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 21 + i32.const -2 + i32.add + local.tee 21 + br_if 0 (;@13;) + end + local.get 11 + i32.const 2 + i32.add + local.set 11 + end + local.get 32 + i32.eqz + br_if 1 (;@10;) + local.get 27 + local.get 0 + f32.load + local.tee 26 + f32.add + local.get 26 + local.get 11 + i32.load8_u + local.tee 11 + select + local.set 26 + block ;; label = @12 + local.get 11 + br_if 0 (;@12;) + local.get 26 + local.get 12 + f32.lt + i32.eqz + br_if 2 (;@10;) + end + local.get 0 + local.get 12 + local.get 26 + local.get 26 + local.get 12 + f32.lt + select + f32.store + br 1 (;@10;) + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + local.get 22 + br_if 1 (;@9;) + i32.const 0 + local.set 21 + local.get 7 + local.set 0 + block ;; label = @11 + local.get 35 + i32.const 3 + i32.lt_u + br_if 0 (;@11;) + i32.const 0 + local.set 0 + i32.const 0 + local.set 21 + loop ;; label = @12 + block ;; label = @13 + local.get 23 + local.get 0 + i32.add + local.tee 11 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@13;) + local.get 20 + local.get 0 + i32.add + local.get 12 + f32.store + end + block ;; label = @13 + local.get 11 + i32.const 4 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@13;) + local.get 20 + local.get 0 + i32.add + i32.const 4 + i32.add + local.get 12 + f32.store + end + block ;; label = @13 + local.get 11 + i32.const 8 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@13;) + local.get 20 + local.get 0 + i32.add + i32.const 8 + i32.add + local.get 12 + f32.store + end + block ;; label = @13 + local.get 11 + i32.const 12 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@13;) + local.get 20 + local.get 0 + i32.add + i32.const 12 + i32.add + local.get 12 + f32.store + end + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 3 + local.get 21 + i32.const 4 + i32.add + local.tee 21 + i32.ne + br_if 0 (;@12;) + end + local.get 23 + local.get 0 + i32.add + local.set 0 + end + local.get 31 + i32.eqz + br_if 0 (;@10;) + local.get 20 + local.get 21 + i32.const 2 + i32.shl + i32.add + local.set 11 + local.get 31 + local.set 21 + loop ;; label = @11 + block ;; label = @12 + local.get 0 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@12;) + local.get 11 + local.get 12 + f32.store + end + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@11;) + end + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + local.get 22 + i32.eqz + br_if 1 (;@8;) + f32.const 0x0p+0 (;=0;) + local.set 26 + br 2 (;@7;) + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + f32.const 0x0p+0 (;=0;) + local.set 26 + br 1 (;@7;) + end + local.get 2 + local.get 46 + i32.const 2 + i32.shl + i32.add + local.set 0 + f32.const 0x0p+0 (;=0;) + local.set 26 + block ;; label = @8 + block ;; label = @9 + local.get 35 + i32.const 3 + i32.ge_u + br_if 0 (;@9;) + local.get 20 + local.set 11 + br 1 (;@8;) + end + f32.const 0x0p+0 (;=0;) + local.set 26 + local.get 3 + local.set 21 + local.get 20 + local.set 11 + loop ;; label = @9 + local.get 0 + i32.const 12 + i32.add + f32.load + local.get 11 + i32.const 12 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 0 + i32.const 8 + i32.add + f32.load + local.get 11 + i32.const 8 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 0 + i32.const 4 + i32.add + f32.load + local.get 11 + i32.const 4 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 0 + f32.load + local.get 11 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + f32.add + f32.add + f32.add + local.set 26 + local.get 11 + i32.const 16 + i32.add + local.set 11 + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 21 + i32.const -4 + i32.add + local.tee 21 + br_if 0 (;@9;) + end + end + local.get 31 + i32.eqz + br_if 0 (;@7;) + local.get 31 + local.set 21 + loop ;; label = @8 + local.get 0 + f32.load + local.get 11 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + local.set 26 + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@8;) + end + end + local.get 15 + local.get 46 + i32.const 2 + i32.shl + i32.add + local.get 29 + local.get 26 + f32.mul + f32.store + local.get 47 + i32.const 4 + i32.add + local.set 47 + local.get 46 + i32.const 1 + i32.add + local.tee 46 + local.get 6 + i32.ne + br_if 0 (;@6;) + br 2 (;@4;) + end + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 1 + local.set 45 + local.get 6 + i32.const 1 + i32.lt_s + br_if 1 (;@3;) + i32.const 0 + local.set 8 + local.get 18 + local.set 46 + loop ;; label = @5 + local.get 7 + local.set 0 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 46 + f32.load + f32.const 0x0p+0 (;=0;) + f32.ne + br_if 0 (;@8;) + local.get 20 + local.get 7 + local.get 17 + call $pm_memcpy + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 22 + br_if 1 (;@7;) + i32.const 0 + local.set 21 + local.get 7 + local.set 11 + block ;; label = @9 + local.get 35 + i32.const 3 + i32.lt_u + br_if 0 (;@9;) + i32.const 0 + local.set 0 + i32.const 0 + local.set 21 + loop ;; label = @10 + block ;; label = @11 + local.get 23 + local.get 0 + i32.add + local.tee 11 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@11;) + local.get 20 + local.get 0 + i32.add + local.get 12 + f32.store + end + block ;; label = @11 + local.get 11 + i32.const 4 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@11;) + local.get 20 + local.get 0 + i32.add + i32.const 4 + i32.add + local.get 12 + f32.store + end + block ;; label = @11 + local.get 11 + i32.const 8 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@11;) + local.get 20 + local.get 0 + i32.add + i32.const 8 + i32.add + local.get 12 + f32.store + end + block ;; label = @11 + local.get 11 + i32.const 12 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@11;) + local.get 20 + local.get 0 + i32.add + i32.const 12 + i32.add + local.get 12 + f32.store + end + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 3 + local.get 21 + i32.const 4 + i32.add + local.tee 21 + i32.ne + br_if 0 (;@10;) + end + local.get 23 + local.get 0 + i32.add + local.set 11 + end + local.get 20 + local.set 0 + local.get 31 + i32.eqz + br_if 0 (;@8;) + local.get 20 + local.get 21 + i32.const 2 + i32.shl + i32.add + local.set 0 + local.get 31 + local.set 21 + loop ;; label = @9 + block ;; label = @10 + local.get 11 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@10;) + local.get 0 + local.get 12 + f32.store + end + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@9;) + end + local.get 20 + local.set 0 + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @8 + local.get 22 + i32.eqz + br_if 0 (;@8;) + f32.const 0x0p+0 (;=0;) + local.set 26 + br 2 (;@6;) + end + local.get 2 + local.get 8 + i32.const 2 + i32.shl + i32.add + local.set 11 + f32.const 0x0p+0 (;=0;) + local.set 26 + block ;; label = @8 + local.get 35 + i32.const 3 + i32.lt_u + br_if 0 (;@8;) + f32.const 0x0p+0 (;=0;) + local.set 26 + local.get 3 + local.set 21 + loop ;; label = @9 + local.get 11 + i32.const 12 + i32.add + f32.load + local.get 0 + i32.const 12 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 11 + i32.const 8 + i32.add + f32.load + local.get 0 + i32.const 8 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 11 + i32.const 4 + i32.add + f32.load + local.get 0 + i32.const 4 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 11 + f32.load + local.get 0 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + f32.add + f32.add + f32.add + local.set 26 + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 11 + i32.const 16 + i32.add + local.set 11 + local.get 21 + i32.const -4 + i32.add + local.tee 21 + br_if 0 (;@9;) + end + end + local.get 31 + i32.eqz + br_if 1 (;@6;) + local.get 31 + local.set 21 + loop ;; label = @8 + local.get 11 + f32.load + local.get 0 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + local.set 26 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@8;) + br 2 (;@6;) + end + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + f32.const 0x0p+0 (;=0;) + local.set 26 + end + local.get 46 + i32.const 4 + i32.add + local.set 46 + local.get 15 + local.get 8 + i32.const 2 + i32.shl + i32.add + local.get 29 + local.get 26 + f32.mul + f32.store + i32.const 1 + local.set 45 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + local.get 6 + i32.ne + br_if 0 (;@5;) + end + end + local.get 15 + f32.load + local.set 26 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 0 + local.set 21 + local.get 6 + i32.const 2 + i32.lt_s + br_if 1 (;@2;) + i32.const 0 + local.set 21 + i32.const 1 + local.set 0 + local.get 15 + local.set 11 + block ;; label = @4 + local.get 39 + br_if 0 (;@4;) + loop ;; label = @5 + local.get 0 + i32.const 3 + i32.add + local.tee 8 + local.get 0 + i32.const 2 + i32.add + local.get 0 + i32.const 1 + i32.add + local.get 0 + local.get 21 + local.get 26 + local.get 11 + f32.load offset=4 + local.tee 27 + f32.gt + local.tee 46 + select + local.get 27 + local.get 26 + local.get 46 + select + local.tee 26 + local.get 11 + f32.load offset=8 + local.tee 27 + f32.gt + local.tee 21 + select + local.get 27 + local.get 26 + local.get 21 + select + local.tee 26 + local.get 11 + f32.load offset=12 + local.tee 27 + f32.gt + local.tee 21 + select + local.get 27 + local.get 26 + local.get 21 + select + local.tee 26 + local.get 11 + f32.load offset=16 + local.tee 27 + f32.gt + local.tee 46 + select + local.set 21 + local.get 27 + local.get 26 + local.get 46 + select + local.set 26 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const 16 + i32.add + local.set 11 + local.get 8 + local.get 33 + i32.ne + br_if 0 (;@5;) + end + end + local.get 34 + i32.eqz + br_if 1 (;@2;) + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 34 + local.set 8 + loop ;; label = @4 + local.get 0 + local.get 21 + local.get 26 + local.get 11 + f32.load + local.tee 27 + f32.gt + local.tee 46 + select + local.set 21 + local.get 27 + local.get 26 + local.get 46 + select + local.set 26 + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 8 + i32.const -1 + i32.add + local.tee 8 + br_if 0 (;@4;) + br 2 (;@2;) + end + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 0 + local.set 21 + end + local.get 20 + local.get 7 + local.get 17 + call $pm_memcpy + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 18 + local.get 21 + i32.const 2 + i32.shl + local.tee 8 + i32.add + f32.load + local.tee 26 + f32.const 0x0p+0 (;=0;) + f32.eq + local.tee 47 + br_if 0 (;@5;) + local.get 45 + br_if 2 (;@3;) + i32.const 21 + i32.const 21 + call $__pragma_loopbound + local.get 26 + local.get 40 + f32.sub + local.set 43 + local.get 2 + local.get 8 + i32.add + local.set 46 + f32.const -0x1.4p+2 (;=-5;) + local.set 42 + i32.const 0 + local.set 8 + loop ;; label = @6 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 22 + br_if 0 (;@10;) + local.get 43 + local.get 42 + f32.add + local.set 26 + local.get 35 + br_if 1 (;@9;) + i32.const 0 + local.set 11 + local.get 19 + local.set 0 + br 2 (;@8;) + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + f32.const 0x0p+0 (;=0;) + local.set 26 + br 2 (;@7;) + end + i32.const 0 + local.set 0 + i32.const 0 + local.set 11 + loop ;; label = @9 + block ;; label = @10 + local.get 19 + local.get 11 + i32.add + local.tee 21 + i32.load8_u + i32.eqz + br_if 0 (;@10;) + local.get 20 + local.get 0 + i32.add + local.get 26 + local.get 23 + local.get 0 + i32.add + f32.load + f32.add + f32.store + end + block ;; label = @10 + local.get 21 + i32.const 1 + i32.add + i32.load8_u + i32.eqz + br_if 0 (;@10;) + local.get 20 + local.get 0 + i32.add + i32.const 4 + i32.add + local.get 26 + local.get 23 + local.get 0 + i32.add + i32.const 4 + i32.add + f32.load + f32.add + f32.store + end + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 13 + local.get 11 + i32.const 2 + i32.add + local.tee 11 + i32.ne + br_if 0 (;@9;) + end + local.get 19 + local.get 11 + i32.add + local.set 0 + end + block ;; label = @8 + local.get 32 + i32.eqz + br_if 0 (;@8;) + local.get 0 + i32.load8_u + i32.eqz + br_if 0 (;@8;) + local.get 20 + local.get 11 + i32.const 2 + i32.shl + local.tee 0 + i32.add + local.get 26 + local.get 7 + local.get 0 + i32.add + f32.load + f32.add + f32.store + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @8 + local.get 22 + i32.eqz + br_if 0 (;@8;) + f32.const 0x0p+0 (;=0;) + local.set 26 + br 1 (;@7;) + end + f32.const 0x0p+0 (;=0;) + local.set 26 + local.get 20 + local.set 0 + local.get 46 + local.set 11 + block ;; label = @8 + local.get 35 + i32.const 3 + i32.lt_u + br_if 0 (;@8;) + f32.const 0x0p+0 (;=0;) + local.set 26 + local.get 3 + local.set 21 + local.get 20 + local.set 0 + local.get 46 + local.set 11 + loop ;; label = @9 + local.get 11 + i32.const 12 + i32.add + f32.load + local.get 0 + i32.const 12 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 11 + i32.const 8 + i32.add + f32.load + local.get 0 + i32.const 8 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 11 + i32.const 4 + i32.add + f32.load + local.get 0 + i32.const 4 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 11 + f32.load + local.get 0 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + f32.add + f32.add + f32.add + local.set 26 + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 11 + i32.const 16 + i32.add + local.set 11 + local.get 21 + i32.const -4 + i32.add + local.tee 21 + br_if 0 (;@9;) + end + end + local.get 31 + i32.eqz + br_if 0 (;@7;) + local.get 31 + local.set 21 + loop ;; label = @8 + local.get 11 + f32.load + local.get 0 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + local.set 26 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@8;) + end + end + local.get 14 + local.get 8 + i32.const 2 + i32.shl + i32.add + local.get 29 + local.get 26 + f32.mul + f32.store + local.get 42 + f32.const 0x1p-1 (;=0.5;) + f32.add + local.set 42 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + i32.const 21 + i32.ne + br_if 0 (;@6;) + br 2 (;@4;) + end + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @5 + block ;; label = @6 + local.get 22 + br_if 0 (;@6;) + i32.const 0 + local.set 21 + block ;; label = @7 + local.get 35 + i32.const 3 + i32.lt_u + local.tee 46 + br_if 0 (;@7;) + i32.const 0 + local.set 0 + i32.const 0 + local.set 21 + loop ;; label = @8 + block ;; label = @9 + local.get 23 + local.get 0 + i32.add + local.tee 11 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@9;) + local.get 20 + local.get 0 + i32.add + local.get 12 + f32.store + end + block ;; label = @9 + local.get 11 + i32.const 4 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@9;) + local.get 20 + local.get 0 + i32.add + i32.const 4 + i32.add + local.get 12 + f32.store + end + block ;; label = @9 + local.get 11 + i32.const 8 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@9;) + local.get 20 + local.get 0 + i32.add + i32.const 8 + i32.add + local.get 12 + f32.store + end + block ;; label = @9 + local.get 11 + i32.const 12 + i32.add + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@9;) + local.get 20 + local.get 0 + i32.add + i32.const 12 + i32.add + local.get 12 + f32.store + end + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 3 + local.get 21 + i32.const 4 + i32.add + local.tee 21 + i32.ne + br_if 0 (;@8;) + end + local.get 23 + local.get 0 + i32.add + local.set 7 + end + block ;; label = @7 + local.get 31 + i32.eqz + br_if 0 (;@7;) + local.get 20 + local.get 21 + i32.const 2 + i32.shl + i32.add + local.set 0 + local.get 31 + local.set 11 + loop ;; label = @8 + block ;; label = @9 + local.get 7 + f32.load + local.get 12 + f32.lt + i32.eqz + br_if 0 (;@9;) + local.get 0 + local.get 12 + f32.store + end + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 11 + i32.const -1 + i32.add + local.tee 11 + br_if 0 (;@8;) + end + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @7 + local.get 22 + i32.eqz + br_if 0 (;@7;) + f32.const 0x0p+0 (;=0;) + local.set 26 + br 2 (;@5;) + end + local.get 2 + local.get 8 + i32.add + local.set 0 + f32.const 0x0p+0 (;=0;) + local.set 26 + block ;; label = @7 + block ;; label = @8 + local.get 46 + i32.eqz + br_if 0 (;@8;) + local.get 20 + local.set 11 + br 1 (;@7;) + end + f32.const 0x0p+0 (;=0;) + local.set 26 + local.get 3 + local.set 21 + local.get 20 + local.set 11 + loop ;; label = @8 + local.get 0 + i32.const 12 + i32.add + f32.load + local.get 11 + i32.const 12 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 0 + i32.const 8 + i32.add + f32.load + local.get 11 + i32.const 8 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 0 + i32.const 4 + i32.add + f32.load + local.get 11 + i32.const 4 + i32.add + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 0 + f32.load + local.get 11 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + f32.add + f32.add + f32.add + local.set 26 + local.get 11 + i32.const 16 + i32.add + local.set 11 + local.get 0 + i32.const 16 + i32.add + local.set 0 + local.get 21 + i32.const -4 + i32.add + local.tee 21 + br_if 0 (;@8;) + end + end + local.get 31 + i32.eqz + br_if 1 (;@5;) + local.get 31 + local.set 21 + loop ;; label = @7 + local.get 0 + f32.load + local.get 11 + f32.load + f32.sub + local.tee 27 + local.get 27 + f32.mul + local.get 26 + f32.add + local.set 26 + local.get 11 + i32.const 4 + i32.add + local.set 11 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@7;) + br 2 (;@5;) + end + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + f32.const 0x0p+0 (;=0;) + local.set 26 + end + local.get 16 + local.get 41 + i32.const 2 + i32.shl + i32.add + local.get 29 + local.get 26 + f32.mul + f32.store + end + local.get 47 + br_if 1 (;@2;) + end + local.get 14 + f32.load + local.set 26 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 16 + local.get 41 + i32.const 2 + i32.shl + i32.add + local.get 14 + f32.load offset=80 + local.tee 27 + local.get 14 + f32.load offset=76 + local.tee 42 + local.get 14 + f32.load offset=72 + local.tee 43 + local.get 14 + f32.load offset=68 + local.tee 44 + local.get 14 + f32.load offset=64 + local.tee 48 + local.get 14 + f32.load offset=60 + local.tee 49 + local.get 14 + f32.load offset=56 + local.tee 50 + local.get 14 + f32.load offset=52 + local.tee 51 + local.get 14 + f32.load offset=48 + local.tee 52 + local.get 14 + f32.load offset=44 + local.tee 53 + local.get 14 + f32.load offset=40 + local.tee 54 + local.get 14 + f32.load offset=36 + local.tee 55 + local.get 14 + f32.load offset=32 + local.tee 56 + local.get 14 + f32.load offset=28 + local.tee 57 + local.get 14 + f32.load offset=24 + local.tee 58 + local.get 14 + f32.load offset=20 + local.tee 59 + local.get 14 + f32.load offset=16 + local.tee 60 + local.get 14 + f32.load offset=12 + local.tee 61 + local.get 14 + f32.load offset=8 + local.tee 62 + local.get 14 + f32.load offset=4 + local.tee 63 + local.get 26 + local.get 26 + local.get 63 + f32.gt + select + local.tee 26 + local.get 26 + local.get 62 + f32.gt + select + local.tee 26 + local.get 26 + local.get 61 + f32.gt + select + local.tee 26 + local.get 26 + local.get 60 + f32.gt + select + local.tee 26 + local.get 26 + local.get 59 + f32.gt + select + local.tee 26 + local.get 26 + local.get 58 + f32.gt + select + local.tee 26 + local.get 26 + local.get 57 + f32.gt + select + local.tee 26 + local.get 26 + local.get 56 + f32.gt + select + local.tee 26 + local.get 26 + local.get 55 + f32.gt + select + local.tee 26 + local.get 26 + local.get 54 + f32.gt + select + local.tee 26 + local.get 26 + local.get 53 + f32.gt + select + local.tee 26 + local.get 26 + local.get 52 + f32.gt + select + local.tee 26 + local.get 26 + local.get 51 + f32.gt + select + local.tee 26 + local.get 26 + local.get 50 + f32.gt + select + local.tee 26 + local.get 26 + local.get 49 + f32.gt + select + local.tee 26 + local.get 26 + local.get 48 + f32.gt + select + local.tee 26 + local.get 26 + local.get 44 + f32.gt + select + local.tee 26 + local.get 26 + local.get 43 + f32.gt + select + local.tee 26 + local.get 26 + local.get 42 + f32.gt + select + local.tee 26 + local.get 26 + local.get 27 + f32.gt + select + f32.store + end + local.get 23 + local.get 30 + i32.add + local.set 23 + local.get 41 + i32.const 1 + i32.add + local.tee 41 + local.get 5 + i32.ne + br_if 0 (;@1;) + end + local.get 16 + f32.load + local.set 12 + i32.const 59 + i32.const 59 + call $__pragma_loopbound + i32.const 1 + local.set 0 + i32.const 0 + local.set 11 + block ;; label = @1 + local.get 5 + i32.const 1 + i32.eq + br_if 0 (;@1;) + local.get 5 + i32.const -1 + i32.add + local.tee 11 + i32.const 3 + i32.and + local.set 21 + block ;; label = @2 + block ;; label = @3 + local.get 5 + i32.const -2 + i32.add + i32.const 3 + i32.ge_u + br_if 0 (;@3;) + i32.const 0 + local.set 11 + br 1 (;@2;) + end + local.get 11 + i32.const -4 + i32.and + local.set 8 + i32.const 0 + local.set 11 + i32.const 1 + local.set 0 + loop ;; label = @3 + local.get 0 + i32.const 3 + i32.add + local.tee 20 + local.get 0 + i32.const 2 + i32.add + local.get 0 + i32.const 1 + i32.add + local.get 0 + local.get 11 + local.get 12 + local.get 16 + f32.load offset=4 + local.tee 26 + f32.gt + local.tee 23 + select + local.get 26 + local.get 12 + local.get 23 + select + local.tee 12 + local.get 16 + f32.load offset=8 + local.tee 26 + f32.gt + local.tee 11 + select + local.get 26 + local.get 12 + local.get 11 + select + local.tee 12 + local.get 16 + f32.load offset=12 + local.tee 26 + f32.gt + local.tee 11 + select + local.get 26 + local.get 12 + local.get 11 + select + local.tee 12 + local.get 16 + f32.load offset=16 + local.tee 26 + f32.gt + local.tee 23 + select + local.set 11 + local.get 26 + local.get 12 + local.get 23 + select + local.set 12 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 16 + i32.const 16 + i32.add + local.set 16 + local.get 20 + local.get 8 + i32.ne + br_if 0 (;@3;) + end + end + local.get 21 + i32.eqz + br_if 0 (;@1;) + local.get 16 + i32.const 4 + i32.add + local.set 20 + loop ;; label = @2 + local.get 0 + local.get 11 + local.get 12 + local.get 20 + f32.load + local.tee 26 + f32.gt + local.tee 23 + select + local.set 11 + local.get 26 + local.get 12 + local.get 23 + select + local.set 12 + local.get 20 + i32.const 4 + i32.add + local.set 20 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 21 + i32.const -1 + i32.add + local.tee 21 + br_if 0 (;@2;) + end + end + local.get 11) + (func $__original_main (type 4) (result i32) + call $pm_math_init + call $pm_main + i32.const 0 + i32.load offset=32224 + i32.const -12 + i32.add) + (func $pm_math_init (type 1) + i32.const 0 + i32.const 552771933 + i32.store offset=34040 + i32.const 0 + i64.const 2528670972625818563 + i64.store offset=34032 + i32.const 0 + i64.const 2831240500891565983 + i64.store offset=34024 + i32.const 0 + i64.const 3123034819496889253 + i64.store offset=34016 + i32.const 0 + i64.const 3400378458638874312 + i64.store offset=34008 + i32.const 0 + i64.const 3663451983036281470 + i64.store offset=34000 + i32.const 0 + i64.const 3907135585513377025 + i64.store offset=33992 + i32.const 0 + i64.const 4129815157229882209 + i64.store offset=33984 + i32.const 0 + i64.const 4325857565107464874 + i64.store offset=33976 + i32.const 0 + i64.const 4479580431846473728 + i64.store offset=33968 + i32.const 0 + i32.const 1051372203 + i32.store offset=34048 + i32.const 0 + i32.const 1045220557 + i32.store offset=34064 + i32.const 0 + i32.const 1041385765 + i32.store offset=34072 + i32.const 0 + i32.const 1038323257 + i32.store offset=34080 + i32.const 0 + i32.const 1035611788 + i32.store offset=34096 + i32.const 0 + i32.const 1033734617 + i32.store offset=34112 + i32.const 0 + i32.const 1032358025 + i32.store offset=34120 + i32.const 0 + i32.const 1029149750 + i32.store offset=34144 + i32.const 0 + i32.const 1030811889 + i32.store offset=34128 + i32.const 0 + i32.const 1027804209 + i32.store offset=34160 + i32.const 0 + i32.const 1026692675 + i32.store offset=34168 + i32.const 0 + i32.const 1025758986 + i32.store offset=34176 + i32.const 0 + i32.const 1024963622 + i32.store offset=34192 + i32.const 0 + i32.const 1024277963 + i32.store offset=34208 + i32.const 0 + i32.const 1023680776 + i32.store offset=34216 + i32.const 0 + i32.const 1022901776 + i32.store offset=34224) + (func $pm_pow10f (type 5) (param f32) (result f32) + (local f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + i32.const 0 + f32.load offset=34040 + local.get 0 + f32.const 0x1.26bb1cp+1 (;=2.30259;) + f32.mul + local.tee 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 1 + f32.mul + local.tee 2 + f32.mul + local.tee 3 + f32.mul + local.tee 4 + f32.mul + local.tee 5 + f32.mul + local.tee 6 + f32.mul + local.tee 7 + f32.mul + local.tee 8 + f32.mul + local.tee 9 + f32.mul + local.tee 10 + f32.mul + local.tee 11 + f32.mul + local.tee 12 + f32.mul + local.tee 13 + f32.mul + local.tee 14 + f32.mul + local.tee 15 + f32.mul + local.tee 16 + f32.mul + local.tee 17 + f32.mul + local.tee 18 + f32.mul + f32.mul + i32.const 0 + f32.load offset=34036 + local.get 18 + f32.mul + i32.const 0 + f32.load offset=34032 + local.get 17 + f32.mul + i32.const 0 + f32.load offset=34028 + local.get 16 + f32.mul + i32.const 0 + f32.load offset=34024 + local.get 15 + f32.mul + i32.const 0 + f32.load offset=34020 + local.get 14 + f32.mul + i32.const 0 + f32.load offset=34016 + local.get 13 + f32.mul + i32.const 0 + f32.load offset=34012 + local.get 12 + f32.mul + i32.const 0 + f32.load offset=34008 + local.get 11 + f32.mul + i32.const 0 + f32.load offset=34004 + local.get 10 + f32.mul + i32.const 0 + f32.load offset=34000 + local.get 9 + f32.mul + i32.const 0 + f32.load offset=33996 + local.get 8 + f32.mul + i32.const 0 + f32.load offset=33992 + local.get 7 + f32.mul + i32.const 0 + f32.load offset=33988 + local.get 6 + f32.mul + i32.const 0 + f32.load offset=33984 + local.get 5 + f32.mul + i32.const 0 + f32.load offset=33980 + local.get 4 + f32.mul + i32.const 0 + f32.load offset=33976 + local.get 3 + f32.mul + i32.const 0 + f32.load offset=33972 + local.get 2 + f32.mul + i32.const 0 + f32.load offset=33968 + local.get 1 + f32.mul + local.get 0 + f32.const 0x1p+0 (;=1;) + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add) + (func $pm_log10f (type 5) (param f32) (result f32) + (local f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + i32.const 0 + f32.load offset=34224 + local.get 0 + f32.const -0x1p+0 (;=-1;) + f32.add + local.get 0 + f32.const 0x1p+0 (;=1;) + f32.add + f32.div + local.tee 1 + local.get 1 + f32.mul + local.tee 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 1 + local.get 0 + f32.mul + local.tee 2 + f32.mul + local.tee 3 + f32.mul + local.tee 4 + f32.mul + local.tee 5 + f32.mul + local.tee 6 + f32.mul + local.tee 7 + f32.mul + local.tee 8 + f32.mul + local.tee 9 + f32.mul + local.tee 10 + f32.mul + local.tee 11 + f32.mul + local.tee 12 + f32.mul + local.tee 13 + f32.mul + local.tee 14 + f32.mul + local.tee 15 + f32.mul + local.tee 0 + f32.mul + f32.mul + i32.const 0 + f32.load offset=34216 + local.get 0 + f32.mul + i32.const 0 + f32.load offset=34208 + local.get 15 + f32.mul + i32.const 0 + f32.load offset=34192 + local.get 14 + f32.mul + i32.const 0 + f32.load offset=34176 + local.get 13 + f32.mul + i32.const 0 + f32.load offset=34168 + local.get 12 + f32.mul + i32.const 0 + f32.load offset=34160 + local.get 11 + f32.mul + i32.const 0 + f32.load offset=34144 + local.get 10 + f32.mul + i32.const 0 + f32.load offset=34128 + local.get 9 + f32.mul + i32.const 0 + f32.load offset=34120 + local.get 8 + f32.mul + i32.const 0 + f32.load offset=34112 + local.get 7 + f32.mul + i32.const 0 + f32.load offset=34096 + local.get 6 + f32.mul + i32.const 0 + f32.load offset=34080 + local.get 5 + f32.mul + i32.const 0 + f32.load offset=34072 + local.get 4 + f32.mul + i32.const 0 + f32.load offset=34064 + local.get 3 + f32.mul + i32.const 0 + f32.load offset=34048 + local.get 2 + f32.mul + local.get 1 + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.const 0x1.bcb7b2p-1 (;=0.868589;) + f32.mul) + (func $pm_fabs (type 5) (param f32) (result f32) + local.get 0 + local.get 0 + f32.neg + local.get 0 + f32.const 0x0p+0 (;=0;) + f32.ge + select) + (func $pm_floor (type 5) (param f32) (result f32) + (local f32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 0 + f32.neg + local.tee 1 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 1 + i32.trunc_f32_s + local.set 2 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 2 + end + local.get 0 + f32.const 0x0p+0 (;=0;) + f32.ge + local.set 3 + local.get 2 + i32.const -1 + i32.xor + local.set 2 + block ;; label = @1 + block ;; label = @2 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 4 + end + local.get 4 + local.get 2 + local.get 3 + select + f32.convert_i32_s) + (func $pm_ceil (type 5) (param f32) (result f32) + block ;; label = @1 + local.get 0 + f32.const 0x1p+0 (;=1;) + f32.add + local.get 0 + local.get 0 + f32.const 0x0p+0 (;=0;) + f32.gt + select + local.tee 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.trunc_f32_s + f32.convert_i32_s + return + end + i32.const -2147483648 + f32.convert_i32_s) + (func $pm_memcpy (type 6) (param i32 i32 i32) + (local i32 i32 i32 i32) + i32.const 44 + i32.const 256 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 2 + i32.const 3 + i32.and + local.set 3 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 2 + i32.const 4 + i32.lt_u + br_if 0 (;@2;) + local.get 2 + i32.const 2147483644 + i32.and + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 0 + local.get 4 + i32.add + local.tee 2 + local.get 1 + local.get 4 + i32.add + local.tee 6 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 3 + i32.add + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 5 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 3 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 4 + i32.add + local.set 2 + local.get 0 + local.get 4 + i32.add + local.set 4 + loop ;; label = @2 + local.get 4 + local.get 2 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end) + (func $pm_memset (type 6) (param i32 i32 i32) + (local i32 i32 i32) + i32.const 64 + i32.const 64 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 2 + i32.const 7 + i32.and + local.set 3 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 2 + i32.const 8 + i32.lt_u + br_if 0 (;@2;) + local.get 2 + i32.const 2147483640 + i32.and + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 0 + local.get 4 + i32.add + local.tee 2 + local.get 1 + i32.store8 + local.get 2 + i32.const 7 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 6 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 5 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 4 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 3 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 1 + i32.store8 + local.get 5 + local.get 4 + i32.const 8 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 3 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 4 + i32.add + local.set 2 + loop ;; label = @2 + local.get 2 + local.get 1 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 38336)) + (global (;1;) i32 (i32.const 34228)) + (global (;2;) i32 (i32.const 38336)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $pm_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00HB\00\00HB\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\00\00 A\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\cd\cc\cc=\ce\dd\ce=\dfo\d4=~h\cb=GZ\1cA\11S\1fA\d9\ce#A\9cm\1cA\9a\08\22AU\13\1eAa\c3!A\01{\1cAtF A\df\95\19A\0dl\1eAxz!A\09\f9\1eAG\f2LB\8cyEB2\8f\18A\08\0f\1cA\ef8LB\15\8cGBz6!AS\05#A\ed6\19A\dd\ef\1dA\0a\bf\1dA\ee\bd\1cA\d3j\1fA\01\de$A\80\e0\1fA\91\ed#A\ac\c5\1dA%\06 A\a6~\1dA\df\e0!A82\1fA7\89!A:#\22A\db\bf\1fAE\d8\22A\f1c'A\ac\ad!AU\f6\1fA\ee\eb\22A\e0- A\1bu\1cA\b9\8d!A\e7\fb\1fA\bd\1d\1fA\b5\15$A\94\f6%A\edS\1eA\caT A`j\1dAw-\22A\ebn\18A\02+#Ah\b3 A\01\df\cd=?\c5\d1=\cf\ac\cb=/A\cc=\00\00\00\00\11\00\00\00\9a\1a\05\08\00\00\00\00\00\00\00\00Q\c4\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")) diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm.c new file mode 100644 index 0000000..e79ab4b --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm.c @@ -0,0 +1,741 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This is the ANSI C Pattern Match kernel. It finds the closest + match of a pattern from a library of patterns. The code below + serves as a reference implemenation of the pattern match kernel. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_math.h" +#include "pm_string.h" + +/* + Definition of types +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +typedef struct pm_float_array_t { + float *data; + void *datav; + int size[3]; + unsigned int ndims; + unsigned int rctype; + char padding[4]; +} pm_float_array_t; + +typedef struct pm_data_t { + float *template_profiles_db; /* the library of patterns */ + float *test_profile_db; /* the test pattern */ + + float *template_copy; /* temporary storage for a template */ + float *test_noise_db_array; /* copies of test noise in an array for + fast copy */ + float *MSE_scores; /* the likelihood of the matching between a + range shift of the test pattern and the libary */ + float *mag_shift_scores; /* the likelihood of the matching between a + magnitude scaling of the test pattern and the + libary */ + float *minimum_MSE_score; /* the likelihood of the matching between the + test pattern and the libary */ + float *all_shifted_test_db; /* contains the shiftings of the test pattern */ + + unsigned char *template_exceed; /* marking where a library template + exceeds twice the noise level of + the test pattern */ + float *test_exceed_means; /* pixels where test pattern exceeds twice + its noise level */ + + float shift_ratio; /* determines the number of range shifts */ + int shift_size; /* the actual number of range shifts */ + int profile_size; /* the length of the pattern */ + int num_templates; /* the number of library templates */ + int elsize; /* the size of a single fp number */ + char padding[4]; +} pm_data_t; + +/* + Forward declaration of functions +*/ + +void pm_init_lib(pm_float_array_t *lib); +void pm_init_pattern(pm_float_array_t *pattern); +void pm_init_data(pm_data_t *pmdata, pm_float_array_t *lib, + pm_float_array_t *pattern); +void pm_clean(pm_data_t *pmdata); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +pm_main(void); +void pm_init(void); +int pm_return(void); +int pm_kernel(pm_data_t *pmdata); + +/* + Declaration of global variables +*/ + +/* input data */ +extern float pm_lib_data[60][64]; +extern float pm_pattern_data[60][64]; + +/* some magic number */ +#define pm_MIN_NOISE 1e-10f + +/* main data structures used by the benchmark */ +static pm_data_t pm_data; +static pm_float_array_t pm_lib; +static float *pm_lib_ptr[60]; +static pm_float_array_t pm_pattern; +static float *pm_pattern_ptr[60]; +static int pm_result; + +/* arrays for the pm_init_data function */ +static unsigned char pm_init_array_1[64]; +static float pm_init_array_2[21]; +static float pm_init_array_3[64]; +static float pm_init_array_4[64]; +static float pm_init_array_5[21]; +static float pm_init_array_6[21]; +static float pm_init_array_7[72]; +static float pm_init_array_8[110]; + +/* + Initialization- and return-value-related functions +*/ + +void +pm_init_lib(pm_float_array_t *lib) { + int i; + volatile int do_not_optimize_away = 0; + + lib->rctype = 1; + lib->ndims = 2; + lib->size[0] = 60; + lib->size[1] = 64; + lib->size[2] = 0; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_lib_ptr[i] = pm_lib_data[i]; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_lib_ptr[i] += do_not_optimize_away; + + lib->data = *pm_lib_ptr; + lib->datav = (void *) pm_lib_ptr; +} + +void +pm_init_pattern(pm_float_array_t *pattern) { + int i; + volatile int do_not_optimize_away = 0; + + pattern->rctype = 1; + pattern->ndims = 2; + pattern->size[0] = 60; + pattern->size[1] = 64; + pattern->size[2] = 0; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_pattern_ptr[i] = pm_pattern_data[i]; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_pattern_ptr[i] += do_not_optimize_away; + + pattern->data = *pm_pattern_ptr; + pattern->datav = (void *) pm_pattern_ptr; +} + +void +pm_init(void) { + pm_math_init(); +} + +int +pm_return(void) { + return pm_result - 12; +} + +/* + Core benchmark functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +pm_main(void) { + pm_init_lib(&pm_lib); + pm_init_pattern(&pm_pattern); + pm_init_data(&pm_data, &pm_lib, &pm_pattern); + pm_result = pm_kernel(&pm_data); + pm_clean(&pm_data); +} + +/***********************************************************************/ +/* Allocate and initailize the test pattern, the template library, and + other necessary data structure. */ +/***********************************************************************/ +void +pm_init_data(pm_data_t *pmdata, pm_float_array_t *lib, + pm_float_array_t *pattern) { + int elsize = sizeof(float); + float x; + + /* Getting the input parameters from the PCA C array structure */ + pmdata->profile_size = lib->size[1]; + pmdata->num_templates = lib->size[0]; + + pmdata->elsize = elsize; + pmdata->shift_ratio = 3.0f; + + pmdata->template_profiles_db = lib->data; + pmdata->test_profile_db = pattern->data; + + /* Equivalent to shift_size = roundf((float)profile_size / shift_ratio) */ + x = (float) (pmdata->profile_size) / pmdata->shift_ratio; + pmdata->shift_size = + ((x - (int) (x)) < 0.5f) ? (int) (pm_floor(x)) : (int) (pm_ceil(x)); + + pmdata->template_exceed = pm_init_array_1; + pmdata->test_exceed_means = pm_init_array_2; + + pmdata->template_copy = pm_init_array_3; + pmdata->test_noise_db_array = pm_init_array_4; + + pmdata->MSE_scores = pm_init_array_5; + pmdata->mag_shift_scores = pm_init_array_6; + + pmdata->minimum_MSE_score = pm_init_array_7; + pmdata->all_shifted_test_db = pm_init_array_8; +} + +/***********************************************************************/ +/* Free up memory for all structures */ +/***********************************************************************/ +void +pm_clean(pm_data_t *pmdata) { + pmdata->test_exceed_means = 0; + pmdata->template_exceed = 0; + pmdata->template_copy = 0; + pmdata->test_noise_db_array = 0; + pmdata->MSE_scores = 0; + pmdata->mag_shift_scores = 0; + pmdata->minimum_MSE_score = 0; + pmdata->all_shifted_test_db = 0; +} + +/***********************************************************************/ +/* The pattern match kernel overlays two patterns to compute the likelihood + that the two vectors match. This process is performed on a library of + patterns. */ +/***********************************************************************/ +int +pm_kernel(pm_data_t *pmdata) { + const int elsize = pmdata->elsize; /* size of a single fp number */ + const int shift_size = pmdata->shift_size; /* number of shifting to the + left and right of the test + profile */ + const int profile_size = + pmdata->profile_size; /* number of pixels in a pattern */ + const int num_templates = + pmdata->num_templates; /* number of library patterns */ + float *test_profile_db = pmdata->test_profile_db; /* the test pattern */ + float *template_profiles_db = + pmdata->template_profiles_db; /* the library of patterns */ + float *test_noise_db_array = + pmdata->test_noise_db_array; /* the noise in the test pattern in an + array for fast copy */ + float *all_shifted_test_db = + pmdata->all_shifted_test_db; /* the shifted test pattern */ + + int match_index; /* the index of the most likely template that matches the + test pattern */ + int min_MSE_index; /* the index of the range shifts with + the lowest mean square error */ + unsigned int num_template_exceed, + num_test_exceed; /* the number of pixels exceeded the test pattern + and a library template */ + + unsigned char mag_shift_scores_flag; /* flag that tells if the magnitude + scaling loop has been run + (existed just to save ops) */ + + float test_peak, template_peak; /* the maximum pixels of the test pattern + and a library template pattern */ + float template_noise; /* the noise level of a library template */ + + float noise_shift, noise_shift2; /* temporary storage for calculating the + mse for range shifting */ + + float min_MSE, + match_score; /* temporary storage for finding the minimum mse */ + + float sumWeights_inv = + 1.0f / profile_size; /* the inverse of the weights + used for calculating the mse */ + /* Note: weights for the kernel would be application dependent. + They are set to 1 for our purposes */ + + float mag_db; /* the magnitude shifts in dB */ + float power_shift, + ave_power_ratio; /* the diff of the avg shifted test profile power to + the avg template power */ + float power_ratio; /* the mean power of the pixels of a template that + exceeded twice test noise */ + + float test_noise = (pm_pow10f(test_profile_db[0] * + 0.1f) + /* noise level of the test pattern */ + pm_pow10f(test_profile_db[profile_size - 1] * 0.1f)) * + 0.5f; + + /* since "shift_size/2" is used a lot, so we create a var to hold it */ + int half_shift_size = (int) (pm_ceil((float) (shift_size) / 2.0f)); + int template_index, current_shift; /* indices */ + int patsize = profile_size * elsize; /* number of bytes of a pattern */ + + float *minimum_MSE_score = pmdata->minimum_MSE_score; + float *MSE_scores = pmdata->MSE_scores; + float *mag_shift_scores = pmdata->mag_shift_scores; + + float test_noise_db = + (test_noise == 0.0f) + ? -100.0f + : 10.0f * pm_log10f(pm_fabs(test_noise)); /* test noise in dB */ + float test_noise_db_plus_3 = + test_noise_db + 3.0f; /* twice test noise in the + power domain, approximately +3dB */ + + float *template_copy = pmdata->template_copy; + unsigned char *template_exceed = pmdata->template_exceed; + float *test_exceed_means = pmdata->test_exceed_means; + + int i, j; /* indices */ + + float + tmp1; /* temporary storage for calculating the mse for range shifting */ + float sum_exceed; /* the sum of the test pattern pixels exceeded twice + test noise */ + float template_exceed_mean = 0; /* the mean of a template pattern pixels + exceeded twice test noise */ + float weighted_MSE; /* temporary storage for computing the weighted MSE */ + + /* These pointers are solely used for fast memory access */ + float *cur_tp, *fptr, *fptr2, *fptr3, *endptr; + unsigned char *bptr; + + /* Having an array of test noise for fast copying of noise returns */ + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) + test_noise_db_array[i] = test_noise_db; + + /* Finding the maximum pixels of the test pattern */ + fptr = test_profile_db; + test_peak = *fptr++; + __pragma_loopbound(63, 63); + for (i = 1; i < profile_size; i++, fptr++) { + if (test_peak < *fptr) + test_peak = *fptr; + } + + /* Paddle array for all the possible range shifts. Essentially, we are + performing the following: + + Adding these two portions to the beginning and end of the test pattern + | | + V V + |<------>| |<------>| + + __ __ + | | | | + | |___| | + | | + _________| |_________ <- test noise in dB domain + --------------------------------------- <- zero + + |<--------------->| + original test pattern + + + The all_shifted_test_db will be accessed in a sliding window manner. + */ + + pm_memcpy((void *) all_shifted_test_db, (void *) test_noise_db_array, + elsize * half_shift_size); + pm_memcpy((void *) (all_shifted_test_db + half_shift_size), + (void *) test_profile_db, elsize * profile_size); + pm_memcpy((void *) (all_shifted_test_db + half_shift_size + profile_size), + (void *) test_noise_db_array, elsize * half_shift_size); + + /* Set the pixels to test noise in dB domain if pixel is less than test + noise in dB */ + fptr = all_shifted_test_db + half_shift_size; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++, fptr++) { + if (*fptr < test_noise_db) + *fptr = test_noise_db; + } + + /* Calculating the mean of the pixels that exceeded twice test noise for + each possible shift of the test profile */ + fptr2 = test_exceed_means; + __pragma_loopbound(21, 21); + for (current_shift = 0; current_shift < shift_size; current_shift++) { + /* Pointer arithmetics to find the start and end pointers */ + if (current_shift < half_shift_size) { + endptr = all_shifted_test_db + current_shift + profile_size; + fptr = all_shifted_test_db + half_shift_size; + } else { + endptr = all_shifted_test_db + half_shift_size + profile_size; + fptr = all_shifted_test_db + current_shift; + } + + /* Summing the pixels that exceed twice test noise for the current + * shifts */ + sum_exceed = 0.0f; + num_test_exceed = 0; + __pragma_loopbound(53, 64); + while (fptr != endptr) { + if (*fptr > test_noise_db_plus_3) { + num_test_exceed++; + sum_exceed += *fptr; + } + fptr++; + } + *fptr2++ = + num_test_exceed ? sum_exceed / (float) (num_test_exceed) : 0.0f; + } + + /* Loop over all the templates. Determine the best shift distance, then + the best gain adjustment. */ + __pragma_loopbound(60, 60); + for (template_index = 0; template_index < num_templates; template_index++) { + cur_tp = template_profiles_db + (template_index * profile_size); + + /* Scale the template profile we're currently working on so that its + peak is equal to the peak of the test profile */ + + fptr = cur_tp; + template_peak = *fptr++; + __pragma_loopbound(63, 63); + for (i = 1; i < profile_size; i++, fptr++) { + if (template_peak < *fptr) + template_peak = *fptr; + } + + /* Additively adjust the noise level of this template profile in the + raw power domain so that its noise level matches the noise level + of the test profile */ + + /* -------------------------------------------------------------------- + Setting up all the constants */ + + noise_shift = test_peak - template_peak; + pm_memset((void *) template_exceed, 0, + ((int) sizeof(char)) * profile_size); + sum_exceed = 0.0f; + num_template_exceed = 0; + + /* -------------------------------------------------------------------- + The following blocks are optimized code that essentially + perform the operations immediately below. The calculation of the + template noise constants is done once the exponentials are complete + */ + + /* template_profile = template_profile + test_peak - template_peak + template = 10 ^ (template_profile / 10) + template = template + test_noise - template_noise + if (input < fp_epsilon) then clip the input to -100 dB + template = log10( abs(template) ) + template_profile = 10 * template + test_noise_db */ + + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr + noise_shift; + *fptr = pm_pow10f(tmp1 * 0.1f); + fptr++; + } + + /* Calculates noise levels from first and last elements of the current + template */ + + template_noise = (cur_tp[0] + cur_tp[profile_size - 1]) * 0.5f; + noise_shift2 = test_noise - template_noise; + + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr + noise_shift2; + + if (tmp1 == 0.0f) + tmp1 = pm_MIN_NOISE; + + *fptr = 10.0f * pm_log10f(pm_fabs(tmp1)) + test_noise_db; + + /* Because many of the operations in the search for the best shift + amount depend on knowledge of which pixels in the template + have values exceeding twice test_noise (recall that 3db is + roughly equivalent to a doubling of raw power), we'll put those + indices in template_exceed */ + + if (*fptr > test_noise_db_plus_3) { + template_exceed[i] = 1; + num_template_exceed++; + sum_exceed += *fptr; + } + + fptr++; + } + + /* Note: The following block has 4 different branches: + 1. Both the current template and the test pattern have values + exceeded twice test noise. + 2. Only the current template has values exceeded twice test noise. + 3. Only the test pattern has values exceeded twice test noise. + 4. Neither the current template nor the test pattern has values + exceeded twice test noise. + */ + + /* If there is at least one pixel in the template we're + currently working on whose value exceeds twice test_noise */ + if (num_template_exceed) { + template_exceed_mean = sum_exceed / (float) (num_template_exceed); + fptr3 = test_exceed_means; + + __pragma_loopbound(21, 21); + for (current_shift = 0; current_shift < shift_size; + current_shift++, fptr3++) { + /* Work on a copy of the template we're currently working on */ + pm_memcpy((void *) template_copy, (void *) cur_tp, patsize); + + /* If there is at least one pixel in the shifted test profile + whose value exceeds twice test noise. */ + if (*fptr3 != 0.0f) { + /* CASE 1 */ + /* Considering only those pixels whose powers exceed twice + test noise, compute the difference of the mean power in + template we're currently working on. */ + power_ratio = *fptr3 - template_exceed_mean; + + /* Scale template values that exceed twice test noise by + power ratio and set the values that are less than test + noise in db to test noise in db */ + fptr = template_copy; + bptr = template_exceed; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++, fptr++) { + if (*bptr++) + *fptr += power_ratio; + + if (*fptr < test_noise_db) + *fptr = test_noise_db; + } + } /* if (*fptr3 != 0.0f) */ + else { + /* CASE 2 */ + /* Set those pixels in the template we're currently working + on whose values are less than test_noise to test_noise. + */ + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + if (*fptr++ < test_noise_db) + template_copy[i] = test_noise_db; + } + } /* else ... if (num_test_exceed) */ + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + current_shift; + fptr2 = template_copy; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + MSE_scores[current_shift] = weighted_MSE * sumWeights_inv; + + } /* for current_shift */ + } else { /* if (num_template_exceed) */ + fptr3 = test_exceed_means; + + __pragma_loopbound(0, 0); + for (current_shift = 0; current_shift < shift_size; + current_shift++) { + /* CASE 3 */ + /* If there is at least one pixel that exceeds twice test noise + */ + if (*fptr3++ != 0.0f) + fptr2 = cur_tp; + else { + /* CASE 4 */ + /* Work on a copy of the template we're currently working + * on. */ + pm_memcpy((void *) template_copy, (void *) cur_tp, patsize); + + fptr = cur_tp; + __pragma_loopbound(0, 0); + for (i = 0; i < profile_size; i++) { + if (*fptr++ < test_noise_db) + template_copy[i] = test_noise_db; + } + + fptr2 = template_copy; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + current_shift; + __pragma_loopbound(0, 0); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + MSE_scores[current_shift] = weighted_MSE * sumWeights_inv; + + } /* for current_shift */ + } /* else .. if (num_template_exceed) */ + + /* Finding the minimum MSE for range shifting */ + fptr = MSE_scores; + min_MSE_index = 0; + min_MSE = *fptr++; + __pragma_loopbound(20, 20); + for (i = 1; i < shift_size; i++, fptr++) { + if (min_MSE > *fptr) { + min_MSE = *fptr; + min_MSE_index = i; + } + } + + /* Work on a copy of the template we're currently working on. */ + pm_memcpy((void *) template_copy, (void *) cur_tp, patsize); + + mag_shift_scores_flag = 1; + + if (test_exceed_means[min_MSE_index] != 0.0f) { + if (num_template_exceed) { + /* Compute the difference of the average shifted test profile + power to the average template power */ + ave_power_ratio = + test_exceed_means[min_MSE_index] - template_exceed_mean; + + /* Loop over all possible magnitude shifts */ + __pragma_loopbound(21, 21); + for (j = 0, mag_db = -5.0f; mag_db <= 5.0f; mag_db += 0.5f) { + power_shift = ave_power_ratio + mag_db; + + bptr = template_exceed; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + if (*bptr++) + template_copy[i] = cur_tp[i] + power_shift; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + min_MSE_index; + fptr2 = template_copy; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + mag_shift_scores[j++] = weighted_MSE * sumWeights_inv; + + } /* for mag_db */ + } /* if (num_template_exceed) */ + + } else { /* if (num_test_exceed) */ + /* Set those pixels in the template we're currently working on + whose values are less than test_noise to test_noise. */ + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + if (*fptr++ < test_noise_db) + template_copy[i] = test_noise_db; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + min_MSE_index; + fptr2 = template_copy; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + minimum_MSE_score[template_index] = weighted_MSE * sumWeights_inv; + + mag_shift_scores_flag = 0; + } /* if (num_test_exceed) */ + + /* If magnitude shifting has performed above */ + if (mag_shift_scores_flag) { + /* Find the minimum MSE for magnitude scaling */ + fptr = mag_shift_scores; + min_MSE = *fptr++; + __pragma_loopbound(20, 20); + for (i = 1; i < 21; i++, fptr++) { + if (min_MSE > *fptr) + min_MSE = *fptr; + } + + minimum_MSE_score[template_index] = min_MSE; + } + + } /* for template_index */ + + /* Find the minimum mean square error */ + fptr = minimum_MSE_score; + match_index = 0; + match_score = *fptr++; + __pragma_loopbound(59, 59); + for (i = 1; i < num_templates; i++, fptr++) { + if (match_score > *fptr) { + match_score = *fptr; + match_index = i; + } + } + + return match_index; +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + pm_init(); + pm_main(); + + return pm_return(); +} diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_input.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_input.c new file mode 100644 index 0000000..6f6f87b --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_input.c @@ -0,0 +1,799 @@ +/* + Forward declaration of global variables +*/ + +extern float pm_lib_data[60][64]; +extern float pm_pattern_data[60][64]; + +/* + Definition of global variables +*/ +float pm_lib_data[60][64] = { + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}}; +float pm_pattern_data[60][64] = { + {0.1f, 0.101009f, 0.103729f, 0.0993204f, 9.77204f, 9.95778f, + 10.238f, 9.77676f, 10.1271f, 9.87972f, 10.1102f, 9.78003f, + 10.0172f, 9.59909f, 9.90138f, 10.0924f, 9.9358f, 51.2366f, + 49.3687f, 9.53496f, 9.75367f, 51.0556f, 49.8868f, 10.0758f, + 10.1888f, 9.57591f, 9.87106f, 9.85914f, 9.79637f, 9.96358f, + 10.3042f, 9.99231f, 10.2455f, 9.86076f, 10.0015f, 9.84342f, + 10.1174f, 9.94976f, 10.096f, 10.1336f, 9.98434f, 10.1778f, + 10.4619f, 10.1049f, 9.99764f, 10.1826f, 10.0112f, 9.77859f, + 10.0971f, 9.999f, 9.94476f, 10.2553f, 10.3727f, 9.89549f, + 10.0207f, 9.83847f, 10.1361f, 9.52708f, 10.198f, 10.0438f, + 0.100523f, 0.102427f, 0.0994507f, 0.0997337f}, + {0.0f, 2.38221e-44f, 4.00545e-34f, 0.0f, 0.0f, 1.62261e-40f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}}; diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_libm.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_libm.c new file mode 100644 index 0000000..523ee13 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_libm.c @@ -0,0 +1,214 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_libm.c + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This file contains the C math library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_math.h" + +/* + Declaration of global variables +*/ + +#define pm_LOG10 2.302585093f + +/* The coefficients for the pm_log10f and pm_pow10f functions below */ +static float pm_pow_coeff[19]; +static float pm_log_coeff[16]; + +/* + Math functions +*/ + +/***********************************************************************/ +/* We found out the bottle neck of this kernel was in the pow and log + functions. Therefore, we have implemented our own log and pow, instead + of using the float fp ones in the standard C math libary. This function + sets up the coefficients for the single fp log and pow functions. */ +/***********************************************************************/ +void +pm_math_init(void) { + pm_pow_coeff[0] = 0.5f; /* 1/2! */ + pm_pow_coeff[1] = 0.166666667f; /* 1/3! */ + pm_pow_coeff[2] = 0.041666666f; /* 1/4! */ + pm_pow_coeff[3] = 8.333333333e-3f; + pm_pow_coeff[4] = 1.388888889e-3f; + pm_pow_coeff[5] = 1.984126984e-4f; + pm_pow_coeff[6] = 2.480158730e-5f; + pm_pow_coeff[7] = 2.755731922e-6f; + pm_pow_coeff[8] = 2.755731922e-7f; + pm_pow_coeff[9] = 2.505210839e-8f; + pm_pow_coeff[10] = 2.087675699e-9f; + pm_pow_coeff[11] = 1.605904384e-10f; + pm_pow_coeff[12] = 1.147074560e-11f; + pm_pow_coeff[13] = 7.647163732e-13f; + pm_pow_coeff[14] = 4.779477332e-14f; + pm_pow_coeff[15] = 2.811457254e-15f; + pm_pow_coeff[16] = 1.561920697e-16f; + pm_pow_coeff[17] = 8.220635247e-18f; + pm_pow_coeff[18] = 4.110317623e-19f; + + pm_log_coeff[0] = 0.333333333f; /* 1/3 */ + pm_log_coeff[1] = 0.2f; /* 1/5 */ + pm_log_coeff[2] = 0.142857143f; /* 1/7 */ + pm_log_coeff[3] = 0.111111111f; /* 1/9 */ + pm_log_coeff[4] = 9.090909091e-2f; /* 1/11 */ + pm_log_coeff[5] = 7.692307692e-2f; /* 1/13 */ + pm_log_coeff[6] = 6.666666667e-2f; /* 1/15 */ + pm_log_coeff[7] = 5.882352941e-2f; /* 1/17 */ + pm_log_coeff[8] = 5.263157895e-2f; /* 1/19 */ + pm_log_coeff[9] = 4.761904762e-2f; /* 1/21 */ + pm_log_coeff[10] = 4.347826087e-2f; /* 1/23 */ + pm_log_coeff[11] = 0.04f; /* 1/25 */ + pm_log_coeff[12] = 3.703703704e-2f; /* 1/27 */ + pm_log_coeff[13] = 3.448275862e-2f; /* 1/29 */ + pm_log_coeff[14] = 3.225806452e-2f; /* 1/31 */ + pm_log_coeff[15] = 3.030303030e-2f; /* 1/33 */ +} + +/***********************************************************************/ +/* This single fp pow base 10 function implements the corresponding + Taylor series. The loop has been unrolled to save ops. */ +/***********************************************************************/ +float +pm_pow10f(float exp) { + float mul = exp * pm_LOG10; + float const term = exp * pm_LOG10; + float ans = 1.0f; + float const *fptr = pm_pow_coeff; + + ans += mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + + return ans; +} + +/***********************************************************************/ +/* This single fp log base 10 function implements the corresponding + Taylor series. The loop has been unrolled to save ops. */ +/***********************************************************************/ +float +pm_log10f(float exp) { + float mul = (exp - 1.0f) / (exp + 1.0f); + float ans = 0.0f; + float const *fptr = pm_log_coeff; + float const term = mul * mul; + + ans = mul; + mul *= term; + + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + + ans *= 0.86858896381f; /* ans = ans * 2 / log(10) */ + + return ans; +} + +float +pm_fabs(float n) { + if (n >= 0) + return n; + else + return -n; +} + +float +pm_floor(float arg) { + if (arg >= 0) + return (int) arg; + return -((int) (-arg) + 1); +} + +float +pm_ceil(float arg) { + if (arg > 0) + return (int) (arg + 1); + return (int) (arg); +} diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_math.h b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_math.h new file mode 100644 index 0000000..57de77b --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_math.h @@ -0,0 +1,37 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_math.h + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This header contains the C math library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +#ifndef PM_MATH_H +#define PM_MATH_H + +/* + Forward declaration of functions +*/ + +void pm_math_init(void); +float pm_fabs(float); +float pm_pow10f(float); +float pm_log10f(float); +float pm_floor(float); +float pm_ceil(float); + +#endif /* PM_MATH_H */ diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_stdlib.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_stdlib.c new file mode 100644 index 0000000..a1a9ff9 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_stdlib.c @@ -0,0 +1,54 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_stdlib.c + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This file contains the C standard library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_string.h" + +/* + Standard library functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void +pm_memcpy(void *dest, void *src, int size) { + int i; + __pragma_loopbound(44, 256); + for (i = 0; i < size; i++) + ((unsigned char *) dest)[i] = ((unsigned char *) src)[i]; + return; +} + +void +pm_memset(void *s, int c, int n) { + int i; + __pragma_loopbound(64, 64); + for (i = 0; i < n; i++) + ((unsigned char *) s)[i] = (unsigned char) c; + return; +} diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_string.h b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_string.h new file mode 100644 index 0000000..c609c92 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/default/pm_string.h @@ -0,0 +1,33 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_string.h + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This header contains the C standard library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +#ifndef PM_STRING_H +#define PM_STRING_H + +/* + Forward declaration of functions +*/ + +void pm_memcpy(void *, void *, int); +void pm_memset(void *, int, int); + +#endif /* PM_STRING_H */ diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm.c new file mode 100644 index 0000000..83bdcba --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm.c @@ -0,0 +1,753 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This is the ANSI C Pattern Match kernel. It finds the closest + match of a pattern from a library of patterns. The code below + serves as a reference implemenation of the pattern match kernel. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_math.h" +#include "pm_string.h" + +/* + Definition of types +*/ + +// Wasm loop bounds + + +#include "pm_input.c" +#include "pm_libm.c" +#include "pm_stdlib.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +typedef struct pm_float_array_t { + float *data; + void *datav; + int size[3]; + unsigned int ndims; + unsigned int rctype; + char padding[4]; +} pm_float_array_t; + +typedef struct pm_data_t { + float *template_profiles_db; /* the library of patterns */ + float *test_profile_db; /* the test pattern */ + + float *template_copy; /* temporary storage for a template */ + float *test_noise_db_array; /* copies of test noise in an array for + fast copy */ + float *MSE_scores; /* the likelihood of the matching between a + range shift of the test pattern and the libary */ + float *mag_shift_scores; /* the likelihood of the matching between a + magnitude scaling of the test pattern and the + libary */ + float *minimum_MSE_score; /* the likelihood of the matching between the + test pattern and the libary */ + float *all_shifted_test_db; /* contains the shiftings of the test pattern */ + + unsigned char *template_exceed; /* marking where a library template + exceeds twice the noise level of + the test pattern */ + float *test_exceed_means; /* pixels where test pattern exceeds twice + its noise level */ + + float shift_ratio; /* determines the number of range shifts */ + int shift_size; /* the actual number of range shifts */ + int profile_size; /* the length of the pattern */ + int num_templates; /* the number of library templates */ + int elsize; /* the size of a single fp number */ + char padding[4]; +} pm_data_t; + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void +pm_init_lib(pm_float_array_t *lib); +__attribute__((always_inline)) static inline void +pm_init_pattern(pm_float_array_t *pattern); +__attribute__((always_inline)) static inline void +pm_init_data(pm_data_t *pmdata, pm_float_array_t *lib, + pm_float_array_t *pattern); +__attribute__((always_inline)) static inline void pm_clean(pm_data_t *pmdata); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +pm_main(void); +__attribute__((always_inline)) static inline void pm_init(void); +__attribute__((always_inline)) static inline int pm_return(void); +__attribute__((always_inline)) static inline int pm_kernel(pm_data_t *pmdata); + +/* + Declaration of global variables +*/ + +/* input data */ +extern float pm_lib_data[60][64]; +extern float pm_pattern_data[60][64]; + +/* some magic number */ +#define pm_MIN_NOISE 1e-10f + +/* main data structures used by the benchmark */ +static pm_data_t pm_data; +static pm_float_array_t pm_lib; +static float *pm_lib_ptr[60]; +static pm_float_array_t pm_pattern; +static float *pm_pattern_ptr[60]; +static int pm_result; + +/* arrays for the pm_init_data function */ +static unsigned char pm_init_array_1[64]; +static float pm_init_array_2[21]; +static float pm_init_array_3[64]; +static float pm_init_array_4[64]; +static float pm_init_array_5[21]; +static float pm_init_array_6[21]; +static float pm_init_array_7[72]; +static float pm_init_array_8[110]; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +pm_init_lib(pm_float_array_t *lib) { + int i; + volatile int do_not_optimize_away = 0; + + lib->rctype = 1; + lib->ndims = 2; + lib->size[0] = 60; + lib->size[1] = 64; + lib->size[2] = 0; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_lib_ptr[i] = pm_lib_data[i]; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_lib_ptr[i] += do_not_optimize_away; + + lib->data = *pm_lib_ptr; + lib->datav = (void *) pm_lib_ptr; +} + +__attribute__((always_inline)) static inline void +pm_init_pattern(pm_float_array_t *pattern) { + int i; + volatile int do_not_optimize_away = 0; + + pattern->rctype = 1; + pattern->ndims = 2; + pattern->size[0] = 60; + pattern->size[1] = 64; + pattern->size[2] = 0; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_pattern_ptr[i] = pm_pattern_data[i]; + + __pragma_loopbound(60, 60); + for (i = 0; i < 60; i++) + pm_pattern_ptr[i] += do_not_optimize_away; + + pattern->data = *pm_pattern_ptr; + pattern->datav = (void *) pm_pattern_ptr; +} + +__attribute__((always_inline)) static inline void +pm_init(void) { + pm_math_init(); +} + +__attribute__((always_inline)) static inline int +pm_return(void) { + return pm_result - 12; +} + +/* + Core benchmark functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +pm_main(void) { + pm_init_lib(&pm_lib); + pm_init_pattern(&pm_pattern); + pm_init_data(&pm_data, &pm_lib, &pm_pattern); + pm_result = pm_kernel(&pm_data); + pm_clean(&pm_data); +} + +/***********************************************************************/ +/* Allocate and initailize the test pattern, the template library, and + other necessary data structure. */ +/***********************************************************************/ +__attribute__((always_inline)) static inline void +pm_init_data(pm_data_t *pmdata, pm_float_array_t *lib, + pm_float_array_t *pattern) { + int elsize = sizeof(float); + float x; + + /* Getting the input parameters from the PCA C array structure */ + pmdata->profile_size = lib->size[1]; + pmdata->num_templates = lib->size[0]; + + pmdata->elsize = elsize; + pmdata->shift_ratio = 3.0f; + + pmdata->template_profiles_db = lib->data; + pmdata->test_profile_db = pattern->data; + + /* Equivalent to shift_size = roundf((float)profile_size / shift_ratio) */ + x = (float) (pmdata->profile_size) / pmdata->shift_ratio; + pmdata->shift_size = + ((x - (int) (x)) < 0.5f) ? (int) (pm_floor(x)) : (int) (pm_ceil(x)); + + pmdata->template_exceed = pm_init_array_1; + pmdata->test_exceed_means = pm_init_array_2; + + pmdata->template_copy = pm_init_array_3; + pmdata->test_noise_db_array = pm_init_array_4; + + pmdata->MSE_scores = pm_init_array_5; + pmdata->mag_shift_scores = pm_init_array_6; + + pmdata->minimum_MSE_score = pm_init_array_7; + pmdata->all_shifted_test_db = pm_init_array_8; +} + +/***********************************************************************/ +/* Free up memory for all structures */ +/***********************************************************************/ +__attribute__((always_inline)) static inline void +pm_clean(pm_data_t *pmdata) { + pmdata->test_exceed_means = 0; + pmdata->template_exceed = 0; + pmdata->template_copy = 0; + pmdata->test_noise_db_array = 0; + pmdata->MSE_scores = 0; + pmdata->mag_shift_scores = 0; + pmdata->minimum_MSE_score = 0; + pmdata->all_shifted_test_db = 0; +} + +/***********************************************************************/ +/* The pattern match kernel overlays two patterns to compute the likelihood + that the two vectors match. This process is performed on a library of + patterns. */ +/***********************************************************************/ +__attribute__((always_inline)) static inline int +pm_kernel(pm_data_t *pmdata) { + const int elsize = pmdata->elsize; /* size of a single fp number */ + const int shift_size = pmdata->shift_size; /* number of shifting to the + left and right of the test + profile */ + const int profile_size = + pmdata->profile_size; /* number of pixels in a pattern */ + const int num_templates = + pmdata->num_templates; /* number of library patterns */ + float *test_profile_db = pmdata->test_profile_db; /* the test pattern */ + float *template_profiles_db = + pmdata->template_profiles_db; /* the library of patterns */ + float *test_noise_db_array = + pmdata->test_noise_db_array; /* the noise in the test pattern in an + array for fast copy */ + float *all_shifted_test_db = + pmdata->all_shifted_test_db; /* the shifted test pattern */ + + int match_index; /* the index of the most likely template that matches the + test pattern */ + int min_MSE_index; /* the index of the range shifts with + the lowest mean square error */ + unsigned int num_template_exceed, + num_test_exceed; /* the number of pixels exceeded the test pattern + and a library template */ + + unsigned char mag_shift_scores_flag; /* flag that tells if the magnitude + scaling loop has been run + (existed just to save ops) */ + + float test_peak, template_peak; /* the maximum pixels of the test pattern + and a library template pattern */ + float template_noise; /* the noise level of a library template */ + + float noise_shift, noise_shift2; /* temporary storage for calculating the + mse for range shifting */ + + float min_MSE, + match_score; /* temporary storage for finding the minimum mse */ + + float sumWeights_inv = + 1.0f / profile_size; /* the inverse of the weights + used for calculating the mse */ + /* Note: weights for the kernel would be application dependent. + They are set to 1 for our purposes */ + + float mag_db; /* the magnitude shifts in dB */ + float power_shift, + ave_power_ratio; /* the diff of the avg shifted test profile power to + the avg template power */ + float power_ratio; /* the mean power of the pixels of a template that + exceeded twice test noise */ + + float test_noise = (pm_pow10f(test_profile_db[0] * + 0.1f) + /* noise level of the test pattern */ + pm_pow10f(test_profile_db[profile_size - 1] * 0.1f)) * + 0.5f; + + /* since "shift_size/2" is used a lot, so we create a var to hold it */ + int half_shift_size = (int) (pm_ceil((float) (shift_size) / 2.0f)); + int template_index, current_shift; /* indices */ + int patsize = profile_size * elsize; /* number of bytes of a pattern */ + + float *minimum_MSE_score = pmdata->minimum_MSE_score; + float *MSE_scores = pmdata->MSE_scores; + float *mag_shift_scores = pmdata->mag_shift_scores; + + float test_noise_db = + (test_noise == 0.0f) + ? -100.0f + : 10.0f * pm_log10f(pm_fabs(test_noise)); /* test noise in dB */ + float test_noise_db_plus_3 = + test_noise_db + 3.0f; /* twice test noise in the + power domain, approximately +3dB */ + + float *template_copy = pmdata->template_copy; + unsigned char *template_exceed = pmdata->template_exceed; + float *test_exceed_means = pmdata->test_exceed_means; + + int i, j; /* indices */ + + float + tmp1; /* temporary storage for calculating the mse for range shifting */ + float sum_exceed; /* the sum of the test pattern pixels exceeded twice + test noise */ + float template_exceed_mean = 0; /* the mean of a template pattern pixels + exceeded twice test noise */ + float weighted_MSE; /* temporary storage for computing the weighted MSE */ + + /* These pointers are solely used for fast memory access */ + float *cur_tp, *fptr, *fptr2, *fptr3, *endptr; + unsigned char *bptr; + + /* Having an array of test noise for fast copying of noise returns */ + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) + test_noise_db_array[i] = test_noise_db; + + /* Finding the maximum pixels of the test pattern */ + fptr = test_profile_db; + test_peak = *fptr++; + __pragma_loopbound(63, 63); + for (i = 1; i < profile_size; i++, fptr++) { + if (test_peak < *fptr) + test_peak = *fptr; + } + + /* Paddle array for all the possible range shifts. Essentially, we are + performing the following: + + Adding these two portions to the beginning and end of the test pattern + | | + V V + |<------>| |<------>| + + __ __ + | | | | + | |___| | + | | + _________| |_________ <- test noise in dB domain + --------------------------------------- <- zero + + |<--------------->| + original test pattern + + + The all_shifted_test_db will be accessed in a sliding window manner. + */ + + pm_memcpy((void *) all_shifted_test_db, (void *) test_noise_db_array, + elsize * half_shift_size); + pm_memcpy((void *) (all_shifted_test_db + half_shift_size), + (void *) test_profile_db, elsize * profile_size); + pm_memcpy((void *) (all_shifted_test_db + half_shift_size + profile_size), + (void *) test_noise_db_array, elsize * half_shift_size); + + /* Set the pixels to test noise in dB domain if pixel is less than test + noise in dB */ + fptr = all_shifted_test_db + half_shift_size; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++, fptr++) { + if (*fptr < test_noise_db) + *fptr = test_noise_db; + } + + /* Calculating the mean of the pixels that exceeded twice test noise for + each possible shift of the test profile */ + fptr2 = test_exceed_means; + __pragma_loopbound(21, 21); + for (current_shift = 0; current_shift < shift_size; current_shift++) { + /* Pointer arithmetics to find the start and end pointers */ + if (current_shift < half_shift_size) { + endptr = all_shifted_test_db + current_shift + profile_size; + fptr = all_shifted_test_db + half_shift_size; + } else { + endptr = all_shifted_test_db + half_shift_size + profile_size; + fptr = all_shifted_test_db + current_shift; + } + + /* Summing the pixels that exceed twice test noise for the current + * shifts */ + sum_exceed = 0.0f; + num_test_exceed = 0; + __pragma_loopbound(53, 64); + while (fptr != endptr) { + if (*fptr > test_noise_db_plus_3) { + num_test_exceed++; + sum_exceed += *fptr; + } + fptr++; + } + *fptr2++ = + num_test_exceed ? sum_exceed / (float) (num_test_exceed) : 0.0f; + } + + /* Loop over all the templates. Determine the best shift distance, then + the best gain adjustment. */ + __pragma_loopbound(60, 60); + for (template_index = 0; template_index < num_templates; template_index++) { + cur_tp = template_profiles_db + (template_index * profile_size); + + /* Scale the template profile we're currently working on so that its + peak is equal to the peak of the test profile */ + + fptr = cur_tp; + template_peak = *fptr++; + __pragma_loopbound(63, 63); + for (i = 1; i < profile_size; i++, fptr++) { + if (template_peak < *fptr) + template_peak = *fptr; + } + + /* Additively adjust the noise level of this template profile in the + raw power domain so that its noise level matches the noise level + of the test profile */ + + /* -------------------------------------------------------------------- + Setting up all the constants */ + + noise_shift = test_peak - template_peak; + pm_memset((void *) template_exceed, 0, + ((int) sizeof(char)) * profile_size); + sum_exceed = 0.0f; + num_template_exceed = 0; + + /* -------------------------------------------------------------------- + The following blocks are optimized code that essentially + perform the operations immediately below. The calculation of the + template noise constants is done once the exponentials are complete + */ + + /* template_profile = template_profile + test_peak - template_peak + template = 10 ^ (template_profile / 10) + template = template + test_noise - template_noise + if (input < fp_epsilon) then clip the input to -100 dB + template = log10( abs(template) ) + template_profile = 10 * template + test_noise_db */ + + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr + noise_shift; + *fptr = pm_pow10f(tmp1 * 0.1f); + fptr++; + } + + /* Calculates noise levels from first and last elements of the current + template */ + + template_noise = (cur_tp[0] + cur_tp[profile_size - 1]) * 0.5f; + noise_shift2 = test_noise - template_noise; + + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr + noise_shift2; + + if (tmp1 == 0.0f) + tmp1 = pm_MIN_NOISE; + + *fptr = 10.0f * pm_log10f(pm_fabs(tmp1)) + test_noise_db; + + /* Because many of the operations in the search for the best shift + amount depend on knowledge of which pixels in the template + have values exceeding twice test_noise (recall that 3db is + roughly equivalent to a doubling of raw power), we'll put those + indices in template_exceed */ + + if (*fptr > test_noise_db_plus_3) { + template_exceed[i] = 1; + num_template_exceed++; + sum_exceed += *fptr; + } + + fptr++; + } + + /* Note: The following block has 4 different branches: + 1. Both the current template and the test pattern have values + exceeded twice test noise. + 2. Only the current template has values exceeded twice test noise. + 3. Only the test pattern has values exceeded twice test noise. + 4. Neither the current template nor the test pattern has values + exceeded twice test noise. + */ + + /* If there is at least one pixel in the template we're + currently working on whose value exceeds twice test_noise */ + if (num_template_exceed) { + template_exceed_mean = sum_exceed / (float) (num_template_exceed); + fptr3 = test_exceed_means; + + __pragma_loopbound(21, 21); + for (current_shift = 0; current_shift < shift_size; + current_shift++, fptr3++) { + /* Work on a copy of the template we're currently working on */ + pm_memcpy((void *) template_copy, (void *) cur_tp, patsize); + + /* If there is at least one pixel in the shifted test profile + whose value exceeds twice test noise. */ + if (*fptr3 != 0.0f) { + /* CASE 1 */ + /* Considering only those pixels whose powers exceed twice + test noise, compute the difference of the mean power in + template we're currently working on. */ + power_ratio = *fptr3 - template_exceed_mean; + + /* Scale template values that exceed twice test noise by + power ratio and set the values that are less than test + noise in db to test noise in db */ + fptr = template_copy; + bptr = template_exceed; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++, fptr++) { + if (*bptr++) + *fptr += power_ratio; + + if (*fptr < test_noise_db) + *fptr = test_noise_db; + } + } /* if (*fptr3 != 0.0f) */ + else { + /* CASE 2 */ + /* Set those pixels in the template we're currently working + on whose values are less than test_noise to test_noise. + */ + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + if (*fptr++ < test_noise_db) + template_copy[i] = test_noise_db; + } + } /* else ... if (num_test_exceed) */ + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + current_shift; + fptr2 = template_copy; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + MSE_scores[current_shift] = weighted_MSE * sumWeights_inv; + + } /* for current_shift */ + } else { /* if (num_template_exceed) */ + fptr3 = test_exceed_means; + + __pragma_loopbound(0, 0); + for (current_shift = 0; current_shift < shift_size; + current_shift++) { + /* CASE 3 */ + /* If there is at least one pixel that exceeds twice test noise + */ + if (*fptr3++ != 0.0f) + fptr2 = cur_tp; + else { + /* CASE 4 */ + /* Work on a copy of the template we're currently working + * on. */ + pm_memcpy((void *) template_copy, (void *) cur_tp, patsize); + + fptr = cur_tp; + __pragma_loopbound(0, 0); + for (i = 0; i < profile_size; i++) { + if (*fptr++ < test_noise_db) + template_copy[i] = test_noise_db; + } + + fptr2 = template_copy; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + current_shift; + __pragma_loopbound(0, 0); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + MSE_scores[current_shift] = weighted_MSE * sumWeights_inv; + + } /* for current_shift */ + } /* else .. if (num_template_exceed) */ + + /* Finding the minimum MSE for range shifting */ + fptr = MSE_scores; + min_MSE_index = 0; + min_MSE = *fptr++; + __pragma_loopbound(20, 20); + for (i = 1; i < shift_size; i++, fptr++) { + if (min_MSE > *fptr) { + min_MSE = *fptr; + min_MSE_index = i; + } + } + + /* Work on a copy of the template we're currently working on. */ + pm_memcpy((void *) template_copy, (void *) cur_tp, patsize); + + mag_shift_scores_flag = 1; + + if (test_exceed_means[min_MSE_index] != 0.0f) { + if (num_template_exceed) { + /* Compute the difference of the average shifted test profile + power to the average template power */ + ave_power_ratio = + test_exceed_means[min_MSE_index] - template_exceed_mean; + + /* Loop over all possible magnitude shifts */ + __pragma_loopbound(21, 21); + for (j = 0, mag_db = -5.0f; mag_db <= 5.0f; mag_db += 0.5f) { + power_shift = ave_power_ratio + mag_db; + + bptr = template_exceed; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + if (*bptr++) + template_copy[i] = cur_tp[i] + power_shift; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + min_MSE_index; + fptr2 = template_copy; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + mag_shift_scores[j++] = weighted_MSE * sumWeights_inv; + + } /* for mag_db */ + } /* if (num_template_exceed) */ + + } else { /* if (num_test_exceed) */ + /* Set those pixels in the template we're currently working on + whose values are less than test_noise to test_noise. */ + fptr = cur_tp; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + if (*fptr++ < test_noise_db) + template_copy[i] = test_noise_db; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + min_MSE_index; + fptr2 = template_copy; + __pragma_loopbound(64, 64); + for (i = 0; i < profile_size; i++) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + minimum_MSE_score[template_index] = weighted_MSE * sumWeights_inv; + + mag_shift_scores_flag = 0; + } /* if (num_test_exceed) */ + + /* If magnitude shifting has performed above */ + if (mag_shift_scores_flag) { + /* Find the minimum MSE for magnitude scaling */ + fptr = mag_shift_scores; + min_MSE = *fptr++; + __pragma_loopbound(20, 20); + for (i = 1; i < 21; i++, fptr++) { + if (min_MSE > *fptr) + min_MSE = *fptr; + } + + minimum_MSE_score[template_index] = min_MSE; + } + + } /* for template_index */ + + /* Find the minimum mean square error */ + fptr = minimum_MSE_score; + match_index = 0; + match_score = *fptr++; + __pragma_loopbound(59, 59); + for (i = 1; i < num_templates; i++, fptr++) { + if (match_score > *fptr) { + match_score = *fptr; + match_index = i; + } + } + + return match_index; +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + pm_init(); + pm_main(); + + return pm_return(); +} diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_input.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_input.c new file mode 100644 index 0000000..6f6f87b --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_input.c @@ -0,0 +1,799 @@ +/* + Forward declaration of global variables +*/ + +extern float pm_lib_data[60][64]; +extern float pm_pattern_data[60][64]; + +/* + Definition of global variables +*/ +float pm_lib_data[60][64] = { + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}, + {0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, + 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 0.1f, 0.1f, 0.1f, 0.1f}}; +float pm_pattern_data[60][64] = { + {0.1f, 0.101009f, 0.103729f, 0.0993204f, 9.77204f, 9.95778f, + 10.238f, 9.77676f, 10.1271f, 9.87972f, 10.1102f, 9.78003f, + 10.0172f, 9.59909f, 9.90138f, 10.0924f, 9.9358f, 51.2366f, + 49.3687f, 9.53496f, 9.75367f, 51.0556f, 49.8868f, 10.0758f, + 10.1888f, 9.57591f, 9.87106f, 9.85914f, 9.79637f, 9.96358f, + 10.3042f, 9.99231f, 10.2455f, 9.86076f, 10.0015f, 9.84342f, + 10.1174f, 9.94976f, 10.096f, 10.1336f, 9.98434f, 10.1778f, + 10.4619f, 10.1049f, 9.99764f, 10.1826f, 10.0112f, 9.77859f, + 10.0971f, 9.999f, 9.94476f, 10.2553f, 10.3727f, 9.89549f, + 10.0207f, 9.83847f, 10.1361f, 9.52708f, 10.198f, 10.0438f, + 0.100523f, 0.102427f, 0.0994507f, 0.0997337f}, + {0.0f, 2.38221e-44f, 4.00545e-34f, 0.0f, 0.0f, 1.62261e-40f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}}; diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_libm.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_libm.c new file mode 100644 index 0000000..73fa5b0 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_libm.c @@ -0,0 +1,214 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_libm.c + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This file contains the C math library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_math.h" + +/* + Declaration of global variables +*/ + +#define pm_LOG10 2.302585093f + +/* The coefficients for the pm_log10f and pm_pow10f functions below */ +static float pm_pow_coeff[19]; +static float pm_log_coeff[16]; + +/* + Math functions +*/ + +/***********************************************************************/ +/* We found out the bottle neck of this kernel was in the pow and log + functions. Therefore, we have implemented our own log and pow, instead + of using the float fp ones in the standard C math libary. This function + sets up the coefficients for the single fp log and pow functions. */ +/***********************************************************************/ +__attribute__((always_inline)) static inline void +pm_math_init(void) { + pm_pow_coeff[0] = 0.5f; /* 1/2! */ + pm_pow_coeff[1] = 0.166666667f; /* 1/3! */ + pm_pow_coeff[2] = 0.041666666f; /* 1/4! */ + pm_pow_coeff[3] = 8.333333333e-3f; + pm_pow_coeff[4] = 1.388888889e-3f; + pm_pow_coeff[5] = 1.984126984e-4f; + pm_pow_coeff[6] = 2.480158730e-5f; + pm_pow_coeff[7] = 2.755731922e-6f; + pm_pow_coeff[8] = 2.755731922e-7f; + pm_pow_coeff[9] = 2.505210839e-8f; + pm_pow_coeff[10] = 2.087675699e-9f; + pm_pow_coeff[11] = 1.605904384e-10f; + pm_pow_coeff[12] = 1.147074560e-11f; + pm_pow_coeff[13] = 7.647163732e-13f; + pm_pow_coeff[14] = 4.779477332e-14f; + pm_pow_coeff[15] = 2.811457254e-15f; + pm_pow_coeff[16] = 1.561920697e-16f; + pm_pow_coeff[17] = 8.220635247e-18f; + pm_pow_coeff[18] = 4.110317623e-19f; + + pm_log_coeff[0] = 0.333333333f; /* 1/3 */ + pm_log_coeff[1] = 0.2f; /* 1/5 */ + pm_log_coeff[2] = 0.142857143f; /* 1/7 */ + pm_log_coeff[3] = 0.111111111f; /* 1/9 */ + pm_log_coeff[4] = 9.090909091e-2f; /* 1/11 */ + pm_log_coeff[5] = 7.692307692e-2f; /* 1/13 */ + pm_log_coeff[6] = 6.666666667e-2f; /* 1/15 */ + pm_log_coeff[7] = 5.882352941e-2f; /* 1/17 */ + pm_log_coeff[8] = 5.263157895e-2f; /* 1/19 */ + pm_log_coeff[9] = 4.761904762e-2f; /* 1/21 */ + pm_log_coeff[10] = 4.347826087e-2f; /* 1/23 */ + pm_log_coeff[11] = 0.04f; /* 1/25 */ + pm_log_coeff[12] = 3.703703704e-2f; /* 1/27 */ + pm_log_coeff[13] = 3.448275862e-2f; /* 1/29 */ + pm_log_coeff[14] = 3.225806452e-2f; /* 1/31 */ + pm_log_coeff[15] = 3.030303030e-2f; /* 1/33 */ +} + +/***********************************************************************/ +/* This single fp pow base 10 function implements the corresponding + Taylor series. The loop has been unrolled to save ops. */ +/***********************************************************************/ +__attribute__((always_inline)) static inline float +pm_pow10f(float exp) { + float mul = exp * pm_LOG10; + float const term = exp * pm_LOG10; + float ans = 1.0f; + float const *fptr = pm_pow_coeff; + + ans += mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + + return ans; +} + +/***********************************************************************/ +/* This single fp log base 10 function implements the corresponding + Taylor series. The loop has been unrolled to save ops. */ +/***********************************************************************/ +__attribute__((always_inline)) static inline float +pm_log10f(float exp) { + float mul = (exp - 1.0f) / (exp + 1.0f); + float ans = 0.0f; + float const *fptr = pm_log_coeff; + float const term = mul * mul; + + ans = mul; + mul *= term; + + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + + ans *= 0.86858896381f; /* ans = ans * 2 / log(10) */ + + return ans; +} + +__attribute__((always_inline)) static inline float +pm_fabs(float n) { + if (n >= 0) + return n; + else + return -n; +} + +__attribute__((always_inline)) static inline float +pm_floor(float arg) { + if (arg >= 0) + return (int) arg; + return -((int) (-arg) + 1); +} + +__attribute__((always_inline)) static inline float +pm_ceil(float arg) { + if (arg > 0) + return (int) (arg + 1); + return (int) (arg); +} diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_math.h b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_math.h new file mode 100644 index 0000000..9e47eb5 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_math.h @@ -0,0 +1,37 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_math.h + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This header contains the C math library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +#ifndef PM_MATH_H +#define PM_MATH_H + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void pm_math_init(void); +__attribute__((always_inline)) static inline float pm_fabs(float); +__attribute__((always_inline)) static inline float pm_pow10f(float); +__attribute__((always_inline)) static inline float pm_log10f(float); +__attribute__((always_inline)) static inline float pm_floor(float); +__attribute__((always_inline)) static inline float pm_ceil(float); + +#endif /* PM_MATH_H */ diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_stdlib.c b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_stdlib.c new file mode 100644 index 0000000..ba9f3a2 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_stdlib.c @@ -0,0 +1,54 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_stdlib.c + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This file contains the C standard library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_string.h" + +/* + Standard library functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +pm_memcpy(void *dest, void *src, int size) { + int i; + __pragma_loopbound(44, 256); + for (i = 0; i < size; i++) + ((unsigned char *) dest)[i] = ((unsigned char *) src)[i]; + return; +} + +__attribute__((always_inline)) static inline void +pm_memset(void *s, int c, int n) { + int i; + __pragma_loopbound(64, 64); + for (i = 0; i < n; i++) + ((unsigned char *) s)[i] = (unsigned char) c; + return; +} diff --git a/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_string.h b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_string.h new file mode 100644 index 0000000..c7a243f --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/generated/modified_sources/inline/pm_string.h @@ -0,0 +1,34 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_string.h + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This header contains the C standard library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +#ifndef PM_STRING_H +#define PM_STRING_H + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void pm_memcpy(void *, void *, + int); +__attribute__((always_inline)) static inline void pm_memset(void *, int, int); + +#endif /* PM_STRING_H */ diff --git a/targets/wasm-tacle/kernel/pm/license.txt b/targets/wasm-tacle/kernel/pm/license.txt new file mode 100755 index 0000000..bc347ab --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/license.txt @@ -0,0 +1,27 @@ +Copyright (c) 2006, Massachusetts Institute of Technology +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 Massachusetts Institute of Technology 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. diff --git a/targets/wasm-tacle/kernel/pm/pm.c b/targets/wasm-tacle/kernel/pm/pm.c new file mode 100755 index 0000000..c046800 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/pm.c @@ -0,0 +1,743 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This is the ANSI C Pattern Match kernel. It finds the closest + match of a pattern from a library of patterns. The code below + serves as a reference implemenation of the pattern match kernel. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_math.h" +#include "pm_string.h" + + +/* + Definition of types +*/ + +typedef struct pm_float_array_t { + float *data; + void *datav; + int size[ 3 ]; + unsigned int ndims; + unsigned int rctype; + char padding[ 4 ]; +} pm_float_array_t; + + +typedef struct pm_data_t { + float *template_profiles_db; /* the library of patterns */ + float *test_profile_db; /* the test pattern */ + + float *template_copy; /* temporary storage for a template */ + float *test_noise_db_array; /* copies of test noise in an array for + fast copy */ + float *MSE_scores; /* the likelihood of the matching between a + range shift of the test pattern and the libary */ + float *mag_shift_scores; /* the likelihood of the matching between a + magnitude scaling of the test pattern and the + libary */ + float *minimum_MSE_score; /* the likelihood of the matching between the + test pattern and the libary */ + float *all_shifted_test_db; /* contains the shiftings of the test pattern */ + + unsigned char *template_exceed; /* marking where a library template + exceeds twice the noise level of + the test pattern */ + float *test_exceed_means; /* pixels where test pattern exceeds twice + its noise level */ + + float shift_ratio; /* determines the number of range shifts */ + int shift_size; /* the actual number of range shifts */ + int profile_size; /* the length of the pattern */ + int num_templates; /* the number of library templates */ + int elsize; /* the size of a single fp number */ + char padding[ 4 ]; +} pm_data_t; + + +/* + Forward declaration of functions +*/ + +void pm_init_lib( pm_float_array_t *lib ); +void pm_init_pattern( pm_float_array_t *pattern ); +void pm_init_data( pm_data_t *pmdata, + pm_float_array_t *lib, + pm_float_array_t *pattern ); +void pm_clean( pm_data_t *pmdata ); +void pm_main( void ); +void pm_init( void ); +int pm_return( void ); +int pm_kernel( pm_data_t *pmdata ); + + +/* + Declaration of global variables +*/ + +/* input data */ +extern float pm_lib_data[ 60 ][ 64 ]; +extern float pm_pattern_data[ 60 ][ 64 ]; + +/* some magic number */ +#define pm_MIN_NOISE 1e-10f + +/* main data structures used by the benchmark */ +static pm_data_t pm_data; +static pm_float_array_t pm_lib; +static float *pm_lib_ptr[ 60 ]; +static pm_float_array_t pm_pattern; +static float *pm_pattern_ptr[ 60 ]; +static int pm_result; + +/* arrays for the pm_init_data function */ +static unsigned char pm_init_array_1[ 64 ]; +static float pm_init_array_2[ 21 ]; +static float pm_init_array_3[ 64 ]; +static float pm_init_array_4[ 64 ]; +static float pm_init_array_5[ 21 ]; +static float pm_init_array_6[ 21 ]; +static float pm_init_array_7[ 72 ]; +static float pm_init_array_8[ 110 ]; + + +/* + Initialization- and return-value-related functions +*/ + +void pm_init_lib( pm_float_array_t *lib ) +{ + int i; + volatile int do_not_optimize_away = 0; + + lib->rctype = 1; + lib->ndims = 2; + lib->size[ 0 ] = 60; + lib->size[ 1 ] = 64; + lib->size[ 2 ] = 0; + + _Pragma( "loopbound min 60 max 60" ) + for ( i = 0; i < 60; i++ ) + pm_lib_ptr[ i ] = pm_lib_data[ i ]; + + _Pragma( "loopbound min 60 max 60" ) + for ( i = 0; i < 60; i++ ) + pm_lib_ptr[ i ] += do_not_optimize_away; + + lib->data = *pm_lib_ptr; + lib->datav = ( void * )pm_lib_ptr; +} + + +void pm_init_pattern( pm_float_array_t *pattern ) +{ + int i; + volatile int do_not_optimize_away = 0; + + pattern->rctype = 1; + pattern->ndims = 2; + pattern->size[ 0 ] = 60; + pattern->size[ 1 ] = 64; + pattern->size[ 2 ] = 0; + + _Pragma( "loopbound min 60 max 60" ) + for ( i = 0; i < 60; i++ ) + pm_pattern_ptr[ i ] = pm_pattern_data[ i ]; + + _Pragma( "loopbound min 60 max 60" ) + for ( i = 0; i < 60; i++ ) + pm_pattern_ptr[ i ] += do_not_optimize_away; + + pattern->data = *pm_pattern_ptr; + pattern->datav = ( void * )pm_pattern_ptr; +} + + +void pm_init( void ) +{ + pm_math_init(); +} + + +int pm_return( void ) +{ + return pm_result - 12; +} + + +/* + Core benchmark functions +*/ + +void _Pragma( "entrypoint" ) pm_main( void ) +{ + pm_init_lib( &pm_lib ); + pm_init_pattern( &pm_pattern ); + pm_init_data( &pm_data, &pm_lib, &pm_pattern ); + pm_result = pm_kernel( &pm_data ); + pm_clean( &pm_data ); +} + + +/***********************************************************************/ +/* Allocate and initailize the test pattern, the template library, and + other necessary data structure. */ +/***********************************************************************/ +void pm_init_data( pm_data_t *pmdata, pm_float_array_t *lib, + pm_float_array_t *pattern ) +{ + int elsize = sizeof( float ); + float x; + + /* Getting the input parameters from the PCA C array structure */ + pmdata->profile_size = lib->size[ 1 ]; + pmdata->num_templates = lib->size[ 0 ]; + + pmdata->elsize = elsize; + pmdata->shift_ratio = 3.0f; + + pmdata->template_profiles_db = lib->data; + pmdata->test_profile_db = pattern->data; + + /* Equivalent to shift_size = roundf((float)profile_size / shift_ratio) */ + x = ( float )( pmdata->profile_size ) / pmdata->shift_ratio; + pmdata->shift_size = ( ( x - ( int )( x ) ) < 0.5f ) ? + ( int )( pm_floor( x ) ) : + ( int )( pm_ceil( x ) ); + + pmdata->template_exceed = pm_init_array_1; + pmdata->test_exceed_means = pm_init_array_2; + + pmdata->template_copy = pm_init_array_3; + pmdata->test_noise_db_array = pm_init_array_4; + + pmdata->MSE_scores = pm_init_array_5; + pmdata->mag_shift_scores = pm_init_array_6; + + pmdata->minimum_MSE_score = pm_init_array_7; + pmdata->all_shifted_test_db = pm_init_array_8; +} + + +/***********************************************************************/ +/* Free up memory for all structures */ +/***********************************************************************/ +void pm_clean( pm_data_t *pmdata ) +{ + pmdata->test_exceed_means = 0; + pmdata->template_exceed = 0; + pmdata->template_copy = 0; + pmdata->test_noise_db_array = 0; + pmdata->MSE_scores = 0; + pmdata->mag_shift_scores = 0; + pmdata->minimum_MSE_score = 0; + pmdata->all_shifted_test_db = 0; +} + + +/***********************************************************************/ +/* The pattern match kernel overlays two patterns to compute the likelihood + that the two vectors match. This process is performed on a library of + patterns. */ +/***********************************************************************/ +int pm_kernel( pm_data_t *pmdata ) +{ + const int elsize = pmdata->elsize; /* size of a single fp number */ + const int shift_size = pmdata->shift_size; /* number of shifting to the + left and right of the test + profile */ + const int profile_size = + pmdata->profile_size; /* number of pixels in a pattern */ + const int num_templates = + pmdata->num_templates; /* number of library patterns */ + float *test_profile_db = + pmdata->test_profile_db; /* the test pattern */ + float *template_profiles_db = + pmdata->template_profiles_db; /* the library of patterns */ + float *test_noise_db_array = + pmdata->test_noise_db_array; /* the noise in the test pattern in an array + for fast copy */ + float *all_shifted_test_db = + pmdata->all_shifted_test_db; /* the shifted test pattern */ + + int match_index; /* the index of the most likely template that matches the + test pattern */ + int min_MSE_index; /* the index of the range shifts with + the lowest mean square error */ + unsigned int num_template_exceed, + num_test_exceed; /* the number of pixels exceeded the test pattern + and a library template */ + + unsigned char mag_shift_scores_flag; /* flag that tells if the magnitude + scaling loop has been run + (existed just to save ops) */ + + float test_peak, + template_peak; /* the maximum pixels of the test pattern and a library + template pattern */ + float template_noise; /* the noise level of a library template */ + + float noise_shift, + noise_shift2; /* temporary storage for calculating the mse for range shifting */ + + float min_MSE, match_score; /* temporary storage for finding the minimum mse */ + + float sumWeights_inv = 1.0f / profile_size; /* the inverse of the weights + used for calculating the mse */ + /* Note: weights for the kernel would be application dependent. + They are set to 1 for our purposes */ + + float mag_db; /* the magnitude shifts in dB */ + float power_shift, + ave_power_ratio; /* the diff of the avg shifted test profile power to + the avg template power */ + float power_ratio; /* the mean power of the pixels of a template that exceeded + twice test noise */ + + float test_noise = ( pm_pow10f( test_profile_db[ 0 ] * 0.1f ) + + /* noise level of the test pattern */ + pm_pow10f( test_profile_db[ profile_size - 1 ] * 0.1f ) ) * 0.5f; + + /* since "shift_size/2" is used a lot, so we create a var to hold it */ + int half_shift_size = ( int )( pm_ceil( ( float )( shift_size ) / 2.0f ) ); + int template_index, current_shift; /* indices */ + int patsize = profile_size * elsize; /* number of bytes of a pattern */ + + float *minimum_MSE_score = pmdata->minimum_MSE_score; + float *MSE_scores = pmdata->MSE_scores; + float *mag_shift_scores = pmdata->mag_shift_scores; + + float test_noise_db = ( test_noise == 0.0f ) ? -100.0f : 10.0f * + pm_log10f( pm_fabs( test_noise ) ); /* test noise in dB */ + float test_noise_db_plus_3 = test_noise_db + 3.0f; /* twice test noise in the + power domain, approximately +3dB */ + + float *template_copy = pmdata->template_copy; + unsigned char *template_exceed = pmdata->template_exceed; + float *test_exceed_means = pmdata->test_exceed_means; + + int i, j; /* indices */ + + float tmp1; /* temporary storage for calculating the mse for range shifting */ + float sum_exceed; /* the sum of the test pattern pixels exceeded twice + test noise */ + float template_exceed_mean = 0; /* the mean of a template pattern pixels + exceeded twice test noise */ + float weighted_MSE; /* temporary storage for computing the weighted MSE */ + + /* These pointers are solely used for fast memory access */ + float *cur_tp, *fptr, *fptr2, *fptr3, *endptr; + unsigned char *bptr; + + /* Having an array of test noise for fast copying of noise returns */ + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) + test_noise_db_array[ i ] = test_noise_db; + + /* Finding the maximum pixels of the test pattern */ + fptr = test_profile_db; + test_peak = *fptr++; + _Pragma( "loopbound min 63 max 63" ) + for ( i = 1; i < profile_size; i++, fptr++ ) { + if ( test_peak < *fptr ) + test_peak = *fptr; + } + + /* Paddle array for all the possible range shifts. Essentially, we are + performing the following: + + Adding these two portions to the beginning and end of the test pattern + | | + V V + |<------>| |<------>| + + __ __ + | | | | + | |___| | + | | + _________| |_________ <- test noise in dB domain + --------------------------------------- <- zero + + |<--------------->| + original test pattern + + + The all_shifted_test_db will be accessed in a sliding window manner. + */ + + pm_memcpy( ( void * ) all_shifted_test_db, ( void * ) test_noise_db_array, + elsize * half_shift_size ); + pm_memcpy( ( void * ) ( all_shifted_test_db + half_shift_size ), + ( void * ) test_profile_db, elsize * profile_size ); + pm_memcpy( ( void * ) ( all_shifted_test_db + half_shift_size + profile_size ), + ( void * ) test_noise_db_array, elsize * half_shift_size ); + + /* Set the pixels to test noise in dB domain if pixel is less than test + noise in dB */ + fptr = all_shifted_test_db + half_shift_size; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++, fptr++ ) { + if ( *fptr < test_noise_db ) + *fptr = test_noise_db; + } + + /* Calculating the mean of the pixels that exceeded twice test noise for each + possible shift of the test profile */ + fptr2 = test_exceed_means; + _Pragma( "loopbound min 21 max 21" ) + for ( current_shift = 0; current_shift < shift_size; current_shift++ ) { + /* Pointer arithmetics to find the start and end pointers */ + if ( current_shift < half_shift_size ) { + endptr = all_shifted_test_db + current_shift + profile_size; + fptr = all_shifted_test_db + half_shift_size; + } else { + endptr = all_shifted_test_db + half_shift_size + profile_size; + fptr = all_shifted_test_db + current_shift; + } + + /* Summing the pixels that exceed twice test noise for the current shifts */ + sum_exceed = 0.0f; + num_test_exceed = 0; + _Pragma( "loopbound min 53 max 64" ) + while ( fptr != endptr ) { + if ( *fptr > test_noise_db_plus_3 ) { + num_test_exceed++; + sum_exceed += *fptr; + } + fptr++; + } + *fptr2++ = num_test_exceed ? + sum_exceed / ( float )( num_test_exceed ) : + 0.0f; + } + + + /* Loop over all the templates. Determine the best shift distance, then + the best gain adjustment. */ + _Pragma( "loopbound min 60 max 60" ) + for ( template_index = 0; template_index < num_templates; template_index++ ) { + cur_tp = template_profiles_db + ( template_index * profile_size ); + + /* Scale the template profile we're currently working on so that its peak + is equal to the peak of the test profile */ + + fptr = cur_tp; + template_peak = *fptr++; + _Pragma( "loopbound min 63 max 63" ) + for ( i = 1; i < profile_size; i++, fptr++ ) { + if ( template_peak < *fptr ) + template_peak = *fptr; + } + + /* Additively adjust the noise level of this template profile in the + raw power domain so that its noise level matches the noise level + of the test profile */ + + /* -------------------------------------------------------------------- + Setting up all the constants */ + + noise_shift = test_peak - template_peak; + pm_memset ( ( void * )template_exceed, 0, + ( ( int )sizeof( char ) )*profile_size ); + sum_exceed = 0.0f; + num_template_exceed = 0; + + /* -------------------------------------------------------------------- + The following blocks are optimized code that essentially + perform the operations immediately below. The calculation of the + template noise constants is done once the exponentials are complete + */ + + /* template_profile = template_profile + test_peak - template_peak + template = 10 ^ (template_profile / 10) + template = template + test_noise - template_noise + if (input < fp_epsilon) then clip the input to -100 dB + template = log10( abs(template) ) + template_profile = 10 * template + test_noise_db */ + + fptr = cur_tp; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + tmp1 = *fptr + noise_shift; + *fptr = pm_pow10f( tmp1 * 0.1f ); + fptr++; + + } + + /* Calculates noise levels from first and last elements of the current + template */ + + template_noise = ( cur_tp[ 0 ] + cur_tp[ profile_size - 1 ] ) * 0.5f; + noise_shift2 = test_noise - template_noise; + + fptr = cur_tp; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + tmp1 = *fptr + noise_shift2; + + if ( tmp1 == 0.0f ) + tmp1 = pm_MIN_NOISE; + + *fptr = 10.0f * pm_log10f( pm_fabs( tmp1 ) ) + test_noise_db; + + /* Because many of the operations in the search for the best shift + amount depend on knowledge of which pixels in the template + have values exceeding twice test_noise (recall that 3db is roughly + equivalent to a doubling of raw power), we'll put those indices in + template_exceed */ + + if ( *fptr > test_noise_db_plus_3 ) { + template_exceed[ i ] = 1; + num_template_exceed++; + sum_exceed += *fptr; + } + + fptr++; + } + + /* Note: The following block has 4 different branches: + 1. Both the current template and the test pattern have values exceeded + twice test noise. + 2. Only the current template has values exceeded twice test noise. + 3. Only the test pattern has values exceeded twice test noise. + 4. Neither the current template nor the test pattern has values + exceeded twice test noise. + */ + + /* If there is at least one pixel in the template we're + currently working on whose value exceeds twice test_noise */ + if ( num_template_exceed ) { + template_exceed_mean = sum_exceed / ( float )( num_template_exceed ); + fptr3 = test_exceed_means; + + _Pragma( "loopbound min 21 max 21" ) + for ( current_shift = 0; current_shift < shift_size; + current_shift++, fptr3++ ) { + /* Work on a copy of the template we're currently working on */ + pm_memcpy ( ( void * )template_copy, ( void * )cur_tp, patsize ); + + /* If there is at least one pixel in the shifted test profile + whose value exceeds twice test noise. */ + if ( *fptr3 != 0.0f ) { + /* CASE 1 */ + /* Considering only those pixels whose powers exceed twice + test noise, compute the difference of the mean power in + template we're currently working on. */ + power_ratio = *fptr3 - template_exceed_mean; + + /* Scale template values that exceed twice test noise by power ratio + and set the values that are less than test noise in db to test + noise in db */ + fptr = template_copy; + bptr = template_exceed; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++, fptr++ ) { + if ( *bptr++ ) + *fptr += power_ratio; + + if ( *fptr < test_noise_db ) + *fptr = test_noise_db; + } + } /* if (*fptr3 != 0.0f) */ + else { + /* CASE 2 */ + /* Set those pixels in the template we're currently working on + whose values are less than test_noise to test_noise. */ + fptr = cur_tp; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + if ( *fptr++ < test_noise_db ) + template_copy[ i ] = test_noise_db; + } + } /* else ... if (num_test_exceed) */ + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + current_shift; + fptr2 = template_copy; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + MSE_scores[ current_shift ] = weighted_MSE * sumWeights_inv; + + } /* for current_shift */ + } else { /* if (num_template_exceed) */ + fptr3 = test_exceed_means; + + _Pragma( "loopbound min 0 max 0" ) + for ( current_shift = 0; current_shift < shift_size; current_shift++ ) { + /* CASE 3 */ + /* If there is at least one pixel that exceeds twice test noise */ + if ( *fptr3++ != 0.0f ) + fptr2 = cur_tp; + else { + /* CASE 4 */ + /* Work on a copy of the template we're currently working on. */ + pm_memcpy ( ( void * )template_copy, ( void * )cur_tp, patsize ); + + fptr = cur_tp; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < profile_size; i++ ) { + if ( *fptr++ < test_noise_db ) + template_copy[ i ] = test_noise_db; + } + + fptr2 = template_copy; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + current_shift; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < profile_size; i++ ) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + MSE_scores[ current_shift ] = weighted_MSE * sumWeights_inv; + + } /* for current_shift */ + } /* else .. if (num_template_exceed) */ + + /* Finding the minimum MSE for range shifting */ + fptr = MSE_scores; + min_MSE_index = 0; + min_MSE = *fptr++; + _Pragma( "loopbound min 20 max 20" ) + for ( i = 1; i < shift_size; i++, fptr++ ) { + if ( min_MSE > *fptr ) { + min_MSE = *fptr; + min_MSE_index = i; + } + } + + /* Work on a copy of the template we're currently working on. */ + pm_memcpy( ( void * )template_copy, ( void * )cur_tp, patsize ); + + mag_shift_scores_flag = 1; + + if ( test_exceed_means[ min_MSE_index ] != 0.0f ) { + if ( num_template_exceed ) { + /* Compute the difference of the average shifted test profile + power to the average template power */ + ave_power_ratio = test_exceed_means[ min_MSE_index ] + - template_exceed_mean; + + /* Loop over all possible magnitude shifts */ + _Pragma( "loopbound min 21 max 21" ) + for ( j = 0, mag_db = -5.0f; mag_db <= 5.0f; mag_db += 0.5f ) { + power_shift = ave_power_ratio + mag_db; + + bptr = template_exceed; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + if ( *bptr++ ) + template_copy[ i ] = cur_tp[ i ] + power_shift; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + min_MSE_index; + fptr2 = template_copy; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + mag_shift_scores[ j++ ] = weighted_MSE * sumWeights_inv; + + } /* for mag_db */ + } /* if (num_template_exceed) */ + + } else { /* if (num_test_exceed) */ + /* Set those pixels in the template we're currently working on + whose values are less than test_noise to test_noise. */ + fptr = cur_tp; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + if ( *fptr++ < test_noise_db ) + template_copy[ i ] = test_noise_db; + } + + /* Compute the weighted MSE */ + weighted_MSE = 0.0f; + fptr = all_shifted_test_db + min_MSE_index; + fptr2 = template_copy; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < profile_size; i++ ) { + tmp1 = *fptr++ - *fptr2++; + weighted_MSE += tmp1 * tmp1; + } + + minimum_MSE_score[ template_index ] = weighted_MSE * sumWeights_inv; + + mag_shift_scores_flag = 0; + } /* if (num_test_exceed) */ + + /* If magnitude shifting has performed above */ + if ( mag_shift_scores_flag ) { + /* Find the minimum MSE for magnitude scaling */ + fptr = mag_shift_scores; + min_MSE = *fptr++; + _Pragma( "loopbound min 20 max 20" ) + for ( i = 1; i < 21; i++, fptr++ ) { + if ( min_MSE > *fptr ) + min_MSE = *fptr; + } + + minimum_MSE_score[ template_index ] = min_MSE; + } + + } /* for template_index */ + + /* Find the minimum mean square error */ + fptr = minimum_MSE_score; + match_index = 0; + match_score = *fptr++; + _Pragma( "loopbound min 59 max 59" ) + for ( i = 1; i < num_templates; i++, fptr++ ) { + if ( match_score > *fptr ) { + match_score = *fptr; + match_index = i; + } + } + + return match_index; +} + + +/* + Main function +*/ + +int main( void ) +{ + pm_init(); + pm_main(); + + return pm_return(); +} diff --git a/targets/wasm-tacle/kernel/pm/pm_input.c b/targets/wasm-tacle/kernel/pm/pm_input.c new file mode 100755 index 0000000..4ebfa8b --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/pm_input.c @@ -0,0 +1,1215 @@ +/* + Forward declaration of global variables +*/ + +extern float pm_lib_data[ 60 ][ 64 ]; +extern float pm_pattern_data[ 60 ][ 64 ]; + + +/* + Definition of global variables +*/ +float pm_lib_data[ 60 ][ 64 ] = { + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + }, + { + 0.1f, 0.1f, 0.1f, 0.1f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 50.0f, 50.0f, 10.0f, 10.0f, 50.0f, 50.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f, + 10.0f, 10.0f, 10.0f, 10.0f, 0.1f, 0.1f, 0.1f, 0.1f + } +}; +float pm_pattern_data[ 60 ][ 64 ] = { + { + 0.1f, 0.101009f, 0.103729f, 0.0993204f, 9.77204f, 9.95778f, 10.238f, 9.77676f, + 10.1271f, 9.87972f, 10.1102f, 9.78003f, 10.0172f, 9.59909f, 9.90138f, 10.0924f, + 9.9358f, 51.2366f, 49.3687f, 9.53496f, 9.75367f, 51.0556f, 49.8868f, 10.0758f, + 10.1888f, 9.57591f, 9.87106f, 9.85914f, 9.79637f, 9.96358f, 10.3042f, 9.99231f, + 10.2455f, 9.86076f, 10.0015f, 9.84342f, 10.1174f, 9.94976f, 10.096f, 10.1336f, + 9.98434f, 10.1778f, 10.4619f, 10.1049f, 9.99764f, 10.1826f, 10.0112f, 9.77859f, + 10.0971f, 9.999f, 9.94476f, 10.2553f, 10.3727f, 9.89549f, 10.0207f, 9.83847f, + 10.1361f, 9.52708f, 10.198f, 10.0438f, 0.100523f, 0.102427f, 0.0994507f, 0.0997337f + }, + { + 0.0f, 2.38221e-44f, 4.00545e-34f, 0.0f, 0.0f, 1.62261e-40f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + }, + { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + } +}; diff --git a/targets/wasm-tacle/kernel/pm/pm_libm.c b/targets/wasm-tacle/kernel/pm/pm_libm.c new file mode 100755 index 0000000..18642e3 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/pm_libm.c @@ -0,0 +1,219 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_libm.c + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This file contains the C math library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_math.h" + + +/* + Declaration of global variables +*/ + +#define pm_LOG10 2.302585093f + +/* The coefficients for the pm_log10f and pm_pow10f functions below */ +static float pm_pow_coeff[ 19 ]; +static float pm_log_coeff[ 16 ]; + + +/* + Math functions +*/ + +/***********************************************************************/ +/* We found out the bottle neck of this kernel was in the pow and log + functions. Therefore, we have implemented our own log and pow, instead + of using the float fp ones in the standard C math libary. This function + sets up the coefficients for the single fp log and pow functions. */ +/***********************************************************************/ +void pm_math_init( void ) +{ + pm_pow_coeff[ 0 ] = 0.5f; /* 1/2! */ + pm_pow_coeff[ 1 ] = 0.166666667f; /* 1/3! */ + pm_pow_coeff[ 2 ] = 0.041666666f; /* 1/4! */ + pm_pow_coeff[ 3 ] = 8.333333333e-3f; + pm_pow_coeff[ 4 ] = 1.388888889e-3f; + pm_pow_coeff[ 5 ] = 1.984126984e-4f; + pm_pow_coeff[ 6 ] = 2.480158730e-5f; + pm_pow_coeff[ 7 ] = 2.755731922e-6f; + pm_pow_coeff[ 8 ] = 2.755731922e-7f; + pm_pow_coeff[ 9 ] = 2.505210839e-8f; + pm_pow_coeff[ 10 ] = 2.087675699e-9f; + pm_pow_coeff[ 11 ] = 1.605904384e-10f; + pm_pow_coeff[ 12 ] = 1.147074560e-11f; + pm_pow_coeff[ 13 ] = 7.647163732e-13f; + pm_pow_coeff[ 14 ] = 4.779477332e-14f; + pm_pow_coeff[ 15 ] = 2.811457254e-15f; + pm_pow_coeff[ 16 ] = 1.561920697e-16f; + pm_pow_coeff[ 17 ] = 8.220635247e-18f; + pm_pow_coeff[ 18 ] = 4.110317623e-19f; + + pm_log_coeff[ 0 ] = 0.333333333f; /* 1/3 */ + pm_log_coeff[ 1 ] = 0.2f; /* 1/5 */ + pm_log_coeff[ 2 ] = 0.142857143f; /* 1/7 */ + pm_log_coeff[ 3 ] = 0.111111111f; /* 1/9 */ + pm_log_coeff[ 4 ] = 9.090909091e-2f; /* 1/11 */ + pm_log_coeff[ 5 ] = 7.692307692e-2f; /* 1/13 */ + pm_log_coeff[ 6 ] = 6.666666667e-2f; /* 1/15 */ + pm_log_coeff[ 7 ] = 5.882352941e-2f; /* 1/17 */ + pm_log_coeff[ 8 ] = 5.263157895e-2f; /* 1/19 */ + pm_log_coeff[ 9 ] = 4.761904762e-2f; /* 1/21 */ + pm_log_coeff[ 10 ] = 4.347826087e-2f; /* 1/23 */ + pm_log_coeff[ 11 ] = 0.04f; /* 1/25 */ + pm_log_coeff[ 12 ] = 3.703703704e-2f; /* 1/27 */ + pm_log_coeff[ 13 ] = 3.448275862e-2f; /* 1/29 */ + pm_log_coeff[ 14 ] = 3.225806452e-2f; /* 1/31 */ + pm_log_coeff[ 15 ] = 3.030303030e-2f; /* 1/33 */ +} + + +/***********************************************************************/ +/* This single fp pow base 10 function implements the corresponding + Taylor series. The loop has been unrolled to save ops. */ +/***********************************************************************/ +float pm_pow10f ( float exp ) +{ + float mul = exp * pm_LOG10; + float const term = exp * pm_LOG10; + float ans = 1.0f; + float const *fptr = pm_pow_coeff; + + ans += mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + + return ans; +} + + +/***********************************************************************/ +/* This single fp log base 10 function implements the corresponding + Taylor series. The loop has been unrolled to save ops. */ +/***********************************************************************/ +float pm_log10f ( float exp ) +{ + float mul = ( exp - 1.0f ) / ( exp + 1.0f ); + float ans = 0.0f; + float const *fptr = pm_log_coeff; + float const term = mul * mul; + + ans = mul; + mul *= term; + + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + mul *= term; + ans += *fptr++ * mul; + + ans *= 0.86858896381f; /* ans = ans * 2 / log(10) */ + + return ans; +} + + +float pm_fabs( float n ) +{ + if ( n >= 0 ) + return n; + else + return -n; +} + + +float pm_floor( float arg ) +{ + if ( arg >= 0 ) return ( int )arg; + return -( ( int )( -arg ) + 1 ); +} + + +float pm_ceil( float arg ) +{ + if ( arg > 0 ) return ( int )( arg + 1 ); + return ( int )( arg ); +} diff --git a/targets/wasm-tacle/kernel/pm/pm_math.h b/targets/wasm-tacle/kernel/pm/pm_math.h new file mode 100755 index 0000000..081e7c4 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/pm_math.h @@ -0,0 +1,37 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_math.h + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This header contains the C math library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +#ifndef PM_MATH_H +#define PM_MATH_H + +/* + Forward declaration of functions +*/ + +void pm_math_init( void ); +float pm_fabs( float ); +float pm_pow10f ( float ); +float pm_log10f ( float ); +float pm_floor( float ); +float pm_ceil( float ); + +#endif /* PM_MATH_H */ diff --git a/targets/wasm-tacle/kernel/pm/pm_stdlib.c b/targets/wasm-tacle/kernel/pm/pm_stdlib.c new file mode 100755 index 0000000..bae64a1 --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/pm_stdlib.c @@ -0,0 +1,52 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_stdlib.c + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This file contains the C standard library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +/* + Include section +*/ + +#include "pm_string.h" + + +/* + Standard library functions +*/ + +void pm_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 44 max 256" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} + + +void pm_memset( void *s, int c, int n ) +{ + int i; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < n; i++ ) + ( ( unsigned char * )s )[ i ] = ( unsigned char )c; + return; +} + diff --git a/targets/wasm-tacle/kernel/pm/pm_string.h b/targets/wasm-tacle/kernel/pm/pm_string.h new file mode 100755 index 0000000..37c0dab --- /dev/null +++ b/targets/wasm-tacle/kernel/pm/pm_string.h @@ -0,0 +1,34 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: pm_string.h + + Author: Hector Chan + MIT Lincoln Laboratory + + Function: This header contains the C standard library functions used by pm. + + Source: HPEC Challenge Benchmark Suite, Pattern Match Kernel Benchmark + + Original name: pm + + Changes: See ChangeLog.txt + + License: BSD 3-clause + +*/ + +#ifndef PM_STRING_H +#define PM_STRING_H + +/* + Forward declaration of functions +*/ + +void pm_memcpy( void *, void *, int ); +void pm_memset( void *, int, int ); + +#endif /* PM_STRING_H */ + diff --git a/targets/wasm-tacle/kernel/prime/CMakeLists.txt b/targets/wasm-tacle/kernel/prime/CMakeLists.txt new file mode 100644 index 0000000..963e0eb --- /dev/null +++ b/targets/wasm-tacle/kernel/prime/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(prime) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/prime.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/prime.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/prime/ChangeLog.txt b/targets/wasm-tacle/kernel/prime/ChangeLog.txt new file mode 100755 index 0000000..935178e --- /dev/null +++ b/targets/wasm-tacle/kernel/prime/ChangeLog.txt @@ -0,0 +1,38 @@ +File: prime.c +Original provenience: Mälardalen benchmark suite, +ww.mrtc.mdh.se/projects/wcet/wcet_bench/prime/prime.c + + +2015-12-21: +- Renamed each function FUNC to prime_FUNC +- Added functions prime_init, prime_return and main +- Added a global variable 'int prime_result' to introduce a + non-optimizable return value +- Added forward declarations of all functions before the declarations of global + variables +- Replaced typedefs bool and uint. +- Re-ordered functions to fit template-order +- Applied code formatting according to the following rules + (incomplete, to be discussed; I basically used astyle with the attached + options file): + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: st_) followed by lowercase letter (e.g., st_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Added general TACLeBench header to beginning of source code \ No newline at end of file diff --git a/targets/wasm-tacle/kernel/prime/generated/default/prime.wasm b/targets/wasm-tacle/kernel/prime/generated/default/prime.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c449e8539f96a2e462be13b65e334818d66891f9 GIT binary patch literal 848 zcmaiyO>Yx15Qb;Qn>Nj6m8wXH<1VM5C{c@0QBTwdKvm%eXV*#Gu&wt4uNTOLL={LC z;?M(keiQ!)dpE7%fUs9yduIGT_IN;68G>tr?tH1!{Bp970T2L2?2J|`I0N_Litb}q zh|>a6ylwdrI^Y}G3xzbj3E3* z$W|PN^yPZJh6K3lL%Q~hhj`dpImB?-+Bhae$G*qN@qGmDM=vAnQ|NZ??yg;fjeF-L z0^Ui8x!9Qa=Zo@rM6v5S0k@`$gkrbR31A30N%uVo8Wk^lns``DhxFawH@tGs;Bvv;W!K)&=AxZ`Ma_S~ z1^@Z1xbqI%u;jmiK7CDo|4`f{boa_<%wM@Z1K1#!nS!uanlw`r|JwK}fW6xS5_biJ z|11V-Hw#|`Y#>Bo(nXp}-59p_5S*>Da&{@2a#043c1lys>zOhY_T6-*s!Gkr( 1); +} + +void +prime_swap(unsigned int *a, unsigned int *b) { + unsigned int tmp = *a; + *a = *b; + *b = tmp; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +prime_main() { + prime_swap(&prime_x, &prime_y); + + prime_result = !(!prime_prime(prime_x) && !prime_prime(prime_y)); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + prime_init(); + prime_main(); + + return (prime_return()); +} diff --git a/targets/wasm-tacle/kernel/prime/generated/modified_sources/inline/prime.c b/targets/wasm-tacle/kernel/prime/generated/modified_sources/inline/prime.c new file mode 100644 index 0000000..9ab796c --- /dev/null +++ b/targets/wasm-tacle/kernel/prime/generated/modified_sources/inline/prime.c @@ -0,0 +1,142 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: prime + + Author: unknown + + Function: prime calculates whether numbers are prime. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/prime/prime.c + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline unsigned char +prime_divides(unsigned int n, unsigned int m); +__attribute__((always_inline)) static inline unsigned char +prime_even(unsigned int n); +__attribute__((always_inline)) static inline unsigned char +prime_prime(unsigned int n); +__attribute__((always_inline)) static inline void prime_swap(unsigned int *a, + unsigned int *b); +__attribute__((always_inline)) static inline unsigned int prime_randomInteger(); +__attribute__((always_inline)) static inline void prime_initSeed(); +__attribute__((always_inline)) static inline void prime_init(); +__attribute__((always_inline)) static inline int prime_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +prime_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +unsigned int prime_x; +unsigned int prime_y; +int prime_result; +volatile int prime_seed; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +prime_initSeed() { + prime_seed = 0; +} + +__attribute__((always_inline)) static inline unsigned int +prime_randomInteger() { + prime_seed = ((prime_seed * 133) + 81) % 8095; + return (prime_seed); +} + +__attribute__((always_inline)) static inline void +prime_init() { + prime_initSeed(); + + prime_x = prime_randomInteger(); + prime_y = prime_randomInteger(); +} + +__attribute__((always_inline)) static inline int +prime_return() { + return prime_result; +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline unsigned char +prime_divides(unsigned int n, unsigned int m) { + return (m % n == 0); +} + +__attribute__((always_inline)) static inline unsigned char +prime_even(unsigned int n) { + return (prime_divides(2, n)); +} + +__attribute__((always_inline)) static inline unsigned char +prime_prime(unsigned int n) { + unsigned int i; + if (prime_even(n)) + return (n == 2); + __pragma_loopbound(0, 16); + for (i = 3; i * i <= n; i += 2) { + if (prime_divides(i, n)) /* ai: loop here min 0 max 357 end; */ + return 0; + } + return (n > 1); +} + +__attribute__((always_inline)) static inline void +prime_swap(unsigned int *a, unsigned int *b) { + unsigned int tmp = *a; + *a = *b; + *b = tmp; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +prime_main() { + prime_swap(&prime_x, &prime_y); + + prime_result = !(!prime_prime(prime_x) && !prime_prime(prime_y)); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + prime_init(); + prime_main(); + + return (prime_return()); +} diff --git a/targets/wasm-tacle/kernel/prime/prime.c b/targets/wasm-tacle/kernel/prime/prime.c new file mode 100755 index 0000000..b694a6f --- /dev/null +++ b/targets/wasm-tacle/kernel/prime/prime.c @@ -0,0 +1,139 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: prime + + Author: unknown + + Function: prime calculates whether numbers are prime. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/prime/prime.c + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + + +/* + Forward declaration of functions +*/ + +unsigned char prime_divides ( unsigned int n, unsigned int m ); +unsigned char prime_even ( unsigned int n ); +unsigned char prime_prime ( unsigned int n ); +void prime_swap ( unsigned int *a, unsigned int *b ); +unsigned int prime_randomInteger(); +void prime_initSeed(); +void prime_init (); +int prime_return (); +void prime_main (); +int main( void ); + + +/* + Declaration of global variables +*/ + +unsigned int prime_x; +unsigned int prime_y; +int prime_result; +volatile int prime_seed; + + +/* + Initialization- and return-value-related functions +*/ + + +void prime_initSeed() +{ + prime_seed = 0; +} + + +unsigned int prime_randomInteger() +{ + prime_seed = ( ( prime_seed * 133 ) + 81 ) % 8095; + return ( prime_seed ); +} + + +void prime_init () +{ + prime_initSeed(); + + prime_x = prime_randomInteger(); + prime_y = prime_randomInteger(); +} + + +int prime_return () +{ + return prime_result; +} + + +/* + Algorithm core functions +*/ + +unsigned char prime_divides ( unsigned int n, unsigned int m ) +{ + return ( m % n == 0 ); +} + + +unsigned char prime_even ( unsigned int n ) +{ + return ( prime_divides ( 2, n ) ); +} + + +unsigned char prime_prime ( unsigned int n ) +{ + unsigned int i; + if ( prime_even ( n ) ) + return ( n == 2 ); + _Pragma( "loopbound min 0 max 16" ) + for ( i = 3; i * i <= n; i += 2 ) { + if ( prime_divides ( i, n ) ) /* ai: loop here min 0 max 357 end; */ + return 0; + } + return ( n > 1 ); +} + + +void prime_swap ( unsigned int *a, unsigned int *b ) +{ + unsigned int tmp = *a; + *a = *b; + *b = tmp; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) prime_main() +{ + prime_swap ( &prime_x, &prime_y ); + + prime_result = !( !prime_prime( prime_x ) && !prime_prime( prime_y ) ); +} + + +int main( void ) +{ + prime_init(); + prime_main(); + + return ( prime_return() ) ; +} + + diff --git a/targets/wasm-tacle/kernel/quicksort/CMakeLists.txt b/targets/wasm-tacle/kernel/quicksort/CMakeLists.txt new file mode 100644 index 0000000..70bf698 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/CMakeLists.txt @@ -0,0 +1,28 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(quicksort) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/quicksort.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/quicksort.c" + "generated/modified_sources/default/input.c" + "generated/modified_sources/default/quicksortlibm.c" + "generated/modified_sources/default/quicksortstdlib.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/quicksort/ChangeLog.txt b/targets/wasm-tacle/kernel/quicksort/ChangeLog.txt new file mode 100755 index 0000000..4a5607f --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/ChangeLog.txt @@ -0,0 +1,42 @@ +File: quicksort.c +Original provenience: MiBench benchmark suite, + http://wwweb.eecs.umich.edu/mibench + +2015-10-16: +- Removed original header comment, replaced by TACLeBench header. +- Removed all preprocessor macros, integrated them directly in the source code. +- Added prefix "quicksort_" to all global symbols. +- Added explicit forward declarations of functions. +- Replaced local variables "strings" and "vectors" that store the benchmark's + input data by global variables. +- Replaced initialization code by TACLeBench-compliant initialization code. +- Added new function quicksort_return producing a checksum as return value. +- Added new function quicksort_main according to TACLeBench guidelines. + quicksort_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2017-06-27 +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. + +2017-08-18 +- Introduce proper constant propagation border to silence g++ warnings. diff --git a/targets/wasm-tacle/kernel/quicksort/generated/default/quicksort.wasm b/targets/wasm-tacle/kernel/quicksort/generated/default/quicksort.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b503d9c8dbb905ba0b1f3c394fcda0f2f4a58ecb GIT binary patch literal 23176 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\08\00\00\c3\0a\00\00\91\08\00\00D\09\00\00t\05\00\00\8a\09\00\00%\09\00\00N\07\00\00\c3\0a\00\00m\04\00\00\d1\05\00\00i\0b\00\00Q\09\00\00t\05\00\009\07\00\006\0a\00\00\18\08\00\00\0a\06\00\00\cf\08\00\00\f2\04\00\00\f6\04\00\00x\0a\00\00\d9\07\00\00\c3\0a\00\00\09\08\00\00\00\00\00\00\00\00\00\00\00\00\00\00i\98\c8\060g#\07\05\fc\ad\0bD\e1\f8wU~\c6$w\01_Fw>\82\048\dcJ\88^\ea\b9c$\97*H\5c\8f\d7\0bX\96wQ-k\d3\eaQ*N\a6p\5cXU88\a4>\15;\d4N\1d\b0|H*\ecB#j\af\cc\e4W2\9a\d8,\fb\06Zr\ec\89\22TT\8fXK<\8dmz\5c\a4Dv\db\7fC8\18\1b\e9m\fex\94W\1aHJh\02\f9\ff2\fa&\a0\1b\fb@\c2=C\bb\9at\fb\85\e6\12:\c3\c6u\aa\de\a1y\e6?J7\d1\ed\0eR)\a5\c6p|\b7\9bd<\c1\f9#\05\f0NO\d8\0f\f1\1cue89\94\c7Z'\89\8c9Ga\a8[#\be\15\01\18\bb&\12t\5c\af\b5\15\f9\e9O5\0f\b6j?\99<#\10\a8\b64\0d\eb5\aew\b1W\0c~\95@Wa\05~\f8_\b3P\0c1\f1\e4\9bW\00\bf\ba\1d\f7\0b\a7%\ef]0/:\82\81\13\a1\eaH\1f\e9\84\d0J\0bp\90e\ca\8f\0f\10\e5\0a\b7]H1\8a\09\d0\7f^_\cbJ\01\15\bd\96\c2BdG\b9\06G\02\9dy\1e?\1ef#]\ba\1e\1f\12\8e\16{\ee\d3{\1cG\0aT\a8\9e\c7]\14+\f7\0b\c5\fd>ad\c5\d9Q\c5\82\03\0aZ>\96Bs{D\11y\d3\0f;K#2\1a^\b1\f2\08p\df\b6`;\81bIc/\ebh\11\ca\ff\7f$\063\14d\ee\a5\06\dcY\0f\10\09\11\eaq\9ep'\1a\ac\d9mo\d4[\eb\06\aa\e0\b7\7f\10!'v\1b^\88\00\f2\11B\093~\e1\14;p\16\17\af\a8\04LP\c5\ebh\e3\0e\det\cd\e7\222\15\c3*JG\d4\b7FH\d6\f6-o\01\c1\0c\bbO\fcW\5c\01\ee9\ba$\f3&\19\01\ef`\22\84\f1C\f5\a5Up}0\daI\9bW\01\7f\1a\ac\88\04\e1\1e\80P\0b7\b8_#\bdrv\7f\8f\a7j\1c\01\b8_\f8\18^})p_j\f8Z\c7o\13w\e6}\1b\82\a1s\a445_N\e7\fc\14\ca*\a6?\b5U\5cU2\f6\da\09\98\12\c9q\e8\d3=jy\ca\92P\e0\e8\bf\1f8\99)S4\1a\8f(=\ea\adYM\5cT\1dN\1b~\09_n\9f\1d\bc]\15*\cbKXS\fa\c5\a0\1cw\82\08Q\acj\d8#\05\fdX|l(^A+\fa\7f\0e!\fe\10\5c\86\d4\e6EUj\dfx\1aY\d8K\aa\91Y\0e\8e\ab\f6$\f3\b9QU[Z\eeK-\b61*\d7\9d\e9$LWLcBCu\00\09\9d\ff}\9b\c2I\18\c4\f8\16\18\06\e8m*\e5\f3\e7i\cd\82\9fu\af\9d\b4z3\22\df7\7f\9e\81\0f\84M{Y\a3N\e7a\d4d\1bc\adg!1-\d4\c7W\deLSnGnHuv\e7\b5x\ec=&F\1c\8c\96e2\de\0d\1a0.ot\c4\d3\d4sJ\8c\0d&#\e8\c0I .\c3?\f6\8a\deo\fb\85\aanl\85\0f#\856\d5\14\04#\aal\07HY;\b2\ec\06?\0b\0b\18\17\ec;A%\f4/|?\ba\a8\cc\11 ^ ]\b9(\93W>\f6Gk\c3\ac\07?\86\ab2M\ec]i\1c\f1\80\cf\16\05J\b4\5c3\cc\b1\11gh\85\0f\d9\ae\cf?PXHw\99F\93)\b7\fb\22.\14,\1dk\e3\d2\a0O\a39It4Z\e0*\d9]\7f?\d3g\b8h\a0\df\efM^\94TT\f7Oy2\a8'I\09\10\81[\13\f2\d5#!\94c\8a.\05\b1\d7R\f6\f8\cd\0d\b4\c1\aa\0b\be\d9j*\01\04\e6$xn\b2JD\85\9dw\bc\ac\b26i\ef\81aI\cfQT\fa\a2\fa!\d0W\07q#~!\14\e6\00d>i\9e\9a\1a\dayDB\1a\cd\15PLq;j~\b3\8d6j%^G%\cf\ba)Q\1bF\1f~Q{2\84c\0f~Hk\bfQ\b3\ab[]\94\e4j\11:A\e3rS\8bK+\99\95Bd1:\b1\00\fb\b2\944Wo\ad\0e2>\97%\90\16\1fc\9b\f4J\06\ee\eaI\5cD\d8\c9n\e5\c3\9cZ\e9\8dD~\bcF|9\08B\ben\cf\8e\a8<%6\fe\1a\e2\bb\021\e9[\be\0c\f5\8d\05\0c`o\90gS\81\1cT^,\a0&\b2\8a\d6\06\d2\d2\97\06\aa\9d\db\10\fa\f5\95X\85~\f3c\d0l\96:57yK\d8\09?\0fT\d0\a58fq*L\d4\bc\d3C\e8\b4\10J\98\af\c1qd\d3\f2&\82JS.\87\9a\0bN\a8\ab\bc\15\d9\b9\00=p(PLe\f28Ou\aeKC?\b7\f8\08\8a(7jZr\e8\1d)\13\b7\15\80\b6j?k\0e\d7 \edA\d3\aa\84\07\ff\01\22\1c\01<~\1c\c6\a9sL\d9\c4t^*\aa5v\c9\ce\abPC\04\e0l\01\cb\228\15\be>;\15A\15s\ee\e8uy/\d6\f0ya\fa\b3D\87e\b2*\02\81-bb\b6\93y\13f =|\a6\0c\1c\fc\ba\cf{iS1q\9ei\ab;\cd`\dec\81\05\a1:r\9f\85\17\a6\8e\f8 e\e1\cfsq\f4\1abI\ecy*\ab\1fT{>\84|aK(\f8Fq\c9\c7G\cf%\813u\d2-=:\98s\18\ce'\a3Ov\9dPuOV\b2S\a7\ec\17.d\86\c6n~,\a3M\ea\f0\f7\1a\eb\ebx\19\81\ad\d0/\ff1\0d\0e\feQ\99V\fdS\ddKa,\c1Rg\a5\caG\9b\bd\88\07\c3\e2TL\e9\aak\02\0d]\0e\1f\bf\9d$HN\8c;v~Q)\01\8c\fe\02,\f9\ab\8fq\bd\d5\a5b2\8d\fbLjuW9\8c\fb&\16|yuw\a4\0d\cbQ[#\cae\c7\a1m>\f4c}%\02\10\e2\13z\bd\7f}\f5\9d-!\96\b5T\8e\a0\b8\19\16\a2\03C\af\01\d6q-S\ef).\a0\92Y\b9\e6k\06\c6\b1\b5+\02t\c7R\8amoY\c9\85\d3fcC#b\97h\0e(pg\bcs\1f6IWVu\99g\0c\ad\22&\de8Q`+\1a\d7\06\1a\83\a9K\89<3\18\01C@\1f\1b\97!\14!s\fc\0c\d8An\07\0d=hK\07\09n\11\16\bc+\07\8b2\06y\fd\e0\dcq\a4\5c\e4 \a1\d4\09<\c2\98mv\d2\af\d3J\cft\9c\15\e3.#K\98a\89v\d2\e8ch\920\f9GV\a6\00\06\f3\0d\03\0d\8d\fah\0eX\a8Z&F}%\b2Z\04\0a\eb\15\d6;\d2\cb\f2@:W1vl0\e8=\1f&r\18T\84W\1f\c0\fa\cd\0a;\f5\8d\05\ba\c8\e2\0b\ab&=N*\ad\0d[\f6\91B\15\f89\09oN\91\14{\9eH\85c\16\9c\ee`\c7\d7\eb<\08bD^\11\fa\0fJs\b9\e4\00`\f8V\0c\04\d7\16v\dbr2_\a7N\fd\0c\0a\ca$y\22w\d1d\b5\a6\a5g1\10\a2\1eM\cf/#\a0\bc{#\03\dc\94_[\5c*\0c\0d\edca\22\02\07x\0d\b7.\16\cd\e71l]\f7\94}G\0e`\0cx\0eo:\87\a4\a2X\9b\92\b7+pHx)\d55\b7SV[\9a7\86\e4f\0a\9c\0d\a3\10L\ed\dcL\98\devT\0f\c7\87\11\ea5b0\9c\b5\8dJ\eb9\bap\f2\97\a6\0e\a7\7f\b2C\0d\b1\8bUS\90\fd\1a\d8\8fTbZ\80\bbx\fa\de\fa'\dbk\e9A\b5\dc\e5\04\b0\85\a0\0f\fdm\f09\c2\93\14\1bPB\1c3Ze\857\09\a2t']/\80\14\e2\09(\10\a54,S*\17\b2\00\b7?\dfc\fb\8f\c6\0a\a3%!;TM\82tG}\a3W\13n\99dc\14\0a\061\b3\05\08\9aR\00oNN\c4v#K\ac\1621wC[\ffOLv\db\a91\ce\e6\04\0e\b6\7f\0bEq\ba\a4Yuf\b7Qk\5c\f1I!@EiM\f6\0b4.\f0\05eq\82a\1c(b\f5u7\92z\0c\cf\b1\e10%\d0\e5/\dc\c6\a6_\f9\c8\931\805kg\d7Vmj\9c\ee\b4lb?\93w\1e\d4\10B\b0\5cNQ\19\7fr[O\87\16JJ\afN@m\cc\f4Os\d2\c2`|\e0\c5\03\d1\e0\feU\e9\adl\12J\c7\ca\11\1f/\c3LZh\11l\c0-\82c{.\13\19{\a8VU\0d$\8e\171\ae\1e^\ed*\b8q6\86\83\0d\9c\0a\10(\bc\dc\99\22[Vi=\ca\fa\15\0d\b5\a5-T\db\8b\d4$\02\8d\90\19R\94\e2@=\cbg\1c\deS7y\02\f10\12WJ\daw\b6\aa\a4cL\a0\7fR\c4\16\cfG\d4~\b5%\c8\80EV\95\f7\cd\1d$\06\cco\12H\10h\b5&\91j\97\d8\8eP\d2u\92K0U\a4\03\80\86\fbb\e0\99 ca\03\c3a\db\ee\0cO\16 \a4p\fd\0d\d3\09V\97c$qv\0d.\c8\08\e9\16C\c2\1b\16M\02\e2R\ca\95y0\ff\9e\b58\8a\cdIo\a8\e9\b0)\b5D\e3\0c\e1\17$g^\94U\0d\07\d9\c5M\a6.\f3.3\13\0b3\09\ca\f6_;&\c1LW\19\d7\22Ujv2\f0LR7\ee\f1es\1d\eb\bb\08 \a2\f6:nxaV/3\ccp\81\a5\b9\1cIgn%\02\a9^<\7f\b3\8c&\a0\fe\d1I\e2B\7f\1fG\bcu=\e3\c0\ed_\f8b#\10\11R\efm\e3_\a3\18i\d90>\b9;\a0\17\98\a4\86%\b6\db\12\11\18\d0\f5$\9f}LsA\a9\5c\00K\e3\00X\a8GCS\22\c1\80g\a2\fc\d7z\fd\b1\b9\05\c8\efs\16\90\ee=n\1a\9du\0e\04\165c\fef\9fDI\d0A\7f\f4b\87\1aH\ce\0djKy\a0;\15\05~U\e8\cc\df3-\bc\1f[\96\aa7r\cb\8d\cd\13%\1fCk\15^\c4\18\ae\edp,\8f\f8s)\5c\1a:VF\92\f7QE\d4\86:ml)D\e5\0fDE\86}\e3:'\a8\c9[\8dW\87\18\a9>d\22?x\bf\00\8a\09A\1eq.\d88\8a[\c0X\a4\a6\b6,uD\0d\1c,X\98S\eev\f8+j\a7\946\bcF\d6A9\f0\98g\7f\ac\12\0c\ba\adu\06g\ac\b8B\15WJ~\02|\83p\8c\cb\fb-+\b5\0e\17\eaHc$\1b\c4oW\87\cfHm\b6\d608a\98\f6\11\f5;r1d\c4\a1d\e7\15\daL\1c\e4;\0d\abV\996\90T>o[\5c\fb\0d\90f\dd{\02\83\16(\e5\b7\bbf\1e\bed\14w\c7#D\11\10T:\a8\c7\a52\e1n\b8z\cdV*|Mn\5c_`\1b\cb\06\87\04\a0\02;\e5T\0bvr\15\05\8a\80#st\d5\edr\a1'$\1ct\c9\86\17\db\81\a65(\f7l\09*\a0\b7OhM\a2c\1d3\df:\8fdY4\83\11\12;9\17\1bH:\bb\f2j\e4\a9\08M\94s\16V\ca!\d0f\cc\bf\e2\19y+\d2<\e8\df4{\5c\14!\09\8a;&w\91\a7\da-^\9771W\92Ps\de\157\0d\d6^[u\df\96\f0u\19\fb\8b\18\b7\cd\13pi\17\14i\8d\d0y\0b\18\e9\dev\dd\e0\9a\00iR A\8e[\f4{\08\81RP\d1\9f\c2$/\83\18\18\97\e5\ab\04T\b1\d4_Wz\85!\d1\a0\9eo9[\dd,u\add\5c\9b\c2nV\05\1b\c0F\ae\c4\7f$\84\a2\a3Qa/\e1OC8\96z\15J~\7f\c0\c6\18\01\bcch7\f3_\b5\0c\96%tvG\9f\8e.\0c[A%M\f3\87f\9e1\df!\99+\bb0e\dcf]}\c8\cf\17\02~\dbq\f37[Y\e6\df\e3\00\d3\1d\9e\16\22\bbsq\c4\c0~\01(\cfrvz5\f9\12\ccA\d1Qa*P#\ef\e2]oc'}VfE\10j\9d\a7\dd\134\c8\1bF\c7t\f19\e0\dfs\0e\cf\8a\8a\1c\87;\0a;\9dC\dcES-.n\1da~1\e4\e2jthw\acmkT\06\18\82\14J\16[\d7az\d00mu\00\dd\19.g2\a3\1f\c4h\c8N\e6\bc\fd.\01^^P\e6#<@\aa}|0\03\dc9B`Y5Sv\bfM\02\d7\f9\d7XO<\93B\d9\e6\caX\ff\c8JO\ed\e3pV\0d\af\e6\1e`\f3\9ar\cd\c3\e4d\dd9q;\c68\ab\5cj\07\c1*0g\9f)\8d\ad\9c\16N\ea+\1f\99\deK\17\15\e9\a6Q\d1\feu5\f4\b5\ad\112J%\03\d1\db\8fc\5c\e8P1\9d\9e+\1b\b7\98\8d\12]F\af\01n\cf\98\10b\16\0aC`\22\e9C28a_\d8\d5WE7\1c\c1\1c\18\5c\9d\1f\b2\bc\22\1e6\e5\0bly\b5\d2r\bfk\09=\96\d8\a6^\c8\f1e5\9c\a5zx\5c\11R;\b5\d5\d6\0b\cd\0c\1a\22\ea\be\eeQ\83\99\bbpf\ebe9\ff\a7\95#\ed\a0|\1bZ\a1\13K1\f2\ba&<\8b\a8:\b6\89d|\cf\90\e6A\0d\8a\1ep\13\d0\13~=`\7fR\dee\aeSt\f2\fcAo\98\e01\95\fe;f\ab\0e\be^\87\f4}Q\f7\14F)\e2\f3\c9J\00\aaPD\d0\ea\9dnx\ccp)\c9\9b\b6y\82\a7\c0\0c\d5\dd\c2d~q\8d\05A\13\caI\bf\9c\b16\01\0bIv\de\b8DB\beDGZ\ef\ab\c5\11\ab\c5^d\ef6\02\01+7nL\11\b1\c4\1d\be\c7\e8B8\c1\8ccw\af+\ed1Oh\17t\93\ea\b3Z\abSUG\f2\a2\d4\13=\89\01\00\15\14\9e\0ee\c8/\22\926\0d\04\07\c9d'Z\95K=\c9\d7\e2R\fa'|\04\90u1\22xE)K\b5\22J[\a5\0e\5cI\fd\902(\ef\8e\a57dm\e5T@y\ed;+\06J\0a5}3~B\a6\ef)U)\b4nq\dfY\103\0a\f4\18\ab\83\8c\1f\cf\1d\bd\07\e25\e1J8\9f\f1\0cb\08qb\8d\896\12\dc\e1\91\0a\9f\91rb\a3\9d\d4 +J\a9~1\c8\7ff\aaf9H\1d\ed}\12\fa\9fb9\a4\8e\b5L\82\b5\ad4s\e5\8b\04Z\b1\ff'\dcJ\f9qpv\be,I@\a5_l\c0*\14\b0\ef\abhtF\efi\11\cf\86]\f2\95\9b\12\cao\a3XvSa\88U\1e\19\1at\e1\a3jf/\ac\81G\19\b9|-+\e4\0fF\9cl\ac[\8c\9e\082\9f*\ff/\ad;39\fc\14\c7^i\9a\a2\08#x\9fk\ac\04sG\de\8d\d2\00\ce1?\1c\9f\9a\0eZ\8c \f4\05\ea\ca8]\c4:\9e\05\15\95\a7\15\d5\81\ef%\cc\10\0f|\caS\04$#A\17Qbp\b6\04\9b\ff\deD\10\92\b1^\9am2.\ef`g\1a.\ab\cbR}\d1\e7\1f\1e\0d\e9aGdH\00\05\c4R^\bay\95=\d3\02Q2\e6g\bdDh\b5\c8v\cf\17\18\11\11L\cd\0a\8b-hb|\1c\8bX\b1v\cc:Z_\a7~\1b\b7\992\1a\11oCD*\e0[\df\f178\f9\9eAD\1a\ac\cf\01\ac\02G4\85\bf5J=\ed\e6R\0es\fd8\9aT\dd_M\7f\981\a8\e0/gd\a8\e1\03{*d\04&\b2\17\07\00\a8\c0H\c3\8e\ac\04+vje\ef\08(c\96\91\fd6\11\de'*\0d\16\11Ef\a9\15H#*\f54\c8\8f\a6\02\e2\c5\a0 \d4\a0\c1o0Eoy\fd|:S\ee\b103\bbr\d7[\dcnr\0b\e7Prw\15\d2~Z\88q\b9?l\10\a8AZ\fc^6\96\e4\b6x\07e\85!t\a8.8?\c5\e6_k\0dg%\b1\95\15\0bew\fefk\b5'n\fe\14\ae<\90\edhLZ\beOQy?\12A\a1\cb\90vh\d4`\16<\ce\beE\c4\f5\85+0d\07\19\d3_\bc|\98\96G\1b`\a9v\129\09\d2D\87HxN\1b\1cNn\1b\cfren\99\eaE1\ee\ccH\18L\ad8\db\a9\92\07\8b\ea+\7f\f4\ba\1fD\e2\0e\18)\ff\92Z7},\d9\03M\1c\7fN\b0(pB\13\11\90|\b9\d1\a6<\ae=\1e\7fR\d6v\5c\13\90\f6\0d'}0@\b7MuC{dW$dK\ef\05G;\de\0f\ab\c8^=7\ab\ab\02\e9\06o\06\0br\d5Op\b4}G\ad\fc\f41'\8e#>\8b\83\f0,F\93\a8\8f\0e!\d9\e9\b6i\c7\e3\e7\161F\a8\06%\07\e8bz\8a\13PL\1f)l\9a\ec?\06-M\af&\a7X\afP\89p50\f2\bb\b1(jokt\aa\e0=$E;rz\f8\aeL]Dx7r\d1\93OY\88\c2\fe\0dA>\91 \a37\1f\15\8b^\ffMN/@a\e0\b4\04l\8c\06?J\b1\de\80\01\e2\87\f0d-\8a[h7(\08\1d\8a\17\ff\05\06t\12R\1c\81u\15\bc]\a7\0c+{\fa4u\08\fbS\08}\d0x\c5g:;<\ec\e2j\b0\d5\7fIN\d8ok\b7v\f6:\1aE\eb=\f8\b8\ad\0f\e4\c3\a5a\12\f47\1b=1\e5\01\d6\7fW\0a\9a\b66)~ov\22\1b\bb\c9\04&\156w\cd\9e\b6\03\ecN\19^\b2\1buA~}7\05\8f\868s\df\a5\d0)\b6\a5?\22p;=_\e5\19\e3{\d2&\b57R\c3-D\10\95\dd0G/\b0\0b\dc\da,J\d6\fc\17l\84\1b\93v\988\d4V$\d5\87W;\92\891\a1\b5\a4O\1d\8e5g\1fV/\13Q\8b$\19Z\bf\1ai\f5\d5\86\1dk\d0\0fW\d8.\91\0b\10\91P\22}\c4Gr\a5\cdG\0f\fc\dfi\00\17{~\1b$K\7f\14\8cf\a2s=\90\b4\12\da\f0\be6\fc\a1\dfR\ef\ab)T\ac\17tnNe\0d\17\ceQ\fa}\f3F$z*@:a\b3k\ddywb\b7p\c3x\0e8\c4\00\bb*\b2\f4@\22d.\b3\07\9a\fd\d2\16\d1Jp5\b5\b9\d7 \be\d2Zn\c6 \f7R \8a\e7w\db`\90U\d6\b1Gu\9dN/j5 \ab>\d3\91\b1u\b4\c9\ad\05\0eO\f9W\c6\efU\00\c4\b3=l\f77\a73\11\01\e7F,\09\ba\17\ee(,^\d6\c4D3\83cv\0e!\0c\d6C\ef|}$>\13\ae\09\99\9fV5\95\db\d5\0c~h\dd\15\85e~\12SJ\edk6\f3\fbs\d6\a1\0fa{Lu?\ee\fb\8aQ\fd,\19;\dbsr%,\b2HP\c7\d4\86$\8c\ab\ac\11\22\e6\07'\90|\ccI\bbX\a6 \d3\92\97\19Vl\22J\80\0c\e4\0c\b0,\f2bhm\09\11\ac\15\9e$Hk\eb:>2ND/y\143?\a3\92n-\af\cbhn\8c\c2<-\cc\beL\c2\8a\a1u\ec\f4\9fRN\d8\94\10\16\d5\8ea\22\e8\9bF\e8w\ebE\91!\04!\11\e4&\18m\ddiXl\95vF=\96ohD\7fy9\f8@#X_|w\0fA\ac\92t\b4\99\c9x2\0f\0f)\08\81\19\194\a6\ad\05\e2;\01\0c\99\fd\e5b\e0\bbK**\a7\ecF\efi\08-\105`]iJ\7f5W\d7\11>~\c1\22\1a\96\16>\02\95\09`\02j\b6\c2l\e5\ee\d2\12\c2\b8+k\8d\9e^3\cdf\beX\85C\cd`\9e\82\85K:D(1\9b\18\5cB\db\18\f53~\c3\a1j,:`c:\95lC\c0o4_\99\cf\d6)l\a4{l\c8\f0Mx\91\10\fa\01O\e0|xa\ee3[E\aa\c3zy\87i?QX<\08yPq\00\e3\d1\e8t\a8/NFZ\0c\bd*y\e8&w>9\aeHjA\1d\08^\d7\f9\09\00\f2\d93\e8\02@\22+>\b8b\855\a7\14R\b9\02\0ff\82\e0\13 N\03W\dfWaB\e4E\82~M\88c:}\da\e6\0d\a4\b5\b6]\e6W:dX\f3\dbAm\a6\04Vwh4f\92\88H\05\ce\9481\bd\12\f8`\ff,\c4q\1f\edt96ciaN\0dAj\c8\1c\c3\7f\90o&\0c\c7\94\aa)\06VqH\fa\b0C\14\aaf\93\1e\06HK|\e2\b3\836$O\ba\15\8c}\f2\105m\86E\82&\b4\1f\ac\cb\f5g\14\c5\e7\07\aedl\02\f9SY\22\92\9f\ce\15\14\e7L\16\df\ab\93\06\ea\92\aaW\f8,\cf\14W\14\c8l}\1b\f3\5c\9d\e2\85r\14'\c0M|H\b7N\0a\89\8aHJ\8a)/\caU\f88\d8\1d\c3y\db\f9O;\91\ea\a2b\f8\0a83\d5\aa\93O\03\0e\b9z\09\d4\fb3\7fn\ce\8e>nYk \9ay\a0zDy\22\0eQ \10Wg?Xr\fc\d79\14\e1K!\10\bf\82\02{\e9\a3\d7_\86^\7f_\c4\91\a2k\ea4]3#\9e\acC\c3\f4\9b~~e\b1\1c]\c0_\1a\a1\03)\18\fc(\b0]\a1k\9d9\d6&~\1e\f7\07\a2{\bd4\9eR\1fq\93rn/Kh\d2\08\d7\1e\b2E\d2u\af\ac\ec\0d\a6\04\0b\1e!\14a4\81\141\16A~\ab\18e\8d\83B\90\cd\ab\1f\a8\bd\03\0bae\bdV\fe&\17@g@\06\06J\09\956OG'\17,\d2\a8q4>\f2i1\93H'\ef\c6Dp\b2\a3\a3\06\b7\f1\c7\06\90\cam\08\ae\ccSd\da\8ftJf\f1\eb&\a5\d4\f5_7P\d4d\85b\7f\19\13\04AH\d8\bbq\1e7\a8Q\0f\c2\b0-V\95\f0\0fqX\bc\b2CD\c5^lg\f9\e6\0f\bdI6\06\d4\92\0a\0c\0e\fe\f1-\1e\af\f3\5c\d2\b9!LO|\9dFh\b8\88\13\22\01Ic\f79\a1Q\9d\f6z}S\94\91\0a^z\a7WO\9a\1e\04\0a\86Y\11\8aLPI\fefrh\e4\15\ce[y\13\959\a3;hH\1bf\a2@\09\de\02B\b7?\a9\10\f3!\14_o\cf\eehy\f0\d6f\88\12$P\f41n\02\bd\b55S\f0\0b\0b`,\da\bf\11\91H@_\fe\09\fd\0d\84\96rUd\02b+M\86\9aTB\e0\a8[\86\03\ab\0eD\c0;&`\8f\9c8\d9\97<\19\a2:\e3}\c9G%L\e3\1d\96*-\873Gf>\a0I\c73d\06\a6\9a\c8\00\b5\d8\beM\e2\99\06G\b0x\cbB\b3?16\d5\bb\1a&\1fH\ba+W{\99~]\ce>v\14z(.\0e\bbB\0fM\daIV@T\e8?\87\ab\19vK\e4Fd\c4\eaZ\15EaOI\98j\e18\06\cb\03q\d6\a9\8f(\dc*\1d_gZ\a0):\ac\f1S\7fe\00]0\a2\c5u\c0\af\9cb\ac\ec3$\96\e0e?\99G\d9{R\87\fc$K\b9$\0d|eo&\02\00\c8g\ff\f8UCC\99\d3,\22H\82\13Vt\efA%3\das6\c2\aaAd/2Q\fa\ee\f4\19v\16\93\01\eb\daKGX\bd3\10:\01\ee\160<\9b\10\a5\97}fA\cc\f1\07\07\e6*9\f1{\c4J\a8&\921A\92\1c\0d\89\e6\a5\03\d8\c8W'\02B\b9of\11\c3bn\a9\bdf\9b\89\92k\e5v\c3?\b9b\e2s\18\ef\01\12\91c\f7c\b8[87[\88\d5>\e3\ea\f3\08\0e\d0'y\81\bb\af2\e6\ea\bbpr\ffYJ{\aa\a4L\083>\04^\da\a5\11\d3g\d8\5c>\f5\e8E\8e\16A\22y\ffUC\b4\0b|G\95\fck[j{\1a\0e\ee\0cj^\d7\8e\88h\f3a\c0\11/\d9[f\d9\d0AXYs\83t\d7\ff\ed\17tZ\d4C>\eaF4\af\c8E?\8cI\d6U\cfM>\18\1dr\03&\e8\d1\ab\14\b382!\d7\d4\e5\19i\8d[G\99#\ee\11\8f0\1eQ\e47\00\14\a1V,\16\9e\00FJ\b8\9f\d8p\dfK\15\5c\10\00\a0\141\9f.4\93W\91#n\daE&\9b\1aIB\81d\fb\01\fd\f0\86H\8e|\09T\b1=Wh\92\ed\f2#\e8\ef\8cH\88=E\00i|{\0c&\da\d3|8\06\8b?BM\bdd\f6'\12\15Ux\8ee\b7\a7\91(\a9`D6,Mt\7fC\f1g~B\842H\bc}\92P+\c3\13\13\e3\da^^Z~\d8\1a\94PoZ\c2&t:j~x/y\88onU~\05^\d9X\beU1(H_\d6\e2\00`\d6IE\1eb\c7v\13\87 XHh78B\fd\e1\bfU\10^\9dH\d2\b3\b3N\8b^\c9)Hd(\08\14\01q3sNVr\9d\dc\b6m\cb\a8\02\5c\9a(*o\ca)+m\0f\9ajZ\90P<\04\86\a7\bd=:]~m9\b1\80:\e0%\96X\cf\ad\edG{5\b3\02J\a4\0e\08H6]6^\10\12a#\fd\cc]y^\a5\15 7\86\1b\f9F\12|\db%\1c)u\b5\8byb~J>\d8\07\dc~K\98\8cY42\fe\0ccf\a5(\d3\b8\e4!H3o@\d7\b4\fb\1a\e3\16\82j\14\dcq\1cq\dd%\0a+{\aar#v\dcv\01.b\0e\c8Wa`]\d3Zd:\df\e2H\92\81\8cM,\81H,\b5\14\96K\18)J\0bt\b7\a5b\13%\a8,\f8N\e0c\ed\15Kx3\5c.HC\f3\eek\c8;g!\a8\11\baAf\f0\bbI\a0CC \f3\a9F\1b`7\ceE\04\aa\e8H\c6b+=\c2\b5\18\04\db^\e4c\a9y\ad'\f6\e7\16\11L<\0an\d4\f4W\1a>\1b\86QMjl|\9dL\b9zR\f7\f7m\87IOE/\ceEHum\d4d<^\e5\10H\f7\8fS\d3@/IO\83\8d=@Fp7\ff\c1wu\82\df\bb\05\839_#ty\1dX*\f1uG\ea)\1bma\8fhP\1d\9b\bcbJa\e92*\cb\cfq\e4\fd\e7\1f\0c\17\027\ca\0e\13\12\8dw\95G\02\ff\18H\ce\b8\fbZbl\eda@\1a\9f\19\a9\17\e0>\ff\b8\a6\5c\93\11\97\07\f5S\ea,.\87\ec$\08\7fklB\beV)v~|x\db\bf\9a5\c9\07\a6n\b7\c4\ec/\db\81\12+\05f\8b\7f:\feKSO\fb/\03T\e9\18=$(g@\b0\8a\98S\d6\c8\d4Bn\89Ps\daUhE\00\baJ\0az\a0R*\a5d{W\1eU\07m|\9fkrs\1dw2\02S\ef\0c\bd\b9\0a\0c\1d5Wq\8f\ca\84TP\cb\a1\13\12\89A\1e\f16r6XJ\0d\00UG\98G\f0\ef\18\134\0a\a85\1eO>6\1fw\058\0f\8c\ba`$\b5\c95\95\f5\810^\87\eacx\9e\e2rL\ban`\0e\12\837Og\b75\87\b8\ba3\e9g\eb|O!\02@\ab\e0!t\8e\ccfTmv\09-\1ajrg\01\ea\dd\06o\c9\f89\94\0a\c5\11\1e\1f5x\ff\93}\0e\11\aa0\041\a8v\16\f0\ca\efD\cec;\10\86\ef\0e^\e1\ba\08X\1e/\dd#\a4>M\14\002\0e\10vy\ea#\c8\f3\16J\95'\90@\aa\83\92YA\92\f9<\e2\e1\fe \b9\0fM:\90\f9\b0ri\9a\b9T\17\977\1e\df\1a\b32\14{\dbH&\a9\baUM\91\bc_.\e5M0\0f\11\a6R\bcZ\b5\19\c3\ef\12B\9d\dd\0c'\bb\ee2(\d4\99CF\9e\c7\ea-\ac\b9\22m\a2\fd~V\bd\e6\1f&\8dt+E\c0,\5cz\ee\8e\96<\8d\a69U6\a6F\1et~\a5\1a\22\ce\c9\15\e1)\d9w\18\bd\f2.\04\b0\c86\9a9&2\e1\b0\09ymJ\82\0b\b2\d0]P\22C\036\82\c5]T\d8y\18&\b2<\b4(\b0\aa\ab\04\e7\8a\bex\91Wg[s\9a\beF\84h\cb\1f\de\e8#;G4\02\0d\220\b6M\9bC\d9T\e91\81c\df\16\d6sV2\0c}\a9^\dd]\cd\a5l0\02\ec.j\e0\04$|A$\12K\8f`Z/\c1.\fdsZ\e1\04z\1c\07\94\04[h#&;\92\0es?\d5]\1a\0d9\81v]\d5\11)C\85&Q\e5\b2\99\1c\0f\12\c6Q\b1\cf\a8\5c\cc=X\15\a0i--3\95\061P\a6#5\7fRQh\e3?\b25s\d6\d9\02\1a\96*=W\dap|R\ed\afvp\c86:\9e\0es\09 \93\1c's\b4e$\88@\f4la\b7.r\02\15\c0S1\9f\d1J\bb\983l\1f\1cTX\11\a4\f5F\f6*B_^\f1\b1r\d2\d2\f2:S\00T\08\a1v\d8C.;\16ab\12\1aZRF\81 ;t\97W\03|G\07\85\db\87Q!'1t\82\ce\98oi\1b:\07\edd\89\09\9cd\c3,\c0\f5\aa\03>\0b\ad>\0c-\faf^\04\1e\0d\b1\e1\86A\7f\e1_\0b\e6D\12z\03\cf68\82\f6\1f_\18\e4\e3D#bS_\a1\12t7)\88\d9\0b\85\19\82Q\ff\03&*\fcZ\ccF@\b2\b5=\a0z\fem*\96\e2'7\dd\f7\1c\f3\c0\7f\0ee\0az\7f\8a\ddK%x\9c\07`\861\abs\ed\efe\7f\e1\b7Agt\964}\f0k\ad\06\a1\ad\ecj\b2\a1\e1;r:Fv\00\b2\0axc\83h}\0e\9f\09#\e6\f6\1crfR\9f5\1a\cc\03\0a\fe\da\007\8a\b4\f2\14\9a\adc\15(c\daB\0f\cetf\1c\a4\83t$\be\a6\09O\80*$\bd\b6\f7+NT\891\86]\22A\bc\ba\1dV\b3^\031\11;nf\5c5\1cD:\90\ae$\fe*\d4eO\f6\9bR\ae&\e3!\ee\96\81l\c8\92\a32`\c8\c4]`\d1\c7b\a9J\e5\19\c3K-[np\d1\05K\f8\d1\04)\9e\cc\10\88<\d5\0fK\aa\dc|\b3R\bf%\22\ea8%1\a1\f9n\c2 4\0c>\8e\bc\190|\fa%\12\a1^0\fbD\b4EX\df\d4h\98\fe\80q\b7\ff\d1\1b|\9d{r\a99\efW\145\ee_\ca\f1\04$\a7d\c3=c+\8a2}P\08U\95\fbD*+\be-e\b7\e0\b6y\f5\cc\0c\0d\d5\08\13\7fe\07\9a\1bc=\de\12 \01\e5\03\c5\cf^y\ecy\b3\22k\ab\c1\00\88\1b\8cT\0ed\ecG\9cL\bbo\b2\b9XeM\f2\a8a\cc\c8\b5\15e\0c\18\0bH7]'$\a8\8a~(-L\17\007/C\a0E\06q:\ce\aaG\14l\1d#j7\0b\15\d2\cc+9w\97\a7U\e8\87\13j|\06\1b\11\a3U\d5:\9fh\cac#k\deNx^\e89\05pd\7f\b9f#y\98_\cd=\ca?\c3x\ae30\06\03\0b\8f>S[OM\12q\0e\19\9fWJ.\05\15\a82\fe\ea\c1;l \00Dj!\c0=\0cO\ae\03\90\c8\8aB\92N\0cUYAWe1\0e\913\cc\1c\b7\1c\a2x\b4\0c\9bE\9cH\9f\e9\e2U\a2\af\e3O\83\cd\af2\1b\f0\fdf\b6\1b\01s#6z\16>[\dc5-\b3\a8H(\a6\de\15\f7\c1\ff.\d0\08~\03\f2\e5\a1\0e\a6\f5/5Hgf=EA\f1[\b8f>N\e0\c63{JV\99\0e\b6Q\00\0a\e3\d1\c29\b5wYL\c2\a0\ae\0d\83)\0dhG\c6e!\1c\e2\05s\efI\0d,\14\e3\1c>\beZ\ba\7f\7f\12\98n\b3\cc\ff\13`\0a\9eO\b0 )\22\ce\bc\fdz\16&\9fBLf\c5j\0c\18\da0C\d9G\0b\cf3u\1d\04\da\d9_\14\e2\c5\0e\f2i\ef3\aa\cf\09\15\5cI,L\1a\10\ceIb6Hc=\10`G\0d\f6oX\18\88Hm \e2\22\01R7a4\da(\f7z\a3\0b0i\9d\8d\faB\f6\0a\fdm\92U=\15R\05T\0f\b4e\b7m\12h\d5\03\99\cb\b90\14pU=\c2\88\fe%\ad\ae\d6n*\96\f4\7f\0e\ef\c3\10`{\d6\02no<\0b\de\229..8\d4}\82Q\02\1a\d0\8c(b;P\ae.\de\9a.f\eb\9c\f6+?*\88\0e\1b\ab\8e-\f8\92f\04\e9\f9\91#<\8d\b1.J\ca\c78K0\da\06\df\98\e1\17\e7W\c2{c\b8\22tr\ee\1e-9]\16\0b=\e1\19o\84V\f40\d3(\d0;4\ec\16]F\df\f2V\80\d7\a6*\e8Q\ceJU\ce\b6g\e1R}-\fd\c1#\083\f1\ef\15\0f\8bQ+'X\18\08\03~\18xJ\db\ffY\95\c7T\13\ee\1a\0f$\89\05\88h\17\19W-\e6\adu(r\ff\19\0c\f6\b3\85\131x=a\bd/\f4\12\11_\14A\18\d0\ff\5c \e8\16\07M\ec\c5oR-\16h^\c90v-\85\a7\07%V\e6#\92\b5GS\9fs\c64\a5-\8dNz\07\16\1e#\ca\bae\86\80\0a|w\c99&i\a9\ad<\96\0b\5c'\9f!R.\bewd$\e0\e6[\014\e9\a6A\f1hT:j\ec\e3iL\02\fen\f5\e6l2\dc\eb\fduB\b6\83\02\e3\01|V\9a\1b\f2\08S\15\98C\ca\af\f1~\ba\03\09\10\a1\01^3\fb'/`\18\cd9\06\ce\86\05;\13\f8.=\aa\82\81Ym\fa\cboe%E%%\8a\97w\90\c4\86U\8a{+I\9cS\d1\1d\f9m4\120\a9\b8\17;u#L\b8\e5\986\b6)\c3\13p^\ca\0d\a9N\edpL5\1f;\bc`\c8|\9e5Z#-\1c{<\fe\16L\7f\827\d6y\97\08_&Q,\e4BL\e7\c7xs\f4\5c\1c\f2-BvG\0f\f7X\0d\10O%\c0\b4G1Z\07&\16\c8\13X5-\af\13!\c0,k;\e0\e0\91;\bds\9avJ\a8\96\04\8bc\13\15\b7\e1\ce\08zQO\1c\b0\ed\aa\0co\c7g?1{\120LA|*\18\16U0}\b01k\88\b6\9fv\b7K\afS\aa\cc\ac'\f8\14j\049\83\85MA\d5\0bN\b4u2\01\85jMF\b5\c9hj\b2\8c~\00\ccyD\1f\c2\d9\b7\0f\03\b9bC&\81j5\8a\ed\0fE\f6\e6\a49\e6\ad\d5pk\ce\a1\00\b6\9b\ecj1Vlu\f61\b5\15\e4J\00\0c\ab\a7\bb\11\a6\1f`\22\a1\be\9a\02\dc\22\ceA\f2`\dcLX\a0i\0bZ\d3\ff,z\17|C\c7g\d1J\04\a0\acTr,\e6G\e0}&{Fu\b8\22&\a2\18I\97\c9\d5N\fb>!\0d\d8.\97I\d0L[\1c\bd\18\d9\1c\dc\e7\f9\0cU\b7\a8bH\06\e9a\d2\ce\9eF!1\ed\01\b3\d4\8ab\88j\8b1G\b2W7\a9\06@xl\b5\8b=.`-(O&\a0\1a\0et&@_\b6\99\1dA\87|gf\14\90K\0a^U/\bc\9e\f8*.|a\16\e7\80#q.\cb\der\0e\fa\87\11AT#\1eUm\f7;\a5\c3]`E\f4\cfr-\9c\8e\05u\10\b9|\8bi\88\15\09\84\88\12\ca\c7a_\86\a8\a9\22\dbR'Y\eb\f8NaD\c1\82?d\bd\b2\0a2\ab\a6\18\8c\c7k!\d0r>H`\0b\d4@?\9c\f6\03\de\e6d\08\bf\c1m^\e8\a26|E\fb\f4S\ca\1f\c3\0d7\c9\d6\16swVj\b1\a0\e6~xPS~\81q\de{\f2\f4\09\1d4\efK)&5<\5c7\e9\d9\0fc\ba*\1c\9bE\f5X\c3Rb%\b8'\22Xe\0dW8I\fb\0bH\e5\c3\b0]P\06\a6\19\8d\bc\8e\07\efG9p\82\b1L2\19\84\fa(\ca\9a`I\e3\bc sX \f1,.X\13T\a2~\8eQ@\c3')\ff\caQ\1cl\9eQ_w\8c\fe?\dd\b1\b6$\1d?8^\f0\dcQ>\22\ad\abx\0f4B{$\cc\9dg\95$\02cG\1d\1c\0b\87\86\c8\03\16\96\e0^\0ap~0?\ae\ea[<\cb\1c;Sk\8ax%r\9b9\d7\10\12\14\e1'\19\00\14\ba\d4)<\1eiL\fa\ab\13)\deT5s\8c$\0ffS\cc\04V\0d\adHG\0f\d6[\18\93\8f,\7f\0cx\9ac\f2\92|\0b\0b\1c+?\e9)Q\08\94\11\0b]\fb\f8|}\0c\d7\fc\00\01\b0\5c<\1f\c5\1ae\a1\fb\fec\1e\ef\94\1a\a7K\e3h\b8\91\dfB.#\d7\15\e6\f9\cdD\f4\5c\fc}u@\f3 \0bli~\ccm\0e\12\7f\b0qQ\1f&>(\08\8cw^\d2\1b\fcI\fezs\1b\95\b0\86D\b3C\15J\0b(\bcb\a4\86\e2\5c\ae\ef(s\17\a0VF\96\19_h\01\bc-I\00\ca\a7N*+jE\94KZH")) diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/input.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/input.c new file mode 100644 index 0000000..ee897ff --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/input.c @@ -0,0 +1,1206 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +const char *quicksort_input_string[681] = {"Kurt", + "Vonneguts", + "Commencement", + "Address", + "at", + "MIT", + "Ladies", + "and", + "gentlemen", + "of", + "the", + "class", + "of", + "97", + "Wear", + "sunscreen", + "If", + "I", + "could", + "offer", + "you", + "only", + "one", + "tip", + "for", + "the", + "future", + "sunscreen", + "would", + "be", + "it", + "The", + "longterm", + "benefits", + "of", + "sunscreen", + "have", + "been", + "proved", + "by", + "scientists", + "whereas", + "the", + "rest", + "of", + "my", + "advice", + "has", + "no", + "basis", + "more", + "reliable", + "than", + "my", + "own", + "meandering", + "experience", + "I", + "will", + "dispense", + "this", + "advice", + "now", + "Enjoy", + "the", + "power", + "and", + "beauty", + "of", + "your", + "youth", + "Oh", + "never", + "mind", + "You", + "will", + "not", + "understand", + "the", + "power", + "and", + "beauty", + "of", + "your", + "youth", + "until", + "theyve", + "faded", + "But", + "trust", + "me", + "in", + "20", + "years", + "youll", + "look", + "back", + "at", + "photos", + "of", + "yourself", + "and", + "recall", + "in", + "a", + "way", + "you", + "cant", + "grasp", + "now", + "how", + "much", + "possibility", + "lay", + "before", + "you", + "and", + "how", + "fabulous", + "you", + "really", + "looked", + "You", + "are", + "not", + "as", + "fat", + "as", + "you", + "imagine", + "Dont", + "worry", + "about", + "the", + "future", + "Or", + "worry", + "but", + "know", + "that", + "worrying", + "is", + "as", + "effective", + "as", + "trying", + "to", + "solve", + "an", + "algebra", + "equation", + "by", + "chewing", + "bubble", + "gum", + "The", + "real", + "troubles", + "in", + "your", + "life", + "are", + "apt", + "to", + "be", + "things", + "that", + "never", + "crossed", + "your", + "worried", + "mind", + "the", + "kind", + "that", + "blindside", + "you", + "at", + "4", + "pm", + "on", + "some", + "idle", + "Tuesday", + "Do", + "one", + "thing", + "every", + "day", + "that", + "scares", + "you", + "Sing", + "Dont", + "be", + "reckless", + "with", + "other", + "peoples", + "hearts", + "Dont", + "put", + "up", + "with", + "people", + "who", + "are", + "reckless", + "with", + "yours", + "Floss", + "Dont", + "waste", + "your", + "time", + "on", + "jealousy", + "Sometimes", + "youre", + "ahead", + "sometimes", + "youre", + "behind", + "The", + "race", + "is", + "long", + "and", + "in", + "the", + "end", + "its", + "only", + "with", + "yourself", + "Remember", + "compliments", + "you", + "receive", + "Forget", + "the", + "insults", + "If", + "you", + "succeed", + "in", + "doing", + "this", + "tell", + "me", + "how", + "Keep", + "your", + "old", + "love", + "letters", + "Throw", + "away", + "your", + "old", + "bank", + "statements", + "Stretch", + "Dont", + "feel", + "guilty", + "if", + "you", + "dont", + "know", + "what", + "you", + "want", + "to", + "do", + "with", + "your", + "life", + "The", + "most", + "interesting", + "people", + "I", + "know", + "didnt", + "know", + "at", + "22", + "what", + "they", + "wanted", + "to", + "do", + "with", + "their", + "lives", + "Some", + "of", + "the", + "most", + "interesting", + "40yearolds", + "I", + "know", + "still", + "dont", + "Get", + "plenty", + "of", + "calcium", + "Be", + "kind", + "to", + "your", + "knees", + "Youll", + "miss", + "them", + "when", + "theyre", + "gone", + "Maybe", + "youll", + "marry", + "maybe", + "you", + "wont", + "Maybe", + "youll", + "have", + "children", + "maybe", + "you", + "wont", + "Maybe", + "youll", + "divorce", + "at", + "40", + "maybe", + "youll", + "dance", + "the", + "funky", + "chicken", + "on", + "your", + "75th", + "wedding", + "anniversary", + "Whatever", + "you", + "do", + "dont", + "congratulate", + "yourself", + "too", + "much", + "or", + "berate", + "yourself", + "either", + "Your", + "choices", + "are", + "half", + "chance", + "So", + "are", + "everybody", + "elses", + "Enjoy", + "your", + "body", + "Use", + "it", + "every", + "way", + "you", + "can", + "Dont", + "be", + "afraid", + "of", + "it", + "or", + "of", + "what", + "other", + "people", + "think", + "of", + "it", + "Its", + "the", + "greatest", + "instrument", + "youll", + "ever", + "own", + "Dance", + "even", + "if", + "you", + "have", + "nowhere", + "to", + "do", + "it", + "but", + "your", + "living", + "room", + "Read", + "the", + "directions", + "even", + "if", + "you", + "dont", + "follow", + "them", + "Do", + "not", + "read", + "beauty", + "magazines", + "They", + "will", + "only", + "make", + "you", + "feel", + "ugly", + "Get", + "to", + "know", + "your", + "parents", + "You", + "never", + "know", + "when", + "theyll", + "be", + "gone", + "for", + "good", + "Be", + "nice", + "to", + "your", + "siblings", + "Theyre", + "your", + "best", + "link", + "to", + "your", + "past", + "and", + "the", + "people", + "most", + "likely", + "to", + "stick", + "with", + "you", + "in", + "the", + "future", + "Understand", + "that", + "friends", + "come", + "and", + "go", + "but", + "with", + "a", + "precious", + "few", + "you", + "should", + "hold", + "on", + "Work", + "hard", + "to", + "bridge", + "the", + "gaps", + "in", + "geography", + "and", + "lifestyle", + "because", + "the", + "older", + "you", + "get", + "the", + "more", + "you", + "need", + "the", + "people", + "who", + "knew", + "you", + "when", + "you", + "were", + "young", + "Live", + "in", + "New", + "York", + "City", + "once", + "but", + "leave", + "before", + "it", + "makes", + "you", + "hard", + "Live", + "in", + "Northern", + "California", + "once", + "but", + "leave", + "before", + "it", + "makes", + "you", + "soft", + "Travel", + "Accept", + "certain", + "inalienable", + "truths", + "Prices", + "will", + "rise", + "Politicians", + "will", + "philander", + "You", + "too", + "will", + "get", + "old", + "And", + "when", + "you", + "do", + "youll", + "fantasize", + "that", + "when", + "you", + "were", + "young", + "prices", + "were", + "reasonable", + "politicians", + "were", + "noble", + "and", + "children", + "respected", + "their", + "elders", + "Respect", + "your", + "elders", + "Dont", + "expect", + "anyone", + "else", + "to", + "support", + "you", + "Maybe", + "you", + "have", + "a", + "trust", + "fund", + "Maybe", + "youll", + "have", + "a", + "wealthy", + "spouse", + "But", + "you", + "never", + "know", + "when", + "either", + "one", + "might", + "run", + "out", + "Dont", + "mess", + "too", + "much", + "with", + "your", + "hair", + "or", + "by", + "the", + "time", + "youre", + "40", + "it", + "will", + "look", + "85", + "Be", + "careful", + "whose", + "advice", + "you", + "buy", + "but", + "be", + "patient", + "with", + "those", + "who", + "supply", + "it", + "Advice", + "is", + "a", + "form", + "of", + "nostalgia", + "Dispensing", + "it", + "is", + "a", + "way", + "of", + "fishing", + "the", + "past", + "from", + "the", + "disposal", + "wiping", + "it", + "off", + "painting", + "over", + "the", + "ugly", + "parts", + "and", + "recycling", + "it", + "for", + "more", + "than", + "its", + "worth", + "But", + "trust", + "me", + "on", + "the", + "sunscreen"}; + +unsigned int quicksort_input_vector[3000] = { + 1681692777, 846930886, 1804289383, 424238335, 1957747793, 1714636915, + 596516649, 1649760492, 719885386, 1350490027, 1025202362, 1189641421, + 2044897763, 1102520059, 783368690, 1540383426, 1365180540, 1967513926, + 35005211, 1303455736, 304089172, 1726956429, 294702567, 521595368, + 278722862, 861021530, 336465782, 468703135, 2145174067, 233665123, + 1315634022, 1801979802, 1101513929, 1125898167, 1369133069, 635723058, + 628175011, 2089018456, 1059961393, 1653377373, 1131176229, 1656478042, + 608413784, 1914544919, 859484421, 1973594324, 1734575198, 756898537, + 1129566413, 2038664370, 149798315, 1424268980, 412776091, 184803526, + 137806862, 749241873, 1911759956, 135497281, 982906996, 42999170, + 1937477084, 2084420925, 511702305, 1159126505, 572660336, 1827336327, + 1100661313, 1632621729, 805750846, 84353895, 1141616124, 1433925857, + 1998898814, 2001100545, 939819582, 1585990364, 610515434, 1548233367, + 1477171087, 760313750, 1374344043, 1889947178, 945117276, 356426808, + 491705403, 709393584, 1780695788, 1474612399, 752392754, 1918502651, + 1411549676, 1264095060, 2053999932, 1984210012, 943947739, 1843993368, + 1469348094, 1749698586, 855636226, 463480570, 1036140795, 1956297539, + 317097467, 1975960378, 2040651434, 927612902, 1376710097, 1892066601, + 1687926652, 603570492, 1330573317, 485560280, 959997301, 660260756, + 1194953865, 593209441, 402724286, 1947346619, 364228444, 894429689, + 1063958031, 270744729, 221558440, 2007905771, 2114738097, 1633108117, + 1610120709, 822890675, 1469834481, 498777856, 631704567, 791698927, + 327254586, 524872353, 1255179497, 1703964683, 269455306, 1572276965, + 160051528, 1600028624, 352406219, 1120048829, 112805732, 2040332871, + 1713258270, 515530019, 378409503, 2077486715, 1409959708, 1573363368, + 200747796, 1631518149, 1373226340, 168002245, 1117142618, 289700723, + 990892921, 439493451, 150122846, 1622597488, 1231192379, 1760243555, + 2147469841, 338888228, 111537764, 269441500, 1911165193, 438792350, + 1869470124, 116087764, 2142757034, 1982275856, 8936987, 155324914, + 350322227, 387346491, 1275373743, 1760281936, 1960709859, 841148365, + 1244316437, 1186452551, 771151432, 213975407, 1476153275, 971899228, + 653468858, 1626276121, 1139901474, 1884661237, 1239036029, 2130794395, + 76065818, 1350573793, 1605908235, 1987231011, 1789366143, 1605894428, + 2103318776, 1784639529, 1875335928, 2112255763, 1939964443, 1597322404, + 352118606, 1067854538, 1432114613, 165344818, 1909002904, 1782436840, + 1351797369, 532670688, 1395235128, 680466996, 1504569917, 492067917, + 159259470, 496987743, 706043324, 1398295499, 480298490, 1359512183, + 601385644, 2086206725, 1096689772, 243268139, 1544617505, 1172755590, + 2027907669, 1272469786, 1012502954, 1820388464, 722308542, 968338082, + 740759355, 6939507, 933110197, 502278611, 1789376348, 1285228804, + 1034949299, 1037127828, 1450573622, 392035568, 1529195746, 654887343, + 889023311, 87755422, 1335354340, 1369321801, 1447267605, 1494613810, + 1308044878, 396473730, 745425661, 705178736, 1569229320, 1346811305, + 1977648522, 434248626, 1590079444, 552473416, 1402586708, 1470503465, + 559412924, 188213258, 1143408282, 201305624, 1473442062, 1884167637, + 1238433452, 776532036, 238962600, 620145550, 1431419379, 1273911899, + 707900973, 619290071, 1665947468, 7684930, 2113903881, 407487131, + 404158660, 711845894, 1776808933, 1973387981, 2058657199, 937370163, + 260152959, 1501252996, 1642548899, 1662739668, 824272813, 1472713773, + 1850952926, 1967681095, 2025187190, 1176911340, 1704365084, 437116466, + 1953443376, 1943327684, 638422090, 1237379107, 1069755936, 1876855542, + 1856669179, 588219756, 349517445, 1823089412, 995706887, 1057418418, + 387451659, 625032172, 1065103348, 298625210, 1562402336, 1469262009, + 1799878206, 1057467587, 1295166342, 476667372, 382697713, 1555319301, + 296864819, 260401255, 1070575321, 2001229904, 697517721, 774044599, + 1797073940, 1335939811, 1950955939, 719346228, 1065311705, 1756915667, + 1307565984, 1414829150, 846811127, 155789224, 324763920, 555996658, + 780821396, 1389867269, 231602422, 195740084, 711645630, 619054081, + 1253207672, 2006811972, 917679292, 1635905385, 1414647625, 570073850, + 1896306640, 337739299, 1046741222, 446340713, 1111783898, 1343606042, + 1782280524, 915256190, 1197352298, 700108581, 524688209, 846942590, + 2114937732, 1371499336, 1566288819, 292218004, 1927495994, 726371155, + 1682085273, 11614769, 882160379, 246247255, 630668850, 1662981776, + 105575579, 1548348142, 1858721860, 1520223205, 2118421993, 964445884, + 1857962504, 1017679567, 452867621, 822262754, 213801961, 201690613, + 1737518944, 1411154259, 648031326, 114723506, 110613202, 282828202, + 1486222842, 1676902021, 982936784, 1266235189, 255789528, 950390868, + 1277849958, 1137949908, 1242608872, 1908518808, 653448036, 777210498, + 1309383303, 364686248, 1023457753, 1280321648, 1329132133, 1129033333, + 150517567, 1781999754, 501772890, 364319529, 1983690368, 212251746, + 1775473788, 484238046, 1034514500, 1886086990, 767066249, 624549797, + 1415505363, 1750003033, 739273303, 1671294892, 552910253, 78012497, + 661761152, 1795519125, 1344247686, 1315209188, 425245975, 474613996, + 1679895436, 1448703729, 235649157, 861543921, 430253414, 1545032460, + 496060028, 932026304, 677870460, 332266748, 1144278050, 828388027, + 816504794, 31308902, 1192707556, 1583571043, 655858699, 820697697, + 1186090428, 1395132002, 559301039, 1739000681, 1473144500, 1974806403, + 1387036159, 669908538, 1498617647, 1812282134, 1144522535, 12895151, + 1113502215, 1380171692, 1328104339, 1543755629, 777720504, 860516127, + 328298285, 1455590964, 1722060049, 1472576335, 136495343, 70636429, + 1503885238, 1329202900, 402903177, 12260289, 2416949, 1219407971, + 1407392292, 561717988, 655495367, 733053144, 389040743, 1841585795, + 1402961682, 1887658390, 1433102829, 400000569, 1900553541, 672655340, + 1780172261, 1081174232, 337453826, 410409117, 1941690360, 1450956042, + 1866000081, 1516266761, 847228023, 2002495425, 1586903190, 1175526309, + 1184214677, 1989806367, 500618996, 1186631626, 1061730690, 2004504234, + 1748349614, 1717226057, 2016764524, 2137390358, 1411328205, 1276673168, + 1877565100, 696947386, 2009726312, 1630634994, 1369602726, 1265204346, + 564325578, 1707056552, 1665204916, 358532290, 1010528946, 1297893529, + 1874799051, 1857756970, 1708302647, 1314218593, 885799631, 1426819080, + 1156541312, 1386418627, 1281830857, 70788355, 1243439214, 318561886, + 1788014412, 1112720090, 1505193512, 1051858969, 241909610, 1106059479, + 1748806355, 104152274, 1095966189, 970925433, 1369356620, 826047641, + 530498338, 887077888, 309198987, 1541027284, 37487770, 873524566, + 1251300606, 1745790417, 1232056856, 2137100237, 1025125849, 959372260, + 1376035217, 159473059, 126107205, 471990783, 478034945, 1282648518, + 1584710873, 1983228458, 1353436873, 1826620483, 941804289, 993967637, + 1930772757, 2037770478, 2045826607, 1152645729, 716334471, 1647149314, + 2039723618, 1025533459, 470591100, 2077211388, 1899058025, 1001089438, + 1675518157, 983631233, 394633074, 553160358, 1943003493, 1645933681, + 712633417, 2069110699, 1635550270, 1190668363, 1204275569, 864101839, + 1026413173, 410228794, 1336092622, 1968217462, 1404196431, 773319847, + 1858504292, 1302539390, 452456682, 427355115, 802205057, 235745791, + 1452888574, 1272796157, 1388391521, 1204462951, 126401947, 1280631491, + 40610537, 521035021, 1210359231, 1983614030, 19485054, 738393740, + 1905241081, 1655035325, 1291554098, 962033002, 371653516, 2004187516, + 1372261796, 1707746139, 1047372231, 628974580, 333582338, 2073785404, + 1931513970, 786039021, 1894519218, 586235379, 1021784812, 1605539862, + 1859031536, 262692685, 2032894977, 1985433483, 1543324176, 1338299904, + 358984857, 606199759, 395279207, 378469911, 1344593499, 435889744, + 2033505236, 488663950, 272020127, 257675105, 345367818, 29777560, + 1965421244, 1392740049, 991810563, 151519934, 1319041805, 216588711, + 937558955, 1066077375, 845563291, 1959343768, 524133589, 629593614, + 74552805, 409544918, 1215828993, 1617876982, 1747844822, 927376882, + 76593093, 2143124030, 765326717, 1421186593, 431530126, 1124311574, + 1909850543, 703550253, 1502781486, 107734713, 733327814, 1388803074, + 1500474762, 1725138377, 1646478179, 672032919, 1941727088, 1464415775, + 1738110294, 639806732, 1615935710, 114760235, 1269400346, 406011017, + 524305153, 337745691, 217871137, 124666328, 1265122573, 292423943, + 120306710, 2030449291, 1910300925, 551836836, 1007277217, 1986894018, + 1255387090, 362575055, 1260596963, 1988714904, 1751378130, 1022963858, + 1566369633, 1250372661, 1130698571, 1360613073, 567304789, 483689685, + 2000419805, 35756851, 1155722604, 1122336503, 441767868, 746349250, + 1460082195, 659639006, 861109485, 577721120, 952062949, 1385414639, + 460686763, 714880226, 1510080967, 1467963981, 554290596, 1630387677, + 1830539036, 1814887560, 34740865, 1434433518, 690367770, 1290127955, + 537322532, 1821066342, 1131359211, 1104627321, 157272379, 550245196, + 1140384172, 1312994984, 1910858270, 1582152040, 2059344234, 1763794427, + 94307398, 772970072, 738647283, 1046370347, 10901063, 51245830, + 1761250573, 1520982030, 628966950, 168057522, 1003886059, 1089653714, + 1982945082, 1038626924, 410134047, 525829204, 181271232, 93189435, + 199411898, 1312630443, 1527622954, 356684278, 1862875640, 2064945486, + 1669679262, 1626250262, 1022089159, 1581539848, 1242561041, 14989683, + 207026272, 1981208324, 1597141723, 217927335, 2032454154, 1691449122, + 1738909365, 513937457, 590335821, 595311776, 1603591171, 204102747, + 1633938701, 2013725218, 372160269, 1815209933, 2106914653, 207621703, + 980356728, 1487053959, 733450907, 695748720, 1404515797, 932862806, + 174515334, 279121308, 1289547084, 1417076376, 294110991, 811742698, + 1250801052, 1891252715, 245798898, 1135771559, 1435218189, 452825171, + 1649709016, 2025554010, 670752506, 1105816539, 82173109, 262178224, + 972058109, 454333378, 857490000, 931489114, 661955081, 343945053, + 271059426, 1395405989, 11671338, 1675575223, 180785147, 992028067, + 1954696532, 1470332231, 1687776787, 101323875, 134591281, 1862292122, + 1992576590, 380390179, 1131884850, 1280311131, 833215350, 235202254, + 1158381494, 1503967857, 1370973813, 1240554603, 1766146081, 873199181, + 1694887982, 476152433, 1979015720, 209359415, 820097487, 803590181, + 1604765404, 831768825, 1735079296, 1785550551, 1823796892, 2006138722, + 1108399134, 1364090032, 1534230297, 1242990415, 1078898506, 1341443181, + 1623380595, 63299708, 1442767057, 309112297, 298501962, 1287859999, + 1813080154, 1669475776, 420687483, 1431742587, 395191309, 1579068977, + 1907895021, 226723382, 672139932, 580508860, 1030313563, 219544266, + 1412277685, 617909211, 428903682, 1088590930, 476564285, 2033669086, + 305197314, 2010794583, 1671735990, 1384095820, 1204754116, 632651476, + 1447395528, 500037525, 1875641892, 1745897490, 1787897525, 1351538839, + 1267889618, 61101360, 1660651136, 1663080928, 1640170337, 1326247643, + 1889804310, 164826621, 610506582, 772634225, 384370888, 370917955, + 1390543437, 813274570, 951426815, 1867107722, 699460008, 216220853, + 1730418657, 223712350, 1304811783, 787689126, 856363827, 1610009097, + 1287726651, 584522071, 846621269, 928140528, 1936060910, 146533149, + 989241888, 1449228398, 1892430639, 481928577, 627992393, 1012836610, + 646755199, 1238498976, 528433890, 1031126087, 1609416931, 270754552, + 1844400657, 413360099, 1043388777, 396377017, 629580952, 286448566, + 620089368, 1934392735, 6072641, 1476453195, 1396918184, 1736491298, + 2060975266, 96055805, 376696776, 1849552528, 242588954, 1664423428, + 1151297278, 2135019593, 445080308, 1779289672, 1000372555, 1434322197, + 870305000, 1528806445, 1916250774, 332238283, 1799560997, 415522325, + 745598382, 695466127, 1446648412, 1375179334, 981914693, 1143565421, + 1162088421, 987987334, 1539942439, 411522957, 576994985, 12548159, + 507578762, 953691761, 1489001354, 750167716, 470631541, 1402492972, + 737703662, 915711850, 1104561852, 1738076217, 202550399, 108375482, + 1119399015, 2118801173, 1887665154, 771476364, 386839851, 610486506, + 1466942491, 1833488263, 942724790, 301373537, 829570037, 1688323172, + 1289360871, 222028828, 916018859, 1866355856, 234576987, 2078107280, + 672563970, 1723578341, 342146590, 1143195511, 978587665, 849725352, + 2058907361, 2083149517, 1599893069, 113974112, 44041351, 190113083, + 85291638, 1931706506, 1928189300, 472131489, 394709364, 900104667, + 158136104, 1337434154, 1671581032, 987706141, 878273679, 991039875, + 1209734969, 1794292538, 1292413412, 1444311956, 1724916170, 434290636, + 1020406649, 2067062760, 153162844, 1998994314, 769304465, 825726814, + 1934660183, 221713886, 1968922326, 1978701535, 411826969, 1880346039, + 1762924393, 192532621, 1994320152, 10150109, 1092637289, 2079611790, + 1347584264, 616734673, 404259631, 78374295, 1607774548, 562395735, + 1872666833, 752704313, 1550101877, 1450099355, 1186994949, 612353198, + 1369678468, 1340157793, 2056665155, 2138982933, 18400960, 929588156, + 213213171, 1987323286, 781098823, 625040140, 1720185677, 568275358, + 817572761, 1567022181, 399493245, 1910210050, 1499150323, 14933990, + 379461075, 1903409954, 25084100, 1987235624, 318322042, 1372668364, + 592456289, 1868423919, 1451042659, 1779451238, 333293469, 1176225844, + 972125383, 242474976, 478841551, 990526343, 1172063133, 1848520019, + 830365981, 1953161956, 1840019304, 403068011, 373953666, 2053232475, + 1970090192, 773446912, 530788967, 1321756868, 788380902, 1348361729, + 1077683174, 813465002, 1111088131, 1396005216, 38649718, 1490549207, + 1116945487, 1489692377, 1330301183, 1450238957, 518434573, 1922757472, + 1692713933, 997276125, 1554725062, 717293418, 698312496, 379366797, + 522971726, 390848153, 1369893141, 896925393, 296596980, 52775474, + 1670372305, 827385948, 455843485, 311269559, 28264029, 278450030, + 1124734562, 1139352160, 1600206898, 1163384280, 482417719, 530406424, + 505593010, 1812718902, 1926411641, 1024027583, 1587992726, 895873480, + 2021303708, 995234140, 198628789, 572132557, 1374600938, 1891342723, + 962980710, 597010431, 461152493, 1259577690, 649785905, 984124220, + 2086963638, 1105629391, 1881049613, 2115227667, 1384079421, 1403938270, + 1107096180, 836802671, 1715207829, 1589513899, 1367209095, 692458743, + 1254749154, 1146137088, 1855843024, 695258232, 2042010569, 213952386, + 1690492373, 93155710, 1237979969, 917609663, 1984498433, 1111800030, + 1514620094, 298167279, 1683932587, 16922351, 1282291499, 499429649, + 1122551742, 1015857464, 1759007339, 359147515, 272312086, 1698487330, + 1195950186, 1987519915, 1666231349, 415675634, 532495011, 625843881, + 1561812722, 240854387, 67874133, 1456339643, 454806773, 1322623287, + 1549495354, 1692786742, 2017881519, 1386510139, 657103124, 1560890244, + 1684677418, 193552063, 331016259, 819485269, 692981712, 1845636353, + 1835342733, 304505404, 1862558705, 2107654819, 2002992734, 837626799, + 1947691087, 1521740435, 1196774315, 332702450, 100669, 245240853, + 573556837, 67974802, 660916487, 1028363610, 1390598089, 75245562, + 573666704, 1260995960, 1531585205, 1230769829, 674402557, 933596911, + 1424321892, 1005418816, 172623403, 2117303605, 703571522, 1857300821, + 274325361, 418646579, 529302443, 129834447, 1256273378, 217161528, + 1651574882, 305564045, 177332700, 1651675551, 550804899, 2125023787, + 1719650353, 1211721386, 310242589, 962764794, 1286966948, 883799426, + 76277107, 671068506, 1912163036, 750679664, 1604665417, 338346092, + 1756098480, 1777288820, 1569115921, 312186354, 1487105994, 845954166, + 730832933, 2016408437, 815774123, 1987106312, 86086317, 1090099484, + 145186709, 263419017, 1219933931, 695991608, 240959156, 724025165, + 1907712995, 551201745, 228217069, 1047196295, 1435001171, 1947867422, + 1718264801, 1199680559, 763148569, 1175446571, 1538026652, 839425676, + 805251743, 959658925, 1590105340, 144874089, 1805613091, 1198720172, + 13798878, 473903566, 1510906527, 99885196, 1564003050, 94255812, + 363304213, 636453333, 2081362124, 604263370, 1360478499, 79065186, + 1155465115, 1588695568, 775056794, 442982639, 1389079342, 535286141, + 1642663198, 4744263, 1582482437, 1033206202, 844169939, 1153263590, + 1992865128, 286791631, 181226513, 1650994571, 1485511804, 986478257, + 2124898138, 848934683, 1131352346, 1541417540, 943190495, 1145151225, + 30387226, 877068972, 1245036421, 1390865725, 956134158, 1608340634, + 832077645, 1731190952, 65120356, 73673339, 118993446, 1220585472, + 78417603, 1701475883, 1663568111, 922587542, 707255825, 1158747661, + 1209379174, 888482339, 44470216, 547407330, 1874960596, 2037335344, + 1396342013, 858829294, 1540846267, 192048860, 2003980519, 1518260757, + 1069117832, 1101533292, 912194650, 2025251990, 562390279, 942581876, + 1608959295, 627510635, 185963953, 1727952741, 1848096107, 1018041598, + 1281944976, 1364180570, 1091714937, 1989200801, 375444584, 1170132540, + 730199492, 419914800, 2092720083, 457676440, 309766496, 1154615609, + 1316505735, 1850612763, 1702022939, 1173002606, 1221389873, 950881304, + 127052251, 2133584523, 1142930164, 689442530, 928682751, 64564349, + 1316953165, 1114646704, 2089816339, 1017565625, 2132688302, 1551291986, + 234262547, 1076919591, 1131761079, 609707131, 99568484, 266222407, + 1029621931, 44804919, 107939561, 1339388427, 1199420528, 838139053, + 1042517543, 753959819, 1295815494, 116423768, 1704841123, 464837581, + 102524643, 700287639, 1637840187, 1031207394, 764851988, 1764892438, + 2145854098, 707184680, 306851320, 2131058752, 110993018, 1623804486, + 1060494695, 1242754098, 493886463, 1160063179, 1508976505, 728149010, + 1204868098, 1616916066, 1337856142, 256804978, 307571472, 219994425, + 1010764797, 1603386966, 1559382853, 568122272, 2068224547, 454416748, + 1268409912, 1558581086, 570840516, 2033261900, 1175989877, 673365159, + 592962932, 1482841197, 1704572553, 703955951, 959162035, 1702943003, + 1946710049, 1453048498, 1686518107, 1308202906, 33713861, 599529154, + 777635325, 1371570003, 1759592334, 1085206797, 1591564428, 816976784, + 541110115, 1003463633, 1073781763, 461851014, 1457880381, 2084546560, + 2020432100, 2028720897, 505185185, 1048938329, 554602408, 1773595097, + 384295879, 111691313, 1659373349, 1343457914, 1814634316, 104852634, + 649022765, 1353668775, 808808585, 682736626, 1953197930, 608034986, + 2054306629, 1565306616, 1916237892, 1498387409, 234799752, 546389569, + 354367395, 1308581515, 1631596366, 1812247776, 1245644428, 25222833, + 1693485026, 1750829613, 487073847, 100603786, 1376941062, 360022300, + 212295100, 888830763, 1408960629, 2026929416, 993683397, 1793256508, + 1233114544, 1802491982, 989230775, 1038828826, 263043320, 1638253540, + 456651794, 31797565, 173506518, 691451546, 578187134, 80329499, + 2000033062, 62299853, 1578716908, 1098193842, 87522686, 1933084303, + 701539807, 574596534, 1597848432, 2078480869, 934618834, 1143849810, + 819827984, 196095815, 1244453596, 1813511382, 1989352324, 1456748696, + 1468519716, 831099451, 1336194465, 1731563037, 321869343, 421825361, + 1763360602, 495375861, 1460654187, 194064088, 575705360, 1917305981, + 256363941, 6938620, 461273879, 343886628, 1940022924, 313823293, + 918483162, 1390387708, 1412017135, 1853101996, 386753870, 2113556942, + 2049197811, 1631207466, 2044554163, 1891066487, 940472515, 716898500, + 574682290, 129183332, 382926234, 896551633, 551008693, 1851445950, + 1391927494, 2011662880, 1435525339, 1967632854, 1781485213, 1051402293, + 1974571475, 95275444, 1245466382, 1767110751, 409098738, 1501830323, + 1010014811, 1821115873, 1845716951, 1396768681, 1787189168, 616716465, + 880492499, 1684259683, 322334813, 1820965014, 253674535, 224048977, + 1950148346, 636600769, 2115115464, 353673391, 340563072, 542314107, + 217852623, 1776088411, 1438865740, 1999337836, 680007057, 683309587, + 2094613281, 1925473439, 503458793, 356228371, 1279820114, 330546620, + 29860596, 978053418, 2097657371, 1817049764, 1594769883, 960188534, + 1353825800, 1917104697, 209473567, 1607500335, 2141153674, 1089966067, + 96617457, 2108785490, 763447433, 437180529, 503615949, 566112132, + 65785292, 1942481690, 919785523, 745792349, 478307629, 1137638147, + 523782140, 981766422, 989492335, 1803602255, 1312313043, 936621968, + 634172025, 1262486766, 1292850339, 81458260, 75191653, 1322710936, + 1998562957, 284665220, 992277052, 1992232983, 1374631287, 198619204, + 1953534826, 2138078721, 1806119540, 309667127, 556707205, 1902736997, + 104665169, 1476492728, 192433878, 582972798, 466647227, 258219170, + 1564739221, 1456139563, 1004011520, 729568616, 245277883, 1527793660, + 1992055382, 1538128223, 1183912267, 2067247035, 713355511, 1818084292, + 204428608, 1705632563, 1899542553, 1579059895, 1904251768, 1750621862, + 1569654968, 1562887660, 1595371198, 2126362173, 1318141009, 1401422376, + 1455371254, 1510574887, 1711089503, 1922018481, 1768794057, 1815754673, + 1230674396, 625321929, 251243823, 1475952280, 5631942, 1815983044, + 866596855, 1189544209, 398068012, 1579952366, 860144854, 242639747, + 1138101281, 612203759, 162403134, 894869401, 215341973, 366831742, + 310273413, 1810713171, 1945891638, 1628414422, 1064651899, 1368062958, + 991505661, 628257755, 1346941484, 612816071, 296528780, 654829090, + 1238138000, 547772603, 429363923, 1243769942, 216272000, 1660038320, + 285830504, 614340012, 988506952, 1145975358, 856979759, 1855103807, + 1758179117, 1019382894, 1287572525, 1973521090, 1386214636, 278190158, + 1636750614, 1184622626, 1173059560, 553918865, 405201937, 1483332973, + 1182176620, 1752143421, 964263748, 1478705400, 259488863, 1955769409, + 2026478004, 688852786, 421101832, 95266356, 201407458, 1659239833, + 709606368, 1189914410, 755526127, 1566586128, 897534569, 1041356631, + 438485374, 37623446, 39848341, 1824700010, 315813605, 1798027458, + 861838989, 1488873165, 1624064901, 1267040926, 824722490, 1113331867, + 871700699, 1788986238, 1667250732, 1131189562, 1597272000, 701943705, + 1820042348, 2018373832, 33165457, 2021449807, 1530130017, 2059643461, + 1063880569, 138172497, 7426169, 1961415139, 1179529128, 717032538, + 1999038585, 1219377470, 136135018, 167368542, 869921280, 574620392, + 1656241707, 346502533, 251836754, 333480550, 1459834400, 1113675743, + 2122466788, 979601485, 233233021, 1572255140, 1681545190, 1104933720, + 1443145325, 1714710647, 88639634, 825791694, 1626870461, 1908681983, + 963964191, 1634296630, 1782648142, 2143493320, 203845520, 699045063, + 1215387142, 339980538, 512976554, 2085308422, 914600930, 364531492, + 284327308, 1166437685, 531900034, 1744161708, 132629780, 40658094, + 576279545, 365862802, 374138644, 110341087, 1470796522, 349121784, + 1825051735, 1559436157, 1921376925, 1304438548, 1320634492, 1217038602, + 791251530, 955798986, 2042830296, 995097051, 1654844049, 859310840, + 1335077589, 20336956, 855320512, 102194872, 384868448, 2070707654, + 1268632557, 916768482, 2008532428, 1401262337, 957426576, 145376088, + 1767125139, 1331565220, 1889537797, 1090438014, 1680687005, 318333694, + 502390523, 1454580282, 428674782, 1823025015, 524135236, 106242869, + 631340353, 419481884, 1410681417, 138700754, 1278792724, 54449299, + 159037710, 2134113236, 1049546350, 543906158, 2057337242, 237140292, + 1460674641, 1918386023, 339335164, 270617569, 2063762111, 1607967721, + 1602182790, 1805816260, 861746410, 1135386147, 2124149955, 481387902, + 442482781, 405341089, 1571825916, 966618017, 511583958, 2074216439, + 1386099901, 1922265375, 1749757806, 517408978, 1976714674, 233614511, + 504038566, 878777377, 372315265, 413892161, 1115917669, 531352976, + 184794536, 1455252833, 1075259134, 101072999, 915736906, 388450127, + 1906889260, 1777483316, 659067697, 1883555567, 111387570, 113766839, + 141413008, 1683213486, 1249152986, 652996966, 1609946277, 1691635767, + 427778693, 1212220435, 510770136, 257009719, 1445834946, 1896870037, + 1135787096, 1818150212, 266795367, 104221117, 202019540, 770833934, + 1559473950, 1277278674, 1184726095, 327727208, 1665728802, 1369520631, + 2105210525, 177312851, 1470593630, 69114447, 291079690, 1229999242, + 1752327934, 1540232676, 966071161, 1214790563, 1084384795, 1107484169, + 279527351, 1595154931, 1760481135, 1725362297, 1344541320, 40776180, + 1396028861, 1611336688, 297785900, 1598048401, 234686974, 1433572996, + 727843428, 1419413069, 1537794114, 246088582, 641450052, 949784416, + 423401433, 2112043682, 1277511625, 714481123, 1194559277, 1235238502, + 107230151, 13146790, 1304352949, 1191614946, 1120630960, 909197235, + 639286229, 733628447, 2123987799, 1983827549, 774404628, 256031502, + 1447680589, 1072190528, 1981393799, 1682367563, 358279876, 1229939013, + 954296984, 1896073990, 680503766, 1595747036, 698374759, 1408347194, + 1560307071, 1975886384, 1654435776, 607382700, 1063641238, 2077837209, + 620529490, 220510539, 644834684, 1741160450, 1129707775, 752064835, + 327305250, 1106211926, 1943679781, 1101709878, 1362243428, 435482362, + 26416758, 1196153579, 271826264, 384696634, 278608944, 1719506853, + 133286977, 959112711, 1254390769, 831661736, 219976257, 61204105, + 660064472, 1874412034, 1656951142, 1723705710, 1804765595, 1069774565, + 1944216249, 302116632, 1677157265, 926440376, 1054181467, 150203107, + 2032652302, 850377601, 1891363558, 1247412082, 1285859963, 71185160, + 296082014, 1557686227, 1172895038, 574690958, 1129709433, 1199311796, + 1533803669, 236616554, 1584008430, 1753779927, 297820659, 1717295407, + 1480708313, 1954771801, 401473495, 1137990260, 877062718, 1061537967, + 1440106892, 406736335, 637760029, 346804712, 556939443, 434492631, + 1197182313, 300819353, 1360933007, 335558628, 372004513, 1246101662, + 1893244856, 1544899551, 346030096, 875470641, 596727699, 642112110, + 1112087195, 33252481, 1216803069, 1409907854, 1750547889, 603123090, + 1217196008, 4537736, 209419369, 2094258726, 1066075704, 1690127682, + 353511414, 1703835733, 680634295, 910450857, 2138328364, 2120741187, + 1211270210, 1351777724, 320062251, 1583274723, 450395738, 1517244564, + 980690626, 796425834, 1852803193, 1577418325, 1438537945, 1598564401, + 1610670806, 507857366, 326551394, 1213735047, 1110980456, 1438638589, + 1218272784, 1320399826, 701062795, 136864840, 863043860, 1918258803, + 1840700573, 1543678155, 1865033882, 1831545290, 1516935695, 71061648, + 1035839366, 1836997946, 981512505, 1486235104, 1206758863, 45299067, + 135177290, 912078408, 1628573790, 1573715235, 363159161, 461780768, + 2081572601, 689710555, 2039199093, 1045069410, 2128349144, 1502386251, + 217985588, 681928291, 568637651, 1081029448, 452703447, 1786910435, + 477223956, 170253681, 1923775275, 1994159651, 241315329, 1616992200, + 1683673949, 1222827834, 1301053842, 742949164, 1268126901, 189409560, + 1655027572, 749217043, 1675644664, 2018186733, 1210997811, 1810821955, + 560413640, 1102713256, 1237053542, 541279136, 457615859, 1171142496, + 1223207428, 1026253510, 68728258, 1675910875, 665680297, 286713846, + 1846164556, 441971924, 1367743294, 2087479885, 2058964125, 1844967250, + 1162824071, 1212534319, 1691643253, 283467324, 1401943880, 1227833555, + 1032684367, 930104896, 1970782719, 96198530, 593443203, 1478326644, + 1198911786, 1830496746, 1349029729, 1656527645, 854155594, 1909443370, + 535297508, 922883852, 303238858, 1200977805, 1209597698, 1526446286, + 1642949730, 429857344, 1054873513, 1554430207, 127340947, 753554421, + 619480878, 1818984200, 693550658, 2021424758, 899334107, 1856374729, + 804046007, 722633179, 2139842053, 1397489210, 53476175, 1025042772, + 1080502308, 1402505904, 1121241302, 1934657902, 1164465626, 172669440, + 710058106, 1467704485, 1829197086, 1919655804, 846667123, 217010946, + 202029501, 1901540637, 1417988751, 329370448, 507611410, 913454833, + 871000, 1201162069, 320401392, 900205108, 910053150, 939882271, + 1622838287, 902411556, 813823381, 1676314462, 1927454328, 1617869388, + 931336718, 901211983, 867874951, 2095802345, 1073881423, 1948377259, + 1416023182, 755594861, 1735551514, 115206657, 972605807, 298125972, + 2016747294, 243110911, 70298129, 376875057, 1156565744, 272327630, + 1578037126, 1476967137, 601698078, 340606628, 269365760, 602569078, + 1243018184, 1083189141, 1502774186, 1022988865, 553574882, 978128825, + 1924200848, 1421449833, 506959639, 850598623, 1222343444, 1438296358, + 1606193485, 810411310, 1386615055, 431315644, 1108537283, 655154589, + 674426555, 1178835412, 770361246, 1830992300, 1451163042, 639624893, + 1160475789, 2052861120, 1016499950, 1429841549, 507946550, 447053428, + 365547042, 2010720737, 787660056, 919121924, 841365914, 2030678241, + 193088109, 1348325554, 906183458, 1415431554, 639138264, 682900658, + 78359216, 2025753319, 1533499281, 1186896499, 533424260, 992209118, + 218248263, 1303785506, 1423524763, 1669411305, 1943410399, 2097951318, + 1574788777, 812426701, 1781459970, 2082735328, 1259480129, 794452111, + 1945972417, 2047140186, 76810012, 639854683, 1930334779, 442357055, + 1988180237, 689034589, 1361478979, 479834853, 1371935247, 1554567089, + 358104524, 757950880, 822514995, 891528784, 1750159999, 900874211, + 47830643, 1026201114, 2087770711, 1991241042, 976668784, 158535326, + 656184096, 610645107, 1827946632, 1915664225, 1405097218, 1255251761, + 1815320763, 1481907231, 1190503441, 1598171894, 1924264286, 988992210, + 139722835, 1138259617, 1628846894, 1511658082, 545343058, 1469543483, + 122125315, 1367858053, 1949378337, 1872285314, 121248617, 159999213, + 751002780, 61535680, 1051527998, 1727671564, 220071006, 1099358641, + 190833023, 2048017638, 943116035, 1595930242, 1155785752, 1599300131, + 930353825, 198805545, 1367480709, 707134463, 1187797756, 1035317824, + 1845394080, 669161002, 486006071, 243253491, 2138704485, 625728906, + 1611111544, 1940599174, 2137386989, 1732360161, 2100598388, 112028656, + 1793895841, 1004642738, 1984313970, 2013966848, 2104001379, 587833102, + 1914500838, 899633766, 168021018, 922802942, 351450250, 358854042, + 1121608488, 1718930959, 1954784284, 161922596, 606765135, 737654461, + 831083598, 1092771206, 1444788924, 822304435, 1718500113, 1142699356, + 615419962, 1708403454, 1385952847, 568534702, 1820432110, 849580744, + 1573177440, 1657262432, 434457257, 1529695171, 97611886, 80869451, + 281845289, 265632904, 2094836299, 633295539, 624486946, 1861853489, + 204742850, 431787582, 637172784, 811507986, 1169442043, 1758781272, + 1904279192, 466747319, 1920703868, 1475295657, 1609446676, 604303818, + 1036215463, 847915875, 1426608253, 709163925, 1697496619, 2042028215, + 218942709, 2131953877, 463079269, 316554595, 65339680, 2036256709, + 582187500, 12692331, 1418468232, 1206674446, 1874545820, 1700313522, + 1638462029, 364234956, 186125413, 660420424, 2123016228, 390868264, + 1127167744, 1896236448, 1202376250, 589130772, 353056618, 959171794, + 1437046647, 1779664872, 286983804, 987059619, 1674209439, 1323199267, + 971529848, 2137288709, 2032363193, 1036869528, 2026061770, 103822254, + 1049561859, 1297046355, 420376850, 776624031, 849876229, 1002564350, + 1140858988, 1036001642, 61755148, 1116391568, 1426869906, 1700217177, + 865144369, 481762508, 213153954, 1218200987, 1440934303, 1340321698, + 850382211, 1727918107, 1929452470, 377108003, 903633726, 1219015469, + 366913064, 788513271, 58591440, 245491186, 892335526, 1030121288, + 1542537541, 1312712376, 2066990816, 244930122, 167793078, 969069027, + 1280931765, 229548226, 1745693059, 560318023, 1929765404, 739068399, + 1042080532, 2142919358, 1855459967, 335531187, 1335757408, 573120688, + 2063449294, 1117726230, 1791321676, 819599372, 189258051, 494220239, + 1608112644, 247849492, 871328242, 352964522, 1277970780, 1238241306, + 1665676898, 1197477949, 1483732493, 1833469976, 19063328, 878786386, + 2063018202, 1764756387, 1123716509, 1845299958, 356341138, 257164626, + 1840735668, 64317458, 817482649, 1029009428, 637438146, 1859563181, + 2146735658, 281276174, 47610720, 188510062, 775496414, 2111060014, + 436359554, 1646824656, 783175739, 1714330334, 737582315, 243804735, + 764324635, 73831160, 596769257, 783387964, 952617546, 114962507, + 400660703, 2076334055, 1948432483, 757001842, 186015033, 1863967037, + 821319300, 1003497683, 1561783348, 1458757446, 715577216, 1255035368, + 1740033621, 763187937, 136561149, 368046387, 726764303, 135813159, + 2014871043, 1509940042, 324323221, 604969710, 1753744777, 760682775, + 678800870, 203030386, 327529462, 1631418417, 317992893, 1091854097, + 1560268824, 118941728, 1875242061, 1746283858, 1982908766, 128419117, + 602297893, 1397208466, 885420959, 1317875109, 504760186, 1706740259, + 2081063046, 641321335, 1018014057, 660343702, 777134495, 610564030, + 22800096, 1101457716, 978610417, 1776544874, 1862140492, 845997813, + 1979575260, 42186306, 1450967523, 150084506, 1134040403, 2129768394, + 269026234, 861798817, 1613703163, 104451352, 990217934, 1026488339, + 1501659818, 1875638893, 625288549, 2006420005, 1434895504, 1227586442, + 500257692, 305425913, 397977904, 1277392187, 915989944, 331557302, + 231366256, 1894600361, 991901004, 2093506748, 593114526, 1014701101, + 2135693054, 2044082050, 643762327, 1122249809, 2026366796, 475853939, + 1984048626, 1492586311, 625938445, 826782912, 371591002, 894964680, + 554938157, 996879552, 999416032, 1989833661, 76982346, 353592203, + 147775927, 474960250, 212528560, 1063765871, 806517553, 712786252, + 810882584, 1798418557, 1990178440, 1403997111, 665636010, 74061048, + 1300595513, 1309398337, 20084148, 1179478661, 1785252277, 8293554, + 524581324, 263707074, 1130543363, 896172326, 1158671754, 967108342, + 1893051878, 10604139, 1793891254, 1970034225, 364196342, 201345764, + 297510827, 576724902, 43695777, 1104028380, 1289511154, 191471704, + 754963290, 1132205946, 1255237575, 1420599300, 1206266994, 2066120160, + 582513990, 1226351142, 1322633623, 220282619, 1234644696, 475745488, + 483989693, 217704412, 1655224149, 1642661448, 1184812754, 32321825, + 1653265587, 831220360, 928494151, 2017461929, 1032566124, 674062382, + 446703183, 1076261902, 496612959, 1736214337, 1267733606, 794123786, + 720936636, 375487534, 1898152167, 1927203630, 294124046, 505631809, + 1006071125, 1616757669, 1926231109, 93232173, 2092503157, 361261451, + 310936585, 1600243658, 581544070, 1495749339, 1632565483, 1065533764, + 179486052, 413575986, 560711564, 1212052176, 1087638368, 66493503, + 140830430, 1584251327, 2083955432, 1408564037, 230891466, 383174967, + 1784051571, 2129043633, 2119389304, 2078175617, 487191794, 692842292, + 1547449638, 265939255, 472562275, 1492469147, 627200707, 1478633400, + 945229157, 1208744777, 1571865573, 430310992, 126794893, 1882802159, + 843886978, 687506457, 1231067850, 1931525347, 753999960, 1410553902, + 1368293026, 690471744, 475122431, 1599184492, 1073646711, 615952861, + 1580744477, 1045552368, 2024516898, 2067936271, 1738394660, 1661084821, + 186391879, 63473287, 1591776790, 813592586, 1542106687, 991742780, + 2022337363, 966488613, 336728279, 1648609, 701807124, 1281957436, + 689155066, 1932874974, 1712268428, 1443155027, 1195945229, 408671759, + 2133626771, 1671067660, 192713458, 1059789835, 139536873, 1561006484, + 2105342203, 16570124, 1012707329, 1696253215, 1677654945, 445968158, + 1759726503, 1121948088, 366420782, 1154349542, 2113690868, 552812661, + 2120838155, 302935500, 1366405247, 675161631, 1584892936, 1241258962, + 460552958, 1149677717, 1242907571, 1656498187, 1558349476, 1932062638, + 1180082199, 1751062934, 1227734017, 1319619072, 1164585770, 1213877140}; diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/math_private.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/math_private.h new file mode 100644 index 0000000..27b1467 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/math_private.h @@ -0,0 +1,66 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + unsigned int word; +} quicksort_ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define QUICKSORT_GET_FLOAT_WORD(i, d) \ + { \ + quicksort_ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define QUICKSORT_SET_FLOAT_WORD(d, i) \ + { \ + quicksort_ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.c new file mode 100644 index 0000000..e969bba --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.c @@ -0,0 +1,236 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +/* + Include section +*/ + +#include "quicksort.h" +#include "quicksortlibm.h" +#include "quicksortstdlib.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void quicksort_init(void); +int quicksort_return(void); +void quicksort_str(char *, unsigned long, unsigned long); +void quicksort_vec(char *, unsigned long, unsigned long); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +quicksort_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +extern const char *quicksort_input_string[681]; +char quicksort_strings[681][20]; + +extern unsigned int quicksort_input_vector[1000 * 3]; +struct quicksort_3DVertexStruct quicksort_vectors[1000]; + +volatile int quicksort_const_prop_border_i = 0; +volatile char quicksort_const_prop_border_c = 0; + +/* + Initialization- and return-value-related functions +*/ + +void +quicksort_init(void) { + unsigned int i, j; + unsigned int x, y, z; + unsigned int read_counter = 0; + + /* constant propagation border */ + __pragma_loopbound(3000, 3000); + for (i = 0; i < 3000; i++) + quicksort_input_vector[i] += quicksort_const_prop_border_i; + + /* Init arrays */ + __pragma_loopbound(681, 681); + for (i = 0; i < 681; i++) { + __pragma_loopbound(1, 20); + for (j = 0; j < 20 - 1; j++) { + quicksort_strings[i][j] = quicksort_input_string[i][j]; + quicksort_strings[i][j] += quicksort_const_prop_border_c; + + if (quicksort_input_string[i][j] == '\0') + break; + } + + /* Terminate with '\0' anyways. */ + quicksort_strings[i][20 - 1] = '\0'; + } + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) { + x = quicksort_vectors[i].x = quicksort_input_vector[read_counter++]; + y = quicksort_vectors[i].y = quicksort_input_vector[read_counter++]; + z = quicksort_vectors[i].z = quicksort_input_vector[read_counter++]; + + quicksort_vectors[i].distance = quicksort_sqrt( + quicksort_pow(x, 2) + quicksort_pow(y, 2) + quicksort_pow(z, 2)); + } +} + +int +quicksort_return(void) { + int checksum = 0; + + checksum += quicksort_strings[42][1] + quicksort_vectors[42].x + + quicksort_vectors[42].y + quicksort_vectors[42].z; + + return (checksum); +} + +/* + Algorithm core functions +*/ + +void +quicksort_str(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pn; + + __pragma_loopbound(0, 8); + while (n > 1) { + if (n > 10) + pi = quicksort_pivot_strings(a, n, es); + else + pi = a + (n >> 1) * es; + + quicksort_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + + __pragma_loopbound(0, 169); + while (1) { + __pragma_loopbound(1, 26); + do + pi += es; + while ((pi < pn) && (quicksort_compare_strings(pi, a) < 0)); + + __pragma_loopbound(1, 23); + do + pj -= es; + while ((pj > a) && (quicksort_compare_strings(pj, a) > 0)); + + if (pj < pi) + break; + quicksort_swapi(pi, pj, es); + } + quicksort_swapi(a, pj, es); + j = (pj - a) / es; + n = n - j - 1; + + if (j >= n) { + quicksort_str(a, j, es); + a += (j + 1) * es; + } else { + quicksort_str(a + (j + 1) * es, n, es); + n = j; + } + } +} + +void +quicksort_vec(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pn; + + __pragma_loopbound(0, 15); + while (n > 1) { + if (n > 10) + pi = quicksort_pivot_vectors(a, n, es); + else + pi = a + (n >> 1) * es; + + quicksort_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + + __pragma_loopbound(1, 250); + while (1) { + __pragma_loopbound(1, 51); + do + pi += es; + while ((pi < pn) && (quicksort_compare_vectors(pi, a) < 0)); + + __pragma_loopbound(1, 27); + do + pj -= es; + while ((pj > a) && (quicksort_compare_vectors(pj, a) > 0)); + + if (pj < pi) + break; + + quicksort_swapi(pi, pj, es); + } + + quicksort_swapi(a, pj, es); + j = (pj - a) / es; + n = n - j - 1; + + if (j >= n) { + quicksort_vec(a, j, es); + a += (j + 1) * es; + } else { + quicksort_vec(a + (j + 1) * es, n, es); + n = j; + } + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +quicksort_main(void) { + _Pragma("marker recursivecall") + _Pragma("flowrestriction 1*quicksort_str <= 521*recursivecall") + quicksort_str(*quicksort_strings, 681, sizeof(char[20])); + + _Pragma("marker recursivecall2") + _Pragma("flowrestriction 1*quicksort_vec <= 650*recursivecall2") + quicksort_vec((char *) quicksort_vectors, 1000, + sizeof(struct quicksort_3DVertexStruct)); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + quicksort_init(); + quicksort_main(); + + return (quicksort_return() - 1527923179 != 0); +} diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.h new file mode 100644 index 0000000..bc91ea9 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksort.h @@ -0,0 +1,10 @@ + +#ifndef __QUICKSORT_H +#define __QUICKSORT_H + +struct quicksort_3DVertexStruct { + unsigned int x, y, z; + double distance; +}; + +#endif diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.c new file mode 100644 index 0000000..0f405dd --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.c @@ -0,0 +1,1128 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +#include "quicksortlibm.h" +#include "math_private.h" + +// Often used variables/consts + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_one = 1.0f, + quicksort_half = 5.0000000000e-01f, /* 0x3f000000 */ + quicksort_zero = 0.0f, quicksort_huge = 1.0e30, quicksort_tiny = 1.0e-30f, + quicksort_two = 2.0, quicksort_two24 = 16777216.0; /* 0x4b800000 */ + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_bp[] = + { + 1.0f, + 1.5f, +}, + quicksort_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + quicksort_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + quicksort_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + quicksort_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + quicksort_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + quicksort_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + quicksort_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + quicksort_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + quicksort_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + quicksort_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + quicksort_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + quicksort_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + quicksort_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + quicksort_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + quicksort_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + quicksort_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + quicksort_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + quicksort_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + quicksort_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + quicksort_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + quicksort_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + quicksort_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + quicksort_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +float +quicksort___ieee754_powf(float x, float y) +#else +float +quicksort___ieee754_powf(x, y) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int i, j, k, yisint, n; + int hx, hy, ix, iy, is; + + QUICKSORT_GET_FLOAT_WORD(hx, x); + QUICKSORT_GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return (quicksort_one); + + /* x==+-1 */ + if (x == 1.0f) + return (quicksort_one); + if ((x == -1.0f) && quicksort_isinf(y)) + return (quicksort_one); + + /* +-NaN return x+y */ + if ((ix > 0x7f800000) || (iy > 0x7f800000)) + return (x + y); + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return (y - y); /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return ((hy >= 0) ? y : quicksort_zero); + else /* (|x|<1)**-,+inf = inf,0 */ + return ((hy < 0) ? -y : quicksort_zero); + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return (quicksort_one / x); + else + return (x); + } + if (hy == 0x40000000) + return (x * x); /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return (quicksort___ieee754_sqrtf(x)); + } + + ax = quicksort_fabsf(x); + /* special value of x */ + if ((ix == 0x7f800000) || (ix == 0) || (ix == 0x3f800000)) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = quicksort_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + else + + if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + + return (z); + } + + /* (x<0)**(non-int) is NaN */ + if (((((unsigned int) hx >> 31) - 1) | yisint) == 0) + return ((x - x) / (x - x)); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return ((hy < 0) ? quicksort_huge * quicksort_huge + : quicksort_tiny * quicksort_tiny); + if (ix > 0x3f800007) + return ((hy > 0) ? quicksort_huge * quicksort_huge + : quicksort_tiny * quicksort_tiny); + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = quicksort_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * quicksort_ivln2_l - w * quicksort_ivln2; + t1 = u + v; + QUICKSORT_GET_FLOAT_WORD(is, t1); + QUICKSORT_SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= quicksort_two24; + n -= 24; + QUICKSORT_GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + + (k << 21)); + t_l = ax - (t_h - quicksort_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (quicksort_L1 + + s2 * (quicksort_L2 + + s2 * (quicksort_L3 + + s2 * (quicksort_L4 + + s2 * (quicksort_L5 + s2 * quicksort_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + QUICKSORT_GET_FLOAT_WORD(is, t_h); + QUICKSORT_SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + QUICKSORT_GET_FLOAT_WORD(is, p_h); + QUICKSORT_SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = quicksort_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = quicksort_cp_l * p_h + p_l * quicksort_cp + quicksort_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + quicksort_dp_h[k]) + t); + QUICKSORT_GET_FLOAT_WORD(is, t1); + QUICKSORT_SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - quicksort_dp_h[k]) - z_h); + } + + s = quicksort_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((unsigned int) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -quicksort_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + QUICKSORT_GET_FLOAT_WORD(is, y); + QUICKSORT_SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + QUICKSORT_GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return (s * quicksort_huge * quicksort_huge); /* overflow */ + else + + if (j == 0x43000000) { /* if z == 128 */ + if (p_l + quicksort_ovt > z - p_h) + return (s * quicksort_huge * quicksort_huge); /* overflow */ + } else + + if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return (s * quicksort_tiny * quicksort_tiny); /* underflow */ + else + + if ((unsigned int) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return (s * quicksort_tiny * quicksort_tiny); /* underflow */ + } + + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [ z+0.5 ] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + QUICKSORT_SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + QUICKSORT_GET_FLOAT_WORD(is, t); + QUICKSORT_SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * quicksort_lg2_h; + v = (p_l - (t - p_h)) * quicksort_lg2 + t * quicksort_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (quicksort_P1 + + t * (quicksort_P2 + + t * (quicksort_P3 + t * (quicksort_P4 + t * quicksort_P5)))); + r = (z * t1) / (t1 - quicksort_two) - (w + z * w); + z = quicksort_one - (r - z); + QUICKSORT_GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = quicksort___scalbnf(z, n); /* subnormal output */ + else + QUICKSORT_SET_FLOAT_WORD(z, j); + + return (s * z); +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float +quicksort___ieee754_sqrtf(float x) +#else +float +quicksort___ieee754_sqrtf(x) +float x; +#endif +{ + float z; + int sign = (int) 0x80000000; + int ix, s, q, m, t, i; + unsigned int r; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) + return (x * x + x); /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return (x); /* sqrt(+-0) = +-0 */ + else + + if (ix < 0) + return ((x - x) / (x - x)); /* sqrt(-ve) = sNaN */ + } + + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [ m/2 ] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = quicksort_one - quicksort_tiny; /* trigger inexact flag */ + if (z >= quicksort_one) { + z = quicksort_one + quicksort_tiny; + if (z > quicksort_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + QUICKSORT_SET_FLOAT_WORD(z, ix); + + return (z); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +#ifdef __STDC__ +float +quicksort___copysignf(float x, float y) +#else +float +quicksort___copysignf(x, y) +float x, y; +#endif +{ + unsigned int ix, iy; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + QUICKSORT_GET_FLOAT_WORD(iy, y); + QUICKSORT_SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + + return (x); +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int quicksort_npio2_hw[] = { +#else +int quicksort_npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + quicksort_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + quicksort_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + quicksort_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + quicksort_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + quicksort_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + quicksort_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int +quicksort___ieee754_rem_pio2f(float x, float *y) +#else +int +quicksort___ieee754_rem_pio2f(x, y) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + int i, j, n, ix, hx; + + QUICKSORT_GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + + return (0); + } + + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - quicksort_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - quicksort_pio2_1t; + y[1] = (z - y[0]) - quicksort_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= quicksort_pio2_2; + y[0] = z - quicksort_pio2_2t; + y[1] = (z - y[0]) - quicksort_pio2_2t; + } + return (1); + } else { /* negative x */ + z = x + quicksort_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + quicksort_pio2_1t; + y[1] = (z - y[0]) + quicksort_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += quicksort_pio2_2; + y[0] = z + quicksort_pio2_2t; + y[1] = (z - y[0]) + quicksort_pio2_2t; + } + return (-1); + } + } + + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = quicksort_fabsf(x); + n = (int) (t * quicksort_invpio2 + quicksort_half); + fn = (float) n; + r = t - fn * quicksort_pio2_1; + w = fn * quicksort_pio2_1t; /* 1st round good to 40 bit */ + + if ((n < 32) && ((int) (ix & 0xffffff00) != quicksort_npio2_hw[n - 1])) + y[0] = r - w; /* quick check no cancellation */ + else { + unsigned int high; + + j = ix >> 23; + y[0] = r - w; + QUICKSORT_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * quicksort_pio2_2; + r = t - w; + w = fn * quicksort_pio2_2t - ((t - r) - w); + y[0] = r - w; + QUICKSORT_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * quicksort_pio2_3; + r = t - w; + w = fn * quicksort_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return (-n); + } else + return (n); + } + + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return (0); + } + + y[0] = y[1] = x - x; /* dummy initialization */ + return (0); /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + quicksort_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + quicksort_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + quicksort_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + quicksort_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + quicksort_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float +quicksort___kernel_cosf(float x, float y) +#else +float +quicksort___kernel_cosf(x, y) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return (quicksort_one); /* generate inexact */ + } + + z = x * x; + r = z * (quicksort_C1 + + z * (quicksort_C2 + + z * (quicksort_C3 + + z * (quicksort_C4 + + z * (quicksort_C5 + z * quicksort_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return (quicksort_one - ((float) 0.5f * z - (z * r - x * y))); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + QUICKSORT_SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = quicksort_one - qx; + return (a - (hz - (z * r - x * y))); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + quicksort_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + quicksort_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + quicksort_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + quicksort_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + quicksort_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float +quicksort___kernel_sinf(float x, float y, int iy) +#else +float +quicksort___kernel_sinf(x, y, iy) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return (x); /* generate inexact */ + } + + z = x * x; + v = z * x; + r = quicksort_S2 + + z * (quicksort_S3 + + z * (quicksort_S4 + z * (quicksort_S5 + z * quicksort_S6))); + + if (iy == 0) + return (x + v * (quicksort_S1 + z * r)); + else + return (x - + ((z * (quicksort_half * y - v * r) - y) - v * quicksort_S1)); +} + +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float quicksort_atanhi[] = { +#else +float quicksort_atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float quicksort_atanlo[] = { +#else +float quicksort_atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float quicksort_aT[] = { +#else +float quicksort_aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +#ifdef __STDC__ +float +quicksort___atanf(float x) +#else +float +quicksort___atanf(x) +float x; +#endif +{ + float w, s1, s2, z; + int ix, hx, id; + + QUICKSORT_GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix >= 0x50800000) { /* if |x| >= 2^34 */ + if (ix > 0x7f800000) + return (x + x); /* NaN */ + if (hx > 0) + return (quicksort_atanhi[3] + quicksort_atanlo[3]); + else + return (-quicksort_atanhi[3] - quicksort_atanlo[3]); + } + if (ix < 0x3ee00000) { /* |x| < 0.4375 */ + if (ix < 0x31000000) { /* |x| < 2^-29 */ + if (quicksort_huge + x > quicksort_one) + return (x); /* raise inexact */ + } + id = -1; + } else { + x = quicksort_fabsf(x); + if (ix < 0x3f980000) { /* |x| < 1.1875 */ + if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ((float) 2.0f * x - quicksort_one) / ((float) 2.0f + x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = (x - quicksort_one) / (x + quicksort_one); + } + } else { + if (ix < 0x401c0000) { /* |x| < 2.4375 */ + id = 2; + x = (x - (float) 1.5f) / (quicksort_one + (float) 1.5f * x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -(float) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * (quicksort_aT[0] + + w * (quicksort_aT[2] + + w * (quicksort_aT[4] + + w * (quicksort_aT[6] + + w * (quicksort_aT[8] + w * quicksort_aT[10]))))); + s2 = w * (quicksort_aT[1] + + w * (quicksort_aT[3] + + w * (quicksort_aT[5] + + w * (quicksort_aT[7] + w * quicksort_aT[9])))); + + if (id < 0) + return (x - x * (s1 + s2)); + else { + z = quicksort_atanhi[id] - ((x * (s1 + s2) - quicksort_atanlo[id]) - x); + return ((hx < 0) ? -z : z); + } +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float +quicksort___cosf(float x) +#else +float +quicksort___cosf(x) +float x; +#endif +{ + float y[2], z = 0.0f; + int n, ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return (quicksort___kernel_cosf(x, z)); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return (x - x); + + /* argument reduction needed */ + else { + n = quicksort___ieee754_rem_pio2f(x, y); + + switch (n & 3) { + case 0: + return (quicksort___kernel_cosf(y[0], y[1])); + case 1: + return (-quicksort___kernel_sinf(y[0], y[1], 1)); + case 2: + return (-quicksort___kernel_cosf(y[0], y[1])); + default: + return (quicksort___kernel_sinf(y[0], y[1], 1)); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float +quicksort___sinf(float x) +#else +float +quicksort___sinf(x) +float x; +#endif +{ + float y[2], z = 0.0; + int n, ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return (quicksort___kernel_sinf(x, z, 0)); + + /* sin(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return (x - x); + + /* argument reduction needed */ + else { + n = quicksort___ieee754_rem_pio2f(x, y); + + switch (n & 3) { + case 0: + return (quicksort___kernel_sinf(y[0], y[1], 1)); + case 1: + return (quicksort___kernel_cosf(y[0], y[1])); + case 2: + return (-quicksort___kernel_sinf(y[0], y[1], 1)); + default: + return (-quicksort___kernel_cosf(y[0], y[1])); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +#ifdef __STDC__ +float +quicksort___fabsf(float x) +#else +float +quicksort___fabsf(x) +float x; +#endif +{ + unsigned int ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + QUICKSORT_SET_FLOAT_WORD(x, ix & 0x7fffffff); + return (x); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_two25 = 3.355443200e+07f, /* 0x4c000000 */ + quicksort_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float +quicksort___scalbnf(float x, int n) +#else +float +quicksort___scalbnf(x, n) +float x; +int n; +#endif +{ + int k, ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return (x); /* +-0 */ + x *= quicksort_two25; + QUICKSORT_GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + + if (k == 0xff) + return (x + x); /* NaN or Inf */ + k = k + n; + if ((n > 50000) || (k > 0xfe)) + /* overflow */ + return (quicksort_huge * quicksort___copysignf(quicksort_huge, x)); + if (n < -50000) + /* underflow */ + return (quicksort_tiny * quicksort___copysignf(quicksort_tiny, x)); + if (k > 0) { /* normal result */ + QUICKSORT_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return (x); + } + + if (k <= -25) + /* underflow */ + return (quicksort_tiny * quicksort___copysignf(quicksort_tiny, x)); + k += 25; /* subnormal result */ + QUICKSORT_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return (x * quicksort_twom25); +} + +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ +int +quicksort___isinff(float x) { + int ix, t; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return (~(t >> 31) & (ix >> 30)); +} diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.h new file mode 100644 index 0000000..c4b88e4 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortlibm.h @@ -0,0 +1,56 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See quicksortlibm.c + +*/ + +#ifndef __QUICKSORTLIBM +#define __QUICKSORTLIBM + +// The following defines map the math functions to specialized calls +#define quicksort_acos quicksort___ieee754_acosf +#define quicksort_atan quicksort___atanf +#define quicksort_cos quicksort___cosf +#define quicksort_fabs quicksort___fabsf +#define quicksort_fabsf quicksort___fabsf +#define quicksort_isinf quicksort___isinff +#define quicksort_pow quicksort___ieee754_powf +#define quicksort_sqrt quicksort___ieee754_sqrtf +#define quicksort_log10 quicksort___ieee754_log10f +#define quicksort_log quicksort___ieee754_logf +#define quicksort_sin quicksort___sinf + +float quicksort___atanf(float); +float quicksort___copysignf(float, float); +float quicksort___cosf(float); +float quicksort___fabsf(float); +float quicksort___floorf(float); +float quicksort___ieee754_acosf(float); +float quicksort___ieee754_powf(float, float); +int quicksort___ieee754_rem_pio2f(float, float *); +float quicksort___ieee754_sqrtf(float); +int quicksort___isinff(float); +float quicksort___kernel_cosf(float, float); +float quicksort___kernel_sinf(float, float, int); +int quicksort___kernel_rem_pio2f(float *, float *, int, int, int, const int *); +float quicksort___scalbnf(float, int); +float quicksort___ieee754_logf(float); +float quicksort___ieee754_log10f(float); +float quicksort___sinf(float); + +#endif // __QUICKSORTLIBM diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.c new file mode 100644 index 0000000..b2ecba1 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.c @@ -0,0 +1,134 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +#include "quicksort.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int +quicksort_strcmp(const char *str1, const char *str2) { + __pragma_loopbound(0, 11); + while (*str1 && (*str1 == *str2)) + ++str1, ++str2; + + return (*(const unsigned char *) str1 - *(const unsigned char *) str2); +} + +int +quicksort_compare_strings(const char *elem1, const char *elem2) { + int result; + + result = quicksort_strcmp(elem1, elem2); + + return ((result < 0) ? 1 : ((result == 0) ? 0 : -1)); +} + +int +quicksort_compare_vectors(const char *elem1, const char *elem2) { + /* D = [ (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 ]^(1/2) */ + /* sort based on distances from the origin... */ + + double distance1, distance2; + + distance1 = (*((struct quicksort_3DVertexStruct *) elem1)).distance; + distance2 = (*((struct quicksort_3DVertexStruct *) elem2)).distance; + + return ((distance1 > distance2) ? 1 : ((distance1 == distance2) ? 0 : -1)); +} + +void +quicksort_swapi(char *ii, char *ij, unsigned long es) { + char *i, *j, c; + + i = (char *) ii; + j = (char *) ij; + + __pragma_loopbound(20, 24); + do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof(char); + } while (es != 0); +} + +char * +quicksort_pivot_strings(char *a, unsigned long n, unsigned long es) { + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + + if (quicksort_compare_strings(pi, pj) < 0) { + if (quicksort_compare_strings(pi, pk) < 0) { + if (quicksort_compare_strings(pj, pk) < 0) + return (pj); + return (pk); + } + return (pi); + } + + if (quicksort_compare_strings(pj, pk) < 0) { + if (quicksort_compare_strings(pi, pk) < 0) + return (pi); + return (pk); + } + + return (pj); +} + +char * +quicksort_pivot_vectors(char *a, unsigned long n, unsigned long es) { + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + + if (quicksort_compare_vectors(pi, pj) < 0) { + if (quicksort_compare_vectors(pi, pk) < 0) { + if (quicksort_compare_vectors(pj, pk) < 0) + return (pj); + return (pk); + } + return (pi); + } + + if (quicksort_compare_vectors(pj, pk) < 0) { + if (quicksort_compare_vectors(pi, pk) < 0) + return (pi); + return (pk); + } + + return (pj); +} diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.h new file mode 100644 index 0000000..6542bf0 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/default/quicksortstdlib.h @@ -0,0 +1,33 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +#ifndef __QUICKSORTSTDLIB_H +#define __QUICKSORTSTDLIB_H + +int quicksort_compare_strings(const char *, const char *); +int quicksort_compare_vectors(const char *, const char *); +void quicksort_swapi(char *, char *, unsigned long); +char *quicksort_pivot_strings(char *, unsigned long, unsigned long); +char *quicksort_pivot_vectors(char *, unsigned long, unsigned long); + +#endif diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/input.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/input.c new file mode 100644 index 0000000..ee897ff --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/input.c @@ -0,0 +1,1206 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +const char *quicksort_input_string[681] = {"Kurt", + "Vonneguts", + "Commencement", + "Address", + "at", + "MIT", + "Ladies", + "and", + "gentlemen", + "of", + "the", + "class", + "of", + "97", + "Wear", + "sunscreen", + "If", + "I", + "could", + "offer", + "you", + "only", + "one", + "tip", + "for", + "the", + "future", + "sunscreen", + "would", + "be", + "it", + "The", + "longterm", + "benefits", + "of", + "sunscreen", + "have", + "been", + "proved", + "by", + "scientists", + "whereas", + "the", + "rest", + "of", + "my", + "advice", + "has", + "no", + "basis", + "more", + "reliable", + "than", + "my", + "own", + "meandering", + "experience", + "I", + "will", + "dispense", + "this", + "advice", + "now", + "Enjoy", + "the", + "power", + "and", + "beauty", + "of", + "your", + "youth", + "Oh", + "never", + "mind", + "You", + "will", + "not", + "understand", + "the", + "power", + "and", + "beauty", + "of", + "your", + "youth", + "until", + "theyve", + "faded", + "But", + "trust", + "me", + "in", + "20", + "years", + "youll", + "look", + "back", + "at", + "photos", + "of", + "yourself", + "and", + "recall", + "in", + "a", + "way", + "you", + "cant", + "grasp", + "now", + "how", + "much", + "possibility", + "lay", + "before", + "you", + "and", + "how", + "fabulous", + "you", + "really", + "looked", + "You", + "are", + "not", + "as", + "fat", + "as", + "you", + "imagine", + "Dont", + "worry", + "about", + "the", + "future", + "Or", + "worry", + "but", + "know", + "that", + "worrying", + "is", + "as", + "effective", + "as", + "trying", + "to", + "solve", + "an", + "algebra", + "equation", + "by", + "chewing", + "bubble", + "gum", + "The", + "real", + "troubles", + "in", + "your", + "life", + "are", + "apt", + "to", + "be", + "things", + "that", + "never", + "crossed", + "your", + "worried", + "mind", + "the", + "kind", + "that", + "blindside", + "you", + "at", + "4", + "pm", + "on", + "some", + "idle", + "Tuesday", + "Do", + "one", + "thing", + "every", + "day", + "that", + "scares", + "you", + "Sing", + "Dont", + "be", + "reckless", + "with", + "other", + "peoples", + "hearts", + "Dont", + "put", + "up", + "with", + "people", + "who", + "are", + "reckless", + "with", + "yours", + "Floss", + "Dont", + "waste", + "your", + "time", + "on", + "jealousy", + "Sometimes", + "youre", + "ahead", + "sometimes", + "youre", + "behind", + "The", + "race", + "is", + "long", + "and", + "in", + "the", + "end", + "its", + "only", + "with", + "yourself", + "Remember", + "compliments", + "you", + "receive", + "Forget", + "the", + "insults", + "If", + "you", + "succeed", + "in", + "doing", + "this", + "tell", + "me", + "how", + "Keep", + "your", + "old", + "love", + "letters", + "Throw", + "away", + "your", + "old", + "bank", + "statements", + "Stretch", + "Dont", + "feel", + "guilty", + "if", + "you", + "dont", + "know", + "what", + "you", + "want", + "to", + "do", + "with", + "your", + "life", + "The", + "most", + "interesting", + "people", + "I", + "know", + "didnt", + "know", + "at", + "22", + "what", + "they", + "wanted", + "to", + "do", + "with", + "their", + "lives", + "Some", + "of", + "the", + "most", + "interesting", + "40yearolds", + "I", + "know", + "still", + "dont", + "Get", + "plenty", + "of", + "calcium", + "Be", + "kind", + "to", + "your", + "knees", + "Youll", + "miss", + "them", + "when", + "theyre", + "gone", + "Maybe", + "youll", + "marry", + "maybe", + "you", + "wont", + "Maybe", + "youll", + "have", + "children", + "maybe", + "you", + "wont", + "Maybe", + "youll", + "divorce", + "at", + "40", + "maybe", + "youll", + "dance", + "the", + "funky", + "chicken", + "on", + "your", + "75th", + "wedding", + "anniversary", + "Whatever", + "you", + "do", + "dont", + "congratulate", + "yourself", + "too", + "much", + "or", + "berate", + "yourself", + "either", + "Your", + "choices", + "are", + "half", + "chance", + "So", + "are", + "everybody", + "elses", + "Enjoy", + "your", + "body", + "Use", + "it", + "every", + "way", + "you", + "can", + "Dont", + "be", + "afraid", + "of", + "it", + "or", + "of", + "what", + "other", + "people", + "think", + "of", + "it", + "Its", + "the", + "greatest", + "instrument", + "youll", + "ever", + "own", + "Dance", + "even", + "if", + "you", + "have", + "nowhere", + "to", + "do", + "it", + "but", + "your", + "living", + "room", + "Read", + "the", + "directions", + "even", + "if", + "you", + "dont", + "follow", + "them", + "Do", + "not", + "read", + "beauty", + "magazines", + "They", + "will", + "only", + "make", + "you", + "feel", + "ugly", + "Get", + "to", + "know", + "your", + "parents", + "You", + "never", + "know", + "when", + "theyll", + "be", + "gone", + "for", + "good", + "Be", + "nice", + "to", + "your", + "siblings", + "Theyre", + "your", + "best", + "link", + "to", + "your", + "past", + "and", + "the", + "people", + "most", + "likely", + "to", + "stick", + "with", + "you", + "in", + "the", + "future", + "Understand", + "that", + "friends", + "come", + "and", + "go", + "but", + "with", + "a", + "precious", + "few", + "you", + "should", + "hold", + "on", + "Work", + "hard", + "to", + "bridge", + "the", + "gaps", + "in", + "geography", + "and", + "lifestyle", + "because", + "the", + "older", + "you", + "get", + "the", + "more", + "you", + "need", + "the", + "people", + "who", + "knew", + "you", + "when", + "you", + "were", + "young", + "Live", + "in", + "New", + "York", + "City", + "once", + "but", + "leave", + "before", + "it", + "makes", + "you", + "hard", + "Live", + "in", + "Northern", + "California", + "once", + "but", + "leave", + "before", + "it", + "makes", + "you", + "soft", + "Travel", + "Accept", + "certain", + "inalienable", + "truths", + "Prices", + "will", + "rise", + "Politicians", + "will", + "philander", + "You", + "too", + "will", + "get", + "old", + "And", + "when", + "you", + "do", + "youll", + "fantasize", + "that", + "when", + "you", + "were", + "young", + "prices", + "were", + "reasonable", + "politicians", + "were", + "noble", + "and", + "children", + "respected", + "their", + "elders", + "Respect", + "your", + "elders", + "Dont", + "expect", + "anyone", + "else", + "to", + "support", + "you", + "Maybe", + "you", + "have", + "a", + "trust", + "fund", + "Maybe", + "youll", + "have", + "a", + "wealthy", + "spouse", + "But", + "you", + "never", + "know", + "when", + "either", + "one", + "might", + "run", + "out", + "Dont", + "mess", + "too", + "much", + "with", + "your", + "hair", + "or", + "by", + "the", + "time", + "youre", + "40", + "it", + "will", + "look", + "85", + "Be", + "careful", + "whose", + "advice", + "you", + "buy", + "but", + "be", + "patient", + "with", + "those", + "who", + "supply", + "it", + "Advice", + "is", + "a", + "form", + "of", + "nostalgia", + "Dispensing", + "it", + "is", + "a", + "way", + "of", + "fishing", + "the", + "past", + "from", + "the", + "disposal", + "wiping", + "it", + "off", + "painting", + "over", + "the", + "ugly", + "parts", + "and", + "recycling", + "it", + "for", + "more", + "than", + "its", + "worth", + "But", + "trust", + "me", + "on", + "the", + "sunscreen"}; + +unsigned int quicksort_input_vector[3000] = { + 1681692777, 846930886, 1804289383, 424238335, 1957747793, 1714636915, + 596516649, 1649760492, 719885386, 1350490027, 1025202362, 1189641421, + 2044897763, 1102520059, 783368690, 1540383426, 1365180540, 1967513926, + 35005211, 1303455736, 304089172, 1726956429, 294702567, 521595368, + 278722862, 861021530, 336465782, 468703135, 2145174067, 233665123, + 1315634022, 1801979802, 1101513929, 1125898167, 1369133069, 635723058, + 628175011, 2089018456, 1059961393, 1653377373, 1131176229, 1656478042, + 608413784, 1914544919, 859484421, 1973594324, 1734575198, 756898537, + 1129566413, 2038664370, 149798315, 1424268980, 412776091, 184803526, + 137806862, 749241873, 1911759956, 135497281, 982906996, 42999170, + 1937477084, 2084420925, 511702305, 1159126505, 572660336, 1827336327, + 1100661313, 1632621729, 805750846, 84353895, 1141616124, 1433925857, + 1998898814, 2001100545, 939819582, 1585990364, 610515434, 1548233367, + 1477171087, 760313750, 1374344043, 1889947178, 945117276, 356426808, + 491705403, 709393584, 1780695788, 1474612399, 752392754, 1918502651, + 1411549676, 1264095060, 2053999932, 1984210012, 943947739, 1843993368, + 1469348094, 1749698586, 855636226, 463480570, 1036140795, 1956297539, + 317097467, 1975960378, 2040651434, 927612902, 1376710097, 1892066601, + 1687926652, 603570492, 1330573317, 485560280, 959997301, 660260756, + 1194953865, 593209441, 402724286, 1947346619, 364228444, 894429689, + 1063958031, 270744729, 221558440, 2007905771, 2114738097, 1633108117, + 1610120709, 822890675, 1469834481, 498777856, 631704567, 791698927, + 327254586, 524872353, 1255179497, 1703964683, 269455306, 1572276965, + 160051528, 1600028624, 352406219, 1120048829, 112805732, 2040332871, + 1713258270, 515530019, 378409503, 2077486715, 1409959708, 1573363368, + 200747796, 1631518149, 1373226340, 168002245, 1117142618, 289700723, + 990892921, 439493451, 150122846, 1622597488, 1231192379, 1760243555, + 2147469841, 338888228, 111537764, 269441500, 1911165193, 438792350, + 1869470124, 116087764, 2142757034, 1982275856, 8936987, 155324914, + 350322227, 387346491, 1275373743, 1760281936, 1960709859, 841148365, + 1244316437, 1186452551, 771151432, 213975407, 1476153275, 971899228, + 653468858, 1626276121, 1139901474, 1884661237, 1239036029, 2130794395, + 76065818, 1350573793, 1605908235, 1987231011, 1789366143, 1605894428, + 2103318776, 1784639529, 1875335928, 2112255763, 1939964443, 1597322404, + 352118606, 1067854538, 1432114613, 165344818, 1909002904, 1782436840, + 1351797369, 532670688, 1395235128, 680466996, 1504569917, 492067917, + 159259470, 496987743, 706043324, 1398295499, 480298490, 1359512183, + 601385644, 2086206725, 1096689772, 243268139, 1544617505, 1172755590, + 2027907669, 1272469786, 1012502954, 1820388464, 722308542, 968338082, + 740759355, 6939507, 933110197, 502278611, 1789376348, 1285228804, + 1034949299, 1037127828, 1450573622, 392035568, 1529195746, 654887343, + 889023311, 87755422, 1335354340, 1369321801, 1447267605, 1494613810, + 1308044878, 396473730, 745425661, 705178736, 1569229320, 1346811305, + 1977648522, 434248626, 1590079444, 552473416, 1402586708, 1470503465, + 559412924, 188213258, 1143408282, 201305624, 1473442062, 1884167637, + 1238433452, 776532036, 238962600, 620145550, 1431419379, 1273911899, + 707900973, 619290071, 1665947468, 7684930, 2113903881, 407487131, + 404158660, 711845894, 1776808933, 1973387981, 2058657199, 937370163, + 260152959, 1501252996, 1642548899, 1662739668, 824272813, 1472713773, + 1850952926, 1967681095, 2025187190, 1176911340, 1704365084, 437116466, + 1953443376, 1943327684, 638422090, 1237379107, 1069755936, 1876855542, + 1856669179, 588219756, 349517445, 1823089412, 995706887, 1057418418, + 387451659, 625032172, 1065103348, 298625210, 1562402336, 1469262009, + 1799878206, 1057467587, 1295166342, 476667372, 382697713, 1555319301, + 296864819, 260401255, 1070575321, 2001229904, 697517721, 774044599, + 1797073940, 1335939811, 1950955939, 719346228, 1065311705, 1756915667, + 1307565984, 1414829150, 846811127, 155789224, 324763920, 555996658, + 780821396, 1389867269, 231602422, 195740084, 711645630, 619054081, + 1253207672, 2006811972, 917679292, 1635905385, 1414647625, 570073850, + 1896306640, 337739299, 1046741222, 446340713, 1111783898, 1343606042, + 1782280524, 915256190, 1197352298, 700108581, 524688209, 846942590, + 2114937732, 1371499336, 1566288819, 292218004, 1927495994, 726371155, + 1682085273, 11614769, 882160379, 246247255, 630668850, 1662981776, + 105575579, 1548348142, 1858721860, 1520223205, 2118421993, 964445884, + 1857962504, 1017679567, 452867621, 822262754, 213801961, 201690613, + 1737518944, 1411154259, 648031326, 114723506, 110613202, 282828202, + 1486222842, 1676902021, 982936784, 1266235189, 255789528, 950390868, + 1277849958, 1137949908, 1242608872, 1908518808, 653448036, 777210498, + 1309383303, 364686248, 1023457753, 1280321648, 1329132133, 1129033333, + 150517567, 1781999754, 501772890, 364319529, 1983690368, 212251746, + 1775473788, 484238046, 1034514500, 1886086990, 767066249, 624549797, + 1415505363, 1750003033, 739273303, 1671294892, 552910253, 78012497, + 661761152, 1795519125, 1344247686, 1315209188, 425245975, 474613996, + 1679895436, 1448703729, 235649157, 861543921, 430253414, 1545032460, + 496060028, 932026304, 677870460, 332266748, 1144278050, 828388027, + 816504794, 31308902, 1192707556, 1583571043, 655858699, 820697697, + 1186090428, 1395132002, 559301039, 1739000681, 1473144500, 1974806403, + 1387036159, 669908538, 1498617647, 1812282134, 1144522535, 12895151, + 1113502215, 1380171692, 1328104339, 1543755629, 777720504, 860516127, + 328298285, 1455590964, 1722060049, 1472576335, 136495343, 70636429, + 1503885238, 1329202900, 402903177, 12260289, 2416949, 1219407971, + 1407392292, 561717988, 655495367, 733053144, 389040743, 1841585795, + 1402961682, 1887658390, 1433102829, 400000569, 1900553541, 672655340, + 1780172261, 1081174232, 337453826, 410409117, 1941690360, 1450956042, + 1866000081, 1516266761, 847228023, 2002495425, 1586903190, 1175526309, + 1184214677, 1989806367, 500618996, 1186631626, 1061730690, 2004504234, + 1748349614, 1717226057, 2016764524, 2137390358, 1411328205, 1276673168, + 1877565100, 696947386, 2009726312, 1630634994, 1369602726, 1265204346, + 564325578, 1707056552, 1665204916, 358532290, 1010528946, 1297893529, + 1874799051, 1857756970, 1708302647, 1314218593, 885799631, 1426819080, + 1156541312, 1386418627, 1281830857, 70788355, 1243439214, 318561886, + 1788014412, 1112720090, 1505193512, 1051858969, 241909610, 1106059479, + 1748806355, 104152274, 1095966189, 970925433, 1369356620, 826047641, + 530498338, 887077888, 309198987, 1541027284, 37487770, 873524566, + 1251300606, 1745790417, 1232056856, 2137100237, 1025125849, 959372260, + 1376035217, 159473059, 126107205, 471990783, 478034945, 1282648518, + 1584710873, 1983228458, 1353436873, 1826620483, 941804289, 993967637, + 1930772757, 2037770478, 2045826607, 1152645729, 716334471, 1647149314, + 2039723618, 1025533459, 470591100, 2077211388, 1899058025, 1001089438, + 1675518157, 983631233, 394633074, 553160358, 1943003493, 1645933681, + 712633417, 2069110699, 1635550270, 1190668363, 1204275569, 864101839, + 1026413173, 410228794, 1336092622, 1968217462, 1404196431, 773319847, + 1858504292, 1302539390, 452456682, 427355115, 802205057, 235745791, + 1452888574, 1272796157, 1388391521, 1204462951, 126401947, 1280631491, + 40610537, 521035021, 1210359231, 1983614030, 19485054, 738393740, + 1905241081, 1655035325, 1291554098, 962033002, 371653516, 2004187516, + 1372261796, 1707746139, 1047372231, 628974580, 333582338, 2073785404, + 1931513970, 786039021, 1894519218, 586235379, 1021784812, 1605539862, + 1859031536, 262692685, 2032894977, 1985433483, 1543324176, 1338299904, + 358984857, 606199759, 395279207, 378469911, 1344593499, 435889744, + 2033505236, 488663950, 272020127, 257675105, 345367818, 29777560, + 1965421244, 1392740049, 991810563, 151519934, 1319041805, 216588711, + 937558955, 1066077375, 845563291, 1959343768, 524133589, 629593614, + 74552805, 409544918, 1215828993, 1617876982, 1747844822, 927376882, + 76593093, 2143124030, 765326717, 1421186593, 431530126, 1124311574, + 1909850543, 703550253, 1502781486, 107734713, 733327814, 1388803074, + 1500474762, 1725138377, 1646478179, 672032919, 1941727088, 1464415775, + 1738110294, 639806732, 1615935710, 114760235, 1269400346, 406011017, + 524305153, 337745691, 217871137, 124666328, 1265122573, 292423943, + 120306710, 2030449291, 1910300925, 551836836, 1007277217, 1986894018, + 1255387090, 362575055, 1260596963, 1988714904, 1751378130, 1022963858, + 1566369633, 1250372661, 1130698571, 1360613073, 567304789, 483689685, + 2000419805, 35756851, 1155722604, 1122336503, 441767868, 746349250, + 1460082195, 659639006, 861109485, 577721120, 952062949, 1385414639, + 460686763, 714880226, 1510080967, 1467963981, 554290596, 1630387677, + 1830539036, 1814887560, 34740865, 1434433518, 690367770, 1290127955, + 537322532, 1821066342, 1131359211, 1104627321, 157272379, 550245196, + 1140384172, 1312994984, 1910858270, 1582152040, 2059344234, 1763794427, + 94307398, 772970072, 738647283, 1046370347, 10901063, 51245830, + 1761250573, 1520982030, 628966950, 168057522, 1003886059, 1089653714, + 1982945082, 1038626924, 410134047, 525829204, 181271232, 93189435, + 199411898, 1312630443, 1527622954, 356684278, 1862875640, 2064945486, + 1669679262, 1626250262, 1022089159, 1581539848, 1242561041, 14989683, + 207026272, 1981208324, 1597141723, 217927335, 2032454154, 1691449122, + 1738909365, 513937457, 590335821, 595311776, 1603591171, 204102747, + 1633938701, 2013725218, 372160269, 1815209933, 2106914653, 207621703, + 980356728, 1487053959, 733450907, 695748720, 1404515797, 932862806, + 174515334, 279121308, 1289547084, 1417076376, 294110991, 811742698, + 1250801052, 1891252715, 245798898, 1135771559, 1435218189, 452825171, + 1649709016, 2025554010, 670752506, 1105816539, 82173109, 262178224, + 972058109, 454333378, 857490000, 931489114, 661955081, 343945053, + 271059426, 1395405989, 11671338, 1675575223, 180785147, 992028067, + 1954696532, 1470332231, 1687776787, 101323875, 134591281, 1862292122, + 1992576590, 380390179, 1131884850, 1280311131, 833215350, 235202254, + 1158381494, 1503967857, 1370973813, 1240554603, 1766146081, 873199181, + 1694887982, 476152433, 1979015720, 209359415, 820097487, 803590181, + 1604765404, 831768825, 1735079296, 1785550551, 1823796892, 2006138722, + 1108399134, 1364090032, 1534230297, 1242990415, 1078898506, 1341443181, + 1623380595, 63299708, 1442767057, 309112297, 298501962, 1287859999, + 1813080154, 1669475776, 420687483, 1431742587, 395191309, 1579068977, + 1907895021, 226723382, 672139932, 580508860, 1030313563, 219544266, + 1412277685, 617909211, 428903682, 1088590930, 476564285, 2033669086, + 305197314, 2010794583, 1671735990, 1384095820, 1204754116, 632651476, + 1447395528, 500037525, 1875641892, 1745897490, 1787897525, 1351538839, + 1267889618, 61101360, 1660651136, 1663080928, 1640170337, 1326247643, + 1889804310, 164826621, 610506582, 772634225, 384370888, 370917955, + 1390543437, 813274570, 951426815, 1867107722, 699460008, 216220853, + 1730418657, 223712350, 1304811783, 787689126, 856363827, 1610009097, + 1287726651, 584522071, 846621269, 928140528, 1936060910, 146533149, + 989241888, 1449228398, 1892430639, 481928577, 627992393, 1012836610, + 646755199, 1238498976, 528433890, 1031126087, 1609416931, 270754552, + 1844400657, 413360099, 1043388777, 396377017, 629580952, 286448566, + 620089368, 1934392735, 6072641, 1476453195, 1396918184, 1736491298, + 2060975266, 96055805, 376696776, 1849552528, 242588954, 1664423428, + 1151297278, 2135019593, 445080308, 1779289672, 1000372555, 1434322197, + 870305000, 1528806445, 1916250774, 332238283, 1799560997, 415522325, + 745598382, 695466127, 1446648412, 1375179334, 981914693, 1143565421, + 1162088421, 987987334, 1539942439, 411522957, 576994985, 12548159, + 507578762, 953691761, 1489001354, 750167716, 470631541, 1402492972, + 737703662, 915711850, 1104561852, 1738076217, 202550399, 108375482, + 1119399015, 2118801173, 1887665154, 771476364, 386839851, 610486506, + 1466942491, 1833488263, 942724790, 301373537, 829570037, 1688323172, + 1289360871, 222028828, 916018859, 1866355856, 234576987, 2078107280, + 672563970, 1723578341, 342146590, 1143195511, 978587665, 849725352, + 2058907361, 2083149517, 1599893069, 113974112, 44041351, 190113083, + 85291638, 1931706506, 1928189300, 472131489, 394709364, 900104667, + 158136104, 1337434154, 1671581032, 987706141, 878273679, 991039875, + 1209734969, 1794292538, 1292413412, 1444311956, 1724916170, 434290636, + 1020406649, 2067062760, 153162844, 1998994314, 769304465, 825726814, + 1934660183, 221713886, 1968922326, 1978701535, 411826969, 1880346039, + 1762924393, 192532621, 1994320152, 10150109, 1092637289, 2079611790, + 1347584264, 616734673, 404259631, 78374295, 1607774548, 562395735, + 1872666833, 752704313, 1550101877, 1450099355, 1186994949, 612353198, + 1369678468, 1340157793, 2056665155, 2138982933, 18400960, 929588156, + 213213171, 1987323286, 781098823, 625040140, 1720185677, 568275358, + 817572761, 1567022181, 399493245, 1910210050, 1499150323, 14933990, + 379461075, 1903409954, 25084100, 1987235624, 318322042, 1372668364, + 592456289, 1868423919, 1451042659, 1779451238, 333293469, 1176225844, + 972125383, 242474976, 478841551, 990526343, 1172063133, 1848520019, + 830365981, 1953161956, 1840019304, 403068011, 373953666, 2053232475, + 1970090192, 773446912, 530788967, 1321756868, 788380902, 1348361729, + 1077683174, 813465002, 1111088131, 1396005216, 38649718, 1490549207, + 1116945487, 1489692377, 1330301183, 1450238957, 518434573, 1922757472, + 1692713933, 997276125, 1554725062, 717293418, 698312496, 379366797, + 522971726, 390848153, 1369893141, 896925393, 296596980, 52775474, + 1670372305, 827385948, 455843485, 311269559, 28264029, 278450030, + 1124734562, 1139352160, 1600206898, 1163384280, 482417719, 530406424, + 505593010, 1812718902, 1926411641, 1024027583, 1587992726, 895873480, + 2021303708, 995234140, 198628789, 572132557, 1374600938, 1891342723, + 962980710, 597010431, 461152493, 1259577690, 649785905, 984124220, + 2086963638, 1105629391, 1881049613, 2115227667, 1384079421, 1403938270, + 1107096180, 836802671, 1715207829, 1589513899, 1367209095, 692458743, + 1254749154, 1146137088, 1855843024, 695258232, 2042010569, 213952386, + 1690492373, 93155710, 1237979969, 917609663, 1984498433, 1111800030, + 1514620094, 298167279, 1683932587, 16922351, 1282291499, 499429649, + 1122551742, 1015857464, 1759007339, 359147515, 272312086, 1698487330, + 1195950186, 1987519915, 1666231349, 415675634, 532495011, 625843881, + 1561812722, 240854387, 67874133, 1456339643, 454806773, 1322623287, + 1549495354, 1692786742, 2017881519, 1386510139, 657103124, 1560890244, + 1684677418, 193552063, 331016259, 819485269, 692981712, 1845636353, + 1835342733, 304505404, 1862558705, 2107654819, 2002992734, 837626799, + 1947691087, 1521740435, 1196774315, 332702450, 100669, 245240853, + 573556837, 67974802, 660916487, 1028363610, 1390598089, 75245562, + 573666704, 1260995960, 1531585205, 1230769829, 674402557, 933596911, + 1424321892, 1005418816, 172623403, 2117303605, 703571522, 1857300821, + 274325361, 418646579, 529302443, 129834447, 1256273378, 217161528, + 1651574882, 305564045, 177332700, 1651675551, 550804899, 2125023787, + 1719650353, 1211721386, 310242589, 962764794, 1286966948, 883799426, + 76277107, 671068506, 1912163036, 750679664, 1604665417, 338346092, + 1756098480, 1777288820, 1569115921, 312186354, 1487105994, 845954166, + 730832933, 2016408437, 815774123, 1987106312, 86086317, 1090099484, + 145186709, 263419017, 1219933931, 695991608, 240959156, 724025165, + 1907712995, 551201745, 228217069, 1047196295, 1435001171, 1947867422, + 1718264801, 1199680559, 763148569, 1175446571, 1538026652, 839425676, + 805251743, 959658925, 1590105340, 144874089, 1805613091, 1198720172, + 13798878, 473903566, 1510906527, 99885196, 1564003050, 94255812, + 363304213, 636453333, 2081362124, 604263370, 1360478499, 79065186, + 1155465115, 1588695568, 775056794, 442982639, 1389079342, 535286141, + 1642663198, 4744263, 1582482437, 1033206202, 844169939, 1153263590, + 1992865128, 286791631, 181226513, 1650994571, 1485511804, 986478257, + 2124898138, 848934683, 1131352346, 1541417540, 943190495, 1145151225, + 30387226, 877068972, 1245036421, 1390865725, 956134158, 1608340634, + 832077645, 1731190952, 65120356, 73673339, 118993446, 1220585472, + 78417603, 1701475883, 1663568111, 922587542, 707255825, 1158747661, + 1209379174, 888482339, 44470216, 547407330, 1874960596, 2037335344, + 1396342013, 858829294, 1540846267, 192048860, 2003980519, 1518260757, + 1069117832, 1101533292, 912194650, 2025251990, 562390279, 942581876, + 1608959295, 627510635, 185963953, 1727952741, 1848096107, 1018041598, + 1281944976, 1364180570, 1091714937, 1989200801, 375444584, 1170132540, + 730199492, 419914800, 2092720083, 457676440, 309766496, 1154615609, + 1316505735, 1850612763, 1702022939, 1173002606, 1221389873, 950881304, + 127052251, 2133584523, 1142930164, 689442530, 928682751, 64564349, + 1316953165, 1114646704, 2089816339, 1017565625, 2132688302, 1551291986, + 234262547, 1076919591, 1131761079, 609707131, 99568484, 266222407, + 1029621931, 44804919, 107939561, 1339388427, 1199420528, 838139053, + 1042517543, 753959819, 1295815494, 116423768, 1704841123, 464837581, + 102524643, 700287639, 1637840187, 1031207394, 764851988, 1764892438, + 2145854098, 707184680, 306851320, 2131058752, 110993018, 1623804486, + 1060494695, 1242754098, 493886463, 1160063179, 1508976505, 728149010, + 1204868098, 1616916066, 1337856142, 256804978, 307571472, 219994425, + 1010764797, 1603386966, 1559382853, 568122272, 2068224547, 454416748, + 1268409912, 1558581086, 570840516, 2033261900, 1175989877, 673365159, + 592962932, 1482841197, 1704572553, 703955951, 959162035, 1702943003, + 1946710049, 1453048498, 1686518107, 1308202906, 33713861, 599529154, + 777635325, 1371570003, 1759592334, 1085206797, 1591564428, 816976784, + 541110115, 1003463633, 1073781763, 461851014, 1457880381, 2084546560, + 2020432100, 2028720897, 505185185, 1048938329, 554602408, 1773595097, + 384295879, 111691313, 1659373349, 1343457914, 1814634316, 104852634, + 649022765, 1353668775, 808808585, 682736626, 1953197930, 608034986, + 2054306629, 1565306616, 1916237892, 1498387409, 234799752, 546389569, + 354367395, 1308581515, 1631596366, 1812247776, 1245644428, 25222833, + 1693485026, 1750829613, 487073847, 100603786, 1376941062, 360022300, + 212295100, 888830763, 1408960629, 2026929416, 993683397, 1793256508, + 1233114544, 1802491982, 989230775, 1038828826, 263043320, 1638253540, + 456651794, 31797565, 173506518, 691451546, 578187134, 80329499, + 2000033062, 62299853, 1578716908, 1098193842, 87522686, 1933084303, + 701539807, 574596534, 1597848432, 2078480869, 934618834, 1143849810, + 819827984, 196095815, 1244453596, 1813511382, 1989352324, 1456748696, + 1468519716, 831099451, 1336194465, 1731563037, 321869343, 421825361, + 1763360602, 495375861, 1460654187, 194064088, 575705360, 1917305981, + 256363941, 6938620, 461273879, 343886628, 1940022924, 313823293, + 918483162, 1390387708, 1412017135, 1853101996, 386753870, 2113556942, + 2049197811, 1631207466, 2044554163, 1891066487, 940472515, 716898500, + 574682290, 129183332, 382926234, 896551633, 551008693, 1851445950, + 1391927494, 2011662880, 1435525339, 1967632854, 1781485213, 1051402293, + 1974571475, 95275444, 1245466382, 1767110751, 409098738, 1501830323, + 1010014811, 1821115873, 1845716951, 1396768681, 1787189168, 616716465, + 880492499, 1684259683, 322334813, 1820965014, 253674535, 224048977, + 1950148346, 636600769, 2115115464, 353673391, 340563072, 542314107, + 217852623, 1776088411, 1438865740, 1999337836, 680007057, 683309587, + 2094613281, 1925473439, 503458793, 356228371, 1279820114, 330546620, + 29860596, 978053418, 2097657371, 1817049764, 1594769883, 960188534, + 1353825800, 1917104697, 209473567, 1607500335, 2141153674, 1089966067, + 96617457, 2108785490, 763447433, 437180529, 503615949, 566112132, + 65785292, 1942481690, 919785523, 745792349, 478307629, 1137638147, + 523782140, 981766422, 989492335, 1803602255, 1312313043, 936621968, + 634172025, 1262486766, 1292850339, 81458260, 75191653, 1322710936, + 1998562957, 284665220, 992277052, 1992232983, 1374631287, 198619204, + 1953534826, 2138078721, 1806119540, 309667127, 556707205, 1902736997, + 104665169, 1476492728, 192433878, 582972798, 466647227, 258219170, + 1564739221, 1456139563, 1004011520, 729568616, 245277883, 1527793660, + 1992055382, 1538128223, 1183912267, 2067247035, 713355511, 1818084292, + 204428608, 1705632563, 1899542553, 1579059895, 1904251768, 1750621862, + 1569654968, 1562887660, 1595371198, 2126362173, 1318141009, 1401422376, + 1455371254, 1510574887, 1711089503, 1922018481, 1768794057, 1815754673, + 1230674396, 625321929, 251243823, 1475952280, 5631942, 1815983044, + 866596855, 1189544209, 398068012, 1579952366, 860144854, 242639747, + 1138101281, 612203759, 162403134, 894869401, 215341973, 366831742, + 310273413, 1810713171, 1945891638, 1628414422, 1064651899, 1368062958, + 991505661, 628257755, 1346941484, 612816071, 296528780, 654829090, + 1238138000, 547772603, 429363923, 1243769942, 216272000, 1660038320, + 285830504, 614340012, 988506952, 1145975358, 856979759, 1855103807, + 1758179117, 1019382894, 1287572525, 1973521090, 1386214636, 278190158, + 1636750614, 1184622626, 1173059560, 553918865, 405201937, 1483332973, + 1182176620, 1752143421, 964263748, 1478705400, 259488863, 1955769409, + 2026478004, 688852786, 421101832, 95266356, 201407458, 1659239833, + 709606368, 1189914410, 755526127, 1566586128, 897534569, 1041356631, + 438485374, 37623446, 39848341, 1824700010, 315813605, 1798027458, + 861838989, 1488873165, 1624064901, 1267040926, 824722490, 1113331867, + 871700699, 1788986238, 1667250732, 1131189562, 1597272000, 701943705, + 1820042348, 2018373832, 33165457, 2021449807, 1530130017, 2059643461, + 1063880569, 138172497, 7426169, 1961415139, 1179529128, 717032538, + 1999038585, 1219377470, 136135018, 167368542, 869921280, 574620392, + 1656241707, 346502533, 251836754, 333480550, 1459834400, 1113675743, + 2122466788, 979601485, 233233021, 1572255140, 1681545190, 1104933720, + 1443145325, 1714710647, 88639634, 825791694, 1626870461, 1908681983, + 963964191, 1634296630, 1782648142, 2143493320, 203845520, 699045063, + 1215387142, 339980538, 512976554, 2085308422, 914600930, 364531492, + 284327308, 1166437685, 531900034, 1744161708, 132629780, 40658094, + 576279545, 365862802, 374138644, 110341087, 1470796522, 349121784, + 1825051735, 1559436157, 1921376925, 1304438548, 1320634492, 1217038602, + 791251530, 955798986, 2042830296, 995097051, 1654844049, 859310840, + 1335077589, 20336956, 855320512, 102194872, 384868448, 2070707654, + 1268632557, 916768482, 2008532428, 1401262337, 957426576, 145376088, + 1767125139, 1331565220, 1889537797, 1090438014, 1680687005, 318333694, + 502390523, 1454580282, 428674782, 1823025015, 524135236, 106242869, + 631340353, 419481884, 1410681417, 138700754, 1278792724, 54449299, + 159037710, 2134113236, 1049546350, 543906158, 2057337242, 237140292, + 1460674641, 1918386023, 339335164, 270617569, 2063762111, 1607967721, + 1602182790, 1805816260, 861746410, 1135386147, 2124149955, 481387902, + 442482781, 405341089, 1571825916, 966618017, 511583958, 2074216439, + 1386099901, 1922265375, 1749757806, 517408978, 1976714674, 233614511, + 504038566, 878777377, 372315265, 413892161, 1115917669, 531352976, + 184794536, 1455252833, 1075259134, 101072999, 915736906, 388450127, + 1906889260, 1777483316, 659067697, 1883555567, 111387570, 113766839, + 141413008, 1683213486, 1249152986, 652996966, 1609946277, 1691635767, + 427778693, 1212220435, 510770136, 257009719, 1445834946, 1896870037, + 1135787096, 1818150212, 266795367, 104221117, 202019540, 770833934, + 1559473950, 1277278674, 1184726095, 327727208, 1665728802, 1369520631, + 2105210525, 177312851, 1470593630, 69114447, 291079690, 1229999242, + 1752327934, 1540232676, 966071161, 1214790563, 1084384795, 1107484169, + 279527351, 1595154931, 1760481135, 1725362297, 1344541320, 40776180, + 1396028861, 1611336688, 297785900, 1598048401, 234686974, 1433572996, + 727843428, 1419413069, 1537794114, 246088582, 641450052, 949784416, + 423401433, 2112043682, 1277511625, 714481123, 1194559277, 1235238502, + 107230151, 13146790, 1304352949, 1191614946, 1120630960, 909197235, + 639286229, 733628447, 2123987799, 1983827549, 774404628, 256031502, + 1447680589, 1072190528, 1981393799, 1682367563, 358279876, 1229939013, + 954296984, 1896073990, 680503766, 1595747036, 698374759, 1408347194, + 1560307071, 1975886384, 1654435776, 607382700, 1063641238, 2077837209, + 620529490, 220510539, 644834684, 1741160450, 1129707775, 752064835, + 327305250, 1106211926, 1943679781, 1101709878, 1362243428, 435482362, + 26416758, 1196153579, 271826264, 384696634, 278608944, 1719506853, + 133286977, 959112711, 1254390769, 831661736, 219976257, 61204105, + 660064472, 1874412034, 1656951142, 1723705710, 1804765595, 1069774565, + 1944216249, 302116632, 1677157265, 926440376, 1054181467, 150203107, + 2032652302, 850377601, 1891363558, 1247412082, 1285859963, 71185160, + 296082014, 1557686227, 1172895038, 574690958, 1129709433, 1199311796, + 1533803669, 236616554, 1584008430, 1753779927, 297820659, 1717295407, + 1480708313, 1954771801, 401473495, 1137990260, 877062718, 1061537967, + 1440106892, 406736335, 637760029, 346804712, 556939443, 434492631, + 1197182313, 300819353, 1360933007, 335558628, 372004513, 1246101662, + 1893244856, 1544899551, 346030096, 875470641, 596727699, 642112110, + 1112087195, 33252481, 1216803069, 1409907854, 1750547889, 603123090, + 1217196008, 4537736, 209419369, 2094258726, 1066075704, 1690127682, + 353511414, 1703835733, 680634295, 910450857, 2138328364, 2120741187, + 1211270210, 1351777724, 320062251, 1583274723, 450395738, 1517244564, + 980690626, 796425834, 1852803193, 1577418325, 1438537945, 1598564401, + 1610670806, 507857366, 326551394, 1213735047, 1110980456, 1438638589, + 1218272784, 1320399826, 701062795, 136864840, 863043860, 1918258803, + 1840700573, 1543678155, 1865033882, 1831545290, 1516935695, 71061648, + 1035839366, 1836997946, 981512505, 1486235104, 1206758863, 45299067, + 135177290, 912078408, 1628573790, 1573715235, 363159161, 461780768, + 2081572601, 689710555, 2039199093, 1045069410, 2128349144, 1502386251, + 217985588, 681928291, 568637651, 1081029448, 452703447, 1786910435, + 477223956, 170253681, 1923775275, 1994159651, 241315329, 1616992200, + 1683673949, 1222827834, 1301053842, 742949164, 1268126901, 189409560, + 1655027572, 749217043, 1675644664, 2018186733, 1210997811, 1810821955, + 560413640, 1102713256, 1237053542, 541279136, 457615859, 1171142496, + 1223207428, 1026253510, 68728258, 1675910875, 665680297, 286713846, + 1846164556, 441971924, 1367743294, 2087479885, 2058964125, 1844967250, + 1162824071, 1212534319, 1691643253, 283467324, 1401943880, 1227833555, + 1032684367, 930104896, 1970782719, 96198530, 593443203, 1478326644, + 1198911786, 1830496746, 1349029729, 1656527645, 854155594, 1909443370, + 535297508, 922883852, 303238858, 1200977805, 1209597698, 1526446286, + 1642949730, 429857344, 1054873513, 1554430207, 127340947, 753554421, + 619480878, 1818984200, 693550658, 2021424758, 899334107, 1856374729, + 804046007, 722633179, 2139842053, 1397489210, 53476175, 1025042772, + 1080502308, 1402505904, 1121241302, 1934657902, 1164465626, 172669440, + 710058106, 1467704485, 1829197086, 1919655804, 846667123, 217010946, + 202029501, 1901540637, 1417988751, 329370448, 507611410, 913454833, + 871000, 1201162069, 320401392, 900205108, 910053150, 939882271, + 1622838287, 902411556, 813823381, 1676314462, 1927454328, 1617869388, + 931336718, 901211983, 867874951, 2095802345, 1073881423, 1948377259, + 1416023182, 755594861, 1735551514, 115206657, 972605807, 298125972, + 2016747294, 243110911, 70298129, 376875057, 1156565744, 272327630, + 1578037126, 1476967137, 601698078, 340606628, 269365760, 602569078, + 1243018184, 1083189141, 1502774186, 1022988865, 553574882, 978128825, + 1924200848, 1421449833, 506959639, 850598623, 1222343444, 1438296358, + 1606193485, 810411310, 1386615055, 431315644, 1108537283, 655154589, + 674426555, 1178835412, 770361246, 1830992300, 1451163042, 639624893, + 1160475789, 2052861120, 1016499950, 1429841549, 507946550, 447053428, + 365547042, 2010720737, 787660056, 919121924, 841365914, 2030678241, + 193088109, 1348325554, 906183458, 1415431554, 639138264, 682900658, + 78359216, 2025753319, 1533499281, 1186896499, 533424260, 992209118, + 218248263, 1303785506, 1423524763, 1669411305, 1943410399, 2097951318, + 1574788777, 812426701, 1781459970, 2082735328, 1259480129, 794452111, + 1945972417, 2047140186, 76810012, 639854683, 1930334779, 442357055, + 1988180237, 689034589, 1361478979, 479834853, 1371935247, 1554567089, + 358104524, 757950880, 822514995, 891528784, 1750159999, 900874211, + 47830643, 1026201114, 2087770711, 1991241042, 976668784, 158535326, + 656184096, 610645107, 1827946632, 1915664225, 1405097218, 1255251761, + 1815320763, 1481907231, 1190503441, 1598171894, 1924264286, 988992210, + 139722835, 1138259617, 1628846894, 1511658082, 545343058, 1469543483, + 122125315, 1367858053, 1949378337, 1872285314, 121248617, 159999213, + 751002780, 61535680, 1051527998, 1727671564, 220071006, 1099358641, + 190833023, 2048017638, 943116035, 1595930242, 1155785752, 1599300131, + 930353825, 198805545, 1367480709, 707134463, 1187797756, 1035317824, + 1845394080, 669161002, 486006071, 243253491, 2138704485, 625728906, + 1611111544, 1940599174, 2137386989, 1732360161, 2100598388, 112028656, + 1793895841, 1004642738, 1984313970, 2013966848, 2104001379, 587833102, + 1914500838, 899633766, 168021018, 922802942, 351450250, 358854042, + 1121608488, 1718930959, 1954784284, 161922596, 606765135, 737654461, + 831083598, 1092771206, 1444788924, 822304435, 1718500113, 1142699356, + 615419962, 1708403454, 1385952847, 568534702, 1820432110, 849580744, + 1573177440, 1657262432, 434457257, 1529695171, 97611886, 80869451, + 281845289, 265632904, 2094836299, 633295539, 624486946, 1861853489, + 204742850, 431787582, 637172784, 811507986, 1169442043, 1758781272, + 1904279192, 466747319, 1920703868, 1475295657, 1609446676, 604303818, + 1036215463, 847915875, 1426608253, 709163925, 1697496619, 2042028215, + 218942709, 2131953877, 463079269, 316554595, 65339680, 2036256709, + 582187500, 12692331, 1418468232, 1206674446, 1874545820, 1700313522, + 1638462029, 364234956, 186125413, 660420424, 2123016228, 390868264, + 1127167744, 1896236448, 1202376250, 589130772, 353056618, 959171794, + 1437046647, 1779664872, 286983804, 987059619, 1674209439, 1323199267, + 971529848, 2137288709, 2032363193, 1036869528, 2026061770, 103822254, + 1049561859, 1297046355, 420376850, 776624031, 849876229, 1002564350, + 1140858988, 1036001642, 61755148, 1116391568, 1426869906, 1700217177, + 865144369, 481762508, 213153954, 1218200987, 1440934303, 1340321698, + 850382211, 1727918107, 1929452470, 377108003, 903633726, 1219015469, + 366913064, 788513271, 58591440, 245491186, 892335526, 1030121288, + 1542537541, 1312712376, 2066990816, 244930122, 167793078, 969069027, + 1280931765, 229548226, 1745693059, 560318023, 1929765404, 739068399, + 1042080532, 2142919358, 1855459967, 335531187, 1335757408, 573120688, + 2063449294, 1117726230, 1791321676, 819599372, 189258051, 494220239, + 1608112644, 247849492, 871328242, 352964522, 1277970780, 1238241306, + 1665676898, 1197477949, 1483732493, 1833469976, 19063328, 878786386, + 2063018202, 1764756387, 1123716509, 1845299958, 356341138, 257164626, + 1840735668, 64317458, 817482649, 1029009428, 637438146, 1859563181, + 2146735658, 281276174, 47610720, 188510062, 775496414, 2111060014, + 436359554, 1646824656, 783175739, 1714330334, 737582315, 243804735, + 764324635, 73831160, 596769257, 783387964, 952617546, 114962507, + 400660703, 2076334055, 1948432483, 757001842, 186015033, 1863967037, + 821319300, 1003497683, 1561783348, 1458757446, 715577216, 1255035368, + 1740033621, 763187937, 136561149, 368046387, 726764303, 135813159, + 2014871043, 1509940042, 324323221, 604969710, 1753744777, 760682775, + 678800870, 203030386, 327529462, 1631418417, 317992893, 1091854097, + 1560268824, 118941728, 1875242061, 1746283858, 1982908766, 128419117, + 602297893, 1397208466, 885420959, 1317875109, 504760186, 1706740259, + 2081063046, 641321335, 1018014057, 660343702, 777134495, 610564030, + 22800096, 1101457716, 978610417, 1776544874, 1862140492, 845997813, + 1979575260, 42186306, 1450967523, 150084506, 1134040403, 2129768394, + 269026234, 861798817, 1613703163, 104451352, 990217934, 1026488339, + 1501659818, 1875638893, 625288549, 2006420005, 1434895504, 1227586442, + 500257692, 305425913, 397977904, 1277392187, 915989944, 331557302, + 231366256, 1894600361, 991901004, 2093506748, 593114526, 1014701101, + 2135693054, 2044082050, 643762327, 1122249809, 2026366796, 475853939, + 1984048626, 1492586311, 625938445, 826782912, 371591002, 894964680, + 554938157, 996879552, 999416032, 1989833661, 76982346, 353592203, + 147775927, 474960250, 212528560, 1063765871, 806517553, 712786252, + 810882584, 1798418557, 1990178440, 1403997111, 665636010, 74061048, + 1300595513, 1309398337, 20084148, 1179478661, 1785252277, 8293554, + 524581324, 263707074, 1130543363, 896172326, 1158671754, 967108342, + 1893051878, 10604139, 1793891254, 1970034225, 364196342, 201345764, + 297510827, 576724902, 43695777, 1104028380, 1289511154, 191471704, + 754963290, 1132205946, 1255237575, 1420599300, 1206266994, 2066120160, + 582513990, 1226351142, 1322633623, 220282619, 1234644696, 475745488, + 483989693, 217704412, 1655224149, 1642661448, 1184812754, 32321825, + 1653265587, 831220360, 928494151, 2017461929, 1032566124, 674062382, + 446703183, 1076261902, 496612959, 1736214337, 1267733606, 794123786, + 720936636, 375487534, 1898152167, 1927203630, 294124046, 505631809, + 1006071125, 1616757669, 1926231109, 93232173, 2092503157, 361261451, + 310936585, 1600243658, 581544070, 1495749339, 1632565483, 1065533764, + 179486052, 413575986, 560711564, 1212052176, 1087638368, 66493503, + 140830430, 1584251327, 2083955432, 1408564037, 230891466, 383174967, + 1784051571, 2129043633, 2119389304, 2078175617, 487191794, 692842292, + 1547449638, 265939255, 472562275, 1492469147, 627200707, 1478633400, + 945229157, 1208744777, 1571865573, 430310992, 126794893, 1882802159, + 843886978, 687506457, 1231067850, 1931525347, 753999960, 1410553902, + 1368293026, 690471744, 475122431, 1599184492, 1073646711, 615952861, + 1580744477, 1045552368, 2024516898, 2067936271, 1738394660, 1661084821, + 186391879, 63473287, 1591776790, 813592586, 1542106687, 991742780, + 2022337363, 966488613, 336728279, 1648609, 701807124, 1281957436, + 689155066, 1932874974, 1712268428, 1443155027, 1195945229, 408671759, + 2133626771, 1671067660, 192713458, 1059789835, 139536873, 1561006484, + 2105342203, 16570124, 1012707329, 1696253215, 1677654945, 445968158, + 1759726503, 1121948088, 366420782, 1154349542, 2113690868, 552812661, + 2120838155, 302935500, 1366405247, 675161631, 1584892936, 1241258962, + 460552958, 1149677717, 1242907571, 1656498187, 1558349476, 1932062638, + 1180082199, 1751062934, 1227734017, 1319619072, 1164585770, 1213877140}; diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/math_private.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/math_private.h new file mode 100644 index 0000000..27b1467 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/math_private.h @@ -0,0 +1,66 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + unsigned int word; +} quicksort_ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define QUICKSORT_GET_FLOAT_WORD(i, d) \ + { \ + quicksort_ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define QUICKSORT_SET_FLOAT_WORD(d, i) \ + { \ + quicksort_ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.c new file mode 100644 index 0000000..bf78e0c --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.c @@ -0,0 +1,249 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +/* + Include section +*/ + +#include "quicksort.h" +#include "quicksortlibm.h" +#include "quicksortstdlib.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "input.c" +#include "quicksortlibm.c" +#include "quicksortstdlib.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void quicksort_init(void); +__attribute__((always_inline)) static inline int quicksort_return(void); +__attribute__((always_inline)) static inline void +quicksort_str(char *, unsigned long, unsigned long); +__attribute__((always_inline)) static inline void +quicksort_vec(char *, unsigned long, unsigned long); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +quicksort_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +extern const char *quicksort_input_string[681]; +char quicksort_strings[681][20]; + +extern unsigned int quicksort_input_vector[1000 * 3]; +struct quicksort_3DVertexStruct quicksort_vectors[1000]; + +volatile int quicksort_const_prop_border_i = 0; +volatile char quicksort_const_prop_border_c = 0; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +quicksort_init(void) { + unsigned int i, j; + unsigned int x, y, z; + unsigned int read_counter = 0; + + /* constant propagation border */ + __pragma_loopbound(3000, 3000); + for (i = 0; i < 3000; i++) + quicksort_input_vector[i] += quicksort_const_prop_border_i; + + /* Init arrays */ + __pragma_loopbound(681, 681); + for (i = 0; i < 681; i++) { + __pragma_loopbound(1, 20); + for (j = 0; j < 20 - 1; j++) { + quicksort_strings[i][j] = quicksort_input_string[i][j]; + quicksort_strings[i][j] += quicksort_const_prop_border_c; + + if (quicksort_input_string[i][j] == '\0') + break; + } + + /* Terminate with '\0' anyways. */ + quicksort_strings[i][20 - 1] = '\0'; + } + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) { + x = quicksort_vectors[i].x = quicksort_input_vector[read_counter++]; + y = quicksort_vectors[i].y = quicksort_input_vector[read_counter++]; + z = quicksort_vectors[i].z = quicksort_input_vector[read_counter++]; + + quicksort_vectors[i].distance = quicksort_sqrt( + quicksort_pow(x, 2) + quicksort_pow(y, 2) + quicksort_pow(z, 2)); + } +} + +__attribute__((always_inline)) static inline int +quicksort_return(void) { + int checksum = 0; + + checksum += quicksort_strings[42][1] + quicksort_vectors[42].x + + quicksort_vectors[42].y + quicksort_vectors[42].z; + + return (checksum); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +quicksort_str(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pn; + + __pragma_loopbound(0, 8); + while (n > 1) { + if (n > 10) + pi = quicksort_pivot_strings(a, n, es); + else + pi = a + (n >> 1) * es; + + quicksort_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + + __pragma_loopbound(0, 169); + while (1) { + __pragma_loopbound(1, 26); + do + pi += es; + while ((pi < pn) && (quicksort_compare_strings(pi, a) < 0)); + + __pragma_loopbound(1, 23); + do + pj -= es; + while ((pj > a) && (quicksort_compare_strings(pj, a) > 0)); + + if (pj < pi) + break; + quicksort_swapi(pi, pj, es); + } + quicksort_swapi(a, pj, es); + j = (pj - a) / es; + n = n - j - 1; + + if (j >= n) { + quicksort_str(a, j, es); + a += (j + 1) * es; + } else { + quicksort_str(a + (j + 1) * es, n, es); + n = j; + } + } +} + +__attribute__((always_inline)) static inline void +quicksort_vec(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pn; + + __pragma_loopbound(0, 15); + while (n > 1) { + if (n > 10) + pi = quicksort_pivot_vectors(a, n, es); + else + pi = a + (n >> 1) * es; + + quicksort_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + + __pragma_loopbound(1, 250); + while (1) { + __pragma_loopbound(1, 51); + do + pi += es; + while ((pi < pn) && (quicksort_compare_vectors(pi, a) < 0)); + + __pragma_loopbound(1, 27); + do + pj -= es; + while ((pj > a) && (quicksort_compare_vectors(pj, a) > 0)); + + if (pj < pi) + break; + + quicksort_swapi(pi, pj, es); + } + + quicksort_swapi(a, pj, es); + j = (pj - a) / es; + n = n - j - 1; + + if (j >= n) { + quicksort_vec(a, j, es); + a += (j + 1) * es; + } else { + quicksort_vec(a + (j + 1) * es, n, es); + n = j; + } + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +quicksort_main(void) { + _Pragma("marker recursivecall") + _Pragma("flowrestriction 1*quicksort_str <= 521*recursivecall") + quicksort_str(*quicksort_strings, 681, sizeof(char[20])); + + _Pragma("marker recursivecall2") + _Pragma("flowrestriction 1*quicksort_vec <= 650*recursivecall2") + quicksort_vec((char *) quicksort_vectors, 1000, + sizeof(struct quicksort_3DVertexStruct)); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + quicksort_init(); + quicksort_main(); + + return (quicksort_return() - 1527923179 != 0); +} diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.h new file mode 100644 index 0000000..bc91ea9 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksort.h @@ -0,0 +1,10 @@ + +#ifndef __QUICKSORT_H +#define __QUICKSORT_H + +struct quicksort_3DVertexStruct { + unsigned int x, y, z; + double distance; +}; + +#endif diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.c new file mode 100644 index 0000000..6f08ded --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.c @@ -0,0 +1,1128 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +#include "quicksortlibm.h" +#include "math_private.h" + +// Often used variables/consts + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_one = 1.0f, + quicksort_half = 5.0000000000e-01f, /* 0x3f000000 */ + quicksort_zero = 0.0f, quicksort_huge = 1.0e30, quicksort_tiny = 1.0e-30f, + quicksort_two = 2.0, quicksort_two24 = 16777216.0; /* 0x4b800000 */ + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_bp[] = + { + 1.0f, + 1.5f, +}, + quicksort_dp_h[] = + { + 0.0f, + 5.84960938e-01f, +}, /* 0x3f15c000 */ + quicksort_dp_l[] = + { + 0.0f, + 1.56322085e-06f, +}, /* 0x35d1cfdc */ + quicksort_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + quicksort_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + quicksort_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + quicksort_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + quicksort_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + quicksort_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + quicksort_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + quicksort_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + quicksort_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + quicksort_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + quicksort_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + quicksort_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + quicksort_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + quicksort_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + quicksort_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + quicksort_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + quicksort_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + quicksort_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + quicksort_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + quicksort_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + quicksort_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___ieee754_powf(float x, float y) +#else +__attribute__((always_inline)) static inline float +quicksort___ieee754_powf(x, y) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int i, j, k, yisint, n; + int hx, hy, ix, iy, is; + + QUICKSORT_GET_FLOAT_WORD(hx, x); + QUICKSORT_GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if (iy == 0) + return (quicksort_one); + + /* x==+-1 */ + if (x == 1.0f) + return (quicksort_one); + if ((x == -1.0f) && quicksort_isinf(y)) + return (quicksort_one); + + /* +-NaN return x+y */ + if ((ix > 0x7f800000) || (iy > 0x7f800000)) + return (x + y); + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if (hx < 0) { + if (iy >= 0x4b800000) + yisint = 2; /* even integer y */ + else if (iy >= 0x3f800000) { + k = (iy >> 23) - 0x7f; /* exponent */ + j = iy >> (23 - k); + + if ((j << (23 - k)) == iy) + yisint = 2 - (j & 1); + } + } + + /* special value of y */ + if (iy == 0x7f800000) { /* y is +-inf */ + if (ix == 0x3f800000) + return (y - y); /* inf**+-1 is NaN */ + else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ + return ((hy >= 0) ? y : quicksort_zero); + else /* (|x|<1)**-,+inf = inf,0 */ + return ((hy < 0) ? -y : quicksort_zero); + } + if (iy == 0x3f800000) { /* y is +-1 */ + if (hy < 0) + return (quicksort_one / x); + else + return (x); + } + if (hy == 0x40000000) + return (x * x); /* y is 2 */ + if (hy == 0x3f000000) { /* y is 0.5 */ + if (hx >= 0) /* x >= +0 */ + return (quicksort___ieee754_sqrtf(x)); + } + + ax = quicksort_fabsf(x); + /* special value of x */ + if ((ix == 0x7f800000) || (ix == 0) || (ix == 0x3f800000)) { + z = ax; /*x is +-0,+-inf,+-1*/ + if (hy < 0) + z = quicksort_one / z; /* z = (1/|x|) */ + if (hx < 0) { + if (((ix - 0x3f800000) | yisint) == 0) + z = (z - z) / (z - z); /* (-1)**non-int is NaN */ + else + + if (yisint == 1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + + return (z); + } + + /* (x<0)**(non-int) is NaN */ + if (((((unsigned int) hx >> 31) - 1) | yisint) == 0) + return ((x - x) / (x - x)); + + /* |y| is huge */ + if (iy > 0x4d000000) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if (ix < 0x3f7ffff8) + return ((hy < 0) ? quicksort_huge * quicksort_huge + : quicksort_tiny * quicksort_tiny); + if (ix > 0x3f800007) + return ((hy > 0) ? quicksort_huge * quicksort_huge + : quicksort_tiny * quicksort_tiny); + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = (t * t) * + ((float) 0.5f - t * ((float) 0.333333333333f - t * (float) 0.25f)); + u = quicksort_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * quicksort_ivln2_l - w * quicksort_ivln2; + t1 = u + v; + QUICKSORT_GET_FLOAT_WORD(is, t1); + QUICKSORT_SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = v - (t1 - u); + } else { + float s2, s_h, s_l, t_h, t_l; + + n = 0; + /* take care subnormal number */ + if (ix < 0x00800000) { + ax *= quicksort_two24; + n -= 24; + QUICKSORT_GET_FLOAT_WORD(ix, ax); + } + n += ((ix) >> 23) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if (j <= 0x1cc471) + k = 0; /* |x|> 1) | 0x20000000) + 0x0040000 + + (k << 21)); + t_l = ax - (t_h - quicksort_bp[k]); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * + (quicksort_L1 + + s2 * (quicksort_L2 + + s2 * (quicksort_L3 + + s2 * (quicksort_L4 + + s2 * (quicksort_L5 + s2 * quicksort_L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = (float) 3.0f + s2 + r; + QUICKSORT_GET_FLOAT_WORD(is, t_h); + QUICKSORT_SET_FLOAT_WORD(t_h, is & 0xfffff000); + t_l = r - ((t_h - (float) 3.0f) - s2); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + QUICKSORT_GET_FLOAT_WORD(is, p_h); + QUICKSORT_SET_FLOAT_WORD(p_h, is & 0xfffff000); + p_l = v - (p_h - u); + z_h = quicksort_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = quicksort_cp_l * p_h + p_l * quicksort_cp + quicksort_dp_l[k]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (float) n; + t1 = (((z_h + z_l) + quicksort_dp_h[k]) + t); + QUICKSORT_GET_FLOAT_WORD(is, t1); + QUICKSORT_SET_FLOAT_WORD(t1, is & 0xfffff000); + t2 = z_l - (((t1 - t) - quicksort_dp_h[k]) - z_h); + } + + s = quicksort_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if (((((unsigned int) hx >> 31) - 1) | (yisint - 1)) == 0) + s = -quicksort_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + QUICKSORT_GET_FLOAT_WORD(is, y); + QUICKSORT_SET_FLOAT_WORD(y1, is & 0xfffff000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + QUICKSORT_GET_FLOAT_WORD(j, z); + if (j > 0x43000000) /* if z > 128 */ + return (s * quicksort_huge * quicksort_huge); /* overflow */ + else + + if (j == 0x43000000) { /* if z == 128 */ + if (p_l + quicksort_ovt > z - p_h) + return (s * quicksort_huge * quicksort_huge); /* overflow */ + } else + + if ((j & 0x7fffffff) > 0x43160000) /* z <= -150 */ + return (s * quicksort_tiny * quicksort_tiny); /* underflow */ + else + + if ((unsigned int) j == 0xc3160000) { /* z == -150 */ + if (p_l <= z - p_h) + return (s * quicksort_tiny * quicksort_tiny); /* underflow */ + } + + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = (i >> 23) - 0x7f; + n = 0; + if (i > 0x3f000000) { /* if |z| > 0.5, set n = [ z+0.5 ] */ + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7fffffff) >> 23) - 0x7f; /* new k for n */ + QUICKSORT_SET_FLOAT_WORD(t, n & ~(0x007fffff >> k)); + n = ((n & 0x007fffff) | 0x00800000) >> (23 - k); + if (j < 0) + n = -n; + p_h -= t; + } + t = p_l + p_h; + QUICKSORT_GET_FLOAT_WORD(is, t); + QUICKSORT_SET_FLOAT_WORD(t, is & 0xfffff000); + u = t * quicksort_lg2_h; + v = (p_l - (t - p_h)) * quicksort_lg2 + t * quicksort_lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - + t * (quicksort_P1 + + t * (quicksort_P2 + + t * (quicksort_P3 + t * (quicksort_P4 + t * quicksort_P5)))); + r = (z * t1) / (t1 - quicksort_two) - (w + z * w); + z = quicksort_one - (r - z); + QUICKSORT_GET_FLOAT_WORD(j, z); + j += (n << 23); + if ((j >> 23) <= 0) + z = quicksort___scalbnf(z, n); /* subnormal output */ + else + QUICKSORT_SET_FLOAT_WORD(z, j); + + return (s * z); +} + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___ieee754_sqrtf(float x) +#else +__attribute__((always_inline)) static inline float +quicksort___ieee754_sqrtf(x) +float x; +#endif +{ + float z; + int sign = (int) 0x80000000; + int ix, s, q, m, t, i; + unsigned int r; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + + /* take care of Inf and NaN */ + if ((ix & 0x7f800000) == 0x7f800000) + return (x * x + x); /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + + /* take care of zero */ + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return (x); /* sqrt(+-0) = +-0 */ + else + + if (ix < 0) + return ((x - x) / (x - x)); /* sqrt(-ve) = sNaN */ + } + + /* normalize x */ + m = (ix >> 23); + if (m == 0) { /* subnormal x */ + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [ m/2 ] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if (ix != 0) { + z = quicksort_one - quicksort_tiny; /* trigger inexact flag */ + if (z >= quicksort_one) { + z = quicksort_one + quicksort_tiny; + if (z > quicksort_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + QUICKSORT_SET_FLOAT_WORD(z, ix); + + return (z); +} + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___copysignf(float x, float y) +#else +__attribute__((always_inline)) static inline float +quicksort___copysignf(x, y) +float x, y; +#endif +{ + unsigned int ix, iy; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + QUICKSORT_GET_FLOAT_WORD(iy, y); + QUICKSORT_SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + + return (x); +} + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int quicksort_npio2_hw[] = { +#else +int quicksort_npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + quicksort_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + quicksort_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + quicksort_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + quicksort_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + quicksort_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + quicksort_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline int +quicksort___ieee754_rem_pio2f(float x, float *y) +#else +__attribute__((always_inline)) static inline int +quicksort___ieee754_rem_pio2f(x, y) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + int i, j, n, ix, hx; + + QUICKSORT_GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + + return (0); + } + + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - quicksort_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - quicksort_pio2_1t; + y[1] = (z - y[0]) - quicksort_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= quicksort_pio2_2; + y[0] = z - quicksort_pio2_2t; + y[1] = (z - y[0]) - quicksort_pio2_2t; + } + return (1); + } else { /* negative x */ + z = x + quicksort_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + quicksort_pio2_1t; + y[1] = (z - y[0]) + quicksort_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += quicksort_pio2_2; + y[0] = z + quicksort_pio2_2t; + y[1] = (z - y[0]) + quicksort_pio2_2t; + } + return (-1); + } + } + + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = quicksort_fabsf(x); + n = (int) (t * quicksort_invpio2 + quicksort_half); + fn = (float) n; + r = t - fn * quicksort_pio2_1; + w = fn * quicksort_pio2_1t; /* 1st round good to 40 bit */ + + if ((n < 32) && ((int) (ix & 0xffffff00) != quicksort_npio2_hw[n - 1])) + y[0] = r - w; /* quick check no cancellation */ + else { + unsigned int high; + + j = ix >> 23; + y[0] = r - w; + QUICKSORT_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * quicksort_pio2_2; + r = t - w; + w = fn * quicksort_pio2_2t - ((t - r) - w); + y[0] = r - w; + QUICKSORT_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * quicksort_pio2_3; + r = t - w; + w = fn * quicksort_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return (-n); + } else + return (n); + } + + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return (0); + } + + y[0] = y[1] = x - x; /* dummy initialization */ + return (0); /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + quicksort_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + quicksort_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + quicksort_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + quicksort_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + quicksort_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___kernel_cosf(float x, float y) +#else +__attribute__((always_inline)) static inline float +quicksort___kernel_cosf(x, y) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return (quicksort_one); /* generate inexact */ + } + + z = x * x; + r = z * (quicksort_C1 + + z * (quicksort_C2 + + z * (quicksort_C3 + + z * (quicksort_C4 + + z * (quicksort_C5 + z * quicksort_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return (quicksort_one - ((float) 0.5f * z - (z * r - x * y))); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + else { + QUICKSORT_SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = quicksort_one - qx; + return (a - (hz - (z * r - x * y))); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + quicksort_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + quicksort_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + quicksort_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + quicksort_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + quicksort_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___kernel_sinf(float x, float y, int iy) +#else +__attribute__((always_inline)) static inline float +quicksort___kernel_sinf(x, y, iy) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return (x); /* generate inexact */ + } + + z = x * x; + v = z * x; + r = quicksort_S2 + + z * (quicksort_S3 + + z * (quicksort_S4 + z * (quicksort_S5 + z * quicksort_S6))); + + if (iy == 0) + return (x + v * (quicksort_S1 + z * r)); + else + return (x - + ((z * (quicksort_half * y - v * r) - y) - v * quicksort_S1)); +} + +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float quicksort_atanhi[] = { +#else +float quicksort_atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float quicksort_atanlo[] = { +#else +float quicksort_atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float quicksort_aT[] = { +#else +float quicksort_aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___atanf(float x) +#else +__attribute__((always_inline)) static inline float +quicksort___atanf(x) +float x; +#endif +{ + float w, s1, s2, z; + int ix, hx, id; + + QUICKSORT_GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix >= 0x50800000) { /* if |x| >= 2^34 */ + if (ix > 0x7f800000) + return (x + x); /* NaN */ + if (hx > 0) + return (quicksort_atanhi[3] + quicksort_atanlo[3]); + else + return (-quicksort_atanhi[3] - quicksort_atanlo[3]); + } + if (ix < 0x3ee00000) { /* |x| < 0.4375 */ + if (ix < 0x31000000) { /* |x| < 2^-29 */ + if (quicksort_huge + x > quicksort_one) + return (x); /* raise inexact */ + } + id = -1; + } else { + x = quicksort_fabsf(x); + if (ix < 0x3f980000) { /* |x| < 1.1875 */ + if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ((float) 2.0f * x - quicksort_one) / ((float) 2.0f + x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = (x - quicksort_one) / (x + quicksort_one); + } + } else { + if (ix < 0x401c0000) { /* |x| < 2.4375 */ + id = 2; + x = (x - (float) 1.5f) / (quicksort_one + (float) 1.5f * x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -(float) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * (quicksort_aT[0] + + w * (quicksort_aT[2] + + w * (quicksort_aT[4] + + w * (quicksort_aT[6] + + w * (quicksort_aT[8] + w * quicksort_aT[10]))))); + s2 = w * (quicksort_aT[1] + + w * (quicksort_aT[3] + + w * (quicksort_aT[5] + + w * (quicksort_aT[7] + w * quicksort_aT[9])))); + + if (id < 0) + return (x - x * (s1 + s2)); + else { + z = quicksort_atanhi[id] - ((x * (s1 + s2) - quicksort_atanlo[id]) - x); + return ((hx < 0) ? -z : z); + } +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___cosf(float x) +#else +__attribute__((always_inline)) static inline float +quicksort___cosf(x) +float x; +#endif +{ + float y[2], z = 0.0f; + int n, ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return (quicksort___kernel_cosf(x, z)); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return (x - x); + + /* argument reduction needed */ + else { + n = quicksort___ieee754_rem_pio2f(x, y); + + switch (n & 3) { + case 0: + return (quicksort___kernel_cosf(y[0], y[1])); + case 1: + return (-quicksort___kernel_sinf(y[0], y[1], 1)); + case 2: + return (-quicksort___kernel_cosf(y[0], y[1])); + default: + return (quicksort___kernel_sinf(y[0], y[1], 1)); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___sinf(float x) +#else +__attribute__((always_inline)) static inline float +quicksort___sinf(x) +float x; +#endif +{ + float y[2], z = 0.0; + int n, ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return (quicksort___kernel_sinf(x, z, 0)); + + /* sin(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return (x - x); + + /* argument reduction needed */ + else { + n = quicksort___ieee754_rem_pio2f(x, y); + + switch (n & 3) { + case 0: + return (quicksort___kernel_sinf(y[0], y[1], 1)); + case 1: + return (quicksort___kernel_cosf(y[0], y[1])); + case 2: + return (-quicksort___kernel_sinf(y[0], y[1], 1)); + default: + return (-quicksort___kernel_cosf(y[0], y[1])); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___fabsf(float x) +#else +__attribute__((always_inline)) static inline float +quicksort___fabsf(x) +float x; +#endif +{ + unsigned int ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + QUICKSORT_SET_FLOAT_WORD(x, ix & 0x7fffffff); + return (x); +} + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif + quicksort_two25 = 3.355443200e+07f, /* 0x4c000000 */ + quicksort_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +quicksort___scalbnf(float x, int n) +#else +__attribute__((always_inline)) static inline float +quicksort___scalbnf(x, n) +float x; +int n; +#endif +{ + int k, ix; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((ix & 0x7fffffff) == 0) + return (x); /* +-0 */ + x *= quicksort_two25; + QUICKSORT_GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + + if (k == 0xff) + return (x + x); /* NaN or Inf */ + k = k + n; + if ((n > 50000) || (k > 0xfe)) + /* overflow */ + return (quicksort_huge * quicksort___copysignf(quicksort_huge, x)); + if (n < -50000) + /* underflow */ + return (quicksort_tiny * quicksort___copysignf(quicksort_tiny, x)); + if (k > 0) { /* normal result */ + QUICKSORT_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return (x); + } + + if (k <= -25) + /* underflow */ + return (quicksort_tiny * quicksort___copysignf(quicksort_tiny, x)); + k += 25; /* subnormal result */ + QUICKSORT_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return (x * quicksort_twom25); +} + +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ +__attribute__((always_inline)) static inline int +quicksort___isinff(float x) { + int ix, t; + + QUICKSORT_GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return (~(t >> 31) & (ix >> 30)); +} diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.h new file mode 100644 index 0000000..aa613b8 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortlibm.h @@ -0,0 +1,67 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See quicksortlibm.c + +*/ + +#ifndef __QUICKSORTLIBM +#define __QUICKSORTLIBM + +// The following defines map the math functions to specialized calls +#define quicksort_acos quicksort___ieee754_acosf +#define quicksort_atan quicksort___atanf +#define quicksort_cos quicksort___cosf +#define quicksort_fabs quicksort___fabsf +#define quicksort_fabsf quicksort___fabsf +#define quicksort_isinf quicksort___isinff +#define quicksort_pow quicksort___ieee754_powf +#define quicksort_sqrt quicksort___ieee754_sqrtf +#define quicksort_log10 quicksort___ieee754_log10f +#define quicksort_log quicksort___ieee754_logf +#define quicksort_sin quicksort___sinf + +__attribute__((always_inline)) static inline float quicksort___atanf(float); +__attribute__((always_inline)) static inline float quicksort___copysignf(float, + float); +__attribute__((always_inline)) static inline float quicksort___cosf(float); +__attribute__((always_inline)) static inline float quicksort___fabsf(float); +__attribute__((always_inline)) static inline float quicksort___floorf(float); +__attribute__((always_inline)) static inline float +quicksort___ieee754_acosf(float); +__attribute__((always_inline)) static inline float +quicksort___ieee754_powf(float, float); +__attribute__((always_inline)) static inline int +quicksort___ieee754_rem_pio2f(float, float *); +__attribute__((always_inline)) static inline float +quicksort___ieee754_sqrtf(float); +__attribute__((always_inline)) static inline int quicksort___isinff(float); +__attribute__((always_inline)) static inline float +quicksort___kernel_cosf(float, float); +__attribute__((always_inline)) static inline float +quicksort___kernel_sinf(float, float, int); +__attribute__((always_inline)) static inline int +quicksort___kernel_rem_pio2f(float *, float *, int, int, int, const int *); +__attribute__((always_inline)) static inline float quicksort___scalbnf(float, + int); +__attribute__((always_inline)) static inline float +quicksort___ieee754_logf(float); +__attribute__((always_inline)) static inline float +quicksort___ieee754_log10f(float); +__attribute__((always_inline)) static inline float quicksort___sinf(float); + +#endif // __QUICKSORTLIBM diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.c b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.c new file mode 100644 index 0000000..733fcd8 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.c @@ -0,0 +1,134 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +#include "quicksort.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int +quicksort_strcmp(const char *str1, const char *str2) { + __pragma_loopbound(0, 11); + while (*str1 && (*str1 == *str2)) + ++str1, ++str2; + + return (*(const unsigned char *) str1 - *(const unsigned char *) str2); +} + +__attribute__((always_inline)) static inline int +quicksort_compare_strings(const char *elem1, const char *elem2) { + int result; + + result = quicksort_strcmp(elem1, elem2); + + return ((result < 0) ? 1 : ((result == 0) ? 0 : -1)); +} + +__attribute__((always_inline)) static inline int +quicksort_compare_vectors(const char *elem1, const char *elem2) { + /* D = [ (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 ]^(1/2) */ + /* sort based on distances from the origin... */ + + double distance1, distance2; + + distance1 = (*((struct quicksort_3DVertexStruct *) elem1)).distance; + distance2 = (*((struct quicksort_3DVertexStruct *) elem2)).distance; + + return ((distance1 > distance2) ? 1 : ((distance1 == distance2) ? 0 : -1)); +} + +__attribute__((always_inline)) static inline void +quicksort_swapi(char *ii, char *ij, unsigned long es) { + char *i, *j, c; + + i = (char *) ii; + j = (char *) ij; + + __pragma_loopbound(20, 24); + do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof(char); + } while (es != 0); +} + +__attribute__((always_inline)) static inline char * +quicksort_pivot_strings(char *a, unsigned long n, unsigned long es) { + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + + if (quicksort_compare_strings(pi, pj) < 0) { + if (quicksort_compare_strings(pi, pk) < 0) { + if (quicksort_compare_strings(pj, pk) < 0) + return (pj); + return (pk); + } + return (pi); + } + + if (quicksort_compare_strings(pj, pk) < 0) { + if (quicksort_compare_strings(pi, pk) < 0) + return (pi); + return (pk); + } + + return (pj); +} + +__attribute__((always_inline)) static inline char * +quicksort_pivot_vectors(char *a, unsigned long n, unsigned long es) { + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + + if (quicksort_compare_vectors(pi, pj) < 0) { + if (quicksort_compare_vectors(pi, pk) < 0) { + if (quicksort_compare_vectors(pj, pk) < 0) + return (pj); + return (pk); + } + return (pi); + } + + if (quicksort_compare_vectors(pj, pk) < 0) { + if (quicksort_compare_vectors(pi, pk) < 0) + return (pi); + return (pk); + } + + return (pj); +} diff --git a/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.h b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.h new file mode 100644 index 0000000..fda3b71 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/generated/modified_sources/inline/quicksortstdlib.h @@ -0,0 +1,38 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + +#ifndef __QUICKSORTSTDLIB_H +#define __QUICKSORTSTDLIB_H + +__attribute__((always_inline)) static inline int +quicksort_compare_strings(const char *, const char *); +__attribute__((always_inline)) static inline int +quicksort_compare_vectors(const char *, const char *); +__attribute__((always_inline)) static inline void +quicksort_swapi(char *, char *, unsigned long); +__attribute__((always_inline)) static inline char * +quicksort_pivot_strings(char *, unsigned long, unsigned long); +__attribute__((always_inline)) static inline char * +quicksort_pivot_vectors(char *, unsigned long, unsigned long); + +#endif diff --git a/targets/wasm-tacle/kernel/quicksort/input.c b/targets/wasm-tacle/kernel/quicksort/input.c new file mode 100755 index 0000000..a66b020 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/input.c @@ -0,0 +1,605 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + + +const char *quicksort_input_string[ 681 ] = { + "Kurt", "Vonneguts", "Commencement", "Address", "at", "MIT", "Ladies", "and", + "gentlemen", "of", "the", "class", "of", "97", "Wear", "sunscreen", "If", "I", + "could", "offer", "you", "only", "one", "tip", "for", "the", "future", + "sunscreen", "would", "be", "it", "The", "longterm", "benefits", "of", + "sunscreen", "have", "been", "proved", "by", "scientists", "whereas", "the", + "rest", "of", "my", "advice", "has", "no", "basis", "more", "reliable", + "than", "my", "own", "meandering", "experience", "I", "will", "dispense", + "this", "advice", "now", "Enjoy", "the", "power", "and", "beauty", "of", + "your", "youth", "Oh", "never", "mind", "You", "will", "not", "understand", + "the", "power", "and", "beauty", "of", "your", "youth", "until", "theyve", + "faded", "But", "trust", "me", "in", "20", "years", "youll", "look", "back", + "at", "photos", "of", "yourself", "and", "recall", "in", "a", "way", "you", + "cant", "grasp", "now", "how", "much", "possibility", "lay", "before", "you", + "and", "how", "fabulous", "you", "really", "looked", "You", "are", "not", + "as", "fat", "as", "you", "imagine", "Dont", "worry", "about", "the", + "future", "Or", "worry", "but", "know", "that", "worrying", "is", "as", + "effective", "as", "trying", "to", "solve", "an", "algebra", "equation", "by", + "chewing", "bubble", "gum", "The", "real", "troubles", "in", "your", "life", + "are", "apt", "to", "be", "things", "that", "never", "crossed", "your", + "worried", "mind", "the", "kind", "that", "blindside", "you", "at", "4", "pm", + "on", "some", "idle", "Tuesday", "Do", "one", "thing", "every", "day", "that", + "scares", "you", "Sing", "Dont", "be", "reckless", "with", "other", "peoples", + "hearts", "Dont", "put", "up", "with", "people", "who", "are", "reckless", + "with", "yours", "Floss", "Dont", "waste", "your", "time", "on", "jealousy", + "Sometimes", "youre", "ahead", "sometimes", "youre", "behind", "The", "race", + "is", "long", "and", "in", "the", "end", "its", "only", "with", "yourself", + "Remember", "compliments", "you", "receive", "Forget", "the", "insults", "If", + "you", "succeed", "in", "doing", "this", "tell", "me", "how", "Keep", "your", + "old", "love", "letters", "Throw", "away", "your", "old", "bank", + "statements", "Stretch", "Dont", "feel", "guilty", "if", "you", "dont", + "know", "what", "you", "want", "to", "do", "with", "your", "life", "The", + "most", "interesting", "people", "I", "know", "didnt", "know", "at", "22", + "what", "they", "wanted", "to", "do", "with", "their", "lives", "Some", "of", + "the", "most", "interesting", "40yearolds", "I", "know", "still", "dont", + "Get", "plenty", "of", "calcium", "Be", "kind", "to", "your", "knees", + "Youll", "miss", "them", "when", "theyre", "gone", "Maybe", "youll", "marry", + "maybe", "you", "wont", "Maybe", "youll", "have", "children", "maybe", "you", + "wont", "Maybe", "youll", "divorce", "at", "40", "maybe", "youll", "dance", + "the", "funky", "chicken", "on", "your", "75th", "wedding", "anniversary", + "Whatever", "you", "do", "dont", "congratulate", "yourself", "too", "much", + "or", "berate", "yourself", "either", "Your", "choices", "are", "half", + "chance", "So", "are", "everybody", "elses", "Enjoy", "your", "body", "Use", + "it", "every", "way", "you", "can", "Dont", "be", "afraid", "of", "it", "or", + "of", "what", "other", "people", "think", "of", "it", "Its", "the", + "greatest", "instrument", "youll", "ever", "own", "Dance", "even", "if", + "you", "have", "nowhere", "to", "do", "it", "but", "your", "living", "room", + "Read", "the", "directions", "even", "if", "you", "dont", "follow", "them", + "Do", "not", "read", "beauty", "magazines", "They", "will", "only", "make", + "you", "feel", "ugly", "Get", "to", "know", "your", "parents", "You", "never", + "know", "when", "theyll", "be", "gone", "for", "good", "Be", "nice", "to", + "your", "siblings", "Theyre", "your", "best", "link", "to", "your", "past", + "and", "the", "people", "most", "likely", "to", "stick", "with", "you", "in", + "the", "future", "Understand", "that", "friends", "come", "and", "go", "but", + "with", "a", "precious", "few", "you", "should", "hold", "on", "Work", "hard", + "to", "bridge", "the", "gaps", "in", "geography", "and", "lifestyle", + "because", "the", "older", "you", "get", "the", "more", "you", "need", "the", + "people", "who", "knew", "you", "when", "you", "were", "young", "Live", "in", + "New", "York", "City", "once", "but", "leave", "before", "it", "makes", "you", + "hard", "Live", "in", "Northern", "California", "once", "but", "leave", + "before", "it", "makes", "you", "soft", "Travel", "Accept", "certain", + "inalienable", "truths", "Prices", "will", "rise", "Politicians", "will", + "philander", "You", "too", "will", "get", "old", "And", "when", "you", "do", + "youll", "fantasize", "that", "when", "you", "were", "young", "prices", + "were", "reasonable", "politicians", "were", "noble", "and", "children", + "respected", "their", "elders", "Respect", "your", "elders", "Dont", "expect", + "anyone", "else", "to", "support", "you", "Maybe", "you", "have", "a", + "trust", "fund", "Maybe", "youll", "have", "a", "wealthy", "spouse", "But", + "you", "never", "know", "when", "either", "one", "might", "run", "out", + "Dont", "mess", "too", "much", "with", "your", "hair", "or", "by", "the", + "time", "youre", "40", "it", "will", "look", "85", "Be", "careful", "whose", + "advice", "you", "buy", "but", "be", "patient", "with", "those", "who", + "supply", "it", "Advice", "is", "a", "form", "of", "nostalgia", "Dispensing", + "it", "is", "a", "way", "of", "fishing", "the", "past", "from", "the", + "disposal", "wiping", "it", "off", "painting", "over", "the", "ugly", "parts", + "and", "recycling", "it", "for", "more", "than", "its", "worth", "But", + "trust", "me", "on", "the", "sunscreen" +}; + +unsigned int quicksort_input_vector[ 3000 ] = { + 1681692777, 846930886, 1804289383, 424238335, 1957747793, 1714636915, + 596516649, 1649760492, 719885386, 1350490027, 1025202362, 1189641421, + 2044897763, 1102520059, 783368690, 1540383426, 1365180540, 1967513926, + 35005211, 1303455736, 304089172, 1726956429, 294702567, 521595368, + 278722862, 861021530, 336465782, 468703135, 2145174067, 233665123, + 1315634022, 1801979802, 1101513929, 1125898167, 1369133069, 635723058, + 628175011, 2089018456, 1059961393, 1653377373, 1131176229, 1656478042, + 608413784, 1914544919, 859484421, 1973594324, 1734575198, 756898537, + 1129566413, 2038664370, 149798315, 1424268980, 412776091, 184803526, + 137806862, 749241873, 1911759956, 135497281, 982906996, 42999170, + 1937477084, 2084420925, 511702305, 1159126505, 572660336, 1827336327, + 1100661313, 1632621729, 805750846, 84353895, 1141616124, 1433925857, + 1998898814, 2001100545, 939819582, 1585990364, 610515434, 1548233367, + 1477171087, 760313750, 1374344043, 1889947178, 945117276, 356426808, + 491705403, 709393584, 1780695788, 1474612399, 752392754, 1918502651, + 1411549676, 1264095060, 2053999932, 1984210012, 943947739, 1843993368, + 1469348094, 1749698586, 855636226, 463480570, 1036140795, 1956297539, + 317097467, 1975960378, 2040651434, 927612902, 1376710097, 1892066601, + 1687926652, 603570492, 1330573317, 485560280, 959997301, 660260756, + 1194953865, 593209441, 402724286, 1947346619, 364228444, 894429689, + 1063958031, 270744729, 221558440, 2007905771, 2114738097, 1633108117, + 1610120709, 822890675, 1469834481, 498777856, 631704567, 791698927, + 327254586, 524872353, 1255179497, 1703964683, 269455306, 1572276965, + 160051528, 1600028624, 352406219, 1120048829, 112805732, 2040332871, + 1713258270, 515530019, 378409503, 2077486715, 1409959708, 1573363368, + 200747796, 1631518149, 1373226340, 168002245, 1117142618, 289700723, + 990892921, 439493451, 150122846, 1622597488, 1231192379, 1760243555, + 2147469841, 338888228, 111537764, 269441500, 1911165193, 438792350, + 1869470124, 116087764, 2142757034, 1982275856, 8936987, 155324914, + 350322227, 387346491, 1275373743, 1760281936, 1960709859, 841148365, + 1244316437, 1186452551, 771151432, 213975407, 1476153275, 971899228, + 653468858, 1626276121, 1139901474, 1884661237, 1239036029, 2130794395, + 76065818, 1350573793, 1605908235, 1987231011, 1789366143, 1605894428, + 2103318776, 1784639529, 1875335928, 2112255763, 1939964443, 1597322404, + 352118606, 1067854538, 1432114613, 165344818, 1909002904, 1782436840, + 1351797369, 532670688, 1395235128, 680466996, 1504569917, 492067917, + 159259470, 496987743, 706043324, 1398295499, 480298490, 1359512183, + 601385644, 2086206725, 1096689772, 243268139, 1544617505, 1172755590, + 2027907669, 1272469786, 1012502954, 1820388464, 722308542, 968338082, + 740759355, 6939507, 933110197, 502278611, 1789376348, 1285228804, + 1034949299, 1037127828, 1450573622, 392035568, 1529195746, 654887343, + 889023311, 87755422, 1335354340, 1369321801, 1447267605, 1494613810, + 1308044878, 396473730, 745425661, 705178736, 1569229320, 1346811305, + 1977648522, 434248626, 1590079444, 552473416, 1402586708, 1470503465, + 559412924, 188213258, 1143408282, 201305624, 1473442062, 1884167637, + 1238433452, 776532036, 238962600, 620145550, 1431419379, 1273911899, + 707900973, 619290071, 1665947468, 7684930, 2113903881, 407487131, + 404158660, 711845894, 1776808933, 1973387981, 2058657199, 937370163, + 260152959, 1501252996, 1642548899, 1662739668, 824272813, 1472713773, + 1850952926, 1967681095, 2025187190, 1176911340, 1704365084, 437116466, + 1953443376, 1943327684, 638422090, 1237379107, 1069755936, 1876855542, + 1856669179, 588219756, 349517445, 1823089412, 995706887, 1057418418, + 387451659, 625032172, 1065103348, 298625210, 1562402336, 1469262009, + 1799878206, 1057467587, 1295166342, 476667372, 382697713, 1555319301, + 296864819, 260401255, 1070575321, 2001229904, 697517721, 774044599, + 1797073940, 1335939811, 1950955939, 719346228, 1065311705, 1756915667, + 1307565984, 1414829150, 846811127, 155789224, 324763920, 555996658, + 780821396, 1389867269, 231602422, 195740084, 711645630, 619054081, + 1253207672, 2006811972, 917679292, 1635905385, 1414647625, 570073850, + 1896306640, 337739299, 1046741222, 446340713, 1111783898, 1343606042, + 1782280524, 915256190, 1197352298, 700108581, 524688209, 846942590, + 2114937732, 1371499336, 1566288819, 292218004, 1927495994, 726371155, + 1682085273, 11614769, 882160379, 246247255, 630668850, 1662981776, + 105575579, 1548348142, 1858721860, 1520223205, 2118421993, 964445884, + 1857962504, 1017679567, 452867621, 822262754, 213801961, 201690613, + 1737518944, 1411154259, 648031326, 114723506, 110613202, 282828202, + 1486222842, 1676902021, 982936784, 1266235189, 255789528, 950390868, + 1277849958, 1137949908, 1242608872, 1908518808, 653448036, 777210498, + 1309383303, 364686248, 1023457753, 1280321648, 1329132133, 1129033333, + 150517567, 1781999754, 501772890, 364319529, 1983690368, 212251746, + 1775473788, 484238046, 1034514500, 1886086990, 767066249, 624549797, + 1415505363, 1750003033, 739273303, 1671294892, 552910253, 78012497, + 661761152, 1795519125, 1344247686, 1315209188, 425245975, 474613996, + 1679895436, 1448703729, 235649157, 861543921, 430253414, 1545032460, + 496060028, 932026304, 677870460, 332266748, 1144278050, 828388027, + 816504794, 31308902, 1192707556, 1583571043, 655858699, 820697697, + 1186090428, 1395132002, 559301039, 1739000681, 1473144500, 1974806403, + 1387036159, 669908538, 1498617647, 1812282134, 1144522535, 12895151, + 1113502215, 1380171692, 1328104339, 1543755629, 777720504, 860516127, + 328298285, 1455590964, 1722060049, 1472576335, 136495343, 70636429, + 1503885238, 1329202900, 402903177, 12260289, 2416949, 1219407971, + 1407392292, 561717988, 655495367, 733053144, 389040743, 1841585795, + 1402961682, 1887658390, 1433102829, 400000569, 1900553541, 672655340, + 1780172261, 1081174232, 337453826, 410409117, 1941690360, 1450956042, + 1866000081, 1516266761, 847228023, 2002495425, 1586903190, 1175526309, + 1184214677, 1989806367, 500618996, 1186631626, 1061730690, 2004504234, + 1748349614, 1717226057, 2016764524, 2137390358, 1411328205, 1276673168, + 1877565100, 696947386, 2009726312, 1630634994, 1369602726, 1265204346, + 564325578, 1707056552, 1665204916, 358532290, 1010528946, 1297893529, + 1874799051, 1857756970, 1708302647, 1314218593, 885799631, 1426819080, + 1156541312, 1386418627, 1281830857, 70788355, 1243439214, 318561886, + 1788014412, 1112720090, 1505193512, 1051858969, 241909610, 1106059479, + 1748806355, 104152274, 1095966189, 970925433, 1369356620, 826047641, + 530498338, 887077888, 309198987, 1541027284, 37487770, 873524566, + 1251300606, 1745790417, 1232056856, 2137100237, 1025125849, 959372260, + 1376035217, 159473059, 126107205, 471990783, 478034945, 1282648518, + 1584710873, 1983228458, 1353436873, 1826620483, 941804289, 993967637, + 1930772757, 2037770478, 2045826607, 1152645729, 716334471, 1647149314, + 2039723618, 1025533459, 470591100, 2077211388, 1899058025, 1001089438, + 1675518157, 983631233, 394633074, 553160358, 1943003493, 1645933681, + 712633417, 2069110699, 1635550270, 1190668363, 1204275569, 864101839, + 1026413173, 410228794, 1336092622, 1968217462, 1404196431, 773319847, + 1858504292, 1302539390, 452456682, 427355115, 802205057, 235745791, + 1452888574, 1272796157, 1388391521, 1204462951, 126401947, 1280631491, + 40610537, 521035021, 1210359231, 1983614030, 19485054, 738393740, + 1905241081, 1655035325, 1291554098, 962033002, 371653516, 2004187516, + 1372261796, 1707746139, 1047372231, 628974580, 333582338, 2073785404, + 1931513970, 786039021, 1894519218, 586235379, 1021784812, 1605539862, + 1859031536, 262692685, 2032894977, 1985433483, 1543324176, 1338299904, + 358984857, 606199759, 395279207, 378469911, 1344593499, 435889744, + 2033505236, 488663950, 272020127, 257675105, 345367818, 29777560, + 1965421244, 1392740049, 991810563, 151519934, 1319041805, 216588711, + 937558955, 1066077375, 845563291, 1959343768, 524133589, 629593614, + 74552805, 409544918, 1215828993, 1617876982, 1747844822, 927376882, + 76593093, 2143124030, 765326717, 1421186593, 431530126, 1124311574, + 1909850543, 703550253, 1502781486, 107734713, 733327814, 1388803074, + 1500474762, 1725138377, 1646478179, 672032919, 1941727088, 1464415775, + 1738110294, 639806732, 1615935710, 114760235, 1269400346, 406011017, + 524305153, 337745691, 217871137, 124666328, 1265122573, 292423943, + 120306710, 2030449291, 1910300925, 551836836, 1007277217, 1986894018, + 1255387090, 362575055, 1260596963, 1988714904, 1751378130, 1022963858, + 1566369633, 1250372661, 1130698571, 1360613073, 567304789, 483689685, + 2000419805, 35756851, 1155722604, 1122336503, 441767868, 746349250, + 1460082195, 659639006, 861109485, 577721120, 952062949, 1385414639, + 460686763, 714880226, 1510080967, 1467963981, 554290596, 1630387677, + 1830539036, 1814887560, 34740865, 1434433518, 690367770, 1290127955, + 537322532, 1821066342, 1131359211, 1104627321, 157272379, 550245196, + 1140384172, 1312994984, 1910858270, 1582152040, 2059344234, 1763794427, + 94307398, 772970072, 738647283, 1046370347, 10901063, 51245830, + 1761250573, 1520982030, 628966950, 168057522, 1003886059, 1089653714, + 1982945082, 1038626924, 410134047, 525829204, 181271232, 93189435, + 199411898, 1312630443, 1527622954, 356684278, 1862875640, 2064945486, + 1669679262, 1626250262, 1022089159, 1581539848, 1242561041, 14989683, + 207026272, 1981208324, 1597141723, 217927335, 2032454154, 1691449122, + 1738909365, 513937457, 590335821, 595311776, 1603591171, 204102747, + 1633938701, 2013725218, 372160269, 1815209933, 2106914653, 207621703, + 980356728, 1487053959, 733450907, 695748720, 1404515797, 932862806, + 174515334, 279121308, 1289547084, 1417076376, 294110991, 811742698, + 1250801052, 1891252715, 245798898, 1135771559, 1435218189, 452825171, + 1649709016, 2025554010, 670752506, 1105816539, 82173109, 262178224, + 972058109, 454333378, 857490000, 931489114, 661955081, 343945053, + 271059426, 1395405989, 11671338, 1675575223, 180785147, 992028067, + 1954696532, 1470332231, 1687776787, 101323875, 134591281, 1862292122, + 1992576590, 380390179, 1131884850, 1280311131, 833215350, 235202254, + 1158381494, 1503967857, 1370973813, 1240554603, 1766146081, 873199181, + 1694887982, 476152433, 1979015720, 209359415, 820097487, 803590181, + 1604765404, 831768825, 1735079296, 1785550551, 1823796892, 2006138722, + 1108399134, 1364090032, 1534230297, 1242990415, 1078898506, 1341443181, + 1623380595, 63299708, 1442767057, 309112297, 298501962, 1287859999, + 1813080154, 1669475776, 420687483, 1431742587, 395191309, 1579068977, + 1907895021, 226723382, 672139932, 580508860, 1030313563, 219544266, + 1412277685, 617909211, 428903682, 1088590930, 476564285, 2033669086, + 305197314, 2010794583, 1671735990, 1384095820, 1204754116, 632651476, + 1447395528, 500037525, 1875641892, 1745897490, 1787897525, 1351538839, + 1267889618, 61101360, 1660651136, 1663080928, 1640170337, 1326247643, + 1889804310, 164826621, 610506582, 772634225, 384370888, 370917955, + 1390543437, 813274570, 951426815, 1867107722, 699460008, 216220853, + 1730418657, 223712350, 1304811783, 787689126, 856363827, 1610009097, + 1287726651, 584522071, 846621269, 928140528, 1936060910, 146533149, + 989241888, 1449228398, 1892430639, 481928577, 627992393, 1012836610, + 646755199, 1238498976, 528433890, 1031126087, 1609416931, 270754552, + 1844400657, 413360099, 1043388777, 396377017, 629580952, 286448566, + 620089368, 1934392735, 6072641, 1476453195, 1396918184, 1736491298, + 2060975266, 96055805, 376696776, 1849552528, 242588954, 1664423428, + 1151297278, 2135019593, 445080308, 1779289672, 1000372555, 1434322197, + 870305000, 1528806445, 1916250774, 332238283, 1799560997, 415522325, + 745598382, 695466127, 1446648412, 1375179334, 981914693, 1143565421, + 1162088421, 987987334, 1539942439, 411522957, 576994985, 12548159, + 507578762, 953691761, 1489001354, 750167716, 470631541, 1402492972, + 737703662, 915711850, 1104561852, 1738076217, 202550399, 108375482, + 1119399015, 2118801173, 1887665154, 771476364, 386839851, 610486506, + 1466942491, 1833488263, 942724790, 301373537, 829570037, 1688323172, + 1289360871, 222028828, 916018859, 1866355856, 234576987, 2078107280, + 672563970, 1723578341, 342146590, 1143195511, 978587665, 849725352, + 2058907361, 2083149517, 1599893069, 113974112, 44041351, 190113083, + 85291638, 1931706506, 1928189300, 472131489, 394709364, 900104667, + 158136104, 1337434154, 1671581032, 987706141, 878273679, 991039875, + 1209734969, 1794292538, 1292413412, 1444311956, 1724916170, 434290636, + 1020406649, 2067062760, 153162844, 1998994314, 769304465, 825726814, + 1934660183, 221713886, 1968922326, 1978701535, 411826969, 1880346039, + 1762924393, 192532621, 1994320152, 10150109, 1092637289, 2079611790, + 1347584264, 616734673, 404259631, 78374295, 1607774548, 562395735, + 1872666833, 752704313, 1550101877, 1450099355, 1186994949, 612353198, + 1369678468, 1340157793, 2056665155, 2138982933, 18400960, 929588156, + 213213171, 1987323286, 781098823, 625040140, 1720185677, 568275358, + 817572761, 1567022181, 399493245, 1910210050, 1499150323, 14933990, + 379461075, 1903409954, 25084100, 1987235624, 318322042, 1372668364, + 592456289, 1868423919, 1451042659, 1779451238, 333293469, 1176225844, + 972125383, 242474976, 478841551, 990526343, 1172063133, 1848520019, + 830365981, 1953161956, 1840019304, 403068011, 373953666, 2053232475, + 1970090192, 773446912, 530788967, 1321756868, 788380902, 1348361729, + 1077683174, 813465002, 1111088131, 1396005216, 38649718, 1490549207, + 1116945487, 1489692377, 1330301183, 1450238957, 518434573, 1922757472, + 1692713933, 997276125, 1554725062, 717293418, 698312496, 379366797, + 522971726, 390848153, 1369893141, 896925393, 296596980, 52775474, + 1670372305, 827385948, 455843485, 311269559, 28264029, 278450030, + 1124734562, 1139352160, 1600206898, 1163384280, 482417719, 530406424, + 505593010, 1812718902, 1926411641, 1024027583, 1587992726, 895873480, + 2021303708, 995234140, 198628789, 572132557, 1374600938, 1891342723, + 962980710, 597010431, 461152493, 1259577690, 649785905, 984124220, + 2086963638, 1105629391, 1881049613, 2115227667, 1384079421, 1403938270, + 1107096180, 836802671, 1715207829, 1589513899, 1367209095, 692458743, + 1254749154, 1146137088, 1855843024, 695258232, 2042010569, 213952386, + 1690492373, 93155710, 1237979969, 917609663, 1984498433, 1111800030, + 1514620094, 298167279, 1683932587, 16922351, 1282291499, 499429649, + 1122551742, 1015857464, 1759007339, 359147515, 272312086, 1698487330, + 1195950186, 1987519915, 1666231349, 415675634, 532495011, 625843881, + 1561812722, 240854387, 67874133, 1456339643, 454806773, 1322623287, + 1549495354, 1692786742, 2017881519, 1386510139, 657103124, 1560890244, + 1684677418, 193552063, 331016259, 819485269, 692981712, 1845636353, + 1835342733, 304505404, 1862558705, 2107654819, 2002992734, 837626799, + 1947691087, 1521740435, 1196774315, 332702450, 100669, 245240853, + 573556837, 67974802, 660916487, 1028363610, 1390598089, 75245562, + 573666704, 1260995960, 1531585205, 1230769829, 674402557, 933596911, + 1424321892, 1005418816, 172623403, 2117303605, 703571522, 1857300821, + 274325361, 418646579, 529302443, 129834447, 1256273378, 217161528, + 1651574882, 305564045, 177332700, 1651675551, 550804899, 2125023787, + 1719650353, 1211721386, 310242589, 962764794, 1286966948, 883799426, + 76277107, 671068506, 1912163036, 750679664, 1604665417, 338346092, + 1756098480, 1777288820, 1569115921, 312186354, 1487105994, 845954166, + 730832933, 2016408437, 815774123, 1987106312, 86086317, 1090099484, + 145186709, 263419017, 1219933931, 695991608, 240959156, 724025165, + 1907712995, 551201745, 228217069, 1047196295, 1435001171, 1947867422, + 1718264801, 1199680559, 763148569, 1175446571, 1538026652, 839425676, + 805251743, 959658925, 1590105340, 144874089, 1805613091, 1198720172, + 13798878, 473903566, 1510906527, 99885196, 1564003050, 94255812, + 363304213, 636453333, 2081362124, 604263370, 1360478499, 79065186, + 1155465115, 1588695568, 775056794, 442982639, 1389079342, 535286141, + 1642663198, 4744263, 1582482437, 1033206202, 844169939, 1153263590, + 1992865128, 286791631, 181226513, 1650994571, 1485511804, 986478257, + 2124898138, 848934683, 1131352346, 1541417540, 943190495, 1145151225, + 30387226, 877068972, 1245036421, 1390865725, 956134158, 1608340634, + 832077645, 1731190952, 65120356, 73673339, 118993446, 1220585472, + 78417603, 1701475883, 1663568111, 922587542, 707255825, 1158747661, + 1209379174, 888482339, 44470216, 547407330, 1874960596, 2037335344, + 1396342013, 858829294, 1540846267, 192048860, 2003980519, 1518260757, + 1069117832, 1101533292, 912194650, 2025251990, 562390279, 942581876, + 1608959295, 627510635, 185963953, 1727952741, 1848096107, 1018041598, + 1281944976, 1364180570, 1091714937, 1989200801, 375444584, 1170132540, + 730199492, 419914800, 2092720083, 457676440, 309766496, 1154615609, + 1316505735, 1850612763, 1702022939, 1173002606, 1221389873, 950881304, + 127052251, 2133584523, 1142930164, 689442530, 928682751, 64564349, + 1316953165, 1114646704, 2089816339, 1017565625, 2132688302, 1551291986, + 234262547, 1076919591, 1131761079, 609707131, 99568484, 266222407, + 1029621931, 44804919, 107939561, 1339388427, 1199420528, 838139053, + 1042517543, 753959819, 1295815494, 116423768, 1704841123, 464837581, + 102524643, 700287639, 1637840187, 1031207394, 764851988, 1764892438, + 2145854098, 707184680, 306851320, 2131058752, 110993018, 1623804486, + 1060494695, 1242754098, 493886463, 1160063179, 1508976505, 728149010, + 1204868098, 1616916066, 1337856142, 256804978, 307571472, 219994425, + 1010764797, 1603386966, 1559382853, 568122272, 2068224547, 454416748, + 1268409912, 1558581086, 570840516, 2033261900, 1175989877, 673365159, + 592962932, 1482841197, 1704572553, 703955951, 959162035, 1702943003, + 1946710049, 1453048498, 1686518107, 1308202906, 33713861, 599529154, + 777635325, 1371570003, 1759592334, 1085206797, 1591564428, 816976784, + 541110115, 1003463633, 1073781763, 461851014, 1457880381, 2084546560, + 2020432100, 2028720897, 505185185, 1048938329, 554602408, 1773595097, + 384295879, 111691313, 1659373349, 1343457914, 1814634316, 104852634, + 649022765, 1353668775, 808808585, 682736626, 1953197930, 608034986, + 2054306629, 1565306616, 1916237892, 1498387409, 234799752, 546389569, + 354367395, 1308581515, 1631596366, 1812247776, 1245644428, 25222833, + 1693485026, 1750829613, 487073847, 100603786, 1376941062, 360022300, + 212295100, 888830763, 1408960629, 2026929416, 993683397, 1793256508, + 1233114544, 1802491982, 989230775, 1038828826, 263043320, 1638253540, + 456651794, 31797565, 173506518, 691451546, 578187134, 80329499, + 2000033062, 62299853, 1578716908, 1098193842, 87522686, 1933084303, + 701539807, 574596534, 1597848432, 2078480869, 934618834, 1143849810, + 819827984, 196095815, 1244453596, 1813511382, 1989352324, 1456748696, + 1468519716, 831099451, 1336194465, 1731563037, 321869343, 421825361, + 1763360602, 495375861, 1460654187, 194064088, 575705360, 1917305981, + 256363941, 6938620, 461273879, 343886628, 1940022924, 313823293, + 918483162, 1390387708, 1412017135, 1853101996, 386753870, 2113556942, + 2049197811, 1631207466, 2044554163, 1891066487, 940472515, 716898500, + 574682290, 129183332, 382926234, 896551633, 551008693, 1851445950, + 1391927494, 2011662880, 1435525339, 1967632854, 1781485213, 1051402293, + 1974571475, 95275444, 1245466382, 1767110751, 409098738, 1501830323, + 1010014811, 1821115873, 1845716951, 1396768681, 1787189168, 616716465, + 880492499, 1684259683, 322334813, 1820965014, 253674535, 224048977, + 1950148346, 636600769, 2115115464, 353673391, 340563072, 542314107, + 217852623, 1776088411, 1438865740, 1999337836, 680007057, 683309587, + 2094613281, 1925473439, 503458793, 356228371, 1279820114, 330546620, + 29860596, 978053418, 2097657371, 1817049764, 1594769883, 960188534, + 1353825800, 1917104697, 209473567, 1607500335, 2141153674, 1089966067, + 96617457, 2108785490, 763447433, 437180529, 503615949, 566112132, + 65785292, 1942481690, 919785523, 745792349, 478307629, 1137638147, + 523782140, 981766422, 989492335, 1803602255, 1312313043, 936621968, + 634172025, 1262486766, 1292850339, 81458260, 75191653, 1322710936, + 1998562957, 284665220, 992277052, 1992232983, 1374631287, 198619204, + 1953534826, 2138078721, 1806119540, 309667127, 556707205, 1902736997, + 104665169, 1476492728, 192433878, 582972798, 466647227, 258219170, + 1564739221, 1456139563, 1004011520, 729568616, 245277883, 1527793660, + 1992055382, 1538128223, 1183912267, 2067247035, 713355511, 1818084292, + 204428608, 1705632563, 1899542553, 1579059895, 1904251768, 1750621862, + 1569654968, 1562887660, 1595371198, 2126362173, 1318141009, 1401422376, + 1455371254, 1510574887, 1711089503, 1922018481, 1768794057, 1815754673, + 1230674396, 625321929, 251243823, 1475952280, 5631942, 1815983044, + 866596855, 1189544209, 398068012, 1579952366, 860144854, 242639747, + 1138101281, 612203759, 162403134, 894869401, 215341973, 366831742, + 310273413, 1810713171, 1945891638, 1628414422, 1064651899, 1368062958, + 991505661, 628257755, 1346941484, 612816071, 296528780, 654829090, + 1238138000, 547772603, 429363923, 1243769942, 216272000, 1660038320, + 285830504, 614340012, 988506952, 1145975358, 856979759, 1855103807, + 1758179117, 1019382894, 1287572525, 1973521090, 1386214636, 278190158, + 1636750614, 1184622626, 1173059560, 553918865, 405201937, 1483332973, + 1182176620, 1752143421, 964263748, 1478705400, 259488863, 1955769409, + 2026478004, 688852786, 421101832, 95266356, 201407458, 1659239833, + 709606368, 1189914410, 755526127, 1566586128, 897534569, 1041356631, + 438485374, 37623446, 39848341, 1824700010, 315813605, 1798027458, + 861838989, 1488873165, 1624064901, 1267040926, 824722490, 1113331867, + 871700699, 1788986238, 1667250732, 1131189562, 1597272000, 701943705, + 1820042348, 2018373832, 33165457, 2021449807, 1530130017, 2059643461, + 1063880569, 138172497, 7426169, 1961415139, 1179529128, 717032538, + 1999038585, 1219377470, 136135018, 167368542, 869921280, 574620392, + 1656241707, 346502533, 251836754, 333480550, 1459834400, 1113675743, + 2122466788, 979601485, 233233021, 1572255140, 1681545190, 1104933720, + 1443145325, 1714710647, 88639634, 825791694, 1626870461, 1908681983, + 963964191, 1634296630, 1782648142, 2143493320, 203845520, 699045063, + 1215387142, 339980538, 512976554, 2085308422, 914600930, 364531492, + 284327308, 1166437685, 531900034, 1744161708, 132629780, 40658094, + 576279545, 365862802, 374138644, 110341087, 1470796522, 349121784, + 1825051735, 1559436157, 1921376925, 1304438548, 1320634492, 1217038602, + 791251530, 955798986, 2042830296, 995097051, 1654844049, 859310840, + 1335077589, 20336956, 855320512, 102194872, 384868448, 2070707654, + 1268632557, 916768482, 2008532428, 1401262337, 957426576, 145376088, + 1767125139, 1331565220, 1889537797, 1090438014, 1680687005, 318333694, + 502390523, 1454580282, 428674782, 1823025015, 524135236, 106242869, + 631340353, 419481884, 1410681417, 138700754, 1278792724, 54449299, + 159037710, 2134113236, 1049546350, 543906158, 2057337242, 237140292, + 1460674641, 1918386023, 339335164, 270617569, 2063762111, 1607967721, + 1602182790, 1805816260, 861746410, 1135386147, 2124149955, 481387902, + 442482781, 405341089, 1571825916, 966618017, 511583958, 2074216439, + 1386099901, 1922265375, 1749757806, 517408978, 1976714674, 233614511, + 504038566, 878777377, 372315265, 413892161, 1115917669, 531352976, + 184794536, 1455252833, 1075259134, 101072999, 915736906, 388450127, + 1906889260, 1777483316, 659067697, 1883555567, 111387570, 113766839, + 141413008, 1683213486, 1249152986, 652996966, 1609946277, 1691635767, + 427778693, 1212220435, 510770136, 257009719, 1445834946, 1896870037, + 1135787096, 1818150212, 266795367, 104221117, 202019540, 770833934, + 1559473950, 1277278674, 1184726095, 327727208, 1665728802, 1369520631, + 2105210525, 177312851, 1470593630, 69114447, 291079690, 1229999242, + 1752327934, 1540232676, 966071161, 1214790563, 1084384795, 1107484169, + 279527351, 1595154931, 1760481135, 1725362297, 1344541320, 40776180, + 1396028861, 1611336688, 297785900, 1598048401, 234686974, 1433572996, + 727843428, 1419413069, 1537794114, 246088582, 641450052, 949784416, + 423401433, 2112043682, 1277511625, 714481123, 1194559277, 1235238502, + 107230151, 13146790, 1304352949, 1191614946, 1120630960, 909197235, + 639286229, 733628447, 2123987799, 1983827549, 774404628, 256031502, + 1447680589, 1072190528, 1981393799, 1682367563, 358279876, 1229939013, + 954296984, 1896073990, 680503766, 1595747036, 698374759, 1408347194, + 1560307071, 1975886384, 1654435776, 607382700, 1063641238, 2077837209, + 620529490, 220510539, 644834684, 1741160450, 1129707775, 752064835, + 327305250, 1106211926, 1943679781, 1101709878, 1362243428, 435482362, + 26416758, 1196153579, 271826264, 384696634, 278608944, 1719506853, + 133286977, 959112711, 1254390769, 831661736, 219976257, 61204105, + 660064472, 1874412034, 1656951142, 1723705710, 1804765595, 1069774565, + 1944216249, 302116632, 1677157265, 926440376, 1054181467, 150203107, + 2032652302, 850377601, 1891363558, 1247412082, 1285859963, 71185160, + 296082014, 1557686227, 1172895038, 574690958, 1129709433, 1199311796, + 1533803669, 236616554, 1584008430, 1753779927, 297820659, 1717295407, + 1480708313, 1954771801, 401473495, 1137990260, 877062718, 1061537967, + 1440106892, 406736335, 637760029, 346804712, 556939443, 434492631, + 1197182313, 300819353, 1360933007, 335558628, 372004513, 1246101662, + 1893244856, 1544899551, 346030096, 875470641, 596727699, 642112110, + 1112087195, 33252481, 1216803069, 1409907854, 1750547889, 603123090, + 1217196008, 4537736, 209419369, 2094258726, 1066075704, 1690127682, + 353511414, 1703835733, 680634295, 910450857, 2138328364, 2120741187, + 1211270210, 1351777724, 320062251, 1583274723, 450395738, 1517244564, + 980690626, 796425834, 1852803193, 1577418325, 1438537945, 1598564401, + 1610670806, 507857366, 326551394, 1213735047, 1110980456, 1438638589, + 1218272784, 1320399826, 701062795, 136864840, 863043860, 1918258803, + 1840700573, 1543678155, 1865033882, 1831545290, 1516935695, 71061648, + 1035839366, 1836997946, 981512505, 1486235104, 1206758863, 45299067, + 135177290, 912078408, 1628573790, 1573715235, 363159161, 461780768, + 2081572601, 689710555, 2039199093, 1045069410, 2128349144, 1502386251, + 217985588, 681928291, 568637651, 1081029448, 452703447, 1786910435, + 477223956, 170253681, 1923775275, 1994159651, 241315329, 1616992200, + 1683673949, 1222827834, 1301053842, 742949164, 1268126901, 189409560, + 1655027572, 749217043, 1675644664, 2018186733, 1210997811, 1810821955, + 560413640, 1102713256, 1237053542, 541279136, 457615859, 1171142496, + 1223207428, 1026253510, 68728258, 1675910875, 665680297, 286713846, + 1846164556, 441971924, 1367743294, 2087479885, 2058964125, 1844967250, + 1162824071, 1212534319, 1691643253, 283467324, 1401943880, 1227833555, + 1032684367, 930104896, 1970782719, 96198530, 593443203, 1478326644, + 1198911786, 1830496746, 1349029729, 1656527645, 854155594, 1909443370, + 535297508, 922883852, 303238858, 1200977805, 1209597698, 1526446286, + 1642949730, 429857344, 1054873513, 1554430207, 127340947, 753554421, + 619480878, 1818984200, 693550658, 2021424758, 899334107, 1856374729, + 804046007, 722633179, 2139842053, 1397489210, 53476175, 1025042772, + 1080502308, 1402505904, 1121241302, 1934657902, 1164465626, 172669440, + 710058106, 1467704485, 1829197086, 1919655804, 846667123, 217010946, + 202029501, 1901540637, 1417988751, 329370448, 507611410, 913454833, + 871000, 1201162069, 320401392, 900205108, 910053150, 939882271, + 1622838287, 902411556, 813823381, 1676314462, 1927454328, 1617869388, + 931336718, 901211983, 867874951, 2095802345, 1073881423, 1948377259, + 1416023182, 755594861, 1735551514, 115206657, 972605807, 298125972, + 2016747294, 243110911, 70298129, 376875057, 1156565744, 272327630, + 1578037126, 1476967137, 601698078, 340606628, 269365760, 602569078, + 1243018184, 1083189141, 1502774186, 1022988865, 553574882, 978128825, + 1924200848, 1421449833, 506959639, 850598623, 1222343444, 1438296358, + 1606193485, 810411310, 1386615055, 431315644, 1108537283, 655154589, + 674426555, 1178835412, 770361246, 1830992300, 1451163042, 639624893, + 1160475789, 2052861120, 1016499950, 1429841549, 507946550, 447053428, + 365547042, 2010720737, 787660056, 919121924, 841365914, 2030678241, + 193088109, 1348325554, 906183458, 1415431554, 639138264, 682900658, + 78359216, 2025753319, 1533499281, 1186896499, 533424260, 992209118, + 218248263, 1303785506, 1423524763, 1669411305, 1943410399, 2097951318, + 1574788777, 812426701, 1781459970, 2082735328, 1259480129, 794452111, + 1945972417, 2047140186, 76810012, 639854683, 1930334779, 442357055, + 1988180237, 689034589, 1361478979, 479834853, 1371935247, 1554567089, + 358104524, 757950880, 822514995, 891528784, 1750159999, 900874211, + 47830643, 1026201114, 2087770711, 1991241042, 976668784, 158535326, + 656184096, 610645107, 1827946632, 1915664225, 1405097218, 1255251761, + 1815320763, 1481907231, 1190503441, 1598171894, 1924264286, 988992210, + 139722835, 1138259617, 1628846894, 1511658082, 545343058, 1469543483, + 122125315, 1367858053, 1949378337, 1872285314, 121248617, 159999213, + 751002780, 61535680, 1051527998, 1727671564, 220071006, 1099358641, + 190833023, 2048017638, 943116035, 1595930242, 1155785752, 1599300131, + 930353825, 198805545, 1367480709, 707134463, 1187797756, 1035317824, + 1845394080, 669161002, 486006071, 243253491, 2138704485, 625728906, + 1611111544, 1940599174, 2137386989, 1732360161, 2100598388, 112028656, + 1793895841, 1004642738, 1984313970, 2013966848, 2104001379, 587833102, + 1914500838, 899633766, 168021018, 922802942, 351450250, 358854042, + 1121608488, 1718930959, 1954784284, 161922596, 606765135, 737654461, + 831083598, 1092771206, 1444788924, 822304435, 1718500113, 1142699356, + 615419962, 1708403454, 1385952847, 568534702, 1820432110, 849580744, + 1573177440, 1657262432, 434457257, 1529695171, 97611886, 80869451, + 281845289, 265632904, 2094836299, 633295539, 624486946, 1861853489, + 204742850, 431787582, 637172784, 811507986, 1169442043, 1758781272, + 1904279192, 466747319, 1920703868, 1475295657, 1609446676, 604303818, + 1036215463, 847915875, 1426608253, 709163925, 1697496619, 2042028215, + 218942709, 2131953877, 463079269, 316554595, 65339680, 2036256709, + 582187500, 12692331, 1418468232, 1206674446, 1874545820, 1700313522, + 1638462029, 364234956, 186125413, 660420424, 2123016228, 390868264, + 1127167744, 1896236448, 1202376250, 589130772, 353056618, 959171794, + 1437046647, 1779664872, 286983804, 987059619, 1674209439, 1323199267, + 971529848, 2137288709, 2032363193, 1036869528, 2026061770, 103822254, + 1049561859, 1297046355, 420376850, 776624031, 849876229, 1002564350, + 1140858988, 1036001642, 61755148, 1116391568, 1426869906, 1700217177, + 865144369, 481762508, 213153954, 1218200987, 1440934303, 1340321698, + 850382211, 1727918107, 1929452470, 377108003, 903633726, 1219015469, + 366913064, 788513271, 58591440, 245491186, 892335526, 1030121288, + 1542537541, 1312712376, 2066990816, 244930122, 167793078, 969069027, + 1280931765, 229548226, 1745693059, 560318023, 1929765404, 739068399, + 1042080532, 2142919358, 1855459967, 335531187, 1335757408, 573120688, + 2063449294, 1117726230, 1791321676, 819599372, 189258051, 494220239, + 1608112644, 247849492, 871328242, 352964522, 1277970780, 1238241306, + 1665676898, 1197477949, 1483732493, 1833469976, 19063328, 878786386, + 2063018202, 1764756387, 1123716509, 1845299958, 356341138, 257164626, + 1840735668, 64317458, 817482649, 1029009428, 637438146, 1859563181, + 2146735658, 281276174, 47610720, 188510062, 775496414, 2111060014, + 436359554, 1646824656, 783175739, 1714330334, 737582315, 243804735, + 764324635, 73831160, 596769257, 783387964, 952617546, 114962507, + 400660703, 2076334055, 1948432483, 757001842, 186015033, 1863967037, + 821319300, 1003497683, 1561783348, 1458757446, 715577216, 1255035368, + 1740033621, 763187937, 136561149, 368046387, 726764303, 135813159, + 2014871043, 1509940042, 324323221, 604969710, 1753744777, 760682775, + 678800870, 203030386, 327529462, 1631418417, 317992893, 1091854097, + 1560268824, 118941728, 1875242061, 1746283858, 1982908766, 128419117, + 602297893, 1397208466, 885420959, 1317875109, 504760186, 1706740259, + 2081063046, 641321335, 1018014057, 660343702, 777134495, 610564030, + 22800096, 1101457716, 978610417, 1776544874, 1862140492, 845997813, + 1979575260, 42186306, 1450967523, 150084506, 1134040403, 2129768394, + 269026234, 861798817, 1613703163, 104451352, 990217934, 1026488339, + 1501659818, 1875638893, 625288549, 2006420005, 1434895504, 1227586442, + 500257692, 305425913, 397977904, 1277392187, 915989944, 331557302, + 231366256, 1894600361, 991901004, 2093506748, 593114526, 1014701101, + 2135693054, 2044082050, 643762327, 1122249809, 2026366796, 475853939, + 1984048626, 1492586311, 625938445, 826782912, 371591002, 894964680, + 554938157, 996879552, 999416032, 1989833661, 76982346, 353592203, + 147775927, 474960250, 212528560, 1063765871, 806517553, 712786252, + 810882584, 1798418557, 1990178440, 1403997111, 665636010, 74061048, + 1300595513, 1309398337, 20084148, 1179478661, 1785252277, 8293554, + 524581324, 263707074, 1130543363, 896172326, 1158671754, 967108342, + 1893051878, 10604139, 1793891254, 1970034225, 364196342, 201345764, + 297510827, 576724902, 43695777, 1104028380, 1289511154, 191471704, + 754963290, 1132205946, 1255237575, 1420599300, 1206266994, 2066120160, + 582513990, 1226351142, 1322633623, 220282619, 1234644696, 475745488, + 483989693, 217704412, 1655224149, 1642661448, 1184812754, 32321825, + 1653265587, 831220360, 928494151, 2017461929, 1032566124, 674062382, + 446703183, 1076261902, 496612959, 1736214337, 1267733606, 794123786, + 720936636, 375487534, 1898152167, 1927203630, 294124046, 505631809, + 1006071125, 1616757669, 1926231109, 93232173, 2092503157, 361261451, + 310936585, 1600243658, 581544070, 1495749339, 1632565483, 1065533764, + 179486052, 413575986, 560711564, 1212052176, 1087638368, 66493503, + 140830430, 1584251327, 2083955432, 1408564037, 230891466, 383174967, + 1784051571, 2129043633, 2119389304, 2078175617, 487191794, 692842292, + 1547449638, 265939255, 472562275, 1492469147, 627200707, 1478633400, + 945229157, 1208744777, 1571865573, 430310992, 126794893, 1882802159, + 843886978, 687506457, 1231067850, 1931525347, 753999960, 1410553902, + 1368293026, 690471744, 475122431, 1599184492, 1073646711, 615952861, + 1580744477, 1045552368, 2024516898, 2067936271, 1738394660, 1661084821, + 186391879, 63473287, 1591776790, 813592586, 1542106687, 991742780, + 2022337363, 966488613, 336728279, 1648609, 701807124, 1281957436, + 689155066, 1932874974, 1712268428, 1443155027, 1195945229, 408671759, + 2133626771, 1671067660, 192713458, 1059789835, 139536873, 1561006484, + 2105342203, 16570124, 1012707329, 1696253215, 1677654945, 445968158, + 1759726503, 1121948088, 366420782, 1154349542, 2113690868, 552812661, + 2120838155, 302935500, 1366405247, 675161631, 1584892936, 1241258962, + 460552958, 1149677717, 1242907571, 1656498187, 1558349476, 1932062638, + 1180082199, 1751062934, 1227734017, 1319619072, 1164585770, 1213877140 +}; diff --git a/targets/wasm-tacle/kernel/quicksort/math_private.h b/targets/wasm-tacle/kernel/quicksort/math_private.h new file mode 100755 index 0000000..0490524 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/math_private.h @@ -0,0 +1,67 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms below. + +*/ + + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + unsigned int word; +} quicksort_ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define QUICKSORT_GET_FLOAT_WORD(i,d) \ +{ \ + quicksort_ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define QUICKSORT_SET_FLOAT_WORD(d,i) \ +{ \ + quicksort_ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/kernel/quicksort/quicksort.c b/targets/wasm-tacle/kernel/quicksort/quicksort.c new file mode 100755 index 0000000..55b4c73 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/quicksort.c @@ -0,0 +1,245 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + + +/* + Include section +*/ + +#include "quicksort.h" +#include "quicksortlibm.h" +#include "quicksortstdlib.h" + + +/* + Forward declaration of functions +*/ + +void quicksort_init( void ); +int quicksort_return( void ); +void quicksort_str( char *, unsigned long, unsigned long ); +void quicksort_vec( char *, unsigned long, unsigned long ); +void quicksort_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +extern const char *quicksort_input_string[ 681 ]; +char quicksort_strings[ 681 ][ 20 ]; + +extern unsigned int quicksort_input_vector[ 1000 * 3 ]; +struct quicksort_3DVertexStruct quicksort_vectors[ 1000 ]; + +volatile int quicksort_const_prop_border_i = 0; +volatile char quicksort_const_prop_border_c = 0; + + +/* + Initialization- and return-value-related functions +*/ + +void quicksort_init( void ) +{ + unsigned int i, j; + unsigned int x, y, z; + unsigned int read_counter = 0; + + /* constant propagation border */ + _Pragma( "loopbound min 3000 max 3000" ) + for ( i = 0; i < 3000; i++ ) + quicksort_input_vector[ i ] += quicksort_const_prop_border_i; + + /* Init arrays */ + _Pragma( "loopbound min 681 max 681" ) + for ( i = 0; i < 681; i++ ) { + _Pragma( "loopbound min 1 max 20" ) + for ( j = 0; j < 20 - 1; j++ ) { + quicksort_strings[ i ][ j ] = quicksort_input_string[ i ][ j ]; + quicksort_strings[ i ][ j ] += quicksort_const_prop_border_c; + + if ( quicksort_input_string[ i ][ j ] == '\0' ) + break; + } + + /* Terminate with '\0' anyways. */ + quicksort_strings[ i ][ 20 - 1 ] = '\0'; + } + + _Pragma( "loopbound min 1000 max 1000" ) + for ( i = 0; i < 1000; i++ ) { + x = quicksort_vectors[ i ].x = quicksort_input_vector[ read_counter++ ]; + y = quicksort_vectors[ i ].y = quicksort_input_vector[ read_counter++ ]; + z = quicksort_vectors[ i ].z = quicksort_input_vector[ read_counter++ ]; + + quicksort_vectors[ i ].distance = + quicksort_sqrt( + quicksort_pow( x, 2 ) + quicksort_pow( y, 2 ) + quicksort_pow( z, 2 ) ); + } +} + + +int quicksort_return( void ) +{ + int checksum = 0; + + checksum += + quicksort_strings[ 42 ][ 1 ] + + quicksort_vectors[ 42 ].x + quicksort_vectors[ 42 ].y + + quicksort_vectors[ 42 ].z; + + return ( checksum ); +} + + +/* + Algorithm core functions +*/ + +void quicksort_str( char *a, unsigned long n, unsigned long es ) +{ + unsigned long j; + char *pi, *pj, *pn; + + + _Pragma( "loopbound min 0 max 8" ) + while ( n > 1 ) { + if ( n > 10 ) + pi = quicksort_pivot_strings( a, n, es ); + else + pi = a + ( n >> 1 ) * es; + + quicksort_swapi( a, pi, es ); + pi = a; + pn = a + n * es; + pj = pn; + + _Pragma( "loopbound min 0 max 169" ) + while ( 1 ) { + _Pragma( "loopbound min 1 max 26" ) + do + pi += es; + while ( ( pi < pn ) && ( quicksort_compare_strings( pi, a ) < 0 ) ); + + _Pragma( "loopbound min 1 max 23" ) + do + pj -= es; + while ( ( pj > a ) && ( quicksort_compare_strings( pj, a ) > 0 ) ); + + if ( pj < pi ) + break; + quicksort_swapi( pi, pj, es ); + } + quicksort_swapi( a, pj, es ); + j = ( pj - a ) / es; + n = n - j - 1; + + if ( j >= n ) { + quicksort_str( a, j, es ); + a += ( j + 1 ) * es; + } else { + quicksort_str( a + ( j + 1 ) * es, n, es ); + n = j; + } + } +} + + +void quicksort_vec( char *a, unsigned long n, unsigned long es ) +{ + unsigned long j; + char *pi, *pj, *pn; + + + _Pragma( "loopbound min 0 max 15" ) + while ( n > 1 ) { + if ( n > 10 ) + pi = quicksort_pivot_vectors( a, n, es ); + else + pi = a + ( n >> 1 ) * es; + + quicksort_swapi( a, pi, es ); + pi = a; + pn = a + n * es; + pj = pn; + + _Pragma( "loopbound min 1 max 250" ) + while ( 1 ) { + _Pragma( "loopbound min 1 max 51" ) + do + pi += es; + while ( ( pi < pn ) && ( quicksort_compare_vectors( pi, a ) < 0 ) ); + + _Pragma( "loopbound min 1 max 27" ) + do + pj -= es; + while ( ( pj > a ) && ( quicksort_compare_vectors( pj, a ) > 0 ) ); + + if ( pj < pi ) + break; + + quicksort_swapi( pi, pj, es ); + } + + quicksort_swapi( a, pj, es ); + j = ( pj - a ) / es; + n = n - j - 1; + + if ( j >= n ) { + quicksort_vec( a, j, es ); + a += ( j + 1 ) * es; + } else { + quicksort_vec( a + ( j + 1 ) * es, n, es ); + n = j; + } + } +} + + +/* + Main functions +*/ + +void _Pragma ( "entrypoint" ) quicksort_main( void ) +{ + _Pragma( "marker recursivecall" ) + _Pragma( "flowrestriction 1*quicksort_str <= 521*recursivecall" ) + quicksort_str( *quicksort_strings, 681, sizeof( char[ 20 ] ) ); + + _Pragma( "marker recursivecall2" ) + _Pragma( "flowrestriction 1*quicksort_vec <= 650*recursivecall2" ) + quicksort_vec( + ( char * ) quicksort_vectors, 1000, + sizeof( struct quicksort_3DVertexStruct ) ); +} + + +int main( void ) +{ + quicksort_init(); + quicksort_main(); + + return ( quicksort_return() - 1527923179 != 0 ); +} diff --git a/targets/wasm-tacle/kernel/quicksort/quicksort.h b/targets/wasm-tacle/kernel/quicksort/quicksort.h new file mode 100755 index 0000000..7a46927 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/quicksort.h @@ -0,0 +1,9 @@ +#ifndef __QUICKSORT_H +#define __QUICKSORT_H + +struct quicksort_3DVertexStruct { + unsigned int x, y, z; + double distance; +}; + +#endif diff --git a/targets/wasm-tacle/kernel/quicksort/quicksortlibm.c b/targets/wasm-tacle/kernel/quicksort/quicksortlibm.c new file mode 100755 index 0000000..d3a48e6 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/quicksortlibm.c @@ -0,0 +1,1129 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See the terms below. + +*/ + + +#include "quicksortlibm.h" +#include "math_private.h" + +// Often used variables/consts +#ifdef __STDC__ +const float +#else +float +#endif +quicksort_one = 1.0f, +quicksort_half = 5.0000000000e-01f, /* 0x3f000000 */ +quicksort_zero = 0.0f, +quicksort_huge = 1.0e30, +quicksort_tiny = 1.0e-30f, +quicksort_two = 2.0, +quicksort_two24 = 16777216.0; /* 0x4b800000 */ + +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +quicksort_bp[ ] = { 1.0f, 1.5f, }, + quicksort_dp_h[ ] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + quicksort_dp_l[ ] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + quicksort_L1 = 6.0000002384e-01f, /* 0x3f19999a */ + quicksort_L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + quicksort_L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + quicksort_L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + quicksort_L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + quicksort_L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + quicksort_P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + quicksort_P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + quicksort_P3 = 6.6137559770e-05f, /* 0x388ab355 */ + quicksort_P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + quicksort_P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + quicksort_lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + quicksort_lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + quicksort_lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + quicksort_ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + quicksort_cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + quicksort_cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + quicksort_cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + quicksort_ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + quicksort_ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + quicksort_ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + + +#ifdef __STDC__ +float quicksort___ieee754_powf( float x, float y ) +#else +float quicksort___ieee754_powf( x, y ) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int i, j, k, yisint, n; + int hx, hy, ix, iy, is; + + + QUICKSORT_GET_FLOAT_WORD( hx, x ); + QUICKSORT_GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) + return ( quicksort_one ); + + /* x==+-1 */ + if ( x == 1.0f ) + return ( quicksort_one ); + if ( ( x == -1.0f ) && quicksort_isinf( y ) ) + return ( quicksort_one ); + + /* +-NaN return x+y */ + if ( ( ix > 0x7f800000 ) || ( iy > 0x7f800000 ) ) + return ( x + y ); + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) + yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + + if ( ( j << ( 23 - k ) ) == iy ) + yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return ( y - y ); /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( ( hy >= 0 ) ? y : quicksort_zero ); + else /* (|x|<1)**-,+inf = inf,0 */ + return ( ( hy < 0 ) ? -y : quicksort_zero ); + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) + return ( quicksort_one / x ); + else + return ( x ); + } + if ( hy == 0x40000000 ) + return ( x * x ); /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return ( quicksort___ieee754_sqrtf( x ) ); + } + + ax = quicksort_fabsf( x ); + /* special value of x */ + if ( ( ix == 0x7f800000 ) || ( ix == 0 ) || ( ix == 0x3f800000 ) ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) + z = quicksort_one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + else + + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + + return ( z ); + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( unsigned int ) hx >> 31 ) - 1 ) | yisint ) == 0 ) + return ( ( x - x ) / ( x - x ) ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) + return ( ( hy < 0 ) ? + quicksort_huge *quicksort_huge : quicksort_tiny * quicksort_tiny ); + if ( ix > 0x3f800007 ) + return ( ( hy > 0 ) ? + quicksort_huge *quicksort_huge : quicksort_tiny * quicksort_tiny ); + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = + ( t * t ) * + ( ( float ) 0.5f - + t * ( ( float ) 0.333333333333f - t * ( float ) 0.25f ) ); + u = quicksort_ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * quicksort_ivln2_l - w * quicksort_ivln2; + t1 = u + v; + QUICKSORT_GET_FLOAT_WORD( is, t1 ); + QUICKSORT_SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= quicksort_two24; + n -= 24; + QUICKSORT_GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) + k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - quicksort_bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = + s2 * s2 * + ( quicksort_L1 + s2 * ( quicksort_L2 + s2 * ( quicksort_L3 + s2 * + ( quicksort_L4 + s2 * ( quicksort_L5 + s2 * quicksort_L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float ) 3.0f + s2 + r; + QUICKSORT_GET_FLOAT_WORD( is, t_h ); + QUICKSORT_SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float ) 3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + QUICKSORT_GET_FLOAT_WORD( is, p_h ); + QUICKSORT_SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = quicksort_cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = quicksort_cp_l * p_h + p_l * quicksort_cp + quicksort_dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float ) n; + t1 = ( ( ( z_h + z_l ) + quicksort_dp_h[ k ] ) + t ); + QUICKSORT_GET_FLOAT_WORD( is, t1 ); + QUICKSORT_SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - quicksort_dp_h[ k ] ) - z_h ); + } + + s = quicksort_one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( unsigned int ) hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -quicksort_one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + QUICKSORT_GET_FLOAT_WORD( is, y ); + QUICKSORT_SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + QUICKSORT_GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return ( s * quicksort_huge * quicksort_huge ); /* overflow */ + else + + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + quicksort_ovt > z - p_h ) + return ( s * quicksort_huge * quicksort_huge ); /* overflow */ + } else + + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return ( s * quicksort_tiny * quicksort_tiny ); /* underflow */ + else + + if ( ( unsigned int ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) + return ( s * quicksort_tiny * quicksort_tiny ); /* underflow */ + } + + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [ z+0.5 ] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + QUICKSORT_SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) + n = -n; + p_h -= t; + } + t = p_l + p_h; + QUICKSORT_GET_FLOAT_WORD( is, t ); + QUICKSORT_SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * quicksort_lg2_h; + v = ( p_l - ( t - p_h ) ) * quicksort_lg2 + t * quicksort_lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = + z - t * ( quicksort_P1 + t * ( quicksort_P2 + t * ( quicksort_P3 + t * + ( quicksort_P4 + t * quicksort_P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - quicksort_two ) - ( w + z * w ); + z = quicksort_one - ( r - z ); + QUICKSORT_GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) + z = quicksort___scalbnf( z, n ); /* subnormal output */ + else + QUICKSORT_SET_FLOAT_WORD( z, j ); + + return ( s * z ); +} + + +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float quicksort___ieee754_sqrtf( float x ) +#else +float quicksort___ieee754_sqrtf( x ) +float x; +#endif +{ + float z; + int sign = ( int ) 0x80000000; + int ix, s, q, m, t, i; + unsigned int r; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) + return ( x * x + x ); /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) + return ( x ); /* sqrt(+-0) = +-0 */ + else + + if ( ix < 0 ) + return ( ( x - x ) / ( x - x ) ); /* sqrt(-ve) = sNaN */ + } + + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [ m/2 ] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 25 max 25" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = quicksort_one - quicksort_tiny; /* trigger inexact flag */ + if ( z >= quicksort_one ) { + z = quicksort_one + quicksort_tiny; + if ( z > quicksort_one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + QUICKSORT_SET_FLOAT_WORD( z, ix ); + + return ( z ); +} + + +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + +#ifdef __STDC__ +float quicksort___copysignf( float x, float y ) +#else +float quicksort___copysignf( x, y ) +float x, y; +#endif +{ + unsigned int ix, iy; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + QUICKSORT_GET_FLOAT_WORD( iy, y ); + QUICKSORT_SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + + return ( x ); +} + + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int quicksort_npio2_hw[ ] = { +#else +int quicksort_npio2_hw[ ] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +quicksort_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +quicksort_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +quicksort_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +quicksort_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +quicksort_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +quicksort_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +quicksort_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + + +#ifdef __STDC__ +int quicksort___ieee754_rem_pio2f( float x, float *y ) +#else +int quicksort___ieee754_rem_pio2f( x, y ) +float x, y[ ]; +#endif +{ + float z, w, t, r, fn; + int i, j, n, ix, hx; + + + QUICKSORT_GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + + return ( 0 ); + } + + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - quicksort_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - quicksort_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - quicksort_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= quicksort_pio2_2; + y[ 0 ] = z - quicksort_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - quicksort_pio2_2t; + } + return ( 1 ); + } else { /* negative x */ + z = x + quicksort_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + quicksort_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + quicksort_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += quicksort_pio2_2; + y[ 0 ] = z + quicksort_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + quicksort_pio2_2t; + } + return ( -1 ); + } + } + + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = quicksort_fabsf( x ); + n = ( int ) ( t * quicksort_invpio2 + quicksort_half ); + fn = ( float ) n; + r = t - fn * quicksort_pio2_1; + w = fn * quicksort_pio2_1t; /* 1st round good to 40 bit */ + + if ( ( n < 32 ) && ( ( int ) ( ix & 0xffffff00 ) != + quicksort_npio2_hw[ n - 1 ] ) ) + y[ 0 ] = r - w; /* quick check no cancellation */ + else { + unsigned int high; + + j = ix >> 23; + y[ 0 ] = r - w; + QUICKSORT_GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * quicksort_pio2_2; + r = t - w; + w = fn * quicksort_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + QUICKSORT_GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * quicksort_pio2_3; + r = t - w; + w = fn * quicksort_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return ( -n ); + } else + return ( n ); + } + + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return ( 0 ); + } + + y[ 0 ] = y[ 1 ] = x - x; /* dummy initialization */ + return ( 0 ); /* doesn't happen for our input */ +} + + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +quicksort_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +quicksort_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +quicksort_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +quicksort_C4 = -2.7557314297e-07f, /* 0xb493f27c */ +quicksort_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +quicksort_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float quicksort___kernel_cosf( float x, float y ) +#else +float quicksort___kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int ix; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int ) x ) == 0 ) + return ( quicksort_one ); /* generate inexact */ + } + + z = x * x; + r = z * ( quicksort_C1 + z * ( quicksort_C2 + z * ( quicksort_C3 + z * + ( quicksort_C4 + z * ( quicksort_C5 + z * quicksort_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return ( quicksort_one - ( ( float ) 0.5f * z - ( z * r - x * y ) ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float ) 0.28125f; + else { + QUICKSORT_SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float ) 0.5f * z - qx; + a = quicksort_one - qx; + return ( a - ( hz - ( z * r - x * y ) ) ); + } +} + + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +quicksort_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +quicksort_S2 = 8.3333337680e-03f, /* 0x3c088889 */ +quicksort_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +quicksort_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +quicksort_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +quicksort_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + + +#ifdef __STDC__ +float quicksort___kernel_sinf( float x, float y, int iy ) +#else +float quicksort___kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int ix; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int ) x == 0 ) + return ( x ); /* generate inexact */ + } + + z = x * x; + v = z * x; + r = quicksort_S2 + z * ( quicksort_S3 + z * ( quicksort_S4 + z * + ( quicksort_S5 + z * quicksort_S6 ) ) ); + + if ( iy == 0 ) + return ( x + v * ( quicksort_S1 + z * r ) ); + else + return ( + x - ( ( z * ( quicksort_half * y - v * r ) - y ) - v * quicksort_S1 ) ); +} + + +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float quicksort_atanhi[ ] = { +#else +float quicksort_atanhi[ ] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + + +#ifdef __STDC__ +const float quicksort_atanlo[ ] = { +#else +float quicksort_atanlo[ ] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + + +#ifdef __STDC__ +const float quicksort_aT[ ] = { +#else +float quicksort_aT[ ] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + + +#ifdef __STDC__ +float quicksort___atanf( float x ) +#else +float quicksort___atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int ix, hx, id; + + + QUICKSORT_GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return ( x + x ); /* NaN */ + if ( hx > 0 ) + return ( quicksort_atanhi[ 3 ] + quicksort_atanlo[ 3 ] ); + else + return ( -quicksort_atanhi[ 3 ] - quicksort_atanlo[ 3 ] ); + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( quicksort_huge + x > quicksort_one ) + return ( x ); /* raise inexact */ + } + id = -1; + } else { + x = quicksort_fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float ) 2.0f * x - quicksort_one ) / ( ( float ) 2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - quicksort_one ) / ( x + quicksort_one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float ) 1.5f ) / ( quicksort_one + ( float ) 1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float ) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = + z * ( quicksort_aT[ 0 ] + + w * ( quicksort_aT[ 2 ] + + w * ( quicksort_aT[ 4 ] + + w * ( quicksort_aT[ 6 ] + + w * ( quicksort_aT[ 8 ] + + w * quicksort_aT[ 10 ] ) ) ) ) ); + s2 = + w * ( quicksort_aT[ 1 ] + + w * ( quicksort_aT[ 3 ] + + w * ( quicksort_aT[ 5 ] + + w * ( quicksort_aT[ 7 ] + + w * quicksort_aT[ 9 ] ) ) ) ); + + if ( id < 0 ) + return ( x - x * ( s1 + s2 ) ); + else { + z = quicksort_atanhi[ id ] - + ( ( x * ( s1 + s2 ) - quicksort_atanlo[ id ] ) - x ); + return ( ( hx < 0 ) ? -z : z ); + } +} + + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float quicksort___cosf( float x ) +#else +float quicksort___cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int n, ix; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) + return ( quicksort___kernel_cosf( x, z ) ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) + return ( x - x ); + + /* argument reduction needed */ + else { + n = quicksort___ieee754_rem_pio2f( x, y ); + + switch ( n & 3 ) { + case 0: + return ( quicksort___kernel_cosf( y[ 0 ], y[ 1 ] ) ); + case 1: + return ( -quicksort___kernel_sinf( y[ 0 ], y[ 1 ], 1 ) ); + case 2: + return ( -quicksort___kernel_cosf( y[ 0 ], y[ 1 ] ) ); + default: + return ( quicksort___kernel_sinf( y[ 0 ], y[ 1 ], 1 ) ); + } + } +} + + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float quicksort___sinf( float x ) +#else +float quicksort___sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int n, ix; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) + return ( quicksort___kernel_sinf( x, z, 0 ) ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) + return ( x - x ); + + /* argument reduction needed */ + else { + n = quicksort___ieee754_rem_pio2f( x, y ); + + switch ( n & 3 ) { + case 0: + return ( quicksort___kernel_sinf( y[ 0 ], y[ 1 ], 1 ) ); + case 1: + return ( quicksort___kernel_cosf( y[ 0 ], y[ 1 ] ) ); + case 2: + return ( -quicksort___kernel_sinf( y[ 0 ], y[ 1 ], 1 ) ); + default: + return ( -quicksort___kernel_cosf( y[ 0 ], y[ 1 ] ) ); + } + } +} + + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +#ifdef __STDC__ +float quicksort___fabsf( float x ) +#else +float quicksort___fabsf( x ) +float x; +#endif +{ + unsigned int ix; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + QUICKSORT_SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return ( x ); +} + + +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +quicksort_two25 = 3.355443200e+07f, /* 0x4c000000 */ +quicksort_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float quicksort___scalbnf( float x, int n ) +#else +float quicksort___scalbnf( x, n ) +float x; +int n; +#endif +{ + int k, ix; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) + return ( x ); /* +-0 */ + x *= quicksort_two25; + QUICKSORT_GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + + if ( k == 0xff ) + return ( x + x ); /* NaN or Inf */ + k = k + n; + if ( ( n > 50000 ) || ( k > 0xfe ) ) + /* overflow */ + return ( quicksort_huge * quicksort___copysignf( quicksort_huge, x ) ); + if ( n < -50000 ) + /* underflow */ + return ( quicksort_tiny * quicksort___copysignf( quicksort_tiny, x ) ); + if ( k > 0 ) { /* normal result */ + QUICKSORT_SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return ( x ); + } + + if ( k <= -25 ) + /* underflow */ + return ( quicksort_tiny * quicksort___copysignf( quicksort_tiny, x ) ); + k += 25; /* subnormal result */ + QUICKSORT_SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return ( x * quicksort_twom25 ); +} + + +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ +int quicksort___isinff( float x ) +{ + int ix, t; + + + QUICKSORT_GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ( ~( t >> 31 ) & ( ix >> 30 ) ); +} diff --git a/targets/wasm-tacle/kernel/quicksort/quicksortlibm.h b/targets/wasm-tacle/kernel/quicksort/quicksortlibm.h new file mode 100755 index 0000000..2cae951 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/quicksortlibm.h @@ -0,0 +1,58 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See quicksortlibm.c + +*/ + + +#ifndef __QUICKSORTLIBM +#define __QUICKSORTLIBM + +// The following defines map the math functions to specialized calls +#define quicksort_acos quicksort___ieee754_acosf +#define quicksort_atan quicksort___atanf +#define quicksort_cos quicksort___cosf +#define quicksort_fabs quicksort___fabsf +#define quicksort_fabsf quicksort___fabsf +#define quicksort_isinf quicksort___isinff +#define quicksort_pow quicksort___ieee754_powf +#define quicksort_sqrt quicksort___ieee754_sqrtf +#define quicksort_log10 quicksort___ieee754_log10f +#define quicksort_log quicksort___ieee754_logf +#define quicksort_sin quicksort___sinf + +float quicksort___atanf( float ); +float quicksort___copysignf( float, float ); +float quicksort___cosf( float ); +float quicksort___fabsf( float ); +float quicksort___floorf( float ); +float quicksort___ieee754_acosf( float ); +float quicksort___ieee754_powf( float, float ); +int quicksort___ieee754_rem_pio2f( float, float * ); +float quicksort___ieee754_sqrtf( float ); +int quicksort___isinff( float ); +float quicksort___kernel_cosf( float, float ); +float quicksort___kernel_sinf( float, float, int ); +int quicksort___kernel_rem_pio2f( float *, float *, int, int, int, + const int * ); +float quicksort___scalbnf( float, int ); +float quicksort___ieee754_logf( float ); +float quicksort___ieee754_log10f( float ); +float quicksort___sinf( float ); + +#endif // __QUICKSORTLIBM diff --git a/targets/wasm-tacle/kernel/quicksort/quicksortstdlib.c b/targets/wasm-tacle/kernel/quicksort/quicksortstdlib.c new file mode 100755 index 0000000..6e210d5 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/quicksortstdlib.c @@ -0,0 +1,142 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + + +#include "quicksort.h" + + +int quicksort_strcmp( const char *str1, const char *str2 ) +{ + _Pragma( "loopbound min 0 max 11" ) + while ( *str1 && ( *str1 == *str2 ) ) + ++str1, ++str2; + + return ( *( const unsigned char * )str1 - * ( const unsigned char * )str2 ); +} + + +int quicksort_compare_strings( const char *elem1, const char *elem2 ) +{ + int result; + + + result = quicksort_strcmp( elem1, elem2 ); + + return ( ( result < 0 ) ? 1 : ( ( result == 0 ) ? 0 : -1 ) ); +} + + +int quicksort_compare_vectors( const char *elem1, const char *elem2 ) +{ + /* D = [ (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 ]^(1/2) */ + /* sort based on distances from the origin... */ + + double distance1, distance2; + + + distance1 = ( *( ( struct quicksort_3DVertexStruct * )elem1 ) ).distance; + distance2 = ( *( ( struct quicksort_3DVertexStruct * )elem2 ) ).distance; + + return ( + ( distance1 > distance2 ) ? 1 : ( ( distance1 == distance2 ) ? 0 : -1 ) ); +} + + +void quicksort_swapi( char *ii, char *ij, unsigned long es ) +{ + char *i, *j, c; + + + i = ( char * ) ii; + j = ( char * ) ij; + + _Pragma( "loopbound min 20 max 24" ) + do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof( char ); + } while ( es != 0 ); +} + + +char *quicksort_pivot_strings( char *a, unsigned long n, unsigned long es ) +{ + long j; + char *pi, *pj, *pk; + + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + + if ( quicksort_compare_strings( pi, pj ) < 0 ) { + if ( quicksort_compare_strings( pi, pk ) < 0 ) { + if ( quicksort_compare_strings( pj, pk ) < 0 ) + return ( pj ); + return ( pk ); + } + return ( pi ); + } + + if ( quicksort_compare_strings( pj, pk ) < 0 ) { + if ( quicksort_compare_strings( pi, pk ) < 0 ) + return ( pi ); + return ( pk ); + } + + return ( pj ); +} + + +char *quicksort_pivot_vectors( char *a, unsigned long n, unsigned long es ) +{ + long j; + char *pi, *pj, *pk; + + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + + if ( quicksort_compare_vectors( pi, pj ) < 0 ) { + if ( quicksort_compare_vectors( pi, pk ) < 0 ) { + if ( quicksort_compare_vectors( pj, pk ) < 0 ) + return ( pj ); + return ( pk ); + } + return ( pi ); + } + + if ( quicksort_compare_vectors( pj, pk ) < 0 ) { + if ( quicksort_compare_vectors( pi, pk ) < 0 ) + return ( pi ); + return ( pk ); + } + + return ( pj ); +} diff --git a/targets/wasm-tacle/kernel/quicksort/quicksortstdlib.h b/targets/wasm-tacle/kernel/quicksort/quicksortstdlib.h new file mode 100755 index 0000000..1b52de8 --- /dev/null +++ b/targets/wasm-tacle/kernel/quicksort/quicksortstdlib.h @@ -0,0 +1,34 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksort + + Author: Matthew R. Guthaus + + Function: quicksort applies a recursive quicksort algorithm to two different + input sets. + + Source: MiBench + http://wwweb.eecs.umich.edu/mibench + + Original name: qsort + + Changes: No major functional changes. + + License: GPL + +*/ + + +#ifndef __QUICKSORTSTDLIB_H +#define __QUICKSORTSTDLIB_H + +int quicksort_compare_strings( const char *, const char * ); +int quicksort_compare_vectors( const char *, const char * ); +void quicksort_swapi( char *, char *, unsigned long ); +char *quicksort_pivot_strings( char *, unsigned long, unsigned long ); +char *quicksort_pivot_vectors( char *, unsigned long, unsigned long ); + +#endif diff --git a/targets/wasm-tacle/kernel/rad2deg/CMakeLists.txt b/targets/wasm-tacle/kernel/rad2deg/CMakeLists.txt new file mode 100644 index 0000000..a3fbff2 --- /dev/null +++ b/targets/wasm-tacle/kernel/rad2deg/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(rad2deg) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/rad2deg.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/rad2deg.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/rad2deg/ChangeLog.txt b/targets/wasm-tacle/kernel/rad2deg/ChangeLog.txt new file mode 100755 index 0000000..4735ade --- /dev/null +++ b/targets/wasm-tacle/kernel/rad2deg/ChangeLog.txt @@ -0,0 +1,78 @@ +Original provenience: MiBench benchmark suite, + http://wwweb.eecs.umich.edu/mibench + +2016-02-09: +- Added TACLeBench header +- Renamed benchmark from 'basicmath_small' to 'basicmath' +- Fixed a typo in code comments: 'soem' -> 'some' +- Removed unused variable 'n' from the main funcion +- Added variable 'double Y' to the main function and accumulated the results of + 'deg2rad(X)' and 'rad2deg(X)' in this variable so that the compiler warning + 'statement with no effect' is fixed. +- Removed conditionally compiled main (test) function from isqrt.c +- Removed conditionally compiled main (test) function from cubic.c +- Removed commented-out code +- Removed unused function, variable, macro and type declarations, structs and + unions +- Removed seemingly unnecessary empty lines +- Renamed memcpy.t to basicmath_libc.c +- Removed unused files: + rad2deg.c + sniptype.h + sniptype.h +- Created basicmath_libc.h and put declaration of basicmath_memcpy() in it +- Reorganized snipmath.h so that the following are in the given order just +after the header + - includes + - declarations of functions +- Reorganized sniptype.h so that the following are in the given order just +after the header + - macro definitions + - type definitions +- Removed duplicated copyright information from wcclibm.c +- Removed __STDC__ checks from wcclibm.c and used only ANSI style function + arguments +- Removed 'last modified' comments from files +- Removed mention 'use __kernel_rem_pio2f()' from comments of function + __ieee754_rem_pio2f() since it doesn't really use it. +- Removed math functions specialization macros from wcclibm.h and updated call + sites with explicit nameks of the functions. +- Removed '#define double float' from wcclibm.h and replaced all 'double's +with 'float's in the benchmark +- Added a new main function that calls the old main function +- Annotated basicmath_main() as the entry point of the analysis +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2017-06-27 +- Introduce basicmath_init and basicmath_return functions. +- Add prefix basicmath_ to global variables. +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. + +2017-07-10 +- Fix possible stack buffer overflow caused by sizeof of incorrect type. + +2019-03-07 +-split basicmath into seperate files +-Add TACLeBench Header +-put each benchmark into a seperate folder +-adjust the code formatting to the common TACLeBench code style diff --git a/targets/wasm-tacle/kernel/rad2deg/generated/default/rad2deg.wasm b/targets/wasm-tacle/kernel/rad2deg/generated/default/rad2deg.wasm new file mode 100755 index 0000000000000000000000000000000000000000..06bf382662dd2767b38c29ffe3f1eb8aa3378041 GIT binary patch literal 638 zcmZ`#L2J}N6n<|e-EKF#Y*|4BFWH`|%PwsxwFM6w7Ev#HQSc(OlVlo0CzCLl=;lyT z#6v+4Df%1qS9lS@f1(Gk1&>a)Y;Qgu!^ijLec#Lnyhssj_1jS;6Lm7#K?eu`_UN3{ zHO#>_*5oF(8Ot?~Q@$ayEDy3$MF7;Hh{RdL91+(j0=90@8vT#kZVmoC{6D_h+AG-!C6cKYMU71WSGS_2K@- z7S4WL{+zNNxITDrc(rRG9+I<0#(hEX6l>oKAFPHATn;ziHkM>crq{Mx@V@bV`tm`~ z>U|wz7hS)3*>f>aC-=PVy`6GN@85yPeZzGu3_BLwlv)(dsFRk`B(J$F#i*Z_h6hrNW0?h97Nfov V$3hDgim|D3QHsW>MT`<D`log2q7?QHOE{jxI zSDMRIfj1QQ9#R_*10g<yB-6FDS9nw_LFbN;}Ig< zPtozO`!nEpGln2S-fHd*o;g2<89UxN=e>W$ezYWbkF0s_3XZ@hhckH5LDw@}u@Q&J zg+{A~-1pAqlrGu*HrYP}kpG5v0o?jZ<^|a*2 z^LU{Ug-&;=l36F5oFX{QSeYC|HzaAedQ|FSQzfJgjvP$L7}_l28b=@FO4%w(GO2c_ z7gx)R4@|mK3;JUJ01dgL-T(jq literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/kernel/recursion/generated/default/recursion.wat b/targets/wasm-tacle/kernel/recursion/generated/default/recursion.wat new file mode 100644 index 0000000..e10abce --- /dev/null +++ b/targets/wasm-tacle/kernel/recursion/generated/default/recursion.wat @@ -0,0 +1,80 @@ +(module $recursion.wasm + (type (;0;) (func)) + (type (;1;) (func (param i32) (result i32))) + (type (;2;) (func (result i32))) + (func $__wasm_apply_data_relocs (type 0)) + (func $recursion_fib (type 1) (param i32) (result i32) + (local i32) + i32.const 1 + local.set 1 + block ;; label = @1 + local.get 0 + i32.const 2 + i32.lt_u + br_if 0 (;@1;) + i32.const 0 + local.set 1 + loop ;; label = @2 + local.get 0 + i32.const -1 + i32.add + call $recursion_fib + local.get 1 + i32.add + local.set 1 + local.get 0 + i32.const -2 + i32.add + local.tee 0 + i32.const 1 + i32.gt_u + br_if 0 (;@2;) + end + local.get 1 + i32.const 1 + i32.add + local.set 1 + end + local.get 1) + (func $recursion_main (type 0) + i32.const 0 + i32.const 0 + i32.load offset=1024 + call $recursion_fib + i32.store offset=1028) + (func $__original_main (type 2) (result i32) + (local i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 10 + i32.store offset=12 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.store offset=1024 + call $recursion_main + i32.const 0 + i32.load offset=1028 + local.set 1 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1 + i32.const 89 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5136)) + (global (;1;) i32 (i32.const 1032)) + (global (;2;) i32 (i32.const 5136)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $recursion_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/kernel/recursion/generated/modified_sources/default/recursion.c b/targets/wasm-tacle/kernel/recursion/generated/modified_sources/default/recursion.c new file mode 100644 index 0000000..b3b4564 --- /dev/null +++ b/targets/wasm-tacle/kernel/recursion/generated/modified_sources/default/recursion.c @@ -0,0 +1,71 @@ +/* + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: recursion + + Author: unknown + + Function: recursion is a recursion program. + This program computes the Fibonacci number recursively. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/recursion/recursion.c + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +/* + Global Variables +*/ + +int recursion_result; +int recursion_input; + +/* + Forward declaration of functions +*/ +int recursion_fib(int i); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +recursion_main(void); +void recursion_init(void); +int recursion_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +void +recursion_init() { + int volatile temp_input = 10; + recursion_input = temp_input; +} + +int +recursion_fib(int i) { + if (i == 0) + return 1; + if (i == 1) + return 1; + + return recursion_fib(i - 1) + recursion_fib(i - 2); +} + +int +recursion_return() { + return (recursion_result + (-89)) != 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +recursion_main(void) { + _Pragma("marker recursivecall") + _Pragma("flowrestriction 1*fib <= 177*recursivecall") recursion_result = + recursion_fib(recursion_input); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + recursion_init(); + recursion_main(); + return (recursion_return()); +} diff --git a/targets/wasm-tacle/kernel/recursion/generated/modified_sources/inline/recursion.c b/targets/wasm-tacle/kernel/recursion/generated/modified_sources/inline/recursion.c new file mode 100644 index 0000000..ee96b35 --- /dev/null +++ b/targets/wasm-tacle/kernel/recursion/generated/modified_sources/inline/recursion.c @@ -0,0 +1,79 @@ +/* + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: recursion + + Author: unknown + + Function: recursion is a recursion program. + This program computes the Fibonacci number recursively. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/recursion/recursion.c + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +/* + Global Variables +*/ + + + + +int recursion_result; +int recursion_input; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline int recursion_fib(int i); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +recursion_main(void); +__attribute__((always_inline)) static inline void recursion_init(void); +__attribute__((always_inline)) static inline int recursion_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +__attribute__((always_inline)) static inline void +recursion_init() { + int volatile temp_input = 10; + recursion_input = temp_input; +} + +__attribute__((always_inline)) static inline int +recursion_fib(int i) { + if (i == 0) + return 1; + if (i == 1) + return 1; + + return recursion_fib(i - 1) + recursion_fib(i - 2); +} + +__attribute__((always_inline)) static inline int +recursion_return() { + return (recursion_result + (-89)) != 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +recursion_main(void) { + _Pragma("marker recursivecall") + _Pragma("flowrestriction 1*fib <= 177*recursivecall") recursion_result = + recursion_fib(recursion_input); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + recursion_init(); + recursion_main(); + return (recursion_return()); +} diff --git a/targets/wasm-tacle/kernel/recursion/recursion.c b/targets/wasm-tacle/kernel/recursion/recursion.c new file mode 100755 index 0000000..f0e7edd --- /dev/null +++ b/targets/wasm-tacle/kernel/recursion/recursion.c @@ -0,0 +1,72 @@ +/* + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: recursion + + Author: unknown + + Function: recursion is a recursion program. + This program computes the Fibonacci number recursively. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/recursion/recursion.c + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + + +/* + Global Variables +*/ +int recursion_result; +int recursion_input; + +/* + Forward declaration of functions +*/ +int recursion_fib( int i ); +void recursion_main( void ); +void recursion_init( void ); +int recursion_return( void ); +int main ( void ); + + +void recursion_init() +{ + int volatile temp_input = 10; + recursion_input = temp_input; +} + + +int recursion_fib( int i ) +{ + if ( i == 0 ) + return 1; + if ( i == 1 ) + return 1; + + return recursion_fib( i - 1 ) + recursion_fib( i - 2 ); +} + +int recursion_return() +{ + return ( recursion_result + ( -89 ) ) != 0; +} + +void _Pragma( "entrypoint" ) recursion_main( void ) +{ + _Pragma( "marker recursivecall" ) + _Pragma( "flowrestriction 1*fib <= 177*recursivecall" ) + recursion_result = recursion_fib( recursion_input ); +} + +int main( void ) +{ + recursion_init(); + recursion_main(); + return ( recursion_return() ); +} diff --git a/targets/wasm-tacle/kernel/sha/CMakeLists.txt b/targets/wasm-tacle/kernel/sha/CMakeLists.txt new file mode 100644 index 0000000..1960464 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/CMakeLists.txt @@ -0,0 +1,29 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(sha) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/sha.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/sha.c" + "generated/modified_sources/default/input_small.c" + "generated/modified_sources/default/memcpy.c" + "generated/modified_sources/default/memhelper.c" + "generated/modified_sources/default/memset.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/sha/Changelog.txt b/targets/wasm-tacle/kernel/sha/Changelog.txt new file mode 100755 index 0000000..d78afd2 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/Changelog.txt @@ -0,0 +1,108 @@ +File: sha.c +Original provenience: + +2017-04-18: +- Annotated sha_main as entry-point for timing analysis + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed IFDEF lines +- Added main functionality from sha_driver.c +- Added prefix to functions (sha_functionname) +- Added sha_main, sha_init, sha_return functions +- Changed local to global variable for the init function +- Added checksum in return to return 0 when calculated correctly +- Applied Code Style + +File: sha.h +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Add forward declaration of functions +- Applied Code Style + +File: glibc_common.h +Original provenience: + +2015-03-30: +- Removed file and copy to sha.h + +File: my_file.h +Original provenience: + +2015-03-30: +- Removed file and copy to sha.h + +File: my_file.c +Original provenience: + +2015-03-30: +- Remove file and copy to sha.c + +File: input_small.c +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- reformatted data to 20 chars per line +- Added generic TACLeBench header to line 1 +- Applied Code Style + +File: memhelper.h +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed unnecessary #IFNDEF +- Applied Code Style + +File: memhelper.c +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Added break; to switch statement +- Applied Code Style + + +File: memset.h +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Applied Code Style + + +File: memset.c +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Applied Code Style + + +File: memcpy.h +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Added prefix to functions (sha_functionname) +- Applied Code Style + + +File: memcpy.c +Original provenience: + +2015-03-30: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Added prefix to functions (sha_functionname) +- Applied Code Style diff --git a/targets/wasm-tacle/kernel/sha/generated/default/sha.wasm b/targets/wasm-tacle/kernel/sha/generated/default/sha.wasm new file mode 100755 index 0000000000000000000000000000000000000000..2a5eee5d77a22ddf2edc5350de5e4db126a97d84 GIT binary patch literal 39146 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 a*VaJRWgxw(oQb+^8Scu3ka= OP_T_THRES) { + /* Copy just a few bytes to make DSTP aligned. */ + len -= (-dstp) % OPSIZ; + + __nbytes = (-dstp) % OPSIZ; + __pragma_loopbound(0, 0); + while (__nbytes > 0) { + BYTE __x = ((BYTE *) srcp)[0]; + srcp += 1; + __nbytes -= 1; + ((BYTE *) dstp)[0] = __x; + dstp += 1; + } + + /* Copy whole pages from SRCP to DSTP by virtual address manipulation, + as much as possible. */ + + PAGE_COPY_FWD_MAYBE(dstp, srcp, len, len); + + /* Copy from SRCP to DSTP taking advantage of the known alignment of + DSTP. Number of bytes remaining is put in the third argument, + i.e. in LEN. This number may vary from machine to machine. */ + + WORD_COPY_FWD(dstp, srcp, len, len); + + /* Fall out and copy the tail. */ + } + + /* There are just a few bytes to copy. Use byte memory operations. */ + __nbytes = len; + __pragma_loopbound(0, 7); + while (__nbytes > 0) { + BYTE __x = ((BYTE *) srcp)[0]; + srcp += 1; + __nbytes -= 1; + ((BYTE *) dstp)[0] = __x; + dstp += 1; + } + + return dstpp; +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memcpy.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memcpy.h new file mode 100644 index 0000000..5479181 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memcpy.h @@ -0,0 +1,25 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memcpy.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memhelper.h" +#include "sha.h" + +void *sha_glibc_memcpy(void *dstpp, const void *srcpp, size_t len); diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.c new file mode 100644 index 0000000..a447691 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.c @@ -0,0 +1,151 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memhelper.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy block beginning at SRCP to + block beginning at DSTP with LEN `op_t' words (not LEN bytes!). + Both SRCP and DSTP should be aligned for memory operations on `op_t's. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memhelper.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int printf(const char *restrict format, ...); +/* sha_wordcopy_fwd_aligned -- Copy block beginning at SRCP to + block beginning at DSTP with LEN `op_t' words (not LEN bytes!). + Both SRCP and DSTP should be aligned for memory operations on `op_t's. +*/ + +void +sha_wordcopy_fwd_aligned(long int dstp, long int srcp, size_t len) { + op_t a0 = 0; + op_t a1 = 0; + char switch_target; + + switch (len % 8) { + case 2: + a0 = ((op_t *) srcp)[0]; + srcp -= 6 * OPSIZ; + dstp -= 7 * OPSIZ; + len += 6; + switch_target = 1; + break; + case 3: + a1 = ((op_t *) srcp)[0]; + srcp -= 5 * OPSIZ; + dstp -= 6 * OPSIZ; + len += 5; + switch_target = 2; + break; + case 4: + a0 = ((op_t *) srcp)[0]; + srcp -= 4 * OPSIZ; + dstp -= 5 * OPSIZ; + len += 4; + switch_target = 3; + break; + case 5: + a1 = ((op_t *) srcp)[0]; + srcp -= 3 * OPSIZ; + dstp -= 4 * OPSIZ; + len += 3; + switch_target = 4; + break; + case 6: + a0 = ((op_t *) srcp)[0]; + srcp -= 2 * OPSIZ; + dstp -= 3 * OPSIZ; + len += 2; + switch_target = 5; + break; + case 7: + a1 = ((op_t *) srcp)[0]; + srcp -= 1 * OPSIZ; + dstp -= 2 * OPSIZ; + len += 1; + switch_target = 6; + break; + case 0: + if (OP_T_THRES <= 3 * OPSIZ && len == 0) + return; + a0 = ((op_t *) srcp)[0]; + srcp -= 0 * OPSIZ; + dstp -= 1 * OPSIZ; + switch_target = 7; + break; + case 1: + a1 = ((op_t *) srcp)[0]; + srcp -= -1 * OPSIZ; + dstp -= 0 * OPSIZ; + len -= 1; + if (OP_T_THRES <= 3 * OPSIZ && len == 0) { + ((op_t *) dstp)[0] = a1; + return; + } else { + switch_target = 8; + break; + } + } + + __pragma_loopbound(1, 2); // max 1 + do { + switch (switch_target) { + case 8: + a0 = ((op_t *) srcp)[0]; + ((op_t *) dstp)[0] = a1; + break; + case 7: + a1 = ((op_t *) srcp)[1]; + ((op_t *) dstp)[1] = a0; + break; + case 6: + a0 = ((op_t *) srcp)[2]; + ((op_t *) dstp)[2] = a1; + break; + case 5: + a1 = ((op_t *) srcp)[3]; + ((op_t *) dstp)[3] = a0; + break; + case 4: + a0 = ((op_t *) srcp)[4]; + ((op_t *) dstp)[4] = a1; + break; + case 3: + a1 = ((op_t *) srcp)[5]; + ((op_t *) dstp)[5] = a0; + break; + case 2: + a0 = ((op_t *) srcp)[6]; + ((op_t *) dstp)[6] = a1; + break; + case 1: + a1 = ((op_t *) srcp)[7]; + ((op_t *) dstp)[7] = a0; + break; + } + + srcp += 8 * OPSIZ; + dstp += 8 * OPSIZ; + len -= 8; + switch_target = 8; + } while (len != 0); + + ((op_t *) dstp)[0] = a1; +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.h new file mode 100644 index 0000000..2a4d25c --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memhelper.h @@ -0,0 +1,54 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memhelper.h + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + License: GNU Lesser General Public License + + Changes: no major functional changes + +*/ + +#ifndef MEM_HELPER_H +#define MEM_HELPER_H + +#include "sha.h" + +void sha_wordcopy_fwd_aligned(long int dstp, long int srcp, size_t len); + +/* Type to use for aligned memory operations. + This should normally be the biggest type supported by a single load + and store. */ +#define op_t unsigned long int +#define OPSIZ (sizeof(op_t)) + +/* Threshold value for when to enter the unrolled loops. */ +#define OP_T_THRES 16 + +#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) +#define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) + +/* Copy *up to* NBYTES bytes from SRC_BP to DST_BP, with + the assumption that DST_BP is aligned on an OPSIZ multiple. If + not all bytes could be easily copied, store remaining number of bytes + in NBYTES_LEFT, otherwise store 0. */ +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ + { \ + if (src_bp % OPSIZ == 0) \ + sha_wordcopy_fwd_aligned(dst_bp, src_bp, (nbytes) / OPSIZ); \ + else \ + src_bp += (nbytes) & -OPSIZ; \ + dst_bp += (nbytes) & -OPSIZ; \ + (nbytes_left) = (nbytes) % OPSIZ; \ + } + +#endif // MEM_HELPER_H diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.c new file mode 100644 index 0000000..e9b31dc --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.c @@ -0,0 +1,92 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: menset.h + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: GNU Lesser General Public License +*/ +#include "memset.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int printf(const char *restrict format, ...); + +void * +sha_glibc_memset(void *dstpp, int c, size_t len) { + long int dstp = (long int) dstpp; + + if (len >= 8) { + size_t xlen; + op_t cccc; + + cccc = (unsigned char) c; + cccc |= cccc << 8; + cccc |= cccc << 16; + if (OPSIZ > 4) + /* Do the shift in two steps to avoid warning if long has 32 bits. + */ + cccc |= (cccc << 16) << 16; + + /* There are at least some bytes to set. + No need to test for LEN == 0 in this alignment loop. */ + __pragma_loopbound(3, 3); + while (dstp % OPSIZ != 0) { + ((BYTE *) dstp)[0] = c; + dstp += 1; + len -= 1; + } + + /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */ + xlen = len / (OPSIZ * 8); + __pragma_loopbound(0, 1); + while (xlen > 0) { + ((op_t *) dstp)[0] = cccc; + ((op_t *) dstp)[1] = cccc; + ((op_t *) dstp)[2] = cccc; + ((op_t *) dstp)[3] = cccc; + ((op_t *) dstp)[4] = cccc; + ((op_t *) dstp)[5] = cccc; + ((op_t *) dstp)[6] = cccc; + ((op_t *) dstp)[7] = cccc; + dstp += 8 * OPSIZ; + xlen -= 1; + } + len %= OPSIZ * 8; + + /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */ + xlen = len / OPSIZ; + __pragma_loopbound(1, 2); + while (xlen > 0) { + ((op_t *) dstp)[0] = cccc; + dstp += OPSIZ; + xlen -= 1; + } + len %= OPSIZ; + } + + /* Write the last few bytes. */ + __pragma_loopbound(0, 0); + while (len > 0) { + ((BYTE *) dstp)[0] = c; + dstp += 1; + len -= 1; + } + + return (void *) dstpp; +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.h new file mode 100644 index 0000000..48f236b --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/memset.h @@ -0,0 +1,23 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: menset.h + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + License: GNU Lesser General Public License + + Changes: no major functional changes +*/ +#include "memhelper.h" + +void *sha_glibc_memset(void *dstpp, int c, size_t len); diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.c new file mode 100644 index 0000000..12f9fdd --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.c @@ -0,0 +1,232 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: sha.c + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + Changes: no major functional changes + + License: GNU Lesser General Public License + +*/ + +#include "sha.h" +#include "memcpy.h" +#include "memset.h" + +/* + Declaration of global variables +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +struct SHA_INFO sha_info; + +/* SHA f()-functions */ +#define f1(x, y, z) ((x & y) | (~x & z)) +#define f2(x, y, z) (x ^ y ^ z) +#define f3(x, y, z) ((x & y) | (x & z) | (y & z)) +#define f4(x, y, z) (x ^ y ^ z) + +/* SHA constants */ +#define CONST1 0x5a827999L +#define CONST2 0x6ed9eba1L +#define CONST3 0x8f1bbcdcL +#define CONST4 0xca62c1d6L + +#define BLOCK_SIZE 8192 + +/* 32-bit rotate */ + +#define ROT32(x, n) ((x << n) | (x >> (32 - n))) + +#define FUNC(n, i) \ + temp = ROT32(A, 5) + f##n(B, C, D) + E + W[i] + CONST##n; \ + E = D; \ + D = C; \ + C = ROT32(B, 30); \ + B = A; \ + A = temp + +/* do SHA transformation */ +void +sha_transform(struct SHA_INFO *sha_info) { + int i; + LONG temp, A, B, C, D, E, W[80]; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) + W[i] = sha_info->data[i]; + __pragma_loopbound(64, 64); + for (i = 16; i < 80; ++i) + W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + + A = sha_info->digest[0]; + B = sha_info->digest[1]; + C = sha_info->digest[2]; + D = sha_info->digest[3]; + E = sha_info->digest[4]; + + __pragma_loopbound(20, 20); + for (i = 0; i < 20; ++i) { + FUNC(1, i); + } + __pragma_loopbound(20, 20); + for (i = 20; i < 40; ++i) { + FUNC(2, i); + } + __pragma_loopbound(20, 20); + for (i = 40; i < 60; ++i) { + FUNC(3, i); + } + __pragma_loopbound(20, 20); + for (i = 60; i < 80; ++i) { + FUNC(4, i); + } + sha_info->digest[0] += A; + sha_info->digest[1] += B; + sha_info->digest[2] += C; + sha_info->digest[3] += D; + sha_info->digest[4] += E; +} + +/* change endianness of data */ +void +sha_byte_reverse(LONG *buffer, int count) { + int i; + BYTE ct[4], *cp; + + count /= sizeof(LONG); + cp = (BYTE *) buffer; + __pragma_loopbound(16, 16); + for (i = 0; i < count; ++i) { + ct[0] = cp[0]; + ct[1] = cp[1]; + ct[2] = cp[2]; + ct[3] = cp[3]; + cp[0] = ct[3]; + cp[1] = ct[2]; + cp[2] = ct[1]; + cp[3] = ct[0]; + cp += sizeof(LONG); + } +} + +/* initialize the SHA digest */ +void +sha_init(void) { + int i; + sha_info.digest[0] = 0x67452301L; + sha_info.digest[1] = 0xefcdab89L; + sha_info.digest[2] = 0x98badcfeL; + sha_info.digest[3] = 0x10325476L; + sha_info.digest[4] = 0xc3d2e1f0L; + sha_info.count_lo = 0L; + sha_info.count_hi = 0L; + for (i = 0; i < 16; i++) + sha_info.data[i] = 0; +} + +size_t +sha_fread(void *ptr, size_t size, size_t count, struct SHA_MY_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + size_t number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 8192); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return (number_of_chars_to_read); +} + +/* update the SHA digest */ +void +sha_update(struct SHA_INFO *sha_info, BYTE *buffer, int count) { + if ((sha_info->count_lo + ((LONG) count << 3)) < sha_info->count_lo) + ++sha_info->count_hi; + sha_info->count_lo += (LONG) count << 3; + sha_info->count_hi += (LONG) count >> 29; + __pragma_loopbound(8, 128); + while (count >= SHA_BLOCKSIZE) { + sha_glibc_memcpy(sha_info->data, buffer, SHA_BLOCKSIZE); + sha_byte_reverse(sha_info->data, SHA_BLOCKSIZE); + sha_transform(sha_info); + buffer += SHA_BLOCKSIZE; + count -= SHA_BLOCKSIZE; + } + + sha_glibc_memcpy(sha_info->data, buffer, count); +} + +/* finish computing the SHA digest */ +void +sha_final(struct SHA_INFO *sha_info) { + int count; + LONG lo_bit_count, hi_bit_count; + + lo_bit_count = sha_info->count_lo; + hi_bit_count = sha_info->count_hi; + count = (int) ((lo_bit_count >> 3) & 0x3f); + ((BYTE *) sha_info->data)[count++] = 0x80; + if (count > 56) { + sha_glibc_memset((BYTE *) &sha_info->data + count, 0, 64 - count); + sha_byte_reverse(sha_info->data, SHA_BLOCKSIZE); + sha_transform(sha_info); + sha_glibc_memset(&sha_info->data, 0, 56); + } else + sha_glibc_memset((BYTE *) &sha_info->data + count, 0, 56 - count); + + sha_byte_reverse(sha_info->data, SHA_BLOCKSIZE); + sha_info->data[14] = hi_bit_count; + sha_info->data[15] = lo_bit_count; + sha_transform(sha_info); +} + +/* compute the SHA digest of a FILE stream */ + +void +sha_stream(struct SHA_INFO *sha_info, struct SHA_MY_FILE *fin) { + int i; + BYTE data[BLOCK_SIZE]; + __pragma_loopbound(5, 5); + while ((i = sha_fread(data, 1, BLOCK_SIZE, fin)) > 0) + sha_update(sha_info, data, i); + + sha_final(sha_info); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +sha_main(void) { + struct SHA_MY_FILE fin; + fin.data = sha_data; + fin.size = 32743; // set size = 3247552 for input_large + fin.cur_pos = 0; + sha_stream(&sha_info, &fin); +} + +int +sha_return(void) { + int sum = 0; + sum = sha_info.data[14] + sha_info.data[15]; + return (sum - 261944 != 0); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + sha_init(); + sha_main(); + return (sha_return()); +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.h new file mode 100644 index 0000000..f8a04ca --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/default/sha.h @@ -0,0 +1,64 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: sha.h + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. +*/ + +#ifndef SHA_H +#define SHA_H + +/* Useful defines & typedefs */ + +typedef unsigned char BYTE; +typedef unsigned long LONG; +typedef unsigned size_t; + +/* Type to use for unaligned operations. */ +#define SHA_BLOCKSIZE 64 +#define SHA_DIGESTSIZE 20 +#define LITTLE_ENDIAN +#define NULL ((void *) 0) + +extern unsigned volatile char sha_data[32743]; + +struct SHA_MY_FILE { + unsigned volatile char *data; + size_t size; + unsigned cur_pos; +}; + +struct SHA_INFO { + LONG digest[5]; /* message digest */ + LONG count_lo, count_hi; /* 64-bit bit count */ + LONG data[16]; /* SHA data buffer */ +}; + +/* + Forward declaration of functions +*/ +void sha_transform(struct SHA_INFO *); +void sha_byte_reverse(LONG *buffer, int count); +void sha_init(void); +size_t sha_fread(void *, size_t, size_t, struct SHA_MY_FILE *); +void sha_update(struct SHA_INFO *, BYTE *, int); +void sha_final(struct SHA_INFO *); +void sha_stream(struct SHA_INFO *, struct SHA_MY_FILE *); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +sha_main(void); +int sha_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +#endif // SHA_H diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/input_small.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/input_small.c new file mode 100644 index 0000000..1b4a519 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/input_small.c @@ -0,0 +1,2203 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: input_small.c + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. +*/ + +unsigned volatile char sha_data[32743] = { + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', + 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', + 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', + 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', + 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', + 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', + 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', + 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', + 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', + 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', + 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', + 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', + 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', '\n', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', + 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', + 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', + 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', + 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', + 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', + 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', + 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', + 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', + 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', + 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', + 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', + 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', '\n'}; diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.c new file mode 100644 index 0000000..6342012 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.c @@ -0,0 +1,78 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memcpy.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memcpy.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void * +sha_glibc_memcpy(void *dstpp, const void *srcpp, size_t len) { + unsigned long int dstp = (long int) dstpp; + unsigned long int srcp = (long int) srcpp; + size_t __nbytes; + + /* Copy from the beginning to the end. */ + + /* If there not too few bytes to copy, use word copy. */ + if (len >= OP_T_THRES) { + /* Copy just a few bytes to make DSTP aligned. */ + len -= (-dstp) % OPSIZ; + + __nbytes = (-dstp) % OPSIZ; + __pragma_loopbound(0, 0); + while (__nbytes > 0) { + BYTE __x = ((BYTE *) srcp)[0]; + srcp += 1; + __nbytes -= 1; + ((BYTE *) dstp)[0] = __x; + dstp += 1; + } + + /* Copy whole pages from SRCP to DSTP by virtual address manipulation, + as much as possible. */ + + PAGE_COPY_FWD_MAYBE(dstp, srcp, len, len); + + /* Copy from SRCP to DSTP taking advantage of the known alignment of + DSTP. Number of bytes remaining is put in the third argument, + i.e. in LEN. This number may vary from machine to machine. */ + + WORD_COPY_FWD(dstp, srcp, len, len); + + /* Fall out and copy the tail. */ + } + + /* There are just a few bytes to copy. Use byte memory operations. */ + __nbytes = len; + __pragma_loopbound(0, 7); + while (__nbytes > 0) { + BYTE __x = ((BYTE *) srcp)[0]; + srcp += 1; + __nbytes -= 1; + ((BYTE *) dstp)[0] = __x; + dstp += 1; + } + + return dstpp; +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.h new file mode 100644 index 0000000..6cb903c --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memcpy.h @@ -0,0 +1,26 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memcpy.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memhelper.h" +#include "sha.h" + +__attribute__((always_inline)) static inline void * +sha_glibc_memcpy(void *dstpp, const void *srcpp, size_t len); diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.c new file mode 100644 index 0000000..78b0a41 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.c @@ -0,0 +1,151 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memhelper.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy block beginning at SRCP to + block beginning at DSTP with LEN `op_t' words (not LEN bytes!). + Both SRCP and DSTP should be aligned for memory operations on `op_t's. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memhelper.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int printf(const char *restrict format, ...); +/* sha_wordcopy_fwd_aligned -- Copy block beginning at SRCP to + block beginning at DSTP with LEN `op_t' words (not LEN bytes!). + Both SRCP and DSTP should be aligned for memory operations on `op_t's. +*/ + +__attribute__((always_inline)) static inline void +sha_wordcopy_fwd_aligned(long int dstp, long int srcp, size_t len) { + op_t a0 = 0; + op_t a1 = 0; + char switch_target; + + switch (len % 8) { + case 2: + a0 = ((op_t *) srcp)[0]; + srcp -= 6 * OPSIZ; + dstp -= 7 * OPSIZ; + len += 6; + switch_target = 1; + break; + case 3: + a1 = ((op_t *) srcp)[0]; + srcp -= 5 * OPSIZ; + dstp -= 6 * OPSIZ; + len += 5; + switch_target = 2; + break; + case 4: + a0 = ((op_t *) srcp)[0]; + srcp -= 4 * OPSIZ; + dstp -= 5 * OPSIZ; + len += 4; + switch_target = 3; + break; + case 5: + a1 = ((op_t *) srcp)[0]; + srcp -= 3 * OPSIZ; + dstp -= 4 * OPSIZ; + len += 3; + switch_target = 4; + break; + case 6: + a0 = ((op_t *) srcp)[0]; + srcp -= 2 * OPSIZ; + dstp -= 3 * OPSIZ; + len += 2; + switch_target = 5; + break; + case 7: + a1 = ((op_t *) srcp)[0]; + srcp -= 1 * OPSIZ; + dstp -= 2 * OPSIZ; + len += 1; + switch_target = 6; + break; + case 0: + if (OP_T_THRES <= 3 * OPSIZ && len == 0) + return; + a0 = ((op_t *) srcp)[0]; + srcp -= 0 * OPSIZ; + dstp -= 1 * OPSIZ; + switch_target = 7; + break; + case 1: + a1 = ((op_t *) srcp)[0]; + srcp -= -1 * OPSIZ; + dstp -= 0 * OPSIZ; + len -= 1; + if (OP_T_THRES <= 3 * OPSIZ && len == 0) { + ((op_t *) dstp)[0] = a1; + return; + } else { + switch_target = 8; + break; + } + } + + __pragma_loopbound(1, 2); // max 1 + do { + switch (switch_target) { + case 8: + a0 = ((op_t *) srcp)[0]; + ((op_t *) dstp)[0] = a1; + break; + case 7: + a1 = ((op_t *) srcp)[1]; + ((op_t *) dstp)[1] = a0; + break; + case 6: + a0 = ((op_t *) srcp)[2]; + ((op_t *) dstp)[2] = a1; + break; + case 5: + a1 = ((op_t *) srcp)[3]; + ((op_t *) dstp)[3] = a0; + break; + case 4: + a0 = ((op_t *) srcp)[4]; + ((op_t *) dstp)[4] = a1; + break; + case 3: + a1 = ((op_t *) srcp)[5]; + ((op_t *) dstp)[5] = a0; + break; + case 2: + a0 = ((op_t *) srcp)[6]; + ((op_t *) dstp)[6] = a1; + break; + case 1: + a1 = ((op_t *) srcp)[7]; + ((op_t *) dstp)[7] = a0; + break; + } + + srcp += 8 * OPSIZ; + dstp += 8 * OPSIZ; + len -= 8; + switch_target = 8; + } while (len != 0); + + ((op_t *) dstp)[0] = a1; +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.h new file mode 100644 index 0000000..9b340bb --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memhelper.h @@ -0,0 +1,55 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memhelper.h + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + License: GNU Lesser General Public License + + Changes: no major functional changes + +*/ + +#ifndef MEM_HELPER_H +#define MEM_HELPER_H + +#include "sha.h" + +__attribute__((always_inline)) static inline void +sha_wordcopy_fwd_aligned(long int dstp, long int srcp, size_t len); + +/* Type to use for aligned memory operations. + This should normally be the biggest type supported by a single load + and store. */ +#define op_t unsigned long int +#define OPSIZ (sizeof(op_t)) + +/* Threshold value for when to enter the unrolled loops. */ +#define OP_T_THRES 16 + +#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) +#define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) + +/* Copy *up to* NBYTES bytes from SRC_BP to DST_BP, with + the assumption that DST_BP is aligned on an OPSIZ multiple. If + not all bytes could be easily copied, store remaining number of bytes + in NBYTES_LEFT, otherwise store 0. */ +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ + { \ + if (src_bp % OPSIZ == 0) \ + sha_wordcopy_fwd_aligned(dst_bp, src_bp, (nbytes) / OPSIZ); \ + else \ + src_bp += (nbytes) & -OPSIZ; \ + dst_bp += (nbytes) & -OPSIZ; \ + (nbytes_left) = (nbytes) % OPSIZ; \ + } + +#endif // MEM_HELPER_H diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.c new file mode 100644 index 0000000..8f95884 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.c @@ -0,0 +1,92 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: menset.h + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: GNU Lesser General Public License +*/ +#include "memset.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int printf(const char *restrict format, ...); + +__attribute__((always_inline)) static inline void * +sha_glibc_memset(void *dstpp, int c, size_t len) { + long int dstp = (long int) dstpp; + + if (len >= 8) { + size_t xlen; + op_t cccc; + + cccc = (unsigned char) c; + cccc |= cccc << 8; + cccc |= cccc << 16; + if (OPSIZ > 4) + /* Do the shift in two steps to avoid warning if long has 32 bits. + */ + cccc |= (cccc << 16) << 16; + + /* There are at least some bytes to set. + No need to test for LEN == 0 in this alignment loop. */ + __pragma_loopbound(3, 3); + while (dstp % OPSIZ != 0) { + ((BYTE *) dstp)[0] = c; + dstp += 1; + len -= 1; + } + + /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */ + xlen = len / (OPSIZ * 8); + __pragma_loopbound(0, 1); + while (xlen > 0) { + ((op_t *) dstp)[0] = cccc; + ((op_t *) dstp)[1] = cccc; + ((op_t *) dstp)[2] = cccc; + ((op_t *) dstp)[3] = cccc; + ((op_t *) dstp)[4] = cccc; + ((op_t *) dstp)[5] = cccc; + ((op_t *) dstp)[6] = cccc; + ((op_t *) dstp)[7] = cccc; + dstp += 8 * OPSIZ; + xlen -= 1; + } + len %= OPSIZ * 8; + + /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */ + xlen = len / OPSIZ; + __pragma_loopbound(1, 2); + while (xlen > 0) { + ((op_t *) dstp)[0] = cccc; + dstp += OPSIZ; + xlen -= 1; + } + len %= OPSIZ; + } + + /* Write the last few bytes. */ + __pragma_loopbound(0, 0); + while (len > 0) { + ((BYTE *) dstp)[0] = c; + dstp += 1; + len -= 1; + } + + return (void *) dstpp; +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.h new file mode 100644 index 0000000..ede71ca --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/memset.h @@ -0,0 +1,24 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: menset.h + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + License: GNU Lesser General Public License + + Changes: no major functional changes +*/ +#include "memhelper.h" + +__attribute__((always_inline)) static inline void * +sha_glibc_memset(void *dstpp, int c, size_t len); diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.c b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.c new file mode 100644 index 0000000..216bf97 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.c @@ -0,0 +1,241 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: sha.c + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + Changes: no major functional changes + + License: GNU Lesser General Public License + +*/ + +#include "sha.h" +#include "memcpy.h" +#include "memset.h" + +/* + Declaration of global variables +*/ + +// Wasm loop bounds + + +#include "input_small.c" +#include "memcpy.c" +#include "memhelper.c" +#include "memset.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +struct SHA_INFO sha_info; + +/* SHA f()-functions */ +#define f1(x, y, z) ((x & y) | (~x & z)) +#define f2(x, y, z) (x ^ y ^ z) +#define f3(x, y, z) ((x & y) | (x & z) | (y & z)) +#define f4(x, y, z) (x ^ y ^ z) + +/* SHA constants */ +#define CONST1 0x5a827999L +#define CONST2 0x6ed9eba1L +#define CONST3 0x8f1bbcdcL +#define CONST4 0xca62c1d6L + +#define BLOCK_SIZE 8192 + +/* 32-bit rotate */ + +#define ROT32(x, n) ((x << n) | (x >> (32 - n))) + +#define FUNC(n, i) \ + temp = ROT32(A, 5) + f##n(B, C, D) + E + W[i] + CONST##n; \ + E = D; \ + D = C; \ + C = ROT32(B, 30); \ + B = A; \ + A = temp + +/* do SHA transformation */ +__attribute__((always_inline)) static inline void +sha_transform(struct SHA_INFO *sha_info) { + int i; + LONG temp, A, B, C, D, E, W[80]; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) + W[i] = sha_info->data[i]; + __pragma_loopbound(64, 64); + for (i = 16; i < 80; ++i) + W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + + A = sha_info->digest[0]; + B = sha_info->digest[1]; + C = sha_info->digest[2]; + D = sha_info->digest[3]; + E = sha_info->digest[4]; + + __pragma_loopbound(20, 20); + for (i = 0; i < 20; ++i) { + FUNC(1, i); + } + __pragma_loopbound(20, 20); + for (i = 20; i < 40; ++i) { + FUNC(2, i); + } + __pragma_loopbound(20, 20); + for (i = 40; i < 60; ++i) { + FUNC(3, i); + } + __pragma_loopbound(20, 20); + for (i = 60; i < 80; ++i) { + FUNC(4, i); + } + sha_info->digest[0] += A; + sha_info->digest[1] += B; + sha_info->digest[2] += C; + sha_info->digest[3] += D; + sha_info->digest[4] += E; +} + +/* change endianness of data */ +__attribute__((always_inline)) static inline void +sha_byte_reverse(LONG *buffer, int count) { + int i; + BYTE ct[4], *cp; + + count /= sizeof(LONG); + cp = (BYTE *) buffer; + __pragma_loopbound(16, 16); + for (i = 0; i < count; ++i) { + ct[0] = cp[0]; + ct[1] = cp[1]; + ct[2] = cp[2]; + ct[3] = cp[3]; + cp[0] = ct[3]; + cp[1] = ct[2]; + cp[2] = ct[1]; + cp[3] = ct[0]; + cp += sizeof(LONG); + } +} + +/* initialize the SHA digest */ +__attribute__((always_inline)) static inline void +sha_init(void) { + int i; + sha_info.digest[0] = 0x67452301L; + sha_info.digest[1] = 0xefcdab89L; + sha_info.digest[2] = 0x98badcfeL; + sha_info.digest[3] = 0x10325476L; + sha_info.digest[4] = 0xc3d2e1f0L; + sha_info.count_lo = 0L; + sha_info.count_hi = 0L; + for (i = 0; i < 16; i++) + sha_info.data[i] = 0; +} + +__attribute__((always_inline)) static inline size_t +sha_fread(void *ptr, size_t size, size_t count, struct SHA_MY_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + size_t number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 8192); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return (number_of_chars_to_read); +} + +/* update the SHA digest */ +__attribute__((always_inline)) static inline void +sha_update(struct SHA_INFO *sha_info, BYTE *buffer, int count) { + if ((sha_info->count_lo + ((LONG) count << 3)) < sha_info->count_lo) + ++sha_info->count_hi; + sha_info->count_lo += (LONG) count << 3; + sha_info->count_hi += (LONG) count >> 29; + __pragma_loopbound(8, 128); + while (count >= SHA_BLOCKSIZE) { + sha_glibc_memcpy(sha_info->data, buffer, SHA_BLOCKSIZE); + sha_byte_reverse(sha_info->data, SHA_BLOCKSIZE); + sha_transform(sha_info); + buffer += SHA_BLOCKSIZE; + count -= SHA_BLOCKSIZE; + } + + sha_glibc_memcpy(sha_info->data, buffer, count); +} + +/* finish computing the SHA digest */ +__attribute__((always_inline)) static inline void +sha_final(struct SHA_INFO *sha_info) { + int count; + LONG lo_bit_count, hi_bit_count; + + lo_bit_count = sha_info->count_lo; + hi_bit_count = sha_info->count_hi; + count = (int) ((lo_bit_count >> 3) & 0x3f); + ((BYTE *) sha_info->data)[count++] = 0x80; + if (count > 56) { + sha_glibc_memset((BYTE *) &sha_info->data + count, 0, 64 - count); + sha_byte_reverse(sha_info->data, SHA_BLOCKSIZE); + sha_transform(sha_info); + sha_glibc_memset(&sha_info->data, 0, 56); + } else + sha_glibc_memset((BYTE *) &sha_info->data + count, 0, 56 - count); + + sha_byte_reverse(sha_info->data, SHA_BLOCKSIZE); + sha_info->data[14] = hi_bit_count; + sha_info->data[15] = lo_bit_count; + sha_transform(sha_info); +} + +/* compute the SHA digest of a FILE stream */ + +__attribute__((always_inline)) static inline void +sha_stream(struct SHA_INFO *sha_info, struct SHA_MY_FILE *fin) { + int i; + BYTE data[BLOCK_SIZE]; + __pragma_loopbound(5, 5); + while ((i = sha_fread(data, 1, BLOCK_SIZE, fin)) > 0) + sha_update(sha_info, data, i); + + sha_final(sha_info); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +sha_main(void) { + struct SHA_MY_FILE fin; + fin.data = sha_data; + fin.size = 32743; // set size = 3247552 for input_large + fin.cur_pos = 0; + sha_stream(&sha_info, &fin); +} + +__attribute__((always_inline)) static inline int +sha_return(void) { + int sum = 0; + sum = sha_info.data[14] + sha_info.data[15]; + return (sum - 261944 != 0); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + sha_init(); + sha_main(); + return (sha_return()); +} diff --git a/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.h b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.h new file mode 100644 index 0000000..88907eb --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/generated/modified_sources/inline/sha.h @@ -0,0 +1,72 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: sha.h + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by + Bruce Schneier + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. +*/ + +#ifndef SHA_H +#define SHA_H + +/* Useful defines & typedefs */ + +typedef unsigned char BYTE; +typedef unsigned long LONG; +typedef unsigned size_t; + +/* Type to use for unaligned operations. */ +#define SHA_BLOCKSIZE 64 +#define SHA_DIGESTSIZE 20 +#define LITTLE_ENDIAN +#define NULL ((void *) 0) + +extern unsigned volatile char sha_data[32743]; + +struct SHA_MY_FILE { + unsigned volatile char *data; + size_t size; + unsigned cur_pos; +}; + +struct SHA_INFO { + LONG digest[5]; /* message digest */ + LONG count_lo, count_hi; /* 64-bit bit count */ + LONG data[16]; /* SHA data buffer */ +}; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void +sha_transform(struct SHA_INFO *); +__attribute__((always_inline)) static inline void sha_byte_reverse(LONG *buffer, + int count); +__attribute__((always_inline)) static inline void sha_init(void); +__attribute__((always_inline)) static inline size_t +sha_fread(void *, size_t, size_t, struct SHA_MY_FILE *); +__attribute__((always_inline)) static inline void sha_update(struct SHA_INFO *, + BYTE *, int); +__attribute__((always_inline)) static inline void sha_final(struct SHA_INFO *); +__attribute__((always_inline)) static inline void +sha_stream(struct SHA_INFO *, struct SHA_MY_FILE *); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +sha_main(void); +__attribute__((always_inline)) static inline int sha_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +#endif // SHA_H diff --git a/targets/wasm-tacle/kernel/sha/input_small.c b/targets/wasm-tacle/kernel/sha/input_small.c new file mode 100755 index 0000000..863fd97 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/input_small.c @@ -0,0 +1,1657 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: input_small.c + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by Bruce Schneier + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. +*/ +unsigned volatile char sha_data[ 32743 ] = { + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', + 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', + 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', '\n' +}; diff --git a/targets/wasm-tacle/kernel/sha/memcpy.c b/targets/wasm-tacle/kernel/sha/memcpy.c new file mode 100755 index 0000000..c8416f6 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/memcpy.c @@ -0,0 +1,74 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memcpy.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memcpy.h" + +void *sha_glibc_memcpy( void *dstpp, const void *srcpp, size_t len ) +{ + unsigned long int dstp = ( long int ) dstpp; + unsigned long int srcp = ( long int ) srcpp; + size_t __nbytes; + + /* Copy from the beginning to the end. */ + + /* If there not too few bytes to copy, use word copy. */ + if ( len >= OP_T_THRES ) { + /* Copy just a few bytes to make DSTP aligned. */ + len -= ( -dstp ) % OPSIZ; + + __nbytes = ( -dstp ) % OPSIZ; + _Pragma( "loopbound min 0 max 0" ) + while ( __nbytes > 0 ) { + BYTE __x = ( ( BYTE * ) srcp )[ 0 ]; + srcp += 1; + __nbytes -= 1; + ( ( BYTE * ) dstp )[ 0 ] = __x; + dstp += 1; + } + + /* Copy whole pages from SRCP to DSTP by virtual address manipulation, + as much as possible. */ + + PAGE_COPY_FWD_MAYBE ( dstp, srcp, len, len ); + + /* Copy from SRCP to DSTP taking advantage of the known alignment of + DSTP. Number of bytes remaining is put in the third argument, + i.e. in LEN. This number may vary from machine to machine. */ + + WORD_COPY_FWD ( dstp, srcp, len, len ); + + /* Fall out and copy the tail. */ + } + + /* There are just a few bytes to copy. Use byte memory operations. */ + __nbytes = len; + _Pragma( "loopbound min 0 max 7" ) + while ( __nbytes > 0 ) { + BYTE __x = ( ( BYTE * ) srcp )[ 0 ]; + srcp += 1; + __nbytes -= 1; + ( ( BYTE * ) dstp )[ 0 ] = __x; + dstp += 1; + } + + return dstpp; +} + diff --git a/targets/wasm-tacle/kernel/sha/memcpy.h b/targets/wasm-tacle/kernel/sha/memcpy.h new file mode 100755 index 0000000..fdc9e33 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/memcpy.h @@ -0,0 +1,26 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memcpy.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memhelper.h" +#include "sha.h" + +void *sha_glibc_memcpy( void *dstpp, const void *srcpp, size_t len ); + diff --git a/targets/wasm-tacle/kernel/sha/memhelper.c b/targets/wasm-tacle/kernel/sha/memhelper.c new file mode 100755 index 0000000..f232bc2 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/memhelper.c @@ -0,0 +1,146 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memhelper.c + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy block beginning at SRCP to + block beginning at DSTP with LEN `op_t' words (not LEN bytes!). + Both SRCP and DSTP should be aligned for memory operations on `op_t's. + + Source: GNU C Library + + Changes: no major functional changes + + License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc. +*/ + +#include "memhelper.h" +int printf(const char * restrict format, ... ); +/* sha_wordcopy_fwd_aligned -- Copy block beginning at SRCP to + block beginning at DSTP with LEN `op_t' words (not LEN bytes!). + Both SRCP and DSTP should be aligned for memory operations on `op_t's. +*/ + +void sha_wordcopy_fwd_aligned( long int dstp, long int srcp, size_t len ) +{ + op_t a0 = 0; + op_t a1 = 0; + char switch_target; + + switch ( len % 8 ) { + case 2: + a0 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 6 * OPSIZ; + dstp -= 7 * OPSIZ; + len += 6; + switch_target = 1; + break; + case 3: + a1 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 5 * OPSIZ; + dstp -= 6 * OPSIZ; + len += 5; + switch_target = 2; + break; + case 4: + a0 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 4 * OPSIZ; + dstp -= 5 * OPSIZ; + len += 4; + switch_target = 3; + break; + case 5: + a1 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 3 * OPSIZ; + dstp -= 4 * OPSIZ; + len += 3; + switch_target = 4; + break; + case 6: + a0 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 2 * OPSIZ; + dstp -= 3 * OPSIZ; + len += 2; + switch_target = 5; + break; + case 7: + a1 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 1 * OPSIZ; + dstp -= 2 * OPSIZ; + len += 1; + switch_target = 6; + break; + case 0: + if ( OP_T_THRES <= 3 * OPSIZ && len == 0 ) + return; + a0 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= 0 * OPSIZ; + dstp -= 1 * OPSIZ; + switch_target = 7; + break; + case 1: + a1 = ( ( op_t * ) srcp )[ 0 ]; + srcp -= -1 * OPSIZ; + dstp -= 0 * OPSIZ; + len -= 1; + if ( OP_T_THRES <= 3 * OPSIZ && len == 0 ) { + ( ( op_t * ) dstp )[ 0 ] = a1; + return; + } else { + switch_target = 8; + break; + } + } + + _Pragma( "loopbound min 1 max 2" ) //max 1 + do { + switch ( switch_target ) { + case 8: + a0 = ( ( op_t * ) srcp )[ 0 ]; + ( ( op_t * ) dstp )[ 0 ] = a1; + break; + case 7: + a1 = ( ( op_t * ) srcp )[ 1 ]; + ( ( op_t * ) dstp )[ 1 ] = a0; + break; + case 6: + a0 = ( ( op_t * ) srcp )[ 2 ]; + ( ( op_t * ) dstp )[ 2 ] = a1; + break; + case 5: + a1 = ( ( op_t * ) srcp )[ 3 ]; + ( ( op_t * ) dstp )[ 3 ] = a0; + break; + case 4: + a0 = ( ( op_t * ) srcp )[ 4 ]; + ( ( op_t * ) dstp )[ 4 ] = a1; + break; + case 3: + a1 = ( ( op_t * ) srcp )[ 5 ]; + ( ( op_t * ) dstp )[ 5 ] = a0; + break; + case 2: + a0 = ( ( op_t * ) srcp )[ 6 ]; + ( ( op_t * ) dstp )[ 6 ] = a1; + break; + case 1: + a1 = ( ( op_t * ) srcp )[ 7 ]; + ( ( op_t * ) dstp )[ 7 ] = a0; + break; + } + + srcp += 8 * OPSIZ; + dstp += 8 * OPSIZ; + len -= 8; + switch_target = 8; + } while ( len != 0 ); + + ( ( op_t * ) dstp )[ 0 ] = a1; +} + diff --git a/targets/wasm-tacle/kernel/sha/memhelper.h b/targets/wasm-tacle/kernel/sha/memhelper.h new file mode 100755 index 0000000..9ecbb50 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/memhelper.h @@ -0,0 +1,55 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: memhelper.h + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by Bruce Schneier + + License: GNU Lesser General Public License + + Changes: no major functional changes + +*/ + +#ifndef MEM_HELPER_H +#define MEM_HELPER_H + +#include "sha.h" + +void sha_wordcopy_fwd_aligned( long int dstp, long int srcp, size_t len ); + +/* Type to use for aligned memory operations. + This should normally be the biggest type supported by a single load + and store. */ +#define op_t unsigned long int +#define OPSIZ (sizeof(op_t)) + +/* Threshold value for when to enter the unrolled loops. */ +#define OP_T_THRES 16 + +#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) +#define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) + + +/* Copy *up to* NBYTES bytes from SRC_BP to DST_BP, with + the assumption that DST_BP is aligned on an OPSIZ multiple. If + not all bytes could be easily copied, store remaining number of bytes + in NBYTES_LEFT, otherwise store 0. */ +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ + { \ + if (src_bp % OPSIZ == 0) \ + sha_wordcopy_fwd_aligned (dst_bp, src_bp, (nbytes) / OPSIZ); \ + else \ + src_bp += (nbytes) & -OPSIZ; \ + dst_bp += (nbytes) & -OPSIZ; \ + (nbytes_left) = (nbytes) % OPSIZ; \ + } + +#endif // MEM_HELPER_H + diff --git a/targets/wasm-tacle/kernel/sha/memset.c b/targets/wasm-tacle/kernel/sha/memset.c new file mode 100755 index 0000000..58e3aea --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/memset.c @@ -0,0 +1,86 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: menset.h + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + Changes: no major functional changes + + License: GNU Lesser General Public License +*/ +#include "memset.h" +int printf(const char * restrict format, ... ); + +void *sha_glibc_memset( void *dstpp, int c, size_t len ) +{ + long int dstp = ( long int ) dstpp; + + if ( len >= 8 ) { + size_t xlen; + op_t cccc; + + cccc = ( unsigned char ) c; + cccc |= cccc << 8; + cccc |= cccc << 16; + if ( OPSIZ > 4 ) + /* Do the shift in two steps to avoid warning if long has 32 bits. */ + cccc |= ( cccc << 16 ) << 16; + + /* There are at least some bytes to set. + No need to test for LEN == 0 in this alignment loop. */ + _Pragma( "loopbound min 3 max 3" ) + while ( dstp % OPSIZ != 0 ) { + ( ( BYTE * ) dstp )[ 0 ] = c; + dstp += 1; + len -= 1; + } + + /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */ + xlen = len / ( OPSIZ * 8 ); + _Pragma( "loopbound min 0 max 1" ) + while ( xlen > 0 ) { + ( ( op_t * ) dstp )[ 0 ] = cccc; + ( ( op_t * ) dstp )[ 1 ] = cccc; + ( ( op_t * ) dstp )[ 2 ] = cccc; + ( ( op_t * ) dstp )[ 3 ] = cccc; + ( ( op_t * ) dstp )[ 4 ] = cccc; + ( ( op_t * ) dstp )[ 5 ] = cccc; + ( ( op_t * ) dstp )[ 6 ] = cccc; + ( ( op_t * ) dstp )[ 7 ] = cccc; + dstp += 8 * OPSIZ; + xlen -= 1; + } + len %= OPSIZ * 8; + + /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */ + xlen = len / OPSIZ; + _Pragma( "loopbound min 1 max 2" ) + while ( xlen > 0 ) { + ( ( op_t * ) dstp )[ 0 ] = cccc; + dstp += OPSIZ; + xlen -= 1; + } + len %= OPSIZ; + } + + /* Write the last few bytes. */ + _Pragma( "loopbound min 0 max 0" ) + while ( len > 0 ) { + ( ( BYTE * ) dstp )[ 0 ] = c; + dstp += 1; + len -= 1; + } + + return ( void * )dstpp; +} + diff --git a/targets/wasm-tacle/kernel/sha/memset.h b/targets/wasm-tacle/kernel/sha/memset.h new file mode 100755 index 0000000..d0b7196 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/memset.h @@ -0,0 +1,24 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: menset.h + + Author: Torbjorn Granlund + + NIST Secure Hash Algorithm + + Copy memory to memory until the specified number of bytes + has been copied. Overlap is NOT handled correctly. + + Source: GNU C Library + + License: GNU Lesser General Public License + + Changes: no major functional changes +*/ +#include "memhelper.h" + +void *sha_glibc_memset( void *dstpp, int c, size_t len ); + diff --git a/targets/wasm-tacle/kernel/sha/sha.c b/targets/wasm-tacle/kernel/sha/sha.c new file mode 100755 index 0000000..fc1559a --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/sha.c @@ -0,0 +1,223 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: sha.c + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by Bruce Schneier + + Changes: no major functional changes + + License: GNU Lesser General Public License + +*/ + +#include "memcpy.h" +#include "memset.h" +#include "sha.h" + +/* + Declaration of global variables +*/ +struct SHA_INFO sha_info; + +/* SHA f()-functions */ +#define f1(x,y,z) ((x & y) | (~x & z)) +#define f2(x,y,z) (x ^ y ^ z) +#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) +#define f4(x,y,z) (x ^ y ^ z) + +/* SHA constants */ +#define CONST1 0x5a827999L +#define CONST2 0x6ed9eba1L +#define CONST3 0x8f1bbcdcL +#define CONST4 0xca62c1d6L + +#define BLOCK_SIZE 8192 + +/* 32-bit rotate */ + +#define ROT32(x,n) ((x << n) | (x >> (32 - n))) + +#define FUNC(n,i) \ + temp = ROT32(A,5) + f##n(B,C,D) + E + W[ i ] + CONST##n; \ + E = D; D = C; C = ROT32(B,30); B = A; A = temp + +/* do SHA transformation */ +void sha_transform( struct SHA_INFO *sha_info ) +{ + int i; + LONG temp, A, B, C, D, E, W[ 80 ]; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; ++i ) + W[ i ] = sha_info->data[ i ]; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 16; i < 80; ++i ) + W[ i ] = W[ i - 3 ] ^ W[ i - 8 ] ^ W[ i - 14 ] ^ W[ i - 16 ]; + + A = sha_info->digest[ 0 ]; + B = sha_info->digest[ 1 ]; + C = sha_info->digest[ 2 ]; + D = sha_info->digest[ 3 ]; + E = sha_info->digest[ 4 ]; + + + _Pragma( "loopbound min 20 max 20" ) + for ( i = 0; i < 20; ++i ) { + FUNC( 1, i ); + } + _Pragma( "loopbound min 20 max 20" ) + for ( i = 20; i < 40; ++i ) { + FUNC( 2, i ); + } + _Pragma( "loopbound min 20 max 20" ) + for ( i = 40; i < 60; ++i ) { + FUNC( 3, i ); + } + _Pragma( "loopbound min 20 max 20" ) + for ( i = 60; i < 80; ++i ) { + FUNC( 4, i ); + } + sha_info->digest[ 0 ] += A; + sha_info->digest[ 1 ] += B; + sha_info->digest[ 2 ] += C; + sha_info->digest[ 3 ] += D; + sha_info->digest[ 4 ] += E; +} + + +/* change endianness of data */ +void sha_byte_reverse( LONG *buffer, int count ) +{ + int i; + BYTE ct[ 4 ], *cp; + + count /= sizeof( LONG ); + cp = ( BYTE * ) buffer; + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < count; ++i ) { + ct[ 0 ] = cp[ 0 ]; + ct[ 1 ] = cp[ 1 ]; + ct[ 2 ] = cp[ 2 ]; + ct[ 3 ] = cp[ 3 ]; + cp[ 0 ] = ct[ 3 ]; + cp[ 1 ] = ct[ 2 ]; + cp[ 2 ] = ct[ 1 ]; + cp[ 3 ] = ct[ 0 ]; + cp += sizeof( LONG ); + } +} + +/* initialize the SHA digest */ +void sha_init( void ) +{ + int i; + sha_info.digest[ 0 ] = 0x67452301L; + sha_info.digest[ 1 ] = 0xefcdab89L; + sha_info.digest[ 2 ] = 0x98badcfeL; + sha_info.digest[ 3 ] = 0x10325476L; + sha_info.digest[ 4 ] = 0xc3d2e1f0L; + sha_info.count_lo = 0L; + sha_info.count_hi = 0L; + for ( i = 0; i < 16; i++ ) + sha_info.data[ i ] = 0; +} + +size_t sha_fread( void *ptr, size_t size, size_t count, + struct SHA_MY_FILE *stream ) +{ + unsigned i = stream->cur_pos, i2 = 0; + size_t number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count ? + size * count : stream->size - stream->cur_pos; + _Pragma( "loopbound min 0 max 8192" ) + while ( i < stream->cur_pos + number_of_chars_to_read ) + ( ( unsigned char * )ptr )[ i2++ ] = stream->data[ i++ ]; + stream->cur_pos += number_of_chars_to_read; + return ( number_of_chars_to_read ); +} + +/* update the SHA digest */ +void sha_update( struct SHA_INFO *sha_info, BYTE *buffer, int count ) +{ + if ( ( sha_info->count_lo + ( ( LONG ) count << 3 ) ) < sha_info->count_lo ) + ++sha_info->count_hi; + sha_info->count_lo += ( LONG ) count << 3; + sha_info->count_hi += ( LONG ) count >> 29; + _Pragma( "loopbound min 8 max 128" ) + while ( count >= SHA_BLOCKSIZE ) { + sha_glibc_memcpy( sha_info->data, buffer, SHA_BLOCKSIZE ); + sha_byte_reverse( sha_info->data, SHA_BLOCKSIZE ); + sha_transform( sha_info ); + buffer += SHA_BLOCKSIZE; + count -= SHA_BLOCKSIZE; + } + + sha_glibc_memcpy( sha_info->data, buffer, count ); +} + +/* finish computing the SHA digest */ +void sha_final( struct SHA_INFO *sha_info ) +{ + int count; + LONG lo_bit_count, hi_bit_count; + + lo_bit_count = sha_info->count_lo; + hi_bit_count = sha_info->count_hi; + count = ( int ) ( ( lo_bit_count >> 3 ) & 0x3f ); + ( ( BYTE * ) sha_info->data )[ count++ ] = 0x80; + if ( count > 56 ) { + sha_glibc_memset( ( BYTE * ) &sha_info->data + count, 0, 64 - count ); + sha_byte_reverse( sha_info->data, SHA_BLOCKSIZE ); + sha_transform( sha_info ); + sha_glibc_memset( &sha_info->data, 0, 56 ); + } else + sha_glibc_memset( ( BYTE * ) &sha_info->data + count, 0, 56 - count ); + + sha_byte_reverse( sha_info->data, SHA_BLOCKSIZE ); + sha_info->data[ 14 ] = hi_bit_count; + sha_info->data[ 15 ] = lo_bit_count; + sha_transform( sha_info ); +} + +/* compute the SHA digest of a FILE stream */ + +void sha_stream( struct SHA_INFO *sha_info, struct SHA_MY_FILE *fin ) +{ + int i; + BYTE data[ BLOCK_SIZE ]; + _Pragma( "loopbound min 5 max 5" ) + while ( ( i = sha_fread( data, 1, BLOCK_SIZE, fin ) ) > 0 ) + sha_update( sha_info, data, i ); + + sha_final( sha_info ); +} + +void _Pragma( "entrypoint" ) sha_main( void ) +{ + struct SHA_MY_FILE fin; + fin.data = sha_data; + fin.size = 32743; // set size = 3247552 for input_large + fin.cur_pos = 0; + sha_stream( &sha_info, &fin ); +} + +int sha_return( void ) +{ + int sum = 0; + sum = sha_info.data[ 14 ] + sha_info.data[ 15 ]; + return ( sum - 261944 != 0 ); +} + +int main ( void ) +{ + sha_init(); + sha_main(); + return ( sha_return() ); +} diff --git a/targets/wasm-tacle/kernel/sha/sha.h b/targets/wasm-tacle/kernel/sha/sha.h new file mode 100755 index 0000000..8ea05f7 --- /dev/null +++ b/targets/wasm-tacle/kernel/sha/sha.h @@ -0,0 +1,63 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: sha.h + + Author: Peter C. Gutmann's (heavily modified by Uwe Hollerbach) + + NIST Secure Hash Algorithm + + Source: Peter C. Gutmann's implementation as found in Applied Cryptography by Bruce Schneier + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. +*/ + +#ifndef SHA_H +#define SHA_H + +/* Useful defines & typedefs */ + +typedef unsigned char BYTE; +typedef unsigned long LONG; +typedef unsigned size_t; + +/* Type to use for unaligned operations. */ +#define SHA_BLOCKSIZE 64 +#define SHA_DIGESTSIZE 20 +#define LITTLE_ENDIAN +#define NULL ((void*)0) + +extern unsigned volatile char sha_data[ 32743 ]; + +struct SHA_MY_FILE { + unsigned volatile char *data; + size_t size; + unsigned cur_pos; +}; + +struct SHA_INFO { + LONG digest[ 5 ]; /* message digest */ + LONG count_lo, count_hi; /* 64-bit bit count */ + LONG data[ 16 ]; /* SHA data buffer */ +}; + +/* + Forward declaration of functions +*/ +void sha_transform( struct SHA_INFO * ); +void sha_byte_reverse( LONG *buffer, int count ); +void sha_init( void ); +size_t sha_fread( void *, size_t, size_t, struct SHA_MY_FILE * ); +void sha_update( struct SHA_INFO *, BYTE *, int ); +void sha_final( struct SHA_INFO * ); +void sha_stream( struct SHA_INFO *, struct SHA_MY_FILE * ); +void sha_main( void ); +int sha_return ( void ); +int main( void ); + +#endif // SHA_H + diff --git a/targets/wasm-tacle/kernel/st/CMakeLists.txt b/targets/wasm-tacle/kernel/st/CMakeLists.txt new file mode 100644 index 0000000..7e0943c --- /dev/null +++ b/targets/wasm-tacle/kernel/st/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(st) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/st.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/st.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/kernel/st/ChangeLog.txt b/targets/wasm-tacle/kernel/st/ChangeLog.txt new file mode 100755 index 0000000..e9db491 --- /dev/null +++ b/targets/wasm-tacle/kernel/st/ChangeLog.txt @@ -0,0 +1,96 @@ +File: st.c +Original provenience: Mälardalen benchmark suite, www.mrtc..... + +2015-06-08: +- Removed comment "/* stats.c */" from line 1 +- Added generic TACLeBench header to line 1 +- Replaced all occurrences of preprocessor macro MAX by value 1000 + (lines 75, 78, 95, 98, 111, 139) +- Removed obsolete preprocessor macro MAX from line 3 +- Removed comment describing purpose of benchmark from lines 6-10 +- Renamed global variable Seed to st_Seed, declared st_Seed as volatile +- Renamed global variable ArrayA to st_ArrayA +- Renamed global variable ArrayB to st_ArrayB +- Renamed global variable SumA to st_SumA +- Renamed global variable SumB to st_SumB +- Removed global variable Coef, reinserted previous local variable Coef that + was commented out in function main and elsewhere in order to keep the + argument lists of some functions smaller than 6 +- Replaced Coef by *Coef in last line of function Calc_LinCorrCoef due to + previous change +- Removed comment "/* Coef used globally */" from function Calc_LinCorrCoef +- Removed comment "/* Coef will have to be used globally in Calc_LinCorrCoef + since it would be beyond the 6 registers used for passing parameters */" from + function main +- Renamed function my_fabs to st_fabs +- Renamed function my_sqrtf to st_sqrtf +- Renamed function InitSeed to st_InitSeed +- Renamed function Calc_Sum_Mean to st_Calc_Sum_Mean +- Renamed function Square to st_Square +- Renamed function Calc_Var_Stddev to st_Calc_Var_Stddev +- Renamed function Calc_LinCorrCoef to st_Calc_LinCorrCoef +- Renamed function RandomInteger to st_RandomInteger +- Renamed function Initialize to st_Initialize +- Added new function st_Init completely encapsulating all initialization- + related issues according to TACLeBench guidelines. st_Init by itself only + calls st_InitSeed and invokes st_Initialize on global arrays st_ArrayA and + st_ArrayB +- Removed both calls to st_Initialize from function main +- Replaced call of st_InitSeed in main by call of st_Init +- Replaced string "8095" by "8094" in the comment documenting function + st_RandomInteger +- Removed the division by 8095.0f from line + "array[ i ] = i + st_randomInteger() / 8095.0f" in function st_initialize. + i ranges from 0 to 999, values returned by st_randomInteger range from 0 to + 8094. The sum of i and st_randomInteger thus ranges from 0 to 9093. Dividing + numbers from this interval by 8095.0f has the effect that array[ i ] is + initialized only with values 0.0f or 1.0f which is way too limited. +- Added new function st_main according to TACLeBench guidelines. st_main + contains the declaration of local variables MeanA, MeanB, VarA, VarB, + StddevA, StddevB and Coef and calls st_calc_Sum_Mean, st_Calc_Var_Stddev + and st_Calc_LinCorrCoef as the original main did. + st_main is annotated as entry-point for timing analysis. +- Removed declaration of local variables from function main, replaced calls + of st_Calc_Sum_Mean, st_Calc_Var_Stddev and st_Calc_LinCorrCoef in main by + a call to st_main +- Removed local variables meanA, meanB, varA, varB, stddevA, stddevB, coef from + function st_main, added them as global variables st_meanA, st_meanB, st_varA, + st_varB, st_stddevA, st_stddevB, st_coef + Adjusted function st_main such that the new global variables are used, in + order to enable explicit return value computation of the entire benchmark +- Added new function st_return computing a checksum as return value +- Adjusted function main such that it calls st_return to produce a return value + for testing +- Added forward declarations of all functions before the declarations of global + variables +- Reordered functions in source code: initialization- and return-value-related + functions first, followed by arithmetic math functions, followed by algorithm + core functions, followed by main functions +- Applied code formatting according to the following rules + (incomplete, to be discussed; I basically used astyle with the attached + options file): + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: st_) followed by lowercase letter (e.g., st_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Added general TACLeBench header to beginning of source code + +2016-03-15: +- Return 0 if checksum is as expected, -1 otherwise +- Fix function prototypes of functions without arguments diff --git a/targets/wasm-tacle/kernel/st/generated/default/st.wasm b/targets/wasm-tacle/kernel/st/generated/default/st.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a406d2811c742ce63d6ffcf556f0cac494e1df13 GIT binary patch literal 2229 zcmd5-O^D<~6n<4nI_ac)dYI8g*n^e6xb85+uE_4}#hqeCMDVC5!A!clrtRKz(j;lM zg`o!*L2!k&f6mU$i^w7>!V2!iIe1d=;6Y&zg1ev~D0o|ZRq2kISzWwox+{6_OQqgd z?|W4Re$pd=SIue-gHCv5;~ddJ2OtmYyL2>yU4UIekC#@1CW==%j8lA`xefXp?$n z%F6SXRpv+w!KEp)#$(rF23ulF(=n^C%5>}+%w$zoMc-yN`X(!Jt6MMe!$+T~f|G@{ zvqyz)v5d%zRp6^`nXmHIjIhEPpScyuS=*xcV41A4M z)!@6Qw?Fvuv5Vf*RpM~smK;{*Bb+C4aBwI?b-F*S#AR6fZ^9ZlCE08Yi+34TIsY~+ z)0u^Q?dfb2^}25A3%xi_>jM4p2!$$&#^G!Ry1;MmxK3mpA>7%2>-a~d{%Tm zFFLn!#|8ZAp>CaEA~-PEoX15Ir~dlRtd7vvC#k4xxpYB;;utv%29vtRG*rAmM}m}5 z1?IGhU`{UwT{-IVf|*N@9i3CsHt8KnDWd_XpQg-AKfO>k5|{eHyku~is3c(;!=l9o zs2$#=cFK_?uc8bpQi@ZQll0NCri^YwQ?FowQ@SS2B<(zs|e=wa`3@w{VHdW(fIGw zQl$Cyw~$I!tx}?_w9&}2rc%B9hTJ2anMSlxwiXZ6M}-X(w-CsNlIu`*IzzKgZ<2t2 z16}^!<>JNU@c;!e90`hfz>6#|GQso%WfsdHGwaH-snqt>7);)GPtY>Ffit@Xx`R9 -0.000001) ? 0 : -1); +} + +/* + Arithmetic math functions +*/ + +float +st_fabs(float n) { + float f; + + if (n >= 0) + f = n; + else + f = -n; + + return (f); +} + +float +st_sqrtf(float val) { + float x = val / 10; + float dx; + float diff; + float min_tol = 0.00001f; + + int i, flag = 0; + + if (val == 0) + x = 0; + else { + __pragma_loopbound(19, 19); + for (i = 1; i < 20; i++) { + if (!flag) { + dx = (val - (x * x)) / (2.0f * x); + x = x + dx; + diff = val - (x * x); + + if (st_fabs(diff) <= min_tol) + flag = 1; + } + } + } + + return (x); +} + +float +st_square(float x) { + return (x * x); +} + +/* + Algorithm core functions +*/ + +void +st_calc_Sum_Mean(float *array, float *sum, float *mean) { + int i; + + *sum = 0; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) + *sum += array[i]; + *mean = *sum / 1000; +} + +void +st_calc_Var_Stddev(float *array, float mean, float *var, float *stddev) { + int i; + float diffs = 0.0f; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) + diffs += st_square(array[i] - mean); + + *var = diffs / 1000; + *stddev = st_sqrtf(*var); +} + +void +st_calc_LinCorrCoef(float *arrayA, float *arrayB, float meanA, float meanB, + float *coef) { + int i; + float numerator = 0.0f, Aterm = 0.0f, Bterm = 0.0f; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) { + numerator += (arrayA[i] - meanA) * (arrayB[i] - meanB); + Aterm += st_square(arrayA[i] - meanA); + Bterm += st_square(arrayB[i] - meanB); + } + + *coef = numerator / (st_sqrtf(Aterm) * st_sqrtf(Bterm)); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +st_main(void) { + st_calc_Sum_Mean(st_arrayA, &st_sumA, &st_meanA); + st_calc_Var_Stddev(st_arrayA, st_meanA, &st_varA, &st_stddevA); + + st_calc_Sum_Mean(st_arrayB, &st_sumB, &st_meanB); + st_calc_Var_Stddev(st_arrayB, st_meanB, &st_varB, &st_stddevB); + + st_calc_LinCorrCoef(st_arrayA, st_arrayB, st_meanA, st_meanB, &st_coef); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + st_init(); + st_main(); + + return (st_return()); +} diff --git a/targets/wasm-tacle/kernel/st/generated/modified_sources/inline/st.c b/targets/wasm-tacle/kernel/st/generated/modified_sources/inline/st.c new file mode 100644 index 0000000..20783c0 --- /dev/null +++ b/targets/wasm-tacle/kernel/st/generated/modified_sources/inline/st.c @@ -0,0 +1,228 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: st + + Author: unknown + + Function: st is a statistics program. + This program computes for two arrays of numbers the sum, the mean, + the variance, and standard deviation. It then determines the + correlation coefficient between the two arrays. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/st/st.c + + Changes: No major functional changes. + + License: May be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void st_initSeed(void); +__attribute__((always_inline)) static inline long st_randomInteger(); +__attribute__((always_inline)) static inline void st_initialize(float *); +__attribute__((always_inline)) static inline void st_init(void); +__attribute__((always_inline)) static inline int st_return(void); +__attribute__((always_inline)) static inline float st_fabs(float); +__attribute__((always_inline)) static inline float st_sqrtf(float); +__attribute__((always_inline)) static inline float st_square(float); +__attribute__((always_inline)) static inline void +st_calc_Sum_Mean(float *, float *, float *); +__attribute__((always_inline)) static inline void +st_calc_Var_Stddev(float *, float, float *, float *); +__attribute__((always_inline)) static inline void +st_calc_LinCorrCoef(float *, float *, float, float, float *); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +st_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +volatile int st_seed; +float st_arrayA[1000], st_arrayB[1000]; +float st_sumA, st_sumB; +float st_meanA, st_meanB, st_varA, st_varB, st_stddevA, st_stddevB, st_coef; + +/* + Initialization- and return-value-related functions +*/ + +/* + st_initSeed initializes the seed used in the "random" number generator. +*/ +__attribute__((always_inline)) static inline void +st_initSeed() { + st_seed = 0; +} + +/* + st_RandomInteger generates random integers between 0 and 8094. +*/ +__attribute__((always_inline)) static inline long +st_randomInteger() { + st_seed = ((st_seed * 133) + 81) % 8095; + return (st_seed); +} + +__attribute__((always_inline)) static inline void +st_initialize(float *array) { + register int i; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) + array[i] = i + st_randomInteger(); +} + +__attribute__((always_inline)) static inline void +st_init() { + st_initSeed(); + st_initialize(st_arrayA); + st_initialize(st_arrayB); +} + +__attribute__((always_inline)) static inline int +st_return() { + float checksum = st_meanA + st_meanB + st_stddevA + st_stddevB + st_coef; + /* allow rounding errors for the checksum */ + checksum -= 13695.986328; + return ((checksum < 0.000001 && checksum > -0.000001) ? 0 : -1); +} + +/* + Arithmetic math functions +*/ + +__attribute__((always_inline)) static inline float +st_fabs(float n) { + float f; + + if (n >= 0) + f = n; + else + f = -n; + + return (f); +} + +__attribute__((always_inline)) static inline float +st_sqrtf(float val) { + float x = val / 10; + float dx; + float diff; + float min_tol = 0.00001f; + + int i, flag = 0; + + if (val == 0) + x = 0; + else { + __pragma_loopbound(19, 19); + for (i = 1; i < 20; i++) { + if (!flag) { + dx = (val - (x * x)) / (2.0f * x); + x = x + dx; + diff = val - (x * x); + + if (st_fabs(diff) <= min_tol) + flag = 1; + } + } + } + + return (x); +} + +__attribute__((always_inline)) static inline float +st_square(float x) { + return (x * x); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +st_calc_Sum_Mean(float *array, float *sum, float *mean) { + int i; + + *sum = 0; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) + *sum += array[i]; + *mean = *sum / 1000; +} + +__attribute__((always_inline)) static inline void +st_calc_Var_Stddev(float *array, float mean, float *var, float *stddev) { + int i; + float diffs = 0.0f; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) + diffs += st_square(array[i] - mean); + + *var = diffs / 1000; + *stddev = st_sqrtf(*var); +} + +__attribute__((always_inline)) static inline void +st_calc_LinCorrCoef(float *arrayA, float *arrayB, float meanA, float meanB, + float *coef) { + int i; + float numerator = 0.0f, Aterm = 0.0f, Bterm = 0.0f; + + __pragma_loopbound(1000, 1000); + for (i = 0; i < 1000; i++) { + numerator += (arrayA[i] - meanA) * (arrayB[i] - meanB); + Aterm += st_square(arrayA[i] - meanA); + Bterm += st_square(arrayB[i] - meanB); + } + + *coef = numerator / (st_sqrtf(Aterm) * st_sqrtf(Bterm)); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +st_main(void) { + st_calc_Sum_Mean(st_arrayA, &st_sumA, &st_meanA); + st_calc_Var_Stddev(st_arrayA, st_meanA, &st_varA, &st_stddevA); + + st_calc_Sum_Mean(st_arrayB, &st_sumB, &st_meanB); + st_calc_Var_Stddev(st_arrayB, st_meanB, &st_varB, &st_stddevB); + + st_calc_LinCorrCoef(st_arrayA, st_arrayB, st_meanA, st_meanB, &st_coef); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + st_init(); + st_main(); + + return (st_return()); +} diff --git a/targets/wasm-tacle/kernel/st/st.c b/targets/wasm-tacle/kernel/st/st.c new file mode 100755 index 0000000..8a716fe --- /dev/null +++ b/targets/wasm-tacle/kernel/st/st.c @@ -0,0 +1,226 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: st + + Author: unknown + + Function: st is a statistics program. + This program computes for two arrays of numbers the sum, the mean, + the variance, and standard deviation. It then determines the + correlation coefficient between the two arrays. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/st/st.c + + Changes: No major functional changes. + + License: May be used, modified, and re-distributed freely + +*/ + + +/* + Forward declaration of functions +*/ + +void st_initSeed( void ); +long st_randomInteger(); +void st_initialize( float * ); +void st_init( void ); +int st_return( void ); +float st_fabs( float ); +float st_sqrtf( float ); +float st_square( float ); +void st_calc_Sum_Mean( float *, float *, float * ); +void st_calc_Var_Stddev( float *, float, float *, float * ); +void st_calc_LinCorrCoef( float *, float *, float, float, float * ); +void st_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +volatile int st_seed; +float st_arrayA[ 1000 ], st_arrayB[ 1000 ]; +float st_sumA, st_sumB; +float st_meanA, st_meanB, st_varA, st_varB, st_stddevA, st_stddevB, st_coef; + + +/* + Initialization- and return-value-related functions +*/ + +/* + st_initSeed initializes the seed used in the "random" number generator. +*/ +void st_initSeed() +{ + st_seed = 0; +} + + +/* + st_RandomInteger generates random integers between 0 and 8094. +*/ +long st_randomInteger() +{ + st_seed = ( ( st_seed * 133 ) + 81 ) % 8095; + return ( st_seed ); +} + + +void st_initialize( float *array ) +{ + register int i; + + _Pragma( "loopbound min 1000 max 1000" ) + for ( i = 0; i < 1000; i++ ) + array[ i ] = i + st_randomInteger(); +} + + +void st_init() +{ + st_initSeed(); + st_initialize( st_arrayA ); + st_initialize( st_arrayB ); +} + + +int st_return() +{ + float checksum = st_meanA + st_meanB + st_stddevA + st_stddevB + st_coef; + /* allow rounding errors for the checksum */ + checksum -= 13695.986328; + return ( ( checksum < 0.000001 && checksum > -0.000001 ) ? 0 : -1 ); +} + + +/* + Arithmetic math functions +*/ + +float st_fabs( float n ) +{ + float f; + + if ( n >= 0 ) + f = n; + else + f = -n; + + return ( f ); +} + + +float st_sqrtf( float val ) +{ + float x = val / 10; + float dx; + float diff; + float min_tol = 0.00001f; + + int i, flag = 0; + + if ( val == 0 ) + x = 0; + else { + _Pragma( "loopbound min 19 max 19" ) + for ( i = 1; i < 20; i++ ) { + if ( !flag ) { + dx = ( val - ( x * x ) ) / ( 2.0f * x ); + x = x + dx; + diff = val - ( x * x ); + + if ( st_fabs( diff ) <= min_tol ) + flag = 1; + } + } + } + + return ( x ); +} + + +float st_square( float x ) +{ + return ( x * x ); +} + + +/* + Algorithm core functions +*/ + +void st_calc_Sum_Mean( float *array, float *sum, float *mean ) +{ + int i; + + *sum = 0; + + _Pragma( "loopbound min 1000 max 1000" ) + for ( i = 0; i < 1000; i++ ) + *sum += array[ i ]; + *mean = *sum / 1000; +} + + +void st_calc_Var_Stddev( float *array, float mean, float *var, float *stddev ) +{ + int i; + float diffs = 0.0f; + + _Pragma( "loopbound min 1000 max 1000" ) + for ( i = 0; i < 1000; i++ ) + diffs += st_square( array[ i ] - mean ); + + *var = diffs / 1000; + *stddev = st_sqrtf( *var ); +} + + +void st_calc_LinCorrCoef( float *arrayA, float *arrayB, float meanA, + float meanB, float *coef ) +{ + int i; + float numerator = 0.0f, Aterm = 0.0f, Bterm = 0.0f; + + _Pragma( "loopbound min 1000 max 1000" ) + for ( i = 0; i < 1000; i++ ) { + numerator += ( arrayA[ i ] - meanA ) * ( arrayB[ i ] - meanB ); + Aterm += st_square( arrayA[ i ] - meanA ); + Bterm += st_square( arrayB[ i ] - meanB ); + } + + *coef = numerator / ( st_sqrtf( Aterm ) * st_sqrtf( Bterm ) ); +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) st_main( void ) +{ + st_calc_Sum_Mean( st_arrayA, &st_sumA, &st_meanA ); + st_calc_Var_Stddev( st_arrayA, st_meanA, &st_varA, &st_stddevA ); + + st_calc_Sum_Mean( st_arrayB, &st_sumB, &st_meanB ); + st_calc_Var_Stddev( st_arrayB, st_meanB, &st_varB, &st_stddevB ); + + st_calc_LinCorrCoef( st_arrayA, st_arrayB, st_meanA, st_meanB, &st_coef ); +} + + +int main( void ) +{ + st_init(); + st_main(); + + return ( st_return() ); +} diff --git a/targets/wasm-tacle/parallel/DEBIE/README.txt b/targets/wasm-tacle/parallel/DEBIE/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..d6fd3e1309db286b38d612fd15264c242f0c1664 GIT binary patch literal 7646 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/parallel/DEBIE/code/ad_conv.h b/targets/wasm-tacle/parallel/DEBIE/code/ad_conv.h new file mode 100644 index 0000000..894a491 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/ad_conv.h @@ -0,0 +1,46 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : ad_conv.h + + Macros, functions, types and constants for controlling AD converter. + + Based on the SSF DHI file ad_conv.h, revision 1.6, Tue Jun 01 12:35:44 1999. + + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef AD_CONV_H +#define AD_CONV_H + +#include "keyword.h" + +/* Constant definitions */ + +#define AD_CHANNELS 0x28 +/* Number of possible ADC channels (includes GND channels) */ + +#define BP_UP 0x40 +#define BP_DOWN 0xBF + +#include "target_ad_conv.h" + +extern unsigned char EXTERNAL ADC_channel_register; +/* Holds value of the ADC Channel HW register */ +/* Is used by Hit Trigger ISR task and Health */ +/* Monitoring task. */ +/* Updating must be atomic in the Health Monitoring */ +/* task, because Hit Trigger can preempt it. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/build.bat b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/build.bat new file mode 100644 index 0000000..4cb5806 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/build.bat @@ -0,0 +1,56 @@ +echo off +Rem Batch file to compile debie1 using the GCC ARM +Rem compiler that came with the iF-DEV-LPC kit from iSYSTEM. + +Rem setlocal + +Rem Set tpd to the Test Program Directory: +set tpd=..\.. + +Rem Set hnd to the "harness" directory: + +set hnd=%tpd%\harness + +Rem Set ccd to the compiler config directory: +set ccd=%tpd%\..\arm7-lpc2138-mam\gcc-if07 + +call %ccd%\setup.bat + +Rem Compile the test program modules: + +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\class.c -o class.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\classtab.c -o classtab.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\debie.c -o debie.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% -I%tpd% %hnd%\harness.c -o harness.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\health.c -o health.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\hw_if.c -o hw_if.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\measure.c -o measure.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% -I%tpd% target.c -o target.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\tc_hand.c -o tc_hand.o +%CC% %CCOPT% -I%ccd% -I. -I%hnd% %tpd%\telem.c -o telem.o + +Rem Compile the run-time support: + +%CC% %ASOPT% %ccd%\crt0.s -o crt0.o +%CC% %ASOPT% %ccd%\intvec.s -o intvec.o +%CC% %CCOPT% %ccd%\crt_asyst.c -o crt_asyst.o +%CC% %CCOPT% -I%ccd% %ccd%\cpulib.c -o cpulib.o + +Rem Link the program: + +%LD% %LDOPT% ^ + -Xlinker --output=debie1.elf ^ + -Xlinker --script=%ccd%\link.txt ^ + intvec.o crt0.o crt_asyst.o cpulib.o ^ + class.o ^ + classtab.o ^ + debie.o ^ + harness.o ^ + health.o ^ + hw_if.o ^ + measure.o ^ + target.o ^ + tc_hand.o ^ + telem.o + +endlocal diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.c new file mode 100644 index 0000000..8e9bf2b --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.c @@ -0,0 +1,77 @@ +/* + cpulib: Routines for CPU initialization and configuration. + + Target : iSYSTEM LPC2138-M minitarget board (ARM7TDMI) + Source : iSYSTEM iF-DEV-LPC kit + Changes : Tidorum Ltd (N. Holsti) + + $Id: cpulib.c,v 1.1 2008/04/08 09:44:55 niklas Exp $ +*/ + +#include "cpulib.h" + +void cpulib_init_cpu ( void ) +{ + // The MAM is assumed to be initialized in crt0.s. + + // Turn off the LED: + + IO0DIR |= IO_LED; // Set pin direction to output. + IO0SET |= IO_LED; // Set pin value to 1 = turn off LED. +} + + +void cpulib_go_fast ( unsigned int mode ) +{ + // Turn on PLL from 12 MHz to 60 MHz cclk: + + PLLCFG = 0x24; + PLLCON = 0x1; + PLLFEED = 0xAA; + PLLFEED = 0x55; + while ( !( PLLSTAT & 0x400 ) ) {}; + PLLCON = 0x3; + PLLFEED = 0xAA; + PLLFEED = 0x55; +} + + +void cpulib_set_led ( int state ) +{ + if ( state ) + IO0CLR = IO_LED; // LED on. + else + IO0SET = IO_LED; // LED off. +} + + +static volatile int flash_timer; +/* Loop counter for timing flash_led. */ + + +void cpulib_flash_led ( void ) +{ + cpulib_set_led ( 1 ); + + flash_timer = 10000; + while ( flash_timer > 0 ) flash_timer--; + + cpulib_set_led ( 0 ); +} + + +void cpulib_blink_led ( void ) +{ + cpulib_set_led ( 0 ); + + flash_timer = 30000; + while ( flash_timer > 0 ) flash_timer--; + + cpulib_set_led ( 1 ); + + flash_timer = 10000; + while ( flash_timer > 0 ) flash_timer--; + + cpulib_set_led ( 0 ); +} + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.h new file mode 100644 index 0000000..c40b33b --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/cpulib.h @@ -0,0 +1,51 @@ +/* + cpulib: Routines for CPU initialization and configuration. + + Target : iSYSTEM LPC2138-M minitarget board (ARM7TDMI) + Source : iSYSTEM iF-DEV-LPC kit + Changes : Tidorum Ltd (N. Holsti) + + $Id: cpulib.h,v 1.1 2008/04/08 09:44:55 niklas Exp $ +*/ + + +#ifndef CPULIB_H +#define CPULIB_H + +#define REG(x) (*((volatile unsigned int *)(x))) +#define IO0DIR REG(0xE0028008) // I/O direction control +#define IO0CLR REG(0xE002800C) // output clear +#define IO0SET REG(0xE0028004) // output set +#define PLLCFG REG(0xE01FC084) // PLL Config Reg. +#define PLLCON REG(0xE01FC080) // PLL Control Reg. +#define PLLFEED REG(0xE01FC08C) // PLL-Feed 0xAA, 0x55 +#define PLLSTAT REG(0xE01FC088) // PLL-Status register +#define MAMCR REG(0xE01FC000) // MAM Control register +#define MAMTIM REG(0xE01FC004) // MAM Timing register + + +#define IO_LED 0x00000001 +// The LED is connected to pin P0.0. + + +void cpulib_init_cpu ( void ); +// Initializes the processor (in addition to crt0 actions). +// Defines the LED control pin (P0.0) as output and emits a "1" +// to turn off the LED. + +void cpulib_go_fast ( unsigned int mode ); +// Sets the PLL to run the processor at 60 MHz. +// Does not alter the MAM mode (because of the LPC2138 errata). + +void cpulib_set_led ( int state ); +// Turns the LED on if state != 0, off if state = 0. + +void cpulib_flash_led ( void ); +// Turns the LED on for a brief time, then off. +// Useful only if the LED is initially off. + +void cpulib_blink_led ( void ); +// Turns the LED off for short time, then on +// for a shorter time, then off again. + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt0.s b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt0.s new file mode 100644 index 0000000..20d2bc8 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt0.s @@ -0,0 +1,53 @@ +/* vector table section + * __ASYST_STACK_TOP is defined in lcf file + */ + +.code 32 + +.extern __ASYST_STACK_TOP + +/* startup + * initialize mode + * initialize stack pointer + * jump to __asyst_main in crt_asyst.c + */ + +.section .text, "ax" + +.global __asyst_start + +__asyst_start: + + mrs r0, cpsr + bic r0, r0, #0x1F /* clear mode flags */ + orr r0, r0, #0x10 /* set user mode */ + msr cpsr, r0 + + /* Initialize MAM to Mode 2, 7 cycles flash: */ + + ldr r0,_MAMCR + ldr r1,_MAMTIM + ldr r2,=0 + str r2,[r0] + ldr r2,=7 + str r2,[r1] + ldr r2,=2 + str r2,[r0] + + ldr sp,_Lstack_top + + bl __asyst_main + + +/* constants */ + +_MAMCR: + .long 0xe01fc000 /* Address of MAM Control Register. */ + +_MAMTIM: + .long 0xe01fc004 /* Address of MAM Timing register. */ + +_Lstack_top: + .long __ASYST_STACK_TOP + +.end diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt_asyst.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt_asyst.c new file mode 100644 index 0000000..0909fae --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt_asyst.c @@ -0,0 +1,99 @@ +typedef unsigned char byte; +typedef unsigned int uint; +typedef void ( *pfunc )( void ); + +int main( int argc, char *argv[ ] ); +extern byte __ASYST_DATA_LOAD[ ]; +extern byte __ASYST_DATA_START[ ]; +extern byte __ASYST_DATA_END[ ]; +extern byte __ASYST_BSS_START[ ]; +extern byte __ASYST_BSS_END[ ]; +extern pfunc __ASYST_CTOR_START[ ]; +extern pfunc __ASYST_CTOR_END[ ]; +extern pfunc __ASYST_DTOR_START[ ]; +extern pfunc __ASYST_DTOR_END[ ]; +extern byte __ASYST_HEAP_START[ ]; + +#define __ASYST_IS_ALIGNED(P) ((((uint)(P)) & (~(sizeof(uint) -1))) == ((uint)(P))) + +void __asyst_memset_byte( byte *pbyDest, byte byValue, uint uiSize ) +{ + byte *pbyDestLast = pbyDest + uiSize; + for ( ; pbyDest != pbyDestLast; pbyDest++ ) + pbyDest[ 0 ] = byValue; +} + +void __asyst_memset_uint( uint *puiDest, uint uiValue, uint uiSize ) +{ + uint *puiDestLast = puiDest + uiSize; + for ( ; puiDest != puiDestLast; puiDest++ ) + puiDest[ 0 ] = uiValue; +} + +void __asyst_memset( byte *pbyDest, byte byValue, uint uiSize ) +{ + if ( __ASYST_IS_ALIGNED( pbyDest ) && + __ASYST_IS_ALIGNED( uiSize ) ) { + uint uiValue = 0; + __asyst_memset_byte( ( byte * )&uiValue, byValue, sizeof( uint ) ); + return __asyst_memset_uint( ( uint * )pbyDest, uiValue, + uiSize / sizeof( uint ) ); + } else + return __asyst_memset_byte( pbyDest, byValue, uiSize ); + +} + +void *__asyst_memcpy_uint( uint *puiDest, const uint *puiSrc, uint uiSize ) +{ + uint *puiDestLast = puiDest + uiSize; + for ( ; puiDest != puiDestLast; puiSrc++, puiDest++ ) + puiDest[ 0 ] = puiSrc[ 0 ]; + return puiDestLast; +} + +void *__asyst_memcpy_byte( byte *pbyDest, const byte *pbySrc, uint uiSize ) +{ + byte *pbyDestLast = pbyDest + uiSize; + for ( ; pbyDest != pbyDestLast; pbySrc++, pbyDest++ ) + pbyDest[ 0 ] = pbySrc[ 0 ]; + return pbyDestLast; +} + +void *__asyst_memcpy( byte *pbyDest, const byte *pbySrc, uint uiSize ) +{ + if ( __ASYST_IS_ALIGNED( pbyDest ) && + __ASYST_IS_ALIGNED( pbySrc ) && + __ASYST_IS_ALIGNED( uiSize ) ) + return __asyst_memcpy_uint( ( uint * )pbyDest, ( uint * )pbySrc, + uiSize / sizeof( uint ) ); + else + return __asyst_memcpy_byte( pbyDest, pbySrc, uiSize ); +} + +void __asyst_main() +{ + pfunc *pfTable; + // copy data + if ( __ASYST_DATA_START != __ASYST_DATA_LOAD ) + __asyst_memcpy( __ASYST_DATA_START, __ASYST_DATA_LOAD, + __ASYST_DATA_END - __ASYST_DATA_START ); + // zero bss + __asyst_memset( __ASYST_BSS_START, 0, __ASYST_BSS_END - __ASYST_BSS_START ); + + /* Not used in C project + // call constructors + for(pfTable=__ASYST_CTOR_END-1; pfTable!=__ASYST_CTOR_START; pfTable--) + pfTable[ 0 ](); + */ + + // main + main( 0, 0 ); + + /* Not used in C project + // call destructors + //for(pfTable=__ASYST_DTOR_START; pfTable!=__ASYST_DTOR_END; pfTable++) + //pfTable[ 0 ](); + */ + + while ( 1 ); +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/intvec.s b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/intvec.s new file mode 100644 index 0000000..d3166a6 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/intvec.s @@ -0,0 +1,19 @@ +.code 32 + +.section .vectors, "ax" + + B __asyst_start /* RESET INTERRUPT */ + B __DefaultHandler /* UNDEFINED INSTRUCTION INTERRUPT */ + B __DefaultHandler /* SOFTWARE INTERRUPT */ + B __DefaultHandler /* ABORT (PREFETCH) INTERRUPT */ + B __DefaultHandler /* ABORT (DATA) INTERRUPT */ + B __DefaultHandler /* RESERVED */ + B __DefaultHandler /* IRQ INTERRUPT */ + B __DefaultHandler /* FIQ INTERRUPT */ + +.text + +__DefaultHandler: + b __DefaultHandler + +.end diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/keyword.h new file mode 100644 index 0000000..2f73049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/keyword.h @@ -0,0 +1,173 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU ARM compiler for the ARM7 as + delivered with the IF-DEV-LPC, no kernel. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + +#include +/* For memcpy (). */ + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for ARM7/GCC, where the widths of + the integer types are the following (as observed from the code of + the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +#define COPY(DEST,SOURCE) memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#include "cpulib.h" + +#define TARGET_INIT { \ + cpulib_init_cpu (); \ + cpulib_blink_led (); \ + cpulib_go_fast (1); \ + cpulib_blink_led (); } + +#define TARGET_MARK { cpulib_flash_led (); } +#define TARGET_REBOOT { cpulib_blink_led (); } +#define TARGET_START_TEST { cpulib_blink_led (); cpulib_blink_led (); } +#define TARGET_REPEAT_TEST 1 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.map b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.map new file mode 100644 index 0000000..e65231c --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.map @@ -0,0 +1,816 @@ +Archive member included because of file (symbol) + +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + class.o (__adddf3) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + class.o (__muldf3) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + class.o (__fixunsdfsi) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + class.o (__truncdfsf2) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + class.o (__addsf3) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + class.o (__mulsf3) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + class.o (__gtsf2) +c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + health.o (memcpy) + +Allocating common symbols +Common symbol size file + +event_queue 0x118 telem.o +science_data 0x63b4 telem.o +s_w_reset 0x4 hw_if.o +ADC_result 0xa measure.o +write_checksum 0x1 tc_hand.o +failed_data_address + 0x2 hw_if.o +telemetry_data 0x84 telem.o +reference_checksum 0x1 hw_if.o +memory_mode 0x4 hw_if.o +telemetry_end_pointer + 0x4 telem.o +free_slot_index 0x4 telem.o +TC_state 0x4 tc_hand.o +address_MSB 0x1 tc_hand.o +read_memory_checksum + 0x1 telem.o +confirm_hit_result 0x1 measure.o +address_LSB 0x1 tc_hand.o +code_checksum 0x1 health.o +failed_code_address + 0x2 hw_if.o +telemetry_pointer 0x4 telem.o +event_queue_length 0x4 telem.o +test_level 0x4 measure.o +memory_transfer_buffer + 0x20 tc_hand.o +previous_TC 0x4 tc_hand.o +internal_time 0x4 health.o +TC_look_up 0x80 tc_hand.o +EA 0x1 harness.o +max_events 0x4 telem.o +test_channel 0x1 measure.o +forbidden_area 0x100 hw_if.o +memory_type 0x4 tc_hand.o +code_not_patched 0x1 hw_if.o + +Memory Configuration + +Name Origin Length Attributes +MEM_ROM_VECTORS 0x00000000 0x00000040 +MEM_ROM 0x00000040 0x0007ffc0 +MEM_RAM 0x40000000 0x00008000 +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a +LOAD c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libnosys.a + 0x40007ffc __ASYST_STACK_TOP = 0x40007ffc + 0x00000000 __ASYST_HEAP_SIZE = 0x0 + +.vectors 0x00000000 0x20 + *(.vectors) + .vectors 0x00000000 0x20 intvec.o + +.text 0x00000040 0x8778 + 0x00000040 __ASYST_TEXT_START = . + *(.text) + .text 0x00000040 0x4 intvec.o + .text 0x00000044 0x44 crt0.o + 0x00000044 __asyst_start + .text 0x00000088 0x198 crt_asyst.o + 0x0000015c __asyst_memcpy_byte + 0x00000088 __asyst_memset_byte + 0x000000a8 __asyst_memset_uint + 0x00000180 __asyst_memcpy + 0x000001cc __asyst_main + 0x00000134 __asyst_memcpy_uint + 0x000000c8 __asyst_memset + .text 0x00000220 0x17c cpulib.o + 0x00000244 cpulib_go_fast + 0x00000314 cpulib_blink_led + 0x000002c4 cpulib_flash_led + 0x00000220 cpulib_init_cpu + 0x0000029c cpulib_set_led + .text 0x0000039c 0x368 class.o + 0x000004a0 CalculateQualityNumber + 0x00000414 Init_SU_Settings + 0x0000039c RoughLogarithm + 0x00000458 InitClassification + 0x000003c0 GetQualityTerm + 0x00000584 ClassifyEvent + .text 0x00000704 0x0 classtab.o + .text 0x00000704 0x40 debie.o + 0x00000704 main + .text 0x00000744 0x3518 harness.o + 0x00000ab0 Set_AD_Delay + 0x00000ec4 Enable_Hit_Trigger + 0x0000076c DisableInterrupt + 0x000008f8 Read_TC_MSB + 0x00002b84 StartSystem + 0x00000c8c End_Of_ADC + 0x00000780 WaitInterrupt + 0x00000eec Hit_Trigger_Flag + 0x00000770 SetInterruptMask + 0x00000784 SendTaskMail + 0x00000ad4 Random_AD_Delay + 0x00001b34 Monitor_Health + 0x000011b4 Clear_Errors + 0x00000a6c Next + 0x00000d98 Set_DAC_Output + 0x00000b7c Start_Conversion + 0x00000b78 Update_ADC_Channel_Reg + 0x00000f70 Set_Test_Pulse_Level + 0x00000d68 Report_End_Of_ADC_Count + 0x00000744 WaitInterval + 0x00000928 Write_TM_MSB + 0x00000918 Write_TM_LSB + 0x000008f0 TestMemSeq + 0x00000a90 Next_Rand + 0x000008e0 TestMemBits + 0x00000948 Clear_TC_Timer_Overflow_Flag + 0x00000764 AttachInterrupt + 0x00000750 ShortDelay + 0x000007f4 WaitMail + 0x00001088 Reboot + 0x00000f3c Rise_Time_Counter + 0x000008e8 TestMemData + 0x00000efc Event_Flag + 0x00000e0c Random_Event + 0x00000f80 V_Down + 0x000009b8 Set_AD_Nominal + 0x00000d7c Get_Result + 0x00000768 EnableInterrupt + 0x00003c34 CreateTask + 0x00000f1c Get_LSB1_Counter + 0x00000fa8 Call_Patch + 0x0000087c Check_Current + 0x000007d4 isr_send_message + 0x00000d9c Sim_Self_Test_Trigger + 0x000013b0 TM_Tests + 0x00000c78 Report_Start_Conversion_Count + 0x0000095c Set_TC_Timer_Overflow_Flag + 0x00003c1c Short_Value + 0x00000908 Read_TC_LSB + 0x00000fa4 SignalPeakDetectorReset + 0x00000fac Check_Type_Size + 0x00000970 Set_AD_Unlimited + 0x00000f0c Get_MSB_Counter + 0x00000f6c Set_SU_Self_Test_Ch + 0x00001084 Report_Event_Histo + 0x00001b70 SU_Self_Test_Tests + 0x00000f2c Get_LSB2_Counter + 0x00000ed8 Disable_Hit_Trigger + 0x00000f4c Trigger_Source_0 + 0x00000938 TC_Timer_Overflow_Flag + 0x00002748 Monitoring_Task_Tests + 0x00000778 ResetInterruptMask + 0x00000748 WaitTimeout + 0x0000074c SetTimeSlice + 0x00000f5c Trigger_Source_1 + .text 0x00003c5c 0x1444 health.o + 0x00003da4 UpdateTime + 0x00004bb8 HighVoltageCurrent + 0x00004040 Set_SU_TriggerLevels + 0x00004b38 InitHealthMonitoring + 0x00003d60 Set_SU_Error + 0x000040a4 RestoreSettings + 0x00004900 MeasureTemperature + 0x00004640 Read_AD_Channel + 0x000048fc DPU_SelfTest + 0x00004e38 HandleHealthMonitoring + 0x00003c5c Clear_RTX_Errors + 0x00003dd4 VoltageFailure + 0x00003c88 SetSoftwareError + 0x00003dbc UpdatePeriodCounter + 0x000043ac SelfTestChannel + 0x00003d44 SetErrorStatus + 0x00004854 Monitor_DPU_Voltage + 0x00004e9c Boot + 0x00004c34 SelfTest_SU + 0x00003cd0 ClearModeStatusError + 0x0000473c MeasureVoltage + 0x00004c7c Monitor + 0x00003ce8 SetMode + 0x00004138 DelayAwhile + 0x00003ca0 ClearSoftwareError + 0x0000456c TemperatureFailure + 0x00003ef8 ExceedsLimit + 0x00003cb4 SetModeStatusError + 0x00004e88 HealthMonitoringTask + 0x000046fc DAC_SelfTest + 0x000045a4 Convert_AD + 0x00003d08 GetMode + 0x00004ab0 InitSystem + 0x00003d1c Clear_SU_Error + 0x00003f20 Monitor_SU_Voltage + 0x000049cc CalculateChecksum + 0x000041b8 ExecuteChannelTest + 0x00003d90 ClearErrorStatus + 0x00004b50 LowVoltageCurrent + .text 0x000050a0 0x844 hw_if.o + 0x000051f8 EnableAnalogSwitch + 0x000052ac GetVoltageStatus + 0x00005288 ResetPeakDetector + 0x000053c8 Switch_SU_Off + 0x000051cc DisableAnalogSwitch + 0x000056ac CopyProgramCode + 0x00005864 Init_DPU + 0x00005260 SelectStartSwitchLevel + 0x000050b8 SignalMemoryErrors + 0x00005814 InitCode_RAM + 0x000050a0 GetResetClass + 0x000055bc PatchCode + 0x00005148 SetMemoryConfiguration + 0x000056f8 Check_RAM + 0x000052d0 SetTestPulseLevel + 0x000057b8 InitData_RAM + 0x0000516c SelectSelfTestChannel + 0x00005220 SelectTriggerSwitchLevel + 0x0000557c ReadDelayCounters + 0x000052d8 SetTriggerLevel + 0x0000556c ReadRiseTimeCounter + 0x00005498 Switch_SU_On + 0x00005168 ResetDelayCounters + 0x00005158 GetMemoryConfiguration + .text 0x000058e4 0x594 measure.o + 0x00005c6c HandleHitTrigger + 0x00005aac HandleAcquisition + 0x00005c58 AcquisitionTask + 0x000059f8 SetSensorUnitOff + 0x000058e4 InitAcquisitionTask + 0x00005e64 HitTriggerTask + 0x00005a5c Start_SU_SwitchingOn + 0x000059a4 Update_SU_State + 0x00005e50 InitHitTriggerTask + 0x0000590c Switch_SU_State + 0x00005988 ReadSensorUnit + .text 0x00005e78 0x34 target.o + 0x00005ea4 Get_Code_Byte + 0x00005e8c Get_Data_Byte + 0x00005e78 Data_Pointer + 0x00005e88 Set_Data_Byte + .text 0x00005eac 0x13f8 tc_hand.o + 0x00006068 Set_TC_Error + 0x0000681c ExecuteCommand + 0x00006184 UpdateTarget + 0x00006ee8 TelecommandExecutionTask + 0x00006c14 MemoryPatch + 0x00006080 WriteMemory + 0x00006da8 HandleTelecommand + 0x00006028 PatchExecCommandOk + 0x00005eac InitTC_LookUp + 0x00006efc TC_InterruptService + 0x0000612c InitTelecommandTask + .text 0x000072a4 0x46c telem.o + 0x000075f4 TM_InterruptService + 0x00007404 RecordEvent + 0x000072f0 FindMinQualityRecord + 0x000072a4 GetFreeRecord + 0x000072d4 GetElapsedTime + 0x0000738c IncrementCounters + 0x000075e0 ResetEventQueueLength + 0x000074fc ClearEvents + .text 0x00007710 0x400 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + 0x00007aa4 __floatdidf + 0x00007a24 __floatsidf + 0x000079fc __aeabi_ui2d + 0x00007710 __aeabi_drsub + 0x00007a50 __extendsfdf2 + 0x0000771c __adddf3 + 0x000079fc __floatunsidf + 0x0000771c __aeabi_dadd + 0x00007a90 __aeabi_ul2d + 0x00007718 __aeabi_dsub + 0x00007a90 __floatundidf + 0x00007a24 __aeabi_i2d + 0x00007aa4 __aeabi_l2d + 0x00007a50 __aeabi_f2d + 0x00007718 __subdf3 + .text 0x00007b10 0x470 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + 0x00007d7c __aeabi_ddiv + 0x00007b10 __aeabi_dmul + 0x00007d7c __divdf3 + 0x00007b10 __muldf3 + .text 0x00007f80 0x54 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + 0x00007f80 __fixunsdfsi + 0x00007f80 __aeabi_d2uiz + .text 0x00007fd4 0xa0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + 0x00007fd4 __aeabi_d2f + 0x00007fd4 __truncdfsf2 + .text 0x00008074 0x2ac c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + 0x00008080 __aeabi_fadd + 0x0000807c __subsf3 + 0x00008244 __aeabi_i2f + 0x0000807c __aeabi_fsub + 0x00008274 __floatdisf + 0x00008244 __floatsisf + 0x00008264 __floatundisf + 0x0000823c __aeabi_ui2f + 0x00008274 __aeabi_l2f + 0x00008264 __aeabi_ul2f + 0x00008074 __aeabi_frsub + 0x0000823c __floatunsisf + 0x00008080 __addsf3 + .text 0x00008320 0x2f8 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + 0x000084b8 __divsf3 + 0x000084b8 __aeabi_fdiv + 0x00008320 __mulsf3 + 0x00008320 __aeabi_fmul + .text 0x00008618 0xf8 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + 0x000086fc __aeabi_fcmpgt + 0x00008620 __lesf2 + 0x00008628 __nesf2 + 0x000086e8 __aeabi_fcmpge + 0x00008618 __gtsf2 + 0x000086d4 __aeabi_fcmple + 0x00008628 __eqsf2 + 0x00008628 __cmpsf2 + 0x00008620 __ltsf2 + 0x00008698 __aeabi_cfcmple + 0x00008618 __gesf2 + 0x000086ac __aeabi_fcmpeq + 0x00008688 __aeabi_cfrcmple + 0x000086c0 __aeabi_fcmplt + 0x00008698 __aeabi_cfcmpeq + .text 0x00008710 0xa8 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + 0x00008710 memcpy + *(.text.*) + *(.glue_7t) + .glue_7t 0x000087b8 0x0 intvec.o + .glue_7t 0x000087b8 0x0 crt0.o + .glue_7t 0x000087b8 0x0 crt_asyst.o + .glue_7t 0x000087b8 0x0 cpulib.o + .glue_7t 0x000087b8 0x0 class.o + .glue_7t 0x000087b8 0x0 classtab.o + .glue_7t 0x000087b8 0x0 debie.o + .glue_7t 0x000087b8 0x0 harness.o + .glue_7t 0x000087b8 0x0 health.o + .glue_7t 0x000087b8 0x0 hw_if.o + .glue_7t 0x000087b8 0x0 measure.o + .glue_7t 0x000087b8 0x0 target.o + .glue_7t 0x000087b8 0x0 tc_hand.o + .glue_7t 0x000087b8 0x0 telem.o + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + .glue_7t 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + *(.glue_7) + .glue_7 0x000087b8 0x0 intvec.o + .glue_7 0x000087b8 0x0 crt0.o + .glue_7 0x000087b8 0x0 crt_asyst.o + .glue_7 0x000087b8 0x0 cpulib.o + .glue_7 0x000087b8 0x0 class.o + .glue_7 0x000087b8 0x0 classtab.o + .glue_7 0x000087b8 0x0 debie.o + .glue_7 0x000087b8 0x0 harness.o + .glue_7 0x000087b8 0x0 health.o + .glue_7 0x000087b8 0x0 hw_if.o + .glue_7 0x000087b8 0x0 measure.o + .glue_7 0x000087b8 0x0 target.o + .glue_7 0x000087b8 0x0 tc_hand.o + .glue_7 0x000087b8 0x0 telem.o + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + .glue_7 0x000087b8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + *(.init) + *(.fini) + *(.gnu.linkonce.t*) + 0x000087b8 __ASYST_TEXT_END = . + 0x000087b8 . = ALIGN (0x4) + 0x000087b8 __ASYST_CTOR_START = . + *(.ctors) + 0x000087b8 __ASYST_CTOR_END = . + 0x000087b8 . = ALIGN (0x4) + 0x000087b8 __ASYST_DTOR_START = . + *(.dtors) + 0x000087b8 __ASYST_DTOR_END = . + +.vfp11_veneer 0x00000000 0x0 + .vfp11_veneer 0x00000000 0x0 intvec.o + .vfp11_veneer 0x00000000 0x0 crt0.o + .vfp11_veneer 0x00000000 0x0 crt_asyst.o + .vfp11_veneer 0x00000000 0x0 cpulib.o + .vfp11_veneer 0x00000000 0x0 class.o + .vfp11_veneer 0x00000000 0x0 classtab.o + .vfp11_veneer 0x00000000 0x0 debie.o + .vfp11_veneer 0x00000000 0x0 harness.o + .vfp11_veneer 0x00000000 0x0 health.o + .vfp11_veneer 0x00000000 0x0 hw_if.o + .vfp11_veneer 0x00000000 0x0 measure.o + .vfp11_veneer 0x00000000 0x0 target.o + .vfp11_veneer 0x00000000 0x0 tc_hand.o + .vfp11_veneer 0x00000000 0x0 telem.o + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + .vfp11_veneer 0x00000000 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + +.rodata 0x000087b8 0x184 + 0x000087b8 . = ALIGN (0x4) + *(.rodata) + .rodata 0x000087b8 0x13f harness.o + *fill* 0x000088f7 0x1 00 + .rodata 0x000088f8 0x24 health.o + .rodata 0x0000891c 0x1 hw_if.o + 0x0000891c checksum_nullifier + *(.rodata.*) + *fill* 0x0000891d 0x3 00 + .rodata.str1.4 + 0x00008920 0x1c harness.o + *(.rdata) + *(.rdata.*) + *(.sdata2) + *(.sdata2.*) + *(.gnu.linkonce.r*) + +.data 0x40000000 0x1e8 load address 0x0000893c + 0x40000000 . = ALIGN (0x4) + 0x40000000 __ASYST_DATA_START = . + 0x0000893c __ASYST_DATA_LOAD = LOADADDR (.data) + *(.data) + .data 0x40000000 0x0 intvec.o + .data 0x40000000 0x0 crt0.o + .data 0x40000000 0x0 crt_asyst.o + .data 0x40000000 0x0 cpulib.o + .data 0x40000000 0x0 class.o + .data 0x40000000 0x100 classtab.o + 0x40000000 event_class + .data 0x40000100 0x0 debie.o + .data 0x40000100 0xac harness.o + 0x40000100 switch_su_cmd + .data 0x400001ac 0x14 health.o + 0x400001ac temp_meas_count + 0x400001bc health_mon_round + 0x400001b4 checksum_count + 0x400001b0 voltage_meas_count + 0x400001b8 ADC_channel_register + .data 0x400001c0 0x4 hw_if.o + 0x400001c0 analog_switch_bit + .data 0x400001c4 0x10 measure.o + 0x400001cc hit_task + 0x400001c4 hit_budget + 0x400001c8 hit_budget_left + 0x400001d0 acq_task + .data 0x400001d4 0x0 target.o + .data 0x400001d4 0x14 tc_hand.o + 0x400001d4 SU_config + 0x400001e4 TC_task + .data 0x400001e8 0x0 telem.o + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + .data 0x400001e8 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + *(.data.*) + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.d*) + 0x400001e8 __ASYST_DATA_END = . + +.bss 0x400001e8 0x6854 + 0x400001e8 . = ALIGN (0x4) + 0x400001e8 __ASYST_BSS_START = . + *(.bss) + .bss 0x400001e8 0x0 intvec.o + .bss 0x400001e8 0x0 crt0.o + .bss 0x400001e8 0x0 crt_asyst.o + .bss 0x400001e8 0x4 cpulib.o + .bss 0x400001ec 0x0 class.o + .bss 0x400001ec 0x0 classtab.o + .bss 0x400001ec 0x0 debie.o + .bss 0x400001ec 0xb4 harness.o + .bss 0x400002a0 0x1 health.o + 0x400002a0 self_test_flag + .bss 0x400002a1 0x2 hw_if.o + 0x400002a2 SU_self_test_channel + 0x400002a1 SU_ctrl_register + *fill* 0x400002a3 0x1 00 + .bss 0x400002a4 0x34 measure.o + 0x400002a8 SU_state + 0x400002a4 self_test_SU_number + .bss 0x400002d8 0x0 target.o + .bss 0x400002d8 0x18 tc_hand.o + 0x400002dc memory_buffer_index + 0x400002d8 TC_timeout + .bss 0x400002f0 0x0 telem.o + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + .bss 0x400002f0 0x0 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(COMMON) + COMMON 0x400002f0 0x1 harness.o + 0x400002f0 EA + *fill* 0x400002f1 0x3 00 + COMMON 0x400002f4 0x8 health.o + 0x400002f4 code_checksum + 0x400002f8 internal_time + COMMON 0x400002fc 0x10f hw_if.o + 0x400002fc s_w_reset + 0x40000300 failed_data_address + 0x40000302 reference_checksum + 0x40000304 memory_mode + 0x40000308 failed_code_address + 0x4000030a forbidden_area + 0x4000040a code_not_patched + *fill* 0x4000040b 0x1 00 + COMMON 0x4000040c 0x11 measure.o + 0x4000040c ADC_result + 0x40000416 confirm_hit_result + 0x40000418 test_level + 0x4000041c test_channel + *fill* 0x4000041d 0x3 00 + COMMON 0x40000420 0xb4 tc_hand.o + 0x40000420 write_checksum + 0x40000424 TC_state + 0x40000428 address_MSB + 0x40000429 address_LSB + 0x4000042a memory_transfer_buffer + 0x4000044c previous_TC + 0x40000450 TC_look_up + 0x400004d0 memory_type + COMMON 0x400004d4 0x6568 telem.o + 0x400004d4 event_queue + 0x400005ec science_data + 0x400069a0 telemetry_data + 0x40006a24 telemetry_end_pointer + 0x40006a28 free_slot_index + 0x40006a2c read_memory_checksum + 0x40006a30 telemetry_pointer + 0x40006a34 event_queue_length + 0x40006a38 max_events + *(.gnu.linkonce.b*) + 0x40006a3c __ASYST_BSS_END = . + 0x40006a3c end = ALIGN (0x4) + +.heap 0x40006a3c 0x0 + 0x40006a3c . = ALIGN (0x4) + 0x40006a3c __ASYST_HEAP_START = . + 0x40006a3c . = (. + __ASYST_HEAP_SIZE) +LOAD intvec.o +LOAD crt0.o +LOAD crt_asyst.o +LOAD cpulib.o +LOAD class.o +LOAD classtab.o +LOAD debie.o +LOAD harness.o +LOAD health.o +LOAD hw_if.o +LOAD measure.o +LOAD target.o +LOAD tc_hand.o +LOAD telem.o +START GROUP +LOAD c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a +LOAD c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a +END GROUP +OUTPUT(debie1.exe elf32-littlearm) + +.ARM.attributes + 0x00000000 0x10 + .ARM.attributes + 0x00000000 0x10 intvec.o + .ARM.attributes + 0x00000010 0x10 crt0.o + .ARM.attributes + 0x00000020 0x10 crt_asyst.o + .ARM.attributes + 0x00000030 0x10 cpulib.o + .ARM.attributes + 0x00000040 0x10 class.o + .ARM.attributes + 0x00000050 0x10 classtab.o + .ARM.attributes + 0x00000060 0x10 debie.o + .ARM.attributes + 0x00000070 0x10 harness.o + .ARM.attributes + 0x00000080 0x10 health.o + .ARM.attributes + 0x00000090 0x10 hw_if.o + .ARM.attributes + 0x000000a0 0x10 measure.o + .ARM.attributes + 0x000000b0 0x10 target.o + .ARM.attributes + 0x000000c0 0x10 tc_hand.o + .ARM.attributes + 0x000000d0 0x10 telem.o + .ARM.attributes + 0x000000e0 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubdf3.o) + .ARM.attributes + 0x000000f0 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivdf3.o) + .ARM.attributes + 0x00000100 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_fixunsdfsi.o) + .ARM.attributes + 0x00000110 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_truncdfsf2.o) + .ARM.attributes + 0x00000120 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_addsubsf3.o) + .ARM.attributes + 0x00000130 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_muldivsf3.o) + .ARM.attributes + 0x00000140 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2\libgcc.a(_cmpsf2.o) + .ARM.attributes + 0x00000150 0x10 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) + +.debug_line 0x00000000 0x1b8f + .debug_line 0x00000000 0x6f intvec.o + .debug_line 0x0000006f 0x66 crt0.o + .debug_line 0x000000d5 0x97 crt_asyst.o + .debug_line 0x0000016c 0x8a cpulib.o + .debug_line 0x000001f6 0x110 class.o + .debug_line 0x00000306 0x31 classtab.o + .debug_line 0x00000337 0x67 debie.o + .debug_line 0x0000039e 0x8dc harness.o + .debug_line 0x00000c7a 0x4fd health.o + .debug_line 0x00001177 0x24c hw_if.o + .debug_line 0x000013c3 0x1dc measure.o + .debug_line 0x0000159f 0x4d target.o + .debug_line 0x000015ec 0x460 tc_hand.o + .debug_line 0x00001a4c 0x143 telem.o + +.debug_info 0x00000000 0x6005 + .debug_info 0x00000000 0x9b intvec.o + .debug_info 0x0000009b 0x9d crt0.o + .debug_info 0x00000138 0x2e4 crt_asyst.o + .debug_info 0x0000041c 0xd1 cpulib.o + .debug_info 0x000004ed 0x6d2 class.o + .debug_info 0x00000bbf 0x91 classtab.o + .debug_info 0x00000c50 0x94 debie.o + .debug_info 0x00000ce4 0x1886 harness.o + .debug_info 0x0000256a 0xfdd health.o + .debug_info 0x00003547 0xb5c hw_if.o + .debug_info 0x000040a3 0x9d5 measure.o + .debug_info 0x00004a78 0x147 target.o + .debug_info 0x00004bbf 0xc19 tc_hand.o + .debug_info 0x000057d8 0x82d telem.o + +.debug_abbrev 0x00000000 0x11b9 + .debug_abbrev 0x00000000 0x12 intvec.o + .debug_abbrev 0x00000012 0x14 crt0.o + .debug_abbrev 0x00000026 0x130 crt_asyst.o + .debug_abbrev 0x00000156 0x90 cpulib.o + .debug_abbrev 0x000001e6 0x16d class.o + .debug_abbrev 0x00000353 0x56 classtab.o + .debug_abbrev 0x000003a9 0x5b debie.o + .debug_abbrev 0x00000404 0x361 harness.o + .debug_abbrev 0x00000765 0x1ee health.o + .debug_abbrev 0x00000953 0x222 hw_if.o + .debug_abbrev 0x00000b75 0x1ea measure.o + .debug_abbrev 0x00000d5f 0xc7 target.o + .debug_abbrev 0x00000e26 0x1bd tc_hand.o + .debug_abbrev 0x00000fe3 0x1d6 telem.o + +.debug_aranges 0x00000000 0x1a8 + .debug_aranges + 0x00000000 0x28 intvec.o + .debug_aranges + 0x00000028 0x20 crt0.o + .debug_aranges + 0x00000048 0x20 crt_asyst.o + .debug_aranges + 0x00000068 0x20 cpulib.o + .debug_aranges + 0x00000088 0x20 class.o + .debug_aranges + 0x000000a8 0x20 debie.o + .debug_aranges + 0x000000c8 0x20 harness.o + .debug_aranges + 0x000000e8 0x20 health.o + .debug_aranges + 0x00000108 0x20 hw_if.o + .debug_aranges + 0x00000128 0x20 measure.o + .debug_aranges + 0x00000148 0x20 target.o + .debug_aranges + 0x00000168 0x20 tc_hand.o + .debug_aranges + 0x00000188 0x20 telem.o + +.debug_ranges 0x00000000 0x58 + .debug_ranges 0x00000000 0x20 intvec.o + .debug_ranges 0x00000020 0x38 harness.o + +.debug_frame 0x00000000 0x1198 + .debug_frame 0x00000000 0x9c crt_asyst.o + .debug_frame 0x0000009c 0x70 cpulib.o + .debug_frame 0x0000010c 0x9c class.o + .debug_frame 0x000001a8 0x2c debie.o + .debug_frame 0x000001d4 0x680 harness.o + .debug_frame 0x00000854 0x3b8 health.o + .debug_frame 0x00000c0c 0x210 hw_if.o + .debug_frame 0x00000e1c 0x12c measure.o + .debug_frame 0x00000f48 0x58 target.o + .debug_frame 0x00000fa0 0x11c tc_hand.o + .debug_frame 0x000010bc 0xdc telem.o + +.debug_loc 0x00000000 0x2359 + .debug_loc 0x00000000 0x1de crt_asyst.o + .debug_loc 0x000001de 0x3e cpulib.o + .debug_loc 0x0000021c 0x1be class.o + .debug_loc 0x000003da 0x1f debie.o + .debug_loc 0x000003f9 0xa0e harness.o + .debug_loc 0x00000e07 0x7ad health.o + .debug_loc 0x000015b4 0x510 hw_if.o + .debug_loc 0x00001ac4 0x278 measure.o + .debug_loc 0x00001d3c 0x6e target.o + .debug_loc 0x00001daa 0x3bc tc_hand.o + .debug_loc 0x00002166 0x1f3 telem.o + +.debug_pubnames + 0x00000000 0x12e8 + .debug_pubnames + 0x00000000 0xa9 crt_asyst.o + .debug_pubnames + 0x000000a9 0x76 cpulib.o + .debug_pubnames + 0x0000011f 0x91 class.o + .debug_pubnames + 0x000001b0 0x22 classtab.o + .debug_pubnames + 0x000001d2 0x1b debie.o + .debug_pubnames + 0x000001ed 0x525 harness.o + .debug_pubnames + 0x00000712 0x3b6 health.o + .debug_pubnames + 0x00000ac8 0x2f6 hw_if.o + .debug_pubnames + 0x00000dbe 0x1a4 measure.o + .debug_pubnames + 0x00000f62 0x59 target.o + .debug_pubnames + 0x00000fbb 0x1be tc_hand.o + .debug_pubnames + 0x00001179 0x16f telem.o + +.debug_str 0x00000000 0x21b1 + .debug_str 0x00000000 0x1c4 crt_asyst.o + 0x1db (size before relaxing) + .debug_str 0x000001c4 0x88 cpulib.o + 0xf9 (size before relaxing) + .debug_str 0x0000024c 0x611 class.o + 0x710 (size before relaxing) + .debug_str 0x0000085d 0x11 classtab.o + 0xf3 (size before relaxing) + .debug_str 0x0000086e 0xe debie.o + 0xe9 (size before relaxing) + .debug_str 0x0000087c 0xb1c harness.o + 0x1134 (size before relaxing) + .debug_str 0x00001398 0x59b health.o + 0xd8d (size before relaxing) + .debug_str 0x00001933 0x39f hw_if.o + 0x9f0 (size before relaxing) + .debug_str 0x00001cd2 0x15d measure.o + 0x948 (size before relaxing) + .debug_str 0x00001e2f 0x45 target.o + 0x150 (size before relaxing) + .debug_str 0x00001e74 0x253 tc_hand.o + 0xaff (size before relaxing) + .debug_str 0x000020c7 0xea telem.o + 0x825 (size before relaxing) + +.comment 0x00000000 0xea + .comment 0x00000000 0x12 crt_asyst.o + .comment 0x00000012 0x12 cpulib.o + .comment 0x00000024 0x12 class.o + .comment 0x00000036 0x12 classtab.o + .comment 0x00000048 0x12 debie.o + .comment 0x0000005a 0x12 harness.o + .comment 0x0000006c 0x12 health.o + .comment 0x0000007e 0x12 hw_if.o + .comment 0x00000090 0x12 measure.o + .comment 0x000000a2 0x12 target.o + .comment 0x000000b4 0x12 tc_hand.o + .comment 0x000000c6 0x12 telem.o + .comment 0x000000d8 0x12 c:/ifdev/2007/gcc/arm/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/lib\libc.a(lib_a-memcpy.o) diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.txt b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.txt new file mode 100644 index 0000000..e60fb7b --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/link.txt @@ -0,0 +1,98 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(__asyst_start) + +/* +Memory layout for NXP LPC2138: +- 512 KiB FLASH from 0x00000000 to 0x0007ffff +- 32 KiB SRAM from 0x40000000 to 0x40007fff +*/ + +MEMORY +{ + MEM_ROM_VECTORS : + ORIGIN = 0x00000000, LENGTH = 0x00000040 + MEM_ROM : + ORIGIN = ORIGIN(MEM_ROM_VECTORS) + LENGTH(MEM_ROM_VECTORS), LENGTH = 512k - LENGTH(MEM_ROM_VECTORS) + MEM_RAM : + ORIGIN = 0x40000000, LENGTH = 32k +} +__ASYST_STACK_TOP = ORIGIN(MEM_RAM) + LENGTH(MEM_RAM) - 4; +__ASYST_HEAP_SIZE = 0x0; + +SECTIONS +{ + .vectors : /* vector table */ + { + *(.vectors) + } > MEM_ROM_VECTORS + + .text : + { + __ASYST_TEXT_START = .; /* executable code */ + *(.text) + *(.text.*) + *(.glue_7t) *(.glue_7) + *(.init) + *(.fini) + *(.gnu.linkonce.t*) + __ASYST_TEXT_END = .; + + . = ALIGN(4); + __ASYST_CTOR_START = .; /* constructors */ + *(.ctors) + __ASYST_CTOR_END = .; + + . = ALIGN(4); + __ASYST_DTOR_START = .; /* destructors */ + *(.dtors) + __ASYST_DTOR_END = .; + } > MEM_ROM + + .rodata : + { + . = ALIGN(4); + *(.rodata) /* read-only data */ + *(.rodata.*) + *(.rdata) + *(.rdata.*) + *(.sdata2) /* small constant data */ + *(.sdata2.*) + *(.gnu.linkonce.r*) + } > MEM_ROM + + .data : + { + . = ALIGN(4); + __ASYST_DATA_START = .; /* start of the data */ + __ASYST_DATA_LOAD = LOADADDR(.data); + *(.data) /* data */ + *(.data.*) + *(.sdata) /* small data */ + *(.sdata.*) + *(.gnu.linkonce.d*) + __ASYST_DATA_END = .; /* end of the data */ + } >MEM_RAM AT>MEM_ROM + + .bss (NOLOAD) : + { + . = ALIGN(4); + __ASYST_BSS_START = .; /* start of the bss */ + *(.bss) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(COMMON) + *(.gnu.linkonce.b*) + __ASYST_BSS_END = .; /* end of the bss */ + end = ALIGN(4) ; + } > MEM_RAM + + .heap (NOLOAD) : + { + . = ALIGN(4); + __ASYST_HEAP_START = .; /* start of the heap */ + . += __ASYST_HEAP_SIZE; + } > MEM_RAM + +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/problems.h new file mode 100644 index 0000000..cbf6049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for arm7/gcc-if07 + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/04/09 11:26:38 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/setup.bat b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/setup.bat new file mode 100644 index 0000000..9331598 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/setup.bat @@ -0,0 +1,46 @@ +echo off +Rem Batch file to set up environment for GCC ARM7 C compiler from iSYSTEMS +Rem for the iF-DEV-LPC kit, for all test programs. +Rem +Rem Copyright (c) 2008 Tidorum Ltd. +Rem +Rem $Revision: 1.2 $ + + +Rem GCC installation paths: + +set IFDEVD=C:\iFDEV\2007 +set GCCD=%IFDEVD%\gcc\arm +set GCCbin=%GCCD%\bin +set GCClib=%GCCD%\lib + +set PATH=%GCCbin%;%PATH% + +Rem C compiler and options: + +set CC=arm-elf-gcc.exe + +set CCOPT=-c -mcpu=arm7tdmi -g -O2 + +set ASOPT=-c -mcpu=arm7tdmi -g + +Rem Linker and options: + +set LD=arm-elf-gcc.exe + +set LDOPT=-nostartfiles ^ + -mlittle-endian ^ + -mcpu=arm7tdmi ^ + -Xlinker -lc ^ + -lnosys ^ + -Xlinker -Map=link.map ^ + -Xlinker -n + +Rem Common runtime files to be included in the link: +Rem crt0.s (use ASOPT) +Rem intvec.s (use ASOPT) +Rem crt_asyst.c (use CCOPT) +Rem cpulib.c (use CCOPT) +Rem +Rem Use the linker script file link.txt, with the LD option +Rem -Xlinker --script=%dir%\link.txt. diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target.c new file mode 100644 index 0000000..93ece25 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0x40000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target_tm_data.h new file mode 100644 index 0000000..7211704 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/target_tm_data.h @@ -0,0 +1,29 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + This version for the target arm7/gcc-if07. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 910 +/* Set to make the entire program fit in 32 KiB of data memory. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/keyword.h new file mode 100644 index 0000000..ea20537 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU ARM compiler for the ARM7 as + delivered with the IF-DEV-LPC, no kernel. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for ARM7/GCC, where the widths of + the integer types are the following (as observed from the code of + the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *, void *, int ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/problems.h new file mode 100644 index 0000000..cbf6049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for arm7/gcc-if07 + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/04/09 11:26:38 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target.c new file mode 100644 index 0000000..6e9d4cf --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0x38000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x1/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/keyword.h new file mode 100644 index 0000000..ea20537 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU ARM compiler for the ARM7 as + delivered with the IF-DEV-LPC, no kernel. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for ARM7/GCC, where the widths of + the integer types are the following (as observed from the code of + the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *, void *, int ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/problems.h new file mode 100644 index 0000000..cbf6049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for arm7/gcc-if07 + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/04/09 11:26:38 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target.c new file mode 100644 index 0000000..6e9d4cf --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0x38000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x2/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/keyword.h new file mode 100644 index 0000000..ea20537 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU ARM compiler for the ARM7 as + delivered with the IF-DEV-LPC, no kernel. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for ARM7/GCC, where the widths of + the integer types are the following (as observed from the code of + the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *, void *, int ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/problems.h new file mode 100644 index 0000000..cbf6049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for arm7/gcc-if07 + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/04/09 11:26:38 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target.c new file mode 100644 index 0000000..6e9d4cf --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0x38000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x4/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/keyword.h new file mode 100644 index 0000000..ea20537 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU ARM compiler for the ARM7 as + delivered with the IF-DEV-LPC, no kernel. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for ARM7/GCC, where the widths of + the integer types are the following (as observed from the code of + the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *, void *, int ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/problems.h new file mode 100644 index 0000000..cbf6049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for arm7/gcc-if07 + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/04/09 11:26:38 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target.c new file mode 100644 index 0000000..6e9d4cf --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0x38000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-x8/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/keyword.h new file mode 100644 index 0000000..ea20537 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU ARM compiler for the ARM7 as + delivered with the IF-DEV-LPC, no kernel. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for ARM7/GCC, where the widths of + the integer types are the following (as observed from the code of + the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *, void *, int ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/problems.h new file mode 100644 index 0000000..cbf6049 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for arm7/gcc-if07 + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/04/09 11:26:38 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target.c new file mode 100644 index 0000000..93ece25 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0x40000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/host-build.sh b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/host-build.sh new file mode 100755 index 0000000..d7ed3d2 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/host-build.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# +# Script to compile "debie1" on the host Intel/Linux system +# using the target-specific code for mpc5554/gcc. This is +# meant to check that the MPC5554 port has no target-specific +# behaviour and (by default) no output; it does not generate +# an executable for the MPC5554. +# +# Any command-line arguments go into the CCOPT (eg. -Wpadded). +# As default, the trace output from the harness and target +# modules are disabled. + + +# Set tpd to the Test Program Directory: +tpd=../.. + +# Set hnd to the "harness" directory: + +hnd=${tpd}/harness + +# Native gcc and options: + +export CC="gcc" +export CCOPT="-g -O2 -I. -I${hnd} -Wall $*" +export LD="gcc" +export LDOPT= + +${CC} ${CCOPT} -c ${tpd}/class.c +${CC} ${CCOPT} -c ${tpd}/classtab.c +${CC} ${CCOPT} -c ${tpd}/debie.c +${CC} ${CCOPT} -c -I${tpd} ${hnd}/harness.c +${CC} ${CCOPT} -c ${tpd}/health.c +${CC} ${CCOPT} -c ${tpd}/hw_if.c +${CC} ${CCOPT} -c ${tpd}/measure.c +${CC} ${CCOPT} -c -I${tpd} target.c +${CC} ${CCOPT} -c ${tpd}/tc_hand.c +${CC} ${CCOPT} -c ${tpd}/telem.c + + +${CC} ${LDOPT} \ + -o debie1 \ + class.o \ + classtab.o \ + debie.o \ + harness.o \ + health.o \ + hw_if.o \ + measure.o \ + target.o \ + tc_hand.o \ + telem.o + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/keyword.h new file mode 100644 index 0000000..e844d60 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/keyword.h @@ -0,0 +1,166 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to the GNU C compiler for the MPC5554. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + +#include +/* For memcpy (). */ + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for MPC5554/gcc, where the + widths the integer types are the following (as observed from the + code of the function Check_Type_Size in harness.c): + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler also has alignment concerns, so here we + define all telemetry data as octets and access it using memcpy() + instead of direct assignment. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +#define COPY(DEST,SOURCE) memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#define TARGET_INIT {} + +#define TARGET_MARK {} +#define TARGET_REBOOT {} +#define TARGET_START_TEST {} +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/linker-mpc55xx-gcc.ld b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/linker-mpc55xx-gcc.ld new file mode 100644 index 0000000..50604a6 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/linker-mpc55xx-gcc.ld @@ -0,0 +1,254 @@ +/* Default linker script, for normal executables */ +OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") +OUTPUT_ARCH(powerpc:common) +ENTRY(_start) + +/* where to search for stuff */ +SEARCH_DIR("=/usr/local/lib"); +SEARCH_DIR("=/lib"); +SEARCH_DIR("=/usr/lib"); + +/* end of stack */ +__stack = 0x4000fff8; +___stack = 0x4000fff8; + +/* sections */ +SECTIONS +{ + /* read-only sections, merged into text segment: */ + PROVIDE (__executable_start = 0x000002000); + . = 0x00002000 + SIZEOF_HEADERS; + + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro*) } + .rela.data.rel.ro : { *(.rel.data.rel.ro*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rela.got1 : { *(.rela.got1) } + .rela.got2 : { *(.rela.got2) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .init : + { + KEEP (*(.init)) + } =0 + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } =0 + .fini : + { + KEEP (*(.fini)) + } =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .sdata2 : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) } + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } + .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } + + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } + .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } + + /* 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. */ + . = ALIGN(32 / 8); + + PROVIDE (__preinit_array_start = .); + + .preinit_array : { KEEP (*(.preinit_array)) } + + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + + .init_array : { KEEP (*(.init_array)) } + + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + + .fini_array : { KEEP (*(.fini_array)) } + + 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)) + } + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } + .fixup : { *(.fixup) } + .got1 : { *(.got1) } + .got2 : { *(.got2) } + .dynamic : { *(.dynamic) } + .got : { *(.got.plt) *(.got) } + .plt : { *(.plt) } + + /* put some stuff into external ram */ + . = 0x20000000; + .externalram : { *(.externalram) } + + /* put data segment into internal sram */ + . = 0x40000000; + . = DATA_SEGMENT_ALIGN (0x10000, 0x1000); + + /* thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } + _edata = .; + + PROVIDE (edata = .); + + __bss_start = .; + .sbss : + { + PROVIDE (__sbss_start = .); + PROVIDE (___sbss_start = .); + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + PROVIDE (__sbss_end = .); + PROVIDE (___sbss_end = .); + } + .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(32 / 8); + } + . = ALIGN(32 / 8); + _end = .; + __end = .; + + PROVIDE (end = .); + . = DATA_SEGMENT_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) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/problems.h new file mode 100644 index 0000000..91cd113 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/problems.h @@ -0,0 +1,20 @@ +/* + problems.h for mpc5554/gcc. + Part of the DEBIE-1 benchmark. +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) {} +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM {} +/* A marker to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/readme.txt b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/readme.txt new file mode 100644 index 0000000..1a843e3 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/readme.txt @@ -0,0 +1,12 @@ +This folder contains header files and a build script +that compile and link the DEBIE-1 DPU SW benchmark for +execution on an MPC5554 processor. The completed +executable file is also provided. + +The generated executable runs the test cases defined +in harness.c once and then stops. The executable does not +generate any output. + +This port was contributed by Simon Wegener of AbsInt Angewandte +Informatik GmbH. + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target-build.sh b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target-build.sh new file mode 100755 index 0000000..28fe1f1 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target-build.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Script to cross-compile "debie1" for the MPC5554 with the +# CodeSourcery "G++ lite" GCC package. +# +# Any command-line arguments go into the CCOPT (eg. -Wpadded). +# As default, the trace output from the harness and target +# modules are disabled. +# +# One has to set the path to the compiler (i.e. CC) accordingly. + + +# Set tpd to the Test Program Directory: +tpd=../.. + +# Set hnd to the "harness" directory: +hnd=${tpd}/harness + +# Target gcc and options: +export CC="/local/swegener/CodeSourcery/Sourcery_G++_Lite/bin/powerpc-eabi-gcc" +export CCOPT="-te500v1 -fshort-double -g -O2 -I. -I${hnd} -Wall -Wextra $*" +export LD="/local/swegener/CodeSourcery/Sourcery_G++_Lite/bin/powerpc-eabi-gcc" +export LDOPT="-te500v1 -fshort-double -Wl,-T./linker-mpc55xx-gcc.ld -static" + +${CC} ${CCOPT} -c ${tpd}/class.c +${CC} ${CCOPT} -c ${tpd}/classtab.c +${CC} ${CCOPT} -c ${tpd}/debie.c +${CC} ${CCOPT} -c -I${tpd} ${hnd}/harness.c +${CC} ${CCOPT} -c ${tpd}/health.c +${CC} ${CCOPT} -c ${tpd}/hw_if.c +${CC} ${CCOPT} -c ${tpd}/measure.c +${CC} ${CCOPT} -c -I${tpd} target.c +${CC} ${CCOPT} -c ${tpd}/tc_hand.c +${CC} ${CCOPT} -c ${tpd}/telem.c + + +${CC} ${LDOPT} \ + -o debie1.elf \ + class.o \ + classtab.o \ + debie.o \ + harness.o \ + health.o \ + hw_if.o \ + measure.o \ + target.o \ + tc_hand.o \ + telem.o + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target.c new file mode 100644 index 0000000..2aeef42 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target.c @@ -0,0 +1,84 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the mpc5554/gcc target. + + Options: if the preprocessor symbol TRACE_TARGET is defined, + these operations generate trace message on stdout. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#if defined(TRACE_TARGET) +#include +#endif + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +static char data_memory[ 65536 ] __attribute__( ( section( ".externalram" ) ) ); +/* Simulated 80C32 external data RAM. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return &data_memory[ address ]; +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + #if defined(TRACE_TARGET) + printf ( "Set_Data_Byte 0x%x to %d = 0x%x\n", addr, value, value ); + #endif + data_memory[ addr ] = value; +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + unsigned char value = data_memory[ addr ]; + #if defined(TRACE_TARGET) + printf ( "Get_Data_Byte 0x%x is %d = 0x%x\n", addr, value, value ); + #endif + return value; +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + #if defined(TRACE_TARGET) + /* printf ("Get_Code_Byte 0x%x\n", addr); */ + /* This would be to much output. Skip. */ + #endif + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target_tm_data.h new file mode 100644 index 0000000..7f52819 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/mpc5554/target_tm_data.h @@ -0,0 +1,31 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + This version for the target mpc5554/gcc. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/keyword.h new file mode 100644 index 0000000..2d1fb42 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to GNU GCC on host Intel/Linux. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for GCC on 32-bit Intel/Linux, where + the widths of the integer types are the following: + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler accepts unaliged multi-octet data, although + access is slower. However, we still access possibly misaligned + telemetry data using memcpy() instead of direct assignment, + just to test that this approach works. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint32_t data_address_t; +/* An address into external data memory. */ + +typedef uint32_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *dest, void *src, int size ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/problems.h new file mode 100644 index 0000000..e11a596 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for intel/linux + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/03/28 08:22:17 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marked to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target.c new file mode 100644 index 0000000..739e876 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0xc0000000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1796/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/keyword.h new file mode 100644 index 0000000..2d1fb42 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/keyword.h @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to GNU GCC on host Intel/Linux. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for GCC on 32-bit Intel/Linux, where + the widths of the integer types are the following: + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler accepts unaliged multi-octet data, although + access is slower. However, we still access possibly misaligned + telemetry data using memcpy() instead of direct assignment, + just to test that this approach works. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint32_t data_address_t; +/* An address into external data memory. */ + +typedef uint32_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *dest, void *src, int size ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + + +#define TARGET_INIT +#define TARGET_MARK +#define TARGET_REBOOT +#define TARGET_START_TEST +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/problems.h new file mode 100644 index 0000000..e11a596 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/problems.h @@ -0,0 +1,23 @@ +/* + problems.h for intel/linux + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/03/28 08:22:17 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#define FOR_PROBLEM(P) +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ + +#define END_PROBLEM +/* A marked to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target.c new file mode 100644 index 0000000..0f0723d --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target.c @@ -0,0 +1,67 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the iF-DEV-LPC kit and the LPC2138 processor. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +#define DATA_MEM_BASE 0xd0006000L +/* The SRAM starts at this address. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return ( unsigned char * )( DATA_MEM_BASE + ( uint32_t )address ); +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + /* *(Data_Pointer (addr)) = value; */ + /* Safer to do nothing. */ +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + return *( Data_Pointer ( addr ) ); +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/wcc_memcpy.c new file mode 100644 index 0000000..4945e51 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/tc1797/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 1 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/build.sh b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/build.sh new file mode 100755 index 0000000..c862a03 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/build.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Script to compile debie1 on the host Intel/Linux system. +# +# Any arguments go into the CCOPT (eg. -Wpadded). + + +# Set tpd to the Test Program Directory: +tpd=../.. + +# Set hnd to the "harness" directory: + +hnd=${tpd}/harness + +# Native gcc and options: + +export CC="gcc" +export CCOPT="-g -O2 -I. -I${hnd} -Wall $*" +export LD="gcc" +export LDOPT= + +${CC} ${CCOPT} -c ${tpd}/class.c +${CC} ${CCOPT} -c ${tpd}/classtab.c +${CC} ${CCOPT} -c ${tpd}/debie.c +${CC} ${CCOPT} -c -I${tpd} ${hnd}/harness.c -DTRACE_HARNESS +${CC} ${CCOPT} -c ${tpd}/health.c +${CC} ${CCOPT} -c ${tpd}/hw_if.c +${CC} ${CCOPT} -c ${tpd}/measure.c +${CC} ${CCOPT} -c -I${tpd} target.c -DTRACE_TARGET +${CC} ${CCOPT} -c ${tpd}/tc_hand.c +${CC} ${CCOPT} -c ${tpd}/telem.c +${CC} ${CCOPT} -c wcc_memcpy.c + + +${CC} ${LDOPT} \ + -o debie1 \ + class.o \ + classtab.o \ + debie.o \ + harness.o \ + health.o \ + hw_if.o \ + measure.o \ + target.o \ + tc_hand.o \ + telem.o \ + wcc_memcpy.o + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/keyword.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/keyword.h new file mode 100644 index 0000000..807ea83 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/keyword.h @@ -0,0 +1,166 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : keyword.h + + Macro definitions for Keil specific keywords to be used + in portable parts of the DEBIE DPU software. + + This version adapted to GNU GCC on host Intel/Linux. + + Based on the SSF DHI file keyword.h, revision 1.9, Tue Mar 09 12:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef KEYWORD_H +#define KEYWORD_H + + +/* Integer type definitions for native types that can hold integer + values of at least a given number of bits. These types are used + as loop counters to give the most natural and speedy code for + the current target. This is Not the C99 stdint.h, but the types + have similar names. + + There is a particular form of this file for each (kind of) target + processor. The present form is for GCC on 32-bit Intel/Linux, where + the widths of the integer types are the following: + + Type Octets Bits + char 1 8 + short 2 16 + int 4 32 + long 4 32 + + This processor/compiler accepts unaliged multi-octet data, although + access is slower. However, we still access possibly misaligned + telemetry data using memcpy() instead of direct assignment, + just to test that this approach works. + +*/ + +/* General types */ + +typedef int int_least8_t; +/* A signed integer covering at least -128 .. +127. */ + +typedef unsigned int uint_least8_t; +/* An unsigned integer covering at least 0 .. 255. */ + +typedef unsigned short uint16_t; +/* An unsigned 16-bit integer. */ + +typedef int int_least16_t; +/* A signed integer covering at least -2**15 .. +2**15 - 1. */ + +typedef unsigned int uint_least16_t; +/* An unsigned integer covering at least 0 .. 2**16 - 1. */ + +typedef uint16_t uskew16_t; +/* A 16-bit type, perhaps not an integer, perhaps not 16-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + +typedef unsigned int uint32_t; +/* An unsigned 32-bit integer. */ + +typedef uint32_t uskew32_t; +/* A 32-bit type, perhaps not an integer, perhaps not 32-bit aligned. */ +/* If it is an integer type, it is unsigned. */ + + +/* DEBIE-specific types */ + +typedef uint16_t data_address_t; +/* An address into external data memory. */ + +typedef uint16_t code_address_t; +/* An address into code memory. */ + + +/* Macros for accessing the DPU data memory by numeric address. */ + +extern unsigned char *Data_Pointer ( uint16_t address ); + +#define DATA_POINTER(ADDR) Data_Pointer (ADDR) + +/* Macros for accessing and copying multi-octet data. */ +/* These may need target-specific adjustment if there are */ +/* alignment restrictions on multi-octet integer values, */ +/* because the operands in these macros may not be aligned */ +/* in the required way. */ + +extern void wcc_memcpy( void *, void *, int ); + +#define COPY(DEST,SOURCE) wcc_memcpy (&(DEST), &(SOURCE), sizeof(DEST)) +/* Copies the value of SOURCE to the location DEST. */ + +extern unsigned short Short_Value ( uskew16_t *x ); + +#define VALUE_OF(SOURCE) Short_Value (&(SOURCE)) +/* Returns the (integer) value of SOURCE, type uskew16_t. */ + +/* Macros for struct (aggregate) assignment. Some compilers */ +/* may not support assignment statements for such types. */ + +#define STRUCT_ASSIGN(DEST,SOURCE,TYPE) DEST = SOURCE + +/* Macros for calling "patch" functions */ + +typedef code_address_t fptr_t; +/* A function that is to be called after patching code memory. */ +/* The function may or may not be part of the patched code. */ +/* In the real SW this is "typedef void (*fptr_t)(void);" */ + +extern void Call_Patch ( fptr_t func ); +/* "Call" the patch func. */ + +#define CALL_PATCH(FUNCTION) Call_Patch (FUNCTION) +/* Jump to the patched memory. */ + +/* Some macros for task and interrupt management */ + +#define TASK(TASK_NUMBER) +#define PRIORITY(LEVEL) +#define INTERRUPT(SOURCE) +#define USED_REG_BANK(BANK) + +/* Macro for declaring re-entrant function */ + +#define REENTRANT_FUNC + +/* Memory model handling macros */ + +#define COMPACT_DATA +#define COMPACT + +#define PROGRAM + +#define EXTERNAL +#define DIRECT_INTERNAL +#define INDIRECT_INTERNAL + +#define LOCATION(ADDRESS) + +/* Dealing with the benchmark target system */ + +#include + +#define TARGET_INIT printf ("Target Init.\n") +#define TARGET_MARK printf ("Target Mark.\n") +#define TARGET_REBOOT printf ("Target Reboot.\n") +#define TARGET_START_TEST printf ("Target Start Test.\n") +#define TARGET_REPEAT_TEST 0 + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/problems.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/problems.h new file mode 100644 index 0000000..53fc2bf --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/problems.h @@ -0,0 +1,27 @@ +/* + problems.h for intel/linux + + Part of the DEBIE-1 benchmark. + + $Id: problems.h,v 1.1 2008/03/28 08:22:17 niklas Exp $ +*/ + + +#ifndef PROBLEMS_H +#define PROBLEMS_H + +#include "rpt_ipoint.h" + +#define FOR_PROBLEM(P) { RPT_Ipoint(3); RPT_Ipoint(P); } +/* A marker to indicate that the program is about to execute */ +/* a test case that is to be included in the analysis problem */ +/* identified by P. */ +/* For RapiTime, ipoint 3 shall be defined as an "escape", and */ +/* the associated info (P) shall be used to "demux" the trace. */ + +#define END_PROBLEM { RPT_Ipoint(3); RPT_Ipoint(0); } +/* A marked to indicate the end of a test case that is to be */ +/* included in the analysis problem identified by the last */ +/* executed FOR_PROBLEM. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/probs.txt b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/probs.txt new file mode 100644 index 0000000..2c3ee39 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/probs.txt @@ -0,0 +1,60396 @@ +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 42 +RPT_Ipoint 10 +RPT_Ipoint 43 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 10 +RPT_Ipoint 44 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 23 +RPT_Ipoint 10 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 62 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 63 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 64 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 65 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 22 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 23 +RPT_Ipoint 41 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 32 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 33 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 51 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 52 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 21 +RPT_Ipoint 31 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 21 +RPT_Ipoint 23 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 61 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 31 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 +RPT_Ipoint 10 +RPT_Ipoint 41 diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/rpt_ipoint.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/rpt_ipoint.h new file mode 100644 index 0000000..d34092e --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/rpt_ipoint.h @@ -0,0 +1,18 @@ +/* + rpt_ipoint.h for intel/linux + + Part of the DEBIE-1 benchmark. + + $Id: rpt_ipoint.h,v 1.1 2008/03/28 08:22:18 niklas Exp $ +*/ + + +#ifndef RPT_IPOINT_H +#define RPT_IPOINT_H + +#include + +//#define RPT_Ipoint(N) printf ("RPT_Ipoint %d\n", N) +#define RPT_Ipoint(N) + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target.c new file mode 100644 index 0000000..9030282 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target.c @@ -0,0 +1,84 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : target.c + + Target-specific implementations of the DNI operations, specifically + for the intel/linux target. + + Options: if the preprocessor symbol TRACE_TARGET is defined, + these operations generate trace message on stdout. + + Based, with extensive changes, on parts of the SSF file rtx_if.c, + rev 1.13, Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains one set of operations, as follows: + + > memory operations: dpu_ctrl.h + +*/ + + +#if defined(TRACE_TARGET) +#include +#endif + +#include "keyword.h" + + +/* Memory operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +static char data_memory[ 65536 ]; +/* Simulated 80C32 external data RAM. */ + + +unsigned char *Data_Pointer ( uint16_t address ) +{ + return &data_memory[ address ]; +} + + +void Set_Data_Byte ( data_address_t addr, unsigned char value ) +{ + #if defined(TRACE_TARGET) + printf ( "Set_Data_Byte 0x%x to %d = 0x%x\n", addr, value, value ); + #endif + data_memory[ addr ] = value; +} + + +unsigned char Get_Data_Byte ( data_address_t addr ) +{ + unsigned char value = data_memory[ addr ]; + #if defined(TRACE_TARGET) + printf ( "Get_Data_Byte 0x%x is %d = 0x%x\n", addr, value, value ); + #endif + return value; +} + + +unsigned char Get_Code_Byte ( code_address_t addr ) +{ + #if defined(TRACE_TARGET) + /* printf ("Get_Code_Byte 0x%x\n", addr); */ + /* This would be to much output. Skip. */ + #endif + return 0; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target_tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target_tm_data.h new file mode 100644 index 0000000..5d7e53f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/target_tm_data.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_tm_data.h + + The target-specific aspects of the Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_TM_DATA_H +#define TARGET_TM_DATA_H + +#define MAX_EVENTS 1261 +/* Same as in the original DEBIE-1 SW, although there limited + by the size of the data memory. +*/ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/wcc_memcpy.c b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/wcc_memcpy.c new file mode 100644 index 0000000..05db2a7 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/arch/x86/wcc_memcpy.c @@ -0,0 +1,10 @@ +#include "keyword.h" + +void wcc_memcpy( void *dest, void *src, int size ) +{ + int i; + _Pragma( "loopbound min 2 max 4" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + return; +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/class.c b/targets/wasm-tacle/parallel/DEBIE/code/class.c new file mode 100644 index 0000000..bd29a9b --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/class.c @@ -0,0 +1,308 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : class.c + + Event-classification module. + + Based on the SSF file class.c, rev 1.10, Tue Jun 01 12:34:56 1999. + + - * -------------------------------------------------------------------------- +*/ + +#include "keyword.h" +#include "class.h" +#include "classtab.h" +#include "su_ctrl.h" +#include "measure.h" +#define MAX_QUALITY 255 + +unsigned char RoughLogarithm ( unsigned int x ) +/* An integer approximation (0..16) of the base-2 log of x */ +/* computed as the number of the most-significant non-zero bit. */ +/* When x = 0, returns zero. */ +/* When x > 0, returns floor(log2(x) + 1). */ +/* For example, when x = 1, returns 1. */ +/* when x = 2, returns 2. */ +/* when x = 7, returns 3. */ +/* when x = x7FFF, returns 15. */ +/* when x = x8000, returns 16. */ +{ + unsigned char INDIRECT_INTERNAL greatest_non_zero_bit; + unsigned int INDIRECT_INTERNAL shifted; + + greatest_non_zero_bit = 0; + shifted = x; + + _Pragma( "loopbound min 15 max 15" ) + while ( shifted ) { + greatest_non_zero_bit++; + shifted >>= 1; + } + + return greatest_non_zero_bit; +} + + +float GetQualityTerm( unsigned char coeff, unsigned int amplitude ) +/* Purpose : Calculates the ampltude term of the quality formula. */ +/* Interface : inputs - parameter coeff defines number of the */ +/* quality coefficient. */ +/* - parameter amplitude defines the signal */ +/* amplitude. */ +/* outputs - quality term value is retruned. */ +/* subroutines - RoughLogarithm. */ +/* Preconditions : quality coefficients have valid values. */ +/* Postconditions : none. */ +/* Algorithm : quality term is calculated according to following */ +/* formula : */ +/* coefficient[ coeff ] */ +/* * RoughLogaritm(amplitude) */ +/* / AMPLTUDE_DIVIDER */ +/* where coefficient[ coeff ] is the amplitude coefficient of */ +/* the quality term and AMPLTUDE_DIVIDER is a scaling */ +/* factor whose purpose is scale the result below 5.0. */ +/* However if the result would become larger than that, */ +/* 5.0 is returned. */ + +{ + float EXTERNAL quality; + + quality = + ( float )( telemetry_data.coefficient[ coeff ] + * RoughLogarithm( amplitude ) ) + / AMPLITUDE_DIVIDER; + + if ( quality > 5.0 ) + quality = 5.0; + + return quality; +} + + +void CalculateQualityNumber( event_record_t EXTERNAL *new_event ) +/* Purpose : Calculates the quality number of a particle hit event */ +/* and stores in the event record. */ +/* Interface : inputs - event record pointed by the parameter. */ +/* outputs - event record pointed by the parameter. */ +/* subroutines - GetQualityTerm. */ +/* Preconditions : All components of the event record pointed by the */ +/* parameter which are used as input have valid values. */ +/* Postconditions : quality_number component of the event record pointed */ +/* by the parameter has is calculated. */ +/* Algorithm : quality_number is calculated according to the following */ +/* formula : */ +/* 25 * Class + Ai*RoughLogarithm(Si) / Divider , where */ +/* Class is the class of the event, */ +/* Ai is the amplitude coefficient of the quality */ +/* formula */ +/* Si is a signal amplitude from the Sensor Unit Peak */ +/* detector */ +/* Divider is scaling factor whose value is determined by */ +/* the maximum value (5) of the latter terms */ +/* and i goes from 1 to 5. */ + +{ + float INDIRECT_INTERNAL quality; + + quality = 25.0 * new_event -> classification; + /* First term of the quality formula. */ + + quality += GetQualityTerm( 0, VALUE_OF ( new_event -> plasma_1_plus ) ); + /* Add amplitude term for i=1 (see function algorithm). */ + + quality += GetQualityTerm( 1, VALUE_OF ( new_event -> plasma_1_minus ) ); + /* Add amplitude term for i=2 (see function algorithm). */ + + quality += GetQualityTerm( 2, VALUE_OF ( new_event -> piezo_1 ) ); + /* Add amplitude term for i=3 (see function algorithm). */ + + quality += GetQualityTerm( 3, VALUE_OF ( new_event -> piezo_2 ) ); + /* Add amplitude term for i=4 (see function algorithm). */ + + quality += GetQualityTerm( 4, VALUE_OF ( new_event -> plasma_2_plus ) ); + /* Add amplitude term for i=5 (see function algorithm). */ + + new_event -> quality_number = ( unsigned char ) ( quality + 0.5 ); + /* Store quality number to the event record */ +} + + +void ClassifyEvent( event_record_t EXTERNAL *new_event ) +/* Purpose : Classifies a particle hit event and stores result */ +/* to the event record pointed by the parameter. */ +/* Interface : inputs - event record pointed by the parameter. */ +/* outputs - event record pointed by the parameter. */ +/* subroutines - CalculateQualityNumber. */ +/* Preconditions : All components of the event record pointed by the */ +/* parameter which are used as input have valid values. */ +/* Postconditions : classification and quality_number components of the */ +/* event record pointed by the parameter are computed. */ +/* Algorithm : - class index is determined by comparing signal. */ +/* amplitudes and time delays to classification */ +/* thresholds. */ +/* - class number is read from a look-up table using the */ +/* class index and stored in the event record. */ +/* - CalculateQualityNumber is called. */ + +{ + unsigned char INDIRECT_INTERNAL class_index; + /* Index for the class look-up table. */ + + SU_settings_t EXTERNAL *INDIRECT_INTERNAL limits; + /* Pointer to the struct holding classification thresholds. */ + + class_index = 0; + /* Bits will be set below according to event attributes. */ + + switch ( new_event -> SU_number ) + /* Select proper classification thresholds. */ + { + case SU_1: + limits = &telemetry_data.sensor_unit_1; + break; + + case SU_2: + limits = &telemetry_data.sensor_unit_2; + break; + + case SU_3: + limits = &telemetry_data.sensor_unit_3; + break; + + case SU_4: + limits = &telemetry_data.sensor_unit_4; + break; + } + + if ( VALUE_OF ( new_event -> plasma_1_plus ) >= + ( ( limits -> plasma_1_plus_classification ) * 256 ) ) { + class_index |= PLASMA_1_PLUS_CLASS; + /* Set classification index bit for Plasma1+ peak amplitude. */ + } + + if ( VALUE_OF ( new_event -> plasma_1_minus ) >= + ( ( limits -> plasma_1_minus_classification ) * 256 ) ) { + class_index |= PLASMA_1_MINUS_CLASS; + /* Set classification index bit for Plasma1- peak amplitude. */ + } + + if ( VALUE_OF ( new_event -> piezo_1 ) >= + ( ( limits -> piezo_1_classification ) * 256 ) ) { + class_index |= PIEZO_1_CLASS; + /* Set classification index bit for Piezo1 peak amplitude. */ + } + + if ( VALUE_OF ( new_event -> piezo_2 ) >= + ( ( limits -> piezo_2_classification ) * 256 ) ) { + class_index |= PIEZO_2_CLASS; + /* Set classification index bit for Piezo2 peak amplitude. */ + } + + if ( VALUE_OF ( new_event -> plasma_2_plus ) >= + ( ( limits -> plasma_2_plus_classification ) * 256 ) ) { + class_index |= PLASMA_2_PLUS_CLASS; + /* Set classification index bit for Plasma2+ peak amplitude. */ + } + + if ( VALUE_OF ( new_event -> delay_2 ) >= + ( ( limits -> plasma_1_plus_to_piezo_min_time ) * 16 ) && + VALUE_OF ( new_event -> delay_2 ) <= + ( ( limits -> plasma_1_plus_to_piezo_max_time ) * 16 ) ) { + class_index |= PLASMA_1_PLUS_TO_PIEZO_CLASS; + /* Set classification index bit for Plasma1+ to Piezo delay. */ + } + + if ( VALUE_OF ( new_event -> delay_3 ) >= + ( ( limits -> plasma_1_minus_to_piezo_min_time ) * 16 ) && + VALUE_OF ( new_event -> delay_3 ) <= + ( ( limits -> plasma_1_minus_to_piezo_max_time ) * 16 ) ) { + class_index |= PLASMA_1_MINUS_TO_PIEZO_CLASS; + /* Set classification index bit for Plasma1- to Piezo delay. */ + } + + if ( new_event -> delay_1 <= + limits -> plasma_1_plus_to_minus_max_time ) { + class_index |= PLASMA_1_PLUS_TO_MINUS_CLASS; + /* Set classification index bit for Plasma1+ to Plasma1- delay. */ + } + + new_event -> classification = event_class[ class_index ]; + /* Store classification number to the event record */ + + if ( SU_state[ new_event->SU_number - SU_1 ] == self_test_e ) + new_event -> quality_number = MAX_QUALITY; + + else + CalculateQualityNumber( new_event ); + +} + +void InitClassification( void ) +/* Purpose : Initializes classication coefficients and levels. */ +/* Interface : inputs - none. */ +/* outputs - quality coefficients in telemetry_data. */ +/* - classification levels in telemetry_data. */ +/* - threshold levels in telemetry_data. */ +/* - min time window in telemetry_data */ +/* - max time window in telemetry_data */ +/* subroutines - Init_SU_Settings */ +/* Preconditions : none. */ +/* Postconditions : outputs have their default values. */ +/* Algorithm : see below */ + +{ + uint_least8_t EXTERNAL i; + /* Loop variable. */ + + _Pragma( "loopbound min 5 max 5" ) + for ( i = 0; i < NUM_QCOEFF; i++ ) + telemetry_data.coefficient[ i ] = DEFAULT_COEFF; + + Init_SU_Settings ( &telemetry_data.sensor_unit_1 ); + Init_SU_Settings ( &telemetry_data.sensor_unit_2 ); + Init_SU_Settings ( &telemetry_data.sensor_unit_3 ); + Init_SU_Settings ( &telemetry_data.sensor_unit_4 ); + /* Default values for thresholds, classification levels and min/max times */ + /* related to classification are set here. */ + +} + +void Init_SU_Settings ( SU_settings_t EXTERNAL *set ) +/* Purpose : Initializes classication parameters */ +/* Interface : inputs - none. */ +/* outputs - classification levels in telemetry_data. */ +/* - threshold levels in telemetry_data. */ +/* - min time window in telemetry_data */ +/* - max time window in telemetry_data */ +/* subroutines - none */ +/* Preconditions : none. */ +/* Postconditions : outputs have their default values. */ +/* Algorithm : Sets default values to telemetry_data. */ +{ + set -> plasma_1_plus_threshold = DEFAULT_THRESHOLD; + set -> plasma_1_minus_threshold = DEFAULT_THRESHOLD; + set -> piezo_threshold = DEFAULT_THRESHOLD; + set -> plasma_1_plus_classification = DEFAULT_CLASSIFICATION_LEVEL; + set -> plasma_1_minus_classification = DEFAULT_CLASSIFICATION_LEVEL; + set -> piezo_1_classification = DEFAULT_CLASSIFICATION_LEVEL; + set -> piezo_2_classification = DEFAULT_CLASSIFICATION_LEVEL; + set -> plasma_2_plus_classification = DEFAULT_CLASSIFICATION_LEVEL; + set -> plasma_1_plus_to_minus_max_time = DEFAULT_MAX_TIME; + set -> plasma_1_plus_to_piezo_min_time = DEFAULT_MIN_TIME; + set -> plasma_1_plus_to_piezo_max_time = DEFAULT_MAX_TIME; + set -> plasma_1_minus_to_piezo_min_time = DEFAULT_MIN_TIME; + set -> plasma_1_minus_to_piezo_max_time = DEFAULT_MAX_TIME; +} + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/class.h b/targets/wasm-tacle/parallel/DEBIE/code/class.h new file mode 100644 index 0000000..478d34f --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/class.h @@ -0,0 +1,72 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : class.h + + Prototypes etc. for the event-classification module Class. + + Based on the SSF file class.h, rev 1.6, Fri Jun 04 14:47:38 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef CLASS_H +#define CLASS_H + +#include "keyword.h" +#include "tm_data.h" + +#define MAX_AMPLITUDE_TERM 5 +/* Maximum value for an amplitude term in the quality formula. */ +/* Valid range: 1 - 255. */ + +#define DEFAULT_COEFF 5 +/* Default value for classification coefficient */ +/* adjustable with telecommands. Gives maximum allowed */ +/* (5) amplitude term with maximum amplitude with this */ +/* formula. If amplitudes are going to be smaller, the */ +/* amplitude can be amplified by setting greater value */ +/* to the quality coefficient. Minimum amplification is */ +/* 1/5 and maximum 50. */ +/* Valid range 1 - 255. */ + +#define AMPLITUDE_DIVIDER ((DEFAULT_COEFF * 16.0) / MAX_AMPLITUDE_TERM) +/* Divider for an amplitude term in the quality formula. */ +/* 16 = maxumum value for the rough 2 based logarithm of the */ +/* signal amplitude in the quality formula. */ + +#define PLASMA_1_PLUS_CLASS 0x80 +#define PLASMA_1_MINUS_CLASS 0x40 +#define PLASMA_2_PLUS_CLASS 0x08 +#define PIEZO_1_CLASS 0x20 +#define PIEZO_2_CLASS 0x10 +/* Classification index mask values for signal amplitudes */ +/* above the classification levels. */ + +#define PLASMA_1_PLUS_TO_PIEZO_CLASS 0x02 +#define PLASMA_1_MINUS_TO_PIEZO_CLASS 0x01 +#define PLASMA_1_PLUS_TO_MINUS_CLASS 0x04 +/* Classification index mask values for delays inside the */ +/* time windows. */ + +extern void InitClassification( void ); +/* Inits classification thresholds and coefficients. */ + +extern void ClassifyEvent( event_record_t EXTERNAL *new_event ); +/* Classifies event and calculates the quality number. */ + +extern void Init_SU_Settings ( SU_settings_t EXTERNAL *set ); +/* Sets the default values for classification parameters. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/classtab.c b/targets/wasm-tacle/parallel/DEBIE/code/classtab.c new file mode 100644 index 0000000..4709b75 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/classtab.c @@ -0,0 +1,283 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : classtab.c + + Table for classifying event according to multiple measurements. + + Based on the SSF file classtab.c, rev 1.2, Thu Feb 18 15:12:22 1999. + + - * -------------------------------------------------------------------------- +*/ + +#include "keyword.h" + +unsigned char EXTERNAL event_class[ 256 ] = { + /* Que Qui P1 P2 Qle dTei dTep dTip */ + 0, /* 0 0 0 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 0 0 0 OUTSIDE OUTSIDE INSIDE */ + 0, /* 0 0 0 0 0 OUTSIDE INSIDE OUTSIDE */ + 0, /* 0 0 0 0 0 OUTSIDE INSIDE INSIDE */ + 0, /* 0 0 0 0 0 INSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 0 0 0 INSIDE OUTSIDE INSIDE */ + 0, /* 0 0 0 0 0 INSIDE INSIDE OUTSIDE */ + 0, /* 0 0 0 0 0 INSIDE INSIDE INSIDE */ + 0, /* 0 0 0 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 0 0 1 OUTSIDE OUTSIDE INSIDE */ + 0, /* 0 0 0 0 1 OUTSIDE INSIDE OUTSIDE */ + 0, /* 0 0 0 0 1 OUTSIDE INSIDE INSIDE */ + 0, /* 0 0 0 0 1 INSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 0 0 1 INSIDE OUTSIDE INSIDE */ + 0, /* 0 0 0 0 1 INSIDE INSIDE OUTSIDE */ + 0, /* 0 0 0 0 1 INSIDE INSIDE INSIDE */ + 0, /* 0 0 0 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 0 1 0 OUTSIDE OUTSIDE INSIDE */ + 0, /* 0 0 0 1 0 OUTSIDE INSIDE OUTSIDE */ + 0, /* 0 0 0 1 0 OUTSIDE INSIDE INSIDE */ + 0, /* 0 0 0 1 0 INSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 0 1 0 INSIDE OUTSIDE INSIDE */ + 0, /* 0 0 0 1 0 INSIDE INSIDE OUTSIDE */ + 0, /* 0 0 0 1 0 INSIDE INSIDE INSIDE */ + 3, /* 0 0 0 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 0 0 0 1 1 OUTSIDE OUTSIDE INSIDE */ + 3, /* 0 0 0 1 1 OUTSIDE INSIDE OUTSIDE */ + 3, /* 0 0 0 1 1 OUTSIDE INSIDE INSIDE */ + 3, /* 0 0 0 1 1 INSIDE OUTSIDE OUTSIDE */ + 3, /* 0 0 0 1 1 INSIDE OUTSIDE INSIDE */ + 3, /* 0 0 0 1 1 INSIDE INSIDE OUTSIDE */ + 3, /* 0 0 0 1 1 INSIDE INSIDE INSIDE */ + 0, /* 0 0 1 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 1 0 0 OUTSIDE OUTSIDE INSIDE */ + 0, /* 0 0 1 0 0 OUTSIDE INSIDE OUTSIDE */ + 0, /* 0 0 1 0 0 OUTSIDE INSIDE INSIDE */ + 0, /* 0 0 1 0 0 INSIDE OUTSIDE OUTSIDE */ + 0, /* 0 0 1 0 0 INSIDE OUTSIDE INSIDE */ + 0, /* 0 0 1 0 0 INSIDE INSIDE OUTSIDE */ + 0, /* 0 0 1 0 0 INSIDE INSIDE INSIDE */ + 3, /* 0 0 1 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 0 0 1 0 1 OUTSIDE OUTSIDE INSIDE */ + 3, /* 0 0 1 0 1 OUTSIDE INSIDE OUTSIDE */ + 3, /* 0 0 1 0 1 OUTSIDE INSIDE INSIDE */ + 3, /* 0 0 1 0 1 INSIDE OUTSIDE OUTSIDE */ + 3, /* 0 0 1 0 1 INSIDE OUTSIDE INSIDE */ + 3, /* 0 0 1 0 1 INSIDE INSIDE OUTSIDE */ + 3, /* 0 0 1 0 1 INSIDE INSIDE INSIDE */ + 5, /* 0 0 1 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 5, /* 0 0 1 1 0 OUTSIDE OUTSIDE INSIDE */ + 5, /* 0 0 1 1 0 OUTSIDE INSIDE OUTSIDE */ + 5, /* 0 0 1 1 0 OUTSIDE INSIDE INSIDE */ + 5, /* 0 0 1 1 0 INSIDE OUTSIDE OUTSIDE */ + 5, /* 0 0 1 1 0 INSIDE OUTSIDE INSIDE */ + 5, /* 0 0 1 1 0 INSIDE INSIDE OUTSIDE */ + 5, /* 0 0 1 1 0 INSIDE INSIDE INSIDE */ + 8, /* 0 0 1 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 8, /* 0 0 1 1 1 OUTSIDE OUTSIDE INSIDE */ + 8, /* 0 0 1 1 1 OUTSIDE INSIDE OUTSIDE */ + 8, /* 0 0 1 1 1 OUTSIDE INSIDE INSIDE */ + 8, /* 0 0 1 1 1 INSIDE OUTSIDE OUTSIDE */ + 8, /* 0 0 1 1 1 INSIDE OUTSIDE INSIDE */ + 8, /* 0 0 1 1 1 INSIDE INSIDE OUTSIDE */ + 8, /* 0 0 1 1 1 INSIDE INSIDE INSIDE */ + 0, /* 0 1 0 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 0, /* 0 1 0 0 0 OUTSIDE OUTSIDE INSIDE */ + 0, /* 0 1 0 0 0 OUTSIDE INSIDE OUTSIDE */ + 0, /* 0 1 0 0 0 OUTSIDE INSIDE INSIDE */ + 0, /* 0 1 0 0 0 INSIDE OUTSIDE OUTSIDE */ + 0, /* 0 1 0 0 0 INSIDE OUTSIDE INSIDE */ + 0, /* 0 1 0 0 0 INSIDE INSIDE OUTSIDE */ + 0, /* 0 1 0 0 0 INSIDE INSIDE INSIDE */ + 3, /* 0 1 0 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 0 1 0 0 1 OUTSIDE OUTSIDE INSIDE */ + 3, /* 0 1 0 0 1 OUTSIDE INSIDE OUTSIDE */ + 3, /* 0 1 0 0 1 OUTSIDE INSIDE INSIDE */ + 3, /* 0 1 0 0 1 INSIDE OUTSIDE OUTSIDE */ + 3, /* 0 1 0 0 1 INSIDE OUTSIDE INSIDE */ + 3, /* 0 1 0 0 1 INSIDE INSIDE OUTSIDE */ + 3, /* 0 1 0 0 1 INSIDE INSIDE INSIDE */ + 1, /* 0 1 0 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 0 1 0 1 0 OUTSIDE OUTSIDE INSIDE */ + 1, /* 0 1 0 1 0 OUTSIDE INSIDE OUTSIDE */ + 3, /* 0 1 0 1 0 OUTSIDE INSIDE INSIDE */ + 1, /* 0 1 0 1 0 INSIDE OUTSIDE OUTSIDE */ + 3, /* 0 1 0 1 0 INSIDE OUTSIDE INSIDE */ + 1, /* 0 1 0 1 0 INSIDE INSIDE OUTSIDE */ + 3, /* 0 1 0 1 0 INSIDE INSIDE INSIDE */ + 1, /* 0 1 0 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 4, /* 0 1 0 1 1 OUTSIDE OUTSIDE INSIDE */ + 1, /* 0 1 0 1 1 OUTSIDE INSIDE OUTSIDE */ + 4, /* 0 1 0 1 1 OUTSIDE INSIDE INSIDE */ + 1, /* 0 1 0 1 1 INSIDE OUTSIDE OUTSIDE */ + 4, /* 0 1 0 1 1 INSIDE OUTSIDE INSIDE */ + 1, /* 0 1 0 1 1 INSIDE INSIDE OUTSIDE */ + 4, /* 0 1 0 1 1 INSIDE INSIDE INSIDE */ + 1, /* 0 1 1 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 0 1 1 0 0 OUTSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 0 0 OUTSIDE INSIDE OUTSIDE */ + 3, /* 0 1 1 0 0 OUTSIDE INSIDE INSIDE */ + 1, /* 0 1 1 0 0 INSIDE OUTSIDE OUTSIDE */ + 3, /* 0 1 1 0 0 INSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 0 0 INSIDE INSIDE OUTSIDE */ + 3, /* 0 1 1 0 0 INSIDE INSIDE INSIDE */ + 1, /* 0 1 1 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 4, /* 0 1 1 0 1 OUTSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 0 1 OUTSIDE INSIDE OUTSIDE */ + 4, /* 0 1 1 0 1 OUTSIDE INSIDE INSIDE */ + 1, /* 0 1 1 0 1 INSIDE OUTSIDE OUTSIDE */ + 4, /* 0 1 1 0 1 INSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 0 1 INSIDE INSIDE OUTSIDE */ + 4, /* 0 1 1 0 1 INSIDE INSIDE INSIDE */ + 1, /* 0 1 1 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 5, /* 0 1 1 1 0 OUTSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 1 0 OUTSIDE INSIDE OUTSIDE */ + 5, /* 0 1 1 1 0 OUTSIDE INSIDE INSIDE */ + 1, /* 0 1 1 1 0 INSIDE OUTSIDE OUTSIDE */ + 5, /* 0 1 1 1 0 INSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 1 0 INSIDE INSIDE OUTSIDE */ + 5, /* 0 1 1 1 0 INSIDE INSIDE INSIDE */ + 1, /* 0 1 1 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 8, /* 0 1 1 1 1 OUTSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 1 1 OUTSIDE INSIDE OUTSIDE */ + 8, /* 0 1 1 1 1 OUTSIDE INSIDE INSIDE */ + 1, /* 0 1 1 1 1 INSIDE OUTSIDE OUTSIDE */ + 8, /* 0 1 1 1 1 INSIDE OUTSIDE INSIDE */ + 1, /* 0 1 1 1 1 INSIDE INSIDE OUTSIDE */ + 8, /* 0 1 1 1 1 INSIDE INSIDE INSIDE */ + 0, /* 1 0 0 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 0, /* 1 0 0 0 0 OUTSIDE OUTSIDE INSIDE */ + 0, /* 1 0 0 0 0 OUTSIDE INSIDE OUTSIDE */ + 0, /* 1 0 0 0 0 OUTSIDE INSIDE INSIDE */ + 0, /* 1 0 0 0 0 INSIDE OUTSIDE OUTSIDE */ + 0, /* 1 0 0 0 0 INSIDE OUTSIDE INSIDE */ + 0, /* 1 0 0 0 0 INSIDE INSIDE OUTSIDE */ + 0, /* 1 0 0 0 0 INSIDE INSIDE INSIDE */ + 3, /* 1 0 0 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 1 0 0 0 1 OUTSIDE OUTSIDE INSIDE */ + 3, /* 1 0 0 0 1 OUTSIDE INSIDE OUTSIDE */ + 3, /* 1 0 0 0 1 OUTSIDE INSIDE INSIDE */ + 3, /* 1 0 0 0 1 INSIDE OUTSIDE OUTSIDE */ + 3, /* 1 0 0 0 1 INSIDE OUTSIDE INSIDE */ + 3, /* 1 0 0 0 1 INSIDE INSIDE OUTSIDE */ + 3, /* 1 0 0 0 1 INSIDE INSIDE INSIDE */ + 1, /* 1 0 0 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 3, /* 1 0 0 1 0 OUTSIDE OUTSIDE INSIDE */ + 1, /* 1 0 0 1 0 OUTSIDE INSIDE OUTSIDE */ + 3, /* 1 0 0 1 0 OUTSIDE INSIDE INSIDE */ + 1, /* 1 0 0 1 0 INSIDE OUTSIDE OUTSIDE */ + 3, /* 1 0 0 1 0 INSIDE OUTSIDE INSIDE */ + 1, /* 1 0 0 1 0 INSIDE INSIDE OUTSIDE */ + 3, /* 1 0 0 1 0 INSIDE INSIDE INSIDE */ + 1, /* 1 0 0 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 0 1 1 OUTSIDE OUTSIDE INSIDE */ + 4, /* 1 0 0 1 1 OUTSIDE INSIDE OUTSIDE */ + 4, /* 1 0 0 1 1 OUTSIDE INSIDE INSIDE */ + 1, /* 1 0 0 1 1 INSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 0 1 1 INSIDE OUTSIDE INSIDE */ + 4, /* 1 0 0 1 1 INSIDE INSIDE OUTSIDE */ + 4, /* 1 0 0 1 1 INSIDE INSIDE INSIDE */ + 1, /* 1 0 1 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 0 0 OUTSIDE OUTSIDE INSIDE */ + 3, /* 1 0 1 0 0 OUTSIDE INSIDE OUTSIDE */ + 3, /* 1 0 1 0 0 OUTSIDE INSIDE INSIDE */ + 1, /* 1 0 1 0 0 INSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 0 0 INSIDE OUTSIDE INSIDE */ + 3, /* 1 0 1 0 0 INSIDE INSIDE OUTSIDE */ + 3, /* 1 0 1 0 0 INSIDE INSIDE INSIDE */ + 1, /* 1 0 1 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 0 1 OUTSIDE OUTSIDE INSIDE */ + 4, /* 1 0 1 0 1 OUTSIDE INSIDE OUTSIDE */ + 4, /* 1 0 1 0 1 OUTSIDE INSIDE INSIDE */ + 1, /* 1 0 1 0 1 INSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 0 1 INSIDE OUTSIDE INSIDE */ + 4, /* 1 0 1 0 1 INSIDE INSIDE OUTSIDE */ + 4, /* 1 0 1 0 1 INSIDE INSIDE INSIDE */ + 1, /* 1 0 1 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 1 0 OUTSIDE OUTSIDE INSIDE */ + 5, /* 1 0 1 1 0 OUTSIDE INSIDE OUTSIDE */ + 5, /* 1 0 1 1 0 OUTSIDE INSIDE INSIDE */ + 1, /* 1 0 1 1 0 INSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 1 0 INSIDE OUTSIDE INSIDE */ + 5, /* 1 0 1 1 0 INSIDE INSIDE OUTSIDE */ + 5, /* 1 0 1 1 0 INSIDE INSIDE INSIDE */ + 1, /* 1 0 1 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 1 1 OUTSIDE OUTSIDE INSIDE */ + 8, /* 1 0 1 1 1 OUTSIDE INSIDE OUTSIDE */ + 8, /* 1 0 1 1 1 OUTSIDE INSIDE INSIDE */ + 1, /* 1 0 1 1 1 INSIDE OUTSIDE OUTSIDE */ + 1, /* 1 0 1 1 1 INSIDE OUTSIDE INSIDE */ + 8, /* 1 0 1 1 1 INSIDE INSIDE OUTSIDE */ + 8, /* 1 0 1 1 1 INSIDE INSIDE INSIDE */ + 1, /* 1 1 0 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 1 0 0 0 OUTSIDE OUTSIDE INSIDE */ + 1, /* 1 1 0 0 0 OUTSIDE INSIDE OUTSIDE */ + 1, /* 1 1 0 0 0 OUTSIDE INSIDE INSIDE */ + 6, /* 1 1 0 0 0 INSIDE OUTSIDE OUTSIDE */ + 6, /* 1 1 0 0 0 INSIDE OUTSIDE INSIDE */ + 6, /* 1 1 0 0 0 INSIDE INSIDE OUTSIDE */ + 6, /* 1 1 0 0 0 INSIDE INSIDE INSIDE */ + 1, /* 1 1 0 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 1, /* 1 1 0 0 1 OUTSIDE OUTSIDE INSIDE */ + 1, /* 1 1 0 0 1 OUTSIDE INSIDE OUTSIDE */ + 1, /* 1 1 0 0 1 OUTSIDE INSIDE INSIDE */ + 7, /* 1 1 0 0 1 INSIDE OUTSIDE OUTSIDE */ + 7, /* 1 1 0 0 1 INSIDE OUTSIDE INSIDE */ + 7, /* 1 1 0 0 1 INSIDE INSIDE OUTSIDE */ + 7, /* 1 1 0 0 1 INSIDE INSIDE INSIDE */ + 2, /* 1 1 0 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 0 1 0 OUTSIDE OUTSIDE INSIDE */ + 2, /* 1 1 0 1 0 OUTSIDE INSIDE OUTSIDE */ + 2, /* 1 1 0 1 0 OUTSIDE INSIDE INSIDE */ + 2, /* 1 1 0 1 0 INSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 0 1 0 INSIDE OUTSIDE INSIDE */ + 2, /* 1 1 0 1 0 INSIDE INSIDE OUTSIDE */ + 7, /* 1 1 0 1 0 INSIDE INSIDE INSIDE */ + 2, /* 1 1 0 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 0 1 1 OUTSIDE OUTSIDE INSIDE */ + 2, /* 1 1 0 1 1 OUTSIDE INSIDE OUTSIDE */ + 2, /* 1 1 0 1 1 OUTSIDE INSIDE INSIDE */ + 2, /* 1 1 0 1 1 INSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 0 1 1 INSIDE OUTSIDE INSIDE */ + 2, /* 1 1 0 1 1 INSIDE INSIDE OUTSIDE */ + 9, /* 1 1 0 1 1 INSIDE INSIDE INSIDE */ + 2, /* 1 1 1 0 0 OUTSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 0 0 OUTSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 0 0 OUTSIDE INSIDE OUTSIDE */ + 2, /* 1 1 1 0 0 OUTSIDE INSIDE INSIDE */ + 2, /* 1 1 1 0 0 INSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 0 0 INSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 0 0 INSIDE INSIDE OUTSIDE */ + 7, /* 1 1 1 0 0 INSIDE INSIDE INSIDE */ + 2, /* 1 1 1 0 1 OUTSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 0 1 OUTSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 0 1 OUTSIDE INSIDE OUTSIDE */ + 2, /* 1 1 1 0 1 OUTSIDE INSIDE INSIDE */ + 2, /* 1 1 1 0 1 INSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 0 1 INSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 0 1 INSIDE INSIDE OUTSIDE */ + 9, /* 1 1 1 0 1 INSIDE INSIDE INSIDE */ + 2, /* 1 1 1 1 0 OUTSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 1 0 OUTSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 1 0 OUTSIDE INSIDE OUTSIDE */ + 2, /* 1 1 1 1 0 OUTSIDE INSIDE INSIDE */ + 2, /* 1 1 1 1 0 INSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 1 0 INSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 1 0 INSIDE INSIDE OUTSIDE */ + 7, /* 1 1 1 1 0 INSIDE INSIDE INSIDE */ + 2, /* 1 1 1 1 1 OUTSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 1 1 OUTSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 1 1 OUTSIDE INSIDE OUTSIDE */ + 2, /* 1 1 1 1 1 OUTSIDE INSIDE INSIDE */ + 2, /* 1 1 1 1 1 INSIDE OUTSIDE OUTSIDE */ + 2, /* 1 1 1 1 1 INSIDE OUTSIDE INSIDE */ + 2, /* 1 1 1 1 1 INSIDE INSIDE OUTSIDE */ + 9 /* 1 1 1 1 1 INSIDE INSIDE INSIDE */ +}; diff --git a/targets/wasm-tacle/parallel/DEBIE/code/classtab.h b/targets/wasm-tacle/parallel/DEBIE/code/classtab.h new file mode 100644 index 0000000..c7410af --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/classtab.h @@ -0,0 +1,32 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : classtab.h + + Prototypes etc. for the ClassTab (event classification table) module. + + Based on the SSF file classtab.h, rev 1.1, Mon Jan 18 11:53:20 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef CLASSTAB_H +#define CLASSTAB_H + +#include "keyword.h" + +extern unsigned char EXTERNAL event_class[ 256 ]; + +#endif + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/debie.c b/targets/wasm-tacle/parallel/DEBIE/code/debie.c new file mode 100644 index 0000000..18b0e81 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/debie.c @@ -0,0 +1,57 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : debie.c + + Main function. + + Based on the SSF file debie.c, revision 1.4, Tue Jun 01 13:37:20 1999. + + - * -------------------------------------------------------------------------- +*/ + +#include "reg52.h" +#include "kernobj.h" +#include "keyword.h" +#include "health.h" +#include "taskctrl.h" + + +int main( void ) +{ + TARGET_INIT; + /* Initialize the benchmark target system. */ + + EA = 0; + /* Disable all interrupts */ + + Boot(); + /* Execute boot sequence */ + + EA = 1; + /* Enable 'enabled' interrupts */ + + StartSystem( HEALTH_MONITORING_TASK ); + /* Start RTX kernel and first task */ + + // do not run simulation for ever, just exit here + return 0; + + _Pragma( "loopbound min 0 max 0" ) + while ( 1 ) { + /* StartSystem has failed, so we just */ + /* wait here for a while for the Watch Dog */ + /* to wake up. */ + } +} + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/dpu_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/dpu_ctrl.h new file mode 100644 index 0000000..b85840a --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/dpu_ctrl.h @@ -0,0 +1,200 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : dpu_ctrl.h + + Operations and macros for low-level control of the Data Processing + Unit, the 80C32 computer on which the DEBIE DPU software runs. + This includes accessing data and code memories by address; boot + and reset operations; watchdog handling; memory patch and test. + + Based on the SSF DHI file dpu_ctrl.h, rev 1.23, Fri May 28 14:59:30 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef DPU_CTRL_H +#define DPU_CTRL_H + +#include "keyword.h" + +#define SAME 1 +#define NOT_SAME 0 + +#define MEMORY_PATCHED 1 +#define MEMORY_NOT_PATCHED 0 + +#ifndef HIGH +#define HIGH 1 +#endif + +#ifndef LOW +#define LOW 0 +#endif + +#define SELECTED 1 +#define NOT_SELECTED 0 +#define RESET_OK 1 +#define RESET_NOT_OK 0 + +#define ACCEPT_EVENT 1 +#define REJECT_EVENT 0 + + +/* memory addresses for program copy */ +#define PROGRAM_COPY_START 0x1000 +#define PROGRAM_COPY_END 0x8000 +/* this can be replaced with real end address (+1) of used program code */ +/* given in the linker map file */ + +/* Comment or delete following definition, if program should be executed */ +/* from RAM */ +/* #define USE_ALWAYS_PROM */ + +/* memory addresses for patching */ +#define BEGIN_SRAM1 0x1000 +#define END_SRAM1 0x7FFF +#define BEGIN_SRAM3 0x8000 +#define END_SRAM3 0xFEFF +#define BEGIN_DATA_RAM 0x0000 + + +#define SCIENCE_DATA_START_ADDRESS 0x0000 +/* First free absolute data address. */ + +#define INITIAL_CHECKSUM_VALUE 0 +/* A value given to 'reference_checksum' variable at 'Boot()'. */ +/* It is zero, since one code byte is dedicated to a constant */ +/* that ensures that the checksum of the PROM is zero. */ + +#include "target_dpu_ctrl.h" + +/*type definitions*/ + +typedef unsigned char DEBIE_mode_t; +/* Debie mode index. Valid values: */ +/* 00 DPU self test */ +/* 01 Stand by */ +/* 10 Acquisition */ + + +typedef enum { + power_up_reset_e = 0, /* Don't change value ! */ + watchdog_reset_e = 1, /* Don't change value ! */ + soft_reset_e, + warm_reset_e, + error_e, + checksum_reset_e +} reset_class_t; + +extern reset_class_t EXTERNAL s_w_reset; + +typedef enum { + PROM_e, SRAM_e +} memory_configuration_t; + + +#define MAX_TIME 0xFFFFFFFF +/* Maximum value for DEBIE time. */ + +typedef uint32_t dpu_time_t; +/* Data type for DEBIE time. */ + +/*-------------------------------------------------------*/ +/* Multi-byte TM types without alignment constraints. */ +/* The Keil/8051 system does not constrain alignment for */ +/* multi-byte types such as long int, but the Unix test */ +/* systems do, and we must declare the TM structures to */ +/* avoid constraints. */ +/* Note that we still assume that the two systems have */ +/* the same endianness. */ +/* Note also that the native type is used in the TM when */ +/* the component happens to have the correct alignment. */ +/* The special types are used only when the alignment is */ +/* otherwise incorrect. */ +/* Data is moved between the native type and the special */ +/* TM type only using the COPY or VALUE_OF macros. Thus, */ +/* on the 8051 the two types can in fact be identical, */ +/* with COPY defined as direct assignment ("="). */ + +typedef uskew32_t tm_dpu_time_t; +/* The TM type corresponding to dpu_time_t (32-bit int). */ + +typedef uskew16_t tm_ushort_t; +/* The TM type corresponding to unsigned short int. */ +/* */ +/*-------------------------------------------------------*/ + + +typedef struct { + unsigned char *source; + data_address_t destination; + uint_least8_t data_amount; + unsigned char execution_command; +} memory_patch_variables_t; +/* Holds parameters for PatchCode function: */ +/* source source address of the patch */ +/* (should be between 0x8000 and 0xFF00 - */ +/* data_amount) */ +/* destination destination address of the patch */ +/* (should be between 0x1000 and 0x8000 - */ +/* data_amount) */ +/* data_amount amount of bytes to be patched (max 255) */ +/* execution_command action executed after patch */ +/* 0x00 - continue normally */ +/* 0x09 - execute soft reset */ +/* 0x37 - execute warm reset */ +/* 0x5A - jump to start address of patched */ +/* memory area */ + +extern unsigned char EXTERNAL code_not_patched; +/* Initial value is 1, set at Boot(). Value is 1 when code */ +/* checksum value is valid, cleared to 0 when code memory is */ +/* patched, set to 1 when next checksum calculation */ +/* period is started. */ + +extern unsigned char EXTERNAL reference_checksum; +/* Expected value for code checksum. Will be changed when */ +/* code memory is patched. */ + + +/* Function prototypes: */ + +extern void Init_DPU ( reset_class_t reset_class ); + +extern reset_class_t GetResetClass( void ); + +extern void SignalMemoryErrors ( void ); + +extern void SetMemoryConfiguration ( memory_configuration_t memory ); + +extern memory_configuration_t GetMemoryConfiguration( void ) +COMPACT REENTRANT_FUNC; + +extern void PatchCode( memory_patch_variables_t EXTERNAL *patch_variables ); + +extern void Reboot( reset_class_t boot_type ); + + +/* Assembly-language function prototypes (asmfuncs.a51): */ + +extern unsigned char TestMemBits ( data_address_t address ); + +extern unsigned char TestMemData ( + data_address_t start, + uint_least8_t bytes ); + +extern unsigned char TestMemSeq ( + data_address_t start, + uint_least8_t bytes ); + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/harness.c b/targets/wasm-tacle/parallel/DEBIE/code/harness/harness.c new file mode 100644 index 0000000..c349f29 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/harness.c @@ -0,0 +1,3714 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW, test harness for WCET analysis + Subsystem : DNI (DEBIE Null Interface) + Module : harness.c + + Implementations of the DNI operations, suitable for compiling + and linking the DEBIE I DPU Software as a standard C program, + on any processor that supports the required data types (eg. 8-bit + char, 32-bit long) and has enough program and data memory. + + This implementation is designed to support measurement-based + timing analysis by feeding the DEBIE SW with selected sets of + test data. + + Options: if the preprocessor symbol TRACE_HARNESS is defined, + the harness operations generate trace message on stdout. + + Based, with extensive changes, on the SSF file rtx_if.c, rev 1.13, + Fri May 21 00:14:00 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* This file contains several sets of operations, as follows: + + > processor registers as variables: reg52.h + + > kernel operations: taskctrl.h, isr_ctrl.h, msg_ctrl.h + + > some DPU operations: dpu_ctrl.h + + > telecommand and telemetry interface operations: ttc_ctrl.h, isr_ctrl.h + + > operations for the A/D converted: ad_conv.h + + > operations on the sensor units: su_ctrl.h, dpu_ctrl.h + + > accessing the VALUE_OF "unsigned short" telemetry items: keyword.h + + > "calling" a "patch function": keyword.h + + > checking the sizes of various types (for analysis only). + + For testing purposes the main operation is StartSystem(). The DEBIE + main function calls StartSystem(), which normally activates the + kernel and the DEBIE application tasks and interrupt handlers. In this + version, StartSystem() takes over the show and runs the test scenario. + + Target-specific harness operations are implemented in target.c. There + is a specific version of target.c for each target processor/compiler. + +*/ + +#if defined(TRACE_HARNESS) +#include +#endif + +#include "keyword.h" +#include "health.h" +#include "measure.h" +#include "tc_hand.h" +#include "telem.h" + + +/* Processor registers : reg52.h */ + + +unsigned char EA; + + +/* Kernel operations : taskctrl.h */ + +#include "taskctrl.h" + +void CreateTask ( task_info_t EXTERNAL *new_task ) +/* Purpose : Task is created in the RTX. */ +/* Interface : input: - new_task */ +/* output: - telemetry_data.os_create_task_error */ +/* Preconditions : none */ +/* Algorithm : -In case of an error, 'new_task' is stored to telemetry */ +/* as an error indication. */ +{ + #if defined(TRACE_HARNESS) + printf ( "CreateTask %d\n", new_task->rtx_task_number ); + #endif + + switch ( new_task->rtx_task_number ) { + + case TC_TM_INTERFACE_TASK: + + InitTelecommandTask (); + + break; + + case ACQUISITION_TASK: + + InitAcquisitionTask (); + + break; + + case HIT_TRIGGER_ISR_TASK: + + InitHitTriggerTask (); + + break; + + default: + + #if defined(TRACE_HARNESS) + printf ( "CreateTask: unknown task number\n" ); + #endif + + break; + } +} + + +void WaitInterval( unsigned char time ) +/* Purpose : Interval is waited with RTX. */ +/* Interface : input: - time */ +/* output: - telemetry_data.os_wait_error */ +/* Preconditions : none */ +/* Postconditions : Interval for wait is set. */ +/* Algorithm : -In case of an error, 'K_IVL' is stored to telemetry */ +/* as an error indication and error bit is set in */ +/* software_error register. */ +{ + #if defined(TRACE_HARNESS) + printf ( "WaitInterval %d\n", time ); + #endif +} + + +void WaitTimeout( unsigned char time ) COMPACT REENTRANT_FUNC +/* Purpose : Timeout is waited with RTX. */ +/* Interface : input: - time */ +/* output: - telemetry_data.os_wait_error */ +/* Preconditions : none */ +/* Postconditions : Specified time has elapsed. */ +/* Algorithm : -In case of an error, 'K_TMO' is stored to telemetry */ +/* as an error indication and error bit is set in */ +/* software_error register. */ +{ + #if defined(TRACE_HARNESS) + printf ( "WaitTimeout %d\n", time ); + #endif +} + + +void SetTimeSlice( unsigned int time_slice ) +/* Purpose : Time slice in the RTX is set. */ +/* Interface : input: - time_slice */ +/* output: - telemetry_data.os_set_slice_error */ +/* Preconditions : none */ +/* Postconditions : Timeslice which defines the time interval in number of */ +/* processor cycles is set. */ +/* Algorithm : In case of an error, indication bit is set in */ +/* the software_error register. */ +{ + #if defined(TRACE_HARNESS) + printf ( "SetTimeSlice %d\n", time_slice ); + #endif +} + + +static unsigned int ad_converting = 0; +/* Whether the ADC is now busy with a conversion. + 0 = no, 1 = yes. + Declared here, because it is cleared by ShortDelay. +*/ + + +void ShortDelay ( uint_least8_t delay_loops ) +{ + #if defined(TRACE_HARNESS) + printf ( "ShortDelay %d\n", delay_loops ); + #endif + + ad_converting = 0; + /* Any on-going A/D conversion is assumed to end during the delay. + ShortDelay is sometimes used, instead of End_Of_ADC, when the + A/D converter is switched between unipolar and bipolar modes. + */ +} + + +unsigned char isr_send_message ( + unsigned char mailbox, + uint16_t message ) +/* Purpose : Send mail from ISR to a requested mailbox. */ +/* Interface : input: - mailbox, message */ +/* output: - telemetry_data.os_send_message_error */ +/* Preconditions : Mailbox number should be a value 0 - 7 */ +/* Postconditions : Mail is send to a given mailbox. */ +/* Algorithm : - In case of an error, failed 'mailbox' is stored to */ +/* telemetry. */ +{ + #if defined(TRACE_HARNESS) + printf ( "isr_send_message to %d, message %d = 0x%x\n", + mailbox, message, message ); + #endif + SendTaskMail ( mailbox, message, 0 ); + return OK; +} + + +/* Interrupt services : isr_ctrl.h */ + + +#include "isr_ctrl.h" + + +void AttachInterrupt( unsigned char ISR_VectorNumber ) +/* Purpose : Interrupt with a given number is assigned to a task in */ +/* Interface : input: - ISR_VectorNumber */ +/* output: - telemetry_data.os_attach_interrupt_error */ +/* Preconditions : none */ +/* Postconditions : Interrupt is attached to a calling task. */ +/* Algorithm : -In case of an error, 'ISR_VectorNumber' is stored to */ +/* telemetry as an error indication. */ +{ + #if defined(TRACE_HARNESS) + printf ( "AttachInterrupt %d\n", ISR_VectorNumber ); + #endif +} + + +void EnableInterrupt( unsigned char ISR_VectorNumber ) +/* Purpose : Interrupt with a given number is enabled in the RTX. */ +/* Interface : input: - ISR_VectorNumber */ +/* output: - telemetry_data.os_enable_isr_error */ +/* Preconditions : none */ +/* Postconditions : Interrupt is enabled. */ +/* Algorithm : -In case of an error, 'ISR_VectorNumber' is stored to */ +/* telemetry as an error indication. */ +{ + #if defined(TRACE_HARNESS) + printf ( "EnableInterrupt %d\n", ISR_VectorNumber ); + #endif +} + + +void DisableInterrupt( unsigned char ISR_VectorNumber ) +/* Purpose : Interrupt with a given number is disabled in the RTX. */ +/* Interface : input: - ISR_VectorNumber */ +/* output: - telemetry_data.os_disable_isr_error */ +/* Preconditions : none */ +/* Postconditions : Interrupt is enabled. */ +/* Algorithm : -In case of an error, 'ISR_VectorNumber' is stored to */ +/* telemetry as an error indication. */ +{ + #if defined(TRACE_HARNESS) + printf ( "DisableInterrupt %d\n", ISR_VectorNumber ); + #endif +} + + +signed char SetInterruptMask( unsigned char ISR_MaskNumber ) +/* Purpose : Interrupt mask bit is set is in the RTX. */ +/* Interface : Return value, which describes the execution result, is */ +/* always zero as this function does no parameter checking. */ +/* Used to manipulate special bits, which are part of the */ +/* interrupt enable registers or to modify interrupt enable */ +/* bits from inside a C51 interrupt function. */ +/* Not to be used for interrupt sources attached to RTX51 */ +/* tasks. */ +/* Preconditions : */ +/* Postconditions : Interrupt mask is set. */ +/* Algorithm : RTX syntax is used. */ +{ + #if defined(TRACE_HARNESS) + printf ( "SetInterruptMask 0x%x\n", ISR_MaskNumber ); + #endif + return 0; /* Success. */ +} + + +signed char ResetInterruptMask( unsigned char ISR_MaskNumber ) +/* Purpose : Interrupt mask bit is reset is in the RTX. */ +/* Interface : Return value, which describes the execution result, is */ +/* always zero as this function does no parameter checking. */ +/* Used to manipulate special bits, which are part of the */ +/* interrupt enable registers or to modify interrupt enable */ +/* bits from inside a C51 interrupt function. */ +/* Not to be used for interrupt sources attached to RTX51 */ +/* tasks. */ +/* Preconditions : */ +/* Postconditions : Interrupt mask is reset. */ +/* Algorithm : RTX syntax is used. */ +{ + #if defined(TRACE_HARNESS) + printf ( "ResetInterruptMask 0x%x\n", ISR_MaskNumber ); + #endif + return 0; /* Success. */ +} + + +void WaitInterrupt ( unsigned char ISR_VectorNumber, unsigned char timer ) +/* Purpose : Interrupt is waited in the RTX. */ +/* Interface : input: - ISR_VectorNumber,timer */ +/* output: - telemetry_data.os_wait_error */ +/* Preconditions : none */ +/* Postconditions : Interrupt is waited. */ +/* Postconditions : Interrupt is enabled. */ +/* Algorithm : -In case of an error, 'K_INT' is stored to telemetry */ +/* as an error indication and error bit is set in */ +/* software_error register. */ +{ + #if defined(TRACE_HARNESS) + printf ( "WaitInterrupt %d, time %d\n", ISR_VectorNumber, timer ); + #endif +} + +/* See below, Telecommand and telemetry interface, for the ISR */ +/* operations related to the TC timer. */ + +/* See below for the ISR operations related to the Hit interrupt. */ + + + +/* Message sending : msg_ctrl.h */ + + +#include "msg_ctrl.h" + + +static uint16_t mail_message[ 8 ]; +/* The last message in the mailbox. */ + +static int mail_count[ 8 ] = {0, 0, 0, 0, 0, 0, 0, 0}; +/* The number of messages in the mailbox. */ +/* Should be between 0 and 1. */ + +static int mail_overflows = 0; +/* The number of times a mailbox has overflowed. */ + + +void SendTaskMail ( + unsigned char mailbox, + uint16_t message, + unsigned char timeout ) +/* Purpose : Send mail to a requested mailbox. */ +/* Interface : input: - mailbox, message, timeout */ +/* output: - telemetry_data.os_send_message_error */ +/* Preconditions : Mailbox number should be a value 0 - 7 */ +/* timeout should be a value 0 - 255 */ +/* Postconditions : Mail is send to a given mailbox. */ +/* Algorithm : - In case of an error, failed 'mailbox' is stored to */ +/* telemetry. */ +{ + #if defined(TRACE_HARNESS) + printf ( "SendTaskMail to %d, message %d, timeout %d\n", + mailbox, message, timeout ); + #endif + + if ( mail_count[ mailbox ] == 0 ) + mail_message[ mailbox ] = message; + else { + #if defined(TRACE_HARNESS) + printf ( "Overflow on mailbox %d, already %d message(s)\n", + mailbox, mail_count[ mailbox ] ); + #endif + mail_overflows ++; + } + + mail_count[ mailbox ] ++; +} + + +void WaitMail ( incoming_mail_t EXTERNAL *message ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Mail is waited from the given mailbox. */ +/* Interface : Return value, which describes the execution result, is */ +/* stored in to a struct. */ +/* Preconditions : Mailbox number should be a value 0 - 7 */ +/* Time-out should have a value 0 - 255. */ +/* Postconditions : Message is received or timeout has occurred or error has */ +/* occurred due to unvalid parameter values. */ +/* Algorithm : -In case of an error, 'event_selector' is stored to */ +/* telemetry as an error indication and error bit is set */ +/* in software_error register. */ +{ + #if defined(TRACE_HARNESS) + printf ( "WaitMail from %d, timeout %d\n", + message -> mailbox_number, message -> timeout ); + #endif + + if ( mail_count[ message -> mailbox_number ] > 0 ) + { + message -> wait_result = MSG_RECEIVED; + message -> execution_result = MSG_RECEIVED; + *( message -> message ) = mail_message[ message -> mailbox_number ]; + + #if defined(TRACE_HARNESS) + printf ( "Message from %d is %d = 0x%x\n", + message -> mailbox_number, + *( message -> message ), + *( message -> message ) ); + #endif + + mail_count[ message -> mailbox_number ] --; + } else + { + message -> wait_result = TIMEOUT_OCCURRED; + message -> execution_result = TIMEOUT_OCCURRED; + *( message -> message ) = 0; + } +} + + +static void FlushMail ( unsigned char mailbox ) +/* Remove all mail from the mailbox. Harness use only. */ +{ + #if defined(TRACE_HARNESS) + printf ( "FlushMail from box %d, which had %d messages.\n", + mailbox, mail_count[ mailbox ] ); + #endif + + mail_count[ mailbox ] = 0; +} + + +/* DPU operations : dpu_ctrl.h */ + + +#include "dpu_ctrl.h" + + +static unsigned int check_current_errors = 0; +/* The number of consecutive error indications to be returned + by the next calls of Check_Current. +*/ + + +unsigned char Check_Current ( unsigned char bits ) +{ + unsigned char val; + #if defined(TRACE_HARNESS) + printf ( "Check_Current 0x%x\n", bits ); + #endif + switch ( bits ) { + case 3: + val = 1; + break; + case 12: + val = 4; + break; + case 48: + val = 16; + break; + case 192: + val = 64; + break; + default : + val = 0; + #if defined(TRACE_HARNESS) + printf ( "Check_Current param error\n" ); + break; + #endif + } + + if ( check_current_errors > 0 ) { + val = ~val; /* Wrong value => alarm. */ + check_current_errors --; + } + + return val; +} + + +/* The memory operations (Get_Data_Byte etc) are implemented in + target.c for each target processor/compiler. +*/ + + +/* The following routines are implemented in das/hw_if.c: + Init_DPU + GetResetClass + SignalMemoryErrors + SetMemoryConfiguration + GetMemoryConfiguration + PatchCode +*/ + + +void Reboot( reset_class_t boot_type ) +{ + #if defined(TRACE_HARNESS) + printf ( "Reboot %d\n", boot_type ); + #endif + + if ( boot_type == checksum_reset_e ) { + /* Make it not happen (at once) again: */ + reference_checksum = code_checksum; + } + + TARGET_REBOOT; +} + + +/* Functions originally implemented in assembly-language (asmfuncs.a51): */ + + +unsigned char TestMemBits ( data_address_t address ) +/* + Test each bit of a cell in RAM memory. + For each of the eight bits, the value with this bit ON and + all others bits OFF is written to the cell, and the written + value is read back and verified. + The original content of the cell is destroyed. + Parameters: + address Cell address. + TestMemBits returns zero for success, and otherwise the + first bit pattern for which the cell failed. + +*/ +{ + #if defined(TRACE_HARNESS) + printf ( "TestMemBits 0x%x\n", address ); + #endif + return 0; +} + + +unsigned char TestMemData ( + data_address_t start, + uint_least8_t bytes ) +/* + Test an area of RAM memory. + For each RAM cell in the given area, the values AAh + and 55h are written to the cell, and the written value + is read back and verified. + The original content of each cell is destroyed. + Parameters: + start Starting address + bytes Length of area + 1 .. 255. Note, zero is NOT allowed! + TestMem returns the number of bytes remaining to test + when the first memory failure occurred. + If this value is nonzero, the first failing address is + found by subtracting the return value from 'start+bytes'. + +*/ +{ + #if defined(TRACE_HARNESS) + printf ( "TestMemData start 0x%x, bytes %d\n", start, bytes ); + #endif + return 0; +} + + +unsigned char TestMemSeq ( + data_address_t start, + uint_least8_t bytes ) +/* + Test an area of RAM memory. + For each RAM cell in the given area, the logical complement of + the low byte of the cell address is written into the cell, in + one pass from the start to the end. Then, in a second pass, + each cell is read and the value is is verified. + The original content of each cell is destroyed. + Parameters: + start Starting address + bytes Length of area + 1 .. 255. Note, zero is NOT allowed! + TestMemSeq returns the number of bytes remaining to test + when the first memory failure occurred. + If this value is nonzero, the first failing address is + found by subtracting the return value from 'start+bytes'. + +*/ +{ + #if defined(TRACE_HARNESS) + printf ( "TestMemSeq start 0x%x, bytes %d\n", start, bytes ); + #endif + return 0; +} + + +/* Telecommand and telemetry interface : ttc_ctrl.h */ + + +#include "ttc_ctrl.h" + + +static unsigned char tc_msb, tc_lsb; +/* Simulated TC interface registers. */ + +static uint16_t tc_word; +/* The simulated TC word, composed of tc_msb and tc_lsb. */ + + +unsigned char Read_TC_MSB ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Read_TC_MSB\n" ); + #endif + return tc_msb; +} + + +unsigned char Read_TC_LSB ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Read_TC_LSB\n" ); + #endif + return tc_lsb; +} + + +static unsigned char tm_msb, tm_lsb; +/* Simulated TM interface registers. */ + + +void Write_TM_LSB ( unsigned char value ) +{ + #if defined(TRACE_HARNESS) + printf ( "Write_TM_LSB %d = 0x%x\n", value, value ); + #endif + tm_lsb = value; +} + + +void Write_TM_MSB ( unsigned char value ) +{ + #if defined(TRACE_HARNESS) + printf ( "Write_TM_MSB %d = 0x%x\n", value, value ); + #endif + tm_msb = value; +} + + +/* TC timer operations : isr_ctrl.h */ + + +static unsigned char tc_timer_overflow = 1; +/* Simulated overflow flag on the TC timer. */ +/* 1 = overflow = good, sufficient interval between TCs. */ +/* 0 = no overflow = bad. */ + + +unsigned char TC_Timer_Overflow_Flag ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "TC_Timer_Overflow_Flag\n" ); + #endif + return tc_timer_overflow; +} + + +void Clear_TC_Timer_Overflow_Flag ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Clear_TC_Timer_Overflow_Flag\n" ); + #endif + tc_timer_overflow = 0; +} + + +void Set_TC_Timer_Overflow_Flag ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Set_TC_Timer_Overflow_Flag\n" ); + #endif + tc_timer_overflow = 1; +} + + +/* A/D Converter operations : ad_ctrl.h */ + + +#include "ad_conv.h" + +/* A/D channels + + Channel Meaning + ------- ------- + dec hex + 0 00 SU 1, plasma 1 + + 1 01 SU 1, plasma 1 - + 2 02 SU 1, piezo 1 + 3 03 SU 1, piezo 2 + 4 04 SU 1, plasma 2 + + 5 05 SU 1, temperature 0 + 6 06 SU 1, temperature 1 + 7 07 + 8 08 SU 2, plasma 1 + + 9 09 SU 2, plasma 1 - + 10 0A SU 2, piezo 1 + 11 0B SU 2, piezo 2 + 12 0C SU 2, plasma 2 + + 13 0D SU 2, temperature 0 + 14 0E SU 2, temperature 1 + 15 0F + 16 10 SU 1 & SU 2, +5V supply + 17 11 SU 3 & SU 4, +5V supply + 18 12 SU 1,2,3,4 , +50V supply + 19 13 DPU +5V supply + 20 14 SU 1 & SU 2, -5V supply + 21 15 SU 3 & SU 4, -5V supply + 22 16 SU 1,2,3,4, -50V supply + 23 17 + 24 18 SU 3, plasma 1 + + 25 19 SU 3, plasma 1 - + 26 1A SU 3, piezo 1 + 27 1B SU 3, piezo 2 + 28 1C SU 3, plasma 2 + + 29 1D SU 3, temperature 0 + 30 1E SU 3, temperature 1 + 31 1F + 32 20 SU 4, plasma 1 + + 33 21 SU 4, plasma 1 - + 34 22 SU 4, piezo 1 + 35 23 SU 4, piezo 2 + 36 24 SU 4, plasma 2 + + 37 25 SU 4, temperature 0 + 38 26 SU 4, temperature 1 + 39 27 + 40 28 + + A/D channel-selector register: + + Bit Meaning + --- ------- + 7 1 = do not use interleave calibration + 6 1 = bipolar, 0 = unipolar + 5 Channel index, 32 + 4 Channel index, 16 + 3 Channel index, 8 + 2 Channel index, 4 + 1 Channel index, 2 + 0 Channel index, 1 + +*/ + + +typedef struct { + uint16_t min; + uint16_t max; +} ad_limit_t; +/* Limits on the value of a simulated A/D reading. */ + +static ad_limit_t ad_limit[ AD_CHANNELS ] = { + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, + {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff}, {0, 0xffff} +}; +/* Limits on the simulated A/D readings for all channels. */ + + +void Set_AD_Unlimited ( void ) +/* Sets no A/D limits. */ +{ + uint_least8_t c; + + #if defined(TRACE_HARNESS) + printf ( "Set AD Unlimited\n" ); + #endif + + _Pragma( "loopbound min 40 max 40" ) + for ( c = 0; c < AD_CHANNELS; c++ ) { + ad_limit[ c ].min = 0; + ad_limit[ c ].max = 0xffff; + } +} + + +void Set_AD_Nominal ( void ) +/* Sets A/D limits to ensure nominal (in-range) readings. */ +{ + #if defined(TRACE_HARNESS) + printf ( "Set AD Nominal\n" ); + #endif + + /* SU +5V supply: */ + + ad_limit[ 16 ].min = 0xba00; + ad_limit[ 16 ].max = 0xe4ff; + + ad_limit[ 17 ].min = 0xba00; + ad_limit[ 17 ].max = 0xe4ff; + + /* SU -5V supply: */ + + ad_limit[ 20 ].min = 0x0d00; + ad_limit[ 20 ].max = 0x22ff; + + ad_limit[ 21 ].min = 0x0d00; + ad_limit[ 21 ].max = 0x22ff; + + /* SU +50V supply: */ + + ad_limit[ 18 ].min = 0xa800; + ad_limit[ 18 ].max = 0xe3ff; + + /* SU -50V supply: */ + + ad_limit[ 22 ].min = 0x0e00; + ad_limit[ 22 ].max = 0x2cff; + + /* DPU +5V supply: */ + + ad_limit[ 19 ].min = 0xba00; + ad_limit[ 19 ].max = 0xe4ff; + + /* SU 1 temperatures: */ + + ad_limit[ 5 ].min = 0x0000; + ad_limit[ 5 ].max = 0xfaff; + ad_limit[ 6 ].min = 0x0000; + ad_limit[ 6 ].max = 0xf4ff; + + /* SU 2 temperatures: */ + + ad_limit[ 13 ].min = 0x0000; + ad_limit[ 13 ].max = 0xfaff; + ad_limit[ 14 ].min = 0x0000; + ad_limit[ 14 ].max = 0xf4ff; + + /* SU 3 temperatures: */ + + ad_limit[ 29 ].min = 0x0000; + ad_limit[ 29 ].max = 0xfaff; + ad_limit[ 30 ].min = 0x0000; + ad_limit[ 30 ].max = 0xf4ff; + + /* SU 4 temperatures: */ + + ad_limit[ 37 ].min = 0x0000; + ad_limit[ 37 ].max = 0xfaff; + ad_limit[ 38 ].min = 0x0000; + ad_limit[ 38 ].max = 0xf4ff; +} + + +static int ad_conv_timer; +/* Simulate some delay in the conversion. This is a signed + number so that the delay can be made large by initializing + the timer to a large negative value. +*/ + +#define AD_NUM_CONV 6 +/* The number of consecutive A/D conversions separately simulated. */ + +static int ad_conv_delay[ AD_NUM_CONV ]; +/* The conversion finishes when ad_conv_timer >= ad_conv_delay, + with provision for up to AD_NUM_CONV different delays for + many consecutive conversions. A value of 0 or 1 means that + the conversion is immediately ready, assuming that ad_conv_time + starts counting from zero (and not from a negative value). +*/ + +static unsigned int ad_conv_num = 0; +/* Counts the consecutive conversions for ad_conv_delay[ ]. */ + + +#define AD_NUM_RAND 319 +/* The amount of random A/D data defined below. */ + +static unsigned char ad_random[ AD_NUM_RAND ] = { + 0x6a, 0xde, 0xba, 0x90, 0xf2, 0x18, 0x48, 0xf3, + 0x9e, 0x2b, 0x31, 0xdb, 0xe0, 0x7e, 0xc6, 0x18, + 0x43, 0xd0, 0xd7, 0x6e, 0xbc, 0xee, 0x93, 0x9a, + 0x06, 0xb2, 0x3d, 0x1f, 0xc1, 0x51, 0x66, 0x69, + 0xbf, 0x1c, 0x9c, 0xfc, 0x9b, 0xf7, 0xf2, 0xd0, + 0xf4, 0x26, 0x60, 0x69, 0xc4, 0xd9, 0xdb, 0xd4, + 0xe7, 0x2b, 0x8a, 0xea, 0x9f, 0xab, 0x40, 0x3e, + 0xc3, 0xd8, 0x21, 0x61, 0x3b, 0x0f, 0xc1, 0x49, + 0xd3, 0x09, 0x9a, 0x4d, 0x33, 0x52, 0x7b, 0x8e, + 0x7e, 0x7b, 0x6a, 0x88, 0x4f, 0x84, 0xa2, 0xb4, + 0x83, 0xd9, 0xba, 0x79, 0x7d, 0x8f, 0xdf, 0xb2, + 0x8c, 0x86, 0x77, 0x4f, 0x29, 0x86, 0xd4, 0x8b, + 0x11, 0x65, 0x55, 0x74, 0xf4, 0x76, 0x83, 0x88, + 0xd6, 0xa6, 0xa7, 0x33, 0x22, 0xa3, 0x2e, 0x88, + 0x06, 0x54, 0x90, 0x37, 0xd5, 0xdb, 0xce, 0x7c, + 0x0b, 0xd1, 0xe1, 0xc0, 0x7d, 0xa5, 0x0b, 0xc9, + 0xaf, 0xe3, 0x75, 0xc5, 0xf5, 0xaf, 0xaa, 0xe2, + 0x2a, 0xff, 0x6e, 0x84, 0x0e, 0x04, 0x10, 0xf0, + 0x78, 0xdc, 0x96, 0x3d, 0x22, 0x96, 0x64, 0x5b, + 0x7b, 0x9e, 0x83, 0x45, 0xba, 0xb8, 0xe1, 0x31, + 0xc7, 0x0a, 0xe0, 0x31, 0xce, 0x29, 0x3d, 0x01, + 0xb8, 0xfc, 0x79, 0x83, 0x3d, 0xd1, 0x40, 0xe1, + 0x46, 0xfa, 0xe7, 0xc5, 0xdc, 0xc4, 0x1c, 0x24, + 0x29, 0x5a, 0xef, 0xeb, 0x92, 0x57, 0xba, 0x06, + 0x13, 0x1d, 0x35, 0xef, 0xb0, 0x2d, 0x69, 0x20, + 0x92, 0xb1, 0x82, 0x00, 0x8e, 0x3b, 0x12, 0xb3, + 0x78, 0xd7, 0x18, 0xb3, 0x54, 0x0f, 0xd1, 0x8e, + 0x88, 0x5d, 0x4e, 0x2b, 0x30, 0x30, 0x2d, 0x85, + 0xaa, 0x21, 0x01, 0xe1, 0x2c, 0x35, 0xa1, 0xee, + 0xa2, 0x17, 0xed, 0x60, 0x1b, 0x98, 0xea, 0x12, + 0x85, 0x21, 0xde, 0x45, 0x26, 0xef, 0x12, 0x3c, + 0x02, 0x8c, 0xd7, 0x49, 0xbd, 0x02, 0xa7, 0x7d, + 0xe7, 0x1c, 0x15, 0xf9, 0xaa, 0x44, 0x15, 0xb1, + 0xaa, 0x76, 0x5e, 0xf2, 0xb4, 0xfb, 0x85, 0x77, + 0xb9, 0x32, 0xb4, 0xc9, 0x70, 0xe1, 0xdb, 0x44, + 0x9f, 0x5b, 0x87, 0xca, 0xaa, 0xcb, 0x43, 0x53, + 0x7e, 0x49, 0xec, 0x1a, 0x13, 0x1d, 0xe1, 0x1b, + 0x13, 0xc3, 0x34, 0x95, 0x5d, 0x5a, 0xc3, 0xd0, + 0x33, 0x05, 0x82, 0x4a, 0x2e, 0x6d, 0x39, 0xeb, + 0x9c, 0x65, 0x81, 0x7f, 0xa1, 0x62, 0x11 +}; +/* Random A/D data. */ + + +void Next ( unsigned int *index ) +/* Go on to the next random value. */ +{ + ( *index ) ++; + if ( ( *index ) >= AD_NUM_RAND ) *index = 0; +} + + +unsigned char Next_Rand ( unsigned int *index ) +/* Go on to the next random value and return it. */ +{ + Next ( index ); + return ad_random[ *index ]; +} + + +void Set_AD_Delay ( int delay ) +/* Sets ad_conv_delay[ all ] = delay. */ +{ + int i; + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < AD_NUM_CONV; i++ ) + ad_conv_delay[ i ] = delay; +} + + +static unsigned int ad_delay_rand = 0; +/* A roving index to randomize the A/D delays. */ + + +void Random_AD_Delay ( void ) +/* Sets random ad_conv_delay[ ]. */ +{ + int i; + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < AD_NUM_CONV; i++ ) + ad_conv_delay[ i ] = ( Next_Rand ( &ad_delay_rand ) % ( ADC_MAX_TRIES + 10 ) ); +} + + +static unsigned int ad_rand_index = 0; +/* A roving index to the random A/D data. */ + +static unsigned int max_adc_hits = 0; +/* Maximum number of particle "hits" that may occur during + A/D conversions (in the Monitoring task, we assume). +*/ + +static unsigned int ad_hit_rand_index = 0; +/* A roving index to the random A/D data, for randomizing + the occurrence of "hits" during A/D conversions. +*/ + +static unsigned int total_adc_hits = 0; +/* The number of simulated particle "hits" during A/D conversion. */ + +static unsigned int ad_random_failures = 0; +/* The number of A/D conversion failures (conversion never done) + to be simulated, at random times, in the next conversions + (calls of Start_Conversion). +*/ + +static unsigned int ad_fail_index = 0; +/* A roving index to the random A/D data, for randomizing + the occurrence of A/D failures (conversion never done). +*/ + +/* See also ad_converting, declarer earlier. */ + + +void Update_ADC_Channel_Reg ( unsigned char channel ) +{ + #if defined(TRACE_HARNESS) + printf ( "Update_ADC_Channel_Reg %x\n", channel ); + #endif +} + + +static unsigned int start_conversion_count = 0; +/* Counts the number of calls of Start_Conversion. */ + +static uint16_t ad_value = 0; +/* Simulated ADC value, set at Start_Conversion and reported + byte by byte. +*/ + + +void Start_Conversion ( void ) +{ + uint_least8_t channel; + + channel = ADC_channel_register & 0x3f; + + #if defined(TRACE_HARNESS) + printf ( "Start_Conversion on channel %d\n", channel ); + #endif + + if ( ad_converting != 0 ) { + #if defined(TRACE_HARNESS) + printf ( "- previous conversion did not end.\n" ); + #endif + } + + /* Pick an A/D reading for this channel: */ + + ad_value = ( ( uint16_t )Next_Rand ( &ad_rand_index ) ) << 8; + ad_value |= ( uint16_t )Next_Rand ( &ad_rand_index ); + + if ( ad_value < ad_limit[ channel ].min ) + ad_value = ad_limit[ channel ].min; + else + if ( ad_value > ad_limit[ channel ].max ) + ad_value = ad_limit[ channel ].max; + + start_conversion_count ++; + + ad_conv_timer = 0; + /* Normal case, may be changed below. */ + + ad_conv_num ++; + if ( ad_conv_num >= AD_NUM_CONV ) ad_conv_num = 0; + + if ( ad_random_failures > 0 ) { + if ( Next_Rand ( &ad_fail_index ) > 0x3f ) { + /* Pretend that this conversion will fail (not end). */ + + #if defined(TRACE_HARNESS) + printf ( "Start_Conversion starts a failing A/D conversion.\n" ); + #endif + ad_conv_timer = -5000; + + ad_random_failures --; + } + } + + ad_converting = 1; +} + + +void Report_Start_Conversion_Count ( int problem ) +/* Reports and then clears the count of Start_Conversion calls. + The problem parameter associates this count with a given + analysis problem for this benchmark. +*/ +{ + #if defined(TRACE_HARNESS) + printf ( "Called Start_Conversion %d times in problem %d.\n", + start_conversion_count, problem ); + #endif + + start_conversion_count = 0; +} + + +static unsigned int end_of_adc_count = 0; +/* Counts the number of calls of End_Of_ADC. */ + + +unsigned char End_Of_ADC ( void ) +/* Is the A/D conversion done, that is, ready for readout? + 0 (CONVERSION_ACTIVE) means yes, any other value means no. +*/ +{ + #if defined(TRACE_HARNESS) + printf ( "End_Of_ADC\n" ); + #endif + + if ( ad_converting == 0 ) { + #if defined(TRACE_HARNESS) + printf ( "- conversion not going on.\n" ); + #endif + } + + end_of_adc_count ++; + + ad_conv_timer ++; + + if ( ad_conv_timer >= ad_conv_delay[ ad_conv_num ] ) { + /* Conversion done. */ + + ad_converting = 0; + + return 0; + } else { + /* Conversion still going on. */ + + /* Perhaps get a preemptive "hit": */ + + if ( max_adc_hits > 0 ) { + /* We have some hits in reserve. */ + + if ( Next_Rand ( &ad_hit_rand_index ) > 0x7f ) { + /* Hit me again, Sam. */ + + #if defined(TRACE_HARNESS) + printf ( "Hit during A/D\n" ); + #endif + confirm_hit_result = 1; + + total_adc_hits ++; + max_adc_hits --; + + ad_converting = 0; + + return 0; + /* No point in going on. */ + } + } + + /* Conversion not yet finished and no hit. */ + + return 1; + } +} + + +void Report_End_Of_ADC_Count ( int problem ) +/* Reports and then clears the count of End_Of_ADC calls. + The problem parameter associates this count with a given + analysis problem for this benchmark. +*/ +{ + #if defined(TRACE_HARNESS) + printf ( "Called End_Of_ADC %d times in problem %d.\n", + end_of_adc_count, problem ); + #endif + + end_of_adc_count = 0; +} + + +unsigned char Get_Result ( void ) +{ + unsigned char value; + + /* Return the current MSB of ad_value: */ + + value = ( ad_value >> 8 ) & 0xff; + + #if defined(TRACE_HARNESS) + printf ( "Get_Result %d = 0x%x\n", value, value ); + #endif + + /* Shift the LSB to the MSB, for next Get_Result: */ + + ad_value <<= 8; + + return value; +} + +void Set_DAC_Output ( unsigned char level ) +{ + #if defined(TRACE_HARNESS) + printf ( "Set_DAC_Output %d\n", level ); + #endif +} + + + +/* The variable ADC_channel_register is defined in health.c. */ + + +/* Sensor Unit operations : su_ctrl.h, dpu_ctrl.h, isr_ctrl.h */ + + +#include "su_ctrl.h" + + +/* Variables simulating the event sensors: */ + +static unsigned char hit_enabled = 0; +static unsigned char trigger_flag = 1; +static unsigned char event_flag = ACCEPT_EVENT; +static unsigned char trigger_source_0 = 0; +static unsigned char trigger_source_1 = 0; + +static unsigned char msb_counter = 134; +static unsigned char lsb1_counter = 77; +static unsigned char lsb2_counter = 88; +static unsigned char rise_time_counter = 102; + +static unsigned char sim_self_test = 0; +/* Whether to simulate (successful) SU Self Test. */ + +static unsigned char self_test_pulse = 0; +/* The level of the SU Self Test pulse. */ + + +void Sim_Self_Test_Trigger ( void ) +/* If conditions are such that a Self Test Hit Trigger should + be generated, simulate this occurrence by modifying the + SU_state for the SU being tested as the Hit Trigger ISR would do. + This supports the testing of the SU Self Test sequences in the + Monitoring task. + + The simulation does not actually invoke the Hit Trigger ISR + nor does it process the Self Test event. These DEBIE functions + are tested by calling Hit Trigger ISR directly, not from the + SU Self Test sequences. +*/ +{ + if ( ( sim_self_test == 1 ) + && ( hit_enabled == 1 ) + && ( self_test_pulse > 0 ) + && ( self_test_SU_number != NO_SU ) + && ( SU_state[ self_test_SU_number - SU1 ] == self_test_trigger_e ) ) { + #if defined(TRACE_HARNESS) + printf ( "SU Self Test trigger!\n" ); + #endif + SU_state[ self_test_SU_number - SU1 ] = self_test_e; + } +} + + +static unsigned int event_rand_index = 0; +/* Roving index for ad_random, for randomizing the event data. */ + + +void Random_Event ( void ) +/* Sets random data in the event sensors. */ +{ + unsigned char val; + + val = Next_Rand ( &event_rand_index ); + + trigger_flag = ( val >> 7 ) & 1; + event_flag = ( val >> 6 ) & 1; + trigger_source_0 = ( val >> 5 ) & 1; + trigger_source_1 = ( val >> 4 ) & 1; + + msb_counter = Next_Rand ( &event_rand_index ); + lsb1_counter = Next_Rand ( &event_rand_index ); + lsb2_counter = Next_Rand ( &event_rand_index ); + rise_time_counter = Next_Rand ( &event_rand_index ); +} + + +static void Set_Trigger_SU ( sensor_index_t SU ) +/* Sets the given SU in trigger_source_0/1. */ +{ + #if defined(TRACE_HARNESS) + printf ( "Set Trigger SU index %d\n", SU ); + #endif + + trigger_source_0 = SU & 1; + trigger_source_1 = ( SU >> 1 ) & 1; +} + + +void Enable_Hit_Trigger ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Enable_Hit_Trigger\n" ); + #endif + hit_enabled = 1; + Sim_Self_Test_Trigger (); +} + +void Disable_Hit_Trigger ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Disable_Hit_Trigger\n" ); + #endif + hit_enabled = 0; + Sim_Self_Test_Trigger (); +} + + +unsigned char Hit_Trigger_Flag ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Hit_Trigger_Flag\n" ); + #endif + return trigger_flag; + /* 1 means hit trigger ITs are enabled + 0 means they are disabled. + */ +} + + +unsigned char Event_Flag ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Event_Flag \n" ); + #endif + return event_flag; +} + + +unsigned char Get_MSB_Counter ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Get_MSB_Counter\n" ); + #endif + return msb_counter; +} + + +unsigned char Get_LSB1_Counter ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Get_LSB1_Counter\n" ); + #endif + return lsb1_counter; +} + + +unsigned char Get_LSB2_Counter ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Get_LSB2_Counter\n" ); + #endif + return lsb2_counter; +} + + +unsigned char Rise_Time_Counter ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Rise_Time_Counter\n" ); + #endif + return rise_time_counter; +} + + +unsigned char Trigger_Source_0 ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Trigger_Source_0\n" ); + #endif + return trigger_source_0; +} + + +unsigned char Trigger_Source_1 ( void ) +{ + #if defined(TRACE_HARNESS) + printf ( "Trigger_Source_1\n" ); + #endif + return trigger_source_1; +} + + +void Set_SU_Self_Test_Ch ( unsigned char value ) +/* Set the SU Self Test Channel selectors. */ +{ + #if defined(TRACE_HARNESS) + printf ( "Set SU Self-Test Channel %x\n", value ); + #endif +} + + +void Set_Test_Pulse_Level ( unsigned char level ) +/* Set the SU Self Test pulse level. */ +{ + #if defined(TRACE_HARNESS) + printf ( "Set SU Self-Test Pulse Level %d\n", level ); + #endif + self_test_pulse = level; + Sim_Self_Test_Trigger (); +} + + +static unsigned int v_down_errors = 0; +/* The number of consecutive error results to + be returned from the next calls of V_Down. +*/ + + +unsigned char V_Down ( void ) +{ + unsigned char result; + + if ( v_down_errors > 0 ) { + result = 0; /* Bad. */ + v_down_errors --; + } else + result = 1; /* Good. */ + + #if defined(TRACE_HARNESS) + printf ( "V_Down %d\n", result ); + #endif + + return result; +} + + +void SignalPeakDetectorReset( + unsigned char low_reset_value, + unsigned char high_reset_value ) +{ + #if defined(TRACE_HARNESS) + printf ( "SignalPeakDetectorReset low %d, high %d\n", + low_reset_value, high_reset_value ); + #endif +} + + +/* The following operations are implemented in hw_if.c: + ReadDelayCounters + ReadRiseTimeCounter + ResetDelayCounters + ResetPeakDetector + SetTriggerLevel + SetTestPulseLevel + GetVoltageStatus + Switch_SU_On + Switch_SU_Off + EnableAnalogSwitch + DisableAnalogSwitch + SelectSelfTestChannel + SelectTriggerSwitchLevel + SelectStartSwitchLevel +*/ + + +/* Accessing unaligned tm_ushort_t data */ + + +unsigned short int Short_Value ( tm_ushort_t *x ) +{ + unsigned short val; + wcc_memcpy ( &val, x, sizeof ( val ) ); + return val; +} + + +/* "Calling" a "patch function" */ + + +void Call_Patch ( fptr_t func ) +{ + #if defined(TRACE_HARNESS) + printf ( "Call_Patch 0x%x\n", ( code_address_t )func ); + #endif +} + + +/* Checking the sizes of some types */ + +#include "tm_data.h" + +static volatile uint_least8_t tsize_s; +static volatile uint_least16_t tsize_l; + +void Check_Type_Size ( void ) +/* + Disassemble the code of this function to see the sizes of + the types char, short, ..., science_data_file_t. + This function is never called. + +*/ +{ + tsize_s = sizeof ( char ); + tsize_s = sizeof ( short ); + tsize_s = sizeof ( int ); + tsize_s = sizeof ( long ); + + tsize_s = sizeof ( tm_ushort_t ); + tsize_s = sizeof ( dpu_time_t ); + tsize_s = sizeof ( tm_dpu_time_t ); + tsize_s = sizeof ( SU_settings_t ); + tsize_s = sizeof ( telemetry_data_t ); + + tsize_s = sizeof ( event_record_t ); + tsize_l = sizeof ( science_data_file_t ); +} + + +/* Test scenarios */ + +/* + These test cases are not intended as a full functional test. + They are intended to provide sufficient coverage for measurement- + based WCET analysis of the tested code. Built-in checks of test + execution (program state) are used only to check that the DEBIE + software has done the expected thing in each test case, but the + checks are definitely not exhaustive. + + Each test cases contributes measurements towards one of the + "analysis problems" defined for this benchmark. The macro + FOR_PROBLEM(P) is defined in problems.h and marks the start of + a test case to be included in problem P. Here P is an integer + number that identifies the analysis problem as follows: + + P Problem + -- ------- + 10 1 : TC interrupt handler + 21 2a: TM interrupt handler, most common case + 22 2b: TM interrupt handler, send internal time register + 23 2c: TM interrupt handler, end of TM + 31 3a: Hit Trigger interrupt handler, no ADC errors + 32 3b: Hit Trigger interrupt handler, at most one ADC error + 33 3c: Hit Trigger interrupt handler, any number of ADC errors + 41 4a: TC Execution task, general case + 42 4b: TC Execution task, start TC buffering, MSB + 43 4c: TC Execution task, start TC buffering, LSB + 44 4d: TC Execution task, buffer TC word + 51 5a: Acquisition task, science data not full + 52 5b: Acquisition task, science data full + 61 6a: Monitoring task, no hits or errors + 62 6b: Monitoring task, one hit during A/D conversion + 63 6c: Monitoring task, many hits during A/D conversion + 64 6d: Monitoring task, some SU error detected + 65 6e: Monitoring task, any number of hits and errors + + The macro END_PROBLEM is also defined in problems.h and marks + the end of execution of a case belonging to the problem named + by the most recently executed FOR_PROBLEM. Note that more cases + for the same problem can be added later with another FOR_PROBLEM. +*/ + +#define Prob1 10 + +#define Prob2a 21 +#define Prob2b 22 +#define Prob2c 23 + +#define Prob3a 31 +#define Prob3b 32 +#define Prob3c 33 + +#define Prob4a 41 +#define Prob4b 42 +#define Prob4c 43 +#define Prob4d 44 + +#define Prob5a 51 +#define Prob5b 52 + +#define Prob6a 61 +#define Prob6b 62 +#define Prob6c 63 +#define Prob6d 64 +#define Prob6e 65 + +#include "problems.h" + +#if defined(TRACE_HARNESS) +#define CASE(TXT) printf ("\nCASE: %s:\n\n", TXT) +#else +#define CASE(TXT) +#endif + + +static int checks = 0; +/* Counts the number of checks done in Check/Zero/Nonzero. */ + +static int check_errors = 0; +/* Counts the number of errors found in Check/Zero/Nonzero. */ + + +static void Report_Checks ( void ) +/* Print number of checks and check-errors. */ +{ + TARGET_MARK; + #if defined(TRACE_HARNESS) + printf ( "Total checks done %d, failed %d\n", checks, check_errors ); + #endif +} + + +static void Fail_Check ( char *message ) +/* Reports a failed check. */ +{ + check_errors ++; + #if defined(TRACE_HARNESS) + printf ( "%s: FAILED (#%d)\n", message, check_errors ); + #endif +} + + +static void Check_Zero ( int cond ) +/* Checks that cond == 0. */ +{ + checks ++; + if ( cond ) + Fail_Check( "Check_Zero" ); +} + + +static void Check_Nonzero ( int cond ) +/* Checks that cond != 0. */ +{ + checks ++; + if ( cond == 0 ) + Fail_Check ( "Check_Nonzero" ); +} + + +#define Check Check_Nonzero +/* Check that the (boolean) parameter is true (not zero). */ + + +static void Check_No_Errors ( void ) +/* Checks that no errors are flagged in telemetry_data.error_status. */ +{ + Check_Zero ( telemetry_data.error_status ); +} + + +static void TC_Interrupt ( void ) +/* Runs the TC Interrupt Service. */ +{ + FOR_PROBLEM( Prob1 ); + TC_InterruptService(); + END_PROBLEM; +} + + +static void Send_TC ( unsigned char address, unsigned char code ) +/* Invokes TC_InterruptService with a TC composed of the + given address and code, provided with valid (even) parity. +*/ +{ + unsigned char par; + /* The parity. */ + + /* Encode the address and code in the TC interface registers: */ + + tc_msb = address << 1; + tc_lsb = code; + + /* Generate the even parity bit: */ + + par = tc_msb ^ tc_lsb; + par = ( par & 0x0F ) ^ ( par >> 4 ); + par = ( par & 0x03 ) ^ ( par >> 2 ); + par = ( par & 0x01 ) ^ ( par >> 1 ); + + tc_msb |= par; + + tc_word = ( tc_msb << 8 ) | tc_lsb; + + /* Invoke the TC ISR: */ + + tc_timer_overflow = 1; + + TC_Interrupt (); +} + + +static void Send_TC_Word ( uint_least16_t word ) +/* Invokes TC_InterruptService with the given TC word, + exactly as given. +*/ +{ + /* Set the high and low TC bytes: */ + + tc_msb = ( word >> 8 ) & 0xff; + tc_lsb = word & 0xff; + + tc_word = ( tc_msb << 8 ) | tc_lsb; + + /* Invoke the TC ISR: */ + + tc_timer_overflow = 1; + + TC_Interrupt (); +} + +static void TC_ISR_Tests ( void ) +/* Test of TC_InterruptService. */ +{ + + #if defined(TRACE_HARNESS) + printf ( "\nTC_ISR_Tests\n" ); + #endif + + CASE( "TC rejected because timer overflow is not set" ); + + tc_timer_overflow = 0; + TC_Interrupt (); + + CASE( "TC rejected because TC_state is SC_TM_e" ); + + TC_state = SC_TM_e; + Send_TC ( 0, 0 ); + + CASE( "TC rejected because TC_state is memory_dump_e" ); + + TC_state = memory_dump_e; + Send_TC ( 0, 0 ); + + CASE( "TC in TC_state = memory_patch_e" ); + + TC_state = memory_patch_e; + Send_TC ( 0, 0 ); + Check ( mail_count[ TCTM_MAILBOX ] == 1 ); + FlushMail ( TCTM_MAILBOX ); + + CASE( "TC with parity error" ); + + TC_state = TC_handling_e; + tc_timer_overflow = 1; + tc_msb = 0; + tc_lsb = 1; + tc_word = 1; + TC_Interrupt (); + + Check_Nonzero ( telemetry_data.error_status & PARITY_ERROR ); + + CASE( "TC = ERROR_STATUS_CLEAR, ok" ); + + Send_TC ( ERROR_STATUS_CLEAR, ERROR_STATUS_CLEAR ); + + /* The parity-error flag is not yet reset, because */ + /* the TC was not yet executed: */ + + Check_Nonzero ( telemetry_data.error_status & PARITY_ERROR ); + + Check ( mail_count[ TCTM_MAILBOX ] == 1 ); + FlushMail ( TCTM_MAILBOX ); + + /* Clear the error manually: */ + + telemetry_data.error_status = 0; + + Check_No_Errors (); + + CASE( "TC = SEND_STATUS_REGISTER, ok" ); + + Send_TC ( SEND_STATUS_REGISTER, 8 ); + + Check_No_Errors (); + Check ( TC_state == register_TM_e ); + Check ( mail_count[ TCTM_MAILBOX ] == 1 ); + FlushMail ( TCTM_MAILBOX ); + + + CASE( "TC type ALL_INVALID" ); + + /* An invalid TC code: */ + + Send_TC ( 4, 4 ); + + Check ( telemetry_data.error_status == TC_ERROR ); + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + telemetry_data.error_status = 0; + + CASE( "TC type ONLY_EQUAL, fail" ); + + Send_TC ( ERROR_STATUS_CLEAR, ~ERROR_STATUS_CLEAR ); + + Check ( telemetry_data.error_status == TC_ERROR ); + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + telemetry_data.error_status = 0; + + CASE ( "TC type ON_OFF_TC, fail" ); + + /* Neither ON_VALUE nor OFF_VALUE nor SELF_TEST. */ + + Send_TC ( SWITCH_SU_3, 0x3F ); + + Check ( telemetry_data.error_status == TC_ERROR ); + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + telemetry_data.error_status = 0; + + CASE ( "TC type ONLY_EVEN, fail (odd)" ); + + Send_TC ( SEND_STATUS_REGISTER, 5 ); + + Check ( TC_state == TC_handling_e ); + Check ( telemetry_data.error_status == TC_ERROR ); + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + telemetry_data.error_status = 0; + + CASE ( "TC type ONLY_EVEN, fail (too large)" ); + + Send_TC ( SEND_STATUS_REGISTER, LAST_EVEN + 2 ); + + Check ( TC_state == TC_handling_e ); + Check ( telemetry_data.error_status == TC_ERROR ); + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + telemetry_data.error_status = 0; + + + /* Other tests of TC ISR: + TC in TC_state = register_TM_e: See TM_Tests. + */ +} + + +static void Handle_TC ( int problem ) +/* Checks that the TC mailbox has a message, then invokes + HandleTelecommand to handle (usually, execute) the message. + The problem parameter shows in which analysis problem the + HandleTelecommand should be included. +*/ +{ + Check ( mail_count[ TCTM_MAILBOX ] == 1 ); + + FOR_PROBLEM( problem ); + HandleTelecommand (); + END_PROBLEM; + + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); +} + + +static void Exec_TC ( + unsigned char address, unsigned char code, + int problem ) +/* Invokes TC_InterruptService with a TC composed of the + given address and code, provided with valid (even) parity, + then invokes HandleTelecommand to execute the TC. + The problem parameter shows in which analysis problem the + HandleTelecommand should be included. +*/ +{ + Send_TC ( address, code ); + Handle_TC ( problem ); +} + + +static void Send_Patch_Code ( + uint16_t address, + unsigned char *checksum ) +/* Sends the multi-word TC to patch code memory at the given address, + with some arbitary contents. Returns the checksum of the patch, + for use in the final word of the TC, which is not sent here. +*/ +{ + uint_least8_t i; + unsigned char sum; + + /* Send the patch address: */ + + Exec_TC ( WRITE_CODE_MEMORY_MSB, ( address >> 8 ) & 0xff, Prob4b ); + + sum = ( tc_word >> 8 ) ^ ( tc_word & 0xff ); + + Check_No_Errors (); + Check ( TC_state == write_memory_e ); + + Exec_TC ( WRITE_CODE_MEMORY_LSB, address & 0xff, Prob4c ); + + sum ^= ( tc_word >> 8 ) ^ ( tc_word & 0xff ); + + Check_No_Errors (); + Check ( TC_state == memory_patch_e ); + + /* Send the patch contents, 16 words = 32 octets: */ + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; i++ ) { + Send_TC_Word ( ( ( uint_least16_t ) i ) << 6 ); + sum ^= ( tc_word >> 8 ) ^ ( tc_word & 0xff ); + Handle_TC ( Prob4d ); + } + + /* The last word remains to be sent. */ + + *checksum = sum; +} + + +static void Send_Patch_Data ( + uint16_t address, + unsigned char *checksum ) +/* Sends the multi-word TC to patch data memory at the given address, + with some arbitary contents. Returns the checksum of the patch, + for use in the final word of the TC, which is not sent here. +*/ +{ + uint_least8_t i; + unsigned char sum; + + /* Send the patch address: */ + + Exec_TC ( WRITE_DATA_MEMORY_MSB, ( address >> 8 ) & 0xff, Prob4b ); + + sum = ( tc_word >> 8 ) ^ ( tc_word & 0xff ); + + Check_No_Errors (); + Check ( TC_state == write_memory_e ); + + Exec_TC ( WRITE_DATA_MEMORY_LSB, address & 0xff, Prob4c ); + + sum ^= ( tc_word >> 8 ) ^ ( tc_word & 0xff ); + + Check_No_Errors (); + Check ( TC_state == memory_patch_e ); + + /* Send the patch contents, 16 words = 32 octets: */ + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; i++ ) { + Send_TC_Word ( ( ( uint_least16_t ) i ) << 6 ); + sum ^= ( tc_word >> 8 ) ^ ( tc_word & 0xff ); + Handle_TC ( Prob4d ); + } + + /* The last word remains to be sent. */ + + *checksum = sum; +} + + +static void Read_Data_Memory ( uint16_t address ) +/* Sends the TC to read 32 octets of data memory, starting at + the given address, receives the corresponding TM block, and + handles the TM_READY message to the TC Execution task. +*/ +{ + uint_least8_t i; + + Exec_TC ( READ_DATA_MEMORY_MSB, ( address >> 8 ) & 0xff, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == read_memory_e ); + + Exec_TC ( READ_DATA_MEMORY_LSB, address & 0xff, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == memory_dump_e ); + + /* The 16 first words of data: */ + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; i++ ) { + Check ( telemetry_pointer < telemetry_end_pointer ); + + /* The first TM IT, below, acknowledges the immediate TC + response and transmits the first data word. + */ + + FOR_PROBLEM( Prob2a ); + TM_InterruptService (); + END_PROBLEM; + + Check ( TC_state == memory_dump_e ); + } + + /* The last word, with the checksum: */ + + Check ( telemetry_pointer == telemetry_end_pointer ); + + /* The TM IT below acknowledges the last data word and + transmits the very last word of the Read Data Memory + sequence, containing the data checksum. + */ + + FOR_PROBLEM( Prob2c ); + TM_InterruptService (); + END_PROBLEM; + + /* The TM_READY message: */ + + Handle_TC ( Prob1 ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); + + /* There is a design error in TM_InterruptService: + when the Read Data Memory sequence ends, with the + transmission of the checksum word, the TM IT is + left enabled. If the TC Execution task does not + react quickly to the TM_READY message, and disable + the TM IT before the transmission of the checksum + word is completed, a new TM IT can invoke + TM_InterruptService once again, sending the checksum + word a second time, and perhaps a third time etc. + */ +} + + +void Clear_Errors ( void ) +/* Executes the ERROR_STATUS_CLEAR TC. */ +{ + Exec_TC ( ERROR_STATUS_CLEAR, ERROR_STATUS_CLEAR, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); +} + + +static void TC_Task_Tests ( void ) +/* Test of TelecommandExecutionTask. */ +{ + unsigned char chsum; + + #if defined(TRACE_HARNESS) + printf ( "\nTC_Task_Tests\n" ); + #endif + + CASE( "TC = ERROR_STATUS_CLEAR, ok" ); + + /* Flag an error manually: */ + telemetry_data.error_status = PARITY_ERROR; + + Send_TC ( ERROR_STATUS_CLEAR, ERROR_STATUS_CLEAR ); + + /* The parity-error flag is not yet reset, because */ + /* the TC was not yet executed: */ + + Check_Nonzero ( telemetry_data.error_status & PARITY_ERROR ); + + Handle_TC ( Prob4a ); + + /* Now the parity-error flag is reset: */ + + Check_No_Errors (); + + CASE( "TC to set SU parameters" ); + + Exec_TC ( SET_SU_1_PLASMA_1P_THRESHOLD, 23, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1P_THRESHOLD, 26, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1P_THRESHOLD, 32, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1P_THRESHOLD, 102, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1M_THRESHOLD, 205, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1M_THRESHOLD, 123, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1M_THRESHOLD, 99, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1M_THRESHOLD, 1, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PIEZO_THRESHOLD, 14, Prob4a ); + Exec_TC ( SET_SU_2_PIEZO_THRESHOLD, 54, Prob4a ); + Exec_TC ( SET_SU_3_PIEZO_THRESHOLD, 74, Prob4a ); + Exec_TC ( SET_SU_4_PIEZO_THRESHOLD, 104, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1P_CLASS_LEVEL, 104, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1P_CLASS_LEVEL, 204, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1P_CLASS_LEVEL, 214, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1P_CLASS_LEVEL, 234, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1M_CLASS_LEVEL, 104, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1M_CLASS_LEVEL, 88, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1M_CLASS_LEVEL, 66, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1M_CLASS_LEVEL, 33, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_2P_CLASS_LEVEL, 61, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_2P_CLASS_LEVEL, 21, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_2P_CLASS_LEVEL, 81, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_2P_CLASS_LEVEL, 11, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PIEZO_1_CLASS_LEVEL, 14, Prob4a ); + Exec_TC ( SET_SU_2_PIEZO_1_CLASS_LEVEL, 24, Prob4a ); + Exec_TC ( SET_SU_3_PIEZO_1_CLASS_LEVEL, 33, Prob4a ); + Exec_TC ( SET_SU_4_PIEZO_1_CLASS_LEVEL, 77, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PIEZO_2_CLASS_LEVEL, 14, Prob4a ); + Exec_TC ( SET_SU_2_PIEZO_2_CLASS_LEVEL, 14, Prob4a ); + Exec_TC ( SET_SU_3_PIEZO_2_CLASS_LEVEL, 14, Prob4a ); + Exec_TC ( SET_SU_4_PIEZO_2_CLASS_LEVEL, 14, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1E_1I_MAX_TIME, 191, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1E_1I_MAX_TIME, 171, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1E_1I_MAX_TIME, 161, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1E_1I_MAX_TIME, 151, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1E_PZT_MIN_TIME, 11, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1E_PZT_MIN_TIME, 22, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1E_PZT_MIN_TIME, 33, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1E_PZT_MIN_TIME, 44, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1E_PZT_MAX_TIME, 111, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1E_PZT_MAX_TIME, 122, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1E_PZT_MAX_TIME, 133, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1E_PZT_MAX_TIME, 144, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1I_PZT_MIN_TIME, 11, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1I_PZT_MIN_TIME, 10, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1I_PZT_MIN_TIME, 9, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1I_PZT_MIN_TIME, 8, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_SU_1_PLASMA_1I_PZT_MAX_TIME, 211, Prob4a ); + Exec_TC ( SET_SU_2_PLASMA_1I_PZT_MAX_TIME, 210, Prob4a ); + Exec_TC ( SET_SU_3_PLASMA_1I_PZT_MAX_TIME, 209, Prob4a ); + Exec_TC ( SET_SU_4_PLASMA_1I_PZT_MAX_TIME, 208, Prob4a ); + + Check_No_Errors (); + + CASE( "TC to set classification coefficients" ); + + Exec_TC ( SET_COEFFICIENT_1, 1, Prob4a ); + Exec_TC ( SET_COEFFICIENT_2, 2, Prob4a ); + Exec_TC ( SET_COEFFICIENT_3, 3, Prob4a ); + Exec_TC ( SET_COEFFICIENT_4, 4, Prob4a ); + Exec_TC ( SET_COEFFICIENT_5, 5, Prob4a ); + + Check_No_Errors (); + + CASE( "TC to patch code memory, call patch" ); + + Send_Patch_Code ( 0x1100, &chsum ); + + chsum ^= 0x5A; /* Call patch function. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x5A00 | chsum ); + Handle_TC ( Prob4a ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); + + CASE( "TC to patch code memory, no action" ); + + Send_Patch_Code ( 0x1300, &chsum ); + + chsum ^= 0x00; /* No action. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x0000 | chsum ); + Handle_TC ( Prob4a ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); + + CASE( "TC to patch code memory, soft reset" ); + + Send_Patch_Code ( 0x1400, &chsum ); + + chsum ^= 0x09; /* Sof Reset. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x0900 | chsum ); + Handle_TC ( Prob4a ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); + + CASE( "TC to patch code memory, warm reset" ); + + Send_Patch_Code ( 0x2100, &chsum ); + + chsum ^= 0x37; /* Soft Reset. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x3700 | chsum ); + Handle_TC ( Prob4a ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); + + CASE( "TC to patch code memory, invalid action" ); + + Send_Patch_Code ( 0x2400, &chsum ); + + chsum ^= 0x62; /* Invalid. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x6200 | chsum ); + Handle_TC ( Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch code memory, invalid address" ); + + Send_Patch_Code ( 0x0fff, &chsum ); + + chsum ^= 0x00; /* No action. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x0000 | chsum ); + Handle_TC ( Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch code memory, checksum error" ); + + Send_Patch_Code ( 0x1200, &chsum ); + + chsum ^= 0x5A; /* Correct checksum. */ + chsum ^= 0xff; /* Wrong checksum. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x5A00 | chsum ); + Handle_TC ( Prob4a ); + + Check_Nonzero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + Check ( TC_state == TC_handling_e ); + + Clear_Errors (); + + CASE( "TC to patch code, TC sequence error at first word" ); + + Exec_TC ( WRITE_CODE_MEMORY_LSB, 0x32, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch code, TC sequence error at second word" ); + + Exec_TC ( WRITE_CODE_MEMORY_MSB, 0x32, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == write_memory_e ); + + Exec_TC ( CLEAR_WATCHDOG_FAILURES, CLEAR_WATCHDOG_FAILURES, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch data memory" ); + + Send_Patch_Data ( 0x2200, &chsum ); + + chsum ^= 0x11; /* Irrelevant for data patch. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x1100 | chsum ); + Handle_TC ( Prob4a ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Check_No_Errors (); + Check ( TC_state == TC_handling_e ); + + CASE( "TC to patch data memory, address error" ); + + Send_Patch_Data ( 0xfef0, &chsum ); + + chsum ^= 0x11; /* Irrelevant for data patch. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x1100 | chsum ); + Handle_TC ( Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch data memory, TC sequence error at first word" ); + + Exec_TC ( WRITE_DATA_MEMORY_LSB, 0x32, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch data memory, TC sequence error at second word" ); + + Exec_TC ( WRITE_DATA_MEMORY_MSB, 0x32, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == write_memory_e ); + + Exec_TC ( CLEAR_WATCHDOG_FAILURES, CLEAR_WATCHDOG_FAILURES, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Clear_Errors (); + + CASE( "TC to patch data memory, checksum error" ); + + Send_Patch_Data ( 0x2300, &chsum ); + + chsum ^= 0x11; /* Correct checksum. */ + chsum ^= 0xff; /* Wrong checksum. */ + + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Send_TC_Word ( 0x1100 | chsum ); + Handle_TC ( Prob4a ); + + Check_Nonzero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + Check ( TC_state == TC_handling_e ); + + Clear_Errors (); + + CASE( "TC to patch data memory, time-out on TC word reception" ); + + Send_Patch_Data ( 0x2200, &chsum ); + + chsum ^= 0x11; /* Irrelevant for data patch. */ + + Check ( TC_state == memory_patch_e ); + Check_Zero ( telemetry_data.mode_status & MEMORY_WRITE_ERROR ); + + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + + /* Empty mailbox => WaitMail signals "time-out". */ + + FOR_PROBLEM( Prob4a ); + HandleTelecommand (); + END_PROBLEM; + + Check ( TC_state == TC_handling_e ); + Check ( telemetry_data.error_status == TC_ERROR ); + + Clear_Errors (); + + CASE( "TC timeout during TC handling, normal" ); + + Check ( mail_count[ TCTM_MAILBOX ] == 0 ); + + /* Empty mailbox => WaitMail signals "time-out". */ + + FOR_PROBLEM( Prob4a ); + HandleTelecommand (); + END_PROBLEM; + + Check ( TC_state == TC_handling_e ); + Check_No_Errors (); + + CASE( "TC to read data memory" ); + + Read_Data_Memory ( 0x2041 ); + + CASE( "TC to read data memory, address error" ); + + Exec_TC ( READ_DATA_MEMORY_MSB, 0xfe, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == read_memory_e ); + + Exec_TC ( READ_DATA_MEMORY_LSB, 0xf0, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Clear_Errors (); + + CASE( "TC to read data memory, TC sequence error at first word" ); + + Exec_TC ( READ_DATA_MEMORY_LSB, 0xfe, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Clear_Errors (); + + CASE( "TC to read data memory, TC sequence error at second word" ); + + Exec_TC ( READ_DATA_MEMORY_MSB, 0xab, Prob4a ); + + Check_No_Errors (); + Check ( TC_state == read_memory_e ); + + Exec_TC ( CLEAR_WATCHDOG_FAILURES, CLEAR_WATCHDOG_FAILURES, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Clear_Errors (); + + CASE( "TC = CLEAR_WATCHDOG_FAILURES" ); + + telemetry_data.watchdog_failures = 3; + + Exec_TC ( CLEAR_WATCHDOG_FAILURES, CLEAR_WATCHDOG_FAILURES, Prob4a ); + + Check_No_Errors (); + Check_Zero ( telemetry_data.watchdog_failures ); + + CASE( "TC = CLEAR_CHECKSUM_FAILURES" ); + + telemetry_data.checksum_failures = 9; + + Exec_TC ( CLEAR_CHECKSUM_FAILURES, CLEAR_CHECKSUM_FAILURES, Prob4a ); + + Check_No_Errors (); + Check_Zero ( telemetry_data.checksum_failures ); + + CASE( "TC to set DEBIE time" ); + + Exec_TC ( SET_TIME_BYTE_3, 0x44, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_2, 0x33, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_1, 0x22, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_0, 0x11, Prob4a ); + + Check_No_Errors (); + + Check ( internal_time == 0x44332211 ); + + CASE( "TC to set DEBIE time, sequence error at byte 2" ); + + internal_time = 0x01122334; + + Exec_TC ( SET_TIME_BYTE_3, 0x44, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_1, 0x33, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check ( internal_time == 0x44000000 ); + + Clear_Errors (); + + CASE( "TC to set DEBIE time, sequence error at byte 1" ); + + internal_time = 0x01122334; + + Exec_TC ( SET_TIME_BYTE_3, 0x44, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_2, 0x33, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_0, 0x22, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check ( internal_time == 0x44330000 ); + + Clear_Errors (); + + CASE( "TC to set DEBIE time, sequence error at byte 0" ); + + internal_time = 0x01122334; + + Exec_TC ( SET_TIME_BYTE_3, 0x44, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_2, 0x33, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_1, 0x22, Prob4a ); + + Check_No_Errors (); + + Exec_TC ( SET_TIME_BYTE_2, 0x11, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check ( internal_time == 0x44332200 ); + + Clear_Errors (); + + CASE( "TC = SOFT_RESET" ); + + Exec_TC ( SOFT_RESET, SOFT_RESET, Prob4a ); + + Check_No_Errors (); + + CASE( "TC = STOP_ACQUISITION in STAND_BY, fail" ); + + Check ( GetMode() == STAND_BY ); + + Exec_TC ( STOP_ACQUISITION, STOP_ACQUISITION, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + Check ( GetMode() == STAND_BY ); + + Clear_Errors (); + + /* Telecommands tested elsewhere: + + ERROR_STATUS_CLEAR See TC_ISR_Tests, TM_Tests, others. + SEND_STATUS_REGISTER See TM_Tests. + SEND_SCIENCE_DATA_FILE See TM_Tests, Acquisition_Tests. + START_ACQUISITION See Acquisition_Tests. + STOP_ACQUISITION See Acquisition_Tests. + SWITCH_SU_1/2/3/4 See Acquisition_Tests, SU_Self_Test_Tests. + TM_READY message See TM_Tests. + */ +} + + +void Monitor_Health ( int problem ) +/* Executes HandleHealthMonitoring for a particular analysis problem. */ +{ + start_conversion_count = 0; + end_of_adc_count = 0; + + FOR_PROBLEM( problem ); + HandleHealthMonitoring(); + END_PROBLEM; + + Report_Start_Conversion_Count ( problem ); + Report_End_Of_ADC_Count ( problem ); +} + + +void Monitoring_Task_Tests ( void ) +/* Tests of the Health Monitoring task. */ +{ + int sec; + int tot_errors, max_errors = 20; + + /* Reset all cycles: */ + + health_mon_round = HEALTH_COUNT ; + temp_meas_count = TEMP_COUNT ; + voltage_meas_count = VOLTAGE_COUNT; + checksum_count = CHECK_COUNT ; + + Set_AD_Nominal (); + /* To avoid monitoring alarms. */ + + CASE( "Monitoring without errors or interrupting hits" ); + + /* A/D conversions ready on second poll: */ + Set_AD_Delay ( 2 ); + + Check ( health_mon_round == HEALTH_COUNT ); + Check ( temp_meas_count == TEMP_COUNT ); + Check ( voltage_meas_count == VOLTAGE_COUNT ); + Check ( checksum_count == CHECK_COUNT ); + + /* The first 9 seconds: */ + + _Pragma( "loopbound min 9 max 9" ) + for ( sec = 1; sec <= 9; sec ++ ) { + Monitor_Health ( Prob6a ); + + Check ( health_mon_round == HEALTH_COUNT - sec ); + Check ( temp_meas_count == TEMP_COUNT ); + Check ( voltage_meas_count == VOLTAGE_COUNT ); + Check ( checksum_count == CHECK_COUNT - sec ); + } + + /* The 10th second: */ + + Monitor_Health ( Prob6a ); + + Check ( health_mon_round == HEALTH_COUNT ); + Check ( temp_meas_count == TEMP_COUNT - 1 ); + Check ( voltage_meas_count == VOLTAGE_COUNT - 1 ); + Check ( checksum_count == CHECK_COUNT - 10 ); + + /* The remaining 170 seconds of the full period: */ + + _Pragma( "loopbound min 170 max 170" ) + for ( sec = 11; sec <= 180; sec ++ ) + Monitor_Health ( Prob6a ); + + Check ( health_mon_round == HEALTH_COUNT ); + Check ( temp_meas_count == TEMP_COUNT ); + Check ( voltage_meas_count == VOLTAGE_COUNT ); + Check ( checksum_count == CHECK_COUNT ); + + Check_No_Errors (); + + + CASE( "Monitoring without errors, at most one interrupting hit" ); + + total_adc_hits = 0; + + _Pragma( "loopbound min 180 max 180" ) + for ( sec = 1; sec <= 180; sec ++ ) { + max_adc_hits = 1; + Monitor_Health ( Prob6b ); + } + + #if defined(TRACE_HARNESS) + printf ( "Total hits %d\n", total_adc_hits ); + #endif + + Check_Nonzero ( total_adc_hits ); + + Check ( health_mon_round == HEALTH_COUNT ); + Check ( temp_meas_count == TEMP_COUNT ); + Check ( voltage_meas_count == VOLTAGE_COUNT ); + Check ( checksum_count == CHECK_COUNT ); + + Check_No_Errors (); + + CASE( "Monitoring without errors, many interrupting hits" ); + + total_adc_hits = 0; + + _Pragma( "loopbound min 180 max 180" ) + for ( sec = 1; sec <= 180; sec ++ ) { + max_adc_hits = HIT_BUDGET_DEFAULT; + Monitor_Health ( Prob6c ); + } + + #if defined(TRACE_HARNESS) + printf ( "Total hits %d\n", total_adc_hits ); + #endif + + Check_Nonzero ( total_adc_hits ); + + Check ( health_mon_round == HEALTH_COUNT ); + Check ( temp_meas_count == TEMP_COUNT ); + Check ( voltage_meas_count == VOLTAGE_COUNT ); + Check ( checksum_count == CHECK_COUNT ); + + Check_No_Errors (); + + CASE( "Monitoring with SU errors, no interrupting hits" ); + + Set_AD_Unlimited (); + max_adc_hits = 0; + + tot_errors = 0; + + _Pragma( "loopbound min 106 max 106" ) + do { + if ( tot_errors == 4 ) check_current_errors = 5; + + if ( tot_errors == max_errors - 1 ) v_down_errors = 1; + /* The V_DOWN error has a dramatic effect, so + we save it for last. + */ + + _Pragma( "loopbound min 180 max 180" ) + for ( sec = 1; sec <= 180; sec ++ ) + Monitor_Health ( Prob6d ); + + if ( telemetry_data.error_status != 0 ) { + tot_errors ++; + + #if defined(TRACE_HARNESS) + printf ( "Monitoring (6d) error %d, error status %x\n", + tot_errors, telemetry_data.error_status ); + #endif + Clear_Errors (); + } + } while ( tot_errors < max_errors ); + + Check_No_Errors (); + + CASE( "Monitoring with any kind of error and interrupting hit" ); + + Set_AD_Unlimited (); + + tot_errors = 0; + + _Pragma( "loopbound min 64 max 64" ) + do { + if ( tot_errors == 4 ) check_current_errors = 5; + + if ( tot_errors == max_errors - 1 ) v_down_errors = 1; + /* The V_DOWN error has a dramatic effect, so + we save it for last. + */ + + _Pragma( "loopbound min 180 max 180" ) + for ( sec = 1; sec <= 180; sec ++ ) { + max_adc_hits = HIT_BUDGET_DEFAULT; + if ( sec > 2 * tot_errors ) ad_random_failures = 2; + Monitor_Health ( Prob6e ); + } + + if ( telemetry_data.error_status != 0 ) { + tot_errors ++; + + #if defined(TRACE_HARNESS) + printf ( "Monitoring (6e) error %d, error status %x\n", + tot_errors, telemetry_data.error_status ); + #endif + Clear_Errors (); + } + } while ( tot_errors < max_errors ); + + Check_No_Errors (); +} + + +void TM_Tests ( void ) +/* Test of TM_InterruptService and telemetry functionality. */ +{ + int octets; + /* Number of octets sent and acknowledge by TM interrupt. */ + + #if defined(TRACE_HARNESS) + printf ( "\nTM_ISR_Tests\n" ); + #endif + + CASE( "One whole round of register TM" ); + + Send_TC ( SEND_STATUS_REGISTER, 0 ); + + Check_No_Errors (); + Check ( TC_state == register_TM_e ); + + Handle_TC ( Prob4a ); + + Check ( TC_state == register_TM_e ); + + _Pragma( "loopbound min 62 max 62" ) + for ( octets = 0; octets < sizeof ( telemetry_data_t ); octets += 2 ) { + + if ( telemetry_pointer != ( unsigned char * ) &telemetry_data.time ) { + FOR_PROBLEM( Prob2a ); + TM_InterruptService (); + END_PROBLEM; + } else { + FOR_PROBLEM( Prob2b ); + TM_InterruptService (); + END_PROBLEM; + } + + Check ( TC_state == register_TM_e ); + } + + CASE( "Partial register TM, stop by TC" ); + + Send_TC ( SEND_STATUS_REGISTER, 22 ); + + Check_No_Errors (); + Check ( TC_state == register_TM_e ); + + Handle_TC ( Prob4a ); + + Check ( TC_state == register_TM_e ); + + _Pragma( "loopbound min 20 max 20" ) + for ( octets = 0; octets < 40; octets += 2 ) { + + if ( telemetry_pointer != ( unsigned char * ) &telemetry_data.time ) { + FOR_PROBLEM( Prob2a ); + TM_InterruptService (); + END_PROBLEM; + } else { + FOR_PROBLEM( Prob2b ); + TM_InterruptService (); + END_PROBLEM; + } + + Check ( TC_state == register_TM_e ); + } + + Send_TC ( ERROR_STATUS_CLEAR, ERROR_STATUS_CLEAR ); + + Check ( TC_state == TC_handling_e ); + + Handle_TC ( Prob4a ); + + Check_No_Errors (); + + CASE( "Science Data TM" ); + + Send_TC ( SEND_SCIENCE_DATA_FILE, SEND_SCIENCE_DATA_FILE ); + + Check_No_Errors (); + Check ( TC_state == SC_TM_e ); + + Handle_TC ( Prob4a ); + + Check ( TC_state == SC_TM_e ); + + /* Absorb TM until a TM_READY message is sent to the TC task: */ + + octets = 0; + + _Pragma( "loopbound min 22 max 22" ) + while ( mail_count[ TCTM_MAILBOX ] == 0 ) { + if ( telemetry_pointer < telemetry_end_pointer ) { + FOR_PROBLEM( Prob2a ); + TM_InterruptService (); + END_PROBLEM; + } else { + FOR_PROBLEM( Prob2c ); + TM_InterruptService (); + END_PROBLEM; + } + + octets += 2; + Check ( TC_state == SC_TM_e ); + } + + #if defined(TRACE_HARNESS) + printf ( "Science TM octets sent %d\n", octets ); + #endif + + /* Handle the TM_READY message: */ + + Handle_TC ( Prob4a ); + + Check ( TC_state == TC_handling_e ); + + /* TM tests elsewhere: + End of memory-dump TM : See Read_Data_Memory and TC_Task_Tests. + Science Data TM (also): See Acquisition_Tests. + */ +} + + +static void Trigger_Hit ( int problem ) +/* Invoke HandleHitTrigger. + The problem parameter defines the analysis problem for this test. +*/ +{ + Check ( mail_count[ ACQUISITION_MAILBOX ] == 0 ); + + #if defined(TRACE_HARNESS) + printf ( "Hit!\n" ); + #endif + + FOR_PROBLEM( problem ); + + HandleHitTrigger (); + + END_PROBLEM; + + #if defined(TRACE_HARNESS) + if ( mail_count[ ACQUISITION_MAILBOX ] == 0 ) + printf ( "- hit rejected\n" ); + else + printf ( "- hit accepted\n" ); + #endif +} + + +static void Trigger_SU_Hit ( + sensor_index_t SU, + int problem ) +/* Invoke HandleHitTrigger with the given SU in trigger_source_0/1. + The problem parameter defines the analysis problem for this test. +*/ +{ + Set_Trigger_SU ( SU ); + Trigger_Hit ( problem ); +} + + +static void Acquire_Hit ( + int hit_problem, + int acq_problem ) +/* Invoke HandleHitTrigger followed by HandleAcquisition if the hit + was accepted in the ISR. The problem parameters define the analysis + problems for this test, separately for the Hit Trigger ISR and + for the Acquisition task. +*/ +{ + Trigger_Hit ( hit_problem ); + + if ( mail_count[ ACQUISITION_MAILBOX ] > 0 ) { + FOR_PROBLEM( acq_problem ); + HandleAcquisition (); + END_PROBLEM; + } +} + + +static void Hit_ISR_Tests ( void ) +/* Test of HandleHitTrigger. */ +{ + sensor_index_t su; + + #if defined(TRACE_HARNESS) + printf ( "\nHit_ISR_Tests\n" ); + #endif + + /* Reset the historical record: */ + + telemetry_data.hit_budget_exceedings = 0; + + /* Test: */ + + CASE( "Hit Trigger, budget exhausted" ); + + Check ( telemetry_data.hit_budget_exceedings == 0 ); + + hit_budget_left = 0; + + /* Once: */ + + Trigger_SU_Hit ( 0, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 0 ); + + Check ( telemetry_data.hit_budget_exceedings == 1 ); + + /* Once more: */ + + Trigger_SU_Hit ( 1, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 0 ); + + Check ( telemetry_data.hit_budget_exceedings == 2 ); + + CASE( "Hit Trigger, budget exhausted for the 255th and 256th time" ); + + telemetry_data.hit_budget_exceedings = 254; + + hit_budget_left = 0; + + /* 255th time: */ + + Trigger_SU_Hit ( 3, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 0 ); + + Check ( telemetry_data.hit_budget_exceedings == 255 ); + + /* 256th time: */ + + Trigger_SU_Hit ( 1, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 0 ); + + Check ( telemetry_data.hit_budget_exceedings == 255 ); + + CASE( "Hit Trigger, budget left, no A/D errors" ); + + hit_budget_left = 15; + + Set_AD_Delay ( 2 ); + ad_conv_num = 0; + + _Pragma( "loopbound min 4 max 4" ) + for ( su = 0; su < NUM_SU; su ++ ) { + Trigger_SU_Hit ( su, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( mail_message[ ACQUISITION_MAILBOX ] == su + 1 ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + Check ( hit_budget_left == 15 - NUM_SU ); + + CASE( "Hit Trigger, budget left, no A/D errors, SU self test ok" ); + + _Pragma( "loopbound min 4 max 4" ) + for ( su = 0; su < NUM_SU; su++ ) { + /* Right self test pulse: */ + + self_test_SU_number = su + 1; + + SU_state[ su ] = self_test_trigger_e; + + Trigger_SU_Hit ( su, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( mail_message[ ACQUISITION_MAILBOX ] == self_test_SU_number ); + + Check ( SU_state[ su ] == self_test_e ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + CASE( "Hit Trigger, budget left, no A/D errors, SU self test wrong" ); + + _Pragma( "loopbound min 4 max 4" ) + for ( su = 0; su < NUM_SU; su++ ) { + /* Wrong self test pulse: */ + + self_test_SU_number = su + 1; + + SU_state[ su ] = self_test_e; + + Trigger_SU_Hit ( su, Prob3a ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( + mail_message[ ACQUISITION_MAILBOX ] + == ( self_test_SU_number | HIT_SELF_TEST_RESET ) ); + + Check ( SU_state[ su ] == self_test_e ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + /* Reset the SU states: */ + + self_test_SU_number = NO_SU; + + _Pragma( "loopbound min 4 max 4" ) + for ( su = 0; su < NUM_SU; su++ ) SU_state[ su ] = off_e; + + CASE( "Hit Trigger, budget left, all A/D delays at limit but ok" ); + + hit_budget_left = 15; + + Set_AD_Delay ( ADC_MAX_TRIES ); + + ad_conv_num = 0; + + _Pragma( "loopbound min 4 max 4" ) + for ( su = 0; su < NUM_SU; su ++ ) { + Trigger_SU_Hit ( su, Prob3b ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( + mail_message[ ACQUISITION_MAILBOX ] + == ( ( su + 1 ) ) ); // | HIT_ADC_ERROR)); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + Check ( hit_budget_left == 15 - NUM_SU ); + + CASE( "Hit Trigger, budget left, one A/D failure, others at limit" ); + + hit_budget_left = 15; + + ad_conv_delay[ 0 ] = ADC_MAX_TRIES + 1; + + _Pragma( "loopbound min 4 max 4" ) + for ( su = 0; su < NUM_SU; su ++ ) { + ad_conv_num = su; + /* Offset starting index to make a different channel fail. */ + + Trigger_SU_Hit ( su, Prob3b ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( + mail_message[ ACQUISITION_MAILBOX ] + == ( ( su + 1 ) | HIT_ADC_ERROR ) ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + Check ( hit_budget_left == 15 - NUM_SU ); + + CASE( "Hit Trigger, budget left, any number of A/D failures" ); + + hit_budget_left = 80; + + su = NUM_SU - 1; + + _Pragma( "loopbound min 80 max 80" ) + while ( hit_budget_left > 0 ) { + Random_AD_Delay (); + + Trigger_SU_Hit ( su, Prob3c ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( + ( mail_message[ ACQUISITION_MAILBOX ] & SU_NUMBER_MASK ) + == su + 1 ); + + FlushMail ( ACQUISITION_MAILBOX ); + + if ( su > 0 ) su --; + else su = NUM_SU - 1; + } + + /* More tests in SU_Self_Test_Tests. */ +} + + +unsigned char switch_su_cmd[ NUM_SU ] = { + SWITCH_SU_1, + SWITCH_SU_2, + SWITCH_SU_3, + SWITCH_SU_4 +}; +/* The commands to switch Sensor Units ON or OFF. */ + + +void Report_Event_Histo ( void ) +/* Report the collected event counts per SU and class. */ +{ + sensor_index_t sen; + int class; + + #if defined(TRACE_HARNESS) + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + _Pragma( "loopbound min 10 max 10" ) + for ( class = 0; class < NUM_CLASSES; class ++ ) { + printf ( "Events from SU %d, class %d: %d\n", + sen, class, science_data.event_counter[ sen ][ class ] ); + } + #endif +} + + +static void Acquisition_Tests ( void ) +/* Tests of AcquisitionTask. */ +{ + sensor_index_t sen; + unsigned int hits; + int octets; + + /* These tests are constructed as a "nominal operation" + scenario, which incidentally tests the AcquisitionTask + and the Hit Trigger ISR, as well as other functions. + The scenario is: + + - TC to switch sensors ON + - Run Monitoring task to drive the SU state transition. + - TC to START ACQUISITION + - Particle hits until the Science Data is full + - The same number of particle hits with the Science Data full + - Science Data TM + - some particle hits during science TM + - TC to enter STANDBY mode + - TC to switch sensors OFF. + + */ + + CASE( "Turn Sensor Units ON" ); + + /* Send the SWITCH ON commands: */ + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + Check ( SU_state[ sen ] == off_e ); + + Exec_TC ( switch_su_cmd[ sen ], ON_VALUE, Prob4a ); + + Check_No_Errors (); + Check ( SU_state[ sen ] == start_switching_e ); + } + + /* Prevent all errors in Monitoring: */ + + Set_AD_Nominal (); + max_adc_hits = 0; + ad_random_failures = 0; + check_current_errors = 0; + v_down_errors = 0; + + /* Run Health Monitoring to drive the SUs ON: */ + + Monitor_Health ( Prob6a ); + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + Check ( SU_state[ sen ] == switching_e ); + + Monitor_Health ( Prob6a ); + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + Check ( SU_state[ sen ] == on_e ); + + CASE( "SWITCH_SU_ON when already ON, fail" ); + + Exec_TC ( SWITCH_SU_2, ON_VALUE, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check ( SU_state[ 1 ] == on_e ); + + Clear_Errors (); + + CASE( "Start Acquisition" ); + + Check ( ( telemetry_data.mode_status & MODE_BITS_MASK ) == STAND_BY ); + + Exec_TC ( START_ACQUISITION, START_ACQUISITION, Prob4a ); + + Check_No_Errors (); + + Check ( ( telemetry_data.mode_status & MODE_BITS_MASK ) == ACQUISITION ); + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + Check ( SU_state[ sen ] == acquisition_e ); + + CASE( "TC = SWITCH_SU in ACQUISITION, fail" ); + + Exec_TC ( SWITCH_SU_1, ON_VALUE, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Clear_Errors (); + + CASE( "TC = START_ACQUISITION in ACQUISITION, fail" ); + + Exec_TC ( START_ACQUISITION, START_ACQUISITION, Prob4a ); + + Check ( telemetry_data.error_status == TC_ERROR ); + + Check ( GetMode() == ACQUISITION ); + + Clear_Errors (); + + CASE( "Hits with Science Data not full" ); + + Set_AD_Delay ( 2 ); + + hits = 0; + + _Pragma( "loopbound min 2625 max 2625" ) + while ( free_slot_index < max_events ) { + hits ++; + internal_time ++; + hit_budget_left = 10; + + Random_Event (); + + Acquire_Hit ( Prob3a, Prob5a ); + } + + #if defined(TRACE_HARNESS) + printf ( "Science Data filled with %d events after %d hits.\n", + max_events, hits ); + #endif + Report_Event_Histo (); + + CASE( "Hits with Science Data full" ); + + _Pragma( "loopbound min 2625 max 2625" ) + while ( hits > 0 ) { + hits --; + internal_time ++; + hit_budget_left = 10; + + Random_Event (); + + Acquire_Hit ( Prob3a, Prob5b ); + } + + Report_Event_Histo (); + + CASE( "Science Data TM, full Science Data, some hits during TM" ); + + Send_TC ( SEND_SCIENCE_DATA_FILE, SEND_SCIENCE_DATA_FILE ); + + Check_No_Errors (); + Check ( TC_state == SC_TM_e ); + + Handle_TC ( Prob4a ); + + Check ( TC_state == SC_TM_e ); + + /* Absorb TM until a TM_READY message is sent to the TC task, + and simulate some particle hits at the same time: + */ + + hits = 0; + /* We will make MAX_QUEUE_LENGTH + 4 hits. */ + + hit_budget_left = MAX_QUEUE_LENGTH + 2; + /* Ensure that some hits are rejected for budget exhaustion. */ + + Check_Zero ( event_queue_length ); + + octets = 0; + + _Pragma( "loopbound min 17676 max 17676" ) + while ( mail_count[ TCTM_MAILBOX ] == 0 ) { + if ( telemetry_pointer < telemetry_end_pointer ) { + FOR_PROBLEM( Prob2a ); + TM_InterruptService (); + END_PROBLEM; + } else { + FOR_PROBLEM( Prob2c ); + TM_InterruptService (); + END_PROBLEM; + } + + octets += 2; + Check ( TC_state == SC_TM_e ); + + if ( hits < MAX_QUEUE_LENGTH + 4 ) { + /* Hit during Science Data TM: */ + + internal_time ++; + Random_Event (); + event_flag = ACCEPT_EVENT; + + Acquire_Hit ( Prob3a, Prob5b ); + + hits ++; + + if ( hits <= MAX_QUEUE_LENGTH ) + Check ( event_queue_length == hits ); + else + Check ( event_queue_length == MAX_QUEUE_LENGTH ); + } + } + + #if defined(TRACE_HARNESS) + printf ( "Science TM octets sent %d\n", octets ); + #endif + + Check_Zero ( hit_budget_left ); + + Check ( hits == MAX_QUEUE_LENGTH + 4 ); + + /* Handle the TM_READY message: */ + + Handle_TC ( Prob4a ); + + Check ( TC_state == TC_handling_e ); + + /* Check that the queued events have been recorded: */ + + Check_Zero ( event_queue_length ); + + Check ( free_slot_index == MAX_QUEUE_LENGTH ); + + CASE( "Switch to Self Test in Acquisition mode, fail" ); + + Check ( GetMode() == ACQUISITION ); + + Check_Zero ( telemetry_data.error_status & TC_ERROR ); + + Exec_TC ( SWITCH_SU_2, SELF_TEST, Prob4a ); + + Check_Nonzero ( telemetry_data.error_status & TC_ERROR ); + + Exec_TC ( ERROR_STATUS_CLEAR, ERROR_STATUS_CLEAR, Prob4a ); + + Check_Zero ( telemetry_data.error_status & TC_ERROR ); + + CASE( "Stop acquisition" ); + + Exec_TC ( STOP_ACQUISITION, STOP_ACQUISITION, Prob4a ); + + Check_No_Errors (); + + Check ( ( telemetry_data.mode_status & MODE_BITS_MASK ) == STAND_BY ); + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + Check ( SU_state[ sen ] == on_e ); + + CASE( "Turn Sensor Units OFF" ); + + /* Send the SWITCH OFF commands: */ + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + Exec_TC ( switch_su_cmd[ sen ], OFF_VALUE, Prob4a ); + + Check_No_Errors (); + Check ( SU_state[ sen ] == off_e ); + } +} + +void SU_Self_Test_Tests ( void ) +/* Tests of the "SU Self Test" function. */ +{ + sensor_index_t sen; + + sim_self_test = 1; + + CASE( "Turn Sensor Units ON for Self Test" ); + + /* Send the SWITCH ON commands: */ + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + Check ( SU_state[ sen ] == off_e ); + + Exec_TC ( switch_su_cmd[ sen ], ON_VALUE, Prob4a ); + + Check_No_Errors (); + Check ( SU_state[ sen ] == start_switching_e ); + } + + /* Prevent all errors in Monitoring: */ + + Set_AD_Nominal (); + max_adc_hits = 0; + ad_random_failures = 0; + check_current_errors = 0; + v_down_errors = 0; + + /* Run Health Monitoring to drive the SUs ON: */ + + Monitor_Health ( Prob6a ); + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + Check ( SU_state[ sen ] == switching_e ); + + Monitor_Health ( Prob6a ); + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) + Check ( SU_state[ sen ] == on_e ); + + CASE( "Switch SU2 to Self Test in Standby mode" ); + + Check ( GetMode() == STAND_BY ); + Check_No_Errors (); + + Exec_TC ( SWITCH_SU_2, SELF_TEST, Prob4a ); + + Check_No_Errors (); + + Check ( self_test_SU_number == 2 ); + Check ( SU_state[ 1 ] == self_test_mon_e ); + + CASE ( "Switch SU3 (also) to Self Test, fail" ); + + Exec_TC ( SWITCH_SU_3, SELF_TEST, Prob4a ); + + Check_Nonzero ( telemetry_data.error_status & TC_ERROR ); + + Exec_TC ( ERROR_STATUS_CLEAR, ERROR_STATUS_CLEAR, Prob4a ); + + Check_Zero ( telemetry_data.error_status & TC_ERROR ); + + Check ( self_test_SU_number == 2 ); + + Check_No_Errors (); + + CASE( "Run Self Test for SU2" ); + + /* Run Monitoring up to but not including round_7_e: */ + + _Pragma( "loopbound min 8 max 8" ) + while ( health_mon_round != round_7_e ) + Monitor_Health ( Prob6a ); + + Check ( self_test_SU_number == 2 ); + Check ( SU_state[ 1 ] == self_test_mon_e ); + + /* Run round_7_e of Monitoring to start Self Test: */ + + Monitor_Health ( Prob6a ); + + Check ( self_test_SU_number == 2 ); + Check ( SU_state[ 1 ] == self_test_e ); + + /* Run round_6_e of Monitoring to execute Self Test: */ + + Check ( health_mon_round == round_6_e ); + + Monitor_Health ( Prob6a ); + + Check ( self_test_SU_number == NO_SU ); + Check ( SU_state[ 1 ] == on_e ); + + Check_No_Errors (); + + CASE( "Run Self Test for SU2, fail" ); + + Check ( GetMode() == STAND_BY ); + Check_No_Errors (); + + Exec_TC ( SWITCH_SU_2, SELF_TEST, Prob4a ); + + Check_No_Errors (); + + Check ( self_test_SU_number == 2 ); + Check ( SU_state[ 1 ] == self_test_mon_e ); + + sim_self_test = 0; + /* Force self-test to fail. */ + + /* Run Monitoring up to but not including round_7_e: */ + + _Pragma( "loopbound min 8 max 8" ) + while ( health_mon_round != round_7_e ) + Monitor_Health ( Prob6a ); + + Check ( self_test_SU_number == 2 ); + Check ( SU_state[ 1 ] == self_test_mon_e ); + + /* Run round_7_e of Monitoring to start Self Test: */ + + Monitor_Health ( Prob6a ); + + Check ( self_test_SU_number == 2 ); + Check ( SU_state[ 1 ] == self_test_e ); + + /* Run round_6_e of Monitoring to execute Self Test: */ + + Check ( health_mon_round == round_6_e ); + + Monitor_Health ( Prob6a ); + + Check ( self_test_SU_number == NO_SU ); + Check ( SU_state[ 1 ] == on_e ); + + Check_Nonzero ( telemetry_data.SU_status[ 1 ] & SELF_TEST_ERROR ); + Check ( telemetry_data.error_status == 0x20 ); + + Clear_Errors (); + + CASE( "Hit Trigger, SU Self Test, correct pulse" ); + + hit_budget_left = 15; + + Set_AD_Delay ( 2 ); + ad_conv_num = 0; + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + self_test_SU_number = sen + SU1; + + SU_state[ sen ] = self_test_trigger_e; + + Trigger_SU_Hit ( sen, Prob3a ); + + Check ( SU_state[ sen ] == self_test_e ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( mail_message[ ACQUISITION_MAILBOX ] == sen + SU1 ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + Check ( hit_budget_left == 15 - NUM_SU ); + + CASE( "Hit Trigger, SU Self Test, incorrect pulse" ); + + hit_budget_left = 15; + + Set_AD_Delay ( 2 ); + ad_conv_num = 0; + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + self_test_SU_number = sen + SU1; + + SU_state[ sen ] = self_test_e; + + Trigger_SU_Hit ( sen, Prob3a ); + + Check ( SU_state[ sen ] == self_test_e ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( mail_message[ ACQUISITION_MAILBOX ] == + ( ( sen + SU1 ) | HIT_SELF_TEST_RESET ) ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + Check ( hit_budget_left == 15 - NUM_SU ); + + CASE( "Hit Trigger, SU Self Test, other pulse" ); + + hit_budget_left = 15; + + Set_AD_Delay ( 2 ); + ad_conv_num = 0; + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + self_test_SU_number = sen + SU1; + + SU_state[ sen ] = on_e; + + Trigger_SU_Hit ( sen, Prob3a ); + + Check ( SU_state[ sen ] == on_e ); + + Check ( mail_count[ ACQUISITION_MAILBOX ] == 1 ); + + Check ( mail_message[ ACQUISITION_MAILBOX ] == sen + SU1 ); + + FlushMail ( ACQUISITION_MAILBOX ); + } + + Check ( hit_budget_left == 15 - NUM_SU ); + + Check_No_Errors (); + + CASE( "Turn Sensor Units OFF after Self Tests" ); + + /* Send the SWITCH OFF commands: */ + + _Pragma( "loopbound min 4 max 4" ) + for ( sen = 0; sen < NUM_SU; sen ++ ) { + Exec_TC ( switch_su_cmd[ sen ], OFF_VALUE, Prob4a ); + + Check_No_Errors (); + Check ( SU_state[ sen] == off_e ); + } +} + + + +/* StartSystem () : test scenario */ + + +static unsigned int test_round = 0; +/* Counts test repetitions. */ + + +void StartSystem( unsigned char task_number ) +/* ORIGINALLY: */ +/* Purpose : Starts the system. */ +/* Interface : input - none */ +/* output - none */ +/* Preconditions : none */ +/* Postconditions : First task is called and system started. */ +/* Algorithm : See below, self explanatory. */ +/* IN HARNESS: */ +/* Executes the test scenario. */ +{ + #if defined(TRACE_HARNESS) + printf ( "StartSystem %d\n", task_number ); + #endif + + /* Initialize the global data of the tasks: */ + + InitHealthMonitoring (); + + /* Testing the ISRs and tasks: */ + + _Pragma( "loopbound min 1 max 1" ) + do { + test_round ++; + + #if defined(TRACE_HARNESS) + printf ( "Test round %d\n", test_round ); + #endif + + TARGET_START_TEST; + + TC_ISR_Tests (); + + Report_Checks (); + + TC_Task_Tests (); + + Report_Checks (); + + Monitoring_Task_Tests (); + + Report_Checks (); + + TM_Tests (); + + Report_Checks (); + + Hit_ISR_Tests (); + + Report_Checks (); + + Acquisition_Tests (); + + Report_Checks (); + + SU_Self_Test_Tests (); + + Report_Checks (); + + /* Clear for next round: */ + + checks = 0; + } while ( TARGET_REPEAT_TEST ); + + #if defined(TRACE_HARNESS) + printf ( "Total mailbox overflows %d\n", mail_overflows ); + exit ( 0 ); + #endif + +} diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/target_ad_conv.h b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_ad_conv.h new file mode 100644 index 0000000..bb20cac --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_ad_conv.h @@ -0,0 +1,47 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_ad_conv.h + + Macros, functions, types and constants for controlling AD converter. + + This version uses the harness functions for I/O and kernel simulation. + + Based on the SSF DHI file ad_conv.h, revision 1.6, Tue Jun 01 12:35:44 1999. + + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TARGET_AD_CONV_H +#define TARGET_AD_CONV_H + +#include "keyword.h" + +/* AD converter control functions, simulated in harness.c */ + +extern void Update_ADC_Channel_Reg ( unsigned char channel ); +extern void Start_Conversion ( void ); +extern unsigned char End_Of_ADC ( void ); +extern unsigned char Get_Result ( void ); +extern void Set_DAC_Output ( unsigned char level ); + +/* AD converter control macros */ + +#define UPDATE_ADC_CHANNEL_REG Update_ADC_Channel_Reg (ADC_channel_register) +#define START_CONVERSION Start_Conversion () +#define END_OF_ADC End_Of_ADC () +#define GET_RESULT Get_Result () +#define SET_DAC_OUTPUT(LEVEL) Set_DAC_Output (LEVEL) + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/target_dpu_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_dpu_ctrl.h new file mode 100644 index 0000000..ef4782b --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_dpu_ctrl.h @@ -0,0 +1,68 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_dpu_ctrl.h + + Operations and macros for low-level control of the Data Processing + Unit, the 80C32 computer on which the DEBIE DPU software runs. + This includes accessing data and code memories by address; boot + and reset operations; watchdog handling; memory patch and test. + + This version uses the harness functions for I/O and kernel simulation. + + Based on the SSF DHI file dpu_ctrl.h, rev 1.23, Fri May 28 14:59:30 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TARGET_DPU_CTRL_H +#define TARGET_DPU_CTRL_H + +#include "keyword.h" + +extern unsigned char Event_Flag ( void ); + +#define EVENT_FLAG Event_Flag() +/* Event storage condition signal. */ + + +/* Access simulated memory */ + +extern void Set_Data_Byte ( data_address_t addr, unsigned char value ); +extern unsigned char Get_Data_Byte ( data_address_t addr ); +extern unsigned char Get_Code_Byte ( code_address_t addr ); + + +/* Functions and macros to access external memory by numerical address. */ + +#define SET_DATA_BYTE(ADDR,VALUE) Set_Data_Byte (ADDR, VALUE) +#define GET_DATA_BYTE(ADDR) Get_Data_Byte (ADDR) +#define GET_CODE_BYTE(ADDR) Get_Code_Byte (ADDR) + + +/* Controlling the watchdog and the memory mapping: */ + +#define SET_WD_RESET_HIGH {} +#define SET_WD_RESET_LOW {} +#define SET_MEM_CONF_PROM {} +#define SET_MEM_CONF_SRAM {} + + +/* macro used in healthmonitoring */ + +extern unsigned char Check_Current ( unsigned char bits ); + +#define CHECK_CURRENT(BIT_NUMBERS) Check_Current (BIT_NUMBERS) +/* Checks whether given bit in the HV Status Register is HIGH or LOW. */ + + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/target_isr_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_isr_ctrl.h new file mode 100644 index 0000000..9dac8eb --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_isr_ctrl.h @@ -0,0 +1,71 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_isr_ctrl.h + + Macros and operations to control and handle interrupts. + + This version uses the harness functions for I/O and kernel simulation. + + Based on the SSF DHI file isr_ctrl.h, rev 1.16, Sun Jul 25 15:02:08 1999. + + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TARGET_ISR_CTRL_H +#define TARGET_ISR_CTRL_H + + +/* Simulation of hit trigger. */ + +extern void Enable_Hit_Trigger ( void ); +extern void Disable_Hit_Trigger ( void ); +extern unsigned char Hit_Trigger_Flag ( void ); + +/* Macros for access to hit trigger. */ + +#define SET_HIT_TRIGGER_ISR_FLAG {} +#define CLEAR_HIT_TRIGGER_ISR_FLAG {} +#define ENABLE_HIT_TRIGGER Enable_Hit_Trigger () +#define DISABLE_HIT_TRIGGER Disable_Hit_Trigger (); +#define HIT_TRIGGER_FLAG Hit_Trigger_Flag () + + +#define SET_INTERRUPT_PRIORITIES {} +/* Sets Timer 1, Timer 2 and External interrupt 0 and 1 */ +/* priorities high, others to low. */ + +#define DISABLE_INTERRUPT_MASTER {} +#define ENABLE_INTERRUPT_MASTER {} +/* Clear and set interrupt master enable bit */ + +/* Simulation of Telecommand Timer */ + +extern unsigned char TC_Timer_Overflow_Flag ( void ); +extern void Clear_TC_Timer_Overflow_Flag ( void ); +extern void Set_TC_Timer_Overflow_Flag ( void ); + +/* Macros for Telecommand Timer */ + +#define DISABLE_TC_TIMER_ISR {} +/* Macro for clearing TC timer interrupt enable flag */ + +#define TC_TIMER_OVERFLOW_FLAG TC_Timer_Overflow_Flag () +/* TC timer overflow flag */ + +#define CLEAR_TC_TIMER_OVERFLOW_FLAG Clear_TC_Timer_Overflow_Flag () +#define SET_TC_TIMER_OVERFLOW_FLAG Set_TC_Timer_Overflow_Flag () +/* TC timer overflow flag manipulation macros. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/target_reg52.h b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_reg52.h new file mode 100644 index 0000000..dc069e5 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_reg52.h @@ -0,0 +1,36 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_reg52.h + + Definitions for 80C32 Special Function Registers to be used + in portable parts of the DEBIE DPU software. + + This "null" (DNI) version declares these Special Function Registers + as global "unsigned char" variables. + + Created for the DEBIE-I WCET benchmark program. Not based directly + on any SSF sources. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TARGET_REG52_H +#define TARGET_REG52_H + + +extern unsigned char EA; +/* Interrupt enable register. */ + + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/target_su_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_su_ctrl.h new file mode 100644 index 0000000..a4b5bf0 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_su_ctrl.h @@ -0,0 +1,66 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_su_ctrl.h + + Macros, functions, constants and types for controlling Sensor Units. + + This version uses the harness functions for I/O and kernel simulation. + + Based on the SSF DHI file su_ctrl.h, rev 1.28, Tue Sep 14 14:51:26 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TARGET_SU_CTRL_H +#define TARGET_SU_CTRL_H + +/* Simulation of counter access */ + +extern unsigned char Get_MSB_Counter ( void ); +extern unsigned char Get_LSB1_Counter ( void ); +extern unsigned char Get_LSB2_Counter ( void ); +extern unsigned char Rise_Time_Counter ( void ); + +/* Counter access macros */ + +#define GET_MSB_COUNTER Get_MSB_Counter () +#define GET_LSB1_COUNTER Get_LSB1_Counter () +#define GET_LSB2_COUNTER Get_LSB2_Counter () +#define RISE_TIME_COUNTER Rise_Time_Counter () + +#define SET_COUNTER_RESET(LEVEL) {} + +/* Simulation of trigger signal */ + +extern unsigned char Trigger_Source_0 ( void ); +extern unsigned char Trigger_Source_1 ( void ); +extern unsigned char V_Down ( void ); + +/* Macros to access trigger signals */ + +#define TRIGGER_SOURCE_0 Trigger_Source_0 () +#define TRIGGER_SOURCE_1 Trigger_Source_1 () +#define V_DOWN V_Down () + +/* Simulation of SU Self Test functions */ + +extern void Set_SU_Self_Test_Ch ( unsigned char value ); +extern void Set_Test_Pulse_Level ( unsigned char level ); + +#define SET_SU_SELF_TEST_CH(value) Set_SU_Self_Test_Ch (value) +#define SET_TEST_PULSE_LEVEL(level) Set_Test_Pulse_Level(level) + +#endif + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/harness/target_ttc_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_ttc_ctrl.h new file mode 100644 index 0000000..3856772 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/harness/target_ttc_ctrl.h @@ -0,0 +1,70 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : target_ttc_ctrl.h + + Macros and function prototypes for handling the Telecommand + and Telemetry interface. + + This version uses the harness functions for I/O and kernel simulation. + + Based on the SSF DHI file ttc_ctrl.h, rev 1.11, Sun May 16 09:20:10 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TARGET_TTC_CTRL_H +#define TARGET_TTC_CTRL_H + +/* TC/TM interface functions, simulated */ + +extern unsigned char Read_TC_MSB ( void ); +extern unsigned char Read_TC_LSB ( void ); +extern void Write_TM_LSB ( unsigned char value ); +extern void Write_TM_MSB ( unsigned char value ); + +/* TC and TM register handling */ + +#define READ_TC_MSB Read_TC_MSB() +#define READ_TC_LSB Read_TC_LSB() + +#define WRITE_TM_LSB(TM_LSB) Write_TM_LSB(TM_LSB) +#define WRITE_TM_MSB(TM_MSB) Write_TM_MSB(TM_MSB) + +/* TM Interrupt flag */ + +#define CLEAR_TM_INTERRUPT_FLAG {} + +/* TC Interrupt flag*/ + +#define CLEAR_TC_INTERRUPT_FLAG {} + +/* TM and TC interrupt controls*/ + +#define SET_INT_TYPE1_EDGE {} +#define SET_INT_TYPE0_EDGE {} + +/* TC timer controls */ + +#define SET_TC_TIMER_MODE {} +/* Set TC timer (0) mode : Mode 1, counter operation, SW control */ + +#define INIT_TC_TIMER_MSB {} +#define INIT_TC_TIMER_LSB {} +/* TC timer initialization macros */ + +#define START_TC_TIMER {} +#define STOP_TC_TIMER {} +/* TC timer run control macros */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/health.c b/targets/wasm-tacle/parallel/DEBIE/code/health.c new file mode 100644 index 0000000..3f83727 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/health.c @@ -0,0 +1,2637 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : health.c + + Monitoring DEBIE DPU and system health. + + Based on the SSF file health.c, rev 1.74, Fri Oct 15 20:18:02 1999. + + - * ----------------------------------------------------------------------- +*/ + +#include "ad_conv.h" +#include "dpu_ctrl.h" +#include "taskctrl.h" +#include "health.h" +#include "ttc_ctrl.h" +#include "measure.h" +#include "tc_hand.h" +#include "keyword.h" +#include "kernobj.h" +#include "tm_data.h" +#include "telem.h" +#include "isr_ctrl.h" +#include "version.h" +#include "class.h" + + +#define BOOT_WAIT_INTERVAL 55 +/* Boot wait interval: 55 x 10 ms = 550 ms */ + +#define SYSTEM_INTERVAL 9198 +/* Sets system time interval to 10 ms, assuming a clock */ +/* frequency of exactly 11.0592 MHz. */ +/* SYSTEM_INTERVAL is in units of the processor cycle, */ +/* and is computed as follows, in principle: */ +/* 10 ms * 11.0592 MHz / 12 */ +/* where 12 is the number of clock cycles per processor */ +/* cycle. */ +/* The above calculation gives the value 9216 precisely. */ +/* In practice this value makes the DPU time (updated by */ +/* the Health Monitoring Task) retard by about 0.2%. */ +/* This is probably due to imprecise handling of timer */ +/* ticks by RTX-51. As a primitive correction, we reduce */ +/* the value by 0.2% to 9198. This correction will not */ +/* be exact, especially under heavy interrupt load. */ + +#define HM_INTERVAL 100 +/* Health Monitoring interval wait: 100 x 10 ms = 1s */ +/* This wait time should be waited 10 times to get */ +/* period of 10s. */ +/* Alternatively the execution of the Health Monitoring */ +/* Task can be divided to ten steps which are executed */ +/* 1 second apart from each other and then all actions */ +/* of the task would be executed once in 10 seconds */ + +#define ADC_TEMPERATURE_MAX_TRIES 255 +/* When temperatures are measured this macro defines the maximum */ +/* amount of tries to be used in reading and handling an AD channel in */ +/* 'Read_AD_Channel()'. */ + +#define CONVERSION_TEMPERATURE_MAX_TRIES 255 +/* When temperatures are measured this macro defines the maximum */ +/* amount of tries to be used when End Of Conversion indication is */ +/* waited in function 'Convert_AD()'. */ + +#define ADC_VOLTAGE_MAX_TRIES 255 +/* When voltages are measured this macro defines the maximum */ +/* amount of tries to be used in reading and handling an AD channel in */ +/* 'Read_AD_Channel()'. */ + +#define CONVERSION_VOLTAGE_MAX_TRIES 255 +/* When voltages are measured this macro defines the maximum */ +/* amount of tries to be used when End Of Conversion indication is */ +/* waited in function 'Convert_AD()'. */ + +#define DPU_5V_SELECTOR 3 +#define SU_1_2_P5V_SELECTOR 0 +#define SU_1_2_M5V_SELECTOR 4 +/* DPU Self Test voltage measurement channel selectors. */ +/* See MeasureVoltage function. */ + +#define SU_P5V_ANA_LOWER_LIMIT 0xBA +#define SU_P5V_ANA_UPPER_LIMIT 0xE4 +#define SU_M5V_ANA_LOWER_LIMIT 0x0D +#define SU_M5V_ANA_UPPER_LIMIT 0x22 +#define SU_P50V_LOWER_LIMIT 0xA8 +#define SU_P50V_UPPER_LIMIT 0xE3 +#define SU_M50V_LOWER_LIMIT 0x0E +#define SU_M50V_UPPER_LIMIT 0x2C +#define DPU_P5V_DIG_LOWER_LIMIT 0xBA +#define DPU_P5V_DIG_UPPER_LIMIT 0xE4 +/* Upper and lower limits for monitoring */ +/* SU and DPU supply voltages. */ + +#define SELF_TEST_DONE 0 +#define SELF_TEST_RUNNING 1 +/* Used in SU self test. */ + +typedef struct { + channel_t ADC_channel; + uint_least8_t ADC_max_tries; + uint_least8_t conversion_max_tries; + unsigned int unsigned_ADC; + signed int signed_ADC; + unsigned char AD_execution_result; + sensor_number_t sensor_unit; +} ADC_parameters_t; +/* This struct is used to hold parameters for Reading AD channels. */ +/* */ +/* 'ADC_channel' Stores the number the AD channel to be measured. */ +/* Includes BP_UP bit to select unipolar/bipolar mode.*/ +/* 'ADC_max_tries' Gives the function the maximum amount of tries */ +/* used in reading and handling an AD channel. */ +/* 'conversion_max_tries' Gives the function the maximum amount of tries */ +/* used in reading and handling a single AD */ +/* conversion. */ +/* 'unsigned_ADC' These variables are used for storing an ADC */ +/* 'signed_ADC' result. */ +/* 'AD_execution_result' Indicates whether the AD measurent is a success or */ +/* indicates what has gone wrong with following */ +/* values. */ +/* sensor_unit See the function DAC_SelfTest. */ +/* CONVERSION_ACTIVE 0 */ +/* RESULT_OK 1 */ +/* HIT_OCCURRED 2 */ + + +typedef enum { + su1_e, su2_e, su3_e, su4_e +} SU_index_t; + + + +uint_least8_t EXTERNAL temp_meas_count = TEMP_COUNT; +/* This variable is used for counting temperature measurement interval */ +/* 1/60 secs. */ + +uint_least8_t EXTERNAL voltage_meas_count = VOLTAGE_COUNT; +/* This variable is used for counting voltage measurement interval 1/180 */ +/* secs. */ + +uint_least8_t EXTERNAL checksum_count = CHECK_COUNT; +/* This variable is used for counting checksum counter, interval 1/60 */ +/* secs. */ + +unsigned char EXTERNAL code_checksum; +/* This variable is used for calculating checksum from the memory. */ + +unsigned char EXTERNAL self_test_flag = SELF_TEST_DONE; +/* Used with SU self test initiation. */ + +/* enumerations */ + +typedef enum { + channel_0_e, channel_1_e, channel_2_e, channel_3_e, channel_4_e, + channel_5_e, channel_6_e + +} AD_channel_t; + +unsigned char EXTERNAL ADC_channel_register = 0x80; +/* Holds value of the ADC Channel HW register */ +/* Is used by Hit Trigger ISR task and Health */ +/* Monitoring task. */ +/* Updating must be atomic in the Health Monitoring */ +/* task, because Hit Trigger can preempt it. */ + + +dpu_time_t EXTERNAL internal_time; +/* DEBIE internal time counter. */ + + +/* Function prototypes. */ + +void DelayAwhile ( unsigned short duration ); +void Read_AD_Channel ( ADC_parameters_t EXTERNAL *ADC_results ); +void DAC_SelfTest( unsigned char DAC_output, + ADC_parameters_t EXTERNAL *ADC_test_parameters ) ; +void Monitor( uint_least8_t health_mon_round ); +void UpdateTime( void ); +void MeasureTemperature( sensor_index_t SU_index ); +void HighVoltageCurrent( sensor_index_t SU_index ); +void LowVoltageCurrent( void ); +void MeasureVoltage( uint_least8_t channel_selector ); +void InitSystem( void ); +void CalculateChecksum( uint_least8_t checksum_count ); +void UpdatePeriodCounter( uint_least8_t EXTERNAL *counter, + uint_least8_t full_counter_value ); +void Convert_AD ( ADC_parameters_t EXTERNAL *ADC_parameters ); +void TemperatureFailure( sensor_index_t SU_index ); +void VoltageFailure( channel_t ADC_channel ); + +void SelfTest_SU( sensor_index_t self_test_SU_index ); +void Monitor_DPU_Voltage( void ); +void Monitor_SU_Voltage( sensor_index_t self_test_SU_index ); +unsigned char ExceedsLimit( + unsigned char value, + unsigned char lower_limit, + unsigned char upper_limit ); +void RestoreSettings( sensor_index_t self_test_SU_index ); +void SelfTestChannel( sensor_index_t self_test_SU_index ); +void ExecuteChannelTest( + sensor_index_t self_test_SU_index, + unsigned char test_channel, + unsigned char test_pulse_start_level ); + + +/* Other function prototypes. */ + +void Set_SU_TriggerLevels ( + sensor_number_t sensor_unit, + SU_settings_t EXTERNAL *settings ); + + +/*****************************************************************************/ +/* Boot and DPU self test */ +/*****************************************************************************/ + +void Clear_RTX_Errors( void ) +/* Purpose : Clears RTX error registers in telemetry */ +/* Interface : input - */ +/* output - telemetry_data, rtx error registers */ +/* Preconditions : none */ +/* Postconditions : RTX error registers are cleared. */ +/* Algorithm : See below, self explanatory. */ +{ + telemetry_data.isr_send_message_error = 0xFF; + telemetry_data.os_send_message_error = 0xFF; + telemetry_data.os_create_task_error = 0xFF; + telemetry_data.os_wait_error = 0xFF; + telemetry_data.os_attach_interrupt_error = 0xFF; + telemetry_data.os_enable_isr_error = 0xFF; + telemetry_data.os_disable_isr_error = 0xFF; +} + + +void SetSoftwareError( unsigned char error ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : This function will be called always when */ +/* bit(s) in the software error status */ +/* register are set. */ +/* Interface : inputs - software error status register */ +/* - measurement_error, which specifies what */ +/* bits are set in software error status. */ +/* Value is as follows, */ +/* */ +/* MEASUREMENT_ERROR */ +/* */ +/* outputs - software error status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to software error status register */ +/* - Enable interrupts */ +{ + DISABLE_INTERRUPT_MASTER; + + telemetry_data.software_error |= error; + + ENABLE_INTERRUPT_MASTER; +} + +void ClearSoftwareError() +/* Purpose : This function will be called always when all */ +/* bits in the software error status */ +/* register are cleared. */ +/* Interface : inputs - software error status register */ +/* outputs - software error status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : */ +/* - Write to SoftwareErrorStatuRegister */ + +{ + telemetry_data.software_error = 0; +} + +void SetModeStatusError( unsigned char mode_status_error ) +COMPACT_DATA REENTRANT_FUNC +/* Purpose : This function will be called always when */ +/* error bit(s) in the mode status register are set. */ +/* Interface : inputs - mode status register */ +/* - mode_status_error, which specifies what */ +/* bit(s) are to be set in */ +/* mode status register. Value is one of */ +/* the following, */ +/* */ +/* SUPPLY_ERROR */ +/* DATA_MEMORY_ERROR */ +/* PROGRAM_MEMORY_ERROR */ +/* MEMORY_WRITE_ERROR */ +/* ADC_ERROR */ +/* */ +/* outputs - mode status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to Mode Status register */ +/* - Enable interrupts */ +{ + DISABLE_INTERRUPT_MASTER; + + telemetry_data.mode_status |= ( mode_status_error & ( ~MODE_BITS_MASK ) ); + /* The mode bits are secured against unintended modification by */ + /* clearing those bits in 'mode_status_error' before "or":ing */ + /* its value to 'telemetry_data.mode_status'. */ + + + ENABLE_INTERRUPT_MASTER; +} +void ClearModeStatusError( void ) +/* Purpose : This function will be called always when all */ +/* error bits in the mode status register are cleared. */ +/* Interface : inputs - mode status register */ +/* */ +/* outputs - mode status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to Mode Status register */ +/* - Enable interrupts */ +{ + DISABLE_INTERRUPT_MASTER; + + telemetry_data.mode_status &= MODE_BITS_MASK; + /* Error bits in the mode status register are cleared. */ + + ENABLE_INTERRUPT_MASTER; +} + +void SetMode( DEBIE_mode_t mode ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : This function will be called always when */ +/* mode in the mode status register is set. */ +/* Interface : inputs - mode status register */ +/* mode_bits, which specify the mode to be */ +/* stored in the mode status register. */ +/* Value is on one of the following: */ +/* DPU self test */ +/* stand by */ +/* acquisition */ +/* */ +/* outputs - mode status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to Mode Status register */ +/* - Enable interrupts */ + +{ + DISABLE_INTERRUPT_MASTER; + + telemetry_data.mode_status = ( telemetry_data.mode_status & ~MODE_BITS_MASK ) + | ( mode & MODE_BITS_MASK ); + /* First mode status bits are cleared, and then the given mode is set. */ + + ENABLE_INTERRUPT_MASTER; +} + +DEBIE_mode_t GetMode() +/* Purpose : This function will be called always when */ +/* mode in the mode status register is checked. */ +/* Interface : */ +/* inputs - mode status register */ +/* */ +/* outputs - mode status register */ +/* - Mode bits, which specify the mode */ +/* stored in the ModeStatus register. */ +/* Value is on one of the following: */ +/* DPU self test */ +/* stand by */ +/* acquisition */ +/* */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : */ +/* - Read Mode Status register */ + + +{ + return ( telemetry_data.mode_status & MODE_BITS_MASK ); + /* Return the value of the two least significant bits in */ + /* mode status register and return this value. */ +} + + +void Clear_SU_Error( void ) +/* Purpose : This function will be called always when all */ +/* error bits in the SU# status register are cleared. */ +/* Interface : inputs - SU# status register */ +/* */ +/* outputs - SU# status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to Mode Status register */ +/* - Enable interrupts */ +{ + sensor_index_t EXTERNAL i; + + DISABLE_INTERRUPT_MASTER; + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < NUM_SU; i++ ) { + telemetry_data.SU_status[ i ] &= SUPPLY_VOLTAGE_MASK; + /* Error bits in the SU# status register are cleared. */ + } + + ENABLE_INTERRUPT_MASTER; +} + + +void Set_SU_Error( sensor_index_t SU_index, unsigned char SU_error ) +/* Purpose : This function will be called always when */ +/* error bit(s) in the SU# status register are set. */ +/* Interface : inputs - SU# status register */ +/* - 'SU_index' (0-3) */ +/* - 'SU_error' is one of the following: */ +/* */ +/* LV_SUPPLY_ERROR */ +/* HV_SUPPLY_ERROR */ +/* TEMPERATURE_ERROR */ +/* SELF_TEST_ERROR */ +/* */ +/* outputs - SU# status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to SU# status register */ +/* - Set corresponding SU# error bit in the */ +/* error status register. */ +/* - Enable interrupts */ +{ + + DISABLE_INTERRUPT_MASTER; + + telemetry_data.SU_status[ SU_index ] |= + ( SU_error & ( ~SUPPLY_VOLTAGE_MASK ) ); + /* Error bits in the SU# status register are cleared. */ + /* The voltage status bits in the SU# status register */ + /* are secured against unintended modification by */ + /* clearing those bits in 'SU_error' before */ + /* "or":ing its value to */ + /* 'telemetry_data.SU_status'. */ + + SetErrorStatus( ERROR_STATUS_OFFSET << SU_index ); + /* SU# error is set in the error status register, if */ + /* anyone of the error bits in the SU# status register */ + /* is set. */ + /* Because this subroutine enables itself the interrupts, */ + /* the call of it must be the last operation in the */ + /* interrupt blocked area ! */ + + ENABLE_INTERRUPT_MASTER; +} + + +void Set_SU_TriggerLevels ( + sensor_number_t sensor_unit, + SU_settings_t EXTERNAL *settings ) +/* Purpose : Set all trigger-levels of one SU. */ +/* Interface : inputs - SU number in 'sensor_unit'. */ +/* - Triggering levels in 'settings'. */ +/* outputs - Hardware trigger levels. */ +/* subroutines - SetTriggerLevel */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - set trigger level for Plasma 1+ */ +/* - set trigger level for Plasma 1- */ +/* - set trigger level for Piezos. */ +{ + trigger_set_t EXTERNAL trigger; + /* Holds parameters for SetTriggerLevel. */ + + trigger.sensor_unit = sensor_unit; + + trigger.level = settings -> plasma_1_plus_threshold; + trigger.channel = PLASMA_1_PLUS; + SetTriggerLevel ( &trigger ); + + trigger.level = settings -> plasma_1_minus_threshold; + trigger.channel = PLASMA_1_MINUS; + SetTriggerLevel ( &trigger ); + + trigger.level = settings -> piezo_threshold; + trigger.channel = PZT_1_2; + SetTriggerLevel ( &trigger ); +} + + +void SetErrorStatus( unsigned char error_source ) +/* Purpose : This function will be called always when */ +/* error bit(s) in the error status register are set. */ +/* Exceptionally TC_ERROR will be set with a separate */ +/* function as it is used so often. */ +/* Interface : inputs - error status register */ +/* - 'error_source' specifies the error bit */ +/* to be set. Its value is one of the */ +/* following, */ +/* */ +/* SU4_ERROR */ +/* SU3_ERROR */ +/* SU2_ERROR */ +/* SU1_ERROR */ +/* CHECKSUM_ERROR */ +/* WATCHDOG_ERROR */ +/* PARITY_ERROR */ +/* */ +/* outputs - error status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to error status register */ +/* - Enable interrupts */ +{ + + DISABLE_INTERRUPT_MASTER; + + telemetry_data.error_status |= ( error_source & ( ~TC_ERROR ) ); + /* Error bits in the error status register are set. */ + /* The TC_ERROR bit in the error status register */ + /* is secured against unintended modification by */ + /* clearing that bit in 'error_source' before */ + /* "or":ing its value to */ + /* 'telemetry_data.error_status'. */ + + + ENABLE_INTERRUPT_MASTER; +} + + +void ClearErrorStatus() +/* Purpose : This function will be called always when */ +/* error bits in the error status register are cleared. */ +/* Interface : inputs - error status register */ +/* */ +/* outputs - error status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : */ +/* - Write to error status register */ + +{ + telemetry_data.error_status = 0; + /* Error bits in the error status register are */ + /* cleared. */ +} + + +void DPU_SelfTest ( void ) +/* Purpose : Executes the DPU voltage self test. */ +/* Interface : inputs - none */ +/* */ +/* outputs - none */ +/* subroutines - Monitor_DPU_Voltage */ +/* Preconditions : none */ +/* Postconditions : - Chosen supply voltages are measured. */ +/* Algorithm : - Chosen supply voltages are measured and monitored with */ +/* Monitor_DPU_Voltage */ +{ + Monitor_DPU_Voltage(); +} + +void Boot( void ) +/* Purpose : Executes Boot sequence */ +/* Interface : inputs - failed_code_address */ +/* - failed_data_address */ +/* outputs - intialized state of all variables */ +/* subroutines - SetSensorUnitOff */ +/* GetResetClass */ +/* SignalMemoryErros */ +/* ResetDelayCounters */ +/* InitClassification */ +/* ClearErrorStatus */ +/* ClearSoftwareError */ +/* Set_SU_TriggerLevels */ +/* Preconditions : Init_DPU called earlier, after reset. */ +/* Keil C startup code executed; xdata RAM initialised. */ +/* Tasks are not yet running. */ +/* Postconditions : DAS variables initialised. */ +/* All Sensor Units are in off state */ +/* If boot was caused by power-up reset, TM data registers */ +/* and Science Data File are initialized */ +/* If boot was not caused by watchdog-reset, error counters */ +/* are cleared */ +/* DEBIE mode is DPU_SELF_TEST */ +/* Algorithm : see below. */ + +{ + EXTERNAL unsigned char execution_result; + /* Execution result for SetSensorUnitOff function. */ + + EXTERNAL unsigned char *DIRECT_INTERNAL fill_pointer; + /* Used for data structure initialization */ + + DIRECT_INTERNAL reset_class_t reset_class; + /* What kind of reset caused this boot ? */ + + DIRECT_INTERNAL unsigned int i; + /* Loop variable */ + + + SU_ctrl_register |= 0x0F; + SET_DATA_BYTE( SU_CONTROL, SU_ctrl_register ); + /* Set all Peak detector reset signals to high */ + + max_events = MAX_EVENTS; + + ResetDelayCounters(); + + SetSensorUnitOff( su1_e, &execution_result ); + /* Set Sensor Unit 1 to Off state */ + + SetSensorUnitOff( su2_e, &execution_result ); + /* Set Sensor Unit 2 to Off state */ + + SetSensorUnitOff( su3_e, &execution_result ); + /* Set Sensor Unit 3 to Off state */ + + SetSensorUnitOff( su4_e, &execution_result ); + /* Set Sensor Unit 4 to Off state */ + + ADC_channel_register |= 0x80; + UPDATE_ADC_CHANNEL_REG; + /* ADC interleave calibration is not used. */ + + reset_class = GetResetClass(); + /* Find out what caused the reset. */ + + + if ( reset_class != warm_reset_e ) { + /* We are running the PROM code unpatched, either */ + /* from PROM or from SRAM. */ + + reference_checksum = INITIAL_CHECKSUM_VALUE; + /* 'reference_checksum' is used as a reference when */ + /* the integrity of the code is checked by */ + /* HealthMonitoringTask. It is set to its initial */ + /* value here, after program code is copied from */ + /* PROM to RAM. */ + } + + if ( reset_class == power_up_reset_e ) { + /* Data RAM was tested and is therefore garbage. */ + /* Init TM data registers and Science Data File. */ + + internal_time = 0; + + fill_pointer = ( EXTERNAL unsigned char *DIRECT_INTERNAL )&telemetry_data; + + _Pragma( "loopbound min 124 max 124" ) + for ( i = 0; i < sizeof( telemetry_data ); i++ ) { + *fill_pointer = 0; + fill_pointer++; + } + + ResetEventQueueLength(); + /* Empty event queue. */ + + ClearEvents(); + /* Clears the event counters, quality numbers */ + /* and free_slot_index of the event records in */ + /* the science data memory. */ + + InitClassification(); + /* Initializes thresholds, classification levels and */ + /* min/max times related to classification. */ + + Clear_RTX_Errors(); + /* RTX error indicating registers are initialized. */ + + } + + else + if ( reset_class == watchdog_reset_e ) { + /* Record watchdog failure in telemetry. */ + + telemetry_data.error_status |= WATCHDOG_ERROR; + + if ( telemetry_data.watchdog_failures < 255 ) + telemetry_data.watchdog_failures++; + } + + else + if ( reset_class == checksum_reset_e ) { + /* Record checksum failure in telemetry. */ + + telemetry_data.error_status |= CHECKSUM_ERROR; + + if ( telemetry_data.checksum_failures < 255 ) + telemetry_data.checksum_failures++; + } + + else { + /* Soft or Warm reset. */ + /* Preserve most of telemetry_data; clear some parts. */ + + ClearErrorStatus(); + Clear_SU_Error(); + Clear_RTX_Errors(); + ClearSoftwareError(); + telemetry_data.mode_status &= MODE_BITS_MASK; + telemetry_data.watchdog_failures = 0; + telemetry_data.checksum_failures = 0; + telemetry_data.TC_word = 0; + /* Clear error status bits, error status counters */ + /* and Command Status register. */ + + ResetEventQueueLength(); + /* Empty event queue. */ + + ClearEvents(); + /* Clears the event counters, quality numbers */ + /* and free_slot_index of the event records in */ + /* the science data memory. */ + + InitClassification(); + /* Initializes thresholds, classification levels and */ + /* min/max times related to classification. */ + + self_test_SU_number = NO_SU; + /* Self test SU number indicating parameter */ + /* is set to its default value. */ + } + + + telemetry_data.mode_status = + ( telemetry_data.mode_status & ~MODE_BITS_MASK ) | DPU_SELF_TEST; + /* Enter DPU self test mode. */ + + /* Software version information is stored in the telemetry data. */ + telemetry_data.SW_version = SW_VERSION; + + SignalMemoryErrors(); + /* Copy results of RAM tests to telemetry_data. */ + + SetTestPulseLevel( DEFAULT_TEST_PULSE_LEVEL ); + /* Initializes test pulse level. */ + + Set_SU_TriggerLevels ( SU_1, &telemetry_data.sensor_unit_1 ); + Set_SU_TriggerLevels ( SU_2, &telemetry_data.sensor_unit_2 ); + Set_SU_TriggerLevels ( SU_3, &telemetry_data.sensor_unit_3 ); + Set_SU_TriggerLevels ( SU_4, &telemetry_data.sensor_unit_4 ); + +} + + +/*****************************************************************************/ +/* Health Monitoring Task */ +/*****************************************************************************/ + + +uint_least8_t EXTERNAL health_mon_round = HEALTH_COUNT; +/* This variable is used for counting the ten health monitoring rounds */ +/* which altogether equal 10 secs. */ + + +void _Pragma( "entrypoint" ) InitHealthMonitoring ( void ) +/* Purpose : Initialize the health monitoring for DEBIE. */ +/* Interface : inputs - none */ +/* */ +/* outputs - telemetry_data */ +/* */ +/* subroutines - InitSystem() */ +/* DPU_SelfTest() */ +/* SetMode() */ +/* */ +/* Preconditions : Debie is on */ +/* Postconditions : See subroutines */ +/* Algorithm : */ +/* - Executes InitSystem() */ +/* - Executes DPU_SelfTest() */ +/* - Enter stand_by mode */ +{ + InitSystem(); + /* Initializes the system. */ + + DPU_SelfTest(); + /* Execute the DPU self test. */ + + SetMode( STAND_BY ); + /* Switch to Standby mode */ +} + + +void _Pragma( "entrypoint" ) HandleHealthMonitoring ( void ) +/* Purpose : One round of health monitoring for DEBIE. */ +/* Interface : inputs - telemetry_data */ +/* */ +/* outputs - telemetry_data */ +/* */ +/* subroutines - UpdateTime() */ +/* Monitor() */ +/* UpdatePeriodCounter() */ +/* WaitInterval() */ +/* */ +/* Preconditions : Debie is on */ +/* Postconditions : See subroutines */ +/* Algorithm : */ +/* - Updates sensor unit states */ +/* - Executes UpdateTime() */ +/* - Calls Monitor() function */ +/* - UpdatePeriodCounter() function advances the */ +/* health monitoring counter */ +/* - Executes WaitInterval() */ +{ + Update_SU_State ( 0 ); + Update_SU_State ( 1 ); + Update_SU_State ( 2 ); + Update_SU_State ( 3 ); + + UpdateTime(); + /* Update telemetry registers. */ + + Monitor( health_mon_round ); + /* Execute current Health Monitoring Round. */ + + UpdatePeriodCounter( &health_mon_round, HEALTH_COUNT ); + /* Decrease or reset health monitor loop counter depending on its */ + /* current and limiting values. */ + + WaitInterval( HM_INTERVAL ); + /* Wait for next activation */ +} + + +void HealthMonitoringTask( void ) TASK( HEALTH_MONITORING_TASK ) +PRIORITY( HEALTH_MONITORING_PR ) +/* Purpose : Takes care of health monitoring for DEBIE. */ +/* Interface : inputs - telemetry_data */ +/* */ +/* outputs - telemetry_data */ +/* */ +/* subroutines - UpdateTime() */ +/* Monitor() */ +/* UpdatePeriodCounter() */ +/* WaitInterval() */ +/* */ +/* Preconditions : Debie is on */ +/* Postconditions : See subroutines */ +/* Algorithm : */ +/* - InitHealthMonitoring */ +/* - loop forever: */ +/* - HandleHealthMonitoring */ +{ + InitHealthMonitoring (); + + _Pragma( "loopbound min 0 max 0" ) + while ( 1 ) + HandleHealthMonitoring (); +} + + +void Monitor( uint_least8_t health_mon_round ) +/* Purpose : Monitors DEBIE's vital signs */ +/* Interface : inputs - Health Monitoring Round count */ +/* outputs - none */ +/* subroutines - MeasureTemperature() */ +/* CheckCurrent() */ +/* MeasureVoltage() */ +/* CalculateChecksum() */ +/* Preconditions : Health monitoring is on. */ +/* Postconditions : Health monitoring duties are carried out. */ +/* Algorithm : */ +/* - Executes the given health monitor loop round. */ +/* - Starts three loops: */ +/* - voltage measurement loop 180 secs */ +/* - temperature measurement loop 60 secs */ +/* - checksum count loop 60 secs */ +/* The values of these counters are decreased after each */ +/* loop cycle. */ +/* */ +/* Health monitoring loop which lasts 10 secs and is */ +/* divided into 10 individual rounds. On each round */ +/* some specific Health Monitoring duties are carried */ +/* out. For example the Watchdog counter is resetted. */ +/* */ +/* Temperature measurement loop lasts 60 secs and */ +/* consists of 6 Health Monitoring loop cycles each */ +/* lasting 10 secs. It is executed partly on each 10 sec */ +/* Health Monitoring cycle by measuring temperatures of */ +/* one SU on each cycle. Measurement starts on the second*/ +/* Health Monitoring cycle and is completed after six */ +/* cycles. */ +/* */ +/* Voltage measurement loop lasts 180 secs and consists */ +/* of 18 Health Monitoring loop cycles each lasting 10 */ +/* secs. On each cycle some of its duties are carried */ +/* out. */ +/* */ +/* Checksum calculation loop lasts 60 secs and consists */ +/* of 6 Health Monitoring loop cycles each lasting 10 */ +/* secs. It is executed partly on each Health Monitoring*/ +/* round. */ +/* */ +/* Illustration of the process: */ +/* */ +/* M */ +/* _________|_________ */ +/* | | */ +/* |R-R-R-R-R-R-R-R-R-R> : Health Monitoring loop: M */ +/* <---------------------< Round: R = 1 sec */ +/* M = 10*R = 10 secs */ +/* */ +/* T */ +/* _____|_____ */ +/* | | */ +/* |M-M-M-M-M-M> Temperature Measurement loop: T */ +/* <-----------< Health Monitoring loop: M = 10 sec */ +/* T = 6*M = 60 secs */ +/* */ +/* C */ +/* _____________|____________ Checksum count loop: C */ +/* | | */ +/* |R-R-R-R-R-R-R-R-R-R> */ +/* >R-R-R-R-R-R-R-R-R-R> */ +/* >R-R-R-R-R-R-R-R-R-R> */ +/* >R-R-R-R-R-R-R-R-R-R> */ +/* >R-R-R-R-R-R-R-R-R-R> */ +/* >R-R-R-R-R-R-R-R-R-R> */ +/* Health Monitoring loop cycle: R = 1 sec */ +/* C = 60*R = 60 secs */ +/* */ +/* V */ +/* _________________|__________________ */ +/* | | */ +/* |M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M> Voltage Measurement loop: V */ +/* <-----------------------------------< Health Monitoring loop: M */ +/* V = 18*M = 180 secs */ +{ + CalculateChecksum( checksum_count ); + /* A 1/60th part of the memory checksum is calculated. */ + + UpdatePeriodCounter( &checksum_count, CHECK_COUNT ); + /* Decrease or reset checksum counter */ + /* depending on its current and limiting values. */ + + + switch ( health_mon_round ) { + case round_0_e: + + HighVoltageCurrent( ( sensor_index_t )health_mon_round ); + /* Overcurrent indicating bits related to sensor unit 1 in HV */ + /* status register are checked. */ + + UpdatePeriodCounter( &temp_meas_count, TEMP_COUNT ); + UpdatePeriodCounter( &voltage_meas_count, VOLTAGE_COUNT ); + /* Decrease or reset temperature, checksum and voltage counters */ + /* depending on their current and limiting values. */ + + + hit_budget_left = hit_budget; + /* Health Monitoring period ends and new hit budget can be started. */ + + if ( HIT_TRIGGER_FLAG == 0 ) { + /* Hit budget was exceeded during this ending Health Monitoring */ + /* period. */ + + ResetPeakDetector( SU_1 ); + ResetPeakDetector( SU_2 ); + ResetPeakDetector( SU_3 ); + ResetPeakDetector( SU_4 ); + /* Reset all Peak detectors */ + + WaitTimeout( COUNTER_RESET_MIN_DELAY ); + + ENABLE_HIT_TRIGGER; + /* Allows a later falling edge on T2EX to cause */ + /* a Hit Trigger interrupt (i.e. to set EXF2). */ + + ResetDelayCounters(); + /* Resets the SU logic that generates Hit Triggers. */ + /* Brings T2EX to a high level, making a new falling */ + /* edge possible. */ + /* This statement must come after the above "enable", */ + /* since T2EX edges are not remembered by the HW from */ + /* before the "enable", unlike normal interrupt enable */ + /* and disable masking. */ + } + + break; + + case round_1_e: + + HighVoltageCurrent( ( sensor_index_t )health_mon_round ); + /* Overcurrent indicating bits related to sensor unit 2 in HV */ + /* status register are checked. */ + + break; + + case round_2_e: + + HighVoltageCurrent( ( sensor_index_t )health_mon_round ); + /* Overcurrent indicating bits related to sensor unit 3 in HV */ + /* status register are checked. */ + + break; + + case round_3_e: + + HighVoltageCurrent( ( sensor_index_t )health_mon_round ); + /* Overcurrent indicating bits related to sensor unit 4 in HV */ + /* status register are checked. */ + + break; + + case round_4_e: + + LowVoltageCurrent(); + /* 'V_DOWN' indicator bit is checked. */ + + + break; + + case round_5_e: + + if ( voltage_meas_count < 7 ) + + { + /* Seven Secondary voltage channels are measured starting when */ + /* 'voltage_meas_count' reaches a value of 6. Last measurement is*/ + /* executed on voltage_meas_count value 0. */ + + MeasureVoltage( voltage_meas_count ); + } + + break; + + case round_6_e: + + if ( ( self_test_SU_number != NO_SU ) && + ( SU_state[ self_test_SU_number - SU1 ] == self_test_e ) ) { + /* SU self test sequence continues */ + + SelfTestChannel( self_test_SU_number - SU1 ); + /* SU channels are monitored in this round. */ + + self_test_SU_number = NO_SU; + /* SU self test sequence ends here */ + } + + break; + + case round_7_e: + + if ( self_test_SU_number != NO_SU ) { + /* SU self test sequence has started */ + + self_test_flag = SELF_TEST_RUNNING; + /* Indication of a started test. */ + + SelfTest_SU( self_test_SU_number - SU1 ); + /* Supply voltages and SU temperatures are monitored in this round. */ + + if ( self_test_SU_number != NO_SU ) + SU_state[ self_test_SU_number - SU1 ] = self_test_e; + + } + + break; + + case round_8_e: + + SET_WD_RESET_HIGH; + + /* The Watch Dog time out signal state is reset HIGH state, as it is*/ + /* falling edge active. */ + + break; + + case round_9_e: + + if ( temp_meas_count < NUM_SU ) + + { + /* Two channels of one sensor unit are measured when */ + /* 'temp_meas_count' reaches 3 -> 2 -> 1 -> 0. I.e. measuring */ + /* begins after 10 secs and is finished after 50 secs. */ + + MeasureTemperature( ( sensor_index_t )temp_meas_count ); + } + + SET_WD_RESET_LOW; + + /* The Watch Dog timer is reset by setting WD_RESET bit low at I/O */ + /* port 1. This is done here with 10 sec interval. The watch dog */ + /* time-out is 12.1 secs. */ + break; + } + +} + +void UpdateTime( void ) +/* Purpose : advances time in the telemetry */ +/* Interface : inputs - telemetry_data.time */ +/* outputs - telemetry_data.time */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : Time updated in telemetry_data. */ +/* Algorithm : */ +/* Time in the telemetry_data.time is advanced until */ +/* maximum value for the variable is reached, after that it */ +/* is implicitely wrapped-around on overflow. */ +{ + + DISABLE_INTERRUPT_MASTER; + /* Disable all interrupts. */ + + internal_time ++; + /* Increment internal time. */ + + ENABLE_INTERRUPT_MASTER; + /* Enable all interrupts. */ + +} + + +void MeasureTemperature( sensor_index_t SU_index ) +/* Purpose : Measures and monitors SU temperatures */ +/* Interface : inputs - SU_index, sensor unit index (0 - 3) */ +/* telemetry_data */ +/* outputs - telemetry_data */ +/* subroutines - Read_AD_Channel() */ +/* TemperatureFailure() */ +/* Preconditions : none */ +/* Postconditions : - ADC temperature channels are measured. */ +/* - In case of an overheated SU, */ +/* 'TemperatureFailure()' function is called.i.e. */ +/* all secondary supply voltages to that SU are switched */ +/* off, SU related Bit in the Error Status Register is set*/ +/* and temperature error indicating bit in the SU_Status */ +/* register is set. */ +/* - If a measurement has failed, in addition to overheating*/ +/* response also measurement error indication bit in mode */ +/* status register is set */ +/* Algorithm : - Temperatures of a given sensor unit are measured. */ +/* - If measured temperature is large enough, it is stored */ +/* into telemetry. */ +/* */ +/* - Else measured temperature value is too small to be */ +/* stored. Zero value is stored into telemetry. */ +/* */ +/* - If temperature of any of the Sensor Units is over */ +/* MAX_TEMP, 'TemperatureFailure()' function is */ +/* called. */ +/* */ +/* - If temperature measurement of a Sensor Unit has failed,*/ +/* temperature error indicating bit in the SU_Status */ +/* register is set and TemperatureFailure()' */ +/* function is called. */ +{ + + ADC_parameters_t EXTERNAL AD_temperature_parameters; + /* This struct is used to hold parameters for Reading AD channels. */ + + unsigned char temp_limit_value; + + uint_least8_t EXTERNAL j; + /* This variable is used in for-loop. */ + + + + _Pragma( "loopbound min 2 max 2" ) + for ( j = 0; j < NUM_TEMP; j++ ) + + { + AD_temperature_parameters.ADC_channel = + 5 + ( SU_index & 1 ) * 8 + ( SU_index & 2 ) * 12 + j; + /* Select the channel to be measured. */ + + AD_temperature_parameters.ADC_max_tries = ADC_TEMPERATURE_MAX_TRIES; + /* When temperatures are measured this variable defines the maximum */ + /* amount of tries to be used in reading and handling an AD channel in */ + /* 'Read_AD_Channel()'. */ + + AD_temperature_parameters.conversion_max_tries = + CONVERSION_TEMPERATURE_MAX_TRIES; + /* When temperatures are measured this variable defines the maximum */ + /* amount of tries to be used when End Of Conversion indication is */ + /* waited in function 'Convert_AD()'. */ + + Read_AD_Channel( &AD_temperature_parameters ); + /* Get ADC temperature measurement result. */ + + + + if ( AD_temperature_parameters.unsigned_ADC & 0x8000 ) + + { + /* Temperature is stored in the telemetry. */ + + telemetry_data.SU_temperature[ SU_index ][ j ] = + ( unsigned char )( ( AD_temperature_parameters.unsigned_ADC + & 0x7FFF ) >> 7 ); + /* Store bits 7 .. 14 */ + } + + else + + { + + telemetry_data.SU_temperature[ SU_index ][ j ] = 0; + /* Temperature too small -> store zero */ + + } + + temp_limit_value = ( j == 0 ? MAX_TEMP_1 : MAX_TEMP_2 ); + + if ( telemetry_data.SU_temperature[ SU_index ][ j ] > temp_limit_value ) + + { + /* Temperature has exeeded a predefined limit */ + + TemperatureFailure( SU_index ); + /* Given SU is switched off, error and SU status registers are */ + /* updated in telemetry. */ + + } + + if ( AD_temperature_parameters.AD_execution_result != RESULT_OK ) + + { + /* An anomaly has occurred during the measurement. */ + + SetSoftwareError( MEASUREMENT_ERROR ); + /* Set measurement error indication bit in */ + /* software error status register. */ + + + + + + TemperatureFailure( SU_index ); + /* Given SU is switched off and error and SU status registers are */ + /* updated in telemetry. */ + + } + + } +} + + +void HighVoltageCurrent( sensor_index_t SU_index ) +/* Purpose : Monitors overcurrent indicating bits in the HV Status */ +/* register for a given sensor unit. */ +/* Interface : inputs - SU_index, sensor unit index (0 - 3) */ +/* telemetry_data */ +/* HV_status register */ +/* outputs - telemetry_data */ +/* subroutines - SetErrorStatus() */ +/* Set_SU_Error() */ +/* Preconditions : none */ +/* Postconditions : following registers are updated in case of an error, */ +/* - Sensor Unit or units are switched off */ +/* - Error Status register updated */ +/* - SU Status register updated */ +/* Algorithm : */ +/* - if any of the HV_Status bits indicate a short */ +/* circuit or overload, the corresponding Error Status */ +/* Bits in the Error Status and SU_Status Registers are */ +/* set. */ +{ + unsigned char EXTERNAL SU_current_mask[ ] = {3, 12, 48, 192}; + /* This array holds parameters for checking the HV status register. */ + + unsigned char EXTERNAL valid_value[ ] = {1, 4, 16, 64}; + /* This array holds comparison parameters for checking the HV status */ + /* register. */ + + if ( CHECK_CURRENT( SU_current_mask[ SU_index ] ) != + valid_value[ SU_index ] ) + + { + /* Overcurrent is detected. */ + + SetErrorStatus( ERROR_STATUS_OFFSET << SU_index ); + /* Set high corresponding bit for the SU in Error Status Register. */ + + Set_SU_Error( SU_index, HV_SUPPLY_ERROR ); + /* Set high HV supply error indicating bit in the SU_Status register*/ + + } + +} + +void LowVoltageCurrent( void ) +/* Purpose : Monitors low voltage currents in Sensor Units. */ +/* Interface : inputs - telemetry_data */ +/* V_DOWN bit */ +/* outputs - telemetry_data */ +/* subroutines - SetSensorUnitOff() */ +/* Preconditions : none */ +/* Postconditions : Following actions are taken in case of an error, */ +/* - Sensor Unit or units are switched off */ +/* - SU Status register updated */ +/* - Error Status register updated */ +/* Algorithm : */ +/* - If V_DOWN bit in I/O port 1 is LOW indicating that */ +/* +-5 V DC/DC converter(s) is(are) limiting the output */ +/* current, all SU supply voltages are */ +/* switched off and corresponding bits in the Error and */ +/* mode Status Register are set. */ +{ + + sensor_index_t EXTERNAL i; + /* This variable is used in a for-loop. */ + + unsigned char EXTERNAL exec_result; + /* This variable is used by SetSensorUnitOff() function. */ + + if ( V_DOWN == LOW ) + + { + /* An error is detected, output current is limited. */ + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < NUM_SU; i++ ) + + { + /* Switch off all Sensor Units. */ + + SetSensorUnitOff( i, &exec_result ); + /* Switch off given sensor unit. */ + + Set_SU_Error( i, LV_SUPPLY_ERROR ); + /* Set high LV supply error indicating bit in the SU_Status */ + /* register. */ + } + + SetErrorStatus( OVERALL_SU_ERROR ); + /* Set all SU error status bits in 'error status register' at telemetry.*/ + + } +} + +void MeasureVoltage( uint_least8_t channel_selector ) +/* Purpose : Measure secondary Sensor Unit voltages. */ +/* Interface : inputs - Channel selector, values 0 - 6 */ +/* outputs - telemetry_data.mode_status */ +/* subroutines - Read_AD_Channel() */ +/* VoltageFailure() */ +/* Preconditions : none */ +/* Postconditions : - Measurement results are written to telemetry. */ +/* - If a measurement has failed, measurement error */ +/* indication bit in mode status register is set and */ +/* 'VoltageFailure()' function is called.i.e. */ +/* SUs related to failed ADC channel are switched */ +/* off, SU related Bit in the Error Status Register is set*/ +/* and LV error indicating bit in the SU_Status */ +/* register is set. */ +/* Algorithm : - Secondary SU supply voltages are measured from */ +/* a given channel. */ +/* - If measurement has failed, */ +/* measurement error indication bit in mode status */ +/* register is set and 'VoltageFailure()' */ +/* function is called. */ +/* - If no errors have occurred, results are stored */ +/* in telemetry_data. */ +{ + + ADC_parameters_t EXTERNAL AD_voltage_parameters; + /* This struct is used to hold parameters for Reading AD channels. */ + + unsigned char EXTERNAL voltage_channel[ ] = { + 0x10, 0x11, 0x12, 0x13, 0x54, 0x55, 0x56 + }; + /* This array holds parameters for setting the ADC channel for the */ + /* measurement. */ + + AD_voltage_parameters.ADC_channel = voltage_channel[ channel_selector ]; + /* Select the channel to be measured: */ + /* channel_selector -> ADC channel */ + /* 0 -> 0x10 */ + /* 1 -> 0x11 */ + /* 2 -> 0x12 */ + /* 3 -> 0x13 */ + /* 4 -> 0x54 */ + /* 5 -> 0x55 */ + /* 6 -> 0x56 */ + + AD_voltage_parameters.ADC_max_tries = ADC_VOLTAGE_MAX_TRIES; + /* When voltages are measured this variable defines the maximum */ + /* amount of tries to be used in reading and handling an AD channel in */ + /* 'Read_AD_Channel()'. */ + + AD_voltage_parameters.conversion_max_tries = + CONVERSION_VOLTAGE_MAX_TRIES; + /* When voltages are measured this variable defines the maximum */ + /* amount of tries to be used when End Of Conversion indication is */ + /* waited in function 'Convert_AD()'. */ + + Read_AD_Channel( &AD_voltage_parameters ); + /* Voltage channel is read. */ + + if ( AD_voltage_parameters.AD_execution_result != RESULT_OK ) { + /* An anomaly has occurred during the measurement. */ + + SetSoftwareError( MEASUREMENT_ERROR ); + /* Set measurement error indication bit in */ + /* software error status register. */ + + } + + else { + + switch ( channel_selector ) { + /* Measurement result bits 8..15 from channels involving positive */ + /* voltages are written to telemetry. */ + + case channel_0_e: + + telemetry_data.sensor_unit_1.plus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + telemetry_data.sensor_unit_2.plus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + break; + + case channel_1_e: + + telemetry_data.sensor_unit_3.plus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + telemetry_data.sensor_unit_4.plus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + break; + + case channel_2_e: + + telemetry_data.SU_plus_50 = AD_voltage_parameters.unsigned_ADC >> 8; + + break; + + case channel_3_e: + + telemetry_data.DPU_plus_5_digital = + AD_voltage_parameters.unsigned_ADC >> 8; + + break; + + + /* Measurement result bits 8..15 from channels involving negative */ + /* voltages are written to telemetry. */ + /* Note that even here, the "unsigned" or "raw" conversion result is */ + /* used; this is a requirement. */ + + case channel_4_e: + + telemetry_data.sensor_unit_1.minus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + telemetry_data.sensor_unit_2.minus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + break; + + case channel_5_e: + + telemetry_data.sensor_unit_3.minus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + telemetry_data.sensor_unit_4.minus_5_voltage = + AD_voltage_parameters.unsigned_ADC >> 8; + + break; + + case channel_6_e: + + telemetry_data.SU_minus_50 = + AD_voltage_parameters.unsigned_ADC >> 8; + + break; + } + } +} + +void InitSystem( void ) +/* Purpose : Initialize system after RTX system is started. */ +/* Interface : inputs - none */ +/* outputs - none */ +/* subroutines - SetTimeSlice() */ +/* WaitInterval() */ +/* CreateTask() */ +/* Preconditions : RTX is on. */ +/* Postconditions : System initialization duties are carried out i.e. rtx */ +/* tasks are activated, system clock interval is set. */ +/* Algorithm : - Set system clock interval */ +/* - Wait for automatic A/D converter calibration. */ +/* - Activate the Telecommand Execution task. */ +/* - Activate the Acquisition task. */ +/* - Activate Hit Trigger Interrupt Service task. */ +{ + task_info_t EXTERNAL new_task; + /* Parameters for creating new task */ + + SetTimeSlice( SYSTEM_INTERVAL ); + /* Set system clock interval */ + + WaitInterval( BOOT_WAIT_INTERVAL ); + /* Wait for automatic A/D converter calibration */ + + new_task.rtx_task_number = TC_TM_INTERFACE_TASK; + new_task.task_main_function = TC_task; + CreateTask( &new_task ); + /* Activate the Telecommand Execution task */ + + new_task.rtx_task_number = ACQUISITION_TASK; + new_task.task_main_function = acq_task; + CreateTask( &new_task ); + /* Activate the Acquisition task */ + + new_task.rtx_task_number = HIT_TRIGGER_ISR_TASK; + new_task.task_main_function = hit_task; + CreateTask( &new_task ); + /* Activate Hit Trigger Interrupt Service task */ + +} + +void CalculateChecksum( uint_least8_t checksum_count ) +/* Purpose : Calculates memory checksum. */ +/* Interface : inputs - 'checksum_count' gives the current */ +/* checksum loop cycle value, */ +/* MIN_CHECKSUM_COUNT <= 'checksum_count' */ +/* <= MAX_CHECKSUM_COUNT */ +/* */ +/* - 'reference_checksum' variable to verify */ +/* correct codememory. */ +/* - global variable 'code_not_patched' */ +/* outputs - 'code_checksum' is modified. */ +/* - value of global variable */ +/* 'code_not_patched' is conditionally set. */ +/* subroutines - Reboot() */ +/* Preconditions : none */ +/* Postconditions : Changes values of variable 'code_checksum' and */ +/* on first round variable 'code_not_patched'. */ +/* */ +/* - In case of a checksum error, */ +/* Soft reset is executed, if 'code_not_patched' */ +/* indication enables this. */ +/* */ +/* Algorithm : - Health monitoring calculates checksum with XOR for */ +/* CHECK_SIZE amount of codememory bytes at a time. At */ +/* the end of the check cycle, i.e. 'checksum_count' = 0, */ +/* the variable 'code_checksum' */ +/* should be equal with 'reference_checksum', if no */ +/* errors have occurred and code has not been patched */ +/* during the checksum cycle. */ +/* */ +/* - If an error is detected in the code memory, Reboot() */ +/* function is called. */ +/* */ +/* - if no anomalies have been encountered there will be no */ +/* changes and checksum loop starts from the beginning */ +/* i.e. on 'checksum_count' = 59, 'code_not_patched' */ +/* is set and 'code_checksum' is initialised. */ +{ + code_address_t EXTERNAL i; + /* This variable is used in a for-loop. */ + + code_address_t EXTERNAL check_start; + /* This variable is used for determining the start address of a given */ + /* check. */ + + code_address_t EXTERNAL check_end; + /* This variable is used for determining the end address of a given check.*/ + + check_start = checksum_count * CHECK_SIZE; + + if ( checksum_count == MAX_CHECKSUM_COUNT ) + + { + /* This piece ends at the top memory address. */ + check_end = CODE_MEMORY_END; + } + + else + + check_end = check_start + ( CHECK_SIZE - 1 ); + + if ( checksum_count == MAX_CHECKSUM_COUNT ) { + + code_checksum = 0; + /* This global variable is used to store the result from each XOR */ + /* calculation during a code memory checksum round. It is cleared */ + /* here at the beginning of a new cycle and checked at the end of */ + /* each cycle against 'reference_checksum'. */ + + code_not_patched = 1; + /* This global variable shows whether code is patched during a code */ + /* memory checksum cycle. It is set here at the beginning of a new */ + /* cycle and checked at the end of each cycle whether it has been */ + /* cleared as an indication of an executed code patching. */ + } + + + _Pragma( "loopbound min 547 max 547" ) + for ( i = check_start; i <= check_end; i++ ) + + { + /* It is assumed that 'CODE_MEMORY_END' < 2^16 - 1 */ + /* Otherwise variable 'i' can never have a value */ + /* larger than 'check_end' and this loop will never */ + /* stop. */ + + code_checksum ^= GET_CODE_BYTE( i ); + /* XOR is counted for code memory byte under check. */ + } + + if ( ( checksum_count == MIN_CHECKSUM_COUNT ) + && ( code_checksum != reference_checksum ) ) { + /* Checksum mismatch due to a memory error or */ + /* code memory patch. */ + + if ( code_not_patched ) { + /* An anomaly has been detected in the code memory */ + /* area. Code has not been patched during this code */ + /* memory checksum cycle. */ + + Reboot ( checksum_reset_e ); + /* Soft reset is executed, as global variable */ + /* 'code_not_patched' enables it. Note that */ + /* Reboot() does not return here. */ + } + } + +} + + +void UpdatePeriodCounter( + uint_least8_t EXTERNAL *counter, + uint_least8_t full_counter_value ) +/* Purpose : Advances counters */ +/* Interface : inputs - address to counter variable */ +/* outputs - none */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : counter value is adjusted */ +/* Algorithm : - If a given counter is not already zero, its value is */ +/* decreased. */ +/* - Else it set to its initialization value. */ +{ + if ( *counter ) + + { + ( *counter )--; + /* Decrease temperature measurement counter. */ + } + + else { + *counter = full_counter_value; + /* Reset temperature measurement counter. */ + } +} + + + +void Convert_AD ( ADC_parameters_t EXTERNAL *ADC_parameters ) +/* Purpose : Conversion is executed on a selected AD channel */ +/* Interface : inputs - Address of a struct for storing the ADC */ +/* results. */ +/* outputs - ADC results are stored to the given struct */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : ADC results are written to a struct */ +/* Algorithm : - AD Conversion is started on the selected channel. */ +/* - End of conversion is polled, EOC bit at I/O port 1, */ +/* as long as the preset limit is not exceeded. */ +/* - If limit has not been exeeded, resulting MSB and LSB of*/ +/* the conversion are read from the HW registers and */ +/* combined into one word. */ +/* Else end of conversion can no longer be waited. No */ +/* results are gained, instead a zero is stored with an */ +/* indication of this occurred anomaly. */ +{ + unsigned char DIRECT_INTERNAL conversion_count; + + /* Counts the amount of end of conversion polls. */ + + unsigned char DIRECT_INTERNAL msb, lsb; + /* MSB and LSB of the conversion result */ + + unsigned int DIRECT_INTERNAL word; + /*This variable is used to combine MSB and LSB bytes into one word. */ + + START_CONVERSION; + + conversion_count = 0; + + _Pragma( "loopbound min 0 max 5" ) + while ( conversion_count < ADC_parameters -> conversion_max_tries + && ( END_OF_ADC != CONVERSION_ACTIVE ) ) { + /* Previous conversion is still active. */ + conversion_count++; + } + + /* There is a slight chance for the following occurrence: */ + /* Conversion has ended after max_tries has been reached but before the */ + /* following condition loop is entered. As a result measurement is failed */ + /* even if conversion has ended in time. The effect is dimished if the */ + /* max_tries is a large value i.e. end of conversion has been waited long */ + /* enough. */ + + if ( conversion_count < ADC_parameters -> conversion_max_tries ) + + { + /* Conversion has ended. Read AD result. */ + + msb = GET_RESULT; + lsb = GET_RESULT; + + word = ( unsigned int )msb * 256 + lsb; + /* Combine MSB and LSB as type 'unsigned int' in the given struct. */ + + ADC_parameters -> signed_ADC = ( signed short int )( word ^ 0x8000 ); + /* Store result as of type 'signed int'. */ + + ADC_parameters -> unsigned_ADC = word; + /* Store result as of type 'unsigned int'. */ + + ADC_parameters -> AD_execution_result = RESULT_OK; + /* Store indication of an succesful measurement. */ + + } + + else + + { + + /* Conversion has not ended in time. No results gained, store zero. */ + ADC_parameters -> unsigned_ADC = 0; + ADC_parameters -> signed_ADC = 0; + + /* Store indication of an unsuccesful measurement. */ + ADC_parameters -> AD_execution_result = CONVERSION_ACTIVE; + + } + +} + +void VoltageFailure( channel_t ADC_channel ) +/* Purpose : Takes care of resulting actions in case of a failed */ +/* measurement. */ +/* Interface : inputs - 'ADC_channel' related to the failed */ +/* measurement. */ +/* */ +/* outputs - telemetry_data.error_status register */ +/* telemetry_data.SU_status register */ +/* telemetry_data.mode_status register */ +/* subroutines - none */ +/* Preconditions : There has been an anomaly */ +/* during an ADC channel measurement. */ +/* Postconditions : Sensor unit(s) related error indication bit(s) are set */ +/* in error_status, SU_status and mode_status registers. */ +/* Algorithm : */ +/* 'ADC_channel' is the number of the channel which failed */ +/* measurement. The following actions are taken. */ +/* - Find out which sensor units are related to failed */ +/* measurement and store indications of these target */ +/* SUs in the 'SU_action[ ]' array. */ +/* - If channel number indicates that the DPU voltage */ +/* measurement has failed, set high DPU +5V measurement*/ +/* error indicating bit in the mode_status register. */ +/* - Set Error status bit of the related SU(s) in error */ +/* status register. */ +/* - If the channel number is for +- 50V, set high the */ +/* HV supply error indicating bit in the SU_Status */ +/* register for the related SU(s). */ +/* - If the channel number if low voltage, set high the */ +/* LV supply error indicating bit in the SU_Status */ +/* register for the related SU(s). */ +{ + unsigned char EXTERNAL i; + /* This variable is used in a for-loop. */ + + unsigned char EXTERNAL SU_action[ NUM_SU ] = {LOW, LOW, LOW, LOW}; + /* This array stores actions targeted at a SU judging by the given */ + /* ADC information. */ + + + /* Voltage measurement has failed, actions are taken accordingly. */ + + + if ( ADC_channel == 0x10 || ADC_channel == 0x54 ) + + { + /* Measurement of channels related to sensor units 1 and 2 have */ + /* failed. */ + + SU_action[ su1_e ] = HIGH; + SU_action[ su2_e ] = HIGH; + + /* Select sensor units 1 and 2 as targets in the 'SU_action' array. */ + + SetModeStatusError( SUPPLY_ERROR ); + /* Set Supply Error. */ + + + } + + else + if ( ADC_channel == 0x11 || ADC_channel == 0x55 ) + + { + /* Measurement of channels related to sensor units 3 and 4 have */ + /* failed. */ + + SU_action[ su3_e ] = HIGH; + SU_action[ su4_e ] = HIGH; + + /* Select sensor units 3 and 4 as targets in the 'SU_action' array. */ + } + + else + if ( ADC_channel == 0x12 || ADC_channel == 0x56 ) + + { + /* Measurement of channels related to all sensor units have */ + /* failed. */ + + SU_action[ su1_e ] = HIGH; + SU_action[ su2_e ] = HIGH; + SU_action[ su3_e ] = HIGH; + SU_action[ su4_e ] = HIGH; + + /* Select all sensor units as targets in the 'SU_action' array. */ + } + + else + if ( ADC_channel == 0x13 ) + + { + /* Measurement of a channel related to DPU voltage has failed. */ + + SetModeStatusError( SUPPLY_ERROR ); + /* Set high DPU +5V supply error indicating bit in the */ + /* mode status register. */ + + } + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < NUM_SU; i++ ) + + { + /* Set error indications related to selected Sensor Units. */ + + if ( SU_action[ i ] ) + + { + SetErrorStatus ( ERROR_STATUS_OFFSET << i ); + /* Set Error status bit of the related SU in error status */ + /* register. */ + + if ( ADC_channel == 0x12 + || ADC_channel == 0x56 ) { + Set_SU_Error ( i, HV_SUPPLY_ERROR ); + /* Set high HV supply error indicating bit in the */ + /* SU_Status register. */ + } + + if ( ADC_channel == 0x10 + || ADC_channel == 0x11 + || ADC_channel == 0x54 + || ADC_channel == 0x55 ) { + Set_SU_Error ( i, LV_SUPPLY_ERROR ); + /* Set high LV supply error indicating bit in the */ + /* SU_Status register. */ + } + + } + + } +} + + +void TemperatureFailure( sensor_index_t SU_index ) +/* Purpose : Takes care of resulting actions in case of a failed */ +/* measurement. */ +/* Interface : inputs - 'SU_index' which contains sensor unit */ +/* index number related to failed measurement */ +/* or overheated SU. */ +/* outputs - telemetry_data.error_status register */ +/* telemetry_data.SU_status register */ +/* subroutines - SetSensorUnitOff() */ +/* Preconditions : There has been an anomaly */ +/* during an ADC temperature channel measurement or */ +/* measurement has revealed that the given SU is */ +/* overheated. */ +/* Postconditions : Selected Sensor unit is switched off and error indication*/ +/* bit is set in error_status register and SU_status */ +/* register. */ +/* Algorithm : Following actions are taken, */ +/* - switch off given sensor unit */ +/* - Set Error status bit of the related SU in error */ +/* status register. */ +/* - Set high temperature error indicating bit in the */ +/* SU_Status register. */ +{ + + unsigned char EXTERNAL exec_result; + /* This variable is used by SetSensorUnitOff() function. */ + + /* Temperature measurement has failed, actions are taken accordingly. */ + + SetSensorUnitOff( SU_index, &exec_result ); + /* Switch off given sensor unit. */ + + SetErrorStatus( ERROR_STATUS_OFFSET << SU_index ); + /* Set Error status bit of the related SU in error status register. */ + + Set_SU_Error( SU_index, TEMPERATURE_ERROR ); + /* Set high temperature error indicating bit in the SU_Status */ + /* register. */ +} + + + + + + + +/*****************************************************************************/ +/* AD conversion routines */ +/*****************************************************************************/ + + +void DelayAwhile ( unsigned short duration ) +/* Purpose : Delay for a (brief) duration. */ +/* Interface : inputs - delay duration, in ShortDelay() units. */ +/* outputs - none. */ +/* subroutines - ShortDelay() */ +/* Preconditions : none. */ +/* Postconditions : at least "duration" time units have passed. */ +/* Algorithm : Call ShortDelay() as many times as necessary to delay */ +/* for at least the desired duration. */ +{ + _Pragma( "loopbound min 1 max 1" ) + while ( duration > MAX_SHORT_DELAY ) { + ShortDelay ( MAX_SHORT_DELAY ); + duration = duration - MAX_SHORT_DELAY; + /* Since ShortDelay() has a positive constant delay term, the */ + /* actual total delay will be a little larger than 'duration'. */ + } + + if ( duration > 0 ) { + /* Some delay left after the loop above. */ + ShortDelay ( ( unsigned char ) duration ); + } +} + + +void Read_AD_Channel ( ADC_parameters_t EXTERNAL *ADC_parameters ) +/* Purpose : Reading an ADC channel */ +/* Interface : inputs - Address of a struct which contains */ +/* parameters for this function. */ +/* outputs - Results are stored to the previously */ +/* mentioned structure. */ +/* subroutines - Convert() */ +/* Preconditions : Health monitoring is on. */ +/* ADC_parameters.ADC_max_tries > 0. */ +/* Postconditions : AD channels are measured and results written to a given */ +/* structure. */ +/* Algorithm : */ +/* while */ +/* - Hit trigger interrupt indicating flag is resetted. */ +/* - Handling of the given channel is started in a while */ +/* loop. */ +/* - Channel to be converted is selected by setting bits */ +/* 0 - 6 from ADC Channel register to value of channel.*/ +/* Channel value includes BP_UP bit to select */ +/* unipolar/bipolar mode. */ +/* - Convert_AD() function executes the conversion and */ +/* stores the results in the given struct mentioned */ +/* earlier. */ +/* - If Hit trigger interrupt flag indicates that no */ +/* hit trigger interrupts have occurred during the */ +/* channel reading, exit the while loop. */ +/* Else continue loop from beginning, if */ +/* predefined limit for executing the loop has not been*/ +/* reached. */ +/* - If all the conversion tries have been used up and */ +/* Hit trigger interrupt has corrupted the results, */ +/* only a zero is stored with an indication of this */ +/* occurred anomaly. */ +/* End of loop */ +{ + unsigned char EXTERNAL tries_left; + /* Number of attempts remaining to try conversion without */ + /* interference from a particle hit. */ + + unsigned short EXTERNAL delay_limit; + /* Delay between channel selection and start of conversion in */ + /* ShortDelay() units. */ + + delay_limit = DELAY_LIMIT( 2000 ); + /* Set delay limit to 2ms. */ + + tries_left = ADC_parameters -> ADC_max_tries; + /* Limits the number of conversion attempts repeated because */ + /* of particle hit interrupts. Assumed to be at least 1. */ + + _Pragma( "loopbound min 1 max 8" ) + while ( tries_left > 0 ) { + confirm_hit_result = 0; + /* Clear interrupt indicating flag. */ + + ADC_channel_register = ( ADC_channel_register & 0x80 ) | + ADC_parameters -> ADC_channel; + UPDATE_ADC_CHANNEL_REG; + /* AD Channel register is set. */ + + START_CONVERSION; + /* Initiate dummy cycle to set AD mode to unipolar or bipolar. */ + + DelayAwhile ( delay_limit ); + /* Wait for analog signal and MUX to settle. */ + + Convert_AD( ADC_parameters ); + /* Start conversion and measurement. */ + + tries_left--; + /* Repeat while-loop until the max number of tries. */ + + if ( confirm_hit_result == 0 ) { + /* Conversion has NOT been interrupted by a hit trigger interrupt. */ + /* Exit from the while-loop. */ + + tries_left = 0; + } + } + + if ( confirm_hit_result != 0 ) + + { + /* Conversion has been interrupted by a hit trigger interrupt. Discard */ + /* corrupted results. */ + + ADC_parameters -> unsigned_ADC = 0; + ADC_parameters -> signed_ADC = 0; + + ADC_parameters -> AD_execution_result = HIT_OCCURRED; + /* Store indication of an unsuccessful measurement. */ + + } + + else + if ( ADC_parameters -> AD_execution_result == CONVERSION_ACTIVE + && confirm_hit_result == 0 ) { + SetModeStatusError( ADC_ERROR ); + /* ADC error indication is set because a time-out has */ + /* occurred during AD conversion and no hit trigger interrupt */ + /* has occurred. */ + } + + + /* Either RESULT_OK or CONVERSION_ACTIVE indications are already */ + /* stored in the 'ADC_parameters -> AD_execution_result' field */ + /* as a result from conversion in the Convert() function. */ +} + + + + + + + + + +void DAC_SelfTest( unsigned char DAC_output, + ADC_parameters_t EXTERNAL *ADC_test_parameters ) +/* Purpose : To test the analog signal chain in the circuitry. */ +/* Interface : inputs - Test data 'DAC_Output */ +/* - struct 'ADC_test_parameters' */ +/* outputs - none */ +/* subroutines - Read_AD_Channel() */ +/* Preconditions : none */ +/* Postconditions : DAC selftest is carried out and results written to a */ +/* given struct. */ +/* Algorithm : */ +/* - Test data is written to HW registers. */ +/* - Test channel is AD converted. */ +/* - Results are stored in a given structure. */ +/* - If the measurement has failed, */ +/* */ +/* - Set self test error indication bit in mode status */ +/* register */ +/* - Set measurement error indication bit in mode status */ +/* register. */ +{ + + SET_DAC_OUTPUT( DAC_output ); + /*test data is written to DAC output */ + + Read_AD_Channel( ADC_test_parameters ); + /* Start reading the channel. */ + + if ( ADC_test_parameters -> AD_execution_result != RESULT_OK ) + + { + /* An anomaly has occurred during the measurement. */ + + Set_SU_Error( ADC_test_parameters -> sensor_unit - SU1, + SELF_TEST_ERROR ); + /* Self self test error indication bit in mode status register. */ + /* Offset in numbering is taken into account by transforming */ + /* 'sensor_unit' (value 1-4) to a sensor unit index (value 0-3) */ + + SetSoftwareError( MEASUREMENT_ERROR ); + /* Set measurement error indication bit in */ + /* software error status register. */ + + } +} + + +void Monitor_DPU_Voltage( void ) +/* Purpose : Monitors DPU voltages */ +/* Interface : inputs - telemetry_data, DPU voltages */ +/* outputs - telemetry_data.mode_status */ +/* telemetry_data, supply voltages */ +/* subroutines - SetModeStatusError */ +/* ExceedsLimit */ +/* MeasureVoltage */ +/* Preconditions : none */ +/* Postconditions : DPU voltages are measured and monitored. */ +/* Algorithm : */ +/* - Channels are checked one by one and in case of an error*/ +/* corresponding error bit is set. */ +{ + MeasureVoltage( DPU_5V_SELECTOR ); + MeasureVoltage( SU_1_2_P5V_SELECTOR ); + MeasureVoltage( SU_1_2_M5V_SELECTOR ); + + /* Result of voltage measurement from SU_1/2 +5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.sensor_unit_1.plus_5_voltage, + SU_P5V_ANA_LOWER_LIMIT, + SU_P5V_ANA_UPPER_LIMIT ) ) + SetModeStatusError( SUPPLY_ERROR ); + + /* Result of voltage measurement from SU_1/2 -5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.sensor_unit_1.minus_5_voltage, + SU_M5V_ANA_LOWER_LIMIT, + SU_M5V_ANA_UPPER_LIMIT ) ) + SetModeStatusError( SUPPLY_ERROR ); + + /* Result of voltage measurement from DIG +5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.DPU_plus_5_digital, + DPU_P5V_DIG_LOWER_LIMIT, + DPU_P5V_DIG_UPPER_LIMIT ) ) + SetModeStatusError( SUPPLY_ERROR ); + +} + + +void Monitor_SU_Voltage( sensor_index_t self_test_SU_index ) +/* Purpose : Monitors SU voltages */ +/* Interface : inputs - self_test_SU_index */ +/* telemetry_data, sensor voltages */ +/* outputs - telemetry_data.SU_error */ +/* subroutines - ExceedsLimit */ +/* Set_SU_Error */ +/* Preconditions : SU voltages are measured */ +/* Postconditions : SU voltages are monitored. */ +/* Algorithm : */ +/* - Channels are checked one by one and in case of an error*/ +/* corresponding error bit is set. */ +{ + switch ( self_test_SU_index ) { + case su1_e: + case su2_e: + + /* Result of voltage measurement from SU_1/2 +5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.sensor_unit_1.plus_5_voltage, + SU_P5V_ANA_LOWER_LIMIT, + SU_P5V_ANA_UPPER_LIMIT ) ) + Set_SU_Error( self_test_SU_index, LV_LIMIT_ERROR ); + + /* Result of voltage measurement from SU_1/2 -5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.sensor_unit_1.minus_5_voltage, + SU_M5V_ANA_LOWER_LIMIT, + SU_M5V_ANA_UPPER_LIMIT ) ) + Set_SU_Error( self_test_SU_index, LV_LIMIT_ERROR ); + + break; + + + case su3_e: + case su4_e: + + /* Result of voltage measurement from SU_3/4 +5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.sensor_unit_3.plus_5_voltage, + SU_P5V_ANA_LOWER_LIMIT, + SU_P5V_ANA_UPPER_LIMIT ) ) + Set_SU_Error( self_test_SU_index, LV_LIMIT_ERROR ); + + /* Result of voltage measurement from SU_3/4 -5V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.sensor_unit_3.minus_5_voltage, + SU_M5V_ANA_LOWER_LIMIT, + SU_M5V_ANA_UPPER_LIMIT ) ) + Set_SU_Error( self_test_SU_index, LV_LIMIT_ERROR ); + + break; + } + + /* Result of voltage measurement from SU +50V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.SU_plus_50, + SU_P50V_LOWER_LIMIT, + SU_P50V_UPPER_LIMIT ) ) + Set_SU_Error( self_test_SU_index, HV_LIMIT_ERROR ); + + /* Result of voltage measurement from SU -50V is compared against */ + /* limits. */ + + if ( ExceedsLimit( telemetry_data.SU_minus_50, + SU_M50V_LOWER_LIMIT, + SU_M50V_UPPER_LIMIT ) ) + Set_SU_Error( self_test_SU_index, HV_LIMIT_ERROR ); +} + +void SelfTest_SU( sensor_index_t self_test_SU_index ) +/* Purpose : Execute SU self tests */ +/* Interface : inputs - self_test_SU_index */ +/* outputs - none */ +/* subroutines - LowVoltageCurrent() */ +/* MeasureVoltage() */ +/* MeasureTemperature() */ +/* HighVoltageCurrent() */ +/* Preconditions : none */ +/* Postconditions : Part of the Self Test sequence regarding temperatures, */ +/* voltages and overcurrents is completed. */ +/* Algorithm : - V_DOWN is checked */ +/* - Voltage channels are checked one by one and in case of */ +/* an error corresponding error bit is set. */ +/* - SU Temperatures and HV Status Register is checked. */ +{ + uint_least8_t EXTERNAL i; + /* Used in a for loop */ + + LowVoltageCurrent(); + /* V_DOWN is checked. */ + + HighVoltageCurrent( self_test_SU_index ); + /* HV Status register is checked. */ + + /* SU voltages are measured */ + _Pragma( "loopbound min 7 max 7" ) + for ( i = channel_0_e; i <= channel_6_e; i++ ) { + MeasureVoltage( i ); + /* All voltage channels are measured. */ + } + + Monitor_SU_Voltage( self_test_SU_index ); + /* Voltage measurement results are monitored against limits. */ + + MeasureTemperature( self_test_SU_index ); + /* SU temperatures are measured and monitored. */ +} + +unsigned char ExceedsLimit( + unsigned char value, + unsigned char lower_limit, + unsigned char upper_limit ) +/* Purpose : Tests given value against given limits. */ +/* Interface : inputs - value */ +/* lower_limit */ +/* upper_limit */ +/* outputs - boolean value */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : Given value is tested. */ +/* Algorithm : See below, self explanatory. */ +{ + return ( value < lower_limit || value > upper_limit ); +} + + +void SelfTestChannel( sensor_index_t self_test_SU_index ) +/* Purpose : Starts channel tests */ +/* Interface : inputs - self_test_SU_index */ +/* outputs - none */ +/* subroutines - SetTestPulseLevel */ +/* SetTriggerLevel */ +/* RestoreSettings */ +/* ExecuteChannelTest */ +/* DisableAnalogSwitch */ +/* Preconditions : none */ +/* Postconditions : SU channels are self tested. */ +/* voltages and overcurrents is completed. */ +/* Algorithm : - Threshold level is set high. */ +/* - Test pulse level for a given channel is set high. */ +/* - Channels are tested. */ +/* - Threshold level is set low. */ +/* - Test pulse level for a given channel is set low . */ +/* - Channels are tested. */ +/* - A pseudo trigger is generated in order to reset peak */ +/* detector and delay counter in AcquisitionTask. */ +/* - Threshold levels are restored to the level prior to */ +/* the test. SU state for the SU under test is restored */ +/* to ON. */ +{ + trigger_set_t EXTERNAL test_threshold; + + DISABLE_HIT_TRIGGER; + + /* Initial parameters for SetTriggerLevel function. */ + test_threshold.sensor_unit = self_test_SU_number; + test_threshold.level = MAX_PLASMA_SELF_TEST_THRESHOLD; + test_threshold.channel = PLASMA_1_PLUS; + SetTriggerLevel( &test_threshold ); + test_threshold.channel = PLASMA_1_MINUS; + SetTriggerLevel( &test_threshold ); + test_threshold.channel = PLASMA_2_PLUS; + SetTriggerLevel( &test_threshold ); + + test_threshold.level = MAX_PIEZO_SELF_TEST_THRESHOLD; + test_threshold.channel = PZT_1_2; + SetTriggerLevel( &test_threshold ); + + + /* Set initial test pulse value to 0. Test pulse value is also zeroed */ + /* before returning from ExecuteChannelTest procedure also. */ + SetTestPulseLevel( 0 ); + + /* Test threshold level is set before each channel test for every channel*/ + /* and value is set back to the maximum threshold level before returning */ + /* from the following ExecuteChannelTest procedure calls. */ + + test_threshold.channel = PLASMA_1_PLUS; + test_threshold.level = HIGH_PLASMA_1_PLUS_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PLASMA_1_PLUS, PLASMA_1_PLUS_HIGH ); + + test_threshold.channel = PLASMA_1_MINUS; + test_threshold.level = HIGH_PLASMA_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PLASMA_1_MINUS, PLASMA_1_MINUS_HIGH ); + + ExecuteChannelTest( self_test_SU_index, PLASMA_2_PLUS, PLASMA_2_PLUS_HIGH ); + + test_threshold.channel = PZT_1_2; + test_threshold.level = HIGH_PIEZO_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PZT_1, PZT_1_HIGH ); + + test_threshold.channel = PZT_1_2; + test_threshold.level = HIGH_PIEZO_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PZT_2, PZT_2_HIGH ); + + test_threshold.channel = PLASMA_1_PLUS; + test_threshold.level = LOW_PLASMA_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PLASMA_1_PLUS, PLASMA_1_PLUS_LOW ); + + test_threshold.channel = PLASMA_1_MINUS; + test_threshold.level = LOW_PLASMA_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PLASMA_1_MINUS, PLASMA_1_MINUS_LOW ); + + ExecuteChannelTest( self_test_SU_index, PLASMA_2_PLUS, PLASMA_2_PLUS_LOW ); + + test_threshold.channel = PZT_1_2; + test_threshold.level = LOW_PIEZO_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PZT_1, PZT_1_LOW ); + + test_threshold.channel = PZT_1_2; + test_threshold.level = LOW_PIEZO_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + ExecuteChannelTest( self_test_SU_index, PZT_2, PZT_2_LOW ); + + ENABLE_HIT_TRIGGER; + + SET_HIT_TRIGGER_ISR_FLAG; + /* A pseudo trigger is generated in order to reset peak */ + /* detector and delay counter in AcquisitionTask. */ + /* No event is recorded i.e. event processing is disabled */ + /* because SU state is 'self_test_e'. */ + + RestoreSettings( self_test_SU_index ); +} + + +void ExecuteChannelTest( + sensor_index_t self_test_SU_index, + unsigned char test_channel, + unsigned char test_pulse_level ) +/* Purpose : Execute SU self tests */ +/* Interface : inputs - self_test_SU_index, test_channel */ +/* outputs - telemetry_data.SU# Status */ +/* subroutines - SelectSelfTestChannel */ +/* SelectStartSwitchLevel */ +/* WaitTimeout */ +/* DelayAwhile */ +/* SelectTriggerSwitchLevel */ +/* Preconditions : none */ +/* Postconditions : Self test trigger siggnal is generated. */ +/* voltages and overcurrents is completed. */ +/* Algorithm : - Self test channel is selected. */ +/* - Analog switch starting level is selected depending on */ +/* the channel. */ +/* - A pseudo trigger is generated in order to reset peak */ +/* detector and delay counter in AcquisitionTask. */ +/* - Hit trigger processing is waited for 40 ms. */ +/* - Hit trigger processing for this self test pulse is */ +/* enabled by setting SU state to 'self_test_trigger_e' */ +/* - Analog switch triggering level is selected depending */ +/* on the channel (rising or falliing edge). */ +/* - If self test trigger pulse did not cause an interrupt, */ +/* set SELF_TEST_ERROR indication in SU status register */ +/* and restore SU state to 'self_test_e'. */ +{ + unsigned short EXTERNAL delay_limit; + trigger_set_t EXTERNAL test_threshold; + + if ( test_channel == PLASMA_1_PLUS || + test_channel == PLASMA_1_MINUS || + test_channel == PLASMA_2_PLUS ) { + SelectSelfTestChannel( test_channel ); + + EnableAnalogSwitch( self_test_SU_index ); + + WaitTimeout( 1 ); + + ResetPeakDetector( self_test_SU_index + SU1 ); + + WaitTimeout( 1 ); + + ResetPeakDetector( self_test_SU_index + SU1 ); + + WaitTimeout( 1 ); + + CLEAR_HIT_TRIGGER_ISR_FLAG; + + ResetDelayCounters(); + + SU_state[ self_test_SU_index ] = self_test_trigger_e; + /* Enable hit trigger processing for this self test pulse. */ + + ENABLE_HIT_TRIGGER; + + SetTestPulseLevel( test_pulse_level ); + + /* Set at least 1ms test pulse */ + delay_limit = DELAY_LIMIT( 1000 ); + DelayAwhile( delay_limit ); + + /* For plasma 1i channel triggering must take place in 1ms after */ + /* rising edge. */ + if ( test_channel == PLASMA_1_MINUS && + SU_state[ self_test_SU_index ] == self_test_trigger_e ) { + /* Self test trigger pulse did not cause an interrupt. */ + Set_SU_Error( self_test_SU_index, SELF_TEST_ERROR ); + + SU_state[ self_test_SU_index ] = self_test_e; + /* Triggering of a self test pulse is disabled by restoring */ + /* the self_test_e state. */ + } + + /* Test pulse is always at least 3ms (=1ms+2ms) */ + delay_limit = DELAY_LIMIT( 2000 ); + DelayAwhile( delay_limit ); + + SetTestPulseLevel( 0 ); + + if ( test_channel == PLASMA_2_PLUS ) + SET_HIT_TRIGGER_ISR_FLAG; + + /* If channel is plasma 1e or 2e then wait at least 1ms after */ + /* falling edge. */ + if ( test_channel != PLASMA_1_MINUS ) { + delay_limit = DELAY_LIMIT( 1000 ); + /* Set at least 1ms test pulse */ + DelayAwhile( delay_limit ); + } + + DISABLE_HIT_TRIGGER; + + if ( test_channel != PLASMA_2_PLUS ) { + test_threshold.sensor_unit = self_test_SU_index + SU1; + test_threshold.channel = test_channel; + test_threshold.level = MAX_PLASMA_SELF_TEST_THRESHOLD; + SetTriggerLevel( &test_threshold ); + } + + DisableAnalogSwitch( self_test_SU_index ); + } else { + SelectSelfTestChannel( test_channel ); + + SetTestPulseLevel( test_pulse_level ); + + WaitTimeout( 1 ); + + ResetPeakDetector( self_test_SU_index + SU1 ); + + WaitTimeout( 1 ); + + ResetPeakDetector( self_test_SU_index + SU1 ); + + WaitTimeout( 1 ); + + CLEAR_HIT_TRIGGER_ISR_FLAG; + + ResetDelayCounters(); + + SU_state[ self_test_SU_index ] = self_test_trigger_e; + /* Enable hit trigger processing for this self test pulse. */ + + ENABLE_HIT_TRIGGER; + + EnableAnalogSwitch( self_test_SU_index ); + + /* Set at least 1ms test pulse */ + delay_limit = DELAY_LIMIT( 1000 ); + DelayAwhile( delay_limit ); + + DISABLE_HIT_TRIGGER; + + SetTestPulseLevel( 0 ); + + DisableAnalogSwitch( self_test_SU_index ); + + test_threshold.sensor_unit = self_test_SU_index + SU1; + test_threshold.level = MAX_PIEZO_SELF_TEST_THRESHOLD; + test_threshold.channel = PZT_1_2; + SetTriggerLevel( &test_threshold ); + } + + if ( SU_state[ self_test_SU_index ] == self_test_trigger_e ) { + /* Self test trigger pulse did not cause an interrupt. */ + Set_SU_Error( self_test_SU_index, SELF_TEST_ERROR ); + + SU_state[ self_test_SU_index ] = self_test_e; + /* Triggering of a self test pulse is disabled by restoring */ + /* the self_test_e state. */ + } +} + +void RestoreSettings( sensor_index_t self_test_SU_index ) +/* Purpose : Restores settings after SU self tests. */ +/* Interface : inputs - self_test_SU_index, */ +/* telemetry_data, SU threshold levels */ +/* outputs - HW registers, thresholds */ +/* SU state */ +/* subroutines - SetTriggerLevel */ +/* Switch_SU_State */ +/* Preconditions : none */ +/* Postconditions : - Threshold levels are restored to the level prior to */ +/* the test. SU state for the SU under test is restored */ +/* to ON. */ +/* Algorithm : - Original threshold levels are copied from */ +/* telemetry_data and written in to HW registers with */ +/* SetTriggerLevel. */ +/* - SU state is restored to ON with Switch_SU_State. */ +{ + SU_settings_t EXTERNAL *const PROGRAM setting_map_c[ ] = { + &telemetry_data.sensor_unit_1, + &telemetry_data.sensor_unit_2, + &telemetry_data.sensor_unit_3, + &telemetry_data.sensor_unit_4 + }; + /* Pointers to Sensor Unit configuration data in telemetry */ + /* data area. */ + + SU_settings_t EXTERNAL *INDIRECT_INTERNAL SU_setting; + /* Pointer to configuration data of the Sensor Unit being */ + /* Self Tested. */ + + sensor_unit_t EXTERNAL SU_switch; + trigger_set_t EXTERNAL threshold; + /* Parameters for subroutines. */ + + SU_setting = setting_map_c[ self_test_SU_index ]; + + threshold.sensor_unit = self_test_SU_number; + + threshold.level = + SU_setting -> plasma_1_plus_threshold; + threshold.channel = PLASMA_1_PLUS; + SetTriggerLevel( &threshold ); + /* Restore Plasma 1 Plus trigger threshold. */ + + threshold.level = + SU_setting -> plasma_1_minus_threshold; + threshold.channel = PLASMA_1_MINUS; + SetTriggerLevel( &threshold ); + /* Restore Plasma 1 Minus trigger threshold. */ + + threshold.level = + SU_setting -> piezo_threshold; + threshold.channel = PZT_1_2; + SetTriggerLevel( &threshold ); + /* Restore Piezo trigger threshold. */ + + SU_switch.SU_number = self_test_SU_number; + SU_switch.SU_state = on_e; + SU_switch.expected_source_state = self_test_e; + Switch_SU_State( &SU_switch ); + /* Switch SU State back to On. */ + +} + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/health.h b/targets/wasm-tacle/parallel/DEBIE/code/health.h new file mode 100644 index 0000000..22460e8 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/health.h @@ -0,0 +1,120 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : health.h + + Prototypes etc. for the Health module. + + Based on the SSF file health.h, revision 1.12, Wed Oct 13 19:50:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef HEALTH_H +#define HEALTH_H + +#include "keyword.h" +#include "dpu_ctrl.h" +#include "su_ctrl.h" + +#define CH_SELECTED 1 +#define CH_NOT_SELECTED 0 + +#define RESULT_OK 1 +#define CONVERSION_ACTIVE 0 +#define HIT_OCCURRED 2 + +#define CONVERSION_STARTED 1 + +#define TEST_OK 1 + +#define LOW 0 +#define HIGH 1 + +/* Health monitoring round identification numbering. */ + +#define HEALTH_COUNT 9 +/* Health Monitoring loop count. */ + +#define VOLTAGE_COUNT 17 +/* Voltage Measurement loop count. */ + +#define TEMP_COUNT 5 +/* Temperature measurement loop count. Its value must equal or greater than */ +/* NUM_SU, because its value defines the SU whos temperatures are to be */ +/* measured. */ + +#define CHECK_COUNT 59 +/* Checksum loop count. */ + +#define MAX_TEMP_1 0xFA +#define MAX_TEMP_2 0xF4 +/* Maximum temperature (0xFA = 90 C and 0xF4 = 85C) for a Sensor Unit. */ + +#define CHECK_SIZE 547 +/* Checksum is counted for code memory 547 bytes per check round. */ + +#define CODE_MEMORY_END 0x7FFF +/* The last code memory address to be checked in function */ +/* 'CalculateChecksum'. */ +/* 'CODE_MEMORY_END' should have a value smaller */ +/* than 2^16 - 1. Otherwise it will affect a 'for' */ +/* loop in 'CalculateChecksum' function in a way */ +/* that makes this loop infinite. */ + +#define MAX_CHECKSUM_COUNT 59 +#define MIN_CHECKSUM_COUNT 0 +/* Limiting values used in function 'CalculateChecksum'. */ + +typedef enum { + round_0_e, round_1_e, round_2_e, round_3_e, round_4_e, + round_5_e, round_6_e, round_7_e, round_8_e, round_9_e +} round_t; + +extern uint_least8_t EXTERNAL health_mon_round; +extern uint_least8_t EXTERNAL temp_meas_count; +extern uint_least8_t EXTERNAL voltage_meas_count; +extern uint_least8_t EXTERNAL checksum_count; +extern unsigned char EXTERNAL code_checksum; + +extern EXTERNAL unsigned char confirm_hit_result; +extern EXTERNAL dpu_time_t internal_time; + +extern void SetSoftwareError ( unsigned char error ) +COMPACT_DATA REENTRANT_FUNC; +extern void ClearSoftwareError ( void ); +extern void SetModeStatusError ( unsigned char mode_status_error ) +COMPACT_DATA REENTRANT_FUNC; +extern void ClearModeStatusError( void ); + +extern void SetMode ( DEBIE_mode_t mode ) +COMPACT_DATA REENTRANT_FUNC; +extern DEBIE_mode_t GetMode( void ); +extern void Clear_SU_Error( void ); +extern void Set_SU_Error( sensor_index_t SU_index, unsigned char SU_error ); +extern void SetErrorStatus( unsigned char error_source ); +extern void ClearErrorStatus( void ); +extern void Clear_RTX_Errors( void ); + + +extern void Boot ( void ); + +/* Task functions, for testing: */ + +extern void InitHealthMonitoring ( void ); +extern void HandleHealthMonitoring ( void ); + +#endif + + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/hw_if.c b/targets/wasm-tacle/parallel/DEBIE/code/hw_if.c new file mode 100644 index 0000000..3614e17 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/hw_if.c @@ -0,0 +1,1048 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : hw_if.c + + Initialization and test of hardware. + + Based on the SSF file hw_if.c, rev 1.34, Sun Jul 25 15:47:56 1999. + + ----------------------------------------------------------------------------- +*/ + +#include "dpu_ctrl.h" +#include "su_ctrl.h" +#include "isr_ctrl.h" +#include "version.h" +#include "tc_hand.h" +#include "tm_data.h" +#include "ttc_ctrl.h" + + +reset_class_t EXTERNAL s_w_reset; +/* The type of the last DPU reset, as recorded in Init_DPU. */ +/* Note: this variable must _not_ be initialised here (in */ +/* its declaration), since this would overwrite the value */ +/* set in Init_DPU, which is called from the startup module */ +/* before the variable initialisation code. */ + + +unsigned char EXTERNAL SU_ctrl_register = 0; +unsigned char EXTERNAL SU_self_test_channel = 0; +/* These variables store values of these write-only registers. */ + +unsigned char EXTERNAL LOCATION( 0xFF00 ) forbidden_area[ 256 ]; +/* Last 256 bytes of the external data memory are reserved for */ +/* memory mapped registers. No variables are allowed in that area. */ + + +/* Results of the RAM test done at boot time: */ + +code_address_t EXTERNAL failed_code_address; +data_address_t EXTERNAL failed_data_address; +#define NO_RAM_FAILURE 0xFFFF +/* The test records the address of the first failed cell in the */ +/* code (program) RAM and the external data RAM. */ +/* If no problem is found, the address is NO_RAM_FAILURE. */ +/* Note: these variables must _not_ be initialised here (at */ +/* declaration), since this initialisation would be done after */ +/* the RAM test and so would destroy its results. */ +/* These variables are set by Init_DPU, which is called from */ +/* the startup module. */ + + +/* Other memory-control variables: */ + +memory_configuration_t EXTERNAL memory_mode; +/* The current memory mapping mode. */ + +const unsigned char PROGRAM checksum_nullifier = CODE_CHECKSUM; +/* Sets the checksum of the unpatched program code to zero. */ + +unsigned char EXTERNAL reference_checksum; +/* Expected code checksum. Zero for unpatched code. */ + +unsigned char EXTERNAL code_not_patched; +/* Initial value is 1, set in Init_DPU. Value is 1 when code */ +/* checksum value is valid, cleared to 0 when code memory is */ +/* patched, set to 1 when next checksum calculation */ +/* period is started. */ + +unsigned char EXTERNAL analog_switch_bit[ NUM_SU ] = {0x10, 0x20, 0x40, 0x80}; +/* This array stores the value to be used when analog switch bit */ +/* corresponding to a given SU is set. */ + +/* Function prototypes. */ +void CopyProgramCode( void ); +code_address_t InitCode_RAM ( reset_class_t reset_class ); +void InitData_RAM ( + reset_class_t reset_class, + code_address_t code_address ); + +/*****************************************************************************/ +/* dpu_ctrl.h */ +/*****************************************************************************/ + +unsigned short int Check_RAM ( + data_address_t start_address, + data_address_t end_address ) +/* Purpose : Check the working of an area of external RAM. */ +/* Interface : inputs - range of memory addresses. */ +/* outputs - first failed address. */ +/* NO_RAM_FAILURE indicates "no failure". */ +/* subroutines - TestMemBits */ +/* - TestMemSeq */ +/* - TestMemData */ +/* Preconditions : - start_address <= end_address. */ +/* - end_address < 0xFFFF. */ +/* - External Data RAM is not initialised. */ +/* Postconditions : The addresses in the given range are tested up to the */ +/* ending address or the first failing address. */ +/* The original contents of the memory area are lost. */ +/* Algorithm : - The first memory address is tested with TestMemBits. */ +/* - The address range is traversed in pieces acceptable */ +/* to TestMemSeq/Data (max 255 bytes at a time). */ +/* - For each piece, TestMemSeq/Data is called. */ +/* - If an error is found, the failing address */ +/* is returned and the test is interrupted. */ +/* - If no failure is found, 0xFFFF is returned. */ +/* */ +/* This function must not rely on any constants in data RAM, since */ +/* it is called before the C start-up system initialises data. */ + +{ + /* Note that the local variables of this function should all be */ + /* located in the internal data memory. Otherwise they may be */ + /* altered unexpectedly as a side effect of testing memory. */ + + data_address_t INDIRECT_INTERNAL start; + /* The starting address for TestMemSeq and TestMemData. */ + + uint_least16_t INDIRECT_INTERNAL range; + /* The remaining range (ending address - starting address). */ + + uint_least8_t INDIRECT_INTERNAL bytes; + /* The number of bytes to check, for TestMemSeq/Data. */ + + uint_least8_t INDIRECT_INTERNAL bytes_left; + /* The number of bytes left, returned from TestMemSeq/Data. */ + + start = start_address; + + if ( TestMemBits( start ) != 0 ) { + /* Failure in data bus, probably. */ + return start; + } + + _Pragma( "loopbound min 0 max 0" ) + while ( start <= end_address ) { + range = end_address - start; + /* Number of bytes to check, less one. */ + + if ( range < 255 ) { + /* One call of TestMemSeq/Data covers the remaining range. */ + bytes = ( uint_least8_t )( range + 1 ); + } else { + /* One call cannot cover the remaining range. */ + /* Cover as much as possible for one call. */ + bytes = 255; + } + + bytes_left = TestMemSeq ( start, bytes ); + + if ( bytes_left == 0 ) { + /* TestMemSeq succeeded. Try TestMemData. */ + bytes_left = TestMemData ( start, bytes ); + } + + if ( bytes_left > 0 ) { + /* Memory error. Return failing address. */ + return ( bytes - bytes_left ) + start; + } + + start = start + bytes; + /* Next address to check, or end_address+1 if all done. */ + /* Wrap-around cannot happen since end_address < 0xFFFF. */ + } + + /* Memory is OK. */ + return NO_RAM_FAILURE; +} + + +void Init_DPU ( reset_class_t reset_class ) +/* Purpose : DEBIE-specific DPU and I/O initialisation at reset. */ +/* Interface : inputs - reset class */ +/* outputs - s_w_reset */ +/* - code_not_patched */ +/* - failed_code_address */ +/* - failed_data_address */ +/* - memory_mode */ +/* subroutines - InitCode_RAM */ +/* - InitData_RAM */ +/* Preconditions : Basic startup initialisation done. */ +/* Code is being executed from PROM. */ +/* Tasks are not yet running. */ +/* External Data RAM is not initialised. */ +/* Postconditions : see algorithm */ +/* Algorithm : see below, self-explanatory. */ + +/* This function is called by the startup assembly code. */ +/* This function must not rely on any constants in data RAM, since */ +/* it is called before the C start-up system initialises data. */ + +{ + /* Note: be careful with use of external Data RAM in this function. */ + /* If InitData_RAM tests the RAM, it will destroy the contents. */ + + volatile reset_class_t INDIRECT_INTERNAL safe_reset_class; + /* Copy of reset_class in internal RAM, safe from RAM test. */ + + code_address_t INDIRECT_INTERNAL code_address; + /* Result of InitCode_RAM. */ + + + safe_reset_class = reset_class; + /* Copy to internal RAM. */ + + SET_WD_RESET_LOW; + + /* The Watch Dog timer is reset by setting WD_RESET bit low at I/O */ + /* port 1. */ + + SET_INTERRUPT_PRIORITIES; + /* Define the high/low priority of each interrupt. */ + + SET_INT_TYPE1_EDGE; + /* The interrupt control type 1 bit is set to 'falling edge' state. */ + + SET_INT_TYPE0_EDGE; + /* The interrupt control type 1 bit is set to 'falling edge' state. */ + + STOP_TC_TIMER; + SET_TC_TIMER_MODE; + DISABLE_TC_TIMER_ISR; + SET_TC_TIMER_OVERFLOW_FLAG; + /* Prepare TC timer. */ + + CLEAR_TC_INTERRUPT_FLAG; + CLEAR_TM_INTERRUPT_FLAG; + CLEAR_HIT_TRIGGER_ISR_FLAG; + /* Clear pending interrupts. */ + + /* RAM tests and code copying: */ + + code_address = InitCode_RAM ( safe_reset_class ); + + InitData_RAM ( safe_reset_class, code_address ); + + /* Record RAM test results in external data as follows. */ + /* They will be safe now, since RAM test is over. */ + /* Note, InitData_RAM already set failed_data_address, */ + /* and InitCode_RAM selected the memory mode; here we */ + /* just record the selection in memory_mode. */ + /* The failed_code/data_addresses are not yet set in */ + /* telemetry_data, since the latter will be cleared in */ + /* a later step of the boot sequence. */ + + s_w_reset = safe_reset_class; + code_not_patched = 1; + failed_code_address = code_address; + + if ( code_address == NO_RAM_FAILURE ) + memory_mode = SRAM_e; + else + memory_mode = PROM_e; + + #ifdef USE_ALWAYS_PROM + memory_mode = PROM_e; + #endif + + SET_WD_RESET_HIGH; + /* The Watch Dog time out signal state is reset HIGH state, as it is*/ + /* falling edge active. */ +} + + +code_address_t InitCode_RAM ( reset_class_t reset_class ) +/* Purpose : Initialise Program Memory at reset. */ +/* Interface : inputs - reset class */ +/* - failed_code_address (if Warm Reset) */ +/* outputs - returns new value for failed_code_address */ +/* subroutines - Check_RAM */ +/* - CopyProgramCode */ +/* Preconditions : Basic startup initialisation done. */ +/* Code is being executed from PROM. */ +/* Tasks are not yet running. */ +/* External Data RAM is not initialised (except in case */ +/* of a Warm Reset). */ +/* Postconditions : For a reset that is not a Warm Reset: */ +/* - Code SRAM tested, result in return value. */ +/* - Code copied from PROM to SRAM. */ +/* - Running from SRAM if Code RAM is good. */ +/* - Running from PROM if error found in Code RAM. */ +/* For a Warm Reset: */ +/* - Code in SRAM not modified. */ +/* - Running from SRAM or PROM depending on the recorded */ +/* result of an earlier Code RAM test (from the global */ +/* variable failed_code_address). */ +/* - failed_code_address unchanged and returned. */ +/* Algorithm : see below. */ + +/* Note: This initialisation may use external RAM, but any data it */ +/* stores in external RAM will be destroyed by the RAM test, */ +/* which is done after this step in the reset sequence. */ +/* This function must not rely on any constants in data RAM, since */ +/* it is called before the C start-up system initialises data. */ + +{ + code_address_t INDIRECT_INTERNAL code_address; + /* Value returned by Check_RAM, now or earlier. */ + + if ( reset_class == warm_reset_e ) { + /* Warm Reset: Do not copy PROM code to RAM. */ + /* Use result of memory test from earlier (non-warm) reset. */ + + code_address = failed_code_address; + } else { + /* HW Reset, Soft Reset or Checksum Reset. */ + + code_address = Check_RAM ( BEGIN_SRAM1, END_SRAM1 ); + /* TBC that this does not rely on data RAM constants. */ + + if ( code_address == NO_RAM_FAILURE ) { + #ifndef USE_ALWAYS_PROM + CopyProgramCode(); + #endif + /* Code RAM is good. Copy code to it. */ + /* Later in the boot sequence, the reference checksum */ + /* must be reset to its initial value, to erase its */ + /* memory of any code patches, or to initialise it in */ + /* case of a power-up reset or test of data RAM. */ + } + } + + if ( code_address == NO_RAM_FAILURE ) { + #ifndef USE_ALWAYS_PROM + SET_MEM_CONF_SRAM; + #endif + /* Code RAM is good. Run program from it. */ + /* For a Warm Reset, the Code RAM may contain patches */ + /* relative to the PROM code, and the reference */ + /* checksum should also retain a memory of them. */ + } + + return code_address; +} + + +void InitData_RAM ( + reset_class_t reset_class, + code_address_t code_address ) +/* Purpose : Initialise Data Memory at reset. */ +/* Interface : inputs - reset class */ +/* - failed code address (in some cases) */ +/* outputs - failed_data_address */ +/* subroutines - Check_RAM */ +/* Preconditions : Basic startup initialisation done. */ +/* Tasks are not yet running. */ +/* External Data RAM is not initialised (except in case */ +/* of a Warm Reset). */ +/* Postconditions : For a Power-Up Reset: */ +/* - Data SRAM tested, result in failed_data_address. */ +/* If the Code RAM test failed (as shown by code_address) */ +/* only the upper half of the Data space is tested here. */ +/* - The data in the tested Data RAM is garbage. */ +/* For other kinds of reset: */ +/* - Data in SRAM not modified. */ +/* Algorithm : see below. */ + +/* This function must not rely on any constants in data RAM, since */ +/* it is called before the C start-up system initialises data. */ + +{ + if ( reset_class == power_up_reset_e ) { + if ( code_address == NO_RAM_FAILURE ) { + /* The Code RAM is good, so we have a fresh lower-half */ + /* of the Data RAM to check, as well as the upper-half. */ + + failed_data_address = Check_RAM ( BEGIN_DATA_RAM, END_SRAM3 ); + } else { + /* The Code RAM is bad, and is still mapped to the */ + /* lower-half of the Data space. Check only the upper */ + /* half of the data space. */ + + failed_data_address = Check_RAM ( BEGIN_SRAM3, END_SRAM3 ); + } + } +} + + +void CopyProgramCode( void ) +/* Purpose : Copies program code from PROM to SRAM */ +/* Interface : -inputs: PROM */ +/* -outputs: SRAM1 */ +/* Preconditions : Program code is executed from PROM. */ +/* External data RAM not initialised. */ +/* Postconditions : SRAM1 holds same program as PROM. */ +/* Algorithm : Bytes are copied from code memory to same address in */ +/* external data memory in loop that goes through code */ +/* memory */ +/* This function must not rely on any constants in data RAM, since */ +/* it is called before the C start-up system initialises data. */ + +{ + code_address_t i; + INDIRECT_INTERNAL unsigned char code_byte; + + _Pragma( "loopbound min 28672 max 28672" ) + for ( i = PROGRAM_COPY_START; i < PROGRAM_COPY_END; i++ ) { + code_byte = GET_CODE_BYTE( i ); + SET_DATA_BYTE( ( data_address_t )i, code_byte ); + } +} + + +reset_class_t GetResetClass( void ) +/* Purpose : Reset class is returned. */ +/* Interface : - inputs: s_w_reset, type of the occurred reset. */ +/* - outputs: s_w_reset */ +/* Preconditions : Valid only when called first time after reset in boot */ +/* sequence. */ +/* Postconditions : s_w_reset is set to error_e value. */ +/* Algorithm : value of s_w_reset is returned and s_w_reset is set to */ +/* error value. */ +{ + register reset_class_t occurred_reset; + + occurred_reset = s_w_reset; + s_w_reset = error_e; + return occurred_reset; +} + + +void SignalMemoryErrors ( void ) +/* Purpose : Copy results of RAM test to telemetry_data. */ +/* Interface : - inputs: failed_code_address, failed_data_address */ +/* - outputs: telemetry_data fields: */ +/* failed_code_address */ +/* failed_data_address */ +/* mode_status bits for: */ +/* PROGRAM_MEMORY_ERROR */ +/* DATA_MEMORY_ERROR */ +/* Preconditions : Init_DPU called since reset. */ +/* Postconditions : telemetry_data reflects the results of the memory tests */ +/* done in Init_DPU, as recorded in failed_code_address */ +/* and failed_data_address. */ +/* Note that the TM addresses are zero for "no failure". */ +/* Algorithm : see below. */ +{ + if ( failed_code_address == NO_RAM_FAILURE ) { + telemetry_data.mode_status &= ~PROGRAM_MEMORY_ERROR; + telemetry_data.failed_code_address = 0x0000; + } else { + telemetry_data.mode_status |= PROGRAM_MEMORY_ERROR; + telemetry_data.failed_code_address = failed_code_address; + } + + if ( failed_data_address == NO_RAM_FAILURE ) { + telemetry_data.mode_status &= ~DATA_MEMORY_ERROR; + telemetry_data.failed_data_address = 0x0000; + } else { + telemetry_data.mode_status |= DATA_MEMORY_ERROR; + telemetry_data.failed_data_address = failed_data_address; + } +} + + +void SetMemoryConfiguration ( memory_configuration_t memory ) +/* Purpose : External program memory is selected to be either PROM or */ +/* SRAM1. */ +/* Interface : Port 1 is used. */ +/* output: memory_mode */ +/* Preconditions : After power-up reset PROM is always selected. */ +/* Postconditions : External program memory is set depending on the given */ +/* parameter. */ +/* memory_mode contains the selected mode. */ +/* Algorithm : Memory configuration is selected with the output at the */ +/* I/O port 1. */ + +{ + switch ( memory ) { + case PROM_e: + SET_MEM_CONF_PROM; + break; + case SRAM_e: + SET_MEM_CONF_SRAM; + break; + } + memory_mode = memory; +} + + +void PatchCode( memory_patch_variables_t EXTERNAL *patch_variables ) +/* Purpose : Code memory patching. */ +/* Interface : Following parameters are given: Address from where to */ +/* copy, address where to copy and the amount of bytes to */ +/* be copied. Execution result is returned. Variables used */ +/* in this function are stored in a struct. Pointer to a */ +/* variable which stores an execution result of the */ +/* function SetMemoryConfiguration is passed on. */ +/* Preconditions : Source and destination addresses should be valid. */ +/* Postconditions : Desired part of the memory is copied. */ +/* Algorithm : Bytes are copied. */ + +{ + + fptr_t patch_function; + /* Function pointer to the patched memory area. */ + + unsigned char INDIRECT_INTERNAL old_checksum; + /* Checksum calculated from the old contents of the pachted memory. */ + + unsigned char INDIRECT_INTERNAL new_checksum; + /* Checksum calculated from the new conrents of the patched memory. */ + + unsigned char INDIRECT_INTERNAL patch_value; + /* New value of a patched code memory byte. */ + + unsigned char EXTERNAL temp_configuration; + /* Original memory configuration. */ + + uint_least8_t INDIRECT_INTERNAL i; + /* Loop variable. */ + + + temp_configuration = GetMemoryConfiguration(); + /* State of the current memory configuration is stored. */ + + DISABLE_INTERRUPT_MASTER; + /* Disable all interrupts. */ + + SetMemoryConfiguration ( PROM_e ); + /* Enable code patching. */ + + new_checksum = 0; + old_checksum = 0; + + /* Memory block is copied from SRAM3 to SRAM1. */ + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0 ; i < patch_variables -> data_amount ; i++ ) { + old_checksum ^= GET_DATA_BYTE( patch_variables -> destination + i ); + patch_value = *( patch_variables -> source + i ); + new_checksum ^= patch_value; + + SET_DATA_BYTE( patch_variables -> destination + i, patch_value ); + } + + reference_checksum ^= ( old_checksum ^ new_checksum ); + + SetMemoryConfiguration ( temp_configuration ); + /* The initial memory configuration is restored. */ + + switch ( patch_variables -> execution_command ) { + case 0: + /* Continue normally. */ + + break; + + case 0x09: + /* Execute soft reset. */ + + Reboot ( soft_reset_e ); + /* Function does not return. */ + break; + + case 0x37: + /* Execute warm reset. */ + + Reboot ( warm_reset_e ); + /* Function deos not return. */ + break; + + case 0x5A: + /* Jump to the patched memory. */ + + patch_function = ( fptr_t )( patch_variables -> destination ); + + CALL_PATCH( patch_function ); + /* Called code may or may not return. */ + + /* TC_state is selected upon return. */ + + break; + } + ENABLE_INTERRUPT_MASTER; + /* Enable all 'enabled' interrupts. */ + +} + + +memory_configuration_t GetMemoryConfiguration( void ) COMPACT_DATA +REENTRANT_FUNC +/* Purpose : Information about selected program memory is acquired */ +/* and returned. */ +/* Interface : input: memory_mode */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : Information about current memory configuration is */ +/* stored in a variable. */ + +{ + return memory_mode; + /*Information about current memory configuration is stored in a global */ + /*variable, which is returned. */ +} + + +/*****************************************************************************/ +/* su_ctrl.h */ +/*****************************************************************************/ + +/* Sensor Unit power control */ + +void Switch_SU_On ( + sensor_number_t SU_Number, + unsigned char EXTERNAL *execution_result ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Given Sensor Unit is switched on. */ +/* Interface : Execution result is stored in a variable. */ +/* Preconditions : SU_Number should be 1,2,3 or 4 */ +/* Postconditions : Given Sensor Unit is switced on. */ +/* Algorithm : The respective bit is set high in the SU on/off control */ +/* register with XBYTE. */ +{ + switch ( SU_Number ) + { + case SU_1: + + SU_ctrl_register |= 0x10; + *execution_result = SU_1_ON; + /* Set high bit 4 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + case SU_2: + + SU_ctrl_register |= 0x20; + *execution_result = SU_2_ON; + /* Set high bit 5 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + case SU_3: + + SU_ctrl_register |= 0x40; + *execution_result = SU_3_ON; + /* Set high bit 6 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + case SU_4: + + SU_ctrl_register |= 0x80; + *execution_result = SU_4_ON; + /* Set high bit 7 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + default: + *execution_result = SU_NOT_ACTIVATED; + /*Incorrect SU number has caused an error. */ + break; + } + + SET_DATA_BYTE( SU_CONTROL, SU_ctrl_register ); + + telemetry_data.SU_status[ SU_Number - SU_1 ] |= SU_ONOFF_MASK; + /* SU_status register is updated to indicate that SU is switched on. */ + /* Other bits in this register are preserved. */ +} + + +void Switch_SU_Off ( + sensor_number_t SU_Number, + unsigned char EXTERNAL *execution_result ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Given Sensor Unit is switced off. */ +/* Interface : Execution result is stored in a variable. */ +/* Preconditions : SU_Number should be 1,2,3 or 4. */ +/* Postconditions : Given Sensor Unit is switced off. */ +/* Algorithm : The respective bit is set low with XBYTE. */ +{ + switch ( SU_Number ) + { + case SU_1: + + SU_ctrl_register &= ~0x10; + *execution_result = SU_1_OFF; + /* Set low bit 4 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + case SU_2: + + SU_ctrl_register &= ~0x20; + *execution_result = SU_2_OFF; + /* Set low bit 5 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + case SU_3: + + SU_ctrl_register &= ~0x40; + *execution_result = SU_3_OFF; + /* Set low bit 6 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + case SU_4: + + SU_ctrl_register &= ~0x80; + *execution_result = SU_4_OFF; + /* Set low bit 7 in the SU on/off control register, */ + /* preserves other bits. */ + break; + + default: + *execution_result = SU_NOT_DEACTIVATED; + /*Incorrect SU number has caused an error. */ + break; + } + + SET_DATA_BYTE( SU_CONTROL, SU_ctrl_register ); + + telemetry_data.SU_status[ SU_Number - SU_1 ] &= ( ~SU_ONOFF_MASK ); + /* SU_status register is updated to indicate that SU is switched off. */ + /* Other bits in this register are preserved. */ +} + + +void EnableAnalogSwitch( sensor_index_t self_test_SU_index ) +/* Purpose : The analog switch output is enabled in the */ +/* self test channel register. */ +/* Interface : inputs - self_test_SU_index */ +/* outputs - SU_self_test_channel, HW register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : The analog switch output is enabled for a given */ +/* self test SU in the SU_self_test_channel register. */ +/* Algorithm : - The respective bit is set in the SU_self_test_channel */ +/* variable and written to HW. */ +{ + SU_self_test_channel |= analog_switch_bit[ self_test_SU_index ]; + /* The respective bit is set in the variable, preserve other bits. */ + + SET_SU_SELF_TEST_CH( SU_self_test_channel ); +} + +void DisableAnalogSwitch( sensor_index_t self_test_SU_index ) +/* Purpose : The analog switch output is disabled in the */ +/* self test channel register. */ +/* Interface : inputs - self_test_SU_index */ +/* outputs - SU_self_test_channel, HW register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : The analog switch output is disabled for a given */ +/* self test SU in the SU_self_test_channel register. */ +/* Algorithm : - The respective bit is reset in the SU_self_test_channel*/ +/* variable and written to HW. */ +{ + SU_self_test_channel &= ~analog_switch_bit[ self_test_SU_index ]; + /* The respective bit is set in the variable, preserve other bits. */ + + SET_SU_SELF_TEST_CH( SU_self_test_channel ); +} + +void SelectSelfTestChannel( unsigned char channel ) +/* Purpose : A self test channel is selected in the */ +/* self test channel register. */ +/* Interface : inputs - channel */ +/* outputs - SU_self_test_channel, HW register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : The given self test channel is selected. */ +/* self test SU in the SU_self_test_channel register. */ +/* Algorithm : - The respective bit is set in the self test channel */ +/* register and written to HW. */ +{ + unsigned char EXTERNAL channel_selector_value[ NUM_CH ]; + /* This array stores the selector bit states related to a given channel. */ + + channel_selector_value[ PLASMA_1_PLUS ] = 0x00; + channel_selector_value[ PLASMA_1_MINUS ] = 0x01; + channel_selector_value[ PZT_1 ] = 0x02; + channel_selector_value[ PZT_2 ] = 0x03; + channel_selector_value[ PLASMA_2_PLUS ] = 0x04; + + SU_self_test_channel = + ( SU_self_test_channel & 0xF8 ) | channel_selector_value[ channel ]; + /* Set chosen bits preserve others. */ + + SET_SU_SELF_TEST_CH( SU_self_test_channel ); +} + + +void ReadDelayCounters ( delays_t EXTERNAL *delay ) +/* Purpose : Read delay counters. */ +/* Interface : Results are stored into a given struct. */ +/* Preconditions : */ +/* Postconditions : Counters are read. */ +/* Algorithm : MSB and LSB are combined to form an 16 bit int. */ +{ + unsigned char msb, lsb; + + msb = GET_MSB_COUNTER & 0x0F; + /* Correct set of four bits are selected in the MSB. */ + lsb = GET_LSB1_COUNTER; + + delay -> FromPlasma1Plus = ( msb << 8 ) | lsb; + + msb = GET_MSB_COUNTER >> 4; + /* Correct set of four bits are selected in the MSB. */ + lsb = GET_LSB2_COUNTER; + + delay -> FromPlasma1Minus = ( msb << 8 ) | lsb; +} + + +unsigned char ReadRiseTimeCounter( void ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Plasma1+ rise time counter is read from the specified */ +/* address. */ +/* Interface : Result is returned as an unsigned char. */ +/* Preconditions : */ +/* Postconditions : Data is gained. */ +/* Algorithm : Counter is read with XBYTE. */ +{ + + return GET_DATA_BYTE( RISE_TIME_COUNTER ); + +} + +void ResetDelayCounters( void ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Delay counters are reset. */ +/* Interface : Port 1 is used. */ +/* Preconditions : Resetting takes place after acquisition. */ +/* Postconditions : Delay counters are reset. */ +/* Algorithm : The counter reset output bit at the I/O port 1 is set */ +/* first and then high. */ + +{ + SET_COUNTER_RESET( LOW ); + /* Counters are reset by setting CNTR_RS bit to low in port 1 */ + + SET_COUNTER_RESET( HIGH ); + /* The bit is set back to high */ +} + + +void SetTriggerLevel( trigger_set_t EXTERNAL *setting ) +COMPACT_DATA REENTRANT_FUNC +/* Purpose : Given trigger level is set. */ +/* Interface : Execution result is stored in a variable. */ +/* Preconditions : SU_Number should be 1-4 and channel number 1-5 levels */ +/* Postconditions : Given level is set for specific unit and channel. */ +/* Algorithm : The respective memory address is written into. */ +/* */ +/* This function is used by TelecomandExecutionTask and */ +/* HealthMonitoringTask. despite the fact that it is of type re-enrant */ +/* the two tasks should not use it simultaniously. When */ +/* HealthMonitoringTask is conducting self test and uses */ +/* SetTriggerLevel, TelecomandExecutionTask is able to interrupt and */ +/* possibly set another trigger levels which would foul up the self */ +/* test. On the other hand when TelecomandExecutionTask is setting */ +/* trigger levels HealthMonitoringTask is disabled due to its lower */ +/* priority. */ + + +{ + + setting -> execution_result = TRIGGER_SET_OK; + + switch ( setting -> sensor_unit ) + /*sensor unit is selected*/ + { + case SU_1: { + setting -> base = SU_1_TRIGGER_BASE; + break; + } + case SU_2: { + setting -> base = SU_2_TRIGGER_BASE; + break; + } + case SU_3: { + setting -> base = SU_3_TRIGGER_BASE; + break; + } + case SU_4: { + setting -> base = SU_4_TRIGGER_BASE; + break; + } + default: { + setting -> execution_result = SU_NOT_SELECTED; + /*Sensor Unit number is invalid. */ + break; + } + } + + if ( setting -> execution_result != SU_NOT_SELECTED ) + { + switch ( setting -> channel ) + /*channel is selected*/ + { + case PLASMA_1_PLUS: { + SET_DATA_BYTE( setting -> base + 0, setting -> level ); + break; + } + case PLASMA_1_MINUS: { + SET_DATA_BYTE( setting -> base + 1, setting -> level ); + break; + } + case PZT_1_2: { + SET_DATA_BYTE( setting -> base + 2, setting -> level ); + break; + } + default: { + setting -> execution_result = CHANNEL_NOT_SELECTED; + /*Given channel parameter is invalid. */ + break; + } + } + } + +} + + +void SetTestPulseLevel( unsigned char level ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Testpulse level is set. */ +/* Interface : input: - Desired test pulse level. */ +/* Preconditions : none. */ +/* Postconditions : Level is set. */ +/* Algorithm : Level is written into memory-mapped port address. */ +{ + SET_TEST_PULSE_LEVEL( level ); +} + + +void GetVoltageStatus( voltage_status_t EXTERNAL *v_status ) +COMPACT_DATA REENTRANT_FUNC +/* Purpose : Voltage status data is gained. */ +/* Interface : Port 1 is used. */ +/* Preconditions : */ +/* Postconditions : Data is acquired. */ +/* Algorithm : HV status register is read into a struct with XBYTE. */ +/* V_DOWN bit is read from port 1. */ +{ + v_status -> V_down_bit = V_DOWN; + v_status -> HV_status = GET_DATA_BYTE( HV_STATUS ); +} + +void ResetPeakDetector( sensor_number_t unit ) +/* Purpose : Peak detector is reset. */ +/* Interface : -'Sensor unit on/off control register' is used */ +/* Preconditions : Resetting takes place after acquisition. */ +/* Postconditions : Peak detector is reset. */ +/* Algorithm : - Interrupts are disabled */ +/* - SignalPeakDetectorReset function is called */ +/* - Interrupts are enabled */ +/* */ +/* This function is used by Acquisition and HealthMonitoringTask. */ +/* However, it does not have to be of re-entrant type because collision */ +/* is avoided through design, as follows. */ +/* HealthMonitoring task uses ResetPeakDetector when Hit Budget has been */ +/* exeeded. This means that Acquisitiontask is disabled. When Acquisition */ +/* task uses ResetPeakDetector HealthMonitoringTask is disabled because */ +/* it is of lower priority . */ + + +{ + DISABLE_INTERRUPT_MASTER; + /* Disable all interrupts */ + + SignalPeakDetectorReset( + SU_ctrl_register & ~( 1 << ( unit - SU_1 ) ), + SU_ctrl_register ); + /* Generate reset pulse. */ + + ENABLE_INTERRUPT_MASTER; +} + +void SelectStartSwitchLevel( + unsigned char test_channel, + sensor_index_t self_test_SU_index ) +/* Purpose : Select analog switch output level. */ +/* Interface : inputs - self_test_SU_index, test_channel */ +/* outputs - none */ +/* subroutines - EnableAnalogSwitch */ +/* DisableAnalogSwitch */ +/* Preconditions : none */ +/* Postconditions : Analog switch output level is selected depending on the */ +/* given channel. */ +/* Algorithm : - Wanted level is selected. */ +{ + + if ( test_channel == PLASMA_1_PLUS || test_channel == PLASMA_2_PLUS ) { + /* Channel triggered by falling edge. */ + EnableAnalogSwitch( self_test_SU_index ); + /* Set analog switch output level for the given channel. */ + } + + else { + /* Rest of the channels triggered by rising edge. */ + DisableAnalogSwitch( self_test_SU_index ); + /* Set analog switch output level for the given channel. */ + } +} + +void SelectTriggerSwitchLevel( + unsigned char test_channel, + sensor_index_t self_test_SU_index ) +/* Purpose : Select analog switch output level. */ +/* Interface : inputs - self_test_SU_index, test_channel */ +/* outputs - none */ +/* subroutines - EnableAnalogSwitch */ +/* DisableAnalogSwitch */ +/* Preconditions : none */ +/* Postconditions : Analog switch output level is selected depending on the */ +/* given channel. */ +/* Algorithm : - Wanted level is selected. */ +/* - SW triggering is needed with channel PLASMA_2_PLUS. */ +{ + + if ( test_channel == PLASMA_1_PLUS ) { + /* Channel triggered by falling edge. */ + + DisableAnalogSwitch( self_test_SU_index ); + /* Set analog switch output level for the given channel. */ + } + + else + if ( test_channel == PLASMA_2_PLUS ) { + /* Channel triggered by falling edge. SW trigger needed. */ + + DisableAnalogSwitch( self_test_SU_index ); + /* Set analog switch output level for the given channel. */ + + SET_SU_SELF_TEST_CH( SU_self_test_channel ); + + SET_HIT_TRIGGER_ISR_FLAG; + /* SW trigger required. */ + } + + else { + /* Rest of the channels triggered by rising edge. */ + + EnableAnalogSwitch( self_test_SU_index ); + /* Set analog switch output level for the given channel. */ + } +} + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/isr_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/isr_ctrl.h new file mode 100644 index 0000000..c359bbe --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/isr_ctrl.h @@ -0,0 +1,44 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : isr_ctrl.h + + Macros and operations to control and handle interrupts. + + Based on the SSF DHI file isr_ctrl.h, rev 1.16, Sun Jul 25 15:02:08 1999. + + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef ISR_CTRL_H +#define ISR_CTRL_H + +#include "target_isr_ctrl.h" + +/* Function prototypes */ + +extern void AttachInterrupt( unsigned char ISR_VectorNumber ); + +extern void EnableInterrupt( unsigned char ISR_VectorNumber ); + +extern void DisableInterrupt( unsigned char ISR_VectorNumber ); + +extern signed char SetInterruptMask( unsigned char ISR_MaskNumber ); + +extern signed char ResetInterruptMask( unsigned char ISR_MaskNumber ); + +extern void WaitInterrupt ( unsigned char ISR_VectorNumber, + unsigned char timer ); + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/kernobj.h b/targets/wasm-tacle/parallel/DEBIE/code/kernobj.h new file mode 100644 index 0000000..2569bb9 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/kernobj.h @@ -0,0 +1,56 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : kernobj.h + + Definitions for the interface to the real-time kernel. + + Based on the SSF file kernobj.h, revision 1.3, Thu Sep 09 16:01:56 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* Definitions of kernel objects (eg. task and mailbox numbers) */ + +/* Task numbers */ + +#ifndef KERNOBJ_H +#define KERNOBJ_H + +#define HEALTH_MONITORING_TASK 0 +#define TC_TM_INTERFACE_TASK 1 +#define ACQUISITION_TASK 2 + +#define HIT_TRIGGER_ISR_TASK 3 + +/* Task priorities */ + +#define HEALTH_MONITORING_PR 0 +#define ACQUISITION_PR 1 +#define TC_TM_INTERFACE_PR 2 + +#define HIT_TRIGGER_PR 3 + +/* Mailbox numbers */ + +#define TCTM_MAILBOX 0 +#define ACQUISITION_MAILBOX 1 + +/* ISR source numbers */ + +#define TC_ISR_SOURCE 0 +#define TM_ISR_SOURCE 2 +#define HIT_TRIGGER_ISR_SOURCE 5 + +#endif + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/measure.c b/targets/wasm-tacle/parallel/DEBIE/code/measure.c new file mode 100644 index 0000000..45c1b81 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/measure.c @@ -0,0 +1,755 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : measure.c + + Event Measurement module. + + Based on the SSF file measure.c, rev 1.51, Wed Oct 13 19:48:50 1999. + + - * -------------------------------------------------------------------------- +*/ + +#include "keyword.h" +#include "kernobj.h" +#include "tm_data.h" +#include "isr_ctrl.h" +#include "msg_ctrl.h" +#include "tc_hand.h" +#include "telem.h" +#include "ttc_ctrl.h" +#include "su_ctrl.h" +#include "health.h" +#include "ad_conv.h" +#include "measure.h" +#include "taskctrl.h" +#include "class.h" + +sensor_number_t EXTERNAL self_test_SU_number = NO_SU; +/* By default this variable indicates that no SU self test */ +/* sequence is running. */ +/* Number of SU being self tested (SU_1, SU_2, SU_3 or SU_4) */ +/* or NO_SU if no SU is being self tested. */ + +unsigned char EXTERNAL test_channel; +/* Channel being tested in SU Self Test. Valid only if triggering SU */ +/* (indicated by self_test_SU) is in Self Test state. */ + +SU_test_level_t EXTERNAL test_level; +/* Test level being used in SU Self Test. */ + +SU_state_t EXTERNAL SU_state[ NUM_SU ] = {off_e, off_e, off_e, off_e}; + +/*This array contains information about the state of a given Sensor Unit. */ +/*Default value is 'off'. */ + +EXTERNAL unsigned short int ADC_result[ NUM_CH ]; +/*Used to temporarily store AD conversion results. */ + +EXTERNAL unsigned char confirm_hit_result; +/*This variable indicates a hit with a high value. */ + +uint_least8_t EXTERNAL hit_budget = HIT_BUDGET_DEFAULT; +uint_least8_t EXTERNAL hit_budget_left = HIT_BUDGET_DEFAULT; + +#ifdef REG52_DEFINED +#pragma REGISTERBANK(1) +#endif + +void _Pragma( "entrypoint" ) InitHitTriggerTask ( void ) + +/* Purpose : Initialize the global state of Hit Trigger handling */ +/* Interface : inputs - none */ +/* outputs - none */ +/* Preconditions : none */ +/* Postconditions : Calling task attached as Hit Trigger ISR. */ +/* Hit Trigger interrupt enabled */ +/* Algorithm : - attach current task as Hit Trigger ISR */ +/* - enable Hit Trigger interrupt */ + +{ + AttachInterrupt( HIT_TRIGGER_ISR_SOURCE ); + /*Now 'HitTriggerTask()' will listen for Hit trigger interrupt. */ + + ENABLE_HIT_TRIGGER; +} + +void _Pragma( "entrypoint" ) HandleHitTrigger ( void ) + +/* Purpose : Wait for and handle one Hit Trigger interrupt */ +/* Interface : inputs - Five analog outputs from Peak Detectors */ +/* outputs - Acquisition task mailbox */ +/* - Sampled ADC_result */ +/* Preconditions : none */ +/* Postconditions : Message holding the number of triggering Sensor Unit is */ +/* sent to Aqcuisition task. */ +/* Algorithm : - wait for Hit Trigger interrupt */ +/* - Read Peak Detector outputs from hardware registers. */ +/* - Sample and store these into a buffer. */ +/* - Send number of triggering Sensor Unit to Aqcuisition */ +/* task mailbox. */ + +{ + unsigned char EXTERNAL initial_delay; + /* Delay before the first AD channel is selected in */ + /* ShortDelay() units. */ + + unsigned char EXTERNAL delay_limit; + /* Delay between channel selection and start of conversion in */ + /* ShortDelay() units. */ + + INDIRECT_INTERNAL sensor_number_t trigger; + /*Used to store Sensor Unit number, which has beem hit. */ + + INDIRECT_INTERNAL channel_t CH_base; + /* First ADC channel number for the relevant Sensor Unit. */ + + DIRECT_INTERNAL uint_least8_t i; + /* Used in a for -loop, which reads the peak sensor outputs. */ + + DIRECT_INTERNAL unsigned char lsb, msb; + /*These variables are used to combine two bytes into one word. */ + + DIRECT_INTERNAL uint_least8_t conversion_try_count; + /*This variable stores the number of failed conversion starts. */ + + initial_delay = ( uint_least8_t ) ( DELAY_LIMIT( 100 ) ); + /* Initial delay before converting first channel. */ + + delay_limit = ( uint_least8_t ) ( DELAY_LIMIT( 100 ) ); + /* The signal settling delay is 100 microseconds. */ + + WaitInterrupt ( HIT_TRIGGER_ISR_SOURCE, 255 ); + /* Interrupt arrival is awaited. */ + /* Execution result is not handled. */ + + CLEAR_HIT_TRIGGER_ISR_FLAG; + /* Acknowledge the interrupt. */ + /* This bit must be cleared by software. */ + + if ( hit_budget_left == 0 ) { + /* Too many hit triggers during one Health Monitoring period. */ + + if ( telemetry_data.hit_budget_exceedings < 255 ) + telemetry_data.hit_budget_exceedings++; + + DISABLE_HIT_TRIGGER; + /* No more hit triggers will be handled before next Health */ + /* Monitoring period starts (or DEBIE is reset). */ + } else { + /* Some hit budget left; this hit will be handled. */ + + hit_budget_left--; + + confirm_hit_result = 1; + /*This variable indicates a hit with a high value. */ + + ADC_channel_register &= BP_DOWN; + UPDATE_ADC_CHANNEL_REG; + /*AD converter is set to unipolar mode */ + + START_CONVERSION; + /*Dummy cycle to set unipolar mode. */ + + conversion_try_count = 0; + + _Pragma( "loopbound min 0 max 25" ) + while ( conversion_try_count < ADC_MAX_TRIES + && END_OF_ADC != CONVERSION_ACTIVE ) { + conversion_try_count++; + /*Conversion try counter is increased. If this counter exeeds the*/ + /*maximum number of conversion start tries the conversion will be*/ + /*dropped. */ + } + + if ( self_test_SU_number != NO_SU ) { + /* Some Sensor Unit is being Self Tested. */ + trigger = self_test_SU_number; + + if ( SU_state[ self_test_SU_number - SU1 ] == self_test_e ) { + /* Some Sensor Unit is being Self Tested but this is */ + /* not the right self test pulse. */ + + trigger |= HIT_SELF_TEST_RESET ; + /* Self test pulse is incorrect and an indication */ + /* of this is stored in to 'trigger' variable. */ + /* The AcquisitionTask will adjust its operation */ + /* based on this indication result. */ + } + + else + if ( SU_state[ self_test_SU_number - SU1 ] == self_test_trigger_e ) { + /* Some Sensor Unit is being Self Tested and this is the correct. */ + /* self test pulse. */ + + SU_state[ self_test_SU_number - SU1 ] = self_test_e; + /* Indication of a succesfully received self test pulse */ + } + } + + else { + /* There is no Sensor Unit Self Test in progress. */ + + trigger = ( ( int )TRIGGER_SOURCE_0 + + 2 + * ( int )TRIGGER_SOURCE_1 ) + + SU1; + /* Sensor Unit which caused the hit trigger is resolved. */ + } + + CH_base = + ( ( int )( trigger - SU_1 ) & 2 ) * 12 + ( ( int )( trigger - SU_1 ) & 1 ) * 8; + /* First channel address for the given SU is calculated. */ + + ShortDelay( initial_delay ); + /* Delay before converting first channel. */ + + ADC_channel_register = + ( ADC_channel_register & 0xC0 ) | CH_base; + UPDATE_ADC_CHANNEL_REG; + /* First channel is selected. */ + + ShortDelay( delay_limit ); + /* Delay of 100 microseconds (+ function call overhead). */ + + + _Pragma( "loopbound min 5 max 5" ) + for ( i = 0; i < NUM_CH; i++ ) { + + ShortDelay( delay_limit ); + /* Delay of 100 microseconds (+ function call overhead). */ + + START_CONVERSION; + /* AD conversion for the selected channel is started. */ + + ADC_channel_register = + ( ADC_channel_register & 0xC0 ) | ( CH_base + i + 1 ); + UPDATE_ADC_CHANNEL_REG; + /* Next channel is selected. */ + + conversion_try_count = 0; + + _Pragma( "loopbound min 0 max 25" ) + while ( conversion_try_count < ADC_MAX_TRIES + && END_OF_ADC != CONVERSION_ACTIVE ) { + conversion_try_count++; + /*Conversion try counter is increased. If this counter exeeds */ + /*the maximum number of conversion start tries the conversion */ + /*will be dropped. */ + } + + if ( conversion_try_count < ADC_MAX_TRIES ) { + msb = GET_RESULT; + /*Most significant byte is read from ADC result address. */ + + lsb = GET_RESULT; + /*Least significant byte is read from ADC result address. */ + + ADC_result[ i ] = + ( ( unsigned int )msb << 8 ) | ( unsigned int )lsb; + /*Msb and lsb are combined into one word. */ + } + + else { + trigger |= HIT_ADC_ERROR; + /*Conversion has failed and an indication of this is stored in*/ + /*to 'trigger' variable by setting the Most Significant Bit */ + /*(MSB) high. The AcquisitionTask will adjust its operation */ + /*based on this indication result. */ + + ADC_result[ i ] = 0; + } + + } + + SendTaskMail( ACQUISITION_MAILBOX, trigger, 0 ); + /*The number of the Sensor unit that has caused the hit trigger */ + /*interrupt is sent to a mailbox for the acquisition task. */ + + } /* end if (hit budget left) */ + +} + +void HitTriggerTask( void ) TASK( HIT_TRIGGER_ISR_TASK ) PRIORITY( + HIT_TRIGGER_PR ) + +/* Purpose : Handles the Hit Trigger interrupts */ +/* Interface : inputs - Five analog outputs from Peak Detectors */ +/* outputs - Acquisition task mailbox */ +/* - Sampled ADC_result */ +/* Preconditions : Aqcuisition enabled */ +/* Postconditions : Message holding the number of triggering Sensor Unit is */ +/* sent to Aqcuisition task. */ +/* Algorithm : - InitHitTriggerTask */ +/* - loop forever: */ +/* - HandleHitTrigger */ + +{ + InitHitTriggerTask (); + + _Pragma( "loopbound min 0 max 0" ) + while ( 1 ) + HandleHitTrigger (); +} + + +#ifdef REG52_DEFINED +#pragma REGISTERBANK(0) +#endif + + +static EXTERNAL incoming_mail_t ACQ_mail; +/* Holds parameters for the mail waiting function. */ +/* Must be in xdata memory because parameter of subroutine is pointer */ +/* to xdata area. */ + +static EXTERNAL uint16_t trigger_unit; +/* Number of the triggering Sensor Unit. */ + + +void _Pragma( "entrypoint" ) InitAcquisitionTask ( void ) +/* Purpose : Initialize the global state of the Acquisition task. */ +/* Interface : inputs - none */ +/* outputs - ACQ_mail static fields. */ +/* Preconditions : none */ +/* Postconditions : AcqusitionTask is operational. */ +/* Algorithm : - initialize task variables */ +{ + /* ACQ_mail struct fields are set. */ + ACQ_mail.mailbox_number = ACQUISITION_MAILBOX; + ACQ_mail.message = &trigger_unit; + ACQ_mail.timeout = 0; +} + + +void _Pragma( "entrypoint" ) HandleAcquisition ( void ) + +/* Purpose : Acquires the data for one hit event. */ +/* Interface : inputs - Acquisition task mailbox */ +/* - Mail from Hit Trigger interrupt service */ +/* - Buffer with sampled Peak detector outputs */ +/* - Housekeeping Telemetry registers */ +/* outputs - Science data */ +/* Preconditions : none */ +/* Postconditions : one message processed from Acquisition task mailbox */ +/* Algorithm : - wait for mail to Acquisition task mailbox */ +/* - if mail is "SU_NUMBER" */ +/* - get Peak Detector Outputs sampled by the interrupt */ +/* service */ +/* - measure Pulse Rise Time */ +/* - measure delays between trigger signals */ +/* - get measurement time */ +/* - get sensor unit temperatures from Housekeeping */ +/* Telemetry registers */ +/* - calculate time difference between Plasma1- and */ +/* Plasma1+ trigger signals */ +/* - calculate quality number */ +/* - call RecordEvent() */ + +{ + EXTERNAL unsigned char *EXTERNAL checksum_pointer; + unsigned char EXTERNAL event_checksum; + uint_least8_t EXTERNAL i; + /* These variables are used when checksum is computed for a given event */ + /* before storing it to Science data area. */ + + event_record_t EXTERNAL *event; + /* Pointer to the new event record. */ + + EXTERNAL delays_t delay_counters; + /*This is a struct which stores the Delay Counter time data. */ + + DIRECT_INTERNAL signed int time_delay; + /*This variable is used to store the delay from plasma 1+ to plasma 1-. */ + + SU_state_t EXTERNAL state = off_e; + /* Used to store sensor unit state. */ + + WaitMail( &ACQ_mail ); + + if ( trigger_unit & HIT_ADC_ERROR ) { + /* There has been an error in AD conversion */ + /* in Hit trigger processing. */ + SetModeStatusError( ADC_ERROR ); + } + + if ( trigger_unit == SU_1 || trigger_unit == SU_2 || + trigger_unit == SU_3 || trigger_unit == SU_4 ) + + { + state = SU_state[ trigger_unit - SU_1 ]; + + if ( ( state == self_test_e || state == acquisition_e ) + && ( EVENT_FLAG == ACCEPT_EVENT ) ) { + event = GetFreeRecord(); + /* Get pointer to the new event record. */ + + + /*Number of the Sensor Unit, which has been hit, is stored into */ + /*Event Record. */ + event -> SU_number = ( unsigned char )( trigger_unit & 0xFF ); + + /*Contents of a temporary buffer is stored into Event Record. */ + COPY ( event -> plasma_1_plus, ADC_result[ 0 ] ); + COPY ( event -> plasma_1_minus, ADC_result[ 1 ] ); + COPY ( event -> piezo_1, ADC_result[ 2 ] ); + COPY ( event -> piezo_2, ADC_result[ 3 ] ); + COPY ( event -> plasma_2_plus, ADC_result[ 4 ] ); + + /*Rise time counter is read in to Event Record. */ + event -> rise_time = ReadRiseTimeCounter(); + + /*Delay counters are read in to a struct. */ + ReadDelayCounters( &delay_counters ); + + /*Delay from plasma 1+ to PZT 1/2 is stored into Event Record. */ + COPY ( event -> delay_2, delay_counters.FromPlasma1Plus ); + + /*Delay from plasma 1- to PZT 1/2 is stored into Event Record. */ + COPY ( event -> delay_3, delay_counters.FromPlasma1Minus ); + + /*Delay from plasma 1+ to plasma 1- is calculated and stored into*/ + /*Event Record. */ + + time_delay = delay_counters.FromPlasma1Plus + - delay_counters.FromPlasma1Minus; + if ( time_delay > 127 ) { + event -> delay_1 = 127; + /*If the delay from plasma 1+ to plasma 1- is positive and */ + /*doesn't fit into signed char 'event_record.delay_1', then */ + /*the largest value for the signed char is stored instead. */ + } + + else + if ( time_delay < -128 ) { + event -> delay_1 = -128; + /*If the delay from plasma 1+ to plasma 1- is negative and */ + /*doesn't fit into signed char 'event_record.delay_1', then */ + /*the smallest value for the signed char is stored instead. */ + } + + else { + event -> delay_1 = time_delay; + /*Delay from plasma 1+ to plasma 1- is calculated and stored */ + /*into Event Record. */ + } + + /*Measurement time is stored into Event Record. */ + COPY ( event -> hit_time, internal_time ); + + /*Unit temperatures are stored into Event Record. */ + + event -> SU_temperature_1 = + telemetry_data.SU_temperature[ trigger_unit - SU1 ][ 0 ]; + + event -> SU_temperature_2 = + telemetry_data.SU_temperature[ trigger_unit - SU1 ][ 1 ]; + + ClassifyEvent( event ); + /* New event is classified. */ + + checksum_pointer = ( EXTERNAL unsigned char * )event; + event_checksum = 0; + + _Pragma( "loopbound min 27 max 27" ) + for ( i = 1; i < sizeof( event_record_t ); i++ ) { + event_checksum ^= *checksum_pointer; + checksum_pointer++; + } + + event -> checksum = event_checksum; + + /* After the event record is filled up, it is stored into science*/ + /* data. */ + RecordEvent(); + } + } + + else { + /*The received mail contained an invalid Sensor unit number. */ + } + + trigger_unit &= SU_NUMBER_MASK; + /* Delete possible error bits. */ + + WaitTimeout( PEAK_RESET_MIN_DELAY ); + + ResetPeakDetector( trigger_unit ); + /*Peak detector for this Sensor Unit is resetted. */ + + WaitTimeout( PEAK_RESET_MIN_DELAY ); + + ResetPeakDetector( trigger_unit ); + /*Peak detector for this Sensor Unit is resetted again. */ + + WaitTimeout( COUNTER_RESET_MIN_DELAY ); + + ResetDelayCounters(); + /*The Delay Counters are resetted. */ +} + + +void AcquisitionTask( void ) TASK( ACQUISITION_TASK ) PRIORITY( ACQUISITION_PR ) +/* Purpose : Implements the Acquisition task. */ +/* Interface : inputs - Acquisition task mailbox */ +/* - Mail from Hit Trigger interrupt service */ +/* - Buffer with sampled Peak detector outputs */ +/* - Housekeeping Telemetry registers */ +/* outputs - Science data */ +/* Preconditions : none */ +/* Postconditions : This function does not return. */ +/* Algorithm : - InitAcquisitionTask */ +/* - loop forever: */ +/* - HandleAcquisition */ +{ + InitAcquisitionTask (); + + _Pragma( "loopbound min 0 max 0" ) + while ( 1 ) + HandleAcquisition (); +} + + +/*Assign pointers to tasks*/ +void ( * EXTERNAL hit_task )( void ) = HitTriggerTask; +void ( * EXTERNAL acq_task )( void ) = AcquisitionTask; + +void Switch_SU_State( sensor_unit_t EXTERNAL *SU_setting ) +COMPACT_DATA REENTRANT_FUNC +/* Purpose : Used when only the SU_state variable must be modified. */ +/* Interface : inputs - SU_state */ +/* - An Address of 'sensor_unit_t' type of a */ +/* struct. */ +/* outputs - SU_state */ +/* - SU_setting.execution_result */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : SU_state variable is conditionally modified. */ +/* Algorithm : */ +/* - If the expected SU_state variable value related to the */ +/* given SU_index number is not valid, variable value is */ +/* not changed. Error indication is recorded instead. */ +/* - Else state variable value is changed and an indication */ +/* of this is recorded. */ +{ + if ( SU_state[ ( SU_setting -> SU_number ) - SU_1 ] != + SU_setting -> expected_source_state ) + { + /* The original SU state is wrong. */ + + SU_setting -> execution_result = SU_STATE_TRANSITION_FAILED; + } + + else + if ( SU_setting -> SU_state == self_test_mon_e && + self_test_SU_number != NO_SU ) + { + /* There is a self test sequence running already */ + + SU_setting -> execution_result = SU_STATE_TRANSITION_FAILED; + } + + + else + { + /* The original SU state is correct. */ + + if ( SU_setting -> SU_state == self_test_mon_e ) { + self_test_SU_number = SU_setting -> SU_number; + /* Number of the SU under self test is recorded. */ + } + + else + if ( SU_setting -> SU_number == self_test_SU_number ) { + self_test_SU_number = NO_SU; + /* Reset self test state i.e. no self test is running. */ + } + + SU_state[ ( SU_setting -> SU_number ) - SU_1 ] = SU_setting -> SU_state; + SU_setting->execution_result = SU_STATE_TRANSITION_OK; + } +} + +void Start_SU_SwitchingOn( + sensor_index_t SU, + unsigned char EXTERNAL *exec_result ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Transition to SU state on. */ +/* Interface : inputs - Sensor_index number */ +/* - An Address of 'exec_result' variable */ +/* - SU_state */ +/* outputs - SU_state */ +/* - 'exec_result' */ +/* subroutines - Switch_SU_On */ +/* Preconditions : none */ +/* Postconditions : Under valid conditions transition to 'on' state is */ +/* completed. */ +/* Algorithm : */ +/* - If the original SU_state variable value related to the */ +/* given SU_index number is not valid, variable value is */ +/* not changed. Error indication is recorded instead. */ +/* - Else */ +/* - Disable interrups */ +/* - 'Switch_SU_On' function is called and an */ +/* indication of this transition is recorded. */ +/* - Enable interrupts */ +{ + *exec_result = SU_STATE_TRANSITION_OK; + /* Default value, may be changed below. */ + + if ( SU_state[ SU ] != off_e ) + { + /* The original SU state is wrong. */ + + *exec_result = SU_STATE_TRANSITION_FAILED; + } + + else + { + /* The original SU state is correct. */ + + DISABLE_INTERRUPT_MASTER; + + /* SU state is still off_e, because there is only one task */ + /* which can switch SU state from off_e to any other state. */ + + Switch_SU_On( + SU + SU_1, + exec_result ); + + if ( *exec_result == SU + SU_1 ) { + /* Transition succeeds. */ + + SU_state[ SU ] = start_switching_e; + } + + else { + /* Transition fails. */ + + *exec_result = SU_STATE_TRANSITION_FAILED; + } + + ENABLE_INTERRUPT_MASTER; + } +} + + +void SetSensorUnitOff( + sensor_index_t SU, + unsigned char EXTERNAL *exec_result ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Transition to SU state off. */ +/* Interface : inputs - Sensor_index number */ +/* - An Address of 'exec_result' variable */ +/* - SU_state */ +/* outputs - SU_state */ +/* - 'exec_result' */ +/* subroutines - Switch_SU_Off */ +/* Preconditions : none */ +/* Postconditions : Under valid conditions transition to 'off' state is */ +/* completed. */ +/* Algorithm : */ +/* - Disable interrups */ +/* - 'Switch_SU_Off' function is called. */ +/* - If transition succeeds, */ +/* - 'Off' state is recorded to 'SU_state' variable. */ +/* - Indication of transition is recorded to */ +/* 'exec_result'. */ +/* - Else if transition fails, */ +/* - Indication of this is recorded to 'exec_result'. */ +/* - Enable interrupts */ +{ + static sensor_unit_t EXTERNAL SU_setting; + /* Holds parameters for "Switch_SU_State" operation */ + /* Must be in external memory, because the parameter to the function */ + /* is pointer to external memory */ + + DISABLE_INTERRUPT_MASTER; + + Switch_SU_Off( + SU + SU_1, + exec_result ); + + if ( *exec_result == SU + SU_1 ) + { + /* Transition succeeds. */ + + SU_setting.SU_number = SU + SU_1; + SU_setting.expected_source_state = SU_state[ SU ]; + SU_setting.SU_state = off_e; + Switch_SU_State ( &SU_setting ); + *exec_result = SU_STATE_TRANSITION_OK; + } + + else + { + /* Transition fails. */ + + *exec_result = SU_STATE_TRANSITION_FAILED; + } + + ENABLE_INTERRUPT_MASTER; +} + +SU_state_t ReadSensorUnit( unsigned char SU_number ) COMPACT_DATA +REENTRANT_FUNC +/* Purpose : To find out whether given Sensor Unit is switched on or */ +/* off. */ +/* Interface : */ +/* Preconditions : SU_Number should be 1,2,3 or 4. */ +/* Postconditions : Value of state variable is returned. */ +/* Algorithm : Value of state variable (on_e or off_e) is returned. */ +{ + return SU_state[ SU_number - 1 ]; +} + + +void Update_SU_State( sensor_index_t SU_index ) COMPACT_DATA REENTRANT_FUNC +/* Purpose : Sensor unit state is updated. */ +/* Interface : inputs - SU_state */ +/* - SU_index number */ +/* outputs - SU_state */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : SU_state variable is modified. */ +/* Algorithm : - Disable interrups */ +/* - Change SU_state variable value related to the given */ +/* SU_index number. Selection of the new state depends on */ +/* the present one. */ +/* - Enable interrups */ +{ + DISABLE_INTERRUPT_MASTER; + + if ( SU_state[ SU_index ] == start_switching_e ) + SU_state[ SU_index ] = switching_e; + + else + if ( SU_state[ SU_index ] == switching_e ) + { + ResetPeakDetector( SU_index + SU_1 ); + /*Peak detector for this Sensor Unit is resetted. */ + + WaitTimeout( PEAK_RESET_MIN_DELAY ); + + ResetPeakDetector( SU_index + SU_1 ); + /*Peak detector for this Sensor Unit is resetted again. */ + + SU_state[ SU_index ] = on_e; + } + + ENABLE_INTERRUPT_MASTER; + +} + + + + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/measure.h b/targets/wasm-tacle/parallel/DEBIE/code/measure.h new file mode 100644 index 0000000..bfe46d7 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/measure.h @@ -0,0 +1,132 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : measure.h + + Prototypes etc. for the Measure module. + + Based on the SSF file measure.h, rev 1.14, Mon Aug 16 17:29:40 1999 . + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef MEASURE_H +#define MEASURE_H + + +#include "keyword.h" +#include "kernobj.h" +#include "su_ctrl.h" + +/*Maximum number of conversion start tries allowed in the HitTriggerTask*/ +#define ADC_MAX_TRIES 25 + +#define HIT_BUDGET_DEFAULT 20 +/* Default limit for the events handled during one Health Monitoring */ +/* period. Valid values 1 .. 255. */ + +#define PEAK_RESET_MIN_DELAY 1 +/* Peak detector reset min delay: 1 * 10ms. */ + +#define COUNTER_RESET_MIN_DELAY 1 +/* Delay counter reset min delay: 1 * 10 ms. */ +/* NOTE that specifications would allow delay */ +/* of 1ms, but minimum delay that is possible */ +/* to be generated with RTX is one tick = 10ms */ + +#define SELF_TEST_DELAY 4 +/* This delay equals the length of 4 system cycles. */ + +/*Sensor Unit numbers*/ +#define SU1 1 +#define SU2 2 +#define SU3 3 +#define SU4 4 + +#define HIT_ADC_ERROR 0x80 +#define HIT_SELF_TEST_RESET 0x40 +#define SU_NUMBER_MASK 0x07 + +/*type definitions*/ +typedef enum { + off_e, /* SU off state - power is Off. */ + start_switching_e, /* Transition to On state is starting. */ + switching_e, /* Transition to On state is started. */ + on_e, /* SU on state - power is On. */ + self_test_mon_e, /* Selt Test, Voltage and Temperature monitoring */ + self_test_e, /* Selt Test, test pulse setup. */ + self_test_trigger_e, /* Self test, test pulse handling */ + acquisition_e /* Power is On and Hit Events are accepted. */ + +} SU_state_t; +/* From these only off_e, on_e and self_test_e are actual SU states */ +/* defined in the User Requirements. Those and 'acquisition_e' are */ +/* the main states between which the SU state transitions are made. */ + +typedef struct { + sensor_number_t SU_number; /* Sensor Unit number */ + SU_state_t SU_state; /* Sensor unit states can be either On */ + /* or Off. */ + SU_state_t expected_source_state; /* Excpected source state of the SU */ + /* state transition. */ + unsigned char execution_result; /* This variable is used to indicate */ + /* execution results. */ + +} sensor_unit_t; + +extern SU_state_t EXTERNAL SU_state[ 4 ]; + +extern sensor_number_t EXTERNAL self_test_SU_number; + +typedef enum {high_e, low_e} SU_test_level_t; + +extern uint_least8_t EXTERNAL hit_budget; +extern uint_least8_t EXTERNAL hit_budget_left; + + +/*function prototypes*/ +extern void Switch_SU_State( sensor_unit_t EXTERNAL *SU_setting ) +COMPACT_DATA REENTRANT_FUNC; + +extern void Start_SU_SwitchingOn( + sensor_index_t SU, + unsigned char EXTERNAL *exec_result ) +COMPACT_DATA REENTRANT_FUNC; + +extern void SetSensorUnitOff( + sensor_index_t SU, + unsigned char EXTERNAL *exec_result ) +COMPACT_DATA REENTRANT_FUNC; + +extern SU_state_t ReadSensorUnit( unsigned char SU_number ) +COMPACT_DATA REENTRANT_FUNC; + +extern void Update_SU_State( sensor_index_t SU_index ) +COMPACT_DATA REENTRANT_FUNC; + +/*pointers to tasks*/ + +extern void ( * EXTERNAL hit_task )( void ); +extern void ( * EXTERNAL acq_task )( void ); + +/* Task functions, for testing: */ + +extern void InitHitTriggerTask ( void ); +extern void HandleHitTrigger ( void ); +extern void InitAcquisitionTask ( void ); +extern void HandleAcquisition ( void ); + +#endif + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/msg_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/msg_ctrl.h new file mode 100644 index 0000000..d7898b1 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/msg_ctrl.h @@ -0,0 +1,61 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : msg_ctrl.h + + Macros and operations for sending messages between tasks and + from interrupt handlers to tasks. + + Based on the SSF DHI file msg_ctrl.h, rev 1.11, Mon May 17 22:50:44 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef MSG_CTRL_H +#define MSR_CTRL_H + +#include "keyword.h" + + +#define MSG_RECEIVED 1 +/* The value of execution_result in incoming_mail_t that */ +/* signifies that a mail message has been received. */ +/* Must be different from NOT_OK as defined in RTX51.h. */ + +#define TIMEOUT_OCCURRED 4 +/* The value of execution_result in incoming_mail_t that */ +/* signifies that the wait for mail has timed out. */ +/* Must be different from NOT_OK as defined in RTX51.h. */ + + +typedef struct { + unsigned char mailbox_number; + unsigned char timeout; + uint16_t EXTERNAL *message; + signed char execution_result; /* This variable is used to indicate */ + /* execution results. */ + + signed char wait_result; /* Result from a RTX operation. */ + + unsigned char event_selector; /* The value of this variable defines the */ + /* execution of the wait-task. */ +} incoming_mail_t ; + +/* Function prototypes */ + +extern void WaitMail( incoming_mail_t EXTERNAL *message ) +COMPACT REENTRANT_FUNC; + +#endif + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/reg52.h b/targets/wasm-tacle/parallel/DEBIE/code/reg52.h new file mode 100644 index 0000000..c57220b --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/reg52.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : reg52.h + + Definitions for 80C32 Special Function Registers to be used + in portable parts of the DEBIE DPU software. + + Created for the DEBIE-I WCET benchmark program. Not based directly + on any SSF sources. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef REG52_H +#define REG52_H + +#include "target_reg52.h" + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/su_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/su_ctrl.h new file mode 100644 index 0000000..03f0807 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/su_ctrl.h @@ -0,0 +1,222 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : su_ctrl.h + + Macros, functions, constants and types for controlling Sensor Units. + + Based on the SSF DHI file su_ctrl.h, rev 1.28, Tue Sep 14 14:51:26 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef SU_CTRL_H +#define SU_CTRL_H + +#include "keyword.h" + +/* Sensor Channels */ + +#define NUM_CH 5 +/* Number of recorded measurement channels per sensor unit. */ +/* The PZT_1_2 channel is not recorded, as such. */ + +#define PLASMA_1_PLUS 0 +#define PLASMA_1_MINUS 1 +#define PZT_1 2 +#define PZT_2 3 +#define PLASMA_2_PLUS 4 +#define PZT_1_2 5 + + +#define SU_1 1 +#define SU_2 2 +#define SU_3 3 +#define SU_4 4 + +#define SU_1_ON 1 +#define SU_2_ON 2 +#define SU_3_ON 3 +#define SU_4_ON 4 + +#define SU_1_OFF 1 +#define SU_2_OFF 2 +#define SU_3_OFF 3 +#define SU_4_OFF 4 + +#define LOW_PLASMA_SELF_TEST_THRESHOLD 0x15 +#define LOW_PIEZO_SELF_TEST_THRESHOLD 0x0D +#define HIGH_PLASMA_1_PLUS_SELF_TEST_THRESHOLD 0xAB +#define HIGH_PLASMA_SELF_TEST_THRESHOLD 0x80 +#define HIGH_PIEZO_SELF_TEST_THRESHOLD 0x2B +#define MAX_PLASMA_SELF_TEST_THRESHOLD 0xFF +#define MAX_PIEZO_SELF_TEST_THRESHOLD 0xFF +/* Self test threshold levels. */ + +#define PLASMA_1_PLUS_LOW 0x13 +#define PLASMA_1_MINUS_LOW 0x08 +#define PLASMA_2_PLUS_LOW 0x10 +#define PZT_1_LOW 0x36 +#define PZT_2_LOW 0x36 +/* Low level test pulses. */ + +#define PLASMA_1_PLUS_HIGH 0x5A +#define PLASMA_1_MINUS_HIGH 0x2A +#define PLASMA_2_PLUS_HIGH 0x50 +#define PZT_1_HIGH 0xF6 +#define PZT_2_HIGH 0xE8 +/* High level test pulses. */ + +#define SU_NOT_ACTIVATED 0 +#define SU_NOT_DEACTIVATED 0 + +#define CHANNEL_NOT_SELECTED 5 +#define SU_NOT_SELECTED 6 + +#define TRIGGER_SET_OK 1 + +#define DEFAULT_THRESHOLD 0x0D +/* Default Trigger threshold is mid-scale value. */ + +#define DEFAULT_TEST_PULSE_LEVEL 0x00 + +#define DEFAULT_CLASSIFICATION_LEVEL 0 +#define DEFAULT_MAX_TIME 255 +#define DEFAULT_MIN_TIME 0 +/* These default levels are only temporary */ + +#define SU_ONOFF_MASK 3 +/* Bit mask for SU Status register manipulation when SU is */ +/* switched ON or OFF. */ + +#define SU_STATE_TRANSITION_OK 1 +#define SU_STATE_TRANSITION_FAILED 0 + +#define NO_SU 0 + +/* Trigger level register base addresses */ + +#define SU_1_TRIGGER_BASE 0xFFB0 +#define SU_2_TRIGGER_BASE 0xFFB3 +#define SU_3_TRIGGER_BASE 0xFFC0 +#define SU_4_TRIGGER_BASE 0xFFC3 + +#define SU_CONTROL 0xFFD0 + +#define SU_1_MINUS_50 1 +#define SU_1_PLUS_50 2 +#define SU_2_MINUS_50 4 +#define SU_2_PLUS_50 8 +#define SU_3_MINUS_50 16 +#define SU_3_PLUS_50 32 +#define SU_4_MINUS_50 64 +#define SU_4_PLUS_50 128 + +#define HV_STATUS 0xFF70 + +#include "target_su_ctrl.h" + +/* Type definitions */ + +typedef uint_least8_t sensor_number_t; +/* Sensor Unit number. Valid values SU_1, SU_2, SU_3 and SU_4 */ +/* which must be successive integers. */ +/* As a special case for some variables, the value NO_SU */ +/* indicates "no Sensor Unit". This possibility is always */ +/* shown by a comment on that variable, otherwise only real */ +/* SU numbers are allowed. */ + +#define NUM_SU 4 +/* The number of sensor units. */ + +typedef uint_least8_t sensor_index_t; +/* Sensor Unit index. Valid values 0 .. NUM_SU - 1. */ +/* Index 0 corresponds to Sensor Unit number SU_1. */ + +typedef uint_least8_t channel_t; +/* The number of an A/D channel. */ + +typedef struct { + unsigned short int FromPlasma1Plus; + unsigned short int FromPlasma1Minus; +} delays_t ; + +typedef struct { + sensor_number_t sensor_unit; + channel_t channel; + unsigned char level; + unsigned char execution_result; + unsigned int base; +} trigger_set_t ; + +typedef struct { + unsigned char V_down_bit; + unsigned char HV_status; +} voltage_status_t ; + + +extern unsigned char EXTERNAL SU_ctrl_register; +/* This variable stores values of write-only registers */ + +/* Function prototypes */ + +/* Sensor Unit status */ + + +/* Delay and rise time counters */ +extern void ReadDelayCounters ( delays_t EXTERNAL *delay ); +extern unsigned char ReadRiseTimeCounter( void ) COMPACT REENTRANT_FUNC; +extern void ResetDelayCounters( void ) COMPACT REENTRANT_FUNC; +extern void ResetPeakDetector( sensor_number_t unit ); +extern void SignalPeakDetectorReset( + unsigned char low_reset_value, + unsigned char high_reset_value ); + + +/* Trigger levels */ +extern void SetTriggerLevel( trigger_set_t EXTERNAL *setting ) +COMPACT REENTRANT_FUNC; + +/* Test pulse level */ +extern void SetTestPulseLevel( unsigned char level ) +COMPACT REENTRANT_FUNC; + +extern void GetVoltageStatus( voltage_status_t EXTERNAL *v_status ) +COMPACT REENTRANT_FUNC; + + +/* Sensor Unit power control */ +extern void Switch_SU_On ( + sensor_number_t SU_Number, + unsigned char EXTERNAL *execution_result ) +COMPACT REENTRANT_FUNC; + +extern void Switch_SU_Off ( + sensor_number_t SU_Number, + unsigned char EXTERNAL *execution_result ) +COMPACT REENTRANT_FUNC; + +/* Sensor Unit calibration */ + +extern void EnableAnalogSwitch( sensor_index_t self_test_SU_index ); +extern void DisableAnalogSwitch( sensor_index_t self_test_SU_index ); +extern void SelectSelfTestChannel( unsigned char channel ); +extern void SelectTriggerSwitchLevel( + unsigned char test_channel, + sensor_index_t self_test_SU_index ); +extern void SelectStartSwitchLevel( + unsigned char test_channel, + sensor_index_t self_test_SU_index ); + + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/taskctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/taskctrl.h new file mode 100644 index 0000000..c47372a --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/taskctrl.h @@ -0,0 +1,91 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DNI (DEBIE Null Interface) + Module : taskctrl.h + + Macros and function prototypes for operations dealing with the + kernel, task switching, message passing. The contents of this + DNI version of this header file are identical to the DHI version. + The DNI/DHI difference is in the bodies of the operations. + + Based on the SSF DHI file taskctrl.h, revision 1.11, Mon May 17 22:51:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +/* Type definitions */ + +#ifndef TASKCTRL_H +#define TASKCTRL_H + +#include "keyword.h" + +#define MACHINE_CYCLE 1.085 +/* The machine (processor) cycle time, in microseconds. */ + +#define DELAY_LIMIT(TIME) (unsigned short)((((TIME) / MACHINE_CYCLE) - 4) / 2) +/* Computes the number of ShortDelay() argument-units that corresponds */ +/* to a certain delay TIME in microseconds. Note that this formula can */ +/* yield values larger than ShortDelay() can implement in one call. */ +/* This formula is mainly intended for use with compile-time constant */ +/* values for TIME. */ + +#define MAX_SHORT_DELAY 255 +/* The largest possible argument for ShortDelay(). */ + + +typedef struct { + unsigned char rtx_task_number; + void ( *task_main_function )( void ); +} task_info_t; + +/* Function prototypes */ + +extern void ShortDelay ( uint_least8_t delay_loops ); + +extern void CreateTask( task_info_t EXTERNAL *new_task ); + +extern void WaitInterval( unsigned char time ); + +extern void WaitTimeout( unsigned char time ) COMPACT REENTRANT_FUNC; + +extern void SetTimeSlice( unsigned int time_slice ); + +extern void StartSystem( unsigned char task_number ); + +extern void SendTaskMail ( + unsigned char mailbox, + uint16_t message, + unsigned char timeout ); + +extern unsigned char isr_send_message ( + unsigned char mailbox, + uint16_t message ); + +#define OK 8 +#define NOT_OK 9 + +#define Send_ISR_Mail(mailbox,message) \ + if (isr_send_message (mailbox, message) == NOT_OK) \ + { \ + telemetry_data.isr_send_message_error = mailbox; \ + } +/* Send_ISR_Mail is to be used from C51 interrupt routines to send */ +/* mail messages to tasks. If RTX-51 reports an error, the mailbox */ +/* number is set in telemetry. The reason is probably the following: */ +/* -Specified mailbox does not exist(wrong mailbox parameter). */ +/* Send_ISR_Mail is made a macro instead of a function to avoid using */ +/* reentrant functions from interrupt routines. */ +/* Users of Send_ISR_Mail must have access to telemetry_data. */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/tc_hand.c b/targets/wasm-tacle/parallel/DEBIE/code/tc_hand.c new file mode 100644 index 0000000..fdb6113 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/tc_hand.c @@ -0,0 +1,1517 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : tc_hand.c + + Telecommand module. + + Based on the SSF file tc_hand.c, rev 1.66, Thu Sep 09 13:29:18 1999. + + - * -------------------------------------------------------------------------- +*/ + +#include "keyword.h" +#include "kernobj.h" +#include "tm_data.h" +#include "isr_ctrl.h" +#include "msg_ctrl.h" +#include "tc_hand.h" +#include "telem.h" +#include "ttc_ctrl.h" +#include "measure.h" +#include "dpu_ctrl.h" +#include "health.h" +#include "class.h" +#include "taskctrl.h" + +/* This file contains functions to implement Telecommand Execution Task */ + +#define TC_ADDRESS(TC_WORD) ((TC_WORD) >> 9) +#define TC_CODE(TC_WORD) ((TC_WORD) & 255) + +#define SET_TIME_TC_TIMEOUT 100 +/* Timeout between Set Time telecommands, 100 x 10ms = 1s */ + +#define MEM_BUFFER_SIZE 32 + +/* Possible TC look-up table values: */ + +#define ALL_INVALID 0 +/* used for invalid TC addresses */ + +#define ALL_VALID 1 +/* used for TCs which accept all TC codes */ + +#define ONLY_EQUAL 2 +/* used for TCs which require equal TC address and code */ + +#define ON_OFF_TC 3 +/* used for TCs which require ON, OFF or SELF_TEST parameter */ + +#define ONLY_EVEN 4 +/* used currently only for SEND_STATUS_REGISTER TC */ + + +#define WRITE_MEMORY_TIMEOUT 100 +/* Timeout 100 x 10 ms = 1s. */ + + +/* Array */ + +SU_settings_t EXTERNAL *EXTERNAL SU_config[ ] = { + &telemetry_data.sensor_unit_1, + &telemetry_data.sensor_unit_2, + &telemetry_data.sensor_unit_3, + &telemetry_data.sensor_unit_4 +}; + +/* Type definitions */ + +typedef struct { + uint16_t TC_word; /* Received telecommand word */ + unsigned char TC_address; /* Telecommand address */ + unsigned char TC_code; /* Telecommand code */ +} telecommand_t; + +typedef enum { + code_e, data_e +} memory_type_t; + +/* Global variables */ + +telecommand_t EXTERNAL previous_TC; +/* Holds previous telecommand unless a timeout has occurred */ + +unsigned char EXTERNAL TC_timeout = 0; +/* Time out for next telecommand, zero means no timeout */ + + +unsigned char EXTERNAL TC_look_up[ 128 ]; +/* Look-up table for all possible 128 TC address values */ + +TC_state_t EXTERNAL TC_state; +/* internal state of the Telecommand Execution task */ + +memory_type_t EXTERNAL memory_type; +/* Selection of memory write target (code/data) */ + +unsigned char EXTERNAL memory_transfer_buffer[ MEM_BUFFER_SIZE ]; +/* Buffer for memory read and write telecommands */ + +unsigned char EXTERNAL address_MSB; +/* MSB of memory read source and write destination addresses */ + +unsigned char EXTERNAL address_LSB; +/* LSB of memory read source and write destination addresses. */ + +uint_least8_t EXTERNAL memory_buffer_index = 0; +/* Index to memory_buffer. */ + +unsigned char EXTERNAL write_checksum; +/* Checksum for memory write blocks. */ + + +void InitTC_LookUp( void ) +/* Purpose : Initializes the TC look-up table */ +/* Interface : inputs - none */ +/* outputs - TC_lool_up */ +/* Preconditions : none */ +/* Postconditions : TC_look_up is initialized */ +/* Algorithm : - set all elements in table to ALL_INVALID */ +/* - set each element corresponding valid TC address */ +/* to proper value */ +{ + DIRECT_INTERNAL uint_least8_t i; + /* Loop variable */ + + + _Pragma( "loopbound min 128 max 128" ) + for ( i = 0; i < 128; i++ ) TC_look_up[ i ] = ALL_INVALID; + + TC_look_up[ START_ACQUISITION ] = ONLY_EQUAL; + TC_look_up[ STOP_ACQUISITION ] = ONLY_EQUAL; + + TC_look_up[ ERROR_STATUS_CLEAR ] = ONLY_EQUAL; + + TC_look_up[ SEND_STATUS_REGISTER ] = ONLY_EVEN; + TC_look_up[ SEND_SCIENCE_DATA_FILE ] = ONLY_EQUAL; + + TC_look_up[ SET_TIME_BYTE_0 ] = ALL_VALID; + TC_look_up[ SET_TIME_BYTE_1 ] = ALL_VALID; + TC_look_up[ SET_TIME_BYTE_2 ] = ALL_VALID; + TC_look_up[ SET_TIME_BYTE_3 ] = ALL_VALID; + + TC_look_up[ SOFT_RESET ] = ONLY_EQUAL; + + TC_look_up[ CLEAR_WATCHDOG_FAILURES ] = ONLY_EQUAL; + TC_look_up[ CLEAR_CHECKSUM_FAILURES ] = ONLY_EQUAL; + + TC_look_up[ WRITE_CODE_MEMORY_MSB ] = ALL_VALID; + TC_look_up[ WRITE_CODE_MEMORY_LSB ] = ALL_VALID; + TC_look_up[ WRITE_DATA_MEMORY_MSB ] = ALL_VALID; + TC_look_up[ WRITE_DATA_MEMORY_LSB ] = ALL_VALID; + TC_look_up[ READ_DATA_MEMORY_MSB ] = ALL_VALID; + TC_look_up[ READ_DATA_MEMORY_LSB ] = ALL_VALID; + + TC_look_up[ SWITCH_SU_1 ] = ON_OFF_TC; + TC_look_up[ SWITCH_SU_2 ] = ON_OFF_TC; + TC_look_up[ SWITCH_SU_3 ] = ON_OFF_TC; + TC_look_up[ SWITCH_SU_4 ] = ON_OFF_TC; + + TC_look_up[ SET_SU_1_PLASMA_1P_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1P_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1P_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1P_THRESHOLD ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1M_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1M_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1M_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1M_THRESHOLD ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PIEZO_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_2_PIEZO_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_3_PIEZO_THRESHOLD ] = ALL_VALID; + TC_look_up[ SET_SU_4_PIEZO_THRESHOLD ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1P_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1P_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1P_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1P_CLASS_LEVEL ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1M_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1M_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1M_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1M_CLASS_LEVEL ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_2P_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_2P_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_2P_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_2P_CLASS_LEVEL ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PIEZO_1_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_2_PIEZO_1_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_3_PIEZO_1_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_4_PIEZO_1_CLASS_LEVEL ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PIEZO_2_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_2_PIEZO_2_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_3_PIEZO_2_CLASS_LEVEL ] = ALL_VALID; + TC_look_up[ SET_SU_4_PIEZO_2_CLASS_LEVEL ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1E_1I_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1E_1I_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1E_1I_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1E_1I_MAX_TIME ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1E_PZT_MIN_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1E_PZT_MIN_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1E_PZT_MIN_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1E_PZT_MIN_TIME ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1E_PZT_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1E_PZT_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1E_PZT_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1E_PZT_MAX_TIME ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1I_PZT_MIN_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1I_PZT_MIN_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1I_PZT_MIN_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1I_PZT_MIN_TIME ] = ALL_VALID; + + TC_look_up[ SET_SU_1_PLASMA_1I_PZT_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_2_PLASMA_1I_PZT_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_3_PLASMA_1I_PZT_MAX_TIME ] = ALL_VALID; + TC_look_up[ SET_SU_4_PLASMA_1I_PZT_MAX_TIME ] = ALL_VALID; + + TC_look_up[ SET_COEFFICIENT_1 ] = ALL_VALID; + TC_look_up[ SET_COEFFICIENT_2 ] = ALL_VALID; + TC_look_up[ SET_COEFFICIENT_3 ] = ALL_VALID; + TC_look_up[ SET_COEFFICIENT_4 ] = ALL_VALID; + TC_look_up[ SET_COEFFICIENT_5 ] = ALL_VALID; + +} + + +void TC_InterruptService ( void ) INTERRUPT( TC_ISR_SOURCE ) USED_REG_BANK( 2 ) +/* Purpose : Handles the TC interrupt */ +/* Interface : inputs - TC MSB and LSB hardware registers */ +/* TC_look_up table giving valid TC addresses */ +/* and TC codes */ +/* outputs - TM data registers for received TC and TC */ +/* time tag */ +/* TM data registers for error and mode */ +/* status */ +/* TM MSB and LSB hardware registers */ +/* telemetry_pointer */ +/* telemetry_end_pointer */ +/* Telecommand Execution task mailbox */ +/* Preconditions : none */ +/* Postconditions : */ +/* Mail sent to Telecommand Execution task, if TC was */ +/* valid */ +/* Algorithm : - Read TC address and code from hardware registers */ +/* - Calculate parity */ +/* - If parity not Ok */ +/* - Set parity error */ +/* - Else */ +/* - Clear parity error */ +/* - Check TC address and code */ +/* - If TC Ok */ +/* Clear TC error and send mail */ +/* - Else */ +/* Set TC error */ +/* - If TC is valid Send Status Register */ +/* - Send first two registers defined by TC code */ +/* - Else if TC is valid Send Science Data File */ +/* - Send first teo bytes from Science Data File */ +/* - Else if TC responce is enabled */ +/* - Send Error Status and Mode Status */ +/* - If TC is invalid */ +/* - Disable TC responses */ + +{ + DIRECT_INTERNAL unsigned char TC_address; + DIRECT_INTERNAL unsigned char TC_code; + DIRECT_INTERNAL uint16_t TC_word; + /* Telecommand and it's parts */ + + DIRECT_INTERNAL unsigned char par8, par4, par2, par1; + /* Parity calculation results */ + + DIRECT_INTERNAL unsigned char tmp_error_status; + /* Temporary result of TC validity check */ + + + if ( !TC_TIMER_OVERFLOW_FLAG ) { + /* TC is rejected. */ + + telemetry_data.error_status |= TC_ERROR; + /* Set TC Error bit. */ + + return; + /* Abort ISR. */ + } + + if ( ( TC_state == SC_TM_e ) || ( TC_state == memory_dump_e ) ) { + return; + /* Abort ISR. */ + } + + STOP_TC_TIMER; + INIT_TC_TIMER_MSB; + INIT_TC_TIMER_LSB; + CLEAR_TC_TIMER_OVERFLOW_FLAG; + START_TC_TIMER; + + TC_address = READ_TC_MSB; + TC_code = READ_TC_LSB; + TC_word = TC_address * 256 + TC_code; + /* Get TC Address, TC Code and TC Word */ + + if ( TC_state == memory_patch_e ) { + Send_ISR_Mail( 0, TC_word ); + return; + /* This is not a normal telecommand, but word containing two bytes */ + /* of memory block to be written to data or code memory. */ + } + + if ( TC_state == register_TM_e ) { + TC_state = TC_handling_e; + /* Register TM state is aborted */ + + ResetInterruptMask( TM_ISR_MASK ); + /* Disable TM interrupt mask. Note that DisableInterrupt */ + /* cannot be called from the C51 ISR. */ + } + + + par8 = TC_address ^ TC_code; + par4 = ( par8 & 0x0F ) ^ ( par8 >> 4 ); + par2 = ( par4 & 0x03 ) ^ ( par4 >> 2 ); + par1 = ( par2 & 0x01 ) ^ ( par2 >> 1 ); + /* Calculate parity */ + + TC_address >>= 1; + + tmp_error_status = 0; + + if ( par1 ) { + /* Parity error. */ + + tmp_error_status |= PARITY_ERROR; + } + + else { + + switch ( TC_look_up[ TC_address ] ) { + case ALL_INVALID: + /* Invalid TC Address */ + tmp_error_status |= TC_ERROR; + break; + + case ALL_VALID: + /* All TC Codes are valid */ + Send_ISR_Mail( 0, TC_word ); + break; + + case ONLY_EQUAL: + /* TC Code should be equal to TC Address */ + if ( TC_address != TC_code ) + tmp_error_status |= TC_ERROR; + + else + Send_ISR_Mail( 0, TC_word ); + break; + + case ON_OFF_TC: + /* TC_Code must have ON , OFF or SELF_TEST value */ + if ( ( TC_code != ON_VALUE ) && ( TC_code != OFF_VALUE ) && + ( TC_code != SELF_TEST ) ) + tmp_error_status |= TC_ERROR; + + else + Send_ISR_Mail( 0, TC_word ); + break; + + case ONLY_EVEN: + /* TC_Code must be even and not too big */ + if ( ( TC_code & 1 ) || ( TC_code > LAST_EVEN ) ) + tmp_error_status |= TC_ERROR; + + else + Send_ISR_Mail( 0, TC_word ); + break; + } + } + + if ( ( ( TC_address != SEND_STATUS_REGISTER ) + || ( tmp_error_status ) ) + && ( ( telemetry_data.error_status & TC_OR_PARITY_ERROR ) == 0 ) ) { + /* Condition 1 : */ + /* (TC is not SEND STATUS REGISTER or TC is invalid). */ + /* and condition 2: */ + /* no invalid telecommands are recorded */ + /* */ + /* First condition checks that the Command Status and */ + /* Command Time Tag registers should be updated. */ + /* Second condition checks that the update can be done. */ + + + telemetry_data.TC_word = TC_word; + COPY ( telemetry_data.TC_time_tag, internal_time ); + /* Update TC registers in HK TM data area */ + } + + if ( tmp_error_status ) { + /* TC is invalid. */ + + telemetry_data.error_status |= tmp_error_status; + WRITE_TM_MSB ( telemetry_data.error_status ); + WRITE_TM_LSB ( telemetry_data.mode_status ); + /* Send response to this TC to TM */ + + return; + /* Abort ISR because TC is invalid. */ + } + + + if ( TC_address == SEND_STATUS_REGISTER ) { + /* Send Status Register TC accepted */ + + COPY( telemetry_data.time, internal_time ); + + telemetry_pointer = ( ( EXTERNAL unsigned char * )&telemetry_data ) + + TC_code; + telemetry_end_pointer = ( ( EXTERNAL unsigned char * )&telemetry_data ) + + LAST_EVEN + 1; + /* First TM register to be sent is given in TC_Code */ + + CLEAR_TM_INTERRUPT_FLAG; + + WRITE_TM_MSB ( *telemetry_pointer ); + telemetry_pointer++; + WRITE_TM_LSB ( *telemetry_pointer ); + telemetry_pointer++; + + TC_state = register_TM_e; + + SetInterruptMask( TM_ISR_MASK ); + /* Enable TM interrupt mask. Note that EnableInterrupt */ + /* cannot be called from the C51 ISR */ + + if ( telemetry_pointer > telemetry_end_pointer ) + telemetry_pointer = ( EXTERNAL unsigned char * )&telemetry_data; + } + + else + if ( TC_address == SEND_SCIENCE_DATA_FILE ) { + /* Send Science Data File TC accepted. */ + + if ( ( telemetry_data.mode_status & MODE_BITS_MASK ) == DPU_SELF_TEST ) { + /* Wrong DEBIE mode. */ + + telemetry_data.error_status |= TC_ERROR; + WRITE_TM_MSB ( telemetry_data.error_status ); + WRITE_TM_LSB ( telemetry_data.mode_status ); + /* Send response to this TC to TM. */ + } + + else { + telemetry_pointer = ( EXTERNAL unsigned char * )&science_data; + telemetry_end_pointer = ( ( EXTERNAL unsigned char * ) + & ( science_data.event[ free_slot_index ] ) ) - 1; + /* Science telemetry stops to the end of the last used event */ + /* record of the Science Data memory. */ + + science_data.length = ( unsigned short int ) + ( telemetry_end_pointer - telemetry_pointer + 1 ) / 2; + /* Store the current length of used science data. */ + + CLEAR_TM_INTERRUPT_FLAG; + + WRITE_TM_MSB ( *telemetry_pointer ); + telemetry_pointer++; + WRITE_TM_LSB ( *telemetry_pointer ); + telemetry_pointer++; + + TC_state = SC_TM_e; + + SetInterruptMask( TM_ISR_MASK ); + /* Enable TM interrupt mask. Note that EnableInterrupt */ + /* cannot be called from a C51 ISR. */ + } + } + + else + if ( TC_address == READ_DATA_MEMORY_LSB ) { + /* Read Data Memory LSB accepted. */ + + if ( ( TC_state != read_memory_e ) || + ( ( ( unsigned int )address_MSB << 8 ) + TC_code + > ( END_SRAM3 - MEM_BUFFER_SIZE ) + 1 ) ) { + /* Wrong TC state or wrong address range. */ + + telemetry_data.error_status |= TC_ERROR; + WRITE_TM_MSB ( telemetry_data.error_status ); + WRITE_TM_LSB ( telemetry_data.mode_status ); + /* Send response to this TC to TM. */ + + TC_state = TC_handling_e; + } + + else { + telemetry_pointer = + DATA_POINTER( ( int )address_MSB * 256 + TC_code ); + telemetry_end_pointer = telemetry_pointer + MEM_BUFFER_SIZE; + + CLEAR_TM_INTERRUPT_FLAG; + + WRITE_TM_MSB ( telemetry_data.error_status ); + WRITE_TM_LSB ( telemetry_data.mode_status ); + /* First two bytes of Read Data Memory sequence. */ + + read_memory_checksum = tmp_error_status ^ telemetry_data.mode_status; + + TC_state = memory_dump_e; + + SetInterruptMask( TM_ISR_MASK ); + } + } + + else { + /* Some other TC accepted. */ + + WRITE_TM_MSB ( telemetry_data.error_status ); + WRITE_TM_LSB ( telemetry_data.mode_status ); + /* Send response to this TC to TM. */ + } + +} + + +unsigned char PatchExecCommandOk ( unsigned char execution_command ) +{ + switch ( execution_command ) { + case 0: + case 0x09: + case 0x37: + case 0x5A: + return 1; + } + return 0; +} + + +void MemoryPatch( telecommand_t EXTERNAL *command ) +/* Purpose : Handles received telecommand in memory patch state */ +/* Interface : inputs - command, received telecommand */ +/* address_MSB, MSB of patch area */ +/* address_LSB, LSB of patch area */ +/* memory_transfer_buffer, buffer for bytes */ +/* to be written to patch area */ +/* memory_buffer_index, index to above buffer */ +/* outputs - memory_transfer_buffer, as above */ +/* memory_buffer_index, as above */ +/* code_not_patched, indicates if code */ +/* checksum is vali or not */ +/* telemetry_data.mode_status, Mode Status */ +/* telemetry register */ +/* TC_state, TC Execution task state */ +/* Preconditions : TC_state is memory patch. */ +/* Destination memory type (data/code) is memorized. */ +/* Postconditions : After last phase code or data memory patched if */ +/* operation succeeded. */ +/* Algorithm : - If memory_transfer_buffer not filled */ +/* - update write_checksum (XOR with MSB and LSB of */ +/* the telecommand word) */ +/* - store TC word to memory_transfer_buffer */ +/* - else */ +/* - If checksum of TC block Ok */ +/* - If data memory patch */ +/* - copy memory_tranfer_buffer to data memory */ +/* - else (code memory patch) */ +/* - call PatchCode function */ +/* - else */ +/* - set MEMORY_WRITE_ERROR bit in ModeStatus */ + +{ + memory_patch_variables_t EXTERNAL patch_info; + /* Parameters for PatchCode function. */ + + data_address_t INDIRECT_INTERNAL address; + /* Start address of the memory area to be patched. */ + + uint_least8_t INDIRECT_INTERNAL i; + /* Loop variable. */ + + unsigned char INDIRECT_INTERNAL TC_msb; + /* Most significant byte of the TC word. */ + + TC_msb = ( command -> TC_word ) >> 8; + write_checksum ^= TC_msb; + + if ( memory_buffer_index < MEM_BUFFER_SIZE ) { + /* Filling the buffer bytes to be written to code or data */ + /* memory. */ + + write_checksum ^= command -> TC_code; + + memory_transfer_buffer[ memory_buffer_index ] = TC_msb; + memory_buffer_index++; + memory_transfer_buffer[ memory_buffer_index ] = command -> TC_code; + memory_buffer_index++; + + TC_timeout = WRITE_MEMORY_TIMEOUT; + } + + else { + /* Now all bytes for memory area to be patched have been */ + /* received. */ + + if ( write_checksum == command -> TC_code ) { + /* Checksum Ok. */ + + address = ( ( unsigned int )address_MSB ) * 256 + address_LSB; + + switch ( memory_type ) { + case data_e: + /* Write to the data memory. */ + + if ( address <= ( END_SRAM3 - MEM_BUFFER_SIZE + 1 ) ) { + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < MEM_BUFFER_SIZE; i++ ) + SET_DATA_BYTE( address + i, memory_transfer_buffer[ i ] ); + } + + else + Set_TC_Error(); + + break; + + case code_e: + /* Write to the code memory. */ + + if ( ( address >= BEGIN_SRAM1 ) && + ( address <= END_SRAM1 - MEM_BUFFER_SIZE + 1 ) && + ( PatchExecCommandOk ( TC_msb ) ) ) + + { + /* Destination section resides in SRAM1. */ + + code_not_patched = 0; + /* Next code checksum not valid, because code memory */ + /* will be patched. */ + + patch_info.source = memory_transfer_buffer, + patch_info.destination = address, + patch_info.data_amount = MEM_BUFFER_SIZE, + patch_info.execution_command = TC_msb; + /* Set parameters for the MemoryPatch function */ + /* (see definition of memory_patch_variables_t). */ + + PatchCode( &patch_info ); + /* May or may not return here. */ + } + + else { + /* Destination section out side SRAM1. */ + Set_TC_Error(); + } + + break; + } + } + + else { + /* Checksum failure. */ + + SetModeStatusError( MEMORY_WRITE_ERROR ); + /* Set memory write error bit in Mode Status register. */ + } + + TC_state = TC_handling_e; + } +} + + +void WriteMemory( telecommand_t EXTERNAL *command ) +/* Purpose : Handles received telecommand in the WriteMemory state */ +/* Interface : inputs - Parameter "command" containing received */ +/* telecommand or memory byte */ +/* memory_type defining code or data memory */ +/* destination */ +/* outputs - address_LSB, LSB of the patch area */ +/* TC_state */ +/* Preconditions : TC_state is write_memory */ +/* Destination memory type (data/code) is memorized */ +/* Postconditions : LSB of the patch area address is memorized. */ +/* Algorithm : - update write_checksum (XOR with TC word MSB and LSB) */ +/* - if telecommand is LSB setting of patch memory address */ +/* of selected memory type */ +/* - set TC state to memory_patch_e */ +/* - memorize address LSB */ +/* - clear memory_buffer_index */ +/* - set TC timeout to WRITE_MEMORY_TIMEOUT */ +/* - else */ +/* - set TC state to TC_handling_e */ + +{ + /* Expecting LSB of the start address for the memory area to be patched. */ + + write_checksum ^= ( ( command -> TC_word ) >> 8 ) ^ ( command -> TC_code ); + + if ( ( ( command -> TC_address == WRITE_CODE_MEMORY_LSB ) + && ( memory_type == code_e ) ) + || ( ( command -> TC_address == WRITE_DATA_MEMORY_LSB ) + && ( memory_type == data_e ) ) ) { + TC_state = memory_patch_e; + + address_LSB = command -> TC_code; + memory_buffer_index = 0; + TC_timeout = WRITE_MEMORY_TIMEOUT; + } + + else { + TC_state = TC_handling_e; + + Set_TC_Error(); + } +} + + +void UpdateTarget( telecommand_t EXTERNAL *command ) +/* Purpose : Updates a HW register or some global variable according */ +/* to the parameter "command" */ +/* Interface : inputs - Parameter "command" containing received */ +/* telecommand */ +/* outputs - telemetry data */ +/* Preconditions : The parameter "command" contains a valid telecommand */ +/* Postconditions : A HW register or global variable is updated (depend on */ +/* "command") */ +/* Algorithm : - switch "command" */ +/* - case Set Coefficient: */ +/* set given quality coefficient value in telemetry */ +/* according to "command" */ +/* - case Min/Max Time: */ +/* set Min/Max Time according to "command" */ +/* - case Classification Level: */ +/* set classification level according to "command" */ +/* - case Error Status Clear: */ +/* clear error indicating bits from telemetry */ +/* - case Set Time Byte: */ +/* set Debie time byte# according to "command" */ +/* - case Clear Watchdog/Checksum Failure counter */ +/* clear Watchdog/Checksum Failure counter */ +/* - case Switch SU # On/Off/SelfTest */ +/* switch SU to On/Off/SelfTest according to */ +/* "command" */ +/* - case Set Threshold */ +/* set Threshold according to "command" */ +{ + EXTERNAL sensor_unit_t SU_setting; + /* Holds parameters for "SetSensorUnit" operation */ + /* Must be in external memory, because the parameter to the function */ + /* is pointer to external memory */ + + EXTERNAL trigger_set_t new_threshold; + + dpu_time_t EXTERNAL new_time; + + sensor_index_t EXTERNAL SU_index; + + SU_index = ( ( command -> TC_address ) >> 4 ) - 2; + + + switch ( command -> TC_address ) { + case SET_COEFFICIENT_1: + case SET_COEFFICIENT_2: + case SET_COEFFICIENT_3: + case SET_COEFFICIENT_4: + case SET_COEFFICIENT_5: + + telemetry_data.coefficient[ ( command -> TC_address ) & 0x07 ] = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1E_1I_MAX_TIME: + case SET_SU_2_PLASMA_1E_1I_MAX_TIME: + case SET_SU_3_PLASMA_1E_1I_MAX_TIME: + case SET_SU_4_PLASMA_1E_1I_MAX_TIME: + + SU_config[ SU_index ] -> plasma_1_plus_to_minus_max_time = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1E_PZT_MIN_TIME: + case SET_SU_2_PLASMA_1E_PZT_MIN_TIME: + case SET_SU_3_PLASMA_1E_PZT_MIN_TIME: + case SET_SU_4_PLASMA_1E_PZT_MIN_TIME: + + SU_config[ SU_index ] -> plasma_1_plus_to_piezo_min_time = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1E_PZT_MAX_TIME: + case SET_SU_2_PLASMA_1E_PZT_MAX_TIME: + case SET_SU_3_PLASMA_1E_PZT_MAX_TIME: + case SET_SU_4_PLASMA_1E_PZT_MAX_TIME: + + SU_config[ SU_index ] -> plasma_1_plus_to_piezo_max_time = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1I_PZT_MIN_TIME: + case SET_SU_2_PLASMA_1I_PZT_MIN_TIME: + case SET_SU_3_PLASMA_1I_PZT_MIN_TIME: + case SET_SU_4_PLASMA_1I_PZT_MIN_TIME: + + SU_config[ SU_index ] -> plasma_1_minus_to_piezo_min_time = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1I_PZT_MAX_TIME: + case SET_SU_2_PLASMA_1I_PZT_MAX_TIME: + case SET_SU_3_PLASMA_1I_PZT_MAX_TIME: + case SET_SU_4_PLASMA_1I_PZT_MAX_TIME: + + SU_config[ SU_index ] -> plasma_1_minus_to_piezo_max_time = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1P_CLASS_LEVEL: + case SET_SU_2_PLASMA_1P_CLASS_LEVEL: + case SET_SU_3_PLASMA_1P_CLASS_LEVEL: + case SET_SU_4_PLASMA_1P_CLASS_LEVEL: + + SU_config[ SU_index ] -> plasma_1_plus_classification = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1M_CLASS_LEVEL: + case SET_SU_2_PLASMA_1M_CLASS_LEVEL: + case SET_SU_3_PLASMA_1M_CLASS_LEVEL: + case SET_SU_4_PLASMA_1M_CLASS_LEVEL: + + SU_config[ SU_index ] -> plasma_1_minus_classification = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_2P_CLASS_LEVEL: + case SET_SU_2_PLASMA_2P_CLASS_LEVEL: + case SET_SU_3_PLASMA_2P_CLASS_LEVEL: + case SET_SU_4_PLASMA_2P_CLASS_LEVEL: + + SU_config[ SU_index ] -> plasma_2_plus_classification = + command -> TC_code; + break; + + case SET_SU_1_PIEZO_1_CLASS_LEVEL: + case SET_SU_2_PIEZO_1_CLASS_LEVEL: + case SET_SU_3_PIEZO_1_CLASS_LEVEL: + case SET_SU_4_PIEZO_1_CLASS_LEVEL: + + SU_config[ SU_index ] -> piezo_1_classification = + command -> TC_code; + break; + + case SET_SU_1_PIEZO_2_CLASS_LEVEL: + case SET_SU_2_PIEZO_2_CLASS_LEVEL: + case SET_SU_3_PIEZO_2_CLASS_LEVEL: + case SET_SU_4_PIEZO_2_CLASS_LEVEL: + + SU_config[ SU_index ] -> piezo_2_classification = + command -> TC_code; + break; + + case ERROR_STATUS_CLEAR: + + ClearErrorStatus(); + Clear_RTX_Errors(); + ClearSoftwareError(); + ClearModeStatusError(); + Clear_SU_Error(); + /* Clear Error Status register, RTX and software error indicating bits */ + /* and Mode and SU Status registers. */ + + break; + + + case SET_TIME_BYTE_3: + + new_time = ( ( dpu_time_t ) command -> TC_code ) << 24; + COPY ( internal_time, new_time ); + TC_timeout = SET_TIME_TC_TIMEOUT; + + break; + + case SET_TIME_BYTE_2: + + if ( previous_TC.TC_address == SET_TIME_BYTE_3 ) { + COPY ( new_time, internal_time ); + + new_time &= 0xFF000000; + new_time |= + ( ( dpu_time_t ) command -> TC_code ) << 16; + + COPY ( internal_time, new_time ); + + TC_timeout = SET_TIME_TC_TIMEOUT; + } + + else + Set_TC_Error(); + + break; + + case SET_TIME_BYTE_1: + + if ( previous_TC.TC_address == SET_TIME_BYTE_2 ) { + COPY ( new_time, internal_time ); + + new_time &= 0xFFFF0000; + new_time |= + ( ( dpu_time_t ) command -> TC_code ) << 8; + + COPY ( internal_time, new_time ); + + TC_timeout = SET_TIME_TC_TIMEOUT; + } + + else + Set_TC_Error(); + + break; + + case SET_TIME_BYTE_0: + + if ( previous_TC.TC_address == SET_TIME_BYTE_1 ) { + COPY ( new_time, internal_time ); + + new_time &= 0xFFFFFF00; + new_time |= + ( ( dpu_time_t ) command -> TC_code ); + + COPY ( internal_time, new_time ); + } + + else + Set_TC_Error(); + + break; + + case CLEAR_WATCHDOG_FAILURES: + + telemetry_data.watchdog_failures = 0; + break; + + case CLEAR_CHECKSUM_FAILURES: + + telemetry_data.checksum_failures = 0; + break; + + case SWITCH_SU_1: + case SWITCH_SU_2: + case SWITCH_SU_3: + case SWITCH_SU_4: + + if ( GetMode() != ACQUISITION ) { + SU_setting.SU_number = SU_index + SU_1; + + switch ( command -> TC_code ) { + case ON_VALUE: + Start_SU_SwitchingOn( SU_index, & + ( SU_setting.execution_result ) ); + break; + + case OFF_VALUE: + SetSensorUnitOff( SU_index, &( SU_setting.execution_result ) ); + break; + + case SELF_TEST: + SU_setting.SU_state = self_test_mon_e; + SU_setting.expected_source_state = on_e; + Switch_SU_State ( &SU_setting ); + break; + } + + if ( SU_setting.execution_result == SU_STATE_TRANSITION_FAILED ) { + /* The requested SU state transition failed. */ + + Set_TC_Error(); + } + + } + + else + + Set_TC_Error(); + + break; + + case SET_SU_1_PLASMA_1P_THRESHOLD: + + new_threshold.sensor_unit = SU_1; + new_threshold.channel = PLASMA_1_PLUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_1.plasma_1_plus_threshold = + command -> TC_code; + break; + + case SET_SU_2_PLASMA_1P_THRESHOLD: + + new_threshold.sensor_unit = SU_2; + new_threshold.channel = PLASMA_1_PLUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_2.plasma_1_plus_threshold = + command -> TC_code; + break; + + case SET_SU_3_PLASMA_1P_THRESHOLD: + + new_threshold.sensor_unit = SU_3; + new_threshold.channel = PLASMA_1_PLUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_3.plasma_1_plus_threshold = + command -> TC_code; + break; + + case SET_SU_4_PLASMA_1P_THRESHOLD: + + new_threshold.sensor_unit = SU_4; + new_threshold.channel = PLASMA_1_PLUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_4.plasma_1_plus_threshold = + command -> TC_code; + break; + + case SET_SU_1_PLASMA_1M_THRESHOLD: + + new_threshold.sensor_unit = SU_1; + new_threshold.channel = PLASMA_1_MINUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_1.plasma_1_minus_threshold = + command -> TC_code; + break; + + case SET_SU_2_PLASMA_1M_THRESHOLD: + + new_threshold.sensor_unit = SU_2; + new_threshold.channel = PLASMA_1_MINUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_2.plasma_1_minus_threshold = + command -> TC_code; + break; + + case SET_SU_3_PLASMA_1M_THRESHOLD: + + new_threshold.sensor_unit = SU_3; + new_threshold.channel = PLASMA_1_MINUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_3.plasma_1_minus_threshold = + command -> TC_code; + break; + + case SET_SU_4_PLASMA_1M_THRESHOLD: + + new_threshold.sensor_unit = SU_4; + new_threshold.channel = PLASMA_1_MINUS; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_4.plasma_1_minus_threshold = + command -> TC_code; + break; + + case SET_SU_1_PIEZO_THRESHOLD: + + new_threshold.sensor_unit = SU_1; + new_threshold.channel = PZT_1_2; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_1.piezo_threshold = command -> TC_code; + break; + + case SET_SU_2_PIEZO_THRESHOLD: + + new_threshold.sensor_unit = SU_2; + new_threshold.channel = PZT_1_2; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_2.piezo_threshold = command -> TC_code; + break; + + case SET_SU_3_PIEZO_THRESHOLD: + + new_threshold.sensor_unit = SU_3; + new_threshold.channel = PZT_1_2; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_3.piezo_threshold = command -> TC_code; + break; + + case SET_SU_4_PIEZO_THRESHOLD: + + new_threshold.sensor_unit = SU_4; + new_threshold.channel = PZT_1_2; + new_threshold.level = command -> TC_code; + SetTriggerLevel( &new_threshold ); + + telemetry_data.sensor_unit_4.piezo_threshold = command -> TC_code; + break; + + default: + /* Telecommands that will not be implemented in the Prototype SW */ + break; + } +} + + +void ExecuteCommand( telecommand_t EXTERNAL *command ) +/* Purpose : Executes telecommand */ +/* Interface : inputs - Parameter "command" containing received */ +/* telecommand */ +/* outputs - TC_state */ +/* address_MSB */ +/* memory_type */ +/* subroutines - UpdateTarget */ +/* StartAcquisition */ +/* StopAcquisition */ +/* SoftReset */ +/* Set_TC_Error */ +/* Switch_SU_State */ +/* Reboot */ +/* SetMode */ +/* UpdateTarget */ +/* Preconditions : The parameter "command" contains a valid telecommand */ +/* TC_state is TC_handling */ +/* Postconditions : Telecommand is executed */ +/* TC_state updated when appropriate (depend on "command") */ +/* HW registers modified when appropriate (depend on */ +/* "command") */ +/* Global variables modified when appropriate (depend on */ +/* "command") */ +/* Algorithm : - switch "command" */ +/* - case Send Sciece Data File : set TC_state to SC_TM */ +/* - case Send Status Register : set TC_state to */ +/* RegisterTM */ +/* - case Read Data Memory MSB : memorize the address */ +/* MSB given in the TC_code and set TC_state to */ +/* read_memory */ +/* - case Write Code Memory MSB : memorize the address */ +/* MSB given in the TC_code, memorize code */ +/* destination selection and set TC_state to */ +/* write_memory */ +/* - case Write Data Memory MSB : memorize the address */ +/* MSB given in the TC_code, memorize data */ +/* destination selection and set TC_state to */ +/* write_memory */ +/* - case Read/Write Memory LSB : ignore telecommand */ +/* - case Soft Reset : call SoftReset */ +/* - case Start Acquisition : call StartAcquisition */ +/* - case Stop Acquisition : call StopAcquisition */ +/* - default : call UpdateTarget */ + +{ + sensor_unit_t EXTERNAL SU_setting; + unsigned char error_flag; + sensor_number_t i; + + switch ( command -> TC_address ) { + case SEND_SCIENCE_DATA_FILE: + break; + + case SEND_STATUS_REGISTER: + break; + + case READ_DATA_MEMORY_MSB: + address_MSB = command -> TC_code; + TC_state = read_memory_e; + break; + + case WRITE_CODE_MEMORY_MSB: + if ( GetMode() == STAND_BY ) { + address_MSB = command -> TC_code; + memory_type = code_e; + TC_timeout = WRITE_MEMORY_TIMEOUT; + write_checksum = + ( ( command -> TC_word ) >> 8 ) ^ ( command -> TC_code ); + TC_state = write_memory_e; + } + + else + Set_TC_Error(); + + break; + + case WRITE_DATA_MEMORY_MSB: + if ( GetMode() == STAND_BY ) { + address_MSB = command -> TC_code; + memory_type = data_e; + TC_timeout = WRITE_MEMORY_TIMEOUT; + write_checksum = + ( ( command -> TC_word ) >> 8 ) ^ ( command -> TC_code ); + TC_state = write_memory_e; + } + + else + Set_TC_Error(); + + break; + + case READ_DATA_MEMORY_LSB: + break; + + case WRITE_CODE_MEMORY_LSB: + case WRITE_DATA_MEMORY_LSB: + if ( TC_state != write_memory_e ) + Set_TC_Error(); + break; + + case SOFT_RESET: + Reboot( soft_reset_e ); + /* Software is rebooted, no return to this point. */ + + break; + + case START_ACQUISITION: + error_flag = 0; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = SU_1; i <= SU_4; i++ ) { + if ( ( ReadSensorUnit( i ) == start_switching_e ) || + ( ReadSensorUnit( i ) == switching_e ) ) { + /* SU is being switched on. */ + + error_flag = 1; + /* StartAcquisition TC has to be rejected. */ + } + } + + if ( ( GetMode() == STAND_BY ) && ( error_flag == 0 ) ) { + SU_setting.SU_state = acquisition_e; + SU_setting.expected_source_state = on_e; + + SU_setting.SU_number = SU_1; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 1 to Acquisition state. */ + + SU_setting.SU_number = SU_2; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 2 to Acquisition state. */ + + SU_setting.SU_number = SU_3; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 3 to Acquisition state. */ + + SU_setting.SU_number = SU_4; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 4 to Acquisition state. */ + + CLEAR_HIT_TRIGGER_ISR_FLAG; + + ResetDelayCounters(); + /* Resets the SU logic that generates Hit Triggers. */ + /* Brings T2EX to a high level, making a new falling */ + /* edge possible. */ + /* This statement must come after the above "clear", */ + /* because a reversed order could create a deadlock */ + /* situation. */ + + SetMode( ACQUISITION ); + } + + else + Set_TC_Error(); + break; + + case STOP_ACQUISITION: + if ( GetMode() == ACQUISITION ) { + SU_setting.SU_state = on_e; + SU_setting.expected_source_state = acquisition_e; + + SU_setting.SU_number = SU_1; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 1 to On state. */ + + SU_setting.SU_number = SU_2; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 2 to On state. */ + + SU_setting.SU_number = SU_3; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 3 to On state. */ + + SU_setting.SU_number = SU_4; + Switch_SU_State ( &SU_setting ); + /* Try to switch SU 4 to On state. */ + + SetMode( STAND_BY ); + } + + else + Set_TC_Error(); + break; + + default: + UpdateTarget( command ); + } +} + + +static EXTERNAL incoming_mail_t TC_mail; +/* Holds parameters for the mail waiting function. */ +/* Must be in xdata memory because parameter of subrounite is pointer */ +/* to xdata area. */ + +static EXTERNAL telecommand_t received_command; +/* Telecommand read form the mailbox is stored to TC_word component. */ +/* Must be in external memory because parameters of subroutines (pointers */ +/* to xdata area). */ + + +void _Pragma( "entrypoint" ) InitTelecommandTask ( void ) + +/* Purpose : Initialize the global state of Telecommand Execution */ +/* Interface : inputs - none */ +/* outputs - TC state */ +/* subroutines - DisableInterrupt */ +/* EnableInterrupt */ +/* Preconditions : none */ +/* Postconditions : TelecommandExecutionTask is operational. */ +/* Algorithm : - initialize task variables. */ + +{ + InitTC_LookUp(); + + TC_state = TC_handling_e; + + TC_mail.mailbox_number = TCTM_MAILBOX; + TC_mail.message = &( received_command.TC_word ); + /* Parameters for mail waiting function. */ + /* Time-out set separately. */ + + previous_TC.TC_word = 0; + previous_TC.TC_address = UNUSED_TC_ADDRESS; + previous_TC.TC_code = 0; + + DisableInterrupt( TM_ISR_SOURCE ); + EnableInterrupt( TC_ISR_SOURCE ); +} + + +void _Pragma( "entrypoint" ) HandleTelecommand ( void ) + +/* Purpose : Waits for and handles one Telecommand from the TC ISR */ +/* Interface : inputs - Telecommand Execution task mailbox */ +/* TC state */ +/* outputs - TC state */ +/* subroutines - ReadMemory */ +/* WriteMemory */ +/* ExecuteCommand */ +/* Preconditions : none */ +/* Postconditions : one message removed from the TC mailbox */ +/* Algorithm : - wait for mail to Telecommand Execution task mailbox */ +/* - if mail is "TM_READY" and TC state is either */ +/* "SC_TM_e" or "memory_dump_e". */ +/* - if TC state is "SC_TM_e" */ +/* - call ClearEvents function */ +/* - set TC state to TC handling */ +/* - else switch TC state */ +/* - case ReadMemory_e : Check received TC's address */ +/* - case WriteMemory_e : call WriteMemory function */ +/* - case MemoryPatch_e : call MemoryPatch function */ +/* - case TC_Handling : call ExecuteCommand */ +/* NOTE: case register_TM_e is left out because */ +/* operation of SEND_STATUS_REGISTER TC does not */ +/* require any functionalites of this task. */ + +{ + TC_mail.timeout = TC_timeout; + + WaitMail( &TC_mail ); + + TC_timeout = 0; + /* Default value */ + + if ( TC_mail.execution_result == TIMEOUT_OCCURRED ) { + previous_TC.TC_word = 0; + previous_TC.TC_address = UNUSED_TC_ADDRESS; + previous_TC.TC_code = 0; + /* Forget previous telecommand. */ + + if ( TC_state != TC_handling_e ) { + /* Memory R/W time-out. */ + Set_TC_Error(); + } + + TC_state = TC_handling_e; + } + + else + if ( TC_mail.execution_result == MSG_RECEIVED ) { + received_command.TC_address = TC_ADDRESS ( received_command.TC_word ); + received_command.TC_code = TC_CODE ( received_command.TC_word ); + + if ( ( ( TC_state == SC_TM_e ) || ( TC_state == memory_dump_e ) ) && + ( received_command.TC_word == TM_READY ) ) + + /* Note that in order to this condition to be sufficient, only */ + /* TM interrupt service should be allowed to send mail to this */ + /* task in the TC states mentioned. */ + + { + DisableInterrupt( TM_ISR_SOURCE ); + + if ( TC_state == SC_TM_e ) + ClearEvents(); + + TC_state = TC_handling_e; + } else { + switch ( TC_state ) { + + case read_memory_e: + + if ( received_command.TC_address != READ_DATA_MEMORY_LSB ) { + Set_TC_Error(); + TC_state = TC_handling_e; + } + + break; + + case write_memory_e: + WriteMemory ( &received_command ); + break; + + case memory_patch_e: + MemoryPatch ( &received_command ); + break; + + case TC_handling_e: + ExecuteCommand ( &received_command ); + break; + + } + + } + + STRUCT_ASSIGN ( previous_TC, received_command, telecommand_t ); + } + + else { + /* Nothing is done if WaitMail returns an error message. */ + } +} + + +void TelecommandExecutionTask( void ) TASK( TC_TM_INTERFACE_TASK ) +PRIORITY( TC_TM_INTERFACE_PR ) +/* Purpose : Implements the highest level of Telecommand Execution */ +/* task */ +/* Interface : inputs - Telecommand Execution task mailbox */ +/* TC state */ +/* outputs - TC state */ +/* subroutines - InitTelecommandTask */ +/* HandleTeleommand */ +/* Preconditions : none */ +/* Postconditions : This function does not return. */ +/* Algorithm : - InitTelecommandTask */ +/* - loop forever: */ +/* - HandleTelecommand */ + +{ + InitTelecommandTask (); + + _Pragma( "loopbound min 0 max 0" ) + while ( 1 ) + HandleTelecommand (); +} + + +void Set_TC_Error( void ) +/* Purpose : This function will be called always when TC_ERROR bit in */ +/* the ErrorStatus register is set. */ +/* Interface : inputs - Error_status register */ +/* outputs - Error_status register */ +/* subroutines - none */ +/* Preconditions : none */ +/* Postconditions : none */ +/* Algorithm : - Disable interrupts */ +/* - Write to Error Status register */ +/* - Enable interrupts */ +{ + DISABLE_INTERRUPT_MASTER; + + telemetry_data.error_status |= TC_ERROR; + + ENABLE_INTERRUPT_MASTER; +} + +/*Assign pointers to tasks*/ +void ( * EXTERNAL TC_task )( void ) = TelecommandExecutionTask; diff --git a/targets/wasm-tacle/parallel/DEBIE/code/tc_hand.h b/targets/wasm-tacle/parallel/DEBIE/code/tc_hand.h new file mode 100644 index 0000000..cb06d5a --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/tc_hand.h @@ -0,0 +1,176 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : tc_hand.h + + Prototypes etc. for the Telecommand Handler module, TC_Hand. + + Based on the SSF file tc_hand.h, rev 1.11, Mon Mar 22 11:39:54 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TC_HAND_H +#define TC_HAND_H + +#include "keyword.h" +#include "kernobj.h" + +/* Valid telecommand address codes: */ +/* NOTE that all codes are not yet defined, because */ +/* all telecommands are not implemented in the */ +/* Prototype SW. */ + +#define UNUSED_TC_ADDRESS 0x00 + +#define START_ACQUISITION 0x01 +#define STOP_ACQUISITION 0x02 + +#define ERROR_STATUS_CLEAR 0x03 + +#define SEND_STATUS_REGISTER 0x05 +#define SEND_SCIENCE_DATA_FILE 0x06 + +#define SET_TIME_BYTE_0 0x0C +#define SET_TIME_BYTE_1 0x0D +#define SET_TIME_BYTE_2 0x0E +#define SET_TIME_BYTE_3 0x0F + +#define SOFT_RESET 0x09 + +#define CLEAR_WATCHDOG_FAILURES 0x0A +#define CLEAR_CHECKSUM_FAILURES 0x0B + +#define WRITE_CODE_MEMORY_MSB 0x10 +#define WRITE_CODE_MEMORY_LSB 0x6F +#define WRITE_DATA_MEMORY_MSB 0x15 +#define WRITE_DATA_MEMORY_LSB 0x6A +#define READ_DATA_MEMORY_MSB 0x1F +#define READ_DATA_MEMORY_LSB 0x60 + +#define SWITCH_SU_1 0x20 +#define SWITCH_SU_2 0x30 +#define SWITCH_SU_3 0x40 +#define SWITCH_SU_4 0x50 + +#define SET_SU_1_PLASMA_1P_THRESHOLD 0x21 +#define SET_SU_2_PLASMA_1P_THRESHOLD 0x31 +#define SET_SU_3_PLASMA_1P_THRESHOLD 0x41 +#define SET_SU_4_PLASMA_1P_THRESHOLD 0x51 + +#define SET_SU_1_PLASMA_1M_THRESHOLD 0x22 +#define SET_SU_2_PLASMA_1M_THRESHOLD 0x32 +#define SET_SU_3_PLASMA_1M_THRESHOLD 0x42 +#define SET_SU_4_PLASMA_1M_THRESHOLD 0x52 + +#define SET_SU_1_PIEZO_THRESHOLD 0x23 +#define SET_SU_2_PIEZO_THRESHOLD 0x33 +#define SET_SU_3_PIEZO_THRESHOLD 0x43 +#define SET_SU_4_PIEZO_THRESHOLD 0x53 + +#define SET_SU_1_PLASMA_1P_CLASS_LEVEL 0x24 +#define SET_SU_2_PLASMA_1P_CLASS_LEVEL 0x34 +#define SET_SU_3_PLASMA_1P_CLASS_LEVEL 0x44 +#define SET_SU_4_PLASMA_1P_CLASS_LEVEL 0x54 + +#define SET_SU_1_PLASMA_1M_CLASS_LEVEL 0x25 +#define SET_SU_2_PLASMA_1M_CLASS_LEVEL 0x35 +#define SET_SU_3_PLASMA_1M_CLASS_LEVEL 0x45 +#define SET_SU_4_PLASMA_1M_CLASS_LEVEL 0x55 + +#define SET_SU_1_PLASMA_2P_CLASS_LEVEL 0x28 +#define SET_SU_2_PLASMA_2P_CLASS_LEVEL 0x38 +#define SET_SU_3_PLASMA_2P_CLASS_LEVEL 0x48 +#define SET_SU_4_PLASMA_2P_CLASS_LEVEL 0x58 + +#define SET_SU_1_PIEZO_1_CLASS_LEVEL 0x26 +#define SET_SU_2_PIEZO_1_CLASS_LEVEL 0x36 +#define SET_SU_3_PIEZO_1_CLASS_LEVEL 0x46 +#define SET_SU_4_PIEZO_1_CLASS_LEVEL 0x56 + +#define SET_SU_1_PIEZO_2_CLASS_LEVEL 0x27 +#define SET_SU_2_PIEZO_2_CLASS_LEVEL 0x37 +#define SET_SU_3_PIEZO_2_CLASS_LEVEL 0x47 +#define SET_SU_4_PIEZO_2_CLASS_LEVEL 0x57 + +#define SET_SU_1_PLASMA_1E_1I_MAX_TIME 0x29 +#define SET_SU_2_PLASMA_1E_1I_MAX_TIME 0x39 +#define SET_SU_3_PLASMA_1E_1I_MAX_TIME 0x49 +#define SET_SU_4_PLASMA_1E_1I_MAX_TIME 0x59 + +#define SET_SU_1_PLASMA_1E_PZT_MIN_TIME 0x2A +#define SET_SU_2_PLASMA_1E_PZT_MIN_TIME 0x3A +#define SET_SU_3_PLASMA_1E_PZT_MIN_TIME 0x4A +#define SET_SU_4_PLASMA_1E_PZT_MIN_TIME 0x5A + +#define SET_SU_1_PLASMA_1E_PZT_MAX_TIME 0x2B +#define SET_SU_2_PLASMA_1E_PZT_MAX_TIME 0x3B +#define SET_SU_3_PLASMA_1E_PZT_MAX_TIME 0x4B +#define SET_SU_4_PLASMA_1E_PZT_MAX_TIME 0x5B + +#define SET_SU_1_PLASMA_1I_PZT_MIN_TIME 0x2C +#define SET_SU_2_PLASMA_1I_PZT_MIN_TIME 0x3C +#define SET_SU_3_PLASMA_1I_PZT_MIN_TIME 0x4C +#define SET_SU_4_PLASMA_1I_PZT_MIN_TIME 0x5C + +#define SET_SU_1_PLASMA_1I_PZT_MAX_TIME 0x2D +#define SET_SU_2_PLASMA_1I_PZT_MAX_TIME 0x3D +#define SET_SU_3_PLASMA_1I_PZT_MAX_TIME 0x4D +#define SET_SU_4_PLASMA_1I_PZT_MAX_TIME 0x5D + +#define SET_COEFFICIENT_1 0x70 +#define SET_COEFFICIENT_2 0x71 +#define SET_COEFFICIENT_3 0x72 +#define SET_COEFFICIENT_4 0x73 +#define SET_COEFFICIENT_5 0x74 + +/* TC codes for SWITCH_SU_x: */ + +#define ON_VALUE 0x55 +#define OFF_VALUE 0x73 +#define SELF_TEST 0x99 + +/* Last TC code for SEND_STATUS_REGISTER: */ + +#define LAST_EVEN 0x74 + +/* State of Telecommand Execution task */ + +typedef enum { + TC_handling_e, + read_memory_e, + memory_dump_e, + write_memory_e, + memory_patch_e, + register_TM_e, + SC_TM_e +} TC_state_t; + +extern EXTERNAL TC_state_t TC_state; + +/*pointer to a task*/ +extern void ( * EXTERNAL TC_task )( void ); + +/* Functions prototype */ +extern void Set_TC_Error( void ); + +/* Task functions, for testing: */ + +extern void TC_InterruptService ( void ) +INTERRUPT( TC_ISR_SOURCE ) USED_REG_BANK( 2 ); +extern void InitTelecommandTask ( void ); +extern void HandleTelecommand ( void ); + +#endif + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/telem.c b/targets/wasm-tacle/parallel/DEBIE/code/telem.c new file mode 100644 index 0000000..623ab53 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/telem.c @@ -0,0 +1,504 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : telem.c + + Telemetry module. + + Based on the SSF file telem.c, rev 1.28, Wed Oct 13 19:49:34 1999. + + - * -------------------------------------------------------------------------- +*/ + +#include "keyword.h" +#include "kernobj.h" +#include "tm_data.h" +#include "msg_ctrl.h" +#include "tc_hand.h" +#include "telem.h" +#include "ttc_ctrl.h" +#include "su_ctrl.h" +#include "dpu_ctrl.h" +#include "isr_ctrl.h" +#include "taskctrl.h" +#include "health.h" + +EXTERNAL telemetry_data_t telemetry_data; + +EXTERNAL science_data_file_t LOCATION( SCIENCE_DATA_START_ADDRESS ) +science_data; + +uint_least16_t EXTERNAL max_events; +/* This variable is used to speed up certain */ +/* Functional Test by adding the possibility */ +/* to restrict the amount of events. */ +/* It is initialised to value MAX_EVENTS at */ +/* Boot. */ + +unsigned char EXTERNAL *telemetry_pointer; + +unsigned char EXTERNAL *telemetry_end_pointer; + +unsigned char EXTERNAL read_memory_checksum; +/* Checksum to be sent at the end of Read Memory sequence. */ + +event_record_t EXTERNAL event_queue[ MAX_QUEUE_LENGTH ]; +/* Holds event records before they are copied to the */ +/* Science Data memory. Normally there is only data */ +/* from the new event whose data is beign collected, */ +/* but during Science Telemetry there can be stored */ +/* several older events which are copied to the */ +/* Science Data memory after telemetry ends. */ + +uint_least8_t EXTERNAL event_queue_length; +/* Number of event records stored in the queue. */ +/* These records are stored into event_queue table */ +/* in order starting from the first element. */ +/* Initialised to zero on power-up. */ + +uint_least16_t EXTERNAL free_slot_index; +/* Index to the first free record in the Science */ +/* Data memory, or if it is full equals to 'max_events'. */ +/* Initialised to zero on power-up. */ + + +event_record_t EXTERNAL *GetFreeRecord( void ) + +/* Purpose : Returns pointer to free event record in event queue. */ +/* Interface : inputs - event_queue_length, legnth of the event */ +/* queue. */ +/* outputs - return value, pointer to the free record. */ +/* subroutines - none */ +/* Preconditions : none. */ +/* Postconditions : none. */ +/* Algorithm : -If the queue is not full */ +/* -return pointer to the next free record */ +/* -else */ +/* -return pointer to the last record */ + +{ + if ( event_queue_length < MAX_QUEUE_LENGTH ) + return &( event_queue[ event_queue_length ] ); + + else + return &( event_queue[ MAX_QUEUE_LENGTH - 1 ] ); +} + + +void TM_InterruptService ( void ) INTERRUPT( TM_ISR_SOURCE ) USED_REG_BANK( 2 ) +/* Purpose : This function handles the TM interrupts. */ +/* Interface : inputs - telemetry_pointer */ +/* telemetry_end_pointer */ +/* TC_state */ +/* telemetry_data */ +/* outputs - telemetry_pointer */ +/* TM HW reigsiters */ +/* Telemcommand Execution task mailbox */ +/* Preconditions : telemetry_pointer and telemetry_end_pointer have valid */ +/* values (TM interrupts should be enabled only when this */ +/* condition is true) */ +/* Postconditions : Next two bytes are written to TM HW registers and if they*/ +/* were the last bytes to be written, a "TM_READY" mail is */ +/* sent to the Telecommand Execution task */ +/* Algorithm : - if telemetry_pointer < telemetry_end_pointer */ +/* - write next two bytes from location pointed by */ +/* telemetry_pointer and increase it by two */ +/* - else if TC_state == register_TM_e */ +/* - write first two TM data registers and set */ +/* telemetry_pointer to point to the third TM data */ +/* register */ +/* - else */ +/* - send TM_READY message to Telecommand Execution task */ +/* mailbox */ + +{ + unsigned char EXTERNAL tm_byte; + + CLEAR_TM_INTERRUPT_FLAG; + /*The interrupt flag is put down by setting high bit 3 'INT1' in port 3. */ + + if ( telemetry_pointer == ( unsigned char * ) &telemetry_data.time ) + COPY ( telemetry_data.time, internal_time ); + + if ( telemetry_pointer < telemetry_end_pointer ) { + /* There are bytes left to be sent to TM. */ + + tm_byte = *telemetry_pointer; + WRITE_TM_MSB ( tm_byte ); + read_memory_checksum ^= tm_byte; + + telemetry_pointer++; + + tm_byte = *telemetry_pointer; + WRITE_TM_LSB ( tm_byte ); + read_memory_checksum ^= tm_byte; + + telemetry_pointer++; + } else + if ( TC_state == register_TM_e ) + /* Start to send TM data registers starting from the first ones */ + { + telemetry_pointer = ( EXTERNAL unsigned char * )&telemetry_data; + WRITE_TM_MSB ( *telemetry_pointer ); + telemetry_pointer++; + WRITE_TM_LSB ( *telemetry_pointer ); + telemetry_pointer++; + } else + if ( TC_state == memory_dump_e ) { + WRITE_TM_MSB( 0 ); + WRITE_TM_LSB( read_memory_checksum ); + /* Last two bytes of Read Memory sequence. */ + + Send_ISR_Mail( TCTM_MAILBOX, TM_READY ); + } else + /* It is time to stop sending telemetry */ + Send_ISR_Mail ( TCTM_MAILBOX, TM_READY ); +} + + +dpu_time_t GetElapsedTime( unsigned int event_number ) +/* Purpose : Returns the hit time of a given event. */ +/* Interface : inputs - event_number (parameter) */ +/* science_data[ event_number ].hit_time, hit */ +/* time of the given event record. */ +/* outputs - return value, hit time. */ +/* subroutines - none */ +/* Preconditions : none. */ +/* Postconditions : none. */ +/* Algorithm : -copy hit time of an event to a local variable hit */ +/* time */ +/* -return the value of hit time */ +{ + dpu_time_t INDIRECT_INTERNAL hit_time; + /* Hit time. */ + + COPY ( hit_time, science_data.event[ event_number ].hit_time ); + + return hit_time; +} + + + +unsigned int FindMinQualityRecord( void ) + +/* Purpose : Finds event with lowest quality from Science Data memory.*/ +/* Interface : inputs - science_data.event, event records */ +/* outputs - return value, index of event record with */ +/* the lowest quality. */ +/* subroutines - GetElapsedTime */ +/* Preconditions : none. */ +/* Postconditions : none. */ +/* Algorithm : -Select first the first event record. */ +/* -Loop from the second record to the last: */ +/* -if the quality of the record is lower than the */ +/* quality of the selected one, select the record. */ +/* -else if the quality of the record equals the quality */ +/* of selected one and it is older than the selected */ +/* one, select the record. */ +/* -End loop. */ +/* -return the index of the selected record. */ + +{ + unsigned int INDIRECT_INTERNAL min_quality_number; + /* The quality number of an event which has the lowest quality */ + /* number in the science data. */ + + unsigned int INDIRECT_INTERNAL min_quality_location; + /* The location of an event which has the lowest quality number */ + /* in the science data. */ + + dpu_time_t DIRECT_INTERNAL min_time; + /* Elapsed time of the oldest event. */ + + dpu_time_t DIRECT_INTERNAL time; + /* Elapsed time as previously mentioned. */ + + uint_least16_t DIRECT_INTERNAL i; + /* Loop variable. */ + + + min_time = GetElapsedTime( 0 ); + min_quality_number = science_data.event[ 0 ].quality_number; + min_quality_location = 0; + /* First event is selected and compared against */ + /* the following events in the science_data. */ + + _Pragma( "loopbound min 1260 max 1260" ) + for ( i = 1; i < max_events; i++ ) { + time = GetElapsedTime( i ); + + if ( science_data.event[ i ].quality_number < min_quality_number ) { + min_time = time; + min_quality_number = science_data.event[ i ].quality_number; + min_quality_location = i; + /* If an event in the science_data has a lower quality number than */ + /* any of the previous events, its quality_number and location is */ + /* stored into variables. */ + } + + else + if ( ( science_data.event[ i ].quality_number == min_quality_number ) + && ( time < min_time ) ) { + min_time = time; + min_quality_location = i; + /* If an event in the science_data has an equal quality number with */ + /* any of the previous events and it's older, event's */ + /* quality_number and location are stored into variables. */ + } + } + + return min_quality_location; +} + + +void IncrementCounters( + sensor_index_t sensor_unit, + unsigned char classification ) + +/* Purpose : Increments given event counters. */ +/* Interface : inputs - sensor_unit (parameter) */ +/* classification (parameter) */ +/* outputs - telemetry_data.SU_hits, counter of hits of */ +/* given Sensor Unit */ +/* science_data.event_counter, counter of */ +/* events with given classification and SU. */ +/* subroutines - none */ +/* Preconditions : none. */ +/* Postconditions : Given counters are incremented, if they had not their */ +/* maximum values. */ +/* Algorithm : Increment given counters, if they are less than their */ +/* maximum values. Calculate checksum for event counter. */ +/* */ +/* This function is used by Acquisition and TelecommandExecutionTask. */ +/* However, it does not have to be of re-entrant type because collision */ +/* is avoided through design, as follows. */ +/* If Science Telemetry is in progress when Acquisition task is handling */ +/* an event, the event record cannot be written to the Science Data */ +/* memory. Instead it is left to the temporary queue which will be */ +/* copied to the Science Data memory after the Science telemetry is */ +/* completed. For the same reason call for IncrementCounters is */ +/* disabled. */ +/* On the other hand, when Acquisition task is handling an event with */ +/* RecordEvent all interrupts are disabled i.e. TelecommandExecutionTask */ +/* cannot use IncrementCounters simultaniously. */ + + + +{ + unsigned char EXTERNAL counter; + unsigned char EXTERNAL new_checksum; + + + if ( telemetry_data.SU_hits[ sensor_unit ] < 0xFFFF ) { + telemetry_data.SU_hits[ sensor_unit ]++; + /* SU hit counter is incremented. */ + } + + if ( science_data.event_counter[ sensor_unit ][ classification ] < 0xFF ) { + + counter = science_data.event_counter[ sensor_unit ][ classification ]; + + new_checksum = + science_data.counter_checksum ^ counter; + /* Delete effect of old counter value from the checksum. */ + + counter++; + + new_checksum ^= counter; + /* Add effect of new counter value to the checksum. */ + + science_data.event_counter[ sensor_unit ][ classification ] = counter; + /* The event counter is incremented. */ + + science_data.counter_checksum = new_checksum; + /* Event counter checksum is updated. */ + } + +} + + +/*****************************************************************************/ +/* tm_data.h */ +/*****************************************************************************/ + +void RecordEvent( void ) +/* Purpose : This function increments proper event counter and stores */ +/* the new event record to the science data memory. */ +/* Interface : inputs - free_slot_index, index of next free event */ +/* record in the Science Data memory. */ +/* TC_state, state of the TC Execution task. */ +/* event_queue_length, length of the event */ +/* record queue. */ +/* event_queue, event record queue. */ +/* outputs - event_queue_length, as above. */ +/* science_data.event, event records in */ +/* Science Data memory. */ +/* free_slot_index, as above. */ +/* subroutines - FindMinQualityRecord */ +/* IncrementCounters */ +/* Preconditions : none. */ +/* Postconditions : If Science telemetry is not in progress, event data is */ +/* stored in its proper place in the science data, */ +/* otherwise event data is left in the queue and one record */ +/* is reserved from the queue unless it is already full. */ +/* Algorithm : If there is room in the Science Data memory, the event */ +/* data is tried to be stored there, otherwise the event */ +/* with the lowest quality is searched and tried to be */ +/* replaced. If the Science telemetry is in progress the */ +/* event data is left in the queue and the length of the */ +/* queue is incremented unless the queue is already full. */ +/* If the Science telemetry is not in progress the event */ +/* data is copied to the Science Data to the location */ +/* defined earlier as described above. */ + +{ + uint_least16_t INDIRECT_INTERNAL record_index; + + DISABLE_INTERRUPT_MASTER; + + record_index = free_slot_index; + + if ( record_index >= max_events && TC_state != SC_TM_e ) { + /* Science Data memory was full and Science TM was not in progress */ + + ENABLE_INTERRUPT_MASTER; + record_index = FindMinQualityRecord(); + DISABLE_INTERRUPT_MASTER; + } + + if ( TC_state == SC_TM_e ) { + /* Science Telemetry is in progress, so the event record */ + /* cannot be written to the Science Data memory. Instead */ + /* it is left to the temporary queue which will be */ + /* copied to the Science Data memory after the Science */ + /* telemetry is completed. */ + + if ( event_queue_length < MAX_QUEUE_LENGTH ) { + /* There is still room in the queue. */ + + event_queue_length++; + /* Prevent the event data from being overwritten. */ + } + ENABLE_INTERRUPT_MASTER; + } + + else { + if ( free_slot_index < max_events ) { + /* Science Data memory was not full */ + + record_index = free_slot_index; + science_data.event[ record_index ].quality_number = 0; + free_slot_index++; + } + + + /* Increment event counters. */ + IncrementCounters( + event_queue[ 0 ].SU_number - 1, + event_queue[ 0 ].classification ); + + ENABLE_INTERRUPT_MASTER; + + if ( event_queue[ 0 ].quality_number >= + science_data.event[ record_index ].quality_number ) + + { + STRUCT_ASSIGN ( + science_data.event[ record_index ], + event_queue[ 0 ], + event_record_t ); + + /* In this state the event data is located always to */ + /* the first element of the queue. */ + } + } +} + + +void ClearEvents( void ) +/* Cleares the event counters and the quality numbers of */ +/* the event records in the science data memory */ + +{ + DIRECT_INTERNAL uint_least8_t i; + /* This variable is used in the for-loop which goes through */ + /* the science data event counter. */ + + DIRECT_INTERNAL uint_least8_t j; + /* This variable is used in the for-loop which goes through */ + /* the science data event counter. */ + + /* Interrupts does not need to be disabled as long as */ + /* Telecommand Execution task has higher priority than */ + /* Acquisition task. */ + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < NUM_SU; i++ ) { + telemetry_data.SU_hits[ i ] = 0; + + _Pragma( "loopbound min 10 max 10" ) + for ( j = 0; j < NUM_CLASSES; j++ ) + science_data.event_counter[ i ][ j ] = 0; + /*event counters are cleared in science_data */ + } + + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < event_queue_length; i++ ) { + /* Events from the event queue are copied to the Science */ + /* Data memory. */ + + STRUCT_ASSIGN ( + science_data.event[ i ], + event_queue[ i ], + event_record_t ); + + IncrementCounters( + event_queue[ i ].SU_number - 1, + event_queue[ i ].classification ); + + /* One more event is stored in the Science Data memory. */ + /* NOTE that the event queue should always be smaller */ + /* than the space reserved for event records in the */ + /* Science Data memory. */ + } + + free_slot_index = event_queue_length; + + event_queue_length = 0; + /* Empty the event queue. */ + + science_data.counter_checksum = 0; + science_data.not_used = 0; +} + +void ResetEventQueueLength( void ) +/* Purpose : Empty the event queue length. */ +/* Interface : inputs - none */ +/* outputs - none */ +/* subroutines - none */ +/* Preconditions : none. */ +/* Postconditions : none. */ +/* Algorithm : - reset event queue length. */ +{ + event_queue_length = 0; +} + + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/telem.h b/targets/wasm-tacle/parallel/DEBIE/code/telem.h new file mode 100644 index 0000000..bfe05ee --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/telem.h @@ -0,0 +1,62 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : telem.h + + Prototypes etc. for the Telem module. + + Based on the SSF file telem.h, rev 1.11, Wed May 12 13:08:26 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TELEM_H +#define TELEM_H + +#include "keyword.h" +#include "kernobj.h" +#include "tm_data.h" + +/* Special value for TC/TM mail to be used only */ +/* telemetry is ready */ + +#define TM_READY 0xFFFF + +#define MAX_QUEUE_LENGTH 10 +/* Maximum amount of event records in the queue. */ +/* Is expected to be at most 255 (unsigned char). */ + +extern uint_least8_t EXTERNAL event_queue_length; + +extern unsigned char EXTERNAL *telemetry_pointer; +extern unsigned char EXTERNAL *telemetry_end_pointer; +extern unsigned int EXTERNAL free_slot_index; + +extern unsigned char EXTERNAL read_memory_checksum; +/* Checksum to be sent at the end of Read Memory sequence. */ + + +extern event_record_t EXTERNAL *GetFreeRecord( void ); +/* Returns pointer to next free event record from the */ +/* event record queue, or pointer to the last record */ +/* od the queue, if the queue is full. */ + +extern void ResetEventQueueLength( void ); + +/* Task functions, for testing: */ + +extern void TM_InterruptService ( void ) +INTERRUPT( TM_ISR_SOURCE ) USED_REG_BANK( 2 ); + +#endif + diff --git a/targets/wasm-tacle/parallel/DEBIE/code/tm_data.h b/targets/wasm-tacle/parallel/DEBIE/code/tm_data.h new file mode 100644 index 0000000..251eb69 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/tm_data.h @@ -0,0 +1,199 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : tm_data.h + + The Telemetry Data Structure. + + Based on the SSF file tm_data.h, rev 1.22, Mon May 31 10:10:12 1999. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef TM_DATA_H +#define TM_DATA_H + +#include "keyword.h" + +#include "dpu_ctrl.h" +#include "su_ctrl.h" + +#include "target_tm_data.h" + +#define NUM_CLASSES 10 +#define NUM_TEMP 2 +#define NUM_NOT_USED (4 + 0x70 - 0x6A) + +#define DPU_SELF_TEST 0 +#define STAND_BY 1 +#define ACQUISITION 2 + +#define MODE_BITS_MASK 3 + +/* Definitions related to error indicating bits in mode status register: */ +#define SUPPLY_ERROR 0x80 +#define DATA_MEMORY_ERROR 0x40 +#define PROGRAM_MEMORY_ERROR 0x20 +#define MEMORY_WRITE_ERROR 0x10 +#define ADC_ERROR 0x04 + + +/* Definitions related to error indicating bits in SU status register: */ +#define HV_SUPPLY_ERROR 0x80 +#define LV_SUPPLY_ERROR 0x40 +#define TEMPERATURE_ERROR 0x20 +#define SELF_TEST_ERROR 0x10 +#define HV_LIMIT_ERROR 0x08 +#define LV_LIMIT_ERROR 0x04 +#define SUPPLY_VOLTAGE_MASK 0x03 + +/* Used when error indiacting bits are cleared. */ + + + +/* Definitions related to error indicating bits in error status register: */ +#define CHECKSUM_ERROR 0x08 +#define WATCHDOG_ERROR 0x04 +#define OVERALL_SU_ERROR 0xF0 +/* Used to indicate error in all of the SUs. */ + +#define ERROR_STATUS_OFFSET 0x10 +/* Used when SU error indicating bit is selected. */ + + +/* Definitions related to error indicating bits in software error register: */ +#define MEASUREMENT_ERROR 0x01 +#define OS_START_SYSTEM_ERROR 0x02 +#define OS_WAIT_ERROR 0x04 +#define OS_SET_SLICE_ERROR 0x08 + + +#define NUM_QCOEFF 5 +/* Number of Quality Coefficients. */ + +/* Sensor Unit low power and TC settings : */ + +typedef struct { + unsigned char plus_5_voltage; /* byte 1 */ + unsigned char minus_5_voltage; /* byte 2 */ + unsigned char plasma_1_plus_threshold; /* byte 3 */ + unsigned char plasma_1_minus_threshold; /* byte 4 */ + unsigned char piezo_threshold; /* byte 5 */ + unsigned char plasma_1_plus_classification; /* byte 6 */ + unsigned char plasma_1_minus_classification; /* byte 7 */ + unsigned char piezo_1_classification; /* byte 8 */ + unsigned char piezo_2_classification; /* byte 9 */ + unsigned char plasma_2_plus_classification; /* byte 10 */ + unsigned char plasma_1_plus_to_minus_max_time; /* byte 11 */ + unsigned char plasma_1_plus_to_piezo_min_time; /* byte 12 */ + unsigned char plasma_1_plus_to_piezo_max_time; /* byte 13 */ + unsigned char plasma_1_minus_to_piezo_min_time; /* byte 14 */ + unsigned char plasma_1_minus_to_piezo_max_time; /* byte 15 */ +} SU_settings_t; + +/* TM data registers : */ + +typedef struct { + unsigned char error_status; /* reg 0 */ + unsigned char mode_status; /* reg 1 */ + uint16_t TC_word; /* reg 2 - 3 */ + dpu_time_t TC_time_tag; /* reg 4 - 7 */ + unsigned char watchdog_failures; /* reg 8 */ + unsigned char checksum_failures; /* reg 9 */ + unsigned char SW_version; /* reg 10 */ + unsigned char isr_send_message_error; /* reg 11 */ + unsigned char SU_status[NUM_SU]; /* reg 12 - 15 */ + unsigned char SU_temperature[NUM_SU][NUM_TEMP]; /* reg 16 - 23 */ + unsigned char DPU_plus_5_digital; /* reg 24 */ + unsigned char os_send_message_error; /* reg 25 */ + unsigned char os_create_task_error; /* reg 26 */ + unsigned char SU_plus_50; /* reg 27 */ + unsigned char SU_minus_50; /* reg 28 */ + unsigned char os_disable_isr_error; /* reg 29 */ + unsigned char not_used_1; /* reg 30 */ + SU_settings_t sensor_unit_1; /* reg 31 - 45 */ + unsigned char os_wait_error; /* reg 46 */ + SU_settings_t sensor_unit_2; /* reg 47 - 61 */ + unsigned char os_attach_interrupt_error; /* reg 62 */ + SU_settings_t sensor_unit_3; /* reg 63 - 77 */ + unsigned char os_enable_isr_error; /* reg 78 */ + SU_settings_t sensor_unit_4; /* reg 79 - 93 */ + code_address_t failed_code_address; /* reg 94 - 95 */ + data_address_t failed_data_address; /* reg 96 - 97 */ + uint16_t SU_hits[NUM_SU]; /* reg 98 - 105 */ + tm_dpu_time_t time; /* reg 106 - 109 */ + unsigned char software_error; /* reg 110 */ + unsigned char hit_budget_exceedings; /* reg 111 */ + unsigned char coefficient[NUM_QCOEFF]; /* reg 112 - 116 */ + unsigned char not_used; /* reg 117 */ + + /* The last register of telemetry data should be 'not_used'. */ + /* This is necessary for correct operation of telemetry */ + /* retrieving TCs i.e. number of bytes should be even. */ + +} telemetry_data_t; + +extern EXTERNAL telemetry_data_t telemetry_data; + +/* Hit trigger event record : */ + +typedef struct { + unsigned char quality_number; /* byte 0 */ + unsigned char classification; /* byte 1 */ + unsigned char SU_number; /* byte 2 */ + tm_dpu_time_t hit_time; /* byte 3 - 6 */ + unsigned char SU_temperature_1; /* byte 7 */ + unsigned char SU_temperature_2; /* byte 8 */ + tm_ushort_t plasma_1_plus; /* byte 9 - 10 */ + tm_ushort_t plasma_1_minus; /* byte 11 - 12 */ + tm_ushort_t piezo_1; /* byte 13 - 14 */ + tm_ushort_t piezo_2; /* byte 15 - 16 */ + tm_ushort_t plasma_2_plus; /* byte 17 - 18 */ + unsigned char rise_time; /* byte 19 */ + signed char delay_1; /* byte 20 */ + tm_ushort_t delay_2; /* byte 21 - 22 */ + tm_ushort_t delay_3; /* byte 23 - 24 */ + unsigned char checksum; /* byte 25 */ +} event_record_t; + +/* Science Data File : */ + +typedef struct { + unsigned short int length; + unsigned char event_counter[NUM_SU][NUM_CLASSES]; + unsigned char not_used; + unsigned char counter_checksum; + event_record_t event[MAX_EVENTS]; +} science_data_file_t; + +extern EXTERNAL science_data_file_t +LOCATION( SCIENCE_DATA_START_ADDRESS ) science_data; + +extern uint_least16_t EXTERNAL max_events; +/* This variable is used to speed up certain */ +/* Functional Test by adding the possibility */ +/* to restrict the amount of events. */ +/* It is initialised to value MAX_EVENTS at */ +/* Boot. */ + +extern void RecordEvent( void ); +/* This function increments proper event counter and stores */ +/* the new event record to the science data memory, if there */ +/* is free place or events with lower or equal quality number */ + + +extern void ClearEvents( void ); +/* Cleares the event counters and the quality numbers of */ +/* the event records in the science data memory */ + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/ttc_ctrl.h b/targets/wasm-tacle/parallel/DEBIE/code/ttc_ctrl.h new file mode 100644 index 0000000..1d45181 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/ttc_ctrl.h @@ -0,0 +1,39 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Module : ttc_ctrl.h + + Macros and function prototypes for handling the Telecommand + and Telemetry interface. + + Based on the SSF DHI file ttc_ctrl.h, rev 1.11, Sun May 16 09:20:10 1999. + + - * -------------------------------------------------------------------------- +*/ + + +#ifndef TTC_CTRL_H +#define TTC_CTRL_H + +#include "target_ttc_ctrl.h" + +/* TM interrupt service handling */ +#define TM_ISR_MASK 0x04 + +/* Error Status register bits concerning TM/TC interface */ + +#define PARITY_ERROR 2 +#define TC_ERROR 1 + +#define TC_OR_PARITY_ERROR (TC_ERROR + PARITY_ERROR) + +#endif diff --git a/targets/wasm-tacle/parallel/DEBIE/code/version.h b/targets/wasm-tacle/parallel/DEBIE/code/version.h new file mode 100644 index 0000000..e1d2a98 --- /dev/null +++ b/targets/wasm-tacle/parallel/DEBIE/code/version.h @@ -0,0 +1,45 @@ +/*------------------------------------------------------------------------------ + + Copyright (C) 1998 : Space Systems Finland Ltd. + + Space Systems Finland Ltd (SSF) allows you to use this version of + the DEBIE-I DPU software for the specific purpose and under the + specific conditions set forth in the Terms Of Use document enclosed + with or attached to this software. In particular, the software + remains the property of SSF and you must not distribute the software + to third parties without written and signed authorization from SSF. + + System Name: DEBIE DPU SW + Subsystem : DAS + Module : version.h + + DEBIE SW version and checksum. + + Based on the SSF file version.h, rev 1.30, Wed Feb 23 12:17:32 2000. + + - * -------------------------------------------------------------------------- +*/ + +#ifndef VERSION_H +#define VERSION_H + +#define SW_VERSION 24 +/* Software version. Unique for each delivered build of the software. */ + +#define CODE_CHECKSUM 0x9F +/* This must be set so that the checksum calculated from the code */ +/* memory becomes zero (this value will then be actually equal to */ +/* the code checksum when this value would be zero). */ +/* So the procedure is as follows: */ +/* 1. Update source code file(s), including SW_VERSION above. */ +/* 2. Set CODE_CHECKSUM to zero. */ +/* 3. Compile and link DEBIE into a .hex file. */ +/* 4. Compute the XOR of the .hex data (using e.g. 'hexor'). */ +/* 5. Set CODE_CHECKSUM to the value computed in step 3. */ +/* 6. Recompile and relink DEBIE into a new .hex file. */ +/* 7. Verify that XOR of the new .hex file is zero. */ + +#endif + + + diff --git a/targets/wasm-tacle/parallel/DEBIE/orig-docs/design_1_4.pdf b/targets/wasm-tacle/parallel/DEBIE/orig-docs/design_1_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45ba126b08973aeec0df49b2b77d065387ead7cd GIT binary patch literal 1017588 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 saH*dx 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 Q5?g^V@6hL{y|{k8N*`ZQi=l7IN=F3E_?%RC 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/parallel/DEBIE/orig-docs/srd_1_3.pdf b/targets/wasm-tacle/parallel/DEBIE/orig-docs/srd_1_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..077494b1cf9c8b90d6fda6b3a9401c50613c8656 GIT binary patch literal 744453 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%0Dd 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

o94a)RTgK|#%&piGsZet3=h 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

*AtJebU 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
  • g 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�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

    P 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

    KcD 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%0DmJkCY5NkM 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

    b43(R=ep`fBN4<^_u)y7=HRWG@G3%c?sO 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 z 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 +Hugues Cassé + +Authors of the initial project "Paparazzi" +Project website +Pascal Brisset +Antoine Drouin diff --git a/targets/wasm-tacle/parallel/PapaBench/COPYING b/targets/wasm-tacle/parallel/PapaBench/COPYING new file mode 100644 index 0000000..916d1f0 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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. + + + Copyright (C) 19yy + + 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 + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/targets/wasm-tacle/parallel/PapaBench/Loops_Bounds.txt b/targets/wasm-tacle/parallel/PapaBench/Loops_Bounds.txt new file mode 100644 index 0000000..7c7acd1 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/Loops_Bounds.txt @@ -0,0 +1,78 @@ +Fly_By_wire +---------------------------------------------------- +adc_fbw.c +--------- +function adc_init + Loop for : 8 iterations + + +servo.c +------- +function servo_init + Loop for : 10 iterations +function servo_transmit + Loop for : 10 iterations + + +uart.c +------ +function uart_print_string + Loop while used once in the main function, its iterations number is estimated to 100. + +main.c +------ +function to_autopilot_from_last_radio + Loop for : 9 iterations + +----------------------------------------------------------------- +Autopilot +----------------------------------------------------------------- +adc.c +----- +function adc_init + Loop for : 8 iterations + +estimator.c +----------- +function estimator_update_ir_estim + (NORM_RAD_ANGLE) + while 1 while 2 + case 1 0 0 + case 2 0 1 + case 3 1 0 + (NORM_RAD_ANGLE) + while 1 while 2 + case 1 0 0 + case 2 0 1 + case 3 1 0 + +mainloop.c +---------- +function main + the first while Loop has at most 31 iterations + +nav.c +----- + +function nav_home + (Macro NormCourse) + while 1 while 2 + case 1 0 0 + case 2 0 1-2 + case 3 1-2 0 + +function auto_nav + (Macro Goto3D / CircleXY / NormCourse) + while 1 while 2 + case 1 0 0 + case 2 0 1 + case 3 1 0 + +pid.c +----- +function course_pid_run + (macro NORM_RAD_ANGLE) + while 1 while 2 + case 1 0 0 + case 2 0 1 + case 3 1 0 diff --git a/targets/wasm-tacle/parallel/PapaBench/PapaBench_for_wcet.txt b/targets/wasm-tacle/parallel/PapaBench/PapaBench_for_wcet.txt new file mode 100644 index 0000000..0e174c3 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/PapaBench_for_wcet.txt @@ -0,0 +1,68 @@ +PapaBench for the WCET computation +================================== + +The Paparazzi Real-Time Application +----------------------------------- + +PapaBench was extracted from an actual embedded real-time system, called Paparazzi, which drives an UAV (Unmanned Aerial Vehicle). To stay closer to the embedded running environment (for example, to preserve the memory mapping), we have kept the code organization almost unchanged compared to the original project. + +There are two programs, called fbw (for Fly By Wire) and autopilot, each running on its own processor with its own local separated memory space and its own input / output peripherals. The communication between both processors is performed thanks to a Serial Peripheral Interconnect link with no straight effect on the memory space of each other. + +Both programs have the same overall code structure. First, the initialization of the program is performed using classical non-real-time code. Then, the main control loop starts and runs uninterrupted until the shutdown of the system. This loop is in charge of calling tasks according to their time constraints (mainly their execution frequency) and according to some externals events. + +To prove the real-time behaviour of the system, we have to measure the Worst-Case Execution Time of each task and to check that the sum of the different tasks WCETs fits in the control loop period. In the Paparazzi implementation, both applications have a main loop period of about 30 ms. + + + +Papabench: 19 tasks = 19 functions = 19 WCETs +--------------------------------------------- + +As presented in the previous section, PapaBench is built around two programs representing an actual real-time system running on two different processors. Each program implements an infinite control loop that calls the tasks performing the UAV drive. + +Consequently, the running time of the "main" functions of each Papabench program cannot be computed. However, Papabench is still useful for WCET experimentation considering the execution time of the tasks called from the control loop. + +In Papabench, the entry point of a task is a C function which is called from the control loop. In turn, each task function may develop its own program call tree to achieve its work. Usually, WCET analysis is applied on a whole program. With Papabench, WCET analysis must be made on the functions which are the 13 tasks of the application. + +The tables below shows the list of tasks and their matching C function entry point. + + * FBW + +Identifier C Entry Point Function Description +T1 check_failsafe_task Checks if the system must switch to Failsafe mode +T2 check_mega128_values_task Receives MCU0 values +T3 send_data_to_autopilot_task Send information to MCU0 +T4 servo_transmit Transmits the Servos\u2019 commands +T5 test_ppm_task Decodes the Radio-Command orders + + * Autopilot + +Identifier C Entry Point Function Description +T5 altitude_control_task Controls the airframe altitude Control +T6 climb_control_task Controls the airframe Climb +T7 link_fbw_send Sends the flight commands to MCU1 +T8 navigation_task Computes the next position of the airframe +T9 radio_control_task Manages the Radio orders +T10 receive_gps_data_task Decodes the GPS Signals +T11 reporting_task Reports the flight information to the ground station +T12 stabilisation_task Ensure the airframe Stabilization + +In addition, both applications uses several interruption routines listed in the following tables. + + * FBW + +Identifier C Entry Point Function Description +I1 __vector_5 Radio interrupt +I2 __vector_6 Servo interrupt +I3 __vector_10 SPI interrupt + + * Autopilot + +Identifier C Entry Point Function Description +I4 __vector_5 Modem interrupt +I5 __vector_12 SPI interrupt +I6 __vector_17 SPI interrupt +I7 __vector_30 GPS interrupt + +One may also consider calculating the WCET of these routines. + +For more details on the Papabench benchmark, please refer to PapaBench : A Free Real-Time Benchmark. In: 6th Workshop on Worst-Case Execution Time Analysis, Dresden, 04/07/2006. diff --git a/targets/wasm-tacle/parallel/PapaBench/README b/targets/wasm-tacle/parallel/PapaBench/README new file mode 100644 index 0000000..d2f14b9 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/README @@ -0,0 +1,134 @@ +# Paparazzi $Id: README,v 1.1 2011-01-18 12:48:16 moellmer Exp $ +# Copyright (C) 2003 Pascal Brisset Antoine Drouin +# +# This file is part of PapaBench. +# +# PapaBench 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. +# +# You should have received a copy of the GNU General Public License +# along with paparazzi; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +# + +Introduction +------------ + +Paparazzi is an attempt to develop a cheap fixed wing UAV (Unmanned Air Vehicle). It develops a complete system hardware and software that may be installed on a variety of aircrafts. It comprises an embedded system and a ground station. +The Paparazzi distribution is only available for a Linux environment but may be configured for several aircraft configurations. +PapaBench is bound only to the embedded part of Paparazzi and to the default aircraft configuration. This configuration includes a Twinstar3 model-making aircraft, the flight plan used during the first European MAV Flight Competition held in Braunschweig Germany and a classic ground station consisting of the MC3030 radio-command, a radio receiver and a laptop. +The first generation of the embedded system enables us to save the C header files found in sw/var/include directory. These headers are generated from XML files containing the configuration of the airframes, the radio commands and the flight plan. +Then we analyzed the static sources and the generated headers in order to create PapaBench. We have excluded the sources of the ground station in charge of monitoring the flight, display statistics, programming the mission and generating the embedded system sources. + +Top Directoriy description +-------------------------- +aadl_sources :contains the aadl description of PapaBench. Their is four descriptions of the benchmark + since we analyzed four cases for the periodicity of tasks and interruptions. + - Version 1: Tasks and Interruptions are periodic non preemptive (PnP) + - Version 2: Tasks are periodic, Interruptions are aperiodic but both non preemptive (PnP, AnP) + - Version 3: Tasks and interruptions are periodic preemptive (PP) + - Version 4: Tasks are periodic , interruptions are aperiodic but both preemptive (PP, AP) + +avr : holds the header files of the AVR C libc project + +conf : is the configuration directory + +sw : has two sub-directories one for Fly_by_wire source code and the other for autopilot source code + +Loops_Bounds.txt : gives for each loop encountered in the sources its maximum iteration number. + +pcg_autopilot.txt and pcg_fbw.txt :provide the Program Call Graph for the autopilot and the fly_by_wire code respectively + + +Compilation details +------------------- +Our objective was to enable a user to compile the benchmark without the requirement of the whole Paparazzi building environment and for different architectures. Until now, we have experimented the compilation for PowerPC, x86 and ARM architectures using the gcc compiler suite but it should be easy to adapt PapaBench to other configurations. + +*********************************************** +* IMPORTANT * +*********************************************** +It is important to mention that PapaBench includes header files from the AVR C libc library project containing macros providing access to the AVR hardware registers like IO ports, timers, and so on. As the benchmark does not target hardware simulation, either the hardware registers only matter by their temporal properties, or they may be simply considered as simple memory accesses. +As they are mapped to low addresses (between 0x20 and 0x100), they might be impeding for some platforms where the addresses of interruptions vectors appear at this location. Fortunately, we can get rid of this problem by assigning in the compilation flags a compatible value to the SFR_OFFSET definition, which is the base of the hardware register addresses. + + +To Compile PapaBench +-------------------- + + 1) Extract the archive + + 2) HAVE A LOOK at conf/Makefile.local + - select or configure the ARCH (architecture) and MACH (machine) variables in "conf/Makefile.local", + - configure your compiler tools, + - configure your CFLAGS and LDFLAGS variable for compilation and linkage options. + + 3) "make" in top directory should compile everything + +Multi-processor application +--------------------------- + +In the default configuration, Papabench produces executable files representing two programs running on two processors. They may be found here: + - Fly-By-Wire: PAPABENCH/sw/airborne/fly_by_wire/fbw.elf + - Autpilot: PAPABENCH/sw/airborne/autopilot/autopilot.elf + +Each application application starts by calling the main function that contains a static scheduling invoking the different tasks with the different frequencies. Each task has an entry point represented as a C function. The table below show the different tasks and their frequencies. + +FLY-BY-WIRE + - check_failsafe_task (20Hz) + - check_mega128_values_task (20Hz) + - send_data_to_autopilot_task (40Hz) + - servo_transmit (20Hz) + - test_ppm_task (40Hz) + - __vector_5 (40Hz) -- interruption + - __vector_6 (20Hz) -- interruption (5 subsequent invocation each 2ms) + - __vector_10 (40Hz) -- interruption + +AUTOPILOT + - altitude_control_task (4Hz) + - climb_control_task (4Hz) + - link_fbw_send (20Hz) + - navigation_task (4Hz) + - radio_control_task (40Hz) + - receive_gps_data_task (4Hz) + - reporting_task (10Hz) + - stabilisation_task (20Hz) + - __vector_5 (10Hz) -- interruption + - __vector_12 (20Hz) -- interruption + - __vector_17 (20Hz) -- interruption + - __vector_30 (4Hz) -- interruption + +Mono-processor application +-------------------------- + +To compile papabench to only one executable file for only one processor, just +add the option PAPABENCH_SINGLE to the "make" command. + "make PAPABENCH_SINGLE=yes" + +We obtain now a lonely executable: + PAPABENCH/sw/airborne/autopilot/autopilot.elf + +The tasks becomes: + - altitude_control_task (4Hz) + - check_failsafe_task (20Hz) + - check_mega128_values_task (20Hz) + - climb_control_task (4Hz) + - link_fbw_send (20Hz) + - navigation_task (4Hz) + - radio_control_task (40Hz) + - receive_gps_data_task (4Hz) + - reporting_task (10Hz) + - send_data_to_autopilot_task (40Hz) + - servo_transmit (20Hz) + - stabilisation_task (20Hz) + - test_ppm_task (40Hz) + - __vector_5 (10Hz) -- interruption + - __vector_6 (20Hz) -- interruption (5 subsequent invocation each 2ms) + - __vector_10 (40Hz) -- interruption + - __vector_12 (20Hz) -- interruption + - __vector_17 (20Hz) -- interruption + - __vector_18 (40Hz) -- interruption (previously __vector_5 in fly-by-wire) + - __vector_30 (4Hz) -- interruption + +A more formal description of the tasks and their temporal properties expressed in AADL is given in directory "aadl_sources". diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aadl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aadl new file mode 100644 index 0000000..40e0ad7 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aadl @@ -0,0 +1,1047 @@ +-- le projet paprazzi s'interesse a la realisation +-- d'un micro-drone autonome a bas cout. +-- le systeme embarque est constitue de +-- 1.recepteurs (HF(pour radio commande) +-- 2.capteurs infrarouge et GPS +-- 3.camera video +-- 4.modem +-- 5.emetteur +-- 6.deux microcontroleurs (MCU0, MCU1) + +--les taches sont soit periodiques +--et les interruptions sont periodiques +--N.B: le choix du Scheduling_Protocol du processeur indique si +--la preemption est autorisee ou non +--on donnera plus tard l'ordonnancement avec ou sans preemption + +--taches MCU1: +--Reception Radio Command +--Send Servos Commands +--Send Message to MCU0 +--Interruptions: +--Receive/Send Data via SPI +--Servos Interruptions (6 interruptions) + +--Taches MCU0 +--radio command task +--navigation +--climb control +--altitude control +--Receive GPS position +--stabilisation +--Send message to MCU1 +--Receive Message from MCU1 +--Send Data to ground station +--Interruptions +--Send/Receive via SPI +--Modem Interruption +------------------------------------------ +package Data_Types +public + data Integer + properties + Source_Data_Size => 8 bits; + end Integer; + + data Boolean + properties + Source_Data_Size => 8 bits; + end Boolean; + + data Integer_16 + properties + Source_Data_Size =>16 bits; + end Integer_16; + + data Float + properties + Source_Data_Size => 32 bits; + end Float; + + subprogram Get_Integer + features + Result : out parameter Integer; + end Get_Integer; + + subprogram Set_Integer + features + Int : in parameter Integer; + end Set_Integer; + + subprogram Get_Integer16 + features + Result : out parameter Integer_16; + end Get_Integer16; + + subprogram Set_Integer16 + features + Int : in parameter Integer_16; + end Set_Integer16; + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + data Lat_Long + features + Get_Degs : subprogram Get_Integer; + Set_Degs : subprogram Set_Integer; + Get_Mins : subprogram Get_Integer; + Set_Mins : subprogram Set_Integer; + Get_Secs : subprogram Get_Integer; + Set_Secs : subprogram Set_Integer; + end Lat_Long; + + data implementation Lat_Long.Generic + subcomponents + Degs : data Integer; + Mins : data Integer; + Secs : data Integer; + end Lat_Long.Generic; + + -- The Position type specifies a position + data Position + end Position; + + -- This data type represents the position + data implementation Position.simple + subcomponents + Latitude : data Lat_long.generic; + Longitude : data Lat_long.generic; + end Position.simple; + + -- The data type that represents GPS sensor data + + data implementation Position.GPS extends Position.simple + subcomponents + Altitude : data Integer; + Cap : data Integer; + end Position.GPS; + + data Stream_Element + end Stream_Element; + + data implementation Stream_Element.Generic + properties + Source_Data_Size => 8bits; + end Stream_Element.Generic; + + data Tab + end Tab; + data Tableau extends Tab + features + Get_Data0 : subprogram Get_Integer16; + Set_Data0 : subprogram Set_Integer16; + Get_Data1 : subprogram Get_Integer16; + Set_Data1 : subprogram Set_Integer16; + Get_Data2 : subprogram Get_Integer16; + Set_Data2 : subprogram Set_Integer16; + Get_Data3 : subprogram Get_Integer16; + Set_Data3 : subprogram Set_Integer16; + Get_Data4 : subprogram Get_Integer16; + Set_Data4 : subprogram Set_Integer16; + Get_Data5 : subprogram Get_Integer16; + Set_Data5 : subprogram Set_Integer16; + Get_Data6 : subprogram Get_Integer16; + Set_Data6 : subprogram Set_Integer16; + Get_Data7 : subprogram Get_Integer16; + Set_Data7 : subprogram Set_Integer16; + Get_Data8 : subprogram Get_Integer16; + Set_Data8 : subprogram Set_Integer16; + end Tableau; + + data implementation Tableau.Generic + subcomponents + data_0 : data Integer_16; + data_1 : data Integer_16; + data_2 : data Integer_16; + data_3 : data Integer_16; + data_4 : data Integer_16; + data_5 : data Integer_16; + data_6 : data Integer_16; + data_7 : data Integer_16; + data_8 : data Integer_16; + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + end Tableau.Generic; + + data TabServos extends Tab + features + Get_MotorL : subprogram Get_Integer16; + Set_MotorL : subprogram Set_Integer16; + Get_MotorR : subprogram Get_Integer16; + Set_MotorR : subprogram Set_Integer16; + Get_AileronL : subprogram Get_Integer16; + Set_AileronL : subprogram Set_Integer16; + Get_AileronR : subprogram Get_Integer16; + Set_AileronR : subprogram Set_Integer16; + Get_Rudder : subprogram Get_Integer16; + Set_Rudder : subprogram Set_Integer16; + Get_Elevator : subprogram Get_Integer16; + Set_Elevator : subprogram Set_Integer16; + end TabServos; + + data Implementation TabServos.Impl + subcomponents + MotorL: data Integer_16; + MotorR: data Integer_16; + AileronL: data Integer_16; + AileronR: data Integer_16; + Rudder: data Integer_16; + Elevator: data Integer_16; + end TabServos.Impl; + + data inter_mcu_msg + features + Set_Ppm : subprogram Set_Integer; + Get_Ppm : subprogram Get_Integer; + Set_Status : subprogram Set_Integer; + Get_Status : subprogram Get_Integer; + Set_NbErr : subprogram Set_Integer; + Get_NbErr : subprogram Get_Integer; + Set_Vsupply : subprogram Set_Integer; + Get_Vsupply : subprogram Get_Integer; + end inter_mcu_msg; + + data implementation Inter_mcu_msg.Generic + subcomponents + channels : data Tableau.Generic; + ppm_cpt : data Integer; + satus : data Integer; + nb_err : data Integer; + vsupply : data Integer; + end Inter_mcu_msg.generic; +end Data_Types; +--------------------------------------------------------------- +-- We model a bus that connects our devices to the processor +bus Device_Bus +end Device_Bus; + +bus implementation Device_Bus.MCU0 +end Device_Bus.MCU0; + +bus implementation Device_Bus.MCU1 +end Device_Bus.MCU1; + +device Compteur +features + Data_Elev_Input : in data port Data_Types::Integer_16; + Data_AilL_Input : in data port Data_Types::Integer_16; + Data_AilR_Input : in data port Data_Types::Integer_16; + Data_MotorL_Input : in data port Data_Types::Integer_16; + Data_MotorR_Input : in data port Data_Types::Integer_16; + Data_Rudder_Input : in data port Data_Types::Integer_16; + Data_Elev_Output : out data port Data_Types::Integer_16; + Data_AilL_Output : out data port Data_Types::Integer_16; + Data_AilR_Output : out data port Data_Types::Integer_16; + Data_MotorL_Output : out data port Data_Types::Integer_16; + Data_MotorR_Output : out data port Data_Types::Integer_16; + Data_Rudder_Output : out data port Data_Types::Integer_16; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Compteur; + +device Servo +features + Data_Input : in data port Data_Types::Integer_16; + Dev_bus : requires bus access Device_Bus.MCU1; +end Servo; + +device Recepteur +features + RC_Input : in event data port; + RC_Output : out event data port; + RC_Evt_Output : out event port; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Recepteur; + + +--this thread gets the data from the Radio Commande (RC) +--il definit les interruptions provenant de la RC +--il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! +-- au moins il faut que cette tache soit sporadic +--sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement +--mais le temps entre deux dispatch successifs ne doit pas etre < a la periode +thread Interruption_Radio +features + RC_Evt_Input : in event data port; +end Interruption_Radio; + +thread implementation Interruption_Radio.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/ppm.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; + Period =>25 ms; +end Interruption_Radio.Impl; + +thread test_ppm_task +end test_ppm_task; + +thread implementation test_ppm_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "test_ppm_task"; + Period =>25 ms;--Periode deduite de PPM.h >> PPM_FREQ +end test_ppm_task.Impl; + +thread check_mega128_values_task +end check_mega128_values_task; + +thread implementation check_mega128_values_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_mega128_values_task"; + Period=> 50 ms;--20Hz +end check_mega128_values_task.Impl; + +thread check_failsafe_task +end check_failsafe_task; + +thread implementation check_failsafe_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_failsafe_task"; + Period=> 50 ms;--20Hz +end check_failsafe_task.Impl; + +--Ce thread gere l'interruption d'envoi des parametres au servos +thread Interruption_Envoi_Servo +features + Signal_Input: in event data port Data_Types::TabServos.Impl; + Data_Output : out data port Data_Types::Integer_16; +end Interruption_Envoi_Servo; + +thread implementation Interruption_Envoi_Servo.Elevator +calls { + Elevator_Value: subprogram Data_Types::TabServos.Get_Elevator;}; +connections + parameter Elevator_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 50 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.Elevator; + +thread implementation Interruption_Envoi_Servo.MotorL +calls { + MotorL_Value: subprogram Data_Types::TabServos.Get_MotorL;}; +connections + parameter MotorL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 52 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.MotorL; + +thread implementation Interruption_Envoi_Servo.MotorR +calls { + MotorR_Value: subprogram Data_Types::TabServos.Get_MotorR;}; +connections + parameter MotorR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c_SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 54 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.MotorR; + +thread implementation Interruption_Envoi_Servo.AileronL +calls { + AileronL_Value: subprogram Data_Types::TabServos.Get_AileronL;}; +connections + parameter AileronL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 56 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.AileronL; + +thread implementation Interruption_Envoi_Servo.AileronR +calls { + AileronR_Value: subprogram Data_Types::TabServos.Get_AileronR;}; +connections + parameter AileronR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 58 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.AileronR; + +thread implementation Interruption_Envoi_Servo.Rudder +calls { + Rudder_Value: subprogram Data_Types::TabServos.Get_Rudder;}; +connections + parameter Rudder_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 60 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.Rudder; + + +--this thread gets the flight parameters and transmit them to the Counter +--fonction servo_transmit +thread servo_transmit +end servo_transmit; + +thread implementation servo_transmit.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c"; + Compute_Entrypoint => "servo_transmit"; + Period => 50ms;--20Hz; +end servo_transmit.Impl; + +--envoi reception signaux via SPI +thread Interruption_SPI_MCU1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU1_Output: out data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU1 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; + AP_Evt_Output : out event port; +end Interruption_SPI_MCU1; + +thread implementation Interruption_SPI_MCU1.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_10"; + Period=> 25 ms; +end Interruption_SPI_MCU1.Impl; + +--this thread sends data to and receives data from MCU0 +thread send_data_to_autopilot_task +features + MCU1_Data_Input : in data port Data_Types::Tableau.Generic; + MCU1_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + Radio_Ok_Input : in data port Data_Types::Boolean; + Radio_Really_Lost_Input : in data port Data_Types::Boolean; +end send_data_to_autopilot_task; + +thread implementation send_data_to_autopilot_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "send_data_to_autopilot_task"; + Period => 25 ms; --meme periode que reception_Decodage +end send_data_to_autopilot_task.Impl; + +process RecepteurCde_PilotageServo +features + Radio_Cdes_Input : in event data port; + RC_Evt_Input : in event port; + AP_Cdes_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Autopilot Input + Cdes_Vol_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--data transmission to MCU0 + + Cde_Elevator_Output : out data port Data_Types::Integer_16; + Cde_MotorL_Output : out data port Data_Types::Integer_16; + Cde_MotorR_Output : out data port Data_Types::Integer_16; + Cde_AileronL_Output : out data port Data_Types::Integer_16; + Cde_AileronR_Output : out data port Data_Types::Integer_16; + Cde_Rudder_Output : out data port Data_Types::Integer_16; +end RecepteurCde_PilotageServo; + +process implementation RecepteurCde_PilotageServo.Impl +subcomponents + Rec_Dec_Th : thread test_ppm_task.Impl; + Send_Th : thread send_data_to_autopilot_task.Impl; + Pilot_Serv_Th : thread servo_transmit.Impl; + Check_Ap_Th : thread check_mega128_values_task.Impl; + Check_Fail_Th: thread check_failsafe_task.Impl; + + Interrupt_Elevator_Th:thread Interruption_Envoi_Servo.Elevator; + Interrupt_MotorL_Th:thread Interruption_Envoi_Servo.MotorL; + Interrupt_MotorR_Th:thread Interruption_Envoi_Servo.MotorR; + Interrupt_AileronL_Th:thread Interruption_Envoi_Servo.AileronL; + Interrupt_AileronR_Th:thread Interruption_Envoi_Servo.AileronR; + Interrupt_Rudder_Th:thread Interruption_Envoi_Servo.Rudder; + + Interrupt_SPI_1: thread Interruption_SPI_MCU1; + Interrupt_RC_Th: thread Interruption_Radio.Impl; + + --System Settings + System_Mode : data Data_Types::Boolean; + Radio_Ok : data Data_Types::Boolean; + Radio_Really_Lost : data Data_Types::Boolean; + Mega128_Ok : data Data_Types::Boolean; +connections + event data port Radio_Cdes_Input-> Interrupt_RC_Th.RC_Evt_Input in modes (manual); + event data port Send_Th.MCU1_Send_Output->Interrupt_SPI_1.Evt_Send_SPI_Input in modes(manual); + event data port Interrupt_SPI_1.Data_Send_SPI_Output->Cdes_Vol_Output in modes(manual); + + event data port AP_Cdes_Input->Interrupt_SPI_1.Evt_Rec_SPI_Input in modes (auto,manual); + + data port Interrupt_Elevator_Th.Data_Output->Cde_Elevator_Output; + data port Interrupt_MotorL_Th.Data_Output->Cde_MotorL_Output; + data port Interrupt_MotorR_Th.Data_Output->Cde_MotorR_Output; + data port Interrupt_AileronL_Th.Data_Output->Cde_AileronL_Output; + data port Interrupt_AileronR_Th.Data_Output->Cde_AileronR_Output; + data port Interrupt_Rudder_Th.Data_Output->Cde_Rudder_Output; +modes + manual : initial mode; + auto : mode; + failsafe: mode; +properties + Source_Text => "fly_by_wire/main.c"; +end RecepteurCde_PilotageServo.Impl; + +processor Proc_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; + Dev_Bus : requires bus access Device_Bus.MCU1; + SPI : requires bus access SPI; +end Proc_MCU1; + +-- AADL processor = microprocessor + scheduler +processor implementation Proc_MCU1.Impl +properties + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente +end Proc_MCU1.Impl; + +-- We model the RAM to bind our processes and threads +memory Ram_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; +end Ram_MCU1; + +-- bus that links processors and memories +bus Mem_Bus_MCU1 +end Mem_Bus_MCU1; + +-- MCU1 est charge de la Reception des ordres de la radio-commande, +-- la communication avec MCU0 et le pilotage des servos commandes + +system MCU1 +features + RC_EvtData_Input : in event data port; + AP_EvtData_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--AP: autopilot + D_MCU1_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + SPI_Con : requires bus access SPI; +end MCU1; + +system implementation MCU1.Impl +subcomponents + --declare system subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram : memory Ram_MCU1; + Mem_Bus : bus Mem_Bus_MCU1; + Dev_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; +connections + --bus connections + bus access Mem_Bus -> MCU1_P.Mem_Bus; + bus access Dev_Bus -> MCU1_P.Dev_Bus; + bus access Mem_Bus -> Ram.Mem_Bus; + bus access Dev_Bus -> Recpt_dv.Dev_Bus; + bus access Dev_Bus -> Cpt_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->D_MCU1_Output; + event data port AP_EvtData_Input->Proc_RcptCde_PilotServ.AP_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + +properties + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram applies to Proc_RcptCde_PilotServ; +end MCU1.Impl; +----------------------------------------------------------------- +--determine la pression +device Pression +features + P_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Pression; + +--determine la tension +device Tension -- Alimentation +features + T_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Tension; + +device Compas +features + Compas_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end compas; + +--determine la vitesse de l'air +device Vitesse_Air +features + V_Air_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Vitesse_Air; + +--filme le trajet de la mission +device Camera_Video +features + Video_Output : out data port; -- new data type? + Dev_Bus : requires bus access Device_bus.MCU0; +end Camera_Video; + +-- transmet les donnees a la station sol +device Emetteur +features + Video_Input : in data port;--data type? + Trans_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Trans_Data_Output : out data port; + Video_Output : out data port; + Modem_Bus : requires bus access Modem; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Emetteur; + +-- determine la position du drone +device GPS +features + Error_Output : out event port; + GPS_Output : out event data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end GPS; + +device InfraRed +features + Error_Output : out event port; + IR_Output : out data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end InfraRed; + +-- relie le systeme MCU0 a la station sol +--ce qui permet la transmission de donnes +bus Modem +end Modem; + +-- Ce thread recoit les sigaux GPS et les transforme +-- en donnees utilisables +thread Interruption_GPS +features + GPS_Input : in event data port Data_Types::Stream_Element.Generic; +end Interruption_GPS; + +thread implementation Interruption_GPS.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/gps_ubx.c/parse_ubx"; + Compute_Entrypoint => "__vector_30"; + period=> 250 ms; +end Interruption_GPS.Impl; + +thread receive_gps_data_task +features + GPS_Output : out event data port Data_Types::Position.GPS; +end receive_gps_data_task; + +thread implementation receive_gps_data_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "receive_gps_data_task"; + period => 250 ms; --4hz +end receive_gps_data_task.Impl; + + +--controle la navigation de l'avion +thread navigation_task +features + GPS_Data_Input : in event data port Data_Types::Position.GPS; + Altitude_Desiree_Output: out event data port Data_Types::Float; +end navigation_task; + +--Ce thread est declenche a la frequence des informations delivrees +--par le GPS 4Hz, sa periode est de 250 ms +thread implementation navigation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "navigation_task"; + Period=> 250 ms; +end navigation_task.Impl; + +--le thread Navigation est toujours suivi, dans cet ordre, +-- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + +--Controle l'altitude +thread altitude_control_task +features + Altitude_Desiree_Input : in event data port Data_Types::Float;--fourni par navigation + Montee_Desiree_Output : out event data port Data_Types::Float; +end altitude_control_task; + +thread implementation altitude_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint =>"altitude_control_task"; + Period => 250 ms; +end altitude_control_task.Impl; + +--controle la montee +thread climb_control_task +features + Montee_Desiree_Input: in event data port Data_Types::Float;--fourni par Altitude_Ctrl +end climb_control_task; + +thread implementation climb_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "climb_control_task"; + Period => 250 ms; +end climb_control_task.Impl; + +-- Controle la stabilisation et transmet les donnees a MCU1 +thread stabilisation_task +features + IR_Input : in data port Data_Types::Stream_Element.Generic; +end stabilisation_task; + +thread implementation stabilisation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "stabilisation_task"; + Period => 50 ms;--20 hertz; +end stabilisation_task.Impl; + +thread Interruption_SPI_MCU0_1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_1; + +thread implementation Interruption_SPI_MCU0_1.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_17"; + Period=> 50 ms; +end Interruption_SPI_MCU0_1.Impl; + +thread Interruption_SPI_MCU0_2 +features + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU0 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_2; + +thread implementation Interruption_SPI_MCU0_2.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/linf_fbw.c/SIGNAL"; + Compute_Entrypoint => "__vector_12"; + Period=> 50 ms; +end Interruption_SPI_MCU0_2.Impl; + +thread link_fbw_send +features + MCU0_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end link_fbw_send; + +--ce thread se declenche toujours apres la Stabilisation d'ou sa periode +thread implementation link_fbw_send.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/link_fbw.c"; + Compute_Entrypoint => "link_fbw_send"; + Period => 50 ms;--20Hz +end link_fbw_send.Impl; + +thread radio_control_task +end radio_control_task; + +thread implementation radio_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "radio_control_task"; + Period=> 25 ms; +end radio_control_task.Impl; + +thread reporting_task +features + Data_Output : out data port Data_Types::Inter_mcu_msg.Generic; +end reporting_task; + +thread implementation reporting_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption => Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "reporting_task"; + Period=> 100 ms;--10Hz +end reporting_task.Impl; + +thread Interruption_Modem +features + Data_Input : in data port Data_Types::Inter_mcu_msg.Generic; + Data_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_Modem; + +thread implementation Interruption_Modem.Impl +properties + Dispatch_Protocol=> periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/modem.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; + Period=> 100 ms; +end Interruption_Modem.Impl; + +process Nav_Stab_Control_Proc +features + MCU1_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Param Radio_Cde (mode manuel) + GPS_Input : in event data port Data_Types::Stream_Element.Generic; + GPS_Evt_Input : in event port; + IR_Input : in data port Data_Types::Stream_Element.Generic; + P_Input : in data port Data_Types::Float; + T_Input : in data port Data_Types :: Integer; + Compas_Input : in data port Data_Types::Float; + V_Air_Input : in data port Data_Types:: Integer; + -- donnees transmies a MCU1 + Trans_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + -- donnees transmies a la station sol + Trans_Sol_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Nav_Stab_Control_Proc; + +process implementation Nav_Stab_Control_Proc.Impl +subcomponents + Data_Acq_Filt_Th : thread receive_gps_data_task.Impl; + Alt_Ctrl_Th : thread altitude_control_task.Impl; + Nav_Th : thread navigation_task.Impl; + Climb_Ctrl_Th : thread climb_control_task.Impl; + Stab_Th : thread stabilisation_task.Impl; + Send_MCU1_Th : thread link_fbw_send.Impl; + Send_Grd_Station_Th : thread reporting_task.Impl; + Interrupt_SPI_Th1:thread Interruption_SPI_MCU0_1.Impl; + Interrupt_SPI_Th2:thread Interruption_SPI_MCU0_2.Impl; + Interrupt_Modem_Th: thread Interruption_Modem.Impl; + Interrupt_GPS_Th: thread Interruption_GPS.Impl; + Ctrl_By_RC_Th: thread radio_control_task.Impl; + + --save the autopilot settings + AP_Data : data Data_Types::Inter_mcu_msg.Generic; +connections + + event data port GPS_Input->Interrupt_GPS_Th.GPS_Input; + event data port Data_Acq_Filt_Th.GPS_Output->Nav_Th.GPS_Data_Input; + event data port Nav_Th.Altitude_Desiree_Output->Alt_Ctrl_Th.Altitude_Desiree_Input in modes (auto, home); + event data port Alt_Ctrl_Th.Montee_Desiree_Output->Climb_Ctrl_Th.Montee_Desiree_Input in modes (auto, home); + + data port IR_Input->Stab_Th.IR_Input; + + event data port Send_MCU1_Th.MCU0_Send_Output->Interrupt_SPI_Th1.Evt_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th1.Data_Send_SPI_Output->Interrupt_SPI_Th2.Data_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th2.Data_Send_SPI_Output->Trans_MCU0_Output in modes(auto,home,manual); + + event data port MCU1_Data_Input->Interrupt_SPI_Th1.Evt_Rec_SPI_Input in modes(manual); + event data port Interrupt_SPI_Th1.Data_Rec_MCU0_Output->Interrupt_SPI_Th2.Data_Rec_MCU0_Input in modes(manual); + + data port Send_Grd_Station_Th.Data_Output->Interrupt_Modem_Th.Data_Input in modes (auto,manual,home); + event data port Interrupt_Modem_Th.Data_Output->Trans_Sol_Output in modes (auto,manual,home); + +modes + manual : initial mode; + auto : mode; + home : mode; +properties + Source_Text => "autopilot/mainloop.c"; +end Nav_Stab_Control_Proc.Impl; + +processor Proc_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; + Dev_Bus : requires bus access Device_Bus.MCU0; + SPI : requires bus access SPI; +end Proc_MCU0; + +processor implementation Proc_MCU0.Impl +properties + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe +end Proc_MCU0.Impl; + +memory Ram_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; +end Ram_MCU0; + +bus Mem_Bus_MCU0 +end Mem_Bus_MCU0; + +---------------------------------------------------------------- +-- we model a bus to link the systems +bus SPI +end SPI; + +system system_papabench +features + RC_EvtData_Input : in event data port; +end system_papabench; + +system implementation system_papabench.Impl +subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram1 : memory Ram_MCU1; + Mem1_Bus : bus Mem_Bus_MCU1; + Dev1_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; + + --MCU0 + MCU0_P : processor Proc_MCU0.Impl; + Ram0 : memory Ram_MCU0; + Mem0_Bus: bus Mem_Bus_MCU0; + P_dv : device Pression; + T_dv : device Tension; + Compas_dv : device Compas; + V_Air_dv : device Vitesse_Air; + Cam_dv : device Camera_Video; + Emet_dv : device Emetteur; + GPS_dv : device GPS; + IR_dv : device InfraRed; + Dev0_Bus : bus Device_Bus.MCU0; + Modem_Bus : bus Modem; + N_S_C_proc : process Nav_Stab_Control_Proc.Impl; + + SPI : bus SPI; +connections + --bus connections + bus access Mem1_Bus -> MCU1_P.Mem_Bus; + bus access Dev1_Bus -> MCU1_P.Dev_Bus; + bus access SPI -> MCU1_P.SPI; + bus access Dev1_Bus -> Recpt_dv.Dev_Bus; + bus access Dev1_Bus -> Cpt_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorR_dv.Dev_Bus; + + bus access Mem0_Bus->MCU0_P.Mem_Bus; + bus access Mem0_Bus->Ram0.Mem_Bus; + bus access SPI->MCU0_P.SPI; + bus access Dev0_Bus->MCU0_P.Dev_Bus; + bus access Dev0_Bus->P_dv.Dev_Bus; + bus access Dev0_Bus->T_dv.Dev_Bus; + bus access Dev0_Bus->Compas_dv.Dev_Bus; + bus access Dev0_Bus->V_Air_dv.Dev_Bus; + bus access Dev0_Bus->Cam_dv.Dev_Bus; + bus access Dev0_Bus->Emet_dv.Dev_Bus; + bus access Modem_Bus->Emet_dv.Modem_Bus; + bus access Dev0_Bus->GPS_dv.Dev_Bus; + bus access Dev0_Bus->IR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + + data port P_dv.P_Output->N_S_C_proc.P_Input; + data port T_dv.T_Output->N_S_C_proc.T_Input; + data port Compas_dv.Compas_Output->N_S_C_proc.Compas_Input; + data port V_Air_dv.V_Air_Output->N_S_C_proc.V_Air_Input; + data port IR_dv.IR_Output->N_S_C_proc.IR_Input; + event data port GPS_dv.GPS_Output->N_S_C_proc.GPS_Input; + event port GPS_dv.Error_Output->N_S_C_proc.GPS_Evt_Input; + + event data port N_S_C_proc.Trans_Sol_Output->Emet_dv.Trans_Data_Input; + data port Cam_dv.Video_Output->Emet_dv.Video_Input; + + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->N_S_C_proc.MCU1_Data_Input; + event data port N_S_C_proc.Trans_MCU0_Output->Proc_RcptCde_PilotServ.AP_Cdes_Input; +properties + Actual_Processor_Binding => reference MCU0_P applies to N_S_C_Proc; + Actual_Memory_Binding => reference Ram0 applies to N_S_C_Proc; + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram1 applies to Proc_RcptCde_PilotServ; +end system_papabench.Impl; diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aadl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aadl new file mode 100644 index 0000000..e0a2b50 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aadl @@ -0,0 +1,1037 @@ +-- le projet paprazzi s'interesse a la realisation +-- d'un micro-drone autonome a bas cout. +-- le systeme embarque est constitue de +-- 1.recepteurs (HF(pour radio commande) +-- 2.capteurs infrarouge et GPS +-- 3.camera video +-- 4.modem +-- 5.emetteur +-- 6.deux microcontroleurs (MCU0, MCU1) + +--les taches sont soit periodiques +--et les interruptions sont periodiques +--N.B: le choix du Scheduling_Protocol du processeur indique si +--la preemption est autorisee ou non +--on donnera plus tard l'ordonnancement avec ou sans preemption + +--taches MCU1: +--Reception Radio Command +--Send Servos Commands +--Send Message to MCU0 +--Interruptions: +--Receive/Send Data via SPI +--Servos Interruptions (6 interruptions) + +--Taches MCU0 +--radio command task +--navigation +--climb control +--altitude control +--Receive GPS position +--stabilisation +--Send message to MCU1 +--Receive Message from MCU1 +--Send Data to ground station +--Interruptions +--Send/Receive via SPI +--Modem Interruption +------------------------------------------ +package Data_Types +public + data Integer + properties + Source_Data_Size => 8 bits; + end Integer; + + data Boolean + properties + Source_Data_Size => 8 bits; + end Boolean; + + data Integer_16 + properties + Source_Data_Size =>16 bits; + end Integer_16; + + data Float + properties + Source_Data_Size => 32 bits; + end Float; + + subprogram Get_Integer + features + Result : out parameter Integer; + end Get_Integer; + + subprogram Set_Integer + features + Int : in parameter Integer; + end Set_Integer; + + subprogram Get_Integer16 + features + Result : out parameter Integer_16; + end Get_Integer16; + + subprogram Set_Integer16 + features + Int : in parameter Integer_16; + end Set_Integer16; + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + data Lat_Long + features + Get_Degs : subprogram Get_Integer; + Set_Degs : subprogram Set_Integer; + Get_Mins : subprogram Get_Integer; + Set_Mins : subprogram Set_Integer; + Get_Secs : subprogram Get_Integer; + Set_Secs : subprogram Set_Integer; + end Lat_Long; + + data implementation Lat_Long.Generic + subcomponents + Degs : data Integer; + Mins : data Integer; + Secs : data Integer; + end Lat_Long.Generic; + + -- The Position type specifies a position + data Position + end Position; + + -- This data type represents the position + data implementation Position.simple + subcomponents + Latitude : data Lat_long.generic; + Longitude : data Lat_long.generic; + end Position.simple; + + -- The data type that represents GPS sensor data + + data implementation Position.GPS extends Position.simple + subcomponents + Altitude : data Integer; + Cap : data Integer; + end Position.GPS; + + data Stream_Element + end Stream_Element; + + data implementation Stream_Element.Generic + properties + Source_Data_Size => 8bits; + end Stream_Element.Generic; + + data Tab + end Tab; + data Tableau extends Tab + features + Get_Data0 : subprogram Get_Integer16; + Set_Data0 : subprogram Set_Integer16; + Get_Data1 : subprogram Get_Integer16; + Set_Data1 : subprogram Set_Integer16; + Get_Data2 : subprogram Get_Integer16; + Set_Data2 : subprogram Set_Integer16; + Get_Data3 : subprogram Get_Integer16; + Set_Data3 : subprogram Set_Integer16; + Get_Data4 : subprogram Get_Integer16; + Set_Data4 : subprogram Set_Integer16; + Get_Data5 : subprogram Get_Integer16; + Set_Data5 : subprogram Set_Integer16; + Get_Data6 : subprogram Get_Integer16; + Set_Data6 : subprogram Set_Integer16; + Get_Data7 : subprogram Get_Integer16; + Set_Data7 : subprogram Set_Integer16; + Get_Data8 : subprogram Get_Integer16; + Set_Data8 : subprogram Set_Integer16; + end Tableau; + + data implementation Tableau.Generic + subcomponents + data_0 : data Integer_16; + data_1 : data Integer_16; + data_2 : data Integer_16; + data_3 : data Integer_16; + data_4 : data Integer_16; + data_5 : data Integer_16; + data_6 : data Integer_16; + data_7 : data Integer_16; + data_8 : data Integer_16; + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + end Tableau.Generic; + + data TabServos extends Tab + features + Get_MotorL : subprogram Get_Integer16; + Set_MotorL : subprogram Set_Integer16; + Get_MotorR : subprogram Get_Integer16; + Set_MotorR : subprogram Set_Integer16; + Get_AileronL : subprogram Get_Integer16; + Set_AileronL : subprogram Set_Integer16; + Get_AileronR : subprogram Get_Integer16; + Set_AileronR : subprogram Set_Integer16; + Get_Rudder : subprogram Get_Integer16; + Set_Rudder : subprogram Set_Integer16; + Get_Elevator : subprogram Get_Integer16; + Set_Elevator : subprogram Set_Integer16; + end TabServos; + + data Implementation TabServos.Impl + subcomponents + MotorL: data Integer_16; + MotorR: data Integer_16; + AileronL: data Integer_16; + AileronR: data Integer_16; + Rudder: data Integer_16; + Elevator: data Integer_16; + end TabServos.Impl; + + data inter_mcu_msg + features + Set_Ppm : subprogram Set_Integer; + Get_Ppm : subprogram Get_Integer; + Set_Status : subprogram Set_Integer; + Get_Status : subprogram Get_Integer; + Set_NbErr : subprogram Set_Integer; + Get_NbErr : subprogram Get_Integer; + Set_Vsupply : subprogram Set_Integer; + Get_Vsupply : subprogram Get_Integer; + end inter_mcu_msg; + + data implementation Inter_mcu_msg.Generic + subcomponents + channels : data Tableau.Generic; + ppm_cpt : data Integer; + satus : data Integer; + nb_err : data Integer; + vsupply : data Integer; + end Inter_mcu_msg.generic; +end Data_Types; +--------------------------------------------------------------- +-- We model a bus that connects our devices to the processor +bus Device_Bus +end Device_Bus; + +bus implementation Device_Bus.MCU0 +end Device_Bus.MCU0; + +bus implementation Device_Bus.MCU1 +end Device_Bus.MCU1; + +device Compteur +features + Data_Elev_Input : in data port Data_Types::Integer_16; + Data_AilL_Input : in data port Data_Types::Integer_16; + Data_AilR_Input : in data port Data_Types::Integer_16; + Data_MotorL_Input : in data port Data_Types::Integer_16; + Data_MotorR_Input : in data port Data_Types::Integer_16; + Data_Rudder_Input : in data port Data_Types::Integer_16; + Data_Elev_Output : out data port Data_Types::Integer_16; + Data_AilL_Output : out data port Data_Types::Integer_16; + Data_AilR_Output : out data port Data_Types::Integer_16; + Data_MotorL_Output : out data port Data_Types::Integer_16; + Data_MotorR_Output : out data port Data_Types::Integer_16; + Data_Rudder_Output : out data port Data_Types::Integer_16; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Compteur; + +device Servo +features + Data_Input : in data port Data_Types::Integer_16; + Dev_bus : requires bus access Device_Bus.MCU1; +end Servo; + +device Recepteur +features + RC_Input : in event data port; + RC_Output : out event data port; + RC_Evt_Output : out event port; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Recepteur; + + +--this thread gets the data from the Radio Commande (RC) +--il definit les interruptions provenant de la RC +--il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! +-- au moins il faut que cette tache soit sporadic +--sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement +--mais le temps entre deux dispatch successifs ne doit pas etre < a la periode +thread Interruption_Radio +features + RC_Evt_Input : in event data port; +end Interruption_Radio; + +thread implementation Interruption_Radio.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/ppm.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; +end Interruption_Radio.Impl; + +thread test_ppm_task +end test_ppm_task; + +thread implementation test_ppm_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "test_ppm_task"; + Period =>25 ms;--Periode deduite de PPM.h >> PPM_FREQ +end test_ppm_task.Impl; + +thread check_mega128_values_task +end check_mega128_values_task; + +thread implementation check_mega128_values_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_mega128_values_task"; + Period=> 50 ms;--20Hz +end check_mega128_values_task.Impl; + +thread check_failsafe_task +end check_failsafe_task; + +thread implementation check_failsafe_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_failsafe_task"; + Period=> 50 ms;--20Hz +end check_failsafe_task.Impl; + +--Ce thread gere l'interruption d'envoi des parametres au servos +thread Interruption_Envoi_Servo +features + Signal_Input: in event data port Data_Types::TabServos.Impl; + Data_Output : out data port Data_Types::Integer_16; +end Interruption_Envoi_Servo; + +thread implementation Interruption_Envoi_Servo.Elevator +calls { + Elevator_Value: subprogram Data_Types::TabServos.Get_Elevator;}; +connections + parameter Elevator_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.Elevator; + +thread implementation Interruption_Envoi_Servo.MotorL +calls { + MotorL_Value: subprogram Data_Types::TabServos.Get_MotorL;}; +connections + parameter MotorL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.MotorL; + +thread implementation Interruption_Envoi_Servo.MotorR +calls { + MotorR_Value: subprogram Data_Types::TabServos.Get_MotorR;}; +connections + parameter MotorR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.MotorR; + +thread implementation Interruption_Envoi_Servo.AileronL +calls { + AileronL_Value: subprogram Data_Types::TabServos.Get_AileronL;}; +connections + parameter AileronL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.AileronL; + +thread implementation Interruption_Envoi_Servo.AileronR +calls { + AileronR_Value: subprogram Data_Types::TabServos.Get_AileronR;}; +connections + parameter AileronR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.AileronR; + +thread implementation Interruption_Envoi_Servo.Rudder +calls { + Rudder_Value: subprogram Data_Types::TabServos.Get_Rudder;}; +connections + parameter Rudder_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.Rudder; + + +--this thread gets the flight parameters and transmit them to the Counter +--fonction servo_transmit +thread servo_transmit +end servo_transmit; + +thread implementation servo_transmit.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/servo.c"; + Compute_Entrypoint => "servo_transmit"; +end servo_transmit.Impl; + +--envoi reception signaux via SPI +thread Interruption_SPI_MCU1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU1_Output: out data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU1 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; + AP_Evt_Output : out event port; +end Interruption_SPI_MCU1; + +thread implementation Interruption_SPI_MCU1.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_10"; +end Interruption_SPI_MCU1.Impl; + +--this thread sends data to and receives data from MCU0 +thread send_data_to_autopilot_task +features + MCU1_Data_Input : in data port Data_Types::Tableau.Generic; + MCU1_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + Radio_Ok_Input : in data port Data_Types::Boolean; + Radio_Really_Lost_Input : in data port Data_Types::Boolean; +end send_data_to_autopilot_task; + +thread implementation send_data_to_autopilot_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "send_data_to_autopilot_task"; + Period => 25 ms; --meme periode que reception_Decodage +end send_data_to_autopilot_task.Impl; + +process RecepteurCde_PilotageServo +features + Radio_Cdes_Input : in event data port; + RC_Evt_Input : in event port; + AP_Cdes_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Autopilot Input + Cdes_Vol_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--data transmission to MCU0 + + Cde_Elevator_Output : out data port Data_Types::Integer_16; + Cde_MotorL_Output : out data port Data_Types::Integer_16; + Cde_MotorR_Output : out data port Data_Types::Integer_16; + Cde_AileronL_Output : out data port Data_Types::Integer_16; + Cde_AileronR_Output : out data port Data_Types::Integer_16; + Cde_Rudder_Output : out data port Data_Types::Integer_16; +end RecepteurCde_PilotageServo; + +process implementation RecepteurCde_PilotageServo.Impl +subcomponents + Rec_Dec_Th : thread test_ppm_task.Impl; + Send_Th : thread send_data_to_autopilot_task.Impl; + Pilot_Serv_Th : thread servo_transmit.Impl; + Check_Ap_Th : thread check_mega128_values_task.Impl; + Check_Fail_Th: thread check_failsafe_task.Impl; + + Interrupt_Elevator_Th:thread Interruption_Envoi_Servo.Elevator; + Interrupt_MotorL_Th:thread Interruption_Envoi_Servo.MotorL; + Interrupt_MotorR_Th:thread Interruption_Envoi_Servo.MotorR; + Interrupt_AileronL_Th:thread Interruption_Envoi_Servo.AileronL; + Interrupt_AileronR_Th:thread Interruption_Envoi_Servo.AileronR; + Interrupt_Rudder_Th:thread Interruption_Envoi_Servo.Rudder; + + Interrupt_SPI_1: thread Interruption_SPI_MCU1; + Interrupt_RC_Th: thread Interruption_Radio.Impl; + + --System Settings + System_Mode : data Data_Types::Boolean; + Radio_Ok : data Data_Types::Boolean; + Radio_Really_Lost : data Data_Types::Boolean; + Mega128_Ok : data Data_Types::Boolean; +connections + event data port Radio_Cdes_Input-> Interrupt_RC_Th.RC_Evt_Input in modes (manual); + event data port Send_Th.MCU1_Send_Output->Interrupt_SPI_1.Evt_Send_SPI_Input in modes(manual); + event data port Interrupt_SPI_1.Data_Send_SPI_Output->Cdes_Vol_Output in modes(manual); + + event data port AP_Cdes_Input->Interrupt_SPI_1.Evt_Rec_SPI_Input in modes (auto,manual); + + data port Interrupt_Elevator_Th.Data_Output->Cde_Elevator_Output; + data port Interrupt_MotorL_Th.Data_Output->Cde_MotorL_Output; + data port Interrupt_MotorR_Th.Data_Output->Cde_MotorR_Output; + data port Interrupt_AileronL_Th.Data_Output->Cde_AileronL_Output; + data port Interrupt_AileronR_Th.Data_Output->Cde_AileronR_Output; + data port Interrupt_Rudder_Th.Data_Output->Cde_Rudder_Output; +modes + manual : initial mode; + auto : mode; + failsafe: mode; +properties + Source_Text => "fly_by_wire/main.c"; +end RecepteurCde_PilotageServo.Impl; + +processor Proc_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; + Dev_Bus : requires bus access Device_Bus.MCU1; + SPI : requires bus access SPI; +end Proc_MCU1; + +-- AADL processor = microprocessor + scheduler +processor implementation Proc_MCU1.Impl +properties + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente +end Proc_MCU1.Impl; + +-- We model the RAM to bind our processes and threads +memory Ram_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; +end Ram_MCU1; + +-- bus that links processors and memories +bus Mem_Bus_MCU1 +end Mem_Bus_MCU1; + +-- MCU1 est charge de la Reception des ordres de la radio-commande, +-- la communication avec MCU0 et le pilotage des servos commandes + +system MCU1 +features + RC_EvtData_Input : in event data port; + AP_EvtData_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--AP: autopilot + D_MCU1_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + SPI_Con : requires bus access SPI; +end MCU1; + +system implementation MCU1.Impl +subcomponents + --declare system subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram : memory Ram_MCU1; + Mem_Bus : bus Mem_Bus_MCU1; + Dev_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; +connections + --bus connections + bus access Mem_Bus -> MCU1_P.Mem_Bus; + bus access Dev_Bus -> MCU1_P.Dev_Bus; + bus access Mem_Bus -> Ram.Mem_Bus; + bus access Dev_Bus -> Recpt_dv.Dev_Bus; + bus access Dev_Bus -> Cpt_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->D_MCU1_Output; + event data port AP_EvtData_Input->Proc_RcptCde_PilotServ.AP_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + +properties + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram applies to Proc_RcptCde_PilotServ; +end MCU1.Impl; +----------------------------------------------------------------- +--determine la pression +device Pression +features + P_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Pression; + +--determine la tension +device Tension -- Alimentation +features + T_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Tension; + +device Compas +features + Compas_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end compas; + +--determine la vitesse de l'air +device Vitesse_Air +features + V_Air_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Vitesse_Air; + +--filme le trajet de la mission +device Camera_Video +features + Video_Output : out data port; -- new data type? + Dev_Bus : requires bus access Device_bus.MCU0; +end Camera_Video; + +-- transmet les donnees a la station sol +device Emetteur +features + Video_Input : in data port;--data type? + Trans_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Trans_Data_Output : out data port; + Video_Output : out data port; + Modem_Bus : requires bus access Modem; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Emetteur; + +-- determine la position du drone +device GPS +features + Error_Output : out event port; + GPS_Output : out event data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end GPS; + +device InfraRed +features + Error_Output : out event port; + IR_Output : out data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end InfraRed; + +-- relie le systeme MCU0 a la station sol +--ce qui permet la transmission de donnes +bus Modem +end Modem; + +-- Ce thread recoit les sigaux GPS et les transforme +-- en donnees utilisables +thread Interruption_GPS +features + GPS_Input : in event data port Data_Types::Stream_Element.Generic; +end Interruption_GPS; + +thread implementation Interruption_GPS.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/gps_ubx.c/parse_ubx"; + Compute_Entrypoint => "__vector_30"; +end Interruption_GPS.Impl; + +thread receive_gps_data_task +features + GPS_Output : out event data port Data_Types::Position.GPS; +end receive_gps_data_task; + +thread implementation receive_gps_data_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "receive_gps_data_task"; + period => 250 ms; --4hz +end receive_gps_data_task.Impl; + + +--controle la navigation de l'avion +thread navigation_task +features + GPS_Data_Input : in event data port Data_Types::Position.GPS; + Altitude_Desiree_Output: out event data port Data_Types::Float; +end navigation_task; + +--Ce thread est declenche a la frequence des informations delivrees +--par le GPS 4Hz, sa periode est de 250 ms +thread implementation navigation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "navigation_task"; + Period=> 250 ms; +end navigation_task.Impl; + +--le thread Navigation est toujours suivi, dans cet ordre, +-- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + +--Controle l'altitude +thread altitude_control_task +features + Altitude_Desiree_Input : in event data port Data_Types::Float;--fourni par navigation + Montee_Desiree_Output : out event data port Data_Types::Float; +end altitude_control_task; + +thread implementation altitude_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint =>"altitude_control_task"; + Period => 250 ms; +end altitude_control_task.Impl; + +--controle la montee +thread climb_control_task +features + Montee_Desiree_Input: in event data port Data_Types::Float;--fourni par Altitude_Ctrl +end climb_control_task; + +thread implementation climb_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "climb_control_task"; + Period => 250 ms; +end climb_control_task.Impl; + +-- Controle la stabilisation et transmet les donnees a MCU1 +thread stabilisation_task +features + IR_Input : in data port Data_Types::Stream_Element.Generic; +end stabilisation_task; + +thread implementation stabilisation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "stabilisation_task"; + Period => 50 ms;--20 hertz; +end stabilisation_task.Impl; + +thread Interruption_SPI_MCU0_1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_1; + +thread implementation Interruption_SPI_MCU0_1.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_17"; + Period=> 50 ms; +end Interruption_SPI_MCU0_1.Impl; + +thread Interruption_SPI_MCU0_2 +features + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU0 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_2; + +thread implementation Interruption_SPI_MCU0_2.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/linf_fbw.c/SIGNAL"; + Compute_Entrypoint => "__vector_12"; + Period=> 50 ms; +end Interruption_SPI_MCU0_2.Impl; + + +thread link_fbw_send +features + MCU0_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end link_fbw_send; + +--ce thread se declenche toujours apres la Stabilisation d'ou sa periode +thread implementation link_fbw_send.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/link_fbw.c"; + Compute_Entrypoint => "link_fbw_send"; + Period => 50 ms;--20Hz +end link_fbw_send.Impl; + +thread radio_control_task +end radio_control_task; + +thread implementation radio_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "radio_control_task"; + Period=> 25 ms; +end radio_control_task.Impl; + +thread reporting_task +features + Data_Output : out data port Data_Types::Inter_mcu_msg.Generic; +end reporting_task; + +thread implementation reporting_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption => Non_Preemptive; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "reporting_task"; + Period=> 100 ms;--10Hz +end reporting_task.Impl; + +thread Interruption_Modem +features + Data_Input : in data port Data_Types::Inter_mcu_msg.Generic; + Data_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_Modem; + +thread implementation Interruption_Modem.Impl +properties + Dispatch_Protocol=> aperiodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/modem.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; +end Interruption_Modem.Impl; + +process Nav_Stab_Control_Proc +features + MCU1_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Param Radio_Cde (mode manuel) + GPS_Input : in event data port Data_Types::Stream_Element.Generic; + GPS_Evt_Input : in event port; + IR_Input : in data port Data_Types::Stream_Element.Generic; + P_Input : in data port Data_Types::Float; + T_Input : in data port Data_Types :: Integer; + Compas_Input : in data port Data_Types::Float; + V_Air_Input : in data port Data_Types:: Integer; + -- donnees transmies a MCU1 + Trans_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + -- donnees transmies a la station sol + Trans_Sol_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Nav_Stab_Control_Proc; + +process implementation Nav_Stab_Control_Proc.Impl +subcomponents + Data_Acq_Filt_Th : thread receive_gps_data_task.Impl; + Alt_Ctrl_Th : thread altitude_control_task.Impl; + Nav_Th : thread navigation_task.Impl; + Climb_Ctrl_Th : thread climb_control_task.Impl; + Stab_Th : thread stabilisation_task.Impl; + Send_MCU1_Th : thread link_fbw_send.Impl; + Send_Grd_Station_Th : thread reporting_task.Impl; + Interrupt_SPI_Th1:thread Interruption_SPI_MCU0_1.Impl; + Interrupt_SPI_Th2:thread Interruption_SPI_MCU0_2.Impl; + Interrupt_Modem_Th: thread Interruption_Modem.Impl; + Interrupt_GPS_Th: thread Interruption_GPS.Impl; + Ctrl_By_RC_Th: thread radio_control_task.Impl; + + --save the autopilot settings + AP_Data : data Data_Types::Inter_mcu_msg.Generic; +connections + + event data port GPS_Input->Interrupt_GPS_Th.GPS_Input; + event data port Data_Acq_Filt_Th.GPS_Output->Nav_Th.GPS_Data_Input; + event data port Nav_Th.Altitude_Desiree_Output->Alt_Ctrl_Th.Altitude_Desiree_Input in modes (auto, home); + event data port Alt_Ctrl_Th.Montee_Desiree_Output->Climb_Ctrl_Th.Montee_Desiree_Input in modes (auto, home); + + data port IR_Input->Stab_Th.IR_Input; + + event data port Send_MCU1_Th.MCU0_Send_Output->Interrupt_SPI_Th1.Evt_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th1.Data_Send_SPI_Output->Interrupt_SPI_Th2.Data_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th2.Data_Send_SPI_Output->Trans_MCU0_Output in modes(auto,home,manual); + + event data port MCU1_Data_Input->Interrupt_SPI_Th1.Evt_Rec_SPI_Input in modes(manual); + event data port Interrupt_SPI_Th1.Data_Rec_MCU0_Output->Interrupt_SPI_Th2.Data_Rec_MCU0_Input in modes(manual); + + data port Send_Grd_Station_Th.Data_Output->Interrupt_Modem_Th.Data_Input in modes (auto,manual,home); + event data port Interrupt_Modem_Th.Data_Output->Trans_Sol_Output in modes (auto,manual,home); + +modes + manual : initial mode; + auto : mode; + home : mode; +properties + Source_Text => "autopilot/mainloop.c"; +end Nav_Stab_Control_Proc.Impl; + +processor Proc_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; + Dev_Bus : requires bus access Device_Bus.MCU0; + SPI : requires bus access SPI; +end Proc_MCU0; + +processor implementation Proc_MCU0.Impl +properties + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe +end Proc_MCU0.Impl; + +memory Ram_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; +end Ram_MCU0; + +bus Mem_Bus_MCU0 +end Mem_Bus_MCU0; + +---------------------------------------------------------------- +-- we model a bus to link the systems +bus SPI +end SPI; + +system system_papabench +features + RC_EvtData_Input : in event data port; +end system_papabench; + +system implementation system_papabench.Impl +subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram1 : memory Ram_MCU1; + Mem1_Bus : bus Mem_Bus_MCU1; + Dev1_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; + + --MCU0 + MCU0_P : processor Proc_MCU0.Impl; + Ram0 : memory Ram_MCU0; + Mem0_Bus: bus Mem_Bus_MCU0; + P_dv : device Pression; + T_dv : device Tension; + Compas_dv : device Compas; + V_Air_dv : device Vitesse_Air; + Cam_dv : device Camera_Video; + Emet_dv : device Emetteur; + GPS_dv : device GPS; + IR_dv : device InfraRed; + Dev0_Bus : bus Device_Bus.MCU0; + Modem_Bus : bus Modem; + N_S_C_proc : process Nav_Stab_Control_Proc.Impl; + + SPI : bus SPI; +connections + --bus connections + bus access Mem1_Bus -> MCU1_P.Mem_Bus; + bus access Dev1_Bus -> MCU1_P.Dev_Bus; + bus access SPI -> MCU1_P.SPI; + bus access Dev1_Bus -> Recpt_dv.Dev_Bus; + bus access Dev1_Bus -> Cpt_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorR_dv.Dev_Bus; + + bus access Mem0_Bus->MCU0_P.Mem_Bus; + bus access Mem0_Bus->Ram0.Mem_Bus; + bus access SPI->MCU0_P.SPI; + bus access Dev0_Bus->MCU0_P.Dev_Bus; + bus access Dev0_Bus->P_dv.Dev_Bus; + bus access Dev0_Bus->T_dv.Dev_Bus; + bus access Dev0_Bus->Compas_dv.Dev_Bus; + bus access Dev0_Bus->V_Air_dv.Dev_Bus; + bus access Dev0_Bus->Cam_dv.Dev_Bus; + bus access Dev0_Bus->Emet_dv.Dev_Bus; + bus access Modem_Bus->Emet_dv.Modem_Bus; + bus access Dev0_Bus->GPS_dv.Dev_Bus; + bus access Dev0_Bus->IR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + + data port P_dv.P_Output->N_S_C_proc.P_Input; + data port T_dv.T_Output->N_S_C_proc.T_Input; + data port Compas_dv.Compas_Output->N_S_C_proc.Compas_Input; + data port V_Air_dv.V_Air_Output->N_S_C_proc.V_Air_Input; + data port IR_dv.IR_Output->N_S_C_proc.IR_Input; + event data port GPS_dv.GPS_Output->N_S_C_proc.GPS_Input; + event port GPS_dv.Error_Output->N_S_C_proc.GPS_Evt_Input; + + event data port N_S_C_proc.Trans_Sol_Output->Emet_dv.Trans_Data_Input; + data port Cam_dv.Video_Output->Emet_dv.Video_Input; + + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->N_S_C_proc.MCU1_Data_Input; + event data port N_S_C_proc.Trans_MCU0_Output->Proc_RcptCde_PilotServ.AP_Cdes_Input; +properties + Actual_Processor_Binding => reference MCU0_P applies to N_S_C_Proc; + Actual_Memory_Binding => reference Ram0 applies to N_S_C_Proc; + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram1 applies to Proc_RcptCde_PilotServ; +end system_papabench.Impl; diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aadl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aadl new file mode 100644 index 0000000..eae0fc2 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aadl @@ -0,0 +1,1048 @@ +-- le projet paprazzi s'interesse a la realisation +-- d'un micro-drone autonome a bas cout. +-- le systeme embarque est constitue de +-- 1.recepteurs (HF(pour radio commande) +-- 2.capteurs infrarouge et GPS +-- 3.camera video +-- 4.modem +-- 5.emetteur +-- 6.deux microcontroleurs (MCU0, MCU1) + +--les taches sont soit periodiques +--et les interruptions sont periodiques +--N.B: le choix du Scheduling_Protocol du processeur indique si +--la preemption est autorisee ou non +--on donnera plus tard l'ordonnancement avec ou sans preemption + +--taches MCU1: +--Reception Radio Command +--Send Servos Commands +--Send Message to MCU0 +--Interruptions: +--Receive/Send Data via SPI +--Servos Interruptions (6 interruptions) + +--Taches MCU0 +--radio command task +--navigation +--climb control +--altitude control +--Receive GPS position +--stabilisation +--Send message to MCU1 +--Receive Message from MCU1 +--Send Data to ground station +--Interruptions +--Send/Receive via SPI +--Modem Interruption +------------------------------------------ +package Data_Types +public + data Integer + properties + Source_Data_Size => 8 bits; + end Integer; + + data Boolean + properties + Source_Data_Size => 8 bits; + end Boolean; + + data Integer_16 + properties + Source_Data_Size =>16 bits; + end Integer_16; + + data Float + properties + Source_Data_Size => 32 bits; + end Float; + + subprogram Get_Integer + features + Result : out parameter Integer; + end Get_Integer; + + subprogram Set_Integer + features + Int : in parameter Integer; + end Set_Integer; + + subprogram Get_Integer16 + features + Result : out parameter Integer_16; + end Get_Integer16; + + subprogram Set_Integer16 + features + Int : in parameter Integer_16; + end Set_Integer16; + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + data Lat_Long + features + Get_Degs : subprogram Get_Integer; + Set_Degs : subprogram Set_Integer; + Get_Mins : subprogram Get_Integer; + Set_Mins : subprogram Set_Integer; + Get_Secs : subprogram Get_Integer; + Set_Secs : subprogram Set_Integer; + end Lat_Long; + + data implementation Lat_Long.Generic + subcomponents + Degs : data Integer; + Mins : data Integer; + Secs : data Integer; + end Lat_Long.Generic; + + -- The Position type specifies a position + data Position + end Position; + + -- This data type represents the position + data implementation Position.simple + subcomponents + Latitude : data Lat_long.generic; + Longitude : data Lat_long.generic; + end Position.simple; + + -- The data type that represents GPS sensor data + + data implementation Position.GPS extends Position.simple + subcomponents + Altitude : data Integer; + Cap : data Integer; + end Position.GPS; + + data Stream_Element + end Stream_Element; + + data implementation Stream_Element.Generic + properties + Source_Data_Size => 8bits; + end Stream_Element.Generic; + + data Tab + end Tab; + data Tableau extends Tab + features + Get_Data0 : subprogram Get_Integer16; + Set_Data0 : subprogram Set_Integer16; + Get_Data1 : subprogram Get_Integer16; + Set_Data1 : subprogram Set_Integer16; + Get_Data2 : subprogram Get_Integer16; + Set_Data2 : subprogram Set_Integer16; + Get_Data3 : subprogram Get_Integer16; + Set_Data3 : subprogram Set_Integer16; + Get_Data4 : subprogram Get_Integer16; + Set_Data4 : subprogram Set_Integer16; + Get_Data5 : subprogram Get_Integer16; + Set_Data5 : subprogram Set_Integer16; + Get_Data6 : subprogram Get_Integer16; + Set_Data6 : subprogram Set_Integer16; + Get_Data7 : subprogram Get_Integer16; + Set_Data7 : subprogram Set_Integer16; + Get_Data8 : subprogram Get_Integer16; + Set_Data8 : subprogram Set_Integer16; + end Tableau; + + data implementation Tableau.Generic + subcomponents + data_0 : data Integer_16; + data_1 : data Integer_16; + data_2 : data Integer_16; + data_3 : data Integer_16; + data_4 : data Integer_16; + data_5 : data Integer_16; + data_6 : data Integer_16; + data_7 : data Integer_16; + data_8 : data Integer_16; + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + end Tableau.Generic; + + data TabServos extends Tab + features + Get_MotorL : subprogram Get_Integer16; + Set_MotorL : subprogram Set_Integer16; + Get_MotorR : subprogram Get_Integer16; + Set_MotorR : subprogram Set_Integer16; + Get_AileronL : subprogram Get_Integer16; + Set_AileronL : subprogram Set_Integer16; + Get_AileronR : subprogram Get_Integer16; + Set_AileronR : subprogram Set_Integer16; + Get_Rudder : subprogram Get_Integer16; + Set_Rudder : subprogram Set_Integer16; + Get_Elevator : subprogram Get_Integer16; + Set_Elevator : subprogram Set_Integer16; + end TabServos; + + data Implementation TabServos.Impl + subcomponents + MotorL: data Integer_16; + MotorR: data Integer_16; + AileronL: data Integer_16; + AileronR: data Integer_16; + Rudder: data Integer_16; + Elevator: data Integer_16; + end TabServos.Impl; + + data inter_mcu_msg + features + Set_Ppm : subprogram Set_Integer; + Get_Ppm : subprogram Get_Integer; + Set_Status : subprogram Set_Integer; + Get_Status : subprogram Get_Integer; + Set_NbErr : subprogram Set_Integer; + Get_NbErr : subprogram Get_Integer; + Set_Vsupply : subprogram Set_Integer; + Get_Vsupply : subprogram Get_Integer; + end inter_mcu_msg; + + data implementation Inter_mcu_msg.Generic + subcomponents + channels : data Tableau.Generic; + ppm_cpt : data Integer; + satus : data Integer; + nb_err : data Integer; + vsupply : data Integer; + end Inter_mcu_msg.generic; +end Data_Types; +--------------------------------------------------------------- +-- We model a bus that connects our devices to the processor +bus Device_Bus +end Device_Bus; + +bus implementation Device_Bus.MCU0 +end Device_Bus.MCU0; + +bus implementation Device_Bus.MCU1 +end Device_Bus.MCU1; + +device Compteur +features + Data_Elev_Input : in data port Data_Types::Integer_16; + Data_AilL_Input : in data port Data_Types::Integer_16; + Data_AilR_Input : in data port Data_Types::Integer_16; + Data_MotorL_Input : in data port Data_Types::Integer_16; + Data_MotorR_Input : in data port Data_Types::Integer_16; + Data_Rudder_Input : in data port Data_Types::Integer_16; + Data_Elev_Output : out data port Data_Types::Integer_16; + Data_AilL_Output : out data port Data_Types::Integer_16; + Data_AilR_Output : out data port Data_Types::Integer_16; + Data_MotorL_Output : out data port Data_Types::Integer_16; + Data_MotorR_Output : out data port Data_Types::Integer_16; + Data_Rudder_Output : out data port Data_Types::Integer_16; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Compteur; + +device Servo +features + Data_Input : in data port Data_Types::Integer_16; + Dev_bus : requires bus access Device_Bus.MCU1; +end Servo; + +device Recepteur +features + RC_Input : in event data port; + RC_Output : out event data port; + RC_Evt_Output : out event port; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Recepteur; + + +--this thread gets the data from the Radio Commande (RC) +--il definit les interruptions provenant de la RC +--il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! +-- au moins il faut que cette tache soit sporadic +--sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement +--mais le temps entre deux dispatch successifs ne doit pas etre < a la periode +thread Interruption_Radio +features + RC_Evt_Input : in event data port; +end Interruption_Radio; + +thread implementation Interruption_Radio.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/ppm.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; + Period =>25 ms; +end Interruption_Radio.Impl; + +thread test_ppm_task +end test_ppm_task; + +thread implementation test_ppm_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "test_ppm_task"; + Period =>25 ms;--Periode deduite de PPM.h >> PPM_FREQ +end test_ppm_task.Impl; + +thread check_mega128_values_task +end check_mega128_values_task; + +thread implementation check_mega128_values_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_mega128_values_task"; + Period=> 50 ms;--20Hz +end check_mega128_values_task.Impl; + +thread check_failsafe_task +end check_failsafe_task; + +thread implementation check_failsafe_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_failsafe_task"; + Period=> 50 ms;--20Hz +end check_failsafe_task.Impl; + +--Ce thread gere l'interruption d'envoi des parametres au servos +thread Interruption_Envoi_Servo +features + Signal_Input: in event data port Data_Types::TabServos.Impl; + Data_Output : out data port Data_Types::Integer_16; +end Interruption_Envoi_Servo; + +thread implementation Interruption_Envoi_Servo.Elevator +calls { + Elevator_Value: subprogram Data_Types::TabServos.Get_Elevator;}; +connections + parameter Elevator_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 50 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.Elevator; + +thread implementation Interruption_Envoi_Servo.MotorL +calls { + MotorL_Value: subprogram Data_Types::TabServos.Get_MotorL;}; +connections + parameter MotorL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 52 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.MotorL; + +thread implementation Interruption_Envoi_Servo.MotorR +calls { + MotorR_Value: subprogram Data_Types::TabServos.Get_MotorR;}; +connections + parameter MotorR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 54 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.MotorR; + +thread implementation Interruption_Envoi_Servo.AileronL +calls { + AileronL_Value: subprogram Data_Types::TabServos.Get_AileronL;}; +connections + parameter AileronL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 56 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.AileronL; + +thread implementation Interruption_Envoi_Servo.AileronR +calls { + AileronR_Value: subprogram Data_Types::TabServos.Get_AileronR;}; +connections + parameter AileronR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 58 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.AileronR; + +thread implementation Interruption_Envoi_Servo.Rudder +calls { + Rudder_Value: subprogram Data_Types::TabServos.Get_Rudder;}; +connections + parameter Rudder_Value.Result->Data_Output; +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; + Period=> 60 ms;--la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos +end Interruption_Envoi_Servo.Rudder; + + +--this thread gets the flight parameters and transmit them to the Counter +--fonction servo_transmit +thread servo_transmit +end servo_transmit; + +thread implementation servo_transmit.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/servo.c"; + Compute_Entrypoint => "servo_transmit"; + Period => 50ms;--20Hz; +end servo_transmit.Impl; + +--envoi reception signaux via SPI +thread Interruption_SPI_MCU1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU1_Output: out data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU1 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; + AP_Evt_Output : out event port; +end Interruption_SPI_MCU1; + +thread implementation Interruption_SPI_MCU1.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_10"; + Period=> 25 ms; +end Interruption_SPI_MCU1.Impl; + +--this thread sends data to and receives data from MCU0 +thread send_data_to_autopilot_task +features + MCU1_Data_Input : in data port Data_Types::Tableau.Generic; + MCU1_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + Radio_Ok_Input : in data port Data_Types::Boolean; + Radio_Really_Lost_Input : in data port Data_Types::Boolean; +end send_data_to_autopilot_task; + +thread implementation send_data_to_autopilot_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "send_data_to_autopilot_task"; + Period => 25 ms; --meme periode que reception_Decodage +end send_data_to_autopilot_task.Impl; + +process RecepteurCde_PilotageServo +features + Radio_Cdes_Input : in event data port; + RC_Evt_Input : in event port; + AP_Cdes_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Autopilot Input + Cdes_Vol_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--data transmission to MCU0 + + Cde_Elevator_Output : out data port Data_Types::Integer_16; + Cde_MotorL_Output : out data port Data_Types::Integer_16; + Cde_MotorR_Output : out data port Data_Types::Integer_16; + Cde_AileronL_Output : out data port Data_Types::Integer_16; + Cde_AileronR_Output : out data port Data_Types::Integer_16; + Cde_Rudder_Output : out data port Data_Types::Integer_16; +end RecepteurCde_PilotageServo; + +process implementation RecepteurCde_PilotageServo.Impl +subcomponents + Rec_Dec_Th : thread test_ppm_task.Impl; + Send_Th : thread send_data_to_autopilot_task.Impl; + Pilot_Serv_Th : thread servo_transmit.Impl; + Check_Ap_Th : thread check_mega128_values_task.Impl; + Check_Fail_Th: thread check_failsafe_task.Impl; + + Interrupt_Elevator_Th:thread Interruption_Envoi_Servo.Elevator; + Interrupt_MotorL_Th:thread Interruption_Envoi_Servo.MotorL; + Interrupt_MotorR_Th:thread Interruption_Envoi_Servo.MotorR; + Interrupt_AileronL_Th:thread Interruption_Envoi_Servo.AileronL; + Interrupt_AileronR_Th:thread Interruption_Envoi_Servo.AileronR; + Interrupt_Rudder_Th:thread Interruption_Envoi_Servo.Rudder; + + Interrupt_SPI_1: thread Interruption_SPI_MCU1; + Interrupt_RC_Th: thread Interruption_Radio.Impl; + + --System Settings + System_Mode : data Data_Types::Boolean; + Radio_Ok : data Data_Types::Boolean; + Radio_Really_Lost : data Data_Types::Boolean; + Mega128_Ok : data Data_Types::Boolean; +connections + event data port Radio_Cdes_Input-> Interrupt_RC_Th.RC_Evt_Input in modes (manual); + event data port Send_Th.MCU1_Send_Output->Interrupt_SPI_1.Evt_Send_SPI_Input in modes(manual); + event data port Interrupt_SPI_1.Data_Send_SPI_Output->Cdes_Vol_Output in modes(manual); + + event data port AP_Cdes_Input->Interrupt_SPI_1.Evt_Rec_SPI_Input in modes (auto,manual); + + data port Interrupt_Elevator_Th.Data_Output->Cde_Elevator_Output; + data port Interrupt_MotorL_Th.Data_Output->Cde_MotorL_Output; + data port Interrupt_MotorR_Th.Data_Output->Cde_MotorR_Output; + data port Interrupt_AileronL_Th.Data_Output->Cde_AileronL_Output; + data port Interrupt_AileronR_Th.Data_Output->Cde_AileronR_Output; + data port Interrupt_Rudder_Th.Data_Output->Cde_Rudder_Output; +modes + manual : initial mode; + auto : mode; + failsafe: mode; +properties + Source_Text => "fly_by_wire/main.c"; +end RecepteurCde_PilotageServo.Impl; + +processor Proc_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; + Dev_Bus : requires bus access Device_Bus.MCU1; + SPI : requires bus access SPI; +end Proc_MCU1; + +-- AADL processor = microprocessor + scheduler +processor implementation Proc_MCU1.Impl +properties + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente +end Proc_MCU1.Impl; + +-- We model the RAM to bind our processes and threads +memory Ram_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; +end Ram_MCU1; + +-- bus that links processors and memories +bus Mem_Bus_MCU1 +end Mem_Bus_MCU1; + +-- MCU1 est charge de la Reception des ordres de la radio-commande, +-- la communication avec MCU0 et le pilotage des servos commandes + +system MCU1 +features + RC_EvtData_Input : in event data port; + AP_EvtData_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--AP: autopilot + D_MCU1_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + SPI_Con : requires bus access SPI; +end MCU1; + +system implementation MCU1.Impl +subcomponents + --declare system subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram : memory Ram_MCU1; + Mem_Bus : bus Mem_Bus_MCU1; + Dev_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; +connections + --bus connections + bus access Mem_Bus -> MCU1_P.Mem_Bus; + bus access Dev_Bus -> MCU1_P.Dev_Bus; + bus access Mem_Bus -> Ram.Mem_Bus; + bus access Dev_Bus -> Recpt_dv.Dev_Bus; + bus access Dev_Bus -> Cpt_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->D_MCU1_Output; + event data port AP_EvtData_Input->Proc_RcptCde_PilotServ.AP_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + +properties + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram applies to Proc_RcptCde_PilotServ; +end MCU1.Impl; +----------------------------------------------------------------- +--determine la pression +device Pression +features + P_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Pression; + +--determine la tension +device Tension -- Alimentation +features + T_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Tension; + +device Compas +features + Compas_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end compas; + +--determine la vitesse de l'air +device Vitesse_Air +features + V_Air_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Vitesse_Air; + +--filme le trajet de la mission +device Camera_Video +features + Video_Output : out data port; -- new data type? + Dev_Bus : requires bus access Device_bus.MCU0; +end Camera_Video; + +-- transmet les donnees a la station sol +device Emetteur +features + Video_Input : in data port;--data type? + Trans_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Trans_Data_Output : out data port; + Video_Output : out data port; + Modem_Bus : requires bus access Modem; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Emetteur; + +-- determine la position du drone +device GPS +features + Error_Output : out event port; + GPS_Output : out event data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end GPS; + +device InfraRed +features + Error_Output : out event port; + IR_Output : out data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end InfraRed; + +-- relie le systeme MCU0 a la station sol +--ce qui permet la transmission de donnes +bus Modem +end Modem; + +-- Ce thread recoit les sigaux GPS et les transforme +-- en donnees utilisables +thread Interruption_GPS +features + GPS_Input : in event data port Data_Types::Stream_Element.Generic; +end Interruption_GPS; + +thread implementation Interruption_GPS.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "autopilot/gps_ubx.c/parse_ubx"; + Compute_Entrypoint => "__vector_30"; + period=> 250 ms; +end Interruption_GPS.Impl; + +thread receive_gps_data_task +features + GPS_Output : out event data port Data_Types::Position.GPS; +end receive_gps_data_task; + +thread implementation receive_gps_data_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "receive_gps_data_task"; + period => 250 ms; --4hz +end receive_gps_data_task.Impl; + + +--controle la navigation de l'avion +thread navigation_task +features + GPS_Data_Input : in event data port Data_Types::Position.GPS; + Altitude_Desiree_Output: out event data port Data_Types::Float; +end navigation_task; + +--Ce thread est declenche a la frequence des informations delivrees +--par le GPS 4Hz, sa periode est de 250 ms +thread implementation navigation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "navigation_task"; + Period=> 250 ms; +end navigation_task.Impl; + +--le thread Navigation est toujours suivi, dans cet ordre, +-- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + +--Controle l'altitude +thread altitude_control_task +features + Altitude_Desiree_Input : in event data port Data_Types::Float;--fourni par navigation + Montee_Desiree_Output : out event data port Data_Types::Float; +end altitude_control_task; + +thread implementation altitude_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint =>"altitude_control_task"; + Period => 250 ms; +end altitude_control_task.Impl; + +--controle la montee +thread climb_control_task +features + Montee_Desiree_Input: in event data port Data_Types::Float;--fourni par Altitude_Ctrl +end climb_control_task; + +thread implementation climb_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "climb_control_task"; + Period => 250 ms; +end climb_control_task.Impl; + +-- Controle la stabilisation et transmet les donnees a MCU1 +thread stabilisation_task +features + IR_Input : in data port Data_Types::Stream_Element.Generic; +end stabilisation_task; + +thread implementation stabilisation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "stabilisation_task"; + Period => 50 ms;--20 hertz; +end stabilisation_task.Impl; + +thread Interruption_SPI_MCU0_1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_1; + +thread implementation Interruption_SPI_MCU0_1.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_17"; + Period=> 50 ms; +end Interruption_SPI_MCU0_1.Impl; + +thread Interruption_SPI_MCU0_2 +features + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU0 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_2; + +thread implementation Interruption_SPI_MCU0_2.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/linf_fbw.c/SIGNAL"; + Compute_Entrypoint => "__vector_12"; + Period=> 50 ms; +end Interruption_SPI_MCU0_2.Impl; + + +thread link_fbw_send +features + MCU0_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end link_fbw_send; + +--ce thread se declenche toujours apres la Stabilisation d'ou sa periode +thread implementation link_fbw_send.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/link_fbw.c"; + Compute_Entrypoint => "link_fbw_send"; + Period => 50 ms;--20Hz +end link_fbw_send.Impl; + +thread radio_control_task +end radio_control_task; + +thread implementation radio_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "radio_control_task"; + Period=> 25 ms; +end radio_control_task.Impl; + +thread reporting_task +features + Data_Output : out data port Data_Types::Inter_mcu_msg.Generic; +end reporting_task; + +thread implementation reporting_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption => Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "reporting_task"; + Period=> 100 ms;--10Hz +end reporting_task.Impl; + +thread Interruption_Modem +features + Data_Input : in data port Data_Types::Inter_mcu_msg.Generic; + Data_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_Modem; + +thread implementation Interruption_Modem.Impl +properties + Dispatch_Protocol=> periodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "autopilot/modem.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; + Period=> 100 ms; +end Interruption_Modem.Impl; + +process Nav_Stab_Control_Proc +features + MCU1_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Param Radio_Cde (mode manuel) + GPS_Input : in event data port Data_Types::Stream_Element.Generic; + GPS_Evt_Input : in event port; + IR_Input : in data port Data_Types::Stream_Element.Generic; + P_Input : in data port Data_Types::Float; + T_Input : in data port Data_Types :: Integer; + Compas_Input : in data port Data_Types::Float; + V_Air_Input : in data port Data_Types:: Integer; + -- donnees transmies a MCU1 + Trans_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + -- donnees transmies a la station sol + Trans_Sol_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Nav_Stab_Control_Proc; + +process implementation Nav_Stab_Control_Proc.Impl +subcomponents + Data_Acq_Filt_Th : thread receive_gps_data_task.Impl; + Alt_Ctrl_Th : thread altitude_control_task.Impl; + Nav_Th : thread navigation_task.Impl; + Climb_Ctrl_Th : thread climb_control_task.Impl; + Stab_Th : thread stabilisation_task.Impl; + Send_MCU1_Th : thread link_fbw_send.Impl; + Send_Grd_Station_Th : thread reporting_task.Impl; + Interrupt_SPI_Th1:thread Interruption_SPI_MCU0_1.Impl; + Interrupt_SPI_Th2:thread Interruption_SPI_MCU0_2.Impl; + Interrupt_Modem_Th: thread Interruption_Modem.Impl; + Interrupt_GPS_Th: thread Interruption_GPS.Impl; + Ctrl_By_RC_Th: thread radio_control_task.Impl; + + --save the autopilot settings + AP_Data : data Data_Types::Inter_mcu_msg.Generic; +connections + + event data port GPS_Input->Interrupt_GPS_Th.GPS_Input; + event data port Data_Acq_Filt_Th.GPS_Output->Nav_Th.GPS_Data_Input; + event data port Nav_Th.Altitude_Desiree_Output->Alt_Ctrl_Th.Altitude_Desiree_Input in modes (auto, home); + event data port Alt_Ctrl_Th.Montee_Desiree_Output->Climb_Ctrl_Th.Montee_Desiree_Input in modes (auto, home); + + data port IR_Input->Stab_Th.IR_Input; + + event data port Send_MCU1_Th.MCU0_Send_Output->Interrupt_SPI_Th1.Evt_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th1.Data_Send_SPI_Output->Interrupt_SPI_Th2.Data_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th2.Data_Send_SPI_Output->Trans_MCU0_Output in modes(auto,home,manual); + + event data port MCU1_Data_Input->Interrupt_SPI_Th1.Evt_Rec_SPI_Input in modes(manual); + event data port Interrupt_SPI_Th1.Data_Rec_MCU0_Output->Interrupt_SPI_Th2.Data_Rec_MCU0_Input in modes(manual); + + data port Send_Grd_Station_Th.Data_Output->Interrupt_Modem_Th.Data_Input in modes (auto,manual,home); + event data port Interrupt_Modem_Th.Data_Output->Trans_Sol_Output in modes (auto,manual,home); + +modes + manual : initial mode; + auto : mode; + home : mode; +properties + Source_Text => "autopilot/mainloop.c"; +end Nav_Stab_Control_Proc.Impl; + +processor Proc_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; + Dev_Bus : requires bus access Device_Bus.MCU0; + SPI : requires bus access SPI; +end Proc_MCU0; + +processor implementation Proc_MCU0.Impl +properties + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe +end Proc_MCU0.Impl; + +memory Ram_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; +end Ram_MCU0; + +bus Mem_Bus_MCU0 +end Mem_Bus_MCU0; + +---------------------------------------------------------------- +-- we model a bus to link the systems +bus SPI +end SPI; + +system system_papabench +features + RC_EvtData_Input : in event data port; +end system_papabench; + +system implementation system_papabench.Impl +subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram1 : memory Ram_MCU1; + Mem1_Bus : bus Mem_Bus_MCU1; + Dev1_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; + + --MCU0 + MCU0_P : processor Proc_MCU0.Impl; + Ram0 : memory Ram_MCU0; + Mem0_Bus: bus Mem_Bus_MCU0; + P_dv : device Pression; + T_dv : device Tension; + Compas_dv : device Compas; + V_Air_dv : device Vitesse_Air; + Cam_dv : device Camera_Video; + Emet_dv : device Emetteur; + GPS_dv : device GPS; + IR_dv : device InfraRed; + Dev0_Bus : bus Device_Bus.MCU0; + Modem_Bus : bus Modem; + N_S_C_proc : process Nav_Stab_Control_Proc.Impl; + + SPI : bus SPI; +connections + --bus connections + bus access Mem1_Bus -> MCU1_P.Mem_Bus; + bus access Dev1_Bus -> MCU1_P.Dev_Bus; + bus access SPI -> MCU1_P.SPI; + bus access Dev1_Bus -> Recpt_dv.Dev_Bus; + bus access Dev1_Bus -> Cpt_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorR_dv.Dev_Bus; + + bus access Mem0_Bus->MCU0_P.Mem_Bus; + bus access Mem0_Bus->Ram0.Mem_Bus; + bus access SPI->MCU0_P.SPI; + bus access Dev0_Bus->MCU0_P.Dev_Bus; + bus access Dev0_Bus->P_dv.Dev_Bus; + bus access Dev0_Bus->T_dv.Dev_Bus; + bus access Dev0_Bus->Compas_dv.Dev_Bus; + bus access Dev0_Bus->V_Air_dv.Dev_Bus; + bus access Dev0_Bus->Cam_dv.Dev_Bus; + bus access Dev0_Bus->Emet_dv.Dev_Bus; + bus access Modem_Bus->Emet_dv.Modem_Bus; + bus access Dev0_Bus->GPS_dv.Dev_Bus; + bus access Dev0_Bus->IR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + + data port P_dv.P_Output->N_S_C_proc.P_Input; + data port T_dv.T_Output->N_S_C_proc.T_Input; + data port Compas_dv.Compas_Output->N_S_C_proc.Compas_Input; + data port V_Air_dv.V_Air_Output->N_S_C_proc.V_Air_Input; + data port IR_dv.IR_Output->N_S_C_proc.IR_Input; + event data port GPS_dv.GPS_Output->N_S_C_proc.GPS_Input; + event port GPS_dv.Error_Output->N_S_C_proc.GPS_Evt_Input; + + event data port N_S_C_proc.Trans_Sol_Output->Emet_dv.Trans_Data_Input; + data port Cam_dv.Video_Output->Emet_dv.Video_Input; + + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->N_S_C_proc.MCU1_Data_Input; + event data port N_S_C_proc.Trans_MCU0_Output->Proc_RcptCde_PilotServ.AP_Cdes_Input; +properties + Actual_Processor_Binding => reference MCU0_P applies to N_S_C_Proc; + Actual_Memory_Binding => reference Ram0 applies to N_S_C_Proc; + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram1 applies to Proc_RcptCde_PilotServ; +end system_papabench.Impl; diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aadl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aadl new file mode 100644 index 0000000..12e87dd --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aadl @@ -0,0 +1,1038 @@ +-- le projet paprazzi s'interesse a la realisation +-- d'un micro-drone autonome a bas cout. +-- le systeme embarque est constitue de +-- 1.recepteurs (HF(pour radio commande) +-- 2.capteurs infrarouge et GPS +-- 3.camera video +-- 4.modem +-- 5.emetteur +-- 6.deux microcontroleurs (MCU0, MCU1) + +--les taches sont soit periodiques +--et les interruptions sont periodiques +--N.B: le choix du Scheduling_Protocol du processeur indique si +--la preemption est autorisee ou non +--on donnera plus tard l'ordonnancement avec ou sans preemption + +--taches MCU1: +--Reception Radio Command +--Send Servos Commands +--Send Message to MCU0 +--Interruptions: +--Receive/Send Data via SPI +--Servos Interruptions (6 interruptions) + +--Taches MCU0 +--radio command task +--navigation +--climb control +--altitude control +--Receive GPS position +--stabilisation +--Send message to MCU1 +--Receive Message from MCU1 +--Send Data to ground station +--Interruptions +--Send/Receive via SPI +--Modem Interruption +------------------------------------------ +package Data_Types +public + data Integer + properties + Source_Data_Size => 8 bits; + end Integer; + + data Boolean + properties + Source_Data_Size => 8 bits; + end Boolean; + + data Integer_16 + properties + Source_Data_Size =>16 bits; + end Integer_16; + + data Float + properties + Source_Data_Size => 32 bits; + end Float; + + subprogram Get_Integer + features + Result : out parameter Integer; + end Get_Integer; + + subprogram Set_Integer + features + Int : in parameter Integer; + end Set_Integer; + + subprogram Get_Integer16 + features + Result : out parameter Integer_16; + end Get_Integer16; + + subprogram Set_Integer16 + features + Int : in parameter Integer_16; + end Set_Integer16; + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + data Lat_Long + features + Get_Degs : subprogram Get_Integer; + Set_Degs : subprogram Set_Integer; + Get_Mins : subprogram Get_Integer; + Set_Mins : subprogram Set_Integer; + Get_Secs : subprogram Get_Integer; + Set_Secs : subprogram Set_Integer; + end Lat_Long; + + data implementation Lat_Long.Generic + subcomponents + Degs : data Integer; + Mins : data Integer; + Secs : data Integer; + end Lat_Long.Generic; + + -- The Position type specifies a position + data Position + end Position; + + -- This data type represents the position + data implementation Position.simple + subcomponents + Latitude : data Lat_long.generic; + Longitude : data Lat_long.generic; + end Position.simple; + + -- The data type that represents GPS sensor data + + data implementation Position.GPS extends Position.simple + subcomponents + Altitude : data Integer; + Cap : data Integer; + end Position.GPS; + + data Stream_Element + end Stream_Element; + + data implementation Stream_Element.Generic + properties + Source_Data_Size => 8bits; + end Stream_Element.Generic; + + data Tab + end Tab; + data Tableau extends Tab + features + Get_Data0 : subprogram Get_Integer16; + Set_Data0 : subprogram Set_Integer16; + Get_Data1 : subprogram Get_Integer16; + Set_Data1 : subprogram Set_Integer16; + Get_Data2 : subprogram Get_Integer16; + Set_Data2 : subprogram Set_Integer16; + Get_Data3 : subprogram Get_Integer16; + Set_Data3 : subprogram Set_Integer16; + Get_Data4 : subprogram Get_Integer16; + Set_Data4 : subprogram Set_Integer16; + Get_Data5 : subprogram Get_Integer16; + Set_Data5 : subprogram Set_Integer16; + Get_Data6 : subprogram Get_Integer16; + Set_Data6 : subprogram Set_Integer16; + Get_Data7 : subprogram Get_Integer16; + Set_Data7 : subprogram Set_Integer16; + Get_Data8 : subprogram Get_Integer16; + Set_Data8 : subprogram Set_Integer16; + end Tableau; + + data implementation Tableau.Generic + subcomponents + data_0 : data Integer_16; + data_1 : data Integer_16; + data_2 : data Integer_16; + data_3 : data Integer_16; + data_4 : data Integer_16; + data_5 : data Integer_16; + data_6 : data Integer_16; + data_7 : data Integer_16; + data_8 : data Integer_16; + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + end Tableau.Generic; + + data TabServos extends Tab + features + Get_MotorL : subprogram Get_Integer16; + Set_MotorL : subprogram Set_Integer16; + Get_MotorR : subprogram Get_Integer16; + Set_MotorR : subprogram Set_Integer16; + Get_AileronL : subprogram Get_Integer16; + Set_AileronL : subprogram Set_Integer16; + Get_AileronR : subprogram Get_Integer16; + Set_AileronR : subprogram Set_Integer16; + Get_Rudder : subprogram Get_Integer16; + Set_Rudder : subprogram Set_Integer16; + Get_Elevator : subprogram Get_Integer16; + Set_Elevator : subprogram Set_Integer16; + end TabServos; + + data Implementation TabServos.Impl + subcomponents + MotorL: data Integer_16; + MotorR: data Integer_16; + AileronL: data Integer_16; + AileronR: data Integer_16; + Rudder: data Integer_16; + Elevator: data Integer_16; + end TabServos.Impl; + + data inter_mcu_msg + features + Set_Ppm : subprogram Set_Integer; + Get_Ppm : subprogram Get_Integer; + Set_Status : subprogram Set_Integer; + Get_Status : subprogram Get_Integer; + Set_NbErr : subprogram Set_Integer; + Get_NbErr : subprogram Get_Integer; + Set_Vsupply : subprogram Set_Integer; + Get_Vsupply : subprogram Get_Integer; + end inter_mcu_msg; + + data implementation Inter_mcu_msg.Generic + subcomponents + channels : data Tableau.Generic; + ppm_cpt : data Integer; + satus : data Integer; + nb_err : data Integer; + vsupply : data Integer; + end Inter_mcu_msg.generic; +end Data_Types; +--------------------------------------------------------------- +-- We model a bus that connects our devices to the processor +bus Device_Bus +end Device_Bus; + +bus implementation Device_Bus.MCU0 +end Device_Bus.MCU0; + +bus implementation Device_Bus.MCU1 +end Device_Bus.MCU1; + +device Compteur +features + Data_Elev_Input : in data port Data_Types::Integer_16; + Data_AilL_Input : in data port Data_Types::Integer_16; + Data_AilR_Input : in data port Data_Types::Integer_16; + Data_MotorL_Input : in data port Data_Types::Integer_16; + Data_MotorR_Input : in data port Data_Types::Integer_16; + Data_Rudder_Input : in data port Data_Types::Integer_16; + Data_Elev_Output : out data port Data_Types::Integer_16; + Data_AilL_Output : out data port Data_Types::Integer_16; + Data_AilR_Output : out data port Data_Types::Integer_16; + Data_MotorL_Output : out data port Data_Types::Integer_16; + Data_MotorR_Output : out data port Data_Types::Integer_16; + Data_Rudder_Output : out data port Data_Types::Integer_16; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Compteur; + +device Servo +features + Data_Input : in data port Data_Types::Integer_16; + Dev_bus : requires bus access Device_Bus.MCU1; +end Servo; + +device Recepteur +features + RC_Input : in event data port; + RC_Output : out event data port; + RC_Evt_Output : out event port; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Recepteur; + + +--this thread gets the data from the Radio Commande (RC) +--il definit les interruptions provenant de la RC +--il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! +-- au moins il faut que cette tache soit sporadic +--sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement +--mais le temps entre deux dispatch successifs ne doit pas etre < a la periode +thread Interruption_Radio +features + RC_Evt_Input : in event data port; +end Interruption_Radio; + +thread implementation Interruption_Radio.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/ppm.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; +end Interruption_Radio.Impl; + +thread test_ppm_task +end test_ppm_task; + +thread implementation test_ppm_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "test_ppm_task"; + Period =>25 ms;--Periode deduite de PPM.h >> PPM_FREQ +end test_ppm_task.Impl; + +thread check_mega128_values_task +end check_mega128_values_task; + +thread implementation check_mega128_values_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_mega128_values_task"; + Period=> 50 ms;--20Hz +end check_mega128_values_task.Impl; + +thread check_failsafe_task +end check_failsafe_task; + +thread implementation check_failsafe_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "check_failsafe_task"; + Period=> 50 ms;--20Hz +end check_failsafe_task.Impl; + +--Ce thread gere l'interruption d'envoi des parametres au servos +thread Interruption_Envoi_Servo +features + Signal_Input: in event data port Data_Types::TabServos.Impl; + Data_Output : out data port Data_Types::Integer_16; +end Interruption_Envoi_Servo; + +thread implementation Interruption_Envoi_Servo.Elevator +calls { + Elevator_Value: subprogram Data_Types::TabServos.Get_Elevator;}; +connections + parameter Elevator_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>Preemptive; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.Elevator; + +thread implementation Interruption_Envoi_Servo.MotorL +calls { + MotorL_Value: subprogram Data_Types::TabServos.Get_MotorL;}; +connections + parameter MotorL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.MotorL; + +thread implementation Interruption_Envoi_Servo.MotorR +calls { + MotorR_Value: subprogram Data_Types::TabServos.Get_MotorR;}; +connections + parameter MotorR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.MotorR; + +thread implementation Interruption_Envoi_Servo.AileronL +calls { + AileronL_Value: subprogram Data_Types::TabServos.Get_AileronL;}; +connections + parameter AileronL_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c"; + Compute_Entrypoint => "SIGNAL(SIG_OUTPUT_COMPARE1A)"; +end Interruption_Envoi_Servo.AileronL; + +thread implementation Interruption_Envoi_Servo.AileronR +calls { + AileronR_Value: subprogram Data_Types::TabServos.Get_AileronR;}; +connections + parameter AileronR_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.AileronR; + +thread implementation Interruption_Envoi_Servo.Rudder +calls { + Rudder_Value: subprogram Data_Types::TabServos.Get_Rudder;}; +connections + parameter Rudder_Value.Result->Data_Output; +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/servo.c/SIGNAL"; + Compute_Entrypoint => "__vector_6"; +end Interruption_Envoi_Servo.Rudder; + + +--this thread gets the flight parameters and transmit them to the Counter +--fonction servo_transmit +thread servo_transmit +end servo_transmit; + +thread implementation servo_transmit.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/servo.c"; + Compute_Entrypoint => "servo_transmit"; + Period => 50ms;--20Hz; +end servo_transmit.Impl; + +--envoi reception signaux via SPI +thread Interruption_SPI_MCU1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU1_Output: out data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU1 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; + AP_Evt_Output : out event port; +end Interruption_SPI_MCU1; + +thread implementation Interruption_SPI_MCU1.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "fly_by_wire/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_10"; +end Interruption_SPI_MCU1.Impl; + +--this thread sends data to and receives data from MCU0 +thread send_data_to_autopilot_task +features + MCU1_Data_Input : in data port Data_Types::Tableau.Generic; + MCU1_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + Radio_Ok_Input : in data port Data_Types::Boolean; + Radio_Really_Lost_Input : in data port Data_Types::Boolean; +end send_data_to_autopilot_task; + +thread implementation send_data_to_autopilot_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "fly_by_wire/main.c"; + Compute_Entrypoint => "send_data_to_autopilot_task"; + Period => 25 ms; --meme periode que reception_Decodage +end send_data_to_autopilot_task.Impl; + +process RecepteurCde_PilotageServo +features + Radio_Cdes_Input : in event data port; + RC_Evt_Input : in event port; + AP_Cdes_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Autopilot Input + Cdes_Vol_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--data transmission to MCU0 + + Cde_Elevator_Output : out data port Data_Types::Integer_16; + Cde_MotorL_Output : out data port Data_Types::Integer_16; + Cde_MotorR_Output : out data port Data_Types::Integer_16; + Cde_AileronL_Output : out data port Data_Types::Integer_16; + Cde_AileronR_Output : out data port Data_Types::Integer_16; + Cde_Rudder_Output : out data port Data_Types::Integer_16; +end RecepteurCde_PilotageServo; + +process implementation RecepteurCde_PilotageServo.Impl +subcomponents + Rec_Dec_Th : thread test_ppm_task.Impl; + Send_Th : thread send_data_to_autopilot_task.Impl; + Pilot_Serv_Th : thread servo_transmit.Impl; + Check_Ap_Th : thread check_mega128_values_task.Impl; + Check_Fail_Th: thread check_failsafe_task.Impl; + + Interrupt_Elevator_Th:thread Interruption_Envoi_Servo.Elevator; + Interrupt_MotorL_Th:thread Interruption_Envoi_Servo.MotorL; + Interrupt_MotorR_Th:thread Interruption_Envoi_Servo.MotorR; + Interrupt_AileronL_Th:thread Interruption_Envoi_Servo.AileronL; + Interrupt_AileronR_Th:thread Interruption_Envoi_Servo.AileronR; + Interrupt_Rudder_Th:thread Interruption_Envoi_Servo.Rudder; + + Interrupt_SPI_1: thread Interruption_SPI_MCU1; + Interrupt_RC_Th: thread Interruption_Radio.Impl; + + --System Settings + System_Mode : data Data_Types::Boolean; + Radio_Ok : data Data_Types::Boolean; + Radio_Really_Lost : data Data_Types::Boolean; + Mega128_Ok : data Data_Types::Boolean; +connections + event data port Radio_Cdes_Input-> Interrupt_RC_Th.RC_Evt_Input in modes (manual); + event data port Send_Th.MCU1_Send_Output->Interrupt_SPI_1.Evt_Send_SPI_Input in modes(manual); + event data port Interrupt_SPI_1.Data_Send_SPI_Output->Cdes_Vol_Output in modes(manual); + + event data port AP_Cdes_Input->Interrupt_SPI_1.Evt_Rec_SPI_Input in modes (auto,manual); + + data port Interrupt_Elevator_Th.Data_Output->Cde_Elevator_Output; + data port Interrupt_MotorL_Th.Data_Output->Cde_MotorL_Output; + data port Interrupt_MotorR_Th.Data_Output->Cde_MotorR_Output; + data port Interrupt_AileronL_Th.Data_Output->Cde_AileronL_Output; + data port Interrupt_AileronR_Th.Data_Output->Cde_AileronR_Output; + data port Interrupt_Rudder_Th.Data_Output->Cde_Rudder_Output; +modes + manual : initial mode; + auto : mode; + failsafe: mode; +properties + Source_Text => "fly_by_wire/main.c"; +end RecepteurCde_PilotageServo.Impl; + +processor Proc_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; + Dev_Bus : requires bus access Device_Bus.MCU1; + SPI : requires bus access SPI; +end Proc_MCU1; + +-- AADL processor = microprocessor + scheduler +processor implementation Proc_MCU1.Impl +properties + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente +end Proc_MCU1.Impl; + +-- We model the RAM to bind our processes and threads +memory Ram_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; +end Ram_MCU1; + +-- bus that links processors and memories +bus Mem_Bus_MCU1 +end Mem_Bus_MCU1; + +-- MCU1 est charge de la Reception des ordres de la radio-commande, +-- la communication avec MCU0 et le pilotage des servos commandes + +system MCU1 +features + RC_EvtData_Input : in event data port; + AP_EvtData_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--AP: autopilot + D_MCU1_Output : out event data port Data_Types::Inter_mcu_msg.Generic; + SPI_Con : requires bus access SPI; +end MCU1; + +system implementation MCU1.Impl +subcomponents + --declare system subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram : memory Ram_MCU1; + Mem_Bus : bus Mem_Bus_MCU1; + Dev_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; +connections + --bus connections + bus access Mem_Bus -> MCU1_P.Mem_Bus; + bus access Dev_Bus -> MCU1_P.Dev_Bus; + bus access Mem_Bus -> Ram.Mem_Bus; + bus access Dev_Bus -> Recpt_dv.Dev_Bus; + bus access Dev_Bus -> Cpt_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_MotorR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->D_MCU1_Output; + event data port AP_EvtData_Input->Proc_RcptCde_PilotServ.AP_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + +properties + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram applies to Proc_RcptCde_PilotServ; +end MCU1.Impl; +----------------------------------------------------------------- +--determine la pression +device Pression +features + P_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Pression; + +--determine la tension +device Tension -- Alimentation +features + T_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Tension; + +device Compas +features + Compas_Output : out data port Data_Types::Float; + Dev_Bus : requires bus access Device_Bus.MCU0; +end compas; + +--determine la vitesse de l'air +device Vitesse_Air +features + V_Air_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Vitesse_Air; + +--filme le trajet de la mission +device Camera_Video +features + Video_Output : out data port; -- new data type? + Dev_Bus : requires bus access Device_bus.MCU0; +end Camera_Video; + +-- transmet les donnees a la station sol +device Emetteur +features + Video_Input : in data port;--data type? + Trans_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Trans_Data_Output : out data port; + Video_Output : out data port; + Modem_Bus : requires bus access Modem; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Emetteur; + +-- determine la position du drone +device GPS +features + Error_Output : out event port; + GPS_Output : out event data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end GPS; + +device InfraRed +features + Error_Output : out event port; + IR_Output : out data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end InfraRed; + +-- relie le systeme MCU0 a la station sol +--ce qui permet la transmission de donnes +bus Modem +end Modem; + +-- Ce thread recoit les sigaux GPS et les transforme +-- en donnees utilisables +thread Interruption_GPS +features + GPS_Input : in event data port Data_Types::Stream_Element.Generic; +end Interruption_GPS; + +thread implementation Interruption_GPS.Impl +properties + Dispatch_Protocol=>aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "autopilot/gps_ubx.c/parse_ubx"; + Compute_Entrypoint => "__vector_30"; +end Interruption_GPS.Impl; + +thread receive_gps_data_task +features + GPS_Output : out event data port Data_Types::Position.GPS; +end receive_gps_data_task; + +thread implementation receive_gps_data_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "receive_gps_data_task"; + period => 250 ms; --4hz +end receive_gps_data_task.Impl; + + +--controle la navigation de l'avion +thread navigation_task +features + GPS_Data_Input : in event data port Data_Types::Position.GPS; + Altitude_Desiree_Output: out event data port Data_Types::Float; +end navigation_task; + +--Ce thread est declenche a la frequence des informations delivrees +--par le GPS 4Hz, sa periode est de 250 ms +thread implementation navigation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "navigation_task"; + Period=> 250 ms; +end navigation_task.Impl; + +--le thread Navigation est toujours suivi, dans cet ordre, +-- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + +--Controle l'altitude +thread altitude_control_task +features + Altitude_Desiree_Input : in event data port Data_Types::Float;--fourni par navigation + Montee_Desiree_Output : out event data port Data_Types::Float; +end altitude_control_task; + +thread implementation altitude_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint =>"altitude_control_task"; + Period => 250 ms; +end altitude_control_task.Impl; + +--controle la montee +thread climb_control_task +features + Montee_Desiree_Input: in event data port Data_Types::Float;--fourni par Altitude_Ctrl +end climb_control_task; + +thread implementation climb_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "climb_control_task"; + Period => 250 ms; +end climb_control_task.Impl; + +-- Controle la stabilisation et transmet les donnees a MCU1 +thread stabilisation_task +features + IR_Input : in data port Data_Types::Stream_Element.Generic; +end stabilisation_task; + +thread implementation stabilisation_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "stabilisation_task"; + Period => 50 ms;--20 hertz; +end stabilisation_task.Impl; + +thread Interruption_SPI_MCU0_1 +features + Evt_Rec_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Evt_Send_SPI_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_1; + +thread implementation Interruption_SPI_MCU0_1.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/spi.c/SIGNAL"; + Compute_Entrypoint => "__vector_17"; + Period=> 50 ms; +end Interruption_SPI_MCU0_1.Impl; + +thread Interruption_SPI_MCU0_2 +features + Data_Rec_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic;--fourni a MCU0 + Data_Send_SPI_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + Data_Send_SPI_Input : in event data port Data_Types::Inter_mcu_msg.Generic; + Data_Rec_MCU0_Input: in event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_SPI_MCU0_2; + +thread implementation Interruption_SPI_MCU0_2.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Non_Preemptive; + Source_Text => "autopilot/linf_fbw.c/SIGNAL"; + Compute_Entrypoint => "__vector_12"; + Period=> 50 ms; +end Interruption_SPI_MCU0_2.Impl; + + +thread link_fbw_send +features + MCU0_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end link_fbw_send; + +--ce thread se declenche toujours apres la Stabilisation d'ou sa periode +thread implementation link_fbw_send.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/link_fbw.c"; + Compute_Entrypoint => "link_fbw_send"; + Period => 50 ms;--20Hz +end link_fbw_send.Impl; + +thread radio_control_task +end radio_control_task; + +thread implementation radio_control_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption=>Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "radio_control_task"; + Period=> 25 ms; +end radio_control_task.Impl; + +thread reporting_task +features + Data_Output : out data port Data_Types::Inter_mcu_msg.Generic; +end reporting_task; + +thread implementation reporting_task.Impl +properties + Dispatch_Protocol=>periodic; + Thread_Properties::Preemption => Time_Sharing_Preemption; + Source_Text => "autopilot/main.c"; + Compute_Entrypoint => "reporting_task"; + Period=> 100 ms;--10Hz +end reporting_task.Impl; + +thread Interruption_Modem +features + Data_Input : in data port Data_Types::Inter_mcu_msg.Generic; + Data_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Interruption_Modem; + +thread implementation Interruption_Modem.Impl +properties + Dispatch_Protocol=> aperiodic; + Thread_Properties::Preemption=>System_Preemption; + Source_Text => "autopilot/modem.c/SIGNAL"; + Compute_Entrypoint => "__vector_5"; +end Interruption_Modem.Impl; + +process Nav_Stab_Control_Proc +features + MCU1_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Param Radio_Cde (mode manuel) + GPS_Input : in event data port Data_Types::Stream_Element.Generic; + GPS_Evt_Input : in event port; + IR_Input : in data port Data_Types::Stream_Element.Generic; + P_Input : in data port Data_Types::Float; + T_Input : in data port Data_Types :: Integer; + Compas_Input : in data port Data_Types::Float; + V_Air_Input : in data port Data_Types:: Integer; + -- donnees transmies a MCU1 + Trans_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic; + -- donnees transmies a la station sol + Trans_Sol_Output : out event data port Data_Types::Inter_mcu_msg.Generic; +end Nav_Stab_Control_Proc; + +process implementation Nav_Stab_Control_Proc.Impl +subcomponents + Data_Acq_Filt_Th : thread receive_gps_data_task.Impl; + Alt_Ctrl_Th : thread altitude_control_task.Impl; + Nav_Th : thread navigation_task.Impl; + Climb_Ctrl_Th : thread climb_control_task.Impl; + Stab_Th : thread stabilisation_task.Impl; + Send_MCU1_Th : thread link_fbw_send.Impl; + Send_Grd_Station_Th : thread reporting_task.Impl; + Interrupt_SPI_Th1:thread Interruption_SPI_MCU0_1.Impl; + Interrupt_SPI_Th2:thread Interruption_SPI_MCU0_2.Impl; + Interrupt_Modem_Th: thread Interruption_Modem.Impl; + Interrupt_GPS_Th: thread Interruption_GPS.Impl; + Ctrl_By_RC_Th: thread radio_control_task.Impl; + + --save the autopilot settings + AP_Data : data Data_Types::Inter_mcu_msg.Generic; +connections + + event data port GPS_Input->Interrupt_GPS_Th.GPS_Input; + event data port Data_Acq_Filt_Th.GPS_Output->Nav_Th.GPS_Data_Input; + event data port Nav_Th.Altitude_Desiree_Output->Alt_Ctrl_Th.Altitude_Desiree_Input in modes (auto, home); + event data port Alt_Ctrl_Th.Montee_Desiree_Output->Climb_Ctrl_Th.Montee_Desiree_Input in modes (auto, home); + + data port IR_Input->Stab_Th.IR_Input; + + event data port Send_MCU1_Th.MCU0_Send_Output->Interrupt_SPI_Th1.Evt_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th1.Data_Send_SPI_Output->Interrupt_SPI_Th2.Data_Send_SPI_Input in modes(auto,home,manual); + event data port Interrupt_SPI_Th2.Data_Send_SPI_Output->Trans_MCU0_Output in modes(auto,home,manual); + + event data port MCU1_Data_Input->Interrupt_SPI_Th1.Evt_Rec_SPI_Input in modes(manual); + event data port Interrupt_SPI_Th1.Data_Rec_MCU0_Output->Interrupt_SPI_Th2.Data_Rec_MCU0_Input in modes(manual); + + data port Send_Grd_Station_Th.Data_Output->Interrupt_Modem_Th.Data_Input in modes (auto,manual,home); + event data port Interrupt_Modem_Th.Data_Output->Trans_Sol_Output in modes (auto,manual,home); + +modes + manual : initial mode; + auto : mode; + home : mode; +properties + Source_Text => "autopilot/mainloop.c"; +end Nav_Stab_Control_Proc.Impl; + +processor Proc_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; + Dev_Bus : requires bus access Device_Bus.MCU0; + SPI : requires bus access SPI; +end Proc_MCU0; + +processor implementation Proc_MCU0.Impl +properties + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe +end Proc_MCU0.Impl; + +memory Ram_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; +end Ram_MCU0; + +bus Mem_Bus_MCU0 +end Mem_Bus_MCU0; + +---------------------------------------------------------------- +-- we model a bus to link the systems +bus SPI +end SPI; + +system system_papabench +features + RC_EvtData_Input : in event data port; +end system_papabench; + +system implementation system_papabench.Impl +subcomponents + MCU1_P : processor Proc_MCU1.Impl; + Ram1 : memory Ram_MCU1; + Mem1_Bus : bus Mem_Bus_MCU1; + Dev1_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Rudder_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Ser_MotorL_dv : device Servo; + Ser_MotorR_dv : device Servo; + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; + + --MCU0 + MCU0_P : processor Proc_MCU0.Impl; + Ram0 : memory Ram_MCU0; + Mem0_Bus: bus Mem_Bus_MCU0; + P_dv : device Pression; + T_dv : device Tension; + Compas_dv : device Compas; + V_Air_dv : device Vitesse_Air; + Cam_dv : device Camera_Video; + Emet_dv : device Emetteur; + GPS_dv : device GPS; + IR_dv : device InfraRed; + Dev0_Bus : bus Device_Bus.MCU0; + Modem_Bus : bus Modem; + N_S_C_proc : process Nav_Stab_Control_Proc.Impl; + + SPI : bus SPI; +connections + --bus connections + bus access Mem1_Bus -> MCU1_P.Mem_Bus; + bus access Dev1_Bus -> MCU1_P.Dev_Bus; + bus access SPI -> MCU1_P.SPI; + bus access Dev1_Bus -> Recpt_dv.Dev_Bus; + bus access Dev1_Bus -> Cpt_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Rudder_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_AileronR_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorL_dv.Dev_Bus; + bus access Dev1_Bus -> Ser_MotorR_dv.Dev_Bus; + + bus access Mem0_Bus->MCU0_P.Mem_Bus; + bus access Mem0_Bus->Ram0.Mem_Bus; + bus access SPI->MCU0_P.SPI; + bus access Dev0_Bus->MCU0_P.Dev_Bus; + bus access Dev0_Bus->P_dv.Dev_Bus; + bus access Dev0_Bus->T_dv.Dev_Bus; + bus access Dev0_Bus->Compas_dv.Dev_Bus; + bus access Dev0_Bus->V_Air_dv.Dev_Bus; + bus access Dev0_Bus->Cam_dv.Dev_Bus; + bus access Dev0_Bus->Emet_dv.Dev_Bus; + bus access Modem_Bus->Emet_dv.Modem_Bus; + bus access Dev0_Bus->GPS_dv.Dev_Bus; + bus access Dev0_Bus->IR_dv.Dev_Bus; + --port connections + event data port RC_EvtData_Input->Recpt_dv.RC_Input; + event data port Recpt_dv.RC_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event port Recpt_dv.RC_Evt_Output-> Proc_RcptCde_PilotServ.RC_Evt_Input; + + data port Proc_RcptCde_PilotServ.Cde_Elevator_Output->Cpt_dv.Data_Elev_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronL_Output->Cpt_dv.Data_AilL_Input; + data port Proc_RcptCde_PilotServ.Cde_AileronR_Output->Cpt_dv.Data_AilR_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorL_Output->Cpt_dv.Data_MotorL_Input; + data port Proc_RcptCde_PilotServ.Cde_MotorR_Output->Cpt_dv.Data_MotorR_Input; + data port Proc_RcptCde_PilotServ.Cde_Rudder_Output->Cpt_dv.Data_Rudder_Input; + + data port Cpt_dv.Data_Rudder_Output->Ser_Rudder_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + data port Cpt_dv.Data_MotorL_Output->Ser_MotorL_dv.Data_Input; + data port Cpt_dv.Data_MotorR_Output->Ser_MotorR_dv.Data_Input; + + data port P_dv.P_Output->N_S_C_proc.P_Input; + data port T_dv.T_Output->N_S_C_proc.T_Input; + data port Compas_dv.Compas_Output->N_S_C_proc.Compas_Input; + data port V_Air_dv.V_Air_Output->N_S_C_proc.V_Air_Input; + data port IR_dv.IR_Output->N_S_C_proc.IR_Input; + event data port GPS_dv.GPS_Output->N_S_C_proc.GPS_Input; + event port GPS_dv.Error_Output->N_S_C_proc.GPS_Evt_Input; + + event data port N_S_C_proc.Trans_Sol_Output->Emet_dv.Trans_Data_Input; + data port Cam_dv.Video_Output->Emet_dv.Video_Input; + + event data port Proc_RcptCde_PilotServ.Cdes_Vol_Output->N_S_C_proc.MCU1_Data_Input; + event data port N_S_C_proc.Trans_MCU0_Output->Proc_RcptCde_PilotServ.AP_Cdes_Input; +properties + Actual_Processor_Binding => reference MCU0_P applies to N_S_C_Proc; + Actual_Memory_Binding => reference Ram0 applies to N_S_C_Proc; + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram1 applies to Proc_RcptCde_PilotServ; +end system_papabench.Impl; diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Old_Version.aadl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Old_Version.aadl new file mode 100644 index 0000000..13a2181 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/paparazzi_Old_Version.aadl @@ -0,0 +1,677 @@ +-- le projet paprazzi s'interesse a la realisation +-- d'un micro-drone autonome a bas cout. +-- le systeme embarque est constitue de +-- 1.recepteurs (HF(pour radio commande) +-- 2.capteurs infrarouge et GPS +-- 3.camera video +-- 4.modem +-- 5.emetteur +-- 6.deux microcontroleurs (MCU0, MCU1) + +--voir le fichier listes des taches pour corriger ce fichier AADL + +--------------------------------------------------------------- +-- We model a bus that connects our devices to the processor +bus Device_Bus +end Device_Bus; + +bus implementation Device_Bus.MCU0 +end Device_Bus.MCU0; + +bus implementation Device_Bus.MCU1 +end Device_Bus.MCU1; + +device Compteur +features + Cde_Input : in data port Data_Types::Tableau.Generic; + Data_Gaz_Output : out data port Data_Types::Integer; + Data_Elev_Output : out data port Data_Types::Integer; + Data_AilL_Output : out data port Data_Types::Integer; + Data_AilR_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Compteur; + +device Servo +features + Data_Input : in data port Data_Types::Integer; + --Cde_Output : out event data port; -- new data type? + Dev_bus : requires bus access Device_Bus.MCU1; +end Servo; + +device Recepteur +features + --RC_Input : in event data port; + --RC_Output : out event data port; + RC_Data_Input : in data port ; -- new data type? + RC_Evt_Input : in event port; -- -- -- -- -- -- -- -- -- new + Cdes_Output : out data port; -- new data type? + Error_Evt_Output : out event port; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Recepteur; + + +--this thread gets the data from the Radio Commande (RC) +--il definit les interruptions provenant de la RC +thread Reception_Decodage +features + Data_RC_Input : in data port;-- -- -- new data type? + Data_Decoded_Output: out data port Data_Types::Tableau.Generic; +properties + Dispatch_Protocol => periodic; +end Reception_Decodage; + +thread implementation Reception_Decodage.Impl +--properties + --Period => +end Reception_Decodage.Impl; + +--this thread gets the flight parameters and transmit them to the Counter +thread Pilotage_Servo_Cdes +features + Data_Cp_Output : out data port Data_Types::Tableau.Generic;--Cp :Compteur + Param_Vol_Input : in data port Data_Types::Tableau.Generic; +end Pilotage_Servo_Cdes; + +thread implementation Pilotage_Servo_Cdes.Impl +--properties + --Period => ?????????????????? +end Pilotage_Servo_Cdes.Impl; + +--this thread sends data to and receives data from MCU0 +thread Receive_Send_Data_MCU0 +features + MCU1_Data_Input : in data port Data_Types::Tableau.Generic; + MCU1_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--updated + AP_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--updated + AP_Evt_Output : out event port;--updated + AP_Rec_Output : out data port Data_Types::Tableau.Generic; +end Receive_Send_Data_MCU0; + +thread implementation Receive_Send_Data_MCU0.Impl +--properties + --Period => +end Receive_Send_Data_MCU0.Impl; + +process RecepteurCde_PilotageServo +features + Radio_Cdes_Input : in data port; + AP_Cdes_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--Autopilot Input --updated + Radio_Evt_Input : in event port;--RC erreur + --AP_Evt_Input : in event port; + Cdes_Vol_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--updated --data transmission to MCU0 + Cde_Serv_Output : out data port Data_Types::Tableau.Generic; +end RecepteurCde_PilotageServo; + +process implementation RecepteurCde_PilotageServo.Impl +subcomponents + Rec_Dec_Th : thread Reception_Decodage.Impl; + Rec_Send_Th : thread Receive_Send_Data_MCU0.Impl; + Pilot_Serv_Th : thread Pilotage_Servo_Cdes.Impl; + +connections + data port Radio_Cdes_Input->Rec_Dec_Th.Data_RC_Input in modes(manual); + event data port AP_Cdes_Input->Rec_Send_Th.AP_Data_Input in modes (auto,manual);--new --updated + data port Rec_Send_Th.AP_Rec_Output->Pilot_Serv_Th.Param_Vol_Input in modes(auto,manual);--new + --on annule ce lien car les parametres de la Radio commande + --doivent etre transmis a MCU0 pour obtenir en retour les + --parametres de vol + --data port Rec_Dec_Th.Data_Decoded_Output->Pilot_Serv_Th.Param_Vol_Input in modes(manual); + data port Pilot_Serv_Th.Data_Cp_Output->Cde_SerV_Output in modes(manual,auto); + data port Rec_Dec_Th.Data_Decoded_Output->Rec_Send_Th.MCU1_Data_Input in modes(manual); + event data port Rec_Send_Th.MCU1_Send_Output->Cdes_Vol_Output in modes(manual); --updated +modes + manual : initial mode; + auto : mode; + failsafe: mode; + -- Transitions + -- Specify the transitions between modes, use the following syntax: + -- -[ ]-> + manual-[Radio_Evt_Input]->auto; + auto-[Rec_Send_Th.AP_Evt_Output]->manual; + manual-[Radio_Evt_Input,Rec_Send_Th.AP_Evt_Output]->Failsafe; +end RecepteurCde_PilotageServo.Impl; + +processor Proc_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; + Dev_Bus : requires bus access Device_Bus.MCU1; +end Proc_MCU1; + +-- AADL processor = microprocessor + scheduler +processor implementation Proc_MCU1.Impl +properties + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS + --(Fixed Priority Scheduling) + --chaque tache a une priorite fixe +end Proc_MCU1.Impl; + +-- We model the RAM to bind our processes and threads +memory Ram_MCU1 +features + Mem_Bus : requires bus access Mem_Bus_MCU1; +end Ram_MCU1; + +-- We model a data bus that links processors and memories +bus Mem_Bus_MCU1 +end Mem_Bus_MCU1; + +-- MCU1 est charge de la Reception des ordres de la radio-commande, +-- la communication avec MCU0 et le pilotage des servos commandes + +system MCU1 +features + RC_Data_Input : in data port;---------------new + RC_Evt_Input : in event port; --------new + AP_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--AP: autopilot --updated + --AP_Evt_Input : in event port;--Erreur Autopilot --updated + --RC_Evt_Output : out event port;--Erreur Radio Cde --updated + D_MCU1_Output : out event data port Data_Types::Inter_mcu_msg.Generic;-- updated + Bus_Con : requires bus access SPI; +end MCU1; + +system implementation MCU1.Impl +subcomponents + --declare all the needed subcomponents to the system + MCU1_P : processor Proc_MCU1.Impl; + Ram : memory Ram_MCU1; + Mem_Bus : bus Mem_Bus_MCU1; + Dev_Bus : bus Device_Bus.MCU1; + Recpt_dv : device Recepteur; + Cpt_dv : device Compteur; + Ser_Gaz_dv : device Servo; + Ser_Elevator_dv : device Servo; + Ser_AileronL_dv : device Servo;--Aileron Left + Ser_AileronR_dv : device Servo;--Aileron Right + Proc_RcptCde_PilotServ : process RecepteurCde_PilotageServo.Impl; +connections + --bus connections + bus access Mem_Bus -> MCU1_P.Mem_Bus; + bus access Dev_Bus -> MCU1_P.Dev_Bus; + bus access Mem_Bus -> Ram.Mem_Bus; + bus access Dev_Bus -> Recpt_dv.Dev_Bus; + bus access Dev_Bus -> Cpt_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Gaz_dv.Dev_Bus; + bus access Dev_Bus -> Ser_Elevator_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronL_dv.Dev_Bus; + bus access Dev_Bus -> Ser_AileronR_dv.Dev_Bus; + + --port connections + data port RC_Data_Input->Recpt_dv.RC_Data_Input; + event port RC_Evt_Input->Recpt_dv.RC_Evt_Input; + data port Recpt_dv.Cdes_Output->Proc_RcptCde_PilotServ.Radio_Cdes_Input; + event data port AP_Data_Input->Proc_RcptCde_PilotServ.AP_Cdes_Input; --updated + event port Recpt_dv.Error_Evt_Output->Proc_RcptCde_PilotServ.Radio_Evt_Input; + --event port AP_Evt_Input->Proc_RcptCde_PilotServ.AP_Evt_Input;--updated + data port Proc_RcptCde_PilotServ.Cde_Serv_Output->Cpt_dv.Cde_Input; + data port Cpt_dv.Data_Gaz_Output->Ser_Gaz_dv.Data_Input; + data port Cpt_dv.Data_Elev_Output->Ser_Elevator_dv.Data_Input; + data port Cpt_dv.Data_AilL_Output->Ser_AileronL_dv.Data_Input; + data port Cpt_dv.Data_AilR_Output->Ser_AileronR_dv.Data_Input; + --event port Recpt_dv.Error_Evt_Output->RC_Evt_Output;--updated + +properties + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + Actual_Processor_Binding =>reference MCU1_P applies to Proc_RcptCde_PilotServ; + Actual_Memory_Binding =>reference Ram applies to Proc_RcptCde_PilotServ; +end MCU1.Impl; +----------------------------------------------------------------- +--determine la pression +device Pression +features + P_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Pression; + +--determine la tension +device Tension -- Alimentation +features + T_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Tension; + +device Compas +features + Compas_Output : out data port Data_Types::Float;-- new data type? + Dev_Bus : requires bus access Device_Bus.MCU0; +end compas; + +--determine la vitesse de l'air +device Vitesse_Air +features + V_Air_Output : out data port Data_Types::Integer; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Vitesse_Air; + +--filme le trajet de la mission +device Camera_Video +features + Video_Output : out data port; -- new data type? + Dev_Bus : requires bus access Device_bus.MCU0; +end Camera_Video; + +-- transmet les donnees a la station sol +device Emetteur +features + Video_Input : in data port;--data type? + Trans_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic; --new --updated + Trans_Data_Output : out data port; + Video_Output : out data port; + Modem_Bus : requires bus access Modem; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Emetteur; + +-- determine la position du drone +device GPS +features + Error_Output : out event port; + GPS_Output : out data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end GPS; + +device InfraRed +features + Error_Output : out event port; + IR_Output : out data port Data_Types::Stream_Element.Generic; + Dev_Bus : requires bus access Device_Bus.MCU0; +end InfraRed; + +-- relie le systeme MCU0 a la station sol +--ce qui permit la transmission de donnes +bus Modem +end Modem; + +-- Ce thread recoit les sigaux GPS et les transforme +-- en donnees utilisables +thread Data_Acquisition_GPS +features + GPS_Input : in data port Data_Types::Stream_Element.Generic; + GPS_Output : out data port Data_Types::Position.GPS; +end Data_Acquisition_GPS; + +thread implementation Data_Acquisition_GPS.Impl +properties + period => 250ms; --4hz +end Data_Acquisition_GPS.Impl; + +-- recoit les parametres +-- des differents composants et prepare la mission +thread Simple_Mission +features +--new + --RC_Data_Input : in data port Data_Types::Tableau.Generic;--RC : Radio Commande + GPS_Input : in data port Data_Types::Position.GPS; + T_Input : in data port Data_Types::Integer;-- T : Tension + P_Input : in data port Data_Types::Integer;-- P: Pression + Compas_Input : in data port Data_Types::Float; + V_Air_Input : in data port Data_Types::Integer;--V : Vitesse + Cap_Output : out data port Data_Types::Integer; + Alt_Output : out data port Data_Types::Integer;-- Att : Attitude + --RC_Data_Output : out data port Data_Types::Tableau.Generic;--utilisee en mode manual voir p.34 article +end Simple_Mission; + +thread implementation Simple_Mission.Impl +properties + Period => 50ms; --20 hertz; +end Simple_Mission.Impl; + +--Controle l'altitude +thread Altitude_Control +features + S_Miss_Alt_Input : in data port Data_Types::Integer;--Attitude transmie par Simple mission pour controle + GPS_Input : in data port Data_Types::Position.GPS; + S_Miss_Cap_Input : in data port Data_Types::Integer; + Cap_Output : out data port Data_Types::Integer; + Alt_Output : out data port Data_Types::Integer; +end Altitude_Control; + +--controle la montee +thread Climb_Control +features +--new + GPS_Input : in data port Data_Types::Position.GPS; + Montee_Input : in data port Data_Types::Float;-- data fournie par le thread Navigation en mode auto et par Control by RC en mode manuel + Montee_Output : out data port Data_Types::Float; +end Climb_Control; + +--controle la navigation de l'avion +thread Navigation +features + AC_Cap_Input: in data port Data_Types::Integer;--AC: Attitude_Control + AC_Alt_Input: in data port Data_Types::Integer;--AC: Attitude_Control + Angle_Roulis_Output : out data port Data_Types::Float; + Angle_Tangage_Output : out data port Data_Types::Float; + Taux_Montee_Output: out data port Data_Types::Float; --fourni par le GPS +end Navigation; + +--Ce thread est declenche a la frequence des informations delivrees +--par le GPS +thread implementation Navigation.Impl +properties + Period => 250 ms;--4 hertz; +end Navigation.Impl; + +-- Controle la stabilisation et transmet les donnees a MCU1 +thread Stabilisation -- + Data transmission to MCU1 +features +--new + Roulis_Input : in data port Data_Types::Float;--(fourni par la nav en mode auto et par Ctrl_By_RC en mode manuel) + Tangage_Input : in data port Data_Types::Float;--fourni par la nav en mode auto et par Ctrl_By_RC en mode manuel) + CC_Montee_Input : in data port Data_Types::Float;--Taux de montee fourni par le Th Climb Control + IR_Input : in data port;-- IR: Infra red + -- Param_Vol : Gaz_Output ,Prof_Output,AileronL_Output,AileronR_Output + Param_Vol_Output : out data port Data_Types::Tableau.Generic; +end Stabilisation; + +thread implementation Stabilisation.Impl +properties + Period => 50 ms;--20 hertz; +end Stabilisation.Impl; + +--this thread recoit les donnees de MCU1 en mode manuel +thread Receive_Send_Data_MCU1 +features + RC_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;-- updated + RC_Rec_Output : out data port Data_Types::Tableau.Generic; + RC_Evt_Output : out event port;--updated (juste pour le changement de mode) + MCU0_Data_Input : in data port Data_Types::Tableau.Generic; + MCU0_Send_Output : out event data port Data_Types::Inter_mcu_msg.Generic;-- updated +end Receive_Send_Data_MCU1; + +thread implementation Receive_Send_Data_MCU1.Impl +--properties + --Period => ?????? +end Receive_Send_Data_MCU1.Impl; + +thread Control_By_Radio_Cde +features + RC_Data_Input : in data port Data_Types::Tableau.Generic; + Angle_Roulis_Output : out data port Data_Types::Float; + Angle_Tangage_Output : out data port Data_Types::Float; + Gaz_Output : out data port Data_Types::Float; +end Control_By_Radio_Cde; + +process Nav_Stab_Control_Proc +features + --MCU1_Evt_Input : in event port;--Erreur Radio Cde --updated + MCU1_Data_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--updated --Param Radio_Cde (mode manuel) + GPS_Input : in data port Data_Types::Stream_Element.Generic; + GPS_Evt_Input : in event port; + IR_Input : in data port; -- new data type + P_Input : in data port Data_Types::Integer; + T_Input : in data port Data_Types :: Integer; + Compas_Input : in data port Data_Types::Float; -- new data types + V_Air_Input : in data port Data_Types:: Integer; + -- donnees transmies a MCU1 + Trans_MCU0_Output: out event data port Data_Types::Inter_mcu_msg.Generic;-- updated + -- donnees transmies a la station sol + Trans_Sol_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--updated +end Nav_Stab_Control_Proc; + +process implementation Nav_Stab_Control_Proc.Impl +--new +subcomponents + Data_Acq_Filt_Th : thread Data_Acquisition_GPS; + S_Mission_Th : thread Simple_Mission.Impl; + Alt_Ctrl_Th : thread Altitude_Control; + Nav_Th : thread Navigation.Impl; + Climb_Ctrl_Th : thread Climb_Control; + Stab_Th : thread Stabilisation.Impl; + Rec_Send_Th : thread Receive_Send_Data_MCU1.Impl; + Ctrl_By_RC_Th: thread Control_By_Radio_Cde; + + --the internal data that will store the autopilot settings + D_AP_Destination : data Data_Types::Position.Simple; + D_AP_Airspeed : data Data_Types::Integer; + D_AP_Altitude : data Data_Types::Integer; +connections + data port Rec_Send_Th.RC_Rec_Output->Ctrl_By_RC_Th.RC_Data_Input in modes (manual); + data port Ctrl_By_RC_Th.Angle_Roulis_Output->Stab_Th.Roulis_Input in modes (manual); + data port Ctrl_By_RC_Th.Angle_Tangage_Output->Stab_Th.Tangage_Input in modes (manual); + data port Ctrl_By_RC_Th.Gaz_Output->Climb_Ctrl_Th.Montee_Input in modes (manual); + + data port Data_Acq_Filt_Th.GPS_Output->S_Mission_Th.GPS_Input in modes(auto,home); + data port Data_Acq_Filt_Th.GPS_Output->Alt_Ctrl_Th.GPS_Input in modes(auto,home); + data port Data_Acq_Filt_Th.GPS_Output->Climb_Ctrl_Th.GPS_Input in modes(auto,home); + + data port S_Mission_Th.Cap_Output->Alt_Ctrl_Th.S_Miss_Cap_Input in modes(auto,home); + data port S_Mission_Th.Alt_Output->Alt_Ctrl_Th.S_Miss_Alt_Input in modes(auto,home); + --en mode manuel c'est le thread Control by radio commande qui fournit les donnees + --au thread stabilisation + --data port S_Mission_Th.RC_Data_Output->Stab_Th.RC_Data_Input in modes(manual); + --data port Rec_Send_Th.RC_Rec_Output->S_Mission_Th.RC_Data_Input in modes(manual); + + data port Alt_Ctrl_Th.Cap_Output->Nav_Th.AC_Cap_Input in modes(auto,home); + data port Alt_Ctrl_Th.Alt_Output->Nav_Th.AC_Alt_Input in modes(auto,home); + + data port Nav_Th.Taux_Montee_Output->Climb_Ctrl_Th.Montee_Input in modes(auto,home); + data port Climb_Ctrl_Th.Montee_Output->Stab_Th.CC_Montee_Input in modes (auto, home, manual); + data port Nav_Th.Angle_Roulis_Output->Stab_Th.Roulis_Input in modes(auto, home); + data port Nav_Th.Angle_Tangage_Output->Stab_Th.Tangage_Input in modes(auto, home); + data port IR_Input->Stab_Th.IR_Input in modes(manual, auto, home); + + data port Stab_Th.Param_Vol_Output->Rec_Send_Th.MCU0_Data_Input in modes(auto,home,manual); + event data port Rec_Send_Th.MCU0_Send_Output->Trans_MCU0_Output in modes(auto,home,manual);--updated + event data port Rec_Send_Th.MCU0_Send_Output->Trans_Sol_Output in modes(auto,home,manual);--new--updated + event data port MCU1_Data_Input->Rec_Send_Th.RC_Data_Input in modes(manual);--updated + + data port P_Input->S_Mission_Th.P_Input in modes(manual, auto, home); + data port T_Input->S_Mission_Th.T_input in modes(manual, auto, home); + data port Compas_Input->S_Mission_Th.Compas_Input in modes(manual, auto, home); + data port V_Air_Input->S_Mission_Th.V_Air_Input in modes(manual, auto, home); + data port GPS_Input->Data_Acq_Filt_Th.GPS_Input in modes(manual, auto, home); +modes + manual : initial mode; + auto : mode; + home : mode; + --Transition entre les modes + manual-[Rec_Send_Th.RC_Evt_Output]->auto;--updated + auto-[GPS_Evt_Input]->manual; + manual-[Rec_Send_Th.RC_Evt_Output,GPS_Evt_Input]->home;--updated +end Nav_Stab_Control_Proc.Impl; + +processor Proc_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; + Dev_Bus : requires bus access Device_Bus.MCU0; +end Proc_MCU0; + +processor implementation Proc_MCU0.Impl +properties + Scheduling_Protocol => RMS; + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe +end Proc_MCU0.Impl; + +memory Ram_MCU0 +features + Mem_Bus : requires bus access Mem_Bus_MCU0; +end Ram_MCU0; + +bus Mem_Bus_MCU0 +end Mem_Bus_MCU0; + +-- MCU0 est charge de la Stabilisation, +-- la navigation, la communication avec MCU1 +-- et la transmission des parametres de vol + +system MCU0 +features + D_MCU1_Input : in event data port Data_Types::Inter_mcu_msg.Generic;--updated + --E_MCU1_Input : in event port;--updated + D_MCU0_Output : out event data port Data_Types::Inter_mcu_msg.Generic;--updated + --E_MCU0_Output : out event port;--updated + Bus_Con : requires bus access SPI; +end MCU0; + +system implementation MCU0.Impl +subcomponents + Proc_0 : processor Proc_MCU0.Impl; + Ram : memory Ram_MCU0; + Mem_Bus: bus Mem_Bus_MCU0; + P_dv : device Pression; + T_dv : device Tension; + Compas_dv : device Compas; + V_Air_dv : device Vitesse_Air; + Cam_dv : device Camera_Video; + Emet_dv : device Emetteur; + GPS_dv : device GPS; + IR_dv : device InfraRed; + Dev_Bus : bus Device_Bus.MCU0; + Modem_Bus : bus Modem; + N_S_C_proc : process Nav_Stab_Control_Proc.Impl; +connections + -- bus connections + bus access Mem_Bus->Proc_0.Mem_Bus; + bus access Mem_Bus->Ram.Mem_Bus; + + bus access Dev_Bus->Proc_0.Dev_Bus; + bus access Dev_Bus->P_dv.Dev_Bus; + bus access Dev_Bus->T_dv.Dev_Bus; + bus access Dev_Bus->Compas_dv.Dev_Bus; + bus access Dev_Bus->V_Air_dv.Dev_Bus; + bus access Dev_Bus->Cam_dv.Dev_Bus; + bus access Dev_Bus->Emet_dv.Dev_Bus; + bus access Modem_Bus->Emet_dv.Modem_Bus; + bus access Dev_Bus->GPS_dv.Dev_Bus; + bus access Dev_Bus->IR_dv.Dev_Bus; + + --ports connections + data port P_dv.P_Output->N_S_C_proc.P_Input; + data port T_dv.T_Output->N_S_C_proc.T_Input; + data port Compas_dv.Compas_Output->N_S_C_proc.Compas_Input; + data port V_Air_dv.V_Air_Output->N_S_C_proc.V_Air_Input; + data port GPS_dv.GPS_Output->N_S_C_proc.GPS_Input; + event port GPS_dv.Error_Output->N_S_C_proc.GPS_Evt_Input; + + event data port N_S_C_proc.Trans_Sol_Output->Emet_dv.Trans_Data_Input;--updated + data port Cam_dv.Video_Output->Emet_dv.Video_Input; + + event data port D_MCU1_Input->N_S_C_proc.MCU1_Data_Input;--updated + --event port E_MCU1_Input->N_S_C_proc.MCU1_Evt_Input; --updated + + event data port N_S_C_proc.Trans_MCU0_Output->D_MCU0_Output;--updated + --event port GPS_dv.Error_Output->E_MCU0_Output; --updated + +properties + -- pour relier le processus a la memeoire et au processeur + Actual_Processor_Binding => reference Proc_0 applies to N_S_C_Proc; + Actual_Memory_Binding => reference Ram applies to N_S_C_Proc; +end MCU0.Impl; +---------------------------------------------------------------- +-- we model a bus to link the systems +bus SPI +end SPI; + +--the embedded system +system Systeme_Paparazzi +features + RC_Data_Input : in data port; + RC_Evt_Input : in event port; +end Systeme_Paparazzi; + +system implementation Systeme_Paparazzi.Impl +subcomponents + MCU0_sys : system MCU0.Impl; + MCU1_sys : system MCU1.Impl; + Dev_Bus : bus SPI; +connections + bus access Dev_Bus->MCU0_Sys.Bus_Con; + bus access Dev_Bus->MCU1_Sys.Bus_Con; + + data port RC_Data_Input->MCU1_sys.RC_Data_Input; + event port RC_Evt_Input->MCU1_sys.RC_Evt_Input; + + event data port MCU0_sys.D_MCU0_Output->MCU1_sys.AP_Data_Input;--updated + --event port MCU0_sys.E_MCU0_Output->MCU1_sys.AP_Evt_Input;--updated + + event data port MCU1_sys.D_MCU1_Output->MCU0_sys.D_MCU1_Input;--updated + --event port MCU1_sys.RC_Evt_Output->MCU0_sys.E_MCU1_Input;--updated +end Systeme_Paparazzi.Impl; + +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-- Satation Sol +--bus Device_Bus_Sol +--end Device_Bus_Sol; + +--device Radio_Cde +--features +-- PA_Evt_Output : out event port; +-- Cde_Output : out data port; -- le type de donnees?? +-- Connecteur_Bus : requires bus access Device_Bus_Sol; -- ? juste ? faux? +--end Radio_Cde; + +-- Magnetoscope +--device Magnetoscope +--features +-- Video_Input : in data port; +-- Connection_Bus : requires bus access Device_Bus_Sol; +--end Magnetoscope; + +-- Laptop +--processor Laptop_Proc +--end Laptop_Proc; + +--thread Affichage_Param_Vol_Th +--end Affichage_Param_Vol_Th; + +--thread Affichage_Mission_Trajet_Th +--end Affichage_Mission_Trajet_Th; + +--thread Affichage_Mes_Aeronef_Th +--end Affichage_Mes_Aeronef_Th; + +--process Affichage_Resultats +--end Affichage_Resultats; + +--processor Proc_Lap +--end Proc_Lap; + +--memory Ram_Lap +--end Ram_Lap; + +--bus Mem_Bus_Lap +--end Mem_Bus_Lap; + +---process implementation Affichage_Resultats.Impl +--end Affichage_Resultats.Impl; + +--system Laptop_Sys +--end Laptop_Sys; + +--system implementation Laptop_Sys.Impl +--end Laptop_Sys.Impl; + +-- Satation Sol +--system Station_Sol_Sys +--features +-- PA_Evt_Output : out event port; +-- Radio_Cde_Output : out data port; +-- Mission_Trajet_Input : in data port; +-- Mes_Aeronef_Input : in data port; +-- Param_Vol_Input : in data port; +-- Video_Input : in data port; +-- Connection_Network : requires bus access Network; +--end Station_Sol_Sys; + +--system implementation Station_Sol_Sys.Impl +--subcomponents +-- Lap_Sys : system Laptop_Sys; +-- Mag_dv : device Magnetoscope; +-- Radio_dv : device Radio_Cde; +-- Dev_Bus : bus Device_Bus_Sol; + +--end Station_Sol_Sys.Impl; + +-- Systeme complet +--bus Network +--end Network; + +--system Paparazzi_System + +--end Paparazzi_System; + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/propertysets/Thread_Properties.aadl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/propertysets/Thread_Properties.aadl new file mode 100644 index 0000000..0350052 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aadl/propertysets/Thread_Properties.aadl @@ -0,0 +1,10 @@ +property set Thread_Properties is + +Non_Preemptive : constant aadlinteger =>0; +System_Preemption : constant aadlinteger =>1; +Time_Sharing_Preemption : constant aadlinteger => 2; + +Preemption : enumeration (Non_Preemptive,System_Preemption,Time_Sharing_Preemption) + applies to (thread); +Entrypoints: list of Compute_Entrypoint applies to (thread); +end Thread_Properties; \ No newline at end of file diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/packages/Data_Types.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/packages/Data_Types.aaxl new file mode 100644 index 0000000..01f6fd2 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/packages/Data_Types.aaxl @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + + + + + + + + + + + + + + + + + + -- The Position type specifies a position + + + -- This data type represents the position + + + + + + + -- The data type that represents GPS sensor data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aaxl new file mode 100644 index 0000000..5c0835c --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V1_Tache_PnP_Inter_PnP.aaxl @@ -0,0 +1,1365 @@ + + + + -- le projet paprazzi s'interesse a la realisation + -- d'un micro-drone autonome a bas cout. + -- le systeme embarque est constitue de + -- 1.recepteurs (HF(pour radio commande) + -- 2.capteurs infrarouge et GPS + -- 3.camera video + -- 4.modem + -- 5.emetteur + -- 6.deux microcontroleurs (MCU0, MCU1) + --les taches sont soit periodiques + --et les interruptions sont periodiques + --N.B: le choix du Scheduling_Protocol du processeur indique si + --la preemption est autorisee ou non + --on donnera plus tard l'ordonnancement avec ou sans preemption + --taches MCU1: + --Reception Radio Command + --Send Servos Commands + --Send Message to MCU0 + --Interruptions: + --Receive/Send Data via SPI + --Servos Interruptions (6 interruptions) + --Taches MCU0 + --radio command task + --navigation + --climb control + --altitude control + --Receive GPS position + --stabilisation + --Send message to MCU1 + --Receive Message from MCU1 + --Send Data to ground station + --Interruptions + --Send/Receive via SPI + --Modem Interruption + ------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + + + + + + + + + + + + + + + + + + -- The Position type specifies a position + + + -- This data type represents the position + + + + + + + -- The data type that represents GPS sensor data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------------------------------------------------- + -- We model a bus that connects our devices to the processor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the data from the Radio Commande (RC) + --il definit les interruptions provenant de la RC + --il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! + -- au moins il faut que cette tache soit sporadic + --sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement + --mais le temps entre deux dispatch successifs ne doit pas etre < a la periode + + + + + + + + + + + + + + + + + + + + + + + + + + --Periode deduite de PPM.h >> PPM_FREQ + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + --Ce thread gere l'interruption d'envoi des parametres au servos + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the flight parameters and transmit them to the Counter + --fonction servo_transmit + + + --20Hz; + + + + + + + + + + + + + + + + + + + + --envoi reception signaux via SPI + + + + + --fourni a MCU1 + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread sends data to and receives data from MCU0 + + + + + + + + + --meme periode que reception_Decodage + + + + + + + + + + + + + + + + + + + + + + + + + --Autopilot Input + + + --data transmission to MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --System Settings + + + + + + + + + + + + + + + -- AADL processor = microprocessor + scheduler + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente + + + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + + + + + + -- We model the RAM to bind our processes and threads + + + + + + -- bus that links processors and memories + + + -- MCU1 est charge de la Reception des ordres de la radio-commande, + -- la communication avec MCU0 et le pilotage des servos commandes + + + + + --AP: autopilot + + + + + + + + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + + + + + + + + + --bus connections + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + --declare system subcomponents + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + + + ----------------------------------------------------------------- + --determine la pression + + + + + + + --determine la tension + + -- Alimentation + + + + + + + + + + + + --determine la vitesse de l'air + + + + + + + --filme le trajet de la mission + + + + -- new data type? + + + + + -- transmet les donnees a la station sol + + + + --data type? + + + + + + + + + -- determine la position du drone + + + + + + + + + + + + + + + -- relie le systeme MCU0 a la station sol + --ce qui permet la transmission de donnes + + + -- Ce thread recoit les sigaux GPS et les transforme + -- en donnees utilisables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --4hz + + + + + + + + + + + + + + + + + + + + --controle la navigation de l'avion + + + + + + + --Ce thread est declenche a la frequence des informations delivrees + --par le GPS 4Hz, sa periode est de 250 ms + + + + + + + + + + + + + + + + + + + + --le thread Navigation est toujours suivi, dans cet ordre, + -- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + --Controle l'altitude + + + + --fourni par navigation + + + + + + + + + + + + + + + + + + + + + + + + --controle la montee + --fourni par Altitude_Ctrl + + + + + + + + + + + + + + + + + + + + + + + + + -- Controle la stabilisation et transmet les donnees a MCU1 + + + + + + --20 hertz; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --fourni a MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --ce thread se declenche toujours apres la Stabilisation d'ou sa periode + --20Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --10Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Param Radio_Cde (mode manuel) + + + + + + + + + -- donnees transmies a MCU1 + + + -- donnees transmies a la station sol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --save the autopilot settings + + + + + + + + + + + + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe + + + + + + + + + + + + + + ---------------------------------------------------------------- + -- we model a bus to link the systems + + + + + + + + + + + + + + + + + + + + + + + + --bus connections + + + + + + + + + + + + + + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + --MCU0 + + + + + + + + + + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aaxl new file mode 100644 index 0000000..8cdc315 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V2_Tache_PnP_Inter_AnP.aaxl @@ -0,0 +1,1325 @@ + + + + -- le projet paprazzi s'interesse a la realisation + -- d'un micro-drone autonome a bas cout. + -- le systeme embarque est constitue de + -- 1.recepteurs (HF(pour radio commande) + -- 2.capteurs infrarouge et GPS + -- 3.camera video + -- 4.modem + -- 5.emetteur + -- 6.deux microcontroleurs (MCU0, MCU1) + --les taches sont soit periodiques + --et les interruptions sont periodiques + --N.B: le choix du Scheduling_Protocol du processeur indique si + --la preemption est autorisee ou non + --on donnera plus tard l'ordonnancement avec ou sans preemption + --taches MCU1: + --Reception Radio Command + --Send Servos Commands + --Send Message to MCU0 + --Interruptions: + --Receive/Send Data via SPI + --Servos Interruptions (6 interruptions) + --Taches MCU0 + --radio command task + --navigation + --climb control + --altitude control + --Receive GPS position + --stabilisation + --Send message to MCU1 + --Receive Message from MCU1 + --Send Data to ground station + --Interruptions + --Send/Receive via SPI + --Modem Interruption + ------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + + + + + + + + + + + + + + + + + + -- The Position type specifies a position + + + -- This data type represents the position + + + + + + + -- The data type that represents GPS sensor data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------------------------------------------------- + -- We model a bus that connects our devices to the processor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the data from the Radio Commande (RC) + --il definit les interruptions provenant de la RC + --il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! + -- au moins il faut que cette tache soit sporadic + --sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement + --mais le temps entre deux dispatch successifs ne doit pas etre < a la periode + + + + + + + + + + + + + + + + + + + + + + + --Periode deduite de PPM.h >> PPM_FREQ + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + --Ce thread gere l'interruption d'envoi des parametres au servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the flight parameters and transmit them to the Counter + --fonction servo_transmit + + + + + + + + + + + + + + + + + + + --envoi reception signaux via SPI + + + + + --fourni a MCU1 + + + + + + + + + + + + + + + + + + + + + + + --this thread sends data to and receives data from MCU0 + + + + + + + + + --meme periode que reception_Decodage + + + + + + + + + + + + + + + + + + + + + + + + + --Autopilot Input + + + --data transmission to MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --System Settings + + + + + + + + + + + + + + + -- AADL processor = microprocessor + scheduler + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente + + + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + + + + + + -- We model the RAM to bind our processes and threads + + + + + + -- bus that links processors and memories + + + -- MCU1 est charge de la Reception des ordres de la radio-commande, + -- la communication avec MCU0 et le pilotage des servos commandes + + + + + --AP: autopilot + + + + + + + + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + + + + + + + + + --bus connections + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + --declare system subcomponents + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + + + ----------------------------------------------------------------- + --determine la pression + + + + + + + --determine la tension + + -- Alimentation + + + + + + + + + + + + --determine la vitesse de l'air + + + + + + + --filme le trajet de la mission + + + + -- new data type? + + + + + -- transmet les donnees a la station sol + + + + --data type? + + + + + + + + + -- determine la position du drone + + + + + + + + + + + + + + + -- relie le systeme MCU0 a la station sol + --ce qui permet la transmission de donnes + + + -- Ce thread recoit les sigaux GPS et les transforme + -- en donnees utilisables + + + + + + + + + + + + + + + + + + + + + + + + + + + --4hz + + + + + + + + + + + + + + + + + + + + --controle la navigation de l'avion + + + + + + + --Ce thread est declenche a la frequence des informations delivrees + --par le GPS 4Hz, sa periode est de 250 ms + + + + + + + + + + + + + + + + + + + + --le thread Navigation est toujours suivi, dans cet ordre, + -- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + --Controle l'altitude + + + + --fourni par navigation + + + + + + + + + + + + + + + + + + + + + + + + --controle la montee + --fourni par Altitude_Ctrl + + + + + + + + + + + + + + + + + + + + + + + + + -- Controle la stabilisation et transmet les donnees a MCU1 + + + + + + --20 hertz; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --fourni a MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --ce thread se declenche toujours apres la Stabilisation d'ou sa periode + --20Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --10Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Param Radio_Cde (mode manuel) + + + + + + + + + -- donnees transmies a MCU1 + + + -- donnees transmies a la station sol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --save the autopilot settings + + + + + + + + + + + + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe + + + + + + + + + + + + + + ---------------------------------------------------------------- + -- we model a bus to link the systems + + + + + + + + + + + + + + + + + + + + + + + + --bus connections + + + + + + + + + + + + + + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + --MCU0 + + + + + + + + + + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aaxl new file mode 100644 index 0000000..53dfe95 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V3_Tache_PP_Inter_PP.aaxl @@ -0,0 +1,1365 @@ + + + + -- le projet paprazzi s'interesse a la realisation + -- d'un micro-drone autonome a bas cout. + -- le systeme embarque est constitue de + -- 1.recepteurs (HF(pour radio commande) + -- 2.capteurs infrarouge et GPS + -- 3.camera video + -- 4.modem + -- 5.emetteur + -- 6.deux microcontroleurs (MCU0, MCU1) + --les taches sont soit periodiques + --et les interruptions sont periodiques + --N.B: le choix du Scheduling_Protocol du processeur indique si + --la preemption est autorisee ou non + --on donnera plus tard l'ordonnancement avec ou sans preemption + --taches MCU1: + --Reception Radio Command + --Send Servos Commands + --Send Message to MCU0 + --Interruptions: + --Receive/Send Data via SPI + --Servos Interruptions (6 interruptions) + --Taches MCU0 + --radio command task + --navigation + --climb control + --altitude control + --Receive GPS position + --stabilisation + --Send message to MCU1 + --Receive Message from MCU1 + --Send Data to ground station + --Interruptions + --Send/Receive via SPI + --Modem Interruption + ------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + + + + + + + + + + + + + + + + + + -- The Position type specifies a position + + + -- This data type represents the position + + + + + + + -- The data type that represents GPS sensor data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------------------------------------------------- + -- We model a bus that connects our devices to the processor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the data from the Radio Commande (RC) + --il definit les interruptions provenant de la RC + --il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! + -- au moins il faut que cette tache soit sporadic + --sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement + --mais le temps entre deux dispatch successifs ne doit pas etre < a la periode + + + + + + + + + + + + + + + + + + + + + + + + + + --Periode deduite de PPM.h >> PPM_FREQ + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + --Ce thread gere l'interruption d'envoi des parametres au servos + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --la periode est egale a periode de Pilotage_Servo_Cdes/6 car on a 6 servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the flight parameters and transmit them to the Counter + --fonction servo_transmit + + + --20Hz; + + + + + + + + + + + + + + + + + + + + --envoi reception signaux via SPI + + + + + --fourni a MCU1 + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread sends data to and receives data from MCU0 + + + + + + + + + --meme periode que reception_Decodage + + + + + + + + + + + + + + + + + + + + + + + + + --Autopilot Input + + + --data transmission to MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --System Settings + + + + + + + + + + + + + + + -- AADL processor = microprocessor + scheduler + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente + + + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + + + + + + -- We model the RAM to bind our processes and threads + + + + + + -- bus that links processors and memories + + + -- MCU1 est charge de la Reception des ordres de la radio-commande, + -- la communication avec MCU0 et le pilotage des servos commandes + + + + + --AP: autopilot + + + + + + + + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + + + + + + + + + --bus connections + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + --declare system subcomponents + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + + + ----------------------------------------------------------------- + --determine la pression + + + + + + + --determine la tension + + -- Alimentation + + + + + + + + + + + + --determine la vitesse de l'air + + + + + + + --filme le trajet de la mission + + + + -- new data type? + + + + + -- transmet les donnees a la station sol + + + + --data type? + + + + + + + + + -- determine la position du drone + + + + + + + + + + + + + + + -- relie le systeme MCU0 a la station sol + --ce qui permet la transmission de donnes + + + -- Ce thread recoit les sigaux GPS et les transforme + -- en donnees utilisables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --4hz + + + + + + + + + + + + + + + + + + + + --controle la navigation de l'avion + + + + + + + --Ce thread est declenche a la frequence des informations delivrees + --par le GPS 4Hz, sa periode est de 250 ms + + + + + + + + + + + + + + + + + + + + --le thread Navigation est toujours suivi, dans cet ordre, + -- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + --Controle l'altitude + + + + --fourni par navigation + + + + + + + + + + + + + + + + + + + + + + + + --controle la montee + --fourni par Altitude_Ctrl + + + + + + + + + + + + + + + + + + + + + + + + + -- Controle la stabilisation et transmet les donnees a MCU1 + + + + + + --20 hertz; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --fourni a MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --ce thread se declenche toujours apres la Stabilisation d'ou sa periode + --20Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --10Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Param Radio_Cde (mode manuel) + + + + + + + + + -- donnees transmies a MCU1 + + + -- donnees transmies a la station sol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --save the autopilot settings + + + + + + + + + + + + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe + + + + + + + + + + + + + + ---------------------------------------------------------------- + -- we model a bus to link the systems + + + + + + + + + + + + + + + + + + + + + + + + --bus connections + + + + + + + + + + + + + + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + --MCU0 + + + + + + + + + + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aaxl new file mode 100644 index 0000000..48061e8 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Bench_V4_Tache_PP_Inter_AP.aaxl @@ -0,0 +1,1329 @@ + + + + -- le projet paprazzi s'interesse a la realisation + -- d'un micro-drone autonome a bas cout. + -- le systeme embarque est constitue de + -- 1.recepteurs (HF(pour radio commande) + -- 2.capteurs infrarouge et GPS + -- 3.camera video + -- 4.modem + -- 5.emetteur + -- 6.deux microcontroleurs (MCU0, MCU1) + --les taches sont soit periodiques + --et les interruptions sont periodiques + --N.B: le choix du Scheduling_Protocol du processeur indique si + --la preemption est autorisee ou non + --on donnera plus tard l'ordonnancement avec ou sans preemption + --taches MCU1: + --Reception Radio Command + --Send Servos Commands + --Send Message to MCU0 + --Interruptions: + --Receive/Send Data via SPI + --Servos Interruptions (6 interruptions) + --Taches MCU0 + --radio command task + --navigation + --climb control + --altitude control + --Receive GPS position + --stabilisation + --Send message to MCU1 + --Receive Message from MCU1 + --Send Data to ground station + --Interruptions + --Send/Receive via SPI + --Modem Interruption + ------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- le type Lat_long est une structure de donnees pour stocker les + -- longitudes et latitudes + + + + + + + + + + + + + + + + + + -- The Position type specifies a position + + + -- This data type represents the position + + + + + + + -- The data type that represents GPS sensor data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --etc selon le parametre RADIO_CTL_NB = 9 du fichier link_autopilot.h + --Valeur de RADIO_CTL_NB se trouve dans radio.h + --qui est egale a PPM_NB_OF_PULSE de ppm.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------------------------------------------------- + -- We model a bus that connects our devices to the processor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the data from the Radio Commande (RC) + --il definit les interruptions provenant de la RC + --il doit y avoir une contrainte temporelle sur l'envoi des messages de la radio commande!! + -- au moins il faut que cette tache soit sporadic + --sporadic veut dire que la tache est declenchee par l'arrivee d'un evenement + --mais le temps entre deux dispatch successifs ne doit pas etre < a la periode + + + + + + + + + + + + + + + + + + + + + + + --Periode deduite de PPM.h >> PPM_FREQ + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + + --20Hz + + + + + + + + + + + + + + + + + + + + --Ce thread gere l'interruption d'envoi des parametres au servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --this thread gets the flight parameters and transmit them to the Counter + --fonction servo_transmit + + + --20Hz; + + + + + + + + + + + + + + + + + + + + --envoi reception signaux via SPI + + + + + --fourni a MCU1 + + + + + + + + + + + + + + + + + + + + + + + --this thread sends data to and receives data from MCU0 + + + + + + + + + --meme periode que reception_Decodage + + + + + + + + + + + + + + + + + + + + + + + + + --Autopilot Input + + + --data transmission to MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --System Settings + + + + + + + + + + + + + + + -- AADL processor = microprocessor + scheduler + --RMS (Rate Monotonic Scheduling) est un FPS(Fixed Priority Scheduling) + --chaque tache a une priorite fixe, cette priorite est determinee a partir de + --sa periode, plus sa periode est petite plus sa priorite est grande + --rate= inverse de la periode, ainsi quand le rate augmente la priorite augmente + + + --le choix du protocol doit prendre en compte les restrictions faites sur l'application + + + + + + -- We model the RAM to bind our processes and threads + + + + + + -- bus that links processors and memories + + + -- MCU1 est charge de la Reception des ordres de la radio-commande, + -- la communication avec MCU0 et le pilotage des servos commandes + + + + + --AP: autopilot + + + + + + + + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + + + + + + + + + --bus connections + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + --declare system subcomponents + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + + + ----------------------------------------------------------------- + --determine la pression + + + + + + + --determine la tension + + -- Alimentation + + + + + + + + + + + + --determine la vitesse de l'air + + + + + + + --filme le trajet de la mission + + + + -- new data type? + + + + + -- transmet les donnees a la station sol + + + + --data type? + + + + + + + + + -- determine la position du drone + + + + + + + + + + + + + + + -- relie le systeme MCU0 a la station sol + --ce qui permet la transmission de donnes + + + -- Ce thread recoit les sigaux GPS et les transforme + -- en donnees utilisables + + + + + + + + + + + + + + + + + + + + + + + + + + + --4hz + + + + + + + + + + + + + + + + + + + + --controle la navigation de l'avion + + + + + + + --Ce thread est declenche a la frequence des informations delivrees + --par le GPS 4Hz, sa periode est de 250 ms + + + + + + + + + + + + + + + + + + + + --le thread Navigation est toujours suivi, dans cet ordre, + -- par les threads Altitude_Control et Climb_Controle d'ou leur Periode + --Controle l'altitude + + + + --fourni par navigation + + + + + + + + + + + + + + + + + + + + + + + + --controle la montee + --fourni par Altitude_Ctrl + + + + + + + + + + + + + + + + + + + + + + + + + -- Controle la stabilisation et transmet les donnees a MCU1 + + + + + + --20 hertz; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --fourni a MCU0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --ce thread se declenche toujours apres la Stabilisation d'ou sa periode + --20Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --10Hz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Param Radio_Cde (mode manuel) + + + + + + + + + -- donnees transmies a MCU1 + + + -- donnees transmies a la station sol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --save the autopilot settings + + + + + + + + + + + + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe + + + + + + + + + + + + + + ---------------------------------------------------------------- + -- we model a bus to link the systems + + + + + + + + + + + + + + + + + + + + + + + + --bus connections + + + + + + + + + + + + + + + + + + + + + + + + + + --port connections + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + --MCU0 + + + + + + + + + + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Old_Version.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Old_Version.aaxl new file mode 100644 index 0000000..e2b6495 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/paparazzi_Old_Version.aaxl @@ -0,0 +1,722 @@ + + + + -- le projet paprazzi s'interesse a la realisation + -- d'un micro-drone autonome a bas cout. + -- le systeme embarque est constitue de + -- 1.recepteurs (HF(pour radio commande) + -- 2.capteurs infrarouge et GPS + -- 3.camera video + -- 4.modem + -- 5.emetteur + -- 6.deux microcontroleurs (MCU0, MCU1) + --voir le fichier listes des taches pour corriger ce fichier AADL + --------------------------------------------------------------- + -- We model a bus that connects our devices to the processor + + + + + + + + + + + + + + + + + + --Cde_Output : out event data port; -- new data type? + + + + + + + --RC_Input : in event data port; + --RC_Output : out event data port; + + + -- new data type? + + + -- -- -- -- -- -- -- -- -- new + + + -- new data type? + + + + + + --this thread gets the data from the Radio Commande (RC) + --il definit les interruptions provenant de la RC + + + + + + + + + -- -- -- new data type? + + + + + --properties + --Period => + + + --this thread gets the flight parameters and transmit them to the Counter + + + + --Cp :Compteur + + + + + --properties + --Period => ?????????????????? + + + --this thread sends data to and receives data from MCU0 + + + + + --updated + + + --updated + + + --updated + + + + + --properties + --Period => + + + + + + + --Autopilot Input --updated + + + --RC erreur + --AP_Evt_Input : in event port; + + + --updated --data transmission to MCU0 + + + + + + + + + --new --updated + + + --new + --on annule ce lien car les parametres de la Radio commande + --doivent etre transmis a MCU0 pour obtenir en retour les + --parametres de vol + --data port Rec_Dec_Th.Data_Decoded_Output->Pilot_Serv_Th.Param_Vol_Input in modes(manual); + + + + + + --updated + + + + + -- Transitions + -- Specify the transitions between modes, use the following syntax: + -- <INITIAL_MODE> -[ <EVENT> ]-> <FINAL_MODE> + + + + + + + + + + + + + + + + + + -- AADL processor = microprocessor + scheduler + --RMS (Rate Monotonic Scheduling) est un FPS + --(Fixed Priority Scheduling) + --chaque tache a une priorite fixe + + + + + + + + -- We model the RAM to bind our processes and threads + + + + + + -- We model a data bus that links processors and memories + + + -- MCU1 est charge de la Reception des ordres de la radio-commande, + -- la communication avec MCU0 et le pilotage des servos commandes + + + + ---------------new + + + --------new + + + --AP: autopilot --updated + --AP_Evt_Input : in event port;--Erreur Autopilot --updated + --RC_Evt_Output : out event port;--Erreur Radio Cde --updated + + + -- updated + + + + + + --event port Recpt_dv.Error_Evt_Output->RC_Evt_Output;--updated + + --to bind the Proc_RcptCde_PilotServ to the memory Ram and the processor MCU1_P + --using predeclared properties + + + + + + + + + --bus connections + + + + + + + + + + + --port connections + + + + + + --updated + + + --event port AP_Evt_Input->Proc_RcptCde_PilotServ.AP_Evt_Input;--updated + + + + + + + + + --declare all the needed subcomponents to the system + + + + + + + + + + + --Aileron Left + + + --Aileron Right + + + + + ----------------------------------------------------------------- + --determine la pression + + + + + + + --determine la tension + + -- Alimentation + + + + + + + + + -- new data type? + + + + + --determine la vitesse de l'air + + + + + + + --filme le trajet de la mission + + + + -- new data type? + + + + + -- transmet les donnees a la station sol + + + + --data type? + + + --new --updated + + + + + + + + -- determine la position du drone + + + + + + + + + + + + + + + -- relie le systeme MCU0 a la station sol + --ce qui permit la transmission de donnes + + + -- Ce thread recoit les sigaux GPS et les transforme + -- en donnees utilisables + + + + + + + --4hz + + + + + + + + -- recoit les parametres + -- des differents composants et prepare la mission + -- Att : Attitude + --RC_Data_Output : out data port Data_Types::Tableau.Generic;--utilisee en mode manual voir p.34 article + + + --new + --RC_Data_Input : in data port Data_Types::Tableau.Generic;--RC : Radio Commande + + + + -- T : Tension + + + -- P: Pression + + + + --V : Vitesse + + + + + + --20 hertz; + + + + + + + + --Controle l'altitude + + + + --Attitude transmie par Simple mission pour controle + + + + + + + + --controle la montee + + + --new + + + + -- data fournie par le thread Navigation en mode auto et par Control by RC en mode manuel + + + + + --controle la navigation de l'avion + --fourni par le GPS + + + + --AC: Attitude_Control + + + --AC: Attitude_Control + + + + + + + --Ce thread est declenche a la frequence des informations delivrees + --par le GPS + --4 hertz; + + + + + + + + -- Controle la stabilisation et transmet les donnees a MCU1 + + -- + Data transmission to MCU1 + + --new + + + --(fourni par la nav en mode auto et par Ctrl_By_RC en mode manuel) + + + --fourni par la nav en mode auto et par Ctrl_By_RC en mode manuel) + + + --Taux de montee fourni par le Th Climb Control + + + -- IR: Infra red + -- Param_Vol : Gaz_Output ,Prof_Output,AileronL_Output,AileronR_Output + + + + + --20 hertz; + + + + + + + + --this thread recoit les donnees de MCU1 en mode manuel + -- updated + + + + -- updated + + + + --updated (juste pour le changement de mode) + + + + + + --properties + --Period => ?????? + + + + + + + + + + + --updated + + + --MCU1_Evt_Input : in event port;--Erreur Radio Cde --updated + + + --updated --Param Radio_Cde (mode manuel) + + + + + -- new data type + + + + + -- new data types + + + -- donnees transmies a MCU1 + + + -- updated + -- donnees transmies a la station sol + + + + + --updated + + + + + + + + + + + + --en mode manuel c'est le thread Control by radio commande qui fournit les donnees + --au thread stabilisation + --data port S_Mission_Th.RC_Data_Output->Stab_Th.RC_Data_Input in modes(manual); + --data port Rec_Send_Th.RC_Rec_Output->S_Mission_Th.RC_Data_Input in modes(manual); + + + + + + + + + + + --updated + + + --new--updated + + + --updated + + + + + + + + + + + + --Transition entre les modes + + + --updated + + + + + --new + + + + + + + + + + --the internal data that will store the autopilot settings + + + + + + + + + + + + + --RMS (Rate Monotonic Scheduling) est un FPS (Fixed Priority Scheduling) + --chaque tache a une priorite fixe + + + + + + + + + + + + + + -- MCU0 est charge de la Stabilisation, + -- la navigation, la communication avec MCU1 + -- et la transmission des parametres de vol + + + + --updated + --E_MCU1_Input : in event port;--updated + + + --updated + --E_MCU0_Output : out event port;--updated + + + + + + --updated + --event port GPS_dv.Error_Output->E_MCU0_Output; --updated + + -- pour relier le processus a la memeoire et au processeur + + + + + + + + + -- bus connections + + + + + + + + + + + + + + --ports connections + + + + + + + + + --updated + + + + --updated + --event port E_MCU1_Input->N_S_C_proc.MCU1_Evt_Input; --updated + + + + + + + + + + + + + + + + + + + + + ---------------------------------------------------------------- + -- we model a bus to link the systems + + + --the embedded system + + + + + + + --updated + --event port MCU1_sys.RC_Evt_Output->MCU0_sys.E_MCU1_Input;--updated + + + + + + + + --updated + --event port MCU0_sys.E_MCU0_Output->MCU1_sys.AP_Evt_Input;--updated + + + + + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/propertysets/Thread_Properties.aaxl b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/propertysets/Thread_Properties.aaxl new file mode 100644 index 0000000..140164d --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/aadl_sources/aaxl/propertysets/Thread_Properties.aaxl @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + thread + + + thread + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/interrupt.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/interrupt.h new file mode 100644 index 0000000..3931829 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/interrupt.h @@ -0,0 +1,149 @@ +/* Copyright (c) 2002, Marek Michalkiewicz + 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. */ + +/* $Id: interrupt.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +#ifndef _AVR_INTERRUPT_H_ +#define _AVR_INTERRUPT_H_ + +#include + +/** \name Global manipulation of the interrupt flag + + The global interrupt flag is maintained in the I bit of the status + register (SREG). */ + +/*@{*/ + +/** \def sei() + \ingroup avr_interrupts + + \code#include \endcode + + Enables interrupts by clearing the global interrupt mask. This function + actually compiles into a single line of assembly, so there is no function + call overhead. */ + +#define sei() __asm__ __volatile__ ("sei" ::) + +/** \def cli() + \ingroup avr_interrupts + + \code#include \endcode + + Disables all interrupts by clearing the global interrupt mask. This function + actually compiles into a single line of assembly, so there is no function + call overhead. */ + +#define cli() __asm__ __volatile__ ("cli" ::) + +/*@}*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \name Allowing specific system-wide interrupts + + In addition to globally enabling interrupts, each device's particular + interrupt needs to be enabled separately if interrupts for this device are + desired. While some devices maintain their interrupt enable bit inside + the device's register set, external and timer interrupts have system-wide + configuration registers. + + Example: + + \code + // Enable timer 1 overflow interrupts. + timer_enable_int(_BV(TOIE1)); + + // Do some work... + + // Disable all timer interrupts. + timer_enable_int(0); + \endcode + + \note Be careful when you use these functions. If you already have a + different interrupt enabled, you could inadvertantly disable it by + enabling another intterupt. */ + +/*@{*/ + +/** \ingroup avr_interrupts + \def enable_external_int(mask) + \code#include \endcode + + This macro gives access to the \c GIMSK register (or \c EIMSK register + if using an AVR Mega device or \c GICR register for others). Although this + macro is essentially the same as assigning to the register, it does + adapt slightly to the type of device being used. This macro is + unavailable if none of the registers listed above are defined. */ + +/* Define common register definition if available. */ + +#if defined(EIMSK) +#define __EICR EIMSK +#endif +#if defined(GIMSK) +#define __EICR GIMSK +#endif +#if defined(GICR) +#define __EICR GICR +//printf("--EICR=GICR");//FN 5-1-06 +#endif + +/* If common register defined, define macro. */ +#if defined(__EICR) || defined(DOXYGEN) +#define enable_external_int(mask) (__EICR = mask) +#endif + + + +/** \ingroup avr_interrupts + + \code#include \endcode + + This function modifies the \c timsk register. + The value you pass via \c ints is device specific. */ +#define __inline__ inline +static __inline__ void timer_enable_int ( unsigned char ints ) +{ + #ifdef TIMSK + TIMSK = ints; + #endif +} + +/*@}*/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/io.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/io.h new file mode 100644 index 0000000..9e7de4f --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/io.h @@ -0,0 +1,285 @@ +/* Copyright (c) 2002,2003 Marek Michalkiewicz, Joerg Wunsch + 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. */ + +/* $Id: io.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +/** \defgroup avr_io AVR device-specific IO definitions + \code #include \endcode + + This header file includes the apropriate IO definitions for the + device that has been specified by the -mmcu= compiler + command-line switch. This is done by diverting to the appropriate + file <avr/ioXXXX.h> which should + never be included directly. Some register names common to all + AVR devices are defined directly within <avr/io.h>, + but most of the details come from the respective include file. + + Note that this file always includes + \code #include \endcode + See \ref avr_sfr for the details. + + Included are definitions of the IO register set and their + respective bit values as specified in the Atmel documentation. + Note that Atmel is not very consistent in its naming conventions, + so even identical functions sometimes get different names on + different devices. + + Also included are the specific names useable for interrupt + function definitions as documented + \ref avr_signames "here". + + Finally, the following macros are defined: + + - \b RAMEND +
    + A constant describing the last on-chip RAM location. +
    + - \b XRAMEND +
    + A constant describing the last possible location in RAM. + This is equal to RAMEND for devices that do not allow for + external RAM. +
    + - \b E2END +
    + A constant describing the address of the last EEPROM cell. +
    + - \b FLASHEND +
    + A constant describing the last byte address in flash ROM. +
    + - \b SPM_PAGESIZE +
    + For devices with bootloader support, the flash pagesize + (in bytes) to be used for the \c SPM instruction. */ + +#ifndef _AVR_IO_H_ +#define _AVR_IO_H_ + +#include + +/* + Registers common to all AVR devices. +*/ + +#if __AVR_ARCH__ != 1 +/* + AVR architecture 1 has no RAM, thus no stack pointer. + + All other archs do have a stack pointer. Some devices have only + less than 256 bytes of possible RAM locations (128 Bytes of SRAM + and no option for external RAM), thus SPH is officially "reserved" + for them. We catch this case below after including the + device-specific ioXXXX.h file, by examining XRAMEND, and + #undef-ining SP and SPH in that case. +*/ +/* Stack Pointer */ +#define SP _SFR_IO16(0x3D) +#define SPL _SFR_IO8(0x3D) +#define SPH _SFR_IO8(0x3E) +#endif /* #if __AVR_ARCH__ != 1 */ + +/* Status REGister */ +#define SREG _SFR_IO8(0x3F) + +/* Status Register - SREG */ +#define SREG_I 7 +#define SREG_T 6 +#define SREG_H 5 +#define SREG_S 4 +#define SREG_V 3 +#define SREG_N 2 +#define SREG_Z 1 +#define SREG_C 0 + +/* Pointer definition */ +#if __AVR_ARCH__ != 1 +/* avr1 has only the Z pointer */ +#define XL r26 +#define XH r27 +#define YL r28 +#define YH r29 +#endif /* #if __AVR_ARCH__ != 1 */ +#define ZL r30 +#define ZH r31 + +/* + Only few devices come without EEPROM. In order to assemble the + EEPROM library components without defining a specific device, we + keep the EEPROM-related definitions here, and catch the devices + without EEPROM (E2END == 0) below. Obviously, the EEPROM library + functions will not work for them. ;-) +*/ +/* EEPROM Control Register */ +#define EECR _SFR_IO8(0x1C) + +/* EEPROM Data Register */ +#define EEDR _SFR_IO8(0x1D) + +/* EEPROM Address Register */ +#define EEAR _SFR_IO16(0x1E) +#define EEARL _SFR_IO8(0x1E) +#define EEARH _SFR_IO8(0x1F) + +/* EEPROM Control Register */ +#define EERIE 3 +#define EEMWE 2 +#define EEWE 1 +#define EERE 0 + +#if defined (__AVR_AT94K__) +# include +#elif defined (__AVR_AT43USB320__) +# include +#elif defined (__AVR_AT43USB355__) +# include +#elif defined (__AVR_AT76C711__) +# include +#elif defined (__AVR_AT86RF401__) +# include +#elif defined (__AVR_ATmega128__) +# include +#elif defined (__AVR_AT90CAN128__) +# include +#elif defined (__AVR_ATmega64__) +# include +#elif defined (__AVR_ATmega645__) +# include +#elif defined (__AVR_ATmega6450__) +# include +#elif defined (__AVR_ATmega103__) +# include +#elif defined (__AVR_ATmega32__) +# include +#elif defined (__AVR_ATmega323__) +# include +#elif defined (__AVR_ATmega325__) +# include +#elif defined (__AVR_ATmega3250__) +# include +#elif defined (__AVR_ATmega16__) +# include +#elif defined (__AVR_ATmega161__) +# include +#elif defined (__AVR_ATmega162__) +# include +#elif defined (__AVR_ATmega163__) +# include +#elif defined (__AVR_ATmega165__) +# include +#elif defined (__AVR_ATmega168__) +# include +#elif defined (__AVR_ATmega169__) +# include +#elif defined (__AVR_ATmega8__) +# include +#elif defined (__AVR_ATmega48__) +# include +#elif defined (__AVR_ATmega88__) +# include +#elif defined (__AVR_ATmega8515__) +# include +#elif defined (__AVR_ATmega8535__) +# include +#elif defined (__AVR_AT90S8535__) +# include +#elif defined (__AVR_AT90C8534__) +# include +#elif defined (__AVR_AT90S8515__) +# include +#elif defined (__AVR_AT90S4434__) +# include +#elif defined (__AVR_AT90S4433__) +# include +#elif defined (__AVR_AT90S4414__) +# include +#elif defined (__AVR_ATtiny22__) +# include +#elif defined (__AVR_ATtiny26__) +# include +#elif defined (__AVR_AT90S2343__) +# include +#elif defined (__AVR_AT90S2333__) +# include +#elif defined (__AVR_AT90S2323__) +# include +#elif defined (__AVR_AT90S2313__) +# include +#elif defined (__AVR_ATtiny2313__) +# include +#elif defined (__AVR_ATtiny13__) +# include +/* avr1: the following only supported for assembler programs */ +#elif defined (__AVR_ATtiny28__) +# include +#elif defined (__AVR_AT90S1200__) +# include +#elif defined (__AVR_ATtiny15__) +# include +#elif defined (__AVR_ATtiny12__) +# include +#elif defined (__AVR_ATtiny11__) +# include +#else +# if !defined(__COMPILING_AVR_LIBC__) +# warning "device type not defined" +# endif +#endif + +#include + +#if __AVR_ARCH__ != 1 +# if XRAMEND < 0x100 && !defined(__COMPILING_AVR_LIBC__) +# undef SP +# define SP _SFR_IO8(0x3D) +# undef SPH +# endif +#endif + +#if E2END == 0 && !defined(__COMPILING_AVR_LIBC__) +# undef EECR +# undef EEDR +# undef EEARL +# undef EEMWE +# undef EEWE +# undef EERE +#endif +#if E2END < 0x100 && !defined(__COMPILING_AVR_LIBC__) +# undef EEAR +# if E2END > 0 +# define EEAR _SFR_IO8(0x1E) +# endif +# undef EEARH +#endif +#if !defined(SIG_EEPROM_READY) +# undef EERIE +#endif + +#endif /* _AVR_IO_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom128.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom128.h new file mode 100644 index 0000000..7839deb --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom128.h @@ -0,0 +1,1035 @@ +/* Copyright (c) 2002, Peter Jansen + 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. */ + +/* $Id: iom128.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +/* avr/iom128.h - defines for ATmega128 + + As of 2002-08-27: + - This should be up to date with data sheet 2467E-AVR-05/02 */ + +#ifndef _AVR_IOM128_H_ +#define _AVR_IOM128_H_ 1 + +/* This file should only be included from , never directly. */ + +#ifndef _AVR_IO_H_ +# error "Include instead of this file." +#endif + +#ifndef _AVR_IOXXX_H_ +# define _AVR_IOXXX_H_ "iom128.h" +#else +# error "Attempt to include more than one file." +#endif + +/* I/O registers */ + +/* Input Pins, Port F */ +#define PINF _SFR_IO8(0x00) + +/* Input Pins, Port E */ +#define PINE _SFR_IO8(0x01) + +/* Data Direction Register, Port E */ +#define DDRE _SFR_IO8(0x02) + +/* Data Register, Port E */ +#define PORTE _SFR_IO8(0x03) + +/* ADC Data Register */ +#define ADCW _SFR_IO16(0x04) /* for backwards compatibility */ +#ifndef __ASSEMBLER__ +#define ADC _SFR_IO16(0x04) +#endif +#define ADCL _SFR_IO8(0x04) +#define ADCH _SFR_IO8(0x05) + +/* ADC Control and status register */ +#define ADCSR _SFR_IO8(0x06) +#define ADCSRA _SFR_IO8(0x06) /* new name in datasheet (2467E-AVR-05/02) */ + +/* ADC Multiplexer select */ +#define ADMUX _SFR_IO8(0x07) + +/* Analog Comparator Control and Status Register */ +#define ACSR _SFR_IO8(0x08) + +/* USART0 Baud Rate Register Low */ +#define UBRR0L _SFR_IO8(0x09) + +/* USART0 Control and Status Register B */ +#define UCSR0B _SFR_IO8(0x0A) + +/* USART0 Control and Status Register A */ +#define UCSR0A _SFR_IO8(0x0B) + +/* USART0 I/O Data Register */ +#define UDR0 _SFR_IO8(0x0C) + +/* SPI Control Register */ +#define SPCR _SFR_IO8(0x0D) + +/* SPI Status Register */ +#define SPSR _SFR_IO8(0x0E) + +/* SPI I/O Data Register */ +#define SPDR _SFR_IO8(0x0F) + +/* Input Pins, Port D */ +#define PIND _SFR_IO8(0x10) + +/* Data Direction Register, Port D */ +#define DDRD _SFR_IO8(0x11) + +/* Data Register, Port D */ +#define PORTD _SFR_IO8(0x12) + +/* Input Pins, Port C */ +#define PINC _SFR_IO8(0x13) + +/* Data Direction Register, Port C */ +#define DDRC _SFR_IO8(0x14) + +/* Data Register, Port C */ +#define PORTC _SFR_IO8(0x15) + +/* Input Pins, Port B */ +#define PINB _SFR_IO8(0x16) + +/* Data Direction Register, Port B */ +#define DDRB _SFR_IO8(0x17) + +/* Data Register, Port B */ +#define PORTB _SFR_IO8(0x18) + +/* Input Pins, Port A */ +#define PINA _SFR_IO8(0x19) + +/* Data Direction Register, Port A */ +#define DDRA _SFR_IO8(0x1A) + +/* Data Register, Port A */ +#define PORTA _SFR_IO8(0x1B) + +/* 0x1C..0x1F EEPROM */ + +/* Special Function I/O Register */ +#define SFIOR _SFR_IO8(0x20) + +/* Watchdog Timer Control Register */ +#define WDTCR _SFR_IO8(0x21) + +/* On-chip Debug Register */ +#define OCDR _SFR_IO8(0x22) + +/* Timer2 Output Compare Register */ +#define OCR2 _SFR_IO8(0x23) + +/* Timer/Counter 2 */ +#define TCNT2 _SFR_IO8(0x24) + +/* Timer/Counter 2 Control register */ +#define TCCR2 _SFR_IO8(0x25) + +/* T/C 1 Input Capture Register */ +#define ICR1 _SFR_IO16(0x26) +#define ICR1L _SFR_IO8(0x26) +#define ICR1H _SFR_IO8(0x27) + +/* Timer/Counter1 Output Compare Register B */ +#define OCR1B _SFR_IO16(0x28) +#define OCR1BL _SFR_IO8(0x28) +#define OCR1BH _SFR_IO8(0x29) + +/* Timer/Counter1 Output Compare Register A */ +#define OCR1A _SFR_IO16(0x2A) +#define OCR1AL _SFR_IO8(0x2A) +#define OCR1AH _SFR_IO8(0x2B) + +/* Timer/Counter 1 */ +#define TCNT1 _SFR_IO16(0x2C) +#define TCNT1L _SFR_IO8(0x2C) +#define TCNT1H _SFR_IO8(0x2D) + +/* Timer/Counter 1 Control and Status Register */ +#define TCCR1B _SFR_IO8(0x2E) + +/* Timer/Counter 1 Control Register */ +#define TCCR1A _SFR_IO8(0x2F) + +/* Timer/Counter 0 Asynchronous Control & Status Register */ +#define ASSR _SFR_IO8(0x30) + +/* Output Compare Register 0 */ +#define OCR0 _SFR_IO8(0x31) + +/* Timer/Counter 0 */ +#define TCNT0 _SFR_IO8(0x32) + +/* Timer/Counter 0 Control Register */ +#define TCCR0 _SFR_IO8(0x33) + +/* MCU Status Register */ +#define MCUSR _SFR_IO8(0x34) +#define MCUCSR _SFR_IO8(0x34) /* new name in datasheet (2467E-AVR-05/02) */ + +/* MCU general Control Register */ +#define MCUCR _SFR_IO8(0x35) + +/* Timer/Counter Interrupt Flag Register */ +#define TIFR _SFR_IO8(0x36) + +/* Timer/Counter Interrupt MaSK register */ +#define TIMSK _SFR_IO8(0x37) + +/* External Interrupt Flag Register */ +#define EIFR _SFR_IO8(0x38) + +/* External Interrupt MaSK register */ +#define EIMSK _SFR_IO8(0x39) + +/* External Interrupt Control Register B */ +#define EICRB _SFR_IO8(0x3A) + +/* RAM Page Z select register */ +#define RAMPZ _SFR_IO8(0x3B) + +/* XDIV Divide control register */ +#define XDIV _SFR_IO8(0x3C) + +/* 0x3D..0x3E SP */ + +/* 0x3F SREG */ + +/* Extended I/O registers */ + +/* Data Direction Register, Port F */ +#define DDRF _SFR_MEM8(0x61) + +/* Data Register, Port F */ +#define PORTF _SFR_MEM8(0x62) + +/* Input Pins, Port G */ +#define PING _SFR_MEM8(0x63) + +/* Data Direction Register, Port G */ +#define DDRG _SFR_MEM8(0x64) + +/* Data Register, Port G */ +#define PORTG _SFR_MEM8(0x65) + +/* Store Program Memory Control and Status Register */ +#define SPMCR _SFR_MEM8(0x68) +#define SPMCSR _SFR_MEM8(0x68) /* new name in datasheet (2467E-AVR-05/02) */ + +/* External Interrupt Control Register A */ +#define EICRA _SFR_MEM8(0x6A) + +/* External Memory Control Register B */ +#define XMCRB _SFR_MEM8(0x6C) + +/* External Memory Control Register A */ +#define XMCRA _SFR_MEM8(0x6D) + +/* Oscillator Calibration Register */ +#define OSCCAL _SFR_MEM8(0x6F) + +/* 2-wire Serial Interface Bit Rate Register */ +#define TWBR _SFR_MEM8(0x70) + +/* 2-wire Serial Interface Status Register */ +#define TWSR _SFR_MEM8(0x71) + +/* 2-wire Serial Interface Address Register */ +#define TWAR _SFR_MEM8(0x72) + +/* 2-wire Serial Interface Data Register */ +#define TWDR _SFR_MEM8(0x73) + +/* 2-wire Serial Interface Control Register */ +#define TWCR _SFR_MEM8(0x74) + +/* Time Counter 1 Output Compare Register C */ +#define OCR1C _SFR_MEM16(0x78) +#define OCR1CL _SFR_MEM8(0x78) +#define OCR1CH _SFR_MEM8(0x79) + +/* Timer/Counter 1 Control Register C */ +#define TCCR1C _SFR_MEM8(0x7A) + +/* Extended Timer Interrupt Flag Register */ +#define ETIFR _SFR_MEM8(0x7C) + +/* Extended Timer Interrupt Mask Register */ +#define ETIMSK _SFR_MEM8(0x7D) + +/* Timer/Counter 3 Input Capture Register */ +#define ICR3 _SFR_MEM16(0x80) +#define ICR3L _SFR_MEM8(0x80) +#define ICR3H _SFR_MEM8(0x81) + +/* Timer/Counter 3 Output Compare Register C */ +#define OCR3C _SFR_MEM16(0x82) +#define OCR3CL _SFR_MEM8(0x82) +#define OCR3CH _SFR_MEM8(0x83) + +/* Timer/Counter 3 Output Compare Register B */ +#define OCR3B _SFR_MEM16(0x84) +#define OCR3BL _SFR_MEM8(0x84) +#define OCR3BH _SFR_MEM8(0x85) + +/* Timer/Counter 3 Output Compare Register A */ +#define OCR3A _SFR_MEM16(0x86) +#define OCR3AL _SFR_MEM8(0x86) +#define OCR3AH _SFR_MEM8(0x87) + +/* Timer/Counter 3 Counter Register */ +#define TCNT3 _SFR_MEM16(0x88) +#define TCNT3L _SFR_MEM8(0x88) +#define TCNT3H _SFR_MEM8(0x89) + +/* Timer/Counter 3 Control Register B */ +#define TCCR3B _SFR_MEM8(0x8A) + +/* Timer/Counter 3 Control Register A */ +#define TCCR3A _SFR_MEM8(0x8B) + +/* Timer/Counter 3 Control Register C */ +#define TCCR3C _SFR_MEM8(0x8C) + +/* USART0 Baud Rate Register High */ +#define UBRR0H _SFR_MEM8(0x90) + +/* USART0 Control and Status Register C */ +#define UCSR0C _SFR_MEM8(0x95) + +/* USART1 Baud Rate Register High */ +#define UBRR1H _SFR_MEM8(0x98) + +/* USART1 Baud Rate Register Low*/ +#define UBRR1L _SFR_MEM8(0x99) + +/* USART1 Control and Status Register B */ +#define UCSR1B _SFR_MEM8(0x9A) + +/* USART1 Control and Status Register A */ +#define UCSR1A _SFR_MEM8(0x9B) + +/* USART1 I/O Data Register */ +#define UDR1 _SFR_MEM8(0x9C) + +/* USART1 Control and Status Register C */ +#define UCSR1C _SFR_MEM8(0x9D) + +/* Interrupt vectors */ + +#define SIG_INTERRUPT0 _VECTOR(1) +#define SIG_INTERRUPT1 _VECTOR(2) +#define SIG_INTERRUPT2 _VECTOR(3) +#define SIG_INTERRUPT3 _VECTOR(4) +#define SIG_INTERRUPT4 _VECTOR(5) +#define SIG_INTERRUPT5 _VECTOR(6) +#define SIG_INTERRUPT6 _VECTOR(7) +#define SIG_INTERRUPT7 _VECTOR(8) +#define SIG_OUTPUT_COMPARE2 _VECTOR(9) +#define SIG_OVERFLOW2 _VECTOR(10) +#define SIG_INPUT_CAPTURE1 _VECTOR(11) +#define SIG_OUTPUT_COMPARE1A _VECTOR(12) +#define SIG_OUTPUT_COMPARE1B _VECTOR(13) +#define SIG_OVERFLOW1 _VECTOR(14) +#define SIG_OUTPUT_COMPARE0 _VECTOR(15) +#define SIG_OVERFLOW0 _VECTOR(16) +#define SIG_SPI _VECTOR(17) +#define SIG_USART0_RECV _VECTOR(18) +#define SIG_UART0_RECV _VECTOR(18) /* Keep for compatibility */ +#define SIG_USART0_DATA _VECTOR(19) +#define SIG_UART0_DATA _VECTOR(19) /* Keep for compatibility */ +#define SIG_USART0_TRANS _VECTOR(20) +#define SIG_UART0_TRANS _VECTOR(20) /* Keep for compatibility */ +#define SIG_ADC _VECTOR(21) +#define SIG_EEPROM_READY _VECTOR(22) +#define SIG_COMPARATOR _VECTOR(23) +#define SIG_OUTPUT_COMPARE1C _VECTOR(24) +#define SIG_INPUT_CAPTURE3 _VECTOR(25) +#define SIG_OUTPUT_COMPARE3A _VECTOR(26) +#define SIG_OUTPUT_COMPARE3B _VECTOR(27) +#define SIG_OUTPUT_COMPARE3C _VECTOR(28) +#define SIG_OVERFLOW3 _VECTOR(29) +#define SIG_USART1_RECV _VECTOR(30) +#define SIG_UART1_RECV _VECTOR(30) /* Keep for compatibility */ +#define SIG_USART1_DATA _VECTOR(31) +#define SIG_UART1_DATA _VECTOR(31) /* Keep for compatibility */ +#define SIG_USART1_TRANS _VECTOR(32) +#define SIG_UART1_TRANS _VECTOR(32) /* Keep for compatibility */ +#define SIG_2WIRE_SERIAL _VECTOR(33) +#define SIG_SPM_READY _VECTOR(34) + +#define _VECTORS_SIZE 140 + +/* + The Register Bit names are represented by their bit number (0-7). +*/ + +/* 2-wire Control Register - TWCR */ +#define TWINT 7 +#define TWEA 6 +#define TWSTA 5 +#define TWSTO 4 +#define TWWC 3 +#define TWEN 2 +#define TWIE 0 + +/* 2-wire Address Register - TWAR */ +#define TWA6 7 +#define TWA5 6 +#define TWA4 5 +#define TWA3 4 +#define TWA2 3 +#define TWA1 2 +#define TWA0 1 +#define TWGCE 0 + +/* 2-wire Status Register - TWSR */ +#define TWS7 7 +#define TWS6 6 +#define TWS5 5 +#define TWS4 4 +#define TWS3 3 +#define TWPS1 1 +#define TWPS0 0 + +/* External Memory Control Register A - XMCRA */ +#define SRL2 6 +#define SRL1 5 +#define SRL0 4 +#define SRW01 3 +#define SRW00 2 +#define SRW11 1 + +/* External Memory Control Register B - XMCRA */ +#define XMBK 7 +#define XMM2 2 +#define XMM1 1 +#define XMM0 0 + +/* XDIV Divide control register - XDIV */ +#define XDIVEN 7 +#define XDIV6 6 +#define XDIV5 5 +#define XDIV4 4 +#define XDIV3 3 +#define XDIV2 2 +#define XDIV1 1 +#define XDIV0 0 + +/* RAM Page Z select register - RAMPZ */ +#define RAMPZ0 0 + +/* External Interrupt Control Register A - EICRA */ +#define ISC31 7 +#define ISC30 6 +#define ISC21 5 +#define ISC20 4 +#define ISC11 3 +#define ISC10 2 +#define ISC01 1 +#define ISC00 0 + +/* External Interrupt Control Register B - EICRB */ +#define ISC71 7 +#define ISC70 6 +#define ISC61 5 +#define ISC60 4 +#define ISC51 3 +#define ISC50 2 +#define ISC41 1 +#define ISC40 0 + +/* Store Program Memory Control Register - SPMCSR, SPMCR */ +#define SPMIE 7 +#define RWWSB 6 +#define RWWSRE 4 +#define BLBSET 3 +#define PGWRT 2 +#define PGERS 1 +#define SPMEN 0 + +/* External Interrupt MaSK register - EIMSK */ +#define INT7 7 +#define INT6 6 +#define INT5 5 +#define INT4 4 +#define INT3 3 +#define INT2 2 +#define INT1 1 +#define INT0 0 + +/* External Interrupt Flag Register - EIFR */ +#define INTF7 7 +#define INTF6 6 +#define INTF5 5 +#define INTF4 4 +#define INTF3 3 +#define INTF2 2 +#define INTF1 1 +#define INTF0 0 + +/* Timer/Counter Interrupt MaSK register - TIMSK */ +#define OCIE2 7 +#define TOIE2 6 +#define TICIE1 5 +#define OCIE1A 4 +#define OCIE1B 3 +#define TOIE1 2 +#define OCIE0 1 +#define TOIE0 0 + +/* Timer/Counter Interrupt Flag Register - TIFR */ +#define OCF2 7 +#define TOV2 6 +#define ICF1 5 +#define OCF1A 4 +#define OCF1B 3 +#define TOV1 2 +#define OCF0 1 +#define TOV0 0 + +/* Extended Timer Interrupt MaSK register - ETIMSK */ +#define TICIE3 5 +#define OCIE3A 4 +#define OCIE3B 3 +#define TOIE3 2 +#define OCIE3C 1 +#define OCIE1C 0 + +/* Extended Timer Interrupt Flag Register - ETIFR */ +#define ICF3 5 +#define OCF3A 4 +#define OCF3B 3 +#define TOV3 2 +#define OCF3C 1 +#define OCF1C 0 + +/* MCU general Control Register - MCUCR */ +#define SRE 7 +#define SRW 6 +#define SRW10 6 /* new name in datasheet (2467E-AVR-05/02) */ +#define SE 5 +#define SM1 4 +#define SM0 3 +#define SM2 2 +#define IVSEL 1 +#define IVCE 0 + +/* MCU Status Register - MCUSR, MCUCSR */ +#define JTD 7 +#define JTRF 4 +#define WDRF 3 +#define BORF 2 +#define EXTRF 1 +#define PORF 0 + +/* Timer/Counter Control Register (generic) */ +#define FOC 7 +#define WGM0 6 +#define COM1 5 +#define COM0 4 +#define WGM1 3 +#define CS2 2 +#define CS1 1 +#define CS0 0 + +/* Timer/Counter 0 Control Register - TCCR0 */ +#define FOC0 7 +#define WGM00 6 +#define COM01 5 +#define COM00 4 +#define WGM01 3 +#define CS02 2 +#define CS01 1 +#define CS00 0 + +/* Timer/Counter 2 Control Register - TCCR2 */ +#define FOC2 7 +#define WGM20 6 +#define COM21 5 +#define COM20 4 +#define WGM21 3 +#define CS22 2 +#define CS21 1 +#define CS20 0 + +/* Timer/Counter 0 Asynchronous Control & Status Register - ASSR */ +#define AS0 3 +#define TCN0UB 2 +#define OCR0UB 1 +#define TCR0UB 0 + +/* Timer/Counter Control Register A (generic) */ +#define COMA1 7 +#define COMA0 6 +#define COMB1 5 +#define COMB0 4 +#define COMC1 3 +#define COMC0 2 +#define WGMA1 1 +#define WGMA0 0 + +/* Timer/Counter 1 Control and Status Register A - TCCR1A */ +#define COM1A1 7 +#define COM1A0 6 +#define COM1B1 5 +#define COM1B0 4 +#define COM1C1 3 +#define COM1C0 2 +#define WGM11 1 +#define WGM10 0 + +/* Timer/Counter 3 Control and Status Register A - TCCR3A */ +#define COM3A1 7 +#define COM3A0 6 +#define COM3B1 5 +#define COM3B0 4 +#define COM3C1 3 +#define COM3C0 2 +#define WGM31 1 +#define WGM30 0 + +/* Timer/Counter Control and Status Register B (generic) */ +#define ICNC 7 +#define ICES 6 +#define WGMB3 4 +#define WGMB2 3 +#define CSB2 2 +#define CSB1 1 +#define CSB0 0 + +/* Timer/Counter 1 Control and Status Register B - TCCR1B */ +#define ICNC1 7 +#define ICES1 6 +#define WGM13 4 +#define WGM12 3 +#define CS12 2 +#define CS11 1 +#define CS10 0 + +/* Timer/Counter 3 Control and Status Register B - TCCR3B */ +#define ICNC3 7 +#define ICES3 6 +#define WGM33 4 +#define WGM32 3 +#define CS32 2 +#define CS31 1 +#define CS30 0 + +/* Timer/Counter Control Register C (generic) */ +#define FOCA 7 +#define FOCB 6 +#define FOCC 5 + +/* Timer/Counter 3 Control Register C - TCCR3C */ +#define FOC3A 7 +#define FOC3B 6 +#define FOC3C 5 + +/* Timer/Counter 1 Control Register C - TCCR1C */ +#define FOC1A 7 +#define FOC1B 6 +#define FOC1C 5 + +/* On-chip Debug Register - OCDR */ +#define IDRD 7 +#define OCDR7 7 +#define OCDR6 6 +#define OCDR5 5 +#define OCDR4 4 +#define OCDR3 3 +#define OCDR2 2 +#define OCDR1 1 +#define OCDR0 0 + +/* Watchdog Timer Control Register - WDTCR */ +#define WDCE 4 +#define WDE 3 +#define WDP2 2 +#define WDP1 1 +#define WDP0 0 + +/* Special Function I/O Register - SFIOR */ +#define TSM 7 +#define ADHSM 4 +#define ACME 3 +#define PUD 2 +#define PSR0 1 +#define PSR321 0 + +/* SPI Status Register - SPSR */ +#define SPIF 7 +#define WCOL 6 +#define SPI2X 0 + +/* SPI Control Register - SPCR */ +#define SPIE 7 +#define SPE 6 +#define DORD 5 +#define MSTR 4 +#define CPOL 3 +#define CPHA 2 +#define SPR1 1 +#define SPR0 0 + +/* USART Register C (generic) */ +#define UMSEL 6 +#define UPM1 5 +#define UPM0 4 +#define USBS 3 +#define UCSZ1 2 +#define UCSZ0 1 +#define UCPOL 0 + +/* USART1 Register C - UCSR1C */ +#define UMSEL1 6 +#define UPM11 5 +#define UPM10 4 +#define USBS1 3 +#define UCSZ11 2 +#define UCSZ10 1 +#define UCPOL1 0 + +/* USART0 Register C - UCSR0C */ +#define UMSEL0 6 +#define UPM01 5 +#define UPM00 4 +#define USBS0 3 +#define UCSZ01 2 +#define UCSZ00 1 +#define UCPOL0 0 + +/* USART Status Register A (generic) */ +#define RXC 7 +#define TXC 6 +#define UDRE 5 +#define FE 4 +#define DOR 3 +#define UPE 2 +#define U2X 1 +#define MPCM 0 + +/* USART1 Status Register A - UCSR1A */ +#define RXC1 7 +#define TXC1 6 +#define UDRE1 5 +#define FE1 4 +#define DOR1 3 +#define UPE1 2 +#define U2X1 1 +#define MPCM1 0 + +/* USART0 Status Register A - UCSR0A */ +#define RXC0 7 +#define TXC0 6 +#define UDRE0 5 +#define FE0 4 +#define DOR0 3 +#define UPE0 2 +#define U2X0 1 +#define MPCM0 0 + +/* USART Control Register B (generic) */ +#define RXCIE 7 +#define TXCIE 6 +#define UDRIE 5 +#define RXEN 4 +#define TXEN 3 +#define UCSZ 2 +#define UCSZ2 2 /* new name in datasheet (2467E-AVR-05/02) */ +#define RXB8 1 +#define TXB8 0 + +/* USART1 Control Register B - UCSR1B */ +#define RXCIE1 7 +#define TXCIE1 6 +#define UDRIE1 5 +#define RXEN1 4 +#define TXEN1 3 +#define UCSZ12 2 +#define RXB81 1 +#define TXB81 0 + +/* USART0 Control Register B - UCSR0B */ +#define RXCIE0 7 +#define TXCIE0 6 +#define UDRIE0 5 +#define RXEN0 4 +#define TXEN0 3 +#define UCSZ02 2 +#define RXB80 1 +#define TXB80 0 + +/* Analog Comparator Control and Status Register - ACSR */ +#define ACD 7 +#define ACBG 6 +#define ACO 5 +#define ACI 4 +#define ACIE 3 +#define ACIC 2 +#define ACIS1 1 +#define ACIS0 0 + +/* ADC Control and status register - ADCSRA */ +#define ADEN 7 +#define ADSC 6 +#define ADFR 5 +#define ADIF 4 +#define ADIE 3 +#define ADPS2 2 +#define ADPS1 1 +#define ADPS0 0 + +/* ADC Multiplexer select - ADMUX */ +#define REFS1 7 +#define REFS0 6 +#define ADLAR 5 +#define MUX4 4 +#define MUX3 3 +#define MUX2 2 +#define MUX1 1 +#define MUX0 0 + +/* Port A Data Register - PORTA */ +#define PA7 7 +#define PA6 6 +#define PA5 5 +#define PA4 4 +#define PA3 3 +#define PA2 2 +#define PA1 1 +#define PA0 0 + +/* Port A Data Direction Register - DDRA */ +#define DDA7 7 +#define DDA6 6 +#define DDA5 5 +#define DDA4 4 +#define DDA3 3 +#define DDA2 2 +#define DDA1 1 +#define DDA0 0 + +/* Port A Input Pins - PINA */ +#define PINA7 7 +#define PINA6 6 +#define PINA5 5 +#define PINA4 4 +#define PINA3 3 +#define PINA2 2 +#define PINA1 1 +#define PINA0 0 + +/* Port B Data Register - PORTB */ +#define PB7 7 +#define PB6 6 +#define PB5 5 +#define PB4 4 +#define PB3 3 +#define PB2 2 +#define PB1 1 +#define PB0 0 + +/* Port B Data Direction Register - DDRB */ +#define DDB7 7 +#define DDB6 6 +#define DDB5 5 +#define DDB4 4 +#define DDB3 3 +#define DDB2 2 +#define DDB1 1 +#define DDB0 0 + +/* Port B Input Pins - PINB */ +#define PINB7 7 +#define PINB6 6 +#define PINB5 5 +#define PINB4 4 +#define PINB3 3 +#define PINB2 2 +#define PINB1 1 +#define PINB0 0 + +/* Port C Data Register - PORTC */ +#define PC7 7 +#define PC6 6 +#define PC5 5 +#define PC4 4 +#define PC3 3 +#define PC2 2 +#define PC1 1 +#define PC0 0 + +/* Port C Data Direction Register - DDRC */ +#define DDC7 7 +#define DDC6 6 +#define DDC5 5 +#define DDC4 4 +#define DDC3 3 +#define DDC2 2 +#define DDC1 1 +#define DDC0 0 + +/* Port C Input Pins - PINC */ +#define PINC7 7 +#define PINC6 6 +#define PINC5 5 +#define PINC4 4 +#define PINC3 3 +#define PINC2 2 +#define PINC1 1 +#define PINC0 0 + +/* Port D Data Register - PORTD */ +#define PD7 7 +#define PD6 6 +#define PD5 5 +#define PD4 4 +#define PD3 3 +#define PD2 2 +#define PD1 1 +#define PD0 0 + +/* Port D Data Direction Register - DDRD */ +#define DDD7 7 +#define DDD6 6 +#define DDD5 5 +#define DDD4 4 +#define DDD3 3 +#define DDD2 2 +#define DDD1 1 +#define DDD0 0 + +/* Port D Input Pins - PIND */ +#define PIND7 7 +#define PIND6 6 +#define PIND5 5 +#define PIND4 4 +#define PIND3 3 +#define PIND2 2 +#define PIND1 1 +#define PIND0 0 + +/* Port E Data Register - PORTE */ +#define PE7 7 +#define PE6 6 +#define PE5 5 +#define PE4 4 +#define PE3 3 +#define PE2 2 +#define PE1 1 +#define PE0 0 + +/* Port E Data Direction Register - DDRE */ +#define DDE7 7 +#define DDE6 6 +#define DDE5 5 +#define DDE4 4 +#define DDE3 3 +#define DDE2 2 +#define DDE1 1 +#define DDE0 0 + +/* Port E Input Pins - PINE */ +#define PINE7 7 +#define PINE6 6 +#define PINE5 5 +#define PINE4 4 +#define PINE3 3 +#define PINE2 2 +#define PINE1 1 +#define PINE0 0 + +/* Port F Data Register - PORTF */ +#define PF7 7 +#define PF6 6 +#define PF5 5 +#define PF4 4 +#define PF3 3 +#define PF2 2 +#define PF1 1 +#define PF0 0 + +/* Port F Data Direction Register - DDRF */ +#define DDF7 7 +#define DDF6 6 +#define DDF5 5 +#define DDF4 4 +#define DDF3 3 +#define DDF2 2 +#define DDF1 1 +#define DDF0 0 + +/* Port F Input Pins - PINF */ +#define PINF7 7 +#define PINF6 6 +#define PINF5 5 +#define PINF4 4 +#define PINF3 3 +#define PINF2 2 +#define PINF1 1 +#define PINF0 0 + +/* Port G Data Register - PORTG */ +#define PG4 4 +#define PG3 3 +#define PG2 2 +#define PG1 1 +#define PG0 0 + +/* Port G Data Direction Register - DDRG */ +#define DDG4 4 +#define DDG3 3 +#define DDG2 2 +#define DDG1 1 +#define DDG0 0 + +/* Port G Input Pins - PING */ +#define PING4 4 +#define PING3 3 +#define PING2 2 +#define PING1 1 +#define PING0 0 + +/* Constants */ +#define SPM_PAGESIZE 256 +#define RAMEND 0x10FF /* Last On-Chip SRAM Location */ +#define XRAMEND 0xFFFF +#define E2END 0x0FFF +#define FLASHEND 0x1FFFF + +#endif /* _AVR_IOM128_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom8.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom8.h new file mode 100644 index 0000000..439ef6c --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/iom8.h @@ -0,0 +1,498 @@ +/* Copyright (c) 2002, Marek Michalkiewicz + 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. */ + +/* $Id: iom8.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +/* avr/iom8.h - definitions for ATmega8 */ + +#ifndef _AVR_IOM8_H_ +#define _AVR_IOM8_H_ 1 + +/* This file should only be included from , never directly. */ + +#ifndef _AVR_IO_H_ +# error "Include instead of this file." +#endif + +#ifndef _AVR_IOXXX_H_ +# define _AVR_IOXXX_H_ "iom8.h" +#else +# error "Attempt to include more than one file." +#endif + +/* I/O registers */ + +/* TWI stands for "Two Wire Interface" or "TWI Was I2C(tm)" */ +#define TWBR _SFR_IO8(0x00) +#define TWSR _SFR_IO8(0x01) +#define TWAR _SFR_IO8(0x02) +#define TWDR _SFR_IO8(0x03) + +/* ADC */ +#define ADCW _SFR_IO16(0x04) +#ifndef __ASSEMBLER__ +#define ADC _SFR_IO16(0x04) +#endif +#define ADCL _SFR_IO8(0x04) +#define ADCH _SFR_IO8(0x05) +#define ADCSR _SFR_IO8(0x06) +#define ADCSRA _SFR_IO8(0x06) /* Changed in 2486H-AVR-09/02 */ +#define ADMUX _SFR_IO8(0x07) + +/* analog comparator */ +#define ACSR _SFR_IO8(0x08) + +/* USART */ +#define UBRRL _SFR_IO8(0x09) +#define UCSRB _SFR_IO8(0x0A) +#define UCSRA _SFR_IO8(0x0B) +#define UDR _SFR_IO8(0x0C) + +/* SPI */ +#define SPCR _SFR_IO8(0x0D) +#define SPSR _SFR_IO8(0x0E) +#define SPDR _SFR_IO8(0x0F) + +/* Port D */ +#define PIND _SFR_IO8(0x10) +#define DDRD _SFR_IO8(0x11) +#define PORTD _SFR_IO8(0x12) + +/* Port C */ +#define PINC _SFR_IO8(0x13) +#define DDRC _SFR_IO8(0x14) +#define PORTC _SFR_IO8(0x15) + +/* Port B */ +#define PINB _SFR_IO8(0x16) +#define DDRB _SFR_IO8(0x17) +#define PORTB _SFR_IO8(0x18) + +/* 0x1C..0x1F EEPROM */ + +#define UCSRC _SFR_IO8(0x20) +#define UBRRH _SFR_IO8(0x20) + +#define WDTCR _SFR_IO8(0x21) +#define ASSR _SFR_IO8(0x22) + +/* Timer 2 */ +#define OCR2 _SFR_IO8(0x23) +#define TCNT2 _SFR_IO8(0x24) +#define TCCR2 _SFR_IO8(0x25) + +/* Timer 1 */ +#define ICR1 _SFR_IO16(0x26) +#define ICR1L _SFR_IO8(0x26) +#define ICR1H _SFR_IO8(0x27) +#define OCR1B _SFR_IO16(0x28) +#define OCR1BL _SFR_IO8(0x28) +#define OCR1BH _SFR_IO8(0x29) +#define OCR1A _SFR_IO16(0x2A) +#define OCR1AL _SFR_IO8(0x2A) +#define OCR1AH _SFR_IO8(0x2B) +#define TCNT1 _SFR_IO16(0x2C) +#define TCNT1L _SFR_IO8(0x2C) +#define TCNT1H _SFR_IO8(0x2D) +#define TCCR1B _SFR_IO8(0x2E) +#define TCCR1A _SFR_IO8(0x2F) + +#define SFIOR _SFR_IO8(0x30) + +#define OSCCAL _SFR_IO8(0x31) + +/* Timer 0 */ +#define TCNT0 _SFR_IO8(0x32) +#define TCCR0 _SFR_IO8(0x33) + +#define MCUCSR _SFR_IO8(0x34) +#define MCUCR _SFR_IO8(0x35) + +#define TWCR _SFR_IO8(0x36) + +#define SPMCR _SFR_IO8(0x37) + +#define TIFR _SFR_IO8(0x38) +#define TIMSK _SFR_IO8(0x39) + +#define GIFR _SFR_IO8(0x3A) +#define GIMSK _SFR_IO8(0x3B) +#define GICR _SFR_IO8(0x3B) /* Changed in 2486H-AVR-09/02 */ + +/* 0x3C reserved (OCR0?) */ + +/* 0x3D..0x3E SP */ + +/* 0x3F SREG */ + +/* Interrupt vectors */ + +#define SIG_INTERRUPT0 _VECTOR(1) +#define SIG_INTERRUPT1 _VECTOR(2) +#define SIG_OUTPUT_COMPARE2 _VECTOR(3) +#define SIG_OVERFLOW2 _VECTOR(4) +#define SIG_INPUT_CAPTURE1 _VECTOR(5) +#define SIG_OUTPUT_COMPARE1A _VECTOR(6) +#define SIG_OUTPUT_COMPARE1B _VECTOR(7) +#define SIG_OVERFLOW1 _VECTOR(8) +#define SIG_OVERFLOW0 _VECTOR(9) +#define SIG_SPI _VECTOR(10) +#define SIG_UART_RECV _VECTOR(11) +#define SIG_UART_DATA _VECTOR(12) +#define SIG_UART_TRANS _VECTOR(13) +#define SIG_ADC _VECTOR(14) +#define SIG_EEPROM_READY _VECTOR(15) +#define SIG_COMPARATOR _VECTOR(16) +#define SIG_2WIRE_SERIAL _VECTOR(17) +#define SIG_SPM_READY _VECTOR(18) + +#define _VECTORS_SIZE 38 + +/* Bit numbers */ + +/* GIMSK / GICR */ +#define INT1 7 +#define INT0 6 +#define IVSEL 1 +#define IVCE 0 + +/* GIFR */ +#define INTF1 7 +#define INTF0 6 + +/* TIMSK */ +#define OCIE2 7 +#define TOIE2 6 +#define TICIE1 5 +#define OCIE1A 4 +#define OCIE1B 3 +#define TOIE1 2 +/* bit 1 reserved (OCIE0?) */ +#define TOIE0 0 + +/* TIFR */ +#define OCF2 7 +#define TOV2 6 +#define ICF1 5 +#define OCF1A 4 +#define OCF1B 3 +#define TOV1 2 +/* bit 1 reserved (OCF0?) */ +#define TOV0 0 + +/* SPMCR */ +#define SPMIE 7 +#define RWWSB 6 +/* bit 5 reserved */ +#define RWWSRE 4 +#define BLBSET 3 +#define PGWRT 2 +#define PGERS 1 +#define SPMEN 0 + +/* TWCR */ +#define TWINT 7 +#define TWEA 6 +#define TWSTA 5 +#define TWSTO 4 +#define TWWC 3 +#define TWEN 2 +/* bit 1 reserved (TWI_TST?) */ +#define TWIE 0 + +/* TWAR */ +#define TWA6 7 +#define TWA5 6 +#define TWA4 5 +#define TWA3 4 +#define TWA2 3 +#define TWA1 2 +#define TWA0 1 +#define TWGCE 0 + +/* TWSR */ +#define TWS7 7 +#define TWS6 6 +#define TWS5 5 +#define TWS4 4 +#define TWS3 3 +/* bit 2 reserved */ +#define TWPS1 1 +#define TWPS0 0 + +/* MCUCR */ +#define SE 7 +#define SM2 6 +#define SM1 5 +#define SM0 4 +#define ISC11 3 +#define ISC10 2 +#define ISC01 1 +#define ISC00 0 + +/* MCUCSR */ +/* bits 7-4 reserved */ +#define WDRF 3 +#define BORF 2 +#define EXTRF 1 +#define PORF 0 + +/* SFIOR */ +/* bits 7-5 reserved */ +#define ADHSM 4 +#define ACME 3 +#define PUD 2 +#define PSR2 1 +#define PSR10 0 + +/* TCCR0 */ +/* bits 7-3 reserved */ +#define CS02 2 +#define CS01 1 +#define CS00 0 + +/* TCCR2 */ +#define FOC2 7 +#define WGM20 6 +#define COM21 5 +#define COM20 4 +#define WGM21 3 +#define CS22 2 +#define CS21 1 +#define CS20 0 + +/* ASSR */ +/* bits 7-4 reserved */ +#define AS2 3 +#define TCN2UB 2 +#define OCR2UB 1 +#define TCR2UB 0 + +/* TCCR1A */ +#define COM1A1 7 +#define COM1A0 6 +#define COM1B1 5 +#define COM1B0 4 +#define FOC1A 3 +#define FOC1B 2 +#define WGM11 1 +#define WGM10 0 + +/* TCCR1B */ +#define ICNC1 7 +#define ICES1 6 +/* bit 5 reserved */ +#define WGM13 4 +#define WGM12 3 +#define CS12 2 +#define CS11 1 +#define CS10 0 + +/* WDTCR */ +/* bits 7-5 reserved */ +#define WDCE 4 +#define WDE 3 +#define WDP2 2 +#define WDP1 1 +#define WDP0 0 + +/* UBRRH */ +#define URSEL 7 + +/* UCSRC */ +#define URSEL 7 +#define UMSEL 6 +#define UPM1 5 +#define UPM0 4 +#define USBS 3 +#define UCSZ1 2 +#define UCSZ0 1 +#define UCPOL 0 + +/* PORTB */ +#define PB7 7 +#define PB6 6 +#define PB5 5 +#define PB4 4 +#define PB3 3 +#define PB2 2 +#define PB1 1 +#define PB0 0 + +/* DDRB */ +#define DDB7 7 +#define DDB6 6 +#define DDB5 5 +#define DDB4 4 +#define DDB3 3 +#define DDB2 2 +#define DDB1 1 +#define DDB0 0 + +/* PINB */ +#define PINB7 7 +#define PINB6 6 +#define PINB5 5 +#define PINB4 4 +#define PINB3 3 +#define PINB2 2 +#define PINB1 1 +#define PINB0 0 + +/* PORTC */ +#define PC6 6 +#define PC5 5 +#define PC4 4 +#define PC3 3 +#define PC2 2 +#define PC1 1 +#define PC0 0 + +/* DDRC */ +#define DDC6 6 +#define DDC5 5 +#define DDC4 4 +#define DDC3 3 +#define DDC2 2 +#define DDC1 1 +#define DDC0 0 + +/* PINC */ +#define PINC6 6 +#define PINC5 5 +#define PINC4 4 +#define PINC3 3 +#define PINC2 2 +#define PINC1 1 +#define PINC0 0 + +/* PORTD */ +#define PD7 7 +#define PD6 6 +#define PD5 5 +#define PD4 4 +#define PD3 3 +#define PD2 2 +#define PD1 1 +#define PD0 0 + +/* DDRD */ +#define DDD7 7 +#define DDD6 6 +#define DDD5 5 +#define DDD4 4 +#define DDD3 3 +#define DDD2 2 +#define DDD1 1 +#define DDD0 0 + +/* PIND */ +#define PIND7 7 +#define PIND6 6 +#define PIND5 5 +#define PIND4 4 +#define PIND3 3 +#define PIND2 2 +#define PIND1 1 +#define PIND0 0 + +/* SPSR */ +#define SPIF 7 +#define WCOL 6 +#define SPI2X 0 + +/* SPCR */ +#define SPIE 7 +#define SPE 6 +#define DORD 5 +#define MSTR 4 +#define CPOL 3 +#define CPHA 2 +#define SPR1 1 +#define SPR0 0 + +/* UCSRA */ +#define RXC 7 +#define TXC 6 +#define UDRE 5 +#define FE 4 +#define DOR 3 +#define PE 2 +#define U2X 1 +#define MPCM 0 + +/* UCSRB */ +#define RXCIE 7 +#define TXCIE 6 +#define UDRIE 5 +#define RXEN 4 +#define TXEN 3 +#define UCSZ2 2 +#define RXB8 1 +#define TXB8 0 + +/* ACSR */ +#define ACD 7 +#define ACBG 6 +#define ACO 5 +#define ACI 4 +#define ACIE 3 +#define ACIC 2 +#define ACIS1 1 +#define ACIS0 0 + +/* ADCSR / ADCSRA */ +#define ADEN 7 +#define ADSC 6 +#define ADFR 5 +#define ADIF 4 +#define ADIE 3 +#define ADPS2 2 +#define ADPS1 1 +#define ADPS0 0 + +/* ADMUX */ +#define REFS1 7 +#define REFS0 6 +#define ADLAR 5 +/* bit 4 reserved */ +#define MUX3 3 +#define MUX2 2 +#define MUX1 1 +#define MUX0 0 + +/* Constants */ +#define SPM_PAGESIZE 64 +#define RAMEND 0x45F +#define XRAMEND 0x45F +#define E2END 0x1FF +#define FLASHEND 0x1FFF + +#endif /* _AVR_IOM8_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/portpins.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/portpins.h new file mode 100644 index 0000000..941f901 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/portpins.h @@ -0,0 +1,265 @@ +/* Copyright (c) 2003 Theodore A. Roth + 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. */ + +/* $Id: portpins.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +#ifndef _AVR_PORTPINS_H_ +#define _AVR_PORTPINS_H_ 1 + +/* This file should only be included from , never directly. */ + +#ifndef _AVR_IO_H_ +# error "Include instead of this file." +#endif + +/* Define Generic PORTn, DDn, and PINn values. */ + +/* Port Data Register (generic) */ +#define PORT7 7 +#define PORT6 6 +#define PORT5 5 +#define PORT4 4 +#define PORT3 3 +#define PORT2 2 +#define PORT1 1 +#define PORT0 0 + +/* Port Data Direction Register (generic) */ +#define DD7 7 +#define DD6 6 +#define DD5 5 +#define DD4 4 +#define DD3 3 +#define DD2 2 +#define DD1 1 +#define DD0 0 + +/* Port Input Pins (generic) */ +#define PIN7 7 +#define PIN6 6 +#define PIN5 5 +#define PIN4 4 +#define PIN3 3 +#define PIN2 2 +#define PIN1 1 +#define PIN0 0 + +/* Define PORTxn values for all possible port pins. */ + +/* PORT A */ + +#if defined(PA0) +# define PORTA0 PA0 +#endif +#if defined(PA1) +# define PORTA1 PA1 +#endif +#if defined(PA2) +# define PORTA2 PA2 +#endif +#if defined(PA3) +# define PORTA3 PA3 +#endif +#if defined(PA4) +# define PORTA4 PA4 +#endif +#if defined(PA5) +# define PORTA5 PA5 +#endif +#if defined(PA6) +# define PORTA6 PA6 +#endif +#if defined(PA7) +# define PORTA7 PA7 +#endif + +/* PORT B */ + +#if defined(PB0) +# define PORTB0 PB0 +#endif +#if defined(PB1) +# define PORTB1 PB1 +#endif +#if defined(PB2) +# define PORTB2 PB2 +#endif +#if defined(PB3) +# define PORTB3 PB3 +#endif +#if defined(PB4) +# define PORTB4 PB4 +#endif +#if defined(PB5) +# define PORTB5 PB5 +#endif +#if defined(PB6) +# define PORTB6 PB6 +#endif +#if defined(PB7) +# define PORTB7 PB7 +#endif + +/* PORT C */ + +#if defined(PC0) +# define PORTC0 PC0 +#endif +#if defined(PC1) +# define PORTC1 PC1 +#endif +#if defined(PC2) +# define PORTC2 PC2 +#endif +#if defined(PC3) +# define PORTC3 PC3 +#endif +#if defined(PC4) +# define PORTC4 PC4 +#endif +#if defined(PC5) +# define PORTC5 PC5 +#endif +#if defined(PC6) +# define PORTC6 PC6 +#endif +#if defined(PC7) +# define PORTC7 PC7 +#endif + +/* PORT D */ + +#if defined(PD0) +# define PORTD0 PD0 +#endif +#if defined(PD1) +# define PORTD1 PD1 +#endif +#if defined(PD2) +# define PORTD2 PD2 +#endif +#if defined(PD3) +# define PORTD3 PD3 +#endif +#if defined(PD4) +# define PORTD4 PD4 +#endif +#if defined(PD5) +# define PORTD5 PD5 +#endif +#if defined(PD6) +# define PORTD6 PD6 +#endif +#if defined(PD7) +# define PORTD7 PD7 +#endif + +/* PORT E */ + +#if defined(PE0) +# define PORTE0 PE0 +#endif +#if defined(PE1) +# define PORTE1 PE1 +#endif +#if defined(PE2) +# define PORTE2 PE2 +#endif +#if defined(PE3) +# define PORTE3 PE3 +#endif +#if defined(PE4) +# define PORTE4 PE4 +#endif +#if defined(PE5) +# define PORTE5 PE5 +#endif +#if defined(PE6) +# define PORTE6 PE6 +#endif +#if defined(PE7) +# define PORTE7 PE7 +#endif + +/* PORT F */ + +#if defined(PF0) +# define PORTF0 PF0 +#endif +#if defined(PF1) +# define PORTF1 PF1 +#endif +#if defined(PF2) +# define PORTF2 PF2 +#endif +#if defined(PF3) +# define PORTF3 PF3 +#endif +#if defined(PF4) +# define PORTF4 PF4 +#endif +#if defined(PF5) +# define PORTF5 PF5 +#endif +#if defined(PF6) +# define PORTF6 PF6 +#endif +#if defined(PF7) +# define PORTF7 PF7 +#endif + +/* PORT G */ + +#if defined(PG0) +# define PORTG0 PG0 +#endif +#if defined(PG1) +# define PORTG1 PG1 +#endif +#if defined(PG2) +# define PORTG2 PG2 +#endif +#if defined(PG3) +# define PORTG3 PG3 +#endif +#if defined(PG4) +# define PORTG4 PG4 +#endif +#if defined(PG5) +# define PORTG5 PG5 +#endif +#if defined(PG6) +# define PORTG6 PG6 +#endif +#if defined(PG7) +# define PORTG7 PG7 +#endif + +#endif /* _AVR_PORTPINS_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/sfr_defs.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/sfr_defs.h new file mode 100644 index 0000000..f8268f2 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/sfr_defs.h @@ -0,0 +1,250 @@ +/* Copyright (c) 2002, Marek Michalkiewicz + 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. */ + +/* avr/sfr_defs.h - macros for accessing AVR special function registers */ + +/* $Id: sfr_defs.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +#ifndef _AVR_SFR_DEFS_H_ +#define _AVR_SFR_DEFS_H_ 1 + +/** \defgroup avr_sfr_notes Additional notes from + \ingroup avr_sfr + + The \c file is included by all of the \c + files, which use macros defined here to make the special function register + definitions look like C variables or simple constants, depending on the + _SFR_ASM_COMPAT define. Some examples from \c to + show how to define such macros: + + \code + #define PORTA _SFR_IO8(0x1b) + #define TCNT1 _SFR_IO16(0x2c) + #define PORTF _SFR_MEM8(0x61) + #define TCNT3 _SFR_MEM16(0x88) + \endcode + + If \c _SFR_ASM_COMPAT is not defined, C programs can use names like + PORTA directly in C expressions (also on the left side of + assignment operators) and GCC will do the right thing (use short I/O + instructions if possible). The \c __SFR_OFFSET definition is not used in + any way in this case. + + Define \c _SFR_ASM_COMPAT as 1 to make these names work as simple constants + (addresses of the I/O registers). This is necessary when included in + preprocessed assembler (*.S) source files, so it is done automatically if + \c __ASSEMBLER__ is defined. By default, all addresses are defined as if + they were memory addresses (used in \c lds/sts instructions). To use these + addresses in \c in/out instructions, you must subtract 0x20 from them. + + For more backwards compatibility, insert the following at the start of your + old assembler source file: + + \code + #define __SFR_OFFSET 0 + \endcode + + This automatically subtracts 0x20 from I/O space addresses, but it's a + hack, so it is recommended to change your source: wrap such addresses in + macros defined here, as shown below. After this is done, the + __SFR_OFFSET definition is no longer necessary and can be removed. + + Real example - this code could be used in a boot loader that is portable + between devices with \c SPMCR at different addresses. + + \verbatim + : #define SPMCR _SFR_IO8(0x37) + : #define SPMCR _SFR_MEM8(0x68) + \endverbatim + + \code + #if _SFR_IO_REG_P(SPMCR) + out _SFR_IO_ADDR(SPMCR), r24 + #else + sts _SFR_MEM_ADDR(SPMCR), r24 + #endif + \endcode + + You can use the \c in/out/cbi/sbi/sbic/sbis instructions, without the + _SFR_IO_REG_P test, if you know that the register is in the I/O + space (as with \c SREG, for example). If it isn't, the assembler will + complain (I/O address out of range 0...0x3f), so this should be fairly + safe. + + If you do not define \c __SFR_OFFSET (so it will be 0x20 by default), all + special register addresses are defined as memory addresses (so \c SREG is + 0x5f), and (if code size and speed are not important, and you don't like + the ugly #if above) you can always use lds/sts to access them. But, this + will not work if __SFR_OFFSET != 0x20, so use a different macro + (defined only if __SFR_OFFSET == 0x20) for safety: + + \code + sts _SFR_ADDR(SPMCR), r24 + \endcode + + In C programs, all 3 combinations of \c _SFR_ASM_COMPAT and + __SFR_OFFSET are supported - the \c _SFR_ADDR(SPMCR) macro can be + used to get the address of the \c SPMCR register (0x57 or 0x68 depending on + device). */ + +#ifdef __ASSEMBLER__ +#define _SFR_ASM_COMPAT 1 +#endif + +#ifndef __ASSEMBLER__ +/* These only work in C programs. */ +#include + +#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) +#define _MMIO_WORD(mem_addr) (*(volatile uint16_t *)(mem_addr)) +#endif + +#if _SFR_ASM_COMPAT + +#ifndef __SFR_OFFSET +/* Define as 0 before including this file for compatibility with old asm + sources that don't subtract __SFR_OFFSET from symbolic I/O addresses. */ +#define __SFR_OFFSET 0x20 +#endif + +#if (__SFR_OFFSET != 0) && (__SFR_OFFSET != 0x20) +#error "__SFR_OFFSET must be 0 or 0x20" +#endif + +#define _SFR_MEM8(mem_addr) (mem_addr) +#define _SFR_MEM16(mem_addr) (mem_addr) +#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET) +#define _SFR_IO16(io_addr) ((io_addr) + __SFR_OFFSET) + +#define _SFR_IO_ADDR(sfr) ((sfr) - __SFR_OFFSET) +#define _SFR_MEM_ADDR(sfr) (sfr) +#define _SFR_IO_REG_P(sfr) ((sfr) < 0x40 + __SFR_OFFSET) + +#if (__SFR_OFFSET == 0x20) +/* No need to use ?: operator, so works in assembler too. */ +#define _SFR_ADDR(sfr) _SFR_MEM_ADDR(sfr) +#elif !defined(__ASSEMBLER__) +#define _SFR_ADDR(sfr) (_SFR_IO_REG_P(sfr) ? (_SFR_IO_ADDR(sfr) + 0x20) : _SFR_MEM_ADDR(sfr)) +#endif + +#else /* !_SFR_ASM_COMPAT */ + +#define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr) +#define _SFR_MEM16(mem_addr) _MMIO_WORD(mem_addr) +#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + 0x20) +#define _SFR_IO16(io_addr) _MMIO_WORD((io_addr) + 0x20) + +#define _SFR_MEM_ADDR(sfr) ((uint16_t) &(sfr)) +#define _SFR_IO_ADDR(sfr) (_SFR_MEM_ADDR(sfr) - 0x20) +#define _SFR_IO_REG_P(sfr) (_SFR_MEM_ADDR(sfr) < 0x60) + +#define _SFR_ADDR(sfr) _SFR_MEM_ADDR(sfr) + +#endif /* !_SFR_ASM_COMPAT */ + +#define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr)) +#define _SFR_WORD(sfr) _MMIO_WORD(_SFR_ADDR(sfr)) + +/** \name Bit manipulation */ + +/*@{*/ +/** \def _BV + \ingroup avr_sfr + + \code #include \endcode + + Converts a bit number into a byte value. + + \note The bit shift is performed by the compiler which then inserts the + result into the code. Thus, there is no run-time overhead when using + _BV(). */ + +#define _BV(bit) (1 << (bit)) + +/*@}*/ + +#ifndef _VECTOR +#define _VECTOR(N) __vector_ ## N +#endif + +#ifndef __ASSEMBLER__ + + +/** \name IO register bit manipulation */ + +/*@{*/ + + + +/** \def bit_is_set + \ingroup avr_sfr + + \code #include \endcode + + Test whether bit \c bit in IO register \c sfr is set. + This will return a 0 if the bit is clear, and non-zero + if the bit is set. */ + +#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) + +/** \def bit_is_clear + \ingroup avr_sfr + + \code #include \endcode + + Test whether bit \c bit in IO register \c sfr is clear. + This will return non-zero if the bit is clear, and a 0 + if the bit is set. */ + +#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit))) + +/** \def loop_until_bit_is_set + \ingroup avr_sfr + + \code #include \endcode + + Wait until bit \c bit in IO register \c sfr is set. */ + +#define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit)) + +/** \def loop_until_bit_is_clear + \ingroup avr_sfr + + \code #include \endcode + + Wait until bit \c bit in IO register \c sfr is clear. */ + +#define loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit)) + +/*@}*/ + +#endif /* !__ASSEMBLER__ */ + +#endif /* _SFR_DEFS_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/signal.h b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/signal.h new file mode 100644 index 0000000..cc6a7cc --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/arch/include/avr/arch/signal.h @@ -0,0 +1,103 @@ +/* Copyright (c) 2002, Marek Michalkiewicz + 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. */ + +/* $Id: signal.h,v 1.1 2011-01-25 09:40:04 plazar Exp $ */ + +#ifndef _AVR_SIGNAL_H_ +#define _AVR_SIGNAL_H_ + +/** \name Macros for writing interrupt handler functions */ + +/*@{*/ + +/** \def SIGNAL(signame) + \ingroup avr_interrupts + + \code#include \endcode + + Introduces an interrupt handler function that runs with global interrupts + initially disabled. */ + +#ifdef __cplusplus +#define SIGNAL(signame) \ +extern "C" void signame(void); \ +void signame (void) __attribute__ ((signal)); \ +void signame (void) +#else +#define SIGNAL(signame) \ +void signame (void) +#endif + +/** \def INTERRUPT(signame) + \ingroup avr_interrupts + + \code#include \endcode + + Introduces an interrupt handler function that runs with global interrupts + initially enabled. This allows interrupt handlers to be interrupted. */ + +#ifdef __cplusplus +#define INTERRUPT(signame) \ +extern "C" void signame(void); \ +void signame (void) __attribute__ ((interrupt)); \ +void signame (void) +#else +#define INTERRUPT(signame) \ +void signame (void) __attribute__ ((interrupt)); \ +void signame (void) +#endif + +/** \def EMPTY_INTERRUPT(signame) + \ingroup avr_interrupts + + \code#include \endcode + + Defines an empty interrupt handler function. This will not generate + any prolog or epilog code and will only return from the ISR. Do not + define a function body as this will define it for you. + Example: + \code EMPTY_INTERRUPT(SIG_ADC);\endcode */ + +#ifdef __cplusplus +#define EMPTY_INTERRUPT(signame) \ +extern "C" void signame(void); \ +void signame (void) __attribute__ ((naked)); \ +void signame (void) { __asm__ __volatile__ ("reti" ::); } +#else +#define EMPTY_INTERRUPT(signame) \ +void signame (void) __attribute__ ((naked)); \ +void signame (void) { __asm__ __volatile__ ("reti" ::); } +#endif + + + +/*@}*/ + +#endif /* _AVR_SIGNAL_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/Makefile.local.in b/targets/wasm-tacle/parallel/PapaBench/conf/Makefile.local.in new file mode 100644 index 0000000..dfc1ceb --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/Makefile.local.in @@ -0,0 +1,24 @@ + +# Architecture selection +# Uncomment the line matching your architecture and your machine +# Targets marked -alone- does not embed the CRT0 and minimal libc +# and the matching .conf file may be tuned. + +#CONF=powerpc-elf-alone +#CONF=powerpc-linux-gnu +#CONF=arm-elf +#CONF=arm-elf-alone +CONF=tricore-alone + +# Tools +CC = @WCCBIN@ +LD = @WCCBIN@ +SIZE = $(ARCH)size +OBJCOPY = $(ARCH)objcopy +OBJDUMP = $(ARCH)objdump -d + + +# Other configuration +USER_CFLAGS = -O0 -I @abs_srcdir@/../../PapaBench/avr/include/avr +USER_LDFLAGS = + diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/Makefile.std b/targets/wasm-tacle/parallel/PapaBench/conf/Makefile.std new file mode 100644 index 0000000..2f29e0d --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/Makefile.std @@ -0,0 +1,185 @@ +# +# $Id: Makefile.std,v 1.3 2011-01-21 11:52:33 moellmer Exp $ +# Copyright (C) 2003 Pascal Brisset, Antoine Drouin +# +# This file is part of paparazzi. +# +# paparazzi 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. +# +# paparazzi 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 paparazzi; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +# + + +# +# This is the common Makefile for the avr-target. +# Edit the configuration part to suit your local install +# + +# Configuration +PAPARAZZI_DIR = \"$(BASE)/\" +ATMELBIN = /usr/bin +ATMEL_INCLUDES = -I $(BASE)/avr/include/ +UISPBIN=/usr/bin +PROG_PORT = /dev/parport0 +USB_PROG_PORT = /dev/ttyUSB1 + + +# Architecture dependent +include $(BASE)/conf/Makefile.local +-include $(BASE)/conf/$(CONF).conf + +SERIAL_FLAGS = \ + -dprog=avr910 \ + -dpart=auto \ + -dserial=/dev/ttyS0 \ + -dspeed=38400 + +ISP_FLAGS = \ + -dlpt=$(PROG_PORT) -dprog=stk200 -v=3 + +USB_FLAGS = + -dserial=$(USB_PROG_PORT) \ + -dprog=avr910 \ + -dpart=auto \ + -v=3 + + +UISP = uisp +UISP_FLAGS = $(ISP_FLAGS) +#UISP_FLAGS = $(SERIAL_FLAGS) + + +# +# End of configuration part. +# + + +CFLAGS = \ + -Wall \ + $(ATMEL_INCLUDES) \ + $(INCLUDES) \ + $(LOCAL_CFLAGS) \ + -O2 \ + $(ARCH_CFLAGS) \ + $(USER_CFLAGS) +ifdef PAPABENCH_SINGLE +CFLAGS += -DPAPABENCH_SINGLE +endif + + +LDFLAGS = \ + $(ARCH_STDFLAGS) \ + $(ARCH_LDFLAGS) \ + $(USER_LDLFLAGS) + +# +# General rules +# + +all: \ + $(TARGET).elf $(TARGET).dis + +compile: $(TARGET).elf \ + +load upload: check_fuses \ + $(TARGET).install + +$(TARGET).objs = \ + $($(TARGET).srcs:.c=.o) + +#$(TARGET).elf: $($(TARGET).objs) +$(TARGET).elf: + $(CC) $(CFLAGS) $($(TARGET).srcs) -o $@ + + +# +# Fuses +# + +rd_fuses: check_arch + $(UISP) $(ISP_FLAGS) --rd_fuses + +wr_fuses: check_arch + $(UISP) $(ISP_FLAGS) --wr_fuse_h=$(HIGH_FUSE) + $(UISP) $(ISP_FLAGS) --wr_fuse_l=$(LOW_FUSE) + $(UISP) $(ISP_FLAGS) --wr_fuse_e=$(EXT_FUSE) + $(UISP) $(ISP_FLAGS) --wr_lock=$(LOCK_FUSE) + +TMPFILE = 'check_fuses.tmp' + +check_fuses: check_arch + @echo "##### Check of fuses #####" + @$(UISP) $(ISP_FLAGS) --rd_fuses >$(TMPFILE) + @if (grep -ri 'Fuse Low Byte' $(TMPFILE) | cut -c24- | grep -iq $(LOW_FUSE)) && (grep -ri 'Fuse High Byte' $(TMPFILE) |cut -c24- | grep -iq $(HIGH_FUSE)) && (grep -ri 'Fuse Extended Byte' $(TMPFILE) |cut -c24- | grep -iq $(EXT_FUSE)) && (grep -ri 'Lock Bits' $(TMPFILE) |cut -c24- | grep -iq $(LOCK_FUSE)); then echo "-> Fuses are Ok"; rm $(TMPFILE); else echo "-> Wrong fuses. Type 'make wr_fuses'"; rm $(TMPFILE); exit 1; fi + +ifdef PAPABENCH_NOLINK +%.elf: +else +%.elf: + $(LD) \ + $(LOCAL_LDFLAGS) \ + $($(@:.elf=).objs) \ + -o $@ \ + $(LDFLAGS) \ + -static + $(SIZE) $@ +endif + +%.s: %.c + $(CC) $(CFLAGS) -S $< + +%.o: %.s + $(CC) $(CFLAGS) -c $< + +%.hex: %.elf + $(OBJCOPY) -O ihex -R .eeprom $< $@ + +%.dis: %.elf + $(OBJDUMP) $< > $@ + + +%.install: %.hex check_arch + # stk200 needs to be erased first + $(UISP) $(UISP_FLAGS) --erase + $(UISP) $(UISP_FLAGS) --upload if=$< + +verify: $(TARGET).hex + $(UISP) $(UISP_FLAGS) --verify if=$< + +erase: check_arch + $(UISP) $(ISP_FLAGS) --erase + +check_arch : + @echo "##### Check architecture #####" + @if ($(UISP) $(UISP_FLAGS) 2>&1 | tr '[:upper:]' '[:lower:]' | grep $(ARCH)); then : ; else echo "-> Wrong architecture (mcu0 vs mcu1 ?)"; exit 1; fi + +avr_clean: + rm -f .depend $($(TARGET).srcs:.c=.s) + rm -f $(TARGET).elf $(TARGET).elf.s $($(TARGET).srcs:.c=.o) + + +# +# Dependencies +# + +.depend: + $(CC) $(CFLAGS) $($(TARGET).srcs) > .depend + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(MAKECMDGOALS),erase) +-include .depend +endif +endif + + diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/arm-elf-alone.conf b/targets/wasm-tacle/parallel/PapaBench/conf/arm-elf-alone.conf new file mode 100644 index 0000000..7707d4f --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/arm-elf-alone.conf @@ -0,0 +1,14 @@ +ARCH = arm-elf- +MACH = +STACK = 0x80000000 + +ARCH_CRT0=\ + $(BASE)/sw/lib/crt0/arm-elf-crt0.c + +ARCH_SOURCES= + +ARCH_CFLAGS=\ + -DSTACK=\"$(STACK)\" + +ARCH_LDFLAGS=\ + -nostartfiles diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/arm-elf.conf b/targets/wasm-tacle/parallel/PapaBench/conf/arm-elf.conf new file mode 100644 index 0000000..990d5e8 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/arm-elf.conf @@ -0,0 +1,2 @@ +ARCH = arm-elf- +MACH = diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/powerpc-elf-alone.conf b/targets/wasm-tacle/parallel/PapaBench/conf/powerpc-elf-alone.conf new file mode 100644 index 0000000..18b3ca5 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/powerpc-elf-alone.conf @@ -0,0 +1,15 @@ +ARCH = powerpc-elf- +MACH = +STACK = 0x80000000 + +ARCH_CRT0=\ + $(BASE)/sw/lib/crt0/powerpc-elf-crt0.c + +ARCH_SOURCES= + +ARCH_CFLAGS=\ + -DSTACK=\"$(STACK)\" + +ARCH_LDFLAGS=\ + -nostdlib \ + -nostartfiles diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/powerpc-linux-gnu.conf b/targets/wasm-tacle/parallel/PapaBench/conf/powerpc-linux-gnu.conf new file mode 100644 index 0000000..944513d --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/powerpc-linux-gnu.conf @@ -0,0 +1,2 @@ +ARCH = powerpc-linux-gnu- +MACH = diff --git a/targets/wasm-tacle/parallel/PapaBench/conf/tricore-alone.conf b/targets/wasm-tacle/parallel/PapaBench/conf/tricore-alone.conf new file mode 100644 index 0000000..830c59a --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/conf/tricore-alone.conf @@ -0,0 +1,14 @@ +ARCH = tricore- +MACH = +STACK = 0xd0003ffc + +#ARCH_CRT0=\ + #$(BASE)/sw/lib/crt0/arm-elf-crt0.c + +ARCH_SOURCES= + +ARCH_CFLAGS=\ + -DSTACK=\"$(STACK)\" + +ARCH_LDFLAGS=\ + #-nostartfiles diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.c new file mode 100644 index 0000000..e739481 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.c @@ -0,0 +1,120 @@ +#include +#include +#include + +#include "std.h" +#include "ad7714.h" +#include "spi.h" + +/* unipolar, 16 bits, current boost, filter 4000 */ +//#define AD_HIGH_FILTER_CFG 0xAF +//#define AD_LOW_FILTER_CFG 0xA0 + +/* filter 2000 */ +#define AD_HIGH_FILTER_CFG 0xA7 +#define AD_LOW_FILTER_CFG 0xD0 + +/* filter 19 */ +//const uint8_t AD_HIGH_FILTER_CFG = 0xA0; +//const uint8_t AD_LOW_FILTER_CFG = 0x13; + +struct AdMsg { + uint8_t len; + const uint8_t *data; +}; + +#define AD7714_SETUP_LEN 6 +const uint8_t ad7714_setup_data[ AD7714_SETUP_LEN ] = { + AD_F_HIGH_REG + AD_FD0, /* select high filter register */ + AD_HIGH_FILTER_CFG, + AD_F_LOW_REG + AD_FD0, /* select low filter register */ + AD_LOW_FILTER_CFG, + AD_MODE_REG + AD_FD0, /* select com register */ + AD_SELFCAL_MOD + AD_GAIN_128, +}; +const struct AdMsg ad7714_setup = {AD7714_SETUP_LEN, ad7714_setup_data}; + +#define AD7714_READ_LEN 3 +const uint8_t ad7714_read_data[ ] = { + AD_DATA_REG + AD_WR + AD_FD0, /* transmit read request */ + 0x00, /* transmit a dumb value just to get the result */ + 0xAA /* transmit a dumb value just to get the result */ +}; +const struct AdMsg ad7714_read = {AD7714_READ_LEN, ad7714_read_data}; + +#define AD7714_SELECT_CHANNEL_LEN 2 +const uint8_t ad7714_select_channel_data[ AD7714_SELECT_CHANNEL_LEN ] = { + AD_MODE_REG + AD_FD0, + // AD_BG_CAL_MOD + AD_GAIN_128 + AD_NOR_MOD + AD_GAIN_128 +}; +const struct AdMsg ad7714_select_channel = {AD7714_SELECT_CHANNEL_LEN, ad7714_select_channel_data}; + + +static struct AdMsg *msg; +static uint8_t idx; +uint16_t ad7714_sample; +uint8_t ad7714_sample_read; + + +void ad7714_start_transmitting ( const struct AdMsg *amsg ) +{ + /* Enable SPI, Master, MSB first, clock idle high, sample on trailing edge, clock rate fck/128 */ + SPI_START( _BV( SPE ) | _BV( MSTR ) | _BV( SPR1 ) | _BV( CPOL ) | _BV( + CPHA ) | _BV( SPR0 ) ); //| _BV(SPR0) + SPI_SELECT_SLAVE1(); + msg = ( struct AdMsg * )amsg; + SPDR = msg->data[ 0 ]; + idx = 0; +} + +void ad7714_on_spi_it( void ) +{ + uint8_t spi_read = SPDR; + if ( msg == &ad7714_read ) { + if ( idx == 1 ) + ad7714_sample = spi_read << 8; + else + if ( idx == 2 ) { + ad7714_sample += spi_read; + ad7714_sample_read = TRUE; + } + } + idx++; + if ( idx < msg->len ) + SPI_SEND( msg->data[ idx ] ); + else { + SPI_UNSELECT_SLAVE1(); + SPI_STOP(); + } +} + +uint8_t ad7714_status = 0; +void ad7714_on_it( void ) +{ + if ( ad7714_status == 0 ) + ad7714_start_transmitting( &ad7714_setup ); + else + if ( ad7714_status == 1 ) + ad7714_start_transmitting( &ad7714_select_channel ); + else + ad7714_start_transmitting( &ad7714_read ); + ad7714_status++; +} + +void ad7714_init( void ) +{ + /* setupt interrupt on falling edge */ + cbi( EICRB, ISC60 ); + sbi( EICRB, ISC61 ); + /* clear interrupt flag */ + // if (bit_is_set(EIFR, INTF6)) + // EIFR != _BV(INTF6); + Ad7714_Enable_It(); +} + + +SIGNAL( SIG_INTERRUPT6 ) +{ + ad7714_on_it(); +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.h new file mode 100644 index 0000000..ef722c0 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ad7714.h @@ -0,0 +1,56 @@ +#ifndef AD_7714_H +#define AD_7714_H + +#include + +/* AD7714 COM register */ +#define AD_COM_REG (0<<4) +#define AD_MODE_REG (1<<4) +#define AD_F_HIGH_REG (2<<4) +#define AD_F_LOW_REG (3<<4) +#define AD_TEST_REG (4<<4) +#define AD_DATA_REG (5<<4) +#define AD_ZS_CAL_REG (6<<4) +#define AD_FS_CAL_REG (7<<4) + +#define AD_WR (1<<3) + +#define AD_FD0 (4<<0) +#define AD_FD1 (5<<0) +#define AD_FD2 (6<<0) + +/* AD7714 MODE register */ +#define AD_NOR_MOD (0<<5) +#define AD_SELFCAL_MOD (1<<5) +#define AD_ZS_SYSCAL_MOD (2<<5) +#define AD_FS_SYSCAL_MOD (3<<5) +#define AD_SYSOFFCAL_MOD (4<<5) +#define AD_BG_CAL_MOD (5<<5) +#define AD_ZS_SELFCAL_MOD (6<<5) +#define AD_FS_SELFCAL_MOD (7<<5) + +#define AD_GAIN_1 (0<<2) +#define AD_GAIN_2 (1<<2) +#define AD_GAIN_4 (2<<2) +#define AD_GAIN_8 (3<<2) +#define AD_GAIN_16 (4<<2) +#define AD_GAIN_32 (5<<2) +#define AD_GAIN_64 (6<<2) +#define AD_GAIN_128 (7<<2) + +#define AD_BO (1<<1) +#define AD_FSYNC (1<<0) + +#define Ad7714_Disable_It() { cbi(EIMSK, INT6); } + +#define Ad7714_Enable_It() { sbi(EIMSK, INT6); } + +#define Ad7714_Ready() (bit_is_clear(EIFR, INTF6)) + +extern uint16_t ad7714_sample; +extern uint8_t ad7714_sample_read; +void ad7714_init( void ); +void ad7714_on_spi_it( void ); +void ad7714_on_it( void ); + +#endif /* AD_7714_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.c new file mode 100644 index 0000000..4a06179 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.c @@ -0,0 +1,130 @@ +/* + Paparazzi mcu0 adc functions + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + Copyright (C) 2002 Trammell Hudson + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "airframe.h" +#include "std.h" +#include "adc.h" + + +/************************************************************************* + + Analog to digital conversion code. + + We allow interrupts during the 2048 usec windows. If we run the + ADC clock faster than Clk/64 we have too much overhead servicing + the interrupts from it and end up with servo jitter. + + For now we've slowed the clock to Clk/128 because it lets us + be lazy in the interrupt routine. +*/ +#define VOLTAGE_TIME 0x07 +#define ANALOG_PORT PORTF +#define ANALOG_PORT_DIR DDRF + + +#ifdef CTL_BRD_V1_1 +#define ANALOG_VREF 0 +#endif + +#if defined CTL_BRD_V1_2 || defined CTL_BRD_V1_2_1 +#define ANALOG_VREF _BV(REFS0) +#endif + +uint16_t adc_samples[ NB_ADC ]; + +static struct adc_buf *buffers[ NB_ADC ]; + +void adc_buf_channel( uint8_t adc_channel, struct adc_buf *s ) +{ + buffers[ adc_channel ] = s; +} + +void +adc_init( void ) +{ + uint8_t i; + /* Ensure that our port is for input with no pull-ups */ + ANALOG_PORT = 0x00; + ANALOG_PORT_DIR = 0x00; + + /* Select our external voltage ref, which is tied to Vcc */ + ADMUX = ANALOG_VREF; + + /* Turn off the analog comparator */ + sbi( ACSR, ACD ); + + /* Select out clock, turn on the ADC interrupt and start conversion */ + ADCSR = 0 + | VOLTAGE_TIME + | ( 1 << ADEN ) + | ( 1 << ADIE ) + | ( 1 << ADSC ); + + /* Init to 0 (usefull ?) */ + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < NB_ADC; i++ ) + buffers[ i ] = ( struct adc_buf * )0; +} + +/** + Called when the voltage conversion is finished + + 8.913kHz on mega128@16MHz 1kHz/channel ?? +*/ + + +SIGNAL( SIG_ADC ) +{ + uint8_t adc_input = ADMUX & 0x7; + struct adc_buf *buf = buffers[ adc_input ]; + uint16_t adc_value = ADCW; + /* Store result */ + adc_samples[ adc_input ] = adc_value; + + if ( buf ) { + uint8_t new_head = buf->head + 1; + if ( new_head >= AV_NB_SAMPLE ) new_head = 0; + buf->sum -= buf->values[ new_head ]; + buf->values[ new_head ] = adc_value; + buf->sum += adc_value; + buf->head = new_head; + } + + /* Find the next input */ + adc_input++; + if ( adc_input >= 8 ) + adc_input = 0; + /* Select it */ + ADMUX = adc_input | ANALOG_VREF; + /* Restart the conversion */ + sbi( ADCSR, ADSC ); + +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.h new file mode 100644 index 0000000..5d8b1d8 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/adc.h @@ -0,0 +1,53 @@ +/* + Paparazzi mcu0 adc functions + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + Copyright (C) 2002 Trammell Hudson + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef _ADC_H_ +#define _ADC_H_ + +#include + + +#define NB_ADC 8 + +/* Array containing the last measured value */ +extern uint16_t adc_samples[ NB_ADC ]; + +void adc_init( void ); + +#define AV_NB_SAMPLE 0x20 + +struct adc_buf { + uint16_t sum; + uint16_t values[ AV_NB_SAMPLE ]; + uint8_t head; +}; + +/* Facility to store last values in a circular buffer for a specific + channel: allocate a (struct adc_buf) and register it with the following + function */ +void adc_buf_channel( uint8_t adc_channel, struct adc_buf *s ); +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/autopilot.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/autopilot.h new file mode 100644 index 0000000..6d72915 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/autopilot.h @@ -0,0 +1,123 @@ +/* + $Id: autopilot.h,v 1.1 2011-01-18 12:48:38 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef AUTOPILOT_H +#define AUTOPILOT_H + +#include "link_autopilot.h" + +#define TRESHOLD1 TRESHOLD_MANUAL_PPRZ +#define TRESHOLD2 200 * CLOCK + + +#define PPRZ_MODE_MANUAL 0 +#define PPRZ_MODE_AUTO1 1 +#define PPRZ_MODE_AUTO2 2 +#define PPRZ_MODE_HOME 3 +#define PPRZ_MODE_NB 4 + +#define PPRZ_MODE_OF_PULSE(pprz, mega8_status) \ + (pprz > TRESHOLD2 ? PPRZ_MODE_AUTO2 : \ + (pprz > TRESHOLD1 ? PPRZ_MODE_AUTO1 : PPRZ_MODE_MANUAL)) + +extern uint8_t pprz_mode; + + +#define VERTICAL_MODE_MANUAL 0 +#define VERTICAL_MODE_AUTO_GAZ 1 +#define VERTICAL_MODE_AUTO_CLIMB 2 +#define VERTICAL_MODE_AUTO_ALT 3 +#define VERTICAL_MODE_NB 4 + +#define LATERAL_MODE_MANUAL 0 +#define LATERAL_MODE_ROLL_RATE 1 +#define LATERAL_MODE_ROLL 2 +#define LATERAL_MODE_COURSE 3 +#define LATERAL_MODE_NB 4 + +#define VERTICAL_MODE_OF_PULSE(pprz) (pprz < TRESHOLD2 ? VERTICAL_MODE_MANUAL: \ + VERTICAL_MODE_AUTO_ALT) + +#define IR_ESTIM_MODE_OFF 0 +#define IR_ESTIM_MODE_ON 1 + +#define IR_ESTIM_MODE_OF_PULSE(pprz) (pprz < TRESHOLD2 ? IR_ESTIM_MODE_OFF: \ + IR_ESTIM_MODE_ON) + +extern uint8_t ir_estim_mode; + +#define STICK_PUSHED(pprz) (pprz < TRESHOLD1 || pprz > TRESHOLD2) + + +#define TRIM_PPRZ(pprz) (pprz < MIN_PPRZ ? MIN_PPRZ : \ + (pprz > MAX_PPRZ ? MAX_PPRZ : \ + pprz)) + +#define TRIM_UPPRZ(pprz) (pprz < 0 ? 0 : \ + (pprz > MAX_PPRZ ? MAX_PPRZ : \ + pprz)) + + +#define FLOAT_OF_PPRZ(pprz, center, travel) ((float)pprz / (float)MAX_PPRZ * travel + center) + +extern uint8_t fatal_error_nb; + +#define GAZ_THRESHOLD_TAKEOFF (pprz_t)(MAX_PPRZ * 0.9) + +extern uint8_t inflight_calib_mode; +//extern uint16_t flight_time; +extern uint8_t vertical_mode; +extern bool_t auto_pitch; +extern uint8_t lateral_mode; +extern uint8_t vsupply; + +extern bool_t rc_event_1, rc_event_2; + +extern float slider_1_val, slider_2_val; + +extern bool_t launch; + + +#define ModeUpdate(_mode, _value) { \ + uint8_t new_mode = _value; \ + if (_mode != new_mode) { _mode = new_mode; return TRUE; } \ + return FALSE; \ +} + +#define CheckEvent(_event) (_event ? _event = FALSE, TRUE : FALSE) + +#ifdef CTL_BRD_V1_1 +extern struct adc_buf buf_bat; +#endif + +void periodic_task( void ); +void use_gps_pos( void ); +void radio_control_task( void ); +/*receive_gps_data_task */ +void send_gps_pos( void ); +void send_radIR( void ); +void send_takeOff( void ); +/*end receive_gps_data_task*/ +void stabilisation_task( void ); +#endif /* AUTOPILOT_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/downlink.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/downlink.h new file mode 100644 index 0000000..dd10c8f --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/downlink.h @@ -0,0 +1,35 @@ +/* + Paparazzi mcu0 $Id: downlink.h,v 1.1 2011-01-18 12:48:38 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef DOWNLINK_H +#define DOWNLINK_H + +#include "modem.h" + +#define STX 0x05 +#define ETX 0x06 + +#include "messages.h" + +#endif /* DOWNLINK_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.c new file mode 100644 index 0000000..a013300 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.c @@ -0,0 +1,202 @@ +/* + Paparazzi autopilot $Id: estimator.c,v 1.2 2011-01-21 11:52:44 moellmer Exp $ + + Copyright (C) 2004 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "estimator.h" +#include "gps.h" +#include "pid.h" +#include "infrared.h" +#include "autopilot.h" + + +/* position in meters */ +float estimator_x; +float estimator_y; +float estimator_z; + +/* attitude in radian */ +float estimator_phi; +float estimator_psi; +float estimator_theta; + +/* speed in meters per second */ +float estimator_x_dot; +float estimator_y_dot; +float estimator_z_dot; + +/* rotational speed in radians per second */ +float estimator_phi_dot; +float estimator_psi_dot; +float estimator_theta_dot; + +/* flight time in seconds */ +uint16_t estimator_flight_time; +/* flight time in seconds */ +float estimator_t; + +/* horizontal speed in module and dir */ +float estimator_hspeed_mod; +float estimator_hspeed_dir; + +float estimator_rad_of_ir, estimator_ir, estimator_rad; + +#define EstimatorSetPos(x, y, z) { estimator_x = x; estimator_y = y; estimator_z = z; } +#define EstimatorSetAtt(phi, psi, theta) { estimator_phi = phi; estimator_psi = psi; estimator_theta = theta; } + + +// FIXME maybe vz = -climb for NED?? +#define EstimatorSetSpeedCart(vx, vy, vz) { \ + estimator_vx = vx; \ + estimator_vy = vy; \ + estimator_vz = vz; \ +} +// estimator_hspeed_mod = sqrt( estimator_vx * estimator_vx + estimator_vy * estimator_vy); +// estimator_hspeed_dir = atan2(estimator_vy, estimator_vx); + + +#define EstimatorSetSpeedPol(vhmod, vhdir, vz) { \ + estimator_hspeed_mod = vhmod; \ + estimator_hspeed_dir = vhdir; \ + estimator_z_dot = vz; \ +} +//FIXME is this true ?? estimator_vx = estimator_hspeed_mod * cos(estimator_hspeed_dir); +//FIXME is this true ?? estimator_vy = estimator_hspeed_mod * sin(estimator_hspeed_dir); + +#define EstimatorSetRotSpeed(phi_dot, psi_dot, theta_dot) { \ + estimator_phi_dot = phi_dot; \ + estimator_psi_dot = psi_dot; \ + estimator_theta_dot = theta_dot; \ +} + +inline void estimator_update_lls( void ); + +void estimator_init( void ) +{ + + EstimatorSetPos ( 0., 0., 0. ); + + EstimatorSetAtt ( 0., 0., 0 ); + + EstimatorSetSpeedPol ( 0., 0., 0. ); + + EstimatorSetRotSpeed ( 0., 0., 0. ); + + estimator_flight_time = 0; + + estimator_rad_of_ir = ir_rad_of_ir; +} + +#define EstimatorIrGainIsCorrect() (TRUE) + +void estimator_update_state_infrared( void ) +{ + float rad_of_ir = ( ir_estim_mode == IR_ESTIM_MODE_ON && + EstimatorIrGainIsCorrect() ) ? + estimator_rad_of_ir : ir_rad_of_ir; + estimator_phi = rad_of_ir * ir_roll; + + estimator_theta = rad_of_ir * ir_pitch; +} + +#define INIT_WEIGHT 100. /* The number of times the initial value has to be taken */ +#define RHO 0.999 /* The higher, the slower the estimation is changing */ + +#define g 9.81 + + +void estimator_update_ir_estim( void ) +{ + static float last_hspeed_dir; + static float last_t; + static bool_t initialized = FALSE; + static float sum_xy, sum_xx; + float absphi; + float init_ir2; + + if ( initialized ) { + float dt = gps_ftow - last_t; + if ( dt > 0.1 ) { // Against division by zero + float phi = ( estimator_hspeed_dir - last_hspeed_dir ); + //NORM_RAD_ANGLE(phi); + _Pragma( "loopbounds min 0 max 1" ) + while ( phi > M_PI ) phi -= 2 * M_PI; + _Pragma( "loopbounds min 0 max 1" ) + while ( phi < -M_PI ) phi += 2 * M_PI; + phi = phi / dt * NOMINAL_AIRSPEED / g; /* tan linearized */ + //NORM_RAD_ANGLE(phi); + _Pragma( "loopbounds min 0 max 1" ) + while ( phi > M_PI ) phi -= 2 * M_PI; + _Pragma( "loopbounds min 0 max 1" ) + while ( phi < -M_PI ) phi += 2 * M_PI; + estimator_ir = ( float )ir_roll; + estimator_rad = phi; + absphi = fabs( phi ); + if ( absphi < 1.0 && absphi > 0.05 && ( - ir_contrast / 2 < ir_roll && + ir_roll < ir_contrast / 2 ) ) { + sum_xy = estimator_rad * estimator_ir + RHO * sum_xy; + sum_xx = estimator_ir * estimator_ir + RHO * sum_xx; + #if defined IR_RAD_OF_IR_MIN_VALUE & defined IR_RAD_OF_IR_MAX_VALUE + float result = sum_xy / sum_xx; + if ( result < IR_RAD_OF_IR_MIN_VALUE ) + estimator_rad_of_ir = IR_RAD_OF_IR_MIN_VALUE; + else + if ( result > IR_RAD_OF_IR_MAX_VALUE ) + estimator_rad_of_ir = IR_RAD_OF_IR_MAX_VALUE; + else + estimator_rad_of_ir = result; + #else + estimator_rad_of_ir = sum_xy / sum_xx; + #endif + } + } + } else { + initialized = TRUE; + init_ir2 = ir_contrast; + init_ir2 = init_ir2 * init_ir2; + sum_xy = INIT_WEIGHT * estimator_rad_of_ir * init_ir2; + sum_xx = INIT_WEIGHT * init_ir2; + } + + last_hspeed_dir = estimator_hspeed_dir; + last_t = gps_ftow; +} + + +void estimator_update_state_gps( void ) +{ + if ( GPS_FIX_VALID( gps_mode ) ) { + EstimatorSetPos( gps_east, gps_north, gps_falt ); + EstimatorSetSpeedPol( gps_fspeed, gps_fcourse, gps_fclimb ); + + if ( estimator_flight_time ) + estimator_update_ir_estim(); + } +} + +void estimator_propagate_state( void ) +{ + +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.h new file mode 100644 index 0000000..e89ab6b --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/estimator.h @@ -0,0 +1,67 @@ +/* + $Id: estimator.h,v 1.1 2011-01-18 12:48:38 moellmer Exp $ + + Copyright (C) 2004 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef ESTIMATOR_H +#define ESTIMATOR_H + +#include + +/* position in meters */ +extern float estimator_x; +extern float estimator_y; +extern float estimator_z; + +/* attitude in radians */ +extern float estimator_phi; +extern float estimator_psi; +extern float estimator_theta; + +/* speed in meters per second */ +extern float estimator_x_dot; +extern float estimator_y_dot; +extern float estimator_z_dot; + +/* rotational speed in radians per second */ +extern float estimator_phi_dot; +extern float estimator_psi_dot; +extern float estimator_teta_dot; + +/* flight time in seconds */ +extern uint16_t estimator_flight_time; +extern float estimator_t; + +/* horizontal speed in module and dir (m/s, rad) */ +extern float estimator_hspeed_mod; +extern float estimator_hspeed_dir; + +void estimator_init( void ); +void estimator_update_state_infrared( void ); +void estimator_update_state_gps( void ); +void estimator_propagate_state( void ); + +extern float estimator_rad_of_ir, estimator_ir, estimator_rad; + + + +#endif /* ESTIMATOR_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps.h new file mode 100644 index 0000000..bd685c1 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps.h @@ -0,0 +1,58 @@ +/* + Paparazzi mcu0 $Id: gps.h,v 1.1 2011-01-18 12:48:38 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +/* + Parse SIRF protocol from ublox SAM module + +*/ + + +#ifndef GPS_H +#define GPS_H + +#include "std.h" + +extern uint8_t gps_mode; +extern float gps_ftow; /* ms */ +extern float gps_falt; /* m */ +extern float gps_fspeed; /* m/s */ +extern float gps_fclimb; /* m/s */ +extern float gps_fcourse; /* rad */ +extern int32_t gps_utm_east, gps_utm_north; +extern float gps_east, gps_north; /* m */ + +void gps_init( void ); +void parse_gps_msg( void ); +extern volatile uint8_t gps_msg_received; +extern bool_t gps_pos_available; +extern uint8_t gps_nb_ovrn; + +#ifdef UBX +#include "ubx.h" +#else +#include "sirf.h" +#endif + + +#endif /* GPS_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_sirf.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_sirf.c new file mode 100644 index 0000000..30aa3e4 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_sirf.c @@ -0,0 +1,318 @@ +/* + Paparazzi mcu0 $Id: gps_sirf.c,v 1.2 2011-01-25 09:40:36 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 +#include "math_papabench.h" + +#include "uart.h" +#include "gps.h" + + +float gps_falt; +float gps_fspeed; +float gps_fclimb; +float gps_fcourse; +uint8_t gps_mode; +volatile bool_t gps_msg_received; +bool_t gps_pos_available; + + +#define SIRF_MAX_PAYLOAD 255 +uint8_t sirf_msg_buf[ SIRF_MAX_PAYLOAD ]; + +#define READ_INT32_AT_OFFSET(offset, dest) \ +{ \ + dest[ 0 ] = sirf_msg_buf[ offset+3 ]; \ + dest[ 1 ] = sirf_msg_buf[ offset+2 ]; \ + dest[ 2 ] = sirf_msg_buf[ offset+1 ]; \ + dest[ 3 ] = sirf_msg_buf[ offset ]; \ +} \ +/* ext nav type = 0x62 + offset len + type 0 1 + lat 1 4 + lon 5 4 + alt 9 4 + speed 13 4 + climb 17 4 + course 21 4 + mode 25 1 +*/ +void parse_gps_msg( void ) +{ + static int32_t tmp_int32; + uint8_t *tmp = ( uint8_t * )&tmp_int32; + + READ_INT32_AT_OFFSET( 1, tmp ); + gps_lat = tmp_int32; + + READ_INT32_AT_OFFSET( 5, tmp ); + gps_lon = tmp_int32; + + READ_INT32_AT_OFFSET( 9, tmp ); + gps_falt = ( float )tmp_int32 / 1e3; + + READ_INT32_AT_OFFSET( 13, tmp ); + gps_fspeed = ( float )tmp_int32 / 1e3; + + READ_INT32_AT_OFFSET( 17, tmp ); + gps_fclimb = ( float )tmp_int32 / 1e3; + + READ_INT32_AT_OFFSET( 21, tmp ); + gps_fcourse = ( float )tmp_int32 / 1e8; + + gps_mode = sirf_msg_buf[ 25 ]; + + gps_pos_available = TRUE; +} + + + + + + +void gps_init( void ) +{ + /* Enable uart */ + #ifdef SIMUL + uart0_init(); + #else + uart1_init(); + #endif +} + +#define SIRF_START1 0xA0 +#define SIRF_START2 0xA2 +#define SIRF_END1 0xB0 +#define SIRF_END2 0xB3 + +#ifdef SIMUL +#define IR_START 0xA1 /* simulator/mc.ml */ +volatile int16_t simul_ir_roll; +volatile int16_t simul_ir_pitch; +#endif + +#define SIRF_TYP_NAV 0x02 +#define SIRF_TYP_EXT_NAV 0x62 + +#define UNINIT 0 +#define GOT_START1 1 +#define GOT_START2 2 +#define GOT_LEN1 3 +#define GOT_LEN2 4 +#define GOT_PAYLOAD 5 +#define GOT_CHECKSUM1 6 +#define GOT_CHECKSUM2 7 +#define GOT_END1 8 +#ifdef SIMUL +#define GOT_IR_START 9 +#define GOT_IR1 10 +#define GOT_IR2 11 +#define GOT_IR3 12 +#endif + +static uint8_t sirf_status; +static uint16_t sirf_len; +static uint16_t sirf_checksum; +static uint8_t sirf_type; +static uint8_t sirf_msg_idx; + + +static inline void parse_sirf( uint8_t c ) +{ + /*#ifdef WITH_SWITCH + switch (sirf_status) { + case UNINIT: + if (c == SIRF_START1) + sirf_status++; + #ifdef SIMUL + if (c == IR_START) + sirf_status = GOT_IR_START; + #endif + break; + case GOT_START1: + if (c != SIRF_START2) + goto error; + sirf_status++; + break; + case GOT_START2: + sirf_len = (c<<8) & 0xFF00; + sirf_status++; + break; + case GOT_LEN1: + sirf_len += (c & 0x00FF); + if (sirf_len > SIRF_MAX_PAYLOAD) + goto error; + sirf_msg_idx = 0; + sirf_status++; + break; + case GOT_LEN2: + if (sirf_msg_idx==0) { + sirf_type = c; + } + if (sirf_type == SIRF_TYP_EXT_NAV) + sirf_msg_buf[ sirf_msg_idx ] = c; + sirf_msg_idx++; + if (sirf_msg_idx >= sirf_len) { + sirf_status++; + } + break; + case GOT_PAYLOAD: + sirf_checksum = (c<<8) & 0xFF00; + sirf_status++; + break; + case GOT_CHECKSUM1: + sirf_checksum += (c & 0x00FF); + // fixme: check correct + sirf_status++; + break; + case GOT_CHECKSUM2: + if (c != SIRF_END1) + goto error; + sirf_status++; + break; + case GOT_END1: + if (c != SIRF_END2) + goto error; + + if (sirf_type == SIRF_TYP_EXT_NAV) + gps_msg_received = TRUE; + goto restart; + break; + #ifdef SIMUL + case GOT_IR_START: + simul_ir_roll = c << 8; + sirf_status++; + break; + case GOT_IR1: + simul_ir_roll |= c; + sirf_status++; + break; + case GOT_IR2: + simul_ir_pitch = c << 8; + sirf_status++; + break; + case GOT_IR3: + simul_ir_pitch |= c; + goto restart; + break; + #endif + } + #else*/ + if ( sirf_status == UNINIT ) { + if ( c == SIRF_START1 ) + sirf_status++; + #ifdef SIMUL + if ( c == IR_START ) + sirf_status = GOT_IR_START; + #endif + } else + if ( sirf_status == GOT_START1 ) { + if ( c != SIRF_START2 ) + goto error; + sirf_status++; + } else + if ( sirf_status == GOT_START2 ) { + sirf_len = ( c << 8 ) & 0xFF00; + sirf_status++; + } else + if ( sirf_status == GOT_LEN1 ) { + sirf_len += ( c & 0x00FF ); + if ( sirf_len > SIRF_MAX_PAYLOAD ) + goto error; + sirf_msg_idx = 0; + sirf_status++; + } else + if ( sirf_status == GOT_LEN2 ) { + if ( sirf_msg_idx == 0 ) + sirf_type = c; + if ( sirf_type == SIRF_TYP_EXT_NAV ) + sirf_msg_buf[ sirf_msg_idx ] = c; + sirf_msg_idx++; + if ( sirf_msg_idx >= sirf_len ) + sirf_status++; + } else + if ( sirf_status == GOT_PAYLOAD ) { + sirf_checksum = ( c << 8 ) & 0xFF00; + sirf_status++; + } else + if ( sirf_status == GOT_CHECKSUM1 ) { + sirf_checksum += ( c & 0x00FF ); + /* fixme: check correct */ + sirf_status++; + } else + if ( sirf_status == GOT_CHECKSUM2 ) { + if ( c != SIRF_END1 ) + goto error; + sirf_status++; + } else + if ( sirf_status == GOT_END1 ) { + if ( c != SIRF_END2 ) + goto error; + + if ( sirf_type == SIRF_TYP_EXT_NAV ) + gps_msg_received = TRUE; + goto restart; + } + #ifdef SIMUL + else + if ( sirf_status == GOT_IR_START ) { + simul_ir_roll = c << 8; + sirf_status++; + } else + if ( sirf_status == GOT_IR1 ) { + simul_ir_roll |= c; + sirf_status++; + } else + if ( sirf_status == GOT_IR2 ) { + simul_ir_pitch = c << 8; + sirf_status++; + } else + if ( sirf_status == GOT_IR3 ) { + simul_ir_pitch |= c; + goto restart; + } + #endif + else {} +//#endif + return; +error: + // modem_putc('r'); +restart: + // modem_putc('\n'); + sirf_status = UNINIT; + sirf_checksum = 0; + return; + +} + +#ifdef SIMUL +ReceiveUart0( parse_sirf ); +#else +ReceiveUart1( parse_sirf ); +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_ubx.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_ubx.c new file mode 100644 index 0000000..4d6b750 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/gps_ubx.c @@ -0,0 +1,265 @@ +/* + Paparazzi mcu0 $Id: gps_ubx.c,v 1.4 2011-01-25 09:40:36 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 +#include + +#include "flight_plan.h" +#include "uart.h" +#include "gps.h" +#include "ubx_protocol.h" +#include "flight_plan.h" + +float gps_ftow; +float gps_falt; +float gps_fspeed; +float gps_fclimb; +float gps_fcourse; +int32_t gps_utm_east, gps_utm_north; +float gps_east, gps_north; +uint8_t gps_mode; +volatile bool_t gps_msg_received; +bool_t gps_pos_available; +const int32_t utm_east0 = NAV_UTM_EAST0; +const int32_t utm_north0 = NAV_UTM_NORTH0; + +#define UBX_MAX_PAYLOAD 255 +static uint8_t ubx_msg_buf[ UBX_MAX_PAYLOAD ]; + +#define RadianOfDeg(d) ((d)/180.*3.1415927) + +#ifdef SIMUL +#include "infrared.h" +#define IR_START 0xA1 /* simulator/mc.ml */ +volatile int16_t simul_ir_roll; +volatile int16_t simul_ir_pitch; +#endif + +#define UNINIT 0 +#define GOT_SYNC1 1 +#define GOT_SYNC2 2 +#define GOT_CLASS 3 +#define GOT_ID 4 +#define GOT_LEN1 5 +#define GOT_LEN2 6 +#define GOT_PAYLOAD 7 +#define GOT_CHECKSUM1 8 +#ifdef SIMUL +#define GOT_IR_START 20 +#define GOT_IR1 21 +#define GOT_IR2 22 +#define GOT_IR3 23 +#endif + +static uint8_t ubx_status; +static uint16_t ubx_len; +static uint8_t ubx_msg_idx; +// was static +uint8_t ck_a, ck_b, ubx_id, ubx_class; + +void gps_init( void ) +{ + /* Enable uart */ + #ifdef SIMUL + uart0_init(); + simul_ir_roll = ir_roll_neutral; + simul_ir_pitch = ir_pitch_neutral; + #else + uart1_init(); + #endif + ubx_status = UNINIT; +} + +void parse_gps_msg( void ) +{ + if ( ubx_class == UBX_NAV_ID ) { + if ( ubx_id == UBX_NAV_POSUTM_ID ) { + gps_utm_east = UBX_NAV_POSUTM_EAST( ubx_msg_buf ); + gps_utm_north = UBX_NAV_POSUTM_NORTH( ubx_msg_buf ); + gps_falt = ( float )UBX_NAV_POSUTM_ALT( ubx_msg_buf ) / 100.; + } else + if ( ubx_id == UBX_NAV_STATUS_ID ) + gps_mode = UBX_NAV_STATUS_GPSfix( ubx_msg_buf ); + + else + if ( ubx_id == UBX_NAV_VELNED_ID ) { + gps_fspeed = ( ( float )UBX_NAV_VELNED_GSpeed( ubx_msg_buf ) ) / 1e2; + gps_fclimb = ( ( float )UBX_NAV_VELNED_VEL_D( ubx_msg_buf ) ) / -1e2; + gps_fcourse = RadianOfDeg( ( ( float )UBX_NAV_VELNED_Heading( + ubx_msg_buf ) ) / 1e5 ); + gps_ftow = ( ( float )UBX_NAV_VELNED_ITOW( ubx_msg_buf ) ) / 1e3; + + gps_east = gps_utm_east / 100 - NAV_UTM_EAST0; + gps_north = gps_utm_north / 100 - NAV_UTM_NORTH0; + + + gps_pos_available = TRUE; /* The 3 UBX messages are sent in one rafale */ + } + } + #ifdef SIMUL + if ( ubx_class == UBX_USR_ID ) { + if ( ubx_id == UBX_USR_IRSIM_ID ) { + simul_ir_roll = UBX_USR_IRSIM_ROLL( ubx_msg_buf ); + simul_ir_pitch = UBX_USR_IRSIM_PITCH( ubx_msg_buf ); + } + } + #endif +} + + +uint8_t gps_nb_ovrn; + + +static void parse_ubx( uint8_t c ) +{ + if ( ubx_status < GOT_PAYLOAD ) { + ck_a += c; + ck_b += ck_a; + } + /*#ifdef WITH_SWITCH + switch (ubx_status) { + case UNINIT: + if (c == UBX_SYNC1) + ubx_status++; + break; + case GOT_SYNC1: + if (c != UBX_SYNC2) + goto error; + ck_a = 0; + ck_b = 0; + ubx_status++; + break; + case GOT_SYNC2: + if (gps_msg_received) { + // Previous message has not yet been parsed: discard this one + gps_nb_ovrn++; + goto error; + } + ubx_class = c; + ubx_status++; + break; + case GOT_CLASS: + ubx_id = c; + ubx_status++; + break; + case GOT_ID: + ubx_len = c; + ubx_status++; + break; + case GOT_LEN1: + ubx_len |= (c<<8); + if (ubx_len > UBX_MAX_PAYLOAD) + goto error; + ubx_msg_idx = 0; + ubx_status++; + break; + case GOT_LEN2: + ubx_msg_buf[ ubx_msg_idx ] = c; + ubx_msg_idx++; + if (ubx_msg_idx >= ubx_len) { + ubx_status++; + } + break; + case GOT_PAYLOAD: + if (c != ck_a) + goto error; + ubx_status++; + break; + case GOT_CHECKSUM1: + if (c != ck_b) + goto error; + gps_msg_received = TRUE; + goto restart; + break; + } + #else */ + if ( ubx_status == UNINIT ) { + if ( c == UBX_SYNC1 ) + ubx_status++; + } else + if ( ubx_status == GOT_SYNC1 ) { + if ( c != UBX_SYNC2 ) + goto error; + ck_a = 0; + ck_b = 0; + ubx_status++; + } else + if ( ubx_status == GOT_SYNC2 ) { + if ( gps_msg_received ) { + /* Previous message has not yet been parsed: discard this one */ + gps_nb_ovrn++; + goto error; + } + ubx_class = c; + ubx_status++; + } else + if ( ubx_status == GOT_CLASS ) { + ubx_id = c; + ubx_status++; + } else + if ( ubx_status == GOT_ID ) { + ubx_len = c; + ubx_status++; + } else + if ( ubx_status == GOT_LEN1 ) { + ubx_len |= ( c << 8 ); + if ( ubx_len > UBX_MAX_PAYLOAD ) + goto error; + ubx_msg_idx = 0; + ubx_status++; + } else + if ( ubx_status == GOT_LEN2 ) { + ubx_msg_buf[ ubx_msg_idx ] = c; + ubx_msg_idx++; + if ( ubx_msg_idx >= ubx_len ) + ubx_status++; + } else + if ( ubx_status == GOT_PAYLOAD ) { + if ( c != ck_a ) + goto error; + ubx_status++; + } else + if ( ubx_status == GOT_CHECKSUM1 ) { + if ( c != ck_b ) + goto error; + gps_msg_received = TRUE; + goto restart; + } else {} +//#endif + return; +error: +restart: + ubx_status = UNINIT; + return; +} + +#ifdef SIMUL +ReceiveUart0( parse_ubx ) +#else +ReceiveUart1( parse_ubx ) +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.c new file mode 100644 index 0000000..a6e1c09 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.c @@ -0,0 +1,94 @@ +/* + $Id: if_calib.c,v 1.1 2011-01-18 12:48:38 moellmer Exp $ + Flight-time calibration facility + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + + +#include +#include "radio.h" +#include "autopilot.h" +#include "if_calib.h" +#include "infrared.h" +#include "pid.h" +#include "nav.h" + + +#define ParamValInt16(param_init_val, param_travel, cur_pulse, init_pulse) \ +(param_init_val + (int16_t)(((float)(cur_pulse - init_pulse)) * param_travel / (float)MAX_PPRZ)) + +#define ParamValFloat(param_init_val, param_travel, cur_pulse, init_pulse) \ +(param_init_val + ((float)(cur_pulse - init_pulse)) * param_travel / (float)MAX_PPRZ) + + + +uint8_t inflight_calib_mode = IF_CALIB_MODE_NONE; + +static int16_t slider1_init, slider2_init; + +#include "inflight_calib.h" + + +/*** + inline uint8_t inflight_calib(void) { + static int16_t slider1_init, slider2_init; + //static float ir_gain_init; + //static float roll_pgain_init; + static float course_pgain_init; + static int16_t roll_neutral_init; + static float pitch_pgain_init; + static int16_t pitch_neutral_init; + + int8_t mode_changed = inflight_calib_mode_update(); + + if (inflight_calib_mode == IF_CALIB_MODE_NEUTRAL) { + if (mode_changed) { + pitch_neutral_init = ir_pitch_neutral; + roll_neutral_init = ir_roll_neutral; + slider1_init = from_fbw.channels[ RADIO_GAIN1 ]; + slider2_init = from_fbw.channels[ RADIO_GAIN2 ]; + } + ir_pitch_neutral = PARAM_VAL_INT16( pitch_neutral_init, -60., from_fbw.channels[ RADIO_GAIN1 ], slider1_init); + ir_roll_neutral = PARAM_VAL_INT16( roll_neutral_init, 60., from_fbw.channels[ RADIO_GAIN2 ], slider2_init); + } + else if (inflight_calib_mode == IF_CALIB_MODE_GAIN) { + if (mode_changed) { + // ir_gain_init = ir_gain; + course_pgain_init = course_pgain; + // roll_pgain_init = roll_pgain; + pitch_pgain_init = pitch_pgain; + slider1_init = from_fbw.channels[ RADIO_GAIN1 ]; + slider2_init = from_fbw.channels[ RADIO_GAIN2 ]; + } + course_pgain = PARAM_VAL_FLOAT( course_pgain_init, -0.1, from_fbw.channels[ RADIO_GAIN1 ], slider1_init); + // ir_gain = PARAM_VAL_FLOAT( ir_gain_init, 0.0015, from_fbw.channels[ RADIO_GAIN2 ], slider2_init); + // roll_pgain = PARAM_VAL_FLOAT( roll_pgain_init, -5000., from_fbw.channels[ RADIO_GAIN2 ], slider1_init); + pitch_pgain = PARAM_VAL_FLOAT( pitch_pgain_init, -5000., from_fbw.channels[ RADIO_GAIN1 ], slider1_init); + } + return (mode_changed); + } +***/ + + + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.h new file mode 100644 index 0000000..bd46a84 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/if_calib.h @@ -0,0 +1,22 @@ +#ifndef IF_CALIB_H + +#include "link_fbw.h" + +extern uint8_t inflight_calib_mode; +void inflight_calib( bool_t calib_mode_changed ); + + +#define IF_CALIB_MODE_NONE 0 +#define IF_CALIB_MODE_DOWN 1 +#define IF_CALIB_MODE_UP 2 + +#ifdef ANTON_T7 +#define IF_CALIB_MODE_OF_PULSE(pprz) (pprz < TRESHOLD1 ? IF_CALIB_MODE_UP : \ + IF_CALIB_MODE_NONE) +#else +#define IF_CALIB_MODE_OF_PULSE(pprz) (pprz < TRESHOLD1 ? IF_CALIB_MODE_UP : \ + (pprz < TRESHOLD2 ? IF_CALIB_MODE_NONE : \ + IF_CALIB_MODE_DOWN)) +#endif /* ANTON_T7 */ + +#endif // IF_CALIB_H diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.c new file mode 100644 index 0000000..fc77ac5 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.c @@ -0,0 +1,76 @@ +/* + Paparazzi mcu0 $Id: infrared.c,v 1.2 2011-01-18 14:55:52 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "adc.h" +#include "infrared.h" +#include "autopilot.h" +#include "estimator.h" + +int16_t ir_roll; +int16_t ir_pitch; + +int16_t ir_contrast = IR_DEFAULT_CONTRAST; +int16_t ir_roll_neutral = IR_ROLL_NEUTRAL_DEFAULT; +int16_t ir_pitch_neutral = IR_PITCH_NEUTRAL_DEFAULT; + +#define RadOfIrFromConstrast(c) ir_rad_of_ir = IR_RAD_OF_IR_CONTRAST / c; + +//float ir_rad_of_ir = IR_RAD_OF_IR_CONTRAST / IR_DEFAULT_CONTRAST; +float ir_rad_of_ir = 0.00375; + + +static struct adc_buf buf_ir1; +static struct adc_buf buf_ir2; + +void ir_init( void ) +{ + RadOfIrFromConstrast( IR_DEFAULT_CONTRAST ); + adc_buf_channel( ADC_CHANNEL_IR1, &buf_ir1 ); + adc_buf_channel( ADC_CHANNEL_IR2, &buf_ir2 ); +} + +void ir_update( void ) +{ + #ifndef SIMUL + int16_t x1_mean = buf_ir1.sum / AV_NB_SAMPLE; + int16_t x2_mean = buf_ir2.sum / AV_NB_SAMPLE; + ir_roll = IR_RollOfIrs( x1_mean, x2_mean ) - ir_roll_neutral; + ir_pitch = IR_PitchOfIrs( x1_mean, x2_mean ) - ir_pitch_neutral; + #else + extern volatile int16_t simul_ir_roll, simul_ir_pitch; + ir_roll = simul_ir_roll - ir_roll_neutral; + ir_pitch = simul_ir_pitch - ir_pitch_neutral; + #endif +} + +/* + Contrast measurement +*/ + +void ir_gain_calib( void ) // Plane nose down +{ + /* plane nose down -> negativ value */ + ir_contrast = - ir_pitch; + RadOfIrFromConstrast( ir_contrast ); +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.h new file mode 100644 index 0000000..d9eccec --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/infrared.h @@ -0,0 +1,42 @@ +/* + Paparazzi mcu0 $Id: infrared.h,v 1.2 2011-01-18 14:55:52 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef INFRARED_H +#define INFRARED_H + + +extern int16_t ir_roll; /* averaged roll adc */ +extern int16_t ir_pitch; /* averaged pitch adc */ + + +extern float ir_rad_of_ir; +extern int16_t ir_contrast; +extern int16_t ir_roll_neutral; +extern int16_t ir_pitch_neutral; + +void ir_init( void ); +void ir_update( void ); +void ir_gain_calib( void ); + +#endif /* INFRARED_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.c new file mode 100644 index 0000000..d65feb6 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.c @@ -0,0 +1,125 @@ +/* + $Id: link_fbw.c,v 1.3 2011-01-25 09:40:37 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "link_fbw.h" +#include "spi.h" + +struct inter_mcu_msg from_fbw; +struct inter_mcu_msg to_fbw; +volatile uint8_t link_fbw_receive_complete = TRUE; +volatile uint8_t link_fbw_receive_valid = FALSE; +volatile uint8_t link_fbw_nb_err; +uint8_t link_fbw_fbw_nb_err; + +static uint8_t idx_buf; +static uint8_t xor_in, xor_out; + +void link_fbw_init( void ) +{ + link_fbw_nb_err; + link_fbw_receive_complete = FALSE; +} + +void _Pragma( "entrypoint" ) link_fbw_send( void ) +{ + if ( spi_cur_slave != SPI_NONE ) { + spi_nb_ovrn++; + return; + } + + /* Enable SPI, Master, set clock rate fck/16 */ + SPI_START( _BV( SPE ) | _BV( MSTR ) | _BV( SPR0 ) ); // | _BV(SPR1); + SPI_SELECT_SLAVE0(); + + idx_buf = 0; + xor_in = 0; + xor_out = ( ( uint8_t * )&to_fbw )[ idx_buf ]; + SPDR = xor_out; + link_fbw_receive_valid = FALSE; + // Other bytes will follow SIG_SPI interrupts +} + +void link_fbw_on_spi_it( void ) +{ + /* setup OCR1A to pop in 200 clock cycles */ + /* this leaves time for the slave (fbw) */ + /* to process the byte we've sent and to */ + /* prepare a new one to be sent */ + OCR1A = TCNT1 + 200; + /* clear interrupt flag */ + sbi( TIFR, OCF1A ); + /* enable OC1A interrupt */ + sbi( TIMSK, OCIE1A ); +} + + +/* send the next byte */ +SIGNAL( SIG_OUTPUT_COMPARE1A ) +{ + uint8_t tmp; + + /* disable OC1A interrupt */ + cbi( TIMSK, OCIE1A ); + + idx_buf++; + + /* we have sent/received a complete frame */ + if ( idx_buf == FRAME_LENGTH ) { + /* read checksum from receive register */ + tmp = SPDR; + /* notify valid frame */ + if ( tmp == xor_in ) { + link_fbw_receive_valid = TRUE; + link_fbw_fbw_nb_err = from_fbw.nb_err; + } else + link_fbw_nb_err++; + link_fbw_receive_complete = TRUE; + /* unselect slave0 */ + SPI_UNSELECT_SLAVE0(); + SPI_STOP(); + return; + } + + /* we are sending/receiving payload */ + if ( idx_buf < FRAME_LENGTH - 1 ) { + /* place new payload byte in send register */ + tmp = ( ( uint8_t * )&to_fbw )[ idx_buf ]; + SPI_SEND( tmp ); + xor_out ^= tmp; + } + /* we are done sending the payload */ + else { // idx_buf == FRAME_LENGTH - 1 + /* place checksum in send register */ + SPI_SEND( xor_out ); + } + + /* read the byte from receive register */ + tmp = SPDR; + ( ( uint8_t * )&from_fbw )[ idx_buf - 1 ] = tmp; + xor_in ^= tmp; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.h new file mode 100644 index 0000000..cf4b64e --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/link_fbw.h @@ -0,0 +1,44 @@ +/* + $Id: link_fbw.h,v 1.1 2011-01-18 12:48:38 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef LINK_FBW_H +#define LINK_FBW_H + +#include + +#include "link_autopilot.h" + +void link_fbw_init( void ); +void link_fbw_send( void ); +void link_fbw_on_spi_it( void ); + +extern volatile uint8_t link_fbw_nb_err; +extern uint8_t link_fbw_fbw_nb_err; + +extern struct inter_mcu_msg from_fbw; +extern struct inter_mcu_msg to_fbw; +extern volatile uint8_t link_fbw_receive_complete; +extern volatile uint8_t link_fbw_receive_valid; + +#endif /* LINK_FBW_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/main.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/main.c new file mode 100644 index 0000000..7916b29 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/main.c @@ -0,0 +1,677 @@ +/* + $Id: main.c,v 1.2 2011-01-18 14:55:52 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +/** \file main.c + \brief Regroup main functions + +*/ +#include +#include + +#include "link_autopilot.h" + +#include "timer.h" +#include "adc.h" +#include "pid.h" +#include "gps.h" +#include "infrared.h" +#include "downlink.h" +#include "nav.h" +#include "autopilot.h" +#include "estimator.h" +#include "if_calib.h" + +// +// +// FIXME estimator_flight_time should not be manipuled here anymore +// +/** Define minimal speed for takeoff in m/s */ +#define MIN_SPEED_FOR_TAKEOFF 5. + + +uint8_t fatal_error_nb = 0; +static const uint16_t version = 1; + +/** in seconds */ +static uint16_t cputime = 0; + +uint8_t pprz_mode = PPRZ_MODE_MANUAL; +uint8_t vertical_mode = VERTICAL_MODE_MANUAL; +uint8_t lateral_mode = LATERAL_MODE_MANUAL; +uint8_t ir_estim_mode = IR_ESTIM_MODE_ON; +bool_t auto_pitch = FALSE; + +bool_t rc_event_1, rc_event_2; + +uint8_t vsupply; + +static uint8_t mcu1_status, mcu1_ppm_cpt; + +static bool_t low_battery = FALSE; + +float slider_1_val, slider_2_val; + +bool_t launch = FALSE; +static uint8_t boot = TRUE; +static uint8_t count; +//#define Min(x, y) (x < y ? x : y) +//#define Max(x, y) (x > y ? x : y) + + +#define NO_CALIB 0 /**< \enum No calibration state */ +#define WAITING_CALIB_CONTRAST 1 /**< \enum Waiting calibration contrast state */ +#define CALIB_DONE 2 /**< \enum Calibration done state */ + +/** Maximal delay for calibration */ +#define MAX_DELAY_FOR_CALIBRATION 10 + +/** \fn inline void ground_calibrate( void ) + \brief Calibrate contrast if paparazzi mode is + set to auto1 before MAX_DELAY_FOR_CALIBRATION secondes */ +/**User must put verticaly the uav (nose bottom) and push + radio roll stick to get new calibration + If not, the default calibration is used. +*/ +inline void ground_calibrate( void ) +{ + static uint8_t calib_status = NO_CALIB; + /*#ifdef WITH_SWITCH + switch (calib_status) { + case NO_CALIB: + if (cputime < MAX_DELAY_FOR_CALIBRATION && pprz_mode == PPRZ_MODE_AUTO1 ) { + calib_status = WAITING_CALIB_CONTRAST; + DOWNLINK_SEND_CALIB_START(); + } + break; + case WAITING_CALIB_CONTRAST: + if (STICK_PUSHED(from_fbw.channels[ RADIO_ROLL ])) { + ir_gain_calib(); + estimator_rad_of_ir = ir_rad_of_ir; + DOWNLINK_SEND_RAD_OF_IR(&estimator_ir, &estimator_rad, &estimator_rad_of_ir, &ir_roll_neutral, &ir_pitch_neutral); + calib_status = CALIB_DONE; + DOWNLINK_SEND_CALIB_CONTRAST(&ir_contrast); + } + break; + case CALIB_DONE: + break; + } + #else*/ + if ( calib_status == NO_CALIB ) { + if ( cputime < MAX_DELAY_FOR_CALIBRATION && pprz_mode == PPRZ_MODE_AUTO1 ) { + calib_status = WAITING_CALIB_CONTRAST; + DOWNLINK_SEND_CALIB_START(); + } + } else + if ( calib_status == WAITING_CALIB_CONTRAST ) { + if ( STICK_PUSHED( from_fbw.channels[ RADIO_ROLL ] ) ) { + ir_gain_calib(); + estimator_rad_of_ir = ir_rad_of_ir; + DOWNLINK_SEND_RAD_OF_IR( &estimator_ir, &estimator_rad, &estimator_rad_of_ir, + &ir_roll_neutral, &ir_pitch_neutral ); + calib_status = CALIB_DONE; + DOWNLINK_SEND_CALIB_CONTRAST( &ir_contrast ); + } + } else {} + +//#endif +} + + +/** \fn inline uint8_t pprz_mode_update( void ) + \brief Update paparazzi mode +*/ +inline uint8_t pprz_mode_update( void ) +{ + /** We remain in home mode until explicit reset from the RC */ + if ( pprz_mode != PPRZ_MODE_HOME || CheckEvent( rc_event_1 ) ) + ModeUpdate( pprz_mode, PPRZ_MODE_OF_PULSE( from_fbw.channels[ RADIO_MODE ], + from_fbw.status ) ); + + else + return FALSE; +} + +#ifdef RADIO_LLS +/** \fn inline uint8_t ir_estim_mode_update( void ) + \brief update ir estimation if RADIO_LLS is true \n +*/ +inline uint8_t ir_estim_mode_update( void ) +{ + ModeUpdate( ir_estim_mode, + IR_ESTIM_MODE_OF_PULSE( from_fbw.channels[ RADIO_LLS ] ) ); +} +#endif + + +/** \fn inline uint8_t mcu1_status_update( void ) + \brief @@@@@ A FIXER @@@@@ +*/ +inline uint8_t mcu1_status_update( void ) +{ + uint8_t new_mode = from_fbw.status; + if ( mcu1_status != new_mode ) { + bool_t changed = ( ( mcu1_status & MASK_FBW_CHANGED ) != + ( new_mode & MASK_FBW_CHANGED ) ); + mcu1_status = new_mode; + return changed; + } + return FALSE; +} + +/** Delay between @@@@@ A FIXER @@@@@ */ +#define EVENT_DELAY 20 + +/** \def EventUpdate(_cpt, _cond, _event) + @@@@@ A FIXER @@@@@ +*/ +#define EventUpdate(_cpt, _cond, _event) \ + if (_cond) { \ + if (_cpt < EVENT_DELAY) { \ + _cpt++; \ + if (_cpt == EVENT_DELAY) \ + _event = TRUE; \ + } \ + } else { \ + _cpt = 0; \ + _event = FALSE; \ + } +/** \def EventPos(_cpt, _channel, _event) + @@@@@ A FIXER @@@@@ +*/ +#define EventPos(_cpt, _channel, _event) \ + EventUpdate(_cpt, (inflight_calib_mode==IF_CALIB_MODE_NONE && from_fbw.channels[ _channel ]>(int)(0.75*MAX_PPRZ)), _event) + +/** \def EventNeg(_cpt, _channel, _event) + @@@@@ A FIXER @@@@@ +*/ +#define EventNeg(_cpt, _channel, _event) \ + EventUpdate(_cpt, (inflight_calib_mode==IF_CALIB_MODE_NONE && from_fbw.channels[ _channel ]<(int)(-0.75*MAX_PPRZ)), _event) + +/** \fn static inline void events_update( void ) + @@@@@ A FIXER @@@@@ +*/ +static inline void events_update( void ) +{ + static uint16_t event1_cpt = 0; + static uint16_t event2_cpt = 0; + EventPos( event1_cpt, RADIO_GAIN1, rc_event_1 ); + EventNeg( event2_cpt, RADIO_GAIN1, rc_event_2 ); +} + + +/** \fn inline void copy_from_to_fbw ( void ) + \brief Send back uncontrolled channels (only rudder) +*/ +inline void copy_from_to_fbw ( void ) +{ + to_fbw.channels[ RADIO_YAW ] = from_fbw.channels[ RADIO_YAW ]; + #ifdef ANTON_T7 + to_fbw.channels[ RADIO_PITCH ] = from_fbw.channels[ RADIO_PITCH ]; + #endif + to_fbw.status = 0; +} + +#ifdef EST_TEST +float est_pos_x; +float est_pos_y; +float est_fcourse; +uint8_t ticks_last_est; // 20Hz +#endif /* EST_TEST */ + + + +/* + called at 20Hz. + sends a serie of initialisation messages followed by a stream of periodic ones +*/ + +/** Define number of message at initialisation */ +#define INIT_MSG_NB 2 +/** @@@@@ A FIXER @@@@ */ +#define HI_FREQ_PHASE_NB 5 + +//static char signature[ 16 ] = MESSAGES_MD5SUM; + +/** \def PERIODIC_SEND_BAT() + @@@@@ A FIXER @@@@@ +*/ +#define PERIODIC_SEND_BAT() DOWNLINK_SEND_BAT(&vsupply, &estimator_flight_time, &low_battery, &block_time, &stage_time) +/** \def EventPos(_cpt, _channel, _event) + @@@@@ A FIXER @@@@@ +*/ +#define PERIODIC_SEND_DEBUG() DOWNLINK_SEND_DEBUG(&link_fbw_nb_err, &link_fbw_fbw_nb_err, &modem_nb_ovrn, &gps_nb_ovrn, &mcu1_ppm_cpt); +/** \def EventPos(_cpt, _channel, _event) + @@@@@ A FIXER @@@@@ +*/ +#define PERIODIC_SEND_ATTITUDE() DOWNLINK_SEND_ATTITUDE(&estimator_phi, &estimator_psi, &estimator_theta); +/** \def EventPos(_cpt, _channel, _event) + @@@@@ A FIXER @@@@@ +*/ +#define PERIODIC_SEND_ADC() DOWNLINK_SEND_ADC(&ir_roll, &ir_pitch); +/** \def EventPos(_cpt, _channel, _event) + @@@@@ A FIXER @@@@@ +*/ +#define PERIODIC_SEND_STABILISATION() DOWNLINK_SEND_STABILISATION(&roll_pgain, &pitch_pgain); +#define PERIODIC_SEND_CLIMB_PID() DOWNLINK_SEND_CLIMB_PID(&desired_gaz, &desired_climb, &climb_sum_err, &climb_pgain); +#define PERIODIC_SEND_PPRZ_MODE() DOWNLINK_SEND_PPRZ_MODE(&pprz_mode, &vertical_mode, &inflight_calib_mode, &mcu1_status, &ir_estim_mode); +#define PERIODIC_SEND_DESIRED() DOWNLINK_SEND_DESIRED(&desired_roll, &desired_pitch, &desired_x, &desired_y, &desired_altitude); +#define PERIODIC_SEND_PITCH() DOWNLINK_SEND_PITCH(&ir_pitch, &ir_pitch_neutral, &ir_gain); + +#define PERIODIC_SEND_NAVIGATION_REF() DOWNLINK_SEND_NAVIGATION_REF(&utm_east0, &utm_north0); + +#ifdef RADIO_CALIB +#define PERIODIC_SEND_SETTINGS() if (inflight_calib_mode != IF_CALIB_MODE_NONE) DOWNLINK_SEND_SETTINGS(&inflight_calib_mode, &slider_1_val, &slider_2_val); +#else +#define PERIODIC_SEND_SETTINGS() +#endif + + +/** \fn inline void reporting_task( void ) + \brief Send a serie of initialisation messages followed by a stream of periodic ones\n + Called at 20Hz. +*/ + +void send_boot( void ) +{ + /** initialisation phase during boot */ + if ( boot ) { + DOWNLINK_SEND_BOOT( &version ); + DOWNLINK_SEND_RAD_OF_IR( &estimator_ir, &estimator_rad, &estimator_rad_of_ir, + &ir_roll_neutral, &ir_pitch_neutral ); + boot = FALSE; + } +} +void send_attitude( void ) //500ms +{ + if ( !boot ) { + count++; + if ( count == 250 ) count = 0; + if ( count % 5 == 0 ) + PERIODIC_SEND_ATTITUDE(); + } +} + +void send_adc( void ) //500ms +{ + if ( !boot ) { + if ( count % 5 == 1 ) PERIODIC_SEND_ADC(); + } +} +void send_settings( void ) //500ms +{ + if ( !boot ) { + if ( count % 5 == 2 ) PERIODIC_SEND_SETTINGS(); + } +} +void send_desired( void ) //1000ms +{ + if ( !boot ) { + if ( count % 10 == 3 ) PERIODIC_SEND_DESIRED(); + } +} +void send_bat( void ) //2000ms +{ + if ( !boot ) { + if ( count % 20 == 8 ) PERIODIC_SEND_BAT(); + } +} +void send_climb( void ) //2000ms +{ + if ( !boot ) { + if ( count % 20 == 18 ) PERIODIC_SEND_CLIMB_PID(); + } +} +void send_mode( void ) //5000ms +{ + if ( !boot ) { + if ( count % 50 == 9 ) PERIODIC_SEND_PPRZ_MODE(); + } +} +void send_debug( void ) //5000ms +{ + if ( !boot ) { + if ( count % 50 == 29 ) PERIODIC_SEND_DEBUG(); + } +} +void send_nav_ref( void ) //10000ms +{ + if ( !boot ) { + if ( count % 100 == 49 ) PERIODIC_SEND_NAVIGATION_REF(); + } +} + +/** \fn inline uint8_t inflight_calib_mode_update ( void ) + \brief @@@@@ A FIXER @@@@@ +*/ +inline uint8_t inflight_calib_mode_update ( void ) +{ + ModeUpdate( inflight_calib_mode, + IF_CALIB_MODE_OF_PULSE( from_fbw.channels[ RADIO_CALIB ] ) ); +} + + +/** \fn inline void radio_control_task( void ) + \brief @@@@@ A FIXER @@@@@ +*/ +void _Pragma( "entrypoint" ) radio_control_task( void ) +{ + bool_t calib_mode_changed; + if ( link_fbw_receive_valid ) { + uint8_t mode_changed = FALSE; + copy_from_to_fbw(); + if ( ( bit_is_set( from_fbw.status, RADIO_REALLY_LOST ) && + ( pprz_mode == PPRZ_MODE_AUTO1 || pprz_mode == PPRZ_MODE_MANUAL ) ) || + too_far_from_home ) { + pprz_mode = PPRZ_MODE_HOME; + mode_changed = TRUE; + } + if ( bit_is_set( from_fbw.status, AVERAGED_CHANNELS_SENT ) ) { + bool_t pprz_mode_changed = pprz_mode_update(); + mode_changed |= pprz_mode_changed; + #ifdef RADIO_LLS + mode_changed |= ir_estim_mode_update(); + #endif + #ifdef RADIO_CALIB + calib_mode_changed = inflight_calib_mode_update(); + inflight_calib( calib_mode_changed || pprz_mode_changed ); + mode_changed |= calib_mode_changed; + #endif + } + mode_changed |= mcu1_status_update(); + if ( mode_changed ) + DOWNLINK_SEND_PPRZ_MODE( &pprz_mode, &vertical_mode, &inflight_calib_mode, + &mcu1_status, &ir_estim_mode ); + + if ( pprz_mode == PPRZ_MODE_AUTO1 ) { + desired_roll = FLOAT_OF_PPRZ( from_fbw.channels[ RADIO_ROLL ], 0., -0.6 ); + desired_pitch = FLOAT_OF_PPRZ( from_fbw.channels[ RADIO_PITCH ], 0., 0.5 ); + } // else asynchronously set by course_pid_run() + if ( pprz_mode == PPRZ_MODE_MANUAL || pprz_mode == PPRZ_MODE_AUTO1 ) { + desired_gaz = from_fbw.channels[ RADIO_THROTTLE ]; + #ifdef ANTON_MAGICAL_MISTERY_GAINS + roll_pgain = ROLL_PGAIN * ( 1 - 5. / 7. * from_fbw.channels[ RADIO_THROTTLE ] / + MAX_PPRZ ); + pitch_pgain = PITCH_PGAIN * ( 1 - 1. / 3. * from_fbw.channels[ RADIO_THROTTLE ] / + MAX_PPRZ ); + #endif /* ANTON_MAGICAL_MISTERY_GAINS */ + } + // else asynchronously set by climb_pid_run(); + + mcu1_ppm_cpt = from_fbw.ppm_cpt; + vsupply = from_fbw.vsupply; + + events_update(); + + if ( !estimator_flight_time ) { + ground_calibrate(); + if ( pprz_mode == PPRZ_MODE_AUTO2 && + from_fbw.channels[ RADIO_THROTTLE ] > GAZ_THRESHOLD_TAKEOFF ) + launch = TRUE; + } + } + +} + +/** \fn void navigation_task( void ) + \brief Compute desired_course +*/ +void navigation_update( void ) +{ + + /* Default to keep compatibility with previous behaviour */ + lateral_mode = LATERAL_MODE_COURSE; + if ( pprz_mode == PPRZ_MODE_HOME ) + nav_home(); + else + nav_update(); +} + +void send_nav_values( void ) +{ + + DOWNLINK_SEND_NAVIGATION( &nav_block, &nav_stage, &estimator_x, &estimator_y, + &desired_course, &dist2_to_wp, &course_pgain, &dist2_to_home ); +} + +void course_run( void ) +{ + + if ( pprz_mode == PPRZ_MODE_AUTO2 || pprz_mode == PPRZ_MODE_HOME ) { + if ( lateral_mode >= LATERAL_MODE_COURSE ) + course_pid_run(); /* aka compute nav_desired_roll */ + desired_roll = nav_desired_roll; + } +} + +void _Pragma( "entrypoint" ) altitude_control_task( void ) +{ + if ( pprz_mode == PPRZ_MODE_AUTO2 || pprz_mode == PPRZ_MODE_HOME ) { + if ( vertical_mode == VERTICAL_MODE_AUTO_ALT ) + altitude_pid_run(); + } +} +void _Pragma( "entrypoint" ) climb_control_task( void ) +{ + if ( pprz_mode == PPRZ_MODE_AUTO2 || pprz_mode == PPRZ_MODE_HOME ) { + if ( vertical_mode >= VERTICAL_MODE_AUTO_CLIMB ) + climb_pid_run(); + if ( vertical_mode == VERTICAL_MODE_AUTO_GAZ ) + desired_gaz = nav_desired_gaz; + if ( low_battery || ( !estimator_flight_time && !launch ) ) + desired_gaz = 0.; + } +} +#define PERIOD (256. * 1024. / CLOCK / 1000000.) + +/** Maximum time allowed for low battery level */ +#define LOW_BATTERY_DELAY 5 + +/** \fn inline void periodic_task( void ) + \brief Do periodic tasks at 61 Hz +*/ +/**There are four @@@@@ boucles @@@@@: + - 20 Hz: + - lets use \a reporting_task at 10 Hz + - updates ir with \a ir_update + - updates estimator of ir with \a estimator_update_state_infrared + - set \a desired_aileron and \a desired_elevator with \a roll_pitch_pid_run + - sends to \a fbw \a desired_gaz, \a desired_aileron and + \a desired_elevator \note \a desired_gaz is set upon GPS + message reception + - 10 Hz: to get a \a stage_time_ds + - 4 Hz: + - calls \a estimator_propagate_state + - do navigation with \a navigation_task + +*/ + +#ifdef PAPABENCH_SINGLE +uint8_t _20Hz = 0; +uint8_t _1Hz = 0; +#else +static uint8_t _20Hz = 0; +static uint8_t _1Hz = 0; +#endif +void periodic_task( void ) +{ + static uint8_t _10Hz = 0; + static uint8_t _4Hz = 0; + static uint8_t t = 0; + + estimator_t += PERIOD; + + _20Hz++; + if ( _20Hz >= 3 ) _20Hz = 0; + _10Hz++; + if ( _10Hz >= 6 ) _10Hz = 0; + _4Hz++; + if ( _4Hz >= 15 ) _4Hz = 0; + _1Hz++; + if ( _1Hz >= 61 ) _1Hz = 0; + + if ( !_10Hz ) + stage_time_ds = stage_time_ds + .1; + if ( !_1Hz ) { + if ( estimator_flight_time ) estimator_flight_time++; + cputime++; + stage_time_ds = ( int16_t )( stage_time_ds + .5 ); + stage_time++; + block_time++; + + if ( vsupply < LOW_BATTERY ) t++; + else t = 0; + low_battery |= ( t >= LOW_BATTERY_DELAY ); + } + /*#ifdef WITH_SWITCH + switch(_4Hz) { + case 0: + estimator_propagate_state(); + navigation_task(); + altitude_control_task();//added 4-05-06 + climb_control_task();//added 04-05-06 + break; + // default: + } + switch (_20Hz) { + case 0: + break; + case 1: { + static uint8_t odd; + odd++; + if (odd & 0x01) + reporting_task(); + break; + } + case 2: + stabilisation_task(); + link_fbw_send(); + break; + default: + fatal_error_nb++; + } + #else */ + if ( _4Hz == 0 ) { + estimator_propagate_state(); + /*navigation_task */ + navigation_update(); + send_nav_values(); + course_run(); + /*end navigation*/ + altitude_control_task(); + climb_control_task(); + } + + if ( _20Hz == 0 ) + {} + else + if ( _20Hz == 1 ) { + static uint8_t odd; + odd++; + if ( odd & 0x01 ) { + /*reporting_task()*/ + send_boot(); + send_attitude(); + send_adc(); + send_settings(); + send_desired(); + send_bat(); + send_climb(); + send_mode(); + send_debug(); + send_nav_ref(); + } + } else + if ( _20Hz == 2 ) { + stabilisation_task(); + link_fbw_send(); + } else + fatal_error_nb++; +//#endif +} + +void _Pragma( "entrypoint" ) stabilisation_task( void ) +{ + ir_update(); + estimator_update_state_infrared(); + roll_pitch_pid_run(); // Set desired_aileron & desired_elevator + to_fbw.channels[ RADIO_THROTTLE ] = + desired_gaz; // desired_gaz is set upon GPS message reception + to_fbw.channels[ RADIO_ROLL ] = desired_aileron; + #ifndef ANTON_T7 + to_fbw.channels[ RADIO_PITCH ] = desired_elevator; + #endif + + // Code for camera stabilization, FIXME put that elsewhere + to_fbw.channels[ RADIO_GAIN1 ] = TRIM_PPRZ( MAX_PPRZ / 0.75 * + ( -estimator_phi ) ); +} + +/*void receive_gps_data_task(void) + { + parse_gps_msg(); + gps_msg_received = FALSE; + if (gps_pos_available) + { + use_gps_pos(); + gps_pos_available = FALSE; + } + }*/ +/** \fn void use_gps_pos( void ) + \brief use GPS +*/ +/**Send by downlink the GPS and rad_of_ir messages with \a DOWNLINK_SEND_GPS + and \a DOWNLINK_SEND_RAD_OF_IR \n + If \a estimator_flight_time is null and \a estimator_hspeed_mod is greater + than \a MIN_SPEED_FOR_TAKEOFF, set the \a estimator_flight_time to 1 and \a + launch to true (which is not set in non auto launch. Then call + \a DOWNLINK_SEND_TAKEOFF +*/ +void send_gps_pos( void ) +{ + gps_msg_received = FALSE; + if ( gps_pos_available ) { + DOWNLINK_SEND_GPS( &gps_mode, &gps_utm_east, &gps_utm_north, &gps_fcourse, + &gps_falt, &gps_fspeed, &gps_fclimb, &gps_ftow ); + estimator_update_state_gps(); + } +} + +void send_radIR( void ) +{ + if ( gps_pos_available ) + DOWNLINK_SEND_RAD_OF_IR( &estimator_ir, &estimator_rad, &estimator_rad_of_ir, + &ir_roll_neutral, &ir_pitch_neutral ); +} + +void send_takeOff( void ) +{ + if ( gps_pos_available ) { + if ( !estimator_flight_time && + ( estimator_hspeed_mod > MIN_SPEED_FOR_TAKEOFF ) ) { + estimator_flight_time = 1; + launch = TRUE; /* Not set in non auto launch */ + DOWNLINK_SEND_TAKEOFF( &cputime ); + } + gps_pos_available = FALSE; + } +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/mainloop.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/mainloop.c new file mode 100644 index 0000000..f50132b --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/mainloop.c @@ -0,0 +1,101 @@ +/* + $Id: mainloop.c,v 1.3 2011-01-25 09:40:37 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include +#include "std.h" + +#include "timer.h" +#include "modem.h" +#include "adc.h" +#include "airframe.h" +#include "autopilot.h" +#include "spi.h" +#include "link_fbw.h" +#include "gps.h" +#include "nav.h" +#include "infrared.h" +#include "estimator.h" +#include "downlink.h" + +#ifndef PAPABENCH_SINGLE +void fbw_init( void ); +void fbw_schedule( void ); +#endif + +int main( void ) +{ + uint8_t init_cpt; + /* init peripherals */ + timer_init(); + modem_init(); + adc_init(); + #ifdef CTL_BRD_V1_1 + adc_buf_channel( ADC_CHANNEL_BAT, &buf_bat ); + #endif + spi_init(); + link_fbw_init(); + gps_init(); + nav_init(); + ir_init(); + estimator_init(); + # ifdef PAPABENCH_SINGLE + fbw_init(); + # endif + + /* start interrupt task */ + //sei(); /*Fadia*/ + + /* Wait 0.5s (for modem init ?) */ + init_cpt = 30; + _Pragma( "loopbound min 31 max 31" ) + while ( init_cpt ) { + if ( timer_periodic() ) + init_cpt--; + } + + /* enter mainloop */ + #ifndef NO_MAINLOOP + while ( 1 ) { + #endif + if ( timer_periodic() ) { + periodic_task(); + # if PAPABENCH_SINGLE + fbw_schedule(); + # endif + } + if ( gps_msg_received ) { + /*receive_gps_data_task()*/ + parse_gps_msg(); + send_gps_pos(); + send_radIR(); + send_takeOff(); + } + if ( link_fbw_receive_complete ) { + link_fbw_receive_complete = FALSE; + radio_control_task(); + } + #ifndef NO_MAINLOOP + } + #endif + return 0; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.c new file mode 100644 index 0000000..736fb10 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.c @@ -0,0 +1,95 @@ +/* + Paparazzi mcu0 cmx469 modem functions + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 +#include "modem.h" +#include "std.h" + +uint8_t modem_nb_ovrn; + +uint8_t tx_head; +volatile uint8_t tx_tail; +uint8_t tx_buf[ TX_BUF_SIZE ]; + +uint8_t tx_byte; +uint8_t tx_byte_idx; + +uint8_t ck_a, ck_b; + +void modem_init( void ) +{ + /* + on >= V1.2 boards, 4MHz modem clock is generated + by one PWM module. + */ + #if defined CTL_BRD_V1_2 || defined CTL_BRD_V1_2_1 + MODEM_OSC_DDR |= _BV( MODEM_OSC ); + OCR0 = 1; /* 4MhZ */ + TCCR0 = _BV( WGM01 ) | _BV( COM00 ) | _BV( CS00 ); + #endif + + /* setup TX_EN and TX_DATA pin as output */ + MODEM_TX_DDR |= _BV( MODEM_TX_EN ) | _BV( MODEM_TX_DATA ); + /* data idles hight */ + sbi( MODEM_TX_PORT, MODEM_TX_DATA ); + /* enable transmitter */ + cbi( MODEM_TX_PORT, MODEM_TX_EN ); + /* set interrupt on failing edge of clock */ + MODEM_CLK_INT_REG |= MODEM_CLK_INT_CFG; +} + +SIGNAL( MODEM_CLK_INT_SIG ) +{ + /* start bit */ + if ( tx_byte_idx == 0 ) + cbi( MODEM_TX_PORT, MODEM_TX_DATA ); + /* 8 data bits */ + else + if ( tx_byte_idx < 9 ) { + if ( tx_byte & 0x01 ) + sbi( MODEM_TX_PORT, MODEM_TX_DATA ); + else + cbi( MODEM_TX_PORT, MODEM_TX_DATA ); + tx_byte >>= 1; + } + /* stop_bit */ + else + sbi( MODEM_TX_PORT, MODEM_TX_DATA ); + tx_byte_idx++; + /* next byte */ + if ( tx_byte_idx >= 10 ) { + /* if we have nothing left to transmit */ + if ( tx_head == tx_tail ) { + /* disable clock interrupt */ + cbi( EIMSK, MODEM_CLK_INT ); + } else { + /* else load next byte */ + MODEM_LOAD_NEXT_BYTE(); + } + } +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.h new file mode 100644 index 0000000..f6a5d8d --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/modem.h @@ -0,0 +1,140 @@ +/* + Paparazzi mcu0 cmx469 modem functions + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef MODEM_H +#define MODEM_H + +#include "airframe.h" + +void modem_init( void ); + +extern uint8_t modem_nb_ovrn; + +#define TX_BUF_SIZE 255 +extern uint8_t tx_head; +extern volatile uint8_t tx_tail; +extern uint8_t tx_buf[ TX_BUF_SIZE ]; + +extern uint8_t tx_byte; +extern uint8_t tx_byte_idx; + +extern uint8_t ck_a, ck_b; + +#define ModemStartMessage(id) \ + { MODEM_PUT_1_BYTE(STX); MODEM_PUT_1_BYTE(id); ck_a = id; ck_b = id; } + +#define ModemEndMessage() \ + { MODEM_PUT_1_BYTE(ck_a); MODEM_PUT_1_BYTE(ck_b); MODEM_CHECK_RUNNING(); } + + +#define MODEM_TX_PORT PORTD +#define MODEM_TX_DDR DDRD +#define MODEM_TX_EN 7 +#define MODEM_TX_DATA 6 + +#ifdef CTL_BRD_V1_1 +#define MODEM_CLK_DDR DDRD +#define MODEM_CLK_PORT PORTD +#define MODEM_CLK 0 +#define MODEM_CLK_INT INT0 +#define MODEM_CLK_INT_REG EICRA +#define MODEM_CLK_INT_CFG _BV(ISC01) +#define MODEM_CLK_INT_SIG SIG_INTERRUPT0 +#endif /* CTL_BRD_V1_1 */ + +#ifdef CTL_BRD_V1_2 +#define MODEM_CLK_DDR DDRD +#define MODEM_CLK_PORT PORTD +#define MODEM_CLK 0 +#define MODEM_CLK_INT INT0 +#define MODEM_CLK_INT_REG EICRA +#define MODEM_CLK_INT_CFG _BV(ISC01) +#define MODEM_CLK_INT_SIG SIG_INTERRUPT0 + +#define MODEM_OSC_DDR DDRB +#define MODEM_OSC_PORT PORTB +#define MODEM_OSC 4 +#endif /* CTL_BRD_V1_2 */ + +#ifdef CTL_BRD_V1_2_1 +#define MODEM_CLK_DDR DDRE +#define MODEM_CLK_PORT PORTE +#define MODEM_CLK 4 +#define MODEM_CLK_INT INT4 +#define MODEM_CLK_INT_REG EICRB +#define MODEM_CLK_INT_CFG _BV(ISC41) +#define MODEM_CLK_INT_SIG SIG_INTERRUPT4 +#define MODEM_OSC_DDR DDRB +#define MODEM_OSC_PORT PORTB +#define MODEM_OSC 4 +#endif /* CTL_BRD_V1_2_1 */ + + + +#define MODEM_CHECK_FREE_SPACE(_space) (tx_head>=tx_tail? _space < (TX_BUF_SIZE - (tx_head - tx_tail)) : _space < (tx_tail - tx_head)) + +#define MODEM_PUT_1_BYTE(_byte) { \ + tx_buf[tx_head] = _byte; \ + tx_head++; \ + if (tx_head >= TX_BUF_SIZE) tx_head = 0; \ +} + +#define MODEM_PUT_1_BYTE_BY_ADDR(_byte) { \ + tx_buf[tx_head] = *(_byte); \ + ck_a += *(_byte); \ + ck_b += ck_a; \ + tx_head++; \ + if (tx_head >= TX_BUF_SIZE) tx_head = 0; \ +} + +#define MODEM_PUT_2_BYTE_BY_ADDR(_byte) { \ + MODEM_PUT_1_BYTE_BY_ADDR(_byte); \ + MODEM_PUT_1_BYTE_BY_ADDR(_byte+1); \ +} + +#define MODEM_PUT_4_BYTE_BY_ADDR(_byte) { \ + MODEM_PUT_1_BYTE_BY_ADDR(_byte); \ + MODEM_PUT_1_BYTE_BY_ADDR(_byte+1); \ + MODEM_PUT_1_BYTE_BY_ADDR(_byte+2); \ + MODEM_PUT_1_BYTE_BY_ADDR(_byte+3); \ +} + +#define MODEM_LOAD_NEXT_BYTE() { \ + tx_byte = tx_buf[tx_tail]; \ + tx_byte_idx = 0; \ + tx_tail++; \ + if( tx_tail >= TX_BUF_SIZE ) \ + tx_tail = 0; \ +} + +#define MODEM_CHECK_RUNNING() { \ + if (!(EIMSK & _BV(MODEM_CLK_INT))) { \ + MODEM_LOAD_NEXT_BYTE() \ + sbi(EIFR, INTF0); \ + sbi(EIMSK, MODEM_CLK_INT); \ + } \ +} + + +#endif /* MODEM_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.c new file mode 100644 index 0000000..9790016 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.c @@ -0,0 +1,216 @@ +/* + $Id: nav.c,v 1.3 2011-01-21 11:52:44 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#define NAV_C + +#include "math.h" + +#include "nav.h" +#include "estimator.h" +#include "pid.h" +#include "autopilot.h" +#include "link_fbw.h" +#include "airframe.h" + +uint8_t nav_stage, nav_block; +uint8_t excpt_stage; /*To save the current stage when an exception is raised */ +static float last_x, last_y; +static uint8_t last_wp; +float rc_pitch; +uint16_t stage_time, block_time; +float stage_time_ds; + +#define RcRoll(travel) (from_fbw.channels[ RADIO_ROLL ]* (float)travel /(float)MAX_PPRZ) + +#define RcEvent1() CheckEvent(rc_event_1) +#define RcEvent2() CheckEvent(rc_event_2) +#define Block(x) case x: nav_block=x; +#define InitBlock() { nav_stage = 0; block_time = 0; InitStage(); } +#define NextBlock() { nav_block++; InitBlock(); } +#define GotoBlock(b) { nav_block=b; InitBlock(); } + +#define Stage(s) case s: nav_stage=s; +#define InitStage() { last_x = estimator_x; last_y = estimator_y; stage_time = 0; stage_time_ds = 0.0; return; } +#define NextStage() { nav_stage++; InitStage() } +#define NextStageFrom(wp) { last_wp = wp; NextStage() } +#define GotoStage(s) { nav_stage = s; InitStage() } + +#define Label(x) label_ ## x: +#define Goto(x) { goto label_ ## x; } + +#define Exception(x) { excpt_stage = nav_stage; goto label_ ## x; } +#define ReturnFromException(_) { GotoStage(excpt_stage) } + +static bool_t approaching( uint8_t ); +static inline void fly_to_xy( float x, float y ); +static void fly_to( uint8_t wp ); +static void route_to( uint8_t last_wp, uint8_t wp ); +//static void glide_to(uint8_t last_wp, uint8_t wp); + +#define MIN_DX ((int16_t)(MAX_PPRZ * 0.05)) + +#define DegOfRad(x) ((x) / M_PI * 180.) +#define RadOfDeg(x) ((x)/180. * M_PI) +#define NormCourse(x) { _Pragma("loopbound min 0 max 0") while (x < 0) x += 360; _Pragma("loopbound min 0 max 0") while (x >= 360) x -= 360;} + +static float qdr; /* Degrees from 0 to 360 */ + +#define CircleXY(x,y,radius) { float alpha = atan2(estimator_y - y, estimator_x - x);float alpha_carrot = alpha + CARROT / (-radius * estimator_hspeed_mod); fly_to_xy(x+cos(alpha_carrot)*fabs(radius),y+sin(alpha_carrot)*fabs(radius)); qdr = DegOfRad(M_PI/2 - alpha_carrot); NormCourse(qdr);} + +#define MAX_DIST_CARROT 250. +#define MIN_HEIGHT_CARROT 50. +#define MAX_HEIGHT_CARROT 150. + +#define Goto3D(radius) { static float carrot_x, carrot_y; int16_t pitch; int16_t roll; if (pprz_mode == PPRZ_MODE_AUTO2) { int16_t yaw = from_fbw.channels[ RADIO_YAW ]; if (yaw > MIN_DX || yaw < -MIN_DX) { carrot_x += FLOAT_OF_PPRZ(yaw, 0, -20.);carrot_x = Min(carrot_x, MAX_DIST_CARROT); carrot_x = Max(carrot_x, -MAX_DIST_CARROT); } pitch = from_fbw.channels[ RADIO_PITCH ]; if (pitch > MIN_DX || pitch < -MIN_DX) { carrot_y += FLOAT_OF_PPRZ(pitch, 0, -20.); carrot_y = Min(carrot_y, MAX_DIST_CARROT); carrot_y = Max(carrot_y, -MAX_DIST_CARROT);} vertical_mode = VERTICAL_MODE_AUTO_ALT; roll = from_fbw.channels[ RADIO_ROLL ]; if (roll > MIN_DX || roll < -MIN_DX) { desired_altitude += FLOAT_OF_PPRZ(roll, 0, -1.0); desired_altitude = Max(desired_altitude, MIN_HEIGHT_CARROT+GROUND_ALT); desired_altitude = Min(desired_altitude, MAX_HEIGHT_CARROT+GROUND_ALT); } } CircleXY(carrot_x, carrot_y, radius); } + +#define Circle(wp, radius) CircleXY(waypoints[ wp ].x, waypoints[ wp ].y, radius) + +#define And(x, y) ((x) && (y)) +#define Or(x, y) ((x) || (y)) +//#define Min(x,y) (x < y ? x : y) +//#define Max(x,y) (x > y ? x : y) +#define Qdr(x) (Min(x, 350) < qdr && qdr < x+10) + +#include "flight_plan.h" + + +#define MIN_DIST2_WP (15.*15.) + +#define DISTANCE2(p1_x, p1_y, p2) ((p1_x-p2.x)*(p1_x-p2.x)+(p1_y-p2.y)*(p1_y-p2.y)) + +const int32_t nav_east0 = NAV_UTM_EAST0; +const int32_t nav_north0 = NAV_UTM_NORTH0; + +float desired_altitude = GROUND_ALT + MIN_HEIGHT_CARROT; +float desired_x, desired_y; +uint16_t nav_desired_gaz; +float nav_pitch = NAV_PITCH; +float nav_desired_roll; + +float dist2_to_wp, dist2_to_home; +bool_t too_far_from_home; +const uint8_t nb_waypoint = NB_WAYPOINT; + +struct point waypoints[ NB_WAYPOINT + 1 ] = WAYPOINTS + + static float carrot; +static bool_t approaching( uint8_t wp ) +{ + float pw_x = waypoints[ wp ].x - estimator_x; + float pw_y = waypoints[ wp ].y - estimator_y; + float scal_prod;//changes for PowerPc Fev-06 + + dist2_to_wp = pw_x * pw_x + pw_y * pw_y; + carrot = CARROT * estimator_hspeed_mod; + carrot = ( carrot < 40 ? 40 : carrot ); + if ( dist2_to_wp < carrot * carrot ) + return TRUE; + + scal_prod = ( waypoints[ wp ].x - last_x ) * pw_x + ( waypoints[ wp ].y - last_y ) * + pw_y; + + return ( scal_prod < 0 ); +} + +static inline void fly_to_xy( float x, float y ) +{ + desired_x = x; + desired_y = y; + desired_course = M_PI / 2. - atan2( y - estimator_y, x - estimator_x ); +} + +static void fly_to( uint8_t wp ) +{ + fly_to_xy( waypoints[ wp ].x, waypoints[ wp ].y ); +} + +static float alpha, leg; +static void route_to( uint8_t _last_wp, uint8_t wp ) +{ + float last_wp_x = waypoints[ _last_wp ].x; + float last_wp_y = waypoints[ _last_wp ].y; + float leg_x = waypoints[ wp ].x - last_wp_x; + float leg_y = waypoints[ wp ].y - last_wp_y; + float leg2 = leg_x * leg_x + leg_y * leg_y; + alpha = ( ( estimator_x - last_wp_x ) * leg_x + ( estimator_y - last_wp_y ) * + leg_y ) / leg2; + alpha = Max( alpha, 0. ); + leg = sqrt( leg2 ); + alpha += Max( carrot / leg, 0. ); /* carrot computed in approaching() */ + alpha = Min( 1., alpha ); + fly_to_xy( last_wp_x + alpha * leg_x, last_wp_y + alpha * leg_y ); +} + +/*static void glide_to(uint8_t _last_wp, uint8_t wp) { + float last_alt = waypoints[ _last_wp ].a; + desired_altitude = last_alt + alpha * (waypoints[ wp ].a - last_alt); + pre_climb = NOMINAL_AIRSPEED * (waypoints[ wp ].a - last_alt) / leg; + }*/ + +static inline void compute_dist2_to_home( void ) +{ + float ph_x = waypoints[ WP_HOME ].x - estimator_x; + float ph_y = waypoints[ WP_HOME ].y - estimator_y; + dist2_to_home = ph_x * ph_x + ph_y * ph_y; + too_far_from_home = dist2_to_home > ( MAX_DIST_FROM_HOME * MAX_DIST_FROM_HOME ); +} + +void nav_home( void ) +{ + //Circle(WP_HOME, 50); /* FIXME: radius should be defined elsewhere */ + { + float alpha = atan2( estimator_y - waypoints[ WP_HOME ].y, + estimator_x - waypoints[ WP_HOME ].x ); + float alpha_carrot = alpha + CARROT / ( -50 * estimator_hspeed_mod ); + fly_to_xy( waypoints[ WP_HOME ].x + cos( alpha_carrot )*fabs( 50 ), + waypoints[ WP_HOME ].y + sin( alpha_carrot )*fabs( 50 ) ); + qdr = DegOfRad( M_PI / 2 - alpha_carrot ); + { + _Pragma( "loopbounds min 0 max 2" ) + while ( qdr < 0 ) qdr += 360; + _Pragma( "loopbounds min 0 max 2" ) + while ( qdr >= 360 ) qdr -= 360; + } + } + + nav_pitch = 0.; /* Nominal speed */ + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = GROUND_ALT + 50; + compute_dist2_to_home(); + dist2_to_wp = dist2_to_home; +} + +void nav_update( void ) +{ + compute_dist2_to_home(); + + auto_nav(); +} + + +void nav_init( void ) +{ + nav_block = 0; + nav_stage = 0; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.h new file mode 100644 index 0000000..cf2b2b4 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/nav.h @@ -0,0 +1,58 @@ +/* + Paparazzi mcu0 $Id: nav.h,v 1.1 2011-01-18 12:48:39 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef NAV_H +#define NAV_H + +#include + +struct point { + float x; + float y; + float a; +}; +extern float cur_pos_x; +extern float cur_pos_y; +extern uint8_t nav_stage, nav_block; +extern float dist2_to_wp, dist2_to_home; + +extern const int32_t nav_east0; +extern const int32_t nav_north0; + +extern const uint8_t nb_waypoint; +extern struct point waypoints[]; +extern float desired_altitude, desired_x, desired_y; + +extern uint16_t nav_desired_gaz; +extern float nav_pitch, rc_pitch; +extern bool_t too_far_from_home; +extern uint16_t stage_time, block_time; /* s */ +extern float stage_time_ds; /* s */ +extern float nav_desired_roll; + +void nav_update( void ); +void nav_home( void ); +void nav_init( void ); + +#endif /* NAV_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.c new file mode 100644 index 0000000..2268acf --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.c @@ -0,0 +1,139 @@ +/* + $Id: pid.c,v 1.2 2011-01-21 11:52:44 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +/** \file pid.c + \brief PID controllers (roll, pitch, climb, altitude, course). + +*/ + +//#include +#include + +#include "pid.h" + +#include "autopilot.h" +#include "infrared.h" +#include "estimator.h" +#include "nav.h" + +float desired_roll = 0.; +float desired_pitch = 0.; +int16_t desired_gaz, desired_aileron, desired_elevator; +float roll_pgain = ROLL_PGAIN; +float pitch_pgain = PITCH_PGAIN; +float pitch_of_roll = PITCH_OF_ROLL; + +float pitch_of_vz_pgain = CLIMB_PITCH_OF_VZ_PGAIN; +float pitch_of_vz = 0.; + + +/** \brief Computes ::desired_aileron and ::desired_elevator from attitude estimation and expected attitude. */ +void roll_pitch_pid_run( void ) +{ + float err = estimator_phi - desired_roll; + desired_aileron = TRIM_PPRZ( roll_pgain * err ); + if ( pitch_of_roll < 0. ) + pitch_of_roll = 0.; + err = -( estimator_theta - desired_pitch - pitch_of_roll * fabs( + estimator_phi ) ); + desired_elevator = TRIM_PPRZ( pitch_pgain * err ); +} + +float course_pgain = COURSE_PGAIN; +float desired_course = 0.; +float max_roll = MAX_ROLL; + +void course_pid_run( void ) +{ + float err = estimator_hspeed_dir - desired_course; + //NORM_RAD_ANGLE(err); + _Pragma( "loopbound min 0 max 1" ) + while ( err > M_PI ) err -= 2 * M_PI; + _Pragma( "loopbound min 0 max 1" ) + while ( err < -M_PI ) err += 2 * M_PI; + nav_desired_roll = course_pgain * err; // * fspeed / AIR_SPEED; + if ( nav_desired_roll > max_roll ) + nav_desired_roll = max_roll; + else + if ( nav_desired_roll < -max_roll ) + nav_desired_roll = -max_roll; +} + +const float climb_pgain = CLIMB_PGAIN; +const float climb_igain = CLIMB_IGAIN; +float desired_climb = 0., pre_climb = 0.; +static const float level_gaz = CLIMB_LEVEL_GAZ; +float climb_sum_err = 0; + +float climb_pitch_pgain = CLIMB_PITCH_PGAIN; +float climb_pitch_igain = CLIMB_PITCH_IGAIN; +float climb_pitch_sum_err = 0.; +float max_pitch = MAX_PITCH; +float min_pitch = MIN_PITCH; + + +#define MAX_CLIMB_SUM_ERR 100 +#define MAX_PITCH_CLIMB_SUM_ERR 100 + +/** \brief Computes desired_gaz and desired_pitch from desired_climb */ +void climb_pid_run ( void ) +{ + float err = estimator_z_dot - desired_climb; + float fgaz; + if ( auto_pitch ) { /* gaz constant */ + desired_gaz = nav_desired_gaz; + desired_pitch = climb_pitch_pgain * ( err + climb_pitch_igain * + climb_pitch_sum_err ); + if ( desired_pitch > max_pitch ) + desired_pitch = max_pitch; + if ( desired_pitch < min_pitch ) + desired_pitch = min_pitch; + climb_pitch_sum_err += err; + if ( climb_pitch_sum_err > MAX_PITCH_CLIMB_SUM_ERR ) + climb_pitch_sum_err = MAX_PITCH_CLIMB_SUM_ERR; + if ( climb_pitch_sum_err < - MAX_PITCH_CLIMB_SUM_ERR ) + climb_pitch_sum_err = - MAX_PITCH_CLIMB_SUM_ERR; + } else { /* pitch almost constant */ + /* pitch offset for climb */ + pitch_of_vz = ( desired_climb > 0 ) ? desired_climb * pitch_of_vz_pgain : 0.; + fgaz = climb_pgain * ( err + climb_igain * climb_sum_err ) + CLIMB_LEVEL_GAZ + + CLIMB_GAZ_OF_CLIMB * desired_climb; + climb_sum_err += err; + if ( climb_sum_err > MAX_CLIMB_SUM_ERR ) climb_sum_err = MAX_CLIMB_SUM_ERR; + if ( climb_sum_err < - MAX_CLIMB_SUM_ERR ) climb_sum_err = - MAX_CLIMB_SUM_ERR; + desired_gaz = TRIM_UPPRZ( fgaz * MAX_PPRZ ); + desired_pitch = nav_pitch + pitch_of_vz; + } +} + +float altitude_pgain = ALTITUDE_PGAIN; + + +void altitude_pid_run( void ) +{ + float err = estimator_z - desired_altitude; + desired_climb = pre_climb + altitude_pgain * err; + if ( desired_climb < -CLIMB_MAX ) desired_climb = -CLIMB_MAX; + if ( desired_climb > CLIMB_MAX ) desired_climb = CLIMB_MAX; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.h new file mode 100644 index 0000000..988dcc0 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/pid.h @@ -0,0 +1,61 @@ +/* + Paparazzi mcu0 $Id: pid.h,v 1.1 2011-01-18 12:48:39 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef PID_H +#define PID_H + +#include + +#define NORM_RAD_ANGLE(x) { \ + while (x > M_PI) x -= 2 * M_PI; \ + while (x < -M_PI) x += 2 * M_PI; \ + } + +extern float desired_roll; +extern float max_roll; +extern float desired_pitch; +extern float roll_pgain; +extern float pitch_pgain; +extern float pitch_of_roll; +void roll_pitch_pid_run( void ); + + +extern float course_pgain; +extern float desired_course; +void course_pid_run( void ); + + +extern const float climb_pgain; +extern const float climb_igain; +extern float climb_sum_err; +extern float desired_climb, pre_climb; +extern int16_t desired_gaz, desired_aileron, desired_elevator; + +extern float pitch_of_vz_pgain; +extern float pitch_of_vz; + +void climb_pid_run( void ); +void altitude_pid_run( void ); + +#endif /* PID_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/sirf.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/sirf.h new file mode 100644 index 0000000..e7c2d36 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/sirf.h @@ -0,0 +1,36 @@ +/* + Paparazzi autopilot $Id: sirf.h,v 1.1 2011-01-18 12:48:39 moellmer Exp $ + + Copyright (C) 2004 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +/* + SIRF protocol specific code + +*/ + + +#ifndef SIRF_H +#define SIRF_H + +#define GPS_FIX_VALID(gps_mode) (gps_mode & 1<<5) + +#endif /* SIRF_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.c new file mode 100644 index 0000000..83165dc --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include + + +#include "spi.h" +#include "autopilot.h" +#include "link_fbw.h" +#include "ad7714.h" + +volatile uint8_t spi_cur_slave; +uint8_t spi_nb_ovrn; + +void spi_init( void ) +{ + /* Set MOSI and SCK output, all others input */ + SPI_DDR |= _BV( SPI_MOSI_PIN ) | _BV( SPI_SCK_PIN ); + + /* enable pull up for miso */ + // SPI_PORT |= _BV(SPI_MISO_PIN); + + /* Set SS0 output */ + sbi( SPI_SS0_DDR, SPI_SS0_PIN ); + /* SS0 idles high (don't select slave yet)*/ + SPI_UNSELECT_SLAVE0(); + + /* Set SS1 output */ + sbi( SPI_SS1_DDR, SPI_SS1_PIN ); + /* SS1 idles high (don't select slave yet)*/ + SPI_UNSELECT_SLAVE1(); + + spi_cur_slave = SPI_NONE; +} + + +SIGNAL( SIG_SPI ) +{ + if ( spi_cur_slave == SPI_SLAVE0 ) + link_fbw_on_spi_it(); + else + fatal_error_nb++; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.h new file mode 100644 index 0000000..a345da5 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/spi.h @@ -0,0 +1,74 @@ +#ifndef SPI_H +#define SPI_H + +//#include "link_autopilot.h" + +#define SPI_SS0_PIN 0 +#define SPI_SS0_PORT PORTB +#define SPI_SS0_DDR DDRB +#define SPI_IT0_PIN 1 +#define SPI_IT0_PORT PORTD +#define SPI_IT0_DDR DDRD + +#define SPI_SS1_PIN 7 +#define SPI_SS1_PORT PORTE +#define SPI_SS1_DDR DDRE +#define SPI_IT1_PIN 6 +#define SPI_IT1_PORT PORTE +#define SPI_IT1_DDR DDRE + +#define SPI_SCK_PIN 1 +#define SPI_MOSI_PIN 2 +#define SPI_MISO_PIN 3 +#define SPI_PORT PORTB +#define SPI_DDR DDRB + + + +#define SPI_NONE 0 +#define SPI_SLAVE0 1 +#define SPI_SLAVE1 2 + +extern volatile uint8_t spi_cur_slave; +extern uint8_t spi_nb_ovrn; + +void spi_init( void ); + +#define SPI_START(_SPCR_VAL) { \ + uint8_t foo; \ + SPCR = _SPCR_VAL; \ + if (bit_is_set(SPSR, SPIF)) \ + foo = SPDR; \ + SPCR |= _BV(SPIE); \ +} + +#define SPI_SELECT_SLAVE0() { \ + spi_cur_slave = SPI_SLAVE0; \ + cbi( SPI_SS0_PORT, SPI_SS0_PIN );\ +} + +#define SPI_UNSELECT_SLAVE0() { \ + spi_cur_slave = SPI_NONE; \ + sbi( SPI_SS0_PORT, SPI_SS0_PIN );\ +} + +#define SPI_SELECT_SLAVE1() { \ + spi_cur_slave = SPI_SLAVE1; \ + cbi( SPI_SS1_PORT, SPI_SS1_PIN );\ +} + +#define SPI_UNSELECT_SLAVE1() { \ + spi_cur_slave = SPI_NONE; \ + sbi( SPI_SS1_PORT, SPI_SS1_PIN );\ +} + +#define SPI_SEND(data) { \ + SPDR = data; \ +} + +#define SPI_STOP() { \ + cbi(SPCR,SPIE); \ + cbi(SPCR, SPE); \ +} + +#endif /* SPI_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/timer.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/timer.h new file mode 100644 index 0000000..b02e97b --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/timer.h @@ -0,0 +1,92 @@ +/* + Paparazzi mcu0 timer functions + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + Copyright (C) 2002 Trammell Hudson + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef TIMER_H +#define TIMER_H + +#include "std.h" +#include +#include + + +/* + Enable Timer1 (16-bit) running at Clk/1 for the global system + clock. This will be used for computing the servo pulse widths, + PPM decoding, etc. + + Low frequency periodic tasks will be signaled by timer 0 + running at Clk/1024. For 16 Mhz clock, this will be every + 262144 microseconds, or 61 Hz. +*/ +static inline void timer_init( void ) +{ + + /* Timer0: Modem clock is started in modem.h in ctc mode*/ + + /* Timer1 @ Clk/1: System clock, ppm and servos */ + TCCR1A = 0x00; + TCCR1B = 0x01; + + /* Timer2 @ Clk/1024: Periodic clock */ + TCCR2 = 0x05; +} + + +/* + Retrieve the current time from the global clock in Timer1, + disabling interrupts to avoid stomping on the TEMP register. + If interrupts are already off, the non_atomic form can be used. +*/ +static inline uint16_t +timer_now( void ) +{ + return TCNT1; +} + +static inline uint16_t +timer_now_non_atomic( void ) +{ + return TCNT1L; +} + + +/* + Periodic tasks occur when Timer2 overflows. Check and unset + the overflow bit. We cycle through four possible periodic states, + so each state occurs every 30 Hz. +*/ +static inline bool_t +timer_periodic( void ) +{ + if ( !bit_is_set( TIFR, TOV2 ) ) + return FALSE; + + TIFR = 1 << TOV2; + return TRUE; +} + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.c new file mode 100644 index 0000000..ed9f0d3 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.c @@ -0,0 +1,149 @@ +/* + Paparazzi $Id: uart.c,v 1.3 2011-01-25 09:40:37 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "uart.h" +#include "std.h" + +#define TX_BUF_SIZE 256 +static uint8_t tx_head0; /* next free in buf */ +static volatile uint8_t tx_tail0; /* next char to send */ +static uint8_t tx_buf0[ TX_BUF_SIZE ]; + +static uint8_t tx_head1; /* next free in buf */ +static volatile uint8_t tx_tail1; /* next char to send */ +static uint8_t tx_buf1[ TX_BUF_SIZE ]; + +void uart0_transmit( const unsigned char data ) +{ + if ( UCSR0B & _BV( TXCIE ) ) { + /* we are waiting for the last char to be sent : buffering */ + if ( tx_tail0 == tx_head0 + 1 ) { /* BUF_SIZE = 256 */ + /* Buffer is full (almost, but tx_head = tx_tail means "empty" */ + return; + } + tx_buf0[ tx_head0 ] = data; + tx_head0++; /* BUF_SIZE = 256 */ + } else { /* Channel is free: just send */ + UDR0 = data; + sbi( UCSR0B, TXCIE ); + } +} + +void uart1_transmit( const unsigned char data ) +{ + if ( UCSR1B & _BV( TXCIE ) ) { + /* we are waiting for the last char to be sent : buffering */ + if ( tx_tail1 == tx_head1 + 1 ) { /* BUF_SIZE = 256 */ + /* Buffer is full (almost, but tx_head = tx_tail means "empty" */ + return; + } + tx_buf1[ tx_head1 ] = data; + tx_head1++; /* BUF_SIZE = 256 */ + } else { /* Channel is free: just send */ + UDR1 = data; + sbi( UCSR1B, TXCIE ); + } +} + + +void uart0_print_string( const uint8_t *s ) +{ + uint8_t i = 0; + _Pragma( "loopbound min 0 max 0" ) + while ( s[ i ] ) { + uart0_transmit( s[ i ] ); + i++; + } +} + +void uart0_print_hex( const uint8_t c ) +{ + const uint8_t hex[ 16 ] = { '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + uint8_t high = ( c & 0xF0 ) >> 4; + uint8_t low = c & 0x0F; + uart0_transmit( hex[ high ] ); + uart0_transmit( hex[ low ] ); +} + + +SIGNAL( SIG_UART0_TRANS ) +{ + if ( tx_head0 == tx_tail0 ) { + /* Nothing more to send */ + cbi( UCSR0B, TXCIE ); /* disable interrupt */ + } else { + UDR0 = tx_buf0[ tx_tail0 ]; + tx_tail0++; /* warning tx_buf_len is 256 */ + } +} + +SIGNAL( SIG_UART1_TRANS ) +{ + if ( tx_head1 == tx_tail1 ) { + /* Nothing more to send */ + cbi( UCSR1B, TXCIE ); /* disable interrupt */ + } else { + UDR1 = tx_buf1[ tx_tail1 ]; + tx_tail1++; /* warning tx_buf_len is 256 */ + } +} + +void uart0_init( void ) +{ + /* Baudrate is 38.4k */ + UBRR0H = 0; + UBRR0L = 25; // 38.4 + // UBRR0L = 103; //9600 + /* single speed */ + UCSR0A = 0; + /* Enable receiver and transmitter */ + UCSR0B = _BV( RXEN ) | _BV( TXEN ); + /* Set frame format: 8data, 1stop bit */ + UCSR0C = _BV( UCSZ1 ) | _BV( UCSZ0 ); + /* Enable uart receive interrupt */ + sbi( UCSR0B, RXCIE ); +} + +void uart1_init( void ) +{ + /* Baudrate is 38.4k */ + UBRR1H = 0; + UBRR1L = 25; // 38.4 + // UBRR1L = 103; //9600 + + + /* single speed */ + UCSR1A = 0; + /* Enable receiver and transmitter */ + UCSR1B = _BV( RXEN ) | _BV( TXEN ); + /* Set frame format: 8data, 1stop bit */ + UCSR1C = _BV( UCSZ1 ) | _BV( UCSZ0 ); + /* Enable uart receive interrupt */ + sbi( UCSR1B, RXCIE ); +} + diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.h new file mode 100644 index 0000000..eb09b80 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/uart.h @@ -0,0 +1,48 @@ +/* + Paparazzi $Id: uart.h,v 1.2 2011-01-18 14:55:52 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef _UART_H_ +#define _UART_H_ + +#include + +extern void uart0_init( void ); +extern void uart1_init( void ); + +extern void uart0_print_string( const uint8_t * ); +extern void uart0_print_hex( const uint8_t ); +void uart0_transmit( const uint8_t ); +void uart1_transmit( const uint8_t ); + +#define ReceiveUart0(cb) \ + SIGNAL( SIG_UART0_RECV ) { \ + uint8_t c = UDR0; \ + cb(c); \ +} +#define ReceiveUart1(cb) \ + SIGNAL( SIG_UART1_RECV ) { \ + uint8_t c = UDR1; \ + cb(c); \ +} + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ubx.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ubx.h new file mode 100644 index 0000000..e5d628c --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/autopilot/ubx.h @@ -0,0 +1,38 @@ +/* + Paparazzi autopilot $Id: ubx.h,v 1.1 2011-01-18 12:48:39 moellmer Exp $ + + Copyright (C) 2004 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +/* + UBX protocol specific code + +*/ + + +#ifndef UBX_H +#define UBX_H + +#define GPS_FIX_VALID(gps_mode) (gps_mode == 3) +extern const int32_t utm_east0; +extern const int32_t utm_north0; + +#endif /* UBX_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.c new file mode 100644 index 0000000..0b150c1 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.c @@ -0,0 +1,121 @@ +/* + Paparazzi fly by wire adc functions + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + Copyright (C) 2002 Trammell Hudson + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +//// ADC3 MVSUP +//// ADC6 MVSERVO + + +#include +#include +#include +#include "adc_fbw.h" +#include "std.h" + + +#if defined CTL_BRD_V1_2 || defined CTL_BRD_V1_2_1 + +#define VOLTAGE_TIME 0x07 +#define ANALOG_PORT PORTC +#define ANALOG_PORT_DIR DDRC + + +// +#define ANALOG_VREF _BV(REFS0) | _BV(REFS1) + +uint16_t adc_samples[ NB_ADC ]; + +static struct adc_buf *buffers[ NB_ADC ]; + +void fbw_adc_buf_channel( uint8_t adc_channel, struct adc_buf *s ) +{ + buffers[ adc_channel ] = s; +} + +void +fbw_adc_init( void ) +{ + uint8_t i; + /* Ensure that our port is for input with no pull-ups */ + ANALOG_PORT = 0x00; + ANALOG_PORT_DIR = 0x00; + + /* Select our external voltage ref */ + ADMUX = ANALOG_VREF; + + /* Select out clock, turn on the ADC interrupt and start conversion */ + ADCSRA = 0 + | VOLTAGE_TIME + | _BV( ADEN ) + | _BV( ADIE ) + | _BV( ADSC ); + + /* Init to 0 (usefull ?) */ + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < NB_ADC; i++ ) + buffers[ i ] = ( struct adc_buf * )0; +} + +/** + Called when the voltage conversion is finished + + 8.913kHz on mega128@16MHz 1kHz/channel ?? +*/ + +SIGNAL( SIG_ADC ) +{ + uint8_t adc_input = ADMUX & 0x7; + struct adc_buf *buf = buffers[ adc_input ]; + uint16_t adc_value = ADCW; + /* Store result */ + adc_samples[ adc_input ] = adc_value; + + if ( buf ) { + uint8_t new_head = buf->head + 1; + if ( new_head >= AV_NB_SAMPLE ) new_head = 0; + buf->sum -= buf->values[ new_head ]; + buf->values[ new_head ] = adc_value; + buf->sum += adc_value; + buf->head = new_head; + } + + /* Find the next input */ + adc_input++; + if ( adc_input == 4 ) + adc_input = 6; // ADC 4 and 5 for i2c + if ( adc_input >= 8 ) { + adc_input = 0; + #ifdef CTL_BRD_V1_2 + adc_input = 1; // WARNING ADC0 is for rservo driver reset on v1.2.0 + #endif /* CTL_BRD_V1_2 */ + } + /* Select it */ + ADMUX = adc_input | ANALOG_VREF; + /* Restart the conversion */ + sbi( ADCSR, ADSC ); +} + +#endif /* CTL_BRD_V1_2 || CTL_BRD_V1_2_1 */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.h new file mode 100644 index 0000000..f01f476 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/adc_fbw.h @@ -0,0 +1,62 @@ +/* + Paparazzi fly by wire adc functions + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + Copyright (C) 2002 Trammell Hudson + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef _ADC_H_ +#define _ADC_H_ + +#include "airframe.h" + +#if defined CTL_BRD_V1_2 || defined CTL_BRD_V1_2_1 + +#include + + +#define NB_ADC 8 + +/* Array containing the last measured value */ +extern uint16_t adc_samples[ NB_ADC ]; + +void adc_init( void ); + +#define AV_NB_SAMPLE 0x20 + +struct adc_buf { + uint16_t sum; + uint16_t values[ AV_NB_SAMPLE ]; + uint8_t head; +}; + +/* Facility to store last values in a circular buffer for a specific + channel: allocate a (struct adc_buf) and register it with the following + function */ +void adc_buf_channel( uint8_t adc_channel, struct adc_buf *s ); +void fbw_adc_init( void ); +void fbw_adc_buf_channel( uint8_t adc_channel, struct adc_buf *s ); + +#endif /* CTL_BRD_V1_2 || CTL_BRD_V1_2 */ + +#endif /* _ADC_H_ */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/link_autopilot.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/link_autopilot.h new file mode 100644 index 0000000..2f5a292 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/link_autopilot.h @@ -0,0 +1,69 @@ +/* $Id: link_autopilot.h,v 1.1 2011-01-18 12:42:42 moellmer Exp $ + + (c) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef LINK_AUTOPILOT_H +#define LINK_AUTOPILOT_H + +#include + +#include "std.h" +#include "radio.h" +#include "airframe.h" + +/* + System clock in MHz. +*/ +#define CLOCK 16 + +typedef int16_t pprz_t; // type of commands + +/* !!!!!!!!!!!!!!!!!!! Value used in gen_airframe.ml !!!!!!!!!!!!!!!!! */ +#define MAX_PPRZ (600 * CLOCK) +#define MIN_PPRZ -MAX_PPRZ + +struct inter_mcu_msg { + int16_t channels[ RADIO_CTL_NB ]; + uint8_t ppm_cpt; + uint8_t status; + uint8_t nb_err; + uint8_t vsupply; /* 1e-1 V */ +}; + +// Status bits from FBW to AUTOPILOT +#define STATUS_RADIO_OK 0 +#define RADIO_REALLY_LOST 1 +#define AVERAGED_CHANNELS_SENT 2 +#define MASK_FBW_CHANGED 0x3 + +// Statut bits from AUTOPILOT to FBW +#define STATUS_AUTO_OK 0 + +#define FRAME_LENGTH (sizeof(struct inter_mcu_msg)+1) + +#define TRESHOLD_MANUAL_PPRZ (MIN_PPRZ / 2) + +void test_ppm_task( void ); +void check_mega128_values_task( void ); +void send_data_to_autopilot_task( void ); +void check_failsafe_task( void ); +#endif // LINK_AUTOPILOT_H diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/main.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/main.c new file mode 100644 index 0000000..0a3f474 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/main.c @@ -0,0 +1,219 @@ +/* + Paparazzi $Id: main.c,v 1.4 2011-01-25 10:42:14 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "timer.h" +#include "servo.h" +#include "ppm.h" +#include "spi.h" +#include "link_autopilot.h" +#include "radio.h" + + +#include "uart.h" + + +#ifndef CTL_BRD_V1_1 +#include "adc_fbw.h" +struct adc_buf vsupply_adc_buf; +struct adc_buf vservos_adc_buf; +#endif + +uint8_t mode; +static uint8_t time_since_last_mega128; +static uint16_t time_since_last_ppm; +bool_t radio_ok, mega128_ok, radio_really_lost; + +static const pprz_t failsafe[ ] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + +static uint8_t ppm_cpt, last_ppm_cpt; + +#define STALLED_TIME 30 // 500ms with a 60Hz timer +#define REALLY_STALLED_TIME 300 // 5s with a 60Hz timer + + +/* static inline void status_transmit( void ) { */ +/* uint8_t i; */ +/* uart_transmit(7); */ +/* uart_transmit(7); */ +/* for (i=0; i>8); */ +/* uart_transmit(ppm_pulses[ i ] & 0xff); */ +/* } */ +/* uart_transmit('\n'); */ +/* } */ + + +/* Prepare data to be sent to mcu0 */ +static void to_autopilot_from_last_radio ( void ) +{ + uint8_t i; + _Pragma( "loopbound min 9 max 9" ) + for ( i = 0; i < RADIO_CTL_NB; i++ ) + to_mega128.channels[ i ] = last_radio[ i ]; + to_mega128.status = ( radio_ok ? _BV( STATUS_RADIO_OK ) : 0 ); + to_mega128.status |= ( radio_really_lost ? _BV( RADIO_REALLY_LOST ) : 0 ); + if ( last_radio_contains_avg_channels ) { + to_mega128.status |= _BV( AVERAGED_CHANNELS_SENT ); + last_radio_contains_avg_channels = FALSE; + } + to_mega128.ppm_cpt = last_ppm_cpt; + #ifndef CTL_BRD_V1_1 + to_mega128.vsupply = VoltageOfAdc( vsupply_adc_buf.sum / AV_NB_SAMPLE ) * 10; + #else + to_mega128.vsupply = 0; + #endif +} + +void _Pragma( "entrypoint" ) send_data_to_autopilot_task( void ) +{ + #ifndef WCET_ANALYSIS + if ( !SpiIsSelected() && spi_was_interrupted ) { + spi_was_interrupted = FALSE; + to_autopilot_from_last_radio(); + spi_reset(); + } + #endif +} + +#ifdef PAPABENCH_SINGLE +extern uint8_t _1Hz; +extern uint8_t _20Hz; +#else +static uint8_t _1Hz; +static uint8_t _20Hz; +#endif + +void fbw_init( void ) +{ + uart_init_tx(); + uart_print_string( "FBW Booting $Id: main.c,v 1.4 2011-01-25 10:42:14 plazar Exp $\n" ); + + #ifndef CTL_BRD_V1_1 + fbw_adc_init(); + fbw_adc_buf_channel( 3, &vsupply_adc_buf ); + fbw_adc_buf_channel( 6, &vservos_adc_buf ); + #endif + timer_init(); + servo_init(); + ppm_init(); + fbw_spi_init(); + //sei(); //FN +} + +void fbw_schedule( void ) +{ + if ( time_since_last_mega128 < STALLED_TIME ) + time_since_last_mega128++; + if ( time_since_last_ppm < REALLY_STALLED_TIME ) + time_since_last_ppm++; + if ( _1Hz == 0 ) { + last_ppm_cpt = ppm_cpt; + ppm_cpt = 0; + } + test_ppm_task(); + check_mega128_values_task(); + send_data_to_autopilot_task(); + check_failsafe_task(); + if ( _20Hz >= 3 ) + servo_transmit(); +} + +#ifndef PAPABENCH_SINGLE +int main( void ) +{ + fbw_init(); + #ifndef NO_MAINLOOP + while ( 1 ) { + #endif + fbw_schedule(); + if ( timer_periodic() ) { + _1Hz++; + _20Hz++; + if ( _1Hz >= 60 ) + _1Hz = 0; + if ( _20Hz >= 3 ) + _20Hz = 0; + } + #ifndef NO_MAINLOOP + } + #endif + return 0; +} +#endif + +void _Pragma( "entrypoint" ) test_ppm_task( void ) +{ + if ( ppm_valid ) { + ppm_valid = FALSE; + ppm_cpt++; + radio_ok = TRUE; + radio_really_lost = FALSE; + time_since_last_ppm = 0; + last_radio_from_ppm(); + if ( last_radio_contains_avg_channels ) + mode = MODE_OF_PPRZ( last_radio[ RADIO_MODE ] ); + if ( mode == MODE_MANUAL ) + servo_set( last_radio ); + } else + if ( mode == MODE_MANUAL && radio_really_lost ) + mode = MODE_AUTO; + if ( time_since_last_ppm >= STALLED_TIME ) + radio_ok = FALSE; + if ( time_since_last_ppm >= REALLY_STALLED_TIME ) + radio_really_lost = TRUE; +} +void _Pragma( "entrypoint" ) check_failsafe_task( void ) +{ + if ( ( mode == MODE_MANUAL && !radio_ok ) || + ( mode == MODE_AUTO && !mega128_ok ) ) + servo_set( failsafe ); +} +void _Pragma( "entrypoint" ) check_mega128_values_task( void ) +{ + #ifndef WCET_ANALYSIS + if ( !SpiIsSelected() && spi_was_interrupted ) { + if ( mega128_receive_valid ) { + time_since_last_mega128 = 0; + mega128_ok = TRUE; + if ( mode == MODE_AUTO ) + servo_set( from_mega128.channels ); + } + } + if ( time_since_last_mega128 == STALLED_TIME ) + mega128_ok = FALSE; + #endif +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.c new file mode 100644 index 0000000..4c0fcf4 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.c @@ -0,0 +1,107 @@ +/* $Id: ppm.c,v 1.1 2011-01-18 12:42:42 moellmer Exp $ + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + (c) 2003 Trammell Hudson + (c) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "radio.h" +#include "ppm.h" + +#define AVERAGING_PERIOD (PPM_FREQ/4) + +/* + Pulse width is computed as the difference between now and the + previous pulse. If no pulse has been received between then and + now, the time of the last pulse will be equal to the last pulse + we measured. Unfortunately, the Input Capture Flag (ICF1) will + not be set since the interrupt routine disables it. + + Sync pulses are timed with Timer2, which runs at Clk/1024. This + is slow enough at both 4 and 8 Mhz to measure the lengthy (10ms + or longer) pulse. + + Otherwise, compute the pulse width with the 16-bit timer1, + push the pulse width onto the stack and increment the + pulse counter until we have received eight pulses. +*/ + +uint16_t ppm_pulses[ PPM_NB_PULSES ]; +pprz_t last_radio[ PPM_NB_PULSES ]; +pprz_t avg_last_radio[ PPM_NB_PULSES ]; +bool_t last_radio_contains_avg_channels = FALSE; +volatile bool_t ppm_valid; + +/* MC3030, Trame PPM7: 25ms, 10.4 au neutre, + sync pulse = 16.2ms with low value on every channels */ + + + + +#define RestartPpmCycle() { state = 0; sync_start = TCNT2; return; } + +#ifdef PAPABENCH_SINGLE +SIGNAL( SIG_SPM_READY ) +#else +SIGNAL( SIG_INPUT_CAPTURE1 ) +#endif +{ + static uint16_t last; + uint16_t this; + uint16_t width; + static uint8_t state; + static uint8_t sync_start; + + this = ICR1; + width = this - last; + last = this; + + if ( state == 0 ) { + uint8_t end = TCNT2; + uint8_t diff = ( end - sync_start ); + sync_start = end; + + /* The frame period of the mc3030 seems to be 25ms. + One pulse lasts from 1.05ms to 2.150ms. + Sync pulse is at least 7ms : (7000*CLOCK)/1024 = 109 + */ + if ( diff > ( uint8_t )( ( ( uint32_t )( 7000ul * CLOCK ) ) / 1024ul ) ) + state = 1; + } else { + /* Read a data pulses */ + if ( width < 700ul * CLOCK || width > 2300ul * CLOCK ) + RestartPpmCycle(); + ppm_pulses[ state - 1 ] = width; + + if ( state >= PPM_NB_PULSES ) { + ppm_valid = 1; + RestartPpmCycle(); + } else + state++; + } + return; +} + +/* Copy from the ppm receiving buffer to the buffer sent to mcu0 */ +void last_radio_from_ppm() +{ + LastRadioFromPpm() +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.h new file mode 100644 index 0000000..fc22b31 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/ppm.h @@ -0,0 +1,102 @@ +/* $Id: ppm.h,v 1.2 2011-01-18 14:55:53 moellmer Exp $ + + Decoder for the trainer ports or hacked receivers for both + Futaba and JR formats. The ppm_valid flag is set whenever + a valid frame is received. + + Pulse widths are stored as unscaled 16-bit values in ppm_pulses[ ]. + If you require actual microsecond values, divide by CLOCK. + For an 8 Mhz clock and typical servo values, these will range + from 0x1F00 to 0x4000. + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + (c) 2002 Trammell Hudson + (c) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef PPM_H +#define PPM_H + + +/** + Receiver types +*/ +#define RXFUTABA 0 +#define RXJR 1 + +#define PPM_RX_TYPE RXFUTABA +#define PPM_FREQ 40 // 25ms + +#include +#include + +#include "timer.h" +#include "link_autopilot.h" + +#define PpmOfUs(x) ((x)*CLOCK) + +#define PPM_DDR DDRB +#define PPM_PORT PORTB +#define PPM_PIN PB0 + +/* + PPM pulses are falling edge clocked on the ICP, which records + the state of the global clock. We do not use any noise + canceling features. + + JR might be rising edge clocked; set that as an option +*/ +static inline void +ppm_init( void ) +{ + #if PPM_RX_TYPE == RXFUTABA + cbi( TCCR1B, ICES1 ); + #elif PPM_RX_TYPE == RXJR + sbi( TCCR1B, ICES1 ); + #else +# error "ppm.h: Unknown receiver type in PPM_RX_TYPE" + #endif + + /* No noise cancelation */ + sbi( TCCR1B, ICNC1 ); + + /* Set ICP to input, no internal pull up */ + cbi( PPM_DDR, PPM_PIN ); + + /* Enable interrupt on input capture */ + sbi( TIMSK, TICIE1 ); +} + +#define PPM_NB_PULSES RADIO_CTL_NB + +extern volatile bool_t ppm_valid; +extern pprz_t last_radio[ PPM_NB_PULSES ]; +extern bool_t last_radio_contains_avg_channels; + + +#define MODE_MANUAL 0 +#define MODE_AUTO 1 + +#define MODE_OF_PPRZ(mode) ((mode) < TRESHOLD_MANUAL_PPRZ ? MODE_MANUAL : MODE_AUTO) + +extern void last_radio_from_ppm( void ); +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.c new file mode 100644 index 0000000..e314351 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.c @@ -0,0 +1,200 @@ +/* $Id: servo.c,v 1.4 2011-01-25 10:05:41 plazar Exp $ + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + (c) 2002 Trammell Hudson + (c) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "servo.h" +#include "link_autopilot.h" + +#include "airframe.h" + +#include "uart.h" + + +/* + Paparazzi boards have one 4017 servo driver. + It is driven by OCR1A (PB1) with reset on PORTD5. +*/ +#define _4017_NB_CHANNELS 10 + +#ifdef CTL_BRD_V1_1 +#define _4017_RESET_PORT PORTD +#define _4017_RESET_DDR DDRD +#define _4017_RESET_PIN 5 +#endif /* CTL_BRD_V1_1 */ + +#ifdef CTL_BRD_V1_2 +#define _4017_RESET_PORT PORTC +#define _4017_RESET_DDR DDRC +#define _4017_RESET_PIN 0 +#endif /* CTL_BRD_V1_2 */ + +#ifdef CTL_BRD_V1_2_1 +#define _4017_RESET_PORT PORTD +#define _4017_RESET_DDR DDRD +#define _4017_RESET_PIN 7 +#endif /* CTL_BRD_V1_2 */ + +#define _4017_CLOCK_PORT PORTB +#define _4017_CLOCK_DDR DDRB +#define _4017_CLOCK_PIN PB1 + +#define SERVO_OCR OCR1A +#define SERVO_ENABLE OCIE1A +#define SERVO_FLAG OCF1A +#define SERVO_FORCE FOC1A +#define SERVO_COM0 COM1A0 +#define SERVO_COM1 COM1A1 + +/* Following macro is required since the compiler does not solve at + compile-time indexation in a known array with a known index */ +#define SERVO_NEUTRAL_(i) SERVOS_NEUTRALS_ ## i +#define SERVO_NEUTRAL(i) (SERVO_NEUTRAL_(i)*CLOCK) + +#define SERVO_NEUTRAL_I(i) (((int[ ])SERVOS_NEUTRALS[ i ])*CLOCK) +#define SERVO_MIN_I(i) (((int[ ])SERVOS_MINS[ i ])*CLOCK) + +#define SERVO_MIN (SERVO_MIN_US*CLOCK) +#define SERVO_MAX (SERVO_MAX_US*CLOCK) +#define ChopServo(x) ((x) < SERVO_MIN ? SERVO_MIN : ((x) > SERVO_MAX ? SERVO_MAX : (x))) + +/* holds the servo pulses width in clock ticks */ +static uint16_t servo_widths[ _4017_NB_CHANNELS ]; + +/* + We use the output compare registers to generate our servo pulses. + These should be connected to a decade counter that routes the + pulses to the appropriate servo. + + Initialization involves: + + - Reseting the decade counters + - Writing the first pulse width to the counters + - Setting output compare to set the clock line by calling servo_enable() + - Bringing down the reset lines + + Ideally, you can use two decade counters to drive 20 servos. +*/ +void +servo_init( void ) +{ + uint8_t i; + + /* Configure the reset and clock lines */ + _4017_RESET_DDR |= _BV( _4017_RESET_PIN ); + _4017_CLOCK_DDR |= _BV( _4017_CLOCK_PIN ); + + /* Reset the decade counter */ + sbi( _4017_RESET_PORT, _4017_RESET_PIN ); + + /* Lower the regular servo line */ + cbi( _4017_CLOCK_PORT, _4017_CLOCK_PIN ); + + /* Set all servos at their midpoints */ + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0 ; i < _4017_NB_CHANNELS ; i++ ) + // servo_widths[ i ] = SERVO_MIN; + servo_widths[ i ] = ( SERVO_MIN + SERVO_MAX ) / 2; + + /* Set servos to go off some long time from now */ + SERVO_OCR = 32768ul; + + /* + Configure output compare to toggle the output bits. + */ + TCCR1A |= _BV( SERVO_COM0 ); + + /* Clear the interrupt flags in case they are set */ + TIFR = _BV( SERVO_FLAG ); + + /* Unassert the decade counter reset to start it running */ + cbi( _4017_RESET_PORT, _4017_RESET_PIN ); + + /* Enable our output compare interrupts */ + TIMSK |= _BV( SERVO_ENABLE ); +} + + +/* + Interrupt routine + + write the next pulse width to OCR register and + assert the servo signal. It will be cleared by + the following compare match. +*/ +SIGNAL( SIG_OUTPUT_COMPARE1A ) +{ + static uint8_t servo = 0; + uint16_t width; + + if ( servo >= _4017_NB_CHANNELS ) { + sbi( _4017_RESET_PORT, _4017_RESET_PIN ); + servo = 0; + // FIXME: 500 ns required by 4017 reset ???? why does it work without! + // asm( "nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;" ); + cbi( _4017_RESET_PORT, _4017_RESET_PIN ); + } + + width = servo_widths[ servo ]; + + SERVO_OCR += width; + + TCCR1A |= _BV( SERVO_FORCE ); + + servo++; +} + +void servo_set_one( uint8_t servo, uint16_t value_us ) +{ + servo_widths[ servo ] = ChopServo( CLOCK * value_us ); +} + +void +_Pragma( "entrypoint" ) servo_transmit( void ) +{ + uint8_t servo; + uart_transmit( ( uint8_t )0 ); + uart_transmit( ( uint8_t )0 ); + + _Pragma( "loopbound min 10 max 10" ) + for ( servo = 0; servo < _4017_NB_CHANNELS; servo++ ) { + uart_transmit( ( uint8_t )( servo_widths[ servo ] >> 8 ) ); + uart_transmit( ( uint8_t )( servo_widths[ servo ] & 0xff ) ); + } + uart_transmit( ( uint8_t )'\n' ); +} + + +/* + + defines how servos react to radio control or autopilot channels + +*/ + +void servo_set( const pprz_t values[ ] ) +{ + ServoSet( values ); /*Generated from airframe.xml */ +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.h new file mode 100644 index 0000000..f53dce6 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/servo.h @@ -0,0 +1,61 @@ +/* $Id: servo.h,v 1.1 2011-01-18 12:48:40 moellmer Exp $ + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + (c) 2002 Trammell Hudson + (c) 2003 Pascal Brisset, Antoine Drouin + + This is the new decade counter based servo driving code. It uses + one 16-bit output compare registers to determine when the regular + servo clock line should be toggled, causing the output to move to the + next servo. The other 16-bit output compare is used to drive a + JR or Futaba compatible high-speed digital servo. + + User visibile routines: + + - servo_init(); + + Call once at the start of the program to bring the servos online + and start the external decade counters. This will also start the + high speed servo. + + - servo_make_pulse_width( length ); + + Converts a position value between 0 and 65536 to actual pulsewidth. 0 is + all the way left (1.0 ms pulse) and 65536 is all the way right (2.0 ms + pulse). Use it like this: + + servo_widths[ i ] = servo_make_pulse_width( val ) + + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef SERVO_H +#define SERVO_H + +#include +#include "timer.h" + +extern void servo_init( void ); +extern void servo_set( const pprz_t values[ ] ); +extern void servo_set_one( uint8_t servo, uint16_t value_us ); +extern void servo_transmit( void ); + + +#endif /* SERVO_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.c new file mode 100644 index 0000000..9b29fed --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.c @@ -0,0 +1,115 @@ +/* + $Id: spi.c,v 1.2 2011-01-25 10:05:41 plazar Exp $ + + Paparazzi mcu1 spi functions + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "spi.h" + +#define IT_PORT PORTD +#define IT_DDR DDRD +#define IT_PIN 7 + +#define SPI_DDR DDRB +#define SPI_MOSI_PIN 3 +#define SPI_MISO_PIN 4 +#define SPI_SCK_PIN 5 + +struct inter_mcu_msg from_mega128; +struct inter_mcu_msg to_mega128; +volatile bool_t mega128_receive_valid = FALSE; +volatile bool_t spi_was_interrupted = FALSE; + +static volatile uint8_t idx_buf = 0; +static volatile uint8_t xor_in, xor_out; + +void spi_reset( void ) +{ + idx_buf = 0; + xor_in = 0; + xor_out = ( ( uint8_t * )&to_mega128 )[ idx_buf ]; + SPDR = xor_out; + mega128_receive_valid = FALSE; +} + +void fbw_spi_init( void ) +{ + to_mega128.status = 0; + to_mega128.nb_err = 0; + + /* set it pin output */ + // IT_DDR |= _BV(IT_PIN); + + /* set MISO pin output */ + SPI_DDR |= _BV( SPI_MISO_PIN ); + /* enable SPI, slave, MSB first, sck idle low */ + SPCR = _BV( SPE ); + /* enable interrupt */ + SPCR |= _BV( SPIE ); +} + +SIGNAL( SIG_SPI ) +{ + static uint8_t tmp; + + idx_buf++; + + spi_was_interrupted = TRUE; + + if ( idx_buf > FRAME_LENGTH ) + return; + /* we have sent/received a complete frame */ + if ( idx_buf == FRAME_LENGTH ) { + /* read checksum from receive register */ + tmp = SPDR; + /* notify valid frame */ + if ( tmp == xor_in ) + mega128_receive_valid = TRUE; + else + to_mega128.nb_err++; + return; + } + + /* we are sending/receiving payload */ + if ( idx_buf < FRAME_LENGTH - 1 ) { + /* place new payload byte in send register */ + tmp = ( ( uint8_t * )&to_mega128 )[ idx_buf ]; + SPDR = tmp; + xor_out = xor_out ^ tmp; + } + /* we are done sending the payload */ + else { // idx_buf == FRAME_LENGTH - 1 + /* place checksum in send register */ + SPDR = xor_out; + } + + /* read the byte from receive register */ + tmp = SPDR; + ( ( uint8_t * )&from_mega128 )[ idx_buf - 1 ] = tmp; + xor_in = xor_in ^ tmp; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.h new file mode 100644 index 0000000..376d8e7 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/spi.h @@ -0,0 +1,48 @@ +/* $Id: spi.h,v 1.1 2011-01-18 12:42:42 moellmer Exp $ + + Paparazzi fbw spi functions + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef SPI_H +#define SPI_H + +#include "link_autopilot.h" + + +#define SPI_PORT PORTB +#define SPI_PIN PINB +#define SPI_SS_PIN 2 + +#define SpiIsSelected() (bit_is_clear(SPI_PIN, SPI_SS_PIN)) + +extern struct inter_mcu_msg from_mega128; +extern struct inter_mcu_msg to_mega128; +extern volatile bool_t mega128_receive_valid; +extern volatile bool_t spi_was_interrupted; + + +void spi_init( void ); +void spi_reset( void ); + + +#endif /* SPI_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/timer.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/timer.h new file mode 100644 index 0000000..c7649f7 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/timer.h @@ -0,0 +1,92 @@ +/* $Id: timer.h,v 1.2 2011-01-18 14:55:53 moellmer Exp $ + + Paparazzi fbw timer functions + + Copied from autopilot (autopilot.sf.net) thanx alot Trammell + + Copyright (C) 2002 Trammell Hudson + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef TIMER_H +#define TIMER_H + +#include +#include +#include +#include "link_autopilot.h" + + +/* + Enable Timer1 (16-bit) running at Clk/1 for the global system + clock. This will be used for computing the servo pulse widths, + PPM decoding, etc. + + Low frequency periodic tasks will be signaled by timer 2 + running at Clk/1024. For 16 Mhz clock, this will be every + 16384 microseconds, or 61 Hz. +*/ +static inline void +timer_init( void ) +{ + /* Timer1 @ Clk/1: System clock, ppm and servos pulses */ + TCCR1A = 0x00; + TCCR1B = 0x01; + + /* Timer2 @ Clk/1024: Periodic clock */ + TCCR2 = 0x07; +} + + +/* + Retrieve the current time from the global clock in Timer1, + disabling interrupts to avoid stomping on the TEMP register. + If interrupts are already off, the non_atomic form can be used. +*/ +static inline uint16_t +timer_now( void ) +{ + return TCNT1; +} + +static inline uint16_t +timer_now_non_atomic( void ) +{ + return TCNT1L; +} + + +/* + Periodic tasks occur when Timer2 overflows. Check and unset + the overflow bit. We cycle through four possible periodic states, + so each state occurs every 60 Hz. +*/ +static inline bool_t +timer_periodic( void ) +{ + if ( !bit_is_set( TIFR, TOV2 ) ) + return FALSE; + + TIFR = 1 << TOV2; + return TRUE; +} + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.c b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.c new file mode 100644 index 0000000..82f80fc --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.c @@ -0,0 +1,133 @@ +/* + Paparazzi $Id: uart.c,v 1.4 2011-01-25 10:17:46 plazar Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 "std.h" +#include "uart.h" + +#define TX_BUF_SIZE 256 +static uint8_t tx_head; /* next free in buf */ +static volatile uint8_t tx_tail; /* next char to send */ +static uint8_t tx_buf[ TX_BUF_SIZE ]; + +/* + UART Baud rate generation settings: + + With 16.0 MHz clock,UBRR=25 => 38400 baud + +*/ +void uart_init_tx( void ) +{ + #ifndef WCET_ANALYSIS + /* Baudrate is 38.4k */ + UBRRH = 0; + UBRRL = 25; + /* single speed */ + UCSRA = 0; + /* Enable transmitter */ + UCSRB = _BV( TXEN ); + /* Set frame format: 8data, 1stop bit */ + UCSRC = _BV( URSEL ) | _BV( UCSZ1 ) | _BV( UCSZ0 ); + #endif +} + +void uart_init_rx() +{ + #ifndef WCET_ANALYSIS + /* Enable receiver */ + UCSRB |= _BV( RXEN ); + /* Enable uart receive interrupt */ + sbi( UCSRB, RXCIE ); + #endif +} + +void uart_transmit( unsigned char data ) +{ + #ifndef WCET_ANALYSIS + if ( UCSRB & _BV( TXCIE ) ) { + /* we are waiting for the last char to be sent : buffering */ + if ( tx_tail == tx_head + 1 ) { /* BUF_SIZE = 256 */ + /* Buffer is full (almost, but tx_head = tx_tail means "empty" */ + return; + } + tx_buf[ tx_head ] = data; + tx_head++; /* BUF_SIZE = 256 */ + } else { /* Channel is free: just send */ + UDR = data; + sbi( UCSRB, TXCIE ); + } + #endif +} + +void uart_print_hex ( uint8_t c ) +{ + #ifndef WCET_ANALYSIS + const uint8_t hex[ 16 ] = { '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + uint8_t high = ( c & 0xF0 ) >> 4; + uint8_t low = c & 0x0F; + uart_transmit( hex[ high ] ); + uart_transmit( hex[ low ] ); + #endif +} + +void uart_print_hex16 ( uint16_t c ) +{ + #ifndef WCET_ANALYSIS + uint8_t high = ( uint8_t )( c >> 8 ); + uint8_t low = ( uint8_t )( c ); + uart_print_hex( high ); + uart_print_hex( low ); + #endif +} + +void uart_print_string( const uint8_t *s ) +{ + #ifndef WCET_ANALYSIS + uint8_t i = 0; + _Pragma( "loopbound min 100 max 100" ) + while ( s[ i ] ) { + uart_transmit( s[ i ] ); + i++; + } + #endif +} + +SIGNAL( SIG_UART_TRANS ) +{ + #ifndef WCET_ANALYSIS + if ( tx_head == tx_tail ) { + /* Nothing more to send */ + cbi( UCSRB, TXCIE ); /* disable interrupt */ + } else { + UDR = tx_buf[ tx_tail ]; + tx_tail++; /* warning tx_buf_len is 256 */ + } + #endif +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.h b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.h new file mode 100644 index 0000000..3aeb9f7 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/airborne/fly_by_wire/uart.h @@ -0,0 +1,39 @@ +/* + Paparazzi $Id: uart.h,v 1.1 2011-01-18 12:42:42 moellmer Exp $ + + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef _UART_H_ +#define _UART_H_ + +#include + +void uart_init_tx( void ); +void uart_init_rx( void ); +void uart_transmit( unsigned char data ); + +void uart_print_hex ( uint8_t c ); +void uart_print_hex16 ( uint16_t c ); +void uart_print_string( const uint8_t *s ); +void uart_print_float( const float *f ); + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/downlink.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/downlink.h new file mode 100644 index 0000000..7f0064a --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/downlink.h @@ -0,0 +1,49 @@ +/* + downlink.h + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + decodes downlink protocol +*/ + +#ifndef DOWNLINK_H +#define DOWNLINK_H + +#include +#include "protocol.h" +#include "transport.h" +#include "geometry.h" + +#define DL_STX 0x05 +#define DL_ETX 0x06 +#define DL_HEAD_LEN 1 +#define DL_PAYLOAD_OFFSET 1 +#define DL_TAIL_LEN 2 + + +struct Transport *downlink_new( struct PprzProtocol *protocol, + void( *err_callback )( gpointer callback_data, GError *error ), + void( *msg_callback )( gpointer callback_data, struct TransportMsg *msg ), + gpointer callback_data ); + + + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/geometry.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/geometry.h new file mode 100644 index 0000000..20c8d50 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/geometry.h @@ -0,0 +1,185 @@ +/* + geometry.h + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + geometry :) originated from Pascal Brisset pascal(dot)brisset(at)free(dot)fr + ocaml code. +*/ + +#ifndef GEOMETRY_H +#define GEOMETRY_H + +#include +#include "angles.h" +/* + please use + x, y, z, h in meters + lat, lon in radians +*/ +struct double_c2d { + double x, y; +}; + +struct double_p2d { + double r, teta; +}; + +struct double_e2d { + double lat, lon; +}; + +struct double_c3d { + double x, y, z; +}; + +struct double_e3d { + double lat, lon, h; +}; + + + +struct double_c2d vector_c2d( const struct double_c2d a, + const struct double_c2d b ); +struct double_c2d unit_vector_c2d( const struct double_c2d a, + const struct double_c2d b ); +struct double_c2d normal_vector_c2d( const struct double_c2d u ); + +double vect_prod_c2d( const struct double_c2d a, const struct double_c2d b ); +double scal_prod_c2d( const struct double_c2d a, const struct double_c2d b ); +double module_c2d( const struct double_c2d a ); +double norme2_c2d( const struct double_c2d a ); +double distance_c2d( const struct double_c2d a, const struct double_c2d b ); +void rotate_c2d( struct double_c2d *a, double alpha ); +void translate_c2d( struct double_c2d *a, const struct double_c2d v ); +void add_c2d_s( struct double_c2d *a, const struct double_c2d b ); +struct double_c2d add_c2d( struct double_c2d a, struct double_c2d b ); +void minus_c2d_s( struct double_c2d *a, const struct double_c2d v ); +struct double_c2d minus_c2d( struct double_c2d a, const struct double_c2d v ); +void normalise_c2d_s( struct double_c2d *a ); +struct double_c2d normalise_c2d( struct double_c2d a ); +void scale_c2d_s( struct double_c2d *v, double factor ); +struct double_c2d scale_c2d( struct double_c2d v, double factor ); +double angle_c2d( struct double_c2d u, struct double_c2d v ); + +struct double_p2d p2d_of_c2d( const struct double_c2d c ); +struct double_c2d c2d_of_p2d( const struct double_p2d p ); +struct double_c2d c2d_of_polar( double r, double teta ); +struct double_p2d add_p2d( const struct double_p2d p1, + const struct double_p2d p2 ); +struct double_p2d minus_p2d( const struct double_p2d p1, + const struct double_p2d p2 ); + +void translate_c3d( struct double_c3d *a, const struct double_c3d v ); +void scale_c3d( struct double_c3d *v, double factor ); + +struct double_c2d lin_interp_c2d( struct double_c2d a, double ta, + struct double_c2d b, double tb, double t ); + + +/* rad is an angle in EAST NORTH frame, + returns the wind direction in degrees +*/ +double wind_dir_from_angle_rad( double rad ); + +/* converts between angle in EAST NORTH frame + and headings (0->N 90->E) */ +double heading_of_to_angle_deg( double angle ); +double heading_of_to_angle_rad( double angle ); + +/* + compute bank angle +*/ +double compute_phi( struct double_c2d curspeed, struct double_c2d last_speed, + double delta_t ); + +#define SEC_OF_TIMEVAL(tv) (tv.tv_sec + 1e-6 * tv.tv_usec) +#define DELAY_SEC_OF_TIMEVAL(tv1, tv2) (SEC_OF_TIMEVAL(tv1) - SEC_OF_TIMEVAL(tv2)) + +double mpi_pi( double val ); + +struct ellipsoid { + double dx, dy, dz; + double a; + double df; + double e; +}; + +enum type_ellipsoid { + NTF, + WGS84, + ED50, + NAD27, + ELLIPSOID_NB +}; + +extern const struct ellipsoid ellipsoids[ ELLIPSOID_NB ]; + +struct lambert { + const struct ellipsoid *ellipsoid; + double phi0; /* radians */ + double lphi0; + double r0; + double lambda0; + long x0; + long y0; + long ys; + long k0; /* scale factor */ +}; + + +enum type_lambert { + LAMBERTI, + LAMBERTII, + LAMBERTIIE, + LAMBERTIII, + LAMBERTIV, + LAMBERT_NB +}; + +extern const struct lambert lamberts[ LAMBERT_NB ]; + + +#define DECIMAL(D,M,S) (D + M / 60. + S / 3600.) +#define RAD_OF_DEG(D) (D*M_PI/180.) +#define DEG_OF_RAD(R) (R/M_PI*180.) +#define LATITUDE_ISOMETRIQUE(PHI,E) (log(tan(M_PI_4 + PHI/2.0)) - E/2.0 * log((1.0+E*sin(PHI)) / (1.0-E*sin(PHI)))) +#define E_SQUARE(D) (2.0*D - D * D) +#define E_PRIME_SQUARE(D) (1.0 / (1.0 - D) / (1.0 - D) - 1.0) + + + + +/* projections */ +void lambert_of_e2d ( const enum type_lambert lmb, + const enum type_ellipsoid elps, + struct double_e2d world_pos, struct double_c2d *lmb_pos ); +void e2d_of_lambert ( const enum type_lambert lmb, + const enum type_ellipsoid elps, + struct double_c2d c_pos, struct double_e2d *e_pos ); +/* coordinates */ +void e3d_of_c3d( const enum type_ellipsoid elps, struct double_c3d c_pos, + struct double_e3d *e_pos ); +void e2d_of_e2d( const enum type_ellipsoid dest, const enum type_ellipsoid src, + struct double_e2d *e2d_pos ); + + +#endif /* GEOMETRY_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/glade_support.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/glade_support.h new file mode 100644 index 0000000..544a385 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/glade_support.h @@ -0,0 +1,66 @@ +/* + glade_support.h + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + + glade hack. + +*/ + +#ifndef GLADE_SUPPORT_H +#define GLADE_SUPPORT_H + +#define DEFAULT_LEN 256 + +#define UPDATE_LABEL(object, label_name, fmt, args...) \ +{ \ + GtkLabel* label = GTK_LABEL(gtk_object_get_data(GTK_OBJECT(object), label_name)); \ + GString* str = g_string_sized_new(DEFAULT_LEN); \ + if (label) { \ + g_string_printf(str, fmt, ##args); \ + gtk_label_set_text(label, str->str); \ + } \ + else \ + g_message("##### unknown label [ %s ]", label_name); \ + g_string_free(str, TRUE); \ +} \ + +#define UPDATE_LABEL_COLOR(object, label_name, test, fmt, args...) \ +{ \ + GtkStateType state; \ + GtkLabel* label = GTK_LABEL(gtk_object_get_data(GTK_OBJECT(object), label_name)); \ + GString* str = g_string_sized_new(DEFAULT_LEN); \ + if (label) { \ + g_string_printf(str, fmt, ##args); \ + gtk_label_set_text(label, str->str); \ + } \ + else \ + g_message("##### unknown label [ %s ]", label_name); \ + g_string_free(str, TRUE); \ + for (state = GTK_STATE_NORMAL; state <= GTK_STATE_INSENSITIVE; state++) \ + gtk_widget_modify_fg(GTK_WIDGET(label), state, (test)?&my_red_color:>k_widget_get_default_style()->fg[ state ]); \ +} \ + + + + +#endif /* GLADE_SUPPORT_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/logger.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/logger.h new file mode 100644 index 0000000..cd93331 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/logger.h @@ -0,0 +1,51 @@ +/* + logger.h + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + write and read logs for the paparazzi +*/ + + +#ifndef LOGGER_H +#define LOGGER_H + +#include +#include + +#include "downlink.h" +#include "protocol.h" + +struct Logger { + GIOChannel *channel; +}; + + +struct Logger *logger_new( const gchar *out_file, xmlDocPtr doc ); +void logger_log( struct Logger *this, struct PprzMsg *msg ); +void logger_free( struct Logger *this ); + +GList *logger_parse_log( const gchar *filename, + struct PprzProtocol **protocol ); + + + +#endif diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/network.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/network.h new file mode 100644 index 0000000..3c4d27c --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/network.h @@ -0,0 +1,70 @@ +/* + $id:$ + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + network functions +*/ + +#ifndef NETWORK_H +#define NETWORK_H + +#include +#include +#include + +#include "protocol.h" + +struct NetworkClient { + int socket; + struct sockaddr_in bcast_addr; + struct sockaddr_in server_addr; + GFunc rcv_callback; + GFunc err_callback; + gpointer user_data; + struct PprzProtocol *protocol; +}; + +struct NetworkServer { + int bcast_socket; + struct sockaddr_in bcast_addr; + int listening_socket; + GFunc rcv_callback; + GFunc err_callback; + gpointer user_data; + struct PprzProtocol *protocol; +}; + + +struct NetworkServer *network_server_new( struct PprzProtocol *protocol, + const char *bcast_addr, const int bcast_port, + GFunc rcv_callback, GFunc err_callback, gpointer user_data ); +void network_server_dispatch( struct NetworkServer *this, struct PprzMsg *msg ); + + +struct NetworkClient *network_client_new( struct PprzProtocol *protocol, + const char *bcast_addr, const int bcast_port, + GFunc rcv_callback, GFunc err_callback, gpointer user_data ); +void network_client_send_to_server( struct NetworkClient *this, + struct PprzMsg *msg ); + + +#endif /* NETWORK_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/protocol.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/protocol.h new file mode 100644 index 0000000..c1fd323 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/protocol.h @@ -0,0 +1,120 @@ +/* + $Id: protocol.h,v 1.1 2011-01-18 12:48:44 moellmer Exp $ + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef PROTOCOL_H +#define PROTOCOL_H + +#include +#include +#include + +enum PprzFieldType { + TYP_UINT_8, + TYP_UINT_16, + TYP_UINT_32, + TYP_INT_8, + TYP_INT_16, + TYP_INT_32, + TYP_FLOAT, + TYP_ARRAY_UINT_8, + TYP_NB +}; + +struct PprzFieldClass { + gchar *name; + enum PprzFieldType type; + guint offset; + gchar *format; + gchar *unit; + gchar *description; +}; + +struct PprzMsgClass { + guint id; + gchar *name; + GList *fields_classes; + GHashTable *fields_classes_by_name; + struct PprzFieldClass **fields_classes_by_id; + guint nb_fields_classes; + guint size; /* size in byte off all fields + 1 for id */ +}; + +struct PprzMsg { + GTimeVal date; + struct PprzMsgClass *class; + guchar *bytes; +}; + +struct PprzProtocol { + GList *msgs_classes; + GHashTable *msgs_classes_by_name; + struct PprzMsgClass **msgs_classes_by_id; + guint nb_msgs_classes; +}; + +struct PprzProtocol *pprz_protocol_new_from_xml( xmlDocPtr doc, + xmlNodePtr cur ); +void pprz_protocol_free( struct PprzProtocol *this ); + +struct PprzMsg *pprz_msg_new( struct PprzMsgClass *msg_class, GTimeVal date ); +struct PprzMsg *pprz_protocol_msg_new_by_id( struct PprzProtocol *this, + guchar id, GTimeVal date ); +struct PprzMsg *pprz_protocol_msg_new_by_name( struct PprzProtocol *this, + const gchar *name, GTimeVal date ); +struct PprzMsg *pprz_protocol_msg_new_of_bin( struct PprzProtocol *this, + const guchar *buf, GTimeVal date ); +struct PprzMsg *pprz_protocol_msg_new_of_ascii( struct PprzProtocol *this, + const gchar *line ); +void pprz_msg_free( struct PprzMsg *msg ); + +void pprz_protocol_ascii_of_msg( struct PprzMsg *msg, GString **buf ); + +const gchar *pprz_protocol_str_of_field_type( enum PprzFieldType type ); +const guint pprz_protocol_size_of_field_type( enum PprzFieldType type ); + +const struct PprzMsgClass *protocol_msg_class_of_id( struct PprzProtocol *this, + guint id ); + +void pprz_msg_ascii_of_field( struct PprzMsg *msg, + struct PprzFieldClass *field_class, GString *buf ); + +gpointer pprz_msg_get_field( struct PprzMsg *msg, + struct PprzFieldClass *field_class ); +gpointer pprz_msg_get_field_by_name( struct PprzMsg *msg, const gchar *name ); +gpointer pprz_msg_get_field_by_place( struct PprzMsg *msg, guint place ); + +gboolean pprz_msg_set_field( struct PprzMsg *msg, + struct PprzFieldClass *field_class, gconstpointer value ); +gboolean pprz_msg_set_field_by_name( struct PprzMsg *msg, const gchar *name, + gconstpointer value ); +gboolean pprz_msg_set_field_by_id( struct PprzMsg *msg, guint id, + gconstpointer value ); + +gboolean pprz_msg_set_field_ascii( struct PprzMsg *msg, + struct PprzFieldClass *field_class, const gchar *str_val ); +gboolean pprz_msg_set_field_ascii_by_name( struct PprzMsg *msg, + const gchar *name, const gchar *str_val ); +gboolean pprz_msg_set_field_ascii_by_id( struct PprzMsg *msg, guint id, + const gchar *str_val ); + + +#endif /* PROTOCOL_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/traces.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/traces.h new file mode 100644 index 0000000..4d59e2a --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/traces.h @@ -0,0 +1,60 @@ +/* + traces.h + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef TRACES_H +#define TRACES_H + +#define TRACE_ON +#define TIME_STAMP_TRACE + +#ifdef TRACE_ON +#include + +#define TRACE_ERROR 0x00000001L +#define TRACE_DATA_READ 0x00000002L +#define TRACE_MSG_RAW 0x00000004L +#define TRACE_MSG 0x00000008L +#define TRACE_CHECKSUM 0x00000010L +#define TRACE_DOWNLINK 0x00000020L +#define TRACE_MODEM 0x00000040L +#define TRACE_MODEM_VERB 0x00000080L +#define TRACE_MODEM_READ 0x00000100L +#define TRACE_PARSER 0x00000200L +#define TRACE_TRANSPORT 0x00000400L +#define TRACE_TRANSPORT_VERB 0x00000800L + +extern unsigned long TraceLevel; + +#define TRACE(type,fmt,args...) \ +{ \ + if (TraceLevel&type) { \ + fprintf(stderr, "[ "#type" ] " fmt, ##args); \ + } \ +} +const char *print_hex( const unsigned char *buf, unsigned int len ); + +#else +#define TRACE(type,fmt,args...) +#endif /* TRACE_ON */ + +#endif /* TRACES_H */ + diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/c/transport.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/transport.h new file mode 100644 index 0000000..47edbbf --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/c/transport.h @@ -0,0 +1,75 @@ +#ifndef TRANSPORT_H +#define TRANSPORT_H + +#include + +#include + + +#define TRANSPORT_BUF_LEN 1024 +#define TRANSPORT_HEAD_LEN 1 +#define TRANSPORT_PAYLOAD_OFFSET TRANSPORT_HEAD_LEN +#define TRANSPORT_TAIL_LEN 2 + +enum TransportError { + TRANSPORT_NO_ERROR, + TRANSPORT_CHECKSUM_ERROR, + TRANSPORT_NO_ETX, + TRANSPORT_INVALID_MSG_ID, + TRANSPORT_INVALID_MSG_LEN, + TRANSPORT_BUF_OVFW, + TRANSPORT_ERROR_NB +}; + +struct TransportMsg { + GTimeVal date; + guint len; + guchar *data; +}; + +struct TransportStatus { + guint32 run_time; + guint32 nb_byte; + guint32 nb_msg; + guint32 nb_err; + gfloat byte_rate; + gfloat msg_rate; +}; + +struct Transport { + void( *err_callback )( gpointer callback_data, GError *error ); + void( *msg_callback )( gpointer callback_data, struct TransportMsg *msg ); + gpointer callback_data; + GQuark quark; + gchar stx; + gchar etx; + gboolean fixed_size; + gboolean two_bytes_checksum; + guint nb_msg_type; + guint *size_msg; + guint max_msg_size; + struct TransportStatus status; + gulong nb_msg_last_status; + gulong nb_byte_last_status; + guchar buf[ TRANSPORT_BUF_LEN ]; + guint buf_len; + GTimeVal start_date, last_status_date; + +}; + +struct Transport *transport_new( gboolean fixed_size, + gboolean two_bytes_checksum, guint nb_msg, guint *size_msg, guint max_msg_size, + guchar stx, guchar etx, + void( *err_callback )( gpointer callback_data, GError *error ), + void( *msg_callback )( gpointer callback_data, struct TransportMsg *msg ), + gpointer callback_data ); + +struct TransportStatus *transport_get_status( struct Transport *this ); + +void transport_feed_data( struct Transport *this, const guchar *buf, + guint len ); + +void transport_free( struct Transport *this ); + + +#endif /* TRANSPORT_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/inttypes.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/inttypes.h new file mode 100644 index 0000000..1e87718 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/inttypes.h @@ -0,0 +1,12 @@ +#ifndef INTTYPES_H_ +#define INTTYPES_H_ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed long int32_t; +typedef unsigned long uint32_t; + +#endif // INTTYPES_H_ + diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/math.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/math.h new file mode 100644 index 0000000..398713e --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/math.h @@ -0,0 +1,21 @@ +#ifndef MATH_H_ +#define MATH_H_ + +#define M_PI 3.141592653589793238462643 +#define HALFPI 1.57079632679489661923 +#define sin(x) (pp_sin(x)) +#define atan2(x,y) (pp_atan2(x,y)) +#define sqrt(x) (pp_sqrt(x)) +#define cos(x) (pp_sin(x+HALFPI)) /*cosinus [ radians ]*/ +#define fabs(x) (pp_fabs(x)) +#define pp_fabs(x) ((x)< 0. ? -(x) : (x)) /*floating absolute value*/ +#define Max(x,y) (pp_Max(x,y)) +#define pp_Max(x,y) ((x) >= (y) ? (x) : (y)) +#define Min(x,y) (pp_Min(x,y)) +#define pp_Min(x,y) ((x) <= (y) ? (x) : (y)) + +extern double pp_sin( double x ); +extern double pp_sqrt( double x ); +extern double pp_atan2( double x, double y ); + +#endif /*MATH_H_*/ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/include/std.h b/targets/wasm-tacle/parallel/PapaBench/sw/include/std.h new file mode 100644 index 0000000..21a62c0 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/include/std.h @@ -0,0 +1,22 @@ +#ifndef STD_H +#define STD_H + +#include + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +typedef uint8_t bool_t; // Boolean values + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +#endif /* STD_H */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/downlink.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/downlink.c new file mode 100644 index 0000000..428bbe3 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/downlink.c @@ -0,0 +1,65 @@ +/* + downlink.c + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + + +#include + +#include "downlink.h" + +#define GDOUBLE_FROM_DIF_TV(a,b) ((gdouble)(a.tv_sec-b.tv_sec) + 1e-6 * (gdouble)(a.tv_usec-b.tv_usec)) + + +#define READ_GFLOAT_FROM_BUF(dest, buf) dest = *((gfloat*)(buf)); buf += 4; +#define READ_GUINT32_FROM_BUF(dest, buf) dest = GUINT32_FROM_LE(*((guint32*)(buf))); buf += 4; +#define READ_GUINT16_FROM_BUF(dest, buf) dest = GUINT16_FROM_LE(*((guint16*)(buf))); buf += 2; +#define READ_GINT32_FROM_BUF(dest, buf) dest = GINT32_FROM_LE(*((gint32*)(buf))); buf += 4; +#define READ_GINT16_FROM_BUF(dest, buf) dest = GINT16_FROM_LE(*((gint16*)(buf))); buf += 2; +#define READ_GUINT8_FROM_BUF(dest, buf) dest = (guint8)(*(buf++)); + +struct Transport *downlink_new( struct PprzProtocol *protocol, + void( *err_callback )( gpointer callback_data, GError *error ), + void( *msg_callback )( gpointer callback_data, struct TransportMsg *msg ), + gpointer callback_data ) +{ + struct Transport *transport; + guint *fixed_payload_len = g_new( guint, + g_list_length( protocol->msgs_classes ) ); + guint i = 0; + GList *msgs_classes = protocol->msgs_classes; + while ( msgs_classes ) { + fixed_payload_len[ i ] = ( ( struct PprzMsgClass * )msgs_classes->data )->size; + // printf("fixed_payload_len : %d %d\n", i, fixed_payload_len[ i ]); + i++; + msgs_classes = msgs_classes->next; + } + + transport = transport_new( TRUE, /* fixed_size */ + TRUE, /* two bytes checksum */ + i, /* nb_msg */ + fixed_payload_len, /* size_msg */ + 100, /* max_msg_size */ + DL_STX, DL_ETX, /* STX, ETX */ + err_callback, /* err callback */ + msg_callback, /* msg callback */ + callback_data ); /* callback data */ + return transport; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/geometry.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/geometry.c new file mode 100644 index 0000000..e1c656f --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/geometry.c @@ -0,0 +1,451 @@ +/* + geometry.c + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "geometry.h" + +//#include +#include "math_papabench.h" + +const struct ellipsoid ellipsoids[ ELLIPSOID_NB ] = { + {-168., -60., 320., 6378249.2, 0.0034075495234250643, 0.08248325676}, /* NTF */ + { 0., 0., 0., 6378137.0, 0.0033528106647474805, 0.08181919106}, /* WGS84 */ + {-87.0, -98., -121.0, 6378388.0, 0.003367003367003367, 0.08199188998}, /* ED50 */ + { 0.0, 125.0, 194.0, 6378067.6, 0.0033155460257, 0.08181919106} /* NAD27 */ +}; +/* From http://www.tandt.be/wis/WiS/eqntf.html and http://www.ign.fr/MP/GEOD/geodesie/coordonnees.html */ +const struct lambert lamberts[ LAMBERT_NB ] = { + { /* LAMBERTI */ + &ellipsoids[ NTF ], + RAD_OF_DEG( DECIMAL( 49., 30., 0. ) ), /* phi0 */ + 0.991996665, /* lphi0 */ + 5457616.674, /* r0 */ + RAD_OF_DEG( DECIMAL( 2., 20., 14.025 ) ), /* lambda0 */ + 600000, /* x0 */ + 200000, /* y0 */ + 5657617, /* ys */ + 0.99987734 /* k0 */ + }, + { /* LAMBERTII */ + &ellipsoids[ NTF ], + RAD_OF_DEG( DECIMAL( 46., 48., 0. ) ), /* phi0 */ + 0.921557361, /* lphi0 */ + 5999695.77, /* r0 */ + RAD_OF_DEG( DECIMAL( 2., 20., 14.025 ) ), /* lambda0 */ + 600000, /* x0 */ + 2200000, /* y0 */ + 6199696, /* ys */ + 0.99987742 /* k0 */ + }, + { /* LAMBERTIIE */ + &ellipsoids[ NTF ], + RAD_OF_DEG( DECIMAL( 46., 48., 0. ) ), /* phi0 */ + 0.921557361, /* lphi0 */ + 5999695.77, /* r0 */ + RAD_OF_DEG( DECIMAL( 2., 20., 14.025 ) ), /* lambda0 */ + 600000, /* x0 */ + 2200000, /* y0 */ + 8199696, /* ys */ + 0.99987742 /* k0 */ + }, + { /* LAMBERTIII */ + &ellipsoids[ NTF ], + RAD_OF_DEG( DECIMAL( 44., 6., 0. ) ), /* phi0 */ + 0.921557361, /* lphi0 */ + 6591905.08, /* r0 */ + RAD_OF_DEG( DECIMAL( 2., 20., 14.025 ) ), /* lambda0 */ + 600000, /* x0 */ + 3200000, /* y0 */ + 6791905, /* ys */ + 0.99987750 /* k0 */ + }, + { /* LAMBERTIV */ + &ellipsoids[ NTF ], + RAD_OF_DEG( DECIMAL( 42., 9., 54. ) ), /* phi0 */ + 0.921557361, /* lphi0 */ + 7053300.18, /* r0 */ + RAD_OF_DEG( DECIMAL( 2., 20., 14.025 ) ), /* lambda0 */ + 234, /* x0 */ /* FIXME mmmmmmm suspicious */ + 4185861, /* y0 */ + 7239162, /* ys */ + 0.99994471 /* k0 */ + }, +}; + +double distance_c2d( const struct double_c2d a, const struct double_c2d b ) +{ + return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); +} + +struct double_c2d vector_c2d( const struct double_c2d a, + const struct double_c2d b ) +{ + struct double_c2d v; + v.x = b.x - a.x; + v.y = b.y - a.y; + return v; +} + +struct double_c2d unit_vector_c2d( const struct double_c2d a, + const struct double_c2d b ) +{ + struct double_c2d v = vector_c2d( a, b ); + scale_c2d_s( &v, 1 / module_c2d( v ) ); + return v; +} + +struct double_c2d normal_vector_c2d( const struct double_c2d u ) +{ + struct double_c2d v; + v.x = -u.y; + v.y = u.x; + return v; +} + +double vect_prod_c2d( const struct double_c2d a, const struct double_c2d b ) +{ + return a.x * b.y - a.y * b.x; +} + +double scal_prod_c2d( const struct double_c2d a, const struct double_c2d b ) +{ + return a.x * b.x + a.y * b.y; +} + +void rotate_c2d( struct double_c2d *a, double alpha ) +{ + double tmp; + tmp = a->x * cos( alpha ) - a->y * sin( alpha ); + a->y = a->x * sin( alpha ) + a->y * cos( alpha ); + a->x = tmp; +} + +double norme2_c2d( const struct double_c2d a ) +{ + return a.x * a.x + a.y * a.y; +} + +double module_c2d( const struct double_c2d a ) +{ + return sqrt( norme2_c2d( a ) ); +} + +void translate_c2d( struct double_c2d *a, const struct double_c2d v ) +{ + add_c2d_s( a, v ); +} + +void add_c2d_s( struct double_c2d *a, const struct double_c2d b ) +{ + a->x = a->x + b.x; + a->y = a->y + b.y; +} + +struct double_c2d add_c2d( struct double_c2d a, const struct double_c2d b ) +{ + add_c2d_s( &a, b ); + return a; +} + +void normalise_c2d_s( struct double_c2d *a ) +{ + scale_c2d_s( a, 1 / module_c2d( *a ) ); +} + +struct double_c2d normalise_c2d( struct double_c2d a ) +{ + normalise_c2d_s( &a ); + return a; +} + +void minus_c2d_s( struct double_c2d *a, const struct double_c2d b ) +{ + a->x = a->x - b.x; + a->y = a->y - b.y; +} + +struct double_c2d minus_c2d( struct double_c2d a, const struct double_c2d b ) +{ + minus_c2d_s( &a, b ); + return a; +} + +void scale_c2d_s( struct double_c2d *v, double factor ) +{ + v->x = v->x * factor; + v->y = v->y * factor; +} + +struct double_c2d scale_c2d( struct double_c2d v, double factor ) +{ + scale_c2d_s( &v, factor ); + return v; +} + + + +#define MPI_PI(val)\ +{\ + while (val> M_PI) val -= 2. * M_PI;\ + while (val<-M_PI) val += 2. * M_PI;\ +} + +double mpi_pi( double val ) +{ + MPI_PI( val ); + return val; +}; + +struct double_c2d lin_interp_c2d( struct double_c2d a, double ta, + struct double_c2d b, double tb, double t ) +{ + double delta_t = tb - ta; + struct double_c2d res; + res.x = a.x + ( t - ta ) / delta_t *( b.x - a.x ); + res.y = a.y + ( t - ta ) / delta_t *( b.y - a.y ); + return res; +} + +double wind_dir_from_angle_deg( double deg ) +{ + double w = 180. + 90. - deg; + while ( w > 360 ) w -= 360; + return w; +} + +double wind_dir_from_angle_rad( double rad ) +{ + double w = M_PI + M_PI_2 - rad; + while ( w > 2 * M_PI ) w -= ( 2 * M_PI ); + return w; +} + +double heading_of_to_angle_deg( double angle ) +{ + double a = 90. - angle + 360.; + while ( a >= 180. ) a -= 360.; + return a; +} + +double heading_of_to_angle_rad( double angle ) +{ + double two_pi = 2 * M_PI; + double a = M_PI_2 - angle + two_pi; + while ( a >= two_pi ) a -= two_pi; + return a; +} + + + +#define G 9.81 +#define ACCEL_DOWN 0 +double compute_phi( struct double_c2d curspeed, struct double_c2d last_speed, + double delta_t ) +{ + double accel_norm, accel_tgt, phi; + struct double_c2d accel = minus_c2d( curspeed, last_speed ); + // printf("%lf %lf %lf %lf %lf\n", curspeed.x, curspeed.y, last_speed.x, last_speed.y, delta_t); + scale_c2d_s( &accel, 1 / delta_t ); + accel_norm = vect_prod_c2d( accel, curspeed ) / module_c2d( curspeed ); + accel_tgt = scal_prod_c2d( accel, curspeed ) / module_c2d( curspeed ); + phi = -atan2( accel_norm, G - ACCEL_DOWN ); + return phi; +} + +double angle_c2d( struct double_c2d u, struct double_c2d v ) +{ + double alpha1 = atan2( u.y, u.x ); + double alpha2 = atan2( v.y, v.x ); + double alpha = alpha2 - alpha1; + MPI_PI( alpha ); + return alpha; +} + +struct double_p2d p2d_of_c2d( const struct double_c2d c ) +{ + struct double_p2d p; + p.r = module_c2d( c ); + p.teta = atan2( c.y, c.x ); + return p; +} + +struct double_c2d c2d_of_p2d( const struct double_p2d p ) +{ + struct double_c2d c; + c.x = p.r * cos( p.teta ); + c.y = p.r * sin( p.teta ); + return c; +} + +struct double_p2d add_p2d( const struct double_p2d p1, + const struct double_p2d p2 ) +{ + /* p.r = sqrt(p1.r*p1.r + p2.r*p2.r + 2 * p1.r * p2.r * cos ( p1.teta - p2.teta )); */ + /* p.teta = 0; */ + struct double_c2d c1 = c2d_of_p2d( p1 ); + struct double_c2d c2 = c2d_of_p2d( p2 ); + struct double_c2d c3 = add_c2d( c1, c2 ); + struct double_p2d p = p2d_of_c2d( c3 ); + return p; +} + + +struct double_p2d minus_p2d( const struct double_p2d p1, + const struct double_p2d p2 ) +{ + struct double_c2d c1 = c2d_of_p2d( p1 ); + struct double_c2d c2 = c2d_of_p2d( p2 ); + struct double_c2d c3 = minus_c2d( c1, c2 ); + struct double_p2d p = p2d_of_c2d( c3 ); + return p; +} + + +struct double_c2d c2d_of_polar( double r, double teta ) +{ + struct double_c2d res = {r * cos( teta ), r * sin( teta )}; + return res; +} + +void translate_c3d( struct double_c3d *a, const struct double_c3d v ) +{ + a->x = a->x + v.x; + a->y = a->y + v.y; + a->z = a->z + v.z; +} + +void scale_c3d( struct double_c3d *v, double factor ) +{ + v->x = v->x * factor; + v->y = v->y * factor; + v->z = v->z * factor; +} + +static double inverse_latitude_isometrique( double lat, double e, + double epsilon ) +{ + double exp_l = exp( lat ); + double phi0 = 2. * atan( exp_l - M_PI_2 ); + double loop( double phi ) { + double sin_phi = e * sin( phi ); + double new_phi = 2. * atan ( pow( ( 1. + sin_phi ) / ( 1. - sin_phi ), + e / 2 ) * exp_l ) - M_PI_2; + if ( fabs( phi - new_phi ) < epsilon ) return new_phi; + return loop( new_phi ); + } + return loop( phi0 ); +} + +static double lambert_n ( const enum type_lambert lmb ) +{ + return sin( lamberts[ lmb ].phi0 ); +} +static double lambert_c ( const enum type_lambert lmb ) +{ + return lamberts[ lmb ].r0 * exp( lamberts[ lmb ].phi0 * lambert_n( lmb ) ); +} + +void lambert_of_e2d ( const enum type_lambert lmb, + const enum type_ellipsoid elps, + struct double_e2d e2d_pos, struct double_c2d *lmb_pos ) +{ + double n, ll, r, gamma; + e2d_of_e2d( NTF, elps, &e2d_pos ); + n = lambert_n( lmb ); + ll = LATITUDE_ISOMETRIQUE( e2d_pos.lat, lamberts[ lmb ].ellipsoid->e ); + r = lamberts[ lmb ].r0 * exp( lamberts[ lmb ].lphi0 * sin( lamberts[ lmb ].phi0 ) ) * + exp( -ll * n ); + gamma = ( e2d_pos.lon - lamberts[ lmb ].lambda0 ) * n; + lmb_pos->x = ( double )lamberts[ lmb ].x0 + r * sin( gamma ); + lmb_pos->y = ( double )lamberts[ lmb ].ys - r * cos( gamma ); +} + +void e2d_of_lambert ( const enum type_lambert lmb, + const enum type_ellipsoid elps, + struct double_c2d c_pos, struct double_e2d *e_pos ) +{ + double dx = c_pos.x - lamberts[ lmb ].x0; + double dy = c_pos.y - lamberts[ lmb ].ys; + double r = sqrt( dx * dx + dy * dy ); + double gamma = atan2( dx, -dy ); + double lambda = lamberts[ lmb ].lambda0 + gamma / lambert_n( lmb ); + double ll = -1. / lambert_n( lmb ) * log( fabs( r / lambert_c( lmb ) ) ); + double phi = inverse_latitude_isometrique( ll, lamberts[ lmb ].ellipsoid->e, + 1e-11 ); + e_pos->lon = lambda; + e_pos->lat = phi; + e2d_of_e2d( elps, NTF, e_pos ); +} + +void e2d_of_e2d( const enum type_ellipsoid dest, const enum type_ellipsoid src, + struct double_e2d *e2d_pos ) +{ + if ( dest != src ) { + double sin_lat = sin( e2d_pos->lat ); + double cos_lat = cos( e2d_pos->lat ); + double sin_lon = sin( e2d_pos->lon ); + double cos_lon = cos( e2d_pos->lon ); + double d16 = E_SQUARE( ellipsoids[ src ].df ); + double d17 = E_SQUARE( ellipsoids[ dest ].df ); + double d18 = ellipsoids[ src ].a / sqrt ( 1.0 - d16 * sin_lat * sin_lat ); + double d20 = d18 * cos_lat * cos_lon; + double d21 = d18 * cos_lat * sin_lon; + double d22 = d18 * ( 1.0 - d16 ) * sin_lat; + double d23 = d20 - ellipsoids[ dest ].dx + ellipsoids[ src ].dx; + double d24 = d21 - ellipsoids[ dest ].dy + ellipsoids[ src ].dy; + double d25 = d22 - ellipsoids[ dest ].dz + ellipsoids[ src ].dz; + double d26 = sqrt ( d23 * d23 + d24 * d24 ); + double d27 = atan2( d25, d26 * ( 1.0 - ellipsoids[ dest ].df ) ); + double d28 = ellipsoids[ dest ].a * ( 1.0 - ellipsoids[ dest ].df ); + double d29 = E_PRIME_SQUARE( ellipsoids[ dest ].df ); + double d3 = atan2( ( d25 + d29 * d28 * sin( d27 ) * sin( d27 ) * sin( d27 ) ), + ( d26 - d17 * ellipsoids[ dest ].a * cos( d27 ) * cos( d27 ) * cos( d27 ) ) ); + double d4 = atan2( d24, d23 ); + e2d_pos->lon = d4; + e2d_pos->lat = d3; + } +} + + +/* + converts 3d cartesian coordinate to 3d ellipsoidal +*/ +void e3d_of_c3d( const enum type_ellipsoid elps, struct double_c3d c_pos, + struct double_e3d *e_pos ) +{ +#define WGS_84_SMA 6378137.00 +#define WGS_84_SMB 6356752.31 +#define E2 ((WGS_84_SMA*WGS_84_SMA-WGS_84_SMB*WGS_84_SMB)/(WGS_84_SMA*WGS_84_SMA)) +#define PREC 0.000000000001 + double dist = sqrt( c_pos.x * c_pos.x + c_pos.y * c_pos.y ); + double v, old_phi, new_phi = atan2( ( double )c_pos.z, dist * ( 1 - E2 ) ); + do { + old_phi = new_phi; + v = WGS_84_SMA / sqrt( 1 - ( E2 * sin( old_phi ) * sin( old_phi ) ) ); + new_phi = atan2( ( ( double )c_pos.z + E2 * v * sin ( old_phi ) ), dist ); + } while ( fabs( new_phi - old_phi ) > PREC ); + e_pos->lat = new_phi; + e_pos->lon = atan2( c_pos.y, c_pos.x ); + e_pos->h = ( dist / cos ( new_phi ) ) - v; +} + + + diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/logger.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/logger.c new file mode 100644 index 0000000..99265b6 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/logger.c @@ -0,0 +1,193 @@ +/* + logger.c + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; 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 +#include +#include +#include + +#include "logger.h" + +//static GList* logger_parse_messages(struct PprzProtocol* protocol, xmlDocPtr doc, xmlNodePtr cur); +static GList *logger_parse_message( struct PprzProtocol *protocol, GList *msgs, + const guchar *buf ); + +struct Logger *logger_new( const gchar *out_file, xmlDocPtr doc ) +{ + const gchar *opening = "\n"; + struct Logger *this = g_new( struct Logger, 1 ); + if ( this ) { + GError *err = NULL; + + gchar *copy = strdup( out_file ); + gchar *out_dir = dirname( copy ); + DIR *d; + if ( !( d = opendir( out_dir ) ) ) { + if ( errno == ENOENT ) { + if ( mkdir( out_dir, S_IRWXU | S_IRWXG ) ) { + g_message( "log directory %s doesn't exist and could not create it", out_dir ); + /* FIXME : FREE */ + return NULL; + } + } else { + g_message( "could not acces log directory %s %s", out_dir, + g_strerror( errno ) ); + /* FIXME : FREE */ + return NULL; + } + } + closedir( d ); + g_free( copy ); + + xmlSaveFormatFile ( out_file, doc, 1 ); + /* FIXME : check result */ + + this->channel = g_io_channel_new_file( out_file, "a", &err ); + if ( err ) { + g_message( "could not open log file %s : %s", out_file, err->message ); + g_error_free( err ); + g_free( this ); + return NULL; + } + g_io_channel_write_chars( this->channel, opening, strlen( opening ), NULL, + NULL ); + } + return this; + +} + + +void logger_free( struct Logger *this ) +{ + const gchar *closing = "\n\n"; + g_io_channel_write_chars( this->channel, closing, strlen( closing ), NULL, + NULL ); + g_io_channel_flush( this->channel, NULL ); + // g_io_channel_free(this->channel); + g_free( this ); +} + +void logger_log( struct Logger *this, struct PprzMsg *msg ) +{ + GString *str; + pprz_protocol_ascii_of_msg( msg, &str ); + if ( str ) { + GError *err = NULL; + guint len; + g_io_channel_write_chars ( this->channel, str->str, str->len, &len, &err ); + if ( err ) { + g_warning( "log write failed %s", err->message ); + g_error_free( err ); + g_string_free( str, TRUE ); + return; + } + g_string_free( str, TRUE ); + g_io_channel_flush( this->channel, &err ); + if ( err ) { + g_warning( "log flush failed %s", err->message ); + g_error_free( err ); + return; + } + } +} + + +GList *logger_parse_log( const gchar *filename, + struct PprzProtocol **protocol ) +{ + xmlDocPtr doc; + xmlNodePtr cur; + + GList *msgs = NULL; + const gchar *protocol_closure = ""; + gchar *contents, *data_start; + gsize len; + GError *err; + gboolean res = g_file_get_contents( filename, &contents, &len, &err ); + + if ( !res ) { + g_message( "could not read file %s : %s", filename, err->message ); + g_error_free( err ); + return NULL; + } + + if ( !( data_start = g_strstr_len( contents, len, protocol_closure ) ) ) { + g_free( contents ); + g_message( "protocol closing not found" ); + return NULL; + } + + data_start += strlen( protocol_closure ); + + if ( !( doc = xmlParseMemory( contents, data_start - contents ) ) ) { + g_free( contents ); + g_message( "error parsing protocol xml" ); + return NULL; + } + + if ( !( cur = xmlDocGetRootElement( doc ) ) ) { + g_free( contents ); + g_message( "empty protocol" ); + return NULL; + } + + if ( !( *protocol = pprz_protocol_new_from_xml( doc, cur ) ) ) { + g_free( contents ); + g_message( "error interpreting protocol" ); + return NULL; + } + + msgs = logger_parse_message( *protocol, msgs, data_start ); + g_free( contents ); + + return msgs; +} + +/* static GList* logger_parse_messages(struct PprzProtocol* protocol, xmlDocPtr doc, xmlNodePtr cur) { */ + +/* if (!cur) return NULL; */ +/* if (xmlStrcmp(cur->name, (const xmlChar *) "data")) */ +/* return cur->next?logger_parse_messages(protocol, doc, cur->next):NULL; */ +/* cur = cur->xmlChildrenNode; */ + +/* if (xmlStrcmp(cur->name, (const xmlChar *) "text")) */ +/* return NULL; */ + +/* return logger_parse_message(protocol, NULL, cur->content); */ +/* } */ + +static GList *logger_parse_message( struct PprzProtocol *protocol, GList *msgs, + const guchar *buf ) +{ + guchar *next; + struct PprzMsg *msg = pprz_protocol_msg_new_of_ascii( protocol, buf ); + if ( msg ) + msgs = g_list_append( msgs, msg ); + if ( ( next = index( buf, '\n' ) ) ) + return logger_parse_message( protocol, msgs, next + 1 ); + return msgs; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/math.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/math.c new file mode 100644 index 0000000..dd1e05c --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/math.c @@ -0,0 +1,93 @@ +/* + Math library emulation functions + + Copyright (C) 2007 IRIT - UPS + + This file is part of papabench. + + paparazzi 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. + + paparazzi 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 papabench; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include + +double pp_atan2( double x, double y ) +{ + double coeff_1 = M_PI / 4; + double coeff_2 = 3 * coeff_1; + double abs_y = fabs( y ) + 1e-10; + double angle, r; + if ( x > 0 ) { + r = ( x - abs_y ) / ( x + abs_y ); + angle = coeff_1 - coeff_1 * r; + } else { + r = ( x + abs_y ) / ( abs_y - x ); + angle = coeff_2 - coeff_1 * r; + } + if ( y < 0 ) + return ( -angle ); + else + return angle; +} + + +/* Calculates sin(x), angle x must be in rad. + Range: -pi/2 <= x <= pi/2 + Precision: +/- .000,000,005 +*/ + +double pp_sin( double x ) +{ + double xi, y, q, q2; + int sign; + + xi = x; + sign = 1; + _Pragma( "loopbound min 0 max 0" ) + while ( xi < -1.57079632679489661923 ) xi += 6.28318530717958647692; + _Pragma( "loopbound min 0 max 0" ) + while ( xi > 4.71238898038468985769 ) xi -= 6.28318530717958647692; + if ( xi > 1.57079632679489661923 ) { + xi -= 3.141592653589793238462643; + sign = -1; + } + q = xi / 1.57079632679; + q2 = q * q; + y = ( ( ( ( .00015148419 * q2 + - .00467376557 ) * q2 + + .07968967928 ) * q2 + - .64596371106 ) * q2 + + 1.57079631847 ) * q; + return ( sign < 0 ? -y : y ); +} + +#define SQRT_PRECISION 5 +double pp_sqrt( double n ) +{ + #if 0 + float x, m; + int i, e; + + /* compute the approximation */ + m = frexpf( n, &e ); + x = ldexp( m, e / 2 ); + + /* perform the computation */ + _Pragma( "loopbound min 5 max 5 ) + for ( i = 0; i < SQRT_PRECISION; i++ ) + x = ( x + n / x ) / 2; + return x; + #endif +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/network.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/network.c new file mode 100644 index 0000000..e32e60a --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/network.c @@ -0,0 +1,192 @@ +/* + $id:$ + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + network functions +*/ + +#include "network.h" + +#include +#include + +#include +#include + +#include +#include + +static gboolean server_on_data_received( GIOChannel *source, + GIOCondition condition, gpointer data ); +static gboolean client_on_data_received( GIOChannel *source, + GIOCondition condition, gpointer data ); + +struct NetworkServer *network_server_new( struct PprzProtocol *protocol, + const char *bcast_addr, const int bcast_port, + GFunc rcv_callback, GFunc err_callback, gpointer user_data ) +{ + struct NetworkServer *this = g_new( struct NetworkServer, 1 ); + if ( this ) { + GIOChannel *channel; + struct protoent *pte = getprotobyname( "UDP" ); + static int so_broadcast = TRUE; + + this->bcast_socket = socket( PF_INET, SOCK_DGRAM, pte->p_proto ); + setsockopt( this->bcast_socket, SOL_SOCKET, SO_BROADCAST, &so_broadcast, + sizeof( so_broadcast ) ); + + this->bcast_addr.sin_family = PF_INET; + this->bcast_addr.sin_port = htons( bcast_port ); + this->bcast_addr.sin_addr.s_addr = inet_addr( bcast_addr ); + + channel = g_io_channel_unix_new( this->bcast_socket ); + g_io_add_watch ( channel, G_IO_IN | G_IO_PRI, server_on_data_received, this ); + + this->protocol = protocol; + + this->rcv_callback = rcv_callback; + this->err_callback = err_callback; + this->user_data = user_data; + } + return this; +} + +#define FIXME_LEN 2048 + +void network_server_dispatch( struct NetworkServer *this, struct PprzMsg *msg ) +{ + guchar buf[ FIXME_LEN ]; + GTimeVal *date = ( GTimeVal * )buf; + guchar *type = buf + sizeof( GTimeVal ); + guchar *data = type + 1; + guint len = sizeof( GTimeVal ) + msg->class->size; + *date = msg->date; + *type = msg->class->id; + memcpy( data, msg->bytes, msg->class->size - 1 ); + if ( sendto( this->bcast_socket, buf, len, 0, + ( struct sockaddr * )&this->bcast_addr, sizeof( this->bcast_addr ) ) == -1 ) + g_message( "error broadcasting" ); +} + +struct NetworkClient *network_client_new( struct PprzProtocol *protocol, + const char *bcast_addr, const int bcast_port, + GFunc rcv_callback, GFunc err_callback, gpointer user_data ) +{ + struct NetworkClient *this = g_new( struct NetworkClient, 1 ); + if ( this ) { + int so_reuseaddr = TRUE; + GIOChannel *channel; + struct protoent *pte = getprotobyname( "UDP" ); + + this->socket = socket( PF_INET, SOCK_DGRAM, pte->p_proto ); + setsockopt( this->socket, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, + sizeof( so_reuseaddr ) ); + this->bcast_addr.sin_family = PF_INET; + this->bcast_addr.sin_port = htons( bcast_port ); + this->bcast_addr.sin_addr.s_addr = inet_addr( bcast_addr ); + bind( this->socket, ( struct sockaddr * )&this->bcast_addr, + sizeof( this->bcast_addr ) ); + + channel = g_io_channel_unix_new( this->socket ); + g_io_add_watch ( channel, G_IO_IN | G_IO_PRI, client_on_data_received, this ); + + this->protocol = protocol; + + this->rcv_callback = rcv_callback; + this->err_callback = err_callback; + this->user_data = user_data; + } + return this; +} + +void network_client_send_to_server( struct NetworkClient *this, + struct PprzMsg *msg ) +{ + guchar buf[ FIXME_LEN ]; + GTimeVal *date = ( GTimeVal * )buf; + guchar *type = buf + sizeof( GTimeVal ); + guchar *data = type + 1; + guint len = sizeof( GTimeVal ) + msg->class->size; + *date = msg->date; + *type = msg->class->id; + memcpy( data, msg->bytes, msg->class->size - 1 ); + if ( sendto( this->socket, buf, len, 0, + ( struct sockaddr * )&this->bcast_addr, sizeof( this->bcast_addr ) ) == -1 ) + g_message( "error sending to server" ); +} + +static gboolean server_on_data_received( GIOChannel *source, + GIOCondition condition, gpointer data ) +{ + guchar buf[ FIXME_LEN ]; + struct sockaddr_in from; + int from_len; + gint len; + struct NetworkServer *this = ( struct NetworkServer * )data; + if ( ( len = recvfrom( this->bcast_socket, buf, FIXME_LEN, 0, + ( struct sockaddr * )&from, &from_len ) ) == -1 ) { + this->err_callback( NULL, this->user_data ); + return FALSE; + } else { + struct PprzMsg *msg; + GTimeVal *date = ( GTimeVal * )buf; + guchar *ptr_type = buf + sizeof( GTimeVal ); + if ( !( msg = pprz_protocol_msg_new_of_bin( this->protocol, ptr_type, + *date ) ) ) { + this->err_callback( NULL, this->user_data ); + return TRUE; + } + this->rcv_callback( msg, this->user_data ); + // g_message("network data received %s %d", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); + + } + return TRUE; +} + +static gboolean client_on_data_received( GIOChannel *source, + GIOCondition condition, gpointer data ) +{ + guchar buf[ FIXME_LEN ]; + struct sockaddr_in from; + int from_len; + gint len; + struct NetworkClient *this = ( struct NetworkClient * )data; + if ( ( len = recvfrom( this->socket, buf, FIXME_LEN, 0, + ( struct sockaddr * )&from, &from_len ) ) == -1 ) { + g_message( "client_on_data_received [ %s ]", strerror( errno ) ); + this->err_callback( NULL, this->user_data ); + return TRUE; + } else { + struct PprzMsg *msg; + GTimeVal *date = ( GTimeVal * )buf; + guchar *ptr_type = buf + sizeof( GTimeVal ); + if ( !( msg = pprz_protocol_msg_new_of_bin( this->protocol, ptr_type, + *date ) ) ) { + this->err_callback( NULL, this->user_data ); + return TRUE; + } + this->rcv_callback( msg, this->user_data ); + // g_message("network data received %s %d", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); + } + this->server_addr = from; + return TRUE; +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/protocol.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/protocol.c new file mode 100644 index 0000000..9395f34 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/protocol.c @@ -0,0 +1,551 @@ +/* + $Id: protocol.c,v 1.1 2011-01-18 12:48:45 moellmer Exp $ + Copyright (C) 2003 Pascal Brisset, Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "protocol.h" +#include +#include + +struct PprzTypInfo { + gchar *xml_name; + guint size; + gchar *default_format; +}; + +const struct PprzTypInfo type_info[ TYP_NB ] = { + {"uint8", 1, "%hhu"}, + {"uint16", 2, "%hu" }, + {"uint32", 4, "%u" }, + {"int8", 1, "%hhd"}, + {"int16", 2, "%hd" }, + {"int32", 4, "%d" }, + {"float", 4, "%f" }, + {"uint8_array", 1, "%0x"} +}; + +static gboolean parse_xml_msg( struct PprzProtocol *this, xmlNodePtr ptr ); +static gboolean parse_xml_field( struct PprzMsgClass *msg_class, + xmlNodePtr ptr ); +static void ascii_of_fields( struct PprzMsg *msg, GList *fields_class, + GString *buf ); +static gboolean field_of_ascii( GList *fields_class, gchar *line, + struct PprzMsg *msg ); + +static enum PprzFieldType type_of_string( const gchar *type_str ); + +static struct PprzMsgClass *msg_class_of_name( struct PprzProtocol *this, + const gchar *name ); +static struct PprzMsgClass *msg_class_of_id( struct PprzProtocol *this, + guchar id ); + +static struct PprzFieldClass *field_class_of_name( struct PprzMsg *msg, + const gchar *name ); +/* static struct PprzFieldClass* field_class_of_id(struct PprzMsg* msg, guchar id); */ + +struct PprzProtocol *pprz_protocol_new_from_xml( xmlDocPtr doc, + xmlNodePtr cur ) +{ + struct PprzProtocol *this; + if ( !cur ) return NULL; /* empty document */ + if ( xmlStrcmp( cur->name, + ( const xmlChar * ) "protocol" ) ) /* not protocol */ + return cur->next ? pprz_protocol_new_from_xml( doc, cur->next ) : NULL; + this = g_new( struct PprzProtocol, 1 ); + this->msgs_classes = NULL; + this->msgs_classes_by_name = g_hash_table_new( g_str_hash, g_str_equal ); + if ( !parse_xml_msg( this, cur->xmlChildrenNode ) ) { + g_free( this ); + return NULL; + } + this->nb_msgs_classes = g_list_length( this->msgs_classes ); + this->msgs_classes_by_id = g_new( struct PprzMsgClass *, + this->nb_msgs_classes ); + { + GList *cur = this->msgs_classes; + guint i = 0; + while ( cur ) { + this->msgs_classes_by_id[ i ] = cur->data; + i++; + cur = cur->next; + } + } + return this; +} + +const gchar *pprz_protocol_str_of_field_type( enum PprzFieldType type ) +{ + return type_info[ type ].xml_name; +} + +const guint pprz_protocol_size_of_field_type( enum PprzFieldType type ) +{ + return type_info[ type ].size; +} + +static enum PprzFieldType type_of_string( const gchar *type_str ) +{ + guint ret = 0; + while ( ret < TYP_NB && strcmp( type_info[ ret ].xml_name, type_str ) ) + ret++; + return ret; +} + +struct PprzMsg *pprz_message_new( struct PprzMsgClass *msg_class, + GTimeVal date ) +{ + struct PprzMsg *this = g_new( struct PprzMsg, 1 ); + this->date = date; + this->class = msg_class; + this->bytes = g_new( guchar, this->class->size - 1 ); + return this; +} + +struct PprzMsg *pprz_protocol_msg_new_by_id( struct PprzProtocol *this, + guchar id, GTimeVal date ) +{ + struct PprzMsgClass *msg_class = msg_class_of_id( this, id ); + if ( msg_class ) return pprz_message_new( msg_class, date ); + return NULL; +} + +struct PprzMsg *pprz_protocol_msg_new_by_name( struct PprzProtocol *this, + const gchar *name, GTimeVal date ) +{ + struct PprzMsgClass *msg_class = msg_class_of_name( this, name ); + if ( msg_class ) return pprz_message_new( msg_class, date ); + return NULL; +} + +struct PprzMsg *pprz_protocol_msg_new_of_bin( struct PprzProtocol *this, + const guchar *buf, GTimeVal date ) +{ + struct PprzMsg *msg = pprz_protocol_msg_new_by_id( this, buf[ 0 ], date ); + if ( msg ) + memcpy( msg->bytes, buf + 1, msg->class->size - 1 ); + return msg; +} + + +struct PprzMsg *pprz_protocol_msg_new_of_ascii( struct PprzProtocol *this, + const gchar *line ) +{ + gchar *kw; + GTimeVal date; + struct PprzMsg *msg; + if ( sscanf( line, "%ld.%06ld %as", &date.tv_sec, &date.tv_usec, &kw ) != 3 ) + return NULL; + if ( !( msg = pprz_protocol_msg_new_by_name( this, kw, date ) ) ) + return NULL; + if ( msg->class->fields_classes ) { // message has arguments + gchar *space = index( line, ' ' ); + g_assert( space ); + g_assert( space + 1 ); // checked before by sscanf + space = index( space + 1, ' ' ); + g_assert( space ); // checked before by sscanf + if ( !field_of_ascii( msg->class->fields_classes, space, msg ) ) { + pprz_msg_free( msg ); + return NULL; + } + } + return msg; +} + +void pprz_msg_free( struct PprzMsg *this ) +{ + g_free( this->bytes ); + g_free( this ); +} + +gboolean pprz_msg_set_field( struct PprzMsg *msg, + struct PprzFieldClass *field_class, gconstpointer value ) +{ + /*#ifdef WITH_SWITCH + switch (field_class->type) { + case TYP_UINT_8: + (guint8*)(msg->bytes+field_class->offset) = *(guint8*)value; + break; + case TYP_UINT_16: + (guint16*)(msg->bytes+field_class->offset) = *(guint16*)value; + break; + case TYP_UINT_32: + (guint32*)(msg->bytes+field_class->offset) = *(guint32*)value; + break; + case TYP_INT_8: + (gint8*)(msg->bytes+field_class->offset) = *(gint8*)value; + break; + case TYP_INT_16: + (gint16*)(msg->bytes+field_class->offset) = *(gint16*)value; + break; + case TYP_INT_32: + (gint32*)(msg->bytes+field_class->offset) = *(gint32*)value; + break; + case TYP_FLOAT: + (gfloat*)(msg->bytes+field_class->offset) = *(gfloat*)value; + break; + case TYP_ARRAY_UINT_8: + // g_string_append_printf(buf, format, *((gfloat*)data)); + break; + default: + g_warning("in ascii of field : unknown type"); + } + #else*/ + if ( field_class->type == TYP_UINT_8 ) { + *( guint8 * )( msg->bytes + field_class->offset ) = *( guint8 * )value; + break; + } else + if ( field_class->type == TYP_UINT_16 ) { + *( guint16 * )( msg->bytes + field_class->offset ) = *( guint16 * )value; + break; + } else + if ( field_class->type == TYP_UINT_32 ) { + *( guint32 * )( msg->bytes + field_class->offset ) = *( guint32 * )value; + break; + } else + if ( field_class->type == TYP_INT_8 ) { + *( gint8 * )( msg->bytes + field_class->offset ) = *( gint8 * )value; + break; + } else + if ( field_class->type == TYP_INT_16 ) { + *( gint16 * )( msg->bytes + field_class->offset ) = *( gint16 * )value; + break; + } else + if ( field_class->type == TYP_INT_32 ) { + *( gint32 * )( msg->bytes + field_class->offset ) = *( gint32 * )value; + break; + } else + if ( field_class->type == TYP_FLOAT ) { + *( gfloat * )( msg->bytes + field_class->offset ) = *( gfloat * )value; + break; + } else + if ( field_class->type == TYP_ARRAY_UINT_8 ) { + // g_string_append_printf(buf, format, *((gfloat*)data)); + break; + } else + g_warning( "in ascii of field : unknown type" ); +//#endif + return TRUE; +} + +gboolean pprz_msg_set_field_by_name( struct PprzMsg *msg, const gchar *name, + gconstpointer value ) +{ + struct PprzFieldClass *field_class = field_class_of_name( msg, name ); + if ( field_class ) + return pprz_msg_set_field( msg, field_class, value ); + return FALSE; +} + +gboolean pprz_msg_set_field_by_id( struct PprzMsg *msg, guint id, + gconstpointer value ) +{ + GList *cell = g_list_nth( msg->class->fields_classes, id ); + if ( cell ) + return pprz_msg_set_field( msg, cell->data, value ); + return FALSE; +} + + +gpointer pprz_msg_get_field( struct PprzMsg *msg, + struct PprzFieldClass *field_class ) +{ + return msg->bytes + field_class->offset; +} + +gpointer pprz_msg_get_field_by_name( struct PprzMsg *msg, const gchar *name ) +{ + struct PprzFieldClass *field_class = field_class_of_name( msg, name ); + if ( field_class ) + return pprz_msg_get_field( msg, field_class ); + g_message( "pprz_msg_get_field_by_name : unknown field [ %s ] in msg [ %s ]", name, + msg->class->name ); + return NULL; +} + + + +#define DEFAULT_LINE_LEN 256 +void pprz_protocol_ascii_of_msg( struct PprzMsg *msg, GString **buf ) +{ + *buf = g_string_sized_new( DEFAULT_LINE_LEN ); + g_string_printf( *buf, "%ld.%06ld %s ", msg->date.tv_sec, msg->date.tv_usec, + msg->class->name ); + if ( msg->class->fields_classes ) ascii_of_fields( msg, + msg->class->fields_classes, *buf ); + g_string_append_printf( *buf, "\n" ); +} + +void pprz_msg_ascii_of_field( struct PprzMsg *msg, + struct PprzFieldClass *field_class, GString *buf ) +{ + guchar *format; + guchar *data; + format = field_class->format; + if ( !format ) format = type_info[ field_class->type ].default_format; + data = msg->bytes + field_class->offset; + /*#ifdef WITH_SWITCH + switch (field_class->type) { + case TYP_UINT_8: + g_string_append_printf(buf, format, *((guint8*)data)); + break; + case TYP_UINT_16: + g_string_append_printf(buf, format, *((guint16*)data)); + break; + case TYP_UINT_32: + g_string_append_printf(buf, format, *((guint32*)data)); + break; + case TYP_INT_8: + g_string_append_printf(buf, format, *((gint8*)data)); + break; + case TYP_INT_16: + g_string_append_printf(buf, format, *((gint16*)data)); + break; + case TYP_INT_32: + g_string_append_printf(buf, format, *((gint32*)data)); + break; + case TYP_FLOAT: + g_string_append_printf(buf, format, *((gfloat*)data)); + break; + case TYP_ARRAY_UINT_8: + // g_string_append_printf(buf, format, *((gfloat*)data)); + break; + default: + g_warning("in ascii of field : unknown type"); + } + #else*/ + if ( field_class->type == TYP_UINT_8 ) { + g_string_append_printf( buf, format, *( ( guint8 * )data ) ); + break; + } else + if ( field_class->type == TYP_UINT_16 ) { + g_string_append_printf( buf, format, *( ( guint16 * )data ) ); + break; + } else + if ( field_class->type == TYP_UINT_32 ) { + g_string_append_printf( buf, format, *( ( guint32 * )data ) ); + break; + } else + if ( field_class->type == TYP_INT_8 ) { + g_string_append_printf( buf, format, *( ( gint8 * )data ) ); + break; + } else + if ( field_class->type == TYP_INT_16 ) { + g_string_append_printf( buf, format, *( ( gint16 * )data ) ); + break; + } else + if ( field_class->type == TYP_INT_32 ) { + g_string_append_printf( buf, format, *( ( gint32 * )data ) ); + break; + } else + if ( field_class->type == TYP_FLOAT ) { + g_string_append_printf( buf, format, *( ( gfloat * )data ) ); + break; + } else + if ( field_class->type == TYP_ARRAY_UINT_8 ) { + // g_string_append_printf(buf, format, *((gfloat*)data)); + break; + } else + g_warning( "in ascii of field : unknown type" ); +//#endif +} + + +static gboolean field_of_ascii( GList *fields_classes, gchar *line, + struct PprzMsg *msg ) +{ + struct PprzFieldClass *field_class = ( struct PprzFieldClass * ) + fields_classes->data; + gchar *end_ptr; + gchar *ptr_field = msg->bytes + field_class->offset; + /*#ifdef WITH_SWITCH + switch (field_class->type) { + case TYP_UINT_8: + ((guint8*)ptr_field) = (guint8)strtoul(line, &end_ptr, 10); + break; + case TYP_UINT_16: + ((guint16*)ptr_field) = (guint16)strtoul(line, &end_ptr, 10); + break; + case TYP_UINT_32: + ((guint32*)ptr_field) = (guint32)strtoul(line, &end_ptr, 10); + break; + case TYP_INT_8: + ((gint8*)ptr_field) = (gint8)strtol(line, &end_ptr, 10); + break; + case TYP_INT_16: + ((gint16*)ptr_field) = (gint16)strtol(line, &end_ptr, 10); + break; + case TYP_INT_32: + ((gint32*)ptr_field) = (gint32)strtol(line, &end_ptr, 10); + break; + case TYP_FLOAT: + ((gfloat*)ptr_field) = (gfloat)strtod(line, &end_ptr); + break; + case TYP_ARRAY_UINT_8: + break; + default: + printf("in field of ascii: unknown type\n"); + } + #else*/ + if ( field_class->type == TYP_UINT_8 ) { + *( ( guint8 * )ptr_field ) = ( guint8 )strtoul( line, &end_ptr, 10 ); + break; + } else + if ( field_class->type == TYP_UINT_16 ) { + *( ( guint16 * )ptr_field ) = ( guint16 )strtoul( line, &end_ptr, 10 ); + break; + } else + if ( field_class->type == TYP_UINT_32 ) { + *( ( guint32 * )ptr_field ) = ( guint32 )strtoul( line, &end_ptr, 10 ); + break; + } else + if ( field_class->type == TYP_INT_8 ) { + *( ( gint8 * )ptr_field ) = ( gint8 )strtol( line, &end_ptr, 10 ); + break; + } else + if ( field_class->type == TYP_INT_16 ) { + *( ( gint16 * )ptr_field ) = ( gint16 )strtol( line, &end_ptr, 10 ); + break; + } else + if ( field_class->type == TYP_INT_32 ) { + *( ( gint32 * )ptr_field ) = ( gint32 )strtol( line, &end_ptr, 10 ); + break; + } else + if ( field_class->type == TYP_FLOAT ) { + *( ( gfloat * )ptr_field ) = ( gfloat )strtod( line, &end_ptr ); + break; + } else + if ( field_class->type == TYP_ARRAY_UINT_8 ) + break; + else + printf( "in field of ascii: unknown type\n" ); +//#endif + if ( fields_classes->next ) + return field_of_ascii( fields_classes->next, end_ptr, msg ); + return TRUE; +} + +static void ascii_of_fields( struct PprzMsg *msg, GList *fields_class, + GString *buf ) +{ + struct PprzFieldClass *field_class = ( struct PprzFieldClass * ) + fields_class->data; + pprz_msg_ascii_of_field( msg, field_class, buf ); + if ( fields_class->next ) { + g_string_append_printf( buf, " " ); + ascii_of_fields( msg, fields_class->next, buf ); + } +} + +static gboolean parse_xml_msg( struct PprzProtocol *this, xmlNodePtr ptr ) +{ + struct PprzMsgClass *new_msg_class; + if ( !xmlNodeIsText ( ptr ) ) { + if ( xmlStrcmp( ptr->name, ( const xmlChar * )"message" ) ) /* not a message */ + return FALSE; + new_msg_class = g_new( struct PprzMsgClass, 1 ); + new_msg_class->id = g_list_length( this->msgs_classes ); + new_msg_class->name = xmlGetProp( ptr, "id" ); + new_msg_class->fields_classes = NULL; + new_msg_class->fields_classes_by_name = g_hash_table_new( g_str_hash, + g_str_equal ); + new_msg_class->size = 1; + this->msgs_classes = g_list_append( this->msgs_classes, new_msg_class ); + g_hash_table_insert( this->msgs_classes_by_name, new_msg_class->name, + new_msg_class ); + if ( ptr->xmlChildrenNode && + !parse_xml_field( new_msg_class, ptr->xmlChildrenNode ) ) + /* fixme : free space */ + return FALSE; + new_msg_class->nb_fields_classes = g_list_length( + new_msg_class->fields_classes ); + new_msg_class->fields_classes_by_id = g_new( struct PprzFieldClass *, + new_msg_class->nb_fields_classes ); + { + GList *cur = new_msg_class->fields_classes; + guint i = 0; + while ( cur ) { + new_msg_class->fields_classes_by_id[ i ] = cur->data; + i++; + cur = cur->next; + } + } + } + if ( ptr->next ) + return parse_xml_msg( this, ptr->next ); + return TRUE; +} + +static gboolean parse_xml_field( struct PprzMsgClass *msg_class, + xmlNodePtr ptr ) +{ + struct PprzFieldClass *new_field_class; + xmlChar *type_str; + if ( !xmlNodeIsText ( ptr ) ) { + if ( xmlStrcmp( ptr->name, ( const xmlChar * )"field" ) ) /* not a field */ + return FALSE; + new_field_class = g_new( struct PprzFieldClass, 1 ); + new_field_class->name = xmlGetProp( ptr, "id" ); + new_field_class->format = xmlGetProp( ptr, "format" ); + new_field_class->unit = xmlGetProp( ptr, "unit" ); + new_field_class->description = xmlGetProp( ptr, "description" ); + type_str = xmlGetProp( ptr, "type" ); + if ( ( new_field_class->type = type_of_string( type_str ) ) >= TYP_NB ) { + /* fixme : free space */ + return FALSE; + } + xmlFree( type_str ); + msg_class->fields_classes = g_list_append( msg_class->fields_classes, + new_field_class ); + g_hash_table_insert( msg_class->fields_classes_by_name, new_field_class->name, + new_field_class ); + new_field_class->offset = msg_class->size - 1; + msg_class->size += type_info[ new_field_class->type ].size; + } + if ( ptr->next ) + /* check return and free space */ + return parse_xml_field( msg_class, ptr->next ); + return TRUE; +} + + +static struct PprzMsgClass *msg_class_of_name( struct PprzProtocol *this, + const gchar *name ) +{ + return g_hash_table_lookup( this->msgs_classes_by_name, name ); +} + +static struct PprzMsgClass *msg_class_of_id( struct PprzProtocol *this, + guchar id ) +{ + if ( id >= this->nb_msgs_classes ) + return NULL; + return this->msgs_classes_by_id[ id ]; +} + +static struct PprzFieldClass *field_class_of_name( struct PprzMsg *msg, + const gchar *name ) +{ + return g_hash_table_lookup( msg->class->fields_classes_by_name, name ); +} + +/* static struct PprzFieldClass* field_class_of_id(struct PprzMsg* msg, guchar id) { */ +/* GList* cell = g_list_nth(msg->class->fields_classes, id); */ +/* return cell?cell->data:NULL; */ +/* } */ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/traces.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/traces.c new file mode 100644 index 0000000..a32ec86 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/traces.c @@ -0,0 +1,52 @@ +/* + traces.c + Copyright (C) 2003 Antoine Drouin + + This file is part of paparazzi. + + paparazzi 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. + + paparazzi 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 paparazzi; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "traces.h" + +#ifdef TRACE_ON +unsigned long TraceLevel = TRACE_ERROR | TRACE_TRANSPORT + ; // | TRACE_MODEM_READ ;// | TRACE_DATA_READ | TRACE_DOWNLINK; //| TRACE_MODEM_READ;// ;//| TRACE_MSG// | TRACE_DOWNLINK; + +// unsigned long TraceLevel = TRACE_DOWNLINK | TRACE_MSG | TRACE_ERROR ; + +const char *print_hex( const unsigned char *buf, unsigned int len ) +{ + const char d2h[ ] = "0123456789ABCDEF"; + int i = 0; +#define HEX_BUF_LEN 1024 +#define FMT_LEN 3 +#define FMT "%c%c " + static unsigned char priv_buf[ HEX_BUF_LEN ]; + /* printf("[ %d ] ", len); */ + for ( i = 0; i < len && i < HEX_BUF_LEN / FMT_LEN; i++ ) { + // printf(FMT, d2h[ (int)buf[ i ]/16 ], d2h[ (int)buf[ i ]%16 ]); + sprintf( priv_buf + FMT_LEN * i, FMT, d2h[ ( int )buf[ i ] / 16 ], + d2h[ ( int )buf[ i ] % 16 ] ); + } + if ( len == 0 ) + priv_buf[ 0 ] = '\0'; + return priv_buf; +} + +#endif + + diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/transport.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/transport.c new file mode 100644 index 0000000..31e1883 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/c/transport.c @@ -0,0 +1,244 @@ +#include "transport.h" + + +#include "geometry.h" +#include "traces.h" + +static void parse_buf( struct Transport *this ); +static gboolean check_checksum( struct Transport *this, guint msg_len ); +static void remove_n_from_buf( struct Transport *this, guint len ); +static void remove_until_stx( struct Transport *this ); + +struct Transport *transport_new( gboolean fixed_size, + gboolean two_bytes_checksum, guint nb_msg, + guint *size_msg, guint max_msg_size, + guchar stx, guchar etx, + void( *err_callback )( gpointer callback_data, GError *error ), + void( *msg_callback )( gpointer callback_data, struct TransportMsg *msg ), + gpointer callback_data ) +{ + struct Transport *this = g_new( struct Transport, 1 ); + if ( this ) { + this->stx = stx; + this->etx = etx; + this->err_callback = err_callback; + this->msg_callback = msg_callback; + this->callback_data = callback_data; + this->buf_len = 0; + this->fixed_size = fixed_size; + this->two_bytes_checksum = two_bytes_checksum; + this->quark = g_quark_from_string( "Transport" ); + g_get_current_time( &this->start_date ); + if ( fixed_size ) { + this->nb_msg_type = nb_msg; + this->size_msg = size_msg; + //this->max_msg_size = FIXME find max size in array;; + } else + this->max_msg_size = max_msg_size; + this->nb_byte_last_status = 0; + this->nb_msg_last_status = 0; + this->status.nb_byte = 0; + this->status.nb_msg = 0; + this->status.nb_err = 0; + } + return this; +} + +#define GDOUBLE_FROM_DIF_TV(a,b) ((gdouble)(a.tv_sec-b.tv_sec) + 1e-6 * (gdouble)(a.tv_usec-b.tv_usec)) + +struct TransportStatus *transport_get_status( struct Transport *this ) +{ + GTimeVal now; + gdouble duration; + + g_get_current_time( &now ); + this->status.run_time = DELAY_SEC_OF_TIMEVAL( now, this->start_date ); + + duration = GDOUBLE_FROM_DIF_TV( now, this->last_status_date ); + this->status.byte_rate = this->nb_byte_last_status / duration; + this->status.msg_rate = this->nb_msg_last_status / duration; + + this->nb_byte_last_status = 0; + this->nb_msg_last_status = 0; + this->last_status_date = now; + + return &this->status; +} + + + +void transport_free( struct Transport *this ) +{ + g_free( this ); +} + +void transport_feed_data( struct Transport *this, const guchar *buf, + guint len ) +{ + if ( len >= TRANSPORT_BUF_LEN - this->buf_len ) { + GError *err = g_error_new( this->quark, + TRANSPORT_BUF_OVFW, /* guint code */ + "buffer overflow" /* const gchar *format */ + ); + this->err_callback( this->callback_data, err ); + g_error_free( err ); + } else { + this->status.nb_byte += len; + this->nb_byte_last_status += len; + memcpy( this->buf + this->buf_len, buf, len ); + this->buf_len += len; + parse_buf( this ); + } +} + +static gboolean check_checksum( struct Transport *this, guint msg_len ) +{ + guint checksum_idx = msg_len - TRANSPORT_TAIL_LEN; + guint i; + if ( this->two_bytes_checksum ) { + guchar cka = 0, ckb = 0; + for ( i = TRANSPORT_PAYLOAD_OFFSET; i < checksum_idx; i++ ) { + cka += this->buf[ i ]; + ckb += cka; + } + return ( cka == this->buf[ checksum_idx ] && + ckb == this->buf[ checksum_idx + 1 ] ); + } else { + guchar checksum = 0; + for ( i = TRANSPORT_PAYLOAD_OFFSET; i < checksum_idx; i++ ) + checksum ^= this->buf[ i ]; + if ( checksum != this->buf[ checksum_idx ] ) + TRACE( TRACE_ERROR, "transport checksum error (found : 0x%02X read : 0x%02X)\n", + checksum, this->buf[ checksum_idx ] ); + return checksum == this->buf[ checksum_idx ]; + } +} + +static void remove_n_from_buf( struct Transport *this, guint len ) +{ + memmove( this->buf, this->buf + len, this->buf_len - len ); + this->buf_len -= len; +} + +static void remove_until_stx( struct Transport *this ) +{ + guchar *stx = memchr( this->buf, this->stx, this->buf_len ); + if ( stx ) { + if ( stx != this->buf ) { + memmove( this->buf, stx, this->buf_len - ( stx - this->buf ) ); + this->buf_len -= ( stx - this->buf ); + } + } else + this->buf_len = 0; +} + +static gboolean get_msg_len( struct Transport *this, guint *len ) +{ + if ( this->fixed_size ) { + guint type = this->buf[ TRANSPORT_PAYLOAD_OFFSET ]; + if ( type >= this->nb_msg_type ) { /* BAP ID */ + TRACE( TRACE_TRANSPORT, "%d bad type\n", this->buf[ TRANSPORT_PAYLOAD_OFFSET ] ); + TRACE( TRACE_TRANSPORT, "parse_buf %s\n", print_hex( this->buf, + this->buf_len ) ); + this->status.nb_err++; + { + GError *err = g_error_new( this->quark, + TRANSPORT_INVALID_MSG_ID, /* guint code */ + "invalid msg id" /* const gchar *format */ + ); + this->err_callback( this->callback_data, err ); + g_error_free( err ); + } + return FALSE; + } else *len = this->size_msg[ type ] + TRANSPORT_HEAD_LEN + TRANSPORT_TAIL_LEN; + } else { + *len = this->buf[ TRANSPORT_PAYLOAD_OFFSET ] + TRANSPORT_HEAD_LEN + + TRANSPORT_TAIL_LEN; + if ( *len >= this->max_msg_size ) { /* BAD LEN */ + TRACE( TRACE_TRANSPORT, "%d bad len\n", this->buf[ TRANSPORT_PAYLOAD_OFFSET ] ); + this->status.nb_err++; + { + GError *err = g_error_new( this->quark, + TRANSPORT_INVALID_MSG_LEN, /* guint code */ + "invalid message len" /* const gchar *format */ + ); + this->err_callback( this->callback_data, err ); + g_error_free( err ); + } + return FALSE; + } + } + return TRUE; +} + + +static void parse_buf( struct Transport *this ) +{ + /* make sure first byte in buffer is STX */ + remove_until_stx( this ); + // if (this->fixed_size) + // TRACE(TRACE_TRANSPORT, "parse_buf %s\n", print_hex(this->buf, this->buf_len)); + if ( this->buf_len < TRANSPORT_PAYLOAD_OFFSET ) /* NO PAYLOAD */ + TRACE( TRACE_TRANSPORT_VERB, "no payload\n" ); + else { + guint msg_len; + if ( !get_msg_len( this, + &msg_len ) ) { /* BAD LEN ( or TYPE) */ + remove_n_from_buf( this, 1 ); + parse_buf( this ); + } else { + if ( this->buf_len < msg_len ) /* NOT ENOUGTH DATA */ + TRACE( TRACE_TRANSPORT_VERB, "not enough data\n" ); + else { + if ( !check_checksum( this, msg_len ) ) { + TRACE( TRACE_TRANSPORT, "parse_buf %s\n", print_hex( this->buf, + this->buf_len ) ); + this->status.nb_err++; + { + GError *err = g_error_new( this->quark, + TRANSPORT_CHECKSUM_ERROR, /* guint code */ + "checksum error" /* const gchar *format */ + ); + this->err_callback( this->callback_data, err ); + g_error_free( err ); + } + + remove_n_from_buf( this, 1 ); + parse_buf( this ); + } else { + if ( !this->two_bytes_checksum && this->buf[ msg_len - 1 ] != this->etx ) { + TRACE( TRACE_TRANSPORT, "parse_buf %s\n", print_hex( this->buf, + this->buf_len ) ); + TRACE( TRACE_TRANSPORT_VERB, "%d is not ETX\n", this->buf[ msg_len - 1 ] ); + this->status.nb_err++; + { + GError *err = g_error_new( this->quark, + TRANSPORT_NO_ETX, /* guint code */ + "NO ETX" /* const gchar *format */ + ); + this->err_callback( this->callback_data, err ); + g_error_free( err ); + } + remove_n_from_buf( this, 1 ); + parse_buf( this ); + } else { + struct TransportMsg msg; + guint payload_len = msg_len - TRANSPORT_HEAD_LEN - TRANSPORT_TAIL_LEN; + g_get_current_time( &msg.date ); + msg.len = payload_len; + msg.data = this->buf + TRANSPORT_PAYLOAD_OFFSET; + this->status.nb_msg++; + this->nb_msg_last_status++; + + TRACE( TRACE_TRANSPORT_VERB, + "transport msg date : %ld%06ld len : %d data : %s\n", msg.date.tv_sec, + msg.date.tv_usec, msg.len, print_hex( msg.data, msg.len ) ); + this->msg_callback( this->callback_data, &msg ); + remove_n_from_buf( this, msg_len ); + parse_buf( this ); + } + } + } + } + } +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/lib/crt0/powerpc-elf-crt0.c b/targets/wasm-tacle/parallel/PapaBench/sw/lib/crt0/powerpc-elf-crt0.c new file mode 100644 index 0000000..447177c --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/lib/crt0/powerpc-elf-crt0.c @@ -0,0 +1,12 @@ +int main( int argc, char **argv, char **envp ); + +static char *argv[ ] = { "", 0 }; +static char *envp[ ] = { 0 }; + +void _start( void ) +{ + __asm( "lis 1," STACK ">>16" ); + __asm( "addis 1,1," STACK "&0xffff" ); + main( 1, argv, envp ); + while ( 1 ); +} diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/var/include/airframe.h b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/airframe.h new file mode 100644 index 0000000..d07da95 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/airframe.h @@ -0,0 +1,116 @@ +/* This file has been generated from conf/airframes/twinstar3.xml */ +/* Please DO NOT EDIT */ + +#ifndef AIRFRAME_H +#define AIRFRAME_H + +#define AIRFRAME_NAME "Twinstar trois" + +#define CTL_BRD_V1_2_1 1 + +#define ADC_CHANNEL_IR1 1 +#define ADC_CHANNEL_IR2 2 + +#define NB_SERVO 6 + +#define SERVO_MOTOR_LEFT 3 +#define SERVO_MOTOR_LEFT_TRAVEL 0.833333333333 +#define SERVOS_NEUTRALS_3 1000 + +#define SERVO_MOTOR_RIGHT 9 +#define SERVO_MOTOR_RIGHT_TRAVEL 0.833333333333 +#define SERVOS_NEUTRALS_9 1000 + +#define SERVO_AILERON_LEFT 0 +#define SERVO_AILERON_LEFT_TRAVEL -0.55 +#define SERVOS_NEUTRALS_0 1600 + +#define SERVO_AILERON_RIGHT 2 +#define SERVO_AILERON_RIGHT_TRAVEL -0.520833333333 +#define SERVOS_NEUTRALS_2 1650 + +#define SERVO_ELEVATOR 6 +#define SERVO_ELEVATOR_TRAVEL 0.496666666667 +#define SERVOS_NEUTRALS_6 1530 + +#define SERVO_RUDDER 7 +#define SERVO_RUDDER_TRAVEL -0.483333333333 +#define SERVOS_NEUTRALS_7 1450 + + +#define SERVOS_MINS {1850,1000,2000,1000,1000,1000,1220,1850,1000,1000} +#define SERVOS_NEUTRALS {1600,1500,1650,1000,1500,1500,1530,1450,1500,1000} +#define SERVOS_MAXS {1190,2000,1375,2000,2000,2000,1816,1270,2000,2000} + +#define SERVO_MIN_US 1000ul +#define SERVO_MAX_US 2000ul + +#define ServoSet(values) { \ + uint16_t servo_value;\ + int16_t _var_roll;\ + servo_value = SERVO_NEUTRAL(SERVO_MOTOR_LEFT) + (int16_t)((2 * values[ RADIO_GAIN1 ])*SERVO_MOTOR_LEFT_TRAVEL);\ + servo_widths[ SERVO_MOTOR_LEFT ] = ChopServo(servo_value);\ +\ + servo_value = SERVO_NEUTRAL(SERVO_MOTOR_RIGHT) + (int16_t)((2 * values[ RADIO_THROTTLE ])*SERVO_MOTOR_RIGHT_TRAVEL);\ + servo_widths[ SERVO_MOTOR_RIGHT ] = ChopServo(servo_value);\ +\ + servo_value = SERVO_NEUTRAL(SERVO_ELEVATOR) + (int16_t)((values[ RADIO_PITCH ])*SERVO_ELEVATOR_TRAVEL);\ + servo_widths[ SERVO_ELEVATOR ] = ChopServo(servo_value);\ +\ + _var_roll = values[ RADIO_ROLL ];\ + servo_value = SERVO_NEUTRAL(SERVO_AILERON_LEFT) + (int16_t)(((_var_roll > 0 ? 1 : AILERON_DIFF) * _var_roll)*SERVO_AILERON_LEFT_TRAVEL);\ + servo_widths[ SERVO_AILERON_LEFT ] = ChopServo(servo_value);\ +\ + servo_value = SERVO_NEUTRAL(SERVO_AILERON_RIGHT) + (int16_t)(((_var_roll > 0 ? AILERON_DIFF : 1) * _var_roll)*SERVO_AILERON_RIGHT_TRAVEL);\ + servo_widths[ SERVO_AILERON_RIGHT ] = ChopServo(servo_value);\ +\ + servo_value = SERVO_NEUTRAL(SERVO_RUDDER) + (int16_t)((values[ RADIO_YAW ] + values[ RADIO_ROLL ]*COMBI_SWITCH)*SERVO_RUDDER_TRAVEL);\ + servo_widths[ SERVO_RUDDER ] = ChopServo(servo_value);\ +\ +} +#define AILERON_DIFF 0.66 +#define COMBI_SWITCH 1.0 + +#define IR_ROLL_NEUTRAL_DEFAULT -915 +#define IR_PITCH_NEUTRAL_DEFAULT 110 +#define IR_DEFAULT_CONTRAST 200 +#define IR_RAD_OF_IR_CONTRAST 0.75 +#define IR_RollOfIrs(x1,x2) (-1*(x1)+ -1*(x2)) +#define IR_PitchOfIrs(x1,x2) (-1*(x1)+ 1*(x2)) +#define IR_RAD_OF_IR_MAX_VAL 0.0045 +#define IR_RAD_OF_IR_MIN_VAL 0.00075 + +#define ROLL_PGAIN 10000. +#define PITCH_OF_ROLL 0.0 +#define PITCH_PGAIN 15000. +#define MAX_ROLL 0.35 +#define MAX_PITCH 0.35 +#define MIN_PITCH -0.35 + +#define CLIMB_PITCH_PGAIN -0.1 +#define CLIMB_PITCH_IGAIN 0.025 +#define CLIMB_PGAIN -0.03 +#define CLIMB_IGAIN 0.1 +#define CLIMB_MAX 1. +#define CLIMB_LEVEL_GAZ 0.31 +#define CLIMB_PITCH_OF_VZ_PGAIN 0.05 +#define CLIMB_GAZ_OF_CLIMB 0.2 + +#define COURSE_PGAIN -0.2 +#define ALTITUDE_PGAIN -0.025 +#define NAV_PITCH 0. + +#define VOLTAGE_ADC_A 0.0175 +#define VOLTAGE_ADC_B 0.088 +#define VoltageOfAdc(adc) (VOLTAGE_ADC_A * adc + VOLTAGE_ADC_B) +#define LOW_BATTERY 93 + +#define NOMINAL_AIRSPEED 10. +#define CARROT 5. + +#define ROLL_RESPONSE_FACTOR 4. +#define YAW_RESPONSE_FACTOR 4. +#define WEIGHT 1.3 + + +#endif // AIRFRAME_H diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/var/include/flight_plan.h b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/flight_plan.h new file mode 100644 index 0000000..f51f89b --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/flight_plan.h @@ -0,0 +1,546 @@ +/* This file has been generated from conf/flight_plans/braunschweig.xml */ +/* Please DO NOT EDIT */ + +#ifndef FLIGHT_PLAN_H +#define FLIGHT_PLAN_H + +#define FLIGHT_PLAN_NAME "EMAV 2004, 8 shape" +#define NAV_UTM_EAST0 605530 +#define NAV_UTM_NORTH0 5797350 +#define QFU 270.0 +#define WP_HOME 0 +#define WAYPOINTS { \ + {0.0, 0.0, 200},\ + {0.0, 0.0, 200},\ + {115.0, -75.0, 200},\ + {156.7, -41.7, 200},\ + {115.0, 0.0, 200},\ + {0.0, -75.0, 200},\ + {-51.7, -36.7, 200},\ +}; +#define NB_WAYPOINT 7 +#define GROUND_ALT 125. +#define SECURITY_ALT 150. +#define MAX_DIST_FROM_HOME 500. +#ifdef NAV_C + +static inline void auto_nav( void ) +{ + /*#ifdef WITH_SWITCH + switch (nav_block) { + Block(0) // init + switch(nav_stage) { + Label(while_1) + Stage(0) + if (! (!(estimator_flight_time))) Goto(endwhile_2) else NextStage(); + Stage(1) + Goto(while_1) + Label(endwhile_2) + Stage(2) + if ((estimator_flight_time>8)) NextStage() else { + desired_course = RadOfDeg(QFU); + auto_pitch = FALSE; + nav_pitch = 0.150000; + vertical_mode = VERTICAL_MODE_AUTO_GAZ; + nav_desired_gaz = TRIM_UPPRZ(0.800000*MAX_PPRZ); + } + return; + Stage(3) + if ((estimator_z>SECURITY_ALT)) NextStage() else { + desired_course = RadOfDeg(QFU); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_CLIMB; + desired_climb = 8.000000; + } + return; + Stage(4) + NextBlock() + } + + Block(1) // two + if RcEvent1() { GotoBlock(2) } + switch(nav_stage) { + Label(while_3) + Stage(0) + if (! (TRUE)) Goto(endwhile_4) else NextStage(); + Stage(1) + if (approaching(1)) NextStageFrom(1) else { + fly_to(1); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 1 ].a; + pre_climb = 0.; + } + return; + Stage(2) + if (approaching(4)) NextStageFrom(4) else { + fly_to(4); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 4 ].a; + pre_climb = 0.; + } + return; + Stage(3) + Goto(while_3) + Label(endwhile_4) + Stage(4) + NextBlock() + } + + Block(2) // height + if RcEvent1() { GotoBlock(3) } + switch(nav_stage) { + Label(while_5) + Stage(0) + if (! (TRUE)) Goto(endwhile_6) else NextStage(); + Stage(1) + if (approaching(6)) NextStageFrom(6) else { + fly_to(6); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 6 ].a; + pre_climb = 0.; + } + return; + Stage(2) + if (approaching(1)) NextStageFrom(1) else { + fly_to(1); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 1 ].a; + pre_climb = 0.; + } + return; + Stage(3) + if (approaching(2)) NextStageFrom(2) else { + route_to(last_wp, 2); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 2 ].a; + pre_climb = 0.; + } + return; + Stage(4) + if (approaching(3)) NextStageFrom(3) else { + fly_to(3); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 3 ].a; + pre_climb = 0.; + } + return; + Stage(5) + if (approaching(4)) NextStageFrom(4) else { + fly_to(4); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 4 ].a; + pre_climb = 0.; + } + return; + Stage(6) + if (approaching(5)) NextStageFrom(5) else { + route_to(last_wp, 5); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 5 ].a; + pre_climb = 0.; + } + return; + Stage(7) + Goto(while_5) + Label(endwhile_6) + Stage(8) + NextBlock() + } + + Block(3) // xyz + if RcEvent1() { GotoBlock(4) } + switch(nav_stage) { + Stage(0) + + + //NormCourse(x) { while (x < 0) x += 360; while (x >= 360) x -= 360;} + + + //CircleXY(x,y,radius) { float alpha = atan2(estimator_y - y, estimator_x - x);float alpha_carrot = alpha + CARROT / (-radius * estimator_hspeed_mod); + //fly_to_xy(x+cos(alpha_carrot)*fabs(radius),y+sin(alpha_carrot)*fabs(radius)); qdr = DegOfRad(M_PI/2 - alpha_carrot); NormCourse(qdr);} + + + //Goto3D(50) + {static float carrot_x, carrot_y; int16_t pitch; int16_t roll; if (pprz_mode == PPRZ_MODE_AUTO2) { int16_t yaw = from_fbw.channels[ RADIO_YAW ]; if (yaw > + MIN_DX || yaw < -MIN_DX) { carrot_x += FLOAT_OF_PPRZ(yaw, 0, -20.);carrot_x = Min(carrot_x, MAX_DIST_CARROT); carrot_x = Max(carrot_x, -MAX_DIST_CARROT); } + pitch = from_fbw.channels[ RADIO_PITCH ]; if (pitch > MIN_DX || pitch < -MIN_DX) { carrot_y += FLOAT_OF_PPRZ(pitch, 0, -20.); carrot_y = Min(carrot_y, + MAX_DIST_CARROT); carrot_y = Max(carrot_y, -MAX_DIST_CARROT);} vertical_mode = VERTICAL_MODE_AUTO_ALT; roll = from_fbw.channels[ RADIO_ROLL ]; if (roll > + MIN_DX || roll < -MIN_DX) { desired_altitude += FLOAT_OF_PPRZ(roll, 0, -1.0); desired_altitude = Max(desired_altitude, MIN_HEIGHT_CARROT+GROUND_ALT); + desired_altitude = Min(desired_altitude, MAX_HEIGHT_CARROT+GROUND_ALT); } } { float alpha = atan2(estimator_y - carrot_y, estimator_x - carrot_x);float alpha_carrot = alpha + CARROT / (-50 * estimator_hspeed_mod); + fly_to_xy(carrot_x+cos(alpha_carrot)*fabs(50),carrot_y+sin(alpha_carrot)*fabs(50)); qdr = DegOfRad(M_PI/2 - alpha_carrot); { while (qdr < 0) qdr += 360; + while (qdr >= 360) qdr -= 360;}} } + + + return; + Stage(1) + NextBlock() + } + + Block(4) // circle + if RcEvent1() { GotoBlock(5) } + switch(nav_stage) { + Stage(0) + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 0 ].a; + pre_climb = 0.; + Circle(0, 150); + return; + Stage(1) + NextBlock() + } + + Block(5) // hippo + if RcEvent1() { GotoBlock(1) } + switch(nav_stage) { + Label(while_7) + Stage(0) + if (! (TRUE)) Goto(endwhile_8) else NextStage(); + Stage(1) + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 1 ].a; + pre_climb = 0.; + Circle(1, 100); + if (Qdr(0)) NextStage(); + return; + Stage(2) + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 4 ].a; + pre_climb = 0.; + Circle(4, 100); + if (Qdr(180)) NextStage(); + return; + Stage(3) + Goto(while_7) + Label(endwhile_8) + Stage(4) + NextBlock() + } + + } + #else*/ + if ( nav_block == 0 ) { + // init + + if ( nav_stage == 0 ) { + Label( while_1 ) + nav_stage = 0; + if ( ! ( !( estimator_flight_time ) ) ) Goto( endwhile_2 ) + else NextStage(); + } else + if ( nav_stage == 1 ) { + Goto( while_1 ) + } else + if ( nav_stage == 2 ) { + Label( endwhile_2 ) + nav_stage = 2; + if ( ( estimator_flight_time > 8 ) ) NextStage() else { + desired_course = RadOfDeg( QFU ); + auto_pitch = FALSE; + nav_pitch = 0.150000; + vertical_mode = VERTICAL_MODE_AUTO_GAZ; + nav_desired_gaz = TRIM_UPPRZ( 0.800000 * MAX_PPRZ ); + } + return; + } else + if ( nav_stage == 3 ) { + nav_stage = 3; + if ( ( estimator_z > SECURITY_ALT ) ) NextStage() else { + desired_course = RadOfDeg( QFU ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_CLIMB; + desired_climb = 8.000000; + } + return; + } else + if ( nav_stage == 4 ) + NextBlock() + else { } + } else + if ( nav_block == 1 ) { // two + nav_block = 1; + if RcEvent1() { + GotoBlock( 2 ) + } + if ( nav_stage == 0 ) { + Label( while_3 ) + if ( ! ( TRUE ) ) Goto( endwhile_4 ) else NextStage(); + } else + if ( nav_stage == 1 ) { + nav_stage = 1; + if ( approaching( 1 ) ) NextStageFrom( 1 ) else { + fly_to( 1 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 1 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 2 ) { + nav_stage = 2; + if ( approaching( 4 ) ) NextStageFrom( 4 ) else { + fly_to( 4 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 4 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 3 ) { + nav_stage = 3; + Goto( while_3 ) + } else + if ( nav_stage == 4 ) { + Label( endwhile_4 ) + nav_stage = 4; + NextBlock() + } else { } + } else + if ( nav_block == 2 ) { // height + nav_block = 2; + if RcEvent1() { + GotoBlock( 3 ) + } + + if ( nav_stage == 0 ) { + Label( while_5 ) + nav_stage = 0; + if ( ! ( TRUE ) ) Goto( endwhile_6 ) else NextStage(); + } else + if ( nav_stage == 1 ) { + nav_stage = 1; + if ( approaching( 6 ) ) NextStageFrom( 6 ) else { + fly_to( 6 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 6 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 2 ) { + nav_stage = 2; + if ( approaching( 1 ) ) NextStageFrom( 1 ) else { + fly_to( 1 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 1 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 3 ) { + nav_stage = 3; + if ( approaching( 2 ) ) NextStageFrom( 2 ) else { + route_to( last_wp, 2 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 2 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 4 ) { + nav_stage = 4; + if ( approaching( 3 ) ) NextStageFrom( 3 ) else { + fly_to( 3 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 3 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 5 ) { + nav_stage = 5; + if ( approaching( 4 ) ) NextStageFrom( 4 ) else { + fly_to( 4 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 4 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 6 ) { + nav_stage = 6; + if ( approaching( 5 ) ) NextStageFrom( 5 ) else { + route_to( last_wp, 5 ); + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 5 ].a; + pre_climb = 0.; + } + return; + } else + if ( nav_stage == 7 ) { + nav_stage = 7; + Goto( while_5 ) + } + + else + if ( nav_stage == 8 ) { + Label( endwhile_6 ) + nav_stage = 8; + NextBlock(); + } else { } + } else + if ( nav_block == 3 ) { // xyz + nav_block = 3; + if RcEvent1() { + GotoBlock( 4 ) + } + if ( nav_stage == 0 ) { + nav_stage = 0; + //Goto3D(50) + { + static float carrot_x, carrot_y; + int16_t pitch; + int16_t roll; + if ( pprz_mode == PPRZ_MODE_AUTO2 ) { + int16_t yaw = from_fbw.channels[ RADIO_YAW ]; + if ( yaw > MIN_DX || yaw < -MIN_DX ) { + carrot_x += FLOAT_OF_PPRZ( yaw, 0, -20. ); + carrot_x = Min( carrot_x, MAX_DIST_CARROT ); + carrot_x = Max( carrot_x, -MAX_DIST_CARROT ); + } + pitch = from_fbw.channels[ RADIO_PITCH ]; + if ( pitch > MIN_DX || pitch < -MIN_DX ) { + carrot_y += FLOAT_OF_PPRZ( pitch, 0, -20. ); + carrot_y = Min( carrot_y, + MAX_DIST_CARROT ); + carrot_y = Max( carrot_y, -MAX_DIST_CARROT ); + } + vertical_mode = VERTICAL_MODE_AUTO_ALT; + roll = from_fbw.channels[ RADIO_ROLL ]; + if ( roll > MIN_DX || roll < -MIN_DX ) { + desired_altitude += FLOAT_OF_PPRZ( roll, 0, -1.0 ); + desired_altitude = Max( desired_altitude, MIN_HEIGHT_CARROT + GROUND_ALT ); + desired_altitude = Min( desired_altitude, MAX_HEIGHT_CARROT + GROUND_ALT ); + } + } + { + float alpha = atan2( estimator_y - carrot_y, estimator_x - carrot_x ); + float alpha_carrot = alpha + CARROT / ( -50 * estimator_hspeed_mod ); + fly_to_xy( carrot_x + cos( alpha_carrot )*fabs( 50 ), + carrot_y + sin( alpha_carrot )*fabs( 50 ) ); + qdr = DegOfRad( M_PI / 2 - alpha_carrot ); + { + _Pragma( "loopbounds min 0 max 1" ) + while ( qdr < 0 ) qdr += 360; + _Pragma( "loopbounds min 0 max 1" ) + while ( qdr >= 360 ) qdr -= 360; + } + } + } + + return; + } else + if ( nav_stage == 1 ) { + nav_stage = 1; + NextBlock() + } else { } + } else + if ( nav_block == 4 ) { + nav_block = 4; + if RcEvent1() { + GotoBlock( 5 ) + } + if ( nav_stage == 0 ) { + nav_stage = 0; + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 0 ].a; + pre_climb = 0.; + Circle( 0, 150 ); + return; + } else + if ( nav_stage == 1 ) { + nav_stage = 1; + NextBlock() + } else {} + } else + if ( nav_block == 5 ) { + nav_block = 5; + if RcEvent1() { + GotoBlock( 1 ) + } + if ( nav_stage == 0 ) { + Label( while_7 ) + nav_stage = 0; + if ( ! ( TRUE ) ) Goto( endwhile_8 ) else NextStage(); + } + + else + if ( nav_stage == 1 ) { + nav_stage = 1; + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 1 ].a; + pre_climb = 0.; + Circle( 1, 100 ); + if ( Qdr( 0 ) ) NextStage(); + return; + } else + if ( nav_stage == 2 ) { + nav_stage = 2; + auto_pitch = FALSE; + nav_pitch = 0.000000; + vertical_mode = VERTICAL_MODE_AUTO_ALT; + desired_altitude = waypoints[ 4 ].a; + pre_climb = 0.; + Circle( 4, 100 ); + if ( Qdr( 180 ) ) NextStage(); + return; + } else + if ( nav_stage == 3 ) { + nav_stage = 3; + Goto( while_7 ) + } else + if ( nav_stage == 4 ) { + Label( endwhile_8 ) + nav_stage = 4; + NextBlock() + } else { } + } else { } + +//#endif +} +#endif // NAV_C + +#endif // FLIGHT_PLAN_H diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/var/include/inflight_calib.h b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/inflight_calib.h new file mode 100644 index 0000000..148e4df --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/inflight_calib.h @@ -0,0 +1,55 @@ +/* This file has been generated from conf/flight_plans/braunschweig.xml */ +/* Please DO NOT EDIT */ + +#ifndef INFLIGHT_CALIB_H +#define INFLIGHT_CALIB_H + +void inflight_calib( bool_t mode_changed ) +{ + if ( pprz_mode == PPRZ_MODE_AUTO1 ) { + if ( inflight_calib_mode == IF_CALIB_MODE_UP ) { + static int16_t ir_pitch_neutral_init; + if ( mode_changed ) { + ir_pitch_neutral_init = ir_pitch_neutral; + slider1_init = from_fbw.channels[ RADIO_GAIN1 ]; + } + ir_pitch_neutral = ParamValInt16( ir_pitch_neutral_init, 60.000000, + from_fbw.channels[ RADIO_GAIN1 ], slider1_init ); + slider_1_val = ( float )ir_pitch_neutral; + } + if ( inflight_calib_mode == IF_CALIB_MODE_UP ) { + static int16_t ir_roll_neutral_init; + if ( mode_changed ) { + ir_roll_neutral_init = ir_roll_neutral; + slider2_init = from_fbw.channels[ RADIO_GAIN2 ]; + } + ir_roll_neutral = ParamValInt16( ir_roll_neutral_init, -60.000000, + from_fbw.channels[ RADIO_GAIN2 ], slider2_init ); + slider_2_val = ( float )ir_roll_neutral; + } + } + if ( pprz_mode == PPRZ_MODE_AUTO2 ) { + if ( inflight_calib_mode == IF_CALIB_MODE_UP ) { + static float course_pgain_init; + if ( mode_changed ) { + course_pgain_init = course_pgain; + slider1_init = from_fbw.channels[ RADIO_GAIN1 ]; + } + course_pgain = ParamValFloat( course_pgain_init, 0.100000, + from_fbw.channels[ RADIO_GAIN1 ], slider1_init ); + slider_1_val = ( float )course_pgain; + } + if ( inflight_calib_mode == IF_CALIB_MODE_UP ) { + static float max_roll_init; + if ( mode_changed ) { + max_roll_init = max_roll; + slider2_init = from_fbw.channels[ RADIO_GAIN2 ]; + } + max_roll = ParamValFloat( max_roll_init, -0.200000, + from_fbw.channels[ RADIO_GAIN2 ], slider2_init ); + slider_2_val = ( float )max_roll; + } + } +} + +#endif // INFLIGHT_CALIB_H diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/var/include/messages.h b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/messages.h new file mode 100644 index 0000000..fdb7a91 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/messages.h @@ -0,0 +1,348 @@ +/* Automatically generated from conf/messages.xml */ +/* Please DO NOT EDIT */ +#define DL_ID 0 +#define DL_BOOT 1 +#define DL_CALIB_START 2 +#define DL_CALIB_CONTRAST 3 +#define DL_TAKEOFF 4 +#define DL_RAD_OF_IR 5 +#define DL_ATTITUDE 6 +#define DL_ADC 7 +#define DL_GPS 8 +#define DL_NAVIGATION_REF 9 +#define DL_NAVIGATION 10 +#define DL_PPRZ_MODE 11 +#define DL_BAT 12 +#define DL_DEBUG 13 +#define DL_CLIMB_PID 14 +#define DL_DOWNLINK_STATUS 15 +#define DL_MODEM_STATUS 16 +#define DL_SETTINGS 17 +#define DL_DESIRED 18 +#define DL_WIND 19 +#define DL_IMU 20 +#define DL_RAW_IMU 21 +#define DL_KALMAN 22 +#define DL_MSG_NB 23 + +#define DOWNLINK_SEND_ID(md5sum){ \ + if (MODEM_CHECK_FREE_SPACE(20)) {\ + ModemStartMessage(DL_ID) \ + {\ + int i;\ + for(i = 0; i < 16; i++) {\ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(&md5sum[ i ])); \ + }\ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_BOOT(version){ \ + if (MODEM_CHECK_FREE_SPACE(6)) {\ + ModemStartMessage(DL_BOOT) \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(version)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_CALIB_START(){ \ + if (MODEM_CHECK_FREE_SPACE(4)) {\ + ModemStartMessage(DL_CALIB_START) \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_CALIB_CONTRAST(adc){ \ + if (MODEM_CHECK_FREE_SPACE(6)) {\ + ModemStartMessage(DL_CALIB_CONTRAST) \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(adc)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_TAKEOFF(cpu_time){ \ + if (MODEM_CHECK_FREE_SPACE(6)) {\ + ModemStartMessage(DL_TAKEOFF) \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(cpu_time)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_RAD_OF_IR(ir, rad, rad_of_ir, ir_roll_ntrl, ir_pitch_ntrl){ \ + if (MODEM_CHECK_FREE_SPACE(20)) {\ + ModemStartMessage(DL_RAD_OF_IR) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(ir)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rad)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rad_of_ir)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(ir_roll_ntrl)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(ir_pitch_ntrl)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_ATTITUDE(phi, psi, theta){ \ + if (MODEM_CHECK_FREE_SPACE(16)) {\ + ModemStartMessage(DL_ATTITUDE) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(phi)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(psi)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(theta)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_ADC(roll, pitch){ \ + if (MODEM_CHECK_FREE_SPACE(8)) {\ + ModemStartMessage(DL_ADC) \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(roll)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(pitch)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_GPS(mode, east, north, course, alt, speed, climb, tow){ \ + if (MODEM_CHECK_FREE_SPACE(33)) {\ + ModemStartMessage(DL_GPS) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(mode)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(east)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(north)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(course)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(alt)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(speed)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(climb)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(tow)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_NAVIGATION_REF(utm_east, utm_north){ \ + if (MODEM_CHECK_FREE_SPACE(12)) {\ + ModemStartMessage(DL_NAVIGATION_REF) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(utm_east)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(utm_north)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_NAVIGATION(cur_block, cur_stage, pos_x, pos_y, desired_course, dist2_wp, course_pgain, dist2_home){ \ + if (MODEM_CHECK_FREE_SPACE(30)) {\ + ModemStartMessage(DL_NAVIGATION) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(cur_block)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(cur_stage)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(pos_x)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(pos_y)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(desired_course)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(dist2_wp)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(course_pgain)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(dist2_home)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_PPRZ_MODE(ap_mode, ap_altitude, if_calib_mode, mcu1_status, lls_calib){ \ + if (MODEM_CHECK_FREE_SPACE(9)) {\ + ModemStartMessage(DL_PPRZ_MODE) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(ap_mode)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(ap_altitude)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(if_calib_mode)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(mcu1_status)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(lls_calib)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_BAT(voltage, flight_time, low_battery, block_time, stage_time){ \ + if (MODEM_CHECK_FREE_SPACE(12)) {\ + ModemStartMessage(DL_BAT) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(voltage)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(flight_time)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(low_battery)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(block_time)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(stage_time)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_DEBUG(i2c_nb_err, i2c_mcu1_nb_err, modem_nb_err, gps_nb_err, ppm_rate){ \ + if (MODEM_CHECK_FREE_SPACE(9)) {\ + ModemStartMessage(DL_DEBUG) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(i2c_nb_err)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(i2c_mcu1_nb_err)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(modem_nb_err)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(gps_nb_err)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(ppm_rate)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_CLIMB_PID(gaz, climb, sum_err, p_gain){ \ + if (MODEM_CHECK_FREE_SPACE(18)) {\ + ModemStartMessage(DL_CLIMB_PID) \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(gaz)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(climb)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(sum_err)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(p_gain)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_DOWNLINK_STATUS(run_time, rx_bytes, rx_msgs, rx_err, rx_bytes_rate, rx_msgs_rate){ \ + if (MODEM_CHECK_FREE_SPACE(28)) {\ + ModemStartMessage(DL_DOWNLINK_STATUS) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(run_time)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rx_bytes)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rx_msgs)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rx_err)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rx_bytes_rate)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(rx_msgs_rate)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_MODEM_STATUS(detected, valim, cd, nb_byte, nb_msg, nb_err){ \ + if (MODEM_CHECK_FREE_SPACE(22)) {\ + ModemStartMessage(DL_MODEM_STATUS) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(detected)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(valim)); \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(cd)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(nb_byte)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(nb_msg)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(nb_err)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_SETTINGS(mode, slider_1_val, slider_2_val){ \ + if (MODEM_CHECK_FREE_SPACE(13)) {\ + ModemStartMessage(DL_SETTINGS) \ + MODEM_PUT_1_BYTE_BY_ADDR((uint8_t*)(mode)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(slider_1_val)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(slider_2_val)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_DESIRED(roll, pitch, desired_x, desired_y, desired_altitude){ \ + if (MODEM_CHECK_FREE_SPACE(24)) {\ + ModemStartMessage(DL_DESIRED) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(roll)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(pitch)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(desired_x)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(desired_y)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(desired_altitude)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_WIND(dir, speed, mean_as, nb_sample, stddev){ \ + if (MODEM_CHECK_FREE_SPACE(22)) {\ + ModemStartMessage(DL_WIND) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(dir)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(speed)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(mean_as)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(nb_sample)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(stddev)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_IMU(gyro_x, gyro_y, gyro_z, accel_x, accel_y, accel_z){ \ + if (MODEM_CHECK_FREE_SPACE(28)) {\ + ModemStartMessage(DL_IMU) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(gyro_x)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(gyro_y)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(gyro_z)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(accel_x)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(accel_y)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(accel_z)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_RAW_IMU(raw_gx, raw_gy, raw_gz, raw_ax, raw_ay, raw_az){ \ + if (MODEM_CHECK_FREE_SPACE(16)) {\ + ModemStartMessage(DL_RAW_IMU) \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(raw_gx)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(raw_gy)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(raw_gz)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(raw_ax)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(raw_ay)); \ + MODEM_PUT_2_BYTE_BY_ADDR((uint8_t*)(raw_az)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define DOWNLINK_SEND_KALMAN(phi, phi_dot, phi_bias, theta, theta_dot, theta_bias){ \ + if (MODEM_CHECK_FREE_SPACE(28)) {\ + ModemStartMessage(DL_KALMAN) \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(phi)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(phi_dot)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(phi_bias)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(theta)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(theta_dot)); \ + MODEM_PUT_4_BYTE_BY_ADDR((uint8_t*)(theta_bias)); \ + ModemEndMessage() \ + } \ + else \ + modem_nb_ovrn++; \ +} + +#define MESSAGES_MD5SUM "\120\162\150\107\166\250\102\343\211\352\231\260\061\055\031\274" +// Load: intant(buffer) 16(37) 8(37) 13(37) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 9(58) 16(58) 8(58) 13(58) 24(70) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 9(58) 16(58) 8(58) 13(58) 24(70) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 12(61) 16(61) 8(61) 13(61) 24(73) 0(61) 16(61) 8(61) 13(61) 18(55) 9(64) 16(64) 8(64) 13(64) 24(70) 0(61) 16(61) 8(61) 13(61) 12(49) 0(49) 16(49) 8(49) 13(49) 24(61) 0(61) 16(61) 8(61) 13(61) 18(55) 9(64) 16(64) 8(64) 13(64) 24(70) 0(61) 16(61) 8(61) 13(61) 12(49) 0(49) 16(49) 8(49) 13(49) 24(61) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 9(58) 16(58) 8(58) 13(58) 24(70) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 9(58) 16(58) 8(58) 13(58) 24(70) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 12(61) 16(61) 8(61) 13(61) 24(73) 0(61) 16(61) 8(61) 13(61) 18(55) 9(64) 16(64) 8(64) 13(64) 24(70) 0(61) 16(61) 8(61) 13(61) 12(49) 0(49) 16(49) 8(49) 13(49) 24(61) 0(61) 16(61) 8(61) 13(61) 18(55) 9(64) 16(64) 8(64) 13(64) 24(70) 0(61) 16(61) 8(61) 13(61) 12(49) 0(49) 16(49) 8(49) 13(49) 24(61) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 9(58) 16(58) 8(58) 13(58) 24(70) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 12(49) 9(58) 16(58) 8(58) 13(58) 24(70) 0(61) 16(61) 8(61) 13(61) 18(55) 0(55) 16(55) 8(55) 13(55) 24(61) 0(61) 16(61) 8(61) 13(61) 0(37) 0(37) + +/*#define PeriodicSend() { // 10Hz // \ + static uint8_t i;\ + i++; if (i == 250) i = 0;\ + if (i % 5 == 0) PERIODIC_SEND_ATTITUDE();\ + if (i % 5 == 1) PERIODIC_SEND_ADC();\ + if (i % 5 == 2) PERIODIC_SEND_SETTINGS();\ + if (i % 10 == 3) PERIODIC_SEND_DESIRED();\ + if (i % 20 == 8) PERIODIC_SEND_BAT();\ + if (i % 20 == 18) PERIODIC_SEND_CLIMB_PID();\ + if (i % 50 == 9) PERIODIC_SEND_PPRZ_MODE();\ + if (i % 50 == 29) PERIODIC_SEND_DEBUG();\ + if (i % 100 == 49) PERIODIC_SEND_NAVIGATION_REF();\ + }*/ diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/var/include/radio.h b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/radio.h new file mode 100644 index 0000000..320362b --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/radio.h @@ -0,0 +1,99 @@ +/* This file has been generated from conf/radios/mc3030.xml */ +/* Please DO NOT EDIT */ + +#ifndef RADIO_H +#define RADIO_H + +#define RADIO_NAME "mc3030" + +#define RADIO_CTL_NB 9 + +#define RADIO_CTL_D 0 +#define RADIO_THROTTLE RADIO_CTL_D +#define RADIO_CTL_C 1 +#define RADIO_ROLL RADIO_CTL_C +#define RADIO_CTL_B 2 +#define RADIO_PITCH RADIO_CTL_B +#define RADIO_CTL_A 3 +#define RADIO_YAW RADIO_CTL_A +#define RADIO_CTL_G 4 +#define RADIO_MODE RADIO_CTL_G +#define RADIO_CTL_E 5 +#define RADIO_GAIN1 RADIO_CTL_E +#define RADIO_CTL_F 6 +#define RADIO_GAIN2 RADIO_CTL_F +#define RADIO_CTL_H 7 +#define RADIO_LLS RADIO_CTL_H +#define RADIO_CTL_I 8 +#define RADIO_CALIB RADIO_CTL_I + +#define PPM_MIN_PULSE_WIDTH 850ul*CLOCK +#define PPM_MAX_PULSE_WIDTH 2100ul*CLOCK +#define PPM_SYNC_PULSE (uint8_t)(((uint32_t)(5000ul*CLOCK))/1024ul) + +#define LastRadioFromPpm() {\ + static uint8_t avg_cpt = 0; /* Counter for averaging */\ + int16_t tmp_radio;\ + tmp_radio = ppm_pulses[ RADIO_THROTTLE ] - (CLOCK*1000);\ + last_radio[ RADIO_THROTTLE ] = tmp_radio * (MAX_PPRZ / 1 / (float)(CLOCK*(2200-1000)));\ + if (last_radio[ RADIO_THROTTLE ] > MAX_PPRZ) last_radio[ RADIO_THROTTLE ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_THROTTLE ] < 0) last_radio[ RADIO_THROTTLE ] = 0; \ +\ + tmp_radio = ppm_pulses[ RADIO_ROLL ] - (CLOCK*1600);\ + last_radio[ RADIO_ROLL ] = tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/1/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/1/(float)(CLOCK*(1000-1600))));\ + if (last_radio[ RADIO_ROLL ] > MAX_PPRZ) last_radio[ RADIO_ROLL ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_ROLL ] < MIN_PPRZ) last_radio[ RADIO_ROLL ] = MIN_PPRZ; \ +\ + tmp_radio = ppm_pulses[ RADIO_PITCH ] - (CLOCK*1600);\ + last_radio[ RADIO_PITCH ] = tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/1/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/1/(float)(CLOCK*(1000-1600))));\ + if (last_radio[ RADIO_PITCH ] > MAX_PPRZ) last_radio[ RADIO_PITCH ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_PITCH ] < MIN_PPRZ) last_radio[ RADIO_PITCH ] = MIN_PPRZ; \ +\ + tmp_radio = ppm_pulses[ RADIO_YAW ] - (CLOCK*1600);\ + last_radio[ RADIO_YAW ] = tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/1/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/1/(float)(CLOCK*(1000-1600))));\ + if (last_radio[ RADIO_YAW ] > MAX_PPRZ) last_radio[ RADIO_YAW ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_YAW ] < MIN_PPRZ) last_radio[ RADIO_YAW ] = MIN_PPRZ; \ +\ + tmp_radio = ppm_pulses[ RADIO_MODE ] - (CLOCK*1600);\ + avg_last_radio[ RADIO_MODE ] += tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(1000-1600))));\ + tmp_radio = ppm_pulses[ RADIO_GAIN1 ] - (CLOCK*1600);\ + avg_last_radio[ RADIO_GAIN1 ] += tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(1000-1600))));\ + tmp_radio = ppm_pulses[ RADIO_GAIN2 ] - (CLOCK*1600);\ + avg_last_radio[ RADIO_GAIN2 ] += tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(1000-1600))));\ + tmp_radio = ppm_pulses[ RADIO_LLS ] - (CLOCK*1600);\ + avg_last_radio[ RADIO_LLS ] += tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(1000-1600))));\ + tmp_radio = ppm_pulses[ RADIO_CALIB ] - (CLOCK*1600);\ + avg_last_radio[ RADIO_CALIB ] += tmp_radio * (tmp_radio >=0 ? (MAX_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(2200-1600))) : (MIN_PPRZ/AVERAGING_PERIOD/(float)(CLOCK*(1000-1600))));\ +avg_cpt++;\ + if (avg_cpt == AVERAGING_PERIOD) {\ + avg_cpt = 0;\ + last_radio[ RADIO_MODE ] = avg_last_radio[ RADIO_MODE ];\ + avg_last_radio[ RADIO_MODE ] = 0;\ + if (last_radio[ RADIO_MODE ] > MAX_PPRZ) last_radio[ RADIO_MODE ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_MODE ] < MIN_PPRZ) last_radio[ RADIO_MODE ] = MIN_PPRZ; \ +\ + last_radio[ RADIO_GAIN1 ] = avg_last_radio[ RADIO_GAIN1 ];\ + avg_last_radio[ RADIO_GAIN1 ] = 0;\ + if (last_radio[ RADIO_GAIN1 ] > MAX_PPRZ) last_radio[ RADIO_GAIN1 ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_GAIN1 ] < MIN_PPRZ) last_radio[ RADIO_GAIN1 ] = MIN_PPRZ; \ +\ + last_radio[ RADIO_GAIN2 ] = avg_last_radio[ RADIO_GAIN2 ];\ + avg_last_radio[ RADIO_GAIN2 ] = 0;\ + if (last_radio[ RADIO_GAIN2 ] > MAX_PPRZ) last_radio[ RADIO_GAIN2 ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_GAIN2 ] < MIN_PPRZ) last_radio[ RADIO_GAIN2 ] = MIN_PPRZ; \ +\ + last_radio[ RADIO_LLS ] = avg_last_radio[ RADIO_LLS ];\ + avg_last_radio[ RADIO_LLS ] = 0;\ + if (last_radio[ RADIO_LLS ] > MAX_PPRZ) last_radio[ RADIO_LLS ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_LLS ] < MIN_PPRZ) last_radio[ RADIO_LLS ] = MIN_PPRZ; \ +\ + last_radio[ RADIO_CALIB ] = avg_last_radio[ RADIO_CALIB ];\ + avg_last_radio[ RADIO_CALIB ] = 0;\ + if (last_radio[ RADIO_CALIB ] > MAX_PPRZ) last_radio[ RADIO_CALIB ] = MAX_PPRZ;\ + else if (last_radio[ RADIO_CALIB ] < MIN_PPRZ) last_radio[ RADIO_CALIB ] = MIN_PPRZ; \ +\ + last_radio_contains_avg_channels = TRUE;\ + }\ +} + +#endif // RADIO_H diff --git a/targets/wasm-tacle/parallel/PapaBench/sw/var/include/ubx_protocol.h b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/ubx_protocol.h new file mode 100644 index 0000000..2b552b4 --- /dev/null +++ b/targets/wasm-tacle/parallel/PapaBench/sw/var/include/ubx_protocol.h @@ -0,0 +1,72 @@ +/* Generated from conf/ubx.xml */ +/* Please DO NOT EDIT */ + +#define UBX_SYNC1 0xB5 +#define UBX_SYNC2 0x62 + +#define UBX_NAV_ID 0x01 + +#define UBX_NAV_POSLLH_ID 0x02 +#define UBX_NAV_POSLLH_ITOW(_ubx_payload) (*((uint32_t*)(_ubx_payload+0))) +#define UBX_NAV_POSLLH_LON(_ubx_payload) (*((int32_t*)(_ubx_payload+4))) +#define UBX_NAV_POSLLH_LAT(_ubx_payload) (*((int32_t*)(_ubx_payload+8))) +#define UBX_NAV_POSLLH_HEIGHT(_ubx_payload) (*((int32_t*)(_ubx_payload+12))) +#define UBX_NAV_POSLLH_HMSL(_ubx_payload) (*((int32_t*)(_ubx_payload+16))) +#define UBX_NAV_POSLLH_Hacc(_ubx_payload) (*((uint32_t*)(_ubx_payload+20))) +#define UBX_NAV_POSLLH_Vacc(_ubx_payload) (*((uint32_t*)(_ubx_payload+24))) + +#define UBX_NAV_POSUTM_ID 0x08 +#define UBX_NAV_POSUTM_ITOW(_ubx_payload) (*((uint32_t*)(_ubx_payload+0))) +#define UBX_NAV_POSUTM_EAST(_ubx_payload) (*((int32_t*)(_ubx_payload+4))) +#define UBX_NAV_POSUTM_NORTH(_ubx_payload) (*((int32_t*)(_ubx_payload+8))) +#define UBX_NAV_POSUTM_ALT(_ubx_payload) (*((int32_t*)(_ubx_payload+12))) +#define UBX_NAV_POSUTM_ZONE(_ubx_payload) (*((int8_t*)(_ubx_payload+16))) +#define UBX_NAV_POSUTM_HEM(_ubx_payload) (*((int8_t*)(_ubx_payload+17))) + +#define UBX_NAV_STATUS_ID 0x03 +#define UBX_NAV_STATUS_ITOW(_ubx_payload) (*((uint32_t*)(_ubx_payload+0))) +#define UBX_NAV_STATUS_GPSfix(_ubx_payload) (*((uint8_t*)(_ubx_payload+4))) +#define UBX_NAV_STATUS_Flags(_ubx_payload) (*((uint8_t*)(_ubx_payload+5))) +#define UBX_NAV_STATUS_DiffS(_ubx_payload) (*((uint8_t*)(_ubx_payload+6))) +#define UBX_NAV_STATUS_res(_ubx_payload) (*((uint8_t*)(_ubx_payload+7))) +#define UBX_NAV_STATUS_TTFF(_ubx_payload) (*((uint32_t*)(_ubx_payload+8))) +#define UBX_NAV_STATUS_MSSS(_ubx_payload) (*((uint32_t*)(_ubx_payload+12))) + +#define UBX_NAV_VELNED_ID 0x12 +#define UBX_NAV_VELNED_ITOW(_ubx_payload) (*((uint32_t*)(_ubx_payload+0))) +#define UBX_NAV_VELNED_VEL_N(_ubx_payload) (*((int32_t*)(_ubx_payload+4))) +#define UBX_NAV_VELNED_VEL_E(_ubx_payload) (*((int32_t*)(_ubx_payload+8))) +#define UBX_NAV_VELNED_VEL_D(_ubx_payload) (*((int32_t*)(_ubx_payload+12))) +#define UBX_NAV_VELNED_Speed(_ubx_payload) (*((uint32_t*)(_ubx_payload+16))) +#define UBX_NAV_VELNED_GSpeed(_ubx_payload) (*((uint32_t*)(_ubx_payload+20))) +#define UBX_NAV_VELNED_Heading(_ubx_payload) (*((int32_t*)(_ubx_payload+24))) +#define UBX_NAV_VELNED_SAcc(_ubx_payload) (*((uint32_t*)(_ubx_payload+28))) +#define UBX_NAV_VELNED_CAcc(_ubx_payload) (*((uint32_t*)(_ubx_payload+32))) + +#define UBX_NAV_SVINFO_ID 0x30 +#define UBX_NAV_SVINFO_ITOW(_ubx_payload) (*((uint32_t*)(_ubx_payload+0))) +#define UBX_NAV_SVINFO_NCH(_ubx_payload) (*((uint8_t*)(_ubx_payload+4))) +#define UBX_NAV_SVINFO_RES1(_ubx_payload) (*((uint8_t*)(_ubx_payload+5))) +#define UBX_NAV_SVINFO_RES2(_ubx_payload) (*((uint8_t*)(_ubx_payload+6))) +#define UBX_NAV_SVINFO_chn(_ubx_payload,_ubx_block) (*((uint8_t*)(_ubx_payload+7+12*_ubx_block))) +#define UBX_NAV_SVINFO_SVID(_ubx_payload,_ubx_block) (*((uint8_t*)(_ubx_payload+8+12*_ubx_block))) +#define UBX_NAV_SVINFO_Flags(_ubx_payload,_ubx_block) (*((uint8_t*)(_ubx_payload+9+12*_ubx_block))) +#define UBX_NAV_SVINFO_QI(_ubx_payload,_ubx_block) (*((int8_t*)(_ubx_payload+10+12*_ubx_block))) +#define UBX_NAV_SVINFO_CNO(_ubx_payload,_ubx_block) (*((uint8_t*)(_ubx_payload+11+12*_ubx_block))) +#define UBX_NAV_SVINFO_Elev(_ubx_payload,_ubx_block) (*((int8_t*)(_ubx_payload+12+12*_ubx_block))) +#define UBX_NAV_SVINFO_Azim(_ubx_payload,_ubx_block) (*((int16_t*)(_ubx_payload+13+12*_ubx_block))) +#define UBX_NAV_SVINFO_PRRes(_ubx_payload,_ubx_block) (*((int32_t*)(_ubx_payload+15+12*_ubx_block))) + +#define UBX_USR_ID 0x40 + +#define UBX_USR_IRSIM_ID 0x01 +#define UBX_USR_IRSIM_ROLL(_ubx_payload) (*((int16_t*)(_ubx_payload+0))) +#define UBX_USR_IRSIM_PITCH(_ubx_payload) (*((int16_t*)(_ubx_payload+2))) + +#define UBX_USR_SERVOS_ID 0x02 +#define UBX_USR_SERVOS_N(_ubx_payload) (*((int8_t*)(_ubx_payload+0))) +#define UBX_USR_SERVOS_WIDTH(_ubx_payload,_ubx_block) (*((uint16_t*)(_ubx_payload+1+2*_ubx_block))) + +#define UBX_USR_PPM_ID 0x03 +#define UBX_USR_PPM_N(_ubx_payload) (*((int8_t*)(_ubx_payload+0))) +#define UBX_USR_PPM_WIDTH(_ubx_payload,_ubx_block) (*((uint16_t*)(_ubx_payload+1+2*_ubx_block))) diff --git a/targets/wasm-tacle/parallel/rosace/README.txt b/targets/wasm-tacle/parallel/rosace/README.txt new file mode 100644 index 0000000..9517236 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/README.txt @@ -0,0 +1,6 @@ +Hand-written C POSIX implementation of the ROSACE Case Study from + https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/c_posix_implementation/ + +The implementation is made of 5 threads assumed to be running at various +frequencies. The 5 original pthread threads were separated into distinct +sub-folders per thread here. diff --git a/targets/wasm-tacle/parallel/rosace/thread1/assemblage.c b/targets/wasm-tacle/parallel/rosace/thread1/assemblage.c new file mode 100644 index 0000000..478ec4e --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/assemblage.c @@ -0,0 +1,547 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage.c + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#include "assemblage.h" +#include "assemblage_includes.h" + +// Definition of true and false here instead of using stdbool.h +#define true 1 +#define false 0 + + +double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +double Vz_control_50483_delta_e_c_elevator489_delta_e_c; +double Va_filter_100449_Va_f_Va_control_50474_Va_f[ 2 ]; +double Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ 2 ]; +double q_filter_100455_q_f_Va_control_50474_q_f[ 2 ]; +double Va_c_Va_control_50474_Va_c; +double h_filter_100446_h_f_altitude_hold_50464_h_f[ 2 ]; +double h_c_altitude_hold_50464_h_c; +double Va_control_50474_delta_th_c_delta_th_c; +double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +double elevator489_delta_e_aircraft_dynamics495_delta_e[ 3 ] = {0.0120096156525, 0.0120096156525, 0.0120096156525}; +double engine486_T_aircraft_dynamics495_T[ 3 ] = {41813.9211946, 41813.9211946, 41813.9211946}; +double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +double Va_control_50474_delta_th_c_engine486_delta_th_c; +double Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ 2 ]; +double altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c; +double q_filter_100455_q_f_Vz_control_50483_q_f[ 2 ]; +double az_filter_100458_az_f_Vz_control_50483_az_f[ 2 ]; +double Vz_control_50483_delta_e_c_delta_e_c; + +int Va_filter_100449_fun( void *args ) +{ + double Va_f; + static int Va_rcell = 0; + const struct write_proto_t Va_f_Va_control_50474_Va_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Va_f_Va_control_50474_Va_f_wcell = 0; + static int instance = 0; + + Va_f = Va_filter_100( aircraft_dynamics495_Va_Va_filter_100449_Va[ Va_rcell ] ); + Va_rcell = ( Va_rcell + 1 ) % 2; + if ( must_write( Va_f_Va_control_50474_Va_f_write, instance ) ) { + Va_filter_100449_Va_f_Va_control_50474_Va_f[ Va_f_Va_control_50474_Va_f_wcell ] = + Va_f; + Va_f_Va_control_50474_Va_f_wcell = ( Va_f_Va_control_50474_Va_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int elevator489_fun( void *args ) +{ + double delta_e; + static int delta_e_aircraft_dynamics495_delta_e_wcell = 1; + static int instance = 0; + + delta_e = elevator( Vz_control_50483_delta_e_c_elevator489_delta_e_c ); + elevator489_delta_e_aircraft_dynamics495_delta_e[ delta_e_aircraft_dynamics495_delta_e_wcell ] + = delta_e; + delta_e_aircraft_dynamics495_delta_e_wcell = + ( delta_e_aircraft_dynamics495_delta_e_wcell + 1 ) % 3; + instance++; + + return 0; +} + +int Va_control_50474_fun( void *args ) +{ + double delta_th_c; + static int Va_f_rcell = 0; + static int Vz_f_rcell = 0; + static int q_f_rcell = 0; + static int instance = 0; + + delta_th_c = Va_control_50( + Va_filter_100449_Va_f_Va_control_50474_Va_f[ Va_f_rcell ], + Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ Vz_f_rcell ], + q_filter_100455_q_f_Va_control_50474_q_f[ q_f_rcell ], + Va_c_Va_control_50474_Va_c ); + Va_f_rcell = ( Va_f_rcell + 1 ) % 2; + Vz_f_rcell = ( Vz_f_rcell + 1 ) % 2; + q_f_rcell = ( q_f_rcell + 1 ) % 2; + Va_control_50474_delta_th_c_engine486_delta_th_c = delta_th_c; + Va_control_50474_delta_th_c_delta_th_c = delta_th_c; + instance++; + + return 0; +} + +int Va_c0_fun( void *args ) +{ + double Va_c; + static int instance = 0; + + Va_c = input_Va_c(); + Va_c_Va_control_50474_Va_c = Va_c; + instance++; + + return 0; +} + +int altitude_hold_50464_fun( void *args ) +{ + double Vz_c; + static int h_f_rcell = 0; + static int instance = 0; + + Vz_c = altitude_hold_50( h_filter_100446_h_f_altitude_hold_50464_h_f[ h_f_rcell ], + h_c_altitude_hold_50464_h_c ); + h_f_rcell = ( h_f_rcell + 1 ) % 2; + altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c = Vz_c; + instance++; + + return 0; +} + +int delta_th_c0_fun( void *args ) +{ + static int instance = 0; + + output_delta_th_c( Va_control_50474_delta_th_c_delta_th_c ); + instance++; + + return 0; +} + +int az_filter_100458_fun( void *args ) +{ + double az_f; + static int az_rcell = 0; + const struct write_proto_t az_f_Vz_control_50483_az_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int az_f_Vz_control_50483_az_f_wcell = 0; + static int instance = 0; + + az_f = az_filter_100( aircraft_dynamics495_az_az_filter_100458_az[ az_rcell ] ); + az_rcell = ( az_rcell + 1 ) % 2; + if ( must_write( az_f_Vz_control_50483_az_f_write, instance ) ) { + az_filter_100458_az_f_Vz_control_50483_az_f[ az_f_Vz_control_50483_az_f_wcell ] = + az_f; + az_f_Vz_control_50483_az_f_wcell = ( az_f_Vz_control_50483_az_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int Vz_filter_100452_fun( void *args ) +{ + double Vz_f; + static int Vz_rcell = 0; + const struct write_proto_t Vz_f_Va_control_50474_Vz_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_f_Va_control_50474_Vz_f_wcell = 0; + const struct write_proto_t Vz_f_Vz_control_50483_Vz_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_f_Vz_control_50483_Vz_f_wcell = 0; + static int instance = 0; + + Vz_f = Vz_filter_100( aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ Vz_rcell ] ); + Vz_rcell = ( Vz_rcell + 1 ) % 2; + if ( must_write( Vz_f_Va_control_50474_Vz_f_write, instance ) ) { + Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ Vz_f_Va_control_50474_Vz_f_wcell ] = + Vz_f; + Vz_f_Va_control_50474_Vz_f_wcell = ( Vz_f_Va_control_50474_Vz_f_wcell + 1 ) % 2; + } + if ( must_write( Vz_f_Vz_control_50483_Vz_f_write, instance ) ) { + Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ Vz_f_Vz_control_50483_Vz_f_wcell ] = + Vz_f; + Vz_f_Vz_control_50483_Vz_f_wcell = ( Vz_f_Vz_control_50483_Vz_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int q_filter_100455_fun( void *args ) +{ + double q_f; + static int q_rcell = 0; + const struct write_proto_t q_f_Va_control_50474_q_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_f_Va_control_50474_q_f_wcell = 0; + const struct write_proto_t q_f_Vz_control_50483_q_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_f_Vz_control_50483_q_f_wcell = 0; + static int instance = 0; + + q_f = q_filter_100( aircraft_dynamics495_q_q_filter_100455_q[ q_rcell ] ); + q_rcell = ( q_rcell + 1 ) % 2; + if ( must_write( q_f_Va_control_50474_q_f_write, instance ) ) { + q_filter_100455_q_f_Va_control_50474_q_f[ q_f_Va_control_50474_q_f_wcell ] = q_f; + q_f_Va_control_50474_q_f_wcell = ( q_f_Va_control_50474_q_f_wcell + 1 ) % 2; + } + if ( must_write( q_f_Vz_control_50483_q_f_write, instance ) ) { + q_filter_100455_q_f_Vz_control_50483_q_f[ q_f_Vz_control_50483_q_f_wcell ] = q_f; + q_f_Vz_control_50483_q_f_wcell = ( q_f_Vz_control_50483_q_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int aircraft_dynamics495_fun( void *args ) +{ + struct aircraft_dynamics_outs_t aircraft_dynamics495_fun_outs; + static int delta_e_rcell = 0; + static int T_rcell = 0; + const struct write_proto_t Va_Va_filter_100449_Va_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Va_Va_filter_100449_Va_wcell = 0; + const struct write_proto_t Vz_Vz_filter_100452_Vz_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_Vz_filter_100452_Vz_wcell = 0; + const struct write_proto_t q_q_filter_100455_q_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_q_filter_100455_q_wcell = 0; + const struct write_proto_t az_az_filter_100458_az_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int az_az_filter_100458_az_wcell = 0; + const struct write_proto_t h_h_filter_100446_h_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int h_h_filter_100446_h_wcell = 0; + static int instance = 0; + + aircraft_dynamics( + elevator489_delta_e_aircraft_dynamics495_delta_e[ delta_e_rcell ], + engine486_T_aircraft_dynamics495_T[ T_rcell ], &aircraft_dynamics495_fun_outs ); + delta_e_rcell = ( delta_e_rcell + 1 ) % 3; + T_rcell = ( T_rcell + 1 ) % 3; + if ( must_write( Va_Va_filter_100449_Va_write, instance ) ) { + aircraft_dynamics495_Va_Va_filter_100449_Va[ Va_Va_filter_100449_Va_wcell ] = + aircraft_dynamics495_fun_outs.Va; + Va_Va_filter_100449_Va_wcell = ( Va_Va_filter_100449_Va_wcell + 1 ) % 2; + } + if ( must_write( Vz_Vz_filter_100452_Vz_write, instance ) ) { + aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ Vz_Vz_filter_100452_Vz_wcell ] = + aircraft_dynamics495_fun_outs.Vz; + Vz_Vz_filter_100452_Vz_wcell = ( Vz_Vz_filter_100452_Vz_wcell + 1 ) % 2; + } + if ( must_write( q_q_filter_100455_q_write, instance ) ) { + aircraft_dynamics495_q_q_filter_100455_q[ q_q_filter_100455_q_wcell ] = + aircraft_dynamics495_fun_outs.q; + q_q_filter_100455_q_wcell = ( q_q_filter_100455_q_wcell + 1 ) % 2; + } + if ( must_write( az_az_filter_100458_az_write, instance ) ) { + aircraft_dynamics495_az_az_filter_100458_az[ az_az_filter_100458_az_wcell ] = + aircraft_dynamics495_fun_outs.az; + az_az_filter_100458_az_wcell = ( az_az_filter_100458_az_wcell + 1 ) % 2; + } + if ( must_write( h_h_filter_100446_h_write, instance ) ) { + aircraft_dynamics495_h_h_filter_100446_h[ h_h_filter_100446_h_wcell ] = + aircraft_dynamics495_fun_outs.h; + h_h_filter_100446_h_wcell = ( h_h_filter_100446_h_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int h_filter_100446_fun( void *args ) +{ + double h_f; + static int h_rcell = 0; + const struct write_proto_t h_f_altitude_hold_50464_h_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int h_f_altitude_hold_50464_h_f_wcell = 0; + static int instance = 0; + + h_f = h_filter_100( aircraft_dynamics495_h_h_filter_100446_h[ h_rcell ] ); + h_rcell = ( h_rcell + 1 ) % 2; + if ( must_write( h_f_altitude_hold_50464_h_f_write, instance ) ) { + h_filter_100446_h_f_altitude_hold_50464_h_f[ h_f_altitude_hold_50464_h_f_wcell ] = + h_f; + h_f_altitude_hold_50464_h_f_wcell = ( h_f_altitude_hold_50464_h_f_wcell + 1 ) % + 2; + } + instance++; + + return 0; +} + +int engine486_fun( void *args ) +{ + double T; + static int T_aircraft_dynamics495_T_wcell = 1; + static int instance = 0; + + T = engine( Va_control_50474_delta_th_c_engine486_delta_th_c ); + engine486_T_aircraft_dynamics495_T[ T_aircraft_dynamics495_T_wcell ] = T; + T_aircraft_dynamics495_T_wcell = ( T_aircraft_dynamics495_T_wcell + 1 ) % 3; + instance++; + + return 0; +} + +int Vz_control_50483_fun( void *args ) +{ + double delta_e_c; + static int Vz_f_rcell = 0; + static int q_f_rcell = 0; + static int az_f_rcell = 0; + static int instance = 0; + + delta_e_c = Vz_control_50( + Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ Vz_f_rcell ], + altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c, + q_filter_100455_q_f_Vz_control_50483_q_f[ q_f_rcell ], + az_filter_100458_az_f_Vz_control_50483_az_f[ az_f_rcell ] ); + Vz_f_rcell = ( Vz_f_rcell + 1 ) % 2; + q_f_rcell = ( q_f_rcell + 1 ) % 2; + az_f_rcell = ( az_f_rcell + 1 ) % 2; + Vz_control_50483_delta_e_c_delta_e_c = delta_e_c; + Vz_control_50483_delta_e_c_elevator489_delta_e_c = delta_e_c; + instance++; + + return 0; +} + +int delta_e_c0_fun( void *args ) +{ + static int instance = 0; + + output_delta_e_c( Vz_control_50483_delta_e_c_delta_e_c ); + instance++; + + return 0; +} + +int h_c0_fun( void *args ) +{ + double h_c; + static int instance = 0; + + h_c = input_h_c(); + h_c_altitude_hold_50464_h_c = h_c; + instance++; + + return 0; +} + +#define PLUD_TASK_NUMBER 15 +static struct nonencoded_task_params static_task_set[ PLUD_TASK_NUMBER ] = { + { "h_c0", 1000, 0, 1, 1000, h_c0_fun }, + { "delta_e_c0", 200, 0, 1, 200, delta_e_c0_fun }, + { "Vz_control_50483", 200, 0, 1, 200, Vz_control_50483_fun }, + { "engine486", 50, 0, 1, 50, engine486_fun }, + { "h_filter_100446", 100, 0, 1, 100, h_filter_100446_fun }, + { "aircraft_dynamics495", 50, 0, 1, 50, aircraft_dynamics495_fun }, + { "q_filter_100455", 100, 0, 1, 100, q_filter_100455_fun }, + { "Vz_filter_100452", 100, 0, 1, 100, Vz_filter_100452_fun }, + { "az_filter_100458", 100, 0, 1, 100, az_filter_100458_fun }, + { "delta_th_c0", 200, 0, 1, 200, delta_th_c0_fun }, + { "altitude_hold_50464", 200, 0, 1, 200, altitude_hold_50464_fun }, + { "Va_c0", 1000, 0, 1, 1000, Va_c0_fun }, + { "Va_control_50474", 200, 0, 1, 200, Va_control_50474_fun }, + { "elevator489", 50, 0, 1, 50, elevator489_fun }, + { "Va_filter_100449", 100, 0, 1, 100, Va_filter_100449_fun } +}; + + + +void get_task_set ( int *task_number, struct nonencoded_task_params **task_set ) +{ + *task_number = PLUD_TASK_NUMBER; + *task_set = static_task_set; +} + +static struct job_prec engine486_aircraft_dynamics495_pcpat[ 1 ] = { {0, 1} }; +static struct job_prec Va_filter_100449_Va_control_50474_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec q_filter_100455_Va_control_50474_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec q_filter_100455_Vz_control_50483_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec aircraft_dynamics495_q_filter_100455_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Va_c0_Va_control_50474_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_control_50483_delta_e_c0_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_control_50483_elevator489_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_filter_100452_Va_control_50474_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Vz_filter_100452_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec h_filter_100446_altitude_hold_50464_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_az_filter_100458_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec elevator489_aircraft_dynamics495_pcpat[ 1 ] = { {0, 1} }; +static struct job_prec aircraft_dynamics495_Vz_filter_100452_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec az_filter_100458_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec h_c0_altitude_hold_50464_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec altitude_hold_50464_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_Va_filter_100449_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_h_filter_100446_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Va_control_50474_engine486_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Va_control_50474_delta_th_c0_pcpat[ 1 ] = { {0, 0} }; + +#define PLUD_PREC_NUMBER 21 +static struct multirate_precedence static_prec_set[ PLUD_PREC_NUMBER ] = { + { + "engine486", "aircraft_dynamics495", 0, 1, NULL, + engine486_aircraft_dynamics495_pcpat + }, + { + "Va_filter_100449", "Va_control_50474", 0, 1, NULL, + Va_filter_100449_Va_control_50474_pcpat + }, + { + "q_filter_100455", "Va_control_50474", 0, 1, NULL, + q_filter_100455_Va_control_50474_pcpat + }, + { + "q_filter_100455", "Vz_control_50483", 0, 1, NULL, + q_filter_100455_Vz_control_50483_pcpat + }, + { + "aircraft_dynamics495", "q_filter_100455", 0, 1, NULL, + aircraft_dynamics495_q_filter_100455_pcpat + }, + { "Va_c0", "Va_control_50474", 0, 1, NULL, Va_c0_Va_control_50474_pcpat }, + { + "Vz_control_50483", "delta_e_c0", 0, 1, NULL, + Vz_control_50483_delta_e_c0_pcpat + }, + { + "Vz_control_50483", "elevator489", 0, 1, NULL, + Vz_control_50483_elevator489_pcpat + }, + { + "Vz_filter_100452", "Va_control_50474", 0, 1, NULL, + Vz_filter_100452_Va_control_50474_pcpat + }, + { + "Vz_filter_100452", "Vz_control_50483", 0, 1, NULL, + Vz_filter_100452_Vz_control_50483_pcpat + }, + { + "h_filter_100446", "altitude_hold_50464", 0, 1, NULL, + h_filter_100446_altitude_hold_50464_pcpat + }, + { + "aircraft_dynamics495", "az_filter_100458", 0, 1, NULL, + aircraft_dynamics495_az_filter_100458_pcpat + }, + { + "elevator489", "aircraft_dynamics495", 0, 1, NULL, + elevator489_aircraft_dynamics495_pcpat + }, + { + "aircraft_dynamics495", "Vz_filter_100452", 0, 1, NULL, + aircraft_dynamics495_Vz_filter_100452_pcpat + }, + { + "az_filter_100458", "Vz_control_50483", 0, 1, NULL, + az_filter_100458_Vz_control_50483_pcpat + }, + { + "h_c0", "altitude_hold_50464", 0, 1, NULL, h_c0_altitude_hold_50464_pcpat + }, + { + "altitude_hold_50464", "Vz_control_50483", 0, 1, NULL, + altitude_hold_50464_Vz_control_50483_pcpat + }, + { + "aircraft_dynamics495", "Va_filter_100449", 0, 1, NULL, + aircraft_dynamics495_Va_filter_100449_pcpat + }, + { + "aircraft_dynamics495", "h_filter_100446", 0, 1, NULL, + aircraft_dynamics495_h_filter_100446_pcpat + }, + { + "Va_control_50474", "engine486", 0, 1, NULL, + Va_control_50474_engine486_pcpat + }, + { + "Va_control_50474", "delta_th_c0", 0, 1, NULL, + Va_control_50474_delta_th_c0_pcpat + } +}; + +void get_precedence_set ( int *prec_number, + struct multirate_precedence **prec_set ) +{ + *prec_number = PLUD_PREC_NUMBER; + *prec_set = static_prec_set; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread1/assemblage.h b/targets/wasm-tacle/parallel/rosace/thread1/assemblage.h new file mode 100644 index 0000000..0ebd5b0 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/assemblage.h @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _assemblage_H +#define _assemblage_H +#include "nonencoded_task_params.h" +#include "multirate_precedence.h" +#include "com_patterns.h" +#include "types.h" + +void get_task_set( int *task_number, struct nonencoded_task_params **task_set ); + +void get_precedence_set( int *prec_number, + struct multirate_precedence **presc ); + + +#define H_C0 0 +#define DELTA_E_C0 1 +#define VZ_CONTROL 2 +#define ENGINE 3 +#define H_FILTER 4 +#define AIRCRAFT_DYN 5 +#define Q_FILTER 6 +#define VZ_FILTER 7 +#define AZ_FILTER 8 +#define DELTA_TH_C0 9 +#define ALTI_HOLD 10 +#define VA_C0 11 +#define VA_CONTROL 12 +#define ELEVATOR 13 +#define VA_FILTER 14 + + + + + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.c b/targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.c new file mode 100644 index 0000000..d1dcd3a --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.c @@ -0,0 +1,1212 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.c + + Author: unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.c + + Changes: no major functional changes + + License: see above + +*/ + +#include "wcclibm.h" +#include "assemblage_includes.h" + + +#define MATH_COS cosf +#define MATH_SIN sinf +#define pow powf +#define atan atanf +#define sin sinf +#define sqrt sqrtf + +/* + The following include file is generated by the Prelude compiler + Theoretically we should include main node specific include + i.e. assemblage_vX.h but we know that every main node + assemblage, assemblage_v2, assemblage_v3, etc... share the + very same data type. +*/ + +/* Period/Frequency of the nodes */ +const REAL_TYPE dt = 1.0f / 200.0; +const REAL_TYPE dt_de = 1.0 / 200.0; +const REAL_TYPE dt_dx = 1.0 / 200.0; + +/* Controller parameters */ +/* Altitude hold */ +const REAL_TYPE Kp_h = 0.1014048; +const REAL_TYPE Ki_h = 0.0048288; +const REAL_TYPE h_switch = 50.0; + +// Setpoint commands +REAL_TYPE Vz_c = -2.5; +REAL_TYPE Va_c = 0.0; +REAL_TYPE h_c = 10000; + +/* Va Speed controller */ +const REAL_TYPE K1_intVa = 0.049802610664357; +const REAL_TYPE K1_Va = -0.486813084356079; +const REAL_TYPE K1_Vz = -0.077603095495388; +const REAL_TYPE K1_q = 21.692383376322041; + +/* Vz Speed controller */ +const REAL_TYPE K2_intVz = 0.000627342822264; +const REAL_TYPE K2_Vz = -0.003252836726554; +const REAL_TYPE K2_q = 0.376071446897134; +const REAL_TYPE K2_az = -0.001566907423747; + +/* Trimming parameters */ +const REAL_TYPE h_eq = 10000.0; +const REAL_TYPE Va_eq = 230.0; +const REAL_TYPE Vz_eq = 0.0; +const REAL_TYPE alpha_eq = 0.026485847681737; +const REAL_TYPE theta_eq = 0.026485847681737; + +/* Atmosphere parameters */ +const REAL_TYPE rho0 = 1.225; +const REAL_TYPE g0 = 9.80665; +const REAL_TYPE T0_0 = 288.15; +const REAL_TYPE T0_h = -0.0065; +const REAL_TYPE Rs = 287.05; + +/* Aircraft parameters */ +const REAL_TYPE masse = 57837.5; +const REAL_TYPE I_y = 3781272.0; +const REAL_TYPE S = 122.6; +const REAL_TYPE cbar = 4.29; +const REAL_TYPE CD_0 = 0.016; +const REAL_TYPE CD_alpha = 2.5; +const REAL_TYPE CD_deltae = 0.05; +const REAL_TYPE CL_alpha = 5.5; +const REAL_TYPE CL_deltae = 0.193; +const REAL_TYPE alpha_0 = -0.05; +const REAL_TYPE Cm_0 = 0.04; +const REAL_TYPE Cm_alpha = -0.83; +const REAL_TYPE Cm_deltae = -1.5; +const REAL_TYPE Cm_q = -30; + + +#define FMTFLOAT "%5.15f" + + +/* Va filter 100 Hz */ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.956543675476034; + static REAL_TYPE a1 = -1.955578398054313; + static REAL_TYPE b0 = 0.000479064865372430; + static REAL_TYPE b1 = 0.000486212556348925; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 100 Hz */ + + +/* Va filter 50 Hz */ +REAL_TYPE +Va_filter_50( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.914975803093201; + static REAL_TYPE a1 = -1.911199519984605; + static REAL_TYPE b0 = 0.001860178914816; + static REAL_TYPE b1 = 0.001916104193780; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 50 Hz */ + + +/* Va filter 33 Hz */ +REAL_TYPE +Va_filter_33( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.874036784828483; + static REAL_TYPE a1 = -1.865563793814790; + static REAL_TYPE b0 = 0.004141433623051; + static REAL_TYPE b1 = 0.004331557390642; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 33 Hz */ + + +/* Va filter 25 Hz */ +REAL_TYPE +Va_filter_25( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.837180720246048; + static REAL_TYPE a1 = -1.822731999002980; + static REAL_TYPE b0 = 0.007010380719078; + static REAL_TYPE b1 = 0.007438340523990; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 25 Hz */ + + +/* Vz filter 100 Hz */ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.956543675476034; + static REAL_TYPE a1 = -1.955578398054313; + static REAL_TYPE b0 = 0.000479064865372430; + static REAL_TYPE b1 = 0.000486212556348925; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 100 Hz */ + + +/* Vz filter 50 Hz */ +REAL_TYPE +Vz_filter_50( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0, x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.914975803093201; + static REAL_TYPE a1 = -1.911199519984605; + static REAL_TYPE b0 = 0.001860178914816; + static REAL_TYPE b1 = 0.001916104193780; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 50 Hz */ + + +/* Vz filter 33 Hz */ +REAL_TYPE +Vz_filter_33( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0, x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.874036784828483; + static REAL_TYPE a1 = -1.865563793814790; + static REAL_TYPE b0 = 0.004141433623051; + static REAL_TYPE b1 = 0.004331557390642; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 33 Hz */ + + +/* Vz filter 25 Hz */ +REAL_TYPE +Vz_filter_25( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.837180720246048; + static REAL_TYPE a1 = -1.822731999002980; + static REAL_TYPE b0 = 0.007010380719078; + static REAL_TYPE b1 = 0.007438340523990; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 25 Hz */ + + +/* q filter 100 Hz */ +REAL_TYPE +q_filter_100( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.766000101841272; + static REAL_TYPE a1 = -1.734903205885821; + static REAL_TYPE b0 = 0.014857648981438; + static REAL_TYPE b1 = 0.016239246974013; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 100 Hz */ + + +/* q filter 50 Hz */ +REAL_TYPE +q_filter_50( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.586756156020839; + static REAL_TYPE a1 = -1.477888930110354; + static REAL_TYPE b0 = 0.049596808318647; + static REAL_TYPE b1 = 0.059270417591839; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 50 Hz */ + + +/* q filter 33 Hz */ +REAL_TYPE +q_filter_33( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.445839214374383; + static REAL_TYPE a1 = -1.227970132817902; + static REAL_TYPE b0 = 0.094268996251840; + static REAL_TYPE b1 = 0.123600085304640; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 33 Hz */ + + +/* q filter 25 Hz */ +REAL_TYPE +q_filter_25( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.344282786628352; + static REAL_TYPE a1 = -1.010643377701049; + static REAL_TYPE b0 = 0.137177088974822; + static REAL_TYPE b1 = 0.196462319952482; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 25 Hz */ + + +/* az filter 100 Hz */ +REAL_TYPE +az_filter_100( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficient */ + static REAL_TYPE a0 = 0.411240701442774; + static REAL_TYPE a1 = -1.158045899830964; + static REAL_TYPE b0 = 0.107849979167580; + static REAL_TYPE b1 = 0.145344822444230; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 100 Hz */ + + +/* az filter 50 Hz */ +REAL_TYPE +az_filter_50( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.169118914523145; + static REAL_TYPE a1 = -0.518588903229759; + static REAL_TYPE b0 = 0.229019233988375; + static REAL_TYPE b1 = 0.421510777305010; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 50 Hz */ + + +/* az filter 33 Hz */ +REAL_TYPE +az_filter_33( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.067700864731348; + static REAL_TYPE a1 = -0.115832026705568; + static REAL_TYPE b0 = 0.263451167882487; + static REAL_TYPE b1 = 0.688417670143293; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 33 Hz */ + + +/* az filter 25 Hz */ +REAL_TYPE +az_filter_25( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.028601207249487; + static REAL_TYPE a1 = 0.069303378493245; + static REAL_TYPE b0 = 0.228783762747218; + static REAL_TYPE b1 = 0.869120822995514; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 25 Hz */ + + +/* h filter 100 Hz*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.766000101841272; + static REAL_TYPE a1 = -1.734903205885821; + static REAL_TYPE b0 = 0.014857648981438; + static REAL_TYPE b1 = 0.016239246974013; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 100 Hz */ + + +/* h filter 50 Hz*/ +REAL_TYPE +h_filter_50( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.586756156020839; + static REAL_TYPE a1 = -1.477888930110354; + static REAL_TYPE b0 = 0.049596808318647; + static REAL_TYPE b1 = 0.059270417591839; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 50 Hz */ + + +/* h filter 33 Hz*/ +REAL_TYPE +h_filter_33( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.445839214374383; + static REAL_TYPE a1 = -1.227970132817902; + static REAL_TYPE b0 = 0.094268996251840; + static REAL_TYPE b1 = 0.123600085304640; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 33 Hz */ + + +/* h filter 25 Hz*/ +REAL_TYPE +h_filter_25( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.344282786628352; + static REAL_TYPE a1 = -1.010643377701049; + static REAL_TYPE b0 = 0.137177088974822; + static REAL_TYPE b1 = 0.196462319952482; /**/ + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 25 Hz */ + + +/* Altitude hold controller 50 Hz */ + +REAL_TYPE +altitude_hold_50( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 50.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 33 Hz */ + +REAL_TYPE +altitude_hold_33( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 33.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 25 Hz */ + +REAL_TYPE +altitude_hold_25( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 25.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 10 Hz */ + +REAL_TYPE +altitude_hold_10( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 10.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Va Speed controller 50 Hz */ +REAL_TYPE +Va_control_50( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 33 Hz */ +REAL_TYPE +Va_control_33( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + +// Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; +// State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 25 Hz */ +REAL_TYPE +Va_control_25( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 10 Hz */ +REAL_TYPE +Va_control_10( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Vz Speed controller 50 Hz */ +REAL_TYPE +Vz_control_50( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 33 Hz */ +REAL_TYPE +Vz_control_33( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 25 Hz */ +REAL_TYPE +Vz_control_25( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 10 Hz */ +REAL_TYPE +Vz_control_10( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Engine */ +REAL_TYPE +engine( REAL_TYPE delta_th_c ) +{ + + static REAL_TYPE y = delta_th_eq; + static REAL_TYPE x1 = delta_th_eq; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE tau = 0.75; + + // Output + y = 26350.0 * x1; + // State Equation + x1_dot = -tau * x1 + tau * delta_th_c; + // Update State + x1 += dt_dx * x1_dot; + + return y; +} + + +/* Elevator */ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ) +{ + + static REAL_TYPE y = delta_e_eq; + static REAL_TYPE x1 = delta_e_eq; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE x2_dot = 0.0; + static REAL_TYPE omega = 25.0; + static REAL_TYPE xi = 0.85; + + // Output + y = x1; + // State Equation + x1_dot = x2; + x2_dot = -omega * omega * x1 - 2.0 * xi * omega * x2 + + omega * omega * delta_e_c; + // Update State + x1 += dt_de * x1_dot; + x2 += dt_de * x2_dot; + + return y; +} + + +/* Flight dynamics */ +void aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ) +{ + + static int debut = 1; + + static REAL_TYPE u = 0.0; + static REAL_TYPE w = 0.0; + static REAL_TYPE q = 0.0; + static REAL_TYPE theta = 0.0; + static REAL_TYPE h = 0.0; + static REAL_TYPE u_dot = 0.0; + static REAL_TYPE w_dot = 0.0; + static REAL_TYPE q_dot = 0.0; + static REAL_TYPE theta_dot = 0.0; + static REAL_TYPE h_dot = 0.0; + + static REAL_TYPE CD = 0.0; + static REAL_TYPE CL = 0.0; + static REAL_TYPE Cm = 0.0; + + static REAL_TYPE Xa = 0.0; + static REAL_TYPE Za = 0.0; + static REAL_TYPE Ma = 0.0; + + static REAL_TYPE alpha = 0.0; + static REAL_TYPE qbar = 0.0; + static REAL_TYPE V = 0.0; + static REAL_TYPE rho = 0.0; + + if ( debut ) { + debut = 0; + u = Va_eq * MATH_COS( theta_eq ); + w = Va_eq * MATH_SIN( theta_eq ); + q = 0.0; + theta = theta_eq; + h = h_eq; + } + + rho = rho0 * pow( 1.0 + T0_h / T0_0 * h, - g0 / ( Rs * T0_h ) - 1.0 ); + alpha = atan( w / u ); + V = sqrt( u * u + w * w ); + qbar = 0.5 * rho * V * V; + CL = CL_deltae * delta_e + CL_alpha * ( alpha - alpha_0 ); + CD = CD_0 + CD_deltae * delta_e + + CD_alpha * ( alpha - alpha_0 ) * ( alpha - alpha_0 ); + Cm = Cm_0 + Cm_deltae * delta_e + + Cm_alpha * alpha + 0.5 * Cm_q * q * cbar / V; + Xa = - qbar * S * ( CD * MATH_COS( alpha ) - CL * MATH_SIN( alpha ) ); + Za = - qbar * S * ( CD * MATH_SIN( alpha ) + CL * MATH_COS( alpha ) ); + Ma = qbar * cbar * S * Cm; + + // Output + outputs -> Va = V; + outputs -> Vz = w * MATH_COS( theta ) - u * MATH_SIN( theta ); + outputs -> q = q; + outputs -> az = g0 * MATH_COS( theta ) + Za / masse; + outputs -> h = h; + // State Equation + u_dot = - g0 * sin ( theta ) - q * w + ( Xa + T ) / masse; + w_dot = g0 * MATH_COS ( theta ) + q * u + Za / masse; + q_dot = Ma / I_y; + theta_dot = q; + h_dot = u * MATH_SIN( theta ) - w * MATH_COS( theta ); + // Update State + u += dt * u_dot; + w += dt * w_dot; + q += dt * q_dot; + theta += dt * theta_dot; + h += dt * h_dot; + + + static REAL_TYPE Time = 0.0; + + + // instant++; + Time = Time + dt; +} + + +/* + The commanded altitude +*/ +REAL_TYPE input_h_c( void ) +{ + return h_c; +} + + +/* + The commanded airspeed +*/ +REAL_TYPE input_Va_c( void ) +{ + return Va_c; +} + + +void output_delta_th_c( REAL_TYPE delta_th_c ) +{ + +} + + +void output_delta_e_c( REAL_TYPE delta_e_c ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.h b/targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.h new file mode 100644 index 0000000..747c4b1 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/assemblage_includes.h @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef ASSEMBLAGE_INCLUDES_H +#define ASSEMBLAGE_INCLUDES_H +#include "types.h" +#include "io.h" + + +/* *************************************************************************** + Shared constants + * ************************************************************************* */ +#define delta_th_eq (1.5868660794926) +#define delta_e_eq (0.012009615652468) +extern const REAL_TYPE h_eq; +extern const REAL_TYPE Va_eq; +#ifndef NBMAX_SAMPLE +#define NBMAX_SAMPLE (6000000/4) +#endif +extern REAL_TYPE sample[ SPL_SIZE ][ NBMAX_SAMPLE ]; + +void print_inmemory_sample( void ); + +/* *************************************************************************** + The prelude imported node prototypes + * ************************************************************************* */ +/** + Va filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Va, airspeed (m/s) + @return Va_f, filtered airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_50( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_33( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_25( REAL_TYPE Va ); + +/** + Vz filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Vz, vertical speed (m/s) + @return Vz_f, filtered vertical airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_50 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_33 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_25 ( REAL_TYPE Vz ); + +/** + q filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] q, pitch rate (rad/s) + @return q_f, filtered pitch rate (rad/s) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +q_filter_100( REAL_TYPE q ); + +REAL_TYPE +q_filter_50 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_33 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_25 ( REAL_TYPE q ); + +/** + az filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] az, normal acceleration (m/s^2) + @return az_f, filtered normal acceleration (m/s^2) + 2nd order Butterworth filter with fc = 10.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +az_filter_100( REAL_TYPE az ); + +REAL_TYPE +az_filter_50 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_33 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_25 ( REAL_TYPE az ); + +/** + h filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] h, altitude (m) + @return h_f, filtered altitude (m) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ); + +REAL_TYPE +h_filter_50 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_33 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_25 ( REAL_TYPE h ); + +/** + Altitude hold controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] h_f, filtered altitude (m) + @param[in] h_c, commanded altitude (m) + @return Vz_c, commanded vertical speed (m/s) + Generates the vertical speed command Vz_c to track altitude change h_c +*/ +REAL_TYPE +altitude_hold_50 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_33 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_25 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_10 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +/** + Vz Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] Vz_c, commanded vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @param[in] az_f, filtered normal acceleration (m/s^2) + @return delta_e_c, commanded elevator deflection (rad) + Generates the elevator deflection command to track vertical speed command Vz_c +*/ +REAL_TYPE +Vz_control_50 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_33 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_25 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_10 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +/** + Va Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Va_f, filtered airspeed (m/s) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @return delta_th_c, commanded throttle (-) + Generates the throttle command to track airspeed change Va_c +*/ +REAL_TYPE +Va_control_50 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_33 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_25 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_10 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +/** + Engine (200 Hz --> 5ms period) + @param[in] delta_th_c, commanded throttle (-) + @return T, Thrust (N) + 1st order system with time constant 0.5 s + ODE Solver: Euler method with fixed-step = 0.005 (200 Hz) +*/ +REAL_TYPE +engine( REAL_TYPE delta_th_c ); + +/** + Elevator (200 Hz --> 5ms period) + @param[in] delta_e_c, commanded elevator deflection (rad) + @return delta_e, elevator deflection (rad) + 2nd order system (natural frequency omega = 25.0 rad/s and damping xi = 0.85) + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ); + +/** + Flight dynamics (200 Hz --> 5ms period) + @param[in] i, the simulation step + @param[in] delta_e, elevator deflection (rad) + @param[in] T, Thrust (N) + @param[out] outputs, the outputs Va, Vz, q, az, h + Aircraft flight dynamics + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +void +aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ); + +/* *************************************************************************** + The prelude sensor node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +REAL_TYPE +input_h_c( void ); + +REAL_TYPE +input_Va_c( void ); + + +/* *************************************************************************** + The prelude actuator node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_th_c( REAL_TYPE delta_th_c ); + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_e_c( REAL_TYPE delta_e_c ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/com_patterns.h b/targets/wasm-tacle/parallel/rosace/thread1/com_patterns.h new file mode 100644 index 0000000..8b98cd7 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/com_patterns.h @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: com_patterns.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: com_patterns.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef com_patterns_H_ +#define com_patterns_H_ +// Description of communication protocols using ultimately periodic +// words: prefix.(periodic pattern). Each communication uses a circular +// buffer shared between the writer and the reader. + +// The task instance i writes to the communication buffer iff proto[n] +// is true (modulo the size of the periodic word). After each write, the +// index where the writer writes is incremented. +struct write_proto_t { + int *write_pref; + int wpref_size; + int *write_pat; + int wpat_size; +}; + +// The task instance n must increment the index at which the task reads +// in the communication buffer iff proto[n] is true (modulo the size of the +// periodic word). +struct read_proto_t { + int *change_pref; + int rpref_size; + int *change_pat; + int rpat_size; +}; + +/** + Returns 1 if instance n must write in the com buffer. +*/ +static inline int must_write( struct write_proto_t wp, int n ) +{ + if ( n < wp.wpref_size ) + return wp.write_pref[ n ]; + else + return wp.write_pat[ ( n - wp.wpref_size ) % wp.wpat_size ]; +} + + +/** + Returns 1 if instance n must change the cell from which it reads. +*/ +static inline int must_change( struct read_proto_t rp, int n ) +{ + if ( n < rp.rpref_size ) + return rp.change_pref[ n ]; + else + return rp.change_pat[ ( n - rp.rpref_size ) % rp.rpat_size ]; +} + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/common.c b/targets/wasm-tacle/parallel/rosace/thread1/common.c new file mode 100644 index 0000000..d52da59 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/common.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.c + + Author: Dustin Green + + Function: Common used functions from original threads.c + + Source: + + Original name: + + Changes: No major changes of functions from original threads.c + + License: See the terms above. + +*/ + +#include "common.h" +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +void rosace_init( void ) +{ + + // Initial values + outs.sig_outputs.Va = 0; + outs.sig_outputs.Vz = 0; + outs.sig_outputs.q = 0; + outs.sig_outputs.az = 0; + outs.sig_outputs.h = 0; + outs.t_simu = 0; + step_simu = 0; + + // Get the task set (required for CALL() macro) + int tmp; + get_task_set( &tmp, &tasks ); +} + + +void copy_output_vars( output_t *v, uint64_t step ) +{ + v->sig_outputs.Va = aircraft_dynamics495_Va_Va_filter_100449_Va[ step % 2 ]; + v->sig_outputs.Vz = aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ step % 2 ]; + v->sig_outputs.q = aircraft_dynamics495_q_q_filter_100455_q[ step % 2 ]; + v->sig_outputs.az = aircraft_dynamics495_az_az_filter_100458_az[ step % 2 ]; + v->sig_outputs.h = aircraft_dynamics495_h_h_filter_100446_h[ step % 2 ]; + v->sig_delta_th_c = Va_control_50474_delta_th_c_delta_th_c; + v->sig_delta_e_c = Vz_control_50483_delta_e_c_delta_e_c; +} + diff --git a/targets/wasm-tacle/parallel/rosace/thread1/common.h b/targets/wasm-tacle/parallel/rosace/thread1/common.h new file mode 100644 index 0000000..315ab80 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/common.h @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.h + + Author: Dustin Green + + Function: Common used functions and variables from original threads.c + + Source: + + Original name: + + Changes: No major functional changes + + License: See the terms above. + +*/ + +#ifndef COMMON_H +#define COMMON_H + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +// I/O +output_t outs; +uint64_t step_simu; +uint64_t max_step_simu; + + +// Output variables +extern double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +extern double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +extern double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +extern double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +extern double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +extern double Va_control_50474_delta_th_c_delta_th_c; +extern double Vz_control_50483_delta_e_c_delta_e_c; + + +// Task set +struct nonencoded_task_params *tasks; + + +// Common functions +void rosace_init( void ); +void copy_output_vars( output_t *v, uint64_t step ); + + +// This should be set to 1 to run in "real-time" in the sense +// that the simulation time is close to the real world time +#define RUN_WITH_REAL_TIME 0 + +#define CALL( val ) tasks[ (val) ].ne_t_body( NULL ) + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/io.c b/targets/wasm-tacle/parallel/rosace/thread1/io.c new file mode 100644 index 0000000..f2613b7 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/io.c @@ -0,0 +1,62 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.c + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.c + + Changes: delete the code within ROSACE_write_outputs because + stdio.h is not available + + License: See the terms above. + +*/ + + +#include "types.h" +#include "io.h" + +#define FMTREAL "%5.15f" +#define BASE_FREQUENCY 200.0 + +extern REAL_TYPE h_c; + +void ROSACE_update_altitude_command( REAL_TYPE h_cons ) +{ + h_c = h_cons; +} + +void ROSACE_write_outputs( output_t *v ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread1/io.h b/targets/wasm-tacle/parallel/rosace/thread1/io.h new file mode 100644 index 0000000..be20e10 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/io.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.h + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_IO_H +#define __DEF_ROSACE_IO_H + +#include "types.h" + +typedef struct { + struct aircraft_dynamics_outs_t sig_outputs; + uint64_t t_simu; + REAL_TYPE sig_delta_th_c; + REAL_TYPE sig_delta_e_c; +} output_t; + +void ROSACE_write_outputs( output_t *v ); +void ROSACE_update_altitude_command( REAL_TYPE h_cons ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/math_all.c b/targets/wasm-tacle/parallel/rosace/thread1/math_all.c new file mode 100644 index 0000000..3400e74 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/math_all.c @@ -0,0 +1,2278 @@ + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_all.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_all.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#include "math_private.h" +#include "wcclibm.h" + +// The following defines map the math functions to specialized calls. +// The declarations in math.h are bound to the official interface names. +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +// The list of defined functions with their official interface names +float __atanf( float x ); +float __ceilf( float x ); +float __copysignf( float x, float y ); +float __cosf( float x ); +float __erff( float x ); +float __fabsf( float x ); +float __floorf( float x ); +float __ieee754_acosf( float x ); +float __ieee754_expf( float x ); +float __ieee754_logf( float x ); +float __ieee754_log10f( float x ); +float __ieee754_powf( float x, float y ); +int32_t __ieee754_rem_pio2f( float x, float *y ); +float __ieee754_sqrtf( float x ); +int __isinff( float x ); +float __kernel_cosf( float x, float y ); +float __kernel_sinf( float x, float y, int iy ); +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2 ); +float __sinf( float x ); +float __scalbnf( float x, int n ); + + +// Often used variables/consts +#ifdef __STDC__ +const float +#else +float +#endif +one = 1.0f, +tiny = 1.0e-30f, +half = 5.0000000000e-01f, /* 0x3f000000 */ +huge = 1.0e30f, +two = 2.0f, +two24 = 16777216.0f, /* 0x4b800000 */ +two25 = 3.3554432000e+07f, /* 0x4c000000 */ +two8 = 2.5600000000e+02f, /* 0x43800000 */ +twon8 = 3.9062500000e-03f, /* 0x3b800000 */ +zero = 0.0f; + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00f, /\* 0x3F800000 *\/ */ +pi = 3.1415925026e+00f, /* 0x40490fda */ +pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ +pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ +pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ +pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ +pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ +pS3 = -4.0055535734e-02f, /* 0xbd241146 */ +pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ +pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ +qS1 = -2.4033949375e+00f, /* 0xc019d139 */ +qS2 = 2.0209457874e+00f, /* 0x4001572d */ +qS3 = -6.8828397989e-01f, /* 0xbf303361 */ +qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +#ifdef __STDC__ +float __ieee754_acosf( float x ) +#else +float __ieee754_acosf( x ) +float x; +#endif +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return pi + ( float )2.0f * pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return pio2_hi + pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + return pio2_hi - ( x - ( pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( one + x ) * ( float )0.5f; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + s = __ieee754_sqrtf( z ); + r = p / q; + w = r * s - pio2_lo; + return pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( one - x ) * ( float )0.5f; + s = __ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* static const float huge = 1.0e+30f, tiny = 1.0e-30f; */ + +#ifdef __STDC__ +const float +#else +float +#endif +bp[] = {1.0f, 1.5f,}, + dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* zero = 0.0f, */ + /* one = 1.0f, */ + /* two = 2.0f, */ + /* two24 = 16777216.0f, /\* 0x4b800000 *\/ */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + L1 = 6.0000002384e-01f, /* 0x3f19999a */ + L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + P3 = 6.6137559770e-05f, /* 0x388ab355 */ + P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +float __ieee754_powf( float x, float y ) +#else +float __ieee754_powf( x, y ) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return one; + + /* x==+-1 */ + if ( x == 1.0f ) return one; + if ( x == -1.0f && isinff( y ) ) return one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return __ieee754_sqrtf( x ); + } + + ax = fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? huge * huge : tiny * tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? huge * huge : tiny * tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * ivln2_l - w * ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( L1 + s2 * ( L2 + s2 * ( L3 + s2 * ( L4 + s2 * + ( L5 + s2 * L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l * p_h + p_l * cp + dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - dp_h[ k ] ) - z_h ); + } + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * huge * huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + ovt > z - p_h ) return s * huge * huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * tiny * tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * tiny * tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * lg2_h; + v = ( p_l - ( t - p_h ) ) * lg2 + t * lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( P1 + t * ( P2 + t * ( P3 + t * ( P4 + t * P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - two ) - ( w + z * w ); + z = one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = __scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] + use __kernel_rem_pio2f() +*/ + + +/* + Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi +*/ +#ifdef __STDC__ +const int32_t two_over_pi[] = { +#else +int32_t two_over_pi[] = { +#endif + 0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC, + 0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62, + 0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63, + 0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A, + 0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09, + 0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29, + 0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44, + 0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41, + 0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C, + 0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8, + 0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11, + 0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF, + 0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E, + 0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5, + 0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92, + 0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08, + 0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0, + 0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3, + 0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85, + 0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80, + 0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA, + 0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B, +}; + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int32_t npio2_hw[] = { +#else +int32_t npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t __ieee754_rem_pio2f( float x, float *y ) +#else +int32_t __ieee754_rem_pio2f( x, y ) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + float tx[ 3 ]; + int32_t e0, i, j, nx, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= pio2_2; + y[ 0 ] = z - pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += pio2_2; + y[ 0 ] = z + pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * invpio2 + half ); + fn = ( float )n; + r = t - fn * pio2_1; + w = fn * pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * pio2_2; + r = t - w; + w = fn * pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * pio2_3; + r = t - w; + w = fn * pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + /* set z = scalbn(|x|,ilogb(x)-7) */ + e0 = ( ix >> 23 ) - 134; /* e0 = ilogb(z)-7; */ + SET_FLOAT_WORD( z, ix - ( ( int32_t )( e0 << 23 ) ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < 2; i++ ) { + tx[ i ] = ( float )( ( int32_t )( z ) ); + z = ( z - tx[ i ] ) * two8; + } + tx[ 2 ] = z; + nx = 3; + _Pragma( "loopbound min 0 max 0" ) + while ( tx[ nx - 1 ] == zero ) { + nx--; /* skip zero term */ + } + n = __kernel_rem_pio2f( tx, y, e0, nx, 2, two_over_pi ); + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } + return n; +} +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: e_sqrtf.c,v 1.4 1995/05/10 20:46:19 jtc Exp $"; +#endif + + +/* #ifdef __STDC__ */ +/* static const float one = 1.0f, tiny=1.0e-30f; */ +/* #else */ +/* static float one = 1.0f, tiny=1.0e-30f; */ +/* #endif */ + +#ifdef __STDC__ +float __ieee754_sqrtf( float x ) +#else +float __ieee754_sqrtf( x ) +float x; +#endif +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 0 max 0" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = one - tiny; /* trigger inexact flag */ + if ( z >= one ) { + z = one + tiny; + if ( z > one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +C4 = -2.7557314297e-07f, /* 0xb493f27c */ +C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float __kernel_cosf( float x, float y ) +#else +float __kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return one; /* generate inexact */ + } + z = x * x; + r = z * ( C1 + z * ( C2 + z * ( C3 + z * ( C4 + z * ( C5 + z * C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} +/* k_rem_pio2f.c -- float version of k_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: k_rem_pio2f.c,v 1.4 1995/05/10 20:46:28 jtc Exp $"; +#endif + + +/* In the float version, the input parameter x contains 8 bit + integers, not 24 bit integers. 113 bit precision is not supported. */ + +#ifdef __STDC__ +const int init_jk[] = {4, 7, 9}; /* initial value for jk */ +#else +int init_jk[] = {4, 7, 9}; +#endif + +#ifdef __STDC__ +const float PIo2[] = { +#else +float PIo2[] = { +#endif + 1.5703125000e+00f, /* 0x3fc90000 */ + 4.5776367188e-04f, /* 0x39f00000 */ + 2.5987625122e-05f, /* 0x37da0000 */ + 7.5437128544e-08f, /* 0x33a20000 */ + 6.0026650317e-11f, /* 0x2e840000 */ + 7.3896444519e-13f, /* 0x2b500000 */ + 5.3845816694e-15f, /* 0x27c20000 */ + 5.6378512969e-18f, /* 0x22d00000 */ + 8.3009228831e-20f, /* 0x1fc40000 */ + 3.2756352257e-22f, /* 0x1bc60000 */ + 6.3331015649e-25f, /* 0x17440000 */ +}; + + +#ifdef __STDC__ +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ) +#else +int __kernel_rem_pio2f( x, y, e0, nx, prec, ipio2 ) +float x[], y[]; +int e0, nx, prec; +int32_t ipio2[]; +#endif +{ + int32_t jz, jx, jv, jp, jk, carry, n, iq[ 20 ], i, j, k, m, q0, ih; + float z, fw, f[ 20 ], fq[ 20 ], q[ 20 ]; + + /* initialize jk*/ + jk = init_jk[ prec ]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx - 1; + jv = ( e0 - 3 ) / 8; + if ( jv < 0 ) jv = 0; + q0 = e0 - 8 * ( jv + 1 ); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv - jx; + m = jx + jk; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= m; i++, j++ ) + f[i] = ( j < 0 ) ? zero : ( float ) ipio2[ j ]; + + /* compute q[0],q[1],...q[jk] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= jk; i++ ) { + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[ i ] = fw; + } + + jz = jk; +recompute: + ; + /* distill q[] into iq[] reversingly */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0, j = jz, z = q[ jz ]; j > 0; i++, j-- ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[i] = ( int32_t )( z - two8 * fw ); + z = q[ j - 1 ] + fw; + } + + /* compute n */ + z = __scalbnf( z, q0 ); /* actual value of z */ + z -= ( float )8.0f * __floorf( z * ( float ) + 0.125f ); /* trim off integer >= 8 */ + n = ( int32_t ) z; + z -= ( float )n; + ih = 0; + if ( q0 > 0 ) { /* need iq[jz-1] to determine n */ + i = ( iq[ jz - 1 ] >> ( 8 - q0 ) ); + n += i; + iq[ jz - 1 ] -= i << ( 8 - q0 ); + ih = iq[ jz - 1 ] >> ( 7 - q0 ); + } else + if ( q0 == 0 ) ih = iq[ jz - 1 ] >> 8; + else + if ( z >= ( float )0.5f ) ih = 2; + + if ( ih > 0 ) { /* q > 0.5 */ + n += 1; + carry = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < jz ; i++ ) { /* compute 1-q */ + j = iq[ i ]; + if ( carry == 0 ) { + if ( j != 0 ) { + carry = 1; + iq[ i ] = 0x100 - j; + } + } else iq[ i ] = 0xff - j; + + } + if ( q0 > 0 ) { /* rare case: chance is 1 in 12 */ + switch ( q0 ) { + case 1: + iq[ jz - 1 ] &= 0x7f; + break; + case 2: + iq[ jz - 1 ] &= 0x3f; + break; + } + } + if ( ih == 2 ) { + z = one - z; + if ( carry != 0 ) z -= __scalbnf( one, q0 ); + } + } + + /* check if recomputation is needed */ + if ( z == zero ) { + j = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz - 1; i >= jk; i-- ) + j |= iq[ i ]; + if ( j == 0 ) { /* need recomputation */ + _Pragma( "loopbound min 0 max 0" ) + for ( k = 1; iq[ jk - k ] == 0; k++ ) { + ; /* k = no. of terms needed */ + } + + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz + 1; i <= jz + k; i++ ) { /* add q[jz+1] to q[jz+k] */ + f[ jx + i ] = ( float ) ipio2[ jv + i ]; + _Pragma( "loopbound min 0 max 0" ) + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if ( z == ( float )0.0f ) { + jz -= 1; + q0 -= 8; + _Pragma( "loopbound min 0 max 0" ) + while ( iq[ jz ] == 0 ) { + jz--; + q0 -= 8; + } + } else { /* break z into 8-bit if necessary */ + z = __scalbnf( z, -q0 ); + if ( z >= two8 ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[ jz ] = ( int32_t )( z - two8 * fw ); + jz += 1; + q0 += 8; + iq[ jz ] = ( int32_t ) fw; + } else iq[ jz ] = ( int32_t ) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = __scalbnf( one, q0 ); + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + q[ i ] = fw * ( float )iq[ i ]; + fw *= twon8; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, k = 0; k <= jp && k <= jz - i; k++ ) + fw += PIo2[ k ] * q[ i + k ]; + fq[ jz - i ] = fw; + } + + /* compress fq[] into y[] */ + switch ( prec ) { + case 0: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + break; + case 1: + case 2: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + fw = fq[ 0 ] - fw; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i <= jz; i++ ) + fw += fq[ i ]; + y[ 1 ] = ( ih == 0 ) ? fw : -fw; + break; + case 3:; /* painful */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 0; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 1; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, i = jz; i >= 2; i-- ) + fw += fq[ i ]; + + if ( ih == 0 ) { + y[ 0 ] = fq[ 0 ]; + y[ 1 ] = fq[ 1 ]; + y[ 2 ] = fw; + } else { + y[ 0 ] = -fq[ 0 ]; + y[ 1 ] = -fq[ 1 ]; + y[ 2 ] = -fw; + } + } + return n & 7; +} +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +S2 = 8.3333337680e-03f, /* 0x3c088889 */ +S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float __kernel_sinf( float x, float y, int iy ) +#else +float __kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = S2 + z * ( S3 + z * ( S4 + z * ( S5 + z * S6 ) ) ); + if ( iy == 0 ) return x + v * ( S1 + z * r ); + else return x - ( ( z * ( half * y - v * r ) - y ) - v * S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float atanhi[] = { +#else +float atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float atanlo[] = { +#else +float atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float aT[] = { +#else +float aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float __atanf( float x ) +#else +float __atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return atanhi[ 3 ] + atanlo[ 3 ]; + else return -atanhi[ 3 ] - atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( huge + x > one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - one ) / ( x + one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z * ( aT[ 0 ] + w * ( aT[ 2 ] + w * ( aT[ 4 ] + w * ( aT[ 6 ] + w * + ( aT[ 8 ] + w * aT[ 10 ] ) ) ) ) ); + s2 = w * ( aT[ 1 ] + w * ( aT[ 3 ] + w * ( aT[ 5 ] + w * ( aT[ 7 ] + w * aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = atanhi[ id ] - ( ( x * ( s1 + s2 ) - atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} +//weak_alias (__atanf, atanf) +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +#ifdef __STDC__ +float __copysignf( float x, float y ) +#else +float __copysignf( x, y ) +float x, y; +#endif +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} +//weak_alias (__copysignf, copysignf) +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float __cosf( float x ) +#else +float __cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -__kernel_sinf( y[ 0 ], y[ 1], 1 ); + case 2: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +#ifdef __STDC__ +float __fabsf( float x ) +#else +float __fabsf( x ) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + +/* s_floorf.c -- float version of s_floor.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + floorf(x) + Return x rounded toward -inf to integral value + Method: + Bit twiddling. + Exception: + Inexact flag raised if x not equal to floorf(x). +*/ + + +/* #ifdef __STDC__ */ +/* static const float huge = 1.0e30f; */ +/* #else */ +/* static float huge = 1.0e30f; */ +/* #endif */ + +#ifdef __STDC__ +float __floorf( float x ) +#else +float __floorf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0f ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 >= 0 ) + i0 = 0; + else + if ( ( i0 & 0x7fffffff ) != 0 ) + i0 = 0xbf800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0f ) { /* raise inexact flag */ + if ( i0 < 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} +//weak_alias (__floorf, floorf) +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + + +int +__isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} +/* hidden_def (__isinff) */ +/* weak_alias (__isinff, isinff) */ +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float __scalbnf ( float x, int n ) +#else +float __scalbnf ( x, n ) +float x; +int n; +#endif +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return huge * __copysignf( huge, x ); /* overflow */ + if ( n < -50000 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * twom25; +} +//weak_alias (__scalbnf, scalbnf) + + + +/* e_log10f.c -- float version of e_log10.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ivln10 = 4.3429449201e-01f, /* 0x3ede5bd9 */ +log10_2hi = 3.0102920532e-01f, /* 0x3e9a2080 */ +log10_2lo = 7.9034151668e-07f; /* 0x355427db */ + +#ifdef __STDC__ +float __ieee754_log10f( float x ) +#else +float __ieee754_log10f( x ) +float x; +#endif +{ + float y, z; + int32_t i, k, hx; + + GET_FLOAT_WORD( hx, x ); + + k = 0; + if ( hx < 0x00800000 ) { /* x < 2**-126 */ + if ( ( hx & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( hx < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( hx, x ); + } + if ( hx >= 0x7f800000 ) return x + x; + k += ( hx >> 23 ) - 127; + i = ( ( u_int32_t )k & 0x80000000 ) >> 31; + hx = ( hx & 0x007fffff ) | ( ( 0x7f - i ) << 23 ); + y = ( float )( k + i ); + SET_FLOAT_WORD( x, hx ); + z = y * log10_2lo + ivln10 * __ieee754_logf( x ); + return z + y * log10_2hi; +} + + +/* e_logf.c -- float version of e_log.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ln2_hi = 6.9313812256e-01f, /* 0x3f317180 */ +ln2_lo = 9.0580006145e-06f, /* 0x3717f7d1 */ +Lg1 = 6.6666668653e-01f, /* 3F2AAAAB */ +Lg2 = 4.0000000596e-01f, /* 3ECCCCCD */ +Lg3 = 2.8571429849e-01f, /* 3E924925 */ +Lg4 = 2.2222198546e-01f, /* 3E638E29 */ +Lg5 = 1.8183572590e-01f, /* 3E3A3325 */ +Lg6 = 1.5313838422e-01f, /* 3E1CD04F */ +Lg7 = 1.4798198640e-01f; /* 3E178897 */ + +#ifdef __STDC__ +float __ieee754_logf( float x ) +#else +float __ieee754_logf( x ) +float x; +#endif +{ + float hfsq, f, s, z, R, w, t1, t2, dk; + int32_t k, ix, i, j; + + GET_FLOAT_WORD( ix, x ); + + k = 0; + if ( ix < 0x00800000 ) { /* x < 2**-126 */ + if ( ( ix & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( ix < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( ix, x ); + } + if ( ix >= 0x7f800000 ) return x + x; + k += ( ix >> 23 ) - 127; + ix &= 0x007fffff; + i = ( ix + ( 0x95f64 << 3 ) ) & 0x800000; + SET_FLOAT_WORD( x, ix | ( i ^ 0x3f800000 ) ); /* normalize x or x/2 */ + k += ( i >> 23 ); + f = x - ( float )1.0; + if ( ( 0x007fffff & ( 15 + ix ) ) < 16 ) { /* |f| < 2**-20 */ + if ( f == zero ) { + if ( k == 0 ) return zero; + else { + dk = ( float )k; + return dk * ln2_hi + dk * ln2_lo; + } + } + R = f * f * ( ( float )0.5f - ( float )0.33333333333333333f * f ); + if ( k == 0 ) return f - R; + else { + dk = ( float )k; + return dk * ln2_hi - ( ( R - dk * ln2_lo ) - f ); + } + } + s = f / ( ( float )2.0f + f ); + dk = ( float )k; + z = s * s; + i = ix - ( 0x6147a << 3 ); + w = z * z; + j = ( 0x6b851 << 3 ) - ix; + t1 = w * ( Lg2 + w * ( Lg4 + w * Lg6 ) ); + t2 = z * ( Lg1 + w * ( Lg3 + w * ( Lg5 + w * Lg7 ) ) ); + i |= j; + R = t2 + t1; + if ( i > 0 ) { + hfsq = ( float )0.5f * f * f; + if ( k == 0 ) return f - ( hfsq - s * ( hfsq + R ) ); + else + return dk * ln2_hi - ( ( hfsq - ( s * ( hfsq + R ) + dk * ln2_lo ) ) - f ); + } else { + if ( k == 0 ) return f - s * ( f - R ); + else + return dk * ln2_hi - ( ( s * ( f - R ) - dk * ln2_lo ) - f ); + } +} + + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float __sinf( float x ) +#else +float __sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -__kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + + +/* Single-precision floating point e^x. + Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating + + The GNU C 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. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* How this works: + + The input value, x, is written as + + x = n * ln(2) + t/512 + delta[t] + x; + + where: + - n is an integer, 127 >= n >= -150; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n ( e^(t/512 + delta[t]) + + ( e^(t/512 + delta[t]) + ( p(x + delta[t] + n * ln(2)) - delta ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table. + + The table used is the same one as for the double precision version; + since we have the table, we might as well use it. + + It turns out to be faster to do calculations in double precision than + to perform an 'accurate table method' expf, because of the range reduction + overhead (compare exp2f). +*/ + + +const float __exp_deltatable[ 178 ] = { + 0.000000e+00, 1.436239e-11, -1.851323e-11, 1.250434e-12, + -4.382040e-10, 4.014913e-13, 6.324634e-12, 1.473544e-12, + -4.987366e-11, -1.752952e-12, 6.321584e-13, -3.260980e-12, + 2.777399e-12, -3.787255e-11, -2.182022e-13, -9.047329e-13, + 7.118903e-12, -3.555871e-13, -5.198906e-12, -4.124305e-13, + 1.940741e-12, 2.811727e-13, -2.117377e-13, 2.782236e-14, + 1.074722e-13, -8.844783e-13, -1.240327e-16, 7.052319e-13, + 6.447490e-13, 4.011210e-13, 5.462592e-13, 1.843201e-12, + -2.028864e-12, -2.931258e-13, 8.606021e-12, -5.626610e-13, + 1.295899e-13, -2.330782e-12, -5.478326e-13, 1.845989e-12, + -4.234531e-12, 1.735903e-12, 1.518525e-13, 2.535486e-12, + -4.674620e-13, -1.051410e-12, -1.666138e-12, -9.372511e-13, + 3.200735e-12, 2.292755e-12, 2.525703e-12, 5.823944e-13, + -9.789686e-13, 5.145901e-13, -4.527062e-12, -1.683974e-12, + 9.547877e-12, 2.078277e-13, -2.575768e-12, -1.026653e-12, + 8.179204e-13, 6.063405e-13, 3.908063e-13, -2.855789e-13, + -6.295203e-12, -2.709950e-13, 4.477842e-14, 4.821464e-13, + -5.566389e-13, 1.357999e-12, 7.670314e-13, -9.506315e-12, + -1.738782e-12, -8.637127e-13, -1.933394e-12, -1.267901e-13, + -4.426381e-13, 1.260695e-12, -3.277632e-12, -1.941204e-12, + -4.246588e-12, 2.948061e-12, -2.192153e-13, 1.066989e-12, + 3.009034e-13, 9.622095e-13, 2.332691e-13, -2.541789e-12, + -8.988149e-13, -1.005515e-12, 1.152009e-12, 2.547998e-12, + -8.128411e-12, -5.987095e-12, -1.230903e-12, 1.251520e-12, + -1.144099e-12, -1.419784e-14, 6.041652e-13, -2.428500e-13, + -6.869299e-12, 2.192179e-13, 3.987357e-13, -1.482881e-12, + 3.078380e-13, 5.226606e-12, -3.655583e-13, -7.399489e-13, + -2.937312e-13, 8.345330e-13, 8.291675e-13, 6.803750e-13, + -3.151692e-12, 1.975098e-12, -1.964634e-09, 1.060808e-12, + 5.123574e-12, 5.405112e-13, 4.460744e-12, 2.254359e-12, + 1.053220e-12, 4.224363e-12, 5.146482e-13, -5.005111e-14, + 6.731776e-12, -4.826085e-12, 1.779185e-12, 5.392274e-12, + 4.069803e-12, 5.218838e-13, -4.566578e-12, 9.349049e-13, + -2.780717e-12, 1.589945e-12, 1.805627e-12, -8.564009e-13, + -9.103265e-13, 1.747946e-12, 7.582737e-13, 1.880665e-12, + -1.509317e-12, -8.732831e-12, -1.582241e-14, -2.613867e-12, + 5.035911e-13, -2.209310e-12, -4.646361e-13, 1.926250e-12, + 1.114618e-12, 2.434626e-12, -8.526912e-13, -1.499753e-12, + -1.008729e-12, -2.222098e-12, 6.956137e-13, 2.119407e-13, + 1.250643e-12, -6.520809e-12, 2.357324e-13, -1.302915e-11, + -2.031004e-12, -7.972772e-13, 1.424409e-12, 4.138852e-12, + -1.058267e-12, -2.656184e-12, 5.452444e-13, 1.108587e-12, + 1.134814e-11, -9.126315e-12, 2.758479e-12, -1.439219e-12, + 3.073733e-12, 2.169448e-12, 3.600419e-15, -2.955518e-13, + -1.982464e-12, 2.164243e-12 +}; + +const double __exp_atable[ 355 ] /* __attribute__((mode(DF))) */ = { + 0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */ + 0.709106182438804188967, /* 0x0.b587fb96f75097ffb */ + 0.710492508843861281234, /* 0x0.b5e2d649899167ffd */ + 0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */ + 0.713273297897442870573, /* 0x0.b699142f945f87ffc */ + 0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */ + 0.716064970655995725059, /* 0x0.b75008aec758f8004 */ + 0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */ + 0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */ + 0.720272979947266023271, /* 0x0.b863cf5d10e380003 */ + 0.721681137825144314297, /* 0x0.b8c01855195c37ffb */ + 0.723092048691992950199, /* 0x0.b91c8f7d213740004 */ + 0.724505717938892290800, /* 0x0.b97934ec5002d0007 */ + 0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */ + 0.727341353138962865022, /* 0x0.ba330afcc29e98003 */ + 0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */ + 0.730188086709957051568, /* 0x0.baed9b40591ba0000 */ + 0.731615628948127705309, /* 0x0.bb4b296f931e30002 */ + 0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */ + 0.734479091556371366251, /* 0x0.bc06d25dd49568001 */ + 0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */ + 0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */ + 0.738795312814142124419, /* 0x0.bd21b08af98e78005 */ + 0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */ + 0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */ + 0.743136898669507939299, /* 0x0.be3e38443c84e0007 */ + 0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */ + 0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */ + 0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */ + 0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */ + 0.750429646104262104698, /* 0x0.c01c2843f776fffff */ + 0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */ + 0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */ + 0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */ + 0.756315338768691947122, /* 0x0.c19de1cd798578006 */ + 0.757793960659406629066, /* 0x0.c1fec8f623723fffd */ + 0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */ + 0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */ + 0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */ + 0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */ + 0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */ + 0.766726596071518051729, /* 0x0.c44831b719bf18002 */ + 0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */ + 0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */ + 0.771232322196981678892, /* 0x0.c56f7b41744490001 */ + 0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */ + 0.774250840160724651565, /* 0x0.c6354d95640dd0007 */ + 0.775764526565368872643, /* 0x0.c6988106fec447fff */ + 0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */ + 0.778800783068235302750, /* 0x0.c75f7cf560942fffc */ + 0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */ + 0.781848923151573727006, /* 0x0.c8274043594cb0002 */ + 0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */ + 0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */ + 0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */ + 0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */ + 0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */ + 0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */ + 0.792611669712891875319, /* 0x0.cae8992fd84667ffd */ + 0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */ + 0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */ + 0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */ + 0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */ + 0.800389937624300440456, /* 0x0.cce65ade24d360006 */ + 0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */ + 0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */ + 0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */ + 0.806667472122675088819, /* 0x0.ce81c26b838db8000 */ + 0.808244534127439906441, /* 0x0.cee91d213f8428002 */ + 0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */ + 0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */ + 0.812994243520784198882, /* 0x0.d0206407c20e20005 */ + 0.814583674571603966162, /* 0x0.d0888e4223facfff9 */ + 0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */ + 0.817771864936188586101, /* 0x0.d1597f377d6768002 */ + 0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */ + 0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */ + 0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */ + 0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */ + 0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */ + 0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */ + 0.829029118181348834154, /* 0x0.d43b40960546d8001 */ + 0.830649897953322891022, /* 0x0.d4a578c222a058000 */ + 0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */ + 0.833900969738858188772, /* 0x0.d57a88b1218e90002 */ + 0.835531274148056613016, /* 0x0.d5e560a94048f8006 */ + 0.837164765846411529371, /* 0x0.d6506e1aac8078003 */ + 0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */ + 0.840441336100884561780, /* 0x0.d72729d4c28518004 */ + 0.842084427144139224814, /* 0x0.d792d8530e12b0001 */ + 0.843730730487052604790, /* 0x0.d7febcb61273e7fff */ + 0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */ + 0.847032999194574087728, /* 0x0.d8d727962c69d7fff */ + 0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */ + 0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */ + 0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */ + 0.853676361342631029337, /* 0x0.da8a88b555baa0006 */ + 0.855345327311054837175, /* 0x0.daf7e94f965f98004 */ + 0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */ + 0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */ + 0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */ + 0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */ + 0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */ + 0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */ + 0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */ + 0.868815056264353846599, /* 0x0.de6aa9dced8448001 */ + 0.870513618890481399881, /* 0x0.ded9fb03db7320006 */ + 0.872215502247877139094, /* 0x0.df4983e1380657ff8 */ + 0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */ + 0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */ + 0.877341141814212965880, /* 0x0.e0996dd786fff0007 */ + 0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */ + 0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */ + 0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */ + 0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */ + 0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */ + 0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */ + 0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */ + 0.891157254447957902797, /* 0x0.e422e1bf727718006 */ + 0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */ + 0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */ + 0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */ + 0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */ + 0.899902594367530173098, /* 0x0.e660043464e378005 */ + 0.901661934163603406867, /* 0x0.e6d3510747e150006 */ + 0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */ + 0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */ + 0.906960617885092856864, /* 0x0.e82e92309390b0007 */ + 0.908733756358986566306, /* 0x0.e8a2c6845544afffa */ + 0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */ + 0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */ + 0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */ + 0.915861043547953501680, /* 0x0.ea75de8db8094fffe */ + 0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */ + 0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */ + 0.921243169397334638073, /* 0x0.ebd697a43995b0007 */ + 0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */ + 0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */ + 0.926656923710931002014, /* 0x0.ed39635df34e70006 */ + 0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */ + 0.930283756368834757725, /* 0x0.ee2713859aab57ffa */ + 0.932102492359406786818, /* 0x0.ee9e44d9342870004 */ + 0.933924784042873379360, /* 0x0.ef15b1d4635438005 */ + 0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */ + 0.937580062297704630580, /* 0x0.f0053f38f345cffff */ + 0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */ + 0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */ + 0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */ + 0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */ + 0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */ + 0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */ + 0.950486566729423554277, /* 0x0.f353166f63e3dffff */ + 0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */ + 0.954206665969085765512, /* 0x0.f446e357f66120000 */ + 0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */ + 0.957941325265908139014, /* 0x0.f53ba48781046fffb */ + 0.959814132734539637840, /* 0x0.f5b66106555d07ffa */ + 0.961690601603558903308, /* 0x0.f6315af2c2027fffc */ + 0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */ + 0.965454552202857141381, /* 0x0.f728078f7c5008002 */ + 0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */ + 0.969233234469444204768, /* 0x0.f81fab543e1897ffb */ + 0.971128118008140250896, /* 0x0.f89bda33122c78007 */ + 0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */ + 0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */ + 0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */ + 0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */ + 0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */ + 0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */ + 0.984496437054508843888, /* 0x0.fc07f5602d79afffc */ + 0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */ + 0.988349647107594098099, /* 0x0.fd047b83571b1fffa */ + 0.990281903873210800357, /* 0x0.fd831d66f4c018002 */ + 0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */ + 0.994157757657894713987, /* 0x0.fe811f703491e8006 */ + 0.996101369488558541238, /* 0x0.ff007fd5744490005 */ + 0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */ + 1.000000000000000000000, /* 0x1.00000000000000000 */ + 1.001955033605393285965, /* 0x1.0080200565d29ffff */ + 1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */ + 1.005876574715736104818, /* 0x1.01812090377240007 */ + 1.007843096764807100351, /* 0x1.020201541aad7fff6 */ + 1.009813464316352327214, /* 0x1.0283229c4c9820007 */ + 1.011787683565730677817, /* 0x1.030484836910a000e */ + 1.013765762469146736174, /* 0x1.0386272b9c077fffe */ + 1.015747708536026694351, /* 0x1.04080ab526304fff0 */ + 1.017733529475172815584, /* 0x1.048a2f412375ffff0 */ + 1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */ + 1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */ + 1.023714316605201180057, /* 0x1.06122436442e2000e */ + 1.025715712440059545995, /* 0x1.06954e0fec63afff2 */ + 1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */ + 1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */ + 1.031743407506447551857, /* 0x1.082056011a9230009 */ + 1.033760500517691527387, /* 0x1.08a487359ebd50002 */ + 1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */ + 1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */ + 1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */ + 1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */ + 1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */ + 1.045946142174331239262, /* 0x1.0bc3205a042060000 */ + 1.047991002016745332165, /* 0x1.0c4923682a086fffe */ + 1.050039859627715177527, /* 0x1.0ccf698898f3a000d */ + 1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */ + 1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */ + 1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */ + 1.058275424318780855142, /* 0x1.0eeb23619c146fffb */ + 1.060344388322010722446, /* 0x1.0f72bad65714bffff */ + 1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */ + 1.064494458915699715017, /* 0x1.1082b577d0eef0003 */ + 1.066575581342167566880, /* 0x1.110b18e893a90000a */ + 1.068660772440545025953, /* 0x1.1193c09c267610006 */ + 1.070750040138235936705, /* 0x1.121cacb4959befff6 */ + 1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */ + 1.074940837302467588937, /* 0x1.132f529d59552000b */ + 1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */ + 1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */ + 1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */ + 1.083371702785017154417, /* 0x1.1557d910df9c7000e */ + 1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */ + 1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */ + 1.089738217537583819804, /* 0x1.16f9157586772ffff */ + 1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */ + 1.094003332327482702577, /* 0x1.18109a360fc23fff2 */ + 1.096142145591650907149, /* 0x1.189cc58b155a70008 */ + 1.098285140311341168136, /* 0x1.1929370751ea50002 */ + 1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */ + 1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */ + 1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */ + 1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */ + 1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */ + 1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */ + 1.113403872669181282605, /* 0x1.1d0809445a97ffffc */ + 1.115580614653132185460, /* 0x1.1d96b0effc9db000e */ + 1.117761612217810673898, /* 0x1.1e25a001332190000 */ + 1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */ + 1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */ + 1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */ + 1.126528325196519908506, /* 0x1.2064290abc98c0001 */ + 1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */ + 1.130937432396844410880, /* 0x1.21851d95f776dfff0 */ + 1.133148453059692917203, /* 0x1.2216045b6784efffa */ + 1.135363796355857157764, /* 0x1.22a733a6692ae0004 */ + 1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */ + 1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */ + 1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */ + 1.144268564977221958089, /* 0x1.24eec8e06b035000c */ + 1.146505648458203463465, /* 0x1.258164e8cea85fff8 */ + 1.148747105501412235671, /* 0x1.26144a5180d380009 */ + 1.150992944689175123667, /* 0x1.26a7793f5de2efffa */ + 1.153243174560058870217, /* 0x1.273af1d712179000d */ + 1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */ + 1.157756840726344771440, /* 0x1.2862c097a3d29000c */ + 1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */ + 1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */ + 1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */ + 1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */ + 1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */ + 1.171404112007080167155, /* 0x1.2be123cf786790002 */ + 1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */ + 1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */ + 1.178287955789017793514, /* 0x1.2da4478b627040002 */ + 1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */ + 1.182899644456603782686, /* 0x1.2ed282d76421d0004 */ + 1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */ + 1.187529382762033236513, /* 0x1.3001ecf60082ffffa */ + 1.189851042595508889847, /* 0x1.309a13f30f28a0004 */ + 1.192177241354644978669, /* 0x1.31328716a758cfff7 */ + 1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */ + 1.196843291137896336843, /* 0x1.32645269dfd04000a */ + 1.199183159977805113226, /* 0x1.32fdaae604c39000f */ + 1.201527603343041317132, /* 0x1.339750219980dfff3 */ + 1.203876630171082595692, /* 0x1.3431424300e480007 */ + 1.206230249419600664189, /* 0x1.34cb8170b3fee000e */ + 1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */ + 1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */ + 1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */ + 1.215690830512196507537, /* 0x1.373783a718d29000f */ + 1.218067546930756250870, /* 0x1.37d3465662f480007 */ + 1.220448909901335365929, /* 0x1.386f56fa770fe0008 */ + 1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */ + 1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */ + 1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */ + 1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */ + 1.232425741726685064472, /* 0x1.3b8040df76f39fffa */ + 1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */ + 1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */ + 1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */ + 1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */ + 1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */ + 1.246953186383919165383, /* 0x1.3f3852f32973efff0 */ + 1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */ + 1.251833623164381181797, /* 0x1.40782b17863250005 */ + 1.254280999953110153911, /* 0x1.41188f42caf400000 */ + 1.256733161434815393410, /* 0x1.41b943b42945bfffd */ + 1.259190116985283935980, /* 0x1.425a4893e5f10000a */ + 1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */ + 1.264118447754797758244, /* 0x1.439d443f608c4fff9 */ + 1.266589841787181258708, /* 0x1.443f3b5bebf850008 */ + 1.269066067469190262045, /* 0x1.44e183883e561fff7 */ + 1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */ + 1.274033051628237434048, /* 0x1.462707b2c43020009 */ + 1.276523829025464573684, /* 0x1.46ca44023aa410007 */ + 1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */ + 1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */ + 1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */ + 1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */ + 1.289050950070396384145, /* 0x1.49ff3e396e19d000b */ + 1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */ + 1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */ + 1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */ + 1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */ + 1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */ + 1.304245874766450485904, /* 0x1.4de30ec21097d0003 */ + 1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */ + 1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */ + 1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */ + 1.314475201942565174546, /* 0x1.50817263bf0e5fffb */ + 1.317045045107389400535, /* 0x1.5129dd3418575000e */ + 1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */ + 1.322199813675649204855, /* 0x1.527bafde83a310009 */ + 1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */ + 1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */ + 1.329969819671041886272, /* 0x1.5478e6f02775e0001 */ + 1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */ + 1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */ + 1.337785486688218616860, /* 0x1.56791c1263abefff7 */ + 1.340400902247843806217, /* 0x1.57248376aef21fffa */ + 1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */ + 1.345647083048053138662, /* 0x1.587c53c5a630f0002 */ + 1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */ + 1.350913796821875845231, /* 0x1.59d57c9110ad60006 */ + 1.353554878672557082439, /* 0x1.5a8292913d68cfffc */ + 1.356201123929036356254, /* 0x1.5b2fff3212db00007 */ + 1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */ + 1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */ + 1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */ + 1.366837941171020309735, /* 0x1.5de9176042f1effff */ + 1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */ + 1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */ + 1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */ + 1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */ + 1.380251356531521533853, /* 0x1.6158272490016000c */ + 1.382949794301995272203, /* 0x1.6208ff6a8978a000f */ + 1.385653507605306700170, /* 0x1.62ba3032c0a280004 */ + 1.388362506772382154503, /* 0x1.636bb9a994784000f */ + 1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */ + 1.393796403973427855412, /* 0x1.64cfd7545928b0002 */ + 1.396521322756352656542, /* 0x1.65826be167badfff8 */ + 1.399251568859207761660, /* 0x1.663559cf20826000c */ + 1.401987152677323100733, /* 0x1.66e8a14a29486fffc */ + 1.404728084651919228815, /* 0x1.679c427f5a4b6000b */ + 1.407474375243217723560, /* 0x1.68503d9ba0add000f */ + 1.410226034922914983815, /* 0x1.690492cbf6303fff9 */ + 1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */ +}; + +const volatile float TWOM100 = 7.88860905e-31; +const volatile float TWO127 = 1.7014118346e+38; + + +unsigned long _randseed = 1; + +void srandom( unsigned long seed ) +{ + _randseed = seed; +} + +unsigned long random( void ) +{ + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = _randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if ( t <= 0 ) + t += 0x7fffffff; + _randseed = t; + return ( t ); +} + + +/* s_ceilf.c -- float version of s_ceil.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_ceilf.c,v 1.4 1995/05/10 20:46:55 jtc Exp $"; +#endif + +#ifdef __STDC__ +float __ceilf( float x ) +#else +float __ceilf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0 ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 < 0 ) + i0 = 0x80000000; + else + if ( i0 != 0 ) + i0 = 0x3f800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0 ) { /* raise inexact flag */ + if ( i0 > 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread1/math_private.h b/targets/wasm-tacle/parallel/rosace/thread1/math_private.h new file mode 100644 index 0000000..47f9137 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = ( d ); \ + ( i ) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD( d, i ) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = ( i ); \ + ( d ) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/parallel/rosace/thread1/multirate_precedence.h b/targets/wasm-tacle/parallel/rosace/thread1/multirate_precedence.h new file mode 100644 index 0000000..1f805a0 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/multirate_precedence.h @@ -0,0 +1,64 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: multirate_precedence.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: multirate_precedence.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _multirate_precedence_H +#define _multirate_precedence_H +// Description of a precedence between two tasks of different rates + +struct job_prec { + int src_job; + int dst_job; +}; + +struct multirate_precedence { + char *src_name; + char *dst_name; + int prec_pref_size; + int prec_pat_size; + struct job_prec *prec_pref; + struct job_prec *prec_pat; +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/nonencoded_task_params.h b/targets/wasm-tacle/parallel/rosace/thread1/nonencoded_task_params.h new file mode 100644 index 0000000..fa67d94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/nonencoded_task_params.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: nonencoded_task_params.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: nonencoded_task_params.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _nonencoded_task_params_H +#define _nonencoded_task_params_H +#define NULL ((void*)0) +// Description of a real time task, without precedence encoding. + +struct nonencoded_task_params { + char *ne_t_name; + int ne_t_period; + int ne_t_initial_release; + int ne_t_wcet; + int ne_t_deadline; + int ( *ne_t_body )( void * ); // This is the code to execute at each + // instance of the task. +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/ros_th1.c b/targets/wasm-tacle/parallel/rosace/thread1/ros_th1.c new file mode 100644 index 0000000..00cbe64 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/ros_th1.c @@ -0,0 +1,159 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: ros_th1 + + Author: Dustin Green and others + + Function: executes the first thread of original threads.c + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/c_posix_implementation/ + + Original name: threads, rosace + + Changes: union of rosace.c and threads.c + + License: see above + +*/ + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" +#include "common.h" + + +// Return variable +int ros_th1_check; + + +/* + Forward declaration of functions +*/ + +void* ros_th1_thread1( void* arg ); +int ros_th1_run_rosace( uint64_t nbstep ); +int main( void ); +void ros_th1_init( void ); +void ros_th1_main( void ); +int ros_th1_return( void ); + + +/* + Initialization function +*/ + +void ros_th1_init( void ) +{ + ros_th1_check = -1; + rosace_init(); +} + + +/* + Return function +*/ + +int ros_th1_return( void ) +{ + return ros_th1_check; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) ros_th1_main( void ) +{ + uint64_t tsimu = 300*200; + ros_th1_check = ros_th1_run_rosace( tsimu ); +} + + +int ros_th1_run_rosace( uint64_t nbstep ){ + max_step_simu = nbstep; + // Set first command + ROSACE_update_altitude_command( 11000.0 ); + + // Exit + ros_th1_thread1( NULL ); + return 0; +} + + +void* ros_th1_thread1( void* arg ) { + uint64_t mystep_simu = step_simu; + + _Pragma( "loopbound min 60000 max 60000" ) + while( step_simu= 199901L +#include +#else +typedef unsigned long long uint64_t; +#endif + + +/* we need forward declaration only in order + * to avoid redefinition in assemblage_vX generated headers + * Real "#include "assemblage.h" is only done in assemblage_includes.c + */ +struct aircraft_dynamics_outs_t { + REAL_TYPE Va; + REAL_TYPE Vz; + REAL_TYPE q; + REAL_TYPE az; + REAL_TYPE h; +}; + +typedef enum SAMPLE_RANK { + SPL_T, SPL_VA,SPL_AZ,SPL_Q,SPL_VZ,SPL_H, + SPL_DELTA_TH_C, SPL_DELTA_E_C, + SPL_SIZE +} SampleRank_t; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread1/wcclibm.h b/targets/wasm-tacle/parallel/rosace/thread1/wcclibm.h new file mode 100644 index 0000000..ac30a94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread1/wcclibm.h @@ -0,0 +1,85 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, + basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, + basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +float __atanf(float x); +float __ceilf(float x); +static float __copysignf(float x, float y); +float __cosf(float x); +float __erff(float x); +float __fabsf(float x); +float __floorf(float x); +float __ieee754_acosf(float x); +float __ieee754_expf(float x); +float __ieee754_logf(float x); +float __ieee754_log10f(float x); +float __ieee754_powf(float x, float y); +static int32_t __ieee754_rem_pio2f(float x, float *y); +float __ieee754_sqrtf(float x); +int __isinff(float x); +static float __kernel_cosf(float x, float y); +static float __kernel_sinf(float x, float y, int iy); +static int __kernel_rem_pio2f(float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2); +float __sinf(float x); +float __scalbnf(float x, int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/parallel/rosace/thread2/assemblage.c b/targets/wasm-tacle/parallel/rosace/thread2/assemblage.c new file mode 100644 index 0000000..478ec4e --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/assemblage.c @@ -0,0 +1,547 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage.c + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#include "assemblage.h" +#include "assemblage_includes.h" + +// Definition of true and false here instead of using stdbool.h +#define true 1 +#define false 0 + + +double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +double Vz_control_50483_delta_e_c_elevator489_delta_e_c; +double Va_filter_100449_Va_f_Va_control_50474_Va_f[ 2 ]; +double Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ 2 ]; +double q_filter_100455_q_f_Va_control_50474_q_f[ 2 ]; +double Va_c_Va_control_50474_Va_c; +double h_filter_100446_h_f_altitude_hold_50464_h_f[ 2 ]; +double h_c_altitude_hold_50464_h_c; +double Va_control_50474_delta_th_c_delta_th_c; +double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +double elevator489_delta_e_aircraft_dynamics495_delta_e[ 3 ] = {0.0120096156525, 0.0120096156525, 0.0120096156525}; +double engine486_T_aircraft_dynamics495_T[ 3 ] = {41813.9211946, 41813.9211946, 41813.9211946}; +double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +double Va_control_50474_delta_th_c_engine486_delta_th_c; +double Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ 2 ]; +double altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c; +double q_filter_100455_q_f_Vz_control_50483_q_f[ 2 ]; +double az_filter_100458_az_f_Vz_control_50483_az_f[ 2 ]; +double Vz_control_50483_delta_e_c_delta_e_c; + +int Va_filter_100449_fun( void *args ) +{ + double Va_f; + static int Va_rcell = 0; + const struct write_proto_t Va_f_Va_control_50474_Va_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Va_f_Va_control_50474_Va_f_wcell = 0; + static int instance = 0; + + Va_f = Va_filter_100( aircraft_dynamics495_Va_Va_filter_100449_Va[ Va_rcell ] ); + Va_rcell = ( Va_rcell + 1 ) % 2; + if ( must_write( Va_f_Va_control_50474_Va_f_write, instance ) ) { + Va_filter_100449_Va_f_Va_control_50474_Va_f[ Va_f_Va_control_50474_Va_f_wcell ] = + Va_f; + Va_f_Va_control_50474_Va_f_wcell = ( Va_f_Va_control_50474_Va_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int elevator489_fun( void *args ) +{ + double delta_e; + static int delta_e_aircraft_dynamics495_delta_e_wcell = 1; + static int instance = 0; + + delta_e = elevator( Vz_control_50483_delta_e_c_elevator489_delta_e_c ); + elevator489_delta_e_aircraft_dynamics495_delta_e[ delta_e_aircraft_dynamics495_delta_e_wcell ] + = delta_e; + delta_e_aircraft_dynamics495_delta_e_wcell = + ( delta_e_aircraft_dynamics495_delta_e_wcell + 1 ) % 3; + instance++; + + return 0; +} + +int Va_control_50474_fun( void *args ) +{ + double delta_th_c; + static int Va_f_rcell = 0; + static int Vz_f_rcell = 0; + static int q_f_rcell = 0; + static int instance = 0; + + delta_th_c = Va_control_50( + Va_filter_100449_Va_f_Va_control_50474_Va_f[ Va_f_rcell ], + Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ Vz_f_rcell ], + q_filter_100455_q_f_Va_control_50474_q_f[ q_f_rcell ], + Va_c_Va_control_50474_Va_c ); + Va_f_rcell = ( Va_f_rcell + 1 ) % 2; + Vz_f_rcell = ( Vz_f_rcell + 1 ) % 2; + q_f_rcell = ( q_f_rcell + 1 ) % 2; + Va_control_50474_delta_th_c_engine486_delta_th_c = delta_th_c; + Va_control_50474_delta_th_c_delta_th_c = delta_th_c; + instance++; + + return 0; +} + +int Va_c0_fun( void *args ) +{ + double Va_c; + static int instance = 0; + + Va_c = input_Va_c(); + Va_c_Va_control_50474_Va_c = Va_c; + instance++; + + return 0; +} + +int altitude_hold_50464_fun( void *args ) +{ + double Vz_c; + static int h_f_rcell = 0; + static int instance = 0; + + Vz_c = altitude_hold_50( h_filter_100446_h_f_altitude_hold_50464_h_f[ h_f_rcell ], + h_c_altitude_hold_50464_h_c ); + h_f_rcell = ( h_f_rcell + 1 ) % 2; + altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c = Vz_c; + instance++; + + return 0; +} + +int delta_th_c0_fun( void *args ) +{ + static int instance = 0; + + output_delta_th_c( Va_control_50474_delta_th_c_delta_th_c ); + instance++; + + return 0; +} + +int az_filter_100458_fun( void *args ) +{ + double az_f; + static int az_rcell = 0; + const struct write_proto_t az_f_Vz_control_50483_az_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int az_f_Vz_control_50483_az_f_wcell = 0; + static int instance = 0; + + az_f = az_filter_100( aircraft_dynamics495_az_az_filter_100458_az[ az_rcell ] ); + az_rcell = ( az_rcell + 1 ) % 2; + if ( must_write( az_f_Vz_control_50483_az_f_write, instance ) ) { + az_filter_100458_az_f_Vz_control_50483_az_f[ az_f_Vz_control_50483_az_f_wcell ] = + az_f; + az_f_Vz_control_50483_az_f_wcell = ( az_f_Vz_control_50483_az_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int Vz_filter_100452_fun( void *args ) +{ + double Vz_f; + static int Vz_rcell = 0; + const struct write_proto_t Vz_f_Va_control_50474_Vz_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_f_Va_control_50474_Vz_f_wcell = 0; + const struct write_proto_t Vz_f_Vz_control_50483_Vz_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_f_Vz_control_50483_Vz_f_wcell = 0; + static int instance = 0; + + Vz_f = Vz_filter_100( aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ Vz_rcell ] ); + Vz_rcell = ( Vz_rcell + 1 ) % 2; + if ( must_write( Vz_f_Va_control_50474_Vz_f_write, instance ) ) { + Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ Vz_f_Va_control_50474_Vz_f_wcell ] = + Vz_f; + Vz_f_Va_control_50474_Vz_f_wcell = ( Vz_f_Va_control_50474_Vz_f_wcell + 1 ) % 2; + } + if ( must_write( Vz_f_Vz_control_50483_Vz_f_write, instance ) ) { + Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ Vz_f_Vz_control_50483_Vz_f_wcell ] = + Vz_f; + Vz_f_Vz_control_50483_Vz_f_wcell = ( Vz_f_Vz_control_50483_Vz_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int q_filter_100455_fun( void *args ) +{ + double q_f; + static int q_rcell = 0; + const struct write_proto_t q_f_Va_control_50474_q_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_f_Va_control_50474_q_f_wcell = 0; + const struct write_proto_t q_f_Vz_control_50483_q_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_f_Vz_control_50483_q_f_wcell = 0; + static int instance = 0; + + q_f = q_filter_100( aircraft_dynamics495_q_q_filter_100455_q[ q_rcell ] ); + q_rcell = ( q_rcell + 1 ) % 2; + if ( must_write( q_f_Va_control_50474_q_f_write, instance ) ) { + q_filter_100455_q_f_Va_control_50474_q_f[ q_f_Va_control_50474_q_f_wcell ] = q_f; + q_f_Va_control_50474_q_f_wcell = ( q_f_Va_control_50474_q_f_wcell + 1 ) % 2; + } + if ( must_write( q_f_Vz_control_50483_q_f_write, instance ) ) { + q_filter_100455_q_f_Vz_control_50483_q_f[ q_f_Vz_control_50483_q_f_wcell ] = q_f; + q_f_Vz_control_50483_q_f_wcell = ( q_f_Vz_control_50483_q_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int aircraft_dynamics495_fun( void *args ) +{ + struct aircraft_dynamics_outs_t aircraft_dynamics495_fun_outs; + static int delta_e_rcell = 0; + static int T_rcell = 0; + const struct write_proto_t Va_Va_filter_100449_Va_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Va_Va_filter_100449_Va_wcell = 0; + const struct write_proto_t Vz_Vz_filter_100452_Vz_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_Vz_filter_100452_Vz_wcell = 0; + const struct write_proto_t q_q_filter_100455_q_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_q_filter_100455_q_wcell = 0; + const struct write_proto_t az_az_filter_100458_az_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int az_az_filter_100458_az_wcell = 0; + const struct write_proto_t h_h_filter_100446_h_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int h_h_filter_100446_h_wcell = 0; + static int instance = 0; + + aircraft_dynamics( + elevator489_delta_e_aircraft_dynamics495_delta_e[ delta_e_rcell ], + engine486_T_aircraft_dynamics495_T[ T_rcell ], &aircraft_dynamics495_fun_outs ); + delta_e_rcell = ( delta_e_rcell + 1 ) % 3; + T_rcell = ( T_rcell + 1 ) % 3; + if ( must_write( Va_Va_filter_100449_Va_write, instance ) ) { + aircraft_dynamics495_Va_Va_filter_100449_Va[ Va_Va_filter_100449_Va_wcell ] = + aircraft_dynamics495_fun_outs.Va; + Va_Va_filter_100449_Va_wcell = ( Va_Va_filter_100449_Va_wcell + 1 ) % 2; + } + if ( must_write( Vz_Vz_filter_100452_Vz_write, instance ) ) { + aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ Vz_Vz_filter_100452_Vz_wcell ] = + aircraft_dynamics495_fun_outs.Vz; + Vz_Vz_filter_100452_Vz_wcell = ( Vz_Vz_filter_100452_Vz_wcell + 1 ) % 2; + } + if ( must_write( q_q_filter_100455_q_write, instance ) ) { + aircraft_dynamics495_q_q_filter_100455_q[ q_q_filter_100455_q_wcell ] = + aircraft_dynamics495_fun_outs.q; + q_q_filter_100455_q_wcell = ( q_q_filter_100455_q_wcell + 1 ) % 2; + } + if ( must_write( az_az_filter_100458_az_write, instance ) ) { + aircraft_dynamics495_az_az_filter_100458_az[ az_az_filter_100458_az_wcell ] = + aircraft_dynamics495_fun_outs.az; + az_az_filter_100458_az_wcell = ( az_az_filter_100458_az_wcell + 1 ) % 2; + } + if ( must_write( h_h_filter_100446_h_write, instance ) ) { + aircraft_dynamics495_h_h_filter_100446_h[ h_h_filter_100446_h_wcell ] = + aircraft_dynamics495_fun_outs.h; + h_h_filter_100446_h_wcell = ( h_h_filter_100446_h_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int h_filter_100446_fun( void *args ) +{ + double h_f; + static int h_rcell = 0; + const struct write_proto_t h_f_altitude_hold_50464_h_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int h_f_altitude_hold_50464_h_f_wcell = 0; + static int instance = 0; + + h_f = h_filter_100( aircraft_dynamics495_h_h_filter_100446_h[ h_rcell ] ); + h_rcell = ( h_rcell + 1 ) % 2; + if ( must_write( h_f_altitude_hold_50464_h_f_write, instance ) ) { + h_filter_100446_h_f_altitude_hold_50464_h_f[ h_f_altitude_hold_50464_h_f_wcell ] = + h_f; + h_f_altitude_hold_50464_h_f_wcell = ( h_f_altitude_hold_50464_h_f_wcell + 1 ) % + 2; + } + instance++; + + return 0; +} + +int engine486_fun( void *args ) +{ + double T; + static int T_aircraft_dynamics495_T_wcell = 1; + static int instance = 0; + + T = engine( Va_control_50474_delta_th_c_engine486_delta_th_c ); + engine486_T_aircraft_dynamics495_T[ T_aircraft_dynamics495_T_wcell ] = T; + T_aircraft_dynamics495_T_wcell = ( T_aircraft_dynamics495_T_wcell + 1 ) % 3; + instance++; + + return 0; +} + +int Vz_control_50483_fun( void *args ) +{ + double delta_e_c; + static int Vz_f_rcell = 0; + static int q_f_rcell = 0; + static int az_f_rcell = 0; + static int instance = 0; + + delta_e_c = Vz_control_50( + Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ Vz_f_rcell ], + altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c, + q_filter_100455_q_f_Vz_control_50483_q_f[ q_f_rcell ], + az_filter_100458_az_f_Vz_control_50483_az_f[ az_f_rcell ] ); + Vz_f_rcell = ( Vz_f_rcell + 1 ) % 2; + q_f_rcell = ( q_f_rcell + 1 ) % 2; + az_f_rcell = ( az_f_rcell + 1 ) % 2; + Vz_control_50483_delta_e_c_delta_e_c = delta_e_c; + Vz_control_50483_delta_e_c_elevator489_delta_e_c = delta_e_c; + instance++; + + return 0; +} + +int delta_e_c0_fun( void *args ) +{ + static int instance = 0; + + output_delta_e_c( Vz_control_50483_delta_e_c_delta_e_c ); + instance++; + + return 0; +} + +int h_c0_fun( void *args ) +{ + double h_c; + static int instance = 0; + + h_c = input_h_c(); + h_c_altitude_hold_50464_h_c = h_c; + instance++; + + return 0; +} + +#define PLUD_TASK_NUMBER 15 +static struct nonencoded_task_params static_task_set[ PLUD_TASK_NUMBER ] = { + { "h_c0", 1000, 0, 1, 1000, h_c0_fun }, + { "delta_e_c0", 200, 0, 1, 200, delta_e_c0_fun }, + { "Vz_control_50483", 200, 0, 1, 200, Vz_control_50483_fun }, + { "engine486", 50, 0, 1, 50, engine486_fun }, + { "h_filter_100446", 100, 0, 1, 100, h_filter_100446_fun }, + { "aircraft_dynamics495", 50, 0, 1, 50, aircraft_dynamics495_fun }, + { "q_filter_100455", 100, 0, 1, 100, q_filter_100455_fun }, + { "Vz_filter_100452", 100, 0, 1, 100, Vz_filter_100452_fun }, + { "az_filter_100458", 100, 0, 1, 100, az_filter_100458_fun }, + { "delta_th_c0", 200, 0, 1, 200, delta_th_c0_fun }, + { "altitude_hold_50464", 200, 0, 1, 200, altitude_hold_50464_fun }, + { "Va_c0", 1000, 0, 1, 1000, Va_c0_fun }, + { "Va_control_50474", 200, 0, 1, 200, Va_control_50474_fun }, + { "elevator489", 50, 0, 1, 50, elevator489_fun }, + { "Va_filter_100449", 100, 0, 1, 100, Va_filter_100449_fun } +}; + + + +void get_task_set ( int *task_number, struct nonencoded_task_params **task_set ) +{ + *task_number = PLUD_TASK_NUMBER; + *task_set = static_task_set; +} + +static struct job_prec engine486_aircraft_dynamics495_pcpat[ 1 ] = { {0, 1} }; +static struct job_prec Va_filter_100449_Va_control_50474_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec q_filter_100455_Va_control_50474_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec q_filter_100455_Vz_control_50483_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec aircraft_dynamics495_q_filter_100455_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Va_c0_Va_control_50474_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_control_50483_delta_e_c0_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_control_50483_elevator489_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_filter_100452_Va_control_50474_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Vz_filter_100452_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec h_filter_100446_altitude_hold_50464_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_az_filter_100458_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec elevator489_aircraft_dynamics495_pcpat[ 1 ] = { {0, 1} }; +static struct job_prec aircraft_dynamics495_Vz_filter_100452_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec az_filter_100458_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec h_c0_altitude_hold_50464_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec altitude_hold_50464_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_Va_filter_100449_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_h_filter_100446_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Va_control_50474_engine486_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Va_control_50474_delta_th_c0_pcpat[ 1 ] = { {0, 0} }; + +#define PLUD_PREC_NUMBER 21 +static struct multirate_precedence static_prec_set[ PLUD_PREC_NUMBER ] = { + { + "engine486", "aircraft_dynamics495", 0, 1, NULL, + engine486_aircraft_dynamics495_pcpat + }, + { + "Va_filter_100449", "Va_control_50474", 0, 1, NULL, + Va_filter_100449_Va_control_50474_pcpat + }, + { + "q_filter_100455", "Va_control_50474", 0, 1, NULL, + q_filter_100455_Va_control_50474_pcpat + }, + { + "q_filter_100455", "Vz_control_50483", 0, 1, NULL, + q_filter_100455_Vz_control_50483_pcpat + }, + { + "aircraft_dynamics495", "q_filter_100455", 0, 1, NULL, + aircraft_dynamics495_q_filter_100455_pcpat + }, + { "Va_c0", "Va_control_50474", 0, 1, NULL, Va_c0_Va_control_50474_pcpat }, + { + "Vz_control_50483", "delta_e_c0", 0, 1, NULL, + Vz_control_50483_delta_e_c0_pcpat + }, + { + "Vz_control_50483", "elevator489", 0, 1, NULL, + Vz_control_50483_elevator489_pcpat + }, + { + "Vz_filter_100452", "Va_control_50474", 0, 1, NULL, + Vz_filter_100452_Va_control_50474_pcpat + }, + { + "Vz_filter_100452", "Vz_control_50483", 0, 1, NULL, + Vz_filter_100452_Vz_control_50483_pcpat + }, + { + "h_filter_100446", "altitude_hold_50464", 0, 1, NULL, + h_filter_100446_altitude_hold_50464_pcpat + }, + { + "aircraft_dynamics495", "az_filter_100458", 0, 1, NULL, + aircraft_dynamics495_az_filter_100458_pcpat + }, + { + "elevator489", "aircraft_dynamics495", 0, 1, NULL, + elevator489_aircraft_dynamics495_pcpat + }, + { + "aircraft_dynamics495", "Vz_filter_100452", 0, 1, NULL, + aircraft_dynamics495_Vz_filter_100452_pcpat + }, + { + "az_filter_100458", "Vz_control_50483", 0, 1, NULL, + az_filter_100458_Vz_control_50483_pcpat + }, + { + "h_c0", "altitude_hold_50464", 0, 1, NULL, h_c0_altitude_hold_50464_pcpat + }, + { + "altitude_hold_50464", "Vz_control_50483", 0, 1, NULL, + altitude_hold_50464_Vz_control_50483_pcpat + }, + { + "aircraft_dynamics495", "Va_filter_100449", 0, 1, NULL, + aircraft_dynamics495_Va_filter_100449_pcpat + }, + { + "aircraft_dynamics495", "h_filter_100446", 0, 1, NULL, + aircraft_dynamics495_h_filter_100446_pcpat + }, + { + "Va_control_50474", "engine486", 0, 1, NULL, + Va_control_50474_engine486_pcpat + }, + { + "Va_control_50474", "delta_th_c0", 0, 1, NULL, + Va_control_50474_delta_th_c0_pcpat + } +}; + +void get_precedence_set ( int *prec_number, + struct multirate_precedence **prec_set ) +{ + *prec_number = PLUD_PREC_NUMBER; + *prec_set = static_prec_set; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread2/assemblage.h b/targets/wasm-tacle/parallel/rosace/thread2/assemblage.h new file mode 100644 index 0000000..0ebd5b0 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/assemblage.h @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _assemblage_H +#define _assemblage_H +#include "nonencoded_task_params.h" +#include "multirate_precedence.h" +#include "com_patterns.h" +#include "types.h" + +void get_task_set( int *task_number, struct nonencoded_task_params **task_set ); + +void get_precedence_set( int *prec_number, + struct multirate_precedence **presc ); + + +#define H_C0 0 +#define DELTA_E_C0 1 +#define VZ_CONTROL 2 +#define ENGINE 3 +#define H_FILTER 4 +#define AIRCRAFT_DYN 5 +#define Q_FILTER 6 +#define VZ_FILTER 7 +#define AZ_FILTER 8 +#define DELTA_TH_C0 9 +#define ALTI_HOLD 10 +#define VA_C0 11 +#define VA_CONTROL 12 +#define ELEVATOR 13 +#define VA_FILTER 14 + + + + + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.c b/targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.c new file mode 100644 index 0000000..d1dcd3a --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.c @@ -0,0 +1,1212 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.c + + Author: unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.c + + Changes: no major functional changes + + License: see above + +*/ + +#include "wcclibm.h" +#include "assemblage_includes.h" + + +#define MATH_COS cosf +#define MATH_SIN sinf +#define pow powf +#define atan atanf +#define sin sinf +#define sqrt sqrtf + +/* + The following include file is generated by the Prelude compiler + Theoretically we should include main node specific include + i.e. assemblage_vX.h but we know that every main node + assemblage, assemblage_v2, assemblage_v3, etc... share the + very same data type. +*/ + +/* Period/Frequency of the nodes */ +const REAL_TYPE dt = 1.0f / 200.0; +const REAL_TYPE dt_de = 1.0 / 200.0; +const REAL_TYPE dt_dx = 1.0 / 200.0; + +/* Controller parameters */ +/* Altitude hold */ +const REAL_TYPE Kp_h = 0.1014048; +const REAL_TYPE Ki_h = 0.0048288; +const REAL_TYPE h_switch = 50.0; + +// Setpoint commands +REAL_TYPE Vz_c = -2.5; +REAL_TYPE Va_c = 0.0; +REAL_TYPE h_c = 10000; + +/* Va Speed controller */ +const REAL_TYPE K1_intVa = 0.049802610664357; +const REAL_TYPE K1_Va = -0.486813084356079; +const REAL_TYPE K1_Vz = -0.077603095495388; +const REAL_TYPE K1_q = 21.692383376322041; + +/* Vz Speed controller */ +const REAL_TYPE K2_intVz = 0.000627342822264; +const REAL_TYPE K2_Vz = -0.003252836726554; +const REAL_TYPE K2_q = 0.376071446897134; +const REAL_TYPE K2_az = -0.001566907423747; + +/* Trimming parameters */ +const REAL_TYPE h_eq = 10000.0; +const REAL_TYPE Va_eq = 230.0; +const REAL_TYPE Vz_eq = 0.0; +const REAL_TYPE alpha_eq = 0.026485847681737; +const REAL_TYPE theta_eq = 0.026485847681737; + +/* Atmosphere parameters */ +const REAL_TYPE rho0 = 1.225; +const REAL_TYPE g0 = 9.80665; +const REAL_TYPE T0_0 = 288.15; +const REAL_TYPE T0_h = -0.0065; +const REAL_TYPE Rs = 287.05; + +/* Aircraft parameters */ +const REAL_TYPE masse = 57837.5; +const REAL_TYPE I_y = 3781272.0; +const REAL_TYPE S = 122.6; +const REAL_TYPE cbar = 4.29; +const REAL_TYPE CD_0 = 0.016; +const REAL_TYPE CD_alpha = 2.5; +const REAL_TYPE CD_deltae = 0.05; +const REAL_TYPE CL_alpha = 5.5; +const REAL_TYPE CL_deltae = 0.193; +const REAL_TYPE alpha_0 = -0.05; +const REAL_TYPE Cm_0 = 0.04; +const REAL_TYPE Cm_alpha = -0.83; +const REAL_TYPE Cm_deltae = -1.5; +const REAL_TYPE Cm_q = -30; + + +#define FMTFLOAT "%5.15f" + + +/* Va filter 100 Hz */ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.956543675476034; + static REAL_TYPE a1 = -1.955578398054313; + static REAL_TYPE b0 = 0.000479064865372430; + static REAL_TYPE b1 = 0.000486212556348925; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 100 Hz */ + + +/* Va filter 50 Hz */ +REAL_TYPE +Va_filter_50( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.914975803093201; + static REAL_TYPE a1 = -1.911199519984605; + static REAL_TYPE b0 = 0.001860178914816; + static REAL_TYPE b1 = 0.001916104193780; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 50 Hz */ + + +/* Va filter 33 Hz */ +REAL_TYPE +Va_filter_33( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.874036784828483; + static REAL_TYPE a1 = -1.865563793814790; + static REAL_TYPE b0 = 0.004141433623051; + static REAL_TYPE b1 = 0.004331557390642; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 33 Hz */ + + +/* Va filter 25 Hz */ +REAL_TYPE +Va_filter_25( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.837180720246048; + static REAL_TYPE a1 = -1.822731999002980; + static REAL_TYPE b0 = 0.007010380719078; + static REAL_TYPE b1 = 0.007438340523990; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 25 Hz */ + + +/* Vz filter 100 Hz */ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.956543675476034; + static REAL_TYPE a1 = -1.955578398054313; + static REAL_TYPE b0 = 0.000479064865372430; + static REAL_TYPE b1 = 0.000486212556348925; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 100 Hz */ + + +/* Vz filter 50 Hz */ +REAL_TYPE +Vz_filter_50( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0, x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.914975803093201; + static REAL_TYPE a1 = -1.911199519984605; + static REAL_TYPE b0 = 0.001860178914816; + static REAL_TYPE b1 = 0.001916104193780; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 50 Hz */ + + +/* Vz filter 33 Hz */ +REAL_TYPE +Vz_filter_33( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0, x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.874036784828483; + static REAL_TYPE a1 = -1.865563793814790; + static REAL_TYPE b0 = 0.004141433623051; + static REAL_TYPE b1 = 0.004331557390642; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 33 Hz */ + + +/* Vz filter 25 Hz */ +REAL_TYPE +Vz_filter_25( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.837180720246048; + static REAL_TYPE a1 = -1.822731999002980; + static REAL_TYPE b0 = 0.007010380719078; + static REAL_TYPE b1 = 0.007438340523990; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 25 Hz */ + + +/* q filter 100 Hz */ +REAL_TYPE +q_filter_100( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.766000101841272; + static REAL_TYPE a1 = -1.734903205885821; + static REAL_TYPE b0 = 0.014857648981438; + static REAL_TYPE b1 = 0.016239246974013; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 100 Hz */ + + +/* q filter 50 Hz */ +REAL_TYPE +q_filter_50( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.586756156020839; + static REAL_TYPE a1 = -1.477888930110354; + static REAL_TYPE b0 = 0.049596808318647; + static REAL_TYPE b1 = 0.059270417591839; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 50 Hz */ + + +/* q filter 33 Hz */ +REAL_TYPE +q_filter_33( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.445839214374383; + static REAL_TYPE a1 = -1.227970132817902; + static REAL_TYPE b0 = 0.094268996251840; + static REAL_TYPE b1 = 0.123600085304640; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 33 Hz */ + + +/* q filter 25 Hz */ +REAL_TYPE +q_filter_25( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.344282786628352; + static REAL_TYPE a1 = -1.010643377701049; + static REAL_TYPE b0 = 0.137177088974822; + static REAL_TYPE b1 = 0.196462319952482; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 25 Hz */ + + +/* az filter 100 Hz */ +REAL_TYPE +az_filter_100( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficient */ + static REAL_TYPE a0 = 0.411240701442774; + static REAL_TYPE a1 = -1.158045899830964; + static REAL_TYPE b0 = 0.107849979167580; + static REAL_TYPE b1 = 0.145344822444230; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 100 Hz */ + + +/* az filter 50 Hz */ +REAL_TYPE +az_filter_50( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.169118914523145; + static REAL_TYPE a1 = -0.518588903229759; + static REAL_TYPE b0 = 0.229019233988375; + static REAL_TYPE b1 = 0.421510777305010; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 50 Hz */ + + +/* az filter 33 Hz */ +REAL_TYPE +az_filter_33( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.067700864731348; + static REAL_TYPE a1 = -0.115832026705568; + static REAL_TYPE b0 = 0.263451167882487; + static REAL_TYPE b1 = 0.688417670143293; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 33 Hz */ + + +/* az filter 25 Hz */ +REAL_TYPE +az_filter_25( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.028601207249487; + static REAL_TYPE a1 = 0.069303378493245; + static REAL_TYPE b0 = 0.228783762747218; + static REAL_TYPE b1 = 0.869120822995514; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 25 Hz */ + + +/* h filter 100 Hz*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.766000101841272; + static REAL_TYPE a1 = -1.734903205885821; + static REAL_TYPE b0 = 0.014857648981438; + static REAL_TYPE b1 = 0.016239246974013; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 100 Hz */ + + +/* h filter 50 Hz*/ +REAL_TYPE +h_filter_50( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.586756156020839; + static REAL_TYPE a1 = -1.477888930110354; + static REAL_TYPE b0 = 0.049596808318647; + static REAL_TYPE b1 = 0.059270417591839; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 50 Hz */ + + +/* h filter 33 Hz*/ +REAL_TYPE +h_filter_33( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.445839214374383; + static REAL_TYPE a1 = -1.227970132817902; + static REAL_TYPE b0 = 0.094268996251840; + static REAL_TYPE b1 = 0.123600085304640; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 33 Hz */ + + +/* h filter 25 Hz*/ +REAL_TYPE +h_filter_25( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.344282786628352; + static REAL_TYPE a1 = -1.010643377701049; + static REAL_TYPE b0 = 0.137177088974822; + static REAL_TYPE b1 = 0.196462319952482; /**/ + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 25 Hz */ + + +/* Altitude hold controller 50 Hz */ + +REAL_TYPE +altitude_hold_50( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 50.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 33 Hz */ + +REAL_TYPE +altitude_hold_33( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 33.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 25 Hz */ + +REAL_TYPE +altitude_hold_25( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 25.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 10 Hz */ + +REAL_TYPE +altitude_hold_10( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 10.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Va Speed controller 50 Hz */ +REAL_TYPE +Va_control_50( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 33 Hz */ +REAL_TYPE +Va_control_33( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + +// Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; +// State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 25 Hz */ +REAL_TYPE +Va_control_25( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 10 Hz */ +REAL_TYPE +Va_control_10( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Vz Speed controller 50 Hz */ +REAL_TYPE +Vz_control_50( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 33 Hz */ +REAL_TYPE +Vz_control_33( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 25 Hz */ +REAL_TYPE +Vz_control_25( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 10 Hz */ +REAL_TYPE +Vz_control_10( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Engine */ +REAL_TYPE +engine( REAL_TYPE delta_th_c ) +{ + + static REAL_TYPE y = delta_th_eq; + static REAL_TYPE x1 = delta_th_eq; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE tau = 0.75; + + // Output + y = 26350.0 * x1; + // State Equation + x1_dot = -tau * x1 + tau * delta_th_c; + // Update State + x1 += dt_dx * x1_dot; + + return y; +} + + +/* Elevator */ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ) +{ + + static REAL_TYPE y = delta_e_eq; + static REAL_TYPE x1 = delta_e_eq; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE x2_dot = 0.0; + static REAL_TYPE omega = 25.0; + static REAL_TYPE xi = 0.85; + + // Output + y = x1; + // State Equation + x1_dot = x2; + x2_dot = -omega * omega * x1 - 2.0 * xi * omega * x2 + + omega * omega * delta_e_c; + // Update State + x1 += dt_de * x1_dot; + x2 += dt_de * x2_dot; + + return y; +} + + +/* Flight dynamics */ +void aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ) +{ + + static int debut = 1; + + static REAL_TYPE u = 0.0; + static REAL_TYPE w = 0.0; + static REAL_TYPE q = 0.0; + static REAL_TYPE theta = 0.0; + static REAL_TYPE h = 0.0; + static REAL_TYPE u_dot = 0.0; + static REAL_TYPE w_dot = 0.0; + static REAL_TYPE q_dot = 0.0; + static REAL_TYPE theta_dot = 0.0; + static REAL_TYPE h_dot = 0.0; + + static REAL_TYPE CD = 0.0; + static REAL_TYPE CL = 0.0; + static REAL_TYPE Cm = 0.0; + + static REAL_TYPE Xa = 0.0; + static REAL_TYPE Za = 0.0; + static REAL_TYPE Ma = 0.0; + + static REAL_TYPE alpha = 0.0; + static REAL_TYPE qbar = 0.0; + static REAL_TYPE V = 0.0; + static REAL_TYPE rho = 0.0; + + if ( debut ) { + debut = 0; + u = Va_eq * MATH_COS( theta_eq ); + w = Va_eq * MATH_SIN( theta_eq ); + q = 0.0; + theta = theta_eq; + h = h_eq; + } + + rho = rho0 * pow( 1.0 + T0_h / T0_0 * h, - g0 / ( Rs * T0_h ) - 1.0 ); + alpha = atan( w / u ); + V = sqrt( u * u + w * w ); + qbar = 0.5 * rho * V * V; + CL = CL_deltae * delta_e + CL_alpha * ( alpha - alpha_0 ); + CD = CD_0 + CD_deltae * delta_e + + CD_alpha * ( alpha - alpha_0 ) * ( alpha - alpha_0 ); + Cm = Cm_0 + Cm_deltae * delta_e + + Cm_alpha * alpha + 0.5 * Cm_q * q * cbar / V; + Xa = - qbar * S * ( CD * MATH_COS( alpha ) - CL * MATH_SIN( alpha ) ); + Za = - qbar * S * ( CD * MATH_SIN( alpha ) + CL * MATH_COS( alpha ) ); + Ma = qbar * cbar * S * Cm; + + // Output + outputs -> Va = V; + outputs -> Vz = w * MATH_COS( theta ) - u * MATH_SIN( theta ); + outputs -> q = q; + outputs -> az = g0 * MATH_COS( theta ) + Za / masse; + outputs -> h = h; + // State Equation + u_dot = - g0 * sin ( theta ) - q * w + ( Xa + T ) / masse; + w_dot = g0 * MATH_COS ( theta ) + q * u + Za / masse; + q_dot = Ma / I_y; + theta_dot = q; + h_dot = u * MATH_SIN( theta ) - w * MATH_COS( theta ); + // Update State + u += dt * u_dot; + w += dt * w_dot; + q += dt * q_dot; + theta += dt * theta_dot; + h += dt * h_dot; + + + static REAL_TYPE Time = 0.0; + + + // instant++; + Time = Time + dt; +} + + +/* + The commanded altitude +*/ +REAL_TYPE input_h_c( void ) +{ + return h_c; +} + + +/* + The commanded airspeed +*/ +REAL_TYPE input_Va_c( void ) +{ + return Va_c; +} + + +void output_delta_th_c( REAL_TYPE delta_th_c ) +{ + +} + + +void output_delta_e_c( REAL_TYPE delta_e_c ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.h b/targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.h new file mode 100644 index 0000000..747c4b1 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/assemblage_includes.h @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef ASSEMBLAGE_INCLUDES_H +#define ASSEMBLAGE_INCLUDES_H +#include "types.h" +#include "io.h" + + +/* *************************************************************************** + Shared constants + * ************************************************************************* */ +#define delta_th_eq (1.5868660794926) +#define delta_e_eq (0.012009615652468) +extern const REAL_TYPE h_eq; +extern const REAL_TYPE Va_eq; +#ifndef NBMAX_SAMPLE +#define NBMAX_SAMPLE (6000000/4) +#endif +extern REAL_TYPE sample[ SPL_SIZE ][ NBMAX_SAMPLE ]; + +void print_inmemory_sample( void ); + +/* *************************************************************************** + The prelude imported node prototypes + * ************************************************************************* */ +/** + Va filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Va, airspeed (m/s) + @return Va_f, filtered airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_50( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_33( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_25( REAL_TYPE Va ); + +/** + Vz filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Vz, vertical speed (m/s) + @return Vz_f, filtered vertical airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_50 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_33 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_25 ( REAL_TYPE Vz ); + +/** + q filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] q, pitch rate (rad/s) + @return q_f, filtered pitch rate (rad/s) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +q_filter_100( REAL_TYPE q ); + +REAL_TYPE +q_filter_50 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_33 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_25 ( REAL_TYPE q ); + +/** + az filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] az, normal acceleration (m/s^2) + @return az_f, filtered normal acceleration (m/s^2) + 2nd order Butterworth filter with fc = 10.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +az_filter_100( REAL_TYPE az ); + +REAL_TYPE +az_filter_50 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_33 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_25 ( REAL_TYPE az ); + +/** + h filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] h, altitude (m) + @return h_f, filtered altitude (m) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ); + +REAL_TYPE +h_filter_50 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_33 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_25 ( REAL_TYPE h ); + +/** + Altitude hold controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] h_f, filtered altitude (m) + @param[in] h_c, commanded altitude (m) + @return Vz_c, commanded vertical speed (m/s) + Generates the vertical speed command Vz_c to track altitude change h_c +*/ +REAL_TYPE +altitude_hold_50 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_33 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_25 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_10 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +/** + Vz Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] Vz_c, commanded vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @param[in] az_f, filtered normal acceleration (m/s^2) + @return delta_e_c, commanded elevator deflection (rad) + Generates the elevator deflection command to track vertical speed command Vz_c +*/ +REAL_TYPE +Vz_control_50 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_33 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_25 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_10 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +/** + Va Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Va_f, filtered airspeed (m/s) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @return delta_th_c, commanded throttle (-) + Generates the throttle command to track airspeed change Va_c +*/ +REAL_TYPE +Va_control_50 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_33 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_25 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_10 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +/** + Engine (200 Hz --> 5ms period) + @param[in] delta_th_c, commanded throttle (-) + @return T, Thrust (N) + 1st order system with time constant 0.5 s + ODE Solver: Euler method with fixed-step = 0.005 (200 Hz) +*/ +REAL_TYPE +engine( REAL_TYPE delta_th_c ); + +/** + Elevator (200 Hz --> 5ms period) + @param[in] delta_e_c, commanded elevator deflection (rad) + @return delta_e, elevator deflection (rad) + 2nd order system (natural frequency omega = 25.0 rad/s and damping xi = 0.85) + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ); + +/** + Flight dynamics (200 Hz --> 5ms period) + @param[in] i, the simulation step + @param[in] delta_e, elevator deflection (rad) + @param[in] T, Thrust (N) + @param[out] outputs, the outputs Va, Vz, q, az, h + Aircraft flight dynamics + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +void +aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ); + +/* *************************************************************************** + The prelude sensor node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +REAL_TYPE +input_h_c( void ); + +REAL_TYPE +input_Va_c( void ); + + +/* *************************************************************************** + The prelude actuator node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_th_c( REAL_TYPE delta_th_c ); + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_e_c( REAL_TYPE delta_e_c ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/com_patterns.h b/targets/wasm-tacle/parallel/rosace/thread2/com_patterns.h new file mode 100644 index 0000000..8b98cd7 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/com_patterns.h @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: com_patterns.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: com_patterns.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef com_patterns_H_ +#define com_patterns_H_ +// Description of communication protocols using ultimately periodic +// words: prefix.(periodic pattern). Each communication uses a circular +// buffer shared between the writer and the reader. + +// The task instance i writes to the communication buffer iff proto[n] +// is true (modulo the size of the periodic word). After each write, the +// index where the writer writes is incremented. +struct write_proto_t { + int *write_pref; + int wpref_size; + int *write_pat; + int wpat_size; +}; + +// The task instance n must increment the index at which the task reads +// in the communication buffer iff proto[n] is true (modulo the size of the +// periodic word). +struct read_proto_t { + int *change_pref; + int rpref_size; + int *change_pat; + int rpat_size; +}; + +/** + Returns 1 if instance n must write in the com buffer. +*/ +static inline int must_write( struct write_proto_t wp, int n ) +{ + if ( n < wp.wpref_size ) + return wp.write_pref[ n ]; + else + return wp.write_pat[ ( n - wp.wpref_size ) % wp.wpat_size ]; +} + + +/** + Returns 1 if instance n must change the cell from which it reads. +*/ +static inline int must_change( struct read_proto_t rp, int n ) +{ + if ( n < rp.rpref_size ) + return rp.change_pref[ n ]; + else + return rp.change_pat[ ( n - rp.rpref_size ) % rp.rpat_size ]; +} + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/common.c b/targets/wasm-tacle/parallel/rosace/thread2/common.c new file mode 100644 index 0000000..d52da59 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/common.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.c + + Author: Dustin Green + + Function: Common used functions from original threads.c + + Source: + + Original name: + + Changes: No major changes of functions from original threads.c + + License: See the terms above. + +*/ + +#include "common.h" +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +void rosace_init( void ) +{ + + // Initial values + outs.sig_outputs.Va = 0; + outs.sig_outputs.Vz = 0; + outs.sig_outputs.q = 0; + outs.sig_outputs.az = 0; + outs.sig_outputs.h = 0; + outs.t_simu = 0; + step_simu = 0; + + // Get the task set (required for CALL() macro) + int tmp; + get_task_set( &tmp, &tasks ); +} + + +void copy_output_vars( output_t *v, uint64_t step ) +{ + v->sig_outputs.Va = aircraft_dynamics495_Va_Va_filter_100449_Va[ step % 2 ]; + v->sig_outputs.Vz = aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ step % 2 ]; + v->sig_outputs.q = aircraft_dynamics495_q_q_filter_100455_q[ step % 2 ]; + v->sig_outputs.az = aircraft_dynamics495_az_az_filter_100458_az[ step % 2 ]; + v->sig_outputs.h = aircraft_dynamics495_h_h_filter_100446_h[ step % 2 ]; + v->sig_delta_th_c = Va_control_50474_delta_th_c_delta_th_c; + v->sig_delta_e_c = Vz_control_50483_delta_e_c_delta_e_c; +} + diff --git a/targets/wasm-tacle/parallel/rosace/thread2/common.h b/targets/wasm-tacle/parallel/rosace/thread2/common.h new file mode 100644 index 0000000..315ab80 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/common.h @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.h + + Author: Dustin Green + + Function: Common used functions and variables from original threads.c + + Source: + + Original name: + + Changes: No major functional changes + + License: See the terms above. + +*/ + +#ifndef COMMON_H +#define COMMON_H + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +// I/O +output_t outs; +uint64_t step_simu; +uint64_t max_step_simu; + + +// Output variables +extern double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +extern double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +extern double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +extern double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +extern double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +extern double Va_control_50474_delta_th_c_delta_th_c; +extern double Vz_control_50483_delta_e_c_delta_e_c; + + +// Task set +struct nonencoded_task_params *tasks; + + +// Common functions +void rosace_init( void ); +void copy_output_vars( output_t *v, uint64_t step ); + + +// This should be set to 1 to run in "real-time" in the sense +// that the simulation time is close to the real world time +#define RUN_WITH_REAL_TIME 0 + +#define CALL( val ) tasks[ (val) ].ne_t_body( NULL ) + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/io.c b/targets/wasm-tacle/parallel/rosace/thread2/io.c new file mode 100644 index 0000000..ad775fb --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/io.c @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.c + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.c + + Changes: delete the code within ROSACE_write_outputs because + stdio.h is not available + + License: See the terms above. + +*/ + +#include "types.h" +#include "io.h" + +#define FMTREAL "%5.15f" +#define BASE_FREQUENCY 200.0 + +extern REAL_TYPE h_c; + +void ROSACE_update_altitude_command( REAL_TYPE h_cons ) +{ + h_c = h_cons; +} + +void ROSACE_write_outputs( output_t *v ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread2/io.h b/targets/wasm-tacle/parallel/rosace/thread2/io.h new file mode 100644 index 0000000..be20e10 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/io.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.h + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_IO_H +#define __DEF_ROSACE_IO_H + +#include "types.h" + +typedef struct { + struct aircraft_dynamics_outs_t sig_outputs; + uint64_t t_simu; + REAL_TYPE sig_delta_th_c; + REAL_TYPE sig_delta_e_c; +} output_t; + +void ROSACE_write_outputs( output_t *v ); +void ROSACE_update_altitude_command( REAL_TYPE h_cons ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/math_all.c b/targets/wasm-tacle/parallel/rosace/thread2/math_all.c new file mode 100644 index 0000000..3400e74 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/math_all.c @@ -0,0 +1,2278 @@ + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_all.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_all.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#include "math_private.h" +#include "wcclibm.h" + +// The following defines map the math functions to specialized calls. +// The declarations in math.h are bound to the official interface names. +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +// The list of defined functions with their official interface names +float __atanf( float x ); +float __ceilf( float x ); +float __copysignf( float x, float y ); +float __cosf( float x ); +float __erff( float x ); +float __fabsf( float x ); +float __floorf( float x ); +float __ieee754_acosf( float x ); +float __ieee754_expf( float x ); +float __ieee754_logf( float x ); +float __ieee754_log10f( float x ); +float __ieee754_powf( float x, float y ); +int32_t __ieee754_rem_pio2f( float x, float *y ); +float __ieee754_sqrtf( float x ); +int __isinff( float x ); +float __kernel_cosf( float x, float y ); +float __kernel_sinf( float x, float y, int iy ); +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2 ); +float __sinf( float x ); +float __scalbnf( float x, int n ); + + +// Often used variables/consts +#ifdef __STDC__ +const float +#else +float +#endif +one = 1.0f, +tiny = 1.0e-30f, +half = 5.0000000000e-01f, /* 0x3f000000 */ +huge = 1.0e30f, +two = 2.0f, +two24 = 16777216.0f, /* 0x4b800000 */ +two25 = 3.3554432000e+07f, /* 0x4c000000 */ +two8 = 2.5600000000e+02f, /* 0x43800000 */ +twon8 = 3.9062500000e-03f, /* 0x3b800000 */ +zero = 0.0f; + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00f, /\* 0x3F800000 *\/ */ +pi = 3.1415925026e+00f, /* 0x40490fda */ +pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ +pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ +pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ +pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ +pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ +pS3 = -4.0055535734e-02f, /* 0xbd241146 */ +pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ +pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ +qS1 = -2.4033949375e+00f, /* 0xc019d139 */ +qS2 = 2.0209457874e+00f, /* 0x4001572d */ +qS3 = -6.8828397989e-01f, /* 0xbf303361 */ +qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +#ifdef __STDC__ +float __ieee754_acosf( float x ) +#else +float __ieee754_acosf( x ) +float x; +#endif +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return pi + ( float )2.0f * pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return pio2_hi + pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + return pio2_hi - ( x - ( pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( one + x ) * ( float )0.5f; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + s = __ieee754_sqrtf( z ); + r = p / q; + w = r * s - pio2_lo; + return pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( one - x ) * ( float )0.5f; + s = __ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* static const float huge = 1.0e+30f, tiny = 1.0e-30f; */ + +#ifdef __STDC__ +const float +#else +float +#endif +bp[] = {1.0f, 1.5f,}, + dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* zero = 0.0f, */ + /* one = 1.0f, */ + /* two = 2.0f, */ + /* two24 = 16777216.0f, /\* 0x4b800000 *\/ */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + L1 = 6.0000002384e-01f, /* 0x3f19999a */ + L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + P3 = 6.6137559770e-05f, /* 0x388ab355 */ + P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +float __ieee754_powf( float x, float y ) +#else +float __ieee754_powf( x, y ) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return one; + + /* x==+-1 */ + if ( x == 1.0f ) return one; + if ( x == -1.0f && isinff( y ) ) return one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return __ieee754_sqrtf( x ); + } + + ax = fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? huge * huge : tiny * tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? huge * huge : tiny * tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * ivln2_l - w * ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( L1 + s2 * ( L2 + s2 * ( L3 + s2 * ( L4 + s2 * + ( L5 + s2 * L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l * p_h + p_l * cp + dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - dp_h[ k ] ) - z_h ); + } + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * huge * huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + ovt > z - p_h ) return s * huge * huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * tiny * tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * tiny * tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * lg2_h; + v = ( p_l - ( t - p_h ) ) * lg2 + t * lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( P1 + t * ( P2 + t * ( P3 + t * ( P4 + t * P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - two ) - ( w + z * w ); + z = one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = __scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] + use __kernel_rem_pio2f() +*/ + + +/* + Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi +*/ +#ifdef __STDC__ +const int32_t two_over_pi[] = { +#else +int32_t two_over_pi[] = { +#endif + 0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC, + 0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62, + 0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63, + 0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A, + 0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09, + 0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29, + 0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44, + 0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41, + 0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C, + 0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8, + 0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11, + 0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF, + 0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E, + 0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5, + 0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92, + 0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08, + 0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0, + 0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3, + 0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85, + 0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80, + 0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA, + 0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B, +}; + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int32_t npio2_hw[] = { +#else +int32_t npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t __ieee754_rem_pio2f( float x, float *y ) +#else +int32_t __ieee754_rem_pio2f( x, y ) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + float tx[ 3 ]; + int32_t e0, i, j, nx, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= pio2_2; + y[ 0 ] = z - pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += pio2_2; + y[ 0 ] = z + pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * invpio2 + half ); + fn = ( float )n; + r = t - fn * pio2_1; + w = fn * pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * pio2_2; + r = t - w; + w = fn * pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * pio2_3; + r = t - w; + w = fn * pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + /* set z = scalbn(|x|,ilogb(x)-7) */ + e0 = ( ix >> 23 ) - 134; /* e0 = ilogb(z)-7; */ + SET_FLOAT_WORD( z, ix - ( ( int32_t )( e0 << 23 ) ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < 2; i++ ) { + tx[ i ] = ( float )( ( int32_t )( z ) ); + z = ( z - tx[ i ] ) * two8; + } + tx[ 2 ] = z; + nx = 3; + _Pragma( "loopbound min 0 max 0" ) + while ( tx[ nx - 1 ] == zero ) { + nx--; /* skip zero term */ + } + n = __kernel_rem_pio2f( tx, y, e0, nx, 2, two_over_pi ); + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } + return n; +} +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: e_sqrtf.c,v 1.4 1995/05/10 20:46:19 jtc Exp $"; +#endif + + +/* #ifdef __STDC__ */ +/* static const float one = 1.0f, tiny=1.0e-30f; */ +/* #else */ +/* static float one = 1.0f, tiny=1.0e-30f; */ +/* #endif */ + +#ifdef __STDC__ +float __ieee754_sqrtf( float x ) +#else +float __ieee754_sqrtf( x ) +float x; +#endif +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 0 max 0" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = one - tiny; /* trigger inexact flag */ + if ( z >= one ) { + z = one + tiny; + if ( z > one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +C4 = -2.7557314297e-07f, /* 0xb493f27c */ +C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float __kernel_cosf( float x, float y ) +#else +float __kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return one; /* generate inexact */ + } + z = x * x; + r = z * ( C1 + z * ( C2 + z * ( C3 + z * ( C4 + z * ( C5 + z * C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} +/* k_rem_pio2f.c -- float version of k_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: k_rem_pio2f.c,v 1.4 1995/05/10 20:46:28 jtc Exp $"; +#endif + + +/* In the float version, the input parameter x contains 8 bit + integers, not 24 bit integers. 113 bit precision is not supported. */ + +#ifdef __STDC__ +const int init_jk[] = {4, 7, 9}; /* initial value for jk */ +#else +int init_jk[] = {4, 7, 9}; +#endif + +#ifdef __STDC__ +const float PIo2[] = { +#else +float PIo2[] = { +#endif + 1.5703125000e+00f, /* 0x3fc90000 */ + 4.5776367188e-04f, /* 0x39f00000 */ + 2.5987625122e-05f, /* 0x37da0000 */ + 7.5437128544e-08f, /* 0x33a20000 */ + 6.0026650317e-11f, /* 0x2e840000 */ + 7.3896444519e-13f, /* 0x2b500000 */ + 5.3845816694e-15f, /* 0x27c20000 */ + 5.6378512969e-18f, /* 0x22d00000 */ + 8.3009228831e-20f, /* 0x1fc40000 */ + 3.2756352257e-22f, /* 0x1bc60000 */ + 6.3331015649e-25f, /* 0x17440000 */ +}; + + +#ifdef __STDC__ +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ) +#else +int __kernel_rem_pio2f( x, y, e0, nx, prec, ipio2 ) +float x[], y[]; +int e0, nx, prec; +int32_t ipio2[]; +#endif +{ + int32_t jz, jx, jv, jp, jk, carry, n, iq[ 20 ], i, j, k, m, q0, ih; + float z, fw, f[ 20 ], fq[ 20 ], q[ 20 ]; + + /* initialize jk*/ + jk = init_jk[ prec ]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx - 1; + jv = ( e0 - 3 ) / 8; + if ( jv < 0 ) jv = 0; + q0 = e0 - 8 * ( jv + 1 ); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv - jx; + m = jx + jk; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= m; i++, j++ ) + f[i] = ( j < 0 ) ? zero : ( float ) ipio2[ j ]; + + /* compute q[0],q[1],...q[jk] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= jk; i++ ) { + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[ i ] = fw; + } + + jz = jk; +recompute: + ; + /* distill q[] into iq[] reversingly */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0, j = jz, z = q[ jz ]; j > 0; i++, j-- ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[i] = ( int32_t )( z - two8 * fw ); + z = q[ j - 1 ] + fw; + } + + /* compute n */ + z = __scalbnf( z, q0 ); /* actual value of z */ + z -= ( float )8.0f * __floorf( z * ( float ) + 0.125f ); /* trim off integer >= 8 */ + n = ( int32_t ) z; + z -= ( float )n; + ih = 0; + if ( q0 > 0 ) { /* need iq[jz-1] to determine n */ + i = ( iq[ jz - 1 ] >> ( 8 - q0 ) ); + n += i; + iq[ jz - 1 ] -= i << ( 8 - q0 ); + ih = iq[ jz - 1 ] >> ( 7 - q0 ); + } else + if ( q0 == 0 ) ih = iq[ jz - 1 ] >> 8; + else + if ( z >= ( float )0.5f ) ih = 2; + + if ( ih > 0 ) { /* q > 0.5 */ + n += 1; + carry = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < jz ; i++ ) { /* compute 1-q */ + j = iq[ i ]; + if ( carry == 0 ) { + if ( j != 0 ) { + carry = 1; + iq[ i ] = 0x100 - j; + } + } else iq[ i ] = 0xff - j; + + } + if ( q0 > 0 ) { /* rare case: chance is 1 in 12 */ + switch ( q0 ) { + case 1: + iq[ jz - 1 ] &= 0x7f; + break; + case 2: + iq[ jz - 1 ] &= 0x3f; + break; + } + } + if ( ih == 2 ) { + z = one - z; + if ( carry != 0 ) z -= __scalbnf( one, q0 ); + } + } + + /* check if recomputation is needed */ + if ( z == zero ) { + j = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz - 1; i >= jk; i-- ) + j |= iq[ i ]; + if ( j == 0 ) { /* need recomputation */ + _Pragma( "loopbound min 0 max 0" ) + for ( k = 1; iq[ jk - k ] == 0; k++ ) { + ; /* k = no. of terms needed */ + } + + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz + 1; i <= jz + k; i++ ) { /* add q[jz+1] to q[jz+k] */ + f[ jx + i ] = ( float ) ipio2[ jv + i ]; + _Pragma( "loopbound min 0 max 0" ) + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if ( z == ( float )0.0f ) { + jz -= 1; + q0 -= 8; + _Pragma( "loopbound min 0 max 0" ) + while ( iq[ jz ] == 0 ) { + jz--; + q0 -= 8; + } + } else { /* break z into 8-bit if necessary */ + z = __scalbnf( z, -q0 ); + if ( z >= two8 ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[ jz ] = ( int32_t )( z - two8 * fw ); + jz += 1; + q0 += 8; + iq[ jz ] = ( int32_t ) fw; + } else iq[ jz ] = ( int32_t ) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = __scalbnf( one, q0 ); + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + q[ i ] = fw * ( float )iq[ i ]; + fw *= twon8; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, k = 0; k <= jp && k <= jz - i; k++ ) + fw += PIo2[ k ] * q[ i + k ]; + fq[ jz - i ] = fw; + } + + /* compress fq[] into y[] */ + switch ( prec ) { + case 0: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + break; + case 1: + case 2: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + fw = fq[ 0 ] - fw; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i <= jz; i++ ) + fw += fq[ i ]; + y[ 1 ] = ( ih == 0 ) ? fw : -fw; + break; + case 3:; /* painful */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 0; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 1; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, i = jz; i >= 2; i-- ) + fw += fq[ i ]; + + if ( ih == 0 ) { + y[ 0 ] = fq[ 0 ]; + y[ 1 ] = fq[ 1 ]; + y[ 2 ] = fw; + } else { + y[ 0 ] = -fq[ 0 ]; + y[ 1 ] = -fq[ 1 ]; + y[ 2 ] = -fw; + } + } + return n & 7; +} +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +S2 = 8.3333337680e-03f, /* 0x3c088889 */ +S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float __kernel_sinf( float x, float y, int iy ) +#else +float __kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = S2 + z * ( S3 + z * ( S4 + z * ( S5 + z * S6 ) ) ); + if ( iy == 0 ) return x + v * ( S1 + z * r ); + else return x - ( ( z * ( half * y - v * r ) - y ) - v * S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float atanhi[] = { +#else +float atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float atanlo[] = { +#else +float atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float aT[] = { +#else +float aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float __atanf( float x ) +#else +float __atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return atanhi[ 3 ] + atanlo[ 3 ]; + else return -atanhi[ 3 ] - atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( huge + x > one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - one ) / ( x + one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z * ( aT[ 0 ] + w * ( aT[ 2 ] + w * ( aT[ 4 ] + w * ( aT[ 6 ] + w * + ( aT[ 8 ] + w * aT[ 10 ] ) ) ) ) ); + s2 = w * ( aT[ 1 ] + w * ( aT[ 3 ] + w * ( aT[ 5 ] + w * ( aT[ 7 ] + w * aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = atanhi[ id ] - ( ( x * ( s1 + s2 ) - atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} +//weak_alias (__atanf, atanf) +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +#ifdef __STDC__ +float __copysignf( float x, float y ) +#else +float __copysignf( x, y ) +float x, y; +#endif +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} +//weak_alias (__copysignf, copysignf) +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float __cosf( float x ) +#else +float __cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -__kernel_sinf( y[ 0 ], y[ 1], 1 ); + case 2: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +#ifdef __STDC__ +float __fabsf( float x ) +#else +float __fabsf( x ) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + +/* s_floorf.c -- float version of s_floor.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + floorf(x) + Return x rounded toward -inf to integral value + Method: + Bit twiddling. + Exception: + Inexact flag raised if x not equal to floorf(x). +*/ + + +/* #ifdef __STDC__ */ +/* static const float huge = 1.0e30f; */ +/* #else */ +/* static float huge = 1.0e30f; */ +/* #endif */ + +#ifdef __STDC__ +float __floorf( float x ) +#else +float __floorf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0f ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 >= 0 ) + i0 = 0; + else + if ( ( i0 & 0x7fffffff ) != 0 ) + i0 = 0xbf800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0f ) { /* raise inexact flag */ + if ( i0 < 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} +//weak_alias (__floorf, floorf) +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + + +int +__isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} +/* hidden_def (__isinff) */ +/* weak_alias (__isinff, isinff) */ +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float __scalbnf ( float x, int n ) +#else +float __scalbnf ( x, n ) +float x; +int n; +#endif +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return huge * __copysignf( huge, x ); /* overflow */ + if ( n < -50000 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * twom25; +} +//weak_alias (__scalbnf, scalbnf) + + + +/* e_log10f.c -- float version of e_log10.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ivln10 = 4.3429449201e-01f, /* 0x3ede5bd9 */ +log10_2hi = 3.0102920532e-01f, /* 0x3e9a2080 */ +log10_2lo = 7.9034151668e-07f; /* 0x355427db */ + +#ifdef __STDC__ +float __ieee754_log10f( float x ) +#else +float __ieee754_log10f( x ) +float x; +#endif +{ + float y, z; + int32_t i, k, hx; + + GET_FLOAT_WORD( hx, x ); + + k = 0; + if ( hx < 0x00800000 ) { /* x < 2**-126 */ + if ( ( hx & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( hx < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( hx, x ); + } + if ( hx >= 0x7f800000 ) return x + x; + k += ( hx >> 23 ) - 127; + i = ( ( u_int32_t )k & 0x80000000 ) >> 31; + hx = ( hx & 0x007fffff ) | ( ( 0x7f - i ) << 23 ); + y = ( float )( k + i ); + SET_FLOAT_WORD( x, hx ); + z = y * log10_2lo + ivln10 * __ieee754_logf( x ); + return z + y * log10_2hi; +} + + +/* e_logf.c -- float version of e_log.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ln2_hi = 6.9313812256e-01f, /* 0x3f317180 */ +ln2_lo = 9.0580006145e-06f, /* 0x3717f7d1 */ +Lg1 = 6.6666668653e-01f, /* 3F2AAAAB */ +Lg2 = 4.0000000596e-01f, /* 3ECCCCCD */ +Lg3 = 2.8571429849e-01f, /* 3E924925 */ +Lg4 = 2.2222198546e-01f, /* 3E638E29 */ +Lg5 = 1.8183572590e-01f, /* 3E3A3325 */ +Lg6 = 1.5313838422e-01f, /* 3E1CD04F */ +Lg7 = 1.4798198640e-01f; /* 3E178897 */ + +#ifdef __STDC__ +float __ieee754_logf( float x ) +#else +float __ieee754_logf( x ) +float x; +#endif +{ + float hfsq, f, s, z, R, w, t1, t2, dk; + int32_t k, ix, i, j; + + GET_FLOAT_WORD( ix, x ); + + k = 0; + if ( ix < 0x00800000 ) { /* x < 2**-126 */ + if ( ( ix & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( ix < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( ix, x ); + } + if ( ix >= 0x7f800000 ) return x + x; + k += ( ix >> 23 ) - 127; + ix &= 0x007fffff; + i = ( ix + ( 0x95f64 << 3 ) ) & 0x800000; + SET_FLOAT_WORD( x, ix | ( i ^ 0x3f800000 ) ); /* normalize x or x/2 */ + k += ( i >> 23 ); + f = x - ( float )1.0; + if ( ( 0x007fffff & ( 15 + ix ) ) < 16 ) { /* |f| < 2**-20 */ + if ( f == zero ) { + if ( k == 0 ) return zero; + else { + dk = ( float )k; + return dk * ln2_hi + dk * ln2_lo; + } + } + R = f * f * ( ( float )0.5f - ( float )0.33333333333333333f * f ); + if ( k == 0 ) return f - R; + else { + dk = ( float )k; + return dk * ln2_hi - ( ( R - dk * ln2_lo ) - f ); + } + } + s = f / ( ( float )2.0f + f ); + dk = ( float )k; + z = s * s; + i = ix - ( 0x6147a << 3 ); + w = z * z; + j = ( 0x6b851 << 3 ) - ix; + t1 = w * ( Lg2 + w * ( Lg4 + w * Lg6 ) ); + t2 = z * ( Lg1 + w * ( Lg3 + w * ( Lg5 + w * Lg7 ) ) ); + i |= j; + R = t2 + t1; + if ( i > 0 ) { + hfsq = ( float )0.5f * f * f; + if ( k == 0 ) return f - ( hfsq - s * ( hfsq + R ) ); + else + return dk * ln2_hi - ( ( hfsq - ( s * ( hfsq + R ) + dk * ln2_lo ) ) - f ); + } else { + if ( k == 0 ) return f - s * ( f - R ); + else + return dk * ln2_hi - ( ( s * ( f - R ) - dk * ln2_lo ) - f ); + } +} + + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float __sinf( float x ) +#else +float __sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -__kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + + +/* Single-precision floating point e^x. + Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating + + The GNU C 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. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* How this works: + + The input value, x, is written as + + x = n * ln(2) + t/512 + delta[t] + x; + + where: + - n is an integer, 127 >= n >= -150; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n ( e^(t/512 + delta[t]) + + ( e^(t/512 + delta[t]) + ( p(x + delta[t] + n * ln(2)) - delta ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table. + + The table used is the same one as for the double precision version; + since we have the table, we might as well use it. + + It turns out to be faster to do calculations in double precision than + to perform an 'accurate table method' expf, because of the range reduction + overhead (compare exp2f). +*/ + + +const float __exp_deltatable[ 178 ] = { + 0.000000e+00, 1.436239e-11, -1.851323e-11, 1.250434e-12, + -4.382040e-10, 4.014913e-13, 6.324634e-12, 1.473544e-12, + -4.987366e-11, -1.752952e-12, 6.321584e-13, -3.260980e-12, + 2.777399e-12, -3.787255e-11, -2.182022e-13, -9.047329e-13, + 7.118903e-12, -3.555871e-13, -5.198906e-12, -4.124305e-13, + 1.940741e-12, 2.811727e-13, -2.117377e-13, 2.782236e-14, + 1.074722e-13, -8.844783e-13, -1.240327e-16, 7.052319e-13, + 6.447490e-13, 4.011210e-13, 5.462592e-13, 1.843201e-12, + -2.028864e-12, -2.931258e-13, 8.606021e-12, -5.626610e-13, + 1.295899e-13, -2.330782e-12, -5.478326e-13, 1.845989e-12, + -4.234531e-12, 1.735903e-12, 1.518525e-13, 2.535486e-12, + -4.674620e-13, -1.051410e-12, -1.666138e-12, -9.372511e-13, + 3.200735e-12, 2.292755e-12, 2.525703e-12, 5.823944e-13, + -9.789686e-13, 5.145901e-13, -4.527062e-12, -1.683974e-12, + 9.547877e-12, 2.078277e-13, -2.575768e-12, -1.026653e-12, + 8.179204e-13, 6.063405e-13, 3.908063e-13, -2.855789e-13, + -6.295203e-12, -2.709950e-13, 4.477842e-14, 4.821464e-13, + -5.566389e-13, 1.357999e-12, 7.670314e-13, -9.506315e-12, + -1.738782e-12, -8.637127e-13, -1.933394e-12, -1.267901e-13, + -4.426381e-13, 1.260695e-12, -3.277632e-12, -1.941204e-12, + -4.246588e-12, 2.948061e-12, -2.192153e-13, 1.066989e-12, + 3.009034e-13, 9.622095e-13, 2.332691e-13, -2.541789e-12, + -8.988149e-13, -1.005515e-12, 1.152009e-12, 2.547998e-12, + -8.128411e-12, -5.987095e-12, -1.230903e-12, 1.251520e-12, + -1.144099e-12, -1.419784e-14, 6.041652e-13, -2.428500e-13, + -6.869299e-12, 2.192179e-13, 3.987357e-13, -1.482881e-12, + 3.078380e-13, 5.226606e-12, -3.655583e-13, -7.399489e-13, + -2.937312e-13, 8.345330e-13, 8.291675e-13, 6.803750e-13, + -3.151692e-12, 1.975098e-12, -1.964634e-09, 1.060808e-12, + 5.123574e-12, 5.405112e-13, 4.460744e-12, 2.254359e-12, + 1.053220e-12, 4.224363e-12, 5.146482e-13, -5.005111e-14, + 6.731776e-12, -4.826085e-12, 1.779185e-12, 5.392274e-12, + 4.069803e-12, 5.218838e-13, -4.566578e-12, 9.349049e-13, + -2.780717e-12, 1.589945e-12, 1.805627e-12, -8.564009e-13, + -9.103265e-13, 1.747946e-12, 7.582737e-13, 1.880665e-12, + -1.509317e-12, -8.732831e-12, -1.582241e-14, -2.613867e-12, + 5.035911e-13, -2.209310e-12, -4.646361e-13, 1.926250e-12, + 1.114618e-12, 2.434626e-12, -8.526912e-13, -1.499753e-12, + -1.008729e-12, -2.222098e-12, 6.956137e-13, 2.119407e-13, + 1.250643e-12, -6.520809e-12, 2.357324e-13, -1.302915e-11, + -2.031004e-12, -7.972772e-13, 1.424409e-12, 4.138852e-12, + -1.058267e-12, -2.656184e-12, 5.452444e-13, 1.108587e-12, + 1.134814e-11, -9.126315e-12, 2.758479e-12, -1.439219e-12, + 3.073733e-12, 2.169448e-12, 3.600419e-15, -2.955518e-13, + -1.982464e-12, 2.164243e-12 +}; + +const double __exp_atable[ 355 ] /* __attribute__((mode(DF))) */ = { + 0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */ + 0.709106182438804188967, /* 0x0.b587fb96f75097ffb */ + 0.710492508843861281234, /* 0x0.b5e2d649899167ffd */ + 0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */ + 0.713273297897442870573, /* 0x0.b699142f945f87ffc */ + 0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */ + 0.716064970655995725059, /* 0x0.b75008aec758f8004 */ + 0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */ + 0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */ + 0.720272979947266023271, /* 0x0.b863cf5d10e380003 */ + 0.721681137825144314297, /* 0x0.b8c01855195c37ffb */ + 0.723092048691992950199, /* 0x0.b91c8f7d213740004 */ + 0.724505717938892290800, /* 0x0.b97934ec5002d0007 */ + 0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */ + 0.727341353138962865022, /* 0x0.ba330afcc29e98003 */ + 0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */ + 0.730188086709957051568, /* 0x0.baed9b40591ba0000 */ + 0.731615628948127705309, /* 0x0.bb4b296f931e30002 */ + 0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */ + 0.734479091556371366251, /* 0x0.bc06d25dd49568001 */ + 0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */ + 0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */ + 0.738795312814142124419, /* 0x0.bd21b08af98e78005 */ + 0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */ + 0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */ + 0.743136898669507939299, /* 0x0.be3e38443c84e0007 */ + 0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */ + 0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */ + 0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */ + 0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */ + 0.750429646104262104698, /* 0x0.c01c2843f776fffff */ + 0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */ + 0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */ + 0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */ + 0.756315338768691947122, /* 0x0.c19de1cd798578006 */ + 0.757793960659406629066, /* 0x0.c1fec8f623723fffd */ + 0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */ + 0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */ + 0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */ + 0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */ + 0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */ + 0.766726596071518051729, /* 0x0.c44831b719bf18002 */ + 0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */ + 0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */ + 0.771232322196981678892, /* 0x0.c56f7b41744490001 */ + 0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */ + 0.774250840160724651565, /* 0x0.c6354d95640dd0007 */ + 0.775764526565368872643, /* 0x0.c6988106fec447fff */ + 0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */ + 0.778800783068235302750, /* 0x0.c75f7cf560942fffc */ + 0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */ + 0.781848923151573727006, /* 0x0.c8274043594cb0002 */ + 0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */ + 0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */ + 0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */ + 0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */ + 0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */ + 0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */ + 0.792611669712891875319, /* 0x0.cae8992fd84667ffd */ + 0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */ + 0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */ + 0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */ + 0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */ + 0.800389937624300440456, /* 0x0.cce65ade24d360006 */ + 0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */ + 0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */ + 0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */ + 0.806667472122675088819, /* 0x0.ce81c26b838db8000 */ + 0.808244534127439906441, /* 0x0.cee91d213f8428002 */ + 0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */ + 0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */ + 0.812994243520784198882, /* 0x0.d0206407c20e20005 */ + 0.814583674571603966162, /* 0x0.d0888e4223facfff9 */ + 0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */ + 0.817771864936188586101, /* 0x0.d1597f377d6768002 */ + 0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */ + 0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */ + 0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */ + 0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */ + 0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */ + 0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */ + 0.829029118181348834154, /* 0x0.d43b40960546d8001 */ + 0.830649897953322891022, /* 0x0.d4a578c222a058000 */ + 0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */ + 0.833900969738858188772, /* 0x0.d57a88b1218e90002 */ + 0.835531274148056613016, /* 0x0.d5e560a94048f8006 */ + 0.837164765846411529371, /* 0x0.d6506e1aac8078003 */ + 0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */ + 0.840441336100884561780, /* 0x0.d72729d4c28518004 */ + 0.842084427144139224814, /* 0x0.d792d8530e12b0001 */ + 0.843730730487052604790, /* 0x0.d7febcb61273e7fff */ + 0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */ + 0.847032999194574087728, /* 0x0.d8d727962c69d7fff */ + 0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */ + 0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */ + 0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */ + 0.853676361342631029337, /* 0x0.da8a88b555baa0006 */ + 0.855345327311054837175, /* 0x0.daf7e94f965f98004 */ + 0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */ + 0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */ + 0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */ + 0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */ + 0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */ + 0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */ + 0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */ + 0.868815056264353846599, /* 0x0.de6aa9dced8448001 */ + 0.870513618890481399881, /* 0x0.ded9fb03db7320006 */ + 0.872215502247877139094, /* 0x0.df4983e1380657ff8 */ + 0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */ + 0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */ + 0.877341141814212965880, /* 0x0.e0996dd786fff0007 */ + 0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */ + 0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */ + 0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */ + 0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */ + 0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */ + 0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */ + 0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */ + 0.891157254447957902797, /* 0x0.e422e1bf727718006 */ + 0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */ + 0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */ + 0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */ + 0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */ + 0.899902594367530173098, /* 0x0.e660043464e378005 */ + 0.901661934163603406867, /* 0x0.e6d3510747e150006 */ + 0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */ + 0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */ + 0.906960617885092856864, /* 0x0.e82e92309390b0007 */ + 0.908733756358986566306, /* 0x0.e8a2c6845544afffa */ + 0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */ + 0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */ + 0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */ + 0.915861043547953501680, /* 0x0.ea75de8db8094fffe */ + 0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */ + 0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */ + 0.921243169397334638073, /* 0x0.ebd697a43995b0007 */ + 0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */ + 0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */ + 0.926656923710931002014, /* 0x0.ed39635df34e70006 */ + 0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */ + 0.930283756368834757725, /* 0x0.ee2713859aab57ffa */ + 0.932102492359406786818, /* 0x0.ee9e44d9342870004 */ + 0.933924784042873379360, /* 0x0.ef15b1d4635438005 */ + 0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */ + 0.937580062297704630580, /* 0x0.f0053f38f345cffff */ + 0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */ + 0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */ + 0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */ + 0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */ + 0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */ + 0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */ + 0.950486566729423554277, /* 0x0.f353166f63e3dffff */ + 0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */ + 0.954206665969085765512, /* 0x0.f446e357f66120000 */ + 0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */ + 0.957941325265908139014, /* 0x0.f53ba48781046fffb */ + 0.959814132734539637840, /* 0x0.f5b66106555d07ffa */ + 0.961690601603558903308, /* 0x0.f6315af2c2027fffc */ + 0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */ + 0.965454552202857141381, /* 0x0.f728078f7c5008002 */ + 0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */ + 0.969233234469444204768, /* 0x0.f81fab543e1897ffb */ + 0.971128118008140250896, /* 0x0.f89bda33122c78007 */ + 0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */ + 0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */ + 0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */ + 0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */ + 0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */ + 0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */ + 0.984496437054508843888, /* 0x0.fc07f5602d79afffc */ + 0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */ + 0.988349647107594098099, /* 0x0.fd047b83571b1fffa */ + 0.990281903873210800357, /* 0x0.fd831d66f4c018002 */ + 0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */ + 0.994157757657894713987, /* 0x0.fe811f703491e8006 */ + 0.996101369488558541238, /* 0x0.ff007fd5744490005 */ + 0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */ + 1.000000000000000000000, /* 0x1.00000000000000000 */ + 1.001955033605393285965, /* 0x1.0080200565d29ffff */ + 1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */ + 1.005876574715736104818, /* 0x1.01812090377240007 */ + 1.007843096764807100351, /* 0x1.020201541aad7fff6 */ + 1.009813464316352327214, /* 0x1.0283229c4c9820007 */ + 1.011787683565730677817, /* 0x1.030484836910a000e */ + 1.013765762469146736174, /* 0x1.0386272b9c077fffe */ + 1.015747708536026694351, /* 0x1.04080ab526304fff0 */ + 1.017733529475172815584, /* 0x1.048a2f412375ffff0 */ + 1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */ + 1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */ + 1.023714316605201180057, /* 0x1.06122436442e2000e */ + 1.025715712440059545995, /* 0x1.06954e0fec63afff2 */ + 1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */ + 1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */ + 1.031743407506447551857, /* 0x1.082056011a9230009 */ + 1.033760500517691527387, /* 0x1.08a487359ebd50002 */ + 1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */ + 1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */ + 1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */ + 1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */ + 1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */ + 1.045946142174331239262, /* 0x1.0bc3205a042060000 */ + 1.047991002016745332165, /* 0x1.0c4923682a086fffe */ + 1.050039859627715177527, /* 0x1.0ccf698898f3a000d */ + 1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */ + 1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */ + 1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */ + 1.058275424318780855142, /* 0x1.0eeb23619c146fffb */ + 1.060344388322010722446, /* 0x1.0f72bad65714bffff */ + 1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */ + 1.064494458915699715017, /* 0x1.1082b577d0eef0003 */ + 1.066575581342167566880, /* 0x1.110b18e893a90000a */ + 1.068660772440545025953, /* 0x1.1193c09c267610006 */ + 1.070750040138235936705, /* 0x1.121cacb4959befff6 */ + 1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */ + 1.074940837302467588937, /* 0x1.132f529d59552000b */ + 1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */ + 1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */ + 1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */ + 1.083371702785017154417, /* 0x1.1557d910df9c7000e */ + 1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */ + 1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */ + 1.089738217537583819804, /* 0x1.16f9157586772ffff */ + 1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */ + 1.094003332327482702577, /* 0x1.18109a360fc23fff2 */ + 1.096142145591650907149, /* 0x1.189cc58b155a70008 */ + 1.098285140311341168136, /* 0x1.1929370751ea50002 */ + 1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */ + 1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */ + 1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */ + 1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */ + 1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */ + 1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */ + 1.113403872669181282605, /* 0x1.1d0809445a97ffffc */ + 1.115580614653132185460, /* 0x1.1d96b0effc9db000e */ + 1.117761612217810673898, /* 0x1.1e25a001332190000 */ + 1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */ + 1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */ + 1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */ + 1.126528325196519908506, /* 0x1.2064290abc98c0001 */ + 1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */ + 1.130937432396844410880, /* 0x1.21851d95f776dfff0 */ + 1.133148453059692917203, /* 0x1.2216045b6784efffa */ + 1.135363796355857157764, /* 0x1.22a733a6692ae0004 */ + 1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */ + 1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */ + 1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */ + 1.144268564977221958089, /* 0x1.24eec8e06b035000c */ + 1.146505648458203463465, /* 0x1.258164e8cea85fff8 */ + 1.148747105501412235671, /* 0x1.26144a5180d380009 */ + 1.150992944689175123667, /* 0x1.26a7793f5de2efffa */ + 1.153243174560058870217, /* 0x1.273af1d712179000d */ + 1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */ + 1.157756840726344771440, /* 0x1.2862c097a3d29000c */ + 1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */ + 1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */ + 1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */ + 1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */ + 1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */ + 1.171404112007080167155, /* 0x1.2be123cf786790002 */ + 1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */ + 1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */ + 1.178287955789017793514, /* 0x1.2da4478b627040002 */ + 1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */ + 1.182899644456603782686, /* 0x1.2ed282d76421d0004 */ + 1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */ + 1.187529382762033236513, /* 0x1.3001ecf60082ffffa */ + 1.189851042595508889847, /* 0x1.309a13f30f28a0004 */ + 1.192177241354644978669, /* 0x1.31328716a758cfff7 */ + 1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */ + 1.196843291137896336843, /* 0x1.32645269dfd04000a */ + 1.199183159977805113226, /* 0x1.32fdaae604c39000f */ + 1.201527603343041317132, /* 0x1.339750219980dfff3 */ + 1.203876630171082595692, /* 0x1.3431424300e480007 */ + 1.206230249419600664189, /* 0x1.34cb8170b3fee000e */ + 1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */ + 1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */ + 1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */ + 1.215690830512196507537, /* 0x1.373783a718d29000f */ + 1.218067546930756250870, /* 0x1.37d3465662f480007 */ + 1.220448909901335365929, /* 0x1.386f56fa770fe0008 */ + 1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */ + 1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */ + 1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */ + 1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */ + 1.232425741726685064472, /* 0x1.3b8040df76f39fffa */ + 1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */ + 1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */ + 1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */ + 1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */ + 1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */ + 1.246953186383919165383, /* 0x1.3f3852f32973efff0 */ + 1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */ + 1.251833623164381181797, /* 0x1.40782b17863250005 */ + 1.254280999953110153911, /* 0x1.41188f42caf400000 */ + 1.256733161434815393410, /* 0x1.41b943b42945bfffd */ + 1.259190116985283935980, /* 0x1.425a4893e5f10000a */ + 1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */ + 1.264118447754797758244, /* 0x1.439d443f608c4fff9 */ + 1.266589841787181258708, /* 0x1.443f3b5bebf850008 */ + 1.269066067469190262045, /* 0x1.44e183883e561fff7 */ + 1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */ + 1.274033051628237434048, /* 0x1.462707b2c43020009 */ + 1.276523829025464573684, /* 0x1.46ca44023aa410007 */ + 1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */ + 1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */ + 1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */ + 1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */ + 1.289050950070396384145, /* 0x1.49ff3e396e19d000b */ + 1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */ + 1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */ + 1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */ + 1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */ + 1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */ + 1.304245874766450485904, /* 0x1.4de30ec21097d0003 */ + 1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */ + 1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */ + 1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */ + 1.314475201942565174546, /* 0x1.50817263bf0e5fffb */ + 1.317045045107389400535, /* 0x1.5129dd3418575000e */ + 1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */ + 1.322199813675649204855, /* 0x1.527bafde83a310009 */ + 1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */ + 1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */ + 1.329969819671041886272, /* 0x1.5478e6f02775e0001 */ + 1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */ + 1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */ + 1.337785486688218616860, /* 0x1.56791c1263abefff7 */ + 1.340400902247843806217, /* 0x1.57248376aef21fffa */ + 1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */ + 1.345647083048053138662, /* 0x1.587c53c5a630f0002 */ + 1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */ + 1.350913796821875845231, /* 0x1.59d57c9110ad60006 */ + 1.353554878672557082439, /* 0x1.5a8292913d68cfffc */ + 1.356201123929036356254, /* 0x1.5b2fff3212db00007 */ + 1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */ + 1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */ + 1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */ + 1.366837941171020309735, /* 0x1.5de9176042f1effff */ + 1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */ + 1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */ + 1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */ + 1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */ + 1.380251356531521533853, /* 0x1.6158272490016000c */ + 1.382949794301995272203, /* 0x1.6208ff6a8978a000f */ + 1.385653507605306700170, /* 0x1.62ba3032c0a280004 */ + 1.388362506772382154503, /* 0x1.636bb9a994784000f */ + 1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */ + 1.393796403973427855412, /* 0x1.64cfd7545928b0002 */ + 1.396521322756352656542, /* 0x1.65826be167badfff8 */ + 1.399251568859207761660, /* 0x1.663559cf20826000c */ + 1.401987152677323100733, /* 0x1.66e8a14a29486fffc */ + 1.404728084651919228815, /* 0x1.679c427f5a4b6000b */ + 1.407474375243217723560, /* 0x1.68503d9ba0add000f */ + 1.410226034922914983815, /* 0x1.690492cbf6303fff9 */ + 1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */ +}; + +const volatile float TWOM100 = 7.88860905e-31; +const volatile float TWO127 = 1.7014118346e+38; + + +unsigned long _randseed = 1; + +void srandom( unsigned long seed ) +{ + _randseed = seed; +} + +unsigned long random( void ) +{ + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = _randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if ( t <= 0 ) + t += 0x7fffffff; + _randseed = t; + return ( t ); +} + + +/* s_ceilf.c -- float version of s_ceil.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_ceilf.c,v 1.4 1995/05/10 20:46:55 jtc Exp $"; +#endif + +#ifdef __STDC__ +float __ceilf( float x ) +#else +float __ceilf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0 ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 < 0 ) + i0 = 0x80000000; + else + if ( i0 != 0 ) + i0 = 0x3f800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0 ) { /* raise inexact flag */ + if ( i0 > 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread2/math_private.h b/targets/wasm-tacle/parallel/rosace/thread2/math_private.h new file mode 100644 index 0000000..47f9137 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = ( d ); \ + ( i ) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD( d, i ) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = ( i ); \ + ( d ) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/parallel/rosace/thread2/multirate_precedence.h b/targets/wasm-tacle/parallel/rosace/thread2/multirate_precedence.h new file mode 100644 index 0000000..f1e7071 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/multirate_precedence.h @@ -0,0 +1,65 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: multirate_precedence.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: multirate_precedence.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _multirate_precedence_H +#define _multirate_precedence_H +#include +// Description of a precedence between two tasks of different rates + +struct job_prec { + int src_job; + int dst_job; +}; + +struct multirate_precedence { + char *src_name; + char *dst_name; + int prec_pref_size; + int prec_pat_size; + struct job_prec *prec_pref; + struct job_prec *prec_pat; +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/nonencoded_task_params.h b/targets/wasm-tacle/parallel/rosace/thread2/nonencoded_task_params.h new file mode 100644 index 0000000..fa67d94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/nonencoded_task_params.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: nonencoded_task_params.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: nonencoded_task_params.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _nonencoded_task_params_H +#define _nonencoded_task_params_H +#define NULL ((void*)0) +// Description of a real time task, without precedence encoding. + +struct nonencoded_task_params { + char *ne_t_name; + int ne_t_period; + int ne_t_initial_release; + int ne_t_wcet; + int ne_t_deadline; + int ( *ne_t_body )( void * ); // This is the code to execute at each + // instance of the task. +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread2/ros_th2.c b/targets/wasm-tacle/parallel/rosace/thread2/ros_th2.c new file mode 100644 index 0000000..56e935e --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread2/ros_th2.c @@ -0,0 +1,155 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: ros_th2 + + Author: Dustin Green and others + + Function: executes the second thread of original threads.c + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/c_posix_implementation/ + + Original name: threads, rosace + + Changes: union of rosace.c and threads.c + + License: see above + +*/ + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" +#include "common.h" + + +// Return variable +int ros_th2_check; + + +/* + Forward declaration of functions +*/ + +void* ros_th2_thread2( void* arg ); +int ros_th2_run_rosace( uint64_t nbstep ); +int main( void ); +void ros_th2_init( void ); +void ros_th2_main( void ); +int ros_th2_return( void ); + + +/* + Initialization function +*/ + +void ros_th2_init( void ) +{ + ros_th2_check = -1; + rosace_init(); +} + + +/* + Return function +*/ + +int ros_th2_return( void ) +{ + return ros_th2_check; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) ros_th2_main( void ) +{ + uint64_t tsimu = 300*200; + ros_th2_check = ros_th2_run_rosace( tsimu ); +} + + +int ros_th2_run_rosace( uint64_t nbstep ){ + max_step_simu = nbstep; + // Set first command + ROSACE_update_altitude_command( 11000.0 ); + + // Exit + ros_th2_thread2( NULL ); + return 0; +} + + + +void* ros_th2_thread2( void* arg ) { + uint64_t mystep_simu = step_simu; + + _Pragma( "loopbound min 60000 max 60000" ) + while( mystep_simu 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 33 Hz */ + +REAL_TYPE +altitude_hold_33( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 33.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 25 Hz */ + +REAL_TYPE +altitude_hold_25( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 25.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 10 Hz */ + +REAL_TYPE +altitude_hold_10( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 10.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Va Speed controller 50 Hz */ +REAL_TYPE +Va_control_50( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 33 Hz */ +REAL_TYPE +Va_control_33( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + +// Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; +// State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 25 Hz */ +REAL_TYPE +Va_control_25( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 10 Hz */ +REAL_TYPE +Va_control_10( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Vz Speed controller 50 Hz */ +REAL_TYPE +Vz_control_50( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 33 Hz */ +REAL_TYPE +Vz_control_33( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 25 Hz */ +REAL_TYPE +Vz_control_25( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 10 Hz */ +REAL_TYPE +Vz_control_10( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Engine */ +REAL_TYPE +engine( REAL_TYPE delta_th_c ) +{ + + static REAL_TYPE y = delta_th_eq; + static REAL_TYPE x1 = delta_th_eq; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE tau = 0.75; + + // Output + y = 26350.0 * x1; + // State Equation + x1_dot = -tau * x1 + tau * delta_th_c; + // Update State + x1 += dt_dx * x1_dot; + + return y; +} + + +/* Elevator */ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ) +{ + + static REAL_TYPE y = delta_e_eq; + static REAL_TYPE x1 = delta_e_eq; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE x2_dot = 0.0; + static REAL_TYPE omega = 25.0; + static REAL_TYPE xi = 0.85; + + // Output + y = x1; + // State Equation + x1_dot = x2; + x2_dot = -omega * omega * x1 - 2.0 * xi * omega * x2 + + omega * omega * delta_e_c; + // Update State + x1 += dt_de * x1_dot; + x2 += dt_de * x2_dot; + + return y; +} + + +/* Flight dynamics */ +void aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ) +{ + + static int debut = 1; + + static REAL_TYPE u = 0.0; + static REAL_TYPE w = 0.0; + static REAL_TYPE q = 0.0; + static REAL_TYPE theta = 0.0; + static REAL_TYPE h = 0.0; + static REAL_TYPE u_dot = 0.0; + static REAL_TYPE w_dot = 0.0; + static REAL_TYPE q_dot = 0.0; + static REAL_TYPE theta_dot = 0.0; + static REAL_TYPE h_dot = 0.0; + + static REAL_TYPE CD = 0.0; + static REAL_TYPE CL = 0.0; + static REAL_TYPE Cm = 0.0; + + static REAL_TYPE Xa = 0.0; + static REAL_TYPE Za = 0.0; + static REAL_TYPE Ma = 0.0; + + static REAL_TYPE alpha = 0.0; + static REAL_TYPE qbar = 0.0; + static REAL_TYPE V = 0.0; + static REAL_TYPE rho = 0.0; + + if ( debut ) { + debut = 0; + u = Va_eq * MATH_COS( theta_eq ); + w = Va_eq * MATH_SIN( theta_eq ); + q = 0.0; + theta = theta_eq; + h = h_eq; + } + + rho = rho0 * pow( 1.0 + T0_h / T0_0 * h, - g0 / ( Rs * T0_h ) - 1.0 ); + alpha = atan( w / u ); + V = sqrt( u * u + w * w ); + qbar = 0.5 * rho * V * V; + CL = CL_deltae * delta_e + CL_alpha * ( alpha - alpha_0 ); + CD = CD_0 + CD_deltae * delta_e + + CD_alpha * ( alpha - alpha_0 ) * ( alpha - alpha_0 ); + Cm = Cm_0 + Cm_deltae * delta_e + + Cm_alpha * alpha + 0.5 * Cm_q * q * cbar / V; + Xa = - qbar * S * ( CD * MATH_COS( alpha ) - CL * MATH_SIN( alpha ) ); + Za = - qbar * S * ( CD * MATH_SIN( alpha ) + CL * MATH_COS( alpha ) ); + Ma = qbar * cbar * S * Cm; + + // Output + outputs -> Va = V; + outputs -> Vz = w * MATH_COS( theta ) - u * MATH_SIN( theta ); + outputs -> q = q; + outputs -> az = g0 * MATH_COS( theta ) + Za / masse; + outputs -> h = h; + // State Equation + u_dot = - g0 * sin ( theta ) - q * w + ( Xa + T ) / masse; + w_dot = g0 * MATH_COS ( theta ) + q * u + Za / masse; + q_dot = Ma / I_y; + theta_dot = q; + h_dot = u * MATH_SIN( theta ) - w * MATH_COS( theta ); + // Update State + u += dt * u_dot; + w += dt * w_dot; + q += dt * q_dot; + theta += dt * theta_dot; + h += dt * h_dot; + + + static REAL_TYPE Time = 0.0; + + + // instant++; + Time = Time + dt; +} + + +/* + The commanded altitude +*/ +REAL_TYPE input_h_c( void ) +{ + return h_c; +} + + +/* + The commanded airspeed +*/ +REAL_TYPE input_Va_c( void ) +{ + return Va_c; +} + + +void output_delta_th_c( REAL_TYPE delta_th_c ) +{ + +} + + +void output_delta_e_c( REAL_TYPE delta_e_c ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread3/assemblage_includes.h b/targets/wasm-tacle/parallel/rosace/thread3/assemblage_includes.h new file mode 100644 index 0000000..747c4b1 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/assemblage_includes.h @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef ASSEMBLAGE_INCLUDES_H +#define ASSEMBLAGE_INCLUDES_H +#include "types.h" +#include "io.h" + + +/* *************************************************************************** + Shared constants + * ************************************************************************* */ +#define delta_th_eq (1.5868660794926) +#define delta_e_eq (0.012009615652468) +extern const REAL_TYPE h_eq; +extern const REAL_TYPE Va_eq; +#ifndef NBMAX_SAMPLE +#define NBMAX_SAMPLE (6000000/4) +#endif +extern REAL_TYPE sample[ SPL_SIZE ][ NBMAX_SAMPLE ]; + +void print_inmemory_sample( void ); + +/* *************************************************************************** + The prelude imported node prototypes + * ************************************************************************* */ +/** + Va filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Va, airspeed (m/s) + @return Va_f, filtered airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_50( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_33( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_25( REAL_TYPE Va ); + +/** + Vz filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Vz, vertical speed (m/s) + @return Vz_f, filtered vertical airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_50 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_33 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_25 ( REAL_TYPE Vz ); + +/** + q filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] q, pitch rate (rad/s) + @return q_f, filtered pitch rate (rad/s) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +q_filter_100( REAL_TYPE q ); + +REAL_TYPE +q_filter_50 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_33 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_25 ( REAL_TYPE q ); + +/** + az filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] az, normal acceleration (m/s^2) + @return az_f, filtered normal acceleration (m/s^2) + 2nd order Butterworth filter with fc = 10.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +az_filter_100( REAL_TYPE az ); + +REAL_TYPE +az_filter_50 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_33 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_25 ( REAL_TYPE az ); + +/** + h filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] h, altitude (m) + @return h_f, filtered altitude (m) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ); + +REAL_TYPE +h_filter_50 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_33 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_25 ( REAL_TYPE h ); + +/** + Altitude hold controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] h_f, filtered altitude (m) + @param[in] h_c, commanded altitude (m) + @return Vz_c, commanded vertical speed (m/s) + Generates the vertical speed command Vz_c to track altitude change h_c +*/ +REAL_TYPE +altitude_hold_50 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_33 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_25 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_10 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +/** + Vz Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] Vz_c, commanded vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @param[in] az_f, filtered normal acceleration (m/s^2) + @return delta_e_c, commanded elevator deflection (rad) + Generates the elevator deflection command to track vertical speed command Vz_c +*/ +REAL_TYPE +Vz_control_50 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_33 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_25 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_10 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +/** + Va Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Va_f, filtered airspeed (m/s) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @return delta_th_c, commanded throttle (-) + Generates the throttle command to track airspeed change Va_c +*/ +REAL_TYPE +Va_control_50 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_33 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_25 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_10 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +/** + Engine (200 Hz --> 5ms period) + @param[in] delta_th_c, commanded throttle (-) + @return T, Thrust (N) + 1st order system with time constant 0.5 s + ODE Solver: Euler method with fixed-step = 0.005 (200 Hz) +*/ +REAL_TYPE +engine( REAL_TYPE delta_th_c ); + +/** + Elevator (200 Hz --> 5ms period) + @param[in] delta_e_c, commanded elevator deflection (rad) + @return delta_e, elevator deflection (rad) + 2nd order system (natural frequency omega = 25.0 rad/s and damping xi = 0.85) + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ); + +/** + Flight dynamics (200 Hz --> 5ms period) + @param[in] i, the simulation step + @param[in] delta_e, elevator deflection (rad) + @param[in] T, Thrust (N) + @param[out] outputs, the outputs Va, Vz, q, az, h + Aircraft flight dynamics + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +void +aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ); + +/* *************************************************************************** + The prelude sensor node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +REAL_TYPE +input_h_c( void ); + +REAL_TYPE +input_Va_c( void ); + + +/* *************************************************************************** + The prelude actuator node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_th_c( REAL_TYPE delta_th_c ); + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_e_c( REAL_TYPE delta_e_c ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread3/com_patterns.h b/targets/wasm-tacle/parallel/rosace/thread3/com_patterns.h new file mode 100644 index 0000000..8b98cd7 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/com_patterns.h @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: com_patterns.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: com_patterns.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef com_patterns_H_ +#define com_patterns_H_ +// Description of communication protocols using ultimately periodic +// words: prefix.(periodic pattern). Each communication uses a circular +// buffer shared between the writer and the reader. + +// The task instance i writes to the communication buffer iff proto[n] +// is true (modulo the size of the periodic word). After each write, the +// index where the writer writes is incremented. +struct write_proto_t { + int *write_pref; + int wpref_size; + int *write_pat; + int wpat_size; +}; + +// The task instance n must increment the index at which the task reads +// in the communication buffer iff proto[n] is true (modulo the size of the +// periodic word). +struct read_proto_t { + int *change_pref; + int rpref_size; + int *change_pat; + int rpat_size; +}; + +/** + Returns 1 if instance n must write in the com buffer. +*/ +static inline int must_write( struct write_proto_t wp, int n ) +{ + if ( n < wp.wpref_size ) + return wp.write_pref[ n ]; + else + return wp.write_pat[ ( n - wp.wpref_size ) % wp.wpat_size ]; +} + + +/** + Returns 1 if instance n must change the cell from which it reads. +*/ +static inline int must_change( struct read_proto_t rp, int n ) +{ + if ( n < rp.rpref_size ) + return rp.change_pref[ n ]; + else + return rp.change_pat[ ( n - rp.rpref_size ) % rp.rpat_size ]; +} + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread3/common.c b/targets/wasm-tacle/parallel/rosace/thread3/common.c new file mode 100644 index 0000000..d52da59 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/common.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.c + + Author: Dustin Green + + Function: Common used functions from original threads.c + + Source: + + Original name: + + Changes: No major changes of functions from original threads.c + + License: See the terms above. + +*/ + +#include "common.h" +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +void rosace_init( void ) +{ + + // Initial values + outs.sig_outputs.Va = 0; + outs.sig_outputs.Vz = 0; + outs.sig_outputs.q = 0; + outs.sig_outputs.az = 0; + outs.sig_outputs.h = 0; + outs.t_simu = 0; + step_simu = 0; + + // Get the task set (required for CALL() macro) + int tmp; + get_task_set( &tmp, &tasks ); +} + + +void copy_output_vars( output_t *v, uint64_t step ) +{ + v->sig_outputs.Va = aircraft_dynamics495_Va_Va_filter_100449_Va[ step % 2 ]; + v->sig_outputs.Vz = aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ step % 2 ]; + v->sig_outputs.q = aircraft_dynamics495_q_q_filter_100455_q[ step % 2 ]; + v->sig_outputs.az = aircraft_dynamics495_az_az_filter_100458_az[ step % 2 ]; + v->sig_outputs.h = aircraft_dynamics495_h_h_filter_100446_h[ step % 2 ]; + v->sig_delta_th_c = Va_control_50474_delta_th_c_delta_th_c; + v->sig_delta_e_c = Vz_control_50483_delta_e_c_delta_e_c; +} + diff --git a/targets/wasm-tacle/parallel/rosace/thread3/common.h b/targets/wasm-tacle/parallel/rosace/thread3/common.h new file mode 100644 index 0000000..315ab80 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/common.h @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.h + + Author: Dustin Green + + Function: Common used functions and variables from original threads.c + + Source: + + Original name: + + Changes: No major functional changes + + License: See the terms above. + +*/ + +#ifndef COMMON_H +#define COMMON_H + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +// I/O +output_t outs; +uint64_t step_simu; +uint64_t max_step_simu; + + +// Output variables +extern double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +extern double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +extern double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +extern double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +extern double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +extern double Va_control_50474_delta_th_c_delta_th_c; +extern double Vz_control_50483_delta_e_c_delta_e_c; + + +// Task set +struct nonencoded_task_params *tasks; + + +// Common functions +void rosace_init( void ); +void copy_output_vars( output_t *v, uint64_t step ); + + +// This should be set to 1 to run in "real-time" in the sense +// that the simulation time is close to the real world time +#define RUN_WITH_REAL_TIME 0 + +#define CALL( val ) tasks[ (val) ].ne_t_body( NULL ) + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread3/io.c b/targets/wasm-tacle/parallel/rosace/thread3/io.c new file mode 100644 index 0000000..ad775fb --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/io.c @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.c + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.c + + Changes: delete the code within ROSACE_write_outputs because + stdio.h is not available + + License: See the terms above. + +*/ + +#include "types.h" +#include "io.h" + +#define FMTREAL "%5.15f" +#define BASE_FREQUENCY 200.0 + +extern REAL_TYPE h_c; + +void ROSACE_update_altitude_command( REAL_TYPE h_cons ) +{ + h_c = h_cons; +} + +void ROSACE_write_outputs( output_t *v ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread3/io.h b/targets/wasm-tacle/parallel/rosace/thread3/io.h new file mode 100644 index 0000000..be20e10 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/io.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.h + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_IO_H +#define __DEF_ROSACE_IO_H + +#include "types.h" + +typedef struct { + struct aircraft_dynamics_outs_t sig_outputs; + uint64_t t_simu; + REAL_TYPE sig_delta_th_c; + REAL_TYPE sig_delta_e_c; +} output_t; + +void ROSACE_write_outputs( output_t *v ); +void ROSACE_update_altitude_command( REAL_TYPE h_cons ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread3/math_all.c b/targets/wasm-tacle/parallel/rosace/thread3/math_all.c new file mode 100644 index 0000000..3400e74 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/math_all.c @@ -0,0 +1,2278 @@ + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_all.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_all.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#include "math_private.h" +#include "wcclibm.h" + +// The following defines map the math functions to specialized calls. +// The declarations in math.h are bound to the official interface names. +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +// The list of defined functions with their official interface names +float __atanf( float x ); +float __ceilf( float x ); +float __copysignf( float x, float y ); +float __cosf( float x ); +float __erff( float x ); +float __fabsf( float x ); +float __floorf( float x ); +float __ieee754_acosf( float x ); +float __ieee754_expf( float x ); +float __ieee754_logf( float x ); +float __ieee754_log10f( float x ); +float __ieee754_powf( float x, float y ); +int32_t __ieee754_rem_pio2f( float x, float *y ); +float __ieee754_sqrtf( float x ); +int __isinff( float x ); +float __kernel_cosf( float x, float y ); +float __kernel_sinf( float x, float y, int iy ); +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2 ); +float __sinf( float x ); +float __scalbnf( float x, int n ); + + +// Often used variables/consts +#ifdef __STDC__ +const float +#else +float +#endif +one = 1.0f, +tiny = 1.0e-30f, +half = 5.0000000000e-01f, /* 0x3f000000 */ +huge = 1.0e30f, +two = 2.0f, +two24 = 16777216.0f, /* 0x4b800000 */ +two25 = 3.3554432000e+07f, /* 0x4c000000 */ +two8 = 2.5600000000e+02f, /* 0x43800000 */ +twon8 = 3.9062500000e-03f, /* 0x3b800000 */ +zero = 0.0f; + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00f, /\* 0x3F800000 *\/ */ +pi = 3.1415925026e+00f, /* 0x40490fda */ +pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ +pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ +pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ +pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ +pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ +pS3 = -4.0055535734e-02f, /* 0xbd241146 */ +pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ +pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ +qS1 = -2.4033949375e+00f, /* 0xc019d139 */ +qS2 = 2.0209457874e+00f, /* 0x4001572d */ +qS3 = -6.8828397989e-01f, /* 0xbf303361 */ +qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +#ifdef __STDC__ +float __ieee754_acosf( float x ) +#else +float __ieee754_acosf( x ) +float x; +#endif +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return pi + ( float )2.0f * pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return pio2_hi + pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + return pio2_hi - ( x - ( pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( one + x ) * ( float )0.5f; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + s = __ieee754_sqrtf( z ); + r = p / q; + w = r * s - pio2_lo; + return pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( one - x ) * ( float )0.5f; + s = __ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* static const float huge = 1.0e+30f, tiny = 1.0e-30f; */ + +#ifdef __STDC__ +const float +#else +float +#endif +bp[] = {1.0f, 1.5f,}, + dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* zero = 0.0f, */ + /* one = 1.0f, */ + /* two = 2.0f, */ + /* two24 = 16777216.0f, /\* 0x4b800000 *\/ */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + L1 = 6.0000002384e-01f, /* 0x3f19999a */ + L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + P3 = 6.6137559770e-05f, /* 0x388ab355 */ + P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +float __ieee754_powf( float x, float y ) +#else +float __ieee754_powf( x, y ) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return one; + + /* x==+-1 */ + if ( x == 1.0f ) return one; + if ( x == -1.0f && isinff( y ) ) return one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return __ieee754_sqrtf( x ); + } + + ax = fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? huge * huge : tiny * tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? huge * huge : tiny * tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * ivln2_l - w * ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( L1 + s2 * ( L2 + s2 * ( L3 + s2 * ( L4 + s2 * + ( L5 + s2 * L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l * p_h + p_l * cp + dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - dp_h[ k ] ) - z_h ); + } + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * huge * huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + ovt > z - p_h ) return s * huge * huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * tiny * tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * tiny * tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * lg2_h; + v = ( p_l - ( t - p_h ) ) * lg2 + t * lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( P1 + t * ( P2 + t * ( P3 + t * ( P4 + t * P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - two ) - ( w + z * w ); + z = one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = __scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] + use __kernel_rem_pio2f() +*/ + + +/* + Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi +*/ +#ifdef __STDC__ +const int32_t two_over_pi[] = { +#else +int32_t two_over_pi[] = { +#endif + 0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC, + 0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62, + 0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63, + 0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A, + 0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09, + 0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29, + 0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44, + 0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41, + 0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C, + 0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8, + 0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11, + 0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF, + 0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E, + 0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5, + 0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92, + 0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08, + 0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0, + 0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3, + 0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85, + 0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80, + 0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA, + 0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B, +}; + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int32_t npio2_hw[] = { +#else +int32_t npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t __ieee754_rem_pio2f( float x, float *y ) +#else +int32_t __ieee754_rem_pio2f( x, y ) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + float tx[ 3 ]; + int32_t e0, i, j, nx, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= pio2_2; + y[ 0 ] = z - pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += pio2_2; + y[ 0 ] = z + pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * invpio2 + half ); + fn = ( float )n; + r = t - fn * pio2_1; + w = fn * pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * pio2_2; + r = t - w; + w = fn * pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * pio2_3; + r = t - w; + w = fn * pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + /* set z = scalbn(|x|,ilogb(x)-7) */ + e0 = ( ix >> 23 ) - 134; /* e0 = ilogb(z)-7; */ + SET_FLOAT_WORD( z, ix - ( ( int32_t )( e0 << 23 ) ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < 2; i++ ) { + tx[ i ] = ( float )( ( int32_t )( z ) ); + z = ( z - tx[ i ] ) * two8; + } + tx[ 2 ] = z; + nx = 3; + _Pragma( "loopbound min 0 max 0" ) + while ( tx[ nx - 1 ] == zero ) { + nx--; /* skip zero term */ + } + n = __kernel_rem_pio2f( tx, y, e0, nx, 2, two_over_pi ); + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } + return n; +} +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: e_sqrtf.c,v 1.4 1995/05/10 20:46:19 jtc Exp $"; +#endif + + +/* #ifdef __STDC__ */ +/* static const float one = 1.0f, tiny=1.0e-30f; */ +/* #else */ +/* static float one = 1.0f, tiny=1.0e-30f; */ +/* #endif */ + +#ifdef __STDC__ +float __ieee754_sqrtf( float x ) +#else +float __ieee754_sqrtf( x ) +float x; +#endif +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 0 max 0" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = one - tiny; /* trigger inexact flag */ + if ( z >= one ) { + z = one + tiny; + if ( z > one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +C4 = -2.7557314297e-07f, /* 0xb493f27c */ +C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float __kernel_cosf( float x, float y ) +#else +float __kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return one; /* generate inexact */ + } + z = x * x; + r = z * ( C1 + z * ( C2 + z * ( C3 + z * ( C4 + z * ( C5 + z * C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} +/* k_rem_pio2f.c -- float version of k_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: k_rem_pio2f.c,v 1.4 1995/05/10 20:46:28 jtc Exp $"; +#endif + + +/* In the float version, the input parameter x contains 8 bit + integers, not 24 bit integers. 113 bit precision is not supported. */ + +#ifdef __STDC__ +const int init_jk[] = {4, 7, 9}; /* initial value for jk */ +#else +int init_jk[] = {4, 7, 9}; +#endif + +#ifdef __STDC__ +const float PIo2[] = { +#else +float PIo2[] = { +#endif + 1.5703125000e+00f, /* 0x3fc90000 */ + 4.5776367188e-04f, /* 0x39f00000 */ + 2.5987625122e-05f, /* 0x37da0000 */ + 7.5437128544e-08f, /* 0x33a20000 */ + 6.0026650317e-11f, /* 0x2e840000 */ + 7.3896444519e-13f, /* 0x2b500000 */ + 5.3845816694e-15f, /* 0x27c20000 */ + 5.6378512969e-18f, /* 0x22d00000 */ + 8.3009228831e-20f, /* 0x1fc40000 */ + 3.2756352257e-22f, /* 0x1bc60000 */ + 6.3331015649e-25f, /* 0x17440000 */ +}; + + +#ifdef __STDC__ +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ) +#else +int __kernel_rem_pio2f( x, y, e0, nx, prec, ipio2 ) +float x[], y[]; +int e0, nx, prec; +int32_t ipio2[]; +#endif +{ + int32_t jz, jx, jv, jp, jk, carry, n, iq[ 20 ], i, j, k, m, q0, ih; + float z, fw, f[ 20 ], fq[ 20 ], q[ 20 ]; + + /* initialize jk*/ + jk = init_jk[ prec ]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx - 1; + jv = ( e0 - 3 ) / 8; + if ( jv < 0 ) jv = 0; + q0 = e0 - 8 * ( jv + 1 ); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv - jx; + m = jx + jk; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= m; i++, j++ ) + f[i] = ( j < 0 ) ? zero : ( float ) ipio2[ j ]; + + /* compute q[0],q[1],...q[jk] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= jk; i++ ) { + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[ i ] = fw; + } + + jz = jk; +recompute: + ; + /* distill q[] into iq[] reversingly */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0, j = jz, z = q[ jz ]; j > 0; i++, j-- ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[i] = ( int32_t )( z - two8 * fw ); + z = q[ j - 1 ] + fw; + } + + /* compute n */ + z = __scalbnf( z, q0 ); /* actual value of z */ + z -= ( float )8.0f * __floorf( z * ( float ) + 0.125f ); /* trim off integer >= 8 */ + n = ( int32_t ) z; + z -= ( float )n; + ih = 0; + if ( q0 > 0 ) { /* need iq[jz-1] to determine n */ + i = ( iq[ jz - 1 ] >> ( 8 - q0 ) ); + n += i; + iq[ jz - 1 ] -= i << ( 8 - q0 ); + ih = iq[ jz - 1 ] >> ( 7 - q0 ); + } else + if ( q0 == 0 ) ih = iq[ jz - 1 ] >> 8; + else + if ( z >= ( float )0.5f ) ih = 2; + + if ( ih > 0 ) { /* q > 0.5 */ + n += 1; + carry = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < jz ; i++ ) { /* compute 1-q */ + j = iq[ i ]; + if ( carry == 0 ) { + if ( j != 0 ) { + carry = 1; + iq[ i ] = 0x100 - j; + } + } else iq[ i ] = 0xff - j; + + } + if ( q0 > 0 ) { /* rare case: chance is 1 in 12 */ + switch ( q0 ) { + case 1: + iq[ jz - 1 ] &= 0x7f; + break; + case 2: + iq[ jz - 1 ] &= 0x3f; + break; + } + } + if ( ih == 2 ) { + z = one - z; + if ( carry != 0 ) z -= __scalbnf( one, q0 ); + } + } + + /* check if recomputation is needed */ + if ( z == zero ) { + j = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz - 1; i >= jk; i-- ) + j |= iq[ i ]; + if ( j == 0 ) { /* need recomputation */ + _Pragma( "loopbound min 0 max 0" ) + for ( k = 1; iq[ jk - k ] == 0; k++ ) { + ; /* k = no. of terms needed */ + } + + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz + 1; i <= jz + k; i++ ) { /* add q[jz+1] to q[jz+k] */ + f[ jx + i ] = ( float ) ipio2[ jv + i ]; + _Pragma( "loopbound min 0 max 0" ) + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if ( z == ( float )0.0f ) { + jz -= 1; + q0 -= 8; + _Pragma( "loopbound min 0 max 0" ) + while ( iq[ jz ] == 0 ) { + jz--; + q0 -= 8; + } + } else { /* break z into 8-bit if necessary */ + z = __scalbnf( z, -q0 ); + if ( z >= two8 ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[ jz ] = ( int32_t )( z - two8 * fw ); + jz += 1; + q0 += 8; + iq[ jz ] = ( int32_t ) fw; + } else iq[ jz ] = ( int32_t ) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = __scalbnf( one, q0 ); + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + q[ i ] = fw * ( float )iq[ i ]; + fw *= twon8; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, k = 0; k <= jp && k <= jz - i; k++ ) + fw += PIo2[ k ] * q[ i + k ]; + fq[ jz - i ] = fw; + } + + /* compress fq[] into y[] */ + switch ( prec ) { + case 0: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + break; + case 1: + case 2: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + fw = fq[ 0 ] - fw; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i <= jz; i++ ) + fw += fq[ i ]; + y[ 1 ] = ( ih == 0 ) ? fw : -fw; + break; + case 3:; /* painful */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 0; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 1; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, i = jz; i >= 2; i-- ) + fw += fq[ i ]; + + if ( ih == 0 ) { + y[ 0 ] = fq[ 0 ]; + y[ 1 ] = fq[ 1 ]; + y[ 2 ] = fw; + } else { + y[ 0 ] = -fq[ 0 ]; + y[ 1 ] = -fq[ 1 ]; + y[ 2 ] = -fw; + } + } + return n & 7; +} +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +S2 = 8.3333337680e-03f, /* 0x3c088889 */ +S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float __kernel_sinf( float x, float y, int iy ) +#else +float __kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = S2 + z * ( S3 + z * ( S4 + z * ( S5 + z * S6 ) ) ); + if ( iy == 0 ) return x + v * ( S1 + z * r ); + else return x - ( ( z * ( half * y - v * r ) - y ) - v * S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float atanhi[] = { +#else +float atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float atanlo[] = { +#else +float atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float aT[] = { +#else +float aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float __atanf( float x ) +#else +float __atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return atanhi[ 3 ] + atanlo[ 3 ]; + else return -atanhi[ 3 ] - atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( huge + x > one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - one ) / ( x + one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z * ( aT[ 0 ] + w * ( aT[ 2 ] + w * ( aT[ 4 ] + w * ( aT[ 6 ] + w * + ( aT[ 8 ] + w * aT[ 10 ] ) ) ) ) ); + s2 = w * ( aT[ 1 ] + w * ( aT[ 3 ] + w * ( aT[ 5 ] + w * ( aT[ 7 ] + w * aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = atanhi[ id ] - ( ( x * ( s1 + s2 ) - atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} +//weak_alias (__atanf, atanf) +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +#ifdef __STDC__ +float __copysignf( float x, float y ) +#else +float __copysignf( x, y ) +float x, y; +#endif +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} +//weak_alias (__copysignf, copysignf) +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float __cosf( float x ) +#else +float __cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -__kernel_sinf( y[ 0 ], y[ 1], 1 ); + case 2: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +#ifdef __STDC__ +float __fabsf( float x ) +#else +float __fabsf( x ) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + +/* s_floorf.c -- float version of s_floor.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + floorf(x) + Return x rounded toward -inf to integral value + Method: + Bit twiddling. + Exception: + Inexact flag raised if x not equal to floorf(x). +*/ + + +/* #ifdef __STDC__ */ +/* static const float huge = 1.0e30f; */ +/* #else */ +/* static float huge = 1.0e30f; */ +/* #endif */ + +#ifdef __STDC__ +float __floorf( float x ) +#else +float __floorf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0f ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 >= 0 ) + i0 = 0; + else + if ( ( i0 & 0x7fffffff ) != 0 ) + i0 = 0xbf800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0f ) { /* raise inexact flag */ + if ( i0 < 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} +//weak_alias (__floorf, floorf) +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + + +int +__isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} +/* hidden_def (__isinff) */ +/* weak_alias (__isinff, isinff) */ +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float __scalbnf ( float x, int n ) +#else +float __scalbnf ( x, n ) +float x; +int n; +#endif +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return huge * __copysignf( huge, x ); /* overflow */ + if ( n < -50000 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * twom25; +} +//weak_alias (__scalbnf, scalbnf) + + + +/* e_log10f.c -- float version of e_log10.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ivln10 = 4.3429449201e-01f, /* 0x3ede5bd9 */ +log10_2hi = 3.0102920532e-01f, /* 0x3e9a2080 */ +log10_2lo = 7.9034151668e-07f; /* 0x355427db */ + +#ifdef __STDC__ +float __ieee754_log10f( float x ) +#else +float __ieee754_log10f( x ) +float x; +#endif +{ + float y, z; + int32_t i, k, hx; + + GET_FLOAT_WORD( hx, x ); + + k = 0; + if ( hx < 0x00800000 ) { /* x < 2**-126 */ + if ( ( hx & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( hx < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( hx, x ); + } + if ( hx >= 0x7f800000 ) return x + x; + k += ( hx >> 23 ) - 127; + i = ( ( u_int32_t )k & 0x80000000 ) >> 31; + hx = ( hx & 0x007fffff ) | ( ( 0x7f - i ) << 23 ); + y = ( float )( k + i ); + SET_FLOAT_WORD( x, hx ); + z = y * log10_2lo + ivln10 * __ieee754_logf( x ); + return z + y * log10_2hi; +} + + +/* e_logf.c -- float version of e_log.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ln2_hi = 6.9313812256e-01f, /* 0x3f317180 */ +ln2_lo = 9.0580006145e-06f, /* 0x3717f7d1 */ +Lg1 = 6.6666668653e-01f, /* 3F2AAAAB */ +Lg2 = 4.0000000596e-01f, /* 3ECCCCCD */ +Lg3 = 2.8571429849e-01f, /* 3E924925 */ +Lg4 = 2.2222198546e-01f, /* 3E638E29 */ +Lg5 = 1.8183572590e-01f, /* 3E3A3325 */ +Lg6 = 1.5313838422e-01f, /* 3E1CD04F */ +Lg7 = 1.4798198640e-01f; /* 3E178897 */ + +#ifdef __STDC__ +float __ieee754_logf( float x ) +#else +float __ieee754_logf( x ) +float x; +#endif +{ + float hfsq, f, s, z, R, w, t1, t2, dk; + int32_t k, ix, i, j; + + GET_FLOAT_WORD( ix, x ); + + k = 0; + if ( ix < 0x00800000 ) { /* x < 2**-126 */ + if ( ( ix & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( ix < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( ix, x ); + } + if ( ix >= 0x7f800000 ) return x + x; + k += ( ix >> 23 ) - 127; + ix &= 0x007fffff; + i = ( ix + ( 0x95f64 << 3 ) ) & 0x800000; + SET_FLOAT_WORD( x, ix | ( i ^ 0x3f800000 ) ); /* normalize x or x/2 */ + k += ( i >> 23 ); + f = x - ( float )1.0; + if ( ( 0x007fffff & ( 15 + ix ) ) < 16 ) { /* |f| < 2**-20 */ + if ( f == zero ) { + if ( k == 0 ) return zero; + else { + dk = ( float )k; + return dk * ln2_hi + dk * ln2_lo; + } + } + R = f * f * ( ( float )0.5f - ( float )0.33333333333333333f * f ); + if ( k == 0 ) return f - R; + else { + dk = ( float )k; + return dk * ln2_hi - ( ( R - dk * ln2_lo ) - f ); + } + } + s = f / ( ( float )2.0f + f ); + dk = ( float )k; + z = s * s; + i = ix - ( 0x6147a << 3 ); + w = z * z; + j = ( 0x6b851 << 3 ) - ix; + t1 = w * ( Lg2 + w * ( Lg4 + w * Lg6 ) ); + t2 = z * ( Lg1 + w * ( Lg3 + w * ( Lg5 + w * Lg7 ) ) ); + i |= j; + R = t2 + t1; + if ( i > 0 ) { + hfsq = ( float )0.5f * f * f; + if ( k == 0 ) return f - ( hfsq - s * ( hfsq + R ) ); + else + return dk * ln2_hi - ( ( hfsq - ( s * ( hfsq + R ) + dk * ln2_lo ) ) - f ); + } else { + if ( k == 0 ) return f - s * ( f - R ); + else + return dk * ln2_hi - ( ( s * ( f - R ) - dk * ln2_lo ) - f ); + } +} + + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float __sinf( float x ) +#else +float __sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -__kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + + +/* Single-precision floating point e^x. + Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating + + The GNU C 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. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* How this works: + + The input value, x, is written as + + x = n * ln(2) + t/512 + delta[t] + x; + + where: + - n is an integer, 127 >= n >= -150; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n ( e^(t/512 + delta[t]) + + ( e^(t/512 + delta[t]) + ( p(x + delta[t] + n * ln(2)) - delta ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table. + + The table used is the same one as for the double precision version; + since we have the table, we might as well use it. + + It turns out to be faster to do calculations in double precision than + to perform an 'accurate table method' expf, because of the range reduction + overhead (compare exp2f). +*/ + + +const float __exp_deltatable[ 178 ] = { + 0.000000e+00, 1.436239e-11, -1.851323e-11, 1.250434e-12, + -4.382040e-10, 4.014913e-13, 6.324634e-12, 1.473544e-12, + -4.987366e-11, -1.752952e-12, 6.321584e-13, -3.260980e-12, + 2.777399e-12, -3.787255e-11, -2.182022e-13, -9.047329e-13, + 7.118903e-12, -3.555871e-13, -5.198906e-12, -4.124305e-13, + 1.940741e-12, 2.811727e-13, -2.117377e-13, 2.782236e-14, + 1.074722e-13, -8.844783e-13, -1.240327e-16, 7.052319e-13, + 6.447490e-13, 4.011210e-13, 5.462592e-13, 1.843201e-12, + -2.028864e-12, -2.931258e-13, 8.606021e-12, -5.626610e-13, + 1.295899e-13, -2.330782e-12, -5.478326e-13, 1.845989e-12, + -4.234531e-12, 1.735903e-12, 1.518525e-13, 2.535486e-12, + -4.674620e-13, -1.051410e-12, -1.666138e-12, -9.372511e-13, + 3.200735e-12, 2.292755e-12, 2.525703e-12, 5.823944e-13, + -9.789686e-13, 5.145901e-13, -4.527062e-12, -1.683974e-12, + 9.547877e-12, 2.078277e-13, -2.575768e-12, -1.026653e-12, + 8.179204e-13, 6.063405e-13, 3.908063e-13, -2.855789e-13, + -6.295203e-12, -2.709950e-13, 4.477842e-14, 4.821464e-13, + -5.566389e-13, 1.357999e-12, 7.670314e-13, -9.506315e-12, + -1.738782e-12, -8.637127e-13, -1.933394e-12, -1.267901e-13, + -4.426381e-13, 1.260695e-12, -3.277632e-12, -1.941204e-12, + -4.246588e-12, 2.948061e-12, -2.192153e-13, 1.066989e-12, + 3.009034e-13, 9.622095e-13, 2.332691e-13, -2.541789e-12, + -8.988149e-13, -1.005515e-12, 1.152009e-12, 2.547998e-12, + -8.128411e-12, -5.987095e-12, -1.230903e-12, 1.251520e-12, + -1.144099e-12, -1.419784e-14, 6.041652e-13, -2.428500e-13, + -6.869299e-12, 2.192179e-13, 3.987357e-13, -1.482881e-12, + 3.078380e-13, 5.226606e-12, -3.655583e-13, -7.399489e-13, + -2.937312e-13, 8.345330e-13, 8.291675e-13, 6.803750e-13, + -3.151692e-12, 1.975098e-12, -1.964634e-09, 1.060808e-12, + 5.123574e-12, 5.405112e-13, 4.460744e-12, 2.254359e-12, + 1.053220e-12, 4.224363e-12, 5.146482e-13, -5.005111e-14, + 6.731776e-12, -4.826085e-12, 1.779185e-12, 5.392274e-12, + 4.069803e-12, 5.218838e-13, -4.566578e-12, 9.349049e-13, + -2.780717e-12, 1.589945e-12, 1.805627e-12, -8.564009e-13, + -9.103265e-13, 1.747946e-12, 7.582737e-13, 1.880665e-12, + -1.509317e-12, -8.732831e-12, -1.582241e-14, -2.613867e-12, + 5.035911e-13, -2.209310e-12, -4.646361e-13, 1.926250e-12, + 1.114618e-12, 2.434626e-12, -8.526912e-13, -1.499753e-12, + -1.008729e-12, -2.222098e-12, 6.956137e-13, 2.119407e-13, + 1.250643e-12, -6.520809e-12, 2.357324e-13, -1.302915e-11, + -2.031004e-12, -7.972772e-13, 1.424409e-12, 4.138852e-12, + -1.058267e-12, -2.656184e-12, 5.452444e-13, 1.108587e-12, + 1.134814e-11, -9.126315e-12, 2.758479e-12, -1.439219e-12, + 3.073733e-12, 2.169448e-12, 3.600419e-15, -2.955518e-13, + -1.982464e-12, 2.164243e-12 +}; + +const double __exp_atable[ 355 ] /* __attribute__((mode(DF))) */ = { + 0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */ + 0.709106182438804188967, /* 0x0.b587fb96f75097ffb */ + 0.710492508843861281234, /* 0x0.b5e2d649899167ffd */ + 0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */ + 0.713273297897442870573, /* 0x0.b699142f945f87ffc */ + 0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */ + 0.716064970655995725059, /* 0x0.b75008aec758f8004 */ + 0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */ + 0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */ + 0.720272979947266023271, /* 0x0.b863cf5d10e380003 */ + 0.721681137825144314297, /* 0x0.b8c01855195c37ffb */ + 0.723092048691992950199, /* 0x0.b91c8f7d213740004 */ + 0.724505717938892290800, /* 0x0.b97934ec5002d0007 */ + 0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */ + 0.727341353138962865022, /* 0x0.ba330afcc29e98003 */ + 0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */ + 0.730188086709957051568, /* 0x0.baed9b40591ba0000 */ + 0.731615628948127705309, /* 0x0.bb4b296f931e30002 */ + 0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */ + 0.734479091556371366251, /* 0x0.bc06d25dd49568001 */ + 0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */ + 0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */ + 0.738795312814142124419, /* 0x0.bd21b08af98e78005 */ + 0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */ + 0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */ + 0.743136898669507939299, /* 0x0.be3e38443c84e0007 */ + 0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */ + 0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */ + 0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */ + 0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */ + 0.750429646104262104698, /* 0x0.c01c2843f776fffff */ + 0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */ + 0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */ + 0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */ + 0.756315338768691947122, /* 0x0.c19de1cd798578006 */ + 0.757793960659406629066, /* 0x0.c1fec8f623723fffd */ + 0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */ + 0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */ + 0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */ + 0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */ + 0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */ + 0.766726596071518051729, /* 0x0.c44831b719bf18002 */ + 0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */ + 0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */ + 0.771232322196981678892, /* 0x0.c56f7b41744490001 */ + 0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */ + 0.774250840160724651565, /* 0x0.c6354d95640dd0007 */ + 0.775764526565368872643, /* 0x0.c6988106fec447fff */ + 0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */ + 0.778800783068235302750, /* 0x0.c75f7cf560942fffc */ + 0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */ + 0.781848923151573727006, /* 0x0.c8274043594cb0002 */ + 0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */ + 0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */ + 0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */ + 0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */ + 0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */ + 0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */ + 0.792611669712891875319, /* 0x0.cae8992fd84667ffd */ + 0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */ + 0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */ + 0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */ + 0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */ + 0.800389937624300440456, /* 0x0.cce65ade24d360006 */ + 0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */ + 0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */ + 0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */ + 0.806667472122675088819, /* 0x0.ce81c26b838db8000 */ + 0.808244534127439906441, /* 0x0.cee91d213f8428002 */ + 0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */ + 0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */ + 0.812994243520784198882, /* 0x0.d0206407c20e20005 */ + 0.814583674571603966162, /* 0x0.d0888e4223facfff9 */ + 0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */ + 0.817771864936188586101, /* 0x0.d1597f377d6768002 */ + 0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */ + 0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */ + 0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */ + 0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */ + 0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */ + 0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */ + 0.829029118181348834154, /* 0x0.d43b40960546d8001 */ + 0.830649897953322891022, /* 0x0.d4a578c222a058000 */ + 0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */ + 0.833900969738858188772, /* 0x0.d57a88b1218e90002 */ + 0.835531274148056613016, /* 0x0.d5e560a94048f8006 */ + 0.837164765846411529371, /* 0x0.d6506e1aac8078003 */ + 0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */ + 0.840441336100884561780, /* 0x0.d72729d4c28518004 */ + 0.842084427144139224814, /* 0x0.d792d8530e12b0001 */ + 0.843730730487052604790, /* 0x0.d7febcb61273e7fff */ + 0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */ + 0.847032999194574087728, /* 0x0.d8d727962c69d7fff */ + 0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */ + 0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */ + 0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */ + 0.853676361342631029337, /* 0x0.da8a88b555baa0006 */ + 0.855345327311054837175, /* 0x0.daf7e94f965f98004 */ + 0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */ + 0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */ + 0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */ + 0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */ + 0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */ + 0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */ + 0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */ + 0.868815056264353846599, /* 0x0.de6aa9dced8448001 */ + 0.870513618890481399881, /* 0x0.ded9fb03db7320006 */ + 0.872215502247877139094, /* 0x0.df4983e1380657ff8 */ + 0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */ + 0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */ + 0.877341141814212965880, /* 0x0.e0996dd786fff0007 */ + 0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */ + 0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */ + 0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */ + 0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */ + 0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */ + 0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */ + 0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */ + 0.891157254447957902797, /* 0x0.e422e1bf727718006 */ + 0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */ + 0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */ + 0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */ + 0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */ + 0.899902594367530173098, /* 0x0.e660043464e378005 */ + 0.901661934163603406867, /* 0x0.e6d3510747e150006 */ + 0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */ + 0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */ + 0.906960617885092856864, /* 0x0.e82e92309390b0007 */ + 0.908733756358986566306, /* 0x0.e8a2c6845544afffa */ + 0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */ + 0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */ + 0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */ + 0.915861043547953501680, /* 0x0.ea75de8db8094fffe */ + 0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */ + 0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */ + 0.921243169397334638073, /* 0x0.ebd697a43995b0007 */ + 0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */ + 0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */ + 0.926656923710931002014, /* 0x0.ed39635df34e70006 */ + 0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */ + 0.930283756368834757725, /* 0x0.ee2713859aab57ffa */ + 0.932102492359406786818, /* 0x0.ee9e44d9342870004 */ + 0.933924784042873379360, /* 0x0.ef15b1d4635438005 */ + 0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */ + 0.937580062297704630580, /* 0x0.f0053f38f345cffff */ + 0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */ + 0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */ + 0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */ + 0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */ + 0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */ + 0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */ + 0.950486566729423554277, /* 0x0.f353166f63e3dffff */ + 0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */ + 0.954206665969085765512, /* 0x0.f446e357f66120000 */ + 0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */ + 0.957941325265908139014, /* 0x0.f53ba48781046fffb */ + 0.959814132734539637840, /* 0x0.f5b66106555d07ffa */ + 0.961690601603558903308, /* 0x0.f6315af2c2027fffc */ + 0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */ + 0.965454552202857141381, /* 0x0.f728078f7c5008002 */ + 0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */ + 0.969233234469444204768, /* 0x0.f81fab543e1897ffb */ + 0.971128118008140250896, /* 0x0.f89bda33122c78007 */ + 0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */ + 0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */ + 0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */ + 0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */ + 0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */ + 0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */ + 0.984496437054508843888, /* 0x0.fc07f5602d79afffc */ + 0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */ + 0.988349647107594098099, /* 0x0.fd047b83571b1fffa */ + 0.990281903873210800357, /* 0x0.fd831d66f4c018002 */ + 0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */ + 0.994157757657894713987, /* 0x0.fe811f703491e8006 */ + 0.996101369488558541238, /* 0x0.ff007fd5744490005 */ + 0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */ + 1.000000000000000000000, /* 0x1.00000000000000000 */ + 1.001955033605393285965, /* 0x1.0080200565d29ffff */ + 1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */ + 1.005876574715736104818, /* 0x1.01812090377240007 */ + 1.007843096764807100351, /* 0x1.020201541aad7fff6 */ + 1.009813464316352327214, /* 0x1.0283229c4c9820007 */ + 1.011787683565730677817, /* 0x1.030484836910a000e */ + 1.013765762469146736174, /* 0x1.0386272b9c077fffe */ + 1.015747708536026694351, /* 0x1.04080ab526304fff0 */ + 1.017733529475172815584, /* 0x1.048a2f412375ffff0 */ + 1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */ + 1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */ + 1.023714316605201180057, /* 0x1.06122436442e2000e */ + 1.025715712440059545995, /* 0x1.06954e0fec63afff2 */ + 1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */ + 1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */ + 1.031743407506447551857, /* 0x1.082056011a9230009 */ + 1.033760500517691527387, /* 0x1.08a487359ebd50002 */ + 1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */ + 1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */ + 1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */ + 1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */ + 1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */ + 1.045946142174331239262, /* 0x1.0bc3205a042060000 */ + 1.047991002016745332165, /* 0x1.0c4923682a086fffe */ + 1.050039859627715177527, /* 0x1.0ccf698898f3a000d */ + 1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */ + 1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */ + 1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */ + 1.058275424318780855142, /* 0x1.0eeb23619c146fffb */ + 1.060344388322010722446, /* 0x1.0f72bad65714bffff */ + 1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */ + 1.064494458915699715017, /* 0x1.1082b577d0eef0003 */ + 1.066575581342167566880, /* 0x1.110b18e893a90000a */ + 1.068660772440545025953, /* 0x1.1193c09c267610006 */ + 1.070750040138235936705, /* 0x1.121cacb4959befff6 */ + 1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */ + 1.074940837302467588937, /* 0x1.132f529d59552000b */ + 1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */ + 1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */ + 1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */ + 1.083371702785017154417, /* 0x1.1557d910df9c7000e */ + 1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */ + 1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */ + 1.089738217537583819804, /* 0x1.16f9157586772ffff */ + 1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */ + 1.094003332327482702577, /* 0x1.18109a360fc23fff2 */ + 1.096142145591650907149, /* 0x1.189cc58b155a70008 */ + 1.098285140311341168136, /* 0x1.1929370751ea50002 */ + 1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */ + 1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */ + 1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */ + 1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */ + 1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */ + 1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */ + 1.113403872669181282605, /* 0x1.1d0809445a97ffffc */ + 1.115580614653132185460, /* 0x1.1d96b0effc9db000e */ + 1.117761612217810673898, /* 0x1.1e25a001332190000 */ + 1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */ + 1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */ + 1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */ + 1.126528325196519908506, /* 0x1.2064290abc98c0001 */ + 1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */ + 1.130937432396844410880, /* 0x1.21851d95f776dfff0 */ + 1.133148453059692917203, /* 0x1.2216045b6784efffa */ + 1.135363796355857157764, /* 0x1.22a733a6692ae0004 */ + 1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */ + 1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */ + 1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */ + 1.144268564977221958089, /* 0x1.24eec8e06b035000c */ + 1.146505648458203463465, /* 0x1.258164e8cea85fff8 */ + 1.148747105501412235671, /* 0x1.26144a5180d380009 */ + 1.150992944689175123667, /* 0x1.26a7793f5de2efffa */ + 1.153243174560058870217, /* 0x1.273af1d712179000d */ + 1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */ + 1.157756840726344771440, /* 0x1.2862c097a3d29000c */ + 1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */ + 1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */ + 1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */ + 1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */ + 1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */ + 1.171404112007080167155, /* 0x1.2be123cf786790002 */ + 1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */ + 1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */ + 1.178287955789017793514, /* 0x1.2da4478b627040002 */ + 1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */ + 1.182899644456603782686, /* 0x1.2ed282d76421d0004 */ + 1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */ + 1.187529382762033236513, /* 0x1.3001ecf60082ffffa */ + 1.189851042595508889847, /* 0x1.309a13f30f28a0004 */ + 1.192177241354644978669, /* 0x1.31328716a758cfff7 */ + 1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */ + 1.196843291137896336843, /* 0x1.32645269dfd04000a */ + 1.199183159977805113226, /* 0x1.32fdaae604c39000f */ + 1.201527603343041317132, /* 0x1.339750219980dfff3 */ + 1.203876630171082595692, /* 0x1.3431424300e480007 */ + 1.206230249419600664189, /* 0x1.34cb8170b3fee000e */ + 1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */ + 1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */ + 1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */ + 1.215690830512196507537, /* 0x1.373783a718d29000f */ + 1.218067546930756250870, /* 0x1.37d3465662f480007 */ + 1.220448909901335365929, /* 0x1.386f56fa770fe0008 */ + 1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */ + 1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */ + 1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */ + 1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */ + 1.232425741726685064472, /* 0x1.3b8040df76f39fffa */ + 1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */ + 1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */ + 1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */ + 1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */ + 1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */ + 1.246953186383919165383, /* 0x1.3f3852f32973efff0 */ + 1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */ + 1.251833623164381181797, /* 0x1.40782b17863250005 */ + 1.254280999953110153911, /* 0x1.41188f42caf400000 */ + 1.256733161434815393410, /* 0x1.41b943b42945bfffd */ + 1.259190116985283935980, /* 0x1.425a4893e5f10000a */ + 1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */ + 1.264118447754797758244, /* 0x1.439d443f608c4fff9 */ + 1.266589841787181258708, /* 0x1.443f3b5bebf850008 */ + 1.269066067469190262045, /* 0x1.44e183883e561fff7 */ + 1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */ + 1.274033051628237434048, /* 0x1.462707b2c43020009 */ + 1.276523829025464573684, /* 0x1.46ca44023aa410007 */ + 1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */ + 1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */ + 1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */ + 1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */ + 1.289050950070396384145, /* 0x1.49ff3e396e19d000b */ + 1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */ + 1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */ + 1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */ + 1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */ + 1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */ + 1.304245874766450485904, /* 0x1.4de30ec21097d0003 */ + 1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */ + 1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */ + 1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */ + 1.314475201942565174546, /* 0x1.50817263bf0e5fffb */ + 1.317045045107389400535, /* 0x1.5129dd3418575000e */ + 1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */ + 1.322199813675649204855, /* 0x1.527bafde83a310009 */ + 1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */ + 1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */ + 1.329969819671041886272, /* 0x1.5478e6f02775e0001 */ + 1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */ + 1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */ + 1.337785486688218616860, /* 0x1.56791c1263abefff7 */ + 1.340400902247843806217, /* 0x1.57248376aef21fffa */ + 1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */ + 1.345647083048053138662, /* 0x1.587c53c5a630f0002 */ + 1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */ + 1.350913796821875845231, /* 0x1.59d57c9110ad60006 */ + 1.353554878672557082439, /* 0x1.5a8292913d68cfffc */ + 1.356201123929036356254, /* 0x1.5b2fff3212db00007 */ + 1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */ + 1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */ + 1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */ + 1.366837941171020309735, /* 0x1.5de9176042f1effff */ + 1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */ + 1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */ + 1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */ + 1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */ + 1.380251356531521533853, /* 0x1.6158272490016000c */ + 1.382949794301995272203, /* 0x1.6208ff6a8978a000f */ + 1.385653507605306700170, /* 0x1.62ba3032c0a280004 */ + 1.388362506772382154503, /* 0x1.636bb9a994784000f */ + 1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */ + 1.393796403973427855412, /* 0x1.64cfd7545928b0002 */ + 1.396521322756352656542, /* 0x1.65826be167badfff8 */ + 1.399251568859207761660, /* 0x1.663559cf20826000c */ + 1.401987152677323100733, /* 0x1.66e8a14a29486fffc */ + 1.404728084651919228815, /* 0x1.679c427f5a4b6000b */ + 1.407474375243217723560, /* 0x1.68503d9ba0add000f */ + 1.410226034922914983815, /* 0x1.690492cbf6303fff9 */ + 1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */ +}; + +const volatile float TWOM100 = 7.88860905e-31; +const volatile float TWO127 = 1.7014118346e+38; + + +unsigned long _randseed = 1; + +void srandom( unsigned long seed ) +{ + _randseed = seed; +} + +unsigned long random( void ) +{ + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = _randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if ( t <= 0 ) + t += 0x7fffffff; + _randseed = t; + return ( t ); +} + + +/* s_ceilf.c -- float version of s_ceil.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_ceilf.c,v 1.4 1995/05/10 20:46:55 jtc Exp $"; +#endif + +#ifdef __STDC__ +float __ceilf( float x ) +#else +float __ceilf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0 ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 < 0 ) + i0 = 0x80000000; + else + if ( i0 != 0 ) + i0 = 0x3f800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0 ) { /* raise inexact flag */ + if ( i0 > 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread3/math_private.h b/targets/wasm-tacle/parallel/rosace/thread3/math_private.h new file mode 100644 index 0000000..47f9137 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = ( d ); \ + ( i ) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD( d, i ) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = ( i ); \ + ( d ) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/parallel/rosace/thread3/multirate_precedence.h b/targets/wasm-tacle/parallel/rosace/thread3/multirate_precedence.h new file mode 100644 index 0000000..f1e7071 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/multirate_precedence.h @@ -0,0 +1,65 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: multirate_precedence.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: multirate_precedence.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _multirate_precedence_H +#define _multirate_precedence_H +#include +// Description of a precedence between two tasks of different rates + +struct job_prec { + int src_job; + int dst_job; +}; + +struct multirate_precedence { + char *src_name; + char *dst_name; + int prec_pref_size; + int prec_pat_size; + struct job_prec *prec_pref; + struct job_prec *prec_pat; +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread3/nonencoded_task_params.h b/targets/wasm-tacle/parallel/rosace/thread3/nonencoded_task_params.h new file mode 100644 index 0000000..fa67d94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/nonencoded_task_params.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: nonencoded_task_params.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: nonencoded_task_params.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _nonencoded_task_params_H +#define _nonencoded_task_params_H +#define NULL ((void*)0) +// Description of a real time task, without precedence encoding. + +struct nonencoded_task_params { + char *ne_t_name; + int ne_t_period; + int ne_t_initial_release; + int ne_t_wcet; + int ne_t_deadline; + int ( *ne_t_body )( void * ); // This is the code to execute at each + // instance of the task. +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread3/ros_th3.c b/targets/wasm-tacle/parallel/rosace/thread3/ros_th3.c new file mode 100644 index 0000000..ff5da7a --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread3/ros_th3.c @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: ros_th3 + + Author: Dustin Green and others + + Function: executes the third thread of original threads.c + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/c_posix_implementation/ + + Original name: threads, rosace + + Changes: union of rosace.c and threads.c + + License: see above + +*/ + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" +#include "common.h" + + +// Return variable +int ros_th3_check; + + +/* + Forward declaration of functions +*/ + +void* ros_th3_thread3( void* arg ); +int ros_th3_run_rosace( uint64_t nbstep ); +int main( void ); +void ros_th3_init( void ); +void ros_th3_main( void ); +int ros_th3_return( void ); + + +/* + Initialization function +*/ + +void ros_th3_init( void ) +{ + ros_th3_check = -1; + rosace_init(); +} + + +/* + Return function +*/ + +int ros_th3_return( void ) +{ + return ros_th3_check; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) ros_th3_main( void ) +{ + uint64_t tsimu = 300*200; + ros_th3_check = ros_th3_run_rosace( tsimu ); +} + + +int ros_th3_run_rosace( uint64_t nbstep ){ + max_step_simu = nbstep; + // Set first command + ROSACE_update_altitude_command( 11000.0 ); + + // Exit + ros_th3_thread3( NULL ); + return 0; +} + + +void* ros_th3_thread3( void* arg ) { + uint64_t mystep_simu = step_simu; + + _Pragma( "loopbound min 60000 max 60000" ) + while( mystep_simu 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 33 Hz */ + +REAL_TYPE +altitude_hold_33( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 33.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 25 Hz */ + +REAL_TYPE +altitude_hold_25( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 25.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 10 Hz */ + +REAL_TYPE +altitude_hold_10( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 10.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Va Speed controller 50 Hz */ +REAL_TYPE +Va_control_50( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 33 Hz */ +REAL_TYPE +Va_control_33( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + +// Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; +// State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 25 Hz */ +REAL_TYPE +Va_control_25( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 10 Hz */ +REAL_TYPE +Va_control_10( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Vz Speed controller 50 Hz */ +REAL_TYPE +Vz_control_50( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 33 Hz */ +REAL_TYPE +Vz_control_33( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 25 Hz */ +REAL_TYPE +Vz_control_25( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 10 Hz */ +REAL_TYPE +Vz_control_10( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Engine */ +REAL_TYPE +engine( REAL_TYPE delta_th_c ) +{ + + static REAL_TYPE y = delta_th_eq; + static REAL_TYPE x1 = delta_th_eq; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE tau = 0.75; + + // Output + y = 26350.0 * x1; + // State Equation + x1_dot = -tau * x1 + tau * delta_th_c; + // Update State + x1 += dt_dx * x1_dot; + + return y; +} + + +/* Elevator */ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ) +{ + + static REAL_TYPE y = delta_e_eq; + static REAL_TYPE x1 = delta_e_eq; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE x2_dot = 0.0; + static REAL_TYPE omega = 25.0; + static REAL_TYPE xi = 0.85; + + // Output + y = x1; + // State Equation + x1_dot = x2; + x2_dot = -omega * omega * x1 - 2.0 * xi * omega * x2 + + omega * omega * delta_e_c; + // Update State + x1 += dt_de * x1_dot; + x2 += dt_de * x2_dot; + + return y; +} + + +/* Flight dynamics */ +void aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ) +{ + + static int debut = 1; + + static REAL_TYPE u = 0.0; + static REAL_TYPE w = 0.0; + static REAL_TYPE q = 0.0; + static REAL_TYPE theta = 0.0; + static REAL_TYPE h = 0.0; + static REAL_TYPE u_dot = 0.0; + static REAL_TYPE w_dot = 0.0; + static REAL_TYPE q_dot = 0.0; + static REAL_TYPE theta_dot = 0.0; + static REAL_TYPE h_dot = 0.0; + + static REAL_TYPE CD = 0.0; + static REAL_TYPE CL = 0.0; + static REAL_TYPE Cm = 0.0; + + static REAL_TYPE Xa = 0.0; + static REAL_TYPE Za = 0.0; + static REAL_TYPE Ma = 0.0; + + static REAL_TYPE alpha = 0.0; + static REAL_TYPE qbar = 0.0; + static REAL_TYPE V = 0.0; + static REAL_TYPE rho = 0.0; + + if ( debut ) { + debut = 0; + u = Va_eq * MATH_COS( theta_eq ); + w = Va_eq * MATH_SIN( theta_eq ); + q = 0.0; + theta = theta_eq; + h = h_eq; + } + + rho = rho0 * pow( 1.0 + T0_h / T0_0 * h, - g0 / ( Rs * T0_h ) - 1.0 ); + alpha = atan( w / u ); + V = sqrt( u * u + w * w ); + qbar = 0.5 * rho * V * V; + CL = CL_deltae * delta_e + CL_alpha * ( alpha - alpha_0 ); + CD = CD_0 + CD_deltae * delta_e + + CD_alpha * ( alpha - alpha_0 ) * ( alpha - alpha_0 ); + Cm = Cm_0 + Cm_deltae * delta_e + + Cm_alpha * alpha + 0.5 * Cm_q * q * cbar / V; + Xa = - qbar * S * ( CD * MATH_COS( alpha ) - CL * MATH_SIN( alpha ) ); + Za = - qbar * S * ( CD * MATH_SIN( alpha ) + CL * MATH_COS( alpha ) ); + Ma = qbar * cbar * S * Cm; + + // Output + outputs -> Va = V; + outputs -> Vz = w * MATH_COS( theta ) - u * MATH_SIN( theta ); + outputs -> q = q; + outputs -> az = g0 * MATH_COS( theta ) + Za / masse; + outputs -> h = h; + // State Equation + u_dot = - g0 * sin ( theta ) - q * w + ( Xa + T ) / masse; + w_dot = g0 * MATH_COS ( theta ) + q * u + Za / masse; + q_dot = Ma / I_y; + theta_dot = q; + h_dot = u * MATH_SIN( theta ) - w * MATH_COS( theta ); + // Update State + u += dt * u_dot; + w += dt * w_dot; + q += dt * q_dot; + theta += dt * theta_dot; + h += dt * h_dot; + + + static REAL_TYPE Time = 0.0; + + + // instant++; + Time = Time + dt; +} + + +/* + The commanded altitude +*/ +REAL_TYPE input_h_c( void ) +{ + return h_c; +} + + +/* + The commanded airspeed +*/ +REAL_TYPE input_Va_c( void ) +{ + return Va_c; +} + + +void output_delta_th_c( REAL_TYPE delta_th_c ) +{ + +} + + +void output_delta_e_c( REAL_TYPE delta_e_c ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread4/assemblage_includes.h b/targets/wasm-tacle/parallel/rosace/thread4/assemblage_includes.h new file mode 100644 index 0000000..747c4b1 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/assemblage_includes.h @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef ASSEMBLAGE_INCLUDES_H +#define ASSEMBLAGE_INCLUDES_H +#include "types.h" +#include "io.h" + + +/* *************************************************************************** + Shared constants + * ************************************************************************* */ +#define delta_th_eq (1.5868660794926) +#define delta_e_eq (0.012009615652468) +extern const REAL_TYPE h_eq; +extern const REAL_TYPE Va_eq; +#ifndef NBMAX_SAMPLE +#define NBMAX_SAMPLE (6000000/4) +#endif +extern REAL_TYPE sample[ SPL_SIZE ][ NBMAX_SAMPLE ]; + +void print_inmemory_sample( void ); + +/* *************************************************************************** + The prelude imported node prototypes + * ************************************************************************* */ +/** + Va filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Va, airspeed (m/s) + @return Va_f, filtered airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_50( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_33( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_25( REAL_TYPE Va ); + +/** + Vz filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Vz, vertical speed (m/s) + @return Vz_f, filtered vertical airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_50 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_33 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_25 ( REAL_TYPE Vz ); + +/** + q filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] q, pitch rate (rad/s) + @return q_f, filtered pitch rate (rad/s) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +q_filter_100( REAL_TYPE q ); + +REAL_TYPE +q_filter_50 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_33 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_25 ( REAL_TYPE q ); + +/** + az filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] az, normal acceleration (m/s^2) + @return az_f, filtered normal acceleration (m/s^2) + 2nd order Butterworth filter with fc = 10.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +az_filter_100( REAL_TYPE az ); + +REAL_TYPE +az_filter_50 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_33 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_25 ( REAL_TYPE az ); + +/** + h filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] h, altitude (m) + @return h_f, filtered altitude (m) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ); + +REAL_TYPE +h_filter_50 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_33 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_25 ( REAL_TYPE h ); + +/** + Altitude hold controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] h_f, filtered altitude (m) + @param[in] h_c, commanded altitude (m) + @return Vz_c, commanded vertical speed (m/s) + Generates the vertical speed command Vz_c to track altitude change h_c +*/ +REAL_TYPE +altitude_hold_50 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_33 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_25 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_10 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +/** + Vz Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] Vz_c, commanded vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @param[in] az_f, filtered normal acceleration (m/s^2) + @return delta_e_c, commanded elevator deflection (rad) + Generates the elevator deflection command to track vertical speed command Vz_c +*/ +REAL_TYPE +Vz_control_50 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_33 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_25 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_10 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +/** + Va Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Va_f, filtered airspeed (m/s) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @return delta_th_c, commanded throttle (-) + Generates the throttle command to track airspeed change Va_c +*/ +REAL_TYPE +Va_control_50 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_33 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_25 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_10 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +/** + Engine (200 Hz --> 5ms period) + @param[in] delta_th_c, commanded throttle (-) + @return T, Thrust (N) + 1st order system with time constant 0.5 s + ODE Solver: Euler method with fixed-step = 0.005 (200 Hz) +*/ +REAL_TYPE +engine( REAL_TYPE delta_th_c ); + +/** + Elevator (200 Hz --> 5ms period) + @param[in] delta_e_c, commanded elevator deflection (rad) + @return delta_e, elevator deflection (rad) + 2nd order system (natural frequency omega = 25.0 rad/s and damping xi = 0.85) + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ); + +/** + Flight dynamics (200 Hz --> 5ms period) + @param[in] i, the simulation step + @param[in] delta_e, elevator deflection (rad) + @param[in] T, Thrust (N) + @param[out] outputs, the outputs Va, Vz, q, az, h + Aircraft flight dynamics + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +void +aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ); + +/* *************************************************************************** + The prelude sensor node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +REAL_TYPE +input_h_c( void ); + +REAL_TYPE +input_Va_c( void ); + + +/* *************************************************************************** + The prelude actuator node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_th_c( REAL_TYPE delta_th_c ); + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_e_c( REAL_TYPE delta_e_c ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/com_patterns.h b/targets/wasm-tacle/parallel/rosace/thread4/com_patterns.h new file mode 100644 index 0000000..8b98cd7 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/com_patterns.h @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: com_patterns.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: com_patterns.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef com_patterns_H_ +#define com_patterns_H_ +// Description of communication protocols using ultimately periodic +// words: prefix.(periodic pattern). Each communication uses a circular +// buffer shared between the writer and the reader. + +// The task instance i writes to the communication buffer iff proto[n] +// is true (modulo the size of the periodic word). After each write, the +// index where the writer writes is incremented. +struct write_proto_t { + int *write_pref; + int wpref_size; + int *write_pat; + int wpat_size; +}; + +// The task instance n must increment the index at which the task reads +// in the communication buffer iff proto[n] is true (modulo the size of the +// periodic word). +struct read_proto_t { + int *change_pref; + int rpref_size; + int *change_pat; + int rpat_size; +}; + +/** + Returns 1 if instance n must write in the com buffer. +*/ +static inline int must_write( struct write_proto_t wp, int n ) +{ + if ( n < wp.wpref_size ) + return wp.write_pref[ n ]; + else + return wp.write_pat[ ( n - wp.wpref_size ) % wp.wpat_size ]; +} + + +/** + Returns 1 if instance n must change the cell from which it reads. +*/ +static inline int must_change( struct read_proto_t rp, int n ) +{ + if ( n < rp.rpref_size ) + return rp.change_pref[ n ]; + else + return rp.change_pat[ ( n - rp.rpref_size ) % rp.rpat_size ]; +} + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/common.c b/targets/wasm-tacle/parallel/rosace/thread4/common.c new file mode 100644 index 0000000..d52da59 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/common.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.c + + Author: Dustin Green + + Function: Common used functions from original threads.c + + Source: + + Original name: + + Changes: No major changes of functions from original threads.c + + License: See the terms above. + +*/ + +#include "common.h" +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +void rosace_init( void ) +{ + + // Initial values + outs.sig_outputs.Va = 0; + outs.sig_outputs.Vz = 0; + outs.sig_outputs.q = 0; + outs.sig_outputs.az = 0; + outs.sig_outputs.h = 0; + outs.t_simu = 0; + step_simu = 0; + + // Get the task set (required for CALL() macro) + int tmp; + get_task_set( &tmp, &tasks ); +} + + +void copy_output_vars( output_t *v, uint64_t step ) +{ + v->sig_outputs.Va = aircraft_dynamics495_Va_Va_filter_100449_Va[ step % 2 ]; + v->sig_outputs.Vz = aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ step % 2 ]; + v->sig_outputs.q = aircraft_dynamics495_q_q_filter_100455_q[ step % 2 ]; + v->sig_outputs.az = aircraft_dynamics495_az_az_filter_100458_az[ step % 2 ]; + v->sig_outputs.h = aircraft_dynamics495_h_h_filter_100446_h[ step % 2 ]; + v->sig_delta_th_c = Va_control_50474_delta_th_c_delta_th_c; + v->sig_delta_e_c = Vz_control_50483_delta_e_c_delta_e_c; +} + diff --git a/targets/wasm-tacle/parallel/rosace/thread4/common.h b/targets/wasm-tacle/parallel/rosace/thread4/common.h new file mode 100644 index 0000000..315ab80 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/common.h @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.h + + Author: Dustin Green + + Function: Common used functions and variables from original threads.c + + Source: + + Original name: + + Changes: No major functional changes + + License: See the terms above. + +*/ + +#ifndef COMMON_H +#define COMMON_H + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +// I/O +output_t outs; +uint64_t step_simu; +uint64_t max_step_simu; + + +// Output variables +extern double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +extern double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +extern double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +extern double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +extern double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +extern double Va_control_50474_delta_th_c_delta_th_c; +extern double Vz_control_50483_delta_e_c_delta_e_c; + + +// Task set +struct nonencoded_task_params *tasks; + + +// Common functions +void rosace_init( void ); +void copy_output_vars( output_t *v, uint64_t step ); + + +// This should be set to 1 to run in "real-time" in the sense +// that the simulation time is close to the real world time +#define RUN_WITH_REAL_TIME 0 + +#define CALL( val ) tasks[ (val) ].ne_t_body( NULL ) + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/io.c b/targets/wasm-tacle/parallel/rosace/thread4/io.c new file mode 100644 index 0000000..ad775fb --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/io.c @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.c + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.c + + Changes: delete the code within ROSACE_write_outputs because + stdio.h is not available + + License: See the terms above. + +*/ + +#include "types.h" +#include "io.h" + +#define FMTREAL "%5.15f" +#define BASE_FREQUENCY 200.0 + +extern REAL_TYPE h_c; + +void ROSACE_update_altitude_command( REAL_TYPE h_cons ) +{ + h_c = h_cons; +} + +void ROSACE_write_outputs( output_t *v ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread4/io.h b/targets/wasm-tacle/parallel/rosace/thread4/io.h new file mode 100644 index 0000000..be20e10 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/io.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.h + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_IO_H +#define __DEF_ROSACE_IO_H + +#include "types.h" + +typedef struct { + struct aircraft_dynamics_outs_t sig_outputs; + uint64_t t_simu; + REAL_TYPE sig_delta_th_c; + REAL_TYPE sig_delta_e_c; +} output_t; + +void ROSACE_write_outputs( output_t *v ); +void ROSACE_update_altitude_command( REAL_TYPE h_cons ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/math_all.c b/targets/wasm-tacle/parallel/rosace/thread4/math_all.c new file mode 100644 index 0000000..3400e74 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/math_all.c @@ -0,0 +1,2278 @@ + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_all.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_all.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#include "math_private.h" +#include "wcclibm.h" + +// The following defines map the math functions to specialized calls. +// The declarations in math.h are bound to the official interface names. +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +// The list of defined functions with their official interface names +float __atanf( float x ); +float __ceilf( float x ); +float __copysignf( float x, float y ); +float __cosf( float x ); +float __erff( float x ); +float __fabsf( float x ); +float __floorf( float x ); +float __ieee754_acosf( float x ); +float __ieee754_expf( float x ); +float __ieee754_logf( float x ); +float __ieee754_log10f( float x ); +float __ieee754_powf( float x, float y ); +int32_t __ieee754_rem_pio2f( float x, float *y ); +float __ieee754_sqrtf( float x ); +int __isinff( float x ); +float __kernel_cosf( float x, float y ); +float __kernel_sinf( float x, float y, int iy ); +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2 ); +float __sinf( float x ); +float __scalbnf( float x, int n ); + + +// Often used variables/consts +#ifdef __STDC__ +const float +#else +float +#endif +one = 1.0f, +tiny = 1.0e-30f, +half = 5.0000000000e-01f, /* 0x3f000000 */ +huge = 1.0e30f, +two = 2.0f, +two24 = 16777216.0f, /* 0x4b800000 */ +two25 = 3.3554432000e+07f, /* 0x4c000000 */ +two8 = 2.5600000000e+02f, /* 0x43800000 */ +twon8 = 3.9062500000e-03f, /* 0x3b800000 */ +zero = 0.0f; + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00f, /\* 0x3F800000 *\/ */ +pi = 3.1415925026e+00f, /* 0x40490fda */ +pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ +pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ +pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ +pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ +pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ +pS3 = -4.0055535734e-02f, /* 0xbd241146 */ +pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ +pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ +qS1 = -2.4033949375e+00f, /* 0xc019d139 */ +qS2 = 2.0209457874e+00f, /* 0x4001572d */ +qS3 = -6.8828397989e-01f, /* 0xbf303361 */ +qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +#ifdef __STDC__ +float __ieee754_acosf( float x ) +#else +float __ieee754_acosf( x ) +float x; +#endif +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return pi + ( float )2.0f * pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return pio2_hi + pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + return pio2_hi - ( x - ( pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( one + x ) * ( float )0.5f; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + s = __ieee754_sqrtf( z ); + r = p / q; + w = r * s - pio2_lo; + return pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( one - x ) * ( float )0.5f; + s = __ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* static const float huge = 1.0e+30f, tiny = 1.0e-30f; */ + +#ifdef __STDC__ +const float +#else +float +#endif +bp[] = {1.0f, 1.5f,}, + dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* zero = 0.0f, */ + /* one = 1.0f, */ + /* two = 2.0f, */ + /* two24 = 16777216.0f, /\* 0x4b800000 *\/ */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + L1 = 6.0000002384e-01f, /* 0x3f19999a */ + L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + P3 = 6.6137559770e-05f, /* 0x388ab355 */ + P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +float __ieee754_powf( float x, float y ) +#else +float __ieee754_powf( x, y ) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return one; + + /* x==+-1 */ + if ( x == 1.0f ) return one; + if ( x == -1.0f && isinff( y ) ) return one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return __ieee754_sqrtf( x ); + } + + ax = fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? huge * huge : tiny * tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? huge * huge : tiny * tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * ivln2_l - w * ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( L1 + s2 * ( L2 + s2 * ( L3 + s2 * ( L4 + s2 * + ( L5 + s2 * L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l * p_h + p_l * cp + dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - dp_h[ k ] ) - z_h ); + } + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * huge * huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + ovt > z - p_h ) return s * huge * huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * tiny * tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * tiny * tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * lg2_h; + v = ( p_l - ( t - p_h ) ) * lg2 + t * lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( P1 + t * ( P2 + t * ( P3 + t * ( P4 + t * P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - two ) - ( w + z * w ); + z = one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = __scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] + use __kernel_rem_pio2f() +*/ + + +/* + Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi +*/ +#ifdef __STDC__ +const int32_t two_over_pi[] = { +#else +int32_t two_over_pi[] = { +#endif + 0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC, + 0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62, + 0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63, + 0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A, + 0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09, + 0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29, + 0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44, + 0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41, + 0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C, + 0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8, + 0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11, + 0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF, + 0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E, + 0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5, + 0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92, + 0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08, + 0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0, + 0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3, + 0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85, + 0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80, + 0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA, + 0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B, +}; + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int32_t npio2_hw[] = { +#else +int32_t npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t __ieee754_rem_pio2f( float x, float *y ) +#else +int32_t __ieee754_rem_pio2f( x, y ) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + float tx[ 3 ]; + int32_t e0, i, j, nx, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= pio2_2; + y[ 0 ] = z - pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += pio2_2; + y[ 0 ] = z + pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * invpio2 + half ); + fn = ( float )n; + r = t - fn * pio2_1; + w = fn * pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * pio2_2; + r = t - w; + w = fn * pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * pio2_3; + r = t - w; + w = fn * pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + /* set z = scalbn(|x|,ilogb(x)-7) */ + e0 = ( ix >> 23 ) - 134; /* e0 = ilogb(z)-7; */ + SET_FLOAT_WORD( z, ix - ( ( int32_t )( e0 << 23 ) ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < 2; i++ ) { + tx[ i ] = ( float )( ( int32_t )( z ) ); + z = ( z - tx[ i ] ) * two8; + } + tx[ 2 ] = z; + nx = 3; + _Pragma( "loopbound min 0 max 0" ) + while ( tx[ nx - 1 ] == zero ) { + nx--; /* skip zero term */ + } + n = __kernel_rem_pio2f( tx, y, e0, nx, 2, two_over_pi ); + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } + return n; +} +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: e_sqrtf.c,v 1.4 1995/05/10 20:46:19 jtc Exp $"; +#endif + + +/* #ifdef __STDC__ */ +/* static const float one = 1.0f, tiny=1.0e-30f; */ +/* #else */ +/* static float one = 1.0f, tiny=1.0e-30f; */ +/* #endif */ + +#ifdef __STDC__ +float __ieee754_sqrtf( float x ) +#else +float __ieee754_sqrtf( x ) +float x; +#endif +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 0 max 0" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = one - tiny; /* trigger inexact flag */ + if ( z >= one ) { + z = one + tiny; + if ( z > one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +C4 = -2.7557314297e-07f, /* 0xb493f27c */ +C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float __kernel_cosf( float x, float y ) +#else +float __kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return one; /* generate inexact */ + } + z = x * x; + r = z * ( C1 + z * ( C2 + z * ( C3 + z * ( C4 + z * ( C5 + z * C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} +/* k_rem_pio2f.c -- float version of k_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: k_rem_pio2f.c,v 1.4 1995/05/10 20:46:28 jtc Exp $"; +#endif + + +/* In the float version, the input parameter x contains 8 bit + integers, not 24 bit integers. 113 bit precision is not supported. */ + +#ifdef __STDC__ +const int init_jk[] = {4, 7, 9}; /* initial value for jk */ +#else +int init_jk[] = {4, 7, 9}; +#endif + +#ifdef __STDC__ +const float PIo2[] = { +#else +float PIo2[] = { +#endif + 1.5703125000e+00f, /* 0x3fc90000 */ + 4.5776367188e-04f, /* 0x39f00000 */ + 2.5987625122e-05f, /* 0x37da0000 */ + 7.5437128544e-08f, /* 0x33a20000 */ + 6.0026650317e-11f, /* 0x2e840000 */ + 7.3896444519e-13f, /* 0x2b500000 */ + 5.3845816694e-15f, /* 0x27c20000 */ + 5.6378512969e-18f, /* 0x22d00000 */ + 8.3009228831e-20f, /* 0x1fc40000 */ + 3.2756352257e-22f, /* 0x1bc60000 */ + 6.3331015649e-25f, /* 0x17440000 */ +}; + + +#ifdef __STDC__ +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ) +#else +int __kernel_rem_pio2f( x, y, e0, nx, prec, ipio2 ) +float x[], y[]; +int e0, nx, prec; +int32_t ipio2[]; +#endif +{ + int32_t jz, jx, jv, jp, jk, carry, n, iq[ 20 ], i, j, k, m, q0, ih; + float z, fw, f[ 20 ], fq[ 20 ], q[ 20 ]; + + /* initialize jk*/ + jk = init_jk[ prec ]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx - 1; + jv = ( e0 - 3 ) / 8; + if ( jv < 0 ) jv = 0; + q0 = e0 - 8 * ( jv + 1 ); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv - jx; + m = jx + jk; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= m; i++, j++ ) + f[i] = ( j < 0 ) ? zero : ( float ) ipio2[ j ]; + + /* compute q[0],q[1],...q[jk] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= jk; i++ ) { + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[ i ] = fw; + } + + jz = jk; +recompute: + ; + /* distill q[] into iq[] reversingly */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0, j = jz, z = q[ jz ]; j > 0; i++, j-- ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[i] = ( int32_t )( z - two8 * fw ); + z = q[ j - 1 ] + fw; + } + + /* compute n */ + z = __scalbnf( z, q0 ); /* actual value of z */ + z -= ( float )8.0f * __floorf( z * ( float ) + 0.125f ); /* trim off integer >= 8 */ + n = ( int32_t ) z; + z -= ( float )n; + ih = 0; + if ( q0 > 0 ) { /* need iq[jz-1] to determine n */ + i = ( iq[ jz - 1 ] >> ( 8 - q0 ) ); + n += i; + iq[ jz - 1 ] -= i << ( 8 - q0 ); + ih = iq[ jz - 1 ] >> ( 7 - q0 ); + } else + if ( q0 == 0 ) ih = iq[ jz - 1 ] >> 8; + else + if ( z >= ( float )0.5f ) ih = 2; + + if ( ih > 0 ) { /* q > 0.5 */ + n += 1; + carry = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < jz ; i++ ) { /* compute 1-q */ + j = iq[ i ]; + if ( carry == 0 ) { + if ( j != 0 ) { + carry = 1; + iq[ i ] = 0x100 - j; + } + } else iq[ i ] = 0xff - j; + + } + if ( q0 > 0 ) { /* rare case: chance is 1 in 12 */ + switch ( q0 ) { + case 1: + iq[ jz - 1 ] &= 0x7f; + break; + case 2: + iq[ jz - 1 ] &= 0x3f; + break; + } + } + if ( ih == 2 ) { + z = one - z; + if ( carry != 0 ) z -= __scalbnf( one, q0 ); + } + } + + /* check if recomputation is needed */ + if ( z == zero ) { + j = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz - 1; i >= jk; i-- ) + j |= iq[ i ]; + if ( j == 0 ) { /* need recomputation */ + _Pragma( "loopbound min 0 max 0" ) + for ( k = 1; iq[ jk - k ] == 0; k++ ) { + ; /* k = no. of terms needed */ + } + + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz + 1; i <= jz + k; i++ ) { /* add q[jz+1] to q[jz+k] */ + f[ jx + i ] = ( float ) ipio2[ jv + i ]; + _Pragma( "loopbound min 0 max 0" ) + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if ( z == ( float )0.0f ) { + jz -= 1; + q0 -= 8; + _Pragma( "loopbound min 0 max 0" ) + while ( iq[ jz ] == 0 ) { + jz--; + q0 -= 8; + } + } else { /* break z into 8-bit if necessary */ + z = __scalbnf( z, -q0 ); + if ( z >= two8 ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[ jz ] = ( int32_t )( z - two8 * fw ); + jz += 1; + q0 += 8; + iq[ jz ] = ( int32_t ) fw; + } else iq[ jz ] = ( int32_t ) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = __scalbnf( one, q0 ); + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + q[ i ] = fw * ( float )iq[ i ]; + fw *= twon8; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, k = 0; k <= jp && k <= jz - i; k++ ) + fw += PIo2[ k ] * q[ i + k ]; + fq[ jz - i ] = fw; + } + + /* compress fq[] into y[] */ + switch ( prec ) { + case 0: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + break; + case 1: + case 2: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + fw = fq[ 0 ] - fw; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i <= jz; i++ ) + fw += fq[ i ]; + y[ 1 ] = ( ih == 0 ) ? fw : -fw; + break; + case 3:; /* painful */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 0; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 1; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, i = jz; i >= 2; i-- ) + fw += fq[ i ]; + + if ( ih == 0 ) { + y[ 0 ] = fq[ 0 ]; + y[ 1 ] = fq[ 1 ]; + y[ 2 ] = fw; + } else { + y[ 0 ] = -fq[ 0 ]; + y[ 1 ] = -fq[ 1 ]; + y[ 2 ] = -fw; + } + } + return n & 7; +} +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +S2 = 8.3333337680e-03f, /* 0x3c088889 */ +S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float __kernel_sinf( float x, float y, int iy ) +#else +float __kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = S2 + z * ( S3 + z * ( S4 + z * ( S5 + z * S6 ) ) ); + if ( iy == 0 ) return x + v * ( S1 + z * r ); + else return x - ( ( z * ( half * y - v * r ) - y ) - v * S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float atanhi[] = { +#else +float atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float atanlo[] = { +#else +float atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float aT[] = { +#else +float aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float __atanf( float x ) +#else +float __atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return atanhi[ 3 ] + atanlo[ 3 ]; + else return -atanhi[ 3 ] - atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( huge + x > one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - one ) / ( x + one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z * ( aT[ 0 ] + w * ( aT[ 2 ] + w * ( aT[ 4 ] + w * ( aT[ 6 ] + w * + ( aT[ 8 ] + w * aT[ 10 ] ) ) ) ) ); + s2 = w * ( aT[ 1 ] + w * ( aT[ 3 ] + w * ( aT[ 5 ] + w * ( aT[ 7 ] + w * aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = atanhi[ id ] - ( ( x * ( s1 + s2 ) - atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} +//weak_alias (__atanf, atanf) +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +#ifdef __STDC__ +float __copysignf( float x, float y ) +#else +float __copysignf( x, y ) +float x, y; +#endif +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} +//weak_alias (__copysignf, copysignf) +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float __cosf( float x ) +#else +float __cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -__kernel_sinf( y[ 0 ], y[ 1], 1 ); + case 2: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +#ifdef __STDC__ +float __fabsf( float x ) +#else +float __fabsf( x ) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + +/* s_floorf.c -- float version of s_floor.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + floorf(x) + Return x rounded toward -inf to integral value + Method: + Bit twiddling. + Exception: + Inexact flag raised if x not equal to floorf(x). +*/ + + +/* #ifdef __STDC__ */ +/* static const float huge = 1.0e30f; */ +/* #else */ +/* static float huge = 1.0e30f; */ +/* #endif */ + +#ifdef __STDC__ +float __floorf( float x ) +#else +float __floorf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0f ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 >= 0 ) + i0 = 0; + else + if ( ( i0 & 0x7fffffff ) != 0 ) + i0 = 0xbf800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0f ) { /* raise inexact flag */ + if ( i0 < 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} +//weak_alias (__floorf, floorf) +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + + +int +__isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} +/* hidden_def (__isinff) */ +/* weak_alias (__isinff, isinff) */ +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float __scalbnf ( float x, int n ) +#else +float __scalbnf ( x, n ) +float x; +int n; +#endif +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return huge * __copysignf( huge, x ); /* overflow */ + if ( n < -50000 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * twom25; +} +//weak_alias (__scalbnf, scalbnf) + + + +/* e_log10f.c -- float version of e_log10.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ivln10 = 4.3429449201e-01f, /* 0x3ede5bd9 */ +log10_2hi = 3.0102920532e-01f, /* 0x3e9a2080 */ +log10_2lo = 7.9034151668e-07f; /* 0x355427db */ + +#ifdef __STDC__ +float __ieee754_log10f( float x ) +#else +float __ieee754_log10f( x ) +float x; +#endif +{ + float y, z; + int32_t i, k, hx; + + GET_FLOAT_WORD( hx, x ); + + k = 0; + if ( hx < 0x00800000 ) { /* x < 2**-126 */ + if ( ( hx & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( hx < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( hx, x ); + } + if ( hx >= 0x7f800000 ) return x + x; + k += ( hx >> 23 ) - 127; + i = ( ( u_int32_t )k & 0x80000000 ) >> 31; + hx = ( hx & 0x007fffff ) | ( ( 0x7f - i ) << 23 ); + y = ( float )( k + i ); + SET_FLOAT_WORD( x, hx ); + z = y * log10_2lo + ivln10 * __ieee754_logf( x ); + return z + y * log10_2hi; +} + + +/* e_logf.c -- float version of e_log.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ln2_hi = 6.9313812256e-01f, /* 0x3f317180 */ +ln2_lo = 9.0580006145e-06f, /* 0x3717f7d1 */ +Lg1 = 6.6666668653e-01f, /* 3F2AAAAB */ +Lg2 = 4.0000000596e-01f, /* 3ECCCCCD */ +Lg3 = 2.8571429849e-01f, /* 3E924925 */ +Lg4 = 2.2222198546e-01f, /* 3E638E29 */ +Lg5 = 1.8183572590e-01f, /* 3E3A3325 */ +Lg6 = 1.5313838422e-01f, /* 3E1CD04F */ +Lg7 = 1.4798198640e-01f; /* 3E178897 */ + +#ifdef __STDC__ +float __ieee754_logf( float x ) +#else +float __ieee754_logf( x ) +float x; +#endif +{ + float hfsq, f, s, z, R, w, t1, t2, dk; + int32_t k, ix, i, j; + + GET_FLOAT_WORD( ix, x ); + + k = 0; + if ( ix < 0x00800000 ) { /* x < 2**-126 */ + if ( ( ix & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( ix < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( ix, x ); + } + if ( ix >= 0x7f800000 ) return x + x; + k += ( ix >> 23 ) - 127; + ix &= 0x007fffff; + i = ( ix + ( 0x95f64 << 3 ) ) & 0x800000; + SET_FLOAT_WORD( x, ix | ( i ^ 0x3f800000 ) ); /* normalize x or x/2 */ + k += ( i >> 23 ); + f = x - ( float )1.0; + if ( ( 0x007fffff & ( 15 + ix ) ) < 16 ) { /* |f| < 2**-20 */ + if ( f == zero ) { + if ( k == 0 ) return zero; + else { + dk = ( float )k; + return dk * ln2_hi + dk * ln2_lo; + } + } + R = f * f * ( ( float )0.5f - ( float )0.33333333333333333f * f ); + if ( k == 0 ) return f - R; + else { + dk = ( float )k; + return dk * ln2_hi - ( ( R - dk * ln2_lo ) - f ); + } + } + s = f / ( ( float )2.0f + f ); + dk = ( float )k; + z = s * s; + i = ix - ( 0x6147a << 3 ); + w = z * z; + j = ( 0x6b851 << 3 ) - ix; + t1 = w * ( Lg2 + w * ( Lg4 + w * Lg6 ) ); + t2 = z * ( Lg1 + w * ( Lg3 + w * ( Lg5 + w * Lg7 ) ) ); + i |= j; + R = t2 + t1; + if ( i > 0 ) { + hfsq = ( float )0.5f * f * f; + if ( k == 0 ) return f - ( hfsq - s * ( hfsq + R ) ); + else + return dk * ln2_hi - ( ( hfsq - ( s * ( hfsq + R ) + dk * ln2_lo ) ) - f ); + } else { + if ( k == 0 ) return f - s * ( f - R ); + else + return dk * ln2_hi - ( ( s * ( f - R ) - dk * ln2_lo ) - f ); + } +} + + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float __sinf( float x ) +#else +float __sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -__kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + + +/* Single-precision floating point e^x. + Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating + + The GNU C 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. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* How this works: + + The input value, x, is written as + + x = n * ln(2) + t/512 + delta[t] + x; + + where: + - n is an integer, 127 >= n >= -150; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n ( e^(t/512 + delta[t]) + + ( e^(t/512 + delta[t]) + ( p(x + delta[t] + n * ln(2)) - delta ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table. + + The table used is the same one as for the double precision version; + since we have the table, we might as well use it. + + It turns out to be faster to do calculations in double precision than + to perform an 'accurate table method' expf, because of the range reduction + overhead (compare exp2f). +*/ + + +const float __exp_deltatable[ 178 ] = { + 0.000000e+00, 1.436239e-11, -1.851323e-11, 1.250434e-12, + -4.382040e-10, 4.014913e-13, 6.324634e-12, 1.473544e-12, + -4.987366e-11, -1.752952e-12, 6.321584e-13, -3.260980e-12, + 2.777399e-12, -3.787255e-11, -2.182022e-13, -9.047329e-13, + 7.118903e-12, -3.555871e-13, -5.198906e-12, -4.124305e-13, + 1.940741e-12, 2.811727e-13, -2.117377e-13, 2.782236e-14, + 1.074722e-13, -8.844783e-13, -1.240327e-16, 7.052319e-13, + 6.447490e-13, 4.011210e-13, 5.462592e-13, 1.843201e-12, + -2.028864e-12, -2.931258e-13, 8.606021e-12, -5.626610e-13, + 1.295899e-13, -2.330782e-12, -5.478326e-13, 1.845989e-12, + -4.234531e-12, 1.735903e-12, 1.518525e-13, 2.535486e-12, + -4.674620e-13, -1.051410e-12, -1.666138e-12, -9.372511e-13, + 3.200735e-12, 2.292755e-12, 2.525703e-12, 5.823944e-13, + -9.789686e-13, 5.145901e-13, -4.527062e-12, -1.683974e-12, + 9.547877e-12, 2.078277e-13, -2.575768e-12, -1.026653e-12, + 8.179204e-13, 6.063405e-13, 3.908063e-13, -2.855789e-13, + -6.295203e-12, -2.709950e-13, 4.477842e-14, 4.821464e-13, + -5.566389e-13, 1.357999e-12, 7.670314e-13, -9.506315e-12, + -1.738782e-12, -8.637127e-13, -1.933394e-12, -1.267901e-13, + -4.426381e-13, 1.260695e-12, -3.277632e-12, -1.941204e-12, + -4.246588e-12, 2.948061e-12, -2.192153e-13, 1.066989e-12, + 3.009034e-13, 9.622095e-13, 2.332691e-13, -2.541789e-12, + -8.988149e-13, -1.005515e-12, 1.152009e-12, 2.547998e-12, + -8.128411e-12, -5.987095e-12, -1.230903e-12, 1.251520e-12, + -1.144099e-12, -1.419784e-14, 6.041652e-13, -2.428500e-13, + -6.869299e-12, 2.192179e-13, 3.987357e-13, -1.482881e-12, + 3.078380e-13, 5.226606e-12, -3.655583e-13, -7.399489e-13, + -2.937312e-13, 8.345330e-13, 8.291675e-13, 6.803750e-13, + -3.151692e-12, 1.975098e-12, -1.964634e-09, 1.060808e-12, + 5.123574e-12, 5.405112e-13, 4.460744e-12, 2.254359e-12, + 1.053220e-12, 4.224363e-12, 5.146482e-13, -5.005111e-14, + 6.731776e-12, -4.826085e-12, 1.779185e-12, 5.392274e-12, + 4.069803e-12, 5.218838e-13, -4.566578e-12, 9.349049e-13, + -2.780717e-12, 1.589945e-12, 1.805627e-12, -8.564009e-13, + -9.103265e-13, 1.747946e-12, 7.582737e-13, 1.880665e-12, + -1.509317e-12, -8.732831e-12, -1.582241e-14, -2.613867e-12, + 5.035911e-13, -2.209310e-12, -4.646361e-13, 1.926250e-12, + 1.114618e-12, 2.434626e-12, -8.526912e-13, -1.499753e-12, + -1.008729e-12, -2.222098e-12, 6.956137e-13, 2.119407e-13, + 1.250643e-12, -6.520809e-12, 2.357324e-13, -1.302915e-11, + -2.031004e-12, -7.972772e-13, 1.424409e-12, 4.138852e-12, + -1.058267e-12, -2.656184e-12, 5.452444e-13, 1.108587e-12, + 1.134814e-11, -9.126315e-12, 2.758479e-12, -1.439219e-12, + 3.073733e-12, 2.169448e-12, 3.600419e-15, -2.955518e-13, + -1.982464e-12, 2.164243e-12 +}; + +const double __exp_atable[ 355 ] /* __attribute__((mode(DF))) */ = { + 0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */ + 0.709106182438804188967, /* 0x0.b587fb96f75097ffb */ + 0.710492508843861281234, /* 0x0.b5e2d649899167ffd */ + 0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */ + 0.713273297897442870573, /* 0x0.b699142f945f87ffc */ + 0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */ + 0.716064970655995725059, /* 0x0.b75008aec758f8004 */ + 0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */ + 0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */ + 0.720272979947266023271, /* 0x0.b863cf5d10e380003 */ + 0.721681137825144314297, /* 0x0.b8c01855195c37ffb */ + 0.723092048691992950199, /* 0x0.b91c8f7d213740004 */ + 0.724505717938892290800, /* 0x0.b97934ec5002d0007 */ + 0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */ + 0.727341353138962865022, /* 0x0.ba330afcc29e98003 */ + 0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */ + 0.730188086709957051568, /* 0x0.baed9b40591ba0000 */ + 0.731615628948127705309, /* 0x0.bb4b296f931e30002 */ + 0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */ + 0.734479091556371366251, /* 0x0.bc06d25dd49568001 */ + 0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */ + 0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */ + 0.738795312814142124419, /* 0x0.bd21b08af98e78005 */ + 0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */ + 0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */ + 0.743136898669507939299, /* 0x0.be3e38443c84e0007 */ + 0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */ + 0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */ + 0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */ + 0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */ + 0.750429646104262104698, /* 0x0.c01c2843f776fffff */ + 0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */ + 0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */ + 0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */ + 0.756315338768691947122, /* 0x0.c19de1cd798578006 */ + 0.757793960659406629066, /* 0x0.c1fec8f623723fffd */ + 0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */ + 0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */ + 0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */ + 0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */ + 0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */ + 0.766726596071518051729, /* 0x0.c44831b719bf18002 */ + 0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */ + 0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */ + 0.771232322196981678892, /* 0x0.c56f7b41744490001 */ + 0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */ + 0.774250840160724651565, /* 0x0.c6354d95640dd0007 */ + 0.775764526565368872643, /* 0x0.c6988106fec447fff */ + 0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */ + 0.778800783068235302750, /* 0x0.c75f7cf560942fffc */ + 0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */ + 0.781848923151573727006, /* 0x0.c8274043594cb0002 */ + 0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */ + 0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */ + 0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */ + 0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */ + 0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */ + 0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */ + 0.792611669712891875319, /* 0x0.cae8992fd84667ffd */ + 0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */ + 0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */ + 0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */ + 0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */ + 0.800389937624300440456, /* 0x0.cce65ade24d360006 */ + 0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */ + 0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */ + 0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */ + 0.806667472122675088819, /* 0x0.ce81c26b838db8000 */ + 0.808244534127439906441, /* 0x0.cee91d213f8428002 */ + 0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */ + 0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */ + 0.812994243520784198882, /* 0x0.d0206407c20e20005 */ + 0.814583674571603966162, /* 0x0.d0888e4223facfff9 */ + 0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */ + 0.817771864936188586101, /* 0x0.d1597f377d6768002 */ + 0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */ + 0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */ + 0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */ + 0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */ + 0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */ + 0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */ + 0.829029118181348834154, /* 0x0.d43b40960546d8001 */ + 0.830649897953322891022, /* 0x0.d4a578c222a058000 */ + 0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */ + 0.833900969738858188772, /* 0x0.d57a88b1218e90002 */ + 0.835531274148056613016, /* 0x0.d5e560a94048f8006 */ + 0.837164765846411529371, /* 0x0.d6506e1aac8078003 */ + 0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */ + 0.840441336100884561780, /* 0x0.d72729d4c28518004 */ + 0.842084427144139224814, /* 0x0.d792d8530e12b0001 */ + 0.843730730487052604790, /* 0x0.d7febcb61273e7fff */ + 0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */ + 0.847032999194574087728, /* 0x0.d8d727962c69d7fff */ + 0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */ + 0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */ + 0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */ + 0.853676361342631029337, /* 0x0.da8a88b555baa0006 */ + 0.855345327311054837175, /* 0x0.daf7e94f965f98004 */ + 0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */ + 0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */ + 0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */ + 0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */ + 0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */ + 0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */ + 0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */ + 0.868815056264353846599, /* 0x0.de6aa9dced8448001 */ + 0.870513618890481399881, /* 0x0.ded9fb03db7320006 */ + 0.872215502247877139094, /* 0x0.df4983e1380657ff8 */ + 0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */ + 0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */ + 0.877341141814212965880, /* 0x0.e0996dd786fff0007 */ + 0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */ + 0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */ + 0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */ + 0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */ + 0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */ + 0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */ + 0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */ + 0.891157254447957902797, /* 0x0.e422e1bf727718006 */ + 0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */ + 0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */ + 0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */ + 0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */ + 0.899902594367530173098, /* 0x0.e660043464e378005 */ + 0.901661934163603406867, /* 0x0.e6d3510747e150006 */ + 0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */ + 0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */ + 0.906960617885092856864, /* 0x0.e82e92309390b0007 */ + 0.908733756358986566306, /* 0x0.e8a2c6845544afffa */ + 0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */ + 0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */ + 0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */ + 0.915861043547953501680, /* 0x0.ea75de8db8094fffe */ + 0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */ + 0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */ + 0.921243169397334638073, /* 0x0.ebd697a43995b0007 */ + 0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */ + 0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */ + 0.926656923710931002014, /* 0x0.ed39635df34e70006 */ + 0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */ + 0.930283756368834757725, /* 0x0.ee2713859aab57ffa */ + 0.932102492359406786818, /* 0x0.ee9e44d9342870004 */ + 0.933924784042873379360, /* 0x0.ef15b1d4635438005 */ + 0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */ + 0.937580062297704630580, /* 0x0.f0053f38f345cffff */ + 0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */ + 0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */ + 0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */ + 0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */ + 0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */ + 0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */ + 0.950486566729423554277, /* 0x0.f353166f63e3dffff */ + 0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */ + 0.954206665969085765512, /* 0x0.f446e357f66120000 */ + 0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */ + 0.957941325265908139014, /* 0x0.f53ba48781046fffb */ + 0.959814132734539637840, /* 0x0.f5b66106555d07ffa */ + 0.961690601603558903308, /* 0x0.f6315af2c2027fffc */ + 0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */ + 0.965454552202857141381, /* 0x0.f728078f7c5008002 */ + 0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */ + 0.969233234469444204768, /* 0x0.f81fab543e1897ffb */ + 0.971128118008140250896, /* 0x0.f89bda33122c78007 */ + 0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */ + 0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */ + 0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */ + 0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */ + 0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */ + 0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */ + 0.984496437054508843888, /* 0x0.fc07f5602d79afffc */ + 0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */ + 0.988349647107594098099, /* 0x0.fd047b83571b1fffa */ + 0.990281903873210800357, /* 0x0.fd831d66f4c018002 */ + 0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */ + 0.994157757657894713987, /* 0x0.fe811f703491e8006 */ + 0.996101369488558541238, /* 0x0.ff007fd5744490005 */ + 0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */ + 1.000000000000000000000, /* 0x1.00000000000000000 */ + 1.001955033605393285965, /* 0x1.0080200565d29ffff */ + 1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */ + 1.005876574715736104818, /* 0x1.01812090377240007 */ + 1.007843096764807100351, /* 0x1.020201541aad7fff6 */ + 1.009813464316352327214, /* 0x1.0283229c4c9820007 */ + 1.011787683565730677817, /* 0x1.030484836910a000e */ + 1.013765762469146736174, /* 0x1.0386272b9c077fffe */ + 1.015747708536026694351, /* 0x1.04080ab526304fff0 */ + 1.017733529475172815584, /* 0x1.048a2f412375ffff0 */ + 1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */ + 1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */ + 1.023714316605201180057, /* 0x1.06122436442e2000e */ + 1.025715712440059545995, /* 0x1.06954e0fec63afff2 */ + 1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */ + 1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */ + 1.031743407506447551857, /* 0x1.082056011a9230009 */ + 1.033760500517691527387, /* 0x1.08a487359ebd50002 */ + 1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */ + 1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */ + 1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */ + 1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */ + 1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */ + 1.045946142174331239262, /* 0x1.0bc3205a042060000 */ + 1.047991002016745332165, /* 0x1.0c4923682a086fffe */ + 1.050039859627715177527, /* 0x1.0ccf698898f3a000d */ + 1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */ + 1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */ + 1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */ + 1.058275424318780855142, /* 0x1.0eeb23619c146fffb */ + 1.060344388322010722446, /* 0x1.0f72bad65714bffff */ + 1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */ + 1.064494458915699715017, /* 0x1.1082b577d0eef0003 */ + 1.066575581342167566880, /* 0x1.110b18e893a90000a */ + 1.068660772440545025953, /* 0x1.1193c09c267610006 */ + 1.070750040138235936705, /* 0x1.121cacb4959befff6 */ + 1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */ + 1.074940837302467588937, /* 0x1.132f529d59552000b */ + 1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */ + 1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */ + 1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */ + 1.083371702785017154417, /* 0x1.1557d910df9c7000e */ + 1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */ + 1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */ + 1.089738217537583819804, /* 0x1.16f9157586772ffff */ + 1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */ + 1.094003332327482702577, /* 0x1.18109a360fc23fff2 */ + 1.096142145591650907149, /* 0x1.189cc58b155a70008 */ + 1.098285140311341168136, /* 0x1.1929370751ea50002 */ + 1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */ + 1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */ + 1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */ + 1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */ + 1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */ + 1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */ + 1.113403872669181282605, /* 0x1.1d0809445a97ffffc */ + 1.115580614653132185460, /* 0x1.1d96b0effc9db000e */ + 1.117761612217810673898, /* 0x1.1e25a001332190000 */ + 1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */ + 1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */ + 1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */ + 1.126528325196519908506, /* 0x1.2064290abc98c0001 */ + 1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */ + 1.130937432396844410880, /* 0x1.21851d95f776dfff0 */ + 1.133148453059692917203, /* 0x1.2216045b6784efffa */ + 1.135363796355857157764, /* 0x1.22a733a6692ae0004 */ + 1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */ + 1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */ + 1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */ + 1.144268564977221958089, /* 0x1.24eec8e06b035000c */ + 1.146505648458203463465, /* 0x1.258164e8cea85fff8 */ + 1.148747105501412235671, /* 0x1.26144a5180d380009 */ + 1.150992944689175123667, /* 0x1.26a7793f5de2efffa */ + 1.153243174560058870217, /* 0x1.273af1d712179000d */ + 1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */ + 1.157756840726344771440, /* 0x1.2862c097a3d29000c */ + 1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */ + 1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */ + 1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */ + 1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */ + 1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */ + 1.171404112007080167155, /* 0x1.2be123cf786790002 */ + 1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */ + 1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */ + 1.178287955789017793514, /* 0x1.2da4478b627040002 */ + 1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */ + 1.182899644456603782686, /* 0x1.2ed282d76421d0004 */ + 1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */ + 1.187529382762033236513, /* 0x1.3001ecf60082ffffa */ + 1.189851042595508889847, /* 0x1.309a13f30f28a0004 */ + 1.192177241354644978669, /* 0x1.31328716a758cfff7 */ + 1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */ + 1.196843291137896336843, /* 0x1.32645269dfd04000a */ + 1.199183159977805113226, /* 0x1.32fdaae604c39000f */ + 1.201527603343041317132, /* 0x1.339750219980dfff3 */ + 1.203876630171082595692, /* 0x1.3431424300e480007 */ + 1.206230249419600664189, /* 0x1.34cb8170b3fee000e */ + 1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */ + 1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */ + 1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */ + 1.215690830512196507537, /* 0x1.373783a718d29000f */ + 1.218067546930756250870, /* 0x1.37d3465662f480007 */ + 1.220448909901335365929, /* 0x1.386f56fa770fe0008 */ + 1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */ + 1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */ + 1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */ + 1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */ + 1.232425741726685064472, /* 0x1.3b8040df76f39fffa */ + 1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */ + 1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */ + 1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */ + 1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */ + 1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */ + 1.246953186383919165383, /* 0x1.3f3852f32973efff0 */ + 1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */ + 1.251833623164381181797, /* 0x1.40782b17863250005 */ + 1.254280999953110153911, /* 0x1.41188f42caf400000 */ + 1.256733161434815393410, /* 0x1.41b943b42945bfffd */ + 1.259190116985283935980, /* 0x1.425a4893e5f10000a */ + 1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */ + 1.264118447754797758244, /* 0x1.439d443f608c4fff9 */ + 1.266589841787181258708, /* 0x1.443f3b5bebf850008 */ + 1.269066067469190262045, /* 0x1.44e183883e561fff7 */ + 1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */ + 1.274033051628237434048, /* 0x1.462707b2c43020009 */ + 1.276523829025464573684, /* 0x1.46ca44023aa410007 */ + 1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */ + 1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */ + 1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */ + 1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */ + 1.289050950070396384145, /* 0x1.49ff3e396e19d000b */ + 1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */ + 1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */ + 1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */ + 1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */ + 1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */ + 1.304245874766450485904, /* 0x1.4de30ec21097d0003 */ + 1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */ + 1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */ + 1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */ + 1.314475201942565174546, /* 0x1.50817263bf0e5fffb */ + 1.317045045107389400535, /* 0x1.5129dd3418575000e */ + 1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */ + 1.322199813675649204855, /* 0x1.527bafde83a310009 */ + 1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */ + 1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */ + 1.329969819671041886272, /* 0x1.5478e6f02775e0001 */ + 1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */ + 1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */ + 1.337785486688218616860, /* 0x1.56791c1263abefff7 */ + 1.340400902247843806217, /* 0x1.57248376aef21fffa */ + 1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */ + 1.345647083048053138662, /* 0x1.587c53c5a630f0002 */ + 1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */ + 1.350913796821875845231, /* 0x1.59d57c9110ad60006 */ + 1.353554878672557082439, /* 0x1.5a8292913d68cfffc */ + 1.356201123929036356254, /* 0x1.5b2fff3212db00007 */ + 1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */ + 1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */ + 1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */ + 1.366837941171020309735, /* 0x1.5de9176042f1effff */ + 1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */ + 1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */ + 1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */ + 1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */ + 1.380251356531521533853, /* 0x1.6158272490016000c */ + 1.382949794301995272203, /* 0x1.6208ff6a8978a000f */ + 1.385653507605306700170, /* 0x1.62ba3032c0a280004 */ + 1.388362506772382154503, /* 0x1.636bb9a994784000f */ + 1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */ + 1.393796403973427855412, /* 0x1.64cfd7545928b0002 */ + 1.396521322756352656542, /* 0x1.65826be167badfff8 */ + 1.399251568859207761660, /* 0x1.663559cf20826000c */ + 1.401987152677323100733, /* 0x1.66e8a14a29486fffc */ + 1.404728084651919228815, /* 0x1.679c427f5a4b6000b */ + 1.407474375243217723560, /* 0x1.68503d9ba0add000f */ + 1.410226034922914983815, /* 0x1.690492cbf6303fff9 */ + 1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */ +}; + +const volatile float TWOM100 = 7.88860905e-31; +const volatile float TWO127 = 1.7014118346e+38; + + +unsigned long _randseed = 1; + +void srandom( unsigned long seed ) +{ + _randseed = seed; +} + +unsigned long random( void ) +{ + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = _randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if ( t <= 0 ) + t += 0x7fffffff; + _randseed = t; + return ( t ); +} + + +/* s_ceilf.c -- float version of s_ceil.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_ceilf.c,v 1.4 1995/05/10 20:46:55 jtc Exp $"; +#endif + +#ifdef __STDC__ +float __ceilf( float x ) +#else +float __ceilf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0 ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 < 0 ) + i0 = 0x80000000; + else + if ( i0 != 0 ) + i0 = 0x3f800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0 ) { /* raise inexact flag */ + if ( i0 > 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread4/math_private.h b/targets/wasm-tacle/parallel/rosace/thread4/math_private.h new file mode 100644 index 0000000..47f9137 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = ( d ); \ + ( i ) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD( d, i ) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = ( i ); \ + ( d ) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/parallel/rosace/thread4/multirate_precedence.h b/targets/wasm-tacle/parallel/rosace/thread4/multirate_precedence.h new file mode 100644 index 0000000..f1e7071 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/multirate_precedence.h @@ -0,0 +1,65 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: multirate_precedence.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: multirate_precedence.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _multirate_precedence_H +#define _multirate_precedence_H +#include +// Description of a precedence between two tasks of different rates + +struct job_prec { + int src_job; + int dst_job; +}; + +struct multirate_precedence { + char *src_name; + char *dst_name; + int prec_pref_size; + int prec_pat_size; + struct job_prec *prec_pref; + struct job_prec *prec_pat; +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/nonencoded_task_params.h b/targets/wasm-tacle/parallel/rosace/thread4/nonencoded_task_params.h new file mode 100644 index 0000000..fa67d94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/nonencoded_task_params.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: nonencoded_task_params.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: nonencoded_task_params.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _nonencoded_task_params_H +#define _nonencoded_task_params_H +#define NULL ((void*)0) +// Description of a real time task, without precedence encoding. + +struct nonencoded_task_params { + char *ne_t_name; + int ne_t_period; + int ne_t_initial_release; + int ne_t_wcet; + int ne_t_deadline; + int ( *ne_t_body )( void * ); // This is the code to execute at each + // instance of the task. +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/ros_th4.c b/targets/wasm-tacle/parallel/rosace/thread4/ros_th4.c new file mode 100644 index 0000000..b74762b --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/ros_th4.c @@ -0,0 +1,133 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: ros_th4 + + Author: Dustin Green and others + + Function: executes the forth thread of original threads.c + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/c_posix_implementation/ + + Original name: threads, rosace + + Changes: union of rosace.c and threads.c + + License: see above + +*/ + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" +#include "common.h" + + +// Return variable +int ros_th4_check; + + +/* + Forward declaration of functions +*/ + +void* ros_th4_thread4( void* arg ); +int ros_th4_run_rosace( uint64_t nbstep ); +int main( void ); +void ros_th4_init( void ); +void ros_th4_main( void ); +int ros_th4_return( void ); + + +/* + Initialization function +*/ + +void ros_th4_init( void ) +{ + ros_th4_check = -1; + rosace_init(); +} + + +/* + Return function +*/ + +int ros_th4_return( void ) +{ + return ros_th4_check; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) ros_th4_main( void ) +{ + uint64_t tsimu = 300*200; + ros_th4_check = ros_th4_run_rosace( tsimu ); +} + + +int ros_th4_run_rosace( uint64_t nbstep ){ + max_step_simu = nbstep; + // Set first command + ROSACE_update_altitude_command( 11000.0 ); + + // Exit + ros_th4_thread4( NULL ); + return 0; +} + + +void* ros_th4_thread4( void* arg ) { + uint64_t mystep_simu = step_simu; + + _Pragma( "loopbound min 60000 max 60000" ) + while( mystep_simu < max_step_simu ) { + // --- 100 Hz --- + if( mystep_simu % 2 == 0 ) { + CALL( VA_FILTER ); + } + // --- End 100 Hz --- + mystep_simu++; + } + return NULL; +} + + +int main( void ) +{ + ros_th4_init(); + + ros_th4_main(); + + return ros_th4_return(); +} + diff --git a/targets/wasm-tacle/parallel/rosace/thread4/types.h b/targets/wasm-tacle/parallel/rosace/thread4/types.h new file mode 100644 index 0000000..0d7902f --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/types.h @@ -0,0 +1,73 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: types.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: types.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_TYPES_H +#define __DEF_ROSACE_TYPES_H + +#ifdef USE_FLOAT +#define REAL_TYPE float +#else +#define REAL_TYPE double +#endif + +typedef unsigned long long uint64_t; + +/* we need forward declaration only in order + * to avoid redefinition in assemblage_vX generated headers + * Real "#include "assemblage.h" is only done in assemblage_includes.c + */ +struct aircraft_dynamics_outs_t { + REAL_TYPE Va; + REAL_TYPE Vz; + REAL_TYPE q; + REAL_TYPE az; + REAL_TYPE h; +}; + +typedef enum SAMPLE_RANK { + SPL_T, SPL_VA,SPL_AZ,SPL_Q,SPL_VZ,SPL_H, + SPL_DELTA_TH_C, SPL_DELTA_E_C, + SPL_SIZE +} SampleRank_t; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread4/wcclibm.h b/targets/wasm-tacle/parallel/rosace/thread4/wcclibm.h new file mode 100644 index 0000000..ac30a94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread4/wcclibm.h @@ -0,0 +1,85 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, + basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, + basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +float __atanf(float x); +float __ceilf(float x); +static float __copysignf(float x, float y); +float __cosf(float x); +float __erff(float x); +float __fabsf(float x); +float __floorf(float x); +float __ieee754_acosf(float x); +float __ieee754_expf(float x); +float __ieee754_logf(float x); +float __ieee754_log10f(float x); +float __ieee754_powf(float x, float y); +static int32_t __ieee754_rem_pio2f(float x, float *y); +float __ieee754_sqrtf(float x); +int __isinff(float x); +static float __kernel_cosf(float x, float y); +static float __kernel_sinf(float x, float y, int iy); +static int __kernel_rem_pio2f(float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2); +float __sinf(float x); +float __scalbnf(float x, int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/parallel/rosace/thread5/assemblage.c b/targets/wasm-tacle/parallel/rosace/thread5/assemblage.c new file mode 100644 index 0000000..478ec4e --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/assemblage.c @@ -0,0 +1,547 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage.c + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#include "assemblage.h" +#include "assemblage_includes.h" + +// Definition of true and false here instead of using stdbool.h +#define true 1 +#define false 0 + + +double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +double Vz_control_50483_delta_e_c_elevator489_delta_e_c; +double Va_filter_100449_Va_f_Va_control_50474_Va_f[ 2 ]; +double Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ 2 ]; +double q_filter_100455_q_f_Va_control_50474_q_f[ 2 ]; +double Va_c_Va_control_50474_Va_c; +double h_filter_100446_h_f_altitude_hold_50464_h_f[ 2 ]; +double h_c_altitude_hold_50464_h_c; +double Va_control_50474_delta_th_c_delta_th_c; +double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +double elevator489_delta_e_aircraft_dynamics495_delta_e[ 3 ] = {0.0120096156525, 0.0120096156525, 0.0120096156525}; +double engine486_T_aircraft_dynamics495_T[ 3 ] = {41813.9211946, 41813.9211946, 41813.9211946}; +double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +double Va_control_50474_delta_th_c_engine486_delta_th_c; +double Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ 2 ]; +double altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c; +double q_filter_100455_q_f_Vz_control_50483_q_f[ 2 ]; +double az_filter_100458_az_f_Vz_control_50483_az_f[ 2 ]; +double Vz_control_50483_delta_e_c_delta_e_c; + +int Va_filter_100449_fun( void *args ) +{ + double Va_f; + static int Va_rcell = 0; + const struct write_proto_t Va_f_Va_control_50474_Va_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Va_f_Va_control_50474_Va_f_wcell = 0; + static int instance = 0; + + Va_f = Va_filter_100( aircraft_dynamics495_Va_Va_filter_100449_Va[ Va_rcell ] ); + Va_rcell = ( Va_rcell + 1 ) % 2; + if ( must_write( Va_f_Va_control_50474_Va_f_write, instance ) ) { + Va_filter_100449_Va_f_Va_control_50474_Va_f[ Va_f_Va_control_50474_Va_f_wcell ] = + Va_f; + Va_f_Va_control_50474_Va_f_wcell = ( Va_f_Va_control_50474_Va_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int elevator489_fun( void *args ) +{ + double delta_e; + static int delta_e_aircraft_dynamics495_delta_e_wcell = 1; + static int instance = 0; + + delta_e = elevator( Vz_control_50483_delta_e_c_elevator489_delta_e_c ); + elevator489_delta_e_aircraft_dynamics495_delta_e[ delta_e_aircraft_dynamics495_delta_e_wcell ] + = delta_e; + delta_e_aircraft_dynamics495_delta_e_wcell = + ( delta_e_aircraft_dynamics495_delta_e_wcell + 1 ) % 3; + instance++; + + return 0; +} + +int Va_control_50474_fun( void *args ) +{ + double delta_th_c; + static int Va_f_rcell = 0; + static int Vz_f_rcell = 0; + static int q_f_rcell = 0; + static int instance = 0; + + delta_th_c = Va_control_50( + Va_filter_100449_Va_f_Va_control_50474_Va_f[ Va_f_rcell ], + Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ Vz_f_rcell ], + q_filter_100455_q_f_Va_control_50474_q_f[ q_f_rcell ], + Va_c_Va_control_50474_Va_c ); + Va_f_rcell = ( Va_f_rcell + 1 ) % 2; + Vz_f_rcell = ( Vz_f_rcell + 1 ) % 2; + q_f_rcell = ( q_f_rcell + 1 ) % 2; + Va_control_50474_delta_th_c_engine486_delta_th_c = delta_th_c; + Va_control_50474_delta_th_c_delta_th_c = delta_th_c; + instance++; + + return 0; +} + +int Va_c0_fun( void *args ) +{ + double Va_c; + static int instance = 0; + + Va_c = input_Va_c(); + Va_c_Va_control_50474_Va_c = Va_c; + instance++; + + return 0; +} + +int altitude_hold_50464_fun( void *args ) +{ + double Vz_c; + static int h_f_rcell = 0; + static int instance = 0; + + Vz_c = altitude_hold_50( h_filter_100446_h_f_altitude_hold_50464_h_f[ h_f_rcell ], + h_c_altitude_hold_50464_h_c ); + h_f_rcell = ( h_f_rcell + 1 ) % 2; + altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c = Vz_c; + instance++; + + return 0; +} + +int delta_th_c0_fun( void *args ) +{ + static int instance = 0; + + output_delta_th_c( Va_control_50474_delta_th_c_delta_th_c ); + instance++; + + return 0; +} + +int az_filter_100458_fun( void *args ) +{ + double az_f; + static int az_rcell = 0; + const struct write_proto_t az_f_Vz_control_50483_az_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int az_f_Vz_control_50483_az_f_wcell = 0; + static int instance = 0; + + az_f = az_filter_100( aircraft_dynamics495_az_az_filter_100458_az[ az_rcell ] ); + az_rcell = ( az_rcell + 1 ) % 2; + if ( must_write( az_f_Vz_control_50483_az_f_write, instance ) ) { + az_filter_100458_az_f_Vz_control_50483_az_f[ az_f_Vz_control_50483_az_f_wcell ] = + az_f; + az_f_Vz_control_50483_az_f_wcell = ( az_f_Vz_control_50483_az_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int Vz_filter_100452_fun( void *args ) +{ + double Vz_f; + static int Vz_rcell = 0; + const struct write_proto_t Vz_f_Va_control_50474_Vz_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_f_Va_control_50474_Vz_f_wcell = 0; + const struct write_proto_t Vz_f_Vz_control_50483_Vz_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_f_Vz_control_50483_Vz_f_wcell = 0; + static int instance = 0; + + Vz_f = Vz_filter_100( aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ Vz_rcell ] ); + Vz_rcell = ( Vz_rcell + 1 ) % 2; + if ( must_write( Vz_f_Va_control_50474_Vz_f_write, instance ) ) { + Vz_filter_100452_Vz_f_Va_control_50474_Vz_f[ Vz_f_Va_control_50474_Vz_f_wcell ] = + Vz_f; + Vz_f_Va_control_50474_Vz_f_wcell = ( Vz_f_Va_control_50474_Vz_f_wcell + 1 ) % 2; + } + if ( must_write( Vz_f_Vz_control_50483_Vz_f_write, instance ) ) { + Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ Vz_f_Vz_control_50483_Vz_f_wcell ] = + Vz_f; + Vz_f_Vz_control_50483_Vz_f_wcell = ( Vz_f_Vz_control_50483_Vz_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int q_filter_100455_fun( void *args ) +{ + double q_f; + static int q_rcell = 0; + const struct write_proto_t q_f_Va_control_50474_q_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_f_Va_control_50474_q_f_wcell = 0; + const struct write_proto_t q_f_Vz_control_50483_q_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_f_Vz_control_50483_q_f_wcell = 0; + static int instance = 0; + + q_f = q_filter_100( aircraft_dynamics495_q_q_filter_100455_q[ q_rcell ] ); + q_rcell = ( q_rcell + 1 ) % 2; + if ( must_write( q_f_Va_control_50474_q_f_write, instance ) ) { + q_filter_100455_q_f_Va_control_50474_q_f[ q_f_Va_control_50474_q_f_wcell ] = q_f; + q_f_Va_control_50474_q_f_wcell = ( q_f_Va_control_50474_q_f_wcell + 1 ) % 2; + } + if ( must_write( q_f_Vz_control_50483_q_f_write, instance ) ) { + q_filter_100455_q_f_Vz_control_50483_q_f[ q_f_Vz_control_50483_q_f_wcell ] = q_f; + q_f_Vz_control_50483_q_f_wcell = ( q_f_Vz_control_50483_q_f_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int aircraft_dynamics495_fun( void *args ) +{ + struct aircraft_dynamics_outs_t aircraft_dynamics495_fun_outs; + static int delta_e_rcell = 0; + static int T_rcell = 0; + const struct write_proto_t Va_Va_filter_100449_Va_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Va_Va_filter_100449_Va_wcell = 0; + const struct write_proto_t Vz_Vz_filter_100452_Vz_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int Vz_Vz_filter_100452_Vz_wcell = 0; + const struct write_proto_t q_q_filter_100455_q_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int q_q_filter_100455_q_wcell = 0; + const struct write_proto_t az_az_filter_100458_az_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int az_az_filter_100458_az_wcell = 0; + const struct write_proto_t h_h_filter_100446_h_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int h_h_filter_100446_h_wcell = 0; + static int instance = 0; + + aircraft_dynamics( + elevator489_delta_e_aircraft_dynamics495_delta_e[ delta_e_rcell ], + engine486_T_aircraft_dynamics495_T[ T_rcell ], &aircraft_dynamics495_fun_outs ); + delta_e_rcell = ( delta_e_rcell + 1 ) % 3; + T_rcell = ( T_rcell + 1 ) % 3; + if ( must_write( Va_Va_filter_100449_Va_write, instance ) ) { + aircraft_dynamics495_Va_Va_filter_100449_Va[ Va_Va_filter_100449_Va_wcell ] = + aircraft_dynamics495_fun_outs.Va; + Va_Va_filter_100449_Va_wcell = ( Va_Va_filter_100449_Va_wcell + 1 ) % 2; + } + if ( must_write( Vz_Vz_filter_100452_Vz_write, instance ) ) { + aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ Vz_Vz_filter_100452_Vz_wcell ] = + aircraft_dynamics495_fun_outs.Vz; + Vz_Vz_filter_100452_Vz_wcell = ( Vz_Vz_filter_100452_Vz_wcell + 1 ) % 2; + } + if ( must_write( q_q_filter_100455_q_write, instance ) ) { + aircraft_dynamics495_q_q_filter_100455_q[ q_q_filter_100455_q_wcell ] = + aircraft_dynamics495_fun_outs.q; + q_q_filter_100455_q_wcell = ( q_q_filter_100455_q_wcell + 1 ) % 2; + } + if ( must_write( az_az_filter_100458_az_write, instance ) ) { + aircraft_dynamics495_az_az_filter_100458_az[ az_az_filter_100458_az_wcell ] = + aircraft_dynamics495_fun_outs.az; + az_az_filter_100458_az_wcell = ( az_az_filter_100458_az_wcell + 1 ) % 2; + } + if ( must_write( h_h_filter_100446_h_write, instance ) ) { + aircraft_dynamics495_h_h_filter_100446_h[ h_h_filter_100446_h_wcell ] = + aircraft_dynamics495_fun_outs.h; + h_h_filter_100446_h_wcell = ( h_h_filter_100446_h_wcell + 1 ) % 2; + } + instance++; + + return 0; +} + +int h_filter_100446_fun( void *args ) +{ + double h_f; + static int h_rcell = 0; + const struct write_proto_t h_f_altitude_hold_50464_h_f_write = + { NULL, 0, ( int [] ){ true, false }, 2 }; + static int h_f_altitude_hold_50464_h_f_wcell = 0; + static int instance = 0; + + h_f = h_filter_100( aircraft_dynamics495_h_h_filter_100446_h[ h_rcell ] ); + h_rcell = ( h_rcell + 1 ) % 2; + if ( must_write( h_f_altitude_hold_50464_h_f_write, instance ) ) { + h_filter_100446_h_f_altitude_hold_50464_h_f[ h_f_altitude_hold_50464_h_f_wcell ] = + h_f; + h_f_altitude_hold_50464_h_f_wcell = ( h_f_altitude_hold_50464_h_f_wcell + 1 ) % + 2; + } + instance++; + + return 0; +} + +int engine486_fun( void *args ) +{ + double T; + static int T_aircraft_dynamics495_T_wcell = 1; + static int instance = 0; + + T = engine( Va_control_50474_delta_th_c_engine486_delta_th_c ); + engine486_T_aircraft_dynamics495_T[ T_aircraft_dynamics495_T_wcell ] = T; + T_aircraft_dynamics495_T_wcell = ( T_aircraft_dynamics495_T_wcell + 1 ) % 3; + instance++; + + return 0; +} + +int Vz_control_50483_fun( void *args ) +{ + double delta_e_c; + static int Vz_f_rcell = 0; + static int q_f_rcell = 0; + static int az_f_rcell = 0; + static int instance = 0; + + delta_e_c = Vz_control_50( + Vz_filter_100452_Vz_f_Vz_control_50483_Vz_f[ Vz_f_rcell ], + altitude_hold_50464_Vz_c_Vz_control_50483_Vz_c, + q_filter_100455_q_f_Vz_control_50483_q_f[ q_f_rcell ], + az_filter_100458_az_f_Vz_control_50483_az_f[ az_f_rcell ] ); + Vz_f_rcell = ( Vz_f_rcell + 1 ) % 2; + q_f_rcell = ( q_f_rcell + 1 ) % 2; + az_f_rcell = ( az_f_rcell + 1 ) % 2; + Vz_control_50483_delta_e_c_delta_e_c = delta_e_c; + Vz_control_50483_delta_e_c_elevator489_delta_e_c = delta_e_c; + instance++; + + return 0; +} + +int delta_e_c0_fun( void *args ) +{ + static int instance = 0; + + output_delta_e_c( Vz_control_50483_delta_e_c_delta_e_c ); + instance++; + + return 0; +} + +int h_c0_fun( void *args ) +{ + double h_c; + static int instance = 0; + + h_c = input_h_c(); + h_c_altitude_hold_50464_h_c = h_c; + instance++; + + return 0; +} + +#define PLUD_TASK_NUMBER 15 +static struct nonencoded_task_params static_task_set[ PLUD_TASK_NUMBER ] = { + { "h_c0", 1000, 0, 1, 1000, h_c0_fun }, + { "delta_e_c0", 200, 0, 1, 200, delta_e_c0_fun }, + { "Vz_control_50483", 200, 0, 1, 200, Vz_control_50483_fun }, + { "engine486", 50, 0, 1, 50, engine486_fun }, + { "h_filter_100446", 100, 0, 1, 100, h_filter_100446_fun }, + { "aircraft_dynamics495", 50, 0, 1, 50, aircraft_dynamics495_fun }, + { "q_filter_100455", 100, 0, 1, 100, q_filter_100455_fun }, + { "Vz_filter_100452", 100, 0, 1, 100, Vz_filter_100452_fun }, + { "az_filter_100458", 100, 0, 1, 100, az_filter_100458_fun }, + { "delta_th_c0", 200, 0, 1, 200, delta_th_c0_fun }, + { "altitude_hold_50464", 200, 0, 1, 200, altitude_hold_50464_fun }, + { "Va_c0", 1000, 0, 1, 1000, Va_c0_fun }, + { "Va_control_50474", 200, 0, 1, 200, Va_control_50474_fun }, + { "elevator489", 50, 0, 1, 50, elevator489_fun }, + { "Va_filter_100449", 100, 0, 1, 100, Va_filter_100449_fun } +}; + + + +void get_task_set ( int *task_number, struct nonencoded_task_params **task_set ) +{ + *task_number = PLUD_TASK_NUMBER; + *task_set = static_task_set; +} + +static struct job_prec engine486_aircraft_dynamics495_pcpat[ 1 ] = { {0, 1} }; +static struct job_prec Va_filter_100449_Va_control_50474_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec q_filter_100455_Va_control_50474_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec q_filter_100455_Vz_control_50483_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec aircraft_dynamics495_q_filter_100455_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Va_c0_Va_control_50474_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_control_50483_delta_e_c0_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_control_50483_elevator489_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Vz_filter_100452_Va_control_50474_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Vz_filter_100452_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec h_filter_100446_altitude_hold_50464_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_az_filter_100458_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec elevator489_aircraft_dynamics495_pcpat[ 1 ] = { {0, 1} }; +static struct job_prec aircraft_dynamics495_Vz_filter_100452_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec az_filter_100458_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec h_c0_altitude_hold_50464_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec altitude_hold_50464_Vz_control_50483_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_Va_filter_100449_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec aircraft_dynamics495_h_filter_100446_pcpat[ 1 ] = { + {0, 0} +}; +static struct job_prec Va_control_50474_engine486_pcpat[ 1 ] = { {0, 0} }; +static struct job_prec Va_control_50474_delta_th_c0_pcpat[ 1 ] = { {0, 0} }; + +#define PLUD_PREC_NUMBER 21 +static struct multirate_precedence static_prec_set[ PLUD_PREC_NUMBER ] = { + { + "engine486", "aircraft_dynamics495", 0, 1, NULL, + engine486_aircraft_dynamics495_pcpat + }, + { + "Va_filter_100449", "Va_control_50474", 0, 1, NULL, + Va_filter_100449_Va_control_50474_pcpat + }, + { + "q_filter_100455", "Va_control_50474", 0, 1, NULL, + q_filter_100455_Va_control_50474_pcpat + }, + { + "q_filter_100455", "Vz_control_50483", 0, 1, NULL, + q_filter_100455_Vz_control_50483_pcpat + }, + { + "aircraft_dynamics495", "q_filter_100455", 0, 1, NULL, + aircraft_dynamics495_q_filter_100455_pcpat + }, + { "Va_c0", "Va_control_50474", 0, 1, NULL, Va_c0_Va_control_50474_pcpat }, + { + "Vz_control_50483", "delta_e_c0", 0, 1, NULL, + Vz_control_50483_delta_e_c0_pcpat + }, + { + "Vz_control_50483", "elevator489", 0, 1, NULL, + Vz_control_50483_elevator489_pcpat + }, + { + "Vz_filter_100452", "Va_control_50474", 0, 1, NULL, + Vz_filter_100452_Va_control_50474_pcpat + }, + { + "Vz_filter_100452", "Vz_control_50483", 0, 1, NULL, + Vz_filter_100452_Vz_control_50483_pcpat + }, + { + "h_filter_100446", "altitude_hold_50464", 0, 1, NULL, + h_filter_100446_altitude_hold_50464_pcpat + }, + { + "aircraft_dynamics495", "az_filter_100458", 0, 1, NULL, + aircraft_dynamics495_az_filter_100458_pcpat + }, + { + "elevator489", "aircraft_dynamics495", 0, 1, NULL, + elevator489_aircraft_dynamics495_pcpat + }, + { + "aircraft_dynamics495", "Vz_filter_100452", 0, 1, NULL, + aircraft_dynamics495_Vz_filter_100452_pcpat + }, + { + "az_filter_100458", "Vz_control_50483", 0, 1, NULL, + az_filter_100458_Vz_control_50483_pcpat + }, + { + "h_c0", "altitude_hold_50464", 0, 1, NULL, h_c0_altitude_hold_50464_pcpat + }, + { + "altitude_hold_50464", "Vz_control_50483", 0, 1, NULL, + altitude_hold_50464_Vz_control_50483_pcpat + }, + { + "aircraft_dynamics495", "Va_filter_100449", 0, 1, NULL, + aircraft_dynamics495_Va_filter_100449_pcpat + }, + { + "aircraft_dynamics495", "h_filter_100446", 0, 1, NULL, + aircraft_dynamics495_h_filter_100446_pcpat + }, + { + "Va_control_50474", "engine486", 0, 1, NULL, + Va_control_50474_engine486_pcpat + }, + { + "Va_control_50474", "delta_th_c0", 0, 1, NULL, + Va_control_50474_delta_th_c0_pcpat + } +}; + +void get_precedence_set ( int *prec_number, + struct multirate_precedence **prec_set ) +{ + *prec_number = PLUD_PREC_NUMBER; + *prec_set = static_prec_set; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread5/assemblage.h b/targets/wasm-tacle/parallel/rosace/thread5/assemblage.h new file mode 100644 index 0000000..0ebd5b0 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/assemblage.h @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _assemblage_H +#define _assemblage_H +#include "nonencoded_task_params.h" +#include "multirate_precedence.h" +#include "com_patterns.h" +#include "types.h" + +void get_task_set( int *task_number, struct nonencoded_task_params **task_set ); + +void get_precedence_set( int *prec_number, + struct multirate_precedence **presc ); + + +#define H_C0 0 +#define DELTA_E_C0 1 +#define VZ_CONTROL 2 +#define ENGINE 3 +#define H_FILTER 4 +#define AIRCRAFT_DYN 5 +#define Q_FILTER 6 +#define VZ_FILTER 7 +#define AZ_FILTER 8 +#define DELTA_TH_C0 9 +#define ALTI_HOLD 10 +#define VA_C0 11 +#define VA_CONTROL 12 +#define ELEVATOR 13 +#define VA_FILTER 14 + + + + + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.c b/targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.c new file mode 100644 index 0000000..4f4c2a6 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.c @@ -0,0 +1,1211 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.c + + Author: unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.c + + Changes: no major functional changes + + License: see above + +*/ + +#include "wcclibm.h" +#include "assemblage_includes.h" + +#define MATH_COS cosf +#define MATH_SIN sinf +#define pow powf +#define atan atanf +#define sin sinf +#define sqrt sqrtf + +/* + The following include file is generated by the Prelude compiler + Theoretically we should include main node specific include + i.e. assemblage_vX.h but we know that every main node + assemblage, assemblage_v2, assemblage_v3, etc... share the + very same data type. +*/ + +/* Period/Frequency of the nodes */ +const REAL_TYPE dt = 1.0f / 200.0; +const REAL_TYPE dt_de = 1.0 / 200.0; +const REAL_TYPE dt_dx = 1.0 / 200.0; + +/* Controller parameters */ +/* Altitude hold */ +const REAL_TYPE Kp_h = 0.1014048; +const REAL_TYPE Ki_h = 0.0048288; +const REAL_TYPE h_switch = 50.0; + +// Setpoint commands +REAL_TYPE Vz_c = -2.5; +REAL_TYPE Va_c = 0.0; +REAL_TYPE h_c = 10000; + +/* Va Speed controller */ +const REAL_TYPE K1_intVa = 0.049802610664357; +const REAL_TYPE K1_Va = -0.486813084356079; +const REAL_TYPE K1_Vz = -0.077603095495388; +const REAL_TYPE K1_q = 21.692383376322041; + +/* Vz Speed controller */ +const REAL_TYPE K2_intVz = 0.000627342822264; +const REAL_TYPE K2_Vz = -0.003252836726554; +const REAL_TYPE K2_q = 0.376071446897134; +const REAL_TYPE K2_az = -0.001566907423747; + +/* Trimming parameters */ +const REAL_TYPE h_eq = 10000.0; +const REAL_TYPE Va_eq = 230.0; +const REAL_TYPE Vz_eq = 0.0; +const REAL_TYPE alpha_eq = 0.026485847681737; +const REAL_TYPE theta_eq = 0.026485847681737; + +/* Atmosphere parameters */ +const REAL_TYPE rho0 = 1.225; +const REAL_TYPE g0 = 9.80665; +const REAL_TYPE T0_0 = 288.15; +const REAL_TYPE T0_h = -0.0065; +const REAL_TYPE Rs = 287.05; + +/* Aircraft parameters */ +const REAL_TYPE masse = 57837.5; +const REAL_TYPE I_y = 3781272.0; +const REAL_TYPE S = 122.6; +const REAL_TYPE cbar = 4.29; +const REAL_TYPE CD_0 = 0.016; +const REAL_TYPE CD_alpha = 2.5; +const REAL_TYPE CD_deltae = 0.05; +const REAL_TYPE CL_alpha = 5.5; +const REAL_TYPE CL_deltae = 0.193; +const REAL_TYPE alpha_0 = -0.05; +const REAL_TYPE Cm_0 = 0.04; +const REAL_TYPE Cm_alpha = -0.83; +const REAL_TYPE Cm_deltae = -1.5; +const REAL_TYPE Cm_q = -30; + + +#define FMTFLOAT "%5.15f" + + +/* Va filter 100 Hz */ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.956543675476034; + static REAL_TYPE a1 = -1.955578398054313; + static REAL_TYPE b0 = 0.000479064865372430; + static REAL_TYPE b1 = 0.000486212556348925; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 100 Hz */ + + +/* Va filter 50 Hz */ +REAL_TYPE +Va_filter_50( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.914975803093201; + static REAL_TYPE a1 = -1.911199519984605; + static REAL_TYPE b0 = 0.001860178914816; + static REAL_TYPE b1 = 0.001916104193780; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 50 Hz */ + + +/* Va filter 33 Hz */ +REAL_TYPE +Va_filter_33( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.874036784828483; + static REAL_TYPE a1 = -1.865563793814790; + static REAL_TYPE b0 = 0.004141433623051; + static REAL_TYPE b1 = 0.004331557390642; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 33 Hz */ + + +/* Va filter 25 Hz */ +REAL_TYPE +Va_filter_25( REAL_TYPE Va ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.837180720246048; + static REAL_TYPE a1 = -1.822731999002980; + static REAL_TYPE b0 = 0.007010380719078; + static REAL_TYPE b1 = 0.007438340523990; + + if ( debut ) { + debut = 0; + x1 = Va_eq * ( 1.0 + a1 - b1 ); + x2 = Va_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Va; + x2_tmp = x1 - a1 * x2 + b1 * Va; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Va filter 25 Hz */ + + +/* Vz filter 100 Hz */ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.956543675476034; + static REAL_TYPE a1 = -1.955578398054313; + static REAL_TYPE b0 = 0.000479064865372430; + static REAL_TYPE b1 = 0.000486212556348925; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 100 Hz */ + + +/* Vz filter 50 Hz */ +REAL_TYPE +Vz_filter_50( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0, x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.914975803093201; + static REAL_TYPE a1 = -1.911199519984605; + static REAL_TYPE b0 = 0.001860178914816; + static REAL_TYPE b1 = 0.001916104193780; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 50 Hz */ + + +/* Vz filter 33 Hz */ +REAL_TYPE +Vz_filter_33( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0, x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.874036784828483; + static REAL_TYPE a1 = -1.865563793814790; + static REAL_TYPE b0 = 0.004141433623051; + static REAL_TYPE b1 = 0.004331557390642; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 33 Hz */ + + +/* Vz filter 25 Hz */ +REAL_TYPE +Vz_filter_25( REAL_TYPE Vz ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.837180720246048; + static REAL_TYPE a1 = -1.822731999002980; + static REAL_TYPE b0 = 0.007010380719078; + static REAL_TYPE b1 = 0.007438340523990; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * Vz; + x2_tmp = x1 - a1 * x2 + b1 * Vz; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of Vz filter 25 Hz */ + + +/* q filter 100 Hz */ +REAL_TYPE +q_filter_100( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.766000101841272; + static REAL_TYPE a1 = -1.734903205885821; + static REAL_TYPE b0 = 0.014857648981438; + static REAL_TYPE b1 = 0.016239246974013; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 100 Hz */ + + +/* q filter 50 Hz */ +REAL_TYPE +q_filter_50( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.586756156020839; + static REAL_TYPE a1 = -1.477888930110354; + static REAL_TYPE b0 = 0.049596808318647; + static REAL_TYPE b1 = 0.059270417591839; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 50 Hz */ + + +/* q filter 33 Hz */ +REAL_TYPE +q_filter_33( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.445839214374383; + static REAL_TYPE a1 = -1.227970132817902; + static REAL_TYPE b0 = 0.094268996251840; + static REAL_TYPE b1 = 0.123600085304640; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 33 Hz */ + + +/* q filter 25 Hz */ +REAL_TYPE +q_filter_25( REAL_TYPE q ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.344282786628352; + static REAL_TYPE a1 = -1.010643377701049; + static REAL_TYPE b0 = 0.137177088974822; + static REAL_TYPE b1 = 0.196462319952482; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * q; + x2_tmp = x1 - a1 * x2 + b1 * q; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of q filter 25 Hz */ + + +/* az filter 100 Hz */ +REAL_TYPE +az_filter_100( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficient */ + static REAL_TYPE a0 = 0.411240701442774; + static REAL_TYPE a1 = -1.158045899830964; + static REAL_TYPE b0 = 0.107849979167580; + static REAL_TYPE b1 = 0.145344822444230; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 100 Hz */ + + +/* az filter 50 Hz */ +REAL_TYPE +az_filter_50( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.169118914523145; + static REAL_TYPE a1 = -0.518588903229759; + static REAL_TYPE b0 = 0.229019233988375; + static REAL_TYPE b1 = 0.421510777305010; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 50 Hz */ + + +/* az filter 33 Hz */ +REAL_TYPE +az_filter_33( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.067700864731348; + static REAL_TYPE a1 = -0.115832026705568; + static REAL_TYPE b0 = 0.263451167882487; + static REAL_TYPE b1 = 0.688417670143293; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 33 Hz */ + + +/* az filter 25 Hz */ +REAL_TYPE +az_filter_25( REAL_TYPE az ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.028601207249487; + static REAL_TYPE a1 = 0.069303378493245; + static REAL_TYPE b0 = 0.228783762747218; + static REAL_TYPE b1 = 0.869120822995514; + + if ( debut ) { + debut = 0; + x1 = 0.0; + x2 = 0.0; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * az; + x2_tmp = x1 - a1 * x2 + b1 * az; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of az filter 25 Hz */ + + +/* h filter 100 Hz*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 100 Hz coefficients */ + static REAL_TYPE a0 = 0.766000101841272; + static REAL_TYPE a1 = -1.734903205885821; + static REAL_TYPE b0 = 0.014857648981438; + static REAL_TYPE b1 = 0.016239246974013; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 100 Hz */ + + +/* h filter 50 Hz*/ +REAL_TYPE +h_filter_50( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 50 Hz coefficients */ + static REAL_TYPE a0 = 0.586756156020839; + static REAL_TYPE a1 = -1.477888930110354; + static REAL_TYPE b0 = 0.049596808318647; + static REAL_TYPE b1 = 0.059270417591839; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 50 Hz */ + + +/* h filter 33 Hz*/ +REAL_TYPE +h_filter_33( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 33 Hz coefficients */ + static REAL_TYPE a0 = 0.445839214374383; + static REAL_TYPE a1 = -1.227970132817902; + static REAL_TYPE b0 = 0.094268996251840; + static REAL_TYPE b1 = 0.123600085304640; + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 33 Hz */ + + +/* h filter 25 Hz*/ +REAL_TYPE +h_filter_25( REAL_TYPE h ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE x1 = 0.0; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_tmp = 0.0; + static REAL_TYPE x2_tmp = 0.0; + static unsigned short debut = 1; + /* 25 Hz coefficients */ + static REAL_TYPE a0 = 0.344282786628352; + static REAL_TYPE a1 = -1.010643377701049; + static REAL_TYPE b0 = 0.137177088974822; + static REAL_TYPE b1 = 0.196462319952482; /**/ + + if ( debut ) { + debut = 0; + x1 = h_eq * ( 1.0 + a1 - b1 ); + x2 = h_eq; + } + // Output + y = x2; + // State + x1_tmp = - a0 * x2 + b0 * h; + x2_tmp = x1 - a1 * x2 + b1 * h; + // Update + x1 = x1_tmp; + x2 = x2_tmp; + + return y; +} /* end of h filter 25 Hz */ + + +/* Altitude hold controller 50 Hz */ + +REAL_TYPE +altitude_hold_50( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 50.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 33 Hz */ + +REAL_TYPE +altitude_hold_33( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 33.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 25 Hz */ + +REAL_TYPE +altitude_hold_25( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 25.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Altitude hold controller 10 Hz */ + +REAL_TYPE +altitude_hold_10( REAL_TYPE h_f, REAL_TYPE h_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_h = 1.0 / 10.0; + static REAL_TYPE integrator = 532.2730285; + + if ( ( h_f - h_c ) < -50 ) { + // Output + y = Vz_c; + } else + if ( ( h_f - h_c ) > 50 ) { + // Output + y = -Vz_c; + } else { + // Output + y = Kp_h * ( h_f - h_c ) + Ki_h * integrator; + // State + integrator += Ts_h * ( h_f - h_c ); + } + + return y; +} + + +/* Va Speed controller 50 Hz */ +REAL_TYPE +Va_control_50( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 33 Hz */ +REAL_TYPE +Va_control_33( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + +// Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; +// State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 25 Hz */ +REAL_TYPE +Va_control_25( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Va Speed controller 10 Hz */ +REAL_TYPE +Va_control_10( REAL_TYPE Va_f, REAL_TYPE Vz_f, REAL_TYPE q_f, REAL_TYPE Va_c ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K1 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K1_intVa * integrator + K1_Va * ( Va_f - Va_eq ) + K1_Vz * Vz_f + + K1_q * q_f + delta_th_eq; + // State + integrator += Ts_K1 * ( Va_c - Va_f + Va_eq ); + + return y; +} + + +/* Vz Speed controller 50 Hz */ +REAL_TYPE +Vz_control_50( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 50.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 33 Hz */ +REAL_TYPE +Vz_control_33( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 33.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 25 Hz */ +REAL_TYPE +Vz_control_25( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 25.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Vz Speed controller 10 Hz */ +REAL_TYPE +Vz_control_10( REAL_TYPE Vz_f, REAL_TYPE Vz_c, REAL_TYPE q_f, REAL_TYPE az_f ) +{ + static REAL_TYPE y = 0.0; + static REAL_TYPE Ts_K2 = 1.0 / 10.0; + static REAL_TYPE integrator = 0.0; + + // Output + y = K2_intVz * integrator + K2_Vz * Vz_f + K2_q * q_f + K2_az * az_f + + delta_e_eq; + // State + integrator += Ts_K2 * ( Vz_c - Vz_f ); + + return y; +} + + +/* Engine */ +REAL_TYPE +engine( REAL_TYPE delta_th_c ) +{ + + static REAL_TYPE y = delta_th_eq; + static REAL_TYPE x1 = delta_th_eq; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE tau = 0.75; + + // Output + y = 26350.0 * x1; + // State Equation + x1_dot = -tau * x1 + tau * delta_th_c; + // Update State + x1 += dt_dx * x1_dot; + + return y; +} + + +/* Elevator */ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ) +{ + + static REAL_TYPE y = delta_e_eq; + static REAL_TYPE x1 = delta_e_eq; + static REAL_TYPE x2 = 0.0; + static REAL_TYPE x1_dot = 0.0; + static REAL_TYPE x2_dot = 0.0; + static REAL_TYPE omega = 25.0; + static REAL_TYPE xi = 0.85; + + // Output + y = x1; + // State Equation + x1_dot = x2; + x2_dot = -omega * omega * x1 - 2.0 * xi * omega * x2 + + omega * omega * delta_e_c; + // Update State + x1 += dt_de * x1_dot; + x2 += dt_de * x2_dot; + + return y; +} + + +/* Flight dynamics */ +void aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ) +{ + + static int debut = 1; + + static REAL_TYPE u = 0.0; + static REAL_TYPE w = 0.0; + static REAL_TYPE q = 0.0; + static REAL_TYPE theta = 0.0; + static REAL_TYPE h = 0.0; + static REAL_TYPE u_dot = 0.0; + static REAL_TYPE w_dot = 0.0; + static REAL_TYPE q_dot = 0.0; + static REAL_TYPE theta_dot = 0.0; + static REAL_TYPE h_dot = 0.0; + + static REAL_TYPE CD = 0.0; + static REAL_TYPE CL = 0.0; + static REAL_TYPE Cm = 0.0; + + static REAL_TYPE Xa = 0.0; + static REAL_TYPE Za = 0.0; + static REAL_TYPE Ma = 0.0; + + static REAL_TYPE alpha = 0.0; + static REAL_TYPE qbar = 0.0; + static REAL_TYPE V = 0.0; + static REAL_TYPE rho = 0.0; + + if ( debut ) { + debut = 0; + u = Va_eq * MATH_COS( theta_eq ); + w = Va_eq * MATH_SIN( theta_eq ); + q = 0.0; + theta = theta_eq; + h = h_eq; + } + + rho = rho0 * pow( 1.0 + T0_h / T0_0 * h, - g0 / ( Rs * T0_h ) - 1.0 ); + alpha = atan( w / u ); + V = sqrt( u * u + w * w ); + qbar = 0.5 * rho * V * V; + CL = CL_deltae * delta_e + CL_alpha * ( alpha - alpha_0 ); + CD = CD_0 + CD_deltae * delta_e + + CD_alpha * ( alpha - alpha_0 ) * ( alpha - alpha_0 ); + Cm = Cm_0 + Cm_deltae * delta_e + + Cm_alpha * alpha + 0.5 * Cm_q * q * cbar / V; + Xa = - qbar * S * ( CD * MATH_COS( alpha ) - CL * MATH_SIN( alpha ) ); + Za = - qbar * S * ( CD * MATH_SIN( alpha ) + CL * MATH_COS( alpha ) ); + Ma = qbar * cbar * S * Cm; + + // Output + outputs -> Va = V; + outputs -> Vz = w * MATH_COS( theta ) - u * MATH_SIN( theta ); + outputs -> q = q; + outputs -> az = g0 * MATH_COS( theta ) + Za / masse; + outputs -> h = h; + // State Equation + u_dot = - g0 * sin ( theta ) - q * w + ( Xa + T ) / masse; + w_dot = g0 * MATH_COS ( theta ) + q * u + Za / masse; + q_dot = Ma / I_y; + theta_dot = q; + h_dot = u * MATH_SIN( theta ) - w * MATH_COS( theta ); + // Update State + u += dt * u_dot; + w += dt * w_dot; + q += dt * q_dot; + theta += dt * theta_dot; + h += dt * h_dot; + + + static REAL_TYPE Time = 0.0; + + + // instant++; + Time = Time + dt; +} + + +/* + The commanded altitude +*/ +REAL_TYPE input_h_c( void ) +{ + return h_c; +} + + +/* + The commanded airspeed +*/ +REAL_TYPE input_Va_c( void ) +{ + return Va_c; +} + + +void output_delta_th_c( REAL_TYPE delta_th_c ) +{ + +} + + +void output_delta_e_c( REAL_TYPE delta_e_c ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.h b/targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.h new file mode 100644 index 0000000..747c4b1 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/assemblage_includes.h @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: assemblage_includes.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: assemblage_includes.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef ASSEMBLAGE_INCLUDES_H +#define ASSEMBLAGE_INCLUDES_H +#include "types.h" +#include "io.h" + + +/* *************************************************************************** + Shared constants + * ************************************************************************* */ +#define delta_th_eq (1.5868660794926) +#define delta_e_eq (0.012009615652468) +extern const REAL_TYPE h_eq; +extern const REAL_TYPE Va_eq; +#ifndef NBMAX_SAMPLE +#define NBMAX_SAMPLE (6000000/4) +#endif +extern REAL_TYPE sample[ SPL_SIZE ][ NBMAX_SAMPLE ]; + +void print_inmemory_sample( void ); + +/* *************************************************************************** + The prelude imported node prototypes + * ************************************************************************* */ +/** + Va filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Va, airspeed (m/s) + @return Va_f, filtered airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Va_filter_100( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_50( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_33( REAL_TYPE Va ); + +REAL_TYPE +Va_filter_25( REAL_TYPE Va ); + +/** + Vz filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] Vz, vertical speed (m/s) + @return Vz_f, filtered vertical airspeed (m/s) + 2nd order Butterworth filter with fc = 0.5 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +Vz_filter_100( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_50 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_33 ( REAL_TYPE Vz ); + +REAL_TYPE +Vz_filter_25 ( REAL_TYPE Vz ); + +/** + q filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] q, pitch rate (rad/s) + @return q_f, filtered pitch rate (rad/s) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +q_filter_100( REAL_TYPE q ); + +REAL_TYPE +q_filter_50 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_33 ( REAL_TYPE q ); + +REAL_TYPE +q_filter_25 ( REAL_TYPE q ); + +/** + az filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] az, normal acceleration (m/s^2) + @return az_f, filtered normal acceleration (m/s^2) + 2nd order Butterworth filter with fc = 10.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +az_filter_100( REAL_TYPE az ); + +REAL_TYPE +az_filter_50 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_33 ( REAL_TYPE az ); + +REAL_TYPE +az_filter_25 ( REAL_TYPE az ); + +/** + h filter (100/50/33/25 Hz --> 10/20/30/40 ms period) + @param[in] h, altitude (m) + @return h_f, filtered altitude (m) + 2nd order Butterworth filter with fc = 3.0 Hz (Matlab function butter) + Discretized with Zero-order Hold method with Ts = 0.01/0.02/0.03/0.04 (Matlab function c2d) +*/ +REAL_TYPE +h_filter_100( REAL_TYPE h ); + +REAL_TYPE +h_filter_50 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_33 ( REAL_TYPE h ); + +REAL_TYPE +h_filter_25 ( REAL_TYPE h ); + +/** + Altitude hold controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] h_f, filtered altitude (m) + @param[in] h_c, commanded altitude (m) + @return Vz_c, commanded vertical speed (m/s) + Generates the vertical speed command Vz_c to track altitude change h_c +*/ +REAL_TYPE +altitude_hold_50 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_33 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_25 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +REAL_TYPE +altitude_hold_10 ( REAL_TYPE h_f, REAL_TYPE h_c ); + +/** + Vz Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] Vz_c, commanded vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @param[in] az_f, filtered normal acceleration (m/s^2) + @return delta_e_c, commanded elevator deflection (rad) + Generates the elevator deflection command to track vertical speed command Vz_c +*/ +REAL_TYPE +Vz_control_50 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_33 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_25 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +REAL_TYPE +Vz_control_10 ( REAL_TYPE Vz_f, REAL_TYPE Vz_c, + REAL_TYPE q_f, REAL_TYPE az_f ); + +/** + Va Speed controller (rate 50/33/25/10 Hz sampling period 0.02/0.03/0.04/0.1) + @param[in] Va_f, filtered airspeed (m/s) + @param[in] Vz_f, filtered vertical speed (m/s) + @param[in] q_f, filtered pitch rate (rad/s) + @return delta_th_c, commanded throttle (-) + Generates the throttle command to track airspeed change Va_c +*/ +REAL_TYPE +Va_control_50 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_33 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_25 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +REAL_TYPE +Va_control_10 ( REAL_TYPE Va_f, REAL_TYPE Vz_f, + REAL_TYPE q_f, REAL_TYPE Va_c ); + +/** + Engine (200 Hz --> 5ms period) + @param[in] delta_th_c, commanded throttle (-) + @return T, Thrust (N) + 1st order system with time constant 0.5 s + ODE Solver: Euler method with fixed-step = 0.005 (200 Hz) +*/ +REAL_TYPE +engine( REAL_TYPE delta_th_c ); + +/** + Elevator (200 Hz --> 5ms period) + @param[in] delta_e_c, commanded elevator deflection (rad) + @return delta_e, elevator deflection (rad) + 2nd order system (natural frequency omega = 25.0 rad/s and damping xi = 0.85) + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +REAL_TYPE +elevator( REAL_TYPE delta_e_c ); + +/** + Flight dynamics (200 Hz --> 5ms period) + @param[in] i, the simulation step + @param[in] delta_e, elevator deflection (rad) + @param[in] T, Thrust (N) + @param[out] outputs, the outputs Va, Vz, q, az, h + Aircraft flight dynamics + ODE Solver: Euler method with fixed-step = 0.005 s (200 Hz) +*/ +void +aircraft_dynamics ( REAL_TYPE delta_e, REAL_TYPE T, + struct aircraft_dynamics_outs_t *outputs ); + +/* *************************************************************************** + The prelude sensor node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +REAL_TYPE +input_h_c( void ); + +REAL_TYPE +input_Va_c( void ); + + +/* *************************************************************************** + The prelude actuator node prototypes + * ************************************************************************* */ + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_th_c( REAL_TYPE delta_th_c ); + +/** + (200 Hz --> 5ms period) +*/ +void +output_delta_e_c( REAL_TYPE delta_e_c ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/com_patterns.h b/targets/wasm-tacle/parallel/rosace/thread5/com_patterns.h new file mode 100644 index 0000000..8b98cd7 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/com_patterns.h @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: com_patterns.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: com_patterns.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef com_patterns_H_ +#define com_patterns_H_ +// Description of communication protocols using ultimately periodic +// words: prefix.(periodic pattern). Each communication uses a circular +// buffer shared between the writer and the reader. + +// The task instance i writes to the communication buffer iff proto[n] +// is true (modulo the size of the periodic word). After each write, the +// index where the writer writes is incremented. +struct write_proto_t { + int *write_pref; + int wpref_size; + int *write_pat; + int wpat_size; +}; + +// The task instance n must increment the index at which the task reads +// in the communication buffer iff proto[n] is true (modulo the size of the +// periodic word). +struct read_proto_t { + int *change_pref; + int rpref_size; + int *change_pat; + int rpat_size; +}; + +/** + Returns 1 if instance n must write in the com buffer. +*/ +static inline int must_write( struct write_proto_t wp, int n ) +{ + if ( n < wp.wpref_size ) + return wp.write_pref[ n ]; + else + return wp.write_pat[ ( n - wp.wpref_size ) % wp.wpat_size ]; +} + + +/** + Returns 1 if instance n must change the cell from which it reads. +*/ +static inline int must_change( struct read_proto_t rp, int n ) +{ + if ( n < rp.rpref_size ) + return rp.change_pref[ n ]; + else + return rp.change_pat[ ( n - rp.rpref_size ) % rp.rpat_size ]; +} + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/common.c b/targets/wasm-tacle/parallel/rosace/thread5/common.c new file mode 100644 index 0000000..d52da59 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/common.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.c + + Author: Dustin Green + + Function: Common used functions from original threads.c + + Source: + + Original name: + + Changes: No major changes of functions from original threads.c + + License: See the terms above. + +*/ + +#include "common.h" +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +void rosace_init( void ) +{ + + // Initial values + outs.sig_outputs.Va = 0; + outs.sig_outputs.Vz = 0; + outs.sig_outputs.q = 0; + outs.sig_outputs.az = 0; + outs.sig_outputs.h = 0; + outs.t_simu = 0; + step_simu = 0; + + // Get the task set (required for CALL() macro) + int tmp; + get_task_set( &tmp, &tasks ); +} + + +void copy_output_vars( output_t *v, uint64_t step ) +{ + v->sig_outputs.Va = aircraft_dynamics495_Va_Va_filter_100449_Va[ step % 2 ]; + v->sig_outputs.Vz = aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ step % 2 ]; + v->sig_outputs.q = aircraft_dynamics495_q_q_filter_100455_q[ step % 2 ]; + v->sig_outputs.az = aircraft_dynamics495_az_az_filter_100458_az[ step % 2 ]; + v->sig_outputs.h = aircraft_dynamics495_h_h_filter_100446_h[ step % 2 ]; + v->sig_delta_th_c = Va_control_50474_delta_th_c_delta_th_c; + v->sig_delta_e_c = Vz_control_50483_delta_e_c_delta_e_c; +} + diff --git a/targets/wasm-tacle/parallel/rosace/thread5/common.h b/targets/wasm-tacle/parallel/rosace/thread5/common.h new file mode 100644 index 0000000..315ab80 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/common.h @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: common.h + + Author: Dustin Green + + Function: Common used functions and variables from original threads.c + + Source: + + Original name: + + Changes: No major functional changes + + License: See the terms above. + +*/ + +#ifndef COMMON_H +#define COMMON_H + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" + + +// I/O +output_t outs; +uint64_t step_simu; +uint64_t max_step_simu; + + +// Output variables +extern double aircraft_dynamics495_Va_Va_filter_100449_Va[ 2 ]; +extern double aircraft_dynamics495_az_az_filter_100458_az[ 2 ]; +extern double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[ 2 ]; +extern double aircraft_dynamics495_q_q_filter_100455_q[ 2 ]; +extern double aircraft_dynamics495_h_h_filter_100446_h[ 2 ]; +extern double Va_control_50474_delta_th_c_delta_th_c; +extern double Vz_control_50483_delta_e_c_delta_e_c; + + +// Task set +struct nonencoded_task_params *tasks; + + +// Common functions +void rosace_init( void ); +void copy_output_vars( output_t *v, uint64_t step ); + + +// This should be set to 1 to run in "real-time" in the sense +// that the simulation time is close to the real world time +#define RUN_WITH_REAL_TIME 0 + +#define CALL( val ) tasks[ (val) ].ne_t_body( NULL ) + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/io.c b/targets/wasm-tacle/parallel/rosace/thread5/io.c new file mode 100644 index 0000000..ad775fb --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/io.c @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.c + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.c + + Changes: delete the code within ROSACE_write_outputs because + stdio.h is not available + + License: See the terms above. + +*/ + +#include "types.h" +#include "io.h" + +#define FMTREAL "%5.15f" +#define BASE_FREQUENCY 200.0 + +extern REAL_TYPE h_c; + +void ROSACE_update_altitude_command( REAL_TYPE h_cons ) +{ + h_c = h_cons; +} + +void ROSACE_write_outputs( output_t *v ) +{ + +} diff --git a/targets/wasm-tacle/parallel/rosace/thread5/io.h b/targets/wasm-tacle/parallel/rosace/thread5/io.h new file mode 100644 index 0000000..be20e10 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/io.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: io.h + + Author: Unknown + + Function: Output function + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: io.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_IO_H +#define __DEF_ROSACE_IO_H + +#include "types.h" + +typedef struct { + struct aircraft_dynamics_outs_t sig_outputs; + uint64_t t_simu; + REAL_TYPE sig_delta_th_c; + REAL_TYPE sig_delta_e_c; +} output_t; + +void ROSACE_write_outputs( output_t *v ); +void ROSACE_update_altitude_command( REAL_TYPE h_cons ); + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/math_all.c b/targets/wasm-tacle/parallel/rosace/thread5/math_all.c new file mode 100644 index 0000000..3400e74 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/math_all.c @@ -0,0 +1,2278 @@ + + +/* e_acosf.c -- float version of e_acos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_all.c + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_all.c + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +#include "math_private.h" +#include "wcclibm.h" + +// The following defines map the math functions to specialized calls. +// The declarations in math.h are bound to the official interface names. +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +// The list of defined functions with their official interface names +float __atanf( float x ); +float __ceilf( float x ); +float __copysignf( float x, float y ); +float __cosf( float x ); +float __erff( float x ); +float __fabsf( float x ); +float __floorf( float x ); +float __ieee754_acosf( float x ); +float __ieee754_expf( float x ); +float __ieee754_logf( float x ); +float __ieee754_log10f( float x ); +float __ieee754_powf( float x, float y ); +int32_t __ieee754_rem_pio2f( float x, float *y ); +float __ieee754_sqrtf( float x ); +int __isinff( float x ); +float __kernel_cosf( float x, float y ); +float __kernel_sinf( float x, float y, int iy ); +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2 ); +float __sinf( float x ); +float __scalbnf( float x, int n ); + + +// Often used variables/consts +#ifdef __STDC__ +const float +#else +float +#endif +one = 1.0f, +tiny = 1.0e-30f, +half = 5.0000000000e-01f, /* 0x3f000000 */ +huge = 1.0e30f, +two = 2.0f, +two24 = 16777216.0f, /* 0x4b800000 */ +two25 = 3.3554432000e+07f, /* 0x4c000000 */ +two8 = 2.5600000000e+02f, /* 0x43800000 */ +twon8 = 3.9062500000e-03f, /* 0x3b800000 */ +zero = 0.0f; + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00f, /\* 0x3F800000 *\/ */ +pi = 3.1415925026e+00f, /* 0x40490fda */ +pio2_hi = 1.5707962513e+00f, /* 0x3fc90fda */ +pio2_lo = 7.5497894159e-08f, /* 0x33a22168 */ +pS0 = 1.6666667163e-01f, /* 0x3e2aaaab */ +pS1 = -3.2556581497e-01f, /* 0xbea6b090 */ +pS2 = 2.0121252537e-01f, /* 0x3e4e0aa8 */ +pS3 = -4.0055535734e-02f, /* 0xbd241146 */ +pS4 = 7.9153501429e-04f, /* 0x3a4f7f04 */ +pS5 = 3.4793309169e-05f, /* 0x3811ef08 */ +qS1 = -2.4033949375e+00f, /* 0xc019d139 */ +qS2 = 2.0209457874e+00f, /* 0x4001572d */ +qS3 = -6.8828397989e-01f, /* 0xbf303361 */ +qS4 = 7.7038154006e-02f; /* 0x3d9dc62e */ + +#ifdef __STDC__ +float __ieee754_acosf( float x ) +#else +float __ieee754_acosf( x ) +float x; +#endif +{ + float z, p, q, r, w, s, c, df; + int32_t hx, ix; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix == 0x3f800000 ) { /* |x|==1 */ + if ( hx > 0 ) return 0.0f; /* acos(1) = 0 */ + else return pi + ( float )2.0f * pio2_lo; /* acos(-1)= pi */ + } else + if ( ix > 0x3f800000 ) { /* |x| >= 1 */ + return ( x - x ) / ( x - x ); /* acos(|x|>1) is NaN */ + } + if ( ix < 0x3f000000 ) { /* |x| < 0.5 */ + if ( ix <= 0x23000000 ) return pio2_hi + pio2_lo; /*if|x|<2**-57*/ + z = x * x; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + return pio2_hi - ( x - ( pio2_lo - x * r ) ); + } else + if ( hx < 0 ) { /* x < -0.5 */ + z = ( one + x ) * ( float )0.5f; + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + s = __ieee754_sqrtf( z ); + r = p / q; + w = r * s - pio2_lo; + return pi - ( float )2.0f * ( s + w ); + } else { /* x > 0.5 */ + int32_t idf; + z = ( one - x ) * ( float )0.5f; + s = __ieee754_sqrtf( z ); + df = s; + GET_FLOAT_WORD( idf, df ); + SET_FLOAT_WORD( df, idf & 0xfffff000 ); + c = ( z - df * df ) / ( s + df ); + p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * + ( pS4 + z * pS5 ) ) ) ) ); + q = one + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); + r = p / q; + w = r * s + c; + return ( float )2.0f * ( df + w ); + } +} +/* e_powf.c -- float version of e_pow.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* static const float huge = 1.0e+30f, tiny = 1.0e-30f; */ + +#ifdef __STDC__ +const float +#else +float +#endif +bp[] = {1.0f, 1.5f,}, + dp_h[] = { 0.0f, 5.84960938e-01f,}, /* 0x3f15c000 */ + dp_l[] = { 0.0f, 1.56322085e-06f,}, /* 0x35d1cfdc */ + /* zero = 0.0f, */ + /* one = 1.0f, */ + /* two = 2.0f, */ + /* two24 = 16777216.0f, /\* 0x4b800000 *\/ */ + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + L1 = 6.0000002384e-01f, /* 0x3f19999a */ + L2 = 4.2857143283e-01f, /* 0x3edb6db7 */ + L3 = 3.3333334327e-01f, /* 0x3eaaaaab */ + L4 = 2.7272811532e-01f, /* 0x3e8ba305 */ + L5 = 2.3066075146e-01f, /* 0x3e6c3255 */ + L6 = 2.0697501302e-01f, /* 0x3e53f142 */ + P1 = 1.6666667163e-01f, /* 0x3e2aaaab */ + P2 = -2.7777778450e-03f, /* 0xbb360b61 */ + P3 = 6.6137559770e-05f, /* 0x388ab355 */ + P4 = -1.6533901999e-06f, /* 0xb5ddea0e */ + P5 = 4.1381369442e-08f, /* 0x3331bb4c */ + lg2 = 6.9314718246e-01f, /* 0x3f317218 */ + lg2_h = 6.93145752e-01f, /* 0x3f317200 */ + lg2_l = 1.42860654e-06f, /* 0x35bfbe8c */ + ovt = 4.2995665694e-08f, /* -(128-log2(ovfl+.5ulp)) */ + cp = 9.6179670095e-01f, /* 0x3f76384f =2/(3ln2) */ + cp_h = 9.6179199219e-01f, /* 0x3f763800 =head of cp */ + cp_l = 4.7017383622e-06f, /* 0x369dc3a0 =tail of cp_h */ + ivln2 = 1.4426950216e+00f, /* 0x3fb8aa3b =1/ln2 */ + ivln2_h = 1.4426879883e+00f, /* 0x3fb8aa00 =16b 1/ln2*/ + ivln2_l = 7.0526075433e-06f; /* 0x36eca570 =1/ln2 tail*/ + +#ifdef __STDC__ +float __ieee754_powf( float x, float y ) +#else +float __ieee754_powf( x, y ) +float x, y; +#endif +{ + float z, ax, z_h, z_l, p_h, p_l; + float y1, t1, t2, r, s, t, u, v, w; + int32_t i, j, k, yisint, n; + int32_t hx, hy, ix, iy, is; + + GET_FLOAT_WORD( hx, x ); + GET_FLOAT_WORD( hy, y ); + ix = hx & 0x7fffffff; + iy = hy & 0x7fffffff; + + /* y==zero: x**0 = 1 */ + if ( iy == 0 ) return one; + + /* x==+-1 */ + if ( x == 1.0f ) return one; + if ( x == -1.0f && isinff( y ) ) return one; + + /* +-NaN return x+y */ + if ( ix > 0x7f800000 || + iy > 0x7f800000 ) + return x + y; + + /* determine if y is an odd int when x < 0 + yisint = 0 ... y is not an integer + yisint = 1 ... y is an odd int + yisint = 2 ... y is an even int + */ + yisint = 0; + if ( hx < 0 ) { + if ( iy >= 0x4b800000 ) yisint = 2; /* even integer y */ + else + if ( iy >= 0x3f800000 ) { + k = ( iy >> 23 ) - 0x7f; /* exponent */ + j = iy >> ( 23 - k ); + if ( ( j << ( 23 - k ) ) == iy ) yisint = 2 - ( j & 1 ); + } + } + + /* special value of y */ + if ( iy == 0x7f800000 ) { /* y is +-inf */ + if ( ix == 0x3f800000 ) + return y - y; /* inf**+-1 is NaN */ + else + if ( ix > 0x3f800000 ) /* (|x|>1)**+-inf = inf,0 */ + return ( hy >= 0 ) ? y : zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return ( hy < 0 ) ? -y : zero; + } + if ( iy == 0x3f800000 ) { /* y is +-1 */ + if ( hy < 0 ) return one / x; + else return x; + } + if ( hy == 0x40000000 ) return x * x; /* y is 2 */ + if ( hy == 0x3f000000 ) { /* y is 0.5 */ + if ( hx >= 0 ) /* x >= +0 */ + return __ieee754_sqrtf( x ); + } + + ax = fabsf( x ); + /* special value of x */ + if ( ix == 0x7f800000 || ix == 0 || ix == 0x3f800000 ) { + z = ax; /*x is +-0,+-inf,+-1*/ + if ( hy < 0 ) z = one / z; /* z = (1/|x|) */ + if ( hx < 0 ) { + if ( ( ( ix - 0x3f800000 ) | yisint ) == 0 ) { + z = ( z - z ) / ( z - z ); /* (-1)**non-int is NaN */ + } else + if ( yisint == 1 ) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + + /* (x<0)**(non-int) is NaN */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | yisint ) == 0 ) return ( x - x ) / + ( x - x ); + + /* |y| is huge */ + if ( iy > 0x4d000000 ) { /* if |y| > 2**27 */ + /* over/underflow if x is not close to one */ + if ( ix < 0x3f7ffff8 ) return ( hy < 0 ) ? huge * huge : tiny * tiny; + if ( ix > 0x3f800007 ) return ( hy > 0 ) ? huge * huge : tiny * tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = x - 1; /* t has 20 trailing zeros */ + w = ( t * t ) * ( ( float )0.5f - t * ( ( float )0.333333333333f - t * + ( float )0.25f ) ); + u = ivln2_h * t; /* ivln2_h has 16 sig. bits */ + v = t * ivln2_l - w * ivln2; + t1 = u + v; + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = v - ( t1 - u ); + } else { + float s2, s_h, s_l, t_h, t_l; + n = 0; + /* take care subnormal number */ + if ( ix < 0x00800000 ) { + ax *= two24; + n -= 24; + GET_FLOAT_WORD( ix, ax ); + } + n += ( ( ix ) >> 23 ) - 0x7f; + j = ix & 0x007fffff; + /* determine interval */ + ix = j | 0x3f800000; /* normalize ix */ + if ( j <= 0x1cc471 ) k = 0; /* |x|> 1 ) | 0x20000000 ) + 0x0040000 + ( k << 21 ) ); + t_l = ax - ( t_h - bp[ k ] ); + s_l = v * ( ( u - s_h * t_h ) - s_h * t_l ); + /* compute log(ax) */ + s2 = s * s; + r = s2 * s2 * ( L1 + s2 * ( L2 + s2 * ( L3 + s2 * ( L4 + s2 * + ( L5 + s2 * L6 ) ) ) ) ); + r += s_l * ( s_h + s ); + s2 = s_h * s_h; + t_h = ( float )3.0f + s2 + r; + GET_FLOAT_WORD( is, t_h ); + SET_FLOAT_WORD( t_h, is & 0xfffff000 ); + t_l = r - ( ( t_h - ( float )3.0f ) - s2 ); + /* u+v = s*(1+...) */ + u = s_h * t_h; + v = s_l * t_h + t_l * s; + /* 2/(3log2)*(s+...) */ + p_h = u + v; + GET_FLOAT_WORD( is, p_h ); + SET_FLOAT_WORD( p_h, is & 0xfffff000 ); + p_l = v - ( p_h - u ); + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l * p_h + p_l * cp + dp_l[ k ]; + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = ( float )n; + t1 = ( ( ( z_h + z_l ) + dp_h[ k ] ) + t ); + GET_FLOAT_WORD( is, t1 ); + SET_FLOAT_WORD( t1, is & 0xfffff000 ); + t2 = z_l - ( ( ( t1 - t ) - dp_h[ k ] ) - z_h ); + } + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if ( ( ( ( ( u_int32_t )hx >> 31 ) - 1 ) | ( yisint - 1 ) ) == 0 ) + s = -one; /* (-ve)**(odd int) */ + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + GET_FLOAT_WORD( is, y ); + SET_FLOAT_WORD( y1, is & 0xfffff000 ); + p_l = ( y - y1 ) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + GET_FLOAT_WORD( j, z ); + if ( j > 0x43000000 ) /* if z > 128 */ + return s * huge * huge; /* overflow */ + else + if ( j == 0x43000000 ) { /* if z == 128 */ + if ( p_l + ovt > z - p_h ) return s * huge * huge; /* overflow */ + } else + if ( ( j & 0x7fffffff ) > 0x43160000 ) /* z <= -150 */ + return s * tiny * tiny; /* underflow */ + else + if ( ( u_int32_t ) j == 0xc3160000 ) { /* z == -150 */ + if ( p_l <= z - p_h ) return s * tiny * tiny; /* underflow */ + } + /* + compute 2**(p_h+p_l) + */ + i = j & 0x7fffffff; + k = ( i >> 23 ) - 0x7f; + n = 0; + if ( i > 0x3f000000 ) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j + ( 0x00800000 >> ( k + 1 ) ); + k = ( ( n & 0x7fffffff ) >> 23 ) - 0x7f; /* new k for n */ + SET_FLOAT_WORD( t, n & ~( 0x007fffff >> k ) ); + n = ( ( n & 0x007fffff ) | 0x00800000 ) >> ( 23 - k ); + if ( j < 0 ) n = -n; + p_h -= t; + } + t = p_l + p_h; + GET_FLOAT_WORD( is, t ); + SET_FLOAT_WORD( t, is & 0xfffff000 ); + u = t * lg2_h; + v = ( p_l - ( t - p_h ) ) * lg2 + t * lg2_l; + z = u + v; + w = v - ( z - u ); + t = z * z; + t1 = z - t * ( P1 + t * ( P2 + t * ( P3 + t * ( P4 + t * P5 ) ) ) ); + r = ( z * t1 ) / ( t1 - two ) - ( w + z * w ); + z = one - ( r - z ); + GET_FLOAT_WORD( j, z ); + j += ( n << 23 ); + if ( ( j >> 23 ) <= 0 ) z = __scalbnf( z, n ); /* subnormal output */ + else SET_FLOAT_WORD( z, j ); + return s * z; +} +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[0]+y[1] + use __kernel_rem_pio2f() +*/ + + +/* + Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi +*/ +#ifdef __STDC__ +const int32_t two_over_pi[] = { +#else +int32_t two_over_pi[] = { +#endif + 0xA2, 0xF9, 0x83, 0x6E, 0x4E, 0x44, 0x15, 0x29, 0xFC, + 0x27, 0x57, 0xD1, 0xF5, 0x34, 0xDD, 0xC0, 0xDB, 0x62, + 0x95, 0x99, 0x3C, 0x43, 0x90, 0x41, 0xFE, 0x51, 0x63, + 0xAB, 0xDE, 0xBB, 0xC5, 0x61, 0xB7, 0x24, 0x6E, 0x3A, + 0x42, 0x4D, 0xD2, 0xE0, 0x06, 0x49, 0x2E, 0xEA, 0x09, + 0xD1, 0x92, 0x1C, 0xFE, 0x1D, 0xEB, 0x1C, 0xB1, 0x29, + 0xA7, 0x3E, 0xE8, 0x82, 0x35, 0xF5, 0x2E, 0xBB, 0x44, + 0x84, 0xE9, 0x9C, 0x70, 0x26, 0xB4, 0x5F, 0x7E, 0x41, + 0x39, 0x91, 0xD6, 0x39, 0x83, 0x53, 0x39, 0xF4, 0x9C, + 0x84, 0x5F, 0x8B, 0xBD, 0xF9, 0x28, 0x3B, 0x1F, 0xF8, + 0x97, 0xFF, 0xDE, 0x05, 0x98, 0x0F, 0xEF, 0x2F, 0x11, + 0x8B, 0x5A, 0x0A, 0x6D, 0x1F, 0x6D, 0x36, 0x7E, 0xCF, + 0x27, 0xCB, 0x09, 0xB7, 0x4F, 0x46, 0x3F, 0x66, 0x9E, + 0x5F, 0xEA, 0x2D, 0x75, 0x27, 0xBA, 0xC7, 0xEB, 0xE5, + 0xF1, 0x7B, 0x3D, 0x07, 0x39, 0xF7, 0x8A, 0x52, 0x92, + 0xEA, 0x6B, 0xFB, 0x5F, 0xB1, 0x1F, 0x8D, 0x5D, 0x08, + 0x56, 0x03, 0x30, 0x46, 0xFC, 0x7B, 0x6B, 0xAB, 0xF0, + 0xCF, 0xBC, 0x20, 0x9A, 0xF4, 0x36, 0x1D, 0xA9, 0xE3, + 0x91, 0x61, 0x5E, 0xE6, 0x1B, 0x08, 0x65, 0x99, 0x85, + 0x5F, 0x14, 0xA0, 0x68, 0x40, 0x8D, 0xFF, 0xD8, 0x80, + 0x4D, 0x73, 0x27, 0x31, 0x06, 0x06, 0x15, 0x56, 0xCA, + 0x73, 0xA8, 0xC9, 0x60, 0xE2, 0x7B, 0xC0, 0x8C, 0x6B, +}; + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +const int32_t npio2_hw[] = { +#else +int32_t npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t __ieee754_rem_pio2f( float x, float *y ) +#else +int32_t __ieee754_rem_pio2f( x, y ) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + float tx[ 3 ]; + int32_t e0, i, j, nx, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= pio2_2; + y[ 0 ] = z - pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += pio2_2; + y[ 0 ] = z + pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * invpio2 + half ); + fn = ( float )n; + r = t - fn * pio2_1; + w = fn * pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * pio2_2; + r = t - w; + w = fn * pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * pio2_3; + r = t - w; + w = fn * pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + /* set z = scalbn(|x|,ilogb(x)-7) */ + e0 = ( ix >> 23 ) - 134; /* e0 = ilogb(z)-7; */ + SET_FLOAT_WORD( z, ix - ( ( int32_t )( e0 << 23 ) ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < 2; i++ ) { + tx[ i ] = ( float )( ( int32_t )( z ) ); + z = ( z - tx[ i ] ) * two8; + } + tx[ 2 ] = z; + nx = 3; + _Pragma( "loopbound min 0 max 0" ) + while ( tx[ nx - 1 ] == zero ) { + nx--; /* skip zero term */ + } + n = __kernel_rem_pio2f( tx, y, e0, nx, 2, two_over_pi ); + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } + return n; +} +/* e_sqrtf.c -- float version of e_sqrt.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: e_sqrtf.c,v 1.4 1995/05/10 20:46:19 jtc Exp $"; +#endif + + +/* #ifdef __STDC__ */ +/* static const float one = 1.0f, tiny=1.0e-30f; */ +/* #else */ +/* static float one = 1.0f, tiny=1.0e-30f; */ +/* #endif */ + +#ifdef __STDC__ +float __ieee754_sqrtf( float x ) +#else +float __ieee754_sqrtf( x ) +float x; +#endif +{ + float z; + int32_t sign = ( int )0x80000000; + int32_t ix, s, q, m, t, i; + u_int32_t r; + + GET_FLOAT_WORD( ix, x ); + + /* take care of Inf and NaN */ + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) { + return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; /* sqrt(+-0) = +-0 */ + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = ( ix >> 23 ); + if ( m == 0 ) { /* subnormal x */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; /* unbias exponent */ + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + _Pragma( "loopbound min 0 max 0" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + /* use floating add to find out rounding direction */ + if ( ix != 0 ) { + z = one - tiny; /* trigger inexact flag */ + if ( z >= one ) { + z = one + tiny; + if ( z > one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + SET_FLOAT_WORD( z, ix ); + return z; +} +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +C4 = -2.7557314297e-07f, /* 0xb493f27c */ +C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float __kernel_cosf( float x, float y ) +#else +float __kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return one; /* generate inexact */ + } + z = x * x; + r = z * ( C1 + z * ( C2 + z * ( C3 + z * ( C4 + z * ( C5 + z * C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} +/* k_rem_pio2f.c -- float version of k_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = + "$NetBSD: k_rem_pio2f.c,v 1.4 1995/05/10 20:46:28 jtc Exp $"; +#endif + + +/* In the float version, the input parameter x contains 8 bit + integers, not 24 bit integers. 113 bit precision is not supported. */ + +#ifdef __STDC__ +const int init_jk[] = {4, 7, 9}; /* initial value for jk */ +#else +int init_jk[] = {4, 7, 9}; +#endif + +#ifdef __STDC__ +const float PIo2[] = { +#else +float PIo2[] = { +#endif + 1.5703125000e+00f, /* 0x3fc90000 */ + 4.5776367188e-04f, /* 0x39f00000 */ + 2.5987625122e-05f, /* 0x37da0000 */ + 7.5437128544e-08f, /* 0x33a20000 */ + 6.0026650317e-11f, /* 0x2e840000 */ + 7.3896444519e-13f, /* 0x2b500000 */ + 5.3845816694e-15f, /* 0x27c20000 */ + 5.6378512969e-18f, /* 0x22d00000 */ + 8.3009228831e-20f, /* 0x1fc40000 */ + 3.2756352257e-22f, /* 0x1bc60000 */ + 6.3331015649e-25f, /* 0x17440000 */ +}; + + +#ifdef __STDC__ +int __kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ) +#else +int __kernel_rem_pio2f( x, y, e0, nx, prec, ipio2 ) +float x[], y[]; +int e0, nx, prec; +int32_t ipio2[]; +#endif +{ + int32_t jz, jx, jv, jp, jk, carry, n, iq[ 20 ], i, j, k, m, q0, ih; + float z, fw, f[ 20 ], fq[ 20 ], q[ 20 ]; + + /* initialize jk*/ + jk = init_jk[ prec ]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx - 1; + jv = ( e0 - 3 ) / 8; + if ( jv < 0 ) jv = 0; + q0 = e0 - 8 * ( jv + 1 ); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv - jx; + m = jx + jk; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= m; i++, j++ ) + f[i] = ( j < 0 ) ? zero : ( float ) ipio2[ j ]; + + /* compute q[0],q[1],...q[jk] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i <= jk; i++ ) { + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[ i ] = fw; + } + + jz = jk; +recompute: + ; + /* distill q[] into iq[] reversingly */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0, j = jz, z = q[ jz ]; j > 0; i++, j-- ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[i] = ( int32_t )( z - two8 * fw ); + z = q[ j - 1 ] + fw; + } + + /* compute n */ + z = __scalbnf( z, q0 ); /* actual value of z */ + z -= ( float )8.0f * __floorf( z * ( float ) + 0.125f ); /* trim off integer >= 8 */ + n = ( int32_t ) z; + z -= ( float )n; + ih = 0; + if ( q0 > 0 ) { /* need iq[jz-1] to determine n */ + i = ( iq[ jz - 1 ] >> ( 8 - q0 ) ); + n += i; + iq[ jz - 1 ] -= i << ( 8 - q0 ); + ih = iq[ jz - 1 ] >> ( 7 - q0 ); + } else + if ( q0 == 0 ) ih = iq[ jz - 1 ] >> 8; + else + if ( z >= ( float )0.5f ) ih = 2; + + if ( ih > 0 ) { /* q > 0.5 */ + n += 1; + carry = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < jz ; i++ ) { /* compute 1-q */ + j = iq[ i ]; + if ( carry == 0 ) { + if ( j != 0 ) { + carry = 1; + iq[ i ] = 0x100 - j; + } + } else iq[ i ] = 0xff - j; + + } + if ( q0 > 0 ) { /* rare case: chance is 1 in 12 */ + switch ( q0 ) { + case 1: + iq[ jz - 1 ] &= 0x7f; + break; + case 2: + iq[ jz - 1 ] &= 0x3f; + break; + } + } + if ( ih == 2 ) { + z = one - z; + if ( carry != 0 ) z -= __scalbnf( one, q0 ); + } + } + + /* check if recomputation is needed */ + if ( z == zero ) { + j = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz - 1; i >= jk; i-- ) + j |= iq[ i ]; + if ( j == 0 ) { /* need recomputation */ + _Pragma( "loopbound min 0 max 0" ) + for ( k = 1; iq[ jk - k ] == 0; k++ ) { + ; /* k = no. of terms needed */ + } + + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz + 1; i <= jz + k; i++ ) { /* add q[jz+1] to q[jz+k] */ + f[ jx + i ] = ( float ) ipio2[ jv + i ]; + _Pragma( "loopbound min 0 max 0" ) + for ( j = 0, fw = 0.0f; j <= jx; j++ ) fw += x[ j ] * f[ jx + i - j ]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if ( z == ( float )0.0f ) { + jz -= 1; + q0 -= 8; + _Pragma( "loopbound min 0 max 0" ) + while ( iq[ jz ] == 0 ) { + jz--; + q0 -= 8; + } + } else { /* break z into 8-bit if necessary */ + z = __scalbnf( z, -q0 ); + if ( z >= two8 ) { + fw = ( float )( ( int32_t )( twon8 * z ) ); + iq[ jz ] = ( int32_t )( z - two8 * fw ); + jz += 1; + q0 += 8; + iq[ jz ] = ( int32_t ) fw; + } else iq[ jz ] = ( int32_t ) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = __scalbnf( one, q0 ); + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + q[ i ] = fw * ( float )iq[ i ]; + fw *= twon8; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) { + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, k = 0; k <= jp && k <= jz - i; k++ ) + fw += PIo2[ k ] * q[ i + k ]; + fq[ jz - i ] = fw; + } + + /* compress fq[] into y[] */ + switch ( prec ) { + case 0: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + break; + case 1: + case 2: + fw = 0.0f; + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i >= 0; i-- ) + fw += fq[ i ]; + y[ 0 ] = ( ih == 0 ) ? fw : -fw; + fw = fq[ 0 ] - fw; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i <= jz; i++ ) + fw += fq[ i ]; + y[ 1 ] = ( ih == 0 ) ? fw : -fw; + break; + case 3:; /* painful */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 0; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( i = jz; i > 1; i-- ) { + fw = fq[ i - 1 ] + fq[ i ]; + fq[ i ] += fq[ i - 1 ] - fw; + fq[ i - 1 ] = fw; + } + _Pragma( "loopbound min 0 max 0" ) + for ( fw = 0.0f, i = jz; i >= 2; i-- ) + fw += fq[ i ]; + + if ( ih == 0 ) { + y[ 0 ] = fq[ 0 ]; + y[ 1 ] = fq[ 1 ]; + y[ 2 ] = fw; + } else { + y[ 0 ] = -fq[ 0 ]; + y[ 1 ] = -fq[ 1 ]; + y[ 2 ] = -fw; + } + } + return n & 7; +} +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float +#else +float +#endif +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +S2 = 8.3333337680e-03f, /* 0x3c088889 */ +S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float __kernel_sinf( float x, float y, int iy ) +#else +float __kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = S2 + z * ( S3 + z * ( S4 + z * ( S5 + z * S6 ) ) ); + if ( iy == 0 ) return x + v * ( S1 + z * r ); + else return x - ( ( z * ( half * y - v * r ) - y ) - v * S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +#ifdef __STDC__ +const float atanhi[] = { +#else +float atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +const float atanlo[] = { +#else +float atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +const float aT[] = { +#else +float aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float __atanf( float x ) +#else +float __atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return atanhi[ 3 ] + atanlo[ 3 ]; + else return -atanhi[ 3 ] - atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( huge + x > one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - one ) / ( x + one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z * ( aT[ 0 ] + w * ( aT[ 2 ] + w * ( aT[ 4 ] + w * ( aT[ 6 ] + w * + ( aT[ 8 ] + w * aT[ 10 ] ) ) ) ) ); + s2 = w * ( aT[ 1 ] + w * ( aT[ 3 ] + w * ( aT[ 5 ] + w * ( aT[ 7 ] + w * aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = atanhi[ id ] - ( ( x * ( s1 + s2 ) - atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} +//weak_alias (__atanf, atanf) +/* s_copysignf.c -- float version of s_copysign.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + copysignf(float x, float y) + copysignf(x,y) returns a value with the magnitude of x and + with the sign bit of y. +*/ + + +#ifdef __STDC__ +float __copysignf( float x, float y ) +#else +float __copysignf( x, y ) +float x, y; +#endif +{ + u_int32_t ix, iy; + GET_FLOAT_WORD( ix, x ); + GET_FLOAT_WORD( iy, y ); + SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} +//weak_alias (__copysignf, copysignf) +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float __cosf( float x ) +#else +float __cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -__kernel_sinf( y[ 0 ], y[ 1], 1 ); + case 2: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +#ifdef __STDC__ +float __fabsf( float x ) +#else +float __fabsf( x ) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + +/* s_floorf.c -- float version of s_floor.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + floorf(x) + Return x rounded toward -inf to integral value + Method: + Bit twiddling. + Exception: + Inexact flag raised if x not equal to floorf(x). +*/ + + +/* #ifdef __STDC__ */ +/* static const float huge = 1.0e30f; */ +/* #else */ +/* static float huge = 1.0e30f; */ +/* #endif */ + +#ifdef __STDC__ +float __floorf( float x ) +#else +float __floorf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0f ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 >= 0 ) + i0 = 0; + else + if ( ( i0 & 0x7fffffff ) != 0 ) + i0 = 0xbf800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0f ) { /* raise inexact flag */ + if ( i0 < 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} +//weak_alias (__floorf, floorf) +/* + Written by J.T. Conklin . + Public domain. +*/ + +/* + isinff(x) returns 1 if x is inf, -1 if x is -inf, else 0; + no branching! +*/ + + +int +__isinff ( float x ) +{ + int32_t ix, t; + GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} +/* hidden_def (__isinff) */ +/* weak_alias (__isinff, isinff) */ +/* s_scalbnf.c -- float version of s_scalbn.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +#ifdef __STDC__ +float __scalbnf ( float x, int n ) +#else +float __scalbnf ( x, n ) +float x; +int n; +#endif +{ + int32_t k, ix; + GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; /* extract exponent */ + if ( k == 0 ) { /* 0 or subnormal x */ + if ( ( ix & 0x7fffffff ) == 0 ) return x; /* +-0 */ + x *= two25; + GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; /* NaN or Inf */ + k = k + n; + if ( n > 50000 || k > 0xfe ) + return huge * __copysignf( huge, x ); /* overflow */ + if ( n < -50000 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + if ( k > 0 ) { /* normal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return tiny * __copysignf( tiny, x ); /*underflow*/ + k += 25; /* subnormal result */ + SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * twom25; +} +//weak_alias (__scalbnf, scalbnf) + + + +/* e_log10f.c -- float version of e_log10.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ivln10 = 4.3429449201e-01f, /* 0x3ede5bd9 */ +log10_2hi = 3.0102920532e-01f, /* 0x3e9a2080 */ +log10_2lo = 7.9034151668e-07f; /* 0x355427db */ + +#ifdef __STDC__ +float __ieee754_log10f( float x ) +#else +float __ieee754_log10f( x ) +float x; +#endif +{ + float y, z; + int32_t i, k, hx; + + GET_FLOAT_WORD( hx, x ); + + k = 0; + if ( hx < 0x00800000 ) { /* x < 2**-126 */ + if ( ( hx & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( hx < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( hx, x ); + } + if ( hx >= 0x7f800000 ) return x + x; + k += ( hx >> 23 ) - 127; + i = ( ( u_int32_t )k & 0x80000000 ) >> 31; + hx = ( hx & 0x007fffff ) | ( ( 0x7f - i ) << 23 ); + y = ( float )( k + i ); + SET_FLOAT_WORD( x, hx ); + z = y * log10_2lo + ivln10 * __ieee754_logf( x ); + return z + y * log10_2hi; +} + + +/* e_logf.c -- float version of e_log.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +const float +#else +float +#endif +ln2_hi = 6.9313812256e-01f, /* 0x3f317180 */ +ln2_lo = 9.0580006145e-06f, /* 0x3717f7d1 */ +Lg1 = 6.6666668653e-01f, /* 3F2AAAAB */ +Lg2 = 4.0000000596e-01f, /* 3ECCCCCD */ +Lg3 = 2.8571429849e-01f, /* 3E924925 */ +Lg4 = 2.2222198546e-01f, /* 3E638E29 */ +Lg5 = 1.8183572590e-01f, /* 3E3A3325 */ +Lg6 = 1.5313838422e-01f, /* 3E1CD04F */ +Lg7 = 1.4798198640e-01f; /* 3E178897 */ + +#ifdef __STDC__ +float __ieee754_logf( float x ) +#else +float __ieee754_logf( x ) +float x; +#endif +{ + float hfsq, f, s, z, R, w, t1, t2, dk; + int32_t k, ix, i, j; + + GET_FLOAT_WORD( ix, x ); + + k = 0; + if ( ix < 0x00800000 ) { /* x < 2**-126 */ + if ( ( ix & 0x7fffffff ) == 0 ) + return -two25 / ( x - x ); /* log(+-0)=-inf */ + if ( ix < 0 ) return ( x - x ) / ( x - x ); /* log(-#) = NaN */ + k -= 25; + x *= two25; /* subnormal number, scale up x */ + GET_FLOAT_WORD( ix, x ); + } + if ( ix >= 0x7f800000 ) return x + x; + k += ( ix >> 23 ) - 127; + ix &= 0x007fffff; + i = ( ix + ( 0x95f64 << 3 ) ) & 0x800000; + SET_FLOAT_WORD( x, ix | ( i ^ 0x3f800000 ) ); /* normalize x or x/2 */ + k += ( i >> 23 ); + f = x - ( float )1.0; + if ( ( 0x007fffff & ( 15 + ix ) ) < 16 ) { /* |f| < 2**-20 */ + if ( f == zero ) { + if ( k == 0 ) return zero; + else { + dk = ( float )k; + return dk * ln2_hi + dk * ln2_lo; + } + } + R = f * f * ( ( float )0.5f - ( float )0.33333333333333333f * f ); + if ( k == 0 ) return f - R; + else { + dk = ( float )k; + return dk * ln2_hi - ( ( R - dk * ln2_lo ) - f ); + } + } + s = f / ( ( float )2.0f + f ); + dk = ( float )k; + z = s * s; + i = ix - ( 0x6147a << 3 ); + w = z * z; + j = ( 0x6b851 << 3 ) - ix; + t1 = w * ( Lg2 + w * ( Lg4 + w * Lg6 ) ); + t2 = z * ( Lg1 + w * ( Lg3 + w * ( Lg5 + w * Lg7 ) ) ); + i |= j; + R = t2 + t1; + if ( i > 0 ) { + hfsq = ( float )0.5f * f * f; + if ( k == 0 ) return f - ( hfsq - s * ( hfsq + R ) ); + else + return dk * ln2_hi - ( ( hfsq - ( s * ( hfsq + R ) + dk * ln2_lo ) ) - f ); + } else { + if ( k == 0 ) return f - s * ( f - R ); + else + return dk * ln2_hi - ( ( s * ( f - R ) - dk * ln2_lo ) - f ); + } +} + + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float __sinf( float x ) +#else +float __sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return __kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return __kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return __kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -__kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -__kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + + +/* Single-precision floating point e^x. + Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating + + The GNU C 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. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* How this works: + + The input value, x, is written as + + x = n * ln(2) + t/512 + delta[t] + x; + + where: + - n is an integer, 127 >= n >= -150; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n ( e^(t/512 + delta[t]) + + ( e^(t/512 + delta[t]) + ( p(x + delta[t] + n * ln(2)) - delta ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table. + + The table used is the same one as for the double precision version; + since we have the table, we might as well use it. + + It turns out to be faster to do calculations in double precision than + to perform an 'accurate table method' expf, because of the range reduction + overhead (compare exp2f). +*/ + + +const float __exp_deltatable[ 178 ] = { + 0.000000e+00, 1.436239e-11, -1.851323e-11, 1.250434e-12, + -4.382040e-10, 4.014913e-13, 6.324634e-12, 1.473544e-12, + -4.987366e-11, -1.752952e-12, 6.321584e-13, -3.260980e-12, + 2.777399e-12, -3.787255e-11, -2.182022e-13, -9.047329e-13, + 7.118903e-12, -3.555871e-13, -5.198906e-12, -4.124305e-13, + 1.940741e-12, 2.811727e-13, -2.117377e-13, 2.782236e-14, + 1.074722e-13, -8.844783e-13, -1.240327e-16, 7.052319e-13, + 6.447490e-13, 4.011210e-13, 5.462592e-13, 1.843201e-12, + -2.028864e-12, -2.931258e-13, 8.606021e-12, -5.626610e-13, + 1.295899e-13, -2.330782e-12, -5.478326e-13, 1.845989e-12, + -4.234531e-12, 1.735903e-12, 1.518525e-13, 2.535486e-12, + -4.674620e-13, -1.051410e-12, -1.666138e-12, -9.372511e-13, + 3.200735e-12, 2.292755e-12, 2.525703e-12, 5.823944e-13, + -9.789686e-13, 5.145901e-13, -4.527062e-12, -1.683974e-12, + 9.547877e-12, 2.078277e-13, -2.575768e-12, -1.026653e-12, + 8.179204e-13, 6.063405e-13, 3.908063e-13, -2.855789e-13, + -6.295203e-12, -2.709950e-13, 4.477842e-14, 4.821464e-13, + -5.566389e-13, 1.357999e-12, 7.670314e-13, -9.506315e-12, + -1.738782e-12, -8.637127e-13, -1.933394e-12, -1.267901e-13, + -4.426381e-13, 1.260695e-12, -3.277632e-12, -1.941204e-12, + -4.246588e-12, 2.948061e-12, -2.192153e-13, 1.066989e-12, + 3.009034e-13, 9.622095e-13, 2.332691e-13, -2.541789e-12, + -8.988149e-13, -1.005515e-12, 1.152009e-12, 2.547998e-12, + -8.128411e-12, -5.987095e-12, -1.230903e-12, 1.251520e-12, + -1.144099e-12, -1.419784e-14, 6.041652e-13, -2.428500e-13, + -6.869299e-12, 2.192179e-13, 3.987357e-13, -1.482881e-12, + 3.078380e-13, 5.226606e-12, -3.655583e-13, -7.399489e-13, + -2.937312e-13, 8.345330e-13, 8.291675e-13, 6.803750e-13, + -3.151692e-12, 1.975098e-12, -1.964634e-09, 1.060808e-12, + 5.123574e-12, 5.405112e-13, 4.460744e-12, 2.254359e-12, + 1.053220e-12, 4.224363e-12, 5.146482e-13, -5.005111e-14, + 6.731776e-12, -4.826085e-12, 1.779185e-12, 5.392274e-12, + 4.069803e-12, 5.218838e-13, -4.566578e-12, 9.349049e-13, + -2.780717e-12, 1.589945e-12, 1.805627e-12, -8.564009e-13, + -9.103265e-13, 1.747946e-12, 7.582737e-13, 1.880665e-12, + -1.509317e-12, -8.732831e-12, -1.582241e-14, -2.613867e-12, + 5.035911e-13, -2.209310e-12, -4.646361e-13, 1.926250e-12, + 1.114618e-12, 2.434626e-12, -8.526912e-13, -1.499753e-12, + -1.008729e-12, -2.222098e-12, 6.956137e-13, 2.119407e-13, + 1.250643e-12, -6.520809e-12, 2.357324e-13, -1.302915e-11, + -2.031004e-12, -7.972772e-13, 1.424409e-12, 4.138852e-12, + -1.058267e-12, -2.656184e-12, 5.452444e-13, 1.108587e-12, + 1.134814e-11, -9.126315e-12, 2.758479e-12, -1.439219e-12, + 3.073733e-12, 2.169448e-12, 3.600419e-15, -2.955518e-13, + -1.982464e-12, 2.164243e-12 +}; + +const double __exp_atable[ 355 ] /* __attribute__((mode(DF))) */ = { + 0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */ + 0.709106182438804188967, /* 0x0.b587fb96f75097ffb */ + 0.710492508843861281234, /* 0x0.b5e2d649899167ffd */ + 0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */ + 0.713273297897442870573, /* 0x0.b699142f945f87ffc */ + 0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */ + 0.716064970655995725059, /* 0x0.b75008aec758f8004 */ + 0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */ + 0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */ + 0.720272979947266023271, /* 0x0.b863cf5d10e380003 */ + 0.721681137825144314297, /* 0x0.b8c01855195c37ffb */ + 0.723092048691992950199, /* 0x0.b91c8f7d213740004 */ + 0.724505717938892290800, /* 0x0.b97934ec5002d0007 */ + 0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */ + 0.727341353138962865022, /* 0x0.ba330afcc29e98003 */ + 0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */ + 0.730188086709957051568, /* 0x0.baed9b40591ba0000 */ + 0.731615628948127705309, /* 0x0.bb4b296f931e30002 */ + 0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */ + 0.734479091556371366251, /* 0x0.bc06d25dd49568001 */ + 0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */ + 0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */ + 0.738795312814142124419, /* 0x0.bd21b08af98e78005 */ + 0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */ + 0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */ + 0.743136898669507939299, /* 0x0.be3e38443c84e0007 */ + 0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */ + 0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */ + 0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */ + 0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */ + 0.750429646104262104698, /* 0x0.c01c2843f776fffff */ + 0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */ + 0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */ + 0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */ + 0.756315338768691947122, /* 0x0.c19de1cd798578006 */ + 0.757793960659406629066, /* 0x0.c1fec8f623723fffd */ + 0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */ + 0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */ + 0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */ + 0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */ + 0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */ + 0.766726596071518051729, /* 0x0.c44831b719bf18002 */ + 0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */ + 0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */ + 0.771232322196981678892, /* 0x0.c56f7b41744490001 */ + 0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */ + 0.774250840160724651565, /* 0x0.c6354d95640dd0007 */ + 0.775764526565368872643, /* 0x0.c6988106fec447fff */ + 0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */ + 0.778800783068235302750, /* 0x0.c75f7cf560942fffc */ + 0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */ + 0.781848923151573727006, /* 0x0.c8274043594cb0002 */ + 0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */ + 0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */ + 0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */ + 0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */ + 0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */ + 0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */ + 0.792611669712891875319, /* 0x0.cae8992fd84667ffd */ + 0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */ + 0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */ + 0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */ + 0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */ + 0.800389937624300440456, /* 0x0.cce65ade24d360006 */ + 0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */ + 0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */ + 0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */ + 0.806667472122675088819, /* 0x0.ce81c26b838db8000 */ + 0.808244534127439906441, /* 0x0.cee91d213f8428002 */ + 0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */ + 0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */ + 0.812994243520784198882, /* 0x0.d0206407c20e20005 */ + 0.814583674571603966162, /* 0x0.d0888e4223facfff9 */ + 0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */ + 0.817771864936188586101, /* 0x0.d1597f377d6768002 */ + 0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */ + 0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */ + 0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */ + 0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */ + 0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */ + 0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */ + 0.829029118181348834154, /* 0x0.d43b40960546d8001 */ + 0.830649897953322891022, /* 0x0.d4a578c222a058000 */ + 0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */ + 0.833900969738858188772, /* 0x0.d57a88b1218e90002 */ + 0.835531274148056613016, /* 0x0.d5e560a94048f8006 */ + 0.837164765846411529371, /* 0x0.d6506e1aac8078003 */ + 0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */ + 0.840441336100884561780, /* 0x0.d72729d4c28518004 */ + 0.842084427144139224814, /* 0x0.d792d8530e12b0001 */ + 0.843730730487052604790, /* 0x0.d7febcb61273e7fff */ + 0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */ + 0.847032999194574087728, /* 0x0.d8d727962c69d7fff */ + 0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */ + 0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */ + 0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */ + 0.853676361342631029337, /* 0x0.da8a88b555baa0006 */ + 0.855345327311054837175, /* 0x0.daf7e94f965f98004 */ + 0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */ + 0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */ + 0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */ + 0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */ + 0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */ + 0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */ + 0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */ + 0.868815056264353846599, /* 0x0.de6aa9dced8448001 */ + 0.870513618890481399881, /* 0x0.ded9fb03db7320006 */ + 0.872215502247877139094, /* 0x0.df4983e1380657ff8 */ + 0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */ + 0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */ + 0.877341141814212965880, /* 0x0.e0996dd786fff0007 */ + 0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */ + 0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */ + 0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */ + 0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */ + 0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */ + 0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */ + 0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */ + 0.891157254447957902797, /* 0x0.e422e1bf727718006 */ + 0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */ + 0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */ + 0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */ + 0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */ + 0.899902594367530173098, /* 0x0.e660043464e378005 */ + 0.901661934163603406867, /* 0x0.e6d3510747e150006 */ + 0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */ + 0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */ + 0.906960617885092856864, /* 0x0.e82e92309390b0007 */ + 0.908733756358986566306, /* 0x0.e8a2c6845544afffa */ + 0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */ + 0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */ + 0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */ + 0.915861043547953501680, /* 0x0.ea75de8db8094fffe */ + 0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */ + 0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */ + 0.921243169397334638073, /* 0x0.ebd697a43995b0007 */ + 0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */ + 0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */ + 0.926656923710931002014, /* 0x0.ed39635df34e70006 */ + 0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */ + 0.930283756368834757725, /* 0x0.ee2713859aab57ffa */ + 0.932102492359406786818, /* 0x0.ee9e44d9342870004 */ + 0.933924784042873379360, /* 0x0.ef15b1d4635438005 */ + 0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */ + 0.937580062297704630580, /* 0x0.f0053f38f345cffff */ + 0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */ + 0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */ + 0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */ + 0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */ + 0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */ + 0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */ + 0.950486566729423554277, /* 0x0.f353166f63e3dffff */ + 0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */ + 0.954206665969085765512, /* 0x0.f446e357f66120000 */ + 0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */ + 0.957941325265908139014, /* 0x0.f53ba48781046fffb */ + 0.959814132734539637840, /* 0x0.f5b66106555d07ffa */ + 0.961690601603558903308, /* 0x0.f6315af2c2027fffc */ + 0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */ + 0.965454552202857141381, /* 0x0.f728078f7c5008002 */ + 0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */ + 0.969233234469444204768, /* 0x0.f81fab543e1897ffb */ + 0.971128118008140250896, /* 0x0.f89bda33122c78007 */ + 0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */ + 0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */ + 0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */ + 0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */ + 0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */ + 0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */ + 0.984496437054508843888, /* 0x0.fc07f5602d79afffc */ + 0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */ + 0.988349647107594098099, /* 0x0.fd047b83571b1fffa */ + 0.990281903873210800357, /* 0x0.fd831d66f4c018002 */ + 0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */ + 0.994157757657894713987, /* 0x0.fe811f703491e8006 */ + 0.996101369488558541238, /* 0x0.ff007fd5744490005 */ + 0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */ + 1.000000000000000000000, /* 0x1.00000000000000000 */ + 1.001955033605393285965, /* 0x1.0080200565d29ffff */ + 1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */ + 1.005876574715736104818, /* 0x1.01812090377240007 */ + 1.007843096764807100351, /* 0x1.020201541aad7fff6 */ + 1.009813464316352327214, /* 0x1.0283229c4c9820007 */ + 1.011787683565730677817, /* 0x1.030484836910a000e */ + 1.013765762469146736174, /* 0x1.0386272b9c077fffe */ + 1.015747708536026694351, /* 0x1.04080ab526304fff0 */ + 1.017733529475172815584, /* 0x1.048a2f412375ffff0 */ + 1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */ + 1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */ + 1.023714316605201180057, /* 0x1.06122436442e2000e */ + 1.025715712440059545995, /* 0x1.06954e0fec63afff2 */ + 1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */ + 1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */ + 1.031743407506447551857, /* 0x1.082056011a9230009 */ + 1.033760500517691527387, /* 0x1.08a487359ebd50002 */ + 1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */ + 1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */ + 1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */ + 1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */ + 1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */ + 1.045946142174331239262, /* 0x1.0bc3205a042060000 */ + 1.047991002016745332165, /* 0x1.0c4923682a086fffe */ + 1.050039859627715177527, /* 0x1.0ccf698898f3a000d */ + 1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */ + 1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */ + 1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */ + 1.058275424318780855142, /* 0x1.0eeb23619c146fffb */ + 1.060344388322010722446, /* 0x1.0f72bad65714bffff */ + 1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */ + 1.064494458915699715017, /* 0x1.1082b577d0eef0003 */ + 1.066575581342167566880, /* 0x1.110b18e893a90000a */ + 1.068660772440545025953, /* 0x1.1193c09c267610006 */ + 1.070750040138235936705, /* 0x1.121cacb4959befff6 */ + 1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */ + 1.074940837302467588937, /* 0x1.132f529d59552000b */ + 1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */ + 1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */ + 1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */ + 1.083371702785017154417, /* 0x1.1557d910df9c7000e */ + 1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */ + 1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */ + 1.089738217537583819804, /* 0x1.16f9157586772ffff */ + 1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */ + 1.094003332327482702577, /* 0x1.18109a360fc23fff2 */ + 1.096142145591650907149, /* 0x1.189cc58b155a70008 */ + 1.098285140311341168136, /* 0x1.1929370751ea50002 */ + 1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */ + 1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */ + 1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */ + 1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */ + 1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */ + 1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */ + 1.113403872669181282605, /* 0x1.1d0809445a97ffffc */ + 1.115580614653132185460, /* 0x1.1d96b0effc9db000e */ + 1.117761612217810673898, /* 0x1.1e25a001332190000 */ + 1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */ + 1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */ + 1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */ + 1.126528325196519908506, /* 0x1.2064290abc98c0001 */ + 1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */ + 1.130937432396844410880, /* 0x1.21851d95f776dfff0 */ + 1.133148453059692917203, /* 0x1.2216045b6784efffa */ + 1.135363796355857157764, /* 0x1.22a733a6692ae0004 */ + 1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */ + 1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */ + 1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */ + 1.144268564977221958089, /* 0x1.24eec8e06b035000c */ + 1.146505648458203463465, /* 0x1.258164e8cea85fff8 */ + 1.148747105501412235671, /* 0x1.26144a5180d380009 */ + 1.150992944689175123667, /* 0x1.26a7793f5de2efffa */ + 1.153243174560058870217, /* 0x1.273af1d712179000d */ + 1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */ + 1.157756840726344771440, /* 0x1.2862c097a3d29000c */ + 1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */ + 1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */ + 1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */ + 1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */ + 1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */ + 1.171404112007080167155, /* 0x1.2be123cf786790002 */ + 1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */ + 1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */ + 1.178287955789017793514, /* 0x1.2da4478b627040002 */ + 1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */ + 1.182899644456603782686, /* 0x1.2ed282d76421d0004 */ + 1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */ + 1.187529382762033236513, /* 0x1.3001ecf60082ffffa */ + 1.189851042595508889847, /* 0x1.309a13f30f28a0004 */ + 1.192177241354644978669, /* 0x1.31328716a758cfff7 */ + 1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */ + 1.196843291137896336843, /* 0x1.32645269dfd04000a */ + 1.199183159977805113226, /* 0x1.32fdaae604c39000f */ + 1.201527603343041317132, /* 0x1.339750219980dfff3 */ + 1.203876630171082595692, /* 0x1.3431424300e480007 */ + 1.206230249419600664189, /* 0x1.34cb8170b3fee000e */ + 1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */ + 1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */ + 1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */ + 1.215690830512196507537, /* 0x1.373783a718d29000f */ + 1.218067546930756250870, /* 0x1.37d3465662f480007 */ + 1.220448909901335365929, /* 0x1.386f56fa770fe0008 */ + 1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */ + 1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */ + 1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */ + 1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */ + 1.232425741726685064472, /* 0x1.3b8040df76f39fffa */ + 1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */ + 1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */ + 1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */ + 1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */ + 1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */ + 1.246953186383919165383, /* 0x1.3f3852f32973efff0 */ + 1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */ + 1.251833623164381181797, /* 0x1.40782b17863250005 */ + 1.254280999953110153911, /* 0x1.41188f42caf400000 */ + 1.256733161434815393410, /* 0x1.41b943b42945bfffd */ + 1.259190116985283935980, /* 0x1.425a4893e5f10000a */ + 1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */ + 1.264118447754797758244, /* 0x1.439d443f608c4fff9 */ + 1.266589841787181258708, /* 0x1.443f3b5bebf850008 */ + 1.269066067469190262045, /* 0x1.44e183883e561fff7 */ + 1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */ + 1.274033051628237434048, /* 0x1.462707b2c43020009 */ + 1.276523829025464573684, /* 0x1.46ca44023aa410007 */ + 1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */ + 1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */ + 1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */ + 1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */ + 1.289050950070396384145, /* 0x1.49ff3e396e19d000b */ + 1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */ + 1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */ + 1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */ + 1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */ + 1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */ + 1.304245874766450485904, /* 0x1.4de30ec21097d0003 */ + 1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */ + 1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */ + 1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */ + 1.314475201942565174546, /* 0x1.50817263bf0e5fffb */ + 1.317045045107389400535, /* 0x1.5129dd3418575000e */ + 1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */ + 1.322199813675649204855, /* 0x1.527bafde83a310009 */ + 1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */ + 1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */ + 1.329969819671041886272, /* 0x1.5478e6f02775e0001 */ + 1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */ + 1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */ + 1.337785486688218616860, /* 0x1.56791c1263abefff7 */ + 1.340400902247843806217, /* 0x1.57248376aef21fffa */ + 1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */ + 1.345647083048053138662, /* 0x1.587c53c5a630f0002 */ + 1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */ + 1.350913796821875845231, /* 0x1.59d57c9110ad60006 */ + 1.353554878672557082439, /* 0x1.5a8292913d68cfffc */ + 1.356201123929036356254, /* 0x1.5b2fff3212db00007 */ + 1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */ + 1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */ + 1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */ + 1.366837941171020309735, /* 0x1.5de9176042f1effff */ + 1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */ + 1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */ + 1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */ + 1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */ + 1.380251356531521533853, /* 0x1.6158272490016000c */ + 1.382949794301995272203, /* 0x1.6208ff6a8978a000f */ + 1.385653507605306700170, /* 0x1.62ba3032c0a280004 */ + 1.388362506772382154503, /* 0x1.636bb9a994784000f */ + 1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */ + 1.393796403973427855412, /* 0x1.64cfd7545928b0002 */ + 1.396521322756352656542, /* 0x1.65826be167badfff8 */ + 1.399251568859207761660, /* 0x1.663559cf20826000c */ + 1.401987152677323100733, /* 0x1.66e8a14a29486fffc */ + 1.404728084651919228815, /* 0x1.679c427f5a4b6000b */ + 1.407474375243217723560, /* 0x1.68503d9ba0add000f */ + 1.410226034922914983815, /* 0x1.690492cbf6303fff9 */ + 1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */ +}; + +const volatile float TWOM100 = 7.88860905e-31; +const volatile float TWO127 = 1.7014118346e+38; + + +unsigned long _randseed = 1; + +void srandom( unsigned long seed ) +{ + _randseed = seed; +} + +unsigned long random( void ) +{ + long x, hi, lo, t; + + /* + Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + From "Random number generators: good ones are hard to find", + Park and Miller, Communications of the ACM, vol. 31, no. 10, + October 1988, p. 1195. + */ + x = _randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if ( t <= 0 ) + t += 0x7fffffff; + _randseed = t; + return ( t ); +} + + +/* s_ceilf.c -- float version of s_ceil.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +char rcsid[] = "$NetBSD: s_ceilf.c,v 1.4 1995/05/10 20:46:55 jtc Exp $"; +#endif + +#ifdef __STDC__ +float __ceilf( float x ) +#else +float __ceilf( x ) +float x; +#endif +{ + int32_t i0, j0; + u_int32_t i; + + GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { /* raise inexact if x != 0 */ + if ( huge + x > ( float )0.0 ) { /* return 0*sign(x) if |x|<1 */ + if ( i0 < 0 ) + i0 = 0x80000000; + else + if ( i0 != 0 ) + i0 = 0x3f800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; /* x is integral */ + if ( huge + x > ( float )0.0 ) { /* raise inexact flag */ + if ( i0 > 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; /* inf or NaN */ + else return x; /* x is integral */ + } + SET_FLOAT_WORD( x, i0 ); + return x; +} diff --git a/targets/wasm-tacle/parallel/rosace/thread5/math_private.h b/targets/wasm-tacle/parallel/rosace/thread5/math_private.h new file mode 100644 index 0000000..47f9137 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/math_private.h @@ -0,0 +1,68 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: math_private.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: fdlibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +/* A union which permits us to convert between a float and a 32 bit int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = ( d ); \ + ( i ) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD( d, i ) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = ( i ); \ + ( d ) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/parallel/rosace/thread5/multirate_precedence.h b/targets/wasm-tacle/parallel/rosace/thread5/multirate_precedence.h new file mode 100644 index 0000000..f1e7071 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/multirate_precedence.h @@ -0,0 +1,65 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: multirate_precedence.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: multirate_precedence.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + + +#ifndef _multirate_precedence_H +#define _multirate_precedence_H +#include +// Description of a precedence between two tasks of different rates + +struct job_prec { + int src_job; + int dst_job; +}; + +struct multirate_precedence { + char *src_name; + char *dst_name; + int prec_pref_size; + int prec_pat_size; + struct job_prec *prec_pref; + struct job_prec *prec_pat; +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/nonencoded_task_params.h b/targets/wasm-tacle/parallel/rosace/thread5/nonencoded_task_params.h new file mode 100644 index 0000000..fa67d94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/nonencoded_task_params.h @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: nonencoded_task_params.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: nonencoded_task_params.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _nonencoded_task_params_H +#define _nonencoded_task_params_H +#define NULL ((void*)0) +// Description of a real time task, without precedence encoding. + +struct nonencoded_task_params { + char *ne_t_name; + int ne_t_period; + int ne_t_initial_release; + int ne_t_wcet; + int ne_t_deadline; + int ( *ne_t_body )( void * ); // This is the code to execute at each + // instance of the task. +}; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/ros_th5.c b/targets/wasm-tacle/parallel/rosace/thread5/ros_th5.c new file mode 100644 index 0000000..5f0aa9f --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/ros_th5.c @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: ros_th5 + + Author: Dustin Green and others + + Function: executes the fifth thread of original threads.c + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/c_posix_implementation/ + + Original name: threads, rosace + + Changes: union of rosace.c and threads.c + + License: see above + +*/ + +#include "types.h" +#include "assemblage_includes.h" +#include "assemblage.h" +#include "common.h" + + +// Return variable +int ros_th5_check; + + +/* + Forward declaration of functions +*/ + +void* ros_th5_thread5( void* arg ); +int ros_th5_run_rosace( uint64_t nbstep ); +int main( void ); +void ros_th5_init( void ); +void ros_th5_main( void ); +int ros_th5_return( void ); + + +/* + Initialization function +*/ + +void ros_th5_init( void ) +{ + ros_th5_check = -1; + rosace_init(); +} + + +/* + Return function +*/ + +int ros_th5_return( void ) +{ + return ros_th5_check; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) ros_th5_main( void ) +{ + uint64_t tsimu = 300*200; + ros_th5_check = ros_th5_run_rosace( tsimu ); +} + + +int ros_th5_run_rosace( uint64_t nbstep ){ + max_step_simu = nbstep; + // Set first command + ROSACE_update_altitude_command( 11000.0 ); + + // Exit + ros_th5_thread5( NULL ); + return 0; +} + + +void* ros_th5_thread5( void* arg ) { + uint64_t mystep_simu = step_simu; + + _Pragma( "loopbound min 60000 max 60000" ) + while( mystep_simu < max_step_simu ) { + // --- 100 Hz --- + if( mystep_simu % 2 == 0 ) { + CALL( AZ_FILTER ); + } + // --- End 100 Hz --- + mystep_simu++; + } + return NULL; +} + + +int main( void ) +{ + ros_th5_init(); + + ros_th5_main(); + + return ros_th5_return(); +} diff --git a/targets/wasm-tacle/parallel/rosace/thread5/types.h b/targets/wasm-tacle/parallel/rosace/thread5/types.h new file mode 100644 index 0000000..0d7902f --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/types.h @@ -0,0 +1,73 @@ +/* ---------------------------------------------------------------------------- + SchedMCore - A MultiCore Scheduling Framework + Copyright (C) 2009-2011, ONERA, Toulouse, FRANCE - LIFL, Lille, FRANCE + + This file is part of Prelude + + Prelude 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. + + Prelude 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 + ---------------------------------------------------------------------------- */ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: types.h + + Author: Unknown + + Function: + + Source: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/ + c_posix_implementation/ + + Original name: types.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef __DEF_ROSACE_TYPES_H +#define __DEF_ROSACE_TYPES_H + +#ifdef USE_FLOAT +#define REAL_TYPE float +#else +#define REAL_TYPE double +#endif + +typedef unsigned long long uint64_t; + +/* we need forward declaration only in order + * to avoid redefinition in assemblage_vX generated headers + * Real "#include "assemblage.h" is only done in assemblage_includes.c + */ +struct aircraft_dynamics_outs_t { + REAL_TYPE Va; + REAL_TYPE Vz; + REAL_TYPE q; + REAL_TYPE az; + REAL_TYPE h; +}; + +typedef enum SAMPLE_RANK { + SPL_T, SPL_VA,SPL_AZ,SPL_Q,SPL_VZ,SPL_H, + SPL_DELTA_TH_C, SPL_DELTA_E_C, + SPL_SIZE +} SampleRank_t; + +#endif diff --git a/targets/wasm-tacle/parallel/rosace/thread5/wcclibm.h b/targets/wasm-tacle/parallel/rosace/thread5/wcclibm.h new file mode 100644 index 0000000..ac30a94 --- /dev/null +++ b/targets/wasm-tacle/parallel/rosace/thread5/wcclibm.h @@ -0,0 +1,85 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.9 + + Name: wcclibm.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: wcclibm.h + + Changes: No major functional changes. + + License: See the terms above. + +*/ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define u_int32_t unsigned int + +// Often used variables/consts +static const float basicmath_one = 1.0f, + basicmath_tiny = 1.0e-30f, + basicmath_half = 5.0000000000e-01, /* 0x3f000000 */ + basicmath_huge = 1.0e30, + basicmath_two = 2.0, + basicmath_two24 = 16777216.0, /* 0x4b800000 */ + basicmath_zero = 0.0; + +#define __ieee754_acosf acosf +#define __atanf atanf +#define __ceilf ceilf +#define __cosf cosf +#define __fabsf fabsf +#define __isinff isinff +#define __ieee754_expf expf +#define __erff erff +#define __ieee754_powf powf +#define __ieee754_sqrtf sqrtf +#define __ieee754_log10f log10f +#define __ieee754_logf logf +#define __sinf sinf +#define __floorf floorf + + +float __atanf(float x); +float __ceilf(float x); +static float __copysignf(float x, float y); +float __cosf(float x); +float __erff(float x); +float __fabsf(float x); +float __floorf(float x); +float __ieee754_acosf(float x); +float __ieee754_expf(float x); +float __ieee754_logf(float x); +float __ieee754_log10f(float x); +float __ieee754_powf(float x, float y); +static int32_t __ieee754_rem_pio2f(float x, float *y); +float __ieee754_sqrtf(float x); +int __isinff(float x); +static float __kernel_cosf(float x, float y); +static float __kernel_sinf(float x, float y, int iy); +static int __kernel_rem_pio2f(float *x, float *y, int e0, int nx, + int prec, const int32_t *ipio2); +float __sinf(float x); +float __scalbnf(float x, int n); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/adpcm_dec/CMakeLists.txt b/targets/wasm-tacle/sequential/adpcm_dec/CMakeLists.txt new file mode 100644 index 0000000..58f2c2d --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_dec/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(adpcm_dec) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/adpcm_dec.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/adpcm_dec.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/adpcm_dec/ChangeLog.txt b/targets/wasm-tacle/sequential/adpcm_dec/ChangeLog.txt new file mode 100755 index 0000000..b9c4f96 --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_dec/ChangeLog.txt @@ -0,0 +1,32 @@ +File: minver.c +Original provenience: SNU-RT Benchmark Suite for Worst Case Timing Analysis + +2016-02-26: + - Added TACLeBench header to line 1 + - Rename global variable a to minver_a + - Rename global variable b to minver_b + - Rename global variable c to minver_c + - Rename global variable aa to minver_aa + - Rename global variable a_i to minver_a_i + - Rename global variable e to minver_e + - Rename global variable det to minver_det + - Renamed function minver to minver_minver + - Renamed function mmul to minver_mmul + - Renamed function fabs to minver_fabs + - Renamed function main to minver_main + - Created new function main, calling minver_init, minver_main and + returning minver_return + - Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + functions, followed by main functions + - Applied code formatting with astyle as in the example + +2016-03-09: + - Removed static keyword for global variables + - Renamed global variables, prepended adpcm_dec + + 2016-05-23: + - Check sum added and checked against the expected value + + 2016-05-25: + - Corrected expected value \ No newline at end of file diff --git a/targets/wasm-tacle/sequential/adpcm_dec/adpcm_dec.c b/targets/wasm-tacle/sequential/adpcm_dec/adpcm_dec.c new file mode 100755 index 0000000..5284bfa --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_dec/adpcm_dec.c @@ -0,0 +1,710 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: adpcm_dec + + Author: Sung-Soo Lim + + Function: + CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) + algorithm. + 16khz sample rate data is stored in the array test_data[ SIZE ]. + Results are stored in the array compressed[ SIZE ] and result[ SIZE ]. + Execution time is determined by the constant SIZE (default value + is 2000). + + Source: SNU-RT Benchmark Suite + + Changes: adpcm benchmark was split into decode and encode benchmark + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + Original source: C Algorithms for Real-Time DSP by P. M. Embree +*/ + +/* + Forward declaration of functions +*/ + +void adpcm_dec_decode( int ); +int adpcm_dec_filtez( int *bpl, int *dlt ); +void adpcm_dec_upzero( int dlt, int *dlti, int *bli ); +int adpcm_dec_filtep( int rlt1, int al1, int rlt2, int al2 ); + +int adpcm_dec_logscl( int il, int nbl ); +int adpcm_dec_scalel( int nbl, int shift_constant ); +int adpcm_dec_uppol2( int al1, int al2, int plt, int plt1, int plt2 ); +int adpcm_dec_uppol1( int al1, int apl2, int plt, int plt1 ); + +int adpcm_dec_logsch( int ih, int nbh ); +void adpcm_dec_reset(); +int adpcm_dec_fabs( int n ); +int adpcm_dec_cos( int n ); +int adpcm_dec_sin( int n ); + +void adpcm_dec_init(); +int adpcm_dec_return(); +void adpcm_dec_main(); +int main( void ); + + +/* + Declaration of macros +*/ +/* common sampling rate for sound cards on IBM/PC */ +#define SAMPLE_RATE 11025 +#define PI 3141 +#define SIZE 3 +#define IN_END 4 + +/* + Declaration of global variables +*/ + +int adpcm_dec_test_data[ SIZE * 2 ], adpcm_dec_result[ SIZE * 2 ]; + +/* Input data for the decoder usually generated by the encoder. */ +int adpcm_dec_compressed[ SIZE ] = { 0, 253, 32 }; + +/* G722 C code */ + +/* QMF filter coefficients: + scaled by a factor of 4 compared to G722 CCITT recommendation */ +int adpcm_dec_h[ 24 ] = { + 12, -44, -44, 212, 48, -624, 128, 1448, + -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, + 1448, 128, -624, 48, 212, -44, -44, 12 +}; + +//int xl,xh; + +/* variables for receive quadrature mirror filter here */ +int adpcm_dec_accumc[ 11 ], adpcm_dec_accumd[ 11 ]; + +/* outputs of decode() */ +int adpcm_dec_xout1, adpcm_dec_xout2; + +int adpcm_dec_xs, adpcm_dec_xd; + +/* variables for encoder (hi and lo) here */ + +int adpcm_dec_il, adpcm_dec_szl, adpcm_dec_spl, adpcm_dec_sl, adpcm_dec_el; + +int adpcm_dec_qq4_code4_table[ 16 ] = { + 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, + 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0 +}; + + +int adpcm_dec_qq6_code6_table[ 64 ] = { + -136, -136, -136, -136, -24808, -21904, -19008, -16704, + -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, + -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, + -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, + 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, + 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, + 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, + 1688, 1360, 1040, 728, 432, 136, -432, -136 + }; + + +int adpcm_dec_wl_code_table[ 16 ] = { + -60, 3042, 1198, 538, 334, 172, 58, -30, + 3042, 1198, 538, 334, 172, 58, -30, -60 + }; + + +int adpcm_dec_ilb_table[ 32 ] = { + 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, + 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, + 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, + 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008 +}; + +int adpcm_dec_nbl; /* delay line */ +int adpcm_dec_al1, adpcm_dec_al2; +int adpcm_dec_plt, adpcm_dec_plt1, adpcm_dec_plt2; +int adpcm_dec_rs; +int adpcm_dec_dlt; +int adpcm_dec_rlt, adpcm_dec_rlt1, adpcm_dec_rlt2; + + +int adpcm_dec_detl; + + +int adpcm_dec_deth; +int adpcm_dec_sh; /* this comes from adaptive predictor */ +int adpcm_dec_eh; + +int adpcm_dec_qq2_code2_table[ 4 ] = { + -7408, -1616, 7408, 1616 + }; + +int adpcm_dec_wh_code_table[ 4 ] = { + 798, -214, 798, -214 +}; + + +int adpcm_dec_dh, adpcm_dec_ih; +int adpcm_dec_nbh, adpcm_dec_szh; +int adpcm_dec_sph, adpcm_dec_ph, adpcm_dec_yh, adpcm_dec_rh; + +int adpcm_dec_delay_dhx[ 6 ]; + +int adpcm_dec_delay_bph[ 6 ]; + +int adpcm_dec_ah1, adpcm_dec_ah2; +int adpcm_dec_ph1, adpcm_dec_ph2; +int adpcm_dec_rh1, adpcm_dec_rh2; + +/* variables for decoder here */ +int adpcm_dec_ilr, adpcm_dec_yl, adpcm_dec_rl; +int adpcm_dec_dec_deth, adpcm_dec_dec_detl, adpcm_dec_dec_dlt; + +int adpcm_dec_dec_del_bpl[ 6 ]; + +int adpcm_dec_dec_del_dltx[ 6 ]; + +int adpcm_dec_dec_plt, adpcm_dec_dec_plt1, adpcm_dec_dec_plt2; +int adpcm_dec_dec_szl, adpcm_dec_dec_spl, adpcm_dec_dec_sl; +int adpcm_dec_dec_rlt1, adpcm_dec_dec_rlt2, adpcm_dec_dec_rlt; +int adpcm_dec_dec_al1, adpcm_dec_dec_al2; +int adpcm_dec_dl; +int adpcm_dec_dec_nbl, adpcm_dec_dec_yh, adpcm_dec_dec_dh, adpcm_dec_dec_nbh; + +/* variables used in filtez */ +int adpcm_dec_dec_del_bph[ 6 ]; + +int adpcm_dec_dec_del_dhx[ 6 ]; + +int adpcm_dec_dec_szh; +/* variables used in filtep */ +int adpcm_dec_dec_rh1, adpcm_dec_dec_rh2; +int adpcm_dec_dec_ah1, adpcm_dec_dec_ah2; +int adpcm_dec_dec_ph, adpcm_dec_dec_sph; + +int adpcm_dec_dec_sh, adpcm_dec_dec_rh; + +int adpcm_dec_dec_ph1, adpcm_dec_dec_ph2; + + +/* + Arithmetic math functions +*/ + + +/* MAX: 1 */ +int adpcm_dec_fabs( int n ) +{ + int f; + + + if ( n >= 0 ) + f = n; + else + f = -n; + + return f; +} + + +int adpcm_dec_sin( int rad ) +{ + int diff; + int app = 0; + int inc = 1; + + + /* MAX dependent on rad's value, say 50 */ + _Pragma( "loopbound min 0 max 0" ) + while ( rad > 2 * PI ) + rad -= 2 * PI; + + _Pragma( "loopbound min 0 max 1999" ) + while ( rad < -2 * PI ) + rad += 2 * PI; + + diff = rad; + app = diff; + diff = ( diff * ( -( rad * rad ) ) ) / ( ( 2 * inc ) * ( 2 * inc + 1 ) ); + app = app + diff; + inc++; + + /* REALLY: while(my_fabs(diff) >= 0.00001) { */ + /* MAX: 1000 */ + _Pragma( "loopbound min 849 max 2424" ) + while ( adpcm_dec_fabs( diff ) >= 1 ) { + diff = ( diff * ( -( rad * rad ) ) ) / ( ( 2 * inc ) * ( 2 * inc + 1 ) ); + app = app + diff; + inc++; + } + + return app; +} + + +int adpcm_dec_cos( int rad ) +{ + return ( adpcm_dec_sin( PI / 2 - rad ) ); +} + + +/* + Algorithm core functions +*/ + +/* decode function, result in xout1 and xout2 */ +void adpcm_dec_decode( int input ) +{ + int i; + long int xa1, xa2; /* qmf accumulators */ + int *h_ptr, *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1; + + + /* split transmitted word from input into ilr and ih */ + adpcm_dec_ilr = input & 0x3f; + adpcm_dec_ih = input >> 6; + + /* LOWER SUB_BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + adpcm_dec_dec_szl = adpcm_dec_filtez( adpcm_dec_dec_del_bpl, + adpcm_dec_dec_del_dltx ); + + /* filtep: compute predictor output signal for pole section */ + adpcm_dec_dec_spl = adpcm_dec_filtep( adpcm_dec_dec_rlt1, adpcm_dec_dec_al1, + adpcm_dec_dec_rlt2, adpcm_dec_dec_al2 ); + + adpcm_dec_dec_sl = adpcm_dec_dec_spl + adpcm_dec_dec_szl; + + /* invqxl: compute quantized difference signal for adaptive predic */ + adpcm_dec_dec_dlt = ( ( long )adpcm_dec_dec_detl * + adpcm_dec_qq4_code4_table[ adpcm_dec_ilr + >> 2 ] ) >> 15; + + /* invqxl: compute quantized difference signal for decoder output */ + adpcm_dec_dl = ( ( long )adpcm_dec_dec_detl * + adpcm_dec_qq6_code6_table[ adpcm_dec_il ] ) >> + 15; + + adpcm_dec_rl = adpcm_dec_dl + adpcm_dec_dec_sl; + + /* logscl: quantizer scale factor adaptation in the lower sub-band */ + adpcm_dec_dec_nbl = adpcm_dec_logscl( adpcm_dec_ilr, adpcm_dec_dec_nbl ); + + /* scalel: computes quantizer scale factor in the lower sub band */ + adpcm_dec_dec_detl = adpcm_dec_scalel( adpcm_dec_dec_nbl, 8 ); + + /* parrec - add pole predictor output to quantized diff. signal */ + /* for partially reconstructed signal */ + adpcm_dec_dec_plt = adpcm_dec_dec_dlt + adpcm_dec_dec_szl; + + /* upzero: update zero section predictor coefficients */ + adpcm_dec_upzero( adpcm_dec_dec_dlt, adpcm_dec_dec_del_dltx, + adpcm_dec_dec_del_bpl ); + + /* uppol2: update second predictor coefficient apl2 and delay it as al2 */ + adpcm_dec_dec_al2 = adpcm_dec_uppol2( adpcm_dec_dec_al1, adpcm_dec_dec_al2, + adpcm_dec_dec_plt, adpcm_dec_dec_plt1, + adpcm_dec_dec_plt2 ); + + /* uppol1: update first predictor coef. (pole setion) */ + adpcm_dec_dec_al1 = adpcm_dec_uppol1( adpcm_dec_dec_al1, adpcm_dec_dec_al2, + adpcm_dec_dec_plt, adpcm_dec_dec_plt1 ); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_dec_dec_rlt = adpcm_dec_dec_sl + adpcm_dec_dec_dlt; + + /* done with lower sub band decoder, implement delays for next time */ + adpcm_dec_dec_rlt2 = adpcm_dec_dec_rlt1; + adpcm_dec_dec_rlt1 = adpcm_dec_dec_rlt; + adpcm_dec_dec_plt2 = adpcm_dec_dec_plt1; + adpcm_dec_dec_plt1 = adpcm_dec_dec_plt; + + /* HIGH SUB-BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + adpcm_dec_dec_szh = adpcm_dec_filtez( adpcm_dec_dec_del_bph, + adpcm_dec_dec_del_dhx ); + + /* filtep: compute predictor output signal for pole section */ + adpcm_dec_dec_sph = adpcm_dec_filtep( adpcm_dec_dec_rh1, adpcm_dec_dec_ah1, + adpcm_dec_dec_rh2, adpcm_dec_dec_ah2 ); + + /* predic:compute the predictor output value in the higher sub_band decoder */ + adpcm_dec_dec_sh = adpcm_dec_dec_sph + adpcm_dec_dec_szh; + + /* invqah: in-place compute the quantized difference signal */ + adpcm_dec_dec_dh = ( ( long )adpcm_dec_dec_deth * + adpcm_dec_qq2_code2_table[ adpcm_dec_ih ] ) >> 15L ; + + /* logsch: update logarithmic quantizer scale factor in hi sub band */ + adpcm_dec_dec_nbh = adpcm_dec_logsch( adpcm_dec_ih, adpcm_dec_dec_nbh ); + + /* scalel: compute the quantizer scale factor in the higher sub band */ + adpcm_dec_dec_deth = adpcm_dec_scalel( adpcm_dec_dec_nbh, 10 ); + + /* parrec: compute partially recontructed signal */ + adpcm_dec_dec_ph = adpcm_dec_dec_dh + adpcm_dec_dec_szh; + + /* upzero: update zero section predictor coefficients */ + adpcm_dec_upzero( adpcm_dec_dec_dh, adpcm_dec_dec_del_dhx, + adpcm_dec_dec_del_bph ); + + /* uppol2: update second predictor coefficient aph2 and delay it as ah2 */ + adpcm_dec_dec_ah2 = adpcm_dec_uppol2( adpcm_dec_dec_ah1, adpcm_dec_dec_ah2, + adpcm_dec_dec_ph, adpcm_dec_dec_ph1, adpcm_dec_dec_ph2 ); + + /* uppol1: update first predictor coef. (pole setion) */ + adpcm_dec_dec_ah1 = adpcm_dec_uppol1( adpcm_dec_dec_ah1, adpcm_dec_dec_ah2, + adpcm_dec_dec_ph, adpcm_dec_dec_ph1 ); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_dec_rh = adpcm_dec_dec_sh + adpcm_dec_dec_dh; + + /* done with high band decode, implementing delays for next time here */ + adpcm_dec_dec_rh2 = adpcm_dec_dec_rh1; + adpcm_dec_dec_rh1 = adpcm_dec_rh; + adpcm_dec_dec_ph2 = adpcm_dec_dec_ph1; + adpcm_dec_dec_ph1 = adpcm_dec_dec_ph; + + /* end of higher sub_band decoder */ + + /* end with receive quadrature mirror filters */ + adpcm_dec_xd = adpcm_dec_rl - adpcm_dec_rh; + adpcm_dec_xs = adpcm_dec_rl + adpcm_dec_rh; + + /* receive quadrature mirror filters implemented here */ + h_ptr = adpcm_dec_h; + ac_ptr = adpcm_dec_accumc; + ad_ptr = adpcm_dec_accumd; + xa1 = ( long ) adpcm_dec_xd * ( *h_ptr++ ); + xa2 = ( long ) adpcm_dec_xs * ( *h_ptr++ ); + + /* main multiply accumulate loop for samples and coefficients */ + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < 10; i++ ) { + xa1 += ( long )( *ac_ptr++ ) * ( *h_ptr++ ); + xa2 += ( long )( *ad_ptr++ ) * ( *h_ptr++ ); + } + + /* final mult/accumulate */ + xa1 += ( long )( *ac_ptr ) * ( *h_ptr++ ); + xa2 += ( long )( *ad_ptr ) * ( *h_ptr++ ); + + /* scale by 2^14 */ + adpcm_dec_xout1 = xa1 >> 14; + adpcm_dec_xout2 = xa2 >> 14; + + /* update delay lines */ + ac_ptr1 = ac_ptr - 1; + ad_ptr1 = ad_ptr - 1; + + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < 10; i++ ) { + *ac_ptr-- = *ac_ptr1--; + *ad_ptr-- = *ad_ptr1--; + } + + *ac_ptr = adpcm_dec_xd; + *ad_ptr = adpcm_dec_xs; + + return; +} + + +/* filtez - compute predictor output signal (zero section) */ +/* input: bpl1-6 and dlt1-6, output: szl */ +int adpcm_dec_filtez( int *bpl, int *dlt ) +{ + int i; + long int zl; + + + zl = ( long )( *bpl++ ) * ( *dlt++ ); + + /* MAX: 5 */ + _Pragma( "loopbound min 5 max 5" ) + for ( i = 1; i < 6; i++ ) + zl += ( long )( *bpl++ ) * ( *dlt++ ); + + return ( ( int )( zl >> 14 ) ); /* x2 here */ +} + + +/* filtep - compute predictor output signal (pole section) */ +/* input rlt1-2 and al1-2, output spl */ +int adpcm_dec_filtep( int rlt1, int al1, int rlt2, int al2 ) +{ + long int pl, pl2; + + + pl = 2 * rlt1; + pl = ( long ) al1 * pl; + pl2 = 2 * rlt2; + pl += ( long ) al2 * pl2; + + return ( ( int )( pl >> 15 ) ); +} + + +/* logscl - update log quantizer scale factor in lower sub-band */ +/* note that nbl is passed and returned */ +int adpcm_dec_logscl( int il, int nbl ) +{ + long int wd; + + + wd = ( ( long )nbl * 127L ) >> 7L; /* leak factor 127/128 */ + nbl = ( int )wd + adpcm_dec_wl_code_table[ il >> 2 ]; + + if ( nbl < 0 ) + nbl = 0; + if ( nbl > 18432 ) + nbl = 18432; + + return ( nbl ); +} + + +/* scalel: compute quantizer scale factor in lower or upper sub-band*/ +int adpcm_dec_scalel( int nbl, int shift_constant ) +{ + int wd1, wd2, wd3; + + + wd1 = ( nbl >> 6 ) & 31; + wd2 = nbl >> 11; + wd3 = adpcm_dec_ilb_table[ wd1 ] >> ( shift_constant + 1 - wd2 ); + + return ( wd3 << 3 ); +} + + +/* upzero - inputs: dlt, dlti[ 0-5 ], bli[ 0-5 ], outputs: updated bli[ 0-5 ] */ +/* also implements delay of bli and update of dlti from dlt */ +void adpcm_dec_upzero( int dlt, int *dlti, int *bli ) +{ + int i, wd2, wd3; + + + /*if dlt is zero, then no sum into bli */ + if ( dlt == 0 ) { + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + bli[ i ] = ( int )( ( 255L * bli[ i ] ) >> 8L ); /* leak factor of 255/256 */ + } + + } else { + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + if ( ( long )dlt * dlti[ i ] >= 0 ) + wd2 = 128; + else + wd2 = -128; + + wd3 = ( int )( ( 255L * bli[ i ] ) >> 8L ); /* leak factor of 255/256 */ + bli[ i ] = wd2 + wd3; + } + + } + + /* implement delay line for dlt */ + dlti[ 5 ] = dlti[ 4 ]; + dlti[ 4 ] = dlti[ 3 ]; + dlti[ 3 ] = dlti[ 2 ]; + dlti[ 1 ] = dlti[ 0 ]; + dlti[ 0 ] = dlt; + + return; +} + + +/* uppol2 - update second predictor coefficient (pole section) */ +/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ +int adpcm_dec_uppol2( int al1, int al2, int plt, int plt1, int plt2 ) +{ + long int wd2, wd4; + int apl2; + + + wd2 = 4L * ( long )al1; + if ( ( long )plt * plt1 >= 0L ) + wd2 = -wd2; /* check same sign */ + wd2 = wd2 >> 7; /* gain of 1/128 */ + + if ( ( long )plt * plt2 >= 0L ) { + wd4 = wd2 + 128; /* same sign case */ + } else + wd4 = wd2 - 128; + apl2 = wd4 + ( 127L * ( long )al2 >> 7L ); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ + if ( apl2 > 12288 ) + apl2 = 12288; + if ( apl2 < -12288 ) + apl2 = -12288; + + return ( apl2 ); +} + + +/* uppol1 - update first predictor coefficient (pole section) */ +/* inputs: al1, apl2, plt, plt1. outputs: apl1 */ +int adpcm_dec_uppol1( int al1, int apl2, int plt, int plt1 ) +{ + long int wd2; + int wd3, apl1; + + + wd2 = ( ( long )al1 * 255L ) >> 8L; /* leak factor of 255/256 */ + if ( ( long )plt * plt1 >= 0L ) { + apl1 = ( int )wd2 + 192; /* same sign case */ + } else + apl1 = ( int )wd2 - 192; + + /* note: wd3= .9375-.75 is always positive */ + wd3 = 15360 - apl2; /* limit value */ + if ( apl1 > wd3 ) + apl1 = wd3; + if ( apl1 < -wd3 ) + apl1 = -wd3; + + return ( apl1 ); +} + + +/* logsch - update log quantizer scale factor in higher sub-band */ +/* note that nbh is passed and returned */ +int adpcm_dec_logsch( int ih, int nbh ) +{ + int wd; + + + wd = ( ( long )nbh * 127L ) >> 7L; /* leak factor 127/128 */ + nbh = wd + adpcm_dec_wh_code_table[ ih ]; + + if ( nbh < 0 ) + nbh = 0; + if ( nbh > 22528 ) + nbh = 22528; + + return ( nbh ); +} + +/* + Initialization- and return-value-related functions +*/ + +/* clear all storage locations */ + +void adpcm_dec_reset() +{ + int i; + + + adpcm_dec_detl = adpcm_dec_dec_detl = 32; /* reset to min scale factor */ + adpcm_dec_deth = adpcm_dec_dec_deth = 8; + adpcm_dec_nbl = adpcm_dec_al1 = adpcm_dec_al2 = adpcm_dec_plt1 = adpcm_dec_plt2 + = adpcm_dec_rlt1 = adpcm_dec_rlt2 = 0; + adpcm_dec_nbh = adpcm_dec_ah1 = adpcm_dec_ah2 = adpcm_dec_ph1 = adpcm_dec_ph2 = + adpcm_dec_rh1 = adpcm_dec_rh2 = 0; + adpcm_dec_dec_nbl = adpcm_dec_dec_al1 = adpcm_dec_dec_al2 = adpcm_dec_dec_plt1 = + adpcm_dec_dec_plt2 = adpcm_dec_dec_rlt1 = adpcm_dec_dec_rlt2 = 0; + adpcm_dec_dec_nbh = adpcm_dec_dec_ah1 = adpcm_dec_dec_ah2 = adpcm_dec_dec_ph1 = + adpcm_dec_dec_ph2 = adpcm_dec_dec_rh1 = adpcm_dec_dec_rh2 = 0; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + ////delay_dltx[ i ] = 0; + adpcm_dec_delay_dhx[ i ] = 0; + adpcm_dec_dec_del_dltx[ i ] = 0; + adpcm_dec_dec_del_dhx[ i ] = 0; + } + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + //delay_bpl[ i ] = 0; + adpcm_dec_delay_bph[ i ] = 0; + adpcm_dec_dec_del_bpl[ i ] = 0; + adpcm_dec_dec_del_bph[ i ] = 0; + } + + _Pragma( "loopbound min 11 max 11" ) + for ( i = 0; i < 11; i++ ) { + adpcm_dec_accumc[ i ] = 0; + adpcm_dec_accumd[ i ] = 0; + } + + return; +} + +void adpcm_dec_init() +{ + int i, j, f; + volatile int x = 0; + /* read in amplitude and frequency for test data */ + j = 10; + f = 2000; + + /* reset, initialize required memory */ + adpcm_dec_reset(); + + /* 16 KHz sample rate */ + /* XXmain_0, MAX: 2 */ + /* Since the number of times we loop in adpcm_dec_sin depends on the + argument we add the fact: xxmain_0:[ ]: */ + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0 ; i < SIZE ; i++ ) { + adpcm_dec_test_data[ i ] = ( int ) j * adpcm_dec_cos( f * PI * i ); + + /* avoid constant-propagation optimizations */ + adpcm_dec_test_data[ i ] += x; + } +} + +int adpcm_dec_return() +{ + int i; + int check_sum = 0; + _Pragma( "loopbound min 2 max 2" ) + for ( i = 0; i < IN_END; i += 2 ) + check_sum += ( adpcm_dec_result[ i ] + adpcm_dec_result[ i + 1 ] ); + + return check_sum != -2; +} + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) adpcm_dec_main( void ) +{ + int i; + + _Pragma( "loopbound min 2 max 2" ) + for ( i = 0 ; i < IN_END ; i += 2 ) { + adpcm_dec_decode( adpcm_dec_compressed[ i / 2 ] ); + adpcm_dec_result[ i ] = adpcm_dec_xout1; + adpcm_dec_result[ i + 1 ] = adpcm_dec_xout2; + } + +} + + +int main( void ) +{ + adpcm_dec_init(); + adpcm_dec_main(); + + return ( adpcm_dec_return() ); +} diff --git a/targets/wasm-tacle/sequential/adpcm_dec/generated/default/adpcm_dec.wasm b/targets/wasm-tacle/sequential/adpcm_dec/generated/default/adpcm_dec.wasm new file mode 100755 index 0000000000000000000000000000000000000000..9ab702a1b5bb8de7e87827a872abf1a4bc36285a GIT binary patch literal 5311 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 clKZS%atq_`sq%c$og0qNO-&X~xzCsX1+{PaeE= 0) + f = n; + else + f = -n; + + return f; +} + +int +adpcm_dec_sin(int rad) { + int diff; + int app = 0; + int inc = 1; + + /* MAX dependent on rad's value, say 50 */ + __pragma_loopbound(0, 0); + while (rad > 2 * PI) + rad -= 2 * PI; + + __pragma_loopbound(0, 1999); + while (rad < -2 * PI) + rad += 2 * PI; + + diff = rad; + app = diff; + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + + /* REALLY: while(my_fabs(diff) >= 0.00001) { */ + /* MAX: 1000 */ + __pragma_loopbound(849, 2424); + while (adpcm_dec_fabs(diff) >= 1) { + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + } + + return app; +} + +int +adpcm_dec_cos(int rad) { + return (adpcm_dec_sin(PI / 2 - rad)); +} + +/* + Algorithm core functions +*/ + +/* decode function, result in xout1 and xout2 */ +void +adpcm_dec_decode(int input) { + int i; + long int xa1, xa2; /* qmf accumulators */ + int *h_ptr, *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1; + + /* split transmitted word from input into ilr and ih */ + adpcm_dec_ilr = input & 0x3f; + adpcm_dec_ih = input >> 6; + + /* LOWER SUB_BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + adpcm_dec_dec_szl = + adpcm_dec_filtez(adpcm_dec_dec_del_bpl, adpcm_dec_dec_del_dltx); + + /* filtep: compute predictor output signal for pole section */ + adpcm_dec_dec_spl = adpcm_dec_filtep(adpcm_dec_dec_rlt1, adpcm_dec_dec_al1, + adpcm_dec_dec_rlt2, adpcm_dec_dec_al2); + + adpcm_dec_dec_sl = adpcm_dec_dec_spl + adpcm_dec_dec_szl; + + /* invqxl: compute quantized difference signal for adaptive predic */ + adpcm_dec_dec_dlt = ((long) adpcm_dec_dec_detl * + adpcm_dec_qq4_code4_table[adpcm_dec_ilr >> 2]) >> + 15; + + /* invqxl: compute quantized difference signal for decoder output */ + adpcm_dec_dl = + ((long) adpcm_dec_dec_detl * adpcm_dec_qq6_code6_table[adpcm_dec_il]) >> + 15; + + adpcm_dec_rl = adpcm_dec_dl + adpcm_dec_dec_sl; + + /* logscl: quantizer scale factor adaptation in the lower sub-band */ + adpcm_dec_dec_nbl = adpcm_dec_logscl(adpcm_dec_ilr, adpcm_dec_dec_nbl); + + /* scalel: computes quantizer scale factor in the lower sub band */ + adpcm_dec_dec_detl = adpcm_dec_scalel(adpcm_dec_dec_nbl, 8); + + /* parrec - add pole predictor output to quantized diff. signal */ + /* for partially reconstructed signal */ + adpcm_dec_dec_plt = adpcm_dec_dec_dlt + adpcm_dec_dec_szl; + + /* upzero: update zero section predictor coefficients */ + adpcm_dec_upzero(adpcm_dec_dec_dlt, adpcm_dec_dec_del_dltx, + adpcm_dec_dec_del_bpl); + + /* uppol2: update second predictor coefficient apl2 and delay it as al2 */ + adpcm_dec_dec_al2 = adpcm_dec_uppol2(adpcm_dec_dec_al1, adpcm_dec_dec_al2, + adpcm_dec_dec_plt, adpcm_dec_dec_plt1, + adpcm_dec_dec_plt2); + + /* uppol1: update first predictor coef. (pole setion) */ + adpcm_dec_dec_al1 = adpcm_dec_uppol1(adpcm_dec_dec_al1, adpcm_dec_dec_al2, + adpcm_dec_dec_plt, adpcm_dec_dec_plt1); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_dec_dec_rlt = adpcm_dec_dec_sl + adpcm_dec_dec_dlt; + + /* done with lower sub band decoder, implement delays for next time */ + adpcm_dec_dec_rlt2 = adpcm_dec_dec_rlt1; + adpcm_dec_dec_rlt1 = adpcm_dec_dec_rlt; + adpcm_dec_dec_plt2 = adpcm_dec_dec_plt1; + adpcm_dec_dec_plt1 = adpcm_dec_dec_plt; + + /* HIGH SUB-BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + adpcm_dec_dec_szh = + adpcm_dec_filtez(adpcm_dec_dec_del_bph, adpcm_dec_dec_del_dhx); + + /* filtep: compute predictor output signal for pole section */ + adpcm_dec_dec_sph = adpcm_dec_filtep(adpcm_dec_dec_rh1, adpcm_dec_dec_ah1, + adpcm_dec_dec_rh2, adpcm_dec_dec_ah2); + + /* predic:compute the predictor output value in the higher sub_band decoder + */ + adpcm_dec_dec_sh = adpcm_dec_dec_sph + adpcm_dec_dec_szh; + + /* invqah: in-place compute the quantized difference signal */ + adpcm_dec_dec_dh = + ((long) adpcm_dec_dec_deth * adpcm_dec_qq2_code2_table[adpcm_dec_ih]) >> + 15L; + + /* logsch: update logarithmic quantizer scale factor in hi sub band */ + adpcm_dec_dec_nbh = adpcm_dec_logsch(adpcm_dec_ih, adpcm_dec_dec_nbh); + + /* scalel: compute the quantizer scale factor in the higher sub band */ + adpcm_dec_dec_deth = adpcm_dec_scalel(adpcm_dec_dec_nbh, 10); + + /* parrec: compute partially recontructed signal */ + adpcm_dec_dec_ph = adpcm_dec_dec_dh + adpcm_dec_dec_szh; + + /* upzero: update zero section predictor coefficients */ + adpcm_dec_upzero(adpcm_dec_dec_dh, adpcm_dec_dec_del_dhx, + adpcm_dec_dec_del_bph); + + /* uppol2: update second predictor coefficient aph2 and delay it as ah2 */ + adpcm_dec_dec_ah2 = + adpcm_dec_uppol2(adpcm_dec_dec_ah1, adpcm_dec_dec_ah2, adpcm_dec_dec_ph, + adpcm_dec_dec_ph1, adpcm_dec_dec_ph2); + + /* uppol1: update first predictor coef. (pole setion) */ + adpcm_dec_dec_ah1 = adpcm_dec_uppol1(adpcm_dec_dec_ah1, adpcm_dec_dec_ah2, + adpcm_dec_dec_ph, adpcm_dec_dec_ph1); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_dec_rh = adpcm_dec_dec_sh + adpcm_dec_dec_dh; + + /* done with high band decode, implementing delays for next time here */ + adpcm_dec_dec_rh2 = adpcm_dec_dec_rh1; + adpcm_dec_dec_rh1 = adpcm_dec_rh; + adpcm_dec_dec_ph2 = adpcm_dec_dec_ph1; + adpcm_dec_dec_ph1 = adpcm_dec_dec_ph; + + /* end of higher sub_band decoder */ + + /* end with receive quadrature mirror filters */ + adpcm_dec_xd = adpcm_dec_rl - adpcm_dec_rh; + adpcm_dec_xs = adpcm_dec_rl + adpcm_dec_rh; + + /* receive quadrature mirror filters implemented here */ + h_ptr = adpcm_dec_h; + ac_ptr = adpcm_dec_accumc; + ad_ptr = adpcm_dec_accumd; + xa1 = (long) adpcm_dec_xd * (*h_ptr++); + xa2 = (long) adpcm_dec_xs * (*h_ptr++); + + /* main multiply accumulate loop for samples and coefficients */ + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + xa1 += (long) (*ac_ptr++) * (*h_ptr++); + xa2 += (long) (*ad_ptr++) * (*h_ptr++); + } + + /* final mult/accumulate */ + xa1 += (long) (*ac_ptr) * (*h_ptr++); + xa2 += (long) (*ad_ptr) * (*h_ptr++); + + /* scale by 2^14 */ + adpcm_dec_xout1 = xa1 >> 14; + adpcm_dec_xout2 = xa2 >> 14; + + /* update delay lines */ + ac_ptr1 = ac_ptr - 1; + ad_ptr1 = ad_ptr - 1; + + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + *ac_ptr-- = *ac_ptr1--; + *ad_ptr-- = *ad_ptr1--; + } + + *ac_ptr = adpcm_dec_xd; + *ad_ptr = adpcm_dec_xs; + + return; +} + +/* filtez - compute predictor output signal (zero section) */ +/* input: bpl1-6 and dlt1-6, output: szl */ +int +adpcm_dec_filtez(int *bpl, int *dlt) { + int i; + long int zl; + + zl = (long) (*bpl++) * (*dlt++); + + /* MAX: 5 */ + __pragma_loopbound(5, 5); + for (i = 1; i < 6; i++) + zl += (long) (*bpl++) * (*dlt++); + + return ((int) (zl >> 14)); /* x2 here */ +} + +/* filtep - compute predictor output signal (pole section) */ +/* input rlt1-2 and al1-2, output spl */ +int +adpcm_dec_filtep(int rlt1, int al1, int rlt2, int al2) { + long int pl, pl2; + + pl = 2 * rlt1; + pl = (long) al1 * pl; + pl2 = 2 * rlt2; + pl += (long) al2 * pl2; + + return ((int) (pl >> 15)); +} + +/* logscl - update log quantizer scale factor in lower sub-band */ +/* note that nbl is passed and returned */ +int +adpcm_dec_logscl(int il, int nbl) { + long int wd; + + wd = ((long) nbl * 127L) >> 7L; /* leak factor 127/128 */ + nbl = (int) wd + adpcm_dec_wl_code_table[il >> 2]; + + if (nbl < 0) + nbl = 0; + if (nbl > 18432) + nbl = 18432; + + return (nbl); +} + +/* scalel: compute quantizer scale factor in lower or upper sub-band*/ +int +adpcm_dec_scalel(int nbl, int shift_constant) { + int wd1, wd2, wd3; + + wd1 = (nbl >> 6) & 31; + wd2 = nbl >> 11; + wd3 = adpcm_dec_ilb_table[wd1] >> (shift_constant + 1 - wd2); + + return (wd3 << 3); +} + +/* upzero - inputs: dlt, dlti[ 0-5 ], bli[ 0-5 ], outputs: updated bli[ 0-5 ] */ +/* also implements delay of bli and update of dlti from dlt */ +void +adpcm_dec_upzero(int dlt, int *dlti, int *bli) { + int i, wd2, wd3; + + /*if dlt is zero, then no sum into bli */ + if (dlt == 0) { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + } + + } else { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + if ((long) dlt * dlti[i] >= 0) + wd2 = 128; + else + wd2 = -128; + + wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + bli[i] = wd2 + wd3; + } + } + + /* implement delay line for dlt */ + dlti[5] = dlti[4]; + dlti[4] = dlti[3]; + dlti[3] = dlti[2]; + dlti[1] = dlti[0]; + dlti[0] = dlt; + + return; +} + +/* uppol2 - update second predictor coefficient (pole section) */ +/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ +int +adpcm_dec_uppol2(int al1, int al2, int plt, int plt1, int plt2) { + long int wd2, wd4; + int apl2; + + wd2 = 4L * (long) al1; + if ((long) plt * plt1 >= 0L) + wd2 = -wd2; /* check same sign */ + wd2 = wd2 >> 7; /* gain of 1/128 */ + + if ((long) plt * plt2 >= 0L) { + wd4 = wd2 + 128; /* same sign case */ + } else + wd4 = wd2 - 128; + apl2 = wd4 + (127L * (long) al2 >> 7L); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ + if (apl2 > 12288) + apl2 = 12288; + if (apl2 < -12288) + apl2 = -12288; + + return (apl2); +} + +/* uppol1 - update first predictor coefficient (pole section) */ +/* inputs: al1, apl2, plt, plt1. outputs: apl1 */ +int +adpcm_dec_uppol1(int al1, int apl2, int plt, int plt1) { + long int wd2; + int wd3, apl1; + + wd2 = ((long) al1 * 255L) >> 8L; /* leak factor of 255/256 */ + if ((long) plt * plt1 >= 0L) { + apl1 = (int) wd2 + 192; /* same sign case */ + } else + apl1 = (int) wd2 - 192; + + /* note: wd3= .9375-.75 is always positive */ + wd3 = 15360 - apl2; /* limit value */ + if (apl1 > wd3) + apl1 = wd3; + if (apl1 < -wd3) + apl1 = -wd3; + + return (apl1); +} + +/* logsch - update log quantizer scale factor in higher sub-band */ +/* note that nbh is passed and returned */ +int +adpcm_dec_logsch(int ih, int nbh) { + int wd; + + wd = ((long) nbh * 127L) >> 7L; /* leak factor 127/128 */ + nbh = wd + adpcm_dec_wh_code_table[ih]; + + if (nbh < 0) + nbh = 0; + if (nbh > 22528) + nbh = 22528; + + return (nbh); +} + +/* + Initialization- and return-value-related functions +*/ + +/* clear all storage locations */ + +void +adpcm_dec_reset() { + int i; + + adpcm_dec_detl = adpcm_dec_dec_detl = 32; /* reset to min scale factor */ + adpcm_dec_deth = adpcm_dec_dec_deth = 8; + adpcm_dec_nbl = adpcm_dec_al1 = adpcm_dec_al2 = adpcm_dec_plt1 = + adpcm_dec_plt2 = adpcm_dec_rlt1 = adpcm_dec_rlt2 = 0; + adpcm_dec_nbh = adpcm_dec_ah1 = adpcm_dec_ah2 = adpcm_dec_ph1 = + adpcm_dec_ph2 = adpcm_dec_rh1 = adpcm_dec_rh2 = 0; + adpcm_dec_dec_nbl = adpcm_dec_dec_al1 = adpcm_dec_dec_al2 = + adpcm_dec_dec_plt1 = adpcm_dec_dec_plt2 = adpcm_dec_dec_rlt1 = + adpcm_dec_dec_rlt2 = 0; + adpcm_dec_dec_nbh = adpcm_dec_dec_ah1 = adpcm_dec_dec_ah2 = + adpcm_dec_dec_ph1 = adpcm_dec_dec_ph2 = adpcm_dec_dec_rh1 = + adpcm_dec_dec_rh2 = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + ////delay_dltx[ i ] = 0; + adpcm_dec_delay_dhx[i] = 0; + adpcm_dec_dec_del_dltx[i] = 0; + adpcm_dec_dec_del_dhx[i] = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + // delay_bpl[ i ] = 0; + adpcm_dec_delay_bph[i] = 0; + adpcm_dec_dec_del_bpl[i] = 0; + adpcm_dec_dec_del_bph[i] = 0; + } + + __pragma_loopbound(11, 11); + for (i = 0; i < 11; i++) { + adpcm_dec_accumc[i] = 0; + adpcm_dec_accumd[i] = 0; + } + + return; +} + +void +adpcm_dec_init() { + int i, j, f; + volatile int x = 0; + /* read in amplitude and frequency for test data */ + j = 10; + f = 2000; + + /* reset, initialize required memory */ + adpcm_dec_reset(); + + /* 16 KHz sample rate */ + /* XXmain_0, MAX: 2 */ + /* Since the number of times we loop in adpcm_dec_sin depends on the + argument we add the fact: xxmain_0:[ ]: */ + __pragma_loopbound(3, 3); + for (i = 0; i < SIZE; i++) { + adpcm_dec_test_data[i] = (int) j * adpcm_dec_cos(f * PI * i); + + /* avoid constant-propagation optimizations */ + adpcm_dec_test_data[i] += x; + } +} + +int +adpcm_dec_return() { + int i; + int check_sum = 0; + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) + check_sum += (adpcm_dec_result[i] + adpcm_dec_result[i + 1]); + + return check_sum != -2; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_dec_main(void) { + int i; + + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) { + adpcm_dec_decode(adpcm_dec_compressed[i / 2]); + adpcm_dec_result[i] = adpcm_dec_xout1; + adpcm_dec_result[i + 1] = adpcm_dec_xout2; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + adpcm_dec_init(); + adpcm_dec_main(); + + return (adpcm_dec_return()); +} diff --git a/targets/wasm-tacle/sequential/adpcm_dec/generated/modified_sources/inline/adpcm_dec.c b/targets/wasm-tacle/sequential/adpcm_dec/generated/modified_sources/inline/adpcm_dec.c new file mode 100644 index 0000000..5678636 --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_dec/generated/modified_sources/inline/adpcm_dec.c @@ -0,0 +1,690 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: adpcm_dec + + Author: Sung-Soo Lim + + Function: + CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) + algorithm. + 16khz sample rate data is stored in the array test_data[ SIZE ]. + Results are stored in the array compressed[ SIZE ] and result[ SIZE ]. + Execution time is determined by the constant SIZE (default value + is 2000). + + Source: SNU-RT Benchmark Suite + + Changes: adpcm benchmark was split into decode and encode benchmark + + License: may be used, modified, and re-distributed freely, but + the SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* + This program is derived from the SNU-RT Benchmark Suite for Worst + Case Timing Analysis by Sung-Soo Lim + + Original source: C Algorithms for Real-Time DSP by P. M. Embree +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void adpcm_dec_decode(int); +__attribute__((always_inline)) static inline int adpcm_dec_filtez(int *bpl, + int *dlt); +__attribute__((always_inline)) static inline void +adpcm_dec_upzero(int dlt, int *dlti, int *bli); +__attribute__((always_inline)) static inline int +adpcm_dec_filtep(int rlt1, int al1, int rlt2, int al2); + +__attribute__((always_inline)) static inline int adpcm_dec_logscl(int il, + int nbl); +__attribute__((always_inline)) static inline int +adpcm_dec_scalel(int nbl, int shift_constant); +__attribute__((always_inline)) static inline int +adpcm_dec_uppol2(int al1, int al2, int plt, int plt1, int plt2); +__attribute__((always_inline)) static inline int +adpcm_dec_uppol1(int al1, int apl2, int plt, int plt1); + +__attribute__((always_inline)) static inline int adpcm_dec_logsch(int ih, + int nbh); +__attribute__((always_inline)) static inline void adpcm_dec_reset(); +__attribute__((always_inline)) static inline int adpcm_dec_fabs(int n); +__attribute__((always_inline)) static inline int adpcm_dec_cos(int n); +__attribute__((always_inline)) static inline int adpcm_dec_sin(int n); + +__attribute__((always_inline)) static inline void adpcm_dec_init(); +__attribute__((always_inline)) static inline int adpcm_dec_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_dec_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of macros +*/ +/* common sampling rate for sound cards on IBM/PC */ +#define SAMPLE_RATE 11025 +#define PI 3141 +#define SIZE 3 +#define IN_END 4 + +/* + Declaration of global variables +*/ + +int adpcm_dec_test_data[SIZE * 2], adpcm_dec_result[SIZE * 2]; + +/* Input data for the decoder usually generated by the encoder. */ +int adpcm_dec_compressed[SIZE] = {0, 253, 32}; + +/* G722 C code */ + +/* QMF filter coefficients: + scaled by a factor of 4 compared to G722 CCITT recommendation */ +int adpcm_dec_h[24] = {12, -44, -44, 212, 48, -624, 128, 1448, + -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, + 1448, 128, -624, 48, 212, -44, -44, 12}; + +// int xl,xh; + +/* variables for receive quadrature mirror filter here */ +int adpcm_dec_accumc[11], adpcm_dec_accumd[11]; + +/* outputs of decode() */ +int adpcm_dec_xout1, adpcm_dec_xout2; + +int adpcm_dec_xs, adpcm_dec_xd; + +/* variables for encoder (hi and lo) here */ + +int adpcm_dec_il, adpcm_dec_szl, adpcm_dec_spl, adpcm_dec_sl, adpcm_dec_el; + +int adpcm_dec_qq4_code4_table[16] = {0, -20456, -12896, -8968, -6288, -4240, + -2584, -1200, 20456, 12896, 8968, 6288, + 4240, 2584, 1200, 0}; + +int adpcm_dec_qq6_code6_table[64] = { + -136, -136, -136, -136, -24808, -21904, -19008, -16704, + -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, + -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, + -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, + 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, + 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, + 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, + 1688, 1360, 1040, 728, 432, 136, -432, -136}; + +int adpcm_dec_wl_code_table[16] = {-60, 3042, 1198, 538, 334, 172, 58, -30, + 3042, 1198, 538, 334, 172, 58, -30, -60}; + +int adpcm_dec_ilb_table[32] = {2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, + 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, + 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, + 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008}; + +int adpcm_dec_nbl; /* delay line */ +int adpcm_dec_al1, adpcm_dec_al2; +int adpcm_dec_plt, adpcm_dec_plt1, adpcm_dec_plt2; +int adpcm_dec_rs; +int adpcm_dec_dlt; +int adpcm_dec_rlt, adpcm_dec_rlt1, adpcm_dec_rlt2; + +int adpcm_dec_detl; + +int adpcm_dec_deth; +int adpcm_dec_sh; /* this comes from adaptive predictor */ +int adpcm_dec_eh; + +int adpcm_dec_qq2_code2_table[4] = {-7408, -1616, 7408, 1616}; + +int adpcm_dec_wh_code_table[4] = {798, -214, 798, -214}; + +int adpcm_dec_dh, adpcm_dec_ih; +int adpcm_dec_nbh, adpcm_dec_szh; +int adpcm_dec_sph, adpcm_dec_ph, adpcm_dec_yh, adpcm_dec_rh; + +int adpcm_dec_delay_dhx[6]; + +int adpcm_dec_delay_bph[6]; + +int adpcm_dec_ah1, adpcm_dec_ah2; +int adpcm_dec_ph1, adpcm_dec_ph2; +int adpcm_dec_rh1, adpcm_dec_rh2; + +/* variables for decoder here */ +int adpcm_dec_ilr, adpcm_dec_yl, adpcm_dec_rl; +int adpcm_dec_dec_deth, adpcm_dec_dec_detl, adpcm_dec_dec_dlt; + +int adpcm_dec_dec_del_bpl[6]; + +int adpcm_dec_dec_del_dltx[6]; + +int adpcm_dec_dec_plt, adpcm_dec_dec_plt1, adpcm_dec_dec_plt2; +int adpcm_dec_dec_szl, adpcm_dec_dec_spl, adpcm_dec_dec_sl; +int adpcm_dec_dec_rlt1, adpcm_dec_dec_rlt2, adpcm_dec_dec_rlt; +int adpcm_dec_dec_al1, adpcm_dec_dec_al2; +int adpcm_dec_dl; +int adpcm_dec_dec_nbl, adpcm_dec_dec_yh, adpcm_dec_dec_dh, adpcm_dec_dec_nbh; + +/* variables used in filtez */ +int adpcm_dec_dec_del_bph[6]; + +int adpcm_dec_dec_del_dhx[6]; + +int adpcm_dec_dec_szh; +/* variables used in filtep */ +int adpcm_dec_dec_rh1, adpcm_dec_dec_rh2; +int adpcm_dec_dec_ah1, adpcm_dec_dec_ah2; +int adpcm_dec_dec_ph, adpcm_dec_dec_sph; + +int adpcm_dec_dec_sh, adpcm_dec_dec_rh; + +int adpcm_dec_dec_ph1, adpcm_dec_dec_ph2; + +/* + Arithmetic math functions +*/ + +/* MAX: 1 */ +__attribute__((always_inline)) static inline int +adpcm_dec_fabs(int n) { + int f; + + if (n >= 0) + f = n; + else + f = -n; + + return f; +} + +__attribute__((always_inline)) static inline int +adpcm_dec_sin(int rad) { + int diff; + int app = 0; + int inc = 1; + + /* MAX dependent on rad's value, say 50 */ + __pragma_loopbound(0, 0); + while (rad > 2 * PI) + rad -= 2 * PI; + + __pragma_loopbound(0, 1999); + while (rad < -2 * PI) + rad += 2 * PI; + + diff = rad; + app = diff; + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + + /* REALLY: while(my_fabs(diff) >= 0.00001) { */ + /* MAX: 1000 */ + __pragma_loopbound(849, 2424); + while (adpcm_dec_fabs(diff) >= 1) { + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + } + + return app; +} + +__attribute__((always_inline)) static inline int +adpcm_dec_cos(int rad) { + return (adpcm_dec_sin(PI / 2 - rad)); +} + +/* + Algorithm core functions +*/ + +/* decode function, result in xout1 and xout2 */ +__attribute__((always_inline)) static inline void +adpcm_dec_decode(int input) { + int i; + long int xa1, xa2; /* qmf accumulators */ + int *h_ptr, *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1; + + /* split transmitted word from input into ilr and ih */ + adpcm_dec_ilr = input & 0x3f; + adpcm_dec_ih = input >> 6; + + /* LOWER SUB_BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + adpcm_dec_dec_szl = + adpcm_dec_filtez(adpcm_dec_dec_del_bpl, adpcm_dec_dec_del_dltx); + + /* filtep: compute predictor output signal for pole section */ + adpcm_dec_dec_spl = adpcm_dec_filtep(adpcm_dec_dec_rlt1, adpcm_dec_dec_al1, + adpcm_dec_dec_rlt2, adpcm_dec_dec_al2); + + adpcm_dec_dec_sl = adpcm_dec_dec_spl + adpcm_dec_dec_szl; + + /* invqxl: compute quantized difference signal for adaptive predic */ + adpcm_dec_dec_dlt = ((long) adpcm_dec_dec_detl * + adpcm_dec_qq4_code4_table[adpcm_dec_ilr >> 2]) >> + 15; + + /* invqxl: compute quantized difference signal for decoder output */ + adpcm_dec_dl = + ((long) adpcm_dec_dec_detl * adpcm_dec_qq6_code6_table[adpcm_dec_il]) >> + 15; + + adpcm_dec_rl = adpcm_dec_dl + adpcm_dec_dec_sl; + + /* logscl: quantizer scale factor adaptation in the lower sub-band */ + adpcm_dec_dec_nbl = adpcm_dec_logscl(adpcm_dec_ilr, adpcm_dec_dec_nbl); + + /* scalel: computes quantizer scale factor in the lower sub band */ + adpcm_dec_dec_detl = adpcm_dec_scalel(adpcm_dec_dec_nbl, 8); + + /* parrec - add pole predictor output to quantized diff. signal */ + /* for partially reconstructed signal */ + adpcm_dec_dec_plt = adpcm_dec_dec_dlt + adpcm_dec_dec_szl; + + /* upzero: update zero section predictor coefficients */ + adpcm_dec_upzero(adpcm_dec_dec_dlt, adpcm_dec_dec_del_dltx, + adpcm_dec_dec_del_bpl); + + /* uppol2: update second predictor coefficient apl2 and delay it as al2 */ + adpcm_dec_dec_al2 = adpcm_dec_uppol2(adpcm_dec_dec_al1, adpcm_dec_dec_al2, + adpcm_dec_dec_plt, adpcm_dec_dec_plt1, + adpcm_dec_dec_plt2); + + /* uppol1: update first predictor coef. (pole setion) */ + adpcm_dec_dec_al1 = adpcm_dec_uppol1(adpcm_dec_dec_al1, adpcm_dec_dec_al2, + adpcm_dec_dec_plt, adpcm_dec_dec_plt1); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_dec_dec_rlt = adpcm_dec_dec_sl + adpcm_dec_dec_dlt; + + /* done with lower sub band decoder, implement delays for next time */ + adpcm_dec_dec_rlt2 = adpcm_dec_dec_rlt1; + adpcm_dec_dec_rlt1 = adpcm_dec_dec_rlt; + adpcm_dec_dec_plt2 = adpcm_dec_dec_plt1; + adpcm_dec_dec_plt1 = adpcm_dec_dec_plt; + + /* HIGH SUB-BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + adpcm_dec_dec_szh = + adpcm_dec_filtez(adpcm_dec_dec_del_bph, adpcm_dec_dec_del_dhx); + + /* filtep: compute predictor output signal for pole section */ + adpcm_dec_dec_sph = adpcm_dec_filtep(adpcm_dec_dec_rh1, adpcm_dec_dec_ah1, + adpcm_dec_dec_rh2, adpcm_dec_dec_ah2); + + /* predic:compute the predictor output value in the higher sub_band decoder + */ + adpcm_dec_dec_sh = adpcm_dec_dec_sph + adpcm_dec_dec_szh; + + /* invqah: in-place compute the quantized difference signal */ + adpcm_dec_dec_dh = + ((long) adpcm_dec_dec_deth * adpcm_dec_qq2_code2_table[adpcm_dec_ih]) >> + 15L; + + /* logsch: update logarithmic quantizer scale factor in hi sub band */ + adpcm_dec_dec_nbh = adpcm_dec_logsch(adpcm_dec_ih, adpcm_dec_dec_nbh); + + /* scalel: compute the quantizer scale factor in the higher sub band */ + adpcm_dec_dec_deth = adpcm_dec_scalel(adpcm_dec_dec_nbh, 10); + + /* parrec: compute partially recontructed signal */ + adpcm_dec_dec_ph = adpcm_dec_dec_dh + adpcm_dec_dec_szh; + + /* upzero: update zero section predictor coefficients */ + adpcm_dec_upzero(adpcm_dec_dec_dh, adpcm_dec_dec_del_dhx, + adpcm_dec_dec_del_bph); + + /* uppol2: update second predictor coefficient aph2 and delay it as ah2 */ + adpcm_dec_dec_ah2 = + adpcm_dec_uppol2(adpcm_dec_dec_ah1, adpcm_dec_dec_ah2, adpcm_dec_dec_ph, + adpcm_dec_dec_ph1, adpcm_dec_dec_ph2); + + /* uppol1: update first predictor coef. (pole setion) */ + adpcm_dec_dec_ah1 = adpcm_dec_uppol1(adpcm_dec_dec_ah1, adpcm_dec_dec_ah2, + adpcm_dec_dec_ph, adpcm_dec_dec_ph1); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_dec_rh = adpcm_dec_dec_sh + adpcm_dec_dec_dh; + + /* done with high band decode, implementing delays for next time here */ + adpcm_dec_dec_rh2 = adpcm_dec_dec_rh1; + adpcm_dec_dec_rh1 = adpcm_dec_rh; + adpcm_dec_dec_ph2 = adpcm_dec_dec_ph1; + adpcm_dec_dec_ph1 = adpcm_dec_dec_ph; + + /* end of higher sub_band decoder */ + + /* end with receive quadrature mirror filters */ + adpcm_dec_xd = adpcm_dec_rl - adpcm_dec_rh; + adpcm_dec_xs = adpcm_dec_rl + adpcm_dec_rh; + + /* receive quadrature mirror filters implemented here */ + h_ptr = adpcm_dec_h; + ac_ptr = adpcm_dec_accumc; + ad_ptr = adpcm_dec_accumd; + xa1 = (long) adpcm_dec_xd * (*h_ptr++); + xa2 = (long) adpcm_dec_xs * (*h_ptr++); + + /* main multiply accumulate loop for samples and coefficients */ + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + xa1 += (long) (*ac_ptr++) * (*h_ptr++); + xa2 += (long) (*ad_ptr++) * (*h_ptr++); + } + + /* final mult/accumulate */ + xa1 += (long) (*ac_ptr) * (*h_ptr++); + xa2 += (long) (*ad_ptr) * (*h_ptr++); + + /* scale by 2^14 */ + adpcm_dec_xout1 = xa1 >> 14; + adpcm_dec_xout2 = xa2 >> 14; + + /* update delay lines */ + ac_ptr1 = ac_ptr - 1; + ad_ptr1 = ad_ptr - 1; + + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + *ac_ptr-- = *ac_ptr1--; + *ad_ptr-- = *ad_ptr1--; + } + + *ac_ptr = adpcm_dec_xd; + *ad_ptr = adpcm_dec_xs; + + return; +} + +/* filtez - compute predictor output signal (zero section) */ +/* input: bpl1-6 and dlt1-6, output: szl */ +__attribute__((always_inline)) static inline int +adpcm_dec_filtez(int *bpl, int *dlt) { + int i; + long int zl; + + zl = (long) (*bpl++) * (*dlt++); + + /* MAX: 5 */ + __pragma_loopbound(5, 5); + for (i = 1; i < 6; i++) + zl += (long) (*bpl++) * (*dlt++); + + return ((int) (zl >> 14)); /* x2 here */ +} + +/* filtep - compute predictor output signal (pole section) */ +/* input rlt1-2 and al1-2, output spl */ +__attribute__((always_inline)) static inline int +adpcm_dec_filtep(int rlt1, int al1, int rlt2, int al2) { + long int pl, pl2; + + pl = 2 * rlt1; + pl = (long) al1 * pl; + pl2 = 2 * rlt2; + pl += (long) al2 * pl2; + + return ((int) (pl >> 15)); +} + +/* logscl - update log quantizer scale factor in lower sub-band */ +/* note that nbl is passed and returned */ +__attribute__((always_inline)) static inline int +adpcm_dec_logscl(int il, int nbl) { + long int wd; + + wd = ((long) nbl * 127L) >> 7L; /* leak factor 127/128 */ + nbl = (int) wd + adpcm_dec_wl_code_table[il >> 2]; + + if (nbl < 0) + nbl = 0; + if (nbl > 18432) + nbl = 18432; + + return (nbl); +} + +/* scalel: compute quantizer scale factor in lower or upper sub-band*/ +__attribute__((always_inline)) static inline int +adpcm_dec_scalel(int nbl, int shift_constant) { + int wd1, wd2, wd3; + + wd1 = (nbl >> 6) & 31; + wd2 = nbl >> 11; + wd3 = adpcm_dec_ilb_table[wd1] >> (shift_constant + 1 - wd2); + + return (wd3 << 3); +} + +/* upzero - inputs: dlt, dlti[ 0-5 ], bli[ 0-5 ], outputs: updated bli[ 0-5 ] */ +/* also implements delay of bli and update of dlti from dlt */ +__attribute__((always_inline)) static inline void +adpcm_dec_upzero(int dlt, int *dlti, int *bli) { + int i, wd2, wd3; + + /*if dlt is zero, then no sum into bli */ + if (dlt == 0) { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + } + + } else { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + if ((long) dlt * dlti[i] >= 0) + wd2 = 128; + else + wd2 = -128; + + wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + bli[i] = wd2 + wd3; + } + } + + /* implement delay line for dlt */ + dlti[5] = dlti[4]; + dlti[4] = dlti[3]; + dlti[3] = dlti[2]; + dlti[1] = dlti[0]; + dlti[0] = dlt; + + return; +} + +/* uppol2 - update second predictor coefficient (pole section) */ +/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ +__attribute__((always_inline)) static inline int +adpcm_dec_uppol2(int al1, int al2, int plt, int plt1, int plt2) { + long int wd2, wd4; + int apl2; + + wd2 = 4L * (long) al1; + if ((long) plt * plt1 >= 0L) + wd2 = -wd2; /* check same sign */ + wd2 = wd2 >> 7; /* gain of 1/128 */ + + if ((long) plt * plt2 >= 0L) { + wd4 = wd2 + 128; /* same sign case */ + } else + wd4 = wd2 - 128; + apl2 = wd4 + (127L * (long) al2 >> 7L); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ + if (apl2 > 12288) + apl2 = 12288; + if (apl2 < -12288) + apl2 = -12288; + + return (apl2); +} + +/* uppol1 - update first predictor coefficient (pole section) */ +/* inputs: al1, apl2, plt, plt1. outputs: apl1 */ +__attribute__((always_inline)) static inline int +adpcm_dec_uppol1(int al1, int apl2, int plt, int plt1) { + long int wd2; + int wd3, apl1; + + wd2 = ((long) al1 * 255L) >> 8L; /* leak factor of 255/256 */ + if ((long) plt * plt1 >= 0L) { + apl1 = (int) wd2 + 192; /* same sign case */ + } else + apl1 = (int) wd2 - 192; + + /* note: wd3= .9375-.75 is always positive */ + wd3 = 15360 - apl2; /* limit value */ + if (apl1 > wd3) + apl1 = wd3; + if (apl1 < -wd3) + apl1 = -wd3; + + return (apl1); +} + +/* logsch - update log quantizer scale factor in higher sub-band */ +/* note that nbh is passed and returned */ +__attribute__((always_inline)) static inline int +adpcm_dec_logsch(int ih, int nbh) { + int wd; + + wd = ((long) nbh * 127L) >> 7L; /* leak factor 127/128 */ + nbh = wd + adpcm_dec_wh_code_table[ih]; + + if (nbh < 0) + nbh = 0; + if (nbh > 22528) + nbh = 22528; + + return (nbh); +} + +/* + Initialization- and return-value-related functions +*/ + +/* clear all storage locations */ + +__attribute__((always_inline)) static inline void +adpcm_dec_reset() { + int i; + + adpcm_dec_detl = adpcm_dec_dec_detl = 32; /* reset to min scale factor */ + adpcm_dec_deth = adpcm_dec_dec_deth = 8; + adpcm_dec_nbl = adpcm_dec_al1 = adpcm_dec_al2 = adpcm_dec_plt1 = + adpcm_dec_plt2 = adpcm_dec_rlt1 = adpcm_dec_rlt2 = 0; + adpcm_dec_nbh = adpcm_dec_ah1 = adpcm_dec_ah2 = adpcm_dec_ph1 = + adpcm_dec_ph2 = adpcm_dec_rh1 = adpcm_dec_rh2 = 0; + adpcm_dec_dec_nbl = adpcm_dec_dec_al1 = adpcm_dec_dec_al2 = + adpcm_dec_dec_plt1 = adpcm_dec_dec_plt2 = adpcm_dec_dec_rlt1 = + adpcm_dec_dec_rlt2 = 0; + adpcm_dec_dec_nbh = adpcm_dec_dec_ah1 = adpcm_dec_dec_ah2 = + adpcm_dec_dec_ph1 = adpcm_dec_dec_ph2 = adpcm_dec_dec_rh1 = + adpcm_dec_dec_rh2 = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + ////delay_dltx[ i ] = 0; + adpcm_dec_delay_dhx[i] = 0; + adpcm_dec_dec_del_dltx[i] = 0; + adpcm_dec_dec_del_dhx[i] = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + // delay_bpl[ i ] = 0; + adpcm_dec_delay_bph[i] = 0; + adpcm_dec_dec_del_bpl[i] = 0; + adpcm_dec_dec_del_bph[i] = 0; + } + + __pragma_loopbound(11, 11); + for (i = 0; i < 11; i++) { + adpcm_dec_accumc[i] = 0; + adpcm_dec_accumd[i] = 0; + } + + return; +} + +__attribute__((always_inline)) static inline void +adpcm_dec_init() { + int i, j, f; + volatile int x = 0; + /* read in amplitude and frequency for test data */ + j = 10; + f = 2000; + + /* reset, initialize required memory */ + adpcm_dec_reset(); + + /* 16 KHz sample rate */ + /* XXmain_0, MAX: 2 */ + /* Since the number of times we loop in adpcm_dec_sin depends on the + argument we add the fact: xxmain_0:[ ]: */ + __pragma_loopbound(3, 3); + for (i = 0; i < SIZE; i++) { + adpcm_dec_test_data[i] = (int) j * adpcm_dec_cos(f * PI * i); + + /* avoid constant-propagation optimizations */ + adpcm_dec_test_data[i] += x; + } +} + +__attribute__((always_inline)) static inline int +adpcm_dec_return() { + int i; + int check_sum = 0; + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) + check_sum += (adpcm_dec_result[i] + adpcm_dec_result[i + 1]); + + return check_sum != -2; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_dec_main(void) { + int i; + + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) { + adpcm_dec_decode(adpcm_dec_compressed[i / 2]); + adpcm_dec_result[i] = adpcm_dec_xout1; + adpcm_dec_result[i + 1] = adpcm_dec_xout2; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + adpcm_dec_init(); + adpcm_dec_main(); + + return (adpcm_dec_return()); +} diff --git a/targets/wasm-tacle/sequential/adpcm_enc/CMakeLists.txt b/targets/wasm-tacle/sequential/adpcm_enc/CMakeLists.txt new file mode 100644 index 0000000..b70b84a --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_enc/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(adpcm_enc) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/adpcm_enc.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/adpcm_enc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/adpcm_enc/ChangeLog.txt b/targets/wasm-tacle/sequential/adpcm_enc/ChangeLog.txt new file mode 100755 index 0000000..0029192 --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_enc/ChangeLog.txt @@ -0,0 +1,34 @@ +File: adpcm_enc.c +Original provenience: C Algorithms for Real-Time DSP by P. M. Embree + +2016-03-07: +- Rename adpcm_encode to adpcm_enc +- Add generic TACLeBench header +- Remove #define Seoul_Mate around main +- Remove swedish comment after setting frequency to 2000 +- Introduce adpcm_enc_init, adpcm_main, adpcm_return +- Make test_data and compressed global variables +2016-04-26: +- Remove forward declarations of functions gaussian, iir_filter, fir_filter, + fft, setup_codec, key_down, int_enable, int_disable, flags, getinput, + sendout, which are never defined +- Remove commented declarations of invqxl and invqah +- Remove unused structure COMPLEX +- Remove prefix my_ from functions names my_fabs, my_cos, my_sin, my_abs +- Prefix all global symbols with benchmark name +- Remove variables accumc and accumd together with their initialization loop, + since they are never read +- Remove unused variables xs and xd +- Remove unused array wl_table +- Remove unused variable rs and rh +- Remove unused variables and their initializations (only required for decoder): + ilr, yl, rl, dec_deth, dec_del_bpl, dec_plt, dec_plt1, dec_plt2, dec_szl, + dec_spl, dec_sl, dec_rlt1, dec_rlt2, dec_rlt, dec_al1, dec_al2, dl, dec_nbl, + dec_yh, dec_dh, dec_nbh, dec_rh2, dec_ah1, dec_ah2, dec_ph, dec_sph, dec_sh, + dec_rh, dec_ph1, dec_ph2, +- Add addition on each element of input data with volatile variable to + avoid constant-propagation optimizations through the compoiler +- Add computation of check sum +- Add return return statement: zero if check sum is correct +2016-05-20: +- Apply code formatting with astyle diff --git a/targets/wasm-tacle/sequential/adpcm_enc/adpcm_enc.c b/targets/wasm-tacle/sequential/adpcm_enc/adpcm_enc.c new file mode 100755 index 0000000..2f58d9a --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_enc/adpcm_enc.c @@ -0,0 +1,756 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: adpcm_enc + + Author: Sung-Soo Lim + + Function: CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) + algorithm. 16khz sample rate data is stored in the array test_data[ SIZE ]. + Results are stored in the array compressed[ SIZE ]. + Execution time is determined by the constant SIZE (default value is 2000). + + + Source: C Algorithms for Real-Time DSP by P. M. Embree + and SNU-RT Benchmark Suite for Worst Case Timing Analysis + collected and modified by S.-S. Lim + + Original name: adpcm_encoder + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely, but the + SNU-RT Benchmark Suite must be acknowledged + +*/ + + +/* common sampling rate for sound cards on IBM/PC */ +#define SAMPLE_RATE 11025 + +#define PI 3141 +#define SIZE 3 +#define IN_END 4 + + +/* + Forward declaration of functions +*/ + +int adpcm_enc_encode( int, int ); +int adpcm_enc_filtez( int *bpl, int *dlt ); +void adpcm_enc_upzero( int dlt, int *dlti, int *bli ); +int adpcm_enc_filtep( int rlt1, int al1, int rlt2, int al2 ); +int adpcm_enc_quantl( int el, int detl ); +int adpcm_enc_logscl( int il, int nbl ); +int adpcm_enc_scalel( int nbl, int shift_constant ); +int adpcm_enc_uppol2( int al1, int al2, int plt, int plt1, int plt2 ); +int adpcm_enc_uppol1( int al1, int apl2, int plt, int plt1 ); +int adpcm_enc_logsch( int ih, int nbh ); +void adpcm_enc_reset(); +int adpcm_enc_fabs( int n ); +int adpcm_enc_cos( int n ); +int adpcm_enc_sin( int n ); +int adpcm_enc_abs( int n ); +void adpcm_enc_init( void ); +void adpcm_enc_main( void ); +int adpcm_enc_return( void ); +int main( void ); + +/* + Forward declaration of global variables +*/ + +int adpcm_enc_test_data[ SIZE * 2 ], adpcm_enc_compressed[ SIZE ]; + + +/* G722 C code */ + +/* variables for transimit quadrature mirror filter here */ +int adpcm_enc_tqmf[ 24 ]; + +/* QMF filter coefficients: + scaled by a factor of 4 compared to G722 CCITT recommendation */ +int adpcm_enc_h[ 24 ] = { + 12, -44, -44, 212, 48, -624, 128, 1448, + -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, + 1448, 128, -624, 48, 212, -44, -44, 12 +}; + +int adpcm_enc_xl, adpcm_enc_xh; + +/* variables for encoder (hi and lo) here */ + +int adpcm_enc_il, adpcm_enc_szl, adpcm_enc_spl, adpcm_enc_sl, adpcm_enc_el; + +int adpcm_enc_qq4_code4_table[ 16 ] = { + 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, + 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0 +}; + +int adpcm_enc_qq5_code5_table[ 32 ] = { + -280, -280, -23352, -17560, -14120, -11664, -9752, -8184, + -6864, -5712, -4696, -3784, -2960, -2208, -1520, -880, + 23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712, + 4696, 3784, 2960, 2208, 1520, 880, 280, -280 + }; + +int adpcm_enc_qq6_code6_table[ 64 ] = { + -136, -136, -136, -136, -24808, -21904, -19008, -16704, + -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, + -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, + -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, + 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, + 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, + 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, + 1688, 1360, 1040, 728, 432, 136, -432, -136 + }; + +int adpcm_enc_delay_bpl[ 6 ]; + +int adpcm_enc_delay_dltx[ 6 ]; + +int adpcm_enc_wl_code_table[ 16 ] = { + -60, 3042, 1198, 538, 334, 172, 58, -30, + 3042, 1198, 538, 334, 172, 58, -30, -60 + }; + +int adpcm_enc_ilb_table[ 32 ] = { + 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, + 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, + 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, + 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008 +}; + +int adpcm_enc_nbl; /* delay line */ +int adpcm_enc_al1, adpcm_enc_al2; +int adpcm_enc_plt, adpcm_enc_plt1, adpcm_enc_plt2; +int adpcm_enc_dlt; +int adpcm_enc_rlt, adpcm_enc_rlt1, adpcm_enc_rlt2; + +/* decision levels - pre-multiplied by 8, 0 to indicate end */ +int adpcm_enc_decis_levl[ 30 ] = { + 280, 576, 880, 1200, 1520, 1864, 2208, 2584, + 2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288, + 6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896, + 14120, 15840, 17560, 20456, 23352, 32767 +}; + +int adpcm_enc_detl; + +/* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ +int adpcm_enc_quant26bt_pos[ 31 ] = { + 61, 60, 59, 58, 57, 56, 55, 54, + 53, 52, 51, 50, 49, 48, 47, 46, + 45, 44, 43, 42, 41, 40, 39, 38, + 37, 36, 35, 34, 33, 32, 32 +}; + +/* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ +int adpcm_enc_quant26bt_neg[ 31 ] = { + 63, 62, 31, 30, 29, 28, 27, 26, + 25, 24, 23, 22, 21, 20, 19, 18, + 17, 16, 15, 14, 13, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 4 +}; + + +int adpcm_enc_deth; +int adpcm_enc_sh; /* this comes from adaptive predictor */ +int adpcm_enc_eh; + +int adpcm_enc_qq2_code2_table[ 4 ] = { + -7408, -1616, 7408, 1616 + }; + +int adpcm_enc_wh_code_table[ 4 ] = { + 798, -214, 798, -214 +}; + + +int adpcm_enc_dh, adpcm_enc_ih; +int adpcm_enc_nbh, adpcm_enc_szh; +int adpcm_enc_sph, adpcm_enc_ph, adpcm_enc_yh; + +int adpcm_enc_delay_dhx[ 6 ]; +int adpcm_enc_delay_bph[ 6 ]; + +int adpcm_enc_ah1, adpcm_enc_ah2; +int adpcm_enc_ph1, adpcm_enc_ph2; +int adpcm_enc_rh1, adpcm_enc_rh2; + + +/* G722 encode function two ints in, one 8 bit output */ + +/* put input samples in xin1 = first value, xin2 = second value */ +/* returns il and ih stored together */ + + +/* MAX: 1 */ +int adpcm_enc_abs( int n ) +{ + int m; + + + if ( n >= 0 ) + m = n; + else + m = -n; + + return m; +} + + +/* MAX: 1 */ +int adpcm_enc_fabs( int n ) +{ + int f; + + + if ( n >= 0 ) + f = n; + else + f = -n; + + return f; +} + +#pragma GCC push_options +#pragma GCC optimize "-fwrapv" +int adpcm_enc_sin( int rad ) +{ + int diff; + int app = 0; + int inc = 1; + + + /* MAX dependent on rad's value, say 50 */ + _Pragma( "loopbound min 0 max 0" ) + while ( rad > 2 * PI ) + rad -= 2 * PI; + + /* MAX dependent on rad's value, say 50 */ + _Pragma( "loopbound min 0 max 1999" ) + while ( rad < -2 * PI ) + rad += 2 * PI; + + diff = rad; + app = diff; + diff = ( diff * ( -( rad * rad ) ) ) / ( ( 2 * inc ) * ( 2 * inc + 1 ) ); + app = app + diff; + inc++; + + /* REALLY: while(my_fabs(diff) >= 0.00001) { */ + /* MAX: 1000 */ + _Pragma( "loopbound min 849 max 2424" ) + while ( adpcm_enc_fabs( diff ) >= 1 ) { + diff = ( diff * ( -( rad * rad ) ) ) / ( ( 2 * inc ) * ( 2 * inc + 1 ) ); + app = app + diff; + inc++; + } + + return app; +} +#pragma GCC pop_options + + +int adpcm_enc_cos( int rad ) +{ + return ( adpcm_enc_sin( PI / 2 - rad ) ); +} + + +/* MAX: 1 */ +int adpcm_enc_encode( int xin1, int xin2 ) +{ + int i; + int *h_ptr, *tqmf_ptr, *tqmf_ptr1; + long long int xa, xb; + int decis; + + + /* transmit quadrature mirror filters implemented here */ + h_ptr = adpcm_enc_h; + tqmf_ptr = adpcm_enc_tqmf; + xa = ( long long )( *tqmf_ptr++ ) * ( *h_ptr++ ); + xb = ( long long )( *tqmf_ptr++ ) * ( *h_ptr++ ); + + /* main multiply accumulate loop for samples and coefficients */ + /* MAX: 10 */ + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < 10; i++ ) { + xa += ( long long )( *tqmf_ptr++ ) * ( *h_ptr++ ); + xb += ( long long )( *tqmf_ptr++ ) * ( *h_ptr++ ); + } + + /* final mult/accumulate */ + xa += ( long long )( *tqmf_ptr++ ) * ( *h_ptr++ ); + xb += ( long long )( *tqmf_ptr ) * ( *h_ptr++ ); + + /* update delay line tqmf */ + tqmf_ptr1 = tqmf_ptr - 2; + /* MAX: 22 */ + _Pragma( "loopbound min 22 max 22" ) + for ( i = 0; i < 22; i++ ) + *tqmf_ptr-- = *tqmf_ptr1--; + + *tqmf_ptr-- = xin1; + *tqmf_ptr = xin2; + + /* scale outputs */ + adpcm_enc_xl = ( xa + xb ) >> 15; + adpcm_enc_xh = ( xa - xb ) >> 15; + + /* end of quadrature mirror filter code */ + + /* starting with lower sub band encoder */ + + /* filtez - compute predictor output section - zero section */ + adpcm_enc_szl = adpcm_enc_filtez( adpcm_enc_delay_bpl, adpcm_enc_delay_dltx ); + + /* filtep - compute predictor output signal (pole section) */ + adpcm_enc_spl = adpcm_enc_filtep( adpcm_enc_rlt1, adpcm_enc_al1, adpcm_enc_rlt2, + adpcm_enc_al2 ); + + /* compute the predictor output value in the lower sub_band encoder */ + adpcm_enc_sl = adpcm_enc_szl + adpcm_enc_spl; + adpcm_enc_el = adpcm_enc_xl - adpcm_enc_sl; + + /* quantl: quantize the difference signal */ + adpcm_enc_il = adpcm_enc_quantl( adpcm_enc_el, adpcm_enc_detl ); + + /* invqxl: computes quantized difference signal */ + /* for invqbl, truncate by 2 lsbs, so mode = 3 */ + adpcm_enc_dlt = ( ( long long ) adpcm_enc_detl * + adpcm_enc_qq4_code4_table[ adpcm_enc_il >> 2 ] ) >> 15; + + /* logscl: updates logarithmic quant. scale factor in low sub band */ + adpcm_enc_nbl = adpcm_enc_logscl( adpcm_enc_il, adpcm_enc_nbl ); + + /* scalel: compute the quantizer scale factor in the lower sub band */ + /* calling parameters nbl and 8 (constant such that scalel can be scaleh) */ + adpcm_enc_detl = adpcm_enc_scalel( adpcm_enc_nbl, 8 ); + + /* parrec - simple addition to compute recontructed signal for adaptive pred */ + adpcm_enc_plt = adpcm_enc_dlt + adpcm_enc_szl; + + /* upzero: update zero section predictor coefficients (sixth order)*/ + /* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */ + /* bpli (linear_buffer in which all six values are delayed */ + /* return params: updated bpli, delayed dltx */ + adpcm_enc_upzero( adpcm_enc_dlt, adpcm_enc_delay_dltx, adpcm_enc_delay_bpl ); + + /* uppol2- update second predictor coefficient apl2 and delay it as al2 */ + /* calling parameters: al1, al2, plt, plt1, plt2 */ + adpcm_enc_al2 = adpcm_enc_uppol2( adpcm_enc_al1, adpcm_enc_al2, adpcm_enc_plt, + adpcm_enc_plt1, adpcm_enc_plt2 ); + + /* uppol1 :update first predictor coefficient apl1 and delay it as al1 */ + /* calling parameters: al1, apl2, plt, plt1 */ + adpcm_enc_al1 = adpcm_enc_uppol1( adpcm_enc_al1, adpcm_enc_al2, adpcm_enc_plt, + adpcm_enc_plt1 ); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_enc_rlt = adpcm_enc_sl + adpcm_enc_dlt; + + /* done with lower sub_band encoder; now implement delays for next time*/ + adpcm_enc_rlt2 = adpcm_enc_rlt1; + adpcm_enc_rlt1 = adpcm_enc_rlt; + adpcm_enc_plt2 = adpcm_enc_plt1; + adpcm_enc_plt1 = adpcm_enc_plt; + + /* high band encode */ + + adpcm_enc_szh = adpcm_enc_filtez( adpcm_enc_delay_bph, adpcm_enc_delay_dhx ); + + adpcm_enc_sph = adpcm_enc_filtep( adpcm_enc_rh1, adpcm_enc_ah1, adpcm_enc_rh2, + adpcm_enc_ah2 ); + + /* predic: sh = sph + szh */ + adpcm_enc_sh = adpcm_enc_sph + adpcm_enc_szh; + /* subtra: eh = xh - sh */ + adpcm_enc_eh = adpcm_enc_xh - adpcm_enc_sh; + + /* quanth - quantization of difference signal for higher sub-band */ + /* quanth: in-place for speed params: eh, deth (has init. value) */ + if ( adpcm_enc_eh >= 0 ) + adpcm_enc_ih = 3; /* 2,3 are pos codes */ + else + adpcm_enc_ih = 1; /* 0,1 are neg codes */ + + decis = ( 564L * ( long long )adpcm_enc_deth ) >> 12L; + if ( adpcm_enc_abs( adpcm_enc_eh ) > decis ) + adpcm_enc_ih--; /* mih = 2 case */ + + /* invqah: compute the quantized difference signal, higher sub-band*/ + adpcm_enc_dh = ( ( long long )adpcm_enc_deth * + adpcm_enc_qq2_code2_table[ adpcm_enc_ih ] ) >> 15L ; + + /* logsch: update logarithmic quantizer scale factor in hi sub-band*/ + adpcm_enc_nbh = adpcm_enc_logsch( adpcm_enc_ih, adpcm_enc_nbh ); + + /* note : scalel and scaleh use same code, different parameters */ + adpcm_enc_deth = adpcm_enc_scalel( adpcm_enc_nbh, 10 ); + + /* parrec - add pole predictor output to quantized diff. signal */ + adpcm_enc_ph = adpcm_enc_dh + adpcm_enc_szh; + + /* upzero: update zero section predictor coefficients (sixth order) */ + /* calling parameters: dh, dhi, bphi */ + /* return params: updated bphi, delayed dhx */ + adpcm_enc_upzero( adpcm_enc_dh, adpcm_enc_delay_dhx, adpcm_enc_delay_bph ); + + /* uppol2: update second predictor coef aph2 and delay as ah2 */ + /* calling params: ah1, ah2, ph, ph1, ph2 */ + adpcm_enc_ah2 = adpcm_enc_uppol2( adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, + adpcm_enc_ph1, adpcm_enc_ph2 ); + + /* uppol1: update first predictor coef. aph2 and delay it as ah1 */ + adpcm_enc_ah1 = adpcm_enc_uppol1( adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, + adpcm_enc_ph1 ); + + /* recons for higher sub-band */ + adpcm_enc_yh = adpcm_enc_sh + adpcm_enc_dh; + + /* done with higher sub-band encoder, now Delay for next time */ + adpcm_enc_rh2 = adpcm_enc_rh1; + adpcm_enc_rh1 = adpcm_enc_yh; + adpcm_enc_ph2 = adpcm_enc_ph1; + adpcm_enc_ph1 = adpcm_enc_ph; + + /* multiplex ih and il to get signals together */ + return ( adpcm_enc_il | ( adpcm_enc_ih << 6 ) ); +} + + +/* filtez - compute predictor output signal (zero section) */ +/* input: bpl1-6 and dlt1-6, output: szl */ +int adpcm_enc_filtez( int *bpl, int *dlt ) +{ + int i; + long long int zl; + + + zl = ( long long )( *bpl++ ) * ( *dlt++ ); + + /* MAX: 5 */ + _Pragma( "loopbound min 5 max 5" ) + for ( i = 1; i < 6; i++ ) + zl += ( long long )( *bpl++ ) * ( *dlt++ ); + + return ( ( int )( zl >> 14 ) ); /* x2 here */ +} + + +/* filtep - compute predictor output signal (pole section) */ +/* input rlt1-2 and al1-2, output spl */ +int adpcm_enc_filtep( int rlt1, int al1, int rlt2, int al2 ) +{ + long long int pl, pl2; + + + pl = 2 * rlt1; + pl = ( long long ) al1 * pl; + pl2 = 2 * rlt2; + pl += ( long long ) al2 * pl2; + + return ( ( int )( pl >> 15 ) ); +} + + +/* quantl - quantize the difference signal in the lower sub-band */ +int adpcm_enc_quantl( int el, int detl ) +{ + int ril, mil; + long long int wd, decis; + + + /* abs of difference signal */ + wd = adpcm_enc_abs( el ); + + /* determine mil based on decision levels and detl gain */ + /* MAX: 30 */ + _Pragma( "loopbound min 1 max 30" ) + for ( mil = 0; mil < 30; mil++ ) { + decis = ( adpcm_enc_decis_levl[ mil ] * ( long long )detl ) >> 15L; + if ( wd <= decis ) + break; + } + + /* if mil=30 then wd is less than all decision levels */ + if ( el >= 0 ) + ril = adpcm_enc_quant26bt_pos[ mil ]; + else + ril = adpcm_enc_quant26bt_neg[ mil ]; + + return ( ril ); +} + + +/* invqxl is either invqbl or invqal depending on parameters passed */ +/* returns dlt, code table is pre-multiplied by 8 */ + +/* int invqxl(int il,int detl,int *code_table,int mode) */ +/* { */ +/* long long int dlt; */ +/* dlt = (long long)detl*code_table[ il >> (mode-1) ]; */ +/* return((int)(dlt >> 15)); */ +/* } */ + +/* logscl - update log quantizer scale factor in lower sub-band */ +/* note that nbl is passed and returned */ +int adpcm_enc_logscl( int il, int nbl ) +{ + long long int wd; + + + wd = ( ( long long )nbl * 127L ) >> 7L; /* leak factor 127/128 */ + nbl = ( int )wd + adpcm_enc_wl_code_table[ il >> 2 ]; + + if ( nbl < 0 ) + nbl = 0; + if ( nbl > 18432 ) + nbl = 18432; + + return ( nbl ); +} + + +/* scalel: compute quantizer scale factor in lower or upper sub-band*/ +int adpcm_enc_scalel( int nbl, int shift_constant ) +{ + int wd1, wd2, wd3; + + + wd1 = ( nbl >> 6 ) & 31; + wd2 = nbl >> 11; + wd3 = adpcm_enc_ilb_table[ wd1 ] >> ( shift_constant + 1 - wd2 ); + + return ( wd3 << 3 ); +} + + +/* upzero - inputs: dlt, dlti[ 0-5 ], bli[ 0-5 ], outputs: updated bli[ 0-5 ] */ +/* also implements delay of bli and update of dlti from dlt */ +void adpcm_enc_upzero( int dlt, int *dlti, int *bli ) +{ + int i, wd2, wd3; + + + /*if dlt is zero, then no sum into bli */ + if ( dlt == 0 ) { + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + bli[ i ] = ( int )( ( 255L * bli[ i ] ) >> 8L ); /* leak factor of 255/256 */ + } + + } else { + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + if ( ( long long )dlt * dlti[ i ] >= 0 ) + wd2 = 128; + else + wd2 = -128; + + wd3 = ( int )( ( 255L * bli[ i ] ) >> 8L ); /* leak factor of 255/256 */ + bli[ i ] = wd2 + wd3; + } + + } + + /* implement delay line for dlt */ + dlti[ 5 ] = dlti[ 4 ]; + dlti[ 4 ] = dlti[ 3 ]; + dlti[ 3 ] = dlti[ 2 ]; + dlti[ 1 ] = dlti[ 0 ]; + dlti[ 0 ] = dlt; + + return; +} + + +/* uppol2 - update second predictor coefficient (pole section) */ +/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ +int adpcm_enc_uppol2( int al1, int al2, int plt, int plt1, int plt2 ) +{ + long long int wd2, wd4; + int apl2; + + + wd2 = 4L * ( long long )al1; + if ( ( long long )plt * plt1 >= 0L ) + wd2 = -wd2; /* check same sign */ + wd2 = wd2 >> 7; /* gain of 1/128 */ + + if ( ( long long )plt * plt2 >= 0L ) { + wd4 = wd2 + 128; /* same sign case */ + } else + wd4 = wd2 - 128; + apl2 = wd4 + ( 127L * ( long long )al2 >> 7L ); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ + if ( apl2 > 12288 ) + apl2 = 12288; + if ( apl2 < -12288 ) + apl2 = -12288; + + return ( apl2 ); +} + + +/* uppol1 - update first predictor coefficient (pole section) */ +/* inputs: al1, apl2, plt, plt1. outputs: apl1 */ +int adpcm_enc_uppol1( int al1, int apl2, int plt, int plt1 ) +{ + long long int wd2; + int wd3, apl1; + + + wd2 = ( ( long long )al1 * 255L ) >> 8L; /* leak factor of 255/256 */ + if ( ( long long )plt * plt1 >= 0L ) { + apl1 = ( int )wd2 + 192; /* same sign case */ + } else + apl1 = ( int )wd2 - 192; + + /* note: wd3= .9375-.75 is always positive */ + wd3 = 15360 - apl2; /* limit value */ + if ( apl1 > wd3 ) + apl1 = wd3; + if ( apl1 < -wd3 ) + apl1 = -wd3; + + return ( apl1 ); +} + + +/* INVQAH: inverse adaptive quantizer for the higher sub-band */ +/* returns dh, code table is pre-multiplied by 8 */ +/* int invqah(int ih,int deth) */ +/* { */ +/* long long int rdh; */ +/* rdh = ((long long)deth*qq2_code2_table[ ih ]) >> 15L ; */ +/* return((int)(rdh )); */ +/* } */ + + +/* logsch - update log quantizer scale factor in higher sub-band */ +/* note that nbh is passed and returned */ +int adpcm_enc_logsch( int ih, int nbh ) +{ + int wd; + + + wd = ( ( long long )nbh * 127L ) >> 7L; /* leak factor 127/128 */ + nbh = wd + adpcm_enc_wh_code_table[ ih ]; + + if ( nbh < 0 ) + nbh = 0; + if ( nbh > 22528 ) + nbh = 22528; + + return ( nbh ); +} + + +/* + Initialization- and return-value-related functions +*/ + +/* clear all storage locations */ + +void adpcm_enc_reset( void ) +{ + int i; + + adpcm_enc_detl = 32; /* reset to min scale factor */ + adpcm_enc_deth = 8; + adpcm_enc_nbl = adpcm_enc_al1 = adpcm_enc_al2 = adpcm_enc_plt1 = adpcm_enc_plt2 + = adpcm_enc_rlt1 = adpcm_enc_rlt2 = 0; + adpcm_enc_nbh = adpcm_enc_ah1 = adpcm_enc_ah2 = adpcm_enc_ph1 = adpcm_enc_ph2 = + adpcm_enc_rh1 = adpcm_enc_rh2 = 0; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + adpcm_enc_delay_dltx[ i ] = 0; + adpcm_enc_delay_dhx[ i ] = 0; + } + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) { + adpcm_enc_delay_bpl[ i ] = 0; + adpcm_enc_delay_bph[ i ] = 0; + } + + _Pragma( "loopbound min 23 max 23" ) + for ( i = 0; i < 23; i++ ) + adpcm_enc_tqmf[ i ] = 0; + + return; +} + + +void adpcm_enc_init( void ) +{ + int i, j, f; + volatile int x = 0; + + /* reset, initialize required memory */ + adpcm_enc_reset(); + + /* read in amplitude and frequency for test data */ + j = 10; + f = 2000; + + /* 16 KHz sample rate */ + /* XXmain_0, MAX: 2 */ + /* Since the number of times we loop in my_sin depends on the argument we + add the fact: xxmain_0:[ ]: */ + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0 ; i < SIZE ; i++ ) { + adpcm_enc_test_data[ i ] = ( int ) j * adpcm_enc_cos( f * PI * i ); + + /* avoid constant-propagation optimizations */ + adpcm_enc_test_data[ i ] += x; + } +} + + +int adpcm_enc_return( void ) +{ + int i; + int check_sum = 0; + + _Pragma( "loopbound min 2 max 2" ) + for ( i = 0 ; i < IN_END ; i += 2 ) + check_sum += adpcm_enc_compressed[ i / 2 ]; + + return check_sum != 385; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) adpcm_enc_main( void ) +{ + int i; + /* MAX: 2 */ + _Pragma( "loopbound min 2 max 2" ) + for ( i = 0 ; i < IN_END ; i += 2 ) + adpcm_enc_compressed[ i / 2 ] = adpcm_enc_encode( adpcm_enc_test_data[ i ], + adpcm_enc_test_data[ i + 1 ] ); + +} + +int main( void ) +{ + adpcm_enc_init(); + adpcm_enc_main(); + + return adpcm_enc_return(); +} diff --git a/targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wasm b/targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wasm new file mode 100755 index 0000000000000000000000000000000000000000..fc41b0402b196c48f78086e34e5652702a00e8bb GIT binary patch literal 6248 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 beKuRbT(iB!^ZD#dPi$uF+*EJ&%f){JKNTzA literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wat b/targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wat new file mode 100644 index 0000000..d559ad1 --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_enc/generated/default/adpcm_enc.wat @@ -0,0 +1,1874 @@ +(module $adpcm_enc.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32) (result i32))) + (type (;3;) (func (param i32 i32 i32))) + (type (;4;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $adpcm_enc_encode (type 2) (param i32 i32) (result i32) + (local i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i32 i32) + i32.const 0 + i64.load32_s offset=1028 + local.set 2 + i32.const 0 + i64.load32_s offset=1796 + local.set 3 + i32.const 0 + i64.load32_s offset=1024 + local.set 4 + i32.const 0 + i64.load32_s offset=1792 + local.set 5 + i32.const 10 + i32.const 10 + call $__pragma_loopbound + i32.const 0 + i64.load32_s offset=1116 + local.set 6 + i32.const 0 + i64.load32_s offset=1884 + local.set 7 + i32.const 0 + i64.load32_s offset=1108 + local.set 8 + i32.const 0 + i64.load32_s offset=1876 + local.set 9 + i32.const 0 + i64.load32_s offset=1100 + local.set 10 + i32.const 0 + i64.load32_s offset=1868 + local.set 11 + i32.const 0 + i64.load32_s offset=1092 + local.set 12 + i32.const 0 + i64.load32_s offset=1860 + local.set 13 + i32.const 0 + i64.load32_s offset=1084 + local.set 14 + i32.const 0 + i64.load32_s offset=1852 + local.set 15 + i32.const 0 + i64.load32_s offset=1076 + local.set 16 + i32.const 0 + i64.load32_s offset=1844 + local.set 17 + i32.const 0 + i64.load32_s offset=1068 + local.set 18 + i32.const 0 + i64.load32_s offset=1836 + local.set 19 + i32.const 0 + i64.load32_s offset=1060 + local.set 20 + i32.const 0 + i64.load32_s offset=1828 + local.set 21 + i32.const 0 + i64.load32_s offset=1052 + local.set 22 + i32.const 0 + i64.load32_s offset=1820 + local.set 23 + i32.const 0 + i64.load32_s offset=1044 + local.set 24 + i32.const 0 + i64.load32_s offset=1812 + local.set 25 + i32.const 0 + i64.load32_s offset=1036 + local.set 26 + i32.const 0 + i64.load32_s offset=1804 + local.set 27 + i32.const 0 + i64.load32_s offset=1112 + local.set 28 + i32.const 0 + i64.load32_s offset=1880 + local.set 29 + i32.const 0 + i64.load32_s offset=1104 + local.set 30 + i32.const 0 + i64.load32_s offset=1872 + local.set 31 + i32.const 0 + i64.load32_s offset=1096 + local.set 32 + i32.const 0 + i64.load32_s offset=1864 + local.set 33 + i32.const 0 + i64.load32_s offset=1088 + local.set 34 + i32.const 0 + i64.load32_s offset=1856 + local.set 35 + i32.const 0 + i64.load32_s offset=1080 + local.set 36 + i32.const 0 + i64.load32_s offset=1848 + local.set 37 + i32.const 0 + i64.load32_s offset=1072 + local.set 38 + i32.const 0 + i64.load32_s offset=1840 + local.set 39 + i32.const 0 + i64.load32_s offset=1064 + local.set 40 + i32.const 0 + i64.load32_s offset=1832 + local.set 41 + i32.const 0 + i64.load32_s offset=1056 + local.set 42 + i32.const 0 + i64.load32_s offset=1824 + local.set 43 + i32.const 0 + i64.load32_s offset=1048 + local.set 44 + i32.const 0 + i64.load32_s offset=1816 + local.set 45 + i32.const 0 + i64.load32_s offset=1040 + local.set 46 + i32.const 0 + i64.load32_s offset=1808 + local.set 47 + i32.const 0 + i64.load32_s offset=1032 + local.set 48 + i32.const 0 + i64.load32_s offset=1800 + local.set 49 + i32.const 22 + i32.const 22 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1876 + i32.store offset=1884 + i32.const 0 + i64.load offset=1868 align=4 + local.set 50 + i32.const 0 + i32.const 0 + i32.load offset=1864 + i32.store offset=1872 + i32.const 0 + local.get 50 + i64.store offset=1876 align=4 + i32.const 0 + i32.const 0 + i64.load offset=1856 + i64.store offset=1864 + i32.const 0 + i32.const 0 + i64.load offset=1848 + i64.store offset=1856 + i32.const 0 + i32.const 0 + i64.load offset=1840 + i64.store offset=1848 + i32.const 0 + i32.const 0 + i64.load offset=1832 + i64.store offset=1840 + i32.const 0 + i32.const 0 + i64.load offset=1824 + i64.store offset=1832 + i32.const 0 + i32.const 0 + i32.load offset=1820 + i32.store offset=1828 + i32.const 0 + i32.const 0 + i32.load offset=1816 + i32.store offset=1824 + i32.const 0 + i32.const 0 + i32.load offset=1812 + i32.store offset=1820 + i32.const 0 + i32.const 0 + i32.load offset=1808 + i32.store offset=1816 + i32.const 0 + i32.const 0 + i32.load offset=1804 + i32.store offset=1812 + i32.const 0 + i32.const 0 + i32.load offset=1800 + i32.store offset=1808 + i32.const 0 + i32.const 0 + i32.load offset=1796 + i32.store offset=1804 + i32.const 0 + local.get 0 + i32.store offset=1796 + i32.const 0 + i32.const 0 + i32.load offset=1792 + i32.store offset=1800 + i32.const 0 + local.get 1 + i32.store offset=1792 + i32.const 0 + local.get 6 + local.get 7 + i64.mul + local.get 8 + local.get 9 + i64.mul + local.get 10 + local.get 11 + i64.mul + local.get 12 + local.get 13 + i64.mul + local.get 14 + local.get 15 + i64.mul + local.get 16 + local.get 17 + i64.mul + local.get 18 + local.get 19 + i64.mul + local.get 20 + local.get 21 + i64.mul + local.get 22 + local.get 23 + i64.mul + local.get 24 + local.get 25 + i64.mul + local.get 26 + local.get 27 + i64.mul + local.get 2 + local.get 3 + i64.mul + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + local.tee 2 + local.get 28 + local.get 29 + i64.mul + local.get 30 + local.get 31 + i64.mul + local.get 32 + local.get 33 + i64.mul + local.get 34 + local.get 35 + i64.mul + local.get 36 + local.get 37 + i64.mul + local.get 38 + local.get 39 + i64.mul + local.get 40 + local.get 41 + i64.mul + local.get 42 + local.get 43 + i64.mul + local.get 44 + local.get 45 + i64.mul + local.get 46 + local.get 47 + i64.mul + local.get 48 + local.get 49 + i64.mul + local.get 4 + local.get 5 + i64.mul + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + i64.add + local.tee 3 + i64.add + i64.const 15 + i64.shr_u + i64.store32 offset=1888 + i32.const 0 + local.get 3 + local.get 2 + i64.sub + i64.const 15 + i64.shr_u + i64.store32 offset=1892 + i32.const 0 + i64.load32_s offset=1936 + local.set 2 + i32.const 0 + i64.load32_s offset=1904 + local.set 3 + i32.const 5 + i32.const 5 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i64.load32_s offset=1976 + i32.const 0 + i32.load offset=1972 + i32.const 1 + i32.shl + i64.extend_i32_s + i64.mul + i32.const 0 + i64.load32_s offset=1968 + i32.const 0 + i32.load offset=1964 + i32.const 1 + i32.shl + i64.extend_i32_s + i64.mul + i64.add + i64.const 15 + i64.shr_u + i32.wrap_i64 + local.tee 0 + i32.store offset=1980 + i32.const 0 + i32.const 0 + i64.load32_s offset=1940 + i32.const 0 + i64.load32_s offset=1908 + i64.mul + local.get 2 + local.get 3 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=1944 + i32.const 0 + i64.load32_s offset=1912 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=1948 + i32.const 0 + i64.load32_s offset=1916 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=1952 + i32.const 0 + i64.load32_s offset=1920 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=1956 + i32.const 0 + i64.load32_s offset=1924 + i64.mul + i64.add + i64.const 14 + i64.shr_u + i32.wrap_i64 + local.tee 1 + i32.store offset=1960 + i32.const 0 + local.get 0 + local.get 1 + i32.add + local.tee 0 + i32.store offset=1984 + i32.const 0 + i32.const 0 + i32.load offset=1888 + local.get 0 + i32.sub + local.tee 0 + i32.store offset=1988 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=1992 + call $adpcm_enc_quantl + local.tee 0 + i32.store offset=1996 + i32.const 0 + local.get 0 + i32.const -4 + i32.and + local.tee 1 + i32.const 1120 + i32.add + i64.load32_s + i32.const 0 + i64.load32_s offset=1992 + i64.mul + i64.const 15 + i64.shr_u + i32.wrap_i64 + local.tee 0 + i32.store offset=2000 + i32.const 0 + i32.const 0 + i32.load offset=1960 + local.get 0 + i32.add + i32.store offset=2008 + i32.const 0 + local.get 1 + i32.const 1184 + i32.add + i32.load + i32.const 0 + i64.load32_s offset=2004 + i64.const 127 + i64.mul + i64.const 7 + i64.shr_u + i32.wrap_i64 + i32.add + local.tee 1 + i32.const 0 + local.get 1 + i32.const 0 + i32.gt_s + select + local.tee 1 + i32.const 18432 + local.get 1 + i32.const 18432 + i32.lt_s + select + local.tee 1 + i32.store offset=2004 + i32.const 0 + local.get 1 + i32.const 4 + i32.shr_u + i32.const 124 + i32.and + i32.const 1248 + i32.add + i32.load + i32.const 9 + local.get 1 + i32.const 11 + i32.shr_u + i32.sub + i32.shr_s + i32.const 3 + i32.shl + i32.store offset=1992 + local.get 0 + i32.const 1936 + i32.const 1904 + call $adpcm_enc_upzero + i32.const 0 + i32.const 0 + i32.load offset=1964 + i32.store offset=1972 + i32.const 0 + i64.load32_s offset=2016 + local.set 2 + i32.const 0 + i32.const 0 + i32.load offset=2012 + local.tee 0 + i32.store offset=2016 + i32.const 0 + i32.const 0 + i32.load offset=2008 + local.tee 1 + i32.store offset=2012 + i32.const 0 + i32.const 0 + i32.load offset=2000 + i32.const 0 + i32.load offset=1984 + i32.add + local.tee 51 + i32.store offset=2020 + i32.const 0 + local.get 51 + i32.store offset=1964 + i32.const 0 + i64.const 4294967168 + i64.const 128 + local.get 2 + local.get 1 + i64.extend_i32_s + local.tee 3 + i64.mul + i64.const 0 + i64.lt_s + select + i32.const 0 + i64.load32_s offset=1976 + i64.const 127 + i64.mul + i64.const 7 + i64.shr_u + i64.add + i32.const 0 + i64.load32_s offset=1968 + local.tee 2 + i64.const 2 + i64.shl + local.tee 4 + i64.const 0 + local.get 4 + i64.sub + local.get 0 + i64.extend_i32_s + local.get 3 + i64.mul + i64.const 0 + i64.lt_s + local.tee 1 + select + i64.const 7 + i64.shr_u + i64.add + i32.wrap_i64 + local.tee 0 + i32.const 12288 + local.get 0 + i32.const 12288 + i32.lt_s + select + local.tee 0 + i32.const -12288 + local.get 0 + i32.const -12288 + i32.gt_s + select + local.tee 0 + i32.store offset=1976 + i32.const 0 + i32.const -192 + i32.const 192 + local.get 1 + select + local.get 2 + i64.const 255 + i64.mul + i64.const 8 + i64.shr_u + i32.wrap_i64 + i32.add + local.tee 1 + i32.const 15360 + local.get 0 + i32.sub + local.tee 51 + local.get 1 + local.get 51 + i32.lt_s + select + local.tee 1 + local.get 0 + i32.const -15360 + i32.add + local.tee 0 + local.get 1 + local.get 0 + i32.gt_s + select + i32.store offset=1968 + i32.const 0 + i64.load32_s offset=2032 + local.set 2 + i32.const 0 + i64.load32_s offset=2064 + local.set 3 + i32.const 5 + i32.const 5 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i64.load32_s offset=2104 + i32.const 0 + i32.load offset=2100 + i32.const 1 + i32.shl + i64.extend_i32_s + i64.mul + i32.const 0 + i64.load32_s offset=2096 + i32.const 0 + i32.load offset=2092 + i32.const 1 + i32.shl + i64.extend_i32_s + i64.mul + i64.add + i64.const 15 + i64.shr_u + i32.wrap_i64 + local.tee 0 + i32.store offset=2108 + i32.const 0 + i32.const 0 + i64.load32_s offset=2068 + i32.const 0 + i64.load32_s offset=2036 + i64.mul + local.get 3 + local.get 2 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=2072 + i32.const 0 + i64.load32_s offset=2040 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=2076 + i32.const 0 + i64.load32_s offset=2044 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=2080 + i32.const 0 + i64.load32_s offset=2048 + i64.mul + i64.add + i32.const 0 + i64.load32_s offset=2084 + i32.const 0 + i64.load32_s offset=2052 + i64.mul + i64.add + i64.const 14 + i64.shr_u + i32.wrap_i64 + local.tee 1 + i32.store offset=2088 + i32.const 0 + local.get 0 + local.get 1 + i32.add + local.tee 0 + i32.store offset=2112 + i32.const 0 + i32.const 0 + i32.load offset=1892 + local.get 0 + i32.sub + local.tee 0 + i32.store offset=2116 + i32.const 0 + i32.const 3 + i32.const 1 + local.get 0 + i32.const -1 + i32.gt_s + select + local.tee 51 + i32.store offset=2120 + block ;; label = @1 + local.get 0 + local.get 0 + i32.const 31 + i32.shr_s + local.tee 52 + i32.xor + local.get 52 + i32.sub + i32.const 0 + i64.load32_s offset=2124 + local.tee 2 + i64.const 564 + i64.mul + i64.const 12 + i64.shr_u + i32.wrap_i64 + i32.le_s + br_if 0 (;@1;) + i32.const 0 + local.get 51 + i32.const -1 + i32.add + local.tee 51 + i32.store offset=2120 + end + i32.const 0 + local.get 51 + i32.const 2 + i32.shl + local.tee 51 + i32.const 1760 + i32.add + i64.load32_s + local.get 2 + i64.mul + i64.const 15 + i64.shr_u + i32.wrap_i64 + local.tee 0 + i32.store offset=2128 + i32.const 0 + local.get 0 + local.get 1 + i32.add + i32.store offset=2136 + i32.const 0 + local.get 51 + i32.const 1776 + i32.add + i32.load + i32.const 0 + i64.load32_s offset=2132 + i64.const 127 + i64.mul + i64.const 7 + i64.shr_u + i32.wrap_i64 + i32.add + local.tee 1 + i32.const 0 + local.get 1 + i32.const 0 + i32.gt_s + select + local.tee 1 + i32.const 22528 + local.get 1 + i32.const 22528 + i32.lt_s + select + local.tee 1 + i32.store offset=2132 + i32.const 0 + local.get 1 + i32.const 4 + i32.shr_u + i32.const 124 + i32.and + i32.const 1248 + i32.add + i32.load + i32.const 11 + local.get 1 + i32.const 11 + i32.shr_u + i32.sub + i32.shr_s + i32.const 3 + i32.shl + i32.store offset=2124 + local.get 0 + i32.const 2064 + i32.const 2032 + call $adpcm_enc_upzero + i32.const 0 + i32.const 0 + i32.load offset=2092 + i32.store offset=2100 + i32.const 0 + i64.load32_s offset=2144 + local.set 2 + i32.const 0 + i32.const 0 + i32.load offset=2140 + local.tee 0 + i32.store offset=2144 + i32.const 0 + i32.const 0 + i32.load offset=2136 + local.tee 1 + i32.store offset=2140 + i32.const 0 + i32.const 0 + i32.load offset=2128 + i32.const 0 + i32.load offset=2112 + i32.add + local.tee 51 + i32.store offset=2148 + i32.const 0 + local.get 51 + i32.store offset=2092 + i32.const 0 + i64.const 4294967168 + i64.const 128 + local.get 2 + local.get 1 + i64.extend_i32_s + local.tee 3 + i64.mul + i64.const 0 + i64.lt_s + select + i32.const 0 + i64.load32_s offset=2104 + i64.const 127 + i64.mul + i64.const 7 + i64.shr_u + i64.add + i32.const 0 + i64.load32_s offset=2096 + local.tee 2 + i64.const 2 + i64.shl + local.tee 4 + i64.const 0 + local.get 4 + i64.sub + local.get 0 + i64.extend_i32_s + local.get 3 + i64.mul + i64.const 0 + i64.lt_s + local.tee 1 + select + i64.const 7 + i64.shr_u + i64.add + i32.wrap_i64 + local.tee 0 + i32.const 12288 + local.get 0 + i32.const 12288 + i32.lt_s + select + local.tee 0 + i32.const -12288 + local.get 0 + i32.const -12288 + i32.gt_s + select + local.tee 0 + i32.store offset=2104 + i32.const 0 + i32.const -192 + i32.const 192 + local.get 1 + select + local.get 2 + i64.const 255 + i64.mul + i64.const 8 + i64.shr_u + i32.wrap_i64 + i32.add + local.tee 1 + i32.const 15360 + local.get 0 + i32.sub + local.tee 51 + local.get 1 + local.get 51 + i32.lt_s + select + local.tee 1 + local.get 0 + i32.const -15360 + i32.add + local.tee 0 + local.get 1 + local.get 0 + i32.gt_s + select + i32.store offset=2096 + i32.const 0 + i32.load offset=2120 + i32.const 6 + i32.shl + i32.const 0 + i32.load offset=1996 + i32.or) + (func $adpcm_enc_quantl (type 2) (param i32 i32) (result i32) + (local i32 i64 i64) + i32.const 1 + i32.const 30 + call $__pragma_loopbound + i32.const 0 + local.set 2 + block ;; label = @1 + i32.const 0 + i64.load32_s offset=1376 + local.get 1 + i64.extend_i32_s + local.tee 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 0 + local.get 0 + i32.const 31 + i32.shr_s + local.tee 1 + i32.xor + local.get 1 + i32.sub + i64.extend_i32_u + local.tee 4 + i64.ge_s + br_if 0 (;@1;) + i32.const 1 + local.set 2 + i32.const 0 + i64.load32_s offset=1380 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.ge_s + br_if 0 (;@1;) + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1384 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 2 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1388 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 3 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1392 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 4 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1396 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 5 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1400 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 6 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1404 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 7 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1408 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 8 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1412 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 9 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1416 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 10 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1420 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 11 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1424 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 12 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1428 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 13 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1432 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 14 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1436 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 15 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1440 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 16 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1444 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 17 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1448 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 18 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1452 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 19 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1456 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 20 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1460 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 21 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1464 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 22 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1468 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 23 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1472 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 24 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1476 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 25 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1480 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 26 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1484 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 27 + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + i32.const 0 + i64.load32_s offset=1488 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + br_if 0 (;@2;) + i32.const 28 + local.set 2 + br 1 (;@1;) + end + i32.const 30 + i32.const 29 + i32.const 0 + i64.load32_s offset=1492 + local.get 3 + i64.mul + i64.const 15 + i64.shr_s + local.get 4 + i64.lt_s + select + local.set 2 + end + i32.const 1504 + i32.const 1632 + local.get 0 + i32.const -1 + i32.gt_s + select + local.get 2 + i32.const 2 + i32.shl + i32.add + i32.load) + (func $adpcm_enc_upzero (type 3) (param i32 i32 i32) + (local i64) + i32.const 6 + i32.const 6 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 0 + br_if 0 (;@2;) + local.get 2 + local.get 2 + i32.load + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.store + local.get 2 + local.get 2 + i32.load offset=4 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.store offset=4 + local.get 2 + local.get 2 + i32.load offset=8 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.store offset=8 + local.get 2 + local.get 2 + i32.load offset=12 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.store offset=12 + local.get 2 + local.get 2 + i32.load offset=16 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.store offset=16 + local.get 2 + local.get 2 + i32.load offset=20 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.store offset=20 + br 1 (;@1;) + end + local.get 2 + i32.const 128 + i32.const -128 + local.get 1 + i64.load32_s + local.get 0 + i64.extend_i32_s + local.tee 3 + i64.mul + i64.const -1 + i64.gt_s + select + local.get 2 + i32.load + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.add + i32.store + local.get 2 + i32.const 128 + i32.const -128 + local.get 1 + i64.load32_s offset=4 + local.get 3 + i64.mul + i64.const -1 + i64.gt_s + select + local.get 2 + i32.load offset=4 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.add + i32.store offset=4 + local.get 2 + i32.const 128 + i32.const -128 + local.get 1 + i64.load32_s offset=8 + local.get 3 + i64.mul + i64.const -1 + i64.gt_s + select + local.get 2 + i32.load offset=8 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.add + i32.store offset=8 + local.get 2 + i32.const 128 + i32.const -128 + local.get 1 + i64.load32_s offset=12 + local.get 3 + i64.mul + i64.const -1 + i64.gt_s + select + local.get 2 + i32.load offset=12 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.add + i32.store offset=12 + local.get 2 + i32.const 128 + i32.const -128 + local.get 1 + i64.load32_s offset=16 + local.get 3 + i64.mul + i64.const -1 + i64.gt_s + select + local.get 2 + i32.load offset=16 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.add + i32.store offset=16 + local.get 2 + i32.const 128 + i32.const -128 + local.get 1 + i64.load32_s offset=20 + local.get 3 + i64.mul + i64.const -1 + i64.gt_s + select + local.get 2 + i32.load offset=20 + i32.const 255 + i32.mul + i32.const 8 + i32.shr_s + i32.add + i32.store offset=20 + end + local.get 1 + local.get 1 + i32.load offset=16 + i32.store offset=20 + local.get 1 + local.get 1 + i64.load offset=8 align=4 + i64.store offset=12 align=4 + local.get 1 + i32.load + local.set 2 + local.get 1 + local.get 0 + i32.store + local.get 1 + local.get 2 + i32.store offset=4) + (func $adpcm_enc_reset (type 1) + i32.const 0 + i32.const 8 + i32.store offset=2124 + i32.const 0 + i32.const 32 + i32.store offset=1992 + i32.const 0 + i32.const 0 + i32.store offset=1972 + i32.const 0 + i32.const 0 + i32.store offset=1964 + i32.const 0 + i32.const 0 + i32.store offset=2016 + i32.const 0 + i32.const 0 + i32.store offset=2012 + i32.const 0 + i32.const 0 + i32.store offset=1976 + i32.const 0 + i32.const 0 + i32.store offset=1968 + i32.const 0 + i32.const 0 + i32.store offset=2004 + i32.const 0 + i32.const 0 + i32.store offset=2100 + i32.const 0 + i32.const 0 + i32.store offset=2092 + i32.const 0 + i32.const 0 + i32.store offset=2144 + i32.const 0 + i32.const 0 + i32.store offset=2140 + i32.const 0 + i32.const 0 + i32.store offset=2104 + i32.const 0 + i32.const 0 + i32.store offset=2096 + i32.const 0 + i32.const 0 + i32.store offset=2132 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + i32.const 0 + i64.const 0 + i64.store offset=1936 + i32.const 0 + i64.const 0 + i64.store offset=2064 + i32.const 0 + i64.const 0 + i64.store offset=1944 + i32.const 0 + i64.const 0 + i64.store offset=2072 + i32.const 0 + i64.const 0 + i64.store offset=1952 + i32.const 0 + i64.const 0 + i64.store offset=2080 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + i32.const 0 + i64.const 0 + i64.store offset=1904 + i32.const 0 + i64.const 0 + i64.store offset=2032 + i32.const 0 + i64.const 0 + i64.store offset=1912 + i32.const 0 + i64.const 0 + i64.store offset=2040 + i32.const 0 + i64.const 0 + i64.store offset=1920 + i32.const 0 + i64.const 0 + i64.store offset=2048 + i32.const 23 + i32.const 23 + call $__pragma_loopbound + i32.const 0 + i64.const 0 + i64.store offset=1872 + i32.const 0 + i64.const 0 + i64.store offset=1864 + i32.const 0 + i64.const 0 + i64.store offset=1856 + i32.const 0 + i64.const 0 + i64.store offset=1848 + i32.const 0 + i64.const 0 + i64.store offset=1840 + i32.const 0 + i64.const 0 + i64.store offset=1832 + i32.const 0 + i64.const 0 + i64.store offset=1824 + i32.const 0 + i64.const 0 + i64.store offset=1816 + i32.const 0 + i64.const 0 + i64.store offset=1808 + i32.const 0 + i64.const 0 + i64.store offset=1800 + i32.const 0 + i64.const 0 + i64.store offset=1792 + i32.const 0 + i32.const 0 + i32.store offset=1880) + (func $adpcm_enc_main (type 1) + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2160 + i32.const 0 + i32.load offset=2164 + call $adpcm_enc_encode + i32.store offset=2184 + i32.const 0 + i32.const 0 + i32.load offset=2168 + i32.const 0 + i32.load offset=2172 + call $adpcm_enc_encode + i32.store offset=2188) + (func $__original_main (type 4) (result i32) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store offset=12 + call $adpcm_enc_reset + i32.const 3 + i32.const 3 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 1999 + call $__pragma_loopbound + i32.const 849 + i32.const 2424 + call $__pragma_loopbound + i32.const 70845716 + local.set 1 + i32.const 70847286 + local.set 2 + i32.const 5 + local.set 3 + loop ;; label = @1 + local.get 1 + i32.const -2464900 + i32.mul + local.get 3 + local.get 3 + i32.const -1 + i32.add + i32.mul + i32.div_s + local.tee 1 + local.get 2 + i32.add + local.set 2 + local.get 3 + i32.const 2 + i32.add + local.set 3 + local.get 1 + br_if 0 (;@1;) + end + i32.const 0 + local.get 0 + i32.load offset=12 + local.get 2 + i32.const 10 + i32.mul + i32.add + i32.store offset=2160 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 1999 + call $__pragma_loopbound + i32.const 849 + i32.const 2424 + call $__pragma_loopbound + i32.const 256842837 + local.set 1 + i32.const 256838125 + local.set 2 + i32.const 5 + local.set 3 + loop ;; label = @1 + local.get 1 + i32.const -22202944 + i32.mul + local.get 3 + local.get 3 + i32.const -1 + i32.add + i32.mul + i32.div_s + local.tee 1 + local.get 2 + i32.add + local.set 2 + local.get 3 + i32.const 2 + i32.add + local.set 3 + local.get 1 + br_if 0 (;@1;) + end + i32.const 0 + local.get 0 + i32.load offset=12 + local.get 2 + i32.const 10 + i32.mul + i32.add + i32.store offset=2164 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 1999 + call $__pragma_loopbound + i32.const 849 + i32.const 2424 + call $__pragma_loopbound + i32.const 256842837 + local.set 1 + i32.const 256838125 + local.set 2 + i32.const 5 + local.set 3 + loop ;; label = @1 + local.get 1 + i32.const -22202944 + i32.mul + local.get 3 + local.get 3 + i32.const -1 + i32.add + i32.mul + i32.div_s + local.tee 1 + local.get 2 + i32.add + local.set 2 + local.get 3 + i32.const 2 + i32.add + local.set 3 + local.get 1 + br_if 0 (;@1;) + end + i32.const 0 + local.get 0 + i32.load offset=12 + local.get 2 + i32.const 10 + i32.mul + i32.add + i32.store offset=2168 + call $adpcm_enc_main + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 0 + i32.load offset=2184 + local.set 3 + i32.const 0 + i32.load offset=2188 + local.set 1 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1 + local.get 3 + i32.add + i32.const 385 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 6304)) + (global (;1;) i32 (i32.const 2196)) + (global (;2;) i32 (i32.const 6304)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $adpcm_enc_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "\0c\00\00\00\d4\ff\ff\ff\d4\ff\ff\ff\d4\00\00\000\00\00\00\90\fd\ff\ff\80\00\00\00\a8\05\00\00\b8\fc\ff\ffl\f3\ff\ff\dc\0e\00\00\90<\00\00\90<\00\00\dc\0e\00\00l\f3\ff\ff\b8\fc\ff\ff\a8\05\00\00\80\00\00\00\90\fd\ff\ff0\00\00\00\d4\00\00\00\d4\ff\ff\ff\d4\ff\ff\ff\0c\00\00\00\00\00\00\00\18\b0\ff\ff\a0\cd\ff\ff\f8\dc\ff\ffp\e7\ff\ffp\ef\ff\ff\e8\f5\ff\ffP\fb\ff\ff\e8O\00\00`2\00\00\08#\00\00\90\18\00\00\90\10\00\00\18\0a\00\00\b0\04\00\00\00\00\00\00\c4\ff\ff\ff\e2\0b\00\00\ae\04\00\00\1a\02\00\00N\01\00\00\ac\00\00\00:\00\00\00\e2\ff\ff\ff\e2\0b\00\00\ae\04\00\00\1a\02\00\00N\01\00\00\ac\00\00\00:\00\00\00\e2\ff\ff\ff\c4\ff\ff\ff\00\08\00\00-\08\00\00[\08\00\00\8a\08\00\00\b9\08\00\00\ea\08\00\00\1c\09\00\00O\09\00\00\83\09\00\00\b9\09\00\00\ef\09\00\00'\0a\00\00`\0a\00\00\9a\0a\00\00\d6\0a\00\00\12\0b\00\00P\0b\00\00\90\0b\00\00\d1\0b\00\00\13\0c\00\00V\0c\00\00\9c\0c\00\00\e2\0c\00\00+\0d\00\00t\0d\00\00\c0\0d\00\00\0d\0e\00\00\5c\0e\00\00\ac\0e\00\00\fe\0e\00\00R\0f\00\00\a8\0f\00\00\18\01\00\00@\02\00\00p\03\00\00\b0\04\00\00\f0\05\00\00H\07\00\00\a0\08\00\00\18\0a\00\00\90\0b\00\000\0d\00\00\c8\0e\00\00\90\10\00\00X\12\00\00P\14\00\00P\16\00\00\90\18\00\00\d0\1a\00\00`\1d\00\00\f8\1f\00\00\08#\00\00\18&\00\00\d8)\00\00\90-\00\00`2\00\00(7\00\00\e0=\00\00\98D\00\00\e8O\00\008[\00\00\ff\7f\00\00\00\00\00\00\00\00\00\00=\00\00\00<\00\00\00;\00\00\00:\00\00\009\00\00\008\00\00\007\00\00\006\00\00\005\00\00\004\00\00\003\00\00\002\00\00\001\00\00\000\00\00\00/\00\00\00.\00\00\00-\00\00\00,\00\00\00+\00\00\00*\00\00\00)\00\00\00(\00\00\00'\00\00\00&\00\00\00%\00\00\00$\00\00\00#\00\00\00\22\00\00\00!\00\00\00 \00\00\00 \00\00\00\00\00\00\00?\00\00\00>\00\00\00\1f\00\00\00\1e\00\00\00\1d\00\00\00\1c\00\00\00\1b\00\00\00\1a\00\00\00\19\00\00\00\18\00\00\00\17\00\00\00\16\00\00\00\15\00\00\00\14\00\00\00\13\00\00\00\12\00\00\00\11\00\00\00\10\00\00\00\0f\00\00\00\0e\00\00\00\0d\00\00\00\0c\00\00\00\0b\00\00\00\0a\00\00\00\09\00\00\00\08\00\00\00\07\00\00\00\06\00\00\00\05\00\00\00\04\00\00\00\04\00\00\00\00\00\00\00\10\e3\ff\ff\b0\f9\ff\ff\f0\1c\00\00P\06\00\00\1e\03\00\00*\ff\ff\ff\1e\03\00\00*\ff\ff\ff")) diff --git a/targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/default/adpcm_enc.c b/targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/default/adpcm_enc.c new file mode 100644 index 0000000..4e8a2ee --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/default/adpcm_enc.c @@ -0,0 +1,706 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: adpcm_enc + + Author: Sung-Soo Lim + + Function: CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) + algorithm. 16khz sample rate data is stored in the array test_data[ SIZE ]. + Results are stored in the array compressed[ SIZE ]. + Execution time is determined by the constant SIZE (default value is 2000). + + + Source: C Algorithms for Real-Time DSP by P. M. Embree + and SNU-RT Benchmark Suite for Worst Case Timing Analysis + collected and modified by S.-S. Lim + + Original name: adpcm_encoder + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely, but the + SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* common sampling rate for sound cards on IBM/PC */ +#define SAMPLE_RATE 11025 + +#define PI 3141 +#define SIZE 3 +#define IN_END 4 + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int adpcm_enc_encode(int, int); +int adpcm_enc_filtez(int *bpl, int *dlt); +void adpcm_enc_upzero(int dlt, int *dlti, int *bli); +int adpcm_enc_filtep(int rlt1, int al1, int rlt2, int al2); +int adpcm_enc_quantl(int el, int detl); +int adpcm_enc_logscl(int il, int nbl); +int adpcm_enc_scalel(int nbl, int shift_constant); +int adpcm_enc_uppol2(int al1, int al2, int plt, int plt1, int plt2); +int adpcm_enc_uppol1(int al1, int apl2, int plt, int plt1); +int adpcm_enc_logsch(int ih, int nbh); +void adpcm_enc_reset(); +int adpcm_enc_fabs(int n); +int adpcm_enc_cos(int n); +int adpcm_enc_sin(int n); +int adpcm_enc_abs(int n); +void adpcm_enc_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_enc_main(void); +int adpcm_enc_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Forward declaration of global variables +*/ + +int adpcm_enc_test_data[SIZE * 2], adpcm_enc_compressed[SIZE]; + +/* G722 C code */ + +/* variables for transimit quadrature mirror filter here */ +int adpcm_enc_tqmf[24]; + +/* QMF filter coefficients: + scaled by a factor of 4 compared to G722 CCITT recommendation */ +int adpcm_enc_h[24] = {12, -44, -44, 212, 48, -624, 128, 1448, + -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, + 1448, 128, -624, 48, 212, -44, -44, 12}; + +int adpcm_enc_xl, adpcm_enc_xh; + +/* variables for encoder (hi and lo) here */ + +int adpcm_enc_il, adpcm_enc_szl, adpcm_enc_spl, adpcm_enc_sl, adpcm_enc_el; + +int adpcm_enc_qq4_code4_table[16] = {0, -20456, -12896, -8968, -6288, -4240, + -2584, -1200, 20456, 12896, 8968, 6288, + 4240, 2584, 1200, 0}; + +int adpcm_enc_qq5_code5_table[32] = { + -280, -280, -23352, -17560, -14120, -11664, -9752, -8184, + -6864, -5712, -4696, -3784, -2960, -2208, -1520, -880, + 23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712, + 4696, 3784, 2960, 2208, 1520, 880, 280, -280}; + +int adpcm_enc_qq6_code6_table[64] = { + -136, -136, -136, -136, -24808, -21904, -19008, -16704, + -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, + -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, + -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, + 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, + 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, + 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, + 1688, 1360, 1040, 728, 432, 136, -432, -136}; + +int adpcm_enc_delay_bpl[6]; + +int adpcm_enc_delay_dltx[6]; + +int adpcm_enc_wl_code_table[16] = {-60, 3042, 1198, 538, 334, 172, 58, -30, + 3042, 1198, 538, 334, 172, 58, -30, -60}; + +int adpcm_enc_ilb_table[32] = {2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, + 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, + 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, + 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008}; + +int adpcm_enc_nbl; /* delay line */ +int adpcm_enc_al1, adpcm_enc_al2; +int adpcm_enc_plt, adpcm_enc_plt1, adpcm_enc_plt2; +int adpcm_enc_dlt; +int adpcm_enc_rlt, adpcm_enc_rlt1, adpcm_enc_rlt2; + +/* decision levels - pre-multiplied by 8, 0 to indicate end */ +int adpcm_enc_decis_levl[30] = { + 280, 576, 880, 1200, 1520, 1864, 2208, 2584, 2960, 3376, + 3784, 4240, 4696, 5200, 5712, 6288, 6864, 7520, 8184, 8968, + 9752, 10712, 11664, 12896, 14120, 15840, 17560, 20456, 23352, 32767}; + +int adpcm_enc_detl; + +/* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ +int adpcm_enc_quant26bt_pos[31] = {61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, + 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, + 39, 38, 37, 36, 35, 34, 33, 32, 32}; + +/* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ +int adpcm_enc_quant26bt_neg[31] = {63, 62, 31, 30, 29, 28, 27, 26, 25, 24, 23, + 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, + 11, 10, 9, 8, 7, 6, 5, 4, 4}; + +int adpcm_enc_deth; +int adpcm_enc_sh; /* this comes from adaptive predictor */ +int adpcm_enc_eh; + +int adpcm_enc_qq2_code2_table[4] = {-7408, -1616, 7408, 1616}; + +int adpcm_enc_wh_code_table[4] = {798, -214, 798, -214}; + +int adpcm_enc_dh, adpcm_enc_ih; +int adpcm_enc_nbh, adpcm_enc_szh; +int adpcm_enc_sph, adpcm_enc_ph, adpcm_enc_yh; + +int adpcm_enc_delay_dhx[6]; +int adpcm_enc_delay_bph[6]; + +int adpcm_enc_ah1, adpcm_enc_ah2; +int adpcm_enc_ph1, adpcm_enc_ph2; +int adpcm_enc_rh1, adpcm_enc_rh2; + +/* G722 encode function two ints in, one 8 bit output */ + +/* put input samples in xin1 = first value, xin2 = second value */ +/* returns il and ih stored together */ + +/* MAX: 1 */ +int +adpcm_enc_abs(int n) { + int m; + + if (n >= 0) + m = n; + else + m = -n; + + return m; +} + +/* MAX: 1 */ +int +adpcm_enc_fabs(int n) { + int f; + + if (n >= 0) + f = n; + else + f = -n; + + return f; +} + +#pragma GCC push_options +#pragma GCC optimize "-fwrapv" +int +adpcm_enc_sin(int rad) { + int diff; + int app = 0; + int inc = 1; + + /* MAX dependent on rad's value, say 50 */ + __pragma_loopbound(0, 0); + while (rad > 2 * PI) + rad -= 2 * PI; + + /* MAX dependent on rad's value, say 50 */ + __pragma_loopbound(0, 1999); + while (rad < -2 * PI) + rad += 2 * PI; + + diff = rad; + app = diff; + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + + /* REALLY: while(my_fabs(diff) >= 0.00001) { */ + /* MAX: 1000 */ + __pragma_loopbound(849, 2424); + while (adpcm_enc_fabs(diff) >= 1) { + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + } + + return app; +} +#pragma GCC pop_options + +int +adpcm_enc_cos(int rad) { + return (adpcm_enc_sin(PI / 2 - rad)); +} + +/* MAX: 1 */ +int +adpcm_enc_encode(int xin1, int xin2) { + int i; + int *h_ptr, *tqmf_ptr, *tqmf_ptr1; + long long int xa, xb; + int decis; + + /* transmit quadrature mirror filters implemented here */ + h_ptr = adpcm_enc_h; + tqmf_ptr = adpcm_enc_tqmf; + xa = (long long) (*tqmf_ptr++) * (*h_ptr++); + xb = (long long) (*tqmf_ptr++) * (*h_ptr++); + + /* main multiply accumulate loop for samples and coefficients */ + /* MAX: 10 */ + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + xa += (long long) (*tqmf_ptr++) * (*h_ptr++); + xb += (long long) (*tqmf_ptr++) * (*h_ptr++); + } + + /* final mult/accumulate */ + xa += (long long) (*tqmf_ptr++) * (*h_ptr++); + xb += (long long) (*tqmf_ptr) * (*h_ptr++); + + /* update delay line tqmf */ + tqmf_ptr1 = tqmf_ptr - 2; + /* MAX: 22 */ + __pragma_loopbound(22, 22); + for (i = 0; i < 22; i++) + *tqmf_ptr-- = *tqmf_ptr1--; + + *tqmf_ptr-- = xin1; + *tqmf_ptr = xin2; + + /* scale outputs */ + adpcm_enc_xl = (xa + xb) >> 15; + adpcm_enc_xh = (xa - xb) >> 15; + + /* end of quadrature mirror filter code */ + + /* starting with lower sub band encoder */ + + /* filtez - compute predictor output section - zero section */ + adpcm_enc_szl = adpcm_enc_filtez(adpcm_enc_delay_bpl, adpcm_enc_delay_dltx); + + /* filtep - compute predictor output signal (pole section) */ + adpcm_enc_spl = adpcm_enc_filtep(adpcm_enc_rlt1, adpcm_enc_al1, + adpcm_enc_rlt2, adpcm_enc_al2); + + /* compute the predictor output value in the lower sub_band encoder */ + adpcm_enc_sl = adpcm_enc_szl + adpcm_enc_spl; + adpcm_enc_el = adpcm_enc_xl - adpcm_enc_sl; + + /* quantl: quantize the difference signal */ + adpcm_enc_il = adpcm_enc_quantl(adpcm_enc_el, adpcm_enc_detl); + + /* invqxl: computes quantized difference signal */ + /* for invqbl, truncate by 2 lsbs, so mode = 3 */ + adpcm_enc_dlt = ((long long) adpcm_enc_detl * + adpcm_enc_qq4_code4_table[adpcm_enc_il >> 2]) >> + 15; + + /* logscl: updates logarithmic quant. scale factor in low sub band */ + adpcm_enc_nbl = adpcm_enc_logscl(adpcm_enc_il, adpcm_enc_nbl); + + /* scalel: compute the quantizer scale factor in the lower sub band */ + /* calling parameters nbl and 8 (constant such that scalel can be scaleh) */ + adpcm_enc_detl = adpcm_enc_scalel(adpcm_enc_nbl, 8); + + /* parrec - simple addition to compute recontructed signal for adaptive pred + */ + adpcm_enc_plt = adpcm_enc_dlt + adpcm_enc_szl; + + /* upzero: update zero section predictor coefficients (sixth order)*/ + /* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */ + /* bpli (linear_buffer in which all six values are delayed */ + /* return params: updated bpli, delayed dltx */ + adpcm_enc_upzero(adpcm_enc_dlt, adpcm_enc_delay_dltx, adpcm_enc_delay_bpl); + + /* uppol2- update second predictor coefficient apl2 and delay it as al2 */ + /* calling parameters: al1, al2, plt, plt1, plt2 */ + adpcm_enc_al2 = + adpcm_enc_uppol2(adpcm_enc_al1, adpcm_enc_al2, adpcm_enc_plt, + adpcm_enc_plt1, adpcm_enc_plt2); + + /* uppol1 :update first predictor coefficient apl1 and delay it as al1 */ + /* calling parameters: al1, apl2, plt, plt1 */ + adpcm_enc_al1 = adpcm_enc_uppol1(adpcm_enc_al1, adpcm_enc_al2, + adpcm_enc_plt, adpcm_enc_plt1); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_enc_rlt = adpcm_enc_sl + adpcm_enc_dlt; + + /* done with lower sub_band encoder; now implement delays for next time*/ + adpcm_enc_rlt2 = adpcm_enc_rlt1; + adpcm_enc_rlt1 = adpcm_enc_rlt; + adpcm_enc_plt2 = adpcm_enc_plt1; + adpcm_enc_plt1 = adpcm_enc_plt; + + /* high band encode */ + + adpcm_enc_szh = adpcm_enc_filtez(adpcm_enc_delay_bph, adpcm_enc_delay_dhx); + + adpcm_enc_sph = adpcm_enc_filtep(adpcm_enc_rh1, adpcm_enc_ah1, + adpcm_enc_rh2, adpcm_enc_ah2); + + /* predic: sh = sph + szh */ + adpcm_enc_sh = adpcm_enc_sph + adpcm_enc_szh; + /* subtra: eh = xh - sh */ + adpcm_enc_eh = adpcm_enc_xh - adpcm_enc_sh; + + /* quanth - quantization of difference signal for higher sub-band */ + /* quanth: in-place for speed params: eh, deth (has init. value) */ + if (adpcm_enc_eh >= 0) + adpcm_enc_ih = 3; /* 2,3 are pos codes */ + else + adpcm_enc_ih = 1; /* 0,1 are neg codes */ + + decis = (564L * (long long) adpcm_enc_deth) >> 12L; + if (adpcm_enc_abs(adpcm_enc_eh) > decis) + adpcm_enc_ih--; /* mih = 2 case */ + + /* invqah: compute the quantized difference signal, higher sub-band*/ + adpcm_enc_dh = ((long long) adpcm_enc_deth * + adpcm_enc_qq2_code2_table[adpcm_enc_ih]) >> + 15L; + + /* logsch: update logarithmic quantizer scale factor in hi sub-band*/ + adpcm_enc_nbh = adpcm_enc_logsch(adpcm_enc_ih, adpcm_enc_nbh); + + /* note : scalel and scaleh use same code, different parameters */ + adpcm_enc_deth = adpcm_enc_scalel(adpcm_enc_nbh, 10); + + /* parrec - add pole predictor output to quantized diff. signal */ + adpcm_enc_ph = adpcm_enc_dh + adpcm_enc_szh; + + /* upzero: update zero section predictor coefficients (sixth order) */ + /* calling parameters: dh, dhi, bphi */ + /* return params: updated bphi, delayed dhx */ + adpcm_enc_upzero(adpcm_enc_dh, adpcm_enc_delay_dhx, adpcm_enc_delay_bph); + + /* uppol2: update second predictor coef aph2 and delay as ah2 */ + /* calling params: ah1, ah2, ph, ph1, ph2 */ + adpcm_enc_ah2 = adpcm_enc_uppol2(adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, + adpcm_enc_ph1, adpcm_enc_ph2); + + /* uppol1: update first predictor coef. aph2 and delay it as ah1 */ + adpcm_enc_ah1 = adpcm_enc_uppol1(adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, + adpcm_enc_ph1); + + /* recons for higher sub-band */ + adpcm_enc_yh = adpcm_enc_sh + adpcm_enc_dh; + + /* done with higher sub-band encoder, now Delay for next time */ + adpcm_enc_rh2 = adpcm_enc_rh1; + adpcm_enc_rh1 = adpcm_enc_yh; + adpcm_enc_ph2 = adpcm_enc_ph1; + adpcm_enc_ph1 = adpcm_enc_ph; + + /* multiplex ih and il to get signals together */ + return (adpcm_enc_il | (adpcm_enc_ih << 6)); +} + +/* filtez - compute predictor output signal (zero section) */ +/* input: bpl1-6 and dlt1-6, output: szl */ +int +adpcm_enc_filtez(int *bpl, int *dlt) { + int i; + long long int zl; + + zl = (long long) (*bpl++) * (*dlt++); + + /* MAX: 5 */ + __pragma_loopbound(5, 5); + for (i = 1; i < 6; i++) + zl += (long long) (*bpl++) * (*dlt++); + + return ((int) (zl >> 14)); /* x2 here */ +} + +/* filtep - compute predictor output signal (pole section) */ +/* input rlt1-2 and al1-2, output spl */ +int +adpcm_enc_filtep(int rlt1, int al1, int rlt2, int al2) { + long long int pl, pl2; + + pl = 2 * rlt1; + pl = (long long) al1 * pl; + pl2 = 2 * rlt2; + pl += (long long) al2 * pl2; + + return ((int) (pl >> 15)); +} + +/* quantl - quantize the difference signal in the lower sub-band */ +int +adpcm_enc_quantl(int el, int detl) { + int ril, mil; + long long int wd, decis; + + /* abs of difference signal */ + wd = adpcm_enc_abs(el); + + /* determine mil based on decision levels and detl gain */ + /* MAX: 30 */ + __pragma_loopbound(1, 30); + for (mil = 0; mil < 30; mil++) { + decis = (adpcm_enc_decis_levl[mil] * (long long) detl) >> 15L; + if (wd <= decis) + break; + } + + /* if mil=30 then wd is less than all decision levels */ + if (el >= 0) + ril = adpcm_enc_quant26bt_pos[mil]; + else + ril = adpcm_enc_quant26bt_neg[mil]; + + return (ril); +} + +/* invqxl is either invqbl or invqal depending on parameters passed */ +/* returns dlt, code table is pre-multiplied by 8 */ + +/* int invqxl(int il,int detl,int *code_table,int mode) */ +/* { */ +/* long long int dlt; */ +/* dlt = (long long)detl*code_table[ il >> (mode-1) ]; */ +/* return((int)(dlt >> 15)); */ +/* } */ + +/* logscl - update log quantizer scale factor in lower sub-band */ +/* note that nbl is passed and returned */ +int +adpcm_enc_logscl(int il, int nbl) { + long long int wd; + + wd = ((long long) nbl * 127L) >> 7L; /* leak factor 127/128 */ + nbl = (int) wd + adpcm_enc_wl_code_table[il >> 2]; + + if (nbl < 0) + nbl = 0; + if (nbl > 18432) + nbl = 18432; + + return (nbl); +} + +/* scalel: compute quantizer scale factor in lower or upper sub-band*/ +int +adpcm_enc_scalel(int nbl, int shift_constant) { + int wd1, wd2, wd3; + + wd1 = (nbl >> 6) & 31; + wd2 = nbl >> 11; + wd3 = adpcm_enc_ilb_table[wd1] >> (shift_constant + 1 - wd2); + + return (wd3 << 3); +} + +/* upzero - inputs: dlt, dlti[ 0-5 ], bli[ 0-5 ], outputs: updated bli[ 0-5 ] */ +/* also implements delay of bli and update of dlti from dlt */ +void +adpcm_enc_upzero(int dlt, int *dlti, int *bli) { + int i, wd2, wd3; + + /*if dlt is zero, then no sum into bli */ + if (dlt == 0) { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + } + + } else { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + if ((long long) dlt * dlti[i] >= 0) + wd2 = 128; + else + wd2 = -128; + + wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + bli[i] = wd2 + wd3; + } + } + + /* implement delay line for dlt */ + dlti[5] = dlti[4]; + dlti[4] = dlti[3]; + dlti[3] = dlti[2]; + dlti[1] = dlti[0]; + dlti[0] = dlt; + + return; +} + +/* uppol2 - update second predictor coefficient (pole section) */ +/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ +int +adpcm_enc_uppol2(int al1, int al2, int plt, int plt1, int plt2) { + long long int wd2, wd4; + int apl2; + + wd2 = 4L * (long long) al1; + if ((long long) plt * plt1 >= 0L) + wd2 = -wd2; /* check same sign */ + wd2 = wd2 >> 7; /* gain of 1/128 */ + + if ((long long) plt * plt2 >= 0L) { + wd4 = wd2 + 128; /* same sign case */ + } else + wd4 = wd2 - 128; + apl2 = wd4 + (127L * (long long) al2 >> 7L); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ + if (apl2 > 12288) + apl2 = 12288; + if (apl2 < -12288) + apl2 = -12288; + + return (apl2); +} + +/* uppol1 - update first predictor coefficient (pole section) */ +/* inputs: al1, apl2, plt, plt1. outputs: apl1 */ +int +adpcm_enc_uppol1(int al1, int apl2, int plt, int plt1) { + long long int wd2; + int wd3, apl1; + + wd2 = ((long long) al1 * 255L) >> 8L; /* leak factor of 255/256 */ + if ((long long) plt * plt1 >= 0L) { + apl1 = (int) wd2 + 192; /* same sign case */ + } else + apl1 = (int) wd2 - 192; + + /* note: wd3= .9375-.75 is always positive */ + wd3 = 15360 - apl2; /* limit value */ + if (apl1 > wd3) + apl1 = wd3; + if (apl1 < -wd3) + apl1 = -wd3; + + return (apl1); +} + +/* INVQAH: inverse adaptive quantizer for the higher sub-band */ +/* returns dh, code table is pre-multiplied by 8 */ +/* int invqah(int ih,int deth) */ +/* { */ +/* long long int rdh; */ +/* rdh = ((long long)deth*qq2_code2_table[ ih ]) >> 15L ; */ +/* return((int)(rdh )); */ +/* } */ + +/* logsch - update log quantizer scale factor in higher sub-band */ +/* note that nbh is passed and returned */ +int +adpcm_enc_logsch(int ih, int nbh) { + int wd; + + wd = ((long long) nbh * 127L) >> 7L; /* leak factor 127/128 */ + nbh = wd + adpcm_enc_wh_code_table[ih]; + + if (nbh < 0) + nbh = 0; + if (nbh > 22528) + nbh = 22528; + + return (nbh); +} + +/* + Initialization- and return-value-related functions +*/ + +/* clear all storage locations */ + +void +adpcm_enc_reset(void) { + int i; + + adpcm_enc_detl = 32; /* reset to min scale factor */ + adpcm_enc_deth = 8; + adpcm_enc_nbl = adpcm_enc_al1 = adpcm_enc_al2 = adpcm_enc_plt1 = + adpcm_enc_plt2 = adpcm_enc_rlt1 = adpcm_enc_rlt2 = 0; + adpcm_enc_nbh = adpcm_enc_ah1 = adpcm_enc_ah2 = adpcm_enc_ph1 = + adpcm_enc_ph2 = adpcm_enc_rh1 = adpcm_enc_rh2 = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + adpcm_enc_delay_dltx[i] = 0; + adpcm_enc_delay_dhx[i] = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + adpcm_enc_delay_bpl[i] = 0; + adpcm_enc_delay_bph[i] = 0; + } + + __pragma_loopbound(23, 23); + for (i = 0; i < 23; i++) + adpcm_enc_tqmf[i] = 0; + + return; +} + +void +adpcm_enc_init(void) { + int i, j, f; + volatile int x = 0; + + /* reset, initialize required memory */ + adpcm_enc_reset(); + + /* read in amplitude and frequency for test data */ + j = 10; + f = 2000; + + /* 16 KHz sample rate */ + /* XXmain_0, MAX: 2 */ + /* Since the number of times we loop in my_sin depends on the argument we + add the fact: xxmain_0:[ ]: */ + __pragma_loopbound(3, 3); + for (i = 0; i < SIZE; i++) { + adpcm_enc_test_data[i] = (int) j * adpcm_enc_cos(f * PI * i); + + /* avoid constant-propagation optimizations */ + adpcm_enc_test_data[i] += x; + } +} + +int +adpcm_enc_return(void) { + int i; + int check_sum = 0; + + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) + check_sum += adpcm_enc_compressed[i / 2]; + + return check_sum != 385; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_enc_main(void) { + int i; + /* MAX: 2 */ + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) + adpcm_enc_compressed[i / 2] = adpcm_enc_encode( + adpcm_enc_test_data[i], adpcm_enc_test_data[i + 1]); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + adpcm_enc_init(); + adpcm_enc_main(); + + return adpcm_enc_return(); +} diff --git a/targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/inline/adpcm_enc.c b/targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/inline/adpcm_enc.c new file mode 100644 index 0000000..e1fcc9d --- /dev/null +++ b/targets/wasm-tacle/sequential/adpcm_enc/generated/modified_sources/inline/adpcm_enc.c @@ -0,0 +1,723 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: adpcm_enc + + Author: Sung-Soo Lim + + Function: CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation) + algorithm. 16khz sample rate data is stored in the array test_data[ SIZE ]. + Results are stored in the array compressed[ SIZE ]. + Execution time is determined by the constant SIZE (default value is 2000). + + + Source: C Algorithms for Real-Time DSP by P. M. Embree + and SNU-RT Benchmark Suite for Worst Case Timing Analysis + collected and modified by S.-S. Lim + + Original name: adpcm_encoder + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely, but the + SNU-RT Benchmark Suite must be acknowledged + +*/ + +/* common sampling rate for sound cards on IBM/PC */ +#define SAMPLE_RATE 11025 + +#define PI 3141 +#define SIZE 3 +#define IN_END 4 + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int adpcm_enc_encode(int, int); +__attribute__((always_inline)) static inline int adpcm_enc_filtez(int *bpl, + int *dlt); +__attribute__((always_inline)) static inline void +adpcm_enc_upzero(int dlt, int *dlti, int *bli); +__attribute__((always_inline)) static inline int +adpcm_enc_filtep(int rlt1, int al1, int rlt2, int al2); +__attribute__((always_inline)) static inline int adpcm_enc_quantl(int el, + int detl); +__attribute__((always_inline)) static inline int adpcm_enc_logscl(int il, + int nbl); +__attribute__((always_inline)) static inline int +adpcm_enc_scalel(int nbl, int shift_constant); +__attribute__((always_inline)) static inline int +adpcm_enc_uppol2(int al1, int al2, int plt, int plt1, int plt2); +__attribute__((always_inline)) static inline int +adpcm_enc_uppol1(int al1, int apl2, int plt, int plt1); +__attribute__((always_inline)) static inline int adpcm_enc_logsch(int ih, + int nbh); +__attribute__((always_inline)) static inline void adpcm_enc_reset(); +__attribute__((always_inline)) static inline int adpcm_enc_fabs(int n); +__attribute__((always_inline)) static inline int adpcm_enc_cos(int n); +__attribute__((always_inline)) static inline int adpcm_enc_sin(int n); +__attribute__((always_inline)) static inline int adpcm_enc_abs(int n); +__attribute__((always_inline)) static inline void adpcm_enc_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_enc_main(void); +__attribute__((always_inline)) static inline int adpcm_enc_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Forward declaration of global variables +*/ + +int adpcm_enc_test_data[SIZE * 2], adpcm_enc_compressed[SIZE]; + +/* G722 C code */ + +/* variables for transimit quadrature mirror filter here */ +int adpcm_enc_tqmf[24]; + +/* QMF filter coefficients: + scaled by a factor of 4 compared to G722 CCITT recommendation */ +int adpcm_enc_h[24] = {12, -44, -44, 212, 48, -624, 128, 1448, + -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, + 1448, 128, -624, 48, 212, -44, -44, 12}; + +int adpcm_enc_xl, adpcm_enc_xh; + +/* variables for encoder (hi and lo) here */ + +int adpcm_enc_il, adpcm_enc_szl, adpcm_enc_spl, adpcm_enc_sl, adpcm_enc_el; + +int adpcm_enc_qq4_code4_table[16] = {0, -20456, -12896, -8968, -6288, -4240, + -2584, -1200, 20456, 12896, 8968, 6288, + 4240, 2584, 1200, 0}; + +int adpcm_enc_qq5_code5_table[32] = { + -280, -280, -23352, -17560, -14120, -11664, -9752, -8184, + -6864, -5712, -4696, -3784, -2960, -2208, -1520, -880, + 23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712, + 4696, 3784, 2960, 2208, 1520, 880, 280, -280}; + +int adpcm_enc_qq6_code6_table[64] = { + -136, -136, -136, -136, -24808, -21904, -19008, -16704, + -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, + -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, + -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, + 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, + 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, + 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, + 1688, 1360, 1040, 728, 432, 136, -432, -136}; + +int adpcm_enc_delay_bpl[6]; + +int adpcm_enc_delay_dltx[6]; + +int adpcm_enc_wl_code_table[16] = {-60, 3042, 1198, 538, 334, 172, 58, -30, + 3042, 1198, 538, 334, 172, 58, -30, -60}; + +int adpcm_enc_ilb_table[32] = {2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, + 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, + 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, + 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008}; + +int adpcm_enc_nbl; /* delay line */ +int adpcm_enc_al1, adpcm_enc_al2; +int adpcm_enc_plt, adpcm_enc_plt1, adpcm_enc_plt2; +int adpcm_enc_dlt; +int adpcm_enc_rlt, adpcm_enc_rlt1, adpcm_enc_rlt2; + +/* decision levels - pre-multiplied by 8, 0 to indicate end */ +int adpcm_enc_decis_levl[30] = { + 280, 576, 880, 1200, 1520, 1864, 2208, 2584, 2960, 3376, + 3784, 4240, 4696, 5200, 5712, 6288, 6864, 7520, 8184, 8968, + 9752, 10712, 11664, 12896, 14120, 15840, 17560, 20456, 23352, 32767}; + +int adpcm_enc_detl; + +/* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ +int adpcm_enc_quant26bt_pos[31] = {61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, + 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, + 39, 38, 37, 36, 35, 34, 33, 32, 32}; + +/* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ +int adpcm_enc_quant26bt_neg[31] = {63, 62, 31, 30, 29, 28, 27, 26, 25, 24, 23, + 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, + 11, 10, 9, 8, 7, 6, 5, 4, 4}; + +int adpcm_enc_deth; +int adpcm_enc_sh; /* this comes from adaptive predictor */ +int adpcm_enc_eh; + +int adpcm_enc_qq2_code2_table[4] = {-7408, -1616, 7408, 1616}; + +int adpcm_enc_wh_code_table[4] = {798, -214, 798, -214}; + +int adpcm_enc_dh, adpcm_enc_ih; +int adpcm_enc_nbh, adpcm_enc_szh; +int adpcm_enc_sph, adpcm_enc_ph, adpcm_enc_yh; + +int adpcm_enc_delay_dhx[6]; +int adpcm_enc_delay_bph[6]; + +int adpcm_enc_ah1, adpcm_enc_ah2; +int adpcm_enc_ph1, adpcm_enc_ph2; +int adpcm_enc_rh1, adpcm_enc_rh2; + +/* G722 encode function two ints in, one 8 bit output */ + +/* put input samples in xin1 = first value, xin2 = second value */ +/* returns il and ih stored together */ + +/* MAX: 1 */ +__attribute__((always_inline)) static inline int +adpcm_enc_abs(int n) { + int m; + + if (n >= 0) + m = n; + else + m = -n; + + return m; +} + +/* MAX: 1 */ +__attribute__((always_inline)) static inline int +adpcm_enc_fabs(int n) { + int f; + + if (n >= 0) + f = n; + else + f = -n; + + return f; +} + +#pragma GCC push_options +#pragma GCC optimize "-fwrapv" +__attribute__((always_inline)) static inline int +adpcm_enc_sin(int rad) { + int diff; + int app = 0; + int inc = 1; + + /* MAX dependent on rad's value, say 50 */ + __pragma_loopbound(0, 0); + while (rad > 2 * PI) + rad -= 2 * PI; + + /* MAX dependent on rad's value, say 50 */ + __pragma_loopbound(0, 1999); + while (rad < -2 * PI) + rad += 2 * PI; + + diff = rad; + app = diff; + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + + /* REALLY: while(my_fabs(diff) >= 0.00001) { */ + /* MAX: 1000 */ + __pragma_loopbound(849, 2424); + while (adpcm_enc_fabs(diff) >= 1) { + diff = (diff * (-(rad * rad))) / ((2 * inc) * (2 * inc + 1)); + app = app + diff; + inc++; + } + + return app; +} +#pragma GCC pop_options + +__attribute__((always_inline)) static inline int +adpcm_enc_cos(int rad) { + return (adpcm_enc_sin(PI / 2 - rad)); +} + +/* MAX: 1 */ +__attribute__((always_inline)) static inline int +adpcm_enc_encode(int xin1, int xin2) { + int i; + int *h_ptr, *tqmf_ptr, *tqmf_ptr1; + long long int xa, xb; + int decis; + + /* transmit quadrature mirror filters implemented here */ + h_ptr = adpcm_enc_h; + tqmf_ptr = adpcm_enc_tqmf; + xa = (long long) (*tqmf_ptr++) * (*h_ptr++); + xb = (long long) (*tqmf_ptr++) * (*h_ptr++); + + /* main multiply accumulate loop for samples and coefficients */ + /* MAX: 10 */ + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + xa += (long long) (*tqmf_ptr++) * (*h_ptr++); + xb += (long long) (*tqmf_ptr++) * (*h_ptr++); + } + + /* final mult/accumulate */ + xa += (long long) (*tqmf_ptr++) * (*h_ptr++); + xb += (long long) (*tqmf_ptr) * (*h_ptr++); + + /* update delay line tqmf */ + tqmf_ptr1 = tqmf_ptr - 2; + /* MAX: 22 */ + __pragma_loopbound(22, 22); + for (i = 0; i < 22; i++) + *tqmf_ptr-- = *tqmf_ptr1--; + + *tqmf_ptr-- = xin1; + *tqmf_ptr = xin2; + + /* scale outputs */ + adpcm_enc_xl = (xa + xb) >> 15; + adpcm_enc_xh = (xa - xb) >> 15; + + /* end of quadrature mirror filter code */ + + /* starting with lower sub band encoder */ + + /* filtez - compute predictor output section - zero section */ + adpcm_enc_szl = adpcm_enc_filtez(adpcm_enc_delay_bpl, adpcm_enc_delay_dltx); + + /* filtep - compute predictor output signal (pole section) */ + adpcm_enc_spl = adpcm_enc_filtep(adpcm_enc_rlt1, adpcm_enc_al1, + adpcm_enc_rlt2, adpcm_enc_al2); + + /* compute the predictor output value in the lower sub_band encoder */ + adpcm_enc_sl = adpcm_enc_szl + adpcm_enc_spl; + adpcm_enc_el = adpcm_enc_xl - adpcm_enc_sl; + + /* quantl: quantize the difference signal */ + adpcm_enc_il = adpcm_enc_quantl(adpcm_enc_el, adpcm_enc_detl); + + /* invqxl: computes quantized difference signal */ + /* for invqbl, truncate by 2 lsbs, so mode = 3 */ + adpcm_enc_dlt = ((long long) adpcm_enc_detl * + adpcm_enc_qq4_code4_table[adpcm_enc_il >> 2]) >> + 15; + + /* logscl: updates logarithmic quant. scale factor in low sub band */ + adpcm_enc_nbl = adpcm_enc_logscl(adpcm_enc_il, adpcm_enc_nbl); + + /* scalel: compute the quantizer scale factor in the lower sub band */ + /* calling parameters nbl and 8 (constant such that scalel can be scaleh) */ + adpcm_enc_detl = adpcm_enc_scalel(adpcm_enc_nbl, 8); + + /* parrec - simple addition to compute recontructed signal for adaptive pred + */ + adpcm_enc_plt = adpcm_enc_dlt + adpcm_enc_szl; + + /* upzero: update zero section predictor coefficients (sixth order)*/ + /* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */ + /* bpli (linear_buffer in which all six values are delayed */ + /* return params: updated bpli, delayed dltx */ + adpcm_enc_upzero(adpcm_enc_dlt, adpcm_enc_delay_dltx, adpcm_enc_delay_bpl); + + /* uppol2- update second predictor coefficient apl2 and delay it as al2 */ + /* calling parameters: al1, al2, plt, plt1, plt2 */ + adpcm_enc_al2 = + adpcm_enc_uppol2(adpcm_enc_al1, adpcm_enc_al2, adpcm_enc_plt, + adpcm_enc_plt1, adpcm_enc_plt2); + + /* uppol1 :update first predictor coefficient apl1 and delay it as al1 */ + /* calling parameters: al1, apl2, plt, plt1 */ + adpcm_enc_al1 = adpcm_enc_uppol1(adpcm_enc_al1, adpcm_enc_al2, + adpcm_enc_plt, adpcm_enc_plt1); + + /* recons : compute recontructed signal for adaptive predictor */ + adpcm_enc_rlt = adpcm_enc_sl + adpcm_enc_dlt; + + /* done with lower sub_band encoder; now implement delays for next time*/ + adpcm_enc_rlt2 = adpcm_enc_rlt1; + adpcm_enc_rlt1 = adpcm_enc_rlt; + adpcm_enc_plt2 = adpcm_enc_plt1; + adpcm_enc_plt1 = adpcm_enc_plt; + + /* high band encode */ + + adpcm_enc_szh = adpcm_enc_filtez(adpcm_enc_delay_bph, adpcm_enc_delay_dhx); + + adpcm_enc_sph = adpcm_enc_filtep(adpcm_enc_rh1, adpcm_enc_ah1, + adpcm_enc_rh2, adpcm_enc_ah2); + + /* predic: sh = sph + szh */ + adpcm_enc_sh = adpcm_enc_sph + adpcm_enc_szh; + /* subtra: eh = xh - sh */ + adpcm_enc_eh = adpcm_enc_xh - adpcm_enc_sh; + + /* quanth - quantization of difference signal for higher sub-band */ + /* quanth: in-place for speed params: eh, deth (has init. value) */ + if (adpcm_enc_eh >= 0) + adpcm_enc_ih = 3; /* 2,3 are pos codes */ + else + adpcm_enc_ih = 1; /* 0,1 are neg codes */ + + decis = (564L * (long long) adpcm_enc_deth) >> 12L; + if (adpcm_enc_abs(adpcm_enc_eh) > decis) + adpcm_enc_ih--; /* mih = 2 case */ + + /* invqah: compute the quantized difference signal, higher sub-band*/ + adpcm_enc_dh = ((long long) adpcm_enc_deth * + adpcm_enc_qq2_code2_table[adpcm_enc_ih]) >> + 15L; + + /* logsch: update logarithmic quantizer scale factor in hi sub-band*/ + adpcm_enc_nbh = adpcm_enc_logsch(adpcm_enc_ih, adpcm_enc_nbh); + + /* note : scalel and scaleh use same code, different parameters */ + adpcm_enc_deth = adpcm_enc_scalel(adpcm_enc_nbh, 10); + + /* parrec - add pole predictor output to quantized diff. signal */ + adpcm_enc_ph = adpcm_enc_dh + adpcm_enc_szh; + + /* upzero: update zero section predictor coefficients (sixth order) */ + /* calling parameters: dh, dhi, bphi */ + /* return params: updated bphi, delayed dhx */ + adpcm_enc_upzero(adpcm_enc_dh, adpcm_enc_delay_dhx, adpcm_enc_delay_bph); + + /* uppol2: update second predictor coef aph2 and delay as ah2 */ + /* calling params: ah1, ah2, ph, ph1, ph2 */ + adpcm_enc_ah2 = adpcm_enc_uppol2(adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, + adpcm_enc_ph1, adpcm_enc_ph2); + + /* uppol1: update first predictor coef. aph2 and delay it as ah1 */ + adpcm_enc_ah1 = adpcm_enc_uppol1(adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, + adpcm_enc_ph1); + + /* recons for higher sub-band */ + adpcm_enc_yh = adpcm_enc_sh + adpcm_enc_dh; + + /* done with higher sub-band encoder, now Delay for next time */ + adpcm_enc_rh2 = adpcm_enc_rh1; + adpcm_enc_rh1 = adpcm_enc_yh; + adpcm_enc_ph2 = adpcm_enc_ph1; + adpcm_enc_ph1 = adpcm_enc_ph; + + /* multiplex ih and il to get signals together */ + return (adpcm_enc_il | (adpcm_enc_ih << 6)); +} + +/* filtez - compute predictor output signal (zero section) */ +/* input: bpl1-6 and dlt1-6, output: szl */ +__attribute__((always_inline)) static inline int +adpcm_enc_filtez(int *bpl, int *dlt) { + int i; + long long int zl; + + zl = (long long) (*bpl++) * (*dlt++); + + /* MAX: 5 */ + __pragma_loopbound(5, 5); + for (i = 1; i < 6; i++) + zl += (long long) (*bpl++) * (*dlt++); + + return ((int) (zl >> 14)); /* x2 here */ +} + +/* filtep - compute predictor output signal (pole section) */ +/* input rlt1-2 and al1-2, output spl */ +__attribute__((always_inline)) static inline int +adpcm_enc_filtep(int rlt1, int al1, int rlt2, int al2) { + long long int pl, pl2; + + pl = 2 * rlt1; + pl = (long long) al1 * pl; + pl2 = 2 * rlt2; + pl += (long long) al2 * pl2; + + return ((int) (pl >> 15)); +} + +/* quantl - quantize the difference signal in the lower sub-band */ +__attribute__((always_inline)) static inline int +adpcm_enc_quantl(int el, int detl) { + int ril, mil; + long long int wd, decis; + + /* abs of difference signal */ + wd = adpcm_enc_abs(el); + + /* determine mil based on decision levels and detl gain */ + /* MAX: 30 */ + __pragma_loopbound(1, 30); + for (mil = 0; mil < 30; mil++) { + decis = (adpcm_enc_decis_levl[mil] * (long long) detl) >> 15L; + if (wd <= decis) + break; + } + + /* if mil=30 then wd is less than all decision levels */ + if (el >= 0) + ril = adpcm_enc_quant26bt_pos[mil]; + else + ril = adpcm_enc_quant26bt_neg[mil]; + + return (ril); +} + +/* invqxl is either invqbl or invqal depending on parameters passed */ +/* returns dlt, code table is pre-multiplied by 8 */ + +/* int invqxl(int il,int detl,int *code_table,int mode) */ +/* { */ +/* long long int dlt; */ +/* dlt = (long long)detl*code_table[ il >> (mode-1) ]; */ +/* return((int)(dlt >> 15)); */ +/* } */ + +/* logscl - update log quantizer scale factor in lower sub-band */ +/* note that nbl is passed and returned */ +__attribute__((always_inline)) static inline int +adpcm_enc_logscl(int il, int nbl) { + long long int wd; + + wd = ((long long) nbl * 127L) >> 7L; /* leak factor 127/128 */ + nbl = (int) wd + adpcm_enc_wl_code_table[il >> 2]; + + if (nbl < 0) + nbl = 0; + if (nbl > 18432) + nbl = 18432; + + return (nbl); +} + +/* scalel: compute quantizer scale factor in lower or upper sub-band*/ +__attribute__((always_inline)) static inline int +adpcm_enc_scalel(int nbl, int shift_constant) { + int wd1, wd2, wd3; + + wd1 = (nbl >> 6) & 31; + wd2 = nbl >> 11; + wd3 = adpcm_enc_ilb_table[wd1] >> (shift_constant + 1 - wd2); + + return (wd3 << 3); +} + +/* upzero - inputs: dlt, dlti[ 0-5 ], bli[ 0-5 ], outputs: updated bli[ 0-5 ] */ +/* also implements delay of bli and update of dlti from dlt */ +__attribute__((always_inline)) static inline void +adpcm_enc_upzero(int dlt, int *dlti, int *bli) { + int i, wd2, wd3; + + /*if dlt is zero, then no sum into bli */ + if (dlt == 0) { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + } + + } else { + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + if ((long long) dlt * dlti[i] >= 0) + wd2 = 128; + else + wd2 = -128; + + wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ + bli[i] = wd2 + wd3; + } + } + + /* implement delay line for dlt */ + dlti[5] = dlti[4]; + dlti[4] = dlti[3]; + dlti[3] = dlti[2]; + dlti[1] = dlti[0]; + dlti[0] = dlt; + + return; +} + +/* uppol2 - update second predictor coefficient (pole section) */ +/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ +__attribute__((always_inline)) static inline int +adpcm_enc_uppol2(int al1, int al2, int plt, int plt1, int plt2) { + long long int wd2, wd4; + int apl2; + + wd2 = 4L * (long long) al1; + if ((long long) plt * plt1 >= 0L) + wd2 = -wd2; /* check same sign */ + wd2 = wd2 >> 7; /* gain of 1/128 */ + + if ((long long) plt * plt2 >= 0L) { + wd4 = wd2 + 128; /* same sign case */ + } else + wd4 = wd2 - 128; + apl2 = wd4 + (127L * (long long) al2 >> 7L); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ + if (apl2 > 12288) + apl2 = 12288; + if (apl2 < -12288) + apl2 = -12288; + + return (apl2); +} + +/* uppol1 - update first predictor coefficient (pole section) */ +/* inputs: al1, apl2, plt, plt1. outputs: apl1 */ +__attribute__((always_inline)) static inline int +adpcm_enc_uppol1(int al1, int apl2, int plt, int plt1) { + long long int wd2; + int wd3, apl1; + + wd2 = ((long long) al1 * 255L) >> 8L; /* leak factor of 255/256 */ + if ((long long) plt * plt1 >= 0L) { + apl1 = (int) wd2 + 192; /* same sign case */ + } else + apl1 = (int) wd2 - 192; + + /* note: wd3= .9375-.75 is always positive */ + wd3 = 15360 - apl2; /* limit value */ + if (apl1 > wd3) + apl1 = wd3; + if (apl1 < -wd3) + apl1 = -wd3; + + return (apl1); +} + +/* INVQAH: inverse adaptive quantizer for the higher sub-band */ +/* returns dh, code table is pre-multiplied by 8 */ +/* int invqah(int ih,int deth) */ +/* { */ +/* long long int rdh; */ +/* rdh = ((long long)deth*qq2_code2_table[ ih ]) >> 15L ; */ +/* return((int)(rdh )); */ +/* } */ + +/* logsch - update log quantizer scale factor in higher sub-band */ +/* note that nbh is passed and returned */ +__attribute__((always_inline)) static inline int +adpcm_enc_logsch(int ih, int nbh) { + int wd; + + wd = ((long long) nbh * 127L) >> 7L; /* leak factor 127/128 */ + nbh = wd + adpcm_enc_wh_code_table[ih]; + + if (nbh < 0) + nbh = 0; + if (nbh > 22528) + nbh = 22528; + + return (nbh); +} + +/* + Initialization- and return-value-related functions +*/ + +/* clear all storage locations */ + +__attribute__((always_inline)) static inline void +adpcm_enc_reset(void) { + int i; + + adpcm_enc_detl = 32; /* reset to min scale factor */ + adpcm_enc_deth = 8; + adpcm_enc_nbl = adpcm_enc_al1 = adpcm_enc_al2 = adpcm_enc_plt1 = + adpcm_enc_plt2 = adpcm_enc_rlt1 = adpcm_enc_rlt2 = 0; + adpcm_enc_nbh = adpcm_enc_ah1 = adpcm_enc_ah2 = adpcm_enc_ph1 = + adpcm_enc_ph2 = adpcm_enc_rh1 = adpcm_enc_rh2 = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + adpcm_enc_delay_dltx[i] = 0; + adpcm_enc_delay_dhx[i] = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) { + adpcm_enc_delay_bpl[i] = 0; + adpcm_enc_delay_bph[i] = 0; + } + + __pragma_loopbound(23, 23); + for (i = 0; i < 23; i++) + adpcm_enc_tqmf[i] = 0; + + return; +} + +__attribute__((always_inline)) static inline void +adpcm_enc_init(void) { + int i, j, f; + volatile int x = 0; + + /* reset, initialize required memory */ + adpcm_enc_reset(); + + /* read in amplitude and frequency for test data */ + j = 10; + f = 2000; + + /* 16 KHz sample rate */ + /* XXmain_0, MAX: 2 */ + /* Since the number of times we loop in my_sin depends on the argument we + add the fact: xxmain_0:[ ]: */ + __pragma_loopbound(3, 3); + for (i = 0; i < SIZE; i++) { + adpcm_enc_test_data[i] = (int) j * adpcm_enc_cos(f * PI * i); + + /* avoid constant-propagation optimizations */ + adpcm_enc_test_data[i] += x; + } +} + +__attribute__((always_inline)) static inline int +adpcm_enc_return(void) { + int i; + int check_sum = 0; + + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) + check_sum += adpcm_enc_compressed[i / 2]; + + return check_sum != 385; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +adpcm_enc_main(void) { + int i; + /* MAX: 2 */ + __pragma_loopbound(2, 2); + for (i = 0; i < IN_END; i += 2) + adpcm_enc_compressed[i / 2] = adpcm_enc_encode( + adpcm_enc_test_data[i], adpcm_enc_test_data[i + 1]); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + adpcm_enc_init(); + adpcm_enc_main(); + + return adpcm_enc_return(); +} diff --git a/targets/wasm-tacle/sequential/ammunition/CMakeLists.txt b/targets/wasm-tacle/sequential/ammunition/CMakeLists.txt new file mode 100644 index 0000000..9511199 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/CMakeLists.txt @@ -0,0 +1,28 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(ammunition) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/ammunition.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/ammunition.c" + "generated/modified_sources/default/ammunition_libc.c" + "generated/modified_sources/default/arithm.c" + "generated/modified_sources/default/bits.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/ammunition/ChangeLog.txt b/targets/wasm-tacle/sequential/ammunition/ChangeLog.txt new file mode 100755 index 0000000..2c2f635 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ChangeLog.txt @@ -0,0 +1,66 @@ +File: ammunition.c +Original provenience: DINO programming language + +2016-03-03: +- Add generic TACLeBench header +- Prefix global functions with benchmark name +- Introduce volatile result variable for return statements +- Split code into ammunition_init and ammunition_main +- Fix compiler warnings "array subscript is of type 'char'": + char => unsigned char +- Fix compiler warnings "'&&' within '||'": + Place additional parentheses +- Remove usages and comments related to the macros + HAVE_MEMMOVE, NDEBUG, HAVE_MEMCMP +- Remove comment related to unused NO_TEMPLATE macro +2016-05-02: +- Change C++ style comments to ISO C90 compliant comments +- Avoid mixing declarations and code: move declaration of variable writePos in + functions ammunition_sprintf_d and ammunition_sprintf_u +- Change datatype in function ammunition_bits_test of iteration variables i and + j from int to unsigned int to avoid comparison between signed and unsigned + integer expressions +- Add forward declarations to ammunition.c +- Introduce variable ammunition_result +- Parantheses around comparison in functions ammunition_isdigit and + ammunition_isspace +- Remove usage of limits.h, move definitions of limits into separate file + ammunition_limits.h +- Remove unconditional assignments of variable result to zero after each test in + functions ammunition_bits_test and ammunition_arithm_test +- Remove unused functions unsigned_integer_maximum, integer_minimum, + integer_maximum, integer_remainder +- Remove unused declaration of function default_arithmetic_overflow_reaction +- Remove unused variables zero_constant_itself, zero_constant +- Remove unused declarations of functions set_unsigned_integer_overflow_reaction + and set_integer_overflow_reaction +- Remove block #ifndef MAX_INTEGER_OPERAND_SIZE, set definition of + MAX_INTEGER_OPERAND_SIZE to 128, since this is default +2016-05-10: +- Integrate new version of arithm library from ammunition repository from + dino repository on github (commit: db9cfab042c332abb234ec8d72750103010981c1), + which hanles arithmetic shifts by negative numbers. This change now makes all + test cases in ammunition.c pass. Update headers unsigned int bits => int bits +- Remove assert statements +- Fix memcmp implementation: dereferencing pointer was missing +- Add loop-bound annotation to memcmp +- Fix strcmp implementation +- Integrate working versions of memcpy and memset from pm benchmark +- Update signature of ammunition_memcpy to original version: + void *memcpy(void *dest, const void *src, size_t n); +- Move functions from libc into separate file, introduce header files + ammunition_limits.h, ammunition_stdio.h, ammunition_stdlib.h, + ammunition_string.h +- Fix overflow in sprintf_d: change datatype of variable 'copyOfNumber' from int + to long, since the negative value of INT_MIN is undefined + 2016-05-17: +- Remove all static declarations of global functions +- Rename variables 'digit_number' to digit_num to keep lines below 80 characters +- Rename op1_digit_number to op1_digit_number and op1_digit_num in function + 'ammunition_multiply_unsigned_integer_without_overflow_reaction' +- Rename variable 'scaled_op1_digit_number' in function + 'ammunition_divide_unsigned_integer_without_overflow_reaction' +- Apply code formatting with astyle + +2017-08-18: +- Add explicit casts to silence g++ warnings. diff --git a/targets/wasm-tacle/sequential/ammunition/README b/targets/wasm-tacle/sequential/ammunition/README new file mode 100755 index 0000000..8caddf4 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/README @@ -0,0 +1,86 @@ +This directory AMMUNITION contains reusable packages on C/C++: +`allocate', `vlobject', `objstack', `hashtab', `commline', `ticker', +`position', `errors', `bits', `arithm', `IEEE': + o allocate + Allocating and freeing memory with automatic fixing some + allocation errors. + o vlobject + Work with variable length objects (VLO). Any number of bytes + may be added to and removed from the end of VLO. If it is + needed the memory allocated for storing variable length object + may be expanded possibly with changing the object place. But + between any additions of the bytes (or tailoring) the object + place is not changed. To decrease number of changes of the + object place the memory being allocated for the object is + longer than the current object length. + o objstack + Work with stacks of objects (OS). Work with the object on the + stack top is analogous to one with a variable length object. + One motivation for the package is the problem of growing char + strings in symbol tables. Memory for OS is allocated by + segments. A segment may contain more one objects. The most + recently allocated segment contains object on the top of OS. + If there is not sufficient free memory for the top object than + new segment is created and the top object is transferred into + the new segment, i.e. there is not any memory reallocation. + Therefore the top object may change its address. But other + objects never change address. + o hashtab + Work with hash tables. The package permits to work + simultaneously with several expandable hash tables. Besides + insertion and search of elements the elements from the hash + tables can be also removed. The table element can be only a + pointer. The size of hash tables is not fixed. The hash + table will be automatically expanded when its occupancy will + became big. + o position + Work with source code positions. The package serves to + support information about source positions of compiled files + taking all included files into account. + o errors + Output of compiler messages. The package serves output + one-pass or multi-pass compiler messages of various modes + (errors, warnings, fatal, system errors and appended messages) + in Unix style or for traditional listing. The package also + permits adequate error reporting for included files. + o commline + Work with command line. The package implements features + analogous to ones of public domain function `getopt'. The + goal of the package creation is to use more readable language + of command line description and to use command line + description as help output of program. + o ticker + Simultaneous work with several tickers (timers). + o bits + Work with bit strings (copying, moving, setting, testing, + comparison). + o arithm + Implementing host machine-independently arbitrary precision + integer numbers arithmetic. The implementation of the package + functions are not sufficiently efficient in order to use for + run-time. The package functions are oriented to implement + constant-folding in compilers, cross-compilers. + o IEEE + Implementing host machine-independently IEEE floating point + arithmetic. The implementation of the package functions are + not sufficiently efficient in order to use for run-time. The + package functions are oriented to implement constant-folding + in compilers, cross-compilers. + + There are files with corresponding names and extensions `.h' +(interface file for C/C++), `.c' (implementation file on C), and +`.cpp' (implementation file on C++). + + To install AMMUNITION see file INSTALL in the current directory. + + There are also shell scripts for testing the package with +corresponding names and extension `.tst'. Documentation of the +reusable packages is in files `ammunition.txt', `ammunition.dvi', +`ammunition.ps', `ammunition.info*', `ammunition*.html', +`ammunition*.rtf' for C and `ammunition++.txt', `ammunition++.dvi', +`ammunition++.ps', `ammunition++.info*', `ammunition++*.html', +`ammunition++*.rtf'. + +Please send bug reports and comments to vmakarov@fnmail.com + +Vladimir Makarov diff --git a/targets/wasm-tacle/sequential/ammunition/ammunition.c b/targets/wasm-tacle/sequential/ammunition/ammunition.c new file mode 100755 index 0000000..ba5e4c7 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ammunition.c @@ -0,0 +1,1179 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: ammunition + + Author: Vladimir Makarov + + Function: Tests reusable packages bits and arith + bits: Work with bit strings (copying, moving, setting, testing, comparison). + arith: Implementing host machine-independently arbitrary precision integer + numbers arithmetic. The implementation of the package functions are not + sufficiently efficient in order to use for run-time. The package + functions are oriented to implement constant-folding in compilers, + cross-compilers. + + Source: DINO programming language repository + https://github.com/dino-lang/dino/ + + Changes: no major functional changes + + License: GPL 2 and LGPL 2 + +*/ + +#include "bits.h" +#include "arithm.h" +#include "ammunition_stdlib.h" +#include "ammunition_stdio.h" +#include "ammunition_string.h" + +/* + Forward declaration of functions +*/ + +void ammunition_reset_str_bits( char *str, char *s ); +void ammunition_reset_str_arithm( char *str, char *s, char *d, char *e, + char *g ); +int ammunition_bits_test(); +int ammunition_arithm_test(); +void ammunition_init( void ); +int ammunition_return( void ); +void ammunition_main( void ); +int main( void ); + + +/* + Forward declaration of global variables +*/ + +int ammunition_result; + + +/* + Core functions +*/ + +void ammunition_reset_str_bits( char *str, char *s ) +{ + int i; + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < 8; i++ ) { + str[ i ] = 0; + s[ i ] = 0; + } +} + + +void ammunition_reset_str_arithm( char *str, char *s, char *d, char *e, + char *g ) +{ + int i; + _Pragma( "loopbound min 20 max 20" ) + for ( i = 0; i < 20; i++ ) { + str[ i ] = 0; + s[ i ] = 0; + } + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < 4; i++ ) { + d[ i ] = 0; + e[ i ] = 0; + } + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; i++ ) + g[ i ] = 0; +} + + +int ammunition_bits_test() +{ + char str[ 8 ]; + char str1[ 8 ]; + + int result = 0; + unsigned int i, j; + + /* Test 1 */ + ammunition_reset_str_bits( str, str1 ); + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < sizeof ( str ) * CHAR_BIT; i++ ) { + if ( BIT ( str, i ) ) + result = 1; + } + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < sizeof ( str ) * CHAR_BIT; i++ ) { + SET_BIT ( str, i, 1 ); + _Pragma( "loopbound min 64 max 64" ) + for ( j = 0; j < sizeof ( str ) * CHAR_BIT; j++ ) + if ( j <= i ) { + if ( BIT ( str, j ) == 0 ) + result = 1; + } else + if ( BIT ( str, j ) ) + result = 1; + } + + /* Test 2 */ + ammunition_reset_str_bits( str, str1 ); + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < sizeof ( str ) * CHAR_BIT; i++ ) + if ( !ammunition_is_zero_bit_string ( + str, i, ( sizeof ( str ) * CHAR_BIT - i ) / 2 + 1 ) ) + result = 1; + ammunition_bit_string_set ( str, 13, 1, 35 ); + _Pragma( "loopbound min 13 max 13" ) + for ( i = 0; i < 13; i++ ) + if ( !ammunition_is_zero_bit_string ( str, i, 13 - i ) ) + result = 1; + _Pragma( "loopbound min 35 max 35" ) + for ( i = 13; i < 48; i++ ) + if ( ammunition_is_zero_bit_string ( str, i, 48 - i ) ) + result = 1; + _Pragma( "loopbound min 16 max 16" ) + for ( i = 48; i < sizeof ( str ) * CHAR_BIT; i++ ) + if ( !ammunition_is_zero_bit_string ( str, i, + sizeof ( str ) * CHAR_BIT - i ) ) + result = 1; + + /* Test 3 */ + ammunition_reset_str_bits( str, str1 ); + + _Pragma( "loopbound min 42 max 42" ) + for ( i = 0; i + i / 2 + 1 < sizeof ( str ) * CHAR_BIT; i++ ) { + ammunition_bit_string_set ( str, i, 1, i / 2 + 1 ); + if ( !ammunition_is_zero_bit_string ( str, 0, i - 1 ) ) + result = 1; + if ( ammunition_is_zero_bit_string ( str, i, i / 2 + 1 ) ) + result = 1; + if ( !ammunition_is_zero_bit_string ( + str, i + i / 2 + 1, sizeof ( str ) * CHAR_BIT - ( i + i / 2 + 1 ) ) ) + result = 1; + ammunition_bit_string_set ( str, 0, 0, sizeof ( str ) * CHAR_BIT ); + } + + /* Test 4 */ + ammunition_reset_str_bits( str, str1 ); + + ammunition_bit_string_set ( str, 2, 1, 43 ); + ammunition_bit_string_set ( str1, 2, 1, 40 ); + _Pragma( "loopbound min 42 max 42" ) + for ( i = 0; i < 42; i++ ) + if ( ammunition_bit_string_comparison ( str, i, str1, i, 42 - i ) != 0 ) + result = 1; + _Pragma( "loopbound min 43 max 43" ) + for ( i = 0; i < 43; i++ ) + if ( ammunition_bit_string_comparison ( str, i, str1, i, + sizeof ( str ) * CHAR_BIT - i ) + <= 0 ) + result = 1; + _Pragma( "loopbound min 43 max 43" ) + for ( i = 0; i < 43; i++ ) + if ( ammunition_bit_string_comparison ( str1, i, str, i, + sizeof ( str ) * CHAR_BIT - i ) + >= 0 ) + result = 1; + + /* Test 5 */ + ammunition_reset_str_bits( str, str1 ); + + ammunition_bit_string_set ( str, 2, 1, 43 ); + _Pragma( "loopbound min 59 max 59" ) + for ( i = 0; i + 5 < sizeof ( str ) * CHAR_BIT; i++ ) { + ammunition_bit_string_copy ( str1, i + 5, str, i, + sizeof ( str ) * CHAR_BIT - i - 5 ); + if ( ammunition_bit_string_comparison ( + str1, i + 5, str, i, sizeof ( str ) * CHAR_BIT - i - 5 ) != 0 ) + result = 1; + } + + /* Test 6 */ + ammunition_reset_str_bits( str, str1 ); + + ammunition_bit_string_set ( str, 2, 1, 43 ); + ammunition_bit_string_set ( str1, 2, 1, 43 ); + _Pragma( "loopbound min 59 max 59" ) + for ( i = 0; i + 5 < sizeof ( str ) * CHAR_BIT; i++ ) { + ammunition_bit_string_set ( str, 0, 0, sizeof ( str ) * CHAR_BIT ); + ammunition_bit_string_set ( str, 2, 1, 43 ); + ammunition_bit_string_move ( str, i + 5, str, i, + sizeof ( str ) * CHAR_BIT - i - 5 ); + if ( ammunition_bit_string_comparison ( + str, i + 5, str1, i, sizeof ( str ) * CHAR_BIT - i - 5 ) != 0 ) + result = 1; + } + + /* Test 7 */ + ammunition_reset_str_bits( str, str1 ); + + ammunition_bit_string_set ( str, 2, 1, 43 ); + ammunition_bit_string_set ( str1, 2, 1, 43 ); + _Pragma( "loopbound min 59 max 59" ) + for ( i = 0; i + 5 < sizeof ( str ) * CHAR_BIT; i++ ) { + ammunition_bit_string_set ( str, 0, 0, sizeof ( str ) * CHAR_BIT ); + ammunition_bit_string_set ( str, 2, 1, 43 ); + ammunition_bit_string_move ( str, i, str, i + 5, + sizeof ( str ) * CHAR_BIT - i - 5 ); + if ( ammunition_bit_string_comparison ( + str, i, str1, i + 5, sizeof ( str ) * CHAR_BIT - i - 5 ) != 0 ) + result = 1; + } + + return result; +} + + +int ammunition_arithm_test() +{ + int result = 0; + + /* Test 1 */ + int i; + char str [ 20 ], s[ 20 ], d[ 4 ], e[ 4 ], g[ 6 ]; + + ammunition_integer_from_string ( 4, "-2147483649", d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_d( str, INT_MIN ); + ammunition_integer_from_string ( 4, str, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "2147483648", d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_d( str, INT_MAX ); + ammunition_integer_from_string ( 4, str, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = -2000; i < 2000 ; i++ ) { + ammunition_sprintf_d( str, i ); + ammunition_integer_from_string ( 4, str, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + } + + /* Test 2 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "4294967296", d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_u( str, UINT_MAX ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = 0; i < 4000 ; i++ ) { + ammunition_sprintf_u( str, i ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + } + + /* Test 3 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_sprintf_d( str, INT_MAX ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_integer_from_string ( 4, "1", e ); + ammunition_add_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_d( str, INT_MAX - 4 ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, 4 ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_add_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + ammunition_sprintf_d( str, INT_MAX ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = -2000; i < 2000 ; i++ ) { + ammunition_sprintf_d( str, i ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, i + 1 ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_add_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_atoi ( s ) != i + i + 1 ) + result = 1; + } + + /* Test 4 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_sprintf_u( str, UINT_MAX ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_unsigned_integer_from_string ( 4, "1", e ); + ammunition_add_unsigned_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_u( str, UINT_MAX - 4 ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, 4 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_add_unsigned_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + ammunition_sprintf_u( str, UINT_MAX ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = 0; i < 4000 ; i++ ) { + ammunition_sprintf_u( str, i ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, i + 1 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_add_unsigned_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_atoi ( s ) != i + i + 1 ) + result = 1; + } + + /* Test 5 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_sprintf_d( str, INT_MIN ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_integer_from_string ( 4, "1", e ); + ammunition_subtract_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_d( str, INT_MIN + 4 ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, 4 ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_subtract_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + ammunition_sprintf_d( str, INT_MIN ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = -2000; i < 2000 ; i++ ) { + ammunition_sprintf_d( str, i ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, 10 - i ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_subtract_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_atoi ( s ) != i + i - 10 ) + result = 1; + } + + /* Test 6 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_sprintf_u( str, UINT_MAX - 2 ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, UINT_MAX - 1 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_subtract_unsigned_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_u( str, UINT_MAX ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_subtract_unsigned_integer ( 4, d, d, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = 0; i < 4000 ; i++ ) { + ammunition_sprintf_u( str, i ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, i / 2 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_subtract_unsigned_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_atoi ( s ) != i - i / 2 ) + result = 1; + } + + /* Test 7 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_sprintf_d( str, INT_MAX / 2 + 1 ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_integer_from_string ( 4, "2", e ); + ammunition_multiply_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_d( str, INT_MIN / 2 - 1 ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_integer_from_string ( 4, "2", e ); + ammunition_multiply_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_d( str, INT_MAX / 3 ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, 3 ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_multiply_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + ammunition_sprintf_d( str, ( INT_MAX / 3 ) * 3 ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + ammunition_sprintf_d( str, INT_MIN / 2 ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, 2 ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_multiply_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + ammunition_sprintf_d( str, ( INT_MIN / 2 ) * 2 ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = -2000; i < 2000 ; i++ ) { + ammunition_sprintf_d( str, i ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, i + 1000 ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_multiply_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_atoi ( s ) != i * ( i + 1000 ) ) + result = 1; + } + + /* Test 8 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_sprintf_u( str, UINT_MAX / 5 + 1 ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, 5 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_multiply_unsigned_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_sprintf_u( str, UINT_MAX / 2 ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, 2 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_multiply_unsigned_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + ammunition_sprintf_u( str, ( UINT_MAX / 2 ) * 2 ); + if ( ammunition_strcmp ( s, str ) != 0 ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = 0; i < 4000 ; i++ ) { + ammunition_sprintf_u( str, i ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, i / 2 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_multiply_unsigned_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_atoi ( s ) != i * ( i / 2 ) ) + result = 1; + } + + /* Test 9 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "10", d ); + ammunition_integer_from_string ( 4, "0", e ); + ammunition_divide_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = -2000; i < 2000 ; i++ ) { + ammunition_sprintf_d( str, i ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_sprintf_d( str, ( i < 0 ? - i / 20 + 1 : - i / 20 - 1 ) ); + ammunition_integer_from_string ( 4, str, e ); + ammunition_divide_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_atoi ( s ) != i / ( i < 0 ? - i / 20 + 1 : - i / 20 - 1 ) ) + result = 1; + ammunition_sprintf_d( str, i ); + ammunition_integer_from_string ( 4, str, d ); + ammunition_divide_integer ( 4, d, e, e ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_atoi ( s ) != i / ( i < 0 ? - i / 20 + 1 : - i / 20 - 1 ) ) + result = 1; + } + + /* Test 10 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "0", e ); + ammunition_divide_unsigned_integer ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = 0; i < 4000 ; i++ ) { + ammunition_sprintf_u( str, i ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, i / 20 + 1 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_divide_unsigned_integer ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_atoi ( s ) != i / ( i / 20 + 1 ) ) + result = 1; + } + + /* Test 11 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "0", e ); + ammunition_unsigned_integer_remainder ( 4, d, e, d ); + if ( !ammunition_overflow_bit ) + result = 1; + _Pragma( "loopbound min 4000 max 4000" ) + for ( i = 0; i < 4000 ; i++ ) { + ammunition_sprintf_u( str, i ); + ammunition_unsigned_integer_from_string ( 4, str, d ); + ammunition_sprintf_u( str, i / 20 + 1 ); + ammunition_unsigned_integer_from_string ( 4, str, e ); + ammunition_unsigned_integer_remainder ( 4, d, e, d ); + if ( ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_atoi ( s ) != i % ( i / 20 + 1 ) ) + result = 1; + } + + /* Test 12 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_shift_right ( 4, d, 0, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_shift_right ( 4, d, 32, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_shift_right ( 4, d, 8, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "5" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "134890", d ); + ammunition_unsigned_integer_shift_right ( 4, d, 13, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "134890", d ); + ammunition_unsigned_integer_shift_left ( 4, d, -13, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) + result = 1; + + /* Test 13 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_shift_right ( 4, d, 0, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_shift_right ( 4, d, 32, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_shift_right ( 4, d, 8, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "5" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "134890", d ); + ammunition_integer_shift_right ( 4, d, 13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "134890", d ); + ammunition_integer_shift_left ( 4, d, -13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_shift_right ( 4, d, 0, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_shift_right ( 4, d, 32, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-1" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_shift_right ( 4, d, 8, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-6" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-134890", d ); + ammunition_integer_shift_right ( 4, d, 13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-17" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-134890", d ); + ammunition_integer_shift_left ( 4, d, -13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-17" ) != 0 ) + result = 1; + + /* Test 14 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_shift_left ( 4, d, 0, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_shift_left ( 4, d, 22, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_shift_left ( 4, d, 8, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "345088" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "134890", d ); + ammunition_unsigned_integer_shift_left ( 4, d, 13, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "134890", d ); + ammunition_unsigned_integer_shift_right ( 4, d, -13, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) + result = 1; + + /* Test 15 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_shift_left ( 4, d, 0, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_shift_left ( 4, d, 21, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_shift_left ( 4, d, 8, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "345088" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "134890", d ); + ammunition_integer_shift_left ( 4, d, 13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "134890", d ); + ammunition_integer_shift_right ( 4, d, -13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_shift_left ( 4, d, 0, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_shift_left ( 4, d, 21, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_shift_left ( 4, d, 8, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-345088" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-134890", d ); + ammunition_integer_shift_left ( 4, d, 13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1105018880" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-134890", d ); + ammunition_integer_shift_right ( 4, d, -13, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1105018880" ) != 0 ) + result = 1; + + /* Test 16 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "-10", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( ammunition_eq_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( !ammunition_eq_integer ( 4, d, e ) ) + result = 1; + + /* Test 17 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_eq_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_eq_unsigned_integer ( 4, d, e ) ) + result = 1; + + /* Test 18 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "-10", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( !ammunition_ne_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( ammunition_ne_integer ( 4, d, e ) ) + result = 1; + + /* Test 19 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_ne_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_ne_unsigned_integer ( 4, d, e ) ) + result = 1; + + /* Test 20 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "-10", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( ammunition_gt_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( ammunition_gt_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1000000", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( ammunition_gt_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "1000000", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( !ammunition_gt_integer ( 4, d, e ) ) + result = 1; + + /* Test 21 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_gt_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_gt_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1000000", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_gt_unsigned_integer ( 4, d, e ) ) + result = 1; + + /* Test 22 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "-10", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( !ammunition_lt_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( ammunition_lt_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1000000", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( !ammunition_lt_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "1000000", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( ammunition_lt_integer ( 4, d, e ) ) + result = 1; + + /* Test 23 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_lt_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_lt_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1000000", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_lt_unsigned_integer ( 4, d, e ) ) + result = 1; + + /* Test 24 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "-10", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( ammunition_ge_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( !ammunition_ge_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1000000", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( ammunition_ge_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "1000000", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( !ammunition_ge_integer ( 4, d, e ) ) + result = 1; + + /* Test 25 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_ge_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_ge_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1000000", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_ge_unsigned_integer ( 4, d, e ) ) + result = 1; + + /* Test 26 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "-10", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( !ammunition_le_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1348", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( !ammunition_le_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "-1000000", d ); + ammunition_integer_from_string ( 4, "-1348", e ); + if ( !ammunition_le_integer ( 4, d, e ) ) + result = 1; + ammunition_integer_from_string ( 4, "1000000", d ); + ammunition_integer_from_string ( 4, "1348", e ); + if ( ammunition_le_integer ( 4, d, e ) ) + result = 1; + + /* Test 27 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "10", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_le_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( !ammunition_le_unsigned_integer ( 4, d, e ) ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1000000", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + if ( ammunition_le_unsigned_integer ( 4, d, e ) ) + result = 1; + + /* Test 28 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "70000", d ); + ammunition_change_unsigned_integer_size ( 4, d, 2, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "30000", d ); + ammunition_change_unsigned_integer_size ( 4, d, 2, d ); + ammunition_integer_to_string( 2, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "30000" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "11230000", g ); + ammunition_change_unsigned_integer_size ( 4, g, 6, g ); + ammunition_integer_to_string( 6, g, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "11230000" ) != 0 ) + result = 1; + + /* Test 29 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "40000", d ); + ammunition_change_integer_size ( 4, d, 2, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_integer_from_string ( 4, "-33000", d ); + ammunition_change_integer_size ( 4, d, 2, d ); + if ( !ammunition_overflow_bit ) + result = 1; + ammunition_integer_from_string ( 4, "30000", d ); + ammunition_change_integer_size ( 4, d, 2, d ); + ammunition_integer_to_string( 2, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "30000" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-30000", d ); + ammunition_change_integer_size ( 4, d, 2, d ); + ammunition_integer_to_string( 2, d, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-30000" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "11230000", g ); + ammunition_change_integer_size ( 4, g, 6, g ); + ammunition_integer_to_string( 6, g, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "11230000" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-11230000", g ); + ammunition_change_integer_size ( 4, g, 6, g ); + ammunition_integer_to_string( 6, g, s ); + if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-11230000" ) != 0 ) + result = 1; + + /* Test 30 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + ammunition_unsigned_integer_or ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "0", e ); + ammunition_unsigned_integer_or ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "4294967295", e ); + ammunition_unsigned_integer_or ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "4294967295" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "96", e ); + ammunition_unsigned_integer_or ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "1380" ) != 0 ) + result = 1; + + /* Test 31 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "1348", e ); + ammunition_integer_or ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "0", e ); + ammunition_integer_or ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "-1", e ); + ammunition_integer_or ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "-1" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "96", e ); + ammunition_integer_or ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "1380" ) != 0 ) + result = 1; + + /* Test 32 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "1348", e ); + ammunition_unsigned_integer_and ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "0", e ); + ammunition_unsigned_integer_and ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "4294967295", e ); + ammunition_unsigned_integer_and ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_from_string ( 4, "96", e ); + ammunition_unsigned_integer_and ( 4, d, e, e ); + ammunition_unsigned_integer_to_string ( 4, e, s ); + if ( ammunition_strcmp ( s, "64" ) != 0 ) + result = 1; + + /* Test 33 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "1348", e ); + ammunition_integer_and ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "0", e ); + ammunition_integer_and ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "-1", e ); + ammunition_integer_and ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "1348" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_from_string ( 4, "96", e ); + ammunition_integer_and ( 4, d, e, e ); + ammunition_integer_to_string( 4, e, s ); + if ( ammunition_strcmp ( s, "64" ) != 0 ) + result = 1; + + /* Test 34 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_unsigned_integer_from_string ( 4, "1348", d ); + ammunition_unsigned_integer_not ( 4, d, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_strcmp ( s, "4294965947" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "0", d ); + ammunition_unsigned_integer_not ( 4, d, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_strcmp ( s, "4294967295" ) != 0 ) + result = 1; + ammunition_unsigned_integer_from_string ( 4, "4294967295", d ); + ammunition_unsigned_integer_not ( 4, d, d ); + ammunition_unsigned_integer_to_string ( 4, d, s ); + if ( ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + + /* Test 35 */ + ammunition_reset_str_arithm( str, s, d, e, g ); + + ammunition_integer_from_string ( 4, "1348", d ); + ammunition_integer_not ( 4, d, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_strcmp ( s, "-1349" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "0", d ); + ammunition_integer_not ( 4, d, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_strcmp ( s, "-1" ) != 0 ) + result = 1; + ammunition_integer_from_string ( 4, "-1", d ); + ammunition_integer_not ( 4, d, d ); + ammunition_integer_to_string( 4, d, s ); + if ( ammunition_strcmp ( s, "0" ) != 0 ) + result = 1; + + return result; +} + + +/* + Initialization- and return-value-related functions +*/ + +void ammunition_init( void ) +{ + ammunition_result = 0; +} + +int ammunition_return( void ) +{ + return ammunition_result; +} + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) ammunition_main( void ) +{ + ammunition_result |= ammunition_bits_test(); + ammunition_result |= ammunition_arithm_test(); +} + + +int main( void ) +{ + ammunition_init(); + ammunition_main(); + + return ( ammunition_return() ); +} diff --git a/targets/wasm-tacle/sequential/ammunition/ammunition_libc.c b/targets/wasm-tacle/sequential/ammunition/ammunition_libc.c new file mode 100755 index 0000000..ab30817 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ammunition_libc.c @@ -0,0 +1,166 @@ +/* + Include section +*/ + +#include "ammunition_string.h" +#include "ammunition_stdio.h" +#include "ammunition_stdlib.h" + + +/* + Standard library functions +*/ + +char ammunition_isdigit( unsigned char c ) +{ + if ( ( c >= '0' ) & ( c <= '9' ) ) + return 1; + else + return 0; +} + +int ammunition_isspace( int c ) +{ + return ( c == ' ' ) | ( c == '\t' ) | ( c == '\n' ) | ( c == '\r' ); +} + +void *ammunition_memcpy( void *dest, const void *src, size_t size ) +{ + size_t i; + _Pragma( "loopbound min 2 max 6" ) + for ( i = 0; i < size; i++ ) + ( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ]; + + return dest; +} + + +void *ammunition_memset( void *s, int c, size_t n ) +{ + size_t i; + _Pragma( "loopbound min 0 max 4" ) + for ( i = 0; i < n; i++ ) + ( ( unsigned char * )s )[ i ] = ( unsigned char )c; + + return s; +} + + +int ammunition_memcmp ( const void *mem1, const void *mem2, size_t size ) +{ + const unsigned char *p1 = ( const unsigned char * ) mem1, + *p2 = ( const unsigned char * ) mem2; + _Pragma( "loopbound min 0 max 4" ) + while ( size-- ) + if ( *p1 != *p2 ) + return ( *p1 - *p2 ); + else + p1++, p2++; + return 0; +} + + +/* The following function is an analog of standard C function + `memmove'. The function returns the first operand. */ + +void *ammunition_memmove ( void *s1, const void *s2, size_t n ) +{ + int i; + + if ( ( ( char * ) s1 < ( char * ) s2 && ( char * ) s1 + n <= ( char * ) s2 ) + || ( ( char * ) s2 < ( char * ) s1 + && ( char * ) s2 + n <= ( char * ) s1 ) ) + return ( void * ) ammunition_memcpy ( s1, s2, n ); + if ( ( char * ) s1 < ( char * ) s2 && ( char * ) s1 + n > ( char * ) s2 ) { + _Pragma( "loopbound min 0 max 4" ) + for ( i = 0; ( size_t ) i < n; i++ ) + ( ( char * ) s1 ) [ i ] = ( ( char * ) s2 ) [ i ]; + } else { + _Pragma( "loopbound min 0 max 4" ) + for ( i = n - 1; i >= 0; i-- ) + ( ( char * ) s1 )[ i ] = ( ( char * ) s2 ) [ i ]; + } + return s1; +} + +int ammunition_strcmp ( const char *str1, const char *str2 ) +{ + _Pragma( "loopbound min 1 max 11" ) + while ( *str1 && ( *str1 == *str2 ) ) + str1++, str2++; + return *( const unsigned char * )str1 - *( const unsigned char * )str2; +} + +int ammunition_atoi ( const char *str ) +{ + int result = 0; + int sign = ( str[ 0 ] == '-' ? -1 : 1 ); + + int readingPos = 0; + if ( str[ 0 ] == '-' || str[ 0 ] == '+' ) + readingPos++; + _Pragma( "loopbound min 1 max 7" ) + do { + result *= 10; + result += str[ readingPos++ ] - 48; + } while ( str[ readingPos ] != 0 ); + + return sign * result; +} + + +int ammunition_sprintf_d( char *s, int number ) +{ + /* How many decimal digits do we need? */ + char digits = 0; + unsigned char writePos = 0; + long long copyOfNumber = number; + _Pragma( "loopbound min 1 max 10" ) + do { + digits++; + copyOfNumber /= 10; + } while ( copyOfNumber != 0 ); + + writePos = digits; + if ( number < 0 ) { + writePos++; + s[ 0 ] = '-'; + } + s[ writePos ] = 0; + + copyOfNumber = number; + _Pragma( "loopbound min 1 max 10" ) + do { + s[ --writePos ] = 48 + ( ( copyOfNumber >= 0 ? + copyOfNumber : -copyOfNumber ) % 10 ); + copyOfNumber /= 10; + } while ( copyOfNumber != 0 ); + + return digits + ( number < 0 ? 1 : 0 ); +} + + +int ammunition_sprintf_u( char *s, unsigned int number ) +{ + /* How many decimal digits do we need? */ + char digits = 0; + unsigned char writePos = 0; + unsigned long long copyOfNumber = number; + _Pragma( "loopbound min 1 max 10" ) + do { + digits++; + copyOfNumber /= 10; + } while ( copyOfNumber != 0 ); + + writePos = digits; + s[ writePos ] = 0; + + copyOfNumber = number; + _Pragma( "loopbound min 1 max 10" ) + do { + s[ --writePos ] = 48 + ( copyOfNumber % 10 ); + copyOfNumber /= 10; + } while ( copyOfNumber != 0 ); + + return digits; +} diff --git a/targets/wasm-tacle/sequential/ammunition/ammunition_limits.h b/targets/wasm-tacle/sequential/ammunition/ammunition_limits.h new file mode 100755 index 0000000..0de4c82 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ammunition_limits.h @@ -0,0 +1,35 @@ +#ifndef AMMUNITION_LIMITS_H +#define AMMUNITION_LIMITS_H + +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif +#ifndef UCHAR_MAX +#define UCHAR_MAX 255 +#endif +#ifndef SCHAR_MAX +#define SCHAR_MAX 127 +#endif +#ifndef SCHAR_MIN +#define SCHAR_MIN (-128) +#endif +#ifndef USHRT_MAX +#define USHRT_MAX 65535 +#endif +#ifndef SHRT_MAX +#define SHRT_MAX 32767 +#endif +#ifndef SHRT_MIN +#define SHRT_MIN (-32768) +#endif +#ifndef UINT_MAX +#define UINT_MAX (INT_MAX * 2U + 1) +#endif +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif +#ifndef INT_MIN +#define INT_MIN (-INT_MAX-1) +#endif + +#endif /* #ifndef AMMUNITION_LIMITS_H */ diff --git a/targets/wasm-tacle/sequential/ammunition/ammunition_stdio.h b/targets/wasm-tacle/sequential/ammunition/ammunition_stdio.h new file mode 100755 index 0000000..a3a7a4b --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ammunition_stdio.h @@ -0,0 +1,8 @@ +#ifndef AMMUNITION_STDIO_H +#define AMMUNITION_STDIO_H + +int ammunition_sprintf_d( char *s, int number ); + +int ammunition_sprintf_u( char *s, unsigned int number ); + +#endif diff --git a/targets/wasm-tacle/sequential/ammunition/ammunition_stdlib.h b/targets/wasm-tacle/sequential/ammunition/ammunition_stdlib.h new file mode 100755 index 0000000..d907212 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ammunition_stdlib.h @@ -0,0 +1,6 @@ +#ifndef AMMUNITION_STDLIB_H +#define AMMUNITION_STDLIB_H + +int ammunition_atoi ( const char *str ); + +#endif diff --git a/targets/wasm-tacle/sequential/ammunition/ammunition_string.h b/targets/wasm-tacle/sequential/ammunition/ammunition_string.h new file mode 100755 index 0000000..32c3185 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/ammunition_string.h @@ -0,0 +1,18 @@ +#ifndef AMMUNITION_STRING_H +#define AMMUNITION_STRING_H + + +typedef unsigned int size_t; + +/* + Forward declaration of functions +*/ + +void *ammunition_memcpy( void *, const void *, size_t ); +void *ammunition_memset( void *, int, size_t ); +int ammunition_memcmp ( const void *mem1, const void *mem2, size_t size ); +void *ammunition_memmove ( void *s1, const void *s2, size_t n ); +int ammunition_strcmp ( const char *str1, const char *str2 ); + +#endif /* AMMUNITION_STRING_H */ + diff --git a/targets/wasm-tacle/sequential/ammunition/arithm.c b/targets/wasm-tacle/sequential/ammunition/arithm.c new file mode 100755 index 0000000..4f287d9 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/arithm.c @@ -0,0 +1,1383 @@ +/* + FILE NAME: arithm.c + + TITLE: Package for arbitrary precision integer arithmetic + + DESCRIPTION: This abstract data implements arbitrary precision + integer and unsigned integer numbers by machine independent + way. The implementation of the package functions are not + sufficiently efficient in order to use for run-time. The + package functions are oriented to implement constant-folding in + compilers. This package is necessary because host machine may + not support such arithmetic for target machine. For example, + VAX does not support does not support more 32-bits integer + numbers arithmetic. The numbers are represented by bytes in + big endian mode, negative integer numbers are represented in + complementary code. All sizes are given in bytes and must be + positive. Results of executions of all functions can coincide + with a operand(s). All functions of addition, subtraction, + multiplication, division, evaluation of remainder, shift, + changing size and transformation of string into number fix + overflow. The overflow is fixed when result can not be + represented by number of given size. + +*/ + +#include "arithm.h" +#include "ammunition_string.h" + + +/* This variable can have only two values 0 or 1. The value `1' + corresponds to overflow. The variable value are modified by all + functions of addition, subtract, multiplication, division, + evaluation of remainder, shift, changing size and transformation of + string into number fix overflow. */ + +int ammunition_overflow_bit; + + +/* The following function adds unsigned integers. The function + returns 1 if unsigned integer overflow is fixed, 0 otherwise. + Result can be placed in any operand. */ + +int ammunition_add_unsigned_integer_without_overflow_reaction +( int size, const void *op1, const void *op2, void *result ) +{ + int digit_num; + int carry; + unsigned int sum; + _Pragma( "loopbound min 4 max 4" ) + for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { + sum = ( ( ( unsigned char * ) op1 ) [ digit_num ] + + ( ( unsigned char * ) op2 ) [ digit_num ] + carry ); + if ( sum > UCHAR_MAX ) { + sum -= UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ( ( unsigned char * ) result ) [ digit_num ] = sum; + } + return carry != 0; +} + +/* The following function adds unsigned integers. The function + returns 1 if unsigned integer overflow (the first operand is less + than the second) is fixed, 0 otherwise. Result can be placed in + any operand. */ + +int ammunition_subtract_unsigned_integer_without_overflow_reaction +( int size, const void *op1, const void *op2, void *result ) +{ + int digit_num; + int carry; + int subtraction; + + _Pragma( "loopbound min 4 max 4" ) + for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { + subtraction = ( ( ( unsigned char * ) op1 ) [ digit_num ] + - ( ( unsigned char * ) op2 ) [ digit_num ] - carry ); + if ( subtraction < 0 ) { + subtraction += UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ( ( unsigned char * ) result ) [ digit_num ] = subtraction; + } + return carry != 0; +} + +/* The following function makes complementary code of number. Result + can be placed in operand. */ + +void ammunition_make_complementary_code +( int size, const void *operand, void *result ) +{ + int digit_num; + int carry; + int subtraction; + + _Pragma( "loopbound min 2 max 6" ) + for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { + subtraction = ( 0 - ( ( unsigned char * ) operand ) [ digit_num ] - carry ); + if ( subtraction != 0 ) { + subtraction += UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ( ( unsigned char * ) result ) [ digit_num ] = subtraction; + } +} + +/* The following function multiplys unsigned integer by digit (byte + size). The function returns 1 if unsigned integer overflow is + fixed, 0 otherwise. */ + +int ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction +( int size, void *operand, unsigned int digit ) +{ + int digit_num; + unsigned int carry; + unsigned int sum; + + _Pragma( "loopbound min 4 max 4" ) + for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { + sum = ( ( ( unsigned char * ) operand ) [ digit_num ] * digit + carry ); + if ( sum > UCHAR_MAX ) { + carry = sum / ( UCHAR_MAX + 1 ); + sum %= UCHAR_MAX + 1; + } else + carry = 0; + ( ( unsigned char * ) operand ) [ digit_num ] = sum; + } + return carry != 0; +} + + +/* Originally reaction on all integer and unsigned integer overflow is + equal to the following function. The function does nothing. */ + +void +ammunition_arithmetic_overflow_reaction ( void ) +{} + + +/* Originally reaction on all integer and unsigned integer overflow is + equal to the following function. The function does nothing. */ + +void +ammunition_arithmetic_unsigned_overflow_reaction ( void ) +{} + + +/* This page contains functions for arbitrary precision addition. */ + +/* The function adds unsigned integers and fixes overflow reaction if + it is needed. The function makes this with the aid of function + `add_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_add_unsigned_integer ( int size, const void *op1, const void *op2, + void *result ) +{ + ammunition_overflow_bit + = ammunition_add_unsigned_integer_without_overflow_reaction ( + size, op1, op2, result ); + if ( ammunition_overflow_bit != 0 ) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function adds integers and fixes overflow reaction if it is + needed. The function makes this with the aid of function + `add_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_add_integer ( int size, const void *op1, const void *op2, + void *result ) +{ + int op1_sign; + int sign_equality; + + op1_sign = INTEGER_SIGN ( op1 ); + sign_equality = INTEGER_SIGN ( op1 ) == INTEGER_SIGN ( op2 ); + ammunition_add_unsigned_integer_without_overflow_reaction ( + size, op1, op2, result ); + ammunition_overflow_bit = sign_equality && + ( op1_sign != INTEGER_SIGN ( result ) ); + if ( ammunition_overflow_bit != 0 ) + ammunition_arithmetic_overflow_reaction(); +} + + + +/* This page contains functions for arbitrary precision subtraction. */ + +/* The function subtracts unsigned integers and fixes overflow + reaction if it is needed. The function makes this with the aid of + function `subtract_unsigned_integer_without_overflow_reaction'. + Result can be placed in any operand. */ + +void +ammunition_subtract_unsigned_integer ( int size, const void *op1, + const void *op2, + void *result ) +{ + ammunition_overflow_bit + = ammunition_subtract_unsigned_integer_without_overflow_reaction ( + size, op1, op2, result ); + if ( ammunition_overflow_bit != 0 ) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function subtracts integers and fixes overflow reaction if it + is needed. The function makes this with the aid of function + `subtract_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +void +ammunition_subtract_integer ( int size, const void *op1, const void *op2, + void *result ) +{ + int op1_sign; + int sign_unequality; + + op1_sign = INTEGER_SIGN ( op1 ); + sign_unequality = INTEGER_SIGN ( op1 ) != INTEGER_SIGN ( op2 ); + ammunition_subtract_unsigned_integer_without_overflow_reaction ( + size, op1, op2, result ); + ammunition_overflow_bit = sign_unequality && + ( op1_sign != INTEGER_SIGN ( result ) ); + if ( ammunition_overflow_bit != 0 ) + ammunition_arithmetic_overflow_reaction(); +} + + + +/* This page contains functions for arbitrary precision multiplication. */ + +/* The following function multiplys unsigned integers. The function + returns 1 if unsigned integer overflow is fixed, 0 otherwise. + Result can be placed in any operand. */ + +int ammunition_multiply_unsigned_integer_without_overflow_reaction +( int size, const void *op1, const void *op2, void *result ) +{ + int op1_digit_num; + int op2_digit_num; + int carry; + unsigned long long int partial_sum; + int result_digit_number; + int overflow_flag; + unsigned char long_result [ 2 * MAX_INTEGER_OPERAND_SIZE ]; + + ammunition_memset ( long_result + size, 0, ( size_t ) size ); + _Pragma( "loopbound min 4 max 4" ) + for ( op2_digit_num = size - 1; op2_digit_num >= 0; op2_digit_num-- ) { + if ( ( ( unsigned char * ) op2 ) [ op2_digit_num ] != 0 ) { + _Pragma( "loopbound min 4 max 4" ) + for ( op1_digit_num = size - 1, carry = 0; op1_digit_num >= 0; + op1_digit_num-- ) { + partial_sum + = ( ( ( unsigned char * ) op1 ) [ op1_digit_num ] + * ( ( unsigned char * ) op2 ) [ op2_digit_num ] + + long_result [ op1_digit_num + op2_digit_num + 1 ] + + carry ); + long_result [ op1_digit_num + op2_digit_num + 1 ] + = ( unsigned char ) ( partial_sum % ( UCHAR_MAX + 1 ) ); + carry = partial_sum / ( UCHAR_MAX + 1 ); + } + long_result [ op2_digit_num ] = carry; + } else + long_result [ op2_digit_num ] = 0; + } + overflow_flag = 0; + _Pragma( "loopbound min 0 max 4" ) + for ( result_digit_number = size - 1; result_digit_number >= 0; + result_digit_number-- ) { + if ( long_result [ result_digit_number ] != 0 ) { + overflow_flag = 1; + break; + } + } + ammunition_memcpy ( result, long_result + size, ( size_t ) size ); + return overflow_flag; +} + +/* The following function multiplys unsigned integers and fixes + overflow reaction if it is needed. The function makes this with + the aid of function + `multiply_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +void +ammunition_multiply_unsigned_integer ( int size, const void *op1, + const void *op2, + void *result ) +{ + ammunition_overflow_bit = + ammunition_multiply_unsigned_integer_without_overflow_reaction ( + size, op1, op2, result ); + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function multiplys integers and fixes overflow reaction if it + is needed. The function makes this with the aid of function + `multiply_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +void +ammunition_multiply_integer ( int size, const void *op1, const void *op2, + void *result ) +{ + int negative_result_flag; + unsigned char op1_complementary [ MAX_INTEGER_OPERAND_SIZE ]; + unsigned char op2_complementary [ MAX_INTEGER_OPERAND_SIZE ]; + unsigned const char *abs_op1; + unsigned const char *abs_op2; + int unsigned_result_sign; + + negative_result_flag = INTEGER_SIGN ( op1 ) != INTEGER_SIGN ( op2 ); + if ( INTEGER_SIGN ( op1 ) ) { + /* May be integer overflow. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code ( size, op1, op1_complementary ); + abs_op1 = ( unsigned const char * )op1_complementary; + } else + abs_op1 = ( unsigned const char * )op1; + if ( INTEGER_SIGN ( op2 ) ) { + /* May be integer overflow. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code ( size, op2, op2_complementary ); + abs_op2 = ( unsigned const char * )op2_complementary; + } else + abs_op2 = ( unsigned const char * )op2; + ammunition_overflow_bit = + ammunition_multiply_unsigned_integer_without_overflow_reaction ( + size, abs_op1, abs_op2, result ); + unsigned_result_sign = INTEGER_SIGN ( result ); + if ( negative_result_flag ) + ammunition_make_complementary_code ( size, result, result ); + if ( unsigned_result_sign + && ( !negative_result_flag + || INTEGER_SIGN ( result ) != unsigned_result_sign ) ) + /* Unsigned result can not be represented as integer. */ + ammunition_overflow_bit = 1; + if ( ammunition_overflow_bit ) + ammunition_arithmetic_overflow_reaction(); +} + + + +/* This page contains functions for arbitrary precision division. */ + +/* The following function divides unsigned integers. The function + returns 1 if unsigned integer overflow (division by zero) is fixed, + 0 otherwise. Result can be placed in any operand. See algorithm + in Knuth's book. */ + +int ammunition_divide_unsigned_integer_without_overflow_reaction +( int size, const void *op1, const void *op2, void *result ) +{ + int scaled_op1_digit_num; + unsigned int q_approximation; + int first_nonzero_digit_number; + int op2_digit_number; + unsigned int scale; + unsigned char scaled_op1 [ MAX_INTEGER_OPERAND_SIZE + 1 ]; + unsigned char normalized_op2 [ MAX_INTEGER_OPERAND_SIZE ]; + unsigned char extended_normalized_op2 [ MAX_INTEGER_OPERAND_SIZE + 1 ]; + + _Pragma( "loopbound min 3 max 4" ) + for ( op2_digit_number = 0; op2_digit_number < size; op2_digit_number++ ) { + if ( ( ( unsigned char * ) op2 ) [ op2_digit_number ] != 0 ) + break; + } + first_nonzero_digit_number = op2_digit_number; + if ( first_nonzero_digit_number == size ) { + /* Zero divisor */ + ammunition_memset ( result, 0, ( size_t ) size ); + return 1 /* TRUE */; + } else + if ( first_nonzero_digit_number == size - 1 ) { + /* Division by digit. */ + int digit_num; + int digit; + unsigned long long divisable; + unsigned long long remainder; + + digit = ( ( unsigned char * ) op2 ) [ first_nonzero_digit_number ]; + ammunition_memcpy ( result, op1, ( size_t ) size ); + remainder = 0; + _Pragma( "loopbound min 4 max 4" ) + for ( digit_num = 0; digit_num < size; digit_num++ ) { + divisable = ( remainder * ( UCHAR_MAX + 1 ) + + ( ( unsigned char * ) result ) [ digit_num ] ); + remainder = divisable % digit; + ( ( unsigned char * ) result ) [ digit_num ] + = ( unsigned char ) ( divisable / digit ); + } + return 0 /* FALSE */; + } + /* Normalization of divisor. */ + scale = ( UCHAR_MAX + 1 ) / ( ( ( unsigned char * ) op2 ) [ op2_digit_number ] + + 1 ); + ammunition_memcpy ( scaled_op1 + 1, op1, ( size_t ) size ); + *scaled_op1 = 0; + + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction + ( size + 1, scaled_op1, scale ); + + ammunition_memcpy ( normalized_op2, op2, ( size_t ) size ); + + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction + ( size, normalized_op2, scale ); + + _Pragma( "loopbound min 0 max 0" ) + for ( scaled_op1_digit_num = 0; + scaled_op1_digit_num <= first_nonzero_digit_number; + scaled_op1_digit_num++ ) { + /* Division of `scaled_op1[ scaled_op1_digit_number ]..scaled_op1[ size ]' by + `normalized_op2[ first_nonzero_digit_number ]..normalized_op2[ size-1 ]' + for evaluation of one digit of quotient + `result[ size-1-first_nonzero_digit_number-scaled_op1_digit_number ]'. + */ + if ( scaled_op1 [ scaled_op1_digit_num ] + == normalized_op2 [ first_nonzero_digit_number ] ) + q_approximation = UCHAR_MAX; + else + q_approximation + = ( scaled_op1 [ scaled_op1_digit_num ] * ( UCHAR_MAX + 1 ) + + scaled_op1 [ scaled_op1_digit_num + 1 ] ) + / normalized_op2 [ first_nonzero_digit_number ]; + + _Pragma( "loopbound min 0 max 0" ) + while ( normalized_op2 [ first_nonzero_digit_number + 1 ] * q_approximation + > ( ( ( unsigned long long int ) scaled_op1 [ scaled_op1_digit_num ] + * ( UCHAR_MAX + 1 ) + + scaled_op1 [ scaled_op1_digit_num + 1 ] + - q_approximation + * normalized_op2 [ first_nonzero_digit_number ] ) + * ( UCHAR_MAX + 1 ) + scaled_op1 [ scaled_op1_digit_num + 2 ] ) ) + q_approximation --; + + /* Multiply and subtract */ + ammunition_memcpy ( extended_normalized_op2 + 1, + normalized_op2 + first_nonzero_digit_number, + ( size_t ) ( size - first_nonzero_digit_number ) ); + *extended_normalized_op2 = 0; + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction + ( size - first_nonzero_digit_number + 1, extended_normalized_op2, + q_approximation ); + if ( ammunition_subtract_unsigned_integer_without_overflow_reaction + ( size - first_nonzero_digit_number + 1, + scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, + scaled_op1 + scaled_op1_digit_num ) ) { + /* Negative result. Compensation by addition. */ + q_approximation--; + ammunition_memcpy ( extended_normalized_op2 + 1, + normalized_op2 + first_nonzero_digit_number, + ( size_t ) ( size - first_nonzero_digit_number ) ); + *extended_normalized_op2 = 0; + + ammunition_add_unsigned_integer_without_overflow_reaction + ( size - first_nonzero_digit_number + 1, + scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, + scaled_op1 + scaled_op1_digit_num ); + + } + ( ( unsigned char * ) result ) [ size - 1 - first_nonzero_digit_number + + scaled_op1_digit_num ] = q_approximation; + } + ammunition_memset ( result, 0, + ( size_t ) ( size - 1 - first_nonzero_digit_number ) ); + return 0 /* TRUE */; +} + +/* The function divides unsigned integers and fixes overflow reaction + if it is needed. The function makes this with the aid of function + `divide_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_divide_unsigned_integer ( int size, const void *op1, const void *op2, + void *result ) +{ + ammunition_overflow_bit = + ammunition_divide_unsigned_integer_without_overflow_reaction ( + size, op1, op2, result ); + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function divides integers and fixes overflow reaction if it is + needed. The function makes this with the aid of function + `divide_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_divide_integer ( int size, const void *op1, const void *op2, + void *result ) +{ + int negative_result_flag; + unsigned char op1_complementary [ MAX_INTEGER_OPERAND_SIZE ]; + unsigned char op2_complementary [ MAX_INTEGER_OPERAND_SIZE ]; + unsigned const char *abs_op1; + unsigned const char *abs_op2; + int unsigned_result_sign; + + negative_result_flag = INTEGER_SIGN ( op1 ) != INTEGER_SIGN ( op2 ); + if ( INTEGER_SIGN ( op1 ) ) { + /* May be integer overflow for minimal int. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code ( size, op1, op1_complementary ); + abs_op1 = ( unsigned const char * )op1_complementary; + } else + abs_op1 = ( unsigned const char * )op1; + if ( INTEGER_SIGN ( op2 ) ) { + /* May be integer overflow for minimal int. But result is correct + because it is unsigned. */ + ammunition_make_complementary_code ( size, op2, op2_complementary ); + abs_op2 = ( unsigned const char * )op2_complementary; + } else + abs_op2 = ( unsigned const char * )op2; + ammunition_overflow_bit = + ammunition_divide_unsigned_integer_without_overflow_reaction ( + size, abs_op1, abs_op2, result ); + unsigned_result_sign = INTEGER_SIGN ( result ); + if ( negative_result_flag ) + ammunition_make_complementary_code ( size, result, result ); + if ( unsigned_result_sign + && ( !negative_result_flag + || INTEGER_SIGN ( result ) != unsigned_result_sign ) ) + /* Unsigned result can not be represented as integer. */ + ammunition_overflow_bit = 1; + if ( ammunition_overflow_bit ) + ammunition_arithmetic_overflow_reaction(); +} + + + +/* This page contains functions for arbitrary precision evaluation of + remainder. */ + +/* The function evaluates remainder of division of unsigned integers + as `op1 - (op1/op2)*op2' and fixes overflow reaction if it is + needed. Result can be placed in any operand. */ + +void +ammunition_unsigned_integer_remainder ( int size, const void *op1, + const void *op2, + void *result ) +{ + unsigned char temporary [ MAX_INTEGER_OPERAND_SIZE ]; + + ammunition_divide_unsigned_integer ( size, op1, op2, temporary ); + if ( ammunition_overflow_bit ) + /* Reaction on zero is called from `divide_unsigned_integer'. */ + ammunition_memset ( result, 0, ( size_t ) size ); + else { + ammunition_multiply_unsigned_integer ( size, temporary, op2, temporary ); + ammunition_subtract_unsigned_integer ( size, op1, temporary, result ); + } +} + + +/* This page contains functions for arbitrary precision number shifts. */ + +/* This function makes right shift of unsigned integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `unsigned_integer_shift_left'. The function fixes overflow when + result can not be represented by number of given size, i.e. in + other words the opposite unsigned shift (to left) results in number + not equal to source operand. Result can be placed in operand. */ + +void +ammunition_unsigned_integer_shift_right ( int size, const void *operand, + int bits, void *result ) +{ + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + + + if ( bits < 0 ) + ammunition_unsigned_integer_shift_left ( size, operand, -bits, result ); + else { + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + _Pragma( "loopbound min 0 max 2" ) + for ( byte_number = ( byte_shift >= size ? 0 : size - byte_shift ); + byte_number < size; byte_number++ ) + if ( ( ( unsigned char * ) operand ) [ byte_number ] != 0 ) { + ammunition_overflow_bit = 1; + break; + } + if ( byte_shift >= size ) + ammunition_memset ( result, 0, ( size_t ) size ); + else { + ammunition_memmove ( ( char * ) result + byte_shift, operand, + ( size_t ) ( size - byte_shift ) ); + ammunition_memset ( result, 0, ( size_t ) byte_shift ); + if ( bit_shift == 0 ) + return; + _Pragma( "loopbound min 3 max 3" ) + for ( byte_number = byte_shift, carry = 0; byte_number < size; + byte_number++ ) { + byte = ( ( unsigned char * ) result ) [ byte_number ]; + ( ( unsigned char * ) result ) [ byte_number ] + = carry | ( byte >> bit_shift ); + carry = ( byte << ( CHAR_BIT - bit_shift ) ) & UCHAR_MAX; + } + if ( carry != 0 ) + ammunition_overflow_bit = 1; + } + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); + } +} + +/* This function makes right arithmetic shift of integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `integer_shift_left'. The function fixes overflow when result can + not be represented by number of given size, i.e. in other words the + opposite shift (to left) results in number not equal to source + operand. Result can be placed in operand. */ + +void +ammunition_integer_shift_right ( int size, const void *operand, int bits, + void *result ) +{ + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + int operand_sign; + + if ( bits < 0 ) + ammunition_integer_shift_left ( size, operand, -bits, result ); + else { + operand_sign = INTEGER_SIGN ( operand ); + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + _Pragma( "loopbound min 0 max 2" ) + for ( byte_number = ( byte_shift >= size ? 0 : size - byte_shift ); + byte_number < size; byte_number++ ) + if ( ( ( unsigned char * ) operand ) [ byte_number ] != 0 ) { + ammunition_overflow_bit = 1; + break; + } + if ( byte_shift >= size ) + ammunition_memset ( result, + ( operand_sign ? UCHAR_MAX : 0 ), ( size_t ) size ); + else { + ammunition_memmove ( ( char * ) result + byte_shift, operand, + ( size_t ) ( size - byte_shift ) ); + ammunition_memset ( result, ( operand_sign ? UCHAR_MAX : 0 ), + ( size_t ) byte_shift ); + if ( bit_shift == 0 ) + return; + carry = ( ( ( operand_sign ? UCHAR_MAX : 0 ) << ( CHAR_BIT - bit_shift ) ) + & UCHAR_MAX ); + _Pragma( "loopbound min 3 max 3" ) + for ( byte_number = byte_shift; byte_number < size; byte_number++ ) { + byte = ( ( unsigned char * ) result ) [ byte_number ]; + ( ( unsigned char * ) result ) [ byte_number ] + = carry | ( byte >> bit_shift ); + carry = ( byte << ( CHAR_BIT - bit_shift ) ) & UCHAR_MAX; + } + if ( carry != 0 ) + ammunition_overflow_bit = 1; + } + if ( ammunition_overflow_bit ) + ammunition_arithmetic_overflow_reaction(); + } +} + +/* This function makes left shift of unsigned integer of given size on + given number of bits. If number of bits is negative the function + makes shift to left actually with the aid of function + `unsigned_integer_shift_right'. The function fixes overflow when + result can not be represented by number of given size, i.e. i.e. in + other words the opposite shift (to right) results in number not + equal to source operand. Result can be placed in operand. */ + +void +ammunition_unsigned_integer_shift_left ( int size, const void *operand, + int bits, void *result ) +{ + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + + if ( bits < 0 ) + ammunition_unsigned_integer_shift_right ( size, operand, -bits, result ); + else { + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + _Pragma( "loopbound min 0 max 2" ) + for ( byte_number = 0; byte_number < byte_shift && byte_number < size; + byte_number++ ) + if ( ( ( unsigned char * ) operand ) [ byte_number ] != 0 ) { + ammunition_overflow_bit = 1; + break; + } + if ( byte_shift >= size ) + ammunition_memset ( result, 0, ( size_t ) size ); + else { + ammunition_memmove ( result, ( char * ) operand + byte_shift, + ( size_t ) ( size - byte_shift ) ); + ammunition_memset ( ( char * ) result + ( size - byte_shift ), 0, + ( size_t ) byte_shift ); + if ( bit_shift == 0 ) + return; + _Pragma( "loopbound min 2 max 3" ) + for ( byte_number = size - byte_shift - 1, carry = 0; + byte_number >= 0; byte_number-- ) { + byte = ( ( unsigned char * ) result ) [ byte_number ]; + ( ( unsigned char * ) result ) [ byte_number ] + = carry | ( byte << bit_shift ); + carry = byte >> ( CHAR_BIT - bit_shift ); + } + if ( carry != 0 ) + ammunition_overflow_bit = 1; + } + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); + } +} + +/* This function makes left arithmetic shift of integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `integer_shift_right'. The function fixes overflow when result can + not be represented by number of given size, i.e. in other words the + opposite shift (to right) results in number not equal to source + operand. Result can be placed in operand. */ + +void +ammunition_integer_shift_left ( int size, const void *operand, int bits, + void *result ) +{ + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + int operand_sign; + + if ( bits < 0 ) + ammunition_integer_shift_right ( size, operand, -bits, result ); + else { + operand_sign = INTEGER_SIGN ( operand ); + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + _Pragma( "loopbound min 0 max 2" ) + for ( byte_number = 0; byte_number < byte_shift && byte_number < size; + byte_number++ ) + if ( ( ( unsigned char * ) operand ) [ byte_number ] + != ( operand_sign ? UCHAR_MAX : 0 ) ) { + ammunition_overflow_bit = 1; + break; + } + if ( byte_shift >= size ) + ammunition_memset ( result, 0, ( size_t ) size ); + else { + ammunition_memmove ( result, ( char * ) operand + byte_shift, + ( size_t ) ( size - byte_shift ) ); + ammunition_memset ( ( char * ) result + ( size - byte_shift ), 0, + ( size_t ) byte_shift ); + if ( bit_shift == 0 ) + return; + _Pragma( "loopbound min 2 max 3" ) + for ( byte_number = size - byte_shift - 1, carry = 0; + byte_number >= 0; byte_number-- ) { + byte = ( ( unsigned char * ) result ) [ byte_number ]; + ( ( unsigned char * ) result ) [ byte_number ] + = carry | ( byte << bit_shift ); + carry = byte >> ( CHAR_BIT - bit_shift ); + } + if ( carry != ( ( unsigned ) ( operand_sign ? UCHAR_MAX : 0 ) + >> ( CHAR_BIT - bit_shift ) ) ) + ammunition_overflow_bit = 1; + } + if ( operand_sign != INTEGER_SIGN ( result ) ) + ammunition_overflow_bit = 1; + if ( ammunition_overflow_bit ) + ammunition_arithmetic_overflow_reaction(); + } +} + + + +/* This page contains functions for bitwise operations of arbitrary + precision numbers. */ + +/* This function makes bitwise `or' of two integers of given size. */ + +void +ammunition_integer_or ( int size, const void *op1, const void *op2, + void *result ) +{ + int byte_number; + + _Pragma( "loopbound min 4 max 4" ) + for ( byte_number = 0; byte_number < size; byte_number++ ) { + ( ( unsigned char * ) result ) [ byte_number ] + = ( ( unsigned char * ) op1 ) [ byte_number ] + | ( ( unsigned char * ) op2 ) [ byte_number ]; + } +} + +/* This function makes bitwise `or' of two unsigned integers of given + size. */ + +void +ammunition_unsigned_integer_or ( int size, const void *op1, const void *op2, + void *result ) +{ + ammunition_integer_or ( size, op1, op2, result ); +} + + +/* This function makes bitwise `and' of two integers of given size. */ + +void +ammunition_integer_and ( int size, const void *op1, const void *op2, + void *result ) +{ + int byte_number; + + _Pragma( "loopbound min 4 max 4" ) + for ( byte_number = 0; byte_number < size; byte_number++ ) { + ( ( unsigned char * ) result ) [ byte_number ] + = ( ( unsigned char * ) op1 ) [ byte_number ] + & ( ( unsigned char * ) op2 ) [ byte_number ]; + } +} + +/* This function makes bitwise `and' of two unsigned integers of given + size. */ + +void +ammunition_unsigned_integer_and ( int size, const void *op1, const void *op2, + void *result ) +{ + ammunition_integer_and ( size, op1, op2, result ); +} + + +/* This function makes bitwise `not' of integer of given size. */ + +void +ammunition_integer_not ( int size, const void *operand, void *result ) +{ + int byte_number; + + _Pragma( "loopbound min 4 max 4" ) + for ( byte_number = 0; byte_number < size; byte_number++ ) { + ( ( unsigned char * ) result ) [ byte_number ] + = ( ( unsigned char * ) operand ) [ byte_number ] ^ UCHAR_MAX; + } +} + +/* This function makes bitwise `not' of unsigned integer of given + size. */ + +void +ammunition_unsigned_integer_not ( int size, const void *operand, void *result ) +{ + ammunition_integer_not ( size, operand, result ); +} + + + +/* This page contains functions for comparison of arbitrary precision + numbers. */ + +/* This function compares two unsigned integers of given size on + equality. The function returns 1 if unsigned integers are equal, 0 + otherwise. */ + +int +ammunition_eq_unsigned_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_memcmp ( op1, op2, ( size_t ) size ) == 0; +} + +/* This function compares two integers of given size on equality. The + function returns 1 if integers are equal, 0 otherwise. */ + +int +ammunition_eq_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_memcmp ( op1, op2, ( size_t ) size ) == 0; +} + +/* This function compares two unsigned integers of given size on + inequality. The function returns 1 if unsigned integers are not + equal, 0 otherwise. */ + +int +ammunition_ne_unsigned_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_memcmp ( op1, op2, ( size_t ) size ) != 0; +} + +/* This function compares two integers of given size on inequality. + The function returns 1 if integers are not equal, 0 otherwise. */ + +int +ammunition_ne_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_memcmp ( op1, op2, ( size_t ) size ) != 0; +} + + +/* This function compares two memory parts of given size on that the + first operand is greater than the second. The bytes are described + as unsigned. The function returns 1 if the first operand is + greater than the second, - 1 if the first operand is less than the + second, 0 otherwise. */ + +int ammunition_bytes_comparison ( const void *op1, const void *op2, int size ) +{ + const unsigned char *str1 = ( unsigned const char * )op1; + const unsigned char *str2 = ( unsigned const char * )op2; + + _Pragma( "loopbound min 1 max 4" ) + while ( size > 0 && *str1 == *str2 ) { + str1++; + str2++; + size--; + } + if ( size <= 0 ) + return 0; + else + if ( *str1 > *str2 ) + return 1; + else + return -1; +} + +/* This function compares two unsigned integers of given size on that + the first operand is greater than the second. The function returns + 1 if the first unsigned integer is greater than the second, 0 + otherwise. */ + +int +ammunition_gt_unsigned_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_bytes_comparison ( op1, op2, size ) > 0; +} + +/* This function compares two integers of given size on that the first + operand is greater than the second. The function returns 1 if the + first integer is greater than the second, 0 otherwise. */ + +int ammunition_gt_integer ( int size, const void *op1, const void *op2 ) +{ + if ( INTEGER_SIGN ( op1 ) == 0 ) { + if ( INTEGER_SIGN ( op2 ) == 0 ) + return ammunition_bytes_comparison ( op1, op2, size ) > 0; + else + return 1; /* TRUE */ + } else + if ( INTEGER_SIGN ( op2 ) == 0 ) + return 0; /*FALSE*/ + else + return ammunition_bytes_comparison ( op1, op2, size ) > 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is less than the second. The function returns 1 + if the first unsigned integer is less than the second, 0 + otherwise. */ + +int +ammunition_lt_unsigned_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_bytes_comparison ( op1, op2, size ) < 0; +} + +/* This function compares two integers of given size on that the first + operand is less than the second. The function returns 1 if the + first integer is less than the second, 0 otherwise. */ + +int +ammunition_lt_integer ( int size, const void *op1, const void *op2 ) +{ + if ( INTEGER_SIGN ( op1 ) == 0 ) { + if ( INTEGER_SIGN ( op2 ) == 0 ) + return ammunition_bytes_comparison ( op1, op2, size ) < 0; + else + return 0; /*FALSE*/ + } else + if ( INTEGER_SIGN ( op2 ) == 0 ) + return 1; /* TRUE */ + else + return ammunition_bytes_comparison ( op1, op2, size ) < 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is greater than or equal to the second. The + function returns 1 if the first unsigned integer is greater than or + equal to the second, 0 otherwise. */ + +int +ammunition_ge_unsigned_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_bytes_comparison ( op1, op2, size ) >= 0; +} + +/* This function compares two integers of given size on that the first + operand is greater than or equal to the second. The function + returns 1 if the first integer is greater than or equal to the + second, 0 otherwise. */ + +int +ammunition_ge_integer ( int size, const void *op1, const void *op2 ) +{ + if ( INTEGER_SIGN ( op1 ) == 0 ) { + if ( INTEGER_SIGN ( op2 ) == 0 ) + return ammunition_bytes_comparison ( op1, op2, size ) >= 0; + else + return 1; /* TRUE */ + } else + if ( INTEGER_SIGN ( op2 ) == 0 ) + return 0; /*FALSE*/ + else + return ammunition_bytes_comparison ( op1, op2, size ) >= 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is less than or equal to the second. The + function returns 1 if the first unsigned integer is less than or + equal to the second, 0 otherwise. */ + +int +ammunition_le_unsigned_integer ( int size, const void *op1, const void *op2 ) +{ + return ammunition_bytes_comparison ( op1, op2, size ) <= 0; +} + +/* This function compares two integers of given size on that the first + operand is less than or equal to the second. The function returns + 1 if the first integer is less than or equal to the second, 0 + otherwise. */ + +int +ammunition_le_integer ( int size, const void *op1, const void *op2 ) +{ + if ( INTEGER_SIGN ( op1 ) == 0 ) { + if ( INTEGER_SIGN ( op2 ) == 0 ) + return ammunition_bytes_comparison ( op1, op2, size ) <= 0; + else + return 0; /*FALSE*/ + } else + if ( INTEGER_SIGN ( op2 ) == 0 ) + return 1; /* TRUE */ + else + return ammunition_bytes_comparison ( op1, op2, size ) <= 0; +} + + + +/* This page contains functions for changing size of arbitrary + precision numbers. */ + +/* The function changes size of unsigned integer. The function fixes + overflow when result can not be represented by number of given + size. Result can be placed in operand. */ + +void +ammunition_change_unsigned_integer_size ( int operand_size, const void *operand, + int result_size, void *result ) +{ + int operand_digit_number; + + ammunition_overflow_bit = 0; + if ( operand_size <= result_size ) { + ammunition_memmove ( ( char * ) result + result_size - operand_size, + operand, ( size_t ) operand_size ); + ammunition_memset ( result, 0, ( size_t ) ( result_size - operand_size ) ); + } else { + _Pragma( "loopbound min 1 max 2" ) + for ( operand_digit_number = 0; + operand_digit_number < operand_size - result_size; + operand_digit_number++ ) { + if ( ( ( unsigned char * ) operand ) [ operand_digit_number ] != 0 ) { + ammunition_overflow_bit = 1; + break; + } + } + ammunition_memmove ( result, + ( char * ) operand + operand_size - result_size, + ( size_t ) result_size ); + } + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function changes size of integer. The function fixes overflow + when result can not be represented by number of given size. Result + can be placed in operand. */ + +void +ammunition_change_integer_size ( int operand_size, const void *operand, + int result_size, void *result ) +{ + int operand_digit_number; + int operand_sign; + + ammunition_overflow_bit = 0; + operand_sign = INTEGER_SIGN ( operand ); + if ( operand_size <= result_size ) { + ammunition_memmove ( ( char * ) result + result_size - operand_size, + operand, ( size_t ) operand_size ); + ammunition_memset ( result, ( operand_sign ? UCHAR_MAX : 0 ), + ( size_t ) ( result_size - operand_size ) ); + } else { + _Pragma( "loopbound min 2 max 2" ) + for ( operand_digit_number = 0; + operand_digit_number < operand_size - result_size; + operand_digit_number++ ) { + if ( ( ( unsigned char * ) operand ) [ operand_digit_number ] + != ( operand_sign ? UCHAR_MAX : 0 ) ) { + ammunition_overflow_bit = 1; + break; + } + } + ammunition_memmove ( result, + ( char * ) operand + operand_size - result_size, + ( size_t ) result_size ); + if ( operand_sign != INTEGER_SIGN ( result ) ) + ammunition_overflow_bit = 1; + } + if ( ammunition_overflow_bit ) + ammunition_arithmetic_overflow_reaction(); +} + + + +/* This page contains functions for conversion of arbitrary precision + numbers to ascii representation. */ + +/* This function transforms unsigned integer of given size to BASE + ascii representation. BASE should be between 2 and 36 including + them. Digits more 9 are represented by 'a', 'b' etc. Sign is + absent in result string. The function returns the result + string. */ + +char * +ammunition_unsigned_integer_to_based_string ( int size, const void *operand, + int base, + char *result ) +{ + int digit_num; + int i; + unsigned long long divisable; + unsigned long long remainder; + int nonzero_flag; + int length; + int temporary; + unsigned char operand_copy [ MAX_INTEGER_OPERAND_SIZE ]; + + ammunition_memcpy ( operand_copy, operand, ( size_t ) size ); + length = 0; + _Pragma( "loopbound min 1 max 10" ) + do { + nonzero_flag = 0 /* FALSE */; + _Pragma( "loopbound min 2 max 6" ) + for ( digit_num = 0, remainder = 0; digit_num < size; digit_num++ ) { + divisable = remainder * ( UCHAR_MAX + 1 ) + operand_copy [ digit_num ]; + remainder = divisable % base; + operand_copy [ digit_num ] = ( unsigned char ) ( divisable / base ); + if ( operand_copy [ digit_num ] != 0 ) + nonzero_flag = 1 /* TRUE */; + } + result [ length++ ] = ( unsigned char ) ( remainder < 10 ? '0' + remainder + : 'a' + remainder - 10 ); + } while ( nonzero_flag ); + result [ length ] = '\0'; + _Pragma( "loopbound min 0 max 5" ) + for ( i = 0; i < length / 2; i++ ) { + temporary = result [ i ]; + result [ i ] = result [ length - i - 1 ]; + result [ length - i - 1 ] = temporary; + } + return result; +} + + +/* This function transforms unsigned integer of given size to decimal + ascii representation. Sign is absent in result string. The + function returns the result string. */ + +char * +ammunition_unsigned_integer_to_string ( int size, const void *operand, + char *result ) +{ + return ammunition_unsigned_integer_to_based_string ( size, operand, 10, + result ); +} + + +/* This function transforms integer of given size to BASE ascii + representation. BASE should be between 2 and 36 including them. + Digits more 9 are represented by 'a', 'b' etc. Sign is present in + result string only for negative numbers. The function returns the + result string. */ + +char * +ammunition_integer_to_based_string ( int size, const void *operand, int base, + char *result ) +{ + unsigned char operand_copy [ MAX_INTEGER_OPERAND_SIZE ]; + + if ( !INTEGER_SIGN ( operand ) ) + return ammunition_unsigned_integer_to_based_string ( size, operand, base, + result ); + ammunition_memcpy ( operand_copy, operand, ( size_t ) size ); + /* May be integer overflow. But result is correct because it is unsigned. */ + ammunition_make_complementary_code ( size, operand_copy, operand_copy ); + *result = '-'; + ammunition_unsigned_integer_to_based_string ( size, operand_copy, base, + result + 1 ); + return result; +} + + + +/* This function transforms integer of given size to decimal ascii + representation. Sign is present in result string only for negative + numbers. The function returns the result string. */ + +char * +ammunition_integer_to_string ( int size, const void *operand, char *result ) +{ + return ammunition_integer_to_based_string ( size, operand, 10, result ); +} + +/* This page contains functions for conversion of decimal ascii + representation to arbitrary precision numbers. */ + +/* The function adds digit (byte size) to unsigned integer. The + function returns 1 if unsigned integer overflow is fixed, 0 + otherwise. */ + +int ammunition_add_digit_to_unsigned_integer_without_overflow_reaction +( int size, void *operand, unsigned int digit ) +{ + int digit_num; + unsigned int carry; + unsigned int sum; + + _Pragma( "loopbound min 4 max 4" ) + for ( digit_num = size - 1, carry = digit; digit_num >= 0; + digit_num-- ) { + sum = ( ( unsigned char * ) operand ) [ digit_num ] + carry; + if ( sum > UCHAR_MAX ) { + carry = sum / ( UCHAR_MAX + 1 ); + sum %= UCHAR_MAX + 1; + } else + carry = 0; + ( ( unsigned char * ) operand ) [ digit_num ] = sum; + } + return carry != 0; +} + +/* This function transforms source string (decimal ascii + representation without sign) to given size unsigned integer and + returns pointer to first non digit in the source string through a + parameter. If the string started with invalid integer + representation the result will be zero and returns the operand + through the parameter. The function returns 1 if unsigned integer + overflow is fixed, 0 otherwise. */ + +int ammunition_string_to_unsigned_integer_without_overflow_reaction +( int size, const char *operand, void *result, char **first_nondigit ) +{ + int overflow_flag; + + ammunition_memset ( result, 0, ( size_t ) size ); + _Pragma( "loopbound min 1 max 10" ) + for ( overflow_flag = 0; ammunition_isdigit ( *operand ); operand++ ) { + overflow_flag + = overflow_flag || + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction + ( size, result, 10 ); + overflow_flag + = overflow_flag + || ammunition_add_digit_to_unsigned_integer_without_overflow_reaction + ( size, result, *operand - '0' ); + } + *first_nondigit = ( char * ) operand; + return overflow_flag; +} + +/* This function skips all white spaces at the begin of source string + and transforms tail of the source string (decimal ascii + representation without sign) to given size unsigned integer with + the aid of function + `string_to_unsigned_integer_without_overflow_reaction'. If the + string started with invalid unsigned integer representation the + result will be zero. The function fixes overflow when result can + not be represented by number of given size. The function returns + address of the first nondigit in the source string. */ + +char * +ammunition_unsigned_integer_from_string ( int size, const char *operand, + void *result ) +{ + char *first_nondigit; + + _Pragma( "loopbound min 0 max 0" ) + while ( ammunition_isspace ( *operand ) ) + operand++; + ammunition_overflow_bit + = ammunition_string_to_unsigned_integer_without_overflow_reaction + ( size, operand, result, &first_nondigit ); + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); + return first_nondigit; +} + +/* This function skips all white spaces at the begin of source string + and transforms tail of the source string (decimal ascii + representation with possible sign `+' or `-') to given size integer + with the aid of function + `string_to_unsigned_integer_without_overflow_reaction'. If the + string started with invalid integer representation the result will + be zero. The function fixes overflow when result can not be + represented by number of given size. the function returns Address + of the first nondigit in the source string. */ + +char * +ammunition_integer_from_string ( int size, const char *operand, void *result ) +{ + int negative_number_flag; + char *first_nondigit; + int unsigned_result_sign; + + _Pragma( "loopbound min 0 max 0" ) + while ( ammunition_isspace ( *operand ) ) + operand++; + negative_number_flag = 0; /* FALSE */ + if ( *operand == '+' ) + operand++; + else + if ( *operand == '-' ) { + operand++; + negative_number_flag = 1; /* TRUE */ + } + ammunition_overflow_bit + = ammunition_string_to_unsigned_integer_without_overflow_reaction + ( size, operand, result, &first_nondigit ); + unsigned_result_sign = INTEGER_SIGN ( result ); + if ( negative_number_flag ) + /* May be integer overflow when `result' is correct. But result + is correct because it is unsigned. */ + ammunition_make_complementary_code ( size, result, result ); + ammunition_overflow_bit + = ammunition_overflow_bit + || ( unsigned_result_sign + && ( !negative_number_flag + || INTEGER_SIGN ( result ) != unsigned_result_sign ) ); + if ( ammunition_overflow_bit ) + ammunition_arithmetic_unsigned_overflow_reaction(); + return first_nondigit; +} + diff --git a/targets/wasm-tacle/sequential/ammunition/arithm.h b/targets/wasm-tacle/sequential/ammunition/arithm.h new file mode 100755 index 0000000..8ed78bf --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/arithm.h @@ -0,0 +1,123 @@ +/* + FILE NAME: arithm.h + + TITLE: Include file of package for arbitrary precision integer + arithmetic + + DESCRIPTION: This header file contains ANSI C prototype definitions of + the package functions and definitions of external + variable of the package and C++ classes for arbitrary + precision integer arithmetic. + +*/ + + +#ifndef __ARITHMETIC__ +#define __ARITHMETIC__ + +#include "ammunition_limits.h" + + +/* This page contains definitions of variables and macros common for + all package functions. */ + +/* The value of macro is suggested to be maximum length of integer operands + The length of use integers should be not greater than this value. */ + +#define MAX_INTEGER_OPERAND_SIZE 128 + +/* The following macro value is sign of integer number (0 or 1) given + as macro parameter. */ + +#define INTEGER_SIGN(operand) (*(unsigned char *) (operand) >> (CHAR_BIT - 1)) + +extern int ammunition_overflow_bit; + +extern void ammunition_add_unsigned_integer ( int size, const void *op1, + const void *op2, + void *result ); +extern void ammunition_add_integer ( int size, const void *op1, const void *op2, + void *result ); +extern void ammunition_subtract_unsigned_integer ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_subtract_integer ( int size, const void *op1, + const void *op2, + void *result ); +extern void ammunition_multiply_unsigned_integer ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_multiply_integer ( int size, const void *op1, + const void *op2, + void *result ); +extern void ammunition_divide_unsigned_integer ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_divide_integer ( int size, const void *op1, + const void *op2, + void *result ); +extern void ammunition_unsigned_integer_remainder ( int size, const void *op1, + const void *op2, void *result ); + +extern void ammunition_unsigned_integer_shift_right ( int size, + const void *operand, + int bits, void *result ); +extern void ammunition_integer_shift_right ( int size, const void *operand, + int bits, void *result ); +extern void ammunition_integer_shift_left ( int size, const void *operand, + int bits, void *result ); +extern void ammunition_unsigned_integer_shift_left ( int size, + const void *operand, + int bits, void *result ); + +extern void ammunition_integer_or ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_unsigned_integer_or ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_integer_and ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_unsigned_integer_and ( int size, const void *op1, + const void *op2, void *result ); +extern void ammunition_integer_not ( int size, const void *operand, + void *result ); +extern void ammunition_unsigned_integer_not ( int size, const void *operand, + void *result ); + +extern int ammunition_eq_unsigned_integer ( int size, const void *op1, + const void *op2 ); +extern int ammunition_eq_integer ( int size, const void *op1, const void *op2 ); +extern int ammunition_ne_unsigned_integer ( int size, const void *op1, + const void *op2 ); +extern int ammunition_ne_integer ( int size, const void *op1, const void *op2 ); +extern int ammunition_gt_unsigned_integer ( int size, const void *op1, + const void *op2 ); +extern int ammunition_gt_integer ( int size, const void *op1, const void *op2 ); +extern int ammunition_lt_unsigned_integer ( int size, const void *op1, + const void *op2 ); +extern int ammunition_lt_integer ( int size, const void *op1, const void *op2 ); +extern int ammunition_ge_unsigned_integer ( int size, const void *op1, + const void *op2 ); +extern int ammunition_ge_integer ( int size, const void *op1, const void *op2 ); +extern int ammunition_le_unsigned_integer ( int size, const void *op1, + const void *op2 ); +extern int ammunition_le_integer ( int size, const void *op1, const void *op2 ); + +extern void ammunition_change_unsigned_integer_size +( int operand_size, const void *operand, int result_size, void *result ); +extern void ammunition_change_integer_size ( int operand_size, + const void *operand, + int result_size, void *result ); + +extern char *ammunition_unsigned_integer_to_string ( int size, + const void *operand, + char *result ); +extern char *ammunition_integer_to_string ( int size, const void *operand, + char *result ); + +extern char *ammunition_unsigned_integer_from_string ( int size, + const char *operand, + void *result ); +extern char *ammunition_integer_from_string ( int size, const char *operand, + void *result ); + +char ammunition_isdigit( unsigned char c ); +int ammunition_isspace( int c ); + +#endif /* #ifndef __ARITHMETIC__ */ diff --git a/targets/wasm-tacle/sequential/ammunition/bits.c b/targets/wasm-tacle/sequential/ammunition/bits.c new file mode 100755 index 0000000..321f753 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/bits.c @@ -0,0 +1,313 @@ +/* + + FILE NAME: bits.c + + TITLE: Package for work with bits + + DESCRIPTION: This file implements functions of the package for work + with bit strings. A bit is given by address (start address) of + byte from which counting bits starts and its displacement which + is any non negative number of bit from the start address. The + most significant bit of the start address byte has number 0. + The bit string is given by its first bit and its length in + bits. + +*/ + +#include "bits.h" + +/* This function determines that given bit string contains only zero + bits. The function retruns TRUE if all bits of given bit string + are zero or `bit_length' <= 0. Value of `bit_displacement' must be + non-negative and can be greater than CHAR_BIT. */ + +int +ammunition_is_zero_bit_string ( const void *start_byte, int bit_displacement, + int bit_length ) +{ + const unsigned char *current_byte = ( unsigned const char * )start_byte; + + if ( bit_length <= 0 ) + return 1 /* TRUE */; + current_byte += bit_displacement / CHAR_BIT; + bit_displacement %= CHAR_BIT; + if ( bit_length < CHAR_BIT - bit_displacement ) + return ( ( ( *current_byte << bit_displacement ) + & ( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ) + & UCHAR_MAX ) == 0; + else + if ( bit_displacement != 0 ) { + if ( ( ( *current_byte << bit_displacement ) & UCHAR_MAX ) != 0 ) + return 0 /* FALSE */; + current_byte += 1; + bit_length -= CHAR_BIT - bit_displacement; + } + _Pragma( "loopbound min 0 max 7" ) + while ( bit_length >= CHAR_BIT ) { + if ( *current_byte != 0 ) + return 0 /* FALSE */; + current_byte++; + bit_length -= CHAR_BIT; + } + if ( bit_length > 0 && ( *current_byte >> ( CHAR_BIT - bit_length ) ) != 0 ) + return 0 /* FALSE */; + return 1 /* TRUE */; +} + +/* This function sets up new value of all bits of given bit string. + This function is analog of standard C function `memset'. Value of + `bit_displacement' must be non-negative and can be greater than + CHAR_BIT. */ + +void +ammunition_bit_string_set ( void *start_byte, int bit_displacement, int bit, + int bit_length ) +{ + unsigned char *current_byte = ( unsigned char * )start_byte; + unsigned char filling_byte; + int mask; + + if ( bit_length <= 0 ) + return ; + bit = bit != 0; /* 1 or 0 */ + filling_byte = ( bit ? UCHAR_MAX : 0 ); + current_byte += bit_displacement / CHAR_BIT; + bit_displacement %= CHAR_BIT; + if ( bit_displacement != 0 ) { + mask = UCHAR_MAX << ( CHAR_BIT - bit_displacement ); + if ( bit_length < CHAR_BIT - bit_displacement ) + mask |= UCHAR_MAX >> ( bit_displacement + bit_length ); + *current_byte = ( *current_byte & mask ) | ( filling_byte & ~mask ); + current_byte += 1; + bit_length -= CHAR_BIT - bit_displacement; + } + _Pragma( "loopbound min 0 max 8" ) + while ( bit_length >= CHAR_BIT ) { + *current_byte = filling_byte; + current_byte++; + bit_length -= CHAR_BIT; + } + if ( bit_length > 0 ) + *current_byte + = ( *current_byte & ~( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ) + | ( filling_byte & ( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ); +} + +/* This function copys a bit string to another bit string. This + function is analog of standard C function `memcpy'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string must + be non-overlapped. */ + +void +ammunition_bit_string_copy ( void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length ) +{ + unsigned char *current_to_byte = ( unsigned char * )to; + const unsigned char *current_from_byte = ( unsigned const char * )from; + int byte; + int mask; + + if ( bit_length <= 0 ) + return ; + current_to_byte += to_bit_displacement / CHAR_BIT; + to_bit_displacement %= CHAR_BIT; + current_from_byte += from_bit_displacement / CHAR_BIT; + from_bit_displacement %= CHAR_BIT; + _Pragma( "loopbound min 0 max 7" ) + while ( 1 ) { + byte = ( ( ( *current_from_byte << from_bit_displacement ) & UCHAR_MAX ) + | ( from_bit_displacement != 0 + && bit_length > ( CHAR_BIT - from_bit_displacement ) + ? current_from_byte [ 1 ] >> ( CHAR_BIT - from_bit_displacement ) + : 0 ) ); + if ( bit_length <= CHAR_BIT ) + break; + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + *current_to_byte + = ( *current_to_byte + & ( UCHAR_MAX << ( CHAR_BIT - to_bit_displacement ) ) ) + | ( byte >> to_bit_displacement ); + if ( to_bit_displacement != 0 ) + current_to_byte [ 1 ] + = ( current_to_byte [ 1 ] & ( UCHAR_MAX >> to_bit_displacement ) ) + | ( byte << ( CHAR_BIT - to_bit_displacement ) ); + bit_length -= CHAR_BIT; + current_from_byte++; + current_to_byte++; + } + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + mask = ( ( UCHAR_MAX << ( CHAR_BIT - to_bit_displacement ) ) + | ( UCHAR_MAX >> ( to_bit_displacement + bit_length ) ) ); + *current_to_byte + = ( *current_to_byte & mask ) | ( ( byte >> to_bit_displacement ) & ~mask ); + bit_length -= CHAR_BIT - to_bit_displacement; + if ( bit_length > 0 ) + current_to_byte [ 1 ] + = ( current_to_byte [ 1 ] & ( UCHAR_MAX >> bit_length ) ) + | ( ( byte << ( CHAR_BIT - to_bit_displacement ) ) + & ( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ); +} + +/* This function copys a bit string to another bit string. Copying + starts with the last bits of the bit strings. This function is + used by function `bit_string_move'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string must + be non-overlapped. */ + +void ammunition_reverse_bit_string_copy ( void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length ) +{ + unsigned char *current_to_byte = ( unsigned char * )to; + const unsigned char *current_from_byte = ( unsigned const char * )from; + int byte; + int mask; + + if ( bit_length <= 0 ) + return ; + to_bit_displacement += bit_length - 1; + current_to_byte += to_bit_displacement / CHAR_BIT; /* last byte */ + to_bit_displacement %= CHAR_BIT; /* last bit */ + from_bit_displacement += bit_length - 1; + current_from_byte += from_bit_displacement / CHAR_BIT; /* last byte */ + from_bit_displacement %= CHAR_BIT; /* last bit */ + _Pragma( "loopbound min 0 max 7" ) + while ( 1 ) { + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + byte = ( ( *current_from_byte >> ( CHAR_BIT - 1 - from_bit_displacement ) ) + | ( ( from_bit_displacement != CHAR_BIT - 1 + && bit_length > from_bit_displacement + 1 + ? current_from_byte [ -1 ] << ( from_bit_displacement + 1 ) + : 0 ) + & UCHAR_MAX ) ); + if ( bit_length <= CHAR_BIT ) + break; + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + *current_to_byte + = ( *current_to_byte & ( UCHAR_MAX >> ( to_bit_displacement + 1 ) ) ) + | ( byte << ( CHAR_BIT - 1 - to_bit_displacement ) ); + if ( to_bit_displacement != CHAR_BIT - 1 ) + current_to_byte [ -1 ] + = ( current_to_byte [ -1 ] + & ( UCHAR_MAX << ( CHAR_BIT - 1 - to_bit_displacement ) ) ) + | ( byte >> ( to_bit_displacement + 1 ) ); + bit_length -= CHAR_BIT; + current_from_byte--; + current_to_byte--; + } + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + mask = ( ( UCHAR_MAX >> ( to_bit_displacement + 1 ) ) | + ( UCHAR_MAX << ( CHAR_BIT - 1 - to_bit_displacement + + bit_length ) ) ); + *current_to_byte + = ( *current_to_byte & mask ) + | ( ( byte << ( CHAR_BIT - 1 - to_bit_displacement ) ) & ~mask ); + bit_length -= to_bit_displacement + 1; + if ( bit_length > 0 ) + current_to_byte [ -1 ] + = ( current_to_byte [ -1 ] & ( UCHAR_MAX << bit_length ) ) + | ( byte >> ( to_bit_displacement + 1 ) + & ( UCHAR_MAX >> ( CHAR_BIT - bit_length ) ) ); +} + +/* This function copys a bit string to another bit string with the aid + of functions `bit_string_copy' and `reverse_bit_string_copy'. This + function is analog of standard C function `memmove'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string can + be overlapped. */ + +void +ammunition_bit_string_move ( void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length ) +{ + unsigned char *current_to_byte = ( unsigned char * )to; + const unsigned char *current_from_byte = ( unsigned const char * )from; + + if ( bit_length <= 0 ) + return ; + current_to_byte += to_bit_displacement / CHAR_BIT; + to_bit_displacement %= CHAR_BIT; + current_from_byte += from_bit_displacement / CHAR_BIT; + from_bit_displacement %= CHAR_BIT; + if ( current_from_byte > current_to_byte + || ( current_from_byte == current_to_byte + && from_bit_displacement > to_bit_displacement ) ) + ammunition_bit_string_copy ( current_to_byte, to_bit_displacement, + current_from_byte, from_bit_displacement, + bit_length ); + else + ammunition_reverse_bit_string_copy ( current_to_byte, to_bit_displacement, + current_from_byte, + from_bit_displacement, bit_length ); +} + +/* This function compares bit strings. This function is analog of + standard C function `memcmp'. The function returns 0 if the bit + strings are equal, 1 if the first bit string is greater than the + second, -1 if the first bit string is less than the first. Values + of `bit_displacement1' and `bit_displacement2' must be non-negative + and can be greater than CHAR_BIT. */ + +int +ammunition_bit_string_comparison ( const void *str1, int bit_displacement1, + const void *str2, int bit_displacement2, + int bit_length ) +{ + const unsigned char *current_byte1 = ( unsigned const char * )str1; + const unsigned char *current_byte2 = ( unsigned const char * )str2; + int byte1; + int byte2; + int mask; + + if ( bit_length <= 0 ) + return 0; + current_byte1 += bit_displacement1 / CHAR_BIT; + bit_displacement1 %= CHAR_BIT; + current_byte2 += bit_displacement2 / CHAR_BIT; + bit_displacement2 %= CHAR_BIT; + _Pragma( "loopbound min 0 max 7" ) + while ( 1 ) { + byte1 = ( ( ( *current_byte1 << bit_displacement1 ) & UCHAR_MAX ) + | ( bit_displacement1 != 0 + /* Shift is correct when to_bit_displacement == 0 + because its value is less than word bit size. */ + && bit_length > CHAR_BIT - bit_displacement1 + ? current_byte1 [ 1 ] >> ( CHAR_BIT - bit_displacement1 ) + : 0 ) ); + byte2 = ( ( ( *current_byte2 << bit_displacement2 ) & UCHAR_MAX ) + | ( bit_displacement2 != 0 + && bit_length > CHAR_BIT - bit_displacement2 + ? current_byte2 [ 1 ] >> ( CHAR_BIT - bit_displacement2 ) + : 0 ) ); + if ( bit_length <= CHAR_BIT ) + break; + if ( byte1 > byte2 ) + return 1; + else + if ( byte1 < byte2 ) + return -1; + bit_length -= CHAR_BIT; + current_byte2++; + current_byte1++; + } + /* Shift is correct when to_bit_displacement == 0 because its value + is less than word bit size. */ + mask = UCHAR_MAX << ( CHAR_BIT - bit_length ); + if ( ( byte1 & mask ) > ( byte2 & mask ) ) + return 1; + else + if ( ( byte1 & mask ) < ( byte2 & mask ) ) + return -1; + else + return 0; +} diff --git a/targets/wasm-tacle/sequential/ammunition/bits.h b/targets/wasm-tacle/sequential/ammunition/bits.h new file mode 100755 index 0000000..70cf8bd --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/bits.h @@ -0,0 +1,60 @@ +/* + FILE NAME: bits.h + + TITLE: Include file of package for work with bits + + DESCRIPTION: + This is header file contains macros and the ANSI C prototype + definitions for the package for work with bits and bit strings + and C++ class for work with bits and bit strings. A bit is + given by address (start address) of byte from which counting + bits starts and its displacement which is any non negative + number of bit from the start address. The most significant bit + of the start address byte has number 0. The bit string is + given by its first bit and its length in bits. + +*/ + +#ifndef __BITS__ +#define __BITS__ + +#include "ammunition_limits.h" + +/* This macro value returns bit vlaue (0 or 1) with given bit + displacement (0, 1, ...). The macro has side effects! Value of + `bit_displacement' must be nonegative and can be greater than + CHAR_BIT. */ + +#define BIT(start_byte, bit_displacement)\ + ((((const char *) (start_byte)) [(bit_displacement) / CHAR_BIT]\ + >> (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)) & 1) + + +/* This macro value sets up new value (must be `0' or `1') of a given + bit (bit displacement starts with 0). The macro has side effects! + Value of `bit_displacement' must be nonegative and can be greater + than CHAR_BIT. */ + +#define SET_BIT(start_byte, bit_displacement, bit)\ + (((char *) (start_byte)) [(bit_displacement) / CHAR_BIT]\ + = (((char *) (start_byte)) [(bit_displacement) / CHAR_BIT]\ + & ~(1 << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)))\ + | ((bit) << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) + +int ammunition_is_zero_bit_string ( const void *start_byte, + int bit_displacement, + int bit_length ); +void ammunition_bit_string_set ( void *start_byte, int bit_displacement, + int bit, + int bit_length ); +void ammunition_bit_string_copy ( void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length ); +void ammunition_bit_string_move ( void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length ); +int ammunition_bit_string_comparison ( const void *str1, int bit_displacement1, + const void *str2, int bit_displacement2, + int bit_length ); + +#endif /* #ifndef __BITS__ */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wasm b/targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wasm new file mode 100755 index 0000000000000000000000000000000000000000..1e9b91de8c9214c0fd70bc23ca16be5919ba301e GIT binary patch literal 38439 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wat b/targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wat new file mode 100644 index 0000000..82abfe3 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/default/ammunition.wat @@ -0,0 +1,16570 @@ +(module $ammunition.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (type (;3;) (func (param i32) (result i32))) + (type (;4;) (func (param i32 i32 i32) (result i32))) + (type (;5;) (func (param i32 i32) (result i32))) + (type (;6;) (func (param i32 i32 i32 i32))) + (type (;7;) (func (param i32 i32 i32 i32) (result i32))) + (type (;8;) (func (param i32 i32 i32))) + (type (;9;) (func (param i32 i32 i32 i32 i32))) + (type (;10;) (func (param i32 i32 i32 i32 i32) (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $ammunition_bits_test (type 2) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 8 + i32.const 8 + call $__pragma_loopbound + i32.const 0 + local.set 1 + local.get 0 + i32.const 0 + i32.store16 offset=8 align=1 + local.get 0 + i32.const 0 + i32.store16 align=1 + local.get 0 + i32.const 0 + i32.store16 offset=14 align=1 + local.get 0 + i32.const 0 + i32.store offset=10 align=1 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + local.set 2 + loop ;; label = @1 + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + i32.const 6 + i32.and + local.tee 3 + i32.const 6 + i32.xor + i32.shl + local.get 0 + i32.const 8 + i32.add + local.get 1 + i32.const 3 + i32.shr_u + i32.add + i32.load8_u + local.tee 4 + i32.and + i32.const 1 + local.get 3 + i32.const 7 + i32.xor + i32.shl + local.get 4 + i32.and + i32.or + select + local.set 2 + local.get 1 + i32.const 2 + i32.add + local.tee 1 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + local.set 3 + loop ;; label = @1 + local.get 0 + i32.const 8 + i32.add + local.get 3 + i32.const 3 + i32.shr_u + i32.add + local.tee 1 + local.get 1 + i32.load8_u + i32.const 1 + local.get 3 + i32.const -1 + i32.xor + i32.const 7 + i32.and + i32.shl + i32.or + i32.store8 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + local.set 1 + loop ;; label = @2 + i32.const 1 + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + i32.const 6 + i32.and + local.tee 4 + i32.const 7 + i32.xor + i32.shl + local.get 0 + i32.const 8 + i32.add + local.get 1 + i32.const 3 + i32.shr_u + i32.add + i32.load8_u + local.tee 5 + i32.and + i32.eqz + local.get 1 + local.get 3 + i32.gt_u + i32.xor + select + local.get 5 + local.get 4 + i32.const 6 + i32.xor + i32.shr_u + i32.const 1 + i32.and + i32.eqz + local.get 1 + local.get 3 + i32.ge_u + i32.xor + select + local.set 2 + local.get 1 + i32.const 2 + i32.add + local.tee 1 + i32.const 64 + i32.ne + br_if 0 (;@2;) + end + local.get 3 + i32.const 1 + i32.add + local.tee 3 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=8 align=1 + local.get 0 + i64.const 0 + i64.store align=1 + i32.const 64 + local.set 1 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + local.set 3 + loop ;; label = @1 + local.get 2 + i32.const 1 + local.get 0 + i32.const 8 + i32.add + local.get 3 + local.get 1 + i32.const 1 + i32.shr_u + i32.const 1 + i32.add + call $ammunition_is_zero_bit_string + select + local.set 2 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 1 + i32.const -1 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + local.get 0 + i32.const 8 + i32.add + i32.const 13 + i32.const 1 + i32.const 35 + call $ammunition_bit_string_set + i32.const 13 + i32.const 13 + call $__pragma_loopbound + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.const 13 + call $ammunition_is_zero_bit_string + local.set 1 + local.get 0 + i32.const 8 + i32.add + i32.const 1 + i32.const 12 + call $ammunition_is_zero_bit_string + local.set 3 + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 11 + call $ammunition_is_zero_bit_string + local.set 4 + local.get 0 + i32.const 8 + i32.add + i32.const 3 + i32.const 10 + call $ammunition_is_zero_bit_string + local.set 5 + local.get 0 + i32.const 8 + i32.add + i32.const 4 + i32.const 9 + call $ammunition_is_zero_bit_string + local.set 6 + local.get 0 + i32.const 8 + i32.add + i32.const 5 + i32.const 8 + call $ammunition_is_zero_bit_string + local.set 7 + local.get 0 + i32.const 8 + i32.add + i32.const 6 + i32.const 7 + call $ammunition_is_zero_bit_string + local.set 8 + local.get 0 + i32.const 8 + i32.add + i32.const 7 + i32.const 6 + call $ammunition_is_zero_bit_string + local.set 9 + local.get 0 + i32.const 8 + i32.add + i32.const 8 + i32.const 5 + call $ammunition_is_zero_bit_string + local.set 10 + local.get 0 + i32.const 8 + i32.add + i32.const 9 + i32.const 4 + call $ammunition_is_zero_bit_string + local.set 11 + local.get 0 + i32.const 8 + i32.add + i32.const 10 + i32.const 3 + call $ammunition_is_zero_bit_string + local.set 12 + local.get 0 + i32.const 8 + i32.add + i32.const 11 + i32.const 2 + call $ammunition_is_zero_bit_string + local.set 13 + local.get 0 + i32.const 8 + i32.add + i32.const 12 + i32.const 1 + call $ammunition_is_zero_bit_string + local.set 14 + i32.const 35 + i32.const 35 + call $__pragma_loopbound + local.get 0 + i32.const 8 + i32.add + i32.const 13 + i32.const 35 + call $ammunition_is_zero_bit_string + local.set 15 + local.get 0 + i32.const 8 + i32.add + i32.const 14 + i32.const 34 + call $ammunition_is_zero_bit_string + local.set 16 + local.get 0 + i32.const 8 + i32.add + i32.const 15 + i32.const 33 + call $ammunition_is_zero_bit_string + local.set 17 + local.get 0 + i32.const 8 + i32.add + i32.const 16 + i32.const 32 + call $ammunition_is_zero_bit_string + local.set 18 + local.get 0 + i32.const 8 + i32.add + i32.const 17 + i32.const 31 + call $ammunition_is_zero_bit_string + local.set 19 + local.get 0 + i32.const 8 + i32.add + i32.const 18 + i32.const 30 + call $ammunition_is_zero_bit_string + local.set 20 + local.get 0 + i32.const 8 + i32.add + i32.const 19 + i32.const 29 + call $ammunition_is_zero_bit_string + local.set 21 + local.get 0 + i32.const 8 + i32.add + i32.const 20 + i32.const 28 + call $ammunition_is_zero_bit_string + local.set 22 + local.get 0 + i32.const 8 + i32.add + i32.const 21 + i32.const 27 + call $ammunition_is_zero_bit_string + local.set 23 + local.get 0 + i32.const 8 + i32.add + i32.const 22 + i32.const 26 + call $ammunition_is_zero_bit_string + local.set 24 + local.get 0 + i32.const 8 + i32.add + i32.const 23 + i32.const 25 + call $ammunition_is_zero_bit_string + local.set 25 + local.get 0 + i32.const 8 + i32.add + i32.const 24 + i32.const 24 + call $ammunition_is_zero_bit_string + local.set 26 + local.get 0 + i32.const 8 + i32.add + i32.const 25 + i32.const 23 + call $ammunition_is_zero_bit_string + local.set 27 + local.get 0 + i32.const 8 + i32.add + i32.const 26 + i32.const 22 + call $ammunition_is_zero_bit_string + local.set 28 + local.get 0 + i32.const 8 + i32.add + i32.const 27 + i32.const 21 + call $ammunition_is_zero_bit_string + local.set 29 + local.get 0 + i32.const 8 + i32.add + i32.const 28 + i32.const 20 + call $ammunition_is_zero_bit_string + local.set 30 + local.get 0 + i32.const 8 + i32.add + i32.const 29 + i32.const 19 + call $ammunition_is_zero_bit_string + local.set 31 + local.get 0 + i32.const 8 + i32.add + i32.const 30 + i32.const 18 + call $ammunition_is_zero_bit_string + local.set 32 + local.get 0 + i32.const 8 + i32.add + i32.const 31 + i32.const 17 + call $ammunition_is_zero_bit_string + local.set 33 + local.get 0 + i32.const 8 + i32.add + i32.const 32 + i32.const 16 + call $ammunition_is_zero_bit_string + local.set 34 + local.get 0 + i32.const 8 + i32.add + i32.const 33 + i32.const 15 + call $ammunition_is_zero_bit_string + local.set 35 + local.get 0 + i32.const 8 + i32.add + i32.const 34 + i32.const 14 + call $ammunition_is_zero_bit_string + local.set 36 + local.get 0 + i32.const 8 + i32.add + i32.const 35 + i32.const 13 + call $ammunition_is_zero_bit_string + local.set 37 + local.get 0 + i32.const 8 + i32.add + i32.const 36 + i32.const 12 + call $ammunition_is_zero_bit_string + local.set 38 + local.get 0 + i32.const 8 + i32.add + i32.const 37 + i32.const 11 + call $ammunition_is_zero_bit_string + local.set 39 + local.get 0 + i32.const 8 + i32.add + i32.const 38 + i32.const 10 + call $ammunition_is_zero_bit_string + local.set 40 + local.get 0 + i32.const 8 + i32.add + i32.const 39 + i32.const 9 + call $ammunition_is_zero_bit_string + local.set 41 + local.get 0 + i32.const 8 + i32.add + i32.const 40 + i32.const 8 + call $ammunition_is_zero_bit_string + local.set 42 + local.get 0 + i32.const 8 + i32.add + i32.const 41 + i32.const 7 + call $ammunition_is_zero_bit_string + local.set 43 + local.get 0 + i32.const 8 + i32.add + i32.const 42 + i32.const 6 + call $ammunition_is_zero_bit_string + local.set 44 + local.get 0 + i32.const 8 + i32.add + i32.const 43 + i32.const 5 + call $ammunition_is_zero_bit_string + local.set 45 + local.get 0 + i32.const 8 + i32.add + i32.const 44 + i32.const 4 + call $ammunition_is_zero_bit_string + local.set 46 + local.get 0 + i32.const 8 + i32.add + i32.const 45 + i32.const 3 + call $ammunition_is_zero_bit_string + local.set 47 + local.get 0 + i32.const 8 + i32.add + i32.const 46 + i32.const 2 + call $ammunition_is_zero_bit_string + local.set 48 + local.get 0 + i32.const 8 + i32.add + i32.const 47 + i32.const 1 + call $ammunition_is_zero_bit_string + local.set 49 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + i32.const 8 + i32.add + i32.const 48 + i32.const 16 + call $ammunition_is_zero_bit_string + local.set 50 + local.get 0 + i32.const 8 + i32.add + i32.const 49 + i32.const 15 + call $ammunition_is_zero_bit_string + local.set 51 + local.get 0 + i32.const 8 + i32.add + i32.const 50 + i32.const 14 + call $ammunition_is_zero_bit_string + local.set 52 + local.get 0 + i32.const 8 + i32.add + i32.const 51 + i32.const 13 + call $ammunition_is_zero_bit_string + local.set 53 + local.get 0 + i32.const 8 + i32.add + i32.const 52 + i32.const 12 + call $ammunition_is_zero_bit_string + local.set 54 + local.get 0 + i32.const 8 + i32.add + i32.const 53 + i32.const 11 + call $ammunition_is_zero_bit_string + local.set 55 + local.get 0 + i32.const 8 + i32.add + i32.const 54 + i32.const 10 + call $ammunition_is_zero_bit_string + local.set 56 + local.get 0 + i32.const 8 + i32.add + i32.const 55 + i32.const 9 + call $ammunition_is_zero_bit_string + local.set 57 + local.get 0 + i32.const 8 + i32.add + i32.const 56 + i32.const 8 + call $ammunition_is_zero_bit_string + local.set 58 + local.get 0 + i32.const 8 + i32.add + i32.const 57 + i32.const 7 + call $ammunition_is_zero_bit_string + local.set 59 + local.get 0 + i32.const 8 + i32.add + i32.const 58 + i32.const 6 + call $ammunition_is_zero_bit_string + local.set 60 + local.get 0 + i32.const 8 + i32.add + i32.const 59 + i32.const 5 + call $ammunition_is_zero_bit_string + local.set 61 + local.get 0 + i32.const 8 + i32.add + i32.const 60 + i32.const 4 + call $ammunition_is_zero_bit_string + local.set 62 + local.get 0 + i32.const 8 + i32.add + i32.const 61 + i32.const 3 + call $ammunition_is_zero_bit_string + local.set 63 + local.get 0 + i32.const 8 + i32.add + i32.const 62 + i32.const 2 + call $ammunition_is_zero_bit_string + local.set 64 + local.get 0 + i32.const 8 + i32.add + i32.const 63 + i32.const 1 + call $ammunition_is_zero_bit_string + local.set 65 + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + i32.const 0 + i32.store16 offset=8 align=1 + local.get 0 + i32.const 0 + i32.store8 offset=10 + local.get 0 + i32.const 0 + i32.store16 offset=1 align=1 + local.get 0 + i32.const 0 + i32.store8 offset=15 + local.get 0 + i32.const 0 + i32.store offset=11 align=1 + i32.const 42 + i32.const 42 + call $__pragma_loopbound + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + select + i32.const 1 + local.get 3 + select + i32.const 1 + local.get 4 + select + i32.const 1 + local.get 5 + select + i32.const 1 + local.get 6 + select + i32.const 1 + local.get 7 + select + i32.const 1 + local.get 8 + select + i32.const 1 + local.get 9 + select + i32.const 1 + local.get 10 + select + i32.const 1 + local.get 11 + select + i32.const 1 + local.get 12 + select + i32.const 1 + local.get 13 + select + i32.const 1 + local.get 14 + select + local.get 49 + local.get 48 + i32.or + local.get 47 + local.get 46 + local.get 45 + local.get 44 + local.get 43 + local.get 42 + local.get 41 + local.get 40 + local.get 39 + local.get 38 + local.get 37 + local.get 36 + local.get 35 + local.get 34 + local.get 33 + local.get 32 + local.get 31 + local.get 30 + local.get 29 + local.get 28 + local.get 27 + local.get 26 + local.get 25 + local.get 24 + local.get 23 + local.get 22 + local.get 21 + local.get 20 + local.get 19 + local.get 18 + local.get 17 + local.get 16 + local.get 15 + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + select + i32.const 1 + local.get 50 + select + i32.const 1 + local.get 51 + select + i32.const 1 + local.get 52 + select + i32.const 1 + local.get 53 + select + i32.const 1 + local.get 54 + select + i32.const 1 + local.get 55 + select + i32.const 1 + local.get 56 + select + i32.const 1 + local.get 57 + select + i32.const 1 + local.get 58 + select + i32.const 1 + local.get 59 + select + i32.const 1 + local.get 60 + select + i32.const 1 + local.get 61 + select + i32.const 1 + local.get 62 + select + i32.const 1 + local.get 63 + select + i32.const 1 + local.get 64 + select + i32.const 1 + local.get 65 + select + local.set 1 + i32.const 1 + local.set 3 + i32.const 0 + local.set 4 + i32.const 0 + local.set 5 + i32.const 0 + local.set 2 + loop ;; label = @1 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const 1 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + call $ammunition_bit_string_set + local.get 0 + i32.const 8 + i32.add + i32.const 0 + local.get 2 + i32.const -1 + i32.add + call $ammunition_is_zero_bit_string + local.set 6 + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 5 + call $ammunition_is_zero_bit_string + local.set 5 + local.get 0 + i32.const 8 + i32.add + local.get 3 + i32.const 63 + local.get 4 + i32.sub + call $ammunition_is_zero_bit_string + local.set 3 + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.const 0 + i32.const 64 + call $ammunition_bit_string_set + i32.const 1 + local.get 1 + i32.const 1 + local.get 6 + select + local.get 5 + select + i32.const 1 + local.get 3 + select + local.set 1 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 1 + i32.shr_u + local.tee 5 + local.get 2 + i32.add + local.tee 4 + i32.const 1 + i32.add + local.set 3 + local.get 2 + i32.const 42 + i32.ne + br_if 0 (;@1;) + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=8 align=1 + local.get 0 + i64.const 0 + i64.store align=1 + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + local.get 0 + i32.const 2 + i32.const 1 + i32.const 40 + call $ammunition_bit_string_set + i32.const 42 + local.set 3 + i32.const 42 + i32.const 42 + call $__pragma_loopbound + i32.const 0 + local.set 2 + loop ;; label = @1 + i32.const 1 + local.get 1 + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 0 + local.get 2 + local.get 3 + call $ammunition_bit_string_comparison + select + local.set 1 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@1;) + end + i32.const 43 + i32.const 43 + call $__pragma_loopbound + i32.const 0 + local.set 2 + i32.const 64 + local.set 3 + loop ;; label = @1 + i32.const 1 + local.get 1 + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 0 + local.get 2 + local.get 3 + call $ammunition_bit_string_comparison + i32.const 1 + i32.lt_s + select + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 43 + i32.ne + br_if 0 (;@1;) + end + i32.const 43 + i32.const 43 + call $__pragma_loopbound + i32.const 0 + local.set 2 + i32.const 64 + local.set 3 + loop ;; label = @1 + i32.const 1 + local.get 1 + local.get 0 + local.get 2 + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 3 + call $ammunition_bit_string_comparison + i32.const -1 + i32.gt_s + select + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 43 + i32.ne + br_if 0 (;@1;) + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=8 align=1 + local.get 0 + i64.const 0 + i64.store align=1 + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + i32.const 59 + local.set 3 + i32.const 59 + i32.const 59 + call $__pragma_loopbound + i32.const 5 + local.set 2 + loop ;; label = @1 + local.get 0 + local.get 2 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const -5 + i32.add + local.tee 4 + local.get 3 + call $ammunition_bit_string_copy + i32.const 1 + local.get 1 + local.get 0 + local.get 2 + local.get 0 + i32.const 8 + i32.add + local.get 4 + local.get 3 + call $ammunition_bit_string_comparison + select + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=8 align=1 + local.get 0 + i64.const 0 + i64.store align=1 + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + local.get 0 + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + i32.const 59 + local.set 3 + i32.const 59 + i32.const 59 + call $__pragma_loopbound + i32.const 5 + local.set 2 + loop ;; label = @1 + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.const 0 + i32.const 64 + call $ammunition_bit_string_set + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const -5 + i32.add + local.tee 4 + local.get 3 + call $ammunition_bit_string_move + i32.const 1 + local.get 1 + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 0 + local.get 4 + local.get 3 + call $ammunition_bit_string_comparison + select + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=8 align=1 + local.get 0 + i64.const 0 + i64.store align=1 + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + local.get 0 + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + i32.const 59 + i32.const 59 + call $__pragma_loopbound + i32.const 59 + local.set 3 + i32.const 0 + local.set 2 + loop ;; label = @1 + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.const 0 + i32.const 64 + call $ammunition_bit_string_set + local.get 0 + i32.const 8 + i32.add + i32.const 2 + i32.const 1 + i32.const 43 + call $ammunition_bit_string_set + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const 5 + i32.add + local.tee 4 + local.get 3 + call $ammunition_bit_string_move + i32.const 1 + local.get 1 + local.get 0 + i32.const 8 + i32.add + local.get 2 + local.get 0 + local.get 4 + local.get 3 + call $ammunition_bit_string_comparison + select + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 59 + i32.ne + br_if 0 (;@1;) + end + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1) + (func $ammunition_arithm_test (type 2) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 80 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 4 + i32.const 1024 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const -2147483648 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 3 + i32.const 4 + i32.const 1050 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 4 + local.get 0 + i32.const 48 + i32.add + i32.const 2147483647 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 5 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 6 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + local.get 4 + i32.eqz + local.get 1 + i32.eqz + i32.or + local.get 2 + local.get 3 + local.get 6 + local.get 5 + i32.or + i32.or + i32.or + i32.const 0 + i32.ne + i32.or + local.set 2 + i32.const -2000 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 3 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 3 + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + i32.or + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 2000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1082 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const -1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 3 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 4 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + select + local.get 4 + local.get 3 + i32.or + select + local.set 2 + i32.const 0 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 0 + i32.load offset=1196 + local.set 3 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 3 + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + i32.or + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 4000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + local.get 0 + i32.const 48 + i32.add + i32.const 2147483647 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1116 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_add_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const 2147483643 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 4 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_add_integer + i32.const 0 + i32.load offset=1196 + local.set 3 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 2147483647 + call $ammunition_sprintf_d + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 4 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + select + local.get 4 + local.get 3 + i32.or + select + local.set 3 + i32.const -2000 + local.set 1 + i32.const -3999 + local.set 2 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const 1 + i32.add + local.tee 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_add_integer + i32.const 0 + i32.load offset=1196 + local.set 4 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + i32.const 1 + local.get 3 + local.get 4 + select + i32.const 1 + local.get 2 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + i32.eq + select + local.set 3 + local.get 2 + i32.const 2 + i32.add + local.tee 2 + i32.const 4001 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + local.get 0 + i32.const 48 + i32.add + i32.const -1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1116 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_add_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const -5 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 4 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_add_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const -1 + call $ammunition_sprintf_u + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 4 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 3 + i32.const 1 + local.get 1 + select + local.get 4 + local.get 2 + i32.or + select + local.set 3 + i32.const 1 + local.set 1 + i32.const 1 + local.set 2 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const -1 + i32.add + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_add_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 4 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + i32.const 1 + local.get 3 + local.get 4 + select + i32.const 1 + local.get 2 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + i32.eq + select + local.set 3 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 2 + i32.const 2 + i32.add + local.tee 2 + i32.const 8001 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + local.get 0 + i32.const 48 + i32.add + i32.const -2147483648 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1116 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_subtract_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const -2147483644 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 4 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_subtract_integer + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const -2147483648 + call $ammunition_sprintf_d + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 4 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 3 + i32.const 1 + local.get 1 + select + local.get 4 + local.get 2 + i32.or + select + local.set 4 + i32.const -2000 + local.set 1 + i32.const -4010 + local.set 2 + i32.const 2010 + local.set 3 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 3 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_subtract_integer + i32.const 0 + i32.load offset=1196 + local.set 5 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + i32.const 1 + local.get 4 + local.get 5 + select + i32.const 1 + local.get 2 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + i32.eq + select + local.set 4 + local.get 2 + i32.const 2 + i32.add + local.set 2 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 2000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + local.get 0 + i32.const 48 + i32.add + i32.const -3 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const -2 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_subtract_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const -1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_subtract_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + local.set 3 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 4 + i32.const 1 + local.get 1 + select + local.get 3 + local.get 2 + i32.or + select + local.set 2 + i32.const 0 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const 1 + i32.shr_u + local.tee 3 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_subtract_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 4 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 4 + select + i32.const 1 + local.get 1 + local.get 3 + i32.sub + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + i32.eq + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 4000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + local.get 0 + i32.const 48 + i32.add + i32.const 1073741824 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1113 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const -1073741825 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1113 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_integer + i32.const 0 + i32.load offset=1196 + local.set 3 + local.get 0 + i32.const 48 + i32.add + i32.const 715827882 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 3 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_integer + i32.const 0 + i32.load offset=1196 + local.set 4 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 2147483646 + call $ammunition_sprintf_d + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 5 + local.get 0 + i32.const 48 + i32.add + i32.const -1073741824 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 2 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_integer + i32.const 0 + i32.load offset=1196 + local.set 6 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const -2147483648 + call $ammunition_sprintf_d + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 7 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + select + i32.const 1 + local.get 3 + select + local.get 7 + local.get 6 + i32.or + local.get 5 + local.get 4 + i32.or + i32.or + select + local.set 2 + i32.const -2000 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const 1000 + i32.add + local.tee 3 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_integer + i32.const 0 + i32.load offset=1196 + local.set 4 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 4 + select + i32.const 1 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + local.get 3 + local.get 1 + i32.mul + i32.eq + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 2000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + local.get 0 + i32.const 48 + i32.add + i32.const 858993460 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 5 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + local.get 0 + i32.const 48 + i32.add + i32.const 2147483647 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const 2 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 3 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 48 + i32.add + i32.const -2 + call $ammunition_sprintf_u + drop + local.get 0 + i32.const 16 + i32.add + local.get 0 + i32.const 48 + i32.add + call $ammunition_strcmp + local.set 4 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + i32.const 1 + local.get 2 + i32.const 1 + local.get 1 + select + local.get 4 + local.get 3 + i32.or + select + local.set 2 + i32.const 0 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const 1 + i32.shr_u + local.tee 3 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_multiply_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 4 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 4 + select + i32.const 1 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + local.get 3 + local.get 1 + i32.mul + i32.eq + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 4000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_divide_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + local.get 2 + i32.const 1 + local.get 1 + select + local.set 4 + i32.const 2000 + local.set 2 + i32.const -2000 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const -1 + i32.gt_s + local.tee 3 + br_if 0 (;@3;) + local.get 2 + i32.const 20 + i32.div_u + i32.const 1 + i32.add + local.set 5 + br 1 (;@2;) + end + local.get 1 + i32.const 65535 + i32.and + i32.const 20 + i32.div_u + i32.const -1 + i32.xor + local.set 5 + end + local.get 0 + i32.const 48 + i32.add + local.get 5 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_divide_integer + i32.const 0 + i32.load offset=1196 + local.set 5 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + local.set 6 + block ;; label = @2 + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + local.get 2 + i32.const 20 + i32.div_u + i32.const 1 + i32.add + local.set 7 + br 1 (;@2;) + end + local.get 1 + i32.const 65535 + i32.and + i32.const 20 + i32.div_u + i32.const -1 + i32.xor + local.set 7 + end + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_d + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_divide_integer + i32.const 0 + i32.load offset=1196 + local.set 8 + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 1 + local.get 7 + i32.div_s + local.set 7 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + local.set 9 + block ;; label = @2 + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + local.get 2 + i32.const 20 + i32.div_u + i32.const 1 + i32.add + local.set 3 + br 1 (;@2;) + end + local.get 1 + i32.const 65535 + i32.and + i32.const 20 + i32.div_u + i32.const -1 + i32.xor + local.set 3 + end + i32.const 1 + i32.const 1 + local.get 4 + local.get 5 + select + i32.const 1 + local.get 6 + local.get 7 + i32.eq + select + local.get 8 + select + i32.const 1 + local.get 9 + local.get 1 + local.get 3 + i32.div_s + i32.eq + select + local.set 4 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + i32.const -2000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_divide_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 1 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + local.get 4 + i32.const 1 + local.get 1 + select + local.set 2 + i32.const 0 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const 65535 + i32.and + local.tee 3 + i32.const 20 + i32.div_u + i32.const 1 + i32.add + local.tee 4 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_divide_unsigned_integer + i32.const 0 + i32.load offset=1196 + local.set 5 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 5 + select + i32.const 1 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + local.get 3 + local.get 4 + i32.div_u + i32.eq + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 4000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_remainder + i32.const 0 + i32.load offset=1196 + local.set 1 + i32.const 4000 + i32.const 4000 + call $__pragma_loopbound + local.get 2 + i32.const 1 + local.get 1 + select + local.set 2 + i32.const 0 + local.set 1 + loop ;; label = @1 + local.get 0 + i32.const 48 + i32.add + local.get 1 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + local.get 0 + i32.const 48 + i32.add + local.get 1 + i32.const 65535 + i32.and + local.tee 3 + i32.const 20 + i32.div_u + i32.const 1 + i32.add + local.tee 4 + call $ammunition_sprintf_u + drop + i32.const 4 + local.get 0 + i32.const 48 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_remainder + i32.const 0 + i32.load offset=1196 + local.set 5 + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + i32.const 1 + local.get 2 + local.get 5 + select + i32.const 1 + local.get 0 + i32.const 16 + i32.add + call $ammunition_atoi + local.get 3 + local.get 4 + i32.rem_u + i32.eq + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 4000 + i32.ne + br_if 0 (;@1;) + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 0 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 32 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 8 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1108 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1093 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const -13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1093 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 0 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 32 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 8 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1108 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1093 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const -13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1093 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 0 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1061 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 32 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1115 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 8 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1096 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1118 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1078 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1118 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const -13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1078 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 0 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 2 + end + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 22 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_left + i32.const 0 + i32.load offset=1196 + local.set 1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 8 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1043 + call $ammunition_strcmp + br_if 0 (;@2;) + local.get 2 + i32.const 1 + local.get 1 + select + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1127 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const -13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1127 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 0 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 21 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 8 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1043 + call $ammunition_strcmp + br_if 0 (;@2;) + local.get 1 + i32.const 1 + local.get 2 + select + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1127 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1119 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const -13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1127 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 0 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1061 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 21 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 8 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1042 + call $ammunition_strcmp + br_if 0 (;@2;) + local.get 1 + i32.const 1 + local.get 2 + select + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1118 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_left + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1126 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1118 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const -13 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_shift_right + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1126 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1143 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_eq_integer + local.set 2 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_eq_integer + local.set 3 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_eq_unsigned_integer + local.set 4 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_eq_unsigned_integer + local.set 5 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1143 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ne_integer + local.set 6 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ne_integer + local.set 7 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ne_unsigned_integer + local.set 8 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ne_unsigned_integer + local.set 9 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1143 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_integer + local.set 10 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_integer + local.set 11 + i32.const 4 + i32.const 1183 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_integer + local.set 12 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_integer + local.set 13 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_unsigned_integer + local.set 14 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_unsigned_integer + local.set 15 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_gt_unsigned_integer + local.set 16 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1143 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_integer + local.set 17 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_integer + local.set 18 + i32.const 4 + i32.const 1183 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_integer + local.set 19 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_integer + local.set 20 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_unsigned_integer + local.set 21 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_unsigned_integer + local.set 22 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_lt_unsigned_integer + local.set 23 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1143 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_integer + local.set 24 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_integer + local.set 25 + i32.const 4 + i32.const 1183 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_integer + local.set 26 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_integer + local.set 27 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_unsigned_integer + local.set 28 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_unsigned_integer + local.set 29 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_ge_unsigned_integer + local.set 30 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1143 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_integer + local.set 31 + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_integer + local.set 32 + i32.const 4 + i32.const 1183 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1061 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_integer + local.set 33 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_integer + local.set 34 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1144 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_unsigned_integer + local.set 35 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_unsigned_integer + local.set 36 + i32.const 4 + i32.const 1184 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_le_unsigned_integer + local.set 37 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1154 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 2 + local.get 0 + i32.const 12 + i32.add + call $ammunition_change_unsigned_integer_size + i32.const 0 + i32.load offset=1196 + local.set 38 + i32.const 4 + i32.const 1177 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 2 + local.get 0 + i32.const 12 + i32.add + call $ammunition_change_unsigned_integer_size + i32.const 2 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1177 + call $ammunition_strcmp + br_if 0 (;@2;) + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + i32.const 1 + local.get 1 + local.get 2 + select + i32.const 1 + local.get 3 + select + local.get 4 + select + i32.const 1 + local.get 5 + select + i32.const 1 + local.get 6 + select + local.get 7 + select + i32.const 1 + local.get 8 + select + local.get 12 + local.get 11 + i32.or + local.get 10 + local.get 9 + i32.or + i32.or + select + i32.const 1 + local.get 13 + select + local.get 15 + local.get 14 + i32.or + select + i32.const 1 + local.get 16 + select + i32.const 1 + local.get 17 + select + local.get 18 + select + i32.const 1 + local.get 19 + select + local.get 20 + select + i32.const 1 + local.get 21 + select + local.get 24 + local.get 23 + i32.or + local.get 22 + i32.or + select + i32.const 1 + local.get 25 + select + local.get 26 + select + i32.const 1 + local.get 27 + select + local.get 28 + select + i32.const 1 + local.get 29 + select + i32.const 1 + local.get 30 + select + i32.const 1 + local.get 31 + select + i32.const 1 + local.get 32 + select + i32.const 1 + local.get 33 + select + local.get 34 + select + i32.const 1 + local.get 35 + select + i32.const 1 + local.get 36 + select + local.get 37 + select + i32.const 1 + local.get 38 + select + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1167 + local.get 0 + i32.const 2 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 2 + i32.add + i32.const 6 + local.get 0 + i32.const 2 + i32.add + call $ammunition_change_unsigned_integer_size + i32.const 6 + local.get 0 + i32.const 2 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1167 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1160 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 2 + local.get 0 + i32.const 12 + i32.add + call $ammunition_change_integer_size + i32.const 0 + i32.load offset=1196 + local.set 2 + i32.const 4 + i32.const 1147 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 2 + local.get 0 + i32.const 12 + i32.add + call $ammunition_change_integer_size + i32.const 0 + i32.load offset=1196 + local.set 3 + i32.const 4 + i32.const 1177 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 2 + local.get 0 + i32.const 12 + i32.add + call $ammunition_change_integer_size + i32.const 2 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1177 + call $ammunition_strcmp + br_if 0 (;@2;) + local.get 1 + i32.const 1 + local.get 2 + select + i32.const 1 + local.get 3 + select + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1176 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + i32.const 2 + local.get 0 + i32.const 12 + i32.add + call $ammunition_change_integer_size + i32.const 2 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1176 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1167 + local.get 0 + i32.const 2 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 2 + i32.add + i32.const 6 + local.get 0 + i32.const 2 + i32.add + call $ammunition_change_integer_size + i32.const 6 + local.get 0 + i32.const 2 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1167 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 4 + i32.const 1166 + local.get 0 + i32.const 2 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 2 + i32.add + i32.const 6 + local.get 0 + i32.const 2 + i32.add + call $ammunition_change_integer_size + i32.const 6 + local.get 0 + i32.const 2 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1196 + br_if 0 (;@2;) + local.get 0 + i32.const 16 + i32.add + i32.const 1166 + call $ammunition_strcmp + i32.eqz + br_if 1 (;@1;) + end + i32.const 1 + local.set 1 + end + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 2 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 3 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1099 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1099 + call $ammunition_strcmp + local.set 4 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1090 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1138 + call $ammunition_strcmp + local.set 5 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 6 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 7 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1115 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1115 + call $ammunition_strcmp + local.set 8 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1090 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_or + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1138 + call $ammunition_strcmp + local.set 9 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 10 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + local.set 11 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1099 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 12 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + i32.const 1090 + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_unsigned_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1110 + call $ammunition_strcmp + local.set 13 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 14 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + local.set 15 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1115 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1062 + call $ammunition_strcmp + local.set 16 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + i32.const 1090 + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 8 + i32.add + call $ammunition_integer_and + i32.const 4 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1110 + call $ammunition_strcmp + local.set 17 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_not + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1067 + call $ammunition_strcmp + local.set 18 + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_not + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1099 + call $ammunition_strcmp + local.set 19 + i32.const 4 + i32.const 1099 + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_unsigned_integer_not + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_unsigned_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + local.set 20 + i32.const 20 + i32.const 20 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=48 + local.get 0 + i32.const 0 + i32.store16 offset=16 + local.get 0 + i32.const 0 + i32.store offset=18 align=2 + local.get 0 + i64.const 0 + i64.store offset=22 align=2 + local.get 0 + i64.const 0 + i64.store offset=56 + local.get 0 + i32.const 0 + i32.store offset=30 align=2 + local.get 0 + i32.const 0 + i32.store offset=64 + local.get 0 + i32.const 0 + i32.store16 offset=34 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store offset=12 align=1 + local.get 0 + i32.const 0 + i32.store offset=8 align=1 + i32.const 6 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 0 + i32.store16 offset=6 align=1 + local.get 0 + i32.const 0 + i32.store offset=2 align=1 + i32.const 4 + i32.const 1062 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_not + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1036 + call $ammunition_strcmp + local.set 21 + i32.const 4 + i32.const 1190 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_not + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1115 + call $ammunition_strcmp + local.set 22 + i32.const 4 + i32.const 1115 + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_from_string + drop + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 12 + i32.add + call $ammunition_integer_not + i32.const 4 + local.get 0 + i32.const 12 + i32.add + local.get 0 + i32.const 16 + i32.add + call $ammunition_integer_to_string + drop + local.get 0 + i32.const 16 + i32.add + i32.const 1190 + call $ammunition_strcmp + local.set 23 + local.get 0 + i32.const 80 + i32.add + global.set $__stack_pointer + i32.const 1 + local.get 1 + local.get 23 + local.get 22 + i32.or + local.get 21 + local.get 20 + local.get 19 + local.get 18 + local.get 17 + local.get 16 + local.get 15 + local.get 14 + local.get 13 + local.get 12 + local.get 11 + local.get 10 + local.get 9 + local.get 8 + local.get 7 + local.get 6 + local.get 5 + local.get 4 + local.get 3 + local.get 2 + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + select) + (func $ammunition_main (type 1) + i32.const 0 + call $ammunition_bits_test + i32.const 0 + i32.load offset=1192 + i32.or + i32.store offset=1192 + i32.const 0 + call $ammunition_arithm_test + i32.const 0 + i32.load offset=1192 + i32.or + i32.store offset=1192) + (func $__original_main (type 2) (result i32) + i32.const 0 + i32.const 0 + i32.store offset=1192 + call $ammunition_main + i32.const 0 + i32.load offset=1192) + (func $ammunition_isdigit (type 3) (param i32) (result i32) + local.get 0 + i32.const -48 + i32.add + i32.const 255 + i32.and + i32.const 10 + i32.lt_u) + (func $ammunition_isspace (type 3) (param i32) (result i32) + local.get 0 + i32.const 32 + i32.eq + local.get 0 + i32.const 13 + i32.eq + i32.or + local.get 0 + i32.const -9 + i32.add + i32.const 2 + i32.lt_u + i32.or) + (func $ammunition_memcpy (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32) + i32.const 2 + i32.const 6 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + local.get 2 + i32.const 3 + i32.and + local.set 3 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 2 + i32.const 4 + i32.lt_u + br_if 0 (;@2;) + local.get 2 + i32.const -4 + i32.and + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 0 + local.get 4 + i32.add + local.tee 2 + local.get 1 + local.get 4 + i32.add + local.tee 6 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 3 + i32.add + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 5 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 3 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 4 + i32.add + local.set 2 + local.get 0 + local.get 4 + i32.add + local.set 4 + loop ;; label = @2 + local.get 4 + local.get 2 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end + local.get 0) + (func $ammunition_memset (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const 0 + local.set 3 + i32.const 0 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + local.get 2 + i32.const 7 + i32.and + local.set 4 + block ;; label = @2 + local.get 2 + i32.const 8 + i32.lt_u + br_if 0 (;@2;) + local.get 2 + i32.const -8 + i32.and + local.set 5 + i32.const 0 + local.set 3 + loop ;; label = @3 + local.get 0 + local.get 3 + i32.add + local.tee 2 + local.get 1 + i32.store8 + local.get 2 + i32.const 7 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 6 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 5 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 4 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 3 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 1 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 1 + i32.store8 + local.get 5 + local.get 3 + i32.const 8 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@3;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 3 + i32.add + local.set 2 + loop ;; label = @2 + local.get 2 + local.get 1 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + br_if 0 (;@2;) + end + end + local.get 0) + (func $ammunition_memcmp (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 0 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + loop ;; label = @2 + block ;; label = @3 + local.get 0 + i32.load8_u + local.tee 3 + local.get 1 + i32.load8_u + local.tee 4 + i32.eq + br_if 0 (;@3;) + local.get 3 + local.get 4 + i32.sub + return + end + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + br_if 0 (;@2;) + end + end + i32.const 0) + (func $ammunition_memmove (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32) + local.get 0 + local.get 2 + i32.add + local.set 3 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + local.get 1 + i32.ge_u + local.tee 4 + br_if 0 (;@4;) + local.get 3 + local.get 1 + i32.le_u + br_if 1 (;@3;) + end + local.get 1 + local.get 0 + i32.ge_u + br_if 1 (;@2;) + local.get 1 + local.get 2 + i32.add + local.get 0 + i32.gt_u + br_if 1 (;@2;) + end + i32.const 2 + i32.const 6 + call $__pragma_loopbound + local.get 2 + i32.eqz + br_if 1 (;@1;) + local.get 2 + i32.const 3 + i32.and + local.set 5 + i32.const 0 + local.set 3 + block ;; label = @3 + local.get 2 + i32.const 4 + i32.lt_u + br_if 0 (;@3;) + local.get 2 + i32.const -4 + i32.and + local.set 6 + i32.const 0 + local.set 3 + loop ;; label = @4 + local.get 0 + local.get 3 + i32.add + local.tee 2 + local.get 1 + local.get 3 + i32.add + local.tee 4 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 4 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 4 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 3 + i32.add + local.get 4 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 6 + local.get 3 + i32.const 4 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@4;) + end + end + local.get 5 + i32.eqz + br_if 1 (;@1;) + local.get 1 + local.get 3 + i32.add + local.set 2 + local.get 0 + local.get 3 + i32.add + local.set 3 + loop ;; label = @3 + local.get 3 + local.get 2 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 0 + i32.const 4 + call $__pragma_loopbound + block ;; label = @2 + local.get 4 + br_if 0 (;@2;) + local.get 3 + local.get 1 + i32.le_u + br_if 0 (;@2;) + local.get 2 + i32.eqz + br_if 1 (;@1;) + local.get 2 + i32.const 3 + i32.and + local.set 5 + i32.const 0 + local.set 3 + block ;; label = @3 + local.get 2 + i32.const 4 + i32.lt_u + br_if 0 (;@3;) + local.get 2 + i32.const -4 + i32.and + local.set 6 + i32.const 0 + local.set 3 + loop ;; label = @4 + local.get 0 + local.get 3 + i32.add + local.tee 2 + local.get 1 + local.get 3 + i32.add + local.tee 4 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 4 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 4 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 3 + i32.add + local.get 4 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 6 + local.get 3 + i32.const 4 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@4;) + end + end + local.get 5 + i32.eqz + br_if 1 (;@1;) + local.get 1 + local.get 3 + i32.add + local.set 2 + local.get 0 + local.get 3 + i32.add + local.set 3 + loop ;; label = @3 + local.get 3 + local.get 2 + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 2 + i32.const -1 + i32.add + local.tee 4 + i32.const 0 + i32.lt_s + br_if 0 (;@1;) + local.get 4 + local.set 3 + block ;; label = @2 + local.get 2 + i32.const 3 + i32.and + local.tee 2 + i32.eqz + br_if 0 (;@2;) + local.get 4 + local.set 3 + loop ;; label = @3 + local.get 0 + local.get 3 + i32.add + local.get 1 + local.get 3 + i32.add + i32.load8_u + i32.store8 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + br_if 0 (;@3;) + end + end + local.get 4 + i32.const 3 + i32.lt_u + br_if 0 (;@1;) + local.get 1 + i32.const -3 + i32.add + local.set 5 + local.get 0 + i32.const -3 + i32.add + local.set 1 + loop ;; label = @2 + local.get 1 + local.get 3 + i32.add + local.tee 2 + i32.const 3 + i32.add + local.get 5 + local.get 3 + i32.add + local.tee 4 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.get 4 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.get 4 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 2 + local.get 4 + i32.load8_u + i32.store8 + local.get 3 + i32.const -4 + i32.add + local.tee 3 + i32.const -1 + i32.ne + br_if 0 (;@2;) + end + end + local.get 0) + (func $ammunition_strcmp (type 5) (param i32 i32) (result i32) + (local i32) + i32.const 1 + i32.const 11 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load8_u + local.tee 2 + br_if 0 (;@2;) + i32.const 0 + local.set 2 + br 1 (;@1;) + end + local.get 0 + i32.const 1 + i32.add + local.set 0 + block ;; label = @2 + loop ;; label = @3 + local.get 2 + i32.const 255 + i32.and + local.get 1 + i32.load8_u + i32.ne + br_if 1 (;@2;) + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.load8_u + local.set 2 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 2 + br_if 0 (;@3;) + end + i32.const 0 + local.set 2 + end + local.get 2 + i32.const 255 + i32.and + local.set 2 + end + local.get 2 + local.get 1 + i32.load8_u + i32.sub) + (func $ammunition_atoi (type 3) (param i32) (result i32) + (local i32 i32 i32) + local.get 0 + i32.load8_u + local.set 1 + i32.const 1 + i32.const 7 + call $__pragma_loopbound + local.get 0 + local.get 1 + i32.const 45 + i32.eq + local.get 1 + i32.const 43 + i32.eq + i32.or + i32.add + local.tee 2 + i32.const 1 + i32.add + local.set 0 + local.get 2 + i32.load8_u + local.set 2 + i32.const 0 + local.set 3 + loop ;; label = @1 + local.get 3 + i32.const 10 + i32.mul + local.get 2 + i32.extend8_s + i32.add + i32.const -48 + i32.add + local.set 3 + local.get 0 + i32.load8_u + local.set 2 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 2 + br_if 0 (;@1;) + end + i32.const 0 + local.get 3 + i32.sub + local.get 3 + local.get 1 + i32.const 45 + i32.eq + select) + (func $ammunition_sprintf_d (type 5) (param i32 i32) (result i32) + (local i32 i64 i64 i32 i64 i32) + i32.const 1 + i32.const 10 + call $__pragma_loopbound + i32.const 0 + local.set 2 + local.get 1 + i64.extend_i32_s + local.tee 3 + local.set 4 + loop ;; label = @1 + local.get 2 + local.tee 5 + i32.const 1 + i32.add + local.set 2 + local.get 4 + i64.const 9 + i64.add + local.set 6 + local.get 4 + i64.const 10 + i64.div_s + local.set 4 + local.get 6 + i64.const 18 + i64.gt_u + br_if 0 (;@1;) + end + local.get 2 + local.set 7 + block ;; label = @1 + local.get 1 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + local.get 0 + i32.const 45 + i32.store8 + local.get 5 + i32.const 2 + i32.add + local.set 7 + end + local.get 0 + local.get 7 + i32.const 255 + i32.and + i32.add + i32.const 0 + i32.store8 + i32.const 1 + i32.const 10 + call $__pragma_loopbound + loop ;; label = @1 + local.get 0 + local.get 7 + i32.const -1 + i32.add + local.tee 7 + i32.const 255 + i32.and + i32.add + local.get 3 + local.get 3 + i64.const 63 + i64.shr_s + local.tee 4 + i64.xor + local.get 4 + i64.sub + i64.const 10 + i64.rem_u + i32.wrap_i64 + i32.const 48 + i32.or + i32.store8 + local.get 3 + i64.const 9 + i64.add + local.set 4 + local.get 3 + i64.const 10 + i64.div_s + local.set 3 + local.get 4 + i64.const 18 + i64.gt_u + br_if 0 (;@1;) + end + local.get 1 + i32.const 31 + i32.shr_u + local.get 2 + i32.extend8_s + i32.add) + (func $ammunition_sprintf_u (type 5) (param i32 i32) (result i32) + (local i32 i64 i64 i32) + i32.const 1 + i32.const 10 + call $__pragma_loopbound + i32.const 0 + local.set 2 + local.get 1 + i64.extend_i32_u + local.tee 3 + local.set 4 + loop ;; label = @1 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 4 + i64.const 9 + i64.gt_u + local.set 1 + local.get 4 + i64.const 10 + i64.div_u + local.set 4 + local.get 1 + br_if 0 (;@1;) + end + local.get 0 + local.get 2 + i32.const 255 + i32.and + i32.add + i32.const 0 + i32.store8 + i32.const 1 + i32.const 10 + call $__pragma_loopbound + local.get 2 + local.set 1 + loop ;; label = @1 + local.get 0 + local.get 1 + i32.const -1 + i32.add + local.tee 1 + i32.const 255 + i32.and + i32.add + local.get 3 + local.get 3 + i64.const 10 + i64.div_u + local.tee 4 + i64.const 10 + i64.mul + i64.sub + i32.wrap_i64 + i32.const 48 + i32.or + i32.store8 + local.get 3 + i64.const 9 + i64.gt_u + local.set 5 + local.get 4 + local.set 3 + local.get 5 + br_if 0 (;@1;) + end + local.get 2 + i32.extend8_s) + (func $ammunition_add_unsigned_integer (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 4 + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 5 + block ;; label = @2 + block ;; label = @3 + local.get 0 + i32.const 1 + i32.ne + br_if 0 (;@3;) + i32.const 0 + local.set 4 + br 1 (;@2;) + end + local.get 1 + i32.const -2 + i32.add + local.set 6 + local.get 2 + i32.const -2 + i32.add + local.set 7 + local.get 3 + i32.const -2 + i32.add + local.set 8 + local.get 0 + i32.const 2147483646 + i32.and + local.set 9 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 8 + local.get 0 + i32.add + local.tee 10 + i32.const 1 + i32.add + local.get 4 + local.get 6 + local.get 0 + i32.add + local.tee 11 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.get 7 + local.get 0 + i32.add + local.tee 4 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.tee 12 + i32.store8 + local.get 10 + local.get 12 + i32.const 255 + i32.gt_u + local.get 11 + i32.load8_u + i32.add + local.get 4 + i32.load8_u + i32.add + local.tee 4 + i32.store8 + local.get 4 + i32.const 255 + i32.gt_u + local.set 4 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 9 + i32.const -2 + i32.add + local.tee 9 + br_if 0 (;@3;) + end + end + local.get 5 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.add + local.get 4 + local.get 1 + local.get 0 + i32.add + i32.load8_u + i32.add + local.get 2 + local.get 0 + i32.add + i32.load8_u + i32.add + local.tee 0 + i32.store8 + local.get 0 + i32.const 255 + i32.gt_u + local.set 4 + end + i32.const 0 + local.get 4 + i32.store offset=1196) + (func $ammunition_add_integer (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 1 + i32.load8_u + local.set 4 + local.get 2 + i32.load8_u + local.set 5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 5 + i32.const 7 + i32.shr_u + local.set 6 + local.get 4 + i32.const 7 + i32.shr_u + local.set 7 + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 8 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 1 + i32.const -2 + i32.add + local.set 9 + local.get 2 + i32.const -2 + i32.add + local.set 10 + local.get 3 + i32.const -2 + i32.add + local.set 11 + local.get 0 + i32.const 2147483646 + i32.and + local.set 4 + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 11 + local.get 0 + i32.add + local.tee 12 + i32.const 1 + i32.add + local.get 5 + local.get 9 + local.get 0 + i32.add + local.tee 13 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 0 + i32.add + local.tee 5 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.tee 14 + i32.store8 + local.get 12 + local.get 14 + i32.const 255 + i32.gt_u + local.get 13 + i32.load8_u + i32.add + local.get 5 + i32.load8_u + i32.add + local.tee 13 + i32.store8 + local.get 13 + i32.const 255 + i32.gt_u + local.set 5 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 4 + i32.const -2 + i32.add + local.tee 4 + br_if 0 (;@3;) + end + local.get 13 + i32.const 255 + i32.gt_u + local.set 4 + end + local.get 8 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.add + local.get 4 + local.get 1 + local.get 0 + i32.add + i32.load8_u + i32.add + local.get 2 + local.get 0 + i32.add + i32.load8_u + i32.add + i32.store8 + end + i32.const 0 + local.set 0 + block ;; label = @1 + local.get 7 + local.get 6 + i32.ne + br_if 0 (;@1;) + local.get 7 + local.get 3 + i32.load8_u + i32.const 7 + i32.shr_u + i32.ne + local.set 0 + end + i32.const 0 + local.get 0 + i32.store offset=1196) + (func $ammunition_subtract_unsigned_integer (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 4 + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 5 + block ;; label = @2 + block ;; label = @3 + local.get 0 + i32.const 1 + i32.ne + br_if 0 (;@3;) + i32.const 0 + local.set 6 + br 1 (;@2;) + end + local.get 1 + i32.const -2 + i32.add + local.set 7 + local.get 2 + i32.const -2 + i32.add + local.set 8 + local.get 3 + i32.const -2 + i32.add + local.set 9 + local.get 0 + i32.const 2147483646 + i32.and + local.set 10 + i32.const 0 + local.set 6 + loop ;; label = @3 + local.get 9 + local.get 0 + i32.add + local.tee 11 + i32.const 1 + i32.add + local.get 6 + local.get 7 + local.get 0 + i32.add + local.tee 4 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.get 8 + local.get 0 + i32.add + local.tee 6 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 12 + i32.store8 + local.get 11 + local.get 12 + i32.const 31 + i32.shr_s + local.get 4 + i32.load8_u + i32.add + local.get 6 + i32.load8_u + i32.sub + local.tee 4 + i32.store8 + local.get 4 + i32.const 31 + i32.shr_s + local.set 6 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + br_if 0 (;@3;) + end + end + block ;; label = @2 + local.get 5 + i32.eqz + br_if 0 (;@2;) + local.get 3 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.add + local.get 6 + local.get 1 + local.get 0 + i32.add + i32.load8_u + i32.add + local.get 2 + local.get 0 + i32.add + i32.load8_u + i32.sub + local.tee 4 + i32.store8 + end + local.get 4 + i32.const 31 + i32.shr_u + local.set 4 + end + i32.const 0 + local.get 4 + i32.store offset=1196) + (func $ammunition_subtract_integer (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 1 + i32.load8_u + local.set 4 + local.get 2 + i32.load8_u + local.set 5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 5 + i32.const 7 + i32.shr_u + local.set 6 + local.get 4 + i32.const 7 + i32.shr_u + local.set 7 + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 8 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 1 + i32.const -2 + i32.add + local.set 9 + local.get 2 + i32.const -2 + i32.add + local.set 10 + local.get 3 + i32.const -2 + i32.add + local.set 11 + local.get 0 + i32.const 2147483646 + i32.and + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 11 + local.get 0 + i32.add + local.tee 12 + i32.const 1 + i32.add + local.get 4 + local.get 9 + local.get 0 + i32.add + local.tee 13 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 0 + i32.add + local.tee 4 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 14 + i32.store8 + local.get 12 + local.get 14 + i32.const 31 + i32.shr_s + local.get 13 + i32.load8_u + i32.add + local.get 4 + i32.load8_u + i32.sub + local.tee 4 + i32.store8 + local.get 4 + i32.const 31 + i32.shr_s + local.set 4 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 5 + i32.const -2 + i32.add + local.tee 5 + br_if 0 (;@3;) + end + end + local.get 8 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.add + local.get 4 + local.get 1 + local.get 0 + i32.add + i32.load8_u + i32.add + local.get 2 + local.get 0 + i32.add + i32.load8_u + i32.sub + i32.store8 + end + i32.const 0 + local.set 0 + block ;; label = @1 + local.get 7 + local.get 6 + i32.eq + br_if 0 (;@1;) + local.get 7 + local.get 3 + i32.load8_u + i32.const 7 + i32.shr_u + i32.ne + local.set 0 + end + i32.const 0 + local.get 0 + i32.store offset=1196) + (func $ammunition_multiply_unsigned_integer_without_overflow_reaction (type 7) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 256 + i32.sub + local.tee 4 + global.set $__stack_pointer + i32.const 0 + local.set 5 + local.get 4 + local.get 0 + i32.add + local.tee 6 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const -2 + i32.add + local.set 7 + local.get 0 + i32.const 2147483646 + i32.and + local.set 8 + local.get 0 + i32.const 1 + i32.and + local.set 9 + local.get 0 + i32.const 1 + i32.shl + local.get 4 + i32.add + i32.const -2 + i32.add + local.set 10 + local.get 0 + i32.const -1 + i32.add + local.tee 11 + local.set 12 + loop ;; label = @3 + i32.const 0 + local.set 5 + block ;; label = @4 + local.get 2 + local.get 12 + i32.add + local.tee 13 + i32.load8_u + i32.eqz + br_if 0 (;@4;) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 13 + i32.load8_u + local.set 14 + i32.const 0 + local.set 5 + block ;; label = @5 + block ;; label = @6 + local.get 11 + br_if 0 (;@6;) + local.get 11 + local.set 13 + br 1 (;@5;) + end + local.get 8 + local.set 15 + local.get 10 + local.set 13 + local.get 7 + local.set 16 + loop ;; label = @6 + local.get 13 + i32.const 1 + i32.add + local.tee 17 + local.get 5 + local.get 17 + i32.load8_u + i32.add + local.get 14 + local.get 1 + local.get 16 + i32.add + local.tee 5 + i32.const 1 + i32.add + i32.load8_u + i32.mul + i32.add + local.tee 17 + i32.store8 + local.get 13 + local.get 17 + i32.const 8 + i32.shr_u + local.get 13 + i32.load8_u + i32.add + local.get 14 + local.get 5 + i32.load8_u + i32.mul + i32.add + local.tee 5 + i32.store8 + local.get 5 + i32.const 8 + i32.shr_u + local.set 5 + local.get 13 + i32.const -2 + i32.add + local.set 13 + local.get 16 + i32.const -2 + i32.add + local.set 16 + local.get 15 + i32.const -2 + i32.add + local.tee 15 + br_if 0 (;@6;) + end + local.get 16 + i32.const 1 + i32.add + local.set 13 + end + local.get 9 + i32.eqz + br_if 0 (;@4;) + local.get 4 + local.get 12 + i32.const 1 + i32.add + local.get 13 + i32.add + i32.add + local.tee 16 + local.get 5 + local.get 16 + i32.load8_u + i32.add + local.get 14 + local.get 1 + local.get 13 + i32.add + i32.load8_u + i32.mul + i32.add + local.tee 13 + i32.store8 + local.get 13 + i32.const 8 + i32.shr_u + local.set 5 + end + local.get 4 + local.get 12 + i32.add + local.get 5 + i32.store8 + local.get 10 + i32.const -1 + i32.add + local.set 10 + local.get 12 + i32.const 0 + i32.gt_s + local.set 13 + local.get 12 + i32.const -1 + i32.add + local.set 12 + local.get 13 + br_if 0 (;@3;) + end + i32.const 0 + local.set 5 + i32.const 0 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 4 + i32.const -1 + i32.add + local.set 16 + local.get 0 + local.set 13 + block ;; label = @3 + loop ;; label = @4 + local.get 16 + local.get 13 + i32.add + i32.load8_u + br_if 1 (;@3;) + local.get 13 + i32.const -1 + i32.add + local.tee 13 + i32.const 1 + i32.lt_s + br_if 3 (;@1;) + br 0 (;@4;) + end + end + i32.const 1 + local.set 5 + br 1 (;@1;) + end + i32.const 0 + i32.const 4 + call $__pragma_loopbound + end + local.get 3 + local.get 6 + local.get 0 + call $ammunition_memcpy + drop + local.get 4 + i32.const 256 + i32.add + global.set $__stack_pointer + local.get 5) + (func $ammunition_multiply_unsigned_integer (type 6) (param i32 i32 i32 i32) + i32.const 0 + local.get 0 + local.get 1 + local.get 2 + local.get 3 + call $ammunition_multiply_unsigned_integer_without_overflow_reaction + i32.store offset=1196) + (func $ammunition_multiply_integer (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 256 + i32.sub + local.tee 4 + global.set $__stack_pointer + local.get 2 + i32.load8_u + local.tee 5 + local.get 1 + i32.load8_s + local.tee 6 + i32.xor + local.set 7 + block ;; label = @1 + local.get 6 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 2 + i32.const 6 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.and + local.set 8 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + block ;; label = @3 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@3;) + local.get 1 + i32.const -2 + i32.add + local.set 9 + local.get 0 + i32.const 2147483646 + i32.and + local.set 10 + local.get 4 + i32.const 128 + i32.add + i32.const -2 + i32.add + local.set 11 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + loop ;; label = @4 + local.get 11 + local.get 5 + i32.add + local.tee 12 + i32.const 1 + i32.add + local.get 6 + local.get 9 + local.get 5 + i32.add + local.tee 13 + i32.const 1 + i32.add + i32.load8_u + local.tee 14 + i32.sub + i32.const 0 + local.get 6 + local.get 14 + i32.ne + local.tee 6 + select + i32.store8 + local.get 12 + i32.const -1 + i32.const 0 + local.get 6 + select + local.tee 6 + local.get 13 + i32.load8_u + local.tee 13 + i32.sub + i32.const 0 + local.get 6 + local.get 13 + i32.ne + local.tee 6 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 6 + select + local.set 6 + local.get 5 + i32.const -2 + i32.add + local.set 5 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + br_if 0 (;@4;) + end + end + local.get 8 + i32.eqz + br_if 0 (;@2;) + local.get 4 + i32.const 128 + i32.add + local.get 5 + i32.const -1 + i32.add + local.tee 5 + i32.add + i32.const 0 + local.get 6 + local.get 1 + local.get 5 + i32.add + i32.load8_u + local.tee 5 + i32.sub + local.get 6 + local.get 5 + i32.eq + select + i32.store8 + end + local.get 2 + i32.load8_u + local.set 5 + local.get 4 + i32.const 128 + i32.add + local.set 1 + end + local.get 7 + i32.extend8_s + local.set 7 + block ;; label = @1 + block ;; label = @2 + local.get 5 + i32.extend8_s + i32.const -1 + i32.le_s + br_if 0 (;@2;) + local.get 2 + local.set 8 + br 1 (;@1;) + end + i32.const 2 + i32.const 6 + call $__pragma_loopbound + local.get 4 + local.set 8 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 15 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 2 + i32.const -2 + i32.add + local.set 9 + local.get 0 + i32.const 2147483646 + i32.and + local.set 10 + local.get 4 + i32.const -2 + i32.add + local.set 11 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + loop ;; label = @3 + local.get 11 + local.get 5 + i32.add + local.tee 12 + i32.const 1 + i32.add + local.get 6 + local.get 9 + local.get 5 + i32.add + local.tee 13 + i32.const 1 + i32.add + i32.load8_u + local.tee 14 + i32.sub + i32.const 0 + local.get 6 + local.get 14 + i32.ne + local.tee 6 + select + i32.store8 + local.get 12 + i32.const -1 + i32.const 0 + local.get 6 + select + local.tee 6 + local.get 13 + i32.load8_u + local.tee 13 + i32.sub + i32.const 0 + local.get 6 + local.get 13 + i32.ne + local.tee 6 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 6 + select + local.set 6 + local.get 5 + i32.const -2 + i32.add + local.set 5 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + br_if 0 (;@3;) + end + end + local.get 15 + i32.eqz + br_if 0 (;@1;) + local.get 4 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + i32.add + i32.const 0 + local.get 6 + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.tee 5 + i32.sub + local.get 6 + local.get 5 + i32.eq + select + i32.store8 + end + i32.const 0 + local.get 0 + local.get 1 + local.get 8 + local.get 3 + call $ammunition_multiply_unsigned_integer_without_overflow_reaction + i32.store offset=1196 + local.get 3 + i32.load8_s + local.set 13 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 7 + i32.const -1 + i32.gt_s + br_if 0 (;@5;) + i32.const 2 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@4;) + local.get 0 + i32.const 1 + i32.and + local.set 14 + i32.const 0 + local.set 5 + block ;; label = @6 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@6;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 5 + loop ;; label = @7 + local.get 3 + local.get 0 + i32.add + local.tee 10 + i32.const -1 + i32.add + local.tee 12 + local.get 5 + local.get 12 + i32.load8_u + local.tee 12 + i32.sub + i32.const 0 + local.get 5 + local.get 12 + i32.ne + local.tee 5 + select + i32.store8 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + i32.const -1 + i32.const 0 + local.get 5 + select + local.tee 5 + local.get 10 + i32.load8_u + local.tee 10 + i32.sub + i32.const 0 + local.get 5 + local.get 10 + i32.ne + local.tee 5 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 5 + select + local.set 5 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 6 + i32.const -2 + i32.add + local.tee 6 + br_if 0 (;@7;) + end + end + block ;; label = @6 + local.get 14 + i32.eqz + br_if 0 (;@6;) + local.get 3 + local.get 0 + i32.add + i32.const -1 + i32.add + local.tee 0 + i32.const 0 + local.get 5 + local.get 0 + i32.load8_u + local.tee 0 + i32.sub + local.get 5 + local.get 0 + i32.eq + select + i32.store8 + end + local.get 13 + i32.const -1 + i32.le_s + br_if 2 (;@3;) + br 4 (;@1;) + end + local.get 13 + i32.const -1 + i32.le_s + br_if 2 (;@2;) + br 3 (;@1;) + end + local.get 13 + i32.const -1 + i32.gt_s + br_if 2 (;@1;) + end + local.get 3 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 1 (;@1;) + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + local.get 4 + i32.const 256 + i32.add + global.set $__stack_pointer) + (func $ammunition_divide_unsigned_integer_without_overflow_reaction (type 7) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i64 i64 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64) + global.get $__stack_pointer + i32.const 416 + i32.sub + local.tee 4 + global.set $__stack_pointer + i32.const 3 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 5 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + loop ;; label = @5 + local.get 2 + local.get 5 + i32.add + i32.load8_u + br_if 1 (;@4;) + local.get 0 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@5;) + br 2 (;@3;) + end + end + local.get 0 + local.get 5 + i32.eq + br_if 0 (;@3;) + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.set 6 + local.get 0 + i32.const -1 + i32.add + local.tee 7 + local.get 5 + i32.ne + br_if 1 (;@2;) + local.get 3 + local.get 1 + local.get 0 + call $ammunition_memcpy + drop + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 5 + local.get 0 + i32.const 1 + i32.lt_s + br_if 2 (;@1;) + local.get 6 + i64.extend_i32_u + i64.const 255 + i64.and + local.set 8 + i64.const 0 + local.set 9 + loop ;; label = @4 + local.get 3 + local.get 9 + i64.const 8 + i64.shl + local.get 3 + i64.load8_u + i64.or + local.tee 9 + local.get 8 + i64.div_u + local.tee 10 + i64.store8 + local.get 9 + local.get 10 + local.get 8 + i64.mul + i64.sub + local.set 9 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + br_if 0 (;@4;) + br 3 (;@1;) + end + end + local.get 3 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + i32.const 1 + local.set 5 + br 1 (;@1;) + end + local.get 4 + i32.const 272 + i32.add + i32.const 1 + i32.or + local.get 1 + local.get 0 + call $ammunition_memcpy + drop + i32.const 0 + local.set 11 + local.get 4 + i32.const 0 + i32.store8 offset=272 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 256 + local.get 6 + i32.const 255 + i32.and + i32.const 1 + i32.add + i32.div_u + local.set 1 + block ;; label = @2 + local.get 0 + i32.const 0 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.add + local.tee 6 + i32.const 3 + i32.and + local.set 12 + block ;; label = @3 + local.get 0 + i32.const 3 + i32.lt_u + br_if 0 (;@3;) + local.get 0 + i32.const -3 + i32.add + local.set 13 + local.get 6 + i32.const -4 + i32.and + local.set 14 + i32.const 0 + local.set 11 + loop ;; label = @4 + local.get 4 + i32.const 272 + i32.add + local.get 13 + i32.add + local.tee 6 + i32.const 3 + i32.add + local.tee 15 + local.get 15 + i32.load8_u + local.get 1 + i32.mul + local.get 11 + i32.add + local.tee 11 + i32.store8 + local.get 6 + i32.const 2 + i32.add + local.tee 15 + local.get 15 + i32.load8_u + local.get 1 + i32.mul + local.get 11 + i32.const 8 + i32.shr_u + i32.add + local.tee 11 + i32.store8 + local.get 6 + i32.const 1 + i32.add + local.tee 15 + local.get 15 + i32.load8_u + local.get 1 + i32.mul + local.get 11 + i32.const 8 + i32.shr_u + i32.add + local.tee 11 + i32.store8 + local.get 6 + local.get 6 + i32.load8_u + local.get 1 + i32.mul + local.get 11 + i32.const 8 + i32.shr_u + i32.add + local.tee 11 + i32.store8 + local.get 11 + i32.const 8 + i32.shr_u + local.set 11 + local.get 13 + i32.const -4 + i32.add + local.set 13 + local.get 14 + i32.const -4 + i32.add + local.tee 14 + br_if 0 (;@4;) + end + local.get 13 + i32.const 4 + i32.add + local.set 6 + end + local.get 12 + i32.eqz + br_if 0 (;@2;) + local.get 6 + local.get 4 + i32.const 272 + i32.add + i32.add + i32.const -1 + i32.add + local.set 6 + loop ;; label = @3 + local.get 6 + local.get 6 + i32.load8_u + local.get 1 + i32.mul + local.get 11 + i32.add + local.tee 11 + i32.store8 + local.get 6 + i32.const -1 + i32.add + local.set 6 + local.get 11 + i32.const 8 + i32.shr_u + local.set 11 + local.get 12 + i32.const -1 + i32.add + local.tee 12 + br_if 0 (;@3;) + end + end + local.get 4 + i32.const 144 + i32.add + local.get 2 + local.get 0 + call $ammunition_memcpy + drop + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 3 + i32.and + local.set 13 + i32.const 0 + local.set 6 + local.get 0 + local.set 11 + block ;; label = @3 + local.get 0 + i32.const 4 + i32.lt_u + br_if 0 (;@3;) + local.get 0 + i32.const 2147483644 + i32.and + local.set 12 + local.get 4 + i32.const 144 + i32.add + i32.const -4 + i32.add + local.set 15 + i32.const 0 + local.set 6 + local.get 0 + local.set 11 + loop ;; label = @4 + local.get 15 + local.get 11 + i32.add + local.tee 2 + i32.const 3 + i32.add + local.tee 14 + local.get 14 + i32.load8_u + local.get 1 + i32.mul + local.get 6 + i32.add + local.tee 6 + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.tee 14 + local.get 14 + i32.load8_u + local.get 1 + i32.mul + local.get 6 + i32.const 8 + i32.shr_u + i32.add + local.tee 6 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.tee 14 + local.get 14 + i32.load8_u + local.get 1 + i32.mul + local.get 6 + i32.const 8 + i32.shr_u + i32.add + local.tee 6 + i32.store8 + local.get 2 + local.get 2 + i32.load8_u + local.get 1 + i32.mul + local.get 6 + i32.const 8 + i32.shr_u + i32.add + local.tee 6 + i32.store8 + local.get 6 + i32.const 8 + i32.shr_u + local.set 6 + local.get 11 + i32.const -4 + i32.add + local.set 11 + local.get 12 + i32.const -4 + i32.add + local.tee 12 + br_if 0 (;@4;) + end + end + local.get 13 + i32.eqz + br_if 0 (;@2;) + local.get 11 + local.get 4 + i32.const 144 + i32.add + i32.add + i32.const -1 + i32.add + local.set 2 + loop ;; label = @3 + local.get 2 + local.get 2 + i32.load8_u + local.get 1 + i32.mul + local.get 6 + i32.add + local.tee 6 + i32.store8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 6 + i32.const 8 + i32.shr_u + local.set 6 + local.get 13 + i32.const -1 + i32.add + local.tee 13 + br_if 0 (;@3;) + end + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 0 + local.get 5 + i32.sub + local.set 15 + local.get 3 + local.get 7 + local.get 5 + i32.sub + local.tee 16 + i32.add + local.set 17 + local.get 4 + i32.const 144 + i32.add + local.get 5 + i32.const 1 + i32.add + local.tee 18 + i32.add + local.set 19 + local.get 4 + i32.const 1 + i32.or + local.set 20 + local.get 4 + i32.const 144 + i32.add + local.get 5 + i32.add + local.set 7 + i32.const 0 + local.set 12 + loop ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 4 + i32.const 272 + i32.add + local.get 12 + local.tee 14 + i32.add + local.tee 11 + i32.load8_u + local.tee 5 + local.get 7 + i32.load8_u + local.tee 0 + i32.ne + br_if 0 (;@4;) + local.get 14 + i32.const 1 + i32.add + local.set 12 + i32.const 255 + local.set 1 + br 1 (;@3;) + end + local.get 5 + i32.const 8 + i32.shl + local.get 4 + i32.const 272 + i32.add + local.get 14 + i32.const 1 + i32.add + local.tee 12 + i32.add + i32.load8_u + i32.or + local.get 0 + i32.div_u + local.set 1 + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 1 + local.get 19 + i32.load8_u + local.tee 2 + i32.mul + local.set 5 + local.get 1 + local.get 7 + i32.load8_u + local.tee 6 + i32.mul + local.set 0 + local.get 11 + i64.load8_u + i64.const 8 + i64.shl + local.get 4 + i32.const 272 + i32.add + local.get 12 + i32.add + i64.load8_u + i64.or + local.set 10 + local.get 14 + local.get 4 + i32.const 272 + i32.add + i32.add + i32.const 2 + i32.add + i64.load8_u + local.set 21 + loop ;; label = @3 + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 0 + i64.extend_i32_u + local.set 8 + local.get 5 + i64.extend_i32_u + local.set 9 + local.get 5 + local.get 2 + i32.sub + local.set 5 + local.get 0 + local.get 6 + i32.sub + local.set 0 + local.get 10 + local.get 8 + i64.sub + i64.const 8 + i64.shl + local.get 21 + i64.or + local.get 9 + i64.lt_u + br_if 0 (;@3;) + end + local.get 20 + local.get 7 + local.get 15 + call $ammunition_memcpy + drop + local.get 4 + i32.const 0 + i32.store8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + i32.const 1 + i32.add + local.set 13 + block ;; label = @3 + block ;; label = @4 + local.get 15 + i32.const 0 + i32.lt_s + br_if 0 (;@4;) + i32.const 0 + local.set 0 + local.get 15 + local.set 5 + loop ;; label = @5 + local.get 4 + local.get 5 + i32.add + local.tee 2 + local.get 13 + local.get 2 + i32.load8_u + i32.mul + local.get 0 + i32.add + local.tee 0 + i32.store8 + local.get 0 + i32.const 8 + i32.shr_u + local.set 0 + local.get 5 + i32.const 1 + i32.add + local.set 2 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 2 + i32.const 1 + i32.gt_u + br_if 0 (;@5;) + end + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 0 + local.get 15 + local.set 5 + loop ;; label = @5 + local.get 11 + local.get 5 + i32.add + local.tee 2 + local.get 0 + local.get 2 + i32.load8_u + i32.add + local.get 4 + local.get 5 + i32.add + i32.load8_u + i32.sub + local.tee 2 + i32.store8 + local.get 2 + i32.const 31 + i32.shr_s + local.set 0 + local.get 5 + i32.const 1 + i32.add + local.set 6 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 6 + i32.const 1 + i32.gt_u + br_if 0 (;@5;) + end + local.get 2 + i32.const -1 + i32.gt_s + br_if 1 (;@3;) + local.get 20 + local.get 7 + local.get 15 + call $ammunition_memcpy + drop + i32.const 0 + local.set 0 + local.get 4 + i32.const 0 + i32.store8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 15 + local.set 5 + loop ;; label = @5 + local.get 11 + local.get 5 + i32.add + local.tee 2 + local.get 0 + local.get 2 + i32.load8_u + i32.add + local.get 4 + local.get 5 + i32.add + i32.load8_u + i32.add + local.tee 0 + i32.store8 + local.get 0 + i32.const 255 + i32.gt_u + local.set 0 + local.get 5 + i32.const 1 + i32.add + local.set 2 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 2 + i32.const 1 + i32.gt_u + br_if 0 (;@5;) + end + local.get 1 + local.set 13 + br 1 (;@3;) + end + i32.const 4 + i32.const 4 + call $__pragma_loopbound + end + local.get 17 + local.get 14 + i32.add + local.get 13 + i32.store8 + local.get 12 + local.get 18 + i32.ne + br_if 0 (;@2;) + end + i32.const 0 + local.set 5 + local.get 3 + i32.const 0 + local.get 16 + call $ammunition_memset + drop + end + local.get 4 + i32.const 416 + i32.add + global.set $__stack_pointer + local.get 5) + (func $ammunition_divide_unsigned_integer (type 6) (param i32 i32 i32 i32) + i32.const 0 + local.get 0 + local.get 1 + local.get 2 + local.get 3 + call $ammunition_divide_unsigned_integer_without_overflow_reaction + i32.store offset=1196) + (func $ammunition_divide_integer (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 256 + i32.sub + local.tee 4 + global.set $__stack_pointer + local.get 2 + i32.load8_u + local.tee 5 + local.get 1 + i32.load8_s + local.tee 6 + i32.xor + local.set 7 + block ;; label = @1 + local.get 6 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 2 + i32.const 6 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.and + local.set 8 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + block ;; label = @3 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@3;) + local.get 1 + i32.const -2 + i32.add + local.set 9 + local.get 0 + i32.const 2147483646 + i32.and + local.set 10 + local.get 4 + i32.const 128 + i32.add + i32.const -2 + i32.add + local.set 11 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + loop ;; label = @4 + local.get 11 + local.get 5 + i32.add + local.tee 12 + i32.const 1 + i32.add + local.get 6 + local.get 9 + local.get 5 + i32.add + local.tee 13 + i32.const 1 + i32.add + i32.load8_u + local.tee 14 + i32.sub + i32.const 0 + local.get 6 + local.get 14 + i32.ne + local.tee 6 + select + i32.store8 + local.get 12 + i32.const -1 + i32.const 0 + local.get 6 + select + local.tee 6 + local.get 13 + i32.load8_u + local.tee 13 + i32.sub + i32.const 0 + local.get 6 + local.get 13 + i32.ne + local.tee 6 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 6 + select + local.set 6 + local.get 5 + i32.const -2 + i32.add + local.set 5 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + br_if 0 (;@4;) + end + end + local.get 8 + i32.eqz + br_if 0 (;@2;) + local.get 4 + i32.const 128 + i32.add + local.get 5 + i32.const -1 + i32.add + local.tee 5 + i32.add + i32.const 0 + local.get 6 + local.get 1 + local.get 5 + i32.add + i32.load8_u + local.tee 5 + i32.sub + local.get 6 + local.get 5 + i32.eq + select + i32.store8 + end + local.get 2 + i32.load8_u + local.set 5 + local.get 4 + i32.const 128 + i32.add + local.set 1 + end + local.get 7 + i32.extend8_s + local.set 7 + block ;; label = @1 + block ;; label = @2 + local.get 5 + i32.extend8_s + i32.const -1 + i32.le_s + br_if 0 (;@2;) + local.get 2 + local.set 8 + br 1 (;@1;) + end + i32.const 2 + i32.const 6 + call $__pragma_loopbound + local.get 4 + local.set 8 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 15 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 2 + i32.const -2 + i32.add + local.set 9 + local.get 0 + i32.const 2147483646 + i32.and + local.set 10 + local.get 4 + i32.const -2 + i32.add + local.set 11 + i32.const 0 + local.set 6 + local.get 0 + local.set 5 + loop ;; label = @3 + local.get 11 + local.get 5 + i32.add + local.tee 12 + i32.const 1 + i32.add + local.get 6 + local.get 9 + local.get 5 + i32.add + local.tee 13 + i32.const 1 + i32.add + i32.load8_u + local.tee 14 + i32.sub + i32.const 0 + local.get 6 + local.get 14 + i32.ne + local.tee 6 + select + i32.store8 + local.get 12 + i32.const -1 + i32.const 0 + local.get 6 + select + local.tee 6 + local.get 13 + i32.load8_u + local.tee 13 + i32.sub + i32.const 0 + local.get 6 + local.get 13 + i32.ne + local.tee 6 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 6 + select + local.set 6 + local.get 5 + i32.const -2 + i32.add + local.set 5 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + br_if 0 (;@3;) + end + end + local.get 15 + i32.eqz + br_if 0 (;@1;) + local.get 4 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + i32.add + i32.const 0 + local.get 6 + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.tee 5 + i32.sub + local.get 6 + local.get 5 + i32.eq + select + i32.store8 + end + i32.const 0 + local.get 0 + local.get 1 + local.get 8 + local.get 3 + call $ammunition_divide_unsigned_integer_without_overflow_reaction + i32.store offset=1196 + local.get 3 + i32.load8_s + local.set 13 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 7 + i32.const -1 + i32.gt_s + br_if 0 (;@5;) + i32.const 2 + i32.const 6 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@4;) + local.get 0 + i32.const 1 + i32.and + local.set 14 + i32.const 0 + local.set 5 + block ;; label = @6 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@6;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 5 + loop ;; label = @7 + local.get 3 + local.get 0 + i32.add + local.tee 10 + i32.const -1 + i32.add + local.tee 12 + local.get 5 + local.get 12 + i32.load8_u + local.tee 12 + i32.sub + i32.const 0 + local.get 5 + local.get 12 + i32.ne + local.tee 5 + select + i32.store8 + local.get 10 + i32.const -2 + i32.add + local.tee 10 + i32.const -1 + i32.const 0 + local.get 5 + select + local.tee 5 + local.get 10 + i32.load8_u + local.tee 10 + i32.sub + i32.const 0 + local.get 5 + local.get 10 + i32.ne + local.tee 5 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 5 + select + local.set 5 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 6 + i32.const -2 + i32.add + local.tee 6 + br_if 0 (;@7;) + end + end + block ;; label = @6 + local.get 14 + i32.eqz + br_if 0 (;@6;) + local.get 3 + local.get 0 + i32.add + i32.const -1 + i32.add + local.tee 0 + i32.const 0 + local.get 5 + local.get 0 + i32.load8_u + local.tee 0 + i32.sub + local.get 5 + local.get 0 + i32.eq + select + i32.store8 + end + local.get 13 + i32.const -1 + i32.le_s + br_if 2 (;@3;) + br 4 (;@1;) + end + local.get 13 + i32.const -1 + i32.le_s + br_if 2 (;@2;) + br 3 (;@1;) + end + local.get 13 + i32.const -1 + i32.gt_s + br_if 2 (;@1;) + end + local.get 3 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 1 (;@1;) + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + local.get 4 + i32.const 256 + i32.add + global.set $__stack_pointer) + (func $ammunition_unsigned_integer_remainder (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 128 + i32.sub + local.tee 4 + global.set $__stack_pointer + i32.const 0 + local.set 5 + i32.const 0 + local.get 0 + local.get 1 + local.get 2 + local.get 4 + call $ammunition_divide_unsigned_integer_without_overflow_reaction + local.tee 6 + i32.store offset=1196 + block ;; label = @1 + block ;; label = @2 + local.get 6 + i32.eqz + br_if 0 (;@2;) + local.get 3 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + br 1 (;@1;) + end + i32.const 0 + local.get 0 + local.get 4 + local.get 2 + local.get 4 + call $ammunition_multiply_unsigned_integer_without_overflow_reaction + i32.store offset=1196 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.and + local.set 7 + block ;; label = @3 + block ;; label = @4 + local.get 0 + i32.const 1 + i32.ne + br_if 0 (;@4;) + i32.const 0 + local.set 6 + br 1 (;@3;) + end + local.get 1 + i32.const -2 + i32.add + local.set 8 + local.get 3 + i32.const -2 + i32.add + local.set 9 + local.get 0 + i32.const 2147483646 + i32.and + local.set 5 + local.get 4 + i32.const -2 + i32.add + local.set 10 + i32.const 0 + local.set 6 + loop ;; label = @4 + local.get 9 + local.get 0 + i32.add + local.tee 11 + i32.const 1 + i32.add + local.get 6 + local.get 8 + local.get 0 + i32.add + local.tee 2 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 0 + i32.add + local.tee 6 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 12 + i32.store8 + local.get 11 + local.get 12 + i32.const 31 + i32.shr_s + local.get 2 + i32.load8_u + i32.add + local.get 6 + i32.load8_u + i32.sub + local.tee 2 + i32.store8 + local.get 2 + i32.const 31 + i32.shr_s + local.set 6 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 5 + i32.const -2 + i32.add + local.tee 5 + br_if 0 (;@4;) + end + end + block ;; label = @3 + local.get 7 + i32.eqz + br_if 0 (;@3;) + local.get 3 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.add + local.get 6 + local.get 1 + local.get 0 + i32.add + i32.load8_u + i32.add + local.get 4 + local.get 0 + i32.add + i32.load8_u + i32.sub + local.tee 2 + i32.store8 + end + local.get 2 + i32.const 31 + i32.shr_u + local.set 5 + end + i32.const 0 + local.get 5 + i32.store offset=1196 + end + local.get 4 + i32.const 128 + i32.add + global.set $__stack_pointer) + (func $ammunition_unsigned_integer_shift_right (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 2 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.const 0 + local.get 2 + i32.sub + local.get 3 + call $ammunition_unsigned_integer_shift_left + return + end + i32.const 0 + i32.const 0 + i32.store offset=1196 + i32.const 0 + i32.const 2 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + local.get 2 + i32.const 3 + i32.shr_u + local.tee 4 + i32.sub + local.tee 5 + i32.const 0 + local.get 0 + local.get 4 + i32.gt_s + local.tee 6 + select + local.tee 7 + local.get 0 + i32.ge_s + br_if 0 (;@1;) + block ;; label = @2 + loop ;; label = @3 + local.get 1 + local.get 7 + i32.add + i32.load8_u + br_if 1 (;@2;) + local.get 7 + i32.const 1 + i32.add + local.tee 7 + local.get 0 + i32.ge_s + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + block ;; label = @1 + local.get 6 + br_if 0 (;@1;) + local.get 3 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + return + end + local.get 3 + local.get 4 + i32.add + local.get 1 + local.get 5 + call $ammunition_memmove + drop + i32.const 0 + local.set 1 + local.get 3 + i32.const 0 + local.get 4 + call $ammunition_memset + drop + block ;; label = @1 + local.get 2 + i32.const 7 + i32.and + local.tee 2 + i32.eqz + br_if 0 (;@1;) + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 5 + i32.const 1 + i32.and + local.set 8 + i32.const 8 + local.get 2 + i32.sub + local.set 6 + block ;; label = @2 + local.get 4 + local.get 0 + i32.const -1 + i32.add + i32.eq + br_if 0 (;@2;) + local.get 5 + i32.const -2 + i32.and + local.set 0 + i32.const 0 + local.set 1 + loop ;; label = @3 + local.get 3 + local.get 4 + i32.add + local.tee 7 + local.get 7 + i32.load8_u + local.tee 5 + local.get 2 + i32.shr_u + local.get 1 + i32.or + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + local.get 7 + i32.load8_u + local.tee 7 + local.get 2 + i32.shr_u + local.get 5 + local.get 6 + i32.shl + i32.or + i32.store8 + local.get 4 + i32.const 2 + i32.add + local.set 4 + local.get 7 + local.get 6 + i32.shl + i32.const 254 + i32.and + local.set 1 + local.get 0 + i32.const -2 + i32.add + local.tee 0 + br_if 0 (;@3;) + end + end + block ;; label = @2 + local.get 8 + i32.eqz + br_if 0 (;@2;) + local.get 3 + local.get 4 + i32.add + local.tee 7 + local.get 7 + i32.load8_u + local.tee 7 + local.get 2 + i32.shr_u + local.get 1 + i32.or + i32.store8 + local.get 7 + local.get 6 + i32.shl + i32.const 254 + i32.and + local.set 1 + end + local.get 1 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=1196 + end) + (func $ammunition_unsigned_integer_shift_left (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 2 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.const 0 + local.get 2 + i32.sub + local.get 3 + call $ammunition_unsigned_integer_shift_right + return + end + i32.const 0 + i32.const 0 + i32.store offset=1196 + i32.const 0 + i32.const 2 + call $__pragma_loopbound + local.get 2 + i32.const 3 + i32.shr_u + local.set 4 + block ;; label = @1 + local.get 2 + i32.const 8 + i32.lt_u + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const -1 + i32.add + local.tee 5 + local.get 4 + i32.const -1 + i32.add + local.tee 6 + local.get 5 + local.get 6 + i32.lt_u + select + i32.const 1 + i32.add + local.set 6 + local.get 1 + local.set 5 + block ;; label = @2 + loop ;; label = @3 + local.get 5 + i32.load8_u + br_if 1 (;@2;) + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + i32.eqz + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + block ;; label = @1 + local.get 4 + local.get 0 + i32.lt_s + br_if 0 (;@1;) + local.get 3 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + return + end + local.get 3 + local.get 1 + local.get 4 + i32.add + local.get 0 + local.get 4 + i32.sub + local.tee 1 + call $ammunition_memmove + drop + local.get 3 + local.get 1 + i32.add + i32.const 0 + local.get 4 + call $ammunition_memset + drop + block ;; label = @1 + local.get 2 + i32.const 7 + i32.and + local.tee 5 + i32.eqz + br_if 0 (;@1;) + i32.const 2 + i32.const 3 + call $__pragma_loopbound + local.get 1 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 1 + i32.const 3 + i32.and + local.set 7 + i32.const 8 + local.get 5 + i32.sub + local.set 6 + block ;; label = @2 + block ;; label = @3 + local.get 4 + local.get 0 + i32.sub + i32.const -4 + i32.le_u + br_if 0 (;@3;) + i32.const 0 + local.set 0 + br 1 (;@2;) + end + local.get 3 + i32.const -4 + i32.add + local.set 8 + local.get 1 + i32.const 2147483644 + i32.and + local.set 4 + i32.const 0 + local.set 0 + loop ;; label = @3 + local.get 8 + local.get 1 + i32.add + local.tee 2 + i32.const 3 + i32.add + local.tee 9 + local.get 9 + i32.load8_u + local.tee 9 + local.get 5 + i32.shl + local.get 0 + i32.or + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.tee 0 + local.get 0 + i32.load8_u + local.tee 0 + local.get 5 + i32.shl + local.get 9 + local.get 6 + i32.shr_u + i32.or + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.tee 9 + local.get 9 + i32.load8_u + local.tee 9 + local.get 5 + i32.shl + local.get 0 + local.get 6 + i32.shr_u + i32.or + i32.store8 + local.get 2 + local.get 2 + i32.load8_u + local.tee 0 + local.get 5 + i32.shl + local.get 9 + local.get 6 + i32.shr_u + i32.or + i32.store8 + local.get 1 + i32.const -4 + i32.add + local.set 1 + local.get 0 + local.get 6 + i32.shr_u + local.set 0 + local.get 4 + i32.const -4 + i32.add + local.tee 4 + br_if 0 (;@3;) + end + end + block ;; label = @2 + local.get 7 + i32.eqz + br_if 0 (;@2;) + local.get 1 + local.get 3 + i32.add + i32.const -1 + i32.add + local.set 2 + loop ;; label = @3 + local.get 2 + local.get 2 + i32.load8_u + local.tee 1 + local.get 5 + i32.shl + local.get 0 + i32.or + i32.store8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 1 + local.get 6 + i32.shr_u + local.set 0 + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@3;) + end + end + local.get 0 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=1196 + end) + (func $ammunition_integer_shift_right (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 2 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.const 0 + local.get 2 + i32.sub + local.get 3 + call $ammunition_integer_shift_left + return + end + local.get 1 + i32.load8_s + local.set 4 + i32.const 0 + i32.const 0 + i32.store offset=1196 + i32.const 0 + i32.const 2 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + local.get 2 + i32.const 3 + i32.shr_u + local.tee 5 + i32.sub + local.tee 6 + i32.const 0 + local.get 0 + local.get 5 + i32.gt_s + select + local.tee 7 + local.get 0 + i32.ge_s + br_if 0 (;@1;) + block ;; label = @2 + loop ;; label = @3 + local.get 1 + local.get 7 + i32.add + i32.load8_u + br_if 1 (;@2;) + local.get 7 + i32.const 1 + i32.add + local.tee 7 + local.get 0 + i32.ge_s + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + block ;; label = @1 + local.get 5 + local.get 0 + i32.lt_s + br_if 0 (;@1;) + local.get 3 + i32.const 0 + i32.const 255 + local.get 4 + i32.const -1 + i32.gt_s + select + local.get 0 + call $ammunition_memset + drop + return + end + local.get 3 + local.get 5 + i32.add + local.get 1 + local.get 6 + call $ammunition_memmove + drop + local.get 3 + i32.const 0 + i32.const 255 + local.get 4 + i32.const -1 + i32.gt_s + select + local.tee 7 + local.get 5 + call $ammunition_memset + drop + block ;; label = @1 + local.get 2 + i32.const 7 + i32.and + local.tee 1 + i32.eqz + br_if 0 (;@1;) + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 7 + i32.const 8 + local.get 1 + i32.sub + local.tee 2 + i32.shl + local.set 4 + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 3 + i32.and + local.tee 6 + br_if 0 (;@3;) + local.get 5 + local.set 7 + br 1 (;@2;) + end + local.get 5 + local.set 7 + loop ;; label = @3 + local.get 3 + local.get 7 + i32.add + local.tee 8 + local.get 8 + i32.load8_u + local.tee 8 + local.get 1 + i32.shr_u + local.get 4 + i32.or + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 8 + local.get 2 + i32.shl + local.set 4 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@3;) + end + end + block ;; label = @2 + local.get 5 + local.get 0 + i32.sub + i32.const -4 + i32.gt_u + br_if 0 (;@2;) + local.get 0 + local.get 7 + i32.sub + local.set 0 + local.get 3 + local.get 7 + i32.add + local.set 7 + loop ;; label = @3 + local.get 7 + local.get 7 + i32.load8_u + local.tee 6 + local.get 1 + i32.shr_u + local.get 4 + i32.or + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.tee 4 + local.get 4 + i32.load8_u + local.tee 4 + local.get 1 + i32.shr_u + local.get 6 + local.get 2 + i32.shl + i32.or + i32.store8 + local.get 7 + i32.const 2 + i32.add + local.tee 6 + local.get 6 + i32.load8_u + local.tee 6 + local.get 1 + i32.shr_u + local.get 4 + local.get 2 + i32.shl + i32.or + i32.store8 + local.get 7 + i32.const 3 + i32.add + local.tee 4 + local.get 4 + i32.load8_u + local.tee 4 + local.get 1 + i32.shr_u + local.get 6 + local.get 2 + i32.shl + i32.or + i32.store8 + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 4 + local.get 2 + i32.shl + local.set 4 + local.get 0 + i32.const -4 + i32.add + local.tee 0 + br_if 0 (;@3;) + end + end + local.get 4 + i32.const 254 + i32.and + i32.eqz + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=1196 + end) + (func $ammunition_integer_shift_left (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 2 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.const 0 + local.get 2 + i32.sub + local.get 3 + call $ammunition_integer_shift_right + return + end + local.get 1 + i32.load8_s + local.set 4 + i32.const 0 + i32.const 0 + i32.store offset=1196 + i32.const 0 + i32.const 2 + call $__pragma_loopbound + local.get 2 + i32.const 3 + i32.shr_u + local.set 5 + block ;; label = @1 + local.get 2 + i32.const 8 + i32.lt_u + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const -1 + i32.add + local.tee 6 + local.get 5 + i32.const -1 + i32.add + local.tee 7 + local.get 6 + local.get 7 + i32.lt_u + select + i32.const 1 + i32.add + local.set 7 + i32.const 0 + i32.const 255 + local.get 4 + i32.const -1 + i32.gt_s + select + local.set 8 + local.get 1 + local.set 6 + block ;; label = @2 + loop ;; label = @3 + local.get 8 + local.get 6 + i32.load8_u + i32.ne + br_if 1 (;@2;) + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 7 + i32.const -1 + i32.add + local.tee 7 + i32.eqz + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 5 + local.get 0 + i32.lt_s + br_if 0 (;@3;) + local.get 3 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + br 1 (;@2;) + end + local.get 3 + local.get 1 + local.get 5 + i32.add + local.get 0 + local.get 5 + i32.sub + local.tee 9 + call $ammunition_memmove + drop + i32.const 0 + local.set 1 + local.get 3 + local.get 9 + i32.add + i32.const 0 + local.get 5 + call $ammunition_memset + drop + local.get 2 + i32.const 7 + i32.and + local.tee 6 + i32.eqz + br_if 1 (;@1;) + i32.const 2 + i32.const 3 + call $__pragma_loopbound + i32.const 8 + local.get 6 + i32.sub + local.set 7 + block ;; label = @3 + local.get 9 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + local.get 9 + i32.const 3 + i32.and + local.set 2 + block ;; label = @4 + block ;; label = @5 + local.get 5 + local.get 0 + i32.sub + i32.const -4 + i32.le_u + br_if 0 (;@5;) + i32.const 0 + local.set 1 + br 1 (;@4;) + end + local.get 3 + i32.const -4 + i32.add + local.set 10 + local.get 9 + i32.const 2147483644 + i32.and + local.set 0 + i32.const 0 + local.set 1 + loop ;; label = @5 + local.get 10 + local.get 9 + i32.add + local.tee 8 + i32.const 3 + i32.add + local.tee 5 + local.get 5 + i32.load8_u + local.tee 5 + local.get 6 + i32.shl + local.get 1 + i32.or + i32.store8 + local.get 8 + i32.const 2 + i32.add + local.tee 1 + local.get 1 + i32.load8_u + local.tee 1 + local.get 6 + i32.shl + local.get 5 + local.get 7 + i32.shr_u + i32.or + i32.store8 + local.get 8 + i32.const 1 + i32.add + local.tee 5 + local.get 5 + i32.load8_u + local.tee 5 + local.get 6 + i32.shl + local.get 1 + local.get 7 + i32.shr_u + i32.or + i32.store8 + local.get 8 + local.get 8 + i32.load8_u + local.tee 1 + local.get 6 + i32.shl + local.get 5 + local.get 7 + i32.shr_u + i32.or + i32.store8 + local.get 9 + i32.const -4 + i32.add + local.set 9 + local.get 1 + local.get 7 + i32.shr_u + local.set 1 + local.get 0 + i32.const -4 + i32.add + local.tee 0 + br_if 0 (;@5;) + end + end + local.get 2 + i32.eqz + br_if 0 (;@3;) + local.get 9 + local.get 3 + i32.add + i32.const -1 + i32.add + local.set 8 + loop ;; label = @4 + local.get 8 + local.get 8 + i32.load8_u + local.tee 9 + local.get 6 + i32.shl + local.get 1 + i32.or + i32.store8 + local.get 8 + i32.const -1 + i32.add + local.set 8 + local.get 9 + local.get 7 + i32.shr_u + local.set 1 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + br_if 0 (;@4;) + end + end + local.get 1 + i32.const 0 + i32.const 255 + local.get 4 + i32.const -1 + i32.gt_s + select + local.get 7 + i32.shr_u + i32.eq + br_if 0 (;@2;) + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + local.get 3 + i32.load8_u + local.get 4 + i32.xor + i32.extend8_s + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=1196 + end) + (func $ammunition_integer_or (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 4 + i32.const 0 + local.set 5 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 3 + local.get 5 + i32.add + local.tee 0 + local.get 2 + local.get 5 + i32.add + local.tee 7 + i32.load8_u + local.get 1 + local.get 5 + i32.add + local.tee 8 + i32.load8_u + i32.or + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.get 7 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.or + i32.store8 + local.get 6 + local.get 5 + i32.const 2 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@3;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 5 + i32.add + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.get 1 + local.get 5 + i32.add + i32.load8_u + i32.or + i32.store8 + end) + (func $ammunition_unsigned_integer_or (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 4 + i32.const 0 + local.set 5 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 3 + local.get 5 + i32.add + local.tee 0 + local.get 2 + local.get 5 + i32.add + local.tee 7 + i32.load8_u + local.get 1 + local.get 5 + i32.add + local.tee 8 + i32.load8_u + i32.or + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.get 7 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.or + i32.store8 + local.get 6 + local.get 5 + i32.const 2 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@3;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 5 + i32.add + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.get 1 + local.get 5 + i32.add + i32.load8_u + i32.or + i32.store8 + end) + (func $ammunition_integer_and (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 4 + i32.const 0 + local.set 5 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 3 + local.get 5 + i32.add + local.tee 0 + local.get 2 + local.get 5 + i32.add + local.tee 7 + i32.load8_u + local.get 1 + local.get 5 + i32.add + local.tee 8 + i32.load8_u + i32.and + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.get 7 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.and + i32.store8 + local.get 6 + local.get 5 + i32.const 2 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@3;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 5 + i32.add + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.get 1 + local.get 5 + i32.add + i32.load8_u + i32.and + i32.store8 + end) + (func $ammunition_unsigned_integer_and (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.and + local.set 4 + i32.const 0 + local.set 5 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 3 + local.get 5 + i32.add + local.tee 0 + local.get 2 + local.get 5 + i32.add + local.tee 7 + i32.load8_u + local.get 1 + local.get 5 + i32.add + local.tee 8 + i32.load8_u + i32.and + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.get 7 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.and + i32.store8 + local.get 6 + local.get 5 + i32.const 2 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@3;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 5 + i32.add + local.get 2 + local.get 5 + i32.add + i32.load8_u + local.get 1 + local.get 5 + i32.add + i32.load8_u + i32.and + i32.store8 + end) + (func $ammunition_integer_not (type 8) (param i32 i32 i32) + (local i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 3 + i32.and + local.set 3 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 0 + i32.const 4 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + i32.const 2147483644 + i32.and + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 2 + local.get 4 + i32.add + local.tee 0 + local.get 1 + local.get 4 + i32.add + local.tee 6 + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 2 + i32.add + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 3 + i32.add + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 5 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 3 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 4 + i32.add + local.set 0 + local.get 2 + local.get 4 + i32.add + local.set 4 + loop ;; label = @2 + local.get 4 + local.get 0 + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end) + (func $ammunition_unsigned_integer_not (type 8) (param i32 i32 i32) + (local i32 i32 i32 i32) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 3 + i32.and + local.set 3 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 0 + i32.const 4 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + i32.const 2147483644 + i32.and + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 2 + local.get 4 + i32.add + local.tee 0 + local.get 1 + local.get 4 + i32.add + local.tee 6 + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 2 + i32.add + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 3 + i32.add + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 5 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@3;) + end + end + local.get 3 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 4 + i32.add + local.set 0 + local.get 2 + local.get 4 + i32.add + local.set 4 + loop ;; label = @2 + local.get 4 + local.get 0 + i32.load8_u + i32.const -1 + i32.xor + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end) + (func $ammunition_eq_unsigned_integer (type 4) (param i32 i32 i32) (result i32) + local.get 1 + local.get 2 + local.get 0 + call $ammunition_memcmp + i32.eqz) + (func $ammunition_eq_integer (type 4) (param i32 i32 i32) (result i32) + local.get 1 + local.get 2 + local.get 0 + call $ammunition_memcmp + i32.eqz) + (func $ammunition_ne_unsigned_integer (type 4) (param i32 i32 i32) (result i32) + local.get 1 + local.get 2 + local.get 0 + call $ammunition_memcmp + i32.const 0 + i32.ne) + (func $ammunition_ne_integer (type 4) (param i32 i32 i32) (result i32) + local.get 1 + local.get 2 + local.get 0 + call $ammunition_memcmp + i32.const 0 + i32.ne) + (func $ammunition_gt_unsigned_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const 1 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 3 + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 4 + local.get 2 + i32.load8_u + local.tee 5 + i32.ne + br_if 1 (;@2;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 4 + local.get 5 + i32.gt_u + local.set 3 + end + local.get 3) + (func $ammunition_gt_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const 0 + local.set 3 + local.get 2 + i32.load8_s + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 0 (;@2;) + i32.const 0 + local.set 3 + block ;; label = @3 + local.get 4 + i32.const 0 + i32.ge_s + br_if 0 (;@3;) + i32.const 1 + return + end + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @3 + loop ;; label = @4 + local.get 1 + i32.load8_u + local.tee 0 + local.get 2 + i32.load8_u + local.tee 5 + i32.ne + br_if 1 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@4;) + br 3 (;@1;) + end + end + local.get 0 + local.get 5 + i32.gt_u + return + end + local.get 4 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 0 + local.get 2 + i32.load8_u + local.tee 5 + i32.ne + br_if 1 (;@2;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 0 + local.get 5 + i32.gt_u + local.set 3 + end + local.get 3) + (func $ammunition_lt_unsigned_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const 1 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 3 + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 4 + local.get 2 + i32.load8_u + local.tee 5 + i32.ne + br_if 1 (;@2;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 4 + local.get 5 + i32.le_u + local.set 3 + end + local.get 3) + (func $ammunition_lt_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const 0 + local.set 3 + local.get 2 + i32.load8_s + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 0 (;@2;) + local.get 4 + i32.const 0 + i32.lt_s + br_if 1 (;@1;) + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @3 + loop ;; label = @4 + local.get 1 + i32.load8_u + local.tee 0 + local.get 2 + i32.load8_u + local.tee 5 + i32.ne + br_if 1 (;@3;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@4;) + br 3 (;@1;) + end + end + local.get 0 + local.get 5 + i32.le_u + return + end + i32.const 1 + local.set 3 + local.get 4 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 3 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 0 + local.get 2 + i32.load8_u + local.tee 5 + i32.ne + br_if 1 (;@2;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 0 + local.get 5 + i32.le_u + local.set 3 + end + local.get 3) + (func $ammunition_ge_unsigned_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 1 + local.set 3 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 3 + local.get 2 + i32.load8_u + local.tee 4 + i32.ne + br_if 1 (;@2;) + i32.const 1 + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + local.get 4 + i32.gt_u + local.set 3 + end + local.get 3) + (func $ammunition_ge_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 0 + local.set 3 + local.get 2 + i32.load8_s + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 0 (;@2;) + block ;; label = @3 + local.get 4 + i32.const 0 + i32.ge_s + br_if 0 (;@3;) + i32.const 1 + return + end + i32.const 1 + local.set 3 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @3 + loop ;; label = @4 + local.get 1 + i32.load8_u + local.tee 3 + local.get 2 + i32.load8_u + local.tee 0 + i32.ne + br_if 1 (;@3;) + i32.const 1 + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@4;) + br 3 (;@1;) + end + end + local.get 3 + local.get 0 + i32.gt_u + return + end + local.get 4 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1 + local.set 3 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 3 + local.get 2 + i32.load8_u + local.tee 0 + i32.ne + br_if 1 (;@2;) + i32.const 1 + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + local.get 0 + i32.gt_u + local.set 3 + end + local.get 3) + (func $ammunition_le_unsigned_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 1 + local.set 3 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 3 + local.get 2 + i32.load8_u + local.tee 4 + i32.ne + br_if 1 (;@2;) + i32.const 1 + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + local.get 4 + i32.le_u + local.set 3 + end + local.get 3) + (func $ammunition_le_integer (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 0 + local.set 3 + local.get 2 + i32.load8_s + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 0 (;@2;) + local.get 4 + i32.const 0 + i32.lt_s + br_if 1 (;@1;) + i32.const 1 + local.set 3 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @3 + loop ;; label = @4 + local.get 1 + i32.load8_u + local.tee 3 + local.get 2 + i32.load8_u + local.tee 0 + i32.ne + br_if 1 (;@3;) + i32.const 1 + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@4;) + br 3 (;@1;) + end + end + local.get 3 + local.get 0 + i32.le_u + return + end + i32.const 1 + local.set 3 + local.get 4 + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 1 + local.set 3 + i32.const 1 + i32.const 4 + call $__pragma_loopbound + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 3 + local.get 2 + i32.load8_u + local.tee 0 + i32.ne + br_if 1 (;@2;) + i32.const 1 + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.const 1 + i32.gt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + local.get 0 + i32.le_u + local.set 3 + end + local.get 3) + (func $ammunition_change_unsigned_integer_size (type 6) (param i32 i32 i32 i32) + (local i32 i32) + i32.const 0 + i32.const 0 + i32.store offset=1196 + block ;; label = @1 + local.get 0 + local.get 2 + i32.gt_s + br_if 0 (;@1;) + local.get 3 + local.get 2 + i32.add + local.get 0 + i32.sub + local.get 1 + local.get 0 + call $ammunition_memmove + drop + local.get 3 + i32.const 0 + local.get 2 + local.get 0 + i32.sub + call $ammunition_memset + drop + return + end + i32.const 1 + i32.const 2 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + local.get 2 + i32.sub + local.tee 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 1 + local.set 5 + block ;; label = @2 + loop ;; label = @3 + local.get 5 + i32.load8_u + br_if 1 (;@2;) + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + i32.eqz + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + local.get 3 + local.get 1 + local.get 0 + i32.add + local.get 2 + i32.sub + local.get 2 + call $ammunition_memmove + drop) + (func $ammunition_change_integer_size (type 6) (param i32 i32 i32 i32) + (local i32 i32 i32 i32) + i32.const 0 + i32.const 0 + i32.store offset=1196 + local.get 1 + i32.load8_s + local.set 4 + block ;; label = @1 + local.get 0 + local.get 2 + i32.gt_s + br_if 0 (;@1;) + local.get 3 + local.get 2 + i32.add + local.get 0 + i32.sub + local.get 1 + local.get 0 + call $ammunition_memmove + drop + local.get 3 + i32.const 0 + i32.const 255 + local.get 4 + i32.const -1 + i32.gt_s + select + local.get 2 + local.get 0 + i32.sub + call $ammunition_memset + drop + return + end + i32.const 2 + i32.const 2 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + local.get 2 + i32.sub + local.tee 5 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + i32.const 255 + local.get 4 + i32.const -1 + i32.gt_s + select + local.set 6 + local.get 1 + local.set 7 + block ;; label = @2 + loop ;; label = @3 + local.get 6 + local.get 7 + i32.load8_u + i32.ne + br_if 1 (;@2;) + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + i32.eqz + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const 0 + i32.const 1 + i32.store offset=1196 + end + local.get 3 + local.get 1 + local.get 0 + i32.add + local.get 2 + i32.sub + local.get 2 + call $ammunition_memmove + drop + block ;; label = @1 + local.get 3 + i32.load8_u + local.get 4 + i32.xor + i32.extend8_s + i32.const -1 + i32.gt_s + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=1196 + end) + (func $ammunition_unsigned_integer_to_based_string (type 7) (param i32 i32 i32 i32) (result i32) + (local i32 i64 i32 i64 i32 i64 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 128 + i32.sub + local.tee 4 + global.set $__stack_pointer + local.get 4 + local.get 1 + local.get 0 + call $ammunition_memcpy + drop + i32.const 1 + local.set 1 + i32.const 1 + i32.const 10 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 2 + i64.extend_i32_s + local.set 5 + i32.const 0 + local.set 1 + loop ;; label = @3 + local.get 1 + local.set 6 + i32.const 2 + i32.const 6 + call $__pragma_loopbound + i64.const 0 + local.set 7 + local.get 4 + local.set 1 + local.get 0 + local.set 8 + i32.const 0 + local.set 2 + loop ;; label = @4 + local.get 1 + local.get 7 + i64.const 8 + i64.shl + local.get 1 + i32.load8_u + i64.extend_i32_u + i64.const 255 + i64.and + i64.or + local.tee 7 + local.get 5 + i64.div_u + local.tee 9 + i64.store8 + local.get 7 + local.get 9 + local.get 5 + i64.mul + i64.sub + local.set 7 + local.get 2 + i32.const 1 + local.get 9 + i64.const 255 + i64.and + i64.eqz + select + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 8 + i32.const -1 + i32.add + local.tee 8 + br_if 0 (;@4;) + end + local.get 3 + local.get 6 + i32.add + local.get 7 + i64.const 48 + i64.or + local.get 7 + i64.const 87 + i64.add + local.get 7 + i64.const 10 + i64.lt_u + select + i64.store8 + local.get 6 + i32.const 1 + i32.add + local.set 1 + local.get 2 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 2 + i32.const 6 + call $__pragma_loopbound + local.get 3 + i32.const 48 + i32.store8 + i32.const 0 + local.set 6 + end + i32.const 0 + local.set 2 + local.get 3 + local.get 1 + i32.add + i32.const 0 + i32.store8 + i32.const 0 + i32.const 5 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + i32.const 2 + i32.lt_u + br_if 0 (;@1;) + block ;; label = @2 + local.get 1 + i32.const 1 + i32.shr_u + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 3 + local.get 6 + i32.add + local.set 10 + i32.const 0 + local.set 8 + i32.const 0 + local.get 1 + i32.const 1 + i32.shr_u + i32.const 2147483646 + i32.and + i32.sub + local.set 11 + local.get 3 + local.set 2 + loop ;; label = @3 + local.get 2 + i32.load8_u + local.set 12 + local.get 2 + local.get 10 + local.get 8 + i32.add + local.tee 0 + i32.load8_u + i32.store8 + local.get 0 + local.get 12 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.tee 12 + i32.load8_u + local.set 13 + local.get 12 + local.get 0 + i32.const -1 + i32.add + local.tee 0 + i32.load8_u + i32.store8 + local.get 0 + local.get 13 + i32.store8 + local.get 2 + i32.const 2 + i32.add + local.set 2 + local.get 11 + local.get 8 + i32.const -2 + i32.add + local.tee 8 + i32.ne + br_if 0 (;@3;) + end + i32.const 0 + local.get 8 + i32.sub + local.set 2 + end + local.get 1 + i32.const 2 + i32.and + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 2 + i32.add + local.tee 1 + i32.load8_u + local.set 8 + local.get 1 + local.get 3 + local.get 6 + local.get 2 + i32.sub + i32.add + local.tee 2 + i32.load8_u + i32.store8 + local.get 2 + local.get 8 + i32.store8 + end + local.get 4 + i32.const 128 + i32.add + global.set $__stack_pointer + local.get 3) + (func $ammunition_unsigned_integer_to_string (type 4) (param i32 i32 i32) (result i32) + local.get 0 + local.get 1 + i32.const 10 + local.get 2 + call $ammunition_unsigned_integer_to_based_string) + (func $ammunition_integer_to_string (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 128 + i32.sub + local.tee 3 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load8_s + i32.const 0 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + local.get 1 + i32.const 10 + local.get 2 + call $ammunition_unsigned_integer_to_based_string + drop + br 1 (;@1;) + end + local.get 3 + local.get 1 + local.get 0 + call $ammunition_memcpy + drop + i32.const 2 + i32.const 6 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.and + local.set 4 + i32.const 0 + local.set 1 + local.get 0 + local.set 5 + block ;; label = @3 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@3;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 6 + i32.const 0 + local.set 1 + local.get 0 + local.set 5 + loop ;; label = @4 + local.get 3 + local.get 5 + i32.add + local.tee 7 + i32.const -1 + i32.add + local.tee 8 + local.get 1 + local.get 8 + i32.load8_u + local.tee 8 + i32.sub + i32.const 0 + local.get 1 + local.get 8 + i32.ne + local.tee 1 + select + i32.store8 + local.get 7 + i32.const -2 + i32.add + local.tee 7 + i32.const -1 + i32.const 0 + local.get 1 + select + local.tee 1 + local.get 7 + i32.load8_u + local.tee 7 + i32.sub + i32.const 0 + local.get 1 + local.get 7 + i32.ne + local.tee 1 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 1 + select + local.set 1 + local.get 5 + i32.const -2 + i32.add + local.set 5 + local.get 6 + i32.const -2 + i32.add + local.tee 6 + br_if 0 (;@4;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@2;) + local.get 3 + local.get 5 + i32.add + i32.const -1 + i32.add + local.tee 5 + i32.const 0 + local.get 1 + local.get 5 + i32.load8_u + local.tee 5 + i32.sub + local.get 1 + local.get 5 + i32.eq + select + i32.store8 + end + local.get 2 + i32.const 45 + i32.store8 + local.get 0 + local.get 3 + i32.const 10 + local.get 2 + i32.const 1 + i32.add + call $ammunition_unsigned_integer_to_based_string + drop + end + local.get 3 + i32.const 128 + i32.add + global.set $__stack_pointer + local.get 2) + (func $ammunition_string_to_unsigned_integer_without_overflow_reaction (type 7) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 2 + i32.const 0 + local.get 0 + call $ammunition_memset + drop + i32.const 1 + i32.const 10 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + i32.load8_u + call $ammunition_isdigit + br_if 0 (;@1;) + local.get 3 + local.get 1 + i32.store + i32.const 0 + return + end + i32.const 0 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + loop ;; label = @3 + i32.const 1 + local.set 5 + block ;; label = @4 + local.get 4 + br_if 0 (;@4;) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + i32.load8_u + local.set 5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 5 + i32.const 48 + i32.ne + local.set 5 + end + local.get 1 + i32.load8_u offset=1 + local.set 6 + local.get 5 + local.set 4 + local.get 1 + i32.const 1 + i32.add + local.tee 7 + local.set 1 + local.get 6 + call $ammunition_isdigit + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 2 + i32.const -1 + i32.add + local.set 8 + local.get 2 + i32.const -4 + i32.add + local.set 9 + local.get 0 + i32.const 3 + i32.and + local.set 10 + local.get 0 + i32.const 2147483644 + i32.and + local.set 11 + i32.const 0 + local.set 5 + local.get 1 + local.set 7 + loop ;; label = @2 + local.get 7 + local.set 12 + local.get 5 + local.set 7 + i32.const 1 + local.set 5 + block ;; label = @3 + local.get 7 + br_if 0 (;@3;) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 1 + local.get 0 + local.set 4 + block ;; label = @4 + local.get 0 + i32.const 4 + i32.lt_u + local.tee 13 + br_if 0 (;@4;) + i32.const 0 + local.set 1 + local.get 11 + local.set 6 + local.get 0 + local.set 4 + loop ;; label = @5 + local.get 9 + local.get 4 + i32.add + local.tee 5 + i32.const 3 + i32.add + local.tee 7 + local.get 7 + i32.load8_u + i32.const 10 + i32.mul + local.get 1 + i32.add + local.tee 7 + i32.store8 + local.get 5 + i32.const 2 + i32.add + local.tee 1 + local.get 1 + i32.load8_u + i32.const 10 + i32.mul + local.get 7 + i32.const 8 + i32.shr_u + i32.add + local.tee 7 + i32.store8 + local.get 5 + i32.const 1 + i32.add + local.tee 1 + local.get 1 + i32.load8_u + i32.const 10 + i32.mul + local.get 7 + i32.const 8 + i32.shr_u + i32.add + local.tee 7 + i32.store8 + local.get 5 + local.get 5 + i32.load8_u + i32.const 10 + i32.mul + local.get 7 + i32.const 8 + i32.shr_u + i32.add + local.tee 7 + i32.store8 + local.get 7 + i32.const 8 + i32.shr_u + local.set 1 + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 6 + i32.const -4 + i32.add + local.tee 6 + br_if 0 (;@5;) + end + end + block ;; label = @4 + local.get 10 + i32.eqz + br_if 0 (;@4;) + local.get 8 + local.get 4 + i32.add + local.set 5 + local.get 10 + local.set 4 + loop ;; label = @5 + local.get 5 + local.get 5 + i32.load8_u + i32.const 10 + i32.mul + local.get 1 + i32.add + local.tee 7 + i32.store8 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 7 + i32.const 8 + i32.shr_u + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + end + i32.const 1 + local.set 5 + local.get 7 + i32.const 255 + i32.gt_u + br_if 0 (;@3;) + local.get 12 + i32.load8_s + local.set 5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 5 + i32.const -48 + i32.add + local.set 7 + block ;; label = @4 + block ;; label = @5 + local.get 10 + br_if 0 (;@5;) + local.get 0 + local.set 1 + br 1 (;@4;) + end + local.get 10 + local.set 4 + local.get 0 + local.set 1 + loop ;; label = @5 + local.get 8 + local.get 1 + i32.add + local.tee 5 + local.get 7 + local.get 5 + i32.load8_u + i32.add + local.tee 5 + i32.store8 + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 5 + i32.const 8 + i32.shr_u + local.set 7 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + end + block ;; label = @4 + local.get 13 + br_if 0 (;@4;) + local.get 1 + i32.const 1 + i32.add + local.set 1 + loop ;; label = @5 + local.get 2 + local.get 1 + i32.add + local.tee 5 + i32.const -2 + i32.add + local.tee 4 + local.get 7 + local.get 4 + i32.load8_u + i32.add + local.tee 7 + i32.store8 + local.get 5 + i32.const -3 + i32.add + local.tee 4 + local.get 7 + i32.const 8 + i32.shr_u + local.get 4 + i32.load8_u + i32.add + local.tee 7 + i32.store8 + local.get 5 + i32.const -4 + i32.add + local.tee 4 + local.get 7 + i32.const 8 + i32.shr_u + local.get 4 + i32.load8_u + i32.add + local.tee 7 + i32.store8 + local.get 5 + i32.const -5 + i32.add + local.tee 5 + local.get 7 + i32.const 8 + i32.shr_u + local.get 5 + i32.load8_u + i32.add + local.tee 5 + i32.store8 + local.get 5 + i32.const 8 + i32.shr_u + local.set 7 + local.get 1 + i32.const -4 + i32.add + local.tee 1 + i32.const 1 + i32.gt_u + br_if 0 (;@5;) + end + end + local.get 5 + i32.const 255 + i32.gt_u + local.set 5 + end + local.get 12 + i32.const 1 + i32.add + local.set 7 + local.get 12 + i32.load8_u offset=1 + call $ammunition_isdigit + br_if 0 (;@2;) + end + end + local.get 3 + local.get 7 + i32.store + local.get 5) + (func $ammunition_unsigned_integer_from_string (type 4) (param i32 i32 i32) (result i32) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 3 + global.set $__stack_pointer + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 1 + i32.const -1 + i32.add + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.load8_s + call $ammunition_isspace + br_if 0 (;@1;) + end + i32.const 0 + local.get 0 + local.get 1 + local.get 2 + local.get 3 + i32.const 12 + i32.add + call $ammunition_string_to_unsigned_integer_without_overflow_reaction + i32.store offset=1196 + local.get 3 + i32.load offset=12 + local.set 1 + local.get 3 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1) + (func $ammunition_integer_from_string (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 3 + global.set $__stack_pointer + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 1 + i32.const -1 + i32.add + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.load8_s + call $ammunition_isspace + br_if 0 (;@1;) + end + local.get 1 + i32.const 1 + i32.add + local.set 4 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.load8_u + i32.const -43 + i32.add + br_table 0 (;@4;) 1 (;@3;) 2 (;@2;) 1 (;@3;) + end + local.get 4 + local.set 1 + end + i32.const 0 + local.get 0 + local.get 1 + local.get 2 + local.get 3 + i32.const 12 + i32.add + call $ammunition_string_to_unsigned_integer_without_overflow_reaction + local.tee 0 + i32.store offset=1196 + local.get 2 + i32.load8_u + local.set 5 + i32.const 1 + local.set 6 + br 1 (;@1;) + end + i32.const 0 + local.set 6 + i32.const 0 + local.get 0 + local.get 4 + local.get 2 + local.get 3 + i32.const 12 + i32.add + call $ammunition_string_to_unsigned_integer_without_overflow_reaction + i32.store offset=1196 + local.get 2 + i32.load8_u + local.set 5 + i32.const 2 + i32.const 6 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.and + local.set 7 + i32.const 0 + local.set 1 + block ;; label = @3 + local.get 0 + i32.const 1 + i32.eq + br_if 0 (;@3;) + local.get 0 + i32.const 2147483646 + i32.and + local.set 4 + i32.const 0 + local.set 1 + loop ;; label = @4 + local.get 2 + local.get 0 + i32.add + local.tee 8 + i32.const -1 + i32.add + local.tee 9 + local.get 1 + local.get 9 + i32.load8_u + local.tee 9 + i32.sub + i32.const 0 + local.get 1 + local.get 9 + i32.ne + local.tee 1 + select + i32.store8 + local.get 8 + i32.const -2 + i32.add + local.tee 8 + i32.const -1 + i32.const 0 + local.get 1 + select + local.tee 1 + local.get 8 + i32.load8_u + local.tee 8 + i32.sub + i32.const 0 + local.get 1 + local.get 8 + i32.ne + local.tee 1 + select + i32.store8 + i32.const -1 + i32.const 0 + local.get 1 + select + local.set 1 + local.get 0 + i32.const -2 + i32.add + local.set 0 + local.get 4 + i32.const -2 + i32.add + local.tee 4 + br_if 0 (;@4;) + end + end + local.get 7 + i32.eqz + br_if 0 (;@2;) + local.get 2 + local.get 0 + i32.add + i32.const -1 + i32.add + local.tee 0 + i32.const 0 + local.get 1 + local.get 0 + i32.load8_u + local.tee 0 + i32.sub + local.get 1 + local.get 0 + i32.eq + select + i32.store8 + end + i32.const 0 + i32.load offset=1196 + local.set 0 + end + i32.const 1 + local.set 1 + block ;; label = @1 + local.get 0 + br_if 0 (;@1;) + block ;; label = @2 + local.get 5 + i32.extend8_s + local.tee 1 + i32.const -1 + i32.gt_s + local.get 6 + i32.or + br_if 0 (;@2;) + local.get 2 + i32.load8_s + i32.const -1 + i32.gt_s + local.set 1 + br 1 (;@1;) + end + local.get 1 + i32.const 0 + i32.lt_s + local.set 1 + end + i32.const 0 + local.get 1 + i32.store offset=1196 + local.get 3 + i32.load offset=12 + local.set 1 + local.get 3 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1) + (func $ammunition_is_zero_bit_string (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 1 + local.set 3 + block ;; label = @1 + local.get 2 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.const 8 + i32.div_s + local.tee 3 + i32.add + local.set 0 + block ;; label = @2 + local.get 2 + i32.const 8 + local.get 1 + local.get 3 + i32.const 3 + i32.shl + i32.sub + local.tee 1 + i32.sub + local.tee 3 + i32.ge_u + br_if 0 (;@2;) + i32.const 255 + i32.const 8 + local.get 2 + i32.sub + i32.shl + local.get 0 + i32.load8_u + local.get 1 + i32.shl + i32.and + i32.const 255 + i32.and + i32.eqz + return + end + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.load8_u + local.get 1 + i32.shl + i32.const 255 + i32.and + br_if 1 (;@2;) + local.get 2 + local.get 3 + i32.sub + local.set 2 + local.get 0 + i32.const 1 + i32.add + local.set 0 + end + i32.const 0 + i32.const 7 + call $__pragma_loopbound + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.const 8 + i32.ge_s + br_if 0 (;@4;) + local.get 2 + local.set 4 + br 1 (;@3;) + end + loop ;; label = @4 + local.get 0 + i32.load8_u + br_if 2 (;@2;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 2 + i32.const 15 + i32.gt_s + local.set 1 + local.get 2 + i32.const -8 + i32.add + local.tee 4 + local.set 2 + local.get 1 + br_if 0 (;@4;) + end + end + i32.const 1 + local.set 3 + local.get 4 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 0 + i32.load8_u + i32.const 8 + local.get 4 + i32.sub + i32.shr_u + i32.eqz + br_if 1 (;@1;) + end + i32.const 0 + local.set 3 + end + local.get 3) + (func $ammunition_bit_string_set (type 6) (param i32 i32 i32 i32) + (local i32 i32) + block ;; label = @1 + local.get 3 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const -1 + i32.const 0 + local.get 2 + select + local.set 4 + local.get 0 + local.get 1 + i32.const 8 + i32.div_s + local.tee 5 + i32.add + local.set 2 + block ;; label = @2 + local.get 1 + local.get 5 + i32.const 3 + i32.shl + i32.sub + local.tee 1 + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.const 255 + local.get 1 + local.get 3 + i32.add + i32.shr_u + i32.const 0 + local.get 3 + i32.const 8 + local.get 1 + i32.sub + local.tee 1 + i32.lt_u + select + i32.const 255 + local.get 1 + i32.shl + i32.or + local.tee 0 + local.get 2 + i32.load8_u + i32.and + local.get 0 + i32.const -1 + i32.xor + local.get 4 + i32.and + i32.or + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 3 + local.get 1 + i32.sub + local.set 3 + end + i32.const 0 + i32.const 8 + call $__pragma_loopbound + block ;; label = @2 + block ;; label = @3 + local.get 3 + i32.const 8 + i32.ge_s + br_if 0 (;@3;) + local.get 3 + local.set 0 + br 1 (;@2;) + end + block ;; label = @3 + block ;; label = @4 + local.get 3 + i32.const -8 + i32.add + local.tee 5 + i32.const 3 + i32.shr_u + i32.const 1 + i32.add + i32.const 7 + i32.and + local.tee 1 + br_if 0 (;@4;) + br 1 (;@3;) + end + local.get 3 + local.get 1 + i32.const 3 + i32.shl + i32.sub + local.set 3 + loop ;; label = @4 + local.get 2 + local.get 4 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 1 + i32.const -1 + i32.add + local.tee 1 + br_if 0 (;@4;) + end + local.get 3 + local.set 0 + end + local.get 5 + i32.const 56 + i32.lt_u + br_if 0 (;@2;) + loop ;; label = @3 + local.get 2 + local.get 4 + i32.store8 offset=7 + local.get 2 + local.get 4 + i32.store8 offset=6 + local.get 2 + local.get 4 + i32.store8 offset=5 + local.get 2 + local.get 4 + i32.store8 offset=4 + local.get 2 + local.get 4 + i32.store8 offset=3 + local.get 2 + local.get 4 + i32.store8 offset=2 + local.get 2 + local.get 4 + i32.store8 offset=1 + local.get 2 + local.get 4 + i32.store8 + local.get 2 + i32.const 8 + i32.add + local.set 2 + local.get 3 + i32.const -72 + i32.add + local.set 1 + local.get 3 + i32.const -64 + i32.add + local.tee 0 + local.set 3 + local.get 1 + i32.const -16 + i32.lt_u + br_if 0 (;@3;) + end + end + local.get 0 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 2 + local.get 2 + i32.load8_u + i32.const 255 + i32.const 8 + local.get 0 + i32.sub + i32.shl + local.tee 3 + i32.const -1 + i32.xor + i32.and + local.get 3 + local.get 4 + i32.and + i32.or + i32.store8 + end) + (func $ammunition_bit_string_copy (type 9) (param i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + i32.const 7 + call $__pragma_loopbound + local.get 2 + local.get 3 + i32.const 8 + i32.div_s + local.tee 5 + i32.add + local.set 6 + local.get 0 + local.get 1 + i32.const 8 + i32.div_s + local.tee 7 + i32.add + local.set 0 + i32.const 8 + local.get 3 + local.get 5 + i32.const 3 + i32.shl + i32.sub + local.tee 8 + i32.sub + local.set 9 + i32.const 255 + i32.const 8 + local.get 1 + local.get 7 + i32.const 3 + i32.shl + i32.sub + local.tee 7 + i32.sub + local.tee 10 + i32.shl + local.set 11 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 7 + br_if 0 (;@4;) + local.get 8 + i32.eqz + br_if 1 (;@3;) + loop ;; label = @5 + local.get 6 + i32.load8_u + local.get 8 + i32.shl + i32.const 255 + i32.and + local.set 1 + i32.const 0 + local.set 3 + block ;; label = @6 + local.get 4 + local.get 9 + i32.le_s + br_if 0 (;@6;) + local.get 6 + i32.load8_u offset=1 + local.get 9 + i32.shr_u + local.set 3 + end + local.get 3 + local.get 1 + i32.or + local.set 3 + block ;; label = @6 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@6;) + local.get 4 + local.set 9 + br 4 (;@2;) + end + local.get 0 + local.get 3 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.set 4 + br 0 (;@5;) + end + end + i32.const 255 + local.get 7 + i32.shr_u + local.set 12 + block ;; label = @4 + local.get 8 + i32.eqz + br_if 0 (;@4;) + loop ;; label = @5 + local.get 6 + i32.load8_u + local.get 8 + i32.shl + i32.const 255 + i32.and + local.set 1 + i32.const 0 + local.set 3 + block ;; label = @6 + local.get 4 + local.get 9 + i32.le_s + br_if 0 (;@6;) + local.get 6 + i32.load8_u offset=1 + local.get 9 + i32.shr_u + local.set 3 + end + local.get 3 + local.get 1 + i32.or + local.set 3 + block ;; label = @6 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@6;) + local.get 4 + local.set 9 + br 4 (;@2;) + end + local.get 0 + local.get 11 + local.get 0 + i32.load8_u + i32.and + local.get 3 + local.get 7 + i32.shr_u + i32.or + i32.store8 + local.get 0 + local.get 12 + local.get 0 + i32.load8_u offset=1 + i32.and + local.get 3 + local.get 10 + i32.shl + i32.or + i32.store8 offset=1 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.set 4 + local.get 0 + i32.const 1 + i32.add + local.set 0 + br 0 (;@5;) + end + end + local.get 6 + i32.load8_u + local.set 3 + block ;; label = @4 + local.get 4 + i32.const 9 + i32.ge_u + br_if 0 (;@4;) + local.get 4 + local.set 9 + br 2 (;@2;) + end + local.get 2 + local.get 5 + i32.add + i32.const 1 + i32.add + local.set 6 + local.get 0 + i32.load8_u + local.set 1 + loop ;; label = @4 + local.get 0 + local.get 11 + local.get 1 + i32.and + local.get 3 + local.get 7 + i32.shr_u + i32.or + i32.store8 + local.get 0 + local.get 12 + local.get 0 + i32.load8_u offset=1 + i32.and + local.get 3 + local.get 10 + i32.shl + i32.or + local.tee 1 + i32.store8 offset=1 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 4 + i32.const 17 + i32.lt_u + local.set 8 + local.get 6 + i32.load8_u + local.set 3 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.tee 9 + local.set 4 + local.get 8 + i32.eqz + br_if 0 (;@4;) + br 2 (;@2;) + end + end + local.get 6 + i32.load8_u + local.set 3 + block ;; label = @3 + local.get 4 + i32.const 9 + i32.ge_u + br_if 0 (;@3;) + local.get 4 + local.set 9 + br 1 (;@2;) + end + local.get 2 + local.get 5 + i32.add + i32.const 1 + i32.add + local.set 6 + loop ;; label = @3 + local.get 0 + local.get 3 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 4 + i32.const 17 + i32.lt_u + local.set 1 + local.get 6 + i32.load8_u + local.set 3 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.tee 9 + local.set 4 + local.get 1 + i32.eqz + br_if 0 (;@3;) + end + end + local.get 0 + i32.const 255 + local.get 9 + local.get 7 + i32.add + i32.shr_u + local.get 11 + i32.or + local.tee 4 + local.get 0 + i32.load8_u + i32.and + local.get 3 + local.get 7 + i32.shr_u + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.store8 + local.get 9 + local.get 10 + i32.sub + local.tee 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.const 255 + local.get 4 + i32.shr_u + local.get 0 + i32.load8_u offset=1 + i32.and + local.get 3 + local.get 10 + i32.shl + i32.const 255 + i32.const 8 + local.get 4 + i32.sub + i32.shl + i32.and + i32.or + i32.store8 offset=1 + end) + (func $ammunition_reverse_bit_string_copy (type 9) (param i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + i32.const 7 + call $__pragma_loopbound + local.get 4 + i32.const -1 + i32.add + local.tee 5 + local.get 3 + i32.add + local.tee 3 + local.get 3 + i32.const 8 + i32.div_s + local.tee 3 + i32.const 3 + i32.shl + i32.sub + local.tee 6 + i32.const 1 + i32.add + local.set 7 + i32.const 7 + local.get 6 + i32.sub + local.set 8 + i32.const 7 + local.get 5 + local.get 1 + i32.add + local.tee 1 + local.get 1 + i32.const 8 + i32.div_s + local.tee 9 + i32.const 3 + i32.shl + i32.sub + local.tee 1 + i32.sub + local.set 5 + i32.const 255 + local.get 1 + i32.const 1 + i32.add + local.tee 10 + i32.shr_u + local.set 11 + local.get 2 + local.get 3 + i32.add + local.set 2 + local.get 0 + local.get 9 + i32.add + local.set 3 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 7 + i32.ne + br_if 0 (;@4;) + local.get 6 + i32.const 7 + i32.eq + br_if 1 (;@3;) + local.get 2 + i32.const -1 + i32.add + local.set 1 + loop ;; label = @5 + local.get 1 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.shr_u + local.set 2 + i32.const 0 + local.set 6 + block ;; label = @6 + local.get 4 + local.get 7 + i32.le_s + br_if 0 (;@6;) + local.get 1 + i32.load8_u + local.get 7 + i32.shl + local.set 6 + end + local.get 6 + i32.const 255 + i32.and + local.get 2 + i32.or + local.set 6 + block ;; label = @6 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@6;) + local.get 4 + local.set 7 + br 4 (;@2;) + end + local.get 3 + local.get 6 + i32.store8 + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 4 + i32.const -8 + i32.add + local.set 4 + br 0 (;@5;) + end + end + i32.const 255 + local.get 5 + i32.shl + local.set 0 + block ;; label = @4 + local.get 6 + i32.const 7 + i32.eq + br_if 0 (;@4;) + local.get 2 + i32.const -1 + i32.add + local.set 1 + loop ;; label = @5 + local.get 1 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.shr_u + local.set 2 + i32.const 0 + local.set 6 + block ;; label = @6 + local.get 4 + local.get 7 + i32.le_s + br_if 0 (;@6;) + local.get 1 + i32.load8_u + local.get 7 + i32.shl + local.set 6 + end + local.get 6 + i32.const 255 + i32.and + local.get 2 + i32.or + local.set 6 + block ;; label = @6 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@6;) + local.get 4 + local.set 7 + br 4 (;@2;) + end + local.get 3 + local.get 11 + local.get 3 + i32.load8_u + i32.and + local.get 6 + local.get 5 + i32.shl + i32.or + i32.store8 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + local.get 0 + local.get 3 + i32.load8_u + i32.and + local.get 6 + local.get 10 + i32.shr_u + i32.or + i32.store8 + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 4 + i32.const -8 + i32.add + local.set 4 + br 0 (;@5;) + end + end + local.get 2 + i32.load8_u + local.set 6 + block ;; label = @4 + local.get 4 + i32.const 9 + i32.ge_u + br_if 0 (;@4;) + local.get 4 + local.set 7 + br 2 (;@2;) + end + local.get 2 + i32.const -1 + i32.add + local.set 1 + local.get 3 + i32.load8_u + local.set 8 + loop ;; label = @4 + local.get 3 + local.get 11 + local.get 8 + i32.and + local.get 6 + local.get 5 + i32.shl + i32.or + i32.store8 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + local.get 0 + local.get 3 + i32.load8_u + i32.and + local.get 6 + local.get 10 + i32.shr_u + i32.or + local.tee 8 + i32.store8 + local.get 4 + i32.const 17 + i32.lt_u + local.set 2 + local.get 1 + i32.load8_u + local.set 6 + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 4 + i32.const -8 + i32.add + local.tee 7 + local.set 4 + local.get 2 + i32.eqz + br_if 0 (;@4;) + br 2 (;@2;) + end + end + local.get 2 + i32.load8_u + local.set 6 + block ;; label = @3 + local.get 4 + i32.const 9 + i32.ge_u + br_if 0 (;@3;) + local.get 4 + local.set 7 + br 1 (;@2;) + end + local.get 2 + i32.const -1 + i32.add + local.set 1 + loop ;; label = @3 + local.get 3 + local.get 6 + i32.store8 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 4 + i32.const 17 + i32.lt_u + local.set 8 + local.get 1 + i32.load8_u + local.set 6 + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 4 + i32.const -8 + i32.add + local.tee 7 + local.set 4 + local.get 8 + i32.eqz + br_if 0 (;@3;) + end + end + local.get 3 + i32.const 255 + local.get 7 + local.get 5 + i32.add + i32.shl + local.get 11 + i32.or + local.tee 4 + local.get 3 + i32.load8_u + i32.and + local.get 6 + local.get 5 + i32.shl + local.get 4 + i32.const -1 + i32.xor + i32.and + i32.or + i32.store8 + local.get 7 + local.get 10 + i32.sub + local.tee 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 3 + i32.const -1 + i32.add + local.tee 3 + i32.const 255 + local.get 4 + i32.shl + local.get 3 + i32.load8_u + i32.and + local.get 6 + local.get 10 + i32.shr_u + i32.const 255 + i32.const 8 + local.get 4 + i32.sub + i32.shr_u + i32.and + i32.or + i32.store8 + end) + (func $ammunition_bit_string_move (type 9) (param i32 i32 i32 i32 i32) + (local i32 i32) + block ;; label = @1 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 3 + local.get 3 + i32.const 8 + i32.div_s + local.tee 5 + i32.const 3 + i32.shl + i32.sub + local.set 3 + local.get 1 + local.get 1 + i32.const 8 + i32.div_s + local.tee 6 + i32.const 3 + i32.shl + i32.sub + local.set 1 + block ;; label = @2 + block ;; label = @3 + local.get 2 + local.get 5 + i32.add + local.tee 2 + local.get 0 + local.get 6 + i32.add + local.tee 0 + i32.gt_u + br_if 0 (;@3;) + local.get 3 + local.get 1 + i32.le_s + br_if 1 (;@2;) + local.get 2 + local.get 0 + i32.ne + br_if 1 (;@2;) + end + local.get 0 + local.get 1 + local.get 2 + local.get 3 + local.get 4 + call $ammunition_bit_string_copy + return + end + local.get 0 + local.get 1 + local.get 2 + local.get 3 + local.get 4 + call $ammunition_reverse_bit_string_copy + end) + (func $ammunition_bit_string_comparison (type 10) (param i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 4 + i32.const 1 + i32.ge_s + br_if 0 (;@1;) + i32.const 0 + return + end + i32.const 0 + i32.const 7 + call $__pragma_loopbound + local.get 2 + local.get 3 + i32.const 8 + i32.div_s + local.tee 5 + i32.add + local.set 6 + local.get 0 + local.get 1 + i32.const 8 + i32.div_s + local.tee 7 + i32.add + local.set 8 + i32.const 8 + local.get 3 + local.get 5 + i32.const 3 + i32.shl + i32.sub + local.tee 9 + i32.sub + local.set 10 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 7 + i32.const 3 + i32.shl + i32.sub + local.tee 11 + br_if 0 (;@4;) + local.get 9 + i32.eqz + br_if 1 (;@3;) + loop ;; label = @5 + local.get 6 + i32.load8_u + local.get 9 + i32.shl + i32.const 255 + i32.and + local.set 2 + i32.const 0 + local.set 1 + block ;; label = @6 + local.get 4 + local.get 10 + i32.le_s + br_if 0 (;@6;) + local.get 6 + i32.load8_u offset=1 + local.get 10 + i32.shr_u + local.set 1 + end + local.get 8 + i32.load8_u + local.set 3 + local.get 1 + local.get 2 + i32.or + local.set 1 + block ;; label = @6 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@6;) + local.get 4 + local.set 10 + br 4 (;@2;) + end + block ;; label = @6 + local.get 1 + local.get 3 + i32.ge_u + br_if 0 (;@6;) + i32.const 1 + return + end + block ;; label = @6 + local.get 1 + local.get 3 + i32.le_u + br_if 0 (;@6;) + i32.const -1 + return + end + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.set 4 + br 0 (;@5;) + end + end + i32.const 8 + local.get 11 + i32.sub + local.set 2 + block ;; label = @4 + local.get 9 + i32.eqz + br_if 0 (;@4;) + loop ;; label = @5 + local.get 8 + i32.load8_u + local.get 11 + i32.shl + local.set 0 + i32.const 0 + local.set 1 + i32.const 0 + local.set 3 + block ;; label = @6 + local.get 4 + local.get 2 + i32.le_s + br_if 0 (;@6;) + local.get 8 + i32.load8_u offset=1 + local.get 2 + i32.shr_u + local.set 3 + end + local.get 0 + i32.const 255 + i32.and + local.set 0 + local.get 6 + i32.load8_u + local.get 9 + i32.shl + i32.const 255 + i32.and + local.set 5 + block ;; label = @6 + local.get 4 + local.get 10 + i32.le_s + br_if 0 (;@6;) + local.get 6 + i32.load8_u offset=1 + local.get 10 + i32.shr_u + local.set 1 + end + local.get 3 + local.get 0 + i32.or + local.set 3 + local.get 1 + local.get 5 + i32.or + local.set 1 + block ;; label = @6 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@6;) + local.get 4 + local.set 10 + br 4 (;@2;) + end + block ;; label = @6 + local.get 3 + local.get 1 + i32.le_u + br_if 0 (;@6;) + i32.const 1 + return + end + block ;; label = @6 + local.get 3 + local.get 1 + i32.ge_u + br_if 0 (;@6;) + i32.const -1 + return + end + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.set 4 + br 0 (;@5;) + end + end + loop ;; label = @4 + local.get 8 + i32.load8_u + local.get 11 + i32.shl + i32.const 255 + i32.and + local.set 1 + i32.const 0 + local.set 3 + block ;; label = @5 + local.get 4 + local.get 2 + i32.le_s + br_if 0 (;@5;) + local.get 8 + i32.load8_u offset=1 + local.get 2 + i32.shr_u + local.set 3 + end + local.get 3 + local.get 1 + i32.or + local.set 3 + local.get 6 + i32.load8_u + local.set 1 + block ;; label = @5 + local.get 4 + i32.const 9 + i32.ge_s + br_if 0 (;@5;) + local.get 4 + local.set 10 + br 3 (;@2;) + end + block ;; label = @5 + local.get 3 + local.get 1 + i32.le_u + br_if 0 (;@5;) + i32.const 1 + return + end + block ;; label = @5 + local.get 3 + local.get 1 + i32.ge_u + br_if 0 (;@5;) + i32.const -1 + return + end + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 4 + i32.const -8 + i32.add + local.set 4 + br 0 (;@4;) + end + end + local.get 6 + i32.load8_u + local.set 1 + local.get 8 + i32.load8_u + local.set 3 + block ;; label = @3 + local.get 4 + i32.const 9 + i32.ge_u + br_if 0 (;@3;) + local.get 4 + local.set 10 + br 1 (;@2;) + end + i32.const 1 + local.set 9 + local.get 0 + local.get 7 + i32.add + i32.const 1 + i32.add + local.set 6 + local.get 2 + local.get 5 + i32.add + i32.const 1 + i32.add + local.set 8 + loop ;; label = @3 + local.get 3 + local.get 1 + i32.gt_u + br_if 2 (;@1;) + block ;; label = @4 + local.get 3 + local.get 1 + i32.ge_u + br_if 0 (;@4;) + i32.const -1 + return + end + local.get 4 + i32.const 17 + i32.lt_s + local.set 2 + local.get 8 + i32.load8_u + local.set 1 + local.get 6 + i32.load8_u + local.set 3 + local.get 6 + i32.const 1 + i32.add + local.set 6 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 4 + i32.const -8 + i32.add + local.tee 10 + local.set 4 + local.get 2 + i32.eqz + br_if 0 (;@3;) + end + end + block ;; label = @2 + local.get 3 + i32.const 255 + i32.const 8 + local.get 10 + i32.sub + i32.shl + local.tee 4 + i32.and + local.tee 6 + local.get 1 + local.get 4 + i32.and + local.tee 4 + i32.le_u + br_if 0 (;@2;) + i32.const 1 + return + end + i32.const -1 + i32.const 0 + local.get 6 + local.get 4 + i32.lt_u + select + local.set 9 + end + local.get 9) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5296)) + (global (;1;) i32 (i32.const 1200)) + (global (;2;) i32 (i32.const 5296)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $ammunition_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "-2147483649\00-1349\00-345088\002147483648\00-1348\004294965947\00-17\004294967296\0016\00-6\004294967295\0064\002\00-1\00-134890\00-1105018880\001380\00-10\00-33000\0070000\0040000\00-11230000\00-30000\00-1000000\00")) diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition.c new file mode 100644 index 0000000..3d8b02d --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition.c @@ -0,0 +1,1172 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: ammunition + + Author: Vladimir Makarov + + Function: Tests reusable packages bits and arith + bits: Work with bit strings (copying, moving, setting, testing, comparison). + arith: Implementing host machine-independently arbitrary precision integer + numbers arithmetic. The implementation of the package functions are not + sufficiently efficient in order to use for run-time. The package + functions are oriented to implement constant-folding in compilers, + cross-compilers. + + Source: DINO programming language repository + https://github.com/dino-lang/dino/ + + Changes: no major functional changes + + License: GPL 2 and LGPL 2 + +*/ + +#include "ammunition_stdio.h" +#include "ammunition_stdlib.h" +#include "ammunition_string.h" +#include "arithm.h" +#include "bits.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void ammunition_reset_str_bits(char *str, char *s); +void ammunition_reset_str_arithm(char *str, char *s, char *d, char *e, char *g); +int ammunition_bits_test(); +int ammunition_arithm_test(); +void ammunition_init(void); +int ammunition_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ammunition_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Forward declaration of global variables +*/ + +int ammunition_result; + +/* + Core functions +*/ + +void +ammunition_reset_str_bits(char *str, char *s) { + int i; + __pragma_loopbound(8, 8); + for (i = 0; i < 8; i++) { + str[i] = 0; + s[i] = 0; + } +} + +void +ammunition_reset_str_arithm(char *str, char *s, char *d, char *e, char *g) { + int i; + __pragma_loopbound(20, 20); + for (i = 0; i < 20; i++) { + str[i] = 0; + s[i] = 0; + } + + __pragma_loopbound(4, 4); + for (i = 0; i < 4; i++) { + d[i] = 0; + e[i] = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) + g[i] = 0; +} + +int +ammunition_bits_test() { + char str[8]; + char str1[8]; + + int result = 0; + unsigned int i, j; + + /* Test 1 */ + ammunition_reset_str_bits(str, str1); + + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(str) * CHAR_BIT; i++) { + if (BIT(str, i)) + result = 1; + } + + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(str) * CHAR_BIT; i++) { + SET_BIT(str, i, 1); + __pragma_loopbound(64, 64); + for (j = 0; j < sizeof(str) * CHAR_BIT; j++) + if (j <= i) { + if (BIT(str, j) == 0) + result = 1; + } else if (BIT(str, j)) + result = 1; + } + + /* Test 2 */ + ammunition_reset_str_bits(str, str1); + + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(str) * CHAR_BIT; i++) + if (!ammunition_is_zero_bit_string( + str, i, (sizeof(str) * CHAR_BIT - i) / 2 + 1)) + result = 1; + ammunition_bit_string_set(str, 13, 1, 35); + __pragma_loopbound(13, 13); + for (i = 0; i < 13; i++) + if (!ammunition_is_zero_bit_string(str, i, 13 - i)) + result = 1; + __pragma_loopbound(35, 35); + for (i = 13; i < 48; i++) + if (ammunition_is_zero_bit_string(str, i, 48 - i)) + result = 1; + __pragma_loopbound(16, 16); + for (i = 48; i < sizeof(str) * CHAR_BIT; i++) + if (!ammunition_is_zero_bit_string(str, i, sizeof(str) * CHAR_BIT - i)) + result = 1; + + /* Test 3 */ + ammunition_reset_str_bits(str, str1); + + __pragma_loopbound(42, 42); + for (i = 0; i + i / 2 + 1 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_set(str, i, 1, i / 2 + 1); + if (!ammunition_is_zero_bit_string(str, 0, i - 1)) + result = 1; + if (ammunition_is_zero_bit_string(str, i, i / 2 + 1)) + result = 1; + if (!ammunition_is_zero_bit_string( + str, i + i / 2 + 1, sizeof(str) * CHAR_BIT - (i + i / 2 + 1))) + result = 1; + ammunition_bit_string_set(str, 0, 0, sizeof(str) * CHAR_BIT); + } + + /* Test 4 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_set(str1, 2, 1, 40); + __pragma_loopbound(42, 42); + for (i = 0; i < 42; i++) + if (ammunition_bit_string_comparison(str, i, str1, i, 42 - i) != 0) + result = 1; + __pragma_loopbound(43, 43); + for (i = 0; i < 43; i++) + if (ammunition_bit_string_comparison(str, i, str1, i, + sizeof(str) * CHAR_BIT - i) <= 0) + result = 1; + __pragma_loopbound(43, 43); + for (i = 0; i < 43; i++) + if (ammunition_bit_string_comparison(str1, i, str, i, + sizeof(str) * CHAR_BIT - i) >= 0) + result = 1; + + /* Test 5 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + __pragma_loopbound(59, 59); + for (i = 0; i + 5 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_copy(str1, i + 5, str, i, + sizeof(str) * CHAR_BIT - i - 5); + if (ammunition_bit_string_comparison( + str1, i + 5, str, i, sizeof(str) * CHAR_BIT - i - 5) != 0) + result = 1; + } + + /* Test 6 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_set(str1, 2, 1, 43); + __pragma_loopbound(59, 59); + for (i = 0; i + 5 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_set(str, 0, 0, sizeof(str) * CHAR_BIT); + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_move(str, i + 5, str, i, + sizeof(str) * CHAR_BIT - i - 5); + if (ammunition_bit_string_comparison( + str, i + 5, str1, i, sizeof(str) * CHAR_BIT - i - 5) != 0) + result = 1; + } + + /* Test 7 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_set(str1, 2, 1, 43); + __pragma_loopbound(59, 59); + for (i = 0; i + 5 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_set(str, 0, 0, sizeof(str) * CHAR_BIT); + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_move(str, i, str, i + 5, + sizeof(str) * CHAR_BIT - i - 5); + if (ammunition_bit_string_comparison( + str, i, str1, i + 5, sizeof(str) * CHAR_BIT - i - 5) != 0) + result = 1; + } + + return result; +} + +int +ammunition_arithm_test() { + int result = 0; + + /* Test 1 */ + int i; + char str[20], s[20], d[4], e[4], g[6]; + + ammunition_integer_from_string(4, "-2147483649", d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MIN); + ammunition_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + ammunition_integer_from_string(4, "2147483648", d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MAX); + ammunition_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + } + + /* Test 2 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "4294967296", d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX); + ammunition_unsigned_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + } + + /* Test 3 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_d(str, INT_MAX); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "1", e); + ammunition_add_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MAX - 4); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 4); + ammunition_integer_from_string(4, str, e); + ammunition_add_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, INT_MAX); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, i + 1); + ammunition_integer_from_string(4, str, e); + ammunition_add_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i + i + 1) + result = 1; + } + + /* Test 4 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_u(str, UINT_MAX); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_unsigned_integer_from_string(4, "1", e); + ammunition_add_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX - 4); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, 4); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_add_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + ammunition_sprintf_u(str, UINT_MAX); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i + 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_add_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i + i + 1) + result = 1; + } + + /* Test 5 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_d(str, INT_MIN); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "1", e); + ammunition_subtract_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MIN + 4); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 4); + ammunition_integer_from_string(4, str, e); + ammunition_subtract_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, INT_MIN); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 10 - i); + ammunition_integer_from_string(4, str, e); + ammunition_subtract_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i + i - 10) + result = 1; + } + + /* Test 6 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_u(str, UINT_MAX - 2); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, UINT_MAX - 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_subtract_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_subtract_unsigned_integer(4, d, d, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 2); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_subtract_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i - i / 2) + result = 1; + } + + /* Test 7 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_d(str, INT_MAX / 2 + 1); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "2", e); + ammunition_multiply_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MIN / 2 - 1); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "2", e); + ammunition_multiply_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MAX / 3); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 3); + ammunition_integer_from_string(4, str, e); + ammunition_multiply_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, (INT_MAX / 3) * 3); + if (ammunition_strcmp(s, str) != 0) + result = 1; + ammunition_sprintf_d(str, INT_MIN / 2); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 2); + ammunition_integer_from_string(4, str, e); + ammunition_multiply_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, (INT_MIN / 2) * 2); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, i + 1000); + ammunition_integer_from_string(4, str, e); + ammunition_multiply_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i * (i + 1000)) + result = 1; + } + + /* Test 8 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_u(str, UINT_MAX / 5 + 1); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, 5); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_multiply_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX / 2); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, 2); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_multiply_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + ammunition_sprintf_u(str, (UINT_MAX / 2) * 2); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 2); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_multiply_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i * (i / 2)) + result = 1; + } + + /* Test 9 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "10", d); + ammunition_integer_from_string(4, "0", e); + ammunition_divide_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, (i < 0 ? -i / 20 + 1 : -i / 20 - 1)); + ammunition_integer_from_string(4, str, e); + ammunition_divide_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i / (i < 0 ? -i / 20 + 1 : -i / 20 - 1)) + result = 1; + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_divide_integer(4, d, e, e); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, e, s); + if (ammunition_atoi(s) != i / (i < 0 ? -i / 20 + 1 : -i / 20 - 1)) + result = 1; + } + + /* Test 10 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_divide_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 20 + 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_divide_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i / (i / 20 + 1)) + result = 1; + } + + /* Test 11 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_unsigned_integer_remainder(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 20 + 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_unsigned_integer_remainder(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i % (i / 20 + 1)) + result = 1; + } + + /* Test 12 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_right(4, d, 0, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_right(4, d, 32, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_right(4, d, 8, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "5") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_right(4, d, 13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_left(4, d, -13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + + /* Test 13 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_right(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_right(4, d, 32, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_right(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "5") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_right(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_left(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_right(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1348") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_right(4, d, 32, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-1") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_right(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-6") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_right(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-17") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_left(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-17") != 0) + result = 1; + + /* Test 14 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_left(4, d, 0, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_left(4, d, 22, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_left(4, d, 8, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "345088") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_left(4, d, 13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_right(4, d, -13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + + /* Test 15 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_left(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_left(4, d, 21, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_left(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "345088") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_left(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_right(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_left(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1348") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_left(4, d, 21, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_left(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-345088") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_left(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1105018880") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_right(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1105018880") != 0) + result = 1; + + /* Test 16 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_eq_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_eq_integer(4, d, e)) + result = 1; + + /* Test 17 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_eq_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_eq_unsigned_integer(4, d, e)) + result = 1; + + /* Test 18 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_ne_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_ne_integer(4, d, e)) + result = 1; + + /* Test 19 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_ne_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_ne_unsigned_integer(4, d, e)) + result = 1; + + /* Test 20 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_gt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_gt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_gt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_gt_integer(4, d, e)) + result = 1; + + /* Test 21 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_gt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_gt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_gt_unsigned_integer(4, d, e)) + result = 1; + + /* Test 22 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_lt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_lt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_lt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_lt_integer(4, d, e)) + result = 1; + + /* Test 23 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_lt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_lt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_lt_unsigned_integer(4, d, e)) + result = 1; + + /* Test 24 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_ge_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_ge_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_ge_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_ge_integer(4, d, e)) + result = 1; + + /* Test 25 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_ge_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_ge_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_ge_unsigned_integer(4, d, e)) + result = 1; + + /* Test 26 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_le_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_le_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_le_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_le_integer(4, d, e)) + result = 1; + + /* Test 27 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_le_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_le_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_le_unsigned_integer(4, d, e)) + result = 1; + + /* Test 28 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "70000", d); + ammunition_change_unsigned_integer_size(4, d, 2, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_from_string(4, "30000", d); + ammunition_change_unsigned_integer_size(4, d, 2, d); + ammunition_integer_to_string(2, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "30000") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "11230000", g); + ammunition_change_unsigned_integer_size(4, g, 6, g); + ammunition_integer_to_string(6, g, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "11230000") != 0) + result = 1; + + /* Test 29 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "40000", d); + ammunition_change_integer_size(4, d, 2, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "-33000", d); + ammunition_change_integer_size(4, d, 2, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "30000", d); + ammunition_change_integer_size(4, d, 2, d); + ammunition_integer_to_string(2, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "30000") != 0) + result = 1; + ammunition_integer_from_string(4, "-30000", d); + ammunition_change_integer_size(4, d, 2, d); + ammunition_integer_to_string(2, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-30000") != 0) + result = 1; + ammunition_integer_from_string(4, "11230000", g); + ammunition_change_integer_size(4, g, 6, g); + ammunition_integer_to_string(6, g, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "11230000") != 0) + result = 1; + ammunition_integer_from_string(4, "-11230000", g); + ammunition_change_integer_size(4, g, 6, g); + ammunition_integer_to_string(6, g, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-11230000") != 0) + result = 1; + + /* Test 30 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "4294967295", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "4294967295") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "96", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1380") != 0) + result = 1; + + /* Test 31 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "1348", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "0", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "-1", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "-1") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "96", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1380") != 0) + result = 1; + + /* Test 32 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "4294967295", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "96", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "64") != 0) + result = 1; + + /* Test 33 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "1348", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "0", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "-1", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "96", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "64") != 0) + result = 1; + + /* Test 34 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_not(4, d, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "4294965947") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "0", d); + ammunition_unsigned_integer_not(4, d, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "4294967295") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "4294967295", d); + ammunition_unsigned_integer_not(4, d, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + + /* Test 35 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_not(4, d, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "-1349") != 0) + result = 1; + ammunition_integer_from_string(4, "0", d); + ammunition_integer_not(4, d, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "-1") != 0) + result = 1; + ammunition_integer_from_string(4, "-1", d); + ammunition_integer_not(4, d, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + + return result; +} + +/* + Initialization- and return-value-related functions +*/ + +void +ammunition_init(void) { + ammunition_result = 0; +} + +int +ammunition_return(void) { + return ammunition_result; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ammunition_main(void) { + ammunition_result |= ammunition_bits_test(); + ammunition_result |= ammunition_arithm_test(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + ammunition_init(); + ammunition_main(); + + return (ammunition_return()); +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_libc.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_libc.c new file mode 100644 index 0000000..2bf7852 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_libc.c @@ -0,0 +1,164 @@ +/* + Include section +*/ + +#include "ammunition_stdio.h" +#include "ammunition_stdlib.h" +#include "ammunition_string.h" + +/* + Standard library functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +char +ammunition_isdigit(unsigned char c) { + if ((c >= '0') & (c <= '9')) + return 1; + else + return 0; +} + +int +ammunition_isspace(int c) { + return (c == ' ') | (c == '\t') | (c == '\n') | (c == '\r'); +} + +void * +ammunition_memcpy(void *dest, const void *src, size_t size) { + size_t i; + __pragma_loopbound(2, 6); + for (i = 0; i < size; i++) + ((unsigned char *) dest)[i] = ((unsigned char *) src)[i]; + + return dest; +} + +void * +ammunition_memset(void *s, int c, size_t n) { + size_t i; + __pragma_loopbound(0, 4); + for (i = 0; i < n; i++) + ((unsigned char *) s)[i] = (unsigned char) c; + + return s; +} + +int +ammunition_memcmp(const void *mem1, const void *mem2, size_t size) { + const unsigned char *p1 = (const unsigned char *) mem1, + *p2 = (const unsigned char *) mem2; + __pragma_loopbound(0, 4); + while (size--) + if (*p1 != *p2) + return (*p1 - *p2); + else + p1++, p2++; + return 0; +} + +/* The following function is an analog of standard C function + `memmove'. The function returns the first operand. */ + +void * +ammunition_memmove(void *s1, const void *s2, size_t n) { + int i; + + if (((char *) s1 < (char *) s2 && (char *) s1 + n <= (char *) s2) || + ((char *) s2 < (char *) s1 && (char *) s2 + n <= (char *) s1)) + return (void *) ammunition_memcpy(s1, s2, n); + if ((char *) s1 < (char *) s2 && (char *) s1 + n > (char *) s2) { + __pragma_loopbound(0, 4); + for (i = 0; (size_t) i < n; i++) + ((char *) s1)[i] = ((char *) s2)[i]; + } else { + __pragma_loopbound(0, 4); + for (i = n - 1; i >= 0; i--) + ((char *) s1)[i] = ((char *) s2)[i]; + } + return s1; +} + +int +ammunition_strcmp(const char *str1, const char *str2) { + __pragma_loopbound(1, 11); + while (*str1 && (*str1 == *str2)) + str1++, str2++; + return *(const unsigned char *) str1 - *(const unsigned char *) str2; +} + +int +ammunition_atoi(const char *str) { + int result = 0; + int sign = (str[0] == '-' ? -1 : 1); + + int readingPos = 0; + if (str[0] == '-' || str[0] == '+') + readingPos++; + __pragma_loopbound(1, 7); + do { + result *= 10; + result += str[readingPos++] - 48; + } while (str[readingPos] != 0); + + return sign * result; +} + +int +ammunition_sprintf_d(char *s, int number) { + /* How many decimal digits do we need? */ + char digits = 0; + unsigned char writePos = 0; + long long copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + digits++; + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + writePos = digits; + if (number < 0) { + writePos++; + s[0] = '-'; + } + s[writePos] = 0; + + copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + s[--writePos] = + 48 + ((copyOfNumber >= 0 ? copyOfNumber : -copyOfNumber) % 10); + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + return digits + (number < 0 ? 1 : 0); +} + +int +ammunition_sprintf_u(char *s, unsigned int number) { + /* How many decimal digits do we need? */ + char digits = 0; + unsigned char writePos = 0; + unsigned long long copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + digits++; + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + writePos = digits; + s[writePos] = 0; + + copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + s[--writePos] = 48 + (copyOfNumber % 10); + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + return digits; +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_limits.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_limits.h new file mode 100644 index 0000000..300b31d --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_limits.h @@ -0,0 +1,36 @@ + +#ifndef AMMUNITION_LIMITS_H +#define AMMUNITION_LIMITS_H + +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif +#ifndef UCHAR_MAX +#define UCHAR_MAX 255 +#endif +#ifndef SCHAR_MAX +#define SCHAR_MAX 127 +#endif +#ifndef SCHAR_MIN +#define SCHAR_MIN (-128) +#endif +#ifndef USHRT_MAX +#define USHRT_MAX 65535 +#endif +#ifndef SHRT_MAX +#define SHRT_MAX 32767 +#endif +#ifndef SHRT_MIN +#define SHRT_MIN (-32768) +#endif +#ifndef UINT_MAX +#define UINT_MAX (INT_MAX * 2U + 1) +#endif +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif +#ifndef INT_MIN +#define INT_MIN (-INT_MAX - 1) +#endif + +#endif /* #ifndef AMMUNITION_LIMITS_H */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdio.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdio.h new file mode 100644 index 0000000..5783968 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdio.h @@ -0,0 +1,9 @@ + +#ifndef AMMUNITION_STDIO_H +#define AMMUNITION_STDIO_H + +int ammunition_sprintf_d(char *s, int number); + +int ammunition_sprintf_u(char *s, unsigned int number); + +#endif diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdlib.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdlib.h new file mode 100644 index 0000000..8930f91 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_stdlib.h @@ -0,0 +1,7 @@ + +#ifndef AMMUNITION_STDLIB_H +#define AMMUNITION_STDLIB_H + +int ammunition_atoi(const char *str); + +#endif diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_string.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_string.h new file mode 100644 index 0000000..d83f1f0 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/ammunition_string.h @@ -0,0 +1,17 @@ + +#ifndef AMMUNITION_STRING_H +#define AMMUNITION_STRING_H + +typedef unsigned int size_t; + +/* + Forward declaration of functions +*/ + +void *ammunition_memcpy(void *, const void *, size_t); +void *ammunition_memset(void *, int, size_t); +int ammunition_memcmp(const void *mem1, const void *mem2, size_t size); +void *ammunition_memmove(void *s1, const void *s2, size_t n); +int ammunition_strcmp(const char *str1, const char *str2); + +#endif /* AMMUNITION_STRING_H */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.c new file mode 100644 index 0000000..6606eb2 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.c @@ -0,0 +1,1310 @@ +/* + FILE NAME: arithm.c + + TITLE: Package for arbitrary precision integer arithmetic + + DESCRIPTION: This abstract data implements arbitrary precision + integer and unsigned integer numbers by machine independent + way. The implementation of the package functions are not + sufficiently efficient in order to use for run-time. The + package functions are oriented to implement constant-folding in + compilers. This package is necessary because host machine may + not support such arithmetic for target machine. For example, + VAX does not support does not support more 32-bits integer + numbers arithmetic. The numbers are represented by bytes in + big endian mode, negative integer numbers are represented in + complementary code. All sizes are given in bytes and must be + positive. Results of executions of all functions can coincide + with a operand(s). All functions of addition, subtraction, + multiplication, division, evaluation of remainder, shift, + changing size and transformation of string into number fix + overflow. The overflow is fixed when result can not be + represented by number of given size. + +*/ + +#include "arithm.h" +#include "ammunition_string.h" + +/* This variable can have only two values 0 or 1. The value `1' + corresponds to overflow. The variable value are modified by all + functions of addition, subtract, multiplication, division, + evaluation of remainder, shift, changing size and transformation of + string into number fix overflow. */ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int ammunition_overflow_bit; + +/* The following function adds unsigned integers. The function + returns 1 if unsigned integer overflow is fixed, 0 otherwise. + Result can be placed in any operand. */ + +int +ammunition_add_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int digit_num; + int carry; + unsigned int sum; + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + sum = (((unsigned char *) op1)[digit_num] + + ((unsigned char *) op2)[digit_num] + carry); + if (sum > UCHAR_MAX) { + sum -= UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ((unsigned char *) result)[digit_num] = sum; + } + return carry != 0; +} + +/* The following function adds unsigned integers. The function + returns 1 if unsigned integer overflow (the first operand is less + than the second) is fixed, 0 otherwise. Result can be placed in + any operand. */ + +int +ammunition_subtract_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int digit_num; + int carry; + int subtraction; + + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + subtraction = (((unsigned char *) op1)[digit_num] - + ((unsigned char *) op2)[digit_num] - carry); + if (subtraction < 0) { + subtraction += UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ((unsigned char *) result)[digit_num] = subtraction; + } + return carry != 0; +} + +/* The following function makes complementary code of number. Result + can be placed in operand. */ + +void +ammunition_make_complementary_code(int size, const void *operand, + void *result) { + int digit_num; + int carry; + int subtraction; + + __pragma_loopbound(2, 6); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + subtraction = (0 - ((unsigned char *) operand)[digit_num] - carry); + if (subtraction != 0) { + subtraction += UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ((unsigned char *) result)[digit_num] = subtraction; + } +} + +/* The following function multiplys unsigned integer by digit (byte + size). The function returns 1 if unsigned integer overflow is + fixed, 0 otherwise. */ + +int +ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + int size, void *operand, unsigned int digit) { + int digit_num; + unsigned int carry; + unsigned int sum; + + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + sum = (((unsigned char *) operand)[digit_num] * digit + carry); + if (sum > UCHAR_MAX) { + carry = sum / (UCHAR_MAX + 1); + sum %= UCHAR_MAX + 1; + } else + carry = 0; + ((unsigned char *) operand)[digit_num] = sum; + } + return carry != 0; +} + +/* Originally reaction on all integer and unsigned integer overflow is + equal to the following function. The function does nothing. */ + +void +ammunition_arithmetic_overflow_reaction(void) {} + +/* Originally reaction on all integer and unsigned integer overflow is + equal to the following function. The function does nothing. */ + +void +ammunition_arithmetic_unsigned_overflow_reaction(void) {} + +/* This page contains functions for arbitrary precision addition. */ + +/* The function adds unsigned integers and fixes overflow reaction if + it is needed. The function makes this with the aid of function + `add_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_add_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_add_unsigned_integer_without_overflow_reaction(size, op1, + op2, result); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function adds integers and fixes overflow reaction if it is + needed. The function makes this with the aid of function + `add_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_add_integer(int size, const void *op1, const void *op2, + void *result) { + int op1_sign; + int sign_equality; + + op1_sign = INTEGER_SIGN(op1); + sign_equality = INTEGER_SIGN(op1) == INTEGER_SIGN(op2); + ammunition_add_unsigned_integer_without_overflow_reaction(size, op1, op2, + result); + ammunition_overflow_bit = + sign_equality && (op1_sign != INTEGER_SIGN(result)); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision subtraction. */ + +/* The function subtracts unsigned integers and fixes overflow + reaction if it is needed. The function makes this with the aid of + function `subtract_unsigned_integer_without_overflow_reaction'. + Result can be placed in any operand. */ + +void +ammunition_subtract_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_subtract_unsigned_integer_without_overflow_reaction( + size, op1, op2, result); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function subtracts integers and fixes overflow reaction if it + is needed. The function makes this with the aid of function + `subtract_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +void +ammunition_subtract_integer(int size, const void *op1, const void *op2, + void *result) { + int op1_sign; + int sign_unequality; + + op1_sign = INTEGER_SIGN(op1); + sign_unequality = INTEGER_SIGN(op1) != INTEGER_SIGN(op2); + ammunition_subtract_unsigned_integer_without_overflow_reaction(size, op1, + op2, result); + ammunition_overflow_bit = + sign_unequality && (op1_sign != INTEGER_SIGN(result)); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision multiplication. */ + +/* The following function multiplys unsigned integers. The function + returns 1 if unsigned integer overflow is fixed, 0 otherwise. + Result can be placed in any operand. */ + +int +ammunition_multiply_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int op1_digit_num; + int op2_digit_num; + int carry; + unsigned long long int partial_sum; + int result_digit_number; + int overflow_flag; + unsigned char long_result[2 * MAX_INTEGER_OPERAND_SIZE]; + + ammunition_memset(long_result + size, 0, (size_t) size); + __pragma_loopbound(4, 4); + for (op2_digit_num = size - 1; op2_digit_num >= 0; op2_digit_num--) { + if (((unsigned char *) op2)[op2_digit_num] != 0) { + __pragma_loopbound(4, 4); + for (op1_digit_num = size - 1, carry = 0; op1_digit_num >= 0; + op1_digit_num--) { + partial_sum = + (((unsigned char *) op1)[op1_digit_num] * + ((unsigned char *) op2)[op2_digit_num] + + long_result[op1_digit_num + op2_digit_num + 1] + carry); + long_result[op1_digit_num + op2_digit_num + 1] = + (unsigned char) (partial_sum % (UCHAR_MAX + 1)); + carry = partial_sum / (UCHAR_MAX + 1); + } + long_result[op2_digit_num] = carry; + } else + long_result[op2_digit_num] = 0; + } + overflow_flag = 0; + __pragma_loopbound(0, 4); + for (result_digit_number = size - 1; result_digit_number >= 0; + result_digit_number--) { + if (long_result[result_digit_number] != 0) { + overflow_flag = 1; + break; + } + } + ammunition_memcpy(result, long_result + size, (size_t) size); + return overflow_flag; +} + +/* The following function multiplys unsigned integers and fixes + overflow reaction if it is needed. The function makes this with + the aid of function + `multiply_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +void +ammunition_multiply_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_multiply_unsigned_integer_without_overflow_reaction( + size, op1, op2, result); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function multiplys integers and fixes overflow reaction if it + is needed. The function makes this with the aid of function + `multiply_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +void +ammunition_multiply_integer(int size, const void *op1, const void *op2, + void *result) { + int negative_result_flag; + unsigned char op1_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned char op2_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned const char *abs_op1; + unsigned const char *abs_op2; + int unsigned_result_sign; + + negative_result_flag = INTEGER_SIGN(op1) != INTEGER_SIGN(op2); + if (INTEGER_SIGN(op1)) { + /* May be integer overflow. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code(size, op1, op1_complementary); + abs_op1 = (unsigned const char *) op1_complementary; + } else + abs_op1 = (unsigned const char *) op1; + if (INTEGER_SIGN(op2)) { + /* May be integer overflow. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code(size, op2, op2_complementary); + abs_op2 = (unsigned const char *) op2_complementary; + } else + abs_op2 = (unsigned const char *) op2; + ammunition_overflow_bit = + ammunition_multiply_unsigned_integer_without_overflow_reaction( + size, abs_op1, abs_op2, result); + unsigned_result_sign = INTEGER_SIGN(result); + if (negative_result_flag) + ammunition_make_complementary_code(size, result, result); + if (unsigned_result_sign && + (!negative_result_flag || INTEGER_SIGN(result) != unsigned_result_sign)) + /* Unsigned result can not be represented as integer. */ + ammunition_overflow_bit = 1; + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision division. */ + +/* The following function divides unsigned integers. The function + returns 1 if unsigned integer overflow (division by zero) is fixed, + 0 otherwise. Result can be placed in any operand. See algorithm + in Knuth's book. */ + +int +ammunition_divide_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int scaled_op1_digit_num; + unsigned int q_approximation; + int first_nonzero_digit_number; + int op2_digit_number; + unsigned int scale; + unsigned char scaled_op1[MAX_INTEGER_OPERAND_SIZE + 1]; + unsigned char normalized_op2[MAX_INTEGER_OPERAND_SIZE]; + unsigned char extended_normalized_op2[MAX_INTEGER_OPERAND_SIZE + 1]; + + __pragma_loopbound(3, 4); + for (op2_digit_number = 0; op2_digit_number < size; op2_digit_number++) { + if (((unsigned char *) op2)[op2_digit_number] != 0) + break; + } + first_nonzero_digit_number = op2_digit_number; + if (first_nonzero_digit_number == size) { + /* Zero divisor */ + ammunition_memset(result, 0, (size_t) size); + return 1 /* TRUE */; + } else if (first_nonzero_digit_number == size - 1) { + /* Division by digit. */ + int digit_num; + int digit; + unsigned long long divisable; + unsigned long long remainder; + + digit = ((unsigned char *) op2)[first_nonzero_digit_number]; + ammunition_memcpy(result, op1, (size_t) size); + remainder = 0; + __pragma_loopbound(4, 4); + for (digit_num = 0; digit_num < size; digit_num++) { + divisable = (remainder * (UCHAR_MAX + 1) + + ((unsigned char *) result)[digit_num]); + remainder = divisable % digit; + ((unsigned char *) result)[digit_num] = + (unsigned char) (divisable / digit); + } + return 0 /* FALSE */; + } + /* Normalization of divisor. */ + scale = (UCHAR_MAX + 1) / (((unsigned char *) op2)[op2_digit_number] + 1); + ammunition_memcpy(scaled_op1 + 1, op1, (size_t) size); + *scaled_op1 = 0; + + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size + 1, scaled_op1, scale); + + ammunition_memcpy(normalized_op2, op2, (size_t) size); + + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size, normalized_op2, scale); + + __pragma_loopbound(0, 0); + for (scaled_op1_digit_num = 0; + scaled_op1_digit_num <= first_nonzero_digit_number; + scaled_op1_digit_num++) { + /* Division of `scaled_op1[ scaled_op1_digit_number ]..scaled_op1[ size + ]' by `normalized_op2[ first_nonzero_digit_number ]..normalized_op2[ + size-1 ]' for evaluation of one digit of quotient `result[ + size-1-first_nonzero_digit_number-scaled_op1_digit_number ]'. + */ + if (scaled_op1[scaled_op1_digit_num] == + normalized_op2[first_nonzero_digit_number]) + q_approximation = UCHAR_MAX; + else + q_approximation = + (scaled_op1[scaled_op1_digit_num] * (UCHAR_MAX + 1) + + scaled_op1[scaled_op1_digit_num + 1]) / + normalized_op2[first_nonzero_digit_number]; + + __pragma_loopbound(0, 0); + while (normalized_op2[first_nonzero_digit_number + 1] * + q_approximation > + (((unsigned long long int) scaled_op1[scaled_op1_digit_num] * + (UCHAR_MAX + 1) + + scaled_op1[scaled_op1_digit_num + 1] - + q_approximation * normalized_op2[first_nonzero_digit_number]) * + (UCHAR_MAX + 1) + + scaled_op1[scaled_op1_digit_num + 2])) + q_approximation--; + + /* Multiply and subtract */ + ammunition_memcpy(extended_normalized_op2 + 1, + normalized_op2 + first_nonzero_digit_number, + (size_t) (size - first_nonzero_digit_number)); + *extended_normalized_op2 = 0; + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size - first_nonzero_digit_number + 1, extended_normalized_op2, + q_approximation); + if (ammunition_subtract_unsigned_integer_without_overflow_reaction( + size - first_nonzero_digit_number + 1, + scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, + scaled_op1 + scaled_op1_digit_num)) { + /* Negative result. Compensation by addition. */ + q_approximation--; + ammunition_memcpy(extended_normalized_op2 + 1, + normalized_op2 + first_nonzero_digit_number, + (size_t) (size - first_nonzero_digit_number)); + *extended_normalized_op2 = 0; + + ammunition_add_unsigned_integer_without_overflow_reaction( + size - first_nonzero_digit_number + 1, + scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, + scaled_op1 + scaled_op1_digit_num); + } + ((unsigned char *) result)[size - 1 - first_nonzero_digit_number + + scaled_op1_digit_num] = q_approximation; + } + ammunition_memset(result, 0, + (size_t) (size - 1 - first_nonzero_digit_number)); + return 0 /* TRUE */; +} + +/* The function divides unsigned integers and fixes overflow reaction + if it is needed. The function makes this with the aid of function + `divide_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_divide_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_divide_unsigned_integer_without_overflow_reaction( + size, op1, op2, result); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function divides integers and fixes overflow reaction if it is + needed. The function makes this with the aid of function + `divide_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +void +ammunition_divide_integer(int size, const void *op1, const void *op2, + void *result) { + int negative_result_flag; + unsigned char op1_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned char op2_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned const char *abs_op1; + unsigned const char *abs_op2; + int unsigned_result_sign; + + negative_result_flag = INTEGER_SIGN(op1) != INTEGER_SIGN(op2); + if (INTEGER_SIGN(op1)) { + /* May be integer overflow for minimal int. But result is correct + because it is unsigned. */ + ammunition_make_complementary_code(size, op1, op1_complementary); + abs_op1 = (unsigned const char *) op1_complementary; + } else + abs_op1 = (unsigned const char *) op1; + if (INTEGER_SIGN(op2)) { + /* May be integer overflow for minimal int. But result is correct + because it is unsigned. */ + ammunition_make_complementary_code(size, op2, op2_complementary); + abs_op2 = (unsigned const char *) op2_complementary; + } else + abs_op2 = (unsigned const char *) op2; + ammunition_overflow_bit = + ammunition_divide_unsigned_integer_without_overflow_reaction( + size, abs_op1, abs_op2, result); + unsigned_result_sign = INTEGER_SIGN(result); + if (negative_result_flag) + ammunition_make_complementary_code(size, result, result); + if (unsigned_result_sign && + (!negative_result_flag || INTEGER_SIGN(result) != unsigned_result_sign)) + /* Unsigned result can not be represented as integer. */ + ammunition_overflow_bit = 1; + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision evaluation of + remainder. */ + +/* The function evaluates remainder of division of unsigned integers + as `op1 - (op1/op2)*op2' and fixes overflow reaction if it is + needed. Result can be placed in any operand. */ + +void +ammunition_unsigned_integer_remainder(int size, const void *op1, + const void *op2, void *result) { + unsigned char temporary[MAX_INTEGER_OPERAND_SIZE]; + + ammunition_divide_unsigned_integer(size, op1, op2, temporary); + if (ammunition_overflow_bit) + /* Reaction on zero is called from `divide_unsigned_integer'. */ + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_multiply_unsigned_integer(size, temporary, op2, temporary); + ammunition_subtract_unsigned_integer(size, op1, temporary, result); + } +} + +/* This page contains functions for arbitrary precision number shifts. */ + +/* This function makes right shift of unsigned integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `unsigned_integer_shift_left'. The function fixes overflow when + result can not be represented by number of given size, i.e. in + other words the opposite unsigned shift (to left) results in number + not equal to source operand. Result can be placed in operand. */ + +void +ammunition_unsigned_integer_shift_right(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + + if (bits < 0) + ammunition_unsigned_integer_shift_left(size, operand, -bits, result); + else { + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = (byte_shift >= size ? 0 : size - byte_shift); + byte_number < size; byte_number++) + if (((unsigned char *) operand)[byte_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_memmove((char *) result + byte_shift, operand, + (size_t) (size - byte_shift)); + ammunition_memset(result, 0, (size_t) byte_shift); + if (bit_shift == 0) + return; + __pragma_loopbound(3, 3); + for (byte_number = byte_shift, carry = 0; byte_number < size; + byte_number++) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte >> bit_shift); + carry = (byte << (CHAR_BIT - bit_shift)) & UCHAR_MAX; + } + if (carry != 0) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + } +} + +/* This function makes right arithmetic shift of integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `integer_shift_left'. The function fixes overflow when result can + not be represented by number of given size, i.e. in other words the + opposite shift (to left) results in number not equal to source + operand. Result can be placed in operand. */ + +void +ammunition_integer_shift_right(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + int operand_sign; + + if (bits < 0) + ammunition_integer_shift_left(size, operand, -bits, result); + else { + operand_sign = INTEGER_SIGN(operand); + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = (byte_shift >= size ? 0 : size - byte_shift); + byte_number < size; byte_number++) + if (((unsigned char *) operand)[byte_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, (operand_sign ? UCHAR_MAX : 0), + (size_t) size); + else { + ammunition_memmove((char *) result + byte_shift, operand, + (size_t) (size - byte_shift)); + ammunition_memset(result, (operand_sign ? UCHAR_MAX : 0), + (size_t) byte_shift); + if (bit_shift == 0) + return; + carry = + (((operand_sign ? UCHAR_MAX : 0) << (CHAR_BIT - bit_shift)) & + UCHAR_MAX); + __pragma_loopbound(3, 3); + for (byte_number = byte_shift; byte_number < size; byte_number++) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte >> bit_shift); + carry = (byte << (CHAR_BIT - bit_shift)) & UCHAR_MAX; + } + if (carry != 0) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); + } +} + +/* This function makes left shift of unsigned integer of given size on + given number of bits. If number of bits is negative the function + makes shift to left actually with the aid of function + `unsigned_integer_shift_right'. The function fixes overflow when + result can not be represented by number of given size, i.e. i.e. in + other words the opposite shift (to right) results in number not + equal to source operand. Result can be placed in operand. */ + +void +ammunition_unsigned_integer_shift_left(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + + if (bits < 0) + ammunition_unsigned_integer_shift_right(size, operand, -bits, result); + else { + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = 0; byte_number < byte_shift && byte_number < size; + byte_number++) + if (((unsigned char *) operand)[byte_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_memmove(result, (char *) operand + byte_shift, + (size_t) (size - byte_shift)); + ammunition_memset((char *) result + (size - byte_shift), 0, + (size_t) byte_shift); + if (bit_shift == 0) + return; + __pragma_loopbound(2, 3); + for (byte_number = size - byte_shift - 1, carry = 0; + byte_number >= 0; byte_number--) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte << bit_shift); + carry = byte >> (CHAR_BIT - bit_shift); + } + if (carry != 0) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + } +} + +/* This function makes left arithmetic shift of integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `integer_shift_right'. The function fixes overflow when result can + not be represented by number of given size, i.e. in other words the + opposite shift (to right) results in number not equal to source + operand. Result can be placed in operand. */ + +void +ammunition_integer_shift_left(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + int operand_sign; + + if (bits < 0) + ammunition_integer_shift_right(size, operand, -bits, result); + else { + operand_sign = INTEGER_SIGN(operand); + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = 0; byte_number < byte_shift && byte_number < size; + byte_number++) + if (((unsigned char *) operand)[byte_number] != + (operand_sign ? UCHAR_MAX : 0)) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_memmove(result, (char *) operand + byte_shift, + (size_t) (size - byte_shift)); + ammunition_memset((char *) result + (size - byte_shift), 0, + (size_t) byte_shift); + if (bit_shift == 0) + return; + __pragma_loopbound(2, 3); + for (byte_number = size - byte_shift - 1, carry = 0; + byte_number >= 0; byte_number--) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte << bit_shift); + carry = byte >> (CHAR_BIT - bit_shift); + } + if (carry != ((unsigned) (operand_sign ? UCHAR_MAX : 0) >> + (CHAR_BIT - bit_shift))) + ammunition_overflow_bit = 1; + } + if (operand_sign != INTEGER_SIGN(result)) + ammunition_overflow_bit = 1; + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); + } +} + +/* This page contains functions for bitwise operations of arbitrary + precision numbers. */ + +/* This function makes bitwise `or' of two integers of given size. */ + +void +ammunition_integer_or(int size, const void *op1, const void *op2, + void *result) { + int byte_number; + + __pragma_loopbound(4, 4); + for (byte_number = 0; byte_number < size; byte_number++) { + ((unsigned char *) result)[byte_number] = + ((unsigned char *) op1)[byte_number] | + ((unsigned char *) op2)[byte_number]; + } +} + +/* This function makes bitwise `or' of two unsigned integers of given + size. */ + +void +ammunition_unsigned_integer_or(int size, const void *op1, const void *op2, + void *result) { + ammunition_integer_or(size, op1, op2, result); +} + +/* This function makes bitwise `and' of two integers of given size. */ + +void +ammunition_integer_and(int size, const void *op1, const void *op2, + void *result) { + int byte_number; + + __pragma_loopbound(4, 4); + for (byte_number = 0; byte_number < size; byte_number++) { + ((unsigned char *) result)[byte_number] = + ((unsigned char *) op1)[byte_number] & + ((unsigned char *) op2)[byte_number]; + } +} + +/* This function makes bitwise `and' of two unsigned integers of given + size. */ + +void +ammunition_unsigned_integer_and(int size, const void *op1, const void *op2, + void *result) { + ammunition_integer_and(size, op1, op2, result); +} + +/* This function makes bitwise `not' of integer of given size. */ + +void +ammunition_integer_not(int size, const void *operand, void *result) { + int byte_number; + + __pragma_loopbound(4, 4); + for (byte_number = 0; byte_number < size; byte_number++) { + ((unsigned char *) result)[byte_number] = + ((unsigned char *) operand)[byte_number] ^ UCHAR_MAX; + } +} + +/* This function makes bitwise `not' of unsigned integer of given + size. */ + +void +ammunition_unsigned_integer_not(int size, const void *operand, void *result) { + ammunition_integer_not(size, operand, result); +} + +/* This page contains functions for comparison of arbitrary precision + numbers. */ + +/* This function compares two unsigned integers of given size on + equality. The function returns 1 if unsigned integers are equal, 0 + otherwise. */ + +int +ammunition_eq_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) == 0; +} + +/* This function compares two integers of given size on equality. The + function returns 1 if integers are equal, 0 otherwise. */ + +int +ammunition_eq_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) == 0; +} + +/* This function compares two unsigned integers of given size on + inequality. The function returns 1 if unsigned integers are not + equal, 0 otherwise. */ + +int +ammunition_ne_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) != 0; +} + +/* This function compares two integers of given size on inequality. + The function returns 1 if integers are not equal, 0 otherwise. */ + +int +ammunition_ne_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) != 0; +} + +/* This function compares two memory parts of given size on that the + first operand is greater than the second. The bytes are described + as unsigned. The function returns 1 if the first operand is + greater than the second, - 1 if the first operand is less than the + second, 0 otherwise. */ + +int +ammunition_bytes_comparison(const void *op1, const void *op2, int size) { + const unsigned char *str1 = (unsigned const char *) op1; + const unsigned char *str2 = (unsigned const char *) op2; + + __pragma_loopbound(1, 4); + while (size > 0 && *str1 == *str2) { + str1++; + str2++; + size--; + } + if (size <= 0) + return 0; + else if (*str1 > *str2) + return 1; + else + return -1; +} + +/* This function compares two unsigned integers of given size on that + the first operand is greater than the second. The function returns + 1 if the first unsigned integer is greater than the second, 0 + otherwise. */ + +int +ammunition_gt_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) > 0; +} + +/* This function compares two integers of given size on that the first + operand is greater than the second. The function returns 1 if the + first integer is greater than the second, 0 otherwise. */ + +int +ammunition_gt_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) > 0; + else + return 1; /* TRUE */ + } else if (INTEGER_SIGN(op2) == 0) + return 0; /*FALSE*/ + else + return ammunition_bytes_comparison(op1, op2, size) > 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is less than the second. The function returns 1 + if the first unsigned integer is less than the second, 0 + otherwise. */ + +int +ammunition_lt_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) < 0; +} + +/* This function compares two integers of given size on that the first + operand is less than the second. The function returns 1 if the + first integer is less than the second, 0 otherwise. */ + +int +ammunition_lt_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) < 0; + else + return 0; /*FALSE*/ + } else if (INTEGER_SIGN(op2) == 0) + return 1; /* TRUE */ + else + return ammunition_bytes_comparison(op1, op2, size) < 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is greater than or equal to the second. The + function returns 1 if the first unsigned integer is greater than or + equal to the second, 0 otherwise. */ + +int +ammunition_ge_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) >= 0; +} + +/* This function compares two integers of given size on that the first + operand is greater than or equal to the second. The function + returns 1 if the first integer is greater than or equal to the + second, 0 otherwise. */ + +int +ammunition_ge_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) >= 0; + else + return 1; /* TRUE */ + } else if (INTEGER_SIGN(op2) == 0) + return 0; /*FALSE*/ + else + return ammunition_bytes_comparison(op1, op2, size) >= 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is less than or equal to the second. The + function returns 1 if the first unsigned integer is less than or + equal to the second, 0 otherwise. */ + +int +ammunition_le_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) <= 0; +} + +/* This function compares two integers of given size on that the first + operand is less than or equal to the second. The function returns + 1 if the first integer is less than or equal to the second, 0 + otherwise. */ + +int +ammunition_le_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) <= 0; + else + return 0; /*FALSE*/ + } else if (INTEGER_SIGN(op2) == 0) + return 1; /* TRUE */ + else + return ammunition_bytes_comparison(op1, op2, size) <= 0; +} + +/* This page contains functions for changing size of arbitrary + precision numbers. */ + +/* The function changes size of unsigned integer. The function fixes + overflow when result can not be represented by number of given + size. Result can be placed in operand. */ + +void +ammunition_change_unsigned_integer_size(int operand_size, const void *operand, + int result_size, void *result) { + int operand_digit_number; + + ammunition_overflow_bit = 0; + if (operand_size <= result_size) { + ammunition_memmove((char *) result + result_size - operand_size, + operand, (size_t) operand_size); + ammunition_memset(result, 0, (size_t) (result_size - operand_size)); + } else { + __pragma_loopbound(1, 2); + for (operand_digit_number = 0; + operand_digit_number < operand_size - result_size; + operand_digit_number++) { + if (((unsigned char *) operand)[operand_digit_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + } + ammunition_memmove(result, + (char *) operand + operand_size - result_size, + (size_t) result_size); + } + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function changes size of integer. The function fixes overflow + when result can not be represented by number of given size. Result + can be placed in operand. */ + +void +ammunition_change_integer_size(int operand_size, const void *operand, + int result_size, void *result) { + int operand_digit_number; + int operand_sign; + + ammunition_overflow_bit = 0; + operand_sign = INTEGER_SIGN(operand); + if (operand_size <= result_size) { + ammunition_memmove((char *) result + result_size - operand_size, + operand, (size_t) operand_size); + ammunition_memset(result, (operand_sign ? UCHAR_MAX : 0), + (size_t) (result_size - operand_size)); + } else { + __pragma_loopbound(2, 2); + for (operand_digit_number = 0; + operand_digit_number < operand_size - result_size; + operand_digit_number++) { + if (((unsigned char *) operand)[operand_digit_number] != + (operand_sign ? UCHAR_MAX : 0)) { + ammunition_overflow_bit = 1; + break; + } + } + ammunition_memmove(result, + (char *) operand + operand_size - result_size, + (size_t) result_size); + if (operand_sign != INTEGER_SIGN(result)) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for conversion of arbitrary precision + numbers to ascii representation. */ + +/* This function transforms unsigned integer of given size to BASE + ascii representation. BASE should be between 2 and 36 including + them. Digits more 9 are represented by 'a', 'b' etc. Sign is + absent in result string. The function returns the result + string. */ + +char * +ammunition_unsigned_integer_to_based_string(int size, const void *operand, + int base, char *result) { + int digit_num; + int i; + unsigned long long divisable; + unsigned long long remainder; + int nonzero_flag; + int length; + int temporary; + unsigned char operand_copy[MAX_INTEGER_OPERAND_SIZE]; + + ammunition_memcpy(operand_copy, operand, (size_t) size); + length = 0; + __pragma_loopbound(1, 10); + do { + nonzero_flag = 0 /* FALSE */; + __pragma_loopbound(2, 6); + for (digit_num = 0, remainder = 0; digit_num < size; digit_num++) { + divisable = remainder * (UCHAR_MAX + 1) + operand_copy[digit_num]; + remainder = divisable % base; + operand_copy[digit_num] = (unsigned char) (divisable / base); + if (operand_copy[digit_num] != 0) + nonzero_flag = 1 /* TRUE */; + } + result[length++] = + (unsigned char) (remainder < 10 ? '0' + remainder + : 'a' + remainder - 10); + } while (nonzero_flag); + result[length] = '\0'; + __pragma_loopbound(0, 5); + for (i = 0; i < length / 2; i++) { + temporary = result[i]; + result[i] = result[length - i - 1]; + result[length - i - 1] = temporary; + } + return result; +} + +/* This function transforms unsigned integer of given size to decimal + ascii representation. Sign is absent in result string. The + function returns the result string. */ + +char * +ammunition_unsigned_integer_to_string(int size, const void *operand, + char *result) { + return ammunition_unsigned_integer_to_based_string(size, operand, 10, + result); +} + +/* This function transforms integer of given size to BASE ascii + representation. BASE should be between 2 and 36 including them. + Digits more 9 are represented by 'a', 'b' etc. Sign is present in + result string only for negative numbers. The function returns the + result string. */ + +char * +ammunition_integer_to_based_string(int size, const void *operand, int base, + char *result) { + unsigned char operand_copy[MAX_INTEGER_OPERAND_SIZE]; + + if (!INTEGER_SIGN(operand)) + return ammunition_unsigned_integer_to_based_string(size, operand, base, + result); + ammunition_memcpy(operand_copy, operand, (size_t) size); + /* May be integer overflow. But result is correct because it is unsigned. */ + ammunition_make_complementary_code(size, operand_copy, operand_copy); + *result = '-'; + ammunition_unsigned_integer_to_based_string(size, operand_copy, base, + result + 1); + return result; +} + +/* This function transforms integer of given size to decimal ascii + representation. Sign is present in result string only for negative + numbers. The function returns the result string. */ + +char * +ammunition_integer_to_string(int size, const void *operand, char *result) { + return ammunition_integer_to_based_string(size, operand, 10, result); +} + +/* This page contains functions for conversion of decimal ascii + representation to arbitrary precision numbers. */ + +/* The function adds digit (byte size) to unsigned integer. The + function returns 1 if unsigned integer overflow is fixed, 0 + otherwise. */ + +int +ammunition_add_digit_to_unsigned_integer_without_overflow_reaction( + int size, void *operand, unsigned int digit) { + int digit_num; + unsigned int carry; + unsigned int sum; + + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = digit; digit_num >= 0; digit_num--) { + sum = ((unsigned char *) operand)[digit_num] + carry; + if (sum > UCHAR_MAX) { + carry = sum / (UCHAR_MAX + 1); + sum %= UCHAR_MAX + 1; + } else + carry = 0; + ((unsigned char *) operand)[digit_num] = sum; + } + return carry != 0; +} + +/* This function transforms source string (decimal ascii + representation without sign) to given size unsigned integer and + returns pointer to first non digit in the source string through a + parameter. If the string started with invalid integer + representation the result will be zero and returns the operand + through the parameter. The function returns 1 if unsigned integer + overflow is fixed, 0 otherwise. */ + +int +ammunition_string_to_unsigned_integer_without_overflow_reaction( + int size, const char *operand, void *result, char **first_nondigit) { + int overflow_flag; + + ammunition_memset(result, 0, (size_t) size); + __pragma_loopbound(1, 10); + for (overflow_flag = 0; ammunition_isdigit(*operand); operand++) { + overflow_flag = + overflow_flag || + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size, result, 10); + overflow_flag = + overflow_flag || + ammunition_add_digit_to_unsigned_integer_without_overflow_reaction( + size, result, *operand - '0'); + } + *first_nondigit = (char *) operand; + return overflow_flag; +} + +/* This function skips all white spaces at the begin of source string + and transforms tail of the source string (decimal ascii + representation without sign) to given size unsigned integer with + the aid of function + `string_to_unsigned_integer_without_overflow_reaction'. If the + string started with invalid unsigned integer representation the + result will be zero. The function fixes overflow when result can + not be represented by number of given size. The function returns + address of the first nondigit in the source string. */ + +char * +ammunition_unsigned_integer_from_string(int size, const char *operand, + void *result) { + char *first_nondigit; + + __pragma_loopbound(0, 0); + while (ammunition_isspace(*operand)) + operand++; + ammunition_overflow_bit = + ammunition_string_to_unsigned_integer_without_overflow_reaction( + size, operand, result, &first_nondigit); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + return first_nondigit; +} + +/* This function skips all white spaces at the begin of source string + and transforms tail of the source string (decimal ascii + representation with possible sign `+' or `-') to given size integer + with the aid of function + `string_to_unsigned_integer_without_overflow_reaction'. If the + string started with invalid integer representation the result will + be zero. The function fixes overflow when result can not be + represented by number of given size. the function returns Address + of the first nondigit in the source string. */ + +char * +ammunition_integer_from_string(int size, const char *operand, void *result) { + int negative_number_flag; + char *first_nondigit; + int unsigned_result_sign; + + __pragma_loopbound(0, 0); + while (ammunition_isspace(*operand)) + operand++; + negative_number_flag = 0; /* FALSE */ + if (*operand == '+') + operand++; + else if (*operand == '-') { + operand++; + negative_number_flag = 1; /* TRUE */ + } + ammunition_overflow_bit = + ammunition_string_to_unsigned_integer_without_overflow_reaction( + size, operand, result, &first_nondigit); + unsigned_result_sign = INTEGER_SIGN(result); + if (negative_number_flag) + /* May be integer overflow when `result' is correct. But result + is correct because it is unsigned. */ + ammunition_make_complementary_code(size, result, result); + ammunition_overflow_bit = ammunition_overflow_bit || + (unsigned_result_sign && + (!negative_number_flag || + INTEGER_SIGN(result) != unsigned_result_sign)); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + return first_nondigit; +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.h new file mode 100644 index 0000000..40c9bc6 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/arithm.h @@ -0,0 +1,105 @@ +/* + FILE NAME: arithm.h + + TITLE: Include file of package for arbitrary precision integer + arithmetic + + DESCRIPTION: This header file contains ANSI C prototype definitions of + the package functions and definitions of external + variable of the package and C++ classes for arbitrary + precision integer arithmetic. + +*/ + +#ifndef __ARITHMETIC__ +#define __ARITHMETIC__ + +#include "ammunition_limits.h" + +/* This page contains definitions of variables and macros common for + all package functions. */ + +/* The value of macro is suggested to be maximum length of integer operands + The length of use integers should be not greater than this value. */ + +#define MAX_INTEGER_OPERAND_SIZE 128 + +/* The following macro value is sign of integer number (0 or 1) given + as macro parameter. */ + +#define INTEGER_SIGN(operand) (*(unsigned char *) (operand) >> (CHAR_BIT - 1)) + +extern int ammunition_overflow_bit; + +void ammunition_add_unsigned_integer(int size, const void *op1, const void *op2, + void *result); +void ammunition_add_integer(int size, const void *op1, const void *op2, + void *result); +void ammunition_subtract_unsigned_integer(int size, const void *op1, + const void *op2, void *result); +void ammunition_subtract_integer(int size, const void *op1, const void *op2, + void *result); +void ammunition_multiply_unsigned_integer(int size, const void *op1, + const void *op2, void *result); +void ammunition_multiply_integer(int size, const void *op1, const void *op2, + void *result); +void ammunition_divide_unsigned_integer(int size, const void *op1, + const void *op2, void *result); +void ammunition_divide_integer(int size, const void *op1, const void *op2, + void *result); +void ammunition_unsigned_integer_remainder(int size, const void *op1, + const void *op2, void *result); + +void ammunition_unsigned_integer_shift_right(int size, const void *operand, + int bits, void *result); +void ammunition_integer_shift_right(int size, const void *operand, int bits, + void *result); +void ammunition_integer_shift_left(int size, const void *operand, int bits, + void *result); +void ammunition_unsigned_integer_shift_left(int size, const void *operand, + int bits, void *result); + +void ammunition_integer_or(int size, const void *op1, const void *op2, + void *result); +void ammunition_unsigned_integer_or(int size, const void *op1, const void *op2, + void *result); +void ammunition_integer_and(int size, const void *op1, const void *op2, + void *result); +void ammunition_unsigned_integer_and(int size, const void *op1, const void *op2, + void *result); +void ammunition_integer_not(int size, const void *operand, void *result); +void ammunition_unsigned_integer_not(int size, const void *operand, + void *result); + +int ammunition_eq_unsigned_integer(int size, const void *op1, const void *op2); +int ammunition_eq_integer(int size, const void *op1, const void *op2); +int ammunition_ne_unsigned_integer(int size, const void *op1, const void *op2); +int ammunition_ne_integer(int size, const void *op1, const void *op2); +int ammunition_gt_unsigned_integer(int size, const void *op1, const void *op2); +int ammunition_gt_integer(int size, const void *op1, const void *op2); +int ammunition_lt_unsigned_integer(int size, const void *op1, const void *op2); +int ammunition_lt_integer(int size, const void *op1, const void *op2); +int ammunition_ge_unsigned_integer(int size, const void *op1, const void *op2); +int ammunition_ge_integer(int size, const void *op1, const void *op2); +int ammunition_le_unsigned_integer(int size, const void *op1, const void *op2); +int ammunition_le_integer(int size, const void *op1, const void *op2); + +void ammunition_change_unsigned_integer_size(int operand_size, + const void *operand, + int result_size, void *result); +void ammunition_change_integer_size(int operand_size, const void *operand, + int result_size, void *result); + +char *ammunition_unsigned_integer_to_string(int size, const void *operand, + char *result); +char *ammunition_integer_to_string(int size, const void *operand, char *result); + +char *ammunition_unsigned_integer_from_string(int size, const char *operand, + void *result); +char *ammunition_integer_from_string(int size, const char *operand, + void *result); + +char ammunition_isdigit(unsigned char c); +int ammunition_isspace(int c); + +#endif /* #ifndef __ARITHMETIC__ */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.c new file mode 100644 index 0000000..3e7c6c0 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.c @@ -0,0 +1,305 @@ +/* + + FILE NAME: bits.c + + TITLE: Package for work with bits + + DESCRIPTION: This file implements functions of the package for work + with bit strings. A bit is given by address (start address) of + byte from which counting bits starts and its displacement which + is any non negative number of bit from the start address. The + most significant bit of the start address byte has number 0. + The bit string is given by its first bit and its length in + bits. + +*/ + +#include "bits.h" + +/* This function determines that given bit string contains only zero + bits. The function retruns TRUE if all bits of given bit string + are zero or `bit_length' <= 0. Value of `bit_displacement' must be + non-negative and can be greater than CHAR_BIT. */ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int +ammunition_is_zero_bit_string(const void *start_byte, int bit_displacement, + int bit_length) { + const unsigned char *current_byte = (unsigned const char *) start_byte; + + if (bit_length <= 0) + return 1 /* TRUE */; + current_byte += bit_displacement / CHAR_BIT; + bit_displacement %= CHAR_BIT; + if (bit_length < CHAR_BIT - bit_displacement) + return (((*current_byte << bit_displacement) & + (UCHAR_MAX << (CHAR_BIT - bit_length))) & + UCHAR_MAX) == 0; + else if (bit_displacement != 0) { + if (((*current_byte << bit_displacement) & UCHAR_MAX) != 0) + return 0 /* FALSE */; + current_byte += 1; + bit_length -= CHAR_BIT - bit_displacement; + } + __pragma_loopbound(0, 7); + while (bit_length >= CHAR_BIT) { + if (*current_byte != 0) + return 0 /* FALSE */; + current_byte++; + bit_length -= CHAR_BIT; + } + if (bit_length > 0 && (*current_byte >> (CHAR_BIT - bit_length)) != 0) + return 0 /* FALSE */; + return 1 /* TRUE */; +} + +/* This function sets up new value of all bits of given bit string. + This function is analog of standard C function `memset'. Value of + `bit_displacement' must be non-negative and can be greater than + CHAR_BIT. */ + +void +ammunition_bit_string_set(void *start_byte, int bit_displacement, int bit, + int bit_length) { + unsigned char *current_byte = (unsigned char *) start_byte; + unsigned char filling_byte; + int mask; + + if (bit_length <= 0) + return; + bit = bit != 0; /* 1 or 0 */ + filling_byte = (bit ? UCHAR_MAX : 0); + current_byte += bit_displacement / CHAR_BIT; + bit_displacement %= CHAR_BIT; + if (bit_displacement != 0) { + mask = UCHAR_MAX << (CHAR_BIT - bit_displacement); + if (bit_length < CHAR_BIT - bit_displacement) + mask |= UCHAR_MAX >> (bit_displacement + bit_length); + *current_byte = (*current_byte & mask) | (filling_byte & ~mask); + current_byte += 1; + bit_length -= CHAR_BIT - bit_displacement; + } + __pragma_loopbound(0, 8); + while (bit_length >= CHAR_BIT) { + *current_byte = filling_byte; + current_byte++; + bit_length -= CHAR_BIT; + } + if (bit_length > 0) + *current_byte = + (*current_byte & ~(UCHAR_MAX << (CHAR_BIT - bit_length))) | + (filling_byte & (UCHAR_MAX << (CHAR_BIT - bit_length))); +} + +/* This function copys a bit string to another bit string. This + function is analog of standard C function `memcpy'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string must + be non-overlapped. */ + +void +ammunition_bit_string_copy(void *to, int to_bit_displacement, const void *from, + int from_bit_displacement, int bit_length) { + unsigned char *current_to_byte = (unsigned char *) to; + const unsigned char *current_from_byte = (unsigned const char *) from; + int byte; + int mask; + + if (bit_length <= 0) + return; + current_to_byte += to_bit_displacement / CHAR_BIT; + to_bit_displacement %= CHAR_BIT; + current_from_byte += from_bit_displacement / CHAR_BIT; + from_bit_displacement %= CHAR_BIT; + __pragma_loopbound(0, 7); + while (1) { + byte = + (((*current_from_byte << from_bit_displacement) & UCHAR_MAX) | + (from_bit_displacement != 0 && + bit_length > (CHAR_BIT - from_bit_displacement) + ? current_from_byte[1] >> (CHAR_BIT - from_bit_displacement) + : 0)); + if (bit_length <= CHAR_BIT) + break; + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + *current_to_byte = (*current_to_byte & + (UCHAR_MAX << (CHAR_BIT - to_bit_displacement))) | + (byte >> to_bit_displacement); + if (to_bit_displacement != 0) + current_to_byte[1] = + (current_to_byte[1] & (UCHAR_MAX >> to_bit_displacement)) | + (byte << (CHAR_BIT - to_bit_displacement)); + bit_length -= CHAR_BIT; + current_from_byte++; + current_to_byte++; + } + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + mask = ((UCHAR_MAX << (CHAR_BIT - to_bit_displacement)) | + (UCHAR_MAX >> (to_bit_displacement + bit_length))); + *current_to_byte = + (*current_to_byte & mask) | ((byte >> to_bit_displacement) & ~mask); + bit_length -= CHAR_BIT - to_bit_displacement; + if (bit_length > 0) + current_to_byte[1] = (current_to_byte[1] & (UCHAR_MAX >> bit_length)) | + ((byte << (CHAR_BIT - to_bit_displacement)) & + (UCHAR_MAX << (CHAR_BIT - bit_length))); +} + +/* This function copys a bit string to another bit string. Copying + starts with the last bits of the bit strings. This function is + used by function `bit_string_move'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string must + be non-overlapped. */ + +void +ammunition_reverse_bit_string_copy(void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length) { + unsigned char *current_to_byte = (unsigned char *) to; + const unsigned char *current_from_byte = (unsigned const char *) from; + int byte; + int mask; + + if (bit_length <= 0) + return; + to_bit_displacement += bit_length - 1; + current_to_byte += to_bit_displacement / CHAR_BIT; /* last byte */ + to_bit_displacement %= CHAR_BIT; /* last bit */ + from_bit_displacement += bit_length - 1; + current_from_byte += from_bit_displacement / CHAR_BIT; /* last byte */ + from_bit_displacement %= CHAR_BIT; /* last bit */ + __pragma_loopbound(0, 7); + while (1) { + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + byte = ((*current_from_byte >> (CHAR_BIT - 1 - from_bit_displacement)) | + ((from_bit_displacement != CHAR_BIT - 1 && + bit_length > from_bit_displacement + 1 + ? current_from_byte[-1] << (from_bit_displacement + 1) + : 0) & + UCHAR_MAX)); + if (bit_length <= CHAR_BIT) + break; + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + *current_to_byte = + (*current_to_byte & (UCHAR_MAX >> (to_bit_displacement + 1))) | + (byte << (CHAR_BIT - 1 - to_bit_displacement)); + if (to_bit_displacement != CHAR_BIT - 1) + current_to_byte[-1] = + (current_to_byte[-1] & + (UCHAR_MAX << (CHAR_BIT - 1 - to_bit_displacement))) | + (byte >> (to_bit_displacement + 1)); + bit_length -= CHAR_BIT; + current_from_byte--; + current_to_byte--; + } + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + mask = ((UCHAR_MAX >> (to_bit_displacement + 1)) | + (UCHAR_MAX << (CHAR_BIT - 1 - to_bit_displacement + bit_length))); + *current_to_byte = (*current_to_byte & mask) | + ((byte << (CHAR_BIT - 1 - to_bit_displacement)) & ~mask); + bit_length -= to_bit_displacement + 1; + if (bit_length > 0) + current_to_byte[-1] = + (current_to_byte[-1] & (UCHAR_MAX << bit_length)) | + (byte >> (to_bit_displacement + 1) & + (UCHAR_MAX >> (CHAR_BIT - bit_length))); +} + +/* This function copys a bit string to another bit string with the aid + of functions `bit_string_copy' and `reverse_bit_string_copy'. This + function is analog of standard C function `memmove'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string can + be overlapped. */ + +void +ammunition_bit_string_move(void *to, int to_bit_displacement, const void *from, + int from_bit_displacement, int bit_length) { + unsigned char *current_to_byte = (unsigned char *) to; + const unsigned char *current_from_byte = (unsigned const char *) from; + + if (bit_length <= 0) + return; + current_to_byte += to_bit_displacement / CHAR_BIT; + to_bit_displacement %= CHAR_BIT; + current_from_byte += from_bit_displacement / CHAR_BIT; + from_bit_displacement %= CHAR_BIT; + if (current_from_byte > current_to_byte || + (current_from_byte == current_to_byte && + from_bit_displacement > to_bit_displacement)) + ammunition_bit_string_copy(current_to_byte, to_bit_displacement, + current_from_byte, from_bit_displacement, + bit_length); + else + ammunition_reverse_bit_string_copy(current_to_byte, to_bit_displacement, + current_from_byte, + from_bit_displacement, bit_length); +} + +/* This function compares bit strings. This function is analog of + standard C function `memcmp'. The function returns 0 if the bit + strings are equal, 1 if the first bit string is greater than the + second, -1 if the first bit string is less than the first. Values + of `bit_displacement1' and `bit_displacement2' must be non-negative + and can be greater than CHAR_BIT. */ + +int +ammunition_bit_string_comparison(const void *str1, int bit_displacement1, + const void *str2, int bit_displacement2, + int bit_length) { + const unsigned char *current_byte1 = (unsigned const char *) str1; + const unsigned char *current_byte2 = (unsigned const char *) str2; + int byte1; + int byte2; + int mask; + + if (bit_length <= 0) + return 0; + current_byte1 += bit_displacement1 / CHAR_BIT; + bit_displacement1 %= CHAR_BIT; + current_byte2 += bit_displacement2 / CHAR_BIT; + bit_displacement2 %= CHAR_BIT; + __pragma_loopbound(0, 7); + while (1) { + byte1 = (((*current_byte1 << bit_displacement1) & UCHAR_MAX) | + (bit_displacement1 != 0 + /* Shift is correct when to_bit_displacement == 0 + because its value is less than word bit size. */ + && bit_length > CHAR_BIT - bit_displacement1 + ? current_byte1[1] >> (CHAR_BIT - bit_displacement1) + : 0)); + byte2 = (((*current_byte2 << bit_displacement2) & UCHAR_MAX) | + (bit_displacement2 != 0 && + bit_length > CHAR_BIT - bit_displacement2 + ? current_byte2[1] >> (CHAR_BIT - bit_displacement2) + : 0)); + if (bit_length <= CHAR_BIT) + break; + if (byte1 > byte2) + return 1; + else if (byte1 < byte2) + return -1; + bit_length -= CHAR_BIT; + current_byte2++; + current_byte1++; + } + /* Shift is correct when to_bit_displacement == 0 because its value + is less than word bit size. */ + mask = UCHAR_MAX << (CHAR_BIT - bit_length); + if ((byte1 & mask) > (byte2 & mask)) + return 1; + else if ((byte1 & mask) < (byte2 & mask)) + return -1; + else + return 0; +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.h new file mode 100644 index 0000000..5e8e518 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/default/bits.h @@ -0,0 +1,58 @@ +/* + FILE NAME: bits.h + + TITLE: Include file of package for work with bits + + DESCRIPTION: + This is header file contains macros and the ANSI C prototype + definitions for the package for work with bits and bit strings + and C++ class for work with bits and bit strings. A bit is + given by address (start address) of byte from which counting + bits starts and its displacement which is any non negative + number of bit from the start address. The most significant bit + of the start address byte has number 0. The bit string is + given by its first bit and its length in bits. + +*/ + +#ifndef __BITS__ +#define __BITS__ + +#include "ammunition_limits.h" + +/* This macro value returns bit vlaue (0 or 1) with given bit + displacement (0, 1, ...). The macro has side effects! Value of + `bit_displacement' must be nonegative and can be greater than + CHAR_BIT. */ + +#define BIT(start_byte, bit_displacement) \ + ((((const char *) (start_byte))[(bit_displacement) / CHAR_BIT] >> \ + (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)) & \ + 1) + +/* This macro value sets up new value (must be `0' or `1') of a given + bit (bit displacement starts with 0). The macro has side effects! + Value of `bit_displacement' must be nonegative and can be greater + than CHAR_BIT. */ + +#define SET_BIT(start_byte, bit_displacement, bit) \ + (((char *) (start_byte))[(bit_displacement) / CHAR_BIT] = \ + (((char *) (start_byte))[(bit_displacement) / CHAR_BIT] & \ + ~(1 << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) | \ + ((bit) << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) + +int ammunition_is_zero_bit_string(const void *start_byte, int bit_displacement, + int bit_length); +void ammunition_bit_string_set(void *start_byte, int bit_displacement, int bit, + int bit_length); +void ammunition_bit_string_copy(void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length); +void ammunition_bit_string_move(void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length); +int ammunition_bit_string_comparison(const void *str1, int bit_displacement1, + const void *str2, int bit_displacement2, + int bit_length); + +#endif /* #ifndef __BITS__ */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition.c new file mode 100644 index 0000000..74e89de --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition.c @@ -0,0 +1,1185 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: ammunition + + Author: Vladimir Makarov + + Function: Tests reusable packages bits and arith + bits: Work with bit strings (copying, moving, setting, testing, comparison). + arith: Implementing host machine-independently arbitrary precision integer + numbers arithmetic. The implementation of the package functions are not + sufficiently efficient in order to use for run-time. The package + functions are oriented to implement constant-folding in compilers, + cross-compilers. + + Source: DINO programming language repository + https://github.com/dino-lang/dino/ + + Changes: no major functional changes + + License: GPL 2 and LGPL 2 + +*/ + +#include "ammunition_stdio.h" +#include "ammunition_stdlib.h" +#include "ammunition_string.h" +#include "arithm.h" +#include "bits.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "ammunition_libc.c" +#include "arithm.c" +#include "bits.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +ammunition_reset_str_bits(char *str, char *s); +__attribute__((always_inline)) static inline void +ammunition_reset_str_arithm(char *str, char *s, char *d, char *e, char *g); +__attribute__((always_inline)) static inline int ammunition_bits_test(); +__attribute__((always_inline)) static inline int ammunition_arithm_test(); +__attribute__((always_inline)) static inline void ammunition_init(void); +__attribute__((always_inline)) static inline int ammunition_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ammunition_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Forward declaration of global variables +*/ + +int ammunition_result; + +/* + Core functions +*/ + +__attribute__((always_inline)) static inline void +ammunition_reset_str_bits(char *str, char *s) { + int i; + __pragma_loopbound(8, 8); + for (i = 0; i < 8; i++) { + str[i] = 0; + s[i] = 0; + } +} + +__attribute__((always_inline)) static inline void +ammunition_reset_str_arithm(char *str, char *s, char *d, char *e, char *g) { + int i; + __pragma_loopbound(20, 20); + for (i = 0; i < 20; i++) { + str[i] = 0; + s[i] = 0; + } + + __pragma_loopbound(4, 4); + for (i = 0; i < 4; i++) { + d[i] = 0; + e[i] = 0; + } + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; i++) + g[i] = 0; +} + +__attribute__((always_inline)) static inline int +ammunition_bits_test() { + char str[8]; + char str1[8]; + + int result = 0; + unsigned int i, j; + + /* Test 1 */ + ammunition_reset_str_bits(str, str1); + + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(str) * CHAR_BIT; i++) { + if (BIT(str, i)) + result = 1; + } + + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(str) * CHAR_BIT; i++) { + SET_BIT(str, i, 1); + __pragma_loopbound(64, 64); + for (j = 0; j < sizeof(str) * CHAR_BIT; j++) + if (j <= i) { + if (BIT(str, j) == 0) + result = 1; + } else if (BIT(str, j)) + result = 1; + } + + /* Test 2 */ + ammunition_reset_str_bits(str, str1); + + __pragma_loopbound(64, 64); + for (i = 0; i < sizeof(str) * CHAR_BIT; i++) + if (!ammunition_is_zero_bit_string( + str, i, (sizeof(str) * CHAR_BIT - i) / 2 + 1)) + result = 1; + ammunition_bit_string_set(str, 13, 1, 35); + __pragma_loopbound(13, 13); + for (i = 0; i < 13; i++) + if (!ammunition_is_zero_bit_string(str, i, 13 - i)) + result = 1; + __pragma_loopbound(35, 35); + for (i = 13; i < 48; i++) + if (ammunition_is_zero_bit_string(str, i, 48 - i)) + result = 1; + __pragma_loopbound(16, 16); + for (i = 48; i < sizeof(str) * CHAR_BIT; i++) + if (!ammunition_is_zero_bit_string(str, i, sizeof(str) * CHAR_BIT - i)) + result = 1; + + /* Test 3 */ + ammunition_reset_str_bits(str, str1); + + __pragma_loopbound(42, 42); + for (i = 0; i + i / 2 + 1 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_set(str, i, 1, i / 2 + 1); + if (!ammunition_is_zero_bit_string(str, 0, i - 1)) + result = 1; + if (ammunition_is_zero_bit_string(str, i, i / 2 + 1)) + result = 1; + if (!ammunition_is_zero_bit_string( + str, i + i / 2 + 1, sizeof(str) * CHAR_BIT - (i + i / 2 + 1))) + result = 1; + ammunition_bit_string_set(str, 0, 0, sizeof(str) * CHAR_BIT); + } + + /* Test 4 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_set(str1, 2, 1, 40); + __pragma_loopbound(42, 42); + for (i = 0; i < 42; i++) + if (ammunition_bit_string_comparison(str, i, str1, i, 42 - i) != 0) + result = 1; + __pragma_loopbound(43, 43); + for (i = 0; i < 43; i++) + if (ammunition_bit_string_comparison(str, i, str1, i, + sizeof(str) * CHAR_BIT - i) <= 0) + result = 1; + __pragma_loopbound(43, 43); + for (i = 0; i < 43; i++) + if (ammunition_bit_string_comparison(str1, i, str, i, + sizeof(str) * CHAR_BIT - i) >= 0) + result = 1; + + /* Test 5 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + __pragma_loopbound(59, 59); + for (i = 0; i + 5 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_copy(str1, i + 5, str, i, + sizeof(str) * CHAR_BIT - i - 5); + if (ammunition_bit_string_comparison( + str1, i + 5, str, i, sizeof(str) * CHAR_BIT - i - 5) != 0) + result = 1; + } + + /* Test 6 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_set(str1, 2, 1, 43); + __pragma_loopbound(59, 59); + for (i = 0; i + 5 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_set(str, 0, 0, sizeof(str) * CHAR_BIT); + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_move(str, i + 5, str, i, + sizeof(str) * CHAR_BIT - i - 5); + if (ammunition_bit_string_comparison( + str, i + 5, str1, i, sizeof(str) * CHAR_BIT - i - 5) != 0) + result = 1; + } + + /* Test 7 */ + ammunition_reset_str_bits(str, str1); + + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_set(str1, 2, 1, 43); + __pragma_loopbound(59, 59); + for (i = 0; i + 5 < sizeof(str) * CHAR_BIT; i++) { + ammunition_bit_string_set(str, 0, 0, sizeof(str) * CHAR_BIT); + ammunition_bit_string_set(str, 2, 1, 43); + ammunition_bit_string_move(str, i, str, i + 5, + sizeof(str) * CHAR_BIT - i - 5); + if (ammunition_bit_string_comparison( + str, i, str1, i + 5, sizeof(str) * CHAR_BIT - i - 5) != 0) + result = 1; + } + + return result; +} + +__attribute__((always_inline)) static inline int +ammunition_arithm_test() { + int result = 0; + + /* Test 1 */ + int i; + char str[20], s[20], d[4], e[4], g[6]; + + ammunition_integer_from_string(4, "-2147483649", d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MIN); + ammunition_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + ammunition_integer_from_string(4, "2147483648", d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MAX); + ammunition_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + } + + /* Test 2 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "4294967296", d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX); + ammunition_unsigned_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, str) != 0) + result = 1; + } + + /* Test 3 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_d(str, INT_MAX); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "1", e); + ammunition_add_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MAX - 4); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 4); + ammunition_integer_from_string(4, str, e); + ammunition_add_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, INT_MAX); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, i + 1); + ammunition_integer_from_string(4, str, e); + ammunition_add_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i + i + 1) + result = 1; + } + + /* Test 4 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_u(str, UINT_MAX); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_unsigned_integer_from_string(4, "1", e); + ammunition_add_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX - 4); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, 4); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_add_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + ammunition_sprintf_u(str, UINT_MAX); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i + 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_add_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i + i + 1) + result = 1; + } + + /* Test 5 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_d(str, INT_MIN); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "1", e); + ammunition_subtract_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MIN + 4); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 4); + ammunition_integer_from_string(4, str, e); + ammunition_subtract_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, INT_MIN); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 10 - i); + ammunition_integer_from_string(4, str, e); + ammunition_subtract_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i + i - 10) + result = 1; + } + + /* Test 6 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_u(str, UINT_MAX - 2); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, UINT_MAX - 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_subtract_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_subtract_unsigned_integer(4, d, d, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 2); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_subtract_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i - i / 2) + result = 1; + } + + /* Test 7 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_d(str, INT_MAX / 2 + 1); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "2", e); + ammunition_multiply_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MIN / 2 - 1); + ammunition_integer_from_string(4, str, d); + ammunition_integer_from_string(4, "2", e); + ammunition_multiply_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_d(str, INT_MAX / 3); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 3); + ammunition_integer_from_string(4, str, e); + ammunition_multiply_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, (INT_MAX / 3) * 3); + if (ammunition_strcmp(s, str) != 0) + result = 1; + ammunition_sprintf_d(str, INT_MIN / 2); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, 2); + ammunition_integer_from_string(4, str, e); + ammunition_multiply_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + ammunition_sprintf_d(str, (INT_MIN / 2) * 2); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, i + 1000); + ammunition_integer_from_string(4, str, e); + ammunition_multiply_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i * (i + 1000)) + result = 1; + } + + /* Test 8 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_sprintf_u(str, UINT_MAX / 5 + 1); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, 5); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_multiply_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_sprintf_u(str, UINT_MAX / 2); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, 2); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_multiply_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + ammunition_sprintf_u(str, (UINT_MAX / 2) * 2); + if (ammunition_strcmp(s, str) != 0) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 2); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_multiply_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i * (i / 2)) + result = 1; + } + + /* Test 9 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "10", d); + ammunition_integer_from_string(4, "0", e); + ammunition_divide_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = -2000; i < 2000; i++) { + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_sprintf_d(str, (i < 0 ? -i / 20 + 1 : -i / 20 - 1)); + ammunition_integer_from_string(4, str, e); + ammunition_divide_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i / (i < 0 ? -i / 20 + 1 : -i / 20 - 1)) + result = 1; + ammunition_sprintf_d(str, i); + ammunition_integer_from_string(4, str, d); + ammunition_divide_integer(4, d, e, e); + if (ammunition_overflow_bit) + result = 1; + ammunition_integer_to_string(4, e, s); + if (ammunition_atoi(s) != i / (i < 0 ? -i / 20 + 1 : -i / 20 - 1)) + result = 1; + } + + /* Test 10 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_divide_unsigned_integer(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 20 + 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_divide_unsigned_integer(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i / (i / 20 + 1)) + result = 1; + } + + /* Test 11 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_unsigned_integer_remainder(4, d, e, d); + if (!ammunition_overflow_bit) + result = 1; + __pragma_loopbound(4000, 4000); + for (i = 0; i < 4000; i++) { + ammunition_sprintf_u(str, i); + ammunition_unsigned_integer_from_string(4, str, d); + ammunition_sprintf_u(str, i / 20 + 1); + ammunition_unsigned_integer_from_string(4, str, e); + ammunition_unsigned_integer_remainder(4, d, e, d); + if (ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_atoi(s) != i % (i / 20 + 1)) + result = 1; + } + + /* Test 12 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_right(4, d, 0, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_right(4, d, 32, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_right(4, d, 8, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "5") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_right(4, d, 13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_left(4, d, -13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + + /* Test 13 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_right(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_right(4, d, 32, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_right(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "5") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_right(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_left(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "16") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_right(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1348") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_right(4, d, 32, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-1") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_right(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-6") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_right(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-17") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_left(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (!ammunition_overflow_bit || ammunition_strcmp(s, "-17") != 0) + result = 1; + + /* Test 14 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_left(4, d, 0, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_left(4, d, 22, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_shift_left(4, d, 8, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "345088") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_left(4, d, 13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "134890", d); + ammunition_unsigned_integer_shift_right(4, d, -13, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + + /* Test 15 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_left(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_left(4, d, 21, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_shift_left(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "345088") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_left(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + ammunition_integer_from_string(4, "134890", d); + ammunition_integer_shift_right(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "1105018880") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_left(4, d, 0, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1348") != 0) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_left(4, d, 21, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_shift_left(4, d, 8, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-345088") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_left(4, d, 13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1105018880") != 0) + result = 1; + ammunition_integer_from_string(4, "-134890", d); + ammunition_integer_shift_right(4, d, -13, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-1105018880") != 0) + result = 1; + + /* Test 16 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_eq_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_eq_integer(4, d, e)) + result = 1; + + /* Test 17 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_eq_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_eq_unsigned_integer(4, d, e)) + result = 1; + + /* Test 18 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_ne_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_ne_integer(4, d, e)) + result = 1; + + /* Test 19 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_ne_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_ne_unsigned_integer(4, d, e)) + result = 1; + + /* Test 20 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_gt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_gt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_gt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_gt_integer(4, d, e)) + result = 1; + + /* Test 21 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_gt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_gt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_gt_unsigned_integer(4, d, e)) + result = 1; + + /* Test 22 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_lt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_lt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_lt_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_lt_integer(4, d, e)) + result = 1; + + /* Test 23 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_lt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_lt_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_lt_unsigned_integer(4, d, e)) + result = 1; + + /* Test 24 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_ge_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_ge_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (ammunition_ge_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_ge_integer(4, d, e)) + result = 1; + + /* Test 25 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_ge_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_ge_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_ge_unsigned_integer(4, d, e)) + result = 1; + + /* Test 26 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "-10", d); + ammunition_integer_from_string(4, "1348", e); + if (!ammunition_le_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1348", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_le_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "-1000000", d); + ammunition_integer_from_string(4, "-1348", e); + if (!ammunition_le_integer(4, d, e)) + result = 1; + ammunition_integer_from_string(4, "1000000", d); + ammunition_integer_from_string(4, "1348", e); + if (ammunition_le_integer(4, d, e)) + result = 1; + + /* Test 27 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "10", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_le_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (!ammunition_le_unsigned_integer(4, d, e)) + result = 1; + ammunition_unsigned_integer_from_string(4, "1000000", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + if (ammunition_le_unsigned_integer(4, d, e)) + result = 1; + + /* Test 28 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "70000", d); + ammunition_change_unsigned_integer_size(4, d, 2, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_unsigned_integer_from_string(4, "30000", d); + ammunition_change_unsigned_integer_size(4, d, 2, d); + ammunition_integer_to_string(2, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "30000") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "11230000", g); + ammunition_change_unsigned_integer_size(4, g, 6, g); + ammunition_integer_to_string(6, g, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "11230000") != 0) + result = 1; + + /* Test 29 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "40000", d); + ammunition_change_integer_size(4, d, 2, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "-33000", d); + ammunition_change_integer_size(4, d, 2, d); + if (!ammunition_overflow_bit) + result = 1; + ammunition_integer_from_string(4, "30000", d); + ammunition_change_integer_size(4, d, 2, d); + ammunition_integer_to_string(2, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "30000") != 0) + result = 1; + ammunition_integer_from_string(4, "-30000", d); + ammunition_change_integer_size(4, d, 2, d); + ammunition_integer_to_string(2, d, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-30000") != 0) + result = 1; + ammunition_integer_from_string(4, "11230000", g); + ammunition_change_integer_size(4, g, 6, g); + ammunition_integer_to_string(6, g, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "11230000") != 0) + result = 1; + ammunition_integer_from_string(4, "-11230000", g); + ammunition_change_integer_size(4, g, 6, g); + ammunition_integer_to_string(6, g, s); + if (ammunition_overflow_bit || ammunition_strcmp(s, "-11230000") != 0) + result = 1; + + /* Test 30 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "4294967295", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "4294967295") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "96", e); + ammunition_unsigned_integer_or(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1380") != 0) + result = 1; + + /* Test 31 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "1348", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "0", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "-1", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "-1") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "96", e); + ammunition_integer_or(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1380") != 0) + result = 1; + + /* Test 32 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "1348", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "0", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "4294967295", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_from_string(4, "96", e); + ammunition_unsigned_integer_and(4, d, e, e); + ammunition_unsigned_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "64") != 0) + result = 1; + + /* Test 33 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "1348", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "0", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "-1", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "1348") != 0) + result = 1; + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_from_string(4, "96", e); + ammunition_integer_and(4, d, e, e); + ammunition_integer_to_string(4, e, s); + if (ammunition_strcmp(s, "64") != 0) + result = 1; + + /* Test 34 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_unsigned_integer_from_string(4, "1348", d); + ammunition_unsigned_integer_not(4, d, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "4294965947") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "0", d); + ammunition_unsigned_integer_not(4, d, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "4294967295") != 0) + result = 1; + ammunition_unsigned_integer_from_string(4, "4294967295", d); + ammunition_unsigned_integer_not(4, d, d); + ammunition_unsigned_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + + /* Test 35 */ + ammunition_reset_str_arithm(str, s, d, e, g); + + ammunition_integer_from_string(4, "1348", d); + ammunition_integer_not(4, d, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "-1349") != 0) + result = 1; + ammunition_integer_from_string(4, "0", d); + ammunition_integer_not(4, d, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "-1") != 0) + result = 1; + ammunition_integer_from_string(4, "-1", d); + ammunition_integer_not(4, d, d); + ammunition_integer_to_string(4, d, s); + if (ammunition_strcmp(s, "0") != 0) + result = 1; + + return result; +} + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +ammunition_init(void) { + ammunition_result = 0; +} + +__attribute__((always_inline)) static inline int +ammunition_return(void) { + return ammunition_result; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ammunition_main(void) { + ammunition_result |= ammunition_bits_test(); + ammunition_result |= ammunition_arithm_test(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + ammunition_init(); + ammunition_main(); + + return (ammunition_return()); +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_libc.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_libc.c new file mode 100644 index 0000000..4015ac3 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_libc.c @@ -0,0 +1,164 @@ +/* + Include section +*/ + +#include "ammunition_stdio.h" +#include "ammunition_stdlib.h" +#include "ammunition_string.h" + +/* + Standard library functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline char +ammunition_isdigit(unsigned char c) { + if ((c >= '0') & (c <= '9')) + return 1; + else + return 0; +} + +__attribute__((always_inline)) static inline int +ammunition_isspace(int c) { + return (c == ' ') | (c == '\t') | (c == '\n') | (c == '\r'); +} + +__attribute__((always_inline)) static inline void * +ammunition_memcpy(void *dest, const void *src, size_t size) { + size_t i; + __pragma_loopbound(2, 6); + for (i = 0; i < size; i++) + ((unsigned char *) dest)[i] = ((unsigned char *) src)[i]; + + return dest; +} + +__attribute__((always_inline)) static inline void * +ammunition_memset(void *s, int c, size_t n) { + size_t i; + __pragma_loopbound(0, 4); + for (i = 0; i < n; i++) + ((unsigned char *) s)[i] = (unsigned char) c; + + return s; +} + +__attribute__((always_inline)) static inline int +ammunition_memcmp(const void *mem1, const void *mem2, size_t size) { + const unsigned char *p1 = (const unsigned char *) mem1, + *p2 = (const unsigned char *) mem2; + __pragma_loopbound(0, 4); + while (size--) + if (*p1 != *p2) + return (*p1 - *p2); + else + p1++, p2++; + return 0; +} + +/* The following function is an analog of standard C function + `memmove'. The function returns the first operand. */ + +__attribute__((always_inline)) static inline void * +ammunition_memmove(void *s1, const void *s2, size_t n) { + int i; + + if (((char *) s1 < (char *) s2 && (char *) s1 + n <= (char *) s2) || + ((char *) s2 < (char *) s1 && (char *) s2 + n <= (char *) s1)) + return (void *) ammunition_memcpy(s1, s2, n); + if ((char *) s1 < (char *) s2 && (char *) s1 + n > (char *) s2) { + __pragma_loopbound(0, 4); + for (i = 0; (size_t) i < n; i++) + ((char *) s1)[i] = ((char *) s2)[i]; + } else { + __pragma_loopbound(0, 4); + for (i = n - 1; i >= 0; i--) + ((char *) s1)[i] = ((char *) s2)[i]; + } + return s1; +} + +__attribute__((always_inline)) static inline int +ammunition_strcmp(const char *str1, const char *str2) { + __pragma_loopbound(1, 11); + while (*str1 && (*str1 == *str2)) + str1++, str2++; + return *(const unsigned char *) str1 - *(const unsigned char *) str2; +} + +__attribute__((always_inline)) static inline int +ammunition_atoi(const char *str) { + int result = 0; + int sign = (str[0] == '-' ? -1 : 1); + + int readingPos = 0; + if (str[0] == '-' || str[0] == '+') + readingPos++; + __pragma_loopbound(1, 7); + do { + result *= 10; + result += str[readingPos++] - 48; + } while (str[readingPos] != 0); + + return sign * result; +} + +__attribute__((always_inline)) static inline int +ammunition_sprintf_d(char *s, int number) { + /* How many decimal digits do we need? */ + char digits = 0; + unsigned char writePos = 0; + long long copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + digits++; + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + writePos = digits; + if (number < 0) { + writePos++; + s[0] = '-'; + } + s[writePos] = 0; + + copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + s[--writePos] = + 48 + ((copyOfNumber >= 0 ? copyOfNumber : -copyOfNumber) % 10); + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + return digits + (number < 0 ? 1 : 0); +} + +__attribute__((always_inline)) static inline int +ammunition_sprintf_u(char *s, unsigned int number) { + /* How many decimal digits do we need? */ + char digits = 0; + unsigned char writePos = 0; + unsigned long long copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + digits++; + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + writePos = digits; + s[writePos] = 0; + + copyOfNumber = number; + __pragma_loopbound(1, 10); + do { + s[--writePos] = 48 + (copyOfNumber % 10); + copyOfNumber /= 10; + } while (copyOfNumber != 0); + + return digits; +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_limits.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_limits.h new file mode 100644 index 0000000..300b31d --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_limits.h @@ -0,0 +1,36 @@ + +#ifndef AMMUNITION_LIMITS_H +#define AMMUNITION_LIMITS_H + +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif +#ifndef UCHAR_MAX +#define UCHAR_MAX 255 +#endif +#ifndef SCHAR_MAX +#define SCHAR_MAX 127 +#endif +#ifndef SCHAR_MIN +#define SCHAR_MIN (-128) +#endif +#ifndef USHRT_MAX +#define USHRT_MAX 65535 +#endif +#ifndef SHRT_MAX +#define SHRT_MAX 32767 +#endif +#ifndef SHRT_MIN +#define SHRT_MIN (-32768) +#endif +#ifndef UINT_MAX +#define UINT_MAX (INT_MAX * 2U + 1) +#endif +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif +#ifndef INT_MIN +#define INT_MIN (-INT_MAX - 1) +#endif + +#endif /* #ifndef AMMUNITION_LIMITS_H */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdio.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdio.h new file mode 100644 index 0000000..71b5316 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdio.h @@ -0,0 +1,11 @@ + +#ifndef AMMUNITION_STDIO_H +#define AMMUNITION_STDIO_H + +__attribute__((always_inline)) static inline int +ammunition_sprintf_d(char *s, int number); + +__attribute__((always_inline)) static inline int +ammunition_sprintf_u(char *s, unsigned int number); + +#endif diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdlib.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdlib.h new file mode 100644 index 0000000..3c41224 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_stdlib.h @@ -0,0 +1,8 @@ + +#ifndef AMMUNITION_STDLIB_H +#define AMMUNITION_STDLIB_H + +__attribute__((always_inline)) static inline int +ammunition_atoi(const char *str); + +#endif diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_string.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_string.h new file mode 100644 index 0000000..3ef0074 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/ammunition_string.h @@ -0,0 +1,22 @@ + +#ifndef AMMUNITION_STRING_H +#define AMMUNITION_STRING_H + +typedef unsigned int size_t; + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void * +ammunition_memcpy(void *, const void *, size_t); +__attribute__((always_inline)) static inline void * +ammunition_memset(void *, int, size_t); +__attribute__((always_inline)) static inline int +ammunition_memcmp(const void *mem1, const void *mem2, size_t size); +__attribute__((always_inline)) static inline void * +ammunition_memmove(void *s1, const void *s2, size_t n); +__attribute__((always_inline)) static inline int +ammunition_strcmp(const char *str1, const char *str2); + +#endif /* AMMUNITION_STRING_H */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.c new file mode 100644 index 0000000..5ce13f6 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.c @@ -0,0 +1,1310 @@ +/* + FILE NAME: arithm.c + + TITLE: Package for arbitrary precision integer arithmetic + + DESCRIPTION: This abstract data implements arbitrary precision + integer and unsigned integer numbers by machine independent + way. The implementation of the package functions are not + sufficiently efficient in order to use for run-time. The + package functions are oriented to implement constant-folding in + compilers. This package is necessary because host machine may + not support such arithmetic for target machine. For example, + VAX does not support does not support more 32-bits integer + numbers arithmetic. The numbers are represented by bytes in + big endian mode, negative integer numbers are represented in + complementary code. All sizes are given in bytes and must be + positive. Results of executions of all functions can coincide + with a operand(s). All functions of addition, subtraction, + multiplication, division, evaluation of remainder, shift, + changing size and transformation of string into number fix + overflow. The overflow is fixed when result can not be + represented by number of given size. + +*/ + +#include "arithm.h" +#include "ammunition_string.h" + +/* This variable can have only two values 0 or 1. The value `1' + corresponds to overflow. The variable value are modified by all + functions of addition, subtract, multiplication, division, + evaluation of remainder, shift, changing size and transformation of + string into number fix overflow. */ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int ammunition_overflow_bit; + +/* The following function adds unsigned integers. The function + returns 1 if unsigned integer overflow is fixed, 0 otherwise. + Result can be placed in any operand. */ + +__attribute__((always_inline)) static inline int +ammunition_add_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int digit_num; + int carry; + unsigned int sum; + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + sum = (((unsigned char *) op1)[digit_num] + + ((unsigned char *) op2)[digit_num] + carry); + if (sum > UCHAR_MAX) { + sum -= UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ((unsigned char *) result)[digit_num] = sum; + } + return carry != 0; +} + +/* The following function adds unsigned integers. The function + returns 1 if unsigned integer overflow (the first operand is less + than the second) is fixed, 0 otherwise. Result can be placed in + any operand. */ + +__attribute__((always_inline)) static inline int +ammunition_subtract_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int digit_num; + int carry; + int subtraction; + + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + subtraction = (((unsigned char *) op1)[digit_num] - + ((unsigned char *) op2)[digit_num] - carry); + if (subtraction < 0) { + subtraction += UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ((unsigned char *) result)[digit_num] = subtraction; + } + return carry != 0; +} + +/* The following function makes complementary code of number. Result + can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_make_complementary_code(int size, const void *operand, + void *result) { + int digit_num; + int carry; + int subtraction; + + __pragma_loopbound(2, 6); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + subtraction = (0 - ((unsigned char *) operand)[digit_num] - carry); + if (subtraction != 0) { + subtraction += UCHAR_MAX + 1; + carry = 1; + } else + carry = 0; + ((unsigned char *) result)[digit_num] = subtraction; + } +} + +/* The following function multiplys unsigned integer by digit (byte + size). The function returns 1 if unsigned integer overflow is + fixed, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + int size, void *operand, unsigned int digit) { + int digit_num; + unsigned int carry; + unsigned int sum; + + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = 0; digit_num >= 0; digit_num--) { + sum = (((unsigned char *) operand)[digit_num] * digit + carry); + if (sum > UCHAR_MAX) { + carry = sum / (UCHAR_MAX + 1); + sum %= UCHAR_MAX + 1; + } else + carry = 0; + ((unsigned char *) operand)[digit_num] = sum; + } + return carry != 0; +} + +/* Originally reaction on all integer and unsigned integer overflow is + equal to the following function. The function does nothing. */ + +void +ammunition_arithmetic_overflow_reaction(void) {} + +/* Originally reaction on all integer and unsigned integer overflow is + equal to the following function. The function does nothing. */ + +void +ammunition_arithmetic_unsigned_overflow_reaction(void) {} + +/* This page contains functions for arbitrary precision addition. */ + +/* The function adds unsigned integers and fixes overflow reaction if + it is needed. The function makes this with the aid of function + `add_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_add_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_add_unsigned_integer_without_overflow_reaction(size, op1, + op2, result); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function adds integers and fixes overflow reaction if it is + needed. The function makes this with the aid of function + `add_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_add_integer(int size, const void *op1, const void *op2, + void *result) { + int op1_sign; + int sign_equality; + + op1_sign = INTEGER_SIGN(op1); + sign_equality = INTEGER_SIGN(op1) == INTEGER_SIGN(op2); + ammunition_add_unsigned_integer_without_overflow_reaction(size, op1, op2, + result); + ammunition_overflow_bit = + sign_equality && (op1_sign != INTEGER_SIGN(result)); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision subtraction. */ + +/* The function subtracts unsigned integers and fixes overflow + reaction if it is needed. The function makes this with the aid of + function `subtract_unsigned_integer_without_overflow_reaction'. + Result can be placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_subtract_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_subtract_unsigned_integer_without_overflow_reaction( + size, op1, op2, result); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function subtracts integers and fixes overflow reaction if it + is needed. The function makes this with the aid of function + `subtract_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_subtract_integer(int size, const void *op1, const void *op2, + void *result) { + int op1_sign; + int sign_unequality; + + op1_sign = INTEGER_SIGN(op1); + sign_unequality = INTEGER_SIGN(op1) != INTEGER_SIGN(op2); + ammunition_subtract_unsigned_integer_without_overflow_reaction(size, op1, + op2, result); + ammunition_overflow_bit = + sign_unequality && (op1_sign != INTEGER_SIGN(result)); + if (ammunition_overflow_bit != 0) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision multiplication. */ + +/* The following function multiplys unsigned integers. The function + returns 1 if unsigned integer overflow is fixed, 0 otherwise. + Result can be placed in any operand. */ + +__attribute__((always_inline)) static inline int +ammunition_multiply_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int op1_digit_num; + int op2_digit_num; + int carry; + unsigned long long int partial_sum; + int result_digit_number; + int overflow_flag; + unsigned char long_result[2 * MAX_INTEGER_OPERAND_SIZE]; + + ammunition_memset(long_result + size, 0, (size_t) size); + __pragma_loopbound(4, 4); + for (op2_digit_num = size - 1; op2_digit_num >= 0; op2_digit_num--) { + if (((unsigned char *) op2)[op2_digit_num] != 0) { + __pragma_loopbound(4, 4); + for (op1_digit_num = size - 1, carry = 0; op1_digit_num >= 0; + op1_digit_num--) { + partial_sum = + (((unsigned char *) op1)[op1_digit_num] * + ((unsigned char *) op2)[op2_digit_num] + + long_result[op1_digit_num + op2_digit_num + 1] + carry); + long_result[op1_digit_num + op2_digit_num + 1] = + (unsigned char) (partial_sum % (UCHAR_MAX + 1)); + carry = partial_sum / (UCHAR_MAX + 1); + } + long_result[op2_digit_num] = carry; + } else + long_result[op2_digit_num] = 0; + } + overflow_flag = 0; + __pragma_loopbound(0, 4); + for (result_digit_number = size - 1; result_digit_number >= 0; + result_digit_number--) { + if (long_result[result_digit_number] != 0) { + overflow_flag = 1; + break; + } + } + ammunition_memcpy(result, long_result + size, (size_t) size); + return overflow_flag; +} + +/* The following function multiplys unsigned integers and fixes + overflow reaction if it is needed. The function makes this with + the aid of function + `multiply_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_multiply_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_multiply_unsigned_integer_without_overflow_reaction( + size, op1, op2, result); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function multiplys integers and fixes overflow reaction if it + is needed. The function makes this with the aid of function + `multiply_unsigned_integer_without_overflow_reaction'. Result can + be placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_multiply_integer(int size, const void *op1, const void *op2, + void *result) { + int negative_result_flag; + unsigned char op1_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned char op2_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned const char *abs_op1; + unsigned const char *abs_op2; + int unsigned_result_sign; + + negative_result_flag = INTEGER_SIGN(op1) != INTEGER_SIGN(op2); + if (INTEGER_SIGN(op1)) { + /* May be integer overflow. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code(size, op1, op1_complementary); + abs_op1 = (unsigned const char *) op1_complementary; + } else + abs_op1 = (unsigned const char *) op1; + if (INTEGER_SIGN(op2)) { + /* May be integer overflow. But result is correct because + it is unsigned. */ + ammunition_make_complementary_code(size, op2, op2_complementary); + abs_op2 = (unsigned const char *) op2_complementary; + } else + abs_op2 = (unsigned const char *) op2; + ammunition_overflow_bit = + ammunition_multiply_unsigned_integer_without_overflow_reaction( + size, abs_op1, abs_op2, result); + unsigned_result_sign = INTEGER_SIGN(result); + if (negative_result_flag) + ammunition_make_complementary_code(size, result, result); + if (unsigned_result_sign && + (!negative_result_flag || INTEGER_SIGN(result) != unsigned_result_sign)) + /* Unsigned result can not be represented as integer. */ + ammunition_overflow_bit = 1; + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision division. */ + +/* The following function divides unsigned integers. The function + returns 1 if unsigned integer overflow (division by zero) is fixed, + 0 otherwise. Result can be placed in any operand. See algorithm + in Knuth's book. */ + +__attribute__((always_inline)) static inline int +ammunition_divide_unsigned_integer_without_overflow_reaction(int size, + const void *op1, + const void *op2, + void *result) { + int scaled_op1_digit_num; + unsigned int q_approximation; + int first_nonzero_digit_number; + int op2_digit_number; + unsigned int scale; + unsigned char scaled_op1[MAX_INTEGER_OPERAND_SIZE + 1]; + unsigned char normalized_op2[MAX_INTEGER_OPERAND_SIZE]; + unsigned char extended_normalized_op2[MAX_INTEGER_OPERAND_SIZE + 1]; + + __pragma_loopbound(3, 4); + for (op2_digit_number = 0; op2_digit_number < size; op2_digit_number++) { + if (((unsigned char *) op2)[op2_digit_number] != 0) + break; + } + first_nonzero_digit_number = op2_digit_number; + if (first_nonzero_digit_number == size) { + /* Zero divisor */ + ammunition_memset(result, 0, (size_t) size); + return 1 /* TRUE */; + } else if (first_nonzero_digit_number == size - 1) { + /* Division by digit. */ + int digit_num; + int digit; + unsigned long long divisable; + unsigned long long remainder; + + digit = ((unsigned char *) op2)[first_nonzero_digit_number]; + ammunition_memcpy(result, op1, (size_t) size); + remainder = 0; + __pragma_loopbound(4, 4); + for (digit_num = 0; digit_num < size; digit_num++) { + divisable = (remainder * (UCHAR_MAX + 1) + + ((unsigned char *) result)[digit_num]); + remainder = divisable % digit; + ((unsigned char *) result)[digit_num] = + (unsigned char) (divisable / digit); + } + return 0 /* FALSE */; + } + /* Normalization of divisor. */ + scale = (UCHAR_MAX + 1) / (((unsigned char *) op2)[op2_digit_number] + 1); + ammunition_memcpy(scaled_op1 + 1, op1, (size_t) size); + *scaled_op1 = 0; + + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size + 1, scaled_op1, scale); + + ammunition_memcpy(normalized_op2, op2, (size_t) size); + + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size, normalized_op2, scale); + + __pragma_loopbound(0, 0); + for (scaled_op1_digit_num = 0; + scaled_op1_digit_num <= first_nonzero_digit_number; + scaled_op1_digit_num++) { + /* Division of `scaled_op1[ scaled_op1_digit_number ]..scaled_op1[ size + ]' by `normalized_op2[ first_nonzero_digit_number ]..normalized_op2[ + size-1 ]' for evaluation of one digit of quotient `result[ + size-1-first_nonzero_digit_number-scaled_op1_digit_number ]'. + */ + if (scaled_op1[scaled_op1_digit_num] == + normalized_op2[first_nonzero_digit_number]) + q_approximation = UCHAR_MAX; + else + q_approximation = + (scaled_op1[scaled_op1_digit_num] * (UCHAR_MAX + 1) + + scaled_op1[scaled_op1_digit_num + 1]) / + normalized_op2[first_nonzero_digit_number]; + + __pragma_loopbound(0, 0); + while (normalized_op2[first_nonzero_digit_number + 1] * + q_approximation > + (((unsigned long long int) scaled_op1[scaled_op1_digit_num] * + (UCHAR_MAX + 1) + + scaled_op1[scaled_op1_digit_num + 1] - + q_approximation * normalized_op2[first_nonzero_digit_number]) * + (UCHAR_MAX + 1) + + scaled_op1[scaled_op1_digit_num + 2])) + q_approximation--; + + /* Multiply and subtract */ + ammunition_memcpy(extended_normalized_op2 + 1, + normalized_op2 + first_nonzero_digit_number, + (size_t) (size - first_nonzero_digit_number)); + *extended_normalized_op2 = 0; + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size - first_nonzero_digit_number + 1, extended_normalized_op2, + q_approximation); + if (ammunition_subtract_unsigned_integer_without_overflow_reaction( + size - first_nonzero_digit_number + 1, + scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, + scaled_op1 + scaled_op1_digit_num)) { + /* Negative result. Compensation by addition. */ + q_approximation--; + ammunition_memcpy(extended_normalized_op2 + 1, + normalized_op2 + first_nonzero_digit_number, + (size_t) (size - first_nonzero_digit_number)); + *extended_normalized_op2 = 0; + + ammunition_add_unsigned_integer_without_overflow_reaction( + size - first_nonzero_digit_number + 1, + scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, + scaled_op1 + scaled_op1_digit_num); + } + ((unsigned char *) result)[size - 1 - first_nonzero_digit_number + + scaled_op1_digit_num] = q_approximation; + } + ammunition_memset(result, 0, + (size_t) (size - 1 - first_nonzero_digit_number)); + return 0 /* TRUE */; +} + +/* The function divides unsigned integers and fixes overflow reaction + if it is needed. The function makes this with the aid of function + `divide_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_divide_unsigned_integer(int size, const void *op1, const void *op2, + void *result) { + ammunition_overflow_bit = + ammunition_divide_unsigned_integer_without_overflow_reaction( + size, op1, op2, result); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function divides integers and fixes overflow reaction if it is + needed. The function makes this with the aid of function + `divide_unsigned_integer_without_overflow_reaction'. Result can be + placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_divide_integer(int size, const void *op1, const void *op2, + void *result) { + int negative_result_flag; + unsigned char op1_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned char op2_complementary[MAX_INTEGER_OPERAND_SIZE]; + unsigned const char *abs_op1; + unsigned const char *abs_op2; + int unsigned_result_sign; + + negative_result_flag = INTEGER_SIGN(op1) != INTEGER_SIGN(op2); + if (INTEGER_SIGN(op1)) { + /* May be integer overflow for minimal int. But result is correct + because it is unsigned. */ + ammunition_make_complementary_code(size, op1, op1_complementary); + abs_op1 = (unsigned const char *) op1_complementary; + } else + abs_op1 = (unsigned const char *) op1; + if (INTEGER_SIGN(op2)) { + /* May be integer overflow for minimal int. But result is correct + because it is unsigned. */ + ammunition_make_complementary_code(size, op2, op2_complementary); + abs_op2 = (unsigned const char *) op2_complementary; + } else + abs_op2 = (unsigned const char *) op2; + ammunition_overflow_bit = + ammunition_divide_unsigned_integer_without_overflow_reaction( + size, abs_op1, abs_op2, result); + unsigned_result_sign = INTEGER_SIGN(result); + if (negative_result_flag) + ammunition_make_complementary_code(size, result, result); + if (unsigned_result_sign && + (!negative_result_flag || INTEGER_SIGN(result) != unsigned_result_sign)) + /* Unsigned result can not be represented as integer. */ + ammunition_overflow_bit = 1; + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for arbitrary precision evaluation of + remainder. */ + +/* The function evaluates remainder of division of unsigned integers + as `op1 - (op1/op2)*op2' and fixes overflow reaction if it is + needed. Result can be placed in any operand. */ + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_remainder(int size, const void *op1, + const void *op2, void *result) { + unsigned char temporary[MAX_INTEGER_OPERAND_SIZE]; + + ammunition_divide_unsigned_integer(size, op1, op2, temporary); + if (ammunition_overflow_bit) + /* Reaction on zero is called from `divide_unsigned_integer'. */ + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_multiply_unsigned_integer(size, temporary, op2, temporary); + ammunition_subtract_unsigned_integer(size, op1, temporary, result); + } +} + +/* This page contains functions for arbitrary precision number shifts. */ + +/* This function makes right shift of unsigned integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `unsigned_integer_shift_left'. The function fixes overflow when + result can not be represented by number of given size, i.e. in + other words the opposite unsigned shift (to left) results in number + not equal to source operand. Result can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_shift_right(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + + if (bits < 0) + ammunition_unsigned_integer_shift_left(size, operand, -bits, result); + else { + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = (byte_shift >= size ? 0 : size - byte_shift); + byte_number < size; byte_number++) + if (((unsigned char *) operand)[byte_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_memmove((char *) result + byte_shift, operand, + (size_t) (size - byte_shift)); + ammunition_memset(result, 0, (size_t) byte_shift); + if (bit_shift == 0) + return; + __pragma_loopbound(3, 3); + for (byte_number = byte_shift, carry = 0; byte_number < size; + byte_number++) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte >> bit_shift); + carry = (byte << (CHAR_BIT - bit_shift)) & UCHAR_MAX; + } + if (carry != 0) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + } +} + +/* This function makes right arithmetic shift of integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `integer_shift_left'. The function fixes overflow when result can + not be represented by number of given size, i.e. in other words the + opposite shift (to left) results in number not equal to source + operand. Result can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_integer_shift_right(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + int operand_sign; + + if (bits < 0) + ammunition_integer_shift_left(size, operand, -bits, result); + else { + operand_sign = INTEGER_SIGN(operand); + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = (byte_shift >= size ? 0 : size - byte_shift); + byte_number < size; byte_number++) + if (((unsigned char *) operand)[byte_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, (operand_sign ? UCHAR_MAX : 0), + (size_t) size); + else { + ammunition_memmove((char *) result + byte_shift, operand, + (size_t) (size - byte_shift)); + ammunition_memset(result, (operand_sign ? UCHAR_MAX : 0), + (size_t) byte_shift); + if (bit_shift == 0) + return; + carry = + (((operand_sign ? UCHAR_MAX : 0) << (CHAR_BIT - bit_shift)) & + UCHAR_MAX); + __pragma_loopbound(3, 3); + for (byte_number = byte_shift; byte_number < size; byte_number++) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte >> bit_shift); + carry = (byte << (CHAR_BIT - bit_shift)) & UCHAR_MAX; + } + if (carry != 0) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); + } +} + +/* This function makes left shift of unsigned integer of given size on + given number of bits. If number of bits is negative the function + makes shift to left actually with the aid of function + `unsigned_integer_shift_right'. The function fixes overflow when + result can not be represented by number of given size, i.e. i.e. in + other words the opposite shift (to right) results in number not + equal to source operand. Result can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_shift_left(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + + if (bits < 0) + ammunition_unsigned_integer_shift_right(size, operand, -bits, result); + else { + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = 0; byte_number < byte_shift && byte_number < size; + byte_number++) + if (((unsigned char *) operand)[byte_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_memmove(result, (char *) operand + byte_shift, + (size_t) (size - byte_shift)); + ammunition_memset((char *) result + (size - byte_shift), 0, + (size_t) byte_shift); + if (bit_shift == 0) + return; + __pragma_loopbound(2, 3); + for (byte_number = size - byte_shift - 1, carry = 0; + byte_number >= 0; byte_number--) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte << bit_shift); + carry = byte >> (CHAR_BIT - bit_shift); + } + if (carry != 0) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + } +} + +/* This function makes left arithmetic shift of integer of given size + on given number of bits. If number of bits is negative the + function makes shift to left actually with the aid of function + `integer_shift_right'. The function fixes overflow when result can + not be represented by number of given size, i.e. in other words the + opposite shift (to right) results in number not equal to source + operand. Result can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_integer_shift_left(int size, const void *operand, int bits, + void *result) { + int byte_number; + unsigned byte; + unsigned carry; + int bit_shift; + int byte_shift; + int operand_sign; + + if (bits < 0) + ammunition_integer_shift_right(size, operand, -bits, result); + else { + operand_sign = INTEGER_SIGN(operand); + ammunition_overflow_bit = 0; + byte_shift = bits / CHAR_BIT; + bit_shift = bits % CHAR_BIT; + __pragma_loopbound(0, 2); + for (byte_number = 0; byte_number < byte_shift && byte_number < size; + byte_number++) + if (((unsigned char *) operand)[byte_number] != + (operand_sign ? UCHAR_MAX : 0)) { + ammunition_overflow_bit = 1; + break; + } + if (byte_shift >= size) + ammunition_memset(result, 0, (size_t) size); + else { + ammunition_memmove(result, (char *) operand + byte_shift, + (size_t) (size - byte_shift)); + ammunition_memset((char *) result + (size - byte_shift), 0, + (size_t) byte_shift); + if (bit_shift == 0) + return; + __pragma_loopbound(2, 3); + for (byte_number = size - byte_shift - 1, carry = 0; + byte_number >= 0; byte_number--) { + byte = ((unsigned char *) result)[byte_number]; + ((unsigned char *) result)[byte_number] = + carry | (byte << bit_shift); + carry = byte >> (CHAR_BIT - bit_shift); + } + if (carry != ((unsigned) (operand_sign ? UCHAR_MAX : 0) >> + (CHAR_BIT - bit_shift))) + ammunition_overflow_bit = 1; + } + if (operand_sign != INTEGER_SIGN(result)) + ammunition_overflow_bit = 1; + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); + } +} + +/* This page contains functions for bitwise operations of arbitrary + precision numbers. */ + +/* This function makes bitwise `or' of two integers of given size. */ + +__attribute__((always_inline)) static inline void +ammunition_integer_or(int size, const void *op1, const void *op2, + void *result) { + int byte_number; + + __pragma_loopbound(4, 4); + for (byte_number = 0; byte_number < size; byte_number++) { + ((unsigned char *) result)[byte_number] = + ((unsigned char *) op1)[byte_number] | + ((unsigned char *) op2)[byte_number]; + } +} + +/* This function makes bitwise `or' of two unsigned integers of given + size. */ + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_or(int size, const void *op1, const void *op2, + void *result) { + ammunition_integer_or(size, op1, op2, result); +} + +/* This function makes bitwise `and' of two integers of given size. */ + +__attribute__((always_inline)) static inline void +ammunition_integer_and(int size, const void *op1, const void *op2, + void *result) { + int byte_number; + + __pragma_loopbound(4, 4); + for (byte_number = 0; byte_number < size; byte_number++) { + ((unsigned char *) result)[byte_number] = + ((unsigned char *) op1)[byte_number] & + ((unsigned char *) op2)[byte_number]; + } +} + +/* This function makes bitwise `and' of two unsigned integers of given + size. */ + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_and(int size, const void *op1, const void *op2, + void *result) { + ammunition_integer_and(size, op1, op2, result); +} + +/* This function makes bitwise `not' of integer of given size. */ + +__attribute__((always_inline)) static inline void +ammunition_integer_not(int size, const void *operand, void *result) { + int byte_number; + + __pragma_loopbound(4, 4); + for (byte_number = 0; byte_number < size; byte_number++) { + ((unsigned char *) result)[byte_number] = + ((unsigned char *) operand)[byte_number] ^ UCHAR_MAX; + } +} + +/* This function makes bitwise `not' of unsigned integer of given + size. */ + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_not(int size, const void *operand, void *result) { + ammunition_integer_not(size, operand, result); +} + +/* This page contains functions for comparison of arbitrary precision + numbers. */ + +/* This function compares two unsigned integers of given size on + equality. The function returns 1 if unsigned integers are equal, 0 + otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_eq_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) == 0; +} + +/* This function compares two integers of given size on equality. The + function returns 1 if integers are equal, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_eq_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) == 0; +} + +/* This function compares two unsigned integers of given size on + inequality. The function returns 1 if unsigned integers are not + equal, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_ne_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) != 0; +} + +/* This function compares two integers of given size on inequality. + The function returns 1 if integers are not equal, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_ne_integer(int size, const void *op1, const void *op2) { + return ammunition_memcmp(op1, op2, (size_t) size) != 0; +} + +/* This function compares two memory parts of given size on that the + first operand is greater than the second. The bytes are described + as unsigned. The function returns 1 if the first operand is + greater than the second, - 1 if the first operand is less than the + second, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_bytes_comparison(const void *op1, const void *op2, int size) { + const unsigned char *str1 = (unsigned const char *) op1; + const unsigned char *str2 = (unsigned const char *) op2; + + __pragma_loopbound(1, 4); + while (size > 0 && *str1 == *str2) { + str1++; + str2++; + size--; + } + if (size <= 0) + return 0; + else if (*str1 > *str2) + return 1; + else + return -1; +} + +/* This function compares two unsigned integers of given size on that + the first operand is greater than the second. The function returns + 1 if the first unsigned integer is greater than the second, 0 + otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_gt_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) > 0; +} + +/* This function compares two integers of given size on that the first + operand is greater than the second. The function returns 1 if the + first integer is greater than the second, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_gt_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) > 0; + else + return 1; /* TRUE */ + } else if (INTEGER_SIGN(op2) == 0) + return 0; /*FALSE*/ + else + return ammunition_bytes_comparison(op1, op2, size) > 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is less than the second. The function returns 1 + if the first unsigned integer is less than the second, 0 + otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_lt_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) < 0; +} + +/* This function compares two integers of given size on that the first + operand is less than the second. The function returns 1 if the + first integer is less than the second, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_lt_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) < 0; + else + return 0; /*FALSE*/ + } else if (INTEGER_SIGN(op2) == 0) + return 1; /* TRUE */ + else + return ammunition_bytes_comparison(op1, op2, size) < 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is greater than or equal to the second. The + function returns 1 if the first unsigned integer is greater than or + equal to the second, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_ge_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) >= 0; +} + +/* This function compares two integers of given size on that the first + operand is greater than or equal to the second. The function + returns 1 if the first integer is greater than or equal to the + second, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_ge_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) >= 0; + else + return 1; /* TRUE */ + } else if (INTEGER_SIGN(op2) == 0) + return 0; /*FALSE*/ + else + return ammunition_bytes_comparison(op1, op2, size) >= 0; +} + +/* This function compares two unsigned integers of given size on that + the first operand is less than or equal to the second. The + function returns 1 if the first unsigned integer is less than or + equal to the second, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_le_unsigned_integer(int size, const void *op1, const void *op2) { + return ammunition_bytes_comparison(op1, op2, size) <= 0; +} + +/* This function compares two integers of given size on that the first + operand is less than or equal to the second. The function returns + 1 if the first integer is less than or equal to the second, 0 + otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_le_integer(int size, const void *op1, const void *op2) { + if (INTEGER_SIGN(op1) == 0) { + if (INTEGER_SIGN(op2) == 0) + return ammunition_bytes_comparison(op1, op2, size) <= 0; + else + return 0; /*FALSE*/ + } else if (INTEGER_SIGN(op2) == 0) + return 1; /* TRUE */ + else + return ammunition_bytes_comparison(op1, op2, size) <= 0; +} + +/* This page contains functions for changing size of arbitrary + precision numbers. */ + +/* The function changes size of unsigned integer. The function fixes + overflow when result can not be represented by number of given + size. Result can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_change_unsigned_integer_size(int operand_size, const void *operand, + int result_size, void *result) { + int operand_digit_number; + + ammunition_overflow_bit = 0; + if (operand_size <= result_size) { + ammunition_memmove((char *) result + result_size - operand_size, + operand, (size_t) operand_size); + ammunition_memset(result, 0, (size_t) (result_size - operand_size)); + } else { + __pragma_loopbound(1, 2); + for (operand_digit_number = 0; + operand_digit_number < operand_size - result_size; + operand_digit_number++) { + if (((unsigned char *) operand)[operand_digit_number] != 0) { + ammunition_overflow_bit = 1; + break; + } + } + ammunition_memmove(result, + (char *) operand + operand_size - result_size, + (size_t) result_size); + } + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); +} + +/* The function changes size of integer. The function fixes overflow + when result can not be represented by number of given size. Result + can be placed in operand. */ + +__attribute__((always_inline)) static inline void +ammunition_change_integer_size(int operand_size, const void *operand, + int result_size, void *result) { + int operand_digit_number; + int operand_sign; + + ammunition_overflow_bit = 0; + operand_sign = INTEGER_SIGN(operand); + if (operand_size <= result_size) { + ammunition_memmove((char *) result + result_size - operand_size, + operand, (size_t) operand_size); + ammunition_memset(result, (operand_sign ? UCHAR_MAX : 0), + (size_t) (result_size - operand_size)); + } else { + __pragma_loopbound(2, 2); + for (operand_digit_number = 0; + operand_digit_number < operand_size - result_size; + operand_digit_number++) { + if (((unsigned char *) operand)[operand_digit_number] != + (operand_sign ? UCHAR_MAX : 0)) { + ammunition_overflow_bit = 1; + break; + } + } + ammunition_memmove(result, + (char *) operand + operand_size - result_size, + (size_t) result_size); + if (operand_sign != INTEGER_SIGN(result)) + ammunition_overflow_bit = 1; + } + if (ammunition_overflow_bit) + ammunition_arithmetic_overflow_reaction(); +} + +/* This page contains functions for conversion of arbitrary precision + numbers to ascii representation. */ + +/* This function transforms unsigned integer of given size to BASE + ascii representation. BASE should be between 2 and 36 including + them. Digits more 9 are represented by 'a', 'b' etc. Sign is + absent in result string. The function returns the result + string. */ + +__attribute__((always_inline)) static inline char * +ammunition_unsigned_integer_to_based_string(int size, const void *operand, + int base, char *result) { + int digit_num; + int i; + unsigned long long divisable; + unsigned long long remainder; + int nonzero_flag; + int length; + int temporary; + unsigned char operand_copy[MAX_INTEGER_OPERAND_SIZE]; + + ammunition_memcpy(operand_copy, operand, (size_t) size); + length = 0; + __pragma_loopbound(1, 10); + do { + nonzero_flag = 0 /* FALSE */; + __pragma_loopbound(2, 6); + for (digit_num = 0, remainder = 0; digit_num < size; digit_num++) { + divisable = remainder * (UCHAR_MAX + 1) + operand_copy[digit_num]; + remainder = divisable % base; + operand_copy[digit_num] = (unsigned char) (divisable / base); + if (operand_copy[digit_num] != 0) + nonzero_flag = 1 /* TRUE */; + } + result[length++] = + (unsigned char) (remainder < 10 ? '0' + remainder + : 'a' + remainder - 10); + } while (nonzero_flag); + result[length] = '\0'; + __pragma_loopbound(0, 5); + for (i = 0; i < length / 2; i++) { + temporary = result[i]; + result[i] = result[length - i - 1]; + result[length - i - 1] = temporary; + } + return result; +} + +/* This function transforms unsigned integer of given size to decimal + ascii representation. Sign is absent in result string. The + function returns the result string. */ + +__attribute__((always_inline)) static inline char * +ammunition_unsigned_integer_to_string(int size, const void *operand, + char *result) { + return ammunition_unsigned_integer_to_based_string(size, operand, 10, + result); +} + +/* This function transforms integer of given size to BASE ascii + representation. BASE should be between 2 and 36 including them. + Digits more 9 are represented by 'a', 'b' etc. Sign is present in + result string only for negative numbers. The function returns the + result string. */ + +__attribute__((always_inline)) static inline char * +ammunition_integer_to_based_string(int size, const void *operand, int base, + char *result) { + unsigned char operand_copy[MAX_INTEGER_OPERAND_SIZE]; + + if (!INTEGER_SIGN(operand)) + return ammunition_unsigned_integer_to_based_string(size, operand, base, + result); + ammunition_memcpy(operand_copy, operand, (size_t) size); + /* May be integer overflow. But result is correct because it is unsigned. */ + ammunition_make_complementary_code(size, operand_copy, operand_copy); + *result = '-'; + ammunition_unsigned_integer_to_based_string(size, operand_copy, base, + result + 1); + return result; +} + +/* This function transforms integer of given size to decimal ascii + representation. Sign is present in result string only for negative + numbers. The function returns the result string. */ + +__attribute__((always_inline)) static inline char * +ammunition_integer_to_string(int size, const void *operand, char *result) { + return ammunition_integer_to_based_string(size, operand, 10, result); +} + +/* This page contains functions for conversion of decimal ascii + representation to arbitrary precision numbers. */ + +/* The function adds digit (byte size) to unsigned integer. The + function returns 1 if unsigned integer overflow is fixed, 0 + otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_add_digit_to_unsigned_integer_without_overflow_reaction( + int size, void *operand, unsigned int digit) { + int digit_num; + unsigned int carry; + unsigned int sum; + + __pragma_loopbound(4, 4); + for (digit_num = size - 1, carry = digit; digit_num >= 0; digit_num--) { + sum = ((unsigned char *) operand)[digit_num] + carry; + if (sum > UCHAR_MAX) { + carry = sum / (UCHAR_MAX + 1); + sum %= UCHAR_MAX + 1; + } else + carry = 0; + ((unsigned char *) operand)[digit_num] = sum; + } + return carry != 0; +} + +/* This function transforms source string (decimal ascii + representation without sign) to given size unsigned integer and + returns pointer to first non digit in the source string through a + parameter. If the string started with invalid integer + representation the result will be zero and returns the operand + through the parameter. The function returns 1 if unsigned integer + overflow is fixed, 0 otherwise. */ + +__attribute__((always_inline)) static inline int +ammunition_string_to_unsigned_integer_without_overflow_reaction( + int size, const char *operand, void *result, char **first_nondigit) { + int overflow_flag; + + ammunition_memset(result, 0, (size_t) size); + __pragma_loopbound(1, 10); + for (overflow_flag = 0; ammunition_isdigit(*operand); operand++) { + overflow_flag = + overflow_flag || + ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction( + size, result, 10); + overflow_flag = + overflow_flag || + ammunition_add_digit_to_unsigned_integer_without_overflow_reaction( + size, result, *operand - '0'); + } + *first_nondigit = (char *) operand; + return overflow_flag; +} + +/* This function skips all white spaces at the begin of source string + and transforms tail of the source string (decimal ascii + representation without sign) to given size unsigned integer with + the aid of function + `string_to_unsigned_integer_without_overflow_reaction'. If the + string started with invalid unsigned integer representation the + result will be zero. The function fixes overflow when result can + not be represented by number of given size. The function returns + address of the first nondigit in the source string. */ + +__attribute__((always_inline)) static inline char * +ammunition_unsigned_integer_from_string(int size, const char *operand, + void *result) { + char *first_nondigit; + + __pragma_loopbound(0, 0); + while (ammunition_isspace(*operand)) + operand++; + ammunition_overflow_bit = + ammunition_string_to_unsigned_integer_without_overflow_reaction( + size, operand, result, &first_nondigit); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + return first_nondigit; +} + +/* This function skips all white spaces at the begin of source string + and transforms tail of the source string (decimal ascii + representation with possible sign `+' or `-') to given size integer + with the aid of function + `string_to_unsigned_integer_without_overflow_reaction'. If the + string started with invalid integer representation the result will + be zero. The function fixes overflow when result can not be + represented by number of given size. the function returns Address + of the first nondigit in the source string. */ + +__attribute__((always_inline)) static inline char * +ammunition_integer_from_string(int size, const char *operand, void *result) { + int negative_number_flag; + char *first_nondigit; + int unsigned_result_sign; + + __pragma_loopbound(0, 0); + while (ammunition_isspace(*operand)) + operand++; + negative_number_flag = 0; /* FALSE */ + if (*operand == '+') + operand++; + else if (*operand == '-') { + operand++; + negative_number_flag = 1; /* TRUE */ + } + ammunition_overflow_bit = + ammunition_string_to_unsigned_integer_without_overflow_reaction( + size, operand, result, &first_nondigit); + unsigned_result_sign = INTEGER_SIGN(result); + if (negative_number_flag) + /* May be integer overflow when `result' is correct. But result + is correct because it is unsigned. */ + ammunition_make_complementary_code(size, result, result); + ammunition_overflow_bit = ammunition_overflow_bit || + (unsigned_result_sign && + (!negative_number_flag || + INTEGER_SIGN(result) != unsigned_result_sign)); + if (ammunition_overflow_bit) + ammunition_arithmetic_unsigned_overflow_reaction(); + return first_nondigit; +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.h new file mode 100644 index 0000000..d447206 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/arithm.h @@ -0,0 +1,139 @@ +/* + FILE NAME: arithm.h + + TITLE: Include file of package for arbitrary precision integer + arithmetic + + DESCRIPTION: This header file contains ANSI C prototype definitions of + the package functions and definitions of external + variable of the package and C++ classes for arbitrary + precision integer arithmetic. + +*/ + +#ifndef __ARITHMETIC__ +#define __ARITHMETIC__ + +#include "ammunition_limits.h" + +/* This page contains definitions of variables and macros common for + all package functions. */ + +/* The value of macro is suggested to be maximum length of integer operands + The length of use integers should be not greater than this value. */ + +#define MAX_INTEGER_OPERAND_SIZE 128 + +/* The following macro value is sign of integer number (0 or 1) given + as macro parameter. */ + +#define INTEGER_SIGN(operand) (*(unsigned char *) (operand) >> (CHAR_BIT - 1)) + +extern int ammunition_overflow_bit; + +__attribute__((always_inline)) static inline void +ammunition_add_unsigned_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_add_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_subtract_unsigned_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_subtract_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_multiply_unsigned_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_multiply_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_divide_unsigned_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_divide_integer(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_remainder(int size, const void *op1, + const void *op2, void *result); + +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_shift_right(int size, const void *operand, int bits, + void *result); +__attribute__((always_inline)) static inline void +ammunition_integer_shift_right(int size, const void *operand, int bits, + void *result); +__attribute__((always_inline)) static inline void +ammunition_integer_shift_left(int size, const void *operand, int bits, + void *result); +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_shift_left(int size, const void *operand, int bits, + void *result); + +__attribute__((always_inline)) static inline void +ammunition_integer_or(int size, const void *op1, const void *op2, void *result); +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_or(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_integer_and(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_and(int size, const void *op1, const void *op2, + void *result); +__attribute__((always_inline)) static inline void +ammunition_integer_not(int size, const void *operand, void *result); +__attribute__((always_inline)) static inline void +ammunition_unsigned_integer_not(int size, const void *operand, void *result); + +__attribute__((always_inline)) static inline int +ammunition_eq_unsigned_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_eq_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_ne_unsigned_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_ne_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_gt_unsigned_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_gt_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_lt_unsigned_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_lt_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_ge_unsigned_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_ge_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_le_unsigned_integer(int size, const void *op1, const void *op2); +__attribute__((always_inline)) static inline int +ammunition_le_integer(int size, const void *op1, const void *op2); + +__attribute__((always_inline)) static inline void +ammunition_change_unsigned_integer_size(int operand_size, const void *operand, + int result_size, void *result); +__attribute__((always_inline)) static inline void +ammunition_change_integer_size(int operand_size, const void *operand, + int result_size, void *result); + +__attribute__((always_inline)) static inline char * +ammunition_unsigned_integer_to_string(int size, const void *operand, + char *result); +__attribute__((always_inline)) static inline char * +ammunition_integer_to_string(int size, const void *operand, char *result); + +__attribute__((always_inline)) static inline char * +ammunition_unsigned_integer_from_string(int size, const char *operand, + void *result); +__attribute__((always_inline)) static inline char * +ammunition_integer_from_string(int size, const char *operand, void *result); + +__attribute__((always_inline)) static inline char +ammunition_isdigit(unsigned char c); +__attribute__((always_inline)) static inline int ammunition_isspace(int c); + +#endif /* #ifndef __ARITHMETIC__ */ diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.c b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.c new file mode 100644 index 0000000..9915cd3 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.c @@ -0,0 +1,305 @@ +/* + + FILE NAME: bits.c + + TITLE: Package for work with bits + + DESCRIPTION: This file implements functions of the package for work + with bit strings. A bit is given by address (start address) of + byte from which counting bits starts and its displacement which + is any non negative number of bit from the start address. The + most significant bit of the start address byte has number 0. + The bit string is given by its first bit and its length in + bits. + +*/ + +#include "bits.h" + +/* This function determines that given bit string contains only zero + bits. The function retruns TRUE if all bits of given bit string + are zero or `bit_length' <= 0. Value of `bit_displacement' must be + non-negative and can be greater than CHAR_BIT. */ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int +ammunition_is_zero_bit_string(const void *start_byte, int bit_displacement, + int bit_length) { + const unsigned char *current_byte = (unsigned const char *) start_byte; + + if (bit_length <= 0) + return 1 /* TRUE */; + current_byte += bit_displacement / CHAR_BIT; + bit_displacement %= CHAR_BIT; + if (bit_length < CHAR_BIT - bit_displacement) + return (((*current_byte << bit_displacement) & + (UCHAR_MAX << (CHAR_BIT - bit_length))) & + UCHAR_MAX) == 0; + else if (bit_displacement != 0) { + if (((*current_byte << bit_displacement) & UCHAR_MAX) != 0) + return 0 /* FALSE */; + current_byte += 1; + bit_length -= CHAR_BIT - bit_displacement; + } + __pragma_loopbound(0, 7); + while (bit_length >= CHAR_BIT) { + if (*current_byte != 0) + return 0 /* FALSE */; + current_byte++; + bit_length -= CHAR_BIT; + } + if (bit_length > 0 && (*current_byte >> (CHAR_BIT - bit_length)) != 0) + return 0 /* FALSE */; + return 1 /* TRUE */; +} + +/* This function sets up new value of all bits of given bit string. + This function is analog of standard C function `memset'. Value of + `bit_displacement' must be non-negative and can be greater than + CHAR_BIT. */ + +__attribute__((always_inline)) static inline void +ammunition_bit_string_set(void *start_byte, int bit_displacement, int bit, + int bit_length) { + unsigned char *current_byte = (unsigned char *) start_byte; + unsigned char filling_byte; + int mask; + + if (bit_length <= 0) + return; + bit = bit != 0; /* 1 or 0 */ + filling_byte = (bit ? UCHAR_MAX : 0); + current_byte += bit_displacement / CHAR_BIT; + bit_displacement %= CHAR_BIT; + if (bit_displacement != 0) { + mask = UCHAR_MAX << (CHAR_BIT - bit_displacement); + if (bit_length < CHAR_BIT - bit_displacement) + mask |= UCHAR_MAX >> (bit_displacement + bit_length); + *current_byte = (*current_byte & mask) | (filling_byte & ~mask); + current_byte += 1; + bit_length -= CHAR_BIT - bit_displacement; + } + __pragma_loopbound(0, 8); + while (bit_length >= CHAR_BIT) { + *current_byte = filling_byte; + current_byte++; + bit_length -= CHAR_BIT; + } + if (bit_length > 0) + *current_byte = + (*current_byte & ~(UCHAR_MAX << (CHAR_BIT - bit_length))) | + (filling_byte & (UCHAR_MAX << (CHAR_BIT - bit_length))); +} + +/* This function copys a bit string to another bit string. This + function is analog of standard C function `memcpy'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string must + be non-overlapped. */ + +__attribute__((always_inline)) static inline void +ammunition_bit_string_copy(void *to, int to_bit_displacement, const void *from, + int from_bit_displacement, int bit_length) { + unsigned char *current_to_byte = (unsigned char *) to; + const unsigned char *current_from_byte = (unsigned const char *) from; + int byte; + int mask; + + if (bit_length <= 0) + return; + current_to_byte += to_bit_displacement / CHAR_BIT; + to_bit_displacement %= CHAR_BIT; + current_from_byte += from_bit_displacement / CHAR_BIT; + from_bit_displacement %= CHAR_BIT; + __pragma_loopbound(0, 7); + while (1) { + byte = + (((*current_from_byte << from_bit_displacement) & UCHAR_MAX) | + (from_bit_displacement != 0 && + bit_length > (CHAR_BIT - from_bit_displacement) + ? current_from_byte[1] >> (CHAR_BIT - from_bit_displacement) + : 0)); + if (bit_length <= CHAR_BIT) + break; + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + *current_to_byte = (*current_to_byte & + (UCHAR_MAX << (CHAR_BIT - to_bit_displacement))) | + (byte >> to_bit_displacement); + if (to_bit_displacement != 0) + current_to_byte[1] = + (current_to_byte[1] & (UCHAR_MAX >> to_bit_displacement)) | + (byte << (CHAR_BIT - to_bit_displacement)); + bit_length -= CHAR_BIT; + current_from_byte++; + current_to_byte++; + } + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + mask = ((UCHAR_MAX << (CHAR_BIT - to_bit_displacement)) | + (UCHAR_MAX >> (to_bit_displacement + bit_length))); + *current_to_byte = + (*current_to_byte & mask) | ((byte >> to_bit_displacement) & ~mask); + bit_length -= CHAR_BIT - to_bit_displacement; + if (bit_length > 0) + current_to_byte[1] = (current_to_byte[1] & (UCHAR_MAX >> bit_length)) | + ((byte << (CHAR_BIT - to_bit_displacement)) & + (UCHAR_MAX << (CHAR_BIT - bit_length))); +} + +/* This function copys a bit string to another bit string. Copying + starts with the last bits of the bit strings. This function is + used by function `bit_string_move'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string must + be non-overlapped. */ + +__attribute__((always_inline)) static inline void +ammunition_reverse_bit_string_copy(void *to, int to_bit_displacement, + const void *from, int from_bit_displacement, + int bit_length) { + unsigned char *current_to_byte = (unsigned char *) to; + const unsigned char *current_from_byte = (unsigned const char *) from; + int byte; + int mask; + + if (bit_length <= 0) + return; + to_bit_displacement += bit_length - 1; + current_to_byte += to_bit_displacement / CHAR_BIT; /* last byte */ + to_bit_displacement %= CHAR_BIT; /* last bit */ + from_bit_displacement += bit_length - 1; + current_from_byte += from_bit_displacement / CHAR_BIT; /* last byte */ + from_bit_displacement %= CHAR_BIT; /* last bit */ + __pragma_loopbound(0, 7); + while (1) { + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + byte = ((*current_from_byte >> (CHAR_BIT - 1 - from_bit_displacement)) | + ((from_bit_displacement != CHAR_BIT - 1 && + bit_length > from_bit_displacement + 1 + ? current_from_byte[-1] << (from_bit_displacement + 1) + : 0) & + UCHAR_MAX)); + if (bit_length <= CHAR_BIT) + break; + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + *current_to_byte = + (*current_to_byte & (UCHAR_MAX >> (to_bit_displacement + 1))) | + (byte << (CHAR_BIT - 1 - to_bit_displacement)); + if (to_bit_displacement != CHAR_BIT - 1) + current_to_byte[-1] = + (current_to_byte[-1] & + (UCHAR_MAX << (CHAR_BIT - 1 - to_bit_displacement))) | + (byte >> (to_bit_displacement + 1)); + bit_length -= CHAR_BIT; + current_from_byte--; + current_to_byte--; + } + /* Shift is correct when to_bit_displacement == 0 because its + value is less than word bit size. */ + mask = ((UCHAR_MAX >> (to_bit_displacement + 1)) | + (UCHAR_MAX << (CHAR_BIT - 1 - to_bit_displacement + bit_length))); + *current_to_byte = (*current_to_byte & mask) | + ((byte << (CHAR_BIT - 1 - to_bit_displacement)) & ~mask); + bit_length -= to_bit_displacement + 1; + if (bit_length > 0) + current_to_byte[-1] = + (current_to_byte[-1] & (UCHAR_MAX << bit_length)) | + (byte >> (to_bit_displacement + 1) & + (UCHAR_MAX >> (CHAR_BIT - bit_length))); +} + +/* This function copys a bit string to another bit string with the aid + of functions `bit_string_copy' and `reverse_bit_string_copy'. This + function is analog of standard C function `memmove'. Values of + `to_bit_displacement' and `from_bit_displacement' must be + non-negative and can be greater than CHAR_BIT. The bit string can + be overlapped. */ + +__attribute__((always_inline)) static inline void +ammunition_bit_string_move(void *to, int to_bit_displacement, const void *from, + int from_bit_displacement, int bit_length) { + unsigned char *current_to_byte = (unsigned char *) to; + const unsigned char *current_from_byte = (unsigned const char *) from; + + if (bit_length <= 0) + return; + current_to_byte += to_bit_displacement / CHAR_BIT; + to_bit_displacement %= CHAR_BIT; + current_from_byte += from_bit_displacement / CHAR_BIT; + from_bit_displacement %= CHAR_BIT; + if (current_from_byte > current_to_byte || + (current_from_byte == current_to_byte && + from_bit_displacement > to_bit_displacement)) + ammunition_bit_string_copy(current_to_byte, to_bit_displacement, + current_from_byte, from_bit_displacement, + bit_length); + else + ammunition_reverse_bit_string_copy(current_to_byte, to_bit_displacement, + current_from_byte, + from_bit_displacement, bit_length); +} + +/* This function compares bit strings. This function is analog of + standard C function `memcmp'. The function returns 0 if the bit + strings are equal, 1 if the first bit string is greater than the + second, -1 if the first bit string is less than the first. Values + of `bit_displacement1' and `bit_displacement2' must be non-negative + and can be greater than CHAR_BIT. */ + +__attribute__((always_inline)) static inline int +ammunition_bit_string_comparison(const void *str1, int bit_displacement1, + const void *str2, int bit_displacement2, + int bit_length) { + const unsigned char *current_byte1 = (unsigned const char *) str1; + const unsigned char *current_byte2 = (unsigned const char *) str2; + int byte1; + int byte2; + int mask; + + if (bit_length <= 0) + return 0; + current_byte1 += bit_displacement1 / CHAR_BIT; + bit_displacement1 %= CHAR_BIT; + current_byte2 += bit_displacement2 / CHAR_BIT; + bit_displacement2 %= CHAR_BIT; + __pragma_loopbound(0, 7); + while (1) { + byte1 = (((*current_byte1 << bit_displacement1) & UCHAR_MAX) | + (bit_displacement1 != 0 + /* Shift is correct when to_bit_displacement == 0 + because its value is less than word bit size. */ + && bit_length > CHAR_BIT - bit_displacement1 + ? current_byte1[1] >> (CHAR_BIT - bit_displacement1) + : 0)); + byte2 = (((*current_byte2 << bit_displacement2) & UCHAR_MAX) | + (bit_displacement2 != 0 && + bit_length > CHAR_BIT - bit_displacement2 + ? current_byte2[1] >> (CHAR_BIT - bit_displacement2) + : 0)); + if (bit_length <= CHAR_BIT) + break; + if (byte1 > byte2) + return 1; + else if (byte1 < byte2) + return -1; + bit_length -= CHAR_BIT; + current_byte2++; + current_byte1++; + } + /* Shift is correct when to_bit_displacement == 0 because its value + is less than word bit size. */ + mask = UCHAR_MAX << (CHAR_BIT - bit_length); + if ((byte1 & mask) > (byte2 & mask)) + return 1; + else if ((byte1 & mask) < (byte2 & mask)) + return -1; + else + return 0; +} diff --git a/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.h b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.h new file mode 100644 index 0000000..6bb4585 --- /dev/null +++ b/targets/wasm-tacle/sequential/ammunition/generated/modified_sources/inline/bits.h @@ -0,0 +1,61 @@ +/* + FILE NAME: bits.h + + TITLE: Include file of package for work with bits + + DESCRIPTION: + This is header file contains macros and the ANSI C prototype + definitions for the package for work with bits and bit strings + and C++ class for work with bits and bit strings. A bit is + given by address (start address) of byte from which counting + bits starts and its displacement which is any non negative + number of bit from the start address. The most significant bit + of the start address byte has number 0. The bit string is + given by its first bit and its length in bits. + +*/ + +#ifndef __BITS__ +#define __BITS__ + +#include "ammunition_limits.h" + +/* This macro value returns bit vlaue (0 or 1) with given bit + displacement (0, 1, ...). The macro has side effects! Value of + `bit_displacement' must be nonegative and can be greater than + CHAR_BIT. */ + +#define BIT(start_byte, bit_displacement) \ + ((((const char *) (start_byte))[(bit_displacement) / CHAR_BIT] >> \ + (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)) & \ + 1) + +/* This macro value sets up new value (must be `0' or `1') of a given + bit (bit displacement starts with 0). The macro has side effects! + Value of `bit_displacement' must be nonegative and can be greater + than CHAR_BIT. */ + +#define SET_BIT(start_byte, bit_displacement, bit) \ + (((char *) (start_byte))[(bit_displacement) / CHAR_BIT] = \ + (((char *) (start_byte))[(bit_displacement) / CHAR_BIT] & \ + ~(1 << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) | \ + ((bit) << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) + +__attribute__((always_inline)) static inline int +ammunition_is_zero_bit_string(const void *start_byte, int bit_displacement, + int bit_length); +__attribute__((always_inline)) static inline void +ammunition_bit_string_set(void *start_byte, int bit_displacement, int bit, + int bit_length); +__attribute__((always_inline)) static inline void +ammunition_bit_string_copy(void *to, int to_bit_displacement, const void *from, + int from_bit_displacement, int bit_length); +__attribute__((always_inline)) static inline void +ammunition_bit_string_move(void *to, int to_bit_displacement, const void *from, + int from_bit_displacement, int bit_length); +__attribute__((always_inline)) static inline int +ammunition_bit_string_comparison(const void *str1, int bit_displacement1, + const void *str2, int bit_displacement2, + int bit_length); + +#endif /* #ifndef __BITS__ */ diff --git a/targets/wasm-tacle/sequential/anagram/CMakeLists.txt b/targets/wasm-tacle/sequential/anagram/CMakeLists.txt new file mode 100644 index 0000000..dd20288 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/CMakeLists.txt @@ -0,0 +1,27 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(anagram) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/anagram.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/anagram.c" + "generated/modified_sources/default/anagram_input.c" + "generated/modified_sources/default/anagram_stdlib.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/anagram/ChangeLog.txt b/targets/wasm-tacle/sequential/anagram/ChangeLog.txt new file mode 100755 index 0000000..fdba1cc --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/ChangeLog.txt @@ -0,0 +1,125 @@ +File: anagram.c +Original provenience: unknown +Source: unknown + +2017-04-18: +- Annotated anagram_main as entry-point for timing analysis + +2016-06-22: +- Fixed type signature of function anagram_main to conform to TACLeBench + standard, i.e. `void anagram_main (void)`. + +2016-05-24: +- Changed type of global variables anagram_achPhrase and + anagram_dictionary to `char const *[]`. +- Changed parameter type of function anagram_BuildMask to + `char const *`. + +2016-04-26: +- Fixed array out-of-bounds access introduced by earlier change. + +2016-04-20: +- Fixed some compiler warnings. +- Return value of anagram_return depends on the computation inside + of anagram_main. + +2016-03-22 +- Added forward declarations for all functions. +- Renamed function main to anagram_main. +- Added function anagram_init that calls anagram_ReadDict, removed + call to anagram_ReadDict from anagram_main. +- Added function anagram_return that handles the return value. +- Added new function main that first calls anagram_init, + then anagram_main and finally returns the return value of + anagram_return. +- Added generic TACLeBench header to all files. +- Introduced comments to split file in sections for type + definitions, forward declarations, global variables, + initialization-related and return-value-related functions, + core benchmark functions, and main routine. +- Renamed ch2i, DICTWORDS, Quad, MASK_BITS, MAX_QUADS, MAXCAND, + MAXSOL, ALPHABET, Word, PWord, PPWord, apwCand, cpwCand, Letter, + PLetter, alPhrase, cchPhraseLength, aqMainMask, aqMainSign, + cchMinLength, auGlobalFrequency, achByFrequency, pchDictionary, + Reset, ReadDict, BuildMask, NewWord, NextWord, BuildWord, + AddWords, apwSol, cpwLast, OneStep, DumpWords, FindAnagram and + SortCandidates to anagram_ch2i, anagram_DICTWORDS, anagram_Quad, + anagram_MASK_BITS, anagram_MAX_QUADS, anagram_MAXCAND, + anagram_MAXSOL, anagram_ALPHABET, anagram_Word, anagram_PWord, + anagram_PPWord, anagram_apwCand, anagram_cpwCand, anagram_Letter, + anagram_PLetter, anagram_alPhrase, anagram_cchPhraseLength, + anagram_aqMainMask, anagram_aqMainSign, anagram_cchMinLength, + anagram_auGlobalFrequency, anagram_achByFrequency, + anagram_pchDictionary, anagram_Reset, anagram_ReadDict, + anagram_BuildMask, anagram_NewWord, anagram_NextWord, + anagram_BuildWord, anagram_AddWords, anagram_apwSol, + anagram_cpwLast, anagram_OneStep, anagram_DumpWords, + anagram_FindAnagram and anagram_SortCandidates. +- Renamed swapi, pivot, qsorts, simulated_heap and freeHeapPos to + anagram_swapi, anagram_pivot, anagram_qsorts, + anagram_simulated_heap and anagram_freeHeapPos. +- Renamed achPhrase and dictionary to anagram_achPhrase and + anagram_dictionary. +- Renamed CompareFrequency to anagram_CompareFrequency. +- Increased simulated heap in anagram_stdlib.c to 18000 bytes to + prevent segmentation fault. +- Changed header guard _WCCMALLOC_H to ANAGRAM_STRINGS_H. +- Renamed wccmalloc, wccbzero to anagram_malloc, anagram_bzero. +- Moved declaration of anagram_malloc to header anagram_stdlib.h. +- Introduced header guard ANAGRAM_CTYPE_H. +- Renamed wccislower, wccisupper, wccisalpha, wcctolower to + anagram_islower, anagram_isupper, anagram_isalpha, + anagram_tolower. +- Removed illegal keyword "inline". +- Changed header guard _WCCSTDLIB_H to ANAGRAM_STDLIB_H. +- Renamed wccqsort to anagram_qsort. +- Fixed compiler warning "no previous extern declaration for + non-static variable" for variables simulated_heap and + freeHeapPos by declaring them static. +- Renamed preprocessor define HEAP_SIZE to ANAGRAM_HEAP_SIZE. +- Fixed compiler warning "no previous prototype for function" by + moving includes to the top of the file. +- Fixed compiler warnings "implicit conversion changes signedness" + and "comparison of integers of different signs" by consistenly + using the type unsigned long in qsort helper functions. +- Moved function CompareFrequency to file anagram.c, added + declaration for it in file anagram_compare.h and included it in + anagram_stdlib.h. +- Fixed compiler warning "no previous extern declaration for + non-static variable" by adding forward declarations. +- Fixed compiler warning "macro is not used" by removing unused + macros MAXWORDS and i2ch. +- Replaced macro ch2i by proper function. +- Fixed compiler warning "array subscript is of type 'char' in + function CompareFrequency. +- Fixed compiler warning "unused variable" by removing variable i + in function Reset. +- Fixed compiler warning "no previous extern declaration for + non-static variable" by making global variables in file + anagram.c static. +- Replaced macro lPhrase by its expansion. +- Fixed compiler warnings "implicit conversion loses integer + precision" and "implicit conversion changes signedness" by + adding explicit casts or using the appropriate type for local + variables. +- Fixed compiler warning "array subscript is of type 'char'" by + changing type of some local variables as well as of global + variable achByFrequency to int. +- Changed all //-style comments to /* */-style comments. +- Moved contents of wccmalloc.c to anagram_stdlib.c. +- Renamed input.c to anagram_input.c. +- Renamed wccctype.h to anagram_ctype.h. +- Renamed wccstdlib.c to anagram_stdlib.c. +- Renamed wccstdlib.h to anagram_stdlib.h. +- Renamed wccmalloc.h to anagram_strings.h. +- Applied TACLeBench formatting rules via + astyle --options=doc/example/astylerc.txt +- Tested conformance to C99 via + clang -fsyntax-only -Weverything -Wno-unknown-pragmas -Wno-padded -pedantic -std=c99 + +2017-06-27 +- Remove static declarations. + +2017-07-10: +- Adjust alignment calculation in anagram_malloc to not add padding on already + aligned addresses. This prevents a buffer overflow of anagram_simulated_heap. diff --git a/targets/wasm-tacle/sequential/anagram/anagram.c b/targets/wasm-tacle/sequential/anagram/anagram.c new file mode 100755 index 0000000..90ee4a2 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram.c @@ -0,0 +1,661 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram + + Author: Raymond Chen + + Function: A program that computes anagrams. + + Source: See below. + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See below. + +*/ + +/* + Anagram program by Raymond Chen, + inspired by a similar program by Brian Scearce + + This program is Copyright 1991 by Raymond Chen. + (rjc@math.princeton.edu) + + This program may be freely distributed provided all alterations + to the original are clearly indicated as such. +*/ + +/* There are two tricks. First is the Basic Idea: + + When the user types in a phrase, the phrase is first preprocessed to + determine how many of each letter appears. A bit field is then constructed + dynamically, such that each field is large enough to hold the next power + of two larger than the number of times the character appears. For example, + if the phrase is hello, world, the bit field would be + + 00 00 00 000 000 00 00 + d e h l o r w + + The phrase hello, world, itself would be encoded as + + 01 01 01 011 010 01 01 + d e h l o r w + + and the word hollow would be encoded as + + 00 00 01 010 010 00 01 + d e h l o r w + + The top bit of each field is set in a special value called the sign. + Here, the sign would be + + 10 10 10 100 100 10 10 + d e h l o r w + + + The reason for packing the values into a bit field is that the operation + of subtracting out the letters of a word from the current phrase can be + carried out in parallel. for example, subtracting the word hello from + the phrase hello, world, is merely + + d e h l o r w + 01 01 01 011 010 01 01 (dehllloorw) + - 00 00 01 010 010 00 01 (hlloow) + ======================== + 01 01 00 001 000 01 00 (delr) + + Since none of the sign bits is set, the word fits, and we can continue. + Suppose the next word we tried was hood. + + d e h l o r w + 01 01 00 001 000 01 00 (delr) + - 01 00 01 000 010 00 00 (hood) + ======================== + 00 00 11 000 110 01 00 + ^ ^ + A sign bit is set. (Two, actually.) This means that hood does not + fit in delr, so we skip it and try another word. (Observe that + when a sign bit becomes set, it screws up the values for the letters to + the left of that bit, but that's not important.) + + The inner loop of an anagram program is testing to see if a + word fits in the collection of untried letters. Traditional methods + keep an array of 26 integers, which are then compared in turn. This + means that there are 26 comparisons per word. + + This method reduces the number of comparisons to MAX_QUAD, typically 2. + Instead of looping through an array, we merely perform the indicated + subtraction and test if any of the sign bits is set. +*/ + +/* The nuts and bolts: + + The dictionary is loaded and preprocessed. The preprocessed dictionary + is a concatenation of copies of the structure: + + struct dictword { + char bStructureSize; -- size of this structure + char cLetters; -- number of letters in the word + char achWord[]; -- the word itself (0-terminated) + } + + Since this is a variable-sized structure, we keep its size in the structure + itself for rapid stepping through the table. + + When a phrase is typed in, it is first preprocessed as described in the + Basic Idea. We then go through the dictionary, testing each word. If + the word fits in our phrase, we build the bit field for its frequency + table and add it to the list of candidates. +*/ + +/* + The Second Trick: + + Before diving into our anagram search, we then tabulate how many times + each letter appears in our list of candidates, and sort the table, with + the rarest letter first. + + We then do our anagram search. + + Like most anagram programs, this program does a depth-first search. + Although most anagram programs do some sort of heuristics to decide what + order to place words in the list_of_candidates, the search itself proceeds + according to a greedy algorithm. That is, once you find a word that fits, + subtract it and recurse. + + This anagram program exercises some restraint and does not march down + every branch that shows itself. Instead, it only goes down branches + that use the rarest unused letter. This helps to find dead ends faster. + + FindAnagram(unused_letters, list_of_candidates) { + l = the rarest letter as yet unused + For word in list_of_candidates { + if word does not fit in unused_letters, go on to the next word. + if word does not contain l, defer. + FindAnagram(unused_letters - word, list_of_candidates[word,...]) + } + } + + + The heuristic of the Second Trick can probably be improved. I invite + anyone willing to improve it to do so. +*/ + +/* Before compiling, make sure Quad and MASK_BITS are set properly. For best + results, make Quad the largest integer size supported on your machine. + So if your machine has long longs, make Quad an unsigned long long. + (I called it Quad because on most machines, the largest integer size + supported is a four-byte unsigned long.) + + If you need to be able to anagram larger phrases, increase MAX_QUADS. + If you increase it beyond 4, you'll have to add a few more loop unrolling + steps to FindAnagram. +*/ +#include "anagram_ctype.h" +#include "anagram_stdlib.h" +#include "anagram_strings.h" + +#include "anagram_compare.h" + +/* + Defines +*/ + +#define anagram_DICTWORDS 2279 +#define anagram_MASK_BITS 32 /* number of bits in a Quad */ +#define anagram_MAX_QUADS 2 /* controls largest phrase */ +#define anagram_MAXCAND 100 /* candidates */ +#define anagram_MAXSOL 51 /* words in the solution */ +#define anagram_ALPHABET 26 /* letters in the alphabet */ + +#define anagram_OneStep( i ) \ + if ( ( aqNext[ i ] = pqMask[ i ] - pw->aqMask[ i ] ) & anagram_aqMainSign[ i ] ) { \ + ppwStart ++; \ + continue; \ + } + + +/* + Type definitions +*/ + +typedef unsigned int anagram_Quad; /* for building our bit mask */ + +/* A Word remembers the information about a candidate word. */ +typedef struct { + char *pchWord; /* the word itself */ + anagram_Quad aqMask[ anagram_MAX_QUADS ]; /* the word's mask */ + unsigned cchLength; /* letters in the word */ + char padding[ 4 ]; +} anagram_Word; +typedef anagram_Word *anagram_PWord; +typedef anagram_Word **anagram_PPWord; + +/* A Letter remembers information about each letter in the phrase to + be anagrammed. */ +typedef struct { + unsigned uFrequency; /* how many times it appears */ + unsigned uShift; /* how to mask */ + unsigned uBits; /* the bit mask itself */ + unsigned iq; /* which Quad to inspect? */ +} anagram_Letter; +typedef anagram_Letter *anagram_PLetter; + + +/* + Forward declaration of functions +*/ + +void anagram_init( void ); +void anagram_main( void ); +int anagram_return( void ); +int anagram_ch2i( int ch ); +void anagram_AddWords( void ); +void anagram_BuildMask( char const *pchPhrase ); +void anagram_BuildWord( char *pchWord ); +void anagram_DumpWords( void ); +void anagram_FindAnagram( anagram_Quad *pqMask, + anagram_PPWord ppwStart, + int iLetter ); +anagram_PWord anagram_NewWord( void ); +anagram_PWord anagram_NextWord( void ); +void anagram_ReadDict( void ); +void anagram_Reset( void ); +void anagram_SortCandidates( void ); + + +/* + Declaration of global variables +*/ + +extern char const *anagram_achPhrase[ 3 ]; +extern char const *anagram_dictionary[ anagram_DICTWORDS ]; + +/* candidates we've found so far */ +static anagram_PWord anagram_apwCand[ anagram_MAXCAND ]; +/* how many of them? */ +static unsigned anagram_cpwCand; + +/* statistics on the current phrase */ +static anagram_Letter anagram_alPhrase[ anagram_ALPHABET ]; + +/* number of letters in phrase */ +static int anagram_cchPhraseLength; + +/* the bit field for the full phrase */ +static anagram_Quad anagram_aqMainMask[ anagram_MAX_QUADS ]; +/* where the sign bits are */ +static anagram_Quad anagram_aqMainSign[ anagram_MAX_QUADS ]; + +static const int anagram_cchMinLength = 3; + +/* auGlobalFrequency counts the number of times each letter appears, + summed over all candidate words. This is used to decide which letter + to attack first. */ +static unsigned anagram_auGlobalFrequency[ anagram_ALPHABET ]; +static int anagram_achByFrequency[ anagram_ALPHABET ]; /* for sorting */ + +/* the dictionary is read here */ +static char *anagram_pchDictionary; + +/* the answers */ +static anagram_PWord anagram_apwSol[ anagram_MAXSOL ]; +static int anagram_cpwLast; + +/* buffer to write an answer */ +static char anagram_buffer[ 30 ]; + +/* + Initialization- and return-value-related functions +*/ + +/* ReadDict -- read the dictionary file into memory and preprocess it + + A word of length cch in the dictionary is encoded as follows: + + byte 0 = cch + 3 + byte 1 = number of letters in the word + byte 2... = the word itself, null-terminated + + Observe that cch+3 is the length of the total encoding. These + byte streams are concatenated, and terminated with a 0. +*/ +void anagram_ReadDict( void ) +{ + char *pch; + char *pchBase; + unsigned len; + unsigned cWords = 0; + unsigned cLetters; + int i; + volatile char bitmask = 0; + + len = 0; + _Pragma( "loopbound min 2279 max 2279" ) + for ( i = 0; i < anagram_DICTWORDS; i ++ ) { + unsigned strlen = 0; + _Pragma( "loopbound min 1 max 5" ) + while ( anagram_dictionary[ i ][ strlen ] != 0 ) + strlen ++; + len += strlen + 3; + } + + len ++; + pchBase = anagram_pchDictionary = ( char * )anagram_malloc( len ); + + _Pragma( "loopbound min 2279 max 2279" ) + for ( i = 0; i < anagram_DICTWORDS; i ++ ) { + int index = 0; + pch = pchBase + 2; /* reserve for length */ + cLetters = 0; + + _Pragma( "loopbound min 1 max 5" ) + while ( anagram_dictionary[ i ][ index ] != '\0' ) { + if ( anagram_isalpha( anagram_dictionary[ i ][ index ] ) ) + cLetters ++; + *pch ++ = anagram_dictionary[ i ][ index ]; + index ++; + *( pch - 1 ) ^= bitmask; + } + *pch ++ = '\0'; + *pchBase = ( char )( pch - pchBase ); + pchBase[ 1 ] = ( char )cLetters; + pchBase = pch; + cWords ++; + } + + *pchBase ++ = 0; +} + + +void anagram_init( void ) +{ + anagram_ReadDict(); +} + + +int anagram_return( void ) +{ + int i; + char const *answer = "duke yip arm"; + + _Pragma( "loopbound min 12 max 12" ) + for ( i = 0; i < 12; i++ ) + if ( answer[ i ] != anagram_buffer[ i ] ) + return 1; + + return 0; +} + + +/* + Core benchmark functions +*/ + +/* convert letter to index */ +int anagram_ch2i( int ch ) +{ + return ch - 'a'; +} + + +int anagram_CompareFrequency( char *pch1, char *pch2 ) +{ + return anagram_auGlobalFrequency[ ( *(int*) pch1 ) ] < + anagram_auGlobalFrequency[ ( *(int*) pch2 ) ] + ? -1 : + anagram_auGlobalFrequency[ ( *(int*) pch1 ) ] == + anagram_auGlobalFrequency[ ( *(int*) pch2 ) ] + ? 0 : 1; +} + + +void anagram_Reset( void ) +{ + anagram_bzero( ( char * )anagram_alPhrase, + sizeof( anagram_Letter ) * anagram_ALPHABET ); + anagram_bzero( ( char * )anagram_aqMainMask, + sizeof( anagram_Quad ) * anagram_MAX_QUADS ); + anagram_bzero( ( char * )anagram_aqMainSign, + sizeof( anagram_Quad ) * anagram_MAX_QUADS ); + anagram_bzero( ( char * )anagram_auGlobalFrequency, + sizeof( unsigned ) * anagram_ALPHABET ); + anagram_bzero( ( char * )anagram_achByFrequency, + sizeof( int ) * anagram_ALPHABET ); + anagram_bzero( ( char * )anagram_apwCand, + sizeof( anagram_PWord ) * anagram_MAXCAND ); + anagram_cchPhraseLength = 0; + anagram_cpwCand = 0; +} + + +void anagram_BuildMask( char const *pchPhrase ) +{ + int i; + int ch; + unsigned iq; /* which Quad? */ + unsigned int cbtUsed; /* bits used in the current Quad */ + unsigned int cbtNeed; /* bits needed for current letter */ + anagram_Quad qNeed; /* used to build the mask */ + + /* Tabulate letter frequencies in the phrase */ + anagram_cchPhraseLength = 0; + _Pragma( "loopbound min 11 max 11" ) + while ( ( ch = *pchPhrase ++ ) != '\0' ) { + if ( anagram_isalpha( ch ) ) { + ch = anagram_tolower( ch ); + anagram_alPhrase[ anagram_ch2i( ch ) ].uFrequency ++; + anagram_cchPhraseLength ++; + } + } + + /* Build masks */ + iq = 0; /* which quad being used */ + cbtUsed = 0; /* bits used so far */ + + _Pragma( "loopbound min 26 max 26" ) + for ( i = 0; i < anagram_ALPHABET; i ++ ) { + if ( anagram_alPhrase[ i ].uFrequency == 0 ) { + anagram_auGlobalFrequency[ i ] = ~0u; /* to make it sort last */ + } else { + anagram_auGlobalFrequency[ i ] = 0u; + _Pragma( "loopbound min 1 max 2" ) + for ( cbtNeed = 1, qNeed = 1; + anagram_alPhrase[ i ].uFrequency >= qNeed; + cbtNeed ++, qNeed <<= 1 ) + ; + if ( cbtUsed + cbtNeed > anagram_MASK_BITS ) + cbtUsed = 0; + anagram_alPhrase[ i ].uBits = qNeed - 1; + if ( cbtUsed ) + qNeed <<= cbtUsed; + anagram_aqMainSign[ iq ] |= qNeed; + anagram_aqMainMask[ iq ] |= + ( anagram_Quad )anagram_alPhrase[ i ].uFrequency << cbtUsed; + anagram_alPhrase[ i ].uShift = cbtUsed; + anagram_alPhrase[ i ].iq = iq; + cbtUsed += cbtNeed; + } + } +} + + +anagram_PWord anagram_NewWord( void ) +{ + anagram_PWord pw; + + pw = ( anagram_Word * )anagram_malloc( sizeof( anagram_Word ) ); + return pw; +} + + +/* NextWord -- get another candidate entry, creating if necessary */ +anagram_PWord anagram_NextWord( void ) +{ + anagram_PWord pw; + pw = anagram_apwCand[ anagram_cpwCand ++ ]; + if ( pw != 0 ) + return pw; + anagram_apwCand[ anagram_cpwCand - 1 ] = anagram_NewWord(); + return anagram_apwCand[ anagram_cpwCand - 1 ]; +} + + +/* BuildWord -- build a Word structure from an ASCII word + If the word does not fit, then do nothing. */ +void anagram_BuildWord( char *pchWord ) +{ + unsigned char cchFrequency[ anagram_ALPHABET ]; + int i; + char *pch = pchWord; + anagram_PWord pw; + unsigned int cchLength = 0; + + anagram_bzero( ( char * )cchFrequency, + sizeof( unsigned char ) * anagram_ALPHABET ); + + /* Build frequency table */ + _Pragma( "loopbound min 3 max 5" ) + while ( ( i = *pch ++ ) != '\0' ) { + if ( !anagram_isalpha( i ) ) + continue; + i = anagram_ch2i( anagram_tolower( i ) ); + if ( ++ cchFrequency[ i ] > anagram_alPhrase[ i ].uFrequency ) + return ; + ++ cchLength; + } + + /* Update global count */ + _Pragma( "loopbound min 26 max 26" ) + for ( i = 0; i < anagram_ALPHABET; i ++ ) + anagram_auGlobalFrequency[ i ] += cchFrequency[ i ]; + + /* Create a Word structure and fill it in, including building the + bitfield of frequencies. */ + pw = anagram_NextWord(); + anagram_bzero( ( char * )( pw->aqMask ), + sizeof( anagram_Quad ) * anagram_MAX_QUADS ); + + pw->pchWord = pchWord; + pw->cchLength = cchLength; + _Pragma( "loopbound min 26 max 26" ) + for ( i = 0; i < anagram_ALPHABET; i ++ ) { + pw->aqMask[ anagram_alPhrase[i].iq ] |= + ( anagram_Quad )cchFrequency[ i ] << anagram_alPhrase[ i ].uShift; + } +} + + +/* AddWords -- build the list of candidates */ +void anagram_AddWords( void ) +{ + char *pch = anagram_pchDictionary; /* walk through the dictionary */ + + anagram_cpwCand = 0; + + _Pragma( "loopbound min 1967 max 1967" ) + while ( *pch ) { + if ( ( pch[ 1 ] >= anagram_cchMinLength && + pch[ 1 ] + anagram_cchMinLength <= anagram_cchPhraseLength ) + || pch[ 1 ] == anagram_cchPhraseLength ) + anagram_BuildWord( pch + 2 ); + pch += *pch; + } +} + + +void anagram_DumpWords( void ) +{ + int i, j; + int offset = 0; + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < anagram_cpwLast; i ++ ) { + _Pragma( "loopbound min 3 max 5" ) + for ( j = 0; anagram_apwSol[ i ]->pchWord[ j ] != '\0'; j ++ ) + anagram_buffer[ offset + j ] = anagram_apwSol[ i ]->pchWord[ j ]; + offset += j; + + anagram_buffer[ offset ++ ] = ' '; + } + anagram_buffer[ offset ++ ] = '\0'; +} + + +void anagram_FindAnagram( anagram_Quad *pqMask, anagram_PPWord ppwStart, + int iLetter ) +{ + anagram_Quad aqNext[ anagram_MAX_QUADS ]; + register anagram_PWord pw; + anagram_Quad qMask; + unsigned iq; + anagram_PPWord ppwEnd = &anagram_apwCand[ 0 ]; + ppwEnd += anagram_cpwCand; + + _Pragma( "loopbound min 0 max 6" ) + while ( 1 ) { + iq = anagram_alPhrase[ anagram_achByFrequency[iLetter] ].iq; + qMask = anagram_alPhrase[ anagram_achByFrequency[iLetter] ].uBits << + anagram_alPhrase[ anagram_achByFrequency[iLetter] ].uShift; + if ( pqMask[ iq ] & qMask ) + break; + iLetter ++; + } + + _Pragma( "loopbound min 0 max 11" ) + while ( ppwStart < ppwEnd ) { + pw = *ppwStart; + + #if anagram_MAX_QUADS > 0 + anagram_OneStep( 0 ); + #endif + + #if anagram_MAX_QUADS > 1 + anagram_OneStep( 1 ); + #endif + + #if anagram_MAX_QUADS > 2 + anagram_OneStep( 2 ); + #endif + + #if anagram_MAX_QUADS > 3 + anagram_OneStep( 3 ); + #endif + + #if anagram_MAX_QUADS > 4 + @@"Add more unrolling steps here, please."@@ + #endif + + /* If the pivot letter isn't present, defer this word until later */ + if ( ( pw->aqMask[ iq ] & qMask ) == 0 ) { + *ppwStart = *( -- ppwEnd ); + *ppwEnd = pw; + continue; + } + + /* If we get here, this means the word fits. */ + anagram_apwSol[ anagram_cpwLast ++ ] = pw; + if ( anagram_cchPhraseLength -= pw->cchLength ) { /* recurse */ + /* The recursive call scrambles the tail, so we have to be + pessimistic. */ + ppwEnd = &anagram_apwCand[ 0 ]; + ppwEnd += anagram_cpwCand; + anagram_FindAnagram( &aqNext[ 0 ], ppwStart, iLetter ); + } else /* found one */ + anagram_DumpWords(); + anagram_cchPhraseLength += pw->cchLength; + -- anagram_cpwLast; + ppwStart ++; + continue; + } +} + + +void anagram_SortCandidates( void ) +{ + int i; + + /* Sort the letters by frequency */ + _Pragma( "loopbound min 26 max 26" ) + for ( i = 0; i < anagram_ALPHABET; i ++ ) + anagram_achByFrequency[ i ] = i; + anagram_qsort( anagram_achByFrequency, anagram_ALPHABET, sizeof( int ) ); +} + + +void _Pragma( "entrypoint" ) anagram_main( void ) +{ + int i; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; i ++ ) { + anagram_Reset(); + anagram_BuildMask( anagram_achPhrase[ i ] ); + anagram_AddWords(); + if ( anagram_cpwCand == 0 || anagram_cchPhraseLength == 0 ) + continue; + + anagram_cpwLast = 0; + anagram_SortCandidates(); + _Pragma( "marker call_find" ) + anagram_FindAnagram( anagram_aqMainMask, anagram_apwCand, 0 ); + _Pragma( "flowrestriction 1*anagram_FindAnagram <= 51*call_find" ); + } +} + + +/* + Main function +*/ + +int main( void ) +{ + anagram_init(); + anagram_main(); + + return anagram_return(); +} diff --git a/targets/wasm-tacle/sequential/anagram/anagram_compare.h b/targets/wasm-tacle/sequential/anagram/anagram_compare.h new file mode 100755 index 0000000..31e869a --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram_compare.h @@ -0,0 +1,27 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_compare.h + + Author: Raymond Chen + + Function: This header contains the comparison functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_COMPARE_H +#define ANAGRAM_COMPARE_H + +int anagram_CompareFrequency( char *pch1, char *pch2 ); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/anagram_ctype.h b/targets/wasm-tacle/sequential/anagram/anagram_ctype.h new file mode 100755 index 0000000..ebb8232 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram_ctype.h @@ -0,0 +1,45 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_ctype.h + + Author: Raymond Chen + + Function: This header contains some C library functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_CTYPE_H +#define ANAGRAM_CTYPE_H + +int anagram_islower( int c ) +{ + return 'a' <= c && c <= 'z'; +} + +int anagram_isupper( int c ) +{ + return 'A' <= c && c <= 'Z'; +} + +int anagram_isalpha( int c ) +{ + return anagram_isupper( c ) || anagram_islower( c ); +} + +int anagram_tolower( int c ) +{ + return anagram_isupper( c ) ? c + ( 'a' - 'A' ) : c; +} + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/anagram_input.c b/targets/wasm-tacle/sequential/anagram/anagram_input.c new file mode 100755 index 0000000..e3d5f71 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram_input.c @@ -0,0 +1,2317 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_input.c + + Author: Raymond Chen + + Function: This file contains the input data used by anagram. + + Source: anagram + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +/* + Forward declaration of global variables +*/ + +extern char const *anagram_achPhrase[ 3 ]; +extern char const *anagram_dictionary[ 2279 ]; + + +/* + Definition of global variables +*/ +char const *anagram_achPhrase[ 3 ] = { "todd austin", + "john alledy", + "mary updike" + }; + +char const *anagram_dictionary[ 2279 ] = { "2nd", + "4th", + "8th", + "a", + "ABA", + "aback", + "abash", + "abbas", + "abbey", + "abed", + "abet", + "abort", + "abut", + "Accra", + "ACM", + "acorn", + "Acts", + "Ada", + "adapt", + "added", + "addle", + "Adele", + "Aden", + "admix", + "adore", + "adult", + "affix", + "afire", + "aft", + "agate", + "agave", + "Agee", + "agent", + "agile", + "Agnew", + "agone", + "ahoy", + "Aida", + "aim", + "Ainu", + "airy", + "Ajax", + "Alamo", + "alarm", + "alb", + "Alcoa", + "alder", + "Aleck", + "alert", + "algae", + "alia", + "alike", + "alive", + "allay", + "alley", + "Allis", + "allow", + "ally", + "Allyn", + "aloe", + "aloha", + "along", + "aloud", + "also", + "alter", + "Alton", + "Alva", + "amaze", + "amber", + "ami", + "amigo", + "amiss", + "Amman", + "Amoco", + "amok", + "Amos", + "ample", + "amra", + "amy", + "Andes", + "angel", + "Angie", + "angry", + "Angus", + "Anne", + "annex", + "annoy", + "annul", + "ante", + "any", + "apex", + "apple", + "apron", + "apt", + "arch", + "argue", + "Aries", + "arm", + "army", + "aroma", + "array", + "arrow", + "Artie", + "arty", + "arum", + "a's", + "ash", + "ashen", + "ashy", + "askew", + "assai", + "Assam", + "Astor", + "ate", + "atlas", + "atone", + "audit", + "Aug", + "augur", + "auk", + "aural", + "avid", + "avoid", + "avow", + "awash", + "awe", + "awn", + "awry", + "axe", + "axial", + "axis", + "axon", + "Ayers", + "Aztec", + "b", + "babe", + "Bach", + "bad", + "bait", + "baldy", + "balm", + "balsa", + "bam", + "ban", + "bane", + "banjo", + "barb", + "barn", + "baron", + "basal", + "Basel", + "basil", + "bassi", + "baste", + "batch", + "Bates", + "batik", + "Bator", + "bawd", + "bay", + "bayed", + "bayou", + "be", + "beak", + "bean", + "beard", + "beat", + "beck", + "Becky", + "bed", + "bedim", + "bee", + "beech", + "beep", + "beet", + "befit", + "beg", + "begin", + "beige", + "Bela", + "belch", + "belt", + "beman", + "bench", + "Benny", + "bent", + "Benz", + "berth", + "beset", + "bet", + "betel", + "Bette", + "bevy", + "Bible", + "bide", + "big", + "bile", + "bilk", + "binge", + "bit", + "bite", + "black", + "blanc", + "bland", + "blare", + "blat", + "blaze", + "bled", + "blest", + "blind", + "Blinn", + "bliss", + "blitz", + "blob", + "blond", + "blood", + "bloom", + "blot", + "blown", + "blue", + "bluff", + "Blum", + "blur", + "board", + "boat", + "bock", + "bog", + "bogy", + "boil", + "Boise", + "bomb", + "bon", + "bong", + "bonus", + "bonze", + "booby", + "book", + "booky", + "boon", + "booze", + "bore", + "Boris", + "boron", + "Bosch", + "bosom", + "bound", + "bourn", + "bowel", + "boy", + "Boyce", + "bract", + "Brady", + "brag", + "brake", + "brant", + "brass", + "Braun", + "bravo", + "bread", + "bream", + "breve", + "brew", + "briar", + "Brice", + "brief", + "bring", + "briny", + "broad", + "broth", + "brunt", + "BSTJ", + "bub", + "buck", + "Budd", + "buddy", + "Buick", + "built", + "bulge", + "bulky", + "bum", + "bump", + "bunch", + "bundy", + "bunk", + "Burch", + "burg", + "burl", + "Burma", + "burnt", + "Burr", + "bury", + "bush", + "bushy", + "bust", + "busy", + "butte", + "butyl", + "buyer", + "by", + "bylaw", + "Byrd", + "byte", + "cab", + "cable", + "cacao", + "cacti", + "Cairo", + "Caleb", + "call", + "calm", + "canal", + "canoe", + "canon", + "can't", + "cap", + "caper", + "capo", + "card", + "Carey", + "Carib", + "Carla", + "carol", + "carve", + "cash", + "caste", + "catch", + "cater", + "caulk", + "cause", + "CBS", + "cedar", + "cent", + "Cetus", + "Chad", + "chaff", + "chair", + "champ", + "char", + "chasm", + "chaw", + "cheat", + "cheer", + "chef", + "Chen", + "chew", + "chick", + "chief", + "Chile", + "chill", + "chine", + "chip", + "chock", + "choir", + "chomp", + "chose", + "Chris", + "chuff", + "chum", + "chump", + "CIA", + "cinch", + "cite", + "city", + "clad", + "clan", + "clank", + "Clara", + "Claus", + "claw", + "clean", + "cleat", + "clerk", + "clime", + "cling", + "clink", + "Clio", + "clod", + "clomp", + "cloth", + "clove", + "cluck", + "clump", + "clung", + "Clyde", + "cobra", + "coco", + "coda", + "Cody", + "Cohn", + "coin", + "col", + "Colby", + "coney", + "Congo", + "cony", + "cool", + "coon", + "copra", + "copy", + "Corey", + "corn", + "corps", + "cos", + "cosy", + "couch", + "cough", + "count", + "coup", + "cove", + "cowry", + "coy", + "CPA", + "crack", + "craft", + "Craig", + "crank", + "crash", + "crate", + "crawl", + "craze", + "creak", + "cream", + "credo", + "creek", + "Creon", + "crept", + "crest", + "crew", + "crib", + "crime", + "crimp", + "crisp", + "crock", + "croft", + "crone", + "crook", + "crowd", + "CRT", + "crumb", + "crump", + "crush", + "crux", + "cub", + "cube", + "cuff", + "cup", + "Cupid", + "cur", + "curb", + "curie", + "cusp", + "cute", + "cycad", + "cynic", + "d", + "daffy", + "dairy", + "daisy", + "dally", + "dame", + "Damon", + "Dan", + "dance", + "Dane", + "dank", + "Dante", + "Dar", + "darn", + "dart", + "dash", + "davit", + "day", + "De", + "deaf", + "deal", + "death", + "debit", + "Dec", + "decal", + "Dee", + "Deere", + "deify", + "deity", + "Della", + "delta", + "demur", + "den", + "Denny", + "dense", + "deny", + "depth", + "desk", + "deus", + "devil", + "dewar", + "Dhabi", + "diary", + "dick", + "dicta", + "did", + "die", + "Diego", + "diety", + "dill", + "din", + "dine", + "dirty", + "disc", + "ditch", + "dive", + "DNA", + "dock", + "Dodd", + "doff", + "dogma", + "dolce", + "doll", + "dolly", + "done", + "door", + "dope", + "Doric", + "dose", + "dote", + "doubt", + "Doug", + "dove", + "dowel", + "doze", + "Dr", + "Draco", + "drama", + "drape", + "drawl", + "dread", + "dreg", + "dress", + "drew", + "drib", + "drier", + "drill", + "drip", + "dross", + "drown", + "druid", + "drunk", + "dry", + "du", + "Duane", + "ducat", + "duct", + "duel", + "duff", + "Duffy", + "Dugan", + "duke", + "dull", + "dulse", + "duly", + "dump", + "dumpy", + "dunce", + "dunk", + "dupe", + "dusky", + "dwarf", + "dwelt", + "Dwyer", + "dyer", + "Dyke", + "dyne", + "each", + "eager", + "ear", + "earn", + "ease", + "eat", + "eater", + "Eben", + "Ecole", + "Eden", + "edge", + "edgy", + "edict", + "Edith", + "EDT", + "eel", + "eft", + "egg", + "Egypt", + "eject", + "el", + "elan", + "elate", + "elect", + "elfin", + "elide", + "elk", + "Ella", + "Ellis", + "Elmer", + "else", + "Elton", + "elude", + "elves", + "ember", + "Emile", + "Emory", + "Eng", + "Engle", + "Enid", + "Enos", + "enter", + "envoy", + "epoxy", + "equal", + "erase", + "ere", + "erg", + "Erich", + "Ernst", + "Eros", + "err", + "Errol", + "Ervin", + "e's", + "essay", + "ester", + "Ethan", + "Ethel", + "ethic", + "ethos", + "etude", + "Eva", + "Evans", + "event", + "evict", + "exact", + "exam", + "excel", + "exit", + "eye", + "f", + "Faber", + "fable", + "facet", + "fad", + "faery", + "fag", + "fail", + "faint", + "fairy", + "fake", + "fang", + "fare", + "faro", + "fatal", + "fatty", + "fault", + "faun", + "Faust", + "fay", + "FBI", + "fee", + "feed", + "feign", + "Felix", + "Fermi", + "ferry", + "fest", + "fetch", + "fetus", + "few", + "fiend", + "fiery", + "fifth", + "fig", + "fight", + "filet", + "film", + "finch", + "fine", + "finny", + "fire", + "first", + "fish", + "Fisk", + "fist", + "Fitch", + "flack", + "flak", + "flaky", + "flame", + "flank", + "flare", + "flat", + "flax", + "flea", + "fled", + "flee", + "fleet", + "flint", + "flit", + "flock", + "flog", + "flow", + "Floyd", + "flub", + "fluke", + "flute", + "Flynn", + "FM", + "foal", + "focal", + "Foley", + "folk", + "fond", + "food", + "foot", + "fop", + "fore", + "forge", + "form", + "fort", + "forth", + "forty", + "Foss", + "foul", + "fowl", + "FPC", + "frame", + "Franz", + "Frau", + "fray", + "freed", + "fresh", + "friar", + "fro", + "frog", + "from", + "frost", + "frown", + "fry", + "fuel", + "full", + "fun", + "fur", + "furry", + "fussy", + "g", + "gaff", + "gag", + "Gail", + "Galen", + "gall", + "game", + "gamma", + "gap", + "gar", + "garb", + "gas", + "gasp", + "gate", + "gauge", + "gaur", + "gavel", + "gawk", + "gay", + "gecko", + "gel", + "gem", + "Gemma", + "gene", + "genie", + "genre", + "genus", + "germ", + "Gerry", + "get", + "giant", + "gibby", + "gig", + "gild", + "gilt", + "gin", + "Gino", + "given", + "glare", + "gleam", + "glee", + "glib", + "glint", + "gloat", + "glow", + "glut", + "GMT", + "gnaw", + "gnome", + "GNP", + "god", + "Goff", + "gogo", + "golf", + "Goode", + "goof", + "goose", + "gore", + "gory", + "got", + "gourd", + "GPO", + "grace", + "Graff", + "grape", + "grasp", + "grate", + "gravy", + "graze", + "grebe", + "greed", + "Greek", + "Gregg", + "grew", + "grid", + "grime", + "Grimm", + "gripe", + "grit", + "groan", + "gross", + "grout", + "grow", + "grown", + "grub", + "grunt", + "GSA", + "guano", + "guess", + "guide", + "guile", + "guise", + "gules", + "gull", + "gulp", + "gumbo", + "gun", + "gunky", + "guru", + "gush", + "gust", + "gusto", + "guy", + "Gwyn", + "gyp", + "gyro", + "Habib", + "hack", + "had", + "Hades", + "Hagen", + "Hahn", + "haiku", + "hale", + "halma", + "ham", + "Haney", + "Hans", + "hard", + "hare", + "hark", + "harm", + "harsh", + "haste", + "hasty", + "hatch", + "hater", + "hawk", + "Haydn", + "hazel", + "he", + "Healy", + "hear", + "heart", + "heave", + "heavy", + "hedge", + "heel", + "hefty", + "Heinz", + "held", + "he'll", + "hemp", + "hertz", + "hew", + "hex", + "hi", + "hick", + "Hicks", + "hike", + "hilum", + "hind", + "hip", + "hippy", + "hire", + "his", + "hive", + "hobby", + "hoc", + "Hoff", + "hogan", + "Hokan", + "hole", + "Holm", + "holt", + "home", + "homo", + "hondo", + "hood", + "hook", + "hoop", + "hoot", + "hope", + "horn", + "hose", + "hot", + "hound", + "hovel", + "how", + "howdy", + "hub", + "hubby", + "hue", + "huff", + "huge", + "huh", + "hull", + "human", + "Hun", + "hung", + "hunk", + "hurt", + "hurty", + "hutch", + "hydra", + "hyena", + "hymen", + "i", + "ibid", + "IBM", + "icon", + "I'd", + "Idaho", + "ideal", + "idiot", + "idol", + "IEEE", + "iffy", + "igloo", + "iii", + "ileum", + "Iliad", + "ill", + "Ilona", + "image", + "in", + "inapt", + "Inca", + "incur", + "India", + "inert", + "infer", + "infra", + "Inman", + "inn", + "input", + "ionic", + "Iowa", + "ipso", + "IR", + "Iran", + "irate", + "Irene", + "Irish", + "Irma", + "is", + "Ising", + "Islam", + "isle", + "Italy", + "it'd", + "Ito", + "iv", + "ivy", + "j", + "JACM", + "jag", + "James", + "Jane", + "Janos", + "Japan", + "Jason", + "jaw", + "jean", + "jeep", + "Jeres", + "jerky", + "jess", + "jet", + "jewel", + "jig", + "jilt", + "Jo", + "job", + "jog", + "join", + "joke", + "jolt", + "Jonas", + "joule", + "joust", + "joy", + "Juan", + "judge", + "judo", + "Judy", + "juju", + "juke", + "julep", + "jump", + "junco", + "junky", + "junta", + "jure", + "jut", + "Kafka", + "kapok", + "Karp", + "Kathy", + "Kay", + "Keats", + "keel", + "keg", + "kelly", + "Kemp", + "Kent", + "Kenya", + "kerry", + "Kevin", + "keyed", + "khaki", + "Khmer", + "kick", + "Kiev", + "kin", + "Kiowa", + "kirk", + "kiss", + "kite", + "kiva", + "Klan", + "Kline", + "knee", + "Knott", + "Knox", + "koala", + "Kong", + "Korea", + "kraft", + "kraut", + "Kuhn", + "Kurd", + "lac", + "lack", + "lad", + "ladle", + "lag", + "lain", + "laity", + "lam", + "lame", + "lamp", + "lance", + "lane", + "Lange", + "Laos", + "lapel", + "lard", + "Lares", + "Lars", + "last", + "late", + "Latin", + "latus", + "law", + "lay", + "layup", + "lazy", + "leach", + "leafy", + "leak", + "leapt", + "learn", + "leash", + "leave", + "ledge", + "leech", + "left", + "leg", + "leggy", + "Leila", + "lemma", + "Lena", + "lens", + "Leo", + "Leona", + "lest", + "level", + "levy", + "lewd", + "liar", + "lice", + "lick", + "lie", + "lien", + "life", + "lift", + "liken", + "lilac", + "Lilly", + "lily", + "limb", + "limit", + "line", + "lingo", + "link", + "Linus", + "Lise", + "lisp", + "live", + "livre", + "load", + "loam", + "loan", + "lob", + "lobby", + "local", + "lock", + "Loeb", + "Logan", + "logic", + "loin", + "Loki", + "loll", + "Lomb", + "long", + "loon", + "loose", + "loot", + "lope", + "lord", + "Loren", + "lose", + "lossy", + "Lotte", + "loud", + "lousy", + "low", + "Lowe", + "loy", + "l's", + "LTV", + "Lucas", + "lucky", + "luge", + "Luis", + "lumen", + "lumpy", + "lunar", + "Lund", + "Lura", + "lure", + "lurk", + "lusty", + "Lydia", + "lying", + "Lynn", + "Lyon", + "Lyra", + "m", + "Mabel", + "mace", + "macho", + "macro", + "madam", + "magi", + "magna", + "mail", + "main", + "make", + "Malay", + "male", + "mall", + "malt", + "mamma", + "mane", + "mania", + "manic", + "manna", + "Mans", + "Mao", + "map", + "mar", + "Mardi", + "maria", + "Marin", + "Mario", + "Mars", + "Mary", + "mask", + "mast", + "mat", + "mate", + "mater", + "matte", + "maul", + "Mavis", + "maxim", + "Maya", + "Mayer", + "Mayo", + "mayst", + "maze", + "me", + "meal", + "meaty", + "media", + "meet", + "meld", + "melt", + "men", + "Menlo", + "merge", + "Merle", + "merry", + "mesh", + "messy", + "metro", + "mew", + "Meyer", + "mezzo", + "mica", + "midst", + "mien", + "mig", + "mila", + "milk", + "Mills", + "milt", + "Mimi", + "mince", + "mine", + "mini", + "mink", + "minor", + "minot", + "minus", + "Mira", + "mire", + "mirth", + "Missy", + "misty", + "mite", + "mitre", + "mixup", + "mob", + "Mobil", + "mock", + "model", + "Moen", + "Mohr", + "moist", + "molar", + "mole", + "month", + "moody", + "Moore", + "moral", + "Moran", + "morn", + "Moser", + "moss", + "most", + "motel", + "moth", + "motif", + "motor", + "motto", + "mousy", + "Moyer", + "Mrs", + "m's", + "mud", + "muggy", + "Muir", + "mulch", + "mule", + "mull", + "mum", + "mummy", + "muon", + "mural", + "murre", + "mushy", + "musk", + "must", + "Muzo", + "my", + "Myers", + "mynah", + "Myra", + "NAACP", + "Nagy", + "naive", + "name", + "Nancy", + "nap", + "nary", + "nasal", + "natal", + "NATO", + "navy", + "Nazi", + "NBC", + "NCR", + "ne", + "near", + "neath", + "Ned", + "need", + "needy", + "Nehru", + "Nell", + "neon", + "Nero", + "net", + "Neva", + "neve", + "new", + "nice", + "niche", + "Niger", + "night", + "Nikko", + "Nile", + "Niobe", + "nitty", + "NJ", + "no", + "Noah", + "Nobel", + "nodal", + "noise", + "Nolan", + "nolo", + "noon", + "nor", + "nose", + "notch", + "Nov", + "now", + "n's", + "NTIS", + "nude", + "numb", + "nurse", + "NY", + "oaf", + "oaken", + "oar", + "oasis", + "oath", + "obey", + "objet", + "ocean", + "Oct", + "ode", + "o'er", + "off", + "often", + "ogle", + "Okay", + "old", + "oldy", + "olive", + "Olson", + "omit", + "once", + "only", + "onset", + "onus", + "onyx", + "ooze", + "opera", + "opium", + "opt", + "opus", + "orb", + "Orin", + "Orion", + "osier", + "ought", + "our", + "out", + "ovate", + "over", + "Ovid", + "owing", + "ox", + "oxeye", + "oxide", + "Ozark", + "p", + "Pablo", + "pace", + "pack", + "pact", + "padre", + "pagan", + "Paine", + "pale", + "palm", + "pane", + "pansy", + "Paoli", + "papa", + "papaw", + "pappy", + "parch", + "pare", + "Paris", + "park", + "Parks", + "parse", + "Paso", + "passe", + "past", + "path", + "Patsy", + "Paul", + "Pauli", + "pax", + "PBS", + "peace", + "peak", + "Pease", + "peck", + "pedal", + "pee", + "peek", + "peep", + "pen", + "penny", + "pep", + "Pepsi", + "Perez", + "perk", + "Perle", + "Perth", + "peste", + "Pete", + "petri", + "petty", + "pewee", + "PhD", + "phi", + "phon", + "phony", + "phyla", + "piano", + "piece", + "pilot", + "pinch", + "ping", + "pink", + "pinto", + "pious", + "pipe", + "pique", + "piss", + "pithy", + "pity", + "pixy", + "place", + "plain", + "plane", + "plate", + "Plato", + "play", + "plaza", + "plead", + "pluck", + "plug", + "plump", + "plunk", + "plus", + "pod", + "podia", + "Poe", + "poesy", + "pogo", + "poi", + "poise", + "poke", + "polis", + "Polk", + "poll", + "polo", + "Ponce", + "pond", + "pool", + "poop", + "pop", + "porch", + "pork", + "Porte", + "Porto", + "posh", + "posse", + "post", + "pour", + "pow", + "Prado", + "Pratt", + "pray", + "press", + "prey", + "price", + "pride", + "prig", + "prime", + "prior", + "probe", + "Prof", + "prone", + "p's", + "psych", + "pub", + "puck", + "puffy", + "Pugh", + "pull", + "puma", + "pun", + "punky", + "puny", + "pupal", + "puppy", + "pure", + "purl", + "pus", + "PVC", + "Pyle", + "Pyrex", + "Qatar", + "quack", + "quaff", + "quash", + "queen", + "quell", + "query", + "queue", + "quick", + "quill", + "quint", + "quirt", + "quo", + "quote", + "rabat", + "rabbi", + "radar", + "radio", + "radix", + "Rae", + "rag", + "rail", + "rajah", + "Ralph", + "Ramo", + "ran", + "Rand", + "randy", + "Raoul", + "rape", + "rare", + "rasp", + "rata", + "rater", + "rave", + "raven", + "razor", + "R&D", + "reach", + "ready", + "real", + "reb", + "reck", + "reedy", + "reek", + "Reese", + "regal", + "Reid", + "relax", + "reman", + "Rena", + "rend", + "ret", + "retch", + "Rhea", + "rheum", + "rhino", + "Rhoda", + "rib", + "rice", + "rick", + "rid", + "rifle", + "rig", + "rigid", + "rill", + "rim", + "rimy", + "rink", + "Rio", + "rip", + "ripen", + "rise", + "risk", + "rite", + "rival", + "river", + "road", + "roar", + "rob", + "robe", + "robin", + "rodeo", + "roe", + "roil", + "role", + "Roman", + "Rome", + "romp", + "roof", + "room", + "roost", + "Rosen", + "rot", + "rouge", + "round", + "rout", + "rove", + "Roy", + "Royce", + "r's", + "Ruben", + "ruby", + "rude", + "Rudy", + "rug", + "rule", + "rummy", + "run", + "rung", + "runt", + "rupee", + "ruse", + "rusk", + "Russo", + "rusty", + "Ruth", + "rutty", + "Ryan", + "rye", + "sa", + "sabra", + "sad", + "sag", + "sage", + "sake", + "sale", + "Salk", + "salty", + "salve", + "Sam", + "same", + "Samoa", + "sane", + "sank", + "Santa", + "Sao", + "sappy", + "Sarah", + "sari", + "satyr", + "Saudi", + "Sault", + "save", + "savvy", + "SC", + "scald", + "scalp", + "scarf", + "scat", + "SCM", + "scold", + "scoot", + "Scot", + "scram", + "scrub", + "scud", + "scull", + "scum", + "SD", + "seal", + "seamy", + "sect", + "sedge", + "seedy", + "seen", + "seize", + "semi", + "sepal", + "Sepoy", + "septa", + "serge", + "serif", + "servo", + "set", + "Seton", + "setup", + "sewn", + "shad", + "shag", + "shah", + "shaky", + "shall", + "shank", + "shard", + "Shari", + "shaw", + "Shea", + "shed", + "sheer", + "shied", + "shift", + "shill", + "shin", + "shirk", + "shish", + "shoo", + "shore", + "shout", + "shrew", + "shrub", + "shunt", + "SIAM", + "sib", + "sibyl", + "side", + "sigh", + "sigma", + "silk", + "silly", + "silt", + "Simon", + "since", + "sinew", + "singe", + "sinh", + "Sioux", + "sir", + "siva", + "sixty", + "skeet", + "skew", + "skid", + "skimp", + "skulk", + "Skye", + "slab", + "slag", + "slake", + "slap", + "slay", + "sleep", + "sleet", + "slick", + "slim", + "slimy", + "slog", + "slosh", + "sloth", + "slow", + "slug", + "slum", + "slung", + "slurp", + "sly", + "small", + "smile", + "smith", + "smog", + "smoky", + "snack", + "snark", + "sneer", + "snell", + "snip", + "snoop", + "snore", + "snow", + "snub", + "snug", + "so", + "soap", + "soar", + "soft", + "soggy", + "sold", + "sole", + "solid", + "Solon", + "solve", + "some", + "son", + "sonny", + "soon", + "sorb", + "sore", + "sort", + "south", + "sow", + "spa", + "spade", + "spare", + "spark", + "spasm", + "spate", + "spawn", + "spear", + "speed", + "spell", + "Spica", + "spicy", + "spiky", + "spire", + "Spiro", + "splay", + "spoil", + "spook", + "spool", + "spore", + "spout", + "spree", + "sprue", + "spur", + "spy", + "squaw", + "s's", + "St", + "stag", + "staid", + "stair", + "stale", + "stall", + "stamp", + "stand", + "stark", + "stash", + "state", + "stay", + "stead", + "steak", + "steam", + "steed", + "Steen", + "steer", + "stern", + "stew", + "stile", + "stilt", + "stock", + "stole", + "stone", + "stood", + "stool", + "stop", + "storm", + "story", + "stove", + "strap", + "straw", + "strip", + "strum", + "stud", + "study", + "stung", + "stunt", + "Sturm", + "styli", + "suave", + "such", + "sud", + "sue", + "Suez", + "suit", + "sulky", + "sung", + "sunny", + "sup", + "supra", + "surge", + "Sus", + "sushi", + "swank", + "swap", + "swear", + "swelt", + "swig", + "swine", + "swish", + "swiss", + "sword", + "swung", + "Syria", + "syrup", + "tab", + "tabu", + "tacit", + "taffy", + "Tahoe", + "take", + "tale", + "talk", + "tamp", + "tang", + "tango", + "tanh", + "Tanya", + "tap", + "tape", + "tapir", + "tappa", + "tar", + "tardy", + "tarry", + "task", + "tasty", + "tate", + "tawny", + "taxi", + "teach", + "tease", + "tecum", + "Telex", + "tempt", + "tenon", + "tense", + "tepid", + "terry", + "Tess", + "Texas", + "Thai", + "than", + "that", + "Thea", + "thee", + "them", + "then", + "theta", + "they", + "thick", + "thigh", + "thin", + "thing", + "third", + "three", + "threw", + "thug", + "thus", + "ti", + "tibet", + "tic", + "tid", + "tidy", + "tied", + "tift", + "til", + "tile", + "tilt", + "Timex", + "Timon", + "tinge", + "tipsy", + "tire", + "tit", + "tithe", + "title", + "TNT", + "toad", + "today", + "tog", + "Togo", + "toil", + "token", + "told", + "tome", + "tommy", + "tonal", + "tong", + "Toni", + "tonk", + "tony", + "tool", + "tooth", + "top", + "tor", + "torch", + "tori", + "torr", + "torso", + "torus", + "total", + "totem", + "tout", + "tower", + "town", + "toxin", + "track", + "Tracy", + "trag", + "trail", + "trait", + "tramp", + "trap", + "tread", + "tree", + "trend", + "tress", + "trial", + "tribe", + "trill", + "tripe", + "troll", + "troop", + "trout", + "truck", + "Trudy", + "trunk", + "trust", + "TRW", + "t's", + "TTL", + "tub", + "tube", + "tuck", + "Tudor", + "tuft", + "tulle", + "tum", + "tuna", + "tune", + "tunic", + "Turin", + "turk", + "turn", + "tusk", + "tutu", + "tweak", + "twice", + "twill", + "twine", + "twirl", + "twit", + "two", + "tying", + "ugly", + "ultra", + "umbra", + "uncle", + "union", + "unite", + "upend", + "upper", + "upset", + "Upton", + "urban", + "urine", + "us", + "usage", + "use", + "USGS", + "USIA", + "usual", + "usurp", + "Utah", + "utile", + "v", + "vade", + "vague", + "vain", + "valid", + "valve", + "van", + "vase", + "vast", + "Veda", + "veer", + "vein", + "Vella", + "venom", + "Venus", + "verb", + "Verde", + "versa", + "vest", + "vetch", + "vex", + "via", + "vicar", + "Vichy", + "Vida", + "vie", + "Viet", + "vigil", + "viii", + "villa", + "vise", + "visor", + "vitae", + "Vito", + "viva", + "vixen", + "vocal", + "voice", + "Volta", + "vowel", + "v's", + "w", + "wack", + "wacky", + "wad", + "wade", + "wafer", + "wag", + "wah", + "wail", + "wait", + "waive", + "waken", + "wale", + "wally", + "wan", + "war", + "ward", + "ware", + "warm", + "warp", + "warty", + "was", + "washy", + "water", + "watt", + "Watts", + "way", + "Wayne", + "weal", + "wean", + "wear", + "web", + "weber", + "we'd", + "wedge", + "weed", + "week", + "Wei", + "weird", + "Welch", + "well", + "welsh", + "wept", + "were", + "west", + "wet", + "wharf", + "whee", + "whelm", + "when", + "which", + "whim", + "whir", + "whisk", + "white", + "whiz", + "whoa", + "whole", + "whoop", + "whop", + "whose", + "why", + "widen", + "widow", + "wield", + "Wier", + "wile", + "will", + "Wilma", + "wilt", + "win", + "winch", + "wino", + "wipe", + "wise", + "wispy", + "witch", + "withy", + "witty", + "woe", + "wok", + "wolve", + "womb", + "Wong", + "Woods", + "wool", + "wop", + "wordy", + "work", + "worm", + "worse", + "worst", + "wove", + "wow", + "wreck", + "wrest", + "wrist", + "Wu", + "Wyatt", + "Wylie", + "Wyner", + "x", + "xenon", + "x's", + "yacht", + "Yale", + "yam", + "yang", + "yarn", + "Yates", + "year", + "yeast", + "Yeats", + "Yemen", + "yield", + "yip", + "yodel", + "yoga", + "yoke", + "yore", + "you'd", + "y's", + "Yves", + "YWCA", + "Zeiss", + "zest", + "zig", + "zing", + "zip", + "Zoe", + "zoo" + }; diff --git a/targets/wasm-tacle/sequential/anagram/anagram_stdlib.c b/targets/wasm-tacle/sequential/anagram/anagram_stdlib.c new file mode 100755 index 0000000..5158ffa --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram_stdlib.c @@ -0,0 +1,149 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_stdlib.c + + Author: Raymond Chen + + Function: This file contains the C standard library functions used by anagram. + + Source: anagram + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ +#include "anagram_stdlib.h" +#include "anagram_strings.h" + +/* Includes anagram_CompareFrequency */ +/* This function is included here because the WCC does not */ +/* support function pointers */ +#include "anagram_compare.h" + +void anagram_swapi( char *ii, char *ij, unsigned long es ) +{ + char *i, *j, c; + + i = ( char * )ii; + j = ( char * )ij; + _Pragma( "loopbound min 4 max 4" ) + do { + c = *i; + *i ++ = *j; + *j ++ = c; + es -= sizeof( char ); + } while ( es != 0 ); +} + +char *anagram_pivot( char *a, unsigned long n, unsigned long es ) +{ + unsigned long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + if ( anagram_CompareFrequency( pi, pj ) < 0 ) { + if ( anagram_CompareFrequency( pi, pk ) < 0 ) { + if ( anagram_CompareFrequency( pj, pk ) < 0 ) + return pj; + return pk; + } + return pi; + } + if ( anagram_CompareFrequency( pj, pk ) < 0 ) { + if ( anagram_CompareFrequency( pi, pk ) < 0 ) + return pi; + return pk; + } + return pj; +} + +void anagram_qsorts( char *a, unsigned long n, unsigned long es ) +{ + unsigned long j; + char *pi, *pj, *pn; + volatile unsigned int flowfactdummy = 0; + _Pragma( "loopbound min 0 max 3" ) + while ( n > 1 ) { + if ( n > 10 ) + pi = anagram_pivot( a, n, es ); + else + pi = a + ( n >> 1 ) * es; + + anagram_swapi( a, pi, es ); + pi = a; + pn = a + n * es; + pj = pn; + _Pragma( "loopbound min 0 max 10" ) + while ( 1 ) { + /* wcc note: this assignment expression was added to avoid assignment of + multiple loop bound annotations to same loop (cf. Ticket #0002323). */ + flowfactdummy ++; + _Pragma( "loopbound min 1 max 6" ) + do { + pi += es; + } while ( pi < pn && anagram_CompareFrequency( pi, a ) < 0 ); + _Pragma( "loopbound min 1 max 7" ) + do { + pj -= es; + } while ( pj > a && anagram_CompareFrequency( pj, a ) > 0 ); + if ( pj < pi ) + break; + anagram_swapi( pi, pj, es ); + } + anagram_swapi( a, pj, es ); + j = ( unsigned long )( pj - a ) / es; + n = n - j - 1; + if ( j >= n ) { + anagram_qsorts( a, j, es ); + a += ( j + 1 ) * es; + } else { + anagram_qsorts( a + ( j + 1 )*es, n, es ); + n = j; + } + } +} + +void anagram_qsort( void *va, unsigned long n, unsigned long es ) +{ + _Pragma( "marker call_qsorts" ) + anagram_qsorts( ( char * )va, n, es ); + _Pragma( "flowrestriction 1*anagram_qsorts <= 17*call_qsorts" ); +} + + +/* This must be redefined for each new benchmark */ +#define ANAGRAM_HEAP_SIZE 21000 + +static char anagram_simulated_heap[ANAGRAM_HEAP_SIZE]; +static unsigned int anagram_freeHeapPos; + +void *anagram_malloc( unsigned int numberOfBytes ) +{ + void *currentPos = ( void * )&anagram_simulated_heap[ anagram_freeHeapPos ]; + /* Get a 4-byte address for alignment purposes */ + //anagram_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int )0xfffffffc ); + unsigned int rem = ( numberOfBytes & ( unsigned int )0x3 ); + unsigned int adjustment = rem ? 4 - rem : 0; + anagram_freeHeapPos += numberOfBytes + adjustment; + return currentPos; +} + +void anagram_bzero( char *p, unsigned long len ) +{ + unsigned long i; + + _Pragma( "loopbound min 8 max 800" ) + for ( i = 0; i < len; ++ i ){ + *p ++ = '\0';} +} + diff --git a/targets/wasm-tacle/sequential/anagram/anagram_stdlib.h b/targets/wasm-tacle/sequential/anagram/anagram_stdlib.h new file mode 100755 index 0000000..0e745d5 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram_stdlib.h @@ -0,0 +1,29 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_stdlib.h + + Author: Raymond Chen + + Function: This header contains some C standard library functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_STDLIB_H +#define ANAGRAM_STDLIB_H + +void *anagram_malloc( unsigned int numberOfBytes ); + +void anagram_qsort( void *va, unsigned long n, unsigned long es ); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/anagram_strings.h b/targets/wasm-tacle/sequential/anagram/anagram_strings.h new file mode 100755 index 0000000..1e023fc --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/anagram_strings.h @@ -0,0 +1,27 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_strings.h + + Author: Raymond Chen + + Function: This header contains some C standard library functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_STRINGS_H +#define ANAGRAM_STRINGS_H + +void anagram_bzero( char *p, unsigned long len ); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/default/anagram.wasm b/targets/wasm-tacle/sequential/anagram/generated/default/anagram.wasm new file mode 100755 index 0000000000000000000000000000000000000000..27a9261e61b1da5496f7d3c40963de669851cccd GIT binary patch literal 27169 zcmaLg34GjDxj+7Imab`N*%3r1kyR`LA|Tg==|Wq&P})K-D%Ni@lguQOnRJ$>sc4Z! zQMd?RMD&6n;sq5E6crVbD=xSpDlT{x5K%!95fM;9|L^CUq!(-dKVF{Cob#OLJlomN zOlp!gM%ohp&7D~ouav99haT3}nRF&eTkniFwr|~FA!**4Ez9(b+bwvvYdVIjwE9t*vcZM_bZ1eUFZ< zZTSnIZtvQf!wd1DUQ_Y0r^cTnB}@ z_G1&K=CIGrwKt*==H1t}@wWVzwhra@UN*$ukcXX_;YV*HNO_MU0E=|Px2>E#r=NDu9o1+?pBNq%cCp^Y2)Gd{}ih+r=Z|Ap4J zB!|3gpRT{Ox6Rm^Px8r8?N@#>BGr}en&^-A7X67r(_>i(vi{6Evn{`sG9Aev{_?5E z!0AaynD8%`jihF8+leu@W(3om+zi}XSvfNZx@B4}8OrCD?-PTI5qex_HS4{dM@?9U zq=Pe3$59h@XKi|>bxrl)-Z4zO?wH#)ZECjUhI`v4dXcuh=bay;H{UTeHMrTH<9)cs z*p8Rzmd?f9ZMlx{e~&}9Q3R(LBDB=-i@9WCg?X$(RV`63KR5Ors#9g zv%&=Zwki5N^sF#J|H>47XY{NvLBC^)z6*L*n4o`qioPp)R+ymQHAUYIJu6Jm@1COX zj-C}J=s%gF?}45bCg?w#qVI{G6(;ESPto^6&k7Ut2dC)IL(d8m^s8e@>WxvZTO!|X z^v7hs@DmEz>Si0r?>4dATb+%?j4yc3&v8WPNzTxZOT81PZ?L{v2E1WquX|FM5%w6vHHQSltc%XYxn9*h@n$9UZi7&Du$ z-j4B>9WZ9@-?Sa$w|Bs3-8`uME88*tYzK_fgYoX|7$4aIqowhn_6N6Pd}arXGlTJo z?HJF$?qB0LD;Up?is#002aL0W@#5_muiF8m{oCl+j`5ZqFwP0ao3>;8_6``kgYhfd zG5%}^j5`J6-P&Q6?0|8%V7zHN#&7R{ara>S%65!D+X3Sq!Fcy}jF0SqanE3Ua686l zcEGq-Fg~#zDf`Ox9gzx&f(t9jopq|PDNNcb7(V%d*_5or=B_1)H&^4s=N4+o1GaqbECSp z+^qcRL%p+zjn#8jt}8xJmvy(z>2%mj!jNmT<-R>z?z8*^IXjs4P7h^sdS?tz9WJvF z-VjZOCd4@i#W8Kdj)`MnZpQI(ES>6zID*e~9?eag_qI45Q}N_QB0Ui=IU~hPKTz>zt6$@qagrAG>L8cME=4lK|(ya?Z-Hnv@U;Tc0bIfr^wDbJ3A^rm-V2D zJD;=tC+7O!)NRHji+#Me-N88qhkj~%Nz&#}(2@1#^xv`LW6JyOnQHerU3MVYFAif3kc*v~N4Q z<0q5lxKiAueAi_8ozY(Tj>+=5(O&ts$#Tq($C9HvZk{YhobOV;VX}Ot@?l4JTsv7* zI%D3^9TOcofqUmW=Y^IeKQSUEdN-Mvd9HjhVqJ2wyU+t|$-I!5%zJy*!p$?ACiw@G zC3%HkWVd*IlK*qEq#l$9wo!gJN%`eA%C9CV4{oF6CK~-}8{sdLEWh4Hd3ciYn{AZG zCMgeXqfCl1$jc=jYIS!#rLprFp|!Md#mvvJ*(n;mHz_dY$d;u0NN+cwcU z)HBO~XZN(QrDtZYy=QhXOzW8)MH6pk%n-tJvt(k`vH@ftv3O+$4{0{r+SEJSx|Qqf znH{^x^nAy%-Z|aL|3d;_hkCn0d^a0sWvk$%j-7Jdp<|{eoab^V?X*3I$DHTLQ2G}R z+cN88cNVwU%EHdrwq{T6>q$5pOF(6)cW%$TiHmxi9_FwqI#?G?vd)eLepbdYt9N#8 z?up%PA{;ay$+j?O3fl5BCR@#zY%(u5tGA1Vxn!kwo{fgJQ<`dbLbS`eW2f9~4;i_6 zxvor|fd0QbsQaHfC<|T$^#9R8&*_^TG|u{_TdaF@#YEriJQ?|&b31M8o9A%on}6ZZ z8_(fT`WKEJ_YJ?3VXo)et8wU|e`~|8=D?w!X64%Fy(8vB83~Z$jYz`8_WfXKfqT6CD2(yGf3zaXrEDPqCZi$OiPx7}ql$ z7L4oeu$p})a7^*3;KazDjM%ImbKBHk9s@1+oYTQh*-A9U*L7rDTf8iGTIoAB_O=b@ zO^88^kLsH+r>X6CP)oGb0e<+Arj(_mvydzA7sW5sLB zZ{FAw@k;j<8TLhXb=rgjtwu%;Tv-krDF!yn zqp-gQM$;-Rq~*xhiWzyVKAxljeJwE1s>5b6a3sUw3q0aMv#18 zy$lOQkVdMHL?4g9kqn!)$k)rDQOU5F$`@LdAdDxqDk#({Q7i|p$Z)tA`LQ&xkYS}P z+ZqJRnkigb3@o%7!yGHtVPCBV8zX`I33`Tu88%v#;K{HtT9&W0`r(3N;8+?sP)T8< z6gXCjs5hZu2bZUTBdrEBsGzTw;3?()pwtGVau7CZft6xlu>e-3z_1+%vj*Uz49k&i zrh$bFE5$Te>c#P7VJ*WnP*=dEY2fj-3KS36EP+~Il=}ipwXp*2%@$l&4_p&)Lcmz9 z4vkAVQmes*0e!w?(>ZBitrCPZuvrE}wNf<~n&cbBzVuV9U@61Fa^%O-up5|;(CmS}42%f^8kK<2K=#0uY2b;& zU{D&6nzaJ#la@;c@8+bx-rAh3E!W`kYHf3p7DmdOljDmODBh6ua8q$}vUB#ow)@$;k0rgtoNWkKH6^_+yDF}fB0b7be4cL_B>VcvQ`znD00VCxC z+++(9#3%<;0>+DhCEJo-2C+49D{y1W1|=M}R-GJZCxnH7#e?Ic&7>wZiz9HX2Bb;oVG%n|uqNq=SL|0eu0>vz%2ylX75cwbn2VT$|xgO|}#;Rt9~o zz(zB}fRTWqfWeG5R+KGdI1<^ufDxN|Qruh?BMYs#ZGw$fl%>HssEq*I24r`%8-Qu6 z0Gp{pfOWMGjyVY!MS*<*wbo#%>GTmekl}dRFW+npP*DT@^}uEsR00~MEbA;00~YpY zI96;Xt33bj@rZIxQ8DquviJ}Ct>OQ7Eng9c?N2Xw(k zKt1h)YgMP!1GOwRTa9F4hT6+JyTIBg7`22pXsJR260XS5sF6PQ?&=k= zuww2yST>UNrn;(ra4Jh0hFGALqk%U=lel4f0}W@L&g!a77E$(gs{mvmPZ2OM$rIXpJ+;;!0pX!;)OF zVs%PR%^+>cF39i%$MMW)ctYy1%5#fWlCPHos|C0;4P0+e57#%RjX0JhC)BDiZCb-@ zkzrGRl>7XcB^f`kk!+SWNlmFC)umCXDvd}LsVJpV!;!jfeQ(uS4+_N**jE8*%k~jR zVvAZo98AFiC*&AE^~7P=NZV4YC;2!GTbBd*21N=MYC*QjkzFstb*%ziX=!yFBqkk& z{iPaoO+jorKF3xDSJq1PWYL)JwEzXKtYugXEM(a<`1J?(vDi6YS#a8V@f#z$?6FWwi#Lp10#*s zp?wErsUc&y;}39I3=C*BT6O#e&!|X%-bbA{6Cj3T+**5+Fp-L{rzF!Y$>|WL$E{ zg8Ejr3i{o{T!==UbSiMP2x8es2(aEOkEMi5aYBPNVEfla!3zeZ{vZ^$Y^fRd0ghpI z#G3flH`QV(gBx45m_E%~b~LIbtDQh<7Rf3+r3_YEw`;COHK+bYg8(O{TH#Mb-UJ6_iFxawo zG9pljYgV)rt_iTv)skw!%3>9+P90!Ohv8xET)8-wR)@k{^WIhg;yA9g#EueY3NEVz z4QdgvE?{A;3Y}qK(=D2NBW1X#T!i&np;${+NJAD9MpdC>7j)i)`H@;bN`T8DTx4Sn zPe%H}=l)b=q?OVMyc`>^#xe~pBGuTipm0Ik7UUFc6a$>Tt1dm&xO|d`QF29!T)Za;8shKuy3yq=^$UsaPk6 zr;flzUZ4XZTw|GMkqbC_*@H*2vIa`yBhYdKPb~&6ap(^>hJ#)X97_Xh8IF`Qa!^aa zWnG_GXG2dcsFNZT_*&Nj+H> za6;<+Dh4TZG-PyZ1g@zCE~^ISM*{1`z`hJu*(oB9z;bP~=s@IA^SgHlC z$Z#}`yv-w;1P%q%`U9ObjgY#@ZQI~?Yb4e_mPJl85f>Ve_mB}T*jAz^ zMv`S#`!Fdi_5c=Z5_H3dgJKwp3PF+9#%HTJUU39+k>}l5#d4EE0^vZdRk6wjdaZyX zE@f6&;FMO;7`Rix#hxWJvj9{C3-!LOM!y{I)XjL17X3k zL4o8H8@U>&2k<7S0h`J$oaRIybSVsj0xbrd30M+PO1Bj8Iv0iufqfYc6(e7AROFw_ zaTpOez-D0p_F(Ad1{e5cI6kjN;%p2=Zwx}$y|5XK+m515U~zLlT;;)zeGYPLFKOO-C^#SldM?lMp1#9j=-3S%u_JHRN0%9`R*t}d8n6pMi#RlJgW~WBM$9gf)?jWu&H!E82T zGmKRQ#N)4{0I=Fr8IYk z40}cv=D>j(SRG(chBRRG4O>zp0$^=``*xWF#bSsKT#}(vV??JvGaHUZmetVN7WM_0 zv_Yr`I>3Zo8KD$d2u4W>yfo&!QlWKCo~zMhX$t9ox(&OjSV>r=!-&j(*j0bX3{IO}P06XL)hyYELA?EySP|$V z27O-!3tsh5yyBG@A83`((t}+|FHR7uLGg}NvbzTkcy20*EAW0(iu)Hd8R0R~k&>HE zqhuil@r^^w0qEs36ArCbk@sLyasmkCCiL_PJRUG5AoV6tif)Cb7Syd!$G}2H2+);q zjav`Ca+NzNaIYKWYe2(WS_~!VJF|X-7Qg^YttRwf3BBh*j>6+J+*FLbhcoE83A$lJ zcWY>Nzy-BNV5<&|0%)NKOaskb=olH43?2RC`!jSzlDB<9iz{58;bId(E8{-gEoQZW z#wavKGkV~HfU&fcoZJL!(>h#L10&;ASWkzbML@PSm@E<$Ga{e@OxZz!0eQ&=Jm~cU zr8XFc4@@Hgl_&-bNxm}Db*(D&gbM?#TEQ1+{zGe5hyke+c(elR1C|GDaS=+Ip!9it?!k^rMSvR-Y2HE=LM42nURK-pSKh;Q0r$JkP|dICX(jba&k ztbpbROh*E(b+A5OOx6yA+GY<-cGsd+W=uxn#ipX&30SIOJ;2n5g)AE|R`bkfK?$_; zM?OOfmVBCFDYAtCrx#ew&^a;k0Zt2n0dZ^bcpqpYL(ey`(UL~%aJ1~O712{ArF9Rd zGzY4HedEod0oj860ZyH8g?EOc??nSWhQZNzF*9KUJtRU41&mjSkmXRsPvFQ8z1$b$ zmI$qQMH>(>1)(QN zn&E;BR|H{A(YFHv42ss*kQul-L)}}~vIQK3ik=^U@C14>Ejla$kD}ps;7V_!^4>x0fVlK5dq*bt)cs1<~;Py8R&8tQi1QR zVKvLT^x+F|xnsWtY zHeJr5V}M}_Tkc8GE<vDW)M<6;N{pjeP)GZ=uHrm=+4Kk_Os*;exVn zO^uAe{tW#@BlKh#;3^U^1uk*LX=rXm-p??k0xL#!SqCyA&B`N5z`-j!oEdomp_SZDm)Bie#$ zK(P{dO0f=?_);jgD_6W26|fOt@IpU>fPDdDDcBTXJ%D}{)UT^EbZe4dT?-TiXs$u? z1-c9c)+*4fgoMKd8E&dYUev?!s4Ewt1wQfto_XcmB%p&B8J@dzBryNss&b&E2KsRX z>~nM0>CH4o%phDNEh>6+tc@39y%;NqKIlt9{1`^p7Gm{*BT?!H3&!gOt7!`^4`|pg zvrWa=%5n$Vc=*8*AziPDjPgu z8XR^aVxVu^m~8N~6_}M6oV)^oVIK_wbtZH}35s!FaJUIVfK?~ZBU`dcTHu#PPTRmZ zwG@Qsz;z3HTZ>qOWxn4EJz!zLK$Psi*d6l2=fHSy6MV-d&BptKBKg_Nf&6KLu_9O| z70Qi%-PWIly`L}rj4-SmqiUa-55{VsFJMK0 z{ix5dC#T%Ud0?aJ^My~KUxM^`Q0{}iS#%4EMqr`Uy3d-cRRvh#V|s2$6F&(VPi^0U zzMn!U*T&LhSwOzBDK#ZQBVagSRT22s+XW(8?Bhzk5g> zNC1BuDPJpa<#;{yH9~+Vuf&f}pl=(Y-#fx|1gvyyjBi$b7yG9~9 zu#pD(O+w^H>9)b9)*;}*wU)+y8qV}Xy~{bXlWyN_q|wD0`f(KnMYtwlMZl;>_PDgd zWdYt=VWsG$Jz0|BNE&&^0Jz>uGZ~(iIbQS6U5HvBqv2@D54WO|pw~`#ipSB^Pzqce zU>gs`feW06lVR_E`Xe0}jwYNL_u?0OXogj225T|y*QBvv!DZFJ5wF-$Su3Sxz#tip zlWELfJ?$!ytPNN*0p15i6P!{8`G8Zr7CI<|xPHuj_!q{3Ri`HF)~ruftUD!HxMp3l zZq>SE$;x%f;zjF{RqK|mO-^3BWNor~!P;b@v}{eXYT=q>$*R@Ks(gN7;JOo&C96+N zj$fIqUAQtiArF=EK8OxUc5M2U0Rf^U6iajU{SLA zl!aO)$FE+PtXi-zS+X{tEL@#W7Ol!tyG%hkb^XG8l3$Qd5`SuybX~XPKlezIm(5I) zj~|p||9$t6B>ChEljM47_^>3|Cx!lH|(=C&|9*=HkCi{TB~NlG)RfTC?{fzx$q(`V2bp&(5AKsBf2Q{$ zb`IgcgN{S!d`9^mK9u=d#CrhRr?h>XtoO6|OX53C-JN9onT|4^%1iYN+xzhToXjtD zCdpaqj+w`2{BIM}Q~32w^@r%MQS#4F_g!+HB%ai!-?+udoNGG!IW$apkzErIDqW{%o?Ji$q<6`oDrria2PGZNu@$W0_I#`T< ztNp9QZS*BcvYWpAAo>^^zR2e35IW=Od&8>92mu+jr;NR5$jI3YK zcQLdk^bBHcm&@bBXl`W6%B5v&3Q~gZ!*U8t& zdz7wJfBl85idZZ*7XOFr6Se#FY}3odi1s=0J4~BL`F^^-I#`^Z$Ir|8xSCH#;9En+XXu%Q|9Uq31OEno_p)s{+3)xH zYP=`2_b1Ai@bxA9coEd!5zYRoJXi8{BVV5;Ym3;n*l-j2Pn2)c2S3nHPl>@?Fb|SZefsMLbysLRkKKn$FG70*dtW8}UcVOU zIfKq)(dTOa3?0Xc#mm^bfQ?76WoNuM@b3&ZGy`2_k)+Pzx)Pm4u`o%{0X zYGdV>^xlhaF2D9++qG=@DSC_SS1W&4{M*=lCOzNMzqjeri}<&KT{r26RdgP_zdg?9 zY1(eoW^^ZGL_d7b7~3E1Gi=*Q%r4h%HJ|>*mj}e|0rK98??LwdnU0&3kDzxG+pcF% z5@U<)w`p^?m|Q~lX>9#>ZLXm2c5NZ`^`&;c^!R`*eyn^m~(9hTA9C7|B`yZFyqTPGc zy^!5o*>I3{H_-hSa@y!R2JKey{wdwp``n~oHq&`E8_pNwvkx=Y*mAJ)31n~7$Dfve zH(C$7zAi4GP`*d3cVSDDEngFhcg=OKAp7O?+)dxZ}~F8ik8+Zo?E%6F^Z z6YWSg%{R_IrS5FDE>eF6A3x8&pR?tMV)k{quOX*fOlQy1m&R!y8GDQ01$=p-*#8jy z=0o_3{%)~8mh5N9TF-_Y8-IlFF}fB^w^r@XM)LoFuVTzRA%D91MgBaa-_Mr6lTZ7wbC8@@XtRt@_psvvy35M_?A)yFbTS?mga75%IzBwe zrV^bcaXUuLF4g8JdVeVfTa^BcDlbNok8#S#dJ4(H{d@{A3dzTM9*9J^ie*YB<L zySJ;mP)z?*A1%f6-}LOId@^0Tv+3Wp`4oE|Vdo|MdOdqec$SFmJH+W1^gK<+DQvk@ zeH(ed({>R%?hwP5iSOa!n!{h0o}F$SlW~hayus(U)b+9DXmyL(HiMkq#9+N~`6xSn zO2$QW&y)_s-xT8u#ry4S`|=EZt9}VTU&_ue$JiG4uaUi&k5`d;HpkUxukucP}~_FP2g zHF!_P_Z_kSBj5i^-ABlMw|+lbobD0Z1^5n=ekeZsu>WLnT`b?n=clAWGJej^TiJCD zyB6~4ed6*w^6peVL;ZaAoyUd;`F<6-ZzI2LKl?fPd$9i~wjIjmr}%n~wx2gY{!Zp= zw7-@Q1@ZWu_^uGc1$d6czfPQQ(}(@W4bB8wjkadr`i|P9}^k?{e4IduR z=1g@*lJi!2|EBHv_)o)|&aK`k@4%D(7LG-$0M|B>4PKj-c9y}^nHPim+RBj=#Oc05t$#RZ@RWWBKI`D zJ}wS_n<3Wd@4$N+`SbCxEMCXvy!N-q&ybGPzjv_V3T+Qz&r{-k7v0PFI-jf;(EnjRzlE-M}mYn zZ(h{MoUZ;LwymYVj_)ou*QNE+vE)B0&d18{uI$?JdR+dCV*4xcxr@ABZC0^0)j#9pT+NoV4I&UUsPHqUyde-fX&^M7YPRQSDA+XuD#jlMr$yIbkMfUI-ab0Hb++B`^ao!&2r z>F3mcg6;1Tqf5l)6Z||-`ViV|^XYgoOw|1e|2M?zPQKNAeuNM25u3ND-$y?`gngc07-qKcat(jQ5k>uKpG_zKKmQ<@YbTmHGJ+ysz+iAKe3Zj`g{M zeNXZ6I6fp{KVRMD+J07>r90VQ*!GCn zE+>Cy@-Jb}IQuU}JJI;~mU#R@oW7;qo5k=|^!!l!NBQwbzJ8Z|XJ|V|OmEWWdwBjA z&&6W5Nc~lG{2cEx^cucTvhi)&f0gZz()DZkIc$B2&*}Uhn4$mVA2LtgOZLHZpKI(j zjhAnb`Bid0K+iIKuNS|Mk$nwW7pQ-du2&fsH}UDihp`vW=ft{BPCxt3$9E$iKS##L zrH|oR&xUu3%M@i zom=$RIG>*s_jB>=ZH#>ueKQ^3Cwl|hG3-8r_O%#VHeHikZn+$-kUo6&~&K8wCO zxd)-0tL=ki->WZvt8Ye>yXdWm^DpV!D1Mi-_a6S9#;yXH-}d>GHs4l%pP28D_l4}a zn=ki?^NW05PR6gr^k()R$IkbQ;X>^eisK*D@2>t=e7r1dG+vHIzljYuvUQ16BKt9I zm$Gq)y_d4B18tU={g$6?>|a5~-`Md{{$3&eXY%zTx{ed`uhTWdxLig4Uwsa-?-284 z4}EZue)=t*=NZqxBIh3ETg7EBd}s0Zvk^a^Ptw^==7T<8%*IQ_;UAsK2|WE~^@ zmo`t6lcVo{=y?GD?fT$Y@!v_zuO}lV>-)y$)9iYq_UrZIOg3CZ=8@v_1-frx--&#@ zR4m^iK5x`+m2q2F_Zm7b(q?DnPm*)3bTb>@Mc#Tkzene{`E#%Q_h;*4{W>Ck9mdFi zDu0SSKc)9$>@JfvM>^QpI+4vE!h56g2b6DQ&wk2l$-bEFA7R6}+ALJwkM7rtQVA%BkG=ZE>f2U$O5W1XD8;a@18^T``g_W+sS6q|kd_yac7_^^w# zRof38YP_)Fhx+Y>__pxvSM1wM`_u5x6TcVW*^P~hl`m$`0ACXH<>tZ(^v*TL*YNw} zbew41pG)ttWPBWbdGw8Z7a61MdtCeHY4_rTB(^S=A7$@x>^eidc2WN^ZI<)%X!e{y zS4vlv&+ie-nQZ-mHV^pxy7+&R%!iDvhqT$ur+diyrr16kZGHYJe59w7{2$LYmeD^T zj$H@ymA$8-jq-g@y62OXuLu7nN{SVl+o_&w7 z_nn>m&?gn2-ymZlxi|8=Lu|gm<`O$j*XCBf7o|7z^)|fk#rJXc4bt%fygU1xukIXe zUqasxjD;iUyip&#l6||`#IW;?EI0miTn%1 zYc|>fG5VCgc>qrr+t1_INA+8oZLi_?huFS9**~Q3=VJaO{o`zzul{E8KTVH+8!5S; zZ6}NG2A>b{Z>zdx?3^!V*VD0x569E@8FKzH%Q=(2Gw@xd@3#2tC8LG!PW|^jc0A0l zyneh*pO^H@mD-%e=0CCjE86}|{Oy{@MA4mUeew?WN622a;eiQre)GrsKe^I-V&yDz>!n26pbLe>+ z|Gvl0rnHHi*DIedme>1ymsnha=UP5Js}J9X=dI|!Lt88cxA5^YzQ0%fiDZ8k|L6I- zk(^8UwjOUM|KG0e=lJ|fRY^rGe1WwEqZMi^S?! zdf!0iT=6+jJoY?5AJF|}c7A3*d#HBLr~5MUE@Dfc*p~S_m#$xvu?ri%tbDJ!A8R+y z=k@4)`sBR_+ZX9yAf~rZGvDZWzWg4>T)+68O6E6|H;Cg^+U?DkTiJgDIbHhW1N2`- z_LKNV#N<42eW(28#@r=*zM5_CA@eEz73Vkui~X16Kg@^Mku#gj53&6ozBK6{V#{0U zxKEo!KHrS~6rX>~mk)^N|BA<*X!p|fO}wYF;TiRh$oCo#AEl!M@6~vZ63f?-{S9NG zho5iaQzDiJvSBmXd#Kxre?NZyfIUA~cO9M=vg^|5XYt;EXTJ8Y7OT7QzK`s;iF7%D* zlbiW=G~eIE&led7FG73KOPsT{`yJbUJ=fS~=h687U_2dmn6b^bH;DUN#r(Z=-_6E$ zGFP(Y8)VF2+l%>hIllLkJwR8HtoP!%fQ-Dcwi_LXvajWHFSKv!m!}WJJBL1PUP{g@ zwBMH08 zoHl1l&#>p+?7fcuyUF+~8DBI`%J|mkm!&?hqw^FpKg5>D#Ox9Ma)t6JfA*s18$P#+ z%{AJ60MAFzW{S=I{23Sjm+IFm$vO$ohuL$6_U~ZZ8lSt9GswPvZBL`?JNW*@hb!24 zBm3?ZhdcOxyZ(AsS|FAy$!Hi8pJek1#>=bdx|6&bUH52zIzQgTr=Q~a54Lq4?p(pI zcf=Sa?~m--mEK-DyYM_p-m&6vk-71GeNoYG`*%5aXnPU)_o@FpALg>_wPfGSk3W!q zEqglfovAOLKg-<~&oOkoPK-{__8zwOv+ZGi{f&<|secXG?-rjs>HazYQZja>^Ce=@ zLOV}+ced_^X9gP&)~<)Vud;97sAtax{dh1x{!H%u;`AwY50LR%`aUaGcgA?aca->a zi^s#_@*Z}5zEj`LwRe%1Q-1;ZTlw<=W8?k!rn6xk-aYZ|&5qmf9L(2#zMez>x%zgl zF?blcPw@F|^#54-tzz&Dzy40%EBO0v_T8+_{^E5yTN1V|lm7~z2Ix3T%=cx>e&TVr zzW5@2w@bT_@iMkutIfN_^H20N+3;&TZ=ma)_+QK4v-HO|=|A55S;_8WwfmoG#v|I% z+Skc$qJN#PbHwJCeE2RK?&te7a;~5&;qyDy-_760*mE1(i+E3_cULi=$)|_VmP+SJ ze-PVK*s@mrzVy%IOFLi3(Fgg~&F7CAgCC`1XYya6{X4~W6<>bOkK^?9n10P2=G?8# z)ogwNyXKJdVQsn(H_q|@g{~Y~_ptYs+WZGUj^<}_V|!=z+v@H){>sshNkmLo-*M(AteY`q=7#u#^qF%vZ15{Wf4QDk zGQzB#rrKU8`-eAV|6fMM`mCMX zlNpElhYF5q2X{IA z6^9;v=+U`@jySB9k&iq$SvJ?7V)|!|HVpXFG=H+t=saY$pRG6JZ&zEzL*|aO{9Le7 mobO+W=<~C^L*~|t{(TccE6#6@`@4}tX8L_wb$)Sk^Zx_)zb9V+ literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/anagram/generated/default/anagram.wat b/targets/wasm-tacle/sequential/anagram/generated/default/anagram.wat new file mode 100644 index 0000000..17d19af --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/default/anagram.wat @@ -0,0 +1,2403 @@ +(module $anagram.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32) (result i32))) + (type (;3;) (func (param i32))) + (type (;4;) (func (param i32 i32 i32))) + (type (;5;) (func (result i32))) + (type (;6;) (func (param i32) (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $anagram_ReadDict (type 1) + (local i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + local.set 1 + local.get 0 + i32.const 0 + i32.store8 offset=15 + i32.const 2279 + i32.const 2279 + call $__pragma_loopbound + i32.const 0 + local.set 2 + loop ;; label = @1 + i32.const 1 + i32.const 5 + call $__pragma_loopbound + local.get 2 + i32.const 3 + i32.add + local.set 3 + i32.const 12592 + local.get 1 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 2 + loop ;; label = @2 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 2 + i32.load8_u + local.set 4 + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 4 + br_if 0 (;@2;) + end + local.get 3 + i32.const -1 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 2279 + i32.ne + br_if 0 (;@1;) + end + i32.const 0 + local.get 3 + call $anagram_malloc + local.tee 5 + i32.store offset=21712 + i32.const 2279 + i32.const 2279 + call $__pragma_loopbound + i32.const 0 + local.set 6 + loop ;; label = @1 + i32.const 1 + i32.const 5 + call $__pragma_loopbound + block ;; label = @2 + block ;; label = @3 + i32.const 12592 + local.get 6 + i32.const 2 + i32.shl + i32.add + local.tee 7 + i32.load + i32.load8_u + local.tee 2 + br_if 0 (;@3;) + local.get 5 + i32.const 2 + i32.add + local.set 2 + i32.const 0 + local.set 4 + br 1 (;@2;) + end + i32.const 0 + local.set 4 + i32.const 2 + local.set 3 + loop ;; label = @3 + local.get 5 + local.get 3 + i32.add + local.tee 1 + local.get 2 + i32.store8 + local.get 1 + local.get 0 + i32.load8_u offset=15 + local.get 2 + i32.xor + i32.store8 + local.get 4 + local.get 2 + i32.const 223 + i32.and + i32.extend8_s + i32.const -65 + i32.add + i32.const 26 + i32.lt_u + i32.add + local.set 4 + local.get 7 + i32.load + local.get 3 + i32.add + local.set 2 + local.get 3 + i32.const 1 + i32.add + local.tee 1 + local.set 3 + local.get 2 + i32.const -1 + i32.add + i32.load8_u + local.tee 2 + br_if 0 (;@3;) + end + local.get 5 + local.get 1 + i32.add + local.set 2 + end + local.get 2 + i32.const 0 + i32.store8 + local.get 5 + local.get 4 + i32.store8 offset=1 + local.get 5 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + local.get 5 + i32.sub + i32.store8 + local.get 2 + local.set 5 + local.get 6 + i32.const 1 + i32.add + local.tee 6 + i32.const 2279 + i32.ne + br_if 0 (;@1;) + end + local.get 2 + i32.const 0 + i32.store8 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $anagram_CompareFrequency (type 2) (param i32 i32) (result i32) + i32.const -1 + local.get 0 + i32.load + i32.const 2 + i32.shl + i32.const 21760 + i32.add + i32.load + local.tee 0 + local.get 1 + i32.load + i32.const 2 + i32.shl + i32.const 21760 + i32.add + i32.load + local.tee 1 + i32.ne + local.get 0 + local.get 1 + i32.lt_u + select) + (func $anagram_BuildMask (type 3) (param i32) + (local i32 i32 i32 i32 i32 i32 i32) + i32.const 0 + i32.const 0 + i32.store offset=22816 + i32.const 11 + i32.const 11 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.load8_u + local.tee 1 + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + i32.const 0 + i32.load offset=22816 + local.set 2 + loop ;; label = @2 + block ;; label = @3 + local.get 1 + i32.extend8_s + local.tee 1 + i32.const -33 + i32.and + i32.const -91 + i32.add + i32.const -26 + i32.lt_u + br_if 0 (;@3;) + i32.const 0 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store offset=22816 + local.get 1 + local.get 1 + i32.const 32 + i32.add + local.get 1 + i32.const -91 + i32.add + i32.const -26 + i32.lt_u + select + i32.const 4 + i32.shl + i32.const 20320 + i32.add + local.tee 1 + local.get 1 + i32.load + i32.const 1 + i32.add + i32.store + end + local.get 0 + i32.load8_u + local.set 1 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 1 + br_if 0 (;@2;) + end + end + i32.const 26 + i32.const 26 + call $__pragma_loopbound + i32.const 0 + i32.load offset=22288 + local.set 3 + i32.const 0 + i32.load offset=22296 + local.set 4 + i32.const 0 + local.set 5 + i32.const 0 + local.set 6 + loop ;; label = @1 + local.get 6 + i32.const 2 + i32.shl + i32.const 21760 + i32.add + local.set 1 + block ;; label = @2 + block ;; label = @3 + local.get 6 + i32.const 4 + i32.shl + i32.const 21872 + i32.add + local.tee 7 + i32.load + local.tee 2 + br_if 0 (;@3;) + local.get 1 + i32.const -1 + i32.store + br 1 (;@2;) + end + local.get 1 + i32.const 0 + i32.store + i32.const 1 + local.set 1 + i32.const 1 + local.set 0 + loop ;; label = @3 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 2 + local.get 1 + i32.const 1 + i32.shl + local.tee 1 + i32.ge_u + br_if 0 (;@3;) + end + local.get 7 + i32.const 0 + i32.store offset=12 + local.get 7 + local.get 1 + i32.const -1 + i32.add + i32.store offset=8 + local.get 7 + i32.const 0 + local.get 5 + local.get 5 + local.get 0 + i32.add + i32.const 32 + i32.gt_u + select + local.tee 5 + i32.store offset=4 + i32.const 0 + local.get 4 + local.get 1 + local.get 5 + i32.shl + i32.or + local.tee 4 + i32.store offset=22296 + i32.const 0 + local.get 3 + local.get 2 + local.get 5 + i32.shl + i32.or + local.tee 3 + i32.store offset=22288 + local.get 5 + local.get 0 + i32.add + local.set 5 + end + local.get 6 + i32.const 1 + i32.add + local.tee 6 + i32.const 26 + i32.ne + br_if 0 (;@1;) + end) + (func $anagram_BuildWord (type 3) (param i32) + (local i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 32 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 1 + i32.const 26 + call $anagram_bzero + i32.const 3 + i32.const 5 + call $__pragma_loopbound + i32.const 0 + local.set 2 + local.get 0 + local.set 3 + block ;; label = @1 + block ;; label = @2 + loop ;; label = @3 + local.get 3 + i32.load8_s + local.tee 4 + i32.eqz + br_if 1 (;@2;) + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 4 + i32.const -33 + i32.and + i32.const -91 + i32.add + i32.const -26 + i32.lt_u + br_if 0 (;@3;) + local.get 1 + local.get 4 + local.get 4 + i32.const 32 + i32.add + local.get 4 + i32.const -91 + i32.add + i32.const -26 + i32.lt_u + select + i32.const -97 + i32.add + local.tee 4 + i32.add + local.tee 5 + local.get 5 + i32.load8_u + i32.const 1 + i32.add + local.tee 5 + i32.store8 + local.get 4 + i32.const 4 + i32.shl + i32.const 21872 + i32.add + i32.load + local.get 5 + i32.const 255 + i32.and + i32.lt_u + br_if 2 (;@1;) + local.get 2 + i32.const 1 + i32.add + local.set 2 + br 0 (;@3;) + end + end + i32.const 26 + i32.const 26 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=21760 + local.get 1 + i32.load8_u + i32.add + i32.store offset=21760 + i32.const 0 + i32.const 0 + i32.load offset=21764 + local.get 1 + i32.load8_u offset=1 + i32.add + i32.store offset=21764 + i32.const 0 + i32.const 0 + i32.load offset=21768 + local.get 1 + i32.load8_u offset=2 + i32.add + i32.store offset=21768 + i32.const 0 + i32.const 0 + i32.load offset=21772 + local.get 1 + i32.load8_u offset=3 + i32.add + i32.store offset=21772 + i32.const 0 + i32.const 0 + i32.load offset=21776 + local.get 1 + i32.load8_u offset=4 + i32.add + i32.store offset=21776 + i32.const 0 + i32.const 0 + i32.load offset=21780 + local.get 1 + i32.load8_u offset=5 + i32.add + i32.store offset=21780 + i32.const 0 + i32.const 0 + i32.load offset=21784 + local.get 1 + i32.load8_u offset=6 + i32.add + i32.store offset=21784 + i32.const 0 + i32.const 0 + i32.load offset=21788 + local.get 1 + i32.load8_u offset=7 + i32.add + i32.store offset=21788 + i32.const 0 + i32.const 0 + i32.load offset=21792 + local.get 1 + i32.load8_u offset=8 + i32.add + i32.store offset=21792 + i32.const 0 + i32.const 0 + i32.load offset=21796 + local.get 1 + i32.load8_u offset=9 + i32.add + i32.store offset=21796 + i32.const 0 + i32.const 0 + i32.load offset=21800 + local.get 1 + i32.load8_u offset=10 + i32.add + i32.store offset=21800 + i32.const 0 + i32.const 0 + i32.load offset=21804 + local.get 1 + i32.load8_u offset=11 + i32.add + i32.store offset=21804 + i32.const 0 + i32.const 0 + i32.load offset=21808 + local.get 1 + i32.load8_u offset=12 + i32.add + i32.store offset=21808 + i32.const 0 + i32.const 0 + i32.load offset=21812 + local.get 1 + i32.load8_u offset=13 + i32.add + i32.store offset=21812 + i32.const 0 + i32.const 0 + i32.load offset=21816 + local.get 1 + i32.load8_u offset=14 + i32.add + i32.store offset=21816 + i32.const 0 + i32.const 0 + i32.load offset=21820 + local.get 1 + i32.load8_u offset=15 + i32.add + i32.store offset=21820 + i32.const 0 + i32.const 0 + i32.load offset=21824 + local.get 1 + i32.load8_u offset=16 + i32.add + i32.store offset=21824 + i32.const 0 + i32.const 0 + i32.load offset=21828 + local.get 1 + i32.load8_u offset=17 + i32.add + i32.store offset=21828 + i32.const 0 + i32.const 0 + i32.load offset=21832 + local.get 1 + i32.load8_u offset=18 + i32.add + i32.store offset=21832 + i32.const 0 + i32.const 0 + i32.load offset=21836 + local.get 1 + i32.load8_u offset=19 + i32.add + i32.store offset=21836 + i32.const 0 + i32.const 0 + i32.load offset=21840 + local.get 1 + i32.load8_u offset=20 + i32.add + i32.store offset=21840 + i32.const 0 + i32.const 0 + i32.load offset=21844 + local.get 1 + i32.load8_u offset=21 + i32.add + i32.store offset=21844 + i32.const 0 + i32.const 0 + i32.load offset=21848 + local.get 1 + i32.load8_u offset=22 + i32.add + i32.store offset=21848 + i32.const 0 + i32.const 0 + i32.load offset=21852 + local.get 1 + i32.load8_u offset=23 + i32.add + i32.store offset=21852 + i32.const 0 + i32.const 0 + i32.load offset=21856 + local.get 1 + i32.load8_u offset=24 + i32.add + i32.store offset=21856 + i32.const 0 + i32.const 0 + i32.load offset=21860 + local.get 1 + i32.load8_u offset=25 + i32.add + i32.store offset=21860 + i32.const 0 + i32.const 0 + i32.load offset=22820 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=22820 + block ;; label = @2 + local.get 3 + i32.const 2 + i32.shl + i32.const 22416 + i32.add + i32.load + local.tee 4 + br_if 0 (;@2;) + i32.const 20 + call $anagram_malloc + local.set 4 + i32.const 0 + i32.load offset=22820 + i32.const 2 + i32.shl + i32.const 22412 + i32.add + local.get 4 + i32.store + end + local.get 4 + i32.const 4 + i32.add + local.tee 3 + i32.const 8 + call $anagram_bzero + local.get 4 + local.get 2 + i32.store offset=12 + local.get 4 + local.get 0 + i32.store + i32.const 26 + i32.const 26 + call $__pragma_loopbound + local.get 3 + i32.const 0 + i32.load offset=21884 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u + i32.const 0 + i32.load offset=21876 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21900 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=1 + i32.const 0 + i32.load offset=21892 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21916 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=2 + i32.const 0 + i32.load offset=21908 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21932 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=3 + i32.const 0 + i32.load offset=21924 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21948 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=4 + i32.const 0 + i32.load offset=21940 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21964 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=5 + i32.const 0 + i32.load offset=21956 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21980 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=6 + i32.const 0 + i32.load offset=21972 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=21996 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=7 + i32.const 0 + i32.load offset=21988 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22012 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=8 + i32.const 0 + i32.load offset=22004 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22028 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=9 + i32.const 0 + i32.load offset=22020 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22044 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=10 + i32.const 0 + i32.load offset=22036 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22060 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=11 + i32.const 0 + i32.load offset=22052 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22076 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=12 + i32.const 0 + i32.load offset=22068 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22092 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=13 + i32.const 0 + i32.load offset=22084 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22108 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=14 + i32.const 0 + i32.load offset=22100 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22124 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=15 + i32.const 0 + i32.load offset=22116 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22140 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=16 + i32.const 0 + i32.load offset=22132 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22156 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=17 + i32.const 0 + i32.load offset=22148 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22172 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=18 + i32.const 0 + i32.load offset=22164 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22188 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=19 + i32.const 0 + i32.load offset=22180 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22204 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=20 + i32.const 0 + i32.load offset=22196 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22220 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=21 + i32.const 0 + i32.load offset=22212 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22236 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=22 + i32.const 0 + i32.load offset=22228 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22252 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=23 + i32.const 0 + i32.load offset=22244 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22268 + i32.const 2 + i32.shl + i32.add + local.tee 4 + local.get 4 + i32.load + local.get 1 + i32.load8_u offset=24 + i32.const 0 + i32.load offset=22260 + i32.shl + i32.or + i32.store + local.get 3 + i32.const 0 + i32.load offset=22284 + i32.const 2 + i32.shl + i32.add + local.tee 3 + local.get 3 + i32.load + local.get 1 + i32.load8_u offset=25 + i32.const 0 + i32.load offset=22276 + i32.shl + i32.or + i32.store + end + local.get 1 + i32.const 32 + i32.add + global.set $__stack_pointer) + (func $anagram_FindAnagram (type 4) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 3 + global.set $__stack_pointer + i32.const 0 + i32.load offset=22820 + local.set 4 + i32.const 0 + i32.const 6 + call $__pragma_loopbound + local.get 2 + i32.const -1 + i32.add + local.set 5 + local.get 2 + i32.const 2 + i32.shl + i32.const 22304 + i32.add + local.set 2 + loop ;; label = @1 + local.get 2 + i32.load + local.set 6 + local.get 2 + i32.const 4 + i32.add + local.set 2 + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 0 + local.get 6 + i32.const 4 + i32.shl + local.tee 6 + i32.const 21884 + i32.add + i32.load + local.tee 7 + i32.const 2 + i32.shl + i32.add + i32.load + local.get 6 + i32.const 21880 + i32.add + i32.load + local.get 6 + i32.const 21876 + i32.add + i32.load + i32.shl + local.tee 8 + i32.and + i32.eqz + br_if 0 (;@1;) + end + i32.const 0 + i32.const 11 + call $__pragma_loopbound + block ;; label = @1 + local.get 4 + i32.const 2 + i32.shl + i32.const 22416 + i32.add + local.tee 9 + local.get 1 + i32.le_u + br_if 0 (;@1;) + local.get 7 + i32.const 2 + i32.shl + local.set 10 + loop ;; label = @2 + i32.const 0 + i32.load offset=22300 + local.set 7 + i32.const 0 + i32.load offset=22296 + local.set 2 + local.get 0 + i32.load + local.set 6 + block ;; label = @3 + loop ;; label = @4 + local.get 2 + local.get 6 + local.get 1 + i32.load + local.tee 11 + i32.load offset=4 + i32.sub + local.tee 4 + i32.and + br_if 1 (;@3;) + block ;; label = @5 + local.get 7 + local.get 0 + i32.load offset=4 + local.get 11 + i32.load offset=8 + i32.sub + local.tee 12 + i32.and + i32.eqz + br_if 0 (;@5;) + local.get 3 + local.get 12 + i32.store offset=12 + br 2 (;@3;) + end + block ;; label = @5 + local.get 11 + i32.const 4 + i32.add + local.get 10 + i32.add + i32.load + local.get 8 + i32.and + br_if 0 (;@5;) + local.get 1 + local.get 9 + i32.const -4 + i32.add + local.tee 9 + i32.load + i32.store + local.get 9 + local.get 11 + i32.store + local.get 1 + local.get 9 + i32.lt_u + br_if 1 (;@4;) + br 4 (;@1;) + end + end + i32.const 0 + i32.const 0 + i32.load offset=22824 + local.tee 2 + i32.const 1 + i32.add + i32.store offset=22824 + i32.const 0 + i32.const 0 + i32.load offset=22816 + local.tee 6 + local.get 11 + i32.load offset=12 + local.tee 7 + i32.sub + i32.store offset=22816 + local.get 2 + i32.const 2 + i32.shl + i32.const 22832 + i32.add + local.get 11 + i32.store + local.get 3 + local.get 4 + i32.store offset=8 + local.get 3 + local.get 12 + i32.store offset=12 + block ;; label = @4 + block ;; label = @5 + local.get 6 + local.get 7 + i32.eq + br_if 0 (;@5;) + i32.const 0 + i32.load offset=22820 + local.set 2 + local.get 3 + i32.const 8 + i32.add + local.get 1 + local.get 5 + call $anagram_FindAnagram + local.get 2 + i32.const 2 + i32.shl + i32.const 22416 + i32.add + local.set 9 + i32.const 0 + i32.load offset=22824 + local.set 2 + br 1 (;@4;) + end + i32.const 3 + i32.const 3 + call $__pragma_loopbound + i32.const 0 + local.set 13 + block ;; label = @5 + i32.const 0 + i32.load offset=22824 + local.tee 2 + i32.const 1 + i32.lt_s + br_if 0 (;@5;) + i32.const 0 + local.set 13 + i32.const 0 + local.set 14 + loop ;; label = @6 + i32.const 3 + i32.const 5 + call $__pragma_loopbound + i32.const 0 + local.set 7 + block ;; label = @7 + local.get 14 + i32.const 2 + i32.shl + i32.const 22832 + i32.add + i32.load + i32.load + local.tee 2 + i32.load8_u + local.tee 6 + i32.eqz + br_if 0 (;@7;) + local.get 13 + i32.const 21728 + i32.add + local.set 4 + local.get 2 + i32.const 1 + i32.add + local.set 12 + i32.const 0 + local.set 2 + loop ;; label = @8 + local.get 4 + local.get 2 + i32.add + local.get 6 + i32.store8 + local.get 12 + local.get 2 + i32.add + local.set 6 + local.get 2 + i32.const 1 + i32.add + local.tee 7 + local.set 2 + local.get 6 + i32.load8_u + local.tee 6 + br_if 0 (;@8;) + end + end + local.get 7 + local.get 13 + i32.add + local.tee 2 + i32.const 21728 + i32.add + i32.const 32 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 13 + local.get 14 + i32.const 1 + i32.add + local.tee 14 + i32.const 0 + i32.load offset=22824 + local.tee 2 + i32.lt_s + br_if 0 (;@6;) + end + end + local.get 13 + i32.const 21728 + i32.add + i32.const 0 + i32.store8 + end + i32.const 0 + local.get 2 + i32.const -1 + i32.add + i32.store offset=22824 + i32.const 0 + i32.const 0 + i32.load offset=22816 + local.get 11 + i32.load offset=12 + i32.add + i32.store offset=22816 + end + local.get 1 + i32.const 4 + i32.add + local.tee 1 + local.get 9 + i32.lt_u + br_if 0 (;@2;) + end + end + local.get 3 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $anagram_main (type 1) + (local i32 i32 i32 i32 i32) + i32.const 3 + i32.const 3 + call $__pragma_loopbound + i32.const 0 + local.set 0 + loop ;; label = @1 + i32.const 21872 + i32.const 416 + call $anagram_bzero + i32.const 22288 + i32.const 8 + call $anagram_bzero + i32.const 22296 + i32.const 8 + call $anagram_bzero + i32.const 21760 + i32.const 104 + call $anagram_bzero + i32.const 22304 + i32.const 104 + call $anagram_bzero + i32.const 22416 + i32.const 400 + call $anagram_bzero + i32.const 0 + i32.const 0 + i32.store offset=22820 + i32.const 0 + i32.const 0 + i32.store offset=22816 + i32.const 12576 + local.get 0 + i32.const 2 + i32.shl + i32.add + i32.load + call $anagram_BuildMask + i32.const 0 + i32.const 0 + i32.store offset=22820 + i32.const 0 + i32.load offset=21712 + local.set 1 + i32.const 1967 + i32.const 1967 + call $__pragma_loopbound + block ;; label = @2 + loop ;; label = @3 + local.get 1 + i32.load8_u + local.tee 2 + i32.eqz + br_if 1 (;@2;) + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 1 + i32.load8_s offset=1 + local.tee 3 + i32.const 3 + i32.lt_s + br_if 0 (;@6;) + i32.const 0 + i32.load offset=22816 + local.tee 4 + local.get 3 + i32.const 3 + i32.add + i32.const 255 + i32.and + i32.ge_s + br_if 1 (;@5;) + local.get 4 + local.get 3 + i32.eq + br_if 1 (;@5;) + br 2 (;@4;) + end + i32.const 0 + i32.load offset=22816 + local.get 3 + i32.ne + br_if 1 (;@4;) + end + local.get 1 + i32.const 2 + i32.add + call $anagram_BuildWord + local.get 1 + i32.load8_u + local.set 2 + end + local.get 1 + local.get 2 + i32.extend8_s + i32.add + local.set 1 + br 0 (;@3;) + end + end + block ;; label = @2 + i32.const 0 + i32.load offset=22820 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=22816 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.const 0 + i32.store offset=22824 + i32.const 26 + i32.const 26 + call $__pragma_loopbound + i32.const 0 + i64.const 107374182424 + i64.store offset=22400 + i32.const 0 + i64.const 98784247830 + i64.store offset=22392 + i32.const 0 + i64.const 90194313236 + i64.store offset=22384 + i32.const 0 + i64.const 81604378642 + i64.store offset=22376 + i32.const 0 + i64.const 73014444048 + i64.store offset=22368 + i32.const 0 + i64.const 64424509454 + i64.store offset=22360 + i32.const 0 + i64.const 55834574860 + i64.store offset=22352 + i32.const 0 + i64.const 47244640266 + i64.store offset=22344 + i32.const 0 + i64.const 38654705672 + i64.store offset=22336 + i32.const 0 + i64.const 30064771078 + i64.store offset=22328 + i32.const 0 + i64.const 21474836484 + i64.store offset=22320 + i32.const 0 + i64.const 12884901890 + i64.store offset=22312 + i32.const 0 + i64.const 4294967296 + i64.store offset=22304 + i32.const 22304 + i32.const 26 + i32.const 4 + call $anagram_qsort + i32.const 22288 + i32.const 22416 + i32.const 0 + call $anagram_FindAnagram + end + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 3 + i32.ne + br_if 0 (;@1;) + end) + (func $__original_main (type 5) (result i32) + call $anagram_ReadDict + call $anagram_main + i32.const 0 + i32.load8_u offset=21728 + i32.const 100 + i32.ne + i32.const 0 + i32.load8_u offset=21729 + i32.const 255 + i32.and + i32.const 117 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21730 + i32.const 255 + i32.and + i32.const 107 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21731 + i32.const 255 + i32.and + i32.const 101 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21732 + i32.const 255 + i32.and + i32.const 32 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21733 + i32.const 255 + i32.and + i32.const 121 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21734 + i32.const 255 + i32.and + i32.const 105 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21735 + i32.const 255 + i32.and + i32.const 112 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21736 + i32.const 255 + i32.and + i32.const 32 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21737 + i32.const 255 + i32.and + i32.const 97 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21738 + i32.const 255 + i32.and + i32.const 114 + i32.ne + i32.or + i32.const 0 + i32.load8_u offset=21739 + i32.const 255 + i32.and + i32.const 109 + i32.ne + i32.or + i32.const 1 + i32.and) + (func $anagram_qsorts (type 4) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 3 + i32.const 0 + i32.store offset=12 + i32.const 0 + i32.const 3 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + i32.const 2 + i32.lt_u + br_if 0 (;@1;) + local.get 2 + i32.const -4 + i32.and + local.set 4 + local.get 2 + i32.const 3 + i32.and + local.set 5 + local.get 2 + i32.const -1 + i32.add + local.set 6 + i32.const 0 + local.get 2 + i32.sub + local.set 7 + loop ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 11 + i32.lt_u + br_if 0 (;@4;) + local.get 0 + local.get 1 + i32.const 6 + i32.div_u + local.get 2 + i32.mul + local.tee 8 + i32.add + local.tee 9 + local.get 8 + i32.const 1 + i32.shl + local.tee 10 + i32.add + local.tee 8 + local.get 10 + i32.add + local.set 10 + block ;; label = @5 + block ;; label = @6 + local.get 9 + local.get 8 + call $anagram_CompareFrequency + i32.const -1 + i32.gt_s + br_if 0 (;@6;) + local.get 8 + local.set 11 + local.get 9 + local.get 10 + call $anagram_CompareFrequency + i32.const 0 + i32.lt_s + br_if 1 (;@5;) + br 3 (;@3;) + end + local.get 9 + local.set 11 + local.get 8 + local.set 9 + local.get 8 + local.get 10 + call $anagram_CompareFrequency + i32.const -1 + i32.gt_s + br_if 2 (;@3;) + end + local.get 11 + local.get 10 + local.get 11 + local.get 10 + call $anagram_CompareFrequency + i32.const 0 + i32.lt_s + select + local.set 9 + br 1 (;@3;) + end + local.get 0 + local.get 1 + i32.const 1 + i32.shr_u + local.get 2 + i32.mul + i32.add + local.set 9 + end + block ;; label = @3 + block ;; label = @4 + local.get 5 + br_if 0 (;@4;) + local.get 0 + local.set 8 + local.get 2 + local.set 10 + br 1 (;@3;) + end + local.get 5 + local.set 10 + local.get 0 + local.set 8 + loop ;; label = @4 + local.get 8 + i32.load8_u + local.set 11 + local.get 8 + local.get 9 + i32.load8_u + i32.store8 + local.get 9 + local.get 11 + i32.store8 + local.get 9 + i32.const 1 + i32.add + local.set 9 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 10 + i32.const -1 + i32.add + local.tee 10 + br_if 0 (;@4;) + end + local.get 4 + local.set 10 + end + block ;; label = @3 + local.get 6 + i32.const 3 + i32.lt_u + local.tee 12 + br_if 0 (;@3;) + loop ;; label = @4 + local.get 8 + i32.load8_u + local.set 11 + local.get 8 + local.get 9 + i32.load8_u + i32.store8 + local.get 9 + local.get 11 + i32.store8 + local.get 8 + i32.const 1 + i32.add + local.tee 11 + i32.load8_u + local.set 13 + local.get 11 + local.get 9 + i32.const 1 + i32.add + local.tee 14 + i32.load8_u + i32.store8 + local.get 14 + local.get 13 + i32.store8 + local.get 8 + i32.const 2 + i32.add + local.tee 11 + i32.load8_u + local.set 13 + local.get 11 + local.get 9 + i32.const 2 + i32.add + local.tee 14 + i32.load8_u + i32.store8 + local.get 14 + local.get 13 + i32.store8 + local.get 8 + i32.const 3 + i32.add + local.tee 11 + i32.load8_u + local.set 13 + local.get 11 + local.get 9 + i32.const 3 + i32.add + local.tee 14 + i32.load8_u + i32.store8 + local.get 14 + local.get 13 + i32.store8 + local.get 8 + i32.const 4 + i32.add + local.set 8 + local.get 9 + i32.const 4 + i32.add + local.set 9 + local.get 10 + i32.const -4 + i32.add + local.tee 10 + br_if 0 (;@4;) + end + end + i32.const 0 + i32.const 10 + call $__pragma_loopbound + local.get 0 + local.set 10 + local.get 0 + local.get 1 + local.get 2 + i32.mul + i32.add + local.tee 15 + local.set 16 + block ;; label = @3 + loop ;; label = @4 + local.get 3 + local.get 3 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + i32.const 1 + i32.const 6 + call $__pragma_loopbound + local.get 10 + local.get 2 + i32.add + local.set 9 + block ;; label = @5 + loop ;; label = @6 + local.get 9 + local.tee 10 + local.get 15 + i32.ge_u + br_if 1 (;@5;) + local.get 10 + local.get 2 + i32.add + local.set 9 + local.get 10 + local.get 0 + call $anagram_CompareFrequency + i32.const 0 + i32.lt_s + br_if 0 (;@6;) + end + end + i32.const 1 + i32.const 7 + call $__pragma_loopbound + local.get 7 + local.set 9 + block ;; label = @5 + loop ;; label = @6 + local.get 16 + local.get 9 + local.tee 11 + i32.add + local.tee 14 + local.get 0 + i32.le_u + br_if 1 (;@5;) + local.get 11 + local.get 2 + i32.sub + local.set 9 + local.get 14 + local.get 0 + call $anagram_CompareFrequency + i32.const 0 + i32.gt_s + br_if 0 (;@6;) + end + end + block ;; label = @5 + block ;; label = @6 + local.get 14 + local.get 10 + i32.ge_u + br_if 0 (;@6;) + local.get 16 + local.get 11 + i32.add + local.set 9 + block ;; label = @7 + block ;; label = @8 + local.get 5 + br_if 0 (;@8;) + local.get 0 + local.set 8 + local.get 2 + local.set 10 + br 1 (;@7;) + end + local.get 5 + local.set 10 + local.get 0 + local.set 8 + loop ;; label = @8 + local.get 8 + i32.load8_u + local.set 13 + local.get 8 + local.get 9 + i32.load8_u + i32.store8 + local.get 9 + local.get 13 + i32.store8 + local.get 9 + i32.const 1 + i32.add + local.set 9 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 10 + i32.const -1 + i32.add + local.tee 10 + br_if 0 (;@8;) + end + local.get 4 + local.set 10 + end + block ;; label = @7 + local.get 12 + br_if 0 (;@7;) + loop ;; label = @8 + local.get 8 + i32.load8_u + local.set 13 + local.get 8 + local.get 9 + i32.load8_u + i32.store8 + local.get 9 + local.get 13 + i32.store8 + local.get 8 + i32.const 1 + i32.add + local.tee 13 + i32.load8_u + local.set 14 + local.get 13 + local.get 9 + i32.const 1 + i32.add + local.tee 17 + i32.load8_u + i32.store8 + local.get 17 + local.get 14 + i32.store8 + local.get 8 + i32.const 2 + i32.add + local.tee 13 + i32.load8_u + local.set 14 + local.get 13 + local.get 9 + i32.const 2 + i32.add + local.tee 17 + i32.load8_u + i32.store8 + local.get 17 + local.get 14 + i32.store8 + local.get 8 + i32.const 3 + i32.add + local.tee 13 + i32.load8_u + local.set 14 + local.get 13 + local.get 9 + i32.const 3 + i32.add + local.tee 17 + i32.load8_u + i32.store8 + local.get 17 + local.get 14 + i32.store8 + local.get 8 + i32.const 4 + i32.add + local.set 8 + local.get 9 + i32.const 4 + i32.add + local.set 9 + local.get 10 + i32.const -4 + i32.add + local.tee 10 + br_if 0 (;@8;) + end + end + local.get 16 + local.get 0 + i32.sub + local.get 11 + i32.add + local.get 2 + i32.div_u + local.tee 9 + local.get 1 + local.get 9 + i32.const -1 + i32.xor + i32.add + local.tee 1 + i32.lt_u + br_if 1 (;@5;) + local.get 0 + local.get 9 + local.get 2 + call $anagram_qsorts + local.get 0 + local.get 9 + i32.const 1 + i32.add + local.get 2 + i32.mul + i32.add + local.set 0 + br 3 (;@3;) + end + local.get 10 + local.set 9 + local.get 14 + local.set 8 + local.get 2 + local.set 13 + block ;; label = @6 + local.get 5 + i32.eqz + br_if 0 (;@6;) + local.get 16 + local.get 11 + i32.add + local.set 16 + i32.const 0 + local.set 8 + loop ;; label = @7 + local.get 10 + local.get 8 + i32.add + local.tee 9 + i32.load8_u + local.set 11 + local.get 9 + local.get 16 + local.get 8 + i32.add + local.tee 13 + i32.load8_u + i32.store8 + local.get 13 + local.get 11 + i32.store8 + local.get 5 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + i32.ne + br_if 0 (;@7;) + end + local.get 2 + local.get 8 + i32.sub + local.set 13 + local.get 10 + local.get 8 + i32.add + local.set 9 + local.get 16 + local.get 8 + i32.add + local.set 8 + end + local.get 14 + local.set 16 + local.get 12 + br_if 1 (;@4;) + loop ;; label = @6 + local.get 9 + i32.load8_u + local.set 11 + local.get 9 + local.get 8 + i32.load8_u + i32.store8 + local.get 8 + local.get 11 + i32.store8 + local.get 9 + i32.const 1 + i32.add + local.tee 11 + i32.load8_u + local.set 16 + local.get 11 + local.get 8 + i32.const 1 + i32.add + local.tee 17 + i32.load8_u + i32.store8 + local.get 17 + local.get 16 + i32.store8 + local.get 9 + i32.const 2 + i32.add + local.tee 11 + i32.load8_u + local.set 16 + local.get 11 + local.get 8 + i32.const 2 + i32.add + local.tee 17 + i32.load8_u + i32.store8 + local.get 17 + local.get 16 + i32.store8 + local.get 9 + i32.const 3 + i32.add + local.tee 11 + i32.load8_u + local.set 16 + local.get 11 + local.get 8 + i32.const 3 + i32.add + local.tee 17 + i32.load8_u + i32.store8 + local.get 17 + local.get 16 + i32.store8 + local.get 9 + i32.const 4 + i32.add + local.set 9 + local.get 8 + i32.const 4 + i32.add + local.set 8 + local.get 13 + i32.const -4 + i32.add + local.tee 13 + br_if 0 (;@6;) + end + local.get 14 + local.set 16 + br 1 (;@4;) + end + end + local.get 0 + local.get 9 + i32.const 1 + i32.add + local.get 2 + i32.mul + i32.add + local.get 1 + local.get 2 + call $anagram_qsorts + local.get 9 + local.set 1 + end + local.get 1 + i32.const 1 + i32.gt_u + br_if 0 (;@2;) + end + end + local.get 3 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $anagram_qsort (type 4) (param i32 i32 i32) + local.get 0 + local.get 1 + local.get 2 + call $anagram_qsorts) + (func $anagram_malloc (type 6) (param i32) (result i32) + (local i32) + i32.const 0 + i32.const 4 + local.get 0 + i32.const 3 + i32.and + local.tee 1 + i32.sub + i32.const 0 + local.get 1 + select + local.get 0 + i32.add + i32.const 0 + i32.load offset=44040 + local.tee 0 + i32.add + i32.store offset=44040 + local.get 0 + i32.const 23040 + i32.add) + (func $anagram_bzero (type 0) (param i32 i32) + (local i32) + i32.const 8 + i32.const 800 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.const 7 + i32.and + local.set 2 + block ;; label = @2 + local.get 1 + i32.const 8 + i32.lt_u + br_if 0 (;@2;) + local.get 1 + i32.const -8 + i32.and + local.set 1 + loop ;; label = @3 + local.get 0 + i64.const 0 + i64.store align=1 + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 1 + i32.const -8 + i32.add + local.tee 1 + br_if 0 (;@3;) + end + end + local.get 2 + i32.eqz + br_if 0 (;@1;) + loop ;; label = @2 + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + br_if 0 (;@2;) + end + end) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 48144)) + (global (;1;) i32 (i32.const 44044)) + (global (;2;) i32 (i32.const 48144)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $anagram_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "hertz\00blitz\00Heinz\00Benz\00Franz\00whiz\00Suez\00Perez\00lazy\00epoxy\00pixy\00savvy\00ivy\00levy\00bevy\00gravy\00navy\00heavy\00guy\00sixty\00rutty\00witty\00nitty\00petty\00fatty\00rusty\00lusty\00misty\00tasty\00hasty\00hurty\00forty\00dirty\00warty\00salty\00pity\00deity\00city\00laity\00hefty\00diety\00meaty\00mousy\00lousy\00busy\00Patsy\00fussy\00lossy\00Missy\00messy\00tipsy\00cosy\00pansy\00daisy\00poesy\00cowry\00awry\00bury\00furry\00terry\00merry\00kerry\00ferry\00Gerry\00tarry\00story\00Emory\00gory\00fairy\00dairy\00angry\00fry\00query\00fiery\00faery\00dry\00nary\00diary\00Mary\00wispy\00puppy\00hippy\00sappy\00pappy\00copy\00lumpy\00dumpy\00envoy\00Sepoy\00annoy\00loy\00joy\00ahoy\00coy\00boy\00Roy\00tawny\00puny\00tony\00phony\00cony\00sunny\00sonny\00finny\00penny\00Denny\00Benny\00briny\00deny\00any\00army\00rummy\00mummy\00tommy\00rimy\00slimy\00seamy\00duly\00sly\00only\00dolly\00silly\00Lilly\00kelly\00wally\00dally\00lily\00ugly\00Italy\00Healy\00dusky\00jerky\00booky\00smoky\00punky\00junky\00gunky\00sulky\00bulky\00spiky\00lucky\00Becky\00wacky\00flaky\00shaky\00why\00withy\00pithy\00Kathy\00mushy\00bushy\00washy\00Vichy\00bogy\00muggy\00soggy\00leggy\00edgy\00Nagy\00deify\00puffy\00Duffy\00iffy\00taffy\00daffy\00leafy\00prey\00Corey\00Carey\00coney\00Haney\00Foley\00alley\00they\00obey\00abbey\00howdy\00study\00Trudy\00Rudy\00Judy\00wordy\00tardy\00moody\00Cody\00bundy\00randy\00oldy\00baldy\00tidy\00john alledy\00seedy\00reedy\00needy\00buddy\00Brady\00ready\00Nancy\00spicy\00Tracy\00ruby\00booby\00Colby\00hubby\00lobby\00hobby\00gibby\00way\00stay\00essay\00array\00pray\00fray\00slay\00splay\00allay\00Malay\00Okay\00gay\00fay\00today\00bay\00Kay\00onyx\00crux\00Sioux\00Knox\00admix\00Felix\00affix\00radix\00vex\00Pyrex\00apex\00annex\00Timex\00Telex\00hex\00pax\00flax\00relax\00Ajax\00wow\00avow\00sow\00arrow\00grow\00pow\00snow\00slow\00allow\00glow\00flow\00how\00widow\00stew\00threw\00shrew\00grew\00drew\00crew\00brew\00sinew\00Agnew\00mew\00askew\00chew\00few\00squaw\00straw\00papaw\00gnaw\00bylaw\00claw\00jaw\00shaw\00chaw\00Nov\00iv\00Kiev\00tutu\00guru\00Nehru\00bayou\00Ainu\00haiku\00juju\00du\00tabu\00Frau\00Wu\00input\00tout\00trout\00grout\00spout\00shout\00glut\00jut\00abut\00kraut\00Knott\00Wyatt\00watt\00Pratt\00mayst\00trust\00joust\00must\00gust\00bust\00Faust\00worst\00first\00frost\00post\00roost\00most\00Ernst\00wrist\00moist\00fist\00zest\00west\00vest\00wrest\00crest\00blest\00fest\00midst\00vast\00past\00mast\00last\00yeast\00hurt\00sort\00fort\00abort\00quirt\00inert\00alert\00heart\00dart\00Egypt\00opt\00tempt\00wept\00crept\00inapt\00leapt\00adapt\00rot\00loot\00hoot\00foot\00scoot\00minot\00pilot\00blot\00idiot\00hot\00got\00Scot\00stunt\00grunt\00brunt\00count\00shunt\00burnt\00quint\00glint\00flint\00faint\00event\00agent\00cent\00bent\00Kent\00brant\00giant\00adult\00fault\00Sault\00jolt\00holt\00wilt\00built\00stilt\00silt\00milt\00jilt\00gilt\00swelt\00dwelt\00melt\00belt\00malt\00exit\00twit\00davit\00suit\00tit\00grit\00omit\00limit\00flit\00befit\00audit\00tacit\00debit\00wait\00trait\00bait\00ought\00night\00fight\00yacht\00tuft\00soft\00croft\00tift\00lift\00shift\00left\00kraft\00craft\00wet\00upset\00onset\00beset\00ret\00net\00filet\00objet\00Viet\00get\00meet\00sleet\00fleet\00skeet\00beet\00facet\00tibet\00abet\00duct\00evict\00edict\00sect\00elect\00eject\00exact\00bract\00pact\00Oct\00doubt\00gloat\00boat\00mat\00flat\00blat\00that\00cleat\00cheat\00beat\00ducat\00scat\00rabat\00St\00can't\00fetus\00Cetus\00latus\00torus\00opus\00pious\00bonus\00minus\00Linus\00genus\00Venus\00plus\00thus\00Angus\00deus\00Claus\00Sus\00Watts\00Acts\00Yeats\00Keats\00gross\00dross\00moss\00Foss\00swiss\00piss\00amiss\00bliss\00kiss\00Zeiss\00guess\00tress\00press\00dress\00jess\00Tess\00brass\00Myers\00Ayers\00Mars\00Lars\00Mrs\00corps\00Eros\00Janos\00Enos\00Amos\00ethos\00cos\00Laos\00lens\00Evans\00Mans\00Hans\00Mills\00Parks\00Hicks\00axis\00Mavis\00Luis\00oasis\00Boris\00Chris\00Paris\00polis\00Ellis\00Allis\00his\00elves\00Yves\00Yates\00Bates\00Jeres\00Lares\00James\00gules\00Aries\00Andes\00Hades\00Woods\00Texas\00was\00Jonas\00atlas\00gas\00Lucas\00abbas\00y's\00x's\00v's\00t's\00s's\00r's\00p's\00n's\00m's\00l's\00e's\00a's\00satyr\00spur\00pour\00demur\00blur\00augur\00fur\00incur\00gaur\00Burr\00torr\00err\00razor\00Astor\00motor\00Bator\00visor\00door\00minor\00prior\00Tudor\00Muir\00sir\00tapir\00choir\00whir\00stair\00chair\00Mohr\00Dwyer\00buyer\00Moyer\00Meyer\00dyer\00Mayer\00tower\00over\00river\00ester\00enter\00alter\00water\00rater\00mater\00hater\00eater\00cater\00Moser\00upper\00caper\00Wyner\00Elmer\00Khmer\00osier\00drier\00Wier\00Niger\00eager\00infer\00wafer\00veer\00steer\00sneer\00sheer\00cheer\00alder\00ember\00amber\00weber\00Faber\00o'er\00dewar\00Qatar\00soar\00roar\00lunar\00mar\00molar\00friar\00briar\00liar\00char\00gar\00year\00swear\00spear\00near\00hear\00cedar\00radar\00vicar\00Dar\00Dr\00gyp\00layup\00mixup\00setup\00sup\00syrup\00coup\00cup\00cusp\00crisp\00lisp\00grasp\00gasp\00usurp\00slurp\00warp\00Karp\00wop\00stop\00pop\00troop\00poop\00snoop\00whoop\00whop\00fop\00crump\00plump\00clump\00jump\00chump\00dump\00bump\00romp\00clomp\00chomp\00crimp\00skimp\00hemp\00Kemp\00stamp\00tramp\00lamp\00champ\00gulp\00scalp\00zip\00yip\00strip\00drip\00snip\00chip\00pep\00julep\00peep\00sleep\00jeep\00beep\00swap\00tap\00strap\00soap\00nap\00map\00slap\00gap\00cap\00mezzo\00Muzo\00Mayo\00two\00servo\00bravo\00quo\00motto\00gusto\00Porto\00pinto\00Vito\00Plato\00Ito\00Russo\00torso\00ipso\00also\00Paso\00gyro\00metro\00Spiro\00Cairo\00fro\00Nero\00macro\00faro\00capo\00zoo\00igloo\00shoo\00wino\00rhino\00Gino\00guano\00piano\00homo\00Alamo\00Ramo\00polo\00nolo\00Menlo\00Pablo\00Nikko\00gecko\00banjo\00Mario\00Clio\00radio\00Rio\00macho\00Idaho\00pogo\00gogo\00Togo\00Congo\00lingo\00tango\00amigo\00Diego\00rodeo\00Leo\00judo\00hondo\00credo\00Prado\00Amoco\00coco\00junco\00Draco\00gumbo\00cacao\00Sao\00Mao\00Jo\00Gwyn\00Allyn\00town\00grown\00frown\00drown\00blown\00sewn\00spawn\00run\00pun\00gun\00fun\00Braun\00faun\00Hun\00turn\00bourn\00morn\00horn\00acorn\00stern\00yarn\00learn\00darn\00barn\00Lyon\00axon\00muon\00Upton\00Elton\00Alton\00Seton\00Olson\00Jason\00apron\00boron\00baron\00soon\00noon\00loon\00coon\00boon\00xenon\00tenon\00canon\00Timon\00Simon\00Damon\00Solon\00Orion\00union\00phon\00Creon\00neon\00icon\00bon\00Flynn\00Lynn\00Blinn\00toxin\00win\00Ervin\00Kevin\00todd austin\00Latin\00Turin\00Marin\00Orin\00loin\00join\00coin\00kin\00thin\00shin\00begin\00elfin\00vein\00din\00robin\00vain\00main\00plain\00Kuhn\00Cohn\00Hahn\00feign\00vixen\00given\00raven\00often\00Rosen\00Loren\00ripen\00Moen\00hymen\00lumen\00Yemen\00Galen\00token\00liken\00waken\00oaken\00mien\00lien\00when\00then\00ashen\00Chen\00Hagen\00queen\00Steen\00seen\00widen\00Eden\00Aden\00Ruben\00Eben\00Haydn\00Ryan\00wan\00van\00Juan\00Moran\00Iran\00Japan\00groan\00loan\00human\00Roman\00Inman\00Amman\00reman\00beman\00Nolan\00elan\00clan\00Klan\00Hokan\00Ethan\00Dugan\00hogan\00Logan\00pagan\00wean\00clean\00jean\00ocean\00bean\00urban\00Dan\00tum\00strum\00arum\00mum\00slum\00hilum\00Blum\00opium\00chum\00ileum\00rheum\00scum\00tecum\00bum\00spasm\00chasm\00Sturm\00worm\00storm\00form\00germ\00warm\00alarm\00harm\00bosom\00from\00room\00bloom\00venom\00Grimm\00Holm\00film\00whelm\00palm\00calm\00balm\00maxim\00rim\00slim\00whim\00bedim\00aim\00totem\00them\00gem\00yam\00exam\00Assam\00scram\00loam\00Islam\00ham\00steam\00cream\00bream\00gleam\00madam\00bam\00Sam\00butyl\00sibyl\00fowl\00drawl\00crawl\00foul\00Raoul\00annul\00maul\00Paul\00purl\00burl\00twirl\00Errol\00carol\00wool\00stool\00spool\00cool\00idol\00col\00pull\00mull\00hull\00gull\00full\00dull\00scull\00troll\00poll\00loll\00doll\00twill\00quill\00trill\00drill\00shill\00chill\00dill\00well\00quell\00spell\00snell\00Nell\00stall\00small\00shall\00gall\00call\00he'll\00devil\00til\00basil\00toil\00roil\00spoil\00boil\00vigil\00Mobil\00wail\00trail\00mail\00fail\00Gail\00hazel\00vowel\00dowel\00bowel\00jewel\00hovel\00level\00gavel\00fuel\00duel\00motel\00betel\00Basel\00lapel\00Ethel\00angel\00keel\00heel\00yodel\00model\00excel\00Nobel\00Mabel\00rival\00usual\00equal\00total\00natal\00fatal\00nasal\00basal\00mural\00aural\00moral\00pupal\00sepal\00foal\00tonal\00canal\00axial\00trial\00regal\00weal\00seal\00real\00meal\00ideal\00nodal\00pedal\00vocal\00local\00focal\00decal\00hawk\00gawk\00auk\00tusk\00rusk\00musk\00risk\00whisk\00Fisk\00desk\00task\00mask\00turk\00lurk\00work\00pork\00kirk\00shirk\00perk\00clerk\00Ozark\00stark\00spark\00snark\00hark\00wok\00kapok\00crook\00spook\00hook\00book\00amok\00trunk\00drunk\00plunk\00hunk\00dunk\00bunk\00tonk\00rink\00pink\00mink\00clink\00swank\00sank\00crank\00flank\00clank\00shank\00dank\00skulk\00caulk\00folk\00Polk\00silk\00milk\00bilk\00elk\00talk\00Salk\00batik\00week\00creek\00Greek\00peek\00tuck\00truck\00puck\00pluck\00cluck\00buck\00stock\00crock\00mock\00flock\00chock\00dock\00bock\00quick\00Buick\00rick\00slick\00kick\00thick\00chick\00dick\00wreck\00peck\00Aleck\00beck\00wack\00quack\00track\00crack\00pack\00snack\00flack\00black\00hack\00aback\00flak\00tweak\00steak\00creak\00peak\00leak\00beak\00j\00Nazi\00taxi\00cacti\00bassi\00Pepsi\00petri\00tori\00sari\00Shari\00poi\00Toni\00mini\00Fermi\00Mimi\00semi\00ami\00styli\00Pauli\00Paoli\00Loki\00khaki\00viii\00sushi\00phi\00magi\00Wei\00Saudi\00Mardi\00rabbi\00Dhabi\00assai\00Thai\00huh\00south\00Ruth\00forth\00mirth\00berth\00Perth\00depth\00broth\00tooth\00moth\00sloth\00cloth\00month\00smith\00Edith\00fifth\00path\00oath\00neath\00death\008th\004th\00crush\00gush\00bush\00harsh\00posh\00slosh\00welsh\00swish\00Irish\00shish\00fish\00fresh\00mesh\00awash\00quash\00stash\00crash\00leash\00dash\00cash\00abash\00Ralph\00sinh\00tanh\00cough\00Pugh\00sigh\00thigh\00psych\00such\00couch\00hutch\00notch\00witch\00ditch\00Fitch\00vetch\00retch\00fetch\00hatch\00catch\00batch\00Bosch\00Burch\00torch\00porch\00parch\00bunch\00winch\00pinch\00finch\00cinch\00bench\00mulch\00belch\00Welch\00Erich\00which\00leech\00beech\00teach\00reach\00leach\00Bach\00wah\00Utah\00Sarah\00Noah\00mynah\00rajah\00shah\00rug\00Doug\00snug\00slug\00plug\00thug\00Aug\00burg\00erg\00tog\00frog\00smog\00slog\00flog\00jog\00bog\00swung\00stung\00sung\00rung\00slung\00clung\00hung\00tong\00along\00bong\00Wong\00Kong\00zing\00tying\00lying\00owing\00Ising\00bring\00ping\00cling\00thing\00yang\00tang\00fang\00Eng\00zig\00swig\00prig\00mig\00jig\00gig\00fig\00big\00Craig\00Gregg\00dreg\00leg\00keg\00beg\00wag\00stag\00sag\00trag\00brag\00slag\00jag\00shag\00gag\00fag\00dwarf\00wharf\00scarf\00Prof\00roof\00goof\00golf\00motif\00serif\00bluff\00chuff\00duff\00cuff\00doff\00Hoff\00Goff\00quaff\00Graff\00chaff\00gaff\00brief\00chief\00chef\00oaf\00deaf\00booze\00doze\00bonze\00seize\00graze\00craze\00amaze\00blaze\00rye\00Skye\00oxeye\00axe\00Lowe\00awe\00carve\00wove\00stove\00rove\00clove\00dove\00cove\00wolve\00solve\00valve\00salve\00olive\00alive\00hive\00dive\00waive\00naive\00breve\00neve\00suave\00save\00rave\00agave\00leave\00heave\00sue\00sprue\00pique\00blue\00hue\00argue\00vague\00queue\00byte\00flute\00cute\00butte\00Lotte\00Bette\00matte\00peste\00haste\00caste\00baste\00Porte\00quote\00dote\00Dante\00rite\00unite\00mite\00kite\00white\00cite\00bite\00Pete\00ovate\00state\00irate\00grate\00crate\00spate\00mate\00plate\00elate\00agate\00ruse\00cause\00posse\00passe\00nurse\00worse\00parse\00loose\00goose\00nose\00lose\00whose\00chose\00dose\00tense\00dense\00dulse\00else\00wise\00vise\00guise\00rise\00poise\00noise\00Boise\00Lise\00Reese\00vase\00erase\00tease\00Pease\00livre\00pure\00lure\00jure\00mitre\00murre\00yore\00sore\00spore\00Moore\00snore\00shore\00gore\00fore\00adore\00bore\00genre\00tire\00spire\00mire\00hire\00afire\00were\00Deere\00padre\00ware\00rare\00spare\00glare\00flare\00blare\00hare\00fare\00dupe\00lope\00hope\00dope\00wipe\00tripe\00gripe\00pipe\00tape\00grape\00drape\00woe\00roe\00canoe\00aloe\00Tahoe\00Zoe\00Poe\00dyne\00Wayne\00tune\00stone\00atone\00prone\00crone\00agone\00done\00Anne\00twine\00swine\00urine\00mine\00Kline\00chine\00fine\00dine\00Paine\00Irene\00gene\00Duane\00sane\00pane\00mane\00plane\00bane\00Jane\00Dane\00tome\00some\00gnome\00home\00Rome\00prime\00grime\00crime\00clime\00same\00frame\00name\00flame\00game\00dame\00Pyle\00rule\00joule\00mule\00title\00isle\00Perle\00Merle\00apple\00ample\00stole\00sole\00role\00mole\00whole\00Ecole\00tulle\00wile\00guile\00utile\00stile\00smile\00Emile\00Chile\00agile\00bile\00Nile\00ogle\00Engle\00rifle\00Adele\00addle\00ladle\00uncle\00Bible\00fable\00cable\00wale\00stale\00sale\00pale\00male\00hale\00Yale\00Dyke\00fluke\00juke\00duke\00yoke\00poke\00joke\00alike\00hike\00mary updike\00take\00sake\00brake\00make\00slake\00fake\00vie\00Artie\00curie\00genie\00Wylie\00Angie\00die\00tithe\00niche\00rouge\00luge\00huge\00gauge\00surge\00forge\00serge\00merge\00tinge\00singe\00binge\00Lange\00bulge\00beige\00judge\00wedge\00sedge\00ledge\00hedge\00usage\00image\00life\00pewee\00tree\00spree\00three\00rupee\00knee\00glee\00flee\00whee\00thee\00Agee\00fee\00bee\00Dee\00Clyde\00etude\00rude\00nude\00elude\00Verde\00Goode\00oxide\00guide\00side\00pride\00elide\00bide\00wade\00vade\00spade\00Royce\00Boyce\00dunce\00Ponce\00since\00mince\00lance\00dance\00dolce\00twice\00price\00Brice\00voice\00nice\00lice\00piece\00grace\00pace\00mace\00place\00peace\00tube\00cube\00probe\00Niobe\00tribe\00grebe\00babe\00vitae\00algae\00Rae\00De\00Floyd\00crowd\00lewd\00bawd\00stud\00sud\00aloud\00mud\00scud\00Byrd\00gourd\00Kurd\00sword\00lord\00third\00weird\00ward\00board\00lard\00shard\00beard\00card\00pod\00stood\00blood\00hood\00food\00clod\00god\00round\00hound\00bound\00Lund\00pond\00blond\00fond\00blind\00hind\00trend\00upend\00fiend\00stand\00bland\00Rand\002nd\00told\00sold\00scold\00gild\00meld\00yield\00wield\00held\00scald\00avid\00Ovid\00druid\00tid\00grid\00Cupid\00tepid\00avoid\00Enid\00solid\00valid\00skid\00rigid\00Reid\00did\00ibid\00staid\00keyed\00bayed\00fled\00bled\00tied\00shied\00shed\00weed\00steed\00greed\00freed\00speed\00need\00feed\00added\00abed\00Ned\00Budd\00Dodd\00wad\00sad\00toad\00broad\00load\00clad\00Iliad\00shad\00Chad\00fad\00stead\00tread\00dread\00bread\00plead\00cycad\00bad\00you'd\00it'd\00we'd\00I'd\00disc\00hoc\00blanc\00tic\00Doric\00cynic\00tunic\00ionic\00manic\00ethic\00logic\00Aztec\00Dec\00lilac\00tub\00shrub\00grub\00scrub\00pub\00snub\00flub\00hub\00cub\00bub\00curb\00sorb\00verb\00garb\00barb\00rob\00mob\00blob\00job\00crumb\00numb\00womb\00bomb\00Lomb\00limb\00alb\00sib\00drib\00crib\00Carib\00glib\00Habib\00web\00reb\00Loeb\00Caleb\00tab\00slab\00cab\00plaza\00Kenya\00Tanya\00Maya\00Kiowa\00Iowa\00Alva\00viva\00siva\00kiva\00Neva\00Eva\00septa\00junta\00Santa\00Volta\00delta\00theta\00dicta\00rata\00versa\00balsa\00Myra\00Lyra\00Lura\00ultra\00supra\00copra\00amra\00Mira\00infra\00opera\00hydra\00Accra\00cobra\00umbra\00sabra\00Clara\00spa\00tappa\00papa\00Samoa\00whoa\00Alcoa\00tuna\00Ilona\00Leona\00manna\00magna\00hyena\00Rena\00Lena\00puma\00Burma\00Irma\00aroma\00lemma\00Gemma\00mamma\00gamma\00Wilma\00halma\00dogma\00sigma\00drama\00phyla\00Carla\00villa\00Vella\00Della\00Ella\00mila\00Leila\00Bela\00koala\00Kafka\00via\00Syria\00maria\00mania\00alia\00Lydia\00podia\00India\00media\00aloha\00yoga\00Korea\00flea\00Thea\00Shea\00Rhea\00Rhoda\00coda\00Vida\00Aida\00Veda\00Ada\00Inca\00Spica\00mica\00NY\00TRW\00LTV\00CRT\00TNT\00GMT\00EDT\00NTIS\00USGS\00PBS\00CBS\00IR\00NCR\00GNP\00NAACP\00NATO\00GPO\00FM\00SCM\00JACM\00IBM\00SIAM\00TTL\00BSTJ\00NJ\00FBI\00IEEE\00PhD\00SD\00R&D\00PVC\00SC\00FPC\00NBC\00GSA\00CPA\00DNA\00USIA\00CIA\00YWCA\00ABA\00") + (data $.data (i32.const 12576) "\93\16\00\003\08\00\00\ad(\00\00\00\00\00\00\cf+\00\00\b2\1f\00\00\ae\1f\00\00k0\00\00\121\00\00\5c\1e\00\00' \00\00\06\10\00\00\de\07\00\00\b2,\00\00\94\0d\00\00N\0b\00\00w\0a\00\00\f1.\00\00\bc0\00\00\9e\15\00\00\85\0e\00\00Y0\00\00\98\0b\00\00\ac,\00\006(\00\000(\00\00\b3\17\00\00\04\09\00\00\d0%\00\00>\0c\00\00\10\09\00\00\f6%\00\005\0d\00\00\cd$\00\00\da#\00\00\c2)\00\00\1d\0c\00\00\0f(\00\00\c0\09\00\00\bd&\00\00\0a\06\00\00O0\00\00T\19\00\00+\0a\00\00\8c\05\00\00P\09\00\00g\14\00\00\ee\18\00\00\f7-\00\00)/\00\00\ae\11\00\00\1e\1e\00\00`\0b\00\00\d4*\00\00\fd/\00\00\a2(\00\00\a3#\00\00\c8\08\00\00\ce\07\00\00\95\0f\00\00{\09\00\00\be\06\00\00<\15\00\00\82&\00\00\1a0\00\00\c4!\00\00\00+\00\00\fd\13\00\00\1a\11\00\00\da\15\00\00\5c.\00\007#\00\00\ba\11\00\00\da\1e\00\00\dc\14\00\00\b7\0e\00\00\09\18\00\00\09\15\00\00\e7\1c\00\00&\0f\00\00\b9'\00\00\d5.\00\00\8d\06\00\00\d4\0f\00\00g\1b\00\00\f5(\00\00\91\05\00\00j\0e\00\00\c8&\00\00+\09\00\00\fc\05\00\00\d9\19\00\00i$\00\00e\06\00\00&\09\00\00\b3'\00\00\f2\15\00\00\9a\0b\00\00\bf \00\00\05$\00\00\ce\0f\00\00\f5\18\00\00i\06\00\00l/\00\00\ad\08\00\00b\09\00\00\dd(\00\00\bb\04\00\00\83\18\00\008\10\00\00) \00\00\86\17\00\00V\07\00\00\ca\09\00\00+\1f\00\00p\19\00\00\80\10\00\00\cf$\00\00\f6\0f\00\00\ab&\00\00\ce\0c\00\00k!\00\00W\10\00\00N\1c\00\00\cb\1b\00\00\04,\00\00),\00\00Y\09\00\00\ff\1f\00\00[#\00\00f\15\00\00@\05\00\00R#\00\00\f4\1b\00\00a\0f\00\00\c4\15\00\00\fc\0e\00\00o-\00\008.\00\00\c9*\00\00$!\00\00\1a-\00\00\eb\0c\00\00(\08\00\005\19\00\00\ae.\00\00\a9\19\00\00q\18\00\00&'\00\00\94\14\00\00\c2-\00\00\ba\15\00\00\fe\15\00\00\bf\1b\00\00U\1b\00\00\ce\1a\00\00\9a\1e\00\00Q$\00\00\a0 \00\00\b0\0f\00\00\82\1d\00\00\8c\10\00\00\f2*\00\00\e7\08\00\00e,\00\00%\0a\00\00\cb*\00\00\83\1e\00\00j\18\00\00L+\00\00\00\0e\00\00$\1e\00\00\1b\07\00\00\b3,\00\00N\19\00\00\cb)\00\00\0c!\00\00s\13\00\00\83\0d\00\00\c8\0c\00\00[\22\00\00\d3\16\00\00W)\00\00\d6/\00\00\ee \00\00\90\0c\00\00\15\18\00\00\e2 \00\00T\06\00\00(\0c\00\00\12\04\00\00Q\1f\00\00I\0d\00\00\95\0d\00\00O\1b\00\003$\00\00L\04\00\00H(\00\00\18*\00\00>\22\00\00\15(\00\00o\1d\00\00E)\00\00\dc\0c\00\00\8e$\00\00Q\1e\00\00;-\00\00\c4+\00\00)&\00\00\ea\0d\00\00=#\00\00p,\00\00\14\0b\00\00\a1+\00\00w\16\00\00\bd\0e\00\00\06\04\00\00\cf-\00\00\96+\00\00a+\00\00\09\19\00\00\c3\0b\00\00Y\15\00\00\fc#\00\00\be\22\00\00\97\18\00\00R\10\00\00;+\00\00\dc\0d\00\00\e1\1d\00\00\94!\00\00a\07\00\00\e4\1a\00\00[%\00\00\e8-\00\00h\16\00\00\ca!\00\00B\0e\00\00\1f#\00\00z\08\00\00\e2\1c\00\00\e5\06\00\00\18\16\00\00\14#\00\00\d6%\00\00w\0f\00\00\f8\15\00\00\a6 \00\00\f9\18\00\00\86+\00\00\8e\15\00\00!\1b\00\00\13\06\00\003*\00\00\c1\0d\00\00W\08\00\00q\22\00\00\c3(\00\002\0c\00\00\f0\0e\00\00z\15\00\00\bb\13\00\00\08-\00\00\97\19\00\00\bf#\00\00\b5\09\00\00\fd\11\00\00o*\00\00\fa\22\00\00\f6!\00\00Z\06\00\00\d2,\00\00c\1f\00\00\e7\0b\00\00\cd0\00\00\aa-\00\00\ba\1d\00\00\bb,\00\00Q\08\00\00\ec\1d\00\00_\0c\00\00Q)\00\00\09\07\00\00\be\18\00\00\ee\12\00\00\c4 \00\00\17\08\00\00\08\1d\00\00\ac \00\00o!\00\00\ee\19\00\00a/\00\00\f9\0b\00\00l\10\00\00E\05\00\00\c1\1f\00\00O\07\00\00\b5\0a\00\00\fa\04\00\00'$\00\00\b1\19\00\00\e0\10\00\00\9b\08\00\00\f0\09\00\00\0f+\00\00\17$\00\006.\00\00T(\00\00&\15\00\00\94\1e\00\00\18\14\00\00'.\00\00\b9\1a\00\000\19\00\00\ee\1b\00\00|&\00\00)\16\00\00\19\0e\00\00\9d\13\00\00P\11\00\002\14\00\00R+\00\00\b6\07\00\00\09.\00\00\ae/\00\00\ff\19\00\00_#\00\00\22 \00\00K$\00\00\9a \00\00>\11\00\00U\1d\00\00\d8$\00\00\960\00\00,\12\00\00#\0c\00\00%\0e\00\00\ed,\00\00\ef\22\00\00\cf\10\00\00+\13\00\00\08\12\00\00\c8\18\00\00\04\0a\00\00\fa\0d\00\00\a8\11\00\00\06#\00\00\8c\17\00\00\d0\09\00\00\08\1e\00\00\00#\00\00\09(\00\00{\1a\00\00\ea&\00\00T\13\00\00\d6\1d\00\00\be\10\00\00\fe\12\00\00\18%\00\00}\0f\00\00\c4\22\00\00\a2\18\00\00\e3\12\00\00\091\00\00\dc \00\00\89$\00\00\d1\04\00\00\dd,\00\00&\18\00\00>\1d\00\00\09/\00\00u\0e\00\00\f6\09\00\00Y\18\00\00\f4\0d\00\00\a4\1c\00\00a'\00\00\01\22\00\00!\1d\00\00\a0\14\00\00q+\00\00\f8\12\00\00z\1f\00\00u#\00\00\b4\1d\00\00\d8\12\00\00\b4!\00\00\d3)\00\00\f7.\00\00\0f\15\00\00E0\00\00\12\08\00\00\03\17\00\00\c0\16\00\00 \1a\00\00\80\08\00\00\bc\07\00\00\ca\14\00\001\06\00\00\16\1a\00\00\13\16\00\00\cf.\00\00\df\05\00\00\b0\07\00\00\9f\15\00\00\10\0f\00\001\0f\00\00#\05\00\00^ \00\00= \00\00\ed\0b\00\00e\12\00\00\80#\00\00:\05\00\00\0f\06\00\00\fc0\00\00:\1e\00\003\0d\00\00B\22\00\002\1d\00\00\11 \00\00\b0$\00\00\c8\19\00\001#\00\00s\1e\00\00\91\19\00\00\fd\14\00\00\8d\1d\00\00X\16\00\00\86\0b\00\00\0e\0b\00\00\b0\09\00\00\04.\00\00['\00\00\04\13\00\00s\12\00\00\c5\1d\00\00\12\0d\00\00\b7&\00\00\d1\1c\00\00\e7*\00\00x0\00\00\d8-\00\00\cc\12\00\00\b6\1f\00\00\f4\08\00\00\a6-\00\00\ac*\00\00\cf\22\00\00j\12\00\00\1d,\00\00c\10\00\00\ae-\00\00\e3(\00\00n\12\00\00\22$\00\00\14-\00\00K-\00\000-\00\00\9f\07\00\00\8b\05\00\00.\05\00\00\bd\06\00\00\82'\00\00;\16\00\00u\18\00\00W*\00\000'\00\00J\1d\00\00h$\00\00>\12\00\00\b5\15\00\00l\0b\00\00\1d \00\00\a4\0c\00\00\e3\08\00\00\de*\00\00\0f#\00\00\1b\1c\00\00\a8\1f\00\00\da\0c\00\00u-\00\00>\1c\00\00\cf)\00\00\01&\00\00\82\07\00\00\cb\04\00\00\c0/\00\00\91.\00\00L\10\00\00\b4\17\00\00N\06\00\00)%\00\00`\06\00\00]\1f\00\00q\1c\00\00p\0e\00\00\c4\1a\00\00\d1\11\00\00%\1f\00\00\b6\05\00\00\0e\1e\00\00\9d.\00\00P,\00\00\fb(\00\00\e2\14\00\00\e2\04\00\00\81\1a\00\00\e4\16\00\00\f5&\00\00\b4\04\00\002-\00\00v \00\00\ae#\00\00\001\00\00\dc\1d\00\00\c0,\00\00\d4\22\00\00\96/\00\00]*\00\00X\1a\00\00\9f\06\00\00\c3&\00\00\98\10\00\00H&\00\00E-\00\00\1e%\00\00c$\00\00\d0\0d\00\00R!\00\00{#\00\00\1b\1b\00\00\1a#\00\00B\12\00\00\1a\15\00\00\a2/\00\00n&\00\00\c2\19\00\00\02-\00\00N\22\00\00\e0\0e\00\00\ab\09\00\00\ff-\00\00n\11\00\00o\1a\00\00J\13\00\00\9c\0e\00\00S\15\00\00\0e,\00\00\f2\1c\00\00\ad\05\00\00;\0a\00\00\0b'\00\00\05\0e\00\00\99\0d\00\00D\1b\00\00\ca\22\00\00\8e\07\00\00<\18\00\00\8e(\00\00=\1a\00\00/%\00\00\91\06\00\00\e9\12\00\00\ea\05\00\009*\00\00\03\1d\00\009&\00\00\d9\06\00\00\8c\22\00\00\85\0c\00\00\da\10\00\00\f2\10\00\00~(\00\00\95&\00\00\1f!\00\00\7f\11\00\00(\12\00\00\b0\15\00\00~%\00\00\01\0e\00\008\11\00\00\be\17\00\00\da'\00\00\ae\17\00\00v)\00\00x\07\00\00\a4\0d\00\00\8c\1f\00\00\840\00\00s\1b\00\00)\0d\00\00J\22\00\00q\0b\00\00\b5\0d\00\00\92\1b\00\00!\18\00\00\c7$\00\00\af\0d\00\00\d9\16\00\00\12*\00\00t\1d\00\00\c6/\00\00\8f\0f\00\00\5c\11\00\005%\00\00\d4\15\00\00\e9)\00\00\9f\0f\00\00\b4\11\00\00\03(\00\00z\05\00\00\1c\22\00\00$(\00\00/,\00\00!\0f\00\00\14\11\00\00\f0\05\00\002\04\00\00\a1\1b\00\00q%\00\00\03&\00\00t!\00\00\fa \00\00\e2\0a\00\00\16\0f\00\00v\10\00\00\f9\19\00\00\87\16\00\004\10\00\00\a7\08\00\00\0e\11\00\006\18\00\00a\1b\00\00c-\00\00+\0f\00\00\d9)\00\00u.\00\00?\0f\00\00\17\0c\00\00\9e\0d\00\00\bb\0d\00\00k\19\00\00\83\1b\00\00\9a\0c\00\00N#\00\00\12#\00\00\c6\11\00\00N(\00\00\88\0d\00\00\f2,\00\00\a7\05\00\00\88\22\00\00\05\1b\00\00\11\0c\00\00\85\05\00\00\d4(\00\00\17\22\00\004&\00\00-\14\00\00\b3\1b\00\00\84\04\00\00D\0c\00\00\80\15\00\00\ba\0a\00\00\dd\08\00\00\d50\00\00\c7)\00\00\a7,\00\00\0d\17\00\00\0a\09\00\00\ca\1e\00\00b\05\00\00\1a\0b\00\00\8e \00\00\1f\0e\00\00\d5\09\00\00\b8+\00\00\a1\05\00\00\92\1f\00\00:\22\00\00\fc\0c\00\00W\0d\00\00 \19\00\00\d6 \00\00\f0&\00\00B\06\00\00\f7%\00\00\c6\0a\00\00\ef\1f\00\00l\1c\00\00\f4\0a\00\00| \00\00K\1e\00\00b\1e\00\00'\07\00\00w'\00\008\1d\00\00#&\00\00\e5\0d\00\00E\09\00\00+0\00\00k,\00\00\b3)\00\00w\0d\00\00\0b\0c\00\00\c3\0c\00\00\d0\1d\00\00\8b!\00\00\86\09\00\00\e1*\00\00\9d-\00\00\83(\00\00\1c$\00\00l\16\00\00\b40\00\00\e3\1b\00\008\1c\00\00\c8\07\00\00[\1d\00\00\9c+\00\00l+\00\00\ac\0b\00\00\c8\12\00\00\cb%\00\00')\00\00\df\18\00\00I\0b\00\00E\1f\00\00\ae\04\00\00\a7\0e\00\00\ce\19\00\00\bd\19\00\00\f00\00\00l'\00\00\17\04\00\00C\0a\00\00\b8\08\00\00\96,\00\00\f4\1f\00\00\f7\11\00\00\1e\14\00\00|!\00\00\ff\18\00\00\cc\0a\00\00M\15\00\00\97\05\00\00?\1b\00\008\1a\00\00v\15\00\00]\10\00\00J\05\00\00\05\05\00\00\8a\22\00\00\f5\22\00\00\84\22\00\00\0a\1b\00\00T\17\00\00\b4\1a\00\00}'\00\00\84/\00\00\99\13\00\00\0d\12\00\00\bd-\00\00\fc\0f\00\00\84\12\00\00\ce$\00\00\1b)\00\00g\10\00\009\1b\00\00I\1c\00\00\d9\08\00\00\8e\14\00\00i\1b\00\00c\19\00\00x/\00\00\06'\00\00\e9(\00\00\db%\00\00T\0e\00\00\e4\18\00\00h\05\00\00h\0d\00\008\0c\00\00\98\08\00\006\22\00\00\e3+\00\00z\0c\00\00\d5\16\00\00Q\14\00\00\19\17\00\00\1d&\00\00\9d\19\00\00\ae)\00\00\0f.\00\00\05\0c\00\00\d6\0d\00\00\81\09\00\00n\0a\00\00\800\00\00\eb\09\00\00?'\00\00\a10\00\00v+\00\00\de\22\00\00\c0\14\00\00\ad\22\00\00\f5)\00\00\a8\22\00\00\02%\00\00\c6%\00\00\80\05\00\00\d2\0b\00\00\14+\00\00\b00\00\00\8b*\00\00\e9\22\00\00h&\00\00~\12\00\00\aa$\00\00Q\04\00\00+#\00\00\c3*\00\00\90,\00\00\93\1d\00\00H\22\00\00\a6\09\00\00\18,\00\00U'\00\00\15\19\00\00X&\00\00\b3\0c\00\00\ec\17\00\00\96\0e\00\00\5c\0a\00\00h\09\00\00G\15\00\00\89-\00\00\e1\0b\00\00\f80\00\00V\14\00\00\ce\0e\00\00\01*\00\00\eb'\00\00D%\00\00\c8\0f\00\003\1a\00\001\13\00\00 \15\00\00r\15\00\00\fd\06\00\00\1a\0a\00\00\bc\1f\00\00\b0\0a\00\00\cb\13\00\00b\04\00\007\15\00\00E\12\00\00\07\14\00\00\14.\00\00W\1e\00\00\ee,\00\00\da\0f\00\00\91\17\00\00\08\17\00\000\0a\00\00t(\00\00\90/\00\00\87\19\00\00\c2\07\00\00J\0f\00\00G+\00\00/&\00\00\c2\1c\00\00\f4\18\00\00\c6\1f\00\00E$\00\00\a2\04\00\00\94 \00\002\11\00\00D\1c\00\00\c3\17\00\00\0f\1b\00\00\08)\00\00\d3\06\00\00'\12\00\00f\0b\00\00\e6#\00\00\5c\04\00\00u)\00\00r\1b\00\00\dc\04\00\00\0c\04\00\00\f9+\00\00\be\1a\00\00\10\13\00\00\00\04\00\00\d1\09\00\00=\09\00\00\07\1f\00\00\09\1e\00\00[\0f\00\00\a8(\00\00\91\18\00\00\a7+\00\00U\13\00\00\cd\05\00\00\f1%\00\00\9b\0f\00\00\a9#\00\00\92\08\00\007-\00\00\d9\22\00\00B\18\00\000\18\00\00\d5'\00\00\1b\19\00\00U\0c\00\00E'\00\00b\14\00\00\f7\14\00\00g+\00\00\dd\1c\00\00\be\12\00\00\a7\0b\00\00C&\00\00\99\15\00\00\19%\00\00\ce\0b\00\00\80+\00\00-\1b\00\00\8b\09\00\00\e4\07\00\00\a2-\00\00\86\08\00\00\01$\00\00\c5\22\00\00\16)\00\006\1f\00\00.\1a\00\00\f7\17\00\00\85\15\00\00\ba!\00\00\fe\1c\00\00?\0b\00\00\a8\04\00\00d \00\00\eb.\00\00L/\00\00B\17\00\004\1f\00\00T,\00\00\c00\00\00c\16\00\00.-\00\00\b5\14\00\00\1a\1c\00\00\c8\0b\00\00\1b\1a\00\00\d90\00\00\94\07\00\00;\14\00\00\fc\1e\00\00\a7\18\00\00\e2,\00\00\82\1a\00\004/\00\00\81)\00\00\fb\16\00\00\8c\0b\00\00]0\00\00a\10\00\00\0e0\00\00Z\0b\00\00\85\11\00\00\df.\00\00\03\18\00\00y\16\00\00K\0a\00\00W-\00\00W.\00\00\f8\13\00\00\9a0\00\00\e1\17\00\00\a4$\00\00\00'\00\00\e3\1f\00\00g/\00\00\9c\0f\00\00\f0!\00\00\81\19\00\00\a2'\00\00\cd\06\00\00$-\00\00\e8\13\00\00\0d\0a\00\00C\04\00\00\88\1e\00\00\bb0\00\00{\22\00\00\c2\0f\00\00+'\00\00\1b\0f\00\00\e6\17\00\00\ec\15\00\00\fb\09\00\00_\18\00\00n\13\00\00\b6\0f\00\00\df\06\00\00\e6\0e\00\00_\0d\00\00'\1b\00\002\22\00\00u\0c\00\004\15\00\00\d4-\00\00\90!\00\00\bb\16\00\00\9d(\00\00P\0c\00\00\f0\0f\00\00\91'\00\00\a5\0a\00\00\06\06\00\00\d6\17\00\00])\00\00\f2\14\00\00\fb\07\00\006\0a\00\00\89(\00\00]\13\00\00\de\12\00\00\14\15\00\00\f7\06\00\00\7f.\00\00\93%\00\00s\0a\00\00\e1/\00\00\cb\1c\00\00\9a\12\00\00C\07\00\00\eb\08\00\00\90\0e\00\00m\1b\00\00W\22\00\00\b1\06\00\00\15\13\00\00-\0c\00\00@.\00\00\5c\05\00\00\8d\16\00\00_,\00\00\f5\1e\00\00b\11\00\00\fd\1d\00\00\10\0a\00\00\c5\16\00\00Q.\00\00\94\1c\00\00\c3\0e\00\00~$\00\00k.\00\00+\18\00\00\e4&\00\00\a9)\00\00\82\0a\00\00\ff\08\00\00\db/\00\00\d4!\00\00%0\00\00-\0d\00\00|\0a\00\00\fe\16\00\00\1a+\00\00{-\00\00R\1e\00\00\de,\00\00<(\00\00w\22\00\00\f9\16\00\00\d6\04\00\00\83\19\00\00x'\00\00&\13\00\00Q*\00\00!'\00\00K)\00\005\0f\00\00[\1b\00\00A+\00\00\bc\0f\00\00\07\0f\00\004\0b\00\00\c8$\00\00\9f\16\00\00+\0e\00\00\f7\09\00\00\d0\08\00\00I\12\00\00-\04\00\00\1e!\00\00\a5\07\00\00~\1e\00\00\92\0b\00\00\af\15\00\00\17 \00\00\e0#\00\00o)\00\00\06!\00\00(\0d\00\00S\22\00\00r\07\00\00\d0/\00\00r/\00\00W/\00\00:\0f\00\00\ee\14\00\00:/\00\00\15\0b\00\003\1b\00\00G\04\00\00\ed*\00\00\03\12\00\00\80*\00\00\f8\1d\00\00\f1(\00\00w\17\00\00\87)\00\00\1d\0d\00\00`\17\00\00y-\00\00\ab\06\00\00\c3\06\00\00\f2-\00\00\bd\0c\00\00\e5&\00\00\d0\14\00\00\22\1d\00\00N\0e\00\00a%\00\00y\12\00\00\a4#\00\00\83%\00\00\d8,\00\00|\19\00\00\f2\17\00\00\d0-\00\00\8c\08\00\002\1c\00\00\d1\1d\00\00\22.\00\00H\18\00\00i-\00\00\b6\16\00\00\f0\1e\00\00S\1a\00\00\ed-\00\00\c5!\00\00\0e\16\00\00\fc$\00\00\a2\0b\00\00>&\00\00%+\00\001\17\00\00\0d%\00\00\0b\05\00\00-$\00\00\01+\00\00\f4\04\00\00\87\09\00\00V#\00\00\02\06\00\000\10\00\00t0\00\00\00\10\00\00\15\07\00\00\11)\00\00l\0f\00\00H\17\00\00\e4\05\00\00\e7\11\00\00\8c+\00\00\be.\00\00\8e%\00\00\85\1c\00\00\90\04\00\00\020\00\00\e4!\00\00r\16\00\00\bf\15\00\00\b9.\00\00\af\19\00\00\8f\1b\00\00\96*\00\00\af\14\00\00'\14\00\00\a3\19\00\00\0a\1f\00\00F/\00\00\00\1b\00\00\f3\16\00\00\c9(\00\00\ce\08\00\00o(\00\00\a9\1a\00\00\95\0c\00\00~/\00\00\1b'\00\00\f7/\00\00]-\00\00@/\00\00E\0f\00\000\15\00\00\90\13\00\00\ed\11\00\00\19\1f\00\00\f1/\00\00\ab\16\00\00\9a\14\00\00\02\0f\00\00\bc\05\00\00{\1c\00\00/\0b\00\00\e1\0d\00\00\bc$\00\00,\11\00\009$\00\00\df\19\00\00f\0f\00\00:\19\00\00L.\00\00\f7\10\00\00\ac\13\00\00\99\0a\00\008#\00\00\84'\00\00\15\1c\00\00\e8\04\00\00\140\00\00l\0d\00\00\e8+\00\00\8b\0c\00\00P\17\00\00|\14\00\003)\00\00\ad'\00\00V\05\00\00\fa\1f\00\00\17\05\00\00\0c\14\00\00\c6\09\00\00\ec\10\00\00\a1\13\00\00h0\00\00\1f\0b\00\00r\17\00\00.\22\00\00\cb/\00\00j\1d\00\00O\0f\00\00p\0c\00\00\d0\1e\00\00K*\00\00\df&\00\00\c5\1e\00\00\1c\1d\00\00\9d\10\00\00\b7\0b\00\00H\0e\00\00\da.\00\00\ec%\00\00K\1f\00\00\11\05\00\00\96\04\00\00y$\00\00\98%\00\00O\12\00\00\cb-\00\00\ef\1a\00\00\cb\1d\00\00}\1b\00\00=\17\00\00\d5\10\00\00\ee\0a\00\00\f1\11\00\00\cf'\00\00\80\1f\00\00\0c\08\00\00\b4%\00\00\d1\1b\00\00\db\17\00\00\94\15\00\00D\11\00\00\a2\0e\00\00\dd\0a\00\00I\1b\00\00o\1f\00\00\b2\22\00\00\86\10\00\00\c5\13\00\00\ee\04\00\00\e6\10\00\00\0c\0f\00\00,\10\00\00\06+\00\00f\07\00\00\af\10\00\00\e8 \00\00\97'\00\00)\1a\00\00\88\18\00\00t\06\00\00\c9\15\00\00\c5\1b\00\00\9e%\00\00I\07\00\00\5c\1c\00\00\ab\0a\00\00\a7\13\00\00\8e\06\00\00\f6\0e\00\00=!\00\00\b4.\00\00\a50\00\00}\07\00\00\b9#\00\00r'\00\00c\08\00\00\8c\13\00\00\b1\05\00\00\b9\1b\00\00\ad\1b\00\00\ab0\00\00W\04\00\00\8a\1e\00\00\f40\00\00\9d0\00\002'\00\00\22\12\00\00\a2\1f\00\00\b7,\00\00\a2,\00\00K\08\00\00\1f\0a\00\00\9d\1a\00\00^\16\00\00\22\14\00\00S\0d\00\00p.\00\00\c5#\00\00\c2\09\00\00{*\00\00\05)\00\00y\11\00\00\f6\0c\00\00\88\14\00\00\1a(\00\00\b7*\00\00x\04\00\00\d20\00\00_\14\00\008!\00\00\89\1b\00\00 \1c\00\00U%\00\00\1b\18\00\00w\14\00\00\09\16\00\00\9f\10\00\00\08%\00\00j \00\00\09\0a\00\00r\09\00\00(\10\00\00\880\00\00\e4)\00\00\de-\00\00\ea$\00\00m0\00\00\0b#\00\00l\17\00\00\e3\11\00\00q\0f\00\00\9d\1f\00\00\d9\07\00\00]\0d\00\00d\18\00\00\cc\0d\00\00\f7)\00\00\cc\11\00\00\df\22\00\00%\17\00\00\1f(\00\00\d4\08\00\00\df+\00\00#\08\00\00\9d#\00\00\e6\15\00\00\b8\0c\00\00@*\00\00\9a\06\00\00C\0d\00\00C\0e\00\00\ef\08\00\00\15#\00\00\e5.\00\00\9c\18\00\00w\0b\00\007\0e\00\00\b4-\00\00\b1\16\00\00G\16\00\00h\11\00\00\f0\0c\00\00H\10\00\00j\0a\00\00\98$\00\00\03\11\00\00\09,\00\00\ea!\00\00\01\09\00\00L#\00\00\fb)\00\00\aa\1c\00\00\9f\13\00\00\82\14\00\00\91*\00\00@\1e\00\00\c7\0d\00\00\07&\00\00N\18\00\00\fa&\00\00j(\00\00+\19\00\00\16'\00\00(\05\00\00\ea\1e\00\00\19/\00\00\e5\09\00\00\d9\05\00\00\be \00\00\18&\00\00\83\0f\00\00\b7\1c\00\00U\0f\00\00\f6$\00\00\02\14\00\00\e4$\00\00*\0b\00\00\98\1f\00\00\ff\04\00\00\e4\19\00\00\e4\1e\00\00A\09\00\00\920\00\00\a1*\00\00y\1e\00\00}%\00\00\19\1e\00\00&\1c\00\00\a5)\00\00\99\1d\00\00c\13\00\009\17\00\00H\06\00\00Y\13\00\00\a0\1e\00\00'\04\00\00\9f\1c\00\00\a7'\00\00W\1f\00\00?$\00\00\93$\00\00\a6\1e\00\00~\04\00\00\8c)\00\00\de0\00\00\06\1f\00\00S\16\00\00+\06\00\00\a8/\00\00\5c\14\00\00\85*\00\00\bd\0b\00\00\d0 \00\00\fc!\00\00\17\1d\00\00\d7\13\00\00<\0e\00\00^&\00\00\f6#\00\00\b2\0e\00\00=\07\00\00\c6\04\00\008\04\00\00\9b*\00\00\f8\16\00\00 '\00\00\c1$\00\00\e2\13\00\00\c3\08\00\00:.\00\00\0e-\00\00\ae\1d\00\00a!\00\00\d2\12\00\00\f8\1c\00\00`\0e\00\00W+\00\00\080\00\00\91&\00\004\05\00\00\bb\14\00\00\bc\1e\00\00O%\00\00\98(\00\00\89\0f\00\00`\1d\00\00N\1a\00\00r\14\00\00?*\00\00\91+\00\00\11\1a\00\00\b2\12\00\00\a8\12\00\00\b8 \00\00\8f\1c\00\00W$\00\00\d1\13\00\00\cc\1f\00\00\de$\00\00\d2\0a\00\00G\10\00\00m\09\00\00\03\15\00\00\93\0a\00\00\b3\08\00\00\da\0e\00\00\ab\07\00\00i*\00\00\0c*\00\00)\22\00\00O'\00\00\a3\10\00\00\b1*\00\00\9e\22\00\00\b1&\00\00$\10\00\00S \00\00\94-\00\00\a9\1d\00\00\88\07\00\00C \00\00$\1a\00\00\5c/\00\00n\15\00\00\f1\06\00\00!\06\00\00\d7\1b\00\00\c7\05\00\00\89%\00\00\e9\19\00\008\0e\00\00\e90\00\00\87'\00\00 \09\00\00\d7\11\00\00.\1e\00\00\e3\22\00\00\05 \00\00\97\17\00\00\8b\1a\00\00\9b\05\00\00\11$\00\00\e6\1d\00\00c\1a\00\00\ff\0b\00\00T\0b\00\00\c1\13\00\00]$\00\00\10\0e\00\00\1f\1f\00\002\12\00\00\a5\14\00\00\16\09\00\00\da*\00\00r\22\00\00\fb\1a\00\00C!\00\00- \00\00m\14\00\00\e2\17\00\00\ca+\00\00\1d\08\00\00\d3\19\00\00o&\00\00\12&\00\00\7f\12\00\00\a3.\00\00&\11\00\00\d5#\00\00\1f\17\00\00z\10\00\00\e50\00\00\18!\00\00]\08\00\00\10\1c\00\00\1e.\00\00\14\1e\00\00E\08\00\00\94\1d\00\00f%\00\00\00\1c\00\00K,\00\00J\09\00\00\0f\18\00\00R/\00\00\ad+\00\00O\0d\00\00\88 \00\00:0\00\00\ad\18\00\00K\14\00\00?0\00\00\0b.\00\00p*\00\00\f2\1d\00\00\19,\00\00*(\00\00*\22\00\00E,\00\00p\1a\00\00@\19\00\00\80\06\00\00\12\1d\00\00\ab\14\00\00K\13\00\007\17\00\00J%\00\00a\1c\00\00n$\00\00\95\1b\00\00\08\11\00\00\d3,\00\00\e2\11\00\00\c7-\00\00\b2*\00\00\e8\16\00\00\e8\14\00\00x&\00\00\d9\1a\00\00\ca'\00\00\fd\17\00\00J'\00\00\f3\12\00\00\a3\22\00\00\04\19\00\00\d7\0a\00\00+\17\00\00\9e\0b\00\00\0b)\00\00z+\00\00]\0a\00\00p#\00\00\17\06\00\00-*\00\00 \10\00\00\b8\17\00\00u\08\00\00\df)\00\00\f6\07\00\00N!\00\00\8c'\00\00n\06\00\00j\15\00\00\a9!\00\00\e8\0b\00\00\a3)\00\00\d3$\00\00W\1c\00\00\ec\13\00\00\8a\04\00\00@\1f\00\00l\04\00\00\c9\17\00\00C#\00\00\b1.\00\00\03/\00\00\c9,\00\00h\22\00\00|)\00\00\be(\00\00e(\00\00}\1d\00\00\c0\04\00\00\97#\00\00\ad\19\00\00g'\00\00\1e/\00\00\11'\00\00-\1d\00\00\85.\00\00,\15\00\00\d3\05\00\002!\00\00\b1\1e\00\00<\10\00\00\13\1f\00\00J\0c\00\00\d0#\00\00=\04\00\00\ed0\00\00\fe+\00\006\13\00\00\98\22\00\00\0b\0e\00\00\b70\00\00\dd+\00\00\b1\0b\00\00\d6\0b\00\00v\19\00\00\8e-\00\00\0a+\00\00B\1a\00\00\b3\18\00\00\e20\00\00\0b\1c\00\00\8b\06\00\00\aa\0d\00\00i)\00\00?\08\00\00\a3\17\00\00%#\00\00\d5\1e\00\00\dd\1b\00\00\f6\05\00\00y.\00\00-)\00\00\b8\22\00\00\b5\13\00\00K\0d\00\00\e0\15\00\00U\12\00\00_\15\00\00\e8,\00\00\7f\22\00\00I!\00\00-\07\00\00\ae\1a\00\00D\1d\00\00F+\00\00\b6\1e\00\00\ff\09\00\0050\00\00\80,\00\00\a2\11\00\00z,\00\00\22\0d\00\00u\1a\00\00\ce\16\00\00\99\1c\00\00\e9\1f\00\00A\14\00\00\c0%\00\00h\0a\00\00\a0\09\00\00\83-\00\00\f3\0b\00\00\c40\00\00\fb-\00\00\b7\19\00\00\07*\00\00H \00\00\9c/\00\00e\1d\00\00\a5\06\00\00k\0c\00\005\16\00\00E*\00\00\ba\09\00\00?)\00\003 \00\00\f9\08\00\00\b4\10\00\00f.\00\00f\04\00\00}\0d\00\00\cb\09\00\00@,\00\00\0a\13\00\00O\1d\00\00G#\00\001.\00\00v\22\00\00\ce(\00\00\94\13\00\00\bd\08\00\00h\13\00\00q\0d\00\00\f7\1d\00\00D\19\00\00\85\06\00\00\86!\00\00\d1\1f\00\00t\1f\00\00v\09\00\00\5c!\00\00\8c\18\00\00\ae!\00\00\8f\12\00\00\96\06\00\00\a8\1a\00\00\fd'\00\00\86\1f\00\00\81!\00\00\eb\06\00\00E\1e\00\00\bc\1c\00\00\9c\11\00\00\97\1a\00\00O\13\00\00\b7\12\00\00\ba%\00\00q\09\00\00\98-\00\00W!\00\00\04\14\00\00\87\13\00\00\dd\11\00\00\0d\0d\00\00l\07\00\00\d8+\00\00\c5'\00\004,\00\00A\16\00\00\8b#\00\00:'\00\00\ee\15\00\00<\06\00\00\04\16\00\00\b3-\00\00\a9%\00\00D\0b\00\00:\1f\00\00^\09\00\00\0f/\00\00'*\00\00\17&\00\00\b6\1c\00\00\c2\18\00\00\b6$\00\00d\15\00\00\1c\12\00\00\9c,\00\00\91\1a\00\00b0\00\00i\08\00\00\0f\07\00\00\e6%\00\00\12\14\00\00\c2\08\00\00\de\1a\00\00\d7\1c\00\00\10\1a\00\00\ae%\00\00b\0a\00\00\97)\00\00\f0#\00\00B\10\00\00\c3\05\00\00\d9\09\00\00\1c\10\00\00\16\0e\00\00c\22\00\00Y,\00\00\c9\10\00\00_(\00\00\a2\1a\00\00\1a\13\00\00\be+\00\00\b0\1c\00\00\0b \00\00\9e$\00\00\a2\08\00\00\f6,\00\00m\1e\00\00\8b\19\00\00\8a,\00\00\9d\17\00\00\96\11\00\00\a4\15\00\00\95\09\00\00\f7'\00\00e\0c\00\00\bf\1d\00\00\bf'\00\00\a5&\00\00[+\00\00\0a\1a\00\00\a3\12\00\00\d9\18\00\00t\05\00\00j#\00\00\81\13\00\00\df\09\00\00D\13\00\00}\18\00\00\f7*\00\00\ea\07\00\00\9e!\00\00\db\0b\00\00\ce\18\00\00\de\1e\00\00\ca#\00\00Y \00\00\fc*\00\00\ec#\00\00\22\04\00\00\aa\0c\00\00\03\07\00\00\a4!\00\006\06\00\00[\12\00\00\c9.\00\00!)\00\00{\0e\00\00\00\1f\00\00'\1d\00\00x\13\00\00\16\12\00\00\7f\0c\00\00$\22\00\00\d3&\00\00\dd\1f\00\00\ac\0e\00\00\1f+\00\00\98!\00\00\eb/\00\00_\12\00\00-.\00\00>\0a\00\00\d4\0c\00\00\99\07\00\00\87&\00\00\b9(\00\00`(\00\00x\1d\00\00\1b\13\00\00\12\22\00\00\d6\14\00\008 \00\00F.\00\00}\13\00\00c&\00\00\b8\10\00\00\13/\00\00\d9\11\00\00\06\08\00\00n\05\00\00v\1c\00\00\9c\04\00\00\9f$\00\00\1b\06\00\00\8f\1e\00\00\12!\00\00w%\00\00\b8\18\00\007\09\00\00{\0b\00\00#\16\00\00#%\00\00#,\00\00P\05\00\00\eb\0e\00\00\e6\0f\00\001\1f\00\007\18\00\00\ef\0d\00\0000\00\00\bd)\00\00^\19\00\00\81\17\00\00\97.\00\00\d4\07\00\00\02\1e\00\00M \00\00\c9\16\00\00\07\22\00\00*+\00\00\9d)\00\00\9a\09\00\00f!\00\00e\0e\00\00\97\1e\00\00\8e\0d\00\00A-\00\00\14,\00\00.\08\00\00u,\00\00\18\0d\00\00\ca\1a\00\00\f8'\00\00f\0c\00\001\09\00\00/\16\00\009)\00\00\1d\05\00\00\e1%\00\00\af\0c\00\00\ff(\00\00\9c'\00\00|0\00\00\cd,\00\00\e1\08\00\00x!\00\00\c5\14\00\00\d4\1a\00\00Z\17\00\00\d3+\00\005'\00\00z\06\00\00\e8\1b\00\00\bf!\00\00\c0\1e\00\00\0d\1d\00\00&\06\00\00\0b\1a\00\00i\1f\00\00\a4\12\00\00\8e\10\00\00\b2 \00\00\ac\1e\00\00q\10\00\00\f2\13\00\001\0e\00\00\a7\1b\00\00X\19\00\00Q\0a\00\00\fd\10\00\00B\15\00\00}\16\00\004\1e\00\00o\08\00\00l\22\00\00\fa\1a\00\00\e5\0c\00\00 \13\00\00\82\13\00\00\fc,\00\00\92)\00\00\ac+\00\00\d4\0e\00\00\fa\1b\00\00\bd*\00\00i\1a\00\00R&\00\00H\1a\00\00\ac\12\00\00V\0a\00\00\a3\1d\00\00\f0\07\00\00\ec\1c\00\00\9f\0a\00\00p0\00\00\18\10\00\00\c90\00\00\7f-\00\00\a7*\00\00\9e\1d\00\00\a9\10\00\00\08\0d\00\00\e0'\00\00y\18\00\00//\00\00\a0&\00\00Q-\00\00\a5\16\00\00\80\1c\00\00\89\15\00\00R\1c\00\00\15\0a\00\00g\1e\00\00c*\00\00]\1a\00\00\cd&\00\00\f3\19\00\00\9f\0c\00\00\b1\13\00\00\de!\00\00\c8\06\00\00\c3.\00\00\fd.\00\00B(\00\00M\16\00\00s$\00\00\b2+\00\00J\11\00\00=\0d\00\00\ce\15\00\00o\18\00\00\d9&\00\00|\0e\00\00{)\00\00\da$\00\00\8d0\00\00\041\00\00\9b\1b\00\00\89\12\00\00-!\00\00\f1'\00\00\13\0a\00\00\22*\00\00\0b$\00\00\ee\16\00\00:,\00\00\91#\00\00\d2\17\00\00l%\00\00%\0b\00\00T0\00\00\91\11\00\00\df\16\00\00\ba/\00\00\0f\19\00\00Z\0e\00\00\b8-\00\00\ef)\00\00\a8.\00\00\03\0b\00\00\82 \00\00\1c\09\00\00\e7/\00\008\12\00\00[\07\00\00J0\00\00\d9(\00\00c\0d\00\00\e9\1a\00\00\fb\1e\00\00\b4/\00\00?%\00\00\92\10\00\00\ce*\00\00\dd\13\00\00a.\00\00\13\17\00\00,\1c\00\00u*\00\00\8b.\00\00\15\1b\00\00\14\10\00\00\07\0a\00\00)\1e\00\00!\07\00\00\c5,\00\00\1d*\00\00\8b\11\00\00_\22\00\00)!\00\00\f5\1a\00\00\e0\0c\00\00\b3#\00\00f\17\00\00Z(\00\00\b7\06\00\00\ce\17\00\00\d3\11\00\006+\00\00\0d&\00\00\e9\18\00\00\95\12\00\00\ba\04\00\00\ec\0f\00\00U\07\00\00 \11\00\00\8e\0a\00\00\7f\0e\00\00\9e\08\00\00\9a&\00\00\06\1c\00\00T\18\00\00\17\12\00\00\1a.\00\00\c0\11\00\00)-\00\00c)\00\00\85,\00\00\88\1d\00\00\0f\1f\00\000+\00\00\f4 \00\00\86\1a\00\00\d7\1f\00\00\81\0b\00\00\fc%\00\00\fe\0a\00\009\0d\00\00\92\22\00\00\b8)\00\00%\19\00\00|\17\00\00\00!\00\00I\19\00\00\c4\10\00\00f\1c\00\00\83$\00\00\1d\04\00\00$/\00\00\d4'\00\00\bd\12\00\00\c3\12\00\00\12%\00\003\07\00\00\a8\17\00\00\8f\09\00\00\f3+\00\00t\11\00\00\e6'\00\00^\1a\00\00\8a/\00\00Z\0c\00\00\83\16\00\00\ca \00\00F\14\00\00M&\00\00:%\00\00\c1\05\00\00p \00\007\07\00\00r\04\00\00t&\00\00\c7\1c\00\00\85#\00\00\e3-\00\00\cf!\00\00\e0\0f\00\00\05\1a\00\00\9f\12\00\00\00\08\00\00\8a\1c\00\00\d4\18\00\00\f0$\00\00\c0\0a\00\00e#\00\00U\09\00\00\13\1e\00\00\08\0b\00\00\e8\0a\00\00H\0a\00\00\88\0a\00\00\ef(\00\00V\11\00\00S\09\00\00\1d\16\00\00\10\10\00\00\02\0d\00\00y(\00\00g\19\00\00\0d\22\00\00\aa\15\00\00\aa\0f\00\00\11\12\00\009\0b\00\00\8a\0e\00\00N\17\00\00\ed+\00\00@\13\00\00w\1b\00\00 0\00\00\93(\00\00\a4%\00\00\1e-\00\00\0c\10\00\00\a5\0f\00\00\0d1\00\00\c8\0e\00\00\f9\0a\00\00 \22\00\00\d9!\00\00<\13\00\00\8d&\00\007\14\00\00")) diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram.c b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram.c new file mode 100644 index 0000000..445570e --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram.c @@ -0,0 +1,649 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram + + Author: Raymond Chen + + Function: A program that computes anagrams. + + Source: See below. + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See below. + +*/ + +/* + Anagram program by Raymond Chen, + inspired by a similar program by Brian Scearce + + This program is Copyright 1991 by Raymond Chen. + (rjc@math.princeton.edu) + + This program may be freely distributed provided all alterations + to the original are clearly indicated as such. +*/ + +/* There are two tricks. First is the Basic Idea: + + When the user types in a phrase, the phrase is first preprocessed to + determine how many of each letter appears. A bit field is then constructed + dynamically, such that each field is large enough to hold the next power + of two larger than the number of times the character appears. For example, + if the phrase is hello, world, the bit field would be + + 00 00 00 000 000 00 00 + d e h l o r w + + The phrase hello, world, itself would be encoded as + + 01 01 01 011 010 01 01 + d e h l o r w + + and the word hollow would be encoded as + + 00 00 01 010 010 00 01 + d e h l o r w + + The top bit of each field is set in a special value called the sign. + Here, the sign would be + + 10 10 10 100 100 10 10 + d e h l o r w + + + The reason for packing the values into a bit field is that the operation + of subtracting out the letters of a word from the current phrase can be + carried out in parallel. for example, subtracting the word hello from + the phrase hello, world, is merely + + d e h l o r w + 01 01 01 011 010 01 01 (dehllloorw) + - 00 00 01 010 010 00 01 (hlloow) + ======================== + 01 01 00 001 000 01 00 (delr) + + Since none of the sign bits is set, the word fits, and we can continue. + Suppose the next word we tried was hood. + + d e h l o r w + 01 01 00 001 000 01 00 (delr) + - 01 00 01 000 010 00 00 (hood) + ======================== + 00 00 11 000 110 01 00 + ^ ^ + A sign bit is set. (Two, actually.) This means that hood does not + fit in delr, so we skip it and try another word. (Observe that + when a sign bit becomes set, it screws up the values for the letters to + the left of that bit, but that's not important.) + + The inner loop of an anagram program is testing to see if a + word fits in the collection of untried letters. Traditional methods + keep an array of 26 integers, which are then compared in turn. This + means that there are 26 comparisons per word. + + This method reduces the number of comparisons to MAX_QUAD, typically 2. + Instead of looping through an array, we merely perform the indicated + subtraction and test if any of the sign bits is set. +*/ + +/* The nuts and bolts: + + The dictionary is loaded and preprocessed. The preprocessed dictionary + is a concatenation of copies of the structure: + + struct dictword { + char bStructureSize; -- size of this structure + char cLetters; -- number of letters in the word + char achWord[]; -- the word itself (0-terminated) + } + + Since this is a variable-sized structure, we keep its size in the structure + itself for rapid stepping through the table. + + When a phrase is typed in, it is first preprocessed as described in the + Basic Idea. We then go through the dictionary, testing each word. If + the word fits in our phrase, we build the bit field for its frequency + table and add it to the list of candidates. +*/ + +/* + The Second Trick: + + Before diving into our anagram search, we then tabulate how many times + each letter appears in our list of candidates, and sort the table, with + the rarest letter first. + + We then do our anagram search. + + Like most anagram programs, this program does a depth-first search. + Although most anagram programs do some sort of heuristics to decide what + order to place words in the list_of_candidates, the search itself proceeds + according to a greedy algorithm. That is, once you find a word that fits, + subtract it and recurse. + + This anagram program exercises some restraint and does not march down + every branch that shows itself. Instead, it only goes down branches + that use the rarest unused letter. This helps to find dead ends faster. + + FindAnagram(unused_letters, list_of_candidates) { + l = the rarest letter as yet unused + For word in list_of_candidates { + if word does not fit in unused_letters, go on to the next word. + if word does not contain l, defer. + FindAnagram(unused_letters - word, list_of_candidates[word,...]) + } + } + + + The heuristic of the Second Trick can probably be improved. I invite + anyone willing to improve it to do so. +*/ + +/* Before compiling, make sure Quad and MASK_BITS are set properly. For best + results, make Quad the largest integer size supported on your machine. + So if your machine has long longs, make Quad an unsigned long long. + (I called it Quad because on most machines, the largest integer size + supported is a four-byte unsigned long.) + + If you need to be able to anagram larger phrases, increase MAX_QUADS. + If you increase it beyond 4, you'll have to add a few more loop unrolling + steps to FindAnagram. +*/ +#include "anagram_ctype.h" +#include "anagram_stdlib.h" +#include "anagram_strings.h" + +#include "anagram_compare.h" + +/* + Defines +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define anagram_DICTWORDS 2279 +#define anagram_MASK_BITS 32 /* number of bits in a Quad */ +#define anagram_MAX_QUADS 2 /* controls largest phrase */ +#define anagram_MAXCAND 100 /* candidates */ +#define anagram_MAXSOL 51 /* words in the solution */ +#define anagram_ALPHABET 26 /* letters in the alphabet */ + +#define anagram_OneStep(i) \ + if ((aqNext[i] = pqMask[i] - pw->aqMask[i]) & anagram_aqMainSign[i]) { \ + ppwStart++; \ + continue; \ + } + +/* + Type definitions +*/ + +typedef unsigned int anagram_Quad; /* for building our bit mask */ + +/* A Word remembers the information about a candidate word. */ +typedef struct { + char *pchWord; /* the word itself */ + anagram_Quad aqMask[anagram_MAX_QUADS]; /* the word's mask */ + unsigned cchLength; /* letters in the word */ + char padding[4]; +} anagram_Word; +typedef anagram_Word *anagram_PWord; +typedef anagram_Word **anagram_PPWord; + +/* A Letter remembers information about each letter in the phrase to + be anagrammed. */ +typedef struct { + unsigned uFrequency; /* how many times it appears */ + unsigned uShift; /* how to mask */ + unsigned uBits; /* the bit mask itself */ + unsigned iq; /* which Quad to inspect? */ +} anagram_Letter; +typedef anagram_Letter *anagram_PLetter; + +/* + Forward declaration of functions +*/ + +void anagram_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +anagram_main(void); +int anagram_return(void); +int anagram_ch2i(int ch); +void anagram_AddWords(void); +void anagram_BuildMask(char const *pchPhrase); +void anagram_BuildWord(char *pchWord); +void anagram_DumpWords(void); +void anagram_FindAnagram(anagram_Quad *pqMask, anagram_PPWord ppwStart, + int iLetter); +anagram_PWord anagram_NewWord(void); +anagram_PWord anagram_NextWord(void); +void anagram_ReadDict(void); +void anagram_Reset(void); +void anagram_SortCandidates(void); + +/* + Declaration of global variables +*/ + +extern char const *anagram_achPhrase[3]; +extern char const *anagram_dictionary[anagram_DICTWORDS]; + +/* candidates we've found so far */ +static anagram_PWord anagram_apwCand[anagram_MAXCAND]; +/* how many of them? */ +static unsigned anagram_cpwCand; + +/* statistics on the current phrase */ +static anagram_Letter anagram_alPhrase[anagram_ALPHABET]; + +/* number of letters in phrase */ +static int anagram_cchPhraseLength; + +/* the bit field for the full phrase */ +static anagram_Quad anagram_aqMainMask[anagram_MAX_QUADS]; +/* where the sign bits are */ +static anagram_Quad anagram_aqMainSign[anagram_MAX_QUADS]; + +static const int anagram_cchMinLength = 3; + +/* auGlobalFrequency counts the number of times each letter appears, + summed over all candidate words. This is used to decide which letter + to attack first. */ +static unsigned anagram_auGlobalFrequency[anagram_ALPHABET]; +static int anagram_achByFrequency[anagram_ALPHABET]; /* for sorting */ + +/* the dictionary is read here */ +static char *anagram_pchDictionary; + +/* the answers */ +static anagram_PWord anagram_apwSol[anagram_MAXSOL]; +static int anagram_cpwLast; + +/* buffer to write an answer */ +static char anagram_buffer[30]; + +/* + Initialization- and return-value-related functions +*/ + +/* ReadDict -- read the dictionary file into memory and preprocess it + + A word of length cch in the dictionary is encoded as follows: + + byte 0 = cch + 3 + byte 1 = number of letters in the word + byte 2... = the word itself, null-terminated + + Observe that cch+3 is the length of the total encoding. These + byte streams are concatenated, and terminated with a 0. +*/ +void +anagram_ReadDict(void) { + char *pch; + char *pchBase; + unsigned len; + unsigned cWords = 0; + unsigned cLetters; + int i; + volatile char bitmask = 0; + + len = 0; + __pragma_loopbound(2279, 2279); + for (i = 0; i < anagram_DICTWORDS; i++) { + unsigned strlen = 0; + __pragma_loopbound(1, 5); + while (anagram_dictionary[i][strlen] != 0) + strlen++; + len += strlen + 3; + } + + len++; + pchBase = anagram_pchDictionary = (char *) anagram_malloc(len); + + __pragma_loopbound(2279, 2279); + for (i = 0; i < anagram_DICTWORDS; i++) { + int index = 0; + pch = pchBase + 2; /* reserve for length */ + cLetters = 0; + + __pragma_loopbound(1, 5); + while (anagram_dictionary[i][index] != '\0') { + if (anagram_isalpha(anagram_dictionary[i][index])) + cLetters++; + *pch++ = anagram_dictionary[i][index]; + index++; + *(pch - 1) ^= bitmask; + } + *pch++ = '\0'; + *pchBase = (char) (pch - pchBase); + pchBase[1] = (char) cLetters; + pchBase = pch; + cWords++; + } + + *pchBase++ = 0; +} + +void +anagram_init(void) { + anagram_ReadDict(); +} + +int +anagram_return(void) { + int i; + char const *answer = "duke yip arm"; + + _Pragma( + "loopbound min 12 max 12") for (i = 0; i < 12; + i++) if (answer[i] != + anagram_buffer[i]) return 1; + + return 0; +} + +/* + Core benchmark functions +*/ + +/* convert letter to index */ +int +anagram_ch2i(int ch) { + return ch - 'a'; +} + +int +anagram_CompareFrequency(char *pch1, char *pch2) { + return anagram_auGlobalFrequency[(*(int *) pch1)] < + anagram_auGlobalFrequency[(*(int *) pch2)] + ? -1 + : anagram_auGlobalFrequency[(*(int *) pch1)] == + anagram_auGlobalFrequency[(*(int *) pch2)] + ? 0 + : 1; +} + +void +anagram_Reset(void) { + anagram_bzero((char *) anagram_alPhrase, + sizeof(anagram_Letter) * anagram_ALPHABET); + anagram_bzero((char *) anagram_aqMainMask, + sizeof(anagram_Quad) * anagram_MAX_QUADS); + anagram_bzero((char *) anagram_aqMainSign, + sizeof(anagram_Quad) * anagram_MAX_QUADS); + anagram_bzero((char *) anagram_auGlobalFrequency, + sizeof(unsigned) * anagram_ALPHABET); + anagram_bzero((char *) anagram_achByFrequency, + sizeof(int) * anagram_ALPHABET); + anagram_bzero((char *) anagram_apwCand, + sizeof(anagram_PWord) * anagram_MAXCAND); + anagram_cchPhraseLength = 0; + anagram_cpwCand = 0; +} + +void +anagram_BuildMask(char const *pchPhrase) { + int i; + int ch; + unsigned iq; /* which Quad? */ + unsigned int cbtUsed; /* bits used in the current Quad */ + unsigned int cbtNeed; /* bits needed for current letter */ + anagram_Quad qNeed; /* used to build the mask */ + + /* Tabulate letter frequencies in the phrase */ + anagram_cchPhraseLength = 0; + __pragma_loopbound(11, 11); + while ((ch = *pchPhrase++) != '\0') { + if (anagram_isalpha(ch)) { + ch = anagram_tolower(ch); + anagram_alPhrase[anagram_ch2i(ch)].uFrequency++; + anagram_cchPhraseLength++; + } + } + + /* Build masks */ + iq = 0; /* which quad being used */ + cbtUsed = 0; /* bits used so far */ + + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) { + if (anagram_alPhrase[i].uFrequency == 0) { + anagram_auGlobalFrequency[i] = ~0u; /* to make it sort last */ + } else { + anagram_auGlobalFrequency[i] = 0u; + _Pragma( + "loopbound min 1 max 2") for (cbtNeed = 1, qNeed = 1; + anagram_alPhrase[i].uFrequency >= + qNeed; + cbtNeed++, qNeed <<= 1); + if (cbtUsed + cbtNeed > anagram_MASK_BITS) + cbtUsed = 0; + anagram_alPhrase[i].uBits = qNeed - 1; + if (cbtUsed) + qNeed <<= cbtUsed; + anagram_aqMainSign[iq] |= qNeed; + anagram_aqMainMask[iq] |= + (anagram_Quad) anagram_alPhrase[i].uFrequency << cbtUsed; + anagram_alPhrase[i].uShift = cbtUsed; + anagram_alPhrase[i].iq = iq; + cbtUsed += cbtNeed; + } + } +} + +anagram_PWord +anagram_NewWord(void) { + anagram_PWord pw; + + pw = (anagram_Word *) anagram_malloc(sizeof(anagram_Word)); + return pw; +} + +/* NextWord -- get another candidate entry, creating if necessary */ +anagram_PWord +anagram_NextWord(void) { + anagram_PWord pw; + pw = anagram_apwCand[anagram_cpwCand++]; + if (pw != 0) + return pw; + anagram_apwCand[anagram_cpwCand - 1] = anagram_NewWord(); + return anagram_apwCand[anagram_cpwCand - 1]; +} + +/* BuildWord -- build a Word structure from an ASCII word + If the word does not fit, then do nothing. */ +void +anagram_BuildWord(char *pchWord) { + unsigned char cchFrequency[anagram_ALPHABET]; + int i; + char *pch = pchWord; + anagram_PWord pw; + unsigned int cchLength = 0; + + anagram_bzero((char *) cchFrequency, + sizeof(unsigned char) * anagram_ALPHABET); + + /* Build frequency table */ + __pragma_loopbound(3, 5); + while ((i = *pch++) != '\0') { + if (!anagram_isalpha(i)) + continue; + i = anagram_ch2i(anagram_tolower(i)); + if (++cchFrequency[i] > anagram_alPhrase[i].uFrequency) + return; + ++cchLength; + } + + /* Update global count */ + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) + anagram_auGlobalFrequency[i] += cchFrequency[i]; + + /* Create a Word structure and fill it in, including building the + bitfield of frequencies. */ + pw = anagram_NextWord(); + anagram_bzero((char *) (pw->aqMask), + sizeof(anagram_Quad) * anagram_MAX_QUADS); + + pw->pchWord = pchWord; + pw->cchLength = cchLength; + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) { + pw->aqMask[anagram_alPhrase[i].iq] |= (anagram_Quad) cchFrequency[i] + << anagram_alPhrase[i].uShift; + } +} + +/* AddWords -- build the list of candidates */ +void +anagram_AddWords(void) { + char *pch = anagram_pchDictionary; /* walk through the dictionary */ + + anagram_cpwCand = 0; + + __pragma_loopbound(1967, 1967); + while (*pch) { + if ((pch[1] >= anagram_cchMinLength && + pch[1] + anagram_cchMinLength <= anagram_cchPhraseLength) || + pch[1] == anagram_cchPhraseLength) + anagram_BuildWord(pch + 2); + pch += *pch; + } +} + +void +anagram_DumpWords(void) { + int i, j; + int offset = 0; + __pragma_loopbound(3, 3); + for (i = 0; i < anagram_cpwLast; i++) { + __pragma_loopbound(3, 5); + for (j = 0; anagram_apwSol[i]->pchWord[j] != '\0'; j++) + anagram_buffer[offset + j] = anagram_apwSol[i]->pchWord[j]; + offset += j; + + anagram_buffer[offset++] = ' '; + } + anagram_buffer[offset++] = '\0'; +} + +void +anagram_FindAnagram(anagram_Quad *pqMask, anagram_PPWord ppwStart, + int iLetter) { + anagram_Quad aqNext[anagram_MAX_QUADS]; + register anagram_PWord pw; + anagram_Quad qMask; + unsigned iq; + anagram_PPWord ppwEnd = &anagram_apwCand[0]; + ppwEnd += anagram_cpwCand; + + __pragma_loopbound(0, 6); + while (1) { + iq = anagram_alPhrase[anagram_achByFrequency[iLetter]].iq; + qMask = anagram_alPhrase[anagram_achByFrequency[iLetter]].uBits + << anagram_alPhrase[anagram_achByFrequency[iLetter]].uShift; + if (pqMask[iq] & qMask) + break; + iLetter++; + } + + __pragma_loopbound(0, 11); + while (ppwStart < ppwEnd) { + pw = *ppwStart; + +#if anagram_MAX_QUADS > 0 + anagram_OneStep(0); +#endif + +#if anagram_MAX_QUADS > 1 + anagram_OneStep(1); +#endif + +#if anagram_MAX_QUADS > 2 + anagram_OneStep(2); +#endif + +#if anagram_MAX_QUADS > 3 + anagram_OneStep(3); +#endif + +#if anagram_MAX_QUADS > 4 + @@"Add more unrolling steps here, please." @ @ +#endif + + /* If the pivot letter isn't present, defer this word until later */ + if ((pw->aqMask[iq] & qMask) == 0) { + *ppwStart = *(--ppwEnd); + *ppwEnd = pw; + continue; + } + + /* If we get here, this means the word fits. */ + anagram_apwSol[anagram_cpwLast++] = pw; + if (anagram_cchPhraseLength -= pw->cchLength) { /* recurse */ + /* The recursive call scrambles the tail, so we have to be + pessimistic. */ + ppwEnd = &anagram_apwCand[0]; + ppwEnd += anagram_cpwCand; + anagram_FindAnagram(&aqNext[0], ppwStart, iLetter); + } else /* found one */ + anagram_DumpWords(); + anagram_cchPhraseLength += pw->cchLength; + --anagram_cpwLast; + ppwStart++; + continue; + } +} + +void +anagram_SortCandidates(void) { + int i; + + /* Sort the letters by frequency */ + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) + anagram_achByFrequency[i] = i; + anagram_qsort(anagram_achByFrequency, anagram_ALPHABET, sizeof(int)); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +anagram_main(void) { + int i; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + anagram_Reset(); + anagram_BuildMask(anagram_achPhrase[i]); + anagram_AddWords(); + if (anagram_cpwCand == 0 || anagram_cchPhraseLength == 0) + continue; + + anagram_cpwLast = 0; + anagram_SortCandidates(); + _Pragma("marker call_find") + anagram_FindAnagram(anagram_aqMainMask, anagram_apwCand, 0); + _Pragma("flowrestriction 1*anagram_FindAnagram <= 51*call_find"); + } +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + anagram_init(); + anagram_main(); + + return anagram_return(); +} diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_compare.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_compare.h new file mode 100644 index 0000000..c6f71b3 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_compare.h @@ -0,0 +1,27 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_compare.h + + Author: Raymond Chen + + Function: This header contains the comparison functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_COMPARE_H +#define ANAGRAM_COMPARE_H + +int anagram_CompareFrequency(char *pch1, char *pch2); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_ctype.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_ctype.h new file mode 100644 index 0000000..7642f35 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_ctype.h @@ -0,0 +1,45 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_ctype.h + + Author: Raymond Chen + + Function: This header contains some C library functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_CTYPE_H +#define ANAGRAM_CTYPE_H + +int +anagram_islower(int c) { + return 'a' <= c && c <= 'z'; +} + +int +anagram_isupper(int c) { + return 'A' <= c && c <= 'Z'; +} + +int +anagram_isalpha(int c) { + return anagram_isupper(c) || anagram_islower(c); +} + +int +anagram_tolower(int c) { + return anagram_isupper(c) ? c + ('a' - 'A') : c; +} + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_input.c b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_input.c new file mode 100644 index 0000000..8bfddaf --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_input.c @@ -0,0 +1,320 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_input.c + + Author: Raymond Chen + + Function: This file contains the input data used by anagram. + + Source: anagram + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +/* + Forward declaration of global variables +*/ + +extern char const *anagram_achPhrase[3]; +extern char const *anagram_dictionary[2279]; + +/* + Definition of global variables +*/ +char const *anagram_achPhrase[3] = {"todd austin", "john alledy", + "mary updike"}; + +char const *anagram_dictionary[2279] = { + "2nd", "4th", "8th", "a", "ABA", "aback", "abash", "abbas", + "abbey", "abed", "abet", "abort", "abut", "Accra", "ACM", "acorn", + "Acts", "Ada", "adapt", "added", "addle", "Adele", "Aden", "admix", + "adore", "adult", "affix", "afire", "aft", "agate", "agave", "Agee", + "agent", "agile", "Agnew", "agone", "ahoy", "Aida", "aim", "Ainu", + "airy", "Ajax", "Alamo", "alarm", "alb", "Alcoa", "alder", "Aleck", + "alert", "algae", "alia", "alike", "alive", "allay", "alley", "Allis", + "allow", "ally", "Allyn", "aloe", "aloha", "along", "aloud", "also", + "alter", "Alton", "Alva", "amaze", "amber", "ami", "amigo", "amiss", + "Amman", "Amoco", "amok", "Amos", "ample", "amra", "amy", "Andes", + "angel", "Angie", "angry", "Angus", "Anne", "annex", "annoy", "annul", + "ante", "any", "apex", "apple", "apron", "apt", "arch", "argue", + "Aries", "arm", "army", "aroma", "array", "arrow", "Artie", "arty", + "arum", "a's", "ash", "ashen", "ashy", "askew", "assai", "Assam", + "Astor", "ate", "atlas", "atone", "audit", "Aug", "augur", "auk", + "aural", "avid", "avoid", "avow", "awash", "awe", "awn", "awry", + "axe", "axial", "axis", "axon", "Ayers", "Aztec", "b", "babe", + "Bach", "bad", "bait", "baldy", "balm", "balsa", "bam", "ban", + "bane", "banjo", "barb", "barn", "baron", "basal", "Basel", "basil", + "bassi", "baste", "batch", "Bates", "batik", "Bator", "bawd", "bay", + "bayed", "bayou", "be", "beak", "bean", "beard", "beat", "beck", + "Becky", "bed", "bedim", "bee", "beech", "beep", "beet", "befit", + "beg", "begin", "beige", "Bela", "belch", "belt", "beman", "bench", + "Benny", "bent", "Benz", "berth", "beset", "bet", "betel", "Bette", + "bevy", "Bible", "bide", "big", "bile", "bilk", "binge", "bit", + "bite", "black", "blanc", "bland", "blare", "blat", "blaze", "bled", + "blest", "blind", "Blinn", "bliss", "blitz", "blob", "blond", "blood", + "bloom", "blot", "blown", "blue", "bluff", "Blum", "blur", "board", + "boat", "bock", "bog", "bogy", "boil", "Boise", "bomb", "bon", + "bong", "bonus", "bonze", "booby", "book", "booky", "boon", "booze", + "bore", "Boris", "boron", "Bosch", "bosom", "bound", "bourn", "bowel", + "boy", "Boyce", "bract", "Brady", "brag", "brake", "brant", "brass", + "Braun", "bravo", "bread", "bream", "breve", "brew", "briar", "Brice", + "brief", "bring", "briny", "broad", "broth", "brunt", "BSTJ", "bub", + "buck", "Budd", "buddy", "Buick", "built", "bulge", "bulky", "bum", + "bump", "bunch", "bundy", "bunk", "Burch", "burg", "burl", "Burma", + "burnt", "Burr", "bury", "bush", "bushy", "bust", "busy", "butte", + "butyl", "buyer", "by", "bylaw", "Byrd", "byte", "cab", "cable", + "cacao", "cacti", "Cairo", "Caleb", "call", "calm", "canal", "canoe", + "canon", "can't", "cap", "caper", "capo", "card", "Carey", "Carib", + "Carla", "carol", "carve", "cash", "caste", "catch", "cater", "caulk", + "cause", "CBS", "cedar", "cent", "Cetus", "Chad", "chaff", "chair", + "champ", "char", "chasm", "chaw", "cheat", "cheer", "chef", "Chen", + "chew", "chick", "chief", "Chile", "chill", "chine", "chip", "chock", + "choir", "chomp", "chose", "Chris", "chuff", "chum", "chump", "CIA", + "cinch", "cite", "city", "clad", "clan", "clank", "Clara", "Claus", + "claw", "clean", "cleat", "clerk", "clime", "cling", "clink", "Clio", + "clod", "clomp", "cloth", "clove", "cluck", "clump", "clung", "Clyde", + "cobra", "coco", "coda", "Cody", "Cohn", "coin", "col", "Colby", + "coney", "Congo", "cony", "cool", "coon", "copra", "copy", "Corey", + "corn", "corps", "cos", "cosy", "couch", "cough", "count", "coup", + "cove", "cowry", "coy", "CPA", "crack", "craft", "Craig", "crank", + "crash", "crate", "crawl", "craze", "creak", "cream", "credo", "creek", + "Creon", "crept", "crest", "crew", "crib", "crime", "crimp", "crisp", + "crock", "croft", "crone", "crook", "crowd", "CRT", "crumb", "crump", + "crush", "crux", "cub", "cube", "cuff", "cup", "Cupid", "cur", + "curb", "curie", "cusp", "cute", "cycad", "cynic", "d", "daffy", + "dairy", "daisy", "dally", "dame", "Damon", "Dan", "dance", "Dane", + "dank", "Dante", "Dar", "darn", "dart", "dash", "davit", "day", + "De", "deaf", "deal", "death", "debit", "Dec", "decal", "Dee", + "Deere", "deify", "deity", "Della", "delta", "demur", "den", "Denny", + "dense", "deny", "depth", "desk", "deus", "devil", "dewar", "Dhabi", + "diary", "dick", "dicta", "did", "die", "Diego", "diety", "dill", + "din", "dine", "dirty", "disc", "ditch", "dive", "DNA", "dock", + "Dodd", "doff", "dogma", "dolce", "doll", "dolly", "done", "door", + "dope", "Doric", "dose", "dote", "doubt", "Doug", "dove", "dowel", + "doze", "Dr", "Draco", "drama", "drape", "drawl", "dread", "dreg", + "dress", "drew", "drib", "drier", "drill", "drip", "dross", "drown", + "druid", "drunk", "dry", "du", "Duane", "ducat", "duct", "duel", + "duff", "Duffy", "Dugan", "duke", "dull", "dulse", "duly", "dump", + "dumpy", "dunce", "dunk", "dupe", "dusky", "dwarf", "dwelt", "Dwyer", + "dyer", "Dyke", "dyne", "each", "eager", "ear", "earn", "ease", + "eat", "eater", "Eben", "Ecole", "Eden", "edge", "edgy", "edict", + "Edith", "EDT", "eel", "eft", "egg", "Egypt", "eject", "el", + "elan", "elate", "elect", "elfin", "elide", "elk", "Ella", "Ellis", + "Elmer", "else", "Elton", "elude", "elves", "ember", "Emile", "Emory", + "Eng", "Engle", "Enid", "Enos", "enter", "envoy", "epoxy", "equal", + "erase", "ere", "erg", "Erich", "Ernst", "Eros", "err", "Errol", + "Ervin", "e's", "essay", "ester", "Ethan", "Ethel", "ethic", "ethos", + "etude", "Eva", "Evans", "event", "evict", "exact", "exam", "excel", + "exit", "eye", "f", "Faber", "fable", "facet", "fad", "faery", + "fag", "fail", "faint", "fairy", "fake", "fang", "fare", "faro", + "fatal", "fatty", "fault", "faun", "Faust", "fay", "FBI", "fee", + "feed", "feign", "Felix", "Fermi", "ferry", "fest", "fetch", "fetus", + "few", "fiend", "fiery", "fifth", "fig", "fight", "filet", "film", + "finch", "fine", "finny", "fire", "first", "fish", "Fisk", "fist", + "Fitch", "flack", "flak", "flaky", "flame", "flank", "flare", "flat", + "flax", "flea", "fled", "flee", "fleet", "flint", "flit", "flock", + "flog", "flow", "Floyd", "flub", "fluke", "flute", "Flynn", "FM", + "foal", "focal", "Foley", "folk", "fond", "food", "foot", "fop", + "fore", "forge", "form", "fort", "forth", "forty", "Foss", "foul", + "fowl", "FPC", "frame", "Franz", "Frau", "fray", "freed", "fresh", + "friar", "fro", "frog", "from", "frost", "frown", "fry", "fuel", + "full", "fun", "fur", "furry", "fussy", "g", "gaff", "gag", + "Gail", "Galen", "gall", "game", "gamma", "gap", "gar", "garb", + "gas", "gasp", "gate", "gauge", "gaur", "gavel", "gawk", "gay", + "gecko", "gel", "gem", "Gemma", "gene", "genie", "genre", "genus", + "germ", "Gerry", "get", "giant", "gibby", "gig", "gild", "gilt", + "gin", "Gino", "given", "glare", "gleam", "glee", "glib", "glint", + "gloat", "glow", "glut", "GMT", "gnaw", "gnome", "GNP", "god", + "Goff", "gogo", "golf", "Goode", "goof", "goose", "gore", "gory", + "got", "gourd", "GPO", "grace", "Graff", "grape", "grasp", "grate", + "gravy", "graze", "grebe", "greed", "Greek", "Gregg", "grew", "grid", + "grime", "Grimm", "gripe", "grit", "groan", "gross", "grout", "grow", + "grown", "grub", "grunt", "GSA", "guano", "guess", "guide", "guile", + "guise", "gules", "gull", "gulp", "gumbo", "gun", "gunky", "guru", + "gush", "gust", "gusto", "guy", "Gwyn", "gyp", "gyro", "Habib", + "hack", "had", "Hades", "Hagen", "Hahn", "haiku", "hale", "halma", + "ham", "Haney", "Hans", "hard", "hare", "hark", "harm", "harsh", + "haste", "hasty", "hatch", "hater", "hawk", "Haydn", "hazel", "he", + "Healy", "hear", "heart", "heave", "heavy", "hedge", "heel", "hefty", + "Heinz", "held", "he'll", "hemp", "hertz", "hew", "hex", "hi", + "hick", "Hicks", "hike", "hilum", "hind", "hip", "hippy", "hire", + "his", "hive", "hobby", "hoc", "Hoff", "hogan", "Hokan", "hole", + "Holm", "holt", "home", "homo", "hondo", "hood", "hook", "hoop", + "hoot", "hope", "horn", "hose", "hot", "hound", "hovel", "how", + "howdy", "hub", "hubby", "hue", "huff", "huge", "huh", "hull", + "human", "Hun", "hung", "hunk", "hurt", "hurty", "hutch", "hydra", + "hyena", "hymen", "i", "ibid", "IBM", "icon", "I'd", "Idaho", + "ideal", "idiot", "idol", "IEEE", "iffy", "igloo", "iii", "ileum", + "Iliad", "ill", "Ilona", "image", "in", "inapt", "Inca", "incur", + "India", "inert", "infer", "infra", "Inman", "inn", "input", "ionic", + "Iowa", "ipso", "IR", "Iran", "irate", "Irene", "Irish", "Irma", + "is", "Ising", "Islam", "isle", "Italy", "it'd", "Ito", "iv", + "ivy", "j", "JACM", "jag", "James", "Jane", "Janos", "Japan", + "Jason", "jaw", "jean", "jeep", "Jeres", "jerky", "jess", "jet", + "jewel", "jig", "jilt", "Jo", "job", "jog", "join", "joke", + "jolt", "Jonas", "joule", "joust", "joy", "Juan", "judge", "judo", + "Judy", "juju", "juke", "julep", "jump", "junco", "junky", "junta", + "jure", "jut", "Kafka", "kapok", "Karp", "Kathy", "Kay", "Keats", + "keel", "keg", "kelly", "Kemp", "Kent", "Kenya", "kerry", "Kevin", + "keyed", "khaki", "Khmer", "kick", "Kiev", "kin", "Kiowa", "kirk", + "kiss", "kite", "kiva", "Klan", "Kline", "knee", "Knott", "Knox", + "koala", "Kong", "Korea", "kraft", "kraut", "Kuhn", "Kurd", "lac", + "lack", "lad", "ladle", "lag", "lain", "laity", "lam", "lame", + "lamp", "lance", "lane", "Lange", "Laos", "lapel", "lard", "Lares", + "Lars", "last", "late", "Latin", "latus", "law", "lay", "layup", + "lazy", "leach", "leafy", "leak", "leapt", "learn", "leash", "leave", + "ledge", "leech", "left", "leg", "leggy", "Leila", "lemma", "Lena", + "lens", "Leo", "Leona", "lest", "level", "levy", "lewd", "liar", + "lice", "lick", "lie", "lien", "life", "lift", "liken", "lilac", + "Lilly", "lily", "limb", "limit", "line", "lingo", "link", "Linus", + "Lise", "lisp", "live", "livre", "load", "loam", "loan", "lob", + "lobby", "local", "lock", "Loeb", "Logan", "logic", "loin", "Loki", + "loll", "Lomb", "long", "loon", "loose", "loot", "lope", "lord", + "Loren", "lose", "lossy", "Lotte", "loud", "lousy", "low", "Lowe", + "loy", "l's", "LTV", "Lucas", "lucky", "luge", "Luis", "lumen", + "lumpy", "lunar", "Lund", "Lura", "lure", "lurk", "lusty", "Lydia", + "lying", "Lynn", "Lyon", "Lyra", "m", "Mabel", "mace", "macho", + "macro", "madam", "magi", "magna", "mail", "main", "make", "Malay", + "male", "mall", "malt", "mamma", "mane", "mania", "manic", "manna", + "Mans", "Mao", "map", "mar", "Mardi", "maria", "Marin", "Mario", + "Mars", "Mary", "mask", "mast", "mat", "mate", "mater", "matte", + "maul", "Mavis", "maxim", "Maya", "Mayer", "Mayo", "mayst", "maze", + "me", "meal", "meaty", "media", "meet", "meld", "melt", "men", + "Menlo", "merge", "Merle", "merry", "mesh", "messy", "metro", "mew", + "Meyer", "mezzo", "mica", "midst", "mien", "mig", "mila", "milk", + "Mills", "milt", "Mimi", "mince", "mine", "mini", "mink", "minor", + "minot", "minus", "Mira", "mire", "mirth", "Missy", "misty", "mite", + "mitre", "mixup", "mob", "Mobil", "mock", "model", "Moen", "Mohr", + "moist", "molar", "mole", "month", "moody", "Moore", "moral", "Moran", + "morn", "Moser", "moss", "most", "motel", "moth", "motif", "motor", + "motto", "mousy", "Moyer", "Mrs", "m's", "mud", "muggy", "Muir", + "mulch", "mule", "mull", "mum", "mummy", "muon", "mural", "murre", + "mushy", "musk", "must", "Muzo", "my", "Myers", "mynah", "Myra", + "NAACP", "Nagy", "naive", "name", "Nancy", "nap", "nary", "nasal", + "natal", "NATO", "navy", "Nazi", "NBC", "NCR", "ne", "near", + "neath", "Ned", "need", "needy", "Nehru", "Nell", "neon", "Nero", + "net", "Neva", "neve", "new", "nice", "niche", "Niger", "night", + "Nikko", "Nile", "Niobe", "nitty", "NJ", "no", "Noah", "Nobel", + "nodal", "noise", "Nolan", "nolo", "noon", "nor", "nose", "notch", + "Nov", "now", "n's", "NTIS", "nude", "numb", "nurse", "NY", + "oaf", "oaken", "oar", "oasis", "oath", "obey", "objet", "ocean", + "Oct", "ode", "o'er", "off", "often", "ogle", "Okay", "old", + "oldy", "olive", "Olson", "omit", "once", "only", "onset", "onus", + "onyx", "ooze", "opera", "opium", "opt", "opus", "orb", "Orin", + "Orion", "osier", "ought", "our", "out", "ovate", "over", "Ovid", + "owing", "ox", "oxeye", "oxide", "Ozark", "p", "Pablo", "pace", + "pack", "pact", "padre", "pagan", "Paine", "pale", "palm", "pane", + "pansy", "Paoli", "papa", "papaw", "pappy", "parch", "pare", "Paris", + "park", "Parks", "parse", "Paso", "passe", "past", "path", "Patsy", + "Paul", "Pauli", "pax", "PBS", "peace", "peak", "Pease", "peck", + "pedal", "pee", "peek", "peep", "pen", "penny", "pep", "Pepsi", + "Perez", "perk", "Perle", "Perth", "peste", "Pete", "petri", "petty", + "pewee", "PhD", "phi", "phon", "phony", "phyla", "piano", "piece", + "pilot", "pinch", "ping", "pink", "pinto", "pious", "pipe", "pique", + "piss", "pithy", "pity", "pixy", "place", "plain", "plane", "plate", + "Plato", "play", "plaza", "plead", "pluck", "plug", "plump", "plunk", + "plus", "pod", "podia", "Poe", "poesy", "pogo", "poi", "poise", + "poke", "polis", "Polk", "poll", "polo", "Ponce", "pond", "pool", + "poop", "pop", "porch", "pork", "Porte", "Porto", "posh", "posse", + "post", "pour", "pow", "Prado", "Pratt", "pray", "press", "prey", + "price", "pride", "prig", "prime", "prior", "probe", "Prof", "prone", + "p's", "psych", "pub", "puck", "puffy", "Pugh", "pull", "puma", + "pun", "punky", "puny", "pupal", "puppy", "pure", "purl", "pus", + "PVC", "Pyle", "Pyrex", "Qatar", "quack", "quaff", "quash", "queen", + "quell", "query", "queue", "quick", "quill", "quint", "quirt", "quo", + "quote", "rabat", "rabbi", "radar", "radio", "radix", "Rae", "rag", + "rail", "rajah", "Ralph", "Ramo", "ran", "Rand", "randy", "Raoul", + "rape", "rare", "rasp", "rata", "rater", "rave", "raven", "razor", + "R&D", "reach", "ready", "real", "reb", "reck", "reedy", "reek", + "Reese", "regal", "Reid", "relax", "reman", "Rena", "rend", "ret", + "retch", "Rhea", "rheum", "rhino", "Rhoda", "rib", "rice", "rick", + "rid", "rifle", "rig", "rigid", "rill", "rim", "rimy", "rink", + "Rio", "rip", "ripen", "rise", "risk", "rite", "rival", "river", + "road", "roar", "rob", "robe", "robin", "rodeo", "roe", "roil", + "role", "Roman", "Rome", "romp", "roof", "room", "roost", "Rosen", + "rot", "rouge", "round", "rout", "rove", "Roy", "Royce", "r's", + "Ruben", "ruby", "rude", "Rudy", "rug", "rule", "rummy", "run", + "rung", "runt", "rupee", "ruse", "rusk", "Russo", "rusty", "Ruth", + "rutty", "Ryan", "rye", "sa", "sabra", "sad", "sag", "sage", + "sake", "sale", "Salk", "salty", "salve", "Sam", "same", "Samoa", + "sane", "sank", "Santa", "Sao", "sappy", "Sarah", "sari", "satyr", + "Saudi", "Sault", "save", "savvy", "SC", "scald", "scalp", "scarf", + "scat", "SCM", "scold", "scoot", "Scot", "scram", "scrub", "scud", + "scull", "scum", "SD", "seal", "seamy", "sect", "sedge", "seedy", + "seen", "seize", "semi", "sepal", "Sepoy", "septa", "serge", "serif", + "servo", "set", "Seton", "setup", "sewn", "shad", "shag", "shah", + "shaky", "shall", "shank", "shard", "Shari", "shaw", "Shea", "shed", + "sheer", "shied", "shift", "shill", "shin", "shirk", "shish", "shoo", + "shore", "shout", "shrew", "shrub", "shunt", "SIAM", "sib", "sibyl", + "side", "sigh", "sigma", "silk", "silly", "silt", "Simon", "since", + "sinew", "singe", "sinh", "Sioux", "sir", "siva", "sixty", "skeet", + "skew", "skid", "skimp", "skulk", "Skye", "slab", "slag", "slake", + "slap", "slay", "sleep", "sleet", "slick", "slim", "slimy", "slog", + "slosh", "sloth", "slow", "slug", "slum", "slung", "slurp", "sly", + "small", "smile", "smith", "smog", "smoky", "snack", "snark", "sneer", + "snell", "snip", "snoop", "snore", "snow", "snub", "snug", "so", + "soap", "soar", "soft", "soggy", "sold", "sole", "solid", "Solon", + "solve", "some", "son", "sonny", "soon", "sorb", "sore", "sort", + "south", "sow", "spa", "spade", "spare", "spark", "spasm", "spate", + "spawn", "spear", "speed", "spell", "Spica", "spicy", "spiky", "spire", + "Spiro", "splay", "spoil", "spook", "spool", "spore", "spout", "spree", + "sprue", "spur", "spy", "squaw", "s's", "St", "stag", "staid", + "stair", "stale", "stall", "stamp", "stand", "stark", "stash", "state", + "stay", "stead", "steak", "steam", "steed", "Steen", "steer", "stern", + "stew", "stile", "stilt", "stock", "stole", "stone", "stood", "stool", + "stop", "storm", "story", "stove", "strap", "straw", "strip", "strum", + "stud", "study", "stung", "stunt", "Sturm", "styli", "suave", "such", + "sud", "sue", "Suez", "suit", "sulky", "sung", "sunny", "sup", + "supra", "surge", "Sus", "sushi", "swank", "swap", "swear", "swelt", + "swig", "swine", "swish", "swiss", "sword", "swung", "Syria", "syrup", + "tab", "tabu", "tacit", "taffy", "Tahoe", "take", "tale", "talk", + "tamp", "tang", "tango", "tanh", "Tanya", "tap", "tape", "tapir", + "tappa", "tar", "tardy", "tarry", "task", "tasty", "tate", "tawny", + "taxi", "teach", "tease", "tecum", "Telex", "tempt", "tenon", "tense", + "tepid", "terry", "Tess", "Texas", "Thai", "than", "that", "Thea", + "thee", "them", "then", "theta", "they", "thick", "thigh", "thin", + "thing", "third", "three", "threw", "thug", "thus", "ti", "tibet", + "tic", "tid", "tidy", "tied", "tift", "til", "tile", "tilt", + "Timex", "Timon", "tinge", "tipsy", "tire", "tit", "tithe", "title", + "TNT", "toad", "today", "tog", "Togo", "toil", "token", "told", + "tome", "tommy", "tonal", "tong", "Toni", "tonk", "tony", "tool", + "tooth", "top", "tor", "torch", "tori", "torr", "torso", "torus", + "total", "totem", "tout", "tower", "town", "toxin", "track", "Tracy", + "trag", "trail", "trait", "tramp", "trap", "tread", "tree", "trend", + "tress", "trial", "tribe", "trill", "tripe", "troll", "troop", "trout", + "truck", "Trudy", "trunk", "trust", "TRW", "t's", "TTL", "tub", + "tube", "tuck", "Tudor", "tuft", "tulle", "tum", "tuna", "tune", + "tunic", "Turin", "turk", "turn", "tusk", "tutu", "tweak", "twice", + "twill", "twine", "twirl", "twit", "two", "tying", "ugly", "ultra", + "umbra", "uncle", "union", "unite", "upend", "upper", "upset", "Upton", + "urban", "urine", "us", "usage", "use", "USGS", "USIA", "usual", + "usurp", "Utah", "utile", "v", "vade", "vague", "vain", "valid", + "valve", "van", "vase", "vast", "Veda", "veer", "vein", "Vella", + "venom", "Venus", "verb", "Verde", "versa", "vest", "vetch", "vex", + "via", "vicar", "Vichy", "Vida", "vie", "Viet", "vigil", "viii", + "villa", "vise", "visor", "vitae", "Vito", "viva", "vixen", "vocal", + "voice", "Volta", "vowel", "v's", "w", "wack", "wacky", "wad", + "wade", "wafer", "wag", "wah", "wail", "wait", "waive", "waken", + "wale", "wally", "wan", "war", "ward", "ware", "warm", "warp", + "warty", "was", "washy", "water", "watt", "Watts", "way", "Wayne", + "weal", "wean", "wear", "web", "weber", "we'd", "wedge", "weed", + "week", "Wei", "weird", "Welch", "well", "welsh", "wept", "were", + "west", "wet", "wharf", "whee", "whelm", "when", "which", "whim", + "whir", "whisk", "white", "whiz", "whoa", "whole", "whoop", "whop", + "whose", "why", "widen", "widow", "wield", "Wier", "wile", "will", + "Wilma", "wilt", "win", "winch", "wino", "wipe", "wise", "wispy", + "witch", "withy", "witty", "woe", "wok", "wolve", "womb", "Wong", + "Woods", "wool", "wop", "wordy", "work", "worm", "worse", "worst", + "wove", "wow", "wreck", "wrest", "wrist", "Wu", "Wyatt", "Wylie", + "Wyner", "x", "xenon", "x's", "yacht", "Yale", "yam", "yang", + "yarn", "Yates", "year", "yeast", "Yeats", "Yemen", "yield", "yip", + "yodel", "yoga", "yoke", "yore", "you'd", "y's", "Yves", "YWCA", + "Zeiss", "zest", "zig", "zing", "zip", "Zoe", "zoo"}; diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.c b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.c new file mode 100644 index 0000000..8139755 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.c @@ -0,0 +1,157 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_stdlib.c + + Author: Raymond Chen + + Function: This file contains the C standard library functions used by anagram. + + Source: anagram + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ +#include "anagram_stdlib.h" +#include "anagram_strings.h" + +/* Includes anagram_CompareFrequency */ +/* This function is included here because the WCC does not */ +/* support function pointers */ +#include "anagram_compare.h" + +void +anagram_swapi(char *ii, char *ij, unsigned long es) { + char *i, *j, c; + + i = (char *) ii; + j = (char *) ij; + _Pragma("loopbound min 4 max 4") do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof(char); + } + while (es != 0) + ; +} + +char * +anagram_pivot(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + + // Wasm loop bounds + + __attribute__((import_module("__pragma"), + import_name("loopbound"))) extern void + __pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + if (anagram_CompareFrequency(pi, pj) < 0) { + if (anagram_CompareFrequency(pi, pk) < 0) { + if (anagram_CompareFrequency(pj, pk) < 0) + return pj; + return pk; + } + return pi; + } + if (anagram_CompareFrequency(pj, pk) < 0) { + if (anagram_CompareFrequency(pi, pk) < 0) + return pi; + return pk; + } + return pj; +} + +void +anagram_qsorts(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pn; + volatile unsigned int flowfactdummy = 0; + __pragma_loopbound(0, 3); + while (n > 1) { + if (n > 10) + pi = anagram_pivot(a, n, es); + else + pi = a + (n >> 1) * es; + + anagram_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + __pragma_loopbound(0, 10); + while (1) { + /* wcc note: this assignment expression was added to avoid + assignment of multiple loop bound annotations to same loop (cf. + Ticket #0002323). */ + flowfactdummy++; + __pragma_loopbound(1, 6); + do { + pi += es; + } while (pi < pn && anagram_CompareFrequency(pi, a) < 0); + __pragma_loopbound(1, 7); + do { + pj -= es; + } while (pj > a && anagram_CompareFrequency(pj, a) > 0); + if (pj < pi) + break; + anagram_swapi(pi, pj, es); + } + anagram_swapi(a, pj, es); + j = (unsigned long) (pj - a) / es; + n = n - j - 1; + if (j >= n) { + anagram_qsorts(a, j, es); + a += (j + 1) * es; + } else { + anagram_qsorts(a + (j + 1) * es, n, es); + n = j; + } + } +} + +void +anagram_qsort(void *va, unsigned long n, unsigned long es) { + _Pragma("marker call_qsorts") anagram_qsorts((char *) va, n, es); + _Pragma("flowrestriction 1*anagram_qsorts <= 17*call_qsorts"); +} + +/* This must be redefined for each new benchmark */ +#define ANAGRAM_HEAP_SIZE 21000 + +static char anagram_simulated_heap[ANAGRAM_HEAP_SIZE]; +static unsigned int anagram_freeHeapPos; + +void * +anagram_malloc(unsigned int numberOfBytes) { + void *currentPos = (void *) &anagram_simulated_heap[anagram_freeHeapPos]; + /* Get a 4-byte address for alignment purposes */ + // anagram_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int + // )0xfffffffc ); + unsigned int rem = (numberOfBytes & (unsigned int) 0x3); + unsigned int adjustment = rem ? 4 - rem : 0; + anagram_freeHeapPos += numberOfBytes + adjustment; + return currentPos; +} + +void +anagram_bzero(char *p, unsigned long len) { + unsigned long i; + + __pragma_loopbound(8, 800); + for (i = 0; i < len; ++i) { + *p++ = '\0'; + } +} diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.h new file mode 100644 index 0000000..66f9cee --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_stdlib.h @@ -0,0 +1,30 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_stdlib.h + + Author: Raymond Chen + + Function: This header contains some C standard library functions used by + anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_STDLIB_H +#define ANAGRAM_STDLIB_H + +void *anagram_malloc(unsigned int numberOfBytes); + +void anagram_qsort(void *va, unsigned long n, unsigned long es); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_strings.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_strings.h new file mode 100644 index 0000000..4ab920e --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/default/anagram_strings.h @@ -0,0 +1,28 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_strings.h + + Author: Raymond Chen + + Function: This header contains some C standard library functions used by + anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_STRINGS_H +#define ANAGRAM_STRINGS_H + +void anagram_bzero(char *p, unsigned long len); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram.c b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram.c new file mode 100644 index 0000000..bfe55d4 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram.c @@ -0,0 +1,661 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram + + Author: Raymond Chen + + Function: A program that computes anagrams. + + Source: See below. + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See below. + +*/ + +/* + Anagram program by Raymond Chen, + inspired by a similar program by Brian Scearce + + This program is Copyright 1991 by Raymond Chen. + (rjc@math.princeton.edu) + + This program may be freely distributed provided all alterations + to the original are clearly indicated as such. +*/ + +/* There are two tricks. First is the Basic Idea: + + When the user types in a phrase, the phrase is first preprocessed to + determine how many of each letter appears. A bit field is then constructed + dynamically, such that each field is large enough to hold the next power + of two larger than the number of times the character appears. For example, + if the phrase is hello, world, the bit field would be + + 00 00 00 000 000 00 00 + d e h l o r w + + The phrase hello, world, itself would be encoded as + + 01 01 01 011 010 01 01 + d e h l o r w + + and the word hollow would be encoded as + + 00 00 01 010 010 00 01 + d e h l o r w + + The top bit of each field is set in a special value called the sign. + Here, the sign would be + + 10 10 10 100 100 10 10 + d e h l o r w + + + The reason for packing the values into a bit field is that the operation + of subtracting out the letters of a word from the current phrase can be + carried out in parallel. for example, subtracting the word hello from + the phrase hello, world, is merely + + d e h l o r w + 01 01 01 011 010 01 01 (dehllloorw) + - 00 00 01 010 010 00 01 (hlloow) + ======================== + 01 01 00 001 000 01 00 (delr) + + Since none of the sign bits is set, the word fits, and we can continue. + Suppose the next word we tried was hood. + + d e h l o r w + 01 01 00 001 000 01 00 (delr) + - 01 00 01 000 010 00 00 (hood) + ======================== + 00 00 11 000 110 01 00 + ^ ^ + A sign bit is set. (Two, actually.) This means that hood does not + fit in delr, so we skip it and try another word. (Observe that + when a sign bit becomes set, it screws up the values for the letters to + the left of that bit, but that's not important.) + + The inner loop of an anagram program is testing to see if a + word fits in the collection of untried letters. Traditional methods + keep an array of 26 integers, which are then compared in turn. This + means that there are 26 comparisons per word. + + This method reduces the number of comparisons to MAX_QUAD, typically 2. + Instead of looping through an array, we merely perform the indicated + subtraction and test if any of the sign bits is set. +*/ + +/* The nuts and bolts: + + The dictionary is loaded and preprocessed. The preprocessed dictionary + is a concatenation of copies of the structure: + + struct dictword { + char bStructureSize; -- size of this structure + char cLetters; -- number of letters in the word + char achWord[]; -- the word itself (0-terminated) + } + + Since this is a variable-sized structure, we keep its size in the structure + itself for rapid stepping through the table. + + When a phrase is typed in, it is first preprocessed as described in the + Basic Idea. We then go through the dictionary, testing each word. If + the word fits in our phrase, we build the bit field for its frequency + table and add it to the list of candidates. +*/ + +/* + The Second Trick: + + Before diving into our anagram search, we then tabulate how many times + each letter appears in our list of candidates, and sort the table, with + the rarest letter first. + + We then do our anagram search. + + Like most anagram programs, this program does a depth-first search. + Although most anagram programs do some sort of heuristics to decide what + order to place words in the list_of_candidates, the search itself proceeds + according to a greedy algorithm. That is, once you find a word that fits, + subtract it and recurse. + + This anagram program exercises some restraint and does not march down + every branch that shows itself. Instead, it only goes down branches + that use the rarest unused letter. This helps to find dead ends faster. + + FindAnagram(unused_letters, list_of_candidates) { + l = the rarest letter as yet unused + For word in list_of_candidates { + if word does not fit in unused_letters, go on to the next word. + if word does not contain l, defer. + FindAnagram(unused_letters - word, list_of_candidates[word,...]) + } + } + + + The heuristic of the Second Trick can probably be improved. I invite + anyone willing to improve it to do so. +*/ + +/* Before compiling, make sure Quad and MASK_BITS are set properly. For best + results, make Quad the largest integer size supported on your machine. + So if your machine has long longs, make Quad an unsigned long long. + (I called it Quad because on most machines, the largest integer size + supported is a four-byte unsigned long.) + + If you need to be able to anagram larger phrases, increase MAX_QUADS. + If you increase it beyond 4, you'll have to add a few more loop unrolling + steps to FindAnagram. +*/ +#include "anagram_ctype.h" +#include "anagram_stdlib.h" +#include "anagram_strings.h" + +#include "anagram_compare.h" + +/* + Defines +*/ + +// Wasm loop bounds + + +#include "anagram_input.c" +#include "anagram_stdlib.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define anagram_DICTWORDS 2279 +#define anagram_MASK_BITS 32 /* number of bits in a Quad */ +#define anagram_MAX_QUADS 2 /* controls largest phrase */ +#define anagram_MAXCAND 100 /* candidates */ +#define anagram_MAXSOL 51 /* words in the solution */ +#define anagram_ALPHABET 26 /* letters in the alphabet */ + +#define anagram_OneStep(i) \ + if ((aqNext[i] = pqMask[i] - pw->aqMask[i]) & anagram_aqMainSign[i]) { \ + ppwStart++; \ + continue; \ + } + +/* + Type definitions +*/ + +typedef unsigned int anagram_Quad; /* for building our bit mask */ + +/* A Word remembers the information about a candidate word. */ +typedef struct { + char *pchWord; /* the word itself */ + anagram_Quad aqMask[anagram_MAX_QUADS]; /* the word's mask */ + unsigned cchLength; /* letters in the word */ + char padding[4]; +} anagram_Word; +typedef anagram_Word *anagram_PWord; +typedef anagram_Word **anagram_PPWord; + +/* A Letter remembers information about each letter in the phrase to + be anagrammed. */ +typedef struct { + unsigned uFrequency; /* how many times it appears */ + unsigned uShift; /* how to mask */ + unsigned uBits; /* the bit mask itself */ + unsigned iq; /* which Quad to inspect? */ +} anagram_Letter; +typedef anagram_Letter *anagram_PLetter; + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void anagram_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +anagram_main(void); +__attribute__((always_inline)) static inline int anagram_return(void); +__attribute__((always_inline)) static inline int anagram_ch2i(int ch); +__attribute__((always_inline)) static inline void anagram_AddWords(void); +__attribute__((always_inline)) static inline void +anagram_BuildMask(char const *pchPhrase); +__attribute__((always_inline)) static inline void +anagram_BuildWord(char *pchWord); +__attribute__((always_inline)) static inline void anagram_DumpWords(void); +__attribute__((always_inline)) static inline void +anagram_FindAnagram(anagram_Quad *pqMask, anagram_PPWord ppwStart, int iLetter); +__attribute__((always_inline)) static inline anagram_PWord +anagram_NewWord(void); +__attribute__((always_inline)) static inline anagram_PWord +anagram_NextWord(void); +__attribute__((always_inline)) static inline void anagram_ReadDict(void); +__attribute__((always_inline)) static inline void anagram_Reset(void); +__attribute__((always_inline)) static inline void anagram_SortCandidates(void); + +/* + Declaration of global variables +*/ + +extern char const *anagram_achPhrase[3]; +extern char const *anagram_dictionary[anagram_DICTWORDS]; + +/* candidates we've found so far */ +static anagram_PWord anagram_apwCand[anagram_MAXCAND]; +/* how many of them? */ +static unsigned anagram_cpwCand; + +/* statistics on the current phrase */ +static anagram_Letter anagram_alPhrase[anagram_ALPHABET]; + +/* number of letters in phrase */ +static int anagram_cchPhraseLength; + +/* the bit field for the full phrase */ +static anagram_Quad anagram_aqMainMask[anagram_MAX_QUADS]; +/* where the sign bits are */ +static anagram_Quad anagram_aqMainSign[anagram_MAX_QUADS]; + +static const int anagram_cchMinLength = 3; + +/* auGlobalFrequency counts the number of times each letter appears, + summed over all candidate words. This is used to decide which letter + to attack first. */ +static unsigned anagram_auGlobalFrequency[anagram_ALPHABET]; +static int anagram_achByFrequency[anagram_ALPHABET]; /* for sorting */ + +/* the dictionary is read here */ +static char *anagram_pchDictionary; + +/* the answers */ +static anagram_PWord anagram_apwSol[anagram_MAXSOL]; +static int anagram_cpwLast; + +/* buffer to write an answer */ +static char anagram_buffer[30]; + +/* + Initialization- and return-value-related functions +*/ + +/* ReadDict -- read the dictionary file into memory and preprocess it + + A word of length cch in the dictionary is encoded as follows: + + byte 0 = cch + 3 + byte 1 = number of letters in the word + byte 2... = the word itself, null-terminated + + Observe that cch+3 is the length of the total encoding. These + byte streams are concatenated, and terminated with a 0. +*/ +__attribute__((always_inline)) static inline void +anagram_ReadDict(void) { + char *pch; + char *pchBase; + unsigned len; + unsigned cWords = 0; + unsigned cLetters; + int i; + volatile char bitmask = 0; + + len = 0; + __pragma_loopbound(2279, 2279); + for (i = 0; i < anagram_DICTWORDS; i++) { + unsigned strlen = 0; + __pragma_loopbound(1, 5); + while (anagram_dictionary[i][strlen] != 0) + strlen++; + len += strlen + 3; + } + + len++; + pchBase = anagram_pchDictionary = (char *) anagram_malloc(len); + + __pragma_loopbound(2279, 2279); + for (i = 0; i < anagram_DICTWORDS; i++) { + int index = 0; + pch = pchBase + 2; /* reserve for length */ + cLetters = 0; + + __pragma_loopbound(1, 5); + while (anagram_dictionary[i][index] != '\0') { + if (anagram_isalpha(anagram_dictionary[i][index])) + cLetters++; + *pch++ = anagram_dictionary[i][index]; + index++; + *(pch - 1) ^= bitmask; + } + *pch++ = '\0'; + *pchBase = (char) (pch - pchBase); + pchBase[1] = (char) cLetters; + pchBase = pch; + cWords++; + } + + *pchBase++ = 0; +} + +__attribute__((always_inline)) static inline void +anagram_init(void) { + anagram_ReadDict(); +} + +__attribute__((always_inline)) static inline int +anagram_return(void) { + int i; + char const *answer = "duke yip arm"; + + _Pragma( + "loopbound min 12 max 12") for (i = 0; i < 12; + i++) if (answer[i] != + anagram_buffer[i]) return 1; + + return 0; +} + +/* + Core benchmark functions +*/ + +/* convert letter to index */ +__attribute__((always_inline)) static inline int +anagram_ch2i(int ch) { + return ch - 'a'; +} + +__attribute__((always_inline)) static inline int +anagram_CompareFrequency(char *pch1, char *pch2) { + return anagram_auGlobalFrequency[(*(int *) pch1)] < + anagram_auGlobalFrequency[(*(int *) pch2)] + ? -1 + : anagram_auGlobalFrequency[(*(int *) pch1)] == + anagram_auGlobalFrequency[(*(int *) pch2)] + ? 0 + : 1; +} + +__attribute__((always_inline)) static inline void +anagram_Reset(void) { + anagram_bzero((char *) anagram_alPhrase, + sizeof(anagram_Letter) * anagram_ALPHABET); + anagram_bzero((char *) anagram_aqMainMask, + sizeof(anagram_Quad) * anagram_MAX_QUADS); + anagram_bzero((char *) anagram_aqMainSign, + sizeof(anagram_Quad) * anagram_MAX_QUADS); + anagram_bzero((char *) anagram_auGlobalFrequency, + sizeof(unsigned) * anagram_ALPHABET); + anagram_bzero((char *) anagram_achByFrequency, + sizeof(int) * anagram_ALPHABET); + anagram_bzero((char *) anagram_apwCand, + sizeof(anagram_PWord) * anagram_MAXCAND); + anagram_cchPhraseLength = 0; + anagram_cpwCand = 0; +} + +__attribute__((always_inline)) static inline void +anagram_BuildMask(char const *pchPhrase) { + int i; + int ch; + unsigned iq; /* which Quad? */ + unsigned int cbtUsed; /* bits used in the current Quad */ + unsigned int cbtNeed; /* bits needed for current letter */ + anagram_Quad qNeed; /* used to build the mask */ + + /* Tabulate letter frequencies in the phrase */ + anagram_cchPhraseLength = 0; + __pragma_loopbound(11, 11); + while ((ch = *pchPhrase++) != '\0') { + if (anagram_isalpha(ch)) { + ch = anagram_tolower(ch); + anagram_alPhrase[anagram_ch2i(ch)].uFrequency++; + anagram_cchPhraseLength++; + } + } + + /* Build masks */ + iq = 0; /* which quad being used */ + cbtUsed = 0; /* bits used so far */ + + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) { + if (anagram_alPhrase[i].uFrequency == 0) { + anagram_auGlobalFrequency[i] = ~0u; /* to make it sort last */ + } else { + anagram_auGlobalFrequency[i] = 0u; + _Pragma( + "loopbound min 1 max 2") for (cbtNeed = 1, qNeed = 1; + anagram_alPhrase[i].uFrequency >= + qNeed; + cbtNeed++, qNeed <<= 1); + if (cbtUsed + cbtNeed > anagram_MASK_BITS) + cbtUsed = 0; + anagram_alPhrase[i].uBits = qNeed - 1; + if (cbtUsed) + qNeed <<= cbtUsed; + anagram_aqMainSign[iq] |= qNeed; + anagram_aqMainMask[iq] |= + (anagram_Quad) anagram_alPhrase[i].uFrequency << cbtUsed; + anagram_alPhrase[i].uShift = cbtUsed; + anagram_alPhrase[i].iq = iq; + cbtUsed += cbtNeed; + } + } +} + +__attribute__((always_inline)) static inline anagram_PWord +anagram_NewWord(void) { + anagram_PWord pw; + + pw = (anagram_Word *) anagram_malloc(sizeof(anagram_Word)); + return pw; +} + +/* NextWord -- get another candidate entry, creating if necessary */ +__attribute__((always_inline)) static inline anagram_PWord +anagram_NextWord(void) { + anagram_PWord pw; + pw = anagram_apwCand[anagram_cpwCand++]; + if (pw != 0) + return pw; + anagram_apwCand[anagram_cpwCand - 1] = anagram_NewWord(); + return anagram_apwCand[anagram_cpwCand - 1]; +} + +/* BuildWord -- build a Word structure from an ASCII word + If the word does not fit, then do nothing. */ +__attribute__((always_inline)) static inline void +anagram_BuildWord(char *pchWord) { + unsigned char cchFrequency[anagram_ALPHABET]; + int i; + char *pch = pchWord; + anagram_PWord pw; + unsigned int cchLength = 0; + + anagram_bzero((char *) cchFrequency, + sizeof(unsigned char) * anagram_ALPHABET); + + /* Build frequency table */ + __pragma_loopbound(3, 5); + while ((i = *pch++) != '\0') { + if (!anagram_isalpha(i)) + continue; + i = anagram_ch2i(anagram_tolower(i)); + if (++cchFrequency[i] > anagram_alPhrase[i].uFrequency) + return; + ++cchLength; + } + + /* Update global count */ + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) + anagram_auGlobalFrequency[i] += cchFrequency[i]; + + /* Create a Word structure and fill it in, including building the + bitfield of frequencies. */ + pw = anagram_NextWord(); + anagram_bzero((char *) (pw->aqMask), + sizeof(anagram_Quad) * anagram_MAX_QUADS); + + pw->pchWord = pchWord; + pw->cchLength = cchLength; + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) { + pw->aqMask[anagram_alPhrase[i].iq] |= (anagram_Quad) cchFrequency[i] + << anagram_alPhrase[i].uShift; + } +} + +/* AddWords -- build the list of candidates */ +__attribute__((always_inline)) static inline void +anagram_AddWords(void) { + char *pch = anagram_pchDictionary; /* walk through the dictionary */ + + anagram_cpwCand = 0; + + __pragma_loopbound(1967, 1967); + while (*pch) { + if ((pch[1] >= anagram_cchMinLength && + pch[1] + anagram_cchMinLength <= anagram_cchPhraseLength) || + pch[1] == anagram_cchPhraseLength) + anagram_BuildWord(pch + 2); + pch += *pch; + } +} + +__attribute__((always_inline)) static inline void +anagram_DumpWords(void) { + int i, j; + int offset = 0; + __pragma_loopbound(3, 3); + for (i = 0; i < anagram_cpwLast; i++) { + __pragma_loopbound(3, 5); + for (j = 0; anagram_apwSol[i]->pchWord[j] != '\0'; j++) + anagram_buffer[offset + j] = anagram_apwSol[i]->pchWord[j]; + offset += j; + + anagram_buffer[offset++] = ' '; + } + anagram_buffer[offset++] = '\0'; +} + +__attribute__((always_inline)) static inline void +anagram_FindAnagram(anagram_Quad *pqMask, anagram_PPWord ppwStart, + int iLetter) { + anagram_Quad aqNext[anagram_MAX_QUADS]; + register anagram_PWord pw; + anagram_Quad qMask; + unsigned iq; + anagram_PPWord ppwEnd = &anagram_apwCand[0]; + ppwEnd += anagram_cpwCand; + + __pragma_loopbound(0, 6); + while (1) { + iq = anagram_alPhrase[anagram_achByFrequency[iLetter]].iq; + qMask = anagram_alPhrase[anagram_achByFrequency[iLetter]].uBits + << anagram_alPhrase[anagram_achByFrequency[iLetter]].uShift; + if (pqMask[iq] & qMask) + break; + iLetter++; + } + + __pragma_loopbound(0, 11); + while (ppwStart < ppwEnd) { + pw = *ppwStart; + +#if anagram_MAX_QUADS > 0 + anagram_OneStep(0); +#endif + +#if anagram_MAX_QUADS > 1 + anagram_OneStep(1); +#endif + +#if anagram_MAX_QUADS > 2 + anagram_OneStep(2); +#endif + +#if anagram_MAX_QUADS > 3 + anagram_OneStep(3); +#endif + +#if anagram_MAX_QUADS > 4 + @@"Add more unrolling steps here, please." @ @ +#endif + + /* If the pivot letter isn't present, defer this word until later */ + if ((pw->aqMask[iq] & qMask) == 0) { + *ppwStart = *(--ppwEnd); + *ppwEnd = pw; + continue; + } + + /* If we get here, this means the word fits. */ + anagram_apwSol[anagram_cpwLast++] = pw; + if (anagram_cchPhraseLength -= pw->cchLength) { /* recurse */ + /* The recursive call scrambles the tail, so we have to be + pessimistic. */ + ppwEnd = &anagram_apwCand[0]; + ppwEnd += anagram_cpwCand; + anagram_FindAnagram(&aqNext[0], ppwStart, iLetter); + } else /* found one */ + anagram_DumpWords(); + anagram_cchPhraseLength += pw->cchLength; + --anagram_cpwLast; + ppwStart++; + continue; + } +} + +__attribute__((always_inline)) static inline void +anagram_SortCandidates(void) { + int i; + + /* Sort the letters by frequency */ + __pragma_loopbound(26, 26); + for (i = 0; i < anagram_ALPHABET; i++) + anagram_achByFrequency[i] = i; + anagram_qsort(anagram_achByFrequency, anagram_ALPHABET, sizeof(int)); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +anagram_main(void) { + int i; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + anagram_Reset(); + anagram_BuildMask(anagram_achPhrase[i]); + anagram_AddWords(); + if (anagram_cpwCand == 0 || anagram_cchPhraseLength == 0) + continue; + + anagram_cpwLast = 0; + anagram_SortCandidates(); + _Pragma("marker call_find") + anagram_FindAnagram(anagram_aqMainMask, anagram_apwCand, 0); + _Pragma("flowrestriction 1*anagram_FindAnagram <= 51*call_find"); + } +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + anagram_init(); + anagram_main(); + + return anagram_return(); +} diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_compare.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_compare.h new file mode 100644 index 0000000..62510d8 --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_compare.h @@ -0,0 +1,28 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_compare.h + + Author: Raymond Chen + + Function: This header contains the comparison functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_COMPARE_H +#define ANAGRAM_COMPARE_H + +__attribute__((always_inline)) static inline int +anagram_CompareFrequency(char *pch1, char *pch2); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_ctype.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_ctype.h new file mode 100644 index 0000000..8708a5e --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_ctype.h @@ -0,0 +1,45 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_ctype.h + + Author: Raymond Chen + + Function: This header contains some C library functions used by anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_CTYPE_H +#define ANAGRAM_CTYPE_H + +__attribute__((always_inline)) static inline int +anagram_islower(int c) { + return 'a' <= c && c <= 'z'; +} + +__attribute__((always_inline)) static inline int +anagram_isupper(int c) { + return 'A' <= c && c <= 'Z'; +} + +__attribute__((always_inline)) static inline int +anagram_isalpha(int c) { + return anagram_isupper(c) || anagram_islower(c); +} + +__attribute__((always_inline)) static inline int +anagram_tolower(int c) { + return anagram_isupper(c) ? c + ('a' - 'A') : c; +} + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_input.c b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_input.c new file mode 100644 index 0000000..8bfddaf --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_input.c @@ -0,0 +1,320 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_input.c + + Author: Raymond Chen + + Function: This file contains the input data used by anagram. + + Source: anagram + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +/* + Forward declaration of global variables +*/ + +extern char const *anagram_achPhrase[3]; +extern char const *anagram_dictionary[2279]; + +/* + Definition of global variables +*/ +char const *anagram_achPhrase[3] = {"todd austin", "john alledy", + "mary updike"}; + +char const *anagram_dictionary[2279] = { + "2nd", "4th", "8th", "a", "ABA", "aback", "abash", "abbas", + "abbey", "abed", "abet", "abort", "abut", "Accra", "ACM", "acorn", + "Acts", "Ada", "adapt", "added", "addle", "Adele", "Aden", "admix", + "adore", "adult", "affix", "afire", "aft", "agate", "agave", "Agee", + "agent", "agile", "Agnew", "agone", "ahoy", "Aida", "aim", "Ainu", + "airy", "Ajax", "Alamo", "alarm", "alb", "Alcoa", "alder", "Aleck", + "alert", "algae", "alia", "alike", "alive", "allay", "alley", "Allis", + "allow", "ally", "Allyn", "aloe", "aloha", "along", "aloud", "also", + "alter", "Alton", "Alva", "amaze", "amber", "ami", "amigo", "amiss", + "Amman", "Amoco", "amok", "Amos", "ample", "amra", "amy", "Andes", + "angel", "Angie", "angry", "Angus", "Anne", "annex", "annoy", "annul", + "ante", "any", "apex", "apple", "apron", "apt", "arch", "argue", + "Aries", "arm", "army", "aroma", "array", "arrow", "Artie", "arty", + "arum", "a's", "ash", "ashen", "ashy", "askew", "assai", "Assam", + "Astor", "ate", "atlas", "atone", "audit", "Aug", "augur", "auk", + "aural", "avid", "avoid", "avow", "awash", "awe", "awn", "awry", + "axe", "axial", "axis", "axon", "Ayers", "Aztec", "b", "babe", + "Bach", "bad", "bait", "baldy", "balm", "balsa", "bam", "ban", + "bane", "banjo", "barb", "barn", "baron", "basal", "Basel", "basil", + "bassi", "baste", "batch", "Bates", "batik", "Bator", "bawd", "bay", + "bayed", "bayou", "be", "beak", "bean", "beard", "beat", "beck", + "Becky", "bed", "bedim", "bee", "beech", "beep", "beet", "befit", + "beg", "begin", "beige", "Bela", "belch", "belt", "beman", "bench", + "Benny", "bent", "Benz", "berth", "beset", "bet", "betel", "Bette", + "bevy", "Bible", "bide", "big", "bile", "bilk", "binge", "bit", + "bite", "black", "blanc", "bland", "blare", "blat", "blaze", "bled", + "blest", "blind", "Blinn", "bliss", "blitz", "blob", "blond", "blood", + "bloom", "blot", "blown", "blue", "bluff", "Blum", "blur", "board", + "boat", "bock", "bog", "bogy", "boil", "Boise", "bomb", "bon", + "bong", "bonus", "bonze", "booby", "book", "booky", "boon", "booze", + "bore", "Boris", "boron", "Bosch", "bosom", "bound", "bourn", "bowel", + "boy", "Boyce", "bract", "Brady", "brag", "brake", "brant", "brass", + "Braun", "bravo", "bread", "bream", "breve", "brew", "briar", "Brice", + "brief", "bring", "briny", "broad", "broth", "brunt", "BSTJ", "bub", + "buck", "Budd", "buddy", "Buick", "built", "bulge", "bulky", "bum", + "bump", "bunch", "bundy", "bunk", "Burch", "burg", "burl", "Burma", + "burnt", "Burr", "bury", "bush", "bushy", "bust", "busy", "butte", + "butyl", "buyer", "by", "bylaw", "Byrd", "byte", "cab", "cable", + "cacao", "cacti", "Cairo", "Caleb", "call", "calm", "canal", "canoe", + "canon", "can't", "cap", "caper", "capo", "card", "Carey", "Carib", + "Carla", "carol", "carve", "cash", "caste", "catch", "cater", "caulk", + "cause", "CBS", "cedar", "cent", "Cetus", "Chad", "chaff", "chair", + "champ", "char", "chasm", "chaw", "cheat", "cheer", "chef", "Chen", + "chew", "chick", "chief", "Chile", "chill", "chine", "chip", "chock", + "choir", "chomp", "chose", "Chris", "chuff", "chum", "chump", "CIA", + "cinch", "cite", "city", "clad", "clan", "clank", "Clara", "Claus", + "claw", "clean", "cleat", "clerk", "clime", "cling", "clink", "Clio", + "clod", "clomp", "cloth", "clove", "cluck", "clump", "clung", "Clyde", + "cobra", "coco", "coda", "Cody", "Cohn", "coin", "col", "Colby", + "coney", "Congo", "cony", "cool", "coon", "copra", "copy", "Corey", + "corn", "corps", "cos", "cosy", "couch", "cough", "count", "coup", + "cove", "cowry", "coy", "CPA", "crack", "craft", "Craig", "crank", + "crash", "crate", "crawl", "craze", "creak", "cream", "credo", "creek", + "Creon", "crept", "crest", "crew", "crib", "crime", "crimp", "crisp", + "crock", "croft", "crone", "crook", "crowd", "CRT", "crumb", "crump", + "crush", "crux", "cub", "cube", "cuff", "cup", "Cupid", "cur", + "curb", "curie", "cusp", "cute", "cycad", "cynic", "d", "daffy", + "dairy", "daisy", "dally", "dame", "Damon", "Dan", "dance", "Dane", + "dank", "Dante", "Dar", "darn", "dart", "dash", "davit", "day", + "De", "deaf", "deal", "death", "debit", "Dec", "decal", "Dee", + "Deere", "deify", "deity", "Della", "delta", "demur", "den", "Denny", + "dense", "deny", "depth", "desk", "deus", "devil", "dewar", "Dhabi", + "diary", "dick", "dicta", "did", "die", "Diego", "diety", "dill", + "din", "dine", "dirty", "disc", "ditch", "dive", "DNA", "dock", + "Dodd", "doff", "dogma", "dolce", "doll", "dolly", "done", "door", + "dope", "Doric", "dose", "dote", "doubt", "Doug", "dove", "dowel", + "doze", "Dr", "Draco", "drama", "drape", "drawl", "dread", "dreg", + "dress", "drew", "drib", "drier", "drill", "drip", "dross", "drown", + "druid", "drunk", "dry", "du", "Duane", "ducat", "duct", "duel", + "duff", "Duffy", "Dugan", "duke", "dull", "dulse", "duly", "dump", + "dumpy", "dunce", "dunk", "dupe", "dusky", "dwarf", "dwelt", "Dwyer", + "dyer", "Dyke", "dyne", "each", "eager", "ear", "earn", "ease", + "eat", "eater", "Eben", "Ecole", "Eden", "edge", "edgy", "edict", + "Edith", "EDT", "eel", "eft", "egg", "Egypt", "eject", "el", + "elan", "elate", "elect", "elfin", "elide", "elk", "Ella", "Ellis", + "Elmer", "else", "Elton", "elude", "elves", "ember", "Emile", "Emory", + "Eng", "Engle", "Enid", "Enos", "enter", "envoy", "epoxy", "equal", + "erase", "ere", "erg", "Erich", "Ernst", "Eros", "err", "Errol", + "Ervin", "e's", "essay", "ester", "Ethan", "Ethel", "ethic", "ethos", + "etude", "Eva", "Evans", "event", "evict", "exact", "exam", "excel", + "exit", "eye", "f", "Faber", "fable", "facet", "fad", "faery", + "fag", "fail", "faint", "fairy", "fake", "fang", "fare", "faro", + "fatal", "fatty", "fault", "faun", "Faust", "fay", "FBI", "fee", + "feed", "feign", "Felix", "Fermi", "ferry", "fest", "fetch", "fetus", + "few", "fiend", "fiery", "fifth", "fig", "fight", "filet", "film", + "finch", "fine", "finny", "fire", "first", "fish", "Fisk", "fist", + "Fitch", "flack", "flak", "flaky", "flame", "flank", "flare", "flat", + "flax", "flea", "fled", "flee", "fleet", "flint", "flit", "flock", + "flog", "flow", "Floyd", "flub", "fluke", "flute", "Flynn", "FM", + "foal", "focal", "Foley", "folk", "fond", "food", "foot", "fop", + "fore", "forge", "form", "fort", "forth", "forty", "Foss", "foul", + "fowl", "FPC", "frame", "Franz", "Frau", "fray", "freed", "fresh", + "friar", "fro", "frog", "from", "frost", "frown", "fry", "fuel", + "full", "fun", "fur", "furry", "fussy", "g", "gaff", "gag", + "Gail", "Galen", "gall", "game", "gamma", "gap", "gar", "garb", + "gas", "gasp", "gate", "gauge", "gaur", "gavel", "gawk", "gay", + "gecko", "gel", "gem", "Gemma", "gene", "genie", "genre", "genus", + "germ", "Gerry", "get", "giant", "gibby", "gig", "gild", "gilt", + "gin", "Gino", "given", "glare", "gleam", "glee", "glib", "glint", + "gloat", "glow", "glut", "GMT", "gnaw", "gnome", "GNP", "god", + "Goff", "gogo", "golf", "Goode", "goof", "goose", "gore", "gory", + "got", "gourd", "GPO", "grace", "Graff", "grape", "grasp", "grate", + "gravy", "graze", "grebe", "greed", "Greek", "Gregg", "grew", "grid", + "grime", "Grimm", "gripe", "grit", "groan", "gross", "grout", "grow", + "grown", "grub", "grunt", "GSA", "guano", "guess", "guide", "guile", + "guise", "gules", "gull", "gulp", "gumbo", "gun", "gunky", "guru", + "gush", "gust", "gusto", "guy", "Gwyn", "gyp", "gyro", "Habib", + "hack", "had", "Hades", "Hagen", "Hahn", "haiku", "hale", "halma", + "ham", "Haney", "Hans", "hard", "hare", "hark", "harm", "harsh", + "haste", "hasty", "hatch", "hater", "hawk", "Haydn", "hazel", "he", + "Healy", "hear", "heart", "heave", "heavy", "hedge", "heel", "hefty", + "Heinz", "held", "he'll", "hemp", "hertz", "hew", "hex", "hi", + "hick", "Hicks", "hike", "hilum", "hind", "hip", "hippy", "hire", + "his", "hive", "hobby", "hoc", "Hoff", "hogan", "Hokan", "hole", + "Holm", "holt", "home", "homo", "hondo", "hood", "hook", "hoop", + "hoot", "hope", "horn", "hose", "hot", "hound", "hovel", "how", + "howdy", "hub", "hubby", "hue", "huff", "huge", "huh", "hull", + "human", "Hun", "hung", "hunk", "hurt", "hurty", "hutch", "hydra", + "hyena", "hymen", "i", "ibid", "IBM", "icon", "I'd", "Idaho", + "ideal", "idiot", "idol", "IEEE", "iffy", "igloo", "iii", "ileum", + "Iliad", "ill", "Ilona", "image", "in", "inapt", "Inca", "incur", + "India", "inert", "infer", "infra", "Inman", "inn", "input", "ionic", + "Iowa", "ipso", "IR", "Iran", "irate", "Irene", "Irish", "Irma", + "is", "Ising", "Islam", "isle", "Italy", "it'd", "Ito", "iv", + "ivy", "j", "JACM", "jag", "James", "Jane", "Janos", "Japan", + "Jason", "jaw", "jean", "jeep", "Jeres", "jerky", "jess", "jet", + "jewel", "jig", "jilt", "Jo", "job", "jog", "join", "joke", + "jolt", "Jonas", "joule", "joust", "joy", "Juan", "judge", "judo", + "Judy", "juju", "juke", "julep", "jump", "junco", "junky", "junta", + "jure", "jut", "Kafka", "kapok", "Karp", "Kathy", "Kay", "Keats", + "keel", "keg", "kelly", "Kemp", "Kent", "Kenya", "kerry", "Kevin", + "keyed", "khaki", "Khmer", "kick", "Kiev", "kin", "Kiowa", "kirk", + "kiss", "kite", "kiva", "Klan", "Kline", "knee", "Knott", "Knox", + "koala", "Kong", "Korea", "kraft", "kraut", "Kuhn", "Kurd", "lac", + "lack", "lad", "ladle", "lag", "lain", "laity", "lam", "lame", + "lamp", "lance", "lane", "Lange", "Laos", "lapel", "lard", "Lares", + "Lars", "last", "late", "Latin", "latus", "law", "lay", "layup", + "lazy", "leach", "leafy", "leak", "leapt", "learn", "leash", "leave", + "ledge", "leech", "left", "leg", "leggy", "Leila", "lemma", "Lena", + "lens", "Leo", "Leona", "lest", "level", "levy", "lewd", "liar", + "lice", "lick", "lie", "lien", "life", "lift", "liken", "lilac", + "Lilly", "lily", "limb", "limit", "line", "lingo", "link", "Linus", + "Lise", "lisp", "live", "livre", "load", "loam", "loan", "lob", + "lobby", "local", "lock", "Loeb", "Logan", "logic", "loin", "Loki", + "loll", "Lomb", "long", "loon", "loose", "loot", "lope", "lord", + "Loren", "lose", "lossy", "Lotte", "loud", "lousy", "low", "Lowe", + "loy", "l's", "LTV", "Lucas", "lucky", "luge", "Luis", "lumen", + "lumpy", "lunar", "Lund", "Lura", "lure", "lurk", "lusty", "Lydia", + "lying", "Lynn", "Lyon", "Lyra", "m", "Mabel", "mace", "macho", + "macro", "madam", "magi", "magna", "mail", "main", "make", "Malay", + "male", "mall", "malt", "mamma", "mane", "mania", "manic", "manna", + "Mans", "Mao", "map", "mar", "Mardi", "maria", "Marin", "Mario", + "Mars", "Mary", "mask", "mast", "mat", "mate", "mater", "matte", + "maul", "Mavis", "maxim", "Maya", "Mayer", "Mayo", "mayst", "maze", + "me", "meal", "meaty", "media", "meet", "meld", "melt", "men", + "Menlo", "merge", "Merle", "merry", "mesh", "messy", "metro", "mew", + "Meyer", "mezzo", "mica", "midst", "mien", "mig", "mila", "milk", + "Mills", "milt", "Mimi", "mince", "mine", "mini", "mink", "minor", + "minot", "minus", "Mira", "mire", "mirth", "Missy", "misty", "mite", + "mitre", "mixup", "mob", "Mobil", "mock", "model", "Moen", "Mohr", + "moist", "molar", "mole", "month", "moody", "Moore", "moral", "Moran", + "morn", "Moser", "moss", "most", "motel", "moth", "motif", "motor", + "motto", "mousy", "Moyer", "Mrs", "m's", "mud", "muggy", "Muir", + "mulch", "mule", "mull", "mum", "mummy", "muon", "mural", "murre", + "mushy", "musk", "must", "Muzo", "my", "Myers", "mynah", "Myra", + "NAACP", "Nagy", "naive", "name", "Nancy", "nap", "nary", "nasal", + "natal", "NATO", "navy", "Nazi", "NBC", "NCR", "ne", "near", + "neath", "Ned", "need", "needy", "Nehru", "Nell", "neon", "Nero", + "net", "Neva", "neve", "new", "nice", "niche", "Niger", "night", + "Nikko", "Nile", "Niobe", "nitty", "NJ", "no", "Noah", "Nobel", + "nodal", "noise", "Nolan", "nolo", "noon", "nor", "nose", "notch", + "Nov", "now", "n's", "NTIS", "nude", "numb", "nurse", "NY", + "oaf", "oaken", "oar", "oasis", "oath", "obey", "objet", "ocean", + "Oct", "ode", "o'er", "off", "often", "ogle", "Okay", "old", + "oldy", "olive", "Olson", "omit", "once", "only", "onset", "onus", + "onyx", "ooze", "opera", "opium", "opt", "opus", "orb", "Orin", + "Orion", "osier", "ought", "our", "out", "ovate", "over", "Ovid", + "owing", "ox", "oxeye", "oxide", "Ozark", "p", "Pablo", "pace", + "pack", "pact", "padre", "pagan", "Paine", "pale", "palm", "pane", + "pansy", "Paoli", "papa", "papaw", "pappy", "parch", "pare", "Paris", + "park", "Parks", "parse", "Paso", "passe", "past", "path", "Patsy", + "Paul", "Pauli", "pax", "PBS", "peace", "peak", "Pease", "peck", + "pedal", "pee", "peek", "peep", "pen", "penny", "pep", "Pepsi", + "Perez", "perk", "Perle", "Perth", "peste", "Pete", "petri", "petty", + "pewee", "PhD", "phi", "phon", "phony", "phyla", "piano", "piece", + "pilot", "pinch", "ping", "pink", "pinto", "pious", "pipe", "pique", + "piss", "pithy", "pity", "pixy", "place", "plain", "plane", "plate", + "Plato", "play", "plaza", "plead", "pluck", "plug", "plump", "plunk", + "plus", "pod", "podia", "Poe", "poesy", "pogo", "poi", "poise", + "poke", "polis", "Polk", "poll", "polo", "Ponce", "pond", "pool", + "poop", "pop", "porch", "pork", "Porte", "Porto", "posh", "posse", + "post", "pour", "pow", "Prado", "Pratt", "pray", "press", "prey", + "price", "pride", "prig", "prime", "prior", "probe", "Prof", "prone", + "p's", "psych", "pub", "puck", "puffy", "Pugh", "pull", "puma", + "pun", "punky", "puny", "pupal", "puppy", "pure", "purl", "pus", + "PVC", "Pyle", "Pyrex", "Qatar", "quack", "quaff", "quash", "queen", + "quell", "query", "queue", "quick", "quill", "quint", "quirt", "quo", + "quote", "rabat", "rabbi", "radar", "radio", "radix", "Rae", "rag", + "rail", "rajah", "Ralph", "Ramo", "ran", "Rand", "randy", "Raoul", + "rape", "rare", "rasp", "rata", "rater", "rave", "raven", "razor", + "R&D", "reach", "ready", "real", "reb", "reck", "reedy", "reek", + "Reese", "regal", "Reid", "relax", "reman", "Rena", "rend", "ret", + "retch", "Rhea", "rheum", "rhino", "Rhoda", "rib", "rice", "rick", + "rid", "rifle", "rig", "rigid", "rill", "rim", "rimy", "rink", + "Rio", "rip", "ripen", "rise", "risk", "rite", "rival", "river", + "road", "roar", "rob", "robe", "robin", "rodeo", "roe", "roil", + "role", "Roman", "Rome", "romp", "roof", "room", "roost", "Rosen", + "rot", "rouge", "round", "rout", "rove", "Roy", "Royce", "r's", + "Ruben", "ruby", "rude", "Rudy", "rug", "rule", "rummy", "run", + "rung", "runt", "rupee", "ruse", "rusk", "Russo", "rusty", "Ruth", + "rutty", "Ryan", "rye", "sa", "sabra", "sad", "sag", "sage", + "sake", "sale", "Salk", "salty", "salve", "Sam", "same", "Samoa", + "sane", "sank", "Santa", "Sao", "sappy", "Sarah", "sari", "satyr", + "Saudi", "Sault", "save", "savvy", "SC", "scald", "scalp", "scarf", + "scat", "SCM", "scold", "scoot", "Scot", "scram", "scrub", "scud", + "scull", "scum", "SD", "seal", "seamy", "sect", "sedge", "seedy", + "seen", "seize", "semi", "sepal", "Sepoy", "septa", "serge", "serif", + "servo", "set", "Seton", "setup", "sewn", "shad", "shag", "shah", + "shaky", "shall", "shank", "shard", "Shari", "shaw", "Shea", "shed", + "sheer", "shied", "shift", "shill", "shin", "shirk", "shish", "shoo", + "shore", "shout", "shrew", "shrub", "shunt", "SIAM", "sib", "sibyl", + "side", "sigh", "sigma", "silk", "silly", "silt", "Simon", "since", + "sinew", "singe", "sinh", "Sioux", "sir", "siva", "sixty", "skeet", + "skew", "skid", "skimp", "skulk", "Skye", "slab", "slag", "slake", + "slap", "slay", "sleep", "sleet", "slick", "slim", "slimy", "slog", + "slosh", "sloth", "slow", "slug", "slum", "slung", "slurp", "sly", + "small", "smile", "smith", "smog", "smoky", "snack", "snark", "sneer", + "snell", "snip", "snoop", "snore", "snow", "snub", "snug", "so", + "soap", "soar", "soft", "soggy", "sold", "sole", "solid", "Solon", + "solve", "some", "son", "sonny", "soon", "sorb", "sore", "sort", + "south", "sow", "spa", "spade", "spare", "spark", "spasm", "spate", + "spawn", "spear", "speed", "spell", "Spica", "spicy", "spiky", "spire", + "Spiro", "splay", "spoil", "spook", "spool", "spore", "spout", "spree", + "sprue", "spur", "spy", "squaw", "s's", "St", "stag", "staid", + "stair", "stale", "stall", "stamp", "stand", "stark", "stash", "state", + "stay", "stead", "steak", "steam", "steed", "Steen", "steer", "stern", + "stew", "stile", "stilt", "stock", "stole", "stone", "stood", "stool", + "stop", "storm", "story", "stove", "strap", "straw", "strip", "strum", + "stud", "study", "stung", "stunt", "Sturm", "styli", "suave", "such", + "sud", "sue", "Suez", "suit", "sulky", "sung", "sunny", "sup", + "supra", "surge", "Sus", "sushi", "swank", "swap", "swear", "swelt", + "swig", "swine", "swish", "swiss", "sword", "swung", "Syria", "syrup", + "tab", "tabu", "tacit", "taffy", "Tahoe", "take", "tale", "talk", + "tamp", "tang", "tango", "tanh", "Tanya", "tap", "tape", "tapir", + "tappa", "tar", "tardy", "tarry", "task", "tasty", "tate", "tawny", + "taxi", "teach", "tease", "tecum", "Telex", "tempt", "tenon", "tense", + "tepid", "terry", "Tess", "Texas", "Thai", "than", "that", "Thea", + "thee", "them", "then", "theta", "they", "thick", "thigh", "thin", + "thing", "third", "three", "threw", "thug", "thus", "ti", "tibet", + "tic", "tid", "tidy", "tied", "tift", "til", "tile", "tilt", + "Timex", "Timon", "tinge", "tipsy", "tire", "tit", "tithe", "title", + "TNT", "toad", "today", "tog", "Togo", "toil", "token", "told", + "tome", "tommy", "tonal", "tong", "Toni", "tonk", "tony", "tool", + "tooth", "top", "tor", "torch", "tori", "torr", "torso", "torus", + "total", "totem", "tout", "tower", "town", "toxin", "track", "Tracy", + "trag", "trail", "trait", "tramp", "trap", "tread", "tree", "trend", + "tress", "trial", "tribe", "trill", "tripe", "troll", "troop", "trout", + "truck", "Trudy", "trunk", "trust", "TRW", "t's", "TTL", "tub", + "tube", "tuck", "Tudor", "tuft", "tulle", "tum", "tuna", "tune", + "tunic", "Turin", "turk", "turn", "tusk", "tutu", "tweak", "twice", + "twill", "twine", "twirl", "twit", "two", "tying", "ugly", "ultra", + "umbra", "uncle", "union", "unite", "upend", "upper", "upset", "Upton", + "urban", "urine", "us", "usage", "use", "USGS", "USIA", "usual", + "usurp", "Utah", "utile", "v", "vade", "vague", "vain", "valid", + "valve", "van", "vase", "vast", "Veda", "veer", "vein", "Vella", + "venom", "Venus", "verb", "Verde", "versa", "vest", "vetch", "vex", + "via", "vicar", "Vichy", "Vida", "vie", "Viet", "vigil", "viii", + "villa", "vise", "visor", "vitae", "Vito", "viva", "vixen", "vocal", + "voice", "Volta", "vowel", "v's", "w", "wack", "wacky", "wad", + "wade", "wafer", "wag", "wah", "wail", "wait", "waive", "waken", + "wale", "wally", "wan", "war", "ward", "ware", "warm", "warp", + "warty", "was", "washy", "water", "watt", "Watts", "way", "Wayne", + "weal", "wean", "wear", "web", "weber", "we'd", "wedge", "weed", + "week", "Wei", "weird", "Welch", "well", "welsh", "wept", "were", + "west", "wet", "wharf", "whee", "whelm", "when", "which", "whim", + "whir", "whisk", "white", "whiz", "whoa", "whole", "whoop", "whop", + "whose", "why", "widen", "widow", "wield", "Wier", "wile", "will", + "Wilma", "wilt", "win", "winch", "wino", "wipe", "wise", "wispy", + "witch", "withy", "witty", "woe", "wok", "wolve", "womb", "Wong", + "Woods", "wool", "wop", "wordy", "work", "worm", "worse", "worst", + "wove", "wow", "wreck", "wrest", "wrist", "Wu", "Wyatt", "Wylie", + "Wyner", "x", "xenon", "x's", "yacht", "Yale", "yam", "yang", + "yarn", "Yates", "year", "yeast", "Yeats", "Yemen", "yield", "yip", + "yodel", "yoga", "yoke", "yore", "you'd", "y's", "Yves", "YWCA", + "Zeiss", "zest", "zig", "zing", "zip", "Zoe", "zoo"}; diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.c b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.c new file mode 100644 index 0000000..1dbfe7e --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.c @@ -0,0 +1,157 @@ +/* + + This file is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_stdlib.c + + Author: Raymond Chen + + Function: This file contains the C standard library functions used by anagram. + + Source: anagram + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ +#include "anagram_stdlib.h" +#include "anagram_strings.h" + +/* Includes anagram_CompareFrequency */ +/* This function is included here because the WCC does not */ +/* support function pointers */ +#include "anagram_compare.h" + +void +anagram_swapi(char *ii, char *ij, unsigned long es) { + char *i, *j, c; + + i = (char *) ii; + j = (char *) ij; + _Pragma("loopbound min 4 max 4") do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof(char); + } + while (es != 0) + ; +} + +char * +anagram_pivot(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + + // Wasm loop bounds + + __attribute__((import_module("__pragma"), + import_name("loopbound"))) extern void + __pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + if (anagram_CompareFrequency(pi, pj) < 0) { + if (anagram_CompareFrequency(pi, pk) < 0) { + if (anagram_CompareFrequency(pj, pk) < 0) + return pj; + return pk; + } + return pi; + } + if (anagram_CompareFrequency(pj, pk) < 0) { + if (anagram_CompareFrequency(pi, pk) < 0) + return pi; + return pk; + } + return pj; +} + +__attribute__((always_inline)) static inline void +anagram_qsorts(char *a, unsigned long n, unsigned long es) { + unsigned long j; + char *pi, *pj, *pn; + volatile unsigned int flowfactdummy = 0; + __pragma_loopbound(0, 3); + while (n > 1) { + if (n > 10) + pi = anagram_pivot(a, n, es); + else + pi = a + (n >> 1) * es; + + anagram_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + __pragma_loopbound(0, 10); + while (1) { + /* wcc note: this assignment expression was added to avoid + assignment of multiple loop bound annotations to same loop (cf. + Ticket #0002323). */ + flowfactdummy++; + __pragma_loopbound(1, 6); + do { + pi += es; + } while (pi < pn && anagram_CompareFrequency(pi, a) < 0); + __pragma_loopbound(1, 7); + do { + pj -= es; + } while (pj > a && anagram_CompareFrequency(pj, a) > 0); + if (pj < pi) + break; + anagram_swapi(pi, pj, es); + } + anagram_swapi(a, pj, es); + j = (unsigned long) (pj - a) / es; + n = n - j - 1; + if (j >= n) { + anagram_qsorts(a, j, es); + a += (j + 1) * es; + } else { + anagram_qsorts(a + (j + 1) * es, n, es); + n = j; + } + } +} + +__attribute__((always_inline)) static inline void +anagram_qsort(void *va, unsigned long n, unsigned long es) { + _Pragma("marker call_qsorts") anagram_qsorts((char *) va, n, es); + _Pragma("flowrestriction 1*anagram_qsorts <= 17*call_qsorts"); +} + +/* This must be redefined for each new benchmark */ +#define ANAGRAM_HEAP_SIZE 21000 + +static char anagram_simulated_heap[ANAGRAM_HEAP_SIZE]; +static unsigned int anagram_freeHeapPos; + +__attribute__((always_inline)) static inline void * +anagram_malloc(unsigned int numberOfBytes) { + void *currentPos = (void *) &anagram_simulated_heap[anagram_freeHeapPos]; + /* Get a 4-byte address for alignment purposes */ + // anagram_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int + // )0xfffffffc ); + unsigned int rem = (numberOfBytes & (unsigned int) 0x3); + unsigned int adjustment = rem ? 4 - rem : 0; + anagram_freeHeapPos += numberOfBytes + adjustment; + return currentPos; +} + +__attribute__((always_inline)) static inline void +anagram_bzero(char *p, unsigned long len) { + unsigned long i; + + __pragma_loopbound(8, 800); + for (i = 0; i < len; ++i) { + *p++ = '\0'; + } +} diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.h new file mode 100644 index 0000000..837080e --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_stdlib.h @@ -0,0 +1,32 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_stdlib.h + + Author: Raymond Chen + + Function: This header contains some C standard library functions used by + anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_STDLIB_H +#define ANAGRAM_STDLIB_H + +__attribute__((always_inline)) static inline void * +anagram_malloc(unsigned int numberOfBytes); + +__attribute__((always_inline)) static inline void +anagram_qsort(void *va, unsigned long n, unsigned long es); + +#endif diff --git a/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_strings.h b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_strings.h new file mode 100644 index 0000000..2e60b1b --- /dev/null +++ b/targets/wasm-tacle/sequential/anagram/generated/modified_sources/inline/anagram_strings.h @@ -0,0 +1,29 @@ +/* + + This header is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: anagram_strings.h + + Author: Raymond Chen + + Function: This header contains some C standard library functions used by + anagram. + + Source: unknown + + Original name: anagram + + Changes: See ChangeLog.txt + + License: See anagram.c + +*/ + +#ifndef ANAGRAM_STRINGS_H +#define ANAGRAM_STRINGS_H + +__attribute__((always_inline)) static inline void +anagram_bzero(char *p, unsigned long len); + +#endif diff --git a/targets/wasm-tacle/sequential/audiobeam/CMakeLists.txt b/targets/wasm-tacle/sequential/audiobeam/CMakeLists.txt new file mode 100644 index 0000000..b14a3fc --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/CMakeLists.txt @@ -0,0 +1,28 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(audiobeam) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/audiobeam.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/audiobeam.c" + "generated/modified_sources/default/audiobeaminput.c" + "generated/modified_sources/default/audiobeamlibm.c" + "generated/modified_sources/default/audiobeamlibmalloc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/audiobeam/README b/targets/wasm-tacle/sequential/audiobeam/README new file mode 100755 index 0000000..e228eda --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/README @@ -0,0 +1,86 @@ +Readme file for Oxygen beamforming source code distribution +----------------------------------------------------------- + +This is a very very beta distribution of beamforming source code from +MIT LCS. + +There is only one source file, main.c, and one header file, +main.h. You can compile everything using the Makefile included in the +distribution. + +The input to the program is a text file containing floating +point values for the signal read on each of the microphones. For n +microphones, each line of the text files represents a temporal sample +and should contain n floating point values separated by spaces, e.g.: + +-1.8569790e-004 -9.0919049e-004 3.6711283e-004 -1.0073081e-005 ... + +There are several modes of operation for the program: + +1. The most basic mode is to process the microphone data and to +calculate the output based on one beam focused on a particular point +in space. The coordinates for the microphones and the focus point are +specified inside main.c (eventually to be moved to a separate file). + +2. Far field search mode. This mode assumes a far-field source (which +means we have a planar wavefront) and a linear array, and sweeps over +180 degrees in the plane of the array. The microphone coordinates are +specified in main.c, and the NUM_ANGLES constant defines how many +angle values should be tested (a value of 180 means one beam per each +degree). The energy of the signal over a particular window +(ANGLE_ENERGY_WINDOW_SIZE) is computed for each beam. The direction +with maximum energy is considered the direction that the speech signal +is coming from, and is printed out by the program. + +3. Near-field hill climbing mode. This mode accepts a starting +coordinate and attempts to "hill-climb" through the space seeking the +maximum energy. Each of the x, y, and z coordinates are perturbed in +the positive and negative directions at each time interval +(GRID_ENERGY_WINDOW_SIZE) by a step size (GRID_STEP_SIZE). This +perturbation, along with the original coordinate, produces seven +coordinates to be tested. The direction with the maximum energy +replaces the current reference coordinate. For instance, if we have a +starting reference coordinate of (1,1,0) and our step size is 0.01, we +will evaluate the energy for the following seven beams: + +(1,1,0) +(0.99,1,0) +(1.01,1,0) +(1,0.99,0) +(1,1.01,0) +(1,1,-0.01) +(1,1,0.01) + +Now let's say the beam (1,1.01,0) has the maximum energy; then this +coordinate will replace the original reference coordinate of (1,1,0). + +For methods 2, and 3, we are not outputting anything to disk, we are +just printing the result. This is because we have just started to work +with these methods, and have not applied them in real systems. This +code is currently being ported to RAW. + +To get a list of parameters for the delay_and_sum executable that is +generated when the source is compiled, just type ./delay_and_sum . + +There is some sample data included with the program, in the data +directory. There is some data for a near-field and far-field +source. The README.txt file in each directory specifies the microphone +and source position. The data1 file, when processed with a beamformer +aligned in the proper direction should produce something like a sinc +function (see +http://ccrma-www.stanford.edu/~jos/Interpolation/sinc_function.html). + +The data2 file should produce an audio signal of a woman saying "the +simplest method". If the beamformer is aligned properly, the noise +should be reduced significantly over the source signal from only one +of the microphones (use print_datafile.pl to isolate one +microphone). You can convert the data file that the program produces +to wave files using sox. + + + + + +--------------------------------- +Eugene Weinstein +ecoder@mit.edu \ No newline at end of file diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeam.c b/targets/wasm-tacle/sequential/audiobeam/audiobeam.c new file mode 100755 index 0000000..3d7ee15 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeam.c @@ -0,0 +1,585 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeam + + Author: Eugene Weinstein + + Function: Audio beam former + + Source: StreamIt + http://groups.csail.mit.edu/cag/streamit/ + + Changes: no functional changes + + License: see license.txt + +*/ + + +/* + Include section +*/ + +#include "audiobeamlibm.h" +#include "audiobeamlibmalloc.h" +#include "audiobeam.h" + +/* + Forward declaration of functions +*/ + +void audiobeam_init(); +int audiobeam_return(); +void audiobeam_main( void ); +int main( void ); +void audiobeam_preprocess_delays( struct audiobeam_PreprocessedDelays + prep_delays[ ], float *delays ); +float *audiobeam_parse_line( float *float_arr, int num_mic ); +long int audiobeam_find_max_in_arr( float *arr, int size ); +long int audiobeam_find_min_in_arr( float *arr, int size ); +int audiobeam_wrapped_inc_offset( int i, int offset, int max_i ); +int audiobeam_wrapped_dec_offset( int i, int offset, int max_i ); +int audiobeam_wrapped_inc( int i, int max_i ); +int audiobeam_wrapped_dec( int i, int max_i ); +struct audiobeam_DataQueue *audiobeam_init_data_queue( int max_delay, + int num_mic ); +struct audiobeam_Delays *audiobeam_init_delays ( int num_angles, int num_mic ); +void audiobeam_calc_distances( float *source_location, + float audiobeam_mic_locations[ 15 ][ 3 ], + float *distances, + int num_mic ); +void audiobeam_calc_delays( float *distances, float *delays, int sound_speed, + int sampling_rate, int num_mic ); +void audiobeam_adjust_delays( float *delays, int num_mic ); +float *audiobeam_calc_weights_lr ( int num_mic ); +float *audiobeam_calc_weights_left_only ( int num_mic ); +float audiobeam_calculate_energy( float *samples, int num_samples ); +float audiobeam_do_beamforming( struct audiobeam_PreprocessedDelays + preprocessed_delays[ ], + float **sample_queue, + int queue_head, + long int max_delay, + int num_mic, + float *weights ); +int audiobeam_process_signal( struct audiobeam_Delays *delays, int num_mic, + float sampling_rate, float **beamform_results, + struct audiobeam_DataQueue *queue, + int num_beams, int window, float *weights ); +int audiobeam_calc_beamforming_result( struct audiobeam_Delays *delays, + float **beamform_results, + float *energies, + struct audiobeam_DataQueue *queue, + int num_beams, int window, + int hamming ); +void audiobeam_calc_single_pos( float source_location[ 3 ], + float audiobeam_mic_locations[ 15 ][ 3 ], + int hamming ); + + +/* + Declaration of global variables +*/ + +extern float audiobeam_input[ 5760 ]; +extern float audiobeam_mic_locations[ 15 ][ 3 ]; +extern float audiobeam_source_location[ 3 ]; +extern float audiobeam_origin_location[ 3 ]; +int audiobeam_input_pos; +int audiobeam_checksum; + + +/* + Initialization- and return-value-related functions +*/ + +void audiobeam_init() +{ + audiobeam_input_pos = 0; + audiobeam_checksum = 0; + + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &audiobeam_input[ 0 ]; + _Pragma( "loopbound min 23040 max 23040" ) + for ( i = 0; i < sizeof( audiobeam_input ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &audiobeam_mic_locations[ 0 ]; + _Pragma( "loopbound min 180 max 180" ) + for ( i = 0; i < sizeof( audiobeam_mic_locations ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &audiobeam_source_location[ 0 ]; + _Pragma( "loopbound min 12 max 12" ) + for ( i = 0; i < sizeof( audiobeam_source_location ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &audiobeam_origin_location[ 0 ]; + _Pragma( "loopbound min 12 max 12" ) + for ( i = 0; i < sizeof( audiobeam_origin_location ); ++i, ++p ) + *p ^= bitmask; +} + + +int audiobeam_return() +{ + return ( audiobeam_checksum + 1 != 0 ); +} + + +/* + Algorithm core functions +*/ + +void audiobeam_preprocess_delays( struct audiobeam_PreprocessedDelays + prep_delays[ ], float *delays ) +{ + int i; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < 15; i++ ) { + prep_delays[ i ].delay = delays[ i ]; + prep_delays[ i ].high = ( int ) audiobeam_ceil( delays[ i ] ); + prep_delays[ i ].low = ( int ) audiobeam_floor( delays[ i ] ); + prep_delays[ i ].offset = delays[ i ] - prep_delays[ i ].low; + } +} + + +float *audiobeam_parse_line( float *float_arr, int num_mic ) +{ + int i; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < num_mic; i++ ) + float_arr[ i ] = audiobeam_input[ audiobeam_input_pos++ ]; + + return float_arr; +} + + +long int audiobeam_find_max_in_arr( float *arr, int size ) +{ + int i; + float max = 0; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < size; i++ ) { + if ( arr[ i ] > max ) + max = arr[ i ]; + } + + return audiobeam_ceil( max ); +} + + +long int audiobeam_find_min_in_arr( float *arr, int size ) +{ + int i; + float min = arr[ 0 ]; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < size; i++ ) { + if ( arr[ i ] < min ) + min = arr[ i ]; + } + + return audiobeam_floor( min ); +} + + +int audiobeam_wrapped_inc_offset( int i, int offset, int max_i ) +{ + if ( i + offset > max_i ) + return ( i + offset - max_i - 1 ); + else + return ( i + offset ); +} + + +int audiobeam_wrapped_dec_offset( int i, int offset, int max_i ) +{ + if ( i - offset < 0 ) + return ( max_i - ( offset - i ) + 1 ); + else + return ( i - offset ); +} + + +int audiobeam_wrapped_inc( int i, int max_i ) +{ + return audiobeam_wrapped_inc_offset( i, 1, max_i ); +} + + +int audiobeam_wrapped_dec( int i, int max_i ) +{ + return audiobeam_wrapped_dec_offset( i, 1, max_i ); +} + + +struct audiobeam_DataQueue *audiobeam_init_data_queue( int max_delay, + int num_mic ) +{ + int i, j; + + struct audiobeam_DataQueue *queue; + queue = ( struct audiobeam_DataQueue * ) audiobeam_malloc( sizeof( + struct audiobeam_DataQueue ) ); + queue->sample_queue = ( float ** ) audiobeam_malloc( ( max_delay + 1 ) + * sizeof( float * ) ); + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < ( max_delay + 1 ); i++ ) { + ( queue->sample_queue )[ i ] = ( float * ) audiobeam_malloc( num_mic + * sizeof( float ) ); + _Pragma( "loopbound min 15 max 15" ) + for ( j = 0; j < num_mic; j++ ) { + ( queue->sample_queue )[ i ][ j ] = 0.0; // Initialize values to 0 + } + } + + queue->head = 0; + queue->tail = 0; + queue->full = 0; + + return queue; +} + + +struct audiobeam_Delays *audiobeam_init_delays ( int num_angles, int num_mic ) +{ + struct audiobeam_Delays *delays; + int i; + + delays = ( struct audiobeam_Delays * ) audiobeam_malloc( sizeof( + struct audiobeam_Delays ) ); + + // Initialize the delays array + delays->delay_values = ( float ** ) audiobeam_malloc( num_angles + * sizeof( float * ) ); + + _Pragma( "loopbound min 1 max 1" ) + for ( i = 0; i < ( num_angles ); i++ ) { + delays->delay_values[ i ] = ( float * ) audiobeam_malloc( num_mic + * sizeof( float ) ); + } + + return delays; +} + +void audiobeam_calc_distances( float *source_location, + float audiobeam_mic_locations[ 15 ][ 3 ], + float *distances, + int num_mic ) +{ + int i; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < num_mic; i++ ) { + distances[ i ] = ( audiobeam_sqrt( ( audiobeam_mic_locations[ i ][ 0 ] + - source_location[ 0 ] ) * + ( audiobeam_mic_locations[ i ][ 0 ] + - source_location[ 0 ] ) + + ( audiobeam_mic_locations[ i ][ 1 ] + - source_location[ 1 ] ) * + ( audiobeam_mic_locations[ i ][ 1 ] + - source_location[ 1 ] ) + + ( audiobeam_mic_locations[ i ][ 2 ] + - source_location[ 2 ] ) * + ( audiobeam_mic_locations[ i ][ 2 ] + - source_location[ 2 ] ) ) ); + } +} + + +void audiobeam_calc_delays( float *distances, float *delays, int sound_speed, + int sampling_rate, int num_mic ) +{ + int i; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < num_mic; i++ ) + delays[ i ] = ( distances[ i ] / sound_speed ) * sampling_rate; +} + + +void audiobeam_adjust_delays( float *delays, int num_mic ) +{ + int i; + long int min_delay = audiobeam_find_min_in_arr ( delays, num_mic ) - 1; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < num_mic; i++ ) + delays[ i ] -= min_delay; +} + + +float *audiobeam_calc_weights_lr ( int num_mic ) +{ + float *weights = ( float * ) audiobeam_malloc( num_mic * sizeof( float ) ); + int index = 0; + int y, z; + + int half = num_mic / 4; + + _Pragma( "loopbound min 0 max 0" ) + for ( z = 1; z >= -1; z -= 2 ) { + _Pragma( "loopbound min 0 max 0" ) + for ( y = 0; y < half; y++ ) { + weights[ index ] = 0.54 + 0.46 * audiobeam_cos( audiobeam_M_PI * y + / half ); + index++; + } + _Pragma( "loopbound min 0 max 0" ) + for ( y = 0; y < half; y++ ) { + weights[ index ] = 0.54 + 0.46 * audiobeam_cos( audiobeam_M_PI * ( -y ) + / half ); + index++; + } + } + + return weights; +} + + +float *audiobeam_calc_weights_left_only ( int num_mic ) +{ + float *weights = ( float * ) audiobeam_malloc( num_mic * sizeof( float ) ); + int index = 0; + int y; + + int half = num_mic / 2; + + _Pragma( "loopbound min 15 max 15" ) + for ( y = -half; y <= half; y++ ) { + weights[ index ] = 0.54 + 0.46 * audiobeam_cos( audiobeam_M_PI * y / half ); + index++; + } + + return weights; +} + + +float audiobeam_calculate_energy( float *samples, int num_samples ) +{ + int i; + float sum = 0.0; + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < num_samples; i++ ) + sum += ( samples[ i ] * samples[ i ] ); + + return sum; +} + + +float audiobeam_do_beamforming( struct audiobeam_PreprocessedDelays + preprocessed_delays[ ], + float **sample_queue, + int queue_head, + long int max_delay, + int num_mic, + float *weights ) +{ + int i; + float sum = 0; + int delay_floor; + int delay_ceil; + int low_index; + int high_index; + float interpolated_value; + + // add up all the num_mic delayed samples + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < num_mic; i++ ) { + delay_floor = preprocessed_delays[ i ].low; + delay_ceil = preprocessed_delays[ i ].high; + + // Inline wrap around here + // Low index gets index of sample right before desired sample + low_index = queue_head + delay_floor; + if ( low_index > max_delay ) + low_index -= ( max_delay + 1 ); + + // High index gets index of sample right after desired sample + high_index = queue_head + delay_ceil; + if ( high_index > max_delay ) + high_index -= ( max_delay + 1 ); + + // i gives the value of the microphone we want. However, since + // the array only has microphones first_mic to last_mic, we + // need to offset our index by first_mic + + interpolated_value = ( ( ( sample_queue[ high_index ][ i ] - + sample_queue[ low_index ][ i ] ) + * ( preprocessed_delays[ i ].offset ) ) + + sample_queue[ low_index ][ i ] ); + + // If we have microphone weights, multiply the value by the weight + if ( weights != 0 ) + sum += ( interpolated_value * weights[ i ] ); + else + sum += interpolated_value; + } + + return sum; + +} + + +int audiobeam_process_signal( struct audiobeam_Delays *delays, int num_mic, + float sampling_rate, float **beamform_results, + struct audiobeam_DataQueue *queue, + int num_beams, int window, float *weights ) +{ + int i, j; + float time_index = 0; + float time_index_inc = ( 1.0 / sampling_rate ); + + float value; + + int done = 0; + + struct audiobeam_PreprocessedDelays preprocessed_delays[ 15 ]; + + audiobeam_preprocess_delays( preprocessed_delays, delays->delay_values[ 0 ] ); + + _Pragma( "loopbound min 13 max 13" ) + for ( i = 0; i < delays->max_delay - 1; i++ ) { + if ( audiobeam_input_pos < 5760 ) + audiobeam_parse_line( ( queue->sample_queue )[ queue->head ], 15 ); + else + return -1; + queue->head = audiobeam_wrapped_inc( queue->head, delays->max_delay ); + } + _Pragma( "loopbound min 371 max 371" ) + for ( i = 0; ( i < window ) || ( window < 0 ) ; i++ ) { + if ( audiobeam_input_pos < 5760 ) + audiobeam_parse_line( ( queue->sample_queue )[ queue->head ], 15 ); + else { + done = 1; + break; + } + + _Pragma( "loopbound min 1 max 1" ) + for ( j = 0; j < num_beams; j++ ) { + value = audiobeam_do_beamforming( preprocessed_delays, + ( queue->sample_queue ), + audiobeam_wrapped_inc( queue->head, + delays->max_delay ), + delays->max_delay, num_mic, weights ); + + + value = value / num_mic; + + if ( beamform_results != 0 ) + beamform_results[ j ][ i ] = value; + } + + queue->tail = queue->head; + queue->head = audiobeam_wrapped_inc( queue->head, delays->max_delay ); + + time_index += time_index_inc; + } + + return ( done ); +} + + +int audiobeam_calc_beamforming_result( struct audiobeam_Delays *delays, + float **beamform_results, + float *energies, + struct audiobeam_DataQueue *queue, + int num_beams, int window, + int hamming ) +{ + int i; + int done; + float *weights = 0; + + if ( hamming ) { + if ( ( 15 % 2 ) == 1 ) + weights = audiobeam_calc_weights_left_only( 15 ); + else + weights = audiobeam_calc_weights_lr( 15 ); + } + + done = audiobeam_process_signal( delays, 15, 16000, + beamform_results, + queue, num_beams, window, weights ); + + if ( beamform_results != 0 ) { + _Pragma( "loopbound min 1 max 1" ) + for ( i = 0; i < num_beams; i++ ) + energies[ i ] = audiobeam_calculate_energy( beamform_results[ i ], window ); + } + return done; +} + + +void audiobeam_calc_single_pos( float source_location[ 3 ], + float audiobeam_mic_locations[ 15 ][ 3 ], + int hamming ) +{ + float mic_distances[ 15 ]; + struct audiobeam_Delays *delays = audiobeam_init_delays( 1, 15 ); + struct audiobeam_DataQueue *queue; + + float **beamform_results; + float *energies; + + beamform_results = ( float ** ) audiobeam_malloc( 1 * sizeof( float * ) ); + beamform_results[ 0 ] = ( float * ) audiobeam_malloc( 384 * sizeof( float ) ); + energies = ( float * ) audiobeam_malloc( 1 * sizeof( float * ) ); + + // Calculate distances from source to each of mics + audiobeam_calc_distances( source_location, audiobeam_mic_locations, + mic_distances, 15 ); + + audiobeam_calc_delays( mic_distances, + delays->delay_values[ 0 ], + 342, 16000, 15 ); + + audiobeam_adjust_delays( delays->delay_values[ 0 ], 15 ); + + delays->max_delay = audiobeam_find_max_in_arr ( delays->delay_values[ 0 ], 15 ); + + queue = audiobeam_init_data_queue( delays->max_delay, 15 ); + + audiobeam_calc_beamforming_result( delays, beamform_results, + energies, queue, 1, -1, hamming ); + + audiobeam_checksum += beamform_results[ 0 ][ 0 ] * 1000; +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) audiobeam_main( void ) +{ + char hamming = 1; + audiobeam_calc_single_pos( audiobeam_source_location, + audiobeam_mic_locations, + hamming ); +} + + +int main( void ) +{ + audiobeam_init(); + audiobeam_main(); + + return ( audiobeam_return() ); +} + diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeam.h b/targets/wasm-tacle/sequential/audiobeam/audiobeam.h new file mode 100755 index 0000000..ff2e844 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeam.h @@ -0,0 +1,50 @@ +#ifndef AUDIOBEAM_MAIN_H +#define AUDIOBEAM_MAIN_H + +struct audiobeam_DataQueue { + float **sample_queue; + int head; + int tail; + unsigned char full; +}; + + +struct audiobeam_Delays { + float **delay_values; + long int max_delay; +}; + + +struct audiobeam_PreprocessedDelays { + float delay; + int low; + int high; + float offset; +}; + + +#undef FLT_MAX +#define FLT_MAX 999e999 + +#define SOUND_SPEED 342 +#define SAMPLING_RATE 16000 +#define CARTESIAN_DISTANCE(x1,y1,z1,x2,y2,z2) (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2))); + +#define NUM_MIC 15 +#define ANGLE_ENERGY_WINDOW_SIZE 400 +#define GRID_STEP_SIZE 0.003 // .3cm +#define NUM_DIRS 7 +#define NUM_TILES 16 + +#define MIC_HORIZ_SPACE 0.038257 +#define MIC_VERT_SPACE 0.015001 +#define TWO23 8388608.0 // 2^23 +#define BUFFER_SIZE 384 // No of input-tupels (each with NUM_MIC elements) +#define NUM_MIC_IN_CHAIN 32 +#define NUM_BOARDS_IN_CHAIN 16 +#define INPUT_LENGTH 5760 + +#define INTERPOLATE(low_value, high_value, offset) (((high_value-low_value)*(offset)) + low_value) + +#endif + diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeaminput.c b/targets/wasm-tacle/sequential/audiobeam/audiobeaminput.c new file mode 100755 index 0000000..52dc3f0 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeaminput.c @@ -0,0 +1,5784 @@ +float audiobeam_input[ 5760 ] = { + -2.1628241e-002, + -6.1782300e-002, + 1.2674258e-002, + 4.5557573e-002, + -3.1999024e-002, + 1.5042214e-002, + -2.2025290e-002, + -1.1691264e-001, + -1.1481735e-002, + -1.4446880e-002, + -1.5755706e-002, + -8.0576309e-002, + 2.0622295e-002, + -1.9724793e-003, + -1.2299200e-001, + -8.3279195e-002, + -1.0825949e-002, + 7.5347056e-002, + -3.6992287e-003, + 1.2980213e-002, + 5.9641118e-002, + 1.8884644e-002, + -5.5868450e-002, + 4.1899706e-002, + -2.0939881e-002, + 2.0535662e-002, + -9.9773254e-002, + -1.5328980e-002, + 2.1354349e-002, + 1.3485441e-002, + 6.2665707e-003, + -1.0335293e-002, + -4.1743319e-002, + 4.3513189e-002, + -4.2254620e-002, + -2.7446285e-002, + 4.5134873e-002, + 5.6054726e-002, + 6.2557771e-002, + 4.2653265e-002, + 7.6308850e-003, + 1.4700700e-002, + 5.4820763e-002, + -1.3939644e-002, + -8.8708573e-002, + 1.4383734e-002, + 4.0463345e-003, + 3.5856296e-002, + 2.7271902e-002, + 2.0721019e-002, + 3.5167562e-002, + -2.7007340e-002, + -1.3367771e-002, + -6.8606571e-002, + -1.1089227e-001, + 7.3041941e-002, + -5.2066383e-002, + -5.1117839e-003, + -3.7742692e-002, + -1.1895006e-002, + -5.7323089e-002, + -5.4802003e-003, + -8.4072455e-003, + 1.5633496e-002, + 4.6059069e-002, + -6.1861422e-002, + -3.3034801e-002, + 1.7182310e-002, + 1.1807449e-001, + 8.2171643e-003, + -1.4691311e-002, + -7.2660364e-004, + 4.6637366e-002, + -6.9687813e-004, + -2.7780373e-002, + 5.9544506e-002, + -5.6050055e-003, + -3.5444498e-002, + 1.2845303e-002, + -1.0379076e-001, + -8.5864760e-002, + 1.9192324e-002, + -2.6644473e-003, + 5.4431089e-003, + -9.2110237e-003, + 7.9344657e-002, + 4.7203951e-002, + 9.6834909e-002, + -1.0553527e-001, + -8.5097540e-004, + 5.9460688e-002, + 4.4844228e-002, + -2.8858692e-002, + 4.4496937e-002, + -3.9902243e-002, + 5.5557069e-002, + -1.1814152e-002, + -5.8464847e-002, + -1.0753965e-002, + 5.7336183e-002, + 2.6582677e-002, + 2.2119089e-002, + -1.4469086e-002, + 3.2141585e-002, + -1.0303352e-001, + -1.8856419e-003, + 3.8161312e-002, + -3.7091166e-002, + -5.1262587e-003, + 4.2556931e-002, + -5.8465556e-002, + 4.2193534e-002, + -1.4951154e-002, + 1.7423551e-002, + 2.7519487e-002, + -9.0048353e-002, + -2.6206603e-002, + -1.1536221e-002, + 4.5418578e-002, + -9.1746774e-002, + 1.6370112e-002, + 8.2439024e-003, + -1.7961312e-002, + -7.5403629e-002, + -6.6798880e-003, + -9.2569474e-003, + -1.8133432e-002, + -6.7922929e-002, + -3.3209516e-002, + 4.7587886e-002, + -4.4354675e-002, + -7.9939507e-002, + -1.0312521e-001, + -4.6389013e-002, + -6.8492137e-002, + 8.7253275e-003, + -1.0040243e-002, + -2.3972856e-002, + 1.9377428e-003, + -1.2364076e-002, + -3.3033927e-002, + 6.2238030e-002, + -4.7879158e-002, + -1.9680886e-002, + -3.2198806e-002, + -4.0721657e-003, + -1.7973043e-002, + 9.3910391e-003, + -9.1117967e-002, + 3.6036154e-002, + -9.3285589e-003, + -3.9239303e-002, + -1.4022387e-001, + 1.1102588e-001, + -9.1222642e-002, + -4.0301199e-002, + 7.1912258e-002, + 1.5040754e-002, + 8.1648312e-002, + 3.9995645e-002, + -1.3388074e-002, + 1.9629547e-002, + 3.5710780e-003, + 1.1166215e-002, + -4.0137762e-002, + 3.6284046e-002, + 4.1404491e-002, + -5.8754380e-002, + -7.8104994e-003, + -5.3507568e-002, + 1.3005354e-002, + -1.6914462e-002, + 8.5270739e-002, + 3.9979512e-002, + 4.5752537e-002, + -3.1159018e-002, + 4.9213792e-002, + 6.1313765e-002, + 4.3386180e-002, + -1.1103888e-002, + -2.9414395e-002, + -1.2976305e-002, + 6.2751925e-002, + 2.6120284e-002, + -2.4616119e-002, + -3.6435894e-002, + 7.1182254e-002, + 2.2753153e-002, + 3.0188200e-002, + -3.1009759e-002, + -8.5616927e-002, + -4.6712075e-002, + 1.0069141e-002, + -1.2036765e-001, + 3.4740635e-002, + 1.0916700e-001, + -7.5289504e-002, + -5.3676914e-002, + -1.6396310e-002, + 5.2259303e-002, + -2.2119146e-002, + 4.3186864e-002, + 5.1169779e-002, + 6.6785827e-002, + 8.4849447e-002, + -5.2696816e-002, + -6.5414943e-003, + 8.6775788e-002, + 8.7802920e-003, + 2.8938998e-002, + -6.8520041e-003, + 5.1510683e-002, + -2.9026553e-002, + 3.8173521e-002, + 2.2338277e-002, + 3.0163548e-002, + -4.3077452e-002, + 7.9805371e-002, + 4.7317864e-002, + -3.1363067e-002, + 3.0903885e-002, + -1.3112581e-002, + 4.6251235e-002, + 2.5813919e-002, + -5.2188163e-002, + 5.9587326e-003, + 1.0092254e-002, + 1.2104228e-002, + 2.7865320e-002, + 3.4901635e-002, + -2.5736803e-002, + 1.3229570e-002, + 3.6694281e-003, + 3.3012708e-002, + 2.9284882e-002, + 3.0060870e-002, + 4.5508139e-002, + -3.6974026e-002, + 7.7034396e-002, + -6.8227707e-002, + 5.3618194e-002, + -6.1636629e-002, + 4.1438304e-002, + 1.1367451e-002, + -4.4009108e-002, + -2.3843912e-002, + -1.6703032e-002, + 3.7265590e-002, + -7.8425072e-003, + 7.0384481e-002, + -2.4218783e-002, + -3.5625536e-002, + 1.8010625e-002, + 1.1966647e-002, + 2.5491626e-003, + 3.1251434e-003, + -2.6075724e-002, + -4.3802442e-002, + -1.2920483e-002, + 3.3085779e-002, + -3.9037317e-003, + -2.8269926e-002, + 4.1542553e-002, + -8.2930418e-002, + 5.6657974e-002, + 3.4391329e-002, + -5.5825221e-002, + 6.8989268e-002, + 1.2541652e-003, + -7.7722092e-002, + -4.6334370e-003, + 3.1744148e-002, + -5.5503811e-002, + -3.4445949e-002, + -9.4038308e-003, + -2.7828988e-002, + 1.0887660e-001, + 1.3636863e-002, + -3.7585580e-002, + 4.0418722e-002, + -1.3737476e-002, + -5.0488197e-003, + 1.3194491e-001, + 7.2649277e-002, + -3.6200249e-002, + -4.1687712e-002, + -1.7974402e-001, + -9.9629449e-002, + -8.8510199e-002, + -3.2055261e-002, + 1.7036375e-002, + 1.8071052e-002, + 4.4934493e-002, + -1.0864015e-002, + 9.9226525e-003, + -1.6564939e-002, + -3.4734325e-002, + 3.5725355e-002, + 3.0344723e-002, + -3.6905057e-002, + 1.4666105e-002, + -9.1517247e-002, + -3.3012325e-002, + 5.8220711e-002, + -6.8047909e-003, + 3.6517819e-002, + 8.7157879e-002, + -1.4120887e-002, + 5.4666271e-002, + 2.0673658e-002, + -5.8489896e-002, + -1.0321028e-001, + 1.7051732e-002, + -4.4728363e-003, + 7.1522488e-004, + -6.6825032e-002, + -3.0624456e-002, + 5.7023563e-002, + -1.1878060e-002, + 1.7099754e-002, + 4.3931414e-002, + 6.1445253e-002, + 3.9676417e-002, + 7.7224665e-002, + 6.4921134e-002, + -5.6517669e-003, + 5.5906816e-002, + -2.1154100e-002, + 2.4198912e-002, + 1.2288710e-002, + 3.5640310e-002, + -3.7175887e-002, + -6.0273241e-002, + 6.4682700e-003, + 2.1266448e-002, + -6.8591151e-002, + 1.1184946e-002, + 4.6699013e-003, + -1.0346103e-001, + -7.7362572e-002, + 4.7383361e-003, + -1.4630850e-002, + 3.7812788e-002, + 1.6292353e-002, + -4.8009838e-002, + 8.0999615e-002, + 2.1004391e-003, + 1.5541126e-001, + -6.1366286e-003, + -7.1757358e-002, + -1.8036409e-002, + 4.4754181e-002, + 8.4250625e-003, + 2.0321052e-002, + 2.3096646e-002, + -4.7739081e-002, + -3.6540263e-002, + -1.3962473e-002, + -1.4429499e-002, + 5.4134628e-002, + -3.4826503e-002, + -9.5953591e-002, + -2.5723076e-003, + 2.5258029e-002, + -1.7985838e-002, + -3.2436879e-002, + 7.4368827e-002, + 7.8647624e-002, + 1.0656742e-002, + 8.4282290e-003, + 2.5266494e-002, + 1.0782181e-002, + 7.0122588e-002, + 4.5656108e-002, + -1.7103947e-002, + 4.2780530e-002, + -9.6794177e-003, + -6.4130219e-003, + -9.2925547e-002, + 5.4742908e-002, + -7.5128799e-002, + -7.3489810e-002, + -3.0056779e-003, + -7.9295585e-003, + -2.1268989e-002, + -1.8030581e-002, + 1.8197354e-002, + -9.1941398e-002, + -6.5053760e-002, + -2.8177888e-002, + 6.2682028e-002, + -2.5915727e-002, + -1.5832074e-002, + 6.8064152e-002, + 7.3910585e-003, + 9.9715351e-003, + 1.4832463e-002, + -8.5346638e-004, + 1.7638664e-002, + 3.0446443e-002, + -1.2396491e-002, + -5.8601288e-002, + -5.7627198e-003, + -7.1554886e-003, + -6.3799636e-003, + -7.9695655e-002, + 2.4753204e-002, + 8.6758471e-003, + -4.9728861e-002, + 2.0786272e-002, + -7.6560881e-002, + 1.8730544e-002, + 2.1715688e-002, + 4.1880687e-002, + -4.0154045e-002, + -3.0255220e-002, + 7.5668890e-002, + 2.6577586e-002, + 6.0758844e-002, + 4.1263811e-002, + -7.2132197e-002, + -5.4040115e-002, + 4.5831681e-002, + 2.9148772e-002, + -9.9761159e-002, + -2.4308664e-002, + -5.9443444e-002, + 3.9842573e-002, + -4.8058590e-002, + -1.6081315e-002, + 5.2772543e-002, + 1.9132275e-002, + 1.3499840e-002, + -2.5313375e-002, + 4.1852174e-002, + 2.8461234e-002, + 3.5598046e-002, + -4.2019346e-002, + 3.0022497e-002, + 1.3199080e-003, + 8.3394564e-002, + 2.2949521e-002, + 4.1566899e-002, + 1.1383869e-002, + -2.6939783e-002, + -1.8963007e-002, + -6.3268458e-002, + 5.8324716e-002, + 4.8789982e-002, + 5.6035385e-002, + -2.0057577e-002, + 4.8354809e-002, + 6.4102491e-002, + 8.5367473e-003, + -4.4917671e-003, + 5.3137245e-002, + -3.4406597e-003, + -2.5126308e-002, + 3.6564998e-003, + 9.6593471e-002, + 7.4728111e-002, + -6.7266129e-002, + -4.9014918e-002, + 7.2046324e-005, + 1.0162088e-001, + 3.4409693e-002, + 7.3462774e-003, + -8.0225074e-002, + 4.8609099e-002, + 3.2217993e-002, + -2.8071970e-002, + -3.6815087e-002, + 3.0467444e-002, + 4.3287817e-002, + -1.3733658e-002, + 2.5769175e-002, + 2.6532442e-002, + 6.3705272e-002, + 9.0108580e-004, + -8.9331571e-003, + 4.0743375e-002, + 2.1807528e-002, + 7.9702732e-002, + -7.5750752e-003, + 7.0674335e-002, + 3.7582849e-002, + 3.9334641e-003, + -2.5679423e-002, + 2.2647574e-002, + -6.4712014e-002, + 2.4315794e-002, + 1.5494849e-002, + -3.9942923e-002, + 3.3496104e-002, + -5.9740340e-002, + 3.5474677e-002, + 6.6577221e-002, + 6.8351408e-002, + -7.7174045e-002, + -3.3267903e-002, + -4.3616992e-002, + 1.2970427e-001, + 6.0899210e-002, + 4.3444379e-003, + -1.0402039e-001, + 4.3108587e-002, + 1.3577371e-002, + 3.3900628e-002, + 7.3707838e-003, + -1.5925799e-002, + 6.4439821e-002, + 1.7075281e-003, + 1.0684273e-001, + 1.3675111e-002, + -1.8111888e-003, + -2.8508186e-002, + -6.5596762e-002, + 1.8536230e-002, + 2.3318748e-002, + 4.7302415e-002, + 7.7239329e-003, + -2.4929896e-002, + -3.5669784e-002, + 4.8605025e-002, + 9.7598834e-002, + 3.3591893e-002, + 1.3978895e-002, + 2.2590039e-002, + -5.5155328e-002, + -2.3844007e-002, + -2.8932963e-002, + -4.5784933e-002, + -2.5579789e-002, + 8.6706332e-002, + 8.5991126e-002, + -4.4830492e-002, + 1.7419718e-002, + 1.4916965e-002, + -6.2744229e-002, + -2.1218715e-002, + 5.9749921e-002, + 2.6471628e-003, + 1.4696082e-002, + -1.1916464e-001, + -7.4054943e-002, + 3.3702032e-002, + -7.2744375e-002, + 2.0153878e-002, + -4.7562683e-002, + -3.2418295e-002, + 1.8784044e-002, + 9.4509719e-002, + 8.6064590e-002, + -1.2657551e-002, + -3.8219708e-002, + -5.9906689e-002, + 3.8677878e-002, + 3.2909039e-002, + 1.3356926e-002, + -1.9001381e-002, + -3.9834512e-002, + 1.6185466e-002, + -2.1554965e-002, + -1.0883439e-001, + -2.9635956e-002, + 1.2873885e-002, + 2.7852743e-002, + 3.5614484e-003, + -4.7306763e-002, + -1.0771995e-001, + -7.9289260e-004, + 1.1021590e-001, + -6.1261912e-003, + 5.2735506e-002, + -5.0261529e-002, + 3.2092184e-002, + 3.1401447e-002, + 2.6629993e-002, + -2.9882337e-003, + -6.0317700e-002, + -3.0940994e-002, + -3.8375379e-002, + -1.0663192e-001, + -1.1058175e-002, + -5.6424824e-002, + -7.7026313e-003, + -4.1079471e-002, + -2.1629167e-002, + -2.6973772e-002, + -4.5878364e-002, + 1.5542578e-002, + -4.9103021e-002, + -1.0554701e-002, + -5.0947614e-002, + -3.1865395e-002, + 9.0008999e-002, + 4.5801038e-002, + 1.5787324e-002, + 6.1816926e-002, + 3.9975029e-002, + -8.0101743e-002, + 3.6589676e-002, + -4.0044532e-002, + -5.4152676e-003, + -2.7100833e-002, + 2.0669295e-003, + 4.2072166e-002, + -4.8541169e-002, + -6.0994910e-002, + 7.2269246e-002, + 1.8547974e-002, + 3.2317037e-002, + -3.7668570e-002, + 2.3090187e-002, + -8.4282566e-003, + 1.2909956e-002, + -4.6799208e-003, + -7.5882838e-002, + -4.5005968e-002, + 6.0924318e-002, + 1.5170746e-002, + -8.0718858e-003, + -3.1913614e-002, + 2.9448478e-002, + 5.6982375e-002, + -2.2421475e-002, + 2.7408554e-002, + -1.0052456e-001, + -3.0342741e-002, + -8.0221320e-002, + -5.2820631e-002, + 1.4287569e-002, + -3.5261023e-002, + -1.2712299e-002, + 1.0298138e-002, + -7.4545734e-002, + -7.1662807e-003, + -6.3049311e-002, + -3.3128714e-003, + -3.7018937e-002, + -9.2155629e-002, + 4.4295353e-003, + -2.5345078e-002, + -5.0175815e-004, + -2.2425974e-002, + 7.0790673e-002, + 4.6067398e-002, + 1.3356450e-002, + -7.5350427e-002, + 9.2272647e-002, + -6.0388207e-002, + 6.2880311e-002, + -4.6813092e-002, + 6.4358587e-002, + 6.5476593e-002, + -5.0385005e-002, + 1.1259635e-002, + -2.8642227e-002, + 6.0591769e-003, + 7.8259699e-003, + -4.0086083e-002, + -1.3107082e-002, + -2.5073934e-002, + 1.5301678e-002, + -6.1350007e-002, + -4.0860320e-002, + 4.5224779e-002, + -4.4892524e-002, + 8.8006431e-002, + -3.3282403e-002, + -5.6195537e-002, + -1.1931638e-001, + -6.8019421e-002, + -7.0651820e-003, + 1.0114029e-001, + 2.6799939e-002, + -4.5414349e-002, + 7.3662653e-002, + 2.6023897e-002, + -7.7197973e-002, + 1.8472004e-002, + 6.4325310e-003, + 1.0535758e-001, + -8.2482506e-002, + -1.0868944e-001, + 8.7186828e-002, + 4.2331149e-003, + 6.6302594e-003, + 5.0652627e-002, + -2.6295176e-002, + 1.1319735e-002, + -5.3688488e-002, + -8.3685938e-002, + 3.8054233e-002, + -2.5923609e-002, + 8.7603907e-002, + 4.4975322e-002, + 2.0615118e-002, + 3.7674950e-002, + 5.6434838e-002, + 1.0977012e-001, + 2.1349762e-003, + -1.4936346e-004, + 6.7930892e-002, + 3.2086590e-003, + -4.5878929e-002, + -4.4181125e-002, + 2.4715658e-002, + 7.9994617e-002, + 5.2384101e-002, + -9.5190518e-003, + -3.7239495e-002, + 1.9883359e-002, + 4.0730677e-003, + -1.1677479e-001, + -2.6374780e-002, + -7.9398641e-002, + -3.5523570e-002, + -1.8151457e-002, + -3.7191923e-002, + -1.0831981e-001, + 5.5198514e-002, + 8.2754639e-002, + -5.5996264e-002, + -6.5431323e-002, + 1.6211145e-002, + -6.8206035e-002, + -2.9416838e-002, + 5.3307249e-002, + 1.7472763e-002, + 3.7312882e-003, + -5.1498829e-002, + -6.2257189e-002, + -2.9692831e-002, + -2.4493198e-002, + -2.7319437e-003, + 5.8815114e-002, + -6.3249182e-002, + 2.0730820e-002, + 9.5563463e-003, + -2.2720249e-002, + 2.5296131e-002, + -1.9878781e-002, + -3.4238910e-002, + -2.4677844e-002, + 6.9236841e-002, + -3.4704441e-002, + -3.9318071e-002, + 5.7750083e-002, + 3.4211433e-002, + -5.0475709e-002, + 2.5174181e-002, + -4.6996048e-002, + 1.6221876e-002, + -2.6204170e-002, + 1.0630488e-002, + 4.5517196e-003, + 8.3863415e-002, + 4.8780028e-002, + 2.3656142e-002, + -8.5385372e-002, + -7.6803464e-003, + 1.3583644e-002, + 1.0156741e-001, + 1.1623477e-001, + 3.0703572e-002, + -1.8790478e-002, + -2.5434562e-002, + 2.6081461e-002, + -8.0973679e-002, + 4.7528492e-003, + 5.1709027e-002, + -2.7152886e-002, + 3.3078882e-002, + 9.5807816e-002, + -1.6742069e-002, + 5.2847289e-002, + 7.4190627e-002, + 8.4661383e-003, + -1.7127745e-002, + 2.5387176e-002, + -2.4425657e-002, + 1.0363293e-002, + 3.2901544e-002, + 2.4049224e-002, + -3.6364045e-002, + -1.8374024e-002, + 1.9170206e-002, + 3.5899319e-002, + 2.2884438e-002, + -4.2986435e-004, + -3.7263522e-002, + -2.4107817e-002, + -1.0160656e-002, + -5.2244378e-003, + 8.4713192e-002, + -3.3175117e-003, + -6.8918873e-002, + -1.0757423e-001, + 1.9995005e-002, + 1.0018587e-002, + -1.0031442e-003, + -2.6646668e-002, + -1.4140223e-002, + -1.9093589e-002, + 8.2412659e-002, + 5.0569231e-002, + -1.9249580e-003, + 1.6857775e-002, + 4.4516048e-002, + 2.9634803e-002, + -7.4675793e-002, + 6.9128286e-002, + 1.7838807e-002, + -1.5706998e-002, + 2.3497836e-002, + -2.7256676e-002, + -1.6892391e-002, + -6.2498894e-002, + 1.8814550e-002, + 6.7802861e-002, + -4.5010985e-002, + -7.9693020e-004, + -1.6417629e-002, + -1.6571552e-002, + -3.2170429e-002, + -3.1451461e-002, + 5.9127646e-002, + 4.2496269e-002, + 5.8440594e-002, + -3.7761868e-002, + 1.4543937e-001, + 4.6291259e-003, + -8.8031773e-003, + -3.7376149e-002, + 4.4444334e-002, + -3.2946165e-002, + 2.7709611e-002, + -4.6454274e-002, + -5.4184987e-003, + 1.9082159e-002, + 1.1097683e-003, + -7.1272377e-002, + 1.8112885e-003, + 2.6898226e-003, + -3.0686681e-002, + -1.9829229e-002, + 3.0867601e-002, + -6.2758817e-002, + -2.2846248e-002, + 6.0573296e-002, + 3.7414532e-002, + 3.6169907e-002, + -2.3442499e-003, + 2.5963449e-002, + -5.0418274e-002, + -7.0858380e-003, + 2.2793366e-002, + -4.5274123e-002, + 4.4264571e-002, + -5.5435866e-002, + -6.0444822e-002, + -4.4730927e-002, + -2.6702128e-003, + 3.0721521e-002, + 3.9441000e-003, + 8.3714830e-002, + -1.2824805e-002, + 8.9065027e-002, + -4.1791317e-002, + -9.6506591e-004, + -2.2150161e-002, + -5.4266803e-002, + -7.9756811e-002, + 2.9723999e-003, + -5.4652294e-004, + -8.3350132e-002, + 1.0241351e-002, + -9.6004506e-002, + 1.1043342e-002, + -1.0036827e-001, + 5.4166215e-002, + 5.3435462e-002, + 1.0602215e-002, + 2.9868847e-002, + -2.4597423e-003, + 1.1437786e-002, + -4.2279579e-002, + -8.8732642e-003, + -2.9476925e-002, + 3.6694209e-002, + 3.3176455e-005, + -7.3778252e-003, + -3.9144818e-002, + -8.3308862e-003, + 4.6791993e-002, + -1.7037485e-003, + 4.5892237e-002, + 1.5597981e-002, + -5.6087508e-002, + -4.1107610e-005, + -1.0683418e-002, + -2.6103976e-002, + -8.4348999e-003, + 3.2082383e-002, + 1.4938214e-001, + 3.9964806e-002, + -7.8254583e-003, + 4.6722479e-002, + 9.3200915e-002, + 2.4464994e-002, + 8.3718835e-004, + 1.5250387e-002, + -1.2400454e-001, + -2.8639656e-002, + -1.5938766e-002, + -2.5676238e-002, + -5.1847115e-002, + 1.7639941e-003, + 4.9326733e-003, + -1.5856443e-002, + -9.1307767e-004, + -1.5554562e-002, + 2.5941199e-002, + -2.9757970e-002, + 1.2201936e-001, + 8.0973215e-002, + 1.7146982e-002, + 1.4736881e-002, + 6.0467585e-002, + 5.4698972e-002, + 2.5876279e-002, + 1.0164087e-002, + 3.8201202e-002, + -6.0518215e-002, + -1.3895876e-002, + 3.4728204e-002, + -1.1711300e-001, + -1.1216734e-002, + -3.9340786e-002, + -2.7309751e-002, + 5.9063770e-003, + 2.0738498e-002, + -1.3812395e-002, + -5.7982126e-002, + -9.3680977e-002, + -4.9666791e-002, + -2.6529709e-002, + 5.2766295e-002, + -2.1506279e-002, + 9.3091830e-002, + -3.5081971e-002, + 1.4449703e-002, + 5.8269304e-002, + 1.0329005e-001, + -3.4264617e-002, + -1.9998674e-002, + 4.0219340e-002, + 2.0651887e-002, + 5.2208561e-003, + 2.1487670e-002, + 2.4204968e-002, + 3.0673837e-002, + -8.5293543e-003, + -5.3952186e-002, + 8.9865270e-002, + 1.0436717e-001, + -9.7344984e-003, + -9.7393746e-003, + 5.2162345e-002, + 6.8291250e-003, + -3.3926390e-002, + -3.5345884e-002, + -2.1419424e-002, + 2.4503709e-002, + 4.4872568e-002, + -3.6811060e-002, + 4.6761401e-002, + 4.9242905e-002, + 2.9535711e-002, + -7.5315008e-003, + 8.4931550e-003, + 1.3235857e-001, + 8.4181971e-002, + -6.3526263e-002, + 4.1655473e-003, + 6.3417279e-003, + -1.3065747e-002, + -5.7645495e-002, + 1.8950407e-002, + 3.6717958e-002, + 1.2058270e-001, + 2.9698808e-002, + 6.3712863e-002, + -7.8927013e-002, + -1.1092228e-001, + 7.5127329e-002, + 3.6792936e-002, + 1.8047426e-002, + 1.6372435e-002, + -1.1358573e-002, + -1.1114199e-002, + -3.1011890e-003, + 1.2753148e-001, + -1.3063278e-003, + 2.9175038e-002, + 1.0744000e-002, + 8.5396074e-003, + 3.0555550e-002, + 1.9846964e-002, + -2.0887290e-003, + 7.4108765e-004, + -6.8980202e-002, + -6.9539294e-002, + -7.1891402e-002, + 2.6483042e-002, + -1.0604522e-001, + 1.4946154e-002, + -2.0885875e-002, + 8.1620406e-002, + 2.2391518e-003, + -4.3108583e-002, + -2.8345459e-002, + 2.1767961e-002, + -4.1509277e-002, + 5.0332798e-002, + -3.0747398e-003, + 8.1280247e-003, + -2.8574311e-002, + -3.7557299e-002, + 4.6116535e-002, + -7.5548776e-002, + 4.2485208e-002, + -1.2735059e-002, + -4.8713882e-002, + 3.4080268e-002, + 3.8109829e-002, + -7.9933234e-002, + 5.0868655e-003, + -3.6956005e-002, + -6.5608678e-003, + 6.1566793e-002, + 3.9747615e-002, + -7.0776849e-003, + -1.0039001e-002, + 1.0635588e-001, + -3.2262564e-002, + 6.6284637e-002, + -1.5602956e-002, + 9.8826341e-002, + 2.8765472e-002, + 4.9988770e-002, + 2.8083188e-002, + 3.7850396e-003, + 3.8099036e-002, + -6.2803094e-002, + -8.0284071e-003, + 1.7678623e-002, + 1.5384533e-001, + 3.0604908e-002, + -2.2938654e-002, + -6.6147444e-003, + 8.0228244e-003, + 6.3229249e-002, + 1.9888120e-002, + -1.2483914e-002, + -3.3020847e-002, + 5.4285124e-002, + -2.2046600e-002, + 7.6270296e-002, + -3.8125981e-002, + 4.2116981e-002, + 6.8249119e-002, + 4.9569658e-002, + -1.2181580e-002, + -3.3950151e-002, + -3.3512560e-002, + -4.0037716e-002, + 3.8517111e-002, + -3.0444190e-002, + -1.8608773e-002, + 1.5643509e-002, + 4.0250976e-002, + 1.9776990e-002, + -3.1560979e-002, + -3.1229293e-003, + -2.5832801e-003, + 2.7968081e-002, + -5.6392681e-002, + 4.7360525e-002, + 3.8619319e-003, + 9.9891506e-002, + -1.8199130e-003, + 3.1119514e-003, + -9.1106029e-002, + -1.4519250e-002, + 3.7010312e-002, + -1.1213690e-002, + 2.1256532e-002, + -5.3987387e-002, + 5.7866117e-002, + -4.2626330e-002, + -3.3483769e-002, + -5.2898877e-002, + -6.7225352e-002, + 5.1417756e-002, + 1.3929020e-003, + 5.2022234e-002, + 1.0592230e-001, + -6.8998892e-002, + -7.3435118e-002, + 3.0523655e-002, + -5.7162591e-003, + -3.2771503e-002, + 9.2367770e-003, + -6.7747716e-003, + 1.0333099e-002, + -1.5577876e-002, + -6.7817347e-002, + -6.6533637e-002, + -6.3984097e-002, + 5.6216531e-002, + 1.5579751e-002, + -2.7104760e-003, + 2.0901166e-002, + -1.1389339e-002, + 2.4314314e-002, + 9.6320945e-003, + -3.5425250e-002, + 2.9816167e-002, + -1.0582802e-001, + 7.9031755e-002, + 5.8936482e-002, + 4.9235081e-002, + -2.0598427e-002, + 2.7257218e-002, + 8.3473318e-002, + 1.0047121e-001, + 7.7116867e-002, + 3.9518492e-002, + 6.3112265e-003, + -6.8158283e-002, + 8.2755720e-003, + -1.4671408e-002, + 1.0928921e-001, + -5.3580922e-002, + -4.9000311e-002, + 9.9920986e-002, + 3.5724099e-002, + 3.0645803e-002, + 2.1810846e-003, + -3.5472111e-002, + -5.8047398e-002, + 4.6521237e-002, + 5.3030675e-002, + 1.6183593e-002, + 4.7161315e-002, + 1.5496372e-002, + -2.6065334e-002, + 5.4108355e-002, + 1.1113747e-001, + -4.3256641e-002, + 1.6776514e-002, + -9.2777987e-002, + 1.0831881e-001, + 2.6550297e-002, + 5.6809097e-002, + 4.1708284e-003, + -9.3188930e-002, + -3.7166019e-002, + 7.2595776e-002, + -5.8774162e-002, + -8.4078954e-003, + -8.3732623e-002, + -1.4874571e-002, + 4.1882968e-002, + -3.2712401e-002, + -2.7953154e-002, + 1.1313205e-002, + 4.9524990e-002, + 2.0294329e-003, + 3.8285760e-002, + -1.4648978e-002, + -3.5010308e-002, + 3.2018027e-002, + -1.7151604e-002, + -9.6536966e-002, + -4.6726273e-002, + 1.7288478e-002, + 1.5788740e-002, + 5.2848095e-003, + 4.1795447e-002, + 4.6331282e-002, + 7.0958286e-002, + -3.3004895e-002, + -1.5541634e-002, + -6.4899819e-002, + 4.4813983e-002, + 2.1314689e-002, + 2.5903378e-002, + 3.1412995e-002, + 2.7655815e-002, + 7.0916690e-003, + 3.6198660e-002, + -2.9768515e-002, + 5.8014817e-002, + -5.8727472e-002, + -1.2787628e-002, + 1.2855854e-001, + -7.0659467e-002, + -9.9019211e-002, + -3.2969432e-002, + 3.1190632e-002, + 6.5956753e-003, + -1.6987652e-002, + 4.0088843e-002, + -1.0857916e-001, + 1.1385790e-002, + 6.8736591e-002, + 9.1859027e-003, + -2.2753959e-002, + 6.5639798e-002, + 4.4619698e-002, + -5.3424194e-004, + 3.2475239e-002, + -5.5982848e-002, + -5.9416171e-003, + -2.6137328e-002, + 4.7534015e-002, + -4.3905563e-002, + 4.7139261e-002, + -5.0539423e-002, + -5.2509019e-003, + -8.4340990e-003, + 1.7266091e-002, + -6.5954891e-002, + -1.1344100e-001, + -2.5794929e-002, + 5.3678895e-002, + -1.0500180e-002, + 5.6847837e-002, + -3.0370988e-002, + -9.2272021e-004, + -1.1716566e-002, + -6.7153889e-002, + -4.9491944e-002, + -2.7151079e-002, + 4.9084906e-003, + -3.3137805e-002, + -5.7067625e-002, + -3.5807416e-003, + -1.9012110e-002, + -2.3489886e-002, + -6.6147208e-002, + -1.9730903e-002, + -5.7617192e-002, + -1.7743738e-002, + 6.2747755e-002, + 3.0746059e-002, + -2.1208817e-002, + 1.0724738e-002, + -9.5295048e-002, + -8.3696293e-003, + 2.8928609e-002, + 7.7547429e-002, + -2.8433474e-002, + 3.9000811e-002, + 1.8594177e-002, + 7.3604845e-002, + -4.0570215e-002, + 4.0428101e-002, + 5.2162122e-002, + 6.9720490e-002, + 1.3917348e-003, + -4.1967149e-002, + 1.2040326e-002, + -9.0859684e-002, + 3.0619641e-002, + 7.9828021e-002, + -9.5582231e-002, + 4.4977158e-003, + 5.3050166e-002, + -3.9280557e-002, + 2.1825815e-003, + 2.6836286e-002, + -1.0693240e-002, + 1.2507669e-002, + 8.7551531e-002, + -4.2170924e-002, + 7.4021050e-002, + -5.0257861e-002, + 4.2440318e-003, + 2.8498362e-002, + 4.0712278e-002, + 1.3630666e-002, + 3.7506385e-002, + 2.9021782e-002, + 9.4969857e-003, + 7.3668316e-002, + -1.0430524e-002, + 7.8640111e-003, + -1.9579539e-002, + -1.3354780e-002, + 4.6553749e-002, + -1.5359398e-002, + -3.6958328e-002, + 3.9183126e-002, + 9.0763364e-002, + -5.7310947e-002, + 6.8567752e-002, + 3.0379537e-002, + -1.7131879e-002, + -4.9845297e-002, + 6.6236979e-002, + -3.5226094e-002, + 4.1319436e-002, + -1.0414640e-002, + -7.3110434e-002, + -6.7060543e-003, + -2.2661736e-003, + 5.4214708e-002, + -5.6731971e-002, + 8.0169623e-002, + 6.8708173e-002, + 5.1555900e-002, + -2.3028383e-002, + 2.3845756e-003, + 4.3290569e-002, + -5.0088302e-003, + -8.5495950e-003, + -2.2929081e-002, + -1.4934858e-002, + -1.9331882e-002, + 3.1952820e-002, + 2.2837591e-002, + -6.5833588e-003, + 9.3564125e-002, + -5.3479061e-002, + -4.7856971e-003, + 7.8291548e-002, + -6.4278719e-002, + 5.2534052e-002, + -8.4991604e-003, + -2.5331472e-002, + -1.1670703e-004, + -1.6794583e-002, + -3.6946100e-005, + 7.9706385e-002, + 1.8011858e-002, + 4.5273832e-002, + 1.9568899e-002, + 4.5061760e-002, + -2.6682717e-002, + -1.8814340e-002, + -8.5389413e-003, + -4.6897567e-002, + -7.9016702e-002, + -2.1058150e-005, + 5.8849807e-002, + -2.5161493e-002, + 6.0245233e-002, + -8.2636501e-002, + -6.9368318e-002, + -1.5064100e-002, + -3.4932382e-002, + 4.4579915e-003, + -5.9080060e-003, + 8.9889824e-002, + 8.1831512e-002, + 1.6338686e-002, + -5.4180978e-002, + -5.3267629e-003, + -2.8476462e-003, + 1.7450439e-002, + -2.4213885e-002, + 7.1383978e-003, + -8.5575620e-002, + -9.7688859e-002, + 5.4026353e-002, + 6.8738257e-002, + -3.1782928e-002, + 2.9354257e-002, + -1.6843133e-002, + -3.4228093e-002, + -4.9087072e-002, + -8.8609944e-003, + -4.2395609e-002, + 6.0299570e-002, + -3.9805763e-002, + -3.9969178e-002, + -1.0972287e-002, + -3.1903343e-002, + -2.3021388e-002, + 9.5381824e-002, + -3.8131819e-002, + -2.7944014e-002, + 7.9797347e-002, + 1.5055618e-002, + -6.0223999e-002, + 2.1349786e-002, + 1.4010766e-001, + -7.0365161e-002, + 9.5470745e-002, + -5.5280731e-002, + 9.0676740e-002, + 8.0165216e-003, + 3.8071961e-002, + 3.4452332e-002, + 1.2608974e-001, + 7.4568874e-003, + 2.2179776e-002, + -5.1449927e-003, + -1.5259731e-003, + 2.4388062e-002, + 2.8159902e-002, + 6.3528510e-002, + 7.2459203e-002, + -6.6724867e-002, + 4.9840343e-002, + 1.0288982e-002, + -3.7523292e-003, + 2.4660586e-002, + 1.0905181e-001, + 2.0534327e-002, + -1.6624929e-002, + -4.7427409e-002, + 7.1932143e-002, + 2.4785276e-002, + -1.2656870e-002, + -4.3142163e-003, + -8.5065080e-002, + 1.1401731e-002, + 4.2186129e-002, + 1.7953548e-002, + -9.5471407e-003, + -2.7867915e-002, + 7.5845281e-003, + 3.6129267e-002, + -1.2896952e-001, + -1.4991468e-002, + 3.9146522e-002, + -7.6952239e-002, + 2.3154057e-002, + 3.2631339e-002, + 3.6032235e-003, + 2.4348659e-002, + -5.0004772e-003, + -3.9711602e-002, + -2.5957781e-002, + -8.4744957e-003, + -6.8234352e-002, + -2.8744676e-002, + 2.3341254e-002, + 4.3007108e-002, + 1.2712390e-002, + 2.8427956e-002, + -1.5923634e-002, + 4.4011784e-002, + -1.5711433e-002, + 4.4606989e-002, + -1.7483925e-002, + -1.2423254e-001, + 6.2454024e-003, + 6.6168154e-002, + 2.1085300e-002, + 9.0749477e-003, + -2.0534154e-002, + 6.9048807e-002, + -9.2613632e-003, + -2.7695812e-003, + -4.1107764e-002, + 2.1935377e-002, + -8.4933698e-003, + 7.9754080e-002, + 2.8930188e-002, + -1.5746665e-002, + -5.5368360e-002, + 4.8760088e-002, + -2.3262447e-002, + 1.9970261e-003, + 1.7181455e-002, + -2.6662315e-002, + 2.9476649e-003, + 3.6398404e-002, + -1.0718664e-002, + -1.3419702e-002, + -1.4303328e-002, + -5.1753021e-002, + -8.8633620e-003, + -6.6385388e-002, + -1.8360778e-002, + 4.0996838e-002, + -2.1821426e-002, + 1.9446502e-002, + 7.8258137e-002, + 1.1935359e-003, + 1.2671015e-001, + 5.4051017e-003, + 8.9554422e-002, + 5.1612989e-002, + -5.9613506e-002, + 1.0465684e-001, + 3.5325477e-002, + -7.4798564e-002, + -6.6674861e-002, + 2.8210488e-002, + 3.9519939e-003, + 4.2419282e-002, + 4.8733699e-002, + 4.9734069e-002, + -8.2263082e-002, + -1.0431084e-003, + 6.5382265e-003, + 2.7104024e-002, + -6.1504411e-002, + -1.1030328e-001, + -1.1088406e-001, + 4.6883361e-002, + -4.8929726e-002, + -1.1842483e-002, + -3.2343663e-002, + 2.8083963e-002, + 6.5341653e-003, + 6.4197433e-003, + -5.1922064e-002, + 5.9610106e-002, + -3.0492144e-003, + -2.0038627e-002, + 6.6832718e-003, + 3.5125897e-002, + 4.9157559e-002, + -1.1599903e-002, + -8.6904299e-004, + -8.6599262e-002, + 6.2299405e-002, + 9.4208251e-003, + 7.3197513e-002, + 7.5060589e-003, + 1.5188546e-002, + 8.4467481e-003, + 1.6309540e-002, + -3.6380831e-002, + -1.5684802e-002, + -1.2750901e-004, + -3.9540578e-002, + -2.6086647e-002, + 5.0982353e-002, + -3.8994541e-002, + -7.8152817e-002, + -2.1288151e-002, + 3.2125646e-002, + -4.9028664e-002, + -5.2017685e-002, + 4.8786860e-003, + 8.7710015e-002, + 3.7430190e-002, + 3.6962894e-002, + -1.4930609e-003, + -6.6490921e-002, + 1.1278370e-001, + 1.6259975e-002, + -1.1381280e-001, + 3.0235399e-002, + 7.9035487e-004, + -3.8638327e-002, + 4.3147897e-002, + 8.8130106e-002, + -1.4913096e-002, + 3.9678262e-003, + 3.6966598e-002, + 6.3040724e-002, + -4.9035837e-002, + -3.0293084e-003, + 7.2467143e-002, + 3.3553250e-003, + 1.1619490e-002, + 2.5048420e-002, + -1.3875509e-003, + 4.3384801e-003, + -1.9225635e-002, + -3.4205233e-002, + -6.1043519e-002, + 2.7920233e-002, + 1.5845125e-002, + -3.1788360e-002, + 5.5265277e-003, + -8.8053862e-003, + 5.1596808e-002, + -2.6382888e-002, + 1.3528723e-002, + 9.7188179e-004, + 4.5393222e-002, + 1.4350879e-001, + -8.3970455e-002, + -5.3058686e-002, + -1.7168532e-002, + 5.2123339e-002, + -1.0874975e-001, + -8.4692593e-002, + 2.0470836e-002, + 1.3786291e-002, + -4.3504389e-002, + -5.5751144e-003, + -9.6933329e-002, + -6.0058163e-002, + -5.0236621e-002, + 2.1957145e-002, + 4.6918366e-002, + 5.4757597e-003, + -1.2851732e-001, + 5.3503448e-002, + -7.8722951e-002, + 2.5143808e-002, + 3.8130327e-002, + 1.1190727e-001, + -2.2211112e-003, + 3.4395397e-003, + -6.6144203e-002, + -1.3250907e-002, + 1.4285490e-002, + -4.7426798e-002, + 4.3459402e-002, + 1.9567583e-002, + -3.2933903e-002, + 7.9884585e-003, + -3.6921691e-002, + -5.2601711e-002, + -3.7588436e-002, + -5.7858993e-002, + -3.9355983e-003, + -1.9668686e-002, + 1.7962753e-002, + 7.1980552e-002, + -1.2059618e-002, + 3.4579944e-002, + -1.8839556e-002, + -1.7604317e-002, + 7.8825547e-002, + 8.4168663e-003, + -1.6198144e-002, + 7.7326058e-003, + -1.4566324e-001, + 7.0918323e-002, + 2.7943557e-002, + 1.5952735e-002, + 5.3303709e-002, + -8.3804957e-002, + -6.6985571e-002, + -1.3191151e-002, + -4.2864677e-002, + -5.9477390e-002, + 4.9906263e-002, + 4.4401362e-002, + 4.7588494e-002, + 2.5451538e-002, + -3.7015590e-002, + 1.8897192e-002, + 8.5686801e-002, + 5.1878702e-003, + 4.3894402e-003, + 1.8570041e-002, + 5.5022301e-002, + -4.0645765e-002, + -5.0799009e-002, + -2.3060691e-002, + -5.3046714e-002, + -2.9921308e-002, + -4.2374683e-002, + -2.0684933e-003, + -3.1561538e-002, + -2.6520727e-002, + 2.2842715e-002, + 4.7241369e-002, + 1.5938051e-003, + -3.1393040e-002, + -2.2067479e-002, + 1.3659794e-002, + -3.1810808e-002, + 5.2038109e-002, + 5.5282333e-002, + 7.3406997e-002, + -8.5669402e-002, + 3.0521734e-002, + 1.3090940e-005, + -4.7165506e-002, + 4.8765186e-003, + -2.9407043e-002, + 1.9843096e-002, + -2.7632043e-002, + 1.4379705e-002, + 3.2263917e-002, + 5.4751887e-002, + -3.4032149e-002, + -9.9526757e-003, + 2.5634676e-002, + 2.5738815e-003, + -5.5256747e-003, + 4.1466343e-002, + -2.8007927e-002, + 8.2962880e-002, + 5.3608424e-002, + -6.6232246e-003, + -1.1529210e-001, + -3.5498392e-002, + 2.0099626e-002, + 4.5948750e-002, + 1.7926143e-002, + -5.9056747e-002, + -9.6797251e-002, + -2.4358114e-002, + -6.1063654e-002, + 2.0158520e-003, + 8.7163319e-002, + -8.9921518e-002, + -9.8666202e-003, + -9.3794619e-004, + 4.5791584e-002, + 8.5254269e-003, + 3.7372616e-002, + -5.3279812e-002, + 7.8030247e-004, + 1.1843336e-002, + -7.4212330e-002, + 1.1414296e-001, + -4.1485582e-002, + -2.2089769e-003, + -6.1672113e-003, + 9.8929283e-003, + -7.8207292e-002, + -4.8161136e-003, + -7.2059255e-002, + -3.5922784e-002, + -1.9786275e-002, + 1.5833828e-002, + 5.2545743e-002, + 9.9962946e-003, + 1.0473584e-001, + -2.6380727e-002, + 6.2664438e-002, + -1.0710067e-002, + -5.6621248e-002, + -6.2640861e-002, + 2.4906349e-002, + 4.9470811e-002, + 1.5582134e-002, + -1.1034795e-002, + 3.7179257e-002, + -7.9083587e-002, + 3.1086424e-002, + -1.3685837e-002, + -3.7552842e-002, + -2.9528094e-002, + -1.7008381e-002, + 3.7137697e-002, + 4.5722891e-002, + -6.7639973e-002, + 1.0411136e-002, + -9.5948463e-002, + -7.6491282e-002, + 1.0515447e-001, + -7.2395284e-002, + 2.6384356e-002, + -9.7803448e-004, + -1.2178894e-002, + -4.3298010e-002, + -1.4118456e-002, + -6.3811250e-003, + 3.5987445e-002, + -8.0165530e-003, + -2.0932915e-002, + -1.3187860e-002, + -4.3430054e-002, + -3.0586505e-002, + 9.8974586e-002, + 5.5685044e-002, + -1.1098877e-001, + 3.4420705e-002, + 2.6632342e-002, + 2.8768821e-002, + -5.6656185e-002, + -2.4035643e-002, + 4.4599132e-002, + 5.2401286e-002, + -3.1991215e-002, + 3.8827361e-003, + 4.7437513e-002, + 6.7940056e-002, + -2.3003581e-002, + -6.3955657e-002, + 1.0081807e-001, + -4.4211577e-003, + -4.1263060e-002, + -5.8970926e-002, + -2.4349696e-002, + 3.2867209e-002, + -2.4008048e-004, + 6.9810225e-002, + 1.5450610e-002, + 2.3319726e-002, + -1.0005801e-001, + 6.2685066e-003, + 3.3200964e-003, + -6.0496946e-002, + -8.8884008e-003, + 1.6134449e-003, + -7.2506916e-002, + 1.8835241e-003, + -9.1372012e-003, + -3.9166883e-002, + -3.0408037e-002, + 1.3371700e-001, + -8.4833604e-002, + -2.0082991e-002, + -6.7833227e-002, + 2.8939942e-002, + 3.2760884e-002, + -1.1389661e-004, + -4.3484404e-002, + -5.9579661e-002, + 8.5932179e-002, + -1.2312202e-001, + 4.5080645e-002, + 7.8749960e-002, + 8.5343585e-002, + 8.3452328e-003, + 3.8885343e-002, + -5.4756855e-002, + -5.2942923e-002, + -8.5138845e-003, + 6.6560990e-002, + -5.8418572e-002, + 2.3870988e-002, + 1.8931370e-002, + 5.9471104e-002, + -8.6742031e-002, + -4.4123808e-002, + 1.7375058e-002, + -6.3987147e-002, + 6.3031471e-003, + -5.2766788e-002, + 1.6462106e-001, + 3.4654166e-002, + 1.8664640e-002, + 2.0932790e-002, + -4.3515283e-003, + -2.2953377e-002, + -4.1758215e-002, + 5.7430654e-002, + -5.3591655e-002, + -4.6850896e-002, + 4.1910973e-002, + 1.1157103e-004, + -2.2629752e-002, + 6.5200275e-002, + -2.2924410e-003, + -1.0436647e-002, + -5.9483696e-002, + -3.6216756e-003, + -1.3438807e-002, + 1.2187937e-002, + -1.3021007e-002, + 3.3878909e-002, + -2.2899083e-002, + -2.3054076e-002, + 4.7348343e-002, + 2.8499078e-002, + -1.7052032e-003, + -1.3753287e-002, + -2.9609163e-002, + -1.3025597e-002, + -6.1569574e-003, + 8.8234767e-003, + -4.4598847e-002, + -7.8588213e-002, + -1.8194816e-002, + -6.0633228e-002, + 3.4385559e-003, + 5.9361395e-002, + 8.2140593e-002, + 1.4939745e-002, + -3.1639344e-002, + -1.2825312e-002, + -3.5217707e-002, + -1.9635520e-002, + 3.1739325e-002, + -2.7107236e-002, + 4.2299225e-002, + 1.9675302e-002, + -2.6289167e-002, + -3.7438885e-002, + -6.5984833e-002, + 4.2748691e-003, + -3.3482818e-002, + -2.6690228e-002, + -3.6330879e-002, + -4.4149481e-002, + -1.5138292e-002, + 2.8942426e-002, + -1.6976163e-002, + -5.9543856e-002, + 7.4778255e-002, + 2.8451870e-002, + 6.2164171e-002, + -4.0415989e-002, + -4.2244492e-002, + 4.6573272e-002, + -1.8520798e-002, + -6.9907182e-002, + 1.1254468e-002, + 7.4484796e-002, + 2.3774997e-003, + -1.9725799e-002, + -1.1798209e-002, + -4.5521440e-002, + 2.7514728e-002, + -7.2190342e-002, + -2.9948385e-002, + -4.6214661e-003, + -7.9002112e-004, + 5.0066640e-002, + 5.3029490e-004, + -1.8871680e-002, + -1.9149132e-002, + 1.4202910e-002, + 3.0816823e-002, + -9.0922658e-002, + 2.0531126e-002, + -6.7237163e-002, + 3.5264507e-002, + -4.3345885e-002, + 4.3736504e-002, + -5.0592953e-002, + -1.9560698e-002, + 7.4759581e-002, + -1.5500722e-002, + -3.2266454e-002, + -1.4974813e-002, + -3.1814004e-003, + 7.1627759e-002, + -1.0014999e-002, + -4.4711458e-002, + 8.7059742e-002, + -6.6573462e-002, + 6.3231174e-002, + -3.9306487e-002, + -2.8763870e-002, + -3.4594112e-002, + -1.7333119e-002, + 2.7978317e-002, + -4.4558274e-002, + 4.0316504e-002, + -9.8056766e-003, + -1.1169830e-001, + 2.6367365e-003, + -6.3107346e-002, + -4.7852804e-002, + 1.4822515e-002, + -5.5825883e-002, + 8.4652163e-002, + 3.7276497e-002, + 5.8380260e-002, + 1.0308762e-003, + -1.7541914e-002, + -8.1294365e-002, + 2.6500601e-002, + 1.1576202e-002, + -2.8475597e-002, + -3.6427135e-002, + 1.0486963e-002, + 3.5852026e-002, + 1.7207452e-002, + -4.2250927e-002, + 9.2791032e-002, + 2.0848079e-002, + -1.0474350e-002, + -1.8906142e-002, + -3.9285383e-004, + -1.0622005e-001, + 3.0895699e-002, + 7.2310785e-002, + -4.9338252e-002, + -6.6112754e-002, + 1.7508514e-002, + 1.1321926e-003, + -2.4713477e-002, + -4.2692403e-002, + 3.6496772e-002, + -8.7503250e-003, + -2.3071223e-002, + 6.0697872e-002, + -1.6211612e-002, + 2.7467415e-002, + -2.3241079e-002, + 7.6276171e-003, + -6.3827211e-002, + 6.7257864e-002, + 2.2947393e-002, + 1.7785758e-002, + 4.1818868e-003, + 3.5410854e-002, + 1.0202987e-003, + -7.0561943e-003, + -2.0778987e-002, + 3.2302118e-002, + 4.8279751e-003, + -2.3094511e-002, + -5.9461961e-002, + 4.2486021e-002, + -8.3970460e-002, + 3.1847805e-002, + 1.4792567e-002, + 8.3035216e-002, + -1.9097569e-002, + -3.7566345e-002, + -1.9294024e-002, + -2.9735991e-002, + -1.6259656e-002, + 8.7230220e-003, + 1.5761104e-002, + 1.1869692e-002, + 3.3119792e-002, + -1.4862967e-002, + 1.1372784e-002, + -3.2009087e-002, + -2.9738311e-002, + 7.4243184e-002, + 4.4110110e-002, + -2.6555813e-002, + -1.4281194e-002, + -3.1948659e-002, + 2.7573051e-002, + 4.3762921e-003, + -1.5129696e-002, + -1.7735857e-002, + -4.4445686e-003, + -5.8616688e-002, + -2.7569930e-002, + -4.5140779e-002, + -7.2200604e-002, + 1.3667304e-002, + 5.7192972e-002, + -6.3690024e-002, + 5.5174808e-003, + -5.8892530e-002, + -3.6233013e-002, + 8.6180660e-002, + -6.4381045e-002, + 8.1908618e-002, + -8.2615195e-003, + -8.7344886e-002, + -3.6686884e-002, + -4.3487249e-002, + -2.7761943e-002, + -4.3954059e-002, + 1.0761718e-001, + -3.3942906e-002, + -5.6751929e-002, + 5.3761364e-002, + -8.2361460e-002, + -2.0107493e-002, + -1.3391457e-001, + -2.7865675e-002, + -3.7665218e-003, + 2.6626941e-003, + 2.1434427e-002, + 4.9598442e-002, + -9.1795559e-002, + 5.6763841e-002, + -7.2345509e-002, + 4.3385691e-002, + -6.4303252e-002, + -2.6067521e-002, + 3.1430980e-002, + -4.8380081e-002, + -1.7143742e-003, + 3.8524956e-002, + 4.7310190e-002, + -8.4985104e-003, + 2.5096835e-002, + -2.2478417e-003, + 4.8128123e-002, + 3.7762949e-002, + 1.4420063e-003, + -4.4095518e-002, + 4.5456933e-003, + -3.2426183e-003, + -1.2533115e-002, + 4.7767545e-002, + -2.8620801e-002, + 7.8751032e-002, + -1.6406002e-002, + 6.0648681e-002, + -5.7970442e-002, + -1.7637331e-002, + -6.9358645e-002, + -3.7997615e-002, + 3.9156091e-002, + 1.1321921e-001, + 8.4415942e-002, + -1.1387462e-002, + -1.6199663e-002, + -2.9916549e-002, + -2.7917984e-003, + -7.9695543e-002, + 8.2671498e-002, + 1.3319799e-002, + -1.7930240e-002, + -9.1601668e-003, + 4.1019127e-002, + 7.5932944e-002, + 1.0036314e-001, + 3.8966354e-002, + 4.6995786e-003, + -4.5149567e-002, + -4.8486656e-002, + -4.1927255e-002, + 1.1311800e-002, + 3.6819401e-002, + 1.7973596e-002, + 6.7898952e-003, + 1.5963322e-002, + -4.9877456e-002, + -3.7059174e-002, + 1.4450399e-002, + 2.0093318e-002, + 3.4367981e-002, + -5.5058558e-003, + -6.7143431e-002, + -4.8644499e-002, + -6.9472431e-002, + 2.5107776e-002, + -4.6781145e-002, + -2.7352285e-002, + -4.7986822e-002, + -7.1934644e-003, + -2.3173127e-002, + 6.4055565e-002, + -1.9370286e-002, + -4.9411717e-003, + 3.4615802e-002, + -5.2643368e-002, + -3.4227554e-002, + 5.9084487e-002, + -6.7507249e-002, + 1.4470533e-003, + 7.4639509e-002, + -3.9766965e-002, + 3.5756960e-002, + -7.0471549e-003, + -3.9222635e-003, + 7.3001614e-002, + 2.3197043e-002, + -2.5701022e-003, + -6.5877930e-002, + 2.7559657e-003, + 1.9592050e-002, + -9.3462547e-002, + -1.0871925e-002, + -2.9680792e-002, + -1.9738425e-002, + -2.7152604e-002, + 2.3876803e-002, + 4.5884118e-002, + -2.4799389e-002, + -2.0581584e-002, + -5.4267497e-002, + -2.6460954e-003, + 5.1362202e-002, + -6.9012380e-002, + 4.4005296e-002, + 6.3975781e-002, + -2.6047622e-003, + 1.2042036e-002, + 1.6037381e-002, + -5.1284209e-002, + -4.2194785e-002, + -1.6515324e-003, + 2.8902550e-002, + 2.6850380e-002, + -6.0423448e-002, + 5.8605766e-003, + 1.2158635e-002, + 7.2552454e-002, + 3.1314062e-002, + -9.3072204e-002, + 3.1162922e-002, + 1.3286605e-002, + 3.9595454e-002, + 4.0202073e-002, + 6.5767605e-002, + -1.2155519e-002, + 3.3751439e-002, + -3.2171914e-002, + 4.8066982e-002, + -3.9282293e-002, + 8.3241192e-003, + 6.9639890e-002, + 2.7334229e-002, + -1.5479579e-001, + 1.6788538e-002, + -3.1497022e-002, + -4.2282993e-002, + 6.3590085e-002, + 2.5116069e-002, + -8.6396723e-003, + 3.3260424e-002, + -8.4721611e-002, + -3.3390999e-003, + -1.1246017e-001, + 4.1668358e-002, + -5.8633451e-002, + 1.8811584e-002, + -2.6955831e-002, + 3.4502149e-002, + -1.5140931e-002, + -1.1615508e-001, + 1.9473941e-002, + -2.4164678e-002, + -4.7663500e-002, + 2.5149605e-002, + -4.2667606e-002, + -3.0691488e-002, + -6.2397484e-002, + -2.2317443e-002, + 7.1583564e-002, + -1.7501358e-002, + -7.4035381e-003, + 3.6729476e-002, + -1.1245837e-002, + 2.6520782e-002, + -8.1593552e-002, + -6.9408470e-002, + 1.4619786e-003, + 3.8453478e-003, + -6.3397206e-003, + -6.0058523e-002, + -4.8251718e-003, + 3.8074781e-002, + -7.8163411e-002, + 2.1385600e-002, + -2.1922130e-002, + -4.0160455e-002, + -6.8293755e-002, + 9.0554557e-004, + 2.6664980e-002, + 7.1501149e-004, + 2.0586511e-002, + 3.8317298e-002, + 1.2622402e-002, + 3.0425320e-002, + -5.9992562e-003, + -3.2448647e-002, + -8.4599232e-002, + 2.0966498e-002, + 3.0616978e-002, + -4.1909029e-003, + 4.3755380e-002, + 3.5853709e-002, + 8.2636139e-002, + 5.2616538e-002, + -4.4023308e-002, + -4.5906585e-002, + 2.5247372e-002, + 1.5587727e-002, + -2.8171046e-002, + -3.2571994e-003, + 3.1224580e-002, + 2.3534457e-002, + 2.4495916e-002, + 2.3711856e-002, + 4.4990479e-002, + 2.4656755e-002, + 1.2819956e-002, + 5.7528241e-002, + -6.3140487e-003, + -9.8533686e-002, + -5.9046861e-002, + 4.5919961e-002, + 4.9303678e-002, + -5.1366348e-002, + 2.4237326e-002, + -3.5253937e-002, + 7.6315728e-002, + -6.2809404e-002, + -1.1060411e-002, + 1.2072602e-002, + 8.1692168e-002, + 8.2459510e-002, + 1.2056340e-003, + -1.0799649e-001, + -7.2058599e-002, + 5.1223849e-002, + 1.1635586e-001, + 6.3237829e-002, + 4.1510274e-002, + -2.9788578e-002, + 4.8771019e-002, + -5.6674600e-002, + 1.9869930e-002, + -1.2678819e-002, + -2.7919754e-002, + 2.8331693e-002, + 3.1691790e-002, + 1.1562239e-002, + -2.8202192e-002, + 2.1270404e-002, + -4.2846202e-002, + -3.2805821e-002, + 1.5184402e-002, + 5.4017276e-002, + -7.4480916e-003, + 3.9322390e-002, + 8.8590506e-002, + 1.8869046e-002, + -4.8504749e-002, + 1.9943452e-002, + -4.0731200e-002, + -1.2975217e-003, + -1.6745164e-003, + 4.7281664e-002, + -2.7791569e-002, + 8.0857121e-003, + -4.8178120e-002, + -5.8281241e-002, + -3.2593209e-002, + -2.1746188e-002, + -1.0017483e-002, + 2.9529554e-002, + -1.4875157e-002, + -4.5985303e-002, + 4.9477795e-002, + -2.8808805e-002, + -1.3613209e-002, + -3.2427996e-002, + -7.3709623e-002, + 2.9008787e-003, + -2.4949574e-002, + 2.9417830e-002, + -5.0911040e-002, + 7.2199223e-002, + -3.8502572e-003, + -9.9986041e-002, + -1.0110846e-001, + 2.7240523e-002, + 3.7231607e-004, + -4.8403626e-002, + -4.2828865e-002, + -4.0941132e-002, + 2.1262003e-002, + 2.8579653e-002, + -3.8107106e-002, + -2.5403299e-002, + 4.0409634e-002, + -1.3506783e-001, + 6.7020935e-002, + 7.6919909e-002, + -6.2598829e-002, + -4.4526445e-002, + 1.2270630e-001, + 2.3974241e-002, + -3.6434038e-003, + 4.6607563e-002, + 8.1524293e-002, + -3.0664049e-002, + 4.4022028e-002, + 8.6563738e-002, + 6.5752991e-002, + -6.7108146e-002, + -1.0342413e-001, + -1.8539076e-002, + -3.0153611e-002, + 6.7396260e-003, + -4.4950103e-002, + -1.2515800e-003, + 3.0646680e-002, + 5.5510478e-002, + -5.2142526e-002, + -6.6687624e-002, + 1.5134636e-002, + 1.3498064e-002, + -5.4450472e-002, + -8.9529836e-003, + 3.0094154e-002, + 3.2202481e-002, + 1.3948693e-002, + -6.7197034e-002, + -8.5015250e-002, + 6.3266660e-002, + 4.2798636e-002, + -2.0333357e-002, + -4.0383900e-002, + -1.3841616e-002, + 6.3539401e-002, + -1.4953539e-002, + 7.3749647e-003, + 4.6124894e-002, + -3.3099545e-002, + 1.6994609e-003, + 3.1756119e-002, + 1.1361146e-001, + 2.3601853e-002, + -6.1163866e-003, + 1.4640892e-002, + -1.3002994e-001, + -5.9991837e-002, + -2.2185968e-002, + -3.5202454e-003, + -3.2725772e-002, + -1.6788319e-002, + -6.9143762e-002, + -3.0097649e-002, + 1.2429939e-001, + 3.2580395e-002, + -5.0115073e-002, + 5.0306592e-003, + -4.4954061e-002, + 3.6014498e-002, + -1.3451790e-002, + 1.6399117e-002, + 1.3923416e-001, + -4.9725951e-003, + 6.2052260e-003, + -1.1645022e-001, + -3.5608026e-003, + 6.4542089e-002, + 2.5646928e-002, + -3.9385217e-002, + 3.4619781e-002, + -5.5728973e-002, + -4.1560782e-002, + 1.8601185e-003, + -7.7632154e-002, + -1.1198136e-001, + 1.7871366e-003, + 3.2749909e-002, + 6.3402834e-002, + -5.4553077e-002, + -5.3258342e-002, + 3.3343720e-002, + 5.6556702e-002, + -2.8265688e-002, + -2.3372050e-002, + -7.1953496e-002, + 4.9907070e-002, + -2.6195346e-002, + -3.1269328e-002, + -2.2738778e-002, + -3.6952069e-003, + 2.3055605e-002, + 3.7713246e-002, + -3.3123125e-002, + 6.3977198e-002, + 1.2888268e-002, + -6.4863602e-002, + -4.6370451e-002, + -1.2762725e-002, + -1.1385579e-002, + 5.3278522e-002, + 4.0903155e-003, + 2.4856544e-003, + 2.6887809e-002, + -3.6020834e-002, + 1.7437443e-002, + 2.0139602e-002, + 2.9239905e-002, + 3.8038669e-002, + -9.6656754e-002, + 1.5283078e-002, + -9.4684237e-002, + 3.5509017e-002, + -2.3867173e-002, + 4.9278727e-003, + -3.9793551e-002, + -1.1285602e-002, + -1.1809578e-002, + 2.7623350e-002, + 2.1829332e-003, + 2.9116516e-002, + -2.3743110e-002, + -3.6766547e-002, + 2.0571789e-002, + 5.6084571e-002, + 1.3024358e-001, + -7.5886589e-002, + 2.7947551e-002, + 2.3155403e-002, + -3.1278004e-002, + -1.4436652e-002, + -2.4776289e-002, + -6.8540264e-003, + -1.0098350e-002, + -8.8675200e-002, + 1.5859746e-001, + -9.1002037e-002, + 1.2604720e-002, + -1.0483836e-002, + -2.8280415e-002, + 7.1881441e-002, + -5.6741201e-002, + 6.6804943e-002, + 6.1990105e-002, + 8.1565279e-002, + 2.2720394e-002, + -1.2405569e-002, + 7.1876233e-002, + -1.0267524e-001, + -3.0958839e-002, + 7.9476530e-002, + 2.1440879e-002, + -3.6594375e-002, + 1.2693478e-002, + -3.5996147e-002, + -4.4807775e-002, + 3.0175162e-002, + 6.0207188e-002, + -4.4551692e-003, + 5.2444239e-002, + -6.7182348e-002, + 3.4282089e-002, + 1.2050117e-002, + 6.7343302e-003, + -3.4597852e-002, + 6.2799536e-002, + 9.0535361e-002, + 4.6750855e-002, + 4.5616156e-002, + -4.7775494e-002, + 3.3437120e-002, + 6.3247569e-002, + -2.5086044e-002, + 6.0392800e-002, + -1.0344192e-001, + 1.0532757e-002, + 8.0919299e-003, + -2.0549100e-002, + 7.9851230e-002, + 5.9509621e-002, + -1.0304151e-002, + -3.6671778e-003, + 1.0290329e-002, + -3.6286054e-002, + -1.1732592e-002, + -8.4237566e-002, + 3.3390752e-002, + -5.1523669e-002, + -7.7703392e-002, + 7.2951732e-002, + 5.5907824e-002, + 5.5894272e-003, + 5.4254663e-002, + 5.1024916e-002, + -5.6879548e-002, + -6.2027367e-002, + -5.6508306e-002, + -4.3199186e-002, + -7.0858160e-002, + -2.7514315e-002, + -1.0304944e-002, + 9.7007038e-004, + -6.7224049e-003, + 9.2200691e-003, + 3.8879401e-003, + -6.5395433e-002, + 6.6739257e-002, + 6.1434975e-002, + -7.8933867e-002, + -8.4834779e-002, + -2.7405250e-002, + -2.6177970e-002, + -3.3974921e-002, + -3.5379505e-003, + 5.0807223e-002, + -6.0485730e-002, + -7.1839018e-003, + 2.6693750e-002, + 5.3186567e-002, + 1.4183779e-002, + -2.2116051e-002, + -1.3741848e-002, + 6.1342417e-002, + -3.7993387e-003, + 3.7238204e-002, + -1.0739599e-001, + -1.4549117e-002, + 4.0386015e-002, + 1.2569153e-002, + 3.5445067e-002, + -3.8437920e-002, + -1.4546469e-002, + 2.3252293e-002, + 5.8740276e-002, + -4.5320281e-002, + 4.8086444e-002, + -4.6158419e-003, + -5.5124482e-002, + -3.3884263e-002, + -1.6266463e-002, + -1.6153097e-002, + -7.1902422e-004, + 4.7423985e-002, + 4.5522942e-002, + 5.8189486e-002, + -1.6178881e-002, + -8.5068904e-003, + -2.1481593e-002, + 5.9052882e-002, + 7.6940824e-002, + -4.1182363e-002, + 9.3889318e-002, + 3.2541071e-002, + -5.0966470e-002, + 1.1989934e-002, + 1.3485465e-002, + 1.1716420e-002, + -3.3544036e-002, + 1.0756654e-001, + 2.3665782e-002, + 5.1632941e-002, + 3.3393177e-002, + 2.6965276e-002, + -9.3765636e-003, + -4.0374893e-002, + -7.6274872e-002, + 1.8358287e-002, + -5.4971891e-002, + -6.1388507e-002, + 4.0747836e-002, + -3.0364737e-002, + -3.8176810e-002, + 2.1957238e-003, + 1.5046955e-002, + -4.6671984e-003, + -3.7148168e-002, + -3.7455685e-002, + 3.7180183e-003, + -8.5869921e-003, + 3.5823221e-002, + 2.0854178e-002, + -5.6165218e-002, + -9.2879840e-002, + 1.4952542e-002, + -1.6637472e-002, + 2.7553373e-002, + 1.1493587e-001, + -3.5352769e-002, + -6.9065396e-002, + 7.7929176e-002, + -5.9205594e-002, + -1.8989624e-002, + 1.1827864e-002, + -3.8579019e-002, + 1.6537438e-002, + -4.5152596e-002, + -8.0801346e-002, + -3.4708707e-002, + -2.0902185e-002, + 3.5484478e-002, + -7.2048970e-002, + 3.9760809e-002, + -2.1048159e-002, + 2.9412146e-003, + -1.2228266e-002, + -1.0549788e-002, + -1.3705371e-002, + -4.2308328e-002, + -8.5322508e-002, + 5.6722120e-004, + 3.8264621e-002, + 4.3257303e-002, + 2.8754160e-002, + 3.3445727e-003, + 2.9282907e-002, + 4.8556817e-002, + -3.3795246e-002, + 4.0977665e-002, + 3.6274969e-002, + 3.3552753e-002, + 2.9872002e-002, + 6.3307072e-002, + 1.4992383e-002, + -5.8203262e-002, + -3.0168145e-002, + -3.2352139e-002, + 7.6165643e-002, + 7.1774864e-002, + -1.7731640e-002, + 3.7646033e-002, + 5.8535492e-003, + 8.3961663e-002, + -7.6352210e-003, + -3.6557713e-003, + -6.1713535e-002, + -4.8057903e-002, + -4.6264109e-002, + -3.4792201e-002, + -2.7416585e-002, + -1.3744116e-003, + -1.9306191e-002, + -5.0539515e-002, + 2.7677455e-002, + -2.2617917e-002, + -8.4784776e-002, + 7.3259229e-002, + 5.9548509e-002, + -7.2282648e-002, + -5.0784237e-002, + 9.1028580e-002, + 1.6823871e-001, + 4.3922313e-002, + 2.0660018e-002, + 1.2905801e-003, + -5.9644574e-003, + -6.6967719e-003, + 2.1111482e-002, + 4.5767224e-002, + 1.9131948e-002, + 2.6813139e-002, + -4.6825266e-002, + 1.1768354e-002, + -3.0426377e-002, + -7.0347178e-003, + -7.6017599e-002, + 2.1078534e-002, + -9.1780175e-002, + 2.7352079e-002, + 2.7780454e-002, + 8.3826886e-003, + -1.5967673e-002, + -1.0580313e-002, + 3.8124734e-002, + 3.6951219e-002, + -2.5011240e-002, + 2.9019645e-002, + 3.3574092e-002, + 1.2199007e-002, + -6.3328122e-002, + -1.0293542e-001, + 6.2316941e-002, + -1.1529230e-003, + 1.0592972e-001, + -2.3803313e-002, + -4.2884377e-002, + -2.3136181e-002, + 9.6100002e-003, + -3.8942235e-002, + 1.0613309e-001, + 1.1584978e-002, + -2.8945108e-002, + 1.1978745e-001, + 3.3535039e-002, + -3.3192905e-002, + 6.4322894e-002, + 4.3326082e-002, + 2.2661431e-002, + 2.1067896e-002, + -1.6775258e-002, + -1.1513173e-001, + 1.6050052e-002, + 3.6844183e-002, + 2.9072793e-002, + -6.7255761e-002, + 5.7102385e-002, + 7.0546617e-002, + -2.0826937e-002, + -5.7583856e-002, + 3.0146035e-002, + -1.9649341e-002, + 5.1108010e-002, + -1.2049234e-001, + 9.1604975e-003, + -4.4366320e-002, + 1.0940581e-002, + -7.4110213e-002, + 1.0027252e-001, + 8.3559986e-002, + -5.0547965e-002, + 3.0123395e-002, + 7.0196532e-002, + -8.3469946e-002, + 3.3882963e-002, + 6.1607561e-002, + 4.4793665e-002, + -9.6577712e-002, + -5.0411980e-003, + -1.5066601e-002, + 2.4904787e-002, + 1.1340361e-002, + 2.9052246e-002, + 2.6840614e-002, + -1.9931112e-002, + 5.2525978e-002, + -4.9751069e-002, + -7.9276887e-002, + 2.8081748e-002, + -4.1223168e-002, + 1.3105117e-002, + -2.6569475e-003, + -3.2102570e-002, + -2.6357544e-002, + 2.2152608e-002, + -3.1539891e-003, + -3.4785718e-002, + -1.0592171e-002, + -4.0300905e-002, + -1.5702723e-002, + -1.8712957e-002, + 3.3197549e-002, + -3.6279117e-002, + 4.2838238e-002, + -1.6489429e-002, + 2.4648914e-002, + 5.1252616e-003, + -8.1225473e-002, + -5.6459253e-002, + -5.2348110e-002, + -7.0335906e-002, + -3.3338823e-005, + -3.2311169e-002, + 7.4676135e-002, + -3.7143822e-002, + -6.8303532e-002, + -7.0033274e-004, + -3.7552999e-002, + -6.6305361e-002, + 1.2196684e-001, + 2.2084222e-002, + 4.1475857e-002, + -1.0862949e-003, + -4.0143874e-002, + -3.7947485e-002, + 2.3605616e-002, + 2.3128901e-002, + 1.6999557e-001, + 8.7507268e-003, + -1.6086519e-002, + 1.6438629e-002, + 5.3086378e-002, + 4.2778341e-002, + -5.1411551e-002, + -9.1155004e-003, + 7.1703894e-002, + -6.2919585e-002, + -4.1252239e-003, + -2.7800338e-002, + 1.3406385e-002, + -1.9639614e-002, + 2.0766865e-002, + -8.0707557e-002, + -7.9126401e-003, + 1.2061087e-002, + 7.8233420e-002, + 2.5787108e-003, + 9.6325419e-002, + 4.2169871e-002, + 4.5779560e-002, + 1.1692399e-002, + 3.6624616e-002, + -2.1368960e-002, + 8.6087403e-002, + -3.9290515e-002, + -9.1694613e-003, + 3.1814092e-002, + 2.4160765e-002, + -1.1817798e-003, + 1.1293805e-001, + 3.5901275e-002, + 2.3964131e-002, + 1.4594516e-002, + 8.3442765e-002, + 2.7873584e-003, + 9.2888387e-002, + 5.6597406e-002, + 3.3678386e-002, + 1.1285883e-002, + -1.3345965e-002, + -3.7971276e-002, + 3.8853868e-002, + 4.0434589e-002, + -3.5457626e-002, + 3.4183998e-002, + 9.8248684e-002, + -7.6115939e-002, + -1.1769491e-002, + -3.8386164e-002, + -1.8975843e-002, + -9.3988535e-002, + -5.5576121e-003, + -1.8636003e-002, + 2.8386234e-002, + -2.4200578e-002, + 4.1252766e-002, + -6.8000375e-002, + -3.7388633e-002, + -3.0010634e-002, + -2.0049886e-002, + 2.5499201e-002, + -3.7598273e-002, + -4.4794045e-002, + 4.9668753e-002, + 2.8526404e-002, + -7.6218361e-003, + -1.0150563e-001, + -3.1635380e-002, + 6.0899411e-002, + -4.0702573e-003, + 3.6908492e-002, + 6.0695811e-002, + -8.5097943e-002, + 5.3730269e-002, + 3.7528389e-003, + 9.3525516e-002, + -1.4898976e-002, + 2.7723761e-002, + -1.3087617e-002, + -8.5905788e-003, + -4.0551186e-003, + 5.2805805e-003, + 6.8736269e-002, + 1.5477601e-003, + 4.0766710e-003, + 2.4948069e-002, + -2.3695927e-002, + 2.0778232e-002, + 7.7785189e-002, + -6.5214959e-002, + -1.6680307e-002, + -5.1966107e-002, + 7.5663630e-003, + -1.3256079e-002, + 2.9625848e-002, + -3.9745297e-002, + 2.5236371e-002, + -3.2270585e-002, + 6.2655107e-002, + 3.3731838e-002, + 2.2075588e-003, + -2.9591354e-002, + 3.1341479e-002, + -7.6083655e-002, + 6.1296972e-002, + -5.6695620e-002, + 2.2323220e-002, + 2.3643317e-003, + 2.5031378e-002, + 5.5413805e-002, + 6.0973843e-002, + -7.3883029e-002, + 1.3029020e-002, + 6.5448736e-002, + -2.3732566e-002, + -1.6089444e-002, + -2.1074484e-002, + 5.7948843e-002, + 8.6615559e-002, + -9.1319744e-002, + -1.0161538e-002, + 1.9629470e-002, + 1.9360651e-002, + -2.8093541e-002, + -4.2935479e-002, + 1.0709420e-002, + 7.8669934e-002, + 2.3835887e-002, + 1.8165279e-002, + -5.4214119e-003, + -7.9902014e-003, + 4.5058379e-002, + -3.2063499e-002, + -5.8672800e-002, + 1.2173177e-002, + 5.9993154e-002, + 2.3138893e-002, + 8.0998931e-003, + -4.4800380e-002, + -2.4859361e-002, + -1.5868492e-002, + -5.2323712e-002, + -4.5973299e-002, + -2.3052455e-003, + 8.1582903e-003, + 6.8065483e-002, + 7.6438296e-004, + 4.0392238e-002, + -6.5966937e-002, + -5.0614520e-002, + -5.5301523e-002, + -4.2561773e-003, + 5.9937931e-002, + -2.1382190e-002, + -2.0676084e-002, + -3.5839724e-002, + -1.2403270e-002, + -1.8285642e-002, + -4.5681905e-002, + 2.5535673e-002, + 1.4234783e-002, + -1.9259208e-002, + -2.5661378e-002, + 3.0184961e-002, + -5.6818389e-002, + 3.2310662e-002, + -2.4301821e-003, + -1.2328487e-002, + -5.4786335e-002, + -4.8916330e-002, + 4.8190116e-002, + -6.0850449e-002, + 7.7620003e-002, + -6.6473044e-002, + 5.1361693e-002, + -4.4367608e-002, + 5.9245756e-002, + 5.3474787e-003, + 3.8059821e-003, + -6.1171918e-002, + -2.9543201e-002, + -8.3560612e-003, + -4.1202373e-002, + -5.3271164e-002, + 7.6473415e-002, + 1.3747330e-002, + -4.2692942e-002, + -4.7688735e-002, + 9.0017757e-002, + -5.5124068e-002, + -4.9430822e-002, + 1.9839950e-002, + 6.1066303e-002, + -1.3518935e-001, + 4.5758030e-002, + 2.8061894e-002, + 2.2738266e-002, + -9.3128822e-003, + 7.9618280e-002, + -1.2187199e-001, + 4.5605462e-002, + -3.0479221e-002, + 3.8694000e-002, + -1.8124762e-002, + 3.7759175e-002, + 1.8158014e-003, + -2.7070632e-002, + -2.3634825e-002, + 5.2676876e-002, + -5.2016000e-003, + -5.4593248e-002, + -1.6338775e-002, + -8.0919891e-002, + 8.7671746e-003, + 5.8316283e-002, + -6.9144058e-002, + -4.6936119e-002, + 1.6594244e-002, + -7.6784768e-002, + -6.3547981e-003, + 4.8236469e-002, + 1.6578926e-002, + -2.8223303e-002, + -8.7243754e-002, + 5.5790867e-002, + 4.5976330e-003, + -4.0593161e-003, + -7.1609202e-002, + 3.6451850e-002, + -3.6051938e-002, + 1.0343606e-004, + 4.0493147e-002, + 2.1330427e-002, + -3.3170735e-002, + -4.4584020e-003, + 3.1555313e-002, + -1.1414545e-001, + 5.6867307e-002, + 4.0626699e-002, + -5.8860350e-002, + -1.0003188e-001, + -4.8326893e-002, + -1.2614691e-002, + -2.1586874e-002, + -3.1935606e-002, + 2.4103451e-002, + 1.4488790e-002, + -8.0859096e-004, + -3.8980020e-003, + 7.4909148e-002, + -2.8049185e-002, + -2.0918789e-002, + -2.4711940e-002, + 5.3455068e-002, + -9.7517045e-003, + -2.4433675e-002, + 3.7640959e-002, + 2.4437924e-002, + 4.6113770e-003, + -2.1101125e-002, + -2.2852117e-002, + -7.2572348e-002, + 3.6761328e-002, + 2.6652183e-002, + -4.3100149e-002, + -5.4098286e-002, + 8.2220041e-002, + 5.5613895e-002, + 5.4603855e-002, + -1.3589191e-001, + 2.3347518e-002, + 4.6453611e-002, + 2.2623921e-003, + 6.0644536e-002, + -7.5601564e-002, + -8.9194042e-002, + -3.4410351e-002, + -3.4360013e-003, + 5.1666691e-002, + 1.2464056e-002, + -2.3030505e-003, + -3.9004649e-002, + 1.1817405e-002, + -3.4117635e-002, + -2.8693035e-002, + -1.5931261e-002, + 8.0677220e-004, + 1.8397691e-002, + -3.1052320e-002, + 4.9726240e-002, + -2.0747799e-002, + -6.0637710e-003, + -7.9396747e-002, + 4.8372461e-002, + -7.1979765e-002, + 2.6832942e-002, + 2.9273777e-002, + -4.8337996e-003, + 4.0391770e-003, + -9.4918066e-002, + 6.2066596e-002, + 4.9875577e-002, + -3.3753903e-002, + -2.4500392e-002, + 9.0658929e-002, + -9.8343476e-002, + -6.2504733e-003, + 1.1991216e-001, + 2.8944337e-002, + 2.6898626e-003, + -6.4267875e-002, + 2.9019187e-002, + 1.9971213e-002, + 8.0684873e-003, + 1.3081097e-002, + -3.1283754e-002, + -2.8489269e-002, + -1.1686268e-001, + -1.3745347e-002, + 5.3686243e-002, + -5.2197217e-002, + -3.3465705e-002, + -3.5083431e-002, + 1.6015164e-002, + 2.4493466e-002, + -2.3306198e-002, + -1.9672026e-002, + -7.6748565e-002, + -7.1159132e-002, + -3.6831968e-002, + -1.1592501e-001, + -1.1802673e-001, + 2.8843104e-002, + -5.9118430e-002, + -1.1106526e-002, + -4.0643480e-002, + -3.3903934e-002, + 6.9026642e-002, + -3.3357058e-002, + 3.1574083e-002, + 4.0538895e-002, + 4.3133551e-002, + 3.7814770e-002, + 6.4315631e-002, + -5.5887205e-002, + -6.1198396e-002, + 7.2376501e-002, + -4.4847288e-002, + 4.4972439e-002, + 8.9532496e-002, + 2.7491210e-002, + 3.5765916e-002, + -5.8314299e-002, + -1.5996091e-002, + -4.3521287e-002, + -2.8304205e-002, + -4.3486571e-002, + 1.0849438e-001, + 2.2361367e-002, + -6.1362009e-003, + 5.3111507e-002, + -8.8565282e-002, + 8.4842988e-002, + 1.0627885e-002, + 4.4828472e-003, + 7.7250566e-003, + -3.5888413e-002, + 4.5405946e-002, + 9.5357093e-003, + 3.8049221e-002, + 1.1798868e-002, + 8.5901681e-002, + 7.2651393e-002, + -1.0648259e-002, + -3.5412792e-002, + -5.2852119e-003, + -2.8006256e-002, + -5.8455622e-003, + 9.2263862e-003, + 1.4651709e-002, + -1.1429416e-001, + 8.0368439e-002, + 2.6278264e-002, + 2.0947848e-002, + 5.9186459e-002, + 3.0967487e-002, + -1.1507298e-001, + -3.4239562e-004, + -2.0939429e-002, + 6.9101989e-002, + 1.9188787e-002, + -1.7007634e-002, + -1.4226805e-002, + 2.0497813e-003, + 4.8643630e-003, + -5.0243128e-002, + 2.6571757e-002, + -2.5756622e-002, + -6.2136271e-002, + 3.0876774e-002, + -3.2966648e-002, + -4.6798326e-002, + -7.2864522e-002, + -7.0620327e-002, + 3.1514440e-002, + 4.7419175e-002, + -2.9639040e-002, + -7.4872381e-002, + 1.0268214e-001, + -6.4408455e-002, + -5.1714244e-002, + -1.4811842e-002, + -2.6652795e-002, + -3.3398841e-002, + -9.1093311e-002, + -2.9613673e-002, + -3.2849316e-002, + -2.1792627e-002, + -4.8905018e-002, + 3.8278002e-002, + -1.0578267e-001, + 3.9883500e-002, + -4.0322452e-002, + -7.7085856e-002, + -1.1560340e-002, + -9.6078464e-003, + -5.2790120e-003, + -1.7445510e-002, + 4.1210396e-002, + -3.1966850e-002, + -4.2623715e-002, + -3.8224686e-002, + -2.3460384e-002, + -1.8322700e-002, + 1.5049174e-001, + -3.1993543e-002, + 4.3014183e-002, + -4.4366020e-002, + -1.9251396e-002, + -1.2898947e-002, + -6.0899923e-002, + -5.9898591e-002, + -5.6557253e-002, + 4.6067919e-002, + 2.0882012e-002, + -7.1937529e-002, + -9.5914837e-002, + -1.2626698e-001, + -3.6792717e-002, + 2.8022409e-002, + -3.4921767e-002, + -2.2305614e-002, + -3.2328726e-002, + -4.8809030e-002, + -2.6925977e-002, + -4.2114647e-002, + 8.7023862e-002, + -3.7654336e-003, + 6.9322688e-002, + 9.2912513e-003, + 5.7435044e-002, + 1.9609569e-002, + -1.1570562e-002, + 6.1049764e-002, + -6.4977165e-002, + -5.0641683e-002, + -4.9830239e-002, + 2.9619165e-002, + -4.3292073e-002, + -6.2860680e-002, + 6.3449012e-002, + 6.3302743e-002, + -3.7096028e-002, + -4.6860354e-002, + 1.6643809e-002, + -2.8812456e-002, + -1.2949017e-004, + -5.0303595e-003, + -5.1531111e-002, + 1.0185519e-001, + -8.8467370e-003, + -6.4260237e-002, + 2.2972796e-002, + -8.7208177e-003, + 2.1703090e-002, + -3.2583688e-002, + 1.9180369e-002, + -4.6604492e-002, + 5.9620323e-002, + -2.3169309e-002, + 1.7923404e-002, + 7.0399591e-002, + -6.3632676e-003, + -6.2662420e-002, + -5.0818406e-003, + 7.6310034e-002, + 3.8440333e-002, + 2.3108218e-002, + 1.0992061e-001, + -6.6023131e-002, + 1.0339039e-002, + -1.2454926e-002, + 3.0748449e-002, + 3.8733454e-002, + -8.1029526e-002, + -6.3890932e-003, + -1.7310614e-003, + -6.5448180e-002, + -1.3567927e-002, + -1.4651225e-002, + -1.6402517e-003, + -4.0889024e-002, + 3.3267739e-002, + -8.7669631e-002, + -1.1762527e-001, + -3.0337637e-003, + -1.0579264e-001, + 3.8458061e-002, + 6.1506618e-002, + -1.2438319e-002, + -2.0981512e-002, + 8.6707387e-003, + 4.1305048e-002, + 5.8010222e-002, + 3.4177414e-002, + 6.1614068e-002, + 3.7742022e-002, + 2.2274616e-003, + -3.3374053e-002, + -1.3841013e-002, + -1.5519456e-002, + -1.1770865e-001, + -4.0589703e-002, + 1.1432496e-001, + -2.8665001e-002, + -9.7087434e-002, + 2.8739815e-002, + 9.2917531e-002, + 1.1938896e-001, + -2.9010572e-002, + -3.4721428e-002, + -3.4855927e-002, + -1.2121671e-002, + -1.0158399e-001, + 9.7895131e-002, + -7.8712576e-002, + -7.9976995e-002, + 7.6185673e-002, + -2.8833935e-002, + 1.8354206e-002, + -1.7587259e-001, + -7.8647771e-002, + 2.2256759e-002, + -2.1611016e-002, + 2.4071583e-002, + 4.5227886e-004, + -7.2657111e-002, + -7.2168746e-002, + -1.1452740e-002, + 1.6181869e-002, + 4.5831060e-002, + -2.3369801e-003, + -2.8727581e-002, + 7.5005238e-003, + -8.9739571e-003, + -4.1100109e-002, + -1.6087343e-002, + 7.4606898e-003, + 2.9933544e-002, + -1.2690286e-001, + -3.9049832e-002, + 2.7720568e-002, + 1.7947841e-002, + 3.4410773e-002, + 5.5729818e-003, + -1.8016513e-002, + -4.8830323e-002, + 3.2716530e-002, + -3.4232512e-002, + -1.6426973e-002, + 5.0795800e-002, + -3.1791729e-002, + 3.7707010e-002, + 4.5092581e-002, + -4.8603247e-002, + 2.9459071e-002, + -4.6422186e-002, + 3.9296295e-003, + -2.8900220e-002, + 1.1207343e-002, + -3.5131485e-002, + 3.0510860e-002, + 1.0155622e-001, + 6.2187792e-003, + 6.7503241e-002, + 4.7232070e-002, + -2.1226837e-002, + -8.4154353e-003, + 2.0913858e-002, + 7.0127327e-003, + -1.2448522e-002, + 1.6449412e-002, + 4.5151926e-002, + 4.6836548e-002, + -2.0687186e-002, + -7.3644538e-002, + -1.0260562e-001, + 4.1594354e-004, + 2.2962943e-002, + -3.6753478e-002, + -3.6656754e-002, + -3.9912894e-002, + 1.1998781e-002, + 1.2228691e-002, + 6.9910277e-002, + 2.4035919e-002, + 7.1080248e-003, + 3.6471267e-002, + -1.5899153e-003, + -6.2981316e-002, + -4.8019402e-003, + 9.9610031e-002, + 3.4685502e-002, + -1.4906597e-001, + 6.2799402e-002, + -3.8932025e-003, + 3.5313345e-002, + 6.4080127e-003, + 7.7712074e-002, + 1.9652177e-002, + 3.3529556e-002, + 6.7998095e-002, + 4.0481914e-002, + -4.5148562e-002, + 1.2390995e-001, + 6.0472177e-002, + -4.0537793e-002, + -2.9016904e-002, + 1.0069785e-002, + -4.3630516e-002, + 1.6317010e-002, + -8.1563635e-003, + -2.9428878e-002, + -1.0007097e-002, + 1.1748494e-003, + -3.7584384e-003, + -1.0136314e-002, + 6.9501199e-002, + -6.2079897e-002, + 5.6550846e-002, + -3.1224895e-004, + 1.5172074e-002, + 3.5494228e-002, + -2.8525286e-002, + 7.0934847e-002, + -2.1855207e-002, + -9.0589689e-002, + -5.0420263e-002, + -6.4220854e-002, + 8.0572534e-002, + 4.4657936e-002, + 3.8900053e-002, + 2.3038306e-002, + -2.9059798e-002, + 4.1790833e-002, + -1.4498459e-003, + -1.4247977e-002, + -7.2557019e-003, + 7.0209000e-002, + 7.1292433e-002, + -1.0914340e-002, + 1.0671194e-001, + -3.9136244e-002, + -1.3175217e-002, + 1.3764681e-002, + 1.1563616e-001, + -6.3896840e-003, + -6.2527708e-002, + 8.8512912e-002, + -2.9045669e-002, + 1.5227173e-002, + -5.0667751e-002, + 1.2560643e-001, + 7.4986299e-002, + 3.3825251e-002, + 1.5514266e-003, + -5.2532720e-002, + 1.7029297e-002, + -3.2944301e-002, + -6.1748947e-002, + 2.6402422e-002, + -2.6902014e-002, + -1.1054785e-001, + 4.5217579e-002, + 7.2634916e-002, + 4.7126396e-003, + 5.3388646e-002, + 1.4724645e-002, + 4.8733852e-002, + -2.4509080e-002, + -9.1580431e-002, + 5.2106999e-003, + -1.5643665e-001, + -4.8892928e-003, + -5.3026671e-002, + -4.4146053e-004, + 3.2444612e-002, + -2.3101994e-003, + 9.4890488e-002, + -7.8052719e-002, + 6.0338172e-003, + -4.0433742e-002, + -3.9104783e-002, + 4.0994343e-002, + 7.7513705e-002, + -1.8133412e-002, + -1.8801315e-002, + 9.9180571e-002, + 5.9051814e-002, + 3.2637953e-002, + 4.5773237e-002, + 9.2868125e-003, + -4.4946634e-002, + -5.0590403e-002, + -3.3365865e-002, + 3.5527025e-002, + 7.4204867e-003, + 1.5004459e-002, + -3.4647091e-003, + 5.5465088e-002, + 1.1416662e-001, + -2.6462288e-002, + 6.8671916e-002, + -6.3002510e-003, + 1.1583924e-002, + 3.1050102e-003, + -1.0105237e-001, + -1.0657225e-002, + -9.8132990e-002, + -2.8254118e-002, + 5.8377956e-002, + -2.3015648e-002, + -1.7437864e-002, + -2.2634945e-002, + -4.8192213e-002, + -4.7584233e-002, + 1.9414654e-002, + -2.7057831e-002, + 1.7158611e-002, + 1.3317117e-001, + -5.5081291e-002, + -5.0017430e-002, + 7.6813579e-002, + 9.4583304e-002, + -6.9067814e-002, + 1.9120563e-002, + 2.1258087e-002, + 7.2055539e-002, + -4.4266255e-002, + -3.2205709e-002, + -2.8779031e-002, + -2.3481940e-002, + 1.7708910e-002, + -1.9311139e-002, + 5.3418240e-002, + 2.4606925e-002, + 5.0846628e-003, + -2.0453302e-002, + 3.5461384e-002, + 1.3245649e-002, + -1.4856256e-002, + -4.1995487e-002, + -6.8461842e-003, + 4.3425178e-002, + -4.2381240e-002, + -1.2470922e-001, + -6.6566711e-002, + -1.5328279e-003, + 2.1121820e-002, + -8.9850510e-002, + 2.0682240e-004, + -5.8686388e-002, + 7.1519107e-002, + 2.7049268e-002, + 4.3271736e-003, + -1.8990188e-002, + 4.1744154e-003, + -6.7617528e-002, + -1.5982309e-002, + -8.6739389e-003, + 6.8767245e-003, + -7.0052976e-003, + 8.3718019e-002, + 5.8127315e-002, + -9.4223672e-002, + -1.3478363e-002, + -3.2457089e-002, + -1.7549472e-001, + 2.8493349e-002, + 1.0412304e-001, + -1.1173210e-003, + 7.1447946e-003, + 2.7052018e-002, + 2.1816972e-003, + -8.8630176e-002, + -1.0701357e-001, + -4.1207617e-002, + 3.7077898e-003, + 8.7053488e-002, + 1.4283129e-002, + 6.4010086e-002, + -3.7679928e-002, + 8.3111383e-002, + 5.6677718e-002, + 1.4063916e-003, + -1.0364232e-001, + 3.6312049e-002, + -2.6135054e-002, + 3.1703422e-002, + -3.5189144e-002, + 1.6030282e-002, + -7.0953448e-002, + -1.6409520e-002, + 1.5861113e-002, + -4.0344599e-002, + 9.3345150e-002, + -3.2385751e-002, + 2.9194015e-002, + -5.3074056e-002, + -5.8395538e-002, + 1.4711047e-002, + 1.6754312e-002, + -4.1092096e-002, + -5.7509643e-002, + 5.8321957e-003, + 3.4401437e-002, + 3.5235160e-002, + 6.4540634e-003, + 6.8538944e-003, + -1.0143565e-001, + -2.5820489e-002, + -2.0821741e-002, + 4.4652423e-002, + -3.4072854e-002, + -2.6609349e-002, + 3.3889860e-002, + -5.3220787e-002, + -2.4894595e-002, + -9.6139329e-002, + -3.3024922e-002, + 1.7823306e-002, + -4.2192663e-003, + -5.3704045e-002, + 1.1044474e-002, + 1.4159169e-002, + 5.6261779e-003, + 1.4544719e-001, + -4.2079631e-003, + -9.5725344e-002, + -3.6408815e-003, + 6.0200088e-002, + 2.9998960e-002, + -7.3398314e-002, + -4.8228886e-002, + 3.3208412e-002, + -5.6677275e-003, + -6.6855312e-003, + -3.0785426e-002, + 4.2126629e-003, + 7.0115500e-002, + -3.9919529e-002, + 4.0614066e-002, + -3.0371460e-002, + 7.2891063e-002, + 2.3537099e-002, + 2.9755936e-002, + -3.7706444e-002, + -8.3470665e-003, + 7.6886063e-003, + -8.4313321e-002, + -2.9399720e-002, + -1.4589921e-002, + 1.7944446e-002, + -1.1460170e-001, + -6.2017760e-002, + 3.4407222e-002, + -2.7741014e-002, + -4.6295413e-002, + -2.7812656e-002, + -3.0886235e-002, + 1.1995511e-002, + -3.2969544e-002, + -6.9191631e-003, + -2.9791556e-002, + 2.0392531e-002, + -4.7567313e-003, + -9.8443940e-002, + -1.2686039e-002, + -2.1886631e-002, + -1.5455907e-002, + -1.1782002e-001, + 6.1301396e-002, + 2.1872915e-002, + -1.0561240e-002, + -2.3193915e-002, + 6.9727656e-002, + 1.4693869e-003, + -1.3543614e-001, + -4.0815903e-004, + 5.6251246e-002, + -9.1505709e-002, + 5.7185400e-003, + 7.1033142e-002, + -7.9002590e-002, + -4.1318689e-002, + 4.9841764e-002, + 1.7309114e-002, + 5.7136005e-002, + -2.1199613e-002, + -6.1231140e-002, + 7.2177738e-002, + 2.5816325e-002, + -3.9691591e-002, + -8.4077105e-002, + 1.8921121e-002, + 4.0273842e-002, + -5.0316912e-002, + -1.2301284e-002, + 1.4068218e-003, + 3.9074162e-002, + 1.1140969e-002, + -9.0100129e-002, + 1.6566978e-002, + 2.2387085e-002, + -5.5267138e-003, + -1.4053472e-002, + 8.5720676e-002, + 6.6003080e-003, + -3.4558594e-002, + -2.1528224e-002, + 3.4199928e-002, + 8.3291659e-003, + -3.4104982e-002, + 7.5554591e-003, + 1.0701557e-001, + 1.3371029e-002, + -5.4777395e-002, + -5.4878162e-002, + -4.1852588e-002, + -4.0276462e-003, + 1.0933072e-002, + 3.1101256e-002, + -4.6169830e-002, + -7.8623398e-002, + -4.0709650e-002, + -2.2176445e-002, + -6.1230977e-002, + 1.6368772e-002, + -1.0741991e-001, + -3.4277843e-002, + 6.1009971e-002, + -8.3667710e-002, + 1.1309839e-002, + 5.4127285e-004, + 8.4633157e-002, + -6.3130402e-002, + -1.1137924e-002, + -5.0412645e-002, + -5.4166796e-002, + -4.6504636e-002, + 7.8517633e-002, + 3.1626107e-002, + -1.8210994e-002, + -3.5098136e-003, + -1.2130004e-002, + -1.3464374e-002, + 5.0731507e-002, + -4.3012235e-003, + 8.2720477e-002, + -1.3193101e-002, + -1.3778387e-002, + 5.5452531e-003, + -9.3586936e-003, + -8.6317405e-003, + -3.6862811e-002, + -3.2830740e-002, + 8.4783068e-003, + -1.5330067e-002, + 1.1130119e-001, + 7.3688984e-003, + -6.4062197e-003, + 3.9423451e-002, + 8.1626914e-002, + -2.2657562e-002, + 7.7429063e-002, + -1.7196394e-003, + -5.1547799e-002, + 8.5550269e-002, + 1.0233102e-003, + -2.7193777e-002, + 5.8490358e-002, + 6.2673818e-002, + -3.9346043e-002, + -3.9066234e-002, + -1.2783050e-002, + -6.3166376e-002, + 2.7608238e-003, + -4.7437497e-003, + 4.1786886e-003, + -3.2351866e-003, + -3.3156438e-002, + -5.4098732e-002, + -5.6553182e-002, + 5.8110628e-002, + 1.1522620e-002, + -5.4533062e-003, + -1.6040357e-002, + -5.2050007e-002, + 1.1068723e-002, + 7.0599072e-002, + -8.2637140e-002, + -3.3101999e-002, + -1.7103108e-002, + -5.2723510e-002, + 1.1424693e-004, + -2.0451276e-002, + -3.8451163e-002, + -3.9178471e-002, + 1.0882970e-001, + -5.9520509e-002, + -1.6406338e-002, + -3.7464624e-002, + -1.5850757e-002, + 2.8142632e-003, + 8.5106236e-003, + -3.4606452e-002, + 2.1538352e-002, + -5.1542008e-002, + -6.0556592e-002, + -3.0525775e-003, + 1.0188123e-001, + -1.6159393e-002, + -4.6398817e-003, + -3.4883594e-002, + 5.7383438e-003, + 7.6872944e-002, + 1.6904979e-002, + -3.9974367e-004, + -6.4651835e-002, + 2.0519546e-002, + 1.4600580e-002, + 9.3830207e-002, + 1.1815421e-001, + 8.2952538e-002, + 1.3580903e-004, + -4.5583612e-002, + -8.4369787e-002, + 1.0032836e-002, + 7.8411529e-002, + 4.3200604e-002, + -1.5040485e-001, + -1.2045753e-001, + -3.0628967e-002, + 4.6612260e-003, + 6.4710750e-002, + -2.6463384e-002, + 8.0467496e-002, + 1.5772806e-002, + -9.0031337e-002, + 3.8140960e-002, + 2.4067996e-002, + -1.4456479e-002, + 2.5044977e-002, + -5.5023682e-002, + -3.1476503e-002, + 4.6154417e-002, + 4.1969567e-002, + -2.1537004e-002, + -1.3892791e-002, + -7.9877470e-002, + -6.6130095e-002, + -3.3971108e-002, + 4.9723852e-004, + -2.3332777e-002, + 4.4957143e-002, + 4.5955566e-002, + 7.3085106e-002, + 1.4327863e-002, + 4.4882884e-002, + -4.5453744e-002, + 3.2494203e-002, + -3.5223572e-004, + -3.4399985e-002, + -5.9070327e-002, + -2.4763167e-002, + 5.4170280e-002, + -9.3797557e-002, + -2.4345173e-002, + 7.5789539e-003, + 6.5847677e-003, + -1.1035459e-001, + 6.4245815e-002, + -6.3677641e-002, + -2.7625955e-002, + -4.9760945e-002, + 1.9438298e-002, + -2.0183031e-003, + 3.9238472e-002, + 7.3801148e-002, + -7.4626808e-003, + -3.5100675e-002, + 1.1826910e-002, + -5.0622844e-002, + 4.3419831e-002, + -2.2438311e-002, + 4.0482870e-002, + -2.5746508e-002, + -4.5886738e-003, + -4.2692344e-002, + 6.0214404e-003, + -4.9494823e-002, + -6.9637679e-002, + -6.0074768e-002, + -1.3792535e-002, + 5.8374139e-002, + 4.0942951e-006, + -4.1381257e-002, + 5.5951370e-002, + -2.9628877e-002, + 1.2189054e-002, + 9.2356783e-003, + 1.9097401e-002, + 5.8341964e-002, + -5.8640330e-002, + -4.0346416e-002, + -2.0148478e-002, + -7.3979491e-002, + -7.6507173e-003, + -2.6376789e-002, + 9.3631448e-003, + 5.7075337e-004, + -1.7237147e-002, + -1.4088176e-002, + -6.5722025e-002, + 1.7734913e-001, + 3.9188355e-002, + -5.3138441e-003, + 6.6012838e-004, + -3.7635320e-002, + 8.6939560e-002, + 2.5457618e-002, + -5.3643902e-003, + -3.5072285e-002, + 1.7654459e-002, + -1.7002417e-002, + -1.1934297e-002, + 1.0909989e-001, + -4.5341914e-002, + 2.9654212e-002, + -7.3979691e-002, + 8.1855730e-002, + -4.1111527e-002, + 2.8178913e-002, + 3.0990023e-002, + -3.8439631e-002, + 4.6092851e-002, + 2.0499136e-002, + -4.0078674e-002, + -7.5298075e-002, + 8.6249420e-002, + 2.0413103e-002, + 1.4283415e-002, + 3.3364666e-003, + 4.5625551e-002, + 2.8593452e-002, + 1.0294208e-001, + 4.6237012e-002, + 2.3737104e-002, + 1.4850043e-003, + 4.5627026e-002, + -3.1300170e-002, + 2.7232389e-002, + -2.5581725e-002, + -4.2382451e-002, + -4.1639602e-002, + -1.2685580e-002, + -6.8348575e-002, + -3.5070023e-002, + -1.9126421e-002, + -5.1202221e-002, + -2.1697346e-002, + 6.3981805e-003, + 6.1889782e-002, + -9.5515388e-002, + -3.5099019e-002, + -7.5991979e-003, + 2.6608290e-002, + -6.5628332e-003, + 4.0519304e-002, + 1.8759115e-004, + -8.2745501e-002, + 4.8080126e-002, + -9.4334121e-002, + -1.7519517e-002, + 8.4578794e-003, + -1.0547960e-002, + -2.9348950e-003, + 2.2443020e-002, + -8.3815521e-003, + 3.4363193e-002, + 3.5010892e-002, + -2.7129950e-002, + -1.8407294e-003, + -2.7794904e-002, + 7.5761568e-002, + -5.1005395e-002, + 2.2206192e-002, + 5.5815959e-003, + 1.3179272e-002, + 1.3743604e-002, + 8.4180570e-002, + -4.5318175e-002, + -4.0369759e-002, + -5.5643911e-002, + 1.1111604e-002, + 4.9980927e-002, + -5.3328516e-002, + -2.5289654e-002, + -5.3455028e-002, + -4.5115993e-003, + 1.2552924e-002, + 2.4187614e-002, + -6.5216647e-002, + -6.7184717e-002, + -3.4635282e-002, + 2.6037151e-002, + -1.2958051e-002, + -6.4529955e-002, + -4.7775406e-002, + 7.7791690e-002, + -4.1840856e-002, + 3.5508733e-002, + 3.6208672e-002, + 2.8883867e-002, + -2.2614722e-002, + -6.2467477e-002, + 2.1201398e-002, + -6.4938220e-002, + -2.5718030e-002, + 1.0132503e-001, + -1.0989944e-001, + 1.7386332e-002, + -1.9848054e-002, + 4.6500211e-002, + 8.7080916e-002, + 6.1051787e-002, + -6.9658176e-002, + 1.8448919e-003, + -6.3897477e-002, + 9.5246967e-003, + -1.7099063e-002, + 8.6762837e-002, + -5.1071138e-002, + -4.1995939e-002, + -1.5112140e-002, + 9.4802477e-002, + -3.6319825e-003, + 5.6475075e-002, + -5.2649820e-003, + 5.5494589e-002, + -3.6195527e-002, + 3.0102603e-002, + 9.6119308e-002, + 2.9804096e-002, + -8.3871467e-002, + -4.6819532e-002, + -6.6699175e-002, + -7.8740356e-002, + 2.3100681e-002, + 4.0518590e-002, + -5.5249251e-002, + 3.4210609e-002, + 6.3808433e-003, + 2.9561241e-002, + -7.9993851e-002, + -8.6030708e-003, + 4.9599184e-002, + -5.3356684e-002, + -4.3441101e-002, + 4.6557960e-003, + -5.8349112e-002, + 7.0442125e-002, + 3.3583231e-002, + 3.5326691e-002, + -1.4284013e-003, + 3.7155912e-003, + -6.1957730e-002, + -2.5175104e-002, + 1.0316170e-004, + 1.3785501e-002, + -3.4528343e-002, + 9.4718664e-002, + -8.5929124e-003, + 6.2353769e-003, + -1.9235982e-002, + -5.0684859e-002, + -9.0890509e-002, + 2.9614723e-002, + -5.8904724e-002, + -5.9605704e-002, + 1.7332188e-002, + -6.2983369e-004, + 7.6762655e-002, + -1.5739418e-001, + 4.7428004e-002, + -7.4437002e-003, + 3.2753497e-002, + -6.4494291e-003, + -1.0132357e-001, + 3.1793509e-002, + -1.9653108e-002, + -1.3986054e-002, + -1.0375110e-001, + 5.9341902e-002, + 7.4338421e-002, + -7.4336814e-002, + -8.8261702e-004, + 8.4239417e-002, + 3.6771318e-002, + 4.6614615e-003, + -1.0885608e-001, + 4.0218429e-002, + -7.3328551e-002, + 3.4660924e-002, + -2.2304889e-002, + 9.1183611e-003, + -3.1063866e-002, + 3.7029187e-002, + -8.5599164e-003, + -3.1378391e-003, + -3.4177850e-002, + -3.6311985e-002, + 5.4941612e-002, + -2.5856244e-002, + 9.8859541e-002, + -4.1708361e-002, + 4.4676996e-002, + 1.0012678e-001, + 1.2298856e-002, + 3.9574107e-002, + -5.4805478e-003, + -2.5335550e-002, + 2.0495470e-002, + -2.8777276e-003, + -1.2280951e-002, + -3.6926171e-002, + -6.4637997e-002, + 3.1275904e-002, + -4.0724158e-002, + 8.2545982e-002, + 1.7297459e-002, + 1.7103606e-003, + -3.6063372e-002, + -1.9411586e-002, + 2.5489285e-002, + 5.3618799e-002, + -1.5847040e-003, + -8.2607767e-002, + 6.4750926e-002, + 3.4155392e-002, + 1.2202950e-002, + -6.3849575e-002, + -4.2629288e-002, + -9.3420039e-002, + 1.8591964e-002, + -6.2494687e-002, + 2.7073439e-002, + -1.6706104e-002, + 8.5702929e-004, + 5.5338380e-002, + -1.1863343e-002, + 2.4120033e-002, + -1.9673309e-002, + -9.0836747e-003, + -8.4090025e-002, + -1.6605994e-002, + 1.2509049e-002, + 2.9654581e-003, + 3.5414725e-002, + -9.1520329e-002, + 5.3251481e-004, + -3.9064127e-002, + 4.3848196e-002, + -6.5906592e-002, + -6.2694114e-002, + -7.5430627e-002, + -6.9288028e-002, + -7.3831218e-002, + -2.2849271e-003, + 4.1968983e-002, + 9.1516100e-003, + 6.3003994e-002, + 4.0825527e-003, + -1.1602298e-002, + 3.4062508e-002, + -3.6760665e-002, + -6.6458351e-003, + 4.5328593e-002, + 1.5333803e-002, + 3.1081863e-002, + 1.0997856e-003, + 4.0172982e-002, + -5.1202051e-002, + 3.0204527e-002, + -9.1683008e-002, + 6.6885251e-002, + -1.4713293e-002, + -1.8783233e-002, + -2.6727404e-002, + -4.0587117e-002, + 1.7352452e-002, + 2.4068866e-002, + 9.3813608e-002, + 1.4593201e-001, + -2.6243684e-002, + 4.2410590e-003, + 5.7049362e-002, + -1.0495092e-002, + 5.5352776e-002, + -1.4966413e-002, + 5.8887924e-002, + -2.9432846e-002, + 1.5016450e-002, + 1.8771912e-002, + 2.9731363e-002, + -8.9727906e-002, + -2.8879171e-002, + -2.4530626e-002, + -2.1755227e-002, + 2.6372269e-002, + 1.6464203e-002, + -2.9595373e-003, + -2.8033224e-002, + -3.8960164e-002, + -1.4500836e-002, + 1.2441672e-004, + 6.9888338e-002, + -1.3326151e-002, + -4.4177213e-002, + 1.0679639e-001, + -7.7540624e-002, + 7.3527032e-002, + 7.1684818e-002, + 2.4447003e-002, + 1.3247555e-002, + 2.5484911e-002, + -2.0333037e-002, + 1.0820256e-001, + -1.5291962e-001, + 4.0764107e-002, + -5.3576752e-002, + -3.3726558e-002, + 5.9985203e-002, + 1.4311757e-002, + 1.0872979e-002, + 4.8154459e-002, + -9.8724947e-002, + 3.5433564e-002, + -3.0296223e-002, + -4.9776503e-002, + 6.4312955e-002, + -3.8636806e-002, + 4.1001924e-002, + 2.8324136e-002, + -2.4954944e-002, + 3.0731417e-002, + -4.0748527e-002, + 1.0071007e-001, + -4.2444577e-002, + 7.4060614e-002, + 7.0443088e-002, + -8.5281317e-002, + 2.2408837e-002, + -3.0453603e-002, + 5.3244534e-002, + -2.7097865e-002, + 9.3509025e-002, + -4.0481022e-002, + 3.0984921e-002, + 6.2120102e-002, + 2.5263636e-002, + 4.7524005e-002, + -8.3461434e-002, + -4.0450596e-002, + 2.4301374e-002, + 2.4082281e-002, + 2.7165952e-002, + 2.5739840e-002, + -4.4498403e-002, + -9.3779267e-002, + 1.3230632e-002, + 5.6356340e-002, + -3.1721297e-002, + -1.1371059e-001, + 5.1330793e-002, + 3.9800143e-002, + 4.4602902e-002, + 4.0186966e-002, + -3.3956201e-002, + -3.4378181e-002, + 3.0222123e-002, + 1.3392410e-002, + -1.1877032e-001, + -6.1513207e-002, + 5.1308971e-002, + -3.4406254e-004, + -5.6836546e-002, + 3.1147677e-002, + 1.2984031e-001, + 6.9255265e-002, + -7.3899471e-002, + 4.4113150e-002, + 4.1613437e-002, + -8.3330499e-002, + -6.7769626e-002, + 9.9577638e-003, + 8.5011488e-002, + 3.1777824e-002, + -3.0275122e-002, + -1.9721785e-003, + -2.8670666e-002, + -5.1951849e-002, + 2.6123845e-002, + -4.6954628e-002, + 3.9325561e-002, + -1.4539624e-001, + -4.4989415e-002, + 1.2490030e-002, + 9.8158554e-002, + -8.8549642e-002, + 7.0425741e-002, + 1.6289354e-002, + 7.6642414e-002, + 8.2615082e-002, + 1.5188920e-002, + 1.0717190e-001, + 7.8459410e-003, + -9.8939081e-002, + 5.4496988e-002, + -1.9598305e-002, + -4.8340131e-002, + 9.1012052e-002, + 4.5089162e-002, + 2.7001089e-002, + 3.9597820e-002, + -2.9912957e-002, + -4.5233127e-002, + -2.6888627e-002, + 8.2716012e-002, + 4.1938511e-002, + -1.2290728e-002, + -9.1141489e-002, + -9.3716385e-002, + 5.0846593e-002, + -6.9747424e-002, + 1.5936647e-002, + 9.0841003e-003, + -7.9217963e-002, + 4.2523607e-002, + -3.4283790e-002, + 6.2931211e-002, + 1.9054212e-002, + 1.0431108e-002, + -1.7512053e-002, + 1.5995877e-002, + -6.9853083e-002, + -3.6133865e-002, + 5.1883029e-002, + -5.4941971e-002, + 2.5099530e-002, + 2.1949930e-002, + -7.2924143e-002, + -1.2241689e-002, + -2.5239538e-003, + 1.0240874e-002, + -3.5188489e-002, + -1.4637794e-002, + 4.2573102e-002, + -4.6954972e-002, + 4.9757134e-002, + 8.9000907e-002, + -5.7343223e-003, + -9.4659733e-002, + 2.2731848e-002, + -6.3526985e-002, + -6.2729748e-002, + -8.5124042e-002, + -2.2742192e-002, + 4.9060274e-003, + 5.9105851e-002, + 6.6593845e-002, + -2.0401971e-002, + -3.4052538e-002, + 1.0187912e-001, + -3.9129772e-002, + 1.6727491e-002, + 7.9581367e-002, + 2.3490622e-002, + -8.5225499e-002, + 4.5609113e-002, + 2.5532693e-002, + -1.3949777e-002, + 1.1939908e-001, + 3.1136484e-002, + 2.1065018e-002, + -7.3998053e-002, + -3.3433899e-002, + 6.4825970e-002, + -6.6483460e-003, + 2.1878777e-002, + -5.5590218e-002, + 6.2132974e-002, + 6.0099401e-002, + 2.6750906e-002, + -3.2033687e-002, + 4.8448643e-002, + -3.8771221e-003, + -4.8090282e-002, + -2.9473176e-002, + -1.6510646e-002, + 5.6059374e-003, + -2.8498771e-002, + 1.4581678e-001, + 7.2382639e-003, + 6.9060065e-002, + 3.1254099e-002, + 1.1295554e-001, + -2.0791262e-002, + 2.6272472e-002, + 2.3832128e-004, + 1.7675185e-004, + 2.2985763e-002, + 5.8978432e-003, + 4.4429730e-003, + 7.5305836e-002, + 2.7519294e-002, + 2.6304737e-003, + -7.5022497e-003, + 9.7612623e-002, + -1.1392227e-003, + 6.3717011e-002, + 4.2435569e-002, + -6.8014182e-002, + 7.4854037e-002, + 3.2524349e-002, + 7.0521866e-002, + 2.0297711e-002, + -2.7255480e-002, + -1.3079920e-002, + -1.1988356e-001, + 4.2564644e-002, + 8.9756674e-002, + 1.7220549e-002, + -4.4937423e-002, + -2.9070759e-002, + -4.4538021e-002, + -7.8632839e-002, + -2.8995185e-002, + -1.4328207e-002, + 2.6443524e-002, + 8.9669124e-002, + 1.7624887e-003, + 3.2927633e-002, + -3.1535117e-002, + -6.6599096e-003, + 1.0186317e-001, + 8.9875545e-003, + 2.8378610e-002, + -5.5136504e-002, + 3.3829370e-002, + 7.1374246e-003, + -1.4538378e-002, + 3.9237476e-002, + 6.8685661e-002, + -3.3057531e-003, + 1.1538617e-002, + 8.8143388e-003, + -1.9900457e-002, + 2.0600418e-002, + 3.0249751e-002, + -7.3517395e-003, + 6.4648004e-002, + -8.6600526e-004, + 8.3511299e-003, + -5.4627039e-002, + -6.4363505e-003, + 1.6893141e-002, + 5.5401782e-003, + -2.4244983e-003, + -2.0950127e-002, + -2.2956516e-002, + 7.8535473e-003, + 2.4067483e-002, + 6.1367370e-002, + -3.3267227e-002, + -1.7259358e-002, + -7.3612541e-003, + -1.5577290e-002, + 8.5933756e-002, + 5.0314067e-003, + -5.7691721e-002, + -3.1185546e-002, + -1.0012818e-002, + -9.3068008e-003, + -1.2733027e-001, + -2.4660461e-002, + -6.9689614e-002, + 6.7705187e-002, + -9.0527945e-002, + -8.9240761e-003, + -3.6546741e-002, + -7.8518923e-003, + 6.0277518e-002, + 8.8143610e-002, + -3.6670503e-002, + 5.9594768e-002, + -6.2854695e-002, + 8.4561367e-003, + 4.2531503e-002, + 1.2490411e-001, + -1.2983679e-002, + 4.8837441e-002, + 2.8397759e-002, + 4.9265357e-004, + -5.0014029e-002, + -6.4438003e-002, + 6.3709335e-002, + -8.3485243e-002, + -1.3662989e-002, + -1.1010182e-002, + -4.1630589e-004, + 3.7231066e-002, + 5.8354336e-002, + 1.4802151e-002, + -9.2736005e-003, + 7.0150240e-002, + -7.5624119e-002, + -1.8709434e-002, + 8.1817931e-002, + 1.0532906e-001, + -6.6715765e-002, + 1.1083842e-002, + -7.4493893e-002, + -9.9142748e-003, + 6.2718554e-002, + 2.7079763e-002, + -2.5876824e-002, + -4.8123789e-002, + 6.1857353e-002, + -4.2675136e-002, + -6.2163117e-002, + -7.4268325e-002, + -2.9318352e-002, + -3.3154279e-002, + 4.8684897e-002, + -2.4063594e-002, + -8.6147192e-002, + -7.1972623e-003, + -4.4253121e-002, + -2.1162236e-003, + -3.5637316e-002, + -5.0298912e-003, + 1.9549988e-002, + -3.1928938e-002, + -4.5581285e-002, + 4.7829407e-002, + 8.7149645e-002, + 4.0640515e-002, + 1.4297447e-002, + 9.8222629e-003, + 3.2853388e-002, + 6.8740447e-002, + -1.2177132e-001, + 9.4625764e-002, + -1.5776485e-002, + -3.2495760e-002, + 3.0796063e-002, + -1.5368625e-002, + -7.9526144e-002, + -6.2453602e-002, + 5.9616092e-002, + -6.4260784e-002, + 1.5966646e-002, + 3.1495482e-002, + 6.5589632e-002, + -3.4614182e-002, + -6.9190746e-002, + -2.0874294e-002, + 1.3630214e-002, + 5.3339825e-002, + 1.6147000e-002, + 4.2668360e-002, + -2.5662017e-002, + 4.5348429e-003, + 6.1345954e-002, + 4.1541021e-002, + -4.9887559e-002, + -5.8465581e-002, + -2.1207204e-002, + 7.9091417e-003, + -1.2334773e-002, + -1.0617181e-001, + 8.9782313e-002, + -6.8274917e-002, + 2.1132464e-002, + 5.7348207e-003, + -9.2561293e-003, + -3.7038110e-002, + -2.8239427e-002, + 1.8178841e-002, + -3.9897232e-002, + 1.0250394e-002, + 6.3382126e-002, + 3.1483520e-002, + -1.4611403e-002, + -4.1066531e-003, + 5.7642552e-002, + 1.2244865e-002, + 3.7434406e-002, + 2.2822222e-002, + 9.2902509e-002, + 1.1325867e-002, + -6.2025695e-002, + 1.5489679e-002, + -1.6179136e-002, + -1.7726855e-003, + 8.7415263e-002, + 2.9780528e-002, + -6.5055050e-002, + -1.7262184e-002, + -1.2062737e-002, + 4.1904361e-002, + -3.4331618e-002, + 1.2164792e-001, + 4.9603771e-002, + -1.3061748e-002, + 1.1007232e-002, + -1.4216546e-002, + -3.5763228e-002, + 1.2025510e-002, + 8.2989866e-002, + 2.0160053e-002, + -1.6822685e-002, + 7.3528826e-003, + 2.0923780e-002, + 5.2711615e-003, + -2.5691601e-002, + 4.5395884e-002, + -1.5802909e-003, + 6.8782769e-002, + 1.1122473e-001, + 1.0025602e-001, + 1.3910254e-001, + -8.5937461e-002, + 3.2274784e-002, + 4.8447219e-002, + -7.6279744e-002, + -9.4932243e-002, + -4.6596008e-002, + 6.9567452e-002, + -2.0821944e-002, + 2.8782945e-002, + -1.8673196e-002, + -1.0249668e-003, + 3.0785039e-003, + 7.5883489e-002, + -6.3193813e-003, + 7.7764074e-002, + -4.3608077e-002, + -1.3123466e-002, + 3.6824621e-003, + -5.9201109e-002, + -2.3113816e-002, + -8.8488271e-002, + -1.1032349e-002, + -2.3364616e-003, + -6.5601368e-002, + 1.4329878e-001, + 9.5131857e-002, + 4.2865722e-002, + -9.6979502e-002, + -3.5638863e-002, + 9.0205848e-002, + 1.9877782e-002, + -1.2497646e-001, + 2.5802125e-002, + 4.6840610e-002, + -4.7117859e-002, + -1.0958747e-001, + -4.6687284e-002, + 3.3044810e-003, + -4.3352639e-002, + 5.5404689e-002, + -1.4901969e-001, + -6.5836290e-003, + -8.3908961e-002, + -8.4786953e-003, + 2.6778741e-002, + -7.1364019e-002, + 2.9762397e-002, + 3.8378977e-002, + -1.3678167e-002, + 1.0245114e-002, + -6.8802397e-002, + -7.9396342e-002, + 8.9092342e-002, + -2.5071896e-002, + 1.6416317e-001, + -3.3416141e-002, + -8.8098549e-002, + -2.8516999e-002, + -2.8171336e-002, + 1.4735227e-002, + 2.1490528e-002, + 1.0996266e-002, + -7.9010073e-002, + 1.3973632e-002, + 8.5196514e-002, + -3.4922417e-002, + 3.4433947e-002, + 4.5850060e-002, + -6.6284133e-002, + -1.0572099e-001, + -6.6431349e-002, + 6.0325770e-002, + -9.2479536e-003, + -2.2892434e-002, + -3.9861268e-002, + 7.7138209e-002, + 1.1492915e-002, + 3.1465738e-002, + -1.2138307e-002, + 4.7630033e-002, + -9.7311603e-003, + 1.3770049e-002, + -7.3660639e-003, + 7.4335649e-002, + -3.6628135e-003, + 1.2752549e-002, + 1.3838186e-002, + 4.2180077e-004, + -5.4375913e-002, + 2.1917738e-002, + -1.2614454e-002, + -2.3342227e-002, + -6.4971690e-002, + 1.6110329e-002, + 1.4737048e-002, + 3.0388287e-002, + -1.6824888e-002, + 1.7295248e-002, + 1.0812445e-002, + -5.5425021e-002, + -4.9277740e-002, + 5.0707632e-002, + 4.1922806e-002, + 1.8455962e-002, + 5.0365924e-002, + 4.4298398e-002, + 7.6431843e-003, + 5.9989537e-002, + -7.6908515e-002, + 2.8530229e-002, + 9.5653590e-002, + -7.2017798e-002, + -8.0655593e-003, + 1.0083818e-001, + 4.9232556e-002, + -6.6242009e-002, + 2.9556295e-003, + -3.5960545e-002, + 1.1419955e-002, + 6.6825880e-003, + 2.9477422e-002, + -2.9472636e-002, + 5.5236681e-002, + 2.8874435e-002, + -2.2350145e-002, + -1.4664332e-002, + -6.8185763e-002, + -2.0916584e-003, + -6.2584599e-003, + 5.9273963e-003, + 9.7345621e-002, + 1.7069987e-002, + -3.5800212e-002, + 3.8397984e-002, + -4.6760839e-002, + -5.0292748e-002, + -2.1914980e-002, + -1.8316586e-003, + -5.2956111e-002, + -4.4811672e-003, + 6.3511854e-002, + -5.7468947e-002, + 3.3773578e-003, + -6.2827625e-002, + -1.0672637e-001, + -2.3481169e-002, + -4.9309562e-002, + -9.6720496e-003, + 5.8540389e-002, + -1.4927692e-002, + 4.5935378e-002, + -1.5630681e-003, + -1.8325545e-002, + 3.2884463e-002, + 2.3472286e-002, + 1.9480110e-002, + -1.5164953e-002, + 5.0952861e-004, + 3.6924652e-002, + 3.9980199e-003, + 2.7122068e-002, + 4.0586323e-002, + -6.8458269e-004, + 2.4214833e-002, + -2.6547884e-002, + -2.4783823e-002, + 8.8816623e-002, + 5.5882019e-002, + 5.3618064e-003, + -1.1671543e-001, + -8.2213149e-002, + -9.6951820e-002, + 7.3380548e-002, + -1.2640056e-003, + 4.1876563e-002, + 2.5405425e-002, + 2.4599929e-002, + 1.4178532e-002, + 5.5594418e-003, + 4.2950164e-002, + 1.8014601e-003, + -1.2215360e-001, + 1.0493101e-001, + 3.1735201e-002, + 5.5741286e-003, + -3.2479076e-002, + 2.6681545e-002, + 2.8019414e-002, + -8.0179790e-003, + 3.1489206e-002, + 4.3033256e-003, + -3.7630185e-002, + 5.3039128e-002, + 5.1506634e-002, + -1.7820552e-002, + -2.4621551e-002, + -5.5322066e-002, + 2.5011123e-002, + -4.7866728e-002, + -1.0796552e-002, + -3.3392282e-002, + -4.7783524e-002, + -1.8094968e-002, + -7.2520784e-002, + -6.5389567e-002, + 3.9464487e-002, + -9.8809443e-003, + 3.1120895e-002, + -5.4329781e-002, + 1.6954674e-002, + -4.8954224e-002, + 7.3972200e-002, + 4.7640882e-002, + 3.0356780e-002, + 9.5741578e-003, + -4.1590063e-002, + 1.1287435e-001, + -8.6416889e-003, + -2.2674367e-002, + 2.1388361e-003, + 5.5542441e-002, + 1.0045614e-002, + -8.7522721e-002, + 8.7719983e-003, + 6.7355731e-002, + -1.6159743e-002, + 8.7223484e-003, + 6.0092014e-002, + -9.4184958e-002, + -3.6268920e-002, + -2.1332232e-002, + -3.1682036e-002, + 2.8664908e-002, + 2.6541157e-002, + -1.0689359e-001, + -7.0862918e-002, + -1.1433268e-001, + 3.4863935e-002, + 1.0709581e-002, + -5.5513033e-002, + -1.5617145e-002, + 1.9399041e-003, + 6.6680970e-002, + -3.5719944e-002, + -5.5335504e-002, + -9.3481167e-002, + 2.3589372e-002, + 1.2307760e-002, + -4.1853305e-002, + 3.2086368e-002, + 1.3207910e-002, + -1.2902915e-002, + 4.0576229e-002, + -3.1174299e-002, + -4.7359539e-002, + 3.2639664e-002, + 6.8807350e-002, + 3.0052612e-002, + -1.6360841e-002, + 7.3692525e-002, + 2.3214010e-002, + -1.9279486e-003, + -2.9304762e-002, + 1.4092775e-002, + -3.8475139e-002, + 4.0205235e-002, + 3.5637448e-002, + 3.1815236e-002, + 5.4193437e-002, + 2.7101101e-002, + -7.8492340e-002, + -1.3053183e-002, + 9.8943970e-002, + 3.2605663e-002, + -5.3326325e-002, + 4.7045271e-002, + 1.9171127e-002, + -7.0639869e-002, + -2.6942346e-002, + 2.1897131e-002, + 4.4342108e-002, + 2.5419609e-002, + 6.5525042e-002, + -6.2924979e-002, + 4.2919074e-002, + 5.7909339e-002, + -2.0016289e-002, + -7.1844831e-004, + 3.3287795e-003, + 5.2391582e-002, + 5.1351648e-002, + 6.9345017e-002, + 1.6715079e-002, + 1.0245380e-001, + 6.5560454e-003, + -4.2978289e-002, + 5.1857486e-002, + 1.6375558e-002, + -1.1231560e-001, + 1.8452057e-002, + 2.7196151e-002, + -4.7948818e-002, + 3.8838999e-002, + -8.1296721e-002, + -4.4213439e-002, + 3.3789367e-002, + -8.9903386e-002, + -4.8309819e-002, + 3.0350368e-002, + 9.3462798e-003, + -4.3576313e-002, + 5.0364033e-002, + -3.3705706e-002, + 6.9992170e-002, + 9.4421577e-002, + -3.7859282e-002, + -2.4699603e-002, + 5.0385013e-002, + -5.4216273e-002, + 6.9692784e-002, + 1.0150382e-001, + 1.7548633e-002, + 9.8962282e-003, + -5.6862743e-002, + 4.1445815e-002, + 1.9635439e-002, + -3.1828877e-002, + -7.5389343e-003, + -2.2662898e-002, + -9.3225720e-003, + 3.3794402e-002, + -1.5022139e-002, + -8.3952470e-002, + -4.4638734e-003, + 5.0977217e-002, + -5.6868826e-002, + 8.2257315e-002, + -3.3527792e-002, + -3.8753182e-002, + -8.9806282e-002, + 6.8640832e-004, + 7.2265978e-002, + -1.2264922e-001, + 1.0964559e-002, + -6.3412284e-002, + 1.2106129e-001, + -8.5320894e-002, + -3.7961427e-002, + -4.1350954e-002, + -6.7090729e-002, + 4.9718886e-002, + -3.3874055e-002, + -7.1699033e-002, + 2.5203129e-002, + 2.0350140e-002, + 6.4638571e-002, + -7.2804864e-002, + 2.3308871e-002, + 1.5264191e-003, + -1.1191223e-001, + -6.0619938e-002, + -2.2397074e-003, + 6.8646240e-002, + -9.5147638e-003, + -8.9258460e-003, + -2.2587656e-002, + -8.8042374e-003, + 2.7917130e-002, + 3.0703476e-002, + 4.0753823e-002, + -1.9174676e-002, + 7.6285732e-002, + 5.5310628e-003, + 6.7972330e-002, + 1.6915582e-002, + -3.3407461e-002, + 2.3263797e-002, + 3.1563985e-002, + 6.0315051e-004, + -3.1286618e-002, + -1.1639905e-002, + -1.2659763e-002, + 1.2883340e-003, + -5.0171053e-002, + -4.9900923e-003, + -1.0228083e-001, + -4.8479815e-002, + -2.9928321e-002, + -5.5916163e-002, + 4.7735428e-002, + -1.3294429e-003, + -7.5136122e-003, + 5.4331339e-002, + -4.2475157e-002, + -3.2342585e-002, + -2.1096262e-002, + 4.8946925e-002, + -7.7232620e-002, + 4.6424245e-002, + -7.1029625e-002, + -8.3080699e-003, + -1.8848230e-002, + -3.3058342e-002, + 2.4301547e-002, + -1.9950837e-002, + -2.6746721e-002, + -3.1244062e-002, + 4.9214132e-002, + -4.3837753e-002, + -2.6533780e-002, + -3.2174063e-002, + 3.1234554e-002, + 1.8396020e-002, + 4.2139477e-003, + -6.3624347e-002, + 3.8068496e-002, + -7.5273414e-002, + -5.4282683e-002, + 1.0378638e-001, + -5.4062955e-002, + 1.0025793e-002, + -6.6450371e-003, + 8.2632045e-002, + -1.1994389e-001, + 3.1022007e-002, + -3.1118158e-002, + 5.0953443e-002, + -5.1605376e-002, + -4.8568100e-002, + -7.4390375e-003, + -4.7877758e-002, + -9.4953155e-003, + -2.6931667e-003, + 2.3165347e-002, + 5.9754385e-003, + 2.5900617e-002, + -1.5042605e-002, + -1.4480424e-002, + 4.2074657e-002, + 8.9476498e-002, + 4.5100917e-002, + -5.1593045e-002, + 6.0834274e-002, + 4.0989664e-002, + -1.7405350e-002, + 5.9998834e-002, + 1.2416742e-002, + 1.8605073e-002, + 1.0892550e-001, + -3.2491824e-002, + -3.1135526e-002, + -2.9815887e-002, + 2.0205791e-002, + 1.6566794e-002, + 7.0071566e-002, + -4.9569656e-002, + 3.9921784e-002, + -2.8730117e-002, + -1.7587977e-002, + 7.1500463e-002, + 3.6872018e-002, + -3.4586232e-002, + -1.6970720e-002, + 3.4644172e-002, + -2.0901296e-002, + 4.2141589e-002, + -7.6319420e-002, + 4.5998962e-002, + -7.3399778e-002, + -8.1916522e-002, + 3.8464961e-002, + -1.1521599e-002, + 7.2694972e-002, + -3.9337982e-002, + 5.9084598e-002, + -3.4257913e-002, + -8.6242832e-002, + -2.5477654e-002, + 1.5161827e-002, + 4.3686125e-003, + -1.1656981e-002, + -1.5563664e-002, + 6.2510087e-002, + -1.0836642e-002, + 1.2432558e-001, + -2.2959202e-002, + 1.3783634e-003, + 3.3269441e-002, + 3.8750648e-002, + -1.3656516e-002, + 5.9833997e-002, + 1.4796841e-002, + -2.2627766e-003, + 4.9145114e-002, + -1.1354640e-001, + 1.3391314e-002, + -1.3806188e-002, + 2.7218571e-002, + -3.9102606e-002, + 1.0801438e-002, + -3.4971279e-002, + -2.3190242e-002, + -1.6194699e-002, + -1.9332419e-002, + -2.7390066e-003, + 1.8022691e-002, + -1.5832667e-002, + -9.2546225e-003, + -6.4699491e-002, + 4.7590650e-002, + 5.4590011e-002, + -2.0868480e-002, + 4.8372708e-003, + 3.5635613e-002, + 4.9026328e-002, + -2.8886176e-002, + 2.4904926e-002, + 4.6825265e-002, + -4.1467334e-003, + -7.4816934e-002, + 2.4155196e-002, + -1.2145775e-002, + -4.8433817e-002, + -5.1333974e-002, + -7.6611960e-004, + -2.0288664e-003, + 4.4132138e-002, + 1.3884023e-002, + 3.3438764e-002, + -1.7045598e-002, + -1.3981286e-003, + 6.0450703e-002, + 1.6026951e-002, + -1.0038212e-002, + -5.9082814e-002, + -6.8065244e-003, + -2.0735019e-002, + 6.4134665e-002, + 8.5071176e-003, + -2.2373060e-002, + 4.3619700e-002, + 1.5963047e-002, + -3.0249871e-002, + -8.3796187e-002, + -3.4276448e-002, + 5.3600630e-002, + -4.6111635e-002, + 3.2125595e-002, + 5.8851999e-002, + -7.8040384e-002, + 5.2267851e-002, + 3.4435223e-002, + 2.1556971e-002, + -1.7163880e-002, + -5.0843277e-002, + -3.2488185e-002, + -1.7547962e-002, + 3.1629302e-003, + 1.1087340e-001, + 5.8821833e-002, + 2.7600291e-003, + -1.8466769e-002, + 3.1019364e-002, + 6.9714994e-002, + 2.6197162e-002, + -2.5002333e-002, + 2.1238793e-003, + 6.3553430e-002, + -3.4198265e-002, + 4.8709571e-002, + -7.2299086e-002, + -4.3035088e-002, + 3.5760525e-002, + 5.3143565e-002, + 2.8080467e-002, + 7.4687831e-004, + 3.3589299e-002, + -2.7857822e-002, + 9.3293970e-002, + -3.1352513e-003, + -1.1227005e-003, + -4.5092687e-002, + -2.5306886e-002, + -1.0822730e-001, + -6.5870362e-002, + 5.0646576e-003, + -5.7436235e-002, + 3.2011690e-002, + -3.5040739e-003, + -3.9957599e-002, + 1.6341870e-002, + -7.6498865e-003, + -2.5256813e-002, + 2.8585914e-002, + -6.4304885e-002, + -7.0698223e-002, + -9.2642094e-002, + -5.6328267e-002, + -8.0773935e-002, + -6.5074477e-002, + 2.0294178e-003, + -2.4072922e-002, + 4.2458044e-002, + 4.7875614e-003, + -4.2143264e-002, + -2.8324995e-002, + -2.9328658e-002, + -9.2678479e-002, + 4.5617708e-002, + 1.2685434e-002, + -5.4340728e-002, + 4.2087780e-002, + 4.0016732e-002, + -1.2299481e-001, + 1.0379559e-001, + 5.7020403e-002, + -3.9544599e-002, + -1.8766513e-002, + 3.2158071e-002, + 7.3924530e-002, + -4.6618108e-003, + -5.5299328e-002, + 4.4245720e-002, + 3.7174478e-003, + 3.4306804e-003, + 4.2213951e-002, + -9.1086002e-002, + 1.5797797e-003, + -1.0094297e-001, + -3.1042592e-002, + 1.6312788e-002, + -5.7643992e-002, + 8.5044833e-003, + -5.8166289e-002, + 1.9822525e-002, + -1.4404965e-001, + -5.5582362e-002, + -4.5001443e-003, + -8.6256453e-003, + -1.0195382e-002, + -3.5860515e-002, + -6.9432334e-002, + -3.8266022e-002, + -4.0918161e-002, + -1.1863163e-002, + 5.0949718e-002, + -8.0206291e-002, + -2.6240511e-002, + 7.6676678e-002, + -6.5416559e-002, + -1.4318918e-002, + -4.3958025e-002, + -2.1978148e-002, + -6.4422744e-002, + -2.2733013e-002, + 1.2900773e-002, + -1.7819685e-002, + -4.7785428e-003, + 3.4686226e-002, + 6.4004707e-002, + -5.3322786e-002, + -1.8493916e-002, + 4.9290003e-002, + -4.5065517e-002, + -2.9327742e-002, + 2.3212884e-002, + -4.8985889e-002, + 2.9604806e-003, + -7.0253020e-003, + -9.2397443e-002, + -7.6453564e-002, + -3.4155955e-002, + -1.0082514e-001, + -8.0072913e-002, + 5.9487693e-002, + -3.2053752e-002, + -3.4654709e-002, + -4.2857910e-002, + 4.3434899e-002, + -6.1610488e-002, + 2.3564532e-002, + 5.0395882e-002, + -1.0869004e-002, + 2.7674042e-002, + 4.1961384e-004, + 1.1474642e-001, + 1.5501309e-002, + 5.3729017e-002, + 8.2294950e-002, + 3.6090309e-002, + 3.2405617e-002, + 7.8649811e-002, + 1.3050292e-002, + -1.6718241e-002, + -4.2514925e-002, + 2.0638931e-003, + -1.0261822e-001, + 5.5517573e-002, + -2.6256624e-003, + 7.3917084e-002, + -3.2038338e-002, + 5.9286807e-003, + -4.9553265e-002, + 4.0402131e-003, + 1.9006069e-002, + 1.5037719e-002, + -3.8431930e-002, + -3.4089576e-003, + -2.8898708e-003, + -5.1916447e-002, + -9.3843168e-002, + 2.9937678e-002, + -3.9290957e-002, + 4.4290160e-002, + -4.2250820e-002, + -1.6616660e-002, + -1.0653179e-002, + -3.4916960e-002, + -3.1852948e-002, + 1.8960722e-002, + 6.0590194e-002, + 1.7919981e-002, + -2.1735260e-002, + 2.5431032e-003, + -2.3276711e-003, + 4.7679757e-003, + 2.6771182e-002, + -8.0137596e-002, + -4.9700338e-002, + 2.4445536e-002, + -7.2537218e-002, + -1.8968099e-002, + 6.6550477e-002, + 6.7579085e-002, + -3.1351180e-002, + 1.6129275e-002, + 3.6101242e-002, + 1.1199196e-002, + 7.9145428e-003, + 4.0067468e-002, + 6.0585461e-003, + -7.4588015e-003, + 2.1235782e-002, + 6.3041751e-003, + -1.1634076e-003, + 2.2258425e-002, + -3.4248029e-002, + -4.5811428e-002, + 1.0578831e-002, + -5.5482586e-002, + -6.8507992e-002, + -7.7083934e-002, + -5.3913115e-002, + 5.9790071e-002, + -2.0841051e-002, + 2.3080531e-002, + 1.1187349e-001, + -7.1392621e-002, + 2.9668837e-003, + -2.9860507e-002, + 4.6683202e-002, + 8.5830739e-002, + -2.0897455e-002, + 3.2863177e-002, + 2.2323987e-002, + 4.8358711e-002, + 8.7562303e-003, + 1.4793712e-002, + -2.5985375e-002, + -4.6720770e-002, + -5.9782514e-002, + -4.2989314e-002, + 7.8223798e-002, + 1.1501209e-001, + 1.2024343e-001, + -5.6786240e-002, + -4.8421534e-002, + -2.5415443e-002, + 2.4664879e-002, + 1.7783775e-002, + 2.0466227e-002, + 7.8206669e-002, + -8.2391143e-002, + -1.3995146e-002, + -2.0960454e-002, + -5.6618569e-002, + -2.6705178e-002, + -8.1531358e-002, + 6.4664818e-003, + 5.6946318e-002, + 5.0003662e-002, + 3.5673980e-002, + 8.0875426e-002, + -4.4495078e-002, + -2.6194380e-002, + 4.5188183e-002, + -4.2455744e-002, + 5.7249340e-002, + -4.6127242e-002, + -5.4839710e-002, + -5.0448334e-002, + -2.2395030e-004, + -6.2981968e-002, + 3.6554485e-002, + 4.5243127e-003, + 6.8154599e-003, + 1.6305659e-001, + 3.9595164e-003, + -1.0792651e-002, + -2.8054860e-002, + -9.9706967e-002, + 2.3929942e-002, + -3.5658959e-004, + 6.6546468e-002, + 7.6294884e-002, + -4.0440534e-002, + -8.1371512e-002, + -7.7127876e-002, + 3.4857333e-002, + 4.3231191e-002, + 2.2144645e-002, + -3.8698213e-002, + -5.4129054e-002, + -3.2626325e-002, + -7.0222190e-002, + -5.1754787e-002, + -9.5744838e-002, + -1.7610262e-003, + 8.7360648e-003, + -4.6748263e-002, + -4.4850953e-002, + 8.2298815e-002, + 1.0185814e-002, + -3.0866560e-004, + 1.6675645e-002, + -4.2935404e-002, + -3.1656641e-002, + -5.6516863e-002, + -4.7656267e-004, + 1.0889961e-001, + 1.2029252e-002, + -1.3472583e-002, + 3.6157205e-002, + 4.4803936e-002, + 1.5275167e-002, + -4.7686528e-002, + 6.0330901e-002, + 1.3728328e-002, + 4.8689836e-002, + -3.5294359e-002, + -7.4547708e-002, + 3.0394600e-002, + 8.6384237e-002, + -4.9979038e-002, + 1.3943821e-002, + -8.2317359e-002, + 2.6078427e-002, + -4.8139628e-002, + -5.8720671e-002, + 5.3289578e-003, + -2.4543964e-002, + -3.1049552e-002, + -6.8795054e-002, + 2.6130466e-002, + 6.4881211e-003, + -1.7466698e-002, + 6.9418212e-002, + 9.6543814e-002, + 1.6716383e-002, + 1.0116932e-001, + 3.1515754e-002, + -1.5792490e-001, + -3.1915346e-002, + -4.3203259e-002, + -1.3039328e-002, + 1.0861618e-002, + 2.0098174e-002, + -5.8931575e-002, + 4.5019833e-002, + -4.4827929e-002, + -8.5719969e-002, + 4.7105627e-002, + 8.1454794e-002, + 1.5516734e-002, + -5.0548980e-002, + 5.9127415e-003, + -7.5578193e-002, + 1.1628813e-001, + 4.7500758e-002, + 4.9223640e-002, + 2.2248040e-002, + -1.7063173e-002, + 6.7174653e-002, + -8.8027078e-003, + -7.9122977e-002, + -2.7534155e-002, + 1.8033777e-002, + -6.3064595e-002, + -3.2992531e-002, + -1.3414397e-002, + -3.7650237e-002, + -5.4990281e-003, + 4.9549050e-002, + -7.8256965e-002, + -4.6347502e-002, + -3.7844657e-002, + -4.6727423e-002, + 5.1371291e-002, + -3.1964828e-002, + -1.5232444e-003, + -6.8143489e-002, + -5.5095855e-002, + -1.0895044e-002, + -2.5604041e-003, + 2.7027105e-002, + -7.6982878e-003, + -9.5337685e-002, + -1.8635429e-002, + -1.0751357e-001, + -5.6070283e-002, + 1.4123461e-002, + -1.8192970e-002, + 4.4540436e-002, + 1.3600658e-002, + 3.2261098e-002, + 4.4861229e-002, + -1.5863787e-002, + -1.0092780e-002, + -3.9516555e-003, + 3.8360973e-002, + 6.1804829e-002, + 1.0870303e-001, + 4.7383438e-002, + -5.0590863e-002, + -5.2113776e-002, + 5.2393207e-002, + 1.2177198e-002, + 6.2526425e-002, + 8.3174224e-003, + -2.4071062e-002, + 2.8581013e-002, + -6.0028375e-003, + 1.5238535e-002, + 5.2025149e-003, + -3.6385591e-002, + -9.3463539e-003, + -9.7549044e-003, + 4.1434624e-002, + -3.5638211e-002, + 6.1524697e-002, + 1.2879217e-002, + -1.1074718e-002, + 7.5826917e-003, + -4.3450751e-002, + -3.4027473e-002, + 6.3700920e-002, + -5.2272643e-002, + -2.8750180e-002, + 4.0041018e-002, + -8.1966458e-002, + -1.0461089e-002, + 2.5452300e-002, + 6.7107297e-002, + -3.3918191e-002, + -1.0212989e-001, + -6.3527291e-002, + 3.1678548e-002, + -6.5778118e-002, + -1.6823229e-002, + 2.2988117e-003, + -4.8242461e-002, + -1.4582693e-002, + -4.9060246e-002, + -3.4256626e-003, + 4.1172518e-002, + 3.2772250e-002, + 2.4890066e-002, + 3.4522929e-003, + 4.4704585e-002, + -5.9967401e-002, + 1.4541680e-002, + -7.9411114e-002, + -6.5131143e-002, + -4.2051810e-002, + 4.2103006e-002, + -9.8683984e-004, + -5.0962061e-003, + -2.2606406e-002, + -1.2325980e-001, + 9.5086419e-002, + -1.9106034e-002, + -5.1992218e-002, + -6.7436377e-002, + -1.5798067e-002, + -7.5885603e-002, + 1.7614604e-002, + 3.0602185e-002, + -4.5707990e-002, + 5.0279499e-002, + 1.3599448e-002, + -8.4652879e-002, + 1.4275404e-002, + 5.3761838e-002, + 1.3130364e-002, + -5.7785349e-003, + 1.0995249e-001, + 3.6117865e-002, + 2.2136081e-002, + 1.1263325e-002, + -4.9338919e-002, + 4.2415991e-002, + -6.3570185e-002, + 5.1525003e-002, + 8.9408937e-002, + -4.3531507e-002, + 2.5382423e-002, + 5.7394710e-002, + 1.1827633e-001, + -1.4335949e-002, + 2.4596850e-002, + -1.8394004e-002, + 1.3479964e-002, + -5.5450915e-002, + -1.3887857e-002, + 3.7399926e-002, + 4.2692709e-002, + -9.1345703e-002, + -6.4179097e-002, + 5.1528849e-002, + 1.1923834e-001, + 8.0392828e-003, + -7.4190647e-003, + 1.1158220e-002, + 2.3106872e-002, + 2.5289633e-002, + -7.8109586e-002, + 4.4033891e-002, + 2.9868351e-002, + 2.5709704e-002, + 6.5446252e-003, + 1.7279125e-002, + 8.8849380e-002, + -4.2399471e-002, + 3.2297167e-002, + -3.3758385e-002, + 5.3666150e-002, + 3.7628322e-002, + -1.3602948e-002, + 8.3115154e-002, + -4.4130785e-002, + 1.5545953e-002, + -5.7188645e-002, + 3.3708440e-002, + 7.9527486e-003, + 7.2838427e-002, + -8.7159852e-004, + 9.8852335e-002, + 4.3261724e-002, + -2.2410237e-002, + -1.9969511e-002, + 1.3049591e-002, + 1.3520410e-001 + }; + +float audiobeam_mic_locations[ 15 ][ 3 ] = { + {1.5, 2.79, 0}, + {1.5, 2.82, 0}, + {1.5, 2.85, 0}, + {1.5, 2.88, 0}, + {1.5, 2.91, 0}, + {1.5, 2.94, 0}, + {1.5, 2.97, 0}, + {1.5, 3, 0}, + {1.5, 3.03, 0}, + {1.5, 3.06, 0}, + {1.5, 3.09, 0}, + {1.5, 3.12, 0}, + {1.5, 3.15, 0}, + {1.5, 3.18, 0}, + {1.5, 3.21, 0} +}; + +float audiobeam_source_location[ 3 ] = {1.1677, 2.1677, 1}; + +float audiobeam_origin_location[ 3 ] = {1.5, 3, 0}; diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.c b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.c new file mode 100755 index 0000000..b513b3e --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.c @@ -0,0 +1,425 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibm.c + + Author: Ian Lance Taylor and J.T. Conklin + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + + +#include "audiobeamlibm.h" +#include "audiobeamlibmath.h" + + +static const int audiobeam_npio2_hw[ ] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +static const float +audiobeam_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +audiobeam_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +audiobeam_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +audiobeam_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +audiobeam_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +audiobeam_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +audiobeam_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +static const float +audiobeam_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +audiobeam_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +audiobeam_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +audiobeam_C4 = -2.7557314297e-07f, /* 0xb493f27c */ +audiobeam_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +audiobeam_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +static const float +audiobeam_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +audiobeam_S2 = 8.3333337680e-03f, /* 0x3c088889 */ +audiobeam_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +audiobeam_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +audiobeam_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +audiobeam_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +static const float +audiobeam_two25 = 3.355443200e+07f, /* 0x4c000000 */ +audiobeam_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + + +int audiobeam___ieee754_rem_pio2f( float x, float *y ) +{ + float z, w, t, r, fn; + int i, j, n = 0, ix, hx; + + AUDIOBEAM_GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { + if ( hx > 0 ) { + z = x - audiobeam_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { + y[ 0 ] = z - audiobeam_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - audiobeam_pio2_1t; + } else { + z -= audiobeam_pio2_2; + y[ 0 ] = z - audiobeam_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - audiobeam_pio2_2t; + } + return 1; + } else { + z = x + audiobeam_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { + y[ 0 ] = z + audiobeam_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + audiobeam_pio2_1t; + } else { + z += audiobeam_pio2_2; + y[ 0 ] = z + audiobeam_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + audiobeam_pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { + t = audiobeam_fabsf( x ); + n = ( int ) ( t * audiobeam_invpio2 + audiobeam_half ); + fn = ( float )n; + r = t - fn * audiobeam_pio2_1; + w = fn * audiobeam_pio2_1t; + if ( n < 32 && ( int )( ix & 0xffffff00 ) != audiobeam_npio2_hw[ n - 1 ] ) + y[ 0 ] = r - w; + else { + unsigned int high; + j = ix >> 23; + y[ 0 ] = r - w; + AUDIOBEAM_GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { + t = r; + w = fn * audiobeam_pio2_2; + r = t - w; + w = fn * audiobeam_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + AUDIOBEAM_GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { + t = r; + w = fn * audiobeam_pio2_3; + r = t - w; + w = fn * audiobeam_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + if ( ix >= 0x7f800000 ) { + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + + return n; +} + + +float audiobeam___kernel_cosf( float x, float y ) +{ + float a, hz, z, r, qx; + int ix; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; + if ( ix < 0x32000000 ) { + if ( ( ( int )x ) == 0 ) return audiobeam_one; + } + z = x * x; + r = z * ( audiobeam_C1 + z * ( audiobeam_C2 + z * ( audiobeam_C3 + z * + ( audiobeam_C4 + z * + ( audiobeam_C5 + z * audiobeam_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) + return audiobeam_one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) + qx = ( float )0.28125f; + else + AUDIOBEAM_SET_FLOAT_WORD( qx, ix - 0x01000000 ); + hz = ( float )0.5f * z - qx; + a = audiobeam_one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} + + +float audiobeam___kernel_sinf( float x, float y, int iy ) +{ + float z, r, v; + int ix; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; + if ( ix < 0x32000000 ) { + if ( ( int )x == 0 ) return x; + } + z = x * x; + v = z * x; + r = audiobeam_S2 + z * ( audiobeam_S3 + z * ( audiobeam_S4 + z * + ( audiobeam_S5 + z * audiobeam_S6 ) ) ); + if ( iy == 0 ) return x + v * ( audiobeam_S1 + z * r ); + else return x - ( ( z * ( audiobeam_half * y - v * r ) - y ) - v * + audiobeam_S1 ); +} + + +float audiobeam___copysignf( float x, float y ) +{ + unsigned int ix, iy; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + AUDIOBEAM_GET_FLOAT_WORD( iy, y ); + AUDIOBEAM_SET_FLOAT_WORD( x, ( ix & 0x7fffffff ) | ( iy & 0x80000000 ) ); + return x; +} + + +float audiobeam___cosf( float x ) +{ + float y[ 2 ], z = 0.0f; + int n, ix; + + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return audiobeam___kernel_cosf( x, z ); + + else + if ( ix >= 0x7f800000 ) return x - x; + + else { + y[ 0 ] = 0.0; + y[ 1 ] = 0.0; + n = audiobeam___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return audiobeam___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -audiobeam___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 2: + return -audiobeam___kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return audiobeam___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + + +float audiobeam___fabsf( float x ) +{ + unsigned int ix; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + AUDIOBEAM_SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} + + +float audiobeam___floorf( float x ) +{ + int i0, j0; + unsigned int i; + AUDIOBEAM_GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { + if ( audiobeam_huge + x > ( float )0.0f ) { + if ( i0 >= 0 ) + i0 = 0; + else + if ( ( i0 & 0x7fffffff ) != 0 ) + i0 = 0xbf800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; + if ( audiobeam_huge + x > ( float )0.0f ) { + if ( i0 < 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; + else return x; + } + AUDIOBEAM_SET_FLOAT_WORD( x, i0 ); + return x; +} + + +int audiobeam___isinff ( float x ) +{ + int ix, t; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~( t >> 31 ) & ( ix >> 30 ); +} + + +float audiobeam___scalbnf ( float x, int n ) +{ + int k, ix; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + k = ( ix & 0x7f800000 ) >> 23; + if ( k == 0 ) { + if ( ( ix & 0x7fffffff ) == 0 ) return x; + x *= audiobeam_two25; + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + k = ( ( ix & 0x7f800000 ) >> 23 ) - 25; + } + if ( k == 0xff ) return x + x; + k = k + n; + if ( n > 50000 || k > 0xfe ) + return audiobeam_huge * audiobeam___copysignf( audiobeam_huge, + x ); + if ( n < -50000 ) + return audiobeam_tiny * audiobeam___copysignf( audiobeam_tiny, + x ); + if ( k > 0 ) { + AUDIOBEAM_SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x; + } + if ( k <= -25 ) + return audiobeam_tiny * audiobeam___copysignf( audiobeam_tiny, + x ); + k += 25; + AUDIOBEAM_SET_FLOAT_WORD( x, ( ix & 0x807fffff ) | ( k << 23 ) ); + return x * audiobeam_twom25; +} + + +float audiobeam___ceilf( float x ) +{ + int i0, j0; + unsigned int i; + + AUDIOBEAM_GET_FLOAT_WORD( i0, x ); + j0 = ( ( i0 >> 23 ) & 0xff ) - 0x7f; + if ( j0 < 23 ) { + if ( j0 < 0 ) { + if ( audiobeam_huge + x > ( float )0.0 ) { + if ( i0 < 0 ) + i0 = 0x80000000; + else + if ( i0 != 0 ) + i0 = 0x3f800000; + } + } else { + i = ( 0x007fffff ) >> j0; + if ( ( i0 & i ) == 0 ) return x; + if ( audiobeam_huge + x > ( float )0.0 ) { + if ( i0 > 0 ) i0 += ( 0x00800000 ) >> j0; + i0 &= ( ~i ); + } + } + } else { + if ( j0 == 0x80 ) return x + x; + else return x; + } + AUDIOBEAM_SET_FLOAT_WORD( x, i0 ); + return x; +} + + +float audiobeam___ieee754_sqrtf( float x ) +{ + float z; + int sign = ( int )0x80000000; + int ix, s, q, m, t, i; + unsigned int r; + + AUDIOBEAM_GET_FLOAT_WORD( ix, x ); + + if ( ( ix & 0x7f800000 ) == 0x7f800000 ) + return x * x + x; + if ( ix <= 0 ) { + if ( ( ix & ( ~sign ) ) == 0 ) return x; + else + if ( ix < 0 ) + return ( x - x ) / ( x - x ); + } + m = ( ix >> 23 ); + if ( m == 0 ) { + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; ( ix & 0x00800000 ) == 0; i++ ) + ix <<= 1; + m -= i - 1; + } + m -= 127; + ix = ( ix & 0x007fffff ) | 0x00800000; + if ( m & 1 ) + ix += ix; + m >>= 1; + + ix += ix; + q = s = 0; + r = 0x01000000; + + _Pragma( "loopbound min 25 max 25" ) + while ( r != 0 ) { + t = s + r; + if ( t <= ix ) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + if ( ix != 0 ) { + z = audiobeam_one - audiobeam_tiny; + if ( z >= audiobeam_one ) { + z = audiobeam_one + audiobeam_tiny; + if ( z > audiobeam_one ) + q += 2; + else + q += ( q & 1 ); + } + } + ix = ( q >> 1 ) + 0x3f000000; + ix += ( m << 23 ); + AUDIOBEAM_SET_FLOAT_WORD( z, ix ); + return z; +} diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.h b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.h new file mode 100755 index 0000000..b06b563 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibm.h @@ -0,0 +1,59 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See audiobeamlibm.c + +*/ + +#ifndef AUDIOBEAM_LIBM +#define AUDIOBEAM_LIBM + +#define audiobeam_M_PI 3.14159265358979323846 + +static const float +audiobeam_one = 1.0f, +audiobeam_tiny = 1.0e-30f, +audiobeam_half = 5.0000000000e-01, /* 0x3f000000 */ +audiobeam_huge = 1.0e30, +audiobeam_two8 = 2.5600000000e+02, /* 0x43800000 */ +audiobeam_twon8 = 3.9062500000e-03, /* 0x3b800000 */ +audiobeam_zero = 0.0; + +#define audiobeam_cos audiobeam___cosf +#define audiobeam_fabs audiobeam___fabsf +#define audiobeam_fabsf audiobeam___fabsf +#define audiobeam_isinf audiobeam___isinff +#define audiobeam_sqrt audiobeam___ieee754_sqrtf +#define audiobeam_ceil audiobeam___ceilf +#define audiobeam_floor audiobeam___floorf + +float audiobeam___copysignf( float x, float y ); +float audiobeam___cosf( float x ); +float audiobeam___fabsf( float x ); +float audiobeam___floorf( float x ); +int audiobeam___ieee754_rem_pio2f( float x, float *y ); +float audiobeam___ieee754_sqrtf( float x ); +int audiobeam___isinff ( float x ); +float audiobeam___kernel_cosf( float x, float y ); +float audiobeam___kernel_sinf( float x, float y, int iy ); +int audiobeam___kernel_rem_pio2f( float *x, float *y, int e0, int nx, + int prec, const int *ipio2 ); +float audiobeam___scalbnf ( float x, int n ); +float audiobeam___ceilf( float x ); +float audiobeam___floorf( float x ); + +#endif // AUDIOBEAM_LIBM diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.c b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.c new file mode 100755 index 0000000..324b3a5 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.c @@ -0,0 +1,14 @@ +#include "audiobeamlibmalloc.h" + +#define AUDIOBEAM_HEAP_SIZE 10000 + +static char audiobeam_simulated_heap[ AUDIOBEAM_HEAP_SIZE ]; +static unsigned int audiobeam_freeHeapPos; + +void *audiobeam_malloc( unsigned int numberOfBytes ) +{ + void *currentPos = ( void * )&audiobeam_simulated_heap[ audiobeam_freeHeapPos ]; + /* Get a 4-byte address for alignment purposes */ + audiobeam_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int )0xfffffffc ); + return currentPos; +} diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.h b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.h new file mode 100755 index 0000000..eccbdb9 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmalloc.h @@ -0,0 +1,27 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibmalloc.c + + Author: unkown + + Function: Memory allocation. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: see license.txt + +*/ + +#ifndef AUDIOBEAM_MALLOC_H +#define AUDIOBEAM_MALLOC_H + +void *audiobeam_malloc( unsigned int numberOfBytes ); + +#endif diff --git a/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmath.h b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmath.h new file mode 100755 index 0000000..77bda0f --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/audiobeamlibmath.h @@ -0,0 +1,69 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibmath.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_private.h + + Changes: No major functional changes. + + License: See the terms below. + +*/ + + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef AUDIOBEAM_MATH_PRIVATE_H_ +#define AUDIOBEAM_MATH_PRIVATE_H_ + +#include "audiobeamlibm.h" + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + unsigned int word; +} audiobeam_ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define AUDIOBEAM_GET_FLOAT_WORD(i,d) \ +{ \ + audiobeam_ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define AUDIOBEAM_SET_FLOAT_WORD(d,i) \ +{ \ + audiobeam_ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/audiobeam/changeLog.txt b/targets/wasm-tacle/sequential/audiobeam/changeLog.txt new file mode 100755 index 0000000..b9b8933 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/changeLog.txt @@ -0,0 +1,36 @@ +File: audiobeam.c +Original provenience: StreamIt + http://groups.csail.mit.edu/cag/streamit/ + +2015-12-29: +- Removed original header comment, replaced by TACLeBench header. +- Renamed libraryfiles according to TACLeBench naming scheme. +- Removed all preprocessor macros, integrated them directly in the source code. +- Added prefix "audiobeam_" to all global symbols. +- Added explicit forward declarations of functions. +- Added an empty init function +- Added preprocessor command to determine if 32 or 64 bit in audiobeamlibmalloc.h +- Added new function audiobeam_return producing a checksum as return value. +- Added new function audiobeam_main according to TACLeBench guidelines. + audiobeam_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur \ No newline at end of file diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wasm b/targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wasm new file mode 100755 index 0000000000000000000000000000000000000000..be934c07bda93d9638627257bd9995511d41017a GIT binary patch literal 35182 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�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

    j8qiOYY#YHSY8Wz0KT$~&NmOW-#Gkn~ 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wat b/targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wat new file mode 100644 index 0000000..bf29129 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/default/audiobeam.wat @@ -0,0 +1,4921 @@ +(module $audiobeam.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32) (result i32))) + (type (;3;) (func (param i32 i32 f32 i32 i32 i32 i32 i32) (result i32))) + (type (;4;) (func (param i32 i32 i32 i32 i32 i32 i32) (result i32))) + (type (;5;) (func (param i32 i32 i32))) + (type (;6;) (func (result i32))) + (type (;7;) (func (param f32 i32) (result i32))) + (type (;8;) (func (param f32) (result f32))) + (type (;9;) (func (param i32) (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $audiobeam_init (type 1) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + i32.const 0 + i32.store offset=24404 + i32.const 0 + i32.const 0 + i32.store offset=24400 + local.get 0 + i32.const 0 + i32.store8 offset=15 + i32.const 23040 + i32.const 23040 + call $__pragma_loopbound + i32.const -23040 + local.set 1 + loop ;; label = @1 + i32.const 1152 + local.get 1 + i32.add + local.tee 2 + i32.const 23040 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 23041 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 23042 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 23043 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 180 + i32.const 180 + call $__pragma_loopbound + i32.const -180 + local.set 1 + loop ;; label = @1 + i32.const 24192 + local.get 1 + i32.add + local.tee 2 + i32.const 180 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 181 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 182 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 183 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 12 + i32.const 12 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=24372 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=24372 + i32.const 24372 + i32.const 24372 + i32.load8_u offset=1 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1 + i32.const 24372 + i32.const 24372 + i32.load8_u offset=2 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=2 + i32.const 24372 + i32.const 24372 + i32.load8_u offset=3 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=3 + i32.const 24372 + i32.const 24372 + i32.load8_u offset=4 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=4 + i32.const 24372 + i32.const 24372 + i32.load8_u offset=5 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=5 + i32.const 24372 + local.get 0 + i32.load8_u offset=15 + i32.const 24372 + i32.load8_u offset=6 + i32.xor + i32.store8 offset=6 + i32.const 24372 + local.get 0 + i32.load8_u offset=15 + i32.const 24372 + i32.load8_u offset=7 + i32.xor + i32.store8 offset=7 + i32.const 24372 + local.get 0 + i32.load8_u offset=15 + i32.const 24372 + i32.load8_u offset=8 + i32.xor + i32.store8 offset=8 + i32.const 24372 + local.get 0 + i32.load8_u offset=15 + i32.const 24372 + i32.load8_u offset=9 + i32.xor + i32.store8 offset=9 + i32.const 24372 + local.get 0 + i32.load8_u offset=15 + i32.const 24372 + i32.load8_u offset=10 + i32.xor + i32.store8 offset=10 + i32.const 24372 + local.get 0 + i32.load8_u offset=15 + i32.const 24372 + i32.load8_u offset=11 + i32.xor + i32.store8 offset=11 + i32.const 12 + i32.const 12 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=24384 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=24384 + i32.const 24384 + i32.const 24384 + i32.load8_u offset=1 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=1 + i32.const 24384 + i32.const 24384 + i32.load8_u offset=2 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=2 + i32.const 24384 + i32.const 24384 + i32.load8_u offset=3 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=3 + i32.const 24384 + i32.const 24384 + i32.load8_u offset=4 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=4 + i32.const 24384 + i32.const 24384 + i32.load8_u offset=5 + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=5 + i32.const 24384 + local.get 0 + i32.load8_u offset=15 + i32.const 24384 + i32.load8_u offset=6 + i32.xor + i32.store8 offset=6 + i32.const 24384 + local.get 0 + i32.load8_u offset=15 + i32.const 24384 + i32.load8_u offset=7 + i32.xor + i32.store8 offset=7 + i32.const 24384 + local.get 0 + i32.load8_u offset=15 + i32.const 24384 + i32.load8_u offset=8 + i32.xor + i32.store8 offset=8 + i32.const 24384 + local.get 0 + i32.load8_u offset=15 + i32.const 24384 + i32.load8_u offset=9 + i32.xor + i32.store8 offset=9 + i32.const 24384 + local.get 0 + i32.load8_u offset=15 + i32.const 24384 + i32.load8_u offset=10 + i32.xor + i32.store8 offset=10 + i32.const 24384 + local.get 0 + i32.load8_u offset=15 + i32.const 24384 + i32.load8_u offset=11 + i32.xor + i32.store8 offset=11 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $audiobeam_preprocess_delays (type 0) (param i32 i32) + (local f32 i32 f32) + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 0 + local.get 1 + f32.load + local.tee 2 + f32.store + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=8 + local.get 1 + f32.load + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=12 + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + local.get 1 + f32.load offset=4 + local.tee 2 + f32.store offset=16 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=24 + local.get 1 + f32.load offset=4 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=4 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=28 + local.get 0 + local.get 3 + i32.store offset=20 + local.get 0 + local.get 1 + f32.load offset=8 + local.tee 2 + f32.store offset=32 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=40 + local.get 1 + f32.load offset=8 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=8 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=44 + local.get 0 + local.get 3 + i32.store offset=36 + local.get 0 + local.get 1 + f32.load offset=12 + local.tee 2 + f32.store offset=48 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=56 + local.get 1 + f32.load offset=12 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=12 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=60 + local.get 0 + local.get 3 + i32.store offset=52 + local.get 0 + local.get 1 + f32.load offset=16 + local.tee 2 + f32.store offset=64 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=72 + local.get 1 + f32.load offset=16 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=16 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=76 + local.get 0 + local.get 3 + i32.store offset=68 + local.get 0 + local.get 1 + f32.load offset=20 + local.tee 2 + f32.store offset=80 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=88 + local.get 1 + f32.load offset=20 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=20 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=92 + local.get 0 + local.get 3 + i32.store offset=84 + local.get 0 + local.get 1 + f32.load offset=24 + local.tee 2 + f32.store offset=96 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=104 + local.get 1 + f32.load offset=24 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=24 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=108 + local.get 0 + local.get 3 + i32.store offset=100 + local.get 0 + local.get 1 + f32.load offset=28 + local.tee 2 + f32.store offset=112 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=120 + local.get 1 + f32.load offset=28 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=28 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=124 + local.get 0 + local.get 3 + i32.store offset=116 + local.get 0 + local.get 1 + f32.load offset=32 + local.tee 2 + f32.store offset=128 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=136 + local.get 1 + f32.load offset=32 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=32 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=140 + local.get 0 + local.get 3 + i32.store offset=132 + local.get 0 + local.get 1 + f32.load offset=36 + local.tee 2 + f32.store offset=144 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=152 + local.get 1 + f32.load offset=36 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=36 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=156 + local.get 0 + local.get 3 + i32.store offset=148 + local.get 0 + local.get 1 + f32.load offset=40 + local.tee 2 + f32.store offset=160 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=168 + local.get 1 + f32.load offset=40 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=40 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=172 + local.get 0 + local.get 3 + i32.store offset=164 + local.get 0 + local.get 1 + f32.load offset=44 + local.tee 2 + f32.store offset=176 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=184 + local.get 1 + f32.load offset=44 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=44 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=188 + local.get 0 + local.get 3 + i32.store offset=180 + local.get 0 + local.get 1 + f32.load offset=48 + local.tee 2 + f32.store offset=192 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=200 + local.get 1 + f32.load offset=48 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=48 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=204 + local.get 0 + local.get 3 + i32.store offset=196 + local.get 0 + local.get 1 + f32.load offset=52 + local.tee 2 + f32.store offset=208 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=216 + local.get 1 + f32.load offset=52 + call $audiobeam___floorf + local.set 2 + local.get 1 + f32.load offset=52 + local.set 4 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 4 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=220 + local.get 0 + local.get 3 + i32.store offset=212 + local.get 0 + local.get 1 + f32.load offset=56 + local.tee 2 + f32.store offset=224 + block ;; label = @1 + block ;; label = @2 + local.get 2 + call $audiobeam___ceilf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=232 + block ;; label = @1 + block ;; label = @2 + local.get 1 + f32.load offset=56 + call $audiobeam___floorf + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 3 + end + local.get 0 + local.get 3 + i32.store offset=228 + local.get 0 + local.get 1 + f32.load offset=56 + local.get 3 + f32.convert_i32_s + f32.sub + f32.store offset=236) + (func $audiobeam_init_data_queue (type 2) (param i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 16 + call $audiobeam_malloc + local.tee 2 + local.get 0 + i32.const 2 + i32.shl + i32.const 4 + i32.add + call $audiobeam_malloc + i32.store + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @1 + local.get 0 + i32.const 0 + i32.lt_s + br_if 0 (;@1;) + local.get 1 + i32.const 2 + i32.shl + local.set 3 + block ;; label = @2 + local.get 1 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + local.get 0 + i32.const 1 + i32.add + local.set 4 + i32.const 0 + local.set 1 + loop ;; label = @3 + local.get 3 + call $audiobeam_malloc + local.set 5 + local.get 2 + i32.load + local.get 1 + i32.add + local.get 5 + i32.store + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 1 + i32.const 2147483640 + i32.and + local.set 5 + local.get 1 + i32.const 7 + i32.and + local.set 6 + local.get 1 + i32.const 8 + i32.lt_u + local.set 7 + i32.const 0 + local.set 8 + loop ;; label = @2 + local.get 3 + call $audiobeam_malloc + local.set 1 + local.get 2 + i32.load + local.get 8 + i32.const 2 + i32.shl + local.tee 4 + i32.add + local.get 1 + i32.store + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 2 + i32.load + local.get 4 + i32.add + i32.load + local.set 9 + i32.const 0 + local.set 4 + block ;; label = @3 + local.get 7 + br_if 0 (;@3;) + i32.const 0 + local.set 4 + local.get 9 + local.set 1 + loop ;; label = @4 + local.get 1 + i64.const 0 + i64.store align=4 + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store align=4 + local.get 1 + i32.const 16 + i32.add + i64.const 0 + i64.store align=4 + local.get 1 + i32.const 8 + i32.add + i64.const 0 + i64.store align=4 + local.get 1 + i32.const 32 + i32.add + local.set 1 + local.get 5 + local.get 4 + i32.const 8 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@4;) + end + end + block ;; label = @3 + local.get 6 + i32.eqz + br_if 0 (;@3;) + local.get 9 + local.get 4 + i32.const 2 + i32.shl + i32.add + local.set 1 + local.get 6 + local.set 4 + loop ;; label = @4 + local.get 1 + i32.const 0 + i32.store + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + br_if 0 (;@4;) + end + end + local.get 8 + local.get 0 + i32.eq + local.set 1 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 1 + i32.eqz + br_if 0 (;@2;) + end + end + local.get 2 + i32.const 0 + i32.store8 offset=12 + local.get 2 + i64.const 0 + i64.store offset=4 align=4 + local.get 2) + (func $audiobeam_process_signal (type 3) (param i32 i32 f32 i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 f32 i32 i32 i32 f32 i32 i32 i32 f32) + global.get $__stack_pointer + i32.const 240 + i32.sub + local.tee 8 + global.set $__stack_pointer + local.get 8 + local.get 0 + i32.load + i32.load + call $audiobeam_preprocess_delays + i32.const 13 + i32.const 13 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=4 + i32.const 2 + i32.lt_s + br_if 0 (;@2;) + i32.const 0 + i32.load offset=24400 + local.set 9 + i32.const -1 + local.set 10 + i32.const 0 + local.set 11 + loop ;; label = @3 + local.get 9 + i32.const 5759 + i32.gt_s + br_if 2 (;@1;) + local.get 4 + i32.load + local.get 4 + i32.load offset=4 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 12 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 12 + i32.const 1152 + i32.const 0 + i32.load offset=24400 + local.tee 13 + i32.const 2 + i32.shl + i32.add + local.tee 9 + f32.load + f32.store + local.get 12 + local.get 9 + i32.const 4 + i32.add + f32.load + f32.store offset=4 + local.get 12 + local.get 9 + i32.const 8 + i32.add + f32.load + f32.store offset=8 + local.get 12 + local.get 9 + i32.const 12 + i32.add + f32.load + f32.store offset=12 + local.get 12 + local.get 9 + i32.const 16 + i32.add + f32.load + f32.store offset=16 + local.get 12 + local.get 9 + i32.const 20 + i32.add + f32.load + f32.store offset=20 + local.get 12 + local.get 9 + i32.const 24 + i32.add + f32.load + f32.store offset=24 + local.get 12 + local.get 9 + i32.const 28 + i32.add + f32.load + f32.store offset=28 + local.get 12 + local.get 9 + i32.const 32 + i32.add + f32.load + f32.store offset=32 + local.get 12 + local.get 9 + i32.const 36 + i32.add + f32.load + f32.store offset=36 + local.get 12 + local.get 9 + i32.const 40 + i32.add + f32.load + f32.store offset=40 + local.get 12 + local.get 9 + i32.const 44 + i32.add + f32.load + f32.store offset=44 + local.get 12 + local.get 9 + i32.const 48 + i32.add + f32.load + f32.store offset=48 + local.get 12 + local.get 9 + i32.const 52 + i32.add + f32.load + f32.store offset=52 + local.get 12 + local.get 9 + i32.const 56 + i32.add + f32.load + f32.store offset=56 + i32.const 0 + local.get 13 + i32.const 15 + i32.add + local.tee 9 + i32.store offset=24400 + local.get 4 + local.get 4 + i32.load offset=4 + local.tee 13 + i32.const 0 + local.get 0 + i32.load offset=4 + local.tee 12 + i32.const -1 + i32.xor + local.get 13 + local.get 12 + i32.lt_s + select + i32.add + i32.const 1 + i32.add + i32.store offset=4 + local.get 11 + i32.const 1 + i32.add + local.tee 11 + local.get 12 + i32.const -1 + i32.add + i32.lt_s + br_if 0 (;@3;) + end + end + i32.const 371 + i32.const 371 + call $__pragma_loopbound + block ;; label = @2 + local.get 6 + br_if 0 (;@2;) + i32.const 0 + local.set 10 + br 1 (;@1;) + end + block ;; label = @2 + local.get 5 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + loop ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load offset=24400 + i32.const 5759 + i32.le_s + br_if 0 (;@4;) + i32.const 1 + local.set 10 + br 3 (;@1;) + end + local.get 4 + i32.load + local.get 4 + i32.load offset=4 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 12 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + i32.const 0 + local.set 10 + local.get 12 + i32.const 1152 + i32.const 0 + i32.load offset=24400 + local.tee 11 + i32.const 2 + i32.shl + i32.add + local.tee 9 + f32.load + f32.store + local.get 12 + local.get 9 + i32.const 4 + i32.add + f32.load + f32.store offset=4 + local.get 12 + local.get 9 + i32.const 8 + i32.add + f32.load + f32.store offset=8 + local.get 12 + local.get 9 + i32.const 12 + i32.add + f32.load + f32.store offset=12 + local.get 12 + local.get 9 + i32.const 16 + i32.add + f32.load + f32.store offset=16 + local.get 12 + local.get 9 + i32.const 20 + i32.add + f32.load + f32.store offset=20 + local.get 12 + local.get 9 + i32.const 24 + i32.add + f32.load + f32.store offset=24 + local.get 12 + local.get 9 + i32.const 28 + i32.add + f32.load + f32.store offset=28 + local.get 12 + local.get 9 + i32.const 32 + i32.add + f32.load + f32.store offset=32 + local.get 12 + local.get 9 + i32.const 36 + i32.add + f32.load + f32.store offset=36 + local.get 12 + local.get 9 + i32.const 40 + i32.add + f32.load + f32.store offset=40 + local.get 12 + local.get 9 + i32.const 44 + i32.add + f32.load + f32.store offset=44 + local.get 12 + local.get 9 + i32.const 48 + i32.add + f32.load + f32.store offset=48 + local.get 12 + local.get 9 + i32.const 52 + i32.add + f32.load + f32.store offset=52 + local.get 12 + local.get 9 + i32.const 56 + i32.add + f32.load + f32.store offset=56 + i32.const 0 + local.get 11 + i32.const 15 + i32.add + i32.store offset=24400 + i32.const 1 + i32.const 1 + call $__pragma_loopbound + local.get 4 + local.get 4 + i32.load offset=4 + local.tee 12 + i32.store offset=8 + local.get 4 + local.get 12 + i32.const 0 + local.get 0 + i32.load offset=4 + local.tee 9 + i32.const -1 + i32.xor + local.get 12 + local.get 9 + i32.lt_s + select + i32.add + i32.const 1 + i32.add + i32.store offset=4 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 1 + f32.convert_i32_s + local.set 14 + local.get 8 + i32.const 12 + i32.or + local.set 15 + i32.const 0 + local.set 16 + loop ;; label = @2 + block ;; label = @3 + i32.const 0 + i32.load offset=24400 + i32.const 5759 + i32.le_s + br_if 0 (;@3;) + i32.const 1 + local.set 10 + br 2 (;@1;) + end + local.get 4 + i32.load + local.get 4 + i32.load offset=4 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 12 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + i32.const 0 + local.set 17 + local.get 12 + i32.const 1152 + i32.const 0 + i32.load offset=24400 + local.tee 11 + i32.const 2 + i32.shl + i32.add + local.tee 9 + f32.load + f32.store + local.get 12 + local.get 9 + i32.const 4 + i32.add + f32.load + f32.store offset=4 + local.get 12 + local.get 9 + i32.const 8 + i32.add + f32.load + f32.store offset=8 + local.get 12 + local.get 9 + i32.const 12 + i32.add + f32.load + f32.store offset=12 + local.get 12 + local.get 9 + i32.const 16 + i32.add + f32.load + f32.store offset=16 + local.get 12 + local.get 9 + i32.const 20 + i32.add + f32.load + f32.store offset=20 + local.get 12 + local.get 9 + i32.const 24 + i32.add + f32.load + f32.store offset=24 + local.get 12 + local.get 9 + i32.const 28 + i32.add + f32.load + f32.store offset=28 + local.get 12 + local.get 9 + i32.const 32 + i32.add + f32.load + f32.store offset=32 + local.get 12 + local.get 9 + i32.const 36 + i32.add + f32.load + f32.store offset=36 + local.get 12 + local.get 9 + i32.const 40 + i32.add + f32.load + f32.store offset=40 + local.get 12 + local.get 9 + i32.const 44 + i32.add + f32.load + f32.store offset=44 + local.get 12 + local.get 9 + i32.const 48 + i32.add + f32.load + f32.store offset=48 + local.get 12 + local.get 9 + i32.const 52 + i32.add + f32.load + f32.store offset=52 + local.get 12 + local.get 9 + i32.const 56 + i32.add + f32.load + f32.store offset=56 + i32.const 0 + local.get 11 + i32.const 15 + i32.add + i32.store offset=24400 + i32.const 1 + i32.const 1 + call $__pragma_loopbound + loop ;; label = @3 + local.get 4 + i32.load + local.set 13 + local.get 0 + i32.load offset=4 + local.set 11 + local.get 4 + i32.load offset=4 + local.set 12 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @4 + block ;; label = @5 + local.get 1 + i32.const 1 + i32.ge_s + br_if 0 (;@5;) + f32.const 0x0p+0 (;=0;) + local.set 18 + br 1 (;@4;) + end + local.get 12 + i32.const 0 + local.get 11 + i32.const -1 + i32.xor + local.tee 10 + local.get 12 + local.get 11 + i32.lt_s + select + i32.add + i32.const 1 + i32.add + local.set 19 + block ;; label = @5 + local.get 7 + i32.eqz + br_if 0 (;@5;) + f32.const 0x0p+0 (;=0;) + local.set 18 + i32.const 0 + local.set 12 + local.get 15 + local.set 9 + local.get 1 + local.set 20 + loop ;; label = @6 + local.get 13 + local.get 9 + i32.const -4 + i32.add + i32.load + local.get 19 + i32.add + local.tee 21 + i32.const 2 + i32.shl + i32.add + local.get 10 + i32.const 0 + local.get 21 + local.get 11 + i32.gt_s + select + i32.const 2 + i32.shl + i32.add + i32.load + local.get 12 + i32.add + f32.load + local.get 13 + local.get 9 + i32.const -8 + i32.add + i32.load + local.get 19 + i32.add + local.tee 21 + i32.const 2 + i32.shl + i32.add + local.get 10 + i32.const 0 + local.get 21 + local.get 11 + i32.gt_s + select + i32.const 2 + i32.shl + i32.add + i32.load + local.get 12 + i32.add + f32.load + local.tee 22 + f32.sub + local.get 9 + f32.load + f32.mul + local.get 22 + f32.add + local.get 7 + local.get 12 + i32.add + f32.load + f32.mul + local.get 18 + f32.add + local.set 18 + local.get 9 + i32.const 16 + i32.add + local.set 9 + local.get 12 + i32.const 4 + i32.add + local.set 12 + local.get 20 + i32.const -1 + i32.add + local.tee 20 + br_if 0 (;@6;) + br 2 (;@4;) + end + end + f32.const 0x0p+0 (;=0;) + local.set 18 + i32.const 0 + local.set 9 + local.get 15 + local.set 12 + local.get 1 + local.set 20 + loop ;; label = @5 + local.get 18 + local.get 13 + local.get 12 + i32.const -4 + i32.add + i32.load + local.get 19 + i32.add + local.tee 21 + i32.const 2 + i32.shl + i32.add + local.get 10 + i32.const 0 + local.get 21 + local.get 11 + i32.gt_s + select + i32.const 2 + i32.shl + i32.add + i32.load + local.get 9 + i32.add + f32.load + local.get 13 + local.get 12 + i32.const -8 + i32.add + i32.load + local.get 19 + i32.add + local.tee 21 + i32.const 2 + i32.shl + i32.add + local.get 10 + i32.const 0 + local.get 21 + local.get 11 + i32.gt_s + select + i32.const 2 + i32.shl + i32.add + i32.load + local.get 9 + i32.add + f32.load + local.tee 22 + f32.sub + local.get 12 + f32.load + f32.mul + local.get 22 + f32.add + f32.add + local.set 18 + local.get 12 + i32.const 16 + i32.add + local.set 12 + local.get 9 + i32.const 4 + i32.add + local.set 9 + local.get 20 + i32.const -1 + i32.add + local.tee 20 + br_if 0 (;@5;) + end + end + block ;; label = @4 + local.get 3 + i32.eqz + br_if 0 (;@4;) + local.get 3 + local.get 17 + i32.const 2 + i32.shl + i32.add + i32.load + local.get 16 + i32.const 2 + i32.shl + i32.add + local.get 18 + local.get 14 + f32.div + f32.store + end + local.get 17 + i32.const 1 + i32.add + local.tee 17 + local.get 5 + i32.ne + br_if 0 (;@3;) + end + local.get 4 + local.get 4 + i32.load offset=4 + local.tee 12 + i32.store offset=8 + i32.const 0 + local.set 10 + local.get 4 + local.get 12 + i32.const 0 + local.get 0 + i32.load offset=4 + local.tee 9 + i32.const -1 + i32.xor + local.get 12 + local.get 9 + i32.lt_s + select + i32.add + i32.const 1 + i32.add + i32.store offset=4 + local.get 16 + i32.const 1 + i32.add + local.tee 16 + local.get 6 + i32.ne + br_if 0 (;@2;) + end + end + local.get 8 + i32.const 240 + i32.add + global.set $__stack_pointer + local.get 10) + (func $audiobeam_calc_beamforming_result (type 4) (param i32 i32 i32 i32 i32 i32 i32) (result i32) + (local i32 f32 i32 i32 i32 i32 f32) + block ;; label = @1 + block ;; label = @2 + local.get 6 + br_if 0 (;@2;) + i32.const 0 + local.set 6 + br 1 (;@1;) + end + i32.const 60 + call $audiobeam_malloc + local.set 6 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 6 + f32.const -0x1.921fb6p+1 (;=-3.14159;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store + local.get 6 + f32.const -0x1.58ad76p+1 (;=-2.69279;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=4 + local.get 6 + f32.const -0x1.1f3b38p+1 (;=-2.24399;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=8 + local.get 6 + f32.const -0x1.cb91f4p+0 (;=-1.7952;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=12 + local.get 6 + f32.const -0x1.58ad76p+0 (;=-1.3464;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=16 + local.get 6 + f32.const -0x1.cb91f4p-1 (;=-0.897598;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=20 + local.get 6 + f32.const -0x1.cb91f4p-2 (;=-0.448799;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=24 + local.get 6 + f32.const 0x0p+0 (;=0;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=28 + local.get 6 + f32.const 0x1.cb91f4p-2 (;=0.448799;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=32 + local.get 6 + f32.const 0x1.cb91f4p-1 (;=0.897598;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=36 + local.get 6 + f32.const 0x1.58ad76p+0 (;=1.3464;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=40 + local.get 6 + f32.const 0x1.cb91f4p+0 (;=1.7952;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=44 + local.get 6 + f32.const 0x1.1f3b38p+1 (;=2.24399;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=48 + local.get 6 + f32.const 0x1.58ad76p+1 (;=2.69279;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=52 + local.get 6 + f32.const 0x1.921fb6p+1 (;=3.14159;) + call $audiobeam___cosf + f64.promote_f32 + f64.const 0x1.d70a3d70a3d71p-2 (;=0.46;) + f64.mul + f64.const 0x1.147ae147ae148p-1 (;=0.54;) + f64.add + f32.demote_f64 + f32.store offset=56 + end + local.get 0 + i32.const 15 + local.get 8 + local.get 1 + local.get 3 + local.get 4 + local.get 5 + local.get 6 + call $audiobeam_process_signal + local.set 7 + block ;; label = @1 + local.get 1 + i32.eqz + br_if 0 (;@1;) + i32.const 1 + i32.const 1 + call $__pragma_loopbound + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + local.set 0 + block ;; label = @2 + local.get 5 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + loop ;; label = @3 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 2 + i32.const 0 + i32.store + local.get 2 + i32.const 4 + i32.add + local.set 2 + local.get 4 + i32.const -1 + i32.add + local.tee 4 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 5 + i32.const 2147483644 + i32.and + local.set 3 + local.get 5 + i32.const 3 + i32.and + local.set 9 + local.get 5 + i32.const 4 + i32.lt_u + local.set 10 + loop ;; label = @2 + local.get 1 + local.get 0 + i32.const 2 + i32.shl + local.tee 11 + i32.add + i32.load + local.set 12 + i32.const 0 + local.set 5 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + f32.const 0x0p+0 (;=0;) + local.set 8 + block ;; label = @3 + local.get 10 + br_if 0 (;@3;) + i32.const 0 + local.set 5 + f32.const 0x0p+0 (;=0;) + local.set 8 + local.get 12 + local.set 6 + loop ;; label = @4 + local.get 6 + i32.const 12 + i32.add + f32.load + local.tee 13 + local.get 13 + f32.mul + local.get 6 + i32.const 8 + i32.add + f32.load + local.tee 13 + local.get 13 + f32.mul + local.get 6 + i32.const 4 + i32.add + f32.load + local.tee 13 + local.get 13 + f32.mul + local.get 6 + f32.load + local.tee 13 + local.get 13 + f32.mul + local.get 8 + f32.add + f32.add + f32.add + f32.add + local.set 8 + local.get 6 + i32.const 16 + i32.add + local.set 6 + local.get 3 + local.get 5 + i32.const 4 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@4;) + end + end + block ;; label = @3 + local.get 9 + i32.eqz + br_if 0 (;@3;) + local.get 12 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 6 + local.get 9 + local.set 5 + loop ;; label = @4 + local.get 6 + f32.load + local.tee 13 + local.get 13 + f32.mul + local.get 8 + f32.add + local.set 8 + local.get 6 + i32.const 4 + i32.add + local.set 6 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@4;) + end + end + local.get 2 + local.get 11 + i32.add + local.get 8 + f32.store + local.get 0 + i32.const 1 + i32.add + local.tee 0 + local.get 4 + i32.ne + br_if 0 (;@2;) + end + end + local.get 7) + (func $audiobeam_calc_single_pos (type 5) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + global.get $__stack_pointer + i32.const 64 + i32.sub + local.tee 3 + global.set $__stack_pointer + i32.const 8 + call $audiobeam_malloc + local.tee 4 + i32.const 4 + call $audiobeam_malloc + i32.store + i32.const 1 + i32.const 1 + call $__pragma_loopbound + i32.const 60 + call $audiobeam_malloc + local.set 5 + local.get 4 + i32.load + local.get 5 + i32.store + i32.const 4 + call $audiobeam_malloc + local.tee 6 + i32.const 1536 + call $audiobeam_malloc + i32.store + i32.const 4 + call $audiobeam_malloc + local.set 7 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + i32.const 0 + local.set 5 + loop ;; label = @1 + local.get 3 + local.get 5 + i32.add + local.get 1 + i32.const 8 + i32.add + f32.load + local.get 0 + f32.load offset=8 + f32.sub + local.tee 8 + local.get 8 + f32.mul + local.get 1 + f32.load + local.get 0 + f32.load + f32.sub + local.tee 8 + local.get 8 + f32.mul + local.get 1 + i32.const 4 + i32.add + f32.load + local.get 0 + f32.load offset=4 + f32.sub + local.tee 8 + local.get 8 + f32.mul + f32.add + f32.add + call $audiobeam___ieee754_sqrtf + f32.store + local.get 1 + i32.const 12 + i32.add + local.set 1 + local.get 5 + i32.const 4 + i32.add + local.tee 5 + i32.const 60 + i32.ne + br_if 0 (;@1;) + end + local.get 4 + i32.load + i32.load + local.set 1 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 1 + local.get 3 + f32.load + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store + local.get 1 + local.get 3 + f32.load offset=4 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=4 + local.get 1 + local.get 3 + f32.load offset=8 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=8 + local.get 1 + local.get 3 + f32.load offset=12 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=12 + local.get 1 + local.get 3 + f32.load offset=16 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=16 + local.get 1 + local.get 3 + f32.load offset=20 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=20 + local.get 1 + local.get 3 + f32.load offset=24 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=24 + local.get 1 + local.get 3 + f32.load offset=28 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=28 + local.get 1 + local.get 3 + f32.load offset=32 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=32 + local.get 1 + local.get 3 + f32.load offset=36 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=36 + local.get 1 + local.get 3 + f32.load offset=40 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=40 + local.get 1 + local.get 3 + f32.load offset=44 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=44 + local.get 1 + local.get 3 + f32.load offset=48 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=48 + local.get 1 + local.get 3 + f32.load offset=52 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=52 + local.get 1 + local.get 3 + f32.load offset=56 + f32.const 0x1.56p+8 (;=342;) + f32.div + f32.const 0x1.f4p+13 (;=16000;) + f32.mul + f32.store offset=56 + local.get 4 + i32.load + i32.load + local.tee 1 + f32.load + local.set 8 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 1 + f32.load offset=56 + local.tee 9 + local.get 1 + f32.load offset=52 + local.tee 10 + local.get 1 + f32.load offset=48 + local.tee 11 + local.get 1 + f32.load offset=44 + local.tee 12 + local.get 1 + f32.load offset=40 + local.tee 13 + local.get 1 + f32.load offset=36 + local.tee 14 + local.get 1 + f32.load offset=32 + local.tee 15 + local.get 1 + f32.load offset=28 + local.tee 16 + local.get 1 + f32.load offset=24 + local.tee 17 + local.get 1 + f32.load offset=20 + local.tee 18 + local.get 1 + f32.load offset=16 + local.tee 19 + local.get 1 + f32.load offset=12 + local.tee 20 + local.get 1 + f32.load offset=8 + local.tee 21 + local.get 1 + f32.load offset=4 + local.tee 22 + local.get 1 + f32.load + local.tee 23 + local.get 8 + local.get 23 + local.get 8 + f32.lt + select + local.tee 8 + local.get 22 + local.get 8 + f32.lt + select + local.tee 8 + local.get 21 + local.get 8 + f32.lt + select + local.tee 8 + local.get 20 + local.get 8 + f32.lt + select + local.tee 8 + local.get 19 + local.get 8 + f32.lt + select + local.tee 8 + local.get 18 + local.get 8 + f32.lt + select + local.tee 8 + local.get 17 + local.get 8 + f32.lt + select + local.tee 8 + local.get 16 + local.get 8 + f32.lt + select + local.tee 8 + local.get 15 + local.get 8 + f32.lt + select + local.tee 8 + local.get 14 + local.get 8 + f32.lt + select + local.tee 8 + local.get 13 + local.get 8 + f32.lt + select + local.tee 8 + local.get 12 + local.get 8 + f32.lt + select + local.tee 8 + local.get 11 + local.get 8 + f32.lt + select + local.tee 8 + local.get 10 + local.get 8 + f32.lt + select + local.tee 8 + local.get 9 + local.get 8 + f32.lt + select + call $audiobeam___floorf + local.set 8 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 8 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 8 + i32.trunc_f32_s + local.set 0 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 0 + end + local.get 1 + local.get 1 + f32.load + local.get 0 + i32.const -1 + i32.add + f32.convert_i32_s + local.tee 8 + f32.sub + f32.store + local.get 1 + local.get 1 + f32.load offset=4 + local.get 8 + f32.sub + f32.store offset=4 + local.get 1 + local.get 1 + f32.load offset=8 + local.get 8 + f32.sub + f32.store offset=8 + local.get 1 + local.get 1 + f32.load offset=12 + local.get 8 + f32.sub + f32.store offset=12 + local.get 1 + local.get 1 + f32.load offset=16 + local.get 8 + f32.sub + f32.store offset=16 + local.get 1 + local.get 1 + f32.load offset=20 + local.get 8 + f32.sub + f32.store offset=20 + local.get 1 + local.get 1 + f32.load offset=24 + local.get 8 + f32.sub + f32.store offset=24 + local.get 1 + local.get 1 + f32.load offset=28 + local.get 8 + f32.sub + f32.store offset=28 + local.get 1 + local.get 1 + f32.load offset=32 + local.get 8 + f32.sub + f32.store offset=32 + local.get 1 + local.get 1 + f32.load offset=36 + local.get 8 + f32.sub + f32.store offset=36 + local.get 1 + local.get 1 + f32.load offset=40 + local.get 8 + f32.sub + f32.store offset=40 + local.get 1 + local.get 1 + f32.load offset=44 + local.get 8 + f32.sub + f32.store offset=44 + local.get 1 + local.get 1 + f32.load offset=48 + local.get 8 + f32.sub + f32.store offset=48 + local.get 1 + local.get 1 + f32.load offset=52 + local.get 8 + f32.sub + f32.store offset=52 + local.get 1 + local.get 1 + f32.load offset=56 + local.get 8 + f32.sub + f32.store offset=56 + local.get 4 + i32.load + i32.load + local.set 1 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 1 + f32.load offset=56 + local.tee 8 + local.get 1 + f32.load offset=52 + local.tee 9 + local.get 1 + f32.load offset=48 + local.tee 10 + local.get 1 + f32.load offset=44 + local.tee 11 + local.get 1 + f32.load offset=40 + local.tee 12 + local.get 1 + f32.load offset=36 + local.tee 13 + local.get 1 + f32.load offset=32 + local.tee 14 + local.get 1 + f32.load offset=28 + local.tee 15 + local.get 1 + f32.load offset=24 + local.tee 16 + local.get 1 + f32.load offset=20 + local.tee 17 + local.get 1 + f32.load offset=16 + local.tee 18 + local.get 1 + f32.load offset=12 + local.tee 19 + local.get 1 + f32.load offset=8 + local.tee 20 + local.get 1 + f32.load offset=4 + local.tee 21 + local.get 1 + f32.load + local.tee 22 + f32.const 0x0p+0 (;=0;) + local.get 22 + f32.const 0x0p+0 (;=0;) + f32.gt + select + local.tee 22 + local.get 21 + local.get 22 + f32.gt + select + local.tee 21 + local.get 20 + local.get 21 + f32.gt + select + local.tee 20 + local.get 19 + local.get 20 + f32.gt + select + local.tee 19 + local.get 18 + local.get 19 + f32.gt + select + local.tee 18 + local.get 17 + local.get 18 + f32.gt + select + local.tee 17 + local.get 16 + local.get 17 + f32.gt + select + local.tee 16 + local.get 15 + local.get 16 + f32.gt + select + local.tee 15 + local.get 14 + local.get 15 + f32.gt + select + local.tee 14 + local.get 13 + local.get 14 + f32.gt + select + local.tee 13 + local.get 12 + local.get 13 + f32.gt + select + local.tee 12 + local.get 11 + local.get 12 + f32.gt + select + local.tee 11 + local.get 10 + local.get 11 + f32.gt + select + local.tee 10 + local.get 9 + local.get 10 + f32.gt + select + local.tee 9 + local.get 8 + local.get 9 + f32.gt + select + call $audiobeam___ceilf + local.tee 8 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 8 + i32.trunc_f32_s + local.set 1 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 1 + end + local.get 4 + local.get 1 + i32.store offset=4 + local.get 4 + local.get 6 + local.get 7 + local.get 1 + i32.const 15 + call $audiobeam_init_data_queue + i32.const 1 + i32.const -1 + local.get 2 + call $audiobeam_calc_beamforming_result + drop + block ;; label = @1 + block ;; label = @2 + local.get 6 + i32.load + f32.load + f32.const 0x1.f4p+9 (;=1000;) + f32.mul + i32.const 0 + i32.load offset=24404 + f32.convert_i32_s + f32.add + local.tee 8 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@2;) + local.get 8 + i32.trunc_f32_s + local.set 1 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 1 + end + i32.const 0 + local.get 1 + i32.store offset=24404 + local.get 3 + i32.const 64 + i32.add + global.set $__stack_pointer) + (func $audiobeam_main (type 1) + i32.const 24372 + i32.const 24192 + i32.const 1 + call $audiobeam_calc_single_pos) + (func $__original_main (type 6) (result i32) + call $audiobeam_init + call $audiobeam_main + i32.const 0 + i32.load offset=24404 + i32.const -1 + i32.ne) + (func $audiobeam___ieee754_rem_pio2f (type 7) (param f32 i32) (result i32) + (local f32 i32 i32 i32 f32 f32 f32) + block ;; label = @1 + local.get 0 + f32.abs + local.tee 2 + i32.reinterpret_f32 + local.tee 3 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@1;) + local.get 1 + i32.const 0 + i32.store offset=4 + local.get 1 + local.get 0 + f32.store + i32.const 0 + return + end + local.get 0 + i32.reinterpret_f32 + local.set 4 + block ;; label = @1 + local.get 3 + i32.const 1075235811 + i32.gt_u + br_if 0 (;@1;) + local.get 3 + i32.const 2147483632 + i32.and + local.set 3 + block ;; label = @2 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + f32.const -0x1.921fp+0 (;=-1.57079;) + f32.add + local.set 0 + block ;; label = @3 + local.get 3 + i32.const 1070141392 + i32.eq + br_if 0 (;@3;) + local.get 1 + local.get 0 + f32.const -0x1.6a8886p-17 (;=-1.08043e-05;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const -0x1.6a8886p-17 (;=-1.08043e-05;) + f32.add + f32.store offset=4 + i32.const 1 + return + end + local.get 1 + local.get 0 + f32.const -0x1.6a88p-17 (;=-1.08043e-05;) + f32.add + local.tee 0 + f32.const -0x1.0b461p-34 (;=-6.0771e-11;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const -0x1.0b461p-34 (;=-6.0771e-11;) + f32.add + f32.store offset=4 + i32.const 1 + return + end + local.get 0 + f32.const 0x1.921fp+0 (;=1.57079;) + f32.add + local.set 0 + block ;; label = @2 + local.get 3 + i32.const 1070141392 + i32.eq + br_if 0 (;@2;) + local.get 1 + local.get 0 + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.add + f32.store offset=4 + i32.const -1 + return + end + local.get 1 + local.get 0 + f32.const 0x1.6a88p-17 (;=1.08043e-05;) + f32.add + local.tee 0 + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.add + f32.store offset=4 + i32.const -1 + return + end + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.const 1128861568 + i32.gt_u + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + local.get 2 + f32.const 0x1.45f308p-1 (;=0.63662;) + f32.mul + f32.const 0x1p-1 (;=0.5;) + f32.add + local.tee 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 5 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 5 + end + local.get 5 + f32.convert_i32_s + local.tee 6 + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.mul + local.set 7 + local.get 2 + local.get 6 + f32.const -0x1.921fp+0 (;=-1.57079;) + f32.mul + f32.add + local.set 0 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 5 + i32.const 31 + i32.gt_s + br_if 0 (;@5;) + local.get 3 + i32.const 2147483392 + i32.and + local.get 5 + i32.const 2 + i32.shl + i32.const 1020 + i32.add + i32.load + i32.ne + br_if 1 (;@4;) + end + local.get 1 + local.get 0 + local.get 7 + f32.sub + local.tee 2 + f32.store + local.get 3 + i32.const 23 + i32.shr_u + local.tee 3 + local.get 2 + i32.reinterpret_f32 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + i32.sub + i32.const 9 + i32.lt_s + br_if 1 (;@3;) + local.get 1 + local.get 0 + local.get 6 + f32.const 0x1.6a88p-17 (;=1.08043e-05;) + f32.mul + local.tee 2 + f32.sub + local.tee 8 + local.get 6 + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.mul + local.get 0 + local.get 8 + f32.sub + local.get 2 + f32.sub + f32.sub + local.tee 7 + f32.sub + local.tee 2 + f32.store + block ;; label = @5 + local.get 3 + local.get 2 + i32.reinterpret_f32 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + i32.sub + i32.const 26 + i32.ge_s + br_if 0 (;@5;) + local.get 8 + local.set 0 + br 2 (;@3;) + end + local.get 6 + f32.const 0x1.1a6264p-54 (;=6.12323e-17;) + f32.mul + local.get 8 + local.get 8 + local.get 6 + f32.const 0x1.0b46p-34 (;=6.07709e-11;) + f32.mul + local.tee 2 + f32.sub + local.tee 0 + f32.sub + local.get 2 + f32.sub + f32.sub + local.set 7 + end + local.get 1 + local.get 0 + local.get 7 + f32.sub + local.tee 2 + f32.store + end + local.get 1 + local.get 0 + local.get 2 + f32.sub + local.get 7 + f32.sub + local.tee 0 + f32.store offset=4 + local.get 4 + i32.const -1 + i32.gt_s + br_if 1 (;@1;) + local.get 1 + local.get 0 + f32.neg + f32.store offset=4 + local.get 1 + local.get 2 + f32.neg + f32.store + i32.const 0 + local.get 5 + i32.sub + return + end + i32.const 0 + local.set 5 + local.get 3 + i32.const 2139095040 + i32.lt_u + br_if 0 (;@1;) + local.get 1 + local.get 0 + local.get 0 + f32.sub + local.tee 0 + f32.store + local.get 1 + local.get 0 + f32.store offset=4 + end + local.get 5) + (func $audiobeam___cosf (type 8) (param f32) (result f32) + (local i32 i32 i32 i32 f32 f32 f32 f32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@2;) + local.get 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 4 + end + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + local.get 4 + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.set 0 + br 2 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 6 + block ;; label = @3 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 6 + f32.mul + local.get 0 + f32.const -0x0p+0 (;=-0;) + f32.mul + f32.add + f32.sub + f32.sub + local.set 0 + br 2 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 7 + f32.sub + local.get 5 + local.get 6 + f32.mul + local.get 0 + f32.const -0x0p+0 (;=-0;) + f32.mul + f32.add + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 7 + f32.sub + f32.sub + f32.add + local.set 0 + br 1 (;@1;) + end + block ;; label = @2 + local.get 2 + i32.const 2139095040 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + local.get 0 + f32.sub + local.set 0 + br 1 (;@1;) + end + local.get 1 + i64.const 0 + i64.store offset=8 align=4 + local.get 0 + local.get 1 + i32.const 8 + i32.add + call $audiobeam___ieee754_rem_pio2f + local.set 2 + local.get 1 + f32.load offset=8 + local.set 0 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.const 3 + i32.and + br_table 0 (;@5;) 1 (;@4;) 2 (;@3;) 3 (;@2;) 0 (;@5;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @5 + block ;; label = @6 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@6;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@5;) + end + i32.const -2147483648 + local.set 4 + end + local.get 1 + f32.load offset=12 + local.set 6 + block ;; label = @5 + local.get 3 + br_if 0 (;@5;) + local.get 4 + br_if 0 (;@5;) + f32.const 0x1p+0 (;=1;) + local.set 0 + br 4 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 7 + block ;; label = @5 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@5;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + f32.sub + f32.sub + local.set 0 + br 4 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 0 + br 3 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @4 + block ;; label = @5 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@5;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@4;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @4 + block ;; label = @5 + local.get 2 + br_if 0 (;@5;) + local.get 3 + i32.eqz + br_if 1 (;@4;) + end + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 5 + f32.neg + f32.mul + local.tee 6 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 5 + local.get 1 + f32.load offset=12 + local.tee 7 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 6 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 7 + f32.sub + f32.add + f32.sub + local.set 0 + end + local.get 0 + f32.neg + local.set 0 + br 2 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 4 + end + local.get 1 + f32.load offset=12 + local.set 6 + block ;; label = @3 + block ;; label = @4 + local.get 3 + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.set 5 + local.get 4 + i32.eqz + br_if 1 (;@3;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 7 + block ;; label = @4 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + f32.sub + f32.sub + f32.neg + local.set 0 + br 3 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 5 + end + local.get 5 + f32.neg + local.set 0 + br 1 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @2 + block ;; label = @3 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@2;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @2 + local.get 2 + br_if 0 (;@2;) + local.get 3 + i32.eqz + br_if 1 (;@1;) + end + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 5 + f32.neg + f32.mul + local.tee 6 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 5 + local.get 1 + f32.load offset=12 + local.tee 7 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 6 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 7 + f32.sub + f32.add + f32.sub + local.set 0 + end + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (func $audiobeam___floorf (type 8) (param f32) (result f32) + (local i32 i32 i32) + local.get 0 + i32.reinterpret_f32 + local.tee 1 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + local.tee 2 + i32.const -127 + i32.add + local.set 3 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.const 149 + i32.gt_u + br_if 0 (;@4;) + block ;; label = @5 + local.get 2 + i32.const 126 + i32.gt_u + br_if 0 (;@5;) + block ;; label = @6 + local.get 0 + f32.const 0x1.93e594p+99 (;=1e+30;) + f32.add + f32.const 0x0p+0 (;=0;) + f32.gt + br_if 0 (;@6;) + local.get 1 + local.set 2 + br 4 (;@2;) + end + i32.const 0 + local.set 2 + local.get 1 + i32.const -1 + i32.gt_s + br_if 3 (;@2;) + local.get 1 + i32.const -1082130432 + local.get 0 + f32.const 0x0p+0 (;=0;) + f32.eq + select + local.set 2 + br 3 (;@2;) + end + local.get 1 + local.get 3 + i32.shl + i32.const 8388607 + i32.and + i32.eqz + br_if 3 (;@1;) + local.get 0 + f32.const 0x1.93e594p+99 (;=1e+30;) + f32.add + f32.const 0x0p+0 (;=0;) + f32.gt + br_if 1 (;@3;) + local.get 1 + local.set 2 + br 2 (;@2;) + end + local.get 0 + local.get 0 + f32.add + local.get 0 + local.get 3 + i32.const 128 + i32.eq + select + return + end + local.get 1 + i32.const 31 + i32.shr_s + i32.const 8388608 + local.get 3 + i32.shr_u + i32.and + local.get 1 + i32.add + i32.const -8388608 + local.get 3 + i32.shr_s + i32.and + local.set 2 + end + local.get 2 + f32.reinterpret_i32 + local.set 0 + end + local.get 0) + (func $audiobeam___ceilf (type 8) (param f32) (result f32) + (local i32 i32 i32) + local.get 0 + i32.reinterpret_f32 + local.tee 1 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + local.tee 2 + i32.const -127 + i32.add + local.set 3 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.const 149 + i32.gt_u + br_if 0 (;@4;) + block ;; label = @5 + local.get 2 + i32.const 126 + i32.gt_u + br_if 0 (;@5;) + local.get 0 + f32.const 0x1.93e594p+99 (;=1e+30;) + f32.add + f32.const 0x0p+0 (;=0;) + f32.gt + i32.eqz + br_if 3 (;@2;) + local.get 1 + i32.const 0 + i32.ge_s + br_if 2 (;@3;) + i32.const -2147483648 + local.set 1 + br 3 (;@2;) + end + local.get 1 + local.get 3 + i32.shl + i32.const 8388607 + i32.and + i32.eqz + br_if 3 (;@1;) + local.get 0 + f32.const 0x1.93e594p+99 (;=1e+30;) + f32.add + f32.const 0x0p+0 (;=0;) + f32.gt + i32.eqz + br_if 2 (;@2;) + i32.const 8388608 + local.get 3 + i32.shr_u + i32.const 0 + local.get 1 + i32.const 0 + i32.gt_s + select + local.get 1 + i32.add + i32.const -8388608 + local.get 3 + i32.shr_s + i32.and + local.set 1 + br 2 (;@2;) + end + local.get 0 + local.get 0 + f32.add + local.get 0 + local.get 3 + i32.const 128 + i32.eq + select + return + end + i32.const 1065353216 + i32.const 0 + local.get 1 + select + local.set 1 + end + local.get 1 + f32.reinterpret_i32 + local.set 0 + end + local.get 0) + (func $audiobeam___ieee754_sqrtf (type 8) (param f32) (result f32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 0 + i32.reinterpret_f32 + local.tee 1 + i32.const 2139095040 + i32.and + i32.const 2139095040 + i32.ne + br_if 0 (;@1;) + local.get 0 + local.get 0 + f32.mul + local.get 0 + f32.add + return + end + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 0 + i32.gt_s + br_if 0 (;@4;) + local.get 0 + f32.const 0x0p+0 (;=0;) + f32.eq + br_if 3 (;@1;) + local.get 1 + i32.const -1 + i32.gt_s + br_if 1 (;@3;) + local.get 0 + local.get 0 + f32.sub + local.tee 0 + local.get 0 + f32.div + return + end + local.get 1 + i32.const 8388607 + i32.le_u + br_if 0 (;@3;) + local.get 1 + i32.const 23 + i32.shr_u + local.set 2 + br 1 (;@2;) + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 9 + local.get 1 + i32.clz + local.tee 3 + i32.sub + local.set 2 + local.get 1 + i32.const 23 + local.get 3 + i32.const 31 + i32.xor + i32.sub + i32.shl + local.set 1 + end + i32.const 25 + i32.const 25 + call $__pragma_loopbound + local.get 2 + i32.const -127 + i32.add + local.tee 2 + i32.const 22 + i32.shl + i32.const -8388608 + i32.and + i32.const 0 + i32.const 33554432 + i32.const 50331648 + local.get 1 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + local.get 2 + i32.const 1 + i32.and + i32.shl + local.tee 3 + i32.const 18874368 + i32.lt_u + local.tee 1 + select + local.tee 2 + local.get 2 + i32.const 8388608 + i32.or + local.get 2 + i32.const 4194304 + i32.or + local.tee 2 + local.get 3 + i32.const 2 + i32.shl + i32.const 0 + i32.const -41943040 + local.get 1 + select + i32.add + i32.const 1 + i32.shl + i32.const -67108864 + i32.add + local.tee 3 + i32.gt_s + local.tee 4 + select + local.tee 5 + local.get 5 + i32.const 4194304 + i32.or + local.get 5 + i32.const 2097152 + i32.or + local.tee 5 + local.get 3 + i32.const 0 + local.get 2 + local.get 4 + select + i32.sub + i32.const 1 + i32.shl + local.tee 4 + i32.gt_s + local.tee 6 + select + local.tee 7 + local.get 7 + i32.const 2097152 + i32.or + local.get 7 + i32.const 1048576 + i32.or + local.tee 7 + local.get 4 + i32.const 0 + local.get 5 + local.get 6 + select + i32.sub + i32.const 1 + i32.shl + local.tee 6 + i32.gt_s + local.tee 8 + select + local.tee 9 + local.get 9 + i32.const 1048576 + i32.add + local.get 9 + i32.const 524288 + i32.add + local.tee 9 + local.get 6 + i32.const 0 + local.get 7 + local.get 8 + select + i32.sub + i32.const 1 + i32.shl + local.tee 8 + i32.gt_s + local.tee 10 + select + local.tee 11 + local.get 11 + i32.const 524288 + i32.add + local.get 11 + i32.const 262144 + i32.add + local.tee 11 + local.get 8 + i32.const 0 + local.get 9 + local.get 10 + select + i32.sub + i32.const 1 + i32.shl + local.tee 10 + i32.gt_s + local.tee 12 + select + local.tee 13 + local.get 13 + i32.const 262144 + i32.add + local.get 13 + i32.const 131072 + i32.add + local.tee 13 + local.get 10 + i32.const 0 + local.get 11 + local.get 12 + select + i32.sub + i32.const 1 + i32.shl + local.tee 12 + i32.gt_s + local.tee 14 + select + local.tee 15 + local.get 15 + i32.const 131072 + i32.add + local.get 15 + i32.const 65536 + i32.add + local.tee 15 + local.get 12 + i32.const 0 + local.get 13 + local.get 14 + select + i32.sub + i32.const 1 + i32.shl + local.tee 14 + i32.gt_s + local.tee 16 + select + local.tee 17 + local.get 17 + i32.const 65536 + i32.add + local.get 17 + i32.const 32768 + i32.add + local.tee 17 + local.get 14 + i32.const 0 + local.get 15 + local.get 16 + select + i32.sub + i32.const 1 + i32.shl + local.tee 16 + i32.gt_s + local.tee 18 + select + local.tee 19 + local.get 19 + i32.const 32768 + i32.add + local.get 19 + i32.const 16384 + i32.add + local.tee 19 + local.get 16 + i32.const 0 + local.get 17 + local.get 18 + select + i32.sub + i32.const 1 + i32.shl + local.tee 18 + i32.gt_s + local.tee 20 + select + local.tee 21 + local.get 21 + i32.const 16384 + i32.add + local.get 21 + i32.const 8192 + i32.add + local.tee 21 + local.get 18 + i32.const 0 + local.get 19 + local.get 20 + select + i32.sub + i32.const 1 + i32.shl + local.tee 20 + i32.gt_s + local.tee 22 + select + local.tee 23 + local.get 23 + i32.const 8192 + i32.add + local.get 23 + i32.const 4096 + i32.add + local.tee 23 + local.get 20 + i32.const 0 + local.get 21 + local.get 22 + select + i32.sub + i32.const 1 + i32.shl + local.tee 22 + i32.gt_s + local.tee 24 + select + local.tee 25 + local.get 25 + i32.const 4096 + i32.add + local.get 25 + i32.const 2048 + i32.add + local.tee 25 + local.get 22 + i32.const 0 + local.get 23 + local.get 24 + select + i32.sub + i32.const 1 + i32.shl + local.tee 24 + i32.gt_s + local.tee 26 + select + local.tee 27 + local.get 27 + i32.const 2048 + i32.add + local.get 27 + i32.const 1024 + i32.add + local.tee 27 + local.get 24 + i32.const 0 + local.get 25 + local.get 26 + select + i32.sub + i32.const 1 + i32.shl + local.tee 26 + i32.gt_s + local.tee 28 + select + local.tee 29 + local.get 29 + i32.const 1024 + i32.add + local.get 29 + i32.const 512 + i32.add + local.tee 29 + local.get 26 + i32.const 0 + local.get 27 + local.get 28 + select + i32.sub + i32.const 1 + i32.shl + local.tee 28 + i32.gt_s + local.tee 30 + select + local.tee 31 + local.get 31 + i32.const 512 + i32.add + local.get 31 + i32.const 256 + i32.add + local.tee 31 + local.get 28 + i32.const 0 + local.get 29 + local.get 30 + select + i32.sub + i32.const 1 + i32.shl + local.tee 30 + i32.gt_s + local.tee 32 + select + local.tee 33 + local.get 33 + i32.const 256 + i32.add + local.get 33 + i32.const 128 + i32.add + local.tee 33 + local.get 30 + i32.const 0 + local.get 31 + local.get 32 + select + i32.sub + i32.const 1 + i32.shl + local.tee 32 + i32.gt_s + local.tee 34 + select + local.tee 35 + local.get 35 + i32.const 128 + i32.add + local.get 35 + i32.const 64 + i32.add + local.tee 35 + local.get 32 + i32.const 0 + local.get 33 + local.get 34 + select + i32.sub + i32.const 1 + i32.shl + local.tee 34 + i32.gt_s + local.tee 36 + select + local.tee 37 + local.get 37 + i32.const 64 + i32.add + local.get 37 + i32.const 32 + i32.add + local.tee 37 + local.get 34 + i32.const 0 + local.get 35 + local.get 36 + select + i32.sub + i32.const 1 + i32.shl + local.tee 36 + i32.gt_s + local.tee 38 + select + local.tee 39 + local.get 39 + i32.const 32 + i32.add + local.get 39 + i32.const 16 + i32.add + local.tee 39 + local.get 36 + i32.const 0 + local.get 37 + local.get 38 + select + i32.sub + i32.const 1 + i32.shl + local.tee 38 + i32.gt_s + local.tee 40 + select + local.tee 41 + local.get 41 + i32.const 16 + i32.add + local.get 41 + i32.const 8 + i32.add + local.tee 41 + local.get 38 + i32.const 0 + local.get 39 + local.get 40 + select + i32.sub + i32.const 1 + i32.shl + local.tee 40 + i32.gt_s + local.tee 42 + select + local.tee 43 + local.get 43 + i32.const 8 + i32.add + local.get 43 + i32.const 4 + i32.add + local.tee 43 + local.get 40 + i32.const 0 + local.get 41 + local.get 42 + select + i32.sub + i32.const 1 + i32.shl + local.tee 42 + i32.gt_s + local.tee 44 + select + local.tee 45 + i32.const 2 + i32.add + local.tee 46 + local.get 42 + i32.const 0 + local.get 43 + local.get 44 + select + i32.sub + i32.const 1 + i32.shl + local.tee 44 + i32.le_s + i32.const 1 + i32.shl + local.get 43 + local.get 42 + i32.le_s + i32.const 2 + i32.shl + local.get 41 + local.get 40 + i32.le_s + i32.const 3 + i32.shl + local.get 39 + local.get 38 + i32.le_s + i32.const 4 + i32.shl + local.get 37 + local.get 36 + i32.le_s + i32.const 5 + i32.shl + local.get 35 + local.get 34 + i32.le_s + i32.const 6 + i32.shl + local.get 33 + local.get 32 + i32.le_s + i32.const 7 + i32.shl + local.get 31 + local.get 30 + i32.le_s + i32.const 8 + i32.shl + local.get 29 + local.get 28 + i32.le_s + i32.const 9 + i32.shl + local.get 27 + local.get 26 + i32.le_s + i32.const 10 + i32.shl + local.get 25 + local.get 24 + i32.le_s + i32.const 11 + i32.shl + local.get 23 + local.get 22 + i32.le_s + i32.const 12 + i32.shl + local.get 21 + local.get 20 + i32.le_s + i32.const 13 + i32.shl + local.get 19 + local.get 18 + i32.le_s + i32.const 14 + i32.shl + local.get 17 + local.get 16 + i32.le_s + i32.const 15 + i32.shl + local.get 15 + local.get 14 + i32.le_s + i32.const 16 + i32.shl + local.get 13 + local.get 12 + i32.le_s + i32.const 17 + i32.shl + local.get 11 + local.get 10 + i32.le_s + i32.const 18 + i32.shl + local.get 9 + local.get 8 + i32.le_s + i32.const 19 + i32.shl + local.get 7 + local.get 6 + i32.le_s + i32.const 20 + i32.shl + local.get 5 + local.get 4 + i32.le_s + i32.const 21 + i32.shl + local.get 2 + local.get 3 + i32.le_s + i32.const 22 + i32.shl + i32.const 16777216 + i32.const 25165824 + local.get 1 + select + i32.or + i32.or + i32.or + i32.or + i32.or + i32.or + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.get 45 + local.get 45 + i32.const 4 + i32.add + local.get 46 + local.get 44 + i32.gt_s + local.tee 1 + select + local.tee 2 + local.get 44 + i32.const 0 + local.get 46 + local.get 1 + select + i32.sub + i32.const 1 + i32.shl + local.tee 1 + i32.lt_s + local.tee 3 + i32.add + local.tee 5 + i32.const 1 + i32.and + local.get 2 + i32.const -1 + local.get 3 + select + local.get 1 + i32.const -1 + i32.add + i32.eq + select + local.get 5 + i32.add + i32.const 1 + i32.shr_u + i32.add + i32.const 1056964608 + i32.add + f32.reinterpret_i32 + local.set 0 + end + local.get 0) + (func $audiobeam_malloc (type 9) (param i32) (result i32) + i32.const 0 + local.get 0 + i32.const -4 + i32.and + i32.const 0 + i32.load offset=34416 + local.tee 0 + i32.add + i32.const 4 + i32.add + i32.store offset=34416 + local.get 0 + i32.const 24416 + i32.add) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 38528)) + (global (;1;) i32 (i32.const 34420)) + (global (;2;) i32 (i32.const 38528)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $audiobeam_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\00\0f\c9?\00\0fI@\00\cb\96@\00\0f\c9@\00S\fb@\00\cb\16A\00\ed/A\00\0fIA\001bA\00S{A\00:\8aA\00\cb\96A\00\5c\a3A\00\ed\afA\00~\bcA\00\0f\c9A\00\a0\d5A\001\e2A\00\c2\eeA\00S\fbA\00\f2\03B\00:\0aB\00\83\10B\00\cb\16B\00\14\1dB\00\5c#B\00\a5)B\00\ed/B\0066B\00~\dd\bc\7f\04[\bc\9a\81\8c\bd}\1b\e3\bd\03\97\95=\8fCU\bd\c0\80\a7\bb\15\98\1a\bdE\e3B\bc\9e\cbj\bdA\93\b3\bb\8b\be\09\bc\d1\11\80\ba\d3\06?=\b3\ae6\ba\aa\93\e3\bc\f1\e4s=2\aa\b7\bb@.\11\bd\1buR<@\90\d4\bd\dd\d9\af\bd89\9d<\02\9e.\bb\1b\5c\b2;\d5\e9\16\bct\7f\a2=\eeXA=aQ\c6=\e0\22\d8\bd\fe\13_\ba\0d\8ds=\95\ae7=\10i\ec\bclB6=\89p#\bd\cf\8fc=%\90A\bc\d6xo\bdf10\bcX\d9j=\ea\c3\d9<\173\b5<\bf\0fm\bc\e5\a6\03==\03\d3\bd\a5'\f7\ba\09O\1c=\e8\ec\17\bd-\fa\a7\bb-P.=\94yo\bd!\d3,=\af\f5t\bc\d6\bb\8e<\8cp\e1\bd\9bE\8c\bd\ad\f4\0e<\d5\7f$\bc\b9b\c4\bc\dc\fb\fd:\b2\92J\bc\95N\07\bdN\ed~=\f0\1cD\bd\cf9\a1\bc\e5\e2\03\bd\cdo\85\bb4<\93\bc\df\dc\19<\0f\9c\ba\bd\a5\9a\13=\d0\d6\18\bcd\b9 \bd\d9\96\0f\be\89a\e3=\f0\d2\ba\bd\df\12%\bd\bcF\93=\7fmv<;7\a7=y\d2#=\a7Y[\bc%\ce\a0<\bf\08j;\80\f26<~g$\bd\94\9e\14=\c1\97)=o\a8p\bd8\ef\ff\bb\c0*[\bdi\14U<3\90\8a\bcm\a2\ae=\8f\c1#=\03g;=2A\ff\bcg\94I=$${=\b5\b51=\15\ed5\bcu\f6\f0\bc\91\9aT\bc\15\84\80=5\fa\d5<\be\a7\c9\bc\ce=\15\bd\00\c8\91=\d2d\ba<>M\f7<.\08\fe\bc\edW\af\bd)U?\bd\0a\f9$:<\e5B4\bdOT\c3\bc\cc\d4\88\bc\ce\a3\18=\dc}\00\bc\bd%\90=xf\c6\bc\15\ec\11\bd\05\8b\93<\c1\0fD<\da\0f';5\cfL;\c2\9c\d5\bc0j3\bdo\b0S\bc\f4\84\07=\c0\d5\7f\bbU\96\e7\bc\86(*=l\d7\a9\bd1\12h=\ec\dd\0c=\fd\a8d\bd?J\8d=\cdb\a4:\c3,\9f\bd\16\d4\97\bb'\06\02=\f7Wc\bd2\17\0d\bd\86\12\1a\bc\9e\f9\e3\bc\b2\fa\de=&m_%\c9\94=\b6F\14\bd\bc\c0*\bd\d1\0e8\be\86\0a\cc\bd\d6D\b5\bdaL\03\bd\de\8f\8b<\be\09\94<;\0d8=\fb\fe1\bc\9f\92\22<2\b3\87\bc\94E\0e\bd\c0T\12=\7f\95\f8<\c2)\17\bd\1aJp\c6\15\c9\bb\86\f5\92\bd\17\c1\93\bc)P7=F\09\0a\ab\15\bd\db\c2d\bc\b5il\bcF\bc]=<\a6\0e\bdQ\83\c4\bd)\94(\bb\ed\e9\ce<\09W\93\bc\88\dc\04\bd\afN\98=\01\12\a1=\9e\99.<\8e\16\0a<\ae\fb\ce<\bf\a70\04)=\0c\ba\93\bd+Y]\bd\00\ba;=h\c9\ee<\94O\cc\bd\f7\22\c7\bc\f8zs\bd\f71#=\16\d9D\bd\f6\bc\83\bc\06(X=J\bb\9csqy=\c9[\8e;\a4\08\d5\bd\a1\920=\9fs^\d6C\bb\b1\0fw\bd\f8w\fd\bc\80/\1d\bd\d6a\da\bdY-5\bc\b7\1dg\bd[f\fc\bb\f3B(\bd\a7/\b1\bc\1a\f8\dc\bc\f4\ea;\bdL\a6~<@ I\bd\a0\ed,\bcr\aeP\bdJ\85\02\bd\a3V\b8=\df\99;=kT\81<\bf3}=\db\bc#=b\0c\a4\bd\0e\df\15=\bc\05$\bd\8fr\b1\bb\91\02\de\bcSu\07;\ddS,=\1b\d3F\bd\cc\d5y\bd\e6\01\94=\ec\f1\97<\df^\04=\5cJ\1a\bd\a2'\bd<\ac\16\0a\bcH\84S<\05Z\99\bbvh\9b\bd.X8\bd\c7\8by=\b8\8ex<\f1?\04\bc\da\b7\02\bd\ef=\f1\ad\b7\bc\e7\87\e0<\d2\df\cd\bdW\91\f8\bc\13K\a4\bdrZX\bdh\16j<\ddm\10\bd?GP\bc\85\b9(\f3\bc\f6\a5\c8\bci\0a3\bb\1e\e8p=\ca\88\81\bd\ae\d3\a9<9\92\1c<\d1\1f\ba\bc\d59\cf<\d3\d8\a2\bc\19>\0c\bd1)\ca\bc\0b\cc\8d=>&\0e\bd\fc\0b!\bdZ\8bl=J!\0c=\9e\bfN\bd\16:\ce<\ee~@\bd\bd\e3\84\ec\af\97;4;\10\bc\bc\17\19\bdC\0b6=\8f\f2\06\bdD\ff\e2<\d6F>\bd\a9\8d\b1\bb0R\9c<\a5u\91:A\f7\91\bd\c2h\ed:\bcG0;\a2b\fb\bc\e8p\a2\bc\0d\de\fc<\b2\87\80\bd\0e(\bb\bc\b4\1bx=\fb?\19=\e5&\14=\fd\a1\19\bbM\b1\d4#\b2#=Z6\00\bc\12`?=\1f\e0\be=\d0j\c8<\c2v[:\c2\dcy<\18\f6\fd\bd\b6\9d\ea\bc\04\92\82\bc\f9V\d2\bc\a4]T\bd\d25\e7:C\a2\a1;_\e5\81\bc\9b[o\ba\90\d8~\bc\a3\82\d4<\fc\c6\f3\bcI\e5\f9=I\d5\a5=\d4w\8c<\f5rq<\dc\acw=\07\0c`=~\fa\d3\99g\ac=\0f\1a\82\bd%\7f\88;E\ce\cf;\b7\11V\bc\af\1dl\bd\e2=\9b<\92e\16=\10\f4\f6=\eaJ\f3<\e4{\82=|\a4\a1\bd8+\e3\bd[\dc\99=1\b4\16=2\d8\93<|\1f\86\169\ab\ba}\00\ef<\9a\070<\b6\e9\0b<\a2O\fa<\1a\96\a2<\0f\e3\08\bb\8dEB:~E\8d\bd\9ej\8e\bd\cd;\93\bd\f7\f2\d8<<.\d9\bd\b7\e0t<\db\18\ab\bc\99(\a7=\bc\be\12;\a0\920\bd\bc4\e8\bc\b9R\b2<\a2\05*\bd\c4)N=\93\81I\bbh+\05<\ac\14\ea\bc\af\d5\19\bd\b1\e4<=Q\b9\9a\bd\f8\04.=\b5\a6P\bc5\88G\bd\c0\97\0b=\0d\19\1c=\09\b4\a3\bd\b8\af\a6;._\17\bd\8c\fc\d6\bbv-|=e\ce\22=\ed\eb\e7\bb\9fz$\bc\1d\d1\d9=\c0%\04\bd=\c0\87=\8a\a3\7f\bcwe\ca=\91\a5\eb<\06\c1L=\b7\0e\e6%\b7\fa<\d8\e9\bb\bc\7f\c0\d8\bb*r\03\a21\bb\ec8\ab=\b16Y=t\93\84<9,A=\7f\e4}<\f8\86\d5\bc\b9\a0]=\0b\9c\e3=\e0-1\bd\e6n\89\e9\b5\90\bd\96\ca\ca\bd\f5\0a\07\bd\7f\83\ff<\89 \d8;\b0)\8b\bc34$=\c0^\de\bdw\8b:<\c5\c5\8c=x\80\16<\83f\ba\bc)n\86=%\c36=_\0c\0c\ba\c2\04\05=ENe\bd\e6\b1\c2\bb\f3\1d\d6\bc\07\b3B=R\d63\bd\19\15A=m\02O\bd\c2\0f\ac\bb-/\0a\bc\9eq\8d<\5c\13\87\bd\c1S\e8\bd\e3O\d3\bcg\de[=\f2\08,\bcG\d9h=\94\cc\f8\bc\b5\e2q\ba\d7\f6?\bc\fa\87\89\bd\11\b8J\bd\f1k\de\bcg\d7\a0;\82\bb\07\bd\be\bfi\bd\e0\aaj\bbI\bf\9b\bc\ddm\c0\bc0x\87\bd\b4\a2\a1\bc\01\00l\bdQ[\91\bc\e5\81\80=)\df\fb<\1d\be\ad\bc\d0\b6/<\0d*\c3\bd\c5 \09\bc\b1\fb\ec<0\d1\9e=Q\ed\e8\bcP\bf\1f=\d1R\98<#\be\96=\f4,&\bd\f0\97%=\f3\a7U=\9e\c9\8e=\dfj\b6:\bf\e5+\bd\caDE<\a4\14\ba\bd\0b\d6\fa<\e0|\a3=\9e\c0\c3\bd\93a\93;\22KY=\a6\e4 \bd\a4\09\0f;\c5\d7\db<\b32/\bc\f7\ecL<8N\b3=k\bb,\bdY\98\97=0\dbM\bd\85\11\8b;fu\e9<\eb\c1&=(S_=\fc\a5{\bc\9ea\17\bd|~ =%\e2\b9=\e2\bej\bd@m\8c=\82\de\f8<(X\8c\bc\95*L\bdA\a7\87==I\10\bd\92>)=+\a2*\bc\ec\ba\95\bdv\be\db\bb\15\84\14\bb>\10^=\c9_h\bd\f9/\a4=\df\b6\8c=H,S=\05\a6\bc\bc\8aF\1c;tQ1=\1d!\a4\bb\9a\13\0c\bc\c5\d5\bb\bcV\b1t\bc\e5]\9e\bc\f6\e0\02=\e6\15\bb<7\b9\d7\bb\8c\9e\bf=\dc\0c[\bdV\d1\9c\bbRW\a0=\90\a4\83\bd\f2-W=\10@\0b\bc\f2\83\cf\bc\9c\c0\f4\b8\cb\94\89\bc\93\f6\1a\b8\1a=\a3=\9b\8d\93<\0eq9=\f5N\a0<\ae\928=\b7\95\da\bc\88 \9a\bc\ea\e6\0b\bc\aa\17@\bd\82\d3\a1\bd\08\a6\b0\b7\7f\0cq=z\1f\ce\bc\b5\c3v=S=\a9\bd\fa\10\8e\bdj\cfv\bcB\15\0f\bdX\14\92;\f2\97\c1\bb(\18\b8=H\97\a7=\b5\d8\85<\e0\ec]\bd \8c\ae\bb\93\9f:\bb9\f4\8e<3\5c\c6\bc9\e9\e9;EB\af\bd\19\11\c8\bd\bdJ]=\a5\c6\8c=\d1.\02\bdWx\f0<\9c\fa\89\bc\c22\0c\bd\87\0fI\bd\b4-\11\bc\05\a7-\bd\af\fcv=^\0b#\bd\b9\b6#\bd\1b\c53\bc\14\ad\02\bdZ\97\bc\bc\8cW\c3=\1c0\1c\bd\d8\ea\e4\bc\cbl\a3=\d7\abv\9c\1b\90\bd*\86\c3=\0cnb\bd\ba\b4\b9=\bbW\03\e8X\f4;]\b2\b5CB\bd)Q\93=~\0a\cb<\c3^O\bcE^\8d\bb\9a6\ae\bdS\ce:<]\cb,=R\13\93<\9ck\1c\bcAK\e4\bc\a2\87\f8;H\fc\13=\96\10\04\be\c6\9eu\bc\1aX =#\99\9d\bd\94\ad\bd7\a8\bcvi\8d=\f9\bc\17\bc\dd\815\bb\9d`(\bd\d2\b1\b3<\c6'\0b\bc\1bV\a3=\00\ff\ec<&\ff\80\bc\ef\c9b\bd\a8\b8G=\e3\90\be\bc\8a\e0\02;\1f\c0\8c<\edj\da\bc\9c-A;~\16\15=V\9d/\bcO\de[\bc\81Xj\bc\fa\faS\bd\a27\11\bc\10\f5\87\bdXi\96\bcM\ec'=\d9\c2\b2\bcEN\9f<\cdE\a0=kp\9c:N\c0\01>H\1d\b1;Oh\b7=$hS=K-t\bdSV\d6=s\b1\10=\fd/\99\bd\d4\8c\88\bd\ae\19\e7<\ba\7f\81;\d7\bf-=\fd\9cG=\f3\b5K=\8cy\a8\bd\e9\b8\88\ba\9e>\d6;B\09\de<\0d\ec{\bd\b0\e6\e1\bd/\17\e3\bd\c4\08@=\89jH\bd\f9\06B\bc\caz\04\bdW\10\e6<\8d\1c\d6;\b6\5c\d2;;\acT\bd\ba)t=T\d5G\bb\0c(\a4\bcY\ff\da;,\e0\0f=pYI=\85\0d>\bc}\d0c\ba\f4Z\b1\bd\a9-\7f=\ceY\1a<\94\e8\95=c\f5\f5;a\d9x<;d\0a<\96\9b\85<\11\04\15\bdj}\80\bc\f0\b3\05\b9M\f5!\bd\aa\b3\d5\bc\df\d2P=\bd\b8\1f\bd\96\0e\a0\bd}d\ae\bc.\96\03=H\d2H\bd\7f\10U\bdb\dd\9f;O\a1\b3=fP\19=gf\17=\cf\b2\c3\bad,\88\bd$\fb\e6=\a43\85<\af\16\e9\bd:\b0\f7<\d1/O:9C\1e\bd\d9\bb0=\8f}\b4=\0fVt\bc\8a\04\82;Jj\17=\7f\1b\81=\cd\d9H\bd]\87F\bb\a7i\94=\03\e5[;\ac_>\ee9=\f8\f3\12>\b4\f8\ab\bd\11TY\bd\05\a5\8c\bcH\7fU=0\b8\de\bdOs\ad\bdt\b2\a7<\e5\dfa<\a812\bds\af\b6\bb\fb\84\c6\bd\8c\ffu\bd\ea\c4M\bdx\df\b3>\bd\ad\bd\16\85\a4\bc&\ec\8a\bdu\13\ed\87\f1\0d=\96\e6\98<>{\ab\fb\e98\08b\b9\bc\b9\87\85=\c7<\16\bbx\fe*\bc-\a5s\bd\a2Ym\bbq.\5c\bc\ea\afG<\10VU\bc\9c\c4\0a=\dc\96\bb\bc\e7\db\bc\bcV\f0A=\e6v\e9< \81\df\bawUa\bc\ea\8e\f2\bcPiU\bcM\c0\c9\bbX\90\10=\ee\b8\97\bc\7f+\8f\bd\a9d8<|\8b\98=\d3\cf\1b;\00\98\a1\bcFMA\bc\b1t:\bd\91f\e1<\88\d8\93\bdQV\f5\bc\abo\97\bbk\19O\ba\ad\12M=}\03\0b:\c8\98\9a\bc\a4\de\9c\bcR\b3h<\90s\fc<\a95\ba\bd\e40\a8<\a3\b3\89\bd\84q\10=t\8b1\bd\0c%3=\8e:O\bd\c2=\a0\bc\8d\1b\99=\be\f6}\bc\d4)\04\bd\ebXu\bc\0b\7fP\bb\93\b1\92=\f3\15$\bc]#7\bdaL\b2=\abW\88\bdY\7f\81=\d7\ff \bd5\a2\eb\bc\8e\b2\0d\bd/\fe\8d\bc\c92\e5<\bd\826\bd\eb\22%=\fd\a7 \bc\14\c2\e4\bd\19\cd,;m>\81\bdM\01D\bd\22\dar<\ae\a9d\bd\1d^\ad==\af\18=$ o=w\1e\87:\0f\b4\8f\bc\a9}\a6\bd\ca\17\d9<\1c\aa=<\a8E\e9\bc\9f4\15\bd\83\d1+<\93\d9\12=\a4\f6\8cA\8a\bd\0d\ab\bd:\99\dc\98=\af\e2\22\bd\e4u\12=\d2\eb\e6\bbU\86\80\bb\df\81\95=\ba\07\be<)o(\bb\02\eb\86\bdo\9d4;\82\7f\a04=\bc\05\83=\a8\b4*\bb\f6KE<\d3`\83\0a=\b2\c6\03\bd\e2\e1D=x\e6 \bd\e3a\08<\5c\9f\8e=\08\ec\df<\ca\82\1e\be\1e\88\89<\05\03\01\bd\ef0-\bd\85;\82=7\c0\cd\f9;\0dc\cc\bc\a9\fd\f0<\18\88P\bd0\dd\93=\99T|\bb{\c5\cc\bd\f4\11\cf\bd\84'\df=5\f6\a6=,3\fb\bcqP4=TH\b1=\81\a9\86=\ffo\89\bd\08\d0\d3\bdC\df\97\bc\b5\04\f7\bc\15\d8\dc;\99\1d8\bd\0e\0c\a4\ba\bf\0e\fb<\f4^c=g\93U\bd\85\93\88\bdD\f7w<\fc&]'\f1\a2\bb5U\cb;t}\ee\bd[\5ci\bb\a5.\84=\82\19\d2\ea:\c5$\06=X\d9\81=\0cs_\bdk%Z\bdm\93\08=\00\a8g=r\8d\e7\bc\bev\bf\bc[\5c\93\bd[kL=\9f\97\d6\bcD\14\00\bd\acF\ba\bcI+r\bb\1c\df\bc<4y\1a=\1d\ac\07\bdz\06\83=P)S<5\d7\84\bd\f1\ee=\bd\c0\1aQ\bc\94\8a:\bc\94:Z=\0e\08\86;\5c\e6\22;\d3C\dc<\95\8a\13\bd\f8\d8\8e<\ce\fb\a4<\86\88\efnj\9b\bdC\f2\e4G_\ba\bd\07\84N\a3{=\14\a8\a1\bd\db\bd\ad\bd\fa\80\e0\bc/s\d6\bcI)\0b\bd\f6\dcg\bb<\1bP=\e3\bfw\bd\f0f\eb\bb\da\ac\da<(\daY=\15ch<\b8,\b5\bc}%a\bc0B{=S\fex\bb\16\87\18=n\f2\db\bdk_n\bc\cek%=\d9\eeM<\d9.\11=\15q\1d\bdPTn\bc\98{\be<\a5\99p=\c2\a19\bdK\f6D=}@\97\bb5\caa\bd:\ca\0a\bd?A\85\bc\80S\84\bc\e6|<\ba\a7?B=Dv:=\19Xn=\93\89\84\bc|`\0b\bc*\fa\af\bco\e1q='\93\9d=\d6\ae(\bd\0bI\c0=\c9I\05=8\c2P\bdnqD<$\f2\5c<:\f6?\e2\e73=3?\a9<\af(\a9:\7fq\c3\bb\98p\db\bb\fd\f1\ac5_\0f<\e0\c7\83\bcN\aa\86<\1aqY=W8/=\eb\94R\bd.Y\15\bc~\d9\92=\fc\db\80\bd\e3,\87\bb\89\bd\e3\bct\a6[y\bd<\f7\9e=\05#\88\bd\a3`R=\cf\ba5\bd\ae\abr=\e79\af;\c9my;h\8fz\bd\95\04\f2\bc\dc\e7\08\bc\d2\c3(\bd\dd2Z\bd\18\9e\9c={=\a4D\14;hfx=\fe\d4\9a\bd^\ab\b6\bd\de\f1\0c\bd\89.a\bbt\a0S=\0a6L<\c7\ee\16\bbW\c3\1f\bd\ca\9dA<\ef\be\0b\bd\a8\0d\eb\bcG\82\82\bc\91}S:\c1\b6\96\a9\0b\03\bd\a4/0=%\b95\bd\1b\b5\9d\bc\1bVS\bc3ry\bd:Xu\bd\94\a8g\bd\b7\b1<=\c1\10\ab<\fcS\93\bd\00o\c4\bd\22L\01\be\f6\b3\16\bd@\8f\e5< \0a\0f\bdC\ba\b6\bc k\04\bd\fa\ebG\bd\de\93\dc\bch\80,\bd\919\b2=~\c5v\bb\0e\f9\8d=U:\18<\02Ak=?\a4\a0\bdq4t=\90\cd\bd\bc\1a\d4\92<\a9-\90=\f5\82\d0\bb(U\80\bd\92\85\a6\bboH\9c=\9cs\1d=rM\bd<\0f\1e\e1=#7\87\bd\13e)<\bf\0fL\bc,\e4\fb<\f8\a6\1e=\cf\f2\a5\bd\99[\d1\bb\c8\e4\e2\ba\b2\09\86\bd\03L^\bc\b1\0bp\bc\b7\fd\d6\ba@{'\bd\c1C\08=#\8c\b3\bd\84\e5\f0\bd\1c\d2F\bb\d0\a9\d8\bd3\86\1d=]\ee{=\17\caK\bck\e1\ab\bc\b7\0f\0e<{/)= \9cm=\9e\fd\0b=\08_|=a\97\1a=\9b\fa\11;;\b3\08\bdk\c5b\bcQE~\bc<\11\f1\bdcA&\bd4#\ea=\dd\d2\ea\bc\c7\d5\c6\bd\c3o\eb<\8cK\be=3\82\f4=\94\a7\ed\bc\0e8\0e\bd\17\c5\0e\bd\f9\99F\bcD\0b\d0\bd>}\c8=\0f4\a1\bd\fb\ca\a3\bd<\07\9c=%5\ec\bc\8f[\96<\f2\174\be\15\12\a1\bd\cfS\b6<\96\09\b1\bc\c51\c5<\d7\1f\ed9@\cd\94\bd5\cd\93\bdF\a4;\bc\d7\8f\84\bd\1f\c4\80;'\c0\ec\bc\01\9f7<\08\e6\0f\bd\e9\f1\f9<\b5\fc\cf=\e7\c6\cb;$?\8a=jvA=\e7\e3\ad\bc\e5\e0\09\bc\8aS\ab<\11\cb\e5;\e3\f4K\bc\eb\c0\86<:\f18=\ae\d7?=,x\a9\bc\f3\d2\96\bd\e5\22\d2\bd\ff\12\da9\c8\1c\bc<\d1\8a\16\bdd%\16\bd\b4{#\bd\89\96D<\d9ZH<\1f-\8f=\fa\e6\c4k\92\99=Y\8c\0a==Y\cb:\8d,W\bd\06\81\8b<\9a\f0\06\bdw\ec|\bd\e4I\d8<\9da\dc\bc\e9f\e2\bd\1169=\9d\c1\94=|l\9a;\0e\aeZ=\a3?q<&\9dG=D\c7\c8\bc\85\8e\bb\bd\85\be\aa;\ee0 \be\5c6\a0\bb\7f2Y\bd\d4s\e7\b9\a4\e4\04=\b7f\17\bb\f2U\c2=\1b\da\9f\bdT\b7\c5;\da\9d%\bdV, \bd\af\e9'=\81\bf\9e=\85\8c\94\bc7\05\9a\bc/\1f\cb=Q\e0q=`\af\05=\b8|;=\b7'\18<\f6\198\bd\e27O\bd\a5\aa\08\bd\c9\84\11=\8e'\f3;C\d5u<,\10c\bb\5c/c=0\d0\e9=q\c7\d8\bc\dd\a3\8c=Vr\ce\bb\80\ca=\eb\9ca\bd\14\dfL\bdpP\9d=\e4\b4\c1=ms\8d\bd\ba\a2\9c\9d\a6;\af\8d\a7\bc\f5?\11=G\04Y<\a7gs\bcv\03,\bd\f5U\e0\bb\99\de1=\f3\97-\bd\8cg\ff\bd!T\88\bd+\e9\c8\ba\ab\07\ad<\8b\03\b8\bdw\deX9#ap\bd\9cx\92=m\96\dd<\f7\ca\8d;P\91\9b\bc\89\c9\88;\0f{\8a\bdU\ed\82\bc#\1d\0e\bc%V\e1;\b2\8c\e5\bbZt\ab=\e8\16n=W\f8\c0\bdZ\d4\5c\bc\b9\f1\04\bd\e3\b43\be\e2j\e9\d5=\12s\92\ba\e2\1e\ea;2\9c\dd<\ce\fa\0e;\bd\83\b5\bd\ee)\db\bdQ\c9(\bdd\fer;\19I\b2=\c9\03j<\b8\17\83=EV\1a\bdM6\aa=\e5&h=\acV\b8:mB\d4\bd\f1\bb\14=.\19\d6\bcs\db\01=~\22\10\bd\f0Q\83<\0bP\91\bdBm\86\bc*\ef\81\f4\e2\89\bb\a6\0b\c4\bd\db\9bn\bb^\94v=a\c0\f5<\dbQ\96\bd\a7\8bE\bd\8b\05\08=X\b8\b9\bbM\12\db\bb\b81\fc\bca\0a\8a;\b7\98\8f=\a9\82#\bd\efZ&=\91\cd\f8\bc\e9G\95=\e0\d0\c0<\b8\c2\f3<\12r\1a\bd\22\c2\08\bc\b4\f0\fb;v\ac\ac\bd\ae\d7\f0\bc\90\0ao\bc;\00\93\bd\da\cd\a0=`\8a\01=9/\95\bc\e7\04f\bb\ed\bcF\bc\ad\99\5c\bc\d7\cbO=G\f1\8c\bbZi\a9=\e0'X\bc\be\bea\bc\f4\b4\b5;5U\19\bc%l\0d\bcu\fd\16\bd\87y\06\bd\99\e8\0a<\f6*{\bc\e1\f1\e3=\cdv\f1;D\eb\d1\bb|z!=\03,\a7=Z\9c\b9\bc!\93\9e=\86e\e1\ba\c9#S\bd\fb4\af=\98 \86:|\c5\de\bc\96\93o=![\80=Q)!\bd\ea\03 \bd\ffoQ\bc_]\81\bd\f0\ee4;uq\9b\bba\ed\88;m\05T\bb\0c\cf\07\bd\a2\96]\bdO\a4g\bdi\05n=_\c9<<\a6\b1\b2\bb\11g\83\bcc2U\bd\97Y5Q\17<'r\9c<\fc\f7n=\d80p\bdIB%\bdl\0e\a5\bc\8f\82\97\bd\de\b2\fa\bb#\14\d8\bc\e0g\19<\9c\9e\15:\eb4\8d\bc\18\d2f\bcE\99\86\bd\03\9b5>\f8\83 =\c1\1f\ae\bbw\0c-:~'\1a\bd^\0d\b2=\7f\8c\d0<\c4\c7\af\bb\f5\a7\0f\bd\16\a0\90<\a7H\8b\bc\12\88C\bc\c3o\df=q\b89\bdd\ed\f2<\aa\82\97\bd\fa\a3\a7=\8fd(\bdw\d7\e6<\ca\de\fd<\e0r\1d\bd\db\cb<=\ce\ed\a7<\89)$\bd\e15\9a\bd\89\a3\b0=a9\a7<\fc\04j<\9f\a8Z;\dc\e1:=\d1<\ea={W\b2=p\11z=\f2\a8\8e\bdM\d0\f1:\ae\dc\82\bdy\0d\1c\98=\e6=\98\bdm_g\ba\b7\85\ac=\86\9d\16=,\bf\98;\f0\ef\de\bd\14\bc$=H-\96\bd\9d\f8\0d=\be\b8\b6\bc.e\15<\a6y\fe\bc\eb\ab\17=\e4>\0c\bc4\a4M\bb\13\fe\0b\bd\e0\bb\14\bdu\0aa=y\d0\d3\bc\dfv\ca=c\d6*\bd:\ff6=E\0f\cd=$\81I\bc!\85\0b=Z\92\16\bdN\c5\d9\bbz\aa9=\a2:{\b9Q\bd|o\f7&\bd\bb&\8e<\12,\c5\ff\fc\d6\bc\95\f8\8a;\98\aci=\9b\f3+\bc\98\b9b=\b05u\bcw4q='\1d\f1\bc\8e\07v<\8e\c7\99<0\8f\f3\b4\d5\8d=\9bX\97\bd\fe\af4=\dar*=.\a9\aa\bd\cd\ca\8a\bd\e3%#<\81\1a\ae=w)\02=\88\03\f8\bc\aa?\01\bb\bf\de\ea\bcv\cbT\bd\ac\01\d6<\7fS@\bd\d7\13!=\c0\e2\14\be\d2F8\bd\fc\a2L\f5.\ed;]o\8d=L\04\00=c\f9\bd'\cb\c1=\b0=\81\bcF\1a\05\bd\06H\fc<\af\cc{\bc\9a\de\a2\bdY\cf\7f\bd\010t=(\9b\83\bd|\cc\82\fb\ff\af\bd\902\04=\97pF=\8e8\9c\bd\d6k\c2\bdu\db>\bday\8e=\c8\92\aa\bc6\ca\eb<\88\f8\98\bc.X\86\ba\ba\c0I;\cdh\9b=\d0\12\cf\bb\c5B\9f=b\9e2\bd\ce\03W\bcvUq;\dd|r\bd/Y\bd\bcW9\b5\bd\07\c14\bcR\1f\19\bb\03Z\86\bd\ea\bc\12>~\d4\c2=\f8\93/=0\9d\c6\bd\0e\fa\11\bd\d8\bd\b8=\bb\d6\a2<\a9\f3\ff\bd\fa^\d3<\f1\db?=\a8\fe@\bdeo\e0\bd*;?\bd\fe\8fX;\89\921\bd\07\f0b=\9e\98\18\be|\bb\d7\bbv\d8\ab\bd:\ea\0a\bc\17_\db]\df\08\bd\03m\b4\bd{\9c\e9\bc\93\c7\e6\bc\06lq<\e7\0c\b0<\af)4<\08\d0\a1\bd\a9\f1d<\83{\ae=\cf\0a\0f\bd\9c\0a\0d=F\cd;=\fa\bf\87\bd?\84\d8\bd)\0d\88\bd(\18w=\bb\84\17\bc\ea\88\bb\bc\92E#\bd\a3\fa\9d=\c8L<<8\e2\00=\c0\dfF\bc\b6\17C=ro\1f\bc\c6\9ba<\06_\f1\bbJ=\98=\d0\0bp\bb\11\f0P<\8f\b9b<$%\dd9G\b9^\bd\d4\8c\b3<\db\acN\bc38\bf\bc\e1\0f\85\bd\cf\f9\83<\a9sq<\db\f0\f8\a3\12\bd4G\1d=K\88?\bd\c5\ffM\bd\0b\87\b3\bcD\14\f0\ba\82\e8X\bd\c1\d6\92\bb\81\12\82=\8fdk\bd\a9V];\c5\ab\80\bd[\93\da\bd\95[\c0\bc\d3\f8I\bd\84w\1e\bc\0c\c8o=G\93t\bc\bc&<=\dd\df\cc\bat\1f\96\bc\dc\b1\06=\f4H\c0<\c0\94\9f\17=\d2\01\83;\19/\de<\d8=&=\91u3\ba/^\c6<\f3z\d9\bcr\07\cb\bc}\e5\b5=\8b\e4d=\18\b2\af;\80\08\ef\bd^_\a8\bd\ad\8e\c6\bd\8aH\96=\fd\ac\a5\ba\c2\86+=\0a\1f\d0<\ca\85\c9<\13Mh<\fa+\b6;\83\ec/=\f8\1e\ec:\ab+\fa\bd\12\e6\d6=\c5\fc\01=.\a7\b6;\c8\08\05\bdA\93\da<\f8\88\e5<\d7]\03\bc\d3\fa\00=\e9\02\8d;\1c\22\1a\bd\8f?Y=\9f\f8R=h\fc\91\bc#\b3\c9\bcd\99b\bd \e4\cc<\e7\0fD\bd\05\e40\bcX\c6\08\bd\a8\b8C\bd\e6;\94\bc\c7\85\94\bd\f7\ea\85\bd\84\a5!=\af\e3!\bc?\f1\fe<\e8\88^\bd\87\e4\8a<9\84H\bd\bd~\97=\16#C=\c8\ae\f8<\ee\dc\1c\c1<}\a6I<_n+\bd\ffl\03=\fdeX<\bffS\bcC3&=>a\ff\bc\13\fcA\bd+\b1\05=\de\ea\8c=\e50\f6<,\07\86\bc\1b\ec\96=O+\be<8\b3\fc\ba\8a\10\f0\bcb\e5f<\1b\98\1d\bd?\ae$=\93\f8\11=\b1P\02=\f0\f9]=!\03\de<\98\c0\a0\bd\05\ddU\bc#\a3\ca=\84\8d\05=\b4lZ\bd\8b\b2@=\c4\0c\9d<\a3\ab\90\bd2\b6\dc\bc\9da\b3<\12\a05=\c9<\d0<\fe1\86=\d0\de\80\bd\e9\cb/=X2m=3\f9\a3\bc@V<\ba\a7'Z;\8e\98V=\1bVR=\c3\04\8e=\10\ee\88\bc\e5jO\bcQ\dd\a8:)\80M\bd\ee\83\a3\bb\9dx\d1\bd\c5\92F\bd=,\f5\bcY\08e\bd9\86C=\b4@\ae\ba\bf4\f6\bb\8a\8a^=n\fa-\bd\a9y\04\bd\11\d2\ac\bc\92|H=#,\9e\bdY'>=\fbw\91\bd\92\1e\08\bc\9ag\9a\bc/h\07\bd\0a\14\c7<\f0o\a3\bc\f0\1b\db\bc\8c\f3\ff\bc\c2\94I=7\8f3\bd_]\d9\bc\f3\c8\03\bd\9b\df\ff<@\b3\96<(\15\8a;{M\82\bd\b6\ed\1b=\f3(\9a\bd\85W^\bd\f4\8d\d4=\1eq]\bd9C$<\9d\be\d9\bb\fd:\a9=$\a5\f5\bd\dd!\fe<\82\eb\fe\bc\8f\b4P=)`S\bdX\efF\bd+\c3\f3\bbx\1bD\bd=\92\1b\bc\d7\7f0\bbA\c5\bd<\9c\cd\c3;\88-\d4\bc\bd\fe~\bcJ\05\80=,\8c1\bci\9e\fe=\f0\14\bc\bc3\aa\b4:\8aE\08=\00\b9\1e=\94\bf_\bc~\14u=snr<\17K\14\bbcLI=\04\8b\e8\bd>g[\0f\bdv\f9\bd\bc\bf\aa\84\bc\05_\9e\bc\e8\803\bbS\a4\93<\82\b3\81\bc\b3\a0\17\bc+\81\84\bdj\eeB=\c6\99_=`\f4\aa\bc\f8\81\9e;\a6\f6\11=\d5\cfH=\b4\a2\ec\bcj\05\cc<\d9\cb?=R\e1\87\bb\9f9\99\bd\1e\e1\c5<\13\ffF\bc\8abF\bd\93CR\bdk\d5H\ba\bb\f6\04\bb\e7\c34=\d0yc<\16\f7\08=6\a3\8b\bciA\b7\ba(\9bw=\f4J\83\d5\be\81;\a9\d30\bcN\d3\e5\bc+3\cc\bd\ba\08\c4<\a5\f4\ba\b9\84I\88=~@\9c=\f9\a4%\bd\1b\a6\a6\bd8\f5\9d\bd\90\c6\0e=0\131=\b0h\b5<\04\82\1e\bdm\b6]\bd.\a3\05\bd\a7\d0\8f\bd\d4\fcS\bd\df\15\c4\bd<\d2\e6\ba\b6!\0f<\1b{?\bd\a2\b57\bdH\8c\a8=g\e2&,\bd4t,=\daX\81\ba\13\fe\a6\bb\121\b9\bc\a2o\fc\bd\ab\bc\c2=B\84\9c\bc\cb\f5T\bd\15\1c\8a\bd\f3j\81\bc\e9i\9b\bd\81L\90j\bd\dc\11\0a=?L\02\00\00\c0?\5c\8f2@\00\00\00\00\00\00\c0?\e1z4@\00\00\00\00\00\00\c0?ff6@\00\00\00\00\00\00\c0?\ecQ8@\00\00\00\00\00\00\c0?q=:@\00\00\00\00\00\00\c0?\f6(<@\00\00\00\00\00\00\c0?{\14>@\00\00\00\00\00\00\c0?\00\00@@\00\00\00\00\00\00\c0?\85\ebA@\00\00\00\00\00\00\c0?\0a\d7C@\00\00\00\00\00\00\c0?\8f\c2E@\00\00\00\00\00\00\c0?\14\aeG@\00\00\00\00\00\00\c0?\9a\99I@\00\00\00\00\00\00\c0?\1f\85K@\00\00\00\00\00\00\c0?\a4pM@\00\00\00\002w\95?\99\bb\0a@\00\00\80?\00\00\c0?\00\00@@\00\00\00\00")) diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.c new file mode 100644 index 0000000..ab50c4d --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.c @@ -0,0 +1,542 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeam + + Author: Eugene Weinstein + + Function: Audio beam former + + Source: StreamIt + http://groups.csail.mit.edu/cag/streamit/ + + Changes: no functional changes + + License: see license.txt + +*/ + +/* + Include section +*/ + +#include "audiobeam.h" +#include "audiobeamlibm.h" +#include "audiobeamlibmalloc.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void audiobeam_init(); +int audiobeam_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +audiobeam_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); +void +audiobeam_preprocess_delays(struct audiobeam_PreprocessedDelays prep_delays[], + float *delays); +float *audiobeam_parse_line(float *float_arr, int num_mic); +long int audiobeam_find_max_in_arr(float *arr, int size); +long int audiobeam_find_min_in_arr(float *arr, int size); +int audiobeam_wrapped_inc_offset(int i, int offset, int max_i); +int audiobeam_wrapped_dec_offset(int i, int offset, int max_i); +int audiobeam_wrapped_inc(int i, int max_i); +int audiobeam_wrapped_dec(int i, int max_i); +struct audiobeam_DataQueue *audiobeam_init_data_queue(int max_delay, + int num_mic); +struct audiobeam_Delays *audiobeam_init_delays(int num_angles, int num_mic); +void audiobeam_calc_distances(float *source_location, + float audiobeam_mic_locations[15][3], + float *distances, int num_mic); +void audiobeam_calc_delays(float *distances, float *delays, int sound_speed, + int sampling_rate, int num_mic); +void audiobeam_adjust_delays(float *delays, int num_mic); +float *audiobeam_calc_weights_lr(int num_mic); +float *audiobeam_calc_weights_left_only(int num_mic); +float audiobeam_calculate_energy(float *samples, int num_samples); +float audiobeam_do_beamforming( + struct audiobeam_PreprocessedDelays preprocessed_delays[], + float **sample_queue, int queue_head, long int max_delay, int num_mic, + float *weights); +int audiobeam_process_signal(struct audiobeam_Delays *delays, int num_mic, + float sampling_rate, float **beamform_results, + struct audiobeam_DataQueue *queue, int num_beams, + int window, float *weights); +int audiobeam_calc_beamforming_result(struct audiobeam_Delays *delays, + float **beamform_results, float *energies, + struct audiobeam_DataQueue *queue, + int num_beams, int window, int hamming); +void audiobeam_calc_single_pos(float source_location[3], + float audiobeam_mic_locations[15][3], + int hamming); + +/* + Declaration of global variables +*/ + +extern float audiobeam_input[5760]; +extern float audiobeam_mic_locations[15][3]; +extern float audiobeam_source_location[3]; +extern float audiobeam_origin_location[3]; +int audiobeam_input_pos; +int audiobeam_checksum; + +/* + Initialization- and return-value-related functions +*/ + +void +audiobeam_init() { + audiobeam_input_pos = 0; + audiobeam_checksum = 0; + + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &audiobeam_input[0]; + __pragma_loopbound(23040, 23040); + for (i = 0; i < sizeof(audiobeam_input); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &audiobeam_mic_locations[0]; + __pragma_loopbound(180, 180); + for (i = 0; i < sizeof(audiobeam_mic_locations); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &audiobeam_source_location[0]; + __pragma_loopbound(12, 12); + for (i = 0; i < sizeof(audiobeam_source_location); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &audiobeam_origin_location[0]; + __pragma_loopbound(12, 12); + for (i = 0; i < sizeof(audiobeam_origin_location); ++i, ++p) + *p ^= bitmask; +} + +int +audiobeam_return() { + return (audiobeam_checksum + 1 != 0); +} + +/* + Algorithm core functions +*/ + +void +audiobeam_preprocess_delays(struct audiobeam_PreprocessedDelays prep_delays[], + float *delays) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < 15; i++) { + prep_delays[i].delay = delays[i]; + prep_delays[i].high = (int) audiobeam_ceil(delays[i]); + prep_delays[i].low = (int) audiobeam_floor(delays[i]); + prep_delays[i].offset = delays[i] - prep_delays[i].low; + } +} + +float * +audiobeam_parse_line(float *float_arr, int num_mic) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) + float_arr[i] = audiobeam_input[audiobeam_input_pos++]; + + return float_arr; +} + +long int +audiobeam_find_max_in_arr(float *arr, int size) { + int i; + float max = 0; + + __pragma_loopbound(15, 15); + for (i = 0; i < size; i++) { + if (arr[i] > max) + max = arr[i]; + } + + return audiobeam_ceil(max); +} + +long int +audiobeam_find_min_in_arr(float *arr, int size) { + int i; + float min = arr[0]; + + __pragma_loopbound(15, 15); + for (i = 0; i < size; i++) { + if (arr[i] < min) + min = arr[i]; + } + + return audiobeam_floor(min); +} + +int +audiobeam_wrapped_inc_offset(int i, int offset, int max_i) { + if (i + offset > max_i) + return (i + offset - max_i - 1); + else + return (i + offset); +} + +int +audiobeam_wrapped_dec_offset(int i, int offset, int max_i) { + if (i - offset < 0) + return (max_i - (offset - i) + 1); + else + return (i - offset); +} + +int +audiobeam_wrapped_inc(int i, int max_i) { + return audiobeam_wrapped_inc_offset(i, 1, max_i); +} + +int +audiobeam_wrapped_dec(int i, int max_i) { + return audiobeam_wrapped_dec_offset(i, 1, max_i); +} + +struct audiobeam_DataQueue * +audiobeam_init_data_queue(int max_delay, int num_mic) { + int i, j; + + struct audiobeam_DataQueue *queue; + queue = (struct audiobeam_DataQueue *) audiobeam_malloc( + sizeof(struct audiobeam_DataQueue)); + queue->sample_queue = + (float **) audiobeam_malloc((max_delay + 1) * sizeof(float *)); + + __pragma_loopbound(15, 15); + for (i = 0; i < (max_delay + 1); i++) { + (queue->sample_queue)[i] = + (float *) audiobeam_malloc(num_mic * sizeof(float)); + __pragma_loopbound(15, 15); + for (j = 0; j < num_mic; j++) { + (queue->sample_queue)[i][j] = 0.0; // Initialize values to 0 + } + } + + queue->head = 0; + queue->tail = 0; + queue->full = 0; + + return queue; +} + +struct audiobeam_Delays * +audiobeam_init_delays(int num_angles, int num_mic) { + struct audiobeam_Delays *delays; + int i; + + delays = (struct audiobeam_Delays *) audiobeam_malloc( + sizeof(struct audiobeam_Delays)); + + // Initialize the delays array + delays->delay_values = + (float **) audiobeam_malloc(num_angles * sizeof(float *)); + + __pragma_loopbound(1, 1); + for (i = 0; i < (num_angles); i++) { + delays->delay_values[i] = + (float *) audiobeam_malloc(num_mic * sizeof(float)); + } + + return delays; +} + +void +audiobeam_calc_distances(float *source_location, + float audiobeam_mic_locations[15][3], float *distances, + int num_mic) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) { + distances[i] = (audiobeam_sqrt( + (audiobeam_mic_locations[i][0] - source_location[0]) * + (audiobeam_mic_locations[i][0] - source_location[0]) + + (audiobeam_mic_locations[i][1] - source_location[1]) * + (audiobeam_mic_locations[i][1] - source_location[1]) + + (audiobeam_mic_locations[i][2] - source_location[2]) * + (audiobeam_mic_locations[i][2] - source_location[2]))); + } +} + +void +audiobeam_calc_delays(float *distances, float *delays, int sound_speed, + int sampling_rate, int num_mic) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) + delays[i] = (distances[i] / sound_speed) * sampling_rate; +} + +void +audiobeam_adjust_delays(float *delays, int num_mic) { + int i; + long int min_delay = audiobeam_find_min_in_arr(delays, num_mic) - 1; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) + delays[i] -= min_delay; +} + +float * +audiobeam_calc_weights_lr(int num_mic) { + float *weights = (float *) audiobeam_malloc(num_mic * sizeof(float)); + int index = 0; + int y, z; + + int half = num_mic / 4; + + __pragma_loopbound(0, 0); + for (z = 1; z >= -1; z -= 2) { + __pragma_loopbound(0, 0); + for (y = 0; y < half; y++) { + weights[index] = + 0.54 + 0.46 * audiobeam_cos(audiobeam_M_PI * y / half); + index++; + } + __pragma_loopbound(0, 0); + for (y = 0; y < half; y++) { + weights[index] = + 0.54 + 0.46 * audiobeam_cos(audiobeam_M_PI * (-y) / half); + index++; + } + } + + return weights; +} + +float * +audiobeam_calc_weights_left_only(int num_mic) { + float *weights = (float *) audiobeam_malloc(num_mic * sizeof(float)); + int index = 0; + int y; + + int half = num_mic / 2; + + __pragma_loopbound(15, 15); + for (y = -half; y <= half; y++) { + weights[index] = 0.54 + 0.46 * audiobeam_cos(audiobeam_M_PI * y / half); + index++; + } + + return weights; +} + +float +audiobeam_calculate_energy(float *samples, int num_samples) { + int i; + float sum = 0.0; + + __pragma_loopbound(0, 0); + for (i = 0; i < num_samples; i++) + sum += (samples[i] * samples[i]); + + return sum; +} + +float +audiobeam_do_beamforming( + struct audiobeam_PreprocessedDelays preprocessed_delays[], + float **sample_queue, int queue_head, long int max_delay, int num_mic, + float *weights) { + int i; + float sum = 0; + int delay_floor; + int delay_ceil; + int low_index; + int high_index; + float interpolated_value; + + // add up all the num_mic delayed samples + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) { + delay_floor = preprocessed_delays[i].low; + delay_ceil = preprocessed_delays[i].high; + + // Inline wrap around here + // Low index gets index of sample right before desired sample + low_index = queue_head + delay_floor; + if (low_index > max_delay) + low_index -= (max_delay + 1); + + // High index gets index of sample right after desired sample + high_index = queue_head + delay_ceil; + if (high_index > max_delay) + high_index -= (max_delay + 1); + + // i gives the value of the microphone we want. However, since + // the array only has microphones first_mic to last_mic, we + // need to offset our index by first_mic + + interpolated_value = + (((sample_queue[high_index][i] - sample_queue[low_index][i]) * + (preprocessed_delays[i].offset)) + + sample_queue[low_index][i]); + + // If we have microphone weights, multiply the value by the weight + if (weights != 0) + sum += (interpolated_value * weights[i]); + else + sum += interpolated_value; + } + + return sum; +} + +int +audiobeam_process_signal(struct audiobeam_Delays *delays, int num_mic, + float sampling_rate, float **beamform_results, + struct audiobeam_DataQueue *queue, int num_beams, + int window, float *weights) { + int i, j; + float time_index = 0; + float time_index_inc = (1.0 / sampling_rate); + + float value; + + int done = 0; + + struct audiobeam_PreprocessedDelays preprocessed_delays[15]; + + audiobeam_preprocess_delays(preprocessed_delays, delays->delay_values[0]); + + __pragma_loopbound(13, 13); + for (i = 0; i < delays->max_delay - 1; i++) { + if (audiobeam_input_pos < 5760) + audiobeam_parse_line((queue->sample_queue)[queue->head], 15); + else + return -1; + queue->head = audiobeam_wrapped_inc(queue->head, delays->max_delay); + } + __pragma_loopbound(371, 371); + for (i = 0; (i < window) || (window < 0); i++) { + if (audiobeam_input_pos < 5760) + audiobeam_parse_line((queue->sample_queue)[queue->head], 15); + else { + done = 1; + break; + } + + __pragma_loopbound(1, 1); + for (j = 0; j < num_beams; j++) { + value = audiobeam_do_beamforming( + preprocessed_delays, (queue->sample_queue), + audiobeam_wrapped_inc(queue->head, delays->max_delay), + delays->max_delay, num_mic, weights); + + value = value / num_mic; + + if (beamform_results != 0) + beamform_results[j][i] = value; + } + + queue->tail = queue->head; + queue->head = audiobeam_wrapped_inc(queue->head, delays->max_delay); + + time_index += time_index_inc; + } + + return (done); +} + +int +audiobeam_calc_beamforming_result(struct audiobeam_Delays *delays, + float **beamform_results, float *energies, + struct audiobeam_DataQueue *queue, + int num_beams, int window, int hamming) { + int i; + int done; + float *weights = 0; + + if (hamming) { + if ((15 % 2) == 1) + weights = audiobeam_calc_weights_left_only(15); + else + weights = audiobeam_calc_weights_lr(15); + } + + done = audiobeam_process_signal(delays, 15, 16000, beamform_results, queue, + num_beams, window, weights); + + if (beamform_results != 0) { + __pragma_loopbound(1, 1); + for (i = 0; i < num_beams; i++) + energies[i] = + audiobeam_calculate_energy(beamform_results[i], window); + } + return done; +} + +void +audiobeam_calc_single_pos(float source_location[3], + float audiobeam_mic_locations[15][3], int hamming) { + float mic_distances[15]; + struct audiobeam_Delays *delays = audiobeam_init_delays(1, 15); + struct audiobeam_DataQueue *queue; + + float **beamform_results; + float *energies; + + beamform_results = (float **) audiobeam_malloc(1 * sizeof(float *)); + beamform_results[0] = (float *) audiobeam_malloc(384 * sizeof(float)); + energies = (float *) audiobeam_malloc(1 * sizeof(float *)); + + // Calculate distances from source to each of mics + audiobeam_calc_distances(source_location, audiobeam_mic_locations, + mic_distances, 15); + + audiobeam_calc_delays(mic_distances, delays->delay_values[0], 342, 16000, + 15); + + audiobeam_adjust_delays(delays->delay_values[0], 15); + + delays->max_delay = audiobeam_find_max_in_arr(delays->delay_values[0], 15); + + queue = audiobeam_init_data_queue(delays->max_delay, 15); + + audiobeam_calc_beamforming_result(delays, beamform_results, energies, queue, + 1, -1, hamming); + + audiobeam_checksum += beamform_results[0][0] * 1000; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +audiobeam_main(void) { + char hamming = 1; + audiobeam_calc_single_pos(audiobeam_source_location, + audiobeam_mic_locations, hamming); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + audiobeam_init(); + audiobeam_main(); + + return (audiobeam_return()); +} diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.h new file mode 100644 index 0000000..e618db2 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeam.h @@ -0,0 +1,50 @@ + +#ifndef AUDIOBEAM_MAIN_H +#define AUDIOBEAM_MAIN_H + +struct audiobeam_DataQueue { + float **sample_queue; + int head; + int tail; + unsigned char full; +}; + +struct audiobeam_Delays { + float **delay_values; + long int max_delay; +}; + +struct audiobeam_PreprocessedDelays { + float delay; + int low; + int high; + float offset; +}; + +#undef FLT_MAX +#define FLT_MAX 999e999 + +#define SOUND_SPEED 342 +#define SAMPLING_RATE 16000 +#define CARTESIAN_DISTANCE(x1, y1, z1, x2, y2, z2) \ + (sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + \ + (z1 - z2) * (z1 - z2))); + +#define NUM_MIC 15 +#define ANGLE_ENERGY_WINDOW_SIZE 400 +#define GRID_STEP_SIZE 0.003 // .3cm +#define NUM_DIRS 7 +#define NUM_TILES 16 + +#define MIC_HORIZ_SPACE 0.038257 +#define MIC_VERT_SPACE 0.015001 +#define TWO23 8388608.0 // 2^23 +#define BUFFER_SIZE 384 // No of input-tupels (each with NUM_MIC elements) +#define NUM_MIC_IN_CHAIN 32 +#define NUM_BOARDS_IN_CHAIN 16 +#define INPUT_LENGTH 5760 + +#define INTERPOLATE(low_value, high_value, offset) \ + (((high_value - low_value) * (offset)) + low_value) + +#endif diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeaminput.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeaminput.c new file mode 100644 index 0000000..a15195e --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeaminput.c @@ -0,0 +1,1452 @@ + +float audiobeam_input[5760] = { + -2.1628241e-002, -6.1782300e-002, 1.2674258e-002, 4.5557573e-002, + -3.1999024e-002, 1.5042214e-002, -2.2025290e-002, -1.1691264e-001, + -1.1481735e-002, -1.4446880e-002, -1.5755706e-002, -8.0576309e-002, + 2.0622295e-002, -1.9724793e-003, -1.2299200e-001, -8.3279195e-002, + -1.0825949e-002, 7.5347056e-002, -3.6992287e-003, 1.2980213e-002, + 5.9641118e-002, 1.8884644e-002, -5.5868450e-002, 4.1899706e-002, + -2.0939881e-002, 2.0535662e-002, -9.9773254e-002, -1.5328980e-002, + 2.1354349e-002, 1.3485441e-002, 6.2665707e-003, -1.0335293e-002, + -4.1743319e-002, 4.3513189e-002, -4.2254620e-002, -2.7446285e-002, + 4.5134873e-002, 5.6054726e-002, 6.2557771e-002, 4.2653265e-002, + 7.6308850e-003, 1.4700700e-002, 5.4820763e-002, -1.3939644e-002, + -8.8708573e-002, 1.4383734e-002, 4.0463345e-003, 3.5856296e-002, + 2.7271902e-002, 2.0721019e-002, 3.5167562e-002, -2.7007340e-002, + -1.3367771e-002, -6.8606571e-002, -1.1089227e-001, 7.3041941e-002, + -5.2066383e-002, -5.1117839e-003, -3.7742692e-002, -1.1895006e-002, + -5.7323089e-002, -5.4802003e-003, -8.4072455e-003, 1.5633496e-002, + 4.6059069e-002, -6.1861422e-002, -3.3034801e-002, 1.7182310e-002, + 1.1807449e-001, 8.2171643e-003, -1.4691311e-002, -7.2660364e-004, + 4.6637366e-002, -6.9687813e-004, -2.7780373e-002, 5.9544506e-002, + -5.6050055e-003, -3.5444498e-002, 1.2845303e-002, -1.0379076e-001, + -8.5864760e-002, 1.9192324e-002, -2.6644473e-003, 5.4431089e-003, + -9.2110237e-003, 7.9344657e-002, 4.7203951e-002, 9.6834909e-002, + -1.0553527e-001, -8.5097540e-004, 5.9460688e-002, 4.4844228e-002, + -2.8858692e-002, 4.4496937e-002, -3.9902243e-002, 5.5557069e-002, + -1.1814152e-002, -5.8464847e-002, -1.0753965e-002, 5.7336183e-002, + 2.6582677e-002, 2.2119089e-002, -1.4469086e-002, 3.2141585e-002, + -1.0303352e-001, -1.8856419e-003, 3.8161312e-002, -3.7091166e-002, + -5.1262587e-003, 4.2556931e-002, -5.8465556e-002, 4.2193534e-002, + -1.4951154e-002, 1.7423551e-002, 2.7519487e-002, -9.0048353e-002, + -2.6206603e-002, -1.1536221e-002, 4.5418578e-002, -9.1746774e-002, + 1.6370112e-002, 8.2439024e-003, -1.7961312e-002, -7.5403629e-002, + -6.6798880e-003, -9.2569474e-003, -1.8133432e-002, -6.7922929e-002, + -3.3209516e-002, 4.7587886e-002, -4.4354675e-002, -7.9939507e-002, + -1.0312521e-001, -4.6389013e-002, -6.8492137e-002, 8.7253275e-003, + -1.0040243e-002, -2.3972856e-002, 1.9377428e-003, -1.2364076e-002, + -3.3033927e-002, 6.2238030e-002, -4.7879158e-002, -1.9680886e-002, + -3.2198806e-002, -4.0721657e-003, -1.7973043e-002, 9.3910391e-003, + -9.1117967e-002, 3.6036154e-002, -9.3285589e-003, -3.9239303e-002, + -1.4022387e-001, 1.1102588e-001, -9.1222642e-002, -4.0301199e-002, + 7.1912258e-002, 1.5040754e-002, 8.1648312e-002, 3.9995645e-002, + -1.3388074e-002, 1.9629547e-002, 3.5710780e-003, 1.1166215e-002, + -4.0137762e-002, 3.6284046e-002, 4.1404491e-002, -5.8754380e-002, + -7.8104994e-003, -5.3507568e-002, 1.3005354e-002, -1.6914462e-002, + 8.5270739e-002, 3.9979512e-002, 4.5752537e-002, -3.1159018e-002, + 4.9213792e-002, 6.1313765e-002, 4.3386180e-002, -1.1103888e-002, + -2.9414395e-002, -1.2976305e-002, 6.2751925e-002, 2.6120284e-002, + -2.4616119e-002, -3.6435894e-002, 7.1182254e-002, 2.2753153e-002, + 3.0188200e-002, -3.1009759e-002, -8.5616927e-002, -4.6712075e-002, + 1.0069141e-002, -1.2036765e-001, 3.4740635e-002, 1.0916700e-001, + -7.5289504e-002, -5.3676914e-002, -1.6396310e-002, 5.2259303e-002, + -2.2119146e-002, 4.3186864e-002, 5.1169779e-002, 6.6785827e-002, + 8.4849447e-002, -5.2696816e-002, -6.5414943e-003, 8.6775788e-002, + 8.7802920e-003, 2.8938998e-002, -6.8520041e-003, 5.1510683e-002, + -2.9026553e-002, 3.8173521e-002, 2.2338277e-002, 3.0163548e-002, + -4.3077452e-002, 7.9805371e-002, 4.7317864e-002, -3.1363067e-002, + 3.0903885e-002, -1.3112581e-002, 4.6251235e-002, 2.5813919e-002, + -5.2188163e-002, 5.9587326e-003, 1.0092254e-002, 1.2104228e-002, + 2.7865320e-002, 3.4901635e-002, -2.5736803e-002, 1.3229570e-002, + 3.6694281e-003, 3.3012708e-002, 2.9284882e-002, 3.0060870e-002, + 4.5508139e-002, -3.6974026e-002, 7.7034396e-002, -6.8227707e-002, + 5.3618194e-002, -6.1636629e-002, 4.1438304e-002, 1.1367451e-002, + -4.4009108e-002, -2.3843912e-002, -1.6703032e-002, 3.7265590e-002, + -7.8425072e-003, 7.0384481e-002, -2.4218783e-002, -3.5625536e-002, + 1.8010625e-002, 1.1966647e-002, 2.5491626e-003, 3.1251434e-003, + -2.6075724e-002, -4.3802442e-002, -1.2920483e-002, 3.3085779e-002, + -3.9037317e-003, -2.8269926e-002, 4.1542553e-002, -8.2930418e-002, + 5.6657974e-002, 3.4391329e-002, -5.5825221e-002, 6.8989268e-002, + 1.2541652e-003, -7.7722092e-002, -4.6334370e-003, 3.1744148e-002, + -5.5503811e-002, -3.4445949e-002, -9.4038308e-003, -2.7828988e-002, + 1.0887660e-001, 1.3636863e-002, -3.7585580e-002, 4.0418722e-002, + -1.3737476e-002, -5.0488197e-003, 1.3194491e-001, 7.2649277e-002, + -3.6200249e-002, -4.1687712e-002, -1.7974402e-001, -9.9629449e-002, + -8.8510199e-002, -3.2055261e-002, 1.7036375e-002, 1.8071052e-002, + 4.4934493e-002, -1.0864015e-002, 9.9226525e-003, -1.6564939e-002, + -3.4734325e-002, 3.5725355e-002, 3.0344723e-002, -3.6905057e-002, + 1.4666105e-002, -9.1517247e-002, -3.3012325e-002, 5.8220711e-002, + -6.8047909e-003, 3.6517819e-002, 8.7157879e-002, -1.4120887e-002, + 5.4666271e-002, 2.0673658e-002, -5.8489896e-002, -1.0321028e-001, + 1.7051732e-002, -4.4728363e-003, 7.1522488e-004, -6.6825032e-002, + -3.0624456e-002, 5.7023563e-002, -1.1878060e-002, 1.7099754e-002, + 4.3931414e-002, 6.1445253e-002, 3.9676417e-002, 7.7224665e-002, + 6.4921134e-002, -5.6517669e-003, 5.5906816e-002, -2.1154100e-002, + 2.4198912e-002, 1.2288710e-002, 3.5640310e-002, -3.7175887e-002, + -6.0273241e-002, 6.4682700e-003, 2.1266448e-002, -6.8591151e-002, + 1.1184946e-002, 4.6699013e-003, -1.0346103e-001, -7.7362572e-002, + 4.7383361e-003, -1.4630850e-002, 3.7812788e-002, 1.6292353e-002, + -4.8009838e-002, 8.0999615e-002, 2.1004391e-003, 1.5541126e-001, + -6.1366286e-003, -7.1757358e-002, -1.8036409e-002, 4.4754181e-002, + 8.4250625e-003, 2.0321052e-002, 2.3096646e-002, -4.7739081e-002, + -3.6540263e-002, -1.3962473e-002, -1.4429499e-002, 5.4134628e-002, + -3.4826503e-002, -9.5953591e-002, -2.5723076e-003, 2.5258029e-002, + -1.7985838e-002, -3.2436879e-002, 7.4368827e-002, 7.8647624e-002, + 1.0656742e-002, 8.4282290e-003, 2.5266494e-002, 1.0782181e-002, + 7.0122588e-002, 4.5656108e-002, -1.7103947e-002, 4.2780530e-002, + -9.6794177e-003, -6.4130219e-003, -9.2925547e-002, 5.4742908e-002, + -7.5128799e-002, -7.3489810e-002, -3.0056779e-003, -7.9295585e-003, + -2.1268989e-002, -1.8030581e-002, 1.8197354e-002, -9.1941398e-002, + -6.5053760e-002, -2.8177888e-002, 6.2682028e-002, -2.5915727e-002, + -1.5832074e-002, 6.8064152e-002, 7.3910585e-003, 9.9715351e-003, + 1.4832463e-002, -8.5346638e-004, 1.7638664e-002, 3.0446443e-002, + -1.2396491e-002, -5.8601288e-002, -5.7627198e-003, -7.1554886e-003, + -6.3799636e-003, -7.9695655e-002, 2.4753204e-002, 8.6758471e-003, + -4.9728861e-002, 2.0786272e-002, -7.6560881e-002, 1.8730544e-002, + 2.1715688e-002, 4.1880687e-002, -4.0154045e-002, -3.0255220e-002, + 7.5668890e-002, 2.6577586e-002, 6.0758844e-002, 4.1263811e-002, + -7.2132197e-002, -5.4040115e-002, 4.5831681e-002, 2.9148772e-002, + -9.9761159e-002, -2.4308664e-002, -5.9443444e-002, 3.9842573e-002, + -4.8058590e-002, -1.6081315e-002, 5.2772543e-002, 1.9132275e-002, + 1.3499840e-002, -2.5313375e-002, 4.1852174e-002, 2.8461234e-002, + 3.5598046e-002, -4.2019346e-002, 3.0022497e-002, 1.3199080e-003, + 8.3394564e-002, 2.2949521e-002, 4.1566899e-002, 1.1383869e-002, + -2.6939783e-002, -1.8963007e-002, -6.3268458e-002, 5.8324716e-002, + 4.8789982e-002, 5.6035385e-002, -2.0057577e-002, 4.8354809e-002, + 6.4102491e-002, 8.5367473e-003, -4.4917671e-003, 5.3137245e-002, + -3.4406597e-003, -2.5126308e-002, 3.6564998e-003, 9.6593471e-002, + 7.4728111e-002, -6.7266129e-002, -4.9014918e-002, 7.2046324e-005, + 1.0162088e-001, 3.4409693e-002, 7.3462774e-003, -8.0225074e-002, + 4.8609099e-002, 3.2217993e-002, -2.8071970e-002, -3.6815087e-002, + 3.0467444e-002, 4.3287817e-002, -1.3733658e-002, 2.5769175e-002, + 2.6532442e-002, 6.3705272e-002, 9.0108580e-004, -8.9331571e-003, + 4.0743375e-002, 2.1807528e-002, 7.9702732e-002, -7.5750752e-003, + 7.0674335e-002, 3.7582849e-002, 3.9334641e-003, -2.5679423e-002, + 2.2647574e-002, -6.4712014e-002, 2.4315794e-002, 1.5494849e-002, + -3.9942923e-002, 3.3496104e-002, -5.9740340e-002, 3.5474677e-002, + 6.6577221e-002, 6.8351408e-002, -7.7174045e-002, -3.3267903e-002, + -4.3616992e-002, 1.2970427e-001, 6.0899210e-002, 4.3444379e-003, + -1.0402039e-001, 4.3108587e-002, 1.3577371e-002, 3.3900628e-002, + 7.3707838e-003, -1.5925799e-002, 6.4439821e-002, 1.7075281e-003, + 1.0684273e-001, 1.3675111e-002, -1.8111888e-003, -2.8508186e-002, + -6.5596762e-002, 1.8536230e-002, 2.3318748e-002, 4.7302415e-002, + 7.7239329e-003, -2.4929896e-002, -3.5669784e-002, 4.8605025e-002, + 9.7598834e-002, 3.3591893e-002, 1.3978895e-002, 2.2590039e-002, + -5.5155328e-002, -2.3844007e-002, -2.8932963e-002, -4.5784933e-002, + -2.5579789e-002, 8.6706332e-002, 8.5991126e-002, -4.4830492e-002, + 1.7419718e-002, 1.4916965e-002, -6.2744229e-002, -2.1218715e-002, + 5.9749921e-002, 2.6471628e-003, 1.4696082e-002, -1.1916464e-001, + -7.4054943e-002, 3.3702032e-002, -7.2744375e-002, 2.0153878e-002, + -4.7562683e-002, -3.2418295e-002, 1.8784044e-002, 9.4509719e-002, + 8.6064590e-002, -1.2657551e-002, -3.8219708e-002, -5.9906689e-002, + 3.8677878e-002, 3.2909039e-002, 1.3356926e-002, -1.9001381e-002, + -3.9834512e-002, 1.6185466e-002, -2.1554965e-002, -1.0883439e-001, + -2.9635956e-002, 1.2873885e-002, 2.7852743e-002, 3.5614484e-003, + -4.7306763e-002, -1.0771995e-001, -7.9289260e-004, 1.1021590e-001, + -6.1261912e-003, 5.2735506e-002, -5.0261529e-002, 3.2092184e-002, + 3.1401447e-002, 2.6629993e-002, -2.9882337e-003, -6.0317700e-002, + -3.0940994e-002, -3.8375379e-002, -1.0663192e-001, -1.1058175e-002, + -5.6424824e-002, -7.7026313e-003, -4.1079471e-002, -2.1629167e-002, + -2.6973772e-002, -4.5878364e-002, 1.5542578e-002, -4.9103021e-002, + -1.0554701e-002, -5.0947614e-002, -3.1865395e-002, 9.0008999e-002, + 4.5801038e-002, 1.5787324e-002, 6.1816926e-002, 3.9975029e-002, + -8.0101743e-002, 3.6589676e-002, -4.0044532e-002, -5.4152676e-003, + -2.7100833e-002, 2.0669295e-003, 4.2072166e-002, -4.8541169e-002, + -6.0994910e-002, 7.2269246e-002, 1.8547974e-002, 3.2317037e-002, + -3.7668570e-002, 2.3090187e-002, -8.4282566e-003, 1.2909956e-002, + -4.6799208e-003, -7.5882838e-002, -4.5005968e-002, 6.0924318e-002, + 1.5170746e-002, -8.0718858e-003, -3.1913614e-002, 2.9448478e-002, + 5.6982375e-002, -2.2421475e-002, 2.7408554e-002, -1.0052456e-001, + -3.0342741e-002, -8.0221320e-002, -5.2820631e-002, 1.4287569e-002, + -3.5261023e-002, -1.2712299e-002, 1.0298138e-002, -7.4545734e-002, + -7.1662807e-003, -6.3049311e-002, -3.3128714e-003, -3.7018937e-002, + -9.2155629e-002, 4.4295353e-003, -2.5345078e-002, -5.0175815e-004, + -2.2425974e-002, 7.0790673e-002, 4.6067398e-002, 1.3356450e-002, + -7.5350427e-002, 9.2272647e-002, -6.0388207e-002, 6.2880311e-002, + -4.6813092e-002, 6.4358587e-002, 6.5476593e-002, -5.0385005e-002, + 1.1259635e-002, -2.8642227e-002, 6.0591769e-003, 7.8259699e-003, + -4.0086083e-002, -1.3107082e-002, -2.5073934e-002, 1.5301678e-002, + -6.1350007e-002, -4.0860320e-002, 4.5224779e-002, -4.4892524e-002, + 8.8006431e-002, -3.3282403e-002, -5.6195537e-002, -1.1931638e-001, + -6.8019421e-002, -7.0651820e-003, 1.0114029e-001, 2.6799939e-002, + -4.5414349e-002, 7.3662653e-002, 2.6023897e-002, -7.7197973e-002, + 1.8472004e-002, 6.4325310e-003, 1.0535758e-001, -8.2482506e-002, + -1.0868944e-001, 8.7186828e-002, 4.2331149e-003, 6.6302594e-003, + 5.0652627e-002, -2.6295176e-002, 1.1319735e-002, -5.3688488e-002, + -8.3685938e-002, 3.8054233e-002, -2.5923609e-002, 8.7603907e-002, + 4.4975322e-002, 2.0615118e-002, 3.7674950e-002, 5.6434838e-002, + 1.0977012e-001, 2.1349762e-003, -1.4936346e-004, 6.7930892e-002, + 3.2086590e-003, -4.5878929e-002, -4.4181125e-002, 2.4715658e-002, + 7.9994617e-002, 5.2384101e-002, -9.5190518e-003, -3.7239495e-002, + 1.9883359e-002, 4.0730677e-003, -1.1677479e-001, -2.6374780e-002, + -7.9398641e-002, -3.5523570e-002, -1.8151457e-002, -3.7191923e-002, + -1.0831981e-001, 5.5198514e-002, 8.2754639e-002, -5.5996264e-002, + -6.5431323e-002, 1.6211145e-002, -6.8206035e-002, -2.9416838e-002, + 5.3307249e-002, 1.7472763e-002, 3.7312882e-003, -5.1498829e-002, + -6.2257189e-002, -2.9692831e-002, -2.4493198e-002, -2.7319437e-003, + 5.8815114e-002, -6.3249182e-002, 2.0730820e-002, 9.5563463e-003, + -2.2720249e-002, 2.5296131e-002, -1.9878781e-002, -3.4238910e-002, + -2.4677844e-002, 6.9236841e-002, -3.4704441e-002, -3.9318071e-002, + 5.7750083e-002, 3.4211433e-002, -5.0475709e-002, 2.5174181e-002, + -4.6996048e-002, 1.6221876e-002, -2.6204170e-002, 1.0630488e-002, + 4.5517196e-003, 8.3863415e-002, 4.8780028e-002, 2.3656142e-002, + -8.5385372e-002, -7.6803464e-003, 1.3583644e-002, 1.0156741e-001, + 1.1623477e-001, 3.0703572e-002, -1.8790478e-002, -2.5434562e-002, + 2.6081461e-002, -8.0973679e-002, 4.7528492e-003, 5.1709027e-002, + -2.7152886e-002, 3.3078882e-002, 9.5807816e-002, -1.6742069e-002, + 5.2847289e-002, 7.4190627e-002, 8.4661383e-003, -1.7127745e-002, + 2.5387176e-002, -2.4425657e-002, 1.0363293e-002, 3.2901544e-002, + 2.4049224e-002, -3.6364045e-002, -1.8374024e-002, 1.9170206e-002, + 3.5899319e-002, 2.2884438e-002, -4.2986435e-004, -3.7263522e-002, + -2.4107817e-002, -1.0160656e-002, -5.2244378e-003, 8.4713192e-002, + -3.3175117e-003, -6.8918873e-002, -1.0757423e-001, 1.9995005e-002, + 1.0018587e-002, -1.0031442e-003, -2.6646668e-002, -1.4140223e-002, + -1.9093589e-002, 8.2412659e-002, 5.0569231e-002, -1.9249580e-003, + 1.6857775e-002, 4.4516048e-002, 2.9634803e-002, -7.4675793e-002, + 6.9128286e-002, 1.7838807e-002, -1.5706998e-002, 2.3497836e-002, + -2.7256676e-002, -1.6892391e-002, -6.2498894e-002, 1.8814550e-002, + 6.7802861e-002, -4.5010985e-002, -7.9693020e-004, -1.6417629e-002, + -1.6571552e-002, -3.2170429e-002, -3.1451461e-002, 5.9127646e-002, + 4.2496269e-002, 5.8440594e-002, -3.7761868e-002, 1.4543937e-001, + 4.6291259e-003, -8.8031773e-003, -3.7376149e-002, 4.4444334e-002, + -3.2946165e-002, 2.7709611e-002, -4.6454274e-002, -5.4184987e-003, + 1.9082159e-002, 1.1097683e-003, -7.1272377e-002, 1.8112885e-003, + 2.6898226e-003, -3.0686681e-002, -1.9829229e-002, 3.0867601e-002, + -6.2758817e-002, -2.2846248e-002, 6.0573296e-002, 3.7414532e-002, + 3.6169907e-002, -2.3442499e-003, 2.5963449e-002, -5.0418274e-002, + -7.0858380e-003, 2.2793366e-002, -4.5274123e-002, 4.4264571e-002, + -5.5435866e-002, -6.0444822e-002, -4.4730927e-002, -2.6702128e-003, + 3.0721521e-002, 3.9441000e-003, 8.3714830e-002, -1.2824805e-002, + 8.9065027e-002, -4.1791317e-002, -9.6506591e-004, -2.2150161e-002, + -5.4266803e-002, -7.9756811e-002, 2.9723999e-003, -5.4652294e-004, + -8.3350132e-002, 1.0241351e-002, -9.6004506e-002, 1.1043342e-002, + -1.0036827e-001, 5.4166215e-002, 5.3435462e-002, 1.0602215e-002, + 2.9868847e-002, -2.4597423e-003, 1.1437786e-002, -4.2279579e-002, + -8.8732642e-003, -2.9476925e-002, 3.6694209e-002, 3.3176455e-005, + -7.3778252e-003, -3.9144818e-002, -8.3308862e-003, 4.6791993e-002, + -1.7037485e-003, 4.5892237e-002, 1.5597981e-002, -5.6087508e-002, + -4.1107610e-005, -1.0683418e-002, -2.6103976e-002, -8.4348999e-003, + 3.2082383e-002, 1.4938214e-001, 3.9964806e-002, -7.8254583e-003, + 4.6722479e-002, 9.3200915e-002, 2.4464994e-002, 8.3718835e-004, + 1.5250387e-002, -1.2400454e-001, -2.8639656e-002, -1.5938766e-002, + -2.5676238e-002, -5.1847115e-002, 1.7639941e-003, 4.9326733e-003, + -1.5856443e-002, -9.1307767e-004, -1.5554562e-002, 2.5941199e-002, + -2.9757970e-002, 1.2201936e-001, 8.0973215e-002, 1.7146982e-002, + 1.4736881e-002, 6.0467585e-002, 5.4698972e-002, 2.5876279e-002, + 1.0164087e-002, 3.8201202e-002, -6.0518215e-002, -1.3895876e-002, + 3.4728204e-002, -1.1711300e-001, -1.1216734e-002, -3.9340786e-002, + -2.7309751e-002, 5.9063770e-003, 2.0738498e-002, -1.3812395e-002, + -5.7982126e-002, -9.3680977e-002, -4.9666791e-002, -2.6529709e-002, + 5.2766295e-002, -2.1506279e-002, 9.3091830e-002, -3.5081971e-002, + 1.4449703e-002, 5.8269304e-002, 1.0329005e-001, -3.4264617e-002, + -1.9998674e-002, 4.0219340e-002, 2.0651887e-002, 5.2208561e-003, + 2.1487670e-002, 2.4204968e-002, 3.0673837e-002, -8.5293543e-003, + -5.3952186e-002, 8.9865270e-002, 1.0436717e-001, -9.7344984e-003, + -9.7393746e-003, 5.2162345e-002, 6.8291250e-003, -3.3926390e-002, + -3.5345884e-002, -2.1419424e-002, 2.4503709e-002, 4.4872568e-002, + -3.6811060e-002, 4.6761401e-002, 4.9242905e-002, 2.9535711e-002, + -7.5315008e-003, 8.4931550e-003, 1.3235857e-001, 8.4181971e-002, + -6.3526263e-002, 4.1655473e-003, 6.3417279e-003, -1.3065747e-002, + -5.7645495e-002, 1.8950407e-002, 3.6717958e-002, 1.2058270e-001, + 2.9698808e-002, 6.3712863e-002, -7.8927013e-002, -1.1092228e-001, + 7.5127329e-002, 3.6792936e-002, 1.8047426e-002, 1.6372435e-002, + -1.1358573e-002, -1.1114199e-002, -3.1011890e-003, 1.2753148e-001, + -1.3063278e-003, 2.9175038e-002, 1.0744000e-002, 8.5396074e-003, + 3.0555550e-002, 1.9846964e-002, -2.0887290e-003, 7.4108765e-004, + -6.8980202e-002, -6.9539294e-002, -7.1891402e-002, 2.6483042e-002, + -1.0604522e-001, 1.4946154e-002, -2.0885875e-002, 8.1620406e-002, + 2.2391518e-003, -4.3108583e-002, -2.8345459e-002, 2.1767961e-002, + -4.1509277e-002, 5.0332798e-002, -3.0747398e-003, 8.1280247e-003, + -2.8574311e-002, -3.7557299e-002, 4.6116535e-002, -7.5548776e-002, + 4.2485208e-002, -1.2735059e-002, -4.8713882e-002, 3.4080268e-002, + 3.8109829e-002, -7.9933234e-002, 5.0868655e-003, -3.6956005e-002, + -6.5608678e-003, 6.1566793e-002, 3.9747615e-002, -7.0776849e-003, + -1.0039001e-002, 1.0635588e-001, -3.2262564e-002, 6.6284637e-002, + -1.5602956e-002, 9.8826341e-002, 2.8765472e-002, 4.9988770e-002, + 2.8083188e-002, 3.7850396e-003, 3.8099036e-002, -6.2803094e-002, + -8.0284071e-003, 1.7678623e-002, 1.5384533e-001, 3.0604908e-002, + -2.2938654e-002, -6.6147444e-003, 8.0228244e-003, 6.3229249e-002, + 1.9888120e-002, -1.2483914e-002, -3.3020847e-002, 5.4285124e-002, + -2.2046600e-002, 7.6270296e-002, -3.8125981e-002, 4.2116981e-002, + 6.8249119e-002, 4.9569658e-002, -1.2181580e-002, -3.3950151e-002, + -3.3512560e-002, -4.0037716e-002, 3.8517111e-002, -3.0444190e-002, + -1.8608773e-002, 1.5643509e-002, 4.0250976e-002, 1.9776990e-002, + -3.1560979e-002, -3.1229293e-003, -2.5832801e-003, 2.7968081e-002, + -5.6392681e-002, 4.7360525e-002, 3.8619319e-003, 9.9891506e-002, + -1.8199130e-003, 3.1119514e-003, -9.1106029e-002, -1.4519250e-002, + 3.7010312e-002, -1.1213690e-002, 2.1256532e-002, -5.3987387e-002, + 5.7866117e-002, -4.2626330e-002, -3.3483769e-002, -5.2898877e-002, + -6.7225352e-002, 5.1417756e-002, 1.3929020e-003, 5.2022234e-002, + 1.0592230e-001, -6.8998892e-002, -7.3435118e-002, 3.0523655e-002, + -5.7162591e-003, -3.2771503e-002, 9.2367770e-003, -6.7747716e-003, + 1.0333099e-002, -1.5577876e-002, -6.7817347e-002, -6.6533637e-002, + -6.3984097e-002, 5.6216531e-002, 1.5579751e-002, -2.7104760e-003, + 2.0901166e-002, -1.1389339e-002, 2.4314314e-002, 9.6320945e-003, + -3.5425250e-002, 2.9816167e-002, -1.0582802e-001, 7.9031755e-002, + 5.8936482e-002, 4.9235081e-002, -2.0598427e-002, 2.7257218e-002, + 8.3473318e-002, 1.0047121e-001, 7.7116867e-002, 3.9518492e-002, + 6.3112265e-003, -6.8158283e-002, 8.2755720e-003, -1.4671408e-002, + 1.0928921e-001, -5.3580922e-002, -4.9000311e-002, 9.9920986e-002, + 3.5724099e-002, 3.0645803e-002, 2.1810846e-003, -3.5472111e-002, + -5.8047398e-002, 4.6521237e-002, 5.3030675e-002, 1.6183593e-002, + 4.7161315e-002, 1.5496372e-002, -2.6065334e-002, 5.4108355e-002, + 1.1113747e-001, -4.3256641e-002, 1.6776514e-002, -9.2777987e-002, + 1.0831881e-001, 2.6550297e-002, 5.6809097e-002, 4.1708284e-003, + -9.3188930e-002, -3.7166019e-002, 7.2595776e-002, -5.8774162e-002, + -8.4078954e-003, -8.3732623e-002, -1.4874571e-002, 4.1882968e-002, + -3.2712401e-002, -2.7953154e-002, 1.1313205e-002, 4.9524990e-002, + 2.0294329e-003, 3.8285760e-002, -1.4648978e-002, -3.5010308e-002, + 3.2018027e-002, -1.7151604e-002, -9.6536966e-002, -4.6726273e-002, + 1.7288478e-002, 1.5788740e-002, 5.2848095e-003, 4.1795447e-002, + 4.6331282e-002, 7.0958286e-002, -3.3004895e-002, -1.5541634e-002, + -6.4899819e-002, 4.4813983e-002, 2.1314689e-002, 2.5903378e-002, + 3.1412995e-002, 2.7655815e-002, 7.0916690e-003, 3.6198660e-002, + -2.9768515e-002, 5.8014817e-002, -5.8727472e-002, -1.2787628e-002, + 1.2855854e-001, -7.0659467e-002, -9.9019211e-002, -3.2969432e-002, + 3.1190632e-002, 6.5956753e-003, -1.6987652e-002, 4.0088843e-002, + -1.0857916e-001, 1.1385790e-002, 6.8736591e-002, 9.1859027e-003, + -2.2753959e-002, 6.5639798e-002, 4.4619698e-002, -5.3424194e-004, + 3.2475239e-002, -5.5982848e-002, -5.9416171e-003, -2.6137328e-002, + 4.7534015e-002, -4.3905563e-002, 4.7139261e-002, -5.0539423e-002, + -5.2509019e-003, -8.4340990e-003, 1.7266091e-002, -6.5954891e-002, + -1.1344100e-001, -2.5794929e-002, 5.3678895e-002, -1.0500180e-002, + 5.6847837e-002, -3.0370988e-002, -9.2272021e-004, -1.1716566e-002, + -6.7153889e-002, -4.9491944e-002, -2.7151079e-002, 4.9084906e-003, + -3.3137805e-002, -5.7067625e-002, -3.5807416e-003, -1.9012110e-002, + -2.3489886e-002, -6.6147208e-002, -1.9730903e-002, -5.7617192e-002, + -1.7743738e-002, 6.2747755e-002, 3.0746059e-002, -2.1208817e-002, + 1.0724738e-002, -9.5295048e-002, -8.3696293e-003, 2.8928609e-002, + 7.7547429e-002, -2.8433474e-002, 3.9000811e-002, 1.8594177e-002, + 7.3604845e-002, -4.0570215e-002, 4.0428101e-002, 5.2162122e-002, + 6.9720490e-002, 1.3917348e-003, -4.1967149e-002, 1.2040326e-002, + -9.0859684e-002, 3.0619641e-002, 7.9828021e-002, -9.5582231e-002, + 4.4977158e-003, 5.3050166e-002, -3.9280557e-002, 2.1825815e-003, + 2.6836286e-002, -1.0693240e-002, 1.2507669e-002, 8.7551531e-002, + -4.2170924e-002, 7.4021050e-002, -5.0257861e-002, 4.2440318e-003, + 2.8498362e-002, 4.0712278e-002, 1.3630666e-002, 3.7506385e-002, + 2.9021782e-002, 9.4969857e-003, 7.3668316e-002, -1.0430524e-002, + 7.8640111e-003, -1.9579539e-002, -1.3354780e-002, 4.6553749e-002, + -1.5359398e-002, -3.6958328e-002, 3.9183126e-002, 9.0763364e-002, + -5.7310947e-002, 6.8567752e-002, 3.0379537e-002, -1.7131879e-002, + -4.9845297e-002, 6.6236979e-002, -3.5226094e-002, 4.1319436e-002, + -1.0414640e-002, -7.3110434e-002, -6.7060543e-003, -2.2661736e-003, + 5.4214708e-002, -5.6731971e-002, 8.0169623e-002, 6.8708173e-002, + 5.1555900e-002, -2.3028383e-002, 2.3845756e-003, 4.3290569e-002, + -5.0088302e-003, -8.5495950e-003, -2.2929081e-002, -1.4934858e-002, + -1.9331882e-002, 3.1952820e-002, 2.2837591e-002, -6.5833588e-003, + 9.3564125e-002, -5.3479061e-002, -4.7856971e-003, 7.8291548e-002, + -6.4278719e-002, 5.2534052e-002, -8.4991604e-003, -2.5331472e-002, + -1.1670703e-004, -1.6794583e-002, -3.6946100e-005, 7.9706385e-002, + 1.8011858e-002, 4.5273832e-002, 1.9568899e-002, 4.5061760e-002, + -2.6682717e-002, -1.8814340e-002, -8.5389413e-003, -4.6897567e-002, + -7.9016702e-002, -2.1058150e-005, 5.8849807e-002, -2.5161493e-002, + 6.0245233e-002, -8.2636501e-002, -6.9368318e-002, -1.5064100e-002, + -3.4932382e-002, 4.4579915e-003, -5.9080060e-003, 8.9889824e-002, + 8.1831512e-002, 1.6338686e-002, -5.4180978e-002, -5.3267629e-003, + -2.8476462e-003, 1.7450439e-002, -2.4213885e-002, 7.1383978e-003, + -8.5575620e-002, -9.7688859e-002, 5.4026353e-002, 6.8738257e-002, + -3.1782928e-002, 2.9354257e-002, -1.6843133e-002, -3.4228093e-002, + -4.9087072e-002, -8.8609944e-003, -4.2395609e-002, 6.0299570e-002, + -3.9805763e-002, -3.9969178e-002, -1.0972287e-002, -3.1903343e-002, + -2.3021388e-002, 9.5381824e-002, -3.8131819e-002, -2.7944014e-002, + 7.9797347e-002, 1.5055618e-002, -6.0223999e-002, 2.1349786e-002, + 1.4010766e-001, -7.0365161e-002, 9.5470745e-002, -5.5280731e-002, + 9.0676740e-002, 8.0165216e-003, 3.8071961e-002, 3.4452332e-002, + 1.2608974e-001, 7.4568874e-003, 2.2179776e-002, -5.1449927e-003, + -1.5259731e-003, 2.4388062e-002, 2.8159902e-002, 6.3528510e-002, + 7.2459203e-002, -6.6724867e-002, 4.9840343e-002, 1.0288982e-002, + -3.7523292e-003, 2.4660586e-002, 1.0905181e-001, 2.0534327e-002, + -1.6624929e-002, -4.7427409e-002, 7.1932143e-002, 2.4785276e-002, + -1.2656870e-002, -4.3142163e-003, -8.5065080e-002, 1.1401731e-002, + 4.2186129e-002, 1.7953548e-002, -9.5471407e-003, -2.7867915e-002, + 7.5845281e-003, 3.6129267e-002, -1.2896952e-001, -1.4991468e-002, + 3.9146522e-002, -7.6952239e-002, 2.3154057e-002, 3.2631339e-002, + 3.6032235e-003, 2.4348659e-002, -5.0004772e-003, -3.9711602e-002, + -2.5957781e-002, -8.4744957e-003, -6.8234352e-002, -2.8744676e-002, + 2.3341254e-002, 4.3007108e-002, 1.2712390e-002, 2.8427956e-002, + -1.5923634e-002, 4.4011784e-002, -1.5711433e-002, 4.4606989e-002, + -1.7483925e-002, -1.2423254e-001, 6.2454024e-003, 6.6168154e-002, + 2.1085300e-002, 9.0749477e-003, -2.0534154e-002, 6.9048807e-002, + -9.2613632e-003, -2.7695812e-003, -4.1107764e-002, 2.1935377e-002, + -8.4933698e-003, 7.9754080e-002, 2.8930188e-002, -1.5746665e-002, + -5.5368360e-002, 4.8760088e-002, -2.3262447e-002, 1.9970261e-003, + 1.7181455e-002, -2.6662315e-002, 2.9476649e-003, 3.6398404e-002, + -1.0718664e-002, -1.3419702e-002, -1.4303328e-002, -5.1753021e-002, + -8.8633620e-003, -6.6385388e-002, -1.8360778e-002, 4.0996838e-002, + -2.1821426e-002, 1.9446502e-002, 7.8258137e-002, 1.1935359e-003, + 1.2671015e-001, 5.4051017e-003, 8.9554422e-002, 5.1612989e-002, + -5.9613506e-002, 1.0465684e-001, 3.5325477e-002, -7.4798564e-002, + -6.6674861e-002, 2.8210488e-002, 3.9519939e-003, 4.2419282e-002, + 4.8733699e-002, 4.9734069e-002, -8.2263082e-002, -1.0431084e-003, + 6.5382265e-003, 2.7104024e-002, -6.1504411e-002, -1.1030328e-001, + -1.1088406e-001, 4.6883361e-002, -4.8929726e-002, -1.1842483e-002, + -3.2343663e-002, 2.8083963e-002, 6.5341653e-003, 6.4197433e-003, + -5.1922064e-002, 5.9610106e-002, -3.0492144e-003, -2.0038627e-002, + 6.6832718e-003, 3.5125897e-002, 4.9157559e-002, -1.1599903e-002, + -8.6904299e-004, -8.6599262e-002, 6.2299405e-002, 9.4208251e-003, + 7.3197513e-002, 7.5060589e-003, 1.5188546e-002, 8.4467481e-003, + 1.6309540e-002, -3.6380831e-002, -1.5684802e-002, -1.2750901e-004, + -3.9540578e-002, -2.6086647e-002, 5.0982353e-002, -3.8994541e-002, + -7.8152817e-002, -2.1288151e-002, 3.2125646e-002, -4.9028664e-002, + -5.2017685e-002, 4.8786860e-003, 8.7710015e-002, 3.7430190e-002, + 3.6962894e-002, -1.4930609e-003, -6.6490921e-002, 1.1278370e-001, + 1.6259975e-002, -1.1381280e-001, 3.0235399e-002, 7.9035487e-004, + -3.8638327e-002, 4.3147897e-002, 8.8130106e-002, -1.4913096e-002, + 3.9678262e-003, 3.6966598e-002, 6.3040724e-002, -4.9035837e-002, + -3.0293084e-003, 7.2467143e-002, 3.3553250e-003, 1.1619490e-002, + 2.5048420e-002, -1.3875509e-003, 4.3384801e-003, -1.9225635e-002, + -3.4205233e-002, -6.1043519e-002, 2.7920233e-002, 1.5845125e-002, + -3.1788360e-002, 5.5265277e-003, -8.8053862e-003, 5.1596808e-002, + -2.6382888e-002, 1.3528723e-002, 9.7188179e-004, 4.5393222e-002, + 1.4350879e-001, -8.3970455e-002, -5.3058686e-002, -1.7168532e-002, + 5.2123339e-002, -1.0874975e-001, -8.4692593e-002, 2.0470836e-002, + 1.3786291e-002, -4.3504389e-002, -5.5751144e-003, -9.6933329e-002, + -6.0058163e-002, -5.0236621e-002, 2.1957145e-002, 4.6918366e-002, + 5.4757597e-003, -1.2851732e-001, 5.3503448e-002, -7.8722951e-002, + 2.5143808e-002, 3.8130327e-002, 1.1190727e-001, -2.2211112e-003, + 3.4395397e-003, -6.6144203e-002, -1.3250907e-002, 1.4285490e-002, + -4.7426798e-002, 4.3459402e-002, 1.9567583e-002, -3.2933903e-002, + 7.9884585e-003, -3.6921691e-002, -5.2601711e-002, -3.7588436e-002, + -5.7858993e-002, -3.9355983e-003, -1.9668686e-002, 1.7962753e-002, + 7.1980552e-002, -1.2059618e-002, 3.4579944e-002, -1.8839556e-002, + -1.7604317e-002, 7.8825547e-002, 8.4168663e-003, -1.6198144e-002, + 7.7326058e-003, -1.4566324e-001, 7.0918323e-002, 2.7943557e-002, + 1.5952735e-002, 5.3303709e-002, -8.3804957e-002, -6.6985571e-002, + -1.3191151e-002, -4.2864677e-002, -5.9477390e-002, 4.9906263e-002, + 4.4401362e-002, 4.7588494e-002, 2.5451538e-002, -3.7015590e-002, + 1.8897192e-002, 8.5686801e-002, 5.1878702e-003, 4.3894402e-003, + 1.8570041e-002, 5.5022301e-002, -4.0645765e-002, -5.0799009e-002, + -2.3060691e-002, -5.3046714e-002, -2.9921308e-002, -4.2374683e-002, + -2.0684933e-003, -3.1561538e-002, -2.6520727e-002, 2.2842715e-002, + 4.7241369e-002, 1.5938051e-003, -3.1393040e-002, -2.2067479e-002, + 1.3659794e-002, -3.1810808e-002, 5.2038109e-002, 5.5282333e-002, + 7.3406997e-002, -8.5669402e-002, 3.0521734e-002, 1.3090940e-005, + -4.7165506e-002, 4.8765186e-003, -2.9407043e-002, 1.9843096e-002, + -2.7632043e-002, 1.4379705e-002, 3.2263917e-002, 5.4751887e-002, + -3.4032149e-002, -9.9526757e-003, 2.5634676e-002, 2.5738815e-003, + -5.5256747e-003, 4.1466343e-002, -2.8007927e-002, 8.2962880e-002, + 5.3608424e-002, -6.6232246e-003, -1.1529210e-001, -3.5498392e-002, + 2.0099626e-002, 4.5948750e-002, 1.7926143e-002, -5.9056747e-002, + -9.6797251e-002, -2.4358114e-002, -6.1063654e-002, 2.0158520e-003, + 8.7163319e-002, -8.9921518e-002, -9.8666202e-003, -9.3794619e-004, + 4.5791584e-002, 8.5254269e-003, 3.7372616e-002, -5.3279812e-002, + 7.8030247e-004, 1.1843336e-002, -7.4212330e-002, 1.1414296e-001, + -4.1485582e-002, -2.2089769e-003, -6.1672113e-003, 9.8929283e-003, + -7.8207292e-002, -4.8161136e-003, -7.2059255e-002, -3.5922784e-002, + -1.9786275e-002, 1.5833828e-002, 5.2545743e-002, 9.9962946e-003, + 1.0473584e-001, -2.6380727e-002, 6.2664438e-002, -1.0710067e-002, + -5.6621248e-002, -6.2640861e-002, 2.4906349e-002, 4.9470811e-002, + 1.5582134e-002, -1.1034795e-002, 3.7179257e-002, -7.9083587e-002, + 3.1086424e-002, -1.3685837e-002, -3.7552842e-002, -2.9528094e-002, + -1.7008381e-002, 3.7137697e-002, 4.5722891e-002, -6.7639973e-002, + 1.0411136e-002, -9.5948463e-002, -7.6491282e-002, 1.0515447e-001, + -7.2395284e-002, 2.6384356e-002, -9.7803448e-004, -1.2178894e-002, + -4.3298010e-002, -1.4118456e-002, -6.3811250e-003, 3.5987445e-002, + -8.0165530e-003, -2.0932915e-002, -1.3187860e-002, -4.3430054e-002, + -3.0586505e-002, 9.8974586e-002, 5.5685044e-002, -1.1098877e-001, + 3.4420705e-002, 2.6632342e-002, 2.8768821e-002, -5.6656185e-002, + -2.4035643e-002, 4.4599132e-002, 5.2401286e-002, -3.1991215e-002, + 3.8827361e-003, 4.7437513e-002, 6.7940056e-002, -2.3003581e-002, + -6.3955657e-002, 1.0081807e-001, -4.4211577e-003, -4.1263060e-002, + -5.8970926e-002, -2.4349696e-002, 3.2867209e-002, -2.4008048e-004, + 6.9810225e-002, 1.5450610e-002, 2.3319726e-002, -1.0005801e-001, + 6.2685066e-003, 3.3200964e-003, -6.0496946e-002, -8.8884008e-003, + 1.6134449e-003, -7.2506916e-002, 1.8835241e-003, -9.1372012e-003, + -3.9166883e-002, -3.0408037e-002, 1.3371700e-001, -8.4833604e-002, + -2.0082991e-002, -6.7833227e-002, 2.8939942e-002, 3.2760884e-002, + -1.1389661e-004, -4.3484404e-002, -5.9579661e-002, 8.5932179e-002, + -1.2312202e-001, 4.5080645e-002, 7.8749960e-002, 8.5343585e-002, + 8.3452328e-003, 3.8885343e-002, -5.4756855e-002, -5.2942923e-002, + -8.5138845e-003, 6.6560990e-002, -5.8418572e-002, 2.3870988e-002, + 1.8931370e-002, 5.9471104e-002, -8.6742031e-002, -4.4123808e-002, + 1.7375058e-002, -6.3987147e-002, 6.3031471e-003, -5.2766788e-002, + 1.6462106e-001, 3.4654166e-002, 1.8664640e-002, 2.0932790e-002, + -4.3515283e-003, -2.2953377e-002, -4.1758215e-002, 5.7430654e-002, + -5.3591655e-002, -4.6850896e-002, 4.1910973e-002, 1.1157103e-004, + -2.2629752e-002, 6.5200275e-002, -2.2924410e-003, -1.0436647e-002, + -5.9483696e-002, -3.6216756e-003, -1.3438807e-002, 1.2187937e-002, + -1.3021007e-002, 3.3878909e-002, -2.2899083e-002, -2.3054076e-002, + 4.7348343e-002, 2.8499078e-002, -1.7052032e-003, -1.3753287e-002, + -2.9609163e-002, -1.3025597e-002, -6.1569574e-003, 8.8234767e-003, + -4.4598847e-002, -7.8588213e-002, -1.8194816e-002, -6.0633228e-002, + 3.4385559e-003, 5.9361395e-002, 8.2140593e-002, 1.4939745e-002, + -3.1639344e-002, -1.2825312e-002, -3.5217707e-002, -1.9635520e-002, + 3.1739325e-002, -2.7107236e-002, 4.2299225e-002, 1.9675302e-002, + -2.6289167e-002, -3.7438885e-002, -6.5984833e-002, 4.2748691e-003, + -3.3482818e-002, -2.6690228e-002, -3.6330879e-002, -4.4149481e-002, + -1.5138292e-002, 2.8942426e-002, -1.6976163e-002, -5.9543856e-002, + 7.4778255e-002, 2.8451870e-002, 6.2164171e-002, -4.0415989e-002, + -4.2244492e-002, 4.6573272e-002, -1.8520798e-002, -6.9907182e-002, + 1.1254468e-002, 7.4484796e-002, 2.3774997e-003, -1.9725799e-002, + -1.1798209e-002, -4.5521440e-002, 2.7514728e-002, -7.2190342e-002, + -2.9948385e-002, -4.6214661e-003, -7.9002112e-004, 5.0066640e-002, + 5.3029490e-004, -1.8871680e-002, -1.9149132e-002, 1.4202910e-002, + 3.0816823e-002, -9.0922658e-002, 2.0531126e-002, -6.7237163e-002, + 3.5264507e-002, -4.3345885e-002, 4.3736504e-002, -5.0592953e-002, + -1.9560698e-002, 7.4759581e-002, -1.5500722e-002, -3.2266454e-002, + -1.4974813e-002, -3.1814004e-003, 7.1627759e-002, -1.0014999e-002, + -4.4711458e-002, 8.7059742e-002, -6.6573462e-002, 6.3231174e-002, + -3.9306487e-002, -2.8763870e-002, -3.4594112e-002, -1.7333119e-002, + 2.7978317e-002, -4.4558274e-002, 4.0316504e-002, -9.8056766e-003, + -1.1169830e-001, 2.6367365e-003, -6.3107346e-002, -4.7852804e-002, + 1.4822515e-002, -5.5825883e-002, 8.4652163e-002, 3.7276497e-002, + 5.8380260e-002, 1.0308762e-003, -1.7541914e-002, -8.1294365e-002, + 2.6500601e-002, 1.1576202e-002, -2.8475597e-002, -3.6427135e-002, + 1.0486963e-002, 3.5852026e-002, 1.7207452e-002, -4.2250927e-002, + 9.2791032e-002, 2.0848079e-002, -1.0474350e-002, -1.8906142e-002, + -3.9285383e-004, -1.0622005e-001, 3.0895699e-002, 7.2310785e-002, + -4.9338252e-002, -6.6112754e-002, 1.7508514e-002, 1.1321926e-003, + -2.4713477e-002, -4.2692403e-002, 3.6496772e-002, -8.7503250e-003, + -2.3071223e-002, 6.0697872e-002, -1.6211612e-002, 2.7467415e-002, + -2.3241079e-002, 7.6276171e-003, -6.3827211e-002, 6.7257864e-002, + 2.2947393e-002, 1.7785758e-002, 4.1818868e-003, 3.5410854e-002, + 1.0202987e-003, -7.0561943e-003, -2.0778987e-002, 3.2302118e-002, + 4.8279751e-003, -2.3094511e-002, -5.9461961e-002, 4.2486021e-002, + -8.3970460e-002, 3.1847805e-002, 1.4792567e-002, 8.3035216e-002, + -1.9097569e-002, -3.7566345e-002, -1.9294024e-002, -2.9735991e-002, + -1.6259656e-002, 8.7230220e-003, 1.5761104e-002, 1.1869692e-002, + 3.3119792e-002, -1.4862967e-002, 1.1372784e-002, -3.2009087e-002, + -2.9738311e-002, 7.4243184e-002, 4.4110110e-002, -2.6555813e-002, + -1.4281194e-002, -3.1948659e-002, 2.7573051e-002, 4.3762921e-003, + -1.5129696e-002, -1.7735857e-002, -4.4445686e-003, -5.8616688e-002, + -2.7569930e-002, -4.5140779e-002, -7.2200604e-002, 1.3667304e-002, + 5.7192972e-002, -6.3690024e-002, 5.5174808e-003, -5.8892530e-002, + -3.6233013e-002, 8.6180660e-002, -6.4381045e-002, 8.1908618e-002, + -8.2615195e-003, -8.7344886e-002, -3.6686884e-002, -4.3487249e-002, + -2.7761943e-002, -4.3954059e-002, 1.0761718e-001, -3.3942906e-002, + -5.6751929e-002, 5.3761364e-002, -8.2361460e-002, -2.0107493e-002, + -1.3391457e-001, -2.7865675e-002, -3.7665218e-003, 2.6626941e-003, + 2.1434427e-002, 4.9598442e-002, -9.1795559e-002, 5.6763841e-002, + -7.2345509e-002, 4.3385691e-002, -6.4303252e-002, -2.6067521e-002, + 3.1430980e-002, -4.8380081e-002, -1.7143742e-003, 3.8524956e-002, + 4.7310190e-002, -8.4985104e-003, 2.5096835e-002, -2.2478417e-003, + 4.8128123e-002, 3.7762949e-002, 1.4420063e-003, -4.4095518e-002, + 4.5456933e-003, -3.2426183e-003, -1.2533115e-002, 4.7767545e-002, + -2.8620801e-002, 7.8751032e-002, -1.6406002e-002, 6.0648681e-002, + -5.7970442e-002, -1.7637331e-002, -6.9358645e-002, -3.7997615e-002, + 3.9156091e-002, 1.1321921e-001, 8.4415942e-002, -1.1387462e-002, + -1.6199663e-002, -2.9916549e-002, -2.7917984e-003, -7.9695543e-002, + 8.2671498e-002, 1.3319799e-002, -1.7930240e-002, -9.1601668e-003, + 4.1019127e-002, 7.5932944e-002, 1.0036314e-001, 3.8966354e-002, + 4.6995786e-003, -4.5149567e-002, -4.8486656e-002, -4.1927255e-002, + 1.1311800e-002, 3.6819401e-002, 1.7973596e-002, 6.7898952e-003, + 1.5963322e-002, -4.9877456e-002, -3.7059174e-002, 1.4450399e-002, + 2.0093318e-002, 3.4367981e-002, -5.5058558e-003, -6.7143431e-002, + -4.8644499e-002, -6.9472431e-002, 2.5107776e-002, -4.6781145e-002, + -2.7352285e-002, -4.7986822e-002, -7.1934644e-003, -2.3173127e-002, + 6.4055565e-002, -1.9370286e-002, -4.9411717e-003, 3.4615802e-002, + -5.2643368e-002, -3.4227554e-002, 5.9084487e-002, -6.7507249e-002, + 1.4470533e-003, 7.4639509e-002, -3.9766965e-002, 3.5756960e-002, + -7.0471549e-003, -3.9222635e-003, 7.3001614e-002, 2.3197043e-002, + -2.5701022e-003, -6.5877930e-002, 2.7559657e-003, 1.9592050e-002, + -9.3462547e-002, -1.0871925e-002, -2.9680792e-002, -1.9738425e-002, + -2.7152604e-002, 2.3876803e-002, 4.5884118e-002, -2.4799389e-002, + -2.0581584e-002, -5.4267497e-002, -2.6460954e-003, 5.1362202e-002, + -6.9012380e-002, 4.4005296e-002, 6.3975781e-002, -2.6047622e-003, + 1.2042036e-002, 1.6037381e-002, -5.1284209e-002, -4.2194785e-002, + -1.6515324e-003, 2.8902550e-002, 2.6850380e-002, -6.0423448e-002, + 5.8605766e-003, 1.2158635e-002, 7.2552454e-002, 3.1314062e-002, + -9.3072204e-002, 3.1162922e-002, 1.3286605e-002, 3.9595454e-002, + 4.0202073e-002, 6.5767605e-002, -1.2155519e-002, 3.3751439e-002, + -3.2171914e-002, 4.8066982e-002, -3.9282293e-002, 8.3241192e-003, + 6.9639890e-002, 2.7334229e-002, -1.5479579e-001, 1.6788538e-002, + -3.1497022e-002, -4.2282993e-002, 6.3590085e-002, 2.5116069e-002, + -8.6396723e-003, 3.3260424e-002, -8.4721611e-002, -3.3390999e-003, + -1.1246017e-001, 4.1668358e-002, -5.8633451e-002, 1.8811584e-002, + -2.6955831e-002, 3.4502149e-002, -1.5140931e-002, -1.1615508e-001, + 1.9473941e-002, -2.4164678e-002, -4.7663500e-002, 2.5149605e-002, + -4.2667606e-002, -3.0691488e-002, -6.2397484e-002, -2.2317443e-002, + 7.1583564e-002, -1.7501358e-002, -7.4035381e-003, 3.6729476e-002, + -1.1245837e-002, 2.6520782e-002, -8.1593552e-002, -6.9408470e-002, + 1.4619786e-003, 3.8453478e-003, -6.3397206e-003, -6.0058523e-002, + -4.8251718e-003, 3.8074781e-002, -7.8163411e-002, 2.1385600e-002, + -2.1922130e-002, -4.0160455e-002, -6.8293755e-002, 9.0554557e-004, + 2.6664980e-002, 7.1501149e-004, 2.0586511e-002, 3.8317298e-002, + 1.2622402e-002, 3.0425320e-002, -5.9992562e-003, -3.2448647e-002, + -8.4599232e-002, 2.0966498e-002, 3.0616978e-002, -4.1909029e-003, + 4.3755380e-002, 3.5853709e-002, 8.2636139e-002, 5.2616538e-002, + -4.4023308e-002, -4.5906585e-002, 2.5247372e-002, 1.5587727e-002, + -2.8171046e-002, -3.2571994e-003, 3.1224580e-002, 2.3534457e-002, + 2.4495916e-002, 2.3711856e-002, 4.4990479e-002, 2.4656755e-002, + 1.2819956e-002, 5.7528241e-002, -6.3140487e-003, -9.8533686e-002, + -5.9046861e-002, 4.5919961e-002, 4.9303678e-002, -5.1366348e-002, + 2.4237326e-002, -3.5253937e-002, 7.6315728e-002, -6.2809404e-002, + -1.1060411e-002, 1.2072602e-002, 8.1692168e-002, 8.2459510e-002, + 1.2056340e-003, -1.0799649e-001, -7.2058599e-002, 5.1223849e-002, + 1.1635586e-001, 6.3237829e-002, 4.1510274e-002, -2.9788578e-002, + 4.8771019e-002, -5.6674600e-002, 1.9869930e-002, -1.2678819e-002, + -2.7919754e-002, 2.8331693e-002, 3.1691790e-002, 1.1562239e-002, + -2.8202192e-002, 2.1270404e-002, -4.2846202e-002, -3.2805821e-002, + 1.5184402e-002, 5.4017276e-002, -7.4480916e-003, 3.9322390e-002, + 8.8590506e-002, 1.8869046e-002, -4.8504749e-002, 1.9943452e-002, + -4.0731200e-002, -1.2975217e-003, -1.6745164e-003, 4.7281664e-002, + -2.7791569e-002, 8.0857121e-003, -4.8178120e-002, -5.8281241e-002, + -3.2593209e-002, -2.1746188e-002, -1.0017483e-002, 2.9529554e-002, + -1.4875157e-002, -4.5985303e-002, 4.9477795e-002, -2.8808805e-002, + -1.3613209e-002, -3.2427996e-002, -7.3709623e-002, 2.9008787e-003, + -2.4949574e-002, 2.9417830e-002, -5.0911040e-002, 7.2199223e-002, + -3.8502572e-003, -9.9986041e-002, -1.0110846e-001, 2.7240523e-002, + 3.7231607e-004, -4.8403626e-002, -4.2828865e-002, -4.0941132e-002, + 2.1262003e-002, 2.8579653e-002, -3.8107106e-002, -2.5403299e-002, + 4.0409634e-002, -1.3506783e-001, 6.7020935e-002, 7.6919909e-002, + -6.2598829e-002, -4.4526445e-002, 1.2270630e-001, 2.3974241e-002, + -3.6434038e-003, 4.6607563e-002, 8.1524293e-002, -3.0664049e-002, + 4.4022028e-002, 8.6563738e-002, 6.5752991e-002, -6.7108146e-002, + -1.0342413e-001, -1.8539076e-002, -3.0153611e-002, 6.7396260e-003, + -4.4950103e-002, -1.2515800e-003, 3.0646680e-002, 5.5510478e-002, + -5.2142526e-002, -6.6687624e-002, 1.5134636e-002, 1.3498064e-002, + -5.4450472e-002, -8.9529836e-003, 3.0094154e-002, 3.2202481e-002, + 1.3948693e-002, -6.7197034e-002, -8.5015250e-002, 6.3266660e-002, + 4.2798636e-002, -2.0333357e-002, -4.0383900e-002, -1.3841616e-002, + 6.3539401e-002, -1.4953539e-002, 7.3749647e-003, 4.6124894e-002, + -3.3099545e-002, 1.6994609e-003, 3.1756119e-002, 1.1361146e-001, + 2.3601853e-002, -6.1163866e-003, 1.4640892e-002, -1.3002994e-001, + -5.9991837e-002, -2.2185968e-002, -3.5202454e-003, -3.2725772e-002, + -1.6788319e-002, -6.9143762e-002, -3.0097649e-002, 1.2429939e-001, + 3.2580395e-002, -5.0115073e-002, 5.0306592e-003, -4.4954061e-002, + 3.6014498e-002, -1.3451790e-002, 1.6399117e-002, 1.3923416e-001, + -4.9725951e-003, 6.2052260e-003, -1.1645022e-001, -3.5608026e-003, + 6.4542089e-002, 2.5646928e-002, -3.9385217e-002, 3.4619781e-002, + -5.5728973e-002, -4.1560782e-002, 1.8601185e-003, -7.7632154e-002, + -1.1198136e-001, 1.7871366e-003, 3.2749909e-002, 6.3402834e-002, + -5.4553077e-002, -5.3258342e-002, 3.3343720e-002, 5.6556702e-002, + -2.8265688e-002, -2.3372050e-002, -7.1953496e-002, 4.9907070e-002, + -2.6195346e-002, -3.1269328e-002, -2.2738778e-002, -3.6952069e-003, + 2.3055605e-002, 3.7713246e-002, -3.3123125e-002, 6.3977198e-002, + 1.2888268e-002, -6.4863602e-002, -4.6370451e-002, -1.2762725e-002, + -1.1385579e-002, 5.3278522e-002, 4.0903155e-003, 2.4856544e-003, + 2.6887809e-002, -3.6020834e-002, 1.7437443e-002, 2.0139602e-002, + 2.9239905e-002, 3.8038669e-002, -9.6656754e-002, 1.5283078e-002, + -9.4684237e-002, 3.5509017e-002, -2.3867173e-002, 4.9278727e-003, + -3.9793551e-002, -1.1285602e-002, -1.1809578e-002, 2.7623350e-002, + 2.1829332e-003, 2.9116516e-002, -2.3743110e-002, -3.6766547e-002, + 2.0571789e-002, 5.6084571e-002, 1.3024358e-001, -7.5886589e-002, + 2.7947551e-002, 2.3155403e-002, -3.1278004e-002, -1.4436652e-002, + -2.4776289e-002, -6.8540264e-003, -1.0098350e-002, -8.8675200e-002, + 1.5859746e-001, -9.1002037e-002, 1.2604720e-002, -1.0483836e-002, + -2.8280415e-002, 7.1881441e-002, -5.6741201e-002, 6.6804943e-002, + 6.1990105e-002, 8.1565279e-002, 2.2720394e-002, -1.2405569e-002, + 7.1876233e-002, -1.0267524e-001, -3.0958839e-002, 7.9476530e-002, + 2.1440879e-002, -3.6594375e-002, 1.2693478e-002, -3.5996147e-002, + -4.4807775e-002, 3.0175162e-002, 6.0207188e-002, -4.4551692e-003, + 5.2444239e-002, -6.7182348e-002, 3.4282089e-002, 1.2050117e-002, + 6.7343302e-003, -3.4597852e-002, 6.2799536e-002, 9.0535361e-002, + 4.6750855e-002, 4.5616156e-002, -4.7775494e-002, 3.3437120e-002, + 6.3247569e-002, -2.5086044e-002, 6.0392800e-002, -1.0344192e-001, + 1.0532757e-002, 8.0919299e-003, -2.0549100e-002, 7.9851230e-002, + 5.9509621e-002, -1.0304151e-002, -3.6671778e-003, 1.0290329e-002, + -3.6286054e-002, -1.1732592e-002, -8.4237566e-002, 3.3390752e-002, + -5.1523669e-002, -7.7703392e-002, 7.2951732e-002, 5.5907824e-002, + 5.5894272e-003, 5.4254663e-002, 5.1024916e-002, -5.6879548e-002, + -6.2027367e-002, -5.6508306e-002, -4.3199186e-002, -7.0858160e-002, + -2.7514315e-002, -1.0304944e-002, 9.7007038e-004, -6.7224049e-003, + 9.2200691e-003, 3.8879401e-003, -6.5395433e-002, 6.6739257e-002, + 6.1434975e-002, -7.8933867e-002, -8.4834779e-002, -2.7405250e-002, + -2.6177970e-002, -3.3974921e-002, -3.5379505e-003, 5.0807223e-002, + -6.0485730e-002, -7.1839018e-003, 2.6693750e-002, 5.3186567e-002, + 1.4183779e-002, -2.2116051e-002, -1.3741848e-002, 6.1342417e-002, + -3.7993387e-003, 3.7238204e-002, -1.0739599e-001, -1.4549117e-002, + 4.0386015e-002, 1.2569153e-002, 3.5445067e-002, -3.8437920e-002, + -1.4546469e-002, 2.3252293e-002, 5.8740276e-002, -4.5320281e-002, + 4.8086444e-002, -4.6158419e-003, -5.5124482e-002, -3.3884263e-002, + -1.6266463e-002, -1.6153097e-002, -7.1902422e-004, 4.7423985e-002, + 4.5522942e-002, 5.8189486e-002, -1.6178881e-002, -8.5068904e-003, + -2.1481593e-002, 5.9052882e-002, 7.6940824e-002, -4.1182363e-002, + 9.3889318e-002, 3.2541071e-002, -5.0966470e-002, 1.1989934e-002, + 1.3485465e-002, 1.1716420e-002, -3.3544036e-002, 1.0756654e-001, + 2.3665782e-002, 5.1632941e-002, 3.3393177e-002, 2.6965276e-002, + -9.3765636e-003, -4.0374893e-002, -7.6274872e-002, 1.8358287e-002, + -5.4971891e-002, -6.1388507e-002, 4.0747836e-002, -3.0364737e-002, + -3.8176810e-002, 2.1957238e-003, 1.5046955e-002, -4.6671984e-003, + -3.7148168e-002, -3.7455685e-002, 3.7180183e-003, -8.5869921e-003, + 3.5823221e-002, 2.0854178e-002, -5.6165218e-002, -9.2879840e-002, + 1.4952542e-002, -1.6637472e-002, 2.7553373e-002, 1.1493587e-001, + -3.5352769e-002, -6.9065396e-002, 7.7929176e-002, -5.9205594e-002, + -1.8989624e-002, 1.1827864e-002, -3.8579019e-002, 1.6537438e-002, + -4.5152596e-002, -8.0801346e-002, -3.4708707e-002, -2.0902185e-002, + 3.5484478e-002, -7.2048970e-002, 3.9760809e-002, -2.1048159e-002, + 2.9412146e-003, -1.2228266e-002, -1.0549788e-002, -1.3705371e-002, + -4.2308328e-002, -8.5322508e-002, 5.6722120e-004, 3.8264621e-002, + 4.3257303e-002, 2.8754160e-002, 3.3445727e-003, 2.9282907e-002, + 4.8556817e-002, -3.3795246e-002, 4.0977665e-002, 3.6274969e-002, + 3.3552753e-002, 2.9872002e-002, 6.3307072e-002, 1.4992383e-002, + -5.8203262e-002, -3.0168145e-002, -3.2352139e-002, 7.6165643e-002, + 7.1774864e-002, -1.7731640e-002, 3.7646033e-002, 5.8535492e-003, + 8.3961663e-002, -7.6352210e-003, -3.6557713e-003, -6.1713535e-002, + -4.8057903e-002, -4.6264109e-002, -3.4792201e-002, -2.7416585e-002, + -1.3744116e-003, -1.9306191e-002, -5.0539515e-002, 2.7677455e-002, + -2.2617917e-002, -8.4784776e-002, 7.3259229e-002, 5.9548509e-002, + -7.2282648e-002, -5.0784237e-002, 9.1028580e-002, 1.6823871e-001, + 4.3922313e-002, 2.0660018e-002, 1.2905801e-003, -5.9644574e-003, + -6.6967719e-003, 2.1111482e-002, 4.5767224e-002, 1.9131948e-002, + 2.6813139e-002, -4.6825266e-002, 1.1768354e-002, -3.0426377e-002, + -7.0347178e-003, -7.6017599e-002, 2.1078534e-002, -9.1780175e-002, + 2.7352079e-002, 2.7780454e-002, 8.3826886e-003, -1.5967673e-002, + -1.0580313e-002, 3.8124734e-002, 3.6951219e-002, -2.5011240e-002, + 2.9019645e-002, 3.3574092e-002, 1.2199007e-002, -6.3328122e-002, + -1.0293542e-001, 6.2316941e-002, -1.1529230e-003, 1.0592972e-001, + -2.3803313e-002, -4.2884377e-002, -2.3136181e-002, 9.6100002e-003, + -3.8942235e-002, 1.0613309e-001, 1.1584978e-002, -2.8945108e-002, + 1.1978745e-001, 3.3535039e-002, -3.3192905e-002, 6.4322894e-002, + 4.3326082e-002, 2.2661431e-002, 2.1067896e-002, -1.6775258e-002, + -1.1513173e-001, 1.6050052e-002, 3.6844183e-002, 2.9072793e-002, + -6.7255761e-002, 5.7102385e-002, 7.0546617e-002, -2.0826937e-002, + -5.7583856e-002, 3.0146035e-002, -1.9649341e-002, 5.1108010e-002, + -1.2049234e-001, 9.1604975e-003, -4.4366320e-002, 1.0940581e-002, + -7.4110213e-002, 1.0027252e-001, 8.3559986e-002, -5.0547965e-002, + 3.0123395e-002, 7.0196532e-002, -8.3469946e-002, 3.3882963e-002, + 6.1607561e-002, 4.4793665e-002, -9.6577712e-002, -5.0411980e-003, + -1.5066601e-002, 2.4904787e-002, 1.1340361e-002, 2.9052246e-002, + 2.6840614e-002, -1.9931112e-002, 5.2525978e-002, -4.9751069e-002, + -7.9276887e-002, 2.8081748e-002, -4.1223168e-002, 1.3105117e-002, + -2.6569475e-003, -3.2102570e-002, -2.6357544e-002, 2.2152608e-002, + -3.1539891e-003, -3.4785718e-002, -1.0592171e-002, -4.0300905e-002, + -1.5702723e-002, -1.8712957e-002, 3.3197549e-002, -3.6279117e-002, + 4.2838238e-002, -1.6489429e-002, 2.4648914e-002, 5.1252616e-003, + -8.1225473e-002, -5.6459253e-002, -5.2348110e-002, -7.0335906e-002, + -3.3338823e-005, -3.2311169e-002, 7.4676135e-002, -3.7143822e-002, + -6.8303532e-002, -7.0033274e-004, -3.7552999e-002, -6.6305361e-002, + 1.2196684e-001, 2.2084222e-002, 4.1475857e-002, -1.0862949e-003, + -4.0143874e-002, -3.7947485e-002, 2.3605616e-002, 2.3128901e-002, + 1.6999557e-001, 8.7507268e-003, -1.6086519e-002, 1.6438629e-002, + 5.3086378e-002, 4.2778341e-002, -5.1411551e-002, -9.1155004e-003, + 7.1703894e-002, -6.2919585e-002, -4.1252239e-003, -2.7800338e-002, + 1.3406385e-002, -1.9639614e-002, 2.0766865e-002, -8.0707557e-002, + -7.9126401e-003, 1.2061087e-002, 7.8233420e-002, 2.5787108e-003, + 9.6325419e-002, 4.2169871e-002, 4.5779560e-002, 1.1692399e-002, + 3.6624616e-002, -2.1368960e-002, 8.6087403e-002, -3.9290515e-002, + -9.1694613e-003, 3.1814092e-002, 2.4160765e-002, -1.1817798e-003, + 1.1293805e-001, 3.5901275e-002, 2.3964131e-002, 1.4594516e-002, + 8.3442765e-002, 2.7873584e-003, 9.2888387e-002, 5.6597406e-002, + 3.3678386e-002, 1.1285883e-002, -1.3345965e-002, -3.7971276e-002, + 3.8853868e-002, 4.0434589e-002, -3.5457626e-002, 3.4183998e-002, + 9.8248684e-002, -7.6115939e-002, -1.1769491e-002, -3.8386164e-002, + -1.8975843e-002, -9.3988535e-002, -5.5576121e-003, -1.8636003e-002, + 2.8386234e-002, -2.4200578e-002, 4.1252766e-002, -6.8000375e-002, + -3.7388633e-002, -3.0010634e-002, -2.0049886e-002, 2.5499201e-002, + -3.7598273e-002, -4.4794045e-002, 4.9668753e-002, 2.8526404e-002, + -7.6218361e-003, -1.0150563e-001, -3.1635380e-002, 6.0899411e-002, + -4.0702573e-003, 3.6908492e-002, 6.0695811e-002, -8.5097943e-002, + 5.3730269e-002, 3.7528389e-003, 9.3525516e-002, -1.4898976e-002, + 2.7723761e-002, -1.3087617e-002, -8.5905788e-003, -4.0551186e-003, + 5.2805805e-003, 6.8736269e-002, 1.5477601e-003, 4.0766710e-003, + 2.4948069e-002, -2.3695927e-002, 2.0778232e-002, 7.7785189e-002, + -6.5214959e-002, -1.6680307e-002, -5.1966107e-002, 7.5663630e-003, + -1.3256079e-002, 2.9625848e-002, -3.9745297e-002, 2.5236371e-002, + -3.2270585e-002, 6.2655107e-002, 3.3731838e-002, 2.2075588e-003, + -2.9591354e-002, 3.1341479e-002, -7.6083655e-002, 6.1296972e-002, + -5.6695620e-002, 2.2323220e-002, 2.3643317e-003, 2.5031378e-002, + 5.5413805e-002, 6.0973843e-002, -7.3883029e-002, 1.3029020e-002, + 6.5448736e-002, -2.3732566e-002, -1.6089444e-002, -2.1074484e-002, + 5.7948843e-002, 8.6615559e-002, -9.1319744e-002, -1.0161538e-002, + 1.9629470e-002, 1.9360651e-002, -2.8093541e-002, -4.2935479e-002, + 1.0709420e-002, 7.8669934e-002, 2.3835887e-002, 1.8165279e-002, + -5.4214119e-003, -7.9902014e-003, 4.5058379e-002, -3.2063499e-002, + -5.8672800e-002, 1.2173177e-002, 5.9993154e-002, 2.3138893e-002, + 8.0998931e-003, -4.4800380e-002, -2.4859361e-002, -1.5868492e-002, + -5.2323712e-002, -4.5973299e-002, -2.3052455e-003, 8.1582903e-003, + 6.8065483e-002, 7.6438296e-004, 4.0392238e-002, -6.5966937e-002, + -5.0614520e-002, -5.5301523e-002, -4.2561773e-003, 5.9937931e-002, + -2.1382190e-002, -2.0676084e-002, -3.5839724e-002, -1.2403270e-002, + -1.8285642e-002, -4.5681905e-002, 2.5535673e-002, 1.4234783e-002, + -1.9259208e-002, -2.5661378e-002, 3.0184961e-002, -5.6818389e-002, + 3.2310662e-002, -2.4301821e-003, -1.2328487e-002, -5.4786335e-002, + -4.8916330e-002, 4.8190116e-002, -6.0850449e-002, 7.7620003e-002, + -6.6473044e-002, 5.1361693e-002, -4.4367608e-002, 5.9245756e-002, + 5.3474787e-003, 3.8059821e-003, -6.1171918e-002, -2.9543201e-002, + -8.3560612e-003, -4.1202373e-002, -5.3271164e-002, 7.6473415e-002, + 1.3747330e-002, -4.2692942e-002, -4.7688735e-002, 9.0017757e-002, + -5.5124068e-002, -4.9430822e-002, 1.9839950e-002, 6.1066303e-002, + -1.3518935e-001, 4.5758030e-002, 2.8061894e-002, 2.2738266e-002, + -9.3128822e-003, 7.9618280e-002, -1.2187199e-001, 4.5605462e-002, + -3.0479221e-002, 3.8694000e-002, -1.8124762e-002, 3.7759175e-002, + 1.8158014e-003, -2.7070632e-002, -2.3634825e-002, 5.2676876e-002, + -5.2016000e-003, -5.4593248e-002, -1.6338775e-002, -8.0919891e-002, + 8.7671746e-003, 5.8316283e-002, -6.9144058e-002, -4.6936119e-002, + 1.6594244e-002, -7.6784768e-002, -6.3547981e-003, 4.8236469e-002, + 1.6578926e-002, -2.8223303e-002, -8.7243754e-002, 5.5790867e-002, + 4.5976330e-003, -4.0593161e-003, -7.1609202e-002, 3.6451850e-002, + -3.6051938e-002, 1.0343606e-004, 4.0493147e-002, 2.1330427e-002, + -3.3170735e-002, -4.4584020e-003, 3.1555313e-002, -1.1414545e-001, + 5.6867307e-002, 4.0626699e-002, -5.8860350e-002, -1.0003188e-001, + -4.8326893e-002, -1.2614691e-002, -2.1586874e-002, -3.1935606e-002, + 2.4103451e-002, 1.4488790e-002, -8.0859096e-004, -3.8980020e-003, + 7.4909148e-002, -2.8049185e-002, -2.0918789e-002, -2.4711940e-002, + 5.3455068e-002, -9.7517045e-003, -2.4433675e-002, 3.7640959e-002, + 2.4437924e-002, 4.6113770e-003, -2.1101125e-002, -2.2852117e-002, + -7.2572348e-002, 3.6761328e-002, 2.6652183e-002, -4.3100149e-002, + -5.4098286e-002, 8.2220041e-002, 5.5613895e-002, 5.4603855e-002, + -1.3589191e-001, 2.3347518e-002, 4.6453611e-002, 2.2623921e-003, + 6.0644536e-002, -7.5601564e-002, -8.9194042e-002, -3.4410351e-002, + -3.4360013e-003, 5.1666691e-002, 1.2464056e-002, -2.3030505e-003, + -3.9004649e-002, 1.1817405e-002, -3.4117635e-002, -2.8693035e-002, + -1.5931261e-002, 8.0677220e-004, 1.8397691e-002, -3.1052320e-002, + 4.9726240e-002, -2.0747799e-002, -6.0637710e-003, -7.9396747e-002, + 4.8372461e-002, -7.1979765e-002, 2.6832942e-002, 2.9273777e-002, + -4.8337996e-003, 4.0391770e-003, -9.4918066e-002, 6.2066596e-002, + 4.9875577e-002, -3.3753903e-002, -2.4500392e-002, 9.0658929e-002, + -9.8343476e-002, -6.2504733e-003, 1.1991216e-001, 2.8944337e-002, + 2.6898626e-003, -6.4267875e-002, 2.9019187e-002, 1.9971213e-002, + 8.0684873e-003, 1.3081097e-002, -3.1283754e-002, -2.8489269e-002, + -1.1686268e-001, -1.3745347e-002, 5.3686243e-002, -5.2197217e-002, + -3.3465705e-002, -3.5083431e-002, 1.6015164e-002, 2.4493466e-002, + -2.3306198e-002, -1.9672026e-002, -7.6748565e-002, -7.1159132e-002, + -3.6831968e-002, -1.1592501e-001, -1.1802673e-001, 2.8843104e-002, + -5.9118430e-002, -1.1106526e-002, -4.0643480e-002, -3.3903934e-002, + 6.9026642e-002, -3.3357058e-002, 3.1574083e-002, 4.0538895e-002, + 4.3133551e-002, 3.7814770e-002, 6.4315631e-002, -5.5887205e-002, + -6.1198396e-002, 7.2376501e-002, -4.4847288e-002, 4.4972439e-002, + 8.9532496e-002, 2.7491210e-002, 3.5765916e-002, -5.8314299e-002, + -1.5996091e-002, -4.3521287e-002, -2.8304205e-002, -4.3486571e-002, + 1.0849438e-001, 2.2361367e-002, -6.1362009e-003, 5.3111507e-002, + -8.8565282e-002, 8.4842988e-002, 1.0627885e-002, 4.4828472e-003, + 7.7250566e-003, -3.5888413e-002, 4.5405946e-002, 9.5357093e-003, + 3.8049221e-002, 1.1798868e-002, 8.5901681e-002, 7.2651393e-002, + -1.0648259e-002, -3.5412792e-002, -5.2852119e-003, -2.8006256e-002, + -5.8455622e-003, 9.2263862e-003, 1.4651709e-002, -1.1429416e-001, + 8.0368439e-002, 2.6278264e-002, 2.0947848e-002, 5.9186459e-002, + 3.0967487e-002, -1.1507298e-001, -3.4239562e-004, -2.0939429e-002, + 6.9101989e-002, 1.9188787e-002, -1.7007634e-002, -1.4226805e-002, + 2.0497813e-003, 4.8643630e-003, -5.0243128e-002, 2.6571757e-002, + -2.5756622e-002, -6.2136271e-002, 3.0876774e-002, -3.2966648e-002, + -4.6798326e-002, -7.2864522e-002, -7.0620327e-002, 3.1514440e-002, + 4.7419175e-002, -2.9639040e-002, -7.4872381e-002, 1.0268214e-001, + -6.4408455e-002, -5.1714244e-002, -1.4811842e-002, -2.6652795e-002, + -3.3398841e-002, -9.1093311e-002, -2.9613673e-002, -3.2849316e-002, + -2.1792627e-002, -4.8905018e-002, 3.8278002e-002, -1.0578267e-001, + 3.9883500e-002, -4.0322452e-002, -7.7085856e-002, -1.1560340e-002, + -9.6078464e-003, -5.2790120e-003, -1.7445510e-002, 4.1210396e-002, + -3.1966850e-002, -4.2623715e-002, -3.8224686e-002, -2.3460384e-002, + -1.8322700e-002, 1.5049174e-001, -3.1993543e-002, 4.3014183e-002, + -4.4366020e-002, -1.9251396e-002, -1.2898947e-002, -6.0899923e-002, + -5.9898591e-002, -5.6557253e-002, 4.6067919e-002, 2.0882012e-002, + -7.1937529e-002, -9.5914837e-002, -1.2626698e-001, -3.6792717e-002, + 2.8022409e-002, -3.4921767e-002, -2.2305614e-002, -3.2328726e-002, + -4.8809030e-002, -2.6925977e-002, -4.2114647e-002, 8.7023862e-002, + -3.7654336e-003, 6.9322688e-002, 9.2912513e-003, 5.7435044e-002, + 1.9609569e-002, -1.1570562e-002, 6.1049764e-002, -6.4977165e-002, + -5.0641683e-002, -4.9830239e-002, 2.9619165e-002, -4.3292073e-002, + -6.2860680e-002, 6.3449012e-002, 6.3302743e-002, -3.7096028e-002, + -4.6860354e-002, 1.6643809e-002, -2.8812456e-002, -1.2949017e-004, + -5.0303595e-003, -5.1531111e-002, 1.0185519e-001, -8.8467370e-003, + -6.4260237e-002, 2.2972796e-002, -8.7208177e-003, 2.1703090e-002, + -3.2583688e-002, 1.9180369e-002, -4.6604492e-002, 5.9620323e-002, + -2.3169309e-002, 1.7923404e-002, 7.0399591e-002, -6.3632676e-003, + -6.2662420e-002, -5.0818406e-003, 7.6310034e-002, 3.8440333e-002, + 2.3108218e-002, 1.0992061e-001, -6.6023131e-002, 1.0339039e-002, + -1.2454926e-002, 3.0748449e-002, 3.8733454e-002, -8.1029526e-002, + -6.3890932e-003, -1.7310614e-003, -6.5448180e-002, -1.3567927e-002, + -1.4651225e-002, -1.6402517e-003, -4.0889024e-002, 3.3267739e-002, + -8.7669631e-002, -1.1762527e-001, -3.0337637e-003, -1.0579264e-001, + 3.8458061e-002, 6.1506618e-002, -1.2438319e-002, -2.0981512e-002, + 8.6707387e-003, 4.1305048e-002, 5.8010222e-002, 3.4177414e-002, + 6.1614068e-002, 3.7742022e-002, 2.2274616e-003, -3.3374053e-002, + -1.3841013e-002, -1.5519456e-002, -1.1770865e-001, -4.0589703e-002, + 1.1432496e-001, -2.8665001e-002, -9.7087434e-002, 2.8739815e-002, + 9.2917531e-002, 1.1938896e-001, -2.9010572e-002, -3.4721428e-002, + -3.4855927e-002, -1.2121671e-002, -1.0158399e-001, 9.7895131e-002, + -7.8712576e-002, -7.9976995e-002, 7.6185673e-002, -2.8833935e-002, + 1.8354206e-002, -1.7587259e-001, -7.8647771e-002, 2.2256759e-002, + -2.1611016e-002, 2.4071583e-002, 4.5227886e-004, -7.2657111e-002, + -7.2168746e-002, -1.1452740e-002, 1.6181869e-002, 4.5831060e-002, + -2.3369801e-003, -2.8727581e-002, 7.5005238e-003, -8.9739571e-003, + -4.1100109e-002, -1.6087343e-002, 7.4606898e-003, 2.9933544e-002, + -1.2690286e-001, -3.9049832e-002, 2.7720568e-002, 1.7947841e-002, + 3.4410773e-002, 5.5729818e-003, -1.8016513e-002, -4.8830323e-002, + 3.2716530e-002, -3.4232512e-002, -1.6426973e-002, 5.0795800e-002, + -3.1791729e-002, 3.7707010e-002, 4.5092581e-002, -4.8603247e-002, + 2.9459071e-002, -4.6422186e-002, 3.9296295e-003, -2.8900220e-002, + 1.1207343e-002, -3.5131485e-002, 3.0510860e-002, 1.0155622e-001, + 6.2187792e-003, 6.7503241e-002, 4.7232070e-002, -2.1226837e-002, + -8.4154353e-003, 2.0913858e-002, 7.0127327e-003, -1.2448522e-002, + 1.6449412e-002, 4.5151926e-002, 4.6836548e-002, -2.0687186e-002, + -7.3644538e-002, -1.0260562e-001, 4.1594354e-004, 2.2962943e-002, + -3.6753478e-002, -3.6656754e-002, -3.9912894e-002, 1.1998781e-002, + 1.2228691e-002, 6.9910277e-002, 2.4035919e-002, 7.1080248e-003, + 3.6471267e-002, -1.5899153e-003, -6.2981316e-002, -4.8019402e-003, + 9.9610031e-002, 3.4685502e-002, -1.4906597e-001, 6.2799402e-002, + -3.8932025e-003, 3.5313345e-002, 6.4080127e-003, 7.7712074e-002, + 1.9652177e-002, 3.3529556e-002, 6.7998095e-002, 4.0481914e-002, + -4.5148562e-002, 1.2390995e-001, 6.0472177e-002, -4.0537793e-002, + -2.9016904e-002, 1.0069785e-002, -4.3630516e-002, 1.6317010e-002, + -8.1563635e-003, -2.9428878e-002, -1.0007097e-002, 1.1748494e-003, + -3.7584384e-003, -1.0136314e-002, 6.9501199e-002, -6.2079897e-002, + 5.6550846e-002, -3.1224895e-004, 1.5172074e-002, 3.5494228e-002, + -2.8525286e-002, 7.0934847e-002, -2.1855207e-002, -9.0589689e-002, + -5.0420263e-002, -6.4220854e-002, 8.0572534e-002, 4.4657936e-002, + 3.8900053e-002, 2.3038306e-002, -2.9059798e-002, 4.1790833e-002, + -1.4498459e-003, -1.4247977e-002, -7.2557019e-003, 7.0209000e-002, + 7.1292433e-002, -1.0914340e-002, 1.0671194e-001, -3.9136244e-002, + -1.3175217e-002, 1.3764681e-002, 1.1563616e-001, -6.3896840e-003, + -6.2527708e-002, 8.8512912e-002, -2.9045669e-002, 1.5227173e-002, + -5.0667751e-002, 1.2560643e-001, 7.4986299e-002, 3.3825251e-002, + 1.5514266e-003, -5.2532720e-002, 1.7029297e-002, -3.2944301e-002, + -6.1748947e-002, 2.6402422e-002, -2.6902014e-002, -1.1054785e-001, + 4.5217579e-002, 7.2634916e-002, 4.7126396e-003, 5.3388646e-002, + 1.4724645e-002, 4.8733852e-002, -2.4509080e-002, -9.1580431e-002, + 5.2106999e-003, -1.5643665e-001, -4.8892928e-003, -5.3026671e-002, + -4.4146053e-004, 3.2444612e-002, -2.3101994e-003, 9.4890488e-002, + -7.8052719e-002, 6.0338172e-003, -4.0433742e-002, -3.9104783e-002, + 4.0994343e-002, 7.7513705e-002, -1.8133412e-002, -1.8801315e-002, + 9.9180571e-002, 5.9051814e-002, 3.2637953e-002, 4.5773237e-002, + 9.2868125e-003, -4.4946634e-002, -5.0590403e-002, -3.3365865e-002, + 3.5527025e-002, 7.4204867e-003, 1.5004459e-002, -3.4647091e-003, + 5.5465088e-002, 1.1416662e-001, -2.6462288e-002, 6.8671916e-002, + -6.3002510e-003, 1.1583924e-002, 3.1050102e-003, -1.0105237e-001, + -1.0657225e-002, -9.8132990e-002, -2.8254118e-002, 5.8377956e-002, + -2.3015648e-002, -1.7437864e-002, -2.2634945e-002, -4.8192213e-002, + -4.7584233e-002, 1.9414654e-002, -2.7057831e-002, 1.7158611e-002, + 1.3317117e-001, -5.5081291e-002, -5.0017430e-002, 7.6813579e-002, + 9.4583304e-002, -6.9067814e-002, 1.9120563e-002, 2.1258087e-002, + 7.2055539e-002, -4.4266255e-002, -3.2205709e-002, -2.8779031e-002, + -2.3481940e-002, 1.7708910e-002, -1.9311139e-002, 5.3418240e-002, + 2.4606925e-002, 5.0846628e-003, -2.0453302e-002, 3.5461384e-002, + 1.3245649e-002, -1.4856256e-002, -4.1995487e-002, -6.8461842e-003, + 4.3425178e-002, -4.2381240e-002, -1.2470922e-001, -6.6566711e-002, + -1.5328279e-003, 2.1121820e-002, -8.9850510e-002, 2.0682240e-004, + -5.8686388e-002, 7.1519107e-002, 2.7049268e-002, 4.3271736e-003, + -1.8990188e-002, 4.1744154e-003, -6.7617528e-002, -1.5982309e-002, + -8.6739389e-003, 6.8767245e-003, -7.0052976e-003, 8.3718019e-002, + 5.8127315e-002, -9.4223672e-002, -1.3478363e-002, -3.2457089e-002, + -1.7549472e-001, 2.8493349e-002, 1.0412304e-001, -1.1173210e-003, + 7.1447946e-003, 2.7052018e-002, 2.1816972e-003, -8.8630176e-002, + -1.0701357e-001, -4.1207617e-002, 3.7077898e-003, 8.7053488e-002, + 1.4283129e-002, 6.4010086e-002, -3.7679928e-002, 8.3111383e-002, + 5.6677718e-002, 1.4063916e-003, -1.0364232e-001, 3.6312049e-002, + -2.6135054e-002, 3.1703422e-002, -3.5189144e-002, 1.6030282e-002, + -7.0953448e-002, -1.6409520e-002, 1.5861113e-002, -4.0344599e-002, + 9.3345150e-002, -3.2385751e-002, 2.9194015e-002, -5.3074056e-002, + -5.8395538e-002, 1.4711047e-002, 1.6754312e-002, -4.1092096e-002, + -5.7509643e-002, 5.8321957e-003, 3.4401437e-002, 3.5235160e-002, + 6.4540634e-003, 6.8538944e-003, -1.0143565e-001, -2.5820489e-002, + -2.0821741e-002, 4.4652423e-002, -3.4072854e-002, -2.6609349e-002, + 3.3889860e-002, -5.3220787e-002, -2.4894595e-002, -9.6139329e-002, + -3.3024922e-002, 1.7823306e-002, -4.2192663e-003, -5.3704045e-002, + 1.1044474e-002, 1.4159169e-002, 5.6261779e-003, 1.4544719e-001, + -4.2079631e-003, -9.5725344e-002, -3.6408815e-003, 6.0200088e-002, + 2.9998960e-002, -7.3398314e-002, -4.8228886e-002, 3.3208412e-002, + -5.6677275e-003, -6.6855312e-003, -3.0785426e-002, 4.2126629e-003, + 7.0115500e-002, -3.9919529e-002, 4.0614066e-002, -3.0371460e-002, + 7.2891063e-002, 2.3537099e-002, 2.9755936e-002, -3.7706444e-002, + -8.3470665e-003, 7.6886063e-003, -8.4313321e-002, -2.9399720e-002, + -1.4589921e-002, 1.7944446e-002, -1.1460170e-001, -6.2017760e-002, + 3.4407222e-002, -2.7741014e-002, -4.6295413e-002, -2.7812656e-002, + -3.0886235e-002, 1.1995511e-002, -3.2969544e-002, -6.9191631e-003, + -2.9791556e-002, 2.0392531e-002, -4.7567313e-003, -9.8443940e-002, + -1.2686039e-002, -2.1886631e-002, -1.5455907e-002, -1.1782002e-001, + 6.1301396e-002, 2.1872915e-002, -1.0561240e-002, -2.3193915e-002, + 6.9727656e-002, 1.4693869e-003, -1.3543614e-001, -4.0815903e-004, + 5.6251246e-002, -9.1505709e-002, 5.7185400e-003, 7.1033142e-002, + -7.9002590e-002, -4.1318689e-002, 4.9841764e-002, 1.7309114e-002, + 5.7136005e-002, -2.1199613e-002, -6.1231140e-002, 7.2177738e-002, + 2.5816325e-002, -3.9691591e-002, -8.4077105e-002, 1.8921121e-002, + 4.0273842e-002, -5.0316912e-002, -1.2301284e-002, 1.4068218e-003, + 3.9074162e-002, 1.1140969e-002, -9.0100129e-002, 1.6566978e-002, + 2.2387085e-002, -5.5267138e-003, -1.4053472e-002, 8.5720676e-002, + 6.6003080e-003, -3.4558594e-002, -2.1528224e-002, 3.4199928e-002, + 8.3291659e-003, -3.4104982e-002, 7.5554591e-003, 1.0701557e-001, + 1.3371029e-002, -5.4777395e-002, -5.4878162e-002, -4.1852588e-002, + -4.0276462e-003, 1.0933072e-002, 3.1101256e-002, -4.6169830e-002, + -7.8623398e-002, -4.0709650e-002, -2.2176445e-002, -6.1230977e-002, + 1.6368772e-002, -1.0741991e-001, -3.4277843e-002, 6.1009971e-002, + -8.3667710e-002, 1.1309839e-002, 5.4127285e-004, 8.4633157e-002, + -6.3130402e-002, -1.1137924e-002, -5.0412645e-002, -5.4166796e-002, + -4.6504636e-002, 7.8517633e-002, 3.1626107e-002, -1.8210994e-002, + -3.5098136e-003, -1.2130004e-002, -1.3464374e-002, 5.0731507e-002, + -4.3012235e-003, 8.2720477e-002, -1.3193101e-002, -1.3778387e-002, + 5.5452531e-003, -9.3586936e-003, -8.6317405e-003, -3.6862811e-002, + -3.2830740e-002, 8.4783068e-003, -1.5330067e-002, 1.1130119e-001, + 7.3688984e-003, -6.4062197e-003, 3.9423451e-002, 8.1626914e-002, + -2.2657562e-002, 7.7429063e-002, -1.7196394e-003, -5.1547799e-002, + 8.5550269e-002, 1.0233102e-003, -2.7193777e-002, 5.8490358e-002, + 6.2673818e-002, -3.9346043e-002, -3.9066234e-002, -1.2783050e-002, + -6.3166376e-002, 2.7608238e-003, -4.7437497e-003, 4.1786886e-003, + -3.2351866e-003, -3.3156438e-002, -5.4098732e-002, -5.6553182e-002, + 5.8110628e-002, 1.1522620e-002, -5.4533062e-003, -1.6040357e-002, + -5.2050007e-002, 1.1068723e-002, 7.0599072e-002, -8.2637140e-002, + -3.3101999e-002, -1.7103108e-002, -5.2723510e-002, 1.1424693e-004, + -2.0451276e-002, -3.8451163e-002, -3.9178471e-002, 1.0882970e-001, + -5.9520509e-002, -1.6406338e-002, -3.7464624e-002, -1.5850757e-002, + 2.8142632e-003, 8.5106236e-003, -3.4606452e-002, 2.1538352e-002, + -5.1542008e-002, -6.0556592e-002, -3.0525775e-003, 1.0188123e-001, + -1.6159393e-002, -4.6398817e-003, -3.4883594e-002, 5.7383438e-003, + 7.6872944e-002, 1.6904979e-002, -3.9974367e-004, -6.4651835e-002, + 2.0519546e-002, 1.4600580e-002, 9.3830207e-002, 1.1815421e-001, + 8.2952538e-002, 1.3580903e-004, -4.5583612e-002, -8.4369787e-002, + 1.0032836e-002, 7.8411529e-002, 4.3200604e-002, -1.5040485e-001, + -1.2045753e-001, -3.0628967e-002, 4.6612260e-003, 6.4710750e-002, + -2.6463384e-002, 8.0467496e-002, 1.5772806e-002, -9.0031337e-002, + 3.8140960e-002, 2.4067996e-002, -1.4456479e-002, 2.5044977e-002, + -5.5023682e-002, -3.1476503e-002, 4.6154417e-002, 4.1969567e-002, + -2.1537004e-002, -1.3892791e-002, -7.9877470e-002, -6.6130095e-002, + -3.3971108e-002, 4.9723852e-004, -2.3332777e-002, 4.4957143e-002, + 4.5955566e-002, 7.3085106e-002, 1.4327863e-002, 4.4882884e-002, + -4.5453744e-002, 3.2494203e-002, -3.5223572e-004, -3.4399985e-002, + -5.9070327e-002, -2.4763167e-002, 5.4170280e-002, -9.3797557e-002, + -2.4345173e-002, 7.5789539e-003, 6.5847677e-003, -1.1035459e-001, + 6.4245815e-002, -6.3677641e-002, -2.7625955e-002, -4.9760945e-002, + 1.9438298e-002, -2.0183031e-003, 3.9238472e-002, 7.3801148e-002, + -7.4626808e-003, -3.5100675e-002, 1.1826910e-002, -5.0622844e-002, + 4.3419831e-002, -2.2438311e-002, 4.0482870e-002, -2.5746508e-002, + -4.5886738e-003, -4.2692344e-002, 6.0214404e-003, -4.9494823e-002, + -6.9637679e-002, -6.0074768e-002, -1.3792535e-002, 5.8374139e-002, + 4.0942951e-006, -4.1381257e-002, 5.5951370e-002, -2.9628877e-002, + 1.2189054e-002, 9.2356783e-003, 1.9097401e-002, 5.8341964e-002, + -5.8640330e-002, -4.0346416e-002, -2.0148478e-002, -7.3979491e-002, + -7.6507173e-003, -2.6376789e-002, 9.3631448e-003, 5.7075337e-004, + -1.7237147e-002, -1.4088176e-002, -6.5722025e-002, 1.7734913e-001, + 3.9188355e-002, -5.3138441e-003, 6.6012838e-004, -3.7635320e-002, + 8.6939560e-002, 2.5457618e-002, -5.3643902e-003, -3.5072285e-002, + 1.7654459e-002, -1.7002417e-002, -1.1934297e-002, 1.0909989e-001, + -4.5341914e-002, 2.9654212e-002, -7.3979691e-002, 8.1855730e-002, + -4.1111527e-002, 2.8178913e-002, 3.0990023e-002, -3.8439631e-002, + 4.6092851e-002, 2.0499136e-002, -4.0078674e-002, -7.5298075e-002, + 8.6249420e-002, 2.0413103e-002, 1.4283415e-002, 3.3364666e-003, + 4.5625551e-002, 2.8593452e-002, 1.0294208e-001, 4.6237012e-002, + 2.3737104e-002, 1.4850043e-003, 4.5627026e-002, -3.1300170e-002, + 2.7232389e-002, -2.5581725e-002, -4.2382451e-002, -4.1639602e-002, + -1.2685580e-002, -6.8348575e-002, -3.5070023e-002, -1.9126421e-002, + -5.1202221e-002, -2.1697346e-002, 6.3981805e-003, 6.1889782e-002, + -9.5515388e-002, -3.5099019e-002, -7.5991979e-003, 2.6608290e-002, + -6.5628332e-003, 4.0519304e-002, 1.8759115e-004, -8.2745501e-002, + 4.8080126e-002, -9.4334121e-002, -1.7519517e-002, 8.4578794e-003, + -1.0547960e-002, -2.9348950e-003, 2.2443020e-002, -8.3815521e-003, + 3.4363193e-002, 3.5010892e-002, -2.7129950e-002, -1.8407294e-003, + -2.7794904e-002, 7.5761568e-002, -5.1005395e-002, 2.2206192e-002, + 5.5815959e-003, 1.3179272e-002, 1.3743604e-002, 8.4180570e-002, + -4.5318175e-002, -4.0369759e-002, -5.5643911e-002, 1.1111604e-002, + 4.9980927e-002, -5.3328516e-002, -2.5289654e-002, -5.3455028e-002, + -4.5115993e-003, 1.2552924e-002, 2.4187614e-002, -6.5216647e-002, + -6.7184717e-002, -3.4635282e-002, 2.6037151e-002, -1.2958051e-002, + -6.4529955e-002, -4.7775406e-002, 7.7791690e-002, -4.1840856e-002, + 3.5508733e-002, 3.6208672e-002, 2.8883867e-002, -2.2614722e-002, + -6.2467477e-002, 2.1201398e-002, -6.4938220e-002, -2.5718030e-002, + 1.0132503e-001, -1.0989944e-001, 1.7386332e-002, -1.9848054e-002, + 4.6500211e-002, 8.7080916e-002, 6.1051787e-002, -6.9658176e-002, + 1.8448919e-003, -6.3897477e-002, 9.5246967e-003, -1.7099063e-002, + 8.6762837e-002, -5.1071138e-002, -4.1995939e-002, -1.5112140e-002, + 9.4802477e-002, -3.6319825e-003, 5.6475075e-002, -5.2649820e-003, + 5.5494589e-002, -3.6195527e-002, 3.0102603e-002, 9.6119308e-002, + 2.9804096e-002, -8.3871467e-002, -4.6819532e-002, -6.6699175e-002, + -7.8740356e-002, 2.3100681e-002, 4.0518590e-002, -5.5249251e-002, + 3.4210609e-002, 6.3808433e-003, 2.9561241e-002, -7.9993851e-002, + -8.6030708e-003, 4.9599184e-002, -5.3356684e-002, -4.3441101e-002, + 4.6557960e-003, -5.8349112e-002, 7.0442125e-002, 3.3583231e-002, + 3.5326691e-002, -1.4284013e-003, 3.7155912e-003, -6.1957730e-002, + -2.5175104e-002, 1.0316170e-004, 1.3785501e-002, -3.4528343e-002, + 9.4718664e-002, -8.5929124e-003, 6.2353769e-003, -1.9235982e-002, + -5.0684859e-002, -9.0890509e-002, 2.9614723e-002, -5.8904724e-002, + -5.9605704e-002, 1.7332188e-002, -6.2983369e-004, 7.6762655e-002, + -1.5739418e-001, 4.7428004e-002, -7.4437002e-003, 3.2753497e-002, + -6.4494291e-003, -1.0132357e-001, 3.1793509e-002, -1.9653108e-002, + -1.3986054e-002, -1.0375110e-001, 5.9341902e-002, 7.4338421e-002, + -7.4336814e-002, -8.8261702e-004, 8.4239417e-002, 3.6771318e-002, + 4.6614615e-003, -1.0885608e-001, 4.0218429e-002, -7.3328551e-002, + 3.4660924e-002, -2.2304889e-002, 9.1183611e-003, -3.1063866e-002, + 3.7029187e-002, -8.5599164e-003, -3.1378391e-003, -3.4177850e-002, + -3.6311985e-002, 5.4941612e-002, -2.5856244e-002, 9.8859541e-002, + -4.1708361e-002, 4.4676996e-002, 1.0012678e-001, 1.2298856e-002, + 3.9574107e-002, -5.4805478e-003, -2.5335550e-002, 2.0495470e-002, + -2.8777276e-003, -1.2280951e-002, -3.6926171e-002, -6.4637997e-002, + 3.1275904e-002, -4.0724158e-002, 8.2545982e-002, 1.7297459e-002, + 1.7103606e-003, -3.6063372e-002, -1.9411586e-002, 2.5489285e-002, + 5.3618799e-002, -1.5847040e-003, -8.2607767e-002, 6.4750926e-002, + 3.4155392e-002, 1.2202950e-002, -6.3849575e-002, -4.2629288e-002, + -9.3420039e-002, 1.8591964e-002, -6.2494687e-002, 2.7073439e-002, + -1.6706104e-002, 8.5702929e-004, 5.5338380e-002, -1.1863343e-002, + 2.4120033e-002, -1.9673309e-002, -9.0836747e-003, -8.4090025e-002, + -1.6605994e-002, 1.2509049e-002, 2.9654581e-003, 3.5414725e-002, + -9.1520329e-002, 5.3251481e-004, -3.9064127e-002, 4.3848196e-002, + -6.5906592e-002, -6.2694114e-002, -7.5430627e-002, -6.9288028e-002, + -7.3831218e-002, -2.2849271e-003, 4.1968983e-002, 9.1516100e-003, + 6.3003994e-002, 4.0825527e-003, -1.1602298e-002, 3.4062508e-002, + -3.6760665e-002, -6.6458351e-003, 4.5328593e-002, 1.5333803e-002, + 3.1081863e-002, 1.0997856e-003, 4.0172982e-002, -5.1202051e-002, + 3.0204527e-002, -9.1683008e-002, 6.6885251e-002, -1.4713293e-002, + -1.8783233e-002, -2.6727404e-002, -4.0587117e-002, 1.7352452e-002, + 2.4068866e-002, 9.3813608e-002, 1.4593201e-001, -2.6243684e-002, + 4.2410590e-003, 5.7049362e-002, -1.0495092e-002, 5.5352776e-002, + -1.4966413e-002, 5.8887924e-002, -2.9432846e-002, 1.5016450e-002, + 1.8771912e-002, 2.9731363e-002, -8.9727906e-002, -2.8879171e-002, + -2.4530626e-002, -2.1755227e-002, 2.6372269e-002, 1.6464203e-002, + -2.9595373e-003, -2.8033224e-002, -3.8960164e-002, -1.4500836e-002, + 1.2441672e-004, 6.9888338e-002, -1.3326151e-002, -4.4177213e-002, + 1.0679639e-001, -7.7540624e-002, 7.3527032e-002, 7.1684818e-002, + 2.4447003e-002, 1.3247555e-002, 2.5484911e-002, -2.0333037e-002, + 1.0820256e-001, -1.5291962e-001, 4.0764107e-002, -5.3576752e-002, + -3.3726558e-002, 5.9985203e-002, 1.4311757e-002, 1.0872979e-002, + 4.8154459e-002, -9.8724947e-002, 3.5433564e-002, -3.0296223e-002, + -4.9776503e-002, 6.4312955e-002, -3.8636806e-002, 4.1001924e-002, + 2.8324136e-002, -2.4954944e-002, 3.0731417e-002, -4.0748527e-002, + 1.0071007e-001, -4.2444577e-002, 7.4060614e-002, 7.0443088e-002, + -8.5281317e-002, 2.2408837e-002, -3.0453603e-002, 5.3244534e-002, + -2.7097865e-002, 9.3509025e-002, -4.0481022e-002, 3.0984921e-002, + 6.2120102e-002, 2.5263636e-002, 4.7524005e-002, -8.3461434e-002, + -4.0450596e-002, 2.4301374e-002, 2.4082281e-002, 2.7165952e-002, + 2.5739840e-002, -4.4498403e-002, -9.3779267e-002, 1.3230632e-002, + 5.6356340e-002, -3.1721297e-002, -1.1371059e-001, 5.1330793e-002, + 3.9800143e-002, 4.4602902e-002, 4.0186966e-002, -3.3956201e-002, + -3.4378181e-002, 3.0222123e-002, 1.3392410e-002, -1.1877032e-001, + -6.1513207e-002, 5.1308971e-002, -3.4406254e-004, -5.6836546e-002, + 3.1147677e-002, 1.2984031e-001, 6.9255265e-002, -7.3899471e-002, + 4.4113150e-002, 4.1613437e-002, -8.3330499e-002, -6.7769626e-002, + 9.9577638e-003, 8.5011488e-002, 3.1777824e-002, -3.0275122e-002, + -1.9721785e-003, -2.8670666e-002, -5.1951849e-002, 2.6123845e-002, + -4.6954628e-002, 3.9325561e-002, -1.4539624e-001, -4.4989415e-002, + 1.2490030e-002, 9.8158554e-002, -8.8549642e-002, 7.0425741e-002, + 1.6289354e-002, 7.6642414e-002, 8.2615082e-002, 1.5188920e-002, + 1.0717190e-001, 7.8459410e-003, -9.8939081e-002, 5.4496988e-002, + -1.9598305e-002, -4.8340131e-002, 9.1012052e-002, 4.5089162e-002, + 2.7001089e-002, 3.9597820e-002, -2.9912957e-002, -4.5233127e-002, + -2.6888627e-002, 8.2716012e-002, 4.1938511e-002, -1.2290728e-002, + -9.1141489e-002, -9.3716385e-002, 5.0846593e-002, -6.9747424e-002, + 1.5936647e-002, 9.0841003e-003, -7.9217963e-002, 4.2523607e-002, + -3.4283790e-002, 6.2931211e-002, 1.9054212e-002, 1.0431108e-002, + -1.7512053e-002, 1.5995877e-002, -6.9853083e-002, -3.6133865e-002, + 5.1883029e-002, -5.4941971e-002, 2.5099530e-002, 2.1949930e-002, + -7.2924143e-002, -1.2241689e-002, -2.5239538e-003, 1.0240874e-002, + -3.5188489e-002, -1.4637794e-002, 4.2573102e-002, -4.6954972e-002, + 4.9757134e-002, 8.9000907e-002, -5.7343223e-003, -9.4659733e-002, + 2.2731848e-002, -6.3526985e-002, -6.2729748e-002, -8.5124042e-002, + -2.2742192e-002, 4.9060274e-003, 5.9105851e-002, 6.6593845e-002, + -2.0401971e-002, -3.4052538e-002, 1.0187912e-001, -3.9129772e-002, + 1.6727491e-002, 7.9581367e-002, 2.3490622e-002, -8.5225499e-002, + 4.5609113e-002, 2.5532693e-002, -1.3949777e-002, 1.1939908e-001, + 3.1136484e-002, 2.1065018e-002, -7.3998053e-002, -3.3433899e-002, + 6.4825970e-002, -6.6483460e-003, 2.1878777e-002, -5.5590218e-002, + 6.2132974e-002, 6.0099401e-002, 2.6750906e-002, -3.2033687e-002, + 4.8448643e-002, -3.8771221e-003, -4.8090282e-002, -2.9473176e-002, + -1.6510646e-002, 5.6059374e-003, -2.8498771e-002, 1.4581678e-001, + 7.2382639e-003, 6.9060065e-002, 3.1254099e-002, 1.1295554e-001, + -2.0791262e-002, 2.6272472e-002, 2.3832128e-004, 1.7675185e-004, + 2.2985763e-002, 5.8978432e-003, 4.4429730e-003, 7.5305836e-002, + 2.7519294e-002, 2.6304737e-003, -7.5022497e-003, 9.7612623e-002, + -1.1392227e-003, 6.3717011e-002, 4.2435569e-002, -6.8014182e-002, + 7.4854037e-002, 3.2524349e-002, 7.0521866e-002, 2.0297711e-002, + -2.7255480e-002, -1.3079920e-002, -1.1988356e-001, 4.2564644e-002, + 8.9756674e-002, 1.7220549e-002, -4.4937423e-002, -2.9070759e-002, + -4.4538021e-002, -7.8632839e-002, -2.8995185e-002, -1.4328207e-002, + 2.6443524e-002, 8.9669124e-002, 1.7624887e-003, 3.2927633e-002, + -3.1535117e-002, -6.6599096e-003, 1.0186317e-001, 8.9875545e-003, + 2.8378610e-002, -5.5136504e-002, 3.3829370e-002, 7.1374246e-003, + -1.4538378e-002, 3.9237476e-002, 6.8685661e-002, -3.3057531e-003, + 1.1538617e-002, 8.8143388e-003, -1.9900457e-002, 2.0600418e-002, + 3.0249751e-002, -7.3517395e-003, 6.4648004e-002, -8.6600526e-004, + 8.3511299e-003, -5.4627039e-002, -6.4363505e-003, 1.6893141e-002, + 5.5401782e-003, -2.4244983e-003, -2.0950127e-002, -2.2956516e-002, + 7.8535473e-003, 2.4067483e-002, 6.1367370e-002, -3.3267227e-002, + -1.7259358e-002, -7.3612541e-003, -1.5577290e-002, 8.5933756e-002, + 5.0314067e-003, -5.7691721e-002, -3.1185546e-002, -1.0012818e-002, + -9.3068008e-003, -1.2733027e-001, -2.4660461e-002, -6.9689614e-002, + 6.7705187e-002, -9.0527945e-002, -8.9240761e-003, -3.6546741e-002, + -7.8518923e-003, 6.0277518e-002, 8.8143610e-002, -3.6670503e-002, + 5.9594768e-002, -6.2854695e-002, 8.4561367e-003, 4.2531503e-002, + 1.2490411e-001, -1.2983679e-002, 4.8837441e-002, 2.8397759e-002, + 4.9265357e-004, -5.0014029e-002, -6.4438003e-002, 6.3709335e-002, + -8.3485243e-002, -1.3662989e-002, -1.1010182e-002, -4.1630589e-004, + 3.7231066e-002, 5.8354336e-002, 1.4802151e-002, -9.2736005e-003, + 7.0150240e-002, -7.5624119e-002, -1.8709434e-002, 8.1817931e-002, + 1.0532906e-001, -6.6715765e-002, 1.1083842e-002, -7.4493893e-002, + -9.9142748e-003, 6.2718554e-002, 2.7079763e-002, -2.5876824e-002, + -4.8123789e-002, 6.1857353e-002, -4.2675136e-002, -6.2163117e-002, + -7.4268325e-002, -2.9318352e-002, -3.3154279e-002, 4.8684897e-002, + -2.4063594e-002, -8.6147192e-002, -7.1972623e-003, -4.4253121e-002, + -2.1162236e-003, -3.5637316e-002, -5.0298912e-003, 1.9549988e-002, + -3.1928938e-002, -4.5581285e-002, 4.7829407e-002, 8.7149645e-002, + 4.0640515e-002, 1.4297447e-002, 9.8222629e-003, 3.2853388e-002, + 6.8740447e-002, -1.2177132e-001, 9.4625764e-002, -1.5776485e-002, + -3.2495760e-002, 3.0796063e-002, -1.5368625e-002, -7.9526144e-002, + -6.2453602e-002, 5.9616092e-002, -6.4260784e-002, 1.5966646e-002, + 3.1495482e-002, 6.5589632e-002, -3.4614182e-002, -6.9190746e-002, + -2.0874294e-002, 1.3630214e-002, 5.3339825e-002, 1.6147000e-002, + 4.2668360e-002, -2.5662017e-002, 4.5348429e-003, 6.1345954e-002, + 4.1541021e-002, -4.9887559e-002, -5.8465581e-002, -2.1207204e-002, + 7.9091417e-003, -1.2334773e-002, -1.0617181e-001, 8.9782313e-002, + -6.8274917e-002, 2.1132464e-002, 5.7348207e-003, -9.2561293e-003, + -3.7038110e-002, -2.8239427e-002, 1.8178841e-002, -3.9897232e-002, + 1.0250394e-002, 6.3382126e-002, 3.1483520e-002, -1.4611403e-002, + -4.1066531e-003, 5.7642552e-002, 1.2244865e-002, 3.7434406e-002, + 2.2822222e-002, 9.2902509e-002, 1.1325867e-002, -6.2025695e-002, + 1.5489679e-002, -1.6179136e-002, -1.7726855e-003, 8.7415263e-002, + 2.9780528e-002, -6.5055050e-002, -1.7262184e-002, -1.2062737e-002, + 4.1904361e-002, -3.4331618e-002, 1.2164792e-001, 4.9603771e-002, + -1.3061748e-002, 1.1007232e-002, -1.4216546e-002, -3.5763228e-002, + 1.2025510e-002, 8.2989866e-002, 2.0160053e-002, -1.6822685e-002, + 7.3528826e-003, 2.0923780e-002, 5.2711615e-003, -2.5691601e-002, + 4.5395884e-002, -1.5802909e-003, 6.8782769e-002, 1.1122473e-001, + 1.0025602e-001, 1.3910254e-001, -8.5937461e-002, 3.2274784e-002, + 4.8447219e-002, -7.6279744e-002, -9.4932243e-002, -4.6596008e-002, + 6.9567452e-002, -2.0821944e-002, 2.8782945e-002, -1.8673196e-002, + -1.0249668e-003, 3.0785039e-003, 7.5883489e-002, -6.3193813e-003, + 7.7764074e-002, -4.3608077e-002, -1.3123466e-002, 3.6824621e-003, + -5.9201109e-002, -2.3113816e-002, -8.8488271e-002, -1.1032349e-002, + -2.3364616e-003, -6.5601368e-002, 1.4329878e-001, 9.5131857e-002, + 4.2865722e-002, -9.6979502e-002, -3.5638863e-002, 9.0205848e-002, + 1.9877782e-002, -1.2497646e-001, 2.5802125e-002, 4.6840610e-002, + -4.7117859e-002, -1.0958747e-001, -4.6687284e-002, 3.3044810e-003, + -4.3352639e-002, 5.5404689e-002, -1.4901969e-001, -6.5836290e-003, + -8.3908961e-002, -8.4786953e-003, 2.6778741e-002, -7.1364019e-002, + 2.9762397e-002, 3.8378977e-002, -1.3678167e-002, 1.0245114e-002, + -6.8802397e-002, -7.9396342e-002, 8.9092342e-002, -2.5071896e-002, + 1.6416317e-001, -3.3416141e-002, -8.8098549e-002, -2.8516999e-002, + -2.8171336e-002, 1.4735227e-002, 2.1490528e-002, 1.0996266e-002, + -7.9010073e-002, 1.3973632e-002, 8.5196514e-002, -3.4922417e-002, + 3.4433947e-002, 4.5850060e-002, -6.6284133e-002, -1.0572099e-001, + -6.6431349e-002, 6.0325770e-002, -9.2479536e-003, -2.2892434e-002, + -3.9861268e-002, 7.7138209e-002, 1.1492915e-002, 3.1465738e-002, + -1.2138307e-002, 4.7630033e-002, -9.7311603e-003, 1.3770049e-002, + -7.3660639e-003, 7.4335649e-002, -3.6628135e-003, 1.2752549e-002, + 1.3838186e-002, 4.2180077e-004, -5.4375913e-002, 2.1917738e-002, + -1.2614454e-002, -2.3342227e-002, -6.4971690e-002, 1.6110329e-002, + 1.4737048e-002, 3.0388287e-002, -1.6824888e-002, 1.7295248e-002, + 1.0812445e-002, -5.5425021e-002, -4.9277740e-002, 5.0707632e-002, + 4.1922806e-002, 1.8455962e-002, 5.0365924e-002, 4.4298398e-002, + 7.6431843e-003, 5.9989537e-002, -7.6908515e-002, 2.8530229e-002, + 9.5653590e-002, -7.2017798e-002, -8.0655593e-003, 1.0083818e-001, + 4.9232556e-002, -6.6242009e-002, 2.9556295e-003, -3.5960545e-002, + 1.1419955e-002, 6.6825880e-003, 2.9477422e-002, -2.9472636e-002, + 5.5236681e-002, 2.8874435e-002, -2.2350145e-002, -1.4664332e-002, + -6.8185763e-002, -2.0916584e-003, -6.2584599e-003, 5.9273963e-003, + 9.7345621e-002, 1.7069987e-002, -3.5800212e-002, 3.8397984e-002, + -4.6760839e-002, -5.0292748e-002, -2.1914980e-002, -1.8316586e-003, + -5.2956111e-002, -4.4811672e-003, 6.3511854e-002, -5.7468947e-002, + 3.3773578e-003, -6.2827625e-002, -1.0672637e-001, -2.3481169e-002, + -4.9309562e-002, -9.6720496e-003, 5.8540389e-002, -1.4927692e-002, + 4.5935378e-002, -1.5630681e-003, -1.8325545e-002, 3.2884463e-002, + 2.3472286e-002, 1.9480110e-002, -1.5164953e-002, 5.0952861e-004, + 3.6924652e-002, 3.9980199e-003, 2.7122068e-002, 4.0586323e-002, + -6.8458269e-004, 2.4214833e-002, -2.6547884e-002, -2.4783823e-002, + 8.8816623e-002, 5.5882019e-002, 5.3618064e-003, -1.1671543e-001, + -8.2213149e-002, -9.6951820e-002, 7.3380548e-002, -1.2640056e-003, + 4.1876563e-002, 2.5405425e-002, 2.4599929e-002, 1.4178532e-002, + 5.5594418e-003, 4.2950164e-002, 1.8014601e-003, -1.2215360e-001, + 1.0493101e-001, 3.1735201e-002, 5.5741286e-003, -3.2479076e-002, + 2.6681545e-002, 2.8019414e-002, -8.0179790e-003, 3.1489206e-002, + 4.3033256e-003, -3.7630185e-002, 5.3039128e-002, 5.1506634e-002, + -1.7820552e-002, -2.4621551e-002, -5.5322066e-002, 2.5011123e-002, + -4.7866728e-002, -1.0796552e-002, -3.3392282e-002, -4.7783524e-002, + -1.8094968e-002, -7.2520784e-002, -6.5389567e-002, 3.9464487e-002, + -9.8809443e-003, 3.1120895e-002, -5.4329781e-002, 1.6954674e-002, + -4.8954224e-002, 7.3972200e-002, 4.7640882e-002, 3.0356780e-002, + 9.5741578e-003, -4.1590063e-002, 1.1287435e-001, -8.6416889e-003, + -2.2674367e-002, 2.1388361e-003, 5.5542441e-002, 1.0045614e-002, + -8.7522721e-002, 8.7719983e-003, 6.7355731e-002, -1.6159743e-002, + 8.7223484e-003, 6.0092014e-002, -9.4184958e-002, -3.6268920e-002, + -2.1332232e-002, -3.1682036e-002, 2.8664908e-002, 2.6541157e-002, + -1.0689359e-001, -7.0862918e-002, -1.1433268e-001, 3.4863935e-002, + 1.0709581e-002, -5.5513033e-002, -1.5617145e-002, 1.9399041e-003, + 6.6680970e-002, -3.5719944e-002, -5.5335504e-002, -9.3481167e-002, + 2.3589372e-002, 1.2307760e-002, -4.1853305e-002, 3.2086368e-002, + 1.3207910e-002, -1.2902915e-002, 4.0576229e-002, -3.1174299e-002, + -4.7359539e-002, 3.2639664e-002, 6.8807350e-002, 3.0052612e-002, + -1.6360841e-002, 7.3692525e-002, 2.3214010e-002, -1.9279486e-003, + -2.9304762e-002, 1.4092775e-002, -3.8475139e-002, 4.0205235e-002, + 3.5637448e-002, 3.1815236e-002, 5.4193437e-002, 2.7101101e-002, + -7.8492340e-002, -1.3053183e-002, 9.8943970e-002, 3.2605663e-002, + -5.3326325e-002, 4.7045271e-002, 1.9171127e-002, -7.0639869e-002, + -2.6942346e-002, 2.1897131e-002, 4.4342108e-002, 2.5419609e-002, + 6.5525042e-002, -6.2924979e-002, 4.2919074e-002, 5.7909339e-002, + -2.0016289e-002, -7.1844831e-004, 3.3287795e-003, 5.2391582e-002, + 5.1351648e-002, 6.9345017e-002, 1.6715079e-002, 1.0245380e-001, + 6.5560454e-003, -4.2978289e-002, 5.1857486e-002, 1.6375558e-002, + -1.1231560e-001, 1.8452057e-002, 2.7196151e-002, -4.7948818e-002, + 3.8838999e-002, -8.1296721e-002, -4.4213439e-002, 3.3789367e-002, + -8.9903386e-002, -4.8309819e-002, 3.0350368e-002, 9.3462798e-003, + -4.3576313e-002, 5.0364033e-002, -3.3705706e-002, 6.9992170e-002, + 9.4421577e-002, -3.7859282e-002, -2.4699603e-002, 5.0385013e-002, + -5.4216273e-002, 6.9692784e-002, 1.0150382e-001, 1.7548633e-002, + 9.8962282e-003, -5.6862743e-002, 4.1445815e-002, 1.9635439e-002, + -3.1828877e-002, -7.5389343e-003, -2.2662898e-002, -9.3225720e-003, + 3.3794402e-002, -1.5022139e-002, -8.3952470e-002, -4.4638734e-003, + 5.0977217e-002, -5.6868826e-002, 8.2257315e-002, -3.3527792e-002, + -3.8753182e-002, -8.9806282e-002, 6.8640832e-004, 7.2265978e-002, + -1.2264922e-001, 1.0964559e-002, -6.3412284e-002, 1.2106129e-001, + -8.5320894e-002, -3.7961427e-002, -4.1350954e-002, -6.7090729e-002, + 4.9718886e-002, -3.3874055e-002, -7.1699033e-002, 2.5203129e-002, + 2.0350140e-002, 6.4638571e-002, -7.2804864e-002, 2.3308871e-002, + 1.5264191e-003, -1.1191223e-001, -6.0619938e-002, -2.2397074e-003, + 6.8646240e-002, -9.5147638e-003, -8.9258460e-003, -2.2587656e-002, + -8.8042374e-003, 2.7917130e-002, 3.0703476e-002, 4.0753823e-002, + -1.9174676e-002, 7.6285732e-002, 5.5310628e-003, 6.7972330e-002, + 1.6915582e-002, -3.3407461e-002, 2.3263797e-002, 3.1563985e-002, + 6.0315051e-004, -3.1286618e-002, -1.1639905e-002, -1.2659763e-002, + 1.2883340e-003, -5.0171053e-002, -4.9900923e-003, -1.0228083e-001, + -4.8479815e-002, -2.9928321e-002, -5.5916163e-002, 4.7735428e-002, + -1.3294429e-003, -7.5136122e-003, 5.4331339e-002, -4.2475157e-002, + -3.2342585e-002, -2.1096262e-002, 4.8946925e-002, -7.7232620e-002, + 4.6424245e-002, -7.1029625e-002, -8.3080699e-003, -1.8848230e-002, + -3.3058342e-002, 2.4301547e-002, -1.9950837e-002, -2.6746721e-002, + -3.1244062e-002, 4.9214132e-002, -4.3837753e-002, -2.6533780e-002, + -3.2174063e-002, 3.1234554e-002, 1.8396020e-002, 4.2139477e-003, + -6.3624347e-002, 3.8068496e-002, -7.5273414e-002, -5.4282683e-002, + 1.0378638e-001, -5.4062955e-002, 1.0025793e-002, -6.6450371e-003, + 8.2632045e-002, -1.1994389e-001, 3.1022007e-002, -3.1118158e-002, + 5.0953443e-002, -5.1605376e-002, -4.8568100e-002, -7.4390375e-003, + -4.7877758e-002, -9.4953155e-003, -2.6931667e-003, 2.3165347e-002, + 5.9754385e-003, 2.5900617e-002, -1.5042605e-002, -1.4480424e-002, + 4.2074657e-002, 8.9476498e-002, 4.5100917e-002, -5.1593045e-002, + 6.0834274e-002, 4.0989664e-002, -1.7405350e-002, 5.9998834e-002, + 1.2416742e-002, 1.8605073e-002, 1.0892550e-001, -3.2491824e-002, + -3.1135526e-002, -2.9815887e-002, 2.0205791e-002, 1.6566794e-002, + 7.0071566e-002, -4.9569656e-002, 3.9921784e-002, -2.8730117e-002, + -1.7587977e-002, 7.1500463e-002, 3.6872018e-002, -3.4586232e-002, + -1.6970720e-002, 3.4644172e-002, -2.0901296e-002, 4.2141589e-002, + -7.6319420e-002, 4.5998962e-002, -7.3399778e-002, -8.1916522e-002, + 3.8464961e-002, -1.1521599e-002, 7.2694972e-002, -3.9337982e-002, + 5.9084598e-002, -3.4257913e-002, -8.6242832e-002, -2.5477654e-002, + 1.5161827e-002, 4.3686125e-003, -1.1656981e-002, -1.5563664e-002, + 6.2510087e-002, -1.0836642e-002, 1.2432558e-001, -2.2959202e-002, + 1.3783634e-003, 3.3269441e-002, 3.8750648e-002, -1.3656516e-002, + 5.9833997e-002, 1.4796841e-002, -2.2627766e-003, 4.9145114e-002, + -1.1354640e-001, 1.3391314e-002, -1.3806188e-002, 2.7218571e-002, + -3.9102606e-002, 1.0801438e-002, -3.4971279e-002, -2.3190242e-002, + -1.6194699e-002, -1.9332419e-002, -2.7390066e-003, 1.8022691e-002, + -1.5832667e-002, -9.2546225e-003, -6.4699491e-002, 4.7590650e-002, + 5.4590011e-002, -2.0868480e-002, 4.8372708e-003, 3.5635613e-002, + 4.9026328e-002, -2.8886176e-002, 2.4904926e-002, 4.6825265e-002, + -4.1467334e-003, -7.4816934e-002, 2.4155196e-002, -1.2145775e-002, + -4.8433817e-002, -5.1333974e-002, -7.6611960e-004, -2.0288664e-003, + 4.4132138e-002, 1.3884023e-002, 3.3438764e-002, -1.7045598e-002, + -1.3981286e-003, 6.0450703e-002, 1.6026951e-002, -1.0038212e-002, + -5.9082814e-002, -6.8065244e-003, -2.0735019e-002, 6.4134665e-002, + 8.5071176e-003, -2.2373060e-002, 4.3619700e-002, 1.5963047e-002, + -3.0249871e-002, -8.3796187e-002, -3.4276448e-002, 5.3600630e-002, + -4.6111635e-002, 3.2125595e-002, 5.8851999e-002, -7.8040384e-002, + 5.2267851e-002, 3.4435223e-002, 2.1556971e-002, -1.7163880e-002, + -5.0843277e-002, -3.2488185e-002, -1.7547962e-002, 3.1629302e-003, + 1.1087340e-001, 5.8821833e-002, 2.7600291e-003, -1.8466769e-002, + 3.1019364e-002, 6.9714994e-002, 2.6197162e-002, -2.5002333e-002, + 2.1238793e-003, 6.3553430e-002, -3.4198265e-002, 4.8709571e-002, + -7.2299086e-002, -4.3035088e-002, 3.5760525e-002, 5.3143565e-002, + 2.8080467e-002, 7.4687831e-004, 3.3589299e-002, -2.7857822e-002, + 9.3293970e-002, -3.1352513e-003, -1.1227005e-003, -4.5092687e-002, + -2.5306886e-002, -1.0822730e-001, -6.5870362e-002, 5.0646576e-003, + -5.7436235e-002, 3.2011690e-002, -3.5040739e-003, -3.9957599e-002, + 1.6341870e-002, -7.6498865e-003, -2.5256813e-002, 2.8585914e-002, + -6.4304885e-002, -7.0698223e-002, -9.2642094e-002, -5.6328267e-002, + -8.0773935e-002, -6.5074477e-002, 2.0294178e-003, -2.4072922e-002, + 4.2458044e-002, 4.7875614e-003, -4.2143264e-002, -2.8324995e-002, + -2.9328658e-002, -9.2678479e-002, 4.5617708e-002, 1.2685434e-002, + -5.4340728e-002, 4.2087780e-002, 4.0016732e-002, -1.2299481e-001, + 1.0379559e-001, 5.7020403e-002, -3.9544599e-002, -1.8766513e-002, + 3.2158071e-002, 7.3924530e-002, -4.6618108e-003, -5.5299328e-002, + 4.4245720e-002, 3.7174478e-003, 3.4306804e-003, 4.2213951e-002, + -9.1086002e-002, 1.5797797e-003, -1.0094297e-001, -3.1042592e-002, + 1.6312788e-002, -5.7643992e-002, 8.5044833e-003, -5.8166289e-002, + 1.9822525e-002, -1.4404965e-001, -5.5582362e-002, -4.5001443e-003, + -8.6256453e-003, -1.0195382e-002, -3.5860515e-002, -6.9432334e-002, + -3.8266022e-002, -4.0918161e-002, -1.1863163e-002, 5.0949718e-002, + -8.0206291e-002, -2.6240511e-002, 7.6676678e-002, -6.5416559e-002, + -1.4318918e-002, -4.3958025e-002, -2.1978148e-002, -6.4422744e-002, + -2.2733013e-002, 1.2900773e-002, -1.7819685e-002, -4.7785428e-003, + 3.4686226e-002, 6.4004707e-002, -5.3322786e-002, -1.8493916e-002, + 4.9290003e-002, -4.5065517e-002, -2.9327742e-002, 2.3212884e-002, + -4.8985889e-002, 2.9604806e-003, -7.0253020e-003, -9.2397443e-002, + -7.6453564e-002, -3.4155955e-002, -1.0082514e-001, -8.0072913e-002, + 5.9487693e-002, -3.2053752e-002, -3.4654709e-002, -4.2857910e-002, + 4.3434899e-002, -6.1610488e-002, 2.3564532e-002, 5.0395882e-002, + -1.0869004e-002, 2.7674042e-002, 4.1961384e-004, 1.1474642e-001, + 1.5501309e-002, 5.3729017e-002, 8.2294950e-002, 3.6090309e-002, + 3.2405617e-002, 7.8649811e-002, 1.3050292e-002, -1.6718241e-002, + -4.2514925e-002, 2.0638931e-003, -1.0261822e-001, 5.5517573e-002, + -2.6256624e-003, 7.3917084e-002, -3.2038338e-002, 5.9286807e-003, + -4.9553265e-002, 4.0402131e-003, 1.9006069e-002, 1.5037719e-002, + -3.8431930e-002, -3.4089576e-003, -2.8898708e-003, -5.1916447e-002, + -9.3843168e-002, 2.9937678e-002, -3.9290957e-002, 4.4290160e-002, + -4.2250820e-002, -1.6616660e-002, -1.0653179e-002, -3.4916960e-002, + -3.1852948e-002, 1.8960722e-002, 6.0590194e-002, 1.7919981e-002, + -2.1735260e-002, 2.5431032e-003, -2.3276711e-003, 4.7679757e-003, + 2.6771182e-002, -8.0137596e-002, -4.9700338e-002, 2.4445536e-002, + -7.2537218e-002, -1.8968099e-002, 6.6550477e-002, 6.7579085e-002, + -3.1351180e-002, 1.6129275e-002, 3.6101242e-002, 1.1199196e-002, + 7.9145428e-003, 4.0067468e-002, 6.0585461e-003, -7.4588015e-003, + 2.1235782e-002, 6.3041751e-003, -1.1634076e-003, 2.2258425e-002, + -3.4248029e-002, -4.5811428e-002, 1.0578831e-002, -5.5482586e-002, + -6.8507992e-002, -7.7083934e-002, -5.3913115e-002, 5.9790071e-002, + -2.0841051e-002, 2.3080531e-002, 1.1187349e-001, -7.1392621e-002, + 2.9668837e-003, -2.9860507e-002, 4.6683202e-002, 8.5830739e-002, + -2.0897455e-002, 3.2863177e-002, 2.2323987e-002, 4.8358711e-002, + 8.7562303e-003, 1.4793712e-002, -2.5985375e-002, -4.6720770e-002, + -5.9782514e-002, -4.2989314e-002, 7.8223798e-002, 1.1501209e-001, + 1.2024343e-001, -5.6786240e-002, -4.8421534e-002, -2.5415443e-002, + 2.4664879e-002, 1.7783775e-002, 2.0466227e-002, 7.8206669e-002, + -8.2391143e-002, -1.3995146e-002, -2.0960454e-002, -5.6618569e-002, + -2.6705178e-002, -8.1531358e-002, 6.4664818e-003, 5.6946318e-002, + 5.0003662e-002, 3.5673980e-002, 8.0875426e-002, -4.4495078e-002, + -2.6194380e-002, 4.5188183e-002, -4.2455744e-002, 5.7249340e-002, + -4.6127242e-002, -5.4839710e-002, -5.0448334e-002, -2.2395030e-004, + -6.2981968e-002, 3.6554485e-002, 4.5243127e-003, 6.8154599e-003, + 1.6305659e-001, 3.9595164e-003, -1.0792651e-002, -2.8054860e-002, + -9.9706967e-002, 2.3929942e-002, -3.5658959e-004, 6.6546468e-002, + 7.6294884e-002, -4.0440534e-002, -8.1371512e-002, -7.7127876e-002, + 3.4857333e-002, 4.3231191e-002, 2.2144645e-002, -3.8698213e-002, + -5.4129054e-002, -3.2626325e-002, -7.0222190e-002, -5.1754787e-002, + -9.5744838e-002, -1.7610262e-003, 8.7360648e-003, -4.6748263e-002, + -4.4850953e-002, 8.2298815e-002, 1.0185814e-002, -3.0866560e-004, + 1.6675645e-002, -4.2935404e-002, -3.1656641e-002, -5.6516863e-002, + -4.7656267e-004, 1.0889961e-001, 1.2029252e-002, -1.3472583e-002, + 3.6157205e-002, 4.4803936e-002, 1.5275167e-002, -4.7686528e-002, + 6.0330901e-002, 1.3728328e-002, 4.8689836e-002, -3.5294359e-002, + -7.4547708e-002, 3.0394600e-002, 8.6384237e-002, -4.9979038e-002, + 1.3943821e-002, -8.2317359e-002, 2.6078427e-002, -4.8139628e-002, + -5.8720671e-002, 5.3289578e-003, -2.4543964e-002, -3.1049552e-002, + -6.8795054e-002, 2.6130466e-002, 6.4881211e-003, -1.7466698e-002, + 6.9418212e-002, 9.6543814e-002, 1.6716383e-002, 1.0116932e-001, + 3.1515754e-002, -1.5792490e-001, -3.1915346e-002, -4.3203259e-002, + -1.3039328e-002, 1.0861618e-002, 2.0098174e-002, -5.8931575e-002, + 4.5019833e-002, -4.4827929e-002, -8.5719969e-002, 4.7105627e-002, + 8.1454794e-002, 1.5516734e-002, -5.0548980e-002, 5.9127415e-003, + -7.5578193e-002, 1.1628813e-001, 4.7500758e-002, 4.9223640e-002, + 2.2248040e-002, -1.7063173e-002, 6.7174653e-002, -8.8027078e-003, + -7.9122977e-002, -2.7534155e-002, 1.8033777e-002, -6.3064595e-002, + -3.2992531e-002, -1.3414397e-002, -3.7650237e-002, -5.4990281e-003, + 4.9549050e-002, -7.8256965e-002, -4.6347502e-002, -3.7844657e-002, + -4.6727423e-002, 5.1371291e-002, -3.1964828e-002, -1.5232444e-003, + -6.8143489e-002, -5.5095855e-002, -1.0895044e-002, -2.5604041e-003, + 2.7027105e-002, -7.6982878e-003, -9.5337685e-002, -1.8635429e-002, + -1.0751357e-001, -5.6070283e-002, 1.4123461e-002, -1.8192970e-002, + 4.4540436e-002, 1.3600658e-002, 3.2261098e-002, 4.4861229e-002, + -1.5863787e-002, -1.0092780e-002, -3.9516555e-003, 3.8360973e-002, + 6.1804829e-002, 1.0870303e-001, 4.7383438e-002, -5.0590863e-002, + -5.2113776e-002, 5.2393207e-002, 1.2177198e-002, 6.2526425e-002, + 8.3174224e-003, -2.4071062e-002, 2.8581013e-002, -6.0028375e-003, + 1.5238535e-002, 5.2025149e-003, -3.6385591e-002, -9.3463539e-003, + -9.7549044e-003, 4.1434624e-002, -3.5638211e-002, 6.1524697e-002, + 1.2879217e-002, -1.1074718e-002, 7.5826917e-003, -4.3450751e-002, + -3.4027473e-002, 6.3700920e-002, -5.2272643e-002, -2.8750180e-002, + 4.0041018e-002, -8.1966458e-002, -1.0461089e-002, 2.5452300e-002, + 6.7107297e-002, -3.3918191e-002, -1.0212989e-001, -6.3527291e-002, + 3.1678548e-002, -6.5778118e-002, -1.6823229e-002, 2.2988117e-003, + -4.8242461e-002, -1.4582693e-002, -4.9060246e-002, -3.4256626e-003, + 4.1172518e-002, 3.2772250e-002, 2.4890066e-002, 3.4522929e-003, + 4.4704585e-002, -5.9967401e-002, 1.4541680e-002, -7.9411114e-002, + -6.5131143e-002, -4.2051810e-002, 4.2103006e-002, -9.8683984e-004, + -5.0962061e-003, -2.2606406e-002, -1.2325980e-001, 9.5086419e-002, + -1.9106034e-002, -5.1992218e-002, -6.7436377e-002, -1.5798067e-002, + -7.5885603e-002, 1.7614604e-002, 3.0602185e-002, -4.5707990e-002, + 5.0279499e-002, 1.3599448e-002, -8.4652879e-002, 1.4275404e-002, + 5.3761838e-002, 1.3130364e-002, -5.7785349e-003, 1.0995249e-001, + 3.6117865e-002, 2.2136081e-002, 1.1263325e-002, -4.9338919e-002, + 4.2415991e-002, -6.3570185e-002, 5.1525003e-002, 8.9408937e-002, + -4.3531507e-002, 2.5382423e-002, 5.7394710e-002, 1.1827633e-001, + -1.4335949e-002, 2.4596850e-002, -1.8394004e-002, 1.3479964e-002, + -5.5450915e-002, -1.3887857e-002, 3.7399926e-002, 4.2692709e-002, + -9.1345703e-002, -6.4179097e-002, 5.1528849e-002, 1.1923834e-001, + 8.0392828e-003, -7.4190647e-003, 1.1158220e-002, 2.3106872e-002, + 2.5289633e-002, -7.8109586e-002, 4.4033891e-002, 2.9868351e-002, + 2.5709704e-002, 6.5446252e-003, 1.7279125e-002, 8.8849380e-002, + -4.2399471e-002, 3.2297167e-002, -3.3758385e-002, 5.3666150e-002, + 3.7628322e-002, -1.3602948e-002, 8.3115154e-002, -4.4130785e-002, + 1.5545953e-002, -5.7188645e-002, 3.3708440e-002, 7.9527486e-003, + 7.2838427e-002, -8.7159852e-004, 9.8852335e-002, 4.3261724e-002, + -2.2410237e-002, -1.9969511e-002, 1.3049591e-002, 1.3520410e-001}; + +float audiobeam_mic_locations[15][3] = { + {1.5, 2.79, 0}, {1.5, 2.82, 0}, {1.5, 2.85, 0}, {1.5, 2.88, 0}, + {1.5, 2.91, 0}, {1.5, 2.94, 0}, {1.5, 2.97, 0}, {1.5, 3, 0}, + {1.5, 3.03, 0}, {1.5, 3.06, 0}, {1.5, 3.09, 0}, {1.5, 3.12, 0}, + {1.5, 3.15, 0}, {1.5, 3.18, 0}, {1.5, 3.21, 0}}; + +float audiobeam_source_location[3] = {1.1677, 2.1677, 1}; + +float audiobeam_origin_location[3] = {1.5, 3, 0}; diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.c new file mode 100644 index 0000000..41a42a1 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.c @@ -0,0 +1,425 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibm.c + + Author: Ian Lance Taylor and J.T. Conklin + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#include "audiobeamlibm.h" +#include "audiobeamlibmath.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const int audiobeam_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +static const float audiobeam_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + audiobeam_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + audiobeam_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + audiobeam_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + audiobeam_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + audiobeam_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + audiobeam_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +static const float audiobeam_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + audiobeam_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + audiobeam_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + audiobeam_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + audiobeam_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + audiobeam_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +static const float audiobeam_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + audiobeam_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + audiobeam_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + audiobeam_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + audiobeam_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + audiobeam_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +static const float audiobeam_two25 = 3.355443200e+07f, /* 0x4c000000 */ + audiobeam_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +int +audiobeam___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int i, j, n = 0, ix, hx; + + AUDIOBEAM_GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { + if (hx > 0) { + z = x - audiobeam_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { + y[0] = z - audiobeam_pio2_1t; + y[1] = (z - y[0]) - audiobeam_pio2_1t; + } else { + z -= audiobeam_pio2_2; + y[0] = z - audiobeam_pio2_2t; + y[1] = (z - y[0]) - audiobeam_pio2_2t; + } + return 1; + } else { + z = x + audiobeam_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { + y[0] = z + audiobeam_pio2_1t; + y[1] = (z - y[0]) + audiobeam_pio2_1t; + } else { + z += audiobeam_pio2_2; + y[0] = z + audiobeam_pio2_2t; + y[1] = (z - y[0]) + audiobeam_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { + t = audiobeam_fabsf(x); + n = (int) (t * audiobeam_invpio2 + audiobeam_half); + fn = (float) n; + r = t - fn * audiobeam_pio2_1; + w = fn * audiobeam_pio2_1t; + if (n < 32 && (int) (ix & 0xffffff00) != audiobeam_npio2_hw[n - 1]) + y[0] = r - w; + else { + unsigned int high; + j = ix >> 23; + y[0] = r - w; + AUDIOBEAM_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { + t = r; + w = fn * audiobeam_pio2_2; + r = t - w; + w = fn * audiobeam_pio2_2t - ((t - r) - w); + y[0] = r - w; + AUDIOBEAM_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { + t = r; + w = fn * audiobeam_pio2_3; + r = t - w; + w = fn * audiobeam_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + if (ix >= 0x7f800000) { + y[0] = y[1] = x - x; + return 0; + } + + return n; +} + +float +audiobeam___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix < 0x32000000) { + if (((int) x) == 0) + return audiobeam_one; + } + z = x * x; + r = z * (audiobeam_C1 + + z * (audiobeam_C2 + + z * (audiobeam_C3 + + z * (audiobeam_C4 + + z * (audiobeam_C5 + z * audiobeam_C6))))); + if (ix < 0x3e99999a) + return audiobeam_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) + qx = (float) 0.28125f; + else + AUDIOBEAM_SET_FLOAT_WORD(qx, ix - 0x01000000); + hz = (float) 0.5f * z - qx; + a = audiobeam_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +float +audiobeam___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix < 0x32000000) { + if ((int) x == 0) + return x; + } + z = x * x; + v = z * x; + r = audiobeam_S2 + + z * (audiobeam_S3 + + z * (audiobeam_S4 + z * (audiobeam_S5 + z * audiobeam_S6))); + if (iy == 0) + return x + v * (audiobeam_S1 + z * r); + else + return x - ((z * (audiobeam_half * y - v * r) - y) - v * audiobeam_S1); +} + +float +audiobeam___copysignf(float x, float y) { + unsigned int ix, iy; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + AUDIOBEAM_GET_FLOAT_WORD(iy, y); + AUDIOBEAM_SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +float +audiobeam___cosf(float x) { + float y[2], z = 0.0f; + int n, ix; + + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return audiobeam___kernel_cosf(x, z); + + else if (ix >= 0x7f800000) + return x - x; + + else { + y[0] = 0.0; + y[1] = 0.0; + n = audiobeam___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return audiobeam___kernel_cosf(y[0], y[1]); + case 1: + return -audiobeam___kernel_sinf(y[0], y[1], 1); + case 2: + return -audiobeam___kernel_cosf(y[0], y[1]); + default: + return audiobeam___kernel_sinf(y[0], y[1], 1); + } + } +} + +float +audiobeam___fabsf(float x) { + unsigned int ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + AUDIOBEAM_SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +float +audiobeam___floorf(float x) { + int i0, j0; + unsigned int i; + AUDIOBEAM_GET_FLOAT_WORD(i0, x); + j0 = ((i0 >> 23) & 0xff) - 0x7f; + if (j0 < 23) { + if (j0 < 0) { + if (audiobeam_huge + x > (float) 0.0f) { + if (i0 >= 0) + i0 = 0; + else if ((i0 & 0x7fffffff) != 0) + i0 = 0xbf800000; + } + } else { + i = (0x007fffff) >> j0; + if ((i0 & i) == 0) + return x; + if (audiobeam_huge + x > (float) 0.0f) { + if (i0 < 0) + i0 += (0x00800000) >> j0; + i0 &= (~i); + } + } + } else { + if (j0 == 0x80) + return x + x; + else + return x; + } + AUDIOBEAM_SET_FLOAT_WORD(x, i0); + return x; +} + +int +audiobeam___isinff(float x) { + int ix, t; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +float +audiobeam___scalbnf(float x, int n) { + int k, ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; + if (k == 0) { + if ((ix & 0x7fffffff) == 0) + return x; + x *= audiobeam_two25; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; + k = k + n; + if (n > 50000 || k > 0xfe) + return audiobeam_huge * audiobeam___copysignf(audiobeam_huge, x); + if (n < -50000) + return audiobeam_tiny * audiobeam___copysignf(audiobeam_tiny, x); + if (k > 0) { + AUDIOBEAM_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return audiobeam_tiny * audiobeam___copysignf(audiobeam_tiny, x); + k += 25; + AUDIOBEAM_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * audiobeam_twom25; +} + +float +audiobeam___ceilf(float x) { + int i0, j0; + unsigned int i; + + AUDIOBEAM_GET_FLOAT_WORD(i0, x); + j0 = ((i0 >> 23) & 0xff) - 0x7f; + if (j0 < 23) { + if (j0 < 0) { + if (audiobeam_huge + x > (float) 0.0) { + if (i0 < 0) + i0 = 0x80000000; + else if (i0 != 0) + i0 = 0x3f800000; + } + } else { + i = (0x007fffff) >> j0; + if ((i0 & i) == 0) + return x; + if (audiobeam_huge + x > (float) 0.0) { + if (i0 > 0) + i0 += (0x00800000) >> j0; + i0 &= (~i); + } + } + } else { + if (j0 == 0x80) + return x + x; + else + return x; + } + AUDIOBEAM_SET_FLOAT_WORD(x, i0); + return x; +} + +float +audiobeam___ieee754_sqrtf(float x) { + float z; + int sign = (int) 0x80000000; + int ix, s, q, m, t, i; + unsigned int r; + + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + + if ((ix & 0x7f800000) == 0x7f800000) + return x * x + x; + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; + else if (ix < 0) + return (x - x) / (x - x); + } + m = (ix >> 23); + if (m == 0) { + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) + ix += ix; + m >>= 1; + + ix += ix; + q = s = 0; + r = 0x01000000; + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + if (ix != 0) { + z = audiobeam_one - audiobeam_tiny; + if (z >= audiobeam_one) { + z = audiobeam_one + audiobeam_tiny; + if (z > audiobeam_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + AUDIOBEAM_SET_FLOAT_WORD(z, ix); + return z; +} diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.h new file mode 100644 index 0000000..9c2423b --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibm.h @@ -0,0 +1,56 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See audiobeamlibm.c + +*/ + +#ifndef AUDIOBEAM_LIBM +#define AUDIOBEAM_LIBM + +#define audiobeam_M_PI 3.14159265358979323846 + +static const float audiobeam_one = 1.0f, audiobeam_tiny = 1.0e-30f, + audiobeam_half = 5.0000000000e-01, /* 0x3f000000 */ + audiobeam_huge = 1.0e30, audiobeam_two8 = 2.5600000000e+02, /* 0x43800000 */ + audiobeam_twon8 = 3.9062500000e-03, /* 0x3b800000 */ + audiobeam_zero = 0.0; + +#define audiobeam_cos audiobeam___cosf +#define audiobeam_fabs audiobeam___fabsf +#define audiobeam_fabsf audiobeam___fabsf +#define audiobeam_isinf audiobeam___isinff +#define audiobeam_sqrt audiobeam___ieee754_sqrtf +#define audiobeam_ceil audiobeam___ceilf +#define audiobeam_floor audiobeam___floorf + +float audiobeam___copysignf(float x, float y); +float audiobeam___cosf(float x); +float audiobeam___fabsf(float x); +float audiobeam___floorf(float x); +int audiobeam___ieee754_rem_pio2f(float x, float *y); +float audiobeam___ieee754_sqrtf(float x); +int audiobeam___isinff(float x); +float audiobeam___kernel_cosf(float x, float y); +float audiobeam___kernel_sinf(float x, float y, int iy); +int audiobeam___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, + const int *ipio2); +float audiobeam___scalbnf(float x, int n); +float audiobeam___ceilf(float x); +float audiobeam___floorf(float x); + +#endif // AUDIOBEAM_LIBM diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.c new file mode 100644 index 0000000..f8e291b --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.c @@ -0,0 +1,15 @@ +#include "audiobeamlibmalloc.h" + +#define AUDIOBEAM_HEAP_SIZE 10000 + +static char audiobeam_simulated_heap[AUDIOBEAM_HEAP_SIZE]; +static unsigned int audiobeam_freeHeapPos; + +void * +audiobeam_malloc(unsigned int numberOfBytes) { + void *currentPos = + (void *) &audiobeam_simulated_heap[audiobeam_freeHeapPos]; + /* Get a 4-byte address for alignment purposes */ + audiobeam_freeHeapPos += ((numberOfBytes + 4) & (unsigned int) 0xfffffffc); + return currentPos; +} diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.h new file mode 100644 index 0000000..8a1504e --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmalloc.h @@ -0,0 +1,27 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibmalloc.c + + Author: unkown + + Function: Memory allocation. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: see license.txt + +*/ + +#ifndef AUDIOBEAM_MALLOC_H +#define AUDIOBEAM_MALLOC_H + +void *audiobeam_malloc(unsigned int numberOfBytes); + +#endif diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmath.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmath.h new file mode 100644 index 0000000..28959dc --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/default/audiobeamlibmath.h @@ -0,0 +1,68 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibmath.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_private.h + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef AUDIOBEAM_MATH_PRIVATE_H_ +#define AUDIOBEAM_MATH_PRIVATE_H_ + +#include "audiobeamlibm.h" + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + unsigned int word; +} audiobeam_ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define AUDIOBEAM_GET_FLOAT_WORD(i, d) \ + { \ + audiobeam_ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define AUDIOBEAM_SET_FLOAT_WORD(d, i) \ + { \ + audiobeam_ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.c new file mode 100644 index 0000000..606a450 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.c @@ -0,0 +1,569 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeam + + Author: Eugene Weinstein + + Function: Audio beam former + + Source: StreamIt + http://groups.csail.mit.edu/cag/streamit/ + + Changes: no functional changes + + License: see license.txt + +*/ + +/* + Include section +*/ + +#include "audiobeam.h" +#include "audiobeamlibm.h" +#include "audiobeamlibmalloc.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "audiobeaminput.c" +#include "audiobeamlibm.c" +#include "audiobeamlibmalloc.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void audiobeam_init(); +__attribute__((always_inline)) static inline int audiobeam_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +audiobeam_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); +__attribute__((always_inline)) static inline void +audiobeam_preprocess_delays(struct audiobeam_PreprocessedDelays prep_delays[], + float *delays); +__attribute__((always_inline)) static inline float * +audiobeam_parse_line(float *float_arr, int num_mic); +__attribute__((always_inline)) static inline long int +audiobeam_find_max_in_arr(float *arr, int size); +__attribute__((always_inline)) static inline long int +audiobeam_find_min_in_arr(float *arr, int size); +__attribute__((always_inline)) static inline int +audiobeam_wrapped_inc_offset(int i, int offset, int max_i); +__attribute__((always_inline)) static inline int +audiobeam_wrapped_dec_offset(int i, int offset, int max_i); +__attribute__((always_inline)) static inline int +audiobeam_wrapped_inc(int i, int max_i); +__attribute__((always_inline)) static inline int +audiobeam_wrapped_dec(int i, int max_i); +__attribute__((always_inline)) static inline struct audiobeam_DataQueue * +audiobeam_init_data_queue(int max_delay, int num_mic); +__attribute__((always_inline)) static inline struct audiobeam_Delays * +audiobeam_init_delays(int num_angles, int num_mic); +__attribute__((always_inline)) static inline void +audiobeam_calc_distances(float *source_location, + float audiobeam_mic_locations[15][3], float *distances, + int num_mic); +__attribute__((always_inline)) static inline void +audiobeam_calc_delays(float *distances, float *delays, int sound_speed, + int sampling_rate, int num_mic); +__attribute__((always_inline)) static inline void +audiobeam_adjust_delays(float *delays, int num_mic); +__attribute__((always_inline)) static inline float * +audiobeam_calc_weights_lr(int num_mic); +__attribute__((always_inline)) static inline float * +audiobeam_calc_weights_left_only(int num_mic); +__attribute__((always_inline)) static inline float +audiobeam_calculate_energy(float *samples, int num_samples); +__attribute__((always_inline)) static inline float audiobeam_do_beamforming( + struct audiobeam_PreprocessedDelays preprocessed_delays[], + float **sample_queue, int queue_head, long int max_delay, int num_mic, + float *weights); +__attribute__((always_inline)) static inline int +audiobeam_process_signal(struct audiobeam_Delays *delays, int num_mic, + float sampling_rate, float **beamform_results, + struct audiobeam_DataQueue *queue, int num_beams, + int window, float *weights); +__attribute__((always_inline)) static inline int +audiobeam_calc_beamforming_result(struct audiobeam_Delays *delays, + float **beamform_results, float *energies, + struct audiobeam_DataQueue *queue, + int num_beams, int window, int hamming); +__attribute__((always_inline)) static inline void +audiobeam_calc_single_pos(float source_location[3], + float audiobeam_mic_locations[15][3], int hamming); + +/* + Declaration of global variables +*/ + +extern float audiobeam_input[5760]; +extern float audiobeam_mic_locations[15][3]; +extern float audiobeam_source_location[3]; +extern float audiobeam_origin_location[3]; +int audiobeam_input_pos; +int audiobeam_checksum; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +audiobeam_init() { + audiobeam_input_pos = 0; + audiobeam_checksum = 0; + + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &audiobeam_input[0]; + __pragma_loopbound(23040, 23040); + for (i = 0; i < sizeof(audiobeam_input); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &audiobeam_mic_locations[0]; + __pragma_loopbound(180, 180); + for (i = 0; i < sizeof(audiobeam_mic_locations); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &audiobeam_source_location[0]; + __pragma_loopbound(12, 12); + for (i = 0; i < sizeof(audiobeam_source_location); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &audiobeam_origin_location[0]; + __pragma_loopbound(12, 12); + for (i = 0; i < sizeof(audiobeam_origin_location); ++i, ++p) + *p ^= bitmask; +} + +__attribute__((always_inline)) static inline int +audiobeam_return() { + return (audiobeam_checksum + 1 != 0); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +audiobeam_preprocess_delays(struct audiobeam_PreprocessedDelays prep_delays[], + float *delays) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < 15; i++) { + prep_delays[i].delay = delays[i]; + prep_delays[i].high = (int) audiobeam_ceil(delays[i]); + prep_delays[i].low = (int) audiobeam_floor(delays[i]); + prep_delays[i].offset = delays[i] - prep_delays[i].low; + } +} + +__attribute__((always_inline)) static inline float * +audiobeam_parse_line(float *float_arr, int num_mic) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) + float_arr[i] = audiobeam_input[audiobeam_input_pos++]; + + return float_arr; +} + +__attribute__((always_inline)) static inline long int +audiobeam_find_max_in_arr(float *arr, int size) { + int i; + float max = 0; + + __pragma_loopbound(15, 15); + for (i = 0; i < size; i++) { + if (arr[i] > max) + max = arr[i]; + } + + return audiobeam_ceil(max); +} + +__attribute__((always_inline)) static inline long int +audiobeam_find_min_in_arr(float *arr, int size) { + int i; + float min = arr[0]; + + __pragma_loopbound(15, 15); + for (i = 0; i < size; i++) { + if (arr[i] < min) + min = arr[i]; + } + + return audiobeam_floor(min); +} + +__attribute__((always_inline)) static inline int +audiobeam_wrapped_inc_offset(int i, int offset, int max_i) { + if (i + offset > max_i) + return (i + offset - max_i - 1); + else + return (i + offset); +} + +__attribute__((always_inline)) static inline int +audiobeam_wrapped_dec_offset(int i, int offset, int max_i) { + if (i - offset < 0) + return (max_i - (offset - i) + 1); + else + return (i - offset); +} + +__attribute__((always_inline)) static inline int +audiobeam_wrapped_inc(int i, int max_i) { + return audiobeam_wrapped_inc_offset(i, 1, max_i); +} + +__attribute__((always_inline)) static inline int +audiobeam_wrapped_dec(int i, int max_i) { + return audiobeam_wrapped_dec_offset(i, 1, max_i); +} + +__attribute__((always_inline)) static inline struct audiobeam_DataQueue * +audiobeam_init_data_queue(int max_delay, int num_mic) { + int i, j; + + struct audiobeam_DataQueue *queue; + queue = (struct audiobeam_DataQueue *) audiobeam_malloc( + sizeof(struct audiobeam_DataQueue)); + queue->sample_queue = + (float **) audiobeam_malloc((max_delay + 1) * sizeof(float *)); + + __pragma_loopbound(15, 15); + for (i = 0; i < (max_delay + 1); i++) { + (queue->sample_queue)[i] = + (float *) audiobeam_malloc(num_mic * sizeof(float)); + __pragma_loopbound(15, 15); + for (j = 0; j < num_mic; j++) { + (queue->sample_queue)[i][j] = 0.0; // Initialize values to 0 + } + } + + queue->head = 0; + queue->tail = 0; + queue->full = 0; + + return queue; +} + +__attribute__((always_inline)) static inline struct audiobeam_Delays * +audiobeam_init_delays(int num_angles, int num_mic) { + struct audiobeam_Delays *delays; + int i; + + delays = (struct audiobeam_Delays *) audiobeam_malloc( + sizeof(struct audiobeam_Delays)); + + // Initialize the delays array + delays->delay_values = + (float **) audiobeam_malloc(num_angles * sizeof(float *)); + + __pragma_loopbound(1, 1); + for (i = 0; i < (num_angles); i++) { + delays->delay_values[i] = + (float *) audiobeam_malloc(num_mic * sizeof(float)); + } + + return delays; +} + +__attribute__((always_inline)) static inline void +audiobeam_calc_distances(float *source_location, + float audiobeam_mic_locations[15][3], float *distances, + int num_mic) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) { + distances[i] = (audiobeam_sqrt( + (audiobeam_mic_locations[i][0] - source_location[0]) * + (audiobeam_mic_locations[i][0] - source_location[0]) + + (audiobeam_mic_locations[i][1] - source_location[1]) * + (audiobeam_mic_locations[i][1] - source_location[1]) + + (audiobeam_mic_locations[i][2] - source_location[2]) * + (audiobeam_mic_locations[i][2] - source_location[2]))); + } +} + +__attribute__((always_inline)) static inline void +audiobeam_calc_delays(float *distances, float *delays, int sound_speed, + int sampling_rate, int num_mic) { + int i; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) + delays[i] = (distances[i] / sound_speed) * sampling_rate; +} + +__attribute__((always_inline)) static inline void +audiobeam_adjust_delays(float *delays, int num_mic) { + int i; + long int min_delay = audiobeam_find_min_in_arr(delays, num_mic) - 1; + + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) + delays[i] -= min_delay; +} + +__attribute__((always_inline)) static inline float * +audiobeam_calc_weights_lr(int num_mic) { + float *weights = (float *) audiobeam_malloc(num_mic * sizeof(float)); + int index = 0; + int y, z; + + int half = num_mic / 4; + + __pragma_loopbound(0, 0); + for (z = 1; z >= -1; z -= 2) { + __pragma_loopbound(0, 0); + for (y = 0; y < half; y++) { + weights[index] = + 0.54 + 0.46 * audiobeam_cos(audiobeam_M_PI * y / half); + index++; + } + __pragma_loopbound(0, 0); + for (y = 0; y < half; y++) { + weights[index] = + 0.54 + 0.46 * audiobeam_cos(audiobeam_M_PI * (-y) / half); + index++; + } + } + + return weights; +} + +__attribute__((always_inline)) static inline float * +audiobeam_calc_weights_left_only(int num_mic) { + float *weights = (float *) audiobeam_malloc(num_mic * sizeof(float)); + int index = 0; + int y; + + int half = num_mic / 2; + + __pragma_loopbound(15, 15); + for (y = -half; y <= half; y++) { + weights[index] = 0.54 + 0.46 * audiobeam_cos(audiobeam_M_PI * y / half); + index++; + } + + return weights; +} + +__attribute__((always_inline)) static inline float +audiobeam_calculate_energy(float *samples, int num_samples) { + int i; + float sum = 0.0; + + __pragma_loopbound(0, 0); + for (i = 0; i < num_samples; i++) + sum += (samples[i] * samples[i]); + + return sum; +} + +__attribute__((always_inline)) static inline float +audiobeam_do_beamforming( + struct audiobeam_PreprocessedDelays preprocessed_delays[], + float **sample_queue, int queue_head, long int max_delay, int num_mic, + float *weights) { + int i; + float sum = 0; + int delay_floor; + int delay_ceil; + int low_index; + int high_index; + float interpolated_value; + + // add up all the num_mic delayed samples + __pragma_loopbound(15, 15); + for (i = 0; i < num_mic; i++) { + delay_floor = preprocessed_delays[i].low; + delay_ceil = preprocessed_delays[i].high; + + // Inline wrap around here + // Low index gets index of sample right before desired sample + low_index = queue_head + delay_floor; + if (low_index > max_delay) + low_index -= (max_delay + 1); + + // High index gets index of sample right after desired sample + high_index = queue_head + delay_ceil; + if (high_index > max_delay) + high_index -= (max_delay + 1); + + // i gives the value of the microphone we want. However, since + // the array only has microphones first_mic to last_mic, we + // need to offset our index by first_mic + + interpolated_value = + (((sample_queue[high_index][i] - sample_queue[low_index][i]) * + (preprocessed_delays[i].offset)) + + sample_queue[low_index][i]); + + // If we have microphone weights, multiply the value by the weight + if (weights != 0) + sum += (interpolated_value * weights[i]); + else + sum += interpolated_value; + } + + return sum; +} + +__attribute__((always_inline)) static inline int +audiobeam_process_signal(struct audiobeam_Delays *delays, int num_mic, + float sampling_rate, float **beamform_results, + struct audiobeam_DataQueue *queue, int num_beams, + int window, float *weights) { + int i, j; + float time_index = 0; + float time_index_inc = (1.0 / sampling_rate); + + float value; + + int done = 0; + + struct audiobeam_PreprocessedDelays preprocessed_delays[15]; + + audiobeam_preprocess_delays(preprocessed_delays, delays->delay_values[0]); + + __pragma_loopbound(13, 13); + for (i = 0; i < delays->max_delay - 1; i++) { + if (audiobeam_input_pos < 5760) + audiobeam_parse_line((queue->sample_queue)[queue->head], 15); + else + return -1; + queue->head = audiobeam_wrapped_inc(queue->head, delays->max_delay); + } + __pragma_loopbound(371, 371); + for (i = 0; (i < window) || (window < 0); i++) { + if (audiobeam_input_pos < 5760) + audiobeam_parse_line((queue->sample_queue)[queue->head], 15); + else { + done = 1; + break; + } + + __pragma_loopbound(1, 1); + for (j = 0; j < num_beams; j++) { + value = audiobeam_do_beamforming( + preprocessed_delays, (queue->sample_queue), + audiobeam_wrapped_inc(queue->head, delays->max_delay), + delays->max_delay, num_mic, weights); + + value = value / num_mic; + + if (beamform_results != 0) + beamform_results[j][i] = value; + } + + queue->tail = queue->head; + queue->head = audiobeam_wrapped_inc(queue->head, delays->max_delay); + + time_index += time_index_inc; + } + + return (done); +} + +__attribute__((always_inline)) static inline int +audiobeam_calc_beamforming_result(struct audiobeam_Delays *delays, + float **beamform_results, float *energies, + struct audiobeam_DataQueue *queue, + int num_beams, int window, int hamming) { + int i; + int done; + float *weights = 0; + + if (hamming) { + if ((15 % 2) == 1) + weights = audiobeam_calc_weights_left_only(15); + else + weights = audiobeam_calc_weights_lr(15); + } + + done = audiobeam_process_signal(delays, 15, 16000, beamform_results, queue, + num_beams, window, weights); + + if (beamform_results != 0) { + __pragma_loopbound(1, 1); + for (i = 0; i < num_beams; i++) + energies[i] = + audiobeam_calculate_energy(beamform_results[i], window); + } + return done; +} + +__attribute__((always_inline)) static inline void +audiobeam_calc_single_pos(float source_location[3], + float audiobeam_mic_locations[15][3], int hamming) { + float mic_distances[15]; + struct audiobeam_Delays *delays = audiobeam_init_delays(1, 15); + struct audiobeam_DataQueue *queue; + + float **beamform_results; + float *energies; + + beamform_results = (float **) audiobeam_malloc(1 * sizeof(float *)); + beamform_results[0] = (float *) audiobeam_malloc(384 * sizeof(float)); + energies = (float *) audiobeam_malloc(1 * sizeof(float *)); + + // Calculate distances from source to each of mics + audiobeam_calc_distances(source_location, audiobeam_mic_locations, + mic_distances, 15); + + audiobeam_calc_delays(mic_distances, delays->delay_values[0], 342, 16000, + 15); + + audiobeam_adjust_delays(delays->delay_values[0], 15); + + delays->max_delay = audiobeam_find_max_in_arr(delays->delay_values[0], 15); + + queue = audiobeam_init_data_queue(delays->max_delay, 15); + + audiobeam_calc_beamforming_result(delays, beamform_results, energies, queue, + 1, -1, hamming); + + audiobeam_checksum += beamform_results[0][0] * 1000; +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +audiobeam_main(void) { + char hamming = 1; + audiobeam_calc_single_pos(audiobeam_source_location, + audiobeam_mic_locations, hamming); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + audiobeam_init(); + audiobeam_main(); + + return (audiobeam_return()); +} diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.h new file mode 100644 index 0000000..e618db2 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeam.h @@ -0,0 +1,50 @@ + +#ifndef AUDIOBEAM_MAIN_H +#define AUDIOBEAM_MAIN_H + +struct audiobeam_DataQueue { + float **sample_queue; + int head; + int tail; + unsigned char full; +}; + +struct audiobeam_Delays { + float **delay_values; + long int max_delay; +}; + +struct audiobeam_PreprocessedDelays { + float delay; + int low; + int high; + float offset; +}; + +#undef FLT_MAX +#define FLT_MAX 999e999 + +#define SOUND_SPEED 342 +#define SAMPLING_RATE 16000 +#define CARTESIAN_DISTANCE(x1, y1, z1, x2, y2, z2) \ + (sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + \ + (z1 - z2) * (z1 - z2))); + +#define NUM_MIC 15 +#define ANGLE_ENERGY_WINDOW_SIZE 400 +#define GRID_STEP_SIZE 0.003 // .3cm +#define NUM_DIRS 7 +#define NUM_TILES 16 + +#define MIC_HORIZ_SPACE 0.038257 +#define MIC_VERT_SPACE 0.015001 +#define TWO23 8388608.0 // 2^23 +#define BUFFER_SIZE 384 // No of input-tupels (each with NUM_MIC elements) +#define NUM_MIC_IN_CHAIN 32 +#define NUM_BOARDS_IN_CHAIN 16 +#define INPUT_LENGTH 5760 + +#define INTERPOLATE(low_value, high_value, offset) \ + (((high_value - low_value) * (offset)) + low_value) + +#endif diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeaminput.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeaminput.c new file mode 100644 index 0000000..a15195e --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeaminput.c @@ -0,0 +1,1452 @@ + +float audiobeam_input[5760] = { + -2.1628241e-002, -6.1782300e-002, 1.2674258e-002, 4.5557573e-002, + -3.1999024e-002, 1.5042214e-002, -2.2025290e-002, -1.1691264e-001, + -1.1481735e-002, -1.4446880e-002, -1.5755706e-002, -8.0576309e-002, + 2.0622295e-002, -1.9724793e-003, -1.2299200e-001, -8.3279195e-002, + -1.0825949e-002, 7.5347056e-002, -3.6992287e-003, 1.2980213e-002, + 5.9641118e-002, 1.8884644e-002, -5.5868450e-002, 4.1899706e-002, + -2.0939881e-002, 2.0535662e-002, -9.9773254e-002, -1.5328980e-002, + 2.1354349e-002, 1.3485441e-002, 6.2665707e-003, -1.0335293e-002, + -4.1743319e-002, 4.3513189e-002, -4.2254620e-002, -2.7446285e-002, + 4.5134873e-002, 5.6054726e-002, 6.2557771e-002, 4.2653265e-002, + 7.6308850e-003, 1.4700700e-002, 5.4820763e-002, -1.3939644e-002, + -8.8708573e-002, 1.4383734e-002, 4.0463345e-003, 3.5856296e-002, + 2.7271902e-002, 2.0721019e-002, 3.5167562e-002, -2.7007340e-002, + -1.3367771e-002, -6.8606571e-002, -1.1089227e-001, 7.3041941e-002, + -5.2066383e-002, -5.1117839e-003, -3.7742692e-002, -1.1895006e-002, + -5.7323089e-002, -5.4802003e-003, -8.4072455e-003, 1.5633496e-002, + 4.6059069e-002, -6.1861422e-002, -3.3034801e-002, 1.7182310e-002, + 1.1807449e-001, 8.2171643e-003, -1.4691311e-002, -7.2660364e-004, + 4.6637366e-002, -6.9687813e-004, -2.7780373e-002, 5.9544506e-002, + -5.6050055e-003, -3.5444498e-002, 1.2845303e-002, -1.0379076e-001, + -8.5864760e-002, 1.9192324e-002, -2.6644473e-003, 5.4431089e-003, + -9.2110237e-003, 7.9344657e-002, 4.7203951e-002, 9.6834909e-002, + -1.0553527e-001, -8.5097540e-004, 5.9460688e-002, 4.4844228e-002, + -2.8858692e-002, 4.4496937e-002, -3.9902243e-002, 5.5557069e-002, + -1.1814152e-002, -5.8464847e-002, -1.0753965e-002, 5.7336183e-002, + 2.6582677e-002, 2.2119089e-002, -1.4469086e-002, 3.2141585e-002, + -1.0303352e-001, -1.8856419e-003, 3.8161312e-002, -3.7091166e-002, + -5.1262587e-003, 4.2556931e-002, -5.8465556e-002, 4.2193534e-002, + -1.4951154e-002, 1.7423551e-002, 2.7519487e-002, -9.0048353e-002, + -2.6206603e-002, -1.1536221e-002, 4.5418578e-002, -9.1746774e-002, + 1.6370112e-002, 8.2439024e-003, -1.7961312e-002, -7.5403629e-002, + -6.6798880e-003, -9.2569474e-003, -1.8133432e-002, -6.7922929e-002, + -3.3209516e-002, 4.7587886e-002, -4.4354675e-002, -7.9939507e-002, + -1.0312521e-001, -4.6389013e-002, -6.8492137e-002, 8.7253275e-003, + -1.0040243e-002, -2.3972856e-002, 1.9377428e-003, -1.2364076e-002, + -3.3033927e-002, 6.2238030e-002, -4.7879158e-002, -1.9680886e-002, + -3.2198806e-002, -4.0721657e-003, -1.7973043e-002, 9.3910391e-003, + -9.1117967e-002, 3.6036154e-002, -9.3285589e-003, -3.9239303e-002, + -1.4022387e-001, 1.1102588e-001, -9.1222642e-002, -4.0301199e-002, + 7.1912258e-002, 1.5040754e-002, 8.1648312e-002, 3.9995645e-002, + -1.3388074e-002, 1.9629547e-002, 3.5710780e-003, 1.1166215e-002, + -4.0137762e-002, 3.6284046e-002, 4.1404491e-002, -5.8754380e-002, + -7.8104994e-003, -5.3507568e-002, 1.3005354e-002, -1.6914462e-002, + 8.5270739e-002, 3.9979512e-002, 4.5752537e-002, -3.1159018e-002, + 4.9213792e-002, 6.1313765e-002, 4.3386180e-002, -1.1103888e-002, + -2.9414395e-002, -1.2976305e-002, 6.2751925e-002, 2.6120284e-002, + -2.4616119e-002, -3.6435894e-002, 7.1182254e-002, 2.2753153e-002, + 3.0188200e-002, -3.1009759e-002, -8.5616927e-002, -4.6712075e-002, + 1.0069141e-002, -1.2036765e-001, 3.4740635e-002, 1.0916700e-001, + -7.5289504e-002, -5.3676914e-002, -1.6396310e-002, 5.2259303e-002, + -2.2119146e-002, 4.3186864e-002, 5.1169779e-002, 6.6785827e-002, + 8.4849447e-002, -5.2696816e-002, -6.5414943e-003, 8.6775788e-002, + 8.7802920e-003, 2.8938998e-002, -6.8520041e-003, 5.1510683e-002, + -2.9026553e-002, 3.8173521e-002, 2.2338277e-002, 3.0163548e-002, + -4.3077452e-002, 7.9805371e-002, 4.7317864e-002, -3.1363067e-002, + 3.0903885e-002, -1.3112581e-002, 4.6251235e-002, 2.5813919e-002, + -5.2188163e-002, 5.9587326e-003, 1.0092254e-002, 1.2104228e-002, + 2.7865320e-002, 3.4901635e-002, -2.5736803e-002, 1.3229570e-002, + 3.6694281e-003, 3.3012708e-002, 2.9284882e-002, 3.0060870e-002, + 4.5508139e-002, -3.6974026e-002, 7.7034396e-002, -6.8227707e-002, + 5.3618194e-002, -6.1636629e-002, 4.1438304e-002, 1.1367451e-002, + -4.4009108e-002, -2.3843912e-002, -1.6703032e-002, 3.7265590e-002, + -7.8425072e-003, 7.0384481e-002, -2.4218783e-002, -3.5625536e-002, + 1.8010625e-002, 1.1966647e-002, 2.5491626e-003, 3.1251434e-003, + -2.6075724e-002, -4.3802442e-002, -1.2920483e-002, 3.3085779e-002, + -3.9037317e-003, -2.8269926e-002, 4.1542553e-002, -8.2930418e-002, + 5.6657974e-002, 3.4391329e-002, -5.5825221e-002, 6.8989268e-002, + 1.2541652e-003, -7.7722092e-002, -4.6334370e-003, 3.1744148e-002, + -5.5503811e-002, -3.4445949e-002, -9.4038308e-003, -2.7828988e-002, + 1.0887660e-001, 1.3636863e-002, -3.7585580e-002, 4.0418722e-002, + -1.3737476e-002, -5.0488197e-003, 1.3194491e-001, 7.2649277e-002, + -3.6200249e-002, -4.1687712e-002, -1.7974402e-001, -9.9629449e-002, + -8.8510199e-002, -3.2055261e-002, 1.7036375e-002, 1.8071052e-002, + 4.4934493e-002, -1.0864015e-002, 9.9226525e-003, -1.6564939e-002, + -3.4734325e-002, 3.5725355e-002, 3.0344723e-002, -3.6905057e-002, + 1.4666105e-002, -9.1517247e-002, -3.3012325e-002, 5.8220711e-002, + -6.8047909e-003, 3.6517819e-002, 8.7157879e-002, -1.4120887e-002, + 5.4666271e-002, 2.0673658e-002, -5.8489896e-002, -1.0321028e-001, + 1.7051732e-002, -4.4728363e-003, 7.1522488e-004, -6.6825032e-002, + -3.0624456e-002, 5.7023563e-002, -1.1878060e-002, 1.7099754e-002, + 4.3931414e-002, 6.1445253e-002, 3.9676417e-002, 7.7224665e-002, + 6.4921134e-002, -5.6517669e-003, 5.5906816e-002, -2.1154100e-002, + 2.4198912e-002, 1.2288710e-002, 3.5640310e-002, -3.7175887e-002, + -6.0273241e-002, 6.4682700e-003, 2.1266448e-002, -6.8591151e-002, + 1.1184946e-002, 4.6699013e-003, -1.0346103e-001, -7.7362572e-002, + 4.7383361e-003, -1.4630850e-002, 3.7812788e-002, 1.6292353e-002, + -4.8009838e-002, 8.0999615e-002, 2.1004391e-003, 1.5541126e-001, + -6.1366286e-003, -7.1757358e-002, -1.8036409e-002, 4.4754181e-002, + 8.4250625e-003, 2.0321052e-002, 2.3096646e-002, -4.7739081e-002, + -3.6540263e-002, -1.3962473e-002, -1.4429499e-002, 5.4134628e-002, + -3.4826503e-002, -9.5953591e-002, -2.5723076e-003, 2.5258029e-002, + -1.7985838e-002, -3.2436879e-002, 7.4368827e-002, 7.8647624e-002, + 1.0656742e-002, 8.4282290e-003, 2.5266494e-002, 1.0782181e-002, + 7.0122588e-002, 4.5656108e-002, -1.7103947e-002, 4.2780530e-002, + -9.6794177e-003, -6.4130219e-003, -9.2925547e-002, 5.4742908e-002, + -7.5128799e-002, -7.3489810e-002, -3.0056779e-003, -7.9295585e-003, + -2.1268989e-002, -1.8030581e-002, 1.8197354e-002, -9.1941398e-002, + -6.5053760e-002, -2.8177888e-002, 6.2682028e-002, -2.5915727e-002, + -1.5832074e-002, 6.8064152e-002, 7.3910585e-003, 9.9715351e-003, + 1.4832463e-002, -8.5346638e-004, 1.7638664e-002, 3.0446443e-002, + -1.2396491e-002, -5.8601288e-002, -5.7627198e-003, -7.1554886e-003, + -6.3799636e-003, -7.9695655e-002, 2.4753204e-002, 8.6758471e-003, + -4.9728861e-002, 2.0786272e-002, -7.6560881e-002, 1.8730544e-002, + 2.1715688e-002, 4.1880687e-002, -4.0154045e-002, -3.0255220e-002, + 7.5668890e-002, 2.6577586e-002, 6.0758844e-002, 4.1263811e-002, + -7.2132197e-002, -5.4040115e-002, 4.5831681e-002, 2.9148772e-002, + -9.9761159e-002, -2.4308664e-002, -5.9443444e-002, 3.9842573e-002, + -4.8058590e-002, -1.6081315e-002, 5.2772543e-002, 1.9132275e-002, + 1.3499840e-002, -2.5313375e-002, 4.1852174e-002, 2.8461234e-002, + 3.5598046e-002, -4.2019346e-002, 3.0022497e-002, 1.3199080e-003, + 8.3394564e-002, 2.2949521e-002, 4.1566899e-002, 1.1383869e-002, + -2.6939783e-002, -1.8963007e-002, -6.3268458e-002, 5.8324716e-002, + 4.8789982e-002, 5.6035385e-002, -2.0057577e-002, 4.8354809e-002, + 6.4102491e-002, 8.5367473e-003, -4.4917671e-003, 5.3137245e-002, + -3.4406597e-003, -2.5126308e-002, 3.6564998e-003, 9.6593471e-002, + 7.4728111e-002, -6.7266129e-002, -4.9014918e-002, 7.2046324e-005, + 1.0162088e-001, 3.4409693e-002, 7.3462774e-003, -8.0225074e-002, + 4.8609099e-002, 3.2217993e-002, -2.8071970e-002, -3.6815087e-002, + 3.0467444e-002, 4.3287817e-002, -1.3733658e-002, 2.5769175e-002, + 2.6532442e-002, 6.3705272e-002, 9.0108580e-004, -8.9331571e-003, + 4.0743375e-002, 2.1807528e-002, 7.9702732e-002, -7.5750752e-003, + 7.0674335e-002, 3.7582849e-002, 3.9334641e-003, -2.5679423e-002, + 2.2647574e-002, -6.4712014e-002, 2.4315794e-002, 1.5494849e-002, + -3.9942923e-002, 3.3496104e-002, -5.9740340e-002, 3.5474677e-002, + 6.6577221e-002, 6.8351408e-002, -7.7174045e-002, -3.3267903e-002, + -4.3616992e-002, 1.2970427e-001, 6.0899210e-002, 4.3444379e-003, + -1.0402039e-001, 4.3108587e-002, 1.3577371e-002, 3.3900628e-002, + 7.3707838e-003, -1.5925799e-002, 6.4439821e-002, 1.7075281e-003, + 1.0684273e-001, 1.3675111e-002, -1.8111888e-003, -2.8508186e-002, + -6.5596762e-002, 1.8536230e-002, 2.3318748e-002, 4.7302415e-002, + 7.7239329e-003, -2.4929896e-002, -3.5669784e-002, 4.8605025e-002, + 9.7598834e-002, 3.3591893e-002, 1.3978895e-002, 2.2590039e-002, + -5.5155328e-002, -2.3844007e-002, -2.8932963e-002, -4.5784933e-002, + -2.5579789e-002, 8.6706332e-002, 8.5991126e-002, -4.4830492e-002, + 1.7419718e-002, 1.4916965e-002, -6.2744229e-002, -2.1218715e-002, + 5.9749921e-002, 2.6471628e-003, 1.4696082e-002, -1.1916464e-001, + -7.4054943e-002, 3.3702032e-002, -7.2744375e-002, 2.0153878e-002, + -4.7562683e-002, -3.2418295e-002, 1.8784044e-002, 9.4509719e-002, + 8.6064590e-002, -1.2657551e-002, -3.8219708e-002, -5.9906689e-002, + 3.8677878e-002, 3.2909039e-002, 1.3356926e-002, -1.9001381e-002, + -3.9834512e-002, 1.6185466e-002, -2.1554965e-002, -1.0883439e-001, + -2.9635956e-002, 1.2873885e-002, 2.7852743e-002, 3.5614484e-003, + -4.7306763e-002, -1.0771995e-001, -7.9289260e-004, 1.1021590e-001, + -6.1261912e-003, 5.2735506e-002, -5.0261529e-002, 3.2092184e-002, + 3.1401447e-002, 2.6629993e-002, -2.9882337e-003, -6.0317700e-002, + -3.0940994e-002, -3.8375379e-002, -1.0663192e-001, -1.1058175e-002, + -5.6424824e-002, -7.7026313e-003, -4.1079471e-002, -2.1629167e-002, + -2.6973772e-002, -4.5878364e-002, 1.5542578e-002, -4.9103021e-002, + -1.0554701e-002, -5.0947614e-002, -3.1865395e-002, 9.0008999e-002, + 4.5801038e-002, 1.5787324e-002, 6.1816926e-002, 3.9975029e-002, + -8.0101743e-002, 3.6589676e-002, -4.0044532e-002, -5.4152676e-003, + -2.7100833e-002, 2.0669295e-003, 4.2072166e-002, -4.8541169e-002, + -6.0994910e-002, 7.2269246e-002, 1.8547974e-002, 3.2317037e-002, + -3.7668570e-002, 2.3090187e-002, -8.4282566e-003, 1.2909956e-002, + -4.6799208e-003, -7.5882838e-002, -4.5005968e-002, 6.0924318e-002, + 1.5170746e-002, -8.0718858e-003, -3.1913614e-002, 2.9448478e-002, + 5.6982375e-002, -2.2421475e-002, 2.7408554e-002, -1.0052456e-001, + -3.0342741e-002, -8.0221320e-002, -5.2820631e-002, 1.4287569e-002, + -3.5261023e-002, -1.2712299e-002, 1.0298138e-002, -7.4545734e-002, + -7.1662807e-003, -6.3049311e-002, -3.3128714e-003, -3.7018937e-002, + -9.2155629e-002, 4.4295353e-003, -2.5345078e-002, -5.0175815e-004, + -2.2425974e-002, 7.0790673e-002, 4.6067398e-002, 1.3356450e-002, + -7.5350427e-002, 9.2272647e-002, -6.0388207e-002, 6.2880311e-002, + -4.6813092e-002, 6.4358587e-002, 6.5476593e-002, -5.0385005e-002, + 1.1259635e-002, -2.8642227e-002, 6.0591769e-003, 7.8259699e-003, + -4.0086083e-002, -1.3107082e-002, -2.5073934e-002, 1.5301678e-002, + -6.1350007e-002, -4.0860320e-002, 4.5224779e-002, -4.4892524e-002, + 8.8006431e-002, -3.3282403e-002, -5.6195537e-002, -1.1931638e-001, + -6.8019421e-002, -7.0651820e-003, 1.0114029e-001, 2.6799939e-002, + -4.5414349e-002, 7.3662653e-002, 2.6023897e-002, -7.7197973e-002, + 1.8472004e-002, 6.4325310e-003, 1.0535758e-001, -8.2482506e-002, + -1.0868944e-001, 8.7186828e-002, 4.2331149e-003, 6.6302594e-003, + 5.0652627e-002, -2.6295176e-002, 1.1319735e-002, -5.3688488e-002, + -8.3685938e-002, 3.8054233e-002, -2.5923609e-002, 8.7603907e-002, + 4.4975322e-002, 2.0615118e-002, 3.7674950e-002, 5.6434838e-002, + 1.0977012e-001, 2.1349762e-003, -1.4936346e-004, 6.7930892e-002, + 3.2086590e-003, -4.5878929e-002, -4.4181125e-002, 2.4715658e-002, + 7.9994617e-002, 5.2384101e-002, -9.5190518e-003, -3.7239495e-002, + 1.9883359e-002, 4.0730677e-003, -1.1677479e-001, -2.6374780e-002, + -7.9398641e-002, -3.5523570e-002, -1.8151457e-002, -3.7191923e-002, + -1.0831981e-001, 5.5198514e-002, 8.2754639e-002, -5.5996264e-002, + -6.5431323e-002, 1.6211145e-002, -6.8206035e-002, -2.9416838e-002, + 5.3307249e-002, 1.7472763e-002, 3.7312882e-003, -5.1498829e-002, + -6.2257189e-002, -2.9692831e-002, -2.4493198e-002, -2.7319437e-003, + 5.8815114e-002, -6.3249182e-002, 2.0730820e-002, 9.5563463e-003, + -2.2720249e-002, 2.5296131e-002, -1.9878781e-002, -3.4238910e-002, + -2.4677844e-002, 6.9236841e-002, -3.4704441e-002, -3.9318071e-002, + 5.7750083e-002, 3.4211433e-002, -5.0475709e-002, 2.5174181e-002, + -4.6996048e-002, 1.6221876e-002, -2.6204170e-002, 1.0630488e-002, + 4.5517196e-003, 8.3863415e-002, 4.8780028e-002, 2.3656142e-002, + -8.5385372e-002, -7.6803464e-003, 1.3583644e-002, 1.0156741e-001, + 1.1623477e-001, 3.0703572e-002, -1.8790478e-002, -2.5434562e-002, + 2.6081461e-002, -8.0973679e-002, 4.7528492e-003, 5.1709027e-002, + -2.7152886e-002, 3.3078882e-002, 9.5807816e-002, -1.6742069e-002, + 5.2847289e-002, 7.4190627e-002, 8.4661383e-003, -1.7127745e-002, + 2.5387176e-002, -2.4425657e-002, 1.0363293e-002, 3.2901544e-002, + 2.4049224e-002, -3.6364045e-002, -1.8374024e-002, 1.9170206e-002, + 3.5899319e-002, 2.2884438e-002, -4.2986435e-004, -3.7263522e-002, + -2.4107817e-002, -1.0160656e-002, -5.2244378e-003, 8.4713192e-002, + -3.3175117e-003, -6.8918873e-002, -1.0757423e-001, 1.9995005e-002, + 1.0018587e-002, -1.0031442e-003, -2.6646668e-002, -1.4140223e-002, + -1.9093589e-002, 8.2412659e-002, 5.0569231e-002, -1.9249580e-003, + 1.6857775e-002, 4.4516048e-002, 2.9634803e-002, -7.4675793e-002, + 6.9128286e-002, 1.7838807e-002, -1.5706998e-002, 2.3497836e-002, + -2.7256676e-002, -1.6892391e-002, -6.2498894e-002, 1.8814550e-002, + 6.7802861e-002, -4.5010985e-002, -7.9693020e-004, -1.6417629e-002, + -1.6571552e-002, -3.2170429e-002, -3.1451461e-002, 5.9127646e-002, + 4.2496269e-002, 5.8440594e-002, -3.7761868e-002, 1.4543937e-001, + 4.6291259e-003, -8.8031773e-003, -3.7376149e-002, 4.4444334e-002, + -3.2946165e-002, 2.7709611e-002, -4.6454274e-002, -5.4184987e-003, + 1.9082159e-002, 1.1097683e-003, -7.1272377e-002, 1.8112885e-003, + 2.6898226e-003, -3.0686681e-002, -1.9829229e-002, 3.0867601e-002, + -6.2758817e-002, -2.2846248e-002, 6.0573296e-002, 3.7414532e-002, + 3.6169907e-002, -2.3442499e-003, 2.5963449e-002, -5.0418274e-002, + -7.0858380e-003, 2.2793366e-002, -4.5274123e-002, 4.4264571e-002, + -5.5435866e-002, -6.0444822e-002, -4.4730927e-002, -2.6702128e-003, + 3.0721521e-002, 3.9441000e-003, 8.3714830e-002, -1.2824805e-002, + 8.9065027e-002, -4.1791317e-002, -9.6506591e-004, -2.2150161e-002, + -5.4266803e-002, -7.9756811e-002, 2.9723999e-003, -5.4652294e-004, + -8.3350132e-002, 1.0241351e-002, -9.6004506e-002, 1.1043342e-002, + -1.0036827e-001, 5.4166215e-002, 5.3435462e-002, 1.0602215e-002, + 2.9868847e-002, -2.4597423e-003, 1.1437786e-002, -4.2279579e-002, + -8.8732642e-003, -2.9476925e-002, 3.6694209e-002, 3.3176455e-005, + -7.3778252e-003, -3.9144818e-002, -8.3308862e-003, 4.6791993e-002, + -1.7037485e-003, 4.5892237e-002, 1.5597981e-002, -5.6087508e-002, + -4.1107610e-005, -1.0683418e-002, -2.6103976e-002, -8.4348999e-003, + 3.2082383e-002, 1.4938214e-001, 3.9964806e-002, -7.8254583e-003, + 4.6722479e-002, 9.3200915e-002, 2.4464994e-002, 8.3718835e-004, + 1.5250387e-002, -1.2400454e-001, -2.8639656e-002, -1.5938766e-002, + -2.5676238e-002, -5.1847115e-002, 1.7639941e-003, 4.9326733e-003, + -1.5856443e-002, -9.1307767e-004, -1.5554562e-002, 2.5941199e-002, + -2.9757970e-002, 1.2201936e-001, 8.0973215e-002, 1.7146982e-002, + 1.4736881e-002, 6.0467585e-002, 5.4698972e-002, 2.5876279e-002, + 1.0164087e-002, 3.8201202e-002, -6.0518215e-002, -1.3895876e-002, + 3.4728204e-002, -1.1711300e-001, -1.1216734e-002, -3.9340786e-002, + -2.7309751e-002, 5.9063770e-003, 2.0738498e-002, -1.3812395e-002, + -5.7982126e-002, -9.3680977e-002, -4.9666791e-002, -2.6529709e-002, + 5.2766295e-002, -2.1506279e-002, 9.3091830e-002, -3.5081971e-002, + 1.4449703e-002, 5.8269304e-002, 1.0329005e-001, -3.4264617e-002, + -1.9998674e-002, 4.0219340e-002, 2.0651887e-002, 5.2208561e-003, + 2.1487670e-002, 2.4204968e-002, 3.0673837e-002, -8.5293543e-003, + -5.3952186e-002, 8.9865270e-002, 1.0436717e-001, -9.7344984e-003, + -9.7393746e-003, 5.2162345e-002, 6.8291250e-003, -3.3926390e-002, + -3.5345884e-002, -2.1419424e-002, 2.4503709e-002, 4.4872568e-002, + -3.6811060e-002, 4.6761401e-002, 4.9242905e-002, 2.9535711e-002, + -7.5315008e-003, 8.4931550e-003, 1.3235857e-001, 8.4181971e-002, + -6.3526263e-002, 4.1655473e-003, 6.3417279e-003, -1.3065747e-002, + -5.7645495e-002, 1.8950407e-002, 3.6717958e-002, 1.2058270e-001, + 2.9698808e-002, 6.3712863e-002, -7.8927013e-002, -1.1092228e-001, + 7.5127329e-002, 3.6792936e-002, 1.8047426e-002, 1.6372435e-002, + -1.1358573e-002, -1.1114199e-002, -3.1011890e-003, 1.2753148e-001, + -1.3063278e-003, 2.9175038e-002, 1.0744000e-002, 8.5396074e-003, + 3.0555550e-002, 1.9846964e-002, -2.0887290e-003, 7.4108765e-004, + -6.8980202e-002, -6.9539294e-002, -7.1891402e-002, 2.6483042e-002, + -1.0604522e-001, 1.4946154e-002, -2.0885875e-002, 8.1620406e-002, + 2.2391518e-003, -4.3108583e-002, -2.8345459e-002, 2.1767961e-002, + -4.1509277e-002, 5.0332798e-002, -3.0747398e-003, 8.1280247e-003, + -2.8574311e-002, -3.7557299e-002, 4.6116535e-002, -7.5548776e-002, + 4.2485208e-002, -1.2735059e-002, -4.8713882e-002, 3.4080268e-002, + 3.8109829e-002, -7.9933234e-002, 5.0868655e-003, -3.6956005e-002, + -6.5608678e-003, 6.1566793e-002, 3.9747615e-002, -7.0776849e-003, + -1.0039001e-002, 1.0635588e-001, -3.2262564e-002, 6.6284637e-002, + -1.5602956e-002, 9.8826341e-002, 2.8765472e-002, 4.9988770e-002, + 2.8083188e-002, 3.7850396e-003, 3.8099036e-002, -6.2803094e-002, + -8.0284071e-003, 1.7678623e-002, 1.5384533e-001, 3.0604908e-002, + -2.2938654e-002, -6.6147444e-003, 8.0228244e-003, 6.3229249e-002, + 1.9888120e-002, -1.2483914e-002, -3.3020847e-002, 5.4285124e-002, + -2.2046600e-002, 7.6270296e-002, -3.8125981e-002, 4.2116981e-002, + 6.8249119e-002, 4.9569658e-002, -1.2181580e-002, -3.3950151e-002, + -3.3512560e-002, -4.0037716e-002, 3.8517111e-002, -3.0444190e-002, + -1.8608773e-002, 1.5643509e-002, 4.0250976e-002, 1.9776990e-002, + -3.1560979e-002, -3.1229293e-003, -2.5832801e-003, 2.7968081e-002, + -5.6392681e-002, 4.7360525e-002, 3.8619319e-003, 9.9891506e-002, + -1.8199130e-003, 3.1119514e-003, -9.1106029e-002, -1.4519250e-002, + 3.7010312e-002, -1.1213690e-002, 2.1256532e-002, -5.3987387e-002, + 5.7866117e-002, -4.2626330e-002, -3.3483769e-002, -5.2898877e-002, + -6.7225352e-002, 5.1417756e-002, 1.3929020e-003, 5.2022234e-002, + 1.0592230e-001, -6.8998892e-002, -7.3435118e-002, 3.0523655e-002, + -5.7162591e-003, -3.2771503e-002, 9.2367770e-003, -6.7747716e-003, + 1.0333099e-002, -1.5577876e-002, -6.7817347e-002, -6.6533637e-002, + -6.3984097e-002, 5.6216531e-002, 1.5579751e-002, -2.7104760e-003, + 2.0901166e-002, -1.1389339e-002, 2.4314314e-002, 9.6320945e-003, + -3.5425250e-002, 2.9816167e-002, -1.0582802e-001, 7.9031755e-002, + 5.8936482e-002, 4.9235081e-002, -2.0598427e-002, 2.7257218e-002, + 8.3473318e-002, 1.0047121e-001, 7.7116867e-002, 3.9518492e-002, + 6.3112265e-003, -6.8158283e-002, 8.2755720e-003, -1.4671408e-002, + 1.0928921e-001, -5.3580922e-002, -4.9000311e-002, 9.9920986e-002, + 3.5724099e-002, 3.0645803e-002, 2.1810846e-003, -3.5472111e-002, + -5.8047398e-002, 4.6521237e-002, 5.3030675e-002, 1.6183593e-002, + 4.7161315e-002, 1.5496372e-002, -2.6065334e-002, 5.4108355e-002, + 1.1113747e-001, -4.3256641e-002, 1.6776514e-002, -9.2777987e-002, + 1.0831881e-001, 2.6550297e-002, 5.6809097e-002, 4.1708284e-003, + -9.3188930e-002, -3.7166019e-002, 7.2595776e-002, -5.8774162e-002, + -8.4078954e-003, -8.3732623e-002, -1.4874571e-002, 4.1882968e-002, + -3.2712401e-002, -2.7953154e-002, 1.1313205e-002, 4.9524990e-002, + 2.0294329e-003, 3.8285760e-002, -1.4648978e-002, -3.5010308e-002, + 3.2018027e-002, -1.7151604e-002, -9.6536966e-002, -4.6726273e-002, + 1.7288478e-002, 1.5788740e-002, 5.2848095e-003, 4.1795447e-002, + 4.6331282e-002, 7.0958286e-002, -3.3004895e-002, -1.5541634e-002, + -6.4899819e-002, 4.4813983e-002, 2.1314689e-002, 2.5903378e-002, + 3.1412995e-002, 2.7655815e-002, 7.0916690e-003, 3.6198660e-002, + -2.9768515e-002, 5.8014817e-002, -5.8727472e-002, -1.2787628e-002, + 1.2855854e-001, -7.0659467e-002, -9.9019211e-002, -3.2969432e-002, + 3.1190632e-002, 6.5956753e-003, -1.6987652e-002, 4.0088843e-002, + -1.0857916e-001, 1.1385790e-002, 6.8736591e-002, 9.1859027e-003, + -2.2753959e-002, 6.5639798e-002, 4.4619698e-002, -5.3424194e-004, + 3.2475239e-002, -5.5982848e-002, -5.9416171e-003, -2.6137328e-002, + 4.7534015e-002, -4.3905563e-002, 4.7139261e-002, -5.0539423e-002, + -5.2509019e-003, -8.4340990e-003, 1.7266091e-002, -6.5954891e-002, + -1.1344100e-001, -2.5794929e-002, 5.3678895e-002, -1.0500180e-002, + 5.6847837e-002, -3.0370988e-002, -9.2272021e-004, -1.1716566e-002, + -6.7153889e-002, -4.9491944e-002, -2.7151079e-002, 4.9084906e-003, + -3.3137805e-002, -5.7067625e-002, -3.5807416e-003, -1.9012110e-002, + -2.3489886e-002, -6.6147208e-002, -1.9730903e-002, -5.7617192e-002, + -1.7743738e-002, 6.2747755e-002, 3.0746059e-002, -2.1208817e-002, + 1.0724738e-002, -9.5295048e-002, -8.3696293e-003, 2.8928609e-002, + 7.7547429e-002, -2.8433474e-002, 3.9000811e-002, 1.8594177e-002, + 7.3604845e-002, -4.0570215e-002, 4.0428101e-002, 5.2162122e-002, + 6.9720490e-002, 1.3917348e-003, -4.1967149e-002, 1.2040326e-002, + -9.0859684e-002, 3.0619641e-002, 7.9828021e-002, -9.5582231e-002, + 4.4977158e-003, 5.3050166e-002, -3.9280557e-002, 2.1825815e-003, + 2.6836286e-002, -1.0693240e-002, 1.2507669e-002, 8.7551531e-002, + -4.2170924e-002, 7.4021050e-002, -5.0257861e-002, 4.2440318e-003, + 2.8498362e-002, 4.0712278e-002, 1.3630666e-002, 3.7506385e-002, + 2.9021782e-002, 9.4969857e-003, 7.3668316e-002, -1.0430524e-002, + 7.8640111e-003, -1.9579539e-002, -1.3354780e-002, 4.6553749e-002, + -1.5359398e-002, -3.6958328e-002, 3.9183126e-002, 9.0763364e-002, + -5.7310947e-002, 6.8567752e-002, 3.0379537e-002, -1.7131879e-002, + -4.9845297e-002, 6.6236979e-002, -3.5226094e-002, 4.1319436e-002, + -1.0414640e-002, -7.3110434e-002, -6.7060543e-003, -2.2661736e-003, + 5.4214708e-002, -5.6731971e-002, 8.0169623e-002, 6.8708173e-002, + 5.1555900e-002, -2.3028383e-002, 2.3845756e-003, 4.3290569e-002, + -5.0088302e-003, -8.5495950e-003, -2.2929081e-002, -1.4934858e-002, + -1.9331882e-002, 3.1952820e-002, 2.2837591e-002, -6.5833588e-003, + 9.3564125e-002, -5.3479061e-002, -4.7856971e-003, 7.8291548e-002, + -6.4278719e-002, 5.2534052e-002, -8.4991604e-003, -2.5331472e-002, + -1.1670703e-004, -1.6794583e-002, -3.6946100e-005, 7.9706385e-002, + 1.8011858e-002, 4.5273832e-002, 1.9568899e-002, 4.5061760e-002, + -2.6682717e-002, -1.8814340e-002, -8.5389413e-003, -4.6897567e-002, + -7.9016702e-002, -2.1058150e-005, 5.8849807e-002, -2.5161493e-002, + 6.0245233e-002, -8.2636501e-002, -6.9368318e-002, -1.5064100e-002, + -3.4932382e-002, 4.4579915e-003, -5.9080060e-003, 8.9889824e-002, + 8.1831512e-002, 1.6338686e-002, -5.4180978e-002, -5.3267629e-003, + -2.8476462e-003, 1.7450439e-002, -2.4213885e-002, 7.1383978e-003, + -8.5575620e-002, -9.7688859e-002, 5.4026353e-002, 6.8738257e-002, + -3.1782928e-002, 2.9354257e-002, -1.6843133e-002, -3.4228093e-002, + -4.9087072e-002, -8.8609944e-003, -4.2395609e-002, 6.0299570e-002, + -3.9805763e-002, -3.9969178e-002, -1.0972287e-002, -3.1903343e-002, + -2.3021388e-002, 9.5381824e-002, -3.8131819e-002, -2.7944014e-002, + 7.9797347e-002, 1.5055618e-002, -6.0223999e-002, 2.1349786e-002, + 1.4010766e-001, -7.0365161e-002, 9.5470745e-002, -5.5280731e-002, + 9.0676740e-002, 8.0165216e-003, 3.8071961e-002, 3.4452332e-002, + 1.2608974e-001, 7.4568874e-003, 2.2179776e-002, -5.1449927e-003, + -1.5259731e-003, 2.4388062e-002, 2.8159902e-002, 6.3528510e-002, + 7.2459203e-002, -6.6724867e-002, 4.9840343e-002, 1.0288982e-002, + -3.7523292e-003, 2.4660586e-002, 1.0905181e-001, 2.0534327e-002, + -1.6624929e-002, -4.7427409e-002, 7.1932143e-002, 2.4785276e-002, + -1.2656870e-002, -4.3142163e-003, -8.5065080e-002, 1.1401731e-002, + 4.2186129e-002, 1.7953548e-002, -9.5471407e-003, -2.7867915e-002, + 7.5845281e-003, 3.6129267e-002, -1.2896952e-001, -1.4991468e-002, + 3.9146522e-002, -7.6952239e-002, 2.3154057e-002, 3.2631339e-002, + 3.6032235e-003, 2.4348659e-002, -5.0004772e-003, -3.9711602e-002, + -2.5957781e-002, -8.4744957e-003, -6.8234352e-002, -2.8744676e-002, + 2.3341254e-002, 4.3007108e-002, 1.2712390e-002, 2.8427956e-002, + -1.5923634e-002, 4.4011784e-002, -1.5711433e-002, 4.4606989e-002, + -1.7483925e-002, -1.2423254e-001, 6.2454024e-003, 6.6168154e-002, + 2.1085300e-002, 9.0749477e-003, -2.0534154e-002, 6.9048807e-002, + -9.2613632e-003, -2.7695812e-003, -4.1107764e-002, 2.1935377e-002, + -8.4933698e-003, 7.9754080e-002, 2.8930188e-002, -1.5746665e-002, + -5.5368360e-002, 4.8760088e-002, -2.3262447e-002, 1.9970261e-003, + 1.7181455e-002, -2.6662315e-002, 2.9476649e-003, 3.6398404e-002, + -1.0718664e-002, -1.3419702e-002, -1.4303328e-002, -5.1753021e-002, + -8.8633620e-003, -6.6385388e-002, -1.8360778e-002, 4.0996838e-002, + -2.1821426e-002, 1.9446502e-002, 7.8258137e-002, 1.1935359e-003, + 1.2671015e-001, 5.4051017e-003, 8.9554422e-002, 5.1612989e-002, + -5.9613506e-002, 1.0465684e-001, 3.5325477e-002, -7.4798564e-002, + -6.6674861e-002, 2.8210488e-002, 3.9519939e-003, 4.2419282e-002, + 4.8733699e-002, 4.9734069e-002, -8.2263082e-002, -1.0431084e-003, + 6.5382265e-003, 2.7104024e-002, -6.1504411e-002, -1.1030328e-001, + -1.1088406e-001, 4.6883361e-002, -4.8929726e-002, -1.1842483e-002, + -3.2343663e-002, 2.8083963e-002, 6.5341653e-003, 6.4197433e-003, + -5.1922064e-002, 5.9610106e-002, -3.0492144e-003, -2.0038627e-002, + 6.6832718e-003, 3.5125897e-002, 4.9157559e-002, -1.1599903e-002, + -8.6904299e-004, -8.6599262e-002, 6.2299405e-002, 9.4208251e-003, + 7.3197513e-002, 7.5060589e-003, 1.5188546e-002, 8.4467481e-003, + 1.6309540e-002, -3.6380831e-002, -1.5684802e-002, -1.2750901e-004, + -3.9540578e-002, -2.6086647e-002, 5.0982353e-002, -3.8994541e-002, + -7.8152817e-002, -2.1288151e-002, 3.2125646e-002, -4.9028664e-002, + -5.2017685e-002, 4.8786860e-003, 8.7710015e-002, 3.7430190e-002, + 3.6962894e-002, -1.4930609e-003, -6.6490921e-002, 1.1278370e-001, + 1.6259975e-002, -1.1381280e-001, 3.0235399e-002, 7.9035487e-004, + -3.8638327e-002, 4.3147897e-002, 8.8130106e-002, -1.4913096e-002, + 3.9678262e-003, 3.6966598e-002, 6.3040724e-002, -4.9035837e-002, + -3.0293084e-003, 7.2467143e-002, 3.3553250e-003, 1.1619490e-002, + 2.5048420e-002, -1.3875509e-003, 4.3384801e-003, -1.9225635e-002, + -3.4205233e-002, -6.1043519e-002, 2.7920233e-002, 1.5845125e-002, + -3.1788360e-002, 5.5265277e-003, -8.8053862e-003, 5.1596808e-002, + -2.6382888e-002, 1.3528723e-002, 9.7188179e-004, 4.5393222e-002, + 1.4350879e-001, -8.3970455e-002, -5.3058686e-002, -1.7168532e-002, + 5.2123339e-002, -1.0874975e-001, -8.4692593e-002, 2.0470836e-002, + 1.3786291e-002, -4.3504389e-002, -5.5751144e-003, -9.6933329e-002, + -6.0058163e-002, -5.0236621e-002, 2.1957145e-002, 4.6918366e-002, + 5.4757597e-003, -1.2851732e-001, 5.3503448e-002, -7.8722951e-002, + 2.5143808e-002, 3.8130327e-002, 1.1190727e-001, -2.2211112e-003, + 3.4395397e-003, -6.6144203e-002, -1.3250907e-002, 1.4285490e-002, + -4.7426798e-002, 4.3459402e-002, 1.9567583e-002, -3.2933903e-002, + 7.9884585e-003, -3.6921691e-002, -5.2601711e-002, -3.7588436e-002, + -5.7858993e-002, -3.9355983e-003, -1.9668686e-002, 1.7962753e-002, + 7.1980552e-002, -1.2059618e-002, 3.4579944e-002, -1.8839556e-002, + -1.7604317e-002, 7.8825547e-002, 8.4168663e-003, -1.6198144e-002, + 7.7326058e-003, -1.4566324e-001, 7.0918323e-002, 2.7943557e-002, + 1.5952735e-002, 5.3303709e-002, -8.3804957e-002, -6.6985571e-002, + -1.3191151e-002, -4.2864677e-002, -5.9477390e-002, 4.9906263e-002, + 4.4401362e-002, 4.7588494e-002, 2.5451538e-002, -3.7015590e-002, + 1.8897192e-002, 8.5686801e-002, 5.1878702e-003, 4.3894402e-003, + 1.8570041e-002, 5.5022301e-002, -4.0645765e-002, -5.0799009e-002, + -2.3060691e-002, -5.3046714e-002, -2.9921308e-002, -4.2374683e-002, + -2.0684933e-003, -3.1561538e-002, -2.6520727e-002, 2.2842715e-002, + 4.7241369e-002, 1.5938051e-003, -3.1393040e-002, -2.2067479e-002, + 1.3659794e-002, -3.1810808e-002, 5.2038109e-002, 5.5282333e-002, + 7.3406997e-002, -8.5669402e-002, 3.0521734e-002, 1.3090940e-005, + -4.7165506e-002, 4.8765186e-003, -2.9407043e-002, 1.9843096e-002, + -2.7632043e-002, 1.4379705e-002, 3.2263917e-002, 5.4751887e-002, + -3.4032149e-002, -9.9526757e-003, 2.5634676e-002, 2.5738815e-003, + -5.5256747e-003, 4.1466343e-002, -2.8007927e-002, 8.2962880e-002, + 5.3608424e-002, -6.6232246e-003, -1.1529210e-001, -3.5498392e-002, + 2.0099626e-002, 4.5948750e-002, 1.7926143e-002, -5.9056747e-002, + -9.6797251e-002, -2.4358114e-002, -6.1063654e-002, 2.0158520e-003, + 8.7163319e-002, -8.9921518e-002, -9.8666202e-003, -9.3794619e-004, + 4.5791584e-002, 8.5254269e-003, 3.7372616e-002, -5.3279812e-002, + 7.8030247e-004, 1.1843336e-002, -7.4212330e-002, 1.1414296e-001, + -4.1485582e-002, -2.2089769e-003, -6.1672113e-003, 9.8929283e-003, + -7.8207292e-002, -4.8161136e-003, -7.2059255e-002, -3.5922784e-002, + -1.9786275e-002, 1.5833828e-002, 5.2545743e-002, 9.9962946e-003, + 1.0473584e-001, -2.6380727e-002, 6.2664438e-002, -1.0710067e-002, + -5.6621248e-002, -6.2640861e-002, 2.4906349e-002, 4.9470811e-002, + 1.5582134e-002, -1.1034795e-002, 3.7179257e-002, -7.9083587e-002, + 3.1086424e-002, -1.3685837e-002, -3.7552842e-002, -2.9528094e-002, + -1.7008381e-002, 3.7137697e-002, 4.5722891e-002, -6.7639973e-002, + 1.0411136e-002, -9.5948463e-002, -7.6491282e-002, 1.0515447e-001, + -7.2395284e-002, 2.6384356e-002, -9.7803448e-004, -1.2178894e-002, + -4.3298010e-002, -1.4118456e-002, -6.3811250e-003, 3.5987445e-002, + -8.0165530e-003, -2.0932915e-002, -1.3187860e-002, -4.3430054e-002, + -3.0586505e-002, 9.8974586e-002, 5.5685044e-002, -1.1098877e-001, + 3.4420705e-002, 2.6632342e-002, 2.8768821e-002, -5.6656185e-002, + -2.4035643e-002, 4.4599132e-002, 5.2401286e-002, -3.1991215e-002, + 3.8827361e-003, 4.7437513e-002, 6.7940056e-002, -2.3003581e-002, + -6.3955657e-002, 1.0081807e-001, -4.4211577e-003, -4.1263060e-002, + -5.8970926e-002, -2.4349696e-002, 3.2867209e-002, -2.4008048e-004, + 6.9810225e-002, 1.5450610e-002, 2.3319726e-002, -1.0005801e-001, + 6.2685066e-003, 3.3200964e-003, -6.0496946e-002, -8.8884008e-003, + 1.6134449e-003, -7.2506916e-002, 1.8835241e-003, -9.1372012e-003, + -3.9166883e-002, -3.0408037e-002, 1.3371700e-001, -8.4833604e-002, + -2.0082991e-002, -6.7833227e-002, 2.8939942e-002, 3.2760884e-002, + -1.1389661e-004, -4.3484404e-002, -5.9579661e-002, 8.5932179e-002, + -1.2312202e-001, 4.5080645e-002, 7.8749960e-002, 8.5343585e-002, + 8.3452328e-003, 3.8885343e-002, -5.4756855e-002, -5.2942923e-002, + -8.5138845e-003, 6.6560990e-002, -5.8418572e-002, 2.3870988e-002, + 1.8931370e-002, 5.9471104e-002, -8.6742031e-002, -4.4123808e-002, + 1.7375058e-002, -6.3987147e-002, 6.3031471e-003, -5.2766788e-002, + 1.6462106e-001, 3.4654166e-002, 1.8664640e-002, 2.0932790e-002, + -4.3515283e-003, -2.2953377e-002, -4.1758215e-002, 5.7430654e-002, + -5.3591655e-002, -4.6850896e-002, 4.1910973e-002, 1.1157103e-004, + -2.2629752e-002, 6.5200275e-002, -2.2924410e-003, -1.0436647e-002, + -5.9483696e-002, -3.6216756e-003, -1.3438807e-002, 1.2187937e-002, + -1.3021007e-002, 3.3878909e-002, -2.2899083e-002, -2.3054076e-002, + 4.7348343e-002, 2.8499078e-002, -1.7052032e-003, -1.3753287e-002, + -2.9609163e-002, -1.3025597e-002, -6.1569574e-003, 8.8234767e-003, + -4.4598847e-002, -7.8588213e-002, -1.8194816e-002, -6.0633228e-002, + 3.4385559e-003, 5.9361395e-002, 8.2140593e-002, 1.4939745e-002, + -3.1639344e-002, -1.2825312e-002, -3.5217707e-002, -1.9635520e-002, + 3.1739325e-002, -2.7107236e-002, 4.2299225e-002, 1.9675302e-002, + -2.6289167e-002, -3.7438885e-002, -6.5984833e-002, 4.2748691e-003, + -3.3482818e-002, -2.6690228e-002, -3.6330879e-002, -4.4149481e-002, + -1.5138292e-002, 2.8942426e-002, -1.6976163e-002, -5.9543856e-002, + 7.4778255e-002, 2.8451870e-002, 6.2164171e-002, -4.0415989e-002, + -4.2244492e-002, 4.6573272e-002, -1.8520798e-002, -6.9907182e-002, + 1.1254468e-002, 7.4484796e-002, 2.3774997e-003, -1.9725799e-002, + -1.1798209e-002, -4.5521440e-002, 2.7514728e-002, -7.2190342e-002, + -2.9948385e-002, -4.6214661e-003, -7.9002112e-004, 5.0066640e-002, + 5.3029490e-004, -1.8871680e-002, -1.9149132e-002, 1.4202910e-002, + 3.0816823e-002, -9.0922658e-002, 2.0531126e-002, -6.7237163e-002, + 3.5264507e-002, -4.3345885e-002, 4.3736504e-002, -5.0592953e-002, + -1.9560698e-002, 7.4759581e-002, -1.5500722e-002, -3.2266454e-002, + -1.4974813e-002, -3.1814004e-003, 7.1627759e-002, -1.0014999e-002, + -4.4711458e-002, 8.7059742e-002, -6.6573462e-002, 6.3231174e-002, + -3.9306487e-002, -2.8763870e-002, -3.4594112e-002, -1.7333119e-002, + 2.7978317e-002, -4.4558274e-002, 4.0316504e-002, -9.8056766e-003, + -1.1169830e-001, 2.6367365e-003, -6.3107346e-002, -4.7852804e-002, + 1.4822515e-002, -5.5825883e-002, 8.4652163e-002, 3.7276497e-002, + 5.8380260e-002, 1.0308762e-003, -1.7541914e-002, -8.1294365e-002, + 2.6500601e-002, 1.1576202e-002, -2.8475597e-002, -3.6427135e-002, + 1.0486963e-002, 3.5852026e-002, 1.7207452e-002, -4.2250927e-002, + 9.2791032e-002, 2.0848079e-002, -1.0474350e-002, -1.8906142e-002, + -3.9285383e-004, -1.0622005e-001, 3.0895699e-002, 7.2310785e-002, + -4.9338252e-002, -6.6112754e-002, 1.7508514e-002, 1.1321926e-003, + -2.4713477e-002, -4.2692403e-002, 3.6496772e-002, -8.7503250e-003, + -2.3071223e-002, 6.0697872e-002, -1.6211612e-002, 2.7467415e-002, + -2.3241079e-002, 7.6276171e-003, -6.3827211e-002, 6.7257864e-002, + 2.2947393e-002, 1.7785758e-002, 4.1818868e-003, 3.5410854e-002, + 1.0202987e-003, -7.0561943e-003, -2.0778987e-002, 3.2302118e-002, + 4.8279751e-003, -2.3094511e-002, -5.9461961e-002, 4.2486021e-002, + -8.3970460e-002, 3.1847805e-002, 1.4792567e-002, 8.3035216e-002, + -1.9097569e-002, -3.7566345e-002, -1.9294024e-002, -2.9735991e-002, + -1.6259656e-002, 8.7230220e-003, 1.5761104e-002, 1.1869692e-002, + 3.3119792e-002, -1.4862967e-002, 1.1372784e-002, -3.2009087e-002, + -2.9738311e-002, 7.4243184e-002, 4.4110110e-002, -2.6555813e-002, + -1.4281194e-002, -3.1948659e-002, 2.7573051e-002, 4.3762921e-003, + -1.5129696e-002, -1.7735857e-002, -4.4445686e-003, -5.8616688e-002, + -2.7569930e-002, -4.5140779e-002, -7.2200604e-002, 1.3667304e-002, + 5.7192972e-002, -6.3690024e-002, 5.5174808e-003, -5.8892530e-002, + -3.6233013e-002, 8.6180660e-002, -6.4381045e-002, 8.1908618e-002, + -8.2615195e-003, -8.7344886e-002, -3.6686884e-002, -4.3487249e-002, + -2.7761943e-002, -4.3954059e-002, 1.0761718e-001, -3.3942906e-002, + -5.6751929e-002, 5.3761364e-002, -8.2361460e-002, -2.0107493e-002, + -1.3391457e-001, -2.7865675e-002, -3.7665218e-003, 2.6626941e-003, + 2.1434427e-002, 4.9598442e-002, -9.1795559e-002, 5.6763841e-002, + -7.2345509e-002, 4.3385691e-002, -6.4303252e-002, -2.6067521e-002, + 3.1430980e-002, -4.8380081e-002, -1.7143742e-003, 3.8524956e-002, + 4.7310190e-002, -8.4985104e-003, 2.5096835e-002, -2.2478417e-003, + 4.8128123e-002, 3.7762949e-002, 1.4420063e-003, -4.4095518e-002, + 4.5456933e-003, -3.2426183e-003, -1.2533115e-002, 4.7767545e-002, + -2.8620801e-002, 7.8751032e-002, -1.6406002e-002, 6.0648681e-002, + -5.7970442e-002, -1.7637331e-002, -6.9358645e-002, -3.7997615e-002, + 3.9156091e-002, 1.1321921e-001, 8.4415942e-002, -1.1387462e-002, + -1.6199663e-002, -2.9916549e-002, -2.7917984e-003, -7.9695543e-002, + 8.2671498e-002, 1.3319799e-002, -1.7930240e-002, -9.1601668e-003, + 4.1019127e-002, 7.5932944e-002, 1.0036314e-001, 3.8966354e-002, + 4.6995786e-003, -4.5149567e-002, -4.8486656e-002, -4.1927255e-002, + 1.1311800e-002, 3.6819401e-002, 1.7973596e-002, 6.7898952e-003, + 1.5963322e-002, -4.9877456e-002, -3.7059174e-002, 1.4450399e-002, + 2.0093318e-002, 3.4367981e-002, -5.5058558e-003, -6.7143431e-002, + -4.8644499e-002, -6.9472431e-002, 2.5107776e-002, -4.6781145e-002, + -2.7352285e-002, -4.7986822e-002, -7.1934644e-003, -2.3173127e-002, + 6.4055565e-002, -1.9370286e-002, -4.9411717e-003, 3.4615802e-002, + -5.2643368e-002, -3.4227554e-002, 5.9084487e-002, -6.7507249e-002, + 1.4470533e-003, 7.4639509e-002, -3.9766965e-002, 3.5756960e-002, + -7.0471549e-003, -3.9222635e-003, 7.3001614e-002, 2.3197043e-002, + -2.5701022e-003, -6.5877930e-002, 2.7559657e-003, 1.9592050e-002, + -9.3462547e-002, -1.0871925e-002, -2.9680792e-002, -1.9738425e-002, + -2.7152604e-002, 2.3876803e-002, 4.5884118e-002, -2.4799389e-002, + -2.0581584e-002, -5.4267497e-002, -2.6460954e-003, 5.1362202e-002, + -6.9012380e-002, 4.4005296e-002, 6.3975781e-002, -2.6047622e-003, + 1.2042036e-002, 1.6037381e-002, -5.1284209e-002, -4.2194785e-002, + -1.6515324e-003, 2.8902550e-002, 2.6850380e-002, -6.0423448e-002, + 5.8605766e-003, 1.2158635e-002, 7.2552454e-002, 3.1314062e-002, + -9.3072204e-002, 3.1162922e-002, 1.3286605e-002, 3.9595454e-002, + 4.0202073e-002, 6.5767605e-002, -1.2155519e-002, 3.3751439e-002, + -3.2171914e-002, 4.8066982e-002, -3.9282293e-002, 8.3241192e-003, + 6.9639890e-002, 2.7334229e-002, -1.5479579e-001, 1.6788538e-002, + -3.1497022e-002, -4.2282993e-002, 6.3590085e-002, 2.5116069e-002, + -8.6396723e-003, 3.3260424e-002, -8.4721611e-002, -3.3390999e-003, + -1.1246017e-001, 4.1668358e-002, -5.8633451e-002, 1.8811584e-002, + -2.6955831e-002, 3.4502149e-002, -1.5140931e-002, -1.1615508e-001, + 1.9473941e-002, -2.4164678e-002, -4.7663500e-002, 2.5149605e-002, + -4.2667606e-002, -3.0691488e-002, -6.2397484e-002, -2.2317443e-002, + 7.1583564e-002, -1.7501358e-002, -7.4035381e-003, 3.6729476e-002, + -1.1245837e-002, 2.6520782e-002, -8.1593552e-002, -6.9408470e-002, + 1.4619786e-003, 3.8453478e-003, -6.3397206e-003, -6.0058523e-002, + -4.8251718e-003, 3.8074781e-002, -7.8163411e-002, 2.1385600e-002, + -2.1922130e-002, -4.0160455e-002, -6.8293755e-002, 9.0554557e-004, + 2.6664980e-002, 7.1501149e-004, 2.0586511e-002, 3.8317298e-002, + 1.2622402e-002, 3.0425320e-002, -5.9992562e-003, -3.2448647e-002, + -8.4599232e-002, 2.0966498e-002, 3.0616978e-002, -4.1909029e-003, + 4.3755380e-002, 3.5853709e-002, 8.2636139e-002, 5.2616538e-002, + -4.4023308e-002, -4.5906585e-002, 2.5247372e-002, 1.5587727e-002, + -2.8171046e-002, -3.2571994e-003, 3.1224580e-002, 2.3534457e-002, + 2.4495916e-002, 2.3711856e-002, 4.4990479e-002, 2.4656755e-002, + 1.2819956e-002, 5.7528241e-002, -6.3140487e-003, -9.8533686e-002, + -5.9046861e-002, 4.5919961e-002, 4.9303678e-002, -5.1366348e-002, + 2.4237326e-002, -3.5253937e-002, 7.6315728e-002, -6.2809404e-002, + -1.1060411e-002, 1.2072602e-002, 8.1692168e-002, 8.2459510e-002, + 1.2056340e-003, -1.0799649e-001, -7.2058599e-002, 5.1223849e-002, + 1.1635586e-001, 6.3237829e-002, 4.1510274e-002, -2.9788578e-002, + 4.8771019e-002, -5.6674600e-002, 1.9869930e-002, -1.2678819e-002, + -2.7919754e-002, 2.8331693e-002, 3.1691790e-002, 1.1562239e-002, + -2.8202192e-002, 2.1270404e-002, -4.2846202e-002, -3.2805821e-002, + 1.5184402e-002, 5.4017276e-002, -7.4480916e-003, 3.9322390e-002, + 8.8590506e-002, 1.8869046e-002, -4.8504749e-002, 1.9943452e-002, + -4.0731200e-002, -1.2975217e-003, -1.6745164e-003, 4.7281664e-002, + -2.7791569e-002, 8.0857121e-003, -4.8178120e-002, -5.8281241e-002, + -3.2593209e-002, -2.1746188e-002, -1.0017483e-002, 2.9529554e-002, + -1.4875157e-002, -4.5985303e-002, 4.9477795e-002, -2.8808805e-002, + -1.3613209e-002, -3.2427996e-002, -7.3709623e-002, 2.9008787e-003, + -2.4949574e-002, 2.9417830e-002, -5.0911040e-002, 7.2199223e-002, + -3.8502572e-003, -9.9986041e-002, -1.0110846e-001, 2.7240523e-002, + 3.7231607e-004, -4.8403626e-002, -4.2828865e-002, -4.0941132e-002, + 2.1262003e-002, 2.8579653e-002, -3.8107106e-002, -2.5403299e-002, + 4.0409634e-002, -1.3506783e-001, 6.7020935e-002, 7.6919909e-002, + -6.2598829e-002, -4.4526445e-002, 1.2270630e-001, 2.3974241e-002, + -3.6434038e-003, 4.6607563e-002, 8.1524293e-002, -3.0664049e-002, + 4.4022028e-002, 8.6563738e-002, 6.5752991e-002, -6.7108146e-002, + -1.0342413e-001, -1.8539076e-002, -3.0153611e-002, 6.7396260e-003, + -4.4950103e-002, -1.2515800e-003, 3.0646680e-002, 5.5510478e-002, + -5.2142526e-002, -6.6687624e-002, 1.5134636e-002, 1.3498064e-002, + -5.4450472e-002, -8.9529836e-003, 3.0094154e-002, 3.2202481e-002, + 1.3948693e-002, -6.7197034e-002, -8.5015250e-002, 6.3266660e-002, + 4.2798636e-002, -2.0333357e-002, -4.0383900e-002, -1.3841616e-002, + 6.3539401e-002, -1.4953539e-002, 7.3749647e-003, 4.6124894e-002, + -3.3099545e-002, 1.6994609e-003, 3.1756119e-002, 1.1361146e-001, + 2.3601853e-002, -6.1163866e-003, 1.4640892e-002, -1.3002994e-001, + -5.9991837e-002, -2.2185968e-002, -3.5202454e-003, -3.2725772e-002, + -1.6788319e-002, -6.9143762e-002, -3.0097649e-002, 1.2429939e-001, + 3.2580395e-002, -5.0115073e-002, 5.0306592e-003, -4.4954061e-002, + 3.6014498e-002, -1.3451790e-002, 1.6399117e-002, 1.3923416e-001, + -4.9725951e-003, 6.2052260e-003, -1.1645022e-001, -3.5608026e-003, + 6.4542089e-002, 2.5646928e-002, -3.9385217e-002, 3.4619781e-002, + -5.5728973e-002, -4.1560782e-002, 1.8601185e-003, -7.7632154e-002, + -1.1198136e-001, 1.7871366e-003, 3.2749909e-002, 6.3402834e-002, + -5.4553077e-002, -5.3258342e-002, 3.3343720e-002, 5.6556702e-002, + -2.8265688e-002, -2.3372050e-002, -7.1953496e-002, 4.9907070e-002, + -2.6195346e-002, -3.1269328e-002, -2.2738778e-002, -3.6952069e-003, + 2.3055605e-002, 3.7713246e-002, -3.3123125e-002, 6.3977198e-002, + 1.2888268e-002, -6.4863602e-002, -4.6370451e-002, -1.2762725e-002, + -1.1385579e-002, 5.3278522e-002, 4.0903155e-003, 2.4856544e-003, + 2.6887809e-002, -3.6020834e-002, 1.7437443e-002, 2.0139602e-002, + 2.9239905e-002, 3.8038669e-002, -9.6656754e-002, 1.5283078e-002, + -9.4684237e-002, 3.5509017e-002, -2.3867173e-002, 4.9278727e-003, + -3.9793551e-002, -1.1285602e-002, -1.1809578e-002, 2.7623350e-002, + 2.1829332e-003, 2.9116516e-002, -2.3743110e-002, -3.6766547e-002, + 2.0571789e-002, 5.6084571e-002, 1.3024358e-001, -7.5886589e-002, + 2.7947551e-002, 2.3155403e-002, -3.1278004e-002, -1.4436652e-002, + -2.4776289e-002, -6.8540264e-003, -1.0098350e-002, -8.8675200e-002, + 1.5859746e-001, -9.1002037e-002, 1.2604720e-002, -1.0483836e-002, + -2.8280415e-002, 7.1881441e-002, -5.6741201e-002, 6.6804943e-002, + 6.1990105e-002, 8.1565279e-002, 2.2720394e-002, -1.2405569e-002, + 7.1876233e-002, -1.0267524e-001, -3.0958839e-002, 7.9476530e-002, + 2.1440879e-002, -3.6594375e-002, 1.2693478e-002, -3.5996147e-002, + -4.4807775e-002, 3.0175162e-002, 6.0207188e-002, -4.4551692e-003, + 5.2444239e-002, -6.7182348e-002, 3.4282089e-002, 1.2050117e-002, + 6.7343302e-003, -3.4597852e-002, 6.2799536e-002, 9.0535361e-002, + 4.6750855e-002, 4.5616156e-002, -4.7775494e-002, 3.3437120e-002, + 6.3247569e-002, -2.5086044e-002, 6.0392800e-002, -1.0344192e-001, + 1.0532757e-002, 8.0919299e-003, -2.0549100e-002, 7.9851230e-002, + 5.9509621e-002, -1.0304151e-002, -3.6671778e-003, 1.0290329e-002, + -3.6286054e-002, -1.1732592e-002, -8.4237566e-002, 3.3390752e-002, + -5.1523669e-002, -7.7703392e-002, 7.2951732e-002, 5.5907824e-002, + 5.5894272e-003, 5.4254663e-002, 5.1024916e-002, -5.6879548e-002, + -6.2027367e-002, -5.6508306e-002, -4.3199186e-002, -7.0858160e-002, + -2.7514315e-002, -1.0304944e-002, 9.7007038e-004, -6.7224049e-003, + 9.2200691e-003, 3.8879401e-003, -6.5395433e-002, 6.6739257e-002, + 6.1434975e-002, -7.8933867e-002, -8.4834779e-002, -2.7405250e-002, + -2.6177970e-002, -3.3974921e-002, -3.5379505e-003, 5.0807223e-002, + -6.0485730e-002, -7.1839018e-003, 2.6693750e-002, 5.3186567e-002, + 1.4183779e-002, -2.2116051e-002, -1.3741848e-002, 6.1342417e-002, + -3.7993387e-003, 3.7238204e-002, -1.0739599e-001, -1.4549117e-002, + 4.0386015e-002, 1.2569153e-002, 3.5445067e-002, -3.8437920e-002, + -1.4546469e-002, 2.3252293e-002, 5.8740276e-002, -4.5320281e-002, + 4.8086444e-002, -4.6158419e-003, -5.5124482e-002, -3.3884263e-002, + -1.6266463e-002, -1.6153097e-002, -7.1902422e-004, 4.7423985e-002, + 4.5522942e-002, 5.8189486e-002, -1.6178881e-002, -8.5068904e-003, + -2.1481593e-002, 5.9052882e-002, 7.6940824e-002, -4.1182363e-002, + 9.3889318e-002, 3.2541071e-002, -5.0966470e-002, 1.1989934e-002, + 1.3485465e-002, 1.1716420e-002, -3.3544036e-002, 1.0756654e-001, + 2.3665782e-002, 5.1632941e-002, 3.3393177e-002, 2.6965276e-002, + -9.3765636e-003, -4.0374893e-002, -7.6274872e-002, 1.8358287e-002, + -5.4971891e-002, -6.1388507e-002, 4.0747836e-002, -3.0364737e-002, + -3.8176810e-002, 2.1957238e-003, 1.5046955e-002, -4.6671984e-003, + -3.7148168e-002, -3.7455685e-002, 3.7180183e-003, -8.5869921e-003, + 3.5823221e-002, 2.0854178e-002, -5.6165218e-002, -9.2879840e-002, + 1.4952542e-002, -1.6637472e-002, 2.7553373e-002, 1.1493587e-001, + -3.5352769e-002, -6.9065396e-002, 7.7929176e-002, -5.9205594e-002, + -1.8989624e-002, 1.1827864e-002, -3.8579019e-002, 1.6537438e-002, + -4.5152596e-002, -8.0801346e-002, -3.4708707e-002, -2.0902185e-002, + 3.5484478e-002, -7.2048970e-002, 3.9760809e-002, -2.1048159e-002, + 2.9412146e-003, -1.2228266e-002, -1.0549788e-002, -1.3705371e-002, + -4.2308328e-002, -8.5322508e-002, 5.6722120e-004, 3.8264621e-002, + 4.3257303e-002, 2.8754160e-002, 3.3445727e-003, 2.9282907e-002, + 4.8556817e-002, -3.3795246e-002, 4.0977665e-002, 3.6274969e-002, + 3.3552753e-002, 2.9872002e-002, 6.3307072e-002, 1.4992383e-002, + -5.8203262e-002, -3.0168145e-002, -3.2352139e-002, 7.6165643e-002, + 7.1774864e-002, -1.7731640e-002, 3.7646033e-002, 5.8535492e-003, + 8.3961663e-002, -7.6352210e-003, -3.6557713e-003, -6.1713535e-002, + -4.8057903e-002, -4.6264109e-002, -3.4792201e-002, -2.7416585e-002, + -1.3744116e-003, -1.9306191e-002, -5.0539515e-002, 2.7677455e-002, + -2.2617917e-002, -8.4784776e-002, 7.3259229e-002, 5.9548509e-002, + -7.2282648e-002, -5.0784237e-002, 9.1028580e-002, 1.6823871e-001, + 4.3922313e-002, 2.0660018e-002, 1.2905801e-003, -5.9644574e-003, + -6.6967719e-003, 2.1111482e-002, 4.5767224e-002, 1.9131948e-002, + 2.6813139e-002, -4.6825266e-002, 1.1768354e-002, -3.0426377e-002, + -7.0347178e-003, -7.6017599e-002, 2.1078534e-002, -9.1780175e-002, + 2.7352079e-002, 2.7780454e-002, 8.3826886e-003, -1.5967673e-002, + -1.0580313e-002, 3.8124734e-002, 3.6951219e-002, -2.5011240e-002, + 2.9019645e-002, 3.3574092e-002, 1.2199007e-002, -6.3328122e-002, + -1.0293542e-001, 6.2316941e-002, -1.1529230e-003, 1.0592972e-001, + -2.3803313e-002, -4.2884377e-002, -2.3136181e-002, 9.6100002e-003, + -3.8942235e-002, 1.0613309e-001, 1.1584978e-002, -2.8945108e-002, + 1.1978745e-001, 3.3535039e-002, -3.3192905e-002, 6.4322894e-002, + 4.3326082e-002, 2.2661431e-002, 2.1067896e-002, -1.6775258e-002, + -1.1513173e-001, 1.6050052e-002, 3.6844183e-002, 2.9072793e-002, + -6.7255761e-002, 5.7102385e-002, 7.0546617e-002, -2.0826937e-002, + -5.7583856e-002, 3.0146035e-002, -1.9649341e-002, 5.1108010e-002, + -1.2049234e-001, 9.1604975e-003, -4.4366320e-002, 1.0940581e-002, + -7.4110213e-002, 1.0027252e-001, 8.3559986e-002, -5.0547965e-002, + 3.0123395e-002, 7.0196532e-002, -8.3469946e-002, 3.3882963e-002, + 6.1607561e-002, 4.4793665e-002, -9.6577712e-002, -5.0411980e-003, + -1.5066601e-002, 2.4904787e-002, 1.1340361e-002, 2.9052246e-002, + 2.6840614e-002, -1.9931112e-002, 5.2525978e-002, -4.9751069e-002, + -7.9276887e-002, 2.8081748e-002, -4.1223168e-002, 1.3105117e-002, + -2.6569475e-003, -3.2102570e-002, -2.6357544e-002, 2.2152608e-002, + -3.1539891e-003, -3.4785718e-002, -1.0592171e-002, -4.0300905e-002, + -1.5702723e-002, -1.8712957e-002, 3.3197549e-002, -3.6279117e-002, + 4.2838238e-002, -1.6489429e-002, 2.4648914e-002, 5.1252616e-003, + -8.1225473e-002, -5.6459253e-002, -5.2348110e-002, -7.0335906e-002, + -3.3338823e-005, -3.2311169e-002, 7.4676135e-002, -3.7143822e-002, + -6.8303532e-002, -7.0033274e-004, -3.7552999e-002, -6.6305361e-002, + 1.2196684e-001, 2.2084222e-002, 4.1475857e-002, -1.0862949e-003, + -4.0143874e-002, -3.7947485e-002, 2.3605616e-002, 2.3128901e-002, + 1.6999557e-001, 8.7507268e-003, -1.6086519e-002, 1.6438629e-002, + 5.3086378e-002, 4.2778341e-002, -5.1411551e-002, -9.1155004e-003, + 7.1703894e-002, -6.2919585e-002, -4.1252239e-003, -2.7800338e-002, + 1.3406385e-002, -1.9639614e-002, 2.0766865e-002, -8.0707557e-002, + -7.9126401e-003, 1.2061087e-002, 7.8233420e-002, 2.5787108e-003, + 9.6325419e-002, 4.2169871e-002, 4.5779560e-002, 1.1692399e-002, + 3.6624616e-002, -2.1368960e-002, 8.6087403e-002, -3.9290515e-002, + -9.1694613e-003, 3.1814092e-002, 2.4160765e-002, -1.1817798e-003, + 1.1293805e-001, 3.5901275e-002, 2.3964131e-002, 1.4594516e-002, + 8.3442765e-002, 2.7873584e-003, 9.2888387e-002, 5.6597406e-002, + 3.3678386e-002, 1.1285883e-002, -1.3345965e-002, -3.7971276e-002, + 3.8853868e-002, 4.0434589e-002, -3.5457626e-002, 3.4183998e-002, + 9.8248684e-002, -7.6115939e-002, -1.1769491e-002, -3.8386164e-002, + -1.8975843e-002, -9.3988535e-002, -5.5576121e-003, -1.8636003e-002, + 2.8386234e-002, -2.4200578e-002, 4.1252766e-002, -6.8000375e-002, + -3.7388633e-002, -3.0010634e-002, -2.0049886e-002, 2.5499201e-002, + -3.7598273e-002, -4.4794045e-002, 4.9668753e-002, 2.8526404e-002, + -7.6218361e-003, -1.0150563e-001, -3.1635380e-002, 6.0899411e-002, + -4.0702573e-003, 3.6908492e-002, 6.0695811e-002, -8.5097943e-002, + 5.3730269e-002, 3.7528389e-003, 9.3525516e-002, -1.4898976e-002, + 2.7723761e-002, -1.3087617e-002, -8.5905788e-003, -4.0551186e-003, + 5.2805805e-003, 6.8736269e-002, 1.5477601e-003, 4.0766710e-003, + 2.4948069e-002, -2.3695927e-002, 2.0778232e-002, 7.7785189e-002, + -6.5214959e-002, -1.6680307e-002, -5.1966107e-002, 7.5663630e-003, + -1.3256079e-002, 2.9625848e-002, -3.9745297e-002, 2.5236371e-002, + -3.2270585e-002, 6.2655107e-002, 3.3731838e-002, 2.2075588e-003, + -2.9591354e-002, 3.1341479e-002, -7.6083655e-002, 6.1296972e-002, + -5.6695620e-002, 2.2323220e-002, 2.3643317e-003, 2.5031378e-002, + 5.5413805e-002, 6.0973843e-002, -7.3883029e-002, 1.3029020e-002, + 6.5448736e-002, -2.3732566e-002, -1.6089444e-002, -2.1074484e-002, + 5.7948843e-002, 8.6615559e-002, -9.1319744e-002, -1.0161538e-002, + 1.9629470e-002, 1.9360651e-002, -2.8093541e-002, -4.2935479e-002, + 1.0709420e-002, 7.8669934e-002, 2.3835887e-002, 1.8165279e-002, + -5.4214119e-003, -7.9902014e-003, 4.5058379e-002, -3.2063499e-002, + -5.8672800e-002, 1.2173177e-002, 5.9993154e-002, 2.3138893e-002, + 8.0998931e-003, -4.4800380e-002, -2.4859361e-002, -1.5868492e-002, + -5.2323712e-002, -4.5973299e-002, -2.3052455e-003, 8.1582903e-003, + 6.8065483e-002, 7.6438296e-004, 4.0392238e-002, -6.5966937e-002, + -5.0614520e-002, -5.5301523e-002, -4.2561773e-003, 5.9937931e-002, + -2.1382190e-002, -2.0676084e-002, -3.5839724e-002, -1.2403270e-002, + -1.8285642e-002, -4.5681905e-002, 2.5535673e-002, 1.4234783e-002, + -1.9259208e-002, -2.5661378e-002, 3.0184961e-002, -5.6818389e-002, + 3.2310662e-002, -2.4301821e-003, -1.2328487e-002, -5.4786335e-002, + -4.8916330e-002, 4.8190116e-002, -6.0850449e-002, 7.7620003e-002, + -6.6473044e-002, 5.1361693e-002, -4.4367608e-002, 5.9245756e-002, + 5.3474787e-003, 3.8059821e-003, -6.1171918e-002, -2.9543201e-002, + -8.3560612e-003, -4.1202373e-002, -5.3271164e-002, 7.6473415e-002, + 1.3747330e-002, -4.2692942e-002, -4.7688735e-002, 9.0017757e-002, + -5.5124068e-002, -4.9430822e-002, 1.9839950e-002, 6.1066303e-002, + -1.3518935e-001, 4.5758030e-002, 2.8061894e-002, 2.2738266e-002, + -9.3128822e-003, 7.9618280e-002, -1.2187199e-001, 4.5605462e-002, + -3.0479221e-002, 3.8694000e-002, -1.8124762e-002, 3.7759175e-002, + 1.8158014e-003, -2.7070632e-002, -2.3634825e-002, 5.2676876e-002, + -5.2016000e-003, -5.4593248e-002, -1.6338775e-002, -8.0919891e-002, + 8.7671746e-003, 5.8316283e-002, -6.9144058e-002, -4.6936119e-002, + 1.6594244e-002, -7.6784768e-002, -6.3547981e-003, 4.8236469e-002, + 1.6578926e-002, -2.8223303e-002, -8.7243754e-002, 5.5790867e-002, + 4.5976330e-003, -4.0593161e-003, -7.1609202e-002, 3.6451850e-002, + -3.6051938e-002, 1.0343606e-004, 4.0493147e-002, 2.1330427e-002, + -3.3170735e-002, -4.4584020e-003, 3.1555313e-002, -1.1414545e-001, + 5.6867307e-002, 4.0626699e-002, -5.8860350e-002, -1.0003188e-001, + -4.8326893e-002, -1.2614691e-002, -2.1586874e-002, -3.1935606e-002, + 2.4103451e-002, 1.4488790e-002, -8.0859096e-004, -3.8980020e-003, + 7.4909148e-002, -2.8049185e-002, -2.0918789e-002, -2.4711940e-002, + 5.3455068e-002, -9.7517045e-003, -2.4433675e-002, 3.7640959e-002, + 2.4437924e-002, 4.6113770e-003, -2.1101125e-002, -2.2852117e-002, + -7.2572348e-002, 3.6761328e-002, 2.6652183e-002, -4.3100149e-002, + -5.4098286e-002, 8.2220041e-002, 5.5613895e-002, 5.4603855e-002, + -1.3589191e-001, 2.3347518e-002, 4.6453611e-002, 2.2623921e-003, + 6.0644536e-002, -7.5601564e-002, -8.9194042e-002, -3.4410351e-002, + -3.4360013e-003, 5.1666691e-002, 1.2464056e-002, -2.3030505e-003, + -3.9004649e-002, 1.1817405e-002, -3.4117635e-002, -2.8693035e-002, + -1.5931261e-002, 8.0677220e-004, 1.8397691e-002, -3.1052320e-002, + 4.9726240e-002, -2.0747799e-002, -6.0637710e-003, -7.9396747e-002, + 4.8372461e-002, -7.1979765e-002, 2.6832942e-002, 2.9273777e-002, + -4.8337996e-003, 4.0391770e-003, -9.4918066e-002, 6.2066596e-002, + 4.9875577e-002, -3.3753903e-002, -2.4500392e-002, 9.0658929e-002, + -9.8343476e-002, -6.2504733e-003, 1.1991216e-001, 2.8944337e-002, + 2.6898626e-003, -6.4267875e-002, 2.9019187e-002, 1.9971213e-002, + 8.0684873e-003, 1.3081097e-002, -3.1283754e-002, -2.8489269e-002, + -1.1686268e-001, -1.3745347e-002, 5.3686243e-002, -5.2197217e-002, + -3.3465705e-002, -3.5083431e-002, 1.6015164e-002, 2.4493466e-002, + -2.3306198e-002, -1.9672026e-002, -7.6748565e-002, -7.1159132e-002, + -3.6831968e-002, -1.1592501e-001, -1.1802673e-001, 2.8843104e-002, + -5.9118430e-002, -1.1106526e-002, -4.0643480e-002, -3.3903934e-002, + 6.9026642e-002, -3.3357058e-002, 3.1574083e-002, 4.0538895e-002, + 4.3133551e-002, 3.7814770e-002, 6.4315631e-002, -5.5887205e-002, + -6.1198396e-002, 7.2376501e-002, -4.4847288e-002, 4.4972439e-002, + 8.9532496e-002, 2.7491210e-002, 3.5765916e-002, -5.8314299e-002, + -1.5996091e-002, -4.3521287e-002, -2.8304205e-002, -4.3486571e-002, + 1.0849438e-001, 2.2361367e-002, -6.1362009e-003, 5.3111507e-002, + -8.8565282e-002, 8.4842988e-002, 1.0627885e-002, 4.4828472e-003, + 7.7250566e-003, -3.5888413e-002, 4.5405946e-002, 9.5357093e-003, + 3.8049221e-002, 1.1798868e-002, 8.5901681e-002, 7.2651393e-002, + -1.0648259e-002, -3.5412792e-002, -5.2852119e-003, -2.8006256e-002, + -5.8455622e-003, 9.2263862e-003, 1.4651709e-002, -1.1429416e-001, + 8.0368439e-002, 2.6278264e-002, 2.0947848e-002, 5.9186459e-002, + 3.0967487e-002, -1.1507298e-001, -3.4239562e-004, -2.0939429e-002, + 6.9101989e-002, 1.9188787e-002, -1.7007634e-002, -1.4226805e-002, + 2.0497813e-003, 4.8643630e-003, -5.0243128e-002, 2.6571757e-002, + -2.5756622e-002, -6.2136271e-002, 3.0876774e-002, -3.2966648e-002, + -4.6798326e-002, -7.2864522e-002, -7.0620327e-002, 3.1514440e-002, + 4.7419175e-002, -2.9639040e-002, -7.4872381e-002, 1.0268214e-001, + -6.4408455e-002, -5.1714244e-002, -1.4811842e-002, -2.6652795e-002, + -3.3398841e-002, -9.1093311e-002, -2.9613673e-002, -3.2849316e-002, + -2.1792627e-002, -4.8905018e-002, 3.8278002e-002, -1.0578267e-001, + 3.9883500e-002, -4.0322452e-002, -7.7085856e-002, -1.1560340e-002, + -9.6078464e-003, -5.2790120e-003, -1.7445510e-002, 4.1210396e-002, + -3.1966850e-002, -4.2623715e-002, -3.8224686e-002, -2.3460384e-002, + -1.8322700e-002, 1.5049174e-001, -3.1993543e-002, 4.3014183e-002, + -4.4366020e-002, -1.9251396e-002, -1.2898947e-002, -6.0899923e-002, + -5.9898591e-002, -5.6557253e-002, 4.6067919e-002, 2.0882012e-002, + -7.1937529e-002, -9.5914837e-002, -1.2626698e-001, -3.6792717e-002, + 2.8022409e-002, -3.4921767e-002, -2.2305614e-002, -3.2328726e-002, + -4.8809030e-002, -2.6925977e-002, -4.2114647e-002, 8.7023862e-002, + -3.7654336e-003, 6.9322688e-002, 9.2912513e-003, 5.7435044e-002, + 1.9609569e-002, -1.1570562e-002, 6.1049764e-002, -6.4977165e-002, + -5.0641683e-002, -4.9830239e-002, 2.9619165e-002, -4.3292073e-002, + -6.2860680e-002, 6.3449012e-002, 6.3302743e-002, -3.7096028e-002, + -4.6860354e-002, 1.6643809e-002, -2.8812456e-002, -1.2949017e-004, + -5.0303595e-003, -5.1531111e-002, 1.0185519e-001, -8.8467370e-003, + -6.4260237e-002, 2.2972796e-002, -8.7208177e-003, 2.1703090e-002, + -3.2583688e-002, 1.9180369e-002, -4.6604492e-002, 5.9620323e-002, + -2.3169309e-002, 1.7923404e-002, 7.0399591e-002, -6.3632676e-003, + -6.2662420e-002, -5.0818406e-003, 7.6310034e-002, 3.8440333e-002, + 2.3108218e-002, 1.0992061e-001, -6.6023131e-002, 1.0339039e-002, + -1.2454926e-002, 3.0748449e-002, 3.8733454e-002, -8.1029526e-002, + -6.3890932e-003, -1.7310614e-003, -6.5448180e-002, -1.3567927e-002, + -1.4651225e-002, -1.6402517e-003, -4.0889024e-002, 3.3267739e-002, + -8.7669631e-002, -1.1762527e-001, -3.0337637e-003, -1.0579264e-001, + 3.8458061e-002, 6.1506618e-002, -1.2438319e-002, -2.0981512e-002, + 8.6707387e-003, 4.1305048e-002, 5.8010222e-002, 3.4177414e-002, + 6.1614068e-002, 3.7742022e-002, 2.2274616e-003, -3.3374053e-002, + -1.3841013e-002, -1.5519456e-002, -1.1770865e-001, -4.0589703e-002, + 1.1432496e-001, -2.8665001e-002, -9.7087434e-002, 2.8739815e-002, + 9.2917531e-002, 1.1938896e-001, -2.9010572e-002, -3.4721428e-002, + -3.4855927e-002, -1.2121671e-002, -1.0158399e-001, 9.7895131e-002, + -7.8712576e-002, -7.9976995e-002, 7.6185673e-002, -2.8833935e-002, + 1.8354206e-002, -1.7587259e-001, -7.8647771e-002, 2.2256759e-002, + -2.1611016e-002, 2.4071583e-002, 4.5227886e-004, -7.2657111e-002, + -7.2168746e-002, -1.1452740e-002, 1.6181869e-002, 4.5831060e-002, + -2.3369801e-003, -2.8727581e-002, 7.5005238e-003, -8.9739571e-003, + -4.1100109e-002, -1.6087343e-002, 7.4606898e-003, 2.9933544e-002, + -1.2690286e-001, -3.9049832e-002, 2.7720568e-002, 1.7947841e-002, + 3.4410773e-002, 5.5729818e-003, -1.8016513e-002, -4.8830323e-002, + 3.2716530e-002, -3.4232512e-002, -1.6426973e-002, 5.0795800e-002, + -3.1791729e-002, 3.7707010e-002, 4.5092581e-002, -4.8603247e-002, + 2.9459071e-002, -4.6422186e-002, 3.9296295e-003, -2.8900220e-002, + 1.1207343e-002, -3.5131485e-002, 3.0510860e-002, 1.0155622e-001, + 6.2187792e-003, 6.7503241e-002, 4.7232070e-002, -2.1226837e-002, + -8.4154353e-003, 2.0913858e-002, 7.0127327e-003, -1.2448522e-002, + 1.6449412e-002, 4.5151926e-002, 4.6836548e-002, -2.0687186e-002, + -7.3644538e-002, -1.0260562e-001, 4.1594354e-004, 2.2962943e-002, + -3.6753478e-002, -3.6656754e-002, -3.9912894e-002, 1.1998781e-002, + 1.2228691e-002, 6.9910277e-002, 2.4035919e-002, 7.1080248e-003, + 3.6471267e-002, -1.5899153e-003, -6.2981316e-002, -4.8019402e-003, + 9.9610031e-002, 3.4685502e-002, -1.4906597e-001, 6.2799402e-002, + -3.8932025e-003, 3.5313345e-002, 6.4080127e-003, 7.7712074e-002, + 1.9652177e-002, 3.3529556e-002, 6.7998095e-002, 4.0481914e-002, + -4.5148562e-002, 1.2390995e-001, 6.0472177e-002, -4.0537793e-002, + -2.9016904e-002, 1.0069785e-002, -4.3630516e-002, 1.6317010e-002, + -8.1563635e-003, -2.9428878e-002, -1.0007097e-002, 1.1748494e-003, + -3.7584384e-003, -1.0136314e-002, 6.9501199e-002, -6.2079897e-002, + 5.6550846e-002, -3.1224895e-004, 1.5172074e-002, 3.5494228e-002, + -2.8525286e-002, 7.0934847e-002, -2.1855207e-002, -9.0589689e-002, + -5.0420263e-002, -6.4220854e-002, 8.0572534e-002, 4.4657936e-002, + 3.8900053e-002, 2.3038306e-002, -2.9059798e-002, 4.1790833e-002, + -1.4498459e-003, -1.4247977e-002, -7.2557019e-003, 7.0209000e-002, + 7.1292433e-002, -1.0914340e-002, 1.0671194e-001, -3.9136244e-002, + -1.3175217e-002, 1.3764681e-002, 1.1563616e-001, -6.3896840e-003, + -6.2527708e-002, 8.8512912e-002, -2.9045669e-002, 1.5227173e-002, + -5.0667751e-002, 1.2560643e-001, 7.4986299e-002, 3.3825251e-002, + 1.5514266e-003, -5.2532720e-002, 1.7029297e-002, -3.2944301e-002, + -6.1748947e-002, 2.6402422e-002, -2.6902014e-002, -1.1054785e-001, + 4.5217579e-002, 7.2634916e-002, 4.7126396e-003, 5.3388646e-002, + 1.4724645e-002, 4.8733852e-002, -2.4509080e-002, -9.1580431e-002, + 5.2106999e-003, -1.5643665e-001, -4.8892928e-003, -5.3026671e-002, + -4.4146053e-004, 3.2444612e-002, -2.3101994e-003, 9.4890488e-002, + -7.8052719e-002, 6.0338172e-003, -4.0433742e-002, -3.9104783e-002, + 4.0994343e-002, 7.7513705e-002, -1.8133412e-002, -1.8801315e-002, + 9.9180571e-002, 5.9051814e-002, 3.2637953e-002, 4.5773237e-002, + 9.2868125e-003, -4.4946634e-002, -5.0590403e-002, -3.3365865e-002, + 3.5527025e-002, 7.4204867e-003, 1.5004459e-002, -3.4647091e-003, + 5.5465088e-002, 1.1416662e-001, -2.6462288e-002, 6.8671916e-002, + -6.3002510e-003, 1.1583924e-002, 3.1050102e-003, -1.0105237e-001, + -1.0657225e-002, -9.8132990e-002, -2.8254118e-002, 5.8377956e-002, + -2.3015648e-002, -1.7437864e-002, -2.2634945e-002, -4.8192213e-002, + -4.7584233e-002, 1.9414654e-002, -2.7057831e-002, 1.7158611e-002, + 1.3317117e-001, -5.5081291e-002, -5.0017430e-002, 7.6813579e-002, + 9.4583304e-002, -6.9067814e-002, 1.9120563e-002, 2.1258087e-002, + 7.2055539e-002, -4.4266255e-002, -3.2205709e-002, -2.8779031e-002, + -2.3481940e-002, 1.7708910e-002, -1.9311139e-002, 5.3418240e-002, + 2.4606925e-002, 5.0846628e-003, -2.0453302e-002, 3.5461384e-002, + 1.3245649e-002, -1.4856256e-002, -4.1995487e-002, -6.8461842e-003, + 4.3425178e-002, -4.2381240e-002, -1.2470922e-001, -6.6566711e-002, + -1.5328279e-003, 2.1121820e-002, -8.9850510e-002, 2.0682240e-004, + -5.8686388e-002, 7.1519107e-002, 2.7049268e-002, 4.3271736e-003, + -1.8990188e-002, 4.1744154e-003, -6.7617528e-002, -1.5982309e-002, + -8.6739389e-003, 6.8767245e-003, -7.0052976e-003, 8.3718019e-002, + 5.8127315e-002, -9.4223672e-002, -1.3478363e-002, -3.2457089e-002, + -1.7549472e-001, 2.8493349e-002, 1.0412304e-001, -1.1173210e-003, + 7.1447946e-003, 2.7052018e-002, 2.1816972e-003, -8.8630176e-002, + -1.0701357e-001, -4.1207617e-002, 3.7077898e-003, 8.7053488e-002, + 1.4283129e-002, 6.4010086e-002, -3.7679928e-002, 8.3111383e-002, + 5.6677718e-002, 1.4063916e-003, -1.0364232e-001, 3.6312049e-002, + -2.6135054e-002, 3.1703422e-002, -3.5189144e-002, 1.6030282e-002, + -7.0953448e-002, -1.6409520e-002, 1.5861113e-002, -4.0344599e-002, + 9.3345150e-002, -3.2385751e-002, 2.9194015e-002, -5.3074056e-002, + -5.8395538e-002, 1.4711047e-002, 1.6754312e-002, -4.1092096e-002, + -5.7509643e-002, 5.8321957e-003, 3.4401437e-002, 3.5235160e-002, + 6.4540634e-003, 6.8538944e-003, -1.0143565e-001, -2.5820489e-002, + -2.0821741e-002, 4.4652423e-002, -3.4072854e-002, -2.6609349e-002, + 3.3889860e-002, -5.3220787e-002, -2.4894595e-002, -9.6139329e-002, + -3.3024922e-002, 1.7823306e-002, -4.2192663e-003, -5.3704045e-002, + 1.1044474e-002, 1.4159169e-002, 5.6261779e-003, 1.4544719e-001, + -4.2079631e-003, -9.5725344e-002, -3.6408815e-003, 6.0200088e-002, + 2.9998960e-002, -7.3398314e-002, -4.8228886e-002, 3.3208412e-002, + -5.6677275e-003, -6.6855312e-003, -3.0785426e-002, 4.2126629e-003, + 7.0115500e-002, -3.9919529e-002, 4.0614066e-002, -3.0371460e-002, + 7.2891063e-002, 2.3537099e-002, 2.9755936e-002, -3.7706444e-002, + -8.3470665e-003, 7.6886063e-003, -8.4313321e-002, -2.9399720e-002, + -1.4589921e-002, 1.7944446e-002, -1.1460170e-001, -6.2017760e-002, + 3.4407222e-002, -2.7741014e-002, -4.6295413e-002, -2.7812656e-002, + -3.0886235e-002, 1.1995511e-002, -3.2969544e-002, -6.9191631e-003, + -2.9791556e-002, 2.0392531e-002, -4.7567313e-003, -9.8443940e-002, + -1.2686039e-002, -2.1886631e-002, -1.5455907e-002, -1.1782002e-001, + 6.1301396e-002, 2.1872915e-002, -1.0561240e-002, -2.3193915e-002, + 6.9727656e-002, 1.4693869e-003, -1.3543614e-001, -4.0815903e-004, + 5.6251246e-002, -9.1505709e-002, 5.7185400e-003, 7.1033142e-002, + -7.9002590e-002, -4.1318689e-002, 4.9841764e-002, 1.7309114e-002, + 5.7136005e-002, -2.1199613e-002, -6.1231140e-002, 7.2177738e-002, + 2.5816325e-002, -3.9691591e-002, -8.4077105e-002, 1.8921121e-002, + 4.0273842e-002, -5.0316912e-002, -1.2301284e-002, 1.4068218e-003, + 3.9074162e-002, 1.1140969e-002, -9.0100129e-002, 1.6566978e-002, + 2.2387085e-002, -5.5267138e-003, -1.4053472e-002, 8.5720676e-002, + 6.6003080e-003, -3.4558594e-002, -2.1528224e-002, 3.4199928e-002, + 8.3291659e-003, -3.4104982e-002, 7.5554591e-003, 1.0701557e-001, + 1.3371029e-002, -5.4777395e-002, -5.4878162e-002, -4.1852588e-002, + -4.0276462e-003, 1.0933072e-002, 3.1101256e-002, -4.6169830e-002, + -7.8623398e-002, -4.0709650e-002, -2.2176445e-002, -6.1230977e-002, + 1.6368772e-002, -1.0741991e-001, -3.4277843e-002, 6.1009971e-002, + -8.3667710e-002, 1.1309839e-002, 5.4127285e-004, 8.4633157e-002, + -6.3130402e-002, -1.1137924e-002, -5.0412645e-002, -5.4166796e-002, + -4.6504636e-002, 7.8517633e-002, 3.1626107e-002, -1.8210994e-002, + -3.5098136e-003, -1.2130004e-002, -1.3464374e-002, 5.0731507e-002, + -4.3012235e-003, 8.2720477e-002, -1.3193101e-002, -1.3778387e-002, + 5.5452531e-003, -9.3586936e-003, -8.6317405e-003, -3.6862811e-002, + -3.2830740e-002, 8.4783068e-003, -1.5330067e-002, 1.1130119e-001, + 7.3688984e-003, -6.4062197e-003, 3.9423451e-002, 8.1626914e-002, + -2.2657562e-002, 7.7429063e-002, -1.7196394e-003, -5.1547799e-002, + 8.5550269e-002, 1.0233102e-003, -2.7193777e-002, 5.8490358e-002, + 6.2673818e-002, -3.9346043e-002, -3.9066234e-002, -1.2783050e-002, + -6.3166376e-002, 2.7608238e-003, -4.7437497e-003, 4.1786886e-003, + -3.2351866e-003, -3.3156438e-002, -5.4098732e-002, -5.6553182e-002, + 5.8110628e-002, 1.1522620e-002, -5.4533062e-003, -1.6040357e-002, + -5.2050007e-002, 1.1068723e-002, 7.0599072e-002, -8.2637140e-002, + -3.3101999e-002, -1.7103108e-002, -5.2723510e-002, 1.1424693e-004, + -2.0451276e-002, -3.8451163e-002, -3.9178471e-002, 1.0882970e-001, + -5.9520509e-002, -1.6406338e-002, -3.7464624e-002, -1.5850757e-002, + 2.8142632e-003, 8.5106236e-003, -3.4606452e-002, 2.1538352e-002, + -5.1542008e-002, -6.0556592e-002, -3.0525775e-003, 1.0188123e-001, + -1.6159393e-002, -4.6398817e-003, -3.4883594e-002, 5.7383438e-003, + 7.6872944e-002, 1.6904979e-002, -3.9974367e-004, -6.4651835e-002, + 2.0519546e-002, 1.4600580e-002, 9.3830207e-002, 1.1815421e-001, + 8.2952538e-002, 1.3580903e-004, -4.5583612e-002, -8.4369787e-002, + 1.0032836e-002, 7.8411529e-002, 4.3200604e-002, -1.5040485e-001, + -1.2045753e-001, -3.0628967e-002, 4.6612260e-003, 6.4710750e-002, + -2.6463384e-002, 8.0467496e-002, 1.5772806e-002, -9.0031337e-002, + 3.8140960e-002, 2.4067996e-002, -1.4456479e-002, 2.5044977e-002, + -5.5023682e-002, -3.1476503e-002, 4.6154417e-002, 4.1969567e-002, + -2.1537004e-002, -1.3892791e-002, -7.9877470e-002, -6.6130095e-002, + -3.3971108e-002, 4.9723852e-004, -2.3332777e-002, 4.4957143e-002, + 4.5955566e-002, 7.3085106e-002, 1.4327863e-002, 4.4882884e-002, + -4.5453744e-002, 3.2494203e-002, -3.5223572e-004, -3.4399985e-002, + -5.9070327e-002, -2.4763167e-002, 5.4170280e-002, -9.3797557e-002, + -2.4345173e-002, 7.5789539e-003, 6.5847677e-003, -1.1035459e-001, + 6.4245815e-002, -6.3677641e-002, -2.7625955e-002, -4.9760945e-002, + 1.9438298e-002, -2.0183031e-003, 3.9238472e-002, 7.3801148e-002, + -7.4626808e-003, -3.5100675e-002, 1.1826910e-002, -5.0622844e-002, + 4.3419831e-002, -2.2438311e-002, 4.0482870e-002, -2.5746508e-002, + -4.5886738e-003, -4.2692344e-002, 6.0214404e-003, -4.9494823e-002, + -6.9637679e-002, -6.0074768e-002, -1.3792535e-002, 5.8374139e-002, + 4.0942951e-006, -4.1381257e-002, 5.5951370e-002, -2.9628877e-002, + 1.2189054e-002, 9.2356783e-003, 1.9097401e-002, 5.8341964e-002, + -5.8640330e-002, -4.0346416e-002, -2.0148478e-002, -7.3979491e-002, + -7.6507173e-003, -2.6376789e-002, 9.3631448e-003, 5.7075337e-004, + -1.7237147e-002, -1.4088176e-002, -6.5722025e-002, 1.7734913e-001, + 3.9188355e-002, -5.3138441e-003, 6.6012838e-004, -3.7635320e-002, + 8.6939560e-002, 2.5457618e-002, -5.3643902e-003, -3.5072285e-002, + 1.7654459e-002, -1.7002417e-002, -1.1934297e-002, 1.0909989e-001, + -4.5341914e-002, 2.9654212e-002, -7.3979691e-002, 8.1855730e-002, + -4.1111527e-002, 2.8178913e-002, 3.0990023e-002, -3.8439631e-002, + 4.6092851e-002, 2.0499136e-002, -4.0078674e-002, -7.5298075e-002, + 8.6249420e-002, 2.0413103e-002, 1.4283415e-002, 3.3364666e-003, + 4.5625551e-002, 2.8593452e-002, 1.0294208e-001, 4.6237012e-002, + 2.3737104e-002, 1.4850043e-003, 4.5627026e-002, -3.1300170e-002, + 2.7232389e-002, -2.5581725e-002, -4.2382451e-002, -4.1639602e-002, + -1.2685580e-002, -6.8348575e-002, -3.5070023e-002, -1.9126421e-002, + -5.1202221e-002, -2.1697346e-002, 6.3981805e-003, 6.1889782e-002, + -9.5515388e-002, -3.5099019e-002, -7.5991979e-003, 2.6608290e-002, + -6.5628332e-003, 4.0519304e-002, 1.8759115e-004, -8.2745501e-002, + 4.8080126e-002, -9.4334121e-002, -1.7519517e-002, 8.4578794e-003, + -1.0547960e-002, -2.9348950e-003, 2.2443020e-002, -8.3815521e-003, + 3.4363193e-002, 3.5010892e-002, -2.7129950e-002, -1.8407294e-003, + -2.7794904e-002, 7.5761568e-002, -5.1005395e-002, 2.2206192e-002, + 5.5815959e-003, 1.3179272e-002, 1.3743604e-002, 8.4180570e-002, + -4.5318175e-002, -4.0369759e-002, -5.5643911e-002, 1.1111604e-002, + 4.9980927e-002, -5.3328516e-002, -2.5289654e-002, -5.3455028e-002, + -4.5115993e-003, 1.2552924e-002, 2.4187614e-002, -6.5216647e-002, + -6.7184717e-002, -3.4635282e-002, 2.6037151e-002, -1.2958051e-002, + -6.4529955e-002, -4.7775406e-002, 7.7791690e-002, -4.1840856e-002, + 3.5508733e-002, 3.6208672e-002, 2.8883867e-002, -2.2614722e-002, + -6.2467477e-002, 2.1201398e-002, -6.4938220e-002, -2.5718030e-002, + 1.0132503e-001, -1.0989944e-001, 1.7386332e-002, -1.9848054e-002, + 4.6500211e-002, 8.7080916e-002, 6.1051787e-002, -6.9658176e-002, + 1.8448919e-003, -6.3897477e-002, 9.5246967e-003, -1.7099063e-002, + 8.6762837e-002, -5.1071138e-002, -4.1995939e-002, -1.5112140e-002, + 9.4802477e-002, -3.6319825e-003, 5.6475075e-002, -5.2649820e-003, + 5.5494589e-002, -3.6195527e-002, 3.0102603e-002, 9.6119308e-002, + 2.9804096e-002, -8.3871467e-002, -4.6819532e-002, -6.6699175e-002, + -7.8740356e-002, 2.3100681e-002, 4.0518590e-002, -5.5249251e-002, + 3.4210609e-002, 6.3808433e-003, 2.9561241e-002, -7.9993851e-002, + -8.6030708e-003, 4.9599184e-002, -5.3356684e-002, -4.3441101e-002, + 4.6557960e-003, -5.8349112e-002, 7.0442125e-002, 3.3583231e-002, + 3.5326691e-002, -1.4284013e-003, 3.7155912e-003, -6.1957730e-002, + -2.5175104e-002, 1.0316170e-004, 1.3785501e-002, -3.4528343e-002, + 9.4718664e-002, -8.5929124e-003, 6.2353769e-003, -1.9235982e-002, + -5.0684859e-002, -9.0890509e-002, 2.9614723e-002, -5.8904724e-002, + -5.9605704e-002, 1.7332188e-002, -6.2983369e-004, 7.6762655e-002, + -1.5739418e-001, 4.7428004e-002, -7.4437002e-003, 3.2753497e-002, + -6.4494291e-003, -1.0132357e-001, 3.1793509e-002, -1.9653108e-002, + -1.3986054e-002, -1.0375110e-001, 5.9341902e-002, 7.4338421e-002, + -7.4336814e-002, -8.8261702e-004, 8.4239417e-002, 3.6771318e-002, + 4.6614615e-003, -1.0885608e-001, 4.0218429e-002, -7.3328551e-002, + 3.4660924e-002, -2.2304889e-002, 9.1183611e-003, -3.1063866e-002, + 3.7029187e-002, -8.5599164e-003, -3.1378391e-003, -3.4177850e-002, + -3.6311985e-002, 5.4941612e-002, -2.5856244e-002, 9.8859541e-002, + -4.1708361e-002, 4.4676996e-002, 1.0012678e-001, 1.2298856e-002, + 3.9574107e-002, -5.4805478e-003, -2.5335550e-002, 2.0495470e-002, + -2.8777276e-003, -1.2280951e-002, -3.6926171e-002, -6.4637997e-002, + 3.1275904e-002, -4.0724158e-002, 8.2545982e-002, 1.7297459e-002, + 1.7103606e-003, -3.6063372e-002, -1.9411586e-002, 2.5489285e-002, + 5.3618799e-002, -1.5847040e-003, -8.2607767e-002, 6.4750926e-002, + 3.4155392e-002, 1.2202950e-002, -6.3849575e-002, -4.2629288e-002, + -9.3420039e-002, 1.8591964e-002, -6.2494687e-002, 2.7073439e-002, + -1.6706104e-002, 8.5702929e-004, 5.5338380e-002, -1.1863343e-002, + 2.4120033e-002, -1.9673309e-002, -9.0836747e-003, -8.4090025e-002, + -1.6605994e-002, 1.2509049e-002, 2.9654581e-003, 3.5414725e-002, + -9.1520329e-002, 5.3251481e-004, -3.9064127e-002, 4.3848196e-002, + -6.5906592e-002, -6.2694114e-002, -7.5430627e-002, -6.9288028e-002, + -7.3831218e-002, -2.2849271e-003, 4.1968983e-002, 9.1516100e-003, + 6.3003994e-002, 4.0825527e-003, -1.1602298e-002, 3.4062508e-002, + -3.6760665e-002, -6.6458351e-003, 4.5328593e-002, 1.5333803e-002, + 3.1081863e-002, 1.0997856e-003, 4.0172982e-002, -5.1202051e-002, + 3.0204527e-002, -9.1683008e-002, 6.6885251e-002, -1.4713293e-002, + -1.8783233e-002, -2.6727404e-002, -4.0587117e-002, 1.7352452e-002, + 2.4068866e-002, 9.3813608e-002, 1.4593201e-001, -2.6243684e-002, + 4.2410590e-003, 5.7049362e-002, -1.0495092e-002, 5.5352776e-002, + -1.4966413e-002, 5.8887924e-002, -2.9432846e-002, 1.5016450e-002, + 1.8771912e-002, 2.9731363e-002, -8.9727906e-002, -2.8879171e-002, + -2.4530626e-002, -2.1755227e-002, 2.6372269e-002, 1.6464203e-002, + -2.9595373e-003, -2.8033224e-002, -3.8960164e-002, -1.4500836e-002, + 1.2441672e-004, 6.9888338e-002, -1.3326151e-002, -4.4177213e-002, + 1.0679639e-001, -7.7540624e-002, 7.3527032e-002, 7.1684818e-002, + 2.4447003e-002, 1.3247555e-002, 2.5484911e-002, -2.0333037e-002, + 1.0820256e-001, -1.5291962e-001, 4.0764107e-002, -5.3576752e-002, + -3.3726558e-002, 5.9985203e-002, 1.4311757e-002, 1.0872979e-002, + 4.8154459e-002, -9.8724947e-002, 3.5433564e-002, -3.0296223e-002, + -4.9776503e-002, 6.4312955e-002, -3.8636806e-002, 4.1001924e-002, + 2.8324136e-002, -2.4954944e-002, 3.0731417e-002, -4.0748527e-002, + 1.0071007e-001, -4.2444577e-002, 7.4060614e-002, 7.0443088e-002, + -8.5281317e-002, 2.2408837e-002, -3.0453603e-002, 5.3244534e-002, + -2.7097865e-002, 9.3509025e-002, -4.0481022e-002, 3.0984921e-002, + 6.2120102e-002, 2.5263636e-002, 4.7524005e-002, -8.3461434e-002, + -4.0450596e-002, 2.4301374e-002, 2.4082281e-002, 2.7165952e-002, + 2.5739840e-002, -4.4498403e-002, -9.3779267e-002, 1.3230632e-002, + 5.6356340e-002, -3.1721297e-002, -1.1371059e-001, 5.1330793e-002, + 3.9800143e-002, 4.4602902e-002, 4.0186966e-002, -3.3956201e-002, + -3.4378181e-002, 3.0222123e-002, 1.3392410e-002, -1.1877032e-001, + -6.1513207e-002, 5.1308971e-002, -3.4406254e-004, -5.6836546e-002, + 3.1147677e-002, 1.2984031e-001, 6.9255265e-002, -7.3899471e-002, + 4.4113150e-002, 4.1613437e-002, -8.3330499e-002, -6.7769626e-002, + 9.9577638e-003, 8.5011488e-002, 3.1777824e-002, -3.0275122e-002, + -1.9721785e-003, -2.8670666e-002, -5.1951849e-002, 2.6123845e-002, + -4.6954628e-002, 3.9325561e-002, -1.4539624e-001, -4.4989415e-002, + 1.2490030e-002, 9.8158554e-002, -8.8549642e-002, 7.0425741e-002, + 1.6289354e-002, 7.6642414e-002, 8.2615082e-002, 1.5188920e-002, + 1.0717190e-001, 7.8459410e-003, -9.8939081e-002, 5.4496988e-002, + -1.9598305e-002, -4.8340131e-002, 9.1012052e-002, 4.5089162e-002, + 2.7001089e-002, 3.9597820e-002, -2.9912957e-002, -4.5233127e-002, + -2.6888627e-002, 8.2716012e-002, 4.1938511e-002, -1.2290728e-002, + -9.1141489e-002, -9.3716385e-002, 5.0846593e-002, -6.9747424e-002, + 1.5936647e-002, 9.0841003e-003, -7.9217963e-002, 4.2523607e-002, + -3.4283790e-002, 6.2931211e-002, 1.9054212e-002, 1.0431108e-002, + -1.7512053e-002, 1.5995877e-002, -6.9853083e-002, -3.6133865e-002, + 5.1883029e-002, -5.4941971e-002, 2.5099530e-002, 2.1949930e-002, + -7.2924143e-002, -1.2241689e-002, -2.5239538e-003, 1.0240874e-002, + -3.5188489e-002, -1.4637794e-002, 4.2573102e-002, -4.6954972e-002, + 4.9757134e-002, 8.9000907e-002, -5.7343223e-003, -9.4659733e-002, + 2.2731848e-002, -6.3526985e-002, -6.2729748e-002, -8.5124042e-002, + -2.2742192e-002, 4.9060274e-003, 5.9105851e-002, 6.6593845e-002, + -2.0401971e-002, -3.4052538e-002, 1.0187912e-001, -3.9129772e-002, + 1.6727491e-002, 7.9581367e-002, 2.3490622e-002, -8.5225499e-002, + 4.5609113e-002, 2.5532693e-002, -1.3949777e-002, 1.1939908e-001, + 3.1136484e-002, 2.1065018e-002, -7.3998053e-002, -3.3433899e-002, + 6.4825970e-002, -6.6483460e-003, 2.1878777e-002, -5.5590218e-002, + 6.2132974e-002, 6.0099401e-002, 2.6750906e-002, -3.2033687e-002, + 4.8448643e-002, -3.8771221e-003, -4.8090282e-002, -2.9473176e-002, + -1.6510646e-002, 5.6059374e-003, -2.8498771e-002, 1.4581678e-001, + 7.2382639e-003, 6.9060065e-002, 3.1254099e-002, 1.1295554e-001, + -2.0791262e-002, 2.6272472e-002, 2.3832128e-004, 1.7675185e-004, + 2.2985763e-002, 5.8978432e-003, 4.4429730e-003, 7.5305836e-002, + 2.7519294e-002, 2.6304737e-003, -7.5022497e-003, 9.7612623e-002, + -1.1392227e-003, 6.3717011e-002, 4.2435569e-002, -6.8014182e-002, + 7.4854037e-002, 3.2524349e-002, 7.0521866e-002, 2.0297711e-002, + -2.7255480e-002, -1.3079920e-002, -1.1988356e-001, 4.2564644e-002, + 8.9756674e-002, 1.7220549e-002, -4.4937423e-002, -2.9070759e-002, + -4.4538021e-002, -7.8632839e-002, -2.8995185e-002, -1.4328207e-002, + 2.6443524e-002, 8.9669124e-002, 1.7624887e-003, 3.2927633e-002, + -3.1535117e-002, -6.6599096e-003, 1.0186317e-001, 8.9875545e-003, + 2.8378610e-002, -5.5136504e-002, 3.3829370e-002, 7.1374246e-003, + -1.4538378e-002, 3.9237476e-002, 6.8685661e-002, -3.3057531e-003, + 1.1538617e-002, 8.8143388e-003, -1.9900457e-002, 2.0600418e-002, + 3.0249751e-002, -7.3517395e-003, 6.4648004e-002, -8.6600526e-004, + 8.3511299e-003, -5.4627039e-002, -6.4363505e-003, 1.6893141e-002, + 5.5401782e-003, -2.4244983e-003, -2.0950127e-002, -2.2956516e-002, + 7.8535473e-003, 2.4067483e-002, 6.1367370e-002, -3.3267227e-002, + -1.7259358e-002, -7.3612541e-003, -1.5577290e-002, 8.5933756e-002, + 5.0314067e-003, -5.7691721e-002, -3.1185546e-002, -1.0012818e-002, + -9.3068008e-003, -1.2733027e-001, -2.4660461e-002, -6.9689614e-002, + 6.7705187e-002, -9.0527945e-002, -8.9240761e-003, -3.6546741e-002, + -7.8518923e-003, 6.0277518e-002, 8.8143610e-002, -3.6670503e-002, + 5.9594768e-002, -6.2854695e-002, 8.4561367e-003, 4.2531503e-002, + 1.2490411e-001, -1.2983679e-002, 4.8837441e-002, 2.8397759e-002, + 4.9265357e-004, -5.0014029e-002, -6.4438003e-002, 6.3709335e-002, + -8.3485243e-002, -1.3662989e-002, -1.1010182e-002, -4.1630589e-004, + 3.7231066e-002, 5.8354336e-002, 1.4802151e-002, -9.2736005e-003, + 7.0150240e-002, -7.5624119e-002, -1.8709434e-002, 8.1817931e-002, + 1.0532906e-001, -6.6715765e-002, 1.1083842e-002, -7.4493893e-002, + -9.9142748e-003, 6.2718554e-002, 2.7079763e-002, -2.5876824e-002, + -4.8123789e-002, 6.1857353e-002, -4.2675136e-002, -6.2163117e-002, + -7.4268325e-002, -2.9318352e-002, -3.3154279e-002, 4.8684897e-002, + -2.4063594e-002, -8.6147192e-002, -7.1972623e-003, -4.4253121e-002, + -2.1162236e-003, -3.5637316e-002, -5.0298912e-003, 1.9549988e-002, + -3.1928938e-002, -4.5581285e-002, 4.7829407e-002, 8.7149645e-002, + 4.0640515e-002, 1.4297447e-002, 9.8222629e-003, 3.2853388e-002, + 6.8740447e-002, -1.2177132e-001, 9.4625764e-002, -1.5776485e-002, + -3.2495760e-002, 3.0796063e-002, -1.5368625e-002, -7.9526144e-002, + -6.2453602e-002, 5.9616092e-002, -6.4260784e-002, 1.5966646e-002, + 3.1495482e-002, 6.5589632e-002, -3.4614182e-002, -6.9190746e-002, + -2.0874294e-002, 1.3630214e-002, 5.3339825e-002, 1.6147000e-002, + 4.2668360e-002, -2.5662017e-002, 4.5348429e-003, 6.1345954e-002, + 4.1541021e-002, -4.9887559e-002, -5.8465581e-002, -2.1207204e-002, + 7.9091417e-003, -1.2334773e-002, -1.0617181e-001, 8.9782313e-002, + -6.8274917e-002, 2.1132464e-002, 5.7348207e-003, -9.2561293e-003, + -3.7038110e-002, -2.8239427e-002, 1.8178841e-002, -3.9897232e-002, + 1.0250394e-002, 6.3382126e-002, 3.1483520e-002, -1.4611403e-002, + -4.1066531e-003, 5.7642552e-002, 1.2244865e-002, 3.7434406e-002, + 2.2822222e-002, 9.2902509e-002, 1.1325867e-002, -6.2025695e-002, + 1.5489679e-002, -1.6179136e-002, -1.7726855e-003, 8.7415263e-002, + 2.9780528e-002, -6.5055050e-002, -1.7262184e-002, -1.2062737e-002, + 4.1904361e-002, -3.4331618e-002, 1.2164792e-001, 4.9603771e-002, + -1.3061748e-002, 1.1007232e-002, -1.4216546e-002, -3.5763228e-002, + 1.2025510e-002, 8.2989866e-002, 2.0160053e-002, -1.6822685e-002, + 7.3528826e-003, 2.0923780e-002, 5.2711615e-003, -2.5691601e-002, + 4.5395884e-002, -1.5802909e-003, 6.8782769e-002, 1.1122473e-001, + 1.0025602e-001, 1.3910254e-001, -8.5937461e-002, 3.2274784e-002, + 4.8447219e-002, -7.6279744e-002, -9.4932243e-002, -4.6596008e-002, + 6.9567452e-002, -2.0821944e-002, 2.8782945e-002, -1.8673196e-002, + -1.0249668e-003, 3.0785039e-003, 7.5883489e-002, -6.3193813e-003, + 7.7764074e-002, -4.3608077e-002, -1.3123466e-002, 3.6824621e-003, + -5.9201109e-002, -2.3113816e-002, -8.8488271e-002, -1.1032349e-002, + -2.3364616e-003, -6.5601368e-002, 1.4329878e-001, 9.5131857e-002, + 4.2865722e-002, -9.6979502e-002, -3.5638863e-002, 9.0205848e-002, + 1.9877782e-002, -1.2497646e-001, 2.5802125e-002, 4.6840610e-002, + -4.7117859e-002, -1.0958747e-001, -4.6687284e-002, 3.3044810e-003, + -4.3352639e-002, 5.5404689e-002, -1.4901969e-001, -6.5836290e-003, + -8.3908961e-002, -8.4786953e-003, 2.6778741e-002, -7.1364019e-002, + 2.9762397e-002, 3.8378977e-002, -1.3678167e-002, 1.0245114e-002, + -6.8802397e-002, -7.9396342e-002, 8.9092342e-002, -2.5071896e-002, + 1.6416317e-001, -3.3416141e-002, -8.8098549e-002, -2.8516999e-002, + -2.8171336e-002, 1.4735227e-002, 2.1490528e-002, 1.0996266e-002, + -7.9010073e-002, 1.3973632e-002, 8.5196514e-002, -3.4922417e-002, + 3.4433947e-002, 4.5850060e-002, -6.6284133e-002, -1.0572099e-001, + -6.6431349e-002, 6.0325770e-002, -9.2479536e-003, -2.2892434e-002, + -3.9861268e-002, 7.7138209e-002, 1.1492915e-002, 3.1465738e-002, + -1.2138307e-002, 4.7630033e-002, -9.7311603e-003, 1.3770049e-002, + -7.3660639e-003, 7.4335649e-002, -3.6628135e-003, 1.2752549e-002, + 1.3838186e-002, 4.2180077e-004, -5.4375913e-002, 2.1917738e-002, + -1.2614454e-002, -2.3342227e-002, -6.4971690e-002, 1.6110329e-002, + 1.4737048e-002, 3.0388287e-002, -1.6824888e-002, 1.7295248e-002, + 1.0812445e-002, -5.5425021e-002, -4.9277740e-002, 5.0707632e-002, + 4.1922806e-002, 1.8455962e-002, 5.0365924e-002, 4.4298398e-002, + 7.6431843e-003, 5.9989537e-002, -7.6908515e-002, 2.8530229e-002, + 9.5653590e-002, -7.2017798e-002, -8.0655593e-003, 1.0083818e-001, + 4.9232556e-002, -6.6242009e-002, 2.9556295e-003, -3.5960545e-002, + 1.1419955e-002, 6.6825880e-003, 2.9477422e-002, -2.9472636e-002, + 5.5236681e-002, 2.8874435e-002, -2.2350145e-002, -1.4664332e-002, + -6.8185763e-002, -2.0916584e-003, -6.2584599e-003, 5.9273963e-003, + 9.7345621e-002, 1.7069987e-002, -3.5800212e-002, 3.8397984e-002, + -4.6760839e-002, -5.0292748e-002, -2.1914980e-002, -1.8316586e-003, + -5.2956111e-002, -4.4811672e-003, 6.3511854e-002, -5.7468947e-002, + 3.3773578e-003, -6.2827625e-002, -1.0672637e-001, -2.3481169e-002, + -4.9309562e-002, -9.6720496e-003, 5.8540389e-002, -1.4927692e-002, + 4.5935378e-002, -1.5630681e-003, -1.8325545e-002, 3.2884463e-002, + 2.3472286e-002, 1.9480110e-002, -1.5164953e-002, 5.0952861e-004, + 3.6924652e-002, 3.9980199e-003, 2.7122068e-002, 4.0586323e-002, + -6.8458269e-004, 2.4214833e-002, -2.6547884e-002, -2.4783823e-002, + 8.8816623e-002, 5.5882019e-002, 5.3618064e-003, -1.1671543e-001, + -8.2213149e-002, -9.6951820e-002, 7.3380548e-002, -1.2640056e-003, + 4.1876563e-002, 2.5405425e-002, 2.4599929e-002, 1.4178532e-002, + 5.5594418e-003, 4.2950164e-002, 1.8014601e-003, -1.2215360e-001, + 1.0493101e-001, 3.1735201e-002, 5.5741286e-003, -3.2479076e-002, + 2.6681545e-002, 2.8019414e-002, -8.0179790e-003, 3.1489206e-002, + 4.3033256e-003, -3.7630185e-002, 5.3039128e-002, 5.1506634e-002, + -1.7820552e-002, -2.4621551e-002, -5.5322066e-002, 2.5011123e-002, + -4.7866728e-002, -1.0796552e-002, -3.3392282e-002, -4.7783524e-002, + -1.8094968e-002, -7.2520784e-002, -6.5389567e-002, 3.9464487e-002, + -9.8809443e-003, 3.1120895e-002, -5.4329781e-002, 1.6954674e-002, + -4.8954224e-002, 7.3972200e-002, 4.7640882e-002, 3.0356780e-002, + 9.5741578e-003, -4.1590063e-002, 1.1287435e-001, -8.6416889e-003, + -2.2674367e-002, 2.1388361e-003, 5.5542441e-002, 1.0045614e-002, + -8.7522721e-002, 8.7719983e-003, 6.7355731e-002, -1.6159743e-002, + 8.7223484e-003, 6.0092014e-002, -9.4184958e-002, -3.6268920e-002, + -2.1332232e-002, -3.1682036e-002, 2.8664908e-002, 2.6541157e-002, + -1.0689359e-001, -7.0862918e-002, -1.1433268e-001, 3.4863935e-002, + 1.0709581e-002, -5.5513033e-002, -1.5617145e-002, 1.9399041e-003, + 6.6680970e-002, -3.5719944e-002, -5.5335504e-002, -9.3481167e-002, + 2.3589372e-002, 1.2307760e-002, -4.1853305e-002, 3.2086368e-002, + 1.3207910e-002, -1.2902915e-002, 4.0576229e-002, -3.1174299e-002, + -4.7359539e-002, 3.2639664e-002, 6.8807350e-002, 3.0052612e-002, + -1.6360841e-002, 7.3692525e-002, 2.3214010e-002, -1.9279486e-003, + -2.9304762e-002, 1.4092775e-002, -3.8475139e-002, 4.0205235e-002, + 3.5637448e-002, 3.1815236e-002, 5.4193437e-002, 2.7101101e-002, + -7.8492340e-002, -1.3053183e-002, 9.8943970e-002, 3.2605663e-002, + -5.3326325e-002, 4.7045271e-002, 1.9171127e-002, -7.0639869e-002, + -2.6942346e-002, 2.1897131e-002, 4.4342108e-002, 2.5419609e-002, + 6.5525042e-002, -6.2924979e-002, 4.2919074e-002, 5.7909339e-002, + -2.0016289e-002, -7.1844831e-004, 3.3287795e-003, 5.2391582e-002, + 5.1351648e-002, 6.9345017e-002, 1.6715079e-002, 1.0245380e-001, + 6.5560454e-003, -4.2978289e-002, 5.1857486e-002, 1.6375558e-002, + -1.1231560e-001, 1.8452057e-002, 2.7196151e-002, -4.7948818e-002, + 3.8838999e-002, -8.1296721e-002, -4.4213439e-002, 3.3789367e-002, + -8.9903386e-002, -4.8309819e-002, 3.0350368e-002, 9.3462798e-003, + -4.3576313e-002, 5.0364033e-002, -3.3705706e-002, 6.9992170e-002, + 9.4421577e-002, -3.7859282e-002, -2.4699603e-002, 5.0385013e-002, + -5.4216273e-002, 6.9692784e-002, 1.0150382e-001, 1.7548633e-002, + 9.8962282e-003, -5.6862743e-002, 4.1445815e-002, 1.9635439e-002, + -3.1828877e-002, -7.5389343e-003, -2.2662898e-002, -9.3225720e-003, + 3.3794402e-002, -1.5022139e-002, -8.3952470e-002, -4.4638734e-003, + 5.0977217e-002, -5.6868826e-002, 8.2257315e-002, -3.3527792e-002, + -3.8753182e-002, -8.9806282e-002, 6.8640832e-004, 7.2265978e-002, + -1.2264922e-001, 1.0964559e-002, -6.3412284e-002, 1.2106129e-001, + -8.5320894e-002, -3.7961427e-002, -4.1350954e-002, -6.7090729e-002, + 4.9718886e-002, -3.3874055e-002, -7.1699033e-002, 2.5203129e-002, + 2.0350140e-002, 6.4638571e-002, -7.2804864e-002, 2.3308871e-002, + 1.5264191e-003, -1.1191223e-001, -6.0619938e-002, -2.2397074e-003, + 6.8646240e-002, -9.5147638e-003, -8.9258460e-003, -2.2587656e-002, + -8.8042374e-003, 2.7917130e-002, 3.0703476e-002, 4.0753823e-002, + -1.9174676e-002, 7.6285732e-002, 5.5310628e-003, 6.7972330e-002, + 1.6915582e-002, -3.3407461e-002, 2.3263797e-002, 3.1563985e-002, + 6.0315051e-004, -3.1286618e-002, -1.1639905e-002, -1.2659763e-002, + 1.2883340e-003, -5.0171053e-002, -4.9900923e-003, -1.0228083e-001, + -4.8479815e-002, -2.9928321e-002, -5.5916163e-002, 4.7735428e-002, + -1.3294429e-003, -7.5136122e-003, 5.4331339e-002, -4.2475157e-002, + -3.2342585e-002, -2.1096262e-002, 4.8946925e-002, -7.7232620e-002, + 4.6424245e-002, -7.1029625e-002, -8.3080699e-003, -1.8848230e-002, + -3.3058342e-002, 2.4301547e-002, -1.9950837e-002, -2.6746721e-002, + -3.1244062e-002, 4.9214132e-002, -4.3837753e-002, -2.6533780e-002, + -3.2174063e-002, 3.1234554e-002, 1.8396020e-002, 4.2139477e-003, + -6.3624347e-002, 3.8068496e-002, -7.5273414e-002, -5.4282683e-002, + 1.0378638e-001, -5.4062955e-002, 1.0025793e-002, -6.6450371e-003, + 8.2632045e-002, -1.1994389e-001, 3.1022007e-002, -3.1118158e-002, + 5.0953443e-002, -5.1605376e-002, -4.8568100e-002, -7.4390375e-003, + -4.7877758e-002, -9.4953155e-003, -2.6931667e-003, 2.3165347e-002, + 5.9754385e-003, 2.5900617e-002, -1.5042605e-002, -1.4480424e-002, + 4.2074657e-002, 8.9476498e-002, 4.5100917e-002, -5.1593045e-002, + 6.0834274e-002, 4.0989664e-002, -1.7405350e-002, 5.9998834e-002, + 1.2416742e-002, 1.8605073e-002, 1.0892550e-001, -3.2491824e-002, + -3.1135526e-002, -2.9815887e-002, 2.0205791e-002, 1.6566794e-002, + 7.0071566e-002, -4.9569656e-002, 3.9921784e-002, -2.8730117e-002, + -1.7587977e-002, 7.1500463e-002, 3.6872018e-002, -3.4586232e-002, + -1.6970720e-002, 3.4644172e-002, -2.0901296e-002, 4.2141589e-002, + -7.6319420e-002, 4.5998962e-002, -7.3399778e-002, -8.1916522e-002, + 3.8464961e-002, -1.1521599e-002, 7.2694972e-002, -3.9337982e-002, + 5.9084598e-002, -3.4257913e-002, -8.6242832e-002, -2.5477654e-002, + 1.5161827e-002, 4.3686125e-003, -1.1656981e-002, -1.5563664e-002, + 6.2510087e-002, -1.0836642e-002, 1.2432558e-001, -2.2959202e-002, + 1.3783634e-003, 3.3269441e-002, 3.8750648e-002, -1.3656516e-002, + 5.9833997e-002, 1.4796841e-002, -2.2627766e-003, 4.9145114e-002, + -1.1354640e-001, 1.3391314e-002, -1.3806188e-002, 2.7218571e-002, + -3.9102606e-002, 1.0801438e-002, -3.4971279e-002, -2.3190242e-002, + -1.6194699e-002, -1.9332419e-002, -2.7390066e-003, 1.8022691e-002, + -1.5832667e-002, -9.2546225e-003, -6.4699491e-002, 4.7590650e-002, + 5.4590011e-002, -2.0868480e-002, 4.8372708e-003, 3.5635613e-002, + 4.9026328e-002, -2.8886176e-002, 2.4904926e-002, 4.6825265e-002, + -4.1467334e-003, -7.4816934e-002, 2.4155196e-002, -1.2145775e-002, + -4.8433817e-002, -5.1333974e-002, -7.6611960e-004, -2.0288664e-003, + 4.4132138e-002, 1.3884023e-002, 3.3438764e-002, -1.7045598e-002, + -1.3981286e-003, 6.0450703e-002, 1.6026951e-002, -1.0038212e-002, + -5.9082814e-002, -6.8065244e-003, -2.0735019e-002, 6.4134665e-002, + 8.5071176e-003, -2.2373060e-002, 4.3619700e-002, 1.5963047e-002, + -3.0249871e-002, -8.3796187e-002, -3.4276448e-002, 5.3600630e-002, + -4.6111635e-002, 3.2125595e-002, 5.8851999e-002, -7.8040384e-002, + 5.2267851e-002, 3.4435223e-002, 2.1556971e-002, -1.7163880e-002, + -5.0843277e-002, -3.2488185e-002, -1.7547962e-002, 3.1629302e-003, + 1.1087340e-001, 5.8821833e-002, 2.7600291e-003, -1.8466769e-002, + 3.1019364e-002, 6.9714994e-002, 2.6197162e-002, -2.5002333e-002, + 2.1238793e-003, 6.3553430e-002, -3.4198265e-002, 4.8709571e-002, + -7.2299086e-002, -4.3035088e-002, 3.5760525e-002, 5.3143565e-002, + 2.8080467e-002, 7.4687831e-004, 3.3589299e-002, -2.7857822e-002, + 9.3293970e-002, -3.1352513e-003, -1.1227005e-003, -4.5092687e-002, + -2.5306886e-002, -1.0822730e-001, -6.5870362e-002, 5.0646576e-003, + -5.7436235e-002, 3.2011690e-002, -3.5040739e-003, -3.9957599e-002, + 1.6341870e-002, -7.6498865e-003, -2.5256813e-002, 2.8585914e-002, + -6.4304885e-002, -7.0698223e-002, -9.2642094e-002, -5.6328267e-002, + -8.0773935e-002, -6.5074477e-002, 2.0294178e-003, -2.4072922e-002, + 4.2458044e-002, 4.7875614e-003, -4.2143264e-002, -2.8324995e-002, + -2.9328658e-002, -9.2678479e-002, 4.5617708e-002, 1.2685434e-002, + -5.4340728e-002, 4.2087780e-002, 4.0016732e-002, -1.2299481e-001, + 1.0379559e-001, 5.7020403e-002, -3.9544599e-002, -1.8766513e-002, + 3.2158071e-002, 7.3924530e-002, -4.6618108e-003, -5.5299328e-002, + 4.4245720e-002, 3.7174478e-003, 3.4306804e-003, 4.2213951e-002, + -9.1086002e-002, 1.5797797e-003, -1.0094297e-001, -3.1042592e-002, + 1.6312788e-002, -5.7643992e-002, 8.5044833e-003, -5.8166289e-002, + 1.9822525e-002, -1.4404965e-001, -5.5582362e-002, -4.5001443e-003, + -8.6256453e-003, -1.0195382e-002, -3.5860515e-002, -6.9432334e-002, + -3.8266022e-002, -4.0918161e-002, -1.1863163e-002, 5.0949718e-002, + -8.0206291e-002, -2.6240511e-002, 7.6676678e-002, -6.5416559e-002, + -1.4318918e-002, -4.3958025e-002, -2.1978148e-002, -6.4422744e-002, + -2.2733013e-002, 1.2900773e-002, -1.7819685e-002, -4.7785428e-003, + 3.4686226e-002, 6.4004707e-002, -5.3322786e-002, -1.8493916e-002, + 4.9290003e-002, -4.5065517e-002, -2.9327742e-002, 2.3212884e-002, + -4.8985889e-002, 2.9604806e-003, -7.0253020e-003, -9.2397443e-002, + -7.6453564e-002, -3.4155955e-002, -1.0082514e-001, -8.0072913e-002, + 5.9487693e-002, -3.2053752e-002, -3.4654709e-002, -4.2857910e-002, + 4.3434899e-002, -6.1610488e-002, 2.3564532e-002, 5.0395882e-002, + -1.0869004e-002, 2.7674042e-002, 4.1961384e-004, 1.1474642e-001, + 1.5501309e-002, 5.3729017e-002, 8.2294950e-002, 3.6090309e-002, + 3.2405617e-002, 7.8649811e-002, 1.3050292e-002, -1.6718241e-002, + -4.2514925e-002, 2.0638931e-003, -1.0261822e-001, 5.5517573e-002, + -2.6256624e-003, 7.3917084e-002, -3.2038338e-002, 5.9286807e-003, + -4.9553265e-002, 4.0402131e-003, 1.9006069e-002, 1.5037719e-002, + -3.8431930e-002, -3.4089576e-003, -2.8898708e-003, -5.1916447e-002, + -9.3843168e-002, 2.9937678e-002, -3.9290957e-002, 4.4290160e-002, + -4.2250820e-002, -1.6616660e-002, -1.0653179e-002, -3.4916960e-002, + -3.1852948e-002, 1.8960722e-002, 6.0590194e-002, 1.7919981e-002, + -2.1735260e-002, 2.5431032e-003, -2.3276711e-003, 4.7679757e-003, + 2.6771182e-002, -8.0137596e-002, -4.9700338e-002, 2.4445536e-002, + -7.2537218e-002, -1.8968099e-002, 6.6550477e-002, 6.7579085e-002, + -3.1351180e-002, 1.6129275e-002, 3.6101242e-002, 1.1199196e-002, + 7.9145428e-003, 4.0067468e-002, 6.0585461e-003, -7.4588015e-003, + 2.1235782e-002, 6.3041751e-003, -1.1634076e-003, 2.2258425e-002, + -3.4248029e-002, -4.5811428e-002, 1.0578831e-002, -5.5482586e-002, + -6.8507992e-002, -7.7083934e-002, -5.3913115e-002, 5.9790071e-002, + -2.0841051e-002, 2.3080531e-002, 1.1187349e-001, -7.1392621e-002, + 2.9668837e-003, -2.9860507e-002, 4.6683202e-002, 8.5830739e-002, + -2.0897455e-002, 3.2863177e-002, 2.2323987e-002, 4.8358711e-002, + 8.7562303e-003, 1.4793712e-002, -2.5985375e-002, -4.6720770e-002, + -5.9782514e-002, -4.2989314e-002, 7.8223798e-002, 1.1501209e-001, + 1.2024343e-001, -5.6786240e-002, -4.8421534e-002, -2.5415443e-002, + 2.4664879e-002, 1.7783775e-002, 2.0466227e-002, 7.8206669e-002, + -8.2391143e-002, -1.3995146e-002, -2.0960454e-002, -5.6618569e-002, + -2.6705178e-002, -8.1531358e-002, 6.4664818e-003, 5.6946318e-002, + 5.0003662e-002, 3.5673980e-002, 8.0875426e-002, -4.4495078e-002, + -2.6194380e-002, 4.5188183e-002, -4.2455744e-002, 5.7249340e-002, + -4.6127242e-002, -5.4839710e-002, -5.0448334e-002, -2.2395030e-004, + -6.2981968e-002, 3.6554485e-002, 4.5243127e-003, 6.8154599e-003, + 1.6305659e-001, 3.9595164e-003, -1.0792651e-002, -2.8054860e-002, + -9.9706967e-002, 2.3929942e-002, -3.5658959e-004, 6.6546468e-002, + 7.6294884e-002, -4.0440534e-002, -8.1371512e-002, -7.7127876e-002, + 3.4857333e-002, 4.3231191e-002, 2.2144645e-002, -3.8698213e-002, + -5.4129054e-002, -3.2626325e-002, -7.0222190e-002, -5.1754787e-002, + -9.5744838e-002, -1.7610262e-003, 8.7360648e-003, -4.6748263e-002, + -4.4850953e-002, 8.2298815e-002, 1.0185814e-002, -3.0866560e-004, + 1.6675645e-002, -4.2935404e-002, -3.1656641e-002, -5.6516863e-002, + -4.7656267e-004, 1.0889961e-001, 1.2029252e-002, -1.3472583e-002, + 3.6157205e-002, 4.4803936e-002, 1.5275167e-002, -4.7686528e-002, + 6.0330901e-002, 1.3728328e-002, 4.8689836e-002, -3.5294359e-002, + -7.4547708e-002, 3.0394600e-002, 8.6384237e-002, -4.9979038e-002, + 1.3943821e-002, -8.2317359e-002, 2.6078427e-002, -4.8139628e-002, + -5.8720671e-002, 5.3289578e-003, -2.4543964e-002, -3.1049552e-002, + -6.8795054e-002, 2.6130466e-002, 6.4881211e-003, -1.7466698e-002, + 6.9418212e-002, 9.6543814e-002, 1.6716383e-002, 1.0116932e-001, + 3.1515754e-002, -1.5792490e-001, -3.1915346e-002, -4.3203259e-002, + -1.3039328e-002, 1.0861618e-002, 2.0098174e-002, -5.8931575e-002, + 4.5019833e-002, -4.4827929e-002, -8.5719969e-002, 4.7105627e-002, + 8.1454794e-002, 1.5516734e-002, -5.0548980e-002, 5.9127415e-003, + -7.5578193e-002, 1.1628813e-001, 4.7500758e-002, 4.9223640e-002, + 2.2248040e-002, -1.7063173e-002, 6.7174653e-002, -8.8027078e-003, + -7.9122977e-002, -2.7534155e-002, 1.8033777e-002, -6.3064595e-002, + -3.2992531e-002, -1.3414397e-002, -3.7650237e-002, -5.4990281e-003, + 4.9549050e-002, -7.8256965e-002, -4.6347502e-002, -3.7844657e-002, + -4.6727423e-002, 5.1371291e-002, -3.1964828e-002, -1.5232444e-003, + -6.8143489e-002, -5.5095855e-002, -1.0895044e-002, -2.5604041e-003, + 2.7027105e-002, -7.6982878e-003, -9.5337685e-002, -1.8635429e-002, + -1.0751357e-001, -5.6070283e-002, 1.4123461e-002, -1.8192970e-002, + 4.4540436e-002, 1.3600658e-002, 3.2261098e-002, 4.4861229e-002, + -1.5863787e-002, -1.0092780e-002, -3.9516555e-003, 3.8360973e-002, + 6.1804829e-002, 1.0870303e-001, 4.7383438e-002, -5.0590863e-002, + -5.2113776e-002, 5.2393207e-002, 1.2177198e-002, 6.2526425e-002, + 8.3174224e-003, -2.4071062e-002, 2.8581013e-002, -6.0028375e-003, + 1.5238535e-002, 5.2025149e-003, -3.6385591e-002, -9.3463539e-003, + -9.7549044e-003, 4.1434624e-002, -3.5638211e-002, 6.1524697e-002, + 1.2879217e-002, -1.1074718e-002, 7.5826917e-003, -4.3450751e-002, + -3.4027473e-002, 6.3700920e-002, -5.2272643e-002, -2.8750180e-002, + 4.0041018e-002, -8.1966458e-002, -1.0461089e-002, 2.5452300e-002, + 6.7107297e-002, -3.3918191e-002, -1.0212989e-001, -6.3527291e-002, + 3.1678548e-002, -6.5778118e-002, -1.6823229e-002, 2.2988117e-003, + -4.8242461e-002, -1.4582693e-002, -4.9060246e-002, -3.4256626e-003, + 4.1172518e-002, 3.2772250e-002, 2.4890066e-002, 3.4522929e-003, + 4.4704585e-002, -5.9967401e-002, 1.4541680e-002, -7.9411114e-002, + -6.5131143e-002, -4.2051810e-002, 4.2103006e-002, -9.8683984e-004, + -5.0962061e-003, -2.2606406e-002, -1.2325980e-001, 9.5086419e-002, + -1.9106034e-002, -5.1992218e-002, -6.7436377e-002, -1.5798067e-002, + -7.5885603e-002, 1.7614604e-002, 3.0602185e-002, -4.5707990e-002, + 5.0279499e-002, 1.3599448e-002, -8.4652879e-002, 1.4275404e-002, + 5.3761838e-002, 1.3130364e-002, -5.7785349e-003, 1.0995249e-001, + 3.6117865e-002, 2.2136081e-002, 1.1263325e-002, -4.9338919e-002, + 4.2415991e-002, -6.3570185e-002, 5.1525003e-002, 8.9408937e-002, + -4.3531507e-002, 2.5382423e-002, 5.7394710e-002, 1.1827633e-001, + -1.4335949e-002, 2.4596850e-002, -1.8394004e-002, 1.3479964e-002, + -5.5450915e-002, -1.3887857e-002, 3.7399926e-002, 4.2692709e-002, + -9.1345703e-002, -6.4179097e-002, 5.1528849e-002, 1.1923834e-001, + 8.0392828e-003, -7.4190647e-003, 1.1158220e-002, 2.3106872e-002, + 2.5289633e-002, -7.8109586e-002, 4.4033891e-002, 2.9868351e-002, + 2.5709704e-002, 6.5446252e-003, 1.7279125e-002, 8.8849380e-002, + -4.2399471e-002, 3.2297167e-002, -3.3758385e-002, 5.3666150e-002, + 3.7628322e-002, -1.3602948e-002, 8.3115154e-002, -4.4130785e-002, + 1.5545953e-002, -5.7188645e-002, 3.3708440e-002, 7.9527486e-003, + 7.2838427e-002, -8.7159852e-004, 9.8852335e-002, 4.3261724e-002, + -2.2410237e-002, -1.9969511e-002, 1.3049591e-002, 1.3520410e-001}; + +float audiobeam_mic_locations[15][3] = { + {1.5, 2.79, 0}, {1.5, 2.82, 0}, {1.5, 2.85, 0}, {1.5, 2.88, 0}, + {1.5, 2.91, 0}, {1.5, 2.94, 0}, {1.5, 2.97, 0}, {1.5, 3, 0}, + {1.5, 3.03, 0}, {1.5, 3.06, 0}, {1.5, 3.09, 0}, {1.5, 3.12, 0}, + {1.5, 3.15, 0}, {1.5, 3.18, 0}, {1.5, 3.21, 0}}; + +float audiobeam_source_location[3] = {1.1677, 2.1677, 1}; + +float audiobeam_origin_location[3] = {1.5, 3, 0}; diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.c new file mode 100644 index 0000000..4d10b14 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.c @@ -0,0 +1,425 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibm.c + + Author: Ian Lance Taylor and J.T. Conklin + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#include "audiobeamlibm.h" +#include "audiobeamlibmath.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +static const int audiobeam_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +static const float audiobeam_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + audiobeam_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + audiobeam_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + audiobeam_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + audiobeam_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + audiobeam_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + audiobeam_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +static const float audiobeam_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + audiobeam_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + audiobeam_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + audiobeam_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + audiobeam_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + audiobeam_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +static const float audiobeam_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + audiobeam_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + audiobeam_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + audiobeam_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + audiobeam_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + audiobeam_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +static const float audiobeam_two25 = 3.355443200e+07f, /* 0x4c000000 */ + audiobeam_twom25 = 2.9802322388e-08f; /* 0x33000000 */ + +__attribute__((always_inline)) static inline int +audiobeam___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int i, j, n = 0, ix, hx; + + AUDIOBEAM_GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { + if (hx > 0) { + z = x - audiobeam_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { + y[0] = z - audiobeam_pio2_1t; + y[1] = (z - y[0]) - audiobeam_pio2_1t; + } else { + z -= audiobeam_pio2_2; + y[0] = z - audiobeam_pio2_2t; + y[1] = (z - y[0]) - audiobeam_pio2_2t; + } + return 1; + } else { + z = x + audiobeam_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { + y[0] = z + audiobeam_pio2_1t; + y[1] = (z - y[0]) + audiobeam_pio2_1t; + } else { + z += audiobeam_pio2_2; + y[0] = z + audiobeam_pio2_2t; + y[1] = (z - y[0]) + audiobeam_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { + t = audiobeam_fabsf(x); + n = (int) (t * audiobeam_invpio2 + audiobeam_half); + fn = (float) n; + r = t - fn * audiobeam_pio2_1; + w = fn * audiobeam_pio2_1t; + if (n < 32 && (int) (ix & 0xffffff00) != audiobeam_npio2_hw[n - 1]) + y[0] = r - w; + else { + unsigned int high; + j = ix >> 23; + y[0] = r - w; + AUDIOBEAM_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { + t = r; + w = fn * audiobeam_pio2_2; + r = t - w; + w = fn * audiobeam_pio2_2t - ((t - r) - w); + y[0] = r - w; + AUDIOBEAM_GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { + t = r; + w = fn * audiobeam_pio2_3; + r = t - w; + w = fn * audiobeam_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + if (ix >= 0x7f800000) { + y[0] = y[1] = x - x; + return 0; + } + + return n; +} + +__attribute__((always_inline)) static inline float +audiobeam___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix < 0x32000000) { + if (((int) x) == 0) + return audiobeam_one; + } + z = x * x; + r = z * (audiobeam_C1 + + z * (audiobeam_C2 + + z * (audiobeam_C3 + + z * (audiobeam_C4 + + z * (audiobeam_C5 + z * audiobeam_C6))))); + if (ix < 0x3e99999a) + return audiobeam_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) + qx = (float) 0.28125f; + else + AUDIOBEAM_SET_FLOAT_WORD(qx, ix - 0x01000000); + hz = (float) 0.5f * z - qx; + a = audiobeam_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +__attribute__((always_inline)) static inline float +audiobeam___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix < 0x32000000) { + if ((int) x == 0) + return x; + } + z = x * x; + v = z * x; + r = audiobeam_S2 + + z * (audiobeam_S3 + + z * (audiobeam_S4 + z * (audiobeam_S5 + z * audiobeam_S6))); + if (iy == 0) + return x + v * (audiobeam_S1 + z * r); + else + return x - ((z * (audiobeam_half * y - v * r) - y) - v * audiobeam_S1); +} + +__attribute__((always_inline)) static inline float +audiobeam___copysignf(float x, float y) { + unsigned int ix, iy; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + AUDIOBEAM_GET_FLOAT_WORD(iy, y); + AUDIOBEAM_SET_FLOAT_WORD(x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +} + +__attribute__((always_inline)) static inline float +audiobeam___cosf(float x) { + float y[2], z = 0.0f; + int n, ix; + + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return audiobeam___kernel_cosf(x, z); + + else if (ix >= 0x7f800000) + return x - x; + + else { + y[0] = 0.0; + y[1] = 0.0; + n = audiobeam___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return audiobeam___kernel_cosf(y[0], y[1]); + case 1: + return -audiobeam___kernel_sinf(y[0], y[1], 1); + case 2: + return -audiobeam___kernel_cosf(y[0], y[1]); + default: + return audiobeam___kernel_sinf(y[0], y[1], 1); + } + } +} + +__attribute__((always_inline)) static inline float +audiobeam___fabsf(float x) { + unsigned int ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + AUDIOBEAM_SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} + +__attribute__((always_inline)) static inline float +audiobeam___floorf(float x) { + int i0, j0; + unsigned int i; + AUDIOBEAM_GET_FLOAT_WORD(i0, x); + j0 = ((i0 >> 23) & 0xff) - 0x7f; + if (j0 < 23) { + if (j0 < 0) { + if (audiobeam_huge + x > (float) 0.0f) { + if (i0 >= 0) + i0 = 0; + else if ((i0 & 0x7fffffff) != 0) + i0 = 0xbf800000; + } + } else { + i = (0x007fffff) >> j0; + if ((i0 & i) == 0) + return x; + if (audiobeam_huge + x > (float) 0.0f) { + if (i0 < 0) + i0 += (0x00800000) >> j0; + i0 &= (~i); + } + } + } else { + if (j0 == 0x80) + return x + x; + else + return x; + } + AUDIOBEAM_SET_FLOAT_WORD(x, i0); + return x; +} + +__attribute__((always_inline)) static inline int +audiobeam___isinff(float x) { + int ix, t; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + t = ix & 0x7fffffff; + t ^= 0x7f800000; + t |= -t; + return ~(t >> 31) & (ix >> 30); +} + +__attribute__((always_inline)) static inline float +audiobeam___scalbnf(float x, int n) { + int k, ix; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + k = (ix & 0x7f800000) >> 23; + if (k == 0) { + if ((ix & 0x7fffffff) == 0) + return x; + x *= audiobeam_two25; + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + k = ((ix & 0x7f800000) >> 23) - 25; + } + if (k == 0xff) + return x + x; + k = k + n; + if (n > 50000 || k > 0xfe) + return audiobeam_huge * audiobeam___copysignf(audiobeam_huge, x); + if (n < -50000) + return audiobeam_tiny * audiobeam___copysignf(audiobeam_tiny, x); + if (k > 0) { + AUDIOBEAM_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x; + } + if (k <= -25) + return audiobeam_tiny * audiobeam___copysignf(audiobeam_tiny, x); + k += 25; + AUDIOBEAM_SET_FLOAT_WORD(x, (ix & 0x807fffff) | (k << 23)); + return x * audiobeam_twom25; +} + +__attribute__((always_inline)) static inline float +audiobeam___ceilf(float x) { + int i0, j0; + unsigned int i; + + AUDIOBEAM_GET_FLOAT_WORD(i0, x); + j0 = ((i0 >> 23) & 0xff) - 0x7f; + if (j0 < 23) { + if (j0 < 0) { + if (audiobeam_huge + x > (float) 0.0) { + if (i0 < 0) + i0 = 0x80000000; + else if (i0 != 0) + i0 = 0x3f800000; + } + } else { + i = (0x007fffff) >> j0; + if ((i0 & i) == 0) + return x; + if (audiobeam_huge + x > (float) 0.0) { + if (i0 > 0) + i0 += (0x00800000) >> j0; + i0 &= (~i); + } + } + } else { + if (j0 == 0x80) + return x + x; + else + return x; + } + AUDIOBEAM_SET_FLOAT_WORD(x, i0); + return x; +} + +__attribute__((always_inline)) static inline float +audiobeam___ieee754_sqrtf(float x) { + float z; + int sign = (int) 0x80000000; + int ix, s, q, m, t, i; + unsigned int r; + + AUDIOBEAM_GET_FLOAT_WORD(ix, x); + + if ((ix & 0x7f800000) == 0x7f800000) + return x * x + x; + if (ix <= 0) { + if ((ix & (~sign)) == 0) + return x; + else if (ix < 0) + return (x - x) / (x - x); + } + m = (ix >> 23); + if (m == 0) { + __pragma_loopbound(0, 0); + for (i = 0; (ix & 0x00800000) == 0; i++) + ix <<= 1; + m -= i - 1; + } + m -= 127; + ix = (ix & 0x007fffff) | 0x00800000; + if (m & 1) + ix += ix; + m >>= 1; + + ix += ix; + q = s = 0; + r = 0x01000000; + + __pragma_loopbound(25, 25); + while (r != 0) { + t = s + r; + if (t <= ix) { + s = t + r; + ix -= t; + q += r; + } + ix += ix; + r >>= 1; + } + + if (ix != 0) { + z = audiobeam_one - audiobeam_tiny; + if (z >= audiobeam_one) { + z = audiobeam_one + audiobeam_tiny; + if (z > audiobeam_one) + q += 2; + else + q += (q & 1); + } + } + ix = (q >> 1) + 0x3f000000; + ix += (m << 23); + AUDIOBEAM_SET_FLOAT_WORD(z, ix); + return z; +} diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.h new file mode 100644 index 0000000..fa75942 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibm.h @@ -0,0 +1,63 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: quicksortlibm.c + + Author: Ian Lance Taylor + + Function: IEEE754 software library routines. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: See audiobeamlibm.c + +*/ + +#ifndef AUDIOBEAM_LIBM +#define AUDIOBEAM_LIBM + +#define audiobeam_M_PI 3.14159265358979323846 + +static const float audiobeam_one = 1.0f, audiobeam_tiny = 1.0e-30f, + audiobeam_half = 5.0000000000e-01, /* 0x3f000000 */ + audiobeam_huge = 1.0e30, audiobeam_two8 = 2.5600000000e+02, /* 0x43800000 */ + audiobeam_twon8 = 3.9062500000e-03, /* 0x3b800000 */ + audiobeam_zero = 0.0; + +#define audiobeam_cos audiobeam___cosf +#define audiobeam_fabs audiobeam___fabsf +#define audiobeam_fabsf audiobeam___fabsf +#define audiobeam_isinf audiobeam___isinff +#define audiobeam_sqrt audiobeam___ieee754_sqrtf +#define audiobeam_ceil audiobeam___ceilf +#define audiobeam_floor audiobeam___floorf + +__attribute__((always_inline)) static inline float +audiobeam___copysignf(float x, float y); +__attribute__((always_inline)) static inline float audiobeam___cosf(float x); +__attribute__((always_inline)) static inline float audiobeam___fabsf(float x); +__attribute__((always_inline)) static inline float audiobeam___floorf(float x); +__attribute__((always_inline)) static inline int +audiobeam___ieee754_rem_pio2f(float x, float *y); +__attribute__((always_inline)) static inline float +audiobeam___ieee754_sqrtf(float x); +__attribute__((always_inline)) static inline int audiobeam___isinff(float x); +__attribute__((always_inline)) static inline float +audiobeam___kernel_cosf(float x, float y); +__attribute__((always_inline)) static inline float +audiobeam___kernel_sinf(float x, float y, int iy); +__attribute__((always_inline)) static inline int +audiobeam___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, + const int *ipio2); +__attribute__((always_inline)) static inline float audiobeam___scalbnf(float x, + int n); +__attribute__((always_inline)) static inline float audiobeam___ceilf(float x); +__attribute__((always_inline)) static inline float audiobeam___floorf(float x); + +#endif // AUDIOBEAM_LIBM diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.c b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.c new file mode 100644 index 0000000..ff4691d --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.c @@ -0,0 +1,15 @@ +#include "audiobeamlibmalloc.h" + +#define AUDIOBEAM_HEAP_SIZE 10000 + +static char audiobeam_simulated_heap[AUDIOBEAM_HEAP_SIZE]; +static unsigned int audiobeam_freeHeapPos; + +__attribute__((always_inline)) static inline void * +audiobeam_malloc(unsigned int numberOfBytes) { + void *currentPos = + (void *) &audiobeam_simulated_heap[audiobeam_freeHeapPos]; + /* Get a 4-byte address for alignment purposes */ + audiobeam_freeHeapPos += ((numberOfBytes + 4) & (unsigned int) 0xfffffffc); + return currentPos; +} diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.h new file mode 100644 index 0000000..e48359b --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmalloc.h @@ -0,0 +1,28 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibmalloc.c + + Author: unkown + + Function: Memory allocation. + + Source: Sun Microsystems and Cygnus + + Original name: Unknown + + Changes: No major functional changes. + + License: see license.txt + +*/ + +#ifndef AUDIOBEAM_MALLOC_H +#define AUDIOBEAM_MALLOC_H + +__attribute__((always_inline)) static inline void * +audiobeam_malloc(unsigned int numberOfBytes); + +#endif diff --git a/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmath.h b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmath.h new file mode 100644 index 0000000..28959dc --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/generated/modified_sources/inline/audiobeamlibmath.h @@ -0,0 +1,68 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: audiobeamlibmath.h + + Author: Unknown + + Function: IEEE754 software library routines. + + Source: Sun Microsystems + + Original name: math_private.h + + Changes: No major functional changes. + + License: See the terms below. + +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef AUDIOBEAM_MATH_PRIVATE_H_ +#define AUDIOBEAM_MATH_PRIVATE_H_ + +#include "audiobeamlibm.h" + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + unsigned int word; +} audiobeam_ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define AUDIOBEAM_GET_FLOAT_WORD(i, d) \ + { \ + audiobeam_ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define AUDIOBEAM_SET_FLOAT_WORD(d, i) \ + { \ + audiobeam_ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/audiobeam/license.txt b/targets/wasm-tacle/sequential/audiobeam/license.txt new file mode 100755 index 0000000..7029925 --- /dev/null +++ b/targets/wasm-tacle/sequential/audiobeam/license.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/CMakeLists.txt b/targets/wasm-tacle/sequential/cjpeg_transupp/CMakeLists.txt new file mode 100644 index 0000000..9f51fe8 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(cjpeg_transupp) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/cjpeg_transupp.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/cjpeg_transupp.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/ChangeLog.txt b/targets/wasm-tacle/sequential/cjpeg_transupp/ChangeLog.txt new file mode 100755 index 0000000..df4383c --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/ChangeLog.txt @@ -0,0 +1,36 @@ +File: cjpeg_transupp.c +Original provenience: MediaBench II benchmark suite, + http://euler.slu.edu/~fritts/mediabench (mirror) + +2015-11-03: +- Removed original header comment, replaced by TACLeBench header. +- Removed unnecessary preprocessor macros. +- Removed unnecessary code parts, simplified header files and include + relationships. +- Added prefix "cjpeg_transupp" to all global symbols. +- Added explicit forward declarations of functions. +- Replaced initialization code by TACLeBench-compliant initialization code. +- Added new function cjpeg_transupp_return producing a checksum as return value. +- Added new function cjpeg_transupp_main according to TACLeBench guidelines. + cjpeg_transupp_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/README b/targets/wasm-tacle/sequential/cjpeg_transupp/README new file mode 100755 index 0000000..8dba954 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/README @@ -0,0 +1,417 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 6a of 7-Feb-96 +================================= + +This distribution contains the sixth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +Serious users of this software (particularly those incorporating it into +larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to +our electronic mailing list. Mailing list members are notified of updates +and have a chance to participate in technical discussions, etc. + +This software is the work of Tom Lane, Philip Gladstone, Luis Ortiz, Jim +Boucher, Lee Crocker, Julian Minguillon, George Phillips, Davide Rossi, +Ge' Weijers, and other members of the Independent JPEG Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +RELATED SOFTWARE Other stuff you should get. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.doc How to configure and install the IJG software. + usage.doc Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.doc). + wizard.doc Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.doc How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.doc Overview of the JPEG library's internal structure. + filelist.doc Road map of IJG files. + coderules.doc Coding style rules --- please read if you contribute code. + +Please read at least the files install.doc and usage.doc. Useful information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image compression and +decompression. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. JPEG is intended for compressing +"real-world" scenes; line drawings, cartoons and other non-realistic images +are not its strong suit. JPEG is lossy, meaning that the output image is not +exactly identical to the input image. Hence you must not use JPEG if you +have to have identical output bits. However, on typical photographic images, +very good compression levels can be obtained with no visible change, and +remarkably high compression levels are possible if you can tolerate a +low-quality image. For more details, see the references, or just experiment +with various compression settings. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +For legal reasons, we are not distributing code for the arithmetic-coding +variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting +the hierarchical or lossless processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. We have also included +"jpegtran", a utility for lossless transcoding between different JPEG +processes, and "rdjpgcom" and "wrjpgcom", two simple applications for +inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + +Lossless image transformation routines. These routines work on DCT coefficient +arrays and thus do not require any lossy decompression or recompression of the +image. Thanks to Guido Vollbeding for the initial design and code of this +feature. + +Horizontal flipping is done in-place, using a single top-to-bottom pass through +the virtual source array. It will thus be much the fastest option for images +larger than main memory. + +The other routines require a set of destination virtual arrays, so they need +twice as much memory as jpegtran normally does. The destination arrays are +always written in normal scan order (top to bottom) because the virtual array +manager expects this. The source arrays will be scanned in the corresponding +order, which means multiple passes through the source arrays for most of the +transforms. That could result in much thrashing if the image is larger than main +memory. + +Some notes about the operating environment of the individual transform routines: +1. Both the source and destination virtual arrays are allocated from the source + JPEG object, and therefore should be manipulated by calling the source's + memory manager. +2. The destination's component count should be used. It may be smaller than the + source's when forcing to grayscale. +3. Likewise the destination's sampling factors should be used. When forcing to + grayscale the destination's sampling factors will be all 1, and we may as + well take that as the effective iMCU size. +4. When "trim" is in effect, the destination's dimensions will be the trimmed + values but the source's will be untrimmed. +5. All the routines assume that the source and destination buffers are padded + out to a full iMCU boundary. This is true, although for the source buffer it + is an undocumented property of jdcoefct.c. +Notes 2,3,4 boil down to this: generally we should use the destination's +dimensions and ignore the source's. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1996, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The configuration script "configure" was produced with GNU Autoconf. It +is copyright by the Free Software Foundation but is freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +WARNING: Unisys has begun to enforce their patent on LZW compression against +GIF encoders and decoders. You will need a license from Unisys to use the +included rdgif.c or wrgif.c files in a commercial or shareware application. +At this time, Unisys is not enforcing their patent against freeware, so +distribution of this package remains legal. However, we intend to remove +GIF support from the IJG package as soon as a suitable replacement format +becomes reasonably popular. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We highly recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article +is available at ftp.uu.net, graphics/jpeg/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and +IEEE, and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson, published by M&T Books (Redwood +City, CA), 1991, ISBN 1-55851-216-0. This book provides good explanations and +example C code for a multitude of compression methods including JPEG. It is +an excellent source if you are comfortable reading C code but don't know much +about data compression in general. The book's JPEG sample code is far from +industrial-strength, but when you are ready to look at a full implementation, +you've got one here... + +The best full description of JPEG is the textbook "JPEG Still Image Data +Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published +by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. +The book includes the complete text of the ISO JPEG standards (DIS 10918-1 +and draft DIS 10918-2). This is by far the most complete exposition of JPEG +in existence, and we highly recommend it. + +The JPEG standard itself is not available electronically; you must order a +paper copy through ISO or ITU. (Unless you feel a need to own a certified +official copy, we recommend buying the Pennebaker and Mitchell book instead; +it's much cheaper and includes a great deal of useful explanatory material.) +In the USA, copies of the standard may be ordered from ANSI Sales at (212) +642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI +doesn't take credit card orders, but Global does.) It's not cheap: as of +1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% +shipping/handling. The standard is divided into two parts, Part 1 being the +actual specification, while Part 2 covers compliance testing methods. Part 1 +is titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. + +Extensions to the original JPEG standard are defined in JPEG Part 3, a new ISO +document. Part 3 is undergoing ISO balloting and is expected to be approved +by the end of 1995; it will have document numbers ISO/IEC IS 10918-3, ITU-T +T.84. IJG currently does not support any Part 3 extensions. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. A copy of the JFIF spec is available from: + Literature Department + C-Cube Microsystems, Inc. + 1778 McCarthy Blvd. + Milpitas, CA 95035 + phone (408) 944-6300, fax (408) 944-6314 +A PostScript version of this document is available at ftp.uu.net, file +graphics/jpeg/jfif.ps.gz. It can also be obtained by e-mail from the C-Cube +mail server, netlib@c3.pla.ca.us. Send the message "send jfif_ps from jpeg" +to the server to obtain the JFIF document; send the message "help" if you have +trouble. + +The TIFF 6.0 file format specification can be obtained by FTP from sgi.com +(192.48.153.1), file graphics/tiff/TIFF6.ps.Z; or you can order a printed +copy from Aldus Corp. at (206) 628-6593. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from sgi.com or +from ftp.uu.net:/graphics/jpeg/. It is expected that the next revision of +the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. libtiff is available +from sgi.com:/graphics/tiff/. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is ftp.uu.net (Internet +address 192.48.96.9). The most recent released version can always be found +there in directory graphics/jpeg. This particular version will be archived +as graphics/jpeg/jpegsrc.v6a.tar.gz. If you are on the Internet, you +can retrieve files from ftp.uu.net by standard anonymous FTP. If you don't +have FTP access, UUNET's archives are also available via UUCP; contact +help@uunet.uu.net for information on retrieving files that way. + +Numerous Internet sites maintain copies of the UUNET files. However, only +ftp.uu.net is guaranteed to have the latest official version. + +You can also obtain this software in DOS-compatible "zip" archive format from +the SimTel archives (ftp.coast.net:/SimTel/msdos/graphics/), or on CompuServe +in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 "JPEG Tools". +Again, these versions may sometimes lag behind the ftp.uu.net release. + +The JPEG FAQ (Frequently Asked Questions) article is a useful source of +general information about JPEG. It is updated constantly and therefore is +not included in this distribution. The FAQ is posted every two weeks to +Usenet newsgroups comp.graphics.misc, news.answers, and other groups. +You can always obtain the latest version from the news.answers archive at +rtfm.mit.edu. By FTP, fetch /pub/usenet/news.answers/jpeg-faq/part1 and +.../part2. If you don't have FTP, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +RELATED SOFTWARE +================ + +Numerous viewing and image manipulation programs now support JPEG. (Quite a +few of them use this library to do so.) The JPEG FAQ described above lists +some of the more popular free and shareware viewers, and tells where to +obtain them on Internet. + +If you are on a Unix machine, we highly recommend Jef Poskanzer's free +PBMPLUS image software, which provides many useful operations on PPM-format +image files. In particular, it can convert PPM images to and from a wide +range of other formats. You can obtain this package by FTP from ftp.x.org +(contrib/pbmplus*.tar.Z) or ftp.ee.lbl.gov (pbmplus*.tar.Z). There is also +a newer update of this package called NETPBM, available from +wuarchive.wustl.edu under directory /graphics/graphics/packages/NetPBM/. +Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software +is; you are likely to have difficulty making it work on any non-Unix machine. + +A different free JPEG implementation, written by the PVRG group at Stanford, +is available from havefun.stanford.edu in directory pub/jpeg. This program +is designed for research and experimentation rather than production use; +it is slower, harder to use, and less portable than the IJG code, but it +is easier to read and modify. Also, the PVRG code supports lossless JPEG, +which we do not. + + +FILE FORMAT WARS +================ + +Some JPEG programs produce files that are not compatible with our library. +The root of the problem is that the ISO JPEG committee failed to specify a +concrete file format. Some vendors "filled in the blanks" on their own, +creating proprietary formats that no one else could read. (For example, none +of the early commercial JPEG implementations for the Macintosh were able to +exchange compressed files.) + +The file format we have adopted is called JFIF (see REFERENCES). This format +has been agreed to by a number of major commercial JPEG vendors, and it has +become the de facto standard. JFIF is a minimal or "low end" representation. +We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF +Technical Note #2) for "high end" applications that need to record a lot of +additional data about an image. TIFF/JPEG is fairly new and not yet widely +supported, unfortunately. + +The upcoming JPEG Part 3 standard defines a file format called SPIFF. +SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should +be able to read the most common variant of SPIFF. SPIFF has some technical +advantages over JFIF, but its major claim to fame is simply that it is an +official standard rather than an informal one. At this point it is unclear +whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto +standard. IJG intends to support SPIFF once the standard is frozen, but we +have not decided whether it should become our default output format or not. +(In any case, our decoder will remain capable of reading JFIF indefinitely.) + +Various proprietary file formats incorporating JPEG compression also exist. +We have little or no sympathy for the existence of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, open format standards for JPEG files. Don't +use a proprietary file format! + + +TO DO +===== + +In future versions, we are considering supporting some of the upcoming JPEG +Part 3 extensions --- principally, variable quantization and the SPIFF file +format. + +Tuning the software for better behavior at low quality/high compression +settings is also of interest. The current method for scaling the +quantization tables is known not to be very good at low Q values. + +As always, speeding things up is high on our priority list. + +Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/cjpeg_transupp.c b/targets/wasm-tacle/sequential/cjpeg_transupp/cjpeg_transupp.c new file mode 100755 index 0000000..c37ab95 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/cjpeg_transupp.c @@ -0,0 +1,713 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: cjpeg_transupp + + Author: Thomas G. Lane + + Function: This file contains image transformation routines and other utility + code used by the jpegtran sample application. These are NOT part of the core + JPEG library. But we keep these routines separate from jpegtran.c to ease + the task of maintaining jpegtran-like programs that have other user + interfaces. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: cjpeg + + Changes: No major functional changes. + + License: See the accompanying README file. + +*/ + + +/* + Include section +*/ + +#include "jpeglib.h" + + +/* + Forward declaration of functions +*/ + +void cjpeg_transupp_initSeed( void ); +signed char cjpeg_transupp_randomInteger( void ); +void cjpeg_transupp_init( void ); +int cjpeg_transupp_return( void ); +void cjpeg_transupp_do_flip_v( j_compress_ptr ); +void cjpeg_transupp_do_rot_90( j_compress_ptr ); +void cjpeg_transupp_do_rot_180( j_compress_ptr ); +void cjpeg_transupp_do_rot_270( j_compress_ptr ); +void cjpeg_transupp_do_transverse( j_compress_ptr ); +void cjpeg_transupp_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +volatile int cjpeg_transupp_seed; + +signed char cjpeg_transupp_input[ 256 ]; +signed char cjpeg_transupp_input2[ 80 ]; +signed char cjpeg_transupp_input3[ 65 ]; +signed char cjpeg_transupp_input3_2[ 65 ]; +signed char cjpeg_transupp_input4[ 64 ]; +signed char cjpeg_transupp_input5[ 65 ]; +signed char cjpeg_transupp_input5_2[ 65 ]; + +/* Output arrays replace writing of results into a file. */ +signed char cjpeg_transupp_output_data[ 512 ]; +signed char cjpeg_transupp_output_data2[ 512 ]; +signed char cjpeg_transupp_output_data3[ 512 ]; +signed char cjpeg_transupp_output_data4[ 512 ]; +signed char cjpeg_transupp_output_data5[ 512 ]; + +struct jpeg_compress_struct cjpeg_transupp_dstinfo; + + +/* + Initialization- and return-value-related functions +*/ + +void cjpeg_transupp_initSeed( void ) +{ + cjpeg_transupp_seed = 0; +} + + +/* + cjpeg_transupp_RandomInteger generates random integers between -128 and 127. +*/ +signed char cjpeg_transupp_randomInteger( void ) +{ + cjpeg_transupp_seed = ( ( ( cjpeg_transupp_seed * 133 ) + 81 ) % 256 ) - 128; + return ( cjpeg_transupp_seed ); +} + + +void cjpeg_transupp_init( void ) +{ + register int i; + + + cjpeg_transupp_dstinfo.max_h_samp_factor = 2; + cjpeg_transupp_dstinfo.max_v_samp_factor = 2; + cjpeg_transupp_dstinfo.num_components = 3; + + cjpeg_transupp_initSeed(); + + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) + cjpeg_transupp_input[ i ] = cjpeg_transupp_randomInteger(); + + _Pragma( "loopbound min 80 max 80" ) + for ( i = 0; i < 80; i++ ) + cjpeg_transupp_input2[ i ] = cjpeg_transupp_randomInteger(); + + _Pragma( "loopbound min 65 max 65" ) + for ( i = 0; i < 65; i++ ) + cjpeg_transupp_input3[ i ] = cjpeg_transupp_randomInteger(); + + _Pragma( "loopbound min 65 max 65" ) + for ( i = 0; i < 65; i++ ) + cjpeg_transupp_input3_2[ i ] = cjpeg_transupp_randomInteger(); + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < 64; i++ ) + cjpeg_transupp_input4[ i ] = cjpeg_transupp_randomInteger(); + + _Pragma( "loopbound min 65 max 65" ) + for ( i = 0; i < 65; i++ ) + cjpeg_transupp_input5[ i ] = cjpeg_transupp_randomInteger(); + + _Pragma( "loopbound min 65 max 65" ) + for ( i = 0; i < 65; i++ ) + cjpeg_transupp_input5_2[ i ] = cjpeg_transupp_randomInteger(); +} + + +int cjpeg_transupp_return( void ) +{ + int checksum = 0; + unsigned int i; + + + _Pragma( "loopbound min 512 max 512" ) + for ( i = 0; i < 512; i++ ) + checksum += cjpeg_transupp_output_data[ i ]; + + _Pragma( "loopbound min 512 max 512" ) + for ( i = 0; i < 512; i++ ) + checksum += cjpeg_transupp_output_data2[ i ]; + + _Pragma( "loopbound min 512 max 512" ) + for ( i = 0; i < 512; i++ ) + checksum += cjpeg_transupp_output_data3[ i ]; + + _Pragma( "loopbound min 512 max 512" ) + for ( i = 0; i < 512; i++ ) + checksum += cjpeg_transupp_output_data4[ i ]; + + _Pragma( "loopbound min 512 max 512" ) + for ( i = 0; i < 512; i++ ) + checksum += cjpeg_transupp_output_data5[ i ]; + + return ( checksum ); +} + + +/* + Algorithm core functions +*/ + +/* + Vertical flip +*/ +void cjpeg_transupp_do_flip_v( j_compress_ptr dstinfo ) +{ + unsigned int MCU_rows, comp_height, dst_blk_x, dst_blk_y; + int ci, i, j, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + + /* + We output into a separate array because we can't touch different rows of the + source virtual array simultaneously. Otherwise, this is a pretty + straightforward analog of horizontal flip. + Within a DCT block, vertical mirroring is done by changing the signs of + odd-numbered rows. + Partial iMCUs at the bottom edge are copied verbatim. + */ + MCU_rows = dstinfo->image_height / ( dstinfo->max_v_samp_factor * DCTSIZE ); + + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 19; + unsigned int compptr_width_in_blocks = 29; + + _Pragma( "loopbound min 3 max 3" ) + for ( ci = 0; ci < dstinfo->num_components; + ci++, compptr_v_samp_factor = 1, compptr_width_in_blocks = 15 ) { + comp_height = MCU_rows * compptr_v_samp_factor; + + compptr_height_in_blocks = 10; + _Pragma( "loopbound min 2 max 10" ) + for ( dst_blk_y = 0; dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor ) { + + _Pragma( "loopbound min 1 max 8" ) + for ( offset_y = 0; offset_y < compptr_v_samp_factor; offset_y++ ) { + if ( dst_blk_y < comp_height ) { + + /* Row is within the mirrorable area. */ + _Pragma( "loopbound min 15 max 29" ) + for ( dst_blk_x = 0; dst_blk_x < compptr_width_in_blocks; + dst_blk_x++ ) { + + src_ptr = cjpeg_transupp_input; + dst_ptr = cjpeg_transupp_output_data; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < DCTSIZE; i += 2 ) { + + /* copy even row */ + j = 0; + _Pragma( "loopbound min 8 max 8" ) + do { + if ( dst_blk_x < comp_height ) + *dst_ptr++ = *src_ptr++; + j++; + } while ( j < DCTSIZE ); + + /* copy odd row with sign change */ + j = 0; + _Pragma( "loopbound min 8 max 8" ) + do { + if ( dst_blk_x < comp_height ) + *dst_ptr++ = - *src_ptr++; + j++; + } while ( j < DCTSIZE ); + } + } + } + } + } + } +} + + +/* + 90 degree rotation is equivalent to + 1. Transposing the image; + 2. Horizontal mirroring. + These two steps are merged into a single processing routine. +*/ +void cjpeg_transupp_do_rot_90( j_compress_ptr dstinfo ) +{ + unsigned int MCU_cols, comp_width, dst_blk_x, dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + + /* + Because of the horizontal mirror step, we can't process partial iMCUs at the + (output) right edge properly. They just get transposed and not mirrored. + */ + MCU_cols = dstinfo->image_width / ( dstinfo->max_h_samp_factor * DCTSIZE ); + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + + _Pragma( "loopbound min 3 max 3" ) + for ( ci = 0; ci < dstinfo->num_components; + ci++, compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10 ) { + + comp_width = MCU_cols * compptr_h_samp_factor; + + _Pragma( "loopbound min 4 max 15" ) + for ( dst_blk_y = 0; dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor ) { + + offset_y = 0; + _Pragma( "loopbound min 1 max 8" ) + for ( ; offset_y < compptr_v_samp_factor; offset_y++ ) { + dst_blk_x = 0; + _Pragma( "loopbound min 10 max 10" ) + for ( ; dst_blk_x < compptr_width_in_blocks; + dst_blk_x += compptr_h_samp_factor ) { + + offset_x = 0; + _Pragma( "loopbound min 1 max 2" ) + for ( ; offset_x < compptr_h_samp_factor; offset_x++ ) { + + src_ptr = cjpeg_transupp_input2; + + if ( dst_blk_x < comp_width ) { + + /* Block is within the mirrorable area. */ + dst_ptr = cjpeg_transupp_output_data2; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < DCTSIZE; i++ ) { + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + + i++; + + _Pragma( "loopbound min 8 max 8" ) + for ( j = 0; j < DCTSIZE; j++ ) + dst_ptr[ j * DCTSIZE + i ] = -src_ptr[ i * DCTSIZE + j ]; + } + } else { + /* Edge blocks are transposed but not mirrored. */ + dst_ptr = cjpeg_transupp_output_data2; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < DCTSIZE; i++ ) + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) { + if ( dst_blk_y < comp_width ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + } + } + } + } + } + } + } +} + + +/* + 270 degree rotation is equivalent to + 1. Horizontal mirroring; + 2. Transposing the image. + These two steps are merged into a single processing routine. +*/ +void cjpeg_transupp_do_rot_270( j_compress_ptr dstinfo ) +{ + unsigned int MCU_rows, comp_height, dst_blk_x, dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + + /* + Because of the horizontal mirror step, we can't process partial iMCUs at the + (output) bottom edge properly. They just get transposed and not mirrored. + */ + MCU_rows = dstinfo->image_height / ( dstinfo->max_v_samp_factor * DCTSIZE ); + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + _Pragma( "loopbound min 3 max 3" ) + for ( ci = 0; ci < dstinfo->num_components; + ci++, compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10 ) { + + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( "loopbound min 4 max 15" ) + for ( dst_blk_y = 0; dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor ) { + + offset_y = 0; + _Pragma( "loopbound min 1 max 8" ) + for ( ; offset_y < compptr_v_samp_factor; offset_y++ ) { + dst_blk_x = 0; + _Pragma( "loopbound min 10 max 10" ) + for ( ; dst_blk_x < compptr_width_in_blocks; + dst_blk_x += compptr_h_samp_factor ) { + + offset_x = 0; + _Pragma( "loopbound min 1 max 2" ) + for ( ; offset_x < compptr_h_samp_factor; offset_x++ ) { + + dst_ptr = cjpeg_transupp_output_data3; + + if ( dst_blk_y < comp_height ) { + + /* Block is within the mirrorable area. */ + src_ptr = cjpeg_transupp_input3; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < DCTSIZE; i++ ) { + j = 0; + _Pragma( "loopbound min 4 max 4" ) + for ( ; j < DCTSIZE; j++ ) { + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + j++; + dst_ptr[ j * DCTSIZE + i ] = -src_ptr[ i * DCTSIZE + j ]; + } + } + } else { + + /* Edge blocks are transposed but not mirrored. */ + src_ptr = cjpeg_transupp_input3_2; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < DCTSIZE; i++ ) + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) { + if ( dst_blk_y < comp_height ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + } + } + } + } + } + } + } +} + + +/* + 180 degree rotation is equivalent to + 1. Vertical mirroring; + 2. Horizontal mirroring. + These two steps are merged into a single processing routine. +*/ +void cjpeg_transupp_do_rot_180( j_compress_ptr dstinfo ) +{ + unsigned int MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, + dst_blk_y; + int ci, i, j, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_width_in_blocks = 29; + unsigned int compptr_height_in_blocks = 19; + + + MCU_cols = dstinfo->image_width / ( dstinfo->max_h_samp_factor * DCTSIZE ); + MCU_rows = dstinfo->image_height / ( dstinfo->max_v_samp_factor * DCTSIZE ); + + _Pragma( "loopbound min 3 max 3" ) + for ( ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_width_in_blocks = 15, compptr_height_in_blocks = 10 ) { + + comp_width = MCU_cols * compptr_h_samp_factor; + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( "loopbound min 3 max 10" ) + for ( dst_blk_y = 0; dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor ) { + offset_y = 0; + _Pragma( "loopbound min 1 max 8" ) + for ( ; offset_y < compptr_v_samp_factor; offset_y++ ) { + if ( dst_blk_y < comp_height ) { + + /* Row is within the mirrorable area. */ + + /* Process the blocks that can be mirrored both ways. */ + _Pragma( "loopbound min 14 max 28" ) + for ( dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++ ) { + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < DCTSIZE; i += 2 ) { + j = 0; + /* For even row, negate every odd column. */ + _Pragma( "loopbound min 4 max 4" ) + for ( ; j < DCTSIZE; j += 2 ) { + if ( dst_blk_x < comp_height ) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = - *src_ptr++; + } + } + + j = 0; + /* For odd row, negate every even column. */ + _Pragma( "loopbound min 4 max 4" ) + for ( ; j < DCTSIZE; j += 2 ) { + if ( dst_blk_x < comp_height ) { + *dst_ptr++ = - *src_ptr++; + *dst_ptr++ = *src_ptr++; + } + } + } + } + + /* Any remaining right-edge blocks are only mirrored vertically. */ + _Pragma( "loopbound min 1 max 1" ) + for ( ; dst_blk_x < compptr_width_in_blocks; dst_blk_x++ ) { + + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < DCTSIZE; i += 2 ) { + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) + *dst_ptr++ = *src_ptr++; + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) + *dst_ptr++ = - *src_ptr++; + } + } + } else { + + /* Remaining rows are just mirrored horizontally. */ + dst_blk_x = 0; + /* Process the blocks that can be mirrored. */ + _Pragma( "loopbound min 14 max 14" ) + do { + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + + i = 0; + _Pragma( "loopbound min 32 max 32" ) + while ( i < DCTSIZE2 ) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = - *src_ptr++; + i += 2; + dst_ptr += 0; + } + dst_blk_x++; + dst_ptr += 0; + } while ( dst_blk_x < comp_width ); + + /* Any remaining right-edge blocks are only copied. */ + _Pragma( "loopbound min 1 max 1" ) + for ( ; dst_blk_x < compptr_width_in_blocks; dst_blk_x++ ) { + + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + _Pragma( "loopbound min 1 max 1" ) + do { + *dst_ptr++ = *src_ptr++; + i++; + } while ( i < DCTSIZE2 ); + } + } + } + } + } +} + + +/* + Transverse transpose is equivalent to + 1. 180 degree rotation; + 2. Transposition; + or + 1. Horizontal mirroring; + 2. Transposition; + 3. Horizontal mirroring. + These steps are merged into a single processing routine. +*/ +void cjpeg_transupp_do_transverse( j_compress_ptr dstinfo ) +{ + unsigned int MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, + dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + + MCU_cols = dstinfo->image_width / ( dstinfo->max_h_samp_factor * DCTSIZE ); + MCU_rows = dstinfo->image_height / ( dstinfo->max_v_samp_factor * DCTSIZE ); + + _Pragma( "loopbound min 3 max 3" ) + for ( ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10 ) { + + comp_width = MCU_cols * compptr_h_samp_factor; + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( "loopbound min 4 max 15" ) + for ( dst_blk_y = 0; dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor ) { + offset_y = 0; + _Pragma( "loopbound min 1 max 8" ) + do { + dst_blk_x = 0; + _Pragma( "loopbound min 5 max 10" ) + do { + offset_x = 0; + _Pragma( "loopbound min 1 max 2" ) + for ( ; offset_x < compptr_h_samp_factor; offset_x++ ) { + + if ( dst_blk_y < comp_height ) { + src_ptr = cjpeg_transupp_input5; + + if ( dst_blk_x < comp_width ) { + /* Block is within the mirrorable area. */ + dst_ptr = cjpeg_transupp_output_data5; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < DCTSIZE; i++ ) { + j = 0; + _Pragma( "loopbound min 4 max 4" ) + for ( ; j < DCTSIZE; j++ ) { + if ( dst_blk_y < comp_width ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + j++; + dst_ptr[ j * DCTSIZE + i ] = -src_ptr[ i * DCTSIZE + j ]; + } + i++; + _Pragma( "loopbound min 4 max 4" ) + for ( j = 0; j < DCTSIZE; j++ ) { + if ( dst_blk_y < comp_width ) + dst_ptr[ j * DCTSIZE + i ] = -src_ptr[ i * DCTSIZE + j ]; + j++; + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + } + } + } else { + /* Right-edge blocks are mirrored in y only */ + dst_ptr = cjpeg_transupp_output_data5; + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < DCTSIZE; i++ ) { + j = 0; + _Pragma( "loopbound min 4 max 4" ) + for ( ; j < DCTSIZE; j++ ) { + if ( dst_blk_y < comp_width ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + j++; + dst_ptr[ j * DCTSIZE + i ] = -src_ptr[ i * DCTSIZE + j ]; + } + } + } + } else { + src_ptr = cjpeg_transupp_input5_2; + + if ( dst_blk_x < comp_width ) { + /* Bottom-edge blocks are mirrored in x only */ + dst_ptr = cjpeg_transupp_output_data5; + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0; i < DCTSIZE; i++ ) { + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + i++; + _Pragma( "loopbound min 8 max 8" ) + for ( j = 0; j < DCTSIZE; j++ ) + dst_ptr[ j * DCTSIZE + i ] = -src_ptr[ i * DCTSIZE + j ]; + } + } else { + /* At lower right corner, just transpose, no mirroring */ + dst_ptr = cjpeg_transupp_output_data5; + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < DCTSIZE; i++ ) { + j = 0; + _Pragma( "loopbound min 8 max 8" ) + for ( ; j < DCTSIZE; j++ ) + dst_ptr[ j * DCTSIZE + i ] = src_ptr[ i * DCTSIZE + j ]; + } + } + } + dst_blk_x += compptr_h_samp_factor; + } + } while ( dst_blk_x < compptr_width_in_blocks ); + offset_y++; + } while ( offset_y < compptr_v_samp_factor ); + } + } +} + + +/* + Main functions +*/ + +void _Pragma ( "entrypoint" ) cjpeg_transupp_main( void ) +{ + cjpeg_transupp_dstinfo.image_width = 227; + cjpeg_transupp_dstinfo.image_height = 149; + + cjpeg_transupp_do_flip_v( &cjpeg_transupp_dstinfo ); + + cjpeg_transupp_dstinfo.image_width = 149; + cjpeg_transupp_dstinfo.image_height = 227; + + cjpeg_transupp_do_rot_90( &cjpeg_transupp_dstinfo ); + cjpeg_transupp_do_rot_270( &cjpeg_transupp_dstinfo ); + + cjpeg_transupp_dstinfo.image_width = 227; + cjpeg_transupp_dstinfo.image_height = 149; + + cjpeg_transupp_do_rot_180( &cjpeg_transupp_dstinfo ); + + cjpeg_transupp_dstinfo.image_width = 149; + cjpeg_transupp_dstinfo.image_height = 227; + + cjpeg_transupp_do_transverse( &cjpeg_transupp_dstinfo ); +} + + +int main( void ) +{ + cjpeg_transupp_init(); + cjpeg_transupp_main(); + + return ( cjpeg_transupp_return() - 1624 != 0 ); +} diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/generated/default/cjpeg_transupp.wasm b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/default/cjpeg_transupp.wasm new file mode 100755 index 0000000000000000000000000000000000000000..de36f52e8294fa72c0a818519751c3e07c536d42 GIT binary patch literal 17572 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 / (dstinfo->max_v_samp_factor * DCTSIZE); + + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 19; + unsigned int compptr_width_in_blocks = 29; + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; + ci++, compptr_v_samp_factor = 1, compptr_width_in_blocks = 15) { + comp_height = MCU_rows * compptr_v_samp_factor; + + compptr_height_in_blocks = 10; + _Pragma( + "loopbound min 2 max 10") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + + __pragma_loopbound(1, 8); + for (offset_y = 0; offset_y < compptr_v_samp_factor; offset_y++) { + if (dst_blk_y < comp_height) { + + /* Row is within the mirrorable area. */ + _Pragma( + "loopbound min 15 max 29") for (dst_blk_x = 0; + dst_blk_x < + compptr_width_in_blocks; + dst_blk_x++) { + + src_ptr = cjpeg_transupp_input; + dst_ptr = cjpeg_transupp_output_data; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i += 2) { + + /* copy even row */ + j = 0; + __pragma_loopbound(8, 8); + do { + if (dst_blk_x < comp_height) + *dst_ptr++ = *src_ptr++; + j++; + } while (j < DCTSIZE); + + /* copy odd row with sign change */ + j = 0; + __pragma_loopbound(8, 8); + do { + if (dst_blk_x < comp_height) + *dst_ptr++ = -*src_ptr++; + j++; + } while (j < DCTSIZE); + } + } + } + } + } + } +} + +/* + 90 degree rotation is equivalent to + 1. Transposing the image; + 2. Horizontal mirroring. + These two steps are merged into a single processing routine. +*/ +void +cjpeg_transupp_do_rot_90(j_compress_ptr dstinfo) { + unsigned int MCU_cols, comp_width, dst_blk_x, dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + /* + Because of the horizontal mirror step, we can't process partial iMCUs at + the (output) right edge properly. They just get transposed and not + mirrored. + */ + MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10) { + + comp_width = MCU_cols * compptr_h_samp_factor; + + _Pragma( + "loopbound min 4 max 15") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + + offset_y = 0; + __pragma_loopbound(1, 8); + for (; offset_y < compptr_v_samp_factor; offset_y++) { + dst_blk_x = 0; + __pragma_loopbound(10, 10); + for (; dst_blk_x < compptr_width_in_blocks; + dst_blk_x += compptr_h_samp_factor) { + + offset_x = 0; + __pragma_loopbound(1, 2); + for (; offset_x < compptr_h_samp_factor; offset_x++) { + + src_ptr = cjpeg_transupp_input2; + + if (dst_blk_x < comp_width) { + + /* Block is within the mirrorable area. */ + dst_ptr = cjpeg_transupp_output_data2; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + __pragma_loopbound(8, 8); + for (; j < DCTSIZE; j++) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + + i++; + + __pragma_loopbound(8, 8); + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } else { + /* Edge blocks are transposed but not mirrored. */ + dst_ptr = cjpeg_transupp_output_data2; + + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) + j = 0; + __pragma_loopbound(8, 8); + for (; j < DCTSIZE; j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } + } + } + } + } +} + +/* + 270 degree rotation is equivalent to + 1. Horizontal mirroring; + 2. Transposing the image. + These two steps are merged into a single processing routine. +*/ +void +cjpeg_transupp_do_rot_270(j_compress_ptr dstinfo) { + unsigned int MCU_rows, comp_height, dst_blk_x, dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + /* + Because of the horizontal mirror step, we can't process partial iMCUs at + the (output) bottom edge properly. They just get transposed and not + mirrored. + */ + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10) { + + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( + "loopbound min 4 max 15") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + + offset_y = 0; + __pragma_loopbound(1, 8); + for (; offset_y < compptr_v_samp_factor; offset_y++) { + dst_blk_x = 0; + __pragma_loopbound(10, 10); + for (; dst_blk_x < compptr_width_in_blocks; + dst_blk_x += compptr_h_samp_factor) { + + offset_x = 0; + __pragma_loopbound(1, 2); + for (; offset_x < compptr_h_samp_factor; offset_x++) { + + dst_ptr = cjpeg_transupp_output_data3; + + if (dst_blk_y < comp_height) { + + /* Block is within the mirrorable area. */ + src_ptr = cjpeg_transupp_input3; + + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + __pragma_loopbound(4, 4); + for (; j < DCTSIZE; j++) { + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } + } else { + + /* Edge blocks are transposed but not mirrored. */ + src_ptr = cjpeg_transupp_input3_2; + + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) + j = 0; + __pragma_loopbound(8, 8); + for (; j < DCTSIZE; j++) { + if (dst_blk_y < comp_height) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } + } + } + } + } +} + +/* + 180 degree rotation is equivalent to + 1. Vertical mirroring; + 2. Horizontal mirroring. + These two steps are merged into a single processing routine. +*/ +void +cjpeg_transupp_do_rot_180(j_compress_ptr dstinfo) { + unsigned int MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, + dst_blk_y; + int ci, i, j, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_width_in_blocks = 29; + unsigned int compptr_height_in_blocks = 19; + + MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_width_in_blocks = 15, compptr_height_in_blocks = 10) { + + comp_width = MCU_cols * compptr_h_samp_factor; + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( + "loopbound min 3 max 10") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + offset_y = 0; + __pragma_loopbound(1, 8); + for (; offset_y < compptr_v_samp_factor; offset_y++) { + if (dst_blk_y < comp_height) { + + /* Row is within the mirrorable area. */ + + /* Process the blocks that can be mirrored both ways. */ + __pragma_loopbound(14, 28); + for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) { + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i += 2) { + j = 0; + /* For even row, negate every odd column. */ + __pragma_loopbound(4, 4); + for (; j < DCTSIZE; j += 2) { + if (dst_blk_x < comp_height) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = -*src_ptr++; + } + } + + j = 0; + /* For odd row, negate every even column. */ + __pragma_loopbound(4, 4); + for (; j < DCTSIZE; j += 2) { + if (dst_blk_x < comp_height) { + *dst_ptr++ = -*src_ptr++; + *dst_ptr++ = *src_ptr++; + } + } + } + } + + /* Any remaining right-edge blocks are only mirrored + * vertically. */ + _Pragma( + "loopbound min 1 max 1") for (; dst_blk_x < + compptr_width_in_blocks; + dst_blk_x++) { + + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i += 2) { + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < DCTSIZE; + j++) *dst_ptr++ = + *src_ptr++; + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < DCTSIZE; + j++) *dst_ptr++ = + -*src_ptr++; + } + } + } else { + + /* Remaining rows are just mirrored horizontally. */ + dst_blk_x = 0; + /* Process the blocks that can be mirrored. */ + __pragma_loopbound(14, 14); + do { + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + + i = 0; + __pragma_loopbound(32, 32); + while (i < DCTSIZE2) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = -*src_ptr++; + i += 2; + dst_ptr += 0; + } + dst_blk_x++; + dst_ptr += 0; + } while (dst_blk_x < comp_width); + + /* Any remaining right-edge blocks are only copied. */ + _Pragma( + "loopbound min 1 max 1") for (; dst_blk_x < + compptr_width_in_blocks; + dst_blk_x++) { + + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + __pragma_loopbound(1, 1); + do { + *dst_ptr++ = *src_ptr++; + i++; + } while (i < DCTSIZE2); + } + } + } + } + } +} + +/* + Transverse transpose is equivalent to + 1. 180 degree rotation; + 2. Transposition; + or + 1. Horizontal mirroring; + 2. Transposition; + 3. Horizontal mirroring. + These steps are merged into a single processing routine. +*/ +void +cjpeg_transupp_do_transverse(j_compress_ptr dstinfo) { + unsigned int MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, + dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10) { + + comp_width = MCU_cols * compptr_h_samp_factor; + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( + "loopbound min 4 max 15") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + offset_y = 0; + __pragma_loopbound(1, 8); + do { + dst_blk_x = 0; + __pragma_loopbound(5, 10); + do { + offset_x = 0; + __pragma_loopbound(1, 2); + for (; offset_x < compptr_h_samp_factor; offset_x++) { + + if (dst_blk_y < comp_height) { + src_ptr = cjpeg_transupp_input5; + + if (dst_blk_x < comp_width) { + /* Block is within the mirrorable area. */ + dst_ptr = cjpeg_transupp_output_data5; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 4 max 4") for (; j < + DCTSIZE; + j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + i++; + _Pragma( + "loopbound min 4 max 4") for (j = 0; + j < + DCTSIZE; + j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } else { + /* Right-edge blocks are mirrored in y only */ + dst_ptr = cjpeg_transupp_output_data5; + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 4 max 4") for (; j < + DCTSIZE; + j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } + } + } else { + src_ptr = cjpeg_transupp_input5_2; + + if (dst_blk_x < comp_width) { + /* Bottom-edge blocks are mirrored in x only */ + dst_ptr = cjpeg_transupp_output_data5; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < + DCTSIZE; + j++) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + i++; + _Pragma( + "loopbound min 8 max 8") for (j = 0; + j < + DCTSIZE; + j++) + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } else { + /* At lower right corner, just transpose, no + * mirroring */ + dst_ptr = cjpeg_transupp_output_data5; + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < + DCTSIZE; + j++) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } + dst_blk_x += compptr_h_samp_factor; + } + } while (dst_blk_x < compptr_width_in_blocks); + offset_y++; + } while (offset_y < compptr_v_samp_factor); + } + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_transupp_main(void) { + cjpeg_transupp_dstinfo.image_width = 227; + cjpeg_transupp_dstinfo.image_height = 149; + + cjpeg_transupp_do_flip_v(&cjpeg_transupp_dstinfo); + + cjpeg_transupp_dstinfo.image_width = 149; + cjpeg_transupp_dstinfo.image_height = 227; + + cjpeg_transupp_do_rot_90(&cjpeg_transupp_dstinfo); + cjpeg_transupp_do_rot_270(&cjpeg_transupp_dstinfo); + + cjpeg_transupp_dstinfo.image_width = 227; + cjpeg_transupp_dstinfo.image_height = 149; + + cjpeg_transupp_do_rot_180(&cjpeg_transupp_dstinfo); + + cjpeg_transupp_dstinfo.image_width = 149; + cjpeg_transupp_dstinfo.image_height = 227; + + cjpeg_transupp_do_transverse(&cjpeg_transupp_dstinfo); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cjpeg_transupp_init(); + cjpeg_transupp_main(); + + return (cjpeg_transupp_return() - 1624 != 0); +} diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/default/jpeglib.h b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/default/jpeglib.h new file mode 100644 index 0000000..eedb124 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/default/jpeglib.h @@ -0,0 +1,743 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: jpeglib + + Author: Thomas G. Lane + + Function: This file defines the application interface for the JPEG library. + Most applications using the library need only include this file, and perhaps + jerror.h if they want to know the exact error codes. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: cjpeg + + Changes: No major functional changes. + + License: See the accompanying README file. + +*/ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + Various constants determining the sizes of things. + All of these are specified by the JPEG standard, so don't change them if you + want to be compatible. +*/ + +/* The basic DCT block is 8x8 samples */ +#define DCTSIZE 8 + +/* DCTSIZE squared; # of elements in a block */ +#define DCTSIZE2 64 + +/* + Data structures for images (arrays of samples and of DCT coefficients). + On 80x86 machines, the image arrays are too big for near pointers, but the + pointer arrays can fit in near memory. +*/ + +/* ptr to one image row of pixel samples. */ +typedef unsigned char *JSAMPROW; + +/* ptr to some rows (a 2-D sample array) */ +typedef JSAMPROW *JSAMPARRAY; + +/* one block of coefficients */ +typedef signed char JBLOCK[DCTSIZE2]; + +/* pointer to one row of coefficient blocks */ +typedef JBLOCK *JBLOCKROW; + +/* a 2-D array of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; + +/* useful in a couple of places */ +typedef signed char *JCOEFPTR; + +/* + DCT coefficient quantization tables. +*/ + +typedef struct { + /* quantization step for each coefficient */ + /* + This array gives the coefficient quantizers in natural array order (not + the zigzag order in which they are stored in a JPEG DQT marker). CAUTION: + IJG versions prior to v6a kept this array in zigzag order. + */ + unsigned short quantval[DCTSIZE2]; + + /* 1 when table has been output */ + /* + This field is used only during compression. It's initialized 0 when the + table is created, and set 1 when it's been output to the file. You could + suppress output of a table by setting this to 1. (See jpeg_suppress_tables + for an example.) + */ + int sent_table; +} JQUANT_TBL; + +/* + Huffman coding tables. +*/ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + + /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + unsigned char bits[17]; + + /* The symbols, in order of incr code length */ + /* + This field is used only during compression. It's initialized 0 when the + table is created, and set 1 when it's been output to the file. You could + suppress output of a table by setting this to 1. (See jpeg_suppress_tables + for an example.) + */ + unsigned char huffval[256]; + + /* 1 when table has been output */ + int sent_table; +} JHUFF_TBL; + +/* + Basic info about one component (color channel). +*/ + +typedef struct { + /* + These values are fixed over the whole image. For compression, they must be + supplied by parameter setup; for decompression, they are read from the SOF + marker. + */ + + /* identifier for this component (0..255) */ + int component_id; + + /* its index in SOF or cinfo->comp_info[] */ + int component_index; + + /* horizontal sampling factor (1..4) */ + int h_samp_factor; + + /* vertical sampling factor (1..4) */ + int v_samp_factor; + + /* quantization table selector (0..3) */ + int quant_tbl_no; + + /* + These values may vary between scans. For compression, they must be + supplied by parameter setup; for decompression, they are read from the SOS + marker. The decompressor output side may not use these variables. + */ + + /* DC entropy table selector (0..3) */ + int dc_tbl_no; + + /* AC entropy table selector (0..3) */ + int ac_tbl_no; + + /* Remaining fields should be treated as private by applications. */ + + /* + These values are computed during compression or decompression startup: + Component's size in DCT blocks. Any dummy blocks added to complete an MCU + are not counted; therefore these values do not depend on whether a scan is + interleaved or not. + */ + unsigned int width_in_blocks; + unsigned int height_in_blocks; + + /* + Size of a DCT block in samples. Always DCTSIZE for compression. For + decompression this is the size of the output from one DCT block, + reflecting any scaling we choose to apply during the IDCT step. Values of + 1,2,4,8 are likely to be supported. Note that different components may + receive different IDCT scalings. + */ + int DCT_scaled_size; + + /* + The downsampled dimensions are the component's actual, unpadded number of + samples at the main buffer (preprocessing/compression interface), thus + downsampled_width = ceil(image_width * Hi/Hmax) and similarly for height. + For decompression, IDCT scaling is included, so + downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + + /* actual width in samples */ + unsigned int downsampled_width; + + /* actual height in samples */ + unsigned int downsampled_height; + + /* + This flag is used only for decompression. In cases where some of the + components will be ignored (eg grayscale output from YCbCr image), we can + skip most computations for the unused components. + */ + + /* do we need the value of this component? */ + int component_needed; + + /* + These values are computed before starting a scan of the component. The + decompressor output side may not use these variables. + */ + + /* number of blocks per MCU, horizontally */ + int MCU_width; + + /* number of blocks per MCU, vertically */ + int MCU_height; + + /* MCU_width * MCU_height */ + int MCU_blocks; + + /* MCU width in samples, MCU_width*DCT_scaled_size */ + int MCU_sample_width; + + /* # of non-dummy blocks across in last MCU */ + int last_col_width; + + /* # of non-dummy blocks down in last MCU */ + int last_row_height; + + /* + Saved quantization table for component; (void*)0 if none yet saved. See + jdinput.c comments about the need for this information. This field is + currently used only for decompression. + */ + JQUANT_TBL *quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void *dct_table; +} jpeg_component_info; + +/* + The script for encoding a multiple-scan file is an array of these: +*/ + +typedef struct { + /* number of components encoded in this scan */ + int comps_in_scan; + + /* their SOF/comp_info[] indexes */ + int component_index[4]; + + /* progressive JPEG spectral selection parms */ + int Ss, Se; + + /* progressive JPEG successive approx. parms */ + int Ah, Al; +} jpeg_scan_info; + +/* + Known color spaces. +*/ + +typedef enum { + /* error/unspecified */ + JCS_UNKNOWN, + + /* monochrome */ + JCS_GRAYSCALE, + + /* red/green/blue */ + JCS_RGB, + + /* Y/Cb/Cr (also known as YUV) */ + JCS_YCbCr, + + /* C/M/Y/K */ + JCS_CMYK, + + /* Y/Cb/Cr/K */ + JCS_YCCK +} J_COLOR_SPACE; + +/* + DCT/IDCT algorithm options. +*/ + +typedef enum { + /* slow but accurate integer algorithm */ + JDCT_ISLOW, + + /* faster, less accurate integer method */ + JDCT_IFAST, + + /* floating-point: accurate, fast on fast HW */ + JDCT_FLOAT +} J_DCT_METHOD; + +/* + Common fields between JPEG compression and decompression master structs. +*/ + +#define jpeg_common_fields \ + /* Error handler module */ \ + struct jpeg_error_mgr *err; \ + /* Memory manager module */ \ + struct jpeg_memory_mgr *mem; \ + /* Progress monitor, or (void*)0 if none */ \ + struct jpeg_progress_mgr *progress; \ + /* Available for use by application */ \ + void *client_data; \ + /* So common code can tell which is which */ \ + int is_decompressor; \ + /* For checking call sequence validity */ \ + int global_state + +/* + Routines that are to be used by both halves of the library are declared to + receive a pointer to this structure. There are no actual instances of + jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. +*/ + +struct jpeg_common_struct { + /* Fields common to both master struct types */ + jpeg_common_fields; + + /* + Additional fields follow in an actual jpeg_compress_struct or + jpeg_decompress_struct. All three structs must agree on these initial + fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct *j_common_ptr; +typedef struct jpeg_compress_struct *j_compress_ptr; +typedef struct jpeg_decompress_struct *j_decompress_ptr; + +/* + Master record for a compression instance +*/ + +struct jpeg_compress_struct { + /* Fields shared with jpeg_decompress_struct */ + jpeg_common_fields; + + /* Destination for compressed data */ + struct jpeg_destination_mgr *dest; + + /* + Description of source image --- these fields must be filled in by outer + application before starting compression. in_color_space must be correct + before you can even call jpeg_set_defaults(). + */ + + /* input image width */ + unsigned int image_width; + + /* input image height */ + unsigned int image_height; + + /* # of color components in input image */ + int input_components; + + /* colorspace of input image */ + J_COLOR_SPACE in_color_space; + + /* image gamma of input image */ + double input_gamma; + + /* + Compression parameters --- these fields must be set before calling + jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + initialize everything to reasonable defaults, then changing anything the + application specifically wants to change. That way you won't get burnt + when new parameters are added. Also note that there are several helper + routines to simplify changing parameters. + */ + + /* bits of precision in image data */ + int data_precision; + + /* # of color components in JPEG image */ + int num_components; + + /* colorspace of JPEG image */ + J_COLOR_SPACE jpeg_color_space; + + /* comp_info[i] describes component that appears i'th in SOF */ + jpeg_component_info *comp_info; + + /* ptrs to coefficient quantization tables, or (void*)0 if not defined */ + JQUANT_TBL *quant_tbl_ptrs[4]; + + /* ptrs to Huffman coding tables, or (void*)0 if not defined */ + JHUFF_TBL *dc_huff_tbl_ptrs[4]; + JHUFF_TBL *ac_huff_tbl_ptrs[4]; + + /* L values for DC arith-coding tables */ + unsigned char arith_dc_L[16]; + + /* U values for DC arith-coding tables */ + unsigned char arith_dc_U[16]; + + /* Kx values for AC arith-coding tables */ + unsigned char arith_ac_K[16]; + + /* # of entries in scan_info array */ + int num_scans; + + /* + script for multi-scan file, or (void*)0 + The default value of scan_info is (void*)0, which causes a single-scan + sequential JPEG file to be emitted. To create a multi-scan file, set + num_scans and scan_info to point to an array of scan definitions. + */ + const jpeg_scan_info *scan_info; + + /* 1=caller supplies downsampled data */ + int raw_data_in; + + /* 1=arithmetic coding, 0=Huffman */ + int arith_code; + + /* 1=optimize entropy encoding parms */ + int optimize_coding; + + /* 1=first samples are cosited */ + int CCIR601_sampling; + + /* 1..100, or 0 for no input smoothing */ + int smoothing_factor; + + /* DCT algorithm selector */ + J_DCT_METHOD dct_method; + + /* + The restart interval can be specified in absolute MCUs by setting + restart_interval, or in MCU rows by setting restart_in_rows (in which case + the correct restart_interval will be figured for each scan). + */ + + /* MCUs per restart, or 0 for no restart */ + unsigned int restart_interval; + + /* if > 0, MCU rows per restart interval */ + int restart_in_rows; + + /* + Parameters controlling emission of special markers. + */ + + /* should a JFIF marker be written? */ + int write_JFIF_header; + + /* What to write for the JFIF version number */ + unsigned char JFIF_major_version; + unsigned char JFIF_minor_version; + + /* + These three values are not used by the JPEG code, merely copied into the + JFIF APP0 marker. density_unit can be 0 for unknown, 1 for dots/inch, or + 2 for dots/cm. Note that the pixel aspect ratio is defined by + X_density/Y_density even when density_unit=0. + */ + + /* JFIF code for pixel size units */ + unsigned char density_unit; + + /* Horizontal pixel density */ + unsigned short X_density; + + /* Vertical pixel density */ + unsigned short Y_density; + + /* should an Adobe marker be written? */ + int write_Adobe_marker; + + /* + State variable: index of next scanline to be written to + jpeg_write_scanlines(). Application may use this to control its processing + loop, e.g., "while (next_scanline < image_height)". + */ + + /* 0 .. image_height-1 */ + unsigned int next_scanline; + + /* + Remaining fields are known throughout compressor, but generally should not + be touched by a surrounding application. + */ + + /* + These fields are computed during compression startup + */ + + /* 1 if scan script uses progressive mode */ + int progressive_mode; + + /* largest h_samp_factor */ + int max_h_samp_factor; + + /* largest v_samp_factor */ + int max_v_samp_factor; + + /* + # of iMCU rows to be input to coef ctlr + The coefficient controller receives data in units of MCU rows as defined + for fully interleaved scans (whether the JPEG file is interleaved or not). + There are v_samp_factor * DCTSIZE sample rows of each component in an + "iMCU" (interleaved MCU) row. + */ + unsigned int total_iMCU_rows; + + /* + These fields are valid during any one scan. They describe the components + and MCUs actually appearing in the scan. + */ + + /* # of JPEG components in this scan */ + int comps_in_scan; + + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + jpeg_component_info *cur_comp_info[4]; + + /* # of MCUs across the image */ + unsigned int MCUs_per_row; + + /* # of MCU rows in the image */ + unsigned int MCU_rows_in_scan; + + /* # of DCT blocks per MCU */ + int blocks_in_MCU; + + /* + MCU_membership[i] is index in cur_comp_info of component owning i'th block + in an MCU + */ + int MCU_membership[10]; + + /* progressive JPEG parameters for scan */ + int Ss, Se, Ah, Al; + + /* + Links to compression subobjects (methods and private variables of + modules) + */ + + struct jpeg_comp_master *master; + struct jpeg_c_main_controller *main; + struct jpeg_c_prep_controller *prep; + struct jpeg_c_coef_controller *coef; + struct jpeg_marker_writer *marker; + struct jpeg_color_converter *cconvert; + struct jpeg_downsampler *downsample; + struct jpeg_forward_dct *fdct; + struct jpeg_entropy_encoder *entropy; + + /* workspace for jpeg_simple_progression */ + jpeg_scan_info *script_space; + + int script_space_size; +}; + +/* + "Object" declarations for JPEG modules that may be supplied or called directly + by the surrounding application. As with all objects in the JPEG library, these + structs only define the publicly visible methods and state variables of a + module. Additional private fields may exist after the public ones. +*/ + +/* + Error handler object +*/ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + void (*error_exit)(j_common_ptr cinfo); + + /* Conditionally emit a trace or warning message */ + void (*emit_message)(j_common_ptr cinfo, int msg_level); + + /* Routine that actually outputs a trace or error message */ + void (*output_message)(j_common_ptr cinfo); + + /* Format a message string for the most recent JPEG error or message */ + void (*format_message)(j_common_ptr cinfo, char *buffer); + + /* Reset error state variables at start of a new image */ + void (*reset_error_mgr)(j_common_ptr cinfo); + + /* + The message ID code and any parameters are saved here. A message can have + one string parameter or up to 8 int parameters. + */ + int msg_code; + + union { + int i[8]; + char s[80]; + } msg_parm; + + /* + Standard state variables for error facility + */ + + /* max msg_level that will be displayed */ + int trace_level; + + /* + For recoverable corrupt-data errors, we emit a warning message, but keep + going unless emit_message chooses to abort. emit_message should count + warnings in num_warnings. The surrounding application can check for bad + data by seeing if num_warnings is nonzero at the end of processing. + */ + + /* number of corrupt-data warnings */ + long num_warnings; + + /* + These fields point to the table(s) of error message strings. An + application can change the table pointer to switch to a different message + list (typically, to change the language in which errors are reported). + Some applications may wish to add additional error codes that will be + handled by the JPEG library error mechanism; the second table pointer is + used for this purpose. + + First table includes all errors generated by JPEG library itself. Error + code 0 is reserved for a "no such error string" message. + */ + + /* Library errors */ + const char *const *jpeg_message_table; + + /* Table contains strings 0..last_jpeg_message */ + int last_jpeg_message; + + /* + Second table can be added by application (see cjpeg/djpeg for example). It + contains strings numbered first_addon_message..last_addon_message. + */ + + /* Non-library errors */ + const char *const *addon_message_table; + + /* code for first string in addon table */ + int first_addon_message; + + /* code for last string in addon table */ + int last_addon_message; +}; + +/* + Progress monitor object +*/ + +struct jpeg_progress_mgr { + void (*progress_monitor)(j_common_ptr cinfo); + + /* work units completed in this pass */ + long pass_counter; + + /* total number of work units in this pass */ + long pass_limit; + + /* passes completed so far */ + int completed_passes; + + /* total number of passes expected */ + int total_passes; +}; + +/* + Data destination object for compression +*/ + +struct jpeg_destination_mgr { + /* => next byte to write in buffer */ + unsigned char *next_output_byte; + + /* # of byte spaces remaining in buffer */ + long unsigned int free_in_buffer; + + void (*init_destination)(j_compress_ptr cinfo); + int (*empty_output_buffer)(j_compress_ptr cinfo); + void (*term_destination)(j_compress_ptr cinfo); +}; + +/* + Memory manager object. + Allocates "small" objects (a few K total), "large" objects (tens of K), and + "really big" objects (virtual arrays with backing store if needed). The memory + manager does not allow individual objects to be freed; rather, each created + object is assigned to a pool, and whole pools can be freed at once. This is + faster and more convenient than remembering exactly what to free, especially + where malloc()/free() are not too speedy. + NB: alloc routines never return (void*)0. They exit to error_exit if not + successful. +*/ + +typedef struct jvirt_sarray_control *jvirt_sarray_ptr; +typedef struct jvirt_barray_control *jvirt_barray_ptr; + +struct jpeg_memory_mgr { + /* + Method pointers + */ + void *(*alloc_small)(j_common_ptr cinfo, int pool_id, + long unsigned int sizeofobject); + + void *(*alloc_large)(j_common_ptr cinfo, int pool_id, + long unsigned int sizeofobject); + + JSAMPARRAY (*alloc_sarray)(j_common_ptr cinfo, int pool_id, + unsigned int samplesperrow, + unsigned int numrows); + + JBLOCKARRAY (*alloc_barray)(j_common_ptr cinfo, int pool_id, + unsigned int blocksperrow, + unsigned int numrows); + + jvirt_sarray_ptr (*request_virt_sarray)(j_common_ptr cinfo, int pool_id, + int pre_zero, + unsigned int samplesperrow, + unsigned int numrows, + unsigned int maxaccess); + + jvirt_barray_ptr (*request_virt_barray)(j_common_ptr cinfo, int pool_id, + int pre_zero, + unsigned int blocksperrow, + unsigned int numrows, + unsigned int maxaccess); + + void (*realize_virt_arrays)(j_common_ptr cinfo); + + JSAMPARRAY (*access_virt_sarray)(j_common_ptr cinfo, jvirt_sarray_ptr ptr, + unsigned int start_row, + unsigned int num_rows, int writable); + + JBLOCKARRAY (*access_virt_barray)(j_common_ptr cinfo, jvirt_barray_ptr ptr, + unsigned int start_row, + unsigned int num_rows, int writable); + + void (*free_pool)(j_common_ptr cinfo, int pool_id); + + void (*self_destruct)(j_common_ptr cinfo); + + /* + Limit on memory allocation for this JPEG object. (Note that this is merely + advisory, not a guaranteed maximum; it only affects the space used for + virtual-array buffers.) May be changed by outer application after creating + the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + +#endif /* JPEGLIB_H */ diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/cjpeg_transupp.c b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/cjpeg_transupp.c new file mode 100644 index 0000000..6404bd4 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/cjpeg_transupp.c @@ -0,0 +1,757 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: cjpeg_transupp + + Author: Thomas G. Lane + + Function: This file contains image transformation routines and other utility + code used by the jpegtran sample application. These are NOT part of the core + JPEG library. But we keep these routines separate from jpegtran.c to ease + the task of maintaining jpegtran-like programs that have other user + interfaces. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: cjpeg + + Changes: No major functional changes. + + License: See the accompanying README file. + +*/ + +/* + Include section +*/ + +#include "jpeglib.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void cjpeg_transupp_initSeed(void); +__attribute__((always_inline)) static inline signed char +cjpeg_transupp_randomInteger(void); +__attribute__((always_inline)) static inline void cjpeg_transupp_init(void); +__attribute__((always_inline)) static inline int cjpeg_transupp_return(void); +__attribute__((always_inline)) static inline void + cjpeg_transupp_do_flip_v(j_compress_ptr); +__attribute__((always_inline)) static inline void + cjpeg_transupp_do_rot_90(j_compress_ptr); +__attribute__((always_inline)) static inline void + cjpeg_transupp_do_rot_180(j_compress_ptr); +__attribute__((always_inline)) static inline void + cjpeg_transupp_do_rot_270(j_compress_ptr); +__attribute__((always_inline)) static inline void + cjpeg_transupp_do_transverse(j_compress_ptr); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_transupp_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +volatile int cjpeg_transupp_seed; + +signed char cjpeg_transupp_input[256]; +signed char cjpeg_transupp_input2[80]; +signed char cjpeg_transupp_input3[65]; +signed char cjpeg_transupp_input3_2[65]; +signed char cjpeg_transupp_input4[64]; +signed char cjpeg_transupp_input5[65]; +signed char cjpeg_transupp_input5_2[65]; + +/* Output arrays replace writing of results into a file. */ +signed char cjpeg_transupp_output_data[512]; +signed char cjpeg_transupp_output_data2[512]; +signed char cjpeg_transupp_output_data3[512]; +signed char cjpeg_transupp_output_data4[512]; +signed char cjpeg_transupp_output_data5[512]; + +struct jpeg_compress_struct cjpeg_transupp_dstinfo; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +cjpeg_transupp_initSeed(void) { + cjpeg_transupp_seed = 0; +} + +/* + cjpeg_transupp_RandomInteger generates random integers between -128 and 127. +*/ +__attribute__((always_inline)) static inline signed char +cjpeg_transupp_randomInteger(void) { + cjpeg_transupp_seed = (((cjpeg_transupp_seed * 133) + 81) % 256) - 128; + return (cjpeg_transupp_seed); +} + +__attribute__((always_inline)) static inline void +cjpeg_transupp_init(void) { + register int i; + + cjpeg_transupp_dstinfo.max_h_samp_factor = 2; + cjpeg_transupp_dstinfo.max_v_samp_factor = 2; + cjpeg_transupp_dstinfo.num_components = 3; + + cjpeg_transupp_initSeed(); + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + cjpeg_transupp_input[i] = cjpeg_transupp_randomInteger(); + + __pragma_loopbound(80, 80); + for (i = 0; i < 80; i++) + cjpeg_transupp_input2[i] = cjpeg_transupp_randomInteger(); + + __pragma_loopbound(65, 65); + for (i = 0; i < 65; i++) + cjpeg_transupp_input3[i] = cjpeg_transupp_randomInteger(); + + __pragma_loopbound(65, 65); + for (i = 0; i < 65; i++) + cjpeg_transupp_input3_2[i] = cjpeg_transupp_randomInteger(); + + __pragma_loopbound(64, 64); + for (i = 0; i < 64; i++) + cjpeg_transupp_input4[i] = cjpeg_transupp_randomInteger(); + + __pragma_loopbound(65, 65); + for (i = 0; i < 65; i++) + cjpeg_transupp_input5[i] = cjpeg_transupp_randomInteger(); + + __pragma_loopbound(65, 65); + for (i = 0; i < 65; i++) + cjpeg_transupp_input5_2[i] = cjpeg_transupp_randomInteger(); +} + +__attribute__((always_inline)) static inline int +cjpeg_transupp_return(void) { + int checksum = 0; + unsigned int i; + + __pragma_loopbound(512, 512); + for (i = 0; i < 512; i++) + checksum += cjpeg_transupp_output_data[i]; + + __pragma_loopbound(512, 512); + for (i = 0; i < 512; i++) + checksum += cjpeg_transupp_output_data2[i]; + + __pragma_loopbound(512, 512); + for (i = 0; i < 512; i++) + checksum += cjpeg_transupp_output_data3[i]; + + __pragma_loopbound(512, 512); + for (i = 0; i < 512; i++) + checksum += cjpeg_transupp_output_data4[i]; + + __pragma_loopbound(512, 512); + for (i = 0; i < 512; i++) + checksum += cjpeg_transupp_output_data5[i]; + + return (checksum); +} + +/* + Algorithm core functions +*/ + +/* + Vertical flip +*/ +__attribute__((always_inline)) static inline void +cjpeg_transupp_do_flip_v(j_compress_ptr dstinfo) { + unsigned int MCU_rows, comp_height, dst_blk_x, dst_blk_y; + int ci, i, j, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + /* + We output into a separate array because we can't touch different rows of + the source virtual array simultaneously. Otherwise, this is a pretty + straightforward analog of horizontal flip. + Within a DCT block, vertical mirroring is done by changing the signs of + odd-numbered rows. + Partial iMCUs at the bottom edge are copied verbatim. + */ + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 19; + unsigned int compptr_width_in_blocks = 29; + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; + ci++, compptr_v_samp_factor = 1, compptr_width_in_blocks = 15) { + comp_height = MCU_rows * compptr_v_samp_factor; + + compptr_height_in_blocks = 10; + _Pragma( + "loopbound min 2 max 10") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + + __pragma_loopbound(1, 8); + for (offset_y = 0; offset_y < compptr_v_samp_factor; offset_y++) { + if (dst_blk_y < comp_height) { + + /* Row is within the mirrorable area. */ + _Pragma( + "loopbound min 15 max 29") for (dst_blk_x = 0; + dst_blk_x < + compptr_width_in_blocks; + dst_blk_x++) { + + src_ptr = cjpeg_transupp_input; + dst_ptr = cjpeg_transupp_output_data; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i += 2) { + + /* copy even row */ + j = 0; + __pragma_loopbound(8, 8); + do { + if (dst_blk_x < comp_height) + *dst_ptr++ = *src_ptr++; + j++; + } while (j < DCTSIZE); + + /* copy odd row with sign change */ + j = 0; + __pragma_loopbound(8, 8); + do { + if (dst_blk_x < comp_height) + *dst_ptr++ = -*src_ptr++; + j++; + } while (j < DCTSIZE); + } + } + } + } + } + } +} + +/* + 90 degree rotation is equivalent to + 1. Transposing the image; + 2. Horizontal mirroring. + These two steps are merged into a single processing routine. +*/ +__attribute__((always_inline)) static inline void +cjpeg_transupp_do_rot_90(j_compress_ptr dstinfo) { + unsigned int MCU_cols, comp_width, dst_blk_x, dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + /* + Because of the horizontal mirror step, we can't process partial iMCUs at + the (output) right edge properly. They just get transposed and not + mirrored. + */ + MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10) { + + comp_width = MCU_cols * compptr_h_samp_factor; + + _Pragma( + "loopbound min 4 max 15") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + + offset_y = 0; + __pragma_loopbound(1, 8); + for (; offset_y < compptr_v_samp_factor; offset_y++) { + dst_blk_x = 0; + __pragma_loopbound(10, 10); + for (; dst_blk_x < compptr_width_in_blocks; + dst_blk_x += compptr_h_samp_factor) { + + offset_x = 0; + __pragma_loopbound(1, 2); + for (; offset_x < compptr_h_samp_factor; offset_x++) { + + src_ptr = cjpeg_transupp_input2; + + if (dst_blk_x < comp_width) { + + /* Block is within the mirrorable area. */ + dst_ptr = cjpeg_transupp_output_data2; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + __pragma_loopbound(8, 8); + for (; j < DCTSIZE; j++) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + + i++; + + __pragma_loopbound(8, 8); + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } else { + /* Edge blocks are transposed but not mirrored. */ + dst_ptr = cjpeg_transupp_output_data2; + + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) + j = 0; + __pragma_loopbound(8, 8); + for (; j < DCTSIZE; j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } + } + } + } + } +} + +/* + 270 degree rotation is equivalent to + 1. Horizontal mirroring; + 2. Transposing the image. + These two steps are merged into a single processing routine. +*/ +__attribute__((always_inline)) static inline void +cjpeg_transupp_do_rot_270(j_compress_ptr dstinfo) { + unsigned int MCU_rows, comp_height, dst_blk_x, dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + /* + Because of the horizontal mirror step, we can't process partial iMCUs at + the (output) bottom edge properly. They just get transposed and not + mirrored. + */ + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10) { + + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( + "loopbound min 4 max 15") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + + offset_y = 0; + __pragma_loopbound(1, 8); + for (; offset_y < compptr_v_samp_factor; offset_y++) { + dst_blk_x = 0; + __pragma_loopbound(10, 10); + for (; dst_blk_x < compptr_width_in_blocks; + dst_blk_x += compptr_h_samp_factor) { + + offset_x = 0; + __pragma_loopbound(1, 2); + for (; offset_x < compptr_h_samp_factor; offset_x++) { + + dst_ptr = cjpeg_transupp_output_data3; + + if (dst_blk_y < comp_height) { + + /* Block is within the mirrorable area. */ + src_ptr = cjpeg_transupp_input3; + + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + __pragma_loopbound(4, 4); + for (; j < DCTSIZE; j++) { + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } + } else { + + /* Edge blocks are transposed but not mirrored. */ + src_ptr = cjpeg_transupp_input3_2; + + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) + j = 0; + __pragma_loopbound(8, 8); + for (; j < DCTSIZE; j++) { + if (dst_blk_y < comp_height) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } + } + } + } + } +} + +/* + 180 degree rotation is equivalent to + 1. Vertical mirroring; + 2. Horizontal mirroring. + These two steps are merged into a single processing routine. +*/ +__attribute__((always_inline)) static inline void +cjpeg_transupp_do_rot_180(j_compress_ptr dstinfo) { + unsigned int MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, + dst_blk_y; + int ci, i, j, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_width_in_blocks = 29; + unsigned int compptr_height_in_blocks = 19; + + MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_width_in_blocks = 15, compptr_height_in_blocks = 10) { + + comp_width = MCU_cols * compptr_h_samp_factor; + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( + "loopbound min 3 max 10") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + offset_y = 0; + __pragma_loopbound(1, 8); + for (; offset_y < compptr_v_samp_factor; offset_y++) { + if (dst_blk_y < comp_height) { + + /* Row is within the mirrorable area. */ + + /* Process the blocks that can be mirrored both ways. */ + __pragma_loopbound(14, 28); + for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) { + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i += 2) { + j = 0; + /* For even row, negate every odd column. */ + __pragma_loopbound(4, 4); + for (; j < DCTSIZE; j += 2) { + if (dst_blk_x < comp_height) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = -*src_ptr++; + } + } + + j = 0; + /* For odd row, negate every even column. */ + __pragma_loopbound(4, 4); + for (; j < DCTSIZE; j += 2) { + if (dst_blk_x < comp_height) { + *dst_ptr++ = -*src_ptr++; + *dst_ptr++ = *src_ptr++; + } + } + } + } + + /* Any remaining right-edge blocks are only mirrored + * vertically. */ + _Pragma( + "loopbound min 1 max 1") for (; dst_blk_x < + compptr_width_in_blocks; + dst_blk_x++) { + + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i += 2) { + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < DCTSIZE; + j++) *dst_ptr++ = + *src_ptr++; + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < DCTSIZE; + j++) *dst_ptr++ = + -*src_ptr++; + } + } + } else { + + /* Remaining rows are just mirrored horizontally. */ + dst_blk_x = 0; + /* Process the blocks that can be mirrored. */ + __pragma_loopbound(14, 14); + do { + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + + i = 0; + __pragma_loopbound(32, 32); + while (i < DCTSIZE2) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = -*src_ptr++; + i += 2; + dst_ptr += 0; + } + dst_blk_x++; + dst_ptr += 0; + } while (dst_blk_x < comp_width); + + /* Any remaining right-edge blocks are only copied. */ + _Pragma( + "loopbound min 1 max 1") for (; dst_blk_x < + compptr_width_in_blocks; + dst_blk_x++) { + + dst_ptr = cjpeg_transupp_output_data4; + src_ptr = cjpeg_transupp_input4; + __pragma_loopbound(1, 1); + do { + *dst_ptr++ = *src_ptr++; + i++; + } while (i < DCTSIZE2); + } + } + } + } + } +} + +/* + Transverse transpose is equivalent to + 1. 180 degree rotation; + 2. Transposition; + or + 1. Horizontal mirroring; + 2. Transposition; + 3. Horizontal mirroring. + These steps are merged into a single processing routine. +*/ +__attribute__((always_inline)) static inline void +cjpeg_transupp_do_transverse(j_compress_ptr dstinfo) { + unsigned int MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, + dst_blk_y; + int ci, i, j, offset_x, offset_y; + JCOEFPTR src_ptr, dst_ptr; + + int compptr_h_samp_factor = 2; + int compptr_v_samp_factor = 8; + unsigned int compptr_height_in_blocks = 29; + unsigned int compptr_width_in_blocks = 19; + + MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); + MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); + + __pragma_loopbound(3, 3); + for (ci = 0; ci < dstinfo->num_components; ci++, + compptr_h_samp_factor = compptr_v_samp_factor = 1, + compptr_height_in_blocks = 15, compptr_width_in_blocks = 10) { + + comp_width = MCU_cols * compptr_h_samp_factor; + comp_height = MCU_rows * compptr_v_samp_factor; + + _Pragma( + "loopbound min 4 max 15") for (dst_blk_y = 0; + dst_blk_y < compptr_height_in_blocks; + dst_blk_y += compptr_v_samp_factor) { + offset_y = 0; + __pragma_loopbound(1, 8); + do { + dst_blk_x = 0; + __pragma_loopbound(5, 10); + do { + offset_x = 0; + __pragma_loopbound(1, 2); + for (; offset_x < compptr_h_samp_factor; offset_x++) { + + if (dst_blk_y < comp_height) { + src_ptr = cjpeg_transupp_input5; + + if (dst_blk_x < comp_width) { + /* Block is within the mirrorable area. */ + dst_ptr = cjpeg_transupp_output_data5; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 4 max 4") for (; j < + DCTSIZE; + j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + i++; + _Pragma( + "loopbound min 4 max 4") for (j = 0; + j < + DCTSIZE; + j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } else { + /* Right-edge blocks are mirrored in y only */ + dst_ptr = cjpeg_transupp_output_data5; + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 4 max 4") for (; j < + DCTSIZE; + j++) { + if (dst_blk_y < comp_width) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + j++; + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } + } + } else { + src_ptr = cjpeg_transupp_input5_2; + + if (dst_blk_x < comp_width) { + /* Bottom-edge blocks are mirrored in x only */ + dst_ptr = cjpeg_transupp_output_data5; + + __pragma_loopbound(4, 4); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < + DCTSIZE; + j++) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + i++; + _Pragma( + "loopbound min 8 max 8") for (j = 0; + j < + DCTSIZE; + j++) + dst_ptr[j * DCTSIZE + i] = + -src_ptr[i * DCTSIZE + j]; + } + } else { + /* At lower right corner, just transpose, no + * mirroring */ + dst_ptr = cjpeg_transupp_output_data5; + __pragma_loopbound(8, 8); + for (i = 0; i < DCTSIZE; i++) { + j = 0; + _Pragma( + "loopbound min 8 max 8") for (; j < + DCTSIZE; + j++) + dst_ptr[j * DCTSIZE + i] = + src_ptr[i * DCTSIZE + j]; + } + } + } + dst_blk_x += compptr_h_samp_factor; + } + } while (dst_blk_x < compptr_width_in_blocks); + offset_y++; + } while (offset_y < compptr_v_samp_factor); + } + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_transupp_main(void) { + cjpeg_transupp_dstinfo.image_width = 227; + cjpeg_transupp_dstinfo.image_height = 149; + + cjpeg_transupp_do_flip_v(&cjpeg_transupp_dstinfo); + + cjpeg_transupp_dstinfo.image_width = 149; + cjpeg_transupp_dstinfo.image_height = 227; + + cjpeg_transupp_do_rot_90(&cjpeg_transupp_dstinfo); + cjpeg_transupp_do_rot_270(&cjpeg_transupp_dstinfo); + + cjpeg_transupp_dstinfo.image_width = 227; + cjpeg_transupp_dstinfo.image_height = 149; + + cjpeg_transupp_do_rot_180(&cjpeg_transupp_dstinfo); + + cjpeg_transupp_dstinfo.image_width = 149; + cjpeg_transupp_dstinfo.image_height = 227; + + cjpeg_transupp_do_transverse(&cjpeg_transupp_dstinfo); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cjpeg_transupp_init(); + cjpeg_transupp_main(); + + return (cjpeg_transupp_return() - 1624 != 0); +} diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/jpeglib.h b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/jpeglib.h new file mode 100644 index 0000000..eedb124 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/generated/modified_sources/inline/jpeglib.h @@ -0,0 +1,743 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: jpeglib + + Author: Thomas G. Lane + + Function: This file defines the application interface for the JPEG library. + Most applications using the library need only include this file, and perhaps + jerror.h if they want to know the exact error codes. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: cjpeg + + Changes: No major functional changes. + + License: See the accompanying README file. + +*/ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + Various constants determining the sizes of things. + All of these are specified by the JPEG standard, so don't change them if you + want to be compatible. +*/ + +/* The basic DCT block is 8x8 samples */ +#define DCTSIZE 8 + +/* DCTSIZE squared; # of elements in a block */ +#define DCTSIZE2 64 + +/* + Data structures for images (arrays of samples and of DCT coefficients). + On 80x86 machines, the image arrays are too big for near pointers, but the + pointer arrays can fit in near memory. +*/ + +/* ptr to one image row of pixel samples. */ +typedef unsigned char *JSAMPROW; + +/* ptr to some rows (a 2-D sample array) */ +typedef JSAMPROW *JSAMPARRAY; + +/* one block of coefficients */ +typedef signed char JBLOCK[DCTSIZE2]; + +/* pointer to one row of coefficient blocks */ +typedef JBLOCK *JBLOCKROW; + +/* a 2-D array of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; + +/* useful in a couple of places */ +typedef signed char *JCOEFPTR; + +/* + DCT coefficient quantization tables. +*/ + +typedef struct { + /* quantization step for each coefficient */ + /* + This array gives the coefficient quantizers in natural array order (not + the zigzag order in which they are stored in a JPEG DQT marker). CAUTION: + IJG versions prior to v6a kept this array in zigzag order. + */ + unsigned short quantval[DCTSIZE2]; + + /* 1 when table has been output */ + /* + This field is used only during compression. It's initialized 0 when the + table is created, and set 1 when it's been output to the file. You could + suppress output of a table by setting this to 1. (See jpeg_suppress_tables + for an example.) + */ + int sent_table; +} JQUANT_TBL; + +/* + Huffman coding tables. +*/ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + + /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + unsigned char bits[17]; + + /* The symbols, in order of incr code length */ + /* + This field is used only during compression. It's initialized 0 when the + table is created, and set 1 when it's been output to the file. You could + suppress output of a table by setting this to 1. (See jpeg_suppress_tables + for an example.) + */ + unsigned char huffval[256]; + + /* 1 when table has been output */ + int sent_table; +} JHUFF_TBL; + +/* + Basic info about one component (color channel). +*/ + +typedef struct { + /* + These values are fixed over the whole image. For compression, they must be + supplied by parameter setup; for decompression, they are read from the SOF + marker. + */ + + /* identifier for this component (0..255) */ + int component_id; + + /* its index in SOF or cinfo->comp_info[] */ + int component_index; + + /* horizontal sampling factor (1..4) */ + int h_samp_factor; + + /* vertical sampling factor (1..4) */ + int v_samp_factor; + + /* quantization table selector (0..3) */ + int quant_tbl_no; + + /* + These values may vary between scans. For compression, they must be + supplied by parameter setup; for decompression, they are read from the SOS + marker. The decompressor output side may not use these variables. + */ + + /* DC entropy table selector (0..3) */ + int dc_tbl_no; + + /* AC entropy table selector (0..3) */ + int ac_tbl_no; + + /* Remaining fields should be treated as private by applications. */ + + /* + These values are computed during compression or decompression startup: + Component's size in DCT blocks. Any dummy blocks added to complete an MCU + are not counted; therefore these values do not depend on whether a scan is + interleaved or not. + */ + unsigned int width_in_blocks; + unsigned int height_in_blocks; + + /* + Size of a DCT block in samples. Always DCTSIZE for compression. For + decompression this is the size of the output from one DCT block, + reflecting any scaling we choose to apply during the IDCT step. Values of + 1,2,4,8 are likely to be supported. Note that different components may + receive different IDCT scalings. + */ + int DCT_scaled_size; + + /* + The downsampled dimensions are the component's actual, unpadded number of + samples at the main buffer (preprocessing/compression interface), thus + downsampled_width = ceil(image_width * Hi/Hmax) and similarly for height. + For decompression, IDCT scaling is included, so + downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + + /* actual width in samples */ + unsigned int downsampled_width; + + /* actual height in samples */ + unsigned int downsampled_height; + + /* + This flag is used only for decompression. In cases where some of the + components will be ignored (eg grayscale output from YCbCr image), we can + skip most computations for the unused components. + */ + + /* do we need the value of this component? */ + int component_needed; + + /* + These values are computed before starting a scan of the component. The + decompressor output side may not use these variables. + */ + + /* number of blocks per MCU, horizontally */ + int MCU_width; + + /* number of blocks per MCU, vertically */ + int MCU_height; + + /* MCU_width * MCU_height */ + int MCU_blocks; + + /* MCU width in samples, MCU_width*DCT_scaled_size */ + int MCU_sample_width; + + /* # of non-dummy blocks across in last MCU */ + int last_col_width; + + /* # of non-dummy blocks down in last MCU */ + int last_row_height; + + /* + Saved quantization table for component; (void*)0 if none yet saved. See + jdinput.c comments about the need for this information. This field is + currently used only for decompression. + */ + JQUANT_TBL *quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void *dct_table; +} jpeg_component_info; + +/* + The script for encoding a multiple-scan file is an array of these: +*/ + +typedef struct { + /* number of components encoded in this scan */ + int comps_in_scan; + + /* their SOF/comp_info[] indexes */ + int component_index[4]; + + /* progressive JPEG spectral selection parms */ + int Ss, Se; + + /* progressive JPEG successive approx. parms */ + int Ah, Al; +} jpeg_scan_info; + +/* + Known color spaces. +*/ + +typedef enum { + /* error/unspecified */ + JCS_UNKNOWN, + + /* monochrome */ + JCS_GRAYSCALE, + + /* red/green/blue */ + JCS_RGB, + + /* Y/Cb/Cr (also known as YUV) */ + JCS_YCbCr, + + /* C/M/Y/K */ + JCS_CMYK, + + /* Y/Cb/Cr/K */ + JCS_YCCK +} J_COLOR_SPACE; + +/* + DCT/IDCT algorithm options. +*/ + +typedef enum { + /* slow but accurate integer algorithm */ + JDCT_ISLOW, + + /* faster, less accurate integer method */ + JDCT_IFAST, + + /* floating-point: accurate, fast on fast HW */ + JDCT_FLOAT +} J_DCT_METHOD; + +/* + Common fields between JPEG compression and decompression master structs. +*/ + +#define jpeg_common_fields \ + /* Error handler module */ \ + struct jpeg_error_mgr *err; \ + /* Memory manager module */ \ + struct jpeg_memory_mgr *mem; \ + /* Progress monitor, or (void*)0 if none */ \ + struct jpeg_progress_mgr *progress; \ + /* Available for use by application */ \ + void *client_data; \ + /* So common code can tell which is which */ \ + int is_decompressor; \ + /* For checking call sequence validity */ \ + int global_state + +/* + Routines that are to be used by both halves of the library are declared to + receive a pointer to this structure. There are no actual instances of + jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. +*/ + +struct jpeg_common_struct { + /* Fields common to both master struct types */ + jpeg_common_fields; + + /* + Additional fields follow in an actual jpeg_compress_struct or + jpeg_decompress_struct. All three structs must agree on these initial + fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct *j_common_ptr; +typedef struct jpeg_compress_struct *j_compress_ptr; +typedef struct jpeg_decompress_struct *j_decompress_ptr; + +/* + Master record for a compression instance +*/ + +struct jpeg_compress_struct { + /* Fields shared with jpeg_decompress_struct */ + jpeg_common_fields; + + /* Destination for compressed data */ + struct jpeg_destination_mgr *dest; + + /* + Description of source image --- these fields must be filled in by outer + application before starting compression. in_color_space must be correct + before you can even call jpeg_set_defaults(). + */ + + /* input image width */ + unsigned int image_width; + + /* input image height */ + unsigned int image_height; + + /* # of color components in input image */ + int input_components; + + /* colorspace of input image */ + J_COLOR_SPACE in_color_space; + + /* image gamma of input image */ + double input_gamma; + + /* + Compression parameters --- these fields must be set before calling + jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + initialize everything to reasonable defaults, then changing anything the + application specifically wants to change. That way you won't get burnt + when new parameters are added. Also note that there are several helper + routines to simplify changing parameters. + */ + + /* bits of precision in image data */ + int data_precision; + + /* # of color components in JPEG image */ + int num_components; + + /* colorspace of JPEG image */ + J_COLOR_SPACE jpeg_color_space; + + /* comp_info[i] describes component that appears i'th in SOF */ + jpeg_component_info *comp_info; + + /* ptrs to coefficient quantization tables, or (void*)0 if not defined */ + JQUANT_TBL *quant_tbl_ptrs[4]; + + /* ptrs to Huffman coding tables, or (void*)0 if not defined */ + JHUFF_TBL *dc_huff_tbl_ptrs[4]; + JHUFF_TBL *ac_huff_tbl_ptrs[4]; + + /* L values for DC arith-coding tables */ + unsigned char arith_dc_L[16]; + + /* U values for DC arith-coding tables */ + unsigned char arith_dc_U[16]; + + /* Kx values for AC arith-coding tables */ + unsigned char arith_ac_K[16]; + + /* # of entries in scan_info array */ + int num_scans; + + /* + script for multi-scan file, or (void*)0 + The default value of scan_info is (void*)0, which causes a single-scan + sequential JPEG file to be emitted. To create a multi-scan file, set + num_scans and scan_info to point to an array of scan definitions. + */ + const jpeg_scan_info *scan_info; + + /* 1=caller supplies downsampled data */ + int raw_data_in; + + /* 1=arithmetic coding, 0=Huffman */ + int arith_code; + + /* 1=optimize entropy encoding parms */ + int optimize_coding; + + /* 1=first samples are cosited */ + int CCIR601_sampling; + + /* 1..100, or 0 for no input smoothing */ + int smoothing_factor; + + /* DCT algorithm selector */ + J_DCT_METHOD dct_method; + + /* + The restart interval can be specified in absolute MCUs by setting + restart_interval, or in MCU rows by setting restart_in_rows (in which case + the correct restart_interval will be figured for each scan). + */ + + /* MCUs per restart, or 0 for no restart */ + unsigned int restart_interval; + + /* if > 0, MCU rows per restart interval */ + int restart_in_rows; + + /* + Parameters controlling emission of special markers. + */ + + /* should a JFIF marker be written? */ + int write_JFIF_header; + + /* What to write for the JFIF version number */ + unsigned char JFIF_major_version; + unsigned char JFIF_minor_version; + + /* + These three values are not used by the JPEG code, merely copied into the + JFIF APP0 marker. density_unit can be 0 for unknown, 1 for dots/inch, or + 2 for dots/cm. Note that the pixel aspect ratio is defined by + X_density/Y_density even when density_unit=0. + */ + + /* JFIF code for pixel size units */ + unsigned char density_unit; + + /* Horizontal pixel density */ + unsigned short X_density; + + /* Vertical pixel density */ + unsigned short Y_density; + + /* should an Adobe marker be written? */ + int write_Adobe_marker; + + /* + State variable: index of next scanline to be written to + jpeg_write_scanlines(). Application may use this to control its processing + loop, e.g., "while (next_scanline < image_height)". + */ + + /* 0 .. image_height-1 */ + unsigned int next_scanline; + + /* + Remaining fields are known throughout compressor, but generally should not + be touched by a surrounding application. + */ + + /* + These fields are computed during compression startup + */ + + /* 1 if scan script uses progressive mode */ + int progressive_mode; + + /* largest h_samp_factor */ + int max_h_samp_factor; + + /* largest v_samp_factor */ + int max_v_samp_factor; + + /* + # of iMCU rows to be input to coef ctlr + The coefficient controller receives data in units of MCU rows as defined + for fully interleaved scans (whether the JPEG file is interleaved or not). + There are v_samp_factor * DCTSIZE sample rows of each component in an + "iMCU" (interleaved MCU) row. + */ + unsigned int total_iMCU_rows; + + /* + These fields are valid during any one scan. They describe the components + and MCUs actually appearing in the scan. + */ + + /* # of JPEG components in this scan */ + int comps_in_scan; + + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + jpeg_component_info *cur_comp_info[4]; + + /* # of MCUs across the image */ + unsigned int MCUs_per_row; + + /* # of MCU rows in the image */ + unsigned int MCU_rows_in_scan; + + /* # of DCT blocks per MCU */ + int blocks_in_MCU; + + /* + MCU_membership[i] is index in cur_comp_info of component owning i'th block + in an MCU + */ + int MCU_membership[10]; + + /* progressive JPEG parameters for scan */ + int Ss, Se, Ah, Al; + + /* + Links to compression subobjects (methods and private variables of + modules) + */ + + struct jpeg_comp_master *master; + struct jpeg_c_main_controller *main; + struct jpeg_c_prep_controller *prep; + struct jpeg_c_coef_controller *coef; + struct jpeg_marker_writer *marker; + struct jpeg_color_converter *cconvert; + struct jpeg_downsampler *downsample; + struct jpeg_forward_dct *fdct; + struct jpeg_entropy_encoder *entropy; + + /* workspace for jpeg_simple_progression */ + jpeg_scan_info *script_space; + + int script_space_size; +}; + +/* + "Object" declarations for JPEG modules that may be supplied or called directly + by the surrounding application. As with all objects in the JPEG library, these + structs only define the publicly visible methods and state variables of a + module. Additional private fields may exist after the public ones. +*/ + +/* + Error handler object +*/ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + void (*error_exit)(j_common_ptr cinfo); + + /* Conditionally emit a trace or warning message */ + void (*emit_message)(j_common_ptr cinfo, int msg_level); + + /* Routine that actually outputs a trace or error message */ + void (*output_message)(j_common_ptr cinfo); + + /* Format a message string for the most recent JPEG error or message */ + void (*format_message)(j_common_ptr cinfo, char *buffer); + + /* Reset error state variables at start of a new image */ + void (*reset_error_mgr)(j_common_ptr cinfo); + + /* + The message ID code and any parameters are saved here. A message can have + one string parameter or up to 8 int parameters. + */ + int msg_code; + + union { + int i[8]; + char s[80]; + } msg_parm; + + /* + Standard state variables for error facility + */ + + /* max msg_level that will be displayed */ + int trace_level; + + /* + For recoverable corrupt-data errors, we emit a warning message, but keep + going unless emit_message chooses to abort. emit_message should count + warnings in num_warnings. The surrounding application can check for bad + data by seeing if num_warnings is nonzero at the end of processing. + */ + + /* number of corrupt-data warnings */ + long num_warnings; + + /* + These fields point to the table(s) of error message strings. An + application can change the table pointer to switch to a different message + list (typically, to change the language in which errors are reported). + Some applications may wish to add additional error codes that will be + handled by the JPEG library error mechanism; the second table pointer is + used for this purpose. + + First table includes all errors generated by JPEG library itself. Error + code 0 is reserved for a "no such error string" message. + */ + + /* Library errors */ + const char *const *jpeg_message_table; + + /* Table contains strings 0..last_jpeg_message */ + int last_jpeg_message; + + /* + Second table can be added by application (see cjpeg/djpeg for example). It + contains strings numbered first_addon_message..last_addon_message. + */ + + /* Non-library errors */ + const char *const *addon_message_table; + + /* code for first string in addon table */ + int first_addon_message; + + /* code for last string in addon table */ + int last_addon_message; +}; + +/* + Progress monitor object +*/ + +struct jpeg_progress_mgr { + void (*progress_monitor)(j_common_ptr cinfo); + + /* work units completed in this pass */ + long pass_counter; + + /* total number of work units in this pass */ + long pass_limit; + + /* passes completed so far */ + int completed_passes; + + /* total number of passes expected */ + int total_passes; +}; + +/* + Data destination object for compression +*/ + +struct jpeg_destination_mgr { + /* => next byte to write in buffer */ + unsigned char *next_output_byte; + + /* # of byte spaces remaining in buffer */ + long unsigned int free_in_buffer; + + void (*init_destination)(j_compress_ptr cinfo); + int (*empty_output_buffer)(j_compress_ptr cinfo); + void (*term_destination)(j_compress_ptr cinfo); +}; + +/* + Memory manager object. + Allocates "small" objects (a few K total), "large" objects (tens of K), and + "really big" objects (virtual arrays with backing store if needed). The memory + manager does not allow individual objects to be freed; rather, each created + object is assigned to a pool, and whole pools can be freed at once. This is + faster and more convenient than remembering exactly what to free, especially + where malloc()/free() are not too speedy. + NB: alloc routines never return (void*)0. They exit to error_exit if not + successful. +*/ + +typedef struct jvirt_sarray_control *jvirt_sarray_ptr; +typedef struct jvirt_barray_control *jvirt_barray_ptr; + +struct jpeg_memory_mgr { + /* + Method pointers + */ + void *(*alloc_small)(j_common_ptr cinfo, int pool_id, + long unsigned int sizeofobject); + + void *(*alloc_large)(j_common_ptr cinfo, int pool_id, + long unsigned int sizeofobject); + + JSAMPARRAY (*alloc_sarray)(j_common_ptr cinfo, int pool_id, + unsigned int samplesperrow, + unsigned int numrows); + + JBLOCKARRAY (*alloc_barray)(j_common_ptr cinfo, int pool_id, + unsigned int blocksperrow, + unsigned int numrows); + + jvirt_sarray_ptr (*request_virt_sarray)(j_common_ptr cinfo, int pool_id, + int pre_zero, + unsigned int samplesperrow, + unsigned int numrows, + unsigned int maxaccess); + + jvirt_barray_ptr (*request_virt_barray)(j_common_ptr cinfo, int pool_id, + int pre_zero, + unsigned int blocksperrow, + unsigned int numrows, + unsigned int maxaccess); + + void (*realize_virt_arrays)(j_common_ptr cinfo); + + JSAMPARRAY (*access_virt_sarray)(j_common_ptr cinfo, jvirt_sarray_ptr ptr, + unsigned int start_row, + unsigned int num_rows, int writable); + + JBLOCKARRAY (*access_virt_barray)(j_common_ptr cinfo, jvirt_barray_ptr ptr, + unsigned int start_row, + unsigned int num_rows, int writable); + + void (*free_pool)(j_common_ptr cinfo, int pool_id); + + void (*self_destruct)(j_common_ptr cinfo); + + /* + Limit on memory allocation for this JPEG object. (Note that this is merely + advisory, not a guaranteed maximum; it only affects the space used for + virtual-array buffers.) May be changed by outer application after creating + the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + +#endif /* JPEGLIB_H */ diff --git a/targets/wasm-tacle/sequential/cjpeg_transupp/jpeglib.h b/targets/wasm-tacle/sequential/cjpeg_transupp/jpeglib.h new file mode 100755 index 0000000..915f152 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_transupp/jpeglib.h @@ -0,0 +1,757 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: jpeglib + + Author: Thomas G. Lane + + Function: This file defines the application interface for the JPEG library. + Most applications using the library need only include this file, and perhaps + jerror.h if they want to know the exact error codes. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: cjpeg + + Changes: No major functional changes. + + License: See the accompanying README file. + +*/ + + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + Various constants determining the sizes of things. + All of these are specified by the JPEG standard, so don't change them if you + want to be compatible. +*/ + +/* The basic DCT block is 8x8 samples */ +#define DCTSIZE 8 + +/* DCTSIZE squared; # of elements in a block */ +#define DCTSIZE2 64 + + +/* + Data structures for images (arrays of samples and of DCT coefficients). + On 80x86 machines, the image arrays are too big for near pointers, but the + pointer arrays can fit in near memory. +*/ + +/* ptr to one image row of pixel samples. */ +typedef unsigned char *JSAMPROW; + +/* ptr to some rows (a 2-D sample array) */ +typedef JSAMPROW *JSAMPARRAY; + +/* one block of coefficients */ +typedef signed char JBLOCK[DCTSIZE2]; + +/* pointer to one row of coefficient blocks */ +typedef JBLOCK *JBLOCKROW; + +/* a 2-D array of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; + +/* useful in a couple of places */ +typedef signed char *JCOEFPTR; + + +/* + DCT coefficient quantization tables. +*/ + +typedef struct { + /* quantization step for each coefficient */ + /* + This array gives the coefficient quantizers in natural array order (not the + zigzag order in which they are stored in a JPEG DQT marker). + CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + unsigned short quantval[ DCTSIZE2 ]; + + /* 1 when table has been output */ + /* + This field is used only during compression. It's initialized 0 when the + table is created, and set 1 when it's been output to the file. You could + suppress output of a table by setting this to 1. (See jpeg_suppress_tables + for an example.) + */ + int sent_table; +} JQUANT_TBL; + + +/* + Huffman coding tables. +*/ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + + /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + unsigned char bits[ 17 ]; + + /* The symbols, in order of incr code length */ + /* + This field is used only during compression. It's initialized 0 when the + table is created, and set 1 when it's been output to the file. You could + suppress output of a table by setting this to 1. (See jpeg_suppress_tables + for an example.) + */ + unsigned char huffval[ 256 ]; + + /* 1 when table has been output */ + int sent_table; +} JHUFF_TBL; + + +/* + Basic info about one component (color channel). +*/ + +typedef struct { + /* + These values are fixed over the whole image. For compression, they must be + supplied by parameter setup; for decompression, they are read from the SOF + marker. + */ + + /* identifier for this component (0..255) */ + int component_id; + + /* its index in SOF or cinfo->comp_info[] */ + int component_index; + + /* horizontal sampling factor (1..4) */ + int h_samp_factor; + + /* vertical sampling factor (1..4) */ + int v_samp_factor; + + /* quantization table selector (0..3) */ + int quant_tbl_no; + + /* + These values may vary between scans. For compression, they must be supplied + by parameter setup; for decompression, they are read from the SOS marker. + The decompressor output side may not use these variables. + */ + + /* DC entropy table selector (0..3) */ + int dc_tbl_no; + + /* AC entropy table selector (0..3) */ + int ac_tbl_no; + + /* Remaining fields should be treated as private by applications. */ + + /* + These values are computed during compression or decompression startup: + Component's size in DCT blocks. Any dummy blocks added to complete an MCU + are not counted; therefore these values do not depend on whether a scan is + interleaved or not. + */ + unsigned int width_in_blocks; + unsigned int height_in_blocks; + + /* + Size of a DCT block in samples. Always DCTSIZE for compression. For + decompression this is the size of the output from one DCT block, reflecting + any scaling we choose to apply during the IDCT step. Values of 1,2,4,8 are + likely to be supported. Note that different components may receive different + IDCT scalings. + */ + int DCT_scaled_size; + + /* + The downsampled dimensions are the component's actual, unpadded number of + samples at the main buffer (preprocessing/compression interface), thus + downsampled_width = ceil(image_width * Hi/Hmax) and similarly for height. + For decompression, IDCT scaling is included, so + downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + + /* actual width in samples */ + unsigned int downsampled_width; + + /* actual height in samples */ + unsigned int downsampled_height; + + /* + This flag is used only for decompression. In cases where some of the + components will be ignored (eg grayscale output from YCbCr image), we can + skip most computations for the unused components. + */ + + /* do we need the value of this component? */ + int component_needed; + + /* + These values are computed before starting a scan of the component. The + decompressor output side may not use these variables. + */ + + /* number of blocks per MCU, horizontally */ + int MCU_width; + + /* number of blocks per MCU, vertically */ + int MCU_height; + + /* MCU_width * MCU_height */ + int MCU_blocks; + + /* MCU width in samples, MCU_width*DCT_scaled_size */ + int MCU_sample_width; + + /* # of non-dummy blocks across in last MCU */ + int last_col_width; + + /* # of non-dummy blocks down in last MCU */ + int last_row_height; + + /* + Saved quantization table for component; (void*)0 if none yet saved. See + jdinput.c comments about the need for this information. This field is + currently used only for decompression. + */ + JQUANT_TBL *quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void *dct_table; +} jpeg_component_info; + + +/* + The script for encoding a multiple-scan file is an array of these: +*/ + +typedef struct { + /* number of components encoded in this scan */ + int comps_in_scan; + + /* their SOF/comp_info[] indexes */ + int component_index[ 4 ]; + + /* progressive JPEG spectral selection parms */ + int Ss, Se; + + /* progressive JPEG successive approx. parms */ + int Ah, Al; +} jpeg_scan_info; + + +/* + Known color spaces. +*/ + +typedef enum { + /* error/unspecified */ + JCS_UNKNOWN, + + /* monochrome */ + JCS_GRAYSCALE, + + /* red/green/blue */ + JCS_RGB, + + /* Y/Cb/Cr (also known as YUV) */ + JCS_YCbCr, + + /* C/M/Y/K */ + JCS_CMYK, + + /* Y/Cb/Cr/K */ + JCS_YCCK +} J_COLOR_SPACE; + + +/* + DCT/IDCT algorithm options. +*/ + +typedef enum { + /* slow but accurate integer algorithm */ + JDCT_ISLOW, + + /* faster, less accurate integer method */ + JDCT_IFAST, + + /* floating-point: accurate, fast on fast HW */ + JDCT_FLOAT +} J_DCT_METHOD; + + +/* + Common fields between JPEG compression and decompression master structs. +*/ + +#define jpeg_common_fields \ + /* Error handler module */\ + struct jpeg_error_mgr *err; \ + /* Memory manager module */\ + struct jpeg_memory_mgr *mem; \ + /* Progress monitor, or (void*)0 if none */\ + struct jpeg_progress_mgr *progress; \ + /* Available for use by application */\ + void *client_data; \ + /* So common code can tell which is which */\ + int is_decompressor; \ + /* For checking call sequence validity */\ + int global_state + + +/* + Routines that are to be used by both halves of the library are declared to + receive a pointer to this structure. There are no actual instances of + jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. +*/ + +struct jpeg_common_struct { + /* Fields common to both master struct types */ + jpeg_common_fields; + + /* + Additional fields follow in an actual jpeg_compress_struct or + jpeg_decompress_struct. All three structs must agree on these initial + fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct *j_common_ptr; +typedef struct jpeg_compress_struct *j_compress_ptr; +typedef struct jpeg_decompress_struct *j_decompress_ptr; + + +/* + Master record for a compression instance +*/ + +struct jpeg_compress_struct { + /* Fields shared with jpeg_decompress_struct */ + jpeg_common_fields; + + /* Destination for compressed data */ + struct jpeg_destination_mgr *dest; + + /* + Description of source image --- these fields must be filled in by outer + application before starting compression. in_color_space must be correct + before you can even call jpeg_set_defaults(). + */ + + /* input image width */ + unsigned int image_width; + + /* input image height */ + unsigned int image_height; + + /* # of color components in input image */ + int input_components; + + /* colorspace of input image */ + J_COLOR_SPACE in_color_space; + + /* image gamma of input image */ + double input_gamma; + + /* + Compression parameters --- these fields must be set before calling + jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + initialize everything to reasonable defaults, then changing anything the + application specifically wants to change. That way you won't get burnt when + new parameters are added. Also note that there are several helper routines + to simplify changing parameters. + */ + + /* bits of precision in image data */ + int data_precision; + + /* # of color components in JPEG image */ + int num_components; + + /* colorspace of JPEG image */ + J_COLOR_SPACE jpeg_color_space; + + /* comp_info[i] describes component that appears i'th in SOF */ + jpeg_component_info *comp_info; + + /* ptrs to coefficient quantization tables, or (void*)0 if not defined */ + JQUANT_TBL *quant_tbl_ptrs[ 4 ]; + + /* ptrs to Huffman coding tables, or (void*)0 if not defined */ + JHUFF_TBL *dc_huff_tbl_ptrs[ 4 ]; + JHUFF_TBL *ac_huff_tbl_ptrs[ 4 ]; + + /* L values for DC arith-coding tables */ + unsigned char arith_dc_L[ 16 ]; + + /* U values for DC arith-coding tables */ + unsigned char arith_dc_U[ 16 ]; + + /* Kx values for AC arith-coding tables */ + unsigned char arith_ac_K[ 16 ]; + + /* # of entries in scan_info array */ + int num_scans; + + /* + script for multi-scan file, or (void*)0 + The default value of scan_info is (void*)0, which causes a single-scan + sequential JPEG file to be emitted. To create a multi-scan file, set + num_scans and scan_info to point to an array of scan definitions. + */ + const jpeg_scan_info *scan_info; + + /* 1=caller supplies downsampled data */ + int raw_data_in; + + /* 1=arithmetic coding, 0=Huffman */ + int arith_code; + + /* 1=optimize entropy encoding parms */ + int optimize_coding; + + /* 1=first samples are cosited */ + int CCIR601_sampling; + + /* 1..100, or 0 for no input smoothing */ + int smoothing_factor; + + /* DCT algorithm selector */ + J_DCT_METHOD dct_method; + + + /* + The restart interval can be specified in absolute MCUs by setting + restart_interval, or in MCU rows by setting restart_in_rows (in which case + the correct restart_interval will be figured for each scan). + */ + + /* MCUs per restart, or 0 for no restart */ + unsigned int restart_interval; + + /* if > 0, MCU rows per restart interval */ + int restart_in_rows; + + + /* + Parameters controlling emission of special markers. + */ + + /* should a JFIF marker be written? */ + int write_JFIF_header; + + /* What to write for the JFIF version number */ + unsigned char JFIF_major_version; + unsigned char JFIF_minor_version; + + /* + These three values are not used by the JPEG code, merely copied into the + JFIF APP0 marker. density_unit can be 0 for unknown, 1 for dots/inch, or 2 + for dots/cm. Note that the pixel aspect ratio is defined by + X_density/Y_density even when density_unit=0. + */ + + /* JFIF code for pixel size units */ + unsigned char density_unit; + + /* Horizontal pixel density */ + unsigned short X_density; + + /* Vertical pixel density */ + unsigned short Y_density; + + /* should an Adobe marker be written? */ + int write_Adobe_marker; + + /* + State variable: index of next scanline to be written to + jpeg_write_scanlines(). Application may use this to control its processing + loop, e.g., "while (next_scanline < image_height)". + */ + + /* 0 .. image_height-1 */ + unsigned int next_scanline; + + + /* + Remaining fields are known throughout compressor, but generally should not + be touched by a surrounding application. + */ + + /* + These fields are computed during compression startup + */ + + /* 1 if scan script uses progressive mode */ + int progressive_mode; + + /* largest h_samp_factor */ + int max_h_samp_factor; + + /* largest v_samp_factor */ + int max_v_samp_factor; + + /* + # of iMCU rows to be input to coef ctlr + The coefficient controller receives data in units of MCU rows as defined for + fully interleaved scans (whether the JPEG file is interleaved or not). There + are v_samp_factor * DCTSIZE sample rows of each component in an "iMCU" + (interleaved MCU) row. + */ + unsigned int total_iMCU_rows; + + /* + These fields are valid during any one scan. They describe the components + and MCUs actually appearing in the scan. + */ + + /* # of JPEG components in this scan */ + int comps_in_scan; + + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + jpeg_component_info *cur_comp_info[ 4 ]; + + /* # of MCUs across the image */ + unsigned int MCUs_per_row; + + /* # of MCU rows in the image */ + unsigned int MCU_rows_in_scan; + + /* # of DCT blocks per MCU */ + int blocks_in_MCU; + + /* + MCU_membership[i] is index in cur_comp_info of component owning i'th block + in an MCU + */ + int MCU_membership[ 10 ]; + + /* progressive JPEG parameters for scan */ + int Ss, Se, Ah, Al; + + /* + Links to compression subobjects (methods and private variables of modules) + */ + + struct jpeg_comp_master *master; + struct jpeg_c_main_controller *main; + struct jpeg_c_prep_controller *prep; + struct jpeg_c_coef_controller *coef; + struct jpeg_marker_writer *marker; + struct jpeg_color_converter *cconvert; + struct jpeg_downsampler *downsample; + struct jpeg_forward_dct *fdct; + struct jpeg_entropy_encoder *entropy; + + /* workspace for jpeg_simple_progression */ + jpeg_scan_info *script_space; + + int script_space_size; +}; + + +/* + "Object" declarations for JPEG modules that may be supplied or called directly + by the surrounding application. As with all objects in the JPEG library, these + structs only define the publicly visible methods and state variables of a + module. Additional private fields may exist after the public ones. +*/ + +/* + Error handler object +*/ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + void ( *error_exit ) ( j_common_ptr cinfo ); + + /* Conditionally emit a trace or warning message */ + void ( *emit_message ) ( j_common_ptr cinfo, int msg_level ); + + /* Routine that actually outputs a trace or error message */ + void ( *output_message ) ( j_common_ptr cinfo ); + + /* Format a message string for the most recent JPEG error or message */ + void ( *format_message ) ( j_common_ptr cinfo, char *buffer ); + + /* Reset error state variables at start of a new image */ + void ( *reset_error_mgr ) ( j_common_ptr cinfo ); + + /* + The message ID code and any parameters are saved here. A message can have + one string parameter or up to 8 int parameters. + */ + int msg_code; + + union { + int i[ 8 ]; + char s[ 80 ]; + } msg_parm; + + + /* + Standard state variables for error facility + */ + + /* max msg_level that will be displayed */ + int trace_level; + + /* + For recoverable corrupt-data errors, we emit a warning message, but keep + going unless emit_message chooses to abort. emit_message should count + warnings in num_warnings. The surrounding application can check for bad data + by seeing if num_warnings is nonzero at the end of processing. + */ + + /* number of corrupt-data warnings */ + long num_warnings; + + /* + These fields point to the table(s) of error message strings. An application + can change the table pointer to switch to a different message list + (typically, to change the language in which errors are reported). Some + applications may wish to add additional error codes that will be handled by + the JPEG library error mechanism; the second table pointer is used for this + purpose. + + First table includes all errors generated by JPEG library itself. Error + code 0 is reserved for a "no such error string" message. + */ + + /* Library errors */ + const char *const *jpeg_message_table; + + /* Table contains strings 0..last_jpeg_message */ + int last_jpeg_message; + + /* + Second table can be added by application (see cjpeg/djpeg for example). It + contains strings numbered first_addon_message..last_addon_message. + */ + + /* Non-library errors */ + const char *const *addon_message_table; + + /* code for first string in addon table */ + int first_addon_message; + + /* code for last string in addon table */ + int last_addon_message; +}; + + +/* + Progress monitor object +*/ + +struct jpeg_progress_mgr { + void ( *progress_monitor ) ( j_common_ptr cinfo ); + + /* work units completed in this pass */ + long pass_counter; + + /* total number of work units in this pass */ + long pass_limit; + + /* passes completed so far */ + int completed_passes; + + /* total number of passes expected */ + int total_passes; +}; + + +/* + Data destination object for compression +*/ + +struct jpeg_destination_mgr { + /* => next byte to write in buffer */ + unsigned char *next_output_byte; + + /* # of byte spaces remaining in buffer */ + long unsigned int free_in_buffer; + + void ( *init_destination ) ( j_compress_ptr cinfo ); + int ( *empty_output_buffer ) ( j_compress_ptr cinfo ); + void ( *term_destination ) ( j_compress_ptr cinfo ); +}; + + +/* + Memory manager object. + Allocates "small" objects (a few K total), "large" objects (tens of K), and + "really big" objects (virtual arrays with backing store if needed). The memory + manager does not allow individual objects to be freed; rather, each created + object is assigned to a pool, and whole pools can be freed at once. This is + faster and more convenient than remembering exactly what to free, especially + where malloc()/free() are not too speedy. + NB: alloc routines never return (void*)0. They exit to error_exit if not + successful. +*/ + +typedef struct jvirt_sarray_control *jvirt_sarray_ptr; +typedef struct jvirt_barray_control *jvirt_barray_ptr; + +struct jpeg_memory_mgr { + /* + Method pointers + */ + void *( *alloc_small ) ( + j_common_ptr cinfo, int pool_id, long unsigned int sizeofobject ); + + void *( *alloc_large ) ( + j_common_ptr cinfo, int pool_id, long unsigned int sizeofobject ); + + JSAMPARRAY ( *alloc_sarray ) ( + j_common_ptr cinfo, int pool_id, unsigned int samplesperrow, + unsigned int numrows ); + + JBLOCKARRAY ( *alloc_barray )( + j_common_ptr cinfo, int pool_id, unsigned int blocksperrow, + unsigned int numrows ); + + jvirt_sarray_ptr ( *request_virt_sarray ) ( + j_common_ptr cinfo, int pool_id, int pre_zero, unsigned int samplesperrow, + unsigned int numrows, unsigned int maxaccess ); + + jvirt_barray_ptr ( *request_virt_barray ) ( + j_common_ptr cinfo, int pool_id, int pre_zero, unsigned int blocksperrow, + unsigned int numrows, unsigned int maxaccess ); + + void ( *realize_virt_arrays ) ( j_common_ptr cinfo ); + + JSAMPARRAY ( *access_virt_sarray ) ( + j_common_ptr cinfo, jvirt_sarray_ptr ptr, unsigned int start_row, + unsigned int num_rows, int writable ); + + JBLOCKARRAY ( *access_virt_barray ) ( + j_common_ptr cinfo, jvirt_barray_ptr ptr, unsigned int start_row, + unsigned int num_rows, int writable ); + + void ( *free_pool ) ( j_common_ptr cinfo, int pool_id ); + + void ( *self_destruct ) ( j_common_ptr cinfo ); + + /* + Limit on memory allocation for this JPEG object. (Note that this is merely + advisory, not a guaranteed maximum; it only affects the space used for + virtual-array buffers.) May be changed by outer application after creating + the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + +#endif /* JPEGLIB_H */ diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/CMakeLists.txt b/targets/wasm-tacle/sequential/cjpeg_wrbmp/CMakeLists.txt new file mode 100644 index 0000000..d9007ee --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(cjpeg_wrbmp) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/cjpeg_wrbmp.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/cjpeg_wrbmp.c" + "generated/modified_sources/default/input.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/ChangeLog.txt b/targets/wasm-tacle/sequential/cjpeg_wrbmp/ChangeLog.txt new file mode 100755 index 0000000..df21770 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/ChangeLog.txt @@ -0,0 +1,104 @@ +File: cjpeg_jpeg6b_wrbmp.c +Original provenience: + +2017-04-18: +- Annotated cjpeg_wrbmp_main as entry-point for timing analysis + +2015-10-14: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Changed struct name to cjpeg_jpeg6b_wrbmp_name +- Changed the global variable from {name} to cjpeg_jpeg6b_wrbmp_{name} +- Changed the functions from {name} to cjpeg_jpeg6b_wrbmp_{name} +- Removed code in comment +- Added cjpeg_jpeg6b_wrbmp_main() +- Added cjpeg_jpeg6b_wrbmp_return() +- Added cjpeg_jpeg6b_wrbmp_init() +- Added forward declaration of the functions +- Removed unused variables: test_image[] and color_map[] +- Applied Code Style + +File: input.c +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed _jpeg6b_ from the prefix +- Changed the global variable from colormap to cjpeg_jpeg6b_wrbmp_colormap +- Removed unused variables: test_image[] and color_map[] +- Moved initialization of cjpeg_jpeg6b_wrbmp_colormap to function. This function is called from cjpeg_jpeg6b_wrbmp_init function +- Applied Code Style + +File: cderror.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed _jpeg6b_ from the prefix +- Changed JMESSAGE to CJPEG_JPEG6B_WRBMP_JMESSAGE +- Changed JMAKE_ENUM_LIST to CJPEG_JPEG6B_WRBMP_JMAKE_ENUM_LIST +- Applied Code Style + + +File: cdjpeg.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Rename structs and typedef to cjpeg_jpeg6b_wrbmp_{name} +- Removed unused defines + +File: jconfig.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Change defines to CJPEG_JPEG6B_WRBMP_{NAME} +- Removed _jpeg6b_ from the prefix +- Applied Code Style + + +File: jerror.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed error and warning defines +- Removed _jpeg6b_ from the prefix +- Applied Code Style + + +File: jmorecfg.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Removed unused comments +- Removed _jpeg6b_ from the prefix +- Removed unused defines +- Removed unused typedefs +- Applied Code Style + + +File: jpeglib.h +Original provenience: + +2015-10-12: +- Remove comment on line 1 +- Used define value directly +- Remove unused typedefs, defines +- Removed _jpeg6b_ from the prefix +- Changed struct name to cjpeg_jpeg6b_wrbmp_{name} +- Changed define {name} to cjpeg_jpeg6b_wrbmp_{name} +- Added generic TACLeBench header to line 1 +- Applied Code Style + + + + diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/README b/targets/wasm-tacle/sequential/cjpeg_wrbmp/README new file mode 100755 index 0000000..fa69a18 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/README @@ -0,0 +1,383 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 6a of 7-Feb-96 +================================= + +This distribution contains the sixth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +Serious users of this software (particularly those incorporating it into +larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to +our electronic mailing list. Mailing list members are notified of updates +and have a chance to participate in technical discussions, etc. + +This software is the work of Tom Lane, Philip Gladstone, Luis Ortiz, Jim +Boucher, Lee Crocker, Julian Minguillon, George Phillips, Davide Rossi, +Ge' Weijers, and other members of the Independent JPEG Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +RELATED SOFTWARE Other stuff you should get. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.doc How to configure and install the IJG software. + usage.doc Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.doc). + wizard.doc Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.doc How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.doc Overview of the JPEG library's internal structure. + filelist.doc Road map of IJG files. + coderules.doc Coding style rules --- please read if you contribute code. + +Please read at least the files install.doc and usage.doc. Useful information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image compression and +decompression. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. JPEG is intended for compressing +"real-world" scenes; line drawings, cartoons and other non-realistic images +are not its strong suit. JPEG is lossy, meaning that the output image is not +exactly identical to the input image. Hence you must not use JPEG if you +have to have identical output bits. However, on typical photographic images, +very good compression levels can be obtained with no visible change, and +remarkably high compression levels are possible if you can tolerate a +low-quality image. For more details, see the references, or just experiment +with various compression settings. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +For legal reasons, we are not distributing code for the arithmetic-coding +variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting +the hierarchical or lossless processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. We have also included +"jpegtran", a utility for lossless transcoding between different JPEG +processes, and "rdjpgcom" and "wrjpgcom", two simple applications for +inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1996, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The configuration script "configure" was produced with GNU Autoconf. It +is copyright by the Free Software Foundation but is freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +WARNING: Unisys has begun to enforce their patent on LZW compression against +GIF encoders and decoders. You will need a license from Unisys to use the +included rdgif.c or wrgif.c files in a commercial or shareware application. +At this time, Unisys is not enforcing their patent against freeware, so +distribution of this package remains legal. However, we intend to remove +GIF support from the IJG package as soon as a suitable replacement format +becomes reasonably popular. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We highly recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article +is available at ftp.uu.net, graphics/jpeg/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and +IEEE, and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson, published by M&T Books (Redwood +City, CA), 1991, ISBN 1-55851-216-0. This book provides good explanations and +example C code for a multitude of compression methods including JPEG. It is +an excellent source if you are comfortable reading C code but don't know much +about data compression in general. The book's JPEG sample code is far from +industrial-strength, but when you are ready to look at a full implementation, +you've got one here... + +The best full description of JPEG is the textbook "JPEG Still Image Data +Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published +by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. +The book includes the complete text of the ISO JPEG standards (DIS 10918-1 +and draft DIS 10918-2). This is by far the most complete exposition of JPEG +in existence, and we highly recommend it. + +The JPEG standard itself is not available electronically; you must order a +paper copy through ISO or ITU. (Unless you feel a need to own a certified +official copy, we recommend buying the Pennebaker and Mitchell book instead; +it's much cheaper and includes a great deal of useful explanatory material.) +In the USA, copies of the standard may be ordered from ANSI Sales at (212) +642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI +doesn't take credit card orders, but Global does.) It's not cheap: as of +1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% +shipping/handling. The standard is divided into two parts, Part 1 being the +actual specification, while Part 2 covers compliance testing methods. Part 1 +is titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. + +Extensions to the original JPEG standard are defined in JPEG Part 3, a new ISO +document. Part 3 is undergoing ISO balloting and is expected to be approved +by the end of 1995; it will have document numbers ISO/IEC IS 10918-3, ITU-T +T.84. IJG currently does not support any Part 3 extensions. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. A copy of the JFIF spec is available from: + Literature Department + C-Cube Microsystems, Inc. + 1778 McCarthy Blvd. + Milpitas, CA 95035 + phone (408) 944-6300, fax (408) 944-6314 +A PostScript version of this document is available at ftp.uu.net, file +graphics/jpeg/jfif.ps.gz. It can also be obtained by e-mail from the C-Cube +mail server, netlib@c3.pla.ca.us. Send the message "send jfif_ps from jpeg" +to the server to obtain the JFIF document; send the message "help" if you have +trouble. + +The TIFF 6.0 file format specification can be obtained by FTP from sgi.com +(192.48.153.1), file graphics/tiff/TIFF6.ps.Z; or you can order a printed +copy from Aldus Corp. at (206) 628-6593. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from sgi.com or +from ftp.uu.net:/graphics/jpeg/. It is expected that the next revision of +the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. libtiff is available +from sgi.com:/graphics/tiff/. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is ftp.uu.net (Internet +address 192.48.96.9). The most recent released version can always be found +there in directory graphics/jpeg. This particular version will be archived +as graphics/jpeg/jpegsrc.v6a.tar.gz. If you are on the Internet, you +can retrieve files from ftp.uu.net by standard anonymous FTP. If you don't +have FTP access, UUNET's archives are also available via UUCP; contact +help@uunet.uu.net for information on retrieving files that way. + +Numerous Internet sites maintain copies of the UUNET files. However, only +ftp.uu.net is guaranteed to have the latest official version. + +You can also obtain this software in DOS-compatible "zip" archive format from +the SimTel archives (ftp.coast.net:/SimTel/msdos/graphics/), or on CompuServe +in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 "JPEG Tools". +Again, these versions may sometimes lag behind the ftp.uu.net release. + +The JPEG FAQ (Frequently Asked Questions) article is a useful source of +general information about JPEG. It is updated constantly and therefore is +not included in this distribution. The FAQ is posted every two weeks to +Usenet newsgroups comp.graphics.misc, news.answers, and other groups. +You can always obtain the latest version from the news.answers archive at +rtfm.mit.edu. By FTP, fetch /pub/usenet/news.answers/jpeg-faq/part1 and +.../part2. If you don't have FTP, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +RELATED SOFTWARE +================ + +Numerous viewing and image manipulation programs now support JPEG. (Quite a +few of them use this library to do so.) The JPEG FAQ described above lists +some of the more popular free and shareware viewers, and tells where to +obtain them on Internet. + +If you are on a Unix machine, we highly recommend Jef Poskanzer's free +PBMPLUS image software, which provides many useful operations on PPM-format +image files. In particular, it can convert PPM images to and from a wide +range of other formats. You can obtain this package by FTP from ftp.x.org +(contrib/pbmplus*.tar.Z) or ftp.ee.lbl.gov (pbmplus*.tar.Z). There is also +a newer update of this package called NETPBM, available from +wuarchive.wustl.edu under directory /graphics/graphics/packages/NetPBM/. +Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software +is; you are likely to have difficulty making it work on any non-Unix machine. + +A different free JPEG implementation, written by the PVRG group at Stanford, +is available from havefun.stanford.edu in directory pub/jpeg. This program +is designed for research and experimentation rather than production use; +it is slower, harder to use, and less portable than the IJG code, but it +is easier to read and modify. Also, the PVRG code supports lossless JPEG, +which we do not. + + +FILE FORMAT WARS +================ + +Some JPEG programs produce files that are not compatible with our library. +The root of the problem is that the ISO JPEG committee failed to specify a +concrete file format. Some vendors "filled in the blanks" on their own, +creating proprietary formats that no one else could read. (For example, none +of the early commercial JPEG implementations for the Macintosh were able to +exchange compressed files.) + +The file format we have adopted is called JFIF (see REFERENCES). This format +has been agreed to by a number of major commercial JPEG vendors, and it has +become the de facto standard. JFIF is a minimal or "low end" representation. +We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF +Technical Note #2) for "high end" applications that need to record a lot of +additional data about an image. TIFF/JPEG is fairly new and not yet widely +supported, unfortunately. + +The upcoming JPEG Part 3 standard defines a file format called SPIFF. +SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should +be able to read the most common variant of SPIFF. SPIFF has some technical +advantages over JFIF, but its major claim to fame is simply that it is an +official standard rather than an informal one. At this point it is unclear +whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto +standard. IJG intends to support SPIFF once the standard is frozen, but we +have not decided whether it should become our default output format or not. +(In any case, our decoder will remain capable of reading JFIF indefinitely.) + +Various proprietary file formats incorporating JPEG compression also exist. +We have little or no sympathy for the existence of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, open format standards for JPEG files. Don't +use a proprietary file format! + + +TO DO +===== + +In future versions, we are considering supporting some of the upcoming JPEG +Part 3 extensions --- principally, variable quantization and the SPIFF file +format. + +Tuning the software for better behavior at low quality/high compression +settings is also of interest. The current method for scaling the +quantization tables is known not to be very good at low Q values. + +As always, speeding things up is high on our priority list. + +Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/cderror.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/cderror.h new file mode 100755 index 0000000..96f3bbb --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/cderror.h @@ -0,0 +1,140 @@ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cderror.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file defines the error and message codes for the cjpeg/djpeg + applications. These strings are not needed as part of the JPEG library + proper. + Edit this file to add new codes, or to translate the message strings to + some other language. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +#ifndef CJPEG_WRBMP_JMESSAGE +#ifndef CDERROR_H +#define CDERROR_H +/*First time through, define the enum list*/ +#define CJPEG_WRBMP_JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined*/ +#define CJPEG_WRBMP_JMESSAGE(code,string) +#endif +#endif + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + +typedef enum { + +#define CJPEG_WRBMP_JMESSAGE(code,string) code , + +#endif + + CJPEG_WRBMP_JMESSAGE( JMSG_FIRSTADDONCODE = 1000, NULL ) //Must be first entry! + + #ifdef CJPEG_WRBMP_BMP_SUPPORTED + CJPEG_WRBMP_JMESSAGE( JERR_BMP_BADCMAP, "Unsupported BMP colormap format" ) + CJPEG_WRBMP_JMESSAGE( JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported" ) + CJPEG_WRBMP_JMESSAGE( JERR_BMP_BADHEADER, "Invalid BMP file: bad header length" ) + CJPEG_WRBMP_JMESSAGE( JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1" ) + CJPEG_WRBMP_JMESSAGE( JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB" ) + CJPEG_WRBMP_JMESSAGE( JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported" ) + CJPEG_WRBMP_JMESSAGE( JERR_BMP_NOT, "Not a BMP file - does not start with BM" ) + CJPEG_WRBMP_JMESSAGE( JTRC_BMP, "%ux%u 24-bit BMP image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image" ) + #endif + + #ifdef CJPEG_WRBMP_GIF_SUPPORTED + CJPEG_WRBMP_JMESSAGE( JERR_GIF_BUG, "GIF output got confused" ) + CJPEG_WRBMP_JMESSAGE( JERR_GIF_CODESIZE, "Bogus GIF codesize %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB" ) + CJPEG_WRBMP_JMESSAGE( JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file" ) + CJPEG_WRBMP_JMESSAGE( JERR_GIF_NOT, "Not a GIF file" ) + CJPEG_WRBMP_JMESSAGE( JTRC_GIF, "%ux%ux%d GIF image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_GIF_BADVERSION, + "Warning: unexpected GIF version number '%c%c%c'" ) + CJPEG_WRBMP_JMESSAGE( JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input" ) + CJPEG_WRBMP_JMESSAGE( JWRN_GIF_BADDATA, "Corrupt data in GIF file" ) + CJPEG_WRBMP_JMESSAGE( JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring" ) + CJPEG_WRBMP_JMESSAGE( JWRN_GIF_ENDCODE, "Premature end of GIF image" ) + CJPEG_WRBMP_JMESSAGE( JWRN_GIF_NOMOREDATA, "Ran out of GIF bits" ) + #endif + + #ifdef CJPEG_WRBMP_PPM_SUPPORTED + CJPEG_WRBMP_JMESSAGE( JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB" ) + CJPEG_WRBMP_JMESSAGE( JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file" ) + CJPEG_WRBMP_JMESSAGE( JERR_PPM_NOT, "Not a PPM/PGM file" ) + CJPEG_WRBMP_JMESSAGE( JTRC_PGM, "%ux%u PGM image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_PGM_TEXT, "%ux%u text PGM image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_PPM, "%ux%u PPM image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_PPM_TEXT, "%ux%u text PPM image" ) + #endif + + #ifdef RLE_SUPPORTED + CJPEG_WRBMP_JMESSAGE( JERR_RLE_BADERROR, "Bogus error code from RLE library" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_EMPTY, "Empty RLE file" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_EOF, "Premature EOF in RLE header" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_MEM, "Insufficient memory for RLE header" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_NOT, "Not an RLE file" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE" ) + CJPEG_WRBMP_JMESSAGE( JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RLE, "%ux%u full-color RLE file" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RLE_GRAY, "%ux%u grayscale RLE file" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d" ) + #endif + + #ifdef CJPEG_WRBMP_TARGA_SUPPORTED + CJPEG_WRBMP_JMESSAGE( JERR_TGA_BADCMAP, "Unsupported Targa colormap format" ) + CJPEG_WRBMP_JMESSAGE( JERR_TGA_BADPARMS, "Invalid or unsupported Targa file" ) + CJPEG_WRBMP_JMESSAGE( JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB" ) + CJPEG_WRBMP_JMESSAGE( JTRC_TGA, "%ux%u RGB Targa image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_TGA_GRAY, "%ux%u grayscale Targa image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_TGA_MAPPED, "%ux%u colormapped Targa image" ) + #else + CJPEG_WRBMP_JMESSAGE( JERR_TGA_NOTCOMP, "Targa support was not compiled" ) + #endif + + CJPEG_WRBMP_JMESSAGE( JERR_BAD_CMAP_FILE, + "Color map file is invalid or of unsupported format" ) + CJPEG_WRBMP_JMESSAGE( JERR_TOO_MANY_COLORS, + "Output file format cannot handle %d colormap entries" ) + CJPEG_WRBMP_JMESSAGE( JERR_UNGETC_FAILED, "ungetc failed" ) + #ifdef CJPEG_WRBMP_TARGA_SUPPORTED + CJPEG_WRBMP_JMESSAGE( JERR_UNKNOWN_FORMAT, + "Unrecognized input file format --- perhaps you need -targa" ) + #else + CJPEG_WRBMP_JMESSAGE( JERR_UNKNOWN_FORMAT, "Unrecognized input file format" ) + #endif + CJPEG_WRBMP_JMESSAGE( JERR_UNSUPPORTED_FORMAT, "Unsupported output file format" ) + + #ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + + JMSG_LASTADDONCODE +} CJPEG_WRBMP_ADDON_MESSAGE_CODE; + +#undef CJPEG_WRBMP_JMAKE_ENUM_LIST + #endif + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default*/ +#undef CJPEG_WRBMP_JMESSAGE diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/cdjpeg.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/cdjpeg.h new file mode 100755 index 0000000..c08dbc7 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/cdjpeg.h @@ -0,0 +1,105 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cdjpeg.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains common declarations for the sample applications + cjpeg and djpeg. It is NOT used by the core JPEG library. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ +#ifndef CDJPEG_H +#define CDJPEG_H + +#define CJPEG_WRBMP_JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ +#define CJPEG_WRBMP_JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */ + +#include "jpeglib.h" +#include "jerror.h" /* get library error codes too */ +#include "cderror.h" /* get application-specific error codes */ + +typedef struct cjpeg_wrbmp_cjpeg_source_struct + *cjpeg_wrbmp_cjpeg_source_ptr; + +struct cjpeg_wrbmp_cjpeg_source_struct { + CJPEG_WRBMP_JMETHOD( void, start_input, + ( cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo ) ); + CJPEG_WRBMP_JMETHOD( CJPEG_WRBMP_JDIMENSION, get_pixel_rows, + ( cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo ) ); + CJPEG_WRBMP_JMETHOD( void, finish_input, + ( cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo ) ); + + CJPEG_WRBMP_FILE *input_file; + + CJPEG_WRBMP_JSAMPARRAY buffer; + CJPEG_WRBMP_JDIMENSION buffer_height; +}; + + +typedef struct cjpeg_wrbmp_djpeg_dest_struct + *cjpeg_wrbmp_djpeg_dest_ptr; + +struct cjpeg_wrbmp_djpeg_dest_struct { + CJPEG_WRBMP_JMETHOD( void, start_output, + ( cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo ) ); + /* Emit the specified number of pixel rows from the buffer. */ + CJPEG_WRBMP_JMETHOD( void, put_pixel_rows, + ( cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo, + CJPEG_WRBMP_JDIMENSION rows_supplied ) ); + /* Finish up at the end of the image. */ + CJPEG_WRBMP_JMETHOD( void, finish_output, + ( cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo ) ); + + /* Target file spec; filled in by djpeg.c after object is created. */ + CJPEG_WRBMP_FILE *output_file; + + /* Output pixel-row buffer. Created by module init or start_output. + Width is cinfo->output_width * cinfo->output_components; + height is buffer_height. + */ + CJPEG_WRBMP_JSAMPARRAY buffer; + CJPEG_WRBMP_JDIMENSION buffer_height; +} ; + + + +/* + cjpeg/djpeg may need to perform extra passes to convert to or from + the source/destination file format. The JPEG library does not know + about these passes, but we'd like them to be counted by the progress + monitor. We use an expanded progress monitor object to hold the + additional pass count. +*/ + +struct cjpeg_wrbmp_cdjpeg_progress_mgr { + struct cjpeg_wrbmp_jpeg_progress_mgr + pub; /* fields known to JPEG library */ + int completed_extra_passes; /* extra passes completed */ + int total_extra_passes; /* total extra */ + /* last printed percentage stored here to avoid multiple printouts */ + int percent_done; +}; + +typedef struct cjpeg_wrbmp_cdjpeg_progress_mgr + *cjpeg_wrbmp_cd_progress_ptr; + +#endif + diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/cjpeg_wrbmp.c b/targets/wasm-tacle/sequential/cjpeg_wrbmp/cjpeg_wrbmp.c new file mode 100755 index 0000000..cb81d01 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/cjpeg_wrbmp.c @@ -0,0 +1,219 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cjpeg_jpeg6b_wrbmp.c + + Author: Thomas G. Lane. + + Function: This file contains routines to write output images in Microsoft "BMP" + format (MS Windows 3.x and OS/2 1.x flavors). + Either 8-bit colormapped or 24-bit full-color format can be written. + No compression is supported. + + These routines may need modification for non-Unix environments or + specialized applications. As they stand, they assume output to + an ordinary stdio stream. + + Source: Independent JPEG Group's software + + Changes: a brief summary of major functional changes (not formatting) + + License: See the accompanying README file + +*/ + +#include "cdjpeg.h" + +#ifdef CJPEG_WRBMP_BMP_SUPPORTED + +/* + Declaration of global variables +*/ +typedef struct { + struct cjpeg_wrbmp_djpeg_dest_struct pub; /* public fields */ + cjpeg_wrbmp_boolean is_os2; /* saves the OS2 format request flag */ + cjpeg_wrbmp_jvirt_sarray_ptr + whole_image; /* needed to reverse row order */ + CJPEG_WRBMP_JDIMENSION data_width; /* JSAMPLEs per row */ + CJPEG_WRBMP_JDIMENSION + row_width; /* physical width of one row in the BMP file */ + int pad_bytes; /* number of padding bytes needed per row */ + CJPEG_WRBMP_JDIMENSION + cur_output_row; /* next row# to write to virtual array */ +} cjpeg_wrbmp_bmp_dest_struct; + +typedef cjpeg_wrbmp_bmp_dest_struct *cjpeg_wrbmp_bmp_dest_ptr; +extern unsigned char cjpeg_wrbmp_colormap[ 3 ][ 256 ]; +unsigned char cjpeg_wrbmp_output_array[ 6144 ]; +unsigned char *cjpeg_wrbmp_jpeg_stream /*= cjpeg_jpeg6b_wrbmp_output_array*/; +int cjpeg_wrbmp_checksum; + +struct cjpeg_wrbmp_jpeg_decompress_struct + cjpeg_wrbmp_jpeg_dec_1; +struct cjpeg_wrbmp_jpeg_decompress_struct + cjpeg_wrbmp_jpeg_dec_2; +struct cjpeg_wrbmp_djpeg_dest_struct + cjpeg_wrbmp_djpeg_dest; +cjpeg_wrbmp_bmp_dest_struct cjpeg_wrbmp_bmp_dest; + +/* + Forward declaration of functions +*/ +void cjpeg_wrbmp_initInput( void ); +void cjpeg_wrbmp_finish_output_bmp( cjpeg_wrbmp_j_decompress_ptr cinfo ); +void cjpeg_wrbmp_write_colormap( cjpeg_wrbmp_j_decompress_ptr + cinfo, + int map_colors, int map_entry_size, + int cMap ); +int cjpeg_wrbmp_putc_modified( int character ); +void cjpeg_wrbmp_init(); +void cjpeg_wrbmp_main(); +int cjpeg_wrbmp_return(); +int main(); + +/* + Initialization functions +*/ +void cjpeg_wrbmp_init() +{ + cjpeg_wrbmp_initInput(); + + cjpeg_wrbmp_jpeg_dec_1.progress = 0; + cjpeg_wrbmp_jpeg_dec_1.output_height = 30; + cjpeg_wrbmp_jpeg_dec_1.actual_number_of_colors = 256; + cjpeg_wrbmp_jpeg_dec_1.out_color_components = 2; + + cjpeg_wrbmp_jpeg_dec_2.progress = 0; + cjpeg_wrbmp_jpeg_dec_2.output_height = 30; + cjpeg_wrbmp_jpeg_dec_2.actual_number_of_colors = 256; + cjpeg_wrbmp_jpeg_dec_2.out_color_components = 3; + + cjpeg_wrbmp_jpeg_stream = cjpeg_wrbmp_output_array; + + cjpeg_wrbmp_checksum = 0; +} + +/* + Calculation functions +*/ +int cjpeg_wrbmp_putc_modified( int character ) +{ + *( cjpeg_wrbmp_jpeg_stream ) = character; + + ++cjpeg_wrbmp_jpeg_stream; + + cjpeg_wrbmp_checksum += character; + + return character; +} + +void cjpeg_wrbmp_finish_output_bmp( cjpeg_wrbmp_j_decompress_ptr cinfo ) +{ + CJPEG_WRBMP_JDIMENSION row; + cjpeg_wrbmp_cd_progress_ptr progress = + ( cjpeg_wrbmp_cd_progress_ptr ) cinfo->progress; + + // Write the file body from our virtual array + _Pragma( "loopbound min 30 max 30" ) + for ( row = cinfo->output_height; row > 0; --row ) { + if ( progress != 0 ) { + progress->pub.pass_counter = ( long )( cinfo->output_height - row ); + progress->pub.pass_limit = ( long ) cinfo->output_height; + } + } + + if ( progress != 0 ) + progress->completed_extra_passes++; +} + +void cjpeg_wrbmp_write_colormap( cjpeg_wrbmp_j_decompress_ptr + cinfo, + int map_colors, int map_entry_size, int cMap ) +{ + + int num_colors = cinfo->actual_number_of_colors; + int i; + + if ( cMap != 0 ) { + + if ( cinfo->out_color_components == 3 ) { + // Normal case with RGB colormap + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < num_colors; i++ ) { + cjpeg_wrbmp_putc_modified( CJPEG_WRBMP_GETJSAMPLE( + cjpeg_wrbmp_colormap[ 2 ][ i ] ) ); + cjpeg_wrbmp_putc_modified( CJPEG_WRBMP_GETJSAMPLE( + cjpeg_wrbmp_colormap[ 1 ][ i ] ) ); + cjpeg_wrbmp_putc_modified( CJPEG_WRBMP_GETJSAMPLE( + cjpeg_wrbmp_colormap[ 0 ][ i ] ) ); + + if ( map_entry_size == 4 ) + cjpeg_wrbmp_putc_modified( 0 ); + } + } else { + // Grayscale colormap (only happens with grayscale quantization) + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < num_colors; i++ ) { + + cjpeg_wrbmp_putc_modified( CJPEG_WRBMP_GETJSAMPLE( + cjpeg_wrbmp_colormap[ 2 ][ i ] ) ); + cjpeg_wrbmp_putc_modified( CJPEG_WRBMP_GETJSAMPLE( + cjpeg_wrbmp_colormap[ 1 ][ i ] ) ); + cjpeg_wrbmp_putc_modified( CJPEG_WRBMP_GETJSAMPLE( + cjpeg_wrbmp_colormap[ 0 ][ i ] ) ); + + if ( map_entry_size == 4 ) + cjpeg_wrbmp_putc_modified( 0 ); + } + } + } else { + // If no colormap, must be grayscale data. Generate a linear "map". + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) { + cjpeg_wrbmp_putc_modified( i ); + cjpeg_wrbmp_putc_modified( i ); + cjpeg_wrbmp_putc_modified( i ); + + if ( map_entry_size == 4 ) + cjpeg_wrbmp_putc_modified( 0 ); + } + } + + // Pad colormap with zeros to ensure specified number of colormap entries. + _Pragma( "loopbound min 512 max 512" ) + for ( ; i < map_colors; i++ ) { + cjpeg_wrbmp_putc_modified( 0 ); + cjpeg_wrbmp_putc_modified( 0 ); + cjpeg_wrbmp_putc_modified( 0 ); + + if ( map_entry_size == 4 ) + cjpeg_wrbmp_putc_modified( 0 ); + } +} + +void _Pragma( "entrypoint" ) cjpeg_wrbmp_main() +{ + cjpeg_wrbmp_finish_output_bmp( &cjpeg_wrbmp_jpeg_dec_1 ); + cjpeg_wrbmp_write_colormap( &cjpeg_wrbmp_jpeg_dec_1, 768, 4, 1 ); + + cjpeg_wrbmp_finish_output_bmp( &cjpeg_wrbmp_jpeg_dec_2 ); + cjpeg_wrbmp_write_colormap( &cjpeg_wrbmp_jpeg_dec_2, 768, 4, 1 ); +} + +int cjpeg_wrbmp_return() +{ + return ( cjpeg_wrbmp_checksum + ( -209330 ) ) != 0; +} + +int main( void ) +{ + cjpeg_wrbmp_init(); + cjpeg_wrbmp_main(); + + return ( cjpeg_wrbmp_return() ); +} + +#endif /* BMP_SUPPORTED */ + diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wasm b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f85e018493a980633410e0564fcd082f958acfed GIT binary patch literal 3931 zcmeHKdr(x@89(RV-33`F)UlmT+evpZZ4IzQ7zD)^S9zHr#-NUh_U_%?3+}Qn@7`r4 zY1kJ*H0p|v0yfBsC?Gy~bu5_$X<8B~1Z7Oq)D(2-%b7HzCTWb1KYGqxm+az%Ni)-S zI@6sybI<<1^PS)KJm((3SPT%LUu>kNLa#NJB`<^`AOZk>Ppl;DcAzBfc005y0Z@w2 z2mt`viTOk%O`AEU)WFQqn@nbv$!gR9K(fYiiGek!%@qKW5-~v%B0?mFW(c8}gaAsu zP1+&V`5}vtgoOo4A0OUt2e1FfQVv^JXc{h zX^lJ(i42U^2*gozU=C~4kWfm~J6Og{s~8JQ5>ZX_!~~EY`vw%*i7X;ZM&`r-8CXC# zpq#{SUJfV+fu1-A`T;ZpP-I>V9*`6)i~$solhLGp^8!&DHCHrj3R=9APtWS@&BlRXhJFtEuiV7%f%>Is8Vu; z5(21F#IhNojz<+1QWrwOgx3Ws(eSi>4HY4OUsS@AEXaJ^3qs=27^fOL1?2xlqrZZm zxNv7yyg2CR6E5K_iO@6M=1@i!;M7dF^>n&~eFBNgD7X`K2q_mwL+O)^657=PX{a@` zONCfJwiWL)I=LA48l>#H+!!c>GI5!l6gHQcC4m(fqn@Ik3U&$39~RxgqIf8r zojEat3`H)Th{P{cvFU_JXpo#3+$Q)?ohKCOJk)Ynk8(&T5e4Ji_<+T$y<7XGM7~2` zk7yJx8Ac>^K@e9RphUY`I^pmL^s9~|OqLOF2_3XpG>Ta%Acz)b5P}g%46a8(>XohL}1v0&+@pcpnJk!s{2pTdD0UkB<=H&KrpT>9y~3KWr(&WfWIwVQjhP*njZ|k^wg4_Pnt5>e4*Y0e%JyrBcooY4L zQ1k|$?;9{QUw`%LxaHyQEuN{repdfUy`{JCvz7H@?ZVQc8`1bntJ;{ zW5pe7U+bQF--D%}|HE=;aNJX)y4kwBsz3k!J4rg_;d}T0eDnT*d3PKAPDiGB-PrRV z`}+NT>n9pMeXHYS)A*geN3NV6^wp^b#*g{)mG>{*xN`E!s}C>k-qUoiwdm!yM-CqN zXsyHA{@WUduPtM;onQ9+g_1wC_4WH-88n;PZu{F9=fH(_|CuTO)Xi$$gUKUz+fIAw zfs)=|nd(k;Tu!TQzj4~%Zt62E{kG?PWm(T}={~%&Xldzd*Rrxz<%?`vPu%KIb^g7)v3D)E`TMp7OiuqJzfJkUh8MNR zQ!X#J7Op(JFGs)igm!@2P>`GW`lK@7vsJtJV4-vVDpr%Cb$M?)_ZKB*>#B;jxh|}9 zuN%}Z@s>C5FC27?4UaT8ot(JX*wsJibfxc5u#eJ;yHX~2lV{t3Cil7JP3P7--}_yy z=ho_4m--{4*S$K`>9!Ya8&QsR_HI-+muD3YTvD*k%=~L97R$!v8otb9{ot7Yy!WJS zK=($9qU-R+y$R=+X79>#EGgqXUonmm^f6m*LcupuF7hz-FNvH zzkhA$qOOwPGFt!giL_*Q>$w%Vb#+5szf>};D}CkuK1HQ6Iq&R`IE^l+e6L+?e{1yP z&xh_l*Wdk!QXHve+7zb5td`AR?JF;rk+3GRKTYRyE66U^E)4 zS&N0$C{z_NdZWr}5@R{GgymSHnpN->X4aAzY0;J%73?nlpJJ7l AbpQYW literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wat b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wat new file mode 100644 index 0000000..2881361 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/default/cjpeg_wrbmp.wat @@ -0,0 +1,972 @@ +(module $cjpeg_wrbmp.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func (param i32 i32 i32) (result i32))) + (type (;2;) (func)) + (type (;3;) (func (param i32 i32 i32 i32))) + (type (;4;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (import "env" "memcpy" (func $memcpy (type 1))) + (func $__wasm_apply_data_relocs (type 2)) + (func $cjpeg_wrbmp_write_colormap (type 3) (param i32 i32 i32 i32) + (local i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.eqz + br_if 0 (;@2;) + local.get 0 + i32.load offset=128 + local.set 3 + local.get 0 + i32.load offset=116 + local.set 0 + i32.const 256 + i32.const 256 + call $__pragma_loopbound + block ;; label = @3 + local.get 0 + i32.const 3 + i32.ne + br_if 0 (;@3;) + block ;; label = @4 + local.get 3 + i32.const 1 + i32.ge_s + br_if 0 (;@4;) + i32.const 0 + local.set 3 + br 3 (;@1;) + end + i32.const 0 + i32.load offset=8864 + local.set 0 + local.get 2 + i32.const 4 + i32.ne + local.set 4 + i32.const 0 + local.set 5 + loop ;; label = @4 + local.get 0 + i32.const 8880 + local.get 5 + i32.add + local.tee 6 + i32.const 512 + i32.add + i32.load8_u + local.tee 7 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 7 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 0 + local.get 6 + i32.const 256 + i32.add + i32.load8_u + local.tee 7 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 7 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 0 + local.get 6 + i32.load8_u + local.tee 6 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + i32.const 0 + local.get 6 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + block ;; label = @5 + local.get 4 + br_if 0 (;@5;) + local.get 0 + i32.const 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + end + local.get 3 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@4;) + br 3 (;@1;) + end + end + block ;; label = @3 + local.get 3 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + i32.const 0 + local.set 3 + br 2 (;@1;) + end + i32.const 0 + i32.load offset=8864 + local.set 0 + local.get 2 + i32.const 4 + i32.ne + local.set 4 + i32.const 0 + local.set 5 + loop ;; label = @3 + local.get 0 + i32.const 8880 + local.get 5 + i32.add + local.tee 6 + i32.const 512 + i32.add + i32.load8_u + local.tee 7 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 7 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 0 + local.get 6 + i32.const 256 + i32.add + i32.load8_u + local.tee 7 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 7 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 0 + local.get 6 + i32.load8_u + local.tee 6 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + i32.const 0 + local.get 6 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + block ;; label = @4 + local.get 4 + br_if 0 (;@4;) + local.get 0 + i32.const 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + end + local.get 3 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + i32.ne + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 256 + i32.const 256 + call $__pragma_loopbound + i32.const 0 + i32.load offset=8864 + local.set 5 + block ;; label = @2 + local.get 2 + i32.const 4 + i32.eq + br_if 0 (;@2;) + i32.const 0 + local.set 0 + loop ;; label = @3 + local.get 5 + local.get 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 3 + local.get 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 3 + local.get 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 5 + i32.store offset=8864 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + i32.const 256 + local.set 3 + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 256 + i32.ne + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 0 + local.set 0 + loop ;; label = @2 + local.get 5 + local.get 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 3 + local.get 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 3 + local.get 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=8864 + i32.const 0 + local.get 0 + i32.const 0 + i32.load offset=8868 + i32.add + i32.store offset=8868 + local.get 3 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 5 + i32.store offset=8864 + i32.const 256 + local.set 3 + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 256 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 512 + i32.const 512 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + local.get 3 + i32.le_s + br_if 0 (;@1;) + i32.const 0 + i32.load offset=8864 + local.set 0 + block ;; label = @2 + local.get 2 + i32.const 4 + i32.eq + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 3 + i32.sub + i32.const 1 + i32.and + br_if 0 (;@4;) + local.get 3 + local.set 5 + br 1 (;@3;) + end + local.get 0 + i32.const 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + local.get 3 + i32.const 1 + i32.add + local.set 5 + end + local.get 3 + local.get 1 + i32.const -1 + i32.add + i32.eq + br_if 1 (;@1;) + local.get 1 + local.get 5 + i32.sub + local.set 3 + loop ;; label = @3 + local.get 0 + i32.const 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + local.get 3 + i32.const -2 + i32.add + local.tee 3 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + block ;; label = @2 + block ;; label = @3 + local.get 1 + local.get 3 + i32.sub + i32.const 1 + i32.and + br_if 0 (;@3;) + local.get 3 + local.set 5 + br 1 (;@2;) + end + local.get 0 + i32.const 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + local.get 3 + i32.const 1 + i32.add + local.set 5 + end + local.get 3 + local.get 1 + i32.const -1 + i32.add + i32.eq + br_if 0 (;@1;) + local.get 1 + local.get 5 + i32.sub + local.set 3 + loop ;; label = @2 + local.get 0 + i32.const 0 + i32.store8 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + local.tee 0 + i32.const 1 + i32.add + i32.store offset=8864 + local.get 0 + i32.const 0 + i32.store8 offset=1 + i32.const 0 + i32.const 0 + i32.load offset=8864 + i32.const 1 + i32.add + local.tee 0 + i32.store offset=8864 + local.get 3 + i32.const -2 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end) + (func $cjpeg_wrbmp_main (type 2) + (local i32 i32) + i32.const 0 + i32.load offset=1800 + local.set 0 + i32.const 30 + i32.const 30 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + i32.const 0 + i32.load offset=1904 + local.tee 1 + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.eqz + br_if 2 (;@1;) + local.get 0 + local.get 1 + i32.store offset=8 + local.get 0 + local.get 1 + i32.const -1 + i32.add + i32.store offset=4 + br 1 (;@2;) + end + local.get 0 + i32.eqz + br_if 1 (;@1;) + end + local.get 0 + local.get 0 + i32.load offset=20 + i32.const 1 + i32.add + i32.store offset=20 + end + i32.const 1792 + i32.const 768 + i32.const 4 + i32.const 1 + call $cjpeg_wrbmp_write_colormap + i32.const 0 + i32.load offset=2260 + local.set 0 + i32.const 30 + i32.const 30 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + i32.const 0 + i32.load offset=2364 + local.tee 1 + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.eqz + br_if 2 (;@1;) + local.get 0 + local.get 1 + i32.store offset=8 + local.get 0 + local.get 1 + i32.const -1 + i32.add + i32.store offset=4 + br 1 (;@2;) + end + local.get 0 + i32.eqz + br_if 1 (;@1;) + end + local.get 0 + local.get 0 + i32.load offset=20 + i32.const 1 + i32.add + i32.store offset=20 + end + i32.const 2252 + i32.const 768 + i32.const 4 + i32.const 1 + call $cjpeg_wrbmp_write_colormap) + (func $__original_main (type 4) (result i32) + call $cjpeg_wrbmp_initInput + i32.const 0 + i32.const 256 + i32.store offset=1920 + i32.const 0 + i64.const 8589934622 + i64.store offset=1904 align=4 + i32.const 0 + i32.const 256 + i32.store offset=2380 + i32.const 0 + i64.const 12884901918 + i64.store offset=2364 align=4 + i32.const 0 + i32.const 2720 + i32.store offset=8864 + i32.const 0 + i32.const 0 + i32.store offset=1800 + i32.const 0 + i32.const 0 + i32.store offset=2260 + i32.const 0 + i32.const 0 + i32.store offset=8868 + call $cjpeg_wrbmp_main + i32.const 0 + i32.load offset=8868 + i32.const 209330 + i32.ne) + (func $cjpeg_wrbmp_initInput (type 2) + (local i32 i32 i32) + global.get $__stack_pointer + i32.const 768 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 1024 + i32.const 768 + call $memcpy + local.set 1 + i32.const 3 + i32.const 3 + call $__pragma_loopbound + i32.const 256 + i32.const 256 + call $__pragma_loopbound + i32.const -256 + local.set 0 + loop ;; label = @1 + local.get 0 + i32.const 9136 + i32.add + local.get 1 + local.get 0 + i32.add + local.tee 2 + i32.const 256 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9137 + i32.add + local.get 2 + i32.const 257 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9138 + i32.add + local.get 2 + i32.const 258 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9139 + i32.add + local.get 2 + i32.const 259 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 256 + i32.const 256 + call $__pragma_loopbound + i32.const -256 + local.set 0 + loop ;; label = @1 + local.get 0 + i32.const 9392 + i32.add + local.get 1 + local.get 0 + i32.add + local.tee 2 + i32.const 512 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9393 + i32.add + local.get 2 + i32.const 513 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9394 + i32.add + local.get 2 + i32.const 514 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9395 + i32.add + local.get 2 + i32.const 515 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 256 + i32.const 256 + call $__pragma_loopbound + i32.const -256 + local.set 0 + loop ;; label = @1 + local.get 0 + i32.const 9648 + i32.add + local.get 1 + local.get 0 + i32.add + local.tee 2 + i32.const 768 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9649 + i32.add + local.get 2 + i32.const 769 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9650 + i32.add + local.get 2 + i32.const 770 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 9651 + i32.add + local.get 2 + i32.const 771 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + local.get 1 + i32.const 768 + i32.add + global.set $__stack_pointer) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 13744)) + (global (;1;) i32 (i32.const 9648)) + (global (;2;) i32 (i32.const 13744)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $cjpeg_wrbmp_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) ",i\99G\97\a0\bcZ\d1\83\ddr]|\d0\cf\da6\91q\99\ef\e2S\f3\97bCr\99S\batH\bc\bem\a2\da\85\d0\d1s\fb\87Y\8f\e2\e6\f6\98\f3\98s\b4N\f6\a4\fauL\96\98\bc\fb\c3\7fo\e1\d0^]\8f\83\c9\d3c]\be\9dy\f0u\b9\a7\89\98\bc\fa;\f8\f5s\f0\c0\d1\8f\88b\e0\a7\87\84\bdH\f9\cd,j`\93\f7\f9\e4\e0\f9\bep\87\a8_\cd\ab:pO\ceK\f2\bc\bd\e1\b9Q\dd\99\f4\c6\ab\a3\9f\d1\f0\8a\94\cf\a6\c0\bc\97b\be\d1\9a\e1H`\f9\bf\df\cf\a3\cf\85\fb\b7\87\89\9f\f7\a7S{\c7\cb\90\8e\edM\80u\a9\ca\88\80\bc\a87\de\a9tG\d8dG\9by\92V\86ir1d2w\da_Q\dcNf2}D\aa$>w\81,\97H\8f\f1\83\89OI7z\ccIJ\83\dd5YH\b2<@\91\9d\9c\b1e\b4p\c2\ce\b2\a8\dd\99\c9w\de\a5\bc\d4u\b4-\86*\82\e5/k\ac(\dd\92\84\8an\90\bcp\84@\a2\91\8c\c8\b5\d7\8b\c5\b7j~tY\cc\98{\a14.\83\a7\ad>F\97\97\c5\b1\b8`ae\826?\8d\b9-~`.G\ac&rdjEv\8a\7fc\7f\c6\cc\f2\f8\c5\f1J\bd\b2\fcA-\94\91a\a8-o+@\a4Pq/\88S*[\c5_\de\a7\5cb")) diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cderror.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cderror.h new file mode 100644 index 0000000..a10701c --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cderror.h @@ -0,0 +1,377 @@ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cderror.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file defines the error and message codes for the cjpeg/djpeg + applications. These strings are not needed as part of the JPEG library + proper. + Edit this file to add new codes, or to translate the message strings to + some other language. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +#ifndef CJPEG_WRBMP_JMESSAGE +#ifndef CDERROR_H +#define CDERROR_H +/*First time through, define the enum list*/ +#define CJPEG_WRBMP_JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined*/ +#define CJPEG_WRBMP_JMESSAGE(code, string) +#endif +#endif + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + +typedef enum { + +#define CJPEG_WRBMP_JMESSAGE(code, string) code, + +#endif + + CJPEG_WRBMP_JMESSAGE(JMSG_FIRSTADDONCODE = 1000, + NULL) // Must be first entry! + +#ifdef CJPEG_WRBMP_BMP_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_BMP_BADCMAP, + "Unsupported BMP colormap format") CJPEG_WRBMP_JMESSAGE(JERR_BMP_BADDEPTH, + "Only 8- and " + "24-bit BMP " + "files are " + "supported") + CJPEG_WRBMP_JMESSAGE( + JERR_BMP_BADHEADER, + "Inv" + "ali" + "d " + "BMP" + " fi" + "le:" + " ba" + "d " + "hea" + "der" + " le" + "ngt" + "h") CJPEG_WRBMP_JMESSAGE(JERR_BMP_BADPLANES, + "Invalid BMP file: biPlanes not equal to " + "1") CJPEG_WRBMP_JMESSAGE(JERR_BMP_COLORSPACE, + "BMP output " + "must be " + "grayscale or " + "RGB") + CJPEG_WRBMP_JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs " + "not yet supported") CJPEG_WRBMP_JMESSAGE( + JERR_BMP_NOT, "N" + "o" + "t" + " " + "a" + " " + "B" + "M" + "P" + " " + "f" + "i" + "l" + "e" + " " + "-" + " " + "d" + "o" + "e" + "s" + " " + "n" + "o" + "t" + " " + "s" + "t" + "a" + "r" + "t" + " " + "w" + "i" + "t" + "h" + " " + "B" + "M") CJPEG_WRBMP_JMESSAGE(JTRC_BMP, + "%ux%u 24-bit BMP " + "image") CJPEG_WRBMP_JMESSAGE(JTRC_BMP_MAPPED, + "%ux%u 8-bit colormapped BMP " + "image") + CJPEG_WRBMP_JMESSAGE( + JTRC_BMP_OS2, + "%ux%u 24-bit OS2 BMP image") CJPEG_WRBMP_JMESSAGE(JTRC_BMP_OS2_MAPPED, + "%ux%u " + "8-bit " + "colorma" + "pped" + " OS2 " + "BMP " + "image") +#endif + +#ifdef CJPEG_WRBMP_GIF_SUPPORTED + CJPEG_WRBMP_JMESSAGE(JERR_GIF_BUG, "GIF output got " + "confused") CJPEG_WRBMP_JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") CJPEG_WRBMP_JMESSAGE( + JERR_GIF_COLORSPACE, + "GIF output " + "must be " + "grayscale " + "or RGB") CJPEG_WRBMP_JMESSAGE(JERR_GIF_IMAGENOTFOUND, + "Too few images in GIF " + "file") CJPEG_WRBMP_JMESSAGE(JERR_GIF_NOT, + "Not a GIF file") + CJPEG_WRBMP_JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") CJPEG_WRBMP_JMESSAGE( + JTRC_GIF_BADVERSION, + "Warning: " + "unexpected " + "GIF " + "version " + "number " + "'%c%c%c'") CJPEG_WRBMP_JMESSAGE(JTRC_GIF_EXTENSION, + "Ignoring GIF " + "extension " + "block of " + "type 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_GIF_NONSQUARE, + "Caution: nonsquare pixels in " + "input") + CJPEG_WRBMP_JMESSAGE(JWRN_GIF_BADDATA, "Corrupt " + "data in " + "GIF file") CJPEG_WRBMP_JMESSAGE( + JWRN_GIF_CHAR, + "Bogus char " + "0x%02x in GIF " + "file, " + "ignoring") CJPEG_WRBMP_JMESSAGE(JWRN_GIF_ENDCODE, + "Premature " + "end of GIF " + "image") CJPEG_WRBMP_JMESSAGE(JWRN_GIF_NOMOREDATA, + "Ran out of GIF bits") +#endif + +#ifdef CJPEG_WRBMP_PPM_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_PPM_COLORSPACE, + "PPM " + "outp" + "ut " + "must" + " be " + "gray" + "scal" + "e " + "or " + "RGB") CJPEG_WRBMP_JMESSAGE(JERR_PPM_NONNUMERIC, + "Nonnumeric " + "data in PPM " + "file") + CJPEG_WRBMP_JMESSAGE( + JERR_PPM_NOT, + "Not a " + "PPM/" + "PGM " + "file") CJPEG_WRBMP_JMESSAGE(JTRC_PGM, + "%ux%u " + "PGM " + "image") + CJPEG_WRBMP_JMESSAGE(JTRC_PGM_TEXT, "%u" + "x%" + "u " + "te" + "xt" + " P" + "GM" + " i" + "ma" + "g" + "e") CJPEG_WRBMP_JMESSAGE( + JTRC_PPM, + "%ux%u " + "PPM " + "image") CJPEG_WRBMP_JMESSAGE(JTRC_PPM_TEXT, + "%ux%" + "u " + "text" + " PPM" + " ima" + "ge") +#endif + +#ifdef RLE_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_RLE_BADERROR, + "Bogus error code from RLE " + "library") CJPEG_WRBMP_JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB") + CJPEG_WRBMP_JMESSAGE( + JERR_RLE_DIMENSIONS, + "Image dimensions (%ux%u) " + "too large for RLE") + CJPEG_WRBMP_JMESSAGE( + JERR_RLE_EMPTY, + "Empty RLE file") + CJPEG_WRBMP_JMESSAGE(JERR_RLE_EOF, + "P" + "r" + "e" + "m" + "a" + "t" + "u" + "r" + "e" + " " + "E" + "O" + "F" + " " + "i" + "n" + " " + "R" + "L" + "E" + " " + "h" + "e" + "a" + "d" + "e" + "r") CJPEG_WRBMP_JMESSAGE(JERR_RLE_MEM, + "Insufficient memory for RLE header") CJPEG_WRBMP_JMESSAGE(JERR_RLE_NOT, "Not an RLE file") CJPEG_WRBMP_JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE") CJPEG_WRBMP_JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup") CJPEG_WRBMP_JMESSAGE(JTRC_RLE, + "%ux%u full-color RLE file") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_GRAY, + "%ux%u grayscale RLE file") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE " + "file with map of " + "length %d") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_MAPPED, + "%ux%u colormapped RLE file with map of length %d") +#endif + +#ifdef CJPEG_WRBMP_TARGA_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_TGA_BADCMAP, + "Unsupported " + "Targa " + "colormap " + "format") CJPEG_WRBMP_JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") + CJPEG_WRBMP_JMESSAGE( + JERR_TGA_COLORSPACE, + "Targa " + "output " + "must be " + "grayscale " + "or " + "RGB") CJPEG_WRBMP_JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image") + CJPEG_WRBMP_JMESSAGE( + JTRC_TGA_GRAY, "%ux%u " + "grayscale " + "Targa " + "image") + CJPEG_WRBMP_JMESSAGE( + JTRC_TGA_MAPPED, + "%u" + "x%" + "u " + "co" + "lo" + "rm" + "ap" + "pe" + "d " + "Ta" + "rg" + "a " + "im" + "ag" + "e") +#else +CJPEG_WRBMP_JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled") +#endif + + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_CMAP_FILE, + "Color " + "map " + "file " + "is " + "invali" + "d or " + "of " + "unsupp" + "orted " + "forma" + "t") + CJPEG_WRBMP_JMESSAGE( + JERR_TOO_MANY_COLORS, + "Ou" + "tp" + "ut" + " f" + "il" + "e " + "fo" + "rm" + "at" + " c" + "an" + "no" + "t " + "ha" + "nd" + "le" + " %" + "d " + "co" + "lo" + "rm" + "ap" + " e" + "nt" + "ri" + "e" + "s") + CJPEG_WRBMP_JMESSAGE( + JERR_UNGETC_FAILED, + "ungetc failed") +#ifdef CJPEG_WRBMP_TARGA_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_UNKNOWN_FORMAT, + "Unrecognized input file format --- perhaps you need -targa") +#else +CJPEG_WRBMP_JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format") +#endif + CJPEG_WRBMP_JMESSAGE( + JERR_UNSUPPORTED_FORMAT, + "Unsupported output file format") + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + + JMSG_LASTADDONCODE +} CJPEG_WRBMP_ADDON_MESSAGE_CODE; + +#undef CJPEG_WRBMP_JMAKE_ENUM_LIST +#endif + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default*/ +#undef CJPEG_WRBMP_JMESSAGE diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cdjpeg.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cdjpeg.h new file mode 100644 index 0000000..75431a8 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cdjpeg.h @@ -0,0 +1,99 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cdjpeg.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains common declarations for the sample applications + cjpeg and djpeg. It is NOT used by the core JPEG library. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +#ifndef CDJPEG_H +#define CDJPEG_H + +#define CJPEG_WRBMP_JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ +#define CJPEG_WRBMP_JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see \ + xxx_SUPPORTED */ + +#include "cderror.h" /* get application-specific error codes */ +#include "jerror.h" /* get library error codes too */ +#include "jpeglib.h" + +typedef struct cjpeg_wrbmp_cjpeg_source_struct *cjpeg_wrbmp_cjpeg_source_ptr; + +struct cjpeg_wrbmp_cjpeg_source_struct { + CJPEG_WRBMP_JMETHOD(void, start_input, + (cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JDIMENSION, get_pixel_rows, + (cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo)); + CJPEG_WRBMP_JMETHOD(void, finish_input, + (cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo)); + + CJPEG_WRBMP_FILE *input_file; + + CJPEG_WRBMP_JSAMPARRAY buffer; + CJPEG_WRBMP_JDIMENSION buffer_height; +}; + +typedef struct cjpeg_wrbmp_djpeg_dest_struct *cjpeg_wrbmp_djpeg_dest_ptr; + +struct cjpeg_wrbmp_djpeg_dest_struct { + CJPEG_WRBMP_JMETHOD(void, start_output, + (cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo)); + /* Emit the specified number of pixel rows from the buffer. */ + CJPEG_WRBMP_JMETHOD(void, put_pixel_rows, + (cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo, + CJPEG_WRBMP_JDIMENSION rows_supplied)); + /* Finish up at the end of the image. */ + CJPEG_WRBMP_JMETHOD(void, finish_output, + (cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo)); + + /* Target file spec; filled in by djpeg.c after object is created. */ + CJPEG_WRBMP_FILE *output_file; + + /* Output pixel-row buffer. Created by module init or start_output. + Width is cinfo->output_width * cinfo->output_components; + height is buffer_height. + */ + CJPEG_WRBMP_JSAMPARRAY buffer; + CJPEG_WRBMP_JDIMENSION buffer_height; +}; + +/* + cjpeg/djpeg may need to perform extra passes to convert to or from + the source/destination file format. The JPEG library does not know + about these passes, but we'd like them to be counted by the progress + monitor. We use an expanded progress monitor object to hold the + additional pass count. +*/ + +struct cjpeg_wrbmp_cdjpeg_progress_mgr { + struct cjpeg_wrbmp_jpeg_progress_mgr pub; /* fields known to JPEG library */ + int completed_extra_passes; /* extra passes completed */ + int total_extra_passes; /* total extra */ + /* last printed percentage stored here to avoid multiple printouts */ + int percent_done; +}; + +typedef struct cjpeg_wrbmp_cdjpeg_progress_mgr *cjpeg_wrbmp_cd_progress_ptr; + +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cjpeg_wrbmp.c b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cjpeg_wrbmp.c new file mode 100644 index 0000000..84a186f --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/cjpeg_wrbmp.c @@ -0,0 +1,216 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cjpeg_jpeg6b_wrbmp.c + + Author: Thomas G. Lane. + + Function: This file contains routines to write output images in Microsoft + "BMP" format (MS Windows 3.x and OS/2 1.x flavors). Either 8-bit colormapped + or 24-bit full-color format can be written. No compression is supported. + + These routines may need modification for non-Unix environments or + specialized applications. As they stand, they assume output to + an ordinary stdio stream. + + Source: Independent JPEG Group's software + + Changes: a brief summary of major functional changes (not formatting) + + License: See the accompanying README file + +*/ + +#include "cdjpeg.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifdef CJPEG_WRBMP_BMP_SUPPORTED + +/* + Declaration of global variables +*/ +typedef struct { + struct cjpeg_wrbmp_djpeg_dest_struct pub; /* public fields */ + cjpeg_wrbmp_boolean is_os2; /* saves the OS2 format request flag */ + cjpeg_wrbmp_jvirt_sarray_ptr whole_image; /* needed to reverse row order */ + CJPEG_WRBMP_JDIMENSION data_width; /* JSAMPLEs per row */ + CJPEG_WRBMP_JDIMENSION + row_width; /* physical width of one row in the BMP file */ + int pad_bytes; /* number of padding bytes needed per row */ + CJPEG_WRBMP_JDIMENSION + cur_output_row; /* next row# to write to virtual array */ +} cjpeg_wrbmp_bmp_dest_struct; + +typedef cjpeg_wrbmp_bmp_dest_struct *cjpeg_wrbmp_bmp_dest_ptr; +extern unsigned char cjpeg_wrbmp_colormap[3][256]; +unsigned char cjpeg_wrbmp_output_array[6144]; +unsigned char *cjpeg_wrbmp_jpeg_stream /*= cjpeg_jpeg6b_wrbmp_output_array*/; +int cjpeg_wrbmp_checksum; + +struct cjpeg_wrbmp_jpeg_decompress_struct cjpeg_wrbmp_jpeg_dec_1; +struct cjpeg_wrbmp_jpeg_decompress_struct cjpeg_wrbmp_jpeg_dec_2; +struct cjpeg_wrbmp_djpeg_dest_struct cjpeg_wrbmp_djpeg_dest; +cjpeg_wrbmp_bmp_dest_struct cjpeg_wrbmp_bmp_dest; + +/* + Forward declaration of functions +*/ +void cjpeg_wrbmp_initInput(void); +void cjpeg_wrbmp_finish_output_bmp(cjpeg_wrbmp_j_decompress_ptr cinfo); +void cjpeg_wrbmp_write_colormap(cjpeg_wrbmp_j_decompress_ptr cinfo, + int map_colors, int map_entry_size, int cMap); +int cjpeg_wrbmp_putc_modified(int character); +void cjpeg_wrbmp_init(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_wrbmp_main(); +int cjpeg_wrbmp_return(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(); + +/* + Initialization functions +*/ +void +cjpeg_wrbmp_init() { + cjpeg_wrbmp_initInput(); + + cjpeg_wrbmp_jpeg_dec_1.progress = 0; + cjpeg_wrbmp_jpeg_dec_1.output_height = 30; + cjpeg_wrbmp_jpeg_dec_1.actual_number_of_colors = 256; + cjpeg_wrbmp_jpeg_dec_1.out_color_components = 2; + + cjpeg_wrbmp_jpeg_dec_2.progress = 0; + cjpeg_wrbmp_jpeg_dec_2.output_height = 30; + cjpeg_wrbmp_jpeg_dec_2.actual_number_of_colors = 256; + cjpeg_wrbmp_jpeg_dec_2.out_color_components = 3; + + cjpeg_wrbmp_jpeg_stream = cjpeg_wrbmp_output_array; + + cjpeg_wrbmp_checksum = 0; +} + +/* + Calculation functions +*/ +int +cjpeg_wrbmp_putc_modified(int character) { + *(cjpeg_wrbmp_jpeg_stream) = character; + + ++cjpeg_wrbmp_jpeg_stream; + + cjpeg_wrbmp_checksum += character; + + return character; +} + +void +cjpeg_wrbmp_finish_output_bmp(cjpeg_wrbmp_j_decompress_ptr cinfo) { + CJPEG_WRBMP_JDIMENSION row; + cjpeg_wrbmp_cd_progress_ptr progress = + (cjpeg_wrbmp_cd_progress_ptr) cinfo->progress; + + // Write the file body from our virtual array + __pragma_loopbound(30, 30); + for (row = cinfo->output_height; row > 0; --row) { + if (progress != 0) { + progress->pub.pass_counter = (long) (cinfo->output_height - row); + progress->pub.pass_limit = (long) cinfo->output_height; + } + } + + if (progress != 0) + progress->completed_extra_passes++; +} + +void +cjpeg_wrbmp_write_colormap(cjpeg_wrbmp_j_decompress_ptr cinfo, int map_colors, + int map_entry_size, int cMap) { + + int num_colors = cinfo->actual_number_of_colors; + int i; + + if (cMap != 0) { + + if (cinfo->out_color_components == 3) { + // Normal case with RGB colormap + __pragma_loopbound(256, 256); + for (i = 0; i < num_colors; i++) { + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[2][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[1][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[0][i])); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } + } else { + // Grayscale colormap (only happens with grayscale quantization) + __pragma_loopbound(256, 256); + for (i = 0; i < num_colors; i++) { + + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[2][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[1][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[0][i])); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } + } + } else { + // If no colormap, must be grayscale data. Generate a linear "map". + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) { + cjpeg_wrbmp_putc_modified(i); + cjpeg_wrbmp_putc_modified(i); + cjpeg_wrbmp_putc_modified(i); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } + } + + // Pad colormap with zeros to ensure specified number of colormap entries. + __pragma_loopbound(512, 512); + for (; i < map_colors; i++) { + cjpeg_wrbmp_putc_modified(0); + cjpeg_wrbmp_putc_modified(0); + cjpeg_wrbmp_putc_modified(0); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_wrbmp_main() { + cjpeg_wrbmp_finish_output_bmp(&cjpeg_wrbmp_jpeg_dec_1); + cjpeg_wrbmp_write_colormap(&cjpeg_wrbmp_jpeg_dec_1, 768, 4, 1); + + cjpeg_wrbmp_finish_output_bmp(&cjpeg_wrbmp_jpeg_dec_2); + cjpeg_wrbmp_write_colormap(&cjpeg_wrbmp_jpeg_dec_2, 768, 4, 1); +} + +int +cjpeg_wrbmp_return() { + return (cjpeg_wrbmp_checksum + (-209330)) != 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cjpeg_wrbmp_init(); + cjpeg_wrbmp_main(); + + return (cjpeg_wrbmp_return()); +} + +#endif /* BMP_SUPPORTED */ diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/input.c b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/input.c new file mode 100644 index 0000000..d2445b7 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/input.c @@ -0,0 +1,95 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: input.c + + Author: Thomas G. Lane. + + Function: Input variables for the cjpeg_jpeg6b_wrbmp.c + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +unsigned char cjpeg_wrbmp_colormap[3][256]; + +void +cjpeg_wrbmp_initInput(void) { + int i, j; + volatile unsigned char tmp[3][256] = { + {44, 105, 153, 71, 151, 160, 188, 90, 209, 131, 221, 114, 93, 124, + 208, 207, 218, 54, 145, 113, 153, 239, 226, 83, 243, 151, 98, 67, + 114, 153, 83, 186, 116, 72, 188, 190, 109, 162, 218, 133, 208, 209, + 115, 251, 135, 89, 143, 226, 230, 246, 152, 243, 152, 115, 180, 78, + 246, 164, 250, 117, 76, 150, 152, 188, 251, 195, 127, 111, 225, 208, + 94, 93, 143, 131, 201, 211, 99, 93, 190, 157, 121, 240, 117, 185, + 167, 137, 152, 188, 250, 59, 248, 245, 115, 240, 192, 209, 143, 136, + 98, 224, 167, 135, 132, 189, 72, 249, 205, 44, 106, 96, 147, 247, + 249, 228, 224, 249, 190, 112, 135, 168, 95, 205, 171, 58, 112, 79, + 206, 75, 242, 188, 189, 225, 185, 81, 221, 153, 244, 198, 171, 163, + 159, 209, 240, 138, 148, 207, 166, 192, 188, 151, 98, 190, 209, 154, + 225, 72, 96, 249, 191, 223, 207, 163, 207, 133, 251, 183, 135, 137, + 159, 247, 167, 83, 123, 199, 203, 144, 142, 237, 77, 128, 117, 169, + 202, 136, 128, 188, 168, 55, 222, 169, 116, 60, 75, 175, 102, 217, + 168, 185, 189, 225, 125, 192, 112, 111, 168, 239, 225, 168, 97, 129, + 190, 175, 169, 225, 170, 226, 225, 226, 224, 134, 106, 250, 222, 148, + 241, 168, 166, 160, 95, 190, 102, 180, 193, 111, 151, 165, 171, 200, + 52, 134, 169, 223, 166, 225, 169, 111, 185, 109, 56, 244, 157, 250, + 226, 231, 119, 188}, + {42, 143, 46, 91, 84, 201, 140, 91, 82, 140, 31, 88, 44, 171, + 57, 115, 206, 59, 145, 117, 116, 53, 232, 117, 80, 60, 66, 64, + 117, 174, 89, 178, 147, 63, 83, 59, 103, 139, 211, 64, 68, 98, + 118, 53, 119, 90, 161, 232, 171, 98, 176, 236, 118, 157, 180, 77, + 114, 88, 28, 119, 40, 97, 69, 189, 252, 225, 119, 96, 219, 84, + 82, 105, 158, 49, 200, 61, 117, 78, 63, 147, 140, 69, 108, 90, + 161, 105, 190, 114, 84, 76, 70, 43, 156, 222, 96, 72, 143, 90, + 105, 56, 144, 78, 129, 35, 66, 101, 100, 49, 105, 130, 160, 239, + 129, 141, 83, 43, 68, 106, 132, 83, 92, 130, 175, 63, 131, 79, + 192, 105, 57, 160, 118, 162, 141, 78, 192, 128, 206, 201, 203, 162, + 159, 163, 221, 183, 157, 177, 189, 192, 129, 130, 54, 104, 45, 101, + 252, 52, 91, 177, 49, 221, 116, 111, 143, 92, 142, 159, 131, 173, + 61, 159, 173, 81, 129, 214, 213, 145, 143, 232, 67, 145, 130, 99, + 237, 110, 160, 131, 67, 50, 129, 131, 127, 76, 92, 203, 96, 206, + 176, 180, 85, 99, 162, 118, 64, 78, 190, 191, 45, 101, 129, 58, + 72, 211, 49, 115, 115, 85, 61, 100, 116, 107, 143, 117, 219, 154, + 225, 174, 160, 163, 119, 190, 106, 186, 49, 45, 177, 147, 85, 138, + 42, 174, 59, 68, 120, 71, 129, 56, 149, 97, 68, 88, 148, 60, + 239, 179, 149, 104}, + {44, 76, 37, 56, 76, 152, 122, 153, 77, 191, 41, 76, 39, 97, + 46, 109, 172, 43, 116, 91, 102, 49, 201, 68, 88, 45, 53, 95, + 160, 175, 102, 164, 116, 50, 76, 45, 86, 189, 216, 50, 61, 93, + 196, 91, 100, 58, 116, 223, 166, 102, 126, 221, 158, 86, 235, 55, + 113, 120, 52, 115, 42, 86, 55, 165, 247, 194, 160, 108, 170, 108, + 98, 77, 168, 42, 179, 70, 96, 62, 71, 216, 100, 71, 155, 121, + 146, 86, 134, 105, 114, 49, 100, 50, 119, 218, 95, 81, 220, 78, + 102, 50, 125, 68, 170, 36, 62, 119, 129, 44, 151, 72, 143, 241, + 131, 137, 79, 73, 55, 122, 204, 73, 74, 131, 221, 53, 89, 72, + 178, 60, 64, 145, 157, 156, 177, 101, 180, 112, 194, 206, 178, 168, + 221, 153, 201, 119, 222, 165, 188, 212, 117, 180, 45, 134, 42, 130, + 229, 47, 107, 172, 40, 221, 146, 132, 138, 110, 144, 188, 112, 132, + 64, 162, 145, 140, 200, 181, 215, 139, 197, 183, 106, 126, 116, 89, + 204, 152, 123, 161, 52, 46, 131, 167, 173, 62, 70, 151, 151, 197, + 177, 184, 96, 97, 101, 130, 54, 63, 141, 185, 45, 126, 96, 46, + 71, 172, 38, 114, 100, 106, 69, 118, 138, 127, 99, 127, 198, 204, + 242, 248, 197, 241, 74, 189, 178, 252, 65, 45, 148, 145, 97, 168, + 45, 111, 43, 64, 164, 80, 113, 47, 136, 83, 42, 91, 197, 95, + 222, 167, 92, 98}}; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) + cjpeg_wrbmp_colormap[i][j] = tmp[i][j]; + } +} diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jconfig.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jconfig.h new file mode 100644 index 0000000..df0feed --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jconfig.h @@ -0,0 +1,65 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cderror.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README files +*/ + +#ifndef JCONFIG_H +#define JCONFIG_H + +#define CJPEG_WRBMP_HAVE_PROTOTYPES +#define CJPEG_WRBMP_HAVE_UNSIGNED_CHAR +#define CJPEG_WRBMP_HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#define CJPEG_WRBMP_HAVE_STDDEF_H +#define CJPEG_WRBMP_HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef CJPEG_JPEG6B_WRBMP_NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef CJPEG_JPEG6B_WRBMP_JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef CJPEG_WRBMP_JPEG_CJPEG_DJPEG + +#define CJPEG_WRBMP_BMP_SUPPORTED /* BMP image file format */ +#define CJPEG_WRBMP_GIF_SUPPORTED /* GIF image file format */ +#define CJPEG_WRBMP_PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define CJPEG_WRBMP_TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ + +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jerror.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jerror.h new file mode 100644 index 0000000..f46475d --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jerror.h @@ -0,0 +1,333 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jerror.h + + Author: Thomas G. Lane. + + This file defines the error and message codes for the JPEG library. + Edit this file to add new codes, or to translate the message strings to + some other language. + A set of error-reporting macros are defined too. Some applications using + the JPEG library may wish to include this file to get the error codes + sand/or the macros. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +/* + To define the enum list of message codes, include this file without + defining macro JMESSAGE. To create a message string table, include it + again with a suitable JMESSAGE definition (see jerror.c for an example). +*/ + +#ifndef CJPEG_WRBMP_JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define CJPEG_WRBMP_JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define CJPEG_WRBMP_JMESSAGE(code, string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + +typedef enum { + +#define CJPEG_WRBMP_JMESSAGE(code, string) code, + +#endif /* JMAKE_ENUM_LIST */ + + CJPEG_WRBMP_JMESSAGE(JMSG_NOMESSAGE, + "Bogus message code %d") /* Must be first entry! */ + + /* For maintenance convenience, list is alphabetical by message code name */ + CJPEG_WRBMP_JMESSAGE( + JERR_ARITH_NOTIMPL, + "Sorry, there are legal " + "restrictions on arithmetic " + "coding") CJPEG_WRBMP_JMESSAGE(JERR_BAD_ALIGN_TYPE, + "ALIGN_TYPE is wrong, please fix") + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_ALLOC_CHUNK, + "MAX_ALLOC_" + "CHUNK is " + "wrong, please " + "fix") CJPEG_WRBMP_JMESSAGE(JERR_BAD_BUFFER_MODE, + "Bogus buffer control mode") + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_COMPONENT_ID, + "Invalid " + "component ID %d " + "in SOS") CJPEG_WRBMP_JMESSAGE(JERR_BAD_DCT_COEF, + "DCT coefficient out of " + "range") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_DCTSIZE, + "IDCT output block size %d not supported") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_HUFF_TABLE, + "Bogus Huffman table " + "definition") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_IN_COLORSPACE, + "Bogus input colorspace") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_J_COLORSPACE, + "Bogus JPEG colorspace") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_LENGTH, "Bogus " + "marker " + "length") + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: " + "library is %d, caller expects %d") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large " + "for interleaved scan") CJPEG_WRBMP_JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code " + "%d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_PRECISION, + "Unsupported JPEG data precision %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_PROGRESSION, "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_PROG_SCRIPT, "Invalid progressive parameters at scan script entry %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_SAMPLING, + "Bogus sampling factors") CJPEG_WRBMP_JMESSAGE(JERR_BAD_SCAN_SCRIPT, + "Invalid scan script at entry %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_STATE, + "Improper call to JPEG library in state %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") CJPEG_WRBMP_JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") CJPEG_WRBMP_JMESSAGE(JERR_BUFFER_SIZE, + "Buffer passed to JPEG library is too small") CJPEG_WRBMP_JMESSAGE(JERR_CANT_SUSPEND, + "Suspension not allowed here") CJPEG_WRBMP_JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") CJPEG_WRBMP_JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") CJPEG_WRBMP_JMESSAGE(JERR_CONVERSION_NOTIMPL, + "Unsupported color conversion request") CJPEG_WRBMP_JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") CJPEG_WRBMP_JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") CJPEG_WRBMP_JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") CJPEG_WRBMP_JMESSAGE(JERR_DQT_INDEX, + "Bogus DQT index %d") CJPEG_WRBMP_JMESSAGE(JERR_EMPTY_IMAGE, + "Empty JPEG image (DNL not supported)") CJPEG_WRBMP_JMESSAGE(JERR_EMS_READ, "Read from EMS failed") CJPEG_WRBMP_JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") CJPEG_WRBMP_JMESSAGE(JERR_EOI_EXPECTED, + "Didn't expect more than one scan") CJPEG_WRBMP_JMESSAGE(JERR_FILE_READ, "Input file read error") CJPEG_WRBMP_JMESSAGE(JERR_FILE_WRITE, + "Output file write error --- out of disk space?") CJPEG_WRBMP_JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, + "Fractional sampling not implemented yet") CJPEG_WRBMP_JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") CJPEG_WRBMP_JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") CJPEG_WRBMP_JMESSAGE(JERR_IMAGE_TOO_BIG, + "Maximum supported image dimension is %u pixels") CJPEG_WRBMP_JMESSAGE(JERR_INPUT_EMPTY, + "Empty input file") CJPEG_WRBMP_JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") CJPEG_WRBMP_JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, "Cannot transcode due to multiple use of quantization table %d") CJPEG_WRBMP_JMESSAGE(JERR_MISSING_DATA, + "Scan script does not transmit all data") CJPEG_WRBMP_JMESSAGE(JERR_MODE_CHANGE, + "Invalid color quantization mode change") CJPEG_WRBMP_JMESSAGE(JERR_NOTIMPL, "Not implemented yet") CJPEG_WRBMP_JMESSAGE(JERR_NOT_COMPILED, + "Requested feature was omitted at compile time") CJPEG_WRBMP_JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") CJPEG_WRBMP_JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") CJPEG_WRBMP_JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") CJPEG_WRBMP_JMESSAGE(JERR_NO_QUANT_TABLE, + "Quantization table 0x%02x was not defined") CJPEG_WRBMP_JMESSAGE(JERR_NO_SOI, + "Not a JPEG file: starts with 0x%02x 0x%02x") CJPEG_WRBMP_JMESSAGE(JERR_OUT_OF_MEMORY, + "Insufficient memory (case %d)") CJPEG_WRBMP_JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") CJPEG_WRBMP_JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") CJPEG_WRBMP_JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") + CJPEG_WRBMP_JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") CJPEG_WRBMP_JMESSAGE( + JERR_SOF_NO_SOS, "Invalid JPEG " + "file " + "structure: " + "missing SOS " + "marker") CJPEG_WRBMP_JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") + CJPEG_WRBMP_JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") CJPEG_WRBMP_JMESSAGE( + JERR_SOS_NO_SOF, "Invalid " + "JPEG " + "file " + "structure" + ": SOS " + "before " + "SOF") CJPEG_WRBMP_JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") + CJPEG_WRBMP_JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") CJPEG_WRBMP_JMESSAGE(JERR_TFILE_SEEK, + "Seek failed on temporary file") CJPEG_WRBMP_JMESSAGE(JERR_TFILE_WRITE, "Write failed on temporary file --- out of disk space?") CJPEG_WRBMP_JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") CJPEG_WRBMP_JMESSAGE(JERR_UNKNOWN_MARKER, + "Unsupported marker type 0x%02x") CJPEG_WRBMP_JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") CJPEG_WRBMP_JMESSAGE(JERR_WIDTH_OVERFLOW, + "Image too wide for this implementation") CJPEG_WRBMP_JMESSAGE(JERR_XMS_READ, + "Read from XMS failed") CJPEG_WRBMP_JMESSAGE(JERR_XMS_WRITE, + "Write to XMS failed") CJPEG_WRBMP_JMESSAGE(JMSG_COPYRIGHT, + JCOPYRIGHT) CJPEG_WRBMP_JMESSAGE(JMSG_VERSION, JVERSION) CJPEG_WRBMP_JMESSAGE(JTRC_16BIT_TABLES, "Caution: quantization tables are too coarse for baseline JPEG") CJPEG_WRBMP_JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") CJPEG_WRBMP_JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") CJPEG_WRBMP_JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") CJPEG_WRBMP_JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_DQT, + "Define Quantization Table %d precision %d") CJPEG_WRBMP_JMESSAGE(JTRC_DRI, + "Define Restart Interval %u") CJPEG_WRBMP_JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") CJPEG_WRBMP_JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") CJPEG_WRBMP_JMESSAGE(JTRC_EOI, + "End Of Image") CJPEG_WRBMP_JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, "Warning: thumbnail image size does not match data length %u") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF_THUMBNAIL, + " with %d x %d thumbnail image") CJPEG_WRBMP_JMESSAGE(JTRC_MISC_MARKER, + "Miscellaneous marker 0x%02x, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_QUANTVALS, + " %4u %4u %4u %4u %4u %4u %4u %4u") CJPEG_WRBMP_JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") CJPEG_WRBMP_JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") CJPEG_WRBMP_JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") CJPEG_WRBMP_JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") CJPEG_WRBMP_JMESSAGE(JTRC_RST, "RST%d") CJPEG_WRBMP_JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") CJPEG_WRBMP_JMESSAGE(JTRC_SOF, + "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") CJPEG_WRBMP_JMESSAGE(JTRC_SOF_COMPONENT, + " Component %d: %dhx%dv q=%d") CJPEG_WRBMP_JMESSAGE(JTRC_SOI, "Start of Image") CJPEG_WRBMP_JMESSAGE(JTRC_SOS, + "Start Of Scan: %d components") CJPEG_WRBMP_JMESSAGE(JTRC_SOS_COMPONENT, + " Component %d: dc=%d ac=%d") CJPEG_WRBMP_JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") CJPEG_WRBMP_JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") CJPEG_WRBMP_JMESSAGE(JTRC_TFILE_OPEN, + "Opened temporary file %s") CJPEG_WRBMP_JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized" + " component " + "IDs %d %d " + "%d, " + "assuming " + "YCbCr") CJPEG_WRBMP_JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") CJPEG_WRBMP_JMESSAGE(JTRC_XMS_OPEN, + "Obtained XMS handle %u") CJPEG_WRBMP_JMESSAGE(JWRN_ADOBE_XFORM, + "Unknown Adobe color " + "transform code %d") + CJPEG_WRBMP_JMESSAGE(JWRN_BOGUS_PROGRESSION, + "I" + "n" + "c" + "o" + "n" + "s" + "i" + "s" + "t" + "e" + "n" + "t" + " " + "p" + "r" + "o" + "g" + "r" + "e" + "s" + "s" + "i" + "o" + "n" + " " + "s" + "e" + "q" + "u" + "e" + "n" + "c" + "e" + " " + "f" + "o" + "r" + " " + "c" + "o" + "m" + "p" + "o" + "n" + "e" + "n" + "t" + " " + "%" + "d" + " " + "c" + "o" + "e" + "f" + "f" + "i" + "c" + "i" + "e" + "n" + "t" + " " + "%" + "d") CJPEG_WRBMP_JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u " + "extraneous bytes " + "before marker 0x%02x") + CJPEG_WRBMP_JMESSAGE( + JWRN_HIT_MARKER, + "Corrupt JPEG " + "data: " + "premature end " + "of data " + "segment") + CJPEG_WRBMP_JMESSAGE( + JWRN_HUFF_BAD_CODE, + "Corrupt " + "JPEG " + "data: bad " + "Huffman " + "code") + CJPEG_WRBMP_JMESSAGE( + JWRN_JFIF_MAJOR, + "Warnin" + "g: " + "unknow" + "n " + "JFIF " + "revisi" + "on " + "number" + " " + "%d.%" + "02d") CJPEG_WRBMP_JMESSAGE(JWRN_JPEG_EOF, + "Premature end of JPEG file") + CJPEG_WRBMP_JMESSAGE( + JWRN_MUST_RESYNC, + "Co" + "rr" + "up" + "t " + "JP" + "EG" + " " + "da" + "ta" + ": " + "fo" + "un" + "d " + "ma" + "rk" + "er" + " " + "0x" + "%0" + "2x" + " " + "in" + "st" + "ea" + "d " + "of" + " R" + "ST" + "%" + "d") + CJPEG_WRBMP_JMESSAGE( + JWRN_NOT_SEQUENTIAL, + "Invali" + "d SOS " + "parame" + "ters " + "for " + "sequen" + "tial " + "JPEG") + CJPEG_WRBMP_JMESSAGE( + JWRN_TOO_MUCH_DATA, + "Ap" + "pl" + "ic" + "at" + "io" + "n " + "tr" + "an" + "sf" + "er" + "re" + "d " + "to" + "o " + "ma" + "ny" + " s" + "ca" + "nl" + "in" + "e" + "s") + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} CJPEG_WRBMP_J_MESSAGE_CODE; + +#undef CJPEG_WRBMP_JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef CJPEG_WRBMP_JMESSAGE diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jmorecfg.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jmorecfg.h new file mode 100644 index 0000000..9059775 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jmorecfg.h @@ -0,0 +1,91 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jmorecfg.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains additional configuration options that customize the + JPEG software for special applications or support machine-dependent + optimizations. Most users will not need to touch this file. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +#ifndef JMORECFG_H +#define JMORECFG_H + +#define CJPEG_WRBMP_GETJSAMPLE(value) ((int) (value)) + +typedef unsigned char CJPEG_WRBMP_JSAMPLE; +typedef short CJPEG_WRBMP_JCOEF; +typedef unsigned char CJPEG_WRBMP_JOCTET; + +/* These typedefs are used for various table entries and so forth. + They must be at least as wide as specified; but making them too big + won't cost a huge amount of memory, so we don't provide special + extraction code like we did for JSAMPLE. (In other words, these + typedefs live at a different point on the speed/space tradeoff curve.) +*/ + +/* UINT8 must hold at least the values 0..255. */ + +typedef unsigned char CJPEG_WRBMP_UINT8; + +/* UINT16 must hold at least the values 0..65535. */ + +typedef unsigned short CJPEG_WRBMP_UINT16; + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +typedef long INT32; +#endif + +typedef unsigned int CJPEG_WRBMP_JDIMENSION; + +/* This macro is used to declare a "method", that is, a function pointer. + We want to supply prototype parameters if the compiler can cope. + Note that the arglist parameter must be parenthesized! + Again, you can customize this if you need special linkage keywords. +*/ + +#define EXTERN(type) extern type + +#ifdef CJPEG_WRBMP_HAVE_PROTOTYPES +#define CJPEG_WRBMP_JMETHOD(type, methodname, arglist) type(*methodname) arglist +#else +#define CJPEG_WRBMP_JMETHOD(type, methodname, arglist) type (*methodname)() +#endif + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + on 80x86 machines. Most of the specialized coding for 80x86 is handled + by just saying "FAR *" where such a pointer is needed. In a few places + explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. +*/ + +#ifdef CJPEG_JPEG6B_WRBMP_NEED_FAR_POINTERS +#define CJPEG_WRBMP_FAR far +#else +#define CJPEG_WRBMP_FAR +#endif + +#ifndef CJPEG_JPEG6B_WRBMP_HAVE_BOOLEAN +typedef int cjpeg_wrbmp_boolean; +#endif +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jpeglib.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jpeglib.h new file mode 100644 index 0000000..22653dd --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/default/jpeglib.h @@ -0,0 +1,844 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jpeglib.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file defines the application interface for the JPEG library. + Most applications using the library need only include this file, + and perhaps jerror.h if they want to know the exact error codes. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +typedef int CJPEG_WRBMP_FILE; +typedef unsigned int cjpeg_wrbmp_size_t; + +/* + First we include the configuration files that record how this + installation of the JPEG library is set up. jconfig.h can be + generated automatically for many systems. jmorecfg.h contains + manual configuration options that most people need not worry about. +*/ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + +/* Data structures for images (arrays of samples and of DCT coefficients). + On 80x86 machines, the image arrays are too big for near pointers, + but the pointer arrays can fit in near memory. +*/ + +typedef CJPEG_WRBMP_JSAMPLE CJPEG_WRBMP_FAR + *CJPEG_WRBMP_JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef CJPEG_WRBMP_JSAMPROW + *CJPEG_WRBMP_JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef CJPEG_WRBMP_JSAMPARRAY + *CJPEG_WRBMP_JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef CJPEG_WRBMP_JCOEF + CJPEG_WRBMP_JBLOCK[64]; /* one block of coefficients */ +typedef CJPEG_WRBMP_JBLOCK CJPEG_WRBMP_FAR + *CJPEG_WRBMP_JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef CJPEG_WRBMP_JBLOCKROW + *CJPEG_WRBMP_JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef CJPEG_WRBMP_JBLOCKARRAY + *CJPEG_WRBMP_JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef CJPEG_WRBMP_JCOEF CJPEG_WRBMP_FAR + *JCOEFPTR; /* useful in a couple of places */ + +/* Types for JPEG compression parameters and working tables. */ + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + (not the zigzag order in which they are stored in a JPEG DQT marker). + CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + CJPEG_WRBMP_UINT16 + quantval[64]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + the table is created, and set TRUE when it's been output to the file. + You could suppress output of a table by setting this to TRUE. + (See jpeg_suppress_tables for an example.) + */ + cjpeg_wrbmp_boolean sent_table; /* TRUE when table has been output */ +} CJPEG_WRBMP_JQUANT_TBL; + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + CJPEG_WRBMP_UINT8 bits[17]; /* bits[ k ] = # of symbols with codes of */ + /* length k bits; bits[ 0 ] is unused */ + CJPEG_WRBMP_UINT8 + huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + the table is created, and set TRUE when it's been output to the file. + You could suppress output of a table by setting this to TRUE. + (See jpeg_suppress_tables for an example.) + */ + cjpeg_wrbmp_boolean sent_table; /* TRUE when table has been output */ +} CJPEG_WRBMP_JHUFF_TBL; + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[ ] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + Any dummy blocks added to complete an MCU are not counted; therefore + these values do not depend on whether a scan is interleaved or not. + */ + CJPEG_WRBMP_JDIMENSION width_in_blocks; + CJPEG_WRBMP_JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + For decompression this is the size of the output from one DCT block, + reflecting any scaling we choose to apply during the IDCT step. + Values of 1,2,4,8 are likely to be supported. Note that different + components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + of samples at the main buffer (preprocessing/compression interface), thus + downsampled_width = ceil(image_width * Hi/Hmax) + and similarly for height. For decompression, IDCT scaling is included, + so downsampled_width = ceil(image_width * Hi/Hmax * + DCT_scaled_size/DCTSIZE) + */ + CJPEG_WRBMP_JDIMENSION downsampled_width; /* actual width in samples */ + CJPEG_WRBMP_JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + components will be ignored (eg grayscale output from YCbCr image), + we can skip most computations for the unused components. + */ + cjpeg_wrbmp_boolean + component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + See jdinput.c comments about the need for this information. + This field is currently used only for decompression. + */ + CJPEG_WRBMP_JQUANT_TBL *quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void *dct_table; +} cjpeg_wrbmp_jpeg_component_info; + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[4]; /* their SOF/comp_info[ ] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} cjpeg_wrbmp_jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct cjpeg_wrbmp_jpeg_marker_struct CJPEG_WRBMP_FAR + *jpeg_saved_marker_ptr; + +struct cjpeg_wrbmp_jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + CJPEG_WRBMP_UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[ ] */ + CJPEG_WRBMP_JOCTET CJPEG_WRBMP_FAR + *data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length + */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} CJPEG_WRBMP_J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} CJPEG_WRBMP_J_DCT_METHOD; + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} CJPEG_WRBMP_J_DITHER_MODE; + +/* Common fields between JPEG compression and decompression master structs. */ + +#define cjpeg_wrbmp_jpeg_common_fields \ + struct cjpeg_wrbmp_jpeg_error_mgr *err; /* Error handler module */ \ + struct cjpeg_wrbmp_jpeg_memory_mgr *mem; /* Memory manager module */ \ + struct cjpeg_wrbmp_jpeg_progress_mgr \ + *progress; /* Progress monitor, or NULL if none */ \ + void *client_data; /* Available for use by application */ \ + cjpeg_wrbmp_boolean \ + is_decompressor; /* So common code can tell which is which */ \ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + to receive a pointer to this structure. There are no actual instances of + jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. +*/ +struct cjpeg_wrbmp_jpeg_common_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields common to both master struct types + */ + /* Additional fields follow in an actual jpeg_compress_struct or + jpeg_decompress_struct. All three structs must agree on these + initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct cjpeg_wrbmp_jpeg_common_struct *cjpeg_wrbmp_j_common_ptr; +typedef struct cjpeg_wrbmp_jpeg_compress_struct *cjpeg_wrbmp_j_compress_ptr; +typedef struct cjpeg_wrbmp_jpeg_decompress_struct *cjpeg_wrbmp_j_decompress_ptr; + +/* Master record for a compression instance */ + +struct cjpeg_wrbmp_jpeg_compress_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields shared with jpeg_decompress_struct + */ + + /* Destination for compressed data */ + struct cjpeg_wrbmp_jpeg_destination_mgr *dest; + + /* Description of source image --- these fields must be filled in by + outer application before starting compression. in_color_space must + be correct before you can even call jpeg_set_defaults(). + */ + + CJPEG_WRBMP_JDIMENSION image_width; /* input image width */ + CJPEG_WRBMP_JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + CJPEG_WRBMP_J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + float input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + initialize everything to reasonable defaults, then changing anything + the application specifically wants to change. That way you won't get + burnt when new parameters are added. Also note that there are several + helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + CJPEG_WRBMP_J_COLOR_SPACE + jpeg_color_space; /* colorspace of JPEG image */ + + cjpeg_wrbmp_jpeg_component_info *comp_info; + /* comp_info[ i ] describes component that appears i'th in SOF */ + + CJPEG_WRBMP_JQUANT_TBL *quant_tbl_ptrs[4]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + CJPEG_WRBMP_JHUFF_TBL *dc_huff_tbl_ptrs[4]; + CJPEG_WRBMP_JHUFF_TBL *ac_huff_tbl_ptrs[4]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + CJPEG_WRBMP_UINT8 + arith_dc_L[16]; /* L values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_dc_U[16]; /* U values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_ac_K[16]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const cjpeg_wrbmp_jpeg_scan_info + *scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + sequential JPEG file to be emitted. To create a multi-scan file, + set num_scans and scan_info to point to an array of scan definitions. + */ + + cjpeg_wrbmp_boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + cjpeg_wrbmp_boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + cjpeg_wrbmp_boolean + optimize_coding; /* TRUE=optimize entropy encoding parms */ + cjpeg_wrbmp_boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + CJPEG_WRBMP_J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + restart_interval, or in MCU rows by setting restart_in_rows + (in which case the correct restart_interval will be figured + for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + cjpeg_wrbmp_boolean + write_JFIF_header; /* should a JFIF marker be written? */ + CJPEG_WRBMP_UINT8 + JFIF_major_version; /* What to write for the JFIF version number */ + CJPEG_WRBMP_UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + CJPEG_WRBMP_UINT8 density_unit; /* JFIF code for pixel size units */ + CJPEG_WRBMP_UINT16 X_density; /* Horizontal pixel density */ + CJPEG_WRBMP_UINT16 Y_density; /* Vertical pixel density */ + cjpeg_wrbmp_boolean + write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + jpeg_write_scanlines(). Application may use this to control its + processing loop, e.g., "while (next_scanline < image_height)". + */ + + CJPEG_WRBMP_JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + should not be touched by a surrounding application. + */ + + /* + These fields are computed during compression startup + */ + cjpeg_wrbmp_boolean + progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + CJPEG_WRBMP_JDIMENSION + total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + for fully interleaved scans (whether the JPEG file is interleaved or + not). There are v_samp_factor * DCTSIZE sample rows of each component in + an "iMCU" (interleaved MCU) row. + */ + + /* + These fields are valid during any one scan. + They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + cjpeg_wrbmp_jpeg_component_info *cur_comp_info[4]; + /* *cur_comp_info[ i ] describes component that appears i'th in SOS */ + + CJPEG_WRBMP_JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + CJPEG_WRBMP_JDIMENSION + MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[10]; + /* MCU_membership[ i ] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + cjpeg_wrbmp_jpeg_scan_info + *script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + +/* Master record for a decompression instance */ + +struct cjpeg_wrbmp_jpeg_decompress_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields shared with jpeg_compress_struct + */ + + /* Source of compressed data */ + struct cjpeg_wrbmp_jpeg_source_mgr *src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + CJPEG_WRBMP_JDIMENSION + image_width; /* nominal image width (from SOF marker) */ + CJPEG_WRBMP_JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + CJPEG_WRBMP_J_COLOR_SPACE + jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + calling jpeg_start_decompress(). Note that jpeg_read_header() + initializes them to default values. + */ + + CJPEG_WRBMP_J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + float output_gamma; /* image gamma wanted in output */ + + cjpeg_wrbmp_boolean buffered_image; /* TRUE=multiple output passes */ + cjpeg_wrbmp_boolean raw_data_out; /* TRUE=downsampled data wanted */ + + CJPEG_WRBMP_J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + cjpeg_wrbmp_boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + cjpeg_wrbmp_boolean + do_block_smoothing; /* TRUE=apply interblock smoothing */ + + cjpeg_wrbmp_boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + CJPEG_WRBMP_J_DITHER_MODE + dither_mode; /* type of color dithering to use */ + cjpeg_wrbmp_boolean + two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + cjpeg_wrbmp_boolean + enable_1pass_quant; /* enable future use of 1-pass quantizer */ + cjpeg_wrbmp_boolean + enable_EXTERNal_quant; /* enable future use of EXTERNal colormap */ + cjpeg_wrbmp_boolean + enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + These fields are computed by jpeg_start_decompress(). + You can also use jpeg_calc_output_dimensions() to determine these values + in advance of calling jpeg_start_decompress(). + */ + + CJPEG_WRBMP_JDIMENSION output_width; /* scaled image width */ + CJPEG_WRBMP_JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + high, space and time will be wasted due to unnecessary data copying. + Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + The application can supply a colormap by setting colormap non-NULL before + calling jpeg_start_decompress; otherwise a colormap is created during + jpeg_start_decompress or jpeg_start_output. + The map has out_color_components rows and actual_number_of_colors + columns. + */ + int actual_number_of_colors; /* number of entries in use */ + CJPEG_WRBMP_JSAMPARRAY + colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + Application may use this to control its processing loop, e.g., + "while (output_scanline < output_height)". + */ + CJPEG_WRBMP_JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + CJPEG_WRBMP_JDIMENSION + input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + output side. The decompressor will not allow output scan/row number + to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + CJPEG_WRBMP_JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[ c ][ i ] indicates the precision + with which component c's DCT coefficient i (in zigzag order) is known. + It is -1 when no data has yet been received, otherwise it is the point + transform (shift) value for the most recent scan of the coefficient + (thus, 0 at completion of the progression). + This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[64]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + these fields. Note that the decompressor output side may not use + any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + datastreams when processing abbreviated JPEG datastreams. + */ + + CJPEG_WRBMP_JQUANT_TBL *quant_tbl_ptrs[4]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + CJPEG_WRBMP_JHUFF_TBL *dc_huff_tbl_ptrs[4]; + CJPEG_WRBMP_JHUFF_TBL *ac_huff_tbl_ptrs[4]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + cjpeg_wrbmp_jpeg_component_info *comp_info; + /* comp_info[ i ] describes component that appears i'th in SOF */ + + cjpeg_wrbmp_boolean + progressive_mode; /* TRUE if SOFn specifies progressive mode */ + cjpeg_wrbmp_boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + CJPEG_WRBMP_UINT8 + arith_dc_L[16]; /* L values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_dc_U[16]; /* U values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_ac_K[16]; /* Kx values for AC arith-coding tables */ + + unsigned int + restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + the JPEG library. + */ + cjpeg_wrbmp_boolean + saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + CJPEG_WRBMP_UINT8 JFIF_major_version; /* JFIF version number */ + CJPEG_WRBMP_UINT8 JFIF_minor_version; + CJPEG_WRBMP_UINT8 density_unit; /* JFIF code for pixel size units */ + CJPEG_WRBMP_UINT16 X_density; /* Horizontal pixel density */ + CJPEG_WRBMP_UINT16 Y_density; /* Vertical pixel density */ + cjpeg_wrbmp_boolean + saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + CJPEG_WRBMP_UINT8 + Adobe_transform; /* Color transform code from Adobe marker */ + + cjpeg_wrbmp_boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + library, the uninterpreted contents of any or all APPn and COM markers + can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + should not be touched by a surrounding application. + */ + + /* + These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + CJPEG_WRBMP_JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + in fully interleaved JPEG scans, but are used whether the scan is + interleaved or not. We define an iMCU row as v_samp_factor DCT block + rows of each component. Therefore, the IDCT output contains + v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + CJPEG_WRBMP_JSAMPLE + *sample_range_limit; /* table for fast range-limiting */ + + /* + These fields are valid during any one scan. + They describe the components and MCUs actually appearing in the scan. + Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + cjpeg_wrbmp_jpeg_component_info *cur_comp_info[4]; + /* *cur_comp_info[ i ] describes component that appears i'th in SOS */ + + CJPEG_WRBMP_JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + CJPEG_WRBMP_JDIMENSION + MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[10]; + /* MCU_membership[ i ] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + It is either zero or the code of a JPEG marker that has been + read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master *master; + struct jpeg_d_main_controller *main; + struct jpeg_d_coef_controller *coef; + struct jpeg_d_post_controller *post; + struct jpeg_input_controller *inputctl; + struct jpeg_marker_reader *marker; + struct jpeg_entropy_decoder *entropy; + struct jpeg_inverse_dct *idct; + struct jpeg_upsampler *upsample; + struct jpeg_color_deconverter *cconvert; + struct jpeg_color_quantizer *cquantize; +}; + +/* "Object" declarations for JPEG modules that may be supplied or called + directly by the surrounding application. + As with all objects in the JPEG library, these structs only define the + publicly visible methods and state variables of a module. Additional + private fields may exist after the public ones. +*/ + +/* Error handler object */ + +struct cjpeg_wrbmp_jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + CJPEG_WRBMP_JMETHOD(void, error_exit, (cjpeg_wrbmp_j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + CJPEG_WRBMP_JMETHOD(void, emit_message, + (cjpeg_wrbmp_j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + CJPEG_WRBMP_JMETHOD(void, output_message, (cjpeg_wrbmp_j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + CJPEG_WRBMP_JMETHOD(void, format_message, + (cjpeg_wrbmp_j_common_ptr cinfo, char *buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + CJPEG_WRBMP_JMETHOD(void, reset_error_mgr, + (cjpeg_wrbmp_j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + /* + union { + int i[ 8 ]; + char s[ JMSG_STR_PARM_MAX ]; + } msg_parm; + */ + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + but keep going unless emit_message chooses to abort. emit_message + should count warnings in num_warnings. The surrounding application + can check for bad data by seeing if num_warnings is nonzero at the + end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + An application can change the table pointer to switch to a different + message list (typically, to change the language in which errors are + reported). Some applications may wish to add additional error codes + that will be handled by the JPEG library error mechanism; the second + table pointer is used for this purpose. + + First table includes all errors generated by JPEG library itself. + Error code 0 is reserved for a "no such error string" message. + */ + const char *const *jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + It contains strings numbered first_addon_message..last_addon_message. + */ + const char *const *addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + +/* Progress monitor object */ + +struct cjpeg_wrbmp_jpeg_progress_mgr { + CJPEG_WRBMP_JMETHOD(void, progress_monitor, + (cjpeg_wrbmp_j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + +/* Data destination object for compression */ + +struct cjpeg_wrbmp_jpeg_destination_mgr { + CJPEG_WRBMP_JOCTET + *next_output_byte; /* => next byte to write in buffer */ + cjpeg_wrbmp_size_t + free_in_buffer; /* # of byte spaces remaining in buffer */ + + CJPEG_WRBMP_JMETHOD(void, init_destination, + (cjpeg_wrbmp_j_compress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, empty_output_buffer, + (cjpeg_wrbmp_j_compress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(void, term_destination, + (cjpeg_wrbmp_j_compress_ptr cinfo)); +}; + +/* Data source object for decompression */ + +struct cjpeg_wrbmp_jpeg_source_mgr { + const CJPEG_WRBMP_JOCTET + *next_input_byte; /* => next byte to read from buffer */ + cjpeg_wrbmp_size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + CJPEG_WRBMP_JMETHOD(void, init_source, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, fill_input_buffer, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(void, skip_input_data, + (cjpeg_wrbmp_j_decompress_ptr cinfo, long num_bytes)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, resync_to_restart, + (cjpeg_wrbmp_j_decompress_ptr cinfo, int desired)); + CJPEG_WRBMP_JMETHOD(void, term_source, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); +}; + +/* Memory manager object. + Allocates "small" objects (a few K total), "large" objects (tens of K), + and "really big" objects (virtual arrays with backing store if needed). + The memory manager does not allow individual objects to be freed; rather, + each created object is assigned to a pool, and whole pools can be freed + at once. This is faster and more convenient than remembering exactly what + to free, especially where malloc()/free() are not too speedy. + NB: alloc routines never return NULL. They exit to error_exit if not + successful. +*/ + +typedef struct jvirt_sarray_control *cjpeg_wrbmp_jvirt_sarray_ptr; +typedef struct jvirt_barray_control *cjpeg_wrbmp_jvirt_barray_ptr; + +struct cjpeg_wrbmp_jpeg_memory_mgr { + /* Method pointers */ + CJPEG_WRBMP_JMETHOD(void *, alloc_small, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_size_t sizeofobject)); + CJPEG_WRBMP_JMETHOD(void CJPEG_WRBMP_FAR *, alloc_large, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_size_t sizeofobject)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JSAMPARRAY, alloc_sarray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + CJPEG_WRBMP_JDIMENSION samplesperrow, + CJPEG_WRBMP_JDIMENSION numrows)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JBLOCKARRAY, alloc_barray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + CJPEG_WRBMP_JDIMENSION blocksperrow, + CJPEG_WRBMP_JDIMENSION numrows)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_jvirt_sarray_ptr, request_virt_sarray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_boolean pre_zero, + CJPEG_WRBMP_JDIMENSION samplesperrow, + CJPEG_WRBMP_JDIMENSION numrows, + CJPEG_WRBMP_JDIMENSION maxaccess)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_jvirt_barray_ptr, request_virt_barray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_boolean pre_zero, + CJPEG_WRBMP_JDIMENSION blocksperrow, + CJPEG_WRBMP_JDIMENSION numrows, + CJPEG_WRBMP_JDIMENSION maxaccess)); + CJPEG_WRBMP_JMETHOD(void, realize_virt_arrays, + (cjpeg_wrbmp_j_common_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JSAMPARRAY, access_virt_sarray, + (cjpeg_wrbmp_j_common_ptr cinfo, + cjpeg_wrbmp_jvirt_sarray_ptr ptr, + CJPEG_WRBMP_JDIMENSION start_row, + CJPEG_WRBMP_JDIMENSION num_rows, + cjpeg_wrbmp_boolean writable)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JBLOCKARRAY, access_virt_barray, + (cjpeg_wrbmp_j_common_ptr cinfo, + cjpeg_wrbmp_jvirt_barray_ptr ptr, + CJPEG_WRBMP_JDIMENSION start_row, + CJPEG_WRBMP_JDIMENSION num_rows, + cjpeg_wrbmp_boolean writable)); + CJPEG_WRBMP_JMETHOD(void, free_pool, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id)); + CJPEG_WRBMP_JMETHOD(void, self_destruct, (cjpeg_wrbmp_j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + merely advisory, not a guaranteed maximum; it only affects the space + used for virtual-array buffers.) May be changed by outer application + after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + +/* Routine signature for application-supplied marker processing methods. + Need not pass marker code since it is stored in cinfo->unread_marker. +*/ +typedef CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, jpeg_marker_parser_method, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); + +/* + The JPEG library modules define JPEG_INTERNALS before including this file. + The internal structure declarations are read only when that is true. + Applications using the library should not include jpegint.h, but may wish + to include jerror.h. +*/ + +#ifdef CJPEG_JPEG6B_WRBMP_JPEG_INTERNALS +#include "jerror.h" /* fetch error codes too */ +#include "jpegint.h" /* fetch private declarations */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cderror.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cderror.h new file mode 100644 index 0000000..a10701c --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cderror.h @@ -0,0 +1,377 @@ + +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cderror.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file defines the error and message codes for the cjpeg/djpeg + applications. These strings are not needed as part of the JPEG library + proper. + Edit this file to add new codes, or to translate the message strings to + some other language. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +#ifndef CJPEG_WRBMP_JMESSAGE +#ifndef CDERROR_H +#define CDERROR_H +/*First time through, define the enum list*/ +#define CJPEG_WRBMP_JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined*/ +#define CJPEG_WRBMP_JMESSAGE(code, string) +#endif +#endif + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + +typedef enum { + +#define CJPEG_WRBMP_JMESSAGE(code, string) code, + +#endif + + CJPEG_WRBMP_JMESSAGE(JMSG_FIRSTADDONCODE = 1000, + NULL) // Must be first entry! + +#ifdef CJPEG_WRBMP_BMP_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_BMP_BADCMAP, + "Unsupported BMP colormap format") CJPEG_WRBMP_JMESSAGE(JERR_BMP_BADDEPTH, + "Only 8- and " + "24-bit BMP " + "files are " + "supported") + CJPEG_WRBMP_JMESSAGE( + JERR_BMP_BADHEADER, + "Inv" + "ali" + "d " + "BMP" + " fi" + "le:" + " ba" + "d " + "hea" + "der" + " le" + "ngt" + "h") CJPEG_WRBMP_JMESSAGE(JERR_BMP_BADPLANES, + "Invalid BMP file: biPlanes not equal to " + "1") CJPEG_WRBMP_JMESSAGE(JERR_BMP_COLORSPACE, + "BMP output " + "must be " + "grayscale or " + "RGB") + CJPEG_WRBMP_JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs " + "not yet supported") CJPEG_WRBMP_JMESSAGE( + JERR_BMP_NOT, "N" + "o" + "t" + " " + "a" + " " + "B" + "M" + "P" + " " + "f" + "i" + "l" + "e" + " " + "-" + " " + "d" + "o" + "e" + "s" + " " + "n" + "o" + "t" + " " + "s" + "t" + "a" + "r" + "t" + " " + "w" + "i" + "t" + "h" + " " + "B" + "M") CJPEG_WRBMP_JMESSAGE(JTRC_BMP, + "%ux%u 24-bit BMP " + "image") CJPEG_WRBMP_JMESSAGE(JTRC_BMP_MAPPED, + "%ux%u 8-bit colormapped BMP " + "image") + CJPEG_WRBMP_JMESSAGE( + JTRC_BMP_OS2, + "%ux%u 24-bit OS2 BMP image") CJPEG_WRBMP_JMESSAGE(JTRC_BMP_OS2_MAPPED, + "%ux%u " + "8-bit " + "colorma" + "pped" + " OS2 " + "BMP " + "image") +#endif + +#ifdef CJPEG_WRBMP_GIF_SUPPORTED + CJPEG_WRBMP_JMESSAGE(JERR_GIF_BUG, "GIF output got " + "confused") CJPEG_WRBMP_JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") CJPEG_WRBMP_JMESSAGE( + JERR_GIF_COLORSPACE, + "GIF output " + "must be " + "grayscale " + "or RGB") CJPEG_WRBMP_JMESSAGE(JERR_GIF_IMAGENOTFOUND, + "Too few images in GIF " + "file") CJPEG_WRBMP_JMESSAGE(JERR_GIF_NOT, + "Not a GIF file") + CJPEG_WRBMP_JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") CJPEG_WRBMP_JMESSAGE( + JTRC_GIF_BADVERSION, + "Warning: " + "unexpected " + "GIF " + "version " + "number " + "'%c%c%c'") CJPEG_WRBMP_JMESSAGE(JTRC_GIF_EXTENSION, + "Ignoring GIF " + "extension " + "block of " + "type 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_GIF_NONSQUARE, + "Caution: nonsquare pixels in " + "input") + CJPEG_WRBMP_JMESSAGE(JWRN_GIF_BADDATA, "Corrupt " + "data in " + "GIF file") CJPEG_WRBMP_JMESSAGE( + JWRN_GIF_CHAR, + "Bogus char " + "0x%02x in GIF " + "file, " + "ignoring") CJPEG_WRBMP_JMESSAGE(JWRN_GIF_ENDCODE, + "Premature " + "end of GIF " + "image") CJPEG_WRBMP_JMESSAGE(JWRN_GIF_NOMOREDATA, + "Ran out of GIF bits") +#endif + +#ifdef CJPEG_WRBMP_PPM_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_PPM_COLORSPACE, + "PPM " + "outp" + "ut " + "must" + " be " + "gray" + "scal" + "e " + "or " + "RGB") CJPEG_WRBMP_JMESSAGE(JERR_PPM_NONNUMERIC, + "Nonnumeric " + "data in PPM " + "file") + CJPEG_WRBMP_JMESSAGE( + JERR_PPM_NOT, + "Not a " + "PPM/" + "PGM " + "file") CJPEG_WRBMP_JMESSAGE(JTRC_PGM, + "%ux%u " + "PGM " + "image") + CJPEG_WRBMP_JMESSAGE(JTRC_PGM_TEXT, "%u" + "x%" + "u " + "te" + "xt" + " P" + "GM" + " i" + "ma" + "g" + "e") CJPEG_WRBMP_JMESSAGE( + JTRC_PPM, + "%ux%u " + "PPM " + "image") CJPEG_WRBMP_JMESSAGE(JTRC_PPM_TEXT, + "%ux%" + "u " + "text" + " PPM" + " ima" + "ge") +#endif + +#ifdef RLE_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_RLE_BADERROR, + "Bogus error code from RLE " + "library") CJPEG_WRBMP_JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB") + CJPEG_WRBMP_JMESSAGE( + JERR_RLE_DIMENSIONS, + "Image dimensions (%ux%u) " + "too large for RLE") + CJPEG_WRBMP_JMESSAGE( + JERR_RLE_EMPTY, + "Empty RLE file") + CJPEG_WRBMP_JMESSAGE(JERR_RLE_EOF, + "P" + "r" + "e" + "m" + "a" + "t" + "u" + "r" + "e" + " " + "E" + "O" + "F" + " " + "i" + "n" + " " + "R" + "L" + "E" + " " + "h" + "e" + "a" + "d" + "e" + "r") CJPEG_WRBMP_JMESSAGE(JERR_RLE_MEM, + "Insufficient memory for RLE header") CJPEG_WRBMP_JMESSAGE(JERR_RLE_NOT, "Not an RLE file") CJPEG_WRBMP_JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE") CJPEG_WRBMP_JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup") CJPEG_WRBMP_JMESSAGE(JTRC_RLE, + "%ux%u full-color RLE file") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_GRAY, + "%ux%u grayscale RLE file") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE " + "file with map of " + "length %d") CJPEG_WRBMP_JMESSAGE(JTRC_RLE_MAPPED, + "%ux%u colormapped RLE file with map of length %d") +#endif + +#ifdef CJPEG_WRBMP_TARGA_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_TGA_BADCMAP, + "Unsupported " + "Targa " + "colormap " + "format") CJPEG_WRBMP_JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") + CJPEG_WRBMP_JMESSAGE( + JERR_TGA_COLORSPACE, + "Targa " + "output " + "must be " + "grayscale " + "or " + "RGB") CJPEG_WRBMP_JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image") + CJPEG_WRBMP_JMESSAGE( + JTRC_TGA_GRAY, "%ux%u " + "grayscale " + "Targa " + "image") + CJPEG_WRBMP_JMESSAGE( + JTRC_TGA_MAPPED, + "%u" + "x%" + "u " + "co" + "lo" + "rm" + "ap" + "pe" + "d " + "Ta" + "rg" + "a " + "im" + "ag" + "e") +#else +CJPEG_WRBMP_JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled") +#endif + + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_CMAP_FILE, + "Color " + "map " + "file " + "is " + "invali" + "d or " + "of " + "unsupp" + "orted " + "forma" + "t") + CJPEG_WRBMP_JMESSAGE( + JERR_TOO_MANY_COLORS, + "Ou" + "tp" + "ut" + " f" + "il" + "e " + "fo" + "rm" + "at" + " c" + "an" + "no" + "t " + "ha" + "nd" + "le" + " %" + "d " + "co" + "lo" + "rm" + "ap" + " e" + "nt" + "ri" + "e" + "s") + CJPEG_WRBMP_JMESSAGE( + JERR_UNGETC_FAILED, + "ungetc failed") +#ifdef CJPEG_WRBMP_TARGA_SUPPORTED + CJPEG_WRBMP_JMESSAGE( + JERR_UNKNOWN_FORMAT, + "Unrecognized input file format --- perhaps you need -targa") +#else +CJPEG_WRBMP_JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format") +#endif + CJPEG_WRBMP_JMESSAGE( + JERR_UNSUPPORTED_FORMAT, + "Unsupported output file format") + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + + JMSG_LASTADDONCODE +} CJPEG_WRBMP_ADDON_MESSAGE_CODE; + +#undef CJPEG_WRBMP_JMAKE_ENUM_LIST +#endif + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default*/ +#undef CJPEG_WRBMP_JMESSAGE diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cdjpeg.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cdjpeg.h new file mode 100644 index 0000000..75431a8 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cdjpeg.h @@ -0,0 +1,99 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cdjpeg.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains common declarations for the sample applications + cjpeg and djpeg. It is NOT used by the core JPEG library. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +#ifndef CDJPEG_H +#define CDJPEG_H + +#define CJPEG_WRBMP_JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ +#define CJPEG_WRBMP_JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see \ + xxx_SUPPORTED */ + +#include "cderror.h" /* get application-specific error codes */ +#include "jerror.h" /* get library error codes too */ +#include "jpeglib.h" + +typedef struct cjpeg_wrbmp_cjpeg_source_struct *cjpeg_wrbmp_cjpeg_source_ptr; + +struct cjpeg_wrbmp_cjpeg_source_struct { + CJPEG_WRBMP_JMETHOD(void, start_input, + (cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JDIMENSION, get_pixel_rows, + (cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo)); + CJPEG_WRBMP_JMETHOD(void, finish_input, + (cjpeg_wrbmp_j_compress_ptr cinfo, + cjpeg_wrbmp_cjpeg_source_ptr sinfo)); + + CJPEG_WRBMP_FILE *input_file; + + CJPEG_WRBMP_JSAMPARRAY buffer; + CJPEG_WRBMP_JDIMENSION buffer_height; +}; + +typedef struct cjpeg_wrbmp_djpeg_dest_struct *cjpeg_wrbmp_djpeg_dest_ptr; + +struct cjpeg_wrbmp_djpeg_dest_struct { + CJPEG_WRBMP_JMETHOD(void, start_output, + (cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo)); + /* Emit the specified number of pixel rows from the buffer. */ + CJPEG_WRBMP_JMETHOD(void, put_pixel_rows, + (cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo, + CJPEG_WRBMP_JDIMENSION rows_supplied)); + /* Finish up at the end of the image. */ + CJPEG_WRBMP_JMETHOD(void, finish_output, + (cjpeg_wrbmp_j_decompress_ptr cinfo, + cjpeg_wrbmp_djpeg_dest_ptr dinfo)); + + /* Target file spec; filled in by djpeg.c after object is created. */ + CJPEG_WRBMP_FILE *output_file; + + /* Output pixel-row buffer. Created by module init or start_output. + Width is cinfo->output_width * cinfo->output_components; + height is buffer_height. + */ + CJPEG_WRBMP_JSAMPARRAY buffer; + CJPEG_WRBMP_JDIMENSION buffer_height; +}; + +/* + cjpeg/djpeg may need to perform extra passes to convert to or from + the source/destination file format. The JPEG library does not know + about these passes, but we'd like them to be counted by the progress + monitor. We use an expanded progress monitor object to hold the + additional pass count. +*/ + +struct cjpeg_wrbmp_cdjpeg_progress_mgr { + struct cjpeg_wrbmp_jpeg_progress_mgr pub; /* fields known to JPEG library */ + int completed_extra_passes; /* extra passes completed */ + int total_extra_passes; /* total extra */ + /* last printed percentage stored here to avoid multiple printouts */ + int percent_done; +}; + +typedef struct cjpeg_wrbmp_cdjpeg_progress_mgr *cjpeg_wrbmp_cd_progress_ptr; + +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cjpeg_wrbmp.c b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cjpeg_wrbmp.c new file mode 100644 index 0000000..5fe71e8 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/cjpeg_wrbmp.c @@ -0,0 +1,228 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cjpeg_jpeg6b_wrbmp.c + + Author: Thomas G. Lane. + + Function: This file contains routines to write output images in Microsoft + "BMP" format (MS Windows 3.x and OS/2 1.x flavors). Either 8-bit colormapped + or 24-bit full-color format can be written. No compression is supported. + + These routines may need modification for non-Unix environments or + specialized applications. As they stand, they assume output to + an ordinary stdio stream. + + Source: Independent JPEG Group's software + + Changes: a brief summary of major functional changes (not formatting) + + License: See the accompanying README file + +*/ + +#include "cdjpeg.h" + +// Wasm loop bounds + + +#include "input.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifdef CJPEG_WRBMP_BMP_SUPPORTED + +/* + Declaration of global variables +*/ +typedef struct { + struct cjpeg_wrbmp_djpeg_dest_struct pub; /* public fields */ + cjpeg_wrbmp_boolean is_os2; /* saves the OS2 format request flag */ + cjpeg_wrbmp_jvirt_sarray_ptr whole_image; /* needed to reverse row order */ + CJPEG_WRBMP_JDIMENSION data_width; /* JSAMPLEs per row */ + CJPEG_WRBMP_JDIMENSION + row_width; /* physical width of one row in the BMP file */ + int pad_bytes; /* number of padding bytes needed per row */ + CJPEG_WRBMP_JDIMENSION + cur_output_row; /* next row# to write to virtual array */ +} cjpeg_wrbmp_bmp_dest_struct; + +typedef cjpeg_wrbmp_bmp_dest_struct *cjpeg_wrbmp_bmp_dest_ptr; +extern unsigned char cjpeg_wrbmp_colormap[3][256]; +unsigned char cjpeg_wrbmp_output_array[6144]; +unsigned char *cjpeg_wrbmp_jpeg_stream /*= cjpeg_jpeg6b_wrbmp_output_array*/; +int cjpeg_wrbmp_checksum; + +struct cjpeg_wrbmp_jpeg_decompress_struct cjpeg_wrbmp_jpeg_dec_1; +struct cjpeg_wrbmp_jpeg_decompress_struct cjpeg_wrbmp_jpeg_dec_2; +struct cjpeg_wrbmp_djpeg_dest_struct cjpeg_wrbmp_djpeg_dest; +cjpeg_wrbmp_bmp_dest_struct cjpeg_wrbmp_bmp_dest; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void cjpeg_wrbmp_initInput(void); +__attribute__((always_inline)) static inline void +cjpeg_wrbmp_finish_output_bmp(cjpeg_wrbmp_j_decompress_ptr cinfo); +__attribute__((always_inline)) static inline void +cjpeg_wrbmp_write_colormap(cjpeg_wrbmp_j_decompress_ptr cinfo, int map_colors, + int map_entry_size, int cMap); +__attribute__((always_inline)) static inline int +cjpeg_wrbmp_putc_modified(int character); +__attribute__((always_inline)) static inline void cjpeg_wrbmp_init(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_wrbmp_main(); +__attribute__((always_inline)) static inline int cjpeg_wrbmp_return(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(); + +/* + Initialization functions +*/ +__attribute__((always_inline)) static inline void +cjpeg_wrbmp_init() { + cjpeg_wrbmp_initInput(); + + cjpeg_wrbmp_jpeg_dec_1.progress = 0; + cjpeg_wrbmp_jpeg_dec_1.output_height = 30; + cjpeg_wrbmp_jpeg_dec_1.actual_number_of_colors = 256; + cjpeg_wrbmp_jpeg_dec_1.out_color_components = 2; + + cjpeg_wrbmp_jpeg_dec_2.progress = 0; + cjpeg_wrbmp_jpeg_dec_2.output_height = 30; + cjpeg_wrbmp_jpeg_dec_2.actual_number_of_colors = 256; + cjpeg_wrbmp_jpeg_dec_2.out_color_components = 3; + + cjpeg_wrbmp_jpeg_stream = cjpeg_wrbmp_output_array; + + cjpeg_wrbmp_checksum = 0; +} + +/* + Calculation functions +*/ +__attribute__((always_inline)) static inline int +cjpeg_wrbmp_putc_modified(int character) { + *(cjpeg_wrbmp_jpeg_stream) = character; + + ++cjpeg_wrbmp_jpeg_stream; + + cjpeg_wrbmp_checksum += character; + + return character; +} + +__attribute__((always_inline)) static inline void +cjpeg_wrbmp_finish_output_bmp(cjpeg_wrbmp_j_decompress_ptr cinfo) { + CJPEG_WRBMP_JDIMENSION row; + cjpeg_wrbmp_cd_progress_ptr progress = + (cjpeg_wrbmp_cd_progress_ptr) cinfo->progress; + + // Write the file body from our virtual array + __pragma_loopbound(30, 30); + for (row = cinfo->output_height; row > 0; --row) { + if (progress != 0) { + progress->pub.pass_counter = (long) (cinfo->output_height - row); + progress->pub.pass_limit = (long) cinfo->output_height; + } + } + + if (progress != 0) + progress->completed_extra_passes++; +} + +__attribute__((always_inline)) static inline void +cjpeg_wrbmp_write_colormap(cjpeg_wrbmp_j_decompress_ptr cinfo, int map_colors, + int map_entry_size, int cMap) { + + int num_colors = cinfo->actual_number_of_colors; + int i; + + if (cMap != 0) { + + if (cinfo->out_color_components == 3) { + // Normal case with RGB colormap + __pragma_loopbound(256, 256); + for (i = 0; i < num_colors; i++) { + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[2][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[1][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[0][i])); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } + } else { + // Grayscale colormap (only happens with grayscale quantization) + __pragma_loopbound(256, 256); + for (i = 0; i < num_colors; i++) { + + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[2][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[1][i])); + cjpeg_wrbmp_putc_modified( + CJPEG_WRBMP_GETJSAMPLE(cjpeg_wrbmp_colormap[0][i])); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } + } + } else { + // If no colormap, must be grayscale data. Generate a linear "map". + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) { + cjpeg_wrbmp_putc_modified(i); + cjpeg_wrbmp_putc_modified(i); + cjpeg_wrbmp_putc_modified(i); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } + } + + // Pad colormap with zeros to ensure specified number of colormap entries. + __pragma_loopbound(512, 512); + for (; i < map_colors; i++) { + cjpeg_wrbmp_putc_modified(0); + cjpeg_wrbmp_putc_modified(0); + cjpeg_wrbmp_putc_modified(0); + + if (map_entry_size == 4) + cjpeg_wrbmp_putc_modified(0); + } +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cjpeg_wrbmp_main() { + cjpeg_wrbmp_finish_output_bmp(&cjpeg_wrbmp_jpeg_dec_1); + cjpeg_wrbmp_write_colormap(&cjpeg_wrbmp_jpeg_dec_1, 768, 4, 1); + + cjpeg_wrbmp_finish_output_bmp(&cjpeg_wrbmp_jpeg_dec_2); + cjpeg_wrbmp_write_colormap(&cjpeg_wrbmp_jpeg_dec_2, 768, 4, 1); +} + +__attribute__((always_inline)) static inline int +cjpeg_wrbmp_return() { + return (cjpeg_wrbmp_checksum + (-209330)) != 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cjpeg_wrbmp_init(); + cjpeg_wrbmp_main(); + + return (cjpeg_wrbmp_return()); +} + +#endif /* BMP_SUPPORTED */ diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/input.c b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/input.c new file mode 100644 index 0000000..d8a8cea --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/input.c @@ -0,0 +1,95 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: input.c + + Author: Thomas G. Lane. + + Function: Input variables for the cjpeg_jpeg6b_wrbmp.c + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +unsigned char cjpeg_wrbmp_colormap[3][256]; + +__attribute__((always_inline)) static inline void +cjpeg_wrbmp_initInput(void) { + int i, j; + volatile unsigned char tmp[3][256] = { + {44, 105, 153, 71, 151, 160, 188, 90, 209, 131, 221, 114, 93, 124, + 208, 207, 218, 54, 145, 113, 153, 239, 226, 83, 243, 151, 98, 67, + 114, 153, 83, 186, 116, 72, 188, 190, 109, 162, 218, 133, 208, 209, + 115, 251, 135, 89, 143, 226, 230, 246, 152, 243, 152, 115, 180, 78, + 246, 164, 250, 117, 76, 150, 152, 188, 251, 195, 127, 111, 225, 208, + 94, 93, 143, 131, 201, 211, 99, 93, 190, 157, 121, 240, 117, 185, + 167, 137, 152, 188, 250, 59, 248, 245, 115, 240, 192, 209, 143, 136, + 98, 224, 167, 135, 132, 189, 72, 249, 205, 44, 106, 96, 147, 247, + 249, 228, 224, 249, 190, 112, 135, 168, 95, 205, 171, 58, 112, 79, + 206, 75, 242, 188, 189, 225, 185, 81, 221, 153, 244, 198, 171, 163, + 159, 209, 240, 138, 148, 207, 166, 192, 188, 151, 98, 190, 209, 154, + 225, 72, 96, 249, 191, 223, 207, 163, 207, 133, 251, 183, 135, 137, + 159, 247, 167, 83, 123, 199, 203, 144, 142, 237, 77, 128, 117, 169, + 202, 136, 128, 188, 168, 55, 222, 169, 116, 60, 75, 175, 102, 217, + 168, 185, 189, 225, 125, 192, 112, 111, 168, 239, 225, 168, 97, 129, + 190, 175, 169, 225, 170, 226, 225, 226, 224, 134, 106, 250, 222, 148, + 241, 168, 166, 160, 95, 190, 102, 180, 193, 111, 151, 165, 171, 200, + 52, 134, 169, 223, 166, 225, 169, 111, 185, 109, 56, 244, 157, 250, + 226, 231, 119, 188}, + {42, 143, 46, 91, 84, 201, 140, 91, 82, 140, 31, 88, 44, 171, + 57, 115, 206, 59, 145, 117, 116, 53, 232, 117, 80, 60, 66, 64, + 117, 174, 89, 178, 147, 63, 83, 59, 103, 139, 211, 64, 68, 98, + 118, 53, 119, 90, 161, 232, 171, 98, 176, 236, 118, 157, 180, 77, + 114, 88, 28, 119, 40, 97, 69, 189, 252, 225, 119, 96, 219, 84, + 82, 105, 158, 49, 200, 61, 117, 78, 63, 147, 140, 69, 108, 90, + 161, 105, 190, 114, 84, 76, 70, 43, 156, 222, 96, 72, 143, 90, + 105, 56, 144, 78, 129, 35, 66, 101, 100, 49, 105, 130, 160, 239, + 129, 141, 83, 43, 68, 106, 132, 83, 92, 130, 175, 63, 131, 79, + 192, 105, 57, 160, 118, 162, 141, 78, 192, 128, 206, 201, 203, 162, + 159, 163, 221, 183, 157, 177, 189, 192, 129, 130, 54, 104, 45, 101, + 252, 52, 91, 177, 49, 221, 116, 111, 143, 92, 142, 159, 131, 173, + 61, 159, 173, 81, 129, 214, 213, 145, 143, 232, 67, 145, 130, 99, + 237, 110, 160, 131, 67, 50, 129, 131, 127, 76, 92, 203, 96, 206, + 176, 180, 85, 99, 162, 118, 64, 78, 190, 191, 45, 101, 129, 58, + 72, 211, 49, 115, 115, 85, 61, 100, 116, 107, 143, 117, 219, 154, + 225, 174, 160, 163, 119, 190, 106, 186, 49, 45, 177, 147, 85, 138, + 42, 174, 59, 68, 120, 71, 129, 56, 149, 97, 68, 88, 148, 60, + 239, 179, 149, 104}, + {44, 76, 37, 56, 76, 152, 122, 153, 77, 191, 41, 76, 39, 97, + 46, 109, 172, 43, 116, 91, 102, 49, 201, 68, 88, 45, 53, 95, + 160, 175, 102, 164, 116, 50, 76, 45, 86, 189, 216, 50, 61, 93, + 196, 91, 100, 58, 116, 223, 166, 102, 126, 221, 158, 86, 235, 55, + 113, 120, 52, 115, 42, 86, 55, 165, 247, 194, 160, 108, 170, 108, + 98, 77, 168, 42, 179, 70, 96, 62, 71, 216, 100, 71, 155, 121, + 146, 86, 134, 105, 114, 49, 100, 50, 119, 218, 95, 81, 220, 78, + 102, 50, 125, 68, 170, 36, 62, 119, 129, 44, 151, 72, 143, 241, + 131, 137, 79, 73, 55, 122, 204, 73, 74, 131, 221, 53, 89, 72, + 178, 60, 64, 145, 157, 156, 177, 101, 180, 112, 194, 206, 178, 168, + 221, 153, 201, 119, 222, 165, 188, 212, 117, 180, 45, 134, 42, 130, + 229, 47, 107, 172, 40, 221, 146, 132, 138, 110, 144, 188, 112, 132, + 64, 162, 145, 140, 200, 181, 215, 139, 197, 183, 106, 126, 116, 89, + 204, 152, 123, 161, 52, 46, 131, 167, 173, 62, 70, 151, 151, 197, + 177, 184, 96, 97, 101, 130, 54, 63, 141, 185, 45, 126, 96, 46, + 71, 172, 38, 114, 100, 106, 69, 118, 138, 127, 99, 127, 198, 204, + 242, 248, 197, 241, 74, 189, 178, 252, 65, 45, 148, 145, 97, 168, + 45, 111, 43, 64, 164, 80, 113, 47, 136, 83, 42, 91, 197, 95, + 222, 167, 92, 98}}; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; i++) { + __pragma_loopbound(256, 256); + for (j = 0; j < 256; j++) + cjpeg_wrbmp_colormap[i][j] = tmp[i][j]; + } +} diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jconfig.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jconfig.h new file mode 100644 index 0000000..df0feed --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jconfig.h @@ -0,0 +1,65 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cderror.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README files +*/ + +#ifndef JCONFIG_H +#define JCONFIG_H + +#define CJPEG_WRBMP_HAVE_PROTOTYPES +#define CJPEG_WRBMP_HAVE_UNSIGNED_CHAR +#define CJPEG_WRBMP_HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#define CJPEG_WRBMP_HAVE_STDDEF_H +#define CJPEG_WRBMP_HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef CJPEG_JPEG6B_WRBMP_NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef CJPEG_JPEG6B_WRBMP_JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef CJPEG_WRBMP_JPEG_CJPEG_DJPEG + +#define CJPEG_WRBMP_BMP_SUPPORTED /* BMP image file format */ +#define CJPEG_WRBMP_GIF_SUPPORTED /* GIF image file format */ +#define CJPEG_WRBMP_PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define CJPEG_WRBMP_TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ + +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jerror.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jerror.h new file mode 100644 index 0000000..f46475d --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jerror.h @@ -0,0 +1,333 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jerror.h + + Author: Thomas G. Lane. + + This file defines the error and message codes for the JPEG library. + Edit this file to add new codes, or to translate the message strings to + some other language. + A set of error-reporting macros are defined too. Some applications using + the JPEG library may wish to include this file to get the error codes + sand/or the macros. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +/* + To define the enum list of message codes, include this file without + defining macro JMESSAGE. To create a message string table, include it + again with a suitable JMESSAGE definition (see jerror.c for an example). +*/ + +#ifndef CJPEG_WRBMP_JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define CJPEG_WRBMP_JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define CJPEG_WRBMP_JMESSAGE(code, string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + +typedef enum { + +#define CJPEG_WRBMP_JMESSAGE(code, string) code, + +#endif /* JMAKE_ENUM_LIST */ + + CJPEG_WRBMP_JMESSAGE(JMSG_NOMESSAGE, + "Bogus message code %d") /* Must be first entry! */ + + /* For maintenance convenience, list is alphabetical by message code name */ + CJPEG_WRBMP_JMESSAGE( + JERR_ARITH_NOTIMPL, + "Sorry, there are legal " + "restrictions on arithmetic " + "coding") CJPEG_WRBMP_JMESSAGE(JERR_BAD_ALIGN_TYPE, + "ALIGN_TYPE is wrong, please fix") + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_ALLOC_CHUNK, + "MAX_ALLOC_" + "CHUNK is " + "wrong, please " + "fix") CJPEG_WRBMP_JMESSAGE(JERR_BAD_BUFFER_MODE, + "Bogus buffer control mode") + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_COMPONENT_ID, + "Invalid " + "component ID %d " + "in SOS") CJPEG_WRBMP_JMESSAGE(JERR_BAD_DCT_COEF, + "DCT coefficient out of " + "range") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_DCTSIZE, + "IDCT output block size %d not supported") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_HUFF_TABLE, + "Bogus Huffman table " + "definition") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_IN_COLORSPACE, + "Bogus input colorspace") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_J_COLORSPACE, + "Bogus JPEG colorspace") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_LENGTH, "Bogus " + "marker " + "length") + CJPEG_WRBMP_JMESSAGE( + JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: " + "library is %d, caller expects %d") + CJPEG_WRBMP_JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large " + "for interleaved scan") CJPEG_WRBMP_JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code " + "%d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_PRECISION, + "Unsupported JPEG data precision %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_PROGRESSION, "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_PROG_SCRIPT, "Invalid progressive parameters at scan script entry %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_SAMPLING, + "Bogus sampling factors") CJPEG_WRBMP_JMESSAGE(JERR_BAD_SCAN_SCRIPT, + "Invalid scan script at entry %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_STATE, + "Improper call to JPEG library in state %d") CJPEG_WRBMP_JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") CJPEG_WRBMP_JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") CJPEG_WRBMP_JMESSAGE(JERR_BUFFER_SIZE, + "Buffer passed to JPEG library is too small") CJPEG_WRBMP_JMESSAGE(JERR_CANT_SUSPEND, + "Suspension not allowed here") CJPEG_WRBMP_JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") CJPEG_WRBMP_JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") CJPEG_WRBMP_JMESSAGE(JERR_CONVERSION_NOTIMPL, + "Unsupported color conversion request") CJPEG_WRBMP_JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") CJPEG_WRBMP_JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") CJPEG_WRBMP_JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") CJPEG_WRBMP_JMESSAGE(JERR_DQT_INDEX, + "Bogus DQT index %d") CJPEG_WRBMP_JMESSAGE(JERR_EMPTY_IMAGE, + "Empty JPEG image (DNL not supported)") CJPEG_WRBMP_JMESSAGE(JERR_EMS_READ, "Read from EMS failed") CJPEG_WRBMP_JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") CJPEG_WRBMP_JMESSAGE(JERR_EOI_EXPECTED, + "Didn't expect more than one scan") CJPEG_WRBMP_JMESSAGE(JERR_FILE_READ, "Input file read error") CJPEG_WRBMP_JMESSAGE(JERR_FILE_WRITE, + "Output file write error --- out of disk space?") CJPEG_WRBMP_JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, + "Fractional sampling not implemented yet") CJPEG_WRBMP_JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") CJPEG_WRBMP_JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") CJPEG_WRBMP_JMESSAGE(JERR_IMAGE_TOO_BIG, + "Maximum supported image dimension is %u pixels") CJPEG_WRBMP_JMESSAGE(JERR_INPUT_EMPTY, + "Empty input file") CJPEG_WRBMP_JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") CJPEG_WRBMP_JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, "Cannot transcode due to multiple use of quantization table %d") CJPEG_WRBMP_JMESSAGE(JERR_MISSING_DATA, + "Scan script does not transmit all data") CJPEG_WRBMP_JMESSAGE(JERR_MODE_CHANGE, + "Invalid color quantization mode change") CJPEG_WRBMP_JMESSAGE(JERR_NOTIMPL, "Not implemented yet") CJPEG_WRBMP_JMESSAGE(JERR_NOT_COMPILED, + "Requested feature was omitted at compile time") CJPEG_WRBMP_JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") CJPEG_WRBMP_JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") CJPEG_WRBMP_JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") CJPEG_WRBMP_JMESSAGE(JERR_NO_QUANT_TABLE, + "Quantization table 0x%02x was not defined") CJPEG_WRBMP_JMESSAGE(JERR_NO_SOI, + "Not a JPEG file: starts with 0x%02x 0x%02x") CJPEG_WRBMP_JMESSAGE(JERR_OUT_OF_MEMORY, + "Insufficient memory (case %d)") CJPEG_WRBMP_JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") CJPEG_WRBMP_JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") CJPEG_WRBMP_JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") + CJPEG_WRBMP_JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") CJPEG_WRBMP_JMESSAGE( + JERR_SOF_NO_SOS, "Invalid JPEG " + "file " + "structure: " + "missing SOS " + "marker") CJPEG_WRBMP_JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") + CJPEG_WRBMP_JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") CJPEG_WRBMP_JMESSAGE( + JERR_SOS_NO_SOF, "Invalid " + "JPEG " + "file " + "structure" + ": SOS " + "before " + "SOF") CJPEG_WRBMP_JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") + CJPEG_WRBMP_JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") CJPEG_WRBMP_JMESSAGE(JERR_TFILE_SEEK, + "Seek failed on temporary file") CJPEG_WRBMP_JMESSAGE(JERR_TFILE_WRITE, "Write failed on temporary file --- out of disk space?") CJPEG_WRBMP_JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") CJPEG_WRBMP_JMESSAGE(JERR_UNKNOWN_MARKER, + "Unsupported marker type 0x%02x") CJPEG_WRBMP_JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") CJPEG_WRBMP_JMESSAGE(JERR_WIDTH_OVERFLOW, + "Image too wide for this implementation") CJPEG_WRBMP_JMESSAGE(JERR_XMS_READ, + "Read from XMS failed") CJPEG_WRBMP_JMESSAGE(JERR_XMS_WRITE, + "Write to XMS failed") CJPEG_WRBMP_JMESSAGE(JMSG_COPYRIGHT, + JCOPYRIGHT) CJPEG_WRBMP_JMESSAGE(JMSG_VERSION, JVERSION) CJPEG_WRBMP_JMESSAGE(JTRC_16BIT_TABLES, "Caution: quantization tables are too coarse for baseline JPEG") CJPEG_WRBMP_JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") CJPEG_WRBMP_JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") CJPEG_WRBMP_JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") CJPEG_WRBMP_JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_DQT, + "Define Quantization Table %d precision %d") CJPEG_WRBMP_JMESSAGE(JTRC_DRI, + "Define Restart Interval %u") CJPEG_WRBMP_JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") CJPEG_WRBMP_JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") CJPEG_WRBMP_JMESSAGE(JTRC_EOI, + "End Of Image") CJPEG_WRBMP_JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, "Warning: thumbnail image size does not match data length %u") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_JFIF_THUMBNAIL, + " with %d x %d thumbnail image") CJPEG_WRBMP_JMESSAGE(JTRC_MISC_MARKER, + "Miscellaneous marker 0x%02x, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") CJPEG_WRBMP_JMESSAGE(JTRC_QUANTVALS, + " %4u %4u %4u %4u %4u %4u %4u %4u") CJPEG_WRBMP_JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") CJPEG_WRBMP_JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") CJPEG_WRBMP_JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") CJPEG_WRBMP_JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") CJPEG_WRBMP_JMESSAGE(JTRC_RST, "RST%d") CJPEG_WRBMP_JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") CJPEG_WRBMP_JMESSAGE(JTRC_SOF, + "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") CJPEG_WRBMP_JMESSAGE(JTRC_SOF_COMPONENT, + " Component %d: %dhx%dv q=%d") CJPEG_WRBMP_JMESSAGE(JTRC_SOI, "Start of Image") CJPEG_WRBMP_JMESSAGE(JTRC_SOS, + "Start Of Scan: %d components") CJPEG_WRBMP_JMESSAGE(JTRC_SOS_COMPONENT, + " Component %d: dc=%d ac=%d") CJPEG_WRBMP_JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") CJPEG_WRBMP_JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") CJPEG_WRBMP_JMESSAGE(JTRC_TFILE_OPEN, + "Opened temporary file %s") CJPEG_WRBMP_JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") CJPEG_WRBMP_JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized" + " component " + "IDs %d %d " + "%d, " + "assuming " + "YCbCr") CJPEG_WRBMP_JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") CJPEG_WRBMP_JMESSAGE(JTRC_XMS_OPEN, + "Obtained XMS handle %u") CJPEG_WRBMP_JMESSAGE(JWRN_ADOBE_XFORM, + "Unknown Adobe color " + "transform code %d") + CJPEG_WRBMP_JMESSAGE(JWRN_BOGUS_PROGRESSION, + "I" + "n" + "c" + "o" + "n" + "s" + "i" + "s" + "t" + "e" + "n" + "t" + " " + "p" + "r" + "o" + "g" + "r" + "e" + "s" + "s" + "i" + "o" + "n" + " " + "s" + "e" + "q" + "u" + "e" + "n" + "c" + "e" + " " + "f" + "o" + "r" + " " + "c" + "o" + "m" + "p" + "o" + "n" + "e" + "n" + "t" + " " + "%" + "d" + " " + "c" + "o" + "e" + "f" + "f" + "i" + "c" + "i" + "e" + "n" + "t" + " " + "%" + "d") CJPEG_WRBMP_JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u " + "extraneous bytes " + "before marker 0x%02x") + CJPEG_WRBMP_JMESSAGE( + JWRN_HIT_MARKER, + "Corrupt JPEG " + "data: " + "premature end " + "of data " + "segment") + CJPEG_WRBMP_JMESSAGE( + JWRN_HUFF_BAD_CODE, + "Corrupt " + "JPEG " + "data: bad " + "Huffman " + "code") + CJPEG_WRBMP_JMESSAGE( + JWRN_JFIF_MAJOR, + "Warnin" + "g: " + "unknow" + "n " + "JFIF " + "revisi" + "on " + "number" + " " + "%d.%" + "02d") CJPEG_WRBMP_JMESSAGE(JWRN_JPEG_EOF, + "Premature end of JPEG file") + CJPEG_WRBMP_JMESSAGE( + JWRN_MUST_RESYNC, + "Co" + "rr" + "up" + "t " + "JP" + "EG" + " " + "da" + "ta" + ": " + "fo" + "un" + "d " + "ma" + "rk" + "er" + " " + "0x" + "%0" + "2x" + " " + "in" + "st" + "ea" + "d " + "of" + " R" + "ST" + "%" + "d") + CJPEG_WRBMP_JMESSAGE( + JWRN_NOT_SEQUENTIAL, + "Invali" + "d SOS " + "parame" + "ters " + "for " + "sequen" + "tial " + "JPEG") + CJPEG_WRBMP_JMESSAGE( + JWRN_TOO_MUCH_DATA, + "Ap" + "pl" + "ic" + "at" + "io" + "n " + "tr" + "an" + "sf" + "er" + "re" + "d " + "to" + "o " + "ma" + "ny" + " s" + "ca" + "nl" + "in" + "e" + "s") + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} CJPEG_WRBMP_J_MESSAGE_CODE; + +#undef CJPEG_WRBMP_JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef CJPEG_WRBMP_JMESSAGE diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jmorecfg.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jmorecfg.h new file mode 100644 index 0000000..9059775 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jmorecfg.h @@ -0,0 +1,91 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jmorecfg.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains additional configuration options that customize the + JPEG software for special applications or support machine-dependent + optimizations. Most users will not need to touch this file. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +#ifndef JMORECFG_H +#define JMORECFG_H + +#define CJPEG_WRBMP_GETJSAMPLE(value) ((int) (value)) + +typedef unsigned char CJPEG_WRBMP_JSAMPLE; +typedef short CJPEG_WRBMP_JCOEF; +typedef unsigned char CJPEG_WRBMP_JOCTET; + +/* These typedefs are used for various table entries and so forth. + They must be at least as wide as specified; but making them too big + won't cost a huge amount of memory, so we don't provide special + extraction code like we did for JSAMPLE. (In other words, these + typedefs live at a different point on the speed/space tradeoff curve.) +*/ + +/* UINT8 must hold at least the values 0..255. */ + +typedef unsigned char CJPEG_WRBMP_UINT8; + +/* UINT16 must hold at least the values 0..65535. */ + +typedef unsigned short CJPEG_WRBMP_UINT16; + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +typedef long INT32; +#endif + +typedef unsigned int CJPEG_WRBMP_JDIMENSION; + +/* This macro is used to declare a "method", that is, a function pointer. + We want to supply prototype parameters if the compiler can cope. + Note that the arglist parameter must be parenthesized! + Again, you can customize this if you need special linkage keywords. +*/ + +#define EXTERN(type) extern type + +#ifdef CJPEG_WRBMP_HAVE_PROTOTYPES +#define CJPEG_WRBMP_JMETHOD(type, methodname, arglist) type(*methodname) arglist +#else +#define CJPEG_WRBMP_JMETHOD(type, methodname, arglist) type (*methodname)() +#endif + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + on 80x86 machines. Most of the specialized coding for 80x86 is handled + by just saying "FAR *" where such a pointer is needed. In a few places + explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. +*/ + +#ifdef CJPEG_JPEG6B_WRBMP_NEED_FAR_POINTERS +#define CJPEG_WRBMP_FAR far +#else +#define CJPEG_WRBMP_FAR +#endif + +#ifndef CJPEG_JPEG6B_WRBMP_HAVE_BOOLEAN +typedef int cjpeg_wrbmp_boolean; +#endif +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jpeglib.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jpeglib.h new file mode 100644 index 0000000..22653dd --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/generated/modified_sources/inline/jpeglib.h @@ -0,0 +1,844 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jpeglib.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file defines the application interface for the JPEG library. + Most applications using the library need only include this file, + and perhaps jerror.h if they want to know the exact error codes. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +typedef int CJPEG_WRBMP_FILE; +typedef unsigned int cjpeg_wrbmp_size_t; + +/* + First we include the configuration files that record how this + installation of the JPEG library is set up. jconfig.h can be + generated automatically for many systems. jmorecfg.h contains + manual configuration options that most people need not worry about. +*/ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + +/* Data structures for images (arrays of samples and of DCT coefficients). + On 80x86 machines, the image arrays are too big for near pointers, + but the pointer arrays can fit in near memory. +*/ + +typedef CJPEG_WRBMP_JSAMPLE CJPEG_WRBMP_FAR + *CJPEG_WRBMP_JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef CJPEG_WRBMP_JSAMPROW + *CJPEG_WRBMP_JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef CJPEG_WRBMP_JSAMPARRAY + *CJPEG_WRBMP_JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef CJPEG_WRBMP_JCOEF + CJPEG_WRBMP_JBLOCK[64]; /* one block of coefficients */ +typedef CJPEG_WRBMP_JBLOCK CJPEG_WRBMP_FAR + *CJPEG_WRBMP_JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef CJPEG_WRBMP_JBLOCKROW + *CJPEG_WRBMP_JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef CJPEG_WRBMP_JBLOCKARRAY + *CJPEG_WRBMP_JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef CJPEG_WRBMP_JCOEF CJPEG_WRBMP_FAR + *JCOEFPTR; /* useful in a couple of places */ + +/* Types for JPEG compression parameters and working tables. */ + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + (not the zigzag order in which they are stored in a JPEG DQT marker). + CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + CJPEG_WRBMP_UINT16 + quantval[64]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + the table is created, and set TRUE when it's been output to the file. + You could suppress output of a table by setting this to TRUE. + (See jpeg_suppress_tables for an example.) + */ + cjpeg_wrbmp_boolean sent_table; /* TRUE when table has been output */ +} CJPEG_WRBMP_JQUANT_TBL; + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + CJPEG_WRBMP_UINT8 bits[17]; /* bits[ k ] = # of symbols with codes of */ + /* length k bits; bits[ 0 ] is unused */ + CJPEG_WRBMP_UINT8 + huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + the table is created, and set TRUE when it's been output to the file. + You could suppress output of a table by setting this to TRUE. + (See jpeg_suppress_tables for an example.) + */ + cjpeg_wrbmp_boolean sent_table; /* TRUE when table has been output */ +} CJPEG_WRBMP_JHUFF_TBL; + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[ ] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + Any dummy blocks added to complete an MCU are not counted; therefore + these values do not depend on whether a scan is interleaved or not. + */ + CJPEG_WRBMP_JDIMENSION width_in_blocks; + CJPEG_WRBMP_JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + For decompression this is the size of the output from one DCT block, + reflecting any scaling we choose to apply during the IDCT step. + Values of 1,2,4,8 are likely to be supported. Note that different + components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + of samples at the main buffer (preprocessing/compression interface), thus + downsampled_width = ceil(image_width * Hi/Hmax) + and similarly for height. For decompression, IDCT scaling is included, + so downsampled_width = ceil(image_width * Hi/Hmax * + DCT_scaled_size/DCTSIZE) + */ + CJPEG_WRBMP_JDIMENSION downsampled_width; /* actual width in samples */ + CJPEG_WRBMP_JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + components will be ignored (eg grayscale output from YCbCr image), + we can skip most computations for the unused components. + */ + cjpeg_wrbmp_boolean + component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + See jdinput.c comments about the need for this information. + This field is currently used only for decompression. + */ + CJPEG_WRBMP_JQUANT_TBL *quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void *dct_table; +} cjpeg_wrbmp_jpeg_component_info; + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[4]; /* their SOF/comp_info[ ] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} cjpeg_wrbmp_jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct cjpeg_wrbmp_jpeg_marker_struct CJPEG_WRBMP_FAR + *jpeg_saved_marker_ptr; + +struct cjpeg_wrbmp_jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + CJPEG_WRBMP_UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[ ] */ + CJPEG_WRBMP_JOCTET CJPEG_WRBMP_FAR + *data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length + */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} CJPEG_WRBMP_J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} CJPEG_WRBMP_J_DCT_METHOD; + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} CJPEG_WRBMP_J_DITHER_MODE; + +/* Common fields between JPEG compression and decompression master structs. */ + +#define cjpeg_wrbmp_jpeg_common_fields \ + struct cjpeg_wrbmp_jpeg_error_mgr *err; /* Error handler module */ \ + struct cjpeg_wrbmp_jpeg_memory_mgr *mem; /* Memory manager module */ \ + struct cjpeg_wrbmp_jpeg_progress_mgr \ + *progress; /* Progress monitor, or NULL if none */ \ + void *client_data; /* Available for use by application */ \ + cjpeg_wrbmp_boolean \ + is_decompressor; /* So common code can tell which is which */ \ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + to receive a pointer to this structure. There are no actual instances of + jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. +*/ +struct cjpeg_wrbmp_jpeg_common_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields common to both master struct types + */ + /* Additional fields follow in an actual jpeg_compress_struct or + jpeg_decompress_struct. All three structs must agree on these + initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct cjpeg_wrbmp_jpeg_common_struct *cjpeg_wrbmp_j_common_ptr; +typedef struct cjpeg_wrbmp_jpeg_compress_struct *cjpeg_wrbmp_j_compress_ptr; +typedef struct cjpeg_wrbmp_jpeg_decompress_struct *cjpeg_wrbmp_j_decompress_ptr; + +/* Master record for a compression instance */ + +struct cjpeg_wrbmp_jpeg_compress_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields shared with jpeg_decompress_struct + */ + + /* Destination for compressed data */ + struct cjpeg_wrbmp_jpeg_destination_mgr *dest; + + /* Description of source image --- these fields must be filled in by + outer application before starting compression. in_color_space must + be correct before you can even call jpeg_set_defaults(). + */ + + CJPEG_WRBMP_JDIMENSION image_width; /* input image width */ + CJPEG_WRBMP_JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + CJPEG_WRBMP_J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + float input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + initialize everything to reasonable defaults, then changing anything + the application specifically wants to change. That way you won't get + burnt when new parameters are added. Also note that there are several + helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + CJPEG_WRBMP_J_COLOR_SPACE + jpeg_color_space; /* colorspace of JPEG image */ + + cjpeg_wrbmp_jpeg_component_info *comp_info; + /* comp_info[ i ] describes component that appears i'th in SOF */ + + CJPEG_WRBMP_JQUANT_TBL *quant_tbl_ptrs[4]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + CJPEG_WRBMP_JHUFF_TBL *dc_huff_tbl_ptrs[4]; + CJPEG_WRBMP_JHUFF_TBL *ac_huff_tbl_ptrs[4]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + CJPEG_WRBMP_UINT8 + arith_dc_L[16]; /* L values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_dc_U[16]; /* U values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_ac_K[16]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const cjpeg_wrbmp_jpeg_scan_info + *scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + sequential JPEG file to be emitted. To create a multi-scan file, + set num_scans and scan_info to point to an array of scan definitions. + */ + + cjpeg_wrbmp_boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + cjpeg_wrbmp_boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + cjpeg_wrbmp_boolean + optimize_coding; /* TRUE=optimize entropy encoding parms */ + cjpeg_wrbmp_boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + CJPEG_WRBMP_J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + restart_interval, or in MCU rows by setting restart_in_rows + (in which case the correct restart_interval will be figured + for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + cjpeg_wrbmp_boolean + write_JFIF_header; /* should a JFIF marker be written? */ + CJPEG_WRBMP_UINT8 + JFIF_major_version; /* What to write for the JFIF version number */ + CJPEG_WRBMP_UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + CJPEG_WRBMP_UINT8 density_unit; /* JFIF code for pixel size units */ + CJPEG_WRBMP_UINT16 X_density; /* Horizontal pixel density */ + CJPEG_WRBMP_UINT16 Y_density; /* Vertical pixel density */ + cjpeg_wrbmp_boolean + write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + jpeg_write_scanlines(). Application may use this to control its + processing loop, e.g., "while (next_scanline < image_height)". + */ + + CJPEG_WRBMP_JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + should not be touched by a surrounding application. + */ + + /* + These fields are computed during compression startup + */ + cjpeg_wrbmp_boolean + progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + CJPEG_WRBMP_JDIMENSION + total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + for fully interleaved scans (whether the JPEG file is interleaved or + not). There are v_samp_factor * DCTSIZE sample rows of each component in + an "iMCU" (interleaved MCU) row. + */ + + /* + These fields are valid during any one scan. + They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + cjpeg_wrbmp_jpeg_component_info *cur_comp_info[4]; + /* *cur_comp_info[ i ] describes component that appears i'th in SOS */ + + CJPEG_WRBMP_JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + CJPEG_WRBMP_JDIMENSION + MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[10]; + /* MCU_membership[ i ] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + cjpeg_wrbmp_jpeg_scan_info + *script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + +/* Master record for a decompression instance */ + +struct cjpeg_wrbmp_jpeg_decompress_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields shared with jpeg_compress_struct + */ + + /* Source of compressed data */ + struct cjpeg_wrbmp_jpeg_source_mgr *src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + CJPEG_WRBMP_JDIMENSION + image_width; /* nominal image width (from SOF marker) */ + CJPEG_WRBMP_JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + CJPEG_WRBMP_J_COLOR_SPACE + jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + calling jpeg_start_decompress(). Note that jpeg_read_header() + initializes them to default values. + */ + + CJPEG_WRBMP_J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + float output_gamma; /* image gamma wanted in output */ + + cjpeg_wrbmp_boolean buffered_image; /* TRUE=multiple output passes */ + cjpeg_wrbmp_boolean raw_data_out; /* TRUE=downsampled data wanted */ + + CJPEG_WRBMP_J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + cjpeg_wrbmp_boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + cjpeg_wrbmp_boolean + do_block_smoothing; /* TRUE=apply interblock smoothing */ + + cjpeg_wrbmp_boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + CJPEG_WRBMP_J_DITHER_MODE + dither_mode; /* type of color dithering to use */ + cjpeg_wrbmp_boolean + two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + cjpeg_wrbmp_boolean + enable_1pass_quant; /* enable future use of 1-pass quantizer */ + cjpeg_wrbmp_boolean + enable_EXTERNal_quant; /* enable future use of EXTERNal colormap */ + cjpeg_wrbmp_boolean + enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + These fields are computed by jpeg_start_decompress(). + You can also use jpeg_calc_output_dimensions() to determine these values + in advance of calling jpeg_start_decompress(). + */ + + CJPEG_WRBMP_JDIMENSION output_width; /* scaled image width */ + CJPEG_WRBMP_JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + high, space and time will be wasted due to unnecessary data copying. + Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + The application can supply a colormap by setting colormap non-NULL before + calling jpeg_start_decompress; otherwise a colormap is created during + jpeg_start_decompress or jpeg_start_output. + The map has out_color_components rows and actual_number_of_colors + columns. + */ + int actual_number_of_colors; /* number of entries in use */ + CJPEG_WRBMP_JSAMPARRAY + colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + Application may use this to control its processing loop, e.g., + "while (output_scanline < output_height)". + */ + CJPEG_WRBMP_JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + CJPEG_WRBMP_JDIMENSION + input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + output side. The decompressor will not allow output scan/row number + to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + CJPEG_WRBMP_JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[ c ][ i ] indicates the precision + with which component c's DCT coefficient i (in zigzag order) is known. + It is -1 when no data has yet been received, otherwise it is the point + transform (shift) value for the most recent scan of the coefficient + (thus, 0 at completion of the progression). + This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[64]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + these fields. Note that the decompressor output side may not use + any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + datastreams when processing abbreviated JPEG datastreams. + */ + + CJPEG_WRBMP_JQUANT_TBL *quant_tbl_ptrs[4]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + CJPEG_WRBMP_JHUFF_TBL *dc_huff_tbl_ptrs[4]; + CJPEG_WRBMP_JHUFF_TBL *ac_huff_tbl_ptrs[4]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + cjpeg_wrbmp_jpeg_component_info *comp_info; + /* comp_info[ i ] describes component that appears i'th in SOF */ + + cjpeg_wrbmp_boolean + progressive_mode; /* TRUE if SOFn specifies progressive mode */ + cjpeg_wrbmp_boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + CJPEG_WRBMP_UINT8 + arith_dc_L[16]; /* L values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_dc_U[16]; /* U values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_ac_K[16]; /* Kx values for AC arith-coding tables */ + + unsigned int + restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + the JPEG library. + */ + cjpeg_wrbmp_boolean + saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + CJPEG_WRBMP_UINT8 JFIF_major_version; /* JFIF version number */ + CJPEG_WRBMP_UINT8 JFIF_minor_version; + CJPEG_WRBMP_UINT8 density_unit; /* JFIF code for pixel size units */ + CJPEG_WRBMP_UINT16 X_density; /* Horizontal pixel density */ + CJPEG_WRBMP_UINT16 Y_density; /* Vertical pixel density */ + cjpeg_wrbmp_boolean + saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + CJPEG_WRBMP_UINT8 + Adobe_transform; /* Color transform code from Adobe marker */ + + cjpeg_wrbmp_boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + library, the uninterpreted contents of any or all APPn and COM markers + can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + should not be touched by a surrounding application. + */ + + /* + These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + CJPEG_WRBMP_JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + in fully interleaved JPEG scans, but are used whether the scan is + interleaved or not. We define an iMCU row as v_samp_factor DCT block + rows of each component. Therefore, the IDCT output contains + v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + CJPEG_WRBMP_JSAMPLE + *sample_range_limit; /* table for fast range-limiting */ + + /* + These fields are valid during any one scan. + They describe the components and MCUs actually appearing in the scan. + Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + cjpeg_wrbmp_jpeg_component_info *cur_comp_info[4]; + /* *cur_comp_info[ i ] describes component that appears i'th in SOS */ + + CJPEG_WRBMP_JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + CJPEG_WRBMP_JDIMENSION + MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[10]; + /* MCU_membership[ i ] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + It is either zero or the code of a JPEG marker that has been + read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master *master; + struct jpeg_d_main_controller *main; + struct jpeg_d_coef_controller *coef; + struct jpeg_d_post_controller *post; + struct jpeg_input_controller *inputctl; + struct jpeg_marker_reader *marker; + struct jpeg_entropy_decoder *entropy; + struct jpeg_inverse_dct *idct; + struct jpeg_upsampler *upsample; + struct jpeg_color_deconverter *cconvert; + struct jpeg_color_quantizer *cquantize; +}; + +/* "Object" declarations for JPEG modules that may be supplied or called + directly by the surrounding application. + As with all objects in the JPEG library, these structs only define the + publicly visible methods and state variables of a module. Additional + private fields may exist after the public ones. +*/ + +/* Error handler object */ + +struct cjpeg_wrbmp_jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + CJPEG_WRBMP_JMETHOD(void, error_exit, (cjpeg_wrbmp_j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + CJPEG_WRBMP_JMETHOD(void, emit_message, + (cjpeg_wrbmp_j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + CJPEG_WRBMP_JMETHOD(void, output_message, (cjpeg_wrbmp_j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + CJPEG_WRBMP_JMETHOD(void, format_message, + (cjpeg_wrbmp_j_common_ptr cinfo, char *buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + CJPEG_WRBMP_JMETHOD(void, reset_error_mgr, + (cjpeg_wrbmp_j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + /* + union { + int i[ 8 ]; + char s[ JMSG_STR_PARM_MAX ]; + } msg_parm; + */ + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + but keep going unless emit_message chooses to abort. emit_message + should count warnings in num_warnings. The surrounding application + can check for bad data by seeing if num_warnings is nonzero at the + end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + An application can change the table pointer to switch to a different + message list (typically, to change the language in which errors are + reported). Some applications may wish to add additional error codes + that will be handled by the JPEG library error mechanism; the second + table pointer is used for this purpose. + + First table includes all errors generated by JPEG library itself. + Error code 0 is reserved for a "no such error string" message. + */ + const char *const *jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + It contains strings numbered first_addon_message..last_addon_message. + */ + const char *const *addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + +/* Progress monitor object */ + +struct cjpeg_wrbmp_jpeg_progress_mgr { + CJPEG_WRBMP_JMETHOD(void, progress_monitor, + (cjpeg_wrbmp_j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + +/* Data destination object for compression */ + +struct cjpeg_wrbmp_jpeg_destination_mgr { + CJPEG_WRBMP_JOCTET + *next_output_byte; /* => next byte to write in buffer */ + cjpeg_wrbmp_size_t + free_in_buffer; /* # of byte spaces remaining in buffer */ + + CJPEG_WRBMP_JMETHOD(void, init_destination, + (cjpeg_wrbmp_j_compress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, empty_output_buffer, + (cjpeg_wrbmp_j_compress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(void, term_destination, + (cjpeg_wrbmp_j_compress_ptr cinfo)); +}; + +/* Data source object for decompression */ + +struct cjpeg_wrbmp_jpeg_source_mgr { + const CJPEG_WRBMP_JOCTET + *next_input_byte; /* => next byte to read from buffer */ + cjpeg_wrbmp_size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + CJPEG_WRBMP_JMETHOD(void, init_source, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, fill_input_buffer, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(void, skip_input_data, + (cjpeg_wrbmp_j_decompress_ptr cinfo, long num_bytes)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, resync_to_restart, + (cjpeg_wrbmp_j_decompress_ptr cinfo, int desired)); + CJPEG_WRBMP_JMETHOD(void, term_source, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); +}; + +/* Memory manager object. + Allocates "small" objects (a few K total), "large" objects (tens of K), + and "really big" objects (virtual arrays with backing store if needed). + The memory manager does not allow individual objects to be freed; rather, + each created object is assigned to a pool, and whole pools can be freed + at once. This is faster and more convenient than remembering exactly what + to free, especially where malloc()/free() are not too speedy. + NB: alloc routines never return NULL. They exit to error_exit if not + successful. +*/ + +typedef struct jvirt_sarray_control *cjpeg_wrbmp_jvirt_sarray_ptr; +typedef struct jvirt_barray_control *cjpeg_wrbmp_jvirt_barray_ptr; + +struct cjpeg_wrbmp_jpeg_memory_mgr { + /* Method pointers */ + CJPEG_WRBMP_JMETHOD(void *, alloc_small, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_size_t sizeofobject)); + CJPEG_WRBMP_JMETHOD(void CJPEG_WRBMP_FAR *, alloc_large, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_size_t sizeofobject)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JSAMPARRAY, alloc_sarray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + CJPEG_WRBMP_JDIMENSION samplesperrow, + CJPEG_WRBMP_JDIMENSION numrows)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JBLOCKARRAY, alloc_barray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + CJPEG_WRBMP_JDIMENSION blocksperrow, + CJPEG_WRBMP_JDIMENSION numrows)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_jvirt_sarray_ptr, request_virt_sarray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_boolean pre_zero, + CJPEG_WRBMP_JDIMENSION samplesperrow, + CJPEG_WRBMP_JDIMENSION numrows, + CJPEG_WRBMP_JDIMENSION maxaccess)); + CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_jvirt_barray_ptr, request_virt_barray, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_boolean pre_zero, + CJPEG_WRBMP_JDIMENSION blocksperrow, + CJPEG_WRBMP_JDIMENSION numrows, + CJPEG_WRBMP_JDIMENSION maxaccess)); + CJPEG_WRBMP_JMETHOD(void, realize_virt_arrays, + (cjpeg_wrbmp_j_common_ptr cinfo)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JSAMPARRAY, access_virt_sarray, + (cjpeg_wrbmp_j_common_ptr cinfo, + cjpeg_wrbmp_jvirt_sarray_ptr ptr, + CJPEG_WRBMP_JDIMENSION start_row, + CJPEG_WRBMP_JDIMENSION num_rows, + cjpeg_wrbmp_boolean writable)); + CJPEG_WRBMP_JMETHOD(CJPEG_WRBMP_JBLOCKARRAY, access_virt_barray, + (cjpeg_wrbmp_j_common_ptr cinfo, + cjpeg_wrbmp_jvirt_barray_ptr ptr, + CJPEG_WRBMP_JDIMENSION start_row, + CJPEG_WRBMP_JDIMENSION num_rows, + cjpeg_wrbmp_boolean writable)); + CJPEG_WRBMP_JMETHOD(void, free_pool, + (cjpeg_wrbmp_j_common_ptr cinfo, int pool_id)); + CJPEG_WRBMP_JMETHOD(void, self_destruct, (cjpeg_wrbmp_j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + merely advisory, not a guaranteed maximum; it only affects the space + used for virtual-array buffers.) May be changed by outer application + after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + +/* Routine signature for application-supplied marker processing methods. + Need not pass marker code since it is stored in cinfo->unread_marker. +*/ +typedef CJPEG_WRBMP_JMETHOD(cjpeg_wrbmp_boolean, jpeg_marker_parser_method, + (cjpeg_wrbmp_j_decompress_ptr cinfo)); + +/* + The JPEG library modules define JPEG_INTERNALS before including this file. + The internal structure declarations are read only when that is true. + Applications using the library should not include jpegint.h, but may wish + to include jerror.h. +*/ + +#ifdef CJPEG_JPEG6B_WRBMP_JPEG_INTERNALS +#include "jerror.h" /* fetch error codes too */ +#include "jpegint.h" /* fetch private declarations */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/input.c b/targets/wasm-tacle/sequential/cjpeg_wrbmp/input.c new file mode 100755 index 0000000..989bfb7 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/input.c @@ -0,0 +1,86 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: input.c + + Author: Thomas G. Lane. + + Function: Input variables for the cjpeg_jpeg6b_wrbmp.c + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file + +*/ + +unsigned char cjpeg_wrbmp_colormap[ 3 ][ 256 ]; + +void cjpeg_wrbmp_initInput( void ) +{ + int i, j; + volatile unsigned char tmp[ 3 ][ 256 ] = {{ + 44, 105, 153, 71, 151, 160, 188, 90, 209, 131, + 221, 114, 93, 124, 208, 207, 218, 54, 145, 113, 153, 239, 226, 83, 243, 151, + 98, 67, 114, 153, 83, 186, 116, 72, 188, 190, 109, 162, 218, 133, 208, 209, + 115, 251, 135, 89, 143, 226, 230, 246, 152, 243, 152, 115, 180, 78, 246, 164, + 250, 117, 76, 150, 152, 188, 251, 195, 127, 111, 225, 208, 94, 93, 143, 131, + 201, 211, 99, 93, 190, 157, 121, 240, 117, 185, 167, 137, 152, 188, 250, 59, + 248, 245, 115, 240, 192, 209, 143, 136, 98, 224, 167, 135, 132, 189, 72, 249, + 205, 44, 106, 96, 147, 247, 249, 228, 224, 249, 190, 112, 135, 168, 95, 205, + 171, 58, 112, 79, 206, 75, 242, 188, 189, 225, 185, 81, 221, 153, 244, 198, + 171, 163, 159, 209, 240, 138, 148, 207, 166, 192, 188, 151, 98, 190, 209, 154, + 225, 72, 96, 249, 191, 223, 207, 163, 207, 133, 251, 183, 135, 137, 159, 247, + 167, 83, 123, 199, 203, 144, 142, 237, 77, 128, 117, 169, 202, 136, 128, 188, + 168, 55, 222, 169, 116, 60, 75, 175, 102, 217, 168, 185, 189, 225, 125, 192, + 112, 111, 168, 239, 225, 168, 97, 129, 190, 175, 169, 225, 170, 226, 225, 226, + 224, 134, 106, 250, 222, 148, 241, 168, 166, 160, 95, 190, 102, 180, 193, 111, + 151, 165, 171, 200, 52, 134, 169, 223, 166, 225, 169, 111, 185, 109, 56, 244, + 157, 250, 226, 231, 119, 188 + }, { + 42, 143, 46, 91, 84, 201, 140, 91, 82, 140, 31, + 88, 44, 171, 57, 115, 206, 59, 145, 117, 116, 53, 232, 117, 80, 60, 66, 64, + 117, 174, 89, 178, 147, 63, 83, 59, 103, 139, 211, 64, 68, 98, 118, 53, 119, + 90, 161, 232, 171, 98, 176, 236, 118, 157, 180, 77, 114, 88, 28, 119, 40, 97, + 69, 189, 252, 225, 119, 96, 219, 84, 82, 105, 158, 49, 200, 61, 117, 78, 63, + 147, 140, 69, 108, 90, 161, 105, 190, 114, 84, 76, 70, 43, 156, 222, 96, 72, + 143, 90, 105, 56, 144, 78, 129, 35, 66, 101, 100, 49, 105, 130, 160, 239, 129, + 141, 83, 43, 68, 106, 132, 83, 92, 130, 175, 63, 131, 79, 192, 105, 57, 160, + 118, 162, 141, 78, 192, 128, 206, 201, 203, 162, 159, 163, 221, 183, 157, 177, + 189, 192, 129, 130, 54, 104, 45, 101, 252, 52, 91, 177, 49, 221, 116, 111, 143, + 92, 142, 159, 131, 173, 61, 159, 173, 81, 129, 214, 213, 145, 143, 232, 67, + 145, 130, 99, 237, 110, 160, 131, 67, 50, 129, 131, 127, 76, 92, 203, 96, 206, + 176, 180, 85, 99, 162, 118, 64, 78, 190, 191, 45, 101, 129, 58, 72, 211, 49, + 115, 115, 85, 61, 100, 116, 107, 143, 117, 219, 154, 225, 174, 160, 163, 119, + 190, 106, 186, 49, 45, 177, 147, 85, 138, 42, 174, 59, 68, 120, 71, 129, 56, + 149, 97, 68, 88, 148, 60, 239, 179, 149, 104 + }, { + 44, 76, 37, 56, 76, 152, 122, + 153, 77, 191, 41, 76, 39, 97, 46, 109, 172, 43, 116, 91, 102, 49, 201, 68, 88, + 45, 53, 95, 160, 175, 102, 164, 116, 50, 76, 45, 86, 189, 216, 50, 61, 93, 196, + 91, 100, 58, 116, 223, 166, 102, 126, 221, 158, 86, 235, 55, 113, 120, 52, 115, + 42, 86, 55, 165, 247, 194, 160, 108, 170, 108, 98, 77, 168, 42, 179, 70, 96, + 62, 71, 216, 100, 71, 155, 121, 146, 86, 134, 105, 114, 49, 100, 50, 119, 218, + 95, 81, 220, 78, 102, 50, 125, 68, 170, 36, 62, 119, 129, 44, 151, 72, 143, + 241, 131, 137, 79, 73, 55, 122, 204, 73, 74, 131, 221, 53, 89, 72, 178, 60, 64, + 145, 157, 156, 177, 101, 180, 112, 194, 206, 178, 168, 221, 153, 201, 119, 222, + 165, 188, 212, 117, 180, 45, 134, 42, 130, 229, 47, 107, 172, 40, 221, 146, + 132, 138, 110, 144, 188, 112, 132, 64, 162, 145, 140, 200, 181, 215, 139, 197, + 183, 106, 126, 116, 89, 204, 152, 123, 161, 52, 46, 131, 167, 173, 62, 70, 151, + 151, 197, 177, 184, 96, 97, 101, 130, 54, 63, 141, 185, 45, 126, 96, 46, 71, + 172, 38, 114, 100, 106, 69, 118, 138, 127, 99, 127, 198, 204, 242, 248, 197, + 241, 74, 189, 178, 252, 65, 45, 148, 145, 97, 168, 45, 111, 43, 64, 164, 80, + 113, 47, 136, 83, 42, 91, 197, 95, 222, 167, 92, 98 + } + }; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; i++ ) { + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j < 256; j++ ) + cjpeg_wrbmp_colormap[ i ][ j ] = tmp[ i ][ j ]; + } +} diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/jconfig.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jconfig.h new file mode 100755 index 0000000..9c73988 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jconfig.h @@ -0,0 +1,65 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: cderror.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README files +*/ + +#ifndef JCONFIG_H +#define JCONFIG_H + +#define CJPEG_WRBMP_HAVE_PROTOTYPES +#define CJPEG_WRBMP_HAVE_UNSIGNED_CHAR +#define CJPEG_WRBMP_HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#define CJPEG_WRBMP_HAVE_STDDEF_H +#define CJPEG_WRBMP_HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef CJPEG_JPEG6B_WRBMP_NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef CJPEG_JPEG6B_WRBMP_JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef CJPEG_WRBMP_JPEG_CJPEG_DJPEG + +#define CJPEG_WRBMP_BMP_SUPPORTED /* BMP image file format */ +#define CJPEG_WRBMP_GIF_SUPPORTED /* GIF image file format */ +#define CJPEG_WRBMP_PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define CJPEG_WRBMP_TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ + +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/jerror.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jerror.h new file mode 100755 index 0000000..f9e55b8 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jerror.h @@ -0,0 +1,203 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jerror.h + + Author: Thomas G. Lane. + + This file defines the error and message codes for the JPEG library. + Edit this file to add new codes, or to translate the message strings to + some other language. + A set of error-reporting macros are defined too. Some applications using + the JPEG library may wish to include this file to get the error codes + sand/or the macros. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +/* + To define the enum list of message codes, include this file without + defining macro JMESSAGE. To create a message string table, include it + again with a suitable JMESSAGE definition (see jerror.c for an example). +*/ +#ifndef CJPEG_WRBMP_JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define CJPEG_WRBMP_JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define CJPEG_WRBMP_JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + +typedef enum { + +#define CJPEG_WRBMP_JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + + CJPEG_WRBMP_JMESSAGE( JMSG_NOMESSAGE, "Bogus message code %d" ) /* Must be first entry! */ + + /* For maintenance convenience, list is alphabetical by message code name */ + CJPEG_WRBMP_JMESSAGE( JERR_ARITH_NOTIMPL, + "Sorry, there are legal restrictions on arithmetic coding" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_BUFFER_MODE, "Bogus buffer control mode" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_DCT_COEF, "DCT coefficient out of range" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_DCTSIZE, "IDCT output block size %d not supported" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_IN_COLORSPACE, "Bogus input colorspace" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_LENGTH, "Bogus marker length" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_POOL_ID, "Invalid memory pool code %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_PRECISION, "Unsupported JPEG data precision %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_SAMPLING, "Bogus sampling factors" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_STATE, "Improper call to JPEG library in state %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u" ) + CJPEG_WRBMP_JMESSAGE( JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access" ) + CJPEG_WRBMP_JMESSAGE( JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small" ) + CJPEG_WRBMP_JMESSAGE( JERR_CANT_SUSPEND, "Suspension not allowed here" ) + CJPEG_WRBMP_JMESSAGE( JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet" ) + CJPEG_WRBMP_JMESSAGE( JERR_COMPONENT_COUNT, "Too many color components: %d, max %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request" ) + CJPEG_WRBMP_JMESSAGE( JERR_DAC_INDEX, "Bogus DAC index %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_DAC_VALUE, "Bogus DAC value 0x%x" ) + CJPEG_WRBMP_JMESSAGE( JERR_DHT_INDEX, "Bogus DHT index %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_DQT_INDEX, "Bogus DQT index %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)" ) + CJPEG_WRBMP_JMESSAGE( JERR_EMS_READ, "Read from EMS failed" ) + CJPEG_WRBMP_JMESSAGE( JERR_EMS_WRITE, "Write to EMS failed" ) + CJPEG_WRBMP_JMESSAGE( JERR_EOI_EXPECTED, "Didn't expect more than one scan" ) + CJPEG_WRBMP_JMESSAGE( JERR_FILE_READ, "Input file read error" ) + CJPEG_WRBMP_JMESSAGE( JERR_FILE_WRITE, "Output file write error --- out of disk space?" ) + CJPEG_WRBMP_JMESSAGE( JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet" ) + CJPEG_WRBMP_JMESSAGE( JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow" ) + CJPEG_WRBMP_JMESSAGE( JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry" ) + CJPEG_WRBMP_JMESSAGE( JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels" ) + CJPEG_WRBMP_JMESSAGE( JERR_INPUT_EMPTY, "Empty input file" ) + CJPEG_WRBMP_JMESSAGE( JERR_INPUT_EOF, "Premature end of input file" ) + CJPEG_WRBMP_JMESSAGE( JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d" ) + CJPEG_WRBMP_JMESSAGE( JERR_MISSING_DATA, "Scan script does not transmit all data" ) + CJPEG_WRBMP_JMESSAGE( JERR_MODE_CHANGE, "Invalid color quantization mode change" ) + CJPEG_WRBMP_JMESSAGE( JERR_NOTIMPL, "Not implemented yet" ) + CJPEG_WRBMP_JMESSAGE( JERR_NOT_COMPILED, "Requested feature was omitted at compile time" ) + CJPEG_WRBMP_JMESSAGE( JERR_NO_BACKING_STORE, "Backing store not supported" ) + CJPEG_WRBMP_JMESSAGE( JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined" ) + CJPEG_WRBMP_JMESSAGE( JERR_NO_IMAGE, "JPEG datastream contains no image" ) + CJPEG_WRBMP_JMESSAGE( JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined" ) + CJPEG_WRBMP_JMESSAGE( JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)" ) + CJPEG_WRBMP_JMESSAGE( JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components" ) + CJPEG_WRBMP_JMESSAGE( JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors" ) + CJPEG_WRBMP_JMESSAGE( JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors" ) + CJPEG_WRBMP_JMESSAGE( JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers" ) + CJPEG_WRBMP_JMESSAGE( JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker" ) + CJPEG_WRBMP_JMESSAGE( JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers" ) + CJPEG_WRBMP_JMESSAGE( JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF" ) + CJPEG_WRBMP_JMESSAGE( JERR_TFILE_CREATE, "Failed to create temporary file %s" ) + CJPEG_WRBMP_JMESSAGE( JERR_TFILE_READ, "Read failed on temporary file" ) + CJPEG_WRBMP_JMESSAGE( JERR_TFILE_SEEK, "Seek failed on temporary file" ) + CJPEG_WRBMP_JMESSAGE( JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?" ) + CJPEG_WRBMP_JMESSAGE( JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines" ) + CJPEG_WRBMP_JMESSAGE( JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JERR_VIRTUAL_BUG, "Virtual array controller messed up" ) + CJPEG_WRBMP_JMESSAGE( JERR_WIDTH_OVERFLOW, "Image too wide for this implementation" ) + CJPEG_WRBMP_JMESSAGE( JERR_XMS_READ, "Read from XMS failed" ) + CJPEG_WRBMP_JMESSAGE( JERR_XMS_WRITE, "Write to XMS failed" ) + CJPEG_WRBMP_JMESSAGE( JMSG_COPYRIGHT, JCOPYRIGHT ) + CJPEG_WRBMP_JMESSAGE( JMSG_VERSION, JVERSION ) + CJPEG_WRBMP_JMESSAGE( JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG" ) + CJPEG_WRBMP_JMESSAGE( JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JTRC_DHT, "Define Huffman Table 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JTRC_DQT, "Define Quantization Table %d precision %d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_DRI, "Define Restart Interval %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_EMS_CLOSE, "Freed EMS handle %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_EMS_OPEN, "Obtained EMS handle %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_EOI, "End Of Image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors" ) + CJPEG_WRBMP_JMESSAGE( JTRC_QUANT_NCOLORS, "Quantizing to %d colors" ) + CJPEG_WRBMP_JMESSAGE( JTRC_QUANT_SELECTED, "Selected %d colors for quantization" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_RST, "RST%d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SOI, "Start of Image" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SOS, "Start Of Scan: %d components" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d" ) + CJPEG_WRBMP_JMESSAGE( JTRC_TFILE_CLOSE, "Closed temporary file %s" ) + CJPEG_WRBMP_JMESSAGE( JTRC_TFILE_OPEN, "Opened temporary file %s" ) + CJPEG_WRBMP_JMESSAGE( JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr" ) + CJPEG_WRBMP_JMESSAGE( JTRC_XMS_CLOSE, "Freed XMS handle %u" ) + CJPEG_WRBMP_JMESSAGE( JTRC_XMS_OPEN, "Obtained XMS handle %u" ) + CJPEG_WRBMP_JMESSAGE( JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d" ) + CJPEG_WRBMP_JMESSAGE( JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d" ) + CJPEG_WRBMP_JMESSAGE( JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x" ) + CJPEG_WRBMP_JMESSAGE( JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment" ) + CJPEG_WRBMP_JMESSAGE( JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code" ) + CJPEG_WRBMP_JMESSAGE( JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d" ) + CJPEG_WRBMP_JMESSAGE( JWRN_JPEG_EOF, "Premature end of JPEG file" ) + CJPEG_WRBMP_JMESSAGE( JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d" ) + CJPEG_WRBMP_JMESSAGE( JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG" ) + CJPEG_WRBMP_JMESSAGE( JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines" ) + + #ifdef CJPEG_WRBMP_JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} CJPEG_WRBMP_J_MESSAGE_CODE; + +#undef CJPEG_WRBMP_JMAKE_ENUM_LIST + #endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef CJPEG_WRBMP_JMESSAGE diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/jmorecfg.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jmorecfg.h new file mode 100755 index 0000000..84ee16a --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jmorecfg.h @@ -0,0 +1,95 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jmorecfg.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file contains additional configuration options that customize the + JPEG software for special applications or support machine-dependent + optimizations. Most users will not need to touch this file. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + +#ifndef JMORECFG_H +#define JMORECFG_H + + +#define CJPEG_WRBMP_GETJSAMPLE(value) ((int) (value)) + +typedef unsigned char CJPEG_WRBMP_JSAMPLE; +typedef short CJPEG_WRBMP_JCOEF; +typedef unsigned char CJPEG_WRBMP_JOCTET; + +/* These typedefs are used for various table entries and so forth. + They must be at least as wide as specified; but making them too big + won't cost a huge amount of memory, so we don't provide special + extraction code like we did for JSAMPLE. (In other words, these + typedefs live at a different point on the speed/space tradeoff curve.) +*/ + +/* UINT8 must hold at least the values 0..255. */ + +typedef unsigned char CJPEG_WRBMP_UINT8; + + +/* UINT16 must hold at least the values 0..65535. */ + +typedef unsigned short CJPEG_WRBMP_UINT16; + + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +typedef long INT32; +#endif + +typedef unsigned int CJPEG_WRBMP_JDIMENSION; + +/* This macro is used to declare a "method", that is, a function pointer. + We want to supply prototype parameters if the compiler can cope. + Note that the arglist parameter must be parenthesized! + Again, you can customize this if you need special linkage keywords. +*/ + +#define EXTERN(type) extern type + +#ifdef CJPEG_WRBMP_HAVE_PROTOTYPES +#define CJPEG_WRBMP_JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define CJPEG_WRBMP_JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + on 80x86 machines. Most of the specialized coding for 80x86 is handled + by just saying "FAR *" where such a pointer is needed. In a few places + explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. +*/ + +#ifdef CJPEG_JPEG6B_WRBMP_NEED_FAR_POINTERS +#define CJPEG_WRBMP_FAR far +#else +#define CJPEG_WRBMP_FAR +#endif + +#ifndef CJPEG_JPEG6B_WRBMP_HAVE_BOOLEAN +typedef int cjpeg_wrbmp_boolean; +#endif +#endif diff --git a/targets/wasm-tacle/sequential/cjpeg_wrbmp/jpeglib.h b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jpeglib.h new file mode 100755 index 0000000..87236a4 --- /dev/null +++ b/targets/wasm-tacle/sequential/cjpeg_wrbmp/jpeglib.h @@ -0,0 +1,869 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: jpeglib.h + + Author: Thomas G. Lane. + + This file is part of the Independent JPEG Group's software. + For conditions of distribution and use, see the accompanying README file. + + This file defines the application interface for the JPEG library. + Most applications using the library need only include this file, + and perhaps jerror.h if they want to know the exact error codes. + + Source: Independent JPEG Group's software + + Changes: no major functional changes + + License: See the accompanying README file +*/ + + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +typedef int CJPEG_WRBMP_FILE; +typedef unsigned int cjpeg_wrbmp_size_t; + +/* + First we include the configuration files that record how this + installation of the JPEG library is set up. jconfig.h can be + generated automatically for many systems. jmorecfg.h contains + manual configuration options that most people need not worry about. +*/ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + +/* Data structures for images (arrays of samples and of DCT coefficients). + On 80x86 machines, the image arrays are too big for near pointers, + but the pointer arrays can fit in near memory. +*/ + +typedef CJPEG_WRBMP_JSAMPLE CJPEG_WRBMP_FAR +*CJPEG_WRBMP_JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef CJPEG_WRBMP_JSAMPROW +*CJPEG_WRBMP_JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef CJPEG_WRBMP_JSAMPARRAY +*CJPEG_WRBMP_JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef CJPEG_WRBMP_JCOEF +CJPEG_WRBMP_JBLOCK[ 64 ]; /* one block of coefficients */ +typedef CJPEG_WRBMP_JBLOCK CJPEG_WRBMP_FAR +*CJPEG_WRBMP_JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef CJPEG_WRBMP_JBLOCKROW +*CJPEG_WRBMP_JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef CJPEG_WRBMP_JBLOCKARRAY +*CJPEG_WRBMP_JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef CJPEG_WRBMP_JCOEF CJPEG_WRBMP_FAR +*JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + (not the zigzag order in which they are stored in a JPEG DQT marker). + CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + CJPEG_WRBMP_UINT16 + quantval[ 64 ]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + the table is created, and set TRUE when it's been output to the file. + You could suppress output of a table by setting this to TRUE. + (See jpeg_suppress_tables for an example.) + */ + cjpeg_wrbmp_boolean sent_table; /* TRUE when table has been output */ +} CJPEG_WRBMP_JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + CJPEG_WRBMP_UINT8 bits[ 17 ]; /* bits[ k ] = # of symbols with codes of */ + /* length k bits; bits[ 0 ] is unused */ + CJPEG_WRBMP_UINT8 + huffval[ 256 ]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + the table is created, and set TRUE when it's been output to the file. + You could suppress output of a table by setting this to TRUE. + (See jpeg_suppress_tables for an example.) + */ + cjpeg_wrbmp_boolean sent_table; /* TRUE when table has been output */ +} CJPEG_WRBMP_JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[ ] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + Any dummy blocks added to complete an MCU are not counted; therefore + these values do not depend on whether a scan is interleaved or not. + */ + CJPEG_WRBMP_JDIMENSION width_in_blocks; + CJPEG_WRBMP_JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + For decompression this is the size of the output from one DCT block, + reflecting any scaling we choose to apply during the IDCT step. + Values of 1,2,4,8 are likely to be supported. Note that different + components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + of samples at the main buffer (preprocessing/compression interface), thus + downsampled_width = ceil(image_width * Hi/Hmax) + and similarly for height. For decompression, IDCT scaling is included, so + downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + CJPEG_WRBMP_JDIMENSION downsampled_width; /* actual width in samples */ + CJPEG_WRBMP_JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + components will be ignored (eg grayscale output from YCbCr image), + we can skip most computations for the unused components. + */ + cjpeg_wrbmp_boolean + component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + See jdinput.c comments about the need for this information. + This field is currently used only for decompression. + */ + CJPEG_WRBMP_JQUANT_TBL *quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void *dct_table; +} cjpeg_wrbmp_jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[ 4 ]; /* their SOF/comp_info[ ] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} cjpeg_wrbmp_jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct cjpeg_wrbmp_jpeg_marker_struct CJPEG_WRBMP_FAR + *jpeg_saved_marker_ptr; + +struct cjpeg_wrbmp_jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + CJPEG_WRBMP_UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[ ] */ + CJPEG_WRBMP_JOCTET CJPEG_WRBMP_FAR + *data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} CJPEG_WRBMP_J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} CJPEG_WRBMP_J_DCT_METHOD; + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} CJPEG_WRBMP_J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define cjpeg_wrbmp_jpeg_common_fields \ + struct cjpeg_wrbmp_jpeg_error_mgr * err; /* Error handler module */\ + struct cjpeg_wrbmp_jpeg_memory_mgr * mem; /* Memory manager module */\ + struct cjpeg_wrbmp_jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + cjpeg_wrbmp_boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + to receive a pointer to this structure. There are no actual instances of + jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. +*/ +struct cjpeg_wrbmp_jpeg_common_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + jpeg_decompress_struct. All three structs must agree on these + initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct cjpeg_wrbmp_jpeg_common_struct + *cjpeg_wrbmp_j_common_ptr; +typedef struct cjpeg_wrbmp_jpeg_compress_struct + *cjpeg_wrbmp_j_compress_ptr; +typedef struct cjpeg_wrbmp_jpeg_decompress_struct + *cjpeg_wrbmp_j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct cjpeg_wrbmp_jpeg_compress_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct cjpeg_wrbmp_jpeg_destination_mgr *dest; + + /* Description of source image --- these fields must be filled in by + outer application before starting compression. in_color_space must + be correct before you can even call jpeg_set_defaults(). + */ + + CJPEG_WRBMP_JDIMENSION image_width; /* input image width */ + CJPEG_WRBMP_JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + CJPEG_WRBMP_J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + float input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + initialize everything to reasonable defaults, then changing anything + the application specifically wants to change. That way you won't get + burnt when new parameters are added. Also note that there are several + helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + CJPEG_WRBMP_J_COLOR_SPACE + jpeg_color_space; /* colorspace of JPEG image */ + + cjpeg_wrbmp_jpeg_component_info *comp_info; + /* comp_info[ i ] describes component that appears i'th in SOF */ + + CJPEG_WRBMP_JQUANT_TBL *quant_tbl_ptrs[ 4 ]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + CJPEG_WRBMP_JHUFF_TBL *dc_huff_tbl_ptrs[ 4 ]; + CJPEG_WRBMP_JHUFF_TBL *ac_huff_tbl_ptrs[ 4 ]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + CJPEG_WRBMP_UINT8 + arith_dc_L[ 16 ]; /* L values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_dc_U[ 16 ]; /* U values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_ac_K[ 16 ]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const cjpeg_wrbmp_jpeg_scan_info + *scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + sequential JPEG file to be emitted. To create a multi-scan file, + set num_scans and scan_info to point to an array of scan definitions. + */ + + cjpeg_wrbmp_boolean + raw_data_in; /* TRUE=caller supplies downsampled data */ + cjpeg_wrbmp_boolean + arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + cjpeg_wrbmp_boolean + optimize_coding; /* TRUE=optimize entropy encoding parms */ + cjpeg_wrbmp_boolean + CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + CJPEG_WRBMP_J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + restart_interval, or in MCU rows by setting restart_in_rows + (in which case the correct restart_interval will be figured + for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + cjpeg_wrbmp_boolean + write_JFIF_header; /* should a JFIF marker be written? */ + CJPEG_WRBMP_UINT8 + JFIF_major_version; /* What to write for the JFIF version number */ + CJPEG_WRBMP_UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + CJPEG_WRBMP_UINT8 density_unit; /* JFIF code for pixel size units */ + CJPEG_WRBMP_UINT16 X_density; /* Horizontal pixel density */ + CJPEG_WRBMP_UINT16 Y_density; /* Vertical pixel density */ + cjpeg_wrbmp_boolean + write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + jpeg_write_scanlines(). Application may use this to control its + processing loop, e.g., "while (next_scanline < image_height)". + */ + + CJPEG_WRBMP_JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + should not be touched by a surrounding application. + */ + + /* + These fields are computed during compression startup + */ + cjpeg_wrbmp_boolean + progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + CJPEG_WRBMP_JDIMENSION + total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + for fully interleaved scans (whether the JPEG file is interleaved or not). + There are v_samp_factor * DCTSIZE sample rows of each component in an + "iMCU" (interleaved MCU) row. + */ + + /* + These fields are valid during any one scan. + They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + cjpeg_wrbmp_jpeg_component_info *cur_comp_info[ 4 ]; + /* *cur_comp_info[ i ] describes component that appears i'th in SOS */ + + CJPEG_WRBMP_JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + CJPEG_WRBMP_JDIMENSION + MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[ 10 ]; + /* MCU_membership[ i ] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + cjpeg_wrbmp_jpeg_scan_info + *script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct cjpeg_wrbmp_jpeg_decompress_struct { + cjpeg_wrbmp_jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct cjpeg_wrbmp_jpeg_source_mgr *src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + CJPEG_WRBMP_JDIMENSION + image_width; /* nominal image width (from SOF marker) */ + CJPEG_WRBMP_JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + CJPEG_WRBMP_J_COLOR_SPACE + jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + them to default values. + */ + + CJPEG_WRBMP_J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + float output_gamma; /* image gamma wanted in output */ + + cjpeg_wrbmp_boolean buffered_image; /* TRUE=multiple output passes */ + cjpeg_wrbmp_boolean raw_data_out; /* TRUE=downsampled data wanted */ + + CJPEG_WRBMP_J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + cjpeg_wrbmp_boolean + do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + cjpeg_wrbmp_boolean + do_block_smoothing; /* TRUE=apply interblock smoothing */ + + cjpeg_wrbmp_boolean + quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + CJPEG_WRBMP_J_DITHER_MODE + dither_mode; /* type of color dithering to use */ + cjpeg_wrbmp_boolean + two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + cjpeg_wrbmp_boolean + enable_1pass_quant; /* enable future use of 1-pass quantizer */ + cjpeg_wrbmp_boolean + enable_EXTERNal_quant;/* enable future use of EXTERNal colormap */ + cjpeg_wrbmp_boolean + enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + These fields are computed by jpeg_start_decompress(). + You can also use jpeg_calc_output_dimensions() to determine these values + in advance of calling jpeg_start_decompress(). + */ + + CJPEG_WRBMP_JDIMENSION output_width; /* scaled image width */ + CJPEG_WRBMP_JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + high, space and time will be wasted due to unnecessary data copying. + Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + The application can supply a colormap by setting colormap non-NULL before + calling jpeg_start_decompress; otherwise a colormap is created during + jpeg_start_decompress or jpeg_start_output. + The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + CJPEG_WRBMP_JSAMPARRAY + colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + Application may use this to control its processing loop, e.g., + "while (output_scanline < output_height)". + */ + CJPEG_WRBMP_JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + CJPEG_WRBMP_JDIMENSION + input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + output side. The decompressor will not allow output scan/row number + to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + CJPEG_WRBMP_JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[ c ][ i ] indicates the precision + with which component c's DCT coefficient i (in zigzag order) is known. + It is -1 when no data has yet been received, otherwise it is the point + transform (shift) value for the most recent scan of the coefficient + (thus, 0 at completion of the progression). + This pointer is NULL when reading a non-progressive file. + */ + int ( *coef_bits )[ 64 ]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + these fields. Note that the decompressor output side may not use + any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + datastreams when processing abbreviated JPEG datastreams. + */ + + CJPEG_WRBMP_JQUANT_TBL *quant_tbl_ptrs[ 4 ]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + CJPEG_WRBMP_JHUFF_TBL *dc_huff_tbl_ptrs[ 4 ]; + CJPEG_WRBMP_JHUFF_TBL *ac_huff_tbl_ptrs[ 4 ]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + cjpeg_wrbmp_jpeg_component_info *comp_info; + /* comp_info[ i ] describes component that appears i'th in SOF */ + + cjpeg_wrbmp_boolean + progressive_mode; /* TRUE if SOFn specifies progressive mode */ + cjpeg_wrbmp_boolean + arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + CJPEG_WRBMP_UINT8 + arith_dc_L[ 16 ]; /* L values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_dc_U[ 16 ]; /* U values for DC arith-coding tables */ + CJPEG_WRBMP_UINT8 + arith_ac_K[ 16 ]; /* Kx values for AC arith-coding tables */ + + unsigned int + restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + the JPEG library. + */ + cjpeg_wrbmp_boolean + saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + CJPEG_WRBMP_UINT8 JFIF_major_version; /* JFIF version number */ + CJPEG_WRBMP_UINT8 JFIF_minor_version; + CJPEG_WRBMP_UINT8 density_unit; /* JFIF code for pixel size units */ + CJPEG_WRBMP_UINT16 X_density; /* Horizontal pixel density */ + CJPEG_WRBMP_UINT16 Y_density; /* Vertical pixel density */ + cjpeg_wrbmp_boolean + saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + CJPEG_WRBMP_UINT8 + Adobe_transform; /* Color transform code from Adobe marker */ + + cjpeg_wrbmp_boolean + CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + library, the uninterpreted contents of any or all APPn and COM markers + can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + should not be touched by a surrounding application. + */ + + /* + These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + CJPEG_WRBMP_JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + in fully interleaved JPEG scans, but are used whether the scan is + interleaved or not. We define an iMCU row as v_samp_factor DCT block + rows of each component. Therefore, the IDCT output contains + v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + CJPEG_WRBMP_JSAMPLE + *sample_range_limit; /* table for fast range-limiting */ + + /* + These fields are valid during any one scan. + They describe the components and MCUs actually appearing in the scan. + Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + cjpeg_wrbmp_jpeg_component_info *cur_comp_info[ 4 ]; + /* *cur_comp_info[ i ] describes component that appears i'th in SOS */ + + CJPEG_WRBMP_JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + CJPEG_WRBMP_JDIMENSION + MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[ 10 ]; + /* MCU_membership[ i ] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + It is either zero or the code of a JPEG marker that has been + read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master *master; + struct jpeg_d_main_controller *main; + struct jpeg_d_coef_controller *coef; + struct jpeg_d_post_controller *post; + struct jpeg_input_controller *inputctl; + struct jpeg_marker_reader *marker; + struct jpeg_entropy_decoder *entropy; + struct jpeg_inverse_dct *idct; + struct jpeg_upsampler *upsample; + struct jpeg_color_deconverter *cconvert; + struct jpeg_color_quantizer *cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + directly by the surrounding application. + As with all objects in the JPEG library, these structs only define the + publicly visible methods and state variables of a module. Additional + private fields may exist after the public ones. +*/ + + +/* Error handler object */ + +struct cjpeg_wrbmp_jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + CJPEG_WRBMP_JMETHOD( void, error_exit, + ( cjpeg_wrbmp_j_common_ptr cinfo ) ); + /* Conditionally emit a trace or warning message */ + CJPEG_WRBMP_JMETHOD( void, emit_message, + ( cjpeg_wrbmp_j_common_ptr cinfo, int msg_level ) ); + /* Routine that actually outputs a trace or error message */ + CJPEG_WRBMP_JMETHOD( void, output_message, + ( cjpeg_wrbmp_j_common_ptr cinfo ) ); + /* Format a message string for the most recent JPEG error or message */ + CJPEG_WRBMP_JMETHOD( void, format_message, + ( cjpeg_wrbmp_j_common_ptr cinfo, char *buffer ) ); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + CJPEG_WRBMP_JMETHOD( void, reset_error_mgr, + ( cjpeg_wrbmp_j_common_ptr cinfo ) ); + + /* The message ID code and any parameters are saved here. + A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + /* + union { + int i[ 8 ]; + char s[ JMSG_STR_PARM_MAX ]; + } msg_parm; + */ + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + but keep going unless emit_message chooses to abort. emit_message + should count warnings in num_warnings. The surrounding application + can check for bad data by seeing if num_warnings is nonzero at the + end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + An application can change the table pointer to switch to a different + message list (typically, to change the language in which errors are + reported). Some applications may wish to add additional error codes + that will be handled by the JPEG library error mechanism; the second + table pointer is used for this purpose. + + First table includes all errors generated by JPEG library itself. + Error code 0 is reserved for a "no such error string" message. + */ + const char *const *jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + It contains strings numbered first_addon_message..last_addon_message. + */ + const char *const *addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct cjpeg_wrbmp_jpeg_progress_mgr { + CJPEG_WRBMP_JMETHOD( void, progress_monitor, + ( cjpeg_wrbmp_j_common_ptr cinfo ) ); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct cjpeg_wrbmp_jpeg_destination_mgr { + CJPEG_WRBMP_JOCTET + *next_output_byte; /* => next byte to write in buffer */ + cjpeg_wrbmp_size_t + free_in_buffer; /* # of byte spaces remaining in buffer */ + + CJPEG_WRBMP_JMETHOD( void, init_destination, + ( cjpeg_wrbmp_j_compress_ptr cinfo ) ); + CJPEG_WRBMP_JMETHOD( cjpeg_wrbmp_boolean, empty_output_buffer, + ( cjpeg_wrbmp_j_compress_ptr cinfo ) ); + CJPEG_WRBMP_JMETHOD( void, term_destination, + ( cjpeg_wrbmp_j_compress_ptr cinfo ) ); +}; + + +/* Data source object for decompression */ + +struct cjpeg_wrbmp_jpeg_source_mgr { + const CJPEG_WRBMP_JOCTET + *next_input_byte; /* => next byte to read from buffer */ + cjpeg_wrbmp_size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + CJPEG_WRBMP_JMETHOD( void, init_source, + ( cjpeg_wrbmp_j_decompress_ptr cinfo ) ); + CJPEG_WRBMP_JMETHOD( cjpeg_wrbmp_boolean, fill_input_buffer, + ( cjpeg_wrbmp_j_decompress_ptr cinfo ) ); + CJPEG_WRBMP_JMETHOD( void, skip_input_data, + ( cjpeg_wrbmp_j_decompress_ptr cinfo, long num_bytes ) ); + CJPEG_WRBMP_JMETHOD( cjpeg_wrbmp_boolean, resync_to_restart, + ( cjpeg_wrbmp_j_decompress_ptr cinfo, int desired ) ); + CJPEG_WRBMP_JMETHOD( void, term_source, + ( cjpeg_wrbmp_j_decompress_ptr cinfo ) ); +}; + + +/* Memory manager object. + Allocates "small" objects (a few K total), "large" objects (tens of K), + and "really big" objects (virtual arrays with backing store if needed). + The memory manager does not allow individual objects to be freed; rather, + each created object is assigned to a pool, and whole pools can be freed + at once. This is faster and more convenient than remembering exactly what + to free, especially where malloc()/free() are not too speedy. + NB: alloc routines never return NULL. They exit to error_exit if not + successful. +*/ + +typedef struct jvirt_sarray_control *cjpeg_wrbmp_jvirt_sarray_ptr; +typedef struct jvirt_barray_control *cjpeg_wrbmp_jvirt_barray_ptr; + + +struct cjpeg_wrbmp_jpeg_memory_mgr { + /* Method pointers */ + CJPEG_WRBMP_JMETHOD( void *, alloc_small, + ( cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_size_t sizeofobject ) ); + CJPEG_WRBMP_JMETHOD( void CJPEG_WRBMP_FAR *, alloc_large, + ( cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + cjpeg_wrbmp_size_t sizeofobject ) ); + CJPEG_WRBMP_JMETHOD( CJPEG_WRBMP_JSAMPARRAY, alloc_sarray, + ( cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + CJPEG_WRBMP_JDIMENSION samplesperrow, + CJPEG_WRBMP_JDIMENSION numrows ) ); + CJPEG_WRBMP_JMETHOD( CJPEG_WRBMP_JBLOCKARRAY, alloc_barray, + ( cjpeg_wrbmp_j_common_ptr cinfo, int pool_id, + CJPEG_WRBMP_JDIMENSION blocksperrow, + CJPEG_WRBMP_JDIMENSION numrows ) ); + CJPEG_WRBMP_JMETHOD( cjpeg_wrbmp_jvirt_sarray_ptr, + request_virt_sarray, ( cjpeg_wrbmp_j_common_ptr cinfo, + int pool_id, + cjpeg_wrbmp_boolean pre_zero, + CJPEG_WRBMP_JDIMENSION samplesperrow, + CJPEG_WRBMP_JDIMENSION numrows, + CJPEG_WRBMP_JDIMENSION maxaccess ) ); + CJPEG_WRBMP_JMETHOD( cjpeg_wrbmp_jvirt_barray_ptr, + request_virt_barray, ( cjpeg_wrbmp_j_common_ptr cinfo, + int pool_id, + cjpeg_wrbmp_boolean pre_zero, + CJPEG_WRBMP_JDIMENSION blocksperrow, + CJPEG_WRBMP_JDIMENSION numrows, + CJPEG_WRBMP_JDIMENSION maxaccess ) ); + CJPEG_WRBMP_JMETHOD( void, realize_virt_arrays, + ( cjpeg_wrbmp_j_common_ptr cinfo ) ); + CJPEG_WRBMP_JMETHOD( CJPEG_WRBMP_JSAMPARRAY, access_virt_sarray, + ( cjpeg_wrbmp_j_common_ptr cinfo, + cjpeg_wrbmp_jvirt_sarray_ptr ptr, + CJPEG_WRBMP_JDIMENSION start_row, + CJPEG_WRBMP_JDIMENSION num_rows, + cjpeg_wrbmp_boolean writable ) ); + CJPEG_WRBMP_JMETHOD( CJPEG_WRBMP_JBLOCKARRAY, access_virt_barray, + ( cjpeg_wrbmp_j_common_ptr cinfo, + cjpeg_wrbmp_jvirt_barray_ptr ptr, + CJPEG_WRBMP_JDIMENSION start_row, + CJPEG_WRBMP_JDIMENSION num_rows, + cjpeg_wrbmp_boolean writable ) ); + CJPEG_WRBMP_JMETHOD( void, free_pool, + ( cjpeg_wrbmp_j_common_ptr cinfo, int pool_id ) ); + CJPEG_WRBMP_JMETHOD( void, self_destruct, + ( cjpeg_wrbmp_j_common_ptr cinfo ) ); + + /* Limit on memory allocation for this JPEG object. (Note that this is + merely advisory, not a guaranteed maximum; it only affects the space + used for virtual-array buffers.) May be changed by outer application + after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + Need not pass marker code since it is stored in cinfo->unread_marker. +*/ +typedef CJPEG_WRBMP_JMETHOD( cjpeg_wrbmp_boolean, + jpeg_marker_parser_method, + ( cjpeg_wrbmp_j_decompress_ptr cinfo ) ); + +/* + The JPEG library modules define JPEG_INTERNALS before including this file. + The internal structure declarations are read only when that is true. + Applications using the library should not include jpegint.h, but may wish + to include jerror.h. +*/ + +#ifdef CJPEG_JPEG6B_WRBMP_JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/targets/wasm-tacle/sequential/dijkstra/CMakeLists.txt b/targets/wasm-tacle/sequential/dijkstra/CMakeLists.txt new file mode 100644 index 0000000..9d081e6 --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(dijkstra) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/dijkstra.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/dijkstra.c" + "generated/modified_sources/default/input.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/dijkstra/ChangeLog.txt b/targets/wasm-tacle/sequential/dijkstra/ChangeLog.txt new file mode 100755 index 0000000..f96350b --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/ChangeLog.txt @@ -0,0 +1,44 @@ +File: dijkstra.c +Original provenience: network section of MiBench + +2015-11-30: +- Replaced "NULL" with "0", remove #include of glibc_common.h +- Removed commented code referring to variable "qKill" +- Made ch, i, iPrev, iNode, iCost and iDist local variables +- Stripped (inconsistently applied) Hungarian notation, replaced + prefix "q" with prefix "queue" for global variables, renamed + "next_in" to "queueNext" and "qNew" to "newItem" +- Initialize queueHead statically (like queueCount and queueNext) +- Prefixed all functions and global variables with "dijkstra_", + renaming "dijkstra" to "dijkstra_find" +- Calculate a checksum in dijkstra_main, return its value in new + function dijkstra_return +- Added (empty) function dijkstra_init and a main function +- Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + functions, followed by main functions +- Added function prototypes +- Applied code formatting with astyle as in the example +- Added general TACLeBench header to beginning of source code + +2016-03-15: +- Return 0 if checksum is as expected, -1 otherwise +- Make all initializations explicit +- Touch input matrix with volatile to rule out optimizations +- Add entrypoint pragma + +2016-06-14: +- Removed cast to make C++ compiler happy + +Files: input.h, input.c +Original provenience: network section of MiBench + +2015-11-30: +- Prefix global variable "AdjMatrix" with "dijkstra_" +- Applied code formatting with astyle as in the example + +File: glibc_common.h +Original provenience: network section of MiBench + +2015-11-30: +- Removed file diff --git a/targets/wasm-tacle/sequential/dijkstra/dijkstra.c b/targets/wasm-tacle/sequential/dijkstra/dijkstra.c new file mode 100755 index 0000000..e98658a --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/dijkstra.c @@ -0,0 +1,195 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: dijkstra + + Author: unknown + + Function: dijkstra finds the shortest path between nodes in a graph + + Source: network section of MiBench + + Changes: Made some variables local, compute checksum + + License: GPL + +*/ + +#include "input.h" + +/* + Definitions of symbolic constants +*/ +#define NONE 9999 +#define OUT_OF_MEMORY -1 +#define QUEUE_SIZE 1000 + +/* + Type declarations +*/ +struct _NODE { + int dist; + int prev; +}; + +struct _QITEM { + int node; + int dist; + int prev; + struct _QITEM *next; +}; + +/* + Global variable definitions +*/ +struct _NODE dijkstra_rgnNodes[ NUM_NODES ]; + +int dijkstra_queueCount; +int dijkstra_queueNext; +struct _QITEM *dijkstra_queueHead; +struct _QITEM dijkstra_queueItems[ QUEUE_SIZE ]; + +int dijkstra_checksum = 0; + +/* + Forward declaration of functions +*/ +void dijkstra_init( void ); +int dijkstra_return( void ); +int dijkstra_enqueue( int node, int dist, int prev ); +void dijkstra_dequeue( int *node, int *dist, int *prev ); +int dijkstra_qcount( void ); +int dijkstra_find( int chStart, int chEnd ); +void dijkstra_main( void ); +int main( void ); + +void dijkstra_init( void ) +{ + int i, k; + volatile int x = 0; + _Pragma( "loopbound min 100 max 100" ) + for ( i = 0; i < NUM_NODES; i++ ) { + _Pragma( "loopbound min 100 max 100" ) + for ( k = 0; k < NUM_NODES; k++ ) + dijkstra_AdjMatrix[ i ][ k ] ^= x; + } + + dijkstra_queueCount = 0; + dijkstra_queueNext = 0; + dijkstra_queueHead = ( struct _QITEM * )0; + + dijkstra_checksum = 0; +} + +int dijkstra_return( void ) +{ + return ( ( dijkstra_checksum == 25 ) ? 0 : -1 ); +} + +int dijkstra_enqueue( int node, int dist, int prev ) +{ + struct _QITEM *newItem = &dijkstra_queueItems[ dijkstra_queueNext ]; + struct _QITEM *last = dijkstra_queueHead; + + if ( ++dijkstra_queueNext >= QUEUE_SIZE ) + return OUT_OF_MEMORY; + newItem->node = node; + newItem->dist = dist; + newItem->prev = prev; + newItem->next = 0; + + if ( !last ) + dijkstra_queueHead = newItem; + else { + _Pragma( "loopbound min 0 max 1000" ) + while ( last->next ) + last = last->next; + last->next = newItem; + } + dijkstra_queueCount++; + return 0; +} + +void dijkstra_dequeue( int *node, int *dist, int *prev ) +{ + if ( dijkstra_queueHead ) { + *node = dijkstra_queueHead->node; + *dist = dijkstra_queueHead->dist; + *prev = dijkstra_queueHead->prev; + dijkstra_queueHead = dijkstra_queueHead->next; + dijkstra_queueCount--; + } +} + +int dijkstra_qcount( void ) +{ + return ( dijkstra_queueCount ); +} + +int dijkstra_find( int chStart, int chEnd ) +{ + int ch; + int prev, node = 0; + int cost, dist = 0; + int i; + + _Pragma( "loopbound min 100 max 100" ) + for ( ch = 0; ch < NUM_NODES; ch++ ) { + dijkstra_rgnNodes[ ch ].dist = NONE; + dijkstra_rgnNodes[ ch ].prev = NONE; + } + + if ( chStart == chEnd ) { + } else { + dijkstra_rgnNodes[ chStart ].dist = 0; + dijkstra_rgnNodes[ chStart ].prev = NONE; + + if ( dijkstra_enqueue ( chStart, 0, NONE ) == OUT_OF_MEMORY ) + return OUT_OF_MEMORY; + + _Pragma( "loopbound min 100 max 1000" ) + while ( dijkstra_qcount() > 0 ) { + dijkstra_dequeue ( &node, &dist, &prev ); + _Pragma( "loopbound min 100 max 100" ) + for ( i = 0; i < NUM_NODES; i++ ) { + if ( ( cost = dijkstra_AdjMatrix[ node ][ i ] ) != NONE ) { + if ( ( NONE == dijkstra_rgnNodes[ i ].dist ) || + ( dijkstra_rgnNodes[ i ].dist > ( cost + dist ) ) ) { + dijkstra_rgnNodes[ i ].dist = dist + cost; + dijkstra_rgnNodes[ i ].prev = node; + if ( dijkstra_enqueue ( i, dist + cost, node ) == OUT_OF_MEMORY ) + return OUT_OF_MEMORY; + } + } + } + } + } + return 0; +} + +void _Pragma( "entrypoint" ) dijkstra_main( void ) +{ + int i, j; + + /* finds 20 shortest paths between nodes */ + _Pragma( "loopbound min 20 max 20" ) + for ( i = 0, j = NUM_NODES / 2; i < 20; i++, j++ ) { + j = j % NUM_NODES; + if ( dijkstra_find( i, j ) == OUT_OF_MEMORY ) { + dijkstra_checksum += OUT_OF_MEMORY; + return; + } else + dijkstra_checksum += dijkstra_rgnNodes[ j ].dist; + dijkstra_queueNext = 0; + } +} + +int main( void ) +{ + dijkstra_init(); + dijkstra_main(); + + return ( dijkstra_return() ); +} diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wasm b/targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b9bda803d1414755fb3814ce32dd35755936952b GIT binary patch literal 11656 zcmbVyH`DV~4(`vB+ZMp!@XG&pC}gINgB!!`C37ehirMo3Fn3 z=GPexL;wT;KnwDOe*PJF0>H;V`12D0e}?QJ_IP~vz5J`MW&Epezy0p@?N8q*005&1 z2!Swyg5QB4h{7NMYV7dOp!j$H2PA(6#J~IRzx=6J+O0)`?HAwt2*AkK@)zF#2=Vx(&Zln_7$hH$ zfA&fK?(vd;_yj}5U*ZS^kiSDgZhSZk7Z>9rDwV(f`{e_MXDi~F#j!~<8;L?2=gh*Odt~UMP>K9D^ z;iH$&h<+)lg#JOp2cpkHMy)W?t3ZOV`a@t9^&inPQ2zrv4XHhqei^_=S*@lD0r6*b zsGoIw2$3L6{u7IVaGQq3-~L+_1dXWozWR~|zf1$bm%(3#2mXmp=0h!mihuR@z(5bs zC=E>Y;KzWFl1d5mnUa6VGx{fKS@SE zll(^p|3omU8W;Sq>hFLL=lR7D|A=Qu2au%r^Jim`e+h!n&!Sbd{@%y)!4KQ1tbI6+ z%J1)hZyCV&uRr_$&!2tpqtCzoY}60#KbH(2e(?vf+USoSsuKE#Iv+KD@0Dr|Q04y* zK&>A*$$tldnx8`-J_v}$Uo$}Xm!gVAt^VPmDirnmdzhaM`Y|2r#@nIX0^6CZ(7Cj_WJE~_sd3+wK}`a z`77C_Gr3A#NJS=1lb(#nk%t0Q)&T$%x_+fS>a@%&OA2bO=9l&b8pu*xj@jk|TgFwI zUbopwCJ+rw;tkujuuoWQk?LNNrBt_muIdB1R!W*qXOeNFAl-tX4bO;&m#6?GM;+&4 zak;+@rCj6&Yix8Lg#khY@r)gKG@k4j&cpH{h8}aWLL>FnhF=h7DpjXu~u3?U7T zOHcX%&%NVnU(sx8=WB_lTH=rhSA5!QkZISl)3P4oG9F#z?cz4pnH~?7o70MU)FzPj zxHU7FFI!p#6q|$&4!b`R5UVvUHD9Dl8|<#z<8t!$NDa^p5f3xX&afsw%rMsEEQXgC z!}pYOi@>nZN>f*!9cQeaC^7^YTVlv* z+`hU_K8so7b!)L;cl@B=!6#aHZd#${FlHqBSjYjF6VqI8%HmLE;0^SV-j;~Di|ZnC+tu#2V5nP3dHegwymY5H*T!56df%>9 zW>$zbaXQBa4ayAfd9%8;#{GOv^c5{u4wiu_ioyn%uZ9`Nf~aU5{gSVd^MqSle28GK z;ZB|%$&4nn(K*^v|uKt>m|Ga zfJ$FjUDd?96M*F!s3$>FCb2DH^3B=?s0QF2RfhT1X`p=$+z0UR=nvw!<-Ro>hUvo& z<@GF)zh9!QSMYt=ci3fUVI^M6hQ1SUn%DBE5#z{rH0ObG?ix@9SG8q#Fw4lo!n0~k zW*xG!c1qFh<+h}cks`RNjq^P7<#7|1MI9iFxxY5zRV*av4} zo6m;RdhNV+>!-CXb^CtUp_k=OHJ=1hm3?WqrZ7-SbR6~uy9aQaf00T};?uWaQo8Yi z)kOmeAjLaR-z~bj>A~|gqtL}k0ISNAx4v=CG)_9^Ie$9C4D!@VyOB9R2s^vP+E-Yz zWat!g0@6Ok;2CC_;EGpEI8lxT>^Xg*Tf3(o+-Aqw22~-AoG&EI4o>M=YKwK0SE*cY&tiCvoEwuT(t};?KIN?jY67?S zuF|>)IPkSkfyB)Ub~h4Ge6_9f+Z;0~cIW|dnwWuQ7J<&eQ7j3}tx^;YBW7VpwhW?( zcNc5vanZzV(JOJubT82}`yu=f4o55dVRr`H+uu}LLF3`HuC4aoh}yb`6o!!2IqKT zNxhYx3mJS&mvd}zXRUwdFw%3z0yjE(uHskDQ7*f}g?eAy6vomt*>##y zCdr%=^M{hQN!oVwjOg7}M=0_y=TlSJpSw_VXL2)xOoDc_i~{O*h)wrtnJx}BRnIls zXiU=cZidqFnef_MJ=n6QjWlZQoWTp{&NX>F{N`bzyKXJEX>H>5IIUR^kIrXE-}N%_ z#@lI?u3mKU(&a3+1I_B51$8ay5=*)KT5RJ0qDcDLaDde6noga@{qZJTOi!?#Sy^4R z{`HtC?w>mBbw8D(3QP7j4;YBe@pB7{ST|jD3F5WQj?v{BE?a}s1dfC>(QzT`U)s6~ ztn}QSL(o$+@GSq<*pFGabN%+(43om6wQY1Z-YP{^lfhVHdUbKs;-MK#k=N@GqgLQs z8(e|cr_lf#O8$zjjNSm{JxKPuF&oN5n!+^xp1u)%34X{`zaxpbe^Moy&1WrcuJUbXcY`cUN-HAVVk@&!sG%#RRc$!=Lpwrj zx=bz~^#l=NP&Z68!FZ*XL7bE3URgzbCT_9iJj%gFS7trq6}Mk=3*%!G9}uq4#pfTh znDYubQVu)N5sXz4F;Ka{gdP%DE3I6U5}227=0i9!32Xi4z|*dq4%vKv*_bCsETA{^ z{EIplXbR}d2d>>R93911r>Wb(hYnA$JL}6fFJV5@4!+@H4oCRn#v`j;`w73-qQWJ6 zgs*wzOqR$X>m4XY>4L5Ar(k6pwgtdL2Db{x8ZW+|0)uT~Z710tJF8yDimXAnyIcmR zGmYcmJgt}Zv;Wq5GM=!r;LpA=Nin@`BS7Y)JtL3TY%3y_0j7KpFNy9=I}yj%_M_#m z%%CJG8f)6LoawYyR$3LA1{wVena~+#o;}Xw56N7)oUe7n@tMb(dp$b zQ7YD6r)1<6Du+_Vam)kbz3_fptnY#B|8i}GSa)qxBqc${-3%1v*rlgjWle`Y+OCAl?bD_uvYoe}xT%5Fu zqdGAh2)bJF{^;p#iF>)DxHv6edLQeprk!GPm!UbcnTg2=U3SI{X@m+}Y^T^^`pzN8 zHWDsPtX*e2Km)$gwciiNHnHl!(-H<=bZiLCO=WZBhylAqk9yQ{twxFLELLhz=j%`U zc{~&J`-kRO1X?1SxbFp3ih8@hz8?Ar4ZN@~F2dC2zPnq^5tAl;N&WtQo1D#phYJQx z^Kz?CLqHY_H`n zh)i2W?IG`-KY4O$$=AG+C+OR(5h@Db%JiV)l_SPfLi~vu^vPRPRt?^0d=-aia zygi~b?hcNbP3e?vA^#%)1qqrrj!T1nG`K0358dI=QrE{_=|*N*)y(U$ob$vqh6~(;QER-Oaxy z*H6$r_lQdJ7UKhW>3IU}rE{^)YLcG!XhK*9WST+SV#taH?8 zHsiL1Gv_|LwdR8h_N3~GaXz7G6Xpi-epBcp4tALdU&@?B3QRF zheRz5opw7Ka%Jx!yz7J56N-(Cc;-a zD--~s#lybG)SoI1R@HU&neGdlt)-?0Mh9ku0G=Qp@MfiI#eI+NCe7tR4)vE-51e2t zla*(J)jjAjF(+TcAz0S6fp;D3#_bKfHK36~ZQ(LY{*hjro6Qf4_d6-JdflhCENr(o z!;zf?ncArR+C_Ap^&4Hb^yHOG9m{VV;Xo@yG{Dqe8gCqAGk$&05C{5>=fcBY)jst2JkYQtKrzm`_ez$&JM7Kj zG5d!qPLHyRbewQbSYE z)n7vj{BB=%7hCk~EiN|d13sD~_E69_Hp*fl-8FK76=ICItv73Q2(|CcK0Ydu!)>9o zG$78+F}Ccn&0%QWE?a==_F*x@)zRuvrYSIMxjr@iX*?d8O)MIJR9iasBy=dx3)OdS z)R8OIYO56N*CRSmFbC?_0#!R(e1}$+@IKe~YRqKpMGbJfXb{Ir6S(TAJQU27TQ%`w z&EyvarePUPPoW3g?e)FAdSb0kF#9W&^#a{-p1f{HGaDs3Fy@?uwnWQWMT6*FHpHC< zjYyk?wLlLB@@?+t4)1{Mv0Lf#%~jL}l4nGn{>@OTj;w^1vq%soOiKChv%f1W}M(*>w#*Ah;hS195o z?RAR``_TQW)#z7qL#XTNpP9Tb)iz(kr(Kpv(^{&jQ?NuMrQlRAnTWh62hYxwp723; zhZw%MyLz+GgGsV~xQ3r}>^{C7s(3*0`dxQT^Lo~qioSh0-a6lH*D@cVZVtfoei_{! z?VbtE&-zD#%`|h_(}hXO2$`BueG2zc4Cd6?di zR>#dy!Nn`&<1K8r;O|&xSbx%3u))g{&nZ#LHS$&q*IFjED9@e++~76k`)MCJ-)neA zx^gccYtJy*>%yfgAKL9+l{4RJ`T_Kw3N)q9=#nSk ze(xI_9w)Wg5lP*Aoq}mcJWVA9n@LdMWXkU{+-(!;YRS^vrq>?Zm+1H)-1qH)i|#J- z#&**$5cJ7}V~>EXXWrH9PIA7Lla^zA-#z#IrgzcfkEhTa8XibiTYx2#)+g$vZvC#? z$q3kc5_(V>z*h)&9F>DjdHMD=U^T8A;`>-!n?=_-rS<4sNvHz2aNA{Un$jlwh>gs> zGjsTS-bPQEw++G19)f~j$c)NN-l1$_! znU^X5h}QII=P=_8$%N`4!%|3&Awq;Y*6M&T%bQjc|3S0$mEVzPCF{O-J!;^r!^loI z(m5|TnuY_)`uE8~VVN1bqupA-(e{B+O%O>b^)pB3hhVFFKuvJLH=6~Ckf?}t0HT9Z z@~zOi0JnXU`Td3|2V3-1#%3O^mLE@d66G1`Yk5)%;@f`6s%Sx| zA|r@6glU8*e9?26}KG=Zm@SS@kT=!y~}KHM4vr&o^R_wjxHxUSdh28Hr$s{axAkk$w4;%K*{nY@Cx9 z9U0i8i)PRuCJqM;9)c)ar5}bvaV@ELjIZVJEuM_@CT4mw+?`gIOGBggVMdX=Oq)xi zg(=R*cS_q2s!k}N+e9i-X-nfUFeZ)S z);irJ6TO4kJB#0^uGbN@kpUxXO!@Zp2m}igl$vQ`KkRM7M~~*d5UNOd^h&m7I^0!1LHVmdLbNO?i^);SW=#-cb0p0j zq>)-3hM|+yL(tFUqpuS8&^Z!57ilt-z^t=XLDV1`=7Rdnqa61=GqFmw`6{Wd)ANm1 zJQH>1M1OJN3pgG70ME^?2x#e*NBC6}Z5^s@=XxQ`UyR1<@~!M^uNZrGs`Nol&Y_I9 z3=cDf9O%t}Ov3HAab#|3(x)fnJHk(6oy{X;i68pf)e2kNLS!;`syxteJWEBl!KLHv z+cMnwV3fPPK#~=Jz)Br7KU5VgbM|a`QqUzHJaRxv2~Xh_&EEV`s#VhQU;@ z*J&H^l|Cnq>vAD!Igw7xOX<6VZF{;GEf%G?F*Mo_;=v3myZKZqce0yh-Dt#@*C#Qf zaBu4(+;;TA++zo6OR}>QxWL+ujK;3*(o(xF+SOgm=)zx%iT;ANdP|tCi zw9LYc-1B~UtFE!A#)-C(EPHT+`UIR6ug5!{8XSBlqieJi+?8g&c`IX}`V_P#QATRn zImw$&3V0q+DIkr?m$3gxX$$7JTrSa+jndQ_QQw*;A= zm^bswW+aR!qk8xOE_T^>$P&(8YBr7y)M}%dHpg6Sg8%8MypGjr6iJNFtTh8^?_|t8 zm^J6_CX+S!G2$>%14+_C5z!w6Z?`#` zjPX(u2j;K)OV^klQ~rp_>6N{8Ps6k4kxLWD8Pg7EtnaS64bY4JJXcDmxM2i;otnM0 zgH<=IP^ax+(&-VMyN|OQ-|;?o`VY1}RrVvVf~O*wQdmf^#ro7FRdGm!G0*6s^4o+z zY??IX1L!dxe9BQju^0!TEW2yXUY%ESBUJ|JUVhSFQ>hiMvBbCSrLp6#7tUd-%&@Se zNapV821YcbX}yDvy>2i6uH%NB&Ogve(k@Cu!|o#nca2s9aPBkq@Xp%0hshDmZHI^c zM2wJucb*9Ztr=x%U|uG(c{#UMjpmV3t}@TlNV5++_FX})K6aOWem^ZN!pT4~&5-YeB=h+WkW6`^n2n z!!OUixZj}<;x@wq)|CT;7NbjG^)G}OWLcAdUK^&uJ^oBO$rZZpo_pN8x> zph51Zc0BtTesd~dx0J%get*u7(DF1Xtw~ce`^vxH zmetZAIx;1!Bh*7qsryRcxdz%wpRiy?#V?uFqntmb%KXR*-9I?UmPya>PIQ?J3> zdc_47>+a@-;J5N7}k@VEHFVma35$4e*1gZf~Mp4xdMY1|s( zD^rA-rWVf@ZPV;Y$>onDz6^}^1lwXXtS`*7b&+?;RQVBVEcHPIALB8Lj^LTsOX^ij zMc@rvoE>FRXJT=EEag~OyzN)iNQaige)wpE_7~fnPN>T&m=4I#ZsBr>&{VLFytK0StjAIy!I>YLp0lB zfnqJEF3wI@u9-$s^*a-eCF(AO9O*P+`9AgNnCVW>OppznD`l~4mgJAaRE;wXOT{kb zxw}36nWkSLiY51`3+$F;gyB{pzB=0a~@{MHsg8Q z{t|pO`Ir>-Mqa^}>g(C{4z4J#%P?-9oi(jY%#Bq8*=KEAt7fBWI`8Q&7v05VtLjEM zx>t|Xdygw67~2LlM|LU>w+lBoOtA_SLX5rG6nPVhaIs0{us$Gw+griAD~i5G`}OSU zeNvf;ippI$&@)F`o7P<-zMVarGmUlBAbS`0+}ojVZ$kwG8TXhA==2D>r`)t=FGk?Lc;ZG2`GhXkXC1<8E&q zLKF3w;uLVdCd58KL8`^MdSJE2bq2WwZkR!p9VEIg^=-?9-YlNLytjzFYx_wAh;(~a zAUbEYyV<)Nlegp!lX)m~bgnNxRImk9Mq_>DITCY`idynNO>;45X(Sd<<+aCpd|~ zElha9Qw=EbWjj|@(`b9+@pWyyrzU<;uW~0EE`~BS*gSV?uUw;5*DbQdU_2o&p0lw4 zquX(1XEBuEdWtCAqWWUKD%QPGCid_?$;I2~jY`W(S@EcAzZgy|N>|8i@(bp0KJ)T8 zo2&)cyd9BOzL2o4*@jy-`zXj2wl?^Vb159oiNh#{W3bzm%19+i$yXnNx~03!?#Uq? zbl4{NZMpAm$m-qU&pw|mi*R2gJ@l^sBwSwDs7*;Cn=`$Z?T_L584R}Yi>Pc>=Bv*SIFu6d=+GKQ4o$59- zGFiwrCi{Kw-e*xG2nTQ_cWBxl%9T$HLnbcOe%=Lr*&iy3q{Ml$>?Eh6N+>!ic4FrO=5tR`=150*hDVjN-Xy--4feefB$SgEjS zb!S2{TuMM@JX+wf*jhK#qm}cP9L$P+;6Vw|me;~_YA95}Uow@(cGYE)YFYB=a6jsF zyaTUrUJWN?jXnrou&b_eYtN9#+SVpbDHmPuJMcs|HaOl{+&Uo+Y%6s+Qvej&9JG)c zyBub`=X7W1*Yi;qXp7?;CgvQ0f^(^Em!f#!de~VK^QI+alJp$3I6ZkwDw%I|{bFDq zj^p=RUB|$2KI*&{M|Zh?GA!QJr~7if*!nk5YHx+bl4dB8kG8MtxZW0;=*%C4te2X$ zRsdnxCiM~-WLZ)0Jx#MtBIi9WJwnH{j?d^s2K4SieSe(dV-93k&Ne!-U`cKgW5B+g z*{ml!B~>?rSIZ9VJ+VZ*BZY0(6hiM1TRWTFfo(B<A z_)&iU`tkWl@u%-`38f`9k@x5`iNPv8Fl>eS-<(+@v{q$K}OaPMMNBR3-efsh77oX%GfBOE@4+u+q{nJ-Je(}%c zuYUT(8ovJNNBQ;Dr}VGB`t~J%^#g18{?lK4`u@{5?@#F;fAig^A6V>%FMjn+`qRJs G@&5uabTZBW literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wat b/targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wat new file mode 100644 index 0000000..1a7c6f1 --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/generated/default/dijkstra.wat @@ -0,0 +1,467 @@ +(module $dijkstra.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32) (result i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $dijkstra_find (type 2) (param i32 i32) (result i32) + (local i32 i32 i32 i32) + i32.const 100 + i32.const 100 + call $__pragma_loopbound + i32.const 0 + local.set 2 + loop ;; label = @1 + local.get 2 + i32.const 27072 + i32.add + i64.const 42945378002703 + i64.store + local.get 2 + i32.const 27064 + i32.add + i64.const 42945378002703 + i64.store + local.get 2 + i32.const 27056 + i32.add + i64.const 42945378002703 + i64.store + local.get 2 + i32.const 27048 + i32.add + i64.const 42945378002703 + i64.store + local.get 2 + i32.const 27040 + i32.add + i64.const 42945378002703 + i64.store + local.get 2 + i32.const 40 + i32.add + local.tee 2 + i32.const 800 + i32.ne + br_if 0 (;@1;) + end + block ;; label = @1 + local.get 0 + local.get 1 + i32.ne + br_if 0 (;@1;) + i32.const 0 + return + end + local.get 0 + i32.const 3 + i32.shl + i32.const 27040 + i32.add + i64.const 42945377992704 + i64.store + i32.const 0 + i32.const 0 + i32.load offset=11032 + local.tee 1 + i32.const 1 + i32.add + i32.store offset=11032 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.const 998 + i32.gt_s + br_if 0 (;@2;) + i32.const 0 + i32.load offset=11036 + local.set 2 + local.get 1 + i32.const 4 + i32.shl + i32.const 11040 + i32.add + local.tee 1 + i32.const 0 + i32.store offset=12 + local.get 1 + i64.const 42945377992704 + i64.store offset=4 align=4 + local.get 1 + local.get 0 + i32.store + block ;; label = @3 + block ;; label = @4 + local.get 2 + br_if 0 (;@4;) + i32.const 11036 + local.set 2 + br 1 (;@3;) + end + i32.const 0 + i32.const 1000 + call $__pragma_loopbound + loop ;; label = @4 + local.get 2 + local.tee 0 + i32.load offset=12 + local.tee 2 + br_if 0 (;@4;) + end + local.get 0 + i32.const 12 + i32.add + local.set 2 + end + local.get 2 + local.get 1 + i32.store + i32.const 0 + local.set 2 + i32.const 0 + i32.const 0 + i32.load offset=11028 + i32.const 1 + i32.add + i32.store offset=11028 + i32.const 100 + i32.const 1000 + call $__pragma_loopbound + i32.const 0 + i32.load offset=11028 + local.tee 0 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + i32.const 0 + local.set 3 + i32.const 0 + local.set 4 + loop ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load offset=11036 + local.tee 2 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + local.get 2 + i32.load offset=12 + i32.store offset=11036 + local.get 2 + i32.load + local.set 4 + i32.const 0 + local.get 0 + i32.const -1 + i32.add + i32.store offset=11028 + local.get 2 + i32.load offset=4 + local.set 3 + end + i32.const 100 + i32.const 100 + call $__pragma_loopbound + i32.const 0 + local.set 1 + loop ;; label = @4 + local.get 3 + i32.const 1024 + local.get 4 + i32.const 100 + i32.mul + i32.add + local.get 1 + i32.add + i32.load8_u + i32.add + local.set 0 + block ;; label = @5 + block ;; label = @6 + local.get 1 + i32.const 3 + i32.shl + i32.const 27040 + i32.add + local.tee 2 + i32.load + local.tee 5 + i32.const 9999 + i32.eq + br_if 0 (;@6;) + local.get 5 + local.get 0 + i32.le_s + br_if 1 (;@5;) + end + local.get 2 + local.get 4 + i32.store offset=4 + local.get 2 + local.get 0 + i32.store + i32.const 0 + i32.const 0 + i32.load offset=11032 + local.tee 5 + i32.const 1 + i32.add + i32.store offset=11032 + local.get 5 + i32.const 998 + i32.gt_s + br_if 3 (;@2;) + i32.const 0 + i32.load offset=11036 + local.set 2 + local.get 5 + i32.const 4 + i32.shl + i32.const 11040 + i32.add + local.tee 5 + i32.const 0 + i32.store offset=12 + local.get 5 + local.get 4 + i32.store offset=8 + local.get 5 + local.get 0 + i32.store offset=4 + local.get 5 + local.get 1 + i32.store + block ;; label = @6 + block ;; label = @7 + local.get 2 + br_if 0 (;@7;) + i32.const 11036 + local.set 2 + br 1 (;@6;) + end + i32.const 0 + i32.const 1000 + call $__pragma_loopbound + loop ;; label = @7 + local.get 2 + local.tee 0 + i32.load offset=12 + local.tee 2 + br_if 0 (;@7;) + end + local.get 0 + i32.const 12 + i32.add + local.set 2 + end + local.get 2 + local.get 5 + i32.store + i32.const 0 + i32.const 0 + i32.load offset=11028 + i32.const 1 + i32.add + i32.store offset=11028 + end + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 100 + i32.ne + br_if 0 (;@4;) + end + i32.const 0 + local.set 2 + i32.const 0 + i32.load offset=11028 + local.tee 0 + i32.const 1 + i32.lt_s + br_if 2 (;@1;) + br 0 (;@3;) + end + end + i32.const -1 + local.set 2 + end + local.get 2) + (func $dijkstra_main (type 1) + (local i32 i32) + i32.const 20 + i32.const 20 + call $__pragma_loopbound + i32.const 50 + local.set 0 + i32.const 0 + local.set 1 + loop ;; label = @1 + block ;; label = @2 + local.get 1 + local.get 0 + i32.const 100 + i32.rem_s + local.tee 0 + call $dijkstra_find + i32.const -1 + i32.ne + br_if 0 (;@2;) + i32.const 0 + i32.const 0 + i32.load offset=11024 + i32.const -1 + i32.add + i32.store offset=11024 + return + end + i32.const 0 + i32.const 0 + i32.load offset=11024 + local.get 0 + i32.const 3 + i32.shl + i32.const 27040 + i32.add + i32.load + i32.add + i32.store offset=11024 + i32.const 0 + i32.const 0 + i32.store offset=11032 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 20 + i32.ne + br_if 0 (;@1;) + end) + (func $__original_main (type 3) (result i32) + (local i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + local.set 1 + local.get 0 + i32.const 0 + i32.store offset=12 + i32.const 100 + i32.const 100 + call $__pragma_loopbound + i32.const 1024 + local.set 2 + loop ;; label = @1 + i32.const 100 + i32.const 100 + call $__pragma_loopbound + i32.const 0 + local.set 3 + loop ;; label = @2 + local.get 2 + local.get 3 + i32.add + local.tee 4 + local.get 4 + i32.load8_u + local.get 0 + i32.load offset=12 + i32.xor + i32.store8 + local.get 4 + i32.const 1 + i32.add + local.tee 5 + local.get 5 + i32.load8_u + local.get 0 + i32.load offset=12 + i32.xor + i32.store8 + local.get 4 + i32.const 2 + i32.add + local.tee 5 + local.get 5 + i32.load8_u + local.get 0 + i32.load offset=12 + i32.xor + i32.store8 + local.get 4 + i32.const 3 + i32.add + local.tee 4 + local.get 4 + i32.load8_u + local.get 0 + i32.load offset=12 + i32.xor + i32.store8 + local.get 3 + i32.const 4 + i32.add + local.tee 3 + i32.const 100 + i32.ne + br_if 0 (;@2;) + end + local.get 2 + i32.const 100 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 100 + i32.ne + br_if 0 (;@1;) + end + i32.const 0 + i32.const 0 + i32.store offset=11032 + i32.const 0 + i32.const 0 + i32.store offset=11028 + i32.const 0 + i32.const 0 + i32.store offset=11036 + i32.const 0 + i32.const 0 + i32.store offset=11024 + call $dijkstra_main + i32.const 0 + i32.load offset=11024 + local.set 4 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + i32.const -1 + i32.const 0 + local.get 4 + i32.const 25 + i32.ne + select) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 31936)) + (global (;1;) i32 (i32.const 27840)) + (global (;2;) i32 (i32.const 31936)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $dijkstra_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) " 6\0c48\08\1e,^,'A\133[\01\05Y\22\19:\143&A\1e\07\14\0a3\12+Ga=\1a\059FA\00K\1dV]WW@KXYd\07(%&$,\18._+Y \05\0f:MH_\08&E%\18\1bZM\5c\1f\1eP\1e%V!L\15MdD%\08\16EQ&^9L6A\0eYE\04\10\18/\07\15N5\11Q'2\16<]Y^\1ea\10A+\14\18C>Nb*C .19<8,%K>\11\0d\0b((\04_d\009R\1f\00\018C\1ed@HB?\12Q\13,\02?QN[@[\02FaI@a'\15NF\15.\196L\5cT/9.\1f&\1fK(=\15T3V)\13\15%:VdaI,CL9\12H@\0a\04@J?M\0f\12[T $M\0a'K#W\17\16\1e%\1fA:;\07\0eNO-6S\08^\0cV\09a*]_,F\05S\0a($\22>BG;a_\12\03\08>0\13\0fb\1c\08\09PTH\15+BAOG\0dYN1\16\05\0e;A\0b51Q\1cM\1d/\5c\1a)B\01\142I\07;\04H%LV\19\13\00\0e\18\0fI7]]\03IWPDd%^)\03=\1b\13!#N&I\0eP:\05c;\13\16(;N \11/G\03^'\02ac\09B<%U;&\1c?\0a\08\08#Q\06G'\10\0aE\08#\17\037)L1DS\17C\0fa=\0d=.L+\09\029F\1c\1fE\04DT\0a'\1a4R4\04]U;^\15!#C9,\1cEV%N6^\0e0\19S\12;!\1cc\19Q.M3'>\09 1+!\0fdM\09D\1c/\0cR\06\1a`bK\0d9\07\087!7\00L\05\05\03\0f\035:$\22\17O\0a9\06\17E6\1d=1\1b$?T\09G\04\08\19GUaMX\0b.\06#S\07\18\1b\11R\22(\10XE,\03>. -7\021@^W\0eZ?DDKK\02\17R\1b3AKUG9&'\00\07\01.'\0cD)\1c\1f\00\0e-[+\0c:\115\1a)\00\13\5c\1f<*\01\11.)T6\08a]\14@\00\0e=\00\1cH9G2QYF\07`F\1aW\01W_EF(\09\13^T\0fWG-WU\055\0d+\0a2^[&?b!c[VB+P#O\14\0abP=\0dB\1f\18\12RaH='0\0bc&1\1b\021\1a;\00:\01Q;PCFM.a8O\1bQ?KM\00$R0/Q5>\077Md\0dN\18Q\18S\1a[\12\02\02\0e\19/\07H\0aS\0e\0a\12`\19A*N]\10 F\0f\0b/\05:GYT\1bIV`XM+_0\13+>`=\18\14\5cBbUR`\14@ICE\1e\03\17\0daaB:2*\00,9V6UR\0e\08\01I)B\17\16=+V\00\09\15\1eO,,K(Lc8\11dC(3\14\19 \00d\00I(B`\1d]&Q]\0d\01Z\5c.d 4K\1f\08:aKc\0d=Z.=Y\0c\22`N`\18$\22\04`\0dIUH\122F$\18C\0aR\1d3P+\0b#Y'\18\00IV,\22\09.\22P)04\5c\13$)7'\1f\161\0d3C;^,_0SU0\15F:8-\04Z[\0b\03+FY-M,T\08BdXSB.ML\06\18;['.\1aaD%\00:\1cO\1b%0\10R\18\0b\15U M\0aD^F$\1845b\18`\069VZC\02>U\11\1a\22F.) \17?\108\05\1a\17A>\1aYP-4G\06:\1b\5c/==K-NC.\0e\0c5.$R\1c:W\15/\11SIH?U\18![0\1a1>5\09$c5\03\0aCR?OT-\07)b_YR+\1b5\05NM\04E\19b\115\10]YQ-:[\0c(6[ZA@\1f>:V+\01\0c?I[',\19\1e\07\08S\17\00&\04-`=\17\01\0eQ\5c-,YJEJS$4-K\08U\12dQ\5c\07\1eRJ\224V`\0c\08b^Y7&d+\0bDS_\03\00'N\09Z?\08%\14SC\018C5\07>B\10\19\19GP?FYK\03%#\06&J3/\1eP\15Cd\03dD\1aBW!\1b4\0f5+5c\06\16X/\1a\18Rc\1c\15\0fK3_?T=BS\1c:\0e\0e:*!'=L\5c\190\0eO_\06FL\04bbW'\0eQ\01c\07!Q\01\5c`\10\0f\03\0f6\1e9\0c7\05]\00dcF*EC'\15\055\02\063L(cNb<>`;(\12:5@\18CS\04O\11d?%8]'Q\12d3;\05Qd?:=\185W@%\0aSC\2212&\1b!\048F<\0fK\06!(9;.\04\18K>VdQ&\1d\110OT0\1bdW\15 9MD\10\5c\09\16\5c1O\10_S(F\0a\19#[\1d\1eJ+\08\18\5c\02\17,\17\16\00B8\10:A\04\0f\0e1\1fK G\0a\08?-d\5c*I\012a]\12W$)K$\07\1e\12\1f`\16\0cLG+2EP=N*H+\00\0d\0fD\1eO<0\1f>8\05b\1d\01R\1aa\03&H(QYL\1a\0f5#W`\01CMEa\15\1c\0a\12Z \175=\19\22WX\03[\1a\09%QU@`\03cRAd0*D\0a\1d>X0\11\13%F/\1cFd\10I[\08R^Y!9T$\15\1f\01W.\09\148\04R\094c`8\22\08T\03\07B*@J\18:\1c\17Q\0b;\02\09\1a77\01LM\06\17W\18YRP\16Z\1e]?`\22\1b$\183\1e/b\08Id\11c\15H\00a0IV\22aJR+?%I7\00\227^$P\0aC]\07KAJ\5c@_?\1e9M\02*\0bA\10;\07-a.B?Q\148SB 1;'Z\17\0cQ5I\091\1dW\11H@S6YZAU$\1e\0dS\10#ASC\0e\07IFaU3\10\18\1aA5OS[\08A\0ab\14)0\16G>\046?$$\1e\10\09\02V\055$XM\1d5aJ\015S \1e.4G^)*\15->UQbQaISS,\01U -PU)64<\02TZ0\01=\07*E`6\1e.\00^\1a@ K.L*a\07W+:^a\096c;+\0c=F\13E\04\0e\16\00\1a\17<45\5c]AD#=KXF!RB\08#\1eD,\08_Q\1c?U\084V#)\0b5^\03\0c:G\0dU\0b\007,RW\13STW\1b\5cQ\07V\09:=\1b\09>D\15Q=\18]U=HFHI[\10\14M#\03\1aXa\12\22\03F\09\1b\1e%%\5c\04\18I 0\1fS\08\034P*\08>>4?AN\10\1b>2\1e \1a\18>?\1b\14C3;AAZ0I]B\12\00K/?\1aL^\03;\15BK\11@\00)\19?D\0baUF=1<\08X\12)\06\13\0f\130)=)\0a\13>*_.\05_5b:\15\08\14\05OQ\15\048\08YaQJ\0bd\15\12=\1d_.9%(\02*\018\05;+\0eO\0e;\19#\1dQ,T+\18:\14[-&\11Jd?\1f$\03!,G72`b\1e(\0c7A\0d2\0c9!70[*&$.7L-\11\06QW\06\199=)4\19%\5c\03\5c\17\10\07#J(8\15bb;d,PKYaR$26\1b\06\0eD\19\05\04S\08>\05\19E(AK?4H<\0aGF8\0c;4^_D\0d\15)^7Bd\190\0756cX\16\0e\221[G\12.SMA*% 7\18'\0f-\04\0e$\13\15Y'WLc1\04X@\04$6K\14C\18@\1f \00\1d6\5cEE$'S':F\1b?8F\1c\05J\0f#N\117\12%X\08\00U)D\0e_;1?=6\0bBOQ^)\03\1dEKE2\09.!\1e\1eG\12'%\02P\04S(\1db\0294\0d\16\1eH\22-\0b\1d*\0dV^]KZ\128\1b0!!\11N7?E\0a&8\02\1f0 ]\13 \03\1e=.+\0d\05\01X`V\09Yd*\15\11\14*P7\13\11\0aX\0e:\13\06M\11MIO\16\0f:^S-7D\14+D?\1e31'a\03:\0dP-\1b\03\1fdP0L4]@!2\18R=-\0fRY1\0aUd;\17`\1cQK\07]D\0aZ\228\03LJa\06I\0c\1e\14(K#X\1dU@\0e2\16%\0c\10UW\17M\15dB7\15#\1e_\1f\02!\0a 5\10J6FE&!S77WCGG\13<\0d(\19-=.P:\06N<'X]:F \0b'\00\10H2G]$%\1d\0687\13?P@\17\19+QbW)\02(d<\09\1f%\0eb5V/Z,S\1aI71\1b(\0bIF\00@\0dR=BY\1d\06XY\0fU]\1eR\0bR`\01\1aN\1bAd*]'5\1f\096`Y\01\166Z4<+\06*\1bcHK\0a\13F\0b-\0e\04\0a\0d/E4Bd\1bV=\0f5T$*#`U)%N(K5\10_\16^\05$b\0f\0f\0a2\22M\10=\1cM+RQBN\5c\10\0b\22 &\1cKQ\09\01;B>d\06@+\18H=>>(\15O\181\1aZ\1aTH\03TF\08\0b-YX.\0e5JP;&YS\09\0f\0a&7\1fS-Q\08\01I\5cI+K\09356\05(BV;'\1f\11+\13B\13\01M9\16J'D\14\0e#<\05\07\02/\10\13B$[\05D+\1eJ(/S\1aO\01\1b\15\181`@SRN\11)1\5c\09>J\1c\1bMVc,_\1cT\22)!<\14\22W);$\02YUU \02\19/^#\09C\1d\02+Q\016K`\03\09%$#\17%\16\1e>\18!2\08T0M\08_F\09F%\05I.VJd\1b#F\02H\05%_*\19\19\031\18\13\18\07C\00R\1cG\5cbJ?FV\0e\094)-\15+S]/,#H#\04X;[\0b 9\0b\0d30G1X!U(0=\5c7\05OA6G\0bbHS +F9!/Y8\19E\07I'8\1b'\06C5C\18J&\02&]I18\0bcY6\22\0bW0C*I#1\0b(G\04-NGb\0a_&1?L)$\5ca/83\008?5\03\1d_L\1e,6FQ:R:`-E8ST\13;\18\15\10W\22H\04\00\1b!5\1f\1c/I:9\1a^&UK>PWa#EP\14\1b\03)+9KQ\1bK\08<\1b\05X)N\0bbGG\017\0c@\00c<\01C(\16=\09?F \043;O\19\12I\1eH\0d\071MNWOcc*A?DC`\0778TT]\0fX+K!\22;H@bU%\0c\1bRc\05P?\0d\0b\5c0,X7c\09\040\01\14\02\0a=\01,VIJS\17\0b>2]\1a\16&Z\01\0f/1;\22G\17,K&\0b=(\16\15) \07\0d\068$T\114L,JPd*`.[\14Q\1b\0a[\020\01\1dXZ3_\16:\07_\0d\09N\1f=\13)\01A(+\1aVd/ ^\17\16>G[[:P)\12DA\19>O\00\05L\1b\18S\1c8\16%RJ\03_\06a\11_\186U\0eN\1f8`c\14W\1bAW \06\0e\17Y\08-M\0c\1a3RX\17,G\11D\19ER\02d\03c@[U[\15&Z\1c4OS\1a\17<&1\0aV\02!\1dJ\10aA3-C\100\1fQ\04\10%\1a\14]\14&G\02@^>E\09H6\0bGT36P\0f\04\18SX'PD+>G#R@7\13\00:T_\13\12\03:HQ_7 \0e\01/\13\5c`\06\1eL((%MK\13\06\1e&\076XDI\05GaN3:c1HBa9::?6!E<%\0c\018\12\1f<\5c3\0e;Z\13\1dW?/\0a\1c`R^:'\11\10D&\0f\03@4\0fAJd>\00\5c\0c\0e2\02!.7?;A[\14.2O3\22=\13HLY#_\03CDE\1cD<)RM+R\16b,/\1c\00CJ2\0b\5cTHM\15\0eA\17\08\22Z*\02T\0a?\18:\05!\05^a\0f(\18\0f\06A \128R8 FFa]N\1e0Wc\1fa\1b\16\14 7]\194\07\1f*Z\04\06XY>#,<\04Q8?\184\0a\0a\11\08I,\1e^M3VDE;B\0b0FT\01:\0c%DH)0_GI\0c/S\1d78J3\0f\10\02C2G\5c\0fR\063B\07K,,+\0f49\09\16`Y#O\11[\009\07RI\09\0eZQ\05\04\1c\0b\16<\13a\03\1d\05VQ?=E:1G\02C\1bEZ\222\1d,@\12[$YU/\0a- \07\0e>\0cd\08)=,d\09\0eD*)%cKW\1bU\11-K5!\1aB\0aGcTU<>3D\03\0b\0bEW\5c$` '^J]W:\09\1fd\1c\1e\19^\06>\5cZ\0c\114\1dV7(?Z^\15\5c75\1f\0e]\17\00\11cb\10\1a\1b\07V\22#NZ\0d_)+.>1L3*a\09?\0f(M\08?+\19=(\075DQ&DRR9_+A%7]W\1e\0a_]\13:K;\00SX,J\0e2/C\11^G3K5KE`\05I\10b;\0d\07\13\05]+P\11,\1c\046D\12\03\0e3X\07\16\040)-\11\022Z\12\0e\0e\1fX!\03QM1bW,\02\06\0bWL]\04?B\1a\22\0e!Ob#\1d5\13+C3\1eB\14M\08EK=O+![`\091d&\0e\19H\1c:3\5c;.,O7M`3\09\0f\1c\112E-\1d\0bNV\065\22I\5c0b\1d+\16.\22/\5cO\19\0c7W@@D:0\12];\0dF\02cL8 \0e\0d.\0c*Y\00Y\17\0d.\01\05;\16\5cY5<\0cC,\04\5c9J^7\0f\0f5\1e\1cc\08GXK;MX\04,]\1dB3\11U\0a`\116d\08MI\02\1fY\112U.0]S#C\07\0b6N\15\0d\07X@[&JW8^V@F\19 CP2\10@>\1e8\0a Y\11\09\08_\1f\15D\12U;\16\18\0bNTa*\13X(VCZD\1e\11c4\1b\1e(,\051\05$FI\14\15\1f+\0b*\14`\05\1c\0e]EC\1a\18\228\08cK#_\0e.\00\1d3$B\179W\15db\1dV;\00QJ<\0f(V'(\07/\05R1d?_B\5c\0b\029\00\19\09\15[J\11L \11\16H+%N\1cM\12$ZZT&Y.c\15\04\09Z\1b\0a\0e\03b\04M\0e.Kc#/)H\18F0\08H\04b7*5D\07JH\10?c\1a+\01\18\0d,\04\19\13\02< \0a \16P.b\112_&;\0d\05BWM0\0f*):\09\1fG6#a'\048%\0eX;<\008M2\11QK\1eW\06T\1d7c%`9/\1a^C\1b8\05b\0c\08\0bBC%BZPS\06=\17\02/\1eV*33P.J\1a&C;\1f\17@\1d\01&\06!\04,d Z5XW_*Y\01:5<7+\01F\1c1\1d\0c!L5<\0a4Wb-d\19+YOa)I\04`(>0B\10[C5UR0b\0eZ2JBD\1a?\0c\19Y7P!\11\14H\16S\0bT\1eMCX\09VH[!#HYV\0b65&\11 \1dH5LGG>*],\13L)>*\1cG\1bB\1b\1a\01c\0eW\0a#\05\0e4%+Z[\12<\1bQD\13\18W_\1f0\03;\12a\5c\0bZ]\0aF-\14\04\10\22\166+\0b\0a>%%\08\04\16c9S\1e\04V7Y1.\00&&MJ1aOBa\00V\05O>!\0fA)WW\06\09#\02\0e\159E$\03#(\07\0b\0d\17J\5c7$](*%DK\12 SGUYQ\13[=\06\0d\1d\08\10A0[L>P\10\13\224NJ^\0e\07E!\05\11\038\05T)>,0K(8:GG\0e\0cc^\1c\11\1bQ`CJLJ\08K-\19O\00a\1c):'7d-\0b\17\0f0%\1b.a8?Z$\188L\00`U)(\09\13\06\06\0e/\1e\13\02`@P\12-\1b\15H'\11^\01\06`]\1cH;Z8d`\1fV\01\03B\0f\00U\11`\0e?Q;Z\01a\1c\139`\5c46W\17\0cL-OH+@'.\1d6\0cP%\08R\05\13I\0d;\07\10T\018M519\03-B\1c+:MH\089:<\5cbB\14OG'4TA;d0\1b\15[PG/SRP\0a\18%6>-\0aVGDS$X\1b\06^O8:\047Hb*?M\0c\09\19b65LGD\1dHQ5\22&\181A\1e4O\1d\1f\18\17V\1f50M\5c\04\01\13D7H\09\5c\06&?W:@\18RO8Nb\22\06\1c\19\1dQ\16R\1cA'cB: Wa*N\02.\077\03G.31\01\1c.\01\22)\1a\1e\150\0b1P\11\0d-K\0bc%5L'BS_#\13(WE\07QQ\08R\15#\0b*1Y9_\05$(/\0e&T!P\17c\1dT\220ZW\10aC@G03H;\0a/\1dJ`\08^5I\035\1c\19\10>L/\165IF\16I\0fD<\00\0a,4I6AD^2>]7\08\01\07\01\02\14*\05\22I?\15B'\1f\02\19<[\083\1d;J7\0f\01\05M^\1a4_!\13@\14\1b#6\00c) %I\22\1cc\5c\022\14>\17KM\18.\14UH&-H9K\5cT\0a\0b2K\12SN[SH8JKH<$_\01OU/c#\13$/[;\150+\1f;;HM\071\22[\158\1e`\1b9bX:L&\04)JZ+\14.\02\07^\0b'\12FM>N\1a>\22/\11\1e\08\0aWHb,/\01\0f6K\04b=\11dE\0a\0aJ`.2\17\17*U\177D6\1d,(\00)3\0e*BDT$\1f\0a5\1e-\1e\06U\195\01\0e*+ABA V^*\19_S*\08[J*(\0aJ3?F>;M/2`0@\039\1c#\15\1a\14\0fD\0c\09\106TJ\1c\5c\0d\04A\1e!\01]]N\05*'5I*\09\00Nb^b\0c=LX,\1e%\11\18\1ca\1c<\1b=\1bV5\04[>\09\09\22\11U\00=R^\19<\15\00\0dA\1e206-,0G%\09bY>D-\17+6\17<\05\18\15W\11\0c\0d\04\0c\1aE\09+S\1dX^N\18\1eW\15V\0e7\1e\04b3\1b98\11,\08#8\15'E\0eK,9\17I\0a\102\22\0d\027c\11\09_\15\06-\0e\1d\00 J\09!`a&\1e\0aOJ!\02/+U?MbBb>SI9F-D2KER\0e,Q\09\06\13(T@P\10B\1a<3Z$\0e7\22+\03IdI\12CY]\01%\06\0b\11RU\02XDCD2c<\09\0f1\0c\1eF\0cIIU&\0b\02GC_'\03C\10\14\0f\00ZE\22\16$U\14?^$\0bH 0TGWEKA%\0b\1fc2\22\1f!\14.dL\0f\22b\11\12\12PN\14:\10\12Hd7:\22`YH\06V$\17VC8\06P\150=7.N'\1e\18T20d\22\13AY+dT %8\11IO\03\05\00LU\16\17-+#\17SA\0d \0e=\1f\0e.`\02Y=4W@\08\04\025J\086\0f]*&\04U(^C\04\06cV!`dO:E!U\14\141_[\11\0e@\19DOULSY<\16R^\1b6:OW6N\1fN\0c@>dT\0a^J\1c\07%\13)RF\10\1f:+\13\05$\0c;^[\0b\0dE*[Q\065PZ\1d(\1e\17\0d!\09\15\0fO\03\0c%.\1f\080,\22*\22-\15E6\0c\10#&L\17/!1C<\12\02\1b\02&G\11\06FO\0d$PYV\01\03R\0f\1e\12,\1f\16\136$4EEN5H\057L*IR\0b\11>/b2cc\13QP\0fA\17.6\08B8<#\18\04X>L+&\11RV\1dA/*>?)\1a1X\06@\12`\0aH\04*^@M\12\22\1fP\09(T\1b\15F\16VS@\0e.\04(=\5c.\18\0a*\000\0c\09*LV\1aMS\05V\168O+\5c\00`(AL4#\0f\0c^\1c\03\03$\03\110O\19ZA3B/\17\12$OaO$b(L\1c\0f\1c?b(8\19+\19\1b\0d\09K\5c\22\1e\16Va$KQH\13M\107(\17aD\04\18\1f\01\1f5](O\13\13X9\11/JZ?`,+\11,\1bK/A5467\0aV\0cZ&58\0f1\17\18M.)\17\13bVQ\07_A\12\15'\1f4;1I\0d;\18\191>-\04,<^\22$')<\19\04\0bH\0c\06$a^L\1b\0c\22LU\0d\22K\04S\0316/\08//\0b5XG,;0\0fG64C\0e\1b^\1a\1bEM\06E3\0a46\1aHC\00UP\0b%\220Q]aa\1d\10\0e`\1e\0778\22Zc\06:2\10LF\08/\03\09 1WES#\10KbO\03\0d]A,dVBdKA\05!QXK\10a\16VH6#:Y\11;G;81\1cF)(2\15V[!b>5'I&\1c%b!bPZ\1d/RU\039db[G(\12MZ\06?.'\1a\08:\1f/`;T;:/&0L4`\1a74\1a4*?:\1a\050 D<%.\0b\1c4\08O?bQCT^'1+\09(N\14D-D\1cQ$Y\14/:!\09G-%\165R3\10\1dTd\16\16\0fAb7\08\11\16\13V\10\00\15\04W\22\1c\14+c\1f/W2\1c\03B9X\1f-L.\09J\00T[Y\03*\04\03?\088b\03L\06\01I57\160:6G\0bV\10Xb\5c=cL\115O<:0Y \034#.;\03\12N\18\07\5c0=?<\0cO/\0aFJK\0b[\1bZ\103\03\05TJ9U\13\0f6\03<,\0a3]&\0d42:A<\1c&\22'_\1c`\0bOc\10\1c&IP97d\1b\0e,\03A$)O6\5c\02\12\11\1e8\12$2.b\1b\18>+\13\00Sc\17%b23)\14R+=\1aa\12\1d\0e\02\19$\14=5B\18P8WZ)WH'\09\08\03\1a\19,.I6Id2:_\1f<\13CP/V\0bG !\17\15K\09]PVCS\0b:^\17\1e/``?\138^O*\1b\18Y\0c\01\19,#1AL:\17\15\09Z\04W\0d@\09\0aMHH'[\1c!FF<<\18H>1S?@/\04Y%\19b\1a`U\06\19^\10\01\1f6)\160J:\11d\11\07G-9\13J\14CNK\03FI`A9D9\102:\0e\04c$4&<$%++KYB^>5<\06\1b\1dLd\5c\06\16;?\05\09\15\13\0dV\15\1f\18/C=Z\0a#,*\1dI_7O\1636X*\1a\0a\008R\09MCY\1cX\144\225PZ\1d\0e\22H\09\06BAU6R\04*\17a\12\174dd_B6\17\13(K\13<\14\08Y#*<\0a0])c.\16E6-B&#\11%\00\0cE6#6=LI\14a0\08bZ#\07\04^\0fE\05%&\16_d\5c5)G#\110,E`\04\09/8M(\19V-\07W0\05>\0e\140L\08+LC>\10%a\00U\06#PN\0a\1a!5!\18&N \18]\034\06Zd0b\08Z@F\06C!I4'\07b\10T[\10$\17(JC&@;)\0f\1faQP=8#\18\19)\5c\18P\09\1e5\06\0c$a\1cHVE\0b5\06KN\0e8L\0a%7%]8>Tb\13K+\1c\04a\00S b\0bG1PR\014\17PB-7+0LP(\1f\07[_]\1f&\14\01\00XT 3_\02d(U\01;J/[\12D!C\09PI\065\1d\01.<\05 =\05V\0b\03$H\06$\0c9%Ga2=\0e\11=/]\06\14c\19\0fB%LG$\02*\15P\0c:4\12^\1e)aC\03\0c^\11`6\1fX\1a3V\12B47\07Y[MbO8\09$J^`\03\22\5cF%\03@\14AT34MD%_\007\0f\07\0a\062\07UI\10W.\09R2\09'V\0c\081 Id2\18L\11\1bF\11S3\5c]\17\07BJPR<\1a9)*BP\1bNXML\1a*\192\11\09N5\1a\1a\03TU\1b\5c2\00G\1f\1b?X\22\04\13\0e aDKH_\10@\0adIX4AP\151@\0e\06\0d\0fM\0a\08\06@*\0aS\16\08-[1T3A/\1b\1eVRR2=FA\5cTGGA\0eRI\14\0b\0fa=%\05H^67\0aVD&\0f5\13@FP!\22%\10H\08RV86\05!E\01^IIBB\1bWMO7\0e^Jd9+-Z,SI\0f[6\00.JHO\09''R\0cG\0d\059ZT\0bFM4E\00_\0e8&?\1c\1350\13AY9\09ba\0e-\08U:P*\0e?\132\05GVHBB\1cF\1c8ZQGK\0b; W8\1c\01C\02V[R\1bG\0a/\15R\11\0661&RVB\03K\0cJ\0f\17c/\09\14K\0aW+?,[Z\0e\00\02#SW\07\02\01-TWM5\1bY^+N\5cZX\0c\1f@AJ]\08A1\17\1f3\18P\03cR\05\09\1f\5cWU\13)N>\13#\11I\0d0\02OY`5\13,*2=C\1eA\1fN$(\09^]<\0c\22\03(5&\18\5c4H^a= QUEUE_SIZE) + return OUT_OF_MEMORY; + newItem->node = node; + newItem->dist = dist; + newItem->prev = prev; + newItem->next = 0; + + if (!last) + dijkstra_queueHead = newItem; + else { + __pragma_loopbound(0, 1000); + while (last->next) + last = last->next; + last->next = newItem; + } + dijkstra_queueCount++; + return 0; +} + +void +dijkstra_dequeue(int *node, int *dist, int *prev) { + if (dijkstra_queueHead) { + *node = dijkstra_queueHead->node; + *dist = dijkstra_queueHead->dist; + *prev = dijkstra_queueHead->prev; + dijkstra_queueHead = dijkstra_queueHead->next; + dijkstra_queueCount--; + } +} + +int +dijkstra_qcount(void) { + return (dijkstra_queueCount); +} + +int +dijkstra_find(int chStart, int chEnd) { + int ch; + int prev, node = 0; + int cost, dist = 0; + int i; + + __pragma_loopbound(100, 100); + for (ch = 0; ch < NUM_NODES; ch++) { + dijkstra_rgnNodes[ch].dist = NONE; + dijkstra_rgnNodes[ch].prev = NONE; + } + + if (chStart == chEnd) { + } else { + dijkstra_rgnNodes[chStart].dist = 0; + dijkstra_rgnNodes[chStart].prev = NONE; + + if (dijkstra_enqueue(chStart, 0, NONE) == OUT_OF_MEMORY) + return OUT_OF_MEMORY; + + __pragma_loopbound(100, 1000); + while (dijkstra_qcount() > 0) { + dijkstra_dequeue(&node, &dist, &prev); + __pragma_loopbound(100, 100); + for (i = 0; i < NUM_NODES; i++) { + if ((cost = dijkstra_AdjMatrix[node][i]) != NONE) { + if ((NONE == dijkstra_rgnNodes[i].dist) || + (dijkstra_rgnNodes[i].dist > (cost + dist))) { + dijkstra_rgnNodes[i].dist = dist + cost; + dijkstra_rgnNodes[i].prev = node; + if (dijkstra_enqueue(i, dist + cost, node) == + OUT_OF_MEMORY) + return OUT_OF_MEMORY; + } + } + } + } + } + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +dijkstra_main(void) { + int i, j; + + /* finds 20 shortest paths between nodes */ + __pragma_loopbound(20, 20); + for (i = 0, j = NUM_NODES / 2; i < 20; i++, j++) { + j = j % NUM_NODES; + if (dijkstra_find(i, j) == OUT_OF_MEMORY) { + dijkstra_checksum += OUT_OF_MEMORY; + return; + } else + dijkstra_checksum += dijkstra_rgnNodes[j].dist; + dijkstra_queueNext = 0; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + dijkstra_init(); + dijkstra_main(); + + return (dijkstra_return()); +} diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.c b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.c new file mode 100644 index 0000000..88c0664 --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.c @@ -0,0 +1,603 @@ +#include "input.h" + +unsigned char dijkstra_AdjMatrix[NUM_NODES][NUM_NODES] = { + {32, 32, 54, 12, 52, 56, 8, 30, 44, 94, 44, 39, 65, 19, 51, 91, 1, + 5, 89, 34, 25, 58, 20, 51, 38, 65, 30, 7, 20, 10, 51, 18, 43, 71, + 97, 61, 26, 5, 57, 70, 65, 0, 75, 29, 86, 93, 87, 87, 64, 75, 88, + 89, 100, 7, 40, 37, 38, 36, 44, 24, 46, 95, 43, 89, 32, 5, 15, 58, + 77, 72, 95, 8, 38, 69, 37, 24, 27, 90, 77, 92, 31, 30, 80, 30, 37, + 86, 33, 76, 21, 77, 100, 68, 37, 8, 22, 69, 81, 38, 94, 57}, + {76, 54, 65, 14, 89, 69, 4, 16, 24, 47, 7, 21, 78, 53, 17, 81, 39, + 50, 22, 60, 93, 89, 94, 30, 97, 16, 65, 43, 20, 24, 67, 62, 78, 98, + 42, 67, 32, 46, 49, 57, 60, 56, 44, 37, 75, 62, 17, 13, 11, 40, 40, + 4, 95, 100, 0, 57, 82, 31, 0, 1, 56, 67, 30, 100, 64, 72, 66, 63, + 18, 81, 19, 44, 2, 63, 81, 78, 91, 64, 91, 2, 70, 97, 73, 64, 97, + 39, 21, 78, 70, 21, 46, 25, 54, 76, 92, 84, 47, 57, 46, 31}, + {38, 31, 75, 40, 61, 21, 84, 51, 86, 41, 19, 21, 37, 58, 86, 100, 97, + 73, 44, 67, 60, 90, 58, 13, 31, 49, 63, 44, 73, 76, 76, 77, 73, 16, + 83, 100, 4, 67, 51, 56, 7, 36, 77, 10, 95, 28, 10, 57, 0, 54, 23, + 60, 9, 48, 39, 40, 97, 69, 84, 35, 44, 25, 11, 83, 8, 61, 83, 12, + 27, 100, 34, 0, 35, 10, 10, 96, 39, 87, 53, 5, 40, 42, 66, 15, 90, + 71, 55, 87, 39, 5, 88, 49, 97, 100, 32, 4, 60, 81, 83, 53}, + {80, 16, 53, 14, 94, 29, 77, 99, 16, 29, 3, 22, 71, 35, 4, 61, 6, + 25, 13, 11, 30, 0, 27, 94, 66, 25, 64, 92, 5, 47, 44, 85, 29, 63, + 65, 89, 59, 41, 87, 41, 36, 57, 29, 7, 92, 33, 34, 64, 59, 47, 76, + 55, 13, 2, 48, 46, 27, 12, 37, 99, 25, 48, 83, 20, 77, 13, 9, 35, + 55, 62, 76, 57, 18, 72, 64, 10, 4, 64, 74, 63, 77, 15, 18, 91, 84, + 32, 36, 77, 10, 39, 75, 35, 87, 23, 22, 30, 37, 31, 65, 58}, + {59, 7, 14, 78, 79, 45, 54, 83, 8, 94, 12, 86, 9, 97, 42, 93, 95, + 44, 70, 5, 83, 10, 40, 36, 34, 62, 66, 71, 59, 97, 95, 18, 3, 8, + 62, 48, 19, 15, 98, 28, 8, 9, 80, 84, 72, 21, 43, 66, 65, 79, 71, + 13, 89, 78, 49, 22, 5, 14, 59, 65, 11, 53, 49, 81, 28, 77, 29, 47, + 92, 26, 41, 66, 1, 20, 50, 73, 7, 59, 4, 72, 37, 76, 86, 25, 19, + 0, 14, 24, 15, 73, 55, 93, 93, 3, 73, 87, 80, 68, 100, 37}, + {94, 41, 3, 61, 27, 19, 33, 35, 78, 38, 73, 14, 80, 58, 5, 99, 59, + 19, 22, 40, 59, 78, 32, 17, 47, 71, 3, 94, 39, 2, 97, 99, 9, 66, + 60, 37, 85, 59, 38, 28, 63, 10, 8, 8, 35, 81, 6, 60, 100, 96, 66, + 24, 39, 64, 41, 52, 34, 10, 11, 39, 80, 8, 4, 89, 74, 64, 92, 25, + 89, 29, 19, 18, 6, 28, 26, 7, 8, 33, 67, 74, 95, 32, 99, 33, 96, + 5, 51, 96, 83, 63, 35, 62, 71, 39, 16, 10, 69, 8, 35, 23}, + {3, 55, 41, 76, 49, 68, 83, 23, 67, 15, 97, 61, 13, 61, 60, 75, 33, + 77, 71, 15, 39, 72, 43, 76, 77, 59, 53, 11, 33, 88, 34, 37, 8, 76, + 79, 23, 9, 62, 46, 76, 43, 9, 2, 57, 70, 28, 31, 69, 4, 68, 84, + 10, 39, 26, 52, 82, 52, 4, 93, 85, 59, 94, 21, 33, 35, 67, 57, 44, + 28, 69, 86, 37, 78, 54, 94, 14, 48, 25, 83, 18, 59, 33, 28, 99, 25, + 81, 46, 77, 51, 39, 62, 9, 32, 49, 43, 33, 15, 100, 77, 9}, + {68, 28, 47, 12, 82, 6, 26, 96, 98, 75, 13, 57, 7, 8, 55, 33, 55, + 0, 76, 5, 5, 3, 15, 3, 53, 58, 36, 34, 23, 79, 10, 57, 6, 23, + 69, 54, 29, 61, 49, 27, 36, 63, 84, 9, 71, 4, 8, 25, 71, 85, 97, + 77, 88, 11, 46, 6, 35, 83, 7, 24, 27, 17, 82, 34, 40, 16, 88, 69, + 44, 3, 62, 46, 32, 45, 55, 2, 49, 64, 94, 87, 14, 90, 63, 68, 68, + 75, 75, 2, 23, 82, 27, 51, 65, 75, 85, 71, 57, 38, 39, 0}, + {7, 1, 46, 39, 12, 68, 41, 28, 31, 0, 14, 45, 91, 43, 12, 58, 17, + 53, 26, 41, 0, 19, 92, 31, 60, 42, 1, 17, 46, 41, 84, 54, 8, 97, + 93, 20, 64, 0, 14, 61, 0, 28, 72, 57, 71, 50, 81, 89, 70, 7, 96, + 70, 26, 87, 1, 87, 95, 69, 70, 40, 9, 19, 94, 84, 15, 87, 71, 45, + 87, 85, 5, 53, 13, 43, 10, 50, 94, 91, 38, 63, 98, 33, 99, 91, 86, + 66, 43, 80, 35, 79, 20, 10, 98, 80, 61, 13, 66, 31, 24, 18}, + {82, 97, 72, 61, 39, 48, 11, 99, 38, 49, 27, 2, 49, 26, 59, 0, 58, + 1, 81, 59, 80, 67, 70, 77, 46, 97, 56, 79, 27, 81, 63, 75, 77, 0, + 36, 82, 48, 47, 81, 53, 62, 7, 55, 77, 100, 13, 78, 24, 81, 24, 83, + 26, 91, 18, 2, 2, 14, 25, 47, 7, 72, 10, 83, 14, 10, 18, 96, 25, + 65, 42, 78, 93, 16, 32, 70, 15, 11, 47, 5, 58, 71, 89, 84, 27, 73, + 86, 96, 88, 77, 43, 95, 48, 19, 43, 62, 96, 61, 24, 20, 92}, + {66, 98, 85, 82, 96, 20, 64, 73, 67, 69, 30, 3, 23, 13, 97, 97, 66, + 58, 50, 42, 0, 44, 57, 86, 54, 85, 82, 14, 8, 1, 73, 41, 66, 23, + 22, 61, 43, 86, 0, 9, 21, 30, 79, 44, 44, 75, 40, 76, 99, 56, 17, + 100, 67, 40, 51, 20, 25, 32, 0, 100, 0, 73, 40, 66, 96, 29, 93, 38, + 81, 93, 13, 1, 90, 92, 46, 100, 32, 52, 75, 31, 8, 58, 97, 75, 99, + 13, 61, 90, 46, 61, 89, 12, 34, 96, 78, 96, 24, 36, 34, 4}, + {96, 13, 73, 85, 72, 18, 50, 70, 36, 24, 67, 10, 82, 29, 51, 80, 43, + 11, 35, 89, 39, 24, 0, 73, 86, 44, 34, 9, 46, 34, 80, 41, 48, 52, + 92, 19, 36, 41, 55, 39, 31, 22, 49, 13, 51, 67, 59, 94, 44, 95, 48, + 83, 85, 48, 21, 70, 58, 56, 45, 4, 90, 91, 11, 3, 43, 70, 89, 45, + 77, 44, 84, 8, 66, 100, 88, 83, 66, 46, 77, 76, 6, 24, 59, 91, 39, + 46, 26, 97, 68, 37, 0, 58, 28, 79, 27, 37, 48, 16, 82, 24}, + {60, 66, 32, 92, 65, 19, 74, 97, 32, 16, 72, 38, 41, 97, 96, 46, 43, + 88, 42, 77, 25, 9, 34, 19, 88, 28, 56, 1, 44, 3, 25, 70, 69, 24, + 27, 100, 9, 0, 96, 7, 84, 34, 12, 91, 30, 7, 36, 39, 95, 78, 16, + 86, 53, 16, 71, 6, 44, 26, 7, 54, 30, 100, 23, 65, 23, 50, 65, 99, + 17, 26, 73, 67, 60, 85, 57, 57, 92, 93, 96, 52, 36, 78, 4, 90, 61, + 75, 96, 4, 68, 3, 25, 64, 69, 14, 28, 58, 31, 59, 56, 48}, + {86, 28, 81, 45, 12, 37, 1, 70, 29, 64, 89, 31, 41, 93, 20, 1, 67, + 83, 73, 0, 52, 98, 64, 20, 78, 93, 78, 8, 17, 100, 22, 2, 95, 2, + 48, 6, 39, 15, 43, 34, 79, 31, 66, 87, 23, 52, 54, 56, 34, 93, 57, + 52, 56, 87, 72, 34, 79, 15, 42, 63, 15, 65, 65, 9, 67, 79, 82, 73, + 95, 91, 6, 39, 21, 38, 92, 10, 91, 46, 67, 91, 38, 90, 43, 95, 76, + 81, 28, 21, 63, 70, 84, 78, 0, 48, 53, 68, 94, 0, 40, 88}, + {92, 12, 93, 12, 17, 85, 23, 7, 30, 56, 64, 34, 45, 73, 28, 87, 20, + 22, 7, 83, 59, 91, 26, 59, 5, 79, 26, 99, 79, 32, 52, 70, 11, 44, + 83, 28, 95, 72, 1, 91, 27, 65, 25, 38, 4, 19, 24, 24, 8, 99, 73, + 67, 89, 99, 25, 60, 77, 18, 24, 21, 16, 42, 58, 27, 53, 6, 55, 47, + 78, 56, 38, 71, 88, 29, 8, 58, 48, 99, 48, 56, 97, 20, 89, 52, 18, + 14, 78, 61, 99, 2, 48, 14, 44, 5, 42, 97, 11, 63, 10, 55}, + {19, 48, 25, 73, 77, 100, 30, 91, 99, 78, 13, 95, 98, 1, 12, 82, 82, + 91, 8, 80, 93, 22, 61, 2, 28, 2, 66, 5, 65, 76, 61, 50, 90, 86, + 22, 32, 52, 52, 22, 50, 96, 1, 10, 59, 70, 90, 40, 51, 80, 14, 98, + 38, 37, 58, 40, 31, 60, 72, 2, 91, 47, 63, 7, 2, 15, 29, 34, 67, + 48, 23, 83, 9, 24, 59, 69, 94, 48, 8, 11, 27, 90, 8, 31, 93, 32, + 38, 90, 58, 9, 92, 48, 23, 55, 55, 25, 36, 51, 60, 69, 65}, + {83, 51, 74, 73, 76, 42, 67, 24, 17, 44, 17, 73, 18, 49, 65, 50, 87, + 54, 7, 62, 11, 21, 85, 32, 77, 10, 68, 94, 70, 36, 24, 52, 53, 98, + 24, 96, 6, 57, 86, 90, 67, 2, 62, 85, 17, 26, 34, 70, 46, 41, 32, + 23, 63, 16, 56, 5, 26, 23, 65, 62, 26, 89, 80, 45, 52, 71, 6, 58, + 27, 92, 47, 61, 61, 75, 45, 78, 67, 46, 14, 12, 53, 46, 36, 82, 28, + 58, 87, 21, 47, 17, 83, 73, 72, 63, 85, 24, 33, 91, 48, 26}, + {49, 62, 53, 9, 36, 99, 53, 3, 10, 67, 82, 63, 79, 84, 45, 7, 41, + 98, 95, 89, 82, 43, 27, 53, 5, 78, 77, 4, 69, 25, 98, 17, 53, 16, + 93, 89, 81, 45, 58, 91, 12, 40, 54, 91, 90, 65, 64, 31, 62, 58, 86, + 43, 1, 12, 63, 73, 91, 39, 44, 25, 30, 7, 8, 83, 23, 0, 38, 4, + 45, 96, 61, 23, 1, 14, 81, 92, 45, 44, 89, 74, 69, 74, 83, 36, 52, + 45, 75, 8, 85, 18, 100, 81, 92, 7, 30, 82, 74, 34, 52, 86}, + {96, 12, 8, 98, 94, 89, 55, 38, 100, 43, 11, 68, 83, 95, 3, 0, 39, + 78, 9, 90, 63, 8, 37, 20, 83, 67, 1, 56, 67, 53, 7, 62, 66, 16, + 25, 25, 71, 80, 63, 70, 89, 75, 3, 37, 35, 6, 38, 74, 51, 47, 30, + 80, 21, 67, 100, 3, 100, 68, 26, 66, 87, 33, 27, 52, 15, 53, 43, 53, + 99, 6, 22, 88, 47, 26, 24, 82, 99, 28, 21, 15, 75, 51, 95, 63, 84, + 61, 66, 83, 28, 58, 14, 14, 58, 42, 33, 39, 61, 76, 92, 25}, + {48, 14, 79, 95, 6, 70, 76, 4, 98, 98, 87, 39, 14, 81, 1, 99, 7, + 33, 81, 1, 92, 96, 16, 15, 3, 15, 54, 30, 57, 12, 55, 5, 93, 0, + 100, 99, 70, 42, 69, 67, 39, 21, 5, 53, 2, 6, 51, 76, 40, 99, 78, + 98, 60, 60, 79, 63, 75, 99, 59, 98, 10, 80, 2, 2, 80, 69, 67, 49, + 10, 2, 16, 49, 23, 88, 68, 92, 95, 86, 68, 0, 84, 11, 64, 43, 71, + 42, 72, 45, 40, 97, 42, 17, 76, 11, 86, 56, 80, 19, 4, 90}, + {88, 87, 4, 77, 75, 72, 69, 35, 23, 2, 35, 6, 80, 99, 15, 50, 6, + 53, 61, 46, 49, 69, 29, 25, 80, 15, 47, 25, 34, 51, 14, 21, 38, 85, + 98, 79, 57, 32, 13, 46, 0, 48, 53, 80, 12, 34, 29, 18, 54, 56, 30, + 2, 25, 60, 94, 4, 41, 40, 30, 75, 58, 10, 62, 62, 96, 59, 40, 18, + 58, 53, 64, 24, 67, 83, 4, 79, 17, 100, 63, 37, 56, 93, 39, 81, 18, + 100, 51, 59, 5, 81, 100, 63, 58, 61, 24, 53, 87, 64, 37, 10}, + {83, 67, 34, 49, 50, 38, 27, 33, 4, 56, 70, 60, 15, 75, 6, 33, 40, + 57, 59, 46, 4, 24, 75, 62, 86, 100, 81, 38, 29, 17, 48, 79, 84, 48, + 27, 100, 87, 21, 32, 57, 77, 68, 16, 92, 9, 22, 92, 49, 79, 16, 95, + 83, 40, 70, 10, 25, 35, 91, 29, 30, 74, 43, 8, 24, 92, 2, 23, 44, + 23, 22, 0, 66, 56, 16, 58, 65, 4, 15, 14, 49, 31, 75, 32, 71, 10, + 8, 63, 45, 100, 92, 42, 73, 1, 50, 97, 93, 18, 87, 36, 41}, + {75, 36, 7, 30, 18, 31, 96, 22, 12, 76, 71, 43, 50, 69, 80, 61, 78, + 42, 72, 43, 0, 13, 15, 68, 30, 79, 60, 48, 31, 62, 56, 5, 98, 29, + 1, 82, 26, 97, 3, 38, 72, 40, 81, 89, 76, 26, 15, 53, 35, 87, 96, + 1, 67, 77, 69, 97, 21, 28, 10, 18, 90, 32, 23, 53, 61, 25, 34, 87, + 88, 3, 91, 26, 9, 37, 81, 85, 64, 96, 3, 99, 82, 65, 100, 48, 42, + 68, 10, 29, 62, 88, 48, 17, 19, 37, 70, 47, 28, 70, 100, 16}, + {73, 91, 8, 82, 94, 89, 33, 57, 84, 36, 21, 31, 1, 87, 46, 9, 20, + 56, 4, 82, 9, 52, 99, 96, 56, 34, 8, 84, 3, 7, 66, 42, 64, 74, + 24, 58, 28, 23, 81, 11, 59, 2, 9, 26, 55, 55, 1, 76, 77, 6, 23, + 87, 24, 89, 82, 80, 22, 90, 30, 93, 63, 96, 34, 27, 36, 24, 51, 30, + 47, 98, 8, 73, 100, 17, 99, 21, 72, 0, 97, 48, 73, 86, 34, 97, 74, + 82, 43, 63, 37, 73, 55, 0, 34, 55, 94, 36, 80, 10, 67, 93}, + {7, 75, 65, 74, 92, 64, 95, 63, 30, 57, 77, 2, 42, 11, 65, 16, 59, + 7, 45, 97, 46, 66, 63, 81, 20, 56, 83, 66, 32, 49, 59, 39, 90, 23, + 12, 81, 53, 73, 9, 49, 29, 87, 17, 72, 64, 83, 54, 89, 90, 65, 85, + 36, 30, 13, 83, 16, 35, 65, 83, 67, 14, 7, 73, 70, 97, 85, 51, 16, + 24, 26, 65, 53, 79, 83, 91, 8, 65, 10, 98, 20, 41, 48, 22, 71, 62, + 4, 54, 63, 36, 36, 30, 16, 9, 2, 86, 5, 53, 36, 88, 77}, + {29, 53, 97, 74, 1, 53, 83, 32, 30, 46, 52, 71, 94, 41, 42, 21, 45, + 62, 85, 81, 98, 81, 97, 73, 83, 83, 44, 1, 85, 32, 45, 80, 85, 41, + 54, 52, 60, 2, 84, 90, 48, 1, 61, 7, 42, 69, 96, 54, 30, 46, 0, + 94, 26, 64, 32, 75, 46, 76, 42, 97, 7, 87, 43, 58, 94, 97, 9, 54, + 99, 59, 43, 12, 61, 70, 19, 69, 4, 14, 22, 0, 26, 23, 60, 52, 53, + 92, 93, 65, 68, 35, 61, 75, 88, 70, 33, 82, 66, 8, 35, 30}, + {68, 44, 8, 95, 81, 28, 63, 85, 8, 52, 86, 35, 41, 11, 53, 94, 3, + 12, 58, 71, 13, 85, 11, 0, 55, 44, 82, 87, 19, 83, 84, 87, 27, 92, + 81, 7, 86, 9, 58, 61, 27, 9, 62, 68, 21, 81, 61, 24, 93, 85, 61, + 72, 70, 72, 73, 91, 16, 20, 77, 35, 3, 26, 88, 97, 18, 34, 3, 70, + 9, 27, 30, 37, 37, 92, 4, 24, 73, 32, 48, 31, 83, 8, 3, 52, 80, + 42, 8, 62, 62, 52, 63, 65, 78, 16, 27, 62, 50, 30, 32, 26}, + {24, 62, 63, 27, 20, 67, 51, 59, 65, 65, 90, 48, 73, 93, 66, 18, 0, + 75, 47, 63, 26, 76, 94, 3, 59, 21, 66, 75, 17, 64, 0, 41, 25, 63, + 68, 11, 97, 85, 70, 61, 49, 60, 8, 88, 18, 41, 6, 19, 15, 19, 48, + 41, 61, 41, 10, 19, 62, 42, 95, 46, 5, 95, 53, 98, 58, 21, 8, 20, + 5, 79, 81, 21, 4, 56, 8, 89, 97, 81, 74, 11, 100, 21, 18, 61, 29, + 95, 46, 57, 37, 40, 2, 42, 1, 56, 5, 59, 43, 14, 79, 14}, + {59, 25, 35, 29, 81, 44, 84, 43, 24, 58, 20, 91, 45, 38, 17, 74, 100, + 63, 31, 36, 3, 33, 44, 71, 55, 50, 96, 98, 30, 40, 12, 55, 65, 13, + 50, 12, 57, 33, 55, 48, 91, 42, 38, 36, 46, 55, 76, 45, 17, 6, 81, + 87, 6, 25, 57, 61, 41, 52, 25, 37, 92, 3, 92, 23, 16, 7, 35, 74, + 40, 56, 21, 98, 98, 59, 100, 44, 80, 75, 89, 97, 82, 36, 50, 54, 27, + 6, 14, 68, 25, 5, 4, 83, 8, 62, 5, 25, 69, 40, 65, 75}, + {63, 52, 72, 60, 10, 71, 70, 56, 12, 59, 52, 94, 95, 68, 13, 21, 41, + 94, 55, 66, 100, 25, 48, 7, 53, 54, 99, 88, 60, 63, 62, 22, 14, 34, + 49, 91, 71, 18, 46, 83, 77, 65, 42, 37, 32, 55, 24, 39, 15, 45, 4, + 14, 36, 19, 21, 89, 39, 87, 76, 99, 49, 4, 88, 64, 4, 36, 54, 75, + 20, 67, 24, 64, 31, 32, 0, 29, 54, 92, 69, 69, 36, 39, 83, 39, 58, + 70, 27, 63, 56, 70, 28, 5, 74, 15, 35, 78, 17, 55, 18, 37}, + {88, 8, 0, 85, 41, 68, 14, 95, 59, 49, 63, 61, 54, 11, 66, 79, 81, + 94, 41, 3, 29, 69, 75, 69, 50, 9, 46, 33, 30, 30, 71, 18, 39, 37, + 2, 80, 4, 83, 40, 29, 98, 2, 57, 52, 13, 22, 30, 60, 82, 71, 29, + 10, 6, 3, 79, 22, 79, 91, 56, 76, 21, 26, 94, 26, 63, 62, 72, 34, + 45, 11, 29, 42, 13, 86, 94, 93, 75, 90, 18, 56, 27, 48, 33, 33, 17, + 78, 55, 63, 69, 10, 38, 56, 2, 31, 48, 32, 93, 19, 32, 3}, + {30, 61, 46, 43, 13, 5, 1, 88, 96, 86, 9, 89, 100, 42, 21, 17, 20, + 42, 80, 55, 19, 17, 10, 88, 14, 58, 19, 6, 77, 17, 77, 73, 79, 22, + 15, 58, 94, 83, 45, 55, 68, 20, 43, 68, 63, 30, 51, 49, 39, 97, 3, + 58, 13, 80, 45, 27, 3, 31, 100, 80, 48, 76, 52, 93, 64, 33, 50, 24, + 82, 61, 45, 15, 82, 89, 49, 10, 85, 100, 59, 23, 96, 28, 81, 75, 7, + 93, 68, 10, 90, 34, 56, 3, 76, 74, 97, 6, 73, 12, 30, 20}, + {40, 75, 35, 88, 29, 85, 64, 14, 50, 22, 37, 12, 16, 85, 87, 23, 77, + 21, 100, 66, 55, 21, 35, 30, 95, 31, 2, 33, 10, 32, 53, 16, 74, 54, + 70, 69, 38, 33, 83, 55, 55, 87, 67, 71, 71, 19, 60, 13, 40, 25, 45, + 61, 46, 80, 58, 6, 78, 60, 39, 88, 93, 58, 70, 32, 11, 39, 0, 16, + 72, 50, 71, 93, 36, 37, 29, 6, 56, 55, 19, 63, 80, 64, 23, 25, 43, + 81, 98, 87, 41, 2, 40, 100, 60, 9, 31, 37, 14, 98, 53, 86}, + {47, 90, 44, 83, 26, 73, 55, 49, 27, 40, 11, 73, 70, 0, 64, 13, 82, + 61, 66, 89, 29, 6, 88, 89, 15, 85, 93, 30, 82, 11, 82, 96, 1, 26, + 78, 27, 65, 100, 42, 93, 39, 53, 31, 9, 54, 96, 89, 1, 22, 54, 90, + 52, 60, 43, 6, 42, 27, 99, 72, 75, 10, 19, 70, 11, 45, 14, 4, 10, + 13, 47, 69, 52, 66, 100, 27, 86, 61, 15, 53, 84, 36, 42, 35, 96, 85, + 41, 37, 78, 40, 75, 53, 16, 95, 22, 94, 5, 36, 98, 15, 15}, + {10, 50, 34, 77, 16, 61, 28, 77, 43, 82, 60, 79, 90, 95, 74, 41, 2, + 78, 18, 8, 18, 71, 24, 12, 60, 17, 85, 62, 81, 66, 78, 92, 16, 11, + 34, 32, 38, 28, 75, 81, 9, 1, 59, 66, 62, 100, 6, 64, 43, 24, 72, + 61, 62, 62, 40, 21, 79, 24, 49, 26, 90, 26, 84, 72, 3, 84, 70, 8, + 11, 45, 89, 88, 46, 14, 53, 74, 80, 59, 38, 89, 83, 9, 15, 10, 38, + 55, 31, 83, 45, 81, 8, 1, 73, 92, 73, 43, 75, 9, 51, 53}, + {54, 5, 40, 66, 86, 59, 39, 31, 17, 43, 19, 66, 19, 1, 77, 57, 22, + 74, 39, 68, 20, 14, 35, 60, 5, 7, 2, 47, 16, 19, 66, 36, 91, 5, + 68, 43, 30, 74, 40, 47, 83, 26, 79, 1, 27, 21, 24, 49, 96, 64, 83, + 82, 78, 17, 41, 49, 92, 9, 62, 74, 28, 27, 77, 86, 99, 44, 95, 28, + 84, 34, 41, 33, 60, 20, 34, 87, 41, 59, 36, 2, 89, 85, 85, 32, 2, + 25, 47, 94, 35, 9, 67, 29, 2, 43, 81, 1, 54, 75, 96, 3}, + {9, 37, 36, 35, 23, 37, 22, 30, 62, 24, 33, 50, 8, 84, 48, 77, 8, + 95, 70, 9, 70, 37, 5, 73, 46, 86, 74, 100, 27, 35, 70, 2, 72, 5, + 37, 95, 42, 25, 25, 3, 49, 24, 19, 24, 7, 67, 0, 82, 28, 71, 92, + 98, 74, 63, 70, 86, 14, 9, 52, 41, 45, 21, 43, 83, 93, 47, 44, 35, + 72, 35, 4, 88, 59, 91, 11, 32, 57, 11, 13, 51, 48, 71, 49, 88, 33, + 85, 40, 48, 61, 92, 55, 5, 79, 65, 54, 71, 11, 98, 72, 83}, + {32, 43, 70, 57, 33, 47, 89, 56, 25, 69, 7, 73, 39, 56, 27, 39, 6, + 67, 53, 67, 24, 74, 38, 2, 38, 93, 73, 49, 56, 11, 99, 89, 54, 34, + 11, 87, 48, 67, 42, 73, 35, 49, 11, 40, 71, 4, 45, 78, 71, 98, 10, + 95, 38, 49, 63, 76, 41, 36, 92, 97, 47, 56, 51, 0, 56, 63, 53, 3, + 29, 95, 76, 30, 44, 54, 70, 81, 58, 82, 58, 96, 45, 69, 56, 83, 84, + 19, 59, 24, 21, 16, 87, 34, 72, 4, 0, 27, 33, 53, 31, 28}, + {47, 73, 58, 57, 26, 94, 38, 85, 75, 62, 80, 87, 97, 35, 69, 80, 20, + 27, 3, 41, 43, 57, 75, 81, 27, 75, 8, 60, 27, 5, 88, 41, 78, 11, + 98, 71, 71, 1, 55, 12, 64, 0, 99, 60, 1, 67, 40, 22, 61, 9, 63, + 70, 32, 4, 51, 59, 79, 25, 18, 73, 30, 72, 13, 7, 49, 77, 78, 87, + 79, 99, 99, 42, 65, 63, 68, 67, 96, 7, 55, 56, 84, 84, 93, 15, 88, + 43, 75, 33, 34, 59, 72, 64, 98, 85, 37, 12, 27, 82, 99, 5}, + {80, 63, 13, 11, 92, 48, 44, 88, 55, 99, 9, 4, 48, 1, 20, 2, 10, + 61, 1, 44, 86, 73, 74, 83, 23, 11, 62, 50, 93, 26, 22, 38, 90, 1, + 15, 47, 49, 59, 34, 71, 23, 44, 75, 38, 11, 61, 40, 22, 21, 41, 32, + 7, 13, 6, 56, 36, 84, 17, 52, 76, 44, 74, 80, 100, 42, 96, 46, 91, + 20, 81, 27, 10, 91, 2, 48, 1, 29, 88, 90, 51, 95, 22, 58, 7, 95, + 13, 9, 78, 31, 61, 19, 41, 1, 65, 40, 43, 26, 86, 100, 47}, + {32, 94, 23, 22, 62, 71, 91, 91, 58, 80, 41, 18, 68, 65, 25, 62, 79, + 0, 5, 76, 27, 24, 83, 28, 56, 22, 37, 82, 74, 3, 95, 6, 97, 17, + 95, 24, 54, 85, 14, 78, 31, 56, 96, 99, 20, 87, 27, 65, 87, 32, 6, + 14, 23, 89, 8, 45, 77, 12, 26, 51, 82, 88, 23, 44, 71, 17, 68, 25, + 69, 82, 2, 100, 3, 99, 64, 91, 85, 91, 21, 38, 90, 28, 52, 79, 83, + 26, 23, 60, 38, 49, 10, 86, 2, 33, 29, 74, 16, 97, 65, 51}, + {45, 67, 16, 48, 31, 81, 4, 16, 37, 26, 20, 93, 20, 38, 71, 2, 64, + 94, 62, 69, 9, 72, 54, 11, 71, 84, 51, 54, 80, 15, 4, 24, 83, 88, + 39, 80, 68, 43, 62, 71, 35, 82, 64, 55, 19, 0, 58, 84, 95, 19, 18, + 3, 58, 72, 81, 95, 55, 32, 14, 1, 47, 19, 92, 96, 6, 30, 76, 40, + 40, 37, 77, 75, 19, 6, 30, 38, 7, 54, 88, 68, 73, 5, 71, 97, 78, + 51, 58, 99, 49, 72, 66, 97, 57, 58, 58, 63, 54, 33, 69, 60}, + {37, 12, 1, 56, 18, 31, 60, 92, 51, 14, 59, 90, 19, 29, 87, 63, 47, + 10, 28, 96, 82, 94, 58, 39, 17, 16, 68, 38, 15, 3, 64, 52, 15, 65, + 74, 100, 62, 0, 92, 12, 14, 50, 2, 33, 46, 55, 63, 59, 65, 91, 20, + 46, 50, 79, 51, 34, 61, 19, 72, 76, 89, 35, 95, 3, 67, 68, 69, 28, + 68, 60, 41, 82, 77, 43, 82, 22, 98, 44, 47, 28, 0, 67, 74, 50, 11, + 92, 84, 72, 77, 21, 14, 65, 23, 8, 34, 90, 42, 2, 84, 10}, + {63, 24, 58, 5, 33, 5, 94, 97, 15, 40, 24, 15, 6, 65, 32, 18, 56, + 82, 56, 32, 70, 70, 97, 93, 78, 30, 48, 87, 99, 31, 97, 27, 22, 20, + 32, 55, 93, 25, 52, 7, 31, 42, 90, 4, 6, 88, 89, 62, 35, 44, 60, + 4, 81, 56, 63, 24, 52, 10, 10, 17, 8, 73, 44, 30, 94, 77, 51, 86, + 68, 69, 59, 66, 11, 48, 70, 84, 1, 58, 12, 37, 68, 72, 41, 48, 95, + 71, 73, 12, 47, 83, 29, 55, 56, 74, 51, 15, 16, 2, 67, 50}, + {71, 92, 15, 82, 6, 51, 66, 7, 75, 44, 44, 43, 15, 52, 57, 9, 22, + 96, 89, 35, 79, 17, 91, 0, 57, 7, 82, 73, 9, 14, 90, 81, 5, 4, + 28, 11, 22, 60, 19, 97, 3, 29, 5, 86, 81, 63, 61, 69, 58, 49, 71, + 2, 67, 27, 69, 90, 34, 50, 29, 44, 64, 18, 91, 36, 89, 85, 47, 10, + 45, 32, 7, 14, 62, 12, 100, 8, 41, 61, 44, 100, 9, 14, 68, 42, 41, + 37, 99, 75, 87, 27, 85, 17, 45, 75, 53, 33, 26, 66, 10, 71}, + {99, 84, 85, 60, 62, 51, 68, 3, 11, 11, 69, 87, 92, 36, 96, 32, 39, + 94, 74, 93, 87, 58, 9, 31, 100, 28, 30, 25, 94, 6, 62, 92, 90, 12, + 17, 52, 29, 86, 55, 40, 63, 90, 94, 21, 92, 55, 53, 31, 14, 93, 23, + 0, 17, 99, 98, 16, 26, 27, 7, 86, 34, 35, 78, 90, 13, 95, 41, 43, + 46, 62, 49, 76, 51, 42, 97, 9, 63, 15, 40, 77, 8, 63, 43, 25, 61, + 40, 7, 53, 68, 81, 38, 68, 82, 82, 57, 95, 43, 65, 37, 55}, + {93, 87, 30, 10, 95, 93, 19, 58, 75, 59, 0, 83, 88, 44, 74, 14, 50, + 47, 67, 17, 94, 71, 51, 75, 53, 75, 69, 96, 5, 73, 16, 98, 59, 13, + 7, 19, 5, 93, 43, 80, 17, 44, 28, 4, 54, 68, 18, 3, 14, 51, 88, + 7, 22, 4, 48, 41, 45, 17, 2, 50, 90, 18, 14, 14, 31, 88, 33, 3, + 81, 77, 49, 98, 87, 44, 2, 6, 11, 87, 76, 93, 4, 63, 66, 26, 34, + 14, 33, 79, 98, 35, 29, 53, 19, 43, 67, 51, 30, 66, 20, 77}, + {8, 69, 75, 61, 79, 43, 33, 91, 96, 9, 49, 100, 38, 14, 25, 72, 28, + 58, 51, 92, 59, 46, 44, 79, 55, 77, 96, 51, 9, 15, 28, 17, 50, 69, + 45, 29, 11, 78, 86, 6, 53, 34, 73, 92, 48, 98, 29, 43, 22, 46, 34, + 47, 92, 79, 25, 12, 55, 87, 64, 64, 68, 58, 48, 18, 93, 59, 13, 70, + 2, 99, 76, 56, 32, 14, 13, 46, 12, 42, 89, 0, 89, 23, 13, 46, 1, + 5, 59, 22, 92, 89, 53, 60, 12, 67, 44, 4, 92, 57, 74, 94}, + {55, 15, 15, 53, 30, 28, 99, 8, 71, 88, 75, 59, 77, 88, 4, 44, 93, + 29, 66, 51, 17, 85, 10, 96, 17, 54, 100, 8, 77, 73, 2, 31, 89, 17, + 50, 85, 46, 48, 93, 83, 35, 67, 7, 11, 54, 78, 21, 13, 7, 88, 64, + 91, 38, 74, 87, 56, 94, 86, 64, 70, 25, 32, 67, 80, 50, 16, 64, 62, + 30, 56, 10, 32, 89, 17, 9, 8, 95, 31, 21, 68, 18, 85, 59, 22, 24, + 11, 78, 84, 97, 42, 19, 88, 40, 86, 67, 90, 68, 30, 17, 99}, + {52, 27, 30, 40, 44, 5, 49, 5, 36, 70, 73, 20, 21, 31, 43, 11, 42, + 20, 96, 5, 28, 14, 93, 69, 67, 26, 24, 34, 56, 8, 99, 75, 35, 95, + 14, 46, 0, 29, 51, 36, 66, 23, 57, 87, 21, 100, 98, 29, 86, 59, 0, + 81, 74, 60, 15, 40, 86, 39, 40, 7, 47, 5, 82, 49, 100, 63, 95, 66, + 92, 11, 2, 57, 0, 25, 9, 21, 91, 74, 17, 76, 32, 17, 22, 72, 43, + 37, 78, 28, 77, 18, 36, 90, 90, 84, 38, 89, 46, 99, 21, 4}, + {9, 90, 27, 10, 14, 3, 98, 4, 77, 14, 46, 75, 99, 35, 47, 41, 72, + 24, 70, 48, 8, 72, 4, 98, 55, 42, 53, 68, 7, 74, 72, 16, 63, 99, + 26, 43, 1, 24, 13, 44, 4, 25, 19, 2, 60, 32, 10, 32, 22, 80, 46, + 98, 17, 50, 95, 38, 59, 13, 5, 66, 87, 77, 48, 15, 42, 41, 58, 9, + 31, 71, 54, 35, 97, 39, 4, 56, 37, 14, 88, 59, 60, 0, 56, 77, 50, + 17, 81, 75, 30, 87, 6, 84, 29, 55, 99, 37, 96, 57, 47, 26}, + {94, 67, 27, 56, 5, 98, 12, 8, 11, 66, 67, 37, 66, 90, 80, 83, 6, + 61, 23, 2, 47, 30, 86, 42, 51, 51, 80, 46, 74, 26, 38, 67, 59, 31, + 23, 64, 29, 1, 38, 6, 33, 4, 44, 100, 60, 90, 48, 32, 50, 71, 1, + 63, 67, 87, 5, 17, 3, 51, 29, 77, 77, 33, 10, 35, 65, 100, 65, 60, + 0, 2, 32, 33, 73, 42, 99, 100, 32, 12, 31, 48, 84, 99, 11, 50, 86, + 83, 34, 55, 33, 63, 32, 76, 97, 8, 77, 27, 7, 7, 53, 74}, + {76, 85, 73, 14, 27, 72, 13, 59, 50, 11, 73, 33, 9, 84, 50, 61, 32, + 84, 16, 31, 12, 14, 6, 8, 89, 49, 1, 96, 56, 54, 35, 31, 39, 7, + 46, 32, 45, 59, 57, 96, 36, 29, 95, 46, 80, 10, 73, 11, 94, 89, 9, + 73, 69, 15, 47, 57, 31, 49, 18, 87, 69, 53, 18, 74, 27, 30, 5, 38, + 55, 28, 33, 92, 58, 95, 3, 37, 4, 76, 14, 65, 31, 23, 37, 66, 5, + 50, 23, 36, 99, 41, 22, 68, 61, 6, 7, 88, 2, 13, 92, 58}, + {41, 92, 15, 65, 86, 18, 1, 56, 60, 83, 87, 57, 5, 90, 23, 10, 40, + 12, 12, 38, 19, 35, 72, 80, 7, 80, 33, 10, 59, 25, 34, 66, 16, 49, + 31, 68, 33, 99, 23, 59, 47, 10, 16, 53, 100, 5, 29, 39, 17, 42, 44, + 2, 43, 82, 49, 16, 27, 82, 93, 86, 73, 26, 18, 55, 75, 49, 89, 7, + 13, 79, 33, 61, 55, 15, 80, 20, 20, 75, 60, 3, 83, 70, 5, 92, 17, + 54, 8, 45, 2, 0, 30, 41, 27, 14, 63, 68, 29, 51, 42, 43}, + {96, 75, 70, 50, 90, 49, 71, 9, 90, 97, 79, 73, 66, 50, 64, 83, 4, + 72, 27, 73, 39, 24, 80, 32, 4, 42, 100, 34, 60, 41, 43, 55, 82, 12, + 5, 71, 27, 42, 46, 16, 38, 24, 89, 3, 41, 19, 52, 11, 57, 46, 84, + 96, 36, 29, 27, 40, 72, 94, 40, 98, 0, 83, 18, 83, 95, 90, 53, 88, + 31, 66, 71, 69, 56, 59, 38, 97, 44, 57, 7, 1, 2, 57, 97, 4, 87, + 91, 10, 24, 84, 51, 21, 84, 33, 39, 66, 95, 96, 86, 82, 26}, + {51, 52, 96, 73, 78, 33, 70, 21, 90, 77, 89, 58, 0, 86, 28, 87, 42, + 39, 10, 25, 56, 98, 75, 89, 2, 7, 49, 98, 59, 98, 24, 76, 15, 86, + 48, 59, 18, 17, 81, 75, 61, 69, 99, 61, 20, 27, 13, 62, 32, 90, 53, + 88, 87, 95, 42, 89, 1, 58, 53, 60, 55, 43, 1, 70, 28, 49, 29, 12, + 33, 76, 53, 60, 10, 52, 87, 98, 45, 100, 25, 43, 89, 79, 97, 41, 73, + 4, 96, 40, 62, 48, 66, 16, 91, 67, 53, 85, 82, 48, 98, 14}, + {90, 50, 74, 66, 68, 26, 63, 12, 25, 89, 55, 80, 33, 17, 20, 72, 22, + 83, 11, 84, 30, 77, 67, 88, 9, 86, 72, 91, 33, 35, 72, 89, 86, 11, + 54, 53, 38, 17, 32, 29, 72, 53, 76, 71, 71, 62, 42, 93, 44, 19, 76, + 41, 62, 42, 28, 71, 27, 66, 27, 26, 1, 99, 14, 87, 10, 35, 5, 14, + 52, 37, 43, 90, 91, 18, 60, 27, 81, 68, 19, 24, 87, 95, 31, 48, 3, + 59, 18, 97, 92, 11, 90, 93, 10, 70, 45, 20, 4, 16, 34, 22}, + {54, 43, 11, 10, 62, 37, 37, 8, 4, 22, 99, 57, 83, 30, 4, 86, 55, + 89, 49, 46, 0, 38, 38, 77, 74, 49, 97, 79, 66, 97, 0, 86, 5, 79, + 62, 33, 15, 65, 41, 87, 87, 6, 9, 35, 2, 14, 21, 57, 69, 36, 3, + 35, 40, 7, 11, 13, 23, 74, 92, 55, 36, 93, 40, 42, 37, 68, 75, 18, + 32, 83, 71, 85, 89, 81, 19, 91, 61, 6, 13, 29, 8, 16, 65, 48, 91, + 76, 62, 80, 16, 19, 34, 52, 78, 74, 94, 14, 7, 69, 33, 5}, + {17, 3, 56, 5, 84, 41, 62, 44, 48, 75, 40, 56, 58, 71, 71, 14, 12, + 99, 94, 28, 17, 27, 81, 96, 67, 74, 76, 74, 8, 75, 45, 25, 79, 0, + 97, 28, 41, 58, 39, 55, 100, 45, 11, 23, 15, 48, 37, 27, 46, 97, 56, + 63, 90, 36, 24, 56, 76, 0, 96, 85, 41, 40, 9, 19, 6, 6, 14, 47, + 30, 19, 2, 96, 64, 80, 18, 45, 27, 21, 72, 39, 17, 94, 1, 6, 96, + 93, 28, 72, 59, 90, 56, 100, 96, 31, 86, 1, 3, 66, 15, 0}, + {85, 17, 96, 14, 63, 81, 59, 90, 1, 97, 28, 19, 57, 96, 92, 52, 54, + 87, 23, 12, 76, 45, 79, 72, 43, 64, 39, 46, 29, 54, 12, 80, 37, 8, + 60, 100, 89, 85, 55, 56, 47, 49, 75, 3, 45, 33, 56, 99, 19, 45, 78, + 61, 91, 56, 99, 33, 86, 4, 45, 81, 58, 58, 60, 96, 32, 19, 61, 87, + 70, 16, 42, 16, 65, 84, 20, 76, 83, 42, 41, 68, 87, 18, 28, 77, 40, + 94, 76, 25, 98, 88, 5, 21, 11, 31, 16, 43, 16, 44, 29, 86}, + {60, 37, 1, 24, 20, 88, 67, 69, 29, 7, 36, 16, 25, 65, 59, 65, 24, + 1, 56, 21, 89, 61, 42, 100, 58, 25, 8, 74, 69, 3, 25, 95, 40, 26, + 85, 27, 81, 51, 96, 9, 58, 32, 25, 49, 63, 51, 80, 87, 52, 35, 74, + 40, 62, 82, 5, 19, 73, 13, 59, 7, 16, 84, 1, 56, 77, 53, 49, 57, + 3, 45, 66, 28, 43, 58, 77, 72, 8, 57, 58, 60, 92, 98, 66, 20, 79, + 71, 39, 52, 84, 65, 59, 100, 48, 27, 21, 91, 80, 71, 47, 83}, + {82, 80, 10, 24, 37, 54, 62, 45, 10, 86, 71, 68, 83, 36, 88, 27, 6, + 94, 79, 56, 58, 4, 55, 72, 98, 42, 63, 77, 12, 9, 25, 60, 89, 2, + 50, 92, 56, 11, 2, 32, 97, 73, 100, 79, 75, 88, 73, 47, 47, 17, 2, + 4, 21, 23, 42, 18, 66, 4, 61, 44, 81, 87, 71, 35, 89, 20, 27, 10, + 32, 96, 42, 95, 69, 41, 40, 9, 95, 12, 23, 41, 29, 25, 11, 17, 15, + 54, 1, 47, 24, 63, 57, 4, 49, 27, 40, 3, 48, 33, 13, 46}, + {95, 55, 40, 29, 96, 46, 39, 57, 58, 62, 98, 54, 53, 76, 71, 68, 29, + 72, 81, 53, 34, 38, 24, 49, 65, 30, 52, 79, 29, 31, 24, 23, 86, 31, + 53, 48, 77, 92, 4, 1, 19, 68, 55, 72, 9, 92, 6, 38, 63, 87, 58, + 64, 24, 82, 79, 56, 78, 98, 34, 6, 28, 25, 29, 81, 22, 82, 28, 65, + 39, 99, 66, 58, 32, 87, 97, 42, 78, 2, 46, 7, 55, 3, 71, 46, 51, + 49, 1, 28, 46, 1, 34, 41, 26, 30, 21, 48, 11, 49, 80, 17}, + {13, 45, 75, 11, 99, 37, 53, 76, 39, 66, 83, 95, 35, 19, 40, 87, 69, + 7, 81, 81, 8, 82, 21, 35, 11, 42, 49, 89, 57, 95, 5, 36, 40, 47, + 14, 38, 84, 33, 80, 23, 99, 29, 84, 34, 48, 90, 87, 16, 97, 67, 64, + 71, 48, 51, 72, 59, 60, 88, 48, 83, 82, 53, 86, 21, 66, 100, 25, 50, + 32, 72, 39, 31, 0, 22, 65, 48, 78, 51, 31, 40, 84, 61, 10, 32, 11, + 83, 57, 71, 70, 4, 20, 51, 24, 5, 39, 90, 4, 30, 5, 36}, + {1, 44, 33, 68, 66, 64, 16, 9, 81, 13, 49, 65, 74, 60, 97, 51, 42, + 19, 89, 11, 24, 8, 28, 14, 13, 67, 70, 84, 64, 76, 86, 65, 19, 19, + 100, 52, 83, 15, 61, 64, 95, 10, 95, 34, 70, 57, 85, 78, 76, 73, 55, + 66, 47, 83, 80, 60, 16, 16, 9, 80, 92, 96, 10, 77, 14, 9, 28, 63, + 91, 56, 93, 85, 32, 87, 18, 68, 43, 70, 45, 19, 42, 66, 85, 56, 48, + 31, 82, 30, 47, 92, 9, 4, 87, 87, 81, 67, 96, 76, 29, 87}, + {31, 89, 37, 63, 75, 22, 97, 85, 92, 41, 70, 100, 73, 20, 55, 20, 51, + 37, 17, 64, 28, 93, 68, 81, 79, 15, 47, 75, 91, 42, 27, 88, 30, 64, + 16, 72, 52, 12, 56, 43, 19, 25, 43, 92, 45, 64, 78, 63, 0, 95, 26, + 95, 54, 61, 75, 32, 76, 88, 73, 32, 30, 66, 86, 26, 97, 1, 98, 48, + 80, 19, 92, 99, 10, 0, 56, 56, 64, 33, 85, 65, 95, 77, 59, 48, 3, + 0, 46, 45, 88, 19, 77, 84, 51, 62, 10, 47, 29, 74, 96, 8}, + {94, 53, 73, 3, 53, 28, 25, 16, 62, 76, 47, 22, 53, 73, 70, 22, 73, + 15, 68, 60, 0, 10, 44, 52, 73, 54, 65, 68, 94, 60, 77, 53, 79, 15, + 23, 31, 44, 48, 14, 72, 91, 27, 94, 9, 100, 29, 31, 72, 44, 99, 32, + 11, 9, 76, 29, 48, 96, 94, 15, 55, 20, 58, 8, 99, 40, 31, 97, 84, + 45, 77, 55, 35, 3, 14, 44, 3, 43, 42, 75, 87, 40, 73, 64, 15, 14, + 93, 29, 76, 53, 11, 31, 73, 69, 39, 37, 8, 70, 100, 58, 81}, + {76, 79, 16, 80, 93, 26, 49, 35, 68, 23, 89, 75, 63, 18, 56, 77, 11, + 86, 53, 30, 97, 84, 2, 31, 89, 5, 6, 24, 5, 64, 4, 47, 43, 87, + 26, 1, 13, 41, 3, 47, 65, 92, 88, 94, 9, 44, 70, 87, 29, 89, 16, + 25, 72, 85, 56, 26, 57, 62, 50, 62, 93, 55, 8, 1, 7, 1, 2, 20, + 42, 5, 34, 73, 63, 21, 66, 39, 31, 2, 25, 60, 91, 8, 51, 29, 59, + 74, 55, 15, 1, 5, 77, 94, 26, 52, 95, 33, 19, 64, 20, 27}, + {35, 54, 0, 99, 41, 32, 37, 73, 34, 28, 99, 92, 2, 50, 20, 62, 23, + 75, 77, 24, 46, 20, 85, 72, 38, 45, 72, 57, 75, 92, 84, 10, 11, 50, + 75, 18, 83, 78, 91, 83, 72, 56, 74, 75, 72, 60, 36, 95, 1, 79, 85, + 47, 99, 35, 19, 36, 47, 91, 59, 21, 48, 43, 31, 59, 59, 72, 77, 7, + 49, 34, 91, 21, 56, 30, 96, 27, 57, 98, 88, 58, 76, 38, 4, 41, 74, + 90, 43, 20, 46, 2, 7, 94, 11, 39, 18, 70, 77, 62, 78, 26}, + {62, 34, 47, 17, 30, 8, 10, 87, 72, 98, 44, 47, 1, 15, 54, 75, 4, + 98, 61, 17, 100, 69, 10, 10, 74, 96, 46, 50, 23, 23, 42, 85, 23, 55, + 68, 54, 29, 44, 40, 0, 41, 51, 14, 42, 66, 68, 84, 36, 31, 10, 53, + 30, 45, 30, 6, 85, 25, 53, 1, 14, 42, 43, 65, 66, 65, 32, 86, 94, + 42, 25, 95, 83, 42, 8, 91, 74, 42, 40, 10, 74, 51, 63, 70, 62, 59, + 77, 47, 50, 96, 48, 64, 3, 57, 28, 35, 21, 26, 20, 15, 68}, + {12, 9, 16, 54, 84, 74, 28, 92, 13, 4, 65, 30, 33, 1, 93, 93, 78, + 5, 42, 39, 53, 73, 42, 9, 0, 78, 98, 94, 98, 12, 61, 76, 88, 44, + 30, 37, 17, 24, 28, 97, 28, 60, 27, 61, 27, 86, 53, 4, 91, 62, 9, + 9, 34, 17, 85, 0, 61, 82, 94, 25, 60, 21, 0, 13, 65, 30, 50, 48, + 54, 45, 44, 48, 71, 37, 9, 98, 89, 62, 68, 45, 23, 43, 54, 23, 60, + 5, 24, 21, 87, 17, 12, 13, 4, 12, 26, 69, 9, 43, 83, 29}, + {88, 94, 78, 24, 30, 87, 21, 86, 14, 55, 30, 4, 98, 51, 27, 57, 56, + 17, 44, 8, 35, 56, 21, 39, 69, 14, 75, 44, 57, 23, 73, 10, 16, 50, + 34, 13, 2, 55, 99, 17, 9, 95, 21, 6, 45, 14, 29, 0, 32, 74, 9, + 33, 96, 97, 38, 30, 10, 79, 74, 33, 2, 47, 43, 85, 63, 77, 98, 66, + 98, 62, 83, 73, 57, 70, 45, 68, 50, 75, 69, 82, 14, 44, 81, 9, 6, + 19, 40, 84, 64, 80, 16, 66, 26, 60, 51, 90, 36, 14, 55, 34}, + {43, 3, 73, 100, 73, 18, 67, 89, 93, 1, 37, 6, 11, 17, 82, 85, 2, + 88, 68, 67, 68, 50, 99, 60, 9, 15, 49, 12, 30, 70, 12, 73, 73, 85, + 38, 11, 2, 71, 67, 95, 39, 3, 67, 16, 20, 15, 0, 90, 69, 34, 22, + 36, 85, 20, 63, 94, 36, 11, 72, 32, 48, 84, 71, 87, 69, 75, 65, 37, + 11, 31, 99, 50, 34, 31, 33, 20, 46, 100, 76, 15, 34, 98, 17, 18, 18, + 80, 78, 20, 58, 16, 18, 72, 100, 55, 58, 34, 96, 89, 72, 6}, + {86, 36, 23, 86, 67, 56, 6, 80, 21, 48, 61, 55, 46, 78, 39, 30, 24, + 84, 50, 48, 100, 34, 19, 65, 89, 43, 100, 84, 32, 37, 56, 17, 73, 79, + 3, 5, 0, 76, 85, 22, 23, 45, 43, 35, 23, 83, 65, 13, 32, 14, 61, + 31, 14, 46, 96, 2, 89, 61, 52, 87, 64, 8, 4, 2, 53, 74, 8, 54, + 15, 93, 42, 38, 4, 85, 40, 94, 67, 4, 6, 99, 86, 33, 96, 100, 79, + 58, 69, 33, 85, 20, 20, 49, 95, 91, 17, 14, 64, 25, 68, 79}, + {85, 76, 83, 89, 60, 22, 82, 94, 27, 54, 58, 79, 87, 54, 78, 31, 78, + 12, 64, 62, 100, 84, 10, 94, 74, 28, 7, 37, 19, 41, 82, 70, 16, 31, + 58, 43, 19, 5, 36, 12, 59, 94, 91, 11, 13, 69, 42, 91, 81, 6, 53, + 80, 90, 29, 40, 30, 23, 13, 33, 9, 21, 15, 79, 3, 12, 37, 46, 31, + 8, 48, 44, 34, 42, 34, 45, 21, 69, 54, 12, 16, 60, 65, 96, 15, 60, + 1, 45, 84, 82, 45, 93, 2, 60, 71, 5, 38, 74, 18, 69, 49}, + {66, 12, 83, 74, 47, 94, 96, 15, 47, 74, 31, 6, 4, 94, 89, 64, 61, + 100, 13, 42, 44, 72, 44, 70, 9, 16, 7, 83, 34, 77, 98, 66, 55, 80, + 40, 1, 74, 1, 84, 20, 41, 81, 94, 45, 40, 48, 8, 1, 47, 89, 43, + 58, 60, 54, 27, 69, 36, 1, 18, 70, 44, 15, 1, 99, 96, 7, 0, 35, + 75, 50, 21, 15, 30, 14, 60, 37, 62, 35, 38, 76, 23, 47, 33, 49, 67, + 60, 18, 2, 27, 2, 38, 71, 17, 6, 70, 79, 13, 36, 80, 89}, + {86, 1, 3, 82, 15, 30, 18, 44, 31, 22, 19, 54, 36, 52, 69, 69, 78, + 53, 72, 5, 55, 76, 42, 73, 82, 11, 17, 62, 47, 98, 50, 99, 99, 19, + 81, 80, 15, 65, 23, 46, 54, 8, 66, 56, 60, 35, 24, 4, 88, 62, 76, + 43, 38, 17, 82, 86, 29, 65, 47, 42, 62, 63, 41, 26, 49, 88, 6, 64, + 18, 96, 10, 72, 4, 42, 94, 64, 77, 18, 34, 31, 80, 9, 40, 84, 27, + 21, 70, 22, 86, 83, 64, 14, 46, 4, 40, 61, 92, 46, 24, 10}, + {42, 0, 48, 12, 9, 42, 76, 86, 26, 77, 83, 5, 86, 22, 56, 79, 43, + 92, 0, 96, 40, 65, 76, 52, 35, 15, 12, 94, 28, 3, 3, 36, 3, 17, + 48, 79, 25, 90, 65, 51, 66, 47, 23, 18, 36, 79, 97, 79, 36, 98, 40, + 76, 28, 15, 28, 63, 98, 40, 56, 25, 43, 25, 27, 13, 9, 75, 92, 34, + 30, 22, 86, 97, 36, 75, 81, 72, 19, 77, 16, 55, 40, 23, 97, 68, 4, + 24, 31, 1, 31, 53, 93, 40, 79, 19, 19, 88, 60, 78, 88, 91}, + {66, 39, 53, 1, 13, 33, 39, 32, 76, 22, 53, 16, 11, 16, 84, 15, 40, + 81, 17, 37, 34, 76, 44, 79, 96, 63, 32, 21, 6, 86, 11, 73, 25, 30, + 40, 4, 29, 46, 3, 5, 68, 56, 21, 79, 72, 71, 60, 79, 18, 77, 82, + 52, 53, 25, 97, 14, 55, 95, 35, 61, 80, 13, 33, 4, 9, 74, 9, 39, + 19, 12, 10, 53, 34, 98, 98, 73, 68, 57, 17, 52, 0, 99, 3, 19, 24, + 66, 100, 79, 60, 34, 39, 40, 13, 39, 44, 23, 79, 19, 28, 64}, + {98, 38, 16, 32, 35, 80, 71, 69, 36, 88, 21, 2, 86, 91, 21, 76, 57, + 87, 20, 83, 21, 26, 22, 0, 65, 33, 90, 9, 18, 17, 73, 16, 55, 55, + 14, 56, 34, 85, 92, 36, 38, 79, 5, 90, 35, 93, 66, 58, 80, 86, 41, + 67, 78, 29, 67, 8, 62, 57, 17, 47, 74, 90, 63, 96, 44, 43, 17, 44, + 27, 75, 47, 65, 53, 52, 54, 55, 10, 86, 12, 90, 38, 53, 56, 15, 49, + 23, 24, 77, 46, 41, 23, 19, 98, 86, 81, 7, 95, 65, 18, 21}, + {39, 31, 52, 59, 49, 73, 13, 59, 24, 25, 49, 62, 45, 4, 44, 60, 94, + 34, 36, 39, 41, 60, 25, 4, 11, 72, 12, 6, 36, 97, 94, 76, 27, 12, + 34, 76, 85, 13, 34, 75, 4, 83, 3, 49, 54, 47, 8, 47, 47, 11, 53, + 88, 71, 44, 59, 48, 15, 71, 54, 52, 67, 14, 27, 94, 26, 27, 69, 77, + 6, 69, 51, 10, 52, 54, 26, 72, 67, 0, 85, 80, 11, 37, 34, 48, 81, + 93, 97, 97, 29, 16, 14, 96, 30, 7, 55, 56, 34, 90, 99, 6}, + {58, 50, 16, 76, 70, 8, 47, 3, 9, 32, 49, 87, 69, 83, 35, 16, 75, + 98, 79, 3, 13, 93, 65, 44, 100, 86, 66, 100, 75, 65, 5, 33, 81, 88, + 75, 16, 97, 22, 86, 72, 54, 35, 58, 89, 17, 59, 71, 59, 56, 49, 28, + 70, 41, 60, 80, 40, 45, 11, 5, 20, 42, 10, 19, 22, 99, 94, 5, 61, + 82, 91, 32, 1, 25, 90, 57, 9, 49, 27, 34, 71, 43, 62, 40, 50, 21, + 86, 91, 33, 98, 62, 53, 39, 73, 38, 28, 37, 98, 33, 98, 80}, + {90, 29, 47, 82, 85, 3, 57, 100, 98, 91, 71, 40, 18, 77, 90, 6, 63, + 46, 39, 26, 8, 58, 31, 47, 96, 59, 84, 59, 58, 47, 38, 48, 76, 52, + 96, 26, 55, 52, 26, 52, 42, 63, 58, 26, 5, 48, 32, 68, 60, 37, 60, + 68, 95, 92, 14, 56, 16, 64, 15, 75, 10, 19, 89, 52, 71, 84, 79, 26, + 1, 71, 44, 43, 100, 2, 35, 4, 16, 68, 39, 76, 4, 99, 10, 100, 56, + 91, 21, 73, 55, 36, 13, 31, 56, 1, 84, 93, 51, 28, 85, 52}, + {65, 29, 61, 64, 98, 96, 68, 13, 29, 73, 55, 34, 38, 65, 100, 94, 56, + 87, 32, 77, 23, 45, 7, 45, 12, 91, 37, 29, 85, 22, 47, 49, 17, 74, + 12, 14, 70, 47, 94, 65, 86, 48, 99, 23, 13, 64, 84, 35, 51, 15, 11, + 40, 27, 18, 51, 5, 76, 88, 1, 26, 76, 48, 76, 59, 22, 54, 73, 58, + 67, 32, 22, 53, 81, 88, 76, 60, 17, 25, 95, 34, 7, 5, 40, 34, 90, + 91, 5, 31, 45, 6, 58, 20, 21, 33, 80, 9, 53, 18, 67, 20}, + {51, 55, 73, 31, 42, 14, 57, 26, 40, 51, 60, 13, 22, 0, 47, 78, 91, + 18, 9, 1, 92, 33, 22, 79, 32, 68, 88, 85, 86, 20, 71, 2, 75, 43, + 100, 84, 24, 56, 9, 30, 6, 35, 43, 95, 1, 56, 73, 59, 40, 48, 60, + 31, 81, 82, 9, 12, 15, 97, 63, 1, 83, 34, 70, 58, 43, 70, 41, 67, + 25, 16, 63, 99, 17, 5, 93, 19, 27, 31, 78, 68, 79, 37, 99, 59, 86, + 75, 37, 0, 37, 67, 68, 20, 0, 38, 78, 43, 7, 85, 77, 99}, + {67, 39, 97, 84, 11, 90, 2, 38, 20, 46, 5, 100, 50, 71, 24, 35, 45, + 28, 1, 82, 95, 36, 68, 61, 40, 11, 70, 47, 62, 46, 11, 28, 52, 8, + 79, 63, 98, 81, 67, 84, 94, 39, 49, 43, 9, 40, 78, 20, 68, 45, 68, + 28, 81, 36, 89, 20, 47, 58, 33, 9, 71, 45, 37, 22, 53, 82, 51, 16, + 29, 84, 100, 22, 22, 15, 65, 98, 55, 8, 17, 22, 19, 86, 16, 0, 21, + 4, 87, 34, 28, 20, 43, 99, 31, 47, 87, 50, 28, 3, 66, 57}, + {88, 31, 45, 76, 46, 9, 74, 0, 84, 91, 89, 3, 42, 4, 3, 63, 8, + 56, 98, 3, 76, 6, 1, 73, 53, 55, 22, 48, 58, 54, 71, 11, 86, 16, + 88, 98, 92, 61, 99, 76, 17, 53, 79, 60, 58, 48, 89, 32, 3, 52, 35, + 46, 59, 3, 18, 78, 24, 7, 92, 48, 61, 63, 60, 12, 79, 47, 10, 70, + 74, 75, 11, 91, 27, 90, 16, 51, 3, 5, 84, 74, 57, 85, 19, 15, 54, + 3, 60, 44, 10, 51, 93, 38, 13, 52, 50, 58, 65, 60, 28, 38}, + {34, 39, 95, 28, 96, 11, 79, 99, 16, 28, 38, 73, 80, 57, 55, 100, 27, + 14, 44, 3, 65, 36, 41, 79, 54, 92, 2, 18, 17, 30, 56, 18, 36, 50, + 46, 98, 27, 24, 62, 43, 19, 0, 83, 99, 23, 37, 98, 50, 51, 41, 20, + 82, 43, 61, 26, 97, 18, 29, 14, 2, 25, 36, 20, 61, 53, 66, 24, 80, + 56, 87, 90, 41, 87, 72, 39, 9, 8, 3, 26, 25, 44, 46, 73, 54, 73, + 100, 50, 58, 95, 31, 60, 19, 67, 80, 47, 86, 11, 71, 32, 33}, + {23, 21, 75, 9, 93, 80, 86, 67, 83, 11, 58, 94, 23, 30, 47, 96, 96, + 63, 19, 56, 94, 79, 42, 27, 24, 89, 12, 1, 25, 44, 35, 49, 65, 76, + 58, 23, 21, 9, 90, 4, 87, 13, 64, 9, 10, 77, 72, 72, 39, 91, 28, + 33, 70, 70, 60, 60, 24, 72, 62, 49, 83, 63, 64, 47, 4, 89, 37, 25, + 98, 26, 96, 85, 6, 25, 94, 16, 1, 31, 54, 41, 22, 48, 74, 58, 17, + 100, 17, 7, 71, 45, 57, 19, 74, 20, 67, 78, 75, 3, 70, 73}, + {96, 65, 57, 68, 57, 16, 50, 58, 14, 4, 99, 36, 52, 38, 60, 36, 37, + 43, 43, 75, 89, 66, 94, 62, 53, 60, 6, 27, 29, 76, 100, 92, 6, 22, + 59, 63, 5, 9, 21, 19, 13, 86, 21, 31, 24, 47, 67, 61, 90, 10, 35, + 44, 42, 29, 73, 95, 55, 79, 22, 51, 54, 88, 42, 26, 10, 0, 56, 82, + 9, 77, 67, 89, 28, 88, 20, 52, 34, 53, 80, 90, 29, 14, 34, 72, 9, + 6, 66, 65, 85, 54, 82, 4, 42, 23, 97, 18, 23, 52, 100, 100}, + {95, 66, 54, 23, 19, 40, 75, 19, 60, 20, 8, 89, 35, 42, 60, 10, 48, + 93, 41, 99, 46, 22, 69, 54, 45, 66, 38, 35, 17, 37, 0, 12, 69, 54, + 35, 54, 61, 76, 73, 20, 97, 48, 8, 98, 90, 35, 7, 4, 94, 15, 69, + 5, 37, 38, 60, 83, 3, 98, 84, 20, 1, 84, 99, 36, 3, 100, 57, 64, + 76, 96, 50, 38, 43, 25, 35, 100, 60, 8, 70, 53, 23, 38, 58, 27, 42, + 84, 76, 11, 48, 59, 99, 15, 8, 97, 51, 11, 97, 7, 42, 38}, + {70, 58, 76, 12, 83, 77, 11, 42, 51, 47, 61, 75, 86, 86, 68, 94, 69, + 43, 5, 16, 1, 3, 31, 9, 100, 49, 87, 62, 22, 95, 100, 92, 53, 41, + 71, 35, 17, 48, 44, 69, 96, 4, 9, 47, 56, 77, 40, 25, 86, 45, 7, + 87, 48, 5, 62, 14, 20, 48, 76, 8, 43, 76, 67, 62, 16, 37, 97, 0, + 85, 6, 35, 80, 78, 10, 26, 33, 53, 33, 24, 38, 78, 32, 24, 93, 3, + 52, 6, 90, 100, 48, 98, 8, 90, 64, 70, 6, 67, 33, 73, 52}, + {39, 7, 98, 16, 84, 91, 16, 36, 23, 40, 74, 67, 38, 64, 59, 41, 15, + 31, 97, 81, 80, 61, 56, 35, 24, 25, 41, 92, 24, 80, 9, 30, 53, 6, + 12, 36, 97, 28, 72, 86, 69, 11, 53, 6, 75, 78, 14, 56, 76, 10, 37, + 55, 37, 93, 56, 62, 84, 98, 19, 75, 43, 28, 4, 97, 0, 83, 32, 98, + 11, 71, 49, 80, 82, 1, 52, 23, 80, 66, 45, 55, 43, 48, 76, 80, 40, + 31, 7, 91, 95, 93, 31, 38, 20, 1, 0, 88, 84, 32, 51, 95}, + {2, 100, 40, 85, 1, 59, 74, 47, 91, 18, 68, 33, 67, 9, 80, 73, 6, + 53, 29, 1, 46, 60, 5, 32, 61, 5, 86, 11, 3, 36, 72, 6, 36, 12, + 57, 37, 71, 97, 50, 61, 14, 17, 61, 47, 93, 6, 20, 99, 25, 15, 66, + 37, 76, 71, 36, 2, 42, 21, 80, 12, 58, 52, 18, 94, 30, 41, 97, 67, + 3, 12, 94, 17, 96, 54, 31, 88, 26, 51, 86, 18, 66, 52, 55, 7, 89, + 91, 77, 98, 79, 56, 9, 36, 74, 94, 96, 3, 34, 92, 70, 37}, + {3, 64, 20, 65, 84, 51, 52, 77, 68, 37, 95, 0, 55, 15, 7, 10, 6, + 50, 7, 85, 73, 16, 87, 46, 9, 82, 50, 9, 39, 86, 12, 8, 49, 32, + 73, 100, 50, 24, 76, 17, 27, 70, 17, 83, 51, 92, 93, 23, 7, 66, 74, + 80, 82, 60, 26, 57, 41, 42, 66, 80, 27, 78, 88, 77, 76, 26, 42, 25, + 50, 17, 9, 78, 53, 26, 26, 3, 84, 85, 27, 92, 50, 0, 71, 31, 27, + 63, 88, 34, 4, 19, 14, 32, 97, 68, 75, 72, 95, 16, 64, 10}, + {100, 73, 88, 52, 65, 80, 21, 49, 64, 14, 6, 13, 15, 77, 10, 8, 6, + 64, 42, 10, 83, 22, 8, 45, 91, 49, 84, 51, 65, 47, 27, 30, 86, 82, + 82, 50, 61, 70, 65, 92, 84, 71, 71, 65, 14, 82, 73, 20, 11, 15, 97, + 61, 37, 5, 72, 94, 54, 55, 10, 86, 68, 38, 15, 53, 19, 64, 70, 80, + 33, 34, 37, 16, 72, 8, 82, 86, 56, 54, 5, 33, 69, 1, 94, 73, 73, + 66, 66, 27, 87, 77, 79, 55, 14, 94, 74, 100, 57, 43, 45, 90}, + {44, 83, 73, 15, 91, 54, 0, 46, 74, 72, 79, 9, 39, 39, 82, 12, 71, + 13, 5, 57, 90, 84, 11, 70, 77, 52, 69, 0, 95, 14, 56, 38, 63, 28, + 19, 53, 48, 19, 65, 89, 57, 9, 98, 97, 14, 45, 8, 85, 58, 80, 42, + 14, 63, 19, 50, 5, 71, 86, 72, 66, 66, 28, 70, 28, 56, 90, 81, 71, + 75, 11, 59, 32, 87, 56, 28, 1, 67, 2, 86, 91, 82, 27, 71, 10, 47, + 21, 82, 17, 6, 54, 49, 38, 82, 86, 66, 3, 75, 12, 74, 15}, + {23, 99, 47, 9, 20, 75, 10, 87, 43, 63, 44, 91, 90, 14, 0, 2, 35, + 83, 87, 7, 2, 1, 45, 84, 87, 77, 53, 27, 89, 94, 43, 78, 92, 90, + 88, 12, 31, 64, 65, 74, 93, 8, 65, 49, 23, 31, 51, 24, 80, 3, 99, + 82, 5, 9, 31, 92, 87, 85, 19, 41, 78, 62, 19, 35, 17, 73, 13, 48, + 2, 79, 89, 96, 53, 19, 44, 42, 50, 61, 67, 30, 65, 31, 78, 36, 40, + 9, 94, 93, 60, 12, 34, 3, 40, 53, 38, 24, 92, 52, 72, 94}, + {97, 60, 89, 15, 79, 99, 58, 96, 26, 91, 92, 91, 21, 69, 93, 27, 44, + 86, 20, 3, 65, 54, 6, 71, 73, 11, 95, 64, 29, 67, 23, 92, 93, 79, + 6, 38, 77, 30, 33, 2, 20, 91, 59, 7, 59, 51, 1, 3, 3, 21, 73, + 68, 41, 46, 4, 80, 57, 100, 9, 86, 32, 32, 43, 24, 10, 49, 28, 88, + 80, 27, 56, 66, 17, 82, 40, 77, 32, 41, 46, 1, 28, 85, 35, 69, 30, + 40, 14, 53, 39, 23, 4, 71, 55, 47, 61, 66, 97, 56, 19, 42}, + {83, 41, 74, 0, 22, 80, 77, 21, 20, 89, 22, 14, 73, 58, 83, 70, 98, + 63, 22, 2, 86, 27, 39, 41, 40, 66, 73, 36, 21, 92, 44, 4, 32, 85, + 4, 21, 64, 47, 42, 85, 1, 64, 65, 40, 88, 48, 9, 51, 77, 99, 53, + 63, 92, 58, 3, 31, 24, 76, 34, 11, 33, 44, 15, 31, 28, 86, 52, 93, + 99, 94, 43, 100, 24, 7, 40, 11, 21, 15, 63, 99, 13, 82, 61, 4, 40, + 30, 2, 30, 72, 36, 41, 71, 80, 23, 1, 8, 8, 20, 67, 7}}; diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.h b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.h new file mode 100644 index 0000000..4f29c1a --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/default/input.h @@ -0,0 +1,9 @@ + +#ifndef INPUT_H +#define INPUT_H + +#define NUM_NODES 100 + +extern unsigned char dijkstra_AdjMatrix[NUM_NODES][NUM_NODES]; + +#endif /* INPUT_H */ diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/dijkstra.c b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/dijkstra.c new file mode 100644 index 0000000..311cead --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/dijkstra.c @@ -0,0 +1,215 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: dijkstra + + Author: unknown + + Function: dijkstra finds the shortest path between nodes in a graph + + Source: network section of MiBench + + Changes: Made some variables local, compute checksum + + License: GPL + +*/ + +#include "input.h" + +/* + Definitions of symbolic constants +*/ + +// Wasm loop bounds + + +#include "input.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define NONE 9999 +#define OUT_OF_MEMORY -1 +#define QUEUE_SIZE 1000 + +/* + Type declarations +*/ +struct _NODE { + int dist; + int prev; +}; + +struct _QITEM { + int node; + int dist; + int prev; + struct _QITEM *next; +}; + +/* + Global variable definitions +*/ +struct _NODE dijkstra_rgnNodes[NUM_NODES]; + +int dijkstra_queueCount; +int dijkstra_queueNext; +struct _QITEM *dijkstra_queueHead; +struct _QITEM dijkstra_queueItems[QUEUE_SIZE]; + +int dijkstra_checksum = 0; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void dijkstra_init(void); +__attribute__((always_inline)) static inline int dijkstra_return(void); +__attribute__((always_inline)) static inline int +dijkstra_enqueue(int node, int dist, int prev); +__attribute__((always_inline)) static inline void +dijkstra_dequeue(int *node, int *dist, int *prev); +__attribute__((always_inline)) static inline int dijkstra_qcount(void); +__attribute__((always_inline)) static inline int dijkstra_find(int chStart, + int chEnd); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +dijkstra_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +__attribute__((always_inline)) static inline void +dijkstra_init(void) { + int i, k; + volatile int x = 0; + __pragma_loopbound(100, 100); + for (i = 0; i < NUM_NODES; i++) { + __pragma_loopbound(100, 100); + for (k = 0; k < NUM_NODES; k++) + dijkstra_AdjMatrix[i][k] ^= x; + } + + dijkstra_queueCount = 0; + dijkstra_queueNext = 0; + dijkstra_queueHead = (struct _QITEM *) 0; + + dijkstra_checksum = 0; +} + +__attribute__((always_inline)) static inline int +dijkstra_return(void) { + return ((dijkstra_checksum == 25) ? 0 : -1); +} + +__attribute__((always_inline)) static inline int +dijkstra_enqueue(int node, int dist, int prev) { + struct _QITEM *newItem = &dijkstra_queueItems[dijkstra_queueNext]; + struct _QITEM *last = dijkstra_queueHead; + + if (++dijkstra_queueNext >= QUEUE_SIZE) + return OUT_OF_MEMORY; + newItem->node = node; + newItem->dist = dist; + newItem->prev = prev; + newItem->next = 0; + + if (!last) + dijkstra_queueHead = newItem; + else { + __pragma_loopbound(0, 1000); + while (last->next) + last = last->next; + last->next = newItem; + } + dijkstra_queueCount++; + return 0; +} + +__attribute__((always_inline)) static inline void +dijkstra_dequeue(int *node, int *dist, int *prev) { + if (dijkstra_queueHead) { + *node = dijkstra_queueHead->node; + *dist = dijkstra_queueHead->dist; + *prev = dijkstra_queueHead->prev; + dijkstra_queueHead = dijkstra_queueHead->next; + dijkstra_queueCount--; + } +} + +__attribute__((always_inline)) static inline int +dijkstra_qcount(void) { + return (dijkstra_queueCount); +} + +__attribute__((always_inline)) static inline int +dijkstra_find(int chStart, int chEnd) { + int ch; + int prev, node = 0; + int cost, dist = 0; + int i; + + __pragma_loopbound(100, 100); + for (ch = 0; ch < NUM_NODES; ch++) { + dijkstra_rgnNodes[ch].dist = NONE; + dijkstra_rgnNodes[ch].prev = NONE; + } + + if (chStart == chEnd) { + } else { + dijkstra_rgnNodes[chStart].dist = 0; + dijkstra_rgnNodes[chStart].prev = NONE; + + if (dijkstra_enqueue(chStart, 0, NONE) == OUT_OF_MEMORY) + return OUT_OF_MEMORY; + + __pragma_loopbound(100, 1000); + while (dijkstra_qcount() > 0) { + dijkstra_dequeue(&node, &dist, &prev); + __pragma_loopbound(100, 100); + for (i = 0; i < NUM_NODES; i++) { + if ((cost = dijkstra_AdjMatrix[node][i]) != NONE) { + if ((NONE == dijkstra_rgnNodes[i].dist) || + (dijkstra_rgnNodes[i].dist > (cost + dist))) { + dijkstra_rgnNodes[i].dist = dist + cost; + dijkstra_rgnNodes[i].prev = node; + if (dijkstra_enqueue(i, dist + cost, node) == + OUT_OF_MEMORY) + return OUT_OF_MEMORY; + } + } + } + } + } + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +dijkstra_main(void) { + int i, j; + + /* finds 20 shortest paths between nodes */ + __pragma_loopbound(20, 20); + for (i = 0, j = NUM_NODES / 2; i < 20; i++, j++) { + j = j % NUM_NODES; + if (dijkstra_find(i, j) == OUT_OF_MEMORY) { + dijkstra_checksum += OUT_OF_MEMORY; + return; + } else + dijkstra_checksum += dijkstra_rgnNodes[j].dist; + dijkstra_queueNext = 0; + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + dijkstra_init(); + dijkstra_main(); + + return (dijkstra_return()); +} diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.c b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.c new file mode 100644 index 0000000..88c0664 --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.c @@ -0,0 +1,603 @@ +#include "input.h" + +unsigned char dijkstra_AdjMatrix[NUM_NODES][NUM_NODES] = { + {32, 32, 54, 12, 52, 56, 8, 30, 44, 94, 44, 39, 65, 19, 51, 91, 1, + 5, 89, 34, 25, 58, 20, 51, 38, 65, 30, 7, 20, 10, 51, 18, 43, 71, + 97, 61, 26, 5, 57, 70, 65, 0, 75, 29, 86, 93, 87, 87, 64, 75, 88, + 89, 100, 7, 40, 37, 38, 36, 44, 24, 46, 95, 43, 89, 32, 5, 15, 58, + 77, 72, 95, 8, 38, 69, 37, 24, 27, 90, 77, 92, 31, 30, 80, 30, 37, + 86, 33, 76, 21, 77, 100, 68, 37, 8, 22, 69, 81, 38, 94, 57}, + {76, 54, 65, 14, 89, 69, 4, 16, 24, 47, 7, 21, 78, 53, 17, 81, 39, + 50, 22, 60, 93, 89, 94, 30, 97, 16, 65, 43, 20, 24, 67, 62, 78, 98, + 42, 67, 32, 46, 49, 57, 60, 56, 44, 37, 75, 62, 17, 13, 11, 40, 40, + 4, 95, 100, 0, 57, 82, 31, 0, 1, 56, 67, 30, 100, 64, 72, 66, 63, + 18, 81, 19, 44, 2, 63, 81, 78, 91, 64, 91, 2, 70, 97, 73, 64, 97, + 39, 21, 78, 70, 21, 46, 25, 54, 76, 92, 84, 47, 57, 46, 31}, + {38, 31, 75, 40, 61, 21, 84, 51, 86, 41, 19, 21, 37, 58, 86, 100, 97, + 73, 44, 67, 60, 90, 58, 13, 31, 49, 63, 44, 73, 76, 76, 77, 73, 16, + 83, 100, 4, 67, 51, 56, 7, 36, 77, 10, 95, 28, 10, 57, 0, 54, 23, + 60, 9, 48, 39, 40, 97, 69, 84, 35, 44, 25, 11, 83, 8, 61, 83, 12, + 27, 100, 34, 0, 35, 10, 10, 96, 39, 87, 53, 5, 40, 42, 66, 15, 90, + 71, 55, 87, 39, 5, 88, 49, 97, 100, 32, 4, 60, 81, 83, 53}, + {80, 16, 53, 14, 94, 29, 77, 99, 16, 29, 3, 22, 71, 35, 4, 61, 6, + 25, 13, 11, 30, 0, 27, 94, 66, 25, 64, 92, 5, 47, 44, 85, 29, 63, + 65, 89, 59, 41, 87, 41, 36, 57, 29, 7, 92, 33, 34, 64, 59, 47, 76, + 55, 13, 2, 48, 46, 27, 12, 37, 99, 25, 48, 83, 20, 77, 13, 9, 35, + 55, 62, 76, 57, 18, 72, 64, 10, 4, 64, 74, 63, 77, 15, 18, 91, 84, + 32, 36, 77, 10, 39, 75, 35, 87, 23, 22, 30, 37, 31, 65, 58}, + {59, 7, 14, 78, 79, 45, 54, 83, 8, 94, 12, 86, 9, 97, 42, 93, 95, + 44, 70, 5, 83, 10, 40, 36, 34, 62, 66, 71, 59, 97, 95, 18, 3, 8, + 62, 48, 19, 15, 98, 28, 8, 9, 80, 84, 72, 21, 43, 66, 65, 79, 71, + 13, 89, 78, 49, 22, 5, 14, 59, 65, 11, 53, 49, 81, 28, 77, 29, 47, + 92, 26, 41, 66, 1, 20, 50, 73, 7, 59, 4, 72, 37, 76, 86, 25, 19, + 0, 14, 24, 15, 73, 55, 93, 93, 3, 73, 87, 80, 68, 100, 37}, + {94, 41, 3, 61, 27, 19, 33, 35, 78, 38, 73, 14, 80, 58, 5, 99, 59, + 19, 22, 40, 59, 78, 32, 17, 47, 71, 3, 94, 39, 2, 97, 99, 9, 66, + 60, 37, 85, 59, 38, 28, 63, 10, 8, 8, 35, 81, 6, 60, 100, 96, 66, + 24, 39, 64, 41, 52, 34, 10, 11, 39, 80, 8, 4, 89, 74, 64, 92, 25, + 89, 29, 19, 18, 6, 28, 26, 7, 8, 33, 67, 74, 95, 32, 99, 33, 96, + 5, 51, 96, 83, 63, 35, 62, 71, 39, 16, 10, 69, 8, 35, 23}, + {3, 55, 41, 76, 49, 68, 83, 23, 67, 15, 97, 61, 13, 61, 60, 75, 33, + 77, 71, 15, 39, 72, 43, 76, 77, 59, 53, 11, 33, 88, 34, 37, 8, 76, + 79, 23, 9, 62, 46, 76, 43, 9, 2, 57, 70, 28, 31, 69, 4, 68, 84, + 10, 39, 26, 52, 82, 52, 4, 93, 85, 59, 94, 21, 33, 35, 67, 57, 44, + 28, 69, 86, 37, 78, 54, 94, 14, 48, 25, 83, 18, 59, 33, 28, 99, 25, + 81, 46, 77, 51, 39, 62, 9, 32, 49, 43, 33, 15, 100, 77, 9}, + {68, 28, 47, 12, 82, 6, 26, 96, 98, 75, 13, 57, 7, 8, 55, 33, 55, + 0, 76, 5, 5, 3, 15, 3, 53, 58, 36, 34, 23, 79, 10, 57, 6, 23, + 69, 54, 29, 61, 49, 27, 36, 63, 84, 9, 71, 4, 8, 25, 71, 85, 97, + 77, 88, 11, 46, 6, 35, 83, 7, 24, 27, 17, 82, 34, 40, 16, 88, 69, + 44, 3, 62, 46, 32, 45, 55, 2, 49, 64, 94, 87, 14, 90, 63, 68, 68, + 75, 75, 2, 23, 82, 27, 51, 65, 75, 85, 71, 57, 38, 39, 0}, + {7, 1, 46, 39, 12, 68, 41, 28, 31, 0, 14, 45, 91, 43, 12, 58, 17, + 53, 26, 41, 0, 19, 92, 31, 60, 42, 1, 17, 46, 41, 84, 54, 8, 97, + 93, 20, 64, 0, 14, 61, 0, 28, 72, 57, 71, 50, 81, 89, 70, 7, 96, + 70, 26, 87, 1, 87, 95, 69, 70, 40, 9, 19, 94, 84, 15, 87, 71, 45, + 87, 85, 5, 53, 13, 43, 10, 50, 94, 91, 38, 63, 98, 33, 99, 91, 86, + 66, 43, 80, 35, 79, 20, 10, 98, 80, 61, 13, 66, 31, 24, 18}, + {82, 97, 72, 61, 39, 48, 11, 99, 38, 49, 27, 2, 49, 26, 59, 0, 58, + 1, 81, 59, 80, 67, 70, 77, 46, 97, 56, 79, 27, 81, 63, 75, 77, 0, + 36, 82, 48, 47, 81, 53, 62, 7, 55, 77, 100, 13, 78, 24, 81, 24, 83, + 26, 91, 18, 2, 2, 14, 25, 47, 7, 72, 10, 83, 14, 10, 18, 96, 25, + 65, 42, 78, 93, 16, 32, 70, 15, 11, 47, 5, 58, 71, 89, 84, 27, 73, + 86, 96, 88, 77, 43, 95, 48, 19, 43, 62, 96, 61, 24, 20, 92}, + {66, 98, 85, 82, 96, 20, 64, 73, 67, 69, 30, 3, 23, 13, 97, 97, 66, + 58, 50, 42, 0, 44, 57, 86, 54, 85, 82, 14, 8, 1, 73, 41, 66, 23, + 22, 61, 43, 86, 0, 9, 21, 30, 79, 44, 44, 75, 40, 76, 99, 56, 17, + 100, 67, 40, 51, 20, 25, 32, 0, 100, 0, 73, 40, 66, 96, 29, 93, 38, + 81, 93, 13, 1, 90, 92, 46, 100, 32, 52, 75, 31, 8, 58, 97, 75, 99, + 13, 61, 90, 46, 61, 89, 12, 34, 96, 78, 96, 24, 36, 34, 4}, + {96, 13, 73, 85, 72, 18, 50, 70, 36, 24, 67, 10, 82, 29, 51, 80, 43, + 11, 35, 89, 39, 24, 0, 73, 86, 44, 34, 9, 46, 34, 80, 41, 48, 52, + 92, 19, 36, 41, 55, 39, 31, 22, 49, 13, 51, 67, 59, 94, 44, 95, 48, + 83, 85, 48, 21, 70, 58, 56, 45, 4, 90, 91, 11, 3, 43, 70, 89, 45, + 77, 44, 84, 8, 66, 100, 88, 83, 66, 46, 77, 76, 6, 24, 59, 91, 39, + 46, 26, 97, 68, 37, 0, 58, 28, 79, 27, 37, 48, 16, 82, 24}, + {60, 66, 32, 92, 65, 19, 74, 97, 32, 16, 72, 38, 41, 97, 96, 46, 43, + 88, 42, 77, 25, 9, 34, 19, 88, 28, 56, 1, 44, 3, 25, 70, 69, 24, + 27, 100, 9, 0, 96, 7, 84, 34, 12, 91, 30, 7, 36, 39, 95, 78, 16, + 86, 53, 16, 71, 6, 44, 26, 7, 54, 30, 100, 23, 65, 23, 50, 65, 99, + 17, 26, 73, 67, 60, 85, 57, 57, 92, 93, 96, 52, 36, 78, 4, 90, 61, + 75, 96, 4, 68, 3, 25, 64, 69, 14, 28, 58, 31, 59, 56, 48}, + {86, 28, 81, 45, 12, 37, 1, 70, 29, 64, 89, 31, 41, 93, 20, 1, 67, + 83, 73, 0, 52, 98, 64, 20, 78, 93, 78, 8, 17, 100, 22, 2, 95, 2, + 48, 6, 39, 15, 43, 34, 79, 31, 66, 87, 23, 52, 54, 56, 34, 93, 57, + 52, 56, 87, 72, 34, 79, 15, 42, 63, 15, 65, 65, 9, 67, 79, 82, 73, + 95, 91, 6, 39, 21, 38, 92, 10, 91, 46, 67, 91, 38, 90, 43, 95, 76, + 81, 28, 21, 63, 70, 84, 78, 0, 48, 53, 68, 94, 0, 40, 88}, + {92, 12, 93, 12, 17, 85, 23, 7, 30, 56, 64, 34, 45, 73, 28, 87, 20, + 22, 7, 83, 59, 91, 26, 59, 5, 79, 26, 99, 79, 32, 52, 70, 11, 44, + 83, 28, 95, 72, 1, 91, 27, 65, 25, 38, 4, 19, 24, 24, 8, 99, 73, + 67, 89, 99, 25, 60, 77, 18, 24, 21, 16, 42, 58, 27, 53, 6, 55, 47, + 78, 56, 38, 71, 88, 29, 8, 58, 48, 99, 48, 56, 97, 20, 89, 52, 18, + 14, 78, 61, 99, 2, 48, 14, 44, 5, 42, 97, 11, 63, 10, 55}, + {19, 48, 25, 73, 77, 100, 30, 91, 99, 78, 13, 95, 98, 1, 12, 82, 82, + 91, 8, 80, 93, 22, 61, 2, 28, 2, 66, 5, 65, 76, 61, 50, 90, 86, + 22, 32, 52, 52, 22, 50, 96, 1, 10, 59, 70, 90, 40, 51, 80, 14, 98, + 38, 37, 58, 40, 31, 60, 72, 2, 91, 47, 63, 7, 2, 15, 29, 34, 67, + 48, 23, 83, 9, 24, 59, 69, 94, 48, 8, 11, 27, 90, 8, 31, 93, 32, + 38, 90, 58, 9, 92, 48, 23, 55, 55, 25, 36, 51, 60, 69, 65}, + {83, 51, 74, 73, 76, 42, 67, 24, 17, 44, 17, 73, 18, 49, 65, 50, 87, + 54, 7, 62, 11, 21, 85, 32, 77, 10, 68, 94, 70, 36, 24, 52, 53, 98, + 24, 96, 6, 57, 86, 90, 67, 2, 62, 85, 17, 26, 34, 70, 46, 41, 32, + 23, 63, 16, 56, 5, 26, 23, 65, 62, 26, 89, 80, 45, 52, 71, 6, 58, + 27, 92, 47, 61, 61, 75, 45, 78, 67, 46, 14, 12, 53, 46, 36, 82, 28, + 58, 87, 21, 47, 17, 83, 73, 72, 63, 85, 24, 33, 91, 48, 26}, + {49, 62, 53, 9, 36, 99, 53, 3, 10, 67, 82, 63, 79, 84, 45, 7, 41, + 98, 95, 89, 82, 43, 27, 53, 5, 78, 77, 4, 69, 25, 98, 17, 53, 16, + 93, 89, 81, 45, 58, 91, 12, 40, 54, 91, 90, 65, 64, 31, 62, 58, 86, + 43, 1, 12, 63, 73, 91, 39, 44, 25, 30, 7, 8, 83, 23, 0, 38, 4, + 45, 96, 61, 23, 1, 14, 81, 92, 45, 44, 89, 74, 69, 74, 83, 36, 52, + 45, 75, 8, 85, 18, 100, 81, 92, 7, 30, 82, 74, 34, 52, 86}, + {96, 12, 8, 98, 94, 89, 55, 38, 100, 43, 11, 68, 83, 95, 3, 0, 39, + 78, 9, 90, 63, 8, 37, 20, 83, 67, 1, 56, 67, 53, 7, 62, 66, 16, + 25, 25, 71, 80, 63, 70, 89, 75, 3, 37, 35, 6, 38, 74, 51, 47, 30, + 80, 21, 67, 100, 3, 100, 68, 26, 66, 87, 33, 27, 52, 15, 53, 43, 53, + 99, 6, 22, 88, 47, 26, 24, 82, 99, 28, 21, 15, 75, 51, 95, 63, 84, + 61, 66, 83, 28, 58, 14, 14, 58, 42, 33, 39, 61, 76, 92, 25}, + {48, 14, 79, 95, 6, 70, 76, 4, 98, 98, 87, 39, 14, 81, 1, 99, 7, + 33, 81, 1, 92, 96, 16, 15, 3, 15, 54, 30, 57, 12, 55, 5, 93, 0, + 100, 99, 70, 42, 69, 67, 39, 21, 5, 53, 2, 6, 51, 76, 40, 99, 78, + 98, 60, 60, 79, 63, 75, 99, 59, 98, 10, 80, 2, 2, 80, 69, 67, 49, + 10, 2, 16, 49, 23, 88, 68, 92, 95, 86, 68, 0, 84, 11, 64, 43, 71, + 42, 72, 45, 40, 97, 42, 17, 76, 11, 86, 56, 80, 19, 4, 90}, + {88, 87, 4, 77, 75, 72, 69, 35, 23, 2, 35, 6, 80, 99, 15, 50, 6, + 53, 61, 46, 49, 69, 29, 25, 80, 15, 47, 25, 34, 51, 14, 21, 38, 85, + 98, 79, 57, 32, 13, 46, 0, 48, 53, 80, 12, 34, 29, 18, 54, 56, 30, + 2, 25, 60, 94, 4, 41, 40, 30, 75, 58, 10, 62, 62, 96, 59, 40, 18, + 58, 53, 64, 24, 67, 83, 4, 79, 17, 100, 63, 37, 56, 93, 39, 81, 18, + 100, 51, 59, 5, 81, 100, 63, 58, 61, 24, 53, 87, 64, 37, 10}, + {83, 67, 34, 49, 50, 38, 27, 33, 4, 56, 70, 60, 15, 75, 6, 33, 40, + 57, 59, 46, 4, 24, 75, 62, 86, 100, 81, 38, 29, 17, 48, 79, 84, 48, + 27, 100, 87, 21, 32, 57, 77, 68, 16, 92, 9, 22, 92, 49, 79, 16, 95, + 83, 40, 70, 10, 25, 35, 91, 29, 30, 74, 43, 8, 24, 92, 2, 23, 44, + 23, 22, 0, 66, 56, 16, 58, 65, 4, 15, 14, 49, 31, 75, 32, 71, 10, + 8, 63, 45, 100, 92, 42, 73, 1, 50, 97, 93, 18, 87, 36, 41}, + {75, 36, 7, 30, 18, 31, 96, 22, 12, 76, 71, 43, 50, 69, 80, 61, 78, + 42, 72, 43, 0, 13, 15, 68, 30, 79, 60, 48, 31, 62, 56, 5, 98, 29, + 1, 82, 26, 97, 3, 38, 72, 40, 81, 89, 76, 26, 15, 53, 35, 87, 96, + 1, 67, 77, 69, 97, 21, 28, 10, 18, 90, 32, 23, 53, 61, 25, 34, 87, + 88, 3, 91, 26, 9, 37, 81, 85, 64, 96, 3, 99, 82, 65, 100, 48, 42, + 68, 10, 29, 62, 88, 48, 17, 19, 37, 70, 47, 28, 70, 100, 16}, + {73, 91, 8, 82, 94, 89, 33, 57, 84, 36, 21, 31, 1, 87, 46, 9, 20, + 56, 4, 82, 9, 52, 99, 96, 56, 34, 8, 84, 3, 7, 66, 42, 64, 74, + 24, 58, 28, 23, 81, 11, 59, 2, 9, 26, 55, 55, 1, 76, 77, 6, 23, + 87, 24, 89, 82, 80, 22, 90, 30, 93, 63, 96, 34, 27, 36, 24, 51, 30, + 47, 98, 8, 73, 100, 17, 99, 21, 72, 0, 97, 48, 73, 86, 34, 97, 74, + 82, 43, 63, 37, 73, 55, 0, 34, 55, 94, 36, 80, 10, 67, 93}, + {7, 75, 65, 74, 92, 64, 95, 63, 30, 57, 77, 2, 42, 11, 65, 16, 59, + 7, 45, 97, 46, 66, 63, 81, 20, 56, 83, 66, 32, 49, 59, 39, 90, 23, + 12, 81, 53, 73, 9, 49, 29, 87, 17, 72, 64, 83, 54, 89, 90, 65, 85, + 36, 30, 13, 83, 16, 35, 65, 83, 67, 14, 7, 73, 70, 97, 85, 51, 16, + 24, 26, 65, 53, 79, 83, 91, 8, 65, 10, 98, 20, 41, 48, 22, 71, 62, + 4, 54, 63, 36, 36, 30, 16, 9, 2, 86, 5, 53, 36, 88, 77}, + {29, 53, 97, 74, 1, 53, 83, 32, 30, 46, 52, 71, 94, 41, 42, 21, 45, + 62, 85, 81, 98, 81, 97, 73, 83, 83, 44, 1, 85, 32, 45, 80, 85, 41, + 54, 52, 60, 2, 84, 90, 48, 1, 61, 7, 42, 69, 96, 54, 30, 46, 0, + 94, 26, 64, 32, 75, 46, 76, 42, 97, 7, 87, 43, 58, 94, 97, 9, 54, + 99, 59, 43, 12, 61, 70, 19, 69, 4, 14, 22, 0, 26, 23, 60, 52, 53, + 92, 93, 65, 68, 35, 61, 75, 88, 70, 33, 82, 66, 8, 35, 30}, + {68, 44, 8, 95, 81, 28, 63, 85, 8, 52, 86, 35, 41, 11, 53, 94, 3, + 12, 58, 71, 13, 85, 11, 0, 55, 44, 82, 87, 19, 83, 84, 87, 27, 92, + 81, 7, 86, 9, 58, 61, 27, 9, 62, 68, 21, 81, 61, 24, 93, 85, 61, + 72, 70, 72, 73, 91, 16, 20, 77, 35, 3, 26, 88, 97, 18, 34, 3, 70, + 9, 27, 30, 37, 37, 92, 4, 24, 73, 32, 48, 31, 83, 8, 3, 52, 80, + 42, 8, 62, 62, 52, 63, 65, 78, 16, 27, 62, 50, 30, 32, 26}, + {24, 62, 63, 27, 20, 67, 51, 59, 65, 65, 90, 48, 73, 93, 66, 18, 0, + 75, 47, 63, 26, 76, 94, 3, 59, 21, 66, 75, 17, 64, 0, 41, 25, 63, + 68, 11, 97, 85, 70, 61, 49, 60, 8, 88, 18, 41, 6, 19, 15, 19, 48, + 41, 61, 41, 10, 19, 62, 42, 95, 46, 5, 95, 53, 98, 58, 21, 8, 20, + 5, 79, 81, 21, 4, 56, 8, 89, 97, 81, 74, 11, 100, 21, 18, 61, 29, + 95, 46, 57, 37, 40, 2, 42, 1, 56, 5, 59, 43, 14, 79, 14}, + {59, 25, 35, 29, 81, 44, 84, 43, 24, 58, 20, 91, 45, 38, 17, 74, 100, + 63, 31, 36, 3, 33, 44, 71, 55, 50, 96, 98, 30, 40, 12, 55, 65, 13, + 50, 12, 57, 33, 55, 48, 91, 42, 38, 36, 46, 55, 76, 45, 17, 6, 81, + 87, 6, 25, 57, 61, 41, 52, 25, 37, 92, 3, 92, 23, 16, 7, 35, 74, + 40, 56, 21, 98, 98, 59, 100, 44, 80, 75, 89, 97, 82, 36, 50, 54, 27, + 6, 14, 68, 25, 5, 4, 83, 8, 62, 5, 25, 69, 40, 65, 75}, + {63, 52, 72, 60, 10, 71, 70, 56, 12, 59, 52, 94, 95, 68, 13, 21, 41, + 94, 55, 66, 100, 25, 48, 7, 53, 54, 99, 88, 60, 63, 62, 22, 14, 34, + 49, 91, 71, 18, 46, 83, 77, 65, 42, 37, 32, 55, 24, 39, 15, 45, 4, + 14, 36, 19, 21, 89, 39, 87, 76, 99, 49, 4, 88, 64, 4, 36, 54, 75, + 20, 67, 24, 64, 31, 32, 0, 29, 54, 92, 69, 69, 36, 39, 83, 39, 58, + 70, 27, 63, 56, 70, 28, 5, 74, 15, 35, 78, 17, 55, 18, 37}, + {88, 8, 0, 85, 41, 68, 14, 95, 59, 49, 63, 61, 54, 11, 66, 79, 81, + 94, 41, 3, 29, 69, 75, 69, 50, 9, 46, 33, 30, 30, 71, 18, 39, 37, + 2, 80, 4, 83, 40, 29, 98, 2, 57, 52, 13, 22, 30, 60, 82, 71, 29, + 10, 6, 3, 79, 22, 79, 91, 56, 76, 21, 26, 94, 26, 63, 62, 72, 34, + 45, 11, 29, 42, 13, 86, 94, 93, 75, 90, 18, 56, 27, 48, 33, 33, 17, + 78, 55, 63, 69, 10, 38, 56, 2, 31, 48, 32, 93, 19, 32, 3}, + {30, 61, 46, 43, 13, 5, 1, 88, 96, 86, 9, 89, 100, 42, 21, 17, 20, + 42, 80, 55, 19, 17, 10, 88, 14, 58, 19, 6, 77, 17, 77, 73, 79, 22, + 15, 58, 94, 83, 45, 55, 68, 20, 43, 68, 63, 30, 51, 49, 39, 97, 3, + 58, 13, 80, 45, 27, 3, 31, 100, 80, 48, 76, 52, 93, 64, 33, 50, 24, + 82, 61, 45, 15, 82, 89, 49, 10, 85, 100, 59, 23, 96, 28, 81, 75, 7, + 93, 68, 10, 90, 34, 56, 3, 76, 74, 97, 6, 73, 12, 30, 20}, + {40, 75, 35, 88, 29, 85, 64, 14, 50, 22, 37, 12, 16, 85, 87, 23, 77, + 21, 100, 66, 55, 21, 35, 30, 95, 31, 2, 33, 10, 32, 53, 16, 74, 54, + 70, 69, 38, 33, 83, 55, 55, 87, 67, 71, 71, 19, 60, 13, 40, 25, 45, + 61, 46, 80, 58, 6, 78, 60, 39, 88, 93, 58, 70, 32, 11, 39, 0, 16, + 72, 50, 71, 93, 36, 37, 29, 6, 56, 55, 19, 63, 80, 64, 23, 25, 43, + 81, 98, 87, 41, 2, 40, 100, 60, 9, 31, 37, 14, 98, 53, 86}, + {47, 90, 44, 83, 26, 73, 55, 49, 27, 40, 11, 73, 70, 0, 64, 13, 82, + 61, 66, 89, 29, 6, 88, 89, 15, 85, 93, 30, 82, 11, 82, 96, 1, 26, + 78, 27, 65, 100, 42, 93, 39, 53, 31, 9, 54, 96, 89, 1, 22, 54, 90, + 52, 60, 43, 6, 42, 27, 99, 72, 75, 10, 19, 70, 11, 45, 14, 4, 10, + 13, 47, 69, 52, 66, 100, 27, 86, 61, 15, 53, 84, 36, 42, 35, 96, 85, + 41, 37, 78, 40, 75, 53, 16, 95, 22, 94, 5, 36, 98, 15, 15}, + {10, 50, 34, 77, 16, 61, 28, 77, 43, 82, 60, 79, 90, 95, 74, 41, 2, + 78, 18, 8, 18, 71, 24, 12, 60, 17, 85, 62, 81, 66, 78, 92, 16, 11, + 34, 32, 38, 28, 75, 81, 9, 1, 59, 66, 62, 100, 6, 64, 43, 24, 72, + 61, 62, 62, 40, 21, 79, 24, 49, 26, 90, 26, 84, 72, 3, 84, 70, 8, + 11, 45, 89, 88, 46, 14, 53, 74, 80, 59, 38, 89, 83, 9, 15, 10, 38, + 55, 31, 83, 45, 81, 8, 1, 73, 92, 73, 43, 75, 9, 51, 53}, + {54, 5, 40, 66, 86, 59, 39, 31, 17, 43, 19, 66, 19, 1, 77, 57, 22, + 74, 39, 68, 20, 14, 35, 60, 5, 7, 2, 47, 16, 19, 66, 36, 91, 5, + 68, 43, 30, 74, 40, 47, 83, 26, 79, 1, 27, 21, 24, 49, 96, 64, 83, + 82, 78, 17, 41, 49, 92, 9, 62, 74, 28, 27, 77, 86, 99, 44, 95, 28, + 84, 34, 41, 33, 60, 20, 34, 87, 41, 59, 36, 2, 89, 85, 85, 32, 2, + 25, 47, 94, 35, 9, 67, 29, 2, 43, 81, 1, 54, 75, 96, 3}, + {9, 37, 36, 35, 23, 37, 22, 30, 62, 24, 33, 50, 8, 84, 48, 77, 8, + 95, 70, 9, 70, 37, 5, 73, 46, 86, 74, 100, 27, 35, 70, 2, 72, 5, + 37, 95, 42, 25, 25, 3, 49, 24, 19, 24, 7, 67, 0, 82, 28, 71, 92, + 98, 74, 63, 70, 86, 14, 9, 52, 41, 45, 21, 43, 83, 93, 47, 44, 35, + 72, 35, 4, 88, 59, 91, 11, 32, 57, 11, 13, 51, 48, 71, 49, 88, 33, + 85, 40, 48, 61, 92, 55, 5, 79, 65, 54, 71, 11, 98, 72, 83}, + {32, 43, 70, 57, 33, 47, 89, 56, 25, 69, 7, 73, 39, 56, 27, 39, 6, + 67, 53, 67, 24, 74, 38, 2, 38, 93, 73, 49, 56, 11, 99, 89, 54, 34, + 11, 87, 48, 67, 42, 73, 35, 49, 11, 40, 71, 4, 45, 78, 71, 98, 10, + 95, 38, 49, 63, 76, 41, 36, 92, 97, 47, 56, 51, 0, 56, 63, 53, 3, + 29, 95, 76, 30, 44, 54, 70, 81, 58, 82, 58, 96, 45, 69, 56, 83, 84, + 19, 59, 24, 21, 16, 87, 34, 72, 4, 0, 27, 33, 53, 31, 28}, + {47, 73, 58, 57, 26, 94, 38, 85, 75, 62, 80, 87, 97, 35, 69, 80, 20, + 27, 3, 41, 43, 57, 75, 81, 27, 75, 8, 60, 27, 5, 88, 41, 78, 11, + 98, 71, 71, 1, 55, 12, 64, 0, 99, 60, 1, 67, 40, 22, 61, 9, 63, + 70, 32, 4, 51, 59, 79, 25, 18, 73, 30, 72, 13, 7, 49, 77, 78, 87, + 79, 99, 99, 42, 65, 63, 68, 67, 96, 7, 55, 56, 84, 84, 93, 15, 88, + 43, 75, 33, 34, 59, 72, 64, 98, 85, 37, 12, 27, 82, 99, 5}, + {80, 63, 13, 11, 92, 48, 44, 88, 55, 99, 9, 4, 48, 1, 20, 2, 10, + 61, 1, 44, 86, 73, 74, 83, 23, 11, 62, 50, 93, 26, 22, 38, 90, 1, + 15, 47, 49, 59, 34, 71, 23, 44, 75, 38, 11, 61, 40, 22, 21, 41, 32, + 7, 13, 6, 56, 36, 84, 17, 52, 76, 44, 74, 80, 100, 42, 96, 46, 91, + 20, 81, 27, 10, 91, 2, 48, 1, 29, 88, 90, 51, 95, 22, 58, 7, 95, + 13, 9, 78, 31, 61, 19, 41, 1, 65, 40, 43, 26, 86, 100, 47}, + {32, 94, 23, 22, 62, 71, 91, 91, 58, 80, 41, 18, 68, 65, 25, 62, 79, + 0, 5, 76, 27, 24, 83, 28, 56, 22, 37, 82, 74, 3, 95, 6, 97, 17, + 95, 24, 54, 85, 14, 78, 31, 56, 96, 99, 20, 87, 27, 65, 87, 32, 6, + 14, 23, 89, 8, 45, 77, 12, 26, 51, 82, 88, 23, 44, 71, 17, 68, 25, + 69, 82, 2, 100, 3, 99, 64, 91, 85, 91, 21, 38, 90, 28, 52, 79, 83, + 26, 23, 60, 38, 49, 10, 86, 2, 33, 29, 74, 16, 97, 65, 51}, + {45, 67, 16, 48, 31, 81, 4, 16, 37, 26, 20, 93, 20, 38, 71, 2, 64, + 94, 62, 69, 9, 72, 54, 11, 71, 84, 51, 54, 80, 15, 4, 24, 83, 88, + 39, 80, 68, 43, 62, 71, 35, 82, 64, 55, 19, 0, 58, 84, 95, 19, 18, + 3, 58, 72, 81, 95, 55, 32, 14, 1, 47, 19, 92, 96, 6, 30, 76, 40, + 40, 37, 77, 75, 19, 6, 30, 38, 7, 54, 88, 68, 73, 5, 71, 97, 78, + 51, 58, 99, 49, 72, 66, 97, 57, 58, 58, 63, 54, 33, 69, 60}, + {37, 12, 1, 56, 18, 31, 60, 92, 51, 14, 59, 90, 19, 29, 87, 63, 47, + 10, 28, 96, 82, 94, 58, 39, 17, 16, 68, 38, 15, 3, 64, 52, 15, 65, + 74, 100, 62, 0, 92, 12, 14, 50, 2, 33, 46, 55, 63, 59, 65, 91, 20, + 46, 50, 79, 51, 34, 61, 19, 72, 76, 89, 35, 95, 3, 67, 68, 69, 28, + 68, 60, 41, 82, 77, 43, 82, 22, 98, 44, 47, 28, 0, 67, 74, 50, 11, + 92, 84, 72, 77, 21, 14, 65, 23, 8, 34, 90, 42, 2, 84, 10}, + {63, 24, 58, 5, 33, 5, 94, 97, 15, 40, 24, 15, 6, 65, 32, 18, 56, + 82, 56, 32, 70, 70, 97, 93, 78, 30, 48, 87, 99, 31, 97, 27, 22, 20, + 32, 55, 93, 25, 52, 7, 31, 42, 90, 4, 6, 88, 89, 62, 35, 44, 60, + 4, 81, 56, 63, 24, 52, 10, 10, 17, 8, 73, 44, 30, 94, 77, 51, 86, + 68, 69, 59, 66, 11, 48, 70, 84, 1, 58, 12, 37, 68, 72, 41, 48, 95, + 71, 73, 12, 47, 83, 29, 55, 56, 74, 51, 15, 16, 2, 67, 50}, + {71, 92, 15, 82, 6, 51, 66, 7, 75, 44, 44, 43, 15, 52, 57, 9, 22, + 96, 89, 35, 79, 17, 91, 0, 57, 7, 82, 73, 9, 14, 90, 81, 5, 4, + 28, 11, 22, 60, 19, 97, 3, 29, 5, 86, 81, 63, 61, 69, 58, 49, 71, + 2, 67, 27, 69, 90, 34, 50, 29, 44, 64, 18, 91, 36, 89, 85, 47, 10, + 45, 32, 7, 14, 62, 12, 100, 8, 41, 61, 44, 100, 9, 14, 68, 42, 41, + 37, 99, 75, 87, 27, 85, 17, 45, 75, 53, 33, 26, 66, 10, 71}, + {99, 84, 85, 60, 62, 51, 68, 3, 11, 11, 69, 87, 92, 36, 96, 32, 39, + 94, 74, 93, 87, 58, 9, 31, 100, 28, 30, 25, 94, 6, 62, 92, 90, 12, + 17, 52, 29, 86, 55, 40, 63, 90, 94, 21, 92, 55, 53, 31, 14, 93, 23, + 0, 17, 99, 98, 16, 26, 27, 7, 86, 34, 35, 78, 90, 13, 95, 41, 43, + 46, 62, 49, 76, 51, 42, 97, 9, 63, 15, 40, 77, 8, 63, 43, 25, 61, + 40, 7, 53, 68, 81, 38, 68, 82, 82, 57, 95, 43, 65, 37, 55}, + {93, 87, 30, 10, 95, 93, 19, 58, 75, 59, 0, 83, 88, 44, 74, 14, 50, + 47, 67, 17, 94, 71, 51, 75, 53, 75, 69, 96, 5, 73, 16, 98, 59, 13, + 7, 19, 5, 93, 43, 80, 17, 44, 28, 4, 54, 68, 18, 3, 14, 51, 88, + 7, 22, 4, 48, 41, 45, 17, 2, 50, 90, 18, 14, 14, 31, 88, 33, 3, + 81, 77, 49, 98, 87, 44, 2, 6, 11, 87, 76, 93, 4, 63, 66, 26, 34, + 14, 33, 79, 98, 35, 29, 53, 19, 43, 67, 51, 30, 66, 20, 77}, + {8, 69, 75, 61, 79, 43, 33, 91, 96, 9, 49, 100, 38, 14, 25, 72, 28, + 58, 51, 92, 59, 46, 44, 79, 55, 77, 96, 51, 9, 15, 28, 17, 50, 69, + 45, 29, 11, 78, 86, 6, 53, 34, 73, 92, 48, 98, 29, 43, 22, 46, 34, + 47, 92, 79, 25, 12, 55, 87, 64, 64, 68, 58, 48, 18, 93, 59, 13, 70, + 2, 99, 76, 56, 32, 14, 13, 46, 12, 42, 89, 0, 89, 23, 13, 46, 1, + 5, 59, 22, 92, 89, 53, 60, 12, 67, 44, 4, 92, 57, 74, 94}, + {55, 15, 15, 53, 30, 28, 99, 8, 71, 88, 75, 59, 77, 88, 4, 44, 93, + 29, 66, 51, 17, 85, 10, 96, 17, 54, 100, 8, 77, 73, 2, 31, 89, 17, + 50, 85, 46, 48, 93, 83, 35, 67, 7, 11, 54, 78, 21, 13, 7, 88, 64, + 91, 38, 74, 87, 56, 94, 86, 64, 70, 25, 32, 67, 80, 50, 16, 64, 62, + 30, 56, 10, 32, 89, 17, 9, 8, 95, 31, 21, 68, 18, 85, 59, 22, 24, + 11, 78, 84, 97, 42, 19, 88, 40, 86, 67, 90, 68, 30, 17, 99}, + {52, 27, 30, 40, 44, 5, 49, 5, 36, 70, 73, 20, 21, 31, 43, 11, 42, + 20, 96, 5, 28, 14, 93, 69, 67, 26, 24, 34, 56, 8, 99, 75, 35, 95, + 14, 46, 0, 29, 51, 36, 66, 23, 57, 87, 21, 100, 98, 29, 86, 59, 0, + 81, 74, 60, 15, 40, 86, 39, 40, 7, 47, 5, 82, 49, 100, 63, 95, 66, + 92, 11, 2, 57, 0, 25, 9, 21, 91, 74, 17, 76, 32, 17, 22, 72, 43, + 37, 78, 28, 77, 18, 36, 90, 90, 84, 38, 89, 46, 99, 21, 4}, + {9, 90, 27, 10, 14, 3, 98, 4, 77, 14, 46, 75, 99, 35, 47, 41, 72, + 24, 70, 48, 8, 72, 4, 98, 55, 42, 53, 68, 7, 74, 72, 16, 63, 99, + 26, 43, 1, 24, 13, 44, 4, 25, 19, 2, 60, 32, 10, 32, 22, 80, 46, + 98, 17, 50, 95, 38, 59, 13, 5, 66, 87, 77, 48, 15, 42, 41, 58, 9, + 31, 71, 54, 35, 97, 39, 4, 56, 37, 14, 88, 59, 60, 0, 56, 77, 50, + 17, 81, 75, 30, 87, 6, 84, 29, 55, 99, 37, 96, 57, 47, 26}, + {94, 67, 27, 56, 5, 98, 12, 8, 11, 66, 67, 37, 66, 90, 80, 83, 6, + 61, 23, 2, 47, 30, 86, 42, 51, 51, 80, 46, 74, 26, 38, 67, 59, 31, + 23, 64, 29, 1, 38, 6, 33, 4, 44, 100, 60, 90, 48, 32, 50, 71, 1, + 63, 67, 87, 5, 17, 3, 51, 29, 77, 77, 33, 10, 35, 65, 100, 65, 60, + 0, 2, 32, 33, 73, 42, 99, 100, 32, 12, 31, 48, 84, 99, 11, 50, 86, + 83, 34, 55, 33, 63, 32, 76, 97, 8, 77, 27, 7, 7, 53, 74}, + {76, 85, 73, 14, 27, 72, 13, 59, 50, 11, 73, 33, 9, 84, 50, 61, 32, + 84, 16, 31, 12, 14, 6, 8, 89, 49, 1, 96, 56, 54, 35, 31, 39, 7, + 46, 32, 45, 59, 57, 96, 36, 29, 95, 46, 80, 10, 73, 11, 94, 89, 9, + 73, 69, 15, 47, 57, 31, 49, 18, 87, 69, 53, 18, 74, 27, 30, 5, 38, + 55, 28, 33, 92, 58, 95, 3, 37, 4, 76, 14, 65, 31, 23, 37, 66, 5, + 50, 23, 36, 99, 41, 22, 68, 61, 6, 7, 88, 2, 13, 92, 58}, + {41, 92, 15, 65, 86, 18, 1, 56, 60, 83, 87, 57, 5, 90, 23, 10, 40, + 12, 12, 38, 19, 35, 72, 80, 7, 80, 33, 10, 59, 25, 34, 66, 16, 49, + 31, 68, 33, 99, 23, 59, 47, 10, 16, 53, 100, 5, 29, 39, 17, 42, 44, + 2, 43, 82, 49, 16, 27, 82, 93, 86, 73, 26, 18, 55, 75, 49, 89, 7, + 13, 79, 33, 61, 55, 15, 80, 20, 20, 75, 60, 3, 83, 70, 5, 92, 17, + 54, 8, 45, 2, 0, 30, 41, 27, 14, 63, 68, 29, 51, 42, 43}, + {96, 75, 70, 50, 90, 49, 71, 9, 90, 97, 79, 73, 66, 50, 64, 83, 4, + 72, 27, 73, 39, 24, 80, 32, 4, 42, 100, 34, 60, 41, 43, 55, 82, 12, + 5, 71, 27, 42, 46, 16, 38, 24, 89, 3, 41, 19, 52, 11, 57, 46, 84, + 96, 36, 29, 27, 40, 72, 94, 40, 98, 0, 83, 18, 83, 95, 90, 53, 88, + 31, 66, 71, 69, 56, 59, 38, 97, 44, 57, 7, 1, 2, 57, 97, 4, 87, + 91, 10, 24, 84, 51, 21, 84, 33, 39, 66, 95, 96, 86, 82, 26}, + {51, 52, 96, 73, 78, 33, 70, 21, 90, 77, 89, 58, 0, 86, 28, 87, 42, + 39, 10, 25, 56, 98, 75, 89, 2, 7, 49, 98, 59, 98, 24, 76, 15, 86, + 48, 59, 18, 17, 81, 75, 61, 69, 99, 61, 20, 27, 13, 62, 32, 90, 53, + 88, 87, 95, 42, 89, 1, 58, 53, 60, 55, 43, 1, 70, 28, 49, 29, 12, + 33, 76, 53, 60, 10, 52, 87, 98, 45, 100, 25, 43, 89, 79, 97, 41, 73, + 4, 96, 40, 62, 48, 66, 16, 91, 67, 53, 85, 82, 48, 98, 14}, + {90, 50, 74, 66, 68, 26, 63, 12, 25, 89, 55, 80, 33, 17, 20, 72, 22, + 83, 11, 84, 30, 77, 67, 88, 9, 86, 72, 91, 33, 35, 72, 89, 86, 11, + 54, 53, 38, 17, 32, 29, 72, 53, 76, 71, 71, 62, 42, 93, 44, 19, 76, + 41, 62, 42, 28, 71, 27, 66, 27, 26, 1, 99, 14, 87, 10, 35, 5, 14, + 52, 37, 43, 90, 91, 18, 60, 27, 81, 68, 19, 24, 87, 95, 31, 48, 3, + 59, 18, 97, 92, 11, 90, 93, 10, 70, 45, 20, 4, 16, 34, 22}, + {54, 43, 11, 10, 62, 37, 37, 8, 4, 22, 99, 57, 83, 30, 4, 86, 55, + 89, 49, 46, 0, 38, 38, 77, 74, 49, 97, 79, 66, 97, 0, 86, 5, 79, + 62, 33, 15, 65, 41, 87, 87, 6, 9, 35, 2, 14, 21, 57, 69, 36, 3, + 35, 40, 7, 11, 13, 23, 74, 92, 55, 36, 93, 40, 42, 37, 68, 75, 18, + 32, 83, 71, 85, 89, 81, 19, 91, 61, 6, 13, 29, 8, 16, 65, 48, 91, + 76, 62, 80, 16, 19, 34, 52, 78, 74, 94, 14, 7, 69, 33, 5}, + {17, 3, 56, 5, 84, 41, 62, 44, 48, 75, 40, 56, 58, 71, 71, 14, 12, + 99, 94, 28, 17, 27, 81, 96, 67, 74, 76, 74, 8, 75, 45, 25, 79, 0, + 97, 28, 41, 58, 39, 55, 100, 45, 11, 23, 15, 48, 37, 27, 46, 97, 56, + 63, 90, 36, 24, 56, 76, 0, 96, 85, 41, 40, 9, 19, 6, 6, 14, 47, + 30, 19, 2, 96, 64, 80, 18, 45, 27, 21, 72, 39, 17, 94, 1, 6, 96, + 93, 28, 72, 59, 90, 56, 100, 96, 31, 86, 1, 3, 66, 15, 0}, + {85, 17, 96, 14, 63, 81, 59, 90, 1, 97, 28, 19, 57, 96, 92, 52, 54, + 87, 23, 12, 76, 45, 79, 72, 43, 64, 39, 46, 29, 54, 12, 80, 37, 8, + 60, 100, 89, 85, 55, 56, 47, 49, 75, 3, 45, 33, 56, 99, 19, 45, 78, + 61, 91, 56, 99, 33, 86, 4, 45, 81, 58, 58, 60, 96, 32, 19, 61, 87, + 70, 16, 42, 16, 65, 84, 20, 76, 83, 42, 41, 68, 87, 18, 28, 77, 40, + 94, 76, 25, 98, 88, 5, 21, 11, 31, 16, 43, 16, 44, 29, 86}, + {60, 37, 1, 24, 20, 88, 67, 69, 29, 7, 36, 16, 25, 65, 59, 65, 24, + 1, 56, 21, 89, 61, 42, 100, 58, 25, 8, 74, 69, 3, 25, 95, 40, 26, + 85, 27, 81, 51, 96, 9, 58, 32, 25, 49, 63, 51, 80, 87, 52, 35, 74, + 40, 62, 82, 5, 19, 73, 13, 59, 7, 16, 84, 1, 56, 77, 53, 49, 57, + 3, 45, 66, 28, 43, 58, 77, 72, 8, 57, 58, 60, 92, 98, 66, 20, 79, + 71, 39, 52, 84, 65, 59, 100, 48, 27, 21, 91, 80, 71, 47, 83}, + {82, 80, 10, 24, 37, 54, 62, 45, 10, 86, 71, 68, 83, 36, 88, 27, 6, + 94, 79, 56, 58, 4, 55, 72, 98, 42, 63, 77, 12, 9, 25, 60, 89, 2, + 50, 92, 56, 11, 2, 32, 97, 73, 100, 79, 75, 88, 73, 47, 47, 17, 2, + 4, 21, 23, 42, 18, 66, 4, 61, 44, 81, 87, 71, 35, 89, 20, 27, 10, + 32, 96, 42, 95, 69, 41, 40, 9, 95, 12, 23, 41, 29, 25, 11, 17, 15, + 54, 1, 47, 24, 63, 57, 4, 49, 27, 40, 3, 48, 33, 13, 46}, + {95, 55, 40, 29, 96, 46, 39, 57, 58, 62, 98, 54, 53, 76, 71, 68, 29, + 72, 81, 53, 34, 38, 24, 49, 65, 30, 52, 79, 29, 31, 24, 23, 86, 31, + 53, 48, 77, 92, 4, 1, 19, 68, 55, 72, 9, 92, 6, 38, 63, 87, 58, + 64, 24, 82, 79, 56, 78, 98, 34, 6, 28, 25, 29, 81, 22, 82, 28, 65, + 39, 99, 66, 58, 32, 87, 97, 42, 78, 2, 46, 7, 55, 3, 71, 46, 51, + 49, 1, 28, 46, 1, 34, 41, 26, 30, 21, 48, 11, 49, 80, 17}, + {13, 45, 75, 11, 99, 37, 53, 76, 39, 66, 83, 95, 35, 19, 40, 87, 69, + 7, 81, 81, 8, 82, 21, 35, 11, 42, 49, 89, 57, 95, 5, 36, 40, 47, + 14, 38, 84, 33, 80, 23, 99, 29, 84, 34, 48, 90, 87, 16, 97, 67, 64, + 71, 48, 51, 72, 59, 60, 88, 48, 83, 82, 53, 86, 21, 66, 100, 25, 50, + 32, 72, 39, 31, 0, 22, 65, 48, 78, 51, 31, 40, 84, 61, 10, 32, 11, + 83, 57, 71, 70, 4, 20, 51, 24, 5, 39, 90, 4, 30, 5, 36}, + {1, 44, 33, 68, 66, 64, 16, 9, 81, 13, 49, 65, 74, 60, 97, 51, 42, + 19, 89, 11, 24, 8, 28, 14, 13, 67, 70, 84, 64, 76, 86, 65, 19, 19, + 100, 52, 83, 15, 61, 64, 95, 10, 95, 34, 70, 57, 85, 78, 76, 73, 55, + 66, 47, 83, 80, 60, 16, 16, 9, 80, 92, 96, 10, 77, 14, 9, 28, 63, + 91, 56, 93, 85, 32, 87, 18, 68, 43, 70, 45, 19, 42, 66, 85, 56, 48, + 31, 82, 30, 47, 92, 9, 4, 87, 87, 81, 67, 96, 76, 29, 87}, + {31, 89, 37, 63, 75, 22, 97, 85, 92, 41, 70, 100, 73, 20, 55, 20, 51, + 37, 17, 64, 28, 93, 68, 81, 79, 15, 47, 75, 91, 42, 27, 88, 30, 64, + 16, 72, 52, 12, 56, 43, 19, 25, 43, 92, 45, 64, 78, 63, 0, 95, 26, + 95, 54, 61, 75, 32, 76, 88, 73, 32, 30, 66, 86, 26, 97, 1, 98, 48, + 80, 19, 92, 99, 10, 0, 56, 56, 64, 33, 85, 65, 95, 77, 59, 48, 3, + 0, 46, 45, 88, 19, 77, 84, 51, 62, 10, 47, 29, 74, 96, 8}, + {94, 53, 73, 3, 53, 28, 25, 16, 62, 76, 47, 22, 53, 73, 70, 22, 73, + 15, 68, 60, 0, 10, 44, 52, 73, 54, 65, 68, 94, 60, 77, 53, 79, 15, + 23, 31, 44, 48, 14, 72, 91, 27, 94, 9, 100, 29, 31, 72, 44, 99, 32, + 11, 9, 76, 29, 48, 96, 94, 15, 55, 20, 58, 8, 99, 40, 31, 97, 84, + 45, 77, 55, 35, 3, 14, 44, 3, 43, 42, 75, 87, 40, 73, 64, 15, 14, + 93, 29, 76, 53, 11, 31, 73, 69, 39, 37, 8, 70, 100, 58, 81}, + {76, 79, 16, 80, 93, 26, 49, 35, 68, 23, 89, 75, 63, 18, 56, 77, 11, + 86, 53, 30, 97, 84, 2, 31, 89, 5, 6, 24, 5, 64, 4, 47, 43, 87, + 26, 1, 13, 41, 3, 47, 65, 92, 88, 94, 9, 44, 70, 87, 29, 89, 16, + 25, 72, 85, 56, 26, 57, 62, 50, 62, 93, 55, 8, 1, 7, 1, 2, 20, + 42, 5, 34, 73, 63, 21, 66, 39, 31, 2, 25, 60, 91, 8, 51, 29, 59, + 74, 55, 15, 1, 5, 77, 94, 26, 52, 95, 33, 19, 64, 20, 27}, + {35, 54, 0, 99, 41, 32, 37, 73, 34, 28, 99, 92, 2, 50, 20, 62, 23, + 75, 77, 24, 46, 20, 85, 72, 38, 45, 72, 57, 75, 92, 84, 10, 11, 50, + 75, 18, 83, 78, 91, 83, 72, 56, 74, 75, 72, 60, 36, 95, 1, 79, 85, + 47, 99, 35, 19, 36, 47, 91, 59, 21, 48, 43, 31, 59, 59, 72, 77, 7, + 49, 34, 91, 21, 56, 30, 96, 27, 57, 98, 88, 58, 76, 38, 4, 41, 74, + 90, 43, 20, 46, 2, 7, 94, 11, 39, 18, 70, 77, 62, 78, 26}, + {62, 34, 47, 17, 30, 8, 10, 87, 72, 98, 44, 47, 1, 15, 54, 75, 4, + 98, 61, 17, 100, 69, 10, 10, 74, 96, 46, 50, 23, 23, 42, 85, 23, 55, + 68, 54, 29, 44, 40, 0, 41, 51, 14, 42, 66, 68, 84, 36, 31, 10, 53, + 30, 45, 30, 6, 85, 25, 53, 1, 14, 42, 43, 65, 66, 65, 32, 86, 94, + 42, 25, 95, 83, 42, 8, 91, 74, 42, 40, 10, 74, 51, 63, 70, 62, 59, + 77, 47, 50, 96, 48, 64, 3, 57, 28, 35, 21, 26, 20, 15, 68}, + {12, 9, 16, 54, 84, 74, 28, 92, 13, 4, 65, 30, 33, 1, 93, 93, 78, + 5, 42, 39, 53, 73, 42, 9, 0, 78, 98, 94, 98, 12, 61, 76, 88, 44, + 30, 37, 17, 24, 28, 97, 28, 60, 27, 61, 27, 86, 53, 4, 91, 62, 9, + 9, 34, 17, 85, 0, 61, 82, 94, 25, 60, 21, 0, 13, 65, 30, 50, 48, + 54, 45, 44, 48, 71, 37, 9, 98, 89, 62, 68, 45, 23, 43, 54, 23, 60, + 5, 24, 21, 87, 17, 12, 13, 4, 12, 26, 69, 9, 43, 83, 29}, + {88, 94, 78, 24, 30, 87, 21, 86, 14, 55, 30, 4, 98, 51, 27, 57, 56, + 17, 44, 8, 35, 56, 21, 39, 69, 14, 75, 44, 57, 23, 73, 10, 16, 50, + 34, 13, 2, 55, 99, 17, 9, 95, 21, 6, 45, 14, 29, 0, 32, 74, 9, + 33, 96, 97, 38, 30, 10, 79, 74, 33, 2, 47, 43, 85, 63, 77, 98, 66, + 98, 62, 83, 73, 57, 70, 45, 68, 50, 75, 69, 82, 14, 44, 81, 9, 6, + 19, 40, 84, 64, 80, 16, 66, 26, 60, 51, 90, 36, 14, 55, 34}, + {43, 3, 73, 100, 73, 18, 67, 89, 93, 1, 37, 6, 11, 17, 82, 85, 2, + 88, 68, 67, 68, 50, 99, 60, 9, 15, 49, 12, 30, 70, 12, 73, 73, 85, + 38, 11, 2, 71, 67, 95, 39, 3, 67, 16, 20, 15, 0, 90, 69, 34, 22, + 36, 85, 20, 63, 94, 36, 11, 72, 32, 48, 84, 71, 87, 69, 75, 65, 37, + 11, 31, 99, 50, 34, 31, 33, 20, 46, 100, 76, 15, 34, 98, 17, 18, 18, + 80, 78, 20, 58, 16, 18, 72, 100, 55, 58, 34, 96, 89, 72, 6}, + {86, 36, 23, 86, 67, 56, 6, 80, 21, 48, 61, 55, 46, 78, 39, 30, 24, + 84, 50, 48, 100, 34, 19, 65, 89, 43, 100, 84, 32, 37, 56, 17, 73, 79, + 3, 5, 0, 76, 85, 22, 23, 45, 43, 35, 23, 83, 65, 13, 32, 14, 61, + 31, 14, 46, 96, 2, 89, 61, 52, 87, 64, 8, 4, 2, 53, 74, 8, 54, + 15, 93, 42, 38, 4, 85, 40, 94, 67, 4, 6, 99, 86, 33, 96, 100, 79, + 58, 69, 33, 85, 20, 20, 49, 95, 91, 17, 14, 64, 25, 68, 79}, + {85, 76, 83, 89, 60, 22, 82, 94, 27, 54, 58, 79, 87, 54, 78, 31, 78, + 12, 64, 62, 100, 84, 10, 94, 74, 28, 7, 37, 19, 41, 82, 70, 16, 31, + 58, 43, 19, 5, 36, 12, 59, 94, 91, 11, 13, 69, 42, 91, 81, 6, 53, + 80, 90, 29, 40, 30, 23, 13, 33, 9, 21, 15, 79, 3, 12, 37, 46, 31, + 8, 48, 44, 34, 42, 34, 45, 21, 69, 54, 12, 16, 60, 65, 96, 15, 60, + 1, 45, 84, 82, 45, 93, 2, 60, 71, 5, 38, 74, 18, 69, 49}, + {66, 12, 83, 74, 47, 94, 96, 15, 47, 74, 31, 6, 4, 94, 89, 64, 61, + 100, 13, 42, 44, 72, 44, 70, 9, 16, 7, 83, 34, 77, 98, 66, 55, 80, + 40, 1, 74, 1, 84, 20, 41, 81, 94, 45, 40, 48, 8, 1, 47, 89, 43, + 58, 60, 54, 27, 69, 36, 1, 18, 70, 44, 15, 1, 99, 96, 7, 0, 35, + 75, 50, 21, 15, 30, 14, 60, 37, 62, 35, 38, 76, 23, 47, 33, 49, 67, + 60, 18, 2, 27, 2, 38, 71, 17, 6, 70, 79, 13, 36, 80, 89}, + {86, 1, 3, 82, 15, 30, 18, 44, 31, 22, 19, 54, 36, 52, 69, 69, 78, + 53, 72, 5, 55, 76, 42, 73, 82, 11, 17, 62, 47, 98, 50, 99, 99, 19, + 81, 80, 15, 65, 23, 46, 54, 8, 66, 56, 60, 35, 24, 4, 88, 62, 76, + 43, 38, 17, 82, 86, 29, 65, 47, 42, 62, 63, 41, 26, 49, 88, 6, 64, + 18, 96, 10, 72, 4, 42, 94, 64, 77, 18, 34, 31, 80, 9, 40, 84, 27, + 21, 70, 22, 86, 83, 64, 14, 46, 4, 40, 61, 92, 46, 24, 10}, + {42, 0, 48, 12, 9, 42, 76, 86, 26, 77, 83, 5, 86, 22, 56, 79, 43, + 92, 0, 96, 40, 65, 76, 52, 35, 15, 12, 94, 28, 3, 3, 36, 3, 17, + 48, 79, 25, 90, 65, 51, 66, 47, 23, 18, 36, 79, 97, 79, 36, 98, 40, + 76, 28, 15, 28, 63, 98, 40, 56, 25, 43, 25, 27, 13, 9, 75, 92, 34, + 30, 22, 86, 97, 36, 75, 81, 72, 19, 77, 16, 55, 40, 23, 97, 68, 4, + 24, 31, 1, 31, 53, 93, 40, 79, 19, 19, 88, 60, 78, 88, 91}, + {66, 39, 53, 1, 13, 33, 39, 32, 76, 22, 53, 16, 11, 16, 84, 15, 40, + 81, 17, 37, 34, 76, 44, 79, 96, 63, 32, 21, 6, 86, 11, 73, 25, 30, + 40, 4, 29, 46, 3, 5, 68, 56, 21, 79, 72, 71, 60, 79, 18, 77, 82, + 52, 53, 25, 97, 14, 55, 95, 35, 61, 80, 13, 33, 4, 9, 74, 9, 39, + 19, 12, 10, 53, 34, 98, 98, 73, 68, 57, 17, 52, 0, 99, 3, 19, 24, + 66, 100, 79, 60, 34, 39, 40, 13, 39, 44, 23, 79, 19, 28, 64}, + {98, 38, 16, 32, 35, 80, 71, 69, 36, 88, 21, 2, 86, 91, 21, 76, 57, + 87, 20, 83, 21, 26, 22, 0, 65, 33, 90, 9, 18, 17, 73, 16, 55, 55, + 14, 56, 34, 85, 92, 36, 38, 79, 5, 90, 35, 93, 66, 58, 80, 86, 41, + 67, 78, 29, 67, 8, 62, 57, 17, 47, 74, 90, 63, 96, 44, 43, 17, 44, + 27, 75, 47, 65, 53, 52, 54, 55, 10, 86, 12, 90, 38, 53, 56, 15, 49, + 23, 24, 77, 46, 41, 23, 19, 98, 86, 81, 7, 95, 65, 18, 21}, + {39, 31, 52, 59, 49, 73, 13, 59, 24, 25, 49, 62, 45, 4, 44, 60, 94, + 34, 36, 39, 41, 60, 25, 4, 11, 72, 12, 6, 36, 97, 94, 76, 27, 12, + 34, 76, 85, 13, 34, 75, 4, 83, 3, 49, 54, 47, 8, 47, 47, 11, 53, + 88, 71, 44, 59, 48, 15, 71, 54, 52, 67, 14, 27, 94, 26, 27, 69, 77, + 6, 69, 51, 10, 52, 54, 26, 72, 67, 0, 85, 80, 11, 37, 34, 48, 81, + 93, 97, 97, 29, 16, 14, 96, 30, 7, 55, 56, 34, 90, 99, 6}, + {58, 50, 16, 76, 70, 8, 47, 3, 9, 32, 49, 87, 69, 83, 35, 16, 75, + 98, 79, 3, 13, 93, 65, 44, 100, 86, 66, 100, 75, 65, 5, 33, 81, 88, + 75, 16, 97, 22, 86, 72, 54, 35, 58, 89, 17, 59, 71, 59, 56, 49, 28, + 70, 41, 60, 80, 40, 45, 11, 5, 20, 42, 10, 19, 22, 99, 94, 5, 61, + 82, 91, 32, 1, 25, 90, 57, 9, 49, 27, 34, 71, 43, 62, 40, 50, 21, + 86, 91, 33, 98, 62, 53, 39, 73, 38, 28, 37, 98, 33, 98, 80}, + {90, 29, 47, 82, 85, 3, 57, 100, 98, 91, 71, 40, 18, 77, 90, 6, 63, + 46, 39, 26, 8, 58, 31, 47, 96, 59, 84, 59, 58, 47, 38, 48, 76, 52, + 96, 26, 55, 52, 26, 52, 42, 63, 58, 26, 5, 48, 32, 68, 60, 37, 60, + 68, 95, 92, 14, 56, 16, 64, 15, 75, 10, 19, 89, 52, 71, 84, 79, 26, + 1, 71, 44, 43, 100, 2, 35, 4, 16, 68, 39, 76, 4, 99, 10, 100, 56, + 91, 21, 73, 55, 36, 13, 31, 56, 1, 84, 93, 51, 28, 85, 52}, + {65, 29, 61, 64, 98, 96, 68, 13, 29, 73, 55, 34, 38, 65, 100, 94, 56, + 87, 32, 77, 23, 45, 7, 45, 12, 91, 37, 29, 85, 22, 47, 49, 17, 74, + 12, 14, 70, 47, 94, 65, 86, 48, 99, 23, 13, 64, 84, 35, 51, 15, 11, + 40, 27, 18, 51, 5, 76, 88, 1, 26, 76, 48, 76, 59, 22, 54, 73, 58, + 67, 32, 22, 53, 81, 88, 76, 60, 17, 25, 95, 34, 7, 5, 40, 34, 90, + 91, 5, 31, 45, 6, 58, 20, 21, 33, 80, 9, 53, 18, 67, 20}, + {51, 55, 73, 31, 42, 14, 57, 26, 40, 51, 60, 13, 22, 0, 47, 78, 91, + 18, 9, 1, 92, 33, 22, 79, 32, 68, 88, 85, 86, 20, 71, 2, 75, 43, + 100, 84, 24, 56, 9, 30, 6, 35, 43, 95, 1, 56, 73, 59, 40, 48, 60, + 31, 81, 82, 9, 12, 15, 97, 63, 1, 83, 34, 70, 58, 43, 70, 41, 67, + 25, 16, 63, 99, 17, 5, 93, 19, 27, 31, 78, 68, 79, 37, 99, 59, 86, + 75, 37, 0, 37, 67, 68, 20, 0, 38, 78, 43, 7, 85, 77, 99}, + {67, 39, 97, 84, 11, 90, 2, 38, 20, 46, 5, 100, 50, 71, 24, 35, 45, + 28, 1, 82, 95, 36, 68, 61, 40, 11, 70, 47, 62, 46, 11, 28, 52, 8, + 79, 63, 98, 81, 67, 84, 94, 39, 49, 43, 9, 40, 78, 20, 68, 45, 68, + 28, 81, 36, 89, 20, 47, 58, 33, 9, 71, 45, 37, 22, 53, 82, 51, 16, + 29, 84, 100, 22, 22, 15, 65, 98, 55, 8, 17, 22, 19, 86, 16, 0, 21, + 4, 87, 34, 28, 20, 43, 99, 31, 47, 87, 50, 28, 3, 66, 57}, + {88, 31, 45, 76, 46, 9, 74, 0, 84, 91, 89, 3, 42, 4, 3, 63, 8, + 56, 98, 3, 76, 6, 1, 73, 53, 55, 22, 48, 58, 54, 71, 11, 86, 16, + 88, 98, 92, 61, 99, 76, 17, 53, 79, 60, 58, 48, 89, 32, 3, 52, 35, + 46, 59, 3, 18, 78, 24, 7, 92, 48, 61, 63, 60, 12, 79, 47, 10, 70, + 74, 75, 11, 91, 27, 90, 16, 51, 3, 5, 84, 74, 57, 85, 19, 15, 54, + 3, 60, 44, 10, 51, 93, 38, 13, 52, 50, 58, 65, 60, 28, 38}, + {34, 39, 95, 28, 96, 11, 79, 99, 16, 28, 38, 73, 80, 57, 55, 100, 27, + 14, 44, 3, 65, 36, 41, 79, 54, 92, 2, 18, 17, 30, 56, 18, 36, 50, + 46, 98, 27, 24, 62, 43, 19, 0, 83, 99, 23, 37, 98, 50, 51, 41, 20, + 82, 43, 61, 26, 97, 18, 29, 14, 2, 25, 36, 20, 61, 53, 66, 24, 80, + 56, 87, 90, 41, 87, 72, 39, 9, 8, 3, 26, 25, 44, 46, 73, 54, 73, + 100, 50, 58, 95, 31, 60, 19, 67, 80, 47, 86, 11, 71, 32, 33}, + {23, 21, 75, 9, 93, 80, 86, 67, 83, 11, 58, 94, 23, 30, 47, 96, 96, + 63, 19, 56, 94, 79, 42, 27, 24, 89, 12, 1, 25, 44, 35, 49, 65, 76, + 58, 23, 21, 9, 90, 4, 87, 13, 64, 9, 10, 77, 72, 72, 39, 91, 28, + 33, 70, 70, 60, 60, 24, 72, 62, 49, 83, 63, 64, 47, 4, 89, 37, 25, + 98, 26, 96, 85, 6, 25, 94, 16, 1, 31, 54, 41, 22, 48, 74, 58, 17, + 100, 17, 7, 71, 45, 57, 19, 74, 20, 67, 78, 75, 3, 70, 73}, + {96, 65, 57, 68, 57, 16, 50, 58, 14, 4, 99, 36, 52, 38, 60, 36, 37, + 43, 43, 75, 89, 66, 94, 62, 53, 60, 6, 27, 29, 76, 100, 92, 6, 22, + 59, 63, 5, 9, 21, 19, 13, 86, 21, 31, 24, 47, 67, 61, 90, 10, 35, + 44, 42, 29, 73, 95, 55, 79, 22, 51, 54, 88, 42, 26, 10, 0, 56, 82, + 9, 77, 67, 89, 28, 88, 20, 52, 34, 53, 80, 90, 29, 14, 34, 72, 9, + 6, 66, 65, 85, 54, 82, 4, 42, 23, 97, 18, 23, 52, 100, 100}, + {95, 66, 54, 23, 19, 40, 75, 19, 60, 20, 8, 89, 35, 42, 60, 10, 48, + 93, 41, 99, 46, 22, 69, 54, 45, 66, 38, 35, 17, 37, 0, 12, 69, 54, + 35, 54, 61, 76, 73, 20, 97, 48, 8, 98, 90, 35, 7, 4, 94, 15, 69, + 5, 37, 38, 60, 83, 3, 98, 84, 20, 1, 84, 99, 36, 3, 100, 57, 64, + 76, 96, 50, 38, 43, 25, 35, 100, 60, 8, 70, 53, 23, 38, 58, 27, 42, + 84, 76, 11, 48, 59, 99, 15, 8, 97, 51, 11, 97, 7, 42, 38}, + {70, 58, 76, 12, 83, 77, 11, 42, 51, 47, 61, 75, 86, 86, 68, 94, 69, + 43, 5, 16, 1, 3, 31, 9, 100, 49, 87, 62, 22, 95, 100, 92, 53, 41, + 71, 35, 17, 48, 44, 69, 96, 4, 9, 47, 56, 77, 40, 25, 86, 45, 7, + 87, 48, 5, 62, 14, 20, 48, 76, 8, 43, 76, 67, 62, 16, 37, 97, 0, + 85, 6, 35, 80, 78, 10, 26, 33, 53, 33, 24, 38, 78, 32, 24, 93, 3, + 52, 6, 90, 100, 48, 98, 8, 90, 64, 70, 6, 67, 33, 73, 52}, + {39, 7, 98, 16, 84, 91, 16, 36, 23, 40, 74, 67, 38, 64, 59, 41, 15, + 31, 97, 81, 80, 61, 56, 35, 24, 25, 41, 92, 24, 80, 9, 30, 53, 6, + 12, 36, 97, 28, 72, 86, 69, 11, 53, 6, 75, 78, 14, 56, 76, 10, 37, + 55, 37, 93, 56, 62, 84, 98, 19, 75, 43, 28, 4, 97, 0, 83, 32, 98, + 11, 71, 49, 80, 82, 1, 52, 23, 80, 66, 45, 55, 43, 48, 76, 80, 40, + 31, 7, 91, 95, 93, 31, 38, 20, 1, 0, 88, 84, 32, 51, 95}, + {2, 100, 40, 85, 1, 59, 74, 47, 91, 18, 68, 33, 67, 9, 80, 73, 6, + 53, 29, 1, 46, 60, 5, 32, 61, 5, 86, 11, 3, 36, 72, 6, 36, 12, + 57, 37, 71, 97, 50, 61, 14, 17, 61, 47, 93, 6, 20, 99, 25, 15, 66, + 37, 76, 71, 36, 2, 42, 21, 80, 12, 58, 52, 18, 94, 30, 41, 97, 67, + 3, 12, 94, 17, 96, 54, 31, 88, 26, 51, 86, 18, 66, 52, 55, 7, 89, + 91, 77, 98, 79, 56, 9, 36, 74, 94, 96, 3, 34, 92, 70, 37}, + {3, 64, 20, 65, 84, 51, 52, 77, 68, 37, 95, 0, 55, 15, 7, 10, 6, + 50, 7, 85, 73, 16, 87, 46, 9, 82, 50, 9, 39, 86, 12, 8, 49, 32, + 73, 100, 50, 24, 76, 17, 27, 70, 17, 83, 51, 92, 93, 23, 7, 66, 74, + 80, 82, 60, 26, 57, 41, 42, 66, 80, 27, 78, 88, 77, 76, 26, 42, 25, + 50, 17, 9, 78, 53, 26, 26, 3, 84, 85, 27, 92, 50, 0, 71, 31, 27, + 63, 88, 34, 4, 19, 14, 32, 97, 68, 75, 72, 95, 16, 64, 10}, + {100, 73, 88, 52, 65, 80, 21, 49, 64, 14, 6, 13, 15, 77, 10, 8, 6, + 64, 42, 10, 83, 22, 8, 45, 91, 49, 84, 51, 65, 47, 27, 30, 86, 82, + 82, 50, 61, 70, 65, 92, 84, 71, 71, 65, 14, 82, 73, 20, 11, 15, 97, + 61, 37, 5, 72, 94, 54, 55, 10, 86, 68, 38, 15, 53, 19, 64, 70, 80, + 33, 34, 37, 16, 72, 8, 82, 86, 56, 54, 5, 33, 69, 1, 94, 73, 73, + 66, 66, 27, 87, 77, 79, 55, 14, 94, 74, 100, 57, 43, 45, 90}, + {44, 83, 73, 15, 91, 54, 0, 46, 74, 72, 79, 9, 39, 39, 82, 12, 71, + 13, 5, 57, 90, 84, 11, 70, 77, 52, 69, 0, 95, 14, 56, 38, 63, 28, + 19, 53, 48, 19, 65, 89, 57, 9, 98, 97, 14, 45, 8, 85, 58, 80, 42, + 14, 63, 19, 50, 5, 71, 86, 72, 66, 66, 28, 70, 28, 56, 90, 81, 71, + 75, 11, 59, 32, 87, 56, 28, 1, 67, 2, 86, 91, 82, 27, 71, 10, 47, + 21, 82, 17, 6, 54, 49, 38, 82, 86, 66, 3, 75, 12, 74, 15}, + {23, 99, 47, 9, 20, 75, 10, 87, 43, 63, 44, 91, 90, 14, 0, 2, 35, + 83, 87, 7, 2, 1, 45, 84, 87, 77, 53, 27, 89, 94, 43, 78, 92, 90, + 88, 12, 31, 64, 65, 74, 93, 8, 65, 49, 23, 31, 51, 24, 80, 3, 99, + 82, 5, 9, 31, 92, 87, 85, 19, 41, 78, 62, 19, 35, 17, 73, 13, 48, + 2, 79, 89, 96, 53, 19, 44, 42, 50, 61, 67, 30, 65, 31, 78, 36, 40, + 9, 94, 93, 60, 12, 34, 3, 40, 53, 38, 24, 92, 52, 72, 94}, + {97, 60, 89, 15, 79, 99, 58, 96, 26, 91, 92, 91, 21, 69, 93, 27, 44, + 86, 20, 3, 65, 54, 6, 71, 73, 11, 95, 64, 29, 67, 23, 92, 93, 79, + 6, 38, 77, 30, 33, 2, 20, 91, 59, 7, 59, 51, 1, 3, 3, 21, 73, + 68, 41, 46, 4, 80, 57, 100, 9, 86, 32, 32, 43, 24, 10, 49, 28, 88, + 80, 27, 56, 66, 17, 82, 40, 77, 32, 41, 46, 1, 28, 85, 35, 69, 30, + 40, 14, 53, 39, 23, 4, 71, 55, 47, 61, 66, 97, 56, 19, 42}, + {83, 41, 74, 0, 22, 80, 77, 21, 20, 89, 22, 14, 73, 58, 83, 70, 98, + 63, 22, 2, 86, 27, 39, 41, 40, 66, 73, 36, 21, 92, 44, 4, 32, 85, + 4, 21, 64, 47, 42, 85, 1, 64, 65, 40, 88, 48, 9, 51, 77, 99, 53, + 63, 92, 58, 3, 31, 24, 76, 34, 11, 33, 44, 15, 31, 28, 86, 52, 93, + 99, 94, 43, 100, 24, 7, 40, 11, 21, 15, 63, 99, 13, 82, 61, 4, 40, + 30, 2, 30, 72, 36, 41, 71, 80, 23, 1, 8, 8, 20, 67, 7}}; diff --git a/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.h b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.h new file mode 100644 index 0000000..4f29c1a --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/generated/modified_sources/inline/input.h @@ -0,0 +1,9 @@ + +#ifndef INPUT_H +#define INPUT_H + +#define NUM_NODES 100 + +extern unsigned char dijkstra_AdjMatrix[NUM_NODES][NUM_NODES]; + +#endif /* INPUT_H */ diff --git a/targets/wasm-tacle/sequential/dijkstra/input.c b/targets/wasm-tacle/sequential/dijkstra/input.c new file mode 100755 index 0000000..02f54f6 --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/input.c @@ -0,0 +1,105 @@ +#include "input.h" + +unsigned char dijkstra_AdjMatrix[ NUM_NODES ][ NUM_NODES ] = { + {32, 32, 54, 12, 52, 56, 8, 30, 44, 94, 44, 39, 65, 19, 51, 91, 1, 5, 89, 34, 25, 58, 20, 51, 38, 65, 30, 7, 20, 10, 51, 18, 43, 71, 97, 61, 26, 5, 57, 70, 65, 0, 75, 29, 86, 93, 87, 87, 64, 75, 88, 89, 100, 7, 40, 37, 38, 36, 44, 24, 46, 95, 43, 89, 32, 5, 15, 58, 77, 72, 95, 8, 38, 69, 37, 24, 27, 90, 77, 92, 31, 30, 80, 30, 37, 86, 33, 76, 21, 77, 100, 68, 37, 8, 22, 69, 81, 38, 94, 57}, + {76, 54, 65, 14, 89, 69, 4, 16, 24, 47, 7, 21, 78, 53, 17, 81, 39, 50, 22, 60, 93, 89, 94, 30, 97, 16, 65, 43, 20, 24, 67, 62, 78, 98, 42, 67, 32, 46, 49, 57, 60, 56, 44, 37, 75, 62, 17, 13, 11, 40, 40, 4, 95, 100, 0, 57, 82, 31, 0, 1, 56, 67, 30, 100, 64, 72, 66, 63, 18, 81, 19, 44, 2, 63, 81, 78, 91, 64, 91, 2, 70, 97, 73, 64, 97, 39, 21, 78, 70, 21, 46, 25, 54, 76, 92, 84, 47, 57, 46, 31}, + {38, 31, 75, 40, 61, 21, 84, 51, 86, 41, 19, 21, 37, 58, 86, 100, 97, 73, 44, 67, 60, 90, 58, 13, 31, 49, 63, 44, 73, 76, 76, 77, 73, 16, 83, 100, 4, 67, 51, 56, 7, 36, 77, 10, 95, 28, 10, 57, 0, 54, 23, 60, 9, 48, 39, 40, 97, 69, 84, 35, 44, 25, 11, 83, 8, 61, 83, 12, 27, 100, 34, 0, 35, 10, 10, 96, 39, 87, 53, 5, 40, 42, 66, 15, 90, 71, 55, 87, 39, 5, 88, 49, 97, 100, 32, 4, 60, 81, 83, 53}, + {80, 16, 53, 14, 94, 29, 77, 99, 16, 29, 3, 22, 71, 35, 4, 61, 6, 25, 13, 11, 30, 0, 27, 94, 66, 25, 64, 92, 5, 47, 44, 85, 29, 63, 65, 89, 59, 41, 87, 41, 36, 57, 29, 7, 92, 33, 34, 64, 59, 47, 76, 55, 13, 2, 48, 46, 27, 12, 37, 99, 25, 48, 83, 20, 77, 13, 9, 35, 55, 62, 76, 57, 18, 72, 64, 10, 4, 64, 74, 63, 77, 15, 18, 91, 84, 32, 36, 77, 10, 39, 75, 35, 87, 23, 22, 30, 37, 31, 65, 58}, + {59, 7, 14, 78, 79, 45, 54, 83, 8, 94, 12, 86, 9, 97, 42, 93, 95, 44, 70, 5, 83, 10, 40, 36, 34, 62, 66, 71, 59, 97, 95, 18, 3, 8, 62, 48, 19, 15, 98, 28, 8, 9, 80, 84, 72, 21, 43, 66, 65, 79, 71, 13, 89, 78, 49, 22, 5, 14, 59, 65, 11, 53, 49, 81, 28, 77, 29, 47, 92, 26, 41, 66, 1, 20, 50, 73, 7, 59, 4, 72, 37, 76, 86, 25, 19, 0, 14, 24, 15, 73, 55, 93, 93, 3, 73, 87, 80, 68, 100, 37}, + {94, 41, 3, 61, 27, 19, 33, 35, 78, 38, 73, 14, 80, 58, 5, 99, 59, 19, 22, 40, 59, 78, 32, 17, 47, 71, 3, 94, 39, 2, 97, 99, 9, 66, 60, 37, 85, 59, 38, 28, 63, 10, 8, 8, 35, 81, 6, 60, 100, 96, 66, 24, 39, 64, 41, 52, 34, 10, 11, 39, 80, 8, 4, 89, 74, 64, 92, 25, 89, 29, 19, 18, 6, 28, 26, 7, 8, 33, 67, 74, 95, 32, 99, 33, 96, 5, 51, 96, 83, 63, 35, 62, 71, 39, 16, 10, 69, 8, 35, 23}, + {3, 55, 41, 76, 49, 68, 83, 23, 67, 15, 97, 61, 13, 61, 60, 75, 33, 77, 71, 15, 39, 72, 43, 76, 77, 59, 53, 11, 33, 88, 34, 37, 8, 76, 79, 23, 9, 62, 46, 76, 43, 9, 2, 57, 70, 28, 31, 69, 4, 68, 84, 10, 39, 26, 52, 82, 52, 4, 93, 85, 59, 94, 21, 33, 35, 67, 57, 44, 28, 69, 86, 37, 78, 54, 94, 14, 48, 25, 83, 18, 59, 33, 28, 99, 25, 81, 46, 77, 51, 39, 62, 9, 32, 49, 43, 33, 15, 100, 77, 9}, + {68, 28, 47, 12, 82, 6, 26, 96, 98, 75, 13, 57, 7, 8, 55, 33, 55, 0, 76, 5, 5, 3, 15, 3, 53, 58, 36, 34, 23, 79, 10, 57, 6, 23, 69, 54, 29, 61, 49, 27, 36, 63, 84, 9, 71, 4, 8, 25, 71, 85, 97, 77, 88, 11, 46, 6, 35, 83, 7, 24, 27, 17, 82, 34, 40, 16, 88, 69, 44, 3, 62, 46, 32, 45, 55, 2, 49, 64, 94, 87, 14, 90, 63, 68, 68, 75, 75, 2, 23, 82, 27, 51, 65, 75, 85, 71, 57, 38, 39, 0}, + {7, 1, 46, 39, 12, 68, 41, 28, 31, 0, 14, 45, 91, 43, 12, 58, 17, 53, 26, 41, 0, 19, 92, 31, 60, 42, 1, 17, 46, 41, 84, 54, 8, 97, 93, 20, 64, 0, 14, 61, 0, 28, 72, 57, 71, 50, 81, 89, 70, 7, 96, 70, 26, 87, 1, 87, 95, 69, 70, 40, 9, 19, 94, 84, 15, 87, 71, 45, 87, 85, 5, 53, 13, 43, 10, 50, 94, 91, 38, 63, 98, 33, 99, 91, 86, 66, 43, 80, 35, 79, 20, 10, 98, 80, 61, 13, 66, 31, 24, 18}, + {82, 97, 72, 61, 39, 48, 11, 99, 38, 49, 27, 2, 49, 26, 59, 0, 58, 1, 81, 59, 80, 67, 70, 77, 46, 97, 56, 79, 27, 81, 63, 75, 77, 0, 36, 82, 48, 47, 81, 53, 62, 7, 55, 77, 100, 13, 78, 24, 81, 24, 83, 26, 91, 18, 2, 2, 14, 25, 47, 7, 72, 10, 83, 14, 10, 18, 96, 25, 65, 42, 78, 93, 16, 32, 70, 15, 11, 47, 5, 58, 71, 89, 84, 27, 73, 86, 96, 88, 77, 43, 95, 48, 19, 43, 62, 96, 61, 24, 20, 92}, + {66, 98, 85, 82, 96, 20, 64, 73, 67, 69, 30, 3, 23, 13, 97, 97, 66, 58, 50, 42, 0, 44, 57, 86, 54, 85, 82, 14, 8, 1, 73, 41, 66, 23, 22, 61, 43, 86, 0, 9, 21, 30, 79, 44, 44, 75, 40, 76, 99, 56, 17, 100, 67, 40, 51, 20, 25, 32, 0, 100, 0, 73, 40, 66, 96, 29, 93, 38, 81, 93, 13, 1, 90, 92, 46, 100, 32, 52, 75, 31, 8, 58, 97, 75, 99, 13, 61, 90, 46, 61, 89, 12, 34, 96, 78, 96, 24, 36, 34, 4}, + {96, 13, 73, 85, 72, 18, 50, 70, 36, 24, 67, 10, 82, 29, 51, 80, 43, 11, 35, 89, 39, 24, 0, 73, 86, 44, 34, 9, 46, 34, 80, 41, 48, 52, 92, 19, 36, 41, 55, 39, 31, 22, 49, 13, 51, 67, 59, 94, 44, 95, 48, 83, 85, 48, 21, 70, 58, 56, 45, 4, 90, 91, 11, 3, 43, 70, 89, 45, 77, 44, 84, 8, 66, 100, 88, 83, 66, 46, 77, 76, 6, 24, 59, 91, 39, 46, 26, 97, 68, 37, 0, 58, 28, 79, 27, 37, 48, 16, 82, 24}, + {60, 66, 32, 92, 65, 19, 74, 97, 32, 16, 72, 38, 41, 97, 96, 46, 43, 88, 42, 77, 25, 9, 34, 19, 88, 28, 56, 1, 44, 3, 25, 70, 69, 24, 27, 100, 9, 0, 96, 7, 84, 34, 12, 91, 30, 7, 36, 39, 95, 78, 16, 86, 53, 16, 71, 6, 44, 26, 7, 54, 30, 100, 23, 65, 23, 50, 65, 99, 17, 26, 73, 67, 60, 85, 57, 57, 92, 93, 96, 52, 36, 78, 4, 90, 61, 75, 96, 4, 68, 3, 25, 64, 69, 14, 28, 58, 31, 59, 56, 48}, + {86, 28, 81, 45, 12, 37, 1, 70, 29, 64, 89, 31, 41, 93, 20, 1, 67, 83, 73, 0, 52, 98, 64, 20, 78, 93, 78, 8, 17, 100, 22, 2, 95, 2, 48, 6, 39, 15, 43, 34, 79, 31, 66, 87, 23, 52, 54, 56, 34, 93, 57, 52, 56, 87, 72, 34, 79, 15, 42, 63, 15, 65, 65, 9, 67, 79, 82, 73, 95, 91, 6, 39, 21, 38, 92, 10, 91, 46, 67, 91, 38, 90, 43, 95, 76, 81, 28, 21, 63, 70, 84, 78, 0, 48, 53, 68, 94, 0, 40, 88}, + {92, 12, 93, 12, 17, 85, 23, 7, 30, 56, 64, 34, 45, 73, 28, 87, 20, 22, 7, 83, 59, 91, 26, 59, 5, 79, 26, 99, 79, 32, 52, 70, 11, 44, 83, 28, 95, 72, 1, 91, 27, 65, 25, 38, 4, 19, 24, 24, 8, 99, 73, 67, 89, 99, 25, 60, 77, 18, 24, 21, 16, 42, 58, 27, 53, 6, 55, 47, 78, 56, 38, 71, 88, 29, 8, 58, 48, 99, 48, 56, 97, 20, 89, 52, 18, 14, 78, 61, 99, 2, 48, 14, 44, 5, 42, 97, 11, 63, 10, 55}, + {19, 48, 25, 73, 77, 100, 30, 91, 99, 78, 13, 95, 98, 1, 12, 82, 82, 91, 8, 80, 93, 22, 61, 2, 28, 2, 66, 5, 65, 76, 61, 50, 90, 86, 22, 32, 52, 52, 22, 50, 96, 1, 10, 59, 70, 90, 40, 51, 80, 14, 98, 38, 37, 58, 40, 31, 60, 72, 2, 91, 47, 63, 7, 2, 15, 29, 34, 67, 48, 23, 83, 9, 24, 59, 69, 94, 48, 8, 11, 27, 90, 8, 31, 93, 32, 38, 90, 58, 9, 92, 48, 23, 55, 55, 25, 36, 51, 60, 69, 65}, + {83, 51, 74, 73, 76, 42, 67, 24, 17, 44, 17, 73, 18, 49, 65, 50, 87, 54, 7, 62, 11, 21, 85, 32, 77, 10, 68, 94, 70, 36, 24, 52, 53, 98, 24, 96, 6, 57, 86, 90, 67, 2, 62, 85, 17, 26, 34, 70, 46, 41, 32, 23, 63, 16, 56, 5, 26, 23, 65, 62, 26, 89, 80, 45, 52, 71, 6, 58, 27, 92, 47, 61, 61, 75, 45, 78, 67, 46, 14, 12, 53, 46, 36, 82, 28, 58, 87, 21, 47, 17, 83, 73, 72, 63, 85, 24, 33, 91, 48, 26}, + {49, 62, 53, 9, 36, 99, 53, 3, 10, 67, 82, 63, 79, 84, 45, 7, 41, 98, 95, 89, 82, 43, 27, 53, 5, 78, 77, 4, 69, 25, 98, 17, 53, 16, 93, 89, 81, 45, 58, 91, 12, 40, 54, 91, 90, 65, 64, 31, 62, 58, 86, 43, 1, 12, 63, 73, 91, 39, 44, 25, 30, 7, 8, 83, 23, 0, 38, 4, 45, 96, 61, 23, 1, 14, 81, 92, 45, 44, 89, 74, 69, 74, 83, 36, 52, 45, 75, 8, 85, 18, 100, 81, 92, 7, 30, 82, 74, 34, 52, 86}, + {96, 12, 8, 98, 94, 89, 55, 38, 100, 43, 11, 68, 83, 95, 3, 0, 39, 78, 9, 90, 63, 8, 37, 20, 83, 67, 1, 56, 67, 53, 7, 62, 66, 16, 25, 25, 71, 80, 63, 70, 89, 75, 3, 37, 35, 6, 38, 74, 51, 47, 30, 80, 21, 67, 100, 3, 100, 68, 26, 66, 87, 33, 27, 52, 15, 53, 43, 53, 99, 6, 22, 88, 47, 26, 24, 82, 99, 28, 21, 15, 75, 51, 95, 63, 84, 61, 66, 83, 28, 58, 14, 14, 58, 42, 33, 39, 61, 76, 92, 25}, + {48, 14, 79, 95, 6, 70, 76, 4, 98, 98, 87, 39, 14, 81, 1, 99, 7, 33, 81, 1, 92, 96, 16, 15, 3, 15, 54, 30, 57, 12, 55, 5, 93, 0, 100, 99, 70, 42, 69, 67, 39, 21, 5, 53, 2, 6, 51, 76, 40, 99, 78, 98, 60, 60, 79, 63, 75, 99, 59, 98, 10, 80, 2, 2, 80, 69, 67, 49, 10, 2, 16, 49, 23, 88, 68, 92, 95, 86, 68, 0, 84, 11, 64, 43, 71, 42, 72, 45, 40, 97, 42, 17, 76, 11, 86, 56, 80, 19, 4, 90}, + {88, 87, 4, 77, 75, 72, 69, 35, 23, 2, 35, 6, 80, 99, 15, 50, 6, 53, 61, 46, 49, 69, 29, 25, 80, 15, 47, 25, 34, 51, 14, 21, 38, 85, 98, 79, 57, 32, 13, 46, 0, 48, 53, 80, 12, 34, 29, 18, 54, 56, 30, 2, 25, 60, 94, 4, 41, 40, 30, 75, 58, 10, 62, 62, 96, 59, 40, 18, 58, 53, 64, 24, 67, 83, 4, 79, 17, 100, 63, 37, 56, 93, 39, 81, 18, 100, 51, 59, 5, 81, 100, 63, 58, 61, 24, 53, 87, 64, 37, 10}, + {83, 67, 34, 49, 50, 38, 27, 33, 4, 56, 70, 60, 15, 75, 6, 33, 40, 57, 59, 46, 4, 24, 75, 62, 86, 100, 81, 38, 29, 17, 48, 79, 84, 48, 27, 100, 87, 21, 32, 57, 77, 68, 16, 92, 9, 22, 92, 49, 79, 16, 95, 83, 40, 70, 10, 25, 35, 91, 29, 30, 74, 43, 8, 24, 92, 2, 23, 44, 23, 22, 0, 66, 56, 16, 58, 65, 4, 15, 14, 49, 31, 75, 32, 71, 10, 8, 63, 45, 100, 92, 42, 73, 1, 50, 97, 93, 18, 87, 36, 41}, + {75, 36, 7, 30, 18, 31, 96, 22, 12, 76, 71, 43, 50, 69, 80, 61, 78, 42, 72, 43, 0, 13, 15, 68, 30, 79, 60, 48, 31, 62, 56, 5, 98, 29, 1, 82, 26, 97, 3, 38, 72, 40, 81, 89, 76, 26, 15, 53, 35, 87, 96, 1, 67, 77, 69, 97, 21, 28, 10, 18, 90, 32, 23, 53, 61, 25, 34, 87, 88, 3, 91, 26, 9, 37, 81, 85, 64, 96, 3, 99, 82, 65, 100, 48, 42, 68, 10, 29, 62, 88, 48, 17, 19, 37, 70, 47, 28, 70, 100, 16}, + {73, 91, 8, 82, 94, 89, 33, 57, 84, 36, 21, 31, 1, 87, 46, 9, 20, 56, 4, 82, 9, 52, 99, 96, 56, 34, 8, 84, 3, 7, 66, 42, 64, 74, 24, 58, 28, 23, 81, 11, 59, 2, 9, 26, 55, 55, 1, 76, 77, 6, 23, 87, 24, 89, 82, 80, 22, 90, 30, 93, 63, 96, 34, 27, 36, 24, 51, 30, 47, 98, 8, 73, 100, 17, 99, 21, 72, 0, 97, 48, 73, 86, 34, 97, 74, 82, 43, 63, 37, 73, 55, 0, 34, 55, 94, 36, 80, 10, 67, 93}, + {7, 75, 65, 74, 92, 64, 95, 63, 30, 57, 77, 2, 42, 11, 65, 16, 59, 7, 45, 97, 46, 66, 63, 81, 20, 56, 83, 66, 32, 49, 59, 39, 90, 23, 12, 81, 53, 73, 9, 49, 29, 87, 17, 72, 64, 83, 54, 89, 90, 65, 85, 36, 30, 13, 83, 16, 35, 65, 83, 67, 14, 7, 73, 70, 97, 85, 51, 16, 24, 26, 65, 53, 79, 83, 91, 8, 65, 10, 98, 20, 41, 48, 22, 71, 62, 4, 54, 63, 36, 36, 30, 16, 9, 2, 86, 5, 53, 36, 88, 77}, + {29, 53, 97, 74, 1, 53, 83, 32, 30, 46, 52, 71, 94, 41, 42, 21, 45, 62, 85, 81, 98, 81, 97, 73, 83, 83, 44, 1, 85, 32, 45, 80, 85, 41, 54, 52, 60, 2, 84, 90, 48, 1, 61, 7, 42, 69, 96, 54, 30, 46, 0, 94, 26, 64, 32, 75, 46, 76, 42, 97, 7, 87, 43, 58, 94, 97, 9, 54, 99, 59, 43, 12, 61, 70, 19, 69, 4, 14, 22, 0, 26, 23, 60, 52, 53, 92, 93, 65, 68, 35, 61, 75, 88, 70, 33, 82, 66, 8, 35, 30}, + {68, 44, 8, 95, 81, 28, 63, 85, 8, 52, 86, 35, 41, 11, 53, 94, 3, 12, 58, 71, 13, 85, 11, 0, 55, 44, 82, 87, 19, 83, 84, 87, 27, 92, 81, 7, 86, 9, 58, 61, 27, 9, 62, 68, 21, 81, 61, 24, 93, 85, 61, 72, 70, 72, 73, 91, 16, 20, 77, 35, 3, 26, 88, 97, 18, 34, 3, 70, 9, 27, 30, 37, 37, 92, 4, 24, 73, 32, 48, 31, 83, 8, 3, 52, 80, 42, 8, 62, 62, 52, 63, 65, 78, 16, 27, 62, 50, 30, 32, 26}, + {24, 62, 63, 27, 20, 67, 51, 59, 65, 65, 90, 48, 73, 93, 66, 18, 0, 75, 47, 63, 26, 76, 94, 3, 59, 21, 66, 75, 17, 64, 0, 41, 25, 63, 68, 11, 97, 85, 70, 61, 49, 60, 8, 88, 18, 41, 6, 19, 15, 19, 48, 41, 61, 41, 10, 19, 62, 42, 95, 46, 5, 95, 53, 98, 58, 21, 8, 20, 5, 79, 81, 21, 4, 56, 8, 89, 97, 81, 74, 11, 100, 21, 18, 61, 29, 95, 46, 57, 37, 40, 2, 42, 1, 56, 5, 59, 43, 14, 79, 14}, + {59, 25, 35, 29, 81, 44, 84, 43, 24, 58, 20, 91, 45, 38, 17, 74, 100, 63, 31, 36, 3, 33, 44, 71, 55, 50, 96, 98, 30, 40, 12, 55, 65, 13, 50, 12, 57, 33, 55, 48, 91, 42, 38, 36, 46, 55, 76, 45, 17, 6, 81, 87, 6, 25, 57, 61, 41, 52, 25, 37, 92, 3, 92, 23, 16, 7, 35, 74, 40, 56, 21, 98, 98, 59, 100, 44, 80, 75, 89, 97, 82, 36, 50, 54, 27, 6, 14, 68, 25, 5, 4, 83, 8, 62, 5, 25, 69, 40, 65, 75}, + {63, 52, 72, 60, 10, 71, 70, 56, 12, 59, 52, 94, 95, 68, 13, 21, 41, 94, 55, 66, 100, 25, 48, 7, 53, 54, 99, 88, 60, 63, 62, 22, 14, 34, 49, 91, 71, 18, 46, 83, 77, 65, 42, 37, 32, 55, 24, 39, 15, 45, 4, 14, 36, 19, 21, 89, 39, 87, 76, 99, 49, 4, 88, 64, 4, 36, 54, 75, 20, 67, 24, 64, 31, 32, 0, 29, 54, 92, 69, 69, 36, 39, 83, 39, 58, 70, 27, 63, 56, 70, 28, 5, 74, 15, 35, 78, 17, 55, 18, 37}, + {88, 8, 0, 85, 41, 68, 14, 95, 59, 49, 63, 61, 54, 11, 66, 79, 81, 94, 41, 3, 29, 69, 75, 69, 50, 9, 46, 33, 30, 30, 71, 18, 39, 37, 2, 80, 4, 83, 40, 29, 98, 2, 57, 52, 13, 22, 30, 60, 82, 71, 29, 10, 6, 3, 79, 22, 79, 91, 56, 76, 21, 26, 94, 26, 63, 62, 72, 34, 45, 11, 29, 42, 13, 86, 94, 93, 75, 90, 18, 56, 27, 48, 33, 33, 17, 78, 55, 63, 69, 10, 38, 56, 2, 31, 48, 32, 93, 19, 32, 3}, + {30, 61, 46, 43, 13, 5, 1, 88, 96, 86, 9, 89, 100, 42, 21, 17, 20, 42, 80, 55, 19, 17, 10, 88, 14, 58, 19, 6, 77, 17, 77, 73, 79, 22, 15, 58, 94, 83, 45, 55, 68, 20, 43, 68, 63, 30, 51, 49, 39, 97, 3, 58, 13, 80, 45, 27, 3, 31, 100, 80, 48, 76, 52, 93, 64, 33, 50, 24, 82, 61, 45, 15, 82, 89, 49, 10, 85, 100, 59, 23, 96, 28, 81, 75, 7, 93, 68, 10, 90, 34, 56, 3, 76, 74, 97, 6, 73, 12, 30, 20}, + {40, 75, 35, 88, 29, 85, 64, 14, 50, 22, 37, 12, 16, 85, 87, 23, 77, 21, 100, 66, 55, 21, 35, 30, 95, 31, 2, 33, 10, 32, 53, 16, 74, 54, 70, 69, 38, 33, 83, 55, 55, 87, 67, 71, 71, 19, 60, 13, 40, 25, 45, 61, 46, 80, 58, 6, 78, 60, 39, 88, 93, 58, 70, 32, 11, 39, 0, 16, 72, 50, 71, 93, 36, 37, 29, 6, 56, 55, 19, 63, 80, 64, 23, 25, 43, 81, 98, 87, 41, 2, 40, 100, 60, 9, 31, 37, 14, 98, 53, 86}, + {47, 90, 44, 83, 26, 73, 55, 49, 27, 40, 11, 73, 70, 0, 64, 13, 82, 61, 66, 89, 29, 6, 88, 89, 15, 85, 93, 30, 82, 11, 82, 96, 1, 26, 78, 27, 65, 100, 42, 93, 39, 53, 31, 9, 54, 96, 89, 1, 22, 54, 90, 52, 60, 43, 6, 42, 27, 99, 72, 75, 10, 19, 70, 11, 45, 14, 4, 10, 13, 47, 69, 52, 66, 100, 27, 86, 61, 15, 53, 84, 36, 42, 35, 96, 85, 41, 37, 78, 40, 75, 53, 16, 95, 22, 94, 5, 36, 98, 15, 15}, + {10, 50, 34, 77, 16, 61, 28, 77, 43, 82, 60, 79, 90, 95, 74, 41, 2, 78, 18, 8, 18, 71, 24, 12, 60, 17, 85, 62, 81, 66, 78, 92, 16, 11, 34, 32, 38, 28, 75, 81, 9, 1, 59, 66, 62, 100, 6, 64, 43, 24, 72, 61, 62, 62, 40, 21, 79, 24, 49, 26, 90, 26, 84, 72, 3, 84, 70, 8, 11, 45, 89, 88, 46, 14, 53, 74, 80, 59, 38, 89, 83, 9, 15, 10, 38, 55, 31, 83, 45, 81, 8, 1, 73, 92, 73, 43, 75, 9, 51, 53}, + {54, 5, 40, 66, 86, 59, 39, 31, 17, 43, 19, 66, 19, 1, 77, 57, 22, 74, 39, 68, 20, 14, 35, 60, 5, 7, 2, 47, 16, 19, 66, 36, 91, 5, 68, 43, 30, 74, 40, 47, 83, 26, 79, 1, 27, 21, 24, 49, 96, 64, 83, 82, 78, 17, 41, 49, 92, 9, 62, 74, 28, 27, 77, 86, 99, 44, 95, 28, 84, 34, 41, 33, 60, 20, 34, 87, 41, 59, 36, 2, 89, 85, 85, 32, 2, 25, 47, 94, 35, 9, 67, 29, 2, 43, 81, 1, 54, 75, 96, 3}, + {9, 37, 36, 35, 23, 37, 22, 30, 62, 24, 33, 50, 8, 84, 48, 77, 8, 95, 70, 9, 70, 37, 5, 73, 46, 86, 74, 100, 27, 35, 70, 2, 72, 5, 37, 95, 42, 25, 25, 3, 49, 24, 19, 24, 7, 67, 0, 82, 28, 71, 92, 98, 74, 63, 70, 86, 14, 9, 52, 41, 45, 21, 43, 83, 93, 47, 44, 35, 72, 35, 4, 88, 59, 91, 11, 32, 57, 11, 13, 51, 48, 71, 49, 88, 33, 85, 40, 48, 61, 92, 55, 5, 79, 65, 54, 71, 11, 98, 72, 83}, + {32, 43, 70, 57, 33, 47, 89, 56, 25, 69, 7, 73, 39, 56, 27, 39, 6, 67, 53, 67, 24, 74, 38, 2, 38, 93, 73, 49, 56, 11, 99, 89, 54, 34, 11, 87, 48, 67, 42, 73, 35, 49, 11, 40, 71, 4, 45, 78, 71, 98, 10, 95, 38, 49, 63, 76, 41, 36, 92, 97, 47, 56, 51, 0, 56, 63, 53, 3, 29, 95, 76, 30, 44, 54, 70, 81, 58, 82, 58, 96, 45, 69, 56, 83, 84, 19, 59, 24, 21, 16, 87, 34, 72, 4, 0, 27, 33, 53, 31, 28}, + {47, 73, 58, 57, 26, 94, 38, 85, 75, 62, 80, 87, 97, 35, 69, 80, 20, 27, 3, 41, 43, 57, 75, 81, 27, 75, 8, 60, 27, 5, 88, 41, 78, 11, 98, 71, 71, 1, 55, 12, 64, 0, 99, 60, 1, 67, 40, 22, 61, 9, 63, 70, 32, 4, 51, 59, 79, 25, 18, 73, 30, 72, 13, 7, 49, 77, 78, 87, 79, 99, 99, 42, 65, 63, 68, 67, 96, 7, 55, 56, 84, 84, 93, 15, 88, 43, 75, 33, 34, 59, 72, 64, 98, 85, 37, 12, 27, 82, 99, 5}, + {80, 63, 13, 11, 92, 48, 44, 88, 55, 99, 9, 4, 48, 1, 20, 2, 10, 61, 1, 44, 86, 73, 74, 83, 23, 11, 62, 50, 93, 26, 22, 38, 90, 1, 15, 47, 49, 59, 34, 71, 23, 44, 75, 38, 11, 61, 40, 22, 21, 41, 32, 7, 13, 6, 56, 36, 84, 17, 52, 76, 44, 74, 80, 100, 42, 96, 46, 91, 20, 81, 27, 10, 91, 2, 48, 1, 29, 88, 90, 51, 95, 22, 58, 7, 95, 13, 9, 78, 31, 61, 19, 41, 1, 65, 40, 43, 26, 86, 100, 47}, + {32, 94, 23, 22, 62, 71, 91, 91, 58, 80, 41, 18, 68, 65, 25, 62, 79, 0, 5, 76, 27, 24, 83, 28, 56, 22, 37, 82, 74, 3, 95, 6, 97, 17, 95, 24, 54, 85, 14, 78, 31, 56, 96, 99, 20, 87, 27, 65, 87, 32, 6, 14, 23, 89, 8, 45, 77, 12, 26, 51, 82, 88, 23, 44, 71, 17, 68, 25, 69, 82, 2, 100, 3, 99, 64, 91, 85, 91, 21, 38, 90, 28, 52, 79, 83, 26, 23, 60, 38, 49, 10, 86, 2, 33, 29, 74, 16, 97, 65, 51}, + {45, 67, 16, 48, 31, 81, 4, 16, 37, 26, 20, 93, 20, 38, 71, 2, 64, 94, 62, 69, 9, 72, 54, 11, 71, 84, 51, 54, 80, 15, 4, 24, 83, 88, 39, 80, 68, 43, 62, 71, 35, 82, 64, 55, 19, 0, 58, 84, 95, 19, 18, 3, 58, 72, 81, 95, 55, 32, 14, 1, 47, 19, 92, 96, 6, 30, 76, 40, 40, 37, 77, 75, 19, 6, 30, 38, 7, 54, 88, 68, 73, 5, 71, 97, 78, 51, 58, 99, 49, 72, 66, 97, 57, 58, 58, 63, 54, 33, 69, 60}, + {37, 12, 1, 56, 18, 31, 60, 92, 51, 14, 59, 90, 19, 29, 87, 63, 47, 10, 28, 96, 82, 94, 58, 39, 17, 16, 68, 38, 15, 3, 64, 52, 15, 65, 74, 100, 62, 0, 92, 12, 14, 50, 2, 33, 46, 55, 63, 59, 65, 91, 20, 46, 50, 79, 51, 34, 61, 19, 72, 76, 89, 35, 95, 3, 67, 68, 69, 28, 68, 60, 41, 82, 77, 43, 82, 22, 98, 44, 47, 28, 0, 67, 74, 50, 11, 92, 84, 72, 77, 21, 14, 65, 23, 8, 34, 90, 42, 2, 84, 10}, + {63, 24, 58, 5, 33, 5, 94, 97, 15, 40, 24, 15, 6, 65, 32, 18, 56, 82, 56, 32, 70, 70, 97, 93, 78, 30, 48, 87, 99, 31, 97, 27, 22, 20, 32, 55, 93, 25, 52, 7, 31, 42, 90, 4, 6, 88, 89, 62, 35, 44, 60, 4, 81, 56, 63, 24, 52, 10, 10, 17, 8, 73, 44, 30, 94, 77, 51, 86, 68, 69, 59, 66, 11, 48, 70, 84, 1, 58, 12, 37, 68, 72, 41, 48, 95, 71, 73, 12, 47, 83, 29, 55, 56, 74, 51, 15, 16, 2, 67, 50}, + {71, 92, 15, 82, 6, 51, 66, 7, 75, 44, 44, 43, 15, 52, 57, 9, 22, 96, 89, 35, 79, 17, 91, 0, 57, 7, 82, 73, 9, 14, 90, 81, 5, 4, 28, 11, 22, 60, 19, 97, 3, 29, 5, 86, 81, 63, 61, 69, 58, 49, 71, 2, 67, 27, 69, 90, 34, 50, 29, 44, 64, 18, 91, 36, 89, 85, 47, 10, 45, 32, 7, 14, 62, 12, 100, 8, 41, 61, 44, 100, 9, 14, 68, 42, 41, 37, 99, 75, 87, 27, 85, 17, 45, 75, 53, 33, 26, 66, 10, 71}, + {99, 84, 85, 60, 62, 51, 68, 3, 11, 11, 69, 87, 92, 36, 96, 32, 39, 94, 74, 93, 87, 58, 9, 31, 100, 28, 30, 25, 94, 6, 62, 92, 90, 12, 17, 52, 29, 86, 55, 40, 63, 90, 94, 21, 92, 55, 53, 31, 14, 93, 23, 0, 17, 99, 98, 16, 26, 27, 7, 86, 34, 35, 78, 90, 13, 95, 41, 43, 46, 62, 49, 76, 51, 42, 97, 9, 63, 15, 40, 77, 8, 63, 43, 25, 61, 40, 7, 53, 68, 81, 38, 68, 82, 82, 57, 95, 43, 65, 37, 55}, + {93, 87, 30, 10, 95, 93, 19, 58, 75, 59, 0, 83, 88, 44, 74, 14, 50, 47, 67, 17, 94, 71, 51, 75, 53, 75, 69, 96, 5, 73, 16, 98, 59, 13, 7, 19, 5, 93, 43, 80, 17, 44, 28, 4, 54, 68, 18, 3, 14, 51, 88, 7, 22, 4, 48, 41, 45, 17, 2, 50, 90, 18, 14, 14, 31, 88, 33, 3, 81, 77, 49, 98, 87, 44, 2, 6, 11, 87, 76, 93, 4, 63, 66, 26, 34, 14, 33, 79, 98, 35, 29, 53, 19, 43, 67, 51, 30, 66, 20, 77}, + {8, 69, 75, 61, 79, 43, 33, 91, 96, 9, 49, 100, 38, 14, 25, 72, 28, 58, 51, 92, 59, 46, 44, 79, 55, 77, 96, 51, 9, 15, 28, 17, 50, 69, 45, 29, 11, 78, 86, 6, 53, 34, 73, 92, 48, 98, 29, 43, 22, 46, 34, 47, 92, 79, 25, 12, 55, 87, 64, 64, 68, 58, 48, 18, 93, 59, 13, 70, 2, 99, 76, 56, 32, 14, 13, 46, 12, 42, 89, 0, 89, 23, 13, 46, 1, 5, 59, 22, 92, 89, 53, 60, 12, 67, 44, 4, 92, 57, 74, 94}, + {55, 15, 15, 53, 30, 28, 99, 8, 71, 88, 75, 59, 77, 88, 4, 44, 93, 29, 66, 51, 17, 85, 10, 96, 17, 54, 100, 8, 77, 73, 2, 31, 89, 17, 50, 85, 46, 48, 93, 83, 35, 67, 7, 11, 54, 78, 21, 13, 7, 88, 64, 91, 38, 74, 87, 56, 94, 86, 64, 70, 25, 32, 67, 80, 50, 16, 64, 62, 30, 56, 10, 32, 89, 17, 9, 8, 95, 31, 21, 68, 18, 85, 59, 22, 24, 11, 78, 84, 97, 42, 19, 88, 40, 86, 67, 90, 68, 30, 17, 99}, + {52, 27, 30, 40, 44, 5, 49, 5, 36, 70, 73, 20, 21, 31, 43, 11, 42, 20, 96, 5, 28, 14, 93, 69, 67, 26, 24, 34, 56, 8, 99, 75, 35, 95, 14, 46, 0, 29, 51, 36, 66, 23, 57, 87, 21, 100, 98, 29, 86, 59, 0, 81, 74, 60, 15, 40, 86, 39, 40, 7, 47, 5, 82, 49, 100, 63, 95, 66, 92, 11, 2, 57, 0, 25, 9, 21, 91, 74, 17, 76, 32, 17, 22, 72, 43, 37, 78, 28, 77, 18, 36, 90, 90, 84, 38, 89, 46, 99, 21, 4}, + {9, 90, 27, 10, 14, 3, 98, 4, 77, 14, 46, 75, 99, 35, 47, 41, 72, 24, 70, 48, 8, 72, 4, 98, 55, 42, 53, 68, 7, 74, 72, 16, 63, 99, 26, 43, 1, 24, 13, 44, 4, 25, 19, 2, 60, 32, 10, 32, 22, 80, 46, 98, 17, 50, 95, 38, 59, 13, 5, 66, 87, 77, 48, 15, 42, 41, 58, 9, 31, 71, 54, 35, 97, 39, 4, 56, 37, 14, 88, 59, 60, 0, 56, 77, 50, 17, 81, 75, 30, 87, 6, 84, 29, 55, 99, 37, 96, 57, 47, 26}, + {94, 67, 27, 56, 5, 98, 12, 8, 11, 66, 67, 37, 66, 90, 80, 83, 6, 61, 23, 2, 47, 30, 86, 42, 51, 51, 80, 46, 74, 26, 38, 67, 59, 31, 23, 64, 29, 1, 38, 6, 33, 4, 44, 100, 60, 90, 48, 32, 50, 71, 1, 63, 67, 87, 5, 17, 3, 51, 29, 77, 77, 33, 10, 35, 65, 100, 65, 60, 0, 2, 32, 33, 73, 42, 99, 100, 32, 12, 31, 48, 84, 99, 11, 50, 86, 83, 34, 55, 33, 63, 32, 76, 97, 8, 77, 27, 7, 7, 53, 74}, + {76, 85, 73, 14, 27, 72, 13, 59, 50, 11, 73, 33, 9, 84, 50, 61, 32, 84, 16, 31, 12, 14, 6, 8, 89, 49, 1, 96, 56, 54, 35, 31, 39, 7, 46, 32, 45, 59, 57, 96, 36, 29, 95, 46, 80, 10, 73, 11, 94, 89, 9, 73, 69, 15, 47, 57, 31, 49, 18, 87, 69, 53, 18, 74, 27, 30, 5, 38, 55, 28, 33, 92, 58, 95, 3, 37, 4, 76, 14, 65, 31, 23, 37, 66, 5, 50, 23, 36, 99, 41, 22, 68, 61, 6, 7, 88, 2, 13, 92, 58}, + {41, 92, 15, 65, 86, 18, 1, 56, 60, 83, 87, 57, 5, 90, 23, 10, 40, 12, 12, 38, 19, 35, 72, 80, 7, 80, 33, 10, 59, 25, 34, 66, 16, 49, 31, 68, 33, 99, 23, 59, 47, 10, 16, 53, 100, 5, 29, 39, 17, 42, 44, 2, 43, 82, 49, 16, 27, 82, 93, 86, 73, 26, 18, 55, 75, 49, 89, 7, 13, 79, 33, 61, 55, 15, 80, 20, 20, 75, 60, 3, 83, 70, 5, 92, 17, 54, 8, 45, 2, 0, 30, 41, 27, 14, 63, 68, 29, 51, 42, 43}, + {96, 75, 70, 50, 90, 49, 71, 9, 90, 97, 79, 73, 66, 50, 64, 83, 4, 72, 27, 73, 39, 24, 80, 32, 4, 42, 100, 34, 60, 41, 43, 55, 82, 12, 5, 71, 27, 42, 46, 16, 38, 24, 89, 3, 41, 19, 52, 11, 57, 46, 84, 96, 36, 29, 27, 40, 72, 94, 40, 98, 0, 83, 18, 83, 95, 90, 53, 88, 31, 66, 71, 69, 56, 59, 38, 97, 44, 57, 7, 1, 2, 57, 97, 4, 87, 91, 10, 24, 84, 51, 21, 84, 33, 39, 66, 95, 96, 86, 82, 26}, + {51, 52, 96, 73, 78, 33, 70, 21, 90, 77, 89, 58, 0, 86, 28, 87, 42, 39, 10, 25, 56, 98, 75, 89, 2, 7, 49, 98, 59, 98, 24, 76, 15, 86, 48, 59, 18, 17, 81, 75, 61, 69, 99, 61, 20, 27, 13, 62, 32, 90, 53, 88, 87, 95, 42, 89, 1, 58, 53, 60, 55, 43, 1, 70, 28, 49, 29, 12, 33, 76, 53, 60, 10, 52, 87, 98, 45, 100, 25, 43, 89, 79, 97, 41, 73, 4, 96, 40, 62, 48, 66, 16, 91, 67, 53, 85, 82, 48, 98, 14}, + {90, 50, 74, 66, 68, 26, 63, 12, 25, 89, 55, 80, 33, 17, 20, 72, 22, 83, 11, 84, 30, 77, 67, 88, 9, 86, 72, 91, 33, 35, 72, 89, 86, 11, 54, 53, 38, 17, 32, 29, 72, 53, 76, 71, 71, 62, 42, 93, 44, 19, 76, 41, 62, 42, 28, 71, 27, 66, 27, 26, 1, 99, 14, 87, 10, 35, 5, 14, 52, 37, 43, 90, 91, 18, 60, 27, 81, 68, 19, 24, 87, 95, 31, 48, 3, 59, 18, 97, 92, 11, 90, 93, 10, 70, 45, 20, 4, 16, 34, 22}, + {54, 43, 11, 10, 62, 37, 37, 8, 4, 22, 99, 57, 83, 30, 4, 86, 55, 89, 49, 46, 0, 38, 38, 77, 74, 49, 97, 79, 66, 97, 0, 86, 5, 79, 62, 33, 15, 65, 41, 87, 87, 6, 9, 35, 2, 14, 21, 57, 69, 36, 3, 35, 40, 7, 11, 13, 23, 74, 92, 55, 36, 93, 40, 42, 37, 68, 75, 18, 32, 83, 71, 85, 89, 81, 19, 91, 61, 6, 13, 29, 8, 16, 65, 48, 91, 76, 62, 80, 16, 19, 34, 52, 78, 74, 94, 14, 7, 69, 33, 5}, + {17, 3, 56, 5, 84, 41, 62, 44, 48, 75, 40, 56, 58, 71, 71, 14, 12, 99, 94, 28, 17, 27, 81, 96, 67, 74, 76, 74, 8, 75, 45, 25, 79, 0, 97, 28, 41, 58, 39, 55, 100, 45, 11, 23, 15, 48, 37, 27, 46, 97, 56, 63, 90, 36, 24, 56, 76, 0, 96, 85, 41, 40, 9, 19, 6, 6, 14, 47, 30, 19, 2, 96, 64, 80, 18, 45, 27, 21, 72, 39, 17, 94, 1, 6, 96, 93, 28, 72, 59, 90, 56, 100, 96, 31, 86, 1, 3, 66, 15, 0}, + {85, 17, 96, 14, 63, 81, 59, 90, 1, 97, 28, 19, 57, 96, 92, 52, 54, 87, 23, 12, 76, 45, 79, 72, 43, 64, 39, 46, 29, 54, 12, 80, 37, 8, 60, 100, 89, 85, 55, 56, 47, 49, 75, 3, 45, 33, 56, 99, 19, 45, 78, 61, 91, 56, 99, 33, 86, 4, 45, 81, 58, 58, 60, 96, 32, 19, 61, 87, 70, 16, 42, 16, 65, 84, 20, 76, 83, 42, 41, 68, 87, 18, 28, 77, 40, 94, 76, 25, 98, 88, 5, 21, 11, 31, 16, 43, 16, 44, 29, 86}, + {60, 37, 1, 24, 20, 88, 67, 69, 29, 7, 36, 16, 25, 65, 59, 65, 24, 1, 56, 21, 89, 61, 42, 100, 58, 25, 8, 74, 69, 3, 25, 95, 40, 26, 85, 27, 81, 51, 96, 9, 58, 32, 25, 49, 63, 51, 80, 87, 52, 35, 74, 40, 62, 82, 5, 19, 73, 13, 59, 7, 16, 84, 1, 56, 77, 53, 49, 57, 3, 45, 66, 28, 43, 58, 77, 72, 8, 57, 58, 60, 92, 98, 66, 20, 79, 71, 39, 52, 84, 65, 59, 100, 48, 27, 21, 91, 80, 71, 47, 83}, + {82, 80, 10, 24, 37, 54, 62, 45, 10, 86, 71, 68, 83, 36, 88, 27, 6, 94, 79, 56, 58, 4, 55, 72, 98, 42, 63, 77, 12, 9, 25, 60, 89, 2, 50, 92, 56, 11, 2, 32, 97, 73, 100, 79, 75, 88, 73, 47, 47, 17, 2, 4, 21, 23, 42, 18, 66, 4, 61, 44, 81, 87, 71, 35, 89, 20, 27, 10, 32, 96, 42, 95, 69, 41, 40, 9, 95, 12, 23, 41, 29, 25, 11, 17, 15, 54, 1, 47, 24, 63, 57, 4, 49, 27, 40, 3, 48, 33, 13, 46}, + {95, 55, 40, 29, 96, 46, 39, 57, 58, 62, 98, 54, 53, 76, 71, 68, 29, 72, 81, 53, 34, 38, 24, 49, 65, 30, 52, 79, 29, 31, 24, 23, 86, 31, 53, 48, 77, 92, 4, 1, 19, 68, 55, 72, 9, 92, 6, 38, 63, 87, 58, 64, 24, 82, 79, 56, 78, 98, 34, 6, 28, 25, 29, 81, 22, 82, 28, 65, 39, 99, 66, 58, 32, 87, 97, 42, 78, 2, 46, 7, 55, 3, 71, 46, 51, 49, 1, 28, 46, 1, 34, 41, 26, 30, 21, 48, 11, 49, 80, 17}, + {13, 45, 75, 11, 99, 37, 53, 76, 39, 66, 83, 95, 35, 19, 40, 87, 69, 7, 81, 81, 8, 82, 21, 35, 11, 42, 49, 89, 57, 95, 5, 36, 40, 47, 14, 38, 84, 33, 80, 23, 99, 29, 84, 34, 48, 90, 87, 16, 97, 67, 64, 71, 48, 51, 72, 59, 60, 88, 48, 83, 82, 53, 86, 21, 66, 100, 25, 50, 32, 72, 39, 31, 0, 22, 65, 48, 78, 51, 31, 40, 84, 61, 10, 32, 11, 83, 57, 71, 70, 4, 20, 51, 24, 5, 39, 90, 4, 30, 5, 36}, + {1, 44, 33, 68, 66, 64, 16, 9, 81, 13, 49, 65, 74, 60, 97, 51, 42, 19, 89, 11, 24, 8, 28, 14, 13, 67, 70, 84, 64, 76, 86, 65, 19, 19, 100, 52, 83, 15, 61, 64, 95, 10, 95, 34, 70, 57, 85, 78, 76, 73, 55, 66, 47, 83, 80, 60, 16, 16, 9, 80, 92, 96, 10, 77, 14, 9, 28, 63, 91, 56, 93, 85, 32, 87, 18, 68, 43, 70, 45, 19, 42, 66, 85, 56, 48, 31, 82, 30, 47, 92, 9, 4, 87, 87, 81, 67, 96, 76, 29, 87}, + {31, 89, 37, 63, 75, 22, 97, 85, 92, 41, 70, 100, 73, 20, 55, 20, 51, 37, 17, 64, 28, 93, 68, 81, 79, 15, 47, 75, 91, 42, 27, 88, 30, 64, 16, 72, 52, 12, 56, 43, 19, 25, 43, 92, 45, 64, 78, 63, 0, 95, 26, 95, 54, 61, 75, 32, 76, 88, 73, 32, 30, 66, 86, 26, 97, 1, 98, 48, 80, 19, 92, 99, 10, 0, 56, 56, 64, 33, 85, 65, 95, 77, 59, 48, 3, 0, 46, 45, 88, 19, 77, 84, 51, 62, 10, 47, 29, 74, 96, 8}, + {94, 53, 73, 3, 53, 28, 25, 16, 62, 76, 47, 22, 53, 73, 70, 22, 73, 15, 68, 60, 0, 10, 44, 52, 73, 54, 65, 68, 94, 60, 77, 53, 79, 15, 23, 31, 44, 48, 14, 72, 91, 27, 94, 9, 100, 29, 31, 72, 44, 99, 32, 11, 9, 76, 29, 48, 96, 94, 15, 55, 20, 58, 8, 99, 40, 31, 97, 84, 45, 77, 55, 35, 3, 14, 44, 3, 43, 42, 75, 87, 40, 73, 64, 15, 14, 93, 29, 76, 53, 11, 31, 73, 69, 39, 37, 8, 70, 100, 58, 81}, + {76, 79, 16, 80, 93, 26, 49, 35, 68, 23, 89, 75, 63, 18, 56, 77, 11, 86, 53, 30, 97, 84, 2, 31, 89, 5, 6, 24, 5, 64, 4, 47, 43, 87, 26, 1, 13, 41, 3, 47, 65, 92, 88, 94, 9, 44, 70, 87, 29, 89, 16, 25, 72, 85, 56, 26, 57, 62, 50, 62, 93, 55, 8, 1, 7, 1, 2, 20, 42, 5, 34, 73, 63, 21, 66, 39, 31, 2, 25, 60, 91, 8, 51, 29, 59, 74, 55, 15, 1, 5, 77, 94, 26, 52, 95, 33, 19, 64, 20, 27}, + {35, 54, 0, 99, 41, 32, 37, 73, 34, 28, 99, 92, 2, 50, 20, 62, 23, 75, 77, 24, 46, 20, 85, 72, 38, 45, 72, 57, 75, 92, 84, 10, 11, 50, 75, 18, 83, 78, 91, 83, 72, 56, 74, 75, 72, 60, 36, 95, 1, 79, 85, 47, 99, 35, 19, 36, 47, 91, 59, 21, 48, 43, 31, 59, 59, 72, 77, 7, 49, 34, 91, 21, 56, 30, 96, 27, 57, 98, 88, 58, 76, 38, 4, 41, 74, 90, 43, 20, 46, 2, 7, 94, 11, 39, 18, 70, 77, 62, 78, 26}, + {62, 34, 47, 17, 30, 8, 10, 87, 72, 98, 44, 47, 1, 15, 54, 75, 4, 98, 61, 17, 100, 69, 10, 10, 74, 96, 46, 50, 23, 23, 42, 85, 23, 55, 68, 54, 29, 44, 40, 0, 41, 51, 14, 42, 66, 68, 84, 36, 31, 10, 53, 30, 45, 30, 6, 85, 25, 53, 1, 14, 42, 43, 65, 66, 65, 32, 86, 94, 42, 25, 95, 83, 42, 8, 91, 74, 42, 40, 10, 74, 51, 63, 70, 62, 59, 77, 47, 50, 96, 48, 64, 3, 57, 28, 35, 21, 26, 20, 15, 68}, + {12, 9, 16, 54, 84, 74, 28, 92, 13, 4, 65, 30, 33, 1, 93, 93, 78, 5, 42, 39, 53, 73, 42, 9, 0, 78, 98, 94, 98, 12, 61, 76, 88, 44, 30, 37, 17, 24, 28, 97, 28, 60, 27, 61, 27, 86, 53, 4, 91, 62, 9, 9, 34, 17, 85, 0, 61, 82, 94, 25, 60, 21, 0, 13, 65, 30, 50, 48, 54, 45, 44, 48, 71, 37, 9, 98, 89, 62, 68, 45, 23, 43, 54, 23, 60, 5, 24, 21, 87, 17, 12, 13, 4, 12, 26, 69, 9, 43, 83, 29}, + {88, 94, 78, 24, 30, 87, 21, 86, 14, 55, 30, 4, 98, 51, 27, 57, 56, 17, 44, 8, 35, 56, 21, 39, 69, 14, 75, 44, 57, 23, 73, 10, 16, 50, 34, 13, 2, 55, 99, 17, 9, 95, 21, 6, 45, 14, 29, 0, 32, 74, 9, 33, 96, 97, 38, 30, 10, 79, 74, 33, 2, 47, 43, 85, 63, 77, 98, 66, 98, 62, 83, 73, 57, 70, 45, 68, 50, 75, 69, 82, 14, 44, 81, 9, 6, 19, 40, 84, 64, 80, 16, 66, 26, 60, 51, 90, 36, 14, 55, 34}, + {43, 3, 73, 100, 73, 18, 67, 89, 93, 1, 37, 6, 11, 17, 82, 85, 2, 88, 68, 67, 68, 50, 99, 60, 9, 15, 49, 12, 30, 70, 12, 73, 73, 85, 38, 11, 2, 71, 67, 95, 39, 3, 67, 16, 20, 15, 0, 90, 69, 34, 22, 36, 85, 20, 63, 94, 36, 11, 72, 32, 48, 84, 71, 87, 69, 75, 65, 37, 11, 31, 99, 50, 34, 31, 33, 20, 46, 100, 76, 15, 34, 98, 17, 18, 18, 80, 78, 20, 58, 16, 18, 72, 100, 55, 58, 34, 96, 89, 72, 6}, + {86, 36, 23, 86, 67, 56, 6, 80, 21, 48, 61, 55, 46, 78, 39, 30, 24, 84, 50, 48, 100, 34, 19, 65, 89, 43, 100, 84, 32, 37, 56, 17, 73, 79, 3, 5, 0, 76, 85, 22, 23, 45, 43, 35, 23, 83, 65, 13, 32, 14, 61, 31, 14, 46, 96, 2, 89, 61, 52, 87, 64, 8, 4, 2, 53, 74, 8, 54, 15, 93, 42, 38, 4, 85, 40, 94, 67, 4, 6, 99, 86, 33, 96, 100, 79, 58, 69, 33, 85, 20, 20, 49, 95, 91, 17, 14, 64, 25, 68, 79}, + {85, 76, 83, 89, 60, 22, 82, 94, 27, 54, 58, 79, 87, 54, 78, 31, 78, 12, 64, 62, 100, 84, 10, 94, 74, 28, 7, 37, 19, 41, 82, 70, 16, 31, 58, 43, 19, 5, 36, 12, 59, 94, 91, 11, 13, 69, 42, 91, 81, 6, 53, 80, 90, 29, 40, 30, 23, 13, 33, 9, 21, 15, 79, 3, 12, 37, 46, 31, 8, 48, 44, 34, 42, 34, 45, 21, 69, 54, 12, 16, 60, 65, 96, 15, 60, 1, 45, 84, 82, 45, 93, 2, 60, 71, 5, 38, 74, 18, 69, 49}, + {66, 12, 83, 74, 47, 94, 96, 15, 47, 74, 31, 6, 4, 94, 89, 64, 61, 100, 13, 42, 44, 72, 44, 70, 9, 16, 7, 83, 34, 77, 98, 66, 55, 80, 40, 1, 74, 1, 84, 20, 41, 81, 94, 45, 40, 48, 8, 1, 47, 89, 43, 58, 60, 54, 27, 69, 36, 1, 18, 70, 44, 15, 1, 99, 96, 7, 0, 35, 75, 50, 21, 15, 30, 14, 60, 37, 62, 35, 38, 76, 23, 47, 33, 49, 67, 60, 18, 2, 27, 2, 38, 71, 17, 6, 70, 79, 13, 36, 80, 89}, + {86, 1, 3, 82, 15, 30, 18, 44, 31, 22, 19, 54, 36, 52, 69, 69, 78, 53, 72, 5, 55, 76, 42, 73, 82, 11, 17, 62, 47, 98, 50, 99, 99, 19, 81, 80, 15, 65, 23, 46, 54, 8, 66, 56, 60, 35, 24, 4, 88, 62, 76, 43, 38, 17, 82, 86, 29, 65, 47, 42, 62, 63, 41, 26, 49, 88, 6, 64, 18, 96, 10, 72, 4, 42, 94, 64, 77, 18, 34, 31, 80, 9, 40, 84, 27, 21, 70, 22, 86, 83, 64, 14, 46, 4, 40, 61, 92, 46, 24, 10}, + {42, 0, 48, 12, 9, 42, 76, 86, 26, 77, 83, 5, 86, 22, 56, 79, 43, 92, 0, 96, 40, 65, 76, 52, 35, 15, 12, 94, 28, 3, 3, 36, 3, 17, 48, 79, 25, 90, 65, 51, 66, 47, 23, 18, 36, 79, 97, 79, 36, 98, 40, 76, 28, 15, 28, 63, 98, 40, 56, 25, 43, 25, 27, 13, 9, 75, 92, 34, 30, 22, 86, 97, 36, 75, 81, 72, 19, 77, 16, 55, 40, 23, 97, 68, 4, 24, 31, 1, 31, 53, 93, 40, 79, 19, 19, 88, 60, 78, 88, 91}, + {66, 39, 53, 1, 13, 33, 39, 32, 76, 22, 53, 16, 11, 16, 84, 15, 40, 81, 17, 37, 34, 76, 44, 79, 96, 63, 32, 21, 6, 86, 11, 73, 25, 30, 40, 4, 29, 46, 3, 5, 68, 56, 21, 79, 72, 71, 60, 79, 18, 77, 82, 52, 53, 25, 97, 14, 55, 95, 35, 61, 80, 13, 33, 4, 9, 74, 9, 39, 19, 12, 10, 53, 34, 98, 98, 73, 68, 57, 17, 52, 0, 99, 3, 19, 24, 66, 100, 79, 60, 34, 39, 40, 13, 39, 44, 23, 79, 19, 28, 64}, + {98, 38, 16, 32, 35, 80, 71, 69, 36, 88, 21, 2, 86, 91, 21, 76, 57, 87, 20, 83, 21, 26, 22, 0, 65, 33, 90, 9, 18, 17, 73, 16, 55, 55, 14, 56, 34, 85, 92, 36, 38, 79, 5, 90, 35, 93, 66, 58, 80, 86, 41, 67, 78, 29, 67, 8, 62, 57, 17, 47, 74, 90, 63, 96, 44, 43, 17, 44, 27, 75, 47, 65, 53, 52, 54, 55, 10, 86, 12, 90, 38, 53, 56, 15, 49, 23, 24, 77, 46, 41, 23, 19, 98, 86, 81, 7, 95, 65, 18, 21}, + {39, 31, 52, 59, 49, 73, 13, 59, 24, 25, 49, 62, 45, 4, 44, 60, 94, 34, 36, 39, 41, 60, 25, 4, 11, 72, 12, 6, 36, 97, 94, 76, 27, 12, 34, 76, 85, 13, 34, 75, 4, 83, 3, 49, 54, 47, 8, 47, 47, 11, 53, 88, 71, 44, 59, 48, 15, 71, 54, 52, 67, 14, 27, 94, 26, 27, 69, 77, 6, 69, 51, 10, 52, 54, 26, 72, 67, 0, 85, 80, 11, 37, 34, 48, 81, 93, 97, 97, 29, 16, 14, 96, 30, 7, 55, 56, 34, 90, 99, 6}, + {58, 50, 16, 76, 70, 8, 47, 3, 9, 32, 49, 87, 69, 83, 35, 16, 75, 98, 79, 3, 13, 93, 65, 44, 100, 86, 66, 100, 75, 65, 5, 33, 81, 88, 75, 16, 97, 22, 86, 72, 54, 35, 58, 89, 17, 59, 71, 59, 56, 49, 28, 70, 41, 60, 80, 40, 45, 11, 5, 20, 42, 10, 19, 22, 99, 94, 5, 61, 82, 91, 32, 1, 25, 90, 57, 9, 49, 27, 34, 71, 43, 62, 40, 50, 21, 86, 91, 33, 98, 62, 53, 39, 73, 38, 28, 37, 98, 33, 98, 80}, + {90, 29, 47, 82, 85, 3, 57, 100, 98, 91, 71, 40, 18, 77, 90, 6, 63, 46, 39, 26, 8, 58, 31, 47, 96, 59, 84, 59, 58, 47, 38, 48, 76, 52, 96, 26, 55, 52, 26, 52, 42, 63, 58, 26, 5, 48, 32, 68, 60, 37, 60, 68, 95, 92, 14, 56, 16, 64, 15, 75, 10, 19, 89, 52, 71, 84, 79, 26, 1, 71, 44, 43, 100, 2, 35, 4, 16, 68, 39, 76, 4, 99, 10, 100, 56, 91, 21, 73, 55, 36, 13, 31, 56, 1, 84, 93, 51, 28, 85, 52}, + {65, 29, 61, 64, 98, 96, 68, 13, 29, 73, 55, 34, 38, 65, 100, 94, 56, 87, 32, 77, 23, 45, 7, 45, 12, 91, 37, 29, 85, 22, 47, 49, 17, 74, 12, 14, 70, 47, 94, 65, 86, 48, 99, 23, 13, 64, 84, 35, 51, 15, 11, 40, 27, 18, 51, 5, 76, 88, 1, 26, 76, 48, 76, 59, 22, 54, 73, 58, 67, 32, 22, 53, 81, 88, 76, 60, 17, 25, 95, 34, 7, 5, 40, 34, 90, 91, 5, 31, 45, 6, 58, 20, 21, 33, 80, 9, 53, 18, 67, 20}, + {51, 55, 73, 31, 42, 14, 57, 26, 40, 51, 60, 13, 22, 0, 47, 78, 91, 18, 9, 1, 92, 33, 22, 79, 32, 68, 88, 85, 86, 20, 71, 2, 75, 43, 100, 84, 24, 56, 9, 30, 6, 35, 43, 95, 1, 56, 73, 59, 40, 48, 60, 31, 81, 82, 9, 12, 15, 97, 63, 1, 83, 34, 70, 58, 43, 70, 41, 67, 25, 16, 63, 99, 17, 5, 93, 19, 27, 31, 78, 68, 79, 37, 99, 59, 86, 75, 37, 0, 37, 67, 68, 20, 0, 38, 78, 43, 7, 85, 77, 99}, + {67, 39, 97, 84, 11, 90, 2, 38, 20, 46, 5, 100, 50, 71, 24, 35, 45, 28, 1, 82, 95, 36, 68, 61, 40, 11, 70, 47, 62, 46, 11, 28, 52, 8, 79, 63, 98, 81, 67, 84, 94, 39, 49, 43, 9, 40, 78, 20, 68, 45, 68, 28, 81, 36, 89, 20, 47, 58, 33, 9, 71, 45, 37, 22, 53, 82, 51, 16, 29, 84, 100, 22, 22, 15, 65, 98, 55, 8, 17, 22, 19, 86, 16, 0, 21, 4, 87, 34, 28, 20, 43, 99, 31, 47, 87, 50, 28, 3, 66, 57}, + {88, 31, 45, 76, 46, 9, 74, 0, 84, 91, 89, 3, 42, 4, 3, 63, 8, 56, 98, 3, 76, 6, 1, 73, 53, 55, 22, 48, 58, 54, 71, 11, 86, 16, 88, 98, 92, 61, 99, 76, 17, 53, 79, 60, 58, 48, 89, 32, 3, 52, 35, 46, 59, 3, 18, 78, 24, 7, 92, 48, 61, 63, 60, 12, 79, 47, 10, 70, 74, 75, 11, 91, 27, 90, 16, 51, 3, 5, 84, 74, 57, 85, 19, 15, 54, 3, 60, 44, 10, 51, 93, 38, 13, 52, 50, 58, 65, 60, 28, 38}, + {34, 39, 95, 28, 96, 11, 79, 99, 16, 28, 38, 73, 80, 57, 55, 100, 27, 14, 44, 3, 65, 36, 41, 79, 54, 92, 2, 18, 17, 30, 56, 18, 36, 50, 46, 98, 27, 24, 62, 43, 19, 0, 83, 99, 23, 37, 98, 50, 51, 41, 20, 82, 43, 61, 26, 97, 18, 29, 14, 2, 25, 36, 20, 61, 53, 66, 24, 80, 56, 87, 90, 41, 87, 72, 39, 9, 8, 3, 26, 25, 44, 46, 73, 54, 73, 100, 50, 58, 95, 31, 60, 19, 67, 80, 47, 86, 11, 71, 32, 33}, + {23, 21, 75, 9, 93, 80, 86, 67, 83, 11, 58, 94, 23, 30, 47, 96, 96, 63, 19, 56, 94, 79, 42, 27, 24, 89, 12, 1, 25, 44, 35, 49, 65, 76, 58, 23, 21, 9, 90, 4, 87, 13, 64, 9, 10, 77, 72, 72, 39, 91, 28, 33, 70, 70, 60, 60, 24, 72, 62, 49, 83, 63, 64, 47, 4, 89, 37, 25, 98, 26, 96, 85, 6, 25, 94, 16, 1, 31, 54, 41, 22, 48, 74, 58, 17, 100, 17, 7, 71, 45, 57, 19, 74, 20, 67, 78, 75, 3, 70, 73}, + {96, 65, 57, 68, 57, 16, 50, 58, 14, 4, 99, 36, 52, 38, 60, 36, 37, 43, 43, 75, 89, 66, 94, 62, 53, 60, 6, 27, 29, 76, 100, 92, 6, 22, 59, 63, 5, 9, 21, 19, 13, 86, 21, 31, 24, 47, 67, 61, 90, 10, 35, 44, 42, 29, 73, 95, 55, 79, 22, 51, 54, 88, 42, 26, 10, 0, 56, 82, 9, 77, 67, 89, 28, 88, 20, 52, 34, 53, 80, 90, 29, 14, 34, 72, 9, 6, 66, 65, 85, 54, 82, 4, 42, 23, 97, 18, 23, 52, 100, 100}, + {95, 66, 54, 23, 19, 40, 75, 19, 60, 20, 8, 89, 35, 42, 60, 10, 48, 93, 41, 99, 46, 22, 69, 54, 45, 66, 38, 35, 17, 37, 0, 12, 69, 54, 35, 54, 61, 76, 73, 20, 97, 48, 8, 98, 90, 35, 7, 4, 94, 15, 69, 5, 37, 38, 60, 83, 3, 98, 84, 20, 1, 84, 99, 36, 3, 100, 57, 64, 76, 96, 50, 38, 43, 25, 35, 100, 60, 8, 70, 53, 23, 38, 58, 27, 42, 84, 76, 11, 48, 59, 99, 15, 8, 97, 51, 11, 97, 7, 42, 38}, + {70, 58, 76, 12, 83, 77, 11, 42, 51, 47, 61, 75, 86, 86, 68, 94, 69, 43, 5, 16, 1, 3, 31, 9, 100, 49, 87, 62, 22, 95, 100, 92, 53, 41, 71, 35, 17, 48, 44, 69, 96, 4, 9, 47, 56, 77, 40, 25, 86, 45, 7, 87, 48, 5, 62, 14, 20, 48, 76, 8, 43, 76, 67, 62, 16, 37, 97, 0, 85, 6, 35, 80, 78, 10, 26, 33, 53, 33, 24, 38, 78, 32, 24, 93, 3, 52, 6, 90, 100, 48, 98, 8, 90, 64, 70, 6, 67, 33, 73, 52}, + {39, 7, 98, 16, 84, 91, 16, 36, 23, 40, 74, 67, 38, 64, 59, 41, 15, 31, 97, 81, 80, 61, 56, 35, 24, 25, 41, 92, 24, 80, 9, 30, 53, 6, 12, 36, 97, 28, 72, 86, 69, 11, 53, 6, 75, 78, 14, 56, 76, 10, 37, 55, 37, 93, 56, 62, 84, 98, 19, 75, 43, 28, 4, 97, 0, 83, 32, 98, 11, 71, 49, 80, 82, 1, 52, 23, 80, 66, 45, 55, 43, 48, 76, 80, 40, 31, 7, 91, 95, 93, 31, 38, 20, 1, 0, 88, 84, 32, 51, 95}, + {2, 100, 40, 85, 1, 59, 74, 47, 91, 18, 68, 33, 67, 9, 80, 73, 6, 53, 29, 1, 46, 60, 5, 32, 61, 5, 86, 11, 3, 36, 72, 6, 36, 12, 57, 37, 71, 97, 50, 61, 14, 17, 61, 47, 93, 6, 20, 99, 25, 15, 66, 37, 76, 71, 36, 2, 42, 21, 80, 12, 58, 52, 18, 94, 30, 41, 97, 67, 3, 12, 94, 17, 96, 54, 31, 88, 26, 51, 86, 18, 66, 52, 55, 7, 89, 91, 77, 98, 79, 56, 9, 36, 74, 94, 96, 3, 34, 92, 70, 37}, + {3, 64, 20, 65, 84, 51, 52, 77, 68, 37, 95, 0, 55, 15, 7, 10, 6, 50, 7, 85, 73, 16, 87, 46, 9, 82, 50, 9, 39, 86, 12, 8, 49, 32, 73, 100, 50, 24, 76, 17, 27, 70, 17, 83, 51, 92, 93, 23, 7, 66, 74, 80, 82, 60, 26, 57, 41, 42, 66, 80, 27, 78, 88, 77, 76, 26, 42, 25, 50, 17, 9, 78, 53, 26, 26, 3, 84, 85, 27, 92, 50, 0, 71, 31, 27, 63, 88, 34, 4, 19, 14, 32, 97, 68, 75, 72, 95, 16, 64, 10}, + {100, 73, 88, 52, 65, 80, 21, 49, 64, 14, 6, 13, 15, 77, 10, 8, 6, 64, 42, 10, 83, 22, 8, 45, 91, 49, 84, 51, 65, 47, 27, 30, 86, 82, 82, 50, 61, 70, 65, 92, 84, 71, 71, 65, 14, 82, 73, 20, 11, 15, 97, 61, 37, 5, 72, 94, 54, 55, 10, 86, 68, 38, 15, 53, 19, 64, 70, 80, 33, 34, 37, 16, 72, 8, 82, 86, 56, 54, 5, 33, 69, 1, 94, 73, 73, 66, 66, 27, 87, 77, 79, 55, 14, 94, 74, 100, 57, 43, 45, 90}, + {44, 83, 73, 15, 91, 54, 0, 46, 74, 72, 79, 9, 39, 39, 82, 12, 71, 13, 5, 57, 90, 84, 11, 70, 77, 52, 69, 0, 95, 14, 56, 38, 63, 28, 19, 53, 48, 19, 65, 89, 57, 9, 98, 97, 14, 45, 8, 85, 58, 80, 42, 14, 63, 19, 50, 5, 71, 86, 72, 66, 66, 28, 70, 28, 56, 90, 81, 71, 75, 11, 59, 32, 87, 56, 28, 1, 67, 2, 86, 91, 82, 27, 71, 10, 47, 21, 82, 17, 6, 54, 49, 38, 82, 86, 66, 3, 75, 12, 74, 15}, + {23, 99, 47, 9, 20, 75, 10, 87, 43, 63, 44, 91, 90, 14, 0, 2, 35, 83, 87, 7, 2, 1, 45, 84, 87, 77, 53, 27, 89, 94, 43, 78, 92, 90, 88, 12, 31, 64, 65, 74, 93, 8, 65, 49, 23, 31, 51, 24, 80, 3, 99, 82, 5, 9, 31, 92, 87, 85, 19, 41, 78, 62, 19, 35, 17, 73, 13, 48, 2, 79, 89, 96, 53, 19, 44, 42, 50, 61, 67, 30, 65, 31, 78, 36, 40, 9, 94, 93, 60, 12, 34, 3, 40, 53, 38, 24, 92, 52, 72, 94}, + {97, 60, 89, 15, 79, 99, 58, 96, 26, 91, 92, 91, 21, 69, 93, 27, 44, 86, 20, 3, 65, 54, 6, 71, 73, 11, 95, 64, 29, 67, 23, 92, 93, 79, 6, 38, 77, 30, 33, 2, 20, 91, 59, 7, 59, 51, 1, 3, 3, 21, 73, 68, 41, 46, 4, 80, 57, 100, 9, 86, 32, 32, 43, 24, 10, 49, 28, 88, 80, 27, 56, 66, 17, 82, 40, 77, 32, 41, 46, 1, 28, 85, 35, 69, 30, 40, 14, 53, 39, 23, 4, 71, 55, 47, 61, 66, 97, 56, 19, 42}, + {83, 41, 74, 0, 22, 80, 77, 21, 20, 89, 22, 14, 73, 58, 83, 70, 98, 63, 22, 2, 86, 27, 39, 41, 40, 66, 73, 36, 21, 92, 44, 4, 32, 85, 4, 21, 64, 47, 42, 85, 1, 64, 65, 40, 88, 48, 9, 51, 77, 99, 53, 63, 92, 58, 3, 31, 24, 76, 34, 11, 33, 44, 15, 31, 28, 86, 52, 93, 99, 94, 43, 100, 24, 7, 40, 11, 21, 15, 63, 99, 13, 82, 61, 4, 40, 30, 2, 30, 72, 36, 41, 71, 80, 23, 1, 8, 8, 20, 67, 7} +}; + diff --git a/targets/wasm-tacle/sequential/dijkstra/input.h b/targets/wasm-tacle/sequential/dijkstra/input.h new file mode 100755 index 0000000..874073f --- /dev/null +++ b/targets/wasm-tacle/sequential/dijkstra/input.h @@ -0,0 +1,8 @@ +#ifndef INPUT_H +#define INPUT_H + +#define NUM_NODES 100 + +extern unsigned char dijkstra_AdjMatrix[ NUM_NODES ][ NUM_NODES ]; + +#endif /* INPUT_H */ diff --git a/targets/wasm-tacle/sequential/epic/CMakeLists.txt b/targets/wasm-tacle/sequential/epic/CMakeLists.txt new file mode 100644 index 0000000..458962c --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(epic) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/epic.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/epic.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/epic/ChangeLog.txt b/targets/wasm-tacle/sequential/epic/ChangeLog.txt new file mode 100755 index 0000000..5aad4f5 --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/ChangeLog.txt @@ -0,0 +1,56 @@ +Files: epic.c epic_data.h epic_data.c +Original provenience: MediaBench benchmark suite, + http://euler.slu.edu/~fritts/mediabench/mb1/index.html + +2016-02-03: +- Added TACLeBench header, also kept original copyright notice +- Removed commented-out code +- Removed seemingly unnecessary empty lines +- Removed unused function, variable, macro and type declarations except where + they may help understanding the program. +- Slightly changed wording of original comments to keep them in line with the + modified/removed code parts. +- Separated epic.c to epic.c and epic.h +- Added proper '#ifndef __EPIC_DATA_H_' and friends to epic_data.h +- Moved around all the following so that they are in the given order just after +the header + - macro definitions + - forward declaration of functions + - declaration of global variables +- Added a new main function that first calls init function then the old main + function sans init +- Annotated epic_main() as the entry point of the analysis +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: epic_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + +2016-10-10: +- removed unused parameter 'char *edges' in epic_internal_filter() +- included input data definition in epic.c, and removed epic_data.c and epic_data.h + +2016-10-12: +- added initial value to variable 'rt_edge_res_pos' (in case the first for loop +at line 775) is not executed) +- added initial value to variable 'first_col' (in case the first for loop +at line 775) is not executed) + +2016-10_14: +- added epic_return() function diff --git a/targets/wasm-tacle/sequential/epic/epic.c b/targets/wasm-tacle/sequential/epic/epic.c new file mode 100755 index 0000000..dc781d4 --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/epic.c @@ -0,0 +1,1136 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: epic + + Author: Designed by Eero P. Simoncelli and Edward H. Adelson + Written by Eero P. Simoncelli + Developed at the Vision Science Group, The Media Laboratory + Copyright 1989, Massachusetts Institute of Technology + All rights reserved. + + Function: Efficient Pyramid Image Coder + + Source: MediaBench + + + Original name: epic + + Changes: no major functional changes + + License: + Permission to use, copy, or modify this software and its documentation + for educational and research purposes only and without fee is hereby + granted, provided that this copyright notice appear on all copies and + supporting documentation. For any other uses of this software, in + original or modified form, including but not limited to distribution + in whole or in part, specific prior permission must be obtained from + M.I.T. and the authors. These programs shall not be used, rewritten, + or adapted as the basis of a commercial software or hardware product + without first obtaining appropriate licenses from M.I.T. M.I.T. makes + no representations about the suitability of this software for any + purpose. It is provided "as is" without express or implied warranty. +*/ + + +#include "epic.h" + +#define X_SIZE 64 +#define Y_SIZE 64 + +float epic_image[ ] = { + 0x89, 0x88, 0x87, 0x86, 0x89, 0x87, 0x84, 0x86, + 0x83, 0x89, 0x82, 0x83, 0x84, 0x81, 0x80, 0x80, + 0x81, 0x83, 0x88, 0x8A, 0x8E, 0x90, 0x96, 0x98, + 0x95, 0x92, 0x93, 0x88, 0x78, 0x7B, 0x60, 0x52, + 0x41, 0x3F, 0x3A, 0x46, 0x46, 0x48, 0x49, 0x48, + 0x4F, 0x4A, 0x49, 0x50, 0x4C, 0x4B, 0x4D, 0x4C, + 0x4E, 0x4E, 0x4A, 0x49, 0x4D, 0x54, 0x50, 0x59, + 0x51, 0x5A, 0x5E, 0x5A, 0x5D, 0x61, 0x59, 0x65, + 0x63, 0x65, 0x60, 0x62, 0x68, 0x67, 0x64, 0x61, + 0x64, 0x5E, 0x66, 0x63, 0x63, 0x61, 0x67, 0x68, + 0x62, 0x64, 0x66, 0x67, 0x64, 0x63, 0x66, 0x64, + 0x67, 0x66, 0x65, 0x64, 0x64, 0x6A, 0x66, 0x65, + 0x68, 0x66, 0x69, 0x67, 0x6A, 0x66, 0x68, 0x66, + 0x6C, 0x65, 0x69, 0x64, 0x65, 0x64, 0x66, 0x62, + 0x63, 0x68, 0x68, 0x65, 0x64, 0x64, 0x62, 0x63, + 0x68, 0x65, 0x66, 0x69, 0x66, 0x65, 0x61, 0x66, + 0x6E, 0x69, 0x64, 0x61, 0x63, 0x63, 0x66, 0x63, + 0x62, 0x64, 0x60, 0x68, 0x63, 0x61, 0x62, 0x65, + 0x60, 0x63, 0x60, 0x62, 0x60, 0x5E, 0x61, 0x62, + 0x5D, 0x5C, 0x57, 0x5B, 0x58, 0x53, 0x54, 0x47, + 0x49, 0x54, 0x5C, 0x6B, 0x6F, 0x77, 0x7F, 0x80, + 0x88, 0x8A, 0x8C, 0x85, 0x7A, 0x7D, 0x7F, 0x7D, + 0x80, 0x80, 0x81, 0x80, 0x85, 0x82, 0x81, 0x7E, + 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7E, 0x83, 0x7F, + 0x81, 0x83, 0x87, 0x82, 0x83, 0x88, 0x84, 0x82, + 0x82, 0x8A, 0xB3, 0xC5, 0xCD, 0xCF, 0xD4, 0xD3, + 0xD6, 0xCC, 0xB5, 0x80, 0x4E, 0x48, 0x4D, 0x4D, + 0x57, 0x5A, 0x59, 0x5C, 0x62, 0x58, 0x5C, 0x5B, + 0x5B, 0x62, 0x5D, 0x5C, 0x59, 0x5C, 0x5A, 0x59, + 0x5D, 0x5F, 0x5B, 0x5F, 0x60, 0x5E, 0x5E, 0x57, + 0x5F, 0x5F, 0x60, 0x61, 0x5C, 0x61, 0x60, 0x5B, + 0x56, 0x56, 0x57, 0x58, 0x6E, 0x91, 0x96, 0x7E, + 0x89, 0x88, 0x87, 0x86, 0x8A, 0x87, 0x84, 0x87, + 0x83, 0x89, 0x82, 0x83, 0x84, 0x81, 0x80, 0x80, + 0x81, 0x83, 0x88, 0x8A, 0x8E, 0x90, 0x96, 0x98, + 0x94, 0x93, 0x93, 0x88, 0x78, 0x7B, 0x60, 0x52, + 0x41, 0x3F, 0x39, 0x46, 0x46, 0x48, 0x49, 0x47, + 0x50, 0x4A, 0x49, 0x50, 0x4D, 0x4B, 0x4D, 0x4C, + 0x4E, 0x4E, 0x4A, 0x49, 0x4E, 0x54, 0x4F, 0x59, + 0x51, 0x5A, 0x5E, 0x5A, 0x5D, 0x61, 0x59, 0x65, + 0x63, 0x65, 0x5F, 0x62, 0x68, 0x67, 0x64, 0x61, + 0x64, 0x5E, 0x66, 0x63, 0x63, 0x61, 0x67, 0x69, + 0x61, 0x63, 0x66, 0x67, 0x65, 0x63, 0x66, 0x64, + 0x67, 0x67, 0x65, 0x64, 0x64, 0x6A, 0x66, 0x65, + 0x68, 0x66, 0x69, 0x67, 0x6A, 0x67, 0x69, 0x66, + 0x6C, 0x65, 0x69, 0x64, 0x65, 0x64, 0x66, 0x62, + 0x63, 0x68, 0x68, 0x66, 0x64, 0x64, 0x62, 0x63, + 0x68, 0x65, 0x66, 0x6A, 0x67, 0x65, 0x60, 0x66, + 0x6F, 0x6A, 0x64, 0x61, 0x64, 0x63, 0x66, 0x63, + 0x62, 0x64, 0x60, 0x69, 0x64, 0x61, 0x62, 0x65, + 0x60, 0x63, 0x60, 0x62, 0x60, 0x5E, 0x61, 0x62, + 0x5D, 0x5C, 0x57, 0x5B, 0x59, 0x53, 0x54, 0x47, + 0x49, 0x54, 0x5C, 0x6B, 0x6F, 0x77, 0x7F, 0x80, + 0x88, 0x8A, 0x8C, 0x85, 0x7A, 0x7D, 0x7F, 0x7C, + 0x80, 0x80, 0x81, 0x80, 0x85, 0x82, 0x81, 0x7E, + 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7E, 0x83, 0x7F, + 0x81, 0x83, 0x87, 0x81, 0x83, 0x88, 0x84, 0x82, + 0x82, 0x8A, 0xB5, 0xC5, 0xCD, 0xCF, 0xD4, 0xD3, + 0xD6, 0xCC, 0xB4, 0x7E, 0x4D, 0x48, 0x4E, 0x4D, + 0x57, 0x5A, 0x59, 0x5C, 0x62, 0x58, 0x5C, 0x5B, + 0x5B, 0x62, 0x5D, 0x5C, 0x59, 0x5C, 0x5A, 0x59, + 0x5D, 0x5F, 0x5B, 0x5F, 0x60, 0x5E, 0x5E, 0x57, + 0x5F, 0x5F, 0x60, 0x61, 0x5C, 0x61, 0x60, 0x5B, + 0x56, 0x56, 0x57, 0x58, 0x6F, 0x94, 0x9A, 0x82, + 0x88, 0x89, 0x87, 0x86, 0x88, 0x86, 0x84, 0x85, + 0x82, 0x87, 0x82, 0x81, 0x83, 0x81, 0x7F, 0x80, + 0x82, 0x82, 0x87, 0x8A, 0x8F, 0x90, 0x95, 0x98, + 0x95, 0x92, 0x92, 0x88, 0x79, 0x77, 0x5F, 0x51, + 0x41, 0x3E, 0x3B, 0x44, 0x44, 0x46, 0x49, 0x4A, + 0x4C, 0x49, 0x49, 0x4E, 0x4A, 0x4A, 0x4E, 0x4A, + 0x4D, 0x4D, 0x48, 0x4A, 0x4C, 0x52, 0x52, 0x58, + 0x52, 0x59, 0x5E, 0x5A, 0x5D, 0x5F, 0x59, 0x64, + 0x64, 0x64, 0x62, 0x61, 0x66, 0x66, 0x64, 0x60, + 0x62, 0x5F, 0x65, 0x63, 0x62, 0x62, 0x65, 0x66, + 0x62, 0x65, 0x67, 0x66, 0x64, 0x64, 0x65, 0x65, + 0x66, 0x65, 0x65, 0x63, 0x63, 0x67, 0x65, 0x64, + 0x67, 0x67, 0x68, 0x66, 0x6A, 0x66, 0x67, 0x66, + 0x6C, 0x65, 0x6A, 0x64, 0x64, 0x63, 0x66, 0x62, + 0x63, 0x67, 0x69, 0x65, 0x64, 0x63, 0x62, 0x63, + 0x68, 0x65, 0x66, 0x69, 0x66, 0x65, 0x61, 0x65, + 0x6C, 0x69, 0x64, 0x61, 0x62, 0x62, 0x64, 0x63, + 0x61, 0x63, 0x60, 0x66, 0x63, 0x61, 0x62, 0x65, + 0x60, 0x62, 0x60, 0x62, 0x60, 0x5E, 0x60, 0x61, + 0x5C, 0x5C, 0x59, 0x5B, 0x57, 0x53, 0x52, 0x47, + 0x48, 0x54, 0x5C, 0x69, 0x6E, 0x77, 0x7D, 0x80, + 0x88, 0x89, 0x8C, 0x84, 0x7B, 0x7D, 0x7E, 0x7D, + 0x7F, 0x80, 0x81, 0x7F, 0x85, 0x82, 0x80, 0x7E, + 0x7F, 0x7E, 0x7F, 0x7F, 0x7E, 0x7F, 0x82, 0x7F, + 0x81, 0x83, 0x86, 0x82, 0x83, 0x87, 0x84, 0x82, + 0x81, 0x88, 0xB0, 0xC5, 0xCD, 0xCF, 0xD4, 0xD4, + 0xD6, 0xCD, 0xB8, 0x86, 0x51, 0x47, 0x4B, 0x4D, + 0x56, 0x59, 0x59, 0x5B, 0x5F, 0x59, 0x5C, 0x5D, + 0x5B, 0x62, 0x5D, 0x5B, 0x5B, 0x5C, 0x5B, 0x5A, + 0x5E, 0x5F, 0x5D, 0x5F, 0x60, 0x5D, 0x5F, 0x58, + 0x5E, 0x5F, 0x5F, 0x5F, 0x5B, 0x60, 0x60, 0x5C, + 0x57, 0x56, 0x59, 0x5B, 0x6E, 0x8A, 0x87, 0x6C, + 0x84, 0x88, 0x86, 0x84, 0x87, 0x85, 0x84, 0x82, + 0x80, 0x84, 0x82, 0x7E, 0x82, 0x7F, 0x7C, 0x80, + 0x84, 0x80, 0x84, 0x8B, 0x90, 0x92, 0x93, 0x95, + 0x97, 0x91, 0x8E, 0x86, 0x79, 0x6F, 0x5B, 0x4F, + 0x41, 0x3A, 0x3D, 0x3F, 0x40, 0x42, 0x48, 0x4B, + 0x46, 0x48, 0x47, 0x4A, 0x46, 0x49, 0x4D, 0x48, + 0x48, 0x4D, 0x46, 0x4C, 0x4B, 0x4F, 0x55, 0x55, + 0x54, 0x58, 0x5D, 0x5B, 0x5D, 0x5C, 0x5A, 0x61, + 0x62, 0x60, 0x65, 0x61, 0x63, 0x65, 0x64, 0x5F, + 0x60, 0x61, 0x63, 0x63, 0x61, 0x63, 0x61, 0x63, + 0x64, 0x66, 0x67, 0x66, 0x64, 0x65, 0x65, 0x67, + 0x64, 0x64, 0x66, 0x63, 0x62, 0x64, 0x63, 0x62, + 0x65, 0x67, 0x66, 0x65, 0x68, 0x65, 0x64, 0x64, + 0x69, 0x63, 0x69, 0x65, 0x63, 0x61, 0x63, 0x61, + 0x63, 0x68, 0x6B, 0x65, 0x63, 0x61, 0x62, 0x64, + 0x66, 0x64, 0x65, 0x66, 0x63, 0x63, 0x63, 0x65, + 0x65, 0x67, 0x65, 0x60, 0x60, 0x5E, 0x60, 0x64, + 0x5E, 0x63, 0x60, 0x61, 0x5F, 0x60, 0x61, 0x63, + 0x62, 0x62, 0x5E, 0x60, 0x61, 0x60, 0x5E, 0x5D, + 0x5C, 0x5D, 0x5C, 0x5A, 0x54, 0x51, 0x4E, 0x4A, + 0x46, 0x50, 0x59, 0x62, 0x6A, 0x75, 0x79, 0x80, + 0x86, 0x86, 0x8B, 0x83, 0x7F, 0x7E, 0x7E, 0x7E, + 0x7E, 0x81, 0x81, 0x7E, 0x83, 0x82, 0x80, 0x80, + 0x7F, 0x7F, 0x7F, 0x81, 0x81, 0x81, 0x7F, 0x7E, + 0x80, 0x82, 0x84, 0x83, 0x81, 0x84, 0x83, 0x82, + 0x7F, 0x82, 0x9D, 0xBD, 0xC9, 0xCE, 0xD2, 0xD4, + 0xD6, 0xD2, 0xC4, 0xA1, 0x68, 0x49, 0x48, 0x4D, + 0x54, 0x56, 0x59, 0x5A, 0x5A, 0x5B, 0x5B, 0x60, + 0x5B, 0x60, 0x5B, 0x5B, 0x5C, 0x5C, 0x5D, 0x5D, + 0x60, 0x5C, 0x5E, 0x5E, 0x5E, 0x5B, 0x5E, 0x5C, + 0x5D, 0x5E, 0x5F, 0x5C, 0x5C, 0x60, 0x61, 0x5E, + 0x5A, 0x58, 0x5F, 0x62, 0x5F, 0x5D, 0x48, 0x32, + 0x81, 0x85, 0x85, 0x81, 0x86, 0x83, 0x84, 0x80, + 0x7F, 0x84, 0x83, 0x7E, 0x80, 0x7E, 0x7D, 0x80, + 0x82, 0x7F, 0x85, 0x8D, 0x91, 0x93, 0x92, 0x95, + 0x95, 0x8F, 0x8C, 0x84, 0x76, 0x6B, 0x5D, 0x50, + 0x41, 0x38, 0x39, 0x3B, 0x41, 0x41, 0x46, 0x47, + 0x45, 0x47, 0x44, 0x47, 0x45, 0x4A, 0x49, 0x48, + 0x45, 0x4C, 0x48, 0x4C, 0x4E, 0x4E, 0x51, 0x56, + 0x56, 0x59, 0x5A, 0x5C, 0x5C, 0x5E, 0x5A, 0x60, + 0x5D, 0x60, 0x62, 0x61, 0x63, 0x64, 0x62, 0x5F, + 0x61, 0x62, 0x64, 0x62, 0x61, 0x64, 0x61, 0x64, + 0x63, 0x65, 0x65, 0x67, 0x63, 0x66, 0x65, 0x64, + 0x63, 0x65, 0x66, 0x61, 0x60, 0x67, 0x64, 0x62, + 0x63, 0x65, 0x64, 0x65, 0x65, 0x63, 0x62, 0x63, + 0x63, 0x61, 0x67, 0x66, 0x63, 0x5F, 0x5E, 0x60, + 0x63, 0x66, 0x6A, 0x64, 0x62, 0x60, 0x64, 0x63, + 0x65, 0x62, 0x62, 0x62, 0x60, 0x62, 0x63, 0x63, + 0x61, 0x64, 0x65, 0x60, 0x60, 0x5D, 0x61, 0x62, + 0x5D, 0x61, 0x5E, 0x60, 0x5C, 0x60, 0x5F, 0x60, + 0x61, 0x61, 0x5F, 0x60, 0x61, 0x61, 0x5E, 0x5D, + 0x5D, 0x5B, 0x5A, 0x58, 0x52, 0x51, 0x4E, 0x4D, + 0x47, 0x4A, 0x51, 0x5B, 0x66, 0x70, 0x76, 0x7C, + 0x81, 0x84, 0x8A, 0x85, 0x81, 0x80, 0x7F, 0x7C, + 0x7F, 0x82, 0x82, 0x81, 0x82, 0x82, 0x81, 0x84, + 0x80, 0x82, 0x81, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x81, 0x82, 0x81, 0x82, 0x7F, 0x81, 0x80, 0x81, + 0x7F, 0x7D, 0x86, 0xAB, 0xC1, 0xCB, 0xCF, 0xD2, + 0xD3, 0xD5, 0xCF, 0xBA, 0x8A, 0x57, 0x48, 0x4D, + 0x51, 0x52, 0x55, 0x5A, 0x5A, 0x5B, 0x59, 0x5F, + 0x59, 0x5C, 0x59, 0x5C, 0x5A, 0x5A, 0x5B, 0x5C, + 0x5F, 0x5C, 0x5D, 0x5B, 0x5D, 0x5C, 0x5C, 0x5E, + 0x5C, 0x5D, 0x61, 0x5E, 0x5D, 0x5F, 0x62, 0x61, + 0x61, 0x5F, 0x60, 0x5A, 0x3D, 0x28, 0x19, 0x13, + 0x82, 0x84, 0x83, 0x7F, 0x84, 0x83, 0x83, 0x81, + 0x80, 0x83, 0x84, 0x82, 0x7F, 0x7F, 0x80, 0x7F, + 0x81, 0x83, 0x87, 0x8E, 0x92, 0x91, 0x93, 0x94, + 0x91, 0x8F, 0x8E, 0x83, 0x72, 0x6A, 0x60, 0x4F, + 0x3F, 0x36, 0x37, 0x3D, 0x42, 0x3F, 0x43, 0x47, + 0x45, 0x45, 0x46, 0x46, 0x47, 0x4B, 0x44, 0x46, + 0x44, 0x47, 0x48, 0x4B, 0x51, 0x4D, 0x4F, 0x56, + 0x56, 0x5A, 0x5A, 0x5B, 0x5B, 0x5D, 0x5B, 0x5F, + 0x5C, 0x62, 0x5D, 0x61, 0x62, 0x63, 0x60, 0x63, + 0x62, 0x63, 0x64, 0x60, 0x61, 0x64, 0x60, 0x66, + 0x5F, 0x63, 0x65, 0x67, 0x63, 0x63, 0x63, 0x63, + 0x63, 0x65, 0x63, 0x61, 0x62, 0x66, 0x63, 0x63, + 0x62, 0x63, 0x61, 0x62, 0x64, 0x61, 0x64, 0x63, + 0x61, 0x64, 0x66, 0x63, 0x63, 0x5E, 0x5D, 0x5E, + 0x63, 0x61, 0x64, 0x63, 0x63, 0x60, 0x63, 0x62, + 0x64, 0x62, 0x63, 0x61, 0x62, 0x61, 0x63, 0x60, + 0x61, 0x61, 0x63, 0x63, 0x61, 0x62, 0x62, 0x60, + 0x5E, 0x5F, 0x5F, 0x61, 0x5D, 0x61, 0x5F, 0x5F, + 0x5F, 0x5E, 0x61, 0x60, 0x5F, 0x5F, 0x62, 0x61, + 0x5D, 0x5A, 0x56, 0x58, 0x54, 0x52, 0x51, 0x4F, + 0x4C, 0x47, 0x4B, 0x57, 0x61, 0x6C, 0x72, 0x79, + 0x7E, 0x82, 0x89, 0x87, 0x82, 0x82, 0x7F, 0x7E, + 0x80, 0x82, 0x86, 0x84, 0x85, 0x84, 0x83, 0x85, + 0x82, 0x82, 0x82, 0x80, 0x81, 0x83, 0x82, 0x80, + 0x80, 0x83, 0x80, 0x81, 0x7F, 0x81, 0x7F, 0x81, + 0x83, 0x7A, 0x7D, 0x95, 0xB7, 0xC6, 0xCD, 0xD0, + 0xD3, 0xD5, 0xD4, 0xC9, 0xA9, 0x73, 0x4B, 0x48, + 0x4D, 0x50, 0x53, 0x57, 0x59, 0x5A, 0x57, 0x5C, + 0x5B, 0x5A, 0x59, 0x5B, 0x59, 0x58, 0x58, 0x5A, + 0x5F, 0x5D, 0x5B, 0x58, 0x5D, 0x5A, 0x5C, 0x5D, + 0x5D, 0x5E, 0x5E, 0x5F, 0x5C, 0x5D, 0x62, 0x65, + 0x66, 0x65, 0x55, 0x3D, 0x20, 0x13, 0x12, 0x17, + 0x83, 0x83, 0x80, 0x81, 0x84, 0x82, 0x81, 0x81, + 0x81, 0x83, 0x81, 0x83, 0x7F, 0x80, 0x80, 0x7E, + 0x83, 0x8A, 0x8A, 0x90, 0x93, 0x91, 0x92, 0x92, + 0x8F, 0x90, 0x8D, 0x83, 0x71, 0x69, 0x5D, 0x4D, + 0x41, 0x37, 0x37, 0x3F, 0x3C, 0x3F, 0x42, 0x48, + 0x44, 0x46, 0x49, 0x4B, 0x4A, 0x4A, 0x41, 0x45, + 0x45, 0x44, 0x44, 0x48, 0x50, 0x4C, 0x51, 0x53, + 0x57, 0x57, 0x5A, 0x5A, 0x5D, 0x5B, 0x5D, 0x5D, + 0x5C, 0x5E, 0x5E, 0x62, 0x5E, 0x62, 0x60, 0x65, + 0x63, 0x63, 0x61, 0x5F, 0x61, 0x63, 0x5E, 0x65, + 0x5E, 0x61, 0x66, 0x63, 0x63, 0x61, 0x63, 0x65, + 0x61, 0x62, 0x62, 0x64, 0x64, 0x63, 0x62, 0x62, + 0x60, 0x63, 0x62, 0x61, 0x64, 0x61, 0x64, 0x63, + 0x62, 0x66, 0x66, 0x63, 0x64, 0x5E, 0x60, 0x5F, + 0x63, 0x62, 0x60, 0x63, 0x62, 0x60, 0x62, 0x62, + 0x64, 0x66, 0x66, 0x63, 0x65, 0x61, 0x65, 0x61, + 0x60, 0x61, 0x61, 0x64, 0x61, 0x63, 0x63, 0x61, + 0x61, 0x5F, 0x61, 0x61, 0x5F, 0x62, 0x5E, 0x60, + 0x5F, 0x5B, 0x5F, 0x61, 0x5E, 0x5F, 0x65, 0x60, + 0x5A, 0x5B, 0x58, 0x59, 0x56, 0x53, 0x52, 0x50, + 0x4E, 0x4B, 0x47, 0x51, 0x5A, 0x67, 0x6E, 0x77, + 0x7B, 0x7F, 0x87, 0x87, 0x86, 0x84, 0x82, 0x83, + 0x83, 0x83, 0x86, 0x87, 0x89, 0x88, 0x87, 0x84, + 0x84, 0x83, 0x80, 0x80, 0x81, 0x84, 0x81, 0x81, + 0x80, 0x81, 0x7F, 0x7F, 0x7F, 0x82, 0x80, 0x81, + 0x84, 0x7C, 0x7E, 0x82, 0xA5, 0xC0, 0xCA, 0xCF, + 0xD3, 0xD5, 0xD5, 0xD2, 0xBF, 0x96, 0x5C, 0x47, + 0x4B, 0x4E, 0x50, 0x55, 0x55, 0x58, 0x57, 0x5A, + 0x5D, 0x5A, 0x5C, 0x59, 0x5C, 0x55, 0x57, 0x5B, + 0x60, 0x5B, 0x5B, 0x59, 0x5B, 0x5B, 0x5F, 0x5B, + 0x5D, 0x5E, 0x5B, 0x5D, 0x5D, 0x5D, 0x65, 0x68, + 0x63, 0x5A, 0x3A, 0x23, 0x19, 0x12, 0x17, 0x19, + 0x83, 0x83, 0x81, 0x84, 0x82, 0x80, 0x82, 0x81, + 0x81, 0x81, 0x80, 0x81, 0x80, 0x7F, 0x7E, 0x82, + 0x86, 0x8C, 0x90, 0x91, 0x91, 0x92, 0x91, 0x92, + 0x90, 0x8F, 0x87, 0x82, 0x72, 0x69, 0x5D, 0x4E, + 0x42, 0x39, 0x37, 0x3E, 0x3A, 0x42, 0x44, 0x43, + 0x46, 0x4B, 0x49, 0x4E, 0x4A, 0x49, 0x42, 0x48, + 0x48, 0x44, 0x42, 0x45, 0x4C, 0x4D, 0x51, 0x51, + 0x55, 0x56, 0x5A, 0x5C, 0x5E, 0x5C, 0x5C, 0x5F, + 0x5D, 0x5C, 0x60, 0x60, 0x5C, 0x62, 0x62, 0x64, + 0x63, 0x61, 0x61, 0x60, 0x61, 0x61, 0x60, 0x63, + 0x61, 0x61, 0x65, 0x62, 0x62, 0x65, 0x65, 0x65, + 0x61, 0x62, 0x64, 0x65, 0x66, 0x63, 0x64, 0x5F, + 0x5F, 0x62, 0x65, 0x64, 0x64, 0x63, 0x62, 0x65, + 0x63, 0x64, 0x65, 0x62, 0x65, 0x60, 0x63, 0x60, + 0x61, 0x66, 0x61, 0x64, 0x5F, 0x60, 0x63, 0x62, + 0x64, 0x67, 0x66, 0x67, 0x66, 0x61, 0x65, 0x64, + 0x60, 0x65, 0x61, 0x62, 0x61, 0x60, 0x64, 0x5F, + 0x63, 0x61, 0x60, 0x5F, 0x5F, 0x5E, 0x5D, 0x60, + 0x61, 0x5D, 0x60, 0x61, 0x60, 0x60, 0x62, 0x5F, + 0x59, 0x5D, 0x5B, 0x5A, 0x57, 0x54, 0x51, 0x56, + 0x4E, 0x4E, 0x48, 0x4C, 0x55, 0x60, 0x6E, 0x75, + 0x79, 0x7D, 0x84, 0x87, 0x89, 0x89, 0x87, 0x85, + 0x84, 0x86, 0x87, 0x8A, 0x89, 0x8A, 0x8A, 0x85, + 0x82, 0x84, 0x82, 0x81, 0x83, 0x83, 0x7D, 0x80, + 0x80, 0x7E, 0x7F, 0x7C, 0x7E, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x7B, 0x8D, 0xB5, 0xC5, 0xCC, + 0xD2, 0xD4, 0xD5, 0xD6, 0xCC, 0xB4, 0x7F, 0x4E, + 0x4C, 0x4B, 0x4F, 0x51, 0x56, 0x55, 0x54, 0x59, + 0x5C, 0x59, 0x5D, 0x59, 0x5B, 0x57, 0x57, 0x5D, + 0x5D, 0x58, 0x5D, 0x5D, 0x5A, 0x5F, 0x61, 0x5D, + 0x5F, 0x5E, 0x5D, 0x60, 0x60, 0x63, 0x69, 0x62, + 0x50, 0x38, 0x1D, 0x1A, 0x1C, 0x17, 0x19, 0x18, + 0x81, 0x82, 0x83, 0x82, 0x81, 0x7E, 0x83, 0x83, + 0x80, 0x82, 0x82, 0x80, 0x80, 0x7D, 0x80, 0x88, + 0x8A, 0x8D, 0x93, 0x8F, 0x91, 0x91, 0x90, 0x8F, + 0x90, 0x8C, 0x84, 0x81, 0x71, 0x69, 0x5E, 0x4B, + 0x40, 0x3A, 0x38, 0x3B, 0x3B, 0x45, 0x44, 0x3E, + 0x46, 0x4B, 0x4A, 0x4B, 0x45, 0x47, 0x45, 0x49, + 0x44, 0x45, 0x42, 0x47, 0x4A, 0x4F, 0x52, 0x51, + 0x53, 0x57, 0x59, 0x5D, 0x5B, 0x5E, 0x5A, 0x60, + 0x5F, 0x5F, 0x5F, 0x61, 0x5C, 0x61, 0x64, 0x63, + 0x62, 0x60, 0x62, 0x62, 0x63, 0x60, 0x61, 0x60, + 0x64, 0x64, 0x66, 0x63, 0x61, 0x68, 0x65, 0x65, + 0x63, 0x66, 0x65, 0x63, 0x65, 0x63, 0x64, 0x61, + 0x60, 0x60, 0x62, 0x66, 0x64, 0x61, 0x63, 0x65, + 0x64, 0x62, 0x66, 0x60, 0x67, 0x63, 0x61, 0x5E, + 0x5D, 0x66, 0x65, 0x63, 0x60, 0x60, 0x61, 0x62, + 0x66, 0x68, 0x66, 0x6B, 0x65, 0x62, 0x65, 0x63, + 0x63, 0x64, 0x63, 0x62, 0x60, 0x61, 0x62, 0x5D, + 0x62, 0x62, 0x61, 0x5E, 0x5F, 0x5A, 0x5E, 0x5E, + 0x61, 0x60, 0x62, 0x60, 0x62, 0x5E, 0x5F, 0x60, + 0x5E, 0x5F, 0x59, 0x5B, 0x56, 0x54, 0x51, 0x59, + 0x4E, 0x4E, 0x49, 0x47, 0x52, 0x5B, 0x6B, 0x72, + 0x76, 0x7C, 0x82, 0x86, 0x87, 0x8E, 0x89, 0x85, + 0x85, 0x87, 0x88, 0x8D, 0x89, 0x89, 0x8A, 0x89, + 0x82, 0x84, 0x85, 0x86, 0x86, 0x80, 0x7E, 0x7E, + 0x7E, 0x7F, 0x81, 0x7D, 0x7F, 0x7C, 0x7E, 0x7D, + 0x7E, 0x80, 0x7D, 0x7C, 0x7B, 0x9F, 0xBD, 0xC9, + 0xD0, 0xD3, 0xD5, 0xD6, 0xD3, 0xC6, 0xA3, 0x64, + 0x4C, 0x47, 0x50, 0x4D, 0x58, 0x53, 0x52, 0x58, + 0x59, 0x5A, 0x5C, 0x59, 0x5B, 0x5E, 0x58, 0x5E, + 0x5B, 0x5D, 0x5F, 0x5C, 0x5B, 0x60, 0x63, 0x5F, + 0x62, 0x62, 0x60, 0x64, 0x65, 0x68, 0x63, 0x4F, + 0x30, 0x17, 0x14, 0x13, 0x17, 0x1A, 0x15, 0x17, + 0x82, 0x83, 0x83, 0x80, 0x82, 0x7F, 0x83, 0x86, + 0x83, 0x86, 0x81, 0x81, 0x80, 0x7F, 0x85, 0x88, + 0x8C, 0x8F, 0x92, 0x8E, 0x93, 0x8F, 0x8E, 0x8B, + 0x8E, 0x8A, 0x85, 0x7E, 0x71, 0x68, 0x5E, 0x4F, + 0x42, 0x3E, 0x38, 0x39, 0x3D, 0x45, 0x42, 0x42, + 0x44, 0x47, 0x4B, 0x49, 0x45, 0x46, 0x47, 0x46, + 0x42, 0x45, 0x44, 0x48, 0x4A, 0x50, 0x52, 0x51, + 0x55, 0x54, 0x57, 0x5A, 0x5A, 0x5D, 0x57, 0x5F, + 0x5E, 0x60, 0x5D, 0x61, 0x5E, 0x61, 0x64, 0x62, + 0x60, 0x62, 0x62, 0x63, 0x63, 0x62, 0x62, 0x61, + 0x63, 0x62, 0x65, 0x63, 0x60, 0x65, 0x64, 0x63, + 0x64, 0x66, 0x64, 0x61, 0x62, 0x64, 0x63, 0x63, + 0x63, 0x5F, 0x61, 0x67, 0x62, 0x61, 0x64, 0x63, + 0x63, 0x62, 0x65, 0x61, 0x68, 0x61, 0x63, 0x61, + 0x5D, 0x65, 0x68, 0x62, 0x60, 0x5E, 0x5E, 0x63, + 0x67, 0x69, 0x68, 0x69, 0x69, 0x64, 0x65, 0x64, + 0x65, 0x61, 0x64, 0x64, 0x64, 0x62, 0x62, 0x5C, + 0x60, 0x62, 0x63, 0x61, 0x61, 0x5B, 0x5C, 0x5C, + 0x60, 0x60, 0x61, 0x5F, 0x63, 0x5B, 0x5D, 0x60, + 0x61, 0x5F, 0x5B, 0x5C, 0x5A, 0x53, 0x52, 0x56, + 0x4E, 0x4C, 0x48, 0x44, 0x4E, 0x5A, 0x65, 0x6F, + 0x74, 0x7C, 0x81, 0x85, 0x85, 0x8E, 0x88, 0x87, + 0x88, 0x87, 0x88, 0x8E, 0x89, 0x8A, 0x8A, 0x8B, + 0x86, 0x83, 0x84, 0x87, 0x86, 0x83, 0x80, 0x7F, + 0x7F, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7F, + 0x80, 0x7D, 0x7C, 0x7C, 0x78, 0x84, 0xAD, 0xC3, + 0xCC, 0xD2, 0xD4, 0xD6, 0xD6, 0xCF, 0xB9, 0x87, + 0x54, 0x47, 0x51, 0x4D, 0x56, 0x53, 0x54, 0x59, + 0x57, 0x5B, 0x5E, 0x5B, 0x5E, 0x61, 0x5A, 0x5E, + 0x5A, 0x63, 0x5D, 0x5D, 0x5F, 0x5E, 0x62, 0x5F, + 0x62, 0x65, 0x63, 0x68, 0x6A, 0x63, 0x4D, 0x33, + 0x17, 0x12, 0x1B, 0x11, 0x16, 0x18, 0x14, 0x16, + 0x84, 0x83, 0x82, 0x7F, 0x83, 0x81, 0x82, 0x86, + 0x86, 0x85, 0x80, 0x83, 0x7E, 0x80, 0x85, 0x86, + 0x8C, 0x90, 0x8F, 0x8E, 0x93, 0x8C, 0x8C, 0x8B, + 0x88, 0x88, 0x84, 0x7C, 0x74, 0x68, 0x62, 0x5B, + 0x45, 0x3F, 0x38, 0x3A, 0x3F, 0x42, 0x41, 0x45, + 0x4D, 0x46, 0x49, 0x48, 0x44, 0x47, 0x45, 0x43, + 0x47, 0x46, 0x45, 0x45, 0x4B, 0x51, 0x50, 0x52, + 0x57, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x57, 0x5E, + 0x5B, 0x5E, 0x5E, 0x60, 0x61, 0x60, 0x63, 0x61, + 0x5E, 0x63, 0x61, 0x63, 0x62, 0x63, 0x63, 0x62, + 0x61, 0x61, 0x63, 0x64, 0x60, 0x60, 0x64, 0x61, + 0x63, 0x61, 0x63, 0x61, 0x61, 0x61, 0x63, 0x62, + 0x64, 0x60, 0x61, 0x64, 0x60, 0x61, 0x61, 0x62, + 0x63, 0x60, 0x61, 0x62, 0x65, 0x5F, 0x66, 0x63, + 0x61, 0x63, 0x65, 0x62, 0x5E, 0x5E, 0x5F, 0x62, + 0x65, 0x66, 0x67, 0x67, 0x6D, 0x64, 0x62, 0x63, + 0x65, 0x61, 0x62, 0x62, 0x69, 0x61, 0x64, 0x5C, + 0x5F, 0x61, 0x61, 0x60, 0x61, 0x5C, 0x5B, 0x5E, + 0x60, 0x5F, 0x60, 0x60, 0x60, 0x5B, 0x5E, 0x5E, + 0x60, 0x5C, 0x5D, 0x5C, 0x60, 0x57, 0x53, 0x53, + 0x4E, 0x4D, 0x49, 0x44, 0x4C, 0x55, 0x61, 0x6C, + 0x74, 0x7B, 0x80, 0x84, 0x86, 0x8B, 0x89, 0x89, + 0x89, 0x87, 0x87, 0x8D, 0x89, 0x8C, 0x89, 0x8A, + 0x89, 0x83, 0x83, 0x83, 0x85, 0x86, 0x7F, 0x81, + 0x80, 0x82, 0x7E, 0x7F, 0x7D, 0x80, 0x7F, 0x81, + 0x7F, 0x7C, 0x7D, 0x7B, 0x7B, 0x76, 0x95, 0xBA, + 0xC7, 0xD0, 0xD2, 0xD5, 0xD7, 0xD4, 0xC8, 0xAA, + 0x70, 0x48, 0x4F, 0x4D, 0x54, 0x52, 0x55, 0x58, + 0x56, 0x59, 0x5A, 0x5C, 0x5F, 0x5E, 0x59, 0x5D, + 0x5A, 0x5D, 0x5D, 0x62, 0x63, 0x61, 0x61, 0x62, + 0x63, 0x66, 0x68, 0x6D, 0x65, 0x4A, 0x31, 0x1C, + 0x12, 0x1B, 0x22, 0x16, 0x1B, 0x16, 0x16, 0x18, + 0x84, 0x83, 0x7E, 0x82, 0x83, 0x81, 0x82, 0x85, + 0x87, 0x84, 0x83, 0x84, 0x7D, 0x80, 0x83, 0x88, + 0x8E, 0x90, 0x90, 0x8C, 0x8F, 0x8D, 0x8C, 0x88, + 0x85, 0x86, 0x83, 0x7C, 0x78, 0x6A, 0x63, 0x5A, + 0x43, 0x3A, 0x39, 0x3D, 0x3F, 0x3E, 0x42, 0x43, + 0x57, 0x45, 0x48, 0x44, 0x43, 0x4B, 0x43, 0x44, + 0x48, 0x46, 0x46, 0x46, 0x4C, 0x52, 0x4D, 0x52, + 0x56, 0x59, 0x55, 0x58, 0x57, 0x5A, 0x5B, 0x5B, + 0x5D, 0x5C, 0x5D, 0x60, 0x63, 0x62, 0x60, 0x61, + 0x60, 0x5F, 0x62, 0x63, 0x5F, 0x60, 0x62, 0x62, + 0x61, 0x61, 0x63, 0x64, 0x61, 0x60, 0x64, 0x63, + 0x62, 0x60, 0x64, 0x63, 0x60, 0x5F, 0x63, 0x62, + 0x61, 0x64, 0x5E, 0x61, 0x60, 0x60, 0x5E, 0x62, + 0x60, 0x5F, 0x60, 0x60, 0x61, 0x5F, 0x61, 0x61, + 0x61, 0x61, 0x61, 0x61, 0x5D, 0x60, 0x5E, 0x5F, + 0x63, 0x62, 0x66, 0x66, 0x69, 0x64, 0x61, 0x62, + 0x64, 0x62, 0x63, 0x61, 0x65, 0x61, 0x60, 0x5F, + 0x5E, 0x63, 0x5E, 0x5D, 0x5D, 0x5D, 0x5B, 0x60, + 0x5F, 0x5F, 0x5D, 0x5F, 0x5B, 0x5B, 0x5F, 0x5E, + 0x5D, 0x5A, 0x5C, 0x5B, 0x5C, 0x58, 0x52, 0x51, + 0x4E, 0x51, 0x4A, 0x47, 0x4D, 0x51, 0x5E, 0x69, + 0x74, 0x7B, 0x7E, 0x82, 0x86, 0x89, 0x8B, 0x89, + 0x88, 0x8A, 0x86, 0x88, 0x88, 0x8C, 0x88, 0x89, + 0x89, 0x88, 0x85, 0x7F, 0x83, 0x84, 0x80, 0x80, + 0x80, 0x81, 0x7C, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7B, 0x7D, 0x7C, 0x78, 0x74, 0x7F, 0xA8, + 0xC1, 0xCB, 0xD1, 0xD4, 0xD6, 0xD6, 0xD2, 0xC1, + 0x94, 0x57, 0x49, 0x4C, 0x52, 0x53, 0x57, 0x5A, + 0x57, 0x59, 0x53, 0x5A, 0x5E, 0x5C, 0x5A, 0x5A, + 0x5A, 0x57, 0x60, 0x63, 0x65, 0x64, 0x63, 0x64, + 0x66, 0x69, 0x6A, 0x67, 0x4E, 0x30, 0x1C, 0x12, + 0x15, 0x19, 0x1F, 0x1A, 0x1A, 0x16, 0x1A, 0x1B, + 0x81, 0x81, 0x7D, 0x83, 0x85, 0x81, 0x84, 0x84, + 0x86, 0x83, 0x84, 0x83, 0x7E, 0x84, 0x86, 0x8B, + 0x8F, 0x8F, 0x94, 0x8D, 0x8D, 0x8B, 0x8C, 0x85, + 0x85, 0x85, 0x84, 0x7D, 0x79, 0x6B, 0x5C, 0x4F, + 0x3F, 0x36, 0x36, 0x3A, 0x3E, 0x3B, 0x43, 0x44, + 0x4E, 0x45, 0x47, 0x42, 0x45, 0x4B, 0x44, 0x44, + 0x48, 0x44, 0x46, 0x4A, 0x4B, 0x4F, 0x4D, 0x50, + 0x56, 0x5A, 0x57, 0x59, 0x56, 0x58, 0x5E, 0x5C, + 0x5F, 0x5F, 0x5C, 0x5F, 0x5D, 0x65, 0x5D, 0x62, + 0x5F, 0x5C, 0x61, 0x60, 0x5F, 0x5E, 0x61, 0x62, + 0x61, 0x61, 0x63, 0x60, 0x5F, 0x61, 0x63, 0x63, + 0x61, 0x61, 0x64, 0x62, 0x60, 0x61, 0x66, 0x63, + 0x62, 0x64, 0x5E, 0x61, 0x60, 0x5F, 0x5C, 0x5F, + 0x5C, 0x60, 0x5E, 0x5D, 0x5E, 0x5E, 0x5B, 0x5F, + 0x60, 0x5D, 0x5E, 0x60, 0x5E, 0x60, 0x5B, 0x5E, + 0x61, 0x60, 0x63, 0x64, 0x64, 0x65, 0x63, 0x61, + 0x63, 0x61, 0x64, 0x64, 0x60, 0x62, 0x5C, 0x5F, + 0x5D, 0x63, 0x5E, 0x5C, 0x5D, 0x5D, 0x5B, 0x5F, + 0x5E, 0x60, 0x5D, 0x5D, 0x5B, 0x5D, 0x5E, 0x5E, + 0x5C, 0x5B, 0x5D, 0x59, 0x5A, 0x58, 0x52, 0x4D, + 0x4F, 0x4F, 0x4A, 0x4B, 0x50, 0x54, 0x5C, 0x66, + 0x71, 0x79, 0x7C, 0x83, 0x85, 0x89, 0x8B, 0x8A, + 0x87, 0x8D, 0x86, 0x84, 0x87, 0x89, 0x88, 0x88, + 0x87, 0x89, 0x86, 0x81, 0x83, 0x84, 0x82, 0x80, + 0x82, 0x80, 0x7C, 0x7D, 0x7F, 0x7D, 0x7D, 0x7C, + 0x7F, 0x7C, 0x7C, 0x7D, 0x78, 0x75, 0x75, 0x91, + 0xB7, 0xC7, 0xCF, 0xD4, 0xD5, 0xD6, 0xD7, 0xCE, + 0xB2, 0x7C, 0x4A, 0x4A, 0x4F, 0x53, 0x58, 0x5B, + 0x5B, 0x5C, 0x57, 0x59, 0x5E, 0x5C, 0x5A, 0x58, + 0x59, 0x5B, 0x5E, 0x60, 0x61, 0x62, 0x63, 0x64, + 0x69, 0x6B, 0x63, 0x50, 0x2B, 0x27, 0x19, 0x11, + 0x13, 0x15, 0x15, 0x17, 0x14, 0x18, 0x1E, 0x1A, + 0x7F, 0x7F, 0x81, 0x82, 0x84, 0x82, 0x85, 0x83, + 0x83, 0x83, 0x85, 0x82, 0x81, 0x89, 0x8A, 0x8D, + 0x8F, 0x90, 0x92, 0x8E, 0x8A, 0x87, 0x89, 0x85, + 0x87, 0x87, 0x85, 0x7D, 0x78, 0x6C, 0x58, 0x4B, + 0x3B, 0x33, 0x30, 0x36, 0x3E, 0x3D, 0x43, 0x46, + 0x43, 0x46, 0x46, 0x45, 0x48, 0x47, 0x46, 0x44, + 0x49, 0x42, 0x46, 0x4A, 0x4B, 0x4B, 0x4F, 0x4F, + 0x56, 0x5B, 0x57, 0x58, 0x57, 0x5A, 0x5B, 0x5E, + 0x5F, 0x61, 0x5C, 0x5E, 0x5D, 0x61, 0x5E, 0x62, + 0x5D, 0x5E, 0x5F, 0x5E, 0x61, 0x61, 0x60, 0x62, + 0x61, 0x61, 0x60, 0x5F, 0x5D, 0x60, 0x5F, 0x61, + 0x61, 0x60, 0x62, 0x5E, 0x60, 0x64, 0x65, 0x63, + 0x66, 0x65, 0x65, 0x60, 0x5F, 0x5C, 0x59, 0x5B, + 0x5B, 0x5D, 0x59, 0x5C, 0x5B, 0x5D, 0x5E, 0x5F, + 0x5F, 0x5A, 0x5C, 0x5E, 0x5E, 0x5F, 0x5A, 0x60, + 0x5D, 0x5F, 0x5F, 0x63, 0x62, 0x64, 0x63, 0x61, + 0x61, 0x63, 0x64, 0x66, 0x60, 0x61, 0x5E, 0x5D, + 0x5D, 0x5F, 0x5E, 0x5D, 0x60, 0x5C, 0x5D, 0x5F, + 0x5D, 0x5E, 0x5E, 0x5D, 0x5C, 0x60, 0x5E, 0x5D, + 0x5D, 0x5B, 0x5C, 0x59, 0x5C, 0x5B, 0x53, 0x4E, + 0x50, 0x4A, 0x48, 0x4B, 0x50, 0x56, 0x5C, 0x63, + 0x6E, 0x74, 0x7E, 0x83, 0x84, 0x88, 0x8B, 0x89, + 0x89, 0x8B, 0x85, 0x85, 0x87, 0x86, 0x88, 0x85, + 0x86, 0x87, 0x86, 0x85, 0x82, 0x84, 0x82, 0x81, + 0x83, 0x80, 0x7F, 0x7E, 0x7D, 0x7F, 0x7F, 0x7C, + 0x7F, 0x7C, 0x7E, 0x7D, 0x7A, 0x78, 0x75, 0x7C, + 0xA4, 0xC2, 0xCC, 0xD3, 0xD4, 0xD7, 0xD9, 0xD5, + 0xC7, 0xA2, 0x60, 0x46, 0x4E, 0x50, 0x54, 0x57, + 0x5C, 0x5E, 0x5D, 0x5A, 0x5D, 0x5A, 0x5A, 0x59, + 0x59, 0x5E, 0x5E, 0x5D, 0x5E, 0x61, 0x63, 0x67, + 0x69, 0x64, 0x4C, 0x2D, 0x12, 0x1C, 0x1B, 0x10, + 0x0E, 0x14, 0x11, 0x13, 0x12, 0x1B, 0x1D, 0x1A, + 0x82, 0x81, 0x85, 0x82, 0x83, 0x82, 0x85, 0x85, + 0x84, 0x84, 0x87, 0x85, 0x84, 0x8C, 0x8C, 0x90, + 0x91, 0x91, 0x8E, 0x8E, 0x87, 0x84, 0x85, 0x85, + 0x86, 0x89, 0x86, 0x7F, 0x76, 0x69, 0x59, 0x4D, + 0x3A, 0x35, 0x31, 0x36, 0x3F, 0x40, 0x42, 0x45, + 0x45, 0x46, 0x49, 0x44, 0x49, 0x47, 0x48, 0x44, + 0x47, 0x43, 0x46, 0x49, 0x4B, 0x4B, 0x50, 0x52, + 0x54, 0x5A, 0x58, 0x58, 0x59, 0x5E, 0x5B, 0x5C, + 0x5F, 0x5E, 0x5B, 0x5D, 0x62, 0x5F, 0x5F, 0x5F, + 0x5D, 0x5E, 0x60, 0x5F, 0x63, 0x63, 0x5E, 0x62, + 0x61, 0x60, 0x5E, 0x61, 0x60, 0x60, 0x5E, 0x62, + 0x62, 0x5F, 0x5F, 0x5C, 0x60, 0x61, 0x60, 0x65, + 0x67, 0x68, 0x68, 0x61, 0x5F, 0x5A, 0x58, 0x5A, + 0x5A, 0x58, 0x57, 0x59, 0x5A, 0x5D, 0x5F, 0x60, + 0x5D, 0x5C, 0x5C, 0x5C, 0x5B, 0x5D, 0x5C, 0x5F, + 0x5E, 0x5F, 0x60, 0x60, 0x61, 0x62, 0x63, 0x65, + 0x62, 0x64, 0x64, 0x64, 0x61, 0x60, 0x60, 0x5C, + 0x5E, 0x5F, 0x5E, 0x60, 0x5E, 0x5D, 0x5C, 0x5E, + 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x61, 0x5F, 0x5C, + 0x5F, 0x5C, 0x5B, 0x5B, 0x57, 0x59, 0x56, 0x52, + 0x50, 0x4C, 0x49, 0x4B, 0x4E, 0x55, 0x5E, 0x65, + 0x6D, 0x73, 0x7F, 0x81, 0x85, 0x85, 0x8A, 0x89, + 0x8A, 0x88, 0x86, 0x86, 0x88, 0x84, 0x89, 0x83, + 0x88, 0x84, 0x84, 0x84, 0x82, 0x82, 0x82, 0x81, + 0x83, 0x80, 0x80, 0x7F, 0x7F, 0x85, 0x80, 0x7E, + 0x7D, 0x7D, 0x7E, 0x7D, 0x79, 0x79, 0x77, 0x73, + 0x8B, 0xB6, 0xC7, 0xD0, 0xD3, 0xD5, 0xD8, 0xD8, + 0xD2, 0xBC, 0x86, 0x4A, 0x48, 0x50, 0x52, 0x56, + 0x58, 0x5A, 0x58, 0x5C, 0x5C, 0x59, 0x5B, 0x5B, + 0x5A, 0x5E, 0x5E, 0x5E, 0x5F, 0x64, 0x66, 0x69, + 0x62, 0x49, 0x27, 0x13, 0x0D, 0x14, 0x18, 0x10, + 0x12, 0x12, 0x12, 0x14, 0x14, 0x1C, 0x19, 0x21, + 0x82, 0x83, 0x86, 0x83, 0x83, 0x84, 0x84, 0x86, + 0x86, 0x85, 0x85, 0x89, 0x8A, 0x8F, 0x8F, 0x91, + 0x92, 0x8F, 0x8E, 0x8D, 0x86, 0x85, 0x84, 0x84, + 0x85, 0x8A, 0x88, 0x83, 0x76, 0x69, 0x5E, 0x4E, + 0x3D, 0x39, 0x34, 0x38, 0x3F, 0x40, 0x42, 0x45, + 0x48, 0x47, 0x4C, 0x45, 0x4B, 0x49, 0x46, 0x44, + 0x46, 0x43, 0x45, 0x48, 0x4A, 0x4A, 0x4F, 0x51, + 0x53, 0x55, 0x59, 0x59, 0x5A, 0x5D, 0x5B, 0x59, + 0x5F, 0x5C, 0x5D, 0x5C, 0x61, 0x61, 0x5F, 0x5D, + 0x5D, 0x5B, 0x5F, 0x60, 0x61, 0x62, 0x5E, 0x60, + 0x60, 0x60, 0x5F, 0x61, 0x61, 0x61, 0x60, 0x61, + 0x61, 0x5F, 0x60, 0x5E, 0x61, 0x5C, 0x60, 0x65, + 0x65, 0x64, 0x65, 0x62, 0x60, 0x5F, 0x5B, 0x58, + 0x59, 0x55, 0x59, 0x57, 0x5B, 0x5A, 0x5C, 0x5F, + 0x5E, 0x5C, 0x5C, 0x5D, 0x5D, 0x5A, 0x5C, 0x5D, + 0x5E, 0x5F, 0x64, 0x5E, 0x60, 0x62, 0x61, 0x65, + 0x67, 0x62, 0x64, 0x60, 0x60, 0x5D, 0x5F, 0x5E, + 0x60, 0x61, 0x60, 0x60, 0x61, 0x5E, 0x58, 0x5E, + 0x5C, 0x5A, 0x5D, 0x5B, 0x5B, 0x60, 0x5E, 0x5F, + 0x5F, 0x61, 0x5A, 0x59, 0x55, 0x55, 0x57, 0x54, + 0x4F, 0x4D, 0x4B, 0x4A, 0x4A, 0x55, 0x5F, 0x66, + 0x6A, 0x74, 0x7B, 0x7D, 0x84, 0x84, 0x86, 0x89, + 0x88, 0x87, 0x86, 0x84, 0x88, 0x82, 0x88, 0x84, + 0x88, 0x84, 0x83, 0x83, 0x83, 0x82, 0x81, 0x81, + 0x84, 0x81, 0x7F, 0x7F, 0x82, 0x88, 0x81, 0x83, + 0x7D, 0x7F, 0x7D, 0x7D, 0x7A, 0x7A, 0x77, 0x72, + 0x79, 0x9D, 0xBB, 0xCA, 0xD0, 0xD4, 0xD7, 0xD8, + 0xD8, 0xCD, 0xAE, 0x6D, 0x49, 0x50, 0x50, 0x57, + 0x55, 0x58, 0x54, 0x5B, 0x59, 0x5B, 0x5C, 0x5C, + 0x5E, 0x5D, 0x5C, 0x61, 0x62, 0x66, 0x67, 0x65, + 0x51, 0x27, 0x10, 0x0D, 0x15, 0x14, 0x15, 0x10, + 0x16, 0x13, 0x15, 0x17, 0x17, 0x18, 0x19, 0x23 +}; + + + +/* + Macro definitions +*/ + +#define abs(x) (x>=0 ? x : -(x)) +#define FILTER 0 +#define EXPAND 1 +#define IS == +#define ISNT != +#define AND && +#define OR || + +#define NUM_LEVELS 4 + + +/* + Forward declaration of functions +*/ + +void epic_init( void ); +void epic_build_pyr( float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size ); +void epic_build_level( float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, + int filter_size, float *result_block ); +void epic_internal_transpose( float *mat, int rows, int cols ); +void epic_internal_filter( float *image, int x_dim, int y_dim, float *filt, + float *temp, int x_fdim, int y_fdim, + int xgrid_start, int xgrid_step, int ygrid_start, + int ygrid_step, float *result ); +void epic_reflect1( float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e ); +void epic_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +float epic_filtertemp[ FILTER_SIZE ]; +float epic_hi_imagetemp[ X_SIZE * Y_SIZE / 2 ]; +float epic_lo_imagetemp[ X_SIZE * Y_SIZE / 2 ]; + +static float epic_lo_filter[ FILTER_SIZE ] = { + -0.0012475221, -0.0024950907, 0.0087309530, 0.0199579580, + -0.0505290000, -0.1205509700, 0.2930455800, + 0.7061761600, + 0.2930455800, -0.1205509700, -0.0505290000, + 0.0199579580, 0.0087309530, -0.0024950907, -0.0012475221 + }; + +static float epic_hi_filter[ FILTER_SIZE ] = { + 0.0012475221, -0.0024950907, -0.0087309530, 0.0199579580, + 0.0505290000, -0.1205509700, -0.2930455800, + 0.7061761600, + -0.2930455800, -0.1205509700, 0.0505290000, + 0.0199579580, -0.0087309530, -0.0024950907, 0.0012475221 +}; + + +/* + Initialization function +*/ + +void epic_init( void ) +{ + int i; + + _Pragma( "loopbound min 4096 max 4096" ) + for ( i = 0; i < X_SIZE * Y_SIZE; ++i ) + epic_image[ i ] *= SCALE_FACTOR; +} + + +/* + Algorithm core functions +*/ + +/* + ====================================================================== + epic_build_pyr() -- builds a separable QMF-style pyramid. The pyramid + is written over the original image. NOTE: the image size must be + divisible by 2^num_levels, but we do not check this here. + ====================================================================== +*/ +void epic_build_pyr( float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size ) +{ + int x_level, y_level, level; + + x_level = x_size; + y_level = y_size; + + _Pragma( "loopbound min 4 max 4" ) + for ( level = 0; level < num_levels; ++level ) { + epic_build_level( image, x_level, y_level, lo_filter, hi_filter, + filter_size, image ); + x_level /= 2; + y_level /= 2; + } +} + + +/* + ====================================================================== + epic_build_level() -- builds a level of the pyramid by computing 4 + filtered and subsampled images. Since the convolution is separable, + image and result-block can point to the same place! Image order is + lowpass, horizontal, vertical (transposed), and diagonal. + ====================================================================== +*/ +void epic_build_level( float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, + int filter_size, float *result_block ) +{ + int total_size = level_x_size * level_y_size; + + /* filter and subsample in the X direction */ + epic_internal_filter ( image, level_x_size, level_y_size, + lo_filter, epic_filtertemp, filter_size, 1, + 0, 2, 0, 1, epic_lo_imagetemp ); + epic_internal_filter ( image, level_x_size, level_y_size, + hi_filter, epic_filtertemp, filter_size, 1, + 1, 2, 0, 1, epic_hi_imagetemp ); + + level_x_size /= 2; + /* now filter and subsample in the Y direction */ + epic_internal_filter ( epic_lo_imagetemp, level_x_size, + level_y_size, /* lowpass */ + lo_filter, epic_filtertemp, 1, filter_size, + 0, 1, 0, 2, result_block ); + epic_internal_filter ( epic_lo_imagetemp, level_x_size, + level_y_size, /* horizontal */ + hi_filter, epic_filtertemp, 1, filter_size, + 0, 1, 1, 2, ( result_block += ( total_size / 4 ) ) ); + epic_internal_filter ( epic_hi_imagetemp, level_x_size, + level_y_size, /* vertical */ + lo_filter, epic_filtertemp, 1, filter_size, + 0, 1, 0, 2, ( result_block += ( total_size / 4 ) ) ); + /* transpose the vertical band for more efficient scanning */ + epic_internal_transpose( result_block, level_y_size / 2, level_x_size ); + epic_internal_filter ( epic_hi_imagetemp, level_x_size, + level_y_size, /* diagonal */ + hi_filter, epic_filtertemp, 1, filter_size, + 0, 1, 1, 2, ( result_block += ( total_size / 4 ) ) ); +} + + +/* + ====================================================================== + In-place matrix tranpose algorithm. Handles non-square matrices, + too! Is there a faster algorithm?? + ====================================================================== +*/ +void epic_internal_transpose( float *mat, int rows, int cols ) +{ + register int swap_pos; + register int modulus = rows * cols - 1; + register int current_pos; + register float swap_val; + + /* loop, ignoring first and last elements */ + _Pragma( "loopbound min 14 max 2399" ) + for ( current_pos = 1; current_pos < modulus; ++current_pos ) { + /* Compute swap position */ + swap_pos = current_pos; + + _Pragma( "loopbound min 1 max 2" ) + do { + swap_pos = ( swap_pos * cols ) % modulus; + } while ( swap_pos < current_pos ); + + if ( current_pos != swap_pos ) { + swap_val = mat[ swap_pos ]; + mat[ swap_pos ] = mat[ current_pos ]; + mat[ current_pos ] = swap_val; + } + } +} + + +/* -------------------------------------------------------------------- + Correlate FILT with IMAGE, subsampling according to GRID parameters, + with values placed into result array. TEMP is a temporary + array the size of the filter. EDGES is a string -- see convolve.h. + The convolution is done in 9 sections, where the border sections use + specially computed edge-handling filters (see edges.c). The origin + of the filter is assumed to be (floor(x_fdim/2), floor(y_fdim/2)). + 10/6/89 - approximately optimized the choice of register vars on SPARCS. + ------------------------------------------------------------------------ */ +void epic_internal_filter( float *image, int x_dim, int y_dim, float *filt, + float *temp, int x_fdim, int y_fdim, + int xgrid_start, int xgrid_step, int ygrid_start, + int ygrid_step, float *result ) +{ + //register double sum; + register float sum; + register int x_filt, im_pos, y_filt_lin; + register int y_im_lin, x_pos, filt_size = x_fdim * y_fdim; + register int y_pos, res_pos; + register int last_ctr_col = x_dim - x_fdim; + int last_ctr_row = ( y_dim - y_fdim ) * x_dim; + int first_row, first_col ; + int x_fmid = x_fdim / 2; + int y_fmid = y_fdim / 2; + int x_stop = x_fdim - x_fmid + 1; + int y_stop = y_fdim - y_fmid + 1; + int ygrid_step_full = ygrid_step * x_dim; + int prev_res_pos, x_res_dim = ( x_dim - xgrid_start + xgrid_step - 1 ) / + xgrid_step; + int rt_edge_res_pos = x_res_dim; + + res_pos = 0; + first_col = xgrid_start - x_fmid + xgrid_step; + + _Pragma( "loopbound min 1 max 4" ) + for ( y_pos = ygrid_start - y_fmid - 1; y_pos < 0; y_pos += ygrid_step ) { + _Pragma( "loopbound min 1 max 4" ) + for ( x_pos = xgrid_start - x_fmid; /* top-left corner */ + x_pos < 0; + x_pos += xgrid_step ) { + epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER ); + sum = 0.0f; + x_filt = y_im_lin = 0; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + im_pos = y_im_lin; + + _Pragma( "loopbound min 1 max 15" ) + for ( ; x_filt < y_filt_lin; ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + first_col = x_pos + 1; + epic_reflect1( filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER ); + _Pragma( "loopbound min 41 max 46" ) + for ( x_pos = first_col; /* top edge */ + x_pos < last_ctr_col; + x_pos += xgrid_step ) { + sum = 0.0f; + x_filt = y_im_lin = 0; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + im_pos = x_pos + y_im_lin; + _Pragma( "loopbound min 1 max 15" ) + for ( ; x_filt < y_filt_lin; ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + rt_edge_res_pos = res_pos + x_res_dim; /* save this for later ... */ + _Pragma( "loopbound min 1 max 4" ) + for ( x_pos += ( 1 - last_ctr_col ); /* top-right corner */ + x_pos < x_stop; + x_pos += xgrid_step ) { + epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER ); + sum = 0.0f; + x_filt = y_im_lin = 0; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + im_pos = y_im_lin + last_ctr_col; + + _Pragma( "loopbound min 1 max 15" ) + for ( ; x_filt < y_filt_lin; ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + } /* end top */ + + first_row = x_dim * ( y_pos + 1 ); /* need this to go down the sides */ + prev_res_pos = res_pos; + _Pragma( "loopbound min 1 max 4" ) + for ( x_pos = xgrid_start - x_fmid; /* left edge */ + x_pos < 1; + x_pos += xgrid_step ) { + res_pos = prev_res_pos; + epic_reflect1( filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER ); + _Pragma( "loopbound min 41 max 97" ) + for ( y_pos = first_row; y_pos < last_ctr_row; + y_pos += ygrid_step_full ) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + im_pos = y_im_lin; + _Pragma( "loopbound min 1 max 15" ) + for ( ; x_filt < y_filt_lin; x_filt++ ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + res_pos += x_res_dim; + } + prev_res_pos++; + } + epic_reflect1( filt, x_fdim, y_fdim, 0, 0, temp, FILTER ); + _Pragma( "loopbound min 41 max 97" ) + for ( y_pos = first_row; /* center region of image */ + y_pos < last_ctr_row; + y_pos += ygrid_step_full ) { + res_pos = prev_res_pos; + _Pragma( "loopbound min 41 max 46" ) + for ( x_pos = first_col; + x_pos < last_ctr_col; + x_pos += xgrid_step ) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + im_pos = x_pos + y_im_lin; + _Pragma( "loopbound min 1 max 15" ) + for ( ; x_filt < y_filt_lin; ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + prev_res_pos += x_res_dim; + } + prev_res_pos = rt_edge_res_pos; + _Pragma( "loopbound min 1 max 4" ) + for ( x_pos += ( 1 - last_ctr_col ); /* right edge */ + x_pos < x_stop; + x_pos += xgrid_step ) { + res_pos = prev_res_pos; + epic_reflect1( filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER ); + _Pragma( "loopbound min 41 max 97" ) + for ( y_pos = first_row; y_pos < last_ctr_row; + y_pos += ygrid_step_full ) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; + y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + _Pragma( "loopbound min 1 max 15" ) + for ( im_pos = y_im_lin + last_ctr_col; + x_filt < y_filt_lin; + ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + res_pos += x_res_dim; + } + prev_res_pos++; + } /* end mid */ + + res_pos -= ( x_res_dim - 1 ); /* go to lower left corner */ + _Pragma( "loopbound min 1 max 4" ) + for ( y_pos = ( ( y_pos - last_ctr_row ) / x_dim ) + 1; /* bottom */ + y_pos < y_stop; + y_pos += ygrid_step ) { + _Pragma( "loopbound min 1 max 4" ) + for ( x_pos = xgrid_start - x_fmid; /* bottom-left corner */ + x_pos < 1; + x_pos += xgrid_step ) { + epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER ); + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + _Pragma( "loopbound min 1 max 15" ) + for ( im_pos = y_im_lin; + x_filt < y_filt_lin; + ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + epic_reflect1( filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER ); + _Pragma( "loopbound min 41 max 46" ) + for ( x_pos = first_col; /* bottom edge */ + x_pos < last_ctr_col; + x_pos += xgrid_step ) { + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + _Pragma( "loopbound min 1 max 15" ) + for ( im_pos = x_pos + y_im_lin; + x_filt < y_filt_lin; + ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + _Pragma( "loopbound min 1 max 4" ) + for ( x_pos += 1 - last_ctr_col; /* bottom-right corner */ + x_pos < x_stop; + x_pos += xgrid_step ) { + epic_reflect1( filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER ); + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim ) { + _Pragma( "loopbound min 1 max 15" ) + for ( im_pos = y_im_lin + last_ctr_col; + x_filt < y_filt_lin; + ++x_filt ) { + sum += image[ im_pos ] * temp[ x_filt ]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[ res_pos ] = sum; + ++res_pos; + } + } /* end bottom */ + +} /* end of epic_internal_filter */ + + +/* + The following function determine how edges are to be handled + when performing convolutions of images with linear filters. + Any edge handling function which is local and linear may be defined, + except (unfortunately) constants cannot be added. So to treat the + edges as if the image is surrounded by a gray field, you must paste it + into a gray image, convolve, and crop it out... + The main convolution function is called epic_internal_filter. The idea + is that the convolution function calls the edge handling function which + computes a new filter based on the old filter and the distance to the + edge of the image. For example, reflection is done by reflecting the + filter through the appropriate axis and summing. +*/ + +/* + ---------------- EDGE HANDLER ARGUMENTS ------------------------ + filt - floating point array of filter taps. + x_dim, y_dim - x and y dimensions of filt. + x_pos - position of filter relative to the horizontal image edges. Negative + values indicate left edge, positive indicate right edge. Zero + indicates that the filter is not touching either edge. An absolute + value of 1 indicates that the edge tap of the filter is over the + edge pixel of the image. + y_pos - analogous to x_pos. + result - floating point array where the resulting filter will go. The edge + of this filter will be aligned with the image for application... + f_or_e - equal to one of the two constants EXPAND or FILTER. + -------------------------------------------------------------------- +*/ + +/* -------------------------------------------------------------------- + epic_reflect1() - Reflection through the edge pixels. This is the right + thing to do if you are subsampling by 2, since it maintains parity (even + pixels positions remain even, odd ones remain odd). (note: procedure differs + depending on f_or_e parameter). */ +void epic_reflect1( float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e ) +{ + int filt_sz = x_dim * y_dim; + register int x_start = 0, y_start = 0, x_stop = x_dim, y_stop = filt_sz; + register int y_filt, x_filt, y_edge, x_edge; + register int x_base = ( x_pos > 0 ) ? ( x_dim - 1 ) : 0; + register int y_base = ( y_pos > 0 ) ? ( x_dim * ( y_dim - 1 ) ) : 0; + int x_edge_dist = ( x_pos > 0 ) ? ( x_pos - x_dim ) : ( ( x_pos < -1 ) ? + ( x_pos + 1 ) : 0 ); + int y_edge_dist = x_dim * ( ( y_pos > 0 ) ? ( y_pos - y_dim ) : ( ( + y_pos < -1 ) ? ( y_pos + 1 ) : 0 ) ); + int i; + int mx_pos = ( x_dim / 2 ) + 1; + int my_pos = ( y_dim / 2 ) + 1; + + _Pragma( "loopbound min 15 max 15" ) + for ( i = 0; i < filt_sz; ++i ) result[ i ] = 0.0f; + + /* if EXPAND and filter is centered on image edge, do not reflect */ + if ( f_or_e IS EXPAND ) { + if ( x_pos IS mx_pos ) x_stop = ( x_dim + 1 ) / 2; + else + if ( x_pos IS - mx_pos ) { + x_start = x_dim / 2; + x_edge_dist = 0; + } + + if ( y_pos IS my_pos ) y_stop = x_dim * ( ( y_dim + 1 ) / 2 ); + else + if ( y_pos IS - my_pos ) { + y_start = x_dim * ( y_dim / 2 ); + y_edge_dist = 0; + } + } + + y_edge = y_edge_dist; + /* reflect at boundary of image */ + _Pragma( "loopbound min 1 max 15" ) + for ( y_filt = y_start; y_filt < y_stop; y_filt += x_dim ) { + x_edge = x_edge_dist; + _Pragma( "loopbound min 1 max 15" ) + for ( x_filt = y_filt + x_start; x_filt < y_filt + x_stop; ++x_filt ) { + result[ abs( y_base - abs( y_edge ) ) + abs( x_base - abs( x_edge ) ) ] + += filt[ x_filt ]; + ++x_edge; + } + y_edge += x_dim; + } + + /* if EXPAND and filter is not centered on image edge, mult edge by 2 */ + if ( f_or_e IS EXPAND ) { + if ( ( abs( x_pos ) ISNT mx_pos ) AND ( x_pos ISNT 0 ) ) + _Pragma( "loopbound min 0 max 0" ) + for ( y_filt = x_base; y_filt < filt_sz; y_filt += x_dim ) + result[ y_filt ] += result[ y_filt ]; + if ( ( abs( y_pos ) ISNT my_pos ) AND ( y_pos ISNT 0 ) ) + _Pragma( "loopbound min 0 max 0" ) + for ( x_filt = y_base; x_filt < y_base + x_dim; ++x_filt ) + result[ x_filt ] += result[ x_filt ]; + } +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) epic_main( void ) +{ + epic_build_pyr( epic_image, X_SIZE, Y_SIZE, NUM_LEVELS, epic_lo_filter, + epic_hi_filter, FILTER_SIZE ); +} + +int epic_return() +{ + int i; + int checksum = 0; + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0 ; i < X_SIZE * Y_SIZE ; i += Y_SIZE + 1 ) + checksum += epic_image[ i ]; + return ( checksum == 43968 ? 0 : 1 ); +} + +int main( void ) +{ + epic_init(); + epic_main(); + + return epic_return(); +} diff --git a/targets/wasm-tacle/sequential/epic/epic.h b/targets/wasm-tacle/sequential/epic/epic.h new file mode 100755 index 0000000..8a8151a --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/epic.h @@ -0,0 +1,72 @@ +#ifndef __EPIC_H_ +#define __EPIC_H_ + +#define EPIC_VERSION 1.1 + +/* ============= FUNDAMENTAL LIMITATIONS ============= */ + +/* Maximum x- or y-size of image */ +#define MAX_IMAGE_DIM 16384 + +/* Maximum number of pyramid levels (value 3*levs+1 stored in 5 bits). + This doesn't need to be larger than log2(MAX_IMAGE_DIM/FILTER_SIZE). */ +#define MAX_LEVELS 10 + +/* Maximum number of quantization bins. This essentially determines + the maximum depth image to be represented. */ +#define MAX_BINS 511 + +/* ============= SECONDARY (derived) LIMITATIONS ============= */ + +/* This number determines the precision of the stored binsizes: + stored coefficients are accurate to +/- (1/SCALE_FACTOR). + On the other hand, this number also will limit the maximum amount + of compression. + It should not be more than [ 2^(8*sizeof(BinValueType)) ]/256. */ +#define SCALE_FACTOR 128 + +/* This number must be consistent with the filters that are + hardwired into epic.c */ +#define FILTER_SIZE 15 + +/* Log (base 2) of MAX_IMAGE_DIM^2: (bits required to store the dimensions) */ +#define LOG_MAX_IMAGE_SIZE 32 + +/* The type of the quantized images. Must be SIGNED, and capable of holding + values in the range [ -MAX_BINS, MAX_BINS ] */ +typedef short BinIndexType; + +/* The type used to represent the binsizes. Should be UNSIGNED. If this is + changed, be sure to change the places in epic.c and unepic.c where + binsizes are written or read from files. */ +typedef unsigned short BinValueType; + +/* Number of possible values for a symbol. This must be at least + (MAX_BINS * 4) (one sign bit, one tag bit)... */ +#define NUM_SYMBOL_VALUES 65536 + +/* Function prototypes. */ +void epic_build_pyr( float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size ); + +void epic_build_level( float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, + int filter_size, float *result_block ); + +void epic_internal_transpose( register float *mat, int rows, + register int cols ); + +void epic_reflect1( register float *filt, register int x_dim, int y_dim, + int x_pos, int y_pos, register float *result, int f_or_e ); + +void epic_internal_filter( register float *image, register int x_dim, + register int y_dim, float *filt, + register float *temp, register int x_fdim, + register int y_fdim, int xgrid_start, + int xgrid_step, int ygrid_start, int ygrid_step, + register float *result ); + +void epic_reflect1( float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e ); + +#endif // __EPIC_H_ diff --git a/targets/wasm-tacle/sequential/epic/generated/default/epic.wasm b/targets/wasm-tacle/sequential/epic/generated/default/epic.wasm new file mode 100755 index 0000000000000000000000000000000000000000..8acb09cecf5b668f4cb7442eb43af4985e623abe GIT binary patch literal 24913 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\f6\c74?\12\0a\96>m\e3\f6\bd\7f\f7N\bd\df~\a3= 0 ? x : -(x)) +#define FILTER 0 +#define EXPAND 1 +#define IS == +#define ISNT != +#define AND && +#define OR || + +#define NUM_LEVELS 4 + +/* + Forward declaration of functions +*/ + +void epic_init(void); +void epic_build_pyr(float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size); +void epic_build_level(float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, int filter_size, + float *result_block); +void epic_internal_transpose(float *mat, int rows, int cols); +void epic_internal_filter(float *image, int x_dim, int y_dim, float *filt, + float *temp, int x_fdim, int y_fdim, int xgrid_start, + int xgrid_step, int ygrid_start, int ygrid_step, + float *result); +void epic_reflect1(float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +epic_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +float epic_filtertemp[FILTER_SIZE]; +float epic_hi_imagetemp[X_SIZE * Y_SIZE / 2]; +float epic_lo_imagetemp[X_SIZE * Y_SIZE / 2]; + +static float epic_lo_filter[FILTER_SIZE] = { + -0.0012475221, -0.0024950907, 0.0087309530, 0.0199579580, -0.0505290000, + -0.1205509700, 0.2930455800, 0.7061761600, 0.2930455800, -0.1205509700, + -0.0505290000, 0.0199579580, 0.0087309530, -0.0024950907, -0.0012475221}; + +static float epic_hi_filter[FILTER_SIZE] = { + 0.0012475221, -0.0024950907, -0.0087309530, 0.0199579580, 0.0505290000, + -0.1205509700, -0.2930455800, 0.7061761600, -0.2930455800, -0.1205509700, + 0.0505290000, 0.0199579580, -0.0087309530, -0.0024950907, 0.0012475221}; + +/* + Initialization function +*/ + +void +epic_init(void) { + int i; + + __pragma_loopbound(4096, 4096); + for (i = 0; i < X_SIZE * Y_SIZE; ++i) + epic_image[i] *= SCALE_FACTOR; +} + +/* + Algorithm core functions +*/ + +/* + ====================================================================== + epic_build_pyr() -- builds a separable QMF-style pyramid. The pyramid + is written over the original image. NOTE: the image size must be + divisible by 2^num_levels, but we do not check this here. + ====================================================================== +*/ +void +epic_build_pyr(float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size) { + int x_level, y_level, level; + + x_level = x_size; + y_level = y_size; + + __pragma_loopbound(4, 4); + for (level = 0; level < num_levels; ++level) { + epic_build_level(image, x_level, y_level, lo_filter, hi_filter, + filter_size, image); + x_level /= 2; + y_level /= 2; + } +} + +/* + ====================================================================== + epic_build_level() -- builds a level of the pyramid by computing 4 + filtered and subsampled images. Since the convolution is separable, + image and result-block can point to the same place! Image order is + lowpass, horizontal, vertical (transposed), and diagonal. + ====================================================================== +*/ +void +epic_build_level(float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, int filter_size, + float *result_block) { + int total_size = level_x_size * level_y_size; + + /* filter and subsample in the X direction */ + epic_internal_filter(image, level_x_size, level_y_size, lo_filter, + epic_filtertemp, filter_size, 1, 0, 2, 0, 1, + epic_lo_imagetemp); + epic_internal_filter(image, level_x_size, level_y_size, hi_filter, + epic_filtertemp, filter_size, 1, 1, 2, 0, 1, + epic_hi_imagetemp); + + level_x_size /= 2; + /* now filter and subsample in the Y direction */ + epic_internal_filter( + epic_lo_imagetemp, level_x_size, level_y_size, /* lowpass */ + lo_filter, epic_filtertemp, 1, filter_size, 0, 1, 0, 2, result_block); + epic_internal_filter(epic_lo_imagetemp, level_x_size, + level_y_size, /* horizontal */ + hi_filter, epic_filtertemp, 1, filter_size, 0, 1, 1, 2, + (result_block += (total_size / 4))); + epic_internal_filter(epic_hi_imagetemp, level_x_size, + level_y_size, /* vertical */ + lo_filter, epic_filtertemp, 1, filter_size, 0, 1, 0, 2, + (result_block += (total_size / 4))); + /* transpose the vertical band for more efficient scanning */ + epic_internal_transpose(result_block, level_y_size / 2, level_x_size); + epic_internal_filter(epic_hi_imagetemp, level_x_size, + level_y_size, /* diagonal */ + hi_filter, epic_filtertemp, 1, filter_size, 0, 1, 1, 2, + (result_block += (total_size / 4))); +} + +/* + ====================================================================== + In-place matrix tranpose algorithm. Handles non-square matrices, + too! Is there a faster algorithm?? + ====================================================================== +*/ +void +epic_internal_transpose(float *mat, int rows, int cols) { + register int swap_pos; + register int modulus = rows * cols - 1; + register int current_pos; + register float swap_val; + + /* loop, ignoring first and last elements */ + __pragma_loopbound(14, 2399); + for (current_pos = 1; current_pos < modulus; ++current_pos) { + /* Compute swap position */ + swap_pos = current_pos; + + __pragma_loopbound(1, 2); + do { + swap_pos = (swap_pos * cols) % modulus; + } while (swap_pos < current_pos); + + if (current_pos != swap_pos) { + swap_val = mat[swap_pos]; + mat[swap_pos] = mat[current_pos]; + mat[current_pos] = swap_val; + } + } +} + +/* -------------------------------------------------------------------- + Correlate FILT with IMAGE, subsampling according to GRID parameters, + with values placed into result array. TEMP is a temporary + array the size of the filter. EDGES is a string -- see convolve.h. + The convolution is done in 9 sections, where the border sections use + specially computed edge-handling filters (see edges.c). The origin + of the filter is assumed to be (floor(x_fdim/2), floor(y_fdim/2)). + 10/6/89 - approximately optimized the choice of register vars on SPARCS. + ------------------------------------------------------------------------ */ +void +epic_internal_filter(float *image, int x_dim, int y_dim, float *filt, + float *temp, int x_fdim, int y_fdim, int xgrid_start, + int xgrid_step, int ygrid_start, int ygrid_step, + float *result) { + // register double sum; + register float sum; + register int x_filt, im_pos, y_filt_lin; + register int y_im_lin, x_pos, filt_size = x_fdim * y_fdim; + register int y_pos, res_pos; + register int last_ctr_col = x_dim - x_fdim; + int last_ctr_row = (y_dim - y_fdim) * x_dim; + int first_row, first_col; + int x_fmid = x_fdim / 2; + int y_fmid = y_fdim / 2; + int x_stop = x_fdim - x_fmid + 1; + int y_stop = y_fdim - y_fmid + 1; + int ygrid_step_full = ygrid_step * x_dim; + int prev_res_pos, + x_res_dim = (x_dim - xgrid_start + xgrid_step - 1) / xgrid_step; + int rt_edge_res_pos = x_res_dim; + + res_pos = 0; + first_col = xgrid_start - x_fmid + xgrid_step; + + __pragma_loopbound(1, 4); + for (y_pos = ygrid_start - y_fmid - 1; y_pos < 0; y_pos += ygrid_step) { + __pragma_loopbound(1, 4); + for (x_pos = xgrid_start - x_fmid; /* top-left corner */ + x_pos < 0; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = y_im_lin = 0; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = y_im_lin; + + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + first_col = x_pos + 1; + epic_reflect1(filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER); + __pragma_loopbound(41, 46); + for (x_pos = first_col; /* top edge */ + x_pos < last_ctr_col; x_pos += xgrid_step) { + sum = 0.0f; + x_filt = y_im_lin = 0; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = x_pos + y_im_lin; + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + rt_edge_res_pos = res_pos + x_res_dim; /* save this for later ... */ + _Pragma( + "loopbound min 1 max 4") for (x_pos += + (1 - + last_ctr_col); /* top-right corner */ + x_pos < x_stop; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = y_im_lin = 0; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = y_im_lin + last_ctr_col; + + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + } /* end top */ + + first_row = x_dim * (y_pos + 1); /* need this to go down the sides */ + prev_res_pos = res_pos; + __pragma_loopbound(1, 4); + for (x_pos = xgrid_start - x_fmid; /* left edge */ + x_pos < 1; x_pos += xgrid_step) { + res_pos = prev_res_pos; + epic_reflect1(filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER); + __pragma_loopbound(41, 97); + for (y_pos = first_row; y_pos < last_ctr_row; + y_pos += ygrid_step_full) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = y_im_lin; + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; x_filt++) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + res_pos += x_res_dim; + } + prev_res_pos++; + } + epic_reflect1(filt, x_fdim, y_fdim, 0, 0, temp, FILTER); + __pragma_loopbound(41, 97); + for (y_pos = first_row; /* center region + of image */ + y_pos < last_ctr_row; y_pos += ygrid_step_full) { + res_pos = prev_res_pos; + __pragma_loopbound(41, 46); + for (x_pos = first_col; x_pos < last_ctr_col; x_pos += xgrid_step) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = x_pos + y_im_lin; + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + prev_res_pos += x_res_dim; + } + prev_res_pos = rt_edge_res_pos; + __pragma_loopbound(1, 4); + for (x_pos += (1 - last_ctr_col); /* right edge */ + x_pos < x_stop; x_pos += xgrid_step) { + res_pos = prev_res_pos; + epic_reflect1(filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER); + __pragma_loopbound(41, 97); + for (y_pos = first_row; y_pos < last_ctr_row; + y_pos += ygrid_step_full) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = y_im_lin + last_ctr_col; x_filt < y_filt_lin; + ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + res_pos += x_res_dim; + } + prev_res_pos++; + } /* end mid */ + + res_pos -= (x_res_dim - 1); /* go to lower left corner */ + __pragma_loopbound(1, 4); + for (y_pos = ((y_pos - last_ctr_row) / x_dim) + 1; /* bottom */ + y_pos < y_stop; y_pos += ygrid_step) { + _Pragma( + "loopbound min 1 max 4") for (x_pos = + xgrid_start - + x_fmid; /* bottom-left corner */ + x_pos < 1; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = y_im_lin; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + epic_reflect1(filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER); + __pragma_loopbound(41, 46); + for (x_pos = first_col; /* bottom edge */ + x_pos < last_ctr_col; x_pos += xgrid_step) { + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = x_pos + y_im_lin; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + __pragma_loopbound(1, 4); + for (x_pos += 1 - last_ctr_col; /* bottom-right + corner */ + x_pos < x_stop; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = y_im_lin + last_ctr_col; x_filt < y_filt_lin; + ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + } /* end bottom */ + +} /* end of epic_internal_filter */ + +/* + The following function determine how edges are to be handled + when performing convolutions of images with linear filters. + Any edge handling function which is local and linear may be defined, + except (unfortunately) constants cannot be added. So to treat the + edges as if the image is surrounded by a gray field, you must paste it + into a gray image, convolve, and crop it out... + The main convolution function is called epic_internal_filter. The idea + is that the convolution function calls the edge handling function which + computes a new filter based on the old filter and the distance to the + edge of the image. For example, reflection is done by reflecting the + filter through the appropriate axis and summing. +*/ + +/* + ---------------- EDGE HANDLER ARGUMENTS ------------------------ + filt - floating point array of filter taps. + x_dim, y_dim - x and y dimensions of filt. + x_pos - position of filter relative to the horizontal image edges. Negative + values indicate left edge, positive indicate right edge. Zero + indicates that the filter is not touching either edge. An absolute + value of 1 indicates that the edge tap of the filter is over the + edge pixel of the image. + y_pos - analogous to x_pos. + result - floating point array where the resulting filter will go. The edge + of this filter will be aligned with the image for application... + f_or_e - equal to one of the two constants EXPAND or FILTER. + -------------------------------------------------------------------- +*/ + +/* -------------------------------------------------------------------- + epic_reflect1() - Reflection through the edge pixels. This is the right + thing to do if you are subsampling by 2, since it maintains parity (even + pixels positions remain even, odd ones remain odd). (note: procedure differs + depending on f_or_e parameter). */ +void +epic_reflect1(float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e) { + int filt_sz = x_dim * y_dim; + register int x_start = 0, y_start = 0, x_stop = x_dim, y_stop = filt_sz; + register int y_filt, x_filt, y_edge, x_edge; + register int x_base = (x_pos > 0) ? (x_dim - 1) : 0; + register int y_base = (y_pos > 0) ? (x_dim * (y_dim - 1)) : 0; + int x_edge_dist = + (x_pos > 0) ? (x_pos - x_dim) : ((x_pos < -1) ? (x_pos + 1) : 0); + int y_edge_dist = x_dim * ((y_pos > 0) ? (y_pos - y_dim) + : ((y_pos < -1) ? (y_pos + 1) : 0)); + int i; + int mx_pos = (x_dim / 2) + 1; + int my_pos = (y_dim / 2) + 1; + + __pragma_loopbound(15, 15); + for (i = 0; i < filt_sz; ++i) + result[i] = 0.0f; + + /* if EXPAND and filter is centered on image edge, do not reflect */ + if (f_or_e IS EXPAND) { + if (x_pos IS mx_pos) + x_stop = (x_dim + 1) / 2; + else if (x_pos IS - mx_pos) { + x_start = x_dim / 2; + x_edge_dist = 0; + } + + if (y_pos IS my_pos) + y_stop = x_dim * ((y_dim + 1) / 2); + else if (y_pos IS - my_pos) { + y_start = x_dim * (y_dim / 2); + y_edge_dist = 0; + } + } + + y_edge = y_edge_dist; + /* reflect at boundary of image */ + __pragma_loopbound(1, 15); + for (y_filt = y_start; y_filt < y_stop; y_filt += x_dim) { + x_edge = x_edge_dist; + __pragma_loopbound(1, 15); + for (x_filt = y_filt + x_start; x_filt < y_filt + x_stop; ++x_filt) { + result[abs(y_base - abs(y_edge)) + abs(x_base - abs(x_edge))] += + filt[x_filt]; + ++x_edge; + } + y_edge += x_dim; + } + + /* if EXPAND and filter is not centered on image edge, mult edge by 2 */ + if (f_or_e IS EXPAND) { + if ((abs(x_pos) ISNT mx_pos) AND(x_pos ISNT 0)) + __pragma_loopbound(0, 0); + for (y_filt = x_base; y_filt < filt_sz; y_filt += x_dim) + result[y_filt] += result[y_filt]; + if ((abs(y_pos) ISNT my_pos) AND(y_pos ISNT 0)) + __pragma_loopbound(0, 0); + for (x_filt = y_base; x_filt < y_base + x_dim; ++x_filt) + result[x_filt] += result[x_filt]; + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +epic_main(void) { + epic_build_pyr(epic_image, X_SIZE, Y_SIZE, NUM_LEVELS, epic_lo_filter, + epic_hi_filter, FILTER_SIZE); +} + +int +epic_return() { + int i; + int checksum = 0; + __pragma_loopbound(64, 64); + for (i = 0; i < X_SIZE * Y_SIZE; i += Y_SIZE + 1) + checksum += epic_image[i]; + return (checksum == 43968 ? 0 : 1); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + epic_init(); + epic_main(); + + return epic_return(); +} diff --git a/targets/wasm-tacle/sequential/epic/generated/modified_sources/default/epic.h b/targets/wasm-tacle/sequential/epic/generated/modified_sources/default/epic.h new file mode 100644 index 0000000..c2359f3 --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/generated/modified_sources/default/epic.h @@ -0,0 +1,71 @@ + +#ifndef __EPIC_H_ +#define __EPIC_H_ + +#define EPIC_VERSION 1.1 + +/* ============= FUNDAMENTAL LIMITATIONS ============= */ + +/* Maximum x- or y-size of image */ +#define MAX_IMAGE_DIM 16384 + +/* Maximum number of pyramid levels (value 3*levs+1 stored in 5 bits). + This doesn't need to be larger than log2(MAX_IMAGE_DIM/FILTER_SIZE). */ +#define MAX_LEVELS 10 + +/* Maximum number of quantization bins. This essentially determines + the maximum depth image to be represented. */ +#define MAX_BINS 511 + +/* ============= SECONDARY (derived) LIMITATIONS ============= */ + +/* This number determines the precision of the stored binsizes: + stored coefficients are accurate to +/- (1/SCALE_FACTOR). + On the other hand, this number also will limit the maximum amount + of compression. + It should not be more than [ 2^(8*sizeof(BinValueType)) ]/256. */ +#define SCALE_FACTOR 128 + +/* This number must be consistent with the filters that are + hardwired into epic.c */ +#define FILTER_SIZE 15 + +/* Log (base 2) of MAX_IMAGE_DIM^2: (bits required to store the dimensions) */ +#define LOG_MAX_IMAGE_SIZE 32 + +/* The type of the quantized images. Must be SIGNED, and capable of holding + values in the range [ -MAX_BINS, MAX_BINS ] */ +typedef short BinIndexType; + +/* The type used to represent the binsizes. Should be UNSIGNED. If this is + changed, be sure to change the places in epic.c and unepic.c where + binsizes are written or read from files. */ +typedef unsigned short BinValueType; + +/* Number of possible values for a symbol. This must be at least + (MAX_BINS * 4) (one sign bit, one tag bit)... */ +#define NUM_SYMBOL_VALUES 65536 + +/* Function prototypes. */ +void epic_build_pyr(float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size); + +void epic_build_level(float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, int filter_size, + float *result_block); + +void epic_internal_transpose(register float *mat, int rows, register int cols); + +void epic_reflect1(register float *filt, register int x_dim, int y_dim, + int x_pos, int y_pos, register float *result, int f_or_e); + +void epic_internal_filter(register float *image, register int x_dim, + register int y_dim, float *filt, register float *temp, + register int x_fdim, register int y_fdim, + int xgrid_start, int xgrid_step, int ygrid_start, + int ygrid_step, register float *result); + +void epic_reflect1(float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e); + +#endif // __EPIC_H_ diff --git a/targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.c b/targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.c new file mode 100644 index 0000000..bfd6386 --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.c @@ -0,0 +1,953 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: epic + + Author: Designed by Eero P. Simoncelli and Edward H. Adelson + Written by Eero P. Simoncelli + Developed at the Vision Science Group, The Media Laboratory + Copyright 1989, Massachusetts Institute of Technology + All rights reserved. + + Function: Efficient Pyramid Image Coder + + Source: MediaBench + + + Original name: epic + + Changes: no major functional changes + + License: + Permission to use, copy, or modify this software and its documentation + for educational and research purposes only and without fee is hereby + granted, provided that this copyright notice appear on all copies and + supporting documentation. For any other uses of this software, in + original or modified form, including but not limited to distribution + in whole or in part, specific prior permission must be obtained from + M.I.T. and the authors. These programs shall not be used, rewritten, + or adapted as the basis of a commercial software or hardware product + without first obtaining appropriate licenses from M.I.T. M.I.T. makes + no representations about the suitability of this software for any + purpose. It is provided "as is" without express or implied warranty. +*/ + +#include "epic.h" + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define X_SIZE 64 +#define Y_SIZE 64 + +float epic_image[] = { + 0x89, 0x88, 0x87, 0x86, 0x89, 0x87, 0x84, 0x86, 0x83, 0x89, 0x82, 0x83, + 0x84, 0x81, 0x80, 0x80, 0x81, 0x83, 0x88, 0x8A, 0x8E, 0x90, 0x96, 0x98, + 0x95, 0x92, 0x93, 0x88, 0x78, 0x7B, 0x60, 0x52, 0x41, 0x3F, 0x3A, 0x46, + 0x46, 0x48, 0x49, 0x48, 0x4F, 0x4A, 0x49, 0x50, 0x4C, 0x4B, 0x4D, 0x4C, + 0x4E, 0x4E, 0x4A, 0x49, 0x4D, 0x54, 0x50, 0x59, 0x51, 0x5A, 0x5E, 0x5A, + 0x5D, 0x61, 0x59, 0x65, 0x63, 0x65, 0x60, 0x62, 0x68, 0x67, 0x64, 0x61, + 0x64, 0x5E, 0x66, 0x63, 0x63, 0x61, 0x67, 0x68, 0x62, 0x64, 0x66, 0x67, + 0x64, 0x63, 0x66, 0x64, 0x67, 0x66, 0x65, 0x64, 0x64, 0x6A, 0x66, 0x65, + 0x68, 0x66, 0x69, 0x67, 0x6A, 0x66, 0x68, 0x66, 0x6C, 0x65, 0x69, 0x64, + 0x65, 0x64, 0x66, 0x62, 0x63, 0x68, 0x68, 0x65, 0x64, 0x64, 0x62, 0x63, + 0x68, 0x65, 0x66, 0x69, 0x66, 0x65, 0x61, 0x66, 0x6E, 0x69, 0x64, 0x61, + 0x63, 0x63, 0x66, 0x63, 0x62, 0x64, 0x60, 0x68, 0x63, 0x61, 0x62, 0x65, + 0x60, 0x63, 0x60, 0x62, 0x60, 0x5E, 0x61, 0x62, 0x5D, 0x5C, 0x57, 0x5B, + 0x58, 0x53, 0x54, 0x47, 0x49, 0x54, 0x5C, 0x6B, 0x6F, 0x77, 0x7F, 0x80, + 0x88, 0x8A, 0x8C, 0x85, 0x7A, 0x7D, 0x7F, 0x7D, 0x80, 0x80, 0x81, 0x80, + 0x85, 0x82, 0x81, 0x7E, 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7E, 0x83, 0x7F, + 0x81, 0x83, 0x87, 0x82, 0x83, 0x88, 0x84, 0x82, 0x82, 0x8A, 0xB3, 0xC5, + 0xCD, 0xCF, 0xD4, 0xD3, 0xD6, 0xCC, 0xB5, 0x80, 0x4E, 0x48, 0x4D, 0x4D, + 0x57, 0x5A, 0x59, 0x5C, 0x62, 0x58, 0x5C, 0x5B, 0x5B, 0x62, 0x5D, 0x5C, + 0x59, 0x5C, 0x5A, 0x59, 0x5D, 0x5F, 0x5B, 0x5F, 0x60, 0x5E, 0x5E, 0x57, + 0x5F, 0x5F, 0x60, 0x61, 0x5C, 0x61, 0x60, 0x5B, 0x56, 0x56, 0x57, 0x58, + 0x6E, 0x91, 0x96, 0x7E, 0x89, 0x88, 0x87, 0x86, 0x8A, 0x87, 0x84, 0x87, + 0x83, 0x89, 0x82, 0x83, 0x84, 0x81, 0x80, 0x80, 0x81, 0x83, 0x88, 0x8A, + 0x8E, 0x90, 0x96, 0x98, 0x94, 0x93, 0x93, 0x88, 0x78, 0x7B, 0x60, 0x52, + 0x41, 0x3F, 0x39, 0x46, 0x46, 0x48, 0x49, 0x47, 0x50, 0x4A, 0x49, 0x50, + 0x4D, 0x4B, 0x4D, 0x4C, 0x4E, 0x4E, 0x4A, 0x49, 0x4E, 0x54, 0x4F, 0x59, + 0x51, 0x5A, 0x5E, 0x5A, 0x5D, 0x61, 0x59, 0x65, 0x63, 0x65, 0x5F, 0x62, + 0x68, 0x67, 0x64, 0x61, 0x64, 0x5E, 0x66, 0x63, 0x63, 0x61, 0x67, 0x69, + 0x61, 0x63, 0x66, 0x67, 0x65, 0x63, 0x66, 0x64, 0x67, 0x67, 0x65, 0x64, + 0x64, 0x6A, 0x66, 0x65, 0x68, 0x66, 0x69, 0x67, 0x6A, 0x67, 0x69, 0x66, + 0x6C, 0x65, 0x69, 0x64, 0x65, 0x64, 0x66, 0x62, 0x63, 0x68, 0x68, 0x66, + 0x64, 0x64, 0x62, 0x63, 0x68, 0x65, 0x66, 0x6A, 0x67, 0x65, 0x60, 0x66, + 0x6F, 0x6A, 0x64, 0x61, 0x64, 0x63, 0x66, 0x63, 0x62, 0x64, 0x60, 0x69, + 0x64, 0x61, 0x62, 0x65, 0x60, 0x63, 0x60, 0x62, 0x60, 0x5E, 0x61, 0x62, + 0x5D, 0x5C, 0x57, 0x5B, 0x59, 0x53, 0x54, 0x47, 0x49, 0x54, 0x5C, 0x6B, + 0x6F, 0x77, 0x7F, 0x80, 0x88, 0x8A, 0x8C, 0x85, 0x7A, 0x7D, 0x7F, 0x7C, + 0x80, 0x80, 0x81, 0x80, 0x85, 0x82, 0x81, 0x7E, 0x80, 0x7F, 0x7F, 0x7E, + 0x7D, 0x7E, 0x83, 0x7F, 0x81, 0x83, 0x87, 0x81, 0x83, 0x88, 0x84, 0x82, + 0x82, 0x8A, 0xB5, 0xC5, 0xCD, 0xCF, 0xD4, 0xD3, 0xD6, 0xCC, 0xB4, 0x7E, + 0x4D, 0x48, 0x4E, 0x4D, 0x57, 0x5A, 0x59, 0x5C, 0x62, 0x58, 0x5C, 0x5B, + 0x5B, 0x62, 0x5D, 0x5C, 0x59, 0x5C, 0x5A, 0x59, 0x5D, 0x5F, 0x5B, 0x5F, + 0x60, 0x5E, 0x5E, 0x57, 0x5F, 0x5F, 0x60, 0x61, 0x5C, 0x61, 0x60, 0x5B, + 0x56, 0x56, 0x57, 0x58, 0x6F, 0x94, 0x9A, 0x82, 0x88, 0x89, 0x87, 0x86, + 0x88, 0x86, 0x84, 0x85, 0x82, 0x87, 0x82, 0x81, 0x83, 0x81, 0x7F, 0x80, + 0x82, 0x82, 0x87, 0x8A, 0x8F, 0x90, 0x95, 0x98, 0x95, 0x92, 0x92, 0x88, + 0x79, 0x77, 0x5F, 0x51, 0x41, 0x3E, 0x3B, 0x44, 0x44, 0x46, 0x49, 0x4A, + 0x4C, 0x49, 0x49, 0x4E, 0x4A, 0x4A, 0x4E, 0x4A, 0x4D, 0x4D, 0x48, 0x4A, + 0x4C, 0x52, 0x52, 0x58, 0x52, 0x59, 0x5E, 0x5A, 0x5D, 0x5F, 0x59, 0x64, + 0x64, 0x64, 0x62, 0x61, 0x66, 0x66, 0x64, 0x60, 0x62, 0x5F, 0x65, 0x63, + 0x62, 0x62, 0x65, 0x66, 0x62, 0x65, 0x67, 0x66, 0x64, 0x64, 0x65, 0x65, + 0x66, 0x65, 0x65, 0x63, 0x63, 0x67, 0x65, 0x64, 0x67, 0x67, 0x68, 0x66, + 0x6A, 0x66, 0x67, 0x66, 0x6C, 0x65, 0x6A, 0x64, 0x64, 0x63, 0x66, 0x62, + 0x63, 0x67, 0x69, 0x65, 0x64, 0x63, 0x62, 0x63, 0x68, 0x65, 0x66, 0x69, + 0x66, 0x65, 0x61, 0x65, 0x6C, 0x69, 0x64, 0x61, 0x62, 0x62, 0x64, 0x63, + 0x61, 0x63, 0x60, 0x66, 0x63, 0x61, 0x62, 0x65, 0x60, 0x62, 0x60, 0x62, + 0x60, 0x5E, 0x60, 0x61, 0x5C, 0x5C, 0x59, 0x5B, 0x57, 0x53, 0x52, 0x47, + 0x48, 0x54, 0x5C, 0x69, 0x6E, 0x77, 0x7D, 0x80, 0x88, 0x89, 0x8C, 0x84, + 0x7B, 0x7D, 0x7E, 0x7D, 0x7F, 0x80, 0x81, 0x7F, 0x85, 0x82, 0x80, 0x7E, + 0x7F, 0x7E, 0x7F, 0x7F, 0x7E, 0x7F, 0x82, 0x7F, 0x81, 0x83, 0x86, 0x82, + 0x83, 0x87, 0x84, 0x82, 0x81, 0x88, 0xB0, 0xC5, 0xCD, 0xCF, 0xD4, 0xD4, + 0xD6, 0xCD, 0xB8, 0x86, 0x51, 0x47, 0x4B, 0x4D, 0x56, 0x59, 0x59, 0x5B, + 0x5F, 0x59, 0x5C, 0x5D, 0x5B, 0x62, 0x5D, 0x5B, 0x5B, 0x5C, 0x5B, 0x5A, + 0x5E, 0x5F, 0x5D, 0x5F, 0x60, 0x5D, 0x5F, 0x58, 0x5E, 0x5F, 0x5F, 0x5F, + 0x5B, 0x60, 0x60, 0x5C, 0x57, 0x56, 0x59, 0x5B, 0x6E, 0x8A, 0x87, 0x6C, + 0x84, 0x88, 0x86, 0x84, 0x87, 0x85, 0x84, 0x82, 0x80, 0x84, 0x82, 0x7E, + 0x82, 0x7F, 0x7C, 0x80, 0x84, 0x80, 0x84, 0x8B, 0x90, 0x92, 0x93, 0x95, + 0x97, 0x91, 0x8E, 0x86, 0x79, 0x6F, 0x5B, 0x4F, 0x41, 0x3A, 0x3D, 0x3F, + 0x40, 0x42, 0x48, 0x4B, 0x46, 0x48, 0x47, 0x4A, 0x46, 0x49, 0x4D, 0x48, + 0x48, 0x4D, 0x46, 0x4C, 0x4B, 0x4F, 0x55, 0x55, 0x54, 0x58, 0x5D, 0x5B, + 0x5D, 0x5C, 0x5A, 0x61, 0x62, 0x60, 0x65, 0x61, 0x63, 0x65, 0x64, 0x5F, + 0x60, 0x61, 0x63, 0x63, 0x61, 0x63, 0x61, 0x63, 0x64, 0x66, 0x67, 0x66, + 0x64, 0x65, 0x65, 0x67, 0x64, 0x64, 0x66, 0x63, 0x62, 0x64, 0x63, 0x62, + 0x65, 0x67, 0x66, 0x65, 0x68, 0x65, 0x64, 0x64, 0x69, 0x63, 0x69, 0x65, + 0x63, 0x61, 0x63, 0x61, 0x63, 0x68, 0x6B, 0x65, 0x63, 0x61, 0x62, 0x64, + 0x66, 0x64, 0x65, 0x66, 0x63, 0x63, 0x63, 0x65, 0x65, 0x67, 0x65, 0x60, + 0x60, 0x5E, 0x60, 0x64, 0x5E, 0x63, 0x60, 0x61, 0x5F, 0x60, 0x61, 0x63, + 0x62, 0x62, 0x5E, 0x60, 0x61, 0x60, 0x5E, 0x5D, 0x5C, 0x5D, 0x5C, 0x5A, + 0x54, 0x51, 0x4E, 0x4A, 0x46, 0x50, 0x59, 0x62, 0x6A, 0x75, 0x79, 0x80, + 0x86, 0x86, 0x8B, 0x83, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x81, 0x81, 0x7E, + 0x83, 0x82, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x81, 0x81, 0x81, 0x7F, 0x7E, + 0x80, 0x82, 0x84, 0x83, 0x81, 0x84, 0x83, 0x82, 0x7F, 0x82, 0x9D, 0xBD, + 0xC9, 0xCE, 0xD2, 0xD4, 0xD6, 0xD2, 0xC4, 0xA1, 0x68, 0x49, 0x48, 0x4D, + 0x54, 0x56, 0x59, 0x5A, 0x5A, 0x5B, 0x5B, 0x60, 0x5B, 0x60, 0x5B, 0x5B, + 0x5C, 0x5C, 0x5D, 0x5D, 0x60, 0x5C, 0x5E, 0x5E, 0x5E, 0x5B, 0x5E, 0x5C, + 0x5D, 0x5E, 0x5F, 0x5C, 0x5C, 0x60, 0x61, 0x5E, 0x5A, 0x58, 0x5F, 0x62, + 0x5F, 0x5D, 0x48, 0x32, 0x81, 0x85, 0x85, 0x81, 0x86, 0x83, 0x84, 0x80, + 0x7F, 0x84, 0x83, 0x7E, 0x80, 0x7E, 0x7D, 0x80, 0x82, 0x7F, 0x85, 0x8D, + 0x91, 0x93, 0x92, 0x95, 0x95, 0x8F, 0x8C, 0x84, 0x76, 0x6B, 0x5D, 0x50, + 0x41, 0x38, 0x39, 0x3B, 0x41, 0x41, 0x46, 0x47, 0x45, 0x47, 0x44, 0x47, + 0x45, 0x4A, 0x49, 0x48, 0x45, 0x4C, 0x48, 0x4C, 0x4E, 0x4E, 0x51, 0x56, + 0x56, 0x59, 0x5A, 0x5C, 0x5C, 0x5E, 0x5A, 0x60, 0x5D, 0x60, 0x62, 0x61, + 0x63, 0x64, 0x62, 0x5F, 0x61, 0x62, 0x64, 0x62, 0x61, 0x64, 0x61, 0x64, + 0x63, 0x65, 0x65, 0x67, 0x63, 0x66, 0x65, 0x64, 0x63, 0x65, 0x66, 0x61, + 0x60, 0x67, 0x64, 0x62, 0x63, 0x65, 0x64, 0x65, 0x65, 0x63, 0x62, 0x63, + 0x63, 0x61, 0x67, 0x66, 0x63, 0x5F, 0x5E, 0x60, 0x63, 0x66, 0x6A, 0x64, + 0x62, 0x60, 0x64, 0x63, 0x65, 0x62, 0x62, 0x62, 0x60, 0x62, 0x63, 0x63, + 0x61, 0x64, 0x65, 0x60, 0x60, 0x5D, 0x61, 0x62, 0x5D, 0x61, 0x5E, 0x60, + 0x5C, 0x60, 0x5F, 0x60, 0x61, 0x61, 0x5F, 0x60, 0x61, 0x61, 0x5E, 0x5D, + 0x5D, 0x5B, 0x5A, 0x58, 0x52, 0x51, 0x4E, 0x4D, 0x47, 0x4A, 0x51, 0x5B, + 0x66, 0x70, 0x76, 0x7C, 0x81, 0x84, 0x8A, 0x85, 0x81, 0x80, 0x7F, 0x7C, + 0x7F, 0x82, 0x82, 0x81, 0x82, 0x82, 0x81, 0x84, 0x80, 0x82, 0x81, 0x80, + 0x81, 0x81, 0x80, 0x80, 0x81, 0x82, 0x81, 0x82, 0x7F, 0x81, 0x80, 0x81, + 0x7F, 0x7D, 0x86, 0xAB, 0xC1, 0xCB, 0xCF, 0xD2, 0xD3, 0xD5, 0xCF, 0xBA, + 0x8A, 0x57, 0x48, 0x4D, 0x51, 0x52, 0x55, 0x5A, 0x5A, 0x5B, 0x59, 0x5F, + 0x59, 0x5C, 0x59, 0x5C, 0x5A, 0x5A, 0x5B, 0x5C, 0x5F, 0x5C, 0x5D, 0x5B, + 0x5D, 0x5C, 0x5C, 0x5E, 0x5C, 0x5D, 0x61, 0x5E, 0x5D, 0x5F, 0x62, 0x61, + 0x61, 0x5F, 0x60, 0x5A, 0x3D, 0x28, 0x19, 0x13, 0x82, 0x84, 0x83, 0x7F, + 0x84, 0x83, 0x83, 0x81, 0x80, 0x83, 0x84, 0x82, 0x7F, 0x7F, 0x80, 0x7F, + 0x81, 0x83, 0x87, 0x8E, 0x92, 0x91, 0x93, 0x94, 0x91, 0x8F, 0x8E, 0x83, + 0x72, 0x6A, 0x60, 0x4F, 0x3F, 0x36, 0x37, 0x3D, 0x42, 0x3F, 0x43, 0x47, + 0x45, 0x45, 0x46, 0x46, 0x47, 0x4B, 0x44, 0x46, 0x44, 0x47, 0x48, 0x4B, + 0x51, 0x4D, 0x4F, 0x56, 0x56, 0x5A, 0x5A, 0x5B, 0x5B, 0x5D, 0x5B, 0x5F, + 0x5C, 0x62, 0x5D, 0x61, 0x62, 0x63, 0x60, 0x63, 0x62, 0x63, 0x64, 0x60, + 0x61, 0x64, 0x60, 0x66, 0x5F, 0x63, 0x65, 0x67, 0x63, 0x63, 0x63, 0x63, + 0x63, 0x65, 0x63, 0x61, 0x62, 0x66, 0x63, 0x63, 0x62, 0x63, 0x61, 0x62, + 0x64, 0x61, 0x64, 0x63, 0x61, 0x64, 0x66, 0x63, 0x63, 0x5E, 0x5D, 0x5E, + 0x63, 0x61, 0x64, 0x63, 0x63, 0x60, 0x63, 0x62, 0x64, 0x62, 0x63, 0x61, + 0x62, 0x61, 0x63, 0x60, 0x61, 0x61, 0x63, 0x63, 0x61, 0x62, 0x62, 0x60, + 0x5E, 0x5F, 0x5F, 0x61, 0x5D, 0x61, 0x5F, 0x5F, 0x5F, 0x5E, 0x61, 0x60, + 0x5F, 0x5F, 0x62, 0x61, 0x5D, 0x5A, 0x56, 0x58, 0x54, 0x52, 0x51, 0x4F, + 0x4C, 0x47, 0x4B, 0x57, 0x61, 0x6C, 0x72, 0x79, 0x7E, 0x82, 0x89, 0x87, + 0x82, 0x82, 0x7F, 0x7E, 0x80, 0x82, 0x86, 0x84, 0x85, 0x84, 0x83, 0x85, + 0x82, 0x82, 0x82, 0x80, 0x81, 0x83, 0x82, 0x80, 0x80, 0x83, 0x80, 0x81, + 0x7F, 0x81, 0x7F, 0x81, 0x83, 0x7A, 0x7D, 0x95, 0xB7, 0xC6, 0xCD, 0xD0, + 0xD3, 0xD5, 0xD4, 0xC9, 0xA9, 0x73, 0x4B, 0x48, 0x4D, 0x50, 0x53, 0x57, + 0x59, 0x5A, 0x57, 0x5C, 0x5B, 0x5A, 0x59, 0x5B, 0x59, 0x58, 0x58, 0x5A, + 0x5F, 0x5D, 0x5B, 0x58, 0x5D, 0x5A, 0x5C, 0x5D, 0x5D, 0x5E, 0x5E, 0x5F, + 0x5C, 0x5D, 0x62, 0x65, 0x66, 0x65, 0x55, 0x3D, 0x20, 0x13, 0x12, 0x17, + 0x83, 0x83, 0x80, 0x81, 0x84, 0x82, 0x81, 0x81, 0x81, 0x83, 0x81, 0x83, + 0x7F, 0x80, 0x80, 0x7E, 0x83, 0x8A, 0x8A, 0x90, 0x93, 0x91, 0x92, 0x92, + 0x8F, 0x90, 0x8D, 0x83, 0x71, 0x69, 0x5D, 0x4D, 0x41, 0x37, 0x37, 0x3F, + 0x3C, 0x3F, 0x42, 0x48, 0x44, 0x46, 0x49, 0x4B, 0x4A, 0x4A, 0x41, 0x45, + 0x45, 0x44, 0x44, 0x48, 0x50, 0x4C, 0x51, 0x53, 0x57, 0x57, 0x5A, 0x5A, + 0x5D, 0x5B, 0x5D, 0x5D, 0x5C, 0x5E, 0x5E, 0x62, 0x5E, 0x62, 0x60, 0x65, + 0x63, 0x63, 0x61, 0x5F, 0x61, 0x63, 0x5E, 0x65, 0x5E, 0x61, 0x66, 0x63, + 0x63, 0x61, 0x63, 0x65, 0x61, 0x62, 0x62, 0x64, 0x64, 0x63, 0x62, 0x62, + 0x60, 0x63, 0x62, 0x61, 0x64, 0x61, 0x64, 0x63, 0x62, 0x66, 0x66, 0x63, + 0x64, 0x5E, 0x60, 0x5F, 0x63, 0x62, 0x60, 0x63, 0x62, 0x60, 0x62, 0x62, + 0x64, 0x66, 0x66, 0x63, 0x65, 0x61, 0x65, 0x61, 0x60, 0x61, 0x61, 0x64, + 0x61, 0x63, 0x63, 0x61, 0x61, 0x5F, 0x61, 0x61, 0x5F, 0x62, 0x5E, 0x60, + 0x5F, 0x5B, 0x5F, 0x61, 0x5E, 0x5F, 0x65, 0x60, 0x5A, 0x5B, 0x58, 0x59, + 0x56, 0x53, 0x52, 0x50, 0x4E, 0x4B, 0x47, 0x51, 0x5A, 0x67, 0x6E, 0x77, + 0x7B, 0x7F, 0x87, 0x87, 0x86, 0x84, 0x82, 0x83, 0x83, 0x83, 0x86, 0x87, + 0x89, 0x88, 0x87, 0x84, 0x84, 0x83, 0x80, 0x80, 0x81, 0x84, 0x81, 0x81, + 0x80, 0x81, 0x7F, 0x7F, 0x7F, 0x82, 0x80, 0x81, 0x84, 0x7C, 0x7E, 0x82, + 0xA5, 0xC0, 0xCA, 0xCF, 0xD3, 0xD5, 0xD5, 0xD2, 0xBF, 0x96, 0x5C, 0x47, + 0x4B, 0x4E, 0x50, 0x55, 0x55, 0x58, 0x57, 0x5A, 0x5D, 0x5A, 0x5C, 0x59, + 0x5C, 0x55, 0x57, 0x5B, 0x60, 0x5B, 0x5B, 0x59, 0x5B, 0x5B, 0x5F, 0x5B, + 0x5D, 0x5E, 0x5B, 0x5D, 0x5D, 0x5D, 0x65, 0x68, 0x63, 0x5A, 0x3A, 0x23, + 0x19, 0x12, 0x17, 0x19, 0x83, 0x83, 0x81, 0x84, 0x82, 0x80, 0x82, 0x81, + 0x81, 0x81, 0x80, 0x81, 0x80, 0x7F, 0x7E, 0x82, 0x86, 0x8C, 0x90, 0x91, + 0x91, 0x92, 0x91, 0x92, 0x90, 0x8F, 0x87, 0x82, 0x72, 0x69, 0x5D, 0x4E, + 0x42, 0x39, 0x37, 0x3E, 0x3A, 0x42, 0x44, 0x43, 0x46, 0x4B, 0x49, 0x4E, + 0x4A, 0x49, 0x42, 0x48, 0x48, 0x44, 0x42, 0x45, 0x4C, 0x4D, 0x51, 0x51, + 0x55, 0x56, 0x5A, 0x5C, 0x5E, 0x5C, 0x5C, 0x5F, 0x5D, 0x5C, 0x60, 0x60, + 0x5C, 0x62, 0x62, 0x64, 0x63, 0x61, 0x61, 0x60, 0x61, 0x61, 0x60, 0x63, + 0x61, 0x61, 0x65, 0x62, 0x62, 0x65, 0x65, 0x65, 0x61, 0x62, 0x64, 0x65, + 0x66, 0x63, 0x64, 0x5F, 0x5F, 0x62, 0x65, 0x64, 0x64, 0x63, 0x62, 0x65, + 0x63, 0x64, 0x65, 0x62, 0x65, 0x60, 0x63, 0x60, 0x61, 0x66, 0x61, 0x64, + 0x5F, 0x60, 0x63, 0x62, 0x64, 0x67, 0x66, 0x67, 0x66, 0x61, 0x65, 0x64, + 0x60, 0x65, 0x61, 0x62, 0x61, 0x60, 0x64, 0x5F, 0x63, 0x61, 0x60, 0x5F, + 0x5F, 0x5E, 0x5D, 0x60, 0x61, 0x5D, 0x60, 0x61, 0x60, 0x60, 0x62, 0x5F, + 0x59, 0x5D, 0x5B, 0x5A, 0x57, 0x54, 0x51, 0x56, 0x4E, 0x4E, 0x48, 0x4C, + 0x55, 0x60, 0x6E, 0x75, 0x79, 0x7D, 0x84, 0x87, 0x89, 0x89, 0x87, 0x85, + 0x84, 0x86, 0x87, 0x8A, 0x89, 0x8A, 0x8A, 0x85, 0x82, 0x84, 0x82, 0x81, + 0x83, 0x83, 0x7D, 0x80, 0x80, 0x7E, 0x7F, 0x7C, 0x7E, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x7B, 0x8D, 0xB5, 0xC5, 0xCC, 0xD2, 0xD4, 0xD5, 0xD6, + 0xCC, 0xB4, 0x7F, 0x4E, 0x4C, 0x4B, 0x4F, 0x51, 0x56, 0x55, 0x54, 0x59, + 0x5C, 0x59, 0x5D, 0x59, 0x5B, 0x57, 0x57, 0x5D, 0x5D, 0x58, 0x5D, 0x5D, + 0x5A, 0x5F, 0x61, 0x5D, 0x5F, 0x5E, 0x5D, 0x60, 0x60, 0x63, 0x69, 0x62, + 0x50, 0x38, 0x1D, 0x1A, 0x1C, 0x17, 0x19, 0x18, 0x81, 0x82, 0x83, 0x82, + 0x81, 0x7E, 0x83, 0x83, 0x80, 0x82, 0x82, 0x80, 0x80, 0x7D, 0x80, 0x88, + 0x8A, 0x8D, 0x93, 0x8F, 0x91, 0x91, 0x90, 0x8F, 0x90, 0x8C, 0x84, 0x81, + 0x71, 0x69, 0x5E, 0x4B, 0x40, 0x3A, 0x38, 0x3B, 0x3B, 0x45, 0x44, 0x3E, + 0x46, 0x4B, 0x4A, 0x4B, 0x45, 0x47, 0x45, 0x49, 0x44, 0x45, 0x42, 0x47, + 0x4A, 0x4F, 0x52, 0x51, 0x53, 0x57, 0x59, 0x5D, 0x5B, 0x5E, 0x5A, 0x60, + 0x5F, 0x5F, 0x5F, 0x61, 0x5C, 0x61, 0x64, 0x63, 0x62, 0x60, 0x62, 0x62, + 0x63, 0x60, 0x61, 0x60, 0x64, 0x64, 0x66, 0x63, 0x61, 0x68, 0x65, 0x65, + 0x63, 0x66, 0x65, 0x63, 0x65, 0x63, 0x64, 0x61, 0x60, 0x60, 0x62, 0x66, + 0x64, 0x61, 0x63, 0x65, 0x64, 0x62, 0x66, 0x60, 0x67, 0x63, 0x61, 0x5E, + 0x5D, 0x66, 0x65, 0x63, 0x60, 0x60, 0x61, 0x62, 0x66, 0x68, 0x66, 0x6B, + 0x65, 0x62, 0x65, 0x63, 0x63, 0x64, 0x63, 0x62, 0x60, 0x61, 0x62, 0x5D, + 0x62, 0x62, 0x61, 0x5E, 0x5F, 0x5A, 0x5E, 0x5E, 0x61, 0x60, 0x62, 0x60, + 0x62, 0x5E, 0x5F, 0x60, 0x5E, 0x5F, 0x59, 0x5B, 0x56, 0x54, 0x51, 0x59, + 0x4E, 0x4E, 0x49, 0x47, 0x52, 0x5B, 0x6B, 0x72, 0x76, 0x7C, 0x82, 0x86, + 0x87, 0x8E, 0x89, 0x85, 0x85, 0x87, 0x88, 0x8D, 0x89, 0x89, 0x8A, 0x89, + 0x82, 0x84, 0x85, 0x86, 0x86, 0x80, 0x7E, 0x7E, 0x7E, 0x7F, 0x81, 0x7D, + 0x7F, 0x7C, 0x7E, 0x7D, 0x7E, 0x80, 0x7D, 0x7C, 0x7B, 0x9F, 0xBD, 0xC9, + 0xD0, 0xD3, 0xD5, 0xD6, 0xD3, 0xC6, 0xA3, 0x64, 0x4C, 0x47, 0x50, 0x4D, + 0x58, 0x53, 0x52, 0x58, 0x59, 0x5A, 0x5C, 0x59, 0x5B, 0x5E, 0x58, 0x5E, + 0x5B, 0x5D, 0x5F, 0x5C, 0x5B, 0x60, 0x63, 0x5F, 0x62, 0x62, 0x60, 0x64, + 0x65, 0x68, 0x63, 0x4F, 0x30, 0x17, 0x14, 0x13, 0x17, 0x1A, 0x15, 0x17, + 0x82, 0x83, 0x83, 0x80, 0x82, 0x7F, 0x83, 0x86, 0x83, 0x86, 0x81, 0x81, + 0x80, 0x7F, 0x85, 0x88, 0x8C, 0x8F, 0x92, 0x8E, 0x93, 0x8F, 0x8E, 0x8B, + 0x8E, 0x8A, 0x85, 0x7E, 0x71, 0x68, 0x5E, 0x4F, 0x42, 0x3E, 0x38, 0x39, + 0x3D, 0x45, 0x42, 0x42, 0x44, 0x47, 0x4B, 0x49, 0x45, 0x46, 0x47, 0x46, + 0x42, 0x45, 0x44, 0x48, 0x4A, 0x50, 0x52, 0x51, 0x55, 0x54, 0x57, 0x5A, + 0x5A, 0x5D, 0x57, 0x5F, 0x5E, 0x60, 0x5D, 0x61, 0x5E, 0x61, 0x64, 0x62, + 0x60, 0x62, 0x62, 0x63, 0x63, 0x62, 0x62, 0x61, 0x63, 0x62, 0x65, 0x63, + 0x60, 0x65, 0x64, 0x63, 0x64, 0x66, 0x64, 0x61, 0x62, 0x64, 0x63, 0x63, + 0x63, 0x5F, 0x61, 0x67, 0x62, 0x61, 0x64, 0x63, 0x63, 0x62, 0x65, 0x61, + 0x68, 0x61, 0x63, 0x61, 0x5D, 0x65, 0x68, 0x62, 0x60, 0x5E, 0x5E, 0x63, + 0x67, 0x69, 0x68, 0x69, 0x69, 0x64, 0x65, 0x64, 0x65, 0x61, 0x64, 0x64, + 0x64, 0x62, 0x62, 0x5C, 0x60, 0x62, 0x63, 0x61, 0x61, 0x5B, 0x5C, 0x5C, + 0x60, 0x60, 0x61, 0x5F, 0x63, 0x5B, 0x5D, 0x60, 0x61, 0x5F, 0x5B, 0x5C, + 0x5A, 0x53, 0x52, 0x56, 0x4E, 0x4C, 0x48, 0x44, 0x4E, 0x5A, 0x65, 0x6F, + 0x74, 0x7C, 0x81, 0x85, 0x85, 0x8E, 0x88, 0x87, 0x88, 0x87, 0x88, 0x8E, + 0x89, 0x8A, 0x8A, 0x8B, 0x86, 0x83, 0x84, 0x87, 0x86, 0x83, 0x80, 0x7F, + 0x7F, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7F, 0x80, 0x7D, 0x7C, 0x7C, + 0x78, 0x84, 0xAD, 0xC3, 0xCC, 0xD2, 0xD4, 0xD6, 0xD6, 0xCF, 0xB9, 0x87, + 0x54, 0x47, 0x51, 0x4D, 0x56, 0x53, 0x54, 0x59, 0x57, 0x5B, 0x5E, 0x5B, + 0x5E, 0x61, 0x5A, 0x5E, 0x5A, 0x63, 0x5D, 0x5D, 0x5F, 0x5E, 0x62, 0x5F, + 0x62, 0x65, 0x63, 0x68, 0x6A, 0x63, 0x4D, 0x33, 0x17, 0x12, 0x1B, 0x11, + 0x16, 0x18, 0x14, 0x16, 0x84, 0x83, 0x82, 0x7F, 0x83, 0x81, 0x82, 0x86, + 0x86, 0x85, 0x80, 0x83, 0x7E, 0x80, 0x85, 0x86, 0x8C, 0x90, 0x8F, 0x8E, + 0x93, 0x8C, 0x8C, 0x8B, 0x88, 0x88, 0x84, 0x7C, 0x74, 0x68, 0x62, 0x5B, + 0x45, 0x3F, 0x38, 0x3A, 0x3F, 0x42, 0x41, 0x45, 0x4D, 0x46, 0x49, 0x48, + 0x44, 0x47, 0x45, 0x43, 0x47, 0x46, 0x45, 0x45, 0x4B, 0x51, 0x50, 0x52, + 0x57, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x57, 0x5E, 0x5B, 0x5E, 0x5E, 0x60, + 0x61, 0x60, 0x63, 0x61, 0x5E, 0x63, 0x61, 0x63, 0x62, 0x63, 0x63, 0x62, + 0x61, 0x61, 0x63, 0x64, 0x60, 0x60, 0x64, 0x61, 0x63, 0x61, 0x63, 0x61, + 0x61, 0x61, 0x63, 0x62, 0x64, 0x60, 0x61, 0x64, 0x60, 0x61, 0x61, 0x62, + 0x63, 0x60, 0x61, 0x62, 0x65, 0x5F, 0x66, 0x63, 0x61, 0x63, 0x65, 0x62, + 0x5E, 0x5E, 0x5F, 0x62, 0x65, 0x66, 0x67, 0x67, 0x6D, 0x64, 0x62, 0x63, + 0x65, 0x61, 0x62, 0x62, 0x69, 0x61, 0x64, 0x5C, 0x5F, 0x61, 0x61, 0x60, + 0x61, 0x5C, 0x5B, 0x5E, 0x60, 0x5F, 0x60, 0x60, 0x60, 0x5B, 0x5E, 0x5E, + 0x60, 0x5C, 0x5D, 0x5C, 0x60, 0x57, 0x53, 0x53, 0x4E, 0x4D, 0x49, 0x44, + 0x4C, 0x55, 0x61, 0x6C, 0x74, 0x7B, 0x80, 0x84, 0x86, 0x8B, 0x89, 0x89, + 0x89, 0x87, 0x87, 0x8D, 0x89, 0x8C, 0x89, 0x8A, 0x89, 0x83, 0x83, 0x83, + 0x85, 0x86, 0x7F, 0x81, 0x80, 0x82, 0x7E, 0x7F, 0x7D, 0x80, 0x7F, 0x81, + 0x7F, 0x7C, 0x7D, 0x7B, 0x7B, 0x76, 0x95, 0xBA, 0xC7, 0xD0, 0xD2, 0xD5, + 0xD7, 0xD4, 0xC8, 0xAA, 0x70, 0x48, 0x4F, 0x4D, 0x54, 0x52, 0x55, 0x58, + 0x56, 0x59, 0x5A, 0x5C, 0x5F, 0x5E, 0x59, 0x5D, 0x5A, 0x5D, 0x5D, 0x62, + 0x63, 0x61, 0x61, 0x62, 0x63, 0x66, 0x68, 0x6D, 0x65, 0x4A, 0x31, 0x1C, + 0x12, 0x1B, 0x22, 0x16, 0x1B, 0x16, 0x16, 0x18, 0x84, 0x83, 0x7E, 0x82, + 0x83, 0x81, 0x82, 0x85, 0x87, 0x84, 0x83, 0x84, 0x7D, 0x80, 0x83, 0x88, + 0x8E, 0x90, 0x90, 0x8C, 0x8F, 0x8D, 0x8C, 0x88, 0x85, 0x86, 0x83, 0x7C, + 0x78, 0x6A, 0x63, 0x5A, 0x43, 0x3A, 0x39, 0x3D, 0x3F, 0x3E, 0x42, 0x43, + 0x57, 0x45, 0x48, 0x44, 0x43, 0x4B, 0x43, 0x44, 0x48, 0x46, 0x46, 0x46, + 0x4C, 0x52, 0x4D, 0x52, 0x56, 0x59, 0x55, 0x58, 0x57, 0x5A, 0x5B, 0x5B, + 0x5D, 0x5C, 0x5D, 0x60, 0x63, 0x62, 0x60, 0x61, 0x60, 0x5F, 0x62, 0x63, + 0x5F, 0x60, 0x62, 0x62, 0x61, 0x61, 0x63, 0x64, 0x61, 0x60, 0x64, 0x63, + 0x62, 0x60, 0x64, 0x63, 0x60, 0x5F, 0x63, 0x62, 0x61, 0x64, 0x5E, 0x61, + 0x60, 0x60, 0x5E, 0x62, 0x60, 0x5F, 0x60, 0x60, 0x61, 0x5F, 0x61, 0x61, + 0x61, 0x61, 0x61, 0x61, 0x5D, 0x60, 0x5E, 0x5F, 0x63, 0x62, 0x66, 0x66, + 0x69, 0x64, 0x61, 0x62, 0x64, 0x62, 0x63, 0x61, 0x65, 0x61, 0x60, 0x5F, + 0x5E, 0x63, 0x5E, 0x5D, 0x5D, 0x5D, 0x5B, 0x60, 0x5F, 0x5F, 0x5D, 0x5F, + 0x5B, 0x5B, 0x5F, 0x5E, 0x5D, 0x5A, 0x5C, 0x5B, 0x5C, 0x58, 0x52, 0x51, + 0x4E, 0x51, 0x4A, 0x47, 0x4D, 0x51, 0x5E, 0x69, 0x74, 0x7B, 0x7E, 0x82, + 0x86, 0x89, 0x8B, 0x89, 0x88, 0x8A, 0x86, 0x88, 0x88, 0x8C, 0x88, 0x89, + 0x89, 0x88, 0x85, 0x7F, 0x83, 0x84, 0x80, 0x80, 0x80, 0x81, 0x7C, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7B, 0x7D, 0x7C, 0x78, 0x74, 0x7F, 0xA8, + 0xC1, 0xCB, 0xD1, 0xD4, 0xD6, 0xD6, 0xD2, 0xC1, 0x94, 0x57, 0x49, 0x4C, + 0x52, 0x53, 0x57, 0x5A, 0x57, 0x59, 0x53, 0x5A, 0x5E, 0x5C, 0x5A, 0x5A, + 0x5A, 0x57, 0x60, 0x63, 0x65, 0x64, 0x63, 0x64, 0x66, 0x69, 0x6A, 0x67, + 0x4E, 0x30, 0x1C, 0x12, 0x15, 0x19, 0x1F, 0x1A, 0x1A, 0x16, 0x1A, 0x1B, + 0x81, 0x81, 0x7D, 0x83, 0x85, 0x81, 0x84, 0x84, 0x86, 0x83, 0x84, 0x83, + 0x7E, 0x84, 0x86, 0x8B, 0x8F, 0x8F, 0x94, 0x8D, 0x8D, 0x8B, 0x8C, 0x85, + 0x85, 0x85, 0x84, 0x7D, 0x79, 0x6B, 0x5C, 0x4F, 0x3F, 0x36, 0x36, 0x3A, + 0x3E, 0x3B, 0x43, 0x44, 0x4E, 0x45, 0x47, 0x42, 0x45, 0x4B, 0x44, 0x44, + 0x48, 0x44, 0x46, 0x4A, 0x4B, 0x4F, 0x4D, 0x50, 0x56, 0x5A, 0x57, 0x59, + 0x56, 0x58, 0x5E, 0x5C, 0x5F, 0x5F, 0x5C, 0x5F, 0x5D, 0x65, 0x5D, 0x62, + 0x5F, 0x5C, 0x61, 0x60, 0x5F, 0x5E, 0x61, 0x62, 0x61, 0x61, 0x63, 0x60, + 0x5F, 0x61, 0x63, 0x63, 0x61, 0x61, 0x64, 0x62, 0x60, 0x61, 0x66, 0x63, + 0x62, 0x64, 0x5E, 0x61, 0x60, 0x5F, 0x5C, 0x5F, 0x5C, 0x60, 0x5E, 0x5D, + 0x5E, 0x5E, 0x5B, 0x5F, 0x60, 0x5D, 0x5E, 0x60, 0x5E, 0x60, 0x5B, 0x5E, + 0x61, 0x60, 0x63, 0x64, 0x64, 0x65, 0x63, 0x61, 0x63, 0x61, 0x64, 0x64, + 0x60, 0x62, 0x5C, 0x5F, 0x5D, 0x63, 0x5E, 0x5C, 0x5D, 0x5D, 0x5B, 0x5F, + 0x5E, 0x60, 0x5D, 0x5D, 0x5B, 0x5D, 0x5E, 0x5E, 0x5C, 0x5B, 0x5D, 0x59, + 0x5A, 0x58, 0x52, 0x4D, 0x4F, 0x4F, 0x4A, 0x4B, 0x50, 0x54, 0x5C, 0x66, + 0x71, 0x79, 0x7C, 0x83, 0x85, 0x89, 0x8B, 0x8A, 0x87, 0x8D, 0x86, 0x84, + 0x87, 0x89, 0x88, 0x88, 0x87, 0x89, 0x86, 0x81, 0x83, 0x84, 0x82, 0x80, + 0x82, 0x80, 0x7C, 0x7D, 0x7F, 0x7D, 0x7D, 0x7C, 0x7F, 0x7C, 0x7C, 0x7D, + 0x78, 0x75, 0x75, 0x91, 0xB7, 0xC7, 0xCF, 0xD4, 0xD5, 0xD6, 0xD7, 0xCE, + 0xB2, 0x7C, 0x4A, 0x4A, 0x4F, 0x53, 0x58, 0x5B, 0x5B, 0x5C, 0x57, 0x59, + 0x5E, 0x5C, 0x5A, 0x58, 0x59, 0x5B, 0x5E, 0x60, 0x61, 0x62, 0x63, 0x64, + 0x69, 0x6B, 0x63, 0x50, 0x2B, 0x27, 0x19, 0x11, 0x13, 0x15, 0x15, 0x17, + 0x14, 0x18, 0x1E, 0x1A, 0x7F, 0x7F, 0x81, 0x82, 0x84, 0x82, 0x85, 0x83, + 0x83, 0x83, 0x85, 0x82, 0x81, 0x89, 0x8A, 0x8D, 0x8F, 0x90, 0x92, 0x8E, + 0x8A, 0x87, 0x89, 0x85, 0x87, 0x87, 0x85, 0x7D, 0x78, 0x6C, 0x58, 0x4B, + 0x3B, 0x33, 0x30, 0x36, 0x3E, 0x3D, 0x43, 0x46, 0x43, 0x46, 0x46, 0x45, + 0x48, 0x47, 0x46, 0x44, 0x49, 0x42, 0x46, 0x4A, 0x4B, 0x4B, 0x4F, 0x4F, + 0x56, 0x5B, 0x57, 0x58, 0x57, 0x5A, 0x5B, 0x5E, 0x5F, 0x61, 0x5C, 0x5E, + 0x5D, 0x61, 0x5E, 0x62, 0x5D, 0x5E, 0x5F, 0x5E, 0x61, 0x61, 0x60, 0x62, + 0x61, 0x61, 0x60, 0x5F, 0x5D, 0x60, 0x5F, 0x61, 0x61, 0x60, 0x62, 0x5E, + 0x60, 0x64, 0x65, 0x63, 0x66, 0x65, 0x65, 0x60, 0x5F, 0x5C, 0x59, 0x5B, + 0x5B, 0x5D, 0x59, 0x5C, 0x5B, 0x5D, 0x5E, 0x5F, 0x5F, 0x5A, 0x5C, 0x5E, + 0x5E, 0x5F, 0x5A, 0x60, 0x5D, 0x5F, 0x5F, 0x63, 0x62, 0x64, 0x63, 0x61, + 0x61, 0x63, 0x64, 0x66, 0x60, 0x61, 0x5E, 0x5D, 0x5D, 0x5F, 0x5E, 0x5D, + 0x60, 0x5C, 0x5D, 0x5F, 0x5D, 0x5E, 0x5E, 0x5D, 0x5C, 0x60, 0x5E, 0x5D, + 0x5D, 0x5B, 0x5C, 0x59, 0x5C, 0x5B, 0x53, 0x4E, 0x50, 0x4A, 0x48, 0x4B, + 0x50, 0x56, 0x5C, 0x63, 0x6E, 0x74, 0x7E, 0x83, 0x84, 0x88, 0x8B, 0x89, + 0x89, 0x8B, 0x85, 0x85, 0x87, 0x86, 0x88, 0x85, 0x86, 0x87, 0x86, 0x85, + 0x82, 0x84, 0x82, 0x81, 0x83, 0x80, 0x7F, 0x7E, 0x7D, 0x7F, 0x7F, 0x7C, + 0x7F, 0x7C, 0x7E, 0x7D, 0x7A, 0x78, 0x75, 0x7C, 0xA4, 0xC2, 0xCC, 0xD3, + 0xD4, 0xD7, 0xD9, 0xD5, 0xC7, 0xA2, 0x60, 0x46, 0x4E, 0x50, 0x54, 0x57, + 0x5C, 0x5E, 0x5D, 0x5A, 0x5D, 0x5A, 0x5A, 0x59, 0x59, 0x5E, 0x5E, 0x5D, + 0x5E, 0x61, 0x63, 0x67, 0x69, 0x64, 0x4C, 0x2D, 0x12, 0x1C, 0x1B, 0x10, + 0x0E, 0x14, 0x11, 0x13, 0x12, 0x1B, 0x1D, 0x1A, 0x82, 0x81, 0x85, 0x82, + 0x83, 0x82, 0x85, 0x85, 0x84, 0x84, 0x87, 0x85, 0x84, 0x8C, 0x8C, 0x90, + 0x91, 0x91, 0x8E, 0x8E, 0x87, 0x84, 0x85, 0x85, 0x86, 0x89, 0x86, 0x7F, + 0x76, 0x69, 0x59, 0x4D, 0x3A, 0x35, 0x31, 0x36, 0x3F, 0x40, 0x42, 0x45, + 0x45, 0x46, 0x49, 0x44, 0x49, 0x47, 0x48, 0x44, 0x47, 0x43, 0x46, 0x49, + 0x4B, 0x4B, 0x50, 0x52, 0x54, 0x5A, 0x58, 0x58, 0x59, 0x5E, 0x5B, 0x5C, + 0x5F, 0x5E, 0x5B, 0x5D, 0x62, 0x5F, 0x5F, 0x5F, 0x5D, 0x5E, 0x60, 0x5F, + 0x63, 0x63, 0x5E, 0x62, 0x61, 0x60, 0x5E, 0x61, 0x60, 0x60, 0x5E, 0x62, + 0x62, 0x5F, 0x5F, 0x5C, 0x60, 0x61, 0x60, 0x65, 0x67, 0x68, 0x68, 0x61, + 0x5F, 0x5A, 0x58, 0x5A, 0x5A, 0x58, 0x57, 0x59, 0x5A, 0x5D, 0x5F, 0x60, + 0x5D, 0x5C, 0x5C, 0x5C, 0x5B, 0x5D, 0x5C, 0x5F, 0x5E, 0x5F, 0x60, 0x60, + 0x61, 0x62, 0x63, 0x65, 0x62, 0x64, 0x64, 0x64, 0x61, 0x60, 0x60, 0x5C, + 0x5E, 0x5F, 0x5E, 0x60, 0x5E, 0x5D, 0x5C, 0x5E, 0x5D, 0x5B, 0x5D, 0x5D, + 0x5B, 0x61, 0x5F, 0x5C, 0x5F, 0x5C, 0x5B, 0x5B, 0x57, 0x59, 0x56, 0x52, + 0x50, 0x4C, 0x49, 0x4B, 0x4E, 0x55, 0x5E, 0x65, 0x6D, 0x73, 0x7F, 0x81, + 0x85, 0x85, 0x8A, 0x89, 0x8A, 0x88, 0x86, 0x86, 0x88, 0x84, 0x89, 0x83, + 0x88, 0x84, 0x84, 0x84, 0x82, 0x82, 0x82, 0x81, 0x83, 0x80, 0x80, 0x7F, + 0x7F, 0x85, 0x80, 0x7E, 0x7D, 0x7D, 0x7E, 0x7D, 0x79, 0x79, 0x77, 0x73, + 0x8B, 0xB6, 0xC7, 0xD0, 0xD3, 0xD5, 0xD8, 0xD8, 0xD2, 0xBC, 0x86, 0x4A, + 0x48, 0x50, 0x52, 0x56, 0x58, 0x5A, 0x58, 0x5C, 0x5C, 0x59, 0x5B, 0x5B, + 0x5A, 0x5E, 0x5E, 0x5E, 0x5F, 0x64, 0x66, 0x69, 0x62, 0x49, 0x27, 0x13, + 0x0D, 0x14, 0x18, 0x10, 0x12, 0x12, 0x12, 0x14, 0x14, 0x1C, 0x19, 0x21, + 0x82, 0x83, 0x86, 0x83, 0x83, 0x84, 0x84, 0x86, 0x86, 0x85, 0x85, 0x89, + 0x8A, 0x8F, 0x8F, 0x91, 0x92, 0x8F, 0x8E, 0x8D, 0x86, 0x85, 0x84, 0x84, + 0x85, 0x8A, 0x88, 0x83, 0x76, 0x69, 0x5E, 0x4E, 0x3D, 0x39, 0x34, 0x38, + 0x3F, 0x40, 0x42, 0x45, 0x48, 0x47, 0x4C, 0x45, 0x4B, 0x49, 0x46, 0x44, + 0x46, 0x43, 0x45, 0x48, 0x4A, 0x4A, 0x4F, 0x51, 0x53, 0x55, 0x59, 0x59, + 0x5A, 0x5D, 0x5B, 0x59, 0x5F, 0x5C, 0x5D, 0x5C, 0x61, 0x61, 0x5F, 0x5D, + 0x5D, 0x5B, 0x5F, 0x60, 0x61, 0x62, 0x5E, 0x60, 0x60, 0x60, 0x5F, 0x61, + 0x61, 0x61, 0x60, 0x61, 0x61, 0x5F, 0x60, 0x5E, 0x61, 0x5C, 0x60, 0x65, + 0x65, 0x64, 0x65, 0x62, 0x60, 0x5F, 0x5B, 0x58, 0x59, 0x55, 0x59, 0x57, + 0x5B, 0x5A, 0x5C, 0x5F, 0x5E, 0x5C, 0x5C, 0x5D, 0x5D, 0x5A, 0x5C, 0x5D, + 0x5E, 0x5F, 0x64, 0x5E, 0x60, 0x62, 0x61, 0x65, 0x67, 0x62, 0x64, 0x60, + 0x60, 0x5D, 0x5F, 0x5E, 0x60, 0x61, 0x60, 0x60, 0x61, 0x5E, 0x58, 0x5E, + 0x5C, 0x5A, 0x5D, 0x5B, 0x5B, 0x60, 0x5E, 0x5F, 0x5F, 0x61, 0x5A, 0x59, + 0x55, 0x55, 0x57, 0x54, 0x4F, 0x4D, 0x4B, 0x4A, 0x4A, 0x55, 0x5F, 0x66, + 0x6A, 0x74, 0x7B, 0x7D, 0x84, 0x84, 0x86, 0x89, 0x88, 0x87, 0x86, 0x84, + 0x88, 0x82, 0x88, 0x84, 0x88, 0x84, 0x83, 0x83, 0x83, 0x82, 0x81, 0x81, + 0x84, 0x81, 0x7F, 0x7F, 0x82, 0x88, 0x81, 0x83, 0x7D, 0x7F, 0x7D, 0x7D, + 0x7A, 0x7A, 0x77, 0x72, 0x79, 0x9D, 0xBB, 0xCA, 0xD0, 0xD4, 0xD7, 0xD8, + 0xD8, 0xCD, 0xAE, 0x6D, 0x49, 0x50, 0x50, 0x57, 0x55, 0x58, 0x54, 0x5B, + 0x59, 0x5B, 0x5C, 0x5C, 0x5E, 0x5D, 0x5C, 0x61, 0x62, 0x66, 0x67, 0x65, + 0x51, 0x27, 0x10, 0x0D, 0x15, 0x14, 0x15, 0x10, 0x16, 0x13, 0x15, 0x17, + 0x17, 0x18, 0x19, 0x23}; + +/* + Macro definitions +*/ + +#define abs(x) (x >= 0 ? x : -(x)) +#define FILTER 0 +#define EXPAND 1 +#define IS == +#define ISNT != +#define AND && +#define OR || + +#define NUM_LEVELS 4 + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void epic_init(void); +__attribute__((always_inline)) static inline void +epic_build_pyr(float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size); +__attribute__((always_inline)) static inline void +epic_build_level(float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, int filter_size, + float *result_block); +__attribute__((always_inline)) static inline void +epic_internal_transpose(float *mat, int rows, int cols); +__attribute__((always_inline)) static inline void +epic_internal_filter(float *image, int x_dim, int y_dim, float *filt, + float *temp, int x_fdim, int y_fdim, int xgrid_start, + int xgrid_step, int ygrid_start, int ygrid_step, + float *result); +__attribute__((always_inline)) static inline void +epic_reflect1(float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +epic_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +float epic_filtertemp[FILTER_SIZE]; +float epic_hi_imagetemp[X_SIZE * Y_SIZE / 2]; +float epic_lo_imagetemp[X_SIZE * Y_SIZE / 2]; + +static float epic_lo_filter[FILTER_SIZE] = { + -0.0012475221, -0.0024950907, 0.0087309530, 0.0199579580, -0.0505290000, + -0.1205509700, 0.2930455800, 0.7061761600, 0.2930455800, -0.1205509700, + -0.0505290000, 0.0199579580, 0.0087309530, -0.0024950907, -0.0012475221}; + +static float epic_hi_filter[FILTER_SIZE] = { + 0.0012475221, -0.0024950907, -0.0087309530, 0.0199579580, 0.0505290000, + -0.1205509700, -0.2930455800, 0.7061761600, -0.2930455800, -0.1205509700, + 0.0505290000, 0.0199579580, -0.0087309530, -0.0024950907, 0.0012475221}; + +/* + Initialization function +*/ + +__attribute__((always_inline)) static inline void +epic_init(void) { + int i; + + __pragma_loopbound(4096, 4096); + for (i = 0; i < X_SIZE * Y_SIZE; ++i) + epic_image[i] *= SCALE_FACTOR; +} + +/* + Algorithm core functions +*/ + +/* + ====================================================================== + epic_build_pyr() -- builds a separable QMF-style pyramid. The pyramid + is written over the original image. NOTE: the image size must be + divisible by 2^num_levels, but we do not check this here. + ====================================================================== +*/ +__attribute__((always_inline)) static inline void +epic_build_pyr(float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size) { + int x_level, y_level, level; + + x_level = x_size; + y_level = y_size; + + __pragma_loopbound(4, 4); + for (level = 0; level < num_levels; ++level) { + epic_build_level(image, x_level, y_level, lo_filter, hi_filter, + filter_size, image); + x_level /= 2; + y_level /= 2; + } +} + +/* + ====================================================================== + epic_build_level() -- builds a level of the pyramid by computing 4 + filtered and subsampled images. Since the convolution is separable, + image and result-block can point to the same place! Image order is + lowpass, horizontal, vertical (transposed), and diagonal. + ====================================================================== +*/ +__attribute__((always_inline)) static inline void +epic_build_level(float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, int filter_size, + float *result_block) { + int total_size = level_x_size * level_y_size; + + /* filter and subsample in the X direction */ + epic_internal_filter(image, level_x_size, level_y_size, lo_filter, + epic_filtertemp, filter_size, 1, 0, 2, 0, 1, + epic_lo_imagetemp); + epic_internal_filter(image, level_x_size, level_y_size, hi_filter, + epic_filtertemp, filter_size, 1, 1, 2, 0, 1, + epic_hi_imagetemp); + + level_x_size /= 2; + /* now filter and subsample in the Y direction */ + epic_internal_filter( + epic_lo_imagetemp, level_x_size, level_y_size, /* lowpass */ + lo_filter, epic_filtertemp, 1, filter_size, 0, 1, 0, 2, result_block); + epic_internal_filter(epic_lo_imagetemp, level_x_size, + level_y_size, /* horizontal */ + hi_filter, epic_filtertemp, 1, filter_size, 0, 1, 1, 2, + (result_block += (total_size / 4))); + epic_internal_filter(epic_hi_imagetemp, level_x_size, + level_y_size, /* vertical */ + lo_filter, epic_filtertemp, 1, filter_size, 0, 1, 0, 2, + (result_block += (total_size / 4))); + /* transpose the vertical band for more efficient scanning */ + epic_internal_transpose(result_block, level_y_size / 2, level_x_size); + epic_internal_filter(epic_hi_imagetemp, level_x_size, + level_y_size, /* diagonal */ + hi_filter, epic_filtertemp, 1, filter_size, 0, 1, 1, 2, + (result_block += (total_size / 4))); +} + +/* + ====================================================================== + In-place matrix tranpose algorithm. Handles non-square matrices, + too! Is there a faster algorithm?? + ====================================================================== +*/ +__attribute__((always_inline)) static inline void +epic_internal_transpose(float *mat, int rows, int cols) { + register int swap_pos; + register int modulus = rows * cols - 1; + register int current_pos; + register float swap_val; + + /* loop, ignoring first and last elements */ + __pragma_loopbound(14, 2399); + for (current_pos = 1; current_pos < modulus; ++current_pos) { + /* Compute swap position */ + swap_pos = current_pos; + + __pragma_loopbound(1, 2); + do { + swap_pos = (swap_pos * cols) % modulus; + } while (swap_pos < current_pos); + + if (current_pos != swap_pos) { + swap_val = mat[swap_pos]; + mat[swap_pos] = mat[current_pos]; + mat[current_pos] = swap_val; + } + } +} + +/* -------------------------------------------------------------------- + Correlate FILT with IMAGE, subsampling according to GRID parameters, + with values placed into result array. TEMP is a temporary + array the size of the filter. EDGES is a string -- see convolve.h. + The convolution is done in 9 sections, where the border sections use + specially computed edge-handling filters (see edges.c). The origin + of the filter is assumed to be (floor(x_fdim/2), floor(y_fdim/2)). + 10/6/89 - approximately optimized the choice of register vars on SPARCS. + ------------------------------------------------------------------------ */ +__attribute__((always_inline)) static inline void +epic_internal_filter(float *image, int x_dim, int y_dim, float *filt, + float *temp, int x_fdim, int y_fdim, int xgrid_start, + int xgrid_step, int ygrid_start, int ygrid_step, + float *result) { + // register double sum; + register float sum; + register int x_filt, im_pos, y_filt_lin; + register int y_im_lin, x_pos, filt_size = x_fdim * y_fdim; + register int y_pos, res_pos; + register int last_ctr_col = x_dim - x_fdim; + int last_ctr_row = (y_dim - y_fdim) * x_dim; + int first_row, first_col; + int x_fmid = x_fdim / 2; + int y_fmid = y_fdim / 2; + int x_stop = x_fdim - x_fmid + 1; + int y_stop = y_fdim - y_fmid + 1; + int ygrid_step_full = ygrid_step * x_dim; + int prev_res_pos, + x_res_dim = (x_dim - xgrid_start + xgrid_step - 1) / xgrid_step; + int rt_edge_res_pos = x_res_dim; + + res_pos = 0; + first_col = xgrid_start - x_fmid + xgrid_step; + + __pragma_loopbound(1, 4); + for (y_pos = ygrid_start - y_fmid - 1; y_pos < 0; y_pos += ygrid_step) { + __pragma_loopbound(1, 4); + for (x_pos = xgrid_start - x_fmid; /* top-left corner */ + x_pos < 0; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = y_im_lin = 0; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = y_im_lin; + + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + first_col = x_pos + 1; + epic_reflect1(filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER); + __pragma_loopbound(41, 46); + for (x_pos = first_col; /* top edge */ + x_pos < last_ctr_col; x_pos += xgrid_step) { + sum = 0.0f; + x_filt = y_im_lin = 0; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = x_pos + y_im_lin; + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + rt_edge_res_pos = res_pos + x_res_dim; /* save this for later ... */ + _Pragma( + "loopbound min 1 max 4") for (x_pos += + (1 - + last_ctr_col); /* top-right corner */ + x_pos < x_stop; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = y_im_lin = 0; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = y_im_lin + last_ctr_col; + + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + } /* end top */ + + first_row = x_dim * (y_pos + 1); /* need this to go down the sides */ + prev_res_pos = res_pos; + __pragma_loopbound(1, 4); + for (x_pos = xgrid_start - x_fmid; /* left edge */ + x_pos < 1; x_pos += xgrid_step) { + res_pos = prev_res_pos; + epic_reflect1(filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER); + __pragma_loopbound(41, 97); + for (y_pos = first_row; y_pos < last_ctr_row; + y_pos += ygrid_step_full) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = y_im_lin; + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; x_filt++) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + res_pos += x_res_dim; + } + prev_res_pos++; + } + epic_reflect1(filt, x_fdim, y_fdim, 0, 0, temp, FILTER); + __pragma_loopbound(41, 97); + for (y_pos = first_row; /* center region + of image */ + y_pos < last_ctr_row; y_pos += ygrid_step_full) { + res_pos = prev_res_pos; + __pragma_loopbound(41, 46); + for (x_pos = first_col; x_pos < last_ctr_col; x_pos += xgrid_step) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + im_pos = x_pos + y_im_lin; + __pragma_loopbound(1, 15); + for (; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + prev_res_pos += x_res_dim; + } + prev_res_pos = rt_edge_res_pos; + __pragma_loopbound(1, 4); + for (x_pos += (1 - last_ctr_col); /* right edge */ + x_pos < x_stop; x_pos += xgrid_step) { + res_pos = prev_res_pos; + epic_reflect1(filt, x_fdim, y_fdim, x_pos, 0, temp, FILTER); + __pragma_loopbound(41, 97); + for (y_pos = first_row; y_pos < last_ctr_row; + y_pos += ygrid_step_full) { + sum = 0.0f; + x_filt = 0, y_im_lin = y_pos; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = y_im_lin + last_ctr_col; x_filt < y_filt_lin; + ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + res_pos += x_res_dim; + } + prev_res_pos++; + } /* end mid */ + + res_pos -= (x_res_dim - 1); /* go to lower left corner */ + __pragma_loopbound(1, 4); + for (y_pos = ((y_pos - last_ctr_row) / x_dim) + 1; /* bottom */ + y_pos < y_stop; y_pos += ygrid_step) { + _Pragma( + "loopbound min 1 max 4") for (x_pos = + xgrid_start - + x_fmid; /* bottom-left corner */ + x_pos < 1; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = y_im_lin; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + epic_reflect1(filt, x_fdim, y_fdim, 0, y_pos, temp, FILTER); + __pragma_loopbound(41, 46); + for (x_pos = first_col; /* bottom edge */ + x_pos < last_ctr_col; x_pos += xgrid_step) { + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = x_pos + y_im_lin; x_filt < y_filt_lin; ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + __pragma_loopbound(1, 4); + for (x_pos += 1 - last_ctr_col; /* bottom-right + corner */ + x_pos < x_stop; x_pos += xgrid_step) { + epic_reflect1(filt, x_fdim, y_fdim, x_pos, y_pos, temp, FILTER); + sum = 0.0f; + x_filt = 0, y_im_lin = last_ctr_row; + __pragma_loopbound(1, 15); + for (y_filt_lin = x_fdim; y_filt_lin <= filt_size; + y_filt_lin += x_fdim) { + __pragma_loopbound(1, 15); + for (im_pos = y_im_lin + last_ctr_col; x_filt < y_filt_lin; + ++x_filt) { + sum += image[im_pos] * temp[x_filt]; + ++im_pos; + } + y_im_lin += x_dim; + } + result[res_pos] = sum; + ++res_pos; + } + } /* end bottom */ + +} /* end of epic_internal_filter */ + +/* + The following function determine how edges are to be handled + when performing convolutions of images with linear filters. + Any edge handling function which is local and linear may be defined, + except (unfortunately) constants cannot be added. So to treat the + edges as if the image is surrounded by a gray field, you must paste it + into a gray image, convolve, and crop it out... + The main convolution function is called epic_internal_filter. The idea + is that the convolution function calls the edge handling function which + computes a new filter based on the old filter and the distance to the + edge of the image. For example, reflection is done by reflecting the + filter through the appropriate axis and summing. +*/ + +/* + ---------------- EDGE HANDLER ARGUMENTS ------------------------ + filt - floating point array of filter taps. + x_dim, y_dim - x and y dimensions of filt. + x_pos - position of filter relative to the horizontal image edges. Negative + values indicate left edge, positive indicate right edge. Zero + indicates that the filter is not touching either edge. An absolute + value of 1 indicates that the edge tap of the filter is over the + edge pixel of the image. + y_pos - analogous to x_pos. + result - floating point array where the resulting filter will go. The edge + of this filter will be aligned with the image for application... + f_or_e - equal to one of the two constants EXPAND or FILTER. + -------------------------------------------------------------------- +*/ + +/* -------------------------------------------------------------------- + epic_reflect1() - Reflection through the edge pixels. This is the right + thing to do if you are subsampling by 2, since it maintains parity (even + pixels positions remain even, odd ones remain odd). (note: procedure differs + depending on f_or_e parameter). */ +__attribute__((always_inline)) static inline void +epic_reflect1(float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e) { + int filt_sz = x_dim * y_dim; + register int x_start = 0, y_start = 0, x_stop = x_dim, y_stop = filt_sz; + register int y_filt, x_filt, y_edge, x_edge; + register int x_base = (x_pos > 0) ? (x_dim - 1) : 0; + register int y_base = (y_pos > 0) ? (x_dim * (y_dim - 1)) : 0; + int x_edge_dist = + (x_pos > 0) ? (x_pos - x_dim) : ((x_pos < -1) ? (x_pos + 1) : 0); + int y_edge_dist = x_dim * ((y_pos > 0) ? (y_pos - y_dim) + : ((y_pos < -1) ? (y_pos + 1) : 0)); + int i; + int mx_pos = (x_dim / 2) + 1; + int my_pos = (y_dim / 2) + 1; + + __pragma_loopbound(15, 15); + for (i = 0; i < filt_sz; ++i) + result[i] = 0.0f; + + /* if EXPAND and filter is centered on image edge, do not reflect */ + if (f_or_e IS EXPAND) { + if (x_pos IS mx_pos) + x_stop = (x_dim + 1) / 2; + else if (x_pos IS - mx_pos) { + x_start = x_dim / 2; + x_edge_dist = 0; + } + + if (y_pos IS my_pos) + y_stop = x_dim * ((y_dim + 1) / 2); + else if (y_pos IS - my_pos) { + y_start = x_dim * (y_dim / 2); + y_edge_dist = 0; + } + } + + y_edge = y_edge_dist; + /* reflect at boundary of image */ + __pragma_loopbound(1, 15); + for (y_filt = y_start; y_filt < y_stop; y_filt += x_dim) { + x_edge = x_edge_dist; + __pragma_loopbound(1, 15); + for (x_filt = y_filt + x_start; x_filt < y_filt + x_stop; ++x_filt) { + result[abs(y_base - abs(y_edge)) + abs(x_base - abs(x_edge))] += + filt[x_filt]; + ++x_edge; + } + y_edge += x_dim; + } + + /* if EXPAND and filter is not centered on image edge, mult edge by 2 */ + if (f_or_e IS EXPAND) { + if ((abs(x_pos) ISNT mx_pos) AND(x_pos ISNT 0)) + __pragma_loopbound(0, 0); + for (y_filt = x_base; y_filt < filt_sz; y_filt += x_dim) + result[y_filt] += result[y_filt]; + if ((abs(y_pos) ISNT my_pos) AND(y_pos ISNT 0)) + __pragma_loopbound(0, 0); + for (x_filt = y_base; x_filt < y_base + x_dim; ++x_filt) + result[x_filt] += result[x_filt]; + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +epic_main(void) { + epic_build_pyr(epic_image, X_SIZE, Y_SIZE, NUM_LEVELS, epic_lo_filter, + epic_hi_filter, FILTER_SIZE); +} + +__attribute__((always_inline)) static inline int +epic_return() { + int i; + int checksum = 0; + __pragma_loopbound(64, 64); + for (i = 0; i < X_SIZE * Y_SIZE; i += Y_SIZE + 1) + checksum += epic_image[i]; + return (checksum == 43968 ? 0 : 1); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + epic_init(); + epic_main(); + + return epic_return(); +} diff --git a/targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.h b/targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.h new file mode 100644 index 0000000..56826ad --- /dev/null +++ b/targets/wasm-tacle/sequential/epic/generated/modified_sources/inline/epic.h @@ -0,0 +1,77 @@ + +#ifndef __EPIC_H_ +#define __EPIC_H_ + +#define EPIC_VERSION 1.1 + +/* ============= FUNDAMENTAL LIMITATIONS ============= */ + +/* Maximum x- or y-size of image */ +#define MAX_IMAGE_DIM 16384 + +/* Maximum number of pyramid levels (value 3*levs+1 stored in 5 bits). + This doesn't need to be larger than log2(MAX_IMAGE_DIM/FILTER_SIZE). */ +#define MAX_LEVELS 10 + +/* Maximum number of quantization bins. This essentially determines + the maximum depth image to be represented. */ +#define MAX_BINS 511 + +/* ============= SECONDARY (derived) LIMITATIONS ============= */ + +/* This number determines the precision of the stored binsizes: + stored coefficients are accurate to +/- (1/SCALE_FACTOR). + On the other hand, this number also will limit the maximum amount + of compression. + It should not be more than [ 2^(8*sizeof(BinValueType)) ]/256. */ +#define SCALE_FACTOR 128 + +/* This number must be consistent with the filters that are + hardwired into epic.c */ +#define FILTER_SIZE 15 + +/* Log (base 2) of MAX_IMAGE_DIM^2: (bits required to store the dimensions) */ +#define LOG_MAX_IMAGE_SIZE 32 + +/* The type of the quantized images. Must be SIGNED, and capable of holding + values in the range [ -MAX_BINS, MAX_BINS ] */ +typedef short BinIndexType; + +/* The type used to represent the binsizes. Should be UNSIGNED. If this is + changed, be sure to change the places in epic.c and unepic.c where + binsizes are written or read from files. */ +typedef unsigned short BinValueType; + +/* Number of possible values for a symbol. This must be at least + (MAX_BINS * 4) (one sign bit, one tag bit)... */ +#define NUM_SYMBOL_VALUES 65536 + +/* Function prototypes. */ +__attribute__((always_inline)) static inline void +epic_build_pyr(float *image, int x_size, int y_size, int num_levels, + float *lo_filter, float *hi_filter, int filter_size); + +__attribute__((always_inline)) static inline void +epic_build_level(float *image, int level_x_size, int level_y_size, + float *lo_filter, float *hi_filter, int filter_size, + float *result_block); + +__attribute__((always_inline)) static inline void +epic_internal_transpose(register float *mat, int rows, register int cols); + +__attribute__((always_inline)) static inline void +epic_reflect1(register float *filt, register int x_dim, int y_dim, int x_pos, + int y_pos, register float *result, int f_or_e); + +__attribute__((always_inline)) static inline void +epic_internal_filter(register float *image, register int x_dim, + register int y_dim, float *filt, register float *temp, + register int x_fdim, register int y_fdim, int xgrid_start, + int xgrid_step, int ygrid_start, int ygrid_step, + register float *result); + +__attribute__((always_inline)) static inline void +epic_reflect1(float *filt, int x_dim, int y_dim, int x_pos, int y_pos, + float *result, int f_or_e); + +#endif // __EPIC_H_ diff --git a/targets/wasm-tacle/sequential/fmref/CMakeLists.txt b/targets/wasm-tacle/sequential/fmref/CMakeLists.txt new file mode 100644 index 0000000..8e60b94 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(fmref) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/fmref.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/fmref.c" + "generated/modified_sources/default/wcclibm.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/fmref/Changelog.txt b/targets/wasm-tacle/sequential/fmref/Changelog.txt new file mode 100755 index 0000000..e9e7055 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/Changelog.txt @@ -0,0 +1,5 @@ +2017-06-27 +- Remove unused variables +- Introduce fmref_init and fmref_return functions. +- Add prefix fmref_ to global variables. +- Introduce dummy initialization in ieee754_rem_pio2f to please linter. diff --git a/targets/wasm-tacle/sequential/fmref/fmref.c b/targets/wasm-tacle/sequential/fmref/fmref.c new file mode 100755 index 0000000..c1b0611 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/fmref.c @@ -0,0 +1,274 @@ +/* + fmref.c: C reference implementation of FM Radio + David Maze + $Id: fmref.c,v 1.2 2010-10-04 21:21:26 garus Exp $ +*/ + +#include "wcclibm.h" +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +// Defines +#define SAMPLING_RATE 250000000 +#define CUTOFF_FREQUENCY 108000000 +#define NUM_TAPS 64 +#define MAX_AMPLITUDE 27000.0 +#define BANDWIDTH 10000 +#define DECIMATION 4 +/* Must be at least NUM_TAPS+1: */ +#define IN_BUFFER_LEN 200 +#define EQUALIZER_BANDS 10 + + +// Type declarations +typedef struct FloatBuffer { + float buff[ IN_BUFFER_LEN ]; + int rpos, rlen; +} +FloatBuffer; +/* Low pass filter: */ +typedef struct LPFData { + float coeff[ NUM_TAPS ]; + float freq; + int taps, decimation; +} +LPFData; +typedef struct EqualizerData { + LPFData lpf[ EQUALIZER_BANDS + 1 ]; + FloatBuffer fb[ EQUALIZER_BANDS + 1 ]; + float gain[ EQUALIZER_BANDS ]; +} +EqualizerData; + +// Global vars +float fmref_lpf_coeff[ NUM_TAPS ]; +float fmref_eq_cutoffs[ EQUALIZER_BANDS + 1 ] = { + 55.000004f, 77.78174f, 110.00001f, 155.56354f, 220.00002f, 311.12695f, + 440.00003f, 622.25415f, 880.00006f, 1244.5078f, 1760.0001f +}; +static int fmref_numiters = 2; + +// Forward declarations +void fmref_fb_compact( FloatBuffer *fb ); +int fmref_fb_ensure_writable( FloatBuffer *fb, int amount ); +void fmref_get_floats( FloatBuffer *fb ); +void fmref_init_lpf_data( LPFData *data, float freq, int taps, int decimation ); +void fmref_run_lpf( FloatBuffer *fbin, FloatBuffer *fbout, LPFData *data ); +void fmref_run_demod( FloatBuffer *fbin, FloatBuffer *fbout ); +void fmref_init_equalizer( EqualizerData *data ); +void fmref_run_equalizer( FloatBuffer *fbin, FloatBuffer *fbout, + EqualizerData *data ); +void fmref_main( void ); + +void fmref_init( void ) +{ + // dummy init function +} + +int fmref_return( void ) +{ + // dummy return value + return 0; +} + +int main( void ) +{ + fmref_init(); + fmref_main(); + return fmref_return(); +} + +FloatBuffer fmref_fb1, fmref_fb2, fmref_fb3, fmref_fb4; +LPFData fmref_lpf_data; + +void _Pragma( "entrypoint" ) fmref_main( void ) +{ + int i; + EqualizerData eq_data; + + fmref_fb1.rpos = fmref_fb1.rlen = 0; + fmref_fb2.rpos = fmref_fb2.rlen = 0; + fmref_fb3.rpos = fmref_fb3.rlen = 0; + fmref_fb4.rpos = fmref_fb4.rlen = 0; + + fmref_init_lpf_data( &fmref_lpf_data, CUTOFF_FREQUENCY, NUM_TAPS, DECIMATION ); + fmref_init_equalizer( &eq_data ); + + /* Startup: */ + fmref_get_floats( &fmref_fb1 ); + /* LPF needs at least NUM_TAPS+1 inputs; fmref_get_floats is fine. */ + fmref_run_lpf( &fmref_fb1, &fmref_fb2, &fmref_lpf_data ); + /* run_demod needs 1 input, OK here. */ + /* run_equalizer needs 51 inputs (same reason as for LPF). This means + running the pipeline up to demod 50 times in advance: */ + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < 64; i++ ) { + if ( fmref_fb1.rlen - fmref_fb1.rpos < NUM_TAPS + 1 ) + fmref_get_floats( &fmref_fb1 ); + fmref_run_lpf( &fmref_fb1, &fmref_fb2, &fmref_lpf_data ); + fmref_run_demod( &fmref_fb2, &fmref_fb3 ); + } + + /* Main loop: */ + _Pragma( "loopbound min 2 max 2" ) + while ( fmref_numiters-- > 0 ) { + /* The low-pass filter will need NUM_TAPS+1 items; read them if we + need to. */ + if ( fmref_fb1.rlen - fmref_fb1.rpos < NUM_TAPS + 1 ) + fmref_get_floats( &fmref_fb1 ); + fmref_run_lpf( &fmref_fb1, &fmref_fb2, &fmref_lpf_data ); + fmref_run_demod( &fmref_fb2, &fmref_fb3 ); + fmref_run_equalizer( &fmref_fb3, &fmref_fb4, &eq_data ); + + } +} + +void fmref_fb_compact( FloatBuffer *fb ) +{ + + int i; + char *source; + char *target; + target = ( char * )( fb->buff ); + source = ( char * )( fb->buff + fb->rpos ); + _Pragma( "loopbound min 0 max 60" ) + for ( i = 0; i < fb->rlen - fb->rpos; i++ ) + target[ i ] = source[ i ]; + fb->rlen -= fb->rpos; + fb->rpos = 0; +} + +int fmref_fb_ensure_writable( FloatBuffer *fb, int amount ) +{ + int available = IN_BUFFER_LEN - fb->rlen; + if ( available >= amount ) + return 1; + + /* Nope, not enough room, move current contents back to the beginning. */ + fmref_fb_compact( fb ); + + available = IN_BUFFER_LEN - fb->rlen; + if ( available >= amount ) + return 1; + + return 0; +} + +void fmref_get_floats( FloatBuffer *fb ) +{ + static int x = 0; + fmref_fb_compact( fb ); + + /* Fill the remaining space in fb with 1.0. */ + _Pragma( "loopbound min 140 max 200" ) + while ( fb->rlen < IN_BUFFER_LEN ) { + fb->buff[ fb->rlen++ ] = ( float )x; + x++; + } +} + +void fmref_init_lpf_data( LPFData *data, float freq, int taps, int decimation ) +{ + /* Assume that CUTOFF_FREQUENCY is non-zero. See comments in + StreamIt LowPassFilter.java for origin. */ + float w = 2 * M_PI * freq / SAMPLING_RATE; + int i; + float m = taps - 1.0f; + + data->freq = freq; + data->taps = taps; + data->decimation = decimation; + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < taps; i++ ) { + if ( i - m / 2 == 0.0f ) + data->coeff[ i ] = w / M_PI; + else + data->coeff[ i ] = sin( w * ( i - m / 2 ) ) / M_PI / ( i - m / 2 ) * + ( 0.54f - 0.46f * cos( 2 * M_PI * i / m ) ); + } +} + +void fmref_run_lpf( FloatBuffer *fbin, FloatBuffer *fbout, LPFData *data ) +{ + float sum = 0.0f; + int i = 0; + + _Pragma( "loopbound min 64 max 64" ) + for ( i = 0; i < data->taps; i++ ) + sum += fbin->buff[ fbin->rpos + i ] * data->coeff[ i ]; + + fbin->rpos += data->decimation + 1; + + /* Check that there's room in the output buffer; move data if necessary. */ + fmref_fb_ensure_writable( fbout, 1 ); + fbout->buff[ fbout->rlen++ ] = sum; +} + +void fmref_run_demod( FloatBuffer *fbin, FloatBuffer *fbout ) +{ + float temp, gain; + gain = MAX_AMPLITUDE * SAMPLING_RATE / ( BANDWIDTH * M_PI ); + temp = fbin->buff[ fbin->rpos ] * fbin->buff[ fbin->rpos + 1 ]; + temp = gain * atan( temp ); + fbin->rpos++; + fmref_fb_ensure_writable( fbout, 1 ); + fbout->buff[ fbout->rlen++ ] = temp; +} + +void fmref_init_equalizer( EqualizerData *data ) +{ + int i; + + /* Equalizer structure: there are ten band-pass filters, with + cutoffs as shown below. The outputs of these filters get added + together. Each band-pass filter is LPF(high)-LPF(low). */ + _Pragma( "loopbound min 11 max 11" ) + for ( i = 0; i < EQUALIZER_BANDS + 1; i++ ) + fmref_init_lpf_data( &data->lpf[ i ], fmref_eq_cutoffs[ i ], 64, 0 ); + + /* Also initialize member buffers. */ + _Pragma( "loopbound min 11 max 11" ) + for ( i = 0; i < EQUALIZER_BANDS + 1; i++ ) + data->fb[ i ].rpos = data->fb[ i ].rlen = 0; + + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < EQUALIZER_BANDS; i++ ) { + // the gain amplifies the middle bands the most + float val = ( ( ( float )i ) - ( ( ( float )( EQUALIZER_BANDS - 1 ) ) / + 2.0f ) ) / 5.0f; + data->gain[ i ] = val > 0 ? 2.0f - val : 2.0f + val; + } +} + +void fmref_run_equalizer( FloatBuffer *fbin, FloatBuffer *fbout, + EqualizerData *data ) +{ + int i, rpos; + float lpf_out[ EQUALIZER_BANDS + 1 ]; + float sum = 0.0; + + /* Save the input read location; we can reuse the same input data on all + of the LPFs. */ + rpos = fbin->rpos; + + /* Run the child filters. */ + _Pragma( "loopbound min 11 max 11" ) + for ( i = 0; i < EQUALIZER_BANDS + 1; i++ ) { + fbin->rpos = rpos; + fmref_run_lpf( fbin, &data->fb[ i ], &data->lpf[ i ] ); + lpf_out[ i ] = data->fb[ i ].buff[ data->fb[ i ].rpos++ ]; + } + + /* Now process the results of the filters. Remember that each band is + output(hi)-output(lo). */ + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < EQUALIZER_BANDS; i++ ) + sum += ( lpf_out[ i + 1 ] - lpf_out[ i ] ) * data->gain[ i ]; + + /* Write that result. */ + fmref_fb_ensure_writable( fbout, 1 ); + fbout->buff[ fbout->rlen++ ] = sum; +} + diff --git a/targets/wasm-tacle/sequential/fmref/generated/default/fmref.wasm b/targets/wasm-tacle/sequential/fmref/generated/default/fmref.wasm new file mode 100755 index 0000000000000000000000000000000000000000..1e9932d520bf0b355885a02d1cd1b31085b987f7 GIT binary patch literal 9209 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/fmref/generated/default/fmref.wat b/targets/wasm-tacle/sequential/fmref/generated/default/fmref.wat new file mode 100644 index 0000000..a243452 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/default/fmref.wat @@ -0,0 +1,3650 @@ +(module $fmref.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (type (;3;) (func (param i32))) + (type (;4;) (func (param i32 i32 i32))) + (type (;5;) (func (param f32 i32) (result i32))) + (type (;6;) (func (param f32) (result f32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $__original_main (type 2) (result i32) + call $fmref_main + i32.const 0) + (func $fmref_main (type 1) + (local i32 i32 f64 i32 f64 f32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 11888 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + local.set 1 + i32.const 0 + i64.const 0 + i64.store offset=2032 align=4 + i32.const 0 + i64.const 0 + i64.store offset=2840 align=4 + i32.const 0 + i64.const 0 + i64.store offset=3648 align=4 + i32.const 0 + i64.const 0 + i64.store offset=4456 align=4 + i32.const 0 + i32.const 4 + i32.store offset=4728 + i32.const 0 + i64.const 276166475360 + i64.store offset=4720 align=4 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + f64.const 0x0p+0 (;=0;) + local.set 2 + i32.const 4464 + local.set 3 + loop ;; label = @1 + f64.const 0x1.ba5e365c3e597p-1 (;=0.864;) + local.set 4 + block ;; label = @2 + local.get 1 + f32.convert_i32_u + f32.const -0x1.f8p+4 (;=-31.5;) + f32.add + local.tee 5 + f32.const 0x0p+0 (;=0;) + f32.eq + br_if 0 (;@2;) + local.get 5 + f32.const 0x1.5b6f5ep+1 (;=2.71434;) + f32.mul + call $fmref___sinf + f64.promote_f32 + f64.const 0x1.921fb54442d18p+1 (;=3.14159;) + f64.div + local.get 5 + f64.promote_f32 + f64.div + local.get 2 + f64.const 0x1.921fb54442d18p+2 (;=6.28319;) + f64.mul + f64.const 0x1.f8p+5 (;=63;) + f64.div + f32.demote_f64 + call $fmref___cosf + f32.const -0x1.d70a3ep-2 (;=-0.46;) + f32.mul + f32.const 0x1.147ae2p-1 (;=0.54;) + f32.add + f64.promote_f32 + f64.mul + local.set 4 + end + local.get 3 + local.get 4 + f32.demote_f64 + f32.store + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 2 + f64.const 0x1p+0 (;=1;) + f64.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + local.get 0 + i32.const 12 + i32.add + call $fmref_init_equalizer + i32.const 0 + i32.load offset=2032 + local.set 1 + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @1 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 1 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @2 + local.get 1 + i32.const 1232 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@2;) + end + end + i32.const 0 + local.get 3 + i32.store offset=2036 + i32.const 0 + i32.const 0 + i32.store offset=2032 + i32.const 140 + i32.const 200 + call $__pragma_loopbound + block ;; label = @1 + i32.const 0 + i32.load offset=2036 + local.tee 7 + i32.const 199 + i32.gt_s + br_if 0 (;@1;) + i32.const 0 + i32.load offset=4732 + local.set 1 + block ;; label = @2 + block ;; label = @3 + i32.const 0 + local.get 7 + i32.sub + i32.const 3 + i32.and + local.tee 6 + br_if 0 (;@3;) + local.get 7 + local.set 8 + br 1 (;@2;) + end + local.get 7 + local.get 6 + i32.add + local.set 8 + local.get 7 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 3 + loop ;; label = @3 + local.get 3 + local.get 1 + f32.convert_i32_s + f32.store + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@3;) + end + end + block ;; label = @2 + local.get 7 + i32.const -197 + i32.add + i32.const 3 + i32.lt_u + br_if 0 (;@2;) + local.get 8 + i32.const -200 + i32.add + local.set 6 + local.get 8 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 3 + loop ;; label = @3 + local.get 3 + local.get 1 + f32.convert_i32_s + f32.store + local.get 3 + i32.const 12 + i32.add + local.get 1 + i32.const 3 + i32.add + f32.convert_i32_s + f32.store + local.get 3 + i32.const 8 + i32.add + local.get 1 + i32.const 2 + i32.add + f32.convert_i32_s + f32.store + local.get 3 + i32.const 4 + i32.add + local.get 1 + i32.const 1 + i32.add + f32.convert_i32_s + f32.store + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 6 + i32.const 4 + i32.add + local.tee 6 + br_if 0 (;@3;) + end + end + i32.const 0 + local.get 1 + i32.store offset=4732 + i32.const 0 + i32.const 200 + i32.store offset=2036 + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + i32.load offset=2032 + local.set 9 + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=4724 + local.tee 1 + i32.const 1 + i32.ge_s + br_if 0 (;@2;) + f32.const 0x0p+0 (;=0;) + local.set 5 + br 1 (;@1;) + end + local.get 1 + i32.const 1 + i32.and + local.set 10 + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const 1 + i32.ne + br_if 0 (;@3;) + f32.const 0x0p+0 (;=0;) + local.set 5 + i32.const 0 + local.set 3 + br 1 (;@2;) + end + local.get 1 + i32.const 2147483646 + i32.and + local.set 7 + local.get 9 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 8 + f32.const 0x0p+0 (;=0;) + local.set 5 + i32.const 0 + local.set 1 + i32.const 0 + local.set 3 + loop ;; label = @3 + local.get 8 + local.get 1 + i32.add + local.tee 6 + i32.const 4 + i32.add + f32.load + local.get 1 + i32.const 4468 + i32.add + f32.load + f32.mul + local.get 6 + f32.load + local.get 1 + i32.const 4464 + i32.add + f32.load + f32.mul + local.get 5 + f32.add + f32.add + local.set 5 + local.get 1 + i32.const 8 + i32.add + local.set 1 + local.get 7 + local.get 3 + i32.const 2 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@3;) + end + end + local.get 10 + i32.eqz + br_if 0 (;@1;) + local.get 3 + local.get 9 + i32.add + i32.const 2 + i32.shl + i32.const 1232 + i32.add + f32.load + local.get 3 + i32.const 2 + i32.shl + i32.const 4464 + i32.add + f32.load + f32.mul + local.get 5 + f32.add + local.set 5 + end + i32.const 0 + local.get 9 + i32.const 0 + i32.load offset=4728 + i32.add + i32.const 1 + i32.add + i32.store offset=2032 + block ;; label = @1 + i32.const 0 + i32.load offset=2844 + local.tee 3 + i32.const 200 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + i32.load offset=2840 + local.set 1 + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @2 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2840 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 1 + i32.const 2 + i32.shl + i32.const 2040 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @3 + local.get 1 + i32.const 2040 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2840 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@3;) + end + end + i32.const 0 + i32.const 0 + i32.store offset=2840 + end + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=2844 + local.get 3 + i32.const 2 + i32.shl + i32.const 2040 + i32.add + local.get 5 + f32.store + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + local.set 10 + loop ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + local.tee 1 + i32.sub + i32.const 64 + i32.gt_s + br_if 0 (;@2;) + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @3 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + local.get 1 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @4 + local.get 1 + i32.const 1232 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@4;) + end + end + i32.const 0 + local.get 3 + i32.store offset=2036 + i32.const 0 + i32.const 0 + i32.store offset=2032 + i32.const 140 + i32.const 200 + call $__pragma_loopbound + i32.const 0 + i32.load offset=2036 + local.tee 7 + i32.const 199 + i32.gt_s + br_if 0 (;@2;) + i32.const 0 + i32.load offset=4732 + local.set 1 + block ;; label = @3 + block ;; label = @4 + i32.const 0 + local.get 7 + i32.sub + i32.const 3 + i32.and + local.tee 6 + br_if 0 (;@4;) + local.get 7 + local.set 8 + br 1 (;@3;) + end + local.get 7 + local.get 6 + i32.add + local.set 8 + local.get 7 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 3 + loop ;; label = @4 + local.get 3 + local.get 1 + f32.convert_i32_s + f32.store + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@4;) + end + end + block ;; label = @3 + local.get 7 + i32.const -197 + i32.add + i32.const 3 + i32.lt_u + br_if 0 (;@3;) + i32.const 200 + local.get 8 + i32.sub + local.set 6 + local.get 8 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 3 + loop ;; label = @4 + local.get 3 + local.get 1 + f32.convert_i32_s + f32.store + local.get 3 + i32.const 12 + i32.add + local.get 1 + i32.const 3 + i32.add + f32.convert_i32_s + f32.store + local.get 3 + i32.const 8 + i32.add + local.get 1 + i32.const 2 + i32.add + f32.convert_i32_s + f32.store + local.get 3 + i32.const 4 + i32.add + local.get 1 + i32.const 1 + i32.add + f32.convert_i32_s + f32.store + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 6 + i32.const -4 + i32.add + local.tee 6 + br_if 0 (;@4;) + end + end + i32.const 0 + local.get 1 + i32.store offset=4732 + i32.const 0 + i32.const 200 + i32.store offset=2036 + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + i32.load offset=2032 + local.set 9 + block ;; label = @2 + block ;; label = @3 + i32.const 0 + i32.load offset=4724 + local.tee 1 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + f32.const 0x0p+0 (;=0;) + local.set 5 + br 1 (;@2;) + end + local.get 1 + i32.const 1 + i32.and + local.set 11 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 1 + i32.ne + br_if 0 (;@4;) + f32.const 0x0p+0 (;=0;) + local.set 5 + i32.const 0 + local.set 3 + br 1 (;@3;) + end + local.get 1 + i32.const 2147483646 + i32.and + local.set 7 + local.get 9 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 8 + f32.const 0x0p+0 (;=0;) + local.set 5 + i32.const 0 + local.set 1 + i32.const 0 + local.set 3 + loop ;; label = @4 + local.get 8 + local.get 1 + i32.add + local.tee 6 + i32.const 4 + i32.add + f32.load + local.get 1 + i32.const 4468 + i32.add + f32.load + f32.mul + local.get 6 + f32.load + local.get 1 + i32.const 4464 + i32.add + f32.load + f32.mul + local.get 5 + f32.add + f32.add + local.set 5 + local.get 1 + i32.const 8 + i32.add + local.set 1 + local.get 7 + local.get 3 + i32.const 2 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@4;) + end + end + local.get 11 + i32.eqz + br_if 0 (;@2;) + local.get 3 + local.get 9 + i32.add + i32.const 2 + i32.shl + i32.const 1232 + i32.add + f32.load + local.get 3 + i32.const 2 + i32.shl + i32.const 4464 + i32.add + f32.load + f32.mul + local.get 5 + f32.add + local.set 5 + end + i32.const 0 + local.get 9 + i32.const 0 + i32.load offset=4728 + i32.add + i32.const 1 + i32.add + i32.store offset=2032 + i32.const 0 + i32.load offset=2840 + local.set 1 + block ;; label = @2 + i32.const 0 + i32.load offset=2844 + local.tee 3 + i32.const 200 + i32.lt_s + br_if 0 (;@2;) + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @3 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2840 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + local.get 1 + i32.const 2 + i32.shl + i32.const 2040 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @4 + local.get 1 + i32.const 2040 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2840 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@4;) + end + end + i32.const 0 + local.set 1 + i32.const 0 + i32.const 0 + i32.store offset=2840 + end + local.get 3 + i32.const 2 + i32.shl + i32.const 2040 + i32.add + local.get 5 + f32.store + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=2844 + local.get 1 + i32.const 2 + i32.shl + local.tee 1 + i32.const 2040 + i32.add + f32.load + local.get 1 + i32.const 2044 + i32.add + f32.load + f32.mul + call $fmref___atanf + local.set 5 + i32.const 0 + i32.const 0 + i32.load offset=2840 + i32.const 1 + i32.add + i32.store offset=2840 + block ;; label = @2 + i32.const 0 + i32.load offset=3652 + local.tee 3 + i32.const 200 + i32.lt_s + br_if 0 (;@2;) + i32.const 0 + i32.load offset=3648 + local.set 1 + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @3 + i32.const 0 + i32.load offset=3652 + i32.const 0 + i32.load offset=3648 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + local.get 1 + i32.const 2 + i32.shl + i32.const 2848 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @4 + local.get 1 + i32.const 2848 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=3652 + i32.const 0 + i32.load offset=3648 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@4;) + end + end + i32.const 0 + i32.const 0 + i32.store offset=3648 + end + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=3652 + local.get 3 + i32.const 2 + i32.shl + i32.const 2848 + i32.add + local.get 5 + f32.const 0x1.99cfb4p+27 (;=2.14859e+08;) + f32.mul + f32.store + local.get 10 + i32.const 1 + i32.add + local.tee 10 + i32.const 64 + i32.ne + br_if 0 (;@1;) + end + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1228 + local.tee 1 + i32.const -1 + i32.add + i32.store offset=1228 + block ;; label = @1 + local.get 1 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + loop ;; label = @2 + block ;; label = @3 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + local.tee 1 + i32.sub + i32.const 64 + i32.gt_s + br_if 0 (;@3;) + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @4 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 1 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @5 + local.get 1 + i32.const 1232 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@5;) + end + end + i32.const 0 + local.get 3 + i32.store offset=2036 + i32.const 0 + i32.const 0 + i32.store offset=2032 + i32.const 140 + i32.const 200 + call $__pragma_loopbound + i32.const 0 + i32.load offset=2036 + local.tee 7 + i32.const 199 + i32.gt_s + br_if 0 (;@3;) + i32.const 0 + i32.load offset=4732 + local.set 1 + block ;; label = @4 + block ;; label = @5 + i32.const 0 + local.get 7 + i32.sub + i32.const 3 + i32.and + local.tee 6 + br_if 0 (;@5;) + local.get 7 + local.set 8 + br 1 (;@4;) + end + local.get 7 + local.get 6 + i32.add + local.set 8 + local.get 7 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 3 + loop ;; label = @5 + local.get 3 + local.get 1 + f32.convert_i32_s + f32.store + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@5;) + end + end + block ;; label = @4 + local.get 7 + i32.const -197 + i32.add + i32.const 3 + i32.lt_u + br_if 0 (;@4;) + i32.const 200 + local.get 8 + i32.sub + local.set 6 + local.get 8 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 3 + loop ;; label = @5 + local.get 3 + local.get 1 + f32.convert_i32_s + f32.store + local.get 3 + i32.const 12 + i32.add + local.get 1 + i32.const 3 + i32.add + f32.convert_i32_s + f32.store + local.get 3 + i32.const 8 + i32.add + local.get 1 + i32.const 2 + i32.add + f32.convert_i32_s + f32.store + local.get 3 + i32.const 4 + i32.add + local.get 1 + i32.const 1 + i32.add + f32.convert_i32_s + f32.store + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 6 + i32.const -4 + i32.add + local.tee 6 + br_if 0 (;@5;) + end + end + i32.const 0 + local.get 1 + i32.store offset=4732 + i32.const 0 + i32.const 200 + i32.store offset=2036 + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + i32.load offset=2032 + local.set 9 + block ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load offset=4724 + local.tee 1 + i32.const 1 + i32.ge_s + br_if 0 (;@4;) + f32.const 0x0p+0 (;=0;) + local.set 5 + br 1 (;@3;) + end + local.get 1 + i32.const 1 + i32.and + local.set 10 + block ;; label = @4 + block ;; label = @5 + local.get 1 + i32.const 1 + i32.ne + br_if 0 (;@5;) + f32.const 0x0p+0 (;=0;) + local.set 5 + i32.const 0 + local.set 3 + br 1 (;@4;) + end + local.get 1 + i32.const 2147483646 + i32.and + local.set 7 + local.get 9 + i32.const 2 + i32.shl + i32.const 1232 + i32.add + local.set 8 + f32.const 0x0p+0 (;=0;) + local.set 5 + i32.const 0 + local.set 1 + i32.const 0 + local.set 3 + loop ;; label = @5 + local.get 8 + local.get 1 + i32.add + local.tee 6 + i32.const 4 + i32.add + f32.load + local.get 1 + i32.const 4468 + i32.add + f32.load + f32.mul + local.get 6 + f32.load + local.get 1 + i32.const 4464 + i32.add + f32.load + f32.mul + local.get 5 + f32.add + f32.add + local.set 5 + local.get 1 + i32.const 8 + i32.add + local.set 1 + local.get 7 + local.get 3 + i32.const 2 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@5;) + end + end + local.get 10 + i32.eqz + br_if 0 (;@3;) + local.get 3 + local.get 9 + i32.add + i32.const 2 + i32.shl + i32.const 1232 + i32.add + f32.load + local.get 3 + i32.const 2 + i32.shl + i32.const 4464 + i32.add + f32.load + f32.mul + local.get 5 + f32.add + local.set 5 + end + i32.const 0 + local.get 9 + i32.const 0 + i32.load offset=4728 + i32.add + i32.const 1 + i32.add + i32.store offset=2032 + i32.const 0 + i32.load offset=2840 + local.set 1 + block ;; label = @3 + i32.const 0 + i32.load offset=2844 + local.tee 3 + i32.const 200 + i32.lt_s + br_if 0 (;@3;) + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @4 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2840 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 1 + i32.const 2 + i32.shl + i32.const 2040 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @5 + local.get 1 + i32.const 2040 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2840 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@5;) + end + end + i32.const 0 + local.set 1 + i32.const 0 + i32.const 0 + i32.store offset=2840 + end + local.get 3 + i32.const 2 + i32.shl + i32.const 2040 + i32.add + local.get 5 + f32.store + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=2844 + local.get 1 + i32.const 2 + i32.shl + local.tee 1 + i32.const 2040 + i32.add + f32.load + local.get 1 + i32.const 2044 + i32.add + f32.load + f32.mul + call $fmref___atanf + local.set 5 + i32.const 0 + i32.const 0 + i32.load offset=2840 + i32.const 1 + i32.add + i32.store offset=2840 + block ;; label = @3 + i32.const 0 + i32.load offset=3652 + local.tee 3 + i32.const 200 + i32.lt_s + br_if 0 (;@3;) + i32.const 0 + i32.load offset=3648 + local.set 1 + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @4 + i32.const 0 + i32.load offset=3652 + i32.const 0 + i32.load offset=3648 + i32.sub + local.tee 3 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 1 + i32.const 2 + i32.shl + i32.const 2848 + i32.add + local.set 6 + i32.const 0 + local.set 1 + loop ;; label = @5 + local.get 1 + i32.const 2848 + i32.add + local.get 6 + local.get 1 + i32.add + i32.load8_u + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=3652 + i32.const 0 + i32.load offset=3648 + i32.sub + local.tee 3 + i32.lt_s + br_if 0 (;@5;) + end + end + i32.const 0 + i32.const 0 + i32.store offset=3648 + end + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=3652 + local.get 3 + i32.const 2 + i32.shl + i32.const 2848 + i32.add + local.get 5 + f32.const 0x1.99cfb4p+27 (;=2.14859e+08;) + f32.mul + f32.store + i32.const 2848 + i32.const 3656 + local.get 0 + i32.const 12 + i32.add + call $fmref_run_equalizer + i32.const 0 + i32.const 0 + i32.load offset=1228 + local.tee 1 + i32.const -1 + i32.add + i32.store offset=1228 + local.get 1 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + end + end + local.get 0 + i32.const 11888 + i32.add + global.set $__stack_pointer) + (func $fmref_init_equalizer (type 3) (param i32) + (local i32 i32 i32 f32 f32 f64 f64 i32 f64) + i32.const 11 + i32.const 11 + call $__pragma_loopbound + i32.const 0 + local.set 1 + local.get 0 + local.set 2 + loop ;; label = @1 + local.get 0 + local.get 1 + i32.const 268 + i32.mul + i32.add + local.tee 3 + i64.const 64 + i64.store offset=260 align=4 + local.get 3 + local.get 1 + i32.const 2 + i32.shl + i32.const 1184 + i32.add + f32.load + local.tee 4 + f32.store offset=256 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + local.get 4 + f64.promote_f32 + f64.const 0x1.921fb54442d18p+2 (;=6.28319;) + f64.mul + f64.const 0x1.dcd65p+27 (;=2.5e+08;) + f64.div + f32.demote_f64 + local.tee 5 + f64.promote_f32 + f64.const 0x1.921fb54442d18p+1 (;=3.14159;) + f64.div + local.set 6 + f64.const 0x0p+0 (;=0;) + local.set 7 + local.get 2 + local.set 3 + i32.const 0 + local.set 8 + loop ;; label = @2 + local.get 6 + local.set 9 + block ;; label = @3 + local.get 8 + f32.convert_i32_u + f32.const -0x1.f8p+4 (;=-31.5;) + f32.add + local.tee 4 + f32.const 0x0p+0 (;=0;) + f32.eq + br_if 0 (;@3;) + local.get 4 + local.get 5 + f32.mul + call $fmref___sinf + f64.promote_f32 + f64.const 0x1.921fb54442d18p+1 (;=3.14159;) + f64.div + local.get 4 + f64.promote_f32 + f64.div + local.get 7 + f64.const 0x1.921fb54442d18p+2 (;=6.28319;) + f64.mul + f64.const 0x1.f8p+5 (;=63;) + f64.div + f32.demote_f64 + call $fmref___cosf + f32.const -0x1.d70a3ep-2 (;=-0.46;) + f32.mul + f32.const 0x1.147ae2p-1 (;=0.54;) + f32.add + f64.promote_f32 + f64.mul + local.set 9 + end + local.get 3 + local.get 9 + f32.demote_f64 + f32.store + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 7 + f64.const 0x1p+0 (;=1;) + f64.add + local.set 7 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + i32.const 64 + i32.ne + br_if 0 (;@2;) + end + local.get 2 + i32.const 268 + i32.add + local.set 2 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 11 + i32.ne + br_if 0 (;@1;) + end + i32.const 11 + i32.const 11 + call $__pragma_loopbound + local.get 0 + i64.const 0 + i64.store offset=3748 align=4 + local.get 0 + i64.const 0 + i64.store offset=4556 align=4 + local.get 0 + i64.const 0 + i64.store offset=5364 align=4 + local.get 0 + i64.const 0 + i64.store offset=6172 align=4 + local.get 0 + i64.const 0 + i64.store offset=6980 align=4 + local.get 0 + i64.const 0 + i64.store offset=7788 align=4 + local.get 0 + i64.const 0 + i64.store offset=8596 align=4 + local.get 0 + i64.const 0 + i64.store offset=9404 align=4 + local.get 0 + i64.const 0 + i64.store offset=11020 align=4 + local.get 0 + i64.const 0 + i64.store offset=10212 align=4 + local.get 0 + i64.const 0 + i64.store offset=11828 align=4 + i32.const 10 + i32.const 10 + call $__pragma_loopbound + local.get 0 + i64.const 4579260103037183590 + i64.store offset=11868 align=4 + local.get 0 + i64.const 4593671620989131162 + i64.store offset=11860 align=4 + local.get 0 + i64.const 4608083138939401011 + i64.store offset=11852 align=4 + local.get 0 + i64.const 4600877382109233152 + i64.store offset=11844 align=4 + local.get 0 + i64.const 4586465859862318285 + i64.store offset=11836 align=4) + (func $fmref_run_equalizer (type 4) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 i32 i32 i32 i32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32 f32) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + local.get 0 + i32.load offset=800 + local.set 4 + i32.const 11 + i32.const 11 + call $__pragma_loopbound + i32.const 0 + local.set 5 + local.get 2 + i32.const 2948 + i32.add + local.tee 6 + local.set 7 + local.get 2 + local.set 8 + loop ;; label = @1 + local.get 0 + local.get 4 + i32.store offset=800 + i32.const 64 + i32.const 64 + call $__pragma_loopbound + local.get 6 + local.get 5 + i32.const 808 + i32.mul + i32.add + local.set 9 + local.get 0 + i32.load offset=800 + local.set 10 + block ;; label = @2 + block ;; label = @3 + local.get 2 + local.get 5 + i32.const 268 + i32.mul + i32.add + local.tee 11 + i32.load offset=260 + local.tee 12 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + f32.const 0x0p+0 (;=0;) + local.set 13 + br 1 (;@2;) + end + local.get 12 + i32.const 1 + i32.and + local.set 14 + block ;; label = @3 + block ;; label = @4 + local.get 12 + i32.const 1 + i32.ne + br_if 0 (;@4;) + f32.const 0x0p+0 (;=0;) + local.set 13 + i32.const 0 + local.set 15 + br 1 (;@3;) + end + local.get 12 + i32.const 2147483646 + i32.and + local.set 16 + local.get 0 + local.get 10 + i32.const 2 + i32.shl + i32.add + local.set 12 + f32.const 0x0p+0 (;=0;) + local.set 13 + i32.const 0 + local.set 15 + local.get 8 + local.set 17 + loop ;; label = @4 + local.get 12 + i32.const 4 + i32.add + f32.load + local.get 17 + i32.const 4 + i32.add + f32.load + f32.mul + local.get 12 + f32.load + local.get 17 + f32.load + f32.mul + local.get 13 + f32.add + f32.add + local.set 13 + local.get 17 + i32.const 8 + i32.add + local.set 17 + local.get 12 + i32.const 8 + i32.add + local.set 12 + local.get 16 + local.get 15 + i32.const 2 + i32.add + local.tee 15 + i32.ne + br_if 0 (;@4;) + end + end + local.get 14 + i32.eqz + br_if 0 (;@2;) + local.get 0 + local.get 15 + local.get 10 + i32.add + i32.const 2 + i32.shl + i32.add + f32.load + local.get 11 + local.get 15 + i32.const 2 + i32.shl + i32.add + f32.load + f32.mul + local.get 13 + f32.add + local.set 13 + end + local.get 0 + local.get 10 + local.get 11 + i32.load offset=264 + i32.add + i32.const 1 + i32.add + i32.store offset=800 + local.get 9 + i32.load offset=800 + local.set 12 + block ;; label = @2 + block ;; label = @3 + local.get 9 + i32.load offset=804 + local.tee 17 + i32.const 200 + i32.ge_s + br_if 0 (;@3;) + local.get 12 + local.set 16 + br 1 (;@2;) + end + i32.const 0 + local.set 16 + i32.const 0 + i32.const 60 + call $__pragma_loopbound + local.get 9 + i32.load offset=804 + local.get 9 + i32.load offset=800 + i32.sub + local.tee 17 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 7 + local.get 12 + i32.const 2 + i32.shl + i32.add + local.set 15 + i32.const 0 + local.set 16 + i32.const 0 + local.set 12 + loop ;; label = @3 + local.get 7 + local.get 12 + i32.add + local.get 15 + local.get 12 + i32.add + i32.load8_u + i32.store8 + local.get 12 + i32.const 1 + i32.add + local.tee 12 + local.get 9 + i32.load offset=804 + local.get 9 + i32.load offset=800 + i32.sub + local.tee 17 + i32.lt_s + br_if 0 (;@3;) + end + end + local.get 9 + local.get 17 + i32.const 2 + i32.shl + i32.add + local.get 13 + f32.store + local.get 9 + local.get 17 + i32.const 1 + i32.add + i32.store offset=804 + local.get 9 + local.get 16 + i32.const 1 + i32.add + i32.store offset=800 + local.get 3 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.get 9 + local.get 16 + i32.const 2 + i32.shl + i32.add + f32.load + f32.store + local.get 7 + i32.const 808 + i32.add + local.set 7 + local.get 8 + i32.const 268 + i32.add + local.set 8 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + i32.const 11 + i32.ne + br_if 0 (;@1;) + end + i32.const 10 + i32.const 10 + call $__pragma_loopbound + local.get 2 + f32.load offset=11872 + local.set 18 + local.get 2 + f32.load offset=11868 + local.set 19 + local.get 2 + f32.load offset=11864 + local.set 20 + local.get 2 + f32.load offset=11860 + local.set 21 + local.get 2 + f32.load offset=11856 + local.set 22 + local.get 2 + f32.load offset=11852 + local.set 23 + local.get 2 + f32.load offset=11848 + local.set 24 + local.get 2 + f32.load offset=11844 + local.set 25 + local.get 2 + f32.load offset=11840 + local.set 26 + local.get 2 + f32.load offset=11836 + local.set 27 + local.get 3 + f32.load offset=40 + local.set 28 + local.get 3 + f32.load offset=36 + local.set 13 + local.get 3 + f32.load offset=32 + local.set 29 + local.get 3 + f32.load offset=28 + local.set 30 + local.get 3 + f32.load offset=24 + local.set 31 + local.get 3 + f32.load offset=20 + local.set 32 + local.get 3 + f32.load offset=16 + local.set 33 + local.get 3 + f32.load offset=12 + local.set 34 + local.get 3 + f32.load offset=8 + local.set 35 + local.get 3 + f32.load + local.set 36 + local.get 3 + f32.load offset=4 + local.set 37 + block ;; label = @1 + local.get 1 + i32.load offset=804 + local.tee 17 + i32.const 200 + i32.lt_s + br_if 0 (;@1;) + local.get 1 + i32.load offset=800 + local.set 12 + i32.const 0 + i32.const 60 + call $__pragma_loopbound + block ;; label = @2 + local.get 1 + i32.load offset=804 + local.get 1 + i32.load offset=800 + i32.sub + local.tee 17 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 1 + local.get 12 + i32.const 2 + i32.shl + i32.add + local.set 9 + i32.const 0 + local.set 12 + loop ;; label = @3 + local.get 1 + local.get 12 + i32.add + local.get 9 + local.get 12 + i32.add + i32.load8_u + i32.store8 + local.get 12 + i32.const 1 + i32.add + local.tee 12 + local.get 1 + i32.load offset=804 + local.get 1 + i32.load offset=800 + i32.sub + local.tee 17 + i32.lt_s + br_if 0 (;@3;) + end + end + local.get 1 + i32.const 0 + i32.store offset=800 + end + local.get 1 + local.get 17 + i32.const 1 + i32.add + i32.store offset=804 + local.get 1 + local.get 17 + i32.const 2 + i32.shl + i32.add + local.get 28 + local.get 13 + f32.sub + local.get 18 + f32.mul + local.get 13 + local.get 29 + f32.sub + local.get 19 + f32.mul + local.get 29 + local.get 30 + f32.sub + local.get 20 + f32.mul + local.get 30 + local.get 31 + f32.sub + local.get 21 + f32.mul + local.get 31 + local.get 32 + f32.sub + local.get 22 + f32.mul + local.get 32 + local.get 33 + f32.sub + local.get 23 + f32.mul + local.get 33 + local.get 34 + f32.sub + local.get 24 + f32.mul + local.get 34 + local.get 35 + f32.sub + local.get 25 + f32.mul + local.get 35 + local.get 37 + f32.sub + local.get 26 + f32.mul + local.get 37 + local.get 36 + f32.sub + local.get 27 + f32.mul + f32.const 0x0p+0 (;=0;) + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.add + f32.store + local.get 3 + i32.const 48 + i32.add + global.set $__stack_pointer) + (func $fmref___ieee754_rem_pio2f (type 5) (param f32 i32) (result i32) + (local f32 i32 i32 i32 f32 f32 f32) + block ;; label = @1 + local.get 0 + f32.abs + local.tee 2 + i32.reinterpret_f32 + local.tee 3 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@1;) + local.get 1 + i32.const 0 + i32.store offset=4 + local.get 1 + local.get 0 + f32.store + i32.const 0 + return + end + local.get 0 + i32.reinterpret_f32 + local.set 4 + block ;; label = @1 + local.get 3 + i32.const 1075235811 + i32.gt_u + br_if 0 (;@1;) + local.get 3 + i32.const 2147483632 + i32.and + local.set 3 + block ;; label = @2 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@2;) + local.get 0 + f32.const -0x1.921fp+0 (;=-1.57079;) + f32.add + local.set 0 + block ;; label = @3 + local.get 3 + i32.const 1070141392 + i32.eq + br_if 0 (;@3;) + local.get 1 + local.get 0 + f32.const -0x1.6a8886p-17 (;=-1.08043e-05;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const -0x1.6a8886p-17 (;=-1.08043e-05;) + f32.add + f32.store offset=4 + i32.const 1 + return + end + local.get 1 + local.get 0 + f32.const -0x1.6a88p-17 (;=-1.08043e-05;) + f32.add + local.tee 0 + f32.const -0x1.0b461p-34 (;=-6.0771e-11;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const -0x1.0b461p-34 (;=-6.0771e-11;) + f32.add + f32.store offset=4 + i32.const 1 + return + end + local.get 0 + f32.const 0x1.921fp+0 (;=1.57079;) + f32.add + local.set 0 + block ;; label = @2 + local.get 3 + i32.const 1070141392 + i32.eq + br_if 0 (;@2;) + local.get 1 + local.get 0 + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.add + f32.store offset=4 + i32.const -1 + return + end + local.get 1 + local.get 0 + f32.const 0x1.6a88p-17 (;=1.08043e-05;) + f32.add + local.tee 0 + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.add + local.tee 2 + f32.store + local.get 1 + local.get 0 + local.get 2 + f32.sub + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.add + f32.store offset=4 + i32.const -1 + return + end + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.const 1128861568 + i32.gt_u + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + local.get 2 + f32.const 0x1.45f308p-1 (;=0.63662;) + f32.mul + f32.const 0x1p-1 (;=0.5;) + f32.add + local.tee 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 5 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 5 + end + local.get 5 + f32.convert_i32_s + local.tee 6 + f32.const 0x1.6a8886p-17 (;=1.08043e-05;) + f32.mul + local.set 7 + local.get 2 + local.get 6 + f32.const -0x1.921fp+0 (;=-1.57079;) + f32.mul + f32.add + local.set 0 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 5 + i32.const 31 + i32.gt_s + br_if 0 (;@5;) + local.get 3 + i32.const 2147483392 + i32.and + local.get 5 + i32.const 2 + i32.shl + i32.const 1020 + i32.add + i32.load + i32.ne + br_if 1 (;@4;) + end + local.get 1 + local.get 0 + local.get 7 + f32.sub + local.tee 2 + f32.store + local.get 3 + i32.const 23 + i32.shr_u + local.tee 3 + local.get 2 + i32.reinterpret_f32 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + i32.sub + i32.const 9 + i32.lt_s + br_if 1 (;@3;) + local.get 1 + local.get 0 + local.get 6 + f32.const 0x1.6a88p-17 (;=1.08043e-05;) + f32.mul + local.tee 2 + f32.sub + local.tee 8 + local.get 6 + f32.const 0x1.0b461p-34 (;=6.0771e-11;) + f32.mul + local.get 0 + local.get 8 + f32.sub + local.get 2 + f32.sub + f32.sub + local.tee 7 + f32.sub + local.tee 2 + f32.store + block ;; label = @5 + local.get 3 + local.get 2 + i32.reinterpret_f32 + i32.const 23 + i32.shr_u + i32.const 255 + i32.and + i32.sub + i32.const 26 + i32.ge_s + br_if 0 (;@5;) + local.get 8 + local.set 0 + br 2 (;@3;) + end + local.get 6 + f32.const 0x1.1a6264p-54 (;=6.12323e-17;) + f32.mul + local.get 8 + local.get 8 + local.get 6 + f32.const 0x1.0b46p-34 (;=6.07709e-11;) + f32.mul + local.tee 2 + f32.sub + local.tee 0 + f32.sub + local.get 2 + f32.sub + f32.sub + local.set 7 + end + local.get 1 + local.get 0 + local.get 7 + f32.sub + local.tee 2 + f32.store + end + local.get 1 + local.get 0 + local.get 2 + f32.sub + local.get 7 + f32.sub + local.tee 0 + f32.store offset=4 + local.get 4 + i32.const -1 + i32.gt_s + br_if 1 (;@1;) + local.get 1 + local.get 0 + f32.neg + f32.store offset=4 + local.get 1 + local.get 2 + f32.neg + f32.store + i32.const 0 + local.get 5 + i32.sub + return + end + local.get 1 + local.get 0 + local.get 0 + f32.sub + local.tee 0 + f32.store + local.get 1 + local.get 0 + f32.store offset=4 + i32.const 0 + local.set 5 + end + local.get 5) + (func $fmref___atanf (type 6) (param f32) (result f32) + (local i32 f32 i32 i32 f32 f32) + local.get 0 + i32.reinterpret_f32 + local.set 1 + block ;; label = @1 + local.get 0 + f32.abs + local.tee 2 + i32.reinterpret_f32 + local.tee 3 + i32.const 1350565888 + i32.lt_u + br_if 0 (;@1;) + block ;; label = @2 + local.get 3 + i32.const 2139095041 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + local.get 0 + f32.add + return + end + f32.const 0x1.921fb6p+0 (;=1.5708;) + f32.const -0x1.921fb6p+0 (;=-1.5708;) + local.get 1 + i32.const 0 + i32.gt_s + select + return + end + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 3 + i32.const 1054867455 + i32.gt_u + br_if 0 (;@3;) + i32.const -1 + local.set 4 + local.get 0 + f32.const 0x1.93e594p+99 (;=1e+30;) + f32.add + f32.const 0x1p+0 (;=1;) + f32.gt + i32.eqz + br_if 1 (;@2;) + local.get 3 + i32.const 822083584 + i32.ge_u + br_if 1 (;@2;) + br 2 (;@1;) + end + block ;; label = @3 + local.get 3 + i32.const 1066926079 + i32.gt_u + br_if 0 (;@3;) + block ;; label = @4 + local.get 3 + i32.const 1060110335 + i32.gt_u + br_if 0 (;@4;) + local.get 2 + local.get 2 + f32.add + f32.const -0x1p+0 (;=-1;) + f32.add + local.get 2 + f32.const 0x1p+1 (;=2;) + f32.add + f32.div + local.set 0 + i32.const 0 + local.set 4 + br 2 (;@2;) + end + local.get 2 + f32.const -0x1p+0 (;=-1;) + f32.add + local.get 2 + f32.const 0x1p+0 (;=1;) + f32.add + f32.div + local.set 0 + i32.const 1 + local.set 4 + br 1 (;@2;) + end + block ;; label = @3 + local.get 3 + i32.const 1075576831 + i32.gt_u + br_if 0 (;@3;) + local.get 2 + f32.const -0x1.8p+0 (;=-1.5;) + f32.add + local.get 2 + f32.const 0x1.8p+0 (;=1.5;) + f32.mul + f32.const 0x1p+0 (;=1;) + f32.add + f32.div + local.set 0 + i32.const 2 + local.set 4 + br 1 (;@2;) + end + f32.const -0x1p+0 (;=-1;) + local.get 2 + f32.div + local.set 0 + i32.const 3 + local.set 4 + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + f32.mul + local.tee 2 + local.get 2 + local.get 2 + local.get 2 + local.get 2 + f32.const -0x1.2b4442p-5 (;=-0.0365316;) + f32.mul + f32.const -0x1.dde2d6p-5 (;=-0.0583357;) + f32.add + f32.mul + f32.const -0x1.3b0f2ap-4 (;=-0.0769188;) + f32.add + f32.mul + f32.const -0x1.c71c7p-4 (;=-0.111111;) + f32.add + f32.mul + f32.const -0x1.99999ap-3 (;=-0.2;) + f32.add + f32.mul + local.set 6 + local.get 5 + local.get 2 + local.get 2 + local.get 2 + local.get 2 + local.get 2 + f32.const 0x1.0ad3aep-6 (;=0.0162858;) + f32.mul + f32.const 0x1.97b4b2p-5 (;=0.0497688;) + f32.add + f32.mul + f32.const 0x1.10d66ap-4 (;=0.0666107;) + f32.add + f32.mul + f32.const 0x1.745cdcp-4 (;=0.0909089;) + f32.add + f32.mul + f32.const 0x1.24924ap-3 (;=0.142857;) + f32.add + f32.mul + f32.const 0x1.555556p-2 (;=0.333333;) + f32.add + f32.mul + local.set 2 + block ;; label = @2 + local.get 3 + i32.const 1054867455 + i32.gt_u + br_if 0 (;@2;) + local.get 0 + local.get 0 + local.get 6 + local.get 2 + f32.add + f32.mul + f32.sub + return + end + local.get 4 + i32.const 2 + i32.shl + local.tee 3 + i32.const 1152 + i32.add + f32.load + local.get 0 + local.get 6 + local.get 2 + f32.add + f32.mul + local.get 3 + i32.const 1168 + i32.add + f32.load + f32.sub + local.get 0 + f32.sub + f32.sub + local.tee 0 + f32.neg + local.get 0 + local.get 1 + i32.const 0 + i32.lt_s + select + local.set 0 + end + local.get 0) + (func $fmref___cosf (type 6) (param f32) (result f32) + (local i32 i32 i32 i32 f32 f32 f32 f32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@2;) + local.get 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 4 + end + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + local.get 4 + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.set 0 + br 2 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 6 + block ;; label = @3 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 6 + f32.mul + local.get 0 + f32.const -0x0p+0 (;=-0;) + f32.mul + f32.add + f32.sub + f32.sub + local.set 0 + br 2 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 7 + f32.sub + local.get 5 + local.get 6 + f32.mul + local.get 0 + f32.const -0x0p+0 (;=-0;) + f32.mul + f32.add + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 7 + f32.sub + f32.sub + f32.add + local.set 0 + br 1 (;@1;) + end + block ;; label = @2 + local.get 2 + i32.const 2139095040 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + local.get 0 + f32.sub + local.set 0 + br 1 (;@1;) + end + local.get 0 + local.get 1 + i32.const 8 + i32.add + call $fmref___ieee754_rem_pio2f + local.set 2 + local.get 1 + f32.load offset=8 + local.set 0 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.const 3 + i32.and + br_table 0 (;@5;) 1 (;@4;) 2 (;@3;) 3 (;@2;) 0 (;@5;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @5 + block ;; label = @6 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@6;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@5;) + end + i32.const -2147483648 + local.set 4 + end + local.get 1 + f32.load offset=12 + local.set 6 + block ;; label = @5 + local.get 3 + br_if 0 (;@5;) + local.get 4 + br_if 0 (;@5;) + f32.const 0x1p+0 (;=1;) + local.set 0 + br 4 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 7 + block ;; label = @5 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@5;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + f32.sub + f32.sub + local.set 0 + br 4 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 0 + br 3 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @4 + block ;; label = @5 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@5;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@4;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @4 + block ;; label = @5 + local.get 2 + br_if 0 (;@5;) + local.get 3 + i32.eqz + br_if 1 (;@4;) + end + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 5 + f32.neg + f32.mul + local.tee 6 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 5 + local.get 1 + f32.load offset=12 + local.tee 7 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 6 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 7 + f32.sub + f32.add + f32.sub + local.set 0 + end + local.get 0 + f32.neg + local.set 0 + br 2 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 4 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 4 + end + local.get 1 + f32.load offset=12 + local.set 6 + block ;; label = @3 + block ;; label = @4 + local.get 3 + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.set 5 + local.get 4 + i32.eqz + br_if 1 (;@3;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 7 + block ;; label = @4 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + f32.sub + f32.sub + f32.neg + local.set 0 + br 3 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 5 + local.get 7 + f32.mul + local.get 6 + local.get 0 + f32.mul + f32.sub + local.get 5 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 5 + end + local.get 5 + f32.neg + local.set 0 + br 1 (;@1;) + end + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @2 + block ;; label = @3 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@2;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @2 + local.get 2 + br_if 0 (;@2;) + local.get 3 + i32.eqz + br_if 1 (;@1;) + end + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.mul + local.tee 5 + f32.neg + f32.mul + local.tee 6 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 5 + local.get 1 + f32.load offset=12 + local.tee 7 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 6 + local.get 5 + local.get 5 + local.get 5 + local.get 5 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 7 + f32.sub + f32.add + f32.sub + local.set 0 + end + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (func $fmref___sinf (type 6) (param f32) (result f32) + (local i32 i32 i32 f32 f32 f32 i32 f32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 1 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 1061752792 + i32.gt_u + br_if 0 (;@2;) + local.get 2 + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 0 + i32.trunc_f32_s + local.set 3 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @3 + local.get 2 + br_if 0 (;@3;) + local.get 3 + i32.eqz + br_if 2 (;@1;) + end + local.get 0 + local.get 0 + f32.mul + local.tee 4 + local.get 0 + f32.mul + local.get 4 + local.get 4 + local.get 4 + local.get 4 + local.get 4 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.add + f32.mul + local.get 0 + f32.add + local.set 0 + br 1 (;@1;) + end + block ;; label = @2 + local.get 2 + i32.const 2139095040 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + local.get 0 + f32.sub + local.set 0 + br 1 (;@1;) + end + local.get 0 + local.get 1 + i32.const 8 + i32.add + call $fmref___ieee754_rem_pio2f + local.set 2 + local.get 1 + f32.load offset=8 + local.set 4 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.const 3 + i32.and + br_table 0 (;@5;) 1 (;@4;) 2 (;@3;) 3 (;@2;) 0 (;@5;) + end + local.get 4 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @5 + block ;; label = @6 + local.get 4 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@6;) + local.get 4 + i32.trunc_f32_s + local.set 3 + br 1 (;@5;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @5 + local.get 2 + br_if 0 (;@5;) + local.get 3 + br_if 0 (;@5;) + local.get 4 + local.set 0 + br 4 (;@1;) + end + local.get 4 + local.get 4 + local.get 4 + local.get 4 + f32.mul + local.tee 0 + f32.neg + f32.mul + local.tee 5 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 0 + local.get 1 + f32.load offset=12 + local.tee 6 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 6 + f32.sub + f32.add + f32.sub + local.set 0 + br 3 (;@1;) + end + local.get 4 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @4 + block ;; label = @5 + local.get 4 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@5;) + local.get 4 + i32.trunc_f32_s + local.set 7 + br 1 (;@4;) + end + i32.const -2147483648 + local.set 7 + end + local.get 1 + f32.load offset=12 + local.set 5 + block ;; label = @4 + local.get 3 + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.set 0 + local.get 7 + i32.eqz + br_if 3 (;@1;) + end + local.get 4 + local.get 4 + f32.mul + local.tee 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 6 + block ;; label = @4 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@4;) + f32.const 0x1p+0 (;=1;) + local.get 0 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 0 + local.get 6 + f32.mul + local.get 5 + local.get 4 + f32.mul + f32.sub + f32.sub + f32.sub + local.set 0 + br 3 (;@1;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 0 + local.get 6 + f32.mul + local.get 5 + local.get 4 + f32.mul + f32.sub + local.get 0 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 0 + br 2 (;@1;) + end + local.get 4 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + i32.const 838860799 + i32.gt_u + local.set 2 + block ;; label = @3 + block ;; label = @4 + local.get 4 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 4 + i32.trunc_f32_s + local.set 3 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @3 + block ;; label = @4 + local.get 2 + br_if 0 (;@4;) + local.get 3 + i32.eqz + br_if 1 (;@3;) + end + local.get 4 + local.get 4 + local.get 4 + local.get 4 + f32.mul + local.tee 0 + f32.neg + f32.mul + local.tee 5 + f32.const -0x1.555556p-3 (;=-0.166667;) + f32.mul + local.get 0 + local.get 1 + f32.load offset=12 + local.tee 6 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 5 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.const 0x1.5d93a6p-33 (;=1.58969e-10;) + f32.mul + f32.const -0x1.ae5e68p-26 (;=-2.50508e-08;) + f32.add + f32.mul + f32.const 0x1.71de36p-19 (;=2.75573e-06;) + f32.add + f32.mul + f32.const -0x1.a01a02p-13 (;=-0.000198413;) + f32.add + f32.mul + f32.const 0x1.111112p-7 (;=0.00833333;) + f32.add + f32.mul + f32.add + f32.mul + local.get 6 + f32.sub + f32.add + f32.sub + local.set 4 + end + local.get 4 + f32.neg + local.set 0 + br 1 (;@1;) + end + local.get 4 + i32.reinterpret_f32 + i32.const 2147483647 + i32.and + local.tee 2 + i32.const 838860799 + i32.gt_u + local.set 3 + block ;; label = @2 + block ;; label = @3 + local.get 4 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@3;) + local.get 4 + i32.trunc_f32_s + local.set 7 + br 1 (;@2;) + end + i32.const -2147483648 + local.set 7 + end + local.get 1 + f32.load offset=12 + local.set 5 + block ;; label = @2 + block ;; label = @3 + local.get 3 + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.set 0 + local.get 7 + i32.eqz + br_if 1 (;@2;) + end + local.get 4 + local.get 4 + f32.mul + local.tee 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + local.get 0 + f32.const -0x1.8fae9cp-37 (;=-1.13596e-11;) + f32.mul + f32.const 0x1.1ee9ecp-29 (;=2.08757e-09;) + f32.add + f32.mul + f32.const -0x1.27e4f8p-22 (;=-2.75573e-07;) + f32.add + f32.mul + f32.const 0x1.a01a02p-16 (;=2.48016e-05;) + f32.add + f32.mul + f32.const -0x1.6c16c2p-10 (;=-0.00138889;) + f32.add + f32.mul + f32.const 0x1.555556p-5 (;=0.0416667;) + f32.add + f32.mul + local.set 6 + block ;; label = @3 + local.get 2 + i32.const 1050253721 + i32.gt_u + br_if 0 (;@3;) + f32.const 0x1p+0 (;=1;) + local.get 0 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 0 + local.get 6 + f32.mul + local.get 5 + local.get 4 + f32.mul + f32.sub + f32.sub + f32.sub + local.set 0 + br 1 (;@2;) + end + f32.const 0x1p+0 (;=1;) + f32.const 0x1.2p-2 (;=0.28125;) + local.get 2 + i32.const -16777216 + i32.add + f32.reinterpret_i32 + local.get 2 + i32.const 1061683200 + i32.gt_u + select + local.tee 8 + f32.sub + local.get 0 + local.get 6 + f32.mul + local.get 5 + local.get 4 + f32.mul + f32.sub + local.get 0 + f32.const 0x1p-1 (;=0.5;) + f32.mul + local.get 8 + f32.sub + f32.sub + f32.add + local.set 0 + end + local.get 0 + f32.neg + local.set 0 + end + local.get 1 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 0) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 8832)) + (global (;1;) i32 (i32.const 4736)) + (global (;2;) i32 (i32.const 8832)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "main" (func $__original_main)) + (export "entrypoint" (func $fmref_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\00\0f\c9?\00\0fI@\00\cb\96@\00\0f\c9@\00S\fb@\00\cb\16A\00\ed/A\00\0fIA\001bA\00S{A\00:\8aA\00\cb\96A\00\5c\a3A\00\ed\afA\00~\bcA\00\0f\c9A\00\a0\d5A\001\e2A\00\c2\eeA\00S\fbA\00\f2\03B\00:\0aB\00\83\10B\00\cb\16B\00\14\1dB\00\5c#B\00\a5)B\00\ed/B\0066B\00~\da\0fI?^\98{?\da\0f\c9?i7\ac1h!\223\b4\0f\143h!\a23") + (data $.data (i32.const 1184) "\01\00\5cB@\90\9bB\01\00\dcBD\90\1bC\01\00\5cC@\90\9bC\01\00\dcCD\90\1bD\01\00\5cD@\90\9bD\01\00\dcD\02\00\00\00")) diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/fmref.c b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/fmref.c new file mode 100644 index 0000000..d09912e --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/fmref.c @@ -0,0 +1,275 @@ +/* + fmref.c: C reference implementation of FM Radio + David Maze + $Id: fmref.c,v 1.2 2010-10-04 21:21:26 garus Exp $ +*/ + +#include "wcclibm.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +// Defines +#define SAMPLING_RATE 250000000 +#define CUTOFF_FREQUENCY 108000000 +#define NUM_TAPS 64 +#define MAX_AMPLITUDE 27000.0 +#define BANDWIDTH 10000 +#define DECIMATION 4 +/* Must be at least NUM_TAPS+1: */ +#define IN_BUFFER_LEN 200 +#define EQUALIZER_BANDS 10 + +// Type declarations +typedef struct FloatBuffer { + float buff[IN_BUFFER_LEN]; + int rpos, rlen; +} FloatBuffer; +/* Low pass filter: */ +typedef struct LPFData { + float coeff[NUM_TAPS]; + float freq; + int taps, decimation; +} LPFData; +typedef struct EqualizerData { + LPFData lpf[EQUALIZER_BANDS + 1]; + FloatBuffer fb[EQUALIZER_BANDS + 1]; + float gain[EQUALIZER_BANDS]; +} EqualizerData; + +// Global vars +float fmref_lpf_coeff[NUM_TAPS]; +float fmref_eq_cutoffs[EQUALIZER_BANDS + 1] = { + 55.000004f, 77.78174f, 110.00001f, 155.56354f, 220.00002f, 311.12695f, + 440.00003f, 622.25415f, 880.00006f, 1244.5078f, 1760.0001f}; +static int fmref_numiters = 2; + +// Forward declarations +void fmref_fb_compact(FloatBuffer *fb); +int fmref_fb_ensure_writable(FloatBuffer *fb, int amount); +void fmref_get_floats(FloatBuffer *fb); +void fmref_init_lpf_data(LPFData *data, float freq, int taps, int decimation); +void fmref_run_lpf(FloatBuffer *fbin, FloatBuffer *fbout, LPFData *data); +void fmref_run_demod(FloatBuffer *fbin, FloatBuffer *fbout); +void fmref_init_equalizer(EqualizerData *data); +void fmref_run_equalizer(FloatBuffer *fbin, FloatBuffer *fbout, + EqualizerData *data); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fmref_main(void); + +void +fmref_init(void) { + // dummy init function +} + +int +fmref_return(void) { + // dummy return value + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fmref_init(); + fmref_main(); + return fmref_return(); +} + +FloatBuffer fmref_fb1, fmref_fb2, fmref_fb3, fmref_fb4; +LPFData fmref_lpf_data; + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fmref_main(void) { + int i; + EqualizerData eq_data; + + fmref_fb1.rpos = fmref_fb1.rlen = 0; + fmref_fb2.rpos = fmref_fb2.rlen = 0; + fmref_fb3.rpos = fmref_fb3.rlen = 0; + fmref_fb4.rpos = fmref_fb4.rlen = 0; + + fmref_init_lpf_data(&fmref_lpf_data, CUTOFF_FREQUENCY, NUM_TAPS, + DECIMATION); + fmref_init_equalizer(&eq_data); + + /* Startup: */ + fmref_get_floats(&fmref_fb1); + /* LPF needs at least NUM_TAPS+1 inputs; fmref_get_floats is fine. */ + fmref_run_lpf(&fmref_fb1, &fmref_fb2, &fmref_lpf_data); + /* run_demod needs 1 input, OK here. */ + /* run_equalizer needs 51 inputs (same reason as for LPF). This means + running the pipeline up to demod 50 times in advance: */ + __pragma_loopbound(64, 64); + for (i = 0; i < 64; i++) { + if (fmref_fb1.rlen - fmref_fb1.rpos < NUM_TAPS + 1) + fmref_get_floats(&fmref_fb1); + fmref_run_lpf(&fmref_fb1, &fmref_fb2, &fmref_lpf_data); + fmref_run_demod(&fmref_fb2, &fmref_fb3); + } + + /* Main loop: */ + __pragma_loopbound(2, 2); + while (fmref_numiters-- > 0) { + /* The low-pass filter will need NUM_TAPS+1 items; read them if we + need to. */ + if (fmref_fb1.rlen - fmref_fb1.rpos < NUM_TAPS + 1) + fmref_get_floats(&fmref_fb1); + fmref_run_lpf(&fmref_fb1, &fmref_fb2, &fmref_lpf_data); + fmref_run_demod(&fmref_fb2, &fmref_fb3); + fmref_run_equalizer(&fmref_fb3, &fmref_fb4, &eq_data); + } +} + +void +fmref_fb_compact(FloatBuffer *fb) { + + int i; + char *source; + char *target; + target = (char *) (fb->buff); + source = (char *) (fb->buff + fb->rpos); + __pragma_loopbound(0, 60); + for (i = 0; i < fb->rlen - fb->rpos; i++) + target[i] = source[i]; + fb->rlen -= fb->rpos; + fb->rpos = 0; +} + +int +fmref_fb_ensure_writable(FloatBuffer *fb, int amount) { + int available = IN_BUFFER_LEN - fb->rlen; + if (available >= amount) + return 1; + + /* Nope, not enough room, move current contents back to the beginning. */ + fmref_fb_compact(fb); + + available = IN_BUFFER_LEN - fb->rlen; + if (available >= amount) + return 1; + + return 0; +} + +void +fmref_get_floats(FloatBuffer *fb) { + static int x = 0; + fmref_fb_compact(fb); + + /* Fill the remaining space in fb with 1.0. */ + __pragma_loopbound(140, 200); + while (fb->rlen < IN_BUFFER_LEN) { + fb->buff[fb->rlen++] = (float) x; + x++; + } +} + +void +fmref_init_lpf_data(LPFData *data, float freq, int taps, int decimation) { + /* Assume that CUTOFF_FREQUENCY is non-zero. See comments in + StreamIt LowPassFilter.java for origin. */ + float w = 2 * M_PI * freq / SAMPLING_RATE; + int i; + float m = taps - 1.0f; + + data->freq = freq; + data->taps = taps; + data->decimation = decimation; + + __pragma_loopbound(64, 64); + for (i = 0; i < taps; i++) { + if (i - m / 2 == 0.0f) + data->coeff[i] = w / M_PI; + else + data->coeff[i] = sin(w * (i - m / 2)) / M_PI / (i - m / 2) * + (0.54f - 0.46f * cos(2 * M_PI * i / m)); + } +} + +void +fmref_run_lpf(FloatBuffer *fbin, FloatBuffer *fbout, LPFData *data) { + float sum = 0.0f; + int i = 0; + + __pragma_loopbound(64, 64); + for (i = 0; i < data->taps; i++) + sum += fbin->buff[fbin->rpos + i] * data->coeff[i]; + + fbin->rpos += data->decimation + 1; + + /* Check that there's room in the output buffer; move data if necessary. */ + fmref_fb_ensure_writable(fbout, 1); + fbout->buff[fbout->rlen++] = sum; +} + +void +fmref_run_demod(FloatBuffer *fbin, FloatBuffer *fbout) { + float temp, gain; + gain = MAX_AMPLITUDE * SAMPLING_RATE / (BANDWIDTH * M_PI); + temp = fbin->buff[fbin->rpos] * fbin->buff[fbin->rpos + 1]; + temp = gain * atan(temp); + fbin->rpos++; + fmref_fb_ensure_writable(fbout, 1); + fbout->buff[fbout->rlen++] = temp; +} + +void +fmref_init_equalizer(EqualizerData *data) { + int i; + + /* Equalizer structure: there are ten band-pass filters, with + cutoffs as shown below. The outputs of these filters get added + together. Each band-pass filter is LPF(high)-LPF(low). */ + __pragma_loopbound(11, 11); + for (i = 0; i < EQUALIZER_BANDS + 1; i++) + fmref_init_lpf_data(&data->lpf[i], fmref_eq_cutoffs[i], 64, 0); + + /* Also initialize member buffers. */ + __pragma_loopbound(11, 11); + for (i = 0; i < EQUALIZER_BANDS + 1; i++) + data->fb[i].rpos = data->fb[i].rlen = 0; + + __pragma_loopbound(10, 10); + for (i = 0; i < EQUALIZER_BANDS; i++) { + // the gain amplifies the middle bands the most + float val = + (((float) i) - (((float) (EQUALIZER_BANDS - 1)) / 2.0f)) / 5.0f; + data->gain[i] = val > 0 ? 2.0f - val : 2.0f + val; + } +} + +void +fmref_run_equalizer(FloatBuffer *fbin, FloatBuffer *fbout, + EqualizerData *data) { + int i, rpos; + float lpf_out[EQUALIZER_BANDS + 1]; + float sum = 0.0; + + /* Save the input read location; we can reuse the same input data on all + of the LPFs. */ + rpos = fbin->rpos; + + /* Run the child filters. */ + __pragma_loopbound(11, 11); + for (i = 0; i < EQUALIZER_BANDS + 1; i++) { + fbin->rpos = rpos; + fmref_run_lpf(fbin, &data->fb[i], &data->lpf[i]); + lpf_out[i] = data->fb[i].buff[data->fb[i].rpos++]; + } + + /* Now process the results of the filters. Remember that each band is + output(hi)-output(lo). */ + __pragma_loopbound(10, 10); + for (i = 0; i < EQUALIZER_BANDS; i++) + sum += (lpf_out[i + 1] - lpf_out[i]) * data->gain[i]; + + /* Write that result. */ + fmref_fb_ensure_writable(fbout, 1); + fbout->buff[fbout->rlen++] = sum; +} diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/math_private.h b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/math_private.h new file mode 100644 index 0000000..583d9a6 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/math_private.h @@ -0,0 +1,173 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +// #include +// #include + +/* A representation of a double as a union. */ +union ieee754_double { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 20; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 19; + unsigned int quiet_nan : 1; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee_nan; +}; + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */ +/* #warning USING Big Endian float word order */ +/* typedef union */ +/* { */ +/* double value; */ +/* struct */ +/* { */ +/* u_int16_t msw; */ +/* u_int16_t lsw; */ +/* } parts; */ +/* } ieeeDoubleShapeType; */ + +/* #endif */ + +/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */ +/* #warning USING Little Endian float word order */ + +typedef union { + double value; + struct { + u_int16_t lsw; + u_int16_t msw; + } parts; +} ieeeDoubleShapeType; + +/* #endif */ + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0, ix1, d) \ + { \ + ieeeDoubleShapeType ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i, d) \ + { \ + ieeeDoubleShapeType gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ + } + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i, d) \ + { \ + ieeeDoubleShapeType gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ + } + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d, ix0, ix1) \ + { \ + ieeeDoubleShapeType iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d, v) \ + { \ + ieeeDoubleShapeType sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ + } + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d, v) \ + { \ + ieeeDoubleShapeType sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ + } + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.c b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.c new file mode 100644 index 0000000..fe77083 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.c @@ -0,0 +1,575 @@ +#include "wcclibm.h" +#include "math_private.h" + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +static const int32_t fmref_npio2_hw[] = { +#else +static int32_t fmref_npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +static const float +#else +static float +#endif + /* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ + /* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ + /* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ + fmref_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + fmref_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + fmref_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + fmref_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + fmref_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + fmref_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + fmref_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t +fmref___ieee754_rem_pio2f(float x, float *y) +#else +int32_t +fmref___ieee754_rem_pio2f(x, y) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - fmref_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - fmref_pio2_1t; + y[1] = (z - y[0]) - fmref_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= fmref_pio2_2; + y[0] = z - fmref_pio2_2t; + y[1] = (z - y[0]) - fmref_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + fmref_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + fmref_pio2_1t; + y[1] = (z - y[0]) + fmref_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += fmref_pio2_2; + y[0] = z + fmref_pio2_2t; + y[1] = (z - y[0]) + fmref_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf(x); + n = (int32_t) (t * fmref_invpio2 + fmref_half); + fn = (float) n; + r = t - fn * fmref_pio2_1; + w = fn * fmref_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && (int32_t) (ix & 0xffffff00) != fmref_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * fmref_pio2_2; + r = t - w; + w = fn * fmref_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * fmref_pio2_3; + r = t - w; + w = fn * fmref_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + +#ifdef __STDC__ +static const float +#else +static float +#endif + /* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ + fmref_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + fmref_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + fmref_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + fmref_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + fmref_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + fmref_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float +fmref___kernel_cosf(float x, float y) +#else +float +fmref___kernel_cosf(x, y) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return fmref_one; /* generate inexact */ + } + z = x * x; + r = z * + (fmref_C1 + + z * (fmref_C2 + + z * (fmref_C3 + z * (fmref_C4 + z * (fmref_C5 + z * fmref_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return fmref_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = fmref_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + +#ifdef __STDC__ +static const float +#else +static float +#endif + /* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ + fmref_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + fmref_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + fmref_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + fmref_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + fmref_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + fmref_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float +fmref___kernel_sinf(float x, float y, int iy) +#else +float +fmref___kernel_sinf(x, y, iy) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = fmref_S2 + + z * (fmref_S3 + z * (fmref_S4 + z * (fmref_S5 + z * fmref_S6))); + if (iy == 0) + return x + v * (fmref_S1 + z * r); + else + return x - ((z * (fmref_half * y - v * r) - y) - v * fmref_S1); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + +#ifdef __STDC__ +static const float fmref_atanhi[] = { +#else +static float fmref_atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +static const float fmref_atanlo[] = { +#else +static float fmref_atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +static const float fmref_aT[] = { +#else +static float fmref_aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float +fmref___atanf(float x) +#else +float +fmref___atanf(x) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix >= 0x50800000) { /* if |x| >= 2^34 */ + if (ix > 0x7f800000) + return x + x; /* NaN */ + if (hx > 0) + return fmref_atanhi[3] + fmref_atanlo[3]; + else + return -fmref_atanhi[3] - fmref_atanlo[3]; + } + if (ix < 0x3ee00000) { /* |x| < 0.4375 */ + if (ix < 0x31000000) { /* |x| < 2^-29 */ + if (fmref_huge + x > fmref_one) + return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf(x); + if (ix < 0x3f980000) { /* |x| < 1.1875 */ + if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ((float) 2.0f * x - fmref_one) / ((float) 2.0f + x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = (x - fmref_one) / (x + fmref_one); + } + } else { + if (ix < 0x401c0000) { /* |x| < 2.4375 */ + id = 2; + x = (x - (float) 1.5f) / (fmref_one + (float) 1.5f * x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -(float) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * + (fmref_aT[0] + + w * (fmref_aT[2] + + w * (fmref_aT[4] + + w * (fmref_aT[6] + w * (fmref_aT[8] + w * fmref_aT[10]))))); + s2 = w * (fmref_aT[1] + + w * (fmref_aT[3] + + w * (fmref_aT[5] + w * (fmref_aT[7] + w * fmref_aT[9])))); + if (id < 0) + return x - x * (s1 + s2); + else { + z = fmref_atanhi[id] - ((x * (s1 + s2) - fmref_atanlo[id]) - x); + return (hx < 0) ? -z : z; + } +} +// weak_alias (__atanf, atanf) + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float +fmref___cosf(float x) +#else +float +fmref___cosf(x) +float x; +#endif +{ + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return fmref___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = fmref___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return fmref___kernel_cosf(y[0], y[1]); + case 1: + return -fmref___kernel_sinf(y[0], y[1], 1); + case 2: + return -fmref___kernel_cosf(y[0], y[1]); + default: + return fmref___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float +fmref___sinf(float x) +#else +float +fmref___sinf(x) +float x; +#endif +{ + float y[2], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return fmref___kernel_sinf(x, z, 0); + + /* sin(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = fmref___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return fmref___kernel_sinf(y[0], y[1], 1); + case 1: + return fmref___kernel_cosf(y[0], y[1]); + case 2: + return -fmref___kernel_sinf(y[0], y[1], 1); + default: + return -fmref___kernel_cosf(y[0], y[1]); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +#ifdef __STDC__ +float +fmref___fabsf(float x) +#else +float +fmref___fabsf(x) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.h b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.h new file mode 100644 index 0000000..9e3706f --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/default/wcclibm.h @@ -0,0 +1,55 @@ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +// Often used variables/consts +#ifdef __STDC__ +static const float +#else +static float +#endif + fmref_one = 1.0f, + fmref_half = 5.0000000000e-01f, /* 0x3f000000 */ + fmref_zero = 0.0f, fmref_huge = 1.0e30, + fmref_two8 = 2.5600000000e+02f, /* 0x43800000 */ + fmref_twon8 = 3.9062500000e-03f; /* 0x3b800000 */ + +// The following defines map the math functions to specialized calls +#define acos fmref___ieee754_acosf +#define atan fmref___atanf +#define cos fmref___cosf +#define fabs fmref___fabsf +#define fabsf fmref___fabsf +#define isinf fmref___isinff +#define pow fmref___ieee754_powf +#define sqrt fmref___ieee754_sqrtf +#define log10 fmref___ieee754_log10f +#define log fmref___ieee754_logf +#define sin fmref___sinf + +float fmref___atanf(float x); +float fmref___copysignf(float x, float y); +float fmref___cosf(float x); +float fmref___fabsf(float x); +float fmref___floorf(float x); +float fmref___ieee754_acosf(float x); +float fmref___ieee754_powf(float x, float y); +int32_t fmref___ieee754_rem_pio2f(float x, float *y); +float fmref___ieee754_sqrtf(float x); +int fmref___isinff(float x); +float fmref___kernel_cosf(float x, float y); +float fmref___kernel_sinf(float x, float y, int iy); +int fmref___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2); +float fmref___scalbnf(float x, int n); +float fmref___ieee754_logf(float x); +float fmref___ieee754_log10f(float x); +float fmref___sinf(float x); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/fmref.c b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/fmref.c new file mode 100644 index 0000000..8fd1a99 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/fmref.c @@ -0,0 +1,289 @@ +/* + fmref.c: C reference implementation of FM Radio + David Maze + $Id: fmref.c,v 1.2 2010-10-04 21:21:26 garus Exp $ +*/ + +#include "wcclibm.h" + +// Wasm loop bounds + + +#include "wcclibm.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +// Defines +#define SAMPLING_RATE 250000000 +#define CUTOFF_FREQUENCY 108000000 +#define NUM_TAPS 64 +#define MAX_AMPLITUDE 27000.0 +#define BANDWIDTH 10000 +#define DECIMATION 4 +/* Must be at least NUM_TAPS+1: */ +#define IN_BUFFER_LEN 200 +#define EQUALIZER_BANDS 10 + +// Type declarations +typedef struct FloatBuffer { + float buff[IN_BUFFER_LEN]; + int rpos, rlen; +} FloatBuffer; +/* Low pass filter: */ +typedef struct LPFData { + float coeff[NUM_TAPS]; + float freq; + int taps, decimation; +} LPFData; +typedef struct EqualizerData { + LPFData lpf[EQUALIZER_BANDS + 1]; + FloatBuffer fb[EQUALIZER_BANDS + 1]; + float gain[EQUALIZER_BANDS]; +} EqualizerData; + +// Global vars +float fmref_lpf_coeff[NUM_TAPS]; +float fmref_eq_cutoffs[EQUALIZER_BANDS + 1] = { + 55.000004f, 77.78174f, 110.00001f, 155.56354f, 220.00002f, 311.12695f, + 440.00003f, 622.25415f, 880.00006f, 1244.5078f, 1760.0001f}; +static int fmref_numiters = 2; + +// Forward declarations +__attribute__((always_inline)) static inline void +fmref_fb_compact(FloatBuffer *fb); +__attribute__((always_inline)) static inline int +fmref_fb_ensure_writable(FloatBuffer *fb, int amount); +__attribute__((always_inline)) static inline void +fmref_get_floats(FloatBuffer *fb); +__attribute__((always_inline)) static inline void +fmref_init_lpf_data(LPFData *data, float freq, int taps, int decimation); +__attribute__((always_inline)) static inline void +fmref_run_lpf(FloatBuffer *fbin, FloatBuffer *fbout, LPFData *data); +__attribute__((always_inline)) static inline void +fmref_run_demod(FloatBuffer *fbin, FloatBuffer *fbout); +__attribute__((always_inline)) static inline void +fmref_init_equalizer(EqualizerData *data); +__attribute__((always_inline)) static inline void +fmref_run_equalizer(FloatBuffer *fbin, FloatBuffer *fbout, EqualizerData *data); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fmref_main(void); + +__attribute__((always_inline)) static inline void +fmref_init(void) { + // dummy init function +} + +__attribute__((always_inline)) static inline int +fmref_return(void) { + // dummy return value + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + fmref_init(); + fmref_main(); + return fmref_return(); +} + +FloatBuffer fmref_fb1, fmref_fb2, fmref_fb3, fmref_fb4; +LPFData fmref_lpf_data; + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +fmref_main(void) { + int i; + EqualizerData eq_data; + + fmref_fb1.rpos = fmref_fb1.rlen = 0; + fmref_fb2.rpos = fmref_fb2.rlen = 0; + fmref_fb3.rpos = fmref_fb3.rlen = 0; + fmref_fb4.rpos = fmref_fb4.rlen = 0; + + fmref_init_lpf_data(&fmref_lpf_data, CUTOFF_FREQUENCY, NUM_TAPS, + DECIMATION); + fmref_init_equalizer(&eq_data); + + /* Startup: */ + fmref_get_floats(&fmref_fb1); + /* LPF needs at least NUM_TAPS+1 inputs; fmref_get_floats is fine. */ + fmref_run_lpf(&fmref_fb1, &fmref_fb2, &fmref_lpf_data); + /* run_demod needs 1 input, OK here. */ + /* run_equalizer needs 51 inputs (same reason as for LPF). This means + running the pipeline up to demod 50 times in advance: */ + __pragma_loopbound(64, 64); + for (i = 0; i < 64; i++) { + if (fmref_fb1.rlen - fmref_fb1.rpos < NUM_TAPS + 1) + fmref_get_floats(&fmref_fb1); + fmref_run_lpf(&fmref_fb1, &fmref_fb2, &fmref_lpf_data); + fmref_run_demod(&fmref_fb2, &fmref_fb3); + } + + /* Main loop: */ + __pragma_loopbound(2, 2); + while (fmref_numiters-- > 0) { + /* The low-pass filter will need NUM_TAPS+1 items; read them if we + need to. */ + if (fmref_fb1.rlen - fmref_fb1.rpos < NUM_TAPS + 1) + fmref_get_floats(&fmref_fb1); + fmref_run_lpf(&fmref_fb1, &fmref_fb2, &fmref_lpf_data); + fmref_run_demod(&fmref_fb2, &fmref_fb3); + fmref_run_equalizer(&fmref_fb3, &fmref_fb4, &eq_data); + } +} + +__attribute__((always_inline)) static inline void +fmref_fb_compact(FloatBuffer *fb) { + + int i; + char *source; + char *target; + target = (char *) (fb->buff); + source = (char *) (fb->buff + fb->rpos); + __pragma_loopbound(0, 60); + for (i = 0; i < fb->rlen - fb->rpos; i++) + target[i] = source[i]; + fb->rlen -= fb->rpos; + fb->rpos = 0; +} + +__attribute__((always_inline)) static inline int +fmref_fb_ensure_writable(FloatBuffer *fb, int amount) { + int available = IN_BUFFER_LEN - fb->rlen; + if (available >= amount) + return 1; + + /* Nope, not enough room, move current contents back to the beginning. */ + fmref_fb_compact(fb); + + available = IN_BUFFER_LEN - fb->rlen; + if (available >= amount) + return 1; + + return 0; +} + +__attribute__((always_inline)) static inline void +fmref_get_floats(FloatBuffer *fb) { + static int x = 0; + fmref_fb_compact(fb); + + /* Fill the remaining space in fb with 1.0. */ + __pragma_loopbound(140, 200); + while (fb->rlen < IN_BUFFER_LEN) { + fb->buff[fb->rlen++] = (float) x; + x++; + } +} + +__attribute__((always_inline)) static inline void +fmref_init_lpf_data(LPFData *data, float freq, int taps, int decimation) { + /* Assume that CUTOFF_FREQUENCY is non-zero. See comments in + StreamIt LowPassFilter.java for origin. */ + float w = 2 * M_PI * freq / SAMPLING_RATE; + int i; + float m = taps - 1.0f; + + data->freq = freq; + data->taps = taps; + data->decimation = decimation; + + __pragma_loopbound(64, 64); + for (i = 0; i < taps; i++) { + if (i - m / 2 == 0.0f) + data->coeff[i] = w / M_PI; + else + data->coeff[i] = sin(w * (i - m / 2)) / M_PI / (i - m / 2) * + (0.54f - 0.46f * cos(2 * M_PI * i / m)); + } +} + +__attribute__((always_inline)) static inline void +fmref_run_lpf(FloatBuffer *fbin, FloatBuffer *fbout, LPFData *data) { + float sum = 0.0f; + int i = 0; + + __pragma_loopbound(64, 64); + for (i = 0; i < data->taps; i++) + sum += fbin->buff[fbin->rpos + i] * data->coeff[i]; + + fbin->rpos += data->decimation + 1; + + /* Check that there's room in the output buffer; move data if necessary. */ + fmref_fb_ensure_writable(fbout, 1); + fbout->buff[fbout->rlen++] = sum; +} + +__attribute__((always_inline)) static inline void +fmref_run_demod(FloatBuffer *fbin, FloatBuffer *fbout) { + float temp, gain; + gain = MAX_AMPLITUDE * SAMPLING_RATE / (BANDWIDTH * M_PI); + temp = fbin->buff[fbin->rpos] * fbin->buff[fbin->rpos + 1]; + temp = gain * atan(temp); + fbin->rpos++; + fmref_fb_ensure_writable(fbout, 1); + fbout->buff[fbout->rlen++] = temp; +} + +__attribute__((always_inline)) static inline void +fmref_init_equalizer(EqualizerData *data) { + int i; + + /* Equalizer structure: there are ten band-pass filters, with + cutoffs as shown below. The outputs of these filters get added + together. Each band-pass filter is LPF(high)-LPF(low). */ + __pragma_loopbound(11, 11); + for (i = 0; i < EQUALIZER_BANDS + 1; i++) + fmref_init_lpf_data(&data->lpf[i], fmref_eq_cutoffs[i], 64, 0); + + /* Also initialize member buffers. */ + __pragma_loopbound(11, 11); + for (i = 0; i < EQUALIZER_BANDS + 1; i++) + data->fb[i].rpos = data->fb[i].rlen = 0; + + __pragma_loopbound(10, 10); + for (i = 0; i < EQUALIZER_BANDS; i++) { + // the gain amplifies the middle bands the most + float val = + (((float) i) - (((float) (EQUALIZER_BANDS - 1)) / 2.0f)) / 5.0f; + data->gain[i] = val > 0 ? 2.0f - val : 2.0f + val; + } +} + +__attribute__((always_inline)) static inline void +fmref_run_equalizer(FloatBuffer *fbin, FloatBuffer *fbout, + EqualizerData *data) { + int i, rpos; + float lpf_out[EQUALIZER_BANDS + 1]; + float sum = 0.0; + + /* Save the input read location; we can reuse the same input data on all + of the LPFs. */ + rpos = fbin->rpos; + + /* Run the child filters. */ + __pragma_loopbound(11, 11); + for (i = 0; i < EQUALIZER_BANDS + 1; i++) { + fbin->rpos = rpos; + fmref_run_lpf(fbin, &data->fb[i], &data->lpf[i]); + lpf_out[i] = data->fb[i].buff[data->fb[i].rpos++]; + } + + /* Now process the results of the filters. Remember that each band is + output(hi)-output(lo). */ + __pragma_loopbound(10, 10); + for (i = 0; i < EQUALIZER_BANDS; i++) + sum += (lpf_out[i + 1] - lpf_out[i]) * data->gain[i]; + + /* Write that result. */ + fmref_fb_ensure_writable(fbout, 1); + fbout->buff[fbout->rlen++] = sum; +} diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/math_private.h b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/math_private.h new file mode 100644 index 0000000..583d9a6 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/math_private.h @@ -0,0 +1,173 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +// #include +// #include + +/* A representation of a double as a union. */ +union ieee754_double { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 20; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 19; + unsigned int quiet_nan : 1; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee_nan; +}; + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */ +/* #warning USING Big Endian float word order */ +/* typedef union */ +/* { */ +/* double value; */ +/* struct */ +/* { */ +/* u_int16_t msw; */ +/* u_int16_t lsw; */ +/* } parts; */ +/* } ieeeDoubleShapeType; */ + +/* #endif */ + +/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */ +/* #warning USING Little Endian float word order */ + +typedef union { + double value; + struct { + u_int16_t lsw; + u_int16_t msw; + } parts; +} ieeeDoubleShapeType; + +/* #endif */ + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0, ix1, d) \ + { \ + ieeeDoubleShapeType ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i, d) \ + { \ + ieeeDoubleShapeType gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ + } + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i, d) \ + { \ + ieeeDoubleShapeType gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ + } + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d, ix0, ix1) \ + { \ + ieeeDoubleShapeType iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d, v) \ + { \ + ieeeDoubleShapeType sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ + } + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d, v) \ + { \ + ieeeDoubleShapeType sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ + } + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.c b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.c new file mode 100644 index 0000000..26e7ffd --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.c @@ -0,0 +1,575 @@ +#include "wcclibm.h" +#include "math_private.h" + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +static const int32_t fmref_npio2_hw[] = { +#else +static int32_t fmref_npio2_hw[] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +static const float +#else +static float +#endif + /* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ + /* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ + /* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ + fmref_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + fmref_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + fmref_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + fmref_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + fmref_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + fmref_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + fmref_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline int32_t +fmref___ieee754_rem_pio2f(float x, float *y) +#else +__attribute__((always_inline)) static inline int32_t +fmref___ieee754_rem_pio2f(x, y) +float x, y[]; +#endif +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - fmref_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - fmref_pio2_1t; + y[1] = (z - y[0]) - fmref_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= fmref_pio2_2; + y[0] = z - fmref_pio2_2t; + y[1] = (z - y[0]) - fmref_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + fmref_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + fmref_pio2_1t; + y[1] = (z - y[0]) + fmref_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += fmref_pio2_2; + y[0] = z + fmref_pio2_2t; + y[1] = (z - y[0]) + fmref_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf(x); + n = (int32_t) (t * fmref_invpio2 + fmref_half); + fn = (float) n; + r = t - fn * fmref_pio2_1; + w = fn * fmref_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && (int32_t) (ix & 0xffffff00) != fmref_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * fmref_pio2_2; + r = t - w; + w = fn * fmref_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * fmref_pio2_3; + r = t - w; + w = fn * fmref_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + y[0] = y[1] = x - x; /* dummy initialization */ + return 0; /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + +#ifdef __STDC__ +static const float +#else +static float +#endif + /* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ + fmref_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + fmref_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + fmref_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + fmref_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + fmref_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + fmref_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +fmref___kernel_cosf(float x, float y) +#else +__attribute__((always_inline)) static inline float +fmref___kernel_cosf(x, y) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return fmref_one; /* generate inexact */ + } + z = x * x; + r = z * + (fmref_C1 + + z * (fmref_C2 + + z * (fmref_C3 + z * (fmref_C4 + z * (fmref_C5 + z * fmref_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return fmref_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = fmref_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + +#ifdef __STDC__ +static const float +#else +static float +#endif + /* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ + fmref_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + fmref_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + fmref_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + fmref_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + fmref_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + fmref_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +fmref___kernel_sinf(float x, float y, int iy) +#else +__attribute__((always_inline)) static inline float +fmref___kernel_sinf(x, y, iy) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = fmref_S2 + + z * (fmref_S3 + z * (fmref_S4 + z * (fmref_S5 + z * fmref_S6))); + if (iy == 0) + return x + v * (fmref_S1 + z * r); + else + return x - ((z * (fmref_half * y - v * r) - y) - v * fmref_S1); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + +#ifdef __STDC__ +static const float fmref_atanhi[] = { +#else +static float fmref_atanhi[] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +static const float fmref_atanlo[] = { +#else +static float fmref_atanlo[] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +static const float fmref_aT[] = { +#else +static float fmref_aT[] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +fmref___atanf(float x) +#else +__attribute__((always_inline)) static inline float +fmref___atanf(x) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix >= 0x50800000) { /* if |x| >= 2^34 */ + if (ix > 0x7f800000) + return x + x; /* NaN */ + if (hx > 0) + return fmref_atanhi[3] + fmref_atanlo[3]; + else + return -fmref_atanhi[3] - fmref_atanlo[3]; + } + if (ix < 0x3ee00000) { /* |x| < 0.4375 */ + if (ix < 0x31000000) { /* |x| < 2^-29 */ + if (fmref_huge + x > fmref_one) + return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf(x); + if (ix < 0x3f980000) { /* |x| < 1.1875 */ + if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ((float) 2.0f * x - fmref_one) / ((float) 2.0f + x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = (x - fmref_one) / (x + fmref_one); + } + } else { + if (ix < 0x401c0000) { /* |x| < 2.4375 */ + id = 2; + x = (x - (float) 1.5f) / (fmref_one + (float) 1.5f * x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -(float) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * + (fmref_aT[0] + + w * (fmref_aT[2] + + w * (fmref_aT[4] + + w * (fmref_aT[6] + w * (fmref_aT[8] + w * fmref_aT[10]))))); + s2 = w * (fmref_aT[1] + + w * (fmref_aT[3] + + w * (fmref_aT[5] + w * (fmref_aT[7] + w * fmref_aT[9])))); + if (id < 0) + return x - x * (s1 + s2); + else { + z = fmref_atanhi[id] - ((x * (s1 + s2) - fmref_atanlo[id]) - x); + return (hx < 0) ? -z : z; + } +} +// weak_alias (__atanf, atanf) + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +fmref___cosf(float x) +#else +__attribute__((always_inline)) static inline float +fmref___cosf(x) +float x; +#endif +{ + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return fmref___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = fmref___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return fmref___kernel_cosf(y[0], y[1]); + case 1: + return -fmref___kernel_sinf(y[0], y[1], 1); + case 2: + return -fmref___kernel_cosf(y[0], y[1]); + default: + return fmref___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +fmref___sinf(float x) +#else +__attribute__((always_inline)) static inline float +fmref___sinf(x) +float x; +#endif +{ + float y[2], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return fmref___kernel_sinf(x, z, 0); + + /* sin(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = fmref___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return fmref___kernel_sinf(y[0], y[1], 1); + case 1: + return fmref___kernel_cosf(y[0], y[1]); + case 2: + return -fmref___kernel_sinf(y[0], y[1], 1); + default: + return -fmref___kernel_cosf(y[0], y[1]); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +#ifdef __STDC__ +__attribute__((always_inline)) static inline float +fmref___fabsf(float x) +#else +__attribute__((always_inline)) static inline float +fmref___fabsf(x) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} diff --git a/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.h b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.h new file mode 100644 index 0000000..9c44cf9 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/generated/modified_sources/inline/wcclibm.h @@ -0,0 +1,66 @@ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +// Often used variables/consts +#ifdef __STDC__ +static const float +#else +static float +#endif + fmref_one = 1.0f, + fmref_half = 5.0000000000e-01f, /* 0x3f000000 */ + fmref_zero = 0.0f, fmref_huge = 1.0e30, + fmref_two8 = 2.5600000000e+02f, /* 0x43800000 */ + fmref_twon8 = 3.9062500000e-03f; /* 0x3b800000 */ + +// The following defines map the math functions to specialized calls +#define acos fmref___ieee754_acosf +#define atan fmref___atanf +#define cos fmref___cosf +#define fabs fmref___fabsf +#define fabsf fmref___fabsf +#define isinf fmref___isinff +#define pow fmref___ieee754_powf +#define sqrt fmref___ieee754_sqrtf +#define log10 fmref___ieee754_log10f +#define log fmref___ieee754_logf +#define sin fmref___sinf + +__attribute__((always_inline)) static inline float fmref___atanf(float x); +__attribute__((always_inline)) static inline float fmref___copysignf(float x, + float y); +__attribute__((always_inline)) static inline float fmref___cosf(float x); +__attribute__((always_inline)) static inline float fmref___fabsf(float x); +__attribute__((always_inline)) static inline float fmref___floorf(float x); +__attribute__((always_inline)) static inline float +fmref___ieee754_acosf(float x); +__attribute__((always_inline)) static inline float +fmref___ieee754_powf(float x, float y); +__attribute__((always_inline)) static inline int32_t +fmref___ieee754_rem_pio2f(float x, float *y); +__attribute__((always_inline)) static inline float +fmref___ieee754_sqrtf(float x); +__attribute__((always_inline)) static inline int fmref___isinff(float x); +__attribute__((always_inline)) static inline float fmref___kernel_cosf(float x, + float y); +__attribute__((always_inline)) static inline float +fmref___kernel_sinf(float x, float y, int iy); +__attribute__((always_inline)) static inline int +fmref___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2); +__attribute__((always_inline)) static inline float fmref___scalbnf(float x, + int n); +__attribute__((always_inline)) static inline float +fmref___ieee754_logf(float x); +__attribute__((always_inline)) static inline float +fmref___ieee754_log10f(float x); +__attribute__((always_inline)) static inline float fmref___sinf(float x); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/fmref/license.txt b/targets/wasm-tacle/sequential/fmref/license.txt new file mode 100755 index 0000000..7029925 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/license.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/targets/wasm-tacle/sequential/fmref/math_private.h b/targets/wasm-tacle/sequential/fmref/math_private.h new file mode 100755 index 0000000..e846510 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/math_private.h @@ -0,0 +1,174 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +//#include +//#include + +/* A representation of a double as a union. */ +union ieee754_double { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1: 32; + unsigned int mantissa0: 20; + unsigned int exponent: 11; + unsigned int negative: 1; + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1: 32; + unsigned int mantissa0: 19; + unsigned int quiet_nan: 1; + unsigned int exponent: 11; + unsigned int negative: 1; + } ieee_nan; +}; + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */ +/* #warning USING Big Endian float word order */ +/* typedef union */ +/* { */ +/* double value; */ +/* struct */ +/* { */ +/* u_int16_t msw; */ +/* u_int16_t lsw; */ +/* } parts; */ +/* } ieeeDoubleShapeType; */ + +/* #endif */ + +/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */ +/* #warning USING Little Endian float word order */ + +typedef union { + double value; + struct { + u_int16_t lsw; + u_int16_t msw; + } parts; +} ieeeDoubleShapeType; + +/* #endif */ + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0,ix1,d) \ +{ \ + ieeeDoubleShapeType ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ +} + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i,d) \ +{ \ + ieeeDoubleShapeType gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ +} + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i,d) \ +{ \ + ieeeDoubleShapeType gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ +} + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d,ix0,ix1) \ +{ \ + ieeeDoubleShapeType iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ +} + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d,v) \ +{ \ + ieeeDoubleShapeType sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ +} + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d,v) \ +{ \ + ieeeDoubleShapeType sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ +} + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/fmref/wcclibm.c b/targets/wasm-tacle/sequential/fmref/wcclibm.c new file mode 100755 index 0000000..59a43a3 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/wcclibm.c @@ -0,0 +1,551 @@ +#include "math_private.h" +#include "wcclibm.h" + + + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +#ifdef __STDC__ +static const int32_t fmref_npio2_hw[ ] = { +#else +static int32_t fmref_npio2_hw[ ] = { +#endif + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +#ifdef __STDC__ +static const float +#else +static float +#endif +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +fmref_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +fmref_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +fmref_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +fmref_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +fmref_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +fmref_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +fmref_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +#ifdef __STDC__ +int32_t fmref___ieee754_rem_pio2f( float x, float *y ) +#else +int32_t fmref___ieee754_rem_pio2f( x, y ) +float x, y[ ]; +#endif +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - fmref_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - fmref_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - fmref_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= fmref_pio2_2; + y[ 0 ] = z - fmref_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - fmref_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + fmref_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + fmref_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + fmref_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += fmref_pio2_2; + y[ 0 ] = z + fmref_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + fmref_pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * fmref_invpio2 + fmref_half ); + fn = ( float )n; + r = t - fn * fmref_pio2_1; + w = fn * fmref_pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != fmref_npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * fmref_pio2_2; + r = t - w; + w = fn * fmref_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * fmref_pio2_3; + r = t - w; + w = fn * fmref_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + + y[ 0 ] = y[ 1 ] = x - x; /* dummy initialization */ + return 0; /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +#ifdef __STDC__ +static const float +#else +static float +#endif +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +fmref_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +fmref_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +fmref_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +fmref_C4 = -2.7557314297e-07f, /* 0xb493f27c */ +fmref_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +fmref_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +#ifdef __STDC__ +float fmref___kernel_cosf( float x, float y ) +#else +float fmref___kernel_cosf( x, y ) +float x, y; +#endif +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return fmref_one; /* generate inexact */ + } + z = x * x; + r = z * ( fmref_C1 + z * ( fmref_C2 + z * ( fmref_C3 + z * ( fmref_C4 + z * + ( fmref_C5 + z * fmref_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return fmref_one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = fmref_one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +#ifdef __STDC__ +static const float +#else +static float +#endif +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +fmref_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +fmref_S2 = 8.3333337680e-03f, /* 0x3c088889 */ +fmref_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +fmref_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +fmref_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +fmref_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +#ifdef __STDC__ +float fmref___kernel_sinf( float x, float y, int iy ) +#else +float fmref___kernel_sinf( x, y, iy ) +float x, y; +int iy; /* iy=0 if y is zero */ +#endif +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = fmref_S2 + z * ( fmref_S3 + z * ( fmref_S4 + z * ( fmref_S5 + z * + fmref_S6 ) ) ); + if ( iy == 0 ) return x + v * ( fmref_S1 + z * r ); + else return x - ( ( z * ( fmref_half * y - v * r ) - y ) - v * fmref_S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +#ifdef __STDC__ +static const float fmref_atanhi[ ] = { +#else +static float fmref_atanhi[ ] = { +#endif + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +#ifdef __STDC__ +static const float fmref_atanlo[ ] = { +#else +static float fmref_atanlo[ ] = { +#endif + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +#ifdef __STDC__ +static const float fmref_aT[ ] = { +#else +static float fmref_aT[ ] = { +#endif + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +/* #ifdef __STDC__ */ +/* static const float */ +/* #else */ +/* static float */ +/* #endif */ +/* one = 1.0, */ +/* huge = 1.0e30; */ + +#ifdef __STDC__ +float fmref___atanf( float x ) +#else +float fmref___atanf( x ) +float x; +#endif +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return fmref_atanhi[ 3 ] + fmref_atanlo[ 3 ]; + else return -fmref_atanhi[ 3 ] - fmref_atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( fmref_huge + x > fmref_one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - fmref_one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - fmref_one ) / ( x + fmref_one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( fmref_one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * ( fmref_aT[ 0 ] + w * ( fmref_aT[ 2 ] + w * ( fmref_aT[ 4 ] + w * + ( fmref_aT[ 6 ] + w * ( fmref_aT[ 8 ] + w * fmref_aT[ 10 ] ) ) ) ) ); + s2 = w * ( fmref_aT[ 1 ] + w * ( fmref_aT[ 3 ] + w * ( fmref_aT[ 5 ] + w * + ( fmref_aT[ 7 ] + w * fmref_aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = fmref_atanhi[ id ] - ( ( x * ( s1 + s2 ) - fmref_atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} +//weak_alias (__atanf, atanf) + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* #ifdef __STDC__ */ +/* static const float one=1.0; */ +/* #else */ +/* static float one=1.0; */ +/* #endif */ + +#ifdef __STDC__ +float fmref___cosf( float x ) +#else +float fmref___cosf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return fmref___kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = fmref___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return fmref___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -fmref___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 2: + return -fmref___kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return fmref___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#ifdef __STDC__ +float fmref___sinf( float x ) +#else +float fmref___sinf( x ) +float x; +#endif +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return fmref___kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = fmref___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return fmref___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return fmref___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -fmref___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -fmref___kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +#ifdef __STDC__ +float fmref___fabsf( float x ) +#else +float fmref___fabsf( x ) +float x; +#endif +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} diff --git a/targets/wasm-tacle/sequential/fmref/wcclibm.h b/targets/wasm-tacle/sequential/fmref/wcclibm.h new file mode 100755 index 0000000..b4b6021 --- /dev/null +++ b/targets/wasm-tacle/sequential/fmref/wcclibm.h @@ -0,0 +1,55 @@ +#ifndef _WCCLIBM +#define _WCCLIBM + +#define size_t unsigned long +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +// Often used variables/consts +#ifdef __STDC__ +static const float +#else +static float +#endif +fmref_one = 1.0f, +fmref_half = 5.0000000000e-01f, /* 0x3f000000 */ +fmref_zero = 0.0f, +fmref_huge = 1.0e30, +fmref_two8 = 2.5600000000e+02f, /* 0x43800000 */ +fmref_twon8 = 3.9062500000e-03f; /* 0x3b800000 */ + +// The following defines map the math functions to specialized calls +#define acos fmref___ieee754_acosf +#define atan fmref___atanf +#define cos fmref___cosf +#define fabs fmref___fabsf +#define fabsf fmref___fabsf +#define isinf fmref___isinff +#define pow fmref___ieee754_powf +#define sqrt fmref___ieee754_sqrtf +#define log10 fmref___ieee754_log10f +#define log fmref___ieee754_logf +#define sin fmref___sinf + +float fmref___atanf( float x ); +float fmref___copysignf( float x, float y ); +float fmref___cosf( float x ); +float fmref___fabsf( float x ); +float fmref___floorf( float x ); +float fmref___ieee754_acosf( float x ); +float fmref___ieee754_powf( float x, float y ); +int32_t fmref___ieee754_rem_pio2f( float x, float *y ); +float fmref___ieee754_sqrtf( float x ); +int fmref___isinff ( float x ); +float fmref___kernel_cosf( float x, float y ); +float fmref___kernel_sinf( float x, float y, int iy ); +int fmref___kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ); +float fmref___scalbnf ( float x, int n ); +float fmref___ieee754_logf( float x ); +float fmref___ieee754_log10f( float x ); +float fmref___sinf( float x ); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/g723_enc/CMakeLists.txt b/targets/wasm-tacle/sequential/g723_enc/CMakeLists.txt new file mode 100644 index 0000000..70daf2c --- /dev/null +++ b/targets/wasm-tacle/sequential/g723_enc/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(g723_enc) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/g723_enc.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/g723_enc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/g723_enc/ChangeLog.txt b/targets/wasm-tacle/sequential/g723_enc/ChangeLog.txt new file mode 100755 index 0000000..8657026 --- /dev/null +++ b/targets/wasm-tacle/sequential/g723_enc/ChangeLog.txt @@ -0,0 +1,34 @@ +File: g723_enc.c +Original provenience: SUN Microsystems + +2016-03-02: + - Renamed file to g723_enc and removed all g721 dead code + - Added TACLeBench header to line 1 + - Moved SUN license to license.txt + - Deleted unused code that was commented out + - Renamed functions prepended g723_enc to all function names + - Renamed function main to g723_enc_main + - Created new function main, calling g723_enc_init, g723_enc_main and + returning g723_enc_return + - Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + functions, followed by main functions + - Applied code formatting with astyle as in the example + + 2016-03-09: + - Renamed global variables, prepended g723_enc_ + - Removed static keyword from global variables + - Renamed datatype from g723_enc_g72x_state to g723_enc_state + - Renamed function g723_enc_g72x_init_state to g723_enc_init_state + + 2016-05-23: + - Added initialization with volatile int + - Added check_sum and comparison with expected result + +2016-05-25 + - Changed name of struct g723_enc_state to g723_enc_state_t + - Changed name of variable state to g723_enc_state + +2017-07-10 + - Fixed undefined behaviour introduced by accessing the result of a pointer + type cast. diff --git a/targets/wasm-tacle/sequential/g723_enc/g723_enc.c b/targets/wasm-tacle/sequential/g723_enc/g723_enc.c new file mode 100755 index 0000000..fa46af3 --- /dev/null +++ b/targets/wasm-tacle/sequential/g723_enc/g723_enc.c @@ -0,0 +1,878 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: g723_enc + + Author: Unknown + + Function: g723 encoder. + + Source: SUN Microsystems + + Changes: The benchmark was changed to use the g723 encoder + + License: "Unrestricted use" (see license.txt) + +*/ + +/* + Declaration of data types +*/ + +/* + The following is the definition of the state structure + used by the G.721/G.723 encoder and decoder to preserve their internal + state between successive calls. The meanings of the majority + of the state structure fields are explained in detail in the + CCITT Recommendation G.721. The field names are essentially indentical + to variable names in the bit level description of the coding algorithm + included in this Recommendation. +*/ +struct g723_enc_state_t { + long yl; /* Locked or steady state step size multiplier. */ + short yu; /* Unlocked or non-steady state step size multiplier. */ + short dms; /* Short term energy estimate. */ + short dml; /* Long term energy estimate. */ + short ap; /* Linear weighting coefficient of 'yl' and 'yu'. */ + + short a[ 2 ]; /* Coefficients of pole portion of prediction filter. */ + short b[ 6 ]; /* Coefficients of zero portion of prediction filter. */ + short pk[ 2 ]; /* + Signs of previous two samples of a partially + reconstructed signal. +*/ + short dq[ 6 ]; /* + Previous 6 samples of the quantized difference + signal represented in an internal floating point + format. +*/ + short sr[ 2 ]; /* + Previous 2 samples of the quantized difference + signal represented in an internal floating point + format. +*/ + char td; /* delayed tone detect, new in 1988 version */ +}; + + +/* + Forward declaration of functions +*/ + +int g723_enc_abs( int num ); +void g723_enc_init_state( struct g723_enc_state_t *state_ptr ); +int g723_enc_predictor_zero( struct g723_enc_state_t *state_ptr ); +int g723_enc_fmult( int an, int srn ); +int g723_enc_predictor_pole( struct g723_enc_state_t *state_ptr ); +int g723_enc_step_size( struct g723_enc_state_t *state_ptr ); +int g723_enc_quantize( + int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size ); /* table size of short integers */ +int g723_enc_reconstruct( + int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y ); /* Step size multiplier */ +void g723_enc_update( + int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + struct g723_enc_state_t *state_ptr ); /* coder state pointer */ +int g723_enc_quan( + int val, + short *table, + int size ); +int g723_enc_search( + int val, + short *table, + int size ); +int g723_enc_alaw2linear( unsigned char a_val ); +int g723_enc_ulaw2linear( unsigned char u_val ); +int g723_enc_g723_24_encoder( + int sample, + int in_coding, + struct g723_enc_state_t *state_ptr ); +int g723_enc_pack_output( + unsigned char code, + int bits ); + +void g723_enc_init(); +int g723_enc_return(); +void g723_enc_main(); +int main( void ); + +/* + Declaration of global variables +*/ + +struct g723_enc_state_t g723_enc_state; + +unsigned int g723_enc_INPUT[ 256 ] = { + 51, 17, 31, 53, 95, 17, 70, 22, 49, 12, 8, 39, 28, 37, 99, 54, + 77, 65, 77, 78, 83, 15, 63, 31, 35, 92, 52, 40, 61, 79, 94, 87, + 87, 68, 76, 58, 39, 35, 20, 83, 42, 46, 98, 12, 21, 96, 74, 41, + 78, 76, 96, 2, 32, 76, 24, 59, 4, 96, 32, 5, 44, 92, 57, 12, + 57, 25, 50, 23, 48, 41, 88, 43, 36, 38, 4, 16, 52, 70, 9, 40, + 78, 24, 34, 23, 30, 30, 89, 3, 65, 40, 68, 73, 94, 23, 84, 97, + 78, 43, 68, 81, 16, 28, 13, 87, 75, 21, 14, 29, 81, 22, 56, 72, + 19, 99, 25, 43, 76, 86, 90, 98, 39, 43, 12, 46, 24, 99, 65, 61, + 24, 45, 79, 7, 48, 15, 24, 95, 62, 99, 48, 80, 75, 38, 48, 53, + 9, 60, 35, 14, 78, 71, 45, 71, 9, 97, 55, 74, 58, 64, 78, 18, + 30, 28, 69, 29, 57, 42, 30, 44, 57, 49, 61, 42, 13, 25, 3, 98, + 11, 38, 65, 35, 55, 36, 57, 48, 16, 62, 17, 56, 29, 88, 84, 85, + 90, 60, 54, 16, 66, 69, 26, 10, 82, 19, 42, 35, 84, 13, 26, 17, + 48, 38, 50, 50, 35, 53, 12, 52, 61, 74, 56, 34, 80, 59, 26, 67, + 55, 79, 89, 89, 6, 80, 91, 65, 16, 30, 16, 28, 85, 54, 3, 20, + 2, 36, 62, 52, 55, 15, 83, 3, 2, 38, 62, 2, 63, 92, 37, 73 +}; + + + +unsigned int g723_enc_OUTPUT[ 256 ]; + +short g723_enc_power2[ 15 ] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, + 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000 + }; + + +/* + Maps G.723_24 code word to reconstructed scale factor normalized log + magnitude values. +*/ + +short g723_enc_qtab_723_24[ 3 ] = {8, 218, 331}; + +/* + Maps G.721 code word to reconstructed scale factor normalized log + magnitude values. +*/ +short g723_enc_dqlntab[ 16 ] = { -2048, 4, 135, 213, 273, 323, 373, 425, + 425, 373, 323, 273, 213, 135, 4, -2048 + }; + +/* Maps G.721 code word to log of scale factor multiplier. */ +short g723_enc_witab[ 16 ] = { -12, 18, 41, 64, 112, 198, 355, 1122, + 1122, 355, 198, 112, 64, 41, 18, -12 + }; +/* + Maps G.721 code words to a set of values whose long and short + term averages are computed and then compared to give an indication + how stationary (steady state) the signal is. +*/ +short g723_enc_fitab[ 16 ] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00, + 0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0 + }; + + +/* + Declaration of macros +*/ + + +#define AUDIO_ENCODING_ULAW (1) /* ISDN u-law */ +#define AUDIO_ENCODING_ALAW (2) /* ISDN A-law */ +#define AUDIO_ENCODING_LINEAR (3) /* PCM 2's-complement (0-center) */ + +#define BIAS (0x84) /* Bias for linear code. */ + +#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ +#define QUANT_MASK (0xf) /* Quantization field mask. */ +#define SEG_SHIFT (4) /* Left shift for segment number. */ +#define SEG_MASK (0x70) /* Segment field mask. */ + +/* + Arithmetic math functions +*/ + +/* + g723_enc_fmult() + + returns the integer product of the 14-bit integer "an" and + "floating point" representation (4-bit exponent, 6-bit mantessa) "srn". +*/ +int g723_enc_fmult( + int an, + int srn ) +{ + short anmag, anexp, anmant; + short wanexp, wanmant; + short retval; + + anmag = ( an > 0 ) ? an : ( ( -an ) & 0x1FFF ); + anexp = g723_enc_quan( anmag, g723_enc_power2, 3 ) - 6; + anmant = ( anmag == 0 ) ? 32 : + ( anexp >= 0 ) ? anmag >> anexp : anmag << -anexp; + wanexp = anexp + ( ( srn >> 6 ) & 0xF ) - 13; + + wanmant = ( anmant * ( srn & 077 ) + 0x30 ) >> 4; + retval = ( wanexp >= 0 ) ? ( ( wanmant << wanexp ) & 0x7FFF ) : + ( wanmant >> -wanexp ); + + return ( ( ( an ^ srn ) < 0 ) ? -retval : retval ); +} + + +/* Manish Verma */ +int g723_enc_abs( int num ) +{ + return ( num < 0 ) ? -num : num; +} + + +/* + Algorithm core functions +*/ + + +/* + g723_enc_quan() + + quantizes the input val against the table of size short integers. + It returns i if table[ i - 1 ] <= val < table[ i ]. + + Using linear search for simple coding. +*/ +int g723_enc_quan( + int val, + short *table, + int size ) +{ + int i, + j = 0, + k = 1; + + _Pragma( "loopbound min 3 max 15" ) + for ( i = 0; i < size; ++i ) { + + if ( k ) { + if ( val < *table++ ) { + j = i; + k = 0; + } + } + } + + return ( j ); +} + + +/* + g723_enc_predictor_zero() + + computes the estimated signal from 6-zero predictor. + +*/ +int +g723_enc_predictor_zero( + struct g723_enc_state_t *state_ptr ) +{ + int i; + int sezi; + + sezi = g723_enc_fmult( state_ptr->b[ 0 ] >> 2, state_ptr->dq[ 0 ] ); + _Pragma( "loopbound min 5 max 5" ) + for ( i = 1; i < 6; i++ ) /* ACCUM */ + sezi += g723_enc_fmult( state_ptr->b[ i ] >> 2, state_ptr->dq[ i ] ); + + return ( sezi ); +} + + +/* + g723_enc_predictor_pole() + + computes the estimated signal from 2-pole predictor. + +*/ +int +g723_enc_predictor_pole( + struct g723_enc_state_t *state_ptr ) +{ + return ( g723_enc_fmult( state_ptr->a[ 1 ] >> 2, state_ptr->sr[ 1 ] ) + + g723_enc_fmult( state_ptr->a[ 0 ] >> 2, state_ptr->sr[ 0 ] ) ); +} + +/* + g723_enc_step_size() + + computes the quantization step size of the adaptive quantizer. + +*/ +int +g723_enc_step_size( + struct g723_enc_state_t *state_ptr ) +{ + int y; + int dif; + int al; + + if ( state_ptr->ap >= 256 ) + return ( state_ptr->yu ); + else { + y = state_ptr->yl >> 6; + dif = state_ptr->yu - y; + al = state_ptr->ap >> 2; + if ( dif > 0 ) + y += ( dif * al ) >> 6; + else + if ( dif < 0 ) + y += ( dif * al + 0x3F ) >> 6; + + return ( y ); + } +} + +/* + g723_enc_quantize() + + Given a raw sample, 'd', of the difference signal and a + quantization step size scale factor, 'y', this routine returns the + ADPCM codeword to which that sample gets quantized. The step + size scale factor division operation is done in the log base 2 domain + as a subtraction. +*/ +int +g723_enc_quantize( + int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size ) /* table size of short integers */ +{ + short dqm; /* Magnitude of 'd' */ + short exp; /* Integer part of base 2 log of 'd' */ + short mant; /* Fractional part of base 2 log */ + short dl; /* Log of magnitude of 'd' */ + short dln; /* Step size scale factor normalized log */ + int i; + + /* + LOG + + Compute base 2 log of 'd', and store in 'dl'. + */ + dqm = g723_enc_abs( d ); + exp = g723_enc_quan( dqm >> 1, g723_enc_power2, 15 ); + mant = ( ( dqm << 7 ) >> exp ) & 0x7F; /* Fractional portion. */ + dl = ( exp << 7 ) + mant; + + /* + SUBTB + + "Divide" by step size multiplier. + */ + dln = dl - ( y >> 2 ); + + /* + QUAN + + Obtain codword i for 'd'. + */ + i = g723_enc_quan( dln, table, size ); + + if ( d < 0 ) /* take 1's complement of i */ + return ( ( size << 1 ) + 1 - i ); + else + if ( i == 0 ) /* take 1's complement of 0 */ + return ( ( size << 1 ) + 1 ); /* new in 1988 */ + else + return ( i ); +} +/* + g723_enc_reconstruct() + + Returns reconstructed difference signal 'dq' obtained from + codeword 'i' and quantization step size scale factor 'y'. + Multiplication is performed in log base 2 domain as addition. +*/ +int +g723_enc_reconstruct( + int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y ) /* Step size multiplier */ +{ + short dql; /* Log of 'dq' magnitude */ + short dex; /* Integer part of log */ + short dqt; + short dq; /* Reconstructed difference signal sample */ + + dql = dqln + ( y >> 2 ); /* ADDA */ + + if ( dql < 0 ) + return ( ( sign ) ? -0x8000 : 0 ); + else { /* ANTILOG */ + dex = ( dql >> 7 ) & 15; + dqt = 128 + ( dql & 127 ); + dq = ( dqt << 7 ) >> ( 14 - dex ); + return ( ( sign ) ? ( dq - 0x8000 ) : dq ); + } +} + + +/* + g723_enc_update() + + updates the state variables for each output code +*/ +void +g723_enc_update( + int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + struct g723_enc_state_t *state_ptr ) /* coder state pointer */ +{ + int cnt; + short mag, exp; /* Adaptive predictor, FLOAT A */ + short a2p; /* LIMC */ + short a1ul; /* UPA1 */ + short pks1; /* UPA2 */ + short fa1; + char tr; /* tone/transition detector */ + short ylint, thr2, dqthr; + short ylfrac, thr1; + short pk0; + + pk0 = ( dqsez < 0 ) ? 1 : 0; /* needed in updating predictor poles */ + + mag = dq & 0x7FFF; /* prediction difference magnitude */ + /* TRANS */ + ylint = state_ptr->yl >> 15; /* exponent part of yl */ + ylfrac = ( state_ptr->yl >> 10 ) & 0x1F; /* fractional part of yl */ + thr1 = ( 32 + ylfrac ) << ylint; /* threshold */ + thr2 = ( ylint > 9 ) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */ + dqthr = ( thr2 + ( thr2 >> 1 ) ) >> 1; /* dqthr = 0.75 * thr2 */ + if ( state_ptr->td == 0 ) /* signal supposed voice */ + tr = 0; + else + if ( mag <= dqthr ) /* supposed data, but small mag */ + tr = 0; /* treated as voice */ + else /* signal is data (modem) */ + tr = 1; + + /* + Quantizer scale factor adaptation. + */ + + /* FUNCTW & FILTD & DELAY */ + /* update non-steady state step size multiplier */ + state_ptr->yu = y + ( ( wi - y ) >> 5 ); + + /* LIMB */ + if ( state_ptr->yu < 544 ) /* 544 <= yu <= 5120 */ + state_ptr->yu = 544; + else + if ( state_ptr->yu > 5120 ) + state_ptr->yu = 5120; + + /* FILTE & DELAY */ + /* update steady state step size multiplier */ + state_ptr->yl += state_ptr->yu + ( ( -state_ptr->yl ) >> 6 ); + + /* + Adaptive predictor coefficients. + */ + if ( tr == 1 ) { /* reset a's and b's for modem signal */ + state_ptr->a[ 0 ] = 0; + state_ptr->a[ 1 ] = 0; + state_ptr->b[ 0 ] = 0; + state_ptr->b[ 1 ] = 0; + state_ptr->b[ 2 ] = 0; + state_ptr->b[ 3 ] = 0; + state_ptr->b[ 4 ] = 0; + state_ptr->b[ 5 ] = 0; + } else { /* update a's and b's */ + pks1 = pk0 ^ state_ptr->pk[ 0 ]; /* UPA2 */ + + /* update predictor pole a[ 1 ] */ + a2p = state_ptr->a[ 1 ] - ( state_ptr->a[ 1 ] >> 7 ); + if ( dqsez != 0 ) { + fa1 = ( pks1 ) ? state_ptr->a[ 0 ] : -state_ptr->a[ 0 ]; + if ( fa1 < -8191 ) /* a2p = function of fa1 */ + a2p -= 0x100; + else + if ( fa1 > 8191 ) + a2p += 0xFF; + else + a2p += fa1 >> 5; + if ( pk0 ^ state_ptr->pk[ 1 ] ) + /* LIMC */ + if ( a2p <= -12160 ) + a2p = -12288; + else + if ( a2p >= 12416 ) + a2p = 12288; + else + a2p -= 0x80; + else + if ( a2p <= -12416 ) + a2p = -12288; + else + if ( a2p >= 12160 ) + a2p = 12288; + else + a2p += 0x80; + + } + + /* TRIGB & DELAY */ + state_ptr->a[ 1 ] = a2p; + + /* UPA1 */ + /* update predictor pole a[ 0 ] */ + state_ptr->a[ 0 ] -= state_ptr->a[ 0 ] >> 8; + if ( dqsez != 0 ) { + if ( pks1 == 0 ) + state_ptr->a[ 0 ] += 192; + else + state_ptr->a[ 0 ] -= 192; + } + + /* LIMD */ + a1ul = 15360 - a2p; + if ( state_ptr->a[ 0 ] < -a1ul ) + state_ptr->a[ 0 ] = -a1ul; + else + if ( state_ptr->a[ 0 ] > a1ul ) + state_ptr->a[ 0 ] = a1ul; + + /* UPB : update predictor zeros b[ 6 ] */ + _Pragma( "loopbound min 6 max 6" ) + for ( cnt = 0; cnt < 6; cnt++ ) { + if ( code_size == 5 ) /* for 40Kbps G.723 */ + state_ptr->b[ cnt ] -= state_ptr->b[ cnt ] >> 9; + else /* for G.721 and 24Kbps G.723 */ + state_ptr->b[ cnt ] -= state_ptr->b[ cnt ] >> 8; + if ( dq & 0x7FFF ) { /* XOR */ + if ( ( dq ^ state_ptr->dq[ cnt ] ) >= 0 ) + state_ptr->b[ cnt ] += 128; + else + state_ptr->b[ cnt ] -= 128; + } + + } + } + + _Pragma( "loopbound min 5 max 5" ) + for ( cnt = 5; cnt > 0; cnt-- ) + state_ptr->dq[ cnt ] = state_ptr->dq[ cnt - 1 ]; + /* FLOAT A : convert dq[ 0 ] to 4-bit exp, 6-bit mantissa f.p. */ + if ( mag == 0 ) + state_ptr->dq[ 0 ] = ( dq >= 0 ) ? 0x20 : 0xFC20; + else { + exp = g723_enc_quan( mag, g723_enc_power2, 15 ); + state_ptr->dq[ 0 ] = ( dq >= 0 ) ? + ( exp << 6 ) + ( ( mag << 6 ) >> exp ) : + ( exp << 6 ) + ( ( mag << 6 ) >> exp ) - 0x400; + + } + + state_ptr->sr[ 1 ] = state_ptr->sr[ 0 ]; + /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ + if ( sr == 0 ) + state_ptr->sr[ 0 ] = 0x20; + else + if ( sr > 0 ) { + exp = g723_enc_quan( sr, g723_enc_power2, 15 ); + state_ptr->sr[ 0 ] = ( exp << 6 ) + ( ( sr << 6 ) >> exp ); + } else + if ( sr > -32768 ) { + mag = -sr; + exp = g723_enc_quan( mag, g723_enc_power2, 15 ); + state_ptr->sr[ 0 ] = ( exp << 6 ) + ( ( mag << 6 ) >> exp ) - 0x400; + } else + state_ptr->sr[ 0 ] = 0xFC20; + + /* DELAY A */ + state_ptr->pk[ 1 ] = state_ptr->pk[ 0 ]; + state_ptr->pk[ 0 ] = pk0; + + /* TONE */ + if ( tr == 1 ) /* this sample has been treated as data */ + state_ptr->td = 0; /* next one will be treated as voice */ + else + if ( a2p < -11776 ) /* small sample-to-sample correlation */ + state_ptr->td = 1; /* signal may be data */ + else /* signal is voice */ + state_ptr->td = 0; + + /* + Adaptation speed control. + */ + state_ptr->dms += ( fi - state_ptr->dms ) >> 5; /* FILTA */ + state_ptr->dml += ( ( ( fi << 2 ) - state_ptr->dml ) >> 7 ); /* FILTB */ + + if ( tr == 1 ) + state_ptr->ap = 256; + else + if ( y < 1536 ) /* SUBTC */ + state_ptr->ap += ( 0x200 - state_ptr->ap ) >> 4; + else + if ( state_ptr->td == 1 ) + state_ptr->ap += ( 0x200 - state_ptr->ap ) >> 4; + else + if ( g723_enc_abs( ( state_ptr->dms << 2 ) - state_ptr->dml ) >= + ( state_ptr->dml >> 3 ) ) + state_ptr->ap += ( 0x200 - state_ptr->ap ) >> 4; + else + state_ptr->ap += ( -state_ptr->ap ) >> 4; + +} + + +/* + g723_enc_alaw2linear() - Convert an A-law value to 16-bit linear PCM + +*/ +int +g723_enc_alaw2linear( + unsigned char a_val ) +{ + int t; + int seg; + + a_val ^= 0x55; + + t = ( a_val & QUANT_MASK ) << 4; + seg = ( ( unsigned )a_val & SEG_MASK ) >> SEG_SHIFT; + switch ( seg ) { + case 0: + t += 8; + break; + case 1: + t += 0x108; + break; + default: + t += 0x108; + t <<= seg - 1; + } + return ( ( a_val & SIGN_BIT ) ? t : -t ); +} + + +/* + g723_enc_ulaw2linear() - Convert a u-law value to 16-bit linear PCM + + First, a biased linear code is derived from the code word. An unbiased + output can then be obtained by subtracting 33 from the biased code. + + Note that this function expects to be passed the complement of the + original code word. This is in keeping with ISDN conventions. +*/ +int +g723_enc_ulaw2linear( + unsigned char u_val ) +{ + int t; + + /* Complement to obtain normal u-law value. */ + u_val = ~u_val; + + /* + Extract and bias the quantization bits. Then + shift up by the segment number and subtract out the bias. + */ + t = ( ( u_val & QUANT_MASK ) << 3 ) + BIAS; + t <<= ( ( unsigned int )u_val & SEG_MASK ) >> SEG_SHIFT; + + return ( ( u_val & SIGN_BIT ) ? ( BIAS - t ) : ( t - BIAS ) ); +} + + +/* + g723_enc_g723_24_encoder() + + Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. + Returns -1 if invalid input coding value. +*/ +int +g723_enc_g723_24_encoder( + int sl, + int in_coding, + struct g723_enc_state_t *state_ptr ) +{ + short sei, sezi, se, sez; /* ACCUM */ + short d; /* SUBTA */ + short y; /* MIX */ + short sr; /* ADDB */ + short dqsez; /* ADDC */ + short dq, i; + + switch ( in_coding ) { /* linearize input sample to 14-bit PCM */ + case AUDIO_ENCODING_ALAW: + sl = g723_enc_alaw2linear( sl ) >> 2; + break; + case AUDIO_ENCODING_ULAW: + sl = g723_enc_ulaw2linear( sl ) >> 2; + break; + case AUDIO_ENCODING_LINEAR: + sl >>= 2; /* sl of 14-bit dynamic range */ + break; + default: + return ( -1 ); + } + + sezi = g723_enc_predictor_zero( state_ptr ); + sez = sezi >> 1; + sei = sezi + g723_enc_predictor_pole( state_ptr ); + se = sei >> 1; /* se = estimated signal */ + + d = sl - se; /* d = estimation diff. */ + + /* quantize prediction difference d */ + y = g723_enc_step_size( state_ptr ); /* quantizer step size */ + i = g723_enc_quantize( d, y, g723_enc_qtab_723_24, 3 ); /* i = ADPCM code */ + dq = g723_enc_reconstruct( i & 4, g723_enc_dqlntab[ i ], + y ); /* quantized diff. */ + + sr = ( dq < 0 ) ? se - ( dq & 0x3FFF ) : se + dq; /* reconstructed signal */ + + dqsez = sr + sez - se; /* pole prediction diff. */ + + g723_enc_update( 3, y, g723_enc_witab[ i ], g723_enc_fitab[ i ], dq, sr, dqsez, + state_ptr ); + + return ( i ); +} + +/* + Pack output codes into bytes and write them to stdout. + Returns 1 if there is residual output, else returns 0. +*/ +int +g723_enc_pack_output( + unsigned char code, + int bits ) +{ + static unsigned int out_buffer = 0; + static int out_bits = 0; + unsigned char out_byte; + static int i = 0; + + out_buffer |= ( code << out_bits ); + out_bits += bits; + if ( out_bits >= 8 ) { + out_byte = out_buffer & 0xff; + out_bits -= 8; + out_buffer >>= 8; + //fwrite(&out_byte, sizeof (char), 1, fp_out); + //fwrite(&out_byte, 1, 1, fp_out); + g723_enc_OUTPUT[ i ] = out_byte; + i = i + 1; + } + + return ( out_bits > 0 ); +} + +/* + Initialization- and return-value-related functions +*/ + +/* + g723_enc_init_state() + + This routine initializes and/or resets the g72x_state structure + pointed to by 'state_ptr'. + All the initial state values are specified in the CCITT G.721 document. +*/ +void +g723_enc_init_state( + struct g723_enc_state_t *state_ptr ) +{ + int cnta; + + state_ptr->yl = 34816; + state_ptr->yu = 544; + state_ptr->dms = 0; + state_ptr->dml = 0; + state_ptr->ap = 0; + + _Pragma( "loopbound min 2 max 2" ) + for ( cnta = 0; cnta < 2; cnta++ ) { + state_ptr->a[ cnta ] = 0; + state_ptr->pk[ cnta ] = 0; + state_ptr->sr[ cnta ] = 32; + } + _Pragma( "loopbound min 6 max 6" ) + for ( cnta = 0; cnta < 6; cnta++ ) { + state_ptr->b[ cnta ] = 0; + state_ptr->dq[ cnta ] = 32; + } + state_ptr->td = 0; +} + + +void g723_enc_init() +{ + int i; + volatile int x = 0; + g723_enc_init_state( &g723_enc_state ); + + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) + g723_enc_INPUT[ i ] += x; +} + + +int g723_enc_return() +{ + int i; + int check_sum = 0; + + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) + check_sum += g723_enc_OUTPUT[ i ]; + + return ( check_sum != 24284 ); +} + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) g723_enc_main() +{ +// struct g72x_state state; + short sample_short; //mv + unsigned char code; + int resid; + int in_coding; + short *in_buf; + int enc_bits; + int i = 0; + + enc_bits = 3; + in_coding = AUDIO_ENCODING_ALAW; + in_buf = &sample_short; + + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < 256; i++ ) { + *in_buf = g723_enc_INPUT[ i ]; + code = g723_enc_g723_24_encoder( sample_short, in_coding, &g723_enc_state ); + resid = g723_enc_pack_output( code, enc_bits ); + } + + /* Write zero codes until all residual codes are written out */ + _Pragma( "loopbound min 0 max 0" ) + while ( resid ) + resid = g723_enc_pack_output( 0, enc_bits ); +} + + +int main( void ) +{ + g723_enc_init(); + g723_enc_main(); + + return ( g723_enc_return() ); +} + diff --git a/targets/wasm-tacle/sequential/g723_enc/generated/default/g723_enc.wasm b/targets/wasm-tacle/sequential/g723_enc/generated/default/g723_enc.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ee529e7c3d5e6c22b601b968da504e82b4a26369 GIT binary patch literal 7734 zcmcIp-;Wzd9iN%q^{&0Xv+qZfkSp!%Hk6}Du4yR=?E%dMnx>(&1q!r)aC{dN&c56a zpM4}C#SR2op@ITJs2~JE;sGQc`oI$csVAX6Ayg##f)MH-z(XG@kq5-_`OJ9Nb}mRf zz@0wcneUJJ{+ijDu|<9Bq7?Y6MCUKBuB^2dj!9qmLdYZGIo0clb3&YxJ=r_w_wa{j z#3%p6IS-$p2-#EnWK^qdwCfix){Cp_>l;h!-L>;Vc%`CL%JTy$3;5WOQU;zBvM}TI zq)^4n>FK-E1YOHnI zmp9f|);c2cFVbRis(t(kBN7kr)k&?4>ZZyFty*UH(M|Nl*|{_@Q0ZTX=$Q#&Wa4W}`PzWude>~v z$WG$NCNO~;o5s?lz{hkF4sF6#NLwLnh0Ye5uoc~6%hQ&U+p@i(EidNKhms;6vq@=a z0TIPO8J0@4RDz|FvxFurP26IstSu$CWP3wPWozl)WRjNlC6%EiSg6oK1r{pK0-CT; zy~RSTEhV>LdqWGcwJ@Jd(ZYdbdT0T0%mA~nG)+s>ur%!~p$SWO++t}~TS{)p_J)>b zt)=^teYA8i5kpI`AZP)TLJMaBO<34}i-j3&DY*sP8(Nq_?)5%X?wJ0Yl}*SN^h~R> zW3=8sw`%(Ra?@11W(FdKZ3BUsW~-adv@|GMY#DK84*FBM{vFVtb^3RV=}!&xXQ?k* z8cKRP)1S=stI&^~esxTLa-bjQ`jfhn=@)bT3Fw!d{=}GmaiCw$^^3Zc=@)YS2>PDW zkH+*11AQ;oFX%ASm$`lbec$N^WBPKS@8|kbE34n+U;HN}L%Z-7+`^yy|1Nyarz447 z?&be#T4B+Ty;?lH7C_0TmF*3umB(o{OlvqyYdDscv9x+E?P>V*ze#KS(?ABj;fle! zlry3BY!U=7stro&&Z`Q@((g{JVt&w zBbUd>Kg!4xmTV@o@PACk8Du3MrdyqK|JpMWyOH)y*wNCc?H1-mv8(;A*%h139ZW(< zY$g%K*?b)N64-)7f*e{yp#E!jcQ@P|P-P;?@vH?ct-M5jbpVG7S}jQNR4V6^fZJp< zQAj+79+xw+d0SB(!c)~ueYg>8`B)Ni*g!{fiNqk$V+aMMXXFEY#0}H%`OJib5mn|^ zXL@HR6r2Rd!&Yl#Tgw)EvXWEcZ_i?a!rbm|9)EaL9JBEh8Bb*TH>D2el}L-Gv~BL* zG`g*e9I)C=i=7>`i+JaQvaO3vQz89qQj8IWfjU@~+dA;1E}T)_V$h@89q+g2x5t$Ug-c;SR{y>Z~11fwI~C z8+J`dBWNUTQBHD1_=glkh@b#QCf~F2Z(8|W8iG4c64nq4<_%O|g|`K!15Jcepm0$kcu7|60gwr+CT=>rnFx#VjwzZ5Q!Y3? zmlnD$)0d{-V-#BZTbPJ*%|%&dDRHzzwlVssP&yQvc0#jzg$@mcP-~8~Z?Dk3L!o_6 z=)hi~`JvDOj&m>*!FvGR`y3l93Hd@8aQz@EfYdTRq$qR|N87EDplq>7$s@=qxw|!bA+z10Tb_~16jWD8&VRyL^Mloa9eQtzN z${2R18)0C&I~#Vd8)1|)hTZK(7!w)8?sp@M$&8WhcUaa~n;op>{!Ooqnd$RD40DB! zE^IfGh?6K<#6q;CJhCVkY}o>q%~lKb3GDtjRyOQ~`GG_Scq`^dE%Z_rUAdU-frK<4 z#n(Km46b3eXk!fDY1pETF|fCBcw4kF#%R$-8O}LdG95e#o8cf74r2@E$k7PdmdlZg zBV=1FM=p(!ZK)hN9wFO8IdXY~Y|G@x6PApFi4Dn?37#W2*u+_ss0&V^gUY!5B`{a} zSDr=)H*R`Pb#(QNmI3=#&`SNWTKKoA1!w_l!4i+vVw5pfi&4f{Ek+q*wHRTH*22Gi zEi8F&Ei8F&Ei8F&Ei8F&Ei8F&EiCzVweVdnd|QicR}0g>G+Zf1?3n=hvxkv8-SW8$ z54B_ZKkuF4;b&_z^&b((xTY3lA&qcphFbZNkmen^Zz#>yjpFCmuI3X()=m~%uSR}wI>&wTbvrI@BA5(s#(poyaNluJ*6>t0&a&2NWFee?8QHC2Kw+UboFY zj@_B*{-s2ETwM0MNL)Z{RkfH`W!@gZup8Iy7OBSN&!m6y7Ke{QLfQ(ZLt1UNiNMyPjiQCj*XS5o*1&@>X;iOH{IY!4@2=W9T605yK=$~W|p-x z@G?4U# z!NgAB8Ej(h@yi`dJe#aI-jJ$SeSul5zR1t9#0&VAPX{~ynpoh7^%tBqgSMT{gSIV- zZ3})emQZ$B;=le*J|4#}7bQlG;_Jot3L&O|yMgxswL$+hp8J3YfHDvP?*{G!-UTcJ z$AOOlX7GFp&rbps;8B2M-UECdcnFvWJ_tMwd;$2(03X5gN#GHHHmEZTaIE`)1z-uF zA9n!ffV04R0NSMPIY0p#VE+KH2>8G`Km!4A1fV|;100XfcK{Cp`+;Ks$9)bs3>*UP z1vpL>U>wX%5nw#DPg^NK{ksNu9#0QoZYakXp8yy)<(>uV0QG5y{Eq{)!5mKj%+E&w z#yknU6QB(1@_yh9Fas8us|oP+e0bmoPzdH~~#0s6yu=mYJrX4IpPRe&)}0n8a~JO?oUp8}XC`p>yc*;4?0 zIS7=1PXNp@ZF79;(FgK5CT-9@=MO;{=7ss@T%q4*0oqQ1X8_Ji>VFuZzs&vf0~GM2 z%;x~cM4y-oKA9)_OkX`<7El1=WsJ1P@mN2u9m+m;5Dv zS-yteNl>T7+q;8-@C_LL3z#yK_;fwTx~BZK`o)HroVak}!S~i0Ys(A#g;4%cmc(@S z+hZ;N?NR>6Ul7&)YykXV**L$l+*xnezS3x~d$(h3tgklwsa#{TTVLy}e5Daoa#D8# zKTkFa2XcaKJope@TtDAvhq=SGm9>>lH0<)X%VMQgTW_yiSXryD)<_7ar2uWKQ(tb? z?5~`Sb}^D7Sm3Xq;^E>(d;NTOxzXN|Wi*!?TU(9uN0%Z@CaEA7S?8*N0\00\00\00c\00\00\000\00\00\00P\00\00\00K\00\00\00&\00\00\000\00\00\005\00\00\00\09\00\00\00<\00\00\00#\00\00\00\0e\00\00\00N\00\00\00G\00\00\00-\00\00\00G\00\00\00\09\00\00\00a\00\00\007\00\00\00J\00\00\00:\00\00\00@\00\00\00N\00\00\00\12\00\00\00\1e\00\00\00\1c\00\00\00E\00\00\00\1d\00\00\009\00\00\00*\00\00\00\1e\00\00\00,\00\00\009\00\00\001\00\00\00=\00\00\00*\00\00\00\0d\00\00\00\19\00\00\00\03\00\00\00b\00\00\00\0b\00\00\00&\00\00\00A\00\00\00#\00\00\007\00\00\00$\00\00\009\00\00\000\00\00\00\10\00\00\00>\00\00\00\11\00\00\008\00\00\00\1d\00\00\00X\00\00\00T\00\00\00U\00\00\00Z\00\00\00<\00\00\006\00\00\00\10\00\00\00B\00\00\00E\00\00\00\1a\00\00\00\0a\00\00\00R\00\00\00\13\00\00\00*\00\00\00#\00\00\00T\00\00\00\0d\00\00\00\1a\00\00\00\11\00\00\000\00\00\00&\00\00\002\00\00\002\00\00\00#\00\00\005\00\00\00\0c\00\00\004\00\00\00=\00\00\00J\00\00\008\00\00\00\22\00\00\00P\00\00\00;\00\00\00\1a\00\00\00C\00\00\007\00\00\00O\00\00\00Y\00\00\00Y\00\00\00\06\00\00\00P\00\00\00[\00\00\00A\00\00\00\10\00\00\00\1e\00\00\00\10\00\00\00\1c\00\00\00U\00\00\006\00\00\00\03\00\00\00\14\00\00\00\02\00\00\00$\00\00\00>\00\00\004\00\00\007\00\00\00\0f\00\00\00S\00\00\00\03\00\00\00\02\00\00\00&\00\00\00>\00\00\00\02\00\00\00?\00\00\00\5c\00\00\00%\00\00\00I\00\00\00\01\00\02\00\04\00\08\00\10\00 \00@\00\80\00\00\01\00\02\00\04\00\08\00\10\00 \00@\08\00\da\00K\01\00\00\00\00\00\00\00\00\00\00\00\00\00\f8\04\00\87\00\d5\00\11\01C\01u\01\a9\01\a9\01u\01C\01\11\01\d5\00\87\00\04\00\00\f8\f4\ff\12\00)\00@\00p\00\c6\00c\01b\04b\04c\01\c6\00p\00@\00)\00\12\00\f4\ff\00\00\00\00\00\00\00\02\00\02\00\02\00\06\00\0e\00\0e\00\06\00\02\00\02\00\02\00\00\00\00\00\00")) diff --git a/targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/default/g723_enc.c b/targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/default/g723_enc.c new file mode 100644 index 0000000..3a07116 --- /dev/null +++ b/targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/default/g723_enc.c @@ -0,0 +1,803 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: g723_enc + + Author: Unknown + + Function: g723 encoder. + + Source: SUN Microsystems + + Changes: The benchmark was changed to use the g723 encoder + + License: "Unrestricted use" (see license.txt) + +*/ + +/* + Declaration of data types +*/ + +/* + The following is the definition of the state structure + used by the G.721/G.723 encoder and decoder to preserve their internal + state between successive calls. The meanings of the majority + of the state structure fields are explained in detail in the + CCITT Recommendation G.721. The field names are essentially indentical + to variable names in the bit level description of the coding algorithm + included in this Recommendation. +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +struct g723_enc_state_t { + long yl; /* Locked or steady state step size multiplier. */ + short yu; /* Unlocked or non-steady state step size multiplier. */ + short dms; /* Short term energy estimate. */ + short dml; /* Long term energy estimate. */ + short ap; /* Linear weighting coefficient of 'yl' and 'yu'. */ + + short a[2]; /* Coefficients of pole portion of prediction filter. */ + short b[6]; /* Coefficients of zero portion of prediction filter. */ + short pk[2]; /* + Signs of previous two samples of a partially + reconstructed signal. +*/ + short dq[6]; /* + Previous 6 samples of the quantized difference + signal represented in an internal floating point + format. +*/ + short sr[2]; /* + Previous 2 samples of the quantized difference + signal represented in an internal floating point + format. +*/ + char td; /* delayed tone detect, new in 1988 version */ +}; + +/* + Forward declaration of functions +*/ + +int g723_enc_abs(int num); +void g723_enc_init_state(struct g723_enc_state_t *state_ptr); +int g723_enc_predictor_zero(struct g723_enc_state_t *state_ptr); +int g723_enc_fmult(int an, int srn); +int g723_enc_predictor_pole(struct g723_enc_state_t *state_ptr); +int g723_enc_step_size(struct g723_enc_state_t *state_ptr); +int g723_enc_quantize(int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size); /* table size of short integers */ +int g723_enc_reconstruct(int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y); /* Step size multiplier */ +void +g723_enc_update(int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + struct g723_enc_state_t *state_ptr); /* coder state pointer */ +int g723_enc_quan(int val, short *table, int size); +int g723_enc_search(int val, short *table, int size); +int g723_enc_alaw2linear(unsigned char a_val); +int g723_enc_ulaw2linear(unsigned char u_val); +int g723_enc_g723_24_encoder(int sample, int in_coding, + struct g723_enc_state_t *state_ptr); +int g723_enc_pack_output(unsigned char code, int bits); + +void g723_enc_init(); +int g723_enc_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +g723_enc_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +struct g723_enc_state_t g723_enc_state; + +unsigned int g723_enc_INPUT[256] = { + 51, 17, 31, 53, 95, 17, 70, 22, 49, 12, 8, 39, 28, 37, 99, 54, 77, 65, 77, + 78, 83, 15, 63, 31, 35, 92, 52, 40, 61, 79, 94, 87, 87, 68, 76, 58, 39, 35, + 20, 83, 42, 46, 98, 12, 21, 96, 74, 41, 78, 76, 96, 2, 32, 76, 24, 59, 4, + 96, 32, 5, 44, 92, 57, 12, 57, 25, 50, 23, 48, 41, 88, 43, 36, 38, 4, 16, + 52, 70, 9, 40, 78, 24, 34, 23, 30, 30, 89, 3, 65, 40, 68, 73, 94, 23, 84, + 97, 78, 43, 68, 81, 16, 28, 13, 87, 75, 21, 14, 29, 81, 22, 56, 72, 19, 99, + 25, 43, 76, 86, 90, 98, 39, 43, 12, 46, 24, 99, 65, 61, 24, 45, 79, 7, 48, + 15, 24, 95, 62, 99, 48, 80, 75, 38, 48, 53, 9, 60, 35, 14, 78, 71, 45, 71, + 9, 97, 55, 74, 58, 64, 78, 18, 30, 28, 69, 29, 57, 42, 30, 44, 57, 49, 61, + 42, 13, 25, 3, 98, 11, 38, 65, 35, 55, 36, 57, 48, 16, 62, 17, 56, 29, 88, + 84, 85, 90, 60, 54, 16, 66, 69, 26, 10, 82, 19, 42, 35, 84, 13, 26, 17, 48, + 38, 50, 50, 35, 53, 12, 52, 61, 74, 56, 34, 80, 59, 26, 67, 55, 79, 89, 89, + 6, 80, 91, 65, 16, 30, 16, 28, 85, 54, 3, 20, 2, 36, 62, 52, 55, 15, 83, + 3, 2, 38, 62, 2, 63, 92, 37, 73}; + +unsigned int g723_enc_OUTPUT[256]; + +short g723_enc_power2[15] = {1, 2, 4, 8, 0x10, + 0x20, 0x40, 0x80, 0x100, 0x200, + 0x400, 0x800, 0x1000, 0x2000, 0x4000}; + +/* + Maps G.723_24 code word to reconstructed scale factor normalized log + magnitude values. +*/ + +short g723_enc_qtab_723_24[3] = {8, 218, 331}; + +/* + Maps G.721 code word to reconstructed scale factor normalized log + magnitude values. +*/ +short g723_enc_dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425, + 425, 373, 323, 273, 213, 135, 4, -2048}; + +/* Maps G.721 code word to log of scale factor multiplier. */ +short g723_enc_witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122, + 1122, 355, 198, 112, 64, 41, 18, -12}; +/* + Maps G.721 code words to a set of values whose long and short + term averages are computed and then compared to give an indication + how stationary (steady state) the signal is. +*/ +short g723_enc_fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, + 0x600, 0xE00, 0xE00, 0x600, 0x200, 0x200, + 0x200, 0, 0, 0}; + +/* + Declaration of macros +*/ + +#define AUDIO_ENCODING_ULAW (1) /* ISDN u-law */ +#define AUDIO_ENCODING_ALAW (2) /* ISDN A-law */ +#define AUDIO_ENCODING_LINEAR (3) /* PCM 2's-complement (0-center) */ + +#define BIAS (0x84) /* Bias for linear code. */ + +#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ +#define QUANT_MASK (0xf) /* Quantization field mask. */ +#define SEG_SHIFT (4) /* Left shift for segment number. */ +#define SEG_MASK (0x70) /* Segment field mask. */ + +/* + Arithmetic math functions +*/ + +/* + g723_enc_fmult() + + returns the integer product of the 14-bit integer "an" and + "floating point" representation (4-bit exponent, 6-bit mantessa) "srn". +*/ +int +g723_enc_fmult(int an, int srn) { + short anmag, anexp, anmant; + short wanexp, wanmant; + short retval; + + anmag = (an > 0) ? an : ((-an) & 0x1FFF); + anexp = g723_enc_quan(anmag, g723_enc_power2, 3) - 6; + anmant = (anmag == 0) ? 32 + : (anexp >= 0) ? anmag >> anexp + : anmag << -anexp; + wanexp = anexp + ((srn >> 6) & 0xF) - 13; + + wanmant = (anmant * (srn & 077) + 0x30) >> 4; + retval = + (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp); + + return (((an ^ srn) < 0) ? -retval : retval); +} + +/* Manish Verma */ +int +g723_enc_abs(int num) { + return (num < 0) ? -num : num; +} + +/* + Algorithm core functions +*/ + +/* + g723_enc_quan() + + quantizes the input val against the table of size short integers. + It returns i if table[ i - 1 ] <= val < table[ i ]. + + Using linear search for simple coding. +*/ +int +g723_enc_quan(int val, short *table, int size) { + int i, j = 0, k = 1; + + __pragma_loopbound(3, 15); + for (i = 0; i < size; ++i) { + + if (k) { + if (val < *table++) { + j = i; + k = 0; + } + } + } + + return (j); +} + +/* + g723_enc_predictor_zero() + + computes the estimated signal from 6-zero predictor. + +*/ +int +g723_enc_predictor_zero(struct g723_enc_state_t *state_ptr) { + int i; + int sezi; + + sezi = g723_enc_fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]); + __pragma_loopbound(5, 5); + for (i = 1; i < 6; i++) /* ACCUM */ + sezi += g723_enc_fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]); + + return (sezi); +} + +/* + g723_enc_predictor_pole() + + computes the estimated signal from 2-pole predictor. + +*/ +int +g723_enc_predictor_pole(struct g723_enc_state_t *state_ptr) { + return (g723_enc_fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) + + g723_enc_fmult(state_ptr->a[0] >> 2, state_ptr->sr[0])); +} + +/* + g723_enc_step_size() + + computes the quantization step size of the adaptive quantizer. + +*/ +int +g723_enc_step_size(struct g723_enc_state_t *state_ptr) { + int y; + int dif; + int al; + + if (state_ptr->ap >= 256) + return (state_ptr->yu); + else { + y = state_ptr->yl >> 6; + dif = state_ptr->yu - y; + al = state_ptr->ap >> 2; + if (dif > 0) + y += (dif * al) >> 6; + else if (dif < 0) + y += (dif * al + 0x3F) >> 6; + + return (y); + } +} + +/* + g723_enc_quantize() + + Given a raw sample, 'd', of the difference signal and a + quantization step size scale factor, 'y', this routine returns the + ADPCM codeword to which that sample gets quantized. The step + size scale factor division operation is done in the log base 2 domain + as a subtraction. +*/ +int +g723_enc_quantize(int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size) /* table size of short integers */ +{ + short dqm; /* Magnitude of 'd' */ + short exp; /* Integer part of base 2 log of 'd' */ + short mant; /* Fractional part of base 2 log */ + short dl; /* Log of magnitude of 'd' */ + short dln; /* Step size scale factor normalized log */ + int i; + + /* + LOG + + Compute base 2 log of 'd', and store in 'dl'. + */ + dqm = g723_enc_abs(d); + exp = g723_enc_quan(dqm >> 1, g723_enc_power2, 15); + mant = ((dqm << 7) >> exp) & 0x7F; /* Fractional portion. */ + dl = (exp << 7) + mant; + + /* + SUBTB + + "Divide" by step size multiplier. + */ + dln = dl - (y >> 2); + + /* + QUAN + + Obtain codword i for 'd'. + */ + i = g723_enc_quan(dln, table, size); + + if (d < 0) /* take 1's complement of i */ + return ((size << 1) + 1 - i); + else if (i == 0) /* take 1's complement of 0 */ + return ((size << 1) + 1); /* new in 1988 */ + else + return (i); +} +/* + g723_enc_reconstruct() + + Returns reconstructed difference signal 'dq' obtained from + codeword 'i' and quantization step size scale factor 'y'. + Multiplication is performed in log base 2 domain as addition. +*/ +int +g723_enc_reconstruct(int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y) /* Step size multiplier */ +{ + short dql; /* Log of 'dq' magnitude */ + short dex; /* Integer part of log */ + short dqt; + short dq; /* Reconstructed difference signal sample */ + + dql = dqln + (y >> 2); /* ADDA */ + + if (dql < 0) + return ((sign) ? -0x8000 : 0); + else { /* ANTILOG */ + dex = (dql >> 7) & 15; + dqt = 128 + (dql & 127); + dq = (dqt << 7) >> (14 - dex); + return ((sign) ? (dq - 0x8000) : dq); + } +} + +/* + g723_enc_update() + + updates the state variables for each output code +*/ +void +g723_enc_update(int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + struct g723_enc_state_t *state_ptr) /* coder state pointer */ +{ + int cnt; + short mag, exp; /* Adaptive predictor, FLOAT A */ + short a2p; /* LIMC */ + short a1ul; /* UPA1 */ + short pks1; /* UPA2 */ + short fa1; + char tr; /* tone/transition detector */ + short ylint, thr2, dqthr; + short ylfrac, thr1; + short pk0; + + pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */ + + mag = dq & 0x7FFF; /* prediction difference magnitude */ + /* TRANS */ + ylint = state_ptr->yl >> 15; /* exponent part of yl */ + ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */ + thr1 = (32 + ylfrac) << ylint; /* threshold */ + thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */ + dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */ + if (state_ptr->td == 0) /* signal supposed voice */ + tr = 0; + else if (mag <= dqthr) /* supposed data, but small mag */ + tr = 0; /* treated as voice */ + else /* signal is data (modem) */ + tr = 1; + + /* + Quantizer scale factor adaptation. + */ + + /* FUNCTW & FILTD & DELAY */ + /* update non-steady state step size multiplier */ + state_ptr->yu = y + ((wi - y) >> 5); + + /* LIMB */ + if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */ + state_ptr->yu = 544; + else if (state_ptr->yu > 5120) + state_ptr->yu = 5120; + + /* FILTE & DELAY */ + /* update steady state step size multiplier */ + state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6); + + /* + Adaptive predictor coefficients. + */ + if (tr == 1) { /* reset a's and b's for modem signal */ + state_ptr->a[0] = 0; + state_ptr->a[1] = 0; + state_ptr->b[0] = 0; + state_ptr->b[1] = 0; + state_ptr->b[2] = 0; + state_ptr->b[3] = 0; + state_ptr->b[4] = 0; + state_ptr->b[5] = 0; + } else { /* update a's and b's */ + pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */ + + /* update predictor pole a[ 1 ] */ + a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7); + if (dqsez != 0) { + fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0]; + if (fa1 < -8191) /* a2p = function of fa1 */ + a2p -= 0x100; + else if (fa1 > 8191) + a2p += 0xFF; + else + a2p += fa1 >> 5; + if (pk0 ^ state_ptr->pk[1]) + /* LIMC */ + if (a2p <= -12160) + a2p = -12288; + else if (a2p >= 12416) + a2p = 12288; + else + a2p -= 0x80; + else if (a2p <= -12416) + a2p = -12288; + else if (a2p >= 12160) + a2p = 12288; + else + a2p += 0x80; + } + + /* TRIGB & DELAY */ + state_ptr->a[1] = a2p; + + /* UPA1 */ + /* update predictor pole a[ 0 ] */ + state_ptr->a[0] -= state_ptr->a[0] >> 8; + if (dqsez != 0) { + if (pks1 == 0) + state_ptr->a[0] += 192; + else + state_ptr->a[0] -= 192; + } + + /* LIMD */ + a1ul = 15360 - a2p; + if (state_ptr->a[0] < -a1ul) + state_ptr->a[0] = -a1ul; + else if (state_ptr->a[0] > a1ul) + state_ptr->a[0] = a1ul; + + /* UPB : update predictor zeros b[ 6 ] */ + __pragma_loopbound(6, 6); + for (cnt = 0; cnt < 6; cnt++) { + if (code_size == 5) /* for 40Kbps G.723 */ + state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9; + else /* for G.721 and 24Kbps G.723 */ + state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8; + if (dq & 0x7FFF) { /* XOR */ + if ((dq ^ state_ptr->dq[cnt]) >= 0) + state_ptr->b[cnt] += 128; + else + state_ptr->b[cnt] -= 128; + } + } + } + + __pragma_loopbound(5, 5); + for (cnt = 5; cnt > 0; cnt--) + state_ptr->dq[cnt] = state_ptr->dq[cnt - 1]; + /* FLOAT A : convert dq[ 0 ] to 4-bit exp, 6-bit mantissa f.p. */ + if (mag == 0) + state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20; + else { + exp = g723_enc_quan(mag, g723_enc_power2, 15); + state_ptr->dq[0] = (dq >= 0) ? (exp << 6) + ((mag << 6) >> exp) + : (exp << 6) + ((mag << 6) >> exp) - 0x400; + } + + state_ptr->sr[1] = state_ptr->sr[0]; + /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ + if (sr == 0) + state_ptr->sr[0] = 0x20; + else if (sr > 0) { + exp = g723_enc_quan(sr, g723_enc_power2, 15); + state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp); + } else if (sr > -32768) { + mag = -sr; + exp = g723_enc_quan(mag, g723_enc_power2, 15); + state_ptr->sr[0] = (exp << 6) + ((mag << 6) >> exp) - 0x400; + } else + state_ptr->sr[0] = 0xFC20; + + /* DELAY A */ + state_ptr->pk[1] = state_ptr->pk[0]; + state_ptr->pk[0] = pk0; + + /* TONE */ + if (tr == 1) /* this sample has been treated as data */ + state_ptr->td = 0; /* next one will be treated as voice */ + else if (a2p < -11776) /* small sample-to-sample correlation */ + state_ptr->td = 1; /* signal may be data */ + else /* signal is voice */ + state_ptr->td = 0; + + /* + Adaptation speed control. + */ + state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */ + state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */ + + if (tr == 1) + state_ptr->ap = 256; + else if (y < 1536) /* SUBTC */ + state_ptr->ap += (0x200 - state_ptr->ap) >> 4; + else if (state_ptr->td == 1) + state_ptr->ap += (0x200 - state_ptr->ap) >> 4; + else if (g723_enc_abs((state_ptr->dms << 2) - state_ptr->dml) >= + (state_ptr->dml >> 3)) + state_ptr->ap += (0x200 - state_ptr->ap) >> 4; + else + state_ptr->ap += (-state_ptr->ap) >> 4; +} + +/* + g723_enc_alaw2linear() - Convert an A-law value to 16-bit linear PCM + +*/ +int +g723_enc_alaw2linear(unsigned char a_val) { + int t; + int seg; + + a_val ^= 0x55; + + t = (a_val & QUANT_MASK) << 4; + seg = ((unsigned) a_val & SEG_MASK) >> SEG_SHIFT; + switch (seg) { + case 0: + t += 8; + break; + case 1: + t += 0x108; + break; + default: + t += 0x108; + t <<= seg - 1; + } + return ((a_val & SIGN_BIT) ? t : -t); +} + +/* + g723_enc_ulaw2linear() - Convert a u-law value to 16-bit linear PCM + + First, a biased linear code is derived from the code word. An unbiased + output can then be obtained by subtracting 33 from the biased code. + + Note that this function expects to be passed the complement of the + original code word. This is in keeping with ISDN conventions. +*/ +int +g723_enc_ulaw2linear(unsigned char u_val) { + int t; + + /* Complement to obtain normal u-law value. */ + u_val = ~u_val; + + /* + Extract and bias the quantization bits. Then + shift up by the segment number and subtract out the bias. + */ + t = ((u_val & QUANT_MASK) << 3) + BIAS; + t <<= ((unsigned int) u_val & SEG_MASK) >> SEG_SHIFT; + + return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS)); +} + +/* + g723_enc_g723_24_encoder() + + Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. + Returns -1 if invalid input coding value. +*/ +int +g723_enc_g723_24_encoder(int sl, int in_coding, + struct g723_enc_state_t *state_ptr) { + short sei, sezi, se, sez; /* ACCUM */ + short d; /* SUBTA */ + short y; /* MIX */ + short sr; /* ADDB */ + short dqsez; /* ADDC */ + short dq, i; + + switch (in_coding) { /* linearize input sample to 14-bit PCM */ + case AUDIO_ENCODING_ALAW: + sl = g723_enc_alaw2linear(sl) >> 2; + break; + case AUDIO_ENCODING_ULAW: + sl = g723_enc_ulaw2linear(sl) >> 2; + break; + case AUDIO_ENCODING_LINEAR: + sl >>= 2; /* sl of 14-bit dynamic range */ + break; + default: + return (-1); + } + + sezi = g723_enc_predictor_zero(state_ptr); + sez = sezi >> 1; + sei = sezi + g723_enc_predictor_pole(state_ptr); + se = sei >> 1; /* se = estimated signal */ + + d = sl - se; /* d = estimation diff. */ + + /* quantize prediction difference d */ + y = g723_enc_step_size(state_ptr); /* quantizer step size */ + i = g723_enc_quantize(d, y, g723_enc_qtab_723_24, 3); /* i = ADPCM code */ + dq = g723_enc_reconstruct(i & 4, g723_enc_dqlntab[i], + y); /* quantized diff. */ + + sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */ + + dqsez = sr + sez - se; /* pole prediction diff. */ + + g723_enc_update(3, y, g723_enc_witab[i], g723_enc_fitab[i], dq, sr, dqsez, + state_ptr); + + return (i); +} + +/* + Pack output codes into bytes and write them to stdout. + Returns 1 if there is residual output, else returns 0. +*/ +int +g723_enc_pack_output(unsigned char code, int bits) { + static unsigned int out_buffer = 0; + static int out_bits = 0; + unsigned char out_byte; + static int i = 0; + + out_buffer |= (code << out_bits); + out_bits += bits; + if (out_bits >= 8) { + out_byte = out_buffer & 0xff; + out_bits -= 8; + out_buffer >>= 8; + // fwrite(&out_byte, sizeof (char), 1, fp_out); + // fwrite(&out_byte, 1, 1, fp_out); + g723_enc_OUTPUT[i] = out_byte; + i = i + 1; + } + + return (out_bits > 0); +} + +/* + Initialization- and return-value-related functions +*/ + +/* + g723_enc_init_state() + + This routine initializes and/or resets the g72x_state structure + pointed to by 'state_ptr'. + All the initial state values are specified in the CCITT G.721 document. +*/ +void +g723_enc_init_state(struct g723_enc_state_t *state_ptr) { + int cnta; + + state_ptr->yl = 34816; + state_ptr->yu = 544; + state_ptr->dms = 0; + state_ptr->dml = 0; + state_ptr->ap = 0; + + __pragma_loopbound(2, 2); + for (cnta = 0; cnta < 2; cnta++) { + state_ptr->a[cnta] = 0; + state_ptr->pk[cnta] = 0; + state_ptr->sr[cnta] = 32; + } + __pragma_loopbound(6, 6); + for (cnta = 0; cnta < 6; cnta++) { + state_ptr->b[cnta] = 0; + state_ptr->dq[cnta] = 32; + } + state_ptr->td = 0; +} + +void +g723_enc_init() { + int i; + volatile int x = 0; + g723_enc_init_state(&g723_enc_state); + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + g723_enc_INPUT[i] += x; +} + +int +g723_enc_return() { + int i; + int check_sum = 0; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + check_sum += g723_enc_OUTPUT[i]; + + return (check_sum != 24284); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +g723_enc_main() { + // struct g72x_state state; + short sample_short; // mv + unsigned char code; + int resid; + int in_coding; + short *in_buf; + int enc_bits; + int i = 0; + + enc_bits = 3; + in_coding = AUDIO_ENCODING_ALAW; + in_buf = &sample_short; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) { + *in_buf = g723_enc_INPUT[i]; + code = + g723_enc_g723_24_encoder(sample_short, in_coding, &g723_enc_state); + resid = g723_enc_pack_output(code, enc_bits); + } + + /* Write zero codes until all residual codes are written out */ + __pragma_loopbound(0, 0); + while (resid) + resid = g723_enc_pack_output(0, enc_bits); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + g723_enc_init(); + g723_enc_main(); + + return (g723_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/inline/g723_enc.c b/targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/inline/g723_enc.c new file mode 100644 index 0000000..3ee4250 --- /dev/null +++ b/targets/wasm-tacle/sequential/g723_enc/generated/modified_sources/inline/g723_enc.c @@ -0,0 +1,822 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: g723_enc + + Author: Unknown + + Function: g723 encoder. + + Source: SUN Microsystems + + Changes: The benchmark was changed to use the g723 encoder + + License: "Unrestricted use" (see license.txt) + +*/ + +/* + Declaration of data types +*/ + +/* + The following is the definition of the state structure + used by the G.721/G.723 encoder and decoder to preserve their internal + state between successive calls. The meanings of the majority + of the state structure fields are explained in detail in the + CCITT Recommendation G.721. The field names are essentially indentical + to variable names in the bit level description of the coding algorithm + included in this Recommendation. +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +struct g723_enc_state_t { + long yl; /* Locked or steady state step size multiplier. */ + short yu; /* Unlocked or non-steady state step size multiplier. */ + short dms; /* Short term energy estimate. */ + short dml; /* Long term energy estimate. */ + short ap; /* Linear weighting coefficient of 'yl' and 'yu'. */ + + short a[2]; /* Coefficients of pole portion of prediction filter. */ + short b[6]; /* Coefficients of zero portion of prediction filter. */ + short pk[2]; /* + Signs of previous two samples of a partially + reconstructed signal. +*/ + short dq[6]; /* + Previous 6 samples of the quantized difference + signal represented in an internal floating point + format. +*/ + short sr[2]; /* + Previous 2 samples of the quantized difference + signal represented in an internal floating point + format. +*/ + char td; /* delayed tone detect, new in 1988 version */ +}; + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline int g723_enc_abs(int num); +__attribute__((always_inline)) static inline void +g723_enc_init_state(struct g723_enc_state_t *state_ptr); +__attribute__((always_inline)) static inline int +g723_enc_predictor_zero(struct g723_enc_state_t *state_ptr); +__attribute__((always_inline)) static inline int g723_enc_fmult(int an, + int srn); +__attribute__((always_inline)) static inline int +g723_enc_predictor_pole(struct g723_enc_state_t *state_ptr); +__attribute__((always_inline)) static inline int +g723_enc_step_size(struct g723_enc_state_t *state_ptr); +int g723_enc_quantize(int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size); /* table size of short integers */ +int g723_enc_reconstruct(int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y); /* Step size multiplier */ +void +g723_enc_update(int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + struct g723_enc_state_t *state_ptr); /* coder state pointer */ +__attribute__((always_inline)) static inline int +g723_enc_quan(int val, short *table, int size); +__attribute__((always_inline)) static inline int +g723_enc_search(int val, short *table, int size); +__attribute__((always_inline)) static inline int +g723_enc_alaw2linear(unsigned char a_val); +__attribute__((always_inline)) static inline int +g723_enc_ulaw2linear(unsigned char u_val); +__attribute__((always_inline)) static inline int +g723_enc_g723_24_encoder(int sample, int in_coding, + struct g723_enc_state_t *state_ptr); +__attribute__((always_inline)) static inline int +g723_enc_pack_output(unsigned char code, int bits); + +__attribute__((always_inline)) static inline void g723_enc_init(); +__attribute__((always_inline)) static inline int g723_enc_return(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +g723_enc_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +struct g723_enc_state_t g723_enc_state; + +unsigned int g723_enc_INPUT[256] = { + 51, 17, 31, 53, 95, 17, 70, 22, 49, 12, 8, 39, 28, 37, 99, 54, 77, 65, 77, + 78, 83, 15, 63, 31, 35, 92, 52, 40, 61, 79, 94, 87, 87, 68, 76, 58, 39, 35, + 20, 83, 42, 46, 98, 12, 21, 96, 74, 41, 78, 76, 96, 2, 32, 76, 24, 59, 4, + 96, 32, 5, 44, 92, 57, 12, 57, 25, 50, 23, 48, 41, 88, 43, 36, 38, 4, 16, + 52, 70, 9, 40, 78, 24, 34, 23, 30, 30, 89, 3, 65, 40, 68, 73, 94, 23, 84, + 97, 78, 43, 68, 81, 16, 28, 13, 87, 75, 21, 14, 29, 81, 22, 56, 72, 19, 99, + 25, 43, 76, 86, 90, 98, 39, 43, 12, 46, 24, 99, 65, 61, 24, 45, 79, 7, 48, + 15, 24, 95, 62, 99, 48, 80, 75, 38, 48, 53, 9, 60, 35, 14, 78, 71, 45, 71, + 9, 97, 55, 74, 58, 64, 78, 18, 30, 28, 69, 29, 57, 42, 30, 44, 57, 49, 61, + 42, 13, 25, 3, 98, 11, 38, 65, 35, 55, 36, 57, 48, 16, 62, 17, 56, 29, 88, + 84, 85, 90, 60, 54, 16, 66, 69, 26, 10, 82, 19, 42, 35, 84, 13, 26, 17, 48, + 38, 50, 50, 35, 53, 12, 52, 61, 74, 56, 34, 80, 59, 26, 67, 55, 79, 89, 89, + 6, 80, 91, 65, 16, 30, 16, 28, 85, 54, 3, 20, 2, 36, 62, 52, 55, 15, 83, + 3, 2, 38, 62, 2, 63, 92, 37, 73}; + +unsigned int g723_enc_OUTPUT[256]; + +short g723_enc_power2[15] = {1, 2, 4, 8, 0x10, + 0x20, 0x40, 0x80, 0x100, 0x200, + 0x400, 0x800, 0x1000, 0x2000, 0x4000}; + +/* + Maps G.723_24 code word to reconstructed scale factor normalized log + magnitude values. +*/ + +short g723_enc_qtab_723_24[3] = {8, 218, 331}; + +/* + Maps G.721 code word to reconstructed scale factor normalized log + magnitude values. +*/ +short g723_enc_dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425, + 425, 373, 323, 273, 213, 135, 4, -2048}; + +/* Maps G.721 code word to log of scale factor multiplier. */ +short g723_enc_witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122, + 1122, 355, 198, 112, 64, 41, 18, -12}; +/* + Maps G.721 code words to a set of values whose long and short + term averages are computed and then compared to give an indication + how stationary (steady state) the signal is. +*/ +short g723_enc_fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, + 0x600, 0xE00, 0xE00, 0x600, 0x200, 0x200, + 0x200, 0, 0, 0}; + +/* + Declaration of macros +*/ + +#define AUDIO_ENCODING_ULAW (1) /* ISDN u-law */ +#define AUDIO_ENCODING_ALAW (2) /* ISDN A-law */ +#define AUDIO_ENCODING_LINEAR (3) /* PCM 2's-complement (0-center) */ + +#define BIAS (0x84) /* Bias for linear code. */ + +#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ +#define QUANT_MASK (0xf) /* Quantization field mask. */ +#define SEG_SHIFT (4) /* Left shift for segment number. */ +#define SEG_MASK (0x70) /* Segment field mask. */ + +/* + Arithmetic math functions +*/ + +/* + g723_enc_fmult() + + returns the integer product of the 14-bit integer "an" and + "floating point" representation (4-bit exponent, 6-bit mantessa) "srn". +*/ +__attribute__((always_inline)) static inline int +g723_enc_fmult(int an, int srn) { + short anmag, anexp, anmant; + short wanexp, wanmant; + short retval; + + anmag = (an > 0) ? an : ((-an) & 0x1FFF); + anexp = g723_enc_quan(anmag, g723_enc_power2, 3) - 6; + anmant = (anmag == 0) ? 32 + : (anexp >= 0) ? anmag >> anexp + : anmag << -anexp; + wanexp = anexp + ((srn >> 6) & 0xF) - 13; + + wanmant = (anmant * (srn & 077) + 0x30) >> 4; + retval = + (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp); + + return (((an ^ srn) < 0) ? -retval : retval); +} + +/* Manish Verma */ +__attribute__((always_inline)) static inline int +g723_enc_abs(int num) { + return (num < 0) ? -num : num; +} + +/* + Algorithm core functions +*/ + +/* + g723_enc_quan() + + quantizes the input val against the table of size short integers. + It returns i if table[ i - 1 ] <= val < table[ i ]. + + Using linear search for simple coding. +*/ +__attribute__((always_inline)) static inline int +g723_enc_quan(int val, short *table, int size) { + int i, j = 0, k = 1; + + __pragma_loopbound(3, 15); + for (i = 0; i < size; ++i) { + + if (k) { + if (val < *table++) { + j = i; + k = 0; + } + } + } + + return (j); +} + +/* + g723_enc_predictor_zero() + + computes the estimated signal from 6-zero predictor. + +*/ +__attribute__((always_inline)) static inline int +g723_enc_predictor_zero(struct g723_enc_state_t *state_ptr) { + int i; + int sezi; + + sezi = g723_enc_fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]); + __pragma_loopbound(5, 5); + for (i = 1; i < 6; i++) /* ACCUM */ + sezi += g723_enc_fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]); + + return (sezi); +} + +/* + g723_enc_predictor_pole() + + computes the estimated signal from 2-pole predictor. + +*/ +__attribute__((always_inline)) static inline int +g723_enc_predictor_pole(struct g723_enc_state_t *state_ptr) { + return (g723_enc_fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) + + g723_enc_fmult(state_ptr->a[0] >> 2, state_ptr->sr[0])); +} + +/* + g723_enc_step_size() + + computes the quantization step size of the adaptive quantizer. + +*/ +__attribute__((always_inline)) static inline int +g723_enc_step_size(struct g723_enc_state_t *state_ptr) { + int y; + int dif; + int al; + + if (state_ptr->ap >= 256) + return (state_ptr->yu); + else { + y = state_ptr->yl >> 6; + dif = state_ptr->yu - y; + al = state_ptr->ap >> 2; + if (dif > 0) + y += (dif * al) >> 6; + else if (dif < 0) + y += (dif * al + 0x3F) >> 6; + + return (y); + } +} + +/* + g723_enc_quantize() + + Given a raw sample, 'd', of the difference signal and a + quantization step size scale factor, 'y', this routine returns the + ADPCM codeword to which that sample gets quantized. The step + size scale factor division operation is done in the log base 2 domain + as a subtraction. +*/ +int +g723_enc_quantize(int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size) /* table size of short integers */ +{ + short dqm; /* Magnitude of 'd' */ + short exp; /* Integer part of base 2 log of 'd' */ + short mant; /* Fractional part of base 2 log */ + short dl; /* Log of magnitude of 'd' */ + short dln; /* Step size scale factor normalized log */ + int i; + + /* + LOG + + Compute base 2 log of 'd', and store in 'dl'. + */ + dqm = g723_enc_abs(d); + exp = g723_enc_quan(dqm >> 1, g723_enc_power2, 15); + mant = ((dqm << 7) >> exp) & 0x7F; /* Fractional portion. */ + dl = (exp << 7) + mant; + + /* + SUBTB + + "Divide" by step size multiplier. + */ + dln = dl - (y >> 2); + + /* + QUAN + + Obtain codword i for 'd'. + */ + i = g723_enc_quan(dln, table, size); + + if (d < 0) /* take 1's complement of i */ + return ((size << 1) + 1 - i); + else if (i == 0) /* take 1's complement of 0 */ + return ((size << 1) + 1); /* new in 1988 */ + else + return (i); +} +/* + g723_enc_reconstruct() + + Returns reconstructed difference signal 'dq' obtained from + codeword 'i' and quantization step size scale factor 'y'. + Multiplication is performed in log base 2 domain as addition. +*/ +int +g723_enc_reconstruct(int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y) /* Step size multiplier */ +{ + short dql; /* Log of 'dq' magnitude */ + short dex; /* Integer part of log */ + short dqt; + short dq; /* Reconstructed difference signal sample */ + + dql = dqln + (y >> 2); /* ADDA */ + + if (dql < 0) + return ((sign) ? -0x8000 : 0); + else { /* ANTILOG */ + dex = (dql >> 7) & 15; + dqt = 128 + (dql & 127); + dq = (dqt << 7) >> (14 - dex); + return ((sign) ? (dq - 0x8000) : dq); + } +} + +/* + g723_enc_update() + + updates the state variables for each output code +*/ +void +g723_enc_update(int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + struct g723_enc_state_t *state_ptr) /* coder state pointer */ +{ + int cnt; + short mag, exp; /* Adaptive predictor, FLOAT A */ + short a2p; /* LIMC */ + short a1ul; /* UPA1 */ + short pks1; /* UPA2 */ + short fa1; + char tr; /* tone/transition detector */ + short ylint, thr2, dqthr; + short ylfrac, thr1; + short pk0; + + pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */ + + mag = dq & 0x7FFF; /* prediction difference magnitude */ + /* TRANS */ + ylint = state_ptr->yl >> 15; /* exponent part of yl */ + ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */ + thr1 = (32 + ylfrac) << ylint; /* threshold */ + thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */ + dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */ + if (state_ptr->td == 0) /* signal supposed voice */ + tr = 0; + else if (mag <= dqthr) /* supposed data, but small mag */ + tr = 0; /* treated as voice */ + else /* signal is data (modem) */ + tr = 1; + + /* + Quantizer scale factor adaptation. + */ + + /* FUNCTW & FILTD & DELAY */ + /* update non-steady state step size multiplier */ + state_ptr->yu = y + ((wi - y) >> 5); + + /* LIMB */ + if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */ + state_ptr->yu = 544; + else if (state_ptr->yu > 5120) + state_ptr->yu = 5120; + + /* FILTE & DELAY */ + /* update steady state step size multiplier */ + state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6); + + /* + Adaptive predictor coefficients. + */ + if (tr == 1) { /* reset a's and b's for modem signal */ + state_ptr->a[0] = 0; + state_ptr->a[1] = 0; + state_ptr->b[0] = 0; + state_ptr->b[1] = 0; + state_ptr->b[2] = 0; + state_ptr->b[3] = 0; + state_ptr->b[4] = 0; + state_ptr->b[5] = 0; + } else { /* update a's and b's */ + pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */ + + /* update predictor pole a[ 1 ] */ + a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7); + if (dqsez != 0) { + fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0]; + if (fa1 < -8191) /* a2p = function of fa1 */ + a2p -= 0x100; + else if (fa1 > 8191) + a2p += 0xFF; + else + a2p += fa1 >> 5; + if (pk0 ^ state_ptr->pk[1]) + /* LIMC */ + if (a2p <= -12160) + a2p = -12288; + else if (a2p >= 12416) + a2p = 12288; + else + a2p -= 0x80; + else if (a2p <= -12416) + a2p = -12288; + else if (a2p >= 12160) + a2p = 12288; + else + a2p += 0x80; + } + + /* TRIGB & DELAY */ + state_ptr->a[1] = a2p; + + /* UPA1 */ + /* update predictor pole a[ 0 ] */ + state_ptr->a[0] -= state_ptr->a[0] >> 8; + if (dqsez != 0) { + if (pks1 == 0) + state_ptr->a[0] += 192; + else + state_ptr->a[0] -= 192; + } + + /* LIMD */ + a1ul = 15360 - a2p; + if (state_ptr->a[0] < -a1ul) + state_ptr->a[0] = -a1ul; + else if (state_ptr->a[0] > a1ul) + state_ptr->a[0] = a1ul; + + /* UPB : update predictor zeros b[ 6 ] */ + __pragma_loopbound(6, 6); + for (cnt = 0; cnt < 6; cnt++) { + if (code_size == 5) /* for 40Kbps G.723 */ + state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9; + else /* for G.721 and 24Kbps G.723 */ + state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8; + if (dq & 0x7FFF) { /* XOR */ + if ((dq ^ state_ptr->dq[cnt]) >= 0) + state_ptr->b[cnt] += 128; + else + state_ptr->b[cnt] -= 128; + } + } + } + + __pragma_loopbound(5, 5); + for (cnt = 5; cnt > 0; cnt--) + state_ptr->dq[cnt] = state_ptr->dq[cnt - 1]; + /* FLOAT A : convert dq[ 0 ] to 4-bit exp, 6-bit mantissa f.p. */ + if (mag == 0) + state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20; + else { + exp = g723_enc_quan(mag, g723_enc_power2, 15); + state_ptr->dq[0] = (dq >= 0) ? (exp << 6) + ((mag << 6) >> exp) + : (exp << 6) + ((mag << 6) >> exp) - 0x400; + } + + state_ptr->sr[1] = state_ptr->sr[0]; + /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ + if (sr == 0) + state_ptr->sr[0] = 0x20; + else if (sr > 0) { + exp = g723_enc_quan(sr, g723_enc_power2, 15); + state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp); + } else if (sr > -32768) { + mag = -sr; + exp = g723_enc_quan(mag, g723_enc_power2, 15); + state_ptr->sr[0] = (exp << 6) + ((mag << 6) >> exp) - 0x400; + } else + state_ptr->sr[0] = 0xFC20; + + /* DELAY A */ + state_ptr->pk[1] = state_ptr->pk[0]; + state_ptr->pk[0] = pk0; + + /* TONE */ + if (tr == 1) /* this sample has been treated as data */ + state_ptr->td = 0; /* next one will be treated as voice */ + else if (a2p < -11776) /* small sample-to-sample correlation */ + state_ptr->td = 1; /* signal may be data */ + else /* signal is voice */ + state_ptr->td = 0; + + /* + Adaptation speed control. + */ + state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */ + state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */ + + if (tr == 1) + state_ptr->ap = 256; + else if (y < 1536) /* SUBTC */ + state_ptr->ap += (0x200 - state_ptr->ap) >> 4; + else if (state_ptr->td == 1) + state_ptr->ap += (0x200 - state_ptr->ap) >> 4; + else if (g723_enc_abs((state_ptr->dms << 2) - state_ptr->dml) >= + (state_ptr->dml >> 3)) + state_ptr->ap += (0x200 - state_ptr->ap) >> 4; + else + state_ptr->ap += (-state_ptr->ap) >> 4; +} + +/* + g723_enc_alaw2linear() - Convert an A-law value to 16-bit linear PCM + +*/ +__attribute__((always_inline)) static inline int +g723_enc_alaw2linear(unsigned char a_val) { + int t; + int seg; + + a_val ^= 0x55; + + t = (a_val & QUANT_MASK) << 4; + seg = ((unsigned) a_val & SEG_MASK) >> SEG_SHIFT; + switch (seg) { + case 0: + t += 8; + break; + case 1: + t += 0x108; + break; + default: + t += 0x108; + t <<= seg - 1; + } + return ((a_val & SIGN_BIT) ? t : -t); +} + +/* + g723_enc_ulaw2linear() - Convert a u-law value to 16-bit linear PCM + + First, a biased linear code is derived from the code word. An unbiased + output can then be obtained by subtracting 33 from the biased code. + + Note that this function expects to be passed the complement of the + original code word. This is in keeping with ISDN conventions. +*/ +__attribute__((always_inline)) static inline int +g723_enc_ulaw2linear(unsigned char u_val) { + int t; + + /* Complement to obtain normal u-law value. */ + u_val = ~u_val; + + /* + Extract and bias the quantization bits. Then + shift up by the segment number and subtract out the bias. + */ + t = ((u_val & QUANT_MASK) << 3) + BIAS; + t <<= ((unsigned int) u_val & SEG_MASK) >> SEG_SHIFT; + + return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS)); +} + +/* + g723_enc_g723_24_encoder() + + Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. + Returns -1 if invalid input coding value. +*/ +__attribute__((always_inline)) static inline int +g723_enc_g723_24_encoder(int sl, int in_coding, + struct g723_enc_state_t *state_ptr) { + short sei, sezi, se, sez; /* ACCUM */ + short d; /* SUBTA */ + short y; /* MIX */ + short sr; /* ADDB */ + short dqsez; /* ADDC */ + short dq, i; + + switch (in_coding) { /* linearize input sample to 14-bit PCM */ + case AUDIO_ENCODING_ALAW: + sl = g723_enc_alaw2linear(sl) >> 2; + break; + case AUDIO_ENCODING_ULAW: + sl = g723_enc_ulaw2linear(sl) >> 2; + break; + case AUDIO_ENCODING_LINEAR: + sl >>= 2; /* sl of 14-bit dynamic range */ + break; + default: + return (-1); + } + + sezi = g723_enc_predictor_zero(state_ptr); + sez = sezi >> 1; + sei = sezi + g723_enc_predictor_pole(state_ptr); + se = sei >> 1; /* se = estimated signal */ + + d = sl - se; /* d = estimation diff. */ + + /* quantize prediction difference d */ + y = g723_enc_step_size(state_ptr); /* quantizer step size */ + i = g723_enc_quantize(d, y, g723_enc_qtab_723_24, 3); /* i = ADPCM code */ + dq = g723_enc_reconstruct(i & 4, g723_enc_dqlntab[i], + y); /* quantized diff. */ + + sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */ + + dqsez = sr + sez - se; /* pole prediction diff. */ + + g723_enc_update(3, y, g723_enc_witab[i], g723_enc_fitab[i], dq, sr, dqsez, + state_ptr); + + return (i); +} + +/* + Pack output codes into bytes and write them to stdout. + Returns 1 if there is residual output, else returns 0. +*/ +__attribute__((always_inline)) static inline int +g723_enc_pack_output(unsigned char code, int bits) { + static unsigned int out_buffer = 0; + static int out_bits = 0; + unsigned char out_byte; + static int i = 0; + + out_buffer |= (code << out_bits); + out_bits += bits; + if (out_bits >= 8) { + out_byte = out_buffer & 0xff; + out_bits -= 8; + out_buffer >>= 8; + // fwrite(&out_byte, sizeof (char), 1, fp_out); + // fwrite(&out_byte, 1, 1, fp_out); + g723_enc_OUTPUT[i] = out_byte; + i = i + 1; + } + + return (out_bits > 0); +} + +/* + Initialization- and return-value-related functions +*/ + +/* + g723_enc_init_state() + + This routine initializes and/or resets the g72x_state structure + pointed to by 'state_ptr'. + All the initial state values are specified in the CCITT G.721 document. +*/ +__attribute__((always_inline)) static inline void +g723_enc_init_state(struct g723_enc_state_t *state_ptr) { + int cnta; + + state_ptr->yl = 34816; + state_ptr->yu = 544; + state_ptr->dms = 0; + state_ptr->dml = 0; + state_ptr->ap = 0; + + __pragma_loopbound(2, 2); + for (cnta = 0; cnta < 2; cnta++) { + state_ptr->a[cnta] = 0; + state_ptr->pk[cnta] = 0; + state_ptr->sr[cnta] = 32; + } + __pragma_loopbound(6, 6); + for (cnta = 0; cnta < 6; cnta++) { + state_ptr->b[cnta] = 0; + state_ptr->dq[cnta] = 32; + } + state_ptr->td = 0; +} + +__attribute__((always_inline)) static inline void +g723_enc_init() { + int i; + volatile int x = 0; + g723_enc_init_state(&g723_enc_state); + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + g723_enc_INPUT[i] += x; +} + +__attribute__((always_inline)) static inline int +g723_enc_return() { + int i; + int check_sum = 0; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) + check_sum += g723_enc_OUTPUT[i]; + + return (check_sum != 24284); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +g723_enc_main() { + // struct g72x_state state; + short sample_short; // mv + unsigned char code; + int resid; + int in_coding; + short *in_buf; + int enc_bits; + int i = 0; + + enc_bits = 3; + in_coding = AUDIO_ENCODING_ALAW; + in_buf = &sample_short; + + __pragma_loopbound(256, 256); + for (i = 0; i < 256; i++) { + *in_buf = g723_enc_INPUT[i]; + code = + g723_enc_g723_24_encoder(sample_short, in_coding, &g723_enc_state); + resid = g723_enc_pack_output(code, enc_bits); + } + + /* Write zero codes until all residual codes are written out */ + __pragma_loopbound(0, 0); + while (resid) + resid = g723_enc_pack_output(0, enc_bits); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + g723_enc_init(); + g723_enc_main(); + + return (g723_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/g723_enc/license.txt b/targets/wasm-tacle/sequential/g723_enc/license.txt new file mode 100755 index 0000000..80cf21f --- /dev/null +++ b/targets/wasm-tacle/sequential/g723_enc/license.txt @@ -0,0 +1,23 @@ +This source code is a product of Sun Microsystems, Inc. and is provided +for unrestricted use. Users may copy or modify this source code without +charge. + +SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING +THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR +PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + +Sun source code is provided with no support and without any obligation on +the part of Sun Microsystems, Inc. to assist in its use, correction, +modification or enhancement. + +SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE +INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE +OR ANY PART THEREOF. + +In no event will Sun Microsystems, Inc. be liable for any lost revenue +or profits or other special, indirect and consequential damages, even if +Sun has been advised of the possibility of such damages. + +Sun Microsystems, Inc. +2550 Garcia Avenue +Mountain View, California 94043 \ No newline at end of file diff --git a/targets/wasm-tacle/sequential/gsm_enc/CMakeLists.txt b/targets/wasm-tacle/sequential/gsm_enc/CMakeLists.txt new file mode 100644 index 0000000..2b97dba --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(gsm_enc) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/gsm_enc.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/gsm_enc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/gsm_enc/COPYRIGHT b/targets/wasm-tacle/sequential/gsm_enc/COPYRIGHT new file mode 100755 index 0000000..eba0e52 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/COPYRIGHT @@ -0,0 +1,16 @@ +Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, +Technische Universitaet Berlin + +Any use of this software is permitted provided that this notice is not +removed and that neither the authors nor the Technische Universitaet Berlin +are deemed to have made any representations as to the suitability of this +software for any purpose nor are held responsible for any defects of +this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + +As a matter of courtesy, the authors request to be informed about uses +this software has found, about bugs in this software, and about any +improvements that may be of general interest. + +Berlin, 28.11.1994 +Jutta Degener +Carsten Bormann diff --git a/targets/wasm-tacle/sequential/gsm_enc/ChangeLog.txt b/targets/wasm-tacle/sequential/gsm_enc/ChangeLog.txt new file mode 100755 index 0000000..4dbeeda --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/ChangeLog.txt @@ -0,0 +1,8 @@ +2017-06-28: +- Rename benchmark to gsm_enc. +- Add prefix 'gsm_enc_'. +- Introduce gsm_enc_init and gsm_enc_return functions. +- Rewrite negative shifts to avoid undefined behavior. +- Fix comparisons between signed and unsigned types. +- Remove unused variables and parameters. +- Fix memory corruption in gsm_enc_Short_term_analysis_filtering. diff --git a/targets/wasm-tacle/sequential/gsm_enc/data.h b/targets/wasm-tacle/sequential/gsm_enc/data.h new file mode 100755 index 0000000..2b954a8 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/data.h @@ -0,0 +1,452 @@ +#ifndef DATA_H +#define DATA_H + +gsm_signal gsm_enc_pcmdata[ ] = { + ( short )0x0000, ( short )0x0000, ( short )0x0010, ( short )0x0010, ( short )0x0010, ( short )0x0020, ( short )0x0020, ( short )0x0018, + ( short )0x0028, ( short )0x0020, ( short )0x0020, ( short )0x0028, ( short )0x0028, ( short )0x0020, ( short )0x0030, ( short )0x0030, + ( short )0x0028, ( short )0x0010, ( short )0x0008, ( short )0x0000, ( short )0x0050, ( short )0x0060, ( short )0x0058, ( short )0x00D0, + ( short )0x00E0, ( short )0x00D0, ( short )0x0118, ( short )0x0128, ( short )0x0118, ( short )0x0128, ( short )0x0110, ( short )0x0100, + ( short )0x00A0, ( short )0x0058, ( short )0x0048, ( short )0x0058, ( short )0x0060, ( short )0x0058, ( short )0x0050, ( short )0x0048, + ( short )0x0040, ( short )0x0030, ( short )0x0020, ( short )0x0010, ( short )0x0008, ( short )0xFFF8, ( short )0xFFE8, ( short )0xFFE0, + ( short )0xFFD8, ( short )0xFFC8, ( short )0xFFC0, ( short )0xFFC0, ( short )0xFF98, ( short )0xFF78, ( short )0xFF78, ( short )0xFFC8, + ( short )0x0000, ( short )0x0010, ( short )0x0040, ( short )0x0060, ( short )0x0068, ( short )0x0078, ( short )0x0078, ( short )0x0070, + ( short )0x00A8, ( short )0x00C8, ( short )0x00C8, ( short )0x00E0, ( short )0x00F0, ( short )0x00E8, ( short )0x00F8, ( short )0x00F8, + ( short )0x00F0, ( short )0x00E0, ( short )0x00C8, ( short )0x00B8, ( short )0x00E8, ( short )0x0100, ( short )0x00F8, ( short )0x00E8, + ( short )0x00D8, ( short )0x00C0, ( short )0x00A8, ( short )0x0020, ( short )0xFFC0, ( short )0xFFA0, ( short )0xFFA0, ( short )0xFFA8, + ( short )0xFFB0, ( short )0xFFD0, ( short )0xFFF8, ( short )0x0000, ( short )0x0020, ( short )0x0030, ( short )0x0030, ( short )0x0030, + ( short )0x0028, ( short )0x0020, ( short )0xFFF0, ( short )0xFFD0, ( short )0xFFC8, ( short )0xFFC8, ( short )0xFFD0, ( short )0xFFD8, + ( short )0xFFE8, ( short )0xFFF8, ( short )0xFFF8, ( short )0x0008, ( short )0x0018, ( short )0x0018, ( short )0x0078, ( short )0x00B8, + ( short )0x00C0, ( short )0x0100, ( short )0x0130, ( short )0x0128, ( short )0x0108, ( short )0x00D8, ( short )0x00C0, ( short )0x0078, + ( short )0x0038, ( short )0x0020, ( short )0x0020, ( short )0x0000, ( short )0xFFE0, ( short )0xFFE0, ( short )0xFFD8, ( short )0xFFC8, + ( short )0xFFC8, ( short )0xFFA0, ( short )0xFF88, ( short )0xFF98, ( short )0xFF80, ( short )0xFF70, ( short )0xFF80, ( short )0xFF78, + ( short )0xFF78, ( short )0xFF90, ( short )0xFF80, ( short )0xFF78, ( short )0xFF78, ( short )0xFF50, ( short )0xFF30, ( short )0xFF50, + ( short )0xFF38, ( short )0xFF30, ( short )0xFF40, ( short )0xFF58, ( short )0xFF70, ( short )0xFF80, ( short )0xFF50, ( short )0xFF38, + ( short )0xFF40, ( short )0xFF18, ( short )0xFF00, ( short )0xFF08, ( short )0xFF40, ( short )0xFF68, ( short )0xFF80, ( short )0xFF88, + ( short )0xFF88, ( short )0xFF88, ( short )0xFF88, ( short )0xFFB8, ( short )0xFFE0, ( short )0xFFF0, ( short )0xFFD0, ( short )0xFFB8, + ( short )0xFFB8, ( short )0xFF90, ( short )0xFF70, ( short )0xFF70, ( short )0xFF50, ( short )0xFF40, ( short )0xFF40, ( short )0xFF58, + ( short )0xFF70, ( short )0xFF80, ( short )0xFFC8, ( short )0x0000, ( short )0x0018, ( short )0x0030, ( short )0x0048, ( short )0x0048, + ( short )0x0028, ( short )0x0008, ( short )0xFFF8, ( short )0xFFD8, ( short )0xFFC8, ( short )0xFFB8, ( short )0xFF98, ( short )0xFF78, + ( short )0xFF70, ( short )0xFFF0, ( short )0x0058, ( short )0x0088, ( short )0x00B8, ( short )0x00D0, ( short )0x00D8, ( short )0x00E8, + ( short )0x0138, ( short )0x0160, ( short )0x0158, ( short )0x0170, ( short )0x0178, ( short )0x0160, ( short )0x0168, ( short )0x0160, + ( short )0x0140, ( short )0x0118, ( short )0x00F0, ( short )0x00C8, ( short )0x0098, ( short )0x0078, ( short )0x0060, ( short )0x0018, + ( short )0xFFC0, ( short )0xFF90, ( short )0xFF48, ( short )0xFF00, ( short )0xFEE8, ( short )0xFEC8, ( short )0xFEB8, ( short )0xFEB8, + ( short )0xFEA0, ( short )0xFE88, ( short )0xFE80, ( short )0xFEB8, ( short )0xFEF8, ( short )0xFF38, ( short )0xFFA0, ( short )0xFFE8, + ( short )0x0008, ( short )0x0030, ( short )0x0058, ( short )0x0068, ( short )0x0068, ( short )0x0070, ( short )0x0068, ( short )0x0050, + ( short )0x0040, ( short )0x0040, ( short )0x0020, ( short )0x0000, ( short )0xFFE8, ( short )0xFFF0, ( short )0xFFF8, ( short )0xFFF8, + ( short )0x0038, ( short )0x0068, ( short )0x0078, ( short )0x0038, ( short )0x0008, ( short )0xFFF0, ( short )0xFFE0, ( short )0xFFD8, + ( short )0xFFD8, ( short )0xFFE0, ( short )0xFFD0, ( short )0xFFC8, ( short )0x0000, ( short )0x0030, ( short )0x0048, ( short )0x0068, + ( short )0x0080, ( short )0x0088, ( short )0x0088, ( short )0x0088, ( short )0x0088, ( short )0x0088, ( short )0x0088, ( short )0x0078, + ( short )0x0098, ( short )0x00B0, ( short )0x00B8, ( short )0x0098, ( short )0x0070, ( short )0x0058, ( short )0x0060, ( short )0x0078, + ( short )0x00A8, ( short )0x00B8, ( short )0x00A8, ( short )0x00A0, ( short )0x0080, ( short )0x0068, ( short )0x0060, ( short )0x0058, + ( short )0x0048, ( short )0x0030, ( short )0x0038, ( short )0x0038, ( short )0x0030, ( short )0x0050, ( short )0x0058, ( short )0x0060, + ( short )0x0030, ( short )0x0008, ( short )0xFFF8, ( short )0xFF90, ( short )0xFF48, ( short )0xFF28, ( short )0xFF10, ( short )0xFEF8, + ( short )0xFEF0, ( short )0xFED8, ( short )0xFEB0, ( short )0xFEB0, ( short )0xFEA8, ( short )0xFEB8, ( short )0xFED8, ( short )0xFEF8, + ( short )0xFF10, ( short )0xFF20, ( short )0xFF40, ( short )0xFF58, ( short )0xFF80, ( short )0xFFA0, ( short )0xFFB8, ( short )0xFFC8, + ( short )0xFFD8, ( short )0xFFE0, ( short )0xFFF0, ( short )0x0048, ( short )0x0098, ( short )0x00B0, ( short )0x0068, ( short )0x0018, + ( short )0xFFF8, ( short )0xFFE8, ( short )0xFFF0, ( short )0xFFF8, ( short )0x0020, ( short )0x0038, ( short )0x0038, ( short )0x0050, + ( short )0x0068, ( short )0x0070, ( short )0x0068, ( short )0x0060, ( short )0x0060, ( short )0x0038, ( short )0x0020, ( short )0x0018, + ( short )0x0040, ( short )0x0060, ( short )0x0068, ( short )0x0040, ( short )0x0010, ( short )0x0000, ( short )0xFFB0, ( short )0xFF78, + ( short )0xFF70, ( short )0xFF90, ( short )0xFFA8, ( short )0xFFC8, ( short )0xFF98, ( short )0xFF50, ( short )0xFF50, ( short )0xFF50, + ( short )0xFF58, ( short )0xFF68, ( short )0xFF48, ( short )0xFF20, ( short )0xFF18, ( short )0xFF38, ( short )0xFF60, ( short )0xFF70, + ( short )0xFF80, ( short )0xFF98, ( short )0xFFA0, ( short )0xFFB8, ( short )0xFFD0, ( short )0xFFE0, ( short )0x0018, ( short )0x0048, + ( short )0x0058, ( short )0x00B0, ( short )0x00F8, ( short )0x0108, ( short )0x0118, ( short )0x0120, ( short )0x0118, ( short )0x0130, + ( short )0x0148, ( short )0x0140, ( short )0x0130, ( short )0x0120, ( short )0x0108, ( short )0x0098, ( short )0x0038, ( short )0x0018, + ( short )0xFFD0, ( short )0xFF90, ( short )0xFF80, ( short )0xFF58, ( short )0xFF38, ( short )0xFF30, ( short )0xFF48, ( short )0xFF68, + ( short )0xFF78, ( short )0xFF88, ( short )0xFFB8, ( short )0xFFD8, ( short )0xFFE8, ( short )0xFFD8, ( short )0xFFF0, ( short )0x0010, + ( short )0x0020, ( short )0x0020, ( short )0x0018, ( short )0x0028, ( short )0x0030, ( short )0x0030, ( short )0x0038, ( short )0x0060, + ( short )0x0080, ( short )0x0080, ( short )0x00B0, ( short )0x00D8, ( short )0x00D0, ( short )0x00B8, ( short )0x00A8, ( short )0x00A8, + ( short )0x00A0, ( short )0x0090, ( short )0x0078, ( short )0x0070, ( short )0x0068, ( short )0x0048, ( short )0x0018, ( short )0x0008, + ( short )0x0008, ( short )0x0000, ( short )0x0000, ( short )0xFFE8, ( short )0xFFB0, ( short )0xFF90, ( short )0xFF88, ( short )0xFF70, + ( short )0xFF60, ( short )0xFF60, ( short )0xFF90, ( short )0xFFC0, ( short )0xFFD0, ( short )0xFFD8, ( short )0xFFE0, ( short )0xFFE8, + ( short )0x0018, ( short )0x0050, ( short )0x0058, ( short )0x0030, ( short )0x0008, ( short )0x0000, ( short )0x0018, ( short )0x0038, + ( short )0x0038, ( short )0x0048, ( short )0x0050, ( short )0x0050, ( short )0x0020, ( short )0x0000, ( short )0xFFF8, ( short )0xFFB0, + ( short )0xFF70, ( short )0xFF68, ( short )0xFFB0, ( short )0xFFE8, ( short )0xFFF8, ( short )0xFFF8, ( short )0xFFF8, ( short )0xFFF0, + ( short )0x0030, ( short )0x0070, ( short )0x0090, ( short )0x0098, ( short )0x0098, ( short )0x0090, ( short )0x00A0, ( short )0x00B0, + ( short )0x00B8, ( short )0x00C0, ( short )0x00C0, ( short )0x00A8, ( short )0x0098, ( short )0x0088, ( short )0x0078, ( short )0x0050, + ( short )0x0030, ( short )0x0020, ( short )0xFFD8, ( short )0xFF98, ( short )0xFF88, ( short )0xFF50, ( short )0xFF20, ( short )0xFF18, + ( short )0xFEF8, ( short )0xFEE0, ( short )0xFEE8, ( short )0xFE70, ( short )0xFE08, ( short )0xFE00, ( short )0xFE48, ( short )0xFE98, + ( short )0xFEB8, ( short )0xFEE8, ( short )0xFF10, ( short )0xFF28, ( short )0xFF18, ( short )0xFF10, ( short )0xFF18, ( short )0xFF48, + ( short )0xFF70, ( short )0xFF88, ( short )0xFFE0, ( short )0x0028, ( short )0x0040, ( short )0x0058, ( short )0x0068, ( short )0x0070, + ( short )0x0078, ( short )0x0070, ( short )0x0068, ( short )0x0068, ( short )0x0078, ( short )0x0080, ( short )0x0080, ( short )0x0088, + ( short )0x0088, ( short )0x0080, ( short )0x0058, ( short )0x0030, ( short )0x0020, ( short )0x0018, ( short )0x0018, ( short )0x0018, + ( short )0x0050, ( short )0x0090, ( short )0x00A0, ( short )0x0080, ( short )0x0060, ( short )0x0050, ( short )0x0030, ( short )0x0018, + ( short )0x0010, ( short )0x0028, ( short )0x0038, ( short )0x0038, ( short )0x0018, ( short )0xFFF8, ( short )0xFFF0, ( short )0x0000, + ( short )0x0020, ( short )0x0020, ( short )0x0030, ( short )0x0030, ( short )0x0030, ( short )0x0040, ( short )0x0050, ( short )0x0050, + ( short )0x0050, ( short )0x0048, ( short )0x0048, ( short )0x0048, ( short )0x0048, ( short )0x0048, ( short )0x0078, ( short )0x00A0, + ( short )0x00A8, ( short )0x00C0, ( short )0x00C8, ( short )0x00C0, ( short )0x00D0, ( short )0x00E0, ( short )0x00D8, ( short )0x00E8, + ( short )0x00F0, ( short )0x00E0, ( short )0x0100, ( short )0x0118, ( short )0x0110, ( short )0x0100, ( short )0x00F0, ( short )0x00D8, + ( short )0x0090, ( short )0x0048, ( short )0x0028, ( short )0x0020, ( short )0x0020, ( short )0x0020, ( short )0x0038, ( short )0x0050, + ( short )0x0050, ( short )0x0050, ( short )0x0048, ( short )0x0040, ( short )0x0050, ( short )0x0060, ( short )0x0060, ( short )0x0040, + ( short )0xFFC0, ( short )0xFF58, ( short )0xFF40, ( short )0xFF90, ( short )0xFFE8, ( short )0x0000, ( short )0x0020, ( short )0x0030, + ( short )0x0030, ( short )0x0068, ( short )0x0098, ( short )0x00A8, ( short )0x0110, ( short )0x0168, ( short )0x0170, ( short )0x0148, + ( short )0x0118, ( short )0x00F0, ( short )0x00E8, ( short )0x00E0, ( short )0x00D0, ( short )0x0098, ( short )0x0060, ( short )0x0040, + ( short )0x0000, ( short )0xFFD8, ( short )0xFFD8, ( short )0xFFC0, ( short )0xFFB0, ( short )0xFFB0, ( short )0xFF78, ( short )0xFF30, + ( short )0xFF10, ( short )0xFEF0, ( short )0xFEE8, ( short )0xFEF0, ( short )0xFEC8, ( short )0xFED0, ( short )0xFEF8, ( short )0xFF00, + ( short )0xFF10, ( short )0xFF20, ( short )0xFF50, ( short )0xFF78, ( short )0xFF90, ( short )0xFF80, ( short )0xFF70, ( short )0xFF70, + ( short )0xFF80, ( short )0xFF98, ( short )0xFFA0, ( short )0xFFB8, ( short )0xFFD0, ( short )0xFFD8, ( short )0xFFF0, ( short )0x0000, + ( short )0x0008, ( short )0x0028, ( short )0x0048, ( short )0x0058, ( short )0x0078, ( short )0x0070, ( short )0x0058, ( short )0x0068, + ( short )0x0098, ( short )0x00B8, ( short )0x00D8, ( short )0x00F0, ( short )0x00F0, ( short )0x00E8, ( short )0x00F8, ( short )0x0100, + ( short )0x00D8, ( short )0x00D0, ( short )0x00C8, ( short )0x00E8, ( short )0x0100, ( short )0x00F0, ( short )0x00E0, ( short )0x00C8, + ( short )0x00B8, ( short )0x00A0, ( short )0x0078, ( short )0x0058, ( short )0x0038, ( short )0x0020, ( short )0x0010, ( short )0x0010, + ( short )0x0018, ( short )0x0010, ( short )0x0010, ( short )0x0010, ( short )0x0018, ( short )0x0028, ( short )0x0008, ( short )0xFFE0, + ( short )0xFFC8, ( short )0xFF80, ( short )0xFF48, ( short )0xFF38, ( short )0xFF40, ( short )0xFF48, ( short )0xFF48, ( short )0xFF70, + ( short )0xFF90, ( short )0xFFA8, ( short )0xFFB8, ( short )0xFFC0, ( short )0xFFC8, ( short )0xFFC0, ( short )0xFFC0, ( short )0xFFC0, + ( short )0xFFB0, ( short )0xFFA0, ( short )0xFFA0, ( short )0xFFA0, ( short )0xFFA8, ( short )0xFFB0, ( short )0xFF68, ( short )0xFF28, + ( short )0xFF08, ( short )0xFEF8, ( short )0xFEF8, ( short )0xFEE8, ( short )0xFEE0, ( short )0xFED8, ( short )0xFEA8, ( short )0xFE98, + ( short )0xFEA8, ( short )0xFEA8, ( short )0xFEA0, ( short )0xFEA0, ( short )0xFED0, ( short )0xFF00, ( short )0xFF30, ( short )0xFF28, + ( short )0xFF38, ( short )0xFF58, ( short )0xFF48, ( short )0xFF40, ( short )0xFF48, ( short )0xFFB0, ( short )0x0010, ( short )0x0038, + ( short )0x0028, ( short )0x0010, ( short )0x0008, ( short )0x0050, ( short )0x00A0, ( short )0x00B8, ( short )0x00A0, ( short )0x0080, + ( short )0x0070, ( short )0x0090, ( short )0x00B0, ( short )0x00B0, ( short )0x00B8, ( short )0x00B8, ( short )0x00B0, ( short )0x00C0, + ( short )0x00D0, ( short )0x00C8, ( short )0x00A0, ( short )0x0068, ( short )0x0038, ( short )0xFFF0, ( short )0xFFB0, ( short )0xFF88, + ( short )0xFF78, ( short )0xFF68, ( short )0xFF60, ( short )0xFF90, ( short )0xFFC0, ( short )0xFFE0, ( short )0x0000, ( short )0x0020, + ( short )0x0030, ( short )0x00A0, ( short )0x0110, ( short )0x0138, ( short )0x0140, ( short )0x0148, ( short )0x0148, ( short )0x0110, + ( short )0x00E8, ( short )0x00C0, ( short )0x00A0, ( short )0x0088, ( short )0x0068, ( short )0x0008, ( short )0xFFB0, ( short )0xFF88, + ( short )0xFF58, ( short )0xFF30, ( short )0xFF20, ( short )0xFEF8, ( short )0xFED8, ( short )0xFED8, ( short )0xFF00, ( short )0xFF20, + ( short )0xFF38, ( short )0xFF50, ( short )0xFF68, ( short )0xFF88, ( short )0xFFA0, ( short )0xFFB8, ( short )0x0020, ( short )0x0080, + ( short )0x00A0, ( short )0x00D8, ( short )0x0100, ( short )0x0100, ( short )0x0138, ( short )0x0168, ( short )0x0148, ( short )0x0128, + ( short )0x0120, ( short )0x00F8, ( short )0x00E8, ( short )0x00E0, ( short )0x00C0, ( short )0x00A8, ( short )0x00B0, ( short )0x0098, + ( short )0x0070, ( short )0x0048, ( short )0x0030, ( short )0xFFD0, ( short )0xFF60, ( short )0xFF48, ( short )0xFF10, ( short )0xFEA8, + ( short )0xFEA8, ( short )0xFEC0, ( short )0xFEC0, ( short )0xFEE8, ( short )0xFEB0, ( short )0xFE58, ( short )0xFE88, ( short )0xFED0, + ( short )0xFEB8, ( short )0xFE48, ( short )0xFE58, ( short )0xFEE8, ( short )0xFF28, ( short )0xFF18, ( short )0xFF60, ( short )0x00A0, + ( short )0x01A0, ( short )0x0188, ( short )0x0178, ( short )0x0208, ( short )0x0208, ( short )0x0100, ( short )0x0018, ( short )0xFFE0, + ( short )0xFEE0, ( short )0xFD68, ( short )0xFD00, ( short )0xFD60, ( short )0xFD70, ( short )0xFDA8, ( short )0xFF00, ( short )0x00A0, + ( short )0x0170, ( short )0x0210, ( short )0x02D8, ( short )0x0310, ( short )0x0218, ( short )0x00A0, ( short )0xFFA0, ( short )0xFDF0, + ( short )0xFBD8, ( short )0xFB08, ( short )0xF9C0, ( short )0xF830, ( short )0xF8D8, ( short )0xFCC0, ( short )0x0038, ( short )0x01A0, + ( short )0x0380, ( short )0x0A18, ( short )0x0F50, ( short )0x0DB0, ( short )0x0C30, ( short )0x0E18, ( short )0x0CA8, ( short )0x0570, + ( short )0xFF98, ( short )0xFE38, ( short )0xFBA0, ( short )0xF700, ( short )0xF5D0, ( short )0xF7C8, ( short )0xF9A8, ( short )0xFB48, + ( short )0xFBB0, ( short )0xFC78, ( short )0xFF00, ( short )0xFE98, ( short )0xFB20, ( short )0xFA48, ( short )0xFAC0, ( short )0xF8C8, + ( short )0xF6E0, ( short )0xF9C0, ( short )0xFE08, ( short )0xFF80, ( short )0x0428, ( short )0x0B70, ( short )0x0E18, ( short )0x0D38, + ( short )0x0D38, ( short )0x0C28, ( short )0x01D0, ( short )0xF578, ( short )0xF108, ( short )0xFB50, ( short )0x0498, ( short )0x0428, + ( short )0x0CE8, ( short )0x2190, ( short )0x29F0, ( short )0x22E0, ( short )0x1F68, ( short )0x2050, ( short )0x1810, ( short )0x0710, + ( short )0xFA98, ( short )0xF438, ( short )0xEE68, ( short )0xE950, ( short )0xEBC8, ( short )0xF538, ( short )0xFEB8, ( short )0x0240, + ( short )0x0460, ( short )0x09D0, ( short )0x0978, ( short )0xFFF8, ( short )0xF810, ( short )0xF190, ( short )0xE8D0, ( short )0xE290, + ( short )0xDF60, ( short )0xDFF0, ( short )0xE668, ( short )0xEC20, ( short )0xF138, ( short )0xFAC0, ( short )0x04F0, ( short )0x08D0, + ( short )0x08C8, ( short )0x0B18, ( short )0x09F8, ( short )0x0230, ( short )0xFA38, ( short )0xFA68, ( short )0xFC78, ( short )0xF9B8, + ( short )0xF850, ( short )0xFEA8, ( short )0x05B8, ( short )0x0690, ( short )0x02E8, ( short )0x0268, ( short )0x0498, ( short )0xFCB0, + ( short )0xF018, ( short )0xEDF8, ( short )0x0090, ( short )0x0F48, ( short )0x0C70, ( short )0x1278, ( short )0x27B8, ( short )0x2EA0, + ( short )0x21F8, ( short )0x1920, ( short )0x1918, ( short )0x1530, ( short )0x0638, ( short )0xF858, ( short )0xF720, ( short )0xF9F8, + ( short )0xF600, ( short )0xF850, ( short )0x0590, ( short )0x0EE0, ( short )0x1000, ( short )0x10D8, ( short )0x1460, ( short )0x10F8, + ( short )0x0500, ( short )0xFBC0, ( short )0xF7A8, ( short )0xF250, ( short )0xEC00, ( short )0xEB30, ( short )0xF1C8, ( short )0xF920, + ( short )0xFC90, ( short )0x0190, ( short )0x0A60, ( short )0x0E80, ( short )0x0DB0, ( short )0x0AD8, ( short )0x0690, ( short )0x0168, + ( short )0xFF20, ( short )0xFBD0, ( short )0xF6F8, ( short )0xF660, ( short )0xF680, ( short )0xF5B0, ( short )0xF7C0, ( short )0xF120, + ( short )0xEA90, ( short )0xF030, ( short )0xEC18, ( short )0xE190, ( short )0xE558, ( short )0xFF20, ( short )0x1090, ( short )0x0C50, + ( short )0x1248, ( short )0x2788, ( short )0x2AD0, ( short )0x1628, ( short )0x08F0, ( short )0x0BA8, ( short )0x0538, ( short )0xEF48, + ( short )0xE410, ( short )0xEB10, ( short )0xEF68, ( short )0xEA28, ( short )0xEC40, ( short )0xFC18, ( short )0x08A8, ( short )0x0818, + ( short )0x0778, ( short )0x0858, ( short )0x02F8, ( short )0xF8E8, ( short )0xF1F0, ( short )0xEF40, ( short )0xECD0, ( short )0xE958, + ( short )0xEA70, ( short )0xF260, ( short )0xFAF0, ( short )0xFFA0, ( short )0x04A0, ( short )0x0CF8, ( short )0x10F8, ( short )0x0EA0, + ( short )0x0D48, ( short )0x0BE8, ( short )0x05E0, ( short )0x03B0, ( short )0x0358, ( short )0xFF18, ( short )0xFB40, ( short )0xF9B0, + ( short )0xF9C0, ( short )0xF7C0, ( short )0xEE90, ( short )0xEAA0, ( short )0xEE00, ( short )0xE888, ( short )0xE200, ( short )0xEF00, + ( short )0x0948, ( short )0x1400, ( short )0x1270, ( short )0x1D88, ( short )0x2CD8, ( short )0x2488, ( short )0x0DA8, ( short )0x04B8, + ( short )0x0548, ( short )0xF7B0, ( short )0xE3F0, ( short )0xE268, ( short )0xEFF8, ( short )0xF5A0, ( short )0xF320, ( short )0xFC68, + ( short )0x0BF0, ( short )0x0FA0, ( short )0x0A50, ( short )0x01F8, ( short )0xFE60, ( short )0xFC48, ( short )0xF340, ( short )0xEB28, + ( short )0xED58, ( short )0xF3C0, ( short )0xF5B8, ( short )0xF738, ( short )0x00F8, ( short )0x0C70, ( short )0x0E90, ( short )0x0DE8, + ( short )0x1190, ( short )0x12B0, ( short )0x1058, ( short )0x0B98, ( short )0x0638, ( short )0x0868, ( short )0x0998, ( short )0x02B0, + ( short )0xFE50, ( short )0x0120, ( short )0x02A0, ( short )0xFC90, ( short )0xF810, ( short )0xF9D0, ( short )0xF818, ( short )0xF290, + ( short )0xF240, ( short )0xF6D0, ( short )0x0A48, ( short )0x1AD8, ( short )0x1840, ( short )0x1C18, ( short )0x2B18, ( short )0x29F0, + ( short )0x1608, ( short )0x08B8, ( short )0x0778, ( short )0x0128, ( short )0xF118, ( short )0xE868, ( short )0xEDA0, ( short )0xF310, + ( short )0xF248, ( short )0xF558, ( short )0x0058, ( short )0x0970, ( short )0x0688, ( short )0x0108, ( short )0xFD08, ( short )0xF988, + ( short )0xF558, ( short )0xF0A0, ( short )0xF0B0, ( short )0xF540, ( short )0xF6E8, ( short )0xFCA0, ( short )0x0758, ( short )0x0CD0, + ( short )0x0F60, ( short )0x1338, ( short )0x1458, ( short )0x1278, ( short )0x0FD0, ( short )0x0CA8, ( short )0x0D50, ( short )0x0D10, + ( short )0x0798, ( short )0x0398, ( short )0x0428, ( short )0x04F0, ( short )0x0278, ( short )0xFF98, ( short )0x0178, ( short )0x0088, + ( short )0xFB08, ( short )0xF660, ( short )0xF1A8, ( short )0xEF18, ( short )0xF9E8, ( short )0x0C00, ( short )0x11C8, ( short )0x1260, + ( short )0x1B60, ( short )0x21B0, ( short )0x18E0, ( short )0x0B08, ( short )0x04C8, ( short )0x0078, ( short )0xF730, ( short )0xEF60, + ( short )0xEB18, ( short )0xEC10, ( short )0xF290, ( short )0xF800, ( short )0xFB60, ( short )0xFF60, ( short )0x0080, ( short )0xFFA8, + ( short )0xFB08, ( short )0xF1A8, ( short )0xED10, ( short )0xEFF0, ( short )0xEED0, ( short )0xEB10, ( short )0xEFE8, ( short )0xF8F0, + ( short )0xFDE0, ( short )0x0298, ( short )0x0528, ( short )0x0598, ( short )0x0928, ( short )0x0A30, ( short )0x0670, ( short )0x08E8, + ( short )0x0BC0, ( short )0x0698, ( short )0x0210, ( short )0x0390, ( short )0x0560, ( short )0x0288, ( short )0xF910, ( short )0xF468, + ( short )0xF560, ( short )0xF3E0, ( short )0xEE10, ( short )0xE8B0, ( short )0xE508, ( short )0xEED0, ( short )0x03E0, ( short )0x0638, + ( short )0xFFA8, ( short )0x0BB8, ( short )0x2078, ( short )0x1FA8, ( short )0x0EF0, ( short )0x0648, ( short )0x05C8, ( short )0xFF18, + ( short )0xF588, ( short )0xEE20, ( short )0xED88, ( short )0xF5A0, ( short )0xFBA8, ( short )0xFBC0, ( short )0xFA98, ( short )0xFA20, + ( short )0xF7D8, ( short )0xF2D0, ( short )0xEF48, ( short )0xE998, ( short )0xE378, ( short )0xE530, ( short )0xE868, ( short )0xE890, + ( short )0xEDD0, ( short )0xF798, ( short )0xFBC0, ( short )0xFD20, ( short )0x0178, ( short )0x0490, ( short )0x04A0, ( short )0x0758, + ( short )0x0858, ( short )0x0490, ( short )0x04F8, ( short )0x0858, ( short )0x06F0, ( short )0x05F8, ( short )0x0450, ( short )0x0098, + ( short )0xFE60, ( short )0xFDA0, ( short )0xF9E0, ( short )0xF358, ( short )0xEDC0, ( short )0xF308, ( short )0xFFE0, ( short )0x0018, + ( short )0xFB80, ( short )0x0948, ( short )0x1DB8, ( short )0x1D08, ( short )0x0F88, ( short )0x0B48, ( short )0x0C50, ( short )0x09C0, + ( short )0xFF78, ( short )0xF1A0, ( short )0xEF28, ( short )0xF6B8, ( short )0xF9F0, ( short )0xF6F0, ( short )0xF688, ( short )0xF9E0, + ( short )0xF9C0, ( short )0xF4C8, ( short )0xEBD8, ( short )0xE7E8, ( short )0xEBE0, ( short )0xE8C8, ( short )0xE100, ( short )0xE518, + ( short )0xF0B8, ( short )0xF728, ( short )0xF770, ( short )0xF878, ( short )0xFF58, ( short )0x06B0, ( short )0x0430, ( short )0x0060, + ( short )0x0390, ( short )0x0A18, ( short )0x0B98, ( short )0x06C8, ( short )0x0710, ( short )0x0CF0, ( short )0x08D0, ( short )0x01F8, + ( short )0x0280, ( short )0x0238, ( short )0xFD78, ( short )0xF868, ( short )0xF198, ( short )0xF670, ( short )0x0930, ( short )0x0A78, + ( short )0xFB38, ( short )0x04F0, ( short )0x1EB8, ( short )0x1E98, ( short )0x0F68, ( short )0x0EC8, ( short )0x1548, ( short )0x1480, + ( short )0x0C60, ( short )0x00B0, ( short )0xFEF8, ( short )0x0830, ( short )0x0838, ( short )0x0160, ( short )0x0380, ( short )0x07E8, + ( short )0x0270, ( short )0xFBA0, ( short )0xF9C0, ( short )0xF450, ( short )0xEE08, ( short )0xED08, ( short )0xEE10, ( short )0xEF20, + ( short )0xF1C0, ( short )0xF800, ( short )0xFE70, ( short )0x00B0, ( short )0x02D8, ( short )0x07C8, ( short )0x09F0, ( short )0x09A8, + ( short )0x0A60, ( short )0x0B28, ( short )0x0C80, ( short )0x0D58, ( short )0x0BD0, ( short )0x0A48, ( short )0x0900, ( short )0x0768, + ( short )0x03D0, ( short )0x00E0, ( short )0xFFF8, ( short )0xFBD8, ( short )0xF5E8, ( short )0xFE18, ( short )0x0FE8, ( short )0x1060, + ( short )0x05C8, ( short )0x1078, ( short )0x2638, ( short )0x2580, ( short )0x1740, ( short )0x14E8, ( short )0x19D0, ( short )0x17D8, + ( short )0x0E10, ( short )0x0270, ( short )0x0120, ( short )0x0900, ( short )0x0870, ( short )0x0290, ( short )0x03A0, ( short )0x0600, + ( short )0x0100, ( short )0xFE28, ( short )0xFF28, ( short )0xF838, ( short )0xF0B8, ( short )0xF238, ( short )0xF530, ( short )0xF440, + ( short )0xF440, ( short )0xFA38, ( short )0x0198, ( short )0x03A8, ( short )0x03D0, ( short )0x0780, ( short )0x0AB8, ( short )0x0B58, + ( short )0x0B10, ( short )0x0AD8, ( short )0x0A08, ( short )0x0878, ( short )0x07C8, ( short )0x0648, ( short )0x01A0, ( short )0xFF48, + ( short )0xFE58, ( short )0xFA68, ( short )0xF7D0, ( short )0xF758, ( short )0xF470, ( short )0xF5B0, ( short )0x02A8, ( short )0x0A58, + ( short )0x0448, ( short )0x07C8, ( short )0x1708, ( short )0x1970, ( short )0x0EC8, ( short )0x0A40, ( short )0x0CD0, ( short )0x0D28, + ( short )0x0838, ( short )0x0010, ( short )0xFAE0, ( short )0xFCB0, ( short )0xFEB8, ( short )0xFCE8, ( short )0xFBA8, ( short )0xFD10, + ( short )0xFBC8, ( short )0xF910, ( short )0xF960, ( short )0xF830, ( short )0xF4D8, ( short )0xF500, ( short )0xF860, ( short )0xF9F0, + ( short )0xFB58, ( short )0xFE48, ( short )0x0050, ( short )0x0418, ( short )0x0910, ( short )0x0940, ( short )0x0830, ( short )0x0AC8, + ( short )0x0C88, ( short )0x0A50, ( short )0x07C0, ( short )0x0700, ( short )0x0590, ( short )0x0268, ( short )0xFFF0, ( short )0xFBA8, + ( short )0xF720, ( short )0xF698, ( short )0xF2E0, ( short )0xEB68, ( short )0xEDA0, ( short )0xFC00, ( short )0x0358, ( short )0xFF30, + ( short )0x0398, ( short )0x1220, ( short )0x1860, ( short )0x1368, ( short )0x10C0, ( short )0x12F0, ( short )0x12A0, ( short )0x0E08, + ( short )0x0780, ( short )0x0010, ( short )0xFAD8, ( short )0xF990, ( short )0xF7E0, ( short )0xF278, ( short )0xEE10, ( short )0xEB98, + ( short )0xE7A0, ( short )0xE6F8, ( short )0xEA30, ( short )0xE980, ( short )0xE420, ( short )0xE440, ( short )0xEBA8, ( short )0xEF98, + ( short )0xEF68, ( short )0xF288, ( short )0xF7A8, ( short )0xFC90, ( short )0x01F8, ( short )0x0528, ( short )0x0630, ( short )0x08E8, + ( short )0x0C98, ( short )0x0D50, ( short )0x0B98, ( short )0x0920, ( short )0x0678, ( short )0x03F0, ( short )0x0260, ( short )0xFE00, + ( short )0xF810, ( short )0xF4B8, ( short )0xF0C0, ( short )0xEB68, ( short )0xEF58, ( short )0xFAE8, ( short )0xFDE0, ( short )0xF680, + ( short )0xF910, ( short )0x06E0, ( short )0x0C20, ( short )0x05D8, ( short )0x0408, ( short )0x05C8, ( short )0x0450, ( short )0x02D0, + ( short )0x0128, ( short )0xFB78, ( short )0xF668, ( short )0xF430, ( short )0xF150, ( short )0xED90, ( short )0xE870, ( short )0xE448, + ( short )0xE2E0, ( short )0xE048, ( short )0xDDD0, ( short )0xDF08, ( short )0xE0E0, ( short )0xE098, ( short )0xE258, ( short )0xE520, + ( short )0xE6A8, ( short )0xEA28, ( short )0xEF88, ( short )0xF2A8, ( short )0xF548, ( short )0xFBA8, ( short )0x01C8, ( short )0x03F8, + ( short )0x0748, ( short )0x0C88, ( short )0x0E98, ( short )0x0DB8, ( short )0x0D98, ( short )0x0D50, ( short )0x0B68, ( short )0x0970, + ( short )0x06C0, ( short )0x0238, ( short )0xFE18, ( short )0xFB08, ( short )0xF820, ( short )0xF780, ( short )0xF970, ( short )0xF9B0, + ( short )0xF880, ( short )0xFA28, ( short )0x0028, ( short )0x0698, ( short )0x0948, ( short )0x08D0, ( short )0x09E0, ( short )0x0DD0, + ( short )0x1010, ( short )0x0D40, ( short )0x0958, ( short )0x0728, ( short )0x0308, ( short )0xFDA0, ( short )0xF9F8, ( short )0xF418, + ( short )0xEC98, ( short )0xE8B8, ( short )0xE618, ( short )0xE200, ( short )0xDED0, ( short )0xDF48, ( short )0xE100, ( short )0xE180, + ( short )0xE160, ( short )0xE3C8, ( short )0xE898, ( short )0xEDD8, ( short )0xF250, ( short )0xF558, ( short )0xFB00, ( short )0x02F8, + ( short )0x07B0, ( short )0x0B80, ( short )0x1108, ( short )0x1518, ( short )0x1660, ( short )0x1770, ( short )0x1870, ( short )0x16F8, + ( short )0x1300, ( short )0x0F78, ( short )0x0FC0, ( short )0x1070, ( short )0x0CE8, ( short )0x0AF8, ( short )0x0BD8, ( short )0x0D28, + ( short )0x10A8, ( short )0x1370, ( short )0x10A0, ( short )0x1040, ( short )0x1518, ( short )0x1740, ( short )0x1550, ( short )0x1398, + ( short )0x10E0, ( short )0x0AC8, ( short )0x0640, ( short )0x0348, ( short )0xFD18, ( short )0xF658, ( short )0xF1D8, ( short )0xEC20, + ( short )0xE760, ( short )0xE550, ( short )0xE4B8, ( short )0xE418, ( short )0xE438, ( short )0xE508, ( short )0xE738, ( short )0xEB18, + ( short )0xF0C8, ( short )0xF618, ( short )0xF988, ( short )0xFEC8, ( short )0x0518, ( short )0x09D8, ( short )0x1118, ( short )0x17F0, + ( short )0x1BB0, ( short )0x1E28, ( short )0x2120, ( short )0x23D8, ( short )0x2638, ( short )0x2418, ( short )0x2080, ( short )0x1D30, + ( short )0x1CE8, ( short )0x1D98, ( short )0x1CA8, ( short )0x1AD8, ( short )0x1960, ( short )0x17F8, ( short )0x1A40, ( short )0x1CF8, + ( short )0x1D38, ( short )0x1C30, ( short )0x1A68, ( short )0x1860, ( short )0x1480, ( short )0x1020, ( short )0x0B68, ( short )0x03E8, + ( short )0xFBA8, ( short )0xF508, ( short )0xEE40, ( short )0xE820, ( short )0xE338, ( short )0xDE88, ( short )0xDA30, ( short )0xD7D0, + ( short )0xD728, ( short )0xD7D8, ( short )0xD998, ( short )0xDC10, ( short )0xDFB0, ( short )0xE470, ( short )0xE948, ( short )0xEF98, + ( short )0xF5F0, ( short )0xFC38, ( short )0x0228, ( short )0x0798, ( short )0x0D98, ( short )0x1320, ( short )0x1760, ( short )0x1A70, + ( short )0x1BE0, ( short )0x1CC0, ( short )0x1D98, ( short )0x1A88, ( short )0x1658, ( short )0x12A0, ( short )0x1180, ( short )0x10A8, + ( short )0x0ED0, ( short )0x0CC8, ( short )0x0AD8, ( short )0x0920, ( short )0x0B70, ( short )0x0E30, ( short )0x0EE8, ( short )0x0D80, + ( short )0x0BE0, ( short )0x0AC0, ( short )0x09B8, ( short )0x0890, ( short )0x0690, ( short )0x01F8, ( short )0xFD30, ( short )0xF9F0, + ( short )0xF5B0, ( short )0xF188, ( short )0xEE38, ( short )0xE9E8, ( short )0xE5E8, ( short )0xE3E0, ( short )0xE4A0, ( short )0xE608, + ( short )0xE738, ( short )0xE858, ( short )0xE980, ( short )0xEC20, ( short )0xF030, ( short )0xF450, ( short )0xF878, ( short )0xFC68, + ( short )0xFF68, ( short )0x03C8, ( short )0x08B8, ( short )0x0D00, ( short )0x1038, ( short )0x12D8, ( short )0x1490, ( short )0x1648, + ( short )0x16B8, ( short )0x1468, ( short )0x1160, ( short )0x0FA8, ( short )0x1038, ( short )0x1058, ( short )0x0F88, ( short )0x0E50, + ( short )0x0CC8, ( short )0x0CC0, ( short )0x0FC0, ( short )0x1220, ( short )0x12A0, ( short )0x10F8, ( short )0x0F20, ( short )0x0D28, + ( short )0x0C78, ( short )0x0BB8, ( short )0x08D0, ( short )0x01C8, ( short )0xFB38, ( short )0xF660, ( short )0xF330, ( short )0xF078, + ( short )0xEC28, ( short )0xE6C8, ( short )0xE2C0, ( short )0xE050, ( short )0xDFC8, ( short )0xE038, ( short )0xE160, ( short )0xE300, + ( short )0xE568, ( short )0xE6B8, ( short )0xE9A0, ( short )0xED50, ( short )0xF238, ( short )0xF6D8, ( short )0xFB08, ( short )0xFF10, + ( short )0x02E8, ( short )0x06A0, ( short )0x0AC0, ( short )0x0DC8, ( short )0x1010, ( short )0x1168, ( short )0x1018, ( short )0x0E90, + ( short )0x0BF8, ( short )0x0B08, ( short )0x0A50, ( short )0x09F0, ( short )0x0960, ( short )0x0888, ( short )0x0808, ( short )0x09C8, + ( short )0x0BA8, ( short )0x0EE8, ( short )0x1070, ( short )0x10D0, ( short )0x0F58, ( short )0x0D60, ( short )0x0BA0, ( short )0x0A60, + ( short )0x08F0, ( short )0x0608, ( short )0xFFB0, ( short )0xF938, ( short )0xF360, ( short )0xF030, ( short )0xEE20, ( short )0xEB70, + ( short )0xE7A8, ( short )0xE410, ( short )0xE140, ( short )0xDFC8, ( short )0xDFF8, ( short )0xE1F0, ( short )0xE448, ( short )0xE6D0, + ( short )0xE780, ( short )0xE9E8, ( short )0xECF0, ( short )0xF248, ( short )0xF730, ( short )0xFBC0, ( short )0xFF80, ( short )0x0310, + ( short )0x0670, ( short )0x0A98, ( short )0x0D88, ( short )0x0FD8, ( short )0x10C0, ( short )0x0EB0, ( short )0x0C48, ( short )0x08B8, + ( short )0x0998, ( short )0x0AC0, ( short )0x0C68, ( short )0x0B78, ( short )0x09C8, ( short )0x0838, ( short )0x08F8, ( short )0x0A80, + ( short )0x0CA0, ( short )0x0E10, ( short )0x0E48, ( short )0x0D58, ( short )0x0A28, ( short )0x0750, ( short )0x04F0, ( short )0x0228, + ( short )0xFEE8, ( short )0xFA80, ( short )0xF468, ( short )0xEED0, ( short )0xEAE0, ( short )0xE8B8, ( short )0xE718, ( short )0xE5B0, + ( short )0xE4A8, ( short )0xE410, ( short )0xE480, ( short )0xE548, ( short )0xE738, ( short )0xE9B0, ( short )0xED80, ( short )0xF0B8, + ( short )0xF480, ( short )0xF7B0, ( short )0xFB70, ( short )0xFED0, ( short )0x0328, ( short )0x0720, ( short )0x0A98, ( short )0x0E00, + ( short )0x10F8, ( short )0x12E0, ( short )0x12A8, ( short )0x11B0, ( short )0x0F58, ( short )0x0F38, ( short )0x0E88, ( short )0x0F08, + ( short )0x0FC0, ( short )0x0FF0, ( short )0x10B8, ( short )0x1138, ( short )0x1198, ( short )0x13D0, ( short )0x1638, ( short )0x17E8, + ( short )0x1758, ( short )0x1628, ( short )0x1460, ( short )0x10E8, ( short )0x0CA0, ( short )0x0848, ( short )0x0280, ( short )0xFC90, + ( short )0xF700, ( short )0xF0F8, ( short )0xEB18, ( short )0xE638, ( short )0xE1B8, ( short )0xDE78, ( short )0xDC58, ( short )0xDBB8, + ( short )0xDC28, ( short )0xDDB0, ( short )0xE030, ( short )0xE330, ( short )0xE6F0, ( short )0xEC20, ( short )0xF210, ( short )0xF7C0, + ( short )0xFCE0, ( short )0x0150, ( short )0x0570, ( short )0x08F0, ( short )0x0C70, ( short )0x0F50, ( short )0x12B8, ( short )0x1560, + ( short )0x16E0, ( short )0x1630, ( short )0x14E8, ( short )0x1298, ( short )0x11B8, ( short )0x1170, ( short )0x11B8, ( short )0x11C0, + ( short )0x0FE8, ( short )0x0E58, ( short )0x0CB8, ( short )0x0C50, ( short )0x0D68, ( short )0x0E98, ( short )0x0E30, ( short )0x0C28, + ( short )0x0A10, ( short )0x06D8, ( short )0x02E0, ( short )0xFEA0, ( short )0xFA18, ( short )0xF4E8, ( short )0xF018, ( short )0xEB68, + ( short )0xE6E8, ( short )0xE310, ( short )0xDFC8, ( short )0xDD38, ( short )0xDBF8, ( short )0xDC38, ( short )0xDDD0, ( short )0xE070, + ( short )0xE390, ( short )0xE760, ( short )0xEB88, ( short )0xEF20, ( short )0xF378, ( short )0xF830, ( short )0xFCE0, ( short )0x00F8, + ( short )0x0480, ( short )0x0768, ( short )0x0968, ( short )0x0AE0, ( short )0x0BB8, ( short )0x0C10, ( short )0x0BB0, ( short )0x0A78, + ( short )0x08E0, ( short )0x06E8, ( short )0x0540, ( short )0x0870, ( short )0x0BE0, ( short )0x0ED0, ( short )0x0E40, ( short )0x0D10, + ( short )0x0CC8, ( short )0x0E28, ( short )0x0FA0, ( short )0x0FB0, ( short )0x0F18, ( short )0x0DD0, ( short )0x0BC8, ( short )0x08E8, + ( short )0x0628, ( short )0x0300, ( short )0xFF18, ( short )0xFB40, ( short )0xF780, ( short )0xF388, ( short )0xF028, ( short )0xED80, + ( short )0xEB18, ( short )0xE968, ( short )0xE8C0, ( short )0xE738, ( short )0xE658, ( short )0xE698, ( short )0xE888, ( short )0xEB38, + ( short )0xEDA0, ( short )0xF178, ( short )0xF5B8, ( short )0xFA28, ( short )0xFEA8, ( short )0x0300, ( short )0x06C8, ( short )0x0960, + ( short )0x0B70, ( short )0x0CE0, ( short )0x0D70, ( short )0x0D50, ( short )0x0C60, ( short )0x0890, ( short )0x0418, ( short )0x0028, + ( short )0x01D0, ( short )0x03F8, ( short )0x05A8, ( short )0x0700, ( short )0x0808, ( short )0x09A0, ( short )0x0B18, ( short )0x0CC8, + ( short )0x0D90, ( short )0x0E68, ( short )0x0EC0, ( short )0x0E30, ( short )0x0C28, ( short )0x09D8, ( short )0x0730, ( short )0x0308, + ( short )0xFED8, ( short )0xFAC0, ( short )0xF598, ( short )0xF0D8, ( short )0xECE0, ( short )0xEAA8, ( short )0xE948, ( short )0xE8D0, + ( short )0xE850, ( short )0xE888, ( short )0xE910, ( short )0xEAD0, ( short )0xED68, ( short )0xF018, ( short )0xF350, ( short )0xF6B8, + ( short )0xFAE0, ( short )0xFF00, ( short )0x02D8, ( short )0x05E8, ( short )0x0830, ( short )0x09F8, ( short )0x0B08, ( short )0x0B80, + ( short )0x0B60, ( short )0x0988, ( short )0x0648, ( short )0x02D0, ( short )0x0150, ( short )0x01E8, ( short )0x0270, ( short )0x03E0, + ( short )0x0538, ( short )0x0658, ( short )0x0918, ( short )0x0C00, ( short )0x0E88, ( short )0x10B8, ( short )0x12A0, ( short )0x13E0, + ( short )0x1488, ( short )0x1448, ( short )0x1368, ( short )0x1120, ( short )0x0DD0, ( short )0x0A40, ( short )0x0608, ( short )0x0148, + ( short )0xFC80, ( short )0xF860, ( short )0xF4D8, ( short )0xF1C0, ( short )0xF008, ( short )0xEF38, ( short )0xEE78, ( short )0xEE98, + ( short )0xEF90, ( short )0xF170, ( short )0xF390, ( short )0xF5C0, ( short )0xF888, ( short )0xFB48, ( short )0xFDF0, ( short )0x0078, + ( short )0x03D0, ( short )0x06C8, ( short )0x08F8, ( short )0x0AA0, ( short )0x0BC8, ( short )0x0C48, ( short )0x0B30, ( short )0x0978, + ( short )0x06A8, ( short )0x0530, ( short )0x03F0, ( short )0x0438, ( short )0x03C0, ( short )0x0350, ( short )0x0360, ( short )0x04E8, + ( short )0x0698, ( short )0x07D0, ( short )0x08D0, ( short )0x0998, ( short )0x0A70, ( short )0x0B48, ( short )0x0B70, ( short )0x0AD0, + ( short )0x09C0, ( short )0x0890, ( short )0x0730, ( short )0x0588, ( short )0x0358, ( short )0x0140, ( short )0xFF58, ( short )0xFD40, + ( short )0xFB68, ( short )0xF9E8, ( short )0xF828, ( short )0xF6D0, ( short )0xF608, ( short )0xF5D8, ( short )0xF610, ( short )0xF668, + ( short )0xF778, ( short )0xF8E8, ( short )0xFA48, ( short )0xFCC8, ( short )0xFF50, ( short )0x01C8, ( short )0x0428, ( short )0x0640, + ( short )0x07D0, ( short )0x09D0, ( short )0x0B40, ( short )0x0BF8, ( short )0x0C30, ( short )0x0C08, ( short )0x0B08, ( short )0x0988, + ( short )0x07C0, ( short )0x0670, ( short )0x0608, ( short )0x0590, ( short )0x0588, ( short )0x05B0, ( short )0x05E0, ( short )0x06B8, + ( short )0x0748, ( short )0x0758, ( short )0x0700, ( short )0x06A8, ( short )0x0620, ( short )0x05D8, ( short )0x0590, ( short )0x0528, + ( short )0x03A8, ( short )0x0240, ( short )0x0108, ( short )0xFF38, ( short )0xFD50, ( short )0xFBA0, ( short )0xFA38, ( short )0xF920, + ( short )0xF860, ( short )0xF6E8, ( short )0xF640, ( short )0xF628, ( short )0xF680, ( short )0xF720, ( short )0xF800, ( short )0xF8E0, + ( short )0xF9A0, ( short )0xFA78, ( short )0xFB88, ( short )0xFD20, ( short )0xFEA0, ( short )0x0008, ( short )0x0110, ( short )0x0200, + ( short )0x0360, ( short )0x04E0, ( short )0x0608, ( short )0x0738, ( short )0x0838, ( short )0x08D8, ( short )0x0828, ( short )0x0738, + ( short )0x0600, ( short )0x04A8, ( short )0x02E0, ( short )0x0130, ( short )0xFFA0, ( short )0xFF48, ( short )0xFF10, ( short )0xFEF0, + ( short )0xFF30, ( short )0xFFD0, ( short )0x0090, ( short )0x0090, ( short )0x0070, ( short )0x0060, ( short )0xFFE8, ( short )0xFF50, + ( short )0xFEB8, ( short )0xFE98, ( short )0xFE88, ( short )0xFE80, ( short )0xFE58, ( short )0xFE50, ( short )0xFE58, ( short )0xFDB0, + ( short )0xFD08, ( short )0xFC80, ( short )0xFAF8, ( short )0xF988, ( short )0xF860, ( short )0xF798, ( short )0xF720, ( short )0xF6E8, + ( short )0xF728, ( short )0xF7C0, ( short )0xF8A8, ( short )0xF8F8, ( short )0xF960, ( short )0xFA18, ( short )0xFAC0, ( short )0xFB58, + ( short )0xFC18, ( short )0xFCE0, ( short )0xFDA0, ( short )0xFE20, ( short )0xFE88, ( short )0xFEF8, ( short )0xFEF0, ( short )0xFEC8, + ( short )0xFEA8, ( short )0xFDE0, ( short )0xFD10, ( short )0xFC70, ( short )0xFBA8, ( short )0xFB10, ( short )0xFAB8, ( short )0xFAA0, + ( short )0xFAD0, ( short )0xFB18, ( short )0xFA90, ( short )0xFA18, ( short )0xFA10, ( short )0xFA80, ( short )0xFB10, ( short )0xFB88, + ( short )0xFC90, ( short )0xFDB8, ( short )0xFEB8, ( short )0xFF80, ( short )0x0058, ( short )0x0138, ( short )0x0118, ( short )0x00C8, + ( short )0x00C0, ( short )0xFF98, ( short )0xFE30, ( short )0xFD38, ( short )0xFC68, ( short )0xFB78, ( short )0xFAB8, ( short )0xFAE8, + ( short )0xFB78, ( short )0xFBD0, ( short )0xFBE8, ( short )0xFC18, ( short )0xFC98, ( short )0xFD28, ( short )0xFD48, ( short )0xFD68, + ( short )0xFD68, ( short )0xFD90, ( short )0xFDB8, ( short )0xFD90, ( short )0xFD68, ( short )0xFD78, ( short )0xFCA0, ( short )0xFB70, + ( short )0xFAD0, ( short )0xF9F0, ( short )0xF870, ( short )0xF748, ( short )0xF748, ( short )0xF770, ( short )0xF748, ( short )0xF720, + ( short )0xF7A8, ( short )0xF878, ( short )0xF930, ( short )0xF998, ( short )0xFA38, ( short )0xFC10, ( short )0xFDA0, ( short )0xFE70, + ( short )0x0030, ( short )0x0248, ( short )0x03A0, ( short )0x0568, ( short )0x0738, ( short )0x0870, ( short )0x0960, ( short )0x0A10, + ( short )0x0A40, ( short )0x0A28, ( short )0x09B8, ( short )0x08E8, ( short )0x07E8, ( short )0x06E0, ( short )0x0588, ( short )0x0430, + ( short )0x0300, ( short )0x0260, ( short )0x01D0, ( short )0x0118, ( short )0xFFB0, ( short )0xFE98, ( short )0xFE18, ( short )0xFDA0, + ( short )0xFD08, ( short )0xFCB8, ( short )0xFCF8, ( short )0xFD60, ( short )0xFD90, ( short )0xFD90, ( short )0xFDD8, ( short )0xFE50, + ( short )0xFDA0, ( short )0xFCE0, ( short )0xFCC0, ( short )0xFCE8, ( short )0xFCB0, ( short )0xFC60, ( short )0xFC70, ( short )0xFCB8, + ( short )0xFCE0, ( short )0xFD40, ( short )0xFDD8, ( short )0xFE68, ( short )0xFF78, ( short )0x0068, ( short )0x0108, ( short )0x0278, + ( short )0x03A0, ( short )0x0420, ( short )0x0590, ( short )0x0708, ( short )0x07B8, ( short )0x07D8, ( short )0x0808, ( short )0x0838, + ( short )0x07D8, ( short )0x06E8, ( short )0x0600, ( short )0x05B0, ( short )0x0518, ( short )0x0410, ( short )0x02A0, ( short )0x0198, + ( short )0x00D0, ( short )0x00C8, ( short )0x00B0, ( short )0x0068, ( short )0x00C0, ( short )0x0150, ( short )0x0180, ( short )0x0220, + ( short )0x02D8, ( short )0x0340, ( short )0x0360, ( short )0x0380, ( short )0x0380, ( short )0x0338, ( short )0x02C8, ( short )0x02B8, + ( short )0x0280, ( short )0x0200, ( short )0x0100, ( short )0x0098, ( short )0x0080, ( short )0x0020, ( short )0xFFF0, ( short )0x0000, + ( short )0x0020, ( short )0x0098, ( short )0x0120, ( short )0x0170, ( short )0x0230, ( short )0x02F0, ( short )0x0350, ( short )0x0480, + ( short )0x05B8, ( short )0x0650, ( short )0x06A8, ( short )0x0738, ( short )0x0798, ( short )0x07B0, ( short )0x07C0, ( short )0x0798, + ( short )0x0668, ( short )0x0598, ( short )0x0530, ( short )0x04C8, ( short )0x0410, ( short )0x0350, ( short )0x0278, ( short )0x01D8, + ( short )0x0148, ( short )0x0080, ( short )0x0000, ( short )0xFFC0, ( short )0xFFD8, ( short )0xFFA8, ( short )0xFF60, ( short )0xFF80, + ( short )0x0018, ( short )0x0070, ( short )0xFFE0, ( short )0xFF88, ( short )0xFFC0, ( short )0xFF38, ( short )0xFE98, ( short )0xFE50, + ( short )0xFE10, ( short )0xFDD8, ( short )0xFD90, ( short )0xFD30, ( short )0xFDB8, ( short )0xFE68, ( short )0xFE70, ( short )0xFE60, + ( short )0xFE70, ( short )0xFED0, ( short )0xFF90, ( short )0xFFE0, ( short )0xFFF0, ( short )0x00A8, ( short )0x0168, ( short )0x01D0, + ( short )0x01F8, ( short )0x0210, ( short )0x0278, ( short )0x0268, ( short )0x0208, ( short )0x0220, ( short )0x01F8, ( short )0x0198, + ( short )0x0158, ( short )0x0100, ( short )0x00C0, ( short )0x00A0, ( short )0x0018, ( short )0xFF98, ( short )0xFF28, ( short )0xFEC0, + ( short )0xFE80, ( short )0xFE60, ( short )0xFD88, ( short )0xFCF0, ( short )0xFCC8, ( short )0xFC70, ( short )0xFC10, ( short )0xFBC8, + ( short )0xFBB0, ( short )0xFBE8, ( short )0xFBE8, ( short )0xFB80, ( short )0xFB88, ( short )0xFB40, ( short )0xFB18, ( short )0xFB20, + ( short )0xFAB8, ( short )0xFA50, ( short )0xFA50, ( short )0xFAB8, ( short )0xFAF8, ( short )0xFB18, ( short )0xFBB0, ( short )0xFC88, + ( short )0xFD10, ( short )0xFD40, ( short )0xFD98, ( short )0xFE38, ( short )0xFEE0, ( short )0xFEF8, ( short )0xFEF0, ( short )0xFF18, + ( short )0xFF18, ( short )0xFF18, ( short )0xFF68, ( short )0xFF98, ( short )0xFF98, ( short )0xFFD0, ( short )0xFFF8, ( short )0x0048, + ( short )0x0038, ( short )0x0008, ( short )0x0008, ( short )0xFFE0, ( short )0xFFB0, ( short )0xFFB8, ( short )0xFED0, ( short )0xFE18, + ( short )0xFE18, ( short )0xFDF0, ( short )0xFE38, ( short )0xFE90, ( short )0xFE90, ( short )0xFDA8, ( short )0xFD48, ( short )0xFD70, + ( short )0xFD68, ( short )0xFD00, ( short )0xFCB8, ( short )0xFCB8, ( short )0xFCF8, ( short )0xFD00, ( short )0xFC30, ( short )0xFBD0, + ( short )0xFC10, ( short )0xFC20, ( short )0xFBE0, ( short )0xFBA8, ( short )0xFC30, ( short )0xFD00, ( short )0xFD50, ( short )0xFD90, + ( short )0xFE10, ( short )0xFEA8, ( short )0xFF40, ( short )0xFFA0, ( short )0xFFD0, ( short )0xFFC8, ( short )0xFFC8, ( short )0xFFD8, + ( short )0xFFA0, ( short )0xFF98, ( short )0xFFB8, ( short )0x0050, ( short )0x00B8, ( short )0x00B0, ( short )0x01B0, ( short )0x02E0, + ( short )0x0318, ( short )0x0330, ( short )0x02E0, ( short )0x02C8, ( short )0x0278, ( short )0x0150, ( short )0x0050, ( short )0xFFC0, + ( short )0xFF88, ( short )0xFF18, ( short )0xFE90, ( short )0xFE40, ( short )0xFE30, ( short )0xFDE8, ( short )0xFDD0, ( short )0xFD70, + ( short )0xFD48, ( short )0xFD10, ( short )0xFC98, ( short )0xFC38, ( short )0xFC38, ( short )0xFC78, ( short )0xFC98, ( short )0xFCF0, + ( short )0xFDA8, ( short )0xFE48, ( short )0xFEC8, ( short )0xFF30, ( short )0xFF98, ( short )0x0000, ( short )0x0050, ( short )0x0058, + ( short )0x00A8, ( short )0x00E8, ( short )0x00D0, ( short )0x0138, ( short )0x01E0, ( short )0x0218, ( short )0x0208, ( short )0x0230, + ( short )0x0258, ( short )0x0248, ( short )0x02B0, ( short )0x0318, ( short )0x0330, ( short )0x0358, ( short )0x0380, ( short )0x0378, + ( short )0x0408, ( short )0x0480, ( short )0x0460, ( short )0x03C8, ( short )0x0318, ( short )0x02B0, ( short )0x01E8, ( short )0x00B8, + ( short )0xFFD8, ( short )0xFF30, ( short )0xFEC8, ( short )0xFE60, ( short )0xFE60, ( short )0xFE78, ( short )0xFE78, ( short )0xFDC0, + ( short )0xFD70, ( short )0xFD50, ( short )0xFD08, ( short )0xFC88, ( short )0xFC28, ( short )0xFC98, ( short )0xFD18, ( short )0xFD60, + ( short )0xFD60, ( short )0xFDD8, ( short )0xFE90, ( short )0xFEE8, ( short )0xFF10, ( short )0xFF58, ( short )0xFF90, ( short )0xFFB8, + ( short )0xFFE0, ( short )0xFFF0, ( short )0xFFF0, ( short )0x00D0, ( short )0x0190, ( short )0x01C8, ( short )0x0180, ( short )0x0188, + ( short )0x01B0, ( short )0x0238, ( short )0x0298, ( short )0x02B8, ( short )0x0268, ( short )0x0258, ( short )0x0258, ( short )0x0230, + ( short )0x0228, ( short )0x0230, ( short )0x0258, ( short )0x0248, ( short )0x01F8, ( short )0x0150, ( short )0x00C8, ( short )0x0058, + ( short )0x0058, ( short )0x0038, ( short )0x0000, ( short )0xFF50, ( short )0xFF00, ( short )0xFEF8, ( short )0xFE80, ( short )0xFDB8, + ( short )0xFD70, ( short )0xFD00, ( short )0xFC90, ( short )0xFC40, ( short )0xFC28, ( short )0xFC58, ( short )0xFC98, ( short )0xFD10, + ( short )0xFD78, ( short )0xFDE0, ( short )0xFE80, ( short )0xFF08, ( short )0xFF60, ( short )0xFFD0, ( short )0x0030, ( short )0x0068, + ( short )0x0110, ( short )0x0198, ( short )0x01C0, ( short )0x0208, ( short )0x0260, ( short )0x0280, ( short )0x0320, ( short )0x0390, + ( short )0x0398, ( short )0x0410, ( short )0x0488, ( short )0x04A0, ( short )0x0448, ( short )0x0408, ( short )0x03E0, ( short )0x03C8, + ( short )0x0398, ( short )0x0350, ( short )0x0308, ( short )0x02C8, ( short )0x0278, ( short )0x01D8, ( short )0x0148, ( short )0x00E8, + ( short )0x0040, ( short )0xFFA0, ( short )0xFF50, ( short )0xFDC0, ( short )0xFC88, ( short )0xFC30, ( short )0xFB88, ( short )0xFAA8, + ( short )0xFA50, ( short )0xFA30, ( short )0xFA40, ( short )0xFA70, ( short )0xFAB8, ( short )0xFAE0, ( short )0xFB28, ( short )0xFB58, + ( short )0xFB80, ( short )0xFBB0, ( short )0xFC00, ( short )0xFC80, ( short )0xFCF0, ( short )0xFDB8, ( short )0xFE58, ( short )0xFED8, + ( short )0x0008, ( short )0x0100, ( short )0x0180, ( short )0x01D0, ( short )0x0210, ( short )0x0248, ( short )0x0238, ( short )0x0200, + ( short )0x01D0, ( short )0x02D0, ( short )0x03A0, ( short )0x03D8, ( short )0x03C0, ( short )0x03D8, ( short )0x03F8, ( short )0x0370, + ( short )0x02C0, ( short )0x0258, ( short )0x01B8, ( short )0x0120, ( short )0x0090, ( short )0x0088, ( short )0x00A8, ( short )0x00A8, + ( short )0x0088, ( short )0x0068, ( short )0x0060, ( short )0xFFE0, ( short )0xFF00, ( short )0xFE50, ( short )0xFDC8, ( short )0xFCF0, + ( short )0xFC30, ( short )0xFBB0, ( short )0xFBD8, ( short )0xFC20, ( short )0xFC58, ( short )0xFC30, ( short )0xFC40, ( short )0xFC78, + ( short )0xFCC0, ( short )0xFCE8, ( short )0xFD10, ( short )0xFD48, ( short )0xFD88, ( short )0xFDE8, ( short )0xFF10, ( short )0x0020, + ( short )0x0110, ( short )0x01B8, ( short )0x0248, ( short )0x02C0, ( short )0x0358, ( short )0x03B8, ( short )0x03C8, ( short )0x0320, + ( short )0x0288, ( short )0x0280, ( short )0x0300, ( short )0x0340, ( short )0x0320, ( short )0x0380, ( short )0x03F8, ( short )0x0418, + ( short )0x0378, ( short )0x02E0, ( short )0x0288, ( short )0x0280, ( short )0x0238, ( short )0x01D0, ( short )0x0168, ( short )0x0138, + ( short )0x0110, ( short )0x0140, ( short )0x0148, ( short )0x0150, ( short )0x00A8, ( short )0x0010, ( short )0xFFB0, ( short )0xFEB8, + ( short )0xFDE0, ( short )0xFD48, ( short )0xFCE8, ( short )0xFCA8, ( short )0xFC78, ( short )0xFC48, ( short )0xFC50, ( short )0xFC70, + ( short )0xFCA8, ( short )0xFCE8, ( short )0xFD28, ( short )0xFDD0, ( short )0xFE70, ( short )0xFED8, ( short )0x0040, ( short )0x0188, + ( short )0x0258, ( short )0x03C0, ( short )0x04F0, ( short )0x05B8, ( short )0x0638, ( short )0x0670, ( short )0x0690, ( short )0x0708, + ( short )0x0708, ( short )0x06B8, ( short )0x0660, ( short )0x0650, ( short )0x0630, ( short )0x05C8, ( short )0x0578, ( short )0x0548, + ( short )0x0508, ( short )0x0470, ( short )0x03D0, ( short )0x0350, ( short )0x0278, ( short )0x01A0, ( short )0x00F8, ( short )0x00B0, + ( short )0x0078, ( short )0x0030, ( short )0xFFE8, ( short )0xFFC8, ( short )0xFFB8, ( short )0xFED0, ( short )0xFE08, ( short )0xFD98, + ( short )0xFC70, ( short )0xFB60, ( short )0xFAA8, ( short )0xFA10, ( short )0xF9B8, ( short )0xF980, ( short )0xF9A0, ( short )0xFA00, + ( short )0xFA68, ( short )0xFB90, ( short )0xFCB8, ( short )0xFD98, ( short )0xFE68, ( short )0xFF18, ( short )0xFFC0, ( short )0x0078, + ( short )0x00F8, ( short )0x0218, ( short )0x0320, ( short )0x03C0, ( short )0x0478, ( short )0x0510, ( short )0x0570, ( short )0x05D8, + ( short )0x05E0, ( short )0x05B8, ( short )0x0508, ( short )0x0468, ( short )0x03E0, ( short )0x02F0, ( short )0x0218, ( short )0x0168, + ( short )0x00F0, ( short )0x0060, ( short )0xFFD0, ( short )0xFF58, ( short )0xFEC0, ( short )0xFE48, ( short )0xFDB0, ( short )0xFD58, + ( short )0xFD38, ( short )0xFCD8, ( short )0xFC80, ( short )0xFC50, ( short )0xFC08, ( short )0xFB48, ( short )0xFA98, ( short )0xF9F8, + ( short )0xF8F8, ( short )0xF810, ( short )0xF7F8, ( short )0xF818, ( short )0xF848, ( short )0xF8E8, ( short )0xF9E0, ( short )0xFB08, + ( short )0xFC38, ( short )0xFD10, ( short )0xFDE8, ( short )0xFF10, ( short )0xFFD0, ( short )0x0048, ( short )0x00E0, ( short )0x0160, + ( short )0x01B8, ( short )0x01C8, ( short )0x01E0, ( short )0x0200, ( short )0x0228, ( short )0x0240, ( short )0x0240, ( short )0x0240, + ( short )0x0260, ( short )0x0280, ( short )0x0280, ( short )0x02F0, ( short )0x0370, ( short )0x03C8, ( short )0x03C8, ( short )0x03A8, + ( short )0x03A0, ( short )0x02F8, ( short )0x0220, ( short )0x0150, ( short )0x0098, ( short )0xFFE0, ( short )0xFF20, ( short )0xFEA0, + ( short )0xFE50, ( short )0xFE18, ( short )0xFD38, ( short )0xFC60, ( short )0xFBE0, ( short )0xFAC8, ( short )0xF9A0, ( short )0xF8B8, + ( short )0xF830, ( short )0xF888, ( short )0xF8B8, ( short )0xF908, ( short )0xFA80, ( short )0xFBF8, ( short )0xFD48, ( short )0xFEC8, + ( short )0x0040, ( short )0x01B0, ( short )0x0298, ( short )0x0338, ( short )0x03C0, ( short )0x0470, ( short )0x0520, ( short )0x0588, + ( short )0x0610, ( short )0x0688, ( short )0x06C8, ( short )0x0670, ( short )0x05E8, ( short )0x0578, ( short )0x0580, ( short )0x0578, + ( short )0x0528, ( short )0x0498, ( short )0x0408, ( short )0x0390, ( short )0x03F8, ( short )0x0458, ( short )0x0488, ( short )0x0468, + ( short )0x0450, ( short )0x0458, ( short )0x03A8, ( short )0x02D0, ( short )0x0210, ( short )0x0158, ( short )0x0088, ( short )0xFFA8, + ( short )0xFF00, ( short )0xFE88, ( short )0xFE30, ( short )0xFD88, ( short )0xFCB8, ( short )0xFC28, ( short )0xFB30, ( short )0xF9F0, + ( short )0xF8E8, ( short )0xF890, ( short )0xF890, ( short )0xF8C0, ( short )0xF978, ( short )0xFA78, ( short )0xFBE8, ( short )0xFD20, + ( short )0xFE28, ( short )0xFF60, ( short )0x00D8, ( short )0x0220, ( short )0x02F8, ( short )0x0378, ( short )0x03E0, ( short )0x0438, + ( short )0x0488, ( short )0x0498, ( short )0x04A8, ( short )0x0480, ( short )0x0440, ( short )0x03C0, ( short )0x02D8, ( short )0x01E8, + ( short )0x0140, ( short )0x00D8, ( short )0x0068, ( short )0xFFE0, ( short )0x0068, ( short )0x0130, ( short )0x0228, ( short )0x0260, + ( short )0x0278, ( short )0x02D0, ( short )0x02D8, ( short )0x0290, ( short )0x01E0, ( short )0x00D0, ( short )0xFFE0, ( short )0xFEF8, + ( short )0xFE08, ( short )0xFD28, ( short )0xFC88, ( short )0xFBE0, ( short )0xFB60, ( short )0xFAD8, ( short )0xFA08, ( short )0xF978, + ( short )0xF8E8, ( short )0xF8B0, ( short )0xF8B0, ( short )0xF8D0, ( short )0xF9D0, ( short )0xFAF8, ( short )0xFC18, ( short )0xFDB0, + ( short )0xFF38, ( short )0x00A0, ( short )0x01F8, ( short )0x02F8, ( short )0x03C0, ( short )0x0460, ( short )0x04B8, ( short )0x04C8, + ( short )0x04C8, ( short )0x04C0, ( short )0x0498, ( short )0x0490, ( short )0x0478, ( short )0x0448, ( short )0x0420, ( short )0x03F8, + ( short )0x0328, ( short )0x0238, ( short )0x01B0, ( short )0x0170, ( short )0x0128, ( short )0x0090, ( short )0x00E8, ( short )0x01B8, + ( short )0x02B8, ( short )0x0280, ( short )0x0218, ( short )0x0218, ( short )0x01F0, ( short )0x0148, ( short )0x0000, ( short )0xFEC0, + ( short )0xFE08, ( short )0xFD70, ( short )0xFCA0, ( short )0xFBF0, ( short )0xFBC0, ( short )0xFBA0, ( short )0xFB80, ( short )0xFB18, + ( short )0xFB28, ( short )0xFB98, ( short )0xFBC0, ( short )0xFBD0, ( short )0xFC08, ( short )0xFC78, ( short )0xFDC8, ( short )0xFEC8, + ( short )0xFF78, ( short )0x00D0, ( short )0x0238, ( short )0x0360, ( short )0x0398, ( short )0x0360, ( short )0x0368, ( short )0x0380, + ( short )0x0318, ( short )0x0250, ( short )0x0208, ( short )0x0220, ( short )0x0218, ( short )0x01F0, ( short )0x01C8, ( short )0x0210, + ( short )0x0270, ( short )0x0270, ( short )0x0240, ( short )0x0290, ( short )0x0310, ( short )0x0360, ( short )0x0340, ( short )0x0310, + ( short )0x0318, ( short )0x0320, ( short )0x02D8, ( short )0x0240, ( short )0x0158, ( short )0x00A0, ( short )0x0008, ( short )0xFF30, + ( short )0xFE50, ( short )0xFDA8, ( short )0xFD28, ( short )0xFCC8, ( short )0xFC60, ( short )0xFBA8, ( short )0xFB40, ( short )0xFB10, + ( short )0xFB18, ( short )0xFB28, ( short )0xFB48, ( short )0xFB68, ( short )0xFBA8, ( short )0xFBF8, ( short )0xFCB8, ( short )0xFD78, + ( short )0xFE00, ( short )0xFE88, ( short )0xFF30, ( short )0xFF98, ( short )0xFFC8, ( short )0xFFE8, ( short )0x0050, ( short )0x00B0, + ( short )0x00E0, ( short )0x0040, ( short )0xFF68, ( short )0xFED8, ( short )0xFEE8, ( short )0xFEE0, ( short )0xFE90, ( short )0xFEA8, + ( short )0xFF88, ( short )0x0080, ( short )0x0188, ( short )0x0208, ( short )0x0290, ( short )0x0390, ( short )0x0438, ( short )0x0450, + ( short )0x0428, ( short )0x03F8, ( short )0x03E0, ( short )0x0388, ( short )0x02E0, ( short )0x0240, ( short )0x0190, ( short )0x00D0, + ( short )0x0000, ( short )0x0000, ( short )0x0018, ( short )0x00FF, ( short )0x0068, ( short )0x00FE, ( short )0x00F8, ( short )0x00FD +}; + +gsm_byte gsm_enc_gsmdata[ ] = { + 0xD5, 0x1F, 0x74, 0x21, 0xA0, 0x50, 0x40, 0xC9, 0x24, 0x7B, 0xFA, 0x6B, 0x52, 0xE0, 0xB6, 0xD6, + 0x8E, 0xB9, 0x2B, 0xAE, 0xE0, 0x8B, 0x23, 0x52, 0x3B, 0x13, 0x86, 0xE0, 0x14, 0x4A, 0x41, 0x44, + 0x32, 0xD3, 0xA1, 0x83, 0xA1, 0x1D, 0xA6, 0x80, 0xBA, 0xD2, 0x96, 0x26, 0xFB, 0x84, 0x80, 0x6D, + 0x9C, 0x25, 0x1D, 0x9B, 0xAA, 0xC0, 0xBB, 0x4C, 0x95, 0xB9, 0x53, 0xAE, 0xA0, 0xB6, 0xE4, 0x46, + 0x37, 0x1B, 0xD4, 0xA5, 0x7B, 0x1D, 0x22, 0x97, 0x00, 0xBA, 0xA5, 0x6D, 0xD2, 0xA1, 0x7E, 0xC0, + 0xB9, 0x25, 0xD2, 0xB4, 0x94, 0x9E, 0xE0, 0x3E, 0xDE, 0xED, 0xD6, 0xD2, 0xE2, 0xC0, 0xD7, 0x5D, + 0x8D, 0x59, 0xAC, 0xD3, 0xE4, 0x83, 0x95, 0x59, 0xC0, 0xA1, 0x48, 0xD2, 0x66, 0xC7, 0x2C, 0x9E, + 0xA0, 0x2A, 0xD3, 0xEE, 0x45, 0x1C, 0x80, 0xE0, 0x6B, 0x34, 0x8C, 0x4B, 0x29, 0xCB, 0x00, 0xBA, + 0xF6, 0x0D, 0x26, 0x9A, 0xD3, 0xA4, 0x82, 0x9D, 0x63, 0x7A, 0xC0, 0x67, 0x24, 0xBA, 0xD6, 0x7C, + 0xC2, 0xC0, 0x37, 0x20, 0x4F, 0x10, 0xE0, 0xC7, 0x80, 0x6A, 0x77, 0x63, 0xBE, 0x6B, 0x5A, 0xC0, + 0xB5, 0x34, 0xD1, 0x34, 0x9C, 0xD4, 0xE8, 0x56, 0xB2, 0x58, 0x5F, 0x00, 0xB7, 0xAF, 0x92, 0x12, + 0x90, 0xD5, 0xA4, 0x39, 0x23, 0x4E, 0x46, 0x87, 0x51, 0xAC, 0xD8, 0xDB, 0x6D, 0xCB, 0x17, 0x50, + 0x89, 0x7B, 0x44, 0x28, 0x03, 0x6B, 0xD5, 0xA9, 0x36, 0x36, 0xD9, 0x6B, 0xA8, 0x93, 0x3A, 0x96, + 0xEE, 0xFF, 0x67, 0x8B, 0x36, 0xDA, 0x09, 0xB4, 0x99, 0x67, 0x2B, 0x88, 0xE4, 0xB5, 0xA5, 0xDA, + 0x65, 0x47, 0xDA, 0x1E, 0x96, 0xFA, 0xEC, 0xD5, 0xA9, 0x45, 0x63, 0x1A, 0xCB, 0xC9, 0x48, 0x9D, + 0x83, 0x5F, 0x6F, 0xCB, 0x08, 0x1B, 0x97, 0xC9, 0x18, 0x0A, 0x63, 0xCB, 0xA6, 0xE1, 0x84, 0xF5, + 0x62, 0x61, 0x6A, 0x84, 0xDC, 0xB6, 0x37, 0x9E, 0xD6, 0xAB, 0x3C, 0x53, 0x93, 0xC1, 0x2A, 0xAA, + 0x81, 0x8D, 0x6B, 0x65, 0x60, 0xA8, 0xFB, 0x2E, 0x22, 0x59, 0x74, 0x61, 0xA6, 0x5D, 0x73, 0x94, + 0xF8, 0xE4, 0xC1, 0x46, 0x26, 0x5E, 0x8A, 0x86, 0xED, 0xD4, 0xA6, 0x2D, 0x57, 0x6B, 0xBE, 0xE8, + 0x58, 0xDA, 0x3D, 0x98, 0x99, 0xBE, 0xA8, 0xC2, 0xDB, 0x6A, 0x2E, 0x51, 0x62, 0xE5, 0x80, 0x58, + 0x76, 0xB8, 0xE4, 0x6C, 0x84, 0xCA, 0x98, 0x06, 0x0B, 0xFC, 0xD2, 0x66, 0x7C, 0x62, 0x3A, 0x5B, + 0xC5, 0xDF, 0x7D, 0x75, 0x49, 0x1E, 0x52, 0xC7, 0x55, 0xF7, 0x84, 0xA6, 0xDA, 0x5D, 0x43, 0x26, + 0x85, 0x98, 0xD8, 0x8F, 0xB6, 0xC5, 0x28, 0xEB, 0x3E, 0x75, 0x04, 0xD2, 0x27, 0xBA, 0x2A, 0x2B, + 0xB7, 0x03, 0x13, 0x45, 0x35, 0x1B, 0x78, 0x5F, 0xC3, 0xBA, 0xDB, 0xAE, 0x27, 0xC2, 0x5E, 0xA4, + 0x50, 0x8C, 0x8A, 0xBB, 0x4F, 0x60, 0xC3, 0xEE, 0x41, 0x46, 0x4A, 0xDF, 0xD2, 0x27, 0xB2, 0xAD, + 0xEB, 0x5F, 0x43, 0x4C, 0x6A, 0x09, 0x2A, 0xCC, 0xB7, 0x47, 0x2A, 0xB9, 0x91, 0xB6, 0xD4, 0x5B, + 0x25, 0x58, 0xD8, 0xFD, 0x46, 0x95, 0x5A, 0xC3, 0x27, 0x5B, 0x3F, 0xFB, 0x12, 0xD2, 0x26, 0xC3, + 0xA9, 0xA1, 0xB6, 0xA2, 0xCB, 0x1B, 0xD0, 0x73, 0xE4, 0xBA, 0xA1, 0xE9, 0x05, 0xBE, 0x79, 0x23, + 0xA4, 0xC2, 0x3A, 0x4B, 0x11, 0xE5, 0x68, 0xC4, 0xC1, 0xBA, 0xC1, 0xCC, 0x8B, 0x02, 0xD2, 0x63, + 0x6C, 0xEE, 0x19, 0x5E, 0xE1, 0xB6, 0x4C, 0x1A, 0xB4, 0x5E, 0xF0, 0xC2, 0x27, 0x20, 0x55, 0xBD, + 0x6D, 0x64, 0xE1, 0xC7, 0x45, 0xA9, 0x65, 0x6D, 0x7D, 0x42, 0x56, 0xD8, 0xB2, 0xB6, 0xEC, 0xD3, + 0x61, 0x5B, 0x62, 0x61, 0x60, 0xA1, 0x5B, 0xD6, 0x15, 0x29, 0x09, 0x6C, 0xA1, 0x3E, 0xAD, 0x65, + 0x34, 0xC3, 0xC0, 0xC1, 0x22, 0x6D, 0x4C, 0x57, 0x10, 0xDB, 0x41, 0xD2, 0xE1, 0x77, 0x64, 0xF7, + 0xD3, 0x21, 0x73, 0xA9, 0x29, 0x58, 0xC1, 0xA1, 0x5A, 0x52, 0xB7, 0x32, 0x64, 0xC1, 0x67, 0x42, + 0x74, 0x2C, 0xDC, 0x61, 0x61, 0x65, 0x8B, 0xCB, 0x04, 0xE5, 0x60, 0xC1, 0xC9, 0x5E, 0x8E, 0x36, + 0x83, 0xD2, 0xA2, 0x83, 0xA9, 0xD9, 0xCD, 0x21, 0xB9, 0x25, 0xCD, 0xE6, 0x1D, 0x60, 0xA1, 0xB4, + 0xAA, 0x8F, 0xBA, 0x75, 0xC3, 0x01, 0x0B, 0x3B, 0x51, 0xDB, 0xEC, 0x62, 0xE1, 0x38, 0xCD, 0x40, + 0x3B, 0xD3, 0xD2, 0x26, 0x94, 0x29, 0xD2, 0x61, 0x21, 0x6B, 0x4A, 0x8D, 0x24, 0xB5, 0xBB, 0x21, + 0x12, 0xA5, 0x99, 0xA5, 0x1A, 0xCA, 0xA1, 0xEF, 0x5D, 0xAA, 0xAE, 0xD3, 0x64, 0xE1, 0xA3, 0x6B, + 0xAE, 0x35, 0x39, 0xD2, 0x66, 0x73, 0xB6, 0x90, 0xC6, 0xC1, 0x32, 0xD1, 0xBA, 0xC9, 0x25, 0x65, + 0x81, 0xA8, 0xD2, 0xB1, 0xE7, 0x18, 0xBE, 0xC0, 0xFC, 0xE4, 0x85, 0xB5, 0x06, 0xB4, 0x81, 0x35, + 0x46, 0xB6, 0xC8, 0x9B +}; + +#endif /* end of include guard: DATA_H */ diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/default/gsm_enc.wasm b/targets/wasm-tacle/sequential/gsm_enc/generated/default/gsm_enc.wasm new file mode 100755 index 0000000000000000000000000000000000000000..d0d2d505f8826c825feb11a49a8077108596c643 GIT binary patch literal 28611 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\de\ed\d6\d2\e2\c0\d7]\8dY\ac\d3\e4\83\95Y\c0\a1H\d2f\c7,\9e\a0*\d3\eeE\1c\80\e0k4\8cK)\cb\00\ba\f6\0d&\9a\d3\a4\82\9dcz\c0g$\ba\d6|\c2\c07 O\10\e0\c7\80jwc\bekZ\c0\b54\d14\9c\d4\e8V\b2X_\00\b7\af\92\12\90\d5\a49#NF\87Q\ac\d8\dbm\cb\17P\89{D(\03k\d5\a966\d9k\a8\93:\96\ee\ffg\8b6\da\09\b4\99g+\88\e4\b5\a5\daeG\da\1e\96\fa\ec\d5\a9Ec\1a\cb\c9H\9d\83_o\cb\08\1b\97\c9\18\0ac\cb\a6\e1\84\f5baj\84\dc\b67\9e\d6\abu\04\d2'\ba*+\b7\03\13E5\1bx_\c3\ba\db\ae'\c2^\a4P\8c\8a\bbO`\c3\eeAFJ\df\d2'\b2\ad\eb_CLj\09*\cc\b7G*\b9\91\b6\d4[%X\d8\fdF\95Z\c3'[?\fb\12\d2&\c3\a9\a1\b6\a2\cb\1b\d0s\e4\ba\a1\e9\05\bey#\a4\c2:K\11\e5h\c4\c1\ba\c1\cc\8b\02\d2cl\ee\19^\e1\b6L\1a\b4^\f0\c2' U\bdmd\e1\c7E\a9em}BV\d8\b2\b6\ec\d3a[ba`\a1[\d6\15)\09l\a1>\ade4\c3\c0\c1\22mLW\10\dbA\d2\e1wd\f7\d3!s\a9)X\c1\a1ZR\b72d\c1gBt,\dcaae\8b\cb\04\e5`\c1\c9^\8e6\83\d2\a2\83\a9\d9\cd!\b9%\cd\e6\1d`\a1\b4\aa\8f\bau\c3\01\0b;Q\db\ecb\e18\cd@;\d3\d2&\94)\d2a!kJ\8d$\b5\bb!\12\a5\99\a5\1a\ca\a1\ef]\aa\ae\d3d\e1\a3k\ae59\d2fs\b6\90\c6\c12\d1\ba\c9%e\81\a8\d2\b1\e7\18\be\c0\fc\e4\85\b5\06\b4\815F\b6\c8\9b\00\00\00\00\00\00\00\00\00\00\00\00\08\07\06\06\05\05\05\05\04\04\04\04\04\04\04\04\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")) diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/data.h b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/data.h new file mode 100644 index 0000000..9123774 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/data.h @@ -0,0 +1,864 @@ + +#ifndef DATA_H +#define DATA_H + +gsm_signal gsm_enc_pcmdata[] = { + (short) 0x0000, (short) 0x0000, (short) 0x0010, (short) 0x0010, + (short) 0x0010, (short) 0x0020, (short) 0x0020, (short) 0x0018, + (short) 0x0028, (short) 0x0020, (short) 0x0020, (short) 0x0028, + (short) 0x0028, (short) 0x0020, (short) 0x0030, (short) 0x0030, + (short) 0x0028, (short) 0x0010, (short) 0x0008, (short) 0x0000, + (short) 0x0050, (short) 0x0060, (short) 0x0058, (short) 0x00D0, + (short) 0x00E0, (short) 0x00D0, (short) 0x0118, (short) 0x0128, + (short) 0x0118, (short) 0x0128, (short) 0x0110, (short) 0x0100, + (short) 0x00A0, (short) 0x0058, (short) 0x0048, (short) 0x0058, + (short) 0x0060, (short) 0x0058, (short) 0x0050, (short) 0x0048, + (short) 0x0040, (short) 0x0030, (short) 0x0020, (short) 0x0010, + (short) 0x0008, (short) 0xFFF8, (short) 0xFFE8, (short) 0xFFE0, + (short) 0xFFD8, (short) 0xFFC8, (short) 0xFFC0, (short) 0xFFC0, + (short) 0xFF98, (short) 0xFF78, (short) 0xFF78, (short) 0xFFC8, + (short) 0x0000, (short) 0x0010, (short) 0x0040, (short) 0x0060, + (short) 0x0068, (short) 0x0078, (short) 0x0078, (short) 0x0070, + (short) 0x00A8, (short) 0x00C8, (short) 0x00C8, (short) 0x00E0, + (short) 0x00F0, (short) 0x00E8, (short) 0x00F8, (short) 0x00F8, + (short) 0x00F0, (short) 0x00E0, (short) 0x00C8, (short) 0x00B8, + (short) 0x00E8, (short) 0x0100, (short) 0x00F8, (short) 0x00E8, + (short) 0x00D8, (short) 0x00C0, (short) 0x00A8, (short) 0x0020, + (short) 0xFFC0, (short) 0xFFA0, (short) 0xFFA0, (short) 0xFFA8, + (short) 0xFFB0, (short) 0xFFD0, (short) 0xFFF8, (short) 0x0000, + (short) 0x0020, (short) 0x0030, (short) 0x0030, (short) 0x0030, + (short) 0x0028, (short) 0x0020, (short) 0xFFF0, (short) 0xFFD0, + (short) 0xFFC8, (short) 0xFFC8, (short) 0xFFD0, (short) 0xFFD8, + (short) 0xFFE8, (short) 0xFFF8, (short) 0xFFF8, (short) 0x0008, + (short) 0x0018, (short) 0x0018, (short) 0x0078, (short) 0x00B8, + (short) 0x00C0, (short) 0x0100, (short) 0x0130, (short) 0x0128, + (short) 0x0108, (short) 0x00D8, (short) 0x00C0, (short) 0x0078, + (short) 0x0038, (short) 0x0020, (short) 0x0020, (short) 0x0000, + (short) 0xFFE0, (short) 0xFFE0, (short) 0xFFD8, (short) 0xFFC8, + (short) 0xFFC8, (short) 0xFFA0, (short) 0xFF88, (short) 0xFF98, + (short) 0xFF80, (short) 0xFF70, (short) 0xFF80, (short) 0xFF78, + (short) 0xFF78, (short) 0xFF90, (short) 0xFF80, (short) 0xFF78, + (short) 0xFF78, (short) 0xFF50, (short) 0xFF30, (short) 0xFF50, + (short) 0xFF38, (short) 0xFF30, (short) 0xFF40, (short) 0xFF58, + (short) 0xFF70, (short) 0xFF80, (short) 0xFF50, (short) 0xFF38, + (short) 0xFF40, (short) 0xFF18, (short) 0xFF00, (short) 0xFF08, + (short) 0xFF40, (short) 0xFF68, (short) 0xFF80, (short) 0xFF88, + (short) 0xFF88, (short) 0xFF88, (short) 0xFF88, (short) 0xFFB8, + (short) 0xFFE0, (short) 0xFFF0, (short) 0xFFD0, (short) 0xFFB8, + (short) 0xFFB8, (short) 0xFF90, (short) 0xFF70, (short) 0xFF70, + (short) 0xFF50, (short) 0xFF40, (short) 0xFF40, (short) 0xFF58, + (short) 0xFF70, (short) 0xFF80, (short) 0xFFC8, (short) 0x0000, + (short) 0x0018, (short) 0x0030, (short) 0x0048, (short) 0x0048, + (short) 0x0028, (short) 0x0008, (short) 0xFFF8, (short) 0xFFD8, + (short) 0xFFC8, (short) 0xFFB8, (short) 0xFF98, (short) 0xFF78, + (short) 0xFF70, (short) 0xFFF0, (short) 0x0058, (short) 0x0088, + (short) 0x00B8, (short) 0x00D0, (short) 0x00D8, (short) 0x00E8, + (short) 0x0138, (short) 0x0160, (short) 0x0158, (short) 0x0170, + (short) 0x0178, (short) 0x0160, (short) 0x0168, (short) 0x0160, + (short) 0x0140, (short) 0x0118, (short) 0x00F0, (short) 0x00C8, + (short) 0x0098, (short) 0x0078, (short) 0x0060, (short) 0x0018, + (short) 0xFFC0, (short) 0xFF90, (short) 0xFF48, (short) 0xFF00, + (short) 0xFEE8, (short) 0xFEC8, (short) 0xFEB8, (short) 0xFEB8, + (short) 0xFEA0, (short) 0xFE88, (short) 0xFE80, (short) 0xFEB8, + (short) 0xFEF8, (short) 0xFF38, (short) 0xFFA0, (short) 0xFFE8, + (short) 0x0008, (short) 0x0030, (short) 0x0058, (short) 0x0068, + (short) 0x0068, (short) 0x0070, (short) 0x0068, (short) 0x0050, + (short) 0x0040, (short) 0x0040, (short) 0x0020, (short) 0x0000, + (short) 0xFFE8, (short) 0xFFF0, (short) 0xFFF8, (short) 0xFFF8, + (short) 0x0038, (short) 0x0068, (short) 0x0078, (short) 0x0038, + (short) 0x0008, (short) 0xFFF0, (short) 0xFFE0, (short) 0xFFD8, + (short) 0xFFD8, (short) 0xFFE0, (short) 0xFFD0, (short) 0xFFC8, + (short) 0x0000, (short) 0x0030, (short) 0x0048, (short) 0x0068, + (short) 0x0080, (short) 0x0088, (short) 0x0088, (short) 0x0088, + (short) 0x0088, (short) 0x0088, (short) 0x0088, (short) 0x0078, + (short) 0x0098, (short) 0x00B0, (short) 0x00B8, (short) 0x0098, + (short) 0x0070, (short) 0x0058, (short) 0x0060, (short) 0x0078, + (short) 0x00A8, (short) 0x00B8, (short) 0x00A8, (short) 0x00A0, + (short) 0x0080, (short) 0x0068, (short) 0x0060, (short) 0x0058, + (short) 0x0048, (short) 0x0030, (short) 0x0038, (short) 0x0038, + (short) 0x0030, (short) 0x0050, (short) 0x0058, (short) 0x0060, + (short) 0x0030, (short) 0x0008, (short) 0xFFF8, (short) 0xFF90, + (short) 0xFF48, (short) 0xFF28, (short) 0xFF10, (short) 0xFEF8, + (short) 0xFEF0, (short) 0xFED8, (short) 0xFEB0, (short) 0xFEB0, + (short) 0xFEA8, (short) 0xFEB8, (short) 0xFED8, (short) 0xFEF8, + (short) 0xFF10, (short) 0xFF20, (short) 0xFF40, (short) 0xFF58, + (short) 0xFF80, (short) 0xFFA0, (short) 0xFFB8, (short) 0xFFC8, + (short) 0xFFD8, (short) 0xFFE0, (short) 0xFFF0, (short) 0x0048, + (short) 0x0098, (short) 0x00B0, (short) 0x0068, (short) 0x0018, + (short) 0xFFF8, (short) 0xFFE8, (short) 0xFFF0, (short) 0xFFF8, + (short) 0x0020, (short) 0x0038, (short) 0x0038, (short) 0x0050, + (short) 0x0068, (short) 0x0070, (short) 0x0068, (short) 0x0060, + (short) 0x0060, (short) 0x0038, (short) 0x0020, (short) 0x0018, + (short) 0x0040, (short) 0x0060, (short) 0x0068, (short) 0x0040, + (short) 0x0010, (short) 0x0000, (short) 0xFFB0, (short) 0xFF78, + (short) 0xFF70, (short) 0xFF90, (short) 0xFFA8, (short) 0xFFC8, + (short) 0xFF98, (short) 0xFF50, (short) 0xFF50, (short) 0xFF50, + (short) 0xFF58, (short) 0xFF68, (short) 0xFF48, (short) 0xFF20, + (short) 0xFF18, (short) 0xFF38, (short) 0xFF60, (short) 0xFF70, + (short) 0xFF80, (short) 0xFF98, (short) 0xFFA0, (short) 0xFFB8, + (short) 0xFFD0, (short) 0xFFE0, (short) 0x0018, (short) 0x0048, + (short) 0x0058, (short) 0x00B0, (short) 0x00F8, (short) 0x0108, + (short) 0x0118, (short) 0x0120, (short) 0x0118, (short) 0x0130, + (short) 0x0148, (short) 0x0140, (short) 0x0130, (short) 0x0120, + (short) 0x0108, (short) 0x0098, (short) 0x0038, (short) 0x0018, + (short) 0xFFD0, (short) 0xFF90, (short) 0xFF80, (short) 0xFF58, + (short) 0xFF38, (short) 0xFF30, (short) 0xFF48, (short) 0xFF68, + (short) 0xFF78, (short) 0xFF88, (short) 0xFFB8, (short) 0xFFD8, + (short) 0xFFE8, (short) 0xFFD8, (short) 0xFFF0, (short) 0x0010, + (short) 0x0020, (short) 0x0020, (short) 0x0018, (short) 0x0028, + (short) 0x0030, (short) 0x0030, (short) 0x0038, (short) 0x0060, + (short) 0x0080, (short) 0x0080, (short) 0x00B0, (short) 0x00D8, + (short) 0x00D0, (short) 0x00B8, (short) 0x00A8, (short) 0x00A8, + (short) 0x00A0, (short) 0x0090, (short) 0x0078, (short) 0x0070, + (short) 0x0068, (short) 0x0048, (short) 0x0018, (short) 0x0008, + (short) 0x0008, (short) 0x0000, (short) 0x0000, (short) 0xFFE8, + (short) 0xFFB0, (short) 0xFF90, (short) 0xFF88, (short) 0xFF70, + (short) 0xFF60, (short) 0xFF60, (short) 0xFF90, (short) 0xFFC0, + (short) 0xFFD0, (short) 0xFFD8, (short) 0xFFE0, (short) 0xFFE8, + (short) 0x0018, (short) 0x0050, (short) 0x0058, (short) 0x0030, + (short) 0x0008, (short) 0x0000, (short) 0x0018, (short) 0x0038, + (short) 0x0038, (short) 0x0048, (short) 0x0050, (short) 0x0050, + (short) 0x0020, (short) 0x0000, (short) 0xFFF8, (short) 0xFFB0, + (short) 0xFF70, (short) 0xFF68, (short) 0xFFB0, (short) 0xFFE8, + (short) 0xFFF8, (short) 0xFFF8, (short) 0xFFF8, (short) 0xFFF0, + (short) 0x0030, (short) 0x0070, (short) 0x0090, (short) 0x0098, + (short) 0x0098, (short) 0x0090, (short) 0x00A0, (short) 0x00B0, + (short) 0x00B8, (short) 0x00C0, (short) 0x00C0, (short) 0x00A8, + (short) 0x0098, (short) 0x0088, (short) 0x0078, (short) 0x0050, + (short) 0x0030, (short) 0x0020, (short) 0xFFD8, (short) 0xFF98, + (short) 0xFF88, (short) 0xFF50, (short) 0xFF20, (short) 0xFF18, + (short) 0xFEF8, (short) 0xFEE0, (short) 0xFEE8, (short) 0xFE70, + (short) 0xFE08, (short) 0xFE00, (short) 0xFE48, (short) 0xFE98, + (short) 0xFEB8, (short) 0xFEE8, (short) 0xFF10, (short) 0xFF28, + (short) 0xFF18, (short) 0xFF10, (short) 0xFF18, (short) 0xFF48, + (short) 0xFF70, (short) 0xFF88, (short) 0xFFE0, (short) 0x0028, + (short) 0x0040, (short) 0x0058, (short) 0x0068, (short) 0x0070, + (short) 0x0078, (short) 0x0070, (short) 0x0068, (short) 0x0068, + (short) 0x0078, (short) 0x0080, (short) 0x0080, (short) 0x0088, + (short) 0x0088, (short) 0x0080, (short) 0x0058, (short) 0x0030, + (short) 0x0020, (short) 0x0018, (short) 0x0018, (short) 0x0018, + (short) 0x0050, (short) 0x0090, (short) 0x00A0, (short) 0x0080, + (short) 0x0060, (short) 0x0050, (short) 0x0030, (short) 0x0018, + (short) 0x0010, (short) 0x0028, (short) 0x0038, (short) 0x0038, + (short) 0x0018, (short) 0xFFF8, (short) 0xFFF0, (short) 0x0000, + (short) 0x0020, (short) 0x0020, (short) 0x0030, (short) 0x0030, + (short) 0x0030, (short) 0x0040, (short) 0x0050, (short) 0x0050, + (short) 0x0050, (short) 0x0048, (short) 0x0048, (short) 0x0048, + (short) 0x0048, (short) 0x0048, (short) 0x0078, (short) 0x00A0, + (short) 0x00A8, (short) 0x00C0, (short) 0x00C8, (short) 0x00C0, + (short) 0x00D0, (short) 0x00E0, (short) 0x00D8, (short) 0x00E8, + (short) 0x00F0, (short) 0x00E0, (short) 0x0100, (short) 0x0118, + (short) 0x0110, (short) 0x0100, (short) 0x00F0, (short) 0x00D8, + (short) 0x0090, (short) 0x0048, (short) 0x0028, (short) 0x0020, + (short) 0x0020, (short) 0x0020, (short) 0x0038, (short) 0x0050, + (short) 0x0050, (short) 0x0050, (short) 0x0048, (short) 0x0040, + (short) 0x0050, (short) 0x0060, (short) 0x0060, (short) 0x0040, + (short) 0xFFC0, (short) 0xFF58, (short) 0xFF40, (short) 0xFF90, + (short) 0xFFE8, (short) 0x0000, (short) 0x0020, (short) 0x0030, + (short) 0x0030, (short) 0x0068, (short) 0x0098, (short) 0x00A8, + (short) 0x0110, (short) 0x0168, (short) 0x0170, (short) 0x0148, + (short) 0x0118, (short) 0x00F0, (short) 0x00E8, (short) 0x00E0, + (short) 0x00D0, (short) 0x0098, (short) 0x0060, (short) 0x0040, + (short) 0x0000, (short) 0xFFD8, (short) 0xFFD8, (short) 0xFFC0, + (short) 0xFFB0, (short) 0xFFB0, (short) 0xFF78, (short) 0xFF30, + (short) 0xFF10, (short) 0xFEF0, (short) 0xFEE8, (short) 0xFEF0, + (short) 0xFEC8, (short) 0xFED0, (short) 0xFEF8, (short) 0xFF00, + (short) 0xFF10, (short) 0xFF20, (short) 0xFF50, (short) 0xFF78, + (short) 0xFF90, (short) 0xFF80, (short) 0xFF70, (short) 0xFF70, + (short) 0xFF80, (short) 0xFF98, (short) 0xFFA0, (short) 0xFFB8, + (short) 0xFFD0, (short) 0xFFD8, (short) 0xFFF0, (short) 0x0000, + (short) 0x0008, (short) 0x0028, (short) 0x0048, (short) 0x0058, + (short) 0x0078, (short) 0x0070, (short) 0x0058, (short) 0x0068, + (short) 0x0098, (short) 0x00B8, (short) 0x00D8, (short) 0x00F0, + (short) 0x00F0, (short) 0x00E8, (short) 0x00F8, (short) 0x0100, + (short) 0x00D8, (short) 0x00D0, (short) 0x00C8, (short) 0x00E8, + (short) 0x0100, (short) 0x00F0, (short) 0x00E0, (short) 0x00C8, + (short) 0x00B8, (short) 0x00A0, (short) 0x0078, (short) 0x0058, + (short) 0x0038, (short) 0x0020, (short) 0x0010, (short) 0x0010, + (short) 0x0018, (short) 0x0010, (short) 0x0010, (short) 0x0010, + (short) 0x0018, (short) 0x0028, (short) 0x0008, (short) 0xFFE0, + (short) 0xFFC8, (short) 0xFF80, (short) 0xFF48, (short) 0xFF38, + (short) 0xFF40, (short) 0xFF48, (short) 0xFF48, (short) 0xFF70, + (short) 0xFF90, (short) 0xFFA8, (short) 0xFFB8, (short) 0xFFC0, + (short) 0xFFC8, (short) 0xFFC0, (short) 0xFFC0, (short) 0xFFC0, + (short) 0xFFB0, (short) 0xFFA0, (short) 0xFFA0, (short) 0xFFA0, + (short) 0xFFA8, (short) 0xFFB0, (short) 0xFF68, (short) 0xFF28, + (short) 0xFF08, (short) 0xFEF8, (short) 0xFEF8, (short) 0xFEE8, + (short) 0xFEE0, (short) 0xFED8, (short) 0xFEA8, (short) 0xFE98, + (short) 0xFEA8, (short) 0xFEA8, (short) 0xFEA0, (short) 0xFEA0, + (short) 0xFED0, (short) 0xFF00, (short) 0xFF30, (short) 0xFF28, + (short) 0xFF38, (short) 0xFF58, (short) 0xFF48, (short) 0xFF40, + (short) 0xFF48, (short) 0xFFB0, (short) 0x0010, (short) 0x0038, + (short) 0x0028, (short) 0x0010, (short) 0x0008, (short) 0x0050, + (short) 0x00A0, (short) 0x00B8, (short) 0x00A0, (short) 0x0080, + (short) 0x0070, (short) 0x0090, (short) 0x00B0, (short) 0x00B0, + (short) 0x00B8, (short) 0x00B8, (short) 0x00B0, (short) 0x00C0, + (short) 0x00D0, (short) 0x00C8, (short) 0x00A0, (short) 0x0068, + (short) 0x0038, (short) 0xFFF0, (short) 0xFFB0, (short) 0xFF88, + (short) 0xFF78, (short) 0xFF68, (short) 0xFF60, (short) 0xFF90, + (short) 0xFFC0, (short) 0xFFE0, (short) 0x0000, (short) 0x0020, + (short) 0x0030, (short) 0x00A0, (short) 0x0110, (short) 0x0138, + (short) 0x0140, (short) 0x0148, (short) 0x0148, (short) 0x0110, + (short) 0x00E8, (short) 0x00C0, (short) 0x00A0, (short) 0x0088, + (short) 0x0068, (short) 0x0008, (short) 0xFFB0, (short) 0xFF88, + (short) 0xFF58, (short) 0xFF30, (short) 0xFF20, (short) 0xFEF8, + (short) 0xFED8, (short) 0xFED8, (short) 0xFF00, (short) 0xFF20, + (short) 0xFF38, (short) 0xFF50, (short) 0xFF68, (short) 0xFF88, + (short) 0xFFA0, (short) 0xFFB8, (short) 0x0020, (short) 0x0080, + (short) 0x00A0, (short) 0x00D8, (short) 0x0100, (short) 0x0100, + (short) 0x0138, (short) 0x0168, (short) 0x0148, (short) 0x0128, + (short) 0x0120, (short) 0x00F8, (short) 0x00E8, (short) 0x00E0, + (short) 0x00C0, (short) 0x00A8, (short) 0x00B0, (short) 0x0098, + (short) 0x0070, (short) 0x0048, (short) 0x0030, (short) 0xFFD0, + (short) 0xFF60, (short) 0xFF48, (short) 0xFF10, (short) 0xFEA8, + (short) 0xFEA8, (short) 0xFEC0, (short) 0xFEC0, (short) 0xFEE8, + (short) 0xFEB0, (short) 0xFE58, (short) 0xFE88, (short) 0xFED0, + (short) 0xFEB8, (short) 0xFE48, (short) 0xFE58, (short) 0xFEE8, + (short) 0xFF28, (short) 0xFF18, (short) 0xFF60, (short) 0x00A0, + (short) 0x01A0, (short) 0x0188, (short) 0x0178, (short) 0x0208, + (short) 0x0208, (short) 0x0100, (short) 0x0018, (short) 0xFFE0, + (short) 0xFEE0, (short) 0xFD68, (short) 0xFD00, (short) 0xFD60, + (short) 0xFD70, (short) 0xFDA8, (short) 0xFF00, (short) 0x00A0, + (short) 0x0170, (short) 0x0210, (short) 0x02D8, (short) 0x0310, + (short) 0x0218, (short) 0x00A0, (short) 0xFFA0, (short) 0xFDF0, + (short) 0xFBD8, (short) 0xFB08, (short) 0xF9C0, (short) 0xF830, + (short) 0xF8D8, (short) 0xFCC0, (short) 0x0038, (short) 0x01A0, + (short) 0x0380, (short) 0x0A18, (short) 0x0F50, (short) 0x0DB0, + (short) 0x0C30, (short) 0x0E18, (short) 0x0CA8, (short) 0x0570, + (short) 0xFF98, (short) 0xFE38, (short) 0xFBA0, (short) 0xF700, + (short) 0xF5D0, (short) 0xF7C8, (short) 0xF9A8, (short) 0xFB48, + (short) 0xFBB0, (short) 0xFC78, (short) 0xFF00, (short) 0xFE98, + (short) 0xFB20, (short) 0xFA48, (short) 0xFAC0, (short) 0xF8C8, + (short) 0xF6E0, (short) 0xF9C0, (short) 0xFE08, (short) 0xFF80, + (short) 0x0428, (short) 0x0B70, (short) 0x0E18, (short) 0x0D38, + (short) 0x0D38, (short) 0x0C28, (short) 0x01D0, (short) 0xF578, + (short) 0xF108, (short) 0xFB50, (short) 0x0498, (short) 0x0428, + (short) 0x0CE8, (short) 0x2190, (short) 0x29F0, (short) 0x22E0, + (short) 0x1F68, (short) 0x2050, (short) 0x1810, (short) 0x0710, + (short) 0xFA98, (short) 0xF438, (short) 0xEE68, (short) 0xE950, + (short) 0xEBC8, (short) 0xF538, (short) 0xFEB8, (short) 0x0240, + (short) 0x0460, (short) 0x09D0, (short) 0x0978, (short) 0xFFF8, + (short) 0xF810, (short) 0xF190, (short) 0xE8D0, (short) 0xE290, + (short) 0xDF60, (short) 0xDFF0, (short) 0xE668, (short) 0xEC20, + (short) 0xF138, (short) 0xFAC0, (short) 0x04F0, (short) 0x08D0, + (short) 0x08C8, (short) 0x0B18, (short) 0x09F8, (short) 0x0230, + (short) 0xFA38, (short) 0xFA68, (short) 0xFC78, (short) 0xF9B8, + (short) 0xF850, (short) 0xFEA8, (short) 0x05B8, (short) 0x0690, + (short) 0x02E8, (short) 0x0268, (short) 0x0498, (short) 0xFCB0, + (short) 0xF018, (short) 0xEDF8, (short) 0x0090, (short) 0x0F48, + (short) 0x0C70, (short) 0x1278, (short) 0x27B8, (short) 0x2EA0, + (short) 0x21F8, (short) 0x1920, (short) 0x1918, (short) 0x1530, + (short) 0x0638, (short) 0xF858, (short) 0xF720, (short) 0xF9F8, + (short) 0xF600, (short) 0xF850, (short) 0x0590, (short) 0x0EE0, + (short) 0x1000, (short) 0x10D8, (short) 0x1460, (short) 0x10F8, + (short) 0x0500, (short) 0xFBC0, (short) 0xF7A8, (short) 0xF250, + (short) 0xEC00, (short) 0xEB30, (short) 0xF1C8, (short) 0xF920, + (short) 0xFC90, (short) 0x0190, (short) 0x0A60, (short) 0x0E80, + (short) 0x0DB0, (short) 0x0AD8, (short) 0x0690, (short) 0x0168, + (short) 0xFF20, (short) 0xFBD0, (short) 0xF6F8, (short) 0xF660, + (short) 0xF680, (short) 0xF5B0, (short) 0xF7C0, (short) 0xF120, + (short) 0xEA90, (short) 0xF030, (short) 0xEC18, (short) 0xE190, + (short) 0xE558, (short) 0xFF20, (short) 0x1090, (short) 0x0C50, + (short) 0x1248, (short) 0x2788, (short) 0x2AD0, (short) 0x1628, + (short) 0x08F0, (short) 0x0BA8, (short) 0x0538, (short) 0xEF48, + (short) 0xE410, (short) 0xEB10, (short) 0xEF68, (short) 0xEA28, + (short) 0xEC40, (short) 0xFC18, (short) 0x08A8, (short) 0x0818, + (short) 0x0778, (short) 0x0858, (short) 0x02F8, (short) 0xF8E8, + (short) 0xF1F0, (short) 0xEF40, (short) 0xECD0, (short) 0xE958, + (short) 0xEA70, (short) 0xF260, (short) 0xFAF0, (short) 0xFFA0, + (short) 0x04A0, (short) 0x0CF8, (short) 0x10F8, (short) 0x0EA0, + (short) 0x0D48, (short) 0x0BE8, (short) 0x05E0, (short) 0x03B0, + (short) 0x0358, (short) 0xFF18, (short) 0xFB40, (short) 0xF9B0, + (short) 0xF9C0, (short) 0xF7C0, (short) 0xEE90, (short) 0xEAA0, + (short) 0xEE00, (short) 0xE888, (short) 0xE200, (short) 0xEF00, + (short) 0x0948, (short) 0x1400, (short) 0x1270, (short) 0x1D88, + (short) 0x2CD8, (short) 0x2488, (short) 0x0DA8, (short) 0x04B8, + (short) 0x0548, (short) 0xF7B0, (short) 0xE3F0, (short) 0xE268, + (short) 0xEFF8, (short) 0xF5A0, (short) 0xF320, (short) 0xFC68, + (short) 0x0BF0, (short) 0x0FA0, (short) 0x0A50, (short) 0x01F8, + (short) 0xFE60, (short) 0xFC48, (short) 0xF340, (short) 0xEB28, + (short) 0xED58, (short) 0xF3C0, (short) 0xF5B8, (short) 0xF738, + (short) 0x00F8, (short) 0x0C70, (short) 0x0E90, (short) 0x0DE8, + (short) 0x1190, (short) 0x12B0, (short) 0x1058, (short) 0x0B98, + (short) 0x0638, (short) 0x0868, (short) 0x0998, (short) 0x02B0, + (short) 0xFE50, (short) 0x0120, (short) 0x02A0, (short) 0xFC90, + (short) 0xF810, (short) 0xF9D0, (short) 0xF818, (short) 0xF290, + (short) 0xF240, (short) 0xF6D0, (short) 0x0A48, (short) 0x1AD8, + (short) 0x1840, (short) 0x1C18, (short) 0x2B18, (short) 0x29F0, + (short) 0x1608, (short) 0x08B8, (short) 0x0778, (short) 0x0128, + (short) 0xF118, (short) 0xE868, (short) 0xEDA0, (short) 0xF310, + (short) 0xF248, (short) 0xF558, (short) 0x0058, (short) 0x0970, + (short) 0x0688, (short) 0x0108, (short) 0xFD08, (short) 0xF988, + (short) 0xF558, (short) 0xF0A0, (short) 0xF0B0, (short) 0xF540, + (short) 0xF6E8, (short) 0xFCA0, (short) 0x0758, (short) 0x0CD0, + (short) 0x0F60, (short) 0x1338, (short) 0x1458, (short) 0x1278, + (short) 0x0FD0, (short) 0x0CA8, (short) 0x0D50, (short) 0x0D10, + (short) 0x0798, (short) 0x0398, (short) 0x0428, (short) 0x04F0, + (short) 0x0278, (short) 0xFF98, (short) 0x0178, (short) 0x0088, + (short) 0xFB08, (short) 0xF660, (short) 0xF1A8, (short) 0xEF18, + (short) 0xF9E8, (short) 0x0C00, (short) 0x11C8, (short) 0x1260, + (short) 0x1B60, (short) 0x21B0, (short) 0x18E0, (short) 0x0B08, + (short) 0x04C8, (short) 0x0078, (short) 0xF730, (short) 0xEF60, + (short) 0xEB18, (short) 0xEC10, (short) 0xF290, (short) 0xF800, + (short) 0xFB60, (short) 0xFF60, (short) 0x0080, (short) 0xFFA8, + (short) 0xFB08, (short) 0xF1A8, (short) 0xED10, (short) 0xEFF0, + (short) 0xEED0, (short) 0xEB10, (short) 0xEFE8, (short) 0xF8F0, + (short) 0xFDE0, (short) 0x0298, (short) 0x0528, (short) 0x0598, + (short) 0x0928, (short) 0x0A30, (short) 0x0670, (short) 0x08E8, + (short) 0x0BC0, (short) 0x0698, (short) 0x0210, (short) 0x0390, + (short) 0x0560, (short) 0x0288, (short) 0xF910, (short) 0xF468, + (short) 0xF560, (short) 0xF3E0, (short) 0xEE10, (short) 0xE8B0, + (short) 0xE508, (short) 0xEED0, (short) 0x03E0, (short) 0x0638, + (short) 0xFFA8, (short) 0x0BB8, (short) 0x2078, (short) 0x1FA8, + (short) 0x0EF0, (short) 0x0648, (short) 0x05C8, (short) 0xFF18, + (short) 0xF588, (short) 0xEE20, (short) 0xED88, (short) 0xF5A0, + (short) 0xFBA8, (short) 0xFBC0, (short) 0xFA98, (short) 0xFA20, + (short) 0xF7D8, (short) 0xF2D0, (short) 0xEF48, (short) 0xE998, + (short) 0xE378, (short) 0xE530, (short) 0xE868, (short) 0xE890, + (short) 0xEDD0, (short) 0xF798, (short) 0xFBC0, (short) 0xFD20, + (short) 0x0178, (short) 0x0490, (short) 0x04A0, (short) 0x0758, + (short) 0x0858, (short) 0x0490, (short) 0x04F8, (short) 0x0858, + (short) 0x06F0, (short) 0x05F8, (short) 0x0450, (short) 0x0098, + (short) 0xFE60, (short) 0xFDA0, (short) 0xF9E0, (short) 0xF358, + (short) 0xEDC0, (short) 0xF308, (short) 0xFFE0, (short) 0x0018, + (short) 0xFB80, (short) 0x0948, (short) 0x1DB8, (short) 0x1D08, + (short) 0x0F88, (short) 0x0B48, (short) 0x0C50, (short) 0x09C0, + (short) 0xFF78, (short) 0xF1A0, (short) 0xEF28, (short) 0xF6B8, + (short) 0xF9F0, (short) 0xF6F0, (short) 0xF688, (short) 0xF9E0, + (short) 0xF9C0, (short) 0xF4C8, (short) 0xEBD8, (short) 0xE7E8, + (short) 0xEBE0, (short) 0xE8C8, (short) 0xE100, (short) 0xE518, + (short) 0xF0B8, (short) 0xF728, (short) 0xF770, (short) 0xF878, + (short) 0xFF58, (short) 0x06B0, (short) 0x0430, (short) 0x0060, + (short) 0x0390, (short) 0x0A18, (short) 0x0B98, (short) 0x06C8, + (short) 0x0710, (short) 0x0CF0, (short) 0x08D0, (short) 0x01F8, + (short) 0x0280, (short) 0x0238, (short) 0xFD78, (short) 0xF868, + (short) 0xF198, (short) 0xF670, (short) 0x0930, (short) 0x0A78, + (short) 0xFB38, (short) 0x04F0, (short) 0x1EB8, (short) 0x1E98, + (short) 0x0F68, (short) 0x0EC8, (short) 0x1548, (short) 0x1480, + (short) 0x0C60, (short) 0x00B0, (short) 0xFEF8, (short) 0x0830, + (short) 0x0838, (short) 0x0160, (short) 0x0380, (short) 0x07E8, + (short) 0x0270, (short) 0xFBA0, (short) 0xF9C0, (short) 0xF450, + (short) 0xEE08, (short) 0xED08, (short) 0xEE10, (short) 0xEF20, + (short) 0xF1C0, (short) 0xF800, (short) 0xFE70, (short) 0x00B0, + (short) 0x02D8, (short) 0x07C8, (short) 0x09F0, (short) 0x09A8, + (short) 0x0A60, (short) 0x0B28, (short) 0x0C80, (short) 0x0D58, + (short) 0x0BD0, (short) 0x0A48, (short) 0x0900, (short) 0x0768, + (short) 0x03D0, (short) 0x00E0, (short) 0xFFF8, (short) 0xFBD8, + (short) 0xF5E8, (short) 0xFE18, (short) 0x0FE8, (short) 0x1060, + (short) 0x05C8, (short) 0x1078, (short) 0x2638, (short) 0x2580, + (short) 0x1740, (short) 0x14E8, (short) 0x19D0, (short) 0x17D8, + (short) 0x0E10, (short) 0x0270, (short) 0x0120, (short) 0x0900, + (short) 0x0870, (short) 0x0290, (short) 0x03A0, (short) 0x0600, + (short) 0x0100, (short) 0xFE28, (short) 0xFF28, (short) 0xF838, + (short) 0xF0B8, (short) 0xF238, (short) 0xF530, (short) 0xF440, + (short) 0xF440, (short) 0xFA38, (short) 0x0198, (short) 0x03A8, + (short) 0x03D0, (short) 0x0780, (short) 0x0AB8, (short) 0x0B58, + (short) 0x0B10, (short) 0x0AD8, (short) 0x0A08, (short) 0x0878, + (short) 0x07C8, (short) 0x0648, (short) 0x01A0, (short) 0xFF48, + (short) 0xFE58, (short) 0xFA68, (short) 0xF7D0, (short) 0xF758, + (short) 0xF470, (short) 0xF5B0, (short) 0x02A8, (short) 0x0A58, + (short) 0x0448, (short) 0x07C8, (short) 0x1708, (short) 0x1970, + (short) 0x0EC8, (short) 0x0A40, (short) 0x0CD0, (short) 0x0D28, + (short) 0x0838, (short) 0x0010, (short) 0xFAE0, (short) 0xFCB0, + (short) 0xFEB8, (short) 0xFCE8, (short) 0xFBA8, (short) 0xFD10, + (short) 0xFBC8, (short) 0xF910, (short) 0xF960, (short) 0xF830, + (short) 0xF4D8, (short) 0xF500, (short) 0xF860, (short) 0xF9F0, + (short) 0xFB58, (short) 0xFE48, (short) 0x0050, (short) 0x0418, + (short) 0x0910, (short) 0x0940, (short) 0x0830, (short) 0x0AC8, + (short) 0x0C88, (short) 0x0A50, (short) 0x07C0, (short) 0x0700, + (short) 0x0590, (short) 0x0268, (short) 0xFFF0, (short) 0xFBA8, + (short) 0xF720, (short) 0xF698, (short) 0xF2E0, (short) 0xEB68, + (short) 0xEDA0, (short) 0xFC00, (short) 0x0358, (short) 0xFF30, + (short) 0x0398, (short) 0x1220, (short) 0x1860, (short) 0x1368, + (short) 0x10C0, (short) 0x12F0, (short) 0x12A0, (short) 0x0E08, + (short) 0x0780, (short) 0x0010, (short) 0xFAD8, (short) 0xF990, + (short) 0xF7E0, (short) 0xF278, (short) 0xEE10, (short) 0xEB98, + (short) 0xE7A0, (short) 0xE6F8, (short) 0xEA30, (short) 0xE980, + (short) 0xE420, (short) 0xE440, (short) 0xEBA8, (short) 0xEF98, + (short) 0xEF68, (short) 0xF288, (short) 0xF7A8, (short) 0xFC90, + (short) 0x01F8, (short) 0x0528, (short) 0x0630, (short) 0x08E8, + (short) 0x0C98, (short) 0x0D50, (short) 0x0B98, (short) 0x0920, + (short) 0x0678, (short) 0x03F0, (short) 0x0260, (short) 0xFE00, + (short) 0xF810, (short) 0xF4B8, (short) 0xF0C0, (short) 0xEB68, + (short) 0xEF58, (short) 0xFAE8, (short) 0xFDE0, (short) 0xF680, + (short) 0xF910, (short) 0x06E0, (short) 0x0C20, (short) 0x05D8, + (short) 0x0408, (short) 0x05C8, (short) 0x0450, (short) 0x02D0, + (short) 0x0128, (short) 0xFB78, (short) 0xF668, (short) 0xF430, + (short) 0xF150, (short) 0xED90, (short) 0xE870, (short) 0xE448, + (short) 0xE2E0, (short) 0xE048, (short) 0xDDD0, (short) 0xDF08, + (short) 0xE0E0, (short) 0xE098, (short) 0xE258, (short) 0xE520, + (short) 0xE6A8, (short) 0xEA28, (short) 0xEF88, (short) 0xF2A8, + (short) 0xF548, (short) 0xFBA8, (short) 0x01C8, (short) 0x03F8, + (short) 0x0748, (short) 0x0C88, (short) 0x0E98, (short) 0x0DB8, + (short) 0x0D98, (short) 0x0D50, (short) 0x0B68, (short) 0x0970, + (short) 0x06C0, (short) 0x0238, (short) 0xFE18, (short) 0xFB08, + (short) 0xF820, (short) 0xF780, (short) 0xF970, (short) 0xF9B0, + (short) 0xF880, (short) 0xFA28, (short) 0x0028, (short) 0x0698, + (short) 0x0948, (short) 0x08D0, (short) 0x09E0, (short) 0x0DD0, + (short) 0x1010, (short) 0x0D40, (short) 0x0958, (short) 0x0728, + (short) 0x0308, (short) 0xFDA0, (short) 0xF9F8, (short) 0xF418, + (short) 0xEC98, (short) 0xE8B8, (short) 0xE618, (short) 0xE200, + (short) 0xDED0, (short) 0xDF48, (short) 0xE100, (short) 0xE180, + (short) 0xE160, (short) 0xE3C8, (short) 0xE898, (short) 0xEDD8, + (short) 0xF250, (short) 0xF558, (short) 0xFB00, (short) 0x02F8, + (short) 0x07B0, (short) 0x0B80, (short) 0x1108, (short) 0x1518, + (short) 0x1660, (short) 0x1770, (short) 0x1870, (short) 0x16F8, + (short) 0x1300, (short) 0x0F78, (short) 0x0FC0, (short) 0x1070, + (short) 0x0CE8, (short) 0x0AF8, (short) 0x0BD8, (short) 0x0D28, + (short) 0x10A8, (short) 0x1370, (short) 0x10A0, (short) 0x1040, + (short) 0x1518, (short) 0x1740, (short) 0x1550, (short) 0x1398, + (short) 0x10E0, (short) 0x0AC8, (short) 0x0640, (short) 0x0348, + (short) 0xFD18, (short) 0xF658, (short) 0xF1D8, (short) 0xEC20, + (short) 0xE760, (short) 0xE550, (short) 0xE4B8, (short) 0xE418, + (short) 0xE438, (short) 0xE508, (short) 0xE738, (short) 0xEB18, + (short) 0xF0C8, (short) 0xF618, (short) 0xF988, (short) 0xFEC8, + (short) 0x0518, (short) 0x09D8, (short) 0x1118, (short) 0x17F0, + (short) 0x1BB0, (short) 0x1E28, (short) 0x2120, (short) 0x23D8, + (short) 0x2638, (short) 0x2418, (short) 0x2080, (short) 0x1D30, + (short) 0x1CE8, (short) 0x1D98, (short) 0x1CA8, (short) 0x1AD8, + (short) 0x1960, (short) 0x17F8, (short) 0x1A40, (short) 0x1CF8, + (short) 0x1D38, (short) 0x1C30, (short) 0x1A68, (short) 0x1860, + (short) 0x1480, (short) 0x1020, (short) 0x0B68, (short) 0x03E8, + (short) 0xFBA8, (short) 0xF508, (short) 0xEE40, (short) 0xE820, + (short) 0xE338, (short) 0xDE88, (short) 0xDA30, (short) 0xD7D0, + (short) 0xD728, (short) 0xD7D8, (short) 0xD998, (short) 0xDC10, + (short) 0xDFB0, (short) 0xE470, (short) 0xE948, (short) 0xEF98, + (short) 0xF5F0, (short) 0xFC38, (short) 0x0228, (short) 0x0798, + (short) 0x0D98, (short) 0x1320, (short) 0x1760, (short) 0x1A70, + (short) 0x1BE0, (short) 0x1CC0, (short) 0x1D98, (short) 0x1A88, + (short) 0x1658, (short) 0x12A0, (short) 0x1180, (short) 0x10A8, + (short) 0x0ED0, (short) 0x0CC8, (short) 0x0AD8, (short) 0x0920, + (short) 0x0B70, (short) 0x0E30, (short) 0x0EE8, (short) 0x0D80, + (short) 0x0BE0, (short) 0x0AC0, (short) 0x09B8, (short) 0x0890, + (short) 0x0690, (short) 0x01F8, (short) 0xFD30, (short) 0xF9F0, + (short) 0xF5B0, (short) 0xF188, (short) 0xEE38, (short) 0xE9E8, + (short) 0xE5E8, (short) 0xE3E0, (short) 0xE4A0, (short) 0xE608, + (short) 0xE738, (short) 0xE858, (short) 0xE980, (short) 0xEC20, + (short) 0xF030, (short) 0xF450, (short) 0xF878, (short) 0xFC68, + (short) 0xFF68, (short) 0x03C8, (short) 0x08B8, (short) 0x0D00, + (short) 0x1038, (short) 0x12D8, (short) 0x1490, (short) 0x1648, + (short) 0x16B8, (short) 0x1468, (short) 0x1160, (short) 0x0FA8, + (short) 0x1038, (short) 0x1058, (short) 0x0F88, (short) 0x0E50, + (short) 0x0CC8, (short) 0x0CC0, (short) 0x0FC0, (short) 0x1220, + (short) 0x12A0, (short) 0x10F8, (short) 0x0F20, (short) 0x0D28, + (short) 0x0C78, (short) 0x0BB8, (short) 0x08D0, (short) 0x01C8, + (short) 0xFB38, (short) 0xF660, (short) 0xF330, (short) 0xF078, + (short) 0xEC28, (short) 0xE6C8, (short) 0xE2C0, (short) 0xE050, + (short) 0xDFC8, (short) 0xE038, (short) 0xE160, (short) 0xE300, + (short) 0xE568, (short) 0xE6B8, (short) 0xE9A0, (short) 0xED50, + (short) 0xF238, (short) 0xF6D8, (short) 0xFB08, (short) 0xFF10, + (short) 0x02E8, (short) 0x06A0, (short) 0x0AC0, (short) 0x0DC8, + (short) 0x1010, (short) 0x1168, (short) 0x1018, (short) 0x0E90, + (short) 0x0BF8, (short) 0x0B08, (short) 0x0A50, (short) 0x09F0, + (short) 0x0960, (short) 0x0888, (short) 0x0808, (short) 0x09C8, + (short) 0x0BA8, (short) 0x0EE8, (short) 0x1070, (short) 0x10D0, + (short) 0x0F58, (short) 0x0D60, (short) 0x0BA0, (short) 0x0A60, + (short) 0x08F0, (short) 0x0608, (short) 0xFFB0, (short) 0xF938, + (short) 0xF360, (short) 0xF030, (short) 0xEE20, (short) 0xEB70, + (short) 0xE7A8, (short) 0xE410, (short) 0xE140, (short) 0xDFC8, + (short) 0xDFF8, (short) 0xE1F0, (short) 0xE448, (short) 0xE6D0, + (short) 0xE780, (short) 0xE9E8, (short) 0xECF0, (short) 0xF248, + (short) 0xF730, (short) 0xFBC0, (short) 0xFF80, (short) 0x0310, + (short) 0x0670, (short) 0x0A98, (short) 0x0D88, (short) 0x0FD8, + (short) 0x10C0, (short) 0x0EB0, (short) 0x0C48, (short) 0x08B8, + (short) 0x0998, (short) 0x0AC0, (short) 0x0C68, (short) 0x0B78, + (short) 0x09C8, (short) 0x0838, (short) 0x08F8, (short) 0x0A80, + (short) 0x0CA0, (short) 0x0E10, (short) 0x0E48, (short) 0x0D58, + (short) 0x0A28, (short) 0x0750, (short) 0x04F0, (short) 0x0228, + (short) 0xFEE8, (short) 0xFA80, (short) 0xF468, (short) 0xEED0, + (short) 0xEAE0, (short) 0xE8B8, (short) 0xE718, (short) 0xE5B0, + (short) 0xE4A8, (short) 0xE410, (short) 0xE480, (short) 0xE548, + (short) 0xE738, (short) 0xE9B0, (short) 0xED80, (short) 0xF0B8, + (short) 0xF480, (short) 0xF7B0, (short) 0xFB70, (short) 0xFED0, + (short) 0x0328, (short) 0x0720, (short) 0x0A98, (short) 0x0E00, + (short) 0x10F8, (short) 0x12E0, (short) 0x12A8, (short) 0x11B0, + (short) 0x0F58, (short) 0x0F38, (short) 0x0E88, (short) 0x0F08, + (short) 0x0FC0, (short) 0x0FF0, (short) 0x10B8, (short) 0x1138, + (short) 0x1198, (short) 0x13D0, (short) 0x1638, (short) 0x17E8, + (short) 0x1758, (short) 0x1628, (short) 0x1460, (short) 0x10E8, + (short) 0x0CA0, (short) 0x0848, (short) 0x0280, (short) 0xFC90, + (short) 0xF700, (short) 0xF0F8, (short) 0xEB18, (short) 0xE638, + (short) 0xE1B8, (short) 0xDE78, (short) 0xDC58, (short) 0xDBB8, + (short) 0xDC28, (short) 0xDDB0, (short) 0xE030, (short) 0xE330, + (short) 0xE6F0, (short) 0xEC20, (short) 0xF210, (short) 0xF7C0, + (short) 0xFCE0, (short) 0x0150, (short) 0x0570, (short) 0x08F0, + (short) 0x0C70, (short) 0x0F50, (short) 0x12B8, (short) 0x1560, + (short) 0x16E0, (short) 0x1630, (short) 0x14E8, (short) 0x1298, + (short) 0x11B8, (short) 0x1170, (short) 0x11B8, (short) 0x11C0, + (short) 0x0FE8, (short) 0x0E58, (short) 0x0CB8, (short) 0x0C50, + (short) 0x0D68, (short) 0x0E98, (short) 0x0E30, (short) 0x0C28, + (short) 0x0A10, (short) 0x06D8, (short) 0x02E0, (short) 0xFEA0, + (short) 0xFA18, (short) 0xF4E8, (short) 0xF018, (short) 0xEB68, + (short) 0xE6E8, (short) 0xE310, (short) 0xDFC8, (short) 0xDD38, + (short) 0xDBF8, (short) 0xDC38, (short) 0xDDD0, (short) 0xE070, + (short) 0xE390, (short) 0xE760, (short) 0xEB88, (short) 0xEF20, + (short) 0xF378, (short) 0xF830, (short) 0xFCE0, (short) 0x00F8, + (short) 0x0480, (short) 0x0768, (short) 0x0968, (short) 0x0AE0, + (short) 0x0BB8, (short) 0x0C10, (short) 0x0BB0, (short) 0x0A78, + (short) 0x08E0, (short) 0x06E8, (short) 0x0540, (short) 0x0870, + (short) 0x0BE0, (short) 0x0ED0, (short) 0x0E40, (short) 0x0D10, + (short) 0x0CC8, (short) 0x0E28, (short) 0x0FA0, (short) 0x0FB0, + (short) 0x0F18, (short) 0x0DD0, (short) 0x0BC8, (short) 0x08E8, + (short) 0x0628, (short) 0x0300, (short) 0xFF18, (short) 0xFB40, + (short) 0xF780, (short) 0xF388, (short) 0xF028, (short) 0xED80, + (short) 0xEB18, (short) 0xE968, (short) 0xE8C0, (short) 0xE738, + (short) 0xE658, (short) 0xE698, (short) 0xE888, (short) 0xEB38, + (short) 0xEDA0, (short) 0xF178, (short) 0xF5B8, (short) 0xFA28, + (short) 0xFEA8, (short) 0x0300, (short) 0x06C8, (short) 0x0960, + (short) 0x0B70, (short) 0x0CE0, (short) 0x0D70, (short) 0x0D50, + (short) 0x0C60, (short) 0x0890, (short) 0x0418, (short) 0x0028, + (short) 0x01D0, (short) 0x03F8, (short) 0x05A8, (short) 0x0700, + (short) 0x0808, (short) 0x09A0, (short) 0x0B18, (short) 0x0CC8, + (short) 0x0D90, (short) 0x0E68, (short) 0x0EC0, (short) 0x0E30, + (short) 0x0C28, (short) 0x09D8, (short) 0x0730, (short) 0x0308, + (short) 0xFED8, (short) 0xFAC0, (short) 0xF598, (short) 0xF0D8, + (short) 0xECE0, (short) 0xEAA8, (short) 0xE948, (short) 0xE8D0, + (short) 0xE850, (short) 0xE888, (short) 0xE910, (short) 0xEAD0, + (short) 0xED68, (short) 0xF018, (short) 0xF350, (short) 0xF6B8, + (short) 0xFAE0, (short) 0xFF00, (short) 0x02D8, (short) 0x05E8, + (short) 0x0830, (short) 0x09F8, (short) 0x0B08, (short) 0x0B80, + (short) 0x0B60, (short) 0x0988, (short) 0x0648, (short) 0x02D0, + (short) 0x0150, (short) 0x01E8, (short) 0x0270, (short) 0x03E0, + (short) 0x0538, (short) 0x0658, (short) 0x0918, (short) 0x0C00, + (short) 0x0E88, (short) 0x10B8, (short) 0x12A0, (short) 0x13E0, + (short) 0x1488, (short) 0x1448, (short) 0x1368, (short) 0x1120, + (short) 0x0DD0, (short) 0x0A40, (short) 0x0608, (short) 0x0148, + (short) 0xFC80, (short) 0xF860, (short) 0xF4D8, (short) 0xF1C0, + (short) 0xF008, (short) 0xEF38, (short) 0xEE78, (short) 0xEE98, + (short) 0xEF90, (short) 0xF170, (short) 0xF390, (short) 0xF5C0, + (short) 0xF888, (short) 0xFB48, (short) 0xFDF0, (short) 0x0078, + (short) 0x03D0, (short) 0x06C8, (short) 0x08F8, (short) 0x0AA0, + (short) 0x0BC8, (short) 0x0C48, (short) 0x0B30, (short) 0x0978, + (short) 0x06A8, (short) 0x0530, (short) 0x03F0, (short) 0x0438, + (short) 0x03C0, (short) 0x0350, (short) 0x0360, (short) 0x04E8, + (short) 0x0698, (short) 0x07D0, (short) 0x08D0, (short) 0x0998, + (short) 0x0A70, (short) 0x0B48, (short) 0x0B70, (short) 0x0AD0, + (short) 0x09C0, (short) 0x0890, (short) 0x0730, (short) 0x0588, + (short) 0x0358, (short) 0x0140, (short) 0xFF58, (short) 0xFD40, + (short) 0xFB68, (short) 0xF9E8, (short) 0xF828, (short) 0xF6D0, + (short) 0xF608, (short) 0xF5D8, (short) 0xF610, (short) 0xF668, + (short) 0xF778, (short) 0xF8E8, (short) 0xFA48, (short) 0xFCC8, + (short) 0xFF50, (short) 0x01C8, (short) 0x0428, (short) 0x0640, + (short) 0x07D0, (short) 0x09D0, (short) 0x0B40, (short) 0x0BF8, + (short) 0x0C30, (short) 0x0C08, (short) 0x0B08, (short) 0x0988, + (short) 0x07C0, (short) 0x0670, (short) 0x0608, (short) 0x0590, + (short) 0x0588, (short) 0x05B0, (short) 0x05E0, (short) 0x06B8, + (short) 0x0748, (short) 0x0758, (short) 0x0700, (short) 0x06A8, + (short) 0x0620, (short) 0x05D8, (short) 0x0590, (short) 0x0528, + (short) 0x03A8, (short) 0x0240, (short) 0x0108, (short) 0xFF38, + (short) 0xFD50, (short) 0xFBA0, (short) 0xFA38, (short) 0xF920, + (short) 0xF860, (short) 0xF6E8, (short) 0xF640, (short) 0xF628, + (short) 0xF680, (short) 0xF720, (short) 0xF800, (short) 0xF8E0, + (short) 0xF9A0, (short) 0xFA78, (short) 0xFB88, (short) 0xFD20, + (short) 0xFEA0, (short) 0x0008, (short) 0x0110, (short) 0x0200, + (short) 0x0360, (short) 0x04E0, (short) 0x0608, (short) 0x0738, + (short) 0x0838, (short) 0x08D8, (short) 0x0828, (short) 0x0738, + (short) 0x0600, (short) 0x04A8, (short) 0x02E0, (short) 0x0130, + (short) 0xFFA0, (short) 0xFF48, (short) 0xFF10, (short) 0xFEF0, + (short) 0xFF30, (short) 0xFFD0, (short) 0x0090, (short) 0x0090, + (short) 0x0070, (short) 0x0060, (short) 0xFFE8, (short) 0xFF50, + (short) 0xFEB8, (short) 0xFE98, (short) 0xFE88, (short) 0xFE80, + (short) 0xFE58, (short) 0xFE50, (short) 0xFE58, (short) 0xFDB0, + (short) 0xFD08, (short) 0xFC80, (short) 0xFAF8, (short) 0xF988, + (short) 0xF860, (short) 0xF798, (short) 0xF720, (short) 0xF6E8, + (short) 0xF728, (short) 0xF7C0, (short) 0xF8A8, (short) 0xF8F8, + (short) 0xF960, (short) 0xFA18, (short) 0xFAC0, (short) 0xFB58, + (short) 0xFC18, (short) 0xFCE0, (short) 0xFDA0, (short) 0xFE20, + (short) 0xFE88, (short) 0xFEF8, (short) 0xFEF0, (short) 0xFEC8, + (short) 0xFEA8, (short) 0xFDE0, (short) 0xFD10, (short) 0xFC70, + (short) 0xFBA8, (short) 0xFB10, (short) 0xFAB8, (short) 0xFAA0, + (short) 0xFAD0, (short) 0xFB18, (short) 0xFA90, (short) 0xFA18, + (short) 0xFA10, (short) 0xFA80, (short) 0xFB10, (short) 0xFB88, + (short) 0xFC90, (short) 0xFDB8, (short) 0xFEB8, (short) 0xFF80, + (short) 0x0058, (short) 0x0138, (short) 0x0118, (short) 0x00C8, + (short) 0x00C0, (short) 0xFF98, (short) 0xFE30, (short) 0xFD38, + (short) 0xFC68, (short) 0xFB78, (short) 0xFAB8, (short) 0xFAE8, + (short) 0xFB78, (short) 0xFBD0, (short) 0xFBE8, (short) 0xFC18, + (short) 0xFC98, (short) 0xFD28, (short) 0xFD48, (short) 0xFD68, + (short) 0xFD68, (short) 0xFD90, (short) 0xFDB8, (short) 0xFD90, + (short) 0xFD68, (short) 0xFD78, (short) 0xFCA0, (short) 0xFB70, + (short) 0xFAD0, (short) 0xF9F0, (short) 0xF870, (short) 0xF748, + (short) 0xF748, (short) 0xF770, (short) 0xF748, (short) 0xF720, + (short) 0xF7A8, (short) 0xF878, (short) 0xF930, (short) 0xF998, + (short) 0xFA38, (short) 0xFC10, (short) 0xFDA0, (short) 0xFE70, + (short) 0x0030, (short) 0x0248, (short) 0x03A0, (short) 0x0568, + (short) 0x0738, (short) 0x0870, (short) 0x0960, (short) 0x0A10, + (short) 0x0A40, (short) 0x0A28, (short) 0x09B8, (short) 0x08E8, + (short) 0x07E8, (short) 0x06E0, (short) 0x0588, (short) 0x0430, + (short) 0x0300, (short) 0x0260, (short) 0x01D0, (short) 0x0118, + (short) 0xFFB0, (short) 0xFE98, (short) 0xFE18, (short) 0xFDA0, + (short) 0xFD08, (short) 0xFCB8, (short) 0xFCF8, (short) 0xFD60, + (short) 0xFD90, (short) 0xFD90, (short) 0xFDD8, (short) 0xFE50, + (short) 0xFDA0, (short) 0xFCE0, (short) 0xFCC0, (short) 0xFCE8, + (short) 0xFCB0, (short) 0xFC60, (short) 0xFC70, (short) 0xFCB8, + (short) 0xFCE0, (short) 0xFD40, (short) 0xFDD8, (short) 0xFE68, + (short) 0xFF78, (short) 0x0068, (short) 0x0108, (short) 0x0278, + (short) 0x03A0, (short) 0x0420, (short) 0x0590, (short) 0x0708, + (short) 0x07B8, (short) 0x07D8, (short) 0x0808, (short) 0x0838, + (short) 0x07D8, (short) 0x06E8, (short) 0x0600, (short) 0x05B0, + (short) 0x0518, (short) 0x0410, (short) 0x02A0, (short) 0x0198, + (short) 0x00D0, (short) 0x00C8, (short) 0x00B0, (short) 0x0068, + (short) 0x00C0, (short) 0x0150, (short) 0x0180, (short) 0x0220, + (short) 0x02D8, (short) 0x0340, (short) 0x0360, (short) 0x0380, + (short) 0x0380, (short) 0x0338, (short) 0x02C8, (short) 0x02B8, + (short) 0x0280, (short) 0x0200, (short) 0x0100, (short) 0x0098, + (short) 0x0080, (short) 0x0020, (short) 0xFFF0, (short) 0x0000, + (short) 0x0020, (short) 0x0098, (short) 0x0120, (short) 0x0170, + (short) 0x0230, (short) 0x02F0, (short) 0x0350, (short) 0x0480, + (short) 0x05B8, (short) 0x0650, (short) 0x06A8, (short) 0x0738, + (short) 0x0798, (short) 0x07B0, (short) 0x07C0, (short) 0x0798, + (short) 0x0668, (short) 0x0598, (short) 0x0530, (short) 0x04C8, + (short) 0x0410, (short) 0x0350, (short) 0x0278, (short) 0x01D8, + (short) 0x0148, (short) 0x0080, (short) 0x0000, (short) 0xFFC0, + (short) 0xFFD8, (short) 0xFFA8, (short) 0xFF60, (short) 0xFF80, + (short) 0x0018, (short) 0x0070, (short) 0xFFE0, (short) 0xFF88, + (short) 0xFFC0, (short) 0xFF38, (short) 0xFE98, (short) 0xFE50, + (short) 0xFE10, (short) 0xFDD8, (short) 0xFD90, (short) 0xFD30, + (short) 0xFDB8, (short) 0xFE68, (short) 0xFE70, (short) 0xFE60, + (short) 0xFE70, (short) 0xFED0, (short) 0xFF90, (short) 0xFFE0, + (short) 0xFFF0, (short) 0x00A8, (short) 0x0168, (short) 0x01D0, + (short) 0x01F8, (short) 0x0210, (short) 0x0278, (short) 0x0268, + (short) 0x0208, (short) 0x0220, (short) 0x01F8, (short) 0x0198, + (short) 0x0158, (short) 0x0100, (short) 0x00C0, (short) 0x00A0, + (short) 0x0018, (short) 0xFF98, (short) 0xFF28, (short) 0xFEC0, + (short) 0xFE80, (short) 0xFE60, (short) 0xFD88, (short) 0xFCF0, + (short) 0xFCC8, (short) 0xFC70, (short) 0xFC10, (short) 0xFBC8, + (short) 0xFBB0, (short) 0xFBE8, (short) 0xFBE8, (short) 0xFB80, + (short) 0xFB88, (short) 0xFB40, (short) 0xFB18, (short) 0xFB20, + (short) 0xFAB8, (short) 0xFA50, (short) 0xFA50, (short) 0xFAB8, + (short) 0xFAF8, (short) 0xFB18, (short) 0xFBB0, (short) 0xFC88, + (short) 0xFD10, (short) 0xFD40, (short) 0xFD98, (short) 0xFE38, + (short) 0xFEE0, (short) 0xFEF8, (short) 0xFEF0, (short) 0xFF18, + (short) 0xFF18, (short) 0xFF18, (short) 0xFF68, (short) 0xFF98, + (short) 0xFF98, (short) 0xFFD0, (short) 0xFFF8, (short) 0x0048, + (short) 0x0038, (short) 0x0008, (short) 0x0008, (short) 0xFFE0, + (short) 0xFFB0, (short) 0xFFB8, (short) 0xFED0, (short) 0xFE18, + (short) 0xFE18, (short) 0xFDF0, (short) 0xFE38, (short) 0xFE90, + (short) 0xFE90, (short) 0xFDA8, (short) 0xFD48, (short) 0xFD70, + (short) 0xFD68, (short) 0xFD00, (short) 0xFCB8, (short) 0xFCB8, + (short) 0xFCF8, (short) 0xFD00, (short) 0xFC30, (short) 0xFBD0, + (short) 0xFC10, (short) 0xFC20, (short) 0xFBE0, (short) 0xFBA8, + (short) 0xFC30, (short) 0xFD00, (short) 0xFD50, (short) 0xFD90, + (short) 0xFE10, (short) 0xFEA8, (short) 0xFF40, (short) 0xFFA0, + (short) 0xFFD0, (short) 0xFFC8, (short) 0xFFC8, (short) 0xFFD8, + (short) 0xFFA0, (short) 0xFF98, (short) 0xFFB8, (short) 0x0050, + (short) 0x00B8, (short) 0x00B0, (short) 0x01B0, (short) 0x02E0, + (short) 0x0318, (short) 0x0330, (short) 0x02E0, (short) 0x02C8, + (short) 0x0278, (short) 0x0150, (short) 0x0050, (short) 0xFFC0, + (short) 0xFF88, (short) 0xFF18, (short) 0xFE90, (short) 0xFE40, + (short) 0xFE30, (short) 0xFDE8, (short) 0xFDD0, (short) 0xFD70, + (short) 0xFD48, (short) 0xFD10, (short) 0xFC98, (short) 0xFC38, + (short) 0xFC38, (short) 0xFC78, (short) 0xFC98, (short) 0xFCF0, + (short) 0xFDA8, (short) 0xFE48, (short) 0xFEC8, (short) 0xFF30, + (short) 0xFF98, (short) 0x0000, (short) 0x0050, (short) 0x0058, + (short) 0x00A8, (short) 0x00E8, (short) 0x00D0, (short) 0x0138, + (short) 0x01E0, (short) 0x0218, (short) 0x0208, (short) 0x0230, + (short) 0x0258, (short) 0x0248, (short) 0x02B0, (short) 0x0318, + (short) 0x0330, (short) 0x0358, (short) 0x0380, (short) 0x0378, + (short) 0x0408, (short) 0x0480, (short) 0x0460, (short) 0x03C8, + (short) 0x0318, (short) 0x02B0, (short) 0x01E8, (short) 0x00B8, + (short) 0xFFD8, (short) 0xFF30, (short) 0xFEC8, (short) 0xFE60, + (short) 0xFE60, (short) 0xFE78, (short) 0xFE78, (short) 0xFDC0, + (short) 0xFD70, (short) 0xFD50, (short) 0xFD08, (short) 0xFC88, + (short) 0xFC28, (short) 0xFC98, (short) 0xFD18, (short) 0xFD60, + (short) 0xFD60, (short) 0xFDD8, (short) 0xFE90, (short) 0xFEE8, + (short) 0xFF10, (short) 0xFF58, (short) 0xFF90, (short) 0xFFB8, + (short) 0xFFE0, (short) 0xFFF0, (short) 0xFFF0, (short) 0x00D0, + (short) 0x0190, (short) 0x01C8, (short) 0x0180, (short) 0x0188, + (short) 0x01B0, (short) 0x0238, (short) 0x0298, (short) 0x02B8, + (short) 0x0268, (short) 0x0258, (short) 0x0258, (short) 0x0230, + (short) 0x0228, (short) 0x0230, (short) 0x0258, (short) 0x0248, + (short) 0x01F8, (short) 0x0150, (short) 0x00C8, (short) 0x0058, + (short) 0x0058, (short) 0x0038, (short) 0x0000, (short) 0xFF50, + (short) 0xFF00, (short) 0xFEF8, (short) 0xFE80, (short) 0xFDB8, + (short) 0xFD70, (short) 0xFD00, (short) 0xFC90, (short) 0xFC40, + (short) 0xFC28, (short) 0xFC58, (short) 0xFC98, (short) 0xFD10, + (short) 0xFD78, (short) 0xFDE0, (short) 0xFE80, (short) 0xFF08, + (short) 0xFF60, (short) 0xFFD0, (short) 0x0030, (short) 0x0068, + (short) 0x0110, (short) 0x0198, (short) 0x01C0, (short) 0x0208, + (short) 0x0260, (short) 0x0280, (short) 0x0320, (short) 0x0390, + (short) 0x0398, (short) 0x0410, (short) 0x0488, (short) 0x04A0, + (short) 0x0448, (short) 0x0408, (short) 0x03E0, (short) 0x03C8, + (short) 0x0398, (short) 0x0350, (short) 0x0308, (short) 0x02C8, + (short) 0x0278, (short) 0x01D8, (short) 0x0148, (short) 0x00E8, + (short) 0x0040, (short) 0xFFA0, (short) 0xFF50, (short) 0xFDC0, + (short) 0xFC88, (short) 0xFC30, (short) 0xFB88, (short) 0xFAA8, + (short) 0xFA50, (short) 0xFA30, (short) 0xFA40, (short) 0xFA70, + (short) 0xFAB8, (short) 0xFAE0, (short) 0xFB28, (short) 0xFB58, + (short) 0xFB80, (short) 0xFBB0, (short) 0xFC00, (short) 0xFC80, + (short) 0xFCF0, (short) 0xFDB8, (short) 0xFE58, (short) 0xFED8, + (short) 0x0008, (short) 0x0100, (short) 0x0180, (short) 0x01D0, + (short) 0x0210, (short) 0x0248, (short) 0x0238, (short) 0x0200, + (short) 0x01D0, (short) 0x02D0, (short) 0x03A0, (short) 0x03D8, + (short) 0x03C0, (short) 0x03D8, (short) 0x03F8, (short) 0x0370, + (short) 0x02C0, (short) 0x0258, (short) 0x01B8, (short) 0x0120, + (short) 0x0090, (short) 0x0088, (short) 0x00A8, (short) 0x00A8, + (short) 0x0088, (short) 0x0068, (short) 0x0060, (short) 0xFFE0, + (short) 0xFF00, (short) 0xFE50, (short) 0xFDC8, (short) 0xFCF0, + (short) 0xFC30, (short) 0xFBB0, (short) 0xFBD8, (short) 0xFC20, + (short) 0xFC58, (short) 0xFC30, (short) 0xFC40, (short) 0xFC78, + (short) 0xFCC0, (short) 0xFCE8, (short) 0xFD10, (short) 0xFD48, + (short) 0xFD88, (short) 0xFDE8, (short) 0xFF10, (short) 0x0020, + (short) 0x0110, (short) 0x01B8, (short) 0x0248, (short) 0x02C0, + (short) 0x0358, (short) 0x03B8, (short) 0x03C8, (short) 0x0320, + (short) 0x0288, (short) 0x0280, (short) 0x0300, (short) 0x0340, + (short) 0x0320, (short) 0x0380, (short) 0x03F8, (short) 0x0418, + (short) 0x0378, (short) 0x02E0, (short) 0x0288, (short) 0x0280, + (short) 0x0238, (short) 0x01D0, (short) 0x0168, (short) 0x0138, + (short) 0x0110, (short) 0x0140, (short) 0x0148, (short) 0x0150, + (short) 0x00A8, (short) 0x0010, (short) 0xFFB0, (short) 0xFEB8, + (short) 0xFDE0, (short) 0xFD48, (short) 0xFCE8, (short) 0xFCA8, + (short) 0xFC78, (short) 0xFC48, (short) 0xFC50, (short) 0xFC70, + (short) 0xFCA8, (short) 0xFCE8, (short) 0xFD28, (short) 0xFDD0, + (short) 0xFE70, (short) 0xFED8, (short) 0x0040, (short) 0x0188, + (short) 0x0258, (short) 0x03C0, (short) 0x04F0, (short) 0x05B8, + (short) 0x0638, (short) 0x0670, (short) 0x0690, (short) 0x0708, + (short) 0x0708, (short) 0x06B8, (short) 0x0660, (short) 0x0650, + (short) 0x0630, (short) 0x05C8, (short) 0x0578, (short) 0x0548, + (short) 0x0508, (short) 0x0470, (short) 0x03D0, (short) 0x0350, + (short) 0x0278, (short) 0x01A0, (short) 0x00F8, (short) 0x00B0, + (short) 0x0078, (short) 0x0030, (short) 0xFFE8, (short) 0xFFC8, + (short) 0xFFB8, (short) 0xFED0, (short) 0xFE08, (short) 0xFD98, + (short) 0xFC70, (short) 0xFB60, (short) 0xFAA8, (short) 0xFA10, + (short) 0xF9B8, (short) 0xF980, (short) 0xF9A0, (short) 0xFA00, + (short) 0xFA68, (short) 0xFB90, (short) 0xFCB8, (short) 0xFD98, + (short) 0xFE68, (short) 0xFF18, (short) 0xFFC0, (short) 0x0078, + (short) 0x00F8, (short) 0x0218, (short) 0x0320, (short) 0x03C0, + (short) 0x0478, (short) 0x0510, (short) 0x0570, (short) 0x05D8, + (short) 0x05E0, (short) 0x05B8, (short) 0x0508, (short) 0x0468, + (short) 0x03E0, (short) 0x02F0, (short) 0x0218, (short) 0x0168, + (short) 0x00F0, (short) 0x0060, (short) 0xFFD0, (short) 0xFF58, + (short) 0xFEC0, (short) 0xFE48, (short) 0xFDB0, (short) 0xFD58, + (short) 0xFD38, (short) 0xFCD8, (short) 0xFC80, (short) 0xFC50, + (short) 0xFC08, (short) 0xFB48, (short) 0xFA98, (short) 0xF9F8, + (short) 0xF8F8, (short) 0xF810, (short) 0xF7F8, (short) 0xF818, + (short) 0xF848, (short) 0xF8E8, (short) 0xF9E0, (short) 0xFB08, + (short) 0xFC38, (short) 0xFD10, (short) 0xFDE8, (short) 0xFF10, + (short) 0xFFD0, (short) 0x0048, (short) 0x00E0, (short) 0x0160, + (short) 0x01B8, (short) 0x01C8, (short) 0x01E0, (short) 0x0200, + (short) 0x0228, (short) 0x0240, (short) 0x0240, (short) 0x0240, + (short) 0x0260, (short) 0x0280, (short) 0x0280, (short) 0x02F0, + (short) 0x0370, (short) 0x03C8, (short) 0x03C8, (short) 0x03A8, + (short) 0x03A0, (short) 0x02F8, (short) 0x0220, (short) 0x0150, + (short) 0x0098, (short) 0xFFE0, (short) 0xFF20, (short) 0xFEA0, + (short) 0xFE50, (short) 0xFE18, (short) 0xFD38, (short) 0xFC60, + (short) 0xFBE0, (short) 0xFAC8, (short) 0xF9A0, (short) 0xF8B8, + (short) 0xF830, (short) 0xF888, (short) 0xF8B8, (short) 0xF908, + (short) 0xFA80, (short) 0xFBF8, (short) 0xFD48, (short) 0xFEC8, + (short) 0x0040, (short) 0x01B0, (short) 0x0298, (short) 0x0338, + (short) 0x03C0, (short) 0x0470, (short) 0x0520, (short) 0x0588, + (short) 0x0610, (short) 0x0688, (short) 0x06C8, (short) 0x0670, + (short) 0x05E8, (short) 0x0578, (short) 0x0580, (short) 0x0578, + (short) 0x0528, (short) 0x0498, (short) 0x0408, (short) 0x0390, + (short) 0x03F8, (short) 0x0458, (short) 0x0488, (short) 0x0468, + (short) 0x0450, (short) 0x0458, (short) 0x03A8, (short) 0x02D0, + (short) 0x0210, (short) 0x0158, (short) 0x0088, (short) 0xFFA8, + (short) 0xFF00, (short) 0xFE88, (short) 0xFE30, (short) 0xFD88, + (short) 0xFCB8, (short) 0xFC28, (short) 0xFB30, (short) 0xF9F0, + (short) 0xF8E8, (short) 0xF890, (short) 0xF890, (short) 0xF8C0, + (short) 0xF978, (short) 0xFA78, (short) 0xFBE8, (short) 0xFD20, + (short) 0xFE28, (short) 0xFF60, (short) 0x00D8, (short) 0x0220, + (short) 0x02F8, (short) 0x0378, (short) 0x03E0, (short) 0x0438, + (short) 0x0488, (short) 0x0498, (short) 0x04A8, (short) 0x0480, + (short) 0x0440, (short) 0x03C0, (short) 0x02D8, (short) 0x01E8, + (short) 0x0140, (short) 0x00D8, (short) 0x0068, (short) 0xFFE0, + (short) 0x0068, (short) 0x0130, (short) 0x0228, (short) 0x0260, + (short) 0x0278, (short) 0x02D0, (short) 0x02D8, (short) 0x0290, + (short) 0x01E0, (short) 0x00D0, (short) 0xFFE0, (short) 0xFEF8, + (short) 0xFE08, (short) 0xFD28, (short) 0xFC88, (short) 0xFBE0, + (short) 0xFB60, (short) 0xFAD8, (short) 0xFA08, (short) 0xF978, + (short) 0xF8E8, (short) 0xF8B0, (short) 0xF8B0, (short) 0xF8D0, + (short) 0xF9D0, (short) 0xFAF8, (short) 0xFC18, (short) 0xFDB0, + (short) 0xFF38, (short) 0x00A0, (short) 0x01F8, (short) 0x02F8, + (short) 0x03C0, (short) 0x0460, (short) 0x04B8, (short) 0x04C8, + (short) 0x04C8, (short) 0x04C0, (short) 0x0498, (short) 0x0490, + (short) 0x0478, (short) 0x0448, (short) 0x0420, (short) 0x03F8, + (short) 0x0328, (short) 0x0238, (short) 0x01B0, (short) 0x0170, + (short) 0x0128, (short) 0x0090, (short) 0x00E8, (short) 0x01B8, + (short) 0x02B8, (short) 0x0280, (short) 0x0218, (short) 0x0218, + (short) 0x01F0, (short) 0x0148, (short) 0x0000, (short) 0xFEC0, + (short) 0xFE08, (short) 0xFD70, (short) 0xFCA0, (short) 0xFBF0, + (short) 0xFBC0, (short) 0xFBA0, (short) 0xFB80, (short) 0xFB18, + (short) 0xFB28, (short) 0xFB98, (short) 0xFBC0, (short) 0xFBD0, + (short) 0xFC08, (short) 0xFC78, (short) 0xFDC8, (short) 0xFEC8, + (short) 0xFF78, (short) 0x00D0, (short) 0x0238, (short) 0x0360, + (short) 0x0398, (short) 0x0360, (short) 0x0368, (short) 0x0380, + (short) 0x0318, (short) 0x0250, (short) 0x0208, (short) 0x0220, + (short) 0x0218, (short) 0x01F0, (short) 0x01C8, (short) 0x0210, + (short) 0x0270, (short) 0x0270, (short) 0x0240, (short) 0x0290, + (short) 0x0310, (short) 0x0360, (short) 0x0340, (short) 0x0310, + (short) 0x0318, (short) 0x0320, (short) 0x02D8, (short) 0x0240, + (short) 0x0158, (short) 0x00A0, (short) 0x0008, (short) 0xFF30, + (short) 0xFE50, (short) 0xFDA8, (short) 0xFD28, (short) 0xFCC8, + (short) 0xFC60, (short) 0xFBA8, (short) 0xFB40, (short) 0xFB10, + (short) 0xFB18, (short) 0xFB28, (short) 0xFB48, (short) 0xFB68, + (short) 0xFBA8, (short) 0xFBF8, (short) 0xFCB8, (short) 0xFD78, + (short) 0xFE00, (short) 0xFE88, (short) 0xFF30, (short) 0xFF98, + (short) 0xFFC8, (short) 0xFFE8, (short) 0x0050, (short) 0x00B0, + (short) 0x00E0, (short) 0x0040, (short) 0xFF68, (short) 0xFED8, + (short) 0xFEE8, (short) 0xFEE0, (short) 0xFE90, (short) 0xFEA8, + (short) 0xFF88, (short) 0x0080, (short) 0x0188, (short) 0x0208, + (short) 0x0290, (short) 0x0390, (short) 0x0438, (short) 0x0450, + (short) 0x0428, (short) 0x03F8, (short) 0x03E0, (short) 0x0388, + (short) 0x02E0, (short) 0x0240, (short) 0x0190, (short) 0x00D0, + (short) 0x0000, (short) 0x0000, (short) 0x0018, (short) 0x00FF, + (short) 0x0068, (short) 0x00FE, (short) 0x00F8, (short) 0x00FD}; + +gsm_byte gsm_enc_gsmdata[] = { + 0xD5, 0x1F, 0x74, 0x21, 0xA0, 0x50, 0x40, 0xC9, 0x24, 0x7B, 0xFA, 0x6B, + 0x52, 0xE0, 0xB6, 0xD6, 0x8E, 0xB9, 0x2B, 0xAE, 0xE0, 0x8B, 0x23, 0x52, + 0x3B, 0x13, 0x86, 0xE0, 0x14, 0x4A, 0x41, 0x44, 0x32, 0xD3, 0xA1, 0x83, + 0xA1, 0x1D, 0xA6, 0x80, 0xBA, 0xD2, 0x96, 0x26, 0xFB, 0x84, 0x80, 0x6D, + 0x9C, 0x25, 0x1D, 0x9B, 0xAA, 0xC0, 0xBB, 0x4C, 0x95, 0xB9, 0x53, 0xAE, + 0xA0, 0xB6, 0xE4, 0x46, 0x37, 0x1B, 0xD4, 0xA5, 0x7B, 0x1D, 0x22, 0x97, + 0x00, 0xBA, 0xA5, 0x6D, 0xD2, 0xA1, 0x7E, 0xC0, 0xB9, 0x25, 0xD2, 0xB4, + 0x94, 0x9E, 0xE0, 0x3E, 0xDE, 0xED, 0xD6, 0xD2, 0xE2, 0xC0, 0xD7, 0x5D, + 0x8D, 0x59, 0xAC, 0xD3, 0xE4, 0x83, 0x95, 0x59, 0xC0, 0xA1, 0x48, 0xD2, + 0x66, 0xC7, 0x2C, 0x9E, 0xA0, 0x2A, 0xD3, 0xEE, 0x45, 0x1C, 0x80, 0xE0, + 0x6B, 0x34, 0x8C, 0x4B, 0x29, 0xCB, 0x00, 0xBA, 0xF6, 0x0D, 0x26, 0x9A, + 0xD3, 0xA4, 0x82, 0x9D, 0x63, 0x7A, 0xC0, 0x67, 0x24, 0xBA, 0xD6, 0x7C, + 0xC2, 0xC0, 0x37, 0x20, 0x4F, 0x10, 0xE0, 0xC7, 0x80, 0x6A, 0x77, 0x63, + 0xBE, 0x6B, 0x5A, 0xC0, 0xB5, 0x34, 0xD1, 0x34, 0x9C, 0xD4, 0xE8, 0x56, + 0xB2, 0x58, 0x5F, 0x00, 0xB7, 0xAF, 0x92, 0x12, 0x90, 0xD5, 0xA4, 0x39, + 0x23, 0x4E, 0x46, 0x87, 0x51, 0xAC, 0xD8, 0xDB, 0x6D, 0xCB, 0x17, 0x50, + 0x89, 0x7B, 0x44, 0x28, 0x03, 0x6B, 0xD5, 0xA9, 0x36, 0x36, 0xD9, 0x6B, + 0xA8, 0x93, 0x3A, 0x96, 0xEE, 0xFF, 0x67, 0x8B, 0x36, 0xDA, 0x09, 0xB4, + 0x99, 0x67, 0x2B, 0x88, 0xE4, 0xB5, 0xA5, 0xDA, 0x65, 0x47, 0xDA, 0x1E, + 0x96, 0xFA, 0xEC, 0xD5, 0xA9, 0x45, 0x63, 0x1A, 0xCB, 0xC9, 0x48, 0x9D, + 0x83, 0x5F, 0x6F, 0xCB, 0x08, 0x1B, 0x97, 0xC9, 0x18, 0x0A, 0x63, 0xCB, + 0xA6, 0xE1, 0x84, 0xF5, 0x62, 0x61, 0x6A, 0x84, 0xDC, 0xB6, 0x37, 0x9E, + 0xD6, 0xAB, 0x3C, 0x53, 0x93, 0xC1, 0x2A, 0xAA, 0x81, 0x8D, 0x6B, 0x65, + 0x60, 0xA8, 0xFB, 0x2E, 0x22, 0x59, 0x74, 0x61, 0xA6, 0x5D, 0x73, 0x94, + 0xF8, 0xE4, 0xC1, 0x46, 0x26, 0x5E, 0x8A, 0x86, 0xED, 0xD4, 0xA6, 0x2D, + 0x57, 0x6B, 0xBE, 0xE8, 0x58, 0xDA, 0x3D, 0x98, 0x99, 0xBE, 0xA8, 0xC2, + 0xDB, 0x6A, 0x2E, 0x51, 0x62, 0xE5, 0x80, 0x58, 0x76, 0xB8, 0xE4, 0x6C, + 0x84, 0xCA, 0x98, 0x06, 0x0B, 0xFC, 0xD2, 0x66, 0x7C, 0x62, 0x3A, 0x5B, + 0xC5, 0xDF, 0x7D, 0x75, 0x49, 0x1E, 0x52, 0xC7, 0x55, 0xF7, 0x84, 0xA6, + 0xDA, 0x5D, 0x43, 0x26, 0x85, 0x98, 0xD8, 0x8F, 0xB6, 0xC5, 0x28, 0xEB, + 0x3E, 0x75, 0x04, 0xD2, 0x27, 0xBA, 0x2A, 0x2B, 0xB7, 0x03, 0x13, 0x45, + 0x35, 0x1B, 0x78, 0x5F, 0xC3, 0xBA, 0xDB, 0xAE, 0x27, 0xC2, 0x5E, 0xA4, + 0x50, 0x8C, 0x8A, 0xBB, 0x4F, 0x60, 0xC3, 0xEE, 0x41, 0x46, 0x4A, 0xDF, + 0xD2, 0x27, 0xB2, 0xAD, 0xEB, 0x5F, 0x43, 0x4C, 0x6A, 0x09, 0x2A, 0xCC, + 0xB7, 0x47, 0x2A, 0xB9, 0x91, 0xB6, 0xD4, 0x5B, 0x25, 0x58, 0xD8, 0xFD, + 0x46, 0x95, 0x5A, 0xC3, 0x27, 0x5B, 0x3F, 0xFB, 0x12, 0xD2, 0x26, 0xC3, + 0xA9, 0xA1, 0xB6, 0xA2, 0xCB, 0x1B, 0xD0, 0x73, 0xE4, 0xBA, 0xA1, 0xE9, + 0x05, 0xBE, 0x79, 0x23, 0xA4, 0xC2, 0x3A, 0x4B, 0x11, 0xE5, 0x68, 0xC4, + 0xC1, 0xBA, 0xC1, 0xCC, 0x8B, 0x02, 0xD2, 0x63, 0x6C, 0xEE, 0x19, 0x5E, + 0xE1, 0xB6, 0x4C, 0x1A, 0xB4, 0x5E, 0xF0, 0xC2, 0x27, 0x20, 0x55, 0xBD, + 0x6D, 0x64, 0xE1, 0xC7, 0x45, 0xA9, 0x65, 0x6D, 0x7D, 0x42, 0x56, 0xD8, + 0xB2, 0xB6, 0xEC, 0xD3, 0x61, 0x5B, 0x62, 0x61, 0x60, 0xA1, 0x5B, 0xD6, + 0x15, 0x29, 0x09, 0x6C, 0xA1, 0x3E, 0xAD, 0x65, 0x34, 0xC3, 0xC0, 0xC1, + 0x22, 0x6D, 0x4C, 0x57, 0x10, 0xDB, 0x41, 0xD2, 0xE1, 0x77, 0x64, 0xF7, + 0xD3, 0x21, 0x73, 0xA9, 0x29, 0x58, 0xC1, 0xA1, 0x5A, 0x52, 0xB7, 0x32, + 0x64, 0xC1, 0x67, 0x42, 0x74, 0x2C, 0xDC, 0x61, 0x61, 0x65, 0x8B, 0xCB, + 0x04, 0xE5, 0x60, 0xC1, 0xC9, 0x5E, 0x8E, 0x36, 0x83, 0xD2, 0xA2, 0x83, + 0xA9, 0xD9, 0xCD, 0x21, 0xB9, 0x25, 0xCD, 0xE6, 0x1D, 0x60, 0xA1, 0xB4, + 0xAA, 0x8F, 0xBA, 0x75, 0xC3, 0x01, 0x0B, 0x3B, 0x51, 0xDB, 0xEC, 0x62, + 0xE1, 0x38, 0xCD, 0x40, 0x3B, 0xD3, 0xD2, 0x26, 0x94, 0x29, 0xD2, 0x61, + 0x21, 0x6B, 0x4A, 0x8D, 0x24, 0xB5, 0xBB, 0x21, 0x12, 0xA5, 0x99, 0xA5, + 0x1A, 0xCA, 0xA1, 0xEF, 0x5D, 0xAA, 0xAE, 0xD3, 0x64, 0xE1, 0xA3, 0x6B, + 0xAE, 0x35, 0x39, 0xD2, 0x66, 0x73, 0xB6, 0x90, 0xC6, 0xC1, 0x32, 0xD1, + 0xBA, 0xC9, 0x25, 0x65, 0x81, 0xA8, 0xD2, 0xB1, 0xE7, 0x18, 0xBE, 0xC0, + 0xFC, 0xE4, 0x85, 0xB5, 0x06, 0xB4, 0x81, 0x35, 0x46, 0xB6, 0xC8, 0x9B}; + +#endif /* end of include guard: DATA_H */ diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/gsm_enc.c b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/gsm_enc.c new file mode 100644 index 0000000..d0d843e --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/gsm_enc.c @@ -0,0 +1,2175 @@ +/* gsm_enc_encode.c */ +/* + Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + Universitaet Berlin. See the accompanying file "COPYRIGHT" for + details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. +*/ + +#include "private.h" + +/* + Prototypes from add.c +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +word gsm_enc_div(word num, word denum); + +word gsm_enc_sub(word a, word b); + +word gsm_enc_norm(longword a); + +word gsm_enc_asl(word a, int n); + +word gsm_enc_asr(word a, int n); + +/* + Inlined functions from add.h +*/ + +#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR(((longword) (a) * (longword) (b) + 16384), 15)) + +#define GSM_MULT(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR(((longword) (a) * (longword) (b)), 15)) + +#define GSM_L_ADD(a, b) \ + ((a) < 0 ? ((b) >= 0 ? (a) + (b) \ + : (utmp = (ulongword) - ((a) + 1) + (ulongword) - \ + ((b) + 1)) >= MAX_LONGWORD \ + ? MIN_LONGWORD \ + : -(longword) utmp - 2) \ + : ((b) <= 0 ? (a) + (b) \ + : (utmp = (ulongword) (a) + (ulongword) (b)) >= \ + (ulongword) MAX_LONGWORD \ + ? MAX_LONGWORD \ + : a + b)) + +#define GSM_ADD(a, b) \ + ((ulongword) ((ltmp = (longword) (a) + (longword) (b)) - MIN_WORD) > \ + MAX_WORD - MIN_WORD \ + ? (ltmp > 0 ? MAX_WORD : MIN_WORD) \ + : ltmp) + +#define GSM_SUB(a, b) \ + ((ltmp = (longword) (a) - (longword) (b)) >= MAX_WORD ? MAX_WORD \ + : ltmp <= MIN_WORD ? MIN_WORD \ + : ltmp) + +#define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) + +#define saturate(x) \ + ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD : (x)) + +/* Use these if necessary: + + # define GSM_MULT_R(a, b) gsm_enc_mult_r(a, b) + # define GSM_MULT(a, b) gsm_enc_mult(a, b) + # define GSM_L_MULT(a, b) gsm_enc_L_mult(a, b) + + # define GSM_L_ADD(a, b) gsm_enc_L_add(a, b) + # define GSM_ADD(a, b) gsm_enc_add(a, b) + # define GSM_SUB(a, b) gsm_enc_sub(a, b) + + # define GSM_ABS(a) gsm_enc_abs(a) +*/ + +/* + More prototypes from implementations.. +*/ +extern void +gsm_enc_Gsm_Coder(struct gsm_state *S, word *s, /* [ 0..159 ] samples IN */ + word *LARc, /* [ 0..7 ] LAR coefficients OUT */ + word *Nc, /* [ 0..3 ] LTP lag OUT */ + word *bc, /* [ 0..3 ] coded LTP gain OUT */ + word *Mc, /* [ 0..3 ] RPE grid selection OUT */ + word *xmaxc, /* [ 0..3 ] Coded maximum amplitude OUT */ + word *xMc /* [ 13*4 ] normalized RPE samples OUT */); + +extern void +gsm_enc_Gsm_Long_Term_Predictor( /* 4x for 160 samples */ + word *d, /* [ 0..39 ] residual signal IN */ + word *dp, /* [ -120..-1 ] d' IN */ + word *e, /* [ 0..40 ] OUT */ + word *dpp, /* [ 0..40 ] OUT */ + word *Nc, /* correlation lag OUT */ + word *bc /* gain factor OUT */); + +extern void gsm_enc_Gsm_LPC_Analysis(word *s, /* 0..159 signals IN/OUT */ + word *LARc); /* 0..7 LARc's OUT */ + +void gsm_enc_Gsm_Preprocess(struct gsm_state *S, word *s, word *so); + +extern void gsm_enc_Gsm_Short_Term_Analysis_Filter( + struct gsm_state *S, word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *d /* st res. signal [ 0..159 ] IN/OUT */); + +void +gsm_enc_Gsm_RPE_Encoding(word *e, /* -5..-1 ][ 0..39 ][ 40..44 IN/OUT */ + word *xmaxc, /* OUT */ + word *Mc, /* OUT */ + word *xMc); /* [ 0..12 ] OUT */ + +/**************** end #include "private.h" **********************************/ + +/* + Interface +*/ + +typedef struct gsm_state *gsm; +typedef short gsm_signal; /* signed 16 bit */ +typedef unsigned char gsm_byte; +typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */ + +#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ + +#define GSM_PATCHLEVEL 6 +#define GSM_MINOR 0 +#define GSM_MAJOR 1 + +#include "data.h" + +void gsm_enc_encode(gsm, gsm_signal *, gsm_byte *); + +int gsm_enc_explode(gsm, gsm_byte *, gsm_signal *); +void gsm_enc_implode(gsm, gsm_signal *, gsm_byte *); + +/******************* end #include "gsm.h" **********************************/ + +#define SAMPLES 20 + +/* + Forward declaration of global variables +*/ + +struct gsm_state gsm_enc_state; +gsm gsm_enc_state_ptr; +volatile int gsm_enc_result; + +/* add.c */ + +word +gsm_enc_sub(word a, word b) { + longword diff = (longword) a - (longword) b; + return saturate(diff); +} + +unsigned char gsm_enc_bitoff[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +void +gsm_enc_encode(gsm s, gsm_signal *source, gsm_byte *c) { + word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13 * 4]; + + gsm_enc_Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); + + /* variable size + + GSM_MAGIC 4 + + LARc[ 0 ] 6 + LARc[ 1 ] 6 + LARc[ 2 ] 5 + LARc[ 3 ] 5 + LARc[ 4 ] 4 + LARc[ 5 ] 4 + LARc[ 6 ] 3 + LARc[ 7 ] 3 + + Nc[ 0 ] 7 + bc[ 0 ] 2 + Mc[ 0 ] 2 + xmaxc[ 0 ] 6 + xmc[ 0 ] 3 + xmc[ 1 ] 3 + xmc[ 2 ] 3 + xmc[ 3 ] 3 + xmc[ 4 ] 3 + xmc[ 5 ] 3 + xmc[ 6 ] 3 + xmc[ 7 ] 3 + xmc[ 8 ] 3 + xmc[ 9 ] 3 + xmc[ 10 ] 3 + xmc[ 11 ] 3 + xmc[ 12 ] 3 + + Nc[ 1 ] 7 + bc[ 1 ] 2 + Mc[ 1 ] 2 + xmaxc[ 1 ] 6 + xmc[ 13 ] 3 + xmc[ 14 ] 3 + xmc[ 15 ] 3 + xmc[ 16 ] 3 + xmc[ 17 ] 3 + xmc[ 18 ] 3 + xmc[ 19 ] 3 + xmc[ 20 ] 3 + xmc[ 21 ] 3 + xmc[ 22 ] 3 + xmc[ 23 ] 3 + xmc[ 24 ] 3 + xmc[ 25 ] 3 + + Nc[ 2 ] 7 + bc[ 2 ] 2 + Mc[ 2 ] 2 + xmaxc[ 2 ] 6 + xmc[ 26 ] 3 + xmc[ 27 ] 3 + xmc[ 28 ] 3 + xmc[ 29 ] 3 + xmc[ 30 ] 3 + xmc[ 31 ] 3 + xmc[ 32 ] 3 + xmc[ 33 ] 3 + xmc[ 34 ] 3 + xmc[ 35 ] 3 + xmc[ 36 ] 3 + xmc[ 37 ] 3 + xmc[ 38 ] 3 + + Nc[ 3 ] 7 + bc[ 3 ] 2 + Mc[ 3 ] 2 + xmaxc[ 3 ] 6 + xmc[ 39 ] 3 + xmc[ 40 ] 3 + xmc[ 41 ] 3 + xmc[ 42 ] 3 + xmc[ 43 ] 3 + xmc[ 44 ] 3 + xmc[ 45 ] 3 + xmc[ 46 ] 3 + xmc[ 47 ] 3 + xmc[ 48 ] 3 + xmc[ 49 ] 3 + xmc[ 50 ] 3 + xmc[ 51 ] 3 + */ + + *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ + | ((LARc[0] >> 2) & 0xF); + *c++ = ((LARc[0] & 0x3) << 6) | (LARc[1] & 0x3F); + *c++ = ((LARc[2] & 0x1F) << 3) | ((LARc[3] >> 2) & 0x7); + *c++ = ((LARc[3] & 0x3) << 6) | ((LARc[4] & 0xF) << 2) | + ((LARc[5] >> 2) & 0x3); + *c++ = ((LARc[5] & 0x3) << 6) | ((LARc[6] & 0x7) << 3) | (LARc[7] & 0x7); + *c++ = ((Nc[0] & 0x7F) << 1) | ((bc[0] >> 1) & 0x1); + *c++ = + ((bc[0] & 0x1) << 7) | ((Mc[0] & 0x3) << 5) | ((xmaxc[0] >> 1) & 0x1F); + *c++ = ((xmaxc[0] & 0x1) << 7) | ((xmc[0] & 0x7) << 4) | + ((xmc[1] & 0x7) << 1) | ((xmc[2] >> 2) & 0x1); + *c++ = ((xmc[2] & 0x3) << 6) | ((xmc[3] & 0x7) << 3) | (xmc[4] & 0x7); + *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ + | ((xmc[6] & 0x7) << 2) | ((xmc[7] >> 1) & 0x3); + *c++ = ((xmc[7] & 0x1) << 7) | ((xmc[8] & 0x7) << 4) | + ((xmc[9] & 0x7) << 1) | ((xmc[10] >> 2) & 0x1); + *c++ = ((xmc[10] & 0x3) << 6) | ((xmc[11] & 0x7) << 3) | (xmc[12] & 0x7); + *c++ = ((Nc[1] & 0x7F) << 1) | ((bc[1] >> 1) & 0x1); + *c++ = + ((bc[1] & 0x1) << 7) | ((Mc[1] & 0x3) << 5) | ((xmaxc[1] >> 1) & 0x1F); + *c++ = ((xmaxc[1] & 0x1) << 7) | ((xmc[13] & 0x7) << 4) | + ((xmc[14] & 0x7) << 1) | ((xmc[15] >> 2) & 0x1); + *c++ = ((xmc[15] & 0x3) << 6) | ((xmc[16] & 0x7) << 3) | (xmc[17] & 0x7); + *c++ = ((xmc[18] & 0x7) << 5) | ((xmc[19] & 0x7) << 2) | + ((xmc[20] >> 1) & 0x3); + *c++ = ((xmc[20] & 0x1) << 7) | ((xmc[21] & 0x7) << 4) | + ((xmc[22] & 0x7) << 1) | ((xmc[23] >> 2) & 0x1); + *c++ = ((xmc[23] & 0x3) << 6) | ((xmc[24] & 0x7) << 3) | (xmc[25] & 0x7); + *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ + | ((bc[2] >> 1) & 0x1); + *c++ = + ((bc[2] & 0x1) << 7) | ((Mc[2] & 0x3) << 5) | ((xmaxc[2] >> 1) & 0x1F); + *c++ = ((xmaxc[2] & 0x1) << 7) | ((xmc[26] & 0x7) << 4) | + ((xmc[27] & 0x7) << 1) | ((xmc[28] >> 2) & 0x1); + *c++ = ((xmc[28] & 0x3) << 6) | ((xmc[29] & 0x7) << 3) | (xmc[30] & 0x7); + *c++ = ((xmc[31] & 0x7) << 5) | ((xmc[32] & 0x7) << 2) | + ((xmc[33] >> 1) & 0x3); + *c++ = ((xmc[33] & 0x1) << 7) | ((xmc[34] & 0x7) << 4) | + ((xmc[35] & 0x7) << 1) | ((xmc[36] >> 2) & 0x1); + *c++ = ((xmc[36] & 0x3) << 6) | ((xmc[37] & 0x7) << 3) | (xmc[38] & 0x7); + *c++ = ((Nc[3] & 0x7F) << 1) | ((bc[3] >> 1) & 0x1); + *c++ = + ((bc[3] & 0x1) << 7) | ((Mc[3] & 0x3) << 5) | ((xmaxc[3] >> 1) & 0x1F); + *c++ = ((xmaxc[3] & 0x1) << 7) | ((xmc[39] & 0x7) << 4) | + ((xmc[40] & 0x7) << 1) | ((xmc[41] >> 2) & 0x1); + *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ + | ((xmc[42] & 0x7) << 3) | (xmc[43] & 0x7); + *c++ = ((xmc[44] & 0x7) << 5) | ((xmc[45] & 0x7) << 2) | + ((xmc[46] >> 1) & 0x3); + *c++ = ((xmc[46] & 0x1) << 7) | ((xmc[47] & 0x7) << 4) | + ((xmc[48] & 0x7) << 1) | ((xmc[49] >> 2) & 0x1); + *c++ = ((xmc[49] & 0x3) << 6) | ((xmc[50] & 0x7) << 3) | (xmc[51] & 0x7); +} + +/* decode.c */ +/* + 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER +*/ + +/* code.c */ +void +gsm_enc_Gsm_Coder( + + struct gsm_state *S, + + word *s, /* [ 0..159 ] samples IN */ + + /* + The RPE-LTD coder works on a frame by frame basis. The length of + the frame is equal to 160 samples. Some computations are done + once per frame to produce at the output of the coder the + LARc[ 1..8 ] parameters which are the coded LAR coefficients and + also to realize the inverse filtering operation for the entire + frame (160 samples of signal d[ 0..159 ]). These parts produce at + the output of the coder: + */ + + word *LARc, /* [ 0..7 ] LAR coefficients OUT */ + + /* + Procedure 4.2.11 to 4.2.18 are to be executed four times per + frame. That means once for each sub-segment RPE-LTP analysis of + 40 samples. These parts produce at the output of the coder: + */ + + word *Nc, /* [ 0..3 ] LTP lag OUT */ + word *bc, /* [ 0..3 ] coded LTP gain OUT */ + word *Mc, /* [ 0..3 ] RPE grid selection OUT */ + word *xmaxc, /* [ 0..3 ] Coded maximum amplitude OUT */ + word *xMc /* [ 13*4 ] normalized RPE samples OUT */ +) { + int k; + word *dp = S->dp0 + 120; /* [ -120...-1 ] */ + word *dpp = dp; /* [ 0...39 ] */ + + static word e[50] = {0}; + + word so[160]; + + gsm_enc_Gsm_Preprocess(S, s, so); + gsm_enc_Gsm_LPC_Analysis(so, LARc); + gsm_enc_Gsm_Short_Term_Analysis_Filter(S, LARc, so); + + __pragma_loopbound(4, 4); + for (k = 0; k <= 3; k++, xMc += 13) { + + gsm_enc_Gsm_Long_Term_Predictor(so + k * 40, /* d [ 0..39 ] IN */ + dp, /* dp [ -120..-1 ] IN */ + e + 5, /* e [ 0..39 ] OUT */ + dpp, /* dpp [ 0..39 ] OUT */ + Nc++, bc++); + + gsm_enc_Gsm_RPE_Encoding(e + 5, /* e ][ 0..39 ][ IN/OUT */ + xmaxc++, Mc++, xMc); + /* + gsm_enc_Gsm_Update_of_reconstructed_short_time_residual_signal + ( dpp, e + 5, dp ); + */ + + { + int i; + longword ltmp; + __pragma_loopbound(40, 40); + for (i = 0; i <= 39; i++) + dp[i] = GSM_ADD(e[5 + i], dpp[i]); + } + + dp += 40; + dpp += 40; + } + // //(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160), + // // 120 * sizeof(*S->dp0) ); +} + +/* rpe.c */ +/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION + */ + +/* 4.2.13 */ + +void +gsm_enc_Weighting_filter(word *e, /* signal [ -5..0.39.44 ] IN */ + word *x /* signal [ 0..39 ] OUT */ + ) +/* + The coefficients of the weighting filter are stored in a table + (see table 4.4). The following scaling is used: + + H[ 0..10 ] = integer( real_H[ 0..10 ] * 8192 ); +*/ +{ + /* word wt[ 50 ]; */ + + longword L_result; + int k /* , i */; + + /* Initialization of a temporary working array wt[ 0...49 ] + */ + + /* for (k = 0; k <= 4; k++) wt[ k ] = 0; + for (k = 5; k <= 44; k++) wt[ k ] = *e++; + for (k = 45; k <= 49; k++) wt[ k ] = 0; + + (e[ -5..-1 ] and e[ 40..44 ] are allocated by the caller, + are initially zero and are not written anywhere.) + */ + e -= 5; + + /* Compute the signal x[ 0..39 ] + */ + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + + L_result = 8192 >> 1; + + /* for (i = 0; i <= 10; i++) { + L_temp = GSM_L_MULT( wt[ k+i ], gsm_enc_H[ i ] ); + L_result = GSM_L_ADD( L_result, L_temp ); + } + */ + +#undef STEP +#define STEP(i, H) (e[k + i] * (longword) H) + + /* Every one of these multiplications is done twice -- + but I don't see an elegant way to optimize this. + Do you? + */ + +#ifdef STUPID_COMPILER + L_result += STEP(0, -134); + L_result += STEP(1, -374); + /* + STEP( 2, 0 ) */ + L_result += STEP(3, 2054); + L_result += STEP(4, 5741); + L_result += STEP(5, 8192); + L_result += STEP(6, 5741); + L_result += STEP(7, 2054); + /* + STEP( 8, 0 ) */ + L_result += STEP(9, -374); + L_result += STEP(10, -134); +#else + L_result += STEP(0, -134) + + STEP(1, -374) + /* + STEP( 2, 0 ) */ + + STEP(3, 2054) + STEP(4, 5741) + STEP(5, 8192) + + STEP(6, 5741) + + STEP(7, 2054) + /* + STEP( 8, 0 ) */ + + STEP(9, -374) + STEP(10, -134); +#endif + /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) + L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) + + x[ k ] = SASR( L_result, 16 ); + */ + + /* 2 adds vs. >>16 => 14, minus one shift to compensate for + those we lost when replacing L_MULT by '*'. + */ + + L_result = SASR(L_result, 13); + x[k] = + (L_result < MIN_WORD ? MIN_WORD + : (L_result > MAX_WORD ? MAX_WORD : L_result)); + } +} + +/* 4.2.14 */ + +void +gsm_enc_RPE_grid_selection(word *x, /* [ 0..39 ] IN */ + word *xM, /* [ 0..12 ] OUT */ + word *Mc_out /* OUT */ + ) +/* + The signal x[ 0..39 ] is used to select the RPE grid which is + represented by Mc. +*/ +{ + /* word temp1; */ + int /* m, */ i; + longword L_result, L_temp; + longword EM; /* xxx should be L_EM? */ + word Mc; + + longword L_common_0_3; + + Mc = 0; + +#undef STEP +#define STEP(m, i) \ + L_temp = SASR(x[m + 3 * i], 2); \ + L_result += L_temp * L_temp; + + /* common part of 0 and 3 */ + + L_result = 0; + STEP(0, 1); + STEP(0, 2); + STEP(0, 3); + STEP(0, 4); + STEP(0, 5); + STEP(0, 6); + STEP(0, 7); + STEP(0, 8); + STEP(0, 9); + STEP(0, 10); + STEP(0, 11); + STEP(0, 12); + L_common_0_3 = L_result; + + /* i = 0 */ + + STEP(0, 0); + L_result <<= 1; /* implicit in L_MULT */ + EM = L_result; + + /* i = 1 */ + + L_result = 0; + STEP(1, 0); + STEP(1, 1); + STEP(1, 2); + STEP(1, 3); + STEP(1, 4); + STEP(1, 5); + STEP(1, 6); + STEP(1, 7); + STEP(1, 8); + STEP(1, 9); + STEP(1, 10); + STEP(1, 11); + STEP(1, 12); + L_result <<= 1; + if (L_result > EM) { + Mc = 1; + EM = L_result; + } + + /* i = 2 */ + + L_result = 0; + STEP(2, 0); + STEP(2, 1); + STEP(2, 2); + STEP(2, 3); + STEP(2, 4); + STEP(2, 5); + STEP(2, 6); + STEP(2, 7); + STEP(2, 8); + STEP(2, 9); + STEP(2, 10); + STEP(2, 11); + STEP(2, 12); + L_result <<= 1; + if (L_result > EM) { + Mc = 2; + EM = L_result; + } + + /* i = 3 */ + + L_result = L_common_0_3; + STEP(3, 12); + L_result <<= 1; + if (L_result > EM) + Mc = 3; + + /**/ + + /* Down-sampling by a factor 3 to get the selected xM[ 0..12 ] + RPE sequence. + */ + __pragma_loopbound(13, 13); + for (i = 0; i <= 12; i++) + xM[i] = x[Mc + 3 * i]; + *Mc_out = Mc; +} + +/* 4.12.15 */ + +void +gsm_enc_APCM_quantization_xmaxc_to_exp_mant(word xmaxc, /* IN */ + word *exp_out, /* OUT */ + word *mant_out) /* OUT */ +{ + word exp, mant; + + /* Compute exponent and mantissa of the decoded version of xmaxc + */ + exp = 0; + if (xmaxc > 15) + exp = SASR(xmaxc, 3) - 1; + mant = xmaxc - (exp << 3); + + if (mant == 0) { + exp = -4; + mant = 7; + } else { + __pragma_loopbound(0, 3); + while (mant <= 7) { + mant = mant << 1 | 1; + exp--; + } + mant -= 8; + } + + *exp_out = exp; + *mant_out = mant; +} + +void +gsm_enc_APCM_quantization(word *xM, /* [ 0..12 ] IN */ + + word *xMc, /* [ 0..12 ] OUT */ + word *mant_out, /* OUT */ + word *exp_out, /* OUT */ + word *xmaxc_out /* OUT */ +) { + int i, itest; + + word xmax, xmaxc, temp, temp1, temp2; + word exp, mant; + + /* Find the maximum absolute value xmax of xM[ 0..12 ]. + */ + + xmax = 0; + + __pragma_loopbound(13, 13); + for (i = 0; i <= 12; i++) { + temp = xM[i]; + temp = GSM_ABS(temp); + if (temp > xmax) + xmax = temp; + } + + /* Qantizing and coding of xmax to get xmaxc. + */ + + exp = 0; + temp = SASR(xmax, 9); + itest = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i <= 5; i++) { + + itest |= (temp <= 0); + temp = SASR(temp, 1); + + if (itest == 0) + exp++; // exp = add (exp, 1) + } + + temp = exp + 5; + + // xmaxc = gsm_enc_add( SASR(xmax, temp), exp << 3 ); + xmaxc = saturate((SASR(xmax, temp) + (exp << 3))); + + /* Quantizing and coding of the xM[ 0..12 ] RPE sequence + to get the xMc[ 0..12 ] + */ + + gsm_enc_APCM_quantization_xmaxc_to_exp_mant(xmaxc, &exp, &mant); + + /* This computation uses the fact that the decoded version of xmaxc + can be calculated by using the exponent and the mantissa part of + xmaxc (logarithmic table). + So, this method avoids any division and uses only a scaling + of the RPE samples by a function of the exponent. A direct + multiplication by the inverse of the mantissa (NRFAC[ 0..7 ] + found in table 4.5) gives the 3 bit coded version xMc[ 0..12 ] + of the RPE samples. + */ + + /* Direct computation of xMc[ 0..12 ] using table 4.5 + */ + + temp1 = 6 - exp; /* normalization by the exponent */ + temp2 = gsm_enc_NRFAC[mant]; /* inverse mantissa */ + + __pragma_loopbound(13, 13); + for (i = 0; i <= 12; i++) { + + temp = xM[i] << temp1; + temp = GSM_MULT(temp, temp2); + temp = SASR(temp, 12); + xMc[i] = temp + 4; /* see note below */ + } + + /* NOTE: This equation is used to make all the xMc[ i ] positive. + */ + + *mant_out = mant; + *exp_out = exp; + *xmaxc_out = xmaxc; +} + +/* 4.2.16 */ + +void +gsm_enc_APCM_inverse_quantization(word *xMc, /* [ 0..12 ] IN */ + word mant, word exp, + word *xMp) /* [ 0..12 ] OUT */ +/* + This part is for decoding the RPE sequence of coded xMc[ 0..12 ] + samples to obtain the xMp[ 0..12 ] array. Table 4.6 is used to get + the mantissa of xmaxc (FAC[ 0..7 ]). +*/ +{ + int i; + word temp, temp1, temp2, temp3; + longword ltmp; + + temp1 = gsm_enc_FAC[mant]; /* see 4.2-15 for mant */ + temp2 = gsm_enc_sub(6, exp); /* see 4.2-15 for exp */ + temp3 = gsm_enc_asl(1, gsm_enc_sub(temp2, 1)); + + __pragma_loopbound(13, 13); + for (i = 13; i--;) { + + /* temp = gsm_enc_sub( *xMc++ << 1, 7 ); */ + temp = (*xMc++ << 1) - 7; /* restore sign */ + + temp <<= 12; /* 16 bit signed */ + temp = GSM_MULT_R(temp1, temp); + temp = GSM_ADD(temp, temp3); + *xMp++ = gsm_enc_asr(temp, temp2); + } +} + +/* 4.2.17 */ + +void +gsm_enc_RPE_grid_positioning(word Mc, /* grid position IN */ + word *xMp, /* [ 0..12 ] IN */ + word *ep /* [ 0..39 ] OUT */ + ) +/* + This procedure computes the reconstructed long term residual signal + ep[ 0..39 ] for the LTP analysis filter. The inputs are the Mc + which is the grid position selection and the xMp[ 0..12 ] decoded + RPE samples which are upsampled by a factor of 3 by inserting zero + values. +*/ +{ + int i = 13; + + // + // TODO: rewritten Duff's device for WCET analysis! + // + switch (Mc) { + case 3: + *ep++ = 0; + case 2: + *ep++ = 0; + case 1: + *ep++ = 0; + case 0: + *ep++ = *xMp++; + i--; + } + + __pragma_loopbound(12, 12); + do { + *ep++ = 0; + *ep++ = 0; + *ep++ = *xMp++; + } while (--i); + + __pragma_loopbound(0, 3); + while (++Mc < 4) + *ep++ = 0; +} +/* + { + int i = 13; + + // + //TODO: removed for WCET analysis + //_Pragma("marker outside") + switch (Mc) { + case 3: *ep++ = 0; + case 2: +__pragma_loopbound(13, 13); + do { + ep++ = 0; + case 1: *ep++ = 0; + case 0: + //_Pragma("marker inside") + ep++ = *xMp++; + } while (--i); + } + + //_Pragma("flowrestriction 1*inside <= 13*outside") + +__pragma_loopbound(0, 3); + while (++Mc < 4) *ep++ = 0; + + } +*/ + +/* 4.2.18 */ + +/* This procedure adds the reconstructed long term residual signal + ep[ 0..39 ] to the estimated signal dpp[ 0..39 ] from the long term + analysis filter to compute the reconstructed short term residual + signal dp[ -40..-1 ]; also the reconstructed short term residual + array dp[ -120..-41 ] is updated. +*/ + +#if 0 /* Has been inlined in code.c */ +void gsm_enc_Gsm_Update_of_reconstructed_short_time_residual_signal P3( ( dpp, + ep, dp ), + word *dpp, /* [ 0...39 ] IN */ + word *ep, /* [ 0...39 ] IN */ + word *dp ) /* [ -120...-1 ] IN/OUT */ +{ + int k; + + _Pragma( "loopbound min 80 max 80" ) + for ( k = 0; k <= 79; k++ ) + dp[ -120 + k ] = dp[ -80 + k ]; + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) + dp[ -40 + k ] = gsm_enc_add( ep[ k ], dpp[ k ] ); +} +#endif /* Has been inlined in code.c */ + +void +gsm_enc_Gsm_RPE_Encoding( + + word *e, /* -5..-1 ][ 0..39 ][ 40..44 IN/OUT */ + word *xmaxc, /* OUT */ + word *Mc, /* OUT */ + word *xMc) /* [ 0..12 ] OUT */ +{ + word x[40]; + word xM[13], xMp[13]; + word mant, exp; + + gsm_enc_Weighting_filter(e, x); + gsm_enc_RPE_grid_selection(x, xM, Mc); + + gsm_enc_APCM_quantization(xM, xMc, &mant, &exp, xmaxc); + gsm_enc_APCM_inverse_quantization(xMc, mant, exp, xMp); + + gsm_enc_RPE_grid_positioning(*Mc, xMp, e); +} + +/* long_term.c */ +#ifdef USE_TABLE_MUL + +unsigned int umul_table[513][256]; + +#define umul(x9, x15) \ + ((int) (umul_table[x9][x15 & 0x0FF] + (umul_table[x9][x15 >> 8] << 8))) + +#define table_mul(a, b) \ + ((a < 0) ? ((b < 0) ? umul(-a, -b) : -umul(-a, b)) \ + : ((b < 0) ? -umul(a, -b) : umul(a, b))) + +#endif /* USE_TABLE_MUL */ + +/* + 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION +*/ + +/* + This procedure computes the LTP gain (bc) and the LTP lag (Nc) + for the long term analysis filter. This is done by calculating a + maximum of the cross-correlation function between the current + sub-segment short term residual signal d[ 0..39 ] (output of + the short term analysis filter; for simplification the index + of this array begins at 0 and ends at 39 for each sub-segment of the + RPE-LTP analysis) and the previous reconstructed short term + residual signal dp[ -120 .. -1 ]. A dynamic scaling must be + performed to avoid overflow. +*/ + +/* This procedure exists in four versions. First, the two integer + versions with or without table-multiplication (as one function); + then, the two floating point versions (as another function), with + or without scaling. +*/ + +#ifndef USE_FLOAT_MUL + +void +gsm_enc_Calculation_of_the_LTP_parameters(word *d, /* [ 0..39 ] IN */ + word *dp, /* [ -120..-1 ] IN */ + word *bc_out, /* OUT */ + word *Nc_out /* OUT */ +) { + int k, lambda; + word Nc, bc; + word wt[40]; + + longword L_max, L_power; + word R, S, dmax, scal; + word temp; + + /* Search of the optimum scaling of d[ 0..39 ]. + */ + dmax = 0; + + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS(temp); + if (temp > dmax) + dmax = temp; + } + + temp = 0; + if (dmax != 0) + temp = gsm_enc_norm((longword) dmax << 16); + + if (temp > 6) + scal = 0; + else + scal = 6 - temp; + + /* Initialization of a working array wt + */ + + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) + wt[k] = SASR(d[k], scal); + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + __pragma_loopbound(81, 81); + for (lambda = 40; lambda <= 120; lambda++) { + +#undef STEP +#ifdef USE_TABLE_MUL +#define STEP(k) (table_mul(wt[k], dp[k - lambda])) +#else +#define STEP(k) (wt[k] * dp[k - lambda]) +#endif + + longword L_result; + + L_result = STEP(0); + L_result += STEP(1); + L_result += STEP(2); + L_result += STEP(3); + L_result += STEP(4); + L_result += STEP(5); + L_result += STEP(6); + L_result += STEP(7); + L_result += STEP(8); + L_result += STEP(9); + L_result += STEP(10); + L_result += STEP(11); + L_result += STEP(12); + L_result += STEP(13); + L_result += STEP(14); + L_result += STEP(15); + L_result += STEP(16); + L_result += STEP(17); + L_result += STEP(18); + L_result += STEP(19); + L_result += STEP(20); + L_result += STEP(21); + L_result += STEP(22); + L_result += STEP(23); + L_result += STEP(24); + L_result += STEP(25); + L_result += STEP(26); + L_result += STEP(27); + L_result += STEP(28); + L_result += STEP(29); + L_result += STEP(30); + L_result += STEP(31); + L_result += STEP(32); + L_result += STEP(33); + L_result += STEP(34); + L_result += STEP(35); + L_result += STEP(36); + L_result += STEP(37); + L_result += STEP(38); + L_result += STEP(39); + + if (L_result > L_max) { + + Nc = lambda; + L_max = L_result; + } + } + + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + /* Compute the power of the reconstructed short term residual + signal dp[ .. ] + */ + L_power = 0; + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + + longword L_temp; + + L_temp = SASR(dp[k - Nc], 3); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_enc_norm(L_power); + + R = SASR(L_max << temp, 16); + S = SASR(L_power << temp, 16); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[ i ] for the + quantization of the LTP gain b to get the coded version bc. + */ + __pragma_loopbound(3, 3); + for (bc = 0; bc <= 2; bc++) + /* Replaced by macro function. */ + // if (R <= gsm_enc_mult(S, gsm_enc_DLB[ bc ])) + if (R <= GSM_MULT(S, gsm_enc_DLB[bc])) + break; + + *bc_out = bc; +} + +#else /* USE_FLOAT_MUL */ + +void +gsm_enc_Calculation_of_the_LTP_parameters(word *d, /* [ 0..39 ] IN */ + word *dp, /* [ -120..-1 ] IN */ + word *bc_out, /* OUT */ + word *Nc_out /* OUT */ +) { + int k, lambda; + word Nc, bc; + + float wt_float[40]; + float dp_float_base[120], *dp_float = dp_float_base + 120; + + longword L_max, L_power; + word R, S, dmax, scal; + word temp; + + /* Search of the optimum scaling of d[ 0..39 ]. + */ + dmax = 0; + + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS(temp); + if (temp > dmax) + dmax = temp; + } + + temp = 0; + if (dmax == 0) + scal = 0; + else + temp = gsm_enc_norm((longword) dmax << 16); + + if (temp > 6) + scal = 0; + else + scal = 6 - temp; + + /* Initialization of a working array wt + */ + + __pragma_loopbound(40, 40); + for (k = 0; k < 40; k++) + wt_float[k] = SASR(d[k], scal); + __pragma_loopbound(120, 120); + for (k = -120; k < 0; k++) + dp_float[k] = dp[k]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + __pragma_loopbound(9, 9); + for (lambda = 40; lambda <= 120; lambda += 9) { + + /* Calculate L_result for l = lambda .. lambda + 9. + */ + float *lp = dp_float - lambda; + + float W; + float a = lp[-8], b = lp[-7], c = lp[-6], d = lp[-5], e = lp[-4], + f = lp[-3], g = lp[-2], h = lp[-1]; + float E; + float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, S5 = 0, S6 = 0, S7 = 0, + S8 = 0; + +#undef STEP +#define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float[K]; \ + E = W * a; \ + S8 += E; \ + E = W * b; \ + S7 += E; \ + E = W * c; \ + S6 += E; \ + E = W * d; \ + S5 += E; \ + E = W * e; \ + S4 += E; \ + E = W * f; \ + S3 += E; \ + E = W * g; \ + S2 += E; \ + E = W * h; \ + S1 += E; \ + a = lp[K]; \ + E = W * a; \ + S0 += E + +#define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) +#define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) +#define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) +#define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) +#define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) +#define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) +#define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) +#define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) + + STEP_A(0); + STEP_B(1); + STEP_C(2); + STEP_D(3); + STEP_E(4); + STEP_F(5); + STEP_G(6); + STEP_H(7); + + STEP_A(8); + STEP_B(9); + STEP_C(10); + STEP_D(11); + STEP_E(12); + STEP_F(13); + STEP_G(14); + STEP_H(15); + + STEP_A(16); + STEP_B(17); + STEP_C(18); + STEP_D(19); + STEP_E(20); + STEP_F(21); + STEP_G(22); + STEP_H(23); + + STEP_A(24); + STEP_B(25); + STEP_C(26); + STEP_D(27); + STEP_E(28); + STEP_F(29); + STEP_G(30); + STEP_H(31); + + STEP_A(32); + STEP_B(33); + STEP_C(34); + STEP_D(35); + STEP_E(36); + STEP_F(37); + STEP_G(38); + STEP_H(39); + + if (S0 > L_max) { + L_max = S0; + Nc = lambda; + } + if (S1 > L_max) { + L_max = S1; + Nc = lambda + 1; + } + if (S2 > L_max) { + L_max = S2; + Nc = lambda + 2; + } + if (S3 > L_max) { + L_max = S3; + Nc = lambda + 3; + } + if (S4 > L_max) { + L_max = S4; + Nc = lambda + 4; + } + if (S5 > L_max) { + L_max = S5; + Nc = lambda + 5; + } + if (S6 > L_max) { + L_max = S6; + Nc = lambda + 6; + } + if (S7 > L_max) { + L_max = S7; + Nc = lambda + 7; + } + if (S8 > L_max) { + L_max = S8; + Nc = lambda + 8; + } + } + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + /* Compute the power of the reconstructed short term residual + signal dp[ .. ] + */ + L_power = 0; + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + + longword L_temp; + + L_temp = SASR(dp[k - Nc], 3); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_enc_norm(L_power); + + R = SASR(L_max << temp, 16); + S = SASR(L_power << temp, 16); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[ i ] for the + quantization of the LTP gain b to get the coded version bc. + */ + // Replaced by macro function. + // for (bc = 0; bc <= 2; bc++) if (R <= gsm_enc_mult(S, gsm_enc_DLB[ bc ])) + // break; + _Pragma( + "loopbound min 3 max 3") for (bc = 0; bc <= 2; + bc++) if (R <= + GSM_MULT( + S, gsm_enc_DLB[bc])) break; + *bc_out = bc; +} + +#endif /* USE_FLOAT_MUL */ + +/* 4.2.12 */ + +void +gsm_enc_Long_term_analysis_filtering( + word bc, /* IN */ + word Nc, /* IN */ + word *dp, /* previous d [ -120..-1 ] IN */ + word *d, /* d [ 0..39 ] IN */ + word *dpp, /* estimate [ 0..39 ] OUT */ + word *e /* long term res. signal [ 0..39 ] OUT */ + ) +/* + In this part, we have to decode the bc parameter to compute + the samples of the estimate dpp[ 0..39 ]. The decoding of bc needs the + use of table 4.3b. The long term residual signal e[ 0..39 ] + is then calculated to be fed to the RPE encoding section. +*/ +{ + int k; + longword ltmp; + +#undef STEP +#define STEP(BP) \ + __pragma_loopbound(40, 40); \ + for (k = 0; k <= 39; k++) { \ + dpp[k] = GSM_MULT_R(BP, dp[k - Nc]); \ + e[k] = GSM_SUB(d[k], dpp[k]); \ + } + + switch (bc) { + case 0: + STEP(3277); + break; + case 1: + STEP(11469); + break; + case 2: + STEP(21299); + break; + case 3: + STEP(32767); + break; + } +} + +void +gsm_enc_Gsm_Long_Term_Predictor( + + word *d, /* [ 0..39 ] residual signal IN */ + word *dp, /* [ -120..-1 ] d' IN */ + + word *e, /* [ 0..39 ] OUT */ + word *dpp, /* [ 0..39 ] OUT */ + word *Nc, /* correlation lag OUT */ + word *bc /* gain factor OUT */ +) { + + gsm_enc_Calculation_of_the_LTP_parameters(d, dp, bc, Nc); + + gsm_enc_Long_term_analysis_filtering(*bc, *Nc, dp, d, dpp, e); +} + +/* short_term.c */ +/* + SHORT TERM ANALYSIS FILTERING SECTION +*/ + +/* 4.2.8 */ + +void +gsm_enc_Decoding_of_the_coded_Log_Area_Ratios( + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *LARpp) /* out: decoded .. */ +{ + word temp1 /* , temp2 */; + long ltmp; /* for GSM_ADD */ + + /* This procedure requires for efficient implementation + two tables. + + INVA[ 1..8 ] = integer( (32768 * 8) / real_A[ 1..8 ]) + MIC[ 1..8 ] = minimum value of the LARc[ 1..8 ] + */ + + /* Compute the LARpp[ 1..8 ] + */ + +#undef STEP +#define STEP(B, MIC, INVA) \ + temp1 = GSM_ADD(*LARc++, MIC) << 10; \ + temp1 = GSM_SUB(temp1, (B >= 0 ? B << 1 : -((-B) << 1))); \ + temp1 = GSM_MULT_R(INVA, temp1); \ + *LARpp++ = GSM_ADD(temp1, temp1); + + STEP(0, -32, 13107); + STEP(0, -32, 13107); + STEP(2048, -16, 13107); + STEP(-2560, -16, 13107); + + STEP(94, -8, 19223); + STEP(-1792, -8, 17476); + STEP(-341, -4, 31454); + STEP(-1144, -4, 29708); + + /* NOTE: the addition of *MIC is used to restore + the sign of *LARc. + */ +} + +/* 4.2.9 */ +/* Computation of the quantized reflection coefficients + */ + +/* 4.2.9.1 Interpolation of the LARpp[ 1..8 ] to get the LARp[ 1..8 ] + */ + +/* + Within each frame of 160 analyzed speech samples the short term + analysis and synthesis filters operate with four different sets of + coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) + and the actual set of decoded LARs (LARpp(j)) + + (Initial value: LARpp(j-1)[ 1..8 ] = 0.) +*/ + +void +gsm_enc_Coefficients_0_12(word *LARpp_j_1, word *LARpp_j, word *LARp) { + int i; + longword ltmp; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { + *LARp = GSM_ADD(SASR(*LARpp_j_1, 2), SASR(*LARpp_j, 2)); + *LARp = GSM_ADD(*LARp, SASR(*LARpp_j_1, 1)); + } +} + +void +gsm_enc_Coefficients_13_26(word *LARpp_j_1, word *LARpp_j, word *LARp) { + int i; + longword ltmp; + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) + *LARp = GSM_ADD(SASR(*LARpp_j_1, 1), SASR(*LARpp_j, 1)); +} + +void +gsm_enc_Coefficients_27_39(word *LARpp_j_1, word *LARpp_j, word *LARp) { + int i; + longword ltmp; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { + *LARp = GSM_ADD(SASR(*LARpp_j_1, 2), SASR(*LARpp_j, 2)); + *LARp = GSM_ADD(*LARp, SASR(*LARpp_j, 1)); + } +} + +void +gsm_enc_Coefficients_40_159(word *LARpp_j, word *LARp) { + int i; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARp++, LARpp_j++) + *LARp = *LARpp_j; +} + +/* 4.2.9.2 */ + +void +gsm_enc_LARp_to_rp(word *LARp) /* [ 0..7 ] IN/OUT */ +/* + The input of this procedure is the interpolated LARp[ 0..7 ] array. + The reflection coefficients, rp[ i ], are used in the analysis + filter and in the synthesis filter. +*/ +{ + int i; + word temp; + longword ltmp; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARp++) { + + /* temp = GSM_ABS( *LARp ); + + if (temp < 11059) temp <<= 1; + else if (temp < 20070) temp += 11059; + else temp = GSM_ADD( temp >> 2, 26112 ); + + * *LARp = *LARp < 0 ? -temp : temp; + */ + + if (*LARp < 0) { + temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); + *LARp = -((temp < 11059) + ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD(temp >> 2, 26112))); + } else { + temp = *LARp; + *LARp = (temp < 11059) + ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD(temp >> 2, 26112)); + } + } +} + +/* 4.2.10 */ +void +gsm_enc_Short_term_analysis_filtering(struct gsm_state *S, + word *rp, /* [ 0..7 ] IN */ + int k_n, /* k_end - k_start */ + word *s /* [ 0..n-1 ] IN/OUT */ + ) +/* + This procedure computes the short term residual signal d[ .. ] to be fed + to the RPE-LTP loop from the s[ .. ] signal and from the local rp[ .. ] + array (quantized reflection coefficients). As the call of this + procedure can be done in many ways (see the interpolation of the LAR + coefficient), it is assumed that the computation begins with index + k_start (for arrays d[ .. ] and s[ .. ]) and stops with index k_end + (k_start and k_end are defined in 4.2.9.1). This procedure also + needs to keep the array u[ 0..7 ] in memory for each call. +*/ +{ + word *u = S->u; + int i; + word di, zzz, ui, sav, rpi; + longword ltmp; + int j; + + __pragma_loopbound(13, 120); + for (j = 0; j < k_n; ++j) { + + di = sav = *s; + + __pragma_loopbound(8, 8); + for (i = 0; i < 8; i++) { /* YYY */ + + ui = u[i]; + rpi = rp[i]; + u[i] = sav; + + zzz = GSM_MULT_R(rpi, di); + sav = GSM_ADD(ui, zzz); + + zzz = GSM_MULT_R(rpi, ui); + di = GSM_ADD(di, zzz); + } + + *s = di; + } +} + +void +gsm_enc_Gsm_Short_Term_Analysis_Filter( + + struct gsm_state *S, + + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *s /* signal [ 0..159 ] IN/OUT */ +) { + word *LARpp_j = S->LARpp[S->j]; + word *LARpp_j_1 = S->LARpp[S->j ^= 1]; + + word LARp[8]; + +#undef FILTER +#define FILTER gsm_enc_Short_term_analysis_filtering + + gsm_enc_Decoding_of_the_coded_Log_Area_Ratios(LARc, LARpp_j); + + gsm_enc_Coefficients_0_12(LARpp_j_1, LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 13, s); + + gsm_enc_Coefficients_13_26(LARpp_j_1, LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 14, s + 13); + + gsm_enc_Coefficients_27_39(LARpp_j_1, LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 13, s + 27); + + gsm_enc_Coefficients_40_159(LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 120, s + 40); +} + +/* lpc.c */ +#undef P + +/* + 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION +*/ + +/* 4.2.4 */ + +void +gsm_enc_Autocorrelation(word *s, /* [ 0..159 ] IN/OUT */ + longword *L_ACF) /* [ 0..8 ] OUT */ +/* + The goal is to compute the array L_ACF[ k ]. The signal s[ i ] must + be scaled in order to avoid an overflow situation. +*/ +{ + int k, i; + + word temp, smax, scalauto; + + /* Dynamic scaling of the array s[ 0..159 ] + */ + + /* Search for the maximum. + */ + smax = 0; + + __pragma_loopbound(160, 160); + for (k = 0; k <= 159; k++) { + temp = GSM_ABS(s[k]); + if (temp > smax) + smax = temp; + } + + /* Computation of the scaling factor. + */ + if (smax == 0) + scalauto = 0; + else { + scalauto = 4 - gsm_enc_norm((longword) smax << 16); /* sub(4,..) */ + } + + /* Scaling of the array s[ 0...159 ] + */ + + if (scalauto > 0) { + +#define SCALE(n) \ + case n: \ + __pragma_loopbound(160, 160); \ + for (k = 0; k <= 159; k++) \ + s[k] = GSM_MULT_R(s[k], 16384 >> (n - 1)); \ + break; + + switch (scalauto) { + SCALE(1) + SCALE(2) + SCALE(3) + SCALE(4) + } +#undef SCALE + } + + /* Compute the L_ACF[ .. ]. + */ + { + word *sp = s; + word sl = *sp; +#undef STEP +#define STEP(k) L_ACF[k] += ((longword) sl * sp[-(k)]); + +#define NEXTI sl = *++sp + + __pragma_loopbound(9, 9); + for (k = 9; k--; L_ACF[k] = 0) + ; + + STEP(0); + NEXTI; + STEP(0); + STEP(1); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + STEP(6); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + STEP(6); + STEP(7); + + __pragma_loopbound(152, 152); + for (i = 8; i <= 159; i++) { + + NEXTI; + + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + STEP(6); + STEP(7); + STEP(8); + } + + __pragma_loopbound(9, 9); + for (k = 9; k--; L_ACF[k] <<= 1) + ; + } + /* Rescaling of the array s[ 0..159 ] + */ + if (scalauto > 0) { + __pragma_loopbound(160, 160); + for (k = 160; k--; *s++ <<= scalauto) + ; + } +} + +/* 4.2.5 */ + +void +gsm_enc_Reflection_coefficients(longword *L_ACF, /* 0...8 IN */ + word *r /* 0...7 OUT */ +) { + int i, m, n; + word temp; + longword ltmp; + word ACF[9]; /* 0..8 */ + word P[9]; /* 0..8 */ + word K[9]; /* 2..8 */ + + /* Schur recursion with 16 bits arithmetic. + */ + + if (L_ACF[0] == 0) { + __pragma_loopbound(8, 8); + for (i = 8; i--; *r++ = 0) + ; + return; + } + + temp = gsm_enc_norm(L_ACF[0]); + + /* ? overflow ? */ + __pragma_loopbound(9, 9); + for (i = 0; i <= 8; i++) + ACF[i] = SASR(L_ACF[i] << temp, 16); + + /* Initialize array P[ .. ] and K[ .. ] for the recursion. + */ + + __pragma_loopbound(7, 7); + for (i = 1; i <= 7; i++) + K[i] = ACF[i]; + + __pragma_loopbound(9, 9); + for (i = 0; i <= 8; i++) + P[i] = ACF[i]; + + /* Compute reflection coefficients + */ + __pragma_loopbound(8, 8); + _Pragma("marker outer-marker") for (n = 1; n <= 8; n++, r++) { + + temp = P[1]; + temp = GSM_ABS(temp); + if (P[0] < temp) { + + __pragma_loopbound(1, 8); + for (i = n; i <= 8; i++) + *r++ = 0; + _Pragma("marker inner-marker") return; + _Pragma("flowrestriction 1*inner-marker <= 36*outer-marker") + } + + *r = gsm_enc_div(temp, P[0]); + + if (P[1] > 0) + *r = -*r; /* r[ n ] = sub(0, r[ n ]) */ + if (n == 8) + return; + + /* Schur recursion + */ + temp = GSM_MULT_R(P[1], *r); + P[0] = GSM_ADD(P[0], temp); + + __pragma_loopbound(1, 7); + for (m = 1; m <= 8 - n; ++m) { + temp = GSM_MULT_R(K[m], *r); + P[m] = GSM_ADD(P[m + 1], temp); + + temp = GSM_MULT_R(P[m + 1], *r); + K[m] = GSM_ADD(K[m], temp); + } + } +} + +/* 4.2.6 */ + +void +gsm_enc_Transformation_to_Log_Area_Ratios(word *r /* 0..7 IN/OUT */ + ) +/* + The following scaling for r[ .. ] and LAR[ .. ] has been used: + + r[ .. ] = integer( real_r[ .. ]*32768. ); -1 <= real_r < 1. + LAR[ .. ] = integer( real_LAR[ .. ] * 16384 ); + with -1.625 <= real_LAR <= 1.625 +*/ +{ + word temp; + int i; + + /* Computation of the LAR[ 0..7 ] from the r[ 0..7 ] + */ + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, r++) { + + temp = *r; + temp = GSM_ABS(temp); + + if (temp < 22118) + temp >>= 1; + + else if (temp < 31130) + temp -= 11059; + + else { + temp -= 26112; + temp <<= 2; + } + + *r = *r < 0 ? -temp : temp; + } +} + +/* 4.2.7 */ + +void +gsm_enc_Quantization_and_coding(word *LAR /* [ 0..7 ] IN/OUT */ +) { + word temp; + longword ltmp; + + /* This procedure needs four tables; the following equations + give the optimum scaling for the constants: + + A[ 0..7 ] = integer( real_A[ 0..7 ] * 1024 ) + B[ 0..7 ] = integer( real_B[ 0..7 ] * 512 ) + MAC[ 0..7 ] = maximum of the LARc[ 0..7 ] + MIC[ 0..7 ] = minimum of the LARc[ 0..7 ] + */ + +#undef STEP +#define STEP(A, B, MAC, MIC) \ + temp = GSM_MULT(A, *LAR); \ + temp = GSM_ADD(temp, B); \ + temp = GSM_ADD(temp, 256); \ + temp = SASR(temp, 9); \ + *LAR = temp > MAC ? MAC - MIC : (temp < MIC ? 0 : temp - MIC); \ + LAR++; + + STEP(20480, 0, 31, -32); + STEP(20480, 0, 31, -32); + STEP(20480, 2048, 15, -16); + STEP(20480, -2560, 15, -16); + + STEP(13964, 94, 7, -8); + STEP(15360, -1792, 7, -8); + STEP(8534, -341, 3, -4); + STEP(9036, -1144, 3, -4); + +#undef STEP +} + +void +gsm_enc_Gsm_LPC_Analysis(word *s, /* 0..159 signals IN/OUT */ + word *LARc) /* 0..7 LARc's OUT */ +{ + longword L_ACF[9]; + + gsm_enc_Autocorrelation(s, L_ACF); + gsm_enc_Reflection_coefficients(L_ACF, LARc); + gsm_enc_Transformation_to_Log_Area_Ratios(LARc); + gsm_enc_Quantization_and_coding(LARc); +} + +/* preprocess.c */ +/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION + + After A-law to linear conversion (or directly from the + Ato D converter) the following scaling is assumed for + input to the RPE-LTP algorithm: + + in: 0.1.....................12 + S.v.v.v.v.v.v.v.v.v.v.v.v.*.*. + + Where S is the sign bit, v a valid bit, and * a "don't care" bit. + The original signal is called sop[ .. ] + + out: 0.1................... 12 + S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 +*/ + +void +gsm_enc_Gsm_Preprocess(struct gsm_state *S, word *s, + word *so) /* [ 0..159 ] IN/OUT */ +{ + + word z1 = S->z1; + longword L_z2 = S->L_z2; + word mp = S->mp; + + word s1; + longword L_s2; + + longword L_temp; + + word msp, lsp; + word SO; + + longword ltmp; /* for ADD */ + ulongword utmp; /* for L_ADD */ + + int k = 160; + + __pragma_loopbound(160, 160); + while (k--) { + + /* 4.2.1 Downscaling of the input signal + */ + SO = SASR(*s, 3) << 2; + s++; + + /* 4.2.2 Offset compensation + + This part implements a high-pass filter and requires extended + arithmetic precision for the recursive part of this filter. + The input of this procedure is the array so[ 0...159 ] and the + output the array sof[ 0...159 ]. + */ + /* Compute the non-recursive part + */ + + s1 = SO - z1; /* s1 = gsm_enc_sub( *so, z1 ); */ + z1 = SO; + + /* Compute the recursive part + */ + L_s2 = s1; + L_s2 <<= 15; + + /* Execution of a 31 bv 16 bits multiplication + */ + + msp = SASR(L_z2, 15); + lsp = + L_z2 - ((longword) msp << 15); /* gsm_enc_L_sub(L_z2,(msp<<15)); */ + + L_s2 += GSM_MULT_R(lsp, 32735); + L_temp = (longword) msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ + L_z2 = GSM_L_ADD(L_temp, L_s2); + + /* Compute sof[ k ] with rounding + */ + L_temp = GSM_L_ADD(L_z2, 16384); + + /* 4.2.3 Preemphasis + */ + + msp = GSM_MULT_R(mp, -28180); + mp = SASR(L_temp, 15); + *so++ = GSM_ADD(mp, msp); + } + + S->z1 = z1; + S->L_z2 = L_z2; + S->mp = mp; +} + +/* gsm_enc_bench.c */ + +word +gsm_enc_norm(longword a) +/* + the number of left shifts needed to normalize the 32 bit + variable L_var1 for positive values on the interval + + with minimum of + minimum of 1073741824 (01000000000000000000000000000000) and + maximum of 2147483647 (01111111111111111111111111111111) + + + and for negative values on the interval with + minimum of -2147483648 (-10000000000000000000000000000000) and + maximum of -1073741824 ( -1000000000000000000000000000000). + + in order to normalize the result, the following + operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); + + (That's 'ffs', only from the left, not the right..) +*/ +{ + if (a < 0) { + if (a <= -1073741824) + return 0; + a = ~a; + } + + return a & 0xffff0000 + ? (a & 0xff000000 ? -1 + gsm_enc_bitoff[0xFF & (a >> 24)] + : 7 + gsm_enc_bitoff[0xFF & (a >> 16)]) + : (a & 0xff00 ? 15 + gsm_enc_bitoff[0xFF & (a >> 8)] + : 23 + gsm_enc_bitoff[0xFF & a]); +} + +word +gsm_enc_asl(word a, int n) { + if (n >= 16) + return 0; + if (n <= -16) + return -(a < 0); + if (n < 0) + return gsm_enc_asr(a, -n); + return a << n; +} + +word +gsm_enc_asr(word a, int n) { + if (n >= 16) + return -(a < 0); + if (n <= -16) + return 0; + if (n < 0) + return a << -n; + +#ifdef SASR + return a >> n; +#else + if (a >= 0) + return a >> n; + else + return -(word) (-(uword) a >> n); +#endif +} + +/* + (From p. 46, end of section 4.2.5) + + NOTE: The following lines gives [ sic ] one correct implementation + of the div(num, denum) arithmetic operation. Compute div + which is the integer division of num by denum: with denum + >= num > 0 +*/ + +word +gsm_enc_div(word num, word denum) { + longword L_num = num; + longword L_denum = denum; + word div = 0; + int k = 15; + + /* The parameter num sometimes becomes zero. + Although this is explicitly guarded against in 4.2.5, + we assume that the result should then be zero as well. + */ + + if (num == 0) + return 0; + + __pragma_loopbound(15, 15); + while (k--) { + div <<= 1; + L_num <<= 1; + + if (L_num >= L_denum) { + L_num -= L_denum; + div++; + } + } + + return div; +} + +gsm +gsm_enc_create(void) { + unsigned int i; + gsm r; + + r = &gsm_enc_state; + + __pragma_loopbound(648, 648); + for (i = 0; i < sizeof(*r); i++) + ((char *) r)[i] = 0; + + r->nrp = 40; + + return r; +} + +void +gsm_enc_init(void) { + gsm_enc_state_ptr = gsm_enc_create(); +} + +int +gsm_enc_return(void) { + return gsm_enc_result; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +gsm_enc_main(void) { + gsm r; + unsigned i; + gsm_enc_result = 0; + + r = gsm_enc_state_ptr; + + __pragma_loopbound(20, 20); + for (i = 0; i < SAMPLES; i++) + gsm_enc_encode(r, gsm_enc_pcmdata + i * 160, + gsm_enc_gsmdata + i * sizeof(gsm_frame)); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + gsm_enc_init(); + gsm_enc_main(); + return (gsm_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/private.h b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/private.h new file mode 100644 index 0000000..21cdbab --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/default/private.h @@ -0,0 +1,54 @@ + +#ifndef PRIVATE_H +#define PRIVATE_H + +typedef short word; /* 16 bit signed int */ +typedef long longword; /* 32 bit signed int */ + +typedef unsigned short uword; /* unsigned word */ +typedef unsigned long ulongword; /* unsigned longword */ + +struct gsm_state { + + word dp0[280]; + + word z1; /* preprocessing.c, Offset_com. */ + longword L_z2; /* Offset_com. */ + int mp; /* Preemphasis */ + + word u[8]; /* short_term_aly_filter.c */ + word LARpp[2][8]; /* */ + word j; /* */ + + word nrp; /* 40 */ /* long_term.c, synthesis */ + word v[9]; /* short_term.c, synthesis */ + word msr; /* decoder.c, Postprocessing */ + + char verbose; /* only used if !NDEBUG */ + char fast; /* only used if FAST */ +}; + +#define MIN_WORD ((-32767) - 1) +#define MAX_WORD (32767) + +#define MIN_LONGWORD ((-2147483647) - 1) +#define MAX_LONGWORD (2147483647) + +#define SASR(x, by) ((x) >> (by)) + +/* Table 4.3a Decision level of the LTP gain quantizer + */ +/* bc 0 1 2 3 */ +word gsm_enc_DLB[4] = {6554, 16384, 26214, 32767}; + +/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_enc_NRFAC[8] = {29128, 26215, 23832, 21846, + 20165, 18725, 17476, 16384}; + +/* Table 4.6 Normalized direct mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_enc_FAC[8] = {18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767}; +#endif /* PRIVATE_H */ diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/data.h b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/data.h new file mode 100644 index 0000000..9123774 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/data.h @@ -0,0 +1,864 @@ + +#ifndef DATA_H +#define DATA_H + +gsm_signal gsm_enc_pcmdata[] = { + (short) 0x0000, (short) 0x0000, (short) 0x0010, (short) 0x0010, + (short) 0x0010, (short) 0x0020, (short) 0x0020, (short) 0x0018, + (short) 0x0028, (short) 0x0020, (short) 0x0020, (short) 0x0028, + (short) 0x0028, (short) 0x0020, (short) 0x0030, (short) 0x0030, + (short) 0x0028, (short) 0x0010, (short) 0x0008, (short) 0x0000, + (short) 0x0050, (short) 0x0060, (short) 0x0058, (short) 0x00D0, + (short) 0x00E0, (short) 0x00D0, (short) 0x0118, (short) 0x0128, + (short) 0x0118, (short) 0x0128, (short) 0x0110, (short) 0x0100, + (short) 0x00A0, (short) 0x0058, (short) 0x0048, (short) 0x0058, + (short) 0x0060, (short) 0x0058, (short) 0x0050, (short) 0x0048, + (short) 0x0040, (short) 0x0030, (short) 0x0020, (short) 0x0010, + (short) 0x0008, (short) 0xFFF8, (short) 0xFFE8, (short) 0xFFE0, + (short) 0xFFD8, (short) 0xFFC8, (short) 0xFFC0, (short) 0xFFC0, + (short) 0xFF98, (short) 0xFF78, (short) 0xFF78, (short) 0xFFC8, + (short) 0x0000, (short) 0x0010, (short) 0x0040, (short) 0x0060, + (short) 0x0068, (short) 0x0078, (short) 0x0078, (short) 0x0070, + (short) 0x00A8, (short) 0x00C8, (short) 0x00C8, (short) 0x00E0, + (short) 0x00F0, (short) 0x00E8, (short) 0x00F8, (short) 0x00F8, + (short) 0x00F0, (short) 0x00E0, (short) 0x00C8, (short) 0x00B8, + (short) 0x00E8, (short) 0x0100, (short) 0x00F8, (short) 0x00E8, + (short) 0x00D8, (short) 0x00C0, (short) 0x00A8, (short) 0x0020, + (short) 0xFFC0, (short) 0xFFA0, (short) 0xFFA0, (short) 0xFFA8, + (short) 0xFFB0, (short) 0xFFD0, (short) 0xFFF8, (short) 0x0000, + (short) 0x0020, (short) 0x0030, (short) 0x0030, (short) 0x0030, + (short) 0x0028, (short) 0x0020, (short) 0xFFF0, (short) 0xFFD0, + (short) 0xFFC8, (short) 0xFFC8, (short) 0xFFD0, (short) 0xFFD8, + (short) 0xFFE8, (short) 0xFFF8, (short) 0xFFF8, (short) 0x0008, + (short) 0x0018, (short) 0x0018, (short) 0x0078, (short) 0x00B8, + (short) 0x00C0, (short) 0x0100, (short) 0x0130, (short) 0x0128, + (short) 0x0108, (short) 0x00D8, (short) 0x00C0, (short) 0x0078, + (short) 0x0038, (short) 0x0020, (short) 0x0020, (short) 0x0000, + (short) 0xFFE0, (short) 0xFFE0, (short) 0xFFD8, (short) 0xFFC8, + (short) 0xFFC8, (short) 0xFFA0, (short) 0xFF88, (short) 0xFF98, + (short) 0xFF80, (short) 0xFF70, (short) 0xFF80, (short) 0xFF78, + (short) 0xFF78, (short) 0xFF90, (short) 0xFF80, (short) 0xFF78, + (short) 0xFF78, (short) 0xFF50, (short) 0xFF30, (short) 0xFF50, + (short) 0xFF38, (short) 0xFF30, (short) 0xFF40, (short) 0xFF58, + (short) 0xFF70, (short) 0xFF80, (short) 0xFF50, (short) 0xFF38, + (short) 0xFF40, (short) 0xFF18, (short) 0xFF00, (short) 0xFF08, + (short) 0xFF40, (short) 0xFF68, (short) 0xFF80, (short) 0xFF88, + (short) 0xFF88, (short) 0xFF88, (short) 0xFF88, (short) 0xFFB8, + (short) 0xFFE0, (short) 0xFFF0, (short) 0xFFD0, (short) 0xFFB8, + (short) 0xFFB8, (short) 0xFF90, (short) 0xFF70, (short) 0xFF70, + (short) 0xFF50, (short) 0xFF40, (short) 0xFF40, (short) 0xFF58, + (short) 0xFF70, (short) 0xFF80, (short) 0xFFC8, (short) 0x0000, + (short) 0x0018, (short) 0x0030, (short) 0x0048, (short) 0x0048, + (short) 0x0028, (short) 0x0008, (short) 0xFFF8, (short) 0xFFD8, + (short) 0xFFC8, (short) 0xFFB8, (short) 0xFF98, (short) 0xFF78, + (short) 0xFF70, (short) 0xFFF0, (short) 0x0058, (short) 0x0088, + (short) 0x00B8, (short) 0x00D0, (short) 0x00D8, (short) 0x00E8, + (short) 0x0138, (short) 0x0160, (short) 0x0158, (short) 0x0170, + (short) 0x0178, (short) 0x0160, (short) 0x0168, (short) 0x0160, + (short) 0x0140, (short) 0x0118, (short) 0x00F0, (short) 0x00C8, + (short) 0x0098, (short) 0x0078, (short) 0x0060, (short) 0x0018, + (short) 0xFFC0, (short) 0xFF90, (short) 0xFF48, (short) 0xFF00, + (short) 0xFEE8, (short) 0xFEC8, (short) 0xFEB8, (short) 0xFEB8, + (short) 0xFEA0, (short) 0xFE88, (short) 0xFE80, (short) 0xFEB8, + (short) 0xFEF8, (short) 0xFF38, (short) 0xFFA0, (short) 0xFFE8, + (short) 0x0008, (short) 0x0030, (short) 0x0058, (short) 0x0068, + (short) 0x0068, (short) 0x0070, (short) 0x0068, (short) 0x0050, + (short) 0x0040, (short) 0x0040, (short) 0x0020, (short) 0x0000, + (short) 0xFFE8, (short) 0xFFF0, (short) 0xFFF8, (short) 0xFFF8, + (short) 0x0038, (short) 0x0068, (short) 0x0078, (short) 0x0038, + (short) 0x0008, (short) 0xFFF0, (short) 0xFFE0, (short) 0xFFD8, + (short) 0xFFD8, (short) 0xFFE0, (short) 0xFFD0, (short) 0xFFC8, + (short) 0x0000, (short) 0x0030, (short) 0x0048, (short) 0x0068, + (short) 0x0080, (short) 0x0088, (short) 0x0088, (short) 0x0088, + (short) 0x0088, (short) 0x0088, (short) 0x0088, (short) 0x0078, + (short) 0x0098, (short) 0x00B0, (short) 0x00B8, (short) 0x0098, + (short) 0x0070, (short) 0x0058, (short) 0x0060, (short) 0x0078, + (short) 0x00A8, (short) 0x00B8, (short) 0x00A8, (short) 0x00A0, + (short) 0x0080, (short) 0x0068, (short) 0x0060, (short) 0x0058, + (short) 0x0048, (short) 0x0030, (short) 0x0038, (short) 0x0038, + (short) 0x0030, (short) 0x0050, (short) 0x0058, (short) 0x0060, + (short) 0x0030, (short) 0x0008, (short) 0xFFF8, (short) 0xFF90, + (short) 0xFF48, (short) 0xFF28, (short) 0xFF10, (short) 0xFEF8, + (short) 0xFEF0, (short) 0xFED8, (short) 0xFEB0, (short) 0xFEB0, + (short) 0xFEA8, (short) 0xFEB8, (short) 0xFED8, (short) 0xFEF8, + (short) 0xFF10, (short) 0xFF20, (short) 0xFF40, (short) 0xFF58, + (short) 0xFF80, (short) 0xFFA0, (short) 0xFFB8, (short) 0xFFC8, + (short) 0xFFD8, (short) 0xFFE0, (short) 0xFFF0, (short) 0x0048, + (short) 0x0098, (short) 0x00B0, (short) 0x0068, (short) 0x0018, + (short) 0xFFF8, (short) 0xFFE8, (short) 0xFFF0, (short) 0xFFF8, + (short) 0x0020, (short) 0x0038, (short) 0x0038, (short) 0x0050, + (short) 0x0068, (short) 0x0070, (short) 0x0068, (short) 0x0060, + (short) 0x0060, (short) 0x0038, (short) 0x0020, (short) 0x0018, + (short) 0x0040, (short) 0x0060, (short) 0x0068, (short) 0x0040, + (short) 0x0010, (short) 0x0000, (short) 0xFFB0, (short) 0xFF78, + (short) 0xFF70, (short) 0xFF90, (short) 0xFFA8, (short) 0xFFC8, + (short) 0xFF98, (short) 0xFF50, (short) 0xFF50, (short) 0xFF50, + (short) 0xFF58, (short) 0xFF68, (short) 0xFF48, (short) 0xFF20, + (short) 0xFF18, (short) 0xFF38, (short) 0xFF60, (short) 0xFF70, + (short) 0xFF80, (short) 0xFF98, (short) 0xFFA0, (short) 0xFFB8, + (short) 0xFFD0, (short) 0xFFE0, (short) 0x0018, (short) 0x0048, + (short) 0x0058, (short) 0x00B0, (short) 0x00F8, (short) 0x0108, + (short) 0x0118, (short) 0x0120, (short) 0x0118, (short) 0x0130, + (short) 0x0148, (short) 0x0140, (short) 0x0130, (short) 0x0120, + (short) 0x0108, (short) 0x0098, (short) 0x0038, (short) 0x0018, + (short) 0xFFD0, (short) 0xFF90, (short) 0xFF80, (short) 0xFF58, + (short) 0xFF38, (short) 0xFF30, (short) 0xFF48, (short) 0xFF68, + (short) 0xFF78, (short) 0xFF88, (short) 0xFFB8, (short) 0xFFD8, + (short) 0xFFE8, (short) 0xFFD8, (short) 0xFFF0, (short) 0x0010, + (short) 0x0020, (short) 0x0020, (short) 0x0018, (short) 0x0028, + (short) 0x0030, (short) 0x0030, (short) 0x0038, (short) 0x0060, + (short) 0x0080, (short) 0x0080, (short) 0x00B0, (short) 0x00D8, + (short) 0x00D0, (short) 0x00B8, (short) 0x00A8, (short) 0x00A8, + (short) 0x00A0, (short) 0x0090, (short) 0x0078, (short) 0x0070, + (short) 0x0068, (short) 0x0048, (short) 0x0018, (short) 0x0008, + (short) 0x0008, (short) 0x0000, (short) 0x0000, (short) 0xFFE8, + (short) 0xFFB0, (short) 0xFF90, (short) 0xFF88, (short) 0xFF70, + (short) 0xFF60, (short) 0xFF60, (short) 0xFF90, (short) 0xFFC0, + (short) 0xFFD0, (short) 0xFFD8, (short) 0xFFE0, (short) 0xFFE8, + (short) 0x0018, (short) 0x0050, (short) 0x0058, (short) 0x0030, + (short) 0x0008, (short) 0x0000, (short) 0x0018, (short) 0x0038, + (short) 0x0038, (short) 0x0048, (short) 0x0050, (short) 0x0050, + (short) 0x0020, (short) 0x0000, (short) 0xFFF8, (short) 0xFFB0, + (short) 0xFF70, (short) 0xFF68, (short) 0xFFB0, (short) 0xFFE8, + (short) 0xFFF8, (short) 0xFFF8, (short) 0xFFF8, (short) 0xFFF0, + (short) 0x0030, (short) 0x0070, (short) 0x0090, (short) 0x0098, + (short) 0x0098, (short) 0x0090, (short) 0x00A0, (short) 0x00B0, + (short) 0x00B8, (short) 0x00C0, (short) 0x00C0, (short) 0x00A8, + (short) 0x0098, (short) 0x0088, (short) 0x0078, (short) 0x0050, + (short) 0x0030, (short) 0x0020, (short) 0xFFD8, (short) 0xFF98, + (short) 0xFF88, (short) 0xFF50, (short) 0xFF20, (short) 0xFF18, + (short) 0xFEF8, (short) 0xFEE0, (short) 0xFEE8, (short) 0xFE70, + (short) 0xFE08, (short) 0xFE00, (short) 0xFE48, (short) 0xFE98, + (short) 0xFEB8, (short) 0xFEE8, (short) 0xFF10, (short) 0xFF28, + (short) 0xFF18, (short) 0xFF10, (short) 0xFF18, (short) 0xFF48, + (short) 0xFF70, (short) 0xFF88, (short) 0xFFE0, (short) 0x0028, + (short) 0x0040, (short) 0x0058, (short) 0x0068, (short) 0x0070, + (short) 0x0078, (short) 0x0070, (short) 0x0068, (short) 0x0068, + (short) 0x0078, (short) 0x0080, (short) 0x0080, (short) 0x0088, + (short) 0x0088, (short) 0x0080, (short) 0x0058, (short) 0x0030, + (short) 0x0020, (short) 0x0018, (short) 0x0018, (short) 0x0018, + (short) 0x0050, (short) 0x0090, (short) 0x00A0, (short) 0x0080, + (short) 0x0060, (short) 0x0050, (short) 0x0030, (short) 0x0018, + (short) 0x0010, (short) 0x0028, (short) 0x0038, (short) 0x0038, + (short) 0x0018, (short) 0xFFF8, (short) 0xFFF0, (short) 0x0000, + (short) 0x0020, (short) 0x0020, (short) 0x0030, (short) 0x0030, + (short) 0x0030, (short) 0x0040, (short) 0x0050, (short) 0x0050, + (short) 0x0050, (short) 0x0048, (short) 0x0048, (short) 0x0048, + (short) 0x0048, (short) 0x0048, (short) 0x0078, (short) 0x00A0, + (short) 0x00A8, (short) 0x00C0, (short) 0x00C8, (short) 0x00C0, + (short) 0x00D0, (short) 0x00E0, (short) 0x00D8, (short) 0x00E8, + (short) 0x00F0, (short) 0x00E0, (short) 0x0100, (short) 0x0118, + (short) 0x0110, (short) 0x0100, (short) 0x00F0, (short) 0x00D8, + (short) 0x0090, (short) 0x0048, (short) 0x0028, (short) 0x0020, + (short) 0x0020, (short) 0x0020, (short) 0x0038, (short) 0x0050, + (short) 0x0050, (short) 0x0050, (short) 0x0048, (short) 0x0040, + (short) 0x0050, (short) 0x0060, (short) 0x0060, (short) 0x0040, + (short) 0xFFC0, (short) 0xFF58, (short) 0xFF40, (short) 0xFF90, + (short) 0xFFE8, (short) 0x0000, (short) 0x0020, (short) 0x0030, + (short) 0x0030, (short) 0x0068, (short) 0x0098, (short) 0x00A8, + (short) 0x0110, (short) 0x0168, (short) 0x0170, (short) 0x0148, + (short) 0x0118, (short) 0x00F0, (short) 0x00E8, (short) 0x00E0, + (short) 0x00D0, (short) 0x0098, (short) 0x0060, (short) 0x0040, + (short) 0x0000, (short) 0xFFD8, (short) 0xFFD8, (short) 0xFFC0, + (short) 0xFFB0, (short) 0xFFB0, (short) 0xFF78, (short) 0xFF30, + (short) 0xFF10, (short) 0xFEF0, (short) 0xFEE8, (short) 0xFEF0, + (short) 0xFEC8, (short) 0xFED0, (short) 0xFEF8, (short) 0xFF00, + (short) 0xFF10, (short) 0xFF20, (short) 0xFF50, (short) 0xFF78, + (short) 0xFF90, (short) 0xFF80, (short) 0xFF70, (short) 0xFF70, + (short) 0xFF80, (short) 0xFF98, (short) 0xFFA0, (short) 0xFFB8, + (short) 0xFFD0, (short) 0xFFD8, (short) 0xFFF0, (short) 0x0000, + (short) 0x0008, (short) 0x0028, (short) 0x0048, (short) 0x0058, + (short) 0x0078, (short) 0x0070, (short) 0x0058, (short) 0x0068, + (short) 0x0098, (short) 0x00B8, (short) 0x00D8, (short) 0x00F0, + (short) 0x00F0, (short) 0x00E8, (short) 0x00F8, (short) 0x0100, + (short) 0x00D8, (short) 0x00D0, (short) 0x00C8, (short) 0x00E8, + (short) 0x0100, (short) 0x00F0, (short) 0x00E0, (short) 0x00C8, + (short) 0x00B8, (short) 0x00A0, (short) 0x0078, (short) 0x0058, + (short) 0x0038, (short) 0x0020, (short) 0x0010, (short) 0x0010, + (short) 0x0018, (short) 0x0010, (short) 0x0010, (short) 0x0010, + (short) 0x0018, (short) 0x0028, (short) 0x0008, (short) 0xFFE0, + (short) 0xFFC8, (short) 0xFF80, (short) 0xFF48, (short) 0xFF38, + (short) 0xFF40, (short) 0xFF48, (short) 0xFF48, (short) 0xFF70, + (short) 0xFF90, (short) 0xFFA8, (short) 0xFFB8, (short) 0xFFC0, + (short) 0xFFC8, (short) 0xFFC0, (short) 0xFFC0, (short) 0xFFC0, + (short) 0xFFB0, (short) 0xFFA0, (short) 0xFFA0, (short) 0xFFA0, + (short) 0xFFA8, (short) 0xFFB0, (short) 0xFF68, (short) 0xFF28, + (short) 0xFF08, (short) 0xFEF8, (short) 0xFEF8, (short) 0xFEE8, + (short) 0xFEE0, (short) 0xFED8, (short) 0xFEA8, (short) 0xFE98, + (short) 0xFEA8, (short) 0xFEA8, (short) 0xFEA0, (short) 0xFEA0, + (short) 0xFED0, (short) 0xFF00, (short) 0xFF30, (short) 0xFF28, + (short) 0xFF38, (short) 0xFF58, (short) 0xFF48, (short) 0xFF40, + (short) 0xFF48, (short) 0xFFB0, (short) 0x0010, (short) 0x0038, + (short) 0x0028, (short) 0x0010, (short) 0x0008, (short) 0x0050, + (short) 0x00A0, (short) 0x00B8, (short) 0x00A0, (short) 0x0080, + (short) 0x0070, (short) 0x0090, (short) 0x00B0, (short) 0x00B0, + (short) 0x00B8, (short) 0x00B8, (short) 0x00B0, (short) 0x00C0, + (short) 0x00D0, (short) 0x00C8, (short) 0x00A0, (short) 0x0068, + (short) 0x0038, (short) 0xFFF0, (short) 0xFFB0, (short) 0xFF88, + (short) 0xFF78, (short) 0xFF68, (short) 0xFF60, (short) 0xFF90, + (short) 0xFFC0, (short) 0xFFE0, (short) 0x0000, (short) 0x0020, + (short) 0x0030, (short) 0x00A0, (short) 0x0110, (short) 0x0138, + (short) 0x0140, (short) 0x0148, (short) 0x0148, (short) 0x0110, + (short) 0x00E8, (short) 0x00C0, (short) 0x00A0, (short) 0x0088, + (short) 0x0068, (short) 0x0008, (short) 0xFFB0, (short) 0xFF88, + (short) 0xFF58, (short) 0xFF30, (short) 0xFF20, (short) 0xFEF8, + (short) 0xFED8, (short) 0xFED8, (short) 0xFF00, (short) 0xFF20, + (short) 0xFF38, (short) 0xFF50, (short) 0xFF68, (short) 0xFF88, + (short) 0xFFA0, (short) 0xFFB8, (short) 0x0020, (short) 0x0080, + (short) 0x00A0, (short) 0x00D8, (short) 0x0100, (short) 0x0100, + (short) 0x0138, (short) 0x0168, (short) 0x0148, (short) 0x0128, + (short) 0x0120, (short) 0x00F8, (short) 0x00E8, (short) 0x00E0, + (short) 0x00C0, (short) 0x00A8, (short) 0x00B0, (short) 0x0098, + (short) 0x0070, (short) 0x0048, (short) 0x0030, (short) 0xFFD0, + (short) 0xFF60, (short) 0xFF48, (short) 0xFF10, (short) 0xFEA8, + (short) 0xFEA8, (short) 0xFEC0, (short) 0xFEC0, (short) 0xFEE8, + (short) 0xFEB0, (short) 0xFE58, (short) 0xFE88, (short) 0xFED0, + (short) 0xFEB8, (short) 0xFE48, (short) 0xFE58, (short) 0xFEE8, + (short) 0xFF28, (short) 0xFF18, (short) 0xFF60, (short) 0x00A0, + (short) 0x01A0, (short) 0x0188, (short) 0x0178, (short) 0x0208, + (short) 0x0208, (short) 0x0100, (short) 0x0018, (short) 0xFFE0, + (short) 0xFEE0, (short) 0xFD68, (short) 0xFD00, (short) 0xFD60, + (short) 0xFD70, (short) 0xFDA8, (short) 0xFF00, (short) 0x00A0, + (short) 0x0170, (short) 0x0210, (short) 0x02D8, (short) 0x0310, + (short) 0x0218, (short) 0x00A0, (short) 0xFFA0, (short) 0xFDF0, + (short) 0xFBD8, (short) 0xFB08, (short) 0xF9C0, (short) 0xF830, + (short) 0xF8D8, (short) 0xFCC0, (short) 0x0038, (short) 0x01A0, + (short) 0x0380, (short) 0x0A18, (short) 0x0F50, (short) 0x0DB0, + (short) 0x0C30, (short) 0x0E18, (short) 0x0CA8, (short) 0x0570, + (short) 0xFF98, (short) 0xFE38, (short) 0xFBA0, (short) 0xF700, + (short) 0xF5D0, (short) 0xF7C8, (short) 0xF9A8, (short) 0xFB48, + (short) 0xFBB0, (short) 0xFC78, (short) 0xFF00, (short) 0xFE98, + (short) 0xFB20, (short) 0xFA48, (short) 0xFAC0, (short) 0xF8C8, + (short) 0xF6E0, (short) 0xF9C0, (short) 0xFE08, (short) 0xFF80, + (short) 0x0428, (short) 0x0B70, (short) 0x0E18, (short) 0x0D38, + (short) 0x0D38, (short) 0x0C28, (short) 0x01D0, (short) 0xF578, + (short) 0xF108, (short) 0xFB50, (short) 0x0498, (short) 0x0428, + (short) 0x0CE8, (short) 0x2190, (short) 0x29F0, (short) 0x22E0, + (short) 0x1F68, (short) 0x2050, (short) 0x1810, (short) 0x0710, + (short) 0xFA98, (short) 0xF438, (short) 0xEE68, (short) 0xE950, + (short) 0xEBC8, (short) 0xF538, (short) 0xFEB8, (short) 0x0240, + (short) 0x0460, (short) 0x09D0, (short) 0x0978, (short) 0xFFF8, + (short) 0xF810, (short) 0xF190, (short) 0xE8D0, (short) 0xE290, + (short) 0xDF60, (short) 0xDFF0, (short) 0xE668, (short) 0xEC20, + (short) 0xF138, (short) 0xFAC0, (short) 0x04F0, (short) 0x08D0, + (short) 0x08C8, (short) 0x0B18, (short) 0x09F8, (short) 0x0230, + (short) 0xFA38, (short) 0xFA68, (short) 0xFC78, (short) 0xF9B8, + (short) 0xF850, (short) 0xFEA8, (short) 0x05B8, (short) 0x0690, + (short) 0x02E8, (short) 0x0268, (short) 0x0498, (short) 0xFCB0, + (short) 0xF018, (short) 0xEDF8, (short) 0x0090, (short) 0x0F48, + (short) 0x0C70, (short) 0x1278, (short) 0x27B8, (short) 0x2EA0, + (short) 0x21F8, (short) 0x1920, (short) 0x1918, (short) 0x1530, + (short) 0x0638, (short) 0xF858, (short) 0xF720, (short) 0xF9F8, + (short) 0xF600, (short) 0xF850, (short) 0x0590, (short) 0x0EE0, + (short) 0x1000, (short) 0x10D8, (short) 0x1460, (short) 0x10F8, + (short) 0x0500, (short) 0xFBC0, (short) 0xF7A8, (short) 0xF250, + (short) 0xEC00, (short) 0xEB30, (short) 0xF1C8, (short) 0xF920, + (short) 0xFC90, (short) 0x0190, (short) 0x0A60, (short) 0x0E80, + (short) 0x0DB0, (short) 0x0AD8, (short) 0x0690, (short) 0x0168, + (short) 0xFF20, (short) 0xFBD0, (short) 0xF6F8, (short) 0xF660, + (short) 0xF680, (short) 0xF5B0, (short) 0xF7C0, (short) 0xF120, + (short) 0xEA90, (short) 0xF030, (short) 0xEC18, (short) 0xE190, + (short) 0xE558, (short) 0xFF20, (short) 0x1090, (short) 0x0C50, + (short) 0x1248, (short) 0x2788, (short) 0x2AD0, (short) 0x1628, + (short) 0x08F0, (short) 0x0BA8, (short) 0x0538, (short) 0xEF48, + (short) 0xE410, (short) 0xEB10, (short) 0xEF68, (short) 0xEA28, + (short) 0xEC40, (short) 0xFC18, (short) 0x08A8, (short) 0x0818, + (short) 0x0778, (short) 0x0858, (short) 0x02F8, (short) 0xF8E8, + (short) 0xF1F0, (short) 0xEF40, (short) 0xECD0, (short) 0xE958, + (short) 0xEA70, (short) 0xF260, (short) 0xFAF0, (short) 0xFFA0, + (short) 0x04A0, (short) 0x0CF8, (short) 0x10F8, (short) 0x0EA0, + (short) 0x0D48, (short) 0x0BE8, (short) 0x05E0, (short) 0x03B0, + (short) 0x0358, (short) 0xFF18, (short) 0xFB40, (short) 0xF9B0, + (short) 0xF9C0, (short) 0xF7C0, (short) 0xEE90, (short) 0xEAA0, + (short) 0xEE00, (short) 0xE888, (short) 0xE200, (short) 0xEF00, + (short) 0x0948, (short) 0x1400, (short) 0x1270, (short) 0x1D88, + (short) 0x2CD8, (short) 0x2488, (short) 0x0DA8, (short) 0x04B8, + (short) 0x0548, (short) 0xF7B0, (short) 0xE3F0, (short) 0xE268, + (short) 0xEFF8, (short) 0xF5A0, (short) 0xF320, (short) 0xFC68, + (short) 0x0BF0, (short) 0x0FA0, (short) 0x0A50, (short) 0x01F8, + (short) 0xFE60, (short) 0xFC48, (short) 0xF340, (short) 0xEB28, + (short) 0xED58, (short) 0xF3C0, (short) 0xF5B8, (short) 0xF738, + (short) 0x00F8, (short) 0x0C70, (short) 0x0E90, (short) 0x0DE8, + (short) 0x1190, (short) 0x12B0, (short) 0x1058, (short) 0x0B98, + (short) 0x0638, (short) 0x0868, (short) 0x0998, (short) 0x02B0, + (short) 0xFE50, (short) 0x0120, (short) 0x02A0, (short) 0xFC90, + (short) 0xF810, (short) 0xF9D0, (short) 0xF818, (short) 0xF290, + (short) 0xF240, (short) 0xF6D0, (short) 0x0A48, (short) 0x1AD8, + (short) 0x1840, (short) 0x1C18, (short) 0x2B18, (short) 0x29F0, + (short) 0x1608, (short) 0x08B8, (short) 0x0778, (short) 0x0128, + (short) 0xF118, (short) 0xE868, (short) 0xEDA0, (short) 0xF310, + (short) 0xF248, (short) 0xF558, (short) 0x0058, (short) 0x0970, + (short) 0x0688, (short) 0x0108, (short) 0xFD08, (short) 0xF988, + (short) 0xF558, (short) 0xF0A0, (short) 0xF0B0, (short) 0xF540, + (short) 0xF6E8, (short) 0xFCA0, (short) 0x0758, (short) 0x0CD0, + (short) 0x0F60, (short) 0x1338, (short) 0x1458, (short) 0x1278, + (short) 0x0FD0, (short) 0x0CA8, (short) 0x0D50, (short) 0x0D10, + (short) 0x0798, (short) 0x0398, (short) 0x0428, (short) 0x04F0, + (short) 0x0278, (short) 0xFF98, (short) 0x0178, (short) 0x0088, + (short) 0xFB08, (short) 0xF660, (short) 0xF1A8, (short) 0xEF18, + (short) 0xF9E8, (short) 0x0C00, (short) 0x11C8, (short) 0x1260, + (short) 0x1B60, (short) 0x21B0, (short) 0x18E0, (short) 0x0B08, + (short) 0x04C8, (short) 0x0078, (short) 0xF730, (short) 0xEF60, + (short) 0xEB18, (short) 0xEC10, (short) 0xF290, (short) 0xF800, + (short) 0xFB60, (short) 0xFF60, (short) 0x0080, (short) 0xFFA8, + (short) 0xFB08, (short) 0xF1A8, (short) 0xED10, (short) 0xEFF0, + (short) 0xEED0, (short) 0xEB10, (short) 0xEFE8, (short) 0xF8F0, + (short) 0xFDE0, (short) 0x0298, (short) 0x0528, (short) 0x0598, + (short) 0x0928, (short) 0x0A30, (short) 0x0670, (short) 0x08E8, + (short) 0x0BC0, (short) 0x0698, (short) 0x0210, (short) 0x0390, + (short) 0x0560, (short) 0x0288, (short) 0xF910, (short) 0xF468, + (short) 0xF560, (short) 0xF3E0, (short) 0xEE10, (short) 0xE8B0, + (short) 0xE508, (short) 0xEED0, (short) 0x03E0, (short) 0x0638, + (short) 0xFFA8, (short) 0x0BB8, (short) 0x2078, (short) 0x1FA8, + (short) 0x0EF0, (short) 0x0648, (short) 0x05C8, (short) 0xFF18, + (short) 0xF588, (short) 0xEE20, (short) 0xED88, (short) 0xF5A0, + (short) 0xFBA8, (short) 0xFBC0, (short) 0xFA98, (short) 0xFA20, + (short) 0xF7D8, (short) 0xF2D0, (short) 0xEF48, (short) 0xE998, + (short) 0xE378, (short) 0xE530, (short) 0xE868, (short) 0xE890, + (short) 0xEDD0, (short) 0xF798, (short) 0xFBC0, (short) 0xFD20, + (short) 0x0178, (short) 0x0490, (short) 0x04A0, (short) 0x0758, + (short) 0x0858, (short) 0x0490, (short) 0x04F8, (short) 0x0858, + (short) 0x06F0, (short) 0x05F8, (short) 0x0450, (short) 0x0098, + (short) 0xFE60, (short) 0xFDA0, (short) 0xF9E0, (short) 0xF358, + (short) 0xEDC0, (short) 0xF308, (short) 0xFFE0, (short) 0x0018, + (short) 0xFB80, (short) 0x0948, (short) 0x1DB8, (short) 0x1D08, + (short) 0x0F88, (short) 0x0B48, (short) 0x0C50, (short) 0x09C0, + (short) 0xFF78, (short) 0xF1A0, (short) 0xEF28, (short) 0xF6B8, + (short) 0xF9F0, (short) 0xF6F0, (short) 0xF688, (short) 0xF9E0, + (short) 0xF9C0, (short) 0xF4C8, (short) 0xEBD8, (short) 0xE7E8, + (short) 0xEBE0, (short) 0xE8C8, (short) 0xE100, (short) 0xE518, + (short) 0xF0B8, (short) 0xF728, (short) 0xF770, (short) 0xF878, + (short) 0xFF58, (short) 0x06B0, (short) 0x0430, (short) 0x0060, + (short) 0x0390, (short) 0x0A18, (short) 0x0B98, (short) 0x06C8, + (short) 0x0710, (short) 0x0CF0, (short) 0x08D0, (short) 0x01F8, + (short) 0x0280, (short) 0x0238, (short) 0xFD78, (short) 0xF868, + (short) 0xF198, (short) 0xF670, (short) 0x0930, (short) 0x0A78, + (short) 0xFB38, (short) 0x04F0, (short) 0x1EB8, (short) 0x1E98, + (short) 0x0F68, (short) 0x0EC8, (short) 0x1548, (short) 0x1480, + (short) 0x0C60, (short) 0x00B0, (short) 0xFEF8, (short) 0x0830, + (short) 0x0838, (short) 0x0160, (short) 0x0380, (short) 0x07E8, + (short) 0x0270, (short) 0xFBA0, (short) 0xF9C0, (short) 0xF450, + (short) 0xEE08, (short) 0xED08, (short) 0xEE10, (short) 0xEF20, + (short) 0xF1C0, (short) 0xF800, (short) 0xFE70, (short) 0x00B0, + (short) 0x02D8, (short) 0x07C8, (short) 0x09F0, (short) 0x09A8, + (short) 0x0A60, (short) 0x0B28, (short) 0x0C80, (short) 0x0D58, + (short) 0x0BD0, (short) 0x0A48, (short) 0x0900, (short) 0x0768, + (short) 0x03D0, (short) 0x00E0, (short) 0xFFF8, (short) 0xFBD8, + (short) 0xF5E8, (short) 0xFE18, (short) 0x0FE8, (short) 0x1060, + (short) 0x05C8, (short) 0x1078, (short) 0x2638, (short) 0x2580, + (short) 0x1740, (short) 0x14E8, (short) 0x19D0, (short) 0x17D8, + (short) 0x0E10, (short) 0x0270, (short) 0x0120, (short) 0x0900, + (short) 0x0870, (short) 0x0290, (short) 0x03A0, (short) 0x0600, + (short) 0x0100, (short) 0xFE28, (short) 0xFF28, (short) 0xF838, + (short) 0xF0B8, (short) 0xF238, (short) 0xF530, (short) 0xF440, + (short) 0xF440, (short) 0xFA38, (short) 0x0198, (short) 0x03A8, + (short) 0x03D0, (short) 0x0780, (short) 0x0AB8, (short) 0x0B58, + (short) 0x0B10, (short) 0x0AD8, (short) 0x0A08, (short) 0x0878, + (short) 0x07C8, (short) 0x0648, (short) 0x01A0, (short) 0xFF48, + (short) 0xFE58, (short) 0xFA68, (short) 0xF7D0, (short) 0xF758, + (short) 0xF470, (short) 0xF5B0, (short) 0x02A8, (short) 0x0A58, + (short) 0x0448, (short) 0x07C8, (short) 0x1708, (short) 0x1970, + (short) 0x0EC8, (short) 0x0A40, (short) 0x0CD0, (short) 0x0D28, + (short) 0x0838, (short) 0x0010, (short) 0xFAE0, (short) 0xFCB0, + (short) 0xFEB8, (short) 0xFCE8, (short) 0xFBA8, (short) 0xFD10, + (short) 0xFBC8, (short) 0xF910, (short) 0xF960, (short) 0xF830, + (short) 0xF4D8, (short) 0xF500, (short) 0xF860, (short) 0xF9F0, + (short) 0xFB58, (short) 0xFE48, (short) 0x0050, (short) 0x0418, + (short) 0x0910, (short) 0x0940, (short) 0x0830, (short) 0x0AC8, + (short) 0x0C88, (short) 0x0A50, (short) 0x07C0, (short) 0x0700, + (short) 0x0590, (short) 0x0268, (short) 0xFFF0, (short) 0xFBA8, + (short) 0xF720, (short) 0xF698, (short) 0xF2E0, (short) 0xEB68, + (short) 0xEDA0, (short) 0xFC00, (short) 0x0358, (short) 0xFF30, + (short) 0x0398, (short) 0x1220, (short) 0x1860, (short) 0x1368, + (short) 0x10C0, (short) 0x12F0, (short) 0x12A0, (short) 0x0E08, + (short) 0x0780, (short) 0x0010, (short) 0xFAD8, (short) 0xF990, + (short) 0xF7E0, (short) 0xF278, (short) 0xEE10, (short) 0xEB98, + (short) 0xE7A0, (short) 0xE6F8, (short) 0xEA30, (short) 0xE980, + (short) 0xE420, (short) 0xE440, (short) 0xEBA8, (short) 0xEF98, + (short) 0xEF68, (short) 0xF288, (short) 0xF7A8, (short) 0xFC90, + (short) 0x01F8, (short) 0x0528, (short) 0x0630, (short) 0x08E8, + (short) 0x0C98, (short) 0x0D50, (short) 0x0B98, (short) 0x0920, + (short) 0x0678, (short) 0x03F0, (short) 0x0260, (short) 0xFE00, + (short) 0xF810, (short) 0xF4B8, (short) 0xF0C0, (short) 0xEB68, + (short) 0xEF58, (short) 0xFAE8, (short) 0xFDE0, (short) 0xF680, + (short) 0xF910, (short) 0x06E0, (short) 0x0C20, (short) 0x05D8, + (short) 0x0408, (short) 0x05C8, (short) 0x0450, (short) 0x02D0, + (short) 0x0128, (short) 0xFB78, (short) 0xF668, (short) 0xF430, + (short) 0xF150, (short) 0xED90, (short) 0xE870, (short) 0xE448, + (short) 0xE2E0, (short) 0xE048, (short) 0xDDD0, (short) 0xDF08, + (short) 0xE0E0, (short) 0xE098, (short) 0xE258, (short) 0xE520, + (short) 0xE6A8, (short) 0xEA28, (short) 0xEF88, (short) 0xF2A8, + (short) 0xF548, (short) 0xFBA8, (short) 0x01C8, (short) 0x03F8, + (short) 0x0748, (short) 0x0C88, (short) 0x0E98, (short) 0x0DB8, + (short) 0x0D98, (short) 0x0D50, (short) 0x0B68, (short) 0x0970, + (short) 0x06C0, (short) 0x0238, (short) 0xFE18, (short) 0xFB08, + (short) 0xF820, (short) 0xF780, (short) 0xF970, (short) 0xF9B0, + (short) 0xF880, (short) 0xFA28, (short) 0x0028, (short) 0x0698, + (short) 0x0948, (short) 0x08D0, (short) 0x09E0, (short) 0x0DD0, + (short) 0x1010, (short) 0x0D40, (short) 0x0958, (short) 0x0728, + (short) 0x0308, (short) 0xFDA0, (short) 0xF9F8, (short) 0xF418, + (short) 0xEC98, (short) 0xE8B8, (short) 0xE618, (short) 0xE200, + (short) 0xDED0, (short) 0xDF48, (short) 0xE100, (short) 0xE180, + (short) 0xE160, (short) 0xE3C8, (short) 0xE898, (short) 0xEDD8, + (short) 0xF250, (short) 0xF558, (short) 0xFB00, (short) 0x02F8, + (short) 0x07B0, (short) 0x0B80, (short) 0x1108, (short) 0x1518, + (short) 0x1660, (short) 0x1770, (short) 0x1870, (short) 0x16F8, + (short) 0x1300, (short) 0x0F78, (short) 0x0FC0, (short) 0x1070, + (short) 0x0CE8, (short) 0x0AF8, (short) 0x0BD8, (short) 0x0D28, + (short) 0x10A8, (short) 0x1370, (short) 0x10A0, (short) 0x1040, + (short) 0x1518, (short) 0x1740, (short) 0x1550, (short) 0x1398, + (short) 0x10E0, (short) 0x0AC8, (short) 0x0640, (short) 0x0348, + (short) 0xFD18, (short) 0xF658, (short) 0xF1D8, (short) 0xEC20, + (short) 0xE760, (short) 0xE550, (short) 0xE4B8, (short) 0xE418, + (short) 0xE438, (short) 0xE508, (short) 0xE738, (short) 0xEB18, + (short) 0xF0C8, (short) 0xF618, (short) 0xF988, (short) 0xFEC8, + (short) 0x0518, (short) 0x09D8, (short) 0x1118, (short) 0x17F0, + (short) 0x1BB0, (short) 0x1E28, (short) 0x2120, (short) 0x23D8, + (short) 0x2638, (short) 0x2418, (short) 0x2080, (short) 0x1D30, + (short) 0x1CE8, (short) 0x1D98, (short) 0x1CA8, (short) 0x1AD8, + (short) 0x1960, (short) 0x17F8, (short) 0x1A40, (short) 0x1CF8, + (short) 0x1D38, (short) 0x1C30, (short) 0x1A68, (short) 0x1860, + (short) 0x1480, (short) 0x1020, (short) 0x0B68, (short) 0x03E8, + (short) 0xFBA8, (short) 0xF508, (short) 0xEE40, (short) 0xE820, + (short) 0xE338, (short) 0xDE88, (short) 0xDA30, (short) 0xD7D0, + (short) 0xD728, (short) 0xD7D8, (short) 0xD998, (short) 0xDC10, + (short) 0xDFB0, (short) 0xE470, (short) 0xE948, (short) 0xEF98, + (short) 0xF5F0, (short) 0xFC38, (short) 0x0228, (short) 0x0798, + (short) 0x0D98, (short) 0x1320, (short) 0x1760, (short) 0x1A70, + (short) 0x1BE0, (short) 0x1CC0, (short) 0x1D98, (short) 0x1A88, + (short) 0x1658, (short) 0x12A0, (short) 0x1180, (short) 0x10A8, + (short) 0x0ED0, (short) 0x0CC8, (short) 0x0AD8, (short) 0x0920, + (short) 0x0B70, (short) 0x0E30, (short) 0x0EE8, (short) 0x0D80, + (short) 0x0BE0, (short) 0x0AC0, (short) 0x09B8, (short) 0x0890, + (short) 0x0690, (short) 0x01F8, (short) 0xFD30, (short) 0xF9F0, + (short) 0xF5B0, (short) 0xF188, (short) 0xEE38, (short) 0xE9E8, + (short) 0xE5E8, (short) 0xE3E0, (short) 0xE4A0, (short) 0xE608, + (short) 0xE738, (short) 0xE858, (short) 0xE980, (short) 0xEC20, + (short) 0xF030, (short) 0xF450, (short) 0xF878, (short) 0xFC68, + (short) 0xFF68, (short) 0x03C8, (short) 0x08B8, (short) 0x0D00, + (short) 0x1038, (short) 0x12D8, (short) 0x1490, (short) 0x1648, + (short) 0x16B8, (short) 0x1468, (short) 0x1160, (short) 0x0FA8, + (short) 0x1038, (short) 0x1058, (short) 0x0F88, (short) 0x0E50, + (short) 0x0CC8, (short) 0x0CC0, (short) 0x0FC0, (short) 0x1220, + (short) 0x12A0, (short) 0x10F8, (short) 0x0F20, (short) 0x0D28, + (short) 0x0C78, (short) 0x0BB8, (short) 0x08D0, (short) 0x01C8, + (short) 0xFB38, (short) 0xF660, (short) 0xF330, (short) 0xF078, + (short) 0xEC28, (short) 0xE6C8, (short) 0xE2C0, (short) 0xE050, + (short) 0xDFC8, (short) 0xE038, (short) 0xE160, (short) 0xE300, + (short) 0xE568, (short) 0xE6B8, (short) 0xE9A0, (short) 0xED50, + (short) 0xF238, (short) 0xF6D8, (short) 0xFB08, (short) 0xFF10, + (short) 0x02E8, (short) 0x06A0, (short) 0x0AC0, (short) 0x0DC8, + (short) 0x1010, (short) 0x1168, (short) 0x1018, (short) 0x0E90, + (short) 0x0BF8, (short) 0x0B08, (short) 0x0A50, (short) 0x09F0, + (short) 0x0960, (short) 0x0888, (short) 0x0808, (short) 0x09C8, + (short) 0x0BA8, (short) 0x0EE8, (short) 0x1070, (short) 0x10D0, + (short) 0x0F58, (short) 0x0D60, (short) 0x0BA0, (short) 0x0A60, + (short) 0x08F0, (short) 0x0608, (short) 0xFFB0, (short) 0xF938, + (short) 0xF360, (short) 0xF030, (short) 0xEE20, (short) 0xEB70, + (short) 0xE7A8, (short) 0xE410, (short) 0xE140, (short) 0xDFC8, + (short) 0xDFF8, (short) 0xE1F0, (short) 0xE448, (short) 0xE6D0, + (short) 0xE780, (short) 0xE9E8, (short) 0xECF0, (short) 0xF248, + (short) 0xF730, (short) 0xFBC0, (short) 0xFF80, (short) 0x0310, + (short) 0x0670, (short) 0x0A98, (short) 0x0D88, (short) 0x0FD8, + (short) 0x10C0, (short) 0x0EB0, (short) 0x0C48, (short) 0x08B8, + (short) 0x0998, (short) 0x0AC0, (short) 0x0C68, (short) 0x0B78, + (short) 0x09C8, (short) 0x0838, (short) 0x08F8, (short) 0x0A80, + (short) 0x0CA0, (short) 0x0E10, (short) 0x0E48, (short) 0x0D58, + (short) 0x0A28, (short) 0x0750, (short) 0x04F0, (short) 0x0228, + (short) 0xFEE8, (short) 0xFA80, (short) 0xF468, (short) 0xEED0, + (short) 0xEAE0, (short) 0xE8B8, (short) 0xE718, (short) 0xE5B0, + (short) 0xE4A8, (short) 0xE410, (short) 0xE480, (short) 0xE548, + (short) 0xE738, (short) 0xE9B0, (short) 0xED80, (short) 0xF0B8, + (short) 0xF480, (short) 0xF7B0, (short) 0xFB70, (short) 0xFED0, + (short) 0x0328, (short) 0x0720, (short) 0x0A98, (short) 0x0E00, + (short) 0x10F8, (short) 0x12E0, (short) 0x12A8, (short) 0x11B0, + (short) 0x0F58, (short) 0x0F38, (short) 0x0E88, (short) 0x0F08, + (short) 0x0FC0, (short) 0x0FF0, (short) 0x10B8, (short) 0x1138, + (short) 0x1198, (short) 0x13D0, (short) 0x1638, (short) 0x17E8, + (short) 0x1758, (short) 0x1628, (short) 0x1460, (short) 0x10E8, + (short) 0x0CA0, (short) 0x0848, (short) 0x0280, (short) 0xFC90, + (short) 0xF700, (short) 0xF0F8, (short) 0xEB18, (short) 0xE638, + (short) 0xE1B8, (short) 0xDE78, (short) 0xDC58, (short) 0xDBB8, + (short) 0xDC28, (short) 0xDDB0, (short) 0xE030, (short) 0xE330, + (short) 0xE6F0, (short) 0xEC20, (short) 0xF210, (short) 0xF7C0, + (short) 0xFCE0, (short) 0x0150, (short) 0x0570, (short) 0x08F0, + (short) 0x0C70, (short) 0x0F50, (short) 0x12B8, (short) 0x1560, + (short) 0x16E0, (short) 0x1630, (short) 0x14E8, (short) 0x1298, + (short) 0x11B8, (short) 0x1170, (short) 0x11B8, (short) 0x11C0, + (short) 0x0FE8, (short) 0x0E58, (short) 0x0CB8, (short) 0x0C50, + (short) 0x0D68, (short) 0x0E98, (short) 0x0E30, (short) 0x0C28, + (short) 0x0A10, (short) 0x06D8, (short) 0x02E0, (short) 0xFEA0, + (short) 0xFA18, (short) 0xF4E8, (short) 0xF018, (short) 0xEB68, + (short) 0xE6E8, (short) 0xE310, (short) 0xDFC8, (short) 0xDD38, + (short) 0xDBF8, (short) 0xDC38, (short) 0xDDD0, (short) 0xE070, + (short) 0xE390, (short) 0xE760, (short) 0xEB88, (short) 0xEF20, + (short) 0xF378, (short) 0xF830, (short) 0xFCE0, (short) 0x00F8, + (short) 0x0480, (short) 0x0768, (short) 0x0968, (short) 0x0AE0, + (short) 0x0BB8, (short) 0x0C10, (short) 0x0BB0, (short) 0x0A78, + (short) 0x08E0, (short) 0x06E8, (short) 0x0540, (short) 0x0870, + (short) 0x0BE0, (short) 0x0ED0, (short) 0x0E40, (short) 0x0D10, + (short) 0x0CC8, (short) 0x0E28, (short) 0x0FA0, (short) 0x0FB0, + (short) 0x0F18, (short) 0x0DD0, (short) 0x0BC8, (short) 0x08E8, + (short) 0x0628, (short) 0x0300, (short) 0xFF18, (short) 0xFB40, + (short) 0xF780, (short) 0xF388, (short) 0xF028, (short) 0xED80, + (short) 0xEB18, (short) 0xE968, (short) 0xE8C0, (short) 0xE738, + (short) 0xE658, (short) 0xE698, (short) 0xE888, (short) 0xEB38, + (short) 0xEDA0, (short) 0xF178, (short) 0xF5B8, (short) 0xFA28, + (short) 0xFEA8, (short) 0x0300, (short) 0x06C8, (short) 0x0960, + (short) 0x0B70, (short) 0x0CE0, (short) 0x0D70, (short) 0x0D50, + (short) 0x0C60, (short) 0x0890, (short) 0x0418, (short) 0x0028, + (short) 0x01D0, (short) 0x03F8, (short) 0x05A8, (short) 0x0700, + (short) 0x0808, (short) 0x09A0, (short) 0x0B18, (short) 0x0CC8, + (short) 0x0D90, (short) 0x0E68, (short) 0x0EC0, (short) 0x0E30, + (short) 0x0C28, (short) 0x09D8, (short) 0x0730, (short) 0x0308, + (short) 0xFED8, (short) 0xFAC0, (short) 0xF598, (short) 0xF0D8, + (short) 0xECE0, (short) 0xEAA8, (short) 0xE948, (short) 0xE8D0, + (short) 0xE850, (short) 0xE888, (short) 0xE910, (short) 0xEAD0, + (short) 0xED68, (short) 0xF018, (short) 0xF350, (short) 0xF6B8, + (short) 0xFAE0, (short) 0xFF00, (short) 0x02D8, (short) 0x05E8, + (short) 0x0830, (short) 0x09F8, (short) 0x0B08, (short) 0x0B80, + (short) 0x0B60, (short) 0x0988, (short) 0x0648, (short) 0x02D0, + (short) 0x0150, (short) 0x01E8, (short) 0x0270, (short) 0x03E0, + (short) 0x0538, (short) 0x0658, (short) 0x0918, (short) 0x0C00, + (short) 0x0E88, (short) 0x10B8, (short) 0x12A0, (short) 0x13E0, + (short) 0x1488, (short) 0x1448, (short) 0x1368, (short) 0x1120, + (short) 0x0DD0, (short) 0x0A40, (short) 0x0608, (short) 0x0148, + (short) 0xFC80, (short) 0xF860, (short) 0xF4D8, (short) 0xF1C0, + (short) 0xF008, (short) 0xEF38, (short) 0xEE78, (short) 0xEE98, + (short) 0xEF90, (short) 0xF170, (short) 0xF390, (short) 0xF5C0, + (short) 0xF888, (short) 0xFB48, (short) 0xFDF0, (short) 0x0078, + (short) 0x03D0, (short) 0x06C8, (short) 0x08F8, (short) 0x0AA0, + (short) 0x0BC8, (short) 0x0C48, (short) 0x0B30, (short) 0x0978, + (short) 0x06A8, (short) 0x0530, (short) 0x03F0, (short) 0x0438, + (short) 0x03C0, (short) 0x0350, (short) 0x0360, (short) 0x04E8, + (short) 0x0698, (short) 0x07D0, (short) 0x08D0, (short) 0x0998, + (short) 0x0A70, (short) 0x0B48, (short) 0x0B70, (short) 0x0AD0, + (short) 0x09C0, (short) 0x0890, (short) 0x0730, (short) 0x0588, + (short) 0x0358, (short) 0x0140, (short) 0xFF58, (short) 0xFD40, + (short) 0xFB68, (short) 0xF9E8, (short) 0xF828, (short) 0xF6D0, + (short) 0xF608, (short) 0xF5D8, (short) 0xF610, (short) 0xF668, + (short) 0xF778, (short) 0xF8E8, (short) 0xFA48, (short) 0xFCC8, + (short) 0xFF50, (short) 0x01C8, (short) 0x0428, (short) 0x0640, + (short) 0x07D0, (short) 0x09D0, (short) 0x0B40, (short) 0x0BF8, + (short) 0x0C30, (short) 0x0C08, (short) 0x0B08, (short) 0x0988, + (short) 0x07C0, (short) 0x0670, (short) 0x0608, (short) 0x0590, + (short) 0x0588, (short) 0x05B0, (short) 0x05E0, (short) 0x06B8, + (short) 0x0748, (short) 0x0758, (short) 0x0700, (short) 0x06A8, + (short) 0x0620, (short) 0x05D8, (short) 0x0590, (short) 0x0528, + (short) 0x03A8, (short) 0x0240, (short) 0x0108, (short) 0xFF38, + (short) 0xFD50, (short) 0xFBA0, (short) 0xFA38, (short) 0xF920, + (short) 0xF860, (short) 0xF6E8, (short) 0xF640, (short) 0xF628, + (short) 0xF680, (short) 0xF720, (short) 0xF800, (short) 0xF8E0, + (short) 0xF9A0, (short) 0xFA78, (short) 0xFB88, (short) 0xFD20, + (short) 0xFEA0, (short) 0x0008, (short) 0x0110, (short) 0x0200, + (short) 0x0360, (short) 0x04E0, (short) 0x0608, (short) 0x0738, + (short) 0x0838, (short) 0x08D8, (short) 0x0828, (short) 0x0738, + (short) 0x0600, (short) 0x04A8, (short) 0x02E0, (short) 0x0130, + (short) 0xFFA0, (short) 0xFF48, (short) 0xFF10, (short) 0xFEF0, + (short) 0xFF30, (short) 0xFFD0, (short) 0x0090, (short) 0x0090, + (short) 0x0070, (short) 0x0060, (short) 0xFFE8, (short) 0xFF50, + (short) 0xFEB8, (short) 0xFE98, (short) 0xFE88, (short) 0xFE80, + (short) 0xFE58, (short) 0xFE50, (short) 0xFE58, (short) 0xFDB0, + (short) 0xFD08, (short) 0xFC80, (short) 0xFAF8, (short) 0xF988, + (short) 0xF860, (short) 0xF798, (short) 0xF720, (short) 0xF6E8, + (short) 0xF728, (short) 0xF7C0, (short) 0xF8A8, (short) 0xF8F8, + (short) 0xF960, (short) 0xFA18, (short) 0xFAC0, (short) 0xFB58, + (short) 0xFC18, (short) 0xFCE0, (short) 0xFDA0, (short) 0xFE20, + (short) 0xFE88, (short) 0xFEF8, (short) 0xFEF0, (short) 0xFEC8, + (short) 0xFEA8, (short) 0xFDE0, (short) 0xFD10, (short) 0xFC70, + (short) 0xFBA8, (short) 0xFB10, (short) 0xFAB8, (short) 0xFAA0, + (short) 0xFAD0, (short) 0xFB18, (short) 0xFA90, (short) 0xFA18, + (short) 0xFA10, (short) 0xFA80, (short) 0xFB10, (short) 0xFB88, + (short) 0xFC90, (short) 0xFDB8, (short) 0xFEB8, (short) 0xFF80, + (short) 0x0058, (short) 0x0138, (short) 0x0118, (short) 0x00C8, + (short) 0x00C0, (short) 0xFF98, (short) 0xFE30, (short) 0xFD38, + (short) 0xFC68, (short) 0xFB78, (short) 0xFAB8, (short) 0xFAE8, + (short) 0xFB78, (short) 0xFBD0, (short) 0xFBE8, (short) 0xFC18, + (short) 0xFC98, (short) 0xFD28, (short) 0xFD48, (short) 0xFD68, + (short) 0xFD68, (short) 0xFD90, (short) 0xFDB8, (short) 0xFD90, + (short) 0xFD68, (short) 0xFD78, (short) 0xFCA0, (short) 0xFB70, + (short) 0xFAD0, (short) 0xF9F0, (short) 0xF870, (short) 0xF748, + (short) 0xF748, (short) 0xF770, (short) 0xF748, (short) 0xF720, + (short) 0xF7A8, (short) 0xF878, (short) 0xF930, (short) 0xF998, + (short) 0xFA38, (short) 0xFC10, (short) 0xFDA0, (short) 0xFE70, + (short) 0x0030, (short) 0x0248, (short) 0x03A0, (short) 0x0568, + (short) 0x0738, (short) 0x0870, (short) 0x0960, (short) 0x0A10, + (short) 0x0A40, (short) 0x0A28, (short) 0x09B8, (short) 0x08E8, + (short) 0x07E8, (short) 0x06E0, (short) 0x0588, (short) 0x0430, + (short) 0x0300, (short) 0x0260, (short) 0x01D0, (short) 0x0118, + (short) 0xFFB0, (short) 0xFE98, (short) 0xFE18, (short) 0xFDA0, + (short) 0xFD08, (short) 0xFCB8, (short) 0xFCF8, (short) 0xFD60, + (short) 0xFD90, (short) 0xFD90, (short) 0xFDD8, (short) 0xFE50, + (short) 0xFDA0, (short) 0xFCE0, (short) 0xFCC0, (short) 0xFCE8, + (short) 0xFCB0, (short) 0xFC60, (short) 0xFC70, (short) 0xFCB8, + (short) 0xFCE0, (short) 0xFD40, (short) 0xFDD8, (short) 0xFE68, + (short) 0xFF78, (short) 0x0068, (short) 0x0108, (short) 0x0278, + (short) 0x03A0, (short) 0x0420, (short) 0x0590, (short) 0x0708, + (short) 0x07B8, (short) 0x07D8, (short) 0x0808, (short) 0x0838, + (short) 0x07D8, (short) 0x06E8, (short) 0x0600, (short) 0x05B0, + (short) 0x0518, (short) 0x0410, (short) 0x02A0, (short) 0x0198, + (short) 0x00D0, (short) 0x00C8, (short) 0x00B0, (short) 0x0068, + (short) 0x00C0, (short) 0x0150, (short) 0x0180, (short) 0x0220, + (short) 0x02D8, (short) 0x0340, (short) 0x0360, (short) 0x0380, + (short) 0x0380, (short) 0x0338, (short) 0x02C8, (short) 0x02B8, + (short) 0x0280, (short) 0x0200, (short) 0x0100, (short) 0x0098, + (short) 0x0080, (short) 0x0020, (short) 0xFFF0, (short) 0x0000, + (short) 0x0020, (short) 0x0098, (short) 0x0120, (short) 0x0170, + (short) 0x0230, (short) 0x02F0, (short) 0x0350, (short) 0x0480, + (short) 0x05B8, (short) 0x0650, (short) 0x06A8, (short) 0x0738, + (short) 0x0798, (short) 0x07B0, (short) 0x07C0, (short) 0x0798, + (short) 0x0668, (short) 0x0598, (short) 0x0530, (short) 0x04C8, + (short) 0x0410, (short) 0x0350, (short) 0x0278, (short) 0x01D8, + (short) 0x0148, (short) 0x0080, (short) 0x0000, (short) 0xFFC0, + (short) 0xFFD8, (short) 0xFFA8, (short) 0xFF60, (short) 0xFF80, + (short) 0x0018, (short) 0x0070, (short) 0xFFE0, (short) 0xFF88, + (short) 0xFFC0, (short) 0xFF38, (short) 0xFE98, (short) 0xFE50, + (short) 0xFE10, (short) 0xFDD8, (short) 0xFD90, (short) 0xFD30, + (short) 0xFDB8, (short) 0xFE68, (short) 0xFE70, (short) 0xFE60, + (short) 0xFE70, (short) 0xFED0, (short) 0xFF90, (short) 0xFFE0, + (short) 0xFFF0, (short) 0x00A8, (short) 0x0168, (short) 0x01D0, + (short) 0x01F8, (short) 0x0210, (short) 0x0278, (short) 0x0268, + (short) 0x0208, (short) 0x0220, (short) 0x01F8, (short) 0x0198, + (short) 0x0158, (short) 0x0100, (short) 0x00C0, (short) 0x00A0, + (short) 0x0018, (short) 0xFF98, (short) 0xFF28, (short) 0xFEC0, + (short) 0xFE80, (short) 0xFE60, (short) 0xFD88, (short) 0xFCF0, + (short) 0xFCC8, (short) 0xFC70, (short) 0xFC10, (short) 0xFBC8, + (short) 0xFBB0, (short) 0xFBE8, (short) 0xFBE8, (short) 0xFB80, + (short) 0xFB88, (short) 0xFB40, (short) 0xFB18, (short) 0xFB20, + (short) 0xFAB8, (short) 0xFA50, (short) 0xFA50, (short) 0xFAB8, + (short) 0xFAF8, (short) 0xFB18, (short) 0xFBB0, (short) 0xFC88, + (short) 0xFD10, (short) 0xFD40, (short) 0xFD98, (short) 0xFE38, + (short) 0xFEE0, (short) 0xFEF8, (short) 0xFEF0, (short) 0xFF18, + (short) 0xFF18, (short) 0xFF18, (short) 0xFF68, (short) 0xFF98, + (short) 0xFF98, (short) 0xFFD0, (short) 0xFFF8, (short) 0x0048, + (short) 0x0038, (short) 0x0008, (short) 0x0008, (short) 0xFFE0, + (short) 0xFFB0, (short) 0xFFB8, (short) 0xFED0, (short) 0xFE18, + (short) 0xFE18, (short) 0xFDF0, (short) 0xFE38, (short) 0xFE90, + (short) 0xFE90, (short) 0xFDA8, (short) 0xFD48, (short) 0xFD70, + (short) 0xFD68, (short) 0xFD00, (short) 0xFCB8, (short) 0xFCB8, + (short) 0xFCF8, (short) 0xFD00, (short) 0xFC30, (short) 0xFBD0, + (short) 0xFC10, (short) 0xFC20, (short) 0xFBE0, (short) 0xFBA8, + (short) 0xFC30, (short) 0xFD00, (short) 0xFD50, (short) 0xFD90, + (short) 0xFE10, (short) 0xFEA8, (short) 0xFF40, (short) 0xFFA0, + (short) 0xFFD0, (short) 0xFFC8, (short) 0xFFC8, (short) 0xFFD8, + (short) 0xFFA0, (short) 0xFF98, (short) 0xFFB8, (short) 0x0050, + (short) 0x00B8, (short) 0x00B0, (short) 0x01B0, (short) 0x02E0, + (short) 0x0318, (short) 0x0330, (short) 0x02E0, (short) 0x02C8, + (short) 0x0278, (short) 0x0150, (short) 0x0050, (short) 0xFFC0, + (short) 0xFF88, (short) 0xFF18, (short) 0xFE90, (short) 0xFE40, + (short) 0xFE30, (short) 0xFDE8, (short) 0xFDD0, (short) 0xFD70, + (short) 0xFD48, (short) 0xFD10, (short) 0xFC98, (short) 0xFC38, + (short) 0xFC38, (short) 0xFC78, (short) 0xFC98, (short) 0xFCF0, + (short) 0xFDA8, (short) 0xFE48, (short) 0xFEC8, (short) 0xFF30, + (short) 0xFF98, (short) 0x0000, (short) 0x0050, (short) 0x0058, + (short) 0x00A8, (short) 0x00E8, (short) 0x00D0, (short) 0x0138, + (short) 0x01E0, (short) 0x0218, (short) 0x0208, (short) 0x0230, + (short) 0x0258, (short) 0x0248, (short) 0x02B0, (short) 0x0318, + (short) 0x0330, (short) 0x0358, (short) 0x0380, (short) 0x0378, + (short) 0x0408, (short) 0x0480, (short) 0x0460, (short) 0x03C8, + (short) 0x0318, (short) 0x02B0, (short) 0x01E8, (short) 0x00B8, + (short) 0xFFD8, (short) 0xFF30, (short) 0xFEC8, (short) 0xFE60, + (short) 0xFE60, (short) 0xFE78, (short) 0xFE78, (short) 0xFDC0, + (short) 0xFD70, (short) 0xFD50, (short) 0xFD08, (short) 0xFC88, + (short) 0xFC28, (short) 0xFC98, (short) 0xFD18, (short) 0xFD60, + (short) 0xFD60, (short) 0xFDD8, (short) 0xFE90, (short) 0xFEE8, + (short) 0xFF10, (short) 0xFF58, (short) 0xFF90, (short) 0xFFB8, + (short) 0xFFE0, (short) 0xFFF0, (short) 0xFFF0, (short) 0x00D0, + (short) 0x0190, (short) 0x01C8, (short) 0x0180, (short) 0x0188, + (short) 0x01B0, (short) 0x0238, (short) 0x0298, (short) 0x02B8, + (short) 0x0268, (short) 0x0258, (short) 0x0258, (short) 0x0230, + (short) 0x0228, (short) 0x0230, (short) 0x0258, (short) 0x0248, + (short) 0x01F8, (short) 0x0150, (short) 0x00C8, (short) 0x0058, + (short) 0x0058, (short) 0x0038, (short) 0x0000, (short) 0xFF50, + (short) 0xFF00, (short) 0xFEF8, (short) 0xFE80, (short) 0xFDB8, + (short) 0xFD70, (short) 0xFD00, (short) 0xFC90, (short) 0xFC40, + (short) 0xFC28, (short) 0xFC58, (short) 0xFC98, (short) 0xFD10, + (short) 0xFD78, (short) 0xFDE0, (short) 0xFE80, (short) 0xFF08, + (short) 0xFF60, (short) 0xFFD0, (short) 0x0030, (short) 0x0068, + (short) 0x0110, (short) 0x0198, (short) 0x01C0, (short) 0x0208, + (short) 0x0260, (short) 0x0280, (short) 0x0320, (short) 0x0390, + (short) 0x0398, (short) 0x0410, (short) 0x0488, (short) 0x04A0, + (short) 0x0448, (short) 0x0408, (short) 0x03E0, (short) 0x03C8, + (short) 0x0398, (short) 0x0350, (short) 0x0308, (short) 0x02C8, + (short) 0x0278, (short) 0x01D8, (short) 0x0148, (short) 0x00E8, + (short) 0x0040, (short) 0xFFA0, (short) 0xFF50, (short) 0xFDC0, + (short) 0xFC88, (short) 0xFC30, (short) 0xFB88, (short) 0xFAA8, + (short) 0xFA50, (short) 0xFA30, (short) 0xFA40, (short) 0xFA70, + (short) 0xFAB8, (short) 0xFAE0, (short) 0xFB28, (short) 0xFB58, + (short) 0xFB80, (short) 0xFBB0, (short) 0xFC00, (short) 0xFC80, + (short) 0xFCF0, (short) 0xFDB8, (short) 0xFE58, (short) 0xFED8, + (short) 0x0008, (short) 0x0100, (short) 0x0180, (short) 0x01D0, + (short) 0x0210, (short) 0x0248, (short) 0x0238, (short) 0x0200, + (short) 0x01D0, (short) 0x02D0, (short) 0x03A0, (short) 0x03D8, + (short) 0x03C0, (short) 0x03D8, (short) 0x03F8, (short) 0x0370, + (short) 0x02C0, (short) 0x0258, (short) 0x01B8, (short) 0x0120, + (short) 0x0090, (short) 0x0088, (short) 0x00A8, (short) 0x00A8, + (short) 0x0088, (short) 0x0068, (short) 0x0060, (short) 0xFFE0, + (short) 0xFF00, (short) 0xFE50, (short) 0xFDC8, (short) 0xFCF0, + (short) 0xFC30, (short) 0xFBB0, (short) 0xFBD8, (short) 0xFC20, + (short) 0xFC58, (short) 0xFC30, (short) 0xFC40, (short) 0xFC78, + (short) 0xFCC0, (short) 0xFCE8, (short) 0xFD10, (short) 0xFD48, + (short) 0xFD88, (short) 0xFDE8, (short) 0xFF10, (short) 0x0020, + (short) 0x0110, (short) 0x01B8, (short) 0x0248, (short) 0x02C0, + (short) 0x0358, (short) 0x03B8, (short) 0x03C8, (short) 0x0320, + (short) 0x0288, (short) 0x0280, (short) 0x0300, (short) 0x0340, + (short) 0x0320, (short) 0x0380, (short) 0x03F8, (short) 0x0418, + (short) 0x0378, (short) 0x02E0, (short) 0x0288, (short) 0x0280, + (short) 0x0238, (short) 0x01D0, (short) 0x0168, (short) 0x0138, + (short) 0x0110, (short) 0x0140, (short) 0x0148, (short) 0x0150, + (short) 0x00A8, (short) 0x0010, (short) 0xFFB0, (short) 0xFEB8, + (short) 0xFDE0, (short) 0xFD48, (short) 0xFCE8, (short) 0xFCA8, + (short) 0xFC78, (short) 0xFC48, (short) 0xFC50, (short) 0xFC70, + (short) 0xFCA8, (short) 0xFCE8, (short) 0xFD28, (short) 0xFDD0, + (short) 0xFE70, (short) 0xFED8, (short) 0x0040, (short) 0x0188, + (short) 0x0258, (short) 0x03C0, (short) 0x04F0, (short) 0x05B8, + (short) 0x0638, (short) 0x0670, (short) 0x0690, (short) 0x0708, + (short) 0x0708, (short) 0x06B8, (short) 0x0660, (short) 0x0650, + (short) 0x0630, (short) 0x05C8, (short) 0x0578, (short) 0x0548, + (short) 0x0508, (short) 0x0470, (short) 0x03D0, (short) 0x0350, + (short) 0x0278, (short) 0x01A0, (short) 0x00F8, (short) 0x00B0, + (short) 0x0078, (short) 0x0030, (short) 0xFFE8, (short) 0xFFC8, + (short) 0xFFB8, (short) 0xFED0, (short) 0xFE08, (short) 0xFD98, + (short) 0xFC70, (short) 0xFB60, (short) 0xFAA8, (short) 0xFA10, + (short) 0xF9B8, (short) 0xF980, (short) 0xF9A0, (short) 0xFA00, + (short) 0xFA68, (short) 0xFB90, (short) 0xFCB8, (short) 0xFD98, + (short) 0xFE68, (short) 0xFF18, (short) 0xFFC0, (short) 0x0078, + (short) 0x00F8, (short) 0x0218, (short) 0x0320, (short) 0x03C0, + (short) 0x0478, (short) 0x0510, (short) 0x0570, (short) 0x05D8, + (short) 0x05E0, (short) 0x05B8, (short) 0x0508, (short) 0x0468, + (short) 0x03E0, (short) 0x02F0, (short) 0x0218, (short) 0x0168, + (short) 0x00F0, (short) 0x0060, (short) 0xFFD0, (short) 0xFF58, + (short) 0xFEC0, (short) 0xFE48, (short) 0xFDB0, (short) 0xFD58, + (short) 0xFD38, (short) 0xFCD8, (short) 0xFC80, (short) 0xFC50, + (short) 0xFC08, (short) 0xFB48, (short) 0xFA98, (short) 0xF9F8, + (short) 0xF8F8, (short) 0xF810, (short) 0xF7F8, (short) 0xF818, + (short) 0xF848, (short) 0xF8E8, (short) 0xF9E0, (short) 0xFB08, + (short) 0xFC38, (short) 0xFD10, (short) 0xFDE8, (short) 0xFF10, + (short) 0xFFD0, (short) 0x0048, (short) 0x00E0, (short) 0x0160, + (short) 0x01B8, (short) 0x01C8, (short) 0x01E0, (short) 0x0200, + (short) 0x0228, (short) 0x0240, (short) 0x0240, (short) 0x0240, + (short) 0x0260, (short) 0x0280, (short) 0x0280, (short) 0x02F0, + (short) 0x0370, (short) 0x03C8, (short) 0x03C8, (short) 0x03A8, + (short) 0x03A0, (short) 0x02F8, (short) 0x0220, (short) 0x0150, + (short) 0x0098, (short) 0xFFE0, (short) 0xFF20, (short) 0xFEA0, + (short) 0xFE50, (short) 0xFE18, (short) 0xFD38, (short) 0xFC60, + (short) 0xFBE0, (short) 0xFAC8, (short) 0xF9A0, (short) 0xF8B8, + (short) 0xF830, (short) 0xF888, (short) 0xF8B8, (short) 0xF908, + (short) 0xFA80, (short) 0xFBF8, (short) 0xFD48, (short) 0xFEC8, + (short) 0x0040, (short) 0x01B0, (short) 0x0298, (short) 0x0338, + (short) 0x03C0, (short) 0x0470, (short) 0x0520, (short) 0x0588, + (short) 0x0610, (short) 0x0688, (short) 0x06C8, (short) 0x0670, + (short) 0x05E8, (short) 0x0578, (short) 0x0580, (short) 0x0578, + (short) 0x0528, (short) 0x0498, (short) 0x0408, (short) 0x0390, + (short) 0x03F8, (short) 0x0458, (short) 0x0488, (short) 0x0468, + (short) 0x0450, (short) 0x0458, (short) 0x03A8, (short) 0x02D0, + (short) 0x0210, (short) 0x0158, (short) 0x0088, (short) 0xFFA8, + (short) 0xFF00, (short) 0xFE88, (short) 0xFE30, (short) 0xFD88, + (short) 0xFCB8, (short) 0xFC28, (short) 0xFB30, (short) 0xF9F0, + (short) 0xF8E8, (short) 0xF890, (short) 0xF890, (short) 0xF8C0, + (short) 0xF978, (short) 0xFA78, (short) 0xFBE8, (short) 0xFD20, + (short) 0xFE28, (short) 0xFF60, (short) 0x00D8, (short) 0x0220, + (short) 0x02F8, (short) 0x0378, (short) 0x03E0, (short) 0x0438, + (short) 0x0488, (short) 0x0498, (short) 0x04A8, (short) 0x0480, + (short) 0x0440, (short) 0x03C0, (short) 0x02D8, (short) 0x01E8, + (short) 0x0140, (short) 0x00D8, (short) 0x0068, (short) 0xFFE0, + (short) 0x0068, (short) 0x0130, (short) 0x0228, (short) 0x0260, + (short) 0x0278, (short) 0x02D0, (short) 0x02D8, (short) 0x0290, + (short) 0x01E0, (short) 0x00D0, (short) 0xFFE0, (short) 0xFEF8, + (short) 0xFE08, (short) 0xFD28, (short) 0xFC88, (short) 0xFBE0, + (short) 0xFB60, (short) 0xFAD8, (short) 0xFA08, (short) 0xF978, + (short) 0xF8E8, (short) 0xF8B0, (short) 0xF8B0, (short) 0xF8D0, + (short) 0xF9D0, (short) 0xFAF8, (short) 0xFC18, (short) 0xFDB0, + (short) 0xFF38, (short) 0x00A0, (short) 0x01F8, (short) 0x02F8, + (short) 0x03C0, (short) 0x0460, (short) 0x04B8, (short) 0x04C8, + (short) 0x04C8, (short) 0x04C0, (short) 0x0498, (short) 0x0490, + (short) 0x0478, (short) 0x0448, (short) 0x0420, (short) 0x03F8, + (short) 0x0328, (short) 0x0238, (short) 0x01B0, (short) 0x0170, + (short) 0x0128, (short) 0x0090, (short) 0x00E8, (short) 0x01B8, + (short) 0x02B8, (short) 0x0280, (short) 0x0218, (short) 0x0218, + (short) 0x01F0, (short) 0x0148, (short) 0x0000, (short) 0xFEC0, + (short) 0xFE08, (short) 0xFD70, (short) 0xFCA0, (short) 0xFBF0, + (short) 0xFBC0, (short) 0xFBA0, (short) 0xFB80, (short) 0xFB18, + (short) 0xFB28, (short) 0xFB98, (short) 0xFBC0, (short) 0xFBD0, + (short) 0xFC08, (short) 0xFC78, (short) 0xFDC8, (short) 0xFEC8, + (short) 0xFF78, (short) 0x00D0, (short) 0x0238, (short) 0x0360, + (short) 0x0398, (short) 0x0360, (short) 0x0368, (short) 0x0380, + (short) 0x0318, (short) 0x0250, (short) 0x0208, (short) 0x0220, + (short) 0x0218, (short) 0x01F0, (short) 0x01C8, (short) 0x0210, + (short) 0x0270, (short) 0x0270, (short) 0x0240, (short) 0x0290, + (short) 0x0310, (short) 0x0360, (short) 0x0340, (short) 0x0310, + (short) 0x0318, (short) 0x0320, (short) 0x02D8, (short) 0x0240, + (short) 0x0158, (short) 0x00A0, (short) 0x0008, (short) 0xFF30, + (short) 0xFE50, (short) 0xFDA8, (short) 0xFD28, (short) 0xFCC8, + (short) 0xFC60, (short) 0xFBA8, (short) 0xFB40, (short) 0xFB10, + (short) 0xFB18, (short) 0xFB28, (short) 0xFB48, (short) 0xFB68, + (short) 0xFBA8, (short) 0xFBF8, (short) 0xFCB8, (short) 0xFD78, + (short) 0xFE00, (short) 0xFE88, (short) 0xFF30, (short) 0xFF98, + (short) 0xFFC8, (short) 0xFFE8, (short) 0x0050, (short) 0x00B0, + (short) 0x00E0, (short) 0x0040, (short) 0xFF68, (short) 0xFED8, + (short) 0xFEE8, (short) 0xFEE0, (short) 0xFE90, (short) 0xFEA8, + (short) 0xFF88, (short) 0x0080, (short) 0x0188, (short) 0x0208, + (short) 0x0290, (short) 0x0390, (short) 0x0438, (short) 0x0450, + (short) 0x0428, (short) 0x03F8, (short) 0x03E0, (short) 0x0388, + (short) 0x02E0, (short) 0x0240, (short) 0x0190, (short) 0x00D0, + (short) 0x0000, (short) 0x0000, (short) 0x0018, (short) 0x00FF, + (short) 0x0068, (short) 0x00FE, (short) 0x00F8, (short) 0x00FD}; + +gsm_byte gsm_enc_gsmdata[] = { + 0xD5, 0x1F, 0x74, 0x21, 0xA0, 0x50, 0x40, 0xC9, 0x24, 0x7B, 0xFA, 0x6B, + 0x52, 0xE0, 0xB6, 0xD6, 0x8E, 0xB9, 0x2B, 0xAE, 0xE0, 0x8B, 0x23, 0x52, + 0x3B, 0x13, 0x86, 0xE0, 0x14, 0x4A, 0x41, 0x44, 0x32, 0xD3, 0xA1, 0x83, + 0xA1, 0x1D, 0xA6, 0x80, 0xBA, 0xD2, 0x96, 0x26, 0xFB, 0x84, 0x80, 0x6D, + 0x9C, 0x25, 0x1D, 0x9B, 0xAA, 0xC0, 0xBB, 0x4C, 0x95, 0xB9, 0x53, 0xAE, + 0xA0, 0xB6, 0xE4, 0x46, 0x37, 0x1B, 0xD4, 0xA5, 0x7B, 0x1D, 0x22, 0x97, + 0x00, 0xBA, 0xA5, 0x6D, 0xD2, 0xA1, 0x7E, 0xC0, 0xB9, 0x25, 0xD2, 0xB4, + 0x94, 0x9E, 0xE0, 0x3E, 0xDE, 0xED, 0xD6, 0xD2, 0xE2, 0xC0, 0xD7, 0x5D, + 0x8D, 0x59, 0xAC, 0xD3, 0xE4, 0x83, 0x95, 0x59, 0xC0, 0xA1, 0x48, 0xD2, + 0x66, 0xC7, 0x2C, 0x9E, 0xA0, 0x2A, 0xD3, 0xEE, 0x45, 0x1C, 0x80, 0xE0, + 0x6B, 0x34, 0x8C, 0x4B, 0x29, 0xCB, 0x00, 0xBA, 0xF6, 0x0D, 0x26, 0x9A, + 0xD3, 0xA4, 0x82, 0x9D, 0x63, 0x7A, 0xC0, 0x67, 0x24, 0xBA, 0xD6, 0x7C, + 0xC2, 0xC0, 0x37, 0x20, 0x4F, 0x10, 0xE0, 0xC7, 0x80, 0x6A, 0x77, 0x63, + 0xBE, 0x6B, 0x5A, 0xC0, 0xB5, 0x34, 0xD1, 0x34, 0x9C, 0xD4, 0xE8, 0x56, + 0xB2, 0x58, 0x5F, 0x00, 0xB7, 0xAF, 0x92, 0x12, 0x90, 0xD5, 0xA4, 0x39, + 0x23, 0x4E, 0x46, 0x87, 0x51, 0xAC, 0xD8, 0xDB, 0x6D, 0xCB, 0x17, 0x50, + 0x89, 0x7B, 0x44, 0x28, 0x03, 0x6B, 0xD5, 0xA9, 0x36, 0x36, 0xD9, 0x6B, + 0xA8, 0x93, 0x3A, 0x96, 0xEE, 0xFF, 0x67, 0x8B, 0x36, 0xDA, 0x09, 0xB4, + 0x99, 0x67, 0x2B, 0x88, 0xE4, 0xB5, 0xA5, 0xDA, 0x65, 0x47, 0xDA, 0x1E, + 0x96, 0xFA, 0xEC, 0xD5, 0xA9, 0x45, 0x63, 0x1A, 0xCB, 0xC9, 0x48, 0x9D, + 0x83, 0x5F, 0x6F, 0xCB, 0x08, 0x1B, 0x97, 0xC9, 0x18, 0x0A, 0x63, 0xCB, + 0xA6, 0xE1, 0x84, 0xF5, 0x62, 0x61, 0x6A, 0x84, 0xDC, 0xB6, 0x37, 0x9E, + 0xD6, 0xAB, 0x3C, 0x53, 0x93, 0xC1, 0x2A, 0xAA, 0x81, 0x8D, 0x6B, 0x65, + 0x60, 0xA8, 0xFB, 0x2E, 0x22, 0x59, 0x74, 0x61, 0xA6, 0x5D, 0x73, 0x94, + 0xF8, 0xE4, 0xC1, 0x46, 0x26, 0x5E, 0x8A, 0x86, 0xED, 0xD4, 0xA6, 0x2D, + 0x57, 0x6B, 0xBE, 0xE8, 0x58, 0xDA, 0x3D, 0x98, 0x99, 0xBE, 0xA8, 0xC2, + 0xDB, 0x6A, 0x2E, 0x51, 0x62, 0xE5, 0x80, 0x58, 0x76, 0xB8, 0xE4, 0x6C, + 0x84, 0xCA, 0x98, 0x06, 0x0B, 0xFC, 0xD2, 0x66, 0x7C, 0x62, 0x3A, 0x5B, + 0xC5, 0xDF, 0x7D, 0x75, 0x49, 0x1E, 0x52, 0xC7, 0x55, 0xF7, 0x84, 0xA6, + 0xDA, 0x5D, 0x43, 0x26, 0x85, 0x98, 0xD8, 0x8F, 0xB6, 0xC5, 0x28, 0xEB, + 0x3E, 0x75, 0x04, 0xD2, 0x27, 0xBA, 0x2A, 0x2B, 0xB7, 0x03, 0x13, 0x45, + 0x35, 0x1B, 0x78, 0x5F, 0xC3, 0xBA, 0xDB, 0xAE, 0x27, 0xC2, 0x5E, 0xA4, + 0x50, 0x8C, 0x8A, 0xBB, 0x4F, 0x60, 0xC3, 0xEE, 0x41, 0x46, 0x4A, 0xDF, + 0xD2, 0x27, 0xB2, 0xAD, 0xEB, 0x5F, 0x43, 0x4C, 0x6A, 0x09, 0x2A, 0xCC, + 0xB7, 0x47, 0x2A, 0xB9, 0x91, 0xB6, 0xD4, 0x5B, 0x25, 0x58, 0xD8, 0xFD, + 0x46, 0x95, 0x5A, 0xC3, 0x27, 0x5B, 0x3F, 0xFB, 0x12, 0xD2, 0x26, 0xC3, + 0xA9, 0xA1, 0xB6, 0xA2, 0xCB, 0x1B, 0xD0, 0x73, 0xE4, 0xBA, 0xA1, 0xE9, + 0x05, 0xBE, 0x79, 0x23, 0xA4, 0xC2, 0x3A, 0x4B, 0x11, 0xE5, 0x68, 0xC4, + 0xC1, 0xBA, 0xC1, 0xCC, 0x8B, 0x02, 0xD2, 0x63, 0x6C, 0xEE, 0x19, 0x5E, + 0xE1, 0xB6, 0x4C, 0x1A, 0xB4, 0x5E, 0xF0, 0xC2, 0x27, 0x20, 0x55, 0xBD, + 0x6D, 0x64, 0xE1, 0xC7, 0x45, 0xA9, 0x65, 0x6D, 0x7D, 0x42, 0x56, 0xD8, + 0xB2, 0xB6, 0xEC, 0xD3, 0x61, 0x5B, 0x62, 0x61, 0x60, 0xA1, 0x5B, 0xD6, + 0x15, 0x29, 0x09, 0x6C, 0xA1, 0x3E, 0xAD, 0x65, 0x34, 0xC3, 0xC0, 0xC1, + 0x22, 0x6D, 0x4C, 0x57, 0x10, 0xDB, 0x41, 0xD2, 0xE1, 0x77, 0x64, 0xF7, + 0xD3, 0x21, 0x73, 0xA9, 0x29, 0x58, 0xC1, 0xA1, 0x5A, 0x52, 0xB7, 0x32, + 0x64, 0xC1, 0x67, 0x42, 0x74, 0x2C, 0xDC, 0x61, 0x61, 0x65, 0x8B, 0xCB, + 0x04, 0xE5, 0x60, 0xC1, 0xC9, 0x5E, 0x8E, 0x36, 0x83, 0xD2, 0xA2, 0x83, + 0xA9, 0xD9, 0xCD, 0x21, 0xB9, 0x25, 0xCD, 0xE6, 0x1D, 0x60, 0xA1, 0xB4, + 0xAA, 0x8F, 0xBA, 0x75, 0xC3, 0x01, 0x0B, 0x3B, 0x51, 0xDB, 0xEC, 0x62, + 0xE1, 0x38, 0xCD, 0x40, 0x3B, 0xD3, 0xD2, 0x26, 0x94, 0x29, 0xD2, 0x61, + 0x21, 0x6B, 0x4A, 0x8D, 0x24, 0xB5, 0xBB, 0x21, 0x12, 0xA5, 0x99, 0xA5, + 0x1A, 0xCA, 0xA1, 0xEF, 0x5D, 0xAA, 0xAE, 0xD3, 0x64, 0xE1, 0xA3, 0x6B, + 0xAE, 0x35, 0x39, 0xD2, 0x66, 0x73, 0xB6, 0x90, 0xC6, 0xC1, 0x32, 0xD1, + 0xBA, 0xC9, 0x25, 0x65, 0x81, 0xA8, 0xD2, 0xB1, 0xE7, 0x18, 0xBE, 0xC0, + 0xFC, 0xE4, 0x85, 0xB5, 0x06, 0xB4, 0x81, 0x35, 0x46, 0xB6, 0xC8, 0x9B}; + +#endif /* end of include guard: DATA_H */ diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/gsm_enc.c b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/gsm_enc.c new file mode 100644 index 0000000..9249e82 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/gsm_enc.c @@ -0,0 +1,2185 @@ +/* gsm_enc_encode.c */ +/* + Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + Universitaet Berlin. See the accompanying file "COPYRIGHT" for + details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. +*/ + +#include "private.h" + +/* + Prototypes from add.c +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline word gsm_enc_div(word num, + word denum); + +__attribute__((always_inline)) static inline word gsm_enc_sub(word a, word b); + +__attribute__((always_inline)) static inline word gsm_enc_norm(longword a); + +__attribute__((always_inline)) static inline word gsm_enc_asl(word a, int n); + +__attribute__((always_inline)) static inline word gsm_enc_asr(word a, int n); + +/* + Inlined functions from add.h +*/ + +#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR(((longword) (a) * (longword) (b) + 16384), 15)) + +#define GSM_MULT(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR(((longword) (a) * (longword) (b)), 15)) + +#define GSM_L_ADD(a, b) \ + ((a) < 0 ? ((b) >= 0 ? (a) + (b) \ + : (utmp = (ulongword) - ((a) + 1) + (ulongword) - \ + ((b) + 1)) >= MAX_LONGWORD \ + ? MIN_LONGWORD \ + : -(longword) utmp - 2) \ + : ((b) <= 0 ? (a) + (b) \ + : (utmp = (ulongword) (a) + (ulongword) (b)) >= \ + (ulongword) MAX_LONGWORD \ + ? MAX_LONGWORD \ + : a + b)) + +#define GSM_ADD(a, b) \ + ((ulongword) ((ltmp = (longword) (a) + (longword) (b)) - MIN_WORD) > \ + MAX_WORD - MIN_WORD \ + ? (ltmp > 0 ? MAX_WORD : MIN_WORD) \ + : ltmp) + +#define GSM_SUB(a, b) \ + ((ltmp = (longword) (a) - (longword) (b)) >= MAX_WORD ? MAX_WORD \ + : ltmp <= MIN_WORD ? MIN_WORD \ + : ltmp) + +#define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) + +#define saturate(x) \ + ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD : (x)) + +/* Use these if necessary: + + # define GSM_MULT_R(a, b) gsm_enc_mult_r(a, b) + # define GSM_MULT(a, b) gsm_enc_mult(a, b) + # define GSM_L_MULT(a, b) gsm_enc_L_mult(a, b) + + # define GSM_L_ADD(a, b) gsm_enc_L_add(a, b) + # define GSM_ADD(a, b) gsm_enc_add(a, b) + # define GSM_SUB(a, b) gsm_enc_sub(a, b) + + # define GSM_ABS(a) gsm_enc_abs(a) +*/ + +/* + More prototypes from implementations.. +*/ +extern void +gsm_enc_Gsm_Coder(struct gsm_state *S, word *s, /* [ 0..159 ] samples IN */ + word *LARc, /* [ 0..7 ] LAR coefficients OUT */ + word *Nc, /* [ 0..3 ] LTP lag OUT */ + word *bc, /* [ 0..3 ] coded LTP gain OUT */ + word *Mc, /* [ 0..3 ] RPE grid selection OUT */ + word *xmaxc, /* [ 0..3 ] Coded maximum amplitude OUT */ + word *xMc /* [ 13*4 ] normalized RPE samples OUT */); + +extern void +gsm_enc_Gsm_Long_Term_Predictor( /* 4x for 160 samples */ + word *d, /* [ 0..39 ] residual signal IN */ + word *dp, /* [ -120..-1 ] d' IN */ + word *e, /* [ 0..40 ] OUT */ + word *dpp, /* [ 0..40 ] OUT */ + word *Nc, /* correlation lag OUT */ + word *bc /* gain factor OUT */); + +extern void gsm_enc_Gsm_LPC_Analysis(word *s, /* 0..159 signals IN/OUT */ + word *LARc); /* 0..7 LARc's OUT */ + +__attribute__((always_inline)) static inline void +gsm_enc_Gsm_Preprocess(struct gsm_state *S, word *s, word *so); + +extern void gsm_enc_Gsm_Short_Term_Analysis_Filter( + struct gsm_state *S, word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *d /* st res. signal [ 0..159 ] IN/OUT */); + +void +gsm_enc_Gsm_RPE_Encoding(word *e, /* -5..-1 ][ 0..39 ][ 40..44 IN/OUT */ + word *xmaxc, /* OUT */ + word *Mc, /* OUT */ + word *xMc); /* [ 0..12 ] OUT */ + +/**************** end #include "private.h" **********************************/ + +/* + Interface +*/ + +typedef struct gsm_state *gsm; +typedef short gsm_signal; /* signed 16 bit */ +typedef unsigned char gsm_byte; +typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */ + +#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ + +#define GSM_PATCHLEVEL 6 +#define GSM_MINOR 0 +#define GSM_MAJOR 1 + +#include "data.h" + +__attribute__((always_inline)) static inline void +gsm_enc_encode(gsm, gsm_signal *, gsm_byte *); + +__attribute__((always_inline)) static inline int +gsm_enc_explode(gsm, gsm_byte *, gsm_signal *); +__attribute__((always_inline)) static inline void +gsm_enc_implode(gsm, gsm_signal *, gsm_byte *); + +/******************* end #include "gsm.h" **********************************/ + +#define SAMPLES 20 + +/* + Forward declaration of global variables +*/ + +struct gsm_state gsm_enc_state; +gsm gsm_enc_state_ptr; +volatile int gsm_enc_result; + +/* add.c */ + +__attribute__((always_inline)) static inline word +gsm_enc_sub(word a, word b) { + longword diff = (longword) a - (longword) b; + return saturate(diff); +} + +unsigned char gsm_enc_bitoff[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +__attribute__((always_inline)) static inline void +gsm_enc_encode(gsm s, gsm_signal *source, gsm_byte *c) { + word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13 * 4]; + + gsm_enc_Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); + + /* variable size + + GSM_MAGIC 4 + + LARc[ 0 ] 6 + LARc[ 1 ] 6 + LARc[ 2 ] 5 + LARc[ 3 ] 5 + LARc[ 4 ] 4 + LARc[ 5 ] 4 + LARc[ 6 ] 3 + LARc[ 7 ] 3 + + Nc[ 0 ] 7 + bc[ 0 ] 2 + Mc[ 0 ] 2 + xmaxc[ 0 ] 6 + xmc[ 0 ] 3 + xmc[ 1 ] 3 + xmc[ 2 ] 3 + xmc[ 3 ] 3 + xmc[ 4 ] 3 + xmc[ 5 ] 3 + xmc[ 6 ] 3 + xmc[ 7 ] 3 + xmc[ 8 ] 3 + xmc[ 9 ] 3 + xmc[ 10 ] 3 + xmc[ 11 ] 3 + xmc[ 12 ] 3 + + Nc[ 1 ] 7 + bc[ 1 ] 2 + Mc[ 1 ] 2 + xmaxc[ 1 ] 6 + xmc[ 13 ] 3 + xmc[ 14 ] 3 + xmc[ 15 ] 3 + xmc[ 16 ] 3 + xmc[ 17 ] 3 + xmc[ 18 ] 3 + xmc[ 19 ] 3 + xmc[ 20 ] 3 + xmc[ 21 ] 3 + xmc[ 22 ] 3 + xmc[ 23 ] 3 + xmc[ 24 ] 3 + xmc[ 25 ] 3 + + Nc[ 2 ] 7 + bc[ 2 ] 2 + Mc[ 2 ] 2 + xmaxc[ 2 ] 6 + xmc[ 26 ] 3 + xmc[ 27 ] 3 + xmc[ 28 ] 3 + xmc[ 29 ] 3 + xmc[ 30 ] 3 + xmc[ 31 ] 3 + xmc[ 32 ] 3 + xmc[ 33 ] 3 + xmc[ 34 ] 3 + xmc[ 35 ] 3 + xmc[ 36 ] 3 + xmc[ 37 ] 3 + xmc[ 38 ] 3 + + Nc[ 3 ] 7 + bc[ 3 ] 2 + Mc[ 3 ] 2 + xmaxc[ 3 ] 6 + xmc[ 39 ] 3 + xmc[ 40 ] 3 + xmc[ 41 ] 3 + xmc[ 42 ] 3 + xmc[ 43 ] 3 + xmc[ 44 ] 3 + xmc[ 45 ] 3 + xmc[ 46 ] 3 + xmc[ 47 ] 3 + xmc[ 48 ] 3 + xmc[ 49 ] 3 + xmc[ 50 ] 3 + xmc[ 51 ] 3 + */ + + *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ + | ((LARc[0] >> 2) & 0xF); + *c++ = ((LARc[0] & 0x3) << 6) | (LARc[1] & 0x3F); + *c++ = ((LARc[2] & 0x1F) << 3) | ((LARc[3] >> 2) & 0x7); + *c++ = ((LARc[3] & 0x3) << 6) | ((LARc[4] & 0xF) << 2) | + ((LARc[5] >> 2) & 0x3); + *c++ = ((LARc[5] & 0x3) << 6) | ((LARc[6] & 0x7) << 3) | (LARc[7] & 0x7); + *c++ = ((Nc[0] & 0x7F) << 1) | ((bc[0] >> 1) & 0x1); + *c++ = + ((bc[0] & 0x1) << 7) | ((Mc[0] & 0x3) << 5) | ((xmaxc[0] >> 1) & 0x1F); + *c++ = ((xmaxc[0] & 0x1) << 7) | ((xmc[0] & 0x7) << 4) | + ((xmc[1] & 0x7) << 1) | ((xmc[2] >> 2) & 0x1); + *c++ = ((xmc[2] & 0x3) << 6) | ((xmc[3] & 0x7) << 3) | (xmc[4] & 0x7); + *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ + | ((xmc[6] & 0x7) << 2) | ((xmc[7] >> 1) & 0x3); + *c++ = ((xmc[7] & 0x1) << 7) | ((xmc[8] & 0x7) << 4) | + ((xmc[9] & 0x7) << 1) | ((xmc[10] >> 2) & 0x1); + *c++ = ((xmc[10] & 0x3) << 6) | ((xmc[11] & 0x7) << 3) | (xmc[12] & 0x7); + *c++ = ((Nc[1] & 0x7F) << 1) | ((bc[1] >> 1) & 0x1); + *c++ = + ((bc[1] & 0x1) << 7) | ((Mc[1] & 0x3) << 5) | ((xmaxc[1] >> 1) & 0x1F); + *c++ = ((xmaxc[1] & 0x1) << 7) | ((xmc[13] & 0x7) << 4) | + ((xmc[14] & 0x7) << 1) | ((xmc[15] >> 2) & 0x1); + *c++ = ((xmc[15] & 0x3) << 6) | ((xmc[16] & 0x7) << 3) | (xmc[17] & 0x7); + *c++ = ((xmc[18] & 0x7) << 5) | ((xmc[19] & 0x7) << 2) | + ((xmc[20] >> 1) & 0x3); + *c++ = ((xmc[20] & 0x1) << 7) | ((xmc[21] & 0x7) << 4) | + ((xmc[22] & 0x7) << 1) | ((xmc[23] >> 2) & 0x1); + *c++ = ((xmc[23] & 0x3) << 6) | ((xmc[24] & 0x7) << 3) | (xmc[25] & 0x7); + *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ + | ((bc[2] >> 1) & 0x1); + *c++ = + ((bc[2] & 0x1) << 7) | ((Mc[2] & 0x3) << 5) | ((xmaxc[2] >> 1) & 0x1F); + *c++ = ((xmaxc[2] & 0x1) << 7) | ((xmc[26] & 0x7) << 4) | + ((xmc[27] & 0x7) << 1) | ((xmc[28] >> 2) & 0x1); + *c++ = ((xmc[28] & 0x3) << 6) | ((xmc[29] & 0x7) << 3) | (xmc[30] & 0x7); + *c++ = ((xmc[31] & 0x7) << 5) | ((xmc[32] & 0x7) << 2) | + ((xmc[33] >> 1) & 0x3); + *c++ = ((xmc[33] & 0x1) << 7) | ((xmc[34] & 0x7) << 4) | + ((xmc[35] & 0x7) << 1) | ((xmc[36] >> 2) & 0x1); + *c++ = ((xmc[36] & 0x3) << 6) | ((xmc[37] & 0x7) << 3) | (xmc[38] & 0x7); + *c++ = ((Nc[3] & 0x7F) << 1) | ((bc[3] >> 1) & 0x1); + *c++ = + ((bc[3] & 0x1) << 7) | ((Mc[3] & 0x3) << 5) | ((xmaxc[3] >> 1) & 0x1F); + *c++ = ((xmaxc[3] & 0x1) << 7) | ((xmc[39] & 0x7) << 4) | + ((xmc[40] & 0x7) << 1) | ((xmc[41] >> 2) & 0x1); + *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ + | ((xmc[42] & 0x7) << 3) | (xmc[43] & 0x7); + *c++ = ((xmc[44] & 0x7) << 5) | ((xmc[45] & 0x7) << 2) | + ((xmc[46] >> 1) & 0x3); + *c++ = ((xmc[46] & 0x1) << 7) | ((xmc[47] & 0x7) << 4) | + ((xmc[48] & 0x7) << 1) | ((xmc[49] >> 2) & 0x1); + *c++ = ((xmc[49] & 0x3) << 6) | ((xmc[50] & 0x7) << 3) | (xmc[51] & 0x7); +} + +/* decode.c */ +/* + 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER +*/ + +/* code.c */ +void +gsm_enc_Gsm_Coder( + + struct gsm_state *S, + + word *s, /* [ 0..159 ] samples IN */ + + /* + The RPE-LTD coder works on a frame by frame basis. The length of + the frame is equal to 160 samples. Some computations are done + once per frame to produce at the output of the coder the + LARc[ 1..8 ] parameters which are the coded LAR coefficients and + also to realize the inverse filtering operation for the entire + frame (160 samples of signal d[ 0..159 ]). These parts produce at + the output of the coder: + */ + + word *LARc, /* [ 0..7 ] LAR coefficients OUT */ + + /* + Procedure 4.2.11 to 4.2.18 are to be executed four times per + frame. That means once for each sub-segment RPE-LTP analysis of + 40 samples. These parts produce at the output of the coder: + */ + + word *Nc, /* [ 0..3 ] LTP lag OUT */ + word *bc, /* [ 0..3 ] coded LTP gain OUT */ + word *Mc, /* [ 0..3 ] RPE grid selection OUT */ + word *xmaxc, /* [ 0..3 ] Coded maximum amplitude OUT */ + word *xMc /* [ 13*4 ] normalized RPE samples OUT */ +) { + int k; + word *dp = S->dp0 + 120; /* [ -120...-1 ] */ + word *dpp = dp; /* [ 0...39 ] */ + + static word e[50] = {0}; + + word so[160]; + + gsm_enc_Gsm_Preprocess(S, s, so); + gsm_enc_Gsm_LPC_Analysis(so, LARc); + gsm_enc_Gsm_Short_Term_Analysis_Filter(S, LARc, so); + + __pragma_loopbound(4, 4); + for (k = 0; k <= 3; k++, xMc += 13) { + + gsm_enc_Gsm_Long_Term_Predictor(so + k * 40, /* d [ 0..39 ] IN */ + dp, /* dp [ -120..-1 ] IN */ + e + 5, /* e [ 0..39 ] OUT */ + dpp, /* dpp [ 0..39 ] OUT */ + Nc++, bc++); + + gsm_enc_Gsm_RPE_Encoding(e + 5, /* e ][ 0..39 ][ IN/OUT */ + xmaxc++, Mc++, xMc); + /* + gsm_enc_Gsm_Update_of_reconstructed_short_time_residual_signal + ( dpp, e + 5, dp ); + */ + + { + int i; + longword ltmp; + __pragma_loopbound(40, 40); + for (i = 0; i <= 39; i++) + dp[i] = GSM_ADD(e[5 + i], dpp[i]); + } + + dp += 40; + dpp += 40; + } + // //(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160), + // // 120 * sizeof(*S->dp0) ); +} + +/* rpe.c */ +/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION + */ + +/* 4.2.13 */ + +void +gsm_enc_Weighting_filter(word *e, /* signal [ -5..0.39.44 ] IN */ + word *x /* signal [ 0..39 ] OUT */ + ) +/* + The coefficients of the weighting filter are stored in a table + (see table 4.4). The following scaling is used: + + H[ 0..10 ] = integer( real_H[ 0..10 ] * 8192 ); +*/ +{ + /* word wt[ 50 ]; */ + + longword L_result; + int k /* , i */; + + /* Initialization of a temporary working array wt[ 0...49 ] + */ + + /* for (k = 0; k <= 4; k++) wt[ k ] = 0; + for (k = 5; k <= 44; k++) wt[ k ] = *e++; + for (k = 45; k <= 49; k++) wt[ k ] = 0; + + (e[ -5..-1 ] and e[ 40..44 ] are allocated by the caller, + are initially zero and are not written anywhere.) + */ + e -= 5; + + /* Compute the signal x[ 0..39 ] + */ + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + + L_result = 8192 >> 1; + + /* for (i = 0; i <= 10; i++) { + L_temp = GSM_L_MULT( wt[ k+i ], gsm_enc_H[ i ] ); + L_result = GSM_L_ADD( L_result, L_temp ); + } + */ + +#undef STEP +#define STEP(i, H) (e[k + i] * (longword) H) + + /* Every one of these multiplications is done twice -- + but I don't see an elegant way to optimize this. + Do you? + */ + +#ifdef STUPID_COMPILER + L_result += STEP(0, -134); + L_result += STEP(1, -374); + /* + STEP( 2, 0 ) */ + L_result += STEP(3, 2054); + L_result += STEP(4, 5741); + L_result += STEP(5, 8192); + L_result += STEP(6, 5741); + L_result += STEP(7, 2054); + /* + STEP( 8, 0 ) */ + L_result += STEP(9, -374); + L_result += STEP(10, -134); +#else + L_result += STEP(0, -134) + + STEP(1, -374) + /* + STEP( 2, 0 ) */ + + STEP(3, 2054) + STEP(4, 5741) + STEP(5, 8192) + + STEP(6, 5741) + + STEP(7, 2054) + /* + STEP( 8, 0 ) */ + + STEP(9, -374) + STEP(10, -134); +#endif + /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) + L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) + + x[ k ] = SASR( L_result, 16 ); + */ + + /* 2 adds vs. >>16 => 14, minus one shift to compensate for + those we lost when replacing L_MULT by '*'. + */ + + L_result = SASR(L_result, 13); + x[k] = + (L_result < MIN_WORD ? MIN_WORD + : (L_result > MAX_WORD ? MAX_WORD : L_result)); + } +} + +/* 4.2.14 */ + +void +gsm_enc_RPE_grid_selection(word *x, /* [ 0..39 ] IN */ + word *xM, /* [ 0..12 ] OUT */ + word *Mc_out /* OUT */ + ) +/* + The signal x[ 0..39 ] is used to select the RPE grid which is + represented by Mc. +*/ +{ + /* word temp1; */ + int /* m, */ i; + longword L_result, L_temp; + longword EM; /* xxx should be L_EM? */ + word Mc; + + longword L_common_0_3; + + Mc = 0; + +#undef STEP +#define STEP(m, i) \ + L_temp = SASR(x[m + 3 * i], 2); \ + L_result += L_temp * L_temp; + + /* common part of 0 and 3 */ + + L_result = 0; + STEP(0, 1); + STEP(0, 2); + STEP(0, 3); + STEP(0, 4); + STEP(0, 5); + STEP(0, 6); + STEP(0, 7); + STEP(0, 8); + STEP(0, 9); + STEP(0, 10); + STEP(0, 11); + STEP(0, 12); + L_common_0_3 = L_result; + + /* i = 0 */ + + STEP(0, 0); + L_result <<= 1; /* implicit in L_MULT */ + EM = L_result; + + /* i = 1 */ + + L_result = 0; + STEP(1, 0); + STEP(1, 1); + STEP(1, 2); + STEP(1, 3); + STEP(1, 4); + STEP(1, 5); + STEP(1, 6); + STEP(1, 7); + STEP(1, 8); + STEP(1, 9); + STEP(1, 10); + STEP(1, 11); + STEP(1, 12); + L_result <<= 1; + if (L_result > EM) { + Mc = 1; + EM = L_result; + } + + /* i = 2 */ + + L_result = 0; + STEP(2, 0); + STEP(2, 1); + STEP(2, 2); + STEP(2, 3); + STEP(2, 4); + STEP(2, 5); + STEP(2, 6); + STEP(2, 7); + STEP(2, 8); + STEP(2, 9); + STEP(2, 10); + STEP(2, 11); + STEP(2, 12); + L_result <<= 1; + if (L_result > EM) { + Mc = 2; + EM = L_result; + } + + /* i = 3 */ + + L_result = L_common_0_3; + STEP(3, 12); + L_result <<= 1; + if (L_result > EM) + Mc = 3; + + /**/ + + /* Down-sampling by a factor 3 to get the selected xM[ 0..12 ] + RPE sequence. + */ + __pragma_loopbound(13, 13); + for (i = 0; i <= 12; i++) + xM[i] = x[Mc + 3 * i]; + *Mc_out = Mc; +} + +/* 4.12.15 */ + +void +gsm_enc_APCM_quantization_xmaxc_to_exp_mant(word xmaxc, /* IN */ + word *exp_out, /* OUT */ + word *mant_out) /* OUT */ +{ + word exp, mant; + + /* Compute exponent and mantissa of the decoded version of xmaxc + */ + exp = 0; + if (xmaxc > 15) + exp = SASR(xmaxc, 3) - 1; + mant = xmaxc - (exp << 3); + + if (mant == 0) { + exp = -4; + mant = 7; + } else { + __pragma_loopbound(0, 3); + while (mant <= 7) { + mant = mant << 1 | 1; + exp--; + } + mant -= 8; + } + + *exp_out = exp; + *mant_out = mant; +} + +void +gsm_enc_APCM_quantization(word *xM, /* [ 0..12 ] IN */ + + word *xMc, /* [ 0..12 ] OUT */ + word *mant_out, /* OUT */ + word *exp_out, /* OUT */ + word *xmaxc_out /* OUT */ +) { + int i, itest; + + word xmax, xmaxc, temp, temp1, temp2; + word exp, mant; + + /* Find the maximum absolute value xmax of xM[ 0..12 ]. + */ + + xmax = 0; + + __pragma_loopbound(13, 13); + for (i = 0; i <= 12; i++) { + temp = xM[i]; + temp = GSM_ABS(temp); + if (temp > xmax) + xmax = temp; + } + + /* Qantizing and coding of xmax to get xmaxc. + */ + + exp = 0; + temp = SASR(xmax, 9); + itest = 0; + + __pragma_loopbound(6, 6); + for (i = 0; i <= 5; i++) { + + itest |= (temp <= 0); + temp = SASR(temp, 1); + + if (itest == 0) + exp++; // exp = add (exp, 1) + } + + temp = exp + 5; + + // xmaxc = gsm_enc_add( SASR(xmax, temp), exp << 3 ); + xmaxc = saturate((SASR(xmax, temp) + (exp << 3))); + + /* Quantizing and coding of the xM[ 0..12 ] RPE sequence + to get the xMc[ 0..12 ] + */ + + gsm_enc_APCM_quantization_xmaxc_to_exp_mant(xmaxc, &exp, &mant); + + /* This computation uses the fact that the decoded version of xmaxc + can be calculated by using the exponent and the mantissa part of + xmaxc (logarithmic table). + So, this method avoids any division and uses only a scaling + of the RPE samples by a function of the exponent. A direct + multiplication by the inverse of the mantissa (NRFAC[ 0..7 ] + found in table 4.5) gives the 3 bit coded version xMc[ 0..12 ] + of the RPE samples. + */ + + /* Direct computation of xMc[ 0..12 ] using table 4.5 + */ + + temp1 = 6 - exp; /* normalization by the exponent */ + temp2 = gsm_enc_NRFAC[mant]; /* inverse mantissa */ + + __pragma_loopbound(13, 13); + for (i = 0; i <= 12; i++) { + + temp = xM[i] << temp1; + temp = GSM_MULT(temp, temp2); + temp = SASR(temp, 12); + xMc[i] = temp + 4; /* see note below */ + } + + /* NOTE: This equation is used to make all the xMc[ i ] positive. + */ + + *mant_out = mant; + *exp_out = exp; + *xmaxc_out = xmaxc; +} + +/* 4.2.16 */ + +void +gsm_enc_APCM_inverse_quantization(word *xMc, /* [ 0..12 ] IN */ + word mant, word exp, + word *xMp) /* [ 0..12 ] OUT */ +/* + This part is for decoding the RPE sequence of coded xMc[ 0..12 ] + samples to obtain the xMp[ 0..12 ] array. Table 4.6 is used to get + the mantissa of xmaxc (FAC[ 0..7 ]). +*/ +{ + int i; + word temp, temp1, temp2, temp3; + longword ltmp; + + temp1 = gsm_enc_FAC[mant]; /* see 4.2-15 for mant */ + temp2 = gsm_enc_sub(6, exp); /* see 4.2-15 for exp */ + temp3 = gsm_enc_asl(1, gsm_enc_sub(temp2, 1)); + + __pragma_loopbound(13, 13); + for (i = 13; i--;) { + + /* temp = gsm_enc_sub( *xMc++ << 1, 7 ); */ + temp = (*xMc++ << 1) - 7; /* restore sign */ + + temp <<= 12; /* 16 bit signed */ + temp = GSM_MULT_R(temp1, temp); + temp = GSM_ADD(temp, temp3); + *xMp++ = gsm_enc_asr(temp, temp2); + } +} + +/* 4.2.17 */ + +void +gsm_enc_RPE_grid_positioning(word Mc, /* grid position IN */ + word *xMp, /* [ 0..12 ] IN */ + word *ep /* [ 0..39 ] OUT */ + ) +/* + This procedure computes the reconstructed long term residual signal + ep[ 0..39 ] for the LTP analysis filter. The inputs are the Mc + which is the grid position selection and the xMp[ 0..12 ] decoded + RPE samples which are upsampled by a factor of 3 by inserting zero + values. +*/ +{ + int i = 13; + + // + // TODO: rewritten Duff's device for WCET analysis! + // + switch (Mc) { + case 3: + *ep++ = 0; + case 2: + *ep++ = 0; + case 1: + *ep++ = 0; + case 0: + *ep++ = *xMp++; + i--; + } + + __pragma_loopbound(12, 12); + do { + *ep++ = 0; + *ep++ = 0; + *ep++ = *xMp++; + } while (--i); + + __pragma_loopbound(0, 3); + while (++Mc < 4) + *ep++ = 0; +} +/* + { + int i = 13; + + // + //TODO: removed for WCET analysis + //_Pragma("marker outside") + switch (Mc) { + case 3: *ep++ = 0; + case 2: +__pragma_loopbound(13, 13); + do { + ep++ = 0; + case 1: *ep++ = 0; + case 0: + //_Pragma("marker inside") + ep++ = *xMp++; + } while (--i); + } + + //_Pragma("flowrestriction 1*inside <= 13*outside") + +__pragma_loopbound(0, 3); + while (++Mc < 4) *ep++ = 0; + + } +*/ + +/* 4.2.18 */ + +/* This procedure adds the reconstructed long term residual signal + ep[ 0..39 ] to the estimated signal dpp[ 0..39 ] from the long term + analysis filter to compute the reconstructed short term residual + signal dp[ -40..-1 ]; also the reconstructed short term residual + array dp[ -120..-41 ] is updated. +*/ + +#if 0 /* Has been inlined in code.c */ +void gsm_enc_Gsm_Update_of_reconstructed_short_time_residual_signal P3( ( dpp, + ep, dp ), + word *dpp, /* [ 0...39 ] IN */ + word *ep, /* [ 0...39 ] IN */ + word *dp ) /* [ -120...-1 ] IN/OUT */ +{ + int k; + + _Pragma( "loopbound min 80 max 80" ) + for ( k = 0; k <= 79; k++ ) + dp[ -120 + k ] = dp[ -80 + k ]; + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) + dp[ -40 + k ] = gsm_enc_add( ep[ k ], dpp[ k ] ); +} +#endif /* Has been inlined in code.c */ + +void +gsm_enc_Gsm_RPE_Encoding( + + word *e, /* -5..-1 ][ 0..39 ][ 40..44 IN/OUT */ + word *xmaxc, /* OUT */ + word *Mc, /* OUT */ + word *xMc) /* [ 0..12 ] OUT */ +{ + word x[40]; + word xM[13], xMp[13]; + word mant, exp; + + gsm_enc_Weighting_filter(e, x); + gsm_enc_RPE_grid_selection(x, xM, Mc); + + gsm_enc_APCM_quantization(xM, xMc, &mant, &exp, xmaxc); + gsm_enc_APCM_inverse_quantization(xMc, mant, exp, xMp); + + gsm_enc_RPE_grid_positioning(*Mc, xMp, e); +} + +/* long_term.c */ +#ifdef USE_TABLE_MUL + +unsigned int umul_table[513][256]; + +#define umul(x9, x15) \ + ((int) (umul_table[x9][x15 & 0x0FF] + (umul_table[x9][x15 >> 8] << 8))) + +#define table_mul(a, b) \ + ((a < 0) ? ((b < 0) ? umul(-a, -b) : -umul(-a, b)) \ + : ((b < 0) ? -umul(a, -b) : umul(a, b))) + +#endif /* USE_TABLE_MUL */ + +/* + 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION +*/ + +/* + This procedure computes the LTP gain (bc) and the LTP lag (Nc) + for the long term analysis filter. This is done by calculating a + maximum of the cross-correlation function between the current + sub-segment short term residual signal d[ 0..39 ] (output of + the short term analysis filter; for simplification the index + of this array begins at 0 and ends at 39 for each sub-segment of the + RPE-LTP analysis) and the previous reconstructed short term + residual signal dp[ -120 .. -1 ]. A dynamic scaling must be + performed to avoid overflow. +*/ + +/* This procedure exists in four versions. First, the two integer + versions with or without table-multiplication (as one function); + then, the two floating point versions (as another function), with + or without scaling. +*/ + +#ifndef USE_FLOAT_MUL + +void +gsm_enc_Calculation_of_the_LTP_parameters(word *d, /* [ 0..39 ] IN */ + word *dp, /* [ -120..-1 ] IN */ + word *bc_out, /* OUT */ + word *Nc_out /* OUT */ +) { + int k, lambda; + word Nc, bc; + word wt[40]; + + longword L_max, L_power; + word R, S, dmax, scal; + word temp; + + /* Search of the optimum scaling of d[ 0..39 ]. + */ + dmax = 0; + + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS(temp); + if (temp > dmax) + dmax = temp; + } + + temp = 0; + if (dmax != 0) + temp = gsm_enc_norm((longword) dmax << 16); + + if (temp > 6) + scal = 0; + else + scal = 6 - temp; + + /* Initialization of a working array wt + */ + + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) + wt[k] = SASR(d[k], scal); + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + __pragma_loopbound(81, 81); + for (lambda = 40; lambda <= 120; lambda++) { + +#undef STEP +#ifdef USE_TABLE_MUL +#define STEP(k) (table_mul(wt[k], dp[k - lambda])) +#else +#define STEP(k) (wt[k] * dp[k - lambda]) +#endif + + longword L_result; + + L_result = STEP(0); + L_result += STEP(1); + L_result += STEP(2); + L_result += STEP(3); + L_result += STEP(4); + L_result += STEP(5); + L_result += STEP(6); + L_result += STEP(7); + L_result += STEP(8); + L_result += STEP(9); + L_result += STEP(10); + L_result += STEP(11); + L_result += STEP(12); + L_result += STEP(13); + L_result += STEP(14); + L_result += STEP(15); + L_result += STEP(16); + L_result += STEP(17); + L_result += STEP(18); + L_result += STEP(19); + L_result += STEP(20); + L_result += STEP(21); + L_result += STEP(22); + L_result += STEP(23); + L_result += STEP(24); + L_result += STEP(25); + L_result += STEP(26); + L_result += STEP(27); + L_result += STEP(28); + L_result += STEP(29); + L_result += STEP(30); + L_result += STEP(31); + L_result += STEP(32); + L_result += STEP(33); + L_result += STEP(34); + L_result += STEP(35); + L_result += STEP(36); + L_result += STEP(37); + L_result += STEP(38); + L_result += STEP(39); + + if (L_result > L_max) { + + Nc = lambda; + L_max = L_result; + } + } + + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + /* Compute the power of the reconstructed short term residual + signal dp[ .. ] + */ + L_power = 0; + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + + longword L_temp; + + L_temp = SASR(dp[k - Nc], 3); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_enc_norm(L_power); + + R = SASR(L_max << temp, 16); + S = SASR(L_power << temp, 16); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[ i ] for the + quantization of the LTP gain b to get the coded version bc. + */ + __pragma_loopbound(3, 3); + for (bc = 0; bc <= 2; bc++) + /* Replaced by macro function. */ + // if (R <= gsm_enc_mult(S, gsm_enc_DLB[ bc ])) + if (R <= GSM_MULT(S, gsm_enc_DLB[bc])) + break; + + *bc_out = bc; +} + +#else /* USE_FLOAT_MUL */ + +void +gsm_enc_Calculation_of_the_LTP_parameters(word *d, /* [ 0..39 ] IN */ + word *dp, /* [ -120..-1 ] IN */ + word *bc_out, /* OUT */ + word *Nc_out /* OUT */ +) { + int k, lambda; + word Nc, bc; + + float wt_float[40]; + float dp_float_base[120], *dp_float = dp_float_base + 120; + + longword L_max, L_power; + word R, S, dmax, scal; + word temp; + + /* Search of the optimum scaling of d[ 0..39 ]. + */ + dmax = 0; + + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS(temp); + if (temp > dmax) + dmax = temp; + } + + temp = 0; + if (dmax == 0) + scal = 0; + else + temp = gsm_enc_norm((longword) dmax << 16); + + if (temp > 6) + scal = 0; + else + scal = 6 - temp; + + /* Initialization of a working array wt + */ + + __pragma_loopbound(40, 40); + for (k = 0; k < 40; k++) + wt_float[k] = SASR(d[k], scal); + __pragma_loopbound(120, 120); + for (k = -120; k < 0; k++) + dp_float[k] = dp[k]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + __pragma_loopbound(9, 9); + for (lambda = 40; lambda <= 120; lambda += 9) { + + /* Calculate L_result for l = lambda .. lambda + 9. + */ + float *lp = dp_float - lambda; + + float W; + float a = lp[-8], b = lp[-7], c = lp[-6], d = lp[-5], e = lp[-4], + f = lp[-3], g = lp[-2], h = lp[-1]; + float E; + float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, S5 = 0, S6 = 0, S7 = 0, + S8 = 0; + +#undef STEP +#define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float[K]; \ + E = W * a; \ + S8 += E; \ + E = W * b; \ + S7 += E; \ + E = W * c; \ + S6 += E; \ + E = W * d; \ + S5 += E; \ + E = W * e; \ + S4 += E; \ + E = W * f; \ + S3 += E; \ + E = W * g; \ + S2 += E; \ + E = W * h; \ + S1 += E; \ + a = lp[K]; \ + E = W * a; \ + S0 += E + +#define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) +#define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) +#define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) +#define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) +#define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) +#define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) +#define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) +#define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) + + STEP_A(0); + STEP_B(1); + STEP_C(2); + STEP_D(3); + STEP_E(4); + STEP_F(5); + STEP_G(6); + STEP_H(7); + + STEP_A(8); + STEP_B(9); + STEP_C(10); + STEP_D(11); + STEP_E(12); + STEP_F(13); + STEP_G(14); + STEP_H(15); + + STEP_A(16); + STEP_B(17); + STEP_C(18); + STEP_D(19); + STEP_E(20); + STEP_F(21); + STEP_G(22); + STEP_H(23); + + STEP_A(24); + STEP_B(25); + STEP_C(26); + STEP_D(27); + STEP_E(28); + STEP_F(29); + STEP_G(30); + STEP_H(31); + + STEP_A(32); + STEP_B(33); + STEP_C(34); + STEP_D(35); + STEP_E(36); + STEP_F(37); + STEP_G(38); + STEP_H(39); + + if (S0 > L_max) { + L_max = S0; + Nc = lambda; + } + if (S1 > L_max) { + L_max = S1; + Nc = lambda + 1; + } + if (S2 > L_max) { + L_max = S2; + Nc = lambda + 2; + } + if (S3 > L_max) { + L_max = S3; + Nc = lambda + 3; + } + if (S4 > L_max) { + L_max = S4; + Nc = lambda + 4; + } + if (S5 > L_max) { + L_max = S5; + Nc = lambda + 5; + } + if (S6 > L_max) { + L_max = S6; + Nc = lambda + 6; + } + if (S7 > L_max) { + L_max = S7; + Nc = lambda + 7; + } + if (S8 > L_max) { + L_max = S8; + Nc = lambda + 8; + } + } + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + /* Compute the power of the reconstructed short term residual + signal dp[ .. ] + */ + L_power = 0; + __pragma_loopbound(40, 40); + for (k = 0; k <= 39; k++) { + + longword L_temp; + + L_temp = SASR(dp[k - Nc], 3); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_enc_norm(L_power); + + R = SASR(L_max << temp, 16); + S = SASR(L_power << temp, 16); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[ i ] for the + quantization of the LTP gain b to get the coded version bc. + */ + // Replaced by macro function. + // for (bc = 0; bc <= 2; bc++) if (R <= gsm_enc_mult(S, gsm_enc_DLB[ bc ])) + // break; + _Pragma( + "loopbound min 3 max 3") for (bc = 0; bc <= 2; + bc++) if (R <= + GSM_MULT( + S, gsm_enc_DLB[bc])) break; + *bc_out = bc; +} + +#endif /* USE_FLOAT_MUL */ + +/* 4.2.12 */ + +void +gsm_enc_Long_term_analysis_filtering( + word bc, /* IN */ + word Nc, /* IN */ + word *dp, /* previous d [ -120..-1 ] IN */ + word *d, /* d [ 0..39 ] IN */ + word *dpp, /* estimate [ 0..39 ] OUT */ + word *e /* long term res. signal [ 0..39 ] OUT */ + ) +/* + In this part, we have to decode the bc parameter to compute + the samples of the estimate dpp[ 0..39 ]. The decoding of bc needs the + use of table 4.3b. The long term residual signal e[ 0..39 ] + is then calculated to be fed to the RPE encoding section. +*/ +{ + int k; + longword ltmp; + +#undef STEP +#define STEP(BP) \ + __pragma_loopbound(40, 40); \ + for (k = 0; k <= 39; k++) { \ + dpp[k] = GSM_MULT_R(BP, dp[k - Nc]); \ + e[k] = GSM_SUB(d[k], dpp[k]); \ + } + + switch (bc) { + case 0: + STEP(3277); + break; + case 1: + STEP(11469); + break; + case 2: + STEP(21299); + break; + case 3: + STEP(32767); + break; + } +} + +void +gsm_enc_Gsm_Long_Term_Predictor( + + word *d, /* [ 0..39 ] residual signal IN */ + word *dp, /* [ -120..-1 ] d' IN */ + + word *e, /* [ 0..39 ] OUT */ + word *dpp, /* [ 0..39 ] OUT */ + word *Nc, /* correlation lag OUT */ + word *bc /* gain factor OUT */ +) { + + gsm_enc_Calculation_of_the_LTP_parameters(d, dp, bc, Nc); + + gsm_enc_Long_term_analysis_filtering(*bc, *Nc, dp, d, dpp, e); +} + +/* short_term.c */ +/* + SHORT TERM ANALYSIS FILTERING SECTION +*/ + +/* 4.2.8 */ + +void +gsm_enc_Decoding_of_the_coded_Log_Area_Ratios( + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *LARpp) /* out: decoded .. */ +{ + word temp1 /* , temp2 */; + long ltmp; /* for GSM_ADD */ + + /* This procedure requires for efficient implementation + two tables. + + INVA[ 1..8 ] = integer( (32768 * 8) / real_A[ 1..8 ]) + MIC[ 1..8 ] = minimum value of the LARc[ 1..8 ] + */ + + /* Compute the LARpp[ 1..8 ] + */ + +#undef STEP +#define STEP(B, MIC, INVA) \ + temp1 = GSM_ADD(*LARc++, MIC) << 10; \ + temp1 = GSM_SUB(temp1, (B >= 0 ? B << 1 : -((-B) << 1))); \ + temp1 = GSM_MULT_R(INVA, temp1); \ + *LARpp++ = GSM_ADD(temp1, temp1); + + STEP(0, -32, 13107); + STEP(0, -32, 13107); + STEP(2048, -16, 13107); + STEP(-2560, -16, 13107); + + STEP(94, -8, 19223); + STEP(-1792, -8, 17476); + STEP(-341, -4, 31454); + STEP(-1144, -4, 29708); + + /* NOTE: the addition of *MIC is used to restore + the sign of *LARc. + */ +} + +/* 4.2.9 */ +/* Computation of the quantized reflection coefficients + */ + +/* 4.2.9.1 Interpolation of the LARpp[ 1..8 ] to get the LARp[ 1..8 ] + */ + +/* + Within each frame of 160 analyzed speech samples the short term + analysis and synthesis filters operate with four different sets of + coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) + and the actual set of decoded LARs (LARpp(j)) + + (Initial value: LARpp(j-1)[ 1..8 ] = 0.) +*/ + +__attribute__((always_inline)) static inline void +gsm_enc_Coefficients_0_12(word *LARpp_j_1, word *LARpp_j, word *LARp) { + int i; + longword ltmp; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { + *LARp = GSM_ADD(SASR(*LARpp_j_1, 2), SASR(*LARpp_j, 2)); + *LARp = GSM_ADD(*LARp, SASR(*LARpp_j_1, 1)); + } +} + +__attribute__((always_inline)) static inline void +gsm_enc_Coefficients_13_26(word *LARpp_j_1, word *LARpp_j, word *LARp) { + int i; + longword ltmp; + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) + *LARp = GSM_ADD(SASR(*LARpp_j_1, 1), SASR(*LARpp_j, 1)); +} + +__attribute__((always_inline)) static inline void +gsm_enc_Coefficients_27_39(word *LARpp_j_1, word *LARpp_j, word *LARp) { + int i; + longword ltmp; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { + *LARp = GSM_ADD(SASR(*LARpp_j_1, 2), SASR(*LARpp_j, 2)); + *LARp = GSM_ADD(*LARp, SASR(*LARpp_j, 1)); + } +} + +__attribute__((always_inline)) static inline void +gsm_enc_Coefficients_40_159(word *LARpp_j, word *LARp) { + int i; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARp++, LARpp_j++) + *LARp = *LARpp_j; +} + +/* 4.2.9.2 */ + +void +gsm_enc_LARp_to_rp(word *LARp) /* [ 0..7 ] IN/OUT */ +/* + The input of this procedure is the interpolated LARp[ 0..7 ] array. + The reflection coefficients, rp[ i ], are used in the analysis + filter and in the synthesis filter. +*/ +{ + int i; + word temp; + longword ltmp; + + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, LARp++) { + + /* temp = GSM_ABS( *LARp ); + + if (temp < 11059) temp <<= 1; + else if (temp < 20070) temp += 11059; + else temp = GSM_ADD( temp >> 2, 26112 ); + + * *LARp = *LARp < 0 ? -temp : temp; + */ + + if (*LARp < 0) { + temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); + *LARp = -((temp < 11059) + ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD(temp >> 2, 26112))); + } else { + temp = *LARp; + *LARp = (temp < 11059) + ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD(temp >> 2, 26112)); + } + } +} + +/* 4.2.10 */ +void +gsm_enc_Short_term_analysis_filtering(struct gsm_state *S, + word *rp, /* [ 0..7 ] IN */ + int k_n, /* k_end - k_start */ + word *s /* [ 0..n-1 ] IN/OUT */ + ) +/* + This procedure computes the short term residual signal d[ .. ] to be fed + to the RPE-LTP loop from the s[ .. ] signal and from the local rp[ .. ] + array (quantized reflection coefficients). As the call of this + procedure can be done in many ways (see the interpolation of the LAR + coefficient), it is assumed that the computation begins with index + k_start (for arrays d[ .. ] and s[ .. ]) and stops with index k_end + (k_start and k_end are defined in 4.2.9.1). This procedure also + needs to keep the array u[ 0..7 ] in memory for each call. +*/ +{ + word *u = S->u; + int i; + word di, zzz, ui, sav, rpi; + longword ltmp; + int j; + + __pragma_loopbound(13, 120); + for (j = 0; j < k_n; ++j) { + + di = sav = *s; + + __pragma_loopbound(8, 8); + for (i = 0; i < 8; i++) { /* YYY */ + + ui = u[i]; + rpi = rp[i]; + u[i] = sav; + + zzz = GSM_MULT_R(rpi, di); + sav = GSM_ADD(ui, zzz); + + zzz = GSM_MULT_R(rpi, ui); + di = GSM_ADD(di, zzz); + } + + *s = di; + } +} + +void +gsm_enc_Gsm_Short_Term_Analysis_Filter( + + struct gsm_state *S, + + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *s /* signal [ 0..159 ] IN/OUT */ +) { + word *LARpp_j = S->LARpp[S->j]; + word *LARpp_j_1 = S->LARpp[S->j ^= 1]; + + word LARp[8]; + +#undef FILTER +#define FILTER gsm_enc_Short_term_analysis_filtering + + gsm_enc_Decoding_of_the_coded_Log_Area_Ratios(LARc, LARpp_j); + + gsm_enc_Coefficients_0_12(LARpp_j_1, LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 13, s); + + gsm_enc_Coefficients_13_26(LARpp_j_1, LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 14, s + 13); + + gsm_enc_Coefficients_27_39(LARpp_j_1, LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 13, s + 27); + + gsm_enc_Coefficients_40_159(LARpp_j, LARp); + gsm_enc_LARp_to_rp(LARp); + FILTER(S, LARp, 120, s + 40); +} + +/* lpc.c */ +#undef P + +/* + 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION +*/ + +/* 4.2.4 */ + +void +gsm_enc_Autocorrelation(word *s, /* [ 0..159 ] IN/OUT */ + longword *L_ACF) /* [ 0..8 ] OUT */ +/* + The goal is to compute the array L_ACF[ k ]. The signal s[ i ] must + be scaled in order to avoid an overflow situation. +*/ +{ + int k, i; + + word temp, smax, scalauto; + + /* Dynamic scaling of the array s[ 0..159 ] + */ + + /* Search for the maximum. + */ + smax = 0; + + __pragma_loopbound(160, 160); + for (k = 0; k <= 159; k++) { + temp = GSM_ABS(s[k]); + if (temp > smax) + smax = temp; + } + + /* Computation of the scaling factor. + */ + if (smax == 0) + scalauto = 0; + else { + scalauto = 4 - gsm_enc_norm((longword) smax << 16); /* sub(4,..) */ + } + + /* Scaling of the array s[ 0...159 ] + */ + + if (scalauto > 0) { + +#define SCALE(n) \ + case n: \ + __pragma_loopbound(160, 160); \ + for (k = 0; k <= 159; k++) \ + s[k] = GSM_MULT_R(s[k], 16384 >> (n - 1)); \ + break; + + switch (scalauto) { + SCALE(1) + SCALE(2) + SCALE(3) + SCALE(4) + } +#undef SCALE + } + + /* Compute the L_ACF[ .. ]. + */ + { + word *sp = s; + word sl = *sp; +#undef STEP +#define STEP(k) L_ACF[k] += ((longword) sl * sp[-(k)]); + +#define NEXTI sl = *++sp + + __pragma_loopbound(9, 9); + for (k = 9; k--; L_ACF[k] = 0) + ; + + STEP(0); + NEXTI; + STEP(0); + STEP(1); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + STEP(6); + NEXTI; + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + STEP(6); + STEP(7); + + __pragma_loopbound(152, 152); + for (i = 8; i <= 159; i++) { + + NEXTI; + + STEP(0); + STEP(1); + STEP(2); + STEP(3); + STEP(4); + STEP(5); + STEP(6); + STEP(7); + STEP(8); + } + + __pragma_loopbound(9, 9); + for (k = 9; k--; L_ACF[k] <<= 1) + ; + } + /* Rescaling of the array s[ 0..159 ] + */ + if (scalauto > 0) { + __pragma_loopbound(160, 160); + for (k = 160; k--; *s++ <<= scalauto) + ; + } +} + +/* 4.2.5 */ + +void +gsm_enc_Reflection_coefficients(longword *L_ACF, /* 0...8 IN */ + word *r /* 0...7 OUT */ +) { + int i, m, n; + word temp; + longword ltmp; + word ACF[9]; /* 0..8 */ + word P[9]; /* 0..8 */ + word K[9]; /* 2..8 */ + + /* Schur recursion with 16 bits arithmetic. + */ + + if (L_ACF[0] == 0) { + __pragma_loopbound(8, 8); + for (i = 8; i--; *r++ = 0) + ; + return; + } + + temp = gsm_enc_norm(L_ACF[0]); + + /* ? overflow ? */ + __pragma_loopbound(9, 9); + for (i = 0; i <= 8; i++) + ACF[i] = SASR(L_ACF[i] << temp, 16); + + /* Initialize array P[ .. ] and K[ .. ] for the recursion. + */ + + __pragma_loopbound(7, 7); + for (i = 1; i <= 7; i++) + K[i] = ACF[i]; + + __pragma_loopbound(9, 9); + for (i = 0; i <= 8; i++) + P[i] = ACF[i]; + + /* Compute reflection coefficients + */ + __pragma_loopbound(8, 8); + _Pragma("marker outer-marker") for (n = 1; n <= 8; n++, r++) { + + temp = P[1]; + temp = GSM_ABS(temp); + if (P[0] < temp) { + + __pragma_loopbound(1, 8); + for (i = n; i <= 8; i++) + *r++ = 0; + _Pragma("marker inner-marker") return; + _Pragma("flowrestriction 1*inner-marker <= 36*outer-marker") + } + + *r = gsm_enc_div(temp, P[0]); + + if (P[1] > 0) + *r = -*r; /* r[ n ] = sub(0, r[ n ]) */ + if (n == 8) + return; + + /* Schur recursion + */ + temp = GSM_MULT_R(P[1], *r); + P[0] = GSM_ADD(P[0], temp); + + __pragma_loopbound(1, 7); + for (m = 1; m <= 8 - n; ++m) { + temp = GSM_MULT_R(K[m], *r); + P[m] = GSM_ADD(P[m + 1], temp); + + temp = GSM_MULT_R(P[m + 1], *r); + K[m] = GSM_ADD(K[m], temp); + } + } +} + +/* 4.2.6 */ + +void +gsm_enc_Transformation_to_Log_Area_Ratios(word *r /* 0..7 IN/OUT */ + ) +/* + The following scaling for r[ .. ] and LAR[ .. ] has been used: + + r[ .. ] = integer( real_r[ .. ]*32768. ); -1 <= real_r < 1. + LAR[ .. ] = integer( real_LAR[ .. ] * 16384 ); + with -1.625 <= real_LAR <= 1.625 +*/ +{ + word temp; + int i; + + /* Computation of the LAR[ 0..7 ] from the r[ 0..7 ] + */ + __pragma_loopbound(8, 8); + for (i = 1; i <= 8; i++, r++) { + + temp = *r; + temp = GSM_ABS(temp); + + if (temp < 22118) + temp >>= 1; + + else if (temp < 31130) + temp -= 11059; + + else { + temp -= 26112; + temp <<= 2; + } + + *r = *r < 0 ? -temp : temp; + } +} + +/* 4.2.7 */ + +void +gsm_enc_Quantization_and_coding(word *LAR /* [ 0..7 ] IN/OUT */ +) { + word temp; + longword ltmp; + + /* This procedure needs four tables; the following equations + give the optimum scaling for the constants: + + A[ 0..7 ] = integer( real_A[ 0..7 ] * 1024 ) + B[ 0..7 ] = integer( real_B[ 0..7 ] * 512 ) + MAC[ 0..7 ] = maximum of the LARc[ 0..7 ] + MIC[ 0..7 ] = minimum of the LARc[ 0..7 ] + */ + +#undef STEP +#define STEP(A, B, MAC, MIC) \ + temp = GSM_MULT(A, *LAR); \ + temp = GSM_ADD(temp, B); \ + temp = GSM_ADD(temp, 256); \ + temp = SASR(temp, 9); \ + *LAR = temp > MAC ? MAC - MIC : (temp < MIC ? 0 : temp - MIC); \ + LAR++; + + STEP(20480, 0, 31, -32); + STEP(20480, 0, 31, -32); + STEP(20480, 2048, 15, -16); + STEP(20480, -2560, 15, -16); + + STEP(13964, 94, 7, -8); + STEP(15360, -1792, 7, -8); + STEP(8534, -341, 3, -4); + STEP(9036, -1144, 3, -4); + +#undef STEP +} + +void +gsm_enc_Gsm_LPC_Analysis(word *s, /* 0..159 signals IN/OUT */ + word *LARc) /* 0..7 LARc's OUT */ +{ + longword L_ACF[9]; + + gsm_enc_Autocorrelation(s, L_ACF); + gsm_enc_Reflection_coefficients(L_ACF, LARc); + gsm_enc_Transformation_to_Log_Area_Ratios(LARc); + gsm_enc_Quantization_and_coding(LARc); +} + +/* preprocess.c */ +/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION + + After A-law to linear conversion (or directly from the + Ato D converter) the following scaling is assumed for + input to the RPE-LTP algorithm: + + in: 0.1.....................12 + S.v.v.v.v.v.v.v.v.v.v.v.v.*.*. + + Where S is the sign bit, v a valid bit, and * a "don't care" bit. + The original signal is called sop[ .. ] + + out: 0.1................... 12 + S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 +*/ + +void +gsm_enc_Gsm_Preprocess(struct gsm_state *S, word *s, + word *so) /* [ 0..159 ] IN/OUT */ +{ + + word z1 = S->z1; + longword L_z2 = S->L_z2; + word mp = S->mp; + + word s1; + longword L_s2; + + longword L_temp; + + word msp, lsp; + word SO; + + longword ltmp; /* for ADD */ + ulongword utmp; /* for L_ADD */ + + int k = 160; + + __pragma_loopbound(160, 160); + while (k--) { + + /* 4.2.1 Downscaling of the input signal + */ + SO = SASR(*s, 3) << 2; + s++; + + /* 4.2.2 Offset compensation + + This part implements a high-pass filter and requires extended + arithmetic precision for the recursive part of this filter. + The input of this procedure is the array so[ 0...159 ] and the + output the array sof[ 0...159 ]. + */ + /* Compute the non-recursive part + */ + + s1 = SO - z1; /* s1 = gsm_enc_sub( *so, z1 ); */ + z1 = SO; + + /* Compute the recursive part + */ + L_s2 = s1; + L_s2 <<= 15; + + /* Execution of a 31 bv 16 bits multiplication + */ + + msp = SASR(L_z2, 15); + lsp = + L_z2 - ((longword) msp << 15); /* gsm_enc_L_sub(L_z2,(msp<<15)); */ + + L_s2 += GSM_MULT_R(lsp, 32735); + L_temp = (longword) msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ + L_z2 = GSM_L_ADD(L_temp, L_s2); + + /* Compute sof[ k ] with rounding + */ + L_temp = GSM_L_ADD(L_z2, 16384); + + /* 4.2.3 Preemphasis + */ + + msp = GSM_MULT_R(mp, -28180); + mp = SASR(L_temp, 15); + *so++ = GSM_ADD(mp, msp); + } + + S->z1 = z1; + S->L_z2 = L_z2; + S->mp = mp; +} + +/* gsm_enc_bench.c */ + +__attribute__((always_inline)) static inline word +gsm_enc_norm(longword a) +/* + the number of left shifts needed to normalize the 32 bit + variable L_var1 for positive values on the interval + + with minimum of + minimum of 1073741824 (01000000000000000000000000000000) and + maximum of 2147483647 (01111111111111111111111111111111) + + + and for negative values on the interval with + minimum of -2147483648 (-10000000000000000000000000000000) and + maximum of -1073741824 ( -1000000000000000000000000000000). + + in order to normalize the result, the following + operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); + + (That's 'ffs', only from the left, not the right..) +*/ +{ + if (a < 0) { + if (a <= -1073741824) + return 0; + a = ~a; + } + + return a & 0xffff0000 + ? (a & 0xff000000 ? -1 + gsm_enc_bitoff[0xFF & (a >> 24)] + : 7 + gsm_enc_bitoff[0xFF & (a >> 16)]) + : (a & 0xff00 ? 15 + gsm_enc_bitoff[0xFF & (a >> 8)] + : 23 + gsm_enc_bitoff[0xFF & a]); +} + +__attribute__((always_inline)) static inline word +gsm_enc_asl(word a, int n) { + if (n >= 16) + return 0; + if (n <= -16) + return -(a < 0); + if (n < 0) + return gsm_enc_asr(a, -n); + return a << n; +} + +__attribute__((always_inline)) static inline word +gsm_enc_asr(word a, int n) { + if (n >= 16) + return -(a < 0); + if (n <= -16) + return 0; + if (n < 0) + return a << -n; + +#ifdef SASR + return a >> n; +#else + if (a >= 0) + return a >> n; + else + return -(word) (-(uword) a >> n); +#endif +} + +/* + (From p. 46, end of section 4.2.5) + + NOTE: The following lines gives [ sic ] one correct implementation + of the div(num, denum) arithmetic operation. Compute div + which is the integer division of num by denum: with denum + >= num > 0 +*/ + +__attribute__((always_inline)) static inline word +gsm_enc_div(word num, word denum) { + longword L_num = num; + longword L_denum = denum; + word div = 0; + int k = 15; + + /* The parameter num sometimes becomes zero. + Although this is explicitly guarded against in 4.2.5, + we assume that the result should then be zero as well. + */ + + if (num == 0) + return 0; + + __pragma_loopbound(15, 15); + while (k--) { + div <<= 1; + L_num <<= 1; + + if (L_num >= L_denum) { + L_num -= L_denum; + div++; + } + } + + return div; +} + +__attribute__((always_inline)) static inline gsm +gsm_enc_create(void) { + unsigned int i; + gsm r; + + r = &gsm_enc_state; + + __pragma_loopbound(648, 648); + for (i = 0; i < sizeof(*r); i++) + ((char *) r)[i] = 0; + + r->nrp = 40; + + return r; +} + +__attribute__((always_inline)) static inline void +gsm_enc_init(void) { + gsm_enc_state_ptr = gsm_enc_create(); +} + +__attribute__((always_inline)) static inline int +gsm_enc_return(void) { + return gsm_enc_result; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +gsm_enc_main(void) { + gsm r; + unsigned i; + gsm_enc_result = 0; + + r = gsm_enc_state_ptr; + + __pragma_loopbound(20, 20); + for (i = 0; i < SAMPLES; i++) + gsm_enc_encode(r, gsm_enc_pcmdata + i * 160, + gsm_enc_gsmdata + i * sizeof(gsm_frame)); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + gsm_enc_init(); + gsm_enc_main(); + return (gsm_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/private.h b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/private.h new file mode 100644 index 0000000..21cdbab --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/generated/modified_sources/inline/private.h @@ -0,0 +1,54 @@ + +#ifndef PRIVATE_H +#define PRIVATE_H + +typedef short word; /* 16 bit signed int */ +typedef long longword; /* 32 bit signed int */ + +typedef unsigned short uword; /* unsigned word */ +typedef unsigned long ulongword; /* unsigned longword */ + +struct gsm_state { + + word dp0[280]; + + word z1; /* preprocessing.c, Offset_com. */ + longword L_z2; /* Offset_com. */ + int mp; /* Preemphasis */ + + word u[8]; /* short_term_aly_filter.c */ + word LARpp[2][8]; /* */ + word j; /* */ + + word nrp; /* 40 */ /* long_term.c, synthesis */ + word v[9]; /* short_term.c, synthesis */ + word msr; /* decoder.c, Postprocessing */ + + char verbose; /* only used if !NDEBUG */ + char fast; /* only used if FAST */ +}; + +#define MIN_WORD ((-32767) - 1) +#define MAX_WORD (32767) + +#define MIN_LONGWORD ((-2147483647) - 1) +#define MAX_LONGWORD (2147483647) + +#define SASR(x, by) ((x) >> (by)) + +/* Table 4.3a Decision level of the LTP gain quantizer + */ +/* bc 0 1 2 3 */ +word gsm_enc_DLB[4] = {6554, 16384, 26214, 32767}; + +/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_enc_NRFAC[8] = {29128, 26215, 23832, 21846, + 20165, 18725, 17476, 16384}; + +/* Table 4.6 Normalized direct mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_enc_FAC[8] = {18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767}; +#endif /* PRIVATE_H */ diff --git a/targets/wasm-tacle/sequential/gsm_enc/gsm_enc.c b/targets/wasm-tacle/sequential/gsm_enc/gsm_enc.c new file mode 100755 index 0000000..63ca392 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/gsm_enc.c @@ -0,0 +1,2224 @@ +/* gsm_enc_encode.c */ +/* + Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + Universitaet Berlin. See the accompanying file "COPYRIGHT" for + details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. +*/ + +#include "private.h" + +/* + Prototypes from add.c +*/ + +extern word gsm_enc_div ( word num, word denum ); + +extern word gsm_enc_sub ( word a, word b ); + +extern word gsm_enc_norm ( longword a ); + +extern word gsm_enc_asl ( word a, int n ); + +extern word gsm_enc_asr ( word a, int n ); + +/* + Inlined functions from add.h +*/ + +#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )) + +# define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR( ((longword)(a) * (longword)(b)), 15 )) + +# define GSM_L_ADD(a, b) \ + ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \ + : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \ + >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \ + : ((b) <= 0 ? (a) + (b) \ + : (utmp = (ulongword)(a) + (ulongword)(b)) >= (ulongword)MAX_LONGWORD \ + ? MAX_LONGWORD : a + b)) + +#define GSM_ADD(a, b) \ + ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \ + MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp) + +# define GSM_SUB(a, b) \ + ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \ + ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) + +# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) + +#define saturate(x) \ + ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) + +/* Use these if necessary: + + # define GSM_MULT_R(a, b) gsm_enc_mult_r(a, b) + # define GSM_MULT(a, b) gsm_enc_mult(a, b) + # define GSM_L_MULT(a, b) gsm_enc_L_mult(a, b) + + # define GSM_L_ADD(a, b) gsm_enc_L_add(a, b) + # define GSM_ADD(a, b) gsm_enc_add(a, b) + # define GSM_SUB(a, b) gsm_enc_sub(a, b) + + # define GSM_ABS(a) gsm_enc_abs(a) +*/ + +/* + More prototypes from implementations.. +*/ +extern void gsm_enc_Gsm_Coder ( + struct gsm_state *S, + word *s, /* [ 0..159 ] samples IN */ + word *LARc, /* [ 0..7 ] LAR coefficients OUT */ + word *Nc, /* [ 0..3 ] LTP lag OUT */ + word *bc, /* [ 0..3 ] coded LTP gain OUT */ + word *Mc, /* [ 0..3 ] RPE grid selection OUT */ + word *xmaxc,/* [ 0..3 ] Coded maximum amplitude OUT */ + word *xMc /* [ 13*4 ] normalized RPE samples OUT */ ); + +extern void gsm_enc_Gsm_Long_Term_Predictor ( /* 4x for 160 samples */ + word *d, /* [ 0..39 ] residual signal IN */ + word *dp, /* [ -120..-1 ] d' IN */ + word *e, /* [ 0..40 ] OUT */ + word *dpp, /* [ 0..40 ] OUT */ + word *Nc, /* correlation lag OUT */ + word *bc /* gain factor OUT */ ); + +extern void gsm_enc_Gsm_LPC_Analysis ( + word *s, /* 0..159 signals IN/OUT */ + word *LARc ); /* 0..7 LARc's OUT */ + +extern void gsm_enc_Gsm_Preprocess ( + struct gsm_state *S, + word *s, word *so ); + +extern void gsm_enc_Gsm_Short_Term_Analysis_Filter ( + struct gsm_state *S, + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *d /* st res. signal [ 0..159 ] IN/OUT */ ); + +void gsm_enc_Gsm_RPE_Encoding ( + word *e, /* -5..-1 ][ 0..39 ][ 40..44 IN/OUT */ + word *xmaxc, /* OUT */ + word *Mc, /* OUT */ + word *xMc ); /* [ 0..12 ] OUT */ + + +/**************** end #include "private.h" **********************************/ + +/* + Interface +*/ + +typedef struct gsm_state *gsm; +typedef short gsm_signal; /* signed 16 bit */ +typedef unsigned char gsm_byte; +typedef gsm_byte gsm_frame[ 33 ]; /* 33 * 8 bits */ + +#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ + +#define GSM_PATCHLEVEL 6 +#define GSM_MINOR 0 +#define GSM_MAJOR 1 + +#include "data.h" + +extern void gsm_enc_encode ( gsm, gsm_signal *, gsm_byte * ); + +extern int gsm_enc_explode ( gsm, gsm_byte *, gsm_signal * ); +extern void gsm_enc_implode ( gsm, gsm_signal *, gsm_byte * ); + + +/******************* end #include "gsm.h" **********************************/ + +#define SAMPLES 20 + +/* + Forward declaration of global variables +*/ + +struct gsm_state gsm_enc_state; +gsm gsm_enc_state_ptr; +volatile int gsm_enc_result; + + +/* add.c */ + +word gsm_enc_sub ( word a, word b ) +{ + longword diff = ( longword )a - ( longword )b; + return saturate( diff ); +} + + +unsigned char gsm_enc_bitoff[ 256 ] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void gsm_enc_encode ( gsm s, gsm_signal *source, gsm_byte *c ) +{ + word LARc[ 8 ], Nc[ 4 ], Mc[ 4 ], bc[ 4 ], xmaxc[ 4 ], xmc[ 13 * 4 ]; + + gsm_enc_Gsm_Coder( s, source, LARc, Nc, bc, Mc, xmaxc, xmc ); + + + /* variable size + + GSM_MAGIC 4 + + LARc[ 0 ] 6 + LARc[ 1 ] 6 + LARc[ 2 ] 5 + LARc[ 3 ] 5 + LARc[ 4 ] 4 + LARc[ 5 ] 4 + LARc[ 6 ] 3 + LARc[ 7 ] 3 + + Nc[ 0 ] 7 + bc[ 0 ] 2 + Mc[ 0 ] 2 + xmaxc[ 0 ] 6 + xmc[ 0 ] 3 + xmc[ 1 ] 3 + xmc[ 2 ] 3 + xmc[ 3 ] 3 + xmc[ 4 ] 3 + xmc[ 5 ] 3 + xmc[ 6 ] 3 + xmc[ 7 ] 3 + xmc[ 8 ] 3 + xmc[ 9 ] 3 + xmc[ 10 ] 3 + xmc[ 11 ] 3 + xmc[ 12 ] 3 + + Nc[ 1 ] 7 + bc[ 1 ] 2 + Mc[ 1 ] 2 + xmaxc[ 1 ] 6 + xmc[ 13 ] 3 + xmc[ 14 ] 3 + xmc[ 15 ] 3 + xmc[ 16 ] 3 + xmc[ 17 ] 3 + xmc[ 18 ] 3 + xmc[ 19 ] 3 + xmc[ 20 ] 3 + xmc[ 21 ] 3 + xmc[ 22 ] 3 + xmc[ 23 ] 3 + xmc[ 24 ] 3 + xmc[ 25 ] 3 + + Nc[ 2 ] 7 + bc[ 2 ] 2 + Mc[ 2 ] 2 + xmaxc[ 2 ] 6 + xmc[ 26 ] 3 + xmc[ 27 ] 3 + xmc[ 28 ] 3 + xmc[ 29 ] 3 + xmc[ 30 ] 3 + xmc[ 31 ] 3 + xmc[ 32 ] 3 + xmc[ 33 ] 3 + xmc[ 34 ] 3 + xmc[ 35 ] 3 + xmc[ 36 ] 3 + xmc[ 37 ] 3 + xmc[ 38 ] 3 + + Nc[ 3 ] 7 + bc[ 3 ] 2 + Mc[ 3 ] 2 + xmaxc[ 3 ] 6 + xmc[ 39 ] 3 + xmc[ 40 ] 3 + xmc[ 41 ] 3 + xmc[ 42 ] 3 + xmc[ 43 ] 3 + xmc[ 44 ] 3 + xmc[ 45 ] 3 + xmc[ 46 ] 3 + xmc[ 47 ] 3 + xmc[ 48 ] 3 + xmc[ 49 ] 3 + xmc[ 50 ] 3 + xmc[ 51 ] 3 + */ + + + *c++ = ( ( GSM_MAGIC & 0xF ) << 4 ) /* 1 */ + | ( ( LARc[ 0 ] >> 2 ) & 0xF ); + *c++ = ( ( LARc[ 0 ] & 0x3 ) << 6 ) + | ( LARc[ 1 ] & 0x3F ); + *c++ = ( ( LARc[ 2 ] & 0x1F ) << 3 ) + | ( ( LARc[ 3 ] >> 2 ) & 0x7 ); + *c++ = ( ( LARc[ 3 ] & 0x3 ) << 6 ) + | ( ( LARc[ 4 ] & 0xF ) << 2 ) + | ( ( LARc[ 5 ] >> 2 ) & 0x3 ); + *c++ = ( ( LARc[ 5 ] & 0x3 ) << 6 ) + | ( ( LARc[ 6 ] & 0x7 ) << 3 ) + | ( LARc[ 7 ] & 0x7 ); + *c++ = ( ( Nc[ 0 ] & 0x7F ) << 1 ) + | ( ( bc[ 0 ] >> 1 ) & 0x1 ); + *c++ = ( ( bc[ 0 ] & 0x1 ) << 7 ) + | ( ( Mc[ 0 ] & 0x3 ) << 5 ) + | ( ( xmaxc[ 0 ] >> 1 ) & 0x1F ); + *c++ = ( ( xmaxc[ 0 ] & 0x1 ) << 7 ) + | ( ( xmc[ 0 ] & 0x7 ) << 4 ) + | ( ( xmc[ 1 ] & 0x7 ) << 1 ) + | ( ( xmc[ 2 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 2 ] & 0x3 ) << 6 ) + | ( ( xmc[ 3 ] & 0x7 ) << 3 ) + | ( xmc[ 4 ] & 0x7 ); + *c++ = ( ( xmc[ 5 ] & 0x7 ) << 5 ) /* 10 */ + | ( ( xmc[ 6 ] & 0x7 ) << 2 ) + | ( ( xmc[ 7 ] >> 1 ) & 0x3 ); + *c++ = ( ( xmc[ 7 ] & 0x1 ) << 7 ) + | ( ( xmc[ 8 ] & 0x7 ) << 4 ) + | ( ( xmc[ 9 ] & 0x7 ) << 1 ) + | ( ( xmc[ 10 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 10 ] & 0x3 ) << 6 ) + | ( ( xmc[ 11 ] & 0x7 ) << 3 ) + | ( xmc[ 12 ] & 0x7 ); + *c++ = ( ( Nc[ 1 ] & 0x7F ) << 1 ) + | ( ( bc[ 1 ] >> 1 ) & 0x1 ); + *c++ = ( ( bc[ 1 ] & 0x1 ) << 7 ) + | ( ( Mc[ 1 ] & 0x3 ) << 5 ) + | ( ( xmaxc[ 1 ] >> 1 ) & 0x1F ); + *c++ = ( ( xmaxc[ 1 ] & 0x1 ) << 7 ) + | ( ( xmc[ 13 ] & 0x7 ) << 4 ) + | ( ( xmc[ 14 ] & 0x7 ) << 1 ) + | ( ( xmc[ 15 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 15 ] & 0x3 ) << 6 ) + | ( ( xmc[ 16 ] & 0x7 ) << 3 ) + | ( xmc[ 17 ] & 0x7 ); + *c++ = ( ( xmc[ 18 ] & 0x7 ) << 5 ) + | ( ( xmc[ 19 ] & 0x7 ) << 2 ) + | ( ( xmc[ 20 ] >> 1 ) & 0x3 ); + *c++ = ( ( xmc[ 20 ] & 0x1 ) << 7 ) + | ( ( xmc[ 21 ] & 0x7 ) << 4 ) + | ( ( xmc[ 22 ] & 0x7 ) << 1 ) + | ( ( xmc[ 23 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 23 ] & 0x3 ) << 6 ) + | ( ( xmc[ 24 ] & 0x7 ) << 3 ) + | ( xmc[ 25 ] & 0x7 ); + *c++ = ( ( Nc[ 2 ] & 0x7F ) << 1 ) /* 20 */ + | ( ( bc[ 2 ] >> 1 ) & 0x1 ); + *c++ = ( ( bc[ 2 ] & 0x1 ) << 7 ) + | ( ( Mc[ 2 ] & 0x3 ) << 5 ) + | ( ( xmaxc[ 2 ] >> 1 ) & 0x1F ); + *c++ = ( ( xmaxc[ 2 ] & 0x1 ) << 7 ) + | ( ( xmc[ 26 ] & 0x7 ) << 4 ) + | ( ( xmc[ 27 ] & 0x7 ) << 1 ) + | ( ( xmc[ 28 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 28 ] & 0x3 ) << 6 ) + | ( ( xmc[ 29 ] & 0x7 ) << 3 ) + | ( xmc[ 30 ] & 0x7 ); + *c++ = ( ( xmc[ 31 ] & 0x7 ) << 5 ) + | ( ( xmc[ 32 ] & 0x7 ) << 2 ) + | ( ( xmc[ 33 ] >> 1 ) & 0x3 ); + *c++ = ( ( xmc[ 33 ] & 0x1 ) << 7 ) + | ( ( xmc[ 34 ] & 0x7 ) << 4 ) + | ( ( xmc[ 35 ] & 0x7 ) << 1 ) + | ( ( xmc[ 36 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 36 ] & 0x3 ) << 6 ) + | ( ( xmc[ 37 ] & 0x7 ) << 3 ) + | ( xmc[ 38 ] & 0x7 ); + *c++ = ( ( Nc[ 3 ] & 0x7F ) << 1 ) + | ( ( bc[ 3 ] >> 1 ) & 0x1 ); + *c++ = ( ( bc[ 3 ] & 0x1 ) << 7 ) + | ( ( Mc[ 3 ] & 0x3 ) << 5 ) + | ( ( xmaxc[ 3 ] >> 1 ) & 0x1F ); + *c++ = ( ( xmaxc[ 3 ] & 0x1 ) << 7 ) + | ( ( xmc[ 39 ] & 0x7 ) << 4 ) + | ( ( xmc[ 40 ] & 0x7 ) << 1 ) + | ( ( xmc[ 41 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 41 ] & 0x3 ) << 6 ) /* 30 */ + | ( ( xmc[ 42 ] & 0x7 ) << 3 ) + | ( xmc[ 43 ] & 0x7 ); + *c++ = ( ( xmc[ 44 ] & 0x7 ) << 5 ) + | ( ( xmc[ 45 ] & 0x7 ) << 2 ) + | ( ( xmc[ 46 ] >> 1 ) & 0x3 ); + *c++ = ( ( xmc[ 46 ] & 0x1 ) << 7 ) + | ( ( xmc[ 47 ] & 0x7 ) << 4 ) + | ( ( xmc[ 48 ] & 0x7 ) << 1 ) + | ( ( xmc[ 49 ] >> 2 ) & 0x1 ); + *c++ = ( ( xmc[ 49 ] & 0x3 ) << 6 ) + | ( ( xmc[ 50 ] & 0x7 ) << 3 ) + | ( xmc[ 51 ] & 0x7 ); + +} + +/* decode.c */ +/* + 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER +*/ + +/* code.c */ +void gsm_enc_Gsm_Coder ( + + struct gsm_state *S, + + word *s, /* [ 0..159 ] samples IN */ + + /* + The RPE-LTD coder works on a frame by frame basis. The length of + the frame is equal to 160 samples. Some computations are done + once per frame to produce at the output of the coder the + LARc[ 1..8 ] parameters which are the coded LAR coefficients and + also to realize the inverse filtering operation for the entire + frame (160 samples of signal d[ 0..159 ]). These parts produce at + the output of the coder: + */ + + word *LARc, /* [ 0..7 ] LAR coefficients OUT */ + + /* + Procedure 4.2.11 to 4.2.18 are to be executed four times per + frame. That means once for each sub-segment RPE-LTP analysis of + 40 samples. These parts produce at the output of the coder: + */ + + word *Nc, /* [ 0..3 ] LTP lag OUT */ + word *bc, /* [ 0..3 ] coded LTP gain OUT */ + word *Mc, /* [ 0..3 ] RPE grid selection OUT */ + word *xmaxc,/* [ 0..3 ] Coded maximum amplitude OUT */ + word *xMc /* [ 13*4 ] normalized RPE samples OUT */ +) +{ + int k; + word *dp = S->dp0 + 120; /* [ -120...-1 ] */ + word *dpp = dp; /* [ 0...39 ] */ + + static word e [ 50 ] = {0}; + + word so[ 160 ]; + + gsm_enc_Gsm_Preprocess ( S, s, so ); + gsm_enc_Gsm_LPC_Analysis ( so, LARc ); + gsm_enc_Gsm_Short_Term_Analysis_Filter ( S, LARc, so ); + + _Pragma( "loopbound min 4 max 4" ) + for ( k = 0; k <= 3; k++, xMc += 13 ) { + + gsm_enc_Gsm_Long_Term_Predictor ( + so + k * 40, /* d [ 0..39 ] IN */ + dp, /* dp [ -120..-1 ] IN */ + e + 5, /* e [ 0..39 ] OUT */ + dpp, /* dpp [ 0..39 ] OUT */ + Nc++, + bc++ ); + + gsm_enc_Gsm_RPE_Encoding ( + e + 5, /* e ][ 0..39 ][ IN/OUT */ + xmaxc++, Mc++, xMc ); + /* + gsm_enc_Gsm_Update_of_reconstructed_short_time_residual_signal + ( dpp, e + 5, dp ); + */ + + { + int i; + longword ltmp; + _Pragma( "loopbound min 40 max 40" ) + for ( i = 0; i <= 39; i++ ) + dp[ i ] = GSM_ADD( e[ 5 + i ], dpp[ i ] ); + } + + dp += 40; + dpp += 40; + + } +// //(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160), +// // 120 * sizeof(*S->dp0) ); +} + +/* rpe.c */ +/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION +*/ + +/* 4.2.13 */ + +void gsm_enc_Weighting_filter ( + word *e, /* signal [ -5..0.39.44 ] IN */ + word *x /* signal [ 0..39 ] OUT */ +) +/* + The coefficients of the weighting filter are stored in a table + (see table 4.4). The following scaling is used: + + H[ 0..10 ] = integer( real_H[ 0..10 ] * 8192 ); +*/ +{ + /* word wt[ 50 ]; */ + + longword L_result; + int k /* , i */ ; + + /* Initialization of a temporary working array wt[ 0...49 ] + */ + + /* for (k = 0; k <= 4; k++) wt[ k ] = 0; + for (k = 5; k <= 44; k++) wt[ k ] = *e++; + for (k = 45; k <= 49; k++) wt[ k ] = 0; + + (e[ -5..-1 ] and e[ 40..44 ] are allocated by the caller, + are initially zero and are not written anywhere.) + */ + e -= 5; + + /* Compute the signal x[ 0..39 ] + */ + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) { + + L_result = 8192 >> 1; + + /* for (i = 0; i <= 10; i++) { + L_temp = GSM_L_MULT( wt[ k+i ], gsm_enc_H[ i ] ); + L_result = GSM_L_ADD( L_result, L_temp ); + } + */ + +#undef STEP +#define STEP( i, H ) (e[ k + i ] * (longword)H) + + /* Every one of these multiplications is done twice -- + but I don't see an elegant way to optimize this. + Do you? + */ + + #ifdef STUPID_COMPILER + L_result += STEP( 0, -134 ) ; + L_result += STEP( 1, -374 ) ; + /* + STEP( 2, 0 ) */ + L_result += STEP( 3, 2054 ) ; + L_result += STEP( 4, 5741 ) ; + L_result += STEP( 5, 8192 ) ; + L_result += STEP( 6, 5741 ) ; + L_result += STEP( 7, 2054 ) ; + /* + STEP( 8, 0 ) */ + L_result += STEP( 9, -374 ) ; + L_result += STEP( 10, -134 ) ; + #else + L_result += + STEP( 0, -134 ) + + STEP( 1, -374 ) + /* + STEP( 2, 0 ) */ + + STEP( 3, 2054 ) + + STEP( 4, 5741 ) + + STEP( 5, 8192 ) + + STEP( 6, 5741 ) + + STEP( 7, 2054 ) + /* + STEP( 8, 0 ) */ + + STEP( 9, -374 ) + + STEP( 10, -134 ) + ; + #endif + /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) + L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) + + x[ k ] = SASR( L_result, 16 ); + */ + + /* 2 adds vs. >>16 => 14, minus one shift to compensate for + those we lost when replacing L_MULT by '*'. + */ + + L_result = SASR( L_result, 13 ); + x[ k ] = ( L_result < MIN_WORD ? MIN_WORD + : ( L_result > MAX_WORD ? MAX_WORD : L_result ) ); + } +} + +/* 4.2.14 */ + +void gsm_enc_RPE_grid_selection ( + word *x, /* [ 0..39 ] IN */ + word *xM, /* [ 0..12 ] OUT */ + word *Mc_out /* OUT */ +) +/* + The signal x[ 0..39 ] is used to select the RPE grid which is + represented by Mc. +*/ +{ + /* word temp1; */ + int /* m, */ i; + longword L_result, L_temp; + longword EM; /* xxx should be L_EM? */ + word Mc; + + longword L_common_0_3; + + Mc = 0; + +#undef STEP +#define STEP( m, i ) L_temp = SASR( x[ m + 3 * i ], 2 ); \ + L_result += L_temp * L_temp; + + /* common part of 0 and 3 */ + + L_result = 0; + STEP( 0, 1 ); + STEP( 0, 2 ); + STEP( 0, 3 ); + STEP( 0, 4 ); + STEP( 0, 5 ); + STEP( 0, 6 ); + STEP( 0, 7 ); + STEP( 0, 8 ); + STEP( 0, 9 ); + STEP( 0, 10 ); + STEP( 0, 11 ); + STEP( 0, 12 ); + L_common_0_3 = L_result; + + /* i = 0 */ + + STEP( 0, 0 ); + L_result <<= 1; /* implicit in L_MULT */ + EM = L_result; + + /* i = 1 */ + + L_result = 0; + STEP( 1, 0 ); + STEP( 1, 1 ); + STEP( 1, 2 ); + STEP( 1, 3 ); + STEP( 1, 4 ); + STEP( 1, 5 ); + STEP( 1, 6 ); + STEP( 1, 7 ); + STEP( 1, 8 ); + STEP( 1, 9 ); + STEP( 1, 10 ); + STEP( 1, 11 ); + STEP( 1, 12 ); + L_result <<= 1; + if ( L_result > EM ) { + Mc = 1; + EM = L_result; + } + + /* i = 2 */ + + L_result = 0; + STEP( 2, 0 ); + STEP( 2, 1 ); + STEP( 2, 2 ); + STEP( 2, 3 ); + STEP( 2, 4 ); + STEP( 2, 5 ); + STEP( 2, 6 ); + STEP( 2, 7 ); + STEP( 2, 8 ); + STEP( 2, 9 ); + STEP( 2, 10 ); + STEP( 2, 11 ); + STEP( 2, 12 ); + L_result <<= 1; + if ( L_result > EM ) { + Mc = 2; + EM = L_result; + } + + /* i = 3 */ + + L_result = L_common_0_3; + STEP( 3, 12 ); + L_result <<= 1; + if ( L_result > EM ) + Mc = 3; + + /**/ + + /* Down-sampling by a factor 3 to get the selected xM[ 0..12 ] + RPE sequence. + */ + _Pragma( "loopbound min 13 max 13" ) + for ( i = 0; i <= 12; i ++ ) xM[ i ] = x[ Mc + 3 * i ]; + *Mc_out = Mc; + +} + +/* 4.12.15 */ + +void gsm_enc_APCM_quantization_xmaxc_to_exp_mant ( + word xmaxc, /* IN */ + word *exp_out, /* OUT */ + word *mant_out ) /* OUT */ +{ + word exp, mant; + + /* Compute exponent and mantissa of the decoded version of xmaxc + */ + exp = 0; + if ( xmaxc > 15 ) exp = SASR( xmaxc, 3 ) - 1; + mant = xmaxc - ( exp << 3 ); + + if ( mant == 0 ) { + exp = -4; + mant = 7; + } else { + _Pragma( "loopbound min 0 max 3" ) + while ( mant <= 7 ) { + mant = mant << 1 | 1; + exp--; + } + mant -= 8; + } + + *exp_out = exp; + *mant_out = mant; + +} + +void gsm_enc_APCM_quantization ( + word *xM, /* [ 0..12 ] IN */ + + word *xMc, /* [ 0..12 ] OUT */ + word *mant_out, /* OUT */ + word *exp_out, /* OUT */ + word *xmaxc_out /* OUT */ +) +{ + int i, itest; + + word xmax, xmaxc, temp, temp1, temp2; + word exp, mant; + + + /* Find the maximum absolute value xmax of xM[ 0..12 ]. + */ + + xmax = 0; + + _Pragma( "loopbound min 13 max 13" ) + for ( i = 0; i <= 12; i++ ) { + temp = xM[ i ]; + temp = GSM_ABS( temp ); + if ( temp > xmax ) xmax = temp; + } + + /* Qantizing and coding of xmax to get xmaxc. + */ + + exp = 0; + temp = SASR( xmax, 9 ); + itest = 0; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i <= 5; i++ ) { + + itest |= ( temp <= 0 ); + temp = SASR( temp, 1 ); + + if ( itest == 0 ) exp++; // exp = add (exp, 1) + } + + temp = exp + 5; + + //xmaxc = gsm_enc_add( SASR(xmax, temp), exp << 3 ); + xmaxc = saturate( ( SASR( xmax, temp ) + ( exp << 3 ) ) ); + + /* Quantizing and coding of the xM[ 0..12 ] RPE sequence + to get the xMc[ 0..12 ] + */ + + gsm_enc_APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant ); + + /* This computation uses the fact that the decoded version of xmaxc + can be calculated by using the exponent and the mantissa part of + xmaxc (logarithmic table). + So, this method avoids any division and uses only a scaling + of the RPE samples by a function of the exponent. A direct + multiplication by the inverse of the mantissa (NRFAC[ 0..7 ] + found in table 4.5) gives the 3 bit coded version xMc[ 0..12 ] + of the RPE samples. + */ + + + /* Direct computation of xMc[ 0..12 ] using table 4.5 + */ + + + temp1 = 6 - exp; /* normalization by the exponent */ + temp2 = gsm_enc_NRFAC[ mant ]; /* inverse mantissa */ + + _Pragma( "loopbound min 13 max 13" ) + for ( i = 0; i <= 12; i++ ) { + + temp = xM[ i ] << temp1; + temp = GSM_MULT( temp, temp2 ); + temp = SASR( temp, 12 ); + xMc[ i ] = temp + 4; /* see note below */ + } + + /* NOTE: This equation is used to make all the xMc[ i ] positive. + */ + + *mant_out = mant; + *exp_out = exp; + *xmaxc_out = xmaxc; + +} + +/* 4.2.16 */ + +void gsm_enc_APCM_inverse_quantization ( + word *xMc, /* [ 0..12 ] IN */ + word mant, + word exp, + word *xMp ) /* [ 0..12 ] OUT */ +/* + This part is for decoding the RPE sequence of coded xMc[ 0..12 ] + samples to obtain the xMp[ 0..12 ] array. Table 4.6 is used to get + the mantissa of xmaxc (FAC[ 0..7 ]). +*/ +{ + int i; + word temp, temp1, temp2, temp3; + longword ltmp; + + temp1 = gsm_enc_FAC[ mant ]; /* see 4.2-15 for mant */ + temp2 = gsm_enc_sub( 6, exp ); /* see 4.2-15 for exp */ + temp3 = gsm_enc_asl( 1, gsm_enc_sub( temp2, 1 ) ); + + _Pragma( "loopbound min 13 max 13" ) + for ( i = 13; i--; ) { + + /* temp = gsm_enc_sub( *xMc++ << 1, 7 ); */ + temp = ( *xMc++ << 1 ) - 7; /* restore sign */ + + temp <<= 12; /* 16 bit signed */ + temp = GSM_MULT_R( temp1, temp ); + temp = GSM_ADD( temp, temp3 ); + *xMp++ = gsm_enc_asr( temp, temp2 ); + } +} + +/* 4.2.17 */ + +void gsm_enc_RPE_grid_positioning ( + word Mc, /* grid position IN */ + word *xMp, /* [ 0..12 ] IN */ + word *ep /* [ 0..39 ] OUT */ +) +/* + This procedure computes the reconstructed long term residual signal + ep[ 0..39 ] for the LTP analysis filter. The inputs are the Mc + which is the grid position selection and the xMp[ 0..12 ] decoded + RPE samples which are upsampled by a factor of 3 by inserting zero + values. +*/ +{ + int i = 13; + + // + // TODO: rewritten Duff's device for WCET analysis! + // + switch ( Mc ) { + case 3: + *ep++ = 0; + case 2: + *ep++ = 0; + case 1: + *ep++ = 0; + case 0: + *ep++ = *xMp++; + i--; + } + + _Pragma( "loopbound min 12 max 12" ) + do { + *ep++ = 0; + *ep++ = 0; + *ep++ = *xMp++; + } while ( --i ); + + _Pragma( "loopbound min 0 max 3" ) + while ( ++Mc < 4 ) *ep++ = 0; + +} +/* + { + int i = 13; + + // + //TODO: removed for WCET analysis + //_Pragma("marker outside") + switch (Mc) { + case 3: *ep++ = 0; + case 2: + _Pragma("loopbound min 13 max 13") + do { + ep++ = 0; + case 1: *ep++ = 0; + case 0: + //_Pragma("marker inside") + ep++ = *xMp++; + } while (--i); + } + + //_Pragma("flowrestriction 1*inside <= 13*outside") + + _Pragma("loopbound min 0 max 3") + while (++Mc < 4) *ep++ = 0; + + } +*/ + +/* 4.2.18 */ + +/* This procedure adds the reconstructed long term residual signal + ep[ 0..39 ] to the estimated signal dpp[ 0..39 ] from the long term + analysis filter to compute the reconstructed short term residual + signal dp[ -40..-1 ]; also the reconstructed short term residual + array dp[ -120..-41 ] is updated. +*/ + +#if 0 /* Has been inlined in code.c */ +void gsm_enc_Gsm_Update_of_reconstructed_short_time_residual_signal P3( ( dpp, + ep, dp ), + word *dpp, /* [ 0...39 ] IN */ + word *ep, /* [ 0...39 ] IN */ + word *dp ) /* [ -120...-1 ] IN/OUT */ +{ + int k; + + _Pragma( "loopbound min 80 max 80" ) + for ( k = 0; k <= 79; k++ ) + dp[ -120 + k ] = dp[ -80 + k ]; + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) + dp[ -40 + k ] = gsm_enc_add( ep[ k ], dpp[ k ] ); +} +#endif /* Has been inlined in code.c */ + +void gsm_enc_Gsm_RPE_Encoding ( + + word *e, /* -5..-1 ][ 0..39 ][ 40..44 IN/OUT */ + word *xmaxc, /* OUT */ + word *Mc, /* OUT */ + word *xMc ) /* [ 0..12 ] OUT */ +{ + word x[ 40 ]; + word xM[ 13 ], xMp[ 13 ]; + word mant, exp; + + gsm_enc_Weighting_filter( e, x ); + gsm_enc_RPE_grid_selection( x, xM, Mc ); + + gsm_enc_APCM_quantization( xM, xMc, &mant, &exp, xmaxc ); + gsm_enc_APCM_inverse_quantization( xMc, mant, exp, xMp ); + + gsm_enc_RPE_grid_positioning( *Mc, xMp, e ); + +} + +/* long_term.c */ +#ifdef USE_TABLE_MUL + +unsigned int umul_table[ 513 ][ 256 ]; + +# define umul(x9, x15) \ + ((int)(umul_table[ x9 ][ x15 & 0x0FF ] + (umul_table[ x9 ][ x15 >> 8 ] << 8))) + +# define table_mul(a, b) \ + ( (a < 0) ? ((b < 0) ? umul(-a, -b) : -umul(-a, b)) \ + : ((b < 0) ? -umul(a, -b) : umul(a, b))) + +#endif /* USE_TABLE_MUL */ + + + +/* + 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION +*/ + + +/* + This procedure computes the LTP gain (bc) and the LTP lag (Nc) + for the long term analysis filter. This is done by calculating a + maximum of the cross-correlation function between the current + sub-segment short term residual signal d[ 0..39 ] (output of + the short term analysis filter; for simplification the index + of this array begins at 0 and ends at 39 for each sub-segment of the + RPE-LTP analysis) and the previous reconstructed short term + residual signal dp[ -120 .. -1 ]. A dynamic scaling must be + performed to avoid overflow. +*/ + +/* This procedure exists in four versions. First, the two integer + versions with or without table-multiplication (as one function); + then, the two floating point versions (as another function), with + or without scaling. +*/ + +#ifndef USE_FLOAT_MUL + +void gsm_enc_Calculation_of_the_LTP_parameters ( + word *d, /* [ 0..39 ] IN */ + word *dp, /* [ -120..-1 ] IN */ + word *bc_out, /* OUT */ + word *Nc_out /* OUT */ +) +{ + int k, lambda; + word Nc, bc; + word wt[ 40 ]; + + longword L_max, L_power; + word R, S, dmax, scal; + word temp; + + /* Search of the optimum scaling of d[ 0..39 ]. + */ + dmax = 0; + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) { + temp = d[ k ]; + temp = GSM_ABS( temp ); + if ( temp > dmax ) dmax = temp; + } + + temp = 0; + if ( dmax != 0 ) + temp = gsm_enc_norm( ( longword )dmax << 16 ); + + if ( temp > 6 ) scal = 0; + else scal = 6 - temp; + + + /* Initialization of a working array wt + */ + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) wt[ k ] = SASR( d[ k ], scal ); + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + _Pragma( "loopbound min 81 max 81" ) + for ( lambda = 40; lambda <= 120; lambda++ ) { + +# undef STEP + # ifdef USE_TABLE_MUL +# define STEP(k) (table_mul(wt[ k ], dp[ k - lambda ])) + # else +# define STEP(k) (wt[ k ] * dp[ k - lambda ]) + # endif + + longword L_result; + + L_result = STEP( 0 ) ; + L_result += STEP( 1 ) ; + L_result += STEP( 2 ) ; + L_result += STEP( 3 ) ; + L_result += STEP( 4 ) ; + L_result += STEP( 5 ) ; + L_result += STEP( 6 ) ; + L_result += STEP( 7 ) ; + L_result += STEP( 8 ) ; + L_result += STEP( 9 ) ; + L_result += STEP( 10 ) ; + L_result += STEP( 11 ) ; + L_result += STEP( 12 ) ; + L_result += STEP( 13 ) ; + L_result += STEP( 14 ) ; + L_result += STEP( 15 ) ; + L_result += STEP( 16 ) ; + L_result += STEP( 17 ) ; + L_result += STEP( 18 ) ; + L_result += STEP( 19 ) ; + L_result += STEP( 20 ) ; + L_result += STEP( 21 ) ; + L_result += STEP( 22 ) ; + L_result += STEP( 23 ) ; + L_result += STEP( 24 ) ; + L_result += STEP( 25 ) ; + L_result += STEP( 26 ) ; + L_result += STEP( 27 ) ; + L_result += STEP( 28 ) ; + L_result += STEP( 29 ) ; + L_result += STEP( 30 ) ; + L_result += STEP( 31 ) ; + L_result += STEP( 32 ) ; + L_result += STEP( 33 ) ; + L_result += STEP( 34 ) ; + L_result += STEP( 35 ) ; + L_result += STEP( 36 ) ; + L_result += STEP( 37 ) ; + L_result += STEP( 38 ) ; + L_result += STEP( 39 ) ; + + if ( L_result > L_max ) { + + Nc = lambda; + L_max = L_result; + } + } + + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + L_max = L_max >> ( 6 - scal ); /* sub(6, scal) */ + + /* Compute the power of the reconstructed short term residual + signal dp[ .. ] + */ + L_power = 0; + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) { + + longword L_temp; + + L_temp = SASR( dp[ k - Nc ], 3 ); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if ( L_max <= 0 ) { + *bc_out = 0; + return; + } + if ( L_max >= L_power ) { + *bc_out = 3; + return; + } + + temp = gsm_enc_norm( L_power ); + + R = SASR( L_max << temp, 16 ); + S = SASR( L_power << temp, 16 ); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[ i ] for the + quantization of the LTP gain b to get the coded version bc. + */ + _Pragma( "loopbound min 3 max 3" ) + for ( bc = 0; bc <= 2; bc++ ) + /* Replaced by macro function. */ + //if (R <= gsm_enc_mult(S, gsm_enc_DLB[ bc ])) + if ( R <= GSM_MULT( S, gsm_enc_DLB[ bc ] ) ) + break; + + *bc_out = bc; +} + +#else /* USE_FLOAT_MUL */ + +void gsm_enc_Calculation_of_the_LTP_parameters ( + word *d, /* [ 0..39 ] IN */ + word *dp, /* [ -120..-1 ] IN */ + word *bc_out, /* OUT */ + word *Nc_out /* OUT */ +) +{ + int k, lambda; + word Nc, bc; + + float wt_float[ 40 ]; + float dp_float_base[ 120 ], * dp_float = dp_float_base + 120; + + longword L_max, L_power; + word R, S, dmax, scal; + word temp; + + /* Search of the optimum scaling of d[ 0..39 ]. + */ + dmax = 0; + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) { + temp = d[ k ]; + temp = GSM_ABS( temp ); + if ( temp > dmax ) dmax = temp; + } + + temp = 0; + if ( dmax == 0 ) scal = 0; + else + temp = gsm_enc_norm( ( longword )dmax << 16 ); + + if ( temp > 6 ) scal = 0; + else scal = 6 - temp; + + /* Initialization of a working array wt + */ + + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k < 40; k++ ) wt_float[ k ] = SASR( d[ k ], scal ); + _Pragma( "loopbound min 120 max 120" ) + for ( k = -120; k < 0; k++ ) dp_float[ k ] = dp[ k ]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + _Pragma( "loopbound min 9 max 9" ) + for ( lambda = 40; lambda <= 120; lambda += 9 ) { + + /* Calculate L_result for l = lambda .. lambda + 9. + */ + float *lp = dp_float - lambda; + + float W; + float a = lp[ -8 ], b = lp[ -7 ], c = lp[ -6 ], + d = lp[ -5 ], e = lp[ -4 ], f = lp[ -3 ], + g = lp[ -2 ], h = lp[ -1 ]; + float E; + float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float[ K ]; \ + E = W * a; S8 += E; \ + E = W * b; S7 += E; \ + E = W * c; S6 += E; \ + E = W * d; S5 += E; \ + E = W * e; S4 += E; \ + E = W * f; S3 += E; \ + E = W * g; S2 += E; \ + E = W * h; S1 += E; \ + a = lp[ K ]; \ + E = W * a; S0 += E + +# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) + + STEP_A( 0 ); + STEP_B( 1 ); + STEP_C( 2 ); + STEP_D( 3 ); + STEP_E( 4 ); + STEP_F( 5 ); + STEP_G( 6 ); + STEP_H( 7 ); + + STEP_A( 8 ); + STEP_B( 9 ); + STEP_C( 10 ); + STEP_D( 11 ); + STEP_E( 12 ); + STEP_F( 13 ); + STEP_G( 14 ); + STEP_H( 15 ); + + STEP_A( 16 ); + STEP_B( 17 ); + STEP_C( 18 ); + STEP_D( 19 ); + STEP_E( 20 ); + STEP_F( 21 ); + STEP_G( 22 ); + STEP_H( 23 ); + + STEP_A( 24 ); + STEP_B( 25 ); + STEP_C( 26 ); + STEP_D( 27 ); + STEP_E( 28 ); + STEP_F( 29 ); + STEP_G( 30 ); + STEP_H( 31 ); + + STEP_A( 32 ); + STEP_B( 33 ); + STEP_C( 34 ); + STEP_D( 35 ); + STEP_E( 36 ); + STEP_F( 37 ); + STEP_G( 38 ); + STEP_H( 39 ); + + if ( S0 > L_max ) { + L_max = S0; + Nc = lambda; + } + if ( S1 > L_max ) { + L_max = S1; + Nc = lambda + 1; + } + if ( S2 > L_max ) { + L_max = S2; + Nc = lambda + 2; + } + if ( S3 > L_max ) { + L_max = S3; + Nc = lambda + 3; + } + if ( S4 > L_max ) { + L_max = S4; + Nc = lambda + 4; + } + if ( S5 > L_max ) { + L_max = S5; + Nc = lambda + 5; + } + if ( S6 > L_max ) { + L_max = S6; + Nc = lambda + 6; + } + if ( S7 > L_max ) { + L_max = S7; + Nc = lambda + 7; + } + if ( S8 > L_max ) { + L_max = S8; + Nc = lambda + 8; + } + } + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + L_max = L_max >> ( 6 - scal ); /* sub(6, scal) */ + + /* Compute the power of the reconstructed short term residual + signal dp[ .. ] + */ + L_power = 0; + _Pragma( "loopbound min 40 max 40" ) + for ( k = 0; k <= 39; k++ ) { + + longword L_temp; + + L_temp = SASR( dp[ k - Nc ], 3 ); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if ( L_max <= 0 ) { + *bc_out = 0; + return; + } + if ( L_max >= L_power ) { + *bc_out = 3; + return; + } + + temp = gsm_enc_norm( L_power ); + + R = SASR( L_max << temp, 16 ); + S = SASR( L_power << temp, 16 ); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[ i ] for the + quantization of the LTP gain b to get the coded version bc. + */ + // Replaced by macro function. + //for (bc = 0; bc <= 2; bc++) if (R <= gsm_enc_mult(S, gsm_enc_DLB[ bc ])) break; + _Pragma( "loopbound min 3 max 3" ) + for ( bc = 0; bc <= 2; bc++ ) if ( R <= GSM_MULT( S, gsm_enc_DLB[ bc ] ) ) break; + *bc_out = bc; +} + +#endif /* USE_FLOAT_MUL */ + + +/* 4.2.12 */ + +void gsm_enc_Long_term_analysis_filtering ( + word bc, /* IN */ + word Nc, /* IN */ + word *dp, /* previous d [ -120..-1 ] IN */ + word *d, /* d [ 0..39 ] IN */ + word *dpp, /* estimate [ 0..39 ] OUT */ + word *e /* long term res. signal [ 0..39 ] OUT */ +) +/* + In this part, we have to decode the bc parameter to compute + the samples of the estimate dpp[ 0..39 ]. The decoding of bc needs the + use of table 4.3b. The long term residual signal e[ 0..39 ] + is then calculated to be fed to the RPE encoding section. +*/ +{ + int k; + longword ltmp; + +# undef STEP +# define STEP(BP) \ + _Pragma("loopbound min 40 max 40") \ + for (k = 0; k <= 39; k++) { \ + dpp[ k ] = GSM_MULT_R( BP, dp[ k - Nc ]); \ + e[ k ] = GSM_SUB( d[ k ], dpp[ k ] ); \ + } + + switch ( bc ) { + case 0: + STEP( 3277 ); + break; + case 1: + STEP( 11469 ); + break; + case 2: + STEP( 21299 ); + break; + case 3: + STEP( 32767 ); + break; + } +} + +void gsm_enc_Gsm_Long_Term_Predictor ( + + word *d, /* [ 0..39 ] residual signal IN */ + word *dp, /* [ -120..-1 ] d' IN */ + + word *e, /* [ 0..39 ] OUT */ + word *dpp, /* [ 0..39 ] OUT */ + word *Nc, /* correlation lag OUT */ + word *bc /* gain factor OUT */ +) +{ + + gsm_enc_Calculation_of_the_LTP_parameters( d, dp, bc, Nc ); + + gsm_enc_Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); +} + +/* short_term.c */ +/* + SHORT TERM ANALYSIS FILTERING SECTION +*/ + +/* 4.2.8 */ + +void gsm_enc_Decoding_of_the_coded_Log_Area_Ratios ( + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *LARpp ) /* out: decoded .. */ +{ + word temp1 /* , temp2 */; + long ltmp; /* for GSM_ADD */ + + /* This procedure requires for efficient implementation + two tables. + + INVA[ 1..8 ] = integer( (32768 * 8) / real_A[ 1..8 ]) + MIC[ 1..8 ] = minimum value of the LARc[ 1..8 ] + */ + + /* Compute the LARpp[ 1..8 ] + */ + +#undef STEP +#define STEP( B, MIC, INVA ) \ + temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ + temp1 = GSM_SUB( temp1, (B >= 0 ? B << 1 : -((-B) << 1))); \ + temp1 = GSM_MULT_R( INVA, temp1 ); \ + *LARpp++ = GSM_ADD( temp1, temp1 ); + + STEP( 0, -32, 13107 ); + STEP( 0, -32, 13107 ); + STEP( 2048, -16, 13107 ); + STEP( -2560, -16, 13107 ); + + STEP( 94, -8, 19223 ); + STEP( -1792, -8, 17476 ); + STEP( -341, -4, 31454 ); + STEP( -1144, -4, 29708 ); + + /* NOTE: the addition of *MIC is used to restore + the sign of *LARc. + */ +} + +/* 4.2.9 */ +/* Computation of the quantized reflection coefficients +*/ + +/* 4.2.9.1 Interpolation of the LARpp[ 1..8 ] to get the LARp[ 1..8 ] +*/ + +/* + Within each frame of 160 analyzed speech samples the short term + analysis and synthesis filters operate with four different sets of + coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) + and the actual set of decoded LARs (LARpp(j)) + + (Initial value: LARpp(j-1)[ 1..8 ] = 0.) +*/ + +void gsm_enc_Coefficients_0_12 ( + word *LARpp_j_1, + word *LARpp_j, + word *LARp ) +{ + int i; + longword ltmp; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++ ) { + *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ) ); + *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1 ) ); + } +} + +void gsm_enc_Coefficients_13_26 ( + word *LARpp_j_1, + word *LARpp_j, + word *LARp ) +{ + int i; + longword ltmp; + _Pragma( "loopbound min 8 max 8" ) + for ( i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++ ) + *LARp = GSM_ADD( SASR( *LARpp_j_1, 1 ), SASR( *LARpp_j, 1 ) ); +} + +void gsm_enc_Coefficients_27_39 ( + word *LARpp_j_1, + word *LARpp_j, + word *LARp ) +{ + int i; + longword ltmp; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++ ) { + *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ) ); + *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ) ); + } +} + + +void gsm_enc_Coefficients_40_159 ( + word *LARpp_j, + word *LARp ) +{ + int i; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 1; i <= 8; i++, LARp++, LARpp_j++ ) + *LARp = *LARpp_j; +} + +/* 4.2.9.2 */ + +void gsm_enc_LARp_to_rp ( + word *LARp ) /* [ 0..7 ] IN/OUT */ +/* + The input of this procedure is the interpolated LARp[ 0..7 ] array. + The reflection coefficients, rp[ i ], are used in the analysis + filter and in the synthesis filter. +*/ +{ + int i; + word temp; + longword ltmp; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 1; i <= 8; i++, LARp++ ) { + + /* temp = GSM_ABS( *LARp ); + + if (temp < 11059) temp <<= 1; + else if (temp < 20070) temp += 11059; + else temp = GSM_ADD( temp >> 2, 26112 ); + + * *LARp = *LARp < 0 ? -temp : temp; + */ + + if ( *LARp < 0 ) { + temp = *LARp == MIN_WORD ? MAX_WORD : -( *LARp ); + *LARp = - ( ( temp < 11059 ) ? temp << 1 + : ( ( temp < 20070 ) ? temp + 11059 + : GSM_ADD( temp >> 2, 26112 ) ) ); + } else { + temp = *LARp; + *LARp = ( temp < 11059 ) ? temp << 1 + : ( ( temp < 20070 ) ? temp + 11059 + : GSM_ADD( temp >> 2, 26112 ) ); + } + } +} + + +/* 4.2.10 */ +void gsm_enc_Short_term_analysis_filtering ( + struct gsm_state *S, + word *rp, /* [ 0..7 ] IN */ + int k_n, /* k_end - k_start */ + word *s /* [ 0..n-1 ] IN/OUT */ +) +/* + This procedure computes the short term residual signal d[ .. ] to be fed + to the RPE-LTP loop from the s[ .. ] signal and from the local rp[ .. ] + array (quantized reflection coefficients). As the call of this + procedure can be done in many ways (see the interpolation of the LAR + coefficient), it is assumed that the computation begins with index + k_start (for arrays d[ .. ] and s[ .. ]) and stops with index k_end + (k_start and k_end are defined in 4.2.9.1). This procedure also + needs to keep the array u[ 0..7 ] in memory for each call. +*/ +{ + word *u = S->u; + int i; + word di, zzz, ui, sav, rpi; + longword ltmp; + int j; + + _Pragma( "loopbound min 13 max 120" ) + for ( j = 0; j < k_n; ++j ) { + + di = sav = *s; + + _Pragma( "loopbound min 8 max 8" ) + for ( i = 0; i < 8; i++ ) { /* YYY */ + + ui = u[ i ]; + rpi = rp[ i ]; + u[ i ] = sav; + + zzz = GSM_MULT_R( rpi, di ); + sav = GSM_ADD( ui, zzz ); + + zzz = GSM_MULT_R( rpi, ui ); + di = GSM_ADD( di, zzz ); + + } + + *s = di; + } +} + +void gsm_enc_Gsm_Short_Term_Analysis_Filter ( + + struct gsm_state *S, + + word *LARc, /* coded log area ratio [ 0..7 ] IN */ + word *s /* signal [ 0..159 ] IN/OUT */ +) +{ + word *LARpp_j = S->LARpp[ S->j ]; + word *LARpp_j_1 = S->LARpp[ S->j ^= 1 ]; + + word LARp[ 8 ]; + +#undef FILTER +# define FILTER gsm_enc_Short_term_analysis_filtering + + gsm_enc_Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j ); + + gsm_enc_Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); + gsm_enc_LARp_to_rp( LARp ); + FILTER( S, LARp, 13, s ); + + gsm_enc_Coefficients_13_26( LARpp_j_1, LARpp_j, LARp ); + gsm_enc_LARp_to_rp( LARp ); + FILTER( S, LARp, 14, s + 13 ); + + gsm_enc_Coefficients_27_39( LARpp_j_1, LARpp_j, LARp ); + gsm_enc_LARp_to_rp( LARp ); + FILTER( S, LARp, 13, s + 27 ); + + gsm_enc_Coefficients_40_159( LARpp_j, LARp ); + gsm_enc_LARp_to_rp( LARp ); + FILTER( S, LARp, 120, s + 40 ); +} + +/* lpc.c */ +#undef P + +/* + 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION +*/ + +/* 4.2.4 */ + + +void gsm_enc_Autocorrelation ( + word *s, /* [ 0..159 ] IN/OUT */ + longword *L_ACF ) /* [ 0..8 ] OUT */ +/* + The goal is to compute the array L_ACF[ k ]. The signal s[ i ] must + be scaled in order to avoid an overflow situation. +*/ +{ + int k, i; + + word temp, smax, scalauto; + + /* Dynamic scaling of the array s[ 0..159 ] + */ + + /* Search for the maximum. + */ + smax = 0; + + _Pragma( "loopbound min 160 max 160" ) + for ( k = 0; k <= 159; k++ ) { + temp = GSM_ABS( s[ k ] ); + if ( temp > smax ) smax = temp; + } + + /* Computation of the scaling factor. + */ + if ( smax == 0 ) scalauto = 0; + else { + scalauto = 4 - gsm_enc_norm( ( longword )smax << 16 ); /* sub(4,..) */ + } + + /* Scaling of the array s[ 0...159 ] + */ + + if ( scalauto > 0 ) { + +# define SCALE(n) \ + case n: \ + _Pragma("loopbound min 160 max 160") \ + for (k = 0; k <= 159; k++) \ + s[ k ] = GSM_MULT_R( s[ k ], 16384 >> (n-1) );\ + break; + + switch ( scalauto ) { + SCALE( 1 ) + SCALE( 2 ) + SCALE( 3 ) + SCALE( 4 ) + } +# undef SCALE + } + + /* Compute the L_ACF[ .. ]. + */ + { + word *sp = s; + word sl = *sp; +#undef STEP +# define STEP(k) L_ACF[ k ] += ((longword)sl * sp[ -(k) ]); + +# define NEXTI sl = *++sp + + + _Pragma( "loopbound min 9 max 9" ) + for ( k = 9; k--; L_ACF[ k ] = 0 ) ; + + STEP ( 0 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + STEP( 3 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + STEP( 3 ); + STEP( 4 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + STEP( 3 ); + STEP( 4 ); + STEP( 5 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + STEP( 3 ); + STEP( 4 ); + STEP( 5 ); + STEP( 6 ); + NEXTI; + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + STEP( 3 ); + STEP( 4 ); + STEP( 5 ); + STEP( 6 ); + STEP( 7 ); + + _Pragma( "loopbound min 152 max 152" ) + for ( i = 8; i <= 159; i++ ) { + + NEXTI; + + STEP( 0 ); + STEP( 1 ); + STEP( 2 ); + STEP( 3 ); + STEP( 4 ); + STEP( 5 ); + STEP( 6 ); + STEP( 7 ); + STEP( 8 ); + } + + _Pragma( "loopbound min 9 max 9" ) + for ( k = 9; k--; L_ACF[ k ] <<= 1 ) ; + + } + /* Rescaling of the array s[ 0..159 ] + */ + if ( scalauto > 0 ) { + _Pragma( "loopbound min 160 max 160" ) + for ( k = 160; k--; *s++ <<= scalauto ) ; + } +} + +/* 4.2.5 */ + +void gsm_enc_Reflection_coefficients ( + longword *L_ACF, /* 0...8 IN */ + word *r /* 0...7 OUT */ +) +{ + int i, m, n; + word temp; + longword ltmp; + word ACF[ 9 ]; /* 0..8 */ + word P[ 9 ]; /* 0..8 */ + word K[ 9 ]; /* 2..8 */ + + /* Schur recursion with 16 bits arithmetic. + */ + + if ( L_ACF[ 0 ] == 0 ) { + _Pragma( "loopbound min 8 max 8" ) + for ( i = 8; i--; *r++ = 0 ) ; + return; + } + + temp = gsm_enc_norm( L_ACF[ 0 ] ); + + /* ? overflow ? */ + _Pragma( "loopbound min 9 max 9" ) + for ( i = 0; i <= 8; i++ ) ACF[ i ] = SASR( L_ACF[ i ] << temp, 16 ); + + /* Initialize array P[ .. ] and K[ .. ] for the recursion. + */ + + _Pragma( "loopbound min 7 max 7" ) + for ( i = 1; i <= 7; i++ ) K[ i ] = ACF[ i ]; + + _Pragma( "loopbound min 9 max 9" ) + for ( i = 0; i <= 8; i++ ) P[ i ] = ACF[ i ]; + + /* Compute reflection coefficients + */ + _Pragma( "loopbound min 8 max 8" ) + _Pragma( "marker outer-marker" ) + for ( n = 1; n <= 8; n++, r++ ) { + + temp = P[ 1 ]; + temp = GSM_ABS( temp ); + if ( P[ 0 ] < temp ) { + + _Pragma( "loopbound min 1 max 8" ) + for ( i = n; i <= 8; i++ ) *r++ = 0; _Pragma( "marker inner-marker" ) + return; _Pragma( "flowrestriction 1*inner-marker <= 36*outer-marker" ) + } + + *r = gsm_enc_div( temp, P[ 0 ] ); + + if ( P[ 1 ] > 0 ) *r = -*r; /* r[ n ] = sub(0, r[ n ]) */ + if ( n == 8 ) return; + + /* Schur recursion + */ + temp = GSM_MULT_R( P[ 1 ], *r ); + P[ 0 ] = GSM_ADD( P[ 0 ], temp ); + + _Pragma( "loopbound min 1 max 7" ) + for ( m = 1; m <= 8 - n; ++m ) { + temp = GSM_MULT_R( K[ m ], *r ); + P[ m ] = GSM_ADD( P[ m + 1 ], temp ); + + temp = GSM_MULT_R( P[ m + 1 ], *r ); + K[ m ] = GSM_ADD( K[ m ], temp ); + } + } +} + +/* 4.2.6 */ + +void gsm_enc_Transformation_to_Log_Area_Ratios ( + word *r /* 0..7 IN/OUT */ +) +/* + The following scaling for r[ .. ] and LAR[ .. ] has been used: + + r[ .. ] = integer( real_r[ .. ]*32768. ); -1 <= real_r < 1. + LAR[ .. ] = integer( real_LAR[ .. ] * 16384 ); + with -1.625 <= real_LAR <= 1.625 +*/ +{ + word temp; + int i; + + + /* Computation of the LAR[ 0..7 ] from the r[ 0..7 ] + */ + _Pragma( "loopbound min 8 max 8" ) + for ( i = 1; i <= 8; i++, r++ ) { + + temp = *r; + temp = GSM_ABS( temp ); + + if ( temp < 22118 ) + temp >>= 1; + + else + if ( temp < 31130 ) + temp -= 11059; + + else { + temp -= 26112; + temp <<= 2; + } + + *r = *r < 0 ? -temp : temp; + } +} + +/* 4.2.7 */ + +void gsm_enc_Quantization_and_coding ( + word *LAR /* [ 0..7 ] IN/OUT */ +) +{ + word temp; + longword ltmp; + + + /* This procedure needs four tables; the following equations + give the optimum scaling for the constants: + + A[ 0..7 ] = integer( real_A[ 0..7 ] * 1024 ) + B[ 0..7 ] = integer( real_B[ 0..7 ] * 512 ) + MAC[ 0..7 ] = maximum of the LARc[ 0..7 ] + MIC[ 0..7 ] = minimum of the LARc[ 0..7 ] + */ + +# undef STEP +# define STEP( A, B, MAC, MIC ) \ + temp = GSM_MULT( A, *LAR ); \ + temp = GSM_ADD( temp, B ); \ + temp = GSM_ADD( temp, 256 ); \ + temp = SASR( temp, 9 ); \ + *LAR = temp>MAC ? MAC - MIC : (tempz1; + longword L_z2 = S->L_z2; + word mp = S->mp; + + word s1; + longword L_s2; + + longword L_temp; + + word msp, lsp; + word SO; + + longword ltmp; /* for ADD */ + ulongword utmp; /* for L_ADD */ + + int k = 160; + + _Pragma( "loopbound min 160 max 160" ) + while ( k-- ) { + + /* 4.2.1 Downscaling of the input signal + */ + SO = SASR( *s, 3 ) << 2; + s++; + + /* 4.2.2 Offset compensation + + This part implements a high-pass filter and requires extended + arithmetic precision for the recursive part of this filter. + The input of this procedure is the array so[ 0...159 ] and the + output the array sof[ 0...159 ]. + */ + /* Compute the non-recursive part + */ + + s1 = SO - z1; /* s1 = gsm_enc_sub( *so, z1 ); */ + z1 = SO; + + /* Compute the recursive part + */ + L_s2 = s1; + L_s2 <<= 15; + + /* Execution of a 31 bv 16 bits multiplication + */ + + msp = SASR( L_z2, 15 ); + lsp = L_z2 - ( ( longword )msp << 15 ); /* gsm_enc_L_sub(L_z2,(msp<<15)); */ + + L_s2 += GSM_MULT_R( lsp, 32735 ); + L_temp = ( longword )msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ + L_z2 = GSM_L_ADD( L_temp, L_s2 ); + + /* Compute sof[ k ] with rounding + */ + L_temp = GSM_L_ADD( L_z2, 16384 ); + + /* 4.2.3 Preemphasis + */ + + msp = GSM_MULT_R( mp, -28180 ); + mp = SASR( L_temp, 15 ); + *so++ = GSM_ADD( mp, msp ); + } + + S->z1 = z1; + S->L_z2 = L_z2; + S->mp = mp; +} + +/* gsm_enc_bench.c */ + +word gsm_enc_norm ( longword a ) +/* + the number of left shifts needed to normalize the 32 bit + variable L_var1 for positive values on the interval + + with minimum of + minimum of 1073741824 (01000000000000000000000000000000) and + maximum of 2147483647 (01111111111111111111111111111111) + + + and for negative values on the interval with + minimum of -2147483648 (-10000000000000000000000000000000) and + maximum of -1073741824 ( -1000000000000000000000000000000). + + in order to normalize the result, the following + operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); + + (That's 'ffs', only from the left, not the right..) +*/ +{ + if ( a < 0 ) { + if ( a <= -1073741824 ) return 0; + a = ~a; + } + + return a & 0xffff0000 + ? ( a & 0xff000000 + ? -1 + gsm_enc_bitoff[ 0xFF & ( a >> 24 ) ] + : 7 + gsm_enc_bitoff[ 0xFF & ( a >> 16 ) ] ) + : ( a & 0xff00 + ? 15 + gsm_enc_bitoff[ 0xFF & ( a >> 8 ) ] + : 23 + gsm_enc_bitoff[ 0xFF & a ] ); +} + +word gsm_enc_asl ( word a, int n ) +{ + if ( n >= 16 ) return 0; + if ( n <= -16 ) return -( a < 0 ); + if ( n < 0 ) return gsm_enc_asr( a, -n ); + return a << n; +} + +word gsm_enc_asr ( word a, int n ) +{ + if ( n >= 16 ) return -( a < 0 ); + if ( n <= -16 ) return 0; + if ( n < 0 ) return a << -n; + + # ifdef SASR + return a >> n; + # else + if ( a >= 0 ) return a >> n; + else return -( word )( -( uword )a >> n ); + # endif +} + +/* + (From p. 46, end of section 4.2.5) + + NOTE: The following lines gives [ sic ] one correct implementation + of the div(num, denum) arithmetic operation. Compute div + which is the integer division of num by denum: with denum + >= num > 0 +*/ + +word gsm_enc_div ( word num, word denum ) +{ + longword L_num = num; + longword L_denum = denum; + word div = 0; + int k = 15; + + /* The parameter num sometimes becomes zero. + Although this is explicitly guarded against in 4.2.5, + we assume that the result should then be zero as well. + */ + + if ( num == 0 ) + return 0; + + _Pragma( "loopbound min 15 max 15" ) + while ( k-- ) { + div <<= 1; + L_num <<= 1; + + if ( L_num >= L_denum ) { + L_num -= L_denum; + div++; + } + } + + return div; +} + + + +gsm gsm_enc_create( void ) +{ + unsigned int i; + gsm r; + + r = &gsm_enc_state; + + _Pragma( "loopbound min 648 max 648" ) + for ( i = 0; i < sizeof( *r ); i++ ) + ( ( char * )r )[ i ] = 0; + + r->nrp = 40; + + return r; +} + +void gsm_enc_init( void ) +{ + gsm_enc_state_ptr = gsm_enc_create(); +} + +int gsm_enc_return( void ) +{ + return gsm_enc_result; +} + +void _Pragma( "entrypoint" ) gsm_enc_main( void ) +{ + gsm r; + unsigned i; + gsm_enc_result = 0; + + r = gsm_enc_state_ptr; + + _Pragma( "loopbound min 20 max 20" ) + for ( i = 0; i < SAMPLES; i++ ) + gsm_enc_encode( r, gsm_enc_pcmdata + i * 160, + gsm_enc_gsmdata + i * sizeof( gsm_frame ) ); +} + +int main( void ) +{ + gsm_enc_init(); + gsm_enc_main(); + return ( gsm_enc_return() ); +} diff --git a/targets/wasm-tacle/sequential/gsm_enc/private.h b/targets/wasm-tacle/sequential/gsm_enc/private.h new file mode 100755 index 0000000..ed59e76 --- /dev/null +++ b/targets/wasm-tacle/sequential/gsm_enc/private.h @@ -0,0 +1,56 @@ +#ifndef PRIVATE_H +#define PRIVATE_H + +typedef short word; /* 16 bit signed int */ +typedef long longword; /* 32 bit signed int */ + +typedef unsigned short uword; /* unsigned word */ +typedef unsigned long ulongword; /* unsigned longword */ + +struct gsm_state { + + word dp0[ 280 ]; + + word z1; /* preprocessing.c, Offset_com. */ + longword L_z2; /* Offset_com. */ + int mp; /* Preemphasis */ + + word u[ 8 ]; /* short_term_aly_filter.c */ + word LARpp[ 2 ][ 8 ]; /* */ + word j; /* */ + + word nrp; /* 40 */ /* long_term.c, synthesis */ + word v[ 9 ]; /* short_term.c, synthesis */ + word msr; /* decoder.c, Postprocessing */ + + char verbose; /* only used if !NDEBUG */ + char fast; /* only used if FAST */ + +}; + + +#define MIN_WORD ((-32767)-1) +#define MAX_WORD ( 32767) + +#define MIN_LONGWORD ((-2147483647)-1) +#define MAX_LONGWORD ( 2147483647) + +#define SASR(x, by) ((x) >> (by)) + +/* Table 4.3a Decision level of the LTP gain quantizer +*/ +/* bc 0 1 2 3 */ +word gsm_enc_DLB[ 4 ] = { 6554, 16384, 26214, 32767 }; + + +/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax +*/ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_enc_NRFAC[ 8 ] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; + + +/* Table 4.6 Normalized direct mantissa used to compute xM/xmax +*/ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_enc_FAC[ 8 ] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; +#endif /* PRIVATE_H */ diff --git a/targets/wasm-tacle/sequential/h264_dec/CMakeLists.txt b/targets/wasm-tacle/sequential/h264_dec/CMakeLists.txt new file mode 100644 index 0000000..c42c5f7 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/CMakeLists.txt @@ -0,0 +1,26 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(h264_dec) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/h264_dec.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/h264_dec.c" + "generated/modified_sources/default/h264_decinput.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/h264_dec/changeLog.txt b/targets/wasm-tacle/sequential/h264_dec/changeLog.txt new file mode 100755 index 0000000..2d5d97f --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/changeLog.txt @@ -0,0 +1,41 @@ +File: h264dec_ldecode_macroblock.c +Original provenience: + +2015-12-21: +- Filename changed to h264dec.c +- global.h renamed to h264dec.h +- Removed commented out includes +- Removed all obsolete typedefs, enums and structs. Only remaining ones are + struct img_par and + enum SliceType +- Renamed function decode_one_macroblock to h264dec_decode_one_macroblock +- Function h264dec_decode_one_macroblock changed to void (i.e., removed statement return 0;) +- Added functions h264dec_init, h264dec_return and main +- Added forward declarations of all functions before the declarations of global + variables +- Struct 'ImageParameters' renamed to 'h264dec_ImageParameters' +- Re-ordered functions to fit template-order +- Applied code formatting according to the following rules + (incomplete, to be discussed; I basically used astyle with the attached + options file): + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: st_) followed by lowercase letter (e.g., st_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Added general TACLeBench header to beginning of source code \ No newline at end of file diff --git a/targets/wasm-tacle/sequential/h264_dec/copyright.txt b/targets/wasm-tacle/sequential/h264_dec/copyright.txt new file mode 100755 index 0000000..fe3eece --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/copyright.txt @@ -0,0 +1,32 @@ +/* +*********************************************************************** +* COPYRIGHT AND WARRANTY INFORMATION +* +* Copyright 2001, International Telecommunications Union, Geneva +* +* DISCLAIMER OF WARRANTY +* +* These software programs are available to the user without any +* license fee or royalty on an "as is" basis. The ITU disclaims +* any and all warranties, whether express, implied, or +* statutory, including any implied warranties of merchantability +* or of fitness for a particular purpose. In no event shall the +* contributor or the ITU be liable for any incidental, punitive, or +* consequential damages of any kind whatsoever arising from the +* use of these programs. +* +* This disclaimer of warranty extends to the user of these programs +* and user's customers, employees, agents, transferees, successors, +* and assigns. +* +* The ITU does not represent or warrant that the programs furnished +* hereunder are free of infringement of any third-party patents. +* Commercial implementations of ITU-T Recommendations, including +* shareware, may be subject to royalty fees to patent holders. +* Information regarding the ITU-T patent policy is available from +* the ITU Web site at http://www.itu.int. +* +* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY. +************************************************************************ +*/ + diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wasm b/targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wasm new file mode 100755 index 0000000000000000000000000000000000000000..2e45d7120a3824a736531365c65774cf1f4f98d5 GIT binary patch literal 10261 zcmeHNOKcp+5v`sXl1nbhrAUikS?QVBfC8C>Z5Sf#i`YUCD?yIQc{C))^bTh~+K))e zl6U#hUsf(T8i)_d=a7SdoC6qvf#hHyK!99=9OAnVKIRf5Rnyy??{b%+6vqKs+@0>~ z>gwvQ*EKc015Ulf0RIZP^&P)h-duW}8DIdgGsZQo)q-mP*BD(`OPgjn+pgA}jgm9$ zS1Q%jO0&EUpbri(rZL?ZU{%K0fX;voPU|fuo_)#kEfCK>mlv!J{bX>kRauuaV0*i;b=c15KjQ+Zz6NMsIHiqd)tMW)zIx&Sj0ho5|hFQ{FiLr#p=Ye_Eo0}%i2NU3-p~Q zJ(vG$j-79DxS;*UFd1E+8m1HH6U_6wEO_=ss$W zla>jy5VmrI7kqPqE&@Sy#wQadafB(^hb9t{p5o(#Eo7BSIE#wOq-7r)V>l(Q`{qm7 zS5qhzdkn2R%M0c-vKfA6^cCzegVIw7V(~06m`|Yl`B^?KmrN-atl?R+uK`$do;A;N z*R2_z=Pz+&p{cW6FIfxX7aFIps|#2LEW(c##9~$a4Sdg9;FF|y&f`YOI!DTL)*MdI zdYPZ&bJ*n^cEOMA!Wz~&Z;64Ai!rllo#zXDo;uF+m$5+Nb106VL-Dyl+~Yc*dYp{JI9y=&y^S;LiO1PEDsb_yM#`v^go;i)n zYj`HD{g5ZY^|4{jj6y!or%=F}62`l#srH#jdrr0MVf$>PeH7b6t2pClI^%cruTcN!fZr!ZbcCzK zh^qW?Qe^?dTU=|KCDk4ToT%RW0Vk^XF>zwX76eX9u2;w2Pg9ydOKJX7O7rIdXN){G zCOySRs4_yZq>Wv|ot@9)=4X6Zu9|th)4HGj(xQBPKGby8j{|>4Ov89ZUxi^NiEoed+-1r z!Q%*h1W({+F?xcWC-4yx$vuLH*yjPNvyR8olh)M8>e@@6lIwPj`>)?vybHUC-#fu`+(V4ViXL@h@sr?* zjh^r%f?r%LKE?0R2b3}jpp{fM(VHq`Pxr+z$j(MUwIdfo~4 z8ox4Mpc6A0e<}8!B>t*Xw(PUCWc=-~PIIR9PR^hB@f8kNCyCUoI%!o|0b!P~TSrnD zmiU#=aPe>D{rKqN-COcQYg8$eP#XHVk~Y$i?eFLs%Kc38a#!}!-pzj1FWIi@s=e1$ z$;)ec|3z)5a@JE^8?%R9e3qjO;(lB_xJ;h@hG)bFaBz51 zoW^j{-u~)@Qo>If!AU%*bxN;PHh#B*j5dnh8q@*=6Yu2sRimEbmpqg9O49#F;dc*_ zbuU1$!ms*GgODq8;_#e8mgrXu^&3VMjS9a}9{s{`fV*TLza@s{?;TN@q`m#sllTpH zb#njzC-_aGH;!KwcjZX&TKayk>```{;y3iw^TIF1V0ES@qir|*O7s#|34@dwB(np> zQ`abdLlmplJ3Y^S(|9HX(0yLT-{^WIqp!k~yw@u1WL;%EyonK3&s}`VSl?=E;jV@N*$@Jth;ul?Aj$~tyWpZch@$JP@G;{8z|UzrB>W1 zmK`6Zishk62FR;7oV86mc)`uB4d)mPEYS;a@b+-ER#|VZxwSeQ#p0So6!qsiBNr@S%w#@kD8EG_d3Z@%6P*l&FgepqNYwGFpnzvnuQX3eb|7e`7>zfrv5 v_)Yg>q10?RtG>Iq;a652zkab$bKi4oZh6gJZ0uCs`o&zmxKUnow;TTk>+G_0 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wat b/targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wat new file mode 100644 index 0000000..dd47775 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/default/h264_dec.wat @@ -0,0 +1,733 @@ +(module $h264_dec.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32))) + (type (;3;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $h264_dec_init (type 1) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store8 offset=15 + i32.const 8450 + i32.const 8450 + call $__pragma_loopbound + i32.const -8450 + local.set 1 + loop ;; label = @1 + i32.const 16672 + local.get 1 + i32.add + local.tee 2 + i32.const 8450 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 8451 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 2 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + i32.const 4050 + i32.const 4050 + call $__pragma_loopbound + i32.const -8100 + local.set 2 + loop ;; label = @1 + i32.const 1024 + local.get 2 + i32.add + local.tee 1 + i32.const 8100 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 8101 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 8102 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 8103 + i32.add + local.tee 1 + local.get 1 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 4 + i32.add + local.tee 2 + br_if 0 (;@1;) + end + i32.const 256 + i32.const 256 + call $__pragma_loopbound + i32.const -1024 + local.set 2 + loop ;; label = @1 + i32.const 25136 + local.get 2 + i32.add + local.tee 1 + i32.const 1024 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 1025 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 1026 + i32.add + local.tee 3 + local.get 3 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 1027 + i32.add + local.tee 1 + local.get 1 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 2 + i32.const 4 + i32.add + local.tee 2 + br_if 0 (;@1;) + end + i32.const 0 + i64.const 34359738376 + i64.store offset=16660 align=4 + i32.const 0 + i32.const 256 + i32.store offset=16128 + i32.const 0 + i64.const 8589934592 + i64.store offset=16652 align=4 + i32.const 0 + i64.const 1099511628128 + i64.store offset=16120 align=4 + i32.const 0 + i64.const 4294967297 + i64.store offset=16112 align=4 + i32.const 0 + i64.const 0 + i64.store offset=16644 align=4 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $h264_dec_decode_one_macroblock (type 2) (param i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 0 + i32.load offset=552 + local.set 1 + local.get 0 + i32.load offset=548 + local.set 2 + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 64 + local.get 1 + i32.div_s + local.tee 3 + i32.const 64 + local.get 2 + i32.div_s + local.tee 4 + i32.mul + local.tee 5 + i32.const 1 + i32.shr_s + local.set 6 + local.get 3 + i32.const -1 + i32.add + local.set 7 + local.get 4 + i32.const -1 + i32.add + local.set 8 + i32.const 1 + local.set 9 + i32.const 0 + local.set 1 + loop ;; label = @1 + i32.const 1 + i32.const 1 + call $__pragma_loopbound + block ;; label = @2 + local.get 0 + i32.load offset=544 + i32.const 2 + i32.lt_s + br_if 0 (;@2;) + i32.const 0 + local.set 10 + i32.const 1024 + local.get 1 + i32.const 4050 + i32.mul + i32.add + local.set 11 + local.get 1 + i32.const 3456 + i32.mul + i32.const 9200 + i32.add + local.set 12 + loop ;; label = @3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + local.set 13 + loop ;; label = @4 + local.get 0 + i32.load offset=12 + local.set 14 + local.get 0 + i32.load offset=16 + local.set 15 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 4 + local.get 15 + i32.mul + local.set 16 + local.get 4 + local.get 15 + i32.const 1 + i32.add + local.tee 17 + i32.mul + i32.const -1 + i32.add + local.set 18 + i32.const 0 + local.set 19 + loop ;; label = @5 + local.get 0 + i32.load offset=552 + local.set 1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 19 + local.get 14 + i32.add + local.tee 2 + local.get 1 + i32.const 4 + i32.div_s + i32.div_s + i32.const 64 + i32.rem_s + local.set 1 + block ;; label = @6 + local.get 0 + i32.load offset=540 + br_if 0 (;@6;) + local.get 2 + local.get 3 + i32.mul + local.set 20 + i32.const 0 + local.set 2 + i32.const 16672 + local.get 1 + i32.const 130 + i32.mul + i32.add + local.set 21 + local.get 15 + local.set 22 + i32.const 0 + local.set 1 + i32.const 0 + local.set 23 + loop ;; label = @7 + block ;; label = @8 + local.get 23 + br_if 0 (;@8;) + local.get 19 + local.get 1 + i32.add + i32.const 9136 + i32.add + local.get 16 + local.get 2 + i32.add + local.get 21 + local.get 22 + local.get 0 + i32.load offset=548 + i32.const 4 + i32.div_s + i32.div_s + i32.const 64 + i32.rem_s + i32.const 1 + i32.shl + i32.add + local.tee 24 + i32.load8_s + local.tee 25 + i32.add + local.tee 26 + local.get 8 + i32.and + local.tee 23 + local.get 11 + local.get 20 + local.get 24 + i32.load8_s offset=1 + i32.add + local.tee 24 + local.get 3 + i32.div_s + local.tee 27 + i32.const 287 + local.get 27 + i32.const 287 + i32.lt_s + select + local.tee 27 + i32.const 0 + local.get 27 + i32.const 0 + i32.gt_s + select + i32.const 45 + i32.rem_u + i32.const 90 + i32.mul + i32.add + local.tee 27 + local.get 18 + local.get 2 + i32.add + local.get 25 + i32.add + local.get 4 + i32.div_s + local.tee 28 + local.get 0 + i32.load offset=8 + local.tee 25 + i32.const -1 + i32.add + local.tee 29 + local.get 28 + local.get 25 + i32.lt_s + select + local.tee 28 + i32.const 0 + local.get 28 + i32.const 0 + i32.gt_s + select + i32.const 45 + i32.rem_u + i32.const 1 + i32.shl + local.tee 28 + i32.add + i32.load16_s + i32.mul + local.get 4 + local.get 23 + i32.sub + local.tee 30 + local.get 27 + local.get 26 + local.get 4 + i32.div_s + local.tee 26 + local.get 29 + local.get 26 + local.get 25 + i32.lt_s + select + local.tee 25 + i32.const 0 + local.get 25 + i32.const 0 + i32.gt_s + select + i32.const 45 + i32.rem_u + i32.const 1 + i32.shl + local.tee 25 + i32.add + i32.load16_s + i32.mul + i32.add + local.get 3 + local.get 24 + local.get 7 + i32.and + local.tee 26 + i32.sub + i32.mul + local.get 6 + i32.add + local.get 23 + local.get 11 + local.get 24 + local.get 7 + i32.add + local.get 3 + i32.div_s + local.tee 24 + i32.const 287 + local.get 24 + i32.const 287 + i32.lt_s + select + local.tee 24 + i32.const 0 + local.get 24 + i32.const 0 + i32.gt_s + select + i32.const 45 + i32.rem_u + i32.const 90 + i32.mul + i32.add + local.tee 24 + local.get 28 + i32.add + i32.load16_s + i32.mul + local.get 30 + local.get 24 + local.get 25 + i32.add + i32.load16_s + i32.mul + i32.add + local.get 26 + i32.mul + i32.add + local.get 5 + i32.div_s + i32.store8 + end + local.get 1 + i32.const 21 + i32.eq + br_if 1 (;@6;) + local.get 22 + i32.const 1 + i32.add + local.set 22 + local.get 2 + local.get 4 + i32.add + local.set 2 + local.get 1 + i32.const 7 + i32.add + local.set 1 + local.get 0 + i32.load offset=540 + local.set 23 + br 0 (;@7;) + end + end + local.get 19 + i32.const 1 + i32.add + local.tee 19 + i32.const 4 + i32.ne + br_if 0 (;@5;) + end + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 12 + local.get 14 + i32.const 64 + i32.rem_s + i32.const 54 + i32.mul + i32.add + local.tee 1 + local.get 15 + i32.const 54 + i32.rem_s + local.tee 2 + i32.add + i32.const 0 + i32.load offset=25136 + i32.store8 + local.get 12 + local.get 14 + i32.const 1 + i32.add + i32.const 64 + i32.rem_s + i32.const 54 + i32.mul + i32.add + local.tee 22 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=4 + i32.store8 + local.get 12 + local.get 14 + i32.const 2 + i32.add + i32.const 64 + i32.rem_s + i32.const 54 + i32.mul + i32.add + local.tee 23 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=8 + i32.store8 + local.get 12 + local.get 14 + i32.const 3 + i32.add + i32.const 64 + i32.rem_s + i32.const 54 + i32.mul + i32.add + local.tee 24 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=12 + i32.store8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 17 + i32.const 54 + i32.rem_s + local.tee 2 + i32.add + i32.const 25136 + i32.load offset=64 + i32.store8 + local.get 22 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=68 + i32.store8 + local.get 23 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=72 + i32.store8 + local.get 24 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=76 + i32.store8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 15 + i32.const 2 + i32.add + i32.const 54 + i32.rem_s + local.tee 2 + i32.add + i32.const 25136 + i32.load offset=128 + i32.store8 + local.get 22 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=132 + i32.store8 + local.get 23 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=136 + i32.store8 + local.get 24 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=140 + i32.store8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 1 + local.get 15 + i32.const 3 + i32.add + i32.const 54 + i32.rem_s + local.tee 2 + i32.add + i32.const 25136 + i32.load offset=192 + i32.store8 + local.get 22 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=196 + i32.store8 + local.get 23 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=200 + i32.store8 + local.get 24 + local.get 2 + i32.add + i32.const 25136 + i32.load offset=204 + i32.store8 + local.get 13 + i32.const 1 + i32.add + local.tee 13 + i32.const 4 + i32.ne + br_if 0 (;@4;) + end + local.get 10 + i32.const 1 + i32.add + local.tee 10 + local.get 0 + i32.load offset=544 + i32.const 2 + i32.div_s + i32.lt_s + br_if 0 (;@3;) + end + end + i32.const 1 + local.set 1 + local.get 9 + i32.const 1 + i32.and + local.set 2 + i32.const 0 + local.set 9 + local.get 2 + br_if 0 (;@1;) + end) + (func $h264_dec_main (type 1) + i32.const 16112 + call $h264_dec_decode_one_macroblock) + (func $__original_main (type 3) (result i32) + call $h264_dec_init + call $h264_dec_main + i32.const 0 + i32.load8_s offset=9200 + i32.const 0 + i32.load8_s offset=9136 + i32.add + i32.const -128 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 30256)) + (global (;1;) i32 (i32.const 26160)) + (global (;2;) i32 (i32.const 30256)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $h264_dec_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00}\00~\00~\00~\00~\00~\00~\00~\00}\00{\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00x\00w\00w\00w\00w\00w\00w\00w\00x\00y\00y\00y\00y\00y\00y\00y\00y\00x\00x\00x\00z\00z\00|\00|\00|\00{\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\7f\00\82\00\87\00\89\00\8b\00\8c\00\8c\00\8c\00\8c\00\8c\00\8c\00\8d\00\8e\00\8f\00\8f\00\8f\00\8f\00\8f\00\8f\00\8f\00\8e\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00x\00w\00w\00w\00w\00w\00w\00w\00x\00y\00y\00y\00y\00y\00y\00y\00y\00x\00x\00x\00z\00z\00|\00|\00|\00{\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\7f\00\82\00\87\00\89\00\8b\00\8c\00\8c\00\8c\00\8c\00\8c\00\8c\00\8d\00\8e\00\8f\00\8f\00\8f\00\8f\00\8f\00\8f\00\8f\00\8e\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00x\00w\00w\00w\00w\00w\00w\00w\00x\00y\00y\00y\00y\00y\00y\00y\00y\00x\00x\00x\00z\00z\00|\00|\00|\00{\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\7f\00\82\00\87\00\89\00\8b\00\8c\00\8c\00\8c\00\8c\00\8c\00\8c\00\8d\00\8e\00\8f\00\8f\00\8f\00\8f\00\8f\00\8f\00\8f\00\8e\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00|\00|\00|\00|\00|\00|\00|\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00|\00|\00|\00|\00|\00|\00|\00{\00{\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00x\00w\00v\00v\00v\00v\00v\00v\00w\00x\00x\00x\00x\00x\00x\00x\00x\00x\00w\00w\00y\00y\00{\00{\00{\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\80\00\82\00\86\00\88\00\8a\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8c\00\8e\00\8f\00\8f\00\8f\00\8e\00\8e\00\8e\00\8e\00\8e\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00|\00|\00|\00|\00|\00|\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00|\00|\00|\00|\00|\00|\00|\00|\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00w\00v\00v\00v\00v\00v\00v\00v\00v\00w\00x\00x\00x\00x\00x\00x\00x\00w\00w\00w\00y\00y\00{\00{\00{\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00}\00|\00{\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\81\00\80\00\83\00\86\00\88\00\8a\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8c\00\8e\00\8f\00\8f\00\8e\00\8d\00\8c\00\8c\00\8d\00\8e\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00}\00|\00|\00|\00|\00|\00|\00|\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00{\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00w\00v\00u\00u\00u\00u\00u\00u\00v\00w\00w\00w\00w\00w\00w\00w\00w\00v\00v\00v\00x\00x\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\81\00\81\00\83\00\85\00\87\00\89\00\8a\00\8a\00\8a\00\8a\00\8a\00\8a\00\8b\00\8e\00\8f\00\8f\00\8e\00\8c\00\8b\00\8b\00\8c\00\8d\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00}\00|\00|\00|\00|\00|\00|\00|\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00{\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00x\00x\00w\00v\00u\00u\00u\00u\00u\00u\00v\00w\00w\00w\00w\00w\00w\00w\00w\00v\00v\00v\00x\00x\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\81\00\81\00\83\00\85\00\87\00\89\00\8a\00\8a\00\8a\00\8a\00\8a\00\8a\00\8b\00\8e\00\8f\00\8f\00\8e\00\8c\00\8b\00\8b\00\8c\00\8d\00\8e\00\8e\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00~\00}\00|\00|\00|\00|\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00|\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00z\00y\00y\00x\00x\00w\00w\00v\00u\00t\00t\00u\00u\00u\00u\00v\00w\00w\00w\00w\00w\00w\00w\00w\00w\00w\00w\00x\00x\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\81\00\81\00\83\00\84\00\86\00\89\00\8a\00\8a\00\8a\00\8a\00\8a\00\8a\00\8b\00\8e\00\8e\00\8e\00\8d\00\8c\00\8b\00\8b\00\8c\00\8d\00\8d\00\8d\00\8d\00\8d\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\85\00\85\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00{\00{\00y\00y\00z\00{\00{\00{\00{\00{\00{\00{\00{\00{\00z\00z\00z\00z\00z\00z\00z\00{\00{\00{\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00y\00w\00w\00v\00v\00u\00u\00t\00t\00s\00s\00t\00t\00u\00u\00v\00w\00w\00x\00x\00x\00x\00x\00x\00x\00x\00x\00x\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00z\00z\00z\00{\00{\00{\00{\00{\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00|\00{\00{\00z\00z\00y\00x\00x\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\80\00\80\00\81\00\81\00\82\00\83\00\85\00\88\00\89\00\89\00\8a\00\8a\00\8b\00\8b\00\8c\00\8d\00\8d\00\8d\00\8c\00\8c\00\8b\00\8b\00\8b\00\8c\00\8c\00\8c\00\8c\00\8c\00\8c\00\8c\00\8b\00\8a\00\89\00\89\00\88\00\88\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\87\00\86\00\85\00\84\00\84\00\85\00\85\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00{\00z\00x\00x\00y\00z\00{\00{\00{\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00x\00v\00v\00u\00u\00t\00t\00s\00s\00r\00r\00s\00t\00u\00u\00v\00w\00w\00x\00x\00x\00x\00x\00x\00x\00x\00x\00x\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00z\00z\00z\00{\00|\00|\00|\00|\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00|\00{\00{\00z\00z\00y\00x\00x\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\80\00\80\00\81\00\81\00\82\00\82\00\84\00\87\00\88\00\89\00\8a\00\8a\00\8b\00\8b\00\8b\00\8c\00\8c\00\8c\00\8b\00\8b\00\8a\00\8a\00\8a\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8a\00\89\00\88\00\88\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\87\00\87\00\87\00\87\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\85\00\84\00\83\00\83\00\84\00\84\00\85\00\85\00\85\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00\86\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00{\00z\00x\00x\00y\00z\00{\00{\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00x\00v\00u\00u\00t\00t\00s\00s\00r\00r\00r\00s\00t\00u\00u\00v\00w\00x\00x\00x\00x\00y\00y\00y\00x\00x\00x\00x\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00z\00z\00z\00{\00|\00|\00|\00|\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00{\00{\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00|\00{\00{\00z\00z\00y\00x\00x\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00{\00|\00|\00|\00|\00|\00|\00|\00|\00}\00}\00}\00}\00}\00}\00}\00}\00~\00~\00\7f\00\7f\00\7f\00\80\00\80\00\80\00\80\00\80\00\80\00\81\00\81\00\82\00\82\00\84\00\87\00\88\00\88\00\89\00\8a\00\8b\00\8b\00\8b\00\8c\00\8c\00\8c\00\8b\00\8b\00\8a\00\8a\00\8a\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8b\00\8a\00\89\00\88\00\87\00\87\00\86\00\86\00\85\00\85\00\85\00\85\00\86\00\86\00\86\00\86\00\86\00\86\00\85\00\85\00\85\00\85\00\85\00\85\00\85\00\85\00\84\00\83\00\83\00\84\00\84\00\85\00\84\00\84\00\85\00\85\00\85\00\85\00\85\00\85\00\85\00\85\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00|\00|\00{\00y\00x\00x\00y\00z\00z\00z\00z\00z\00z\00z\00z\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00{\00{\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00|\00{\00{\00{\00z\00v\00t\00t\00s\00s\00r\00r\00r\00r\00r\00s\00t\00u\00u\00u\00v\00x\00y\00y\00y\00y\00y\00y\00y\00y\00x\00x\00x\00y\00y\00y\00z\00z\00y\00y\00y\00z\00z\00z\00z\00y\00y\00y\00y\00z\00z\00z\00{\00|\00|\00|\00|\00{\00{\00{\00{\00z\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00y\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00z\00{\00{\00|\00|\00|\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00}\00")) diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.c b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.c new file mode 100644 index 0000000..63c27c6 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.c @@ -0,0 +1,824 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: h264_dec_ldecode_macroblock.c + + Author: Inge Lille-Langoy et al. + + Function: H.264 decoder + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: h264_dec_ldecode_macroblock.c + + Changes: no functional changes + + License: see copyright.txt + +*/ + +/* + Include section +*/ + +#include "h264_dec.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void h264_dec_init(); +int h264_dec_return(); +void h264_dec_decode_one_macroblock(struct h264_dec_img_par *img); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +h264_dec_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +extern signed char h264_dec_mv_array[65][65][2]; +extern short h264_dec_list_imgUV[2][45][45]; +extern int h264_dec_img_m7[16][16]; + +signed char h264_dec_img_mpr[7][7]; +signed char h264_dec_dec_picture_imgUV[2][64][54]; +struct h264_dec_img_par h264_dec_img; + +/* + Initialization- and return-value-related functions +*/ + +int +h264_dec_return() { + return (h264_dec_img_mpr[0][0] + h264_dec_dec_picture_imgUV[0][0][0] + + 128 != + 0); +} + +void +h264_dec_init() { + unsigned int i; + unsigned char *p; + volatile signed char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &h264_dec_mv_array[0]; + __pragma_loopbound(8450, 8450); + for (i = 0; i < sizeof(h264_dec_mv_array); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &h264_dec_list_imgUV[0]; + __pragma_loopbound(4050, 4050); + for (i = 0; i < sizeof(h264_dec_list_imgUV); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &h264_dec_img_m7[0]; + __pragma_loopbound(256, 256); + for (i = 0; i < sizeof(h264_dec_img_m7); ++i, ++p) + *p ^= bitmask; + + h264_dec_img.mb_cr_size_x = 8; + h264_dec_img.mb_cr_size_y = 8; + h264_dec_img.num_blk8x8_uv = 2; + h264_dec_img.pix_c_x = 256; + h264_dec_img.pix_c_y = 256; + h264_dec_img.width_cr = 352; + h264_dec_img.apply_weights = 0; + h264_dec_img.direct_spatial_mv_pred_flag = 1; + h264_dec_img.type = 1; + h264_dec_img.wp_round_chroma = 0; + h264_dec_img.chroma_log2_weight_denom = 0; +} + +/* + Algorithm core functions +*/ + +void +h264_dec_decode_one_macroblock(struct h264_dec_img_par *img) { + int i = 0, j = 0, ii = 0, jj = 0, i1 = 0, j1 = 0, j4 = 0, i4 = 0; + int uv; + int ioff, joff; + int bw_pred = 0, fw_pred = 0, ifx; + int ii0, jj0, ii1, jj1, if1, jf1, if0, jf0; + int f1_x, f1_y, f2_x, f2_y, f3, f4; + + short fw_refframe = -1, bw_refframe = -1; + int mv_mode, pred_dir, intra_prediction; // = currMB->ref_frame; + short fw_ref_idx = -1, bw_ref_idx = -1; + + int mb_nr = 0; + short dec_picture_ref_idx = 0; + + short active_sps_chroma_format_idc = 1; + short active_pps_weighted_pred_flag = 0; + short active_pps_weighted_bipred_idc = 0; + + int smb = 0; + int max_y_cr = 287; + + int jf; + + int direct_pdir = -1; + + int curr_mb_field = 0; + + int b8, b4; + + int residue_transform_flag = 0; + + if (1) { + f1_x = 64 / img->mb_cr_size_x; + f2_x = f1_x - 1; + + f1_y = 64 / img->mb_cr_size_y; + f2_y = f1_y - 1; + + f3 = f1_x * f1_y; + f4 = f3 >> 1; + + __pragma_loopbound(2, 2); + for (uv = 0; uv < 2; uv++) { + intra_prediction = 0; + + __pragma_loopbound(1, 1); + for (b8 = 0; b8 < (img->num_blk8x8_uv / 2); b8++) { + __pragma_loopbound(4, 4); + for (b4 = 0; b4 < 4; b4++) { + joff = 0; + j4 = img->pix_c_y + joff; + ioff = 0; + i4 = img->pix_c_x + ioff; + + mv_mode = 1; + pred_dir = -1; + + if (!intra_prediction) { + if (pred_dir != 2) { + + __pragma_loopbound(4, 4); + for (jj = 0; jj < 4; jj++) { + jf = ((j4 + jj) / (img->mb_cr_size_y / 4)) % 64; + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) { + ifx = + ((i4 + ii) / (img->mb_cr_size_x / 4)) % + 64; + i1 = (i4 + ii) * f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) + j1 = (j4 + jj) * f1_y + + h264_dec_mv_array[jf][ifx][1]; + else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y / 2) + jj + + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } + ++mb_nr; + } + + if (active_sps_chroma_format_idc == 1) + j1 += 0; + + ii0 = + (((0 < ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = (((0 < (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x) + : 0)) % + 45; + jj1 = + (((0 < (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + if (img->apply_weights) { + } else { + h264_dec_img_mpr[ii + ioff][jj + joff] = + (if0 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii1] + + f4) / + f3; + } + } + } + } else { + + __pragma_loopbound(4, 4); + for (jj = 0; jj < 4; jj++) { + jf = (j4 + jj) / (img->mb_cr_size_y / 4); + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) { + ifx = (i4 + ii) / (img->mb_cr_size_x / 4); + direct_pdir = 2; + + if (mv_mode == 0 && + img->direct_spatial_mv_pred_flag) { + if (dec_picture_ref_idx != -1) { + fw_refframe = 0; + fw_ref_idx = fw_refframe; + } + if (dec_picture_ref_idx != -1) { + bw_refframe = 0; + bw_ref_idx = bw_refframe; + } + + if (dec_picture_ref_idx == -1) + direct_pdir = 0; + else if (dec_picture_ref_idx == -1) + direct_pdir = 1; + + if (direct_pdir == 0 || + direct_pdir == 2) { + i1 = (img->pix_c_x + ii + ioff) * + f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = + (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } + } + + if (active_sps_chroma_format_idc == + 1) + j1 += 0; + + ii0 = + (((0 < ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = + (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = + (((0 < + (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / + f1_x) + : 0)) % + 45; + jj1 = (((0 < + (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / + f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + fw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii1] + + f4) / + f3; + } + if (direct_pdir == 1 || + direct_pdir == 2) { + i1 = (img->pix_c_x + ii + ioff) * + f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = + (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } + } + if (active_sps_chroma_format_idc == + 1) + j1 += 0; + + ii0 = + (((0 < ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = + (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = + (((0 < + (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / + f1_x) + : 0)) % + 45; + jj1 = (((0 < + (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / + f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + bw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii1] + + f4) / + f3; + } + + } else { + fw_refframe = 0; + bw_refframe = 0; + + fw_ref_idx = fw_refframe; + bw_ref_idx = bw_refframe; + + i1 = (img->pix_c_x + ii + ioff) * f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + jj + + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } + } + + if (active_sps_chroma_format_idc == 1) + j1 += 0; + + ii0 = + (((0 < + ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = (((0 < (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x) + : 0)) % + 45; + jj1 = + (((0 < + (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + fw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii1] + + f4) / + f3; + + i1 = (img->pix_c_x + ii + ioff) * f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + jj + + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } + } + + if (active_sps_chroma_format_idc == 1) + j1 += 0; + + ii0 = + (((0 < + ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = (((0 < (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x) + : 0)) % + 45; + jj1 = + (((0 < + (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + bw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii1] + + f4) / + f3; + } + + if (img->apply_weights) { + if (((active_pps_weighted_pred_flag && + (img->type == P_SLICE || + img->type == SP_SLICE)) || + (active_pps_weighted_bipred_idc == + 1 && + (img->type == B_SLICE))) && + curr_mb_field) { + fw_ref_idx >>= 1; + bw_ref_idx >>= 1; + } + + if (img->direct_spatial_mv_pred_flag && + direct_pdir == 1) { + img->mpr[ii + ioff][jj + joff] = + (((img->wp_round_chroma) >> + img->chroma_log2_weight_denom) < + 0 + ? 0 + : ((img->wp_round_chroma) >> + img->chroma_log2_weight_denom)) + + 0; + } else if ( + img->direct_spatial_mv_pred_flag && + direct_pdir == 0) { + img->mpr[ii + ioff][jj + joff] = + ((((img->wp_round_chroma) >> + img->chroma_log2_weight_denom)) < + 0 + ? 0 + : (((img->wp_round_chroma) >> + img->chroma_log2_weight_denom))); + } else { + + int alpha_fw = 0; + int alpha_bw = 0; + + img->mpr[ii + ioff][jj + joff] = + (((alpha_fw * fw_pred + + alpha_bw * bw_pred + + (1 + << img->chroma_log2_weight_denom)) >> + (img->chroma_log2_weight_denom + + 1)) < 0 + ? 0 + : ((alpha_fw * fw_pred + + alpha_bw * bw_pred + + (1 + << img->chroma_log2_weight_denom)) >> + (img->chroma_log2_weight_denom + + 1))); + } + } else { + if (img->direct_spatial_mv_pred_flag && + direct_pdir == 1) + img->mpr[ii + ioff][jj + joff] = + bw_pred; + else if ( + img->direct_spatial_mv_pred_flag && + direct_pdir == 0) + img->mpr[ii + ioff][jj + joff] = + fw_pred; + else { + img->mpr[ii + ioff][jj + joff] = + (fw_pred + bw_pred + 1) / 2; + } + } + } + } + } + } + + if (!smb) { + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) { + jj = 0; + __pragma_loopbound(4, 4); + for (; jj < 4; jj++) { + if (!residue_transform_flag) { + h264_dec_dec_picture_imgUV + [uv][(j4 + jj) % 64][(i4 + ii) % 54] = + h264_dec_img_m7[ii][jj]; + } + } + } + } + } + } + + if (smb) { + __pragma_loopbound(2, 2); + for (j = 4; j < 6; j++) { + joff = (j - 4) * 4; + j4 = img->pix_c_y + joff; + __pragma_loopbound(2, 2); + for (i = 0; i < 2; i++) { + ioff = i * 4; + i4 = img->pix_c_x + ioff; + + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) + __pragma_loopbound(4, 4); + for (jj = 0; jj < 4; jj++) { + h264_dec_dec_picture_imgUV[uv][(j4 + jj) % + 64][(i4 + ii) % 54] = + h264_dec_img_m7[ii][jj]; + } + } + } + } + } + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +h264_dec_main(void) { + h264_dec_decode_one_macroblock(&h264_dec_img); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + h264_dec_init(); + h264_dec_main(); + + return (h264_dec_return()); +} diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.h b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.h new file mode 100644 index 0000000..62b3312 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_dec.h @@ -0,0 +1,30 @@ + +#ifndef __H264DEC_H +#define __H264DEC_H + +typedef enum { + P_SLICE = 0, + B_SLICE, + I_SLICE, + SP_SLICE, + SI_SLICE +} h264_dec_SliceType; + +// image parameters +typedef struct h264_dec_img_par { + int direct_spatial_mv_pred_flag; + int type; + int width_cr; + int pix_c_y; + int pix_c_x; + unsigned short mpr[16][16]; + unsigned int chroma_log2_weight_denom; + int wp_round_chroma; + unsigned int apply_weights; + int num_blk8x8_uv; + int mb_cr_size_x; + int mb_cr_size_y; + +} h264_dec_ImageParameters; + +#endif diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_decinput.c b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_decinput.c new file mode 100644 index 0000000..9f36f83 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/default/h264_decinput.c @@ -0,0 +1,902 @@ + +signed char h264_dec_mv_array[65][65][2] = { + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}}; + +short h264_dec_list_imgUV[2][45][45] = { + {{123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 125, 126, 126, 126, 126, + 126, 126, 126, 125, 123, 122, 122, 122, 122}, + {122, 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 120, 119, + 119, 119, 119, 119, 119, 119, 120, 121, 121}, + {121, 121, 121, 121, 121, 121, 120, 120, 120, 122, 122, 124, + 124, 124, 123, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, + 123, 123, 124, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, + 128, 128, 127, 130, 135, 137, 139, 140, 140, 140, 140, 140, + 140, 141, 142, 143, 143, 143, 143, 143, 143, 143, 142, 142, + 142, 141, 141, 140, 140, 139, 138, 137, 137}, + {136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 123, 123, 123, 123, 123, 123, 123, 123}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, 121, 121, + 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 120, 121, + 121, 121, 121, 121, 121, 121, 121, 120, 120}, + {120, 122, 122, 124, 124, 124, 123, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, + 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 126, 126, 127}, + {127, 127, 128, 128, 128, 128, 127, 130, 135, 137, 139, 140, + 140, 140, 140, 140, 140, 141, 142, 143, 143, 143, 143, 143, + 143, 143, 142, 142, 142, 141, 141, 140, 140, 139, 138, 137, + 137, 136, 136, 135, 135, 135, 134, 133, 133}, + {134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 123, 123, 123, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, + 122, 122, 121, 121, 120, 120, 120, 119, 119, 119, 119, 119, + 119, 119, 120, 121, 121, 121, 121, 121, 121, 121, 121, 120, + 120, 120, 122, 122, 124, 124, 124, 123, 122}, + {122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122}, + {122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, + 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122}, + {122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, + 128, 128, 128, 128, 127, 130, 135, 137, 139}, + {140, 140, 140, 140, 140, 140, 141, 142, 143, 143, 143, 143, + 143, 143, 143, 142, 142, 142, 141, 141, 140, 140, 139, 138, + 137, 137, 136, 136, 135, 135, 135, 134, 133, 133, 134, 134, + 135, 135, 135, 135, 135, 135, 135, 135, 135}, + {135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 124, 124, 124, 124, 124, 124, + 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 124, 124, 124}, + {124, 124, 124, 124, 123, 123, 122, 122, 122, 122, 122, 122, + 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {123, 122, 122, 121, 121, 120, 120, 120, 119, 118, 118, 118, + 118, 118, 118, 119, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 119, 119, 121, 121, 123, 123, 123, 122, 122, 122, 122, + 122, 122, 122, 122, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123}, + {123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122}, + {122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, + 126, 127, 127, 127, 128, 128, 128, 128, 128, 130, 134, 136, + 138, 139, 139, 139, 139, 139, 139, 140, 142}, + {143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 141, 141, + 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, + 133, 133, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 134, 134, 134, 134, 134, 134}, + {134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 124, 124, + 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 124, + 124, 124, 124, 124, 124, 124, 122, 122, 122}, + {122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 123, 122, 122, 121, 121, 120, 120, 119}, + {118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 120, 120, + 120, 120, 120, 120, 119, 119, 119, 121, 121, 123, 123, 123, + 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123}, + {123, 123, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, + 125, 124, 123, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122}, + {122, 122, 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, + 127, 127, 128, 128, 128, 129, 128, 131, 134, 136, 138, 139, + 139, 139, 139, 139, 139, 140, 142, 143, 143}, + {142, 141, 140, 140, 141, 142, 142, 142, 141, 141, 140, 140, + 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 133, 133, + 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 134, 134, 134, 134, 134, 134, 134, 134}, + {134, 134, 134, 134, 134, 134, 134, 134, 125, 125, 125, 125, + 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 125, 124, 124, 124, + 124, 124, 124, 124, 123, 123, 123, 123, 123}, + {123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 123, + 122, 122, 121, 121, 120, 120, 119, 118, 117}, + {117, 117, 117, 117, 117, 118, 119, 119, 119, 119, 119, 119, + 119, 119, 118, 118, 118, 120, 120, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 123, 122, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 122}, + {122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 123, 123, 123, 123, 123, 123}}, + {{123, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 126, 126, 127, 127, 127, 128, 128, 128, 129, 129, 131, + 133, 135, 137, 138, 138, 138, 138, 138, 138, 139, 142, 143, + 143, 142, 140, 139, 139, 140, 141, 142, 142}, + {141, 141, 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, + 135, 134, 133, 133, 134, 134, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134}, + {125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 125, 124, 124, 124, 124, 124, 124, 124, 123, 123, 123, 123, + 123, 123, 123, 123, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 123, 123, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 119, 118, + 117, 117, 117, 117, 117, 117, 118, 119, 119}, + {119, 119, 119, 119, 119, 119, 118, 118, 118, 120, 120, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 122, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, + 123, 123, 124, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, + 128, 129, 129, 131, 133, 135, 137, 138, 138, 138, 138, 138, + 138, 139, 142, 143, 143, 142, 140, 139, 139, 140, 141, 142, + 142, 141, 141, 140, 140, 139, 138, 137, 137}, + {136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 125, 125, 125, 125, 125, 125, 125, 125}, + {126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 125, 124, 124, 124, 124, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 124, 123, 123, 123, + 123, 123, 123, 123, 124, 124, 124, 123, 123}, + {123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, + 124, 124, 124, 124, 124, 124, 124, 122, 121, 121, 120, 120, + 119, 119, 118, 117, 116, 116, 117, 117, 117, 117, 118, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119}, + {119, 120, 120, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, + 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 126, 126, 126, 127}, + {127, 127, 128, 128, 128, 129, 129, 131, 132, 134, 137, 138, + 138, 138, 138, 138, 138, 139, 142, 142, 142, 141, 140, 139, + 139, 140, 141, 141, 141, 141, 141, 140, 140, 139, 138, 137, + 137, 136, 136, 135, 135, 135, 134, 133, 133}, + {134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 134, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, + 123, 121, 121, 122, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 121, + 119, 119, 118, 118, 117, 117, 116, 116, 115, 115, 116, 116, + 117, 117, 118, 119, 119, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 121, 121, 121, 121, 122, 122}, + {122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 122, 122, + 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 122, 122, 123, 123, 124, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 124, 123, 123, 122, 122, 121, 120, 120, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 125, + 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 129, 129, 130}, + {131, 133, 136, 137, 137, 138, 138, 139, 139, 140, 141, 141, + 141, 140, 140, 139, 139, 139, 140, 140, 140, 140, 140, 140, + 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 134, + 134, 134, 135, 135, 135, 135, 135, 135, 135}, + {135, 135, 135, 135, 134, 133, 132, 132, 133, 133, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 123, 122, 120, 120, 121, 122, 123, 123, 123, + 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 123, 120, 118, 118, 117, 117, 116, 116, 115, 115, + 114, 114, 115, 116, 117, 117, 118, 119, 119, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 121, 121}, + {121, 121, 122, 122, 122, 123, 124, 124, 124, 124, 123, 123, + 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 123, 123}, + {124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 124, 123, 123, 122, 122, 121, 120, + 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122}, + {122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 122}, + {122, 122, 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, + 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 126, + 126, 127, 127, 127, 128, 128, 128, 128, 128, 128, 129, 129, + 130, 130, 132, 135, 136, 137, 138, 138, 139}, + {139, 139, 140, 140, 140, 139, 139, 138, 138, 138, 139, 139, + 139, 139, 139, 139, 139, 139, 138, 137, 136, 136, 135, 135, + 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 134, 134, + 134, 134, 134, 134, 134, 133, 132, 131, 131}, + {132, 132, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, + 134, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 123, 122, 120, 120, 121}, + {122, 123, 123, 122, 122, 122, 122, 122, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 123, 123, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 120, 118, 117, 117, 116}, + {116, 115, 115, 114, 114, 114, 115, 116, 117, 117, 118, 119, + 120, 120, 120, 120, 121, 121, 121, 120, 120, 120, 120, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, + 121, 121, 121, 122, 122, 122, 123, 124, 124}, + {124, 124, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, + 123, 124, 125, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 123, 123, + 122, 122, 121, 120, 120, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121}, + {121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 123, 124}, + {124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, 128, 128, + 128, 128, 129, 129, 130, 130, 132, 135, 136, 136, 137, 138, + 139, 139, 139, 140, 140, 140, 139, 139, 138}, + {138, 138, 139, 139, 139, 139, 139, 139, 139, 138, 137, 136, + 135, 135, 134, 134, 133, 133, 133, 133, 134, 134, 134, 134, + 134, 134, 133, 133, 133, 133, 133, 133, 133, 133, 132, 131, + 131, 132, 132, 133, 132, 132, 133, 133, 133}, + {133, 133, 133, 133, 133, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 124, 124, 123, 121, 120, 120, + 121, 122, 122, 122, 122, 122, 122, 122, 122}, + {121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 123, 123, 122, 118, 116, 116, 115, + 115, 114, 114, 114, 114, 114, 115, 116, 117}, + {117, 117, 118, 120, 121, 121, 121, 121, 121, 121, 121, 121, + 120, 120, 120, 121, 121, 121, 122, 122, 121, 121, 121, 122, + 122, 122, 122, 121, 121, 121, 121, 122, 122, 122, 123, 124, + 124, 124, 124, 123, 123, 123, 123, 122, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 123, 123, 124, 124, 124, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125}}}; + +int h264_dec_img_m7[16][16] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.c b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.c new file mode 100644 index 0000000..62b07aa --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.c @@ -0,0 +1,834 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: h264_dec_ldecode_macroblock.c + + Author: Inge Lille-Langoy et al. + + Function: H.264 decoder + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: h264_dec_ldecode_macroblock.c + + Changes: no functional changes + + License: see copyright.txt + +*/ + +/* + Include section +*/ + +#include "h264_dec.h" + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + +#include "h264_decinput.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void h264_dec_init(); +__attribute__((always_inline)) static inline int h264_dec_return(); +__attribute__((always_inline)) static inline void +h264_dec_decode_one_macroblock(struct h264_dec_img_par *img); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +h264_dec_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +extern signed char h264_dec_mv_array[65][65][2]; +extern short h264_dec_list_imgUV[2][45][45]; +extern int h264_dec_img_m7[16][16]; + +signed char h264_dec_img_mpr[7][7]; +signed char h264_dec_dec_picture_imgUV[2][64][54]; +struct h264_dec_img_par h264_dec_img; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline int +h264_dec_return() { + return (h264_dec_img_mpr[0][0] + h264_dec_dec_picture_imgUV[0][0][0] + + 128 != + 0); +} + +__attribute__((always_inline)) static inline void +h264_dec_init() { + unsigned int i; + unsigned char *p; + volatile signed char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &h264_dec_mv_array[0]; + __pragma_loopbound(8450, 8450); + for (i = 0; i < sizeof(h264_dec_mv_array); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &h264_dec_list_imgUV[0]; + __pragma_loopbound(4050, 4050); + for (i = 0; i < sizeof(h264_dec_list_imgUV); ++i, ++p) + *p ^= bitmask; + + p = (unsigned char *) &h264_dec_img_m7[0]; + __pragma_loopbound(256, 256); + for (i = 0; i < sizeof(h264_dec_img_m7); ++i, ++p) + *p ^= bitmask; + + h264_dec_img.mb_cr_size_x = 8; + h264_dec_img.mb_cr_size_y = 8; + h264_dec_img.num_blk8x8_uv = 2; + h264_dec_img.pix_c_x = 256; + h264_dec_img.pix_c_y = 256; + h264_dec_img.width_cr = 352; + h264_dec_img.apply_weights = 0; + h264_dec_img.direct_spatial_mv_pred_flag = 1; + h264_dec_img.type = 1; + h264_dec_img.wp_round_chroma = 0; + h264_dec_img.chroma_log2_weight_denom = 0; +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +h264_dec_decode_one_macroblock(struct h264_dec_img_par *img) { + int i = 0, j = 0, ii = 0, jj = 0, i1 = 0, j1 = 0, j4 = 0, i4 = 0; + int uv; + int ioff, joff; + int bw_pred = 0, fw_pred = 0, ifx; + int ii0, jj0, ii1, jj1, if1, jf1, if0, jf0; + int f1_x, f1_y, f2_x, f2_y, f3, f4; + + short fw_refframe = -1, bw_refframe = -1; + int mv_mode, pred_dir, intra_prediction; // = currMB->ref_frame; + short fw_ref_idx = -1, bw_ref_idx = -1; + + int mb_nr = 0; + short dec_picture_ref_idx = 0; + + short active_sps_chroma_format_idc = 1; + short active_pps_weighted_pred_flag = 0; + short active_pps_weighted_bipred_idc = 0; + + int smb = 0; + int max_y_cr = 287; + + int jf; + + int direct_pdir = -1; + + int curr_mb_field = 0; + + int b8, b4; + + int residue_transform_flag = 0; + + if (1) { + f1_x = 64 / img->mb_cr_size_x; + f2_x = f1_x - 1; + + f1_y = 64 / img->mb_cr_size_y; + f2_y = f1_y - 1; + + f3 = f1_x * f1_y; + f4 = f3 >> 1; + + __pragma_loopbound(2, 2); + for (uv = 0; uv < 2; uv++) { + intra_prediction = 0; + + __pragma_loopbound(1, 1); + for (b8 = 0; b8 < (img->num_blk8x8_uv / 2); b8++) { + __pragma_loopbound(4, 4); + for (b4 = 0; b4 < 4; b4++) { + joff = 0; + j4 = img->pix_c_y + joff; + ioff = 0; + i4 = img->pix_c_x + ioff; + + mv_mode = 1; + pred_dir = -1; + + if (!intra_prediction) { + if (pred_dir != 2) { + + __pragma_loopbound(4, 4); + for (jj = 0; jj < 4; jj++) { + jf = ((j4 + jj) / (img->mb_cr_size_y / 4)) % 64; + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) { + ifx = + ((i4 + ii) / (img->mb_cr_size_x / 4)) % + 64; + i1 = (i4 + ii) * f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) + j1 = (j4 + jj) * f1_y + + h264_dec_mv_array[jf][ifx][1]; + else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y / 2) + jj + + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } + ++mb_nr; + } + + if (active_sps_chroma_format_idc == 1) + j1 += 0; + + ii0 = + (((0 < ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = (((0 < (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x) + : 0)) % + 45; + jj1 = + (((0 < (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + if (img->apply_weights) { + } else { + h264_dec_img_mpr[ii + ioff][jj + joff] = + (if0 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii1] + + f4) / + f3; + } + } + } + } else { + + __pragma_loopbound(4, 4); + for (jj = 0; jj < 4; jj++) { + jf = (j4 + jj) / (img->mb_cr_size_y / 4); + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) { + ifx = (i4 + ii) / (img->mb_cr_size_x / 4); + direct_pdir = 2; + + if (mv_mode == 0 && + img->direct_spatial_mv_pred_flag) { + if (dec_picture_ref_idx != -1) { + fw_refframe = 0; + fw_ref_idx = fw_refframe; + } + if (dec_picture_ref_idx != -1) { + bw_refframe = 0; + bw_ref_idx = bw_refframe; + } + + if (dec_picture_ref_idx == -1) + direct_pdir = 0; + else if (dec_picture_ref_idx == -1) + direct_pdir = 1; + + if (direct_pdir == 0 || + direct_pdir == 2) { + i1 = (img->pix_c_x + ii + ioff) * + f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = + (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } + } + + if (active_sps_chroma_format_idc == + 1) + j1 += 0; + + ii0 = + (((0 < ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = + (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = + (((0 < + (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / + f1_x) + : 0)) % + 45; + jj1 = (((0 < + (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / + f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + fw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii1] + + f4) / + f3; + } + if (direct_pdir == 1 || + direct_pdir == 2) { + i1 = (img->pix_c_x + ii + ioff) * + f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = + (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf] + [ifx] + [1]; + } + } + if (active_sps_chroma_format_idc == + 1) + j1 += 0; + + ii0 = + (((0 < ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = + (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = + (((0 < + (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / + f1_x) + : 0)) % + 45; + jj1 = (((0 < + (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / + f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + bw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv] + [jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv] + [jj1] + [ii1] + + f4) / + f3; + } + + } else { + fw_refframe = 0; + bw_refframe = 0; + + fw_ref_idx = fw_refframe; + bw_ref_idx = bw_refframe; + + i1 = (img->pix_c_x + ii + ioff) * f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + jj + + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } + } + + if (active_sps_chroma_format_idc == 1) + j1 += 0; + + ii0 = + (((0 < + ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = (((0 < (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x) + : 0)) % + 45; + jj1 = + (((0 < + (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + fw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii1] + + f4) / + f3; + + i1 = (img->pix_c_x + ii + ioff) * f1_x + + h264_dec_mv_array[jf][ifx][0]; + + if (!curr_mb_field) { + j1 = (img->pix_c_y + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx][1]; + } else { + if (mb_nr % 2 == 0) { + j1 = ((img->pix_c_y) / 2 + jj + + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } else { + j1 = ((img->pix_c_y - + img->mb_cr_size_y) / + 2 + + jj + joff) * + f1_y + + h264_dec_mv_array[jf][ifx] + [1]; + } + } + + if (active_sps_chroma_format_idc == 1) + j1 += 0; + + ii0 = + (((0 < + ((i1 / f1_x > img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x)) + ? ((i1 / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : i1 / f1_x) + : 0)) % + 45; + jj0 = (((0 < ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y)) + ? ((j1 / f1_y > max_y_cr) + ? max_y_cr + : j1 / f1_y) + : 0)) % + 45; + ii1 = (((0 < (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x)) + ? (((i1 + f2_x) / f1_x > + img->width_cr - 1) + ? img->width_cr - 1 + : (i1 + f2_x) / f1_x) + : 0)) % + 45; + jj1 = + (((0 < + (((j1 + f2_y) / f1_y > max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y)) + ? (((j1 + f2_y) / f1_y > + max_y_cr) + ? max_y_cr + : (j1 + f2_y) / f1_y) + : 0)) % + 45; + + if1 = (i1 & f2_x); + jf1 = (j1 & f2_y); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + bw_pred = + (if0 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii0] + + if1 * jf0 * + h264_dec_list_imgUV[uv][jj0] + [ii1] + + if0 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii0] + + if1 * jf1 * + h264_dec_list_imgUV[uv][jj1] + [ii1] + + f4) / + f3; + } + + if (img->apply_weights) { + if (((active_pps_weighted_pred_flag && + (img->type == P_SLICE || + img->type == SP_SLICE)) || + (active_pps_weighted_bipred_idc == + 1 && + (img->type == B_SLICE))) && + curr_mb_field) { + fw_ref_idx >>= 1; + bw_ref_idx >>= 1; + } + + if (img->direct_spatial_mv_pred_flag && + direct_pdir == 1) { + img->mpr[ii + ioff][jj + joff] = + (((img->wp_round_chroma) >> + img->chroma_log2_weight_denom) < + 0 + ? 0 + : ((img->wp_round_chroma) >> + img->chroma_log2_weight_denom)) + + 0; + } else if ( + img->direct_spatial_mv_pred_flag && + direct_pdir == 0) { + img->mpr[ii + ioff][jj + joff] = + ((((img->wp_round_chroma) >> + img->chroma_log2_weight_denom)) < + 0 + ? 0 + : (((img->wp_round_chroma) >> + img->chroma_log2_weight_denom))); + } else { + + int alpha_fw = 0; + int alpha_bw = 0; + + img->mpr[ii + ioff][jj + joff] = + (((alpha_fw * fw_pred + + alpha_bw * bw_pred + + (1 + << img->chroma_log2_weight_denom)) >> + (img->chroma_log2_weight_denom + + 1)) < 0 + ? 0 + : ((alpha_fw * fw_pred + + alpha_bw * bw_pred + + (1 + << img->chroma_log2_weight_denom)) >> + (img->chroma_log2_weight_denom + + 1))); + } + } else { + if (img->direct_spatial_mv_pred_flag && + direct_pdir == 1) + img->mpr[ii + ioff][jj + joff] = + bw_pred; + else if ( + img->direct_spatial_mv_pred_flag && + direct_pdir == 0) + img->mpr[ii + ioff][jj + joff] = + fw_pred; + else { + img->mpr[ii + ioff][jj + joff] = + (fw_pred + bw_pred + 1) / 2; + } + } + } + } + } + } + + if (!smb) { + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) { + jj = 0; + __pragma_loopbound(4, 4); + for (; jj < 4; jj++) { + if (!residue_transform_flag) { + h264_dec_dec_picture_imgUV + [uv][(j4 + jj) % 64][(i4 + ii) % 54] = + h264_dec_img_m7[ii][jj]; + } + } + } + } + } + } + + if (smb) { + __pragma_loopbound(2, 2); + for (j = 4; j < 6; j++) { + joff = (j - 4) * 4; + j4 = img->pix_c_y + joff; + __pragma_loopbound(2, 2); + for (i = 0; i < 2; i++) { + ioff = i * 4; + i4 = img->pix_c_x + ioff; + + __pragma_loopbound(4, 4); + for (ii = 0; ii < 4; ii++) + __pragma_loopbound(4, 4); + for (jj = 0; jj < 4; jj++) { + h264_dec_dec_picture_imgUV[uv][(j4 + jj) % + 64][(i4 + ii) % 54] = + h264_dec_img_m7[ii][jj]; + } + } + } + } + } + } +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +h264_dec_main(void) { + h264_dec_decode_one_macroblock(&h264_dec_img); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + h264_dec_init(); + h264_dec_main(); + + return (h264_dec_return()); +} diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.h b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.h new file mode 100644 index 0000000..62b3312 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_dec.h @@ -0,0 +1,30 @@ + +#ifndef __H264DEC_H +#define __H264DEC_H + +typedef enum { + P_SLICE = 0, + B_SLICE, + I_SLICE, + SP_SLICE, + SI_SLICE +} h264_dec_SliceType; + +// image parameters +typedef struct h264_dec_img_par { + int direct_spatial_mv_pred_flag; + int type; + int width_cr; + int pix_c_y; + int pix_c_x; + unsigned short mpr[16][16]; + unsigned int chroma_log2_weight_denom; + int wp_round_chroma; + unsigned int apply_weights; + int num_blk8x8_uv; + int mb_cr_size_x; + int mb_cr_size_y; + +} h264_dec_ImageParameters; + +#endif diff --git a/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_decinput.c b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_decinput.c new file mode 100644 index 0000000..9f36f83 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/generated/modified_sources/inline/h264_decinput.c @@ -0,0 +1,902 @@ + +signed char h264_dec_mv_array[65][65][2] = { + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}, + {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}}}; + +short h264_dec_list_imgUV[2][45][45] = { + {{123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 125, 126, 126, 126, 126, + 126, 126, 126, 125, 123, 122, 122, 122, 122}, + {122, 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 120, 119, + 119, 119, 119, 119, 119, 119, 120, 121, 121}, + {121, 121, 121, 121, 121, 121, 120, 120, 120, 122, 122, 124, + 124, 124, 123, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, + 123, 123, 124, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, + 128, 128, 127, 130, 135, 137, 139, 140, 140, 140, 140, 140, + 140, 141, 142, 143, 143, 143, 143, 143, 143, 143, 142, 142, + 142, 141, 141, 140, 140, 139, 138, 137, 137}, + {136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 123, 123, 123, 123, 123, 123, 123, 123}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, 121, 121, + 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 120, 121, + 121, 121, 121, 121, 121, 121, 121, 120, 120}, + {120, 122, 122, 124, 124, 124, 123, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, + 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 126, 126, 127}, + {127, 127, 128, 128, 128, 128, 127, 130, 135, 137, 139, 140, + 140, 140, 140, 140, 140, 141, 142, 143, 143, 143, 143, 143, + 143, 143, 142, 142, 142, 141, 141, 140, 140, 139, 138, 137, + 137, 136, 136, 135, 135, 135, 134, 133, 133}, + {134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 123, 123, 123, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, + 122, 122, 121, 121, 120, 120, 120, 119, 119, 119, 119, 119, + 119, 119, 120, 121, 121, 121, 121, 121, 121, 121, 121, 120, + 120, 120, 122, 122, 124, 124, 124, 123, 122}, + {122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122}, + {122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, + 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122}, + {122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, + 128, 128, 128, 128, 127, 130, 135, 137, 139}, + {140, 140, 140, 140, 140, 140, 141, 142, 143, 143, 143, 143, + 143, 143, 143, 142, 142, 142, 141, 141, 140, 140, 139, 138, + 137, 137, 136, 136, 135, 135, 135, 134, 133, 133, 134, 134, + 135, 135, 135, 135, 135, 135, 135, 135, 135}, + {135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 124, 124, 124, 124, 124, 124, + 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 124, 124, 124}, + {124, 124, 124, 124, 123, 123, 122, 122, 122, 122, 122, 122, + 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {123, 122, 122, 121, 121, 120, 120, 120, 119, 118, 118, 118, + 118, 118, 118, 119, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 119, 119, 121, 121, 123, 123, 123, 122, 122, 122, 122, + 122, 122, 122, 122, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123}, + {123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122}, + {122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, + 126, 127, 127, 127, 128, 128, 128, 128, 128, 130, 134, 136, + 138, 139, 139, 139, 139, 139, 139, 140, 142}, + {143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 141, 141, + 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, + 133, 133, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 134, 134, 134, 134, 134, 134}, + {134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 124, 124, + 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 124, + 124, 124, 124, 124, 124, 124, 122, 122, 122}, + {122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 123, 122, 122, 121, 121, 120, 120, 119}, + {118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 120, 120, + 120, 120, 120, 120, 119, 119, 119, 121, 121, 123, 123, 123, + 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123}, + {123, 123, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, + 125, 124, 123, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122}, + {122, 122, 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, + 127, 127, 128, 128, 128, 129, 128, 131, 134, 136, 138, 139, + 139, 139, 139, 139, 139, 140, 142, 143, 143}, + {142, 141, 140, 140, 141, 142, 142, 142, 141, 141, 140, 140, + 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 133, 133, + 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 134, 134, 134, 134, 134, 134, 134, 134}, + {134, 134, 134, 134, 134, 134, 134, 134, 125, 125, 125, 125, + 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 125, 124, 124, 124, + 124, 124, 124, 124, 123, 123, 123, 123, 123}, + {123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 123, + 122, 122, 121, 121, 120, 120, 119, 118, 117}, + {117, 117, 117, 117, 117, 118, 119, 119, 119, 119, 119, 119, + 119, 119, 118, 118, 118, 120, 120, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 123, 122, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 122}, + {122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 123, 123, 123, 123, 123, 123}}, + {{123, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 126, 126, 127, 127, 127, 128, 128, 128, 129, 129, 131, + 133, 135, 137, 138, 138, 138, 138, 138, 138, 139, 142, 143, + 143, 142, 140, 139, 139, 140, 141, 142, 142}, + {141, 141, 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, + 135, 134, 133, 133, 134, 134, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134}, + {125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 125, 124, 124, 124, 124, 124, 124, 124, 123, 123, 123, 123, + 123, 123, 123, 123, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 123, 123, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 119, 118, + 117, 117, 117, 117, 117, 117, 118, 119, 119}, + {119, 119, 119, 119, 119, 119, 118, 118, 118, 120, 120, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 122, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, + 123, 123, 124, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, + 128, 129, 129, 131, 133, 135, 137, 138, 138, 138, 138, 138, + 138, 139, 142, 143, 143, 142, 140, 139, 139, 140, 141, 142, + 142, 141, 141, 140, 140, 139, 138, 137, 137}, + {136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 125, 125, 125, 125, 125, 125, 125, 125}, + {126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 125, 124, 124, 124, 124, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 124, 123, 123, 123, + 123, 123, 123, 123, 124, 124, 124, 123, 123}, + {123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, + 124, 124, 124, 124, 124, 124, 124, 122, 121, 121, 120, 120, + 119, 119, 118, 117, 116, 116, 117, 117, 117, 117, 118, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119}, + {119, 120, 120, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, + 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 126, 126, 126, 127}, + {127, 127, 128, 128, 128, 129, 129, 131, 132, 134, 137, 138, + 138, 138, 138, 138, 138, 139, 142, 142, 142, 141, 140, 139, + 139, 140, 141, 141, 141, 141, 141, 140, 140, 139, 138, 137, + 137, 136, 136, 135, 135, 135, 134, 133, 133}, + {134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 134, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, + 123, 121, 121, 122, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 121, + 119, 119, 118, 118, 117, 117, 116, 116, 115, 115, 116, 116, + 117, 117, 118, 119, 119, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 121, 121, 121, 121, 122, 122}, + {122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 122, 122, + 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 122, 122, 123, 123, 124, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 124, 123, 123, 122, 122, 121, 120, 120, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121}, + {121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 125, + 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 129, 129, 130}, + {131, 133, 136, 137, 137, 138, 138, 139, 139, 140, 141, 141, + 141, 140, 140, 139, 139, 139, 140, 140, 140, 140, 140, 140, + 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 134, + 134, 134, 135, 135, 135, 135, 135, 135, 135}, + {135, 135, 135, 135, 134, 133, 132, 132, 133, 133, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 123, 122, 120, 120, 121, 122, 123, 123, 123, + 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124}, + {124, 124, 123, 120, 118, 118, 117, 117, 116, 116, 115, 115, + 114, 114, 115, 116, 117, 117, 118, 119, 119, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 121, 121}, + {121, 121, 122, 122, 122, 123, 124, 124, 124, 124, 123, 123, + 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 123, 123}, + {124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 124, 123, 123, 122, 122, 121, 120, + 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122}, + {122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 122}, + {122, 122, 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, + 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 126, + 126, 127, 127, 127, 128, 128, 128, 128, 128, 128, 129, 129, + 130, 130, 132, 135, 136, 137, 138, 138, 139}, + {139, 139, 140, 140, 140, 139, 139, 138, 138, 138, 139, 139, + 139, 139, 139, 139, 139, 139, 138, 137, 136, 136, 135, 135, + 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 134, 134, + 134, 134, 134, 134, 134, 133, 132, 131, 131}, + {132, 132, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, + 134, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 123, 122, 120, 120, 121}, + {122, 123, 123, 122, 122, 122, 122, 122, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 123, 123, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 120, 118, 117, 117, 116}, + {116, 115, 115, 114, 114, 114, 115, 116, 117, 117, 118, 119, + 120, 120, 120, 120, 121, 121, 121, 120, 120, 120, 120, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, + 121, 121, 121, 122, 122, 122, 123, 124, 124}, + {124, 124, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, + 123, 124, 125, 125, 125, 125, 125, 125, 125}, + {125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 123, 123, + 122, 122, 121, 120, 120, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121}, + {121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 123, 124}, + {124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, 128, 128, + 128, 128, 129, 129, 130, 130, 132, 135, 136, 136, 137, 138, + 139, 139, 139, 140, 140, 140, 139, 139, 138}, + {138, 138, 139, 139, 139, 139, 139, 139, 139, 138, 137, 136, + 135, 135, 134, 134, 133, 133, 133, 133, 134, 134, 134, 134, + 134, 134, 133, 133, 133, 133, 133, 133, 133, 133, 132, 131, + 131, 132, 132, 133, 132, 132, 133, 133, 133}, + {133, 133, 133, 133, 133, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 124, 124, 123, 121, 120, 120, + 121, 122, 122, 122, 122, 122, 122, 122, 122}, + {121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 123, 123, 122, 118, 116, 116, 115, + 115, 114, 114, 114, 114, 114, 115, 116, 117}, + {117, 117, 118, 120, 121, 121, 121, 121, 121, 121, 121, 121, + 120, 120, 120, 121, 121, 121, 122, 122, 121, 121, 121, 122, + 122, 122, 122, 121, 121, 121, 121, 122, 122, 122, 123, 124, + 124, 124, 124, 123, 123, 123, 123, 122, 121}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 123, 123, 124, 124, 124, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125}}}; + +int h264_dec_img_m7[16][16] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; diff --git a/targets/wasm-tacle/sequential/h264_dec/h264_dec.c b/targets/wasm-tacle/sequential/h264_dec/h264_dec.c new file mode 100755 index 0000000..db2b022 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/h264_dec.c @@ -0,0 +1,603 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: h264_dec_ldecode_macroblock.c + + Author: Inge Lille-Langoy et al. + + Function: H.264 decoder + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: h264_dec_ldecode_macroblock.c + + Changes: no functional changes + + License: see copyright.txt + +*/ + + +/* + Include section +*/ + +#include "h264_dec.h" + + +/* + Forward declaration of functions +*/ + +void h264_dec_init (); +int h264_dec_return (); +void h264_dec_decode_one_macroblock( struct h264_dec_img_par *img ); +void h264_dec_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +extern signed char h264_dec_mv_array[ 65 ][ 65 ][ 2 ]; +extern short h264_dec_list_imgUV[ 2 ][ 45 ][ 45 ]; +extern int h264_dec_img_m7[ 16 ][ 16 ]; + +signed char h264_dec_img_mpr[ 7 ][ 7 ]; +signed char h264_dec_dec_picture_imgUV[ 2 ][ 64 ][ 54 ]; +struct h264_dec_img_par h264_dec_img; + + +/* + Initialization- and return-value-related functions +*/ + +int h264_dec_return () +{ + return ( h264_dec_img_mpr[ 0 ][ 0 ] + h264_dec_dec_picture_imgUV[ 0 ][ 0 ][ 0 ] + 128 != + 0 ); +} + +void h264_dec_init () +{ + unsigned int i; + unsigned char *p; + volatile signed char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &h264_dec_mv_array[ 0 ]; + _Pragma( "loopbound min 8450 max 8450" ) + for ( i = 0; i < sizeof( h264_dec_mv_array ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &h264_dec_list_imgUV[ 0 ]; + _Pragma( "loopbound min 4050 max 4050" ) + for ( i = 0; i < sizeof( h264_dec_list_imgUV ); ++i, ++p ) + *p ^= bitmask; + + p = ( unsigned char * ) &h264_dec_img_m7[ 0 ]; + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0; i < sizeof( h264_dec_img_m7 ); ++i, ++p ) + *p ^= bitmask; + + h264_dec_img.mb_cr_size_x = 8; + h264_dec_img.mb_cr_size_y = 8; + h264_dec_img.num_blk8x8_uv = 2; + h264_dec_img.pix_c_x = 256; + h264_dec_img.pix_c_y = 256; + h264_dec_img.width_cr = 352; + h264_dec_img.apply_weights = 0; + h264_dec_img.direct_spatial_mv_pred_flag = 1; + h264_dec_img.type = 1; + h264_dec_img.wp_round_chroma = 0; + h264_dec_img.chroma_log2_weight_denom = 0; +} + + +/* + Algorithm core functions +*/ + +void h264_dec_decode_one_macroblock( struct h264_dec_img_par *img ) +{ + int i = 0, j = 0, ii = 0, jj = 0, i1 = 0, j1 = 0, j4 = 0, i4 = 0; + int uv; + int ioff, joff; + int bw_pred = 0, fw_pred = 0, ifx; + int ii0, jj0, ii1, jj1, if1, jf1, if0, jf0; + int f1_x, f1_y, f2_x, f2_y, f3, f4; + + short fw_refframe = -1, bw_refframe = -1; + int mv_mode, pred_dir, intra_prediction; // = currMB->ref_frame; + short fw_ref_idx = -1, bw_ref_idx = -1; + + int mb_nr = 0; + short dec_picture_ref_idx = 0; + + short active_sps_chroma_format_idc = 1; + short active_pps_weighted_pred_flag = 0; + short active_pps_weighted_bipred_idc = 0; + + int smb = 0; + int max_y_cr = 287; + + int jf; + + int direct_pdir = -1; + + int curr_mb_field = 0; + + int b8, b4; + + int residue_transform_flag = 0; + + if ( 1 ) { + f1_x = 64 / img->mb_cr_size_x; + f2_x = f1_x - 1; + + f1_y = 64 / img->mb_cr_size_y; + f2_y = f1_y - 1; + + f3 = f1_x * f1_y; + f4 = f3 >> 1; + + _Pragma( "loopbound min 2 max 2" ) + for ( uv = 0; uv < 2; uv++ ) { + intra_prediction = 0; + + + _Pragma( "loopbound min 1 max 1" ) + for ( b8 = 0; b8 < ( img->num_blk8x8_uv / 2 ); b8++ ) { + _Pragma( "loopbound min 4 max 4" ) + for ( b4 = 0; b4 < 4; b4++ ) { + joff = 0; + j4 = img->pix_c_y + joff; + ioff = 0; + i4 = img->pix_c_x + ioff; + + mv_mode = 1; + pred_dir = -1; + + if ( !intra_prediction ) { + if ( pred_dir != 2 ) { + + _Pragma( "loopbound min 4 max 4" ) + for ( jj = 0; jj < 4; jj++ ) { + jf = ( ( j4 + jj ) / ( img->mb_cr_size_y / 4 ) ) % 64; + _Pragma( "loopbound min 4 max 4" ) + for ( ii = 0; ii < 4; ii++ ) { + ifx = ( ( i4 + ii ) / ( img->mb_cr_size_x / 4 ) ) % 64; + i1 = ( i4 + ii ) * f1_x + h264_dec_mv_array[ jf ][ ifx ][ 0 ]; + + if ( !curr_mb_field ) + j1 = ( j4 + jj ) * f1_y + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + else { + if ( mb_nr % 2 == 0 ) { + j1 = ( ( img->pix_c_y / 2 ) + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + j1 = ( ( img->pix_c_y - img->mb_cr_size_y ) / 2 + + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } + ++mb_nr; + } + + if ( active_sps_chroma_format_idc == 1 ) + j1 += 0; + + ii0 = ( ( ( 0 < ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) ) ? + ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) : 0 ) ) % 45; + jj0 = ( ( ( 0 < ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) ) ? + ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) : 0 ) ) % 45; + ii1 = ( ( ( 0 < ( + ( ( i1 + f2_x ) / f1_x > img->width_cr - 1 ) + ? img->width_cr - 1 : ( i1 + f2_x ) / f1_x ) ) + ? ( ( ( i1 + f2_x ) / f1_x > img->width_cr - 1 ) + ? img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) : 0 ) ) % 45; + jj1 = ( ( ( 0 < ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) + ? max_y_cr : ( j1 + f2_y ) / f1_y ) ) ? + ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) : 0 ) ) % 45; + + if1 = ( i1 & f2_x ); + jf1 = ( j1 & f2_y ); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + if ( img->apply_weights ) { + } else { + h264_dec_img_mpr[ ii + ioff ][ jj + joff ] + = ( if0 * jf0 * h264_dec_list_imgUV[ uv ][ jj0 ][ ii0 ] + + if1 * jf0 * h264_dec_list_imgUV[ uv ][ jj0 ][ ii1 ] + + if0 * jf1 * h264_dec_list_imgUV[ uv ][ jj1 ][ ii0 ] + + if1 * jf1 * h264_dec_list_imgUV[ uv ][ jj1 ][ ii1 ] + + f4 ) / f3; + } + } + } + } else { + + _Pragma( "loopbound min 4 max 4" ) + for ( jj = 0; jj < 4; jj++ ) { + jf = ( j4 + jj ) / ( img->mb_cr_size_y / 4 ); + _Pragma( "loopbound min 4 max 4" ) + for ( ii = 0; ii < 4; ii++ ) { + ifx = ( i4 + ii ) / ( img->mb_cr_size_x / 4 ); + direct_pdir = 2; + + if ( mv_mode == 0 && img->direct_spatial_mv_pred_flag ) { + if ( dec_picture_ref_idx != -1 ) { + fw_refframe = 0; + fw_ref_idx = fw_refframe; + } + if ( dec_picture_ref_idx != -1 ) { + bw_refframe = 0; + bw_ref_idx = bw_refframe; + } + + if ( dec_picture_ref_idx == -1 ) direct_pdir = 0; + else + if ( dec_picture_ref_idx == -1 ) direct_pdir = 1; + + if ( direct_pdir == 0 || direct_pdir == 2 ) { + i1 = ( img->pix_c_x + ii + ioff ) * f1_x + + h264_dec_mv_array[ jf ][ ifx ][ 0 ]; + + if ( !curr_mb_field ) { + j1 = ( img->pix_c_y + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + if ( mb_nr % 2 == 0 ) { + j1 = ( ( img->pix_c_y ) / 2 + jj + joff ) * + f1_y + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + j1 = ( ( img->pix_c_y - img->mb_cr_size_y ) + / 2 + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } + } + + if ( active_sps_chroma_format_idc == 1 ) + j1 += 0; + + ii0 = ( ( + ( 0 < ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) ) ? + ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) : 0 ) ) % 45; + jj0 = ( ( + ( 0 < ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) ) ? ( ( + j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) : 0 ) + ) % 45; + ii1 = ( ( ( 0 < ( ( ( i1 + f2_x ) / + f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) ) ? + ( ( ( i1 + f2_x ) / f1_x > img->width_cr - 1 ) + ? img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) : 0 ) ) % 45; + jj1 = ( ( ( 0 < ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) ) ? + ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) : 0 ) + ) % 45; + + + if1 = ( i1 & f2_x ); + jf1 = ( j1 & f2_y ); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + fw_pred = ( if0 * jf0 * + h264_dec_list_imgUV[ uv ][ jj0 ][ ii0 ] + + if1 * jf0 * + h264_dec_list_imgUV[ uv ][ jj0 ][ ii1 ] + + if0 * jf1 * + h264_dec_list_imgUV[ uv ][ jj1 ][ ii0 ] + + if1 * jf1 * + h264_dec_list_imgUV[ uv ][ jj1 ][ ii1 ] + + f4 ) / f3; + } + if ( direct_pdir == 1 || direct_pdir == 2 ) { + i1 = ( img->pix_c_x + ii + ioff ) * f1_x + + h264_dec_mv_array[ jf ][ ifx ][ 0 ]; + + if ( !curr_mb_field ) { + j1 = ( img->pix_c_y + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + if ( mb_nr % 2 == 0 ) { + j1 = ( ( img->pix_c_y ) / 2 + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + j1 = ( ( img->pix_c_y - img->mb_cr_size_y ) / 2 + + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } + } + if ( active_sps_chroma_format_idc == 1 ) + j1 += 0; + + ii0 = ( ( ( 0 < ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) ) ? + ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) : 0 ) ) % 45; + jj0 = ( ( ( 0 < ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) ) ? + ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) : 0 ) ) % 45; + ii1 = ( ( ( 0 < ( ( ( i1 + f2_x ) / + f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) ) ? + ( ( ( i1 + f2_x ) / f1_x > img->width_cr - 1 ) + ? img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) : 0 ) ) % 45; + jj1 = ( ( ( 0 < ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) ) ? + ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) : 0 ) ) + % 45; + + if1 = ( i1 & f2_x ); + jf1 = ( j1 & f2_y ); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + bw_pred = ( if0 * jf0 * + h264_dec_list_imgUV[ uv ][ jj0 ][ ii0 ] + + if1 * jf0 * + h264_dec_list_imgUV[ uv ][ jj0 ][ ii1 ] + + if0 * jf1 * + h264_dec_list_imgUV[ uv ][ jj1 ][ ii0 ] + + if1 * jf1 * + h264_dec_list_imgUV[ uv ][ jj1 ][ ii1 ] + + f4 ) / f3; + } + + } else { + fw_refframe = 0; + bw_refframe = 0; + + fw_ref_idx = fw_refframe; + bw_ref_idx = bw_refframe; + + i1 = ( img->pix_c_x + ii + ioff ) * f1_x + + h264_dec_mv_array[ jf ][ ifx ][ 0 ]; + + if ( !curr_mb_field ) { + j1 = ( img->pix_c_y + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + if ( mb_nr % 2 == 0 ) { + j1 = ( ( img->pix_c_y ) / 2 + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + j1 = ( ( img->pix_c_y - img->mb_cr_size_y ) / 2 + + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } + } + + if ( active_sps_chroma_format_idc == 1 ) + j1 += 0; + + ii0 = ( ( ( 0 < ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) ) ? + ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) : 0 ) ) + % 45; + jj0 = ( ( ( 0 < ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) ) ? + ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) : 0 ) ) % 45; + ii1 = ( ( ( 0 < ( ( ( i1 + f2_x ) / + f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) ) ? + ( ( ( i1 + f2_x ) / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) : 0 ) ) % 45; + jj1 = ( ( ( 0 < ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) ) ? + ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : + ( j1 + f2_y ) / f1_y ) : 0 ) ) % 45; + + if1 = ( i1 & f2_x ); + jf1 = ( j1 & f2_y ); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + fw_pred = ( if0 * jf0 * h264_dec_list_imgUV[ uv ][ jj0 ][ ii0 ] + + if1 * jf0 * h264_dec_list_imgUV[ uv ][ jj0 ][ ii1 ] + + if0 * jf1 * h264_dec_list_imgUV[ uv ][ jj1 ][ ii0 ] + + if1 * jf1 * h264_dec_list_imgUV[ uv ][ jj1 ][ ii1 ] + + f4 ) / f3; + + i1 = ( img->pix_c_x + ii + ioff ) * f1_x + + h264_dec_mv_array[ jf ][ ifx ][ 0 ]; + + if ( !curr_mb_field ) { + j1 = ( img->pix_c_y + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + if ( mb_nr % 2 == 0 ) { + j1 = ( ( img->pix_c_y ) / 2 + jj + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } else { + j1 = ( ( img->pix_c_y - img->mb_cr_size_y ) / 2 + jj + + joff ) * f1_y + + h264_dec_mv_array[ jf ][ ifx ][ 1 ]; + } + } + + if ( active_sps_chroma_format_idc == 1 ) + j1 += 0; + + ii0 = ( ( ( 0 < ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) ) ? + ( ( i1 / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : i1 / f1_x ) : 0 ) ) % 45; + jj0 = ( ( ( 0 < ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) ) ? + ( ( j1 / f1_y > max_y_cr ) ? + max_y_cr : j1 / f1_y ) : 0 ) ) % 45; + ii1 = ( ( ( 0 < ( ( ( i1 + f2_x ) / + f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) ) ? + ( ( ( i1 + f2_x ) / f1_x > img->width_cr - 1 ) ? + img->width_cr - 1 : + ( i1 + f2_x ) / f1_x ) : 0 ) ) % 45; + jj1 = ( ( ( 0 < ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) ) ? + ( ( ( j1 + f2_y ) / f1_y > max_y_cr ) ? + max_y_cr : ( j1 + f2_y ) / f1_y ) : 0 ) ) % 45; + + if1 = ( i1 & f2_x ); + jf1 = ( j1 & f2_y ); + if0 = f1_x - if1; + jf0 = f1_y - jf1; + + bw_pred = ( if0 * jf0 * h264_dec_list_imgUV[ uv ][ jj0 ][ ii0 ] + + if1 * jf0 * h264_dec_list_imgUV[ uv ][ jj0 ][ ii1 ] + + if0 * jf1 * h264_dec_list_imgUV[ uv ][ jj1 ][ ii0 ] + + if1 * jf1 * h264_dec_list_imgUV[ uv ][ jj1 ][ ii1 ] + + f4 ) / f3; + } + + if ( img->apply_weights ) { + if ( ( ( active_pps_weighted_pred_flag && + ( img->type == P_SLICE || img->type == SP_SLICE ) ) + || ( active_pps_weighted_bipred_idc == 1 && + ( img->type == B_SLICE ) ) ) + && curr_mb_field ) { + fw_ref_idx >>= 1; + bw_ref_idx >>= 1; + } + + if ( img->direct_spatial_mv_pred_flag + && direct_pdir == 1 ) { + img->mpr[ ii + ioff ][ jj + joff ] = + ( ( ( img->wp_round_chroma ) >> + img->chroma_log2_weight_denom ) < 0 ? 0 : + ( ( img->wp_round_chroma ) >> + img->chroma_log2_weight_denom ) ) + 0; + } else + if ( img->direct_spatial_mv_pred_flag + && direct_pdir == 0 ) { + img->mpr[ ii + ioff ][ jj + joff ] = + ( ( ( ( img->wp_round_chroma ) >> + img->chroma_log2_weight_denom ) ) < 0 ? + 0 : + ( ( ( img->wp_round_chroma ) >> + img->chroma_log2_weight_denom ) ) ) ; + } else { + + int alpha_fw = 0; + int alpha_bw = 0; + + img->mpr[ ii + ioff ][ jj + joff ] = + ( ( ( alpha_fw * fw_pred + alpha_bw * + bw_pred + + ( 1 << img->chroma_log2_weight_denom ) ) >> ( + img->chroma_log2_weight_denom + 1 ) ) < 0 ? + 0 : ( ( alpha_fw * fw_pred + alpha_bw * + bw_pred + + ( 1 << img->chroma_log2_weight_denom ) ) >> + ( img->chroma_log2_weight_denom + 1 ) ) ); + } + } else { + if ( img->direct_spatial_mv_pred_flag + && direct_pdir == 1 ) + img->mpr[ ii + ioff ][ jj + joff ] = bw_pred; + else + if ( img->direct_spatial_mv_pred_flag + && direct_pdir == 0 ) + img->mpr[ ii + ioff ][ jj + joff ] = fw_pred; + else { + img->mpr[ ii + ioff ][ jj + joff ] = ( fw_pred + bw_pred + + + 1 ) / 2; + } + } + } + } + } + } + + if ( !smb ) { + _Pragma( "loopbound min 4 max 4" ) + for ( ii = 0; ii < 4; ii++ ) { + jj = 0; + _Pragma( "loopbound min 4 max 4" ) + for ( ; jj < 4; jj++ ) { + if ( !residue_transform_flag ) { + h264_dec_dec_picture_imgUV[ uv ][ ( j4 + jj ) % 64 ] + [ ( i4 + ii ) % 54 ] + = h264_dec_img_m7[ ii ][ jj ]; + } + } + } + } + } + } + + if ( smb ) { + _Pragma( "loopbound min 2 max 2" ) + for ( j = 4; j < 6; j++ ) { + joff = ( j - 4 ) * 4; + j4 = img->pix_c_y + joff; + _Pragma( "loopbound min 2 max 2" ) + for ( i = 0; i < 2; i++ ) { + ioff = i * 4; + i4 = img->pix_c_x + ioff; + + _Pragma( "loopbound min 4 max 4" ) + for ( ii = 0; ii < 4; ii++ ) + _Pragma( "loopbound min 4 max 4" ) + for ( jj = 0; jj < 4; jj++ ) { + h264_dec_dec_picture_imgUV[ uv ][ ( j4 + jj ) % 64 ] + [ ( i4 + ii ) % 54 ] + = h264_dec_img_m7[ ii ][ jj ]; + } + } + } + } + } + } +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) h264_dec_main( void ) +{ + h264_dec_decode_one_macroblock( &h264_dec_img ); +} + + +int main( void ) +{ + h264_dec_init(); + h264_dec_main(); + + return ( h264_dec_return() ); +} diff --git a/targets/wasm-tacle/sequential/h264_dec/h264_dec.h b/targets/wasm-tacle/sequential/h264_dec/h264_dec.h new file mode 100755 index 0000000..aad86c8 --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/h264_dec.h @@ -0,0 +1,29 @@ +#ifndef __H264DEC_H +#define __H264DEC_H + +typedef enum { + P_SLICE = 0, + B_SLICE, + I_SLICE, + SP_SLICE, + SI_SLICE +} h264_dec_SliceType; + +// image parameters +typedef struct h264_dec_img_par { + int direct_spatial_mv_pred_flag; + int type; + int width_cr; + int pix_c_y; + int pix_c_x; + unsigned short mpr[ 16 ][ 16 ]; + unsigned int chroma_log2_weight_denom; + int wp_round_chroma; + unsigned int apply_weights; + int num_blk8x8_uv; + int mb_cr_size_x; + int mb_cr_size_y; + +} h264_dec_ImageParameters; + +#endif diff --git a/targets/wasm-tacle/sequential/h264_dec/h264_decinput.c b/targets/wasm-tacle/sequential/h264_dec/h264_decinput.c new file mode 100755 index 0000000..fb118dc --- /dev/null +++ b/targets/wasm-tacle/sequential/h264_dec/h264_decinput.c @@ -0,0 +1,801 @@ +signed char h264_dec_mv_array[ 65 ][ 65 ][ 2 ] = { + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + }, + { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, + {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} + } +}; + +short h264_dec_list_imgUV[ 2 ][ 45 ][ 45 ] = {{ + { + 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 125, 126, 126, 126, 126, 126, 126, 126, 125, 123, 122, 122, 122, 122 + }, + { + 122, 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, + 121, 121, 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 120, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 120, 120, 120, 122, 122, 124, 124, 124, 123, + 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, 125 + }, + { + 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, 128, 128, 127, + 130, 135, 137, 139, 140, 140, 140, 140, 140, 140, 141, 142, 143, 143, 143, + 143, 143, 143, 143, 142, 142, 142, 141, 141, 140, 140, 139, 138, 137, 137 + }, + { + 136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 123, 123, 123, 123, 123, 123, 123, 123 + }, + { + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123 + }, + { + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 120, 119, 119, 119, + 119, 119, 119, 119, 120, 121, 121, 121, 121, 121, 121, 121, 121, 120, 120 + }, + { + 120, 122, 122, 124, 124, 124, 123, 122, 122, 122, 122, 122, 122, 122, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, + 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 127 + }, + { + 127, 127, 128, 128, 128, 128, 127, 130, 135, 137, 139, 140, 140, 140, 140, + 140, 140, 141, 142, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 141, + 141, 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 133, 133 + }, + { + 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 123, + 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124 + }, + { + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124 + }, + { + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, 121, + 121, 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 120, 121, 121, 121, + 121, 121, 121, 121, 121, 120, 120, 120, 122, 122, 124, 124, 124, 123, 122 + }, + { + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122 + }, + { + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122 + }, + { + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, + 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 126, 126, 127, 127, 127, 128, 128, 128, 128, 127, 130, 135, 137, 139 + }, + { + 140, 140, 140, 140, 140, 140, 141, 142, 143, 143, 143, 143, 143, 143, 143, + 142, 142, 142, 141, 141, 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, + 135, 134, 133, 133, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135 + }, + { + 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 124, 124 + }, + { + 124, 124, 124, 124, 123, 123, 122, 122, 122, 122, 122, 122, 122, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124 + }, + { + 123, 122, 122, 121, 121, 120, 120, 120, 119, 118, 118, 118, 118, 118, 118, + 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 119, 119, 121, 121, 123, + 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123 + }, + { + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122 + }, + { + 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, + 128, 128, 128, 130, 134, 136, 138, 139, 139, 139, 139, 139, 139, 140, 142 + }, + { + 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 141, 141, 140, 140, 139, + 138, 137, 137, 136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134 + }, + { + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 124, 124, 124, 124, 124, + 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 124, 124, 124, 124, 124, 124, 124, 124, 122, 122, 122 + }, + { + 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, + 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 119 + }, + { + 118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 120, 120, 120, 120, 120, + 120, 119, 119, 119, 121, 121, 123, 123, 123, 122, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123 + }, + { + 123, 123, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 125, 124, 123, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122 + }, + { + 122, 122, 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, 128, 129, + 128, 131, 134, 136, 138, 139, 139, 139, 139, 139, 139, 140, 142, 143, 143 + }, + { + 142, 141, 140, 140, 141, 142, 142, 142, 141, 141, 140, 140, 139, 138, 137, + 137, 136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134 + }, + { + 134, 134, 134, 134, 134, 134, 134, 134, 125, 125, 125, 125, 125, 125, 125, + 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 125, 124, 124, 124, 124, 124, 124, 124, 123, 123, 123, 123, 123 + }, + { + 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, + 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, + 124, 124, 124, 124, 124, 123, 122, 122, 121, 121, 120, 120, 119, 118, 117 + }, + { + 117, 117, 117, 117, 117, 118, 119, 119, 119, 119, 119, 119, 119, 119, 118, + 118, 118, 120, 120, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124 + }, + { + 124, 124, 124, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122 + }, + { + 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123 + } + }, + { { + 123, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, + 127, 127, 127, 128, 128, 128, 129, 129, 131, 133, 135, 137, 138, 138, 138, + 138, 138, 138, 139, 142, 143, 143, 142, 140, 139, 139, 140, 141, 142, 142 + }, + { + 141, 141, 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 133, + 133, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134 + }, + { + 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 125, 124, 124, 124, 124, 124, + 124, 124, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124 + }, + { + 124, 124, 124, 124, 124, 124, 123, 123, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 122, + 121, 121, 120, 120, 119, 118, 117, 117, 117, 117, 117, 117, 118, 119, 119 + }, + { + 119, 119, 119, 119, 119, 119, 118, 118, 118, 120, 120, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 122, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 123, 123, 123, 123, 123, 123, 123, 124, 125, 125, 125, 125, 125, 125 + }, + { + 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, 128, 129, 129, + 131, 133, 135, 137, 138, 138, 138, 138, 138, 138, 139, 142, 143, 143, 142, + 140, 139, 139, 140, 141, 142, 142, 141, 141, 140, 140, 139, 138, 137, 137 + }, + { + 136, 136, 135, 135, 135, 134, 133, 133, 134, 134, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 125, 125, 125, 125, 125, 125, 125, 125 + }, + { + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 125, 124, 124, 124, 124, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 124, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 123, 123 + }, + { + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, + 124, 124, 124, 124, 122, 121, 121, 120, 120, 119, 119, 118, 117, 116, 116, + 117, 117, 117, 117, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119 + }, + { + 119, 120, 120, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 123, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, + 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 127 + }, + { + 127, 127, 128, 128, 128, 129, 129, 131, 132, 134, 137, 138, 138, 138, 138, + 138, 138, 139, 142, 142, 142, 141, 140, 139, 139, 140, 141, 141, 141, 141, + 141, 140, 140, 139, 138, 137, 137, 136, 136, 135, 135, 135, 134, 133, 133 + }, + { + 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 133, + 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125 + }, + { + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, 123, 121, 121, + 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 122, 122, 122, 122, + 122, 122, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124 + }, + { + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 121, 119, 119, 118, + 118, 117, 117, 116, 116, 115, 115, 116, 116, 117, 117, 118, 119, 119, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122 + }, + { + 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 122, 122, 122, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 122, 122, 123, 123, 124, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 123, 123, 122, 122, + 121, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, + 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, + 125, 126, 126, 127, 127, 127, 128, 128, 128, 128, 128, 128, 129, 129, 130 + }, + { + 131, 133, 136, 137, 137, 138, 138, 139, 139, 140, 141, 141, 141, 140, 140, + 139, 139, 139, 140, 140, 140, 140, 140, 140, 140, 139, 138, 137, 137, 136, + 136, 135, 135, 135, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135 + }, + { + 135, 135, 135, 135, 134, 133, 132, 132, 133, 133, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125 + }, + { + 125, 125, 125, 123, 122, 120, 120, 121, 122, 123, 123, 123, 123, 123, 123, + 123, 122, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 123, 123, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124 + }, + { + 124, 124, 123, 120, 118, 118, 117, 117, 116, 116, 115, 115, 114, 114, 115, + 116, 117, 117, 118, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121 + }, + { + 121, 121, 122, 122, 122, 123, 124, 124, 124, 124, 123, 123, 123, 123, 122, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, 123 + }, + { + 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 124, 123, 123, 122, 122, 121, 120, 120, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122 + }, + { + 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122 + }, + { + 122, 122, 122, 122, 122, 122, 123, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, 127, 128, 128, + 128, 128, 128, 128, 129, 129, 130, 130, 132, 135, 136, 137, 138, 138, 139 + }, + { + 139, 139, 140, 140, 140, 139, 139, 138, 138, 138, 139, 139, 139, 139, 139, + 139, 139, 139, 138, 137, 136, 136, 135, 135, 134, 134, 134, 134, 134, 134, + 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 133, 132, 131, 131 + }, + { + 132, 132, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, 122, 120, 120, 121 + }, + { + 122, 123, 123, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, + 121, 122, 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 120, 118, 117, 117, 116 + }, + { + 116, 115, 115, 114, 114, 114, 115, 116, 117, 117, 118, 119, 120, 120, 120, + 120, 121, 121, 121, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 121, 121, 121, 121, 122, 122, 122, 123, 124, 124 + }, + { + 124, 124, 123, 123, 123, 123, 122, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 123, 123, 124, 125, 125, 125, 125, 125, 125, 125 + }, + { + 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 123, 123, 122, 122, 121, + 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121 + }, + { + 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 123, 124 + }, + { + 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, + 126, 126, 127, 127, 127, 128, 128, 128, 128, 128, 128, 129, 129, 130, 130, + 132, 135, 136, 136, 137, 138, 139, 139, 139, 140, 140, 140, 139, 139, 138 + }, + { + 138, 138, 139, 139, 139, 139, 139, 139, 139, 138, 137, 136, 135, 135, 134, + 134, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 133, 133, 133, 133, + 133, 133, 133, 133, 132, 131, 131, 132, 132, 133, 132, 132, 133, 133, 133 + }, + { + 133, 133, 133, 133, 133, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 124, 124, 123, 121, 120, 120, 121, 122, 122, 122, 122, 122, 122, 122, 122 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 123, 123, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 123, + 123, 122, 118, 116, 116, 115, 115, 114, 114, 114, 114, 114, 115, 116, 117 + }, + { + 117, 117, 118, 120, 121, 121, 121, 121, 121, 121, 121, 121, 120, 120, 120, + 121, 121, 121, 122, 122, 121, 121, 121, 122, 122, 122, 122, 121, 121, 121, + 121, 122, 122, 122, 123, 124, 124, 124, 124, 123, 123, 123, 123, 122, 121 + }, + { + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125 + } + } +}; + +int h264_dec_img_m7[ 16 ][ 16 ] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +}; diff --git a/targets/wasm-tacle/sequential/huff_enc/CMakeLists.txt b/targets/wasm-tacle/sequential/huff_enc/CMakeLists.txt new file mode 100644 index 0000000..3db108b --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(huff_enc) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/huff_enc.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/huff_enc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/huff_enc/ChangeLog.txt b/targets/wasm-tacle/sequential/huff_enc/ChangeLog.txt new file mode 100755 index 0000000..020dc4f --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/ChangeLog.txt @@ -0,0 +1,27 @@ +File: huff_enc.c +Original provenience: David Bourgin (David.Bourgin@ufrima.imag.fr) + +2017-04-18: +- Annotated huff_enc_main as entry-point for timing analysis + +2016-03-24: +- Replaced dynamic memory allocation by a fixed array with 514 entries +- Replaced memset() with loops +- Added source code for a special qsort() implementation without + function pointer +- Replaced file I/O by reading and writing to char arrays +- Added huff_dec_main(), huff_dec_init() and huff_dec_return() +- Added huff_dec_ prefix to all functions, types and global variables +- Changed function arguments to ANSI style +- Replaced macro definitions +- Added forward declarations of all functions +- Added generic TACLeBench header replacing previous header +- Included license from compress.txt +- Applied code formatting with astyle + +2016-05-24: +- Changed type of j to unsigned to avoid warning +- Removed static declarations + +2016-05-25: +- Precise types to avoid gcc++ warnings diff --git a/targets/wasm-tacle/sequential/huff_enc/compress.txt b/targets/wasm-tacle/sequential/huff_enc/compress.txt new file mode 100755 index 0000000..5966bcf --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/compress.txt @@ -0,0 +1,1107 @@ ++===========================================================+ +| Introduction to the losslessy compression schemes | +| Description of the codec source codes | ++-----------------------------------------------------------+ +| From David Bourgin (E-mail: david.bourgin@ufrima.imag.fr) | +| Date: 22/9/94 | ++===========================================================+ + + ------ BE CARE ------ +This file (compress.txt) is copyrighted. (c) David Bourgin - 1994 +Permission to use this documentation for any purpose other than +its incorporation into a commercial product is hereby granted without fee. +Permission to copy and distribute this documentation only for non-commercial use +is also granted without fee, provided, however, that the above copyright notice +appears in all copies, that both that copyright notice and this permission notice appear in supporting documentation. The author makes no representations about +the suitability of this documentation for any purpose. It is provided "as is" +without express or implied warranty. + +The source codes you obtain with this file are *NOT* covered by the same +copyright, because you can include them for both commercial and non-commercial +use. See below for more infos. + +The source code files (codrl1.c, dcodrl1.c, codrle2.c, dcodrle2.c, codrle3.c, +dcodrle3.c, codrle4.c, dcodrle4.c, codhuff.c, dcodhuff.c) are copyrighted. +They have been uploaded on ftp in turing.imag.fr (129.88.31.7):/pub/compression +on 22/5/94 and have been modified on 22/9/94. +(c) David Bourgin - 1994 +The source codes I provide have no buggs (!) but being that I make them +available for free I have some notes to make. They can change at any time +without notice. I assume no responsability or liability for any errors or +inaccurracies, make no warranty of any kind (express, implied or statutory) +with respect to this publication and expressly disclaim any and all warranties +of merchantability, fitness for particular purposes. Of course, if you have +some problems to use the information presented here, I will try to help you if +I can. + +If you include the source codes in your application, here are the conditions: +- You have to put my name in the header of your source file (not in the +excutable program if you don't want) (this item is a must) +- I would like to see your resulting application, if possible (this item is not +a must, because some applications must remain secret) +- Whenever you gain money with your application, I would like to receive a very +little part in order to be encouraged to update my source codes and to develop +new schemes (this item is not a must) + --------------------- + +There are several means to compress data. Here, we are only going to deal with +the losslessy schemes. These schemes are also called non-destructive because +you always recover the initial data you had, and this, as soon as you need them. +With losslessy schemes, you won't never lose any informations (except perhaps +when you store or transmit your data but this is another problem...). + +In this introduction, we are going to see: +- The RLE scheme (with different possible algorithms) +- The Huffman schemes (dynamical scheme) +- And the LZW scheme + +For the novice, a compresser is a program able to read several data (e.g. bytes) +in input and to write several data in output. The data you obtain from the +output (also called compressed data) will - of course - take less space than +the the input data. This is true in most of cases, if the compresser works +and if the type of the data is correct to be compressed with the given scheme. +The codec (coder-decoder) enables you to save space on your hard disk and/or +to save the communication costs because you always store/transmit the compressed +data. You'll use the decompresser as soon as you need to recover your initial +useful data. Note that the compressed data are useless if you have not +the decoder... + +You are doubtless asking "How can I reduce the data size without losing some +informations?". It's easy to answer to this question. I'll only take an example. +I'm sure you have heard about the morse. This system established in the 19th +century use a scheme very close to the huffman one. In the morse you encode +the letters to transmit with two kinds of signs. If you encode these two sign +possibilities in one bit, the symbol 'e' is transmitted in a single bit and +the symbols 'y' and 'z' need four bits. Look at the symbols in the text you are +reading, you'll fast understand the compression ratio... + +Important: The source codes associated to the algorithms I present are +completely adaptative on what you need to compress. They all use basical +macros on the top of the file. Usually the macros to change are: + +- beginning_of_data +- end_of_data +- read_byte +- read_block +- write_byte +- write_block + +These allow the programmer to modify only a little part of the header +of the source codes in order to compress as well memory as files. + +beginning_of_data(): Macro used to set the program so that the next read_byte() +call will read the first byte to compress. +end_of_data(): Returns a boolean to know whether there is no more bytes to read +from the input stream. Return 0 if there is no more byte to compress, another +non-zero value otherwise. +read_byte(): Returns a byte read from the input stream if available. +write_byte(x): Writes the byte 'x' to the output stream. +read_block(...) and write_block(...): Same use as read_byte and write_byte(x) +but these macros work on blocks of bytes and not only on a single byte. + +If you want to compress *from* the memory, before entering in a xxxcoding +procedure ('xxx' is the actual extension to replace with a given codec), you +have to add a pointer set up to the beginning of the zone to compress. Note +that the following pointer 'source_memory_base' is not to add, it is just given +here to specify a name to the address of the memory zone you are going to +encode or decode. That is the same about source_memory_end which can be either +a pointer to create or an existing pointer. + +unsigned char *source_memory_base, /* Base of the source memory */ + *source_memory_end, /* Last address to read. + source_memory_end=source_memory_base+source_zone_length-1 */ + *source_ptr; /* Used in the xxxcoding procedure */ +void pre_start() +{ source_ptr=source_memory_base; + xxxcoding(); +} + +end_of_data() and read_byte() are also to modify to compress *from* memory: + +#define end_of_data() (source_ptr>source_memory_end) +#define read_byte() (*(source_ptr++)) + +If you want to compress *to* memory, before entering in a xxxcoding procedure +('xxx' is the actual extension to replace with a given codec), you have to add +a pointer. Note that the pointer 'dest_memory_base' is not to add, it is just +given there to specify the address of the destination memory zone you are +going to encode or decode. + +unsigned char *dest_memory_base, /* Base of the destination memory */ + *dest_ptr; /* Used in the xxxcoding procedure */ +void pre_start() +{ dest_ptr=dest_memory_base; + xxxcoding(); +} + +Of course, you can combine both from and to memory in the pre_start() procedure. +The files dest_file and source_file handled in the main() function are +to remove... + +void pre_start() +{ source_ptr=source_memory_base; + dest_ptr=dest_memory_base; + xxxcoding(); +} + +In fact, to write to memory, the problem is in the write_byte(x) procedure. +This problem exists because your destination zone can either be a static +zone or a dynamically allocated zone. In the two cases, you have to check +if there is no overflow, especially if the coder is not efficient and must +produce more bytes than you reserved in memory. + +In the first case, with a *static* zone, write_byte(x) macro should look like +that: + +unsigned long int dest_zone_length, + current_size; + +#define write_byte(x) { if (current_size==dest_zone_length) \ + exit(1); \ + dest_ptr[current_size++]=(unsigned char)(x); \ + } + +In the static version, the pre_start() procedure is to modify as following: + +void pre_start() +{ source_ptr=source_memory_base; + dest_ptr=dest_memory_base; + dest_zone_length=...; /* Set up to the actual destination zone length */ + current_size=0; /* Number of written bytes */ + xxxcoding(); +} +Otherwise, dest_ptr is a zone created by the malloc instruction and you can try +to resize the allocated zone with the realloc instruction. Note that I increment +the zone one kilo-bytes by one kylo-bytes. You have to add two other variables: + +unsigned long int dest_zone_length, + current_size; + +#define write_byte(x) { if (current_size==dest_zone_length) \ + { dest_zone_length += 1024; \ + if ((dest_ptr=(unsigned char *)realloc(dest_ptr,dest_zone_length*sizeof(unsigned char)))==NULL) \ + exit(1); /* You can't compress in memory \ + => I exit but *you* can make a routine to swap on disk */ \ + } \ + dest_ptr[current_size++]=(unsigned char)(x); \ + } + +With the dynamically allocated version, change the pre_start() routine as following: + +void pre_start() +{ source_ptr=source_memory_base; + dest_ptr=dest_memory_base; + dest_zone_length=1024; + if ((dest_ptr=(unsigned char *)malloc(dest_zone_length*sizeof(unsigned char)))==NULL) + exit(1); /* You need at least 1 kb in the dynamical memory ! */ + current_size=0; /* Number of written bytes */ + xxxcoding(); + /* Handle the bytes in dest_ptr but don't forget to free these bytes with: + free(dest_ptr); + */ +} + +The previously given macros work as: + +void demo() /* The file opening, closing and variables + must be set up by the calling procedure */ +{ unsigned char byte; + /* And not 'char byte' (!) */ + while (!end_of_data()) + { byte=read_byte(); + printf("Byte read=%c\n",byte); + } +} + +You must not change the rest of the program unless you're really sure and +really need to do it! + ++==========================================================+ +| The RLE encoding | ++==========================================================+ + +RLE is an acronym that stands for Run Length Encoding. You may encounter it +as an other acronym: RLC, Run Length Coding. + +The idea in this scheme is to recode your data with regard to the repetition +frames. A frame is one or more bytes that occurr one or several times. + +There are several means to encode occurrences. So, you'll have several codecs. +For example, you may have a sequence such as: +0,0,0,0,0,0,255,255,255,2,3,4,2,3,4,5,8,11 + +Some codecs will only deal with the repetitions of '0' and '255' but some other +will deal with the repetitions of '0', '255', and '2,3,4'. + +You have to keep in your mind something important based on this example. A codec +won't work on all the data you will try to compress. So, in case of non +existence of sequence repetitions, the codecs based on RLE schemes must not +display a message to say: "Bye bye". Actually, they will try to encode these +non repeted data with a value that says "Sorry, I only make a copy of the inital +input". Of course, a copy of the input data with an header in front of this copy +will make a biggest output data but if you consider the whole data to compress, +the encoding of repeated frames will take less space than the encoding +of non-repeated frames. + +All of the algorithms with the name of RLE have the following look with three +or four values: +- Value saying if there's a repetition +- Value saying how many repetitions (or non repetition) +- Value of the length of the frame (useless if you just encode frame +with one byte as maximum length) +- Value of the frame to repeat (or not) + +I gave four algorithms to explain what I say. + +*** First RLE scheme *** + +The first scheme is the simpliest I know, and looks like the one used in MAC +system (MacPackBit) and some image file formats such as Targa, PCX, TIFF, ... + +Here, all compressed blocks begin with a byte, named header, which description +is: + +Bits 7 6 5 4 3 2 1 0 +Header X X X X X X X X + +Bits 7: Compression status (1=Compression applied) + 0 to 6: Number of bytes to handle + +So, if the bit 7 is set up to 0, the 0 to 6 bits give the number of bytes +that follow (minus 1, to gain more over compress) and that were not compressed +(native bytes). If the bit 7 is set up to 1, the same 0 to 6 bits give +the number of repetition (minus 2) of the following byte. + +As you see, this method only handle frame with one byte. + +Additional note: You have 'minus 1' for non-repeated frames because you must +have at least one byte to compress and 'minus 2' for repeated frames because the +repetition must be 2, at least. + +Compression scheme: + + First byte=Next + /\ + / \ +Count the byte Count the occurrence of NON identical +occurrences bytes (maximum 128 times) +(maximum 129 times) and store them in an array + | | + | | + 1 bit '1' 1 bit '0' ++ 7 bits giving + 7 bits giving + the number (-2) the number (-1) + of repetitions of non repetition ++ repeated byte + n non repeated bytes + | | + 1xxxxxxx,yyyyyyyy 0xxxxxxx,n bytes +[-----------------] [----------------] + +Example: + +Sequence of bytes to encode | Coded values | Differences with compression + | | (unit: byte) +------------------------------------------------------------------------- + 255,15, | 1,255,15, | -1 + 255,255, | 128,255, | 0 + 15,15, | 128,15, | 0 + 255,255,255, | 129,255, | +1 + 15,15,15, | 129,15, | +1 + 255,255,255,255, | 130,255, | +2 + 15,15,15,15 | 130,15 | +2 + +See codecs source codes: codrle1.c and dcodrle1.c + +*** Second RLE scheme *** + +In the second scheme of RLE compression you look for the less frequent byte +in the source to compress and use it as an header for all compressed block. + +In the best cases, the occurrence of this byte is zero in the data to compress. + +Two possible schemes, firstly with handling frames with only one byte, +secondly with handling frames with one byte *and* more. The first case is +the subject of this current compression scheme, the second is the subject +of next compression scheme. + +For the frame of one byte, header byte is written in front of all repetition +with at least 4 bytes. It is then followed by the repetition number minus 1 and +the repeated byte. +Header byte, Occurrence number-1, repeated byte + +If a byte don't repeat more than tree times, the three bytes are written without +changes in the destination stream (no header nor length, nor repetition in front +or after theses bytes). + +An exception: If the header byte appears in the source one, two, three and up +times, it'll be respectively encoded as following: +- Header byte, 0 +- Header byte, 1 +- Header byte, 2 +- Header byte, Occurrence number-1, Header byte + +Example, let's take the previous example. A non frequent byte is zero-ASCII +because it never appears. + +Sequence of bytes to encode | Coded values | Differences with compression + | | (unit: byte) +------------------------------------------------------------------------- + 255,15, | 255,15, | -1 + 255,255, | 255,255, | 0 + 15,15, | 15,15, | 0 + 255,255,255, | 255,255,255, | 0 + 15,15,15, | 15,15,15, | 0 + 255,255,255,255, | 0,3,255, | -1 + 15,15,15,15 | 0,3,15 | -1 + +If the header would appear, we would see: + +Sequence of bytes to encode | Coded values | Differences with compression + | | (unit: byte) +------------------------------------------------------------------------- + 0, | 0,0, | +1 + 255, | 255, | 0 + 0,0, | 0,1, | 0 + 15, | 15, | 0 + 0,0,0, | 0,2, | -1 + 255, | 255, | 0 + 0,0,0,0 | 0,3,0 | -1 + +See codecs source codes: codrle2.c and dcodrle2.c + +*** Third RLE scheme *** + +It's the same idea as the second scheme but we can encode frames with +more than one byte. So we have three cases: + +- If it was the header byte, whatever is its occurrence, you encode it with: +Header byte,0,number of occurrence-1 +- For frames which (repetition-1)*length>3, encode it as: +Header byte, Number of frame repetition-1, frame length-1,bytes of frame +- If no previous cases were detected, you write them as originally (no header, +nor length, nor repetition in front or after theses bytes). + +Example based on the previous examples: + +Sequence of bytes to encode | Coded values | Differences with compression + | | (unit: byte) +----------------------------------------------------------------------------- + 255,15, | 255,15, | 0 + 255,255, | 255,255, | 0 + 15,15, | 15,15, | 0 + 255,255,255, | 255,255,255, | 0 + 15,15,15, | 15,15,15, | 0 + 255,255,255,255, | 255,255,255,255, | 0 + 15,15,15,15, | 15,15,15,15, | 0 + 16,17,18,16,17,18, |16,17,18,16,17,18,| 0 + 255,255,255,255,255, | 0,4,0,255, | -1 + 15,15,15,15,15, | 0,4,0,15, | -1 + 16,17,18,16,17,18,16,17,18,| 0,2,2,16,17,18, | -3 + 16,17,18,19,16,17,18,19 |0,1,3,16,17,18,19 | -1 + +If the header (value 0) would be met, we would see: + +Sequence of bytes to encode | Coded values | Differences with compression + | | (unit: byte) +-------------------------------------------------------------------------- + 0, | 0,0,0, | +2 + 255, | 255, | 0 + 0,0, | 0,0,1, | +1 + 15, | 15, | 0 + 0,0,0, | 0,0,2, | 0 + 255, | 255, | 0 + 0,0,0,0 | 0,0,3 | -1 + +See codecs source codes: codrle3.c and dcodrle3.c + +*** Fourth RLE scheme *** + +This last RLE algorithm better handles repetitions of any kind (one byte +and more) and non repetitions, including few non repetitions, and does not +read the source by twice as RLE type 3. + +Compression scheme is: + + First byte=Next byte? + /\ + Yes / \ No + / \ + 1 bit '0' 1 bit '1' + / \ + / \ + Count the Motif of several + occurrences repeated byte? + of 1 repeated ( 65 bytes repeated + byte (maximum 257 times maxi) + 16449 times) /\ + /\ / \ + / \ / \ + / \ / \ + / \ / \ + 1 bit '0' 1 bit '1' 1 bit '0' 1 bit '1' ++ 6 bits + 14 bits + 6 bits of | +giving the giving the the length Number of non repetition +length (-2) length (-66) of the motif (maximum 8224) +of the of the + 8 bits of /\ +repeated byte repeated byte the number (-2) < 33 / \ > 32 ++ repeated byte + repeated byte of repetition / \ + | | + bytes of the 1 bit '0' 1 bit '1' + | | motif + 5 bits of + 13 bits + | | | the numer (-1) of the + | | | of non number (-33) + | | | repetition of repetition + | | | + non + non + | | | repeated repeated + | | | bytes bytes + | | | | | + | | | | 111xxxxx,xxxxxxxx,n bytes + | | | | [-------------------------] + | | | | + | | | 110xxxxx,n bytes + | | | [----------------] + | | | + | | 10xxxxxx,yyyyyyyy,n bytes + | | [-------------------------] + | | + | 01xxxxxx,xxxxxxxx,1 byte + | [------------------------] + | + 00xxxxxx,1 byte +[---------------] + +Example, same as previously: + +Sequence of bytes to encode | Coded values | Differences with compression + | | (unit: byte) +-------------------------------------------------------------------------- + 255,15 | 11000001b,255,15, | +1 + 255,255 | 00000000b,255, | 0 + 15,15 | 00000000b,15, | 0 + 255,255,255 | 00000001b,255, | -1 + 15,15,15 | 00000001b,15, | -1 + 255,255,255,255 | 00000010b,255, | -2 + 15,15,15,15 | 00000010b,15, | -2 + 16,17,18,16,17,18 |10000001b,0,16,17,18,| -1 + 255,255,255,255,255 | 00000011b,255, | -3 + 15,15,15,15,15 | 00000011b,15, | -3 + 16,17,18,16,17,18,16,17,18 | 10000001b,16,17,18, | -4 + 16,17,18,19,16,17,18,19 |10000010b,16,17,18,19| -2 + ++==========================================================+ +| The Huffman encoding | ++==========================================================+ + +This method comes from the searcher who established the algorithm in 1952. +This method allows both a dynamic and static statistic schemes. A statistic +scheme works on the data occurrences. It is not as with RLE where you had +a consideration of the current occurrence of a frame but rather a consideration +of the global occurrences of each data in the input stream. In this last case, +frames can be any kinds of sequences you want. On the other hand, Huffman +static encoding appears in some compressers such as ARJ on PCs. This enforces +the encoder to consider every statistic as the same for all the data you have. +Of course, the results are not as good as if it were a dynamic encoding. +The static encoding is faster than the dynamic encoding but the dynamic encoding +will be adapted to the statistic of the bytes of the input stream and will +of course become more efficient by producing shortest output. + +The main idea in Huffman encoding is to re-code every byte with regard to its +occurrence. The more frequent bytes in the data to compress will be encoded with +less than 8 bits and the others could need 8 bits see even more to be encoded. +You immediately see that the codes associated to the different bytes won't have +identical size. The Huffman method will actually require that the binary codes +have not a fixed size. We speak then about variable length codes. + +The dynamical Huffman scheme needs the binary trees for the encoding. This +enables you to obtain the best codes, adapted to the source data. +The demonstration won't be given there. To help the neophyt, I will just explain +what is a binary tree. + +A binary tree is special fashion to represent the data. A binary tree is +a structure with an associated value with two pointers. The term of binary has +been given because of the presence of two pointers. Because of some conventions, +one of the pointer is called left pointer and the second pointer is called right +pointer. Here is a visual representation of a binary tree. + + Value + / \ + / \ + Value Value + / \ / \ +... ... ... ... + +One problem with a binary encoding is a prefix problem. A prefix is the first +part of the representation of a value, e.g. "h" and "he" are prefixes of "hello" +but not "el". To understand the problem, let's code the letters "A", "B", "C", +"D", and "E" respectively as 00b, 01b, 10b, 11b, and 100b. When you read +the binary sequence 00100100b, you are unable to say if this comes from "ACBA" +or "AEE". To avoid such situations, the codes must have a prefix property. +And the letter "E" mustn't begin with the sequence of an other code. With "A", +"B", "C", "D", and "E" respectively affected with 1b, 01b, 001b, 0001b, and +0000b, the sequence 1001011b will only be decoded as "ACBA". + + 1 0 +<- /\ -> + / \ + "A" /\ + "B" \ + /\ + "C" \ + /\ + "D" "E" + +As you see, with this tree, an encoding will have the prefix property +if the bytes are at the end of each "branch" and you have no byte at the "node". +You also see that if you try to reach a character by the right pointer you add +a bit set to 0 and by the left pointer, you add a bit set to 1 to the current +code. The previous *bad* encoding provide the following bad tree: + + /\ + / \ + / \ + /\ /\ + / \ "B" "A" + / \ +"D" "C"\ + / \ + "E" + +You see here that the coder shouldn't put the "C" at a node... + +As you see, the largest binary code are those with the longest distance +from the top of the tree. Finally, the more frequent bytes will be the highest +in the tree in order you have the shortest encoding and the less frequent bytes +will be the lowest in the tree. + +From an algorithmic point of view, you make a list of each byte you encountered +in the stream to compress. This list will always be sorted. The zero-occurrence +bytes are removed from this list. You take the two bytes with the smallest +occurrences in the list. Whenever two bytes have the same "weight", you take two +of them regardless to their ASCII value. You join them in a node. This node will +have a fictive byte value (256 will be a good one!) and its weight will be +the sum of the two joined bytes. You replace then the two joined bytes with +the fictive byte. And you continue so until you have one byte (fictive or not) +in the list. Of course, this process will produce the shortest codes if the list +remains sorted. I will not explain with arcana hard maths why the result +is a set of the shortest bytes... + +Important: I use as convention that the right sub-trees have a weight greater +or equal to the weight of the left sub-trees. + +Example: Let's take a file to compress where we notice the following +occurrences: + +Listed bytes | Frequences (Weight) +---------------------------------- + 0 | 338 + 255 | 300 + 31 | 280 + 77 | 24 + 115 | 21 + 83 | 20 + 222 | 5 + +We will begin by joining the bytes 83 and 222. This will produce a fictive node +1 with a weight of 20+5=25. + +(Fictive 1,25) + /\ + / \ +(222,5) (83,20) + +Listed bytes | Frequences (Weight) +---------------------------------- + 0 | 338 + 255 | 300 + 31 | 280 + Fictive 1 | 25 + 77 | 24 + 115 | 21 + +Note that the list is sorted... The smallest values in the frequences are 21 and +24. That is why we will take the bytes 77 and 115 to build the fictive node 2. + +(Fictive 2,45) + /\ + / \ +(115,21) (77,25) + +Listed bytes | Frequences (Weight) +---------------------------------- + 0 | 338 + 255 | 300 + 31 | 280 + Fictive 2 | 45 + Fictive 1 | 25 + +The nodes with smallest weights are the fictive 1 and 2 nodes. These are joined +to build the fictive node 3 whose weight is 40+25=70. + + (Fictive 3,70) + / \ + / \ + / \ + /\ / \ + / \ / \ +(222,5) (83,20) (115,21) (77,25) + +Listed bytes | Frequences (Weight) +---------------------------------- + 0 | 338 + 255 | 300 + 31 | 280 + Fictive 3 | 70 + +The fictive node 3 is linked to the byte 31. Total weight: 280+70=350. + + (Fictive 4,350) + / \ + / \ + / \ + / \ (31,280) + / \ + / \ + /\ / \ + / \ / \ +(222,5) (83,20) (115,21) (77,25) + +Listed bytes | Frequences (Weight) +---------------------------------- + Fictive 4 | 350 + 0 | 338 + 255 | 300 + +As you see, being that we sort the list, the fictive node 4 has become the first +of the list. We join the bytes 0 and 255 in a same fictive node, the number 5 +whose weight is 338+300=638. + +(Fictive 5,638) + /\ + / \ +(255,300) (0,338) + +Listed bytes | Frequences (Weight) +---------------------------------- + Fictive 5 | 638 + Fictive 4 | 350 + +The fictive nodes 4 and 5 are finally joined. Final weight: 638+350=998 bytes. +It is actually the total byte number in the initial file: 338+300+24+21+20+5. + + (Tree,998) + 1 / \ 0 + <- / \ -> + / \ + / \ + / \ + / \ / \ + / \ / \ + / \ / \ + / \ (31,280) (255,300) (0,338) + / \ + / \ + /\ / \ + / \ / \ +(222,5) (83,20) (115,21) (77,25) + +Bytes | Huffman codes | Frequences | Binary length*Frequence +------------------------------------------------------------ + 0 | 00b | 338 | 676 + 255 | 01b | 300 | 600 + 31 | 10b | 280 | 560 + 77 | 1101b | 24 | 96 + 115 | 1100b | 21 | 84 + 83 | 1110b | 20 | 80 + 222 | 1111b | 5 | 20 + +Results: Original file size: (338+300+280+24+21+20+5)*8=7904 bits (=998 bytes) +versus 676+600+560+96+84+80+20=2116 bits, i.e. 2116/8=265 bytes. + +Now you know how to code an input stream. The last problem is to decode all this +stuff. Actually, when you meet a binary sequence you can't say whether it comes +from such byte list or such other one. Furthermore, if you change the occurrence +of one or two bytes, you won't obtain the same resulting binary tree. Try for +example to encode the previous list but with the following occurrences: + +Listed bytes | Frequences (Weight) +---------------------------------- + 255 | 418 + 0 | 300 + 31 | 100 + 77 | 24 + 115 | 21 + 83 | 20 + 222 | 5 + +As you can observe it, the resulting binary tree is quite different, we had yet +the same initial bytes. To not be in such a situation we will put an header +in front of all data. I can't comment longly this header but I can say +I minimize it as much as I could. The header is divided into two parts. +The first part of this header looks closely to a boolean table (coded more or +less in binary to save space) and the second part provide to the decoder +the binary code associated to each byte encountered in the original input +stream. + +Here is a summary of the header: + +First part +---------- + First bit + / \ + 1 / \ 0 + / \ + 256 bits set to 0 or 1 5 bits for the number n (minus 1) + depending whether the of bytes encountered + corresponding byte was in the file to compres + in the file to compress | + (=> n bits set to 1, \ / + n>32) n values of 8-bits (n<=32) + \ / + \ / + \ / +Second part | +----------- | + | + +------------->| +(n+1) times | | +(n bytes of | First bit? +the values | / \ +encountered | 1 / \ 0 +in the | / \ +source file | 8 bits of 5 bits of the ++ the code | the length length (-1) +of a | (-1) of the of the following +fictive | following binary +byte | binary code code +to stop the | (length>32) (length<=32) +decoding. | \ / +The fictive | \ / +is set to | \ / +256 in the | | +Huffman | binary code +-tree of | | +encoding) +--------------| + | + Binary encoding of the source file + | + Code of end of encoding + | + + +With my codecs I can handle binary sequences with a length of 256 bits. +This correspond to encode all the input stream from one byte to infinite length. +In fact if a byte had a range from 0 to 257 instead of 0 to 255, I would have a +bug with my codecs with an input stream of at least 370,959,230,771,131,880,927, +453,318,055,001,997,489,772,178,180,790,105 bytes !!! + +Where come this explosive number? In fact, to have a severe bug, I must have +a completely unbalanced tree: + + Tree + /\ + \ + /\ + \ + /\ + \ + ... + /\ + \ + /\ + +Let's take the following example: + +Listed bytes | Frequences (Weight) +---------------------------------- + 32 | 5 + 101 | 3 + 97 | 2 + 100 | 1 + 115 | 1 + +This produces the following unbalanced tree: + + Tree + /\ +(32,5) \ + /\ + (101,3) \ + /\ + (97,2) \ + /\ + (115,1) (100,1) + +Let's speak about a mathematical series: The Fibonacci series. It is defined as +following: + +{ Fib(0)=0 +{ Fib(1)=1 +{ Fib(n)=Fib(n-2)+Fib(n-1) + +Fib(0)=0, Fib(1)=1, Fib(2)=1, Fib(3)=2, Fib(4)=3, Fib(5)=5, Fib(6)=8, Fib(7)=13, +etc. + +But 1, 1, 2, 3, 5, 8 are the occurrences of our list! We can actually +demonstrate that to have an unbalanced tree, we have to take a list with +an occurrence based on the Fibonacci series (these values are minimal). +If the data to compress have m different bytes, when the tree is unbalanced, +the longest code need m-1 bits. In our little previous example where m=5, +the longest codes are associated to the bytes 100 and 115, respectively coded +0001b and 0000b. We can also say that to have an unbalanced tree we must have +at least 5+3+2+1+1=12=Fib(7)-1. To conclude about all that, with a coder that +uses m-1 bits, you must never have an input stream size over than Fib(m+2)-1, +otherwise, there could be a bug in the output stream. Of course, with my codecs +there will never be a bug because I can deal with binary code sizes of 1 to 256 +bits. Some encoder could use that with m=31, Fib(31+2)-1=3,524,577 and m=32, +Fib(32+2)-1=5,702,886. And an encoder that uses unisgned integer of 32 bits +shouldn't have a bug until about 4 Gb... + ++==========================================================+ +| The LZW encoding | ++==========================================================+ + +The LZW scheme is due to three searchers, i.e. Abraham Lempel and Jacob Ziv +worked on it in 1977, and Terry Welch achieved this scheme in 1984. + +LZW is patented in USA. This patent, number 4,558,302, is covered by Unisys +Corporation. You can usually write (without fees) software codecs which use +the LZW scheme but hardware companies can't do so. You may get a limited +licence by writting to: +Welch Licencing Department +Office of the General Counsel +M/S C1SW19 +Unisys corporation +Blue Bell +Pennsylvania, 19424 (USA) + +If you're occidental, you are surely using an LZW encoding every time you are +speaking, especially when you use a dictionary. Let's consider, for example, +the word "Cirrus". As you read a dictionary, you begin with "A", "Aa", and so +on. But a computer has no experience and it must suppose that some words +already exist. That is why with "Cirrus", it supposes that "C", "Ci", "Cir", +"Cirr", "Cirru", and "Cirrus" exist. Of course, being that this is a computer, +all these words are encoded as index numbers. Every time you go forward, you add +a new number associated to the new word. Being that a computer is byte-based +and not alphabetic-based, you have an initial dictionary of 256 letters instead +of our 26 ('A' to 'Z') letters. + +Example: Let's code "XYXYZ". First step, "X" is recognized in the initial +dictionary of 256 letters as the 89th. Second step, "Y" is read. Does "XY" +exist? No, then "XY" is stored as the word 256. You write in the output stream +the ASCII of "X", i.e. 88. Now "YX" is tested as not referenced in the current +dictionary. It is stored as the word 257. You write now in the output stream 89 +(ASCII of "Y"). "XY" is now met. But now "XY" is known as the reference 256. +Being that "XY" exists, you test the sequence with one more letter, i.e. "XYZ". +This last word is not referenced in the current dictionary. You write then the +value 256. Finally, you reach the last letter ("Z"). You add "YZ" as the +reference 258 but it is the last letter. That is why you just write the value +90 (ASCII of "Z"). + +Another encoding sample with the string "ABADABCCCABCEABCECCA". + ++----+-----+---------------+------+----------+-------------------------+------+ +|Step|Input|Dictionary test|Prefix|New symbol|Dictionary |Output| +| | | | | |D0=ASCII with 256 letters| | ++----+-----+---------------+------+----------+-------------------------+------+ +| 1 | "A" |"A" in D0 | "A" | "B" | D1=D0 | 65 | +| | "B" |"AB" not in D0 | | | and "AB"=256 | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 2 | "A" |"B" in D1 | "B" | "A" | D2=D1 | 66 | +| | |"BA" not in D1 | | | and "BA"=257 | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 3 | "D" |"A" in D2 | "A" | "D" | D3=D2 | 65 | +| | |"AD" not in D2 | | | and "AD"=258 | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 4 | "A" |"D" in D3 | "D" | "A" | D4=D3 | 68 | +| | |"DA" not in D3 | | | and "DA"=259 | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 5 | "B" |"A" in D4 | "AB" | "C" | D5=D4 | 256 | +| | "C" |"AB" in D4 | | | and "ABC"=260 | | +| | |"ABC" not in D4| | | | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 6 | "C" |"C" in D5 | "C" | "C" | D6=D5 | 67 | +| | |"CC" not in D5 | | | and "CC"=261 | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 7 | "C" |"C" in D6 | "CC" | "A" | D7=D6 | 261 | +| | "A" |"CC" in D6 | | | and "CCA"=262 | | +| | |"CCA" not in D6| | | | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 8 | "B" |"A" in D7 | "ABC"| "E" | D8=D7 | 260 | +| | "C" |"AB" in D7 | | | and "ABCE"=263 | | +| | "E" |"ABC" in D7 | | | | | +| | <"ABCE" not in D7| | | | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 9 | "A" |"E" in D8 | "E" | "A" | D9=D8 | 69 | +| | |"EA" not in D8 | | | and "EA"=264 | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 10 | "B" |"A" in D9 |"ABCE"| "C" | D10=D9 | 263 | +| | "C" |"AB" in D9 | | | and "ABCEC"=265 | | +| | "E" |"ABC" in D9 | | | | | +| | "C" |"ABCE" in D9 | | | | | +| | <"ABCEC" not in D9> | | | | ++----+-----+---------------+------+----------+-------------------------+------+ +| 11 | "C" |"C" in D10 | "CCA"| | | 262 | +| | "A" |"CC" in D10 | | | | | +| | <"CCA" not in D10| | | | | ++----+-----+---------------+------+----------+-------------------------+------+ + +You will notice a problem with the above output: How to write a code of 256 +(for example) on 8 bits? It's simple to solve this problem. You just say that +the encoding starts with 9 bits and as you reach the 512th word, you use a +10-bits encoding. With 1024 words, you use 11 bits; with 2048 words, 12 bits; +and so on with all numbers of 2^n (n is positive). To better synchronize +the coder and the decoder with all that, most of implementations use two +additional references. The word 256 is a code of reinitialisation (the codec +must reinitialize completely the current dictionary to its 256 initial letters) +and the word 257 is a code of end of information (no more data to read). +Of course, you start your first new word as the code number 258. + +You can also do so as in the GIF file format and start with an initial +dictionary of 18 words to code an input stream with only letters coded on 4 bits +(you start with codes of 5 bits in the output stream!). The 18 initial words +are: 0 to 15 (initial letters), 16 (reinit the dictionary), and 17 (end of +information). First new word has code 18, second word, code 19, ... + +Important: You can consider that your dictionary is limited to 4096 different +words (as in GIF and TIFF file formats). But if your dictionary is full, you +can decide to send old codes *without* reinitializing the dictionary. All the +decoders must be compliant with this. This enables you to consider that it is +not efficient to reinitialize the full dictionary. Instead of this, you don't +change the dictionary and you send/receive (depending if it's a coder or a +decoder) existing codes in the full dictionary. + +My codecs are able to deal as well with most of initial size of data in the +initial dictionary as with full dictionary. + +Let's see how to decode an LZW encoding. We saw with true dynamical Huffman +scheme that you needed an header in the encoding codes. Any header is useless +in LZW scheme. When two successive bytes are read, the first must exist in the +dictionary. This code can be immediately decoded and written in the output +stream. If the second code is equal or less than the word number in the current +dictionary, this code is decoded as the first one. At the opposite, if the +second code is equal to the word number in dictionary plus one, this means you +have to write a word composed with the word (the sentence, not the code number) +of the last code plus the first character of the last code. In between, you make +appear a new word. This new word is the one you just sent to the output stream, +it means composed by all the letters of the word associated to the first code +and the first letter of the word of the second code. You continue the processing +with the second and third codes read in the input stream (of codes)... + +Example: Let's decode the previous encoding given a bit more above. + ++------+-------+----------------+----------+------------------+--------+ +| Step | Input | Code to decode | New code | Dictionary | Output | ++------+-------+----------------+----------+------------------+--------+ +| 1 | 65 | 65 | 66 | 65,66=256 | "A" | +| | 66 | | | | | ++------+-------+----------------+----------+------------------+--------+ +| 2 | 65 | 66 | 65 | 66,65=257 | "B" | ++------+-------+----------------+----------+------------------+--------+ +| 3 | 68 | 65 | 68 | 65,68=258 | "A" | ++------+-------+----------------+----------+------------------+--------+ +| 4 | 256 | 68 | 256 | 68,65=259 | "D" | ++------+-------+----------------+----------+------------------+--------+ +| 5 | 67 | 256 | 67 | 65,66,67=260 | "AB" | ++------+-------+----------------+----------+------------------+--------+ +| 6 | 261 | 67 | 261 | 67,67=261 | "C" | ++------+-------+----------------+----------+------------------+--------+ +| 7 | 260 | 261 | 260 | 67,67,65=262 | "CC" | ++------+-------+----------------+----------+------------------+--------+ +| 8 | 69 | 260 | 69 | 65,66,67,69=263 | "ABC" | ++------+-------+----------------+----------+------------------+--------+ +| 9 | 263 | 69 | 263 | 69,65=264 | "E" | ++------+-------+----------------+----------+------------------+--------+ +| 10 | 262 | 263 | 262 |65,66,67,69,67=256| "ABCE" | ++------+-------+----------------+----------+------------------+--------+ +| 11 | | 262 | | | "CCA" | ++------+-------+----------------+----------+------------------+--------+ + +Summary: The step 4 is an explicit example. The code to decode is 68 ("D" in +ASCII) and the new code is 256. The new word to add to the dictionary is the +letters of the first word plus the the first letter of the second code (code +256), i.e. 65 ("A" in ASCII) plus 68 ("D"). So the new word has the letters 68 +and 65 ("AD"). + +The step 6 is quite special. The first code to decode is referenced but the +second new code is not referenced being that the dictionary is limited to 260 +referenced words. We have to make it as the second previously given case, it +means you must take the word to decode plus its first letter, i.e. "C"+"C"="CC". +Be care, if any encountered code is *upper* than the dictionary size plus 1, it +means you have a problem in your data and/or your codecs are...bad! + +Tricks to improve LZW encoding (but it becomes a non-standard encoding): +- To limit the dictionary to an high amount of words (4096 words maximum enable +you to encode a stream of a maximmum 7,370,880 letters with the same dictionary) +- To use a dictionary of less than 258 if possible (example, with 16 color +pictures, you start with a dictionary of 18 words) +- To not reinitialize a dictionary when it is full +- To reinitialize a dictionary with the most frequent of the previous dictionary +- To use the codes from (current dictionary size+1) to (maximum dictionary size) +because these codes are not used in the standard LZW scheme. +Such a compression scheme has been used (successfully) by Robin Watts +. + ++==========================================================+ +| Summary | ++==========================================================+ + +------------------------------------------------- +RLE type 1: +Fastest compression. Good ratio for general purpose. +Doesn't need to read the data by twice. +Decoding fast. +------------------------------------------------- +RLE type 2: +Fast compression. Very good ratio in general (even for general purposes). +Need to read the data by twice. +Decoding fast. +------------------------------------------------- +RLE type 3: +Slowest compression. Good ratio on image file,quite middle for general purposes. +Need to read the data by twice. +Change line: +#define MAX_RASTER_SIZE 256 +into: +#define MAX_RASTER_SIZE 16 +to speed up the encoding (but the result decreases in ratio). If you compress +with memory buffers, do not modify this line... +Decoding fast. +------------------------------------------------- +RLE type 4: +Slow compression. Good ratio on image file, middle in general purposes. +Change line: +#define MAX_RASTER_SIZE 66 +into: +#define MAX_RASTER_SIZE 16 +to speed up the encoding (but the result decreases in ratio). If you compress +with memory buffers, do not modify this line... +Decoding fast. +------------------------------------------------- +Huffman: +Fast compression. Good ratio on text files and similar, middle for general +purposes. Interesting method to use to compress a buffer already compressed by +RLE types 1 or 2 methods... +Decoding fast. +------------------------------------------------- +LZW: +Quite fast compression. Good, see even very good ratio, for general purposes. +Bigger the data are, better the compression ratio is. +Decoding quite fast. +------------------------------------------------- + +The source codes work on all kinds of computers with a C compiler. +With the compiler, optimize the speed run option instead of space option. +With UNIX system, it's better to compile them with option -O. +If you don't use a GNU compiler, the source file MUST NOT have a size +over 4 Gb for RLE 2, 3, and Huffman, because I count the number +of occurrences of the bytes. +So, with GNU compilers, 'unsigned lont int' is 8 bytes instead of 4 bytes +(as normal C UNIX compilers and PCs' compilers, such as Microsoft C++ +and Borland C++). +Actually: +* Normal UNIX compilers, => 4 Gb (unsigned long int = 4 bytes) + Microsoft C++ and Borland C++ for PCs +* GNU UNIX compilers => 17179869184 Gb (unsigned long int = 8 bytes) + ++==========================================================+ +| END | ++==========================================================+ diff --git a/targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wasm b/targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wasm new file mode 100755 index 0000000000000000000000000000000000000000..4cd11a6ae0dfa885706af17d21d6b32a5f12420d GIT binary patch literal 9151 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wat b/targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wat new file mode 100644 index 0000000..b396d25 --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/generated/default/huff_enc.wat @@ -0,0 +1,3557 @@ +(module $huff_enc.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32))) + (type (;3;) (func (param i32 i32 i32))) + (type (;4;) (func (param i32) (result i32))) + (type (;5;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $huff_enc_write_header (type 2) (param i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 80 + i32.sub + local.tee 1 + global.set $__stack_pointer + i32.const 256 + i32.const 256 + call $__pragma_loopbound + i32.const 0 + local.set 2 + i32.const 0 + local.set 3 + loop ;; label = @1 + local.get 3 + local.get 0 + local.get 2 + i32.add + local.tee 4 + i32.const 32 + i32.add + i32.load + i32.const 0 + i32.ne + i32.add + local.get 4 + i32.const 68 + i32.add + i32.load + i32.const 0 + i32.ne + i32.add + local.get 4 + i32.const 104 + i32.add + i32.load + i32.const 0 + i32.ne + i32.add + local.get 4 + i32.const 140 + i32.add + i32.load + i32.const 0 + i32.ne + i32.add + local.set 3 + local.get 2 + i32.const 144 + i32.add + local.tee 2 + i32.const 9216 + i32.ne + br_if 0 (;@1;) + end + i32.const 1 + i32.const 9 + call $__pragma_loopbound + i32.const 0 + i32.load8_u offset=3088 + i32.const 1 + i32.shl + local.set 4 + i32.const 0 + i32.load8_u offset=3089 + local.set 2 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + local.get 3 + i32.const 31 + i32.gt_u + br_if 0 (;@9;) + block ;; label = @10 + block ;; label = @11 + local.get 2 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@11;) + i32.const 0 + local.set 2 + i32.const 0 + i32.load offset=2052 + local.tee 5 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.get 5 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 4 + br 1 (;@10;) + end + local.get 2 + i32.const 1 + i32.add + local.set 2 + end + i32.const 0 + local.set 5 + i32.const 0 + local.get 4 + i32.store8 offset=3088 + i32.const 0 + local.get 2 + i32.store8 offset=3089 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + local.get 3 + i32.const 255 + i32.add + local.tee 2 + i32.const 4 + i32.shr_u + i32.const 1 + i32.and + i32.const 0 + i32.load8_u offset=3088 + i32.const 1 + i32.shl + i32.or + local.set 3 + i32.const 0 + i32.load offset=2052 + local.set 4 + block ;; label = @10 + i32.const 0 + i32.load8_u offset=3089 + local.tee 6 + i32.const 7 + i32.ne + br_if 0 (;@10;) + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + local.get 2 + i32.const 3 + i32.shr_u + i32.const 1 + i32.and + local.set 3 + br 2 (;@8;) + end + local.get 2 + i32.const 3 + i32.shr_u + i32.const 1 + i32.and + local.get 3 + i32.const 1 + i32.shl + i32.const 510 + i32.and + i32.or + local.set 3 + local.get 6 + i32.const 1 + i32.add + local.tee 5 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 1 (;@8;) + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.set 5 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + local.get 2 + i32.const 2 + i32.shr_u + i32.const 1 + i32.and + local.set 3 + br 2 (;@7;) + end + local.get 4 + i32.const 1 + i32.or + local.set 4 + block ;; label = @9 + block ;; label = @10 + local.get 2 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@10;) + i32.const 0 + local.set 2 + i32.const 0 + i32.load offset=2052 + local.tee 3 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 4 + br 1 (;@9;) + end + local.get 2 + i32.const 1 + i32.add + local.set 2 + end + i32.const 0 + local.get 4 + i32.store8 offset=3088 + i32.const 0 + local.get 2 + i32.store8 offset=3089 + i32.const 32 + local.set 2 + loop ;; label = @9 + local.get 0 + local.get 2 + i32.add + i32.load + local.set 5 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + i32.const 0 + i32.load8_u offset=3088 + i32.const 1 + i32.shl + local.set 4 + i32.const 0 + i32.load8_u offset=3089 + local.set 3 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + local.get 5 + i32.eqz + br_if 0 (;@12;) + local.get 4 + i32.const 1 + i32.or + local.set 4 + local.get 3 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 1 (;@11;) + i32.const 0 + local.set 3 + i32.const 0 + i32.load offset=2052 + local.tee 5 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.get 5 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 4 + br 2 (;@10;) + end + local.get 3 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@11;) + i32.const 0 + local.set 3 + i32.const 0 + i32.load offset=2052 + local.tee 5 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.get 5 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 4 + br 1 (;@10;) + end + local.get 3 + i32.const 1 + i32.add + local.set 3 + end + i32.const 0 + local.get 4 + i32.store8 offset=3088 + i32.const 0 + local.get 3 + i32.store8 offset=3089 + local.get 2 + i32.const 36 + i32.add + local.tee 2 + i32.const 9248 + i32.ne + br_if 0 (;@9;) + br 8 (;@1;) + end + end + i32.const 1 + local.set 6 + local.get 2 + i32.const 2 + i32.shr_u + i32.const 1 + i32.and + local.get 3 + i32.const 1 + i32.shl + i32.const 510 + i32.and + i32.or + local.set 3 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@7;) + i32.const 3 + local.set 7 + br 1 (;@6;) + end + i32.const 1 + local.set 7 + local.get 2 + i32.const 1 + i32.shr_u + i32.const 1 + i32.and + local.get 3 + i32.const 1 + i32.shl + i32.const 510 + i32.and + i32.or + local.set 3 + local.get 5 + i32.const 255 + i32.and + i32.const 6 + i32.ne + br_if 1 (;@5;) + i32.const 0 + local.set 6 + end + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + i32.store offset=2052 + local.get 7 + local.get 2 + i32.and + local.set 2 + br 1 (;@4;) + end + local.get 2 + i32.const 1 + i32.and + local.get 3 + i32.const 1 + i32.shl + i32.or + local.set 2 + local.get 5 + i32.const 2 + i32.add + local.tee 6 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 1 (;@3;) + end + local.get 6 + i32.const 1 + i32.add + local.set 3 + br 1 (;@2;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 2 + i32.store8 + i32.const 0 + local.set 3 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 2 + end + i32.const 0 + local.get 2 + i32.store8 offset=3088 + i32.const 0 + local.get 3 + i32.store8 offset=3089 + local.get 0 + i32.const 32 + i32.add + local.set 3 + i32.const 0 + local.set 4 + loop ;; label = @2 + block ;; label = @3 + local.get 3 + i32.load + i32.eqz + br_if 0 (;@3;) + i32.const 1 + i32.const 9 + call $__pragma_loopbound + local.get 4 + i32.const 7 + i32.shr_u + i32.const 1 + i32.and + i32.const 0 + i32.load8_u offset=3088 + i32.const 1 + i32.shl + i32.or + local.set 5 + i32.const 0 + i32.load offset=2052 + local.set 2 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + i32.const 0 + i32.load8_u offset=3089 + local.tee 6 + i32.const 7 + i32.ne + br_if 0 (;@10;) + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store offset=2052 + local.get 4 + i32.const 5 + i32.shr_u + i32.const 3 + i32.and + local.set 5 + i32.const 2 + local.set 6 + br 1 (;@9;) + end + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + local.get 6 + i32.const 6 + i32.ne + br_if 1 (;@8;) + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 1 + local.set 6 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store offset=2052 + local.get 4 + i32.const 5 + i32.shr_u + i32.const 1 + i32.and + local.set 5 + end + local.get 4 + i32.const 4 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + br 1 (;@7;) + end + local.get 4 + i32.const 5 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + block ;; label = @8 + block ;; label = @9 + local.get 6 + i32.const 5 + i32.ne + br_if 0 (;@9;) + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store offset=2052 + local.get 4 + i32.const 3 + i32.shr_u + i32.const 3 + i32.and + local.set 5 + i32.const 2 + local.set 6 + br 1 (;@8;) + end + local.get 4 + i32.const 4 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + local.get 6 + i32.const 3 + i32.add + local.tee 6 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 1 (;@7;) + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 1 + local.set 6 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store offset=2052 + local.get 4 + i32.const 3 + i32.shr_u + i32.const 1 + i32.and + local.set 5 + end + local.get 4 + i32.const 2 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + br 1 (;@6;) + end + local.get 4 + i32.const 3 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + block ;; label = @7 + local.get 6 + i32.const 255 + i32.and + i32.const 6 + i32.ne + br_if 0 (;@7;) + i32.const 2 + local.set 7 + i32.const 7 + local.set 6 + br 2 (;@5;) + end + i32.const 1 + local.set 7 + local.get 4 + i32.const 2 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + local.get 6 + i32.const 2 + i32.add + local.tee 6 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@6;) + i32.const 3 + local.set 6 + br 1 (;@5;) + end + local.get 4 + i32.const 1 + i32.shr_u + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + block ;; label = @6 + local.get 6 + i32.const 255 + i32.and + i32.const 6 + i32.ne + br_if 0 (;@6;) + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + i32.store offset=2052 + local.get 4 + i32.const 1 + i32.and + local.set 5 + i32.const 0 + i32.const 1 + i32.add + local.set 6 + br 2 (;@4;) + end + local.get 4 + i32.const 1 + i32.and + local.get 5 + i32.const 1 + i32.shl + i32.or + local.set 5 + block ;; label = @6 + local.get 6 + i32.const 2 + i32.add + local.tee 6 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@6;) + local.get 6 + i32.const 1 + i32.add + local.set 6 + br 2 (;@4;) + end + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 0 + local.set 6 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 5 + br 1 (;@4;) + end + local.get 2 + i32.const 2064 + i32.add + local.get 5 + i32.store8 + i32.const 0 + local.get 2 + i32.const 1 + i32.add + i32.store offset=2052 + local.get 4 + local.get 6 + i32.and + local.set 5 + local.get 7 + i32.const 1 + i32.add + local.set 6 + end + i32.const 0 + local.get 5 + i32.store8 offset=3088 + i32.const 0 + local.get 6 + i32.store8 offset=3089 + end + local.get 3 + i32.const 36 + i32.add + local.set 3 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.const 256 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 257 + i32.const 257 + call $__pragma_loopbound + local.get 1 + i32.const 40 + i32.add + i32.const 1 + i32.or + local.set 8 + i32.const 0 + local.set 9 + loop ;; label = @1 + block ;; label = @2 + local.get 0 + local.get 9 + i32.const 36 + i32.mul + i32.add + local.tee 2 + i32.load offset=32 + local.tee 5 + i32.eqz + br_if 0 (;@2;) + i32.const 1 + i32.const 9 + call $__pragma_loopbound + i32.const 0 + i32.load8_u offset=3088 + i32.const 1 + i32.shl + local.set 4 + i32.const 0 + i32.load8_u offset=3089 + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 5 + i32.const 32 + i32.gt_u + br_if 0 (;@4;) + block ;; label = @5 + local.get 3 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@5;) + i32.const 0 + local.set 6 + i32.const 0 + i32.load offset=2052 + local.tee 3 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 5 + local.set 3 + i32.const 0 + local.set 4 + br 2 (;@3;) + end + local.get 3 + i32.const 1 + i32.add + local.set 6 + i32.const 5 + local.set 3 + br 1 (;@3;) + end + local.get 4 + i32.const 1 + i32.or + local.set 4 + block ;; label = @4 + local.get 3 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@4;) + i32.const 0 + local.set 6 + i32.const 0 + i32.load offset=2052 + local.tee 3 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.get 3 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 8 + local.set 3 + i32.const 0 + local.set 4 + br 1 (;@3;) + end + local.get 3 + i32.const 1 + i32.add + local.set 6 + i32.const 8 + local.set 3 + end + i32.const 0 + local.get 4 + i32.store8 offset=3088 + i32.const 0 + local.get 6 + i32.store8 offset=3089 + local.get 8 + local.get 1 + i64.load offset=9 align=1 + i64.store align=1 + local.get 8 + i32.const 8 + i32.add + local.get 1 + i32.const 9 + i32.add + i32.const 8 + i32.add + i64.load align=1 + i64.store align=1 + local.get 8 + i32.const 16 + i32.add + local.get 1 + i32.const 9 + i32.add + i32.const 16 + i32.add + i64.load align=1 + i64.store align=1 + local.get 8 + i32.const 23 + i32.add + local.get 1 + i32.const 9 + i32.add + i32.const 23 + i32.add + i64.load align=1 + i64.store align=1 + local.get 1 + local.get 5 + i32.const -1 + i32.add + i32.store8 offset=40 + local.get 1 + local.get 3 + i32.store offset=72 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + local.get 3 + i32.const -2 + i32.add + i32.const 7 + local.get 3 + i32.const -1 + i32.add + local.tee 4 + select + local.set 3 + local.get 1 + i32.load8_u offset=40 + local.get 4 + i32.const 255 + i32.and + i32.shr_u + i32.const 1 + i32.and + i32.const 0 + i32.load8_u offset=3088 + i32.const 1 + i32.shl + i32.or + local.set 6 + i32.const 0 + i32.const -1 + local.get 4 + select + local.set 7 + i32.const 0 + i32.load offset=2052 + local.set 4 + block ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load8_u offset=3089 + local.tee 10 + i32.const 7 + i32.ne + br_if 0 (;@4;) + local.get 4 + i32.const 2064 + i32.add + local.get 6 + i32.store8 + i32.const 0 + local.set 11 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 6 + br 1 (;@3;) + end + local.get 10 + i32.const 1 + i32.add + local.set 11 + end + local.get 1 + i32.const 40 + i32.add + local.get 7 + i32.add + local.tee 12 + i32.load8_u + local.get 3 + i32.shr_u + i32.const 1 + i32.and + local.get 6 + i32.const 1 + i32.shl + i32.or + local.set 10 + local.get 3 + i32.const -1 + i32.add + local.set 6 + block ;; label = @3 + block ;; label = @4 + local.get 11 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@4;) + local.get 11 + i32.const 1 + i32.add + local.set 11 + br 1 (;@3;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 10 + i32.store8 + i32.const 0 + local.set 11 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 10 + end + local.get 12 + i32.load8_u + local.get 6 + i32.shr_u + i32.const 1 + i32.and + local.get 10 + i32.const 1 + i32.shl + i32.or + local.set 10 + local.get 3 + i32.const -2 + i32.add + i32.const 7 + local.get 6 + select + local.set 3 + local.get 7 + local.get 6 + i32.eqz + i32.sub + local.set 7 + block ;; label = @3 + block ;; label = @4 + local.get 11 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@4;) + local.get 11 + i32.const 1 + i32.add + local.set 11 + br 1 (;@3;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 10 + i32.store8 + i32.const 0 + local.set 11 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 10 + end + local.get 1 + i32.const 40 + i32.add + local.get 7 + i32.add + i32.load8_u + local.get 3 + i32.shr_u + i32.const 1 + i32.and + local.get 10 + i32.const 1 + i32.shl + i32.or + local.set 10 + local.get 3 + i32.const -1 + i32.add + i32.const 7 + local.get 3 + select + local.set 6 + local.get 7 + local.get 3 + i32.eqz + i32.sub + local.set 12 + block ;; label = @3 + block ;; label = @4 + local.get 11 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@4;) + local.get 11 + i32.const 1 + i32.add + local.set 7 + br 1 (;@3;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 10 + i32.store8 + i32.const 0 + local.set 7 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 10 + end + local.get 1 + i32.const 40 + i32.add + local.get 12 + i32.add + i32.load8_u + local.get 6 + i32.shr_u + i32.const 1 + i32.and + local.get 10 + i32.const 1 + i32.shl + i32.or + local.set 3 + block ;; label = @3 + block ;; label = @4 + local.get 7 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@4;) + local.get 7 + i32.const 1 + i32.add + local.set 7 + br 1 (;@3;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.set 7 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 3 + end + block ;; label = @3 + local.get 5 + i32.const 33 + i32.lt_u + br_if 0 (;@3;) + local.get 6 + i32.const -1 + i32.add + i32.const 7 + local.get 6 + select + local.tee 5 + i32.const -1 + i32.add + i32.const 7 + local.get 5 + i32.const 255 + i32.and + local.tee 5 + select + local.set 10 + local.get 1 + i32.const 40 + i32.add + local.get 12 + local.get 6 + i32.eqz + i32.sub + local.tee 6 + i32.add + i32.load8_u + local.get 5 + i32.shr_u + i32.const 1 + i32.and + local.get 3 + i32.const 255 + i32.and + i32.const 1 + i32.shl + i32.or + local.set 3 + local.get 6 + local.get 5 + i32.eqz + i32.sub + local.set 5 + block ;; label = @4 + block ;; label = @5 + local.get 7 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@5;) + local.get 7 + i32.const 1 + i32.add + local.set 7 + br 1 (;@4;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.set 7 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 3 + end + local.get 10 + i32.const -1 + i32.add + i32.const 7 + local.get 10 + i32.const 255 + i32.and + local.tee 6 + select + local.set 10 + local.get 1 + i32.const 40 + i32.add + local.get 5 + i32.add + i32.load8_u + local.get 6 + i32.shr_u + i32.const 1 + i32.and + local.get 3 + i32.const 1 + i32.shl + i32.or + local.set 3 + local.get 5 + local.get 6 + i32.eqz + i32.sub + local.set 6 + block ;; label = @4 + block ;; label = @5 + local.get 7 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@5;) + local.get 7 + i32.const 1 + i32.add + local.set 5 + br 1 (;@4;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.set 5 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.store offset=2052 + i32.const 0 + local.set 3 + end + local.get 1 + i32.const 40 + i32.add + local.get 6 + i32.add + i32.load8_u + local.get 10 + i32.const 255 + i32.and + i32.shr_u + i32.const 1 + i32.and + local.get 3 + i32.const 1 + i32.shl + i32.or + local.set 3 + block ;; label = @4 + local.get 5 + i32.const 255 + i32.and + i32.const 7 + i32.eq + br_if 0 (;@4;) + local.get 5 + i32.const 1 + i32.add + local.set 7 + br 1 (;@3;) + end + local.get 4 + i32.const 2064 + i32.add + local.get 3 + i32.store8 + i32.const 0 + local.set 7 + i32.const 0 + local.get 4 + i32.const 1 + i32.add + i32.store offset=2052 + i32.const 0 + local.set 3 + end + i32.const 0 + local.get 3 + i32.store8 offset=3088 + i32.const 0 + local.get 7 + i32.store8 offset=3089 + local.get 1 + i32.const 40 + i32.add + i32.const 24 + i32.add + local.get 2 + i32.const 24 + i32.add + i64.load align=1 + i64.store + local.get 1 + i32.const 40 + i32.add + i32.const 16 + i32.add + local.get 2 + i32.const 16 + i32.add + i64.load align=1 + i64.store + local.get 1 + i32.const 40 + i32.add + i32.const 8 + i32.add + local.get 2 + i32.const 8 + i32.add + i64.load align=1 + i64.store + local.get 1 + i32.const 40 + i32.add + i32.const 32 + i32.add + local.get 2 + i32.const 32 + i32.add + i32.load align=1 + local.tee 11 + i32.store + local.get 1 + local.get 2 + i64.load align=1 + i64.store offset=40 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + local.get 11 + i32.eqz + br_if 0 (;@2;) + local.get 11 + i32.const -1 + i32.add + local.tee 2 + i32.const 7 + i32.and + local.set 4 + local.get 2 + i32.const 3 + i32.shr_u + local.set 2 + i32.const 0 + i32.load8_u offset=3088 + local.set 6 + i32.const 0 + i32.load8_u offset=3089 + local.set 5 + i32.const 0 + i32.load offset=2052 + local.set 12 + i32.const 1 + local.set 7 + loop ;; label = @3 + local.get 1 + i32.const 40 + i32.add + local.get 2 + i32.add + i32.load8_u + local.get 4 + i32.const 255 + i32.and + local.tee 3 + i32.shr_u + i32.const 1 + i32.and + local.get 6 + i32.const 255 + i32.and + i32.const 1 + i32.shl + i32.or + local.set 6 + local.get 3 + i32.eqz + local.set 10 + block ;; label = @4 + block ;; label = @5 + local.get 5 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@5;) + local.get 12 + i32.const 2064 + i32.add + local.get 6 + i32.store8 + i32.const 0 + local.set 5 + i32.const 0 + local.get 12 + i32.const 1 + i32.add + local.tee 12 + i32.store offset=2052 + i32.const 0 + local.set 6 + br 1 (;@4;) + end + local.get 5 + i32.const 1 + i32.add + local.set 5 + end + local.get 4 + i32.const -1 + i32.add + i32.const 7 + local.get 3 + select + local.set 4 + local.get 2 + local.get 10 + i32.sub + local.set 2 + local.get 11 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + i32.const 255 + i32.and + i32.ge_u + br_if 0 (;@3;) + end + i32.const 0 + local.get 6 + i32.store8 offset=3088 + i32.const 0 + local.get 5 + i32.store8 offset=3089 + end + local.get 9 + i32.const 1 + i32.add + local.tee 9 + i32.const 257 + i32.ne + br_if 0 (;@1;) + end + local.get 1 + i32.const 80 + i32.add + global.set $__stack_pointer) + (func $huff_enc_qsort (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 0 + i32.const 7 + call $__pragma_loopbound + block ;; label = @1 + local.get 1 + i32.const 2 + i32.lt_u + br_if 0 (;@1;) + local.get 2 + i32.const -4 + i32.and + local.set 3 + local.get 2 + i32.const 3 + i32.and + local.set 4 + local.get 2 + i32.const -1 + i32.add + local.set 5 + i32.const 0 + local.get 2 + i32.sub + local.set 6 + loop ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 11 + i32.lt_u + br_if 0 (;@4;) + local.get 0 + local.get 1 + i32.const 6 + i32.div_u + local.get 2 + i32.mul + local.tee 7 + i32.add + local.tee 8 + local.get 7 + i32.const 1 + i32.shl + local.tee 7 + i32.add + local.tee 9 + local.get 7 + i32.add + local.tee 10 + i32.load + i32.load offset=4 + local.set 11 + block ;; label = @5 + local.get 9 + i32.load + i32.load offset=4 + local.tee 12 + local.get 8 + i32.load + i32.load offset=4 + local.tee 13 + i32.ge_u + br_if 0 (;@5;) + local.get 8 + local.set 7 + local.get 11 + local.get 13 + i32.ge_u + br_if 2 (;@3;) + local.get 9 + local.get 10 + local.get 11 + local.get 12 + i32.lt_u + select + local.set 7 + br 2 (;@3;) + end + local.get 9 + local.set 7 + local.get 11 + local.get 12 + i32.ge_u + br_if 1 (;@3;) + local.get 8 + local.get 10 + local.get 11 + local.get 13 + i32.lt_u + select + local.set 7 + br 1 (;@3;) + end + local.get 0 + local.get 1 + i32.const 1 + i32.shr_u + local.get 2 + i32.mul + i32.add + local.set 7 + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + block ;; label = @3 + block ;; label = @4 + local.get 4 + br_if 0 (;@4;) + local.get 0 + local.set 8 + local.get 2 + local.set 9 + br 1 (;@3;) + end + local.get 4 + local.set 9 + local.get 0 + local.set 8 + loop ;; label = @4 + local.get 8 + i32.load8_u + local.set 11 + local.get 8 + local.get 7 + i32.load8_u + i32.store8 + local.get 7 + local.get 11 + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 9 + i32.const -1 + i32.add + local.tee 9 + br_if 0 (;@4;) + end + local.get 3 + local.set 9 + end + block ;; label = @3 + local.get 5 + i32.const 3 + i32.lt_u + local.tee 14 + br_if 0 (;@3;) + loop ;; label = @4 + local.get 8 + i32.load8_u + local.set 11 + local.get 8 + local.get 7 + i32.load8_u + i32.store8 + local.get 7 + local.get 11 + i32.store8 + local.get 8 + i32.const 1 + i32.add + local.tee 11 + i32.load8_u + local.set 12 + local.get 11 + local.get 7 + i32.const 1 + i32.add + local.tee 13 + i32.load8_u + i32.store8 + local.get 13 + local.get 12 + i32.store8 + local.get 8 + i32.const 2 + i32.add + local.tee 11 + i32.load8_u + local.set 12 + local.get 11 + local.get 7 + i32.const 2 + i32.add + local.tee 13 + i32.load8_u + i32.store8 + local.get 13 + local.get 12 + i32.store8 + local.get 8 + i32.const 3 + i32.add + local.tee 11 + i32.load8_u + local.set 12 + local.get 11 + local.get 7 + i32.const 3 + i32.add + local.tee 13 + i32.load8_u + i32.store8 + local.get 13 + local.get 12 + i32.store8 + local.get 8 + i32.const 4 + i32.add + local.set 8 + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 9 + i32.const -4 + i32.add + local.tee 9 + br_if 0 (;@4;) + end + end + i32.const 0 + i32.const 109 + call $__pragma_loopbound + local.get 0 + local.set 9 + local.get 0 + local.get 1 + local.get 2 + i32.mul + i32.add + local.tee 15 + local.set 10 + block ;; label = @3 + loop ;; label = @4 + i32.const 1 + i32.const 19 + call $__pragma_loopbound + local.get 9 + local.get 2 + i32.add + local.set 7 + block ;; label = @5 + loop ;; label = @6 + local.get 7 + local.tee 9 + local.get 15 + i32.ge_u + br_if 1 (;@5;) + local.get 9 + local.get 2 + i32.add + local.set 7 + local.get 0 + i32.load + i32.load offset=4 + local.get 9 + i32.load + i32.load offset=4 + i32.lt_u + br_if 0 (;@6;) + end + end + i32.const 1 + i32.const 25 + call $__pragma_loopbound + local.get 6 + local.set 7 + block ;; label = @5 + loop ;; label = @6 + local.get 10 + local.get 7 + local.tee 11 + i32.add + local.tee 13 + local.get 0 + i32.le_u + br_if 1 (;@5;) + local.get 11 + local.get 2 + i32.sub + local.set 7 + local.get 0 + i32.load + i32.load offset=4 + local.get 13 + i32.load + i32.load offset=4 + i32.gt_u + br_if 0 (;@6;) + end + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + block ;; label = @5 + block ;; label = @6 + local.get 13 + local.get 9 + i32.ge_u + br_if 0 (;@6;) + local.get 10 + local.get 11 + i32.add + local.set 7 + block ;; label = @7 + block ;; label = @8 + local.get 4 + br_if 0 (;@8;) + local.get 0 + local.set 8 + local.get 2 + local.set 9 + br 1 (;@7;) + end + local.get 4 + local.set 9 + local.get 0 + local.set 8 + loop ;; label = @8 + local.get 8 + i32.load8_u + local.set 12 + local.get 8 + local.get 7 + i32.load8_u + i32.store8 + local.get 7 + local.get 12 + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 8 + i32.const 1 + i32.add + local.set 8 + local.get 9 + i32.const -1 + i32.add + local.tee 9 + br_if 0 (;@8;) + end + local.get 3 + local.set 9 + end + block ;; label = @7 + local.get 14 + br_if 0 (;@7;) + loop ;; label = @8 + local.get 8 + i32.load8_u + local.set 12 + local.get 8 + local.get 7 + i32.load8_u + i32.store8 + local.get 7 + local.get 12 + i32.store8 + local.get 8 + i32.const 1 + i32.add + local.tee 12 + i32.load8_u + local.set 13 + local.get 12 + local.get 7 + i32.const 1 + i32.add + local.tee 16 + i32.load8_u + i32.store8 + local.get 16 + local.get 13 + i32.store8 + local.get 8 + i32.const 2 + i32.add + local.tee 12 + i32.load8_u + local.set 13 + local.get 12 + local.get 7 + i32.const 2 + i32.add + local.tee 16 + i32.load8_u + i32.store8 + local.get 16 + local.get 13 + i32.store8 + local.get 8 + i32.const 3 + i32.add + local.tee 12 + i32.load8_u + local.set 13 + local.get 12 + local.get 7 + i32.const 3 + i32.add + local.tee 16 + i32.load8_u + i32.store8 + local.get 16 + local.get 13 + i32.store8 + local.get 8 + i32.const 4 + i32.add + local.set 8 + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 9 + i32.const -4 + i32.add + local.tee 9 + br_if 0 (;@8;) + end + end + local.get 10 + local.get 0 + i32.sub + local.get 11 + i32.add + local.get 2 + i32.div_u + local.tee 7 + local.get 1 + local.get 7 + i32.const -1 + i32.xor + i32.add + local.tee 1 + i32.lt_u + br_if 1 (;@5;) + local.get 0 + local.get 7 + local.get 2 + call $huff_enc_qsort + local.get 0 + local.get 7 + i32.const 1 + i32.add + local.get 2 + i32.mul + i32.add + local.set 0 + br 3 (;@3;) + end + local.get 9 + local.set 7 + local.get 13 + local.set 8 + local.get 2 + local.set 12 + block ;; label = @6 + local.get 4 + i32.eqz + br_if 0 (;@6;) + local.get 10 + local.get 11 + i32.add + local.set 10 + i32.const 0 + local.set 8 + loop ;; label = @7 + local.get 9 + local.get 8 + i32.add + local.tee 7 + i32.load8_u + local.set 11 + local.get 7 + local.get 10 + local.get 8 + i32.add + local.tee 12 + i32.load8_u + i32.store8 + local.get 12 + local.get 11 + i32.store8 + local.get 4 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + i32.ne + br_if 0 (;@7;) + end + local.get 2 + local.get 8 + i32.sub + local.set 12 + local.get 9 + local.get 8 + i32.add + local.set 7 + local.get 10 + local.get 8 + i32.add + local.set 8 + end + local.get 13 + local.set 10 + local.get 14 + br_if 1 (;@4;) + loop ;; label = @6 + local.get 7 + i32.load8_u + local.set 11 + local.get 7 + local.get 8 + i32.load8_u + i32.store8 + local.get 8 + local.get 11 + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.tee 11 + i32.load8_u + local.set 10 + local.get 11 + local.get 8 + i32.const 1 + i32.add + local.tee 16 + i32.load8_u + i32.store8 + local.get 16 + local.get 10 + i32.store8 + local.get 7 + i32.const 2 + i32.add + local.tee 11 + i32.load8_u + local.set 10 + local.get 11 + local.get 8 + i32.const 2 + i32.add + local.tee 16 + i32.load8_u + i32.store8 + local.get 16 + local.get 10 + i32.store8 + local.get 7 + i32.const 3 + i32.add + local.tee 11 + i32.load8_u + local.set 10 + local.get 11 + local.get 8 + i32.const 3 + i32.add + local.tee 16 + i32.load8_u + i32.store8 + local.get 16 + local.get 10 + i32.store8 + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 8 + i32.const 4 + i32.add + local.set 8 + local.get 12 + i32.const -4 + i32.add + local.tee 12 + br_if 0 (;@6;) + end + local.get 13 + local.set 10 + br 1 (;@4;) + end + end + local.get 0 + local.get 7 + i32.const 1 + i32.add + local.get 2 + i32.mul + i32.add + local.get 1 + local.get 2 + call $huff_enc_qsort + local.get 7 + local.set 1 + end + local.get 1 + i32.const 1 + i32.gt_u + br_if 0 (;@2;) + end + end) + (func $huff_enc_build_tree_encoding (type 4) (param i32) (result i32) + (local i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 1040 + i32.sub + local.tee 1 + global.set $__stack_pointer + i32.const 257 + i32.const 257 + call $__pragma_loopbound + local.get 1 + local.set 2 + local.get 0 + local.set 3 + i32.const 0 + local.set 4 + block ;; label = @1 + loop ;; label = @2 + local.get 3 + local.get 4 + i32.store + local.get 2 + local.get 3 + i32.store + local.get 3 + i32.const 12 + i32.add + i32.const 0 + i32.store + local.get 3 + i32.const 4 + i32.add + i64.const 0 + i64.store align=4 + local.get 4 + i32.const 256 + i32.eq + br_if 1 (;@1;) + local.get 3 + i32.const 28 + i32.add + i32.const 0 + i32.store + local.get 3 + i32.const 20 + i32.add + i64.const 0 + i64.store align=4 + local.get 3 + i32.const 16 + i32.add + local.tee 5 + local.get 4 + i32.const 1 + i32.add + i32.store + local.get 2 + i32.const 4 + i32.add + local.get 5 + i32.store + local.get 4 + i32.const 2 + i32.add + local.set 4 + local.get 2 + i32.const 8 + i32.add + local.set 2 + local.get 3 + i32.const 32 + i32.add + local.set 3 + br 0 (;@2;) + end + end + block ;; label = @1 + i32.const 0 + i32.load offset=2048 + i32.const 599 + i32.gt_s + br_if 0 (;@1;) + i32.const 600 + i32.const 600 + call $__pragma_loopbound + block ;; label = @2 + i32.const 0 + i32.load offset=2048 + local.tee 4 + i32.const 599 + i32.gt_s + br_if 0 (;@2;) + local.get 4 + local.set 3 + block ;; label = @3 + local.get 4 + i32.const 1 + i32.and + i32.eqz + br_if 0 (;@3;) + local.get 1 + local.get 4 + i32.const 1443 + i32.add + i32.load8_s + i32.const 2 + i32.shl + i32.add + i32.load + local.tee 3 + local.get 3 + i32.load offset=4 + i32.const 1 + i32.add + i32.store offset=4 + local.get 4 + i32.const 1 + i32.add + local.set 3 + end + block ;; label = @3 + local.get 4 + i32.const 599 + i32.eq + br_if 0 (;@3;) + loop ;; label = @4 + local.get 1 + local.get 3 + i32.const 1443 + i32.add + i32.load8_s + i32.const 2 + i32.shl + i32.add + i32.load + local.tee 4 + local.get 4 + i32.load offset=4 + i32.const 1 + i32.add + i32.store offset=4 + local.get 1 + local.get 3 + i32.const 1444 + i32.add + i32.load8_s + i32.const 2 + i32.shl + i32.add + i32.load + local.tee 4 + local.get 4 + i32.load offset=4 + i32.const 1 + i32.add + i32.store offset=4 + local.get 3 + i32.const 2 + i32.add + local.tee 3 + i32.const 600 + i32.ne + br_if 0 (;@4;) + end + end + i32.const 0 + i32.const 600 + i32.store offset=2048 + end + local.get 1 + i32.load offset=1024 + i32.const 1 + i32.store offset=4 + local.get 1 + i32.const 257 + i32.const 4 + call $huff_enc_qsort + local.get 1 + i32.const 1012 + i32.add + local.set 3 + i32.const 253 + local.set 4 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + loop ;; label = @7 + local.get 3 + i32.const 12 + i32.add + i32.load + i32.load offset=4 + br_if 2 (;@5;) + local.get 3 + i32.const 8 + i32.add + i32.load + i32.load offset=4 + br_if 1 (;@6;) + local.get 3 + i32.const 4 + i32.add + i32.load + i32.load offset=4 + br_if 3 (;@4;) + local.get 3 + i32.load + i32.load offset=4 + br_if 4 (;@3;) + local.get 3 + i32.const -16 + i32.add + local.set 3 + local.get 4 + i32.const -4 + i32.add + local.tee 4 + i32.const -3 + i32.ne + br_if 0 (;@7;) + end + i32.const 38 + i32.const 38 + call $__pragma_loopbound + i32.const 1 + local.set 2 + br 4 (;@2;) + end + local.get 4 + i32.const 2 + i32.add + local.set 4 + br 2 (;@3;) + end + local.get 4 + i32.const 3 + i32.add + local.set 4 + br 1 (;@3;) + end + local.get 4 + i32.const 1 + i32.add + local.set 4 + end + i32.const 38 + i32.const 38 + call $__pragma_loopbound + local.get 4 + i32.const 1 + i32.add + local.tee 2 + i32.eqz + br_if 1 (;@1;) + end + local.get 0 + i32.const 4112 + i32.add + local.set 3 + loop ;; label = @2 + local.get 3 + i32.const 257 + i32.store + local.get 3 + i32.const 8 + i32.add + local.get 1 + local.get 2 + i32.const -1 + i32.add + local.tee 4 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee 5 + i32.store + local.get 3 + i32.const 4 + i32.add + local.tee 0 + local.get 5 + i32.load offset=4 + local.tee 5 + i32.store + block ;; label = @3 + block ;; label = @4 + local.get 4 + br_if 0 (;@4;) + i32.const 0 + local.set 2 + i32.const 0 + local.set 4 + br 1 (;@3;) + end + local.get 0 + local.get 1 + local.get 2 + i32.const -2 + i32.add + local.tee 4 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee 2 + i32.load offset=4 + local.get 5 + i32.add + i32.store + end + local.get 3 + i32.const 12 + i32.add + local.get 2 + i32.store + local.get 1 + local.get 4 + i32.const 2 + i32.shl + i32.add + local.get 3 + i32.store + local.get 1 + local.get 4 + i32.const 1 + i32.add + local.tee 2 + i32.const 4 + call $huff_enc_qsort + local.get 3 + i32.const 16 + i32.add + local.set 3 + local.get 4 + br_if 0 (;@2;) + end + end + local.get 1 + i32.load + local.set 3 + local.get 1 + i32.const 1040 + i32.add + global.set $__stack_pointer + local.get 3) + (func $huff_enc_encode_codes_table (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load + local.tee 4 + i32.const 257 + i32.ne + br_if 0 (;@2;) + block ;; label = @3 + local.get 0 + i32.load offset=8 + i32.eqz + br_if 0 (;@3;) + local.get 3 + i32.const 8 + i32.add + i32.const 32 + i32.add + local.get 2 + i32.const 32 + i32.add + i32.load + i32.store + local.get 3 + i32.const 8 + i32.add + i32.const 24 + i32.add + local.get 2 + i32.const 24 + i32.add + i64.load align=4 + i64.store + local.get 3 + i32.const 8 + i32.add + i32.const 16 + i32.add + local.get 2 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 3 + i32.const 8 + i32.add + i32.const 8 + i32.add + local.get 2 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 3 + local.get 2 + i64.load align=4 + i64.store offset=8 + i32.const 31 + i32.const 31 + call $__pragma_loopbound + local.get 2 + i32.load8_u offset=31 + local.set 5 + i32.const 0 + local.set 4 + block ;; label = @4 + loop ;; label = @5 + local.get 2 + local.get 4 + i32.add + local.tee 6 + i32.const 31 + i32.add + local.get 5 + i32.const 1 + i32.shl + local.get 6 + i32.const 30 + i32.add + local.tee 7 + i32.load8_u + local.tee 5 + i32.const 7 + i32.shr_u + i32.const 1 + i32.and + i32.or + i32.store8 + local.get 4 + i32.const -30 + i32.eq + br_if 1 (;@4;) + local.get 7 + local.get 5 + i32.const 1 + i32.shl + local.get 6 + i32.const 29 + i32.add + i32.load8_u + local.tee 5 + i32.const 7 + i32.shr_u + i32.const 1 + i32.and + i32.or + i32.store8 + local.get 4 + i32.const -2 + i32.add + local.set 4 + br 0 (;@5;) + end + end + local.get 2 + local.get 2 + i32.load8_u + i32.const 1 + i32.shl + i32.const 1 + i32.or + i32.store8 + local.get 2 + i32.const 32 + i32.add + local.tee 4 + local.get 4 + i32.load + i32.const 1 + i32.add + i32.store + local.get 0 + i32.load offset=8 + local.get 1 + local.get 2 + call $huff_enc_encode_codes_table + local.get 4 + local.get 3 + i32.const 8 + i32.add + i32.const 32 + i32.add + i32.load + i32.store + local.get 2 + i32.const 24 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.const 24 + i32.add + i64.load + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.const 16 + i32.add + i64.load + i64.store align=4 + local.get 2 + i32.const 8 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.const 8 + i32.add + i64.load + i64.store align=4 + local.get 2 + local.get 3 + i64.load offset=8 + i64.store align=4 + end + local.get 0 + i32.load offset=12 + i32.eqz + br_if 1 (;@1;) + local.get 3 + i32.const 8 + i32.add + i32.const 32 + i32.add + local.get 2 + i32.const 32 + i32.add + i32.load + i32.store + local.get 3 + i32.const 8 + i32.add + i32.const 24 + i32.add + local.get 2 + i32.const 24 + i32.add + i64.load align=4 + i64.store + local.get 3 + i32.const 8 + i32.add + i32.const 16 + i32.add + local.get 2 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 3 + i32.const 8 + i32.add + i32.const 8 + i32.add + local.get 2 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 3 + local.get 2 + i64.load align=4 + i64.store offset=8 + i32.const 31 + i32.const 31 + call $__pragma_loopbound + local.get 2 + i32.load8_u offset=31 + local.set 5 + i32.const 0 + local.set 4 + block ;; label = @3 + loop ;; label = @4 + local.get 2 + local.get 4 + i32.add + local.tee 6 + i32.const 31 + i32.add + local.get 5 + i32.const 1 + i32.shl + local.get 6 + i32.const 30 + i32.add + local.tee 7 + i32.load8_u + local.tee 5 + i32.const 7 + i32.shr_u + i32.const 1 + i32.and + i32.or + i32.store8 + local.get 4 + i32.const -30 + i32.eq + br_if 1 (;@3;) + local.get 7 + local.get 5 + i32.const 1 + i32.shl + local.get 6 + i32.const 29 + i32.add + i32.load8_u + local.tee 5 + i32.const 7 + i32.shr_u + i32.const 1 + i32.and + i32.or + i32.store8 + local.get 4 + i32.const -2 + i32.add + local.set 4 + br 0 (;@4;) + end + end + local.get 2 + local.get 2 + i32.load8_u + i32.const 1 + i32.shl + i32.store8 + local.get 2 + i32.const 32 + i32.add + local.tee 4 + local.get 4 + i32.load + i32.const 1 + i32.add + i32.store + local.get 0 + i32.load offset=12 + local.get 1 + local.get 2 + call $huff_enc_encode_codes_table + local.get 4 + local.get 3 + i32.const 8 + i32.add + i32.const 32 + i32.add + i32.load + i32.store + local.get 2 + i32.const 24 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.const 24 + i32.add + i64.load + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.const 16 + i32.add + i64.load + i64.store align=4 + local.get 2 + i32.const 8 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.const 8 + i32.add + i64.load + i64.store align=4 + local.get 2 + local.get 3 + i64.load offset=8 + i64.store align=4 + br 1 (;@1;) + end + local.get 1 + local.get 4 + i32.const 36 + i32.mul + i32.add + local.tee 4 + local.get 2 + i64.load align=4 + i64.store align=4 + local.get 4 + i32.const 32 + i32.add + local.get 2 + i32.const 32 + i32.add + i32.load + i32.store + local.get 4 + i32.const 24 + i32.add + local.get 2 + i32.const 24 + i32.add + i64.load align=4 + i64.store align=4 + local.get 4 + i32.const 16 + i32.add + local.get 2 + i32.const 16 + i32.add + i64.load align=4 + i64.store align=4 + local.get 4 + i32.const 8 + i32.add + local.get 2 + i32.const 8 + i32.add + i64.load align=4 + i64.store align=4 + end + local.get 3 + i32.const 48 + i32.add + global.set $__stack_pointer) + (func $huff_enc_create_codes_table (type 0) (param i32 i32) + (local i32 i32 i32) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 2 + global.set $__stack_pointer + i32.const 32 + i32.const 32 + call $__pragma_loopbound + local.get 2 + i32.const 0 + i32.store offset=44 + local.get 2 + i64.const 0 + i64.store offset=36 align=4 + local.get 2 + i64.const 0 + i64.store offset=28 align=4 + local.get 2 + i64.const 0 + i64.store offset=20 align=4 + local.get 2 + i64.const 0 + i64.store offset=12 align=4 + i32.const 257 + i32.const 257 + call $__pragma_loopbound + i32.const 0 + local.set 3 + loop ;; label = @1 + i32.const 32 + i32.const 32 + call $__pragma_loopbound + local.get 1 + local.get 3 + i32.add + local.tee 4 + i64.const 0 + i64.store align=1 + local.get 4 + i32.const 32 + i32.add + i32.const 0 + i32.store + local.get 4 + i32.const 24 + i32.add + i64.const 0 + i64.store align=1 + local.get 4 + i32.const 16 + i32.add + i64.const 0 + i64.store align=1 + local.get 4 + i32.const 8 + i32.add + i64.const 0 + i64.store align=1 + local.get 3 + i32.const 36 + i32.add + local.tee 3 + i32.const 9252 + i32.ne + br_if 0 (;@1;) + end + local.get 0 + local.get 1 + local.get 2 + i32.const 12 + i32.add + call $huff_enc_encode_codes_table + local.get 2 + i32.const 48 + i32.add + global.set $__stack_pointer) + (func $huff_enc_main (type 1) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 17536 + i32.sub + local.tee 0 + global.set $__stack_pointer + block ;; label = @1 + i32.const 0 + i32.load offset=2048 + i32.const 599 + i32.gt_s + br_if 0 (;@1;) + local.get 0 + i32.const 9264 + i32.add + call $huff_enc_build_tree_encoding + local.get 0 + call $huff_enc_create_codes_table + local.get 0 + call $huff_enc_write_header + i32.const 0 + i32.const 0 + i32.store offset=2048 + i32.const 600 + i32.const 600 + call $__pragma_loopbound + block ;; label = @2 + i32.const 0 + i32.load offset=2048 + local.tee 1 + i32.const 599 + i32.gt_s + br_if 0 (;@2;) + loop ;; label = @3 + i32.const 0 + local.get 1 + i32.const 1 + i32.add + i32.store offset=2048 + local.get 0 + i32.const 17496 + i32.add + i32.const 24 + i32.add + local.get 0 + local.get 1 + i32.const 1443 + i32.add + i32.load8_u + i32.const 36 + i32.mul + i32.add + local.tee 1 + i32.const 24 + i32.add + i64.load align=4 + i64.store + local.get 0 + i32.const 17496 + i32.add + i32.const 16 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 0 + i32.const 17496 + i32.add + i32.const 8 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 0 + i32.const 17496 + i32.add + i32.const 32 + i32.add + local.get 1 + i32.const 32 + i32.add + i32.load + local.tee 2 + i32.store + local.get 0 + local.get 1 + i64.load align=4 + i64.store offset=17496 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + block ;; label = @4 + local.get 2 + i32.eqz + br_if 0 (;@4;) + local.get 2 + i32.const -1 + i32.add + local.tee 3 + i32.const 7 + i32.and + local.set 1 + local.get 3 + i32.const 3 + i32.shr_u + local.set 3 + i32.const 0 + i32.load8_u offset=3088 + local.set 4 + i32.const 0 + i32.load8_u offset=3089 + local.set 5 + i32.const 0 + i32.load offset=2052 + local.set 6 + i32.const 1 + local.set 7 + loop ;; label = @5 + local.get 0 + i32.const 17496 + i32.add + local.get 3 + i32.add + i32.load8_u + local.get 1 + i32.const 255 + i32.and + local.tee 8 + i32.shr_u + i32.const 1 + i32.and + local.get 4 + i32.const 255 + i32.and + i32.const 1 + i32.shl + i32.or + local.set 4 + local.get 8 + i32.eqz + local.set 9 + block ;; label = @6 + block ;; label = @7 + local.get 5 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@7;) + local.get 6 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.set 5 + i32.const 0 + local.get 6 + i32.const 1 + i32.add + local.tee 6 + i32.store offset=2052 + i32.const 0 + local.set 4 + br 1 (;@6;) + end + local.get 5 + i32.const 1 + i32.add + local.set 5 + end + local.get 1 + i32.const -1 + i32.add + i32.const 7 + local.get 8 + select + local.set 1 + local.get 3 + local.get 9 + i32.sub + local.set 3 + local.get 2 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + i32.const 255 + i32.and + i32.ge_u + br_if 0 (;@5;) + end + i32.const 0 + local.get 4 + i32.store8 offset=3088 + i32.const 0 + local.get 5 + i32.store8 offset=3089 + end + i32.const 0 + i32.load offset=2048 + local.tee 1 + i32.const 600 + i32.lt_s + br_if 0 (;@3;) + end + end + local.get 0 + i32.const 17520 + i32.add + local.get 0 + i32.const 9240 + i32.add + i64.load + i64.store + local.get 0 + i32.const 17512 + i32.add + local.get 0 + i32.const 9232 + i32.add + i64.load + i64.store + local.get 0 + i32.const 17504 + i32.add + local.get 0 + i32.const 9224 + i32.add + i64.load + i64.store + local.get 0 + i32.const 17528 + i32.add + local.get 0 + i32.const 9248 + i32.add + i32.load + local.tee 2 + i32.store + local.get 0 + local.get 0 + i64.load offset=9216 + i64.store offset=17496 + i32.const 1 + i32.const 9 + call $__pragma_loopbound + block ;; label = @2 + block ;; label = @3 + local.get 2 + i32.eqz + br_if 0 (;@3;) + local.get 2 + i32.const -1 + i32.add + local.tee 3 + i32.const 7 + i32.and + local.set 1 + local.get 3 + i32.const 3 + i32.shr_u + local.set 3 + i32.const 0 + i32.load8_u offset=3088 + local.set 4 + i32.const 0 + i32.load8_u offset=3089 + local.set 5 + i32.const 0 + i32.load offset=2052 + local.set 6 + i32.const 1 + local.set 7 + loop ;; label = @4 + local.get 0 + i32.const 17496 + i32.add + local.get 3 + i32.add + i32.load8_u + local.get 1 + i32.const 255 + i32.and + local.tee 8 + i32.shr_u + i32.const 1 + i32.and + local.get 4 + i32.const 255 + i32.and + i32.const 1 + i32.shl + i32.or + local.set 4 + local.get 8 + i32.eqz + local.set 9 + block ;; label = @5 + block ;; label = @6 + local.get 5 + i32.const 255 + i32.and + i32.const 7 + i32.ne + br_if 0 (;@6;) + local.get 6 + i32.const 2064 + i32.add + local.get 4 + i32.store8 + i32.const 0 + local.set 5 + i32.const 0 + local.get 6 + i32.const 1 + i32.add + local.tee 6 + i32.store offset=2052 + i32.const 0 + local.set 4 + br 1 (;@5;) + end + local.get 5 + i32.const 1 + i32.add + local.set 5 + end + local.get 1 + i32.const -1 + i32.add + i32.const 7 + local.get 8 + select + local.set 1 + local.get 3 + local.get 9 + i32.sub + local.set 3 + local.get 2 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + i32.const 255 + i32.and + i32.ge_u + br_if 0 (;@4;) + end + i32.const 0 + local.get 4 + i32.store8 offset=3088 + i32.const 0 + local.get 5 + i32.store8 offset=3089 + br 1 (;@2;) + end + i32.const 0 + i32.load8_u offset=3089 + local.set 5 + end + local.get 5 + i32.const 255 + i32.and + local.tee 1 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + i32.const 0 + i32.load offset=2052 + local.tee 3 + i32.const 1 + i32.add + i32.store offset=2052 + local.get 3 + i32.const 2064 + i32.add + i32.const 0 + i32.load8_u offset=3088 + i32.const 8 + local.get 1 + i32.sub + i32.shl + i32.store8 + end + local.get 0 + i32.const 17536 + i32.add + global.set $__stack_pointer) + (func $__original_main (type 5) (result i32) + (local i32 i32 i32) + i32.const 0 + local.set 0 + i32.const 0 + i32.const 0 + i32.store offset=2052 + i32.const 0 + i32.const 0 + i32.store offset=2048 + call $huff_enc_main + i32.const 419 + i32.const 419 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + loop ;; label = @5 + local.get 0 + i32.const 1024 + i32.add + i32.load8_u + local.get 0 + i32.const 2064 + i32.add + i32.load8_u + i32.ne + br_if 1 (;@4;) + local.get 0 + i32.const 1025 + i32.add + i32.load8_u + local.get 0 + i32.const 2065 + i32.add + i32.load8_u + i32.ne + br_if 2 (;@3;) + local.get 0 + i32.const 1026 + i32.add + i32.load8_u + local.get 0 + i32.const 2066 + i32.add + i32.load8_u + i32.ne + br_if 3 (;@2;) + block ;; label = @6 + local.get 0 + i32.const 416 + i32.ne + br_if 0 (;@6;) + i32.const 0 + return + end + local.get 0 + i32.const 2067 + i32.add + local.set 1 + local.get 0 + i32.const 1027 + i32.add + local.set 2 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 2 + i32.load8_u + local.get 1 + i32.load8_u + i32.eq + br_if 0 (;@5;) + br 4 (;@1;) + end + end + local.get 0 + i32.const 1 + i32.add + return + end + local.get 0 + i32.const 2 + i32.add + return + end + local.get 0 + i32.const 3 + i32.add + local.set 0 + end + local.get 0) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 7200)) + (global (;1;) i32 (i32.const 3090)) + (global (;2;) i32 (i32.const 7200)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $huff_enc_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\80\00\00\00P\85 \80d\04 ?\ef\ff\f0\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\07\a7\15\81\e8Ex\84\d9\14\a2\13\a4'\85\fc\8ai\14\c2\13\81\f0\ac\8a\f8\96\0b\0b\f0\c9D@r5\11*%\c3\80\d4t\c2)b43\0c\84p\f4\03$!4'\87\a4!>\9cW\0en\16W2U\c6c\8e\8c\c2QN\9eT\81\fe\81\f8n\b3\9f\c0\91\85\b8\b8\1c\d2`\92I\0a\e2\15S\98J\0do\84\c7\ca\db\f1J\c1\a7i\de\1f\93\067\1f\81(\e84\99\a0\94\12$\c5-\d8\caV\1e\1f\b1Z\85\8a\f8\17Q\c3\a0d\d7]2\b9\e1\fb\17\06\e6\e1\e5pGP`\8d\cd\b0\e6U\c4\09\18]Zy\e1LD\98?\19k\8ce\cc\d6M\1a\c2`\120M\d2\89\01\fd\04\e6\f88\f0\e0o\a3_\0a\0c\df\07\ea\a7\81($`\87}\f5\fa\02\c6x\7f\00\91\85\d5\a7\87\95\c3C\ebl\09\18W\11f\98%\04\de\83\bc\90I$\80I\14Q\98\b1\85\f8\1c\a5\83x\7f\f0\f2\b8h}m\81#\1e\04\91A\caX\09\8ag,\cdd\a7\18\98\0b\183%B\09\18\1f\ae\ca\d41\98\12`\9b\d0w\92-a08\1c\c2Z\e0\cc\90\e8\b0$`~\bb+S\0cy\81\d1`\c5#\026\b0\f9\5c\d0\cc\91\bc)\aa\b4G\10$`~\bb+S\13\00\91\81d\d1\0f+\877\06\ee\b4\c2Z\11\e5s\15\a8\fb\8c\83\a2\d9\a6]\16\04\8c\1f[\a67\19\ca\c0o\14\ab\cf'\c0You are doubtless asking \22How can I reduce the data size without losing some informations?\22. It's easy to answer to this question. I'll only take an example. I'm sure you have heard about the morse. This system established in the 19th century use a scheme very close to the huffman one. In the morse you encode the letters to transmit with two kinds of signs. If you encode these two sign possibilities in one bit, the symbol 'e' is transmitted in a single bit and the symbols 'y' and 'z' need four bits. Look at the symbols in the text you are reading, you'll fast understand the compression ratio...\00")) diff --git a/targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/default/huff_enc.c b/targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/default/huff_enc.c new file mode 100644 index 0000000..88325b8 --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/default/huff_enc.c @@ -0,0 +1,601 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: huff_enc + + Author: David Bourgin (David.Bourgin@ufrima.imag.fr) + + Function: Example of Huffman encoding + + Source: ftp://turing.imag.fr/pub/compression/ (1994-09-22) + + Original name: codhuff.c + + Changes: I/O to char arrays instead of file i/o. + Dynamic memory allocation replaced by array. + Explicit sorting algorithm. + + License: + + The source code files (codrl1.c, dcodrl1.c, codrle2.c, dcodrle2.c, codrle3.c, + dcodrle3.c, codrle4.c, dcodrle4.c, codhuff.c, dcodhuff.c) are copyrighted. + They have been uploaded on ftp in turing.imag.fr + (129.88.31.7):/pub/compression on 22/5/94 and have been modified on 22/9/94. + (c) David Bourgin - 1994 + The source codes I provide have no buggs (!) but being that I make them + available for free I have some notes to make. They can change at any time + without notice. I assume no responsability or liability for any errors or + inaccurracies, make no warranty of any kind (express, implied or statutory) + with respect to this publication and expressly disclaim any and all warranties + of merchantability, fitness for particular purposes. Of course, if you have + some problems to use the information presented here, I will try to help you if + I can. + + If you include the source codes in your application, here are the conditions: + - You have to put my name in the header of your source file (not in the + excutable program if you don't want) (this item is a must) + - I would like to see your resulting application, if possible (this item is + not a must, because some applications must remain secret) + - Whenever you gain money with your application, I would like to receive a + very little part in order to be encouraged to update my source codes and to + develop new schemes (this item is not a must) + +*/ + +/* + Declaration of types +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +typedef struct huff_enc_s_tree { + unsigned int byte; /* A byte has to be coded as an unsigned integer to + allow a node to have a value over 255 */ + unsigned long int weight; + struct huff_enc_s_tree *left_ptr; + struct huff_enc_s_tree *right_ptr; +} huff_enc_t_tree; + +typedef struct { + unsigned char bits[32]; + unsigned int bits_nb; +} huff_enc_t_bin_val; + +/* + Forward declaration of functions +*/ + +void huff_enc_init(void); +int huff_enc_return(void); +void huff_enc_beginning_of_data(); +int huff_enc_end_of_data(); +int huff_enc_read_byte(); +void huff_enc_write_byte(char ch); +void huff_enc_write_bin_val(huff_enc_t_bin_val bin_val); +void huff_enc_fill_encoding(void); +void huff_enc_write_header(huff_enc_t_bin_val codes_table[257]); +int huff_enc_weighhuff_enc_t_tree_comp(const void *t1, const void *t2); +void huff_enc_swapi(char *ii, char *ij, unsigned long es); +char *huff_enc_pivot(char *a, unsigned long n, unsigned long es); +void huff_enc_qsort(char *a, unsigned long n, unsigned long es); +huff_enc_t_tree *huff_enc_build_tree_encoding(huff_enc_t_tree heap[514]); +void huff_enc_encode_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257], + huff_enc_t_bin_val *code_val); +void huff_enc_create_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257]); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +huff_enc_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +static int huff_enc_input_pos; +static int huff_enc_output_pos; +static unsigned char huff_enc_output[1024]; +static unsigned char huff_enc_byte_nb_to_write = 0; +static unsigned char huff_enc_val_to_write = 0; + +/* + Initialization- and return-value-related functions +*/ + +#define huff_enc_plaintext_len 600 +static const char *huff_enc_plaintext = + "You are doubtless asking \"How can I reduce the data size without losing " + "some informations?\". It's easy to answer to this question. I'll only " + "take " + "an example. I'm sure you have heard about the morse. This system " + "established " + "in the 19th century use a scheme very close to the huffman one. In the " + "morse " + "you encode the letters to transmit with two kinds of signs. If you encode " + "these two sign possibilities in one bit, the symbol 'e' is transmitted in " + "a " + "single bit and the symbols 'y' and 'z' need four bits. Look at the " + "symbols " + "in the text you are reading, you'll fast understand the compression " + "ratio..."; + +#define huff_enc_encoded_len 419 +static unsigned char huff_enc_encoded[huff_enc_encoded_len] = { + 128, 0, 0, 0, 80, 133, 32, 32, 128, 100, 4, 32, 63, 239, 255, + 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 167, 21, 129, 232, 69, 120, 132, 217, 20, 162, 19, + 164, 39, 133, 252, 138, 105, 20, 194, 19, 129, 240, 172, 138, 248, 150, + 11, 11, 240, 201, 68, 64, 114, 53, 17, 42, 37, 195, 128, 212, 116, + 194, 41, 98, 52, 51, 12, 132, 112, 244, 3, 36, 33, 52, 39, 135, + 164, 33, 62, 156, 87, 14, 110, 22, 87, 50, 85, 198, 99, 142, 140, + 194, 81, 78, 158, 84, 129, 254, 129, 248, 110, 179, 159, 192, 145, 133, + 184, 184, 28, 210, 96, 146, 73, 10, 226, 21, 83, 152, 74, 13, 111, + 132, 199, 202, 219, 241, 74, 193, 167, 105, 222, 31, 147, 6, 55, 31, + 129, 40, 232, 52, 153, 160, 148, 18, 36, 197, 45, 216, 202, 86, 30, + 31, 177, 90, 133, 138, 248, 23, 81, 195, 160, 100, 215, 93, 50, 185, + 225, 251, 23, 6, 230, 225, 229, 112, 71, 80, 96, 141, 205, 176, 230, + 85, 196, 9, 24, 93, 90, 121, 225, 76, 68, 152, 63, 25, 107, 140, + 101, 204, 214, 77, 26, 194, 96, 18, 48, 77, 210, 137, 1, 253, 4, + 230, 248, 56, 240, 224, 111, 163, 95, 10, 12, 223, 7, 234, 167, 129, + 40, 36, 96, 135, 125, 245, 250, 2, 198, 120, 127, 0, 145, 133, 213, + 167, 135, 149, 195, 67, 235, 108, 9, 24, 87, 17, 102, 152, 37, 4, + 222, 131, 188, 144, 73, 36, 128, 73, 20, 81, 152, 177, 133, 248, 28, + 165, 131, 120, 127, 240, 242, 184, 104, 125, 109, 129, 35, 30, 4, 145, + 65, 202, 88, 9, 138, 103, 44, 205, 100, 167, 24, 152, 11, 24, 51, + 37, 66, 9, 24, 31, 174, 202, 212, 49, 152, 18, 96, 155, 208, 119, + 146, 45, 97, 48, 56, 28, 194, 90, 224, 204, 144, 232, 176, 36, 96, + 126, 187, 43, 83, 12, 121, 129, 209, 96, 197, 35, 2, 54, 176, 249, + 92, 208, 204, 145, 188, 41, 170, 180, 71, 16, 36, 96, 126, 187, 43, + 83, 19, 0, 145, 129, 100, 209, 15, 43, 135, 55, 6, 238, 180, 194, + 90, 17, 229, 115, 21, 168, 251, 140, 131, 162, 217, 166, 93, 22, 4, + 140, 31, 91, 166, 55, 25, 202, 192, 111, 20, 171, 207, 39, 192, +}; + +void +huff_enc_init(void) { + huff_enc_input_pos = 0; + huff_enc_output_pos = 0; +} + +int +huff_enc_return(void) { + int i; + __pragma_loopbound(419, 419); + for (i = 0; i < huff_enc_encoded_len; i++) { + if (huff_enc_encoded[i] != huff_enc_output[i]) + return i + 1; + } + return 0; +} + +/* + Input / output functions +*/ + +void +huff_enc_beginning_of_data() { + huff_enc_input_pos = 0; +} + +int +huff_enc_end_of_data() { + return huff_enc_input_pos >= huff_enc_plaintext_len; +} + +int +huff_enc_read_byte() { + return huff_enc_plaintext[huff_enc_input_pos++]; +} + +void +huff_enc_write_byte(char ch) { + huff_enc_output[huff_enc_output_pos++] = ch; +} + +void +huff_enc_write_bin_val(huff_enc_t_bin_val bin_val) +/* Returned parameters: None + Action: Writes in the output stream the value binary-coded into 'bin_val' + Errors: An input/output error could disturb the running of the program +*/ +{ + unsigned char bit_indice; + unsigned char bin_pos = (bin_val.bits_nb - 1) & 7; + unsigned int pos_byte = (bin_val.bits_nb - 1) >> 3; + + __pragma_loopbound(1, 9); + for (bit_indice = 1; bit_indice <= bin_val.bits_nb; bit_indice++) { + /* Watch for the current bit to write */ + huff_enc_val_to_write = (huff_enc_val_to_write << 1) | + ((bin_val.bits[pos_byte] >> bin_pos) & 1); + /* Move to the next bit to write */ + if (!bin_pos) { + pos_byte--; + bin_pos = 7; + } else + bin_pos--; + if (huff_enc_byte_nb_to_write == 7) { + /* Are already 8 bits written? */ + huff_enc_write_byte(huff_enc_val_to_write); + huff_enc_byte_nb_to_write = 0; + huff_enc_val_to_write = 0; + } else /* No, then the next writting will be in the next bit */ + huff_enc_byte_nb_to_write++; + } +} + +void +huff_enc_fill_encoding(void) +/* Returned parameters: None + Action: Fills the last byte to write in the output stream with zero values + Errors: An input/output error could disturb the running of the program +*/ +{ + if (huff_enc_byte_nb_to_write) + huff_enc_write_byte(huff_enc_val_to_write + << (8 - huff_enc_byte_nb_to_write)); +} + +void +huff_enc_write_header(huff_enc_t_bin_val codes_table[257]) +/* Returned parameters: None + Action: Writes the header in the stream of codes + Errors: An input/output error could disturb the running of the program +*/ +{ + unsigned int i, j; + huff_enc_t_bin_val bin_val_to_0; + huff_enc_t_bin_val bin_val_to_1; + huff_enc_t_bin_val bin_val; + /* Is used to send in binary mode via huff_enc_write_bin_val */ + + *bin_val_to_0.bits = 0; + bin_val_to_0.bits_nb = 1; + *bin_val_to_1.bits = 1; + bin_val_to_1.bits_nb = 1; + __pragma_loopbound(256, 256); + for (i = 0, j = 0; j <= 255; j++) + if (codes_table[j].bits_nb) + i++; + /* From there, i contains the number of bytes of the several + non 0 occurrences to encode. + First part of the header: Specifies the bytes that appear + in the source of encoding */ + if (i < 32) { + /* Encoding of the appeared bytes with a block of bytes */ + huff_enc_write_bin_val(bin_val_to_0); + bin_val.bits_nb = 5; + *bin_val.bits = (unsigned char) (i - 1); + huff_enc_write_bin_val(bin_val); + bin_val.bits_nb = 8; + _Pragma( + "loopbound min 256 max 256") for (j = 0; j <= 255; + j++) if (codes_table[j].bits_nb) { + *bin_val.bits = (unsigned char) j; + huff_enc_write_bin_val(bin_val); + } + } else { + /* Encoding of the appeared bytes with a block of bits */ + huff_enc_write_bin_val(bin_val_to_1); + _Pragma( + "loopbound min 256 max 256") for (j = 0; j <= 255; + j++) if (codes_table[j].bits_nb) + huff_enc_write_bin_val(bin_val_to_1); + else huff_enc_write_bin_val(bin_val_to_0); + }; + /* Second part of the header: Specifies the encoding of the bytes + (fictive or not) that appear in the source of encoding */ + __pragma_loopbound(257, 257); + for (i = 0; i <= 256; i++) + if ((j = codes_table[i].bits_nb) != 0) { + if (j < 33) { + huff_enc_write_bin_val(bin_val_to_0); + bin_val.bits_nb = 5; + } else { + huff_enc_write_bin_val(bin_val_to_1); + bin_val.bits_nb = 8; + } + *bin_val.bits = (unsigned char) (j - 1); + huff_enc_write_bin_val(bin_val); + huff_enc_write_bin_val(codes_table[i]); + } +} + +int +huff_enc_weighhuff_enc_t_tree_comp(const void *t1, const void *t2) +/* Returned parameters: Returns a comparison status + Action: Returns a negative, zero or positive integer depending on the weight + of 'tree2' is less than, equal to, or greater than the weight of + 'tree1' + Errors: None +*/ +{ + huff_enc_t_tree *const *tree1 = (huff_enc_t_tree *const *) t1; + huff_enc_t_tree *const *tree2 = (huff_enc_t_tree *const *) t2; + return ((*tree2)->weight ^ (*tree1)->weight) + ? (((*tree2)->weight < (*tree1)->weight) ? -1 : 1) + : 0; +} + +void +huff_enc_swapi(char *ii, char *ij, unsigned long es) { + char *i, *j, c; + + i = (char *) ii; + j = (char *) ij; + __pragma_loopbound(8, 8); + do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof(char); + } while (es != 0); +} + +char * +huff_enc_pivot(char *a, unsigned long n, unsigned long es) { + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + if (huff_enc_weighhuff_enc_t_tree_comp(pi, pj) < 0) { + if (huff_enc_weighhuff_enc_t_tree_comp(pi, pk) < 0) { + if (huff_enc_weighhuff_enc_t_tree_comp(pj, pk) < 0) + return pj; + return pk; + } + return pi; + } + if (huff_enc_weighhuff_enc_t_tree_comp(pj, pk) < 0) { + if (huff_enc_weighhuff_enc_t_tree_comp(pi, pk) < 0) + return pi; + return pk; + } + return pj; +} + +void +huff_enc_qsort(char *a, unsigned long n, + unsigned long es) // wird insgesamt 648 ausgeführt (rekursion) +{ + unsigned long j; + char *pi, *pj, *pn; + unsigned int flowfactdummy = 0; + __pragma_loopbound(0, 7); + while (n > 1) { + if (n > 10) + pi = huff_enc_pivot(a, n, es); + + else + pi = a + (n >> 1) * es; + + huff_enc_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + __pragma_loopbound(0, 109); + while (1) { + /* wcc note: this assignment expression was added to avoid + assignment of multiple loop bound annotations to same loop (cf. + Ticket #0002323). */ + flowfactdummy++; + __pragma_loopbound(1, 19); + do { + pi += es; + } while (pi < pn && huff_enc_weighhuff_enc_t_tree_comp(pi, a) < 0); + __pragma_loopbound(1, 25); + do { + pj -= es; + } while (pj > a && huff_enc_weighhuff_enc_t_tree_comp(pj, a) > 0); + if (pj < pi) + break; + huff_enc_swapi(pi, pj, es); + } + huff_enc_swapi(a, pj, es); + j = (pj - a) / es; + + n = n - j - 1; + if (j >= n) { + huff_enc_qsort(a, j, es); + a += (j + 1) * es; + } else { + huff_enc_qsort(a + (j + 1) * es, n, es); + n = j; + } + } +} + +huff_enc_t_tree * +huff_enc_build_tree_encoding(huff_enc_t_tree heap[514]) +/* Returned parameters: Returns a tree of encoding + Action: Generates an Huffman encoding tree based on the data from + the stream to compress + Errors: None +*/ +{ + unsigned int i; + unsigned int heap_top = 0; + huff_enc_t_tree *occurrences_table[257]; + huff_enc_t_tree *ptr_fictive_tree; + + /* Sets up the occurrences number of all bytes to 0 */ + __pragma_loopbound(257, 257); + for (i = 0; i <= 256; i++) { + occurrences_table[i] = &heap[heap_top++]; + occurrences_table[i]->byte = i; + occurrences_table[i]->weight = 0; + occurrences_table[i]->left_ptr = 0; + occurrences_table[i]->right_ptr = 0; + } + /* Valids the occurrences of 'occurrences_table' with regard to the data to + compress */ + if (!huff_enc_end_of_data()) { + __pragma_loopbound(600, 600); + while (!huff_enc_end_of_data()) { + i = huff_enc_read_byte(); + occurrences_table[i]->weight++; + } + occurrences_table[256]->weight = 1; + + /* Sorts the occurrences table depending on the weight of each character + */ + huff_enc_qsort((char *) occurrences_table, 257, + sizeof(huff_enc_t_tree *)); + + _Pragma( + "loopbound min 218 max 218") for (i = 256; + (i != 0) && + (!occurrences_table[i]->weight); + i--); + i++; + /* From there, 'i' gives the number of different bytes with a 0 + occurrence in the stream to compress */ + __pragma_loopbound(38, 38); + while (i > 0) { + /* Looks up (i+1)/2 times the occurrence table to link the nodes in + an unique tree */ + ptr_fictive_tree = &heap[heap_top++]; + ptr_fictive_tree->byte = 257; + ptr_fictive_tree->weight = occurrences_table[--i]->weight; + ptr_fictive_tree->left_ptr = occurrences_table[i]; + if (i) { + i--; + ptr_fictive_tree->weight += occurrences_table[i]->weight; + ptr_fictive_tree->right_ptr = occurrences_table[i]; + } else + ptr_fictive_tree->right_ptr = 0; + occurrences_table[i] = ptr_fictive_tree; + + // qsort( ( char * )occurrences_table, i + 1, sizeof( + // *huff_enc_t_tree ), huff_enc_weighhuff_enc_t_tree_comp ); + huff_enc_qsort((char *) occurrences_table, i + 1, + sizeof(huff_enc_t_tree *)); + + if (i) /* Is there an other node in the occurrence tables? */ + i++; /* Yes, then takes care to the fictive node */ + } + } + return (*occurrences_table); +} + +void +huff_enc_encode_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257], + huff_enc_t_bin_val *code_val) +/* Returned parameters: The data of 'codes_table' can have been modified + Action: Stores the encoding tree as a binary encoding table to speed up the + access. 'val_code' gives the encoding for the current node of the tree + Errors: None +*/ +{ + unsigned int i; + huff_enc_t_bin_val tmp_code_val; + + if (tree->byte == 257) { + if (tree->left_ptr != 0) + /* The sub-trees on left begin with an bit set to 1 */ + { + tmp_code_val = *code_val; + __pragma_loopbound(31, 31); + for (i = 31; i > 0; i--) + code_val->bits[i] = + (code_val->bits[i] << 1) | (code_val->bits[i - 1] >> 7); + *code_val->bits = (*code_val->bits << 1) | 1; + code_val->bits_nb++; + huff_enc_encode_codes_table(tree->left_ptr, codes_table, code_val); + *code_val = tmp_code_val; + }; + if (tree->right_ptr != 0) + /* The sub-trees on right begin with an bit set to 0 */ + { + tmp_code_val = *code_val; + __pragma_loopbound(31, 31); + for (i = 31; i > 0; i--) + code_val->bits[i] = + (code_val->bits[i] << 1) | (code_val->bits[i - 1] >> 7); + *code_val->bits <<= 1; + code_val->bits_nb++; + huff_enc_encode_codes_table(tree->right_ptr, codes_table, code_val); + *code_val = tmp_code_val; + }; + } else + codes_table[tree->byte] = *code_val; +} + +void +huff_enc_create_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257]) +/* Returned parameters: The data in 'codes_table' will be modified + Action: Stores the encoding tree as a binary encoding table to speed up + the access by calling encode_codes_table + Errors: None +*/ +{ + unsigned int i, j; + huff_enc_t_bin_val code_val; + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + code_val.bits[i] = 0; + code_val.bits_nb = 0; + __pragma_loopbound(257, 257); + for (j = 0; j < 257; j++) { + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + codes_table[j].bits[i] = 0; + codes_table[j].bits_nb = 0; + } + _Pragma("marker call_encode") _Pragma( + "flowrestriction 1*huff_enc_encode_codes_table <= 77*call_encode") + huff_enc_encode_codes_table(tree, codes_table, &code_val); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +huff_enc_main() +/* Returned parameters: None + Action: Compresses with Huffman method all bytes read by the function + 'huff_enc_read_byte' + Errors: None +*/ +{ + huff_enc_t_tree *tree; + huff_enc_t_tree heap[514]; + huff_enc_t_bin_val encoding_table[257]; + unsigned char byte_read; + + if (!huff_enc_end_of_data()) { + /* Generates only whether there are data */ + tree = huff_enc_build_tree_encoding(heap); + /* Creation of the best adapted tree */ + huff_enc_create_codes_table(tree, encoding_table); + /* Obtains the binary encoding in an array to speed up the accesses */ + huff_enc_write_header(encoding_table); + /* Writes the defintion of the encoding */ + huff_enc_beginning_of_data(); /* Real compression of the data */ + __pragma_loopbound(600, 600); + while (!huff_enc_end_of_data()) { + byte_read = huff_enc_read_byte(); + huff_enc_write_bin_val(encoding_table[byte_read]); + } + huff_enc_write_bin_val(encoding_table[256]); + /* Code of the end of encoding */ + huff_enc_fill_encoding(); + /* Fills the last byte before closing file, if any */ + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + huff_enc_init(); + huff_enc_main(); + return (huff_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/inline/huff_enc.c b/targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/inline/huff_enc.c new file mode 100644 index 0000000..afe126f --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/generated/modified_sources/inline/huff_enc.c @@ -0,0 +1,618 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: huff_enc + + Author: David Bourgin (David.Bourgin@ufrima.imag.fr) + + Function: Example of Huffman encoding + + Source: ftp://turing.imag.fr/pub/compression/ (1994-09-22) + + Original name: codhuff.c + + Changes: I/O to char arrays instead of file i/o. + Dynamic memory allocation replaced by array. + Explicit sorting algorithm. + + License: + + The source code files (codrl1.c, dcodrl1.c, codrle2.c, dcodrle2.c, codrle3.c, + dcodrle3.c, codrle4.c, dcodrle4.c, codhuff.c, dcodhuff.c) are copyrighted. + They have been uploaded on ftp in turing.imag.fr + (129.88.31.7):/pub/compression on 22/5/94 and have been modified on 22/9/94. + (c) David Bourgin - 1994 + The source codes I provide have no buggs (!) but being that I make them + available for free I have some notes to make. They can change at any time + without notice. I assume no responsability or liability for any errors or + inaccurracies, make no warranty of any kind (express, implied or statutory) + with respect to this publication and expressly disclaim any and all warranties + of merchantability, fitness for particular purposes. Of course, if you have + some problems to use the information presented here, I will try to help you if + I can. + + If you include the source codes in your application, here are the conditions: + - You have to put my name in the header of your source file (not in the + excutable program if you don't want) (this item is a must) + - I would like to see your resulting application, if possible (this item is + not a must, because some applications must remain secret) + - Whenever you gain money with your application, I would like to receive a + very little part in order to be encouraged to update my source codes and to + develop new schemes (this item is not a must) + +*/ + +/* + Declaration of types +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +typedef struct huff_enc_s_tree { + unsigned int byte; /* A byte has to be coded as an unsigned integer to + allow a node to have a value over 255 */ + unsigned long int weight; + struct huff_enc_s_tree *left_ptr; + struct huff_enc_s_tree *right_ptr; +} huff_enc_t_tree; + +typedef struct { + unsigned char bits[32]; + unsigned int bits_nb; +} huff_enc_t_bin_val; + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void huff_enc_init(void); +__attribute__((always_inline)) static inline int huff_enc_return(void); +__attribute__((always_inline)) static inline void huff_enc_beginning_of_data(); +__attribute__((always_inline)) static inline int huff_enc_end_of_data(); +__attribute__((always_inline)) static inline int huff_enc_read_byte(); +__attribute__((always_inline)) static inline void huff_enc_write_byte(char ch); +__attribute__((always_inline)) static inline void +huff_enc_write_bin_val(huff_enc_t_bin_val bin_val); +__attribute__((always_inline)) static inline void huff_enc_fill_encoding(void); +__attribute__((always_inline)) static inline void +huff_enc_write_header(huff_enc_t_bin_val codes_table[257]); +__attribute__((always_inline)) static inline int +huff_enc_weighhuff_enc_t_tree_comp(const void *t1, const void *t2); +__attribute__((always_inline)) static inline void +huff_enc_swapi(char *ii, char *ij, unsigned long es); +__attribute__((always_inline)) static inline char * +huff_enc_pivot(char *a, unsigned long n, unsigned long es); +__attribute__((always_inline)) static inline void +huff_enc_qsort(char *a, unsigned long n, unsigned long es); +__attribute__((always_inline)) static inline huff_enc_t_tree * +huff_enc_build_tree_encoding(huff_enc_t_tree heap[514]); +__attribute__((always_inline)) static inline void +huff_enc_encode_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257], + huff_enc_t_bin_val *code_val); +__attribute__((always_inline)) static inline void +huff_enc_create_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257]); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +huff_enc_main(); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +static int huff_enc_input_pos; +static int huff_enc_output_pos; +static unsigned char huff_enc_output[1024]; +static unsigned char huff_enc_byte_nb_to_write = 0; +static unsigned char huff_enc_val_to_write = 0; + +/* + Initialization- and return-value-related functions +*/ + +#define huff_enc_plaintext_len 600 +static const char *huff_enc_plaintext = + "You are doubtless asking \"How can I reduce the data size without losing " + "some informations?\". It's easy to answer to this question. I'll only " + "take " + "an example. I'm sure you have heard about the morse. This system " + "established " + "in the 19th century use a scheme very close to the huffman one. In the " + "morse " + "you encode the letters to transmit with two kinds of signs. If you encode " + "these two sign possibilities in one bit, the symbol 'e' is transmitted in " + "a " + "single bit and the symbols 'y' and 'z' need four bits. Look at the " + "symbols " + "in the text you are reading, you'll fast understand the compression " + "ratio..."; + +#define huff_enc_encoded_len 419 +static unsigned char huff_enc_encoded[huff_enc_encoded_len] = { + 128, 0, 0, 0, 80, 133, 32, 32, 128, 100, 4, 32, 63, 239, 255, + 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 167, 21, 129, 232, 69, 120, 132, 217, 20, 162, 19, + 164, 39, 133, 252, 138, 105, 20, 194, 19, 129, 240, 172, 138, 248, 150, + 11, 11, 240, 201, 68, 64, 114, 53, 17, 42, 37, 195, 128, 212, 116, + 194, 41, 98, 52, 51, 12, 132, 112, 244, 3, 36, 33, 52, 39, 135, + 164, 33, 62, 156, 87, 14, 110, 22, 87, 50, 85, 198, 99, 142, 140, + 194, 81, 78, 158, 84, 129, 254, 129, 248, 110, 179, 159, 192, 145, 133, + 184, 184, 28, 210, 96, 146, 73, 10, 226, 21, 83, 152, 74, 13, 111, + 132, 199, 202, 219, 241, 74, 193, 167, 105, 222, 31, 147, 6, 55, 31, + 129, 40, 232, 52, 153, 160, 148, 18, 36, 197, 45, 216, 202, 86, 30, + 31, 177, 90, 133, 138, 248, 23, 81, 195, 160, 100, 215, 93, 50, 185, + 225, 251, 23, 6, 230, 225, 229, 112, 71, 80, 96, 141, 205, 176, 230, + 85, 196, 9, 24, 93, 90, 121, 225, 76, 68, 152, 63, 25, 107, 140, + 101, 204, 214, 77, 26, 194, 96, 18, 48, 77, 210, 137, 1, 253, 4, + 230, 248, 56, 240, 224, 111, 163, 95, 10, 12, 223, 7, 234, 167, 129, + 40, 36, 96, 135, 125, 245, 250, 2, 198, 120, 127, 0, 145, 133, 213, + 167, 135, 149, 195, 67, 235, 108, 9, 24, 87, 17, 102, 152, 37, 4, + 222, 131, 188, 144, 73, 36, 128, 73, 20, 81, 152, 177, 133, 248, 28, + 165, 131, 120, 127, 240, 242, 184, 104, 125, 109, 129, 35, 30, 4, 145, + 65, 202, 88, 9, 138, 103, 44, 205, 100, 167, 24, 152, 11, 24, 51, + 37, 66, 9, 24, 31, 174, 202, 212, 49, 152, 18, 96, 155, 208, 119, + 146, 45, 97, 48, 56, 28, 194, 90, 224, 204, 144, 232, 176, 36, 96, + 126, 187, 43, 83, 12, 121, 129, 209, 96, 197, 35, 2, 54, 176, 249, + 92, 208, 204, 145, 188, 41, 170, 180, 71, 16, 36, 96, 126, 187, 43, + 83, 19, 0, 145, 129, 100, 209, 15, 43, 135, 55, 6, 238, 180, 194, + 90, 17, 229, 115, 21, 168, 251, 140, 131, 162, 217, 166, 93, 22, 4, + 140, 31, 91, 166, 55, 25, 202, 192, 111, 20, 171, 207, 39, 192, +}; + +__attribute__((always_inline)) static inline void +huff_enc_init(void) { + huff_enc_input_pos = 0; + huff_enc_output_pos = 0; +} + +__attribute__((always_inline)) static inline int +huff_enc_return(void) { + int i; + __pragma_loopbound(419, 419); + for (i = 0; i < huff_enc_encoded_len; i++) { + if (huff_enc_encoded[i] != huff_enc_output[i]) + return i + 1; + } + return 0; +} + +/* + Input / output functions +*/ + +__attribute__((always_inline)) static inline void +huff_enc_beginning_of_data() { + huff_enc_input_pos = 0; +} + +__attribute__((always_inline)) static inline int +huff_enc_end_of_data() { + return huff_enc_input_pos >= huff_enc_plaintext_len; +} + +__attribute__((always_inline)) static inline int +huff_enc_read_byte() { + return huff_enc_plaintext[huff_enc_input_pos++]; +} + +__attribute__((always_inline)) static inline void +huff_enc_write_byte(char ch) { + huff_enc_output[huff_enc_output_pos++] = ch; +} + +__attribute__((always_inline)) static inline void +huff_enc_write_bin_val(huff_enc_t_bin_val bin_val) +/* Returned parameters: None + Action: Writes in the output stream the value binary-coded into 'bin_val' + Errors: An input/output error could disturb the running of the program +*/ +{ + unsigned char bit_indice; + unsigned char bin_pos = (bin_val.bits_nb - 1) & 7; + unsigned int pos_byte = (bin_val.bits_nb - 1) >> 3; + + __pragma_loopbound(1, 9); + for (bit_indice = 1; bit_indice <= bin_val.bits_nb; bit_indice++) { + /* Watch for the current bit to write */ + huff_enc_val_to_write = (huff_enc_val_to_write << 1) | + ((bin_val.bits[pos_byte] >> bin_pos) & 1); + /* Move to the next bit to write */ + if (!bin_pos) { + pos_byte--; + bin_pos = 7; + } else + bin_pos--; + if (huff_enc_byte_nb_to_write == 7) { + /* Are already 8 bits written? */ + huff_enc_write_byte(huff_enc_val_to_write); + huff_enc_byte_nb_to_write = 0; + huff_enc_val_to_write = 0; + } else /* No, then the next writting will be in the next bit */ + huff_enc_byte_nb_to_write++; + } +} + +__attribute__((always_inline)) static inline void +huff_enc_fill_encoding(void) +/* Returned parameters: None + Action: Fills the last byte to write in the output stream with zero values + Errors: An input/output error could disturb the running of the program +*/ +{ + if (huff_enc_byte_nb_to_write) + huff_enc_write_byte(huff_enc_val_to_write + << (8 - huff_enc_byte_nb_to_write)); +} + +__attribute__((always_inline)) static inline void +huff_enc_write_header(huff_enc_t_bin_val codes_table[257]) +/* Returned parameters: None + Action: Writes the header in the stream of codes + Errors: An input/output error could disturb the running of the program +*/ +{ + unsigned int i, j; + huff_enc_t_bin_val bin_val_to_0; + huff_enc_t_bin_val bin_val_to_1; + huff_enc_t_bin_val bin_val; + /* Is used to send in binary mode via huff_enc_write_bin_val */ + + *bin_val_to_0.bits = 0; + bin_val_to_0.bits_nb = 1; + *bin_val_to_1.bits = 1; + bin_val_to_1.bits_nb = 1; + __pragma_loopbound(256, 256); + for (i = 0, j = 0; j <= 255; j++) + if (codes_table[j].bits_nb) + i++; + /* From there, i contains the number of bytes of the several + non 0 occurrences to encode. + First part of the header: Specifies the bytes that appear + in the source of encoding */ + if (i < 32) { + /* Encoding of the appeared bytes with a block of bytes */ + huff_enc_write_bin_val(bin_val_to_0); + bin_val.bits_nb = 5; + *bin_val.bits = (unsigned char) (i - 1); + huff_enc_write_bin_val(bin_val); + bin_val.bits_nb = 8; + _Pragma( + "loopbound min 256 max 256") for (j = 0; j <= 255; + j++) if (codes_table[j].bits_nb) { + *bin_val.bits = (unsigned char) j; + huff_enc_write_bin_val(bin_val); + } + } else { + /* Encoding of the appeared bytes with a block of bits */ + huff_enc_write_bin_val(bin_val_to_1); + _Pragma( + "loopbound min 256 max 256") for (j = 0; j <= 255; + j++) if (codes_table[j].bits_nb) + huff_enc_write_bin_val(bin_val_to_1); + else huff_enc_write_bin_val(bin_val_to_0); + }; + /* Second part of the header: Specifies the encoding of the bytes + (fictive or not) that appear in the source of encoding */ + __pragma_loopbound(257, 257); + for (i = 0; i <= 256; i++) + if ((j = codes_table[i].bits_nb) != 0) { + if (j < 33) { + huff_enc_write_bin_val(bin_val_to_0); + bin_val.bits_nb = 5; + } else { + huff_enc_write_bin_val(bin_val_to_1); + bin_val.bits_nb = 8; + } + *bin_val.bits = (unsigned char) (j - 1); + huff_enc_write_bin_val(bin_val); + huff_enc_write_bin_val(codes_table[i]); + } +} + +__attribute__((always_inline)) static inline int +huff_enc_weighhuff_enc_t_tree_comp(const void *t1, const void *t2) +/* Returned parameters: Returns a comparison status + Action: Returns a negative, zero or positive integer depending on the weight + of 'tree2' is less than, equal to, or greater than the weight of + 'tree1' + Errors: None +*/ +{ + huff_enc_t_tree *const *tree1 = (huff_enc_t_tree *const *) t1; + huff_enc_t_tree *const *tree2 = (huff_enc_t_tree *const *) t2; + return ((*tree2)->weight ^ (*tree1)->weight) + ? (((*tree2)->weight < (*tree1)->weight) ? -1 : 1) + : 0; +} + +__attribute__((always_inline)) static inline void +huff_enc_swapi(char *ii, char *ij, unsigned long es) { + char *i, *j, c; + + i = (char *) ii; + j = (char *) ij; + __pragma_loopbound(8, 8); + do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof(char); + } while (es != 0); +} + +__attribute__((always_inline)) static inline char * +huff_enc_pivot(char *a, unsigned long n, unsigned long es) { + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + if (huff_enc_weighhuff_enc_t_tree_comp(pi, pj) < 0) { + if (huff_enc_weighhuff_enc_t_tree_comp(pi, pk) < 0) { + if (huff_enc_weighhuff_enc_t_tree_comp(pj, pk) < 0) + return pj; + return pk; + } + return pi; + } + if (huff_enc_weighhuff_enc_t_tree_comp(pj, pk) < 0) { + if (huff_enc_weighhuff_enc_t_tree_comp(pi, pk) < 0) + return pi; + return pk; + } + return pj; +} + +void +huff_enc_qsort(char *a, unsigned long n, + unsigned long es) // wird insgesamt 648 ausgeführt (rekursion) +{ + unsigned long j; + char *pi, *pj, *pn; + unsigned int flowfactdummy = 0; + __pragma_loopbound(0, 7); + while (n > 1) { + if (n > 10) + pi = huff_enc_pivot(a, n, es); + + else + pi = a + (n >> 1) * es; + + huff_enc_swapi(a, pi, es); + pi = a; + pn = a + n * es; + pj = pn; + __pragma_loopbound(0, 109); + while (1) { + /* wcc note: this assignment expression was added to avoid + assignment of multiple loop bound annotations to same loop (cf. + Ticket #0002323). */ + flowfactdummy++; + __pragma_loopbound(1, 19); + do { + pi += es; + } while (pi < pn && huff_enc_weighhuff_enc_t_tree_comp(pi, a) < 0); + __pragma_loopbound(1, 25); + do { + pj -= es; + } while (pj > a && huff_enc_weighhuff_enc_t_tree_comp(pj, a) > 0); + if (pj < pi) + break; + huff_enc_swapi(pi, pj, es); + } + huff_enc_swapi(a, pj, es); + j = (pj - a) / es; + + n = n - j - 1; + if (j >= n) { + huff_enc_qsort(a, j, es); + a += (j + 1) * es; + } else { + huff_enc_qsort(a + (j + 1) * es, n, es); + n = j; + } + } +} + +__attribute__((always_inline)) static inline huff_enc_t_tree * +huff_enc_build_tree_encoding(huff_enc_t_tree heap[514]) +/* Returned parameters: Returns a tree of encoding + Action: Generates an Huffman encoding tree based on the data from + the stream to compress + Errors: None +*/ +{ + unsigned int i; + unsigned int heap_top = 0; + huff_enc_t_tree *occurrences_table[257]; + huff_enc_t_tree *ptr_fictive_tree; + + /* Sets up the occurrences number of all bytes to 0 */ + __pragma_loopbound(257, 257); + for (i = 0; i <= 256; i++) { + occurrences_table[i] = &heap[heap_top++]; + occurrences_table[i]->byte = i; + occurrences_table[i]->weight = 0; + occurrences_table[i]->left_ptr = 0; + occurrences_table[i]->right_ptr = 0; + } + /* Valids the occurrences of 'occurrences_table' with regard to the data to + compress */ + if (!huff_enc_end_of_data()) { + __pragma_loopbound(600, 600); + while (!huff_enc_end_of_data()) { + i = huff_enc_read_byte(); + occurrences_table[i]->weight++; + } + occurrences_table[256]->weight = 1; + + /* Sorts the occurrences table depending on the weight of each character + */ + huff_enc_qsort((char *) occurrences_table, 257, + sizeof(huff_enc_t_tree *)); + + _Pragma( + "loopbound min 218 max 218") for (i = 256; + (i != 0) && + (!occurrences_table[i]->weight); + i--); + i++; + /* From there, 'i' gives the number of different bytes with a 0 + occurrence in the stream to compress */ + __pragma_loopbound(38, 38); + while (i > 0) { + /* Looks up (i+1)/2 times the occurrence table to link the nodes in + an unique tree */ + ptr_fictive_tree = &heap[heap_top++]; + ptr_fictive_tree->byte = 257; + ptr_fictive_tree->weight = occurrences_table[--i]->weight; + ptr_fictive_tree->left_ptr = occurrences_table[i]; + if (i) { + i--; + ptr_fictive_tree->weight += occurrences_table[i]->weight; + ptr_fictive_tree->right_ptr = occurrences_table[i]; + } else + ptr_fictive_tree->right_ptr = 0; + occurrences_table[i] = ptr_fictive_tree; + + // qsort( ( char * )occurrences_table, i + 1, sizeof( + // *huff_enc_t_tree ), huff_enc_weighhuff_enc_t_tree_comp ); + huff_enc_qsort((char *) occurrences_table, i + 1, + sizeof(huff_enc_t_tree *)); + + if (i) /* Is there an other node in the occurrence tables? */ + i++; /* Yes, then takes care to the fictive node */ + } + } + return (*occurrences_table); +} + +__attribute__((always_inline)) static inline void +huff_enc_encode_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257], + huff_enc_t_bin_val *code_val) +/* Returned parameters: The data of 'codes_table' can have been modified + Action: Stores the encoding tree as a binary encoding table to speed up the + access. 'val_code' gives the encoding for the current node of the tree + Errors: None +*/ +{ + unsigned int i; + huff_enc_t_bin_val tmp_code_val; + + if (tree->byte == 257) { + if (tree->left_ptr != 0) + /* The sub-trees on left begin with an bit set to 1 */ + { + tmp_code_val = *code_val; + __pragma_loopbound(31, 31); + for (i = 31; i > 0; i--) + code_val->bits[i] = + (code_val->bits[i] << 1) | (code_val->bits[i - 1] >> 7); + *code_val->bits = (*code_val->bits << 1) | 1; + code_val->bits_nb++; + huff_enc_encode_codes_table(tree->left_ptr, codes_table, code_val); + *code_val = tmp_code_val; + }; + if (tree->right_ptr != 0) + /* The sub-trees on right begin with an bit set to 0 */ + { + tmp_code_val = *code_val; + __pragma_loopbound(31, 31); + for (i = 31; i > 0; i--) + code_val->bits[i] = + (code_val->bits[i] << 1) | (code_val->bits[i - 1] >> 7); + *code_val->bits <<= 1; + code_val->bits_nb++; + huff_enc_encode_codes_table(tree->right_ptr, codes_table, code_val); + *code_val = tmp_code_val; + }; + } else + codes_table[tree->byte] = *code_val; +} + +__attribute__((always_inline)) static inline void +huff_enc_create_codes_table(huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[257]) +/* Returned parameters: The data in 'codes_table' will be modified + Action: Stores the encoding tree as a binary encoding table to speed up + the access by calling encode_codes_table + Errors: None +*/ +{ + unsigned int i, j; + huff_enc_t_bin_val code_val; + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + code_val.bits[i] = 0; + code_val.bits_nb = 0; + __pragma_loopbound(257, 257); + for (j = 0; j < 257; j++) { + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + codes_table[j].bits[i] = 0; + codes_table[j].bits_nb = 0; + } + _Pragma("marker call_encode") _Pragma( + "flowrestriction 1*huff_enc_encode_codes_table <= 77*call_encode") + huff_enc_encode_codes_table(tree, codes_table, &code_val); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +huff_enc_main() +/* Returned parameters: None + Action: Compresses with Huffman method all bytes read by the function + 'huff_enc_read_byte' + Errors: None +*/ +{ + huff_enc_t_tree *tree; + huff_enc_t_tree heap[514]; + huff_enc_t_bin_val encoding_table[257]; + unsigned char byte_read; + + if (!huff_enc_end_of_data()) { + /* Generates only whether there are data */ + tree = huff_enc_build_tree_encoding(heap); + /* Creation of the best adapted tree */ + huff_enc_create_codes_table(tree, encoding_table); + /* Obtains the binary encoding in an array to speed up the accesses */ + huff_enc_write_header(encoding_table); + /* Writes the defintion of the encoding */ + huff_enc_beginning_of_data(); /* Real compression of the data */ + __pragma_loopbound(600, 600); + while (!huff_enc_end_of_data()) { + byte_read = huff_enc_read_byte(); + huff_enc_write_bin_val(encoding_table[byte_read]); + } + huff_enc_write_bin_val(encoding_table[256]); + /* Code of the end of encoding */ + huff_enc_fill_encoding(); + /* Fills the last byte before closing file, if any */ + } +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + huff_enc_init(); + huff_enc_main(); + return (huff_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/huff_enc/huff_enc.c b/targets/wasm-tacle/sequential/huff_enc/huff_enc.c new file mode 100755 index 0000000..a2768dc --- /dev/null +++ b/targets/wasm-tacle/sequential/huff_enc/huff_enc.c @@ -0,0 +1,589 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: huff_enc + + Author: David Bourgin (David.Bourgin@ufrima.imag.fr) + + Function: Example of Huffman encoding + + Source: ftp://turing.imag.fr/pub/compression/ (1994-09-22) + + Original name: codhuff.c + + Changes: I/O to char arrays instead of file i/o. + Dynamic memory allocation replaced by array. + Explicit sorting algorithm. + + License: + + The source code files (codrl1.c, dcodrl1.c, codrle2.c, dcodrle2.c, codrle3.c, + dcodrle3.c, codrle4.c, dcodrle4.c, codhuff.c, dcodhuff.c) are copyrighted. + They have been uploaded on ftp in turing.imag.fr (129.88.31.7):/pub/compression + on 22/5/94 and have been modified on 22/9/94. + (c) David Bourgin - 1994 + The source codes I provide have no buggs (!) but being that I make them + available for free I have some notes to make. They can change at any time + without notice. I assume no responsability or liability for any errors or + inaccurracies, make no warranty of any kind (express, implied or statutory) + with respect to this publication and expressly disclaim any and all warranties + of merchantability, fitness for particular purposes. Of course, if you have + some problems to use the information presented here, I will try to help you if + I can. + + If you include the source codes in your application, here are the conditions: + - You have to put my name in the header of your source file (not in the + excutable program if you don't want) (this item is a must) + - I would like to see your resulting application, if possible (this item is not + a must, because some applications must remain secret) + - Whenever you gain money with your application, I would like to receive a very + little part in order to be encouraged to update my source codes and to develop + new schemes (this item is not a must) + +*/ + + +/* + Declaration of types +*/ +typedef struct huff_enc_s_tree { + unsigned int byte; /* A byte has to be coded as an unsigned integer to + allow a node to have a value over 255 */ + unsigned long int weight; + struct huff_enc_s_tree *left_ptr; + struct huff_enc_s_tree *right_ptr; +} huff_enc_t_tree; + +typedef struct { + unsigned char bits[ 32 ]; + unsigned int bits_nb; +} huff_enc_t_bin_val; + + +/* + Forward declaration of functions +*/ + +void huff_enc_init( void ); +int huff_enc_return( void ); +void huff_enc_beginning_of_data(); +int huff_enc_end_of_data(); +int huff_enc_read_byte(); +void huff_enc_write_byte( char ch ); +void huff_enc_write_bin_val( huff_enc_t_bin_val bin_val ); +void huff_enc_fill_encoding( void ); +void huff_enc_write_header( huff_enc_t_bin_val codes_table[ 257 ] ); +int huff_enc_weighhuff_enc_t_tree_comp( const void *t1, const void *t2 ); +void huff_enc_swapi( char *ii, char *ij, unsigned long es ); +char *huff_enc_pivot( char *a, unsigned long n, unsigned long es ); +void huff_enc_qsort( char *a, unsigned long n, unsigned long es ); +huff_enc_t_tree *huff_enc_build_tree_encoding( huff_enc_t_tree heap[ 514 ] ); +void huff_enc_encode_codes_table( huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[ 257 ], huff_enc_t_bin_val *code_val ); +void huff_enc_create_codes_table( huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[ 257 ] ); +void huff_enc_main(); +int main( void ); + + +/* + Declaration of global variables +*/ + +static int huff_enc_input_pos; +static int huff_enc_output_pos; +static unsigned char huff_enc_output[ 1024 ]; +static unsigned char huff_enc_byte_nb_to_write = 0; +static unsigned char huff_enc_val_to_write = 0; + + +/* + Initialization- and return-value-related functions +*/ + +#define huff_enc_plaintext_len 600 +static const char *huff_enc_plaintext = + "You are doubtless asking \"How can I reduce the data size without losing " + "some informations?\". It's easy to answer to this question. I'll only take " + "an example. I'm sure you have heard about the morse. This system established " + "in the 19th century use a scheme very close to the huffman one. In the morse " + "you encode the letters to transmit with two kinds of signs. If you encode " + "these two sign possibilities in one bit, the symbol 'e' is transmitted in a " + "single bit and the symbols 'y' and 'z' need four bits. Look at the symbols " + "in the text you are reading, you'll fast understand the compression ratio..."; + +#define huff_enc_encoded_len 419 +static unsigned char huff_enc_encoded[ huff_enc_encoded_len ] = { + 128, 0, 0, 0, 80, 133, 32, 32, 128, 100, 4, 32, 63, 239, 255, 240, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 7, 167, 21, 129, 232, 69, 120, 132, 217, 20, 162, 19, 164, 39, 133, + 252, 138, 105, 20, 194, 19, 129, 240, 172, 138, 248, 150, 11, 11, 240, 201, + 68, 64, 114, 53, 17, 42, 37, 195, 128, 212, 116, 194, 41, 98, 52, 51, + 12, 132, 112, 244, 3, 36, 33, 52, 39, 135, 164, 33, 62, 156, 87, 14, + 110, 22, 87, 50, 85, 198, 99, 142, 140, 194, 81, 78, 158, 84, 129, 254, + 129, 248, 110, 179, 159, 192, 145, 133, 184, 184, 28, 210, 96, 146, 73, 10, + 226, 21, 83, 152, 74, 13, 111, 132, 199, 202, 219, 241, 74, 193, 167, 105, + 222, 31, 147, 6, 55, 31, 129, 40, 232, 52, 153, 160, 148, 18, 36, 197, + 45, 216, 202, 86, 30, 31, 177, 90, 133, 138, 248, 23, 81, 195, 160, 100, + 215, 93, 50, 185, 225, 251, 23, 6, 230, 225, 229, 112, 71, 80, 96, 141, + 205, 176, 230, 85, 196, 9, 24, 93, 90, 121, 225, 76, 68, 152, 63, 25, + 107, 140, 101, 204, 214, 77, 26, 194, 96, 18, 48, 77, 210, 137, 1, 253, + 4, 230, 248, 56, 240, 224, 111, 163, 95, 10, 12, 223, 7, 234, 167, 129, + 40, 36, 96, 135, 125, 245, 250, 2, 198, 120, 127, 0, 145, 133, 213, 167, + 135, 149, 195, 67, 235, 108, 9, 24, 87, 17, 102, 152, 37, 4, 222, 131, + 188, 144, 73, 36, 128, 73, 20, 81, 152, 177, 133, 248, 28, 165, 131, 120, + 127, 240, 242, 184, 104, 125, 109, 129, 35, 30, 4, 145, 65, 202, 88, 9, + 138, 103, 44, 205, 100, 167, 24, 152, 11, 24, 51, 37, 66, 9, 24, 31, + 174, 202, 212, 49, 152, 18, 96, 155, 208, 119, 146, 45, 97, 48, 56, 28, + 194, 90, 224, 204, 144, 232, 176, 36, 96, 126, 187, 43, 83, 12, 121, 129, + 209, 96, 197, 35, 2, 54, 176, 249, 92, 208, 204, 145, 188, 41, 170, 180, + 71, 16, 36, 96, 126, 187, 43, 83, 19, 0, 145, 129, 100, 209, 15, 43, + 135, 55, 6, 238, 180, 194, 90, 17, 229, 115, 21, 168, 251, 140, 131, 162, + 217, 166, 93, 22, 4, 140, 31, 91, 166, 55, 25, 202, 192, 111, 20, 171, + 207, 39, 192, +}; + + +void huff_enc_init( void ) +{ + huff_enc_input_pos = 0; + huff_enc_output_pos = 0; +} + + +int huff_enc_return( void ) +{ + int i; + _Pragma( "loopbound min 419 max 419" ) + for ( i = 0; i < huff_enc_encoded_len; i++ ) { + if ( huff_enc_encoded[ i ] != huff_enc_output[ i ] ) return i + 1; + } + return 0; +} + + +/* + Input / output functions +*/ + +void huff_enc_beginning_of_data() +{ + huff_enc_input_pos = 0; +} + + +int huff_enc_end_of_data() +{ + return huff_enc_input_pos >= huff_enc_plaintext_len; +} + + +int huff_enc_read_byte() +{ + return huff_enc_plaintext[ huff_enc_input_pos++ ]; +} + + +void huff_enc_write_byte( char ch ) +{ + huff_enc_output[ huff_enc_output_pos++ ] = ch; +} + + +void huff_enc_write_bin_val( huff_enc_t_bin_val bin_val ) +/* Returned parameters: None + Action: Writes in the output stream the value binary-coded into 'bin_val' + Errors: An input/output error could disturb the running of the program +*/ +{ + unsigned char bit_indice; + unsigned char bin_pos = ( bin_val.bits_nb - 1 ) & 7; + unsigned int pos_byte = ( bin_val.bits_nb - 1 ) >> 3; + + _Pragma( "loopbound min 1 max 9" ) + for ( bit_indice = 1; + bit_indice <= bin_val.bits_nb; + bit_indice++ ) { + /* Watch for the current bit to write */ + huff_enc_val_to_write = ( huff_enc_val_to_write << 1 ) | + ( ( bin_val.bits[ pos_byte ] >> bin_pos ) & 1 ); + /* Move to the next bit to write */ + if ( !bin_pos ) { + pos_byte--; + bin_pos = 7; + } else bin_pos--; + if ( huff_enc_byte_nb_to_write == 7 ) { + /* Are already 8 bits written? */ + huff_enc_write_byte( huff_enc_val_to_write ); + huff_enc_byte_nb_to_write = 0; + huff_enc_val_to_write = 0; + } else /* No, then the next writting will be in the next bit */ + huff_enc_byte_nb_to_write++; + } +} + + +void huff_enc_fill_encoding( void ) +/* Returned parameters: None + Action: Fills the last byte to write in the output stream with zero values + Errors: An input/output error could disturb the running of the program +*/ +{ + if ( huff_enc_byte_nb_to_write ) + huff_enc_write_byte( huff_enc_val_to_write << + ( 8 - huff_enc_byte_nb_to_write ) ); +} + + +void huff_enc_write_header( huff_enc_t_bin_val codes_table[ 257 ] ) +/* Returned parameters: None + Action: Writes the header in the stream of codes + Errors: An input/output error could disturb the running of the program +*/ +{ + unsigned int i, j; + huff_enc_t_bin_val bin_val_to_0; + huff_enc_t_bin_val bin_val_to_1; + huff_enc_t_bin_val bin_val; + /* Is used to send in binary mode via huff_enc_write_bin_val */ + + *bin_val_to_0.bits = 0; + bin_val_to_0.bits_nb = 1; + *bin_val_to_1.bits = 1; + bin_val_to_1.bits_nb = 1; + _Pragma( "loopbound min 256 max 256" ) + for ( i = 0, j = 0; j <= 255; j++ ) + if ( codes_table[ j ].bits_nb ) i++; + /* From there, i contains the number of bytes of the several + non 0 occurrences to encode. + First part of the header: Specifies the bytes that appear + in the source of encoding */ + if ( i < 32 ) { + /* Encoding of the appeared bytes with a block of bytes */ + huff_enc_write_bin_val( bin_val_to_0 ); + bin_val.bits_nb = 5; + *bin_val.bits = ( unsigned char )( i - 1 ); + huff_enc_write_bin_val( bin_val ); + bin_val.bits_nb = 8; + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j <= 255; j++ ) + if ( codes_table[ j ].bits_nb ) { + *bin_val.bits = ( unsigned char )j; + huff_enc_write_bin_val( bin_val ); + } + } else { + /* Encoding of the appeared bytes with a block of bits */ + huff_enc_write_bin_val( bin_val_to_1 ); + _Pragma( "loopbound min 256 max 256" ) + for ( j = 0; j <= 255; j++ ) + if ( codes_table[ j ].bits_nb ) + huff_enc_write_bin_val( bin_val_to_1 ); + else huff_enc_write_bin_val( bin_val_to_0 ); + }; + /* Second part of the header: Specifies the encoding of the bytes + (fictive or not) that appear in the source of encoding */ + _Pragma( "loopbound min 257 max 257" ) + for ( i = 0; i <= 256; i++ ) + if ( ( j = codes_table[ i ].bits_nb ) != 0 ) { + if ( j < 33 ) { + huff_enc_write_bin_val( bin_val_to_0 ); + bin_val.bits_nb = 5; + } else { + huff_enc_write_bin_val( bin_val_to_1 ); + bin_val.bits_nb = 8; + } + *bin_val.bits = ( unsigned char )( j - 1 ); + huff_enc_write_bin_val( bin_val ); + huff_enc_write_bin_val( codes_table[ i ] ); + } +} + + +int huff_enc_weighhuff_enc_t_tree_comp( const void *t1, const void *t2 ) +/* Returned parameters: Returns a comparison status + Action: Returns a negative, zero or positive integer depending on the weight + of 'tree2' is less than, equal to, or greater than the weight of + 'tree1' + Errors: None +*/ +{ + huff_enc_t_tree *const *tree1 = ( huff_enc_t_tree * const * ) t1; + huff_enc_t_tree *const *tree2 = ( huff_enc_t_tree * const * ) t2; + return ( ( *tree2 )->weight ^ ( *tree1 )->weight ) + ? ( ( ( *tree2 )->weight < ( *tree1 )->weight ) ? -1 : 1 ) : 0; +} + + +void huff_enc_swapi( char *ii, char *ij, unsigned long es ) +{ + char *i, *j, c; + + i = ( char * )ii; + j = ( char * )ij; + _Pragma( "loopbound min 8 max 8" ) + do { + c = *i; + *i++ = *j; + *j++ = c; + es -= sizeof( char ); + } while ( es != 0 ); +} + + +char *huff_enc_pivot( char *a, unsigned long n, unsigned long es ) +{ + long j; + char *pi, *pj, *pk; + + j = n / 6 * es; + pi = a + j; /* 1/6 */ + j += j; + pj = pi + j; /* 1/2 */ + pk = pj + j; /* 5/6 */ + if ( huff_enc_weighhuff_enc_t_tree_comp( pi, pj ) < 0 ) { + if ( huff_enc_weighhuff_enc_t_tree_comp( pi, pk ) < 0 ) { + if ( huff_enc_weighhuff_enc_t_tree_comp( pj, pk ) < 0 ) + return pj; + return pk; + } + return pi; + } + if ( huff_enc_weighhuff_enc_t_tree_comp( pj, pk ) < 0 ) { + if ( huff_enc_weighhuff_enc_t_tree_comp( pi, pk ) < 0 ) + return pi; + return pk; + } + return pj; +} + + +void huff_enc_qsort( char *a, unsigned long n, unsigned long es ) //wird insgesamt 648 ausgeführt (rekursion) +{ + unsigned long j; + char *pi, *pj, *pn; + unsigned int flowfactdummy = 0; + _Pragma( "loopbound min 0 max 7" ) + while ( n > 1 ) { + if ( n > 10 ) + pi = huff_enc_pivot( a, n, es ); + + else + pi = a + ( n >> 1 ) * es; + + huff_enc_swapi( a, pi, es ); + pi = a; + pn = a + n * es; + pj = pn; + _Pragma( "loopbound min 0 max 109" ) + while ( 1 ) { + /* wcc note: this assignment expression was added to avoid assignment of + multiple loop bound annotations to same loop (cf. Ticket #0002323). */ + flowfactdummy++; + _Pragma( "loopbound min 1 max 19" ) + do { + pi += es; + } while ( pi < pn && huff_enc_weighhuff_enc_t_tree_comp( pi, a ) < 0 ); + _Pragma( "loopbound min 1 max 25" ) + do { + pj -= es; + } while ( pj > a && huff_enc_weighhuff_enc_t_tree_comp( pj, a ) > 0 ); + if ( pj < pi ) + break; + huff_enc_swapi( pi, pj, es ); + } + huff_enc_swapi( a, pj, es ); + j = ( pj - a ) / es; + + n = n - j - 1; + if ( j >= n ) { + huff_enc_qsort( a, j, es ); + a += ( j + 1 ) * es; + } else { + huff_enc_qsort( a + ( j + 1 )*es, n, es ); + n = j; + } + } +} + + +huff_enc_t_tree *huff_enc_build_tree_encoding( huff_enc_t_tree heap[ 514 ] ) +/* Returned parameters: Returns a tree of encoding + Action: Generates an Huffman encoding tree based on the data from + the stream to compress + Errors: None +*/ +{ + unsigned int i; + unsigned int heap_top = 0; + huff_enc_t_tree *occurrences_table[ 257 ]; + huff_enc_t_tree *ptr_fictive_tree; + + /* Sets up the occurrences number of all bytes to 0 */ + _Pragma( "loopbound min 257 max 257" ) + for ( i = 0; i <= 256; i++ ) { + occurrences_table[ i ] = &heap[ heap_top++ ]; + occurrences_table[ i ]->byte = i; + occurrences_table[ i ]->weight = 0; + occurrences_table[ i ]->left_ptr = 0; + occurrences_table[ i ]->right_ptr = 0; + } + /* Valids the occurrences of 'occurrences_table' with regard to the data to + compress */ + if ( !huff_enc_end_of_data() ) { + _Pragma( "loopbound min 600 max 600" ) + while ( !huff_enc_end_of_data() ) { + i = huff_enc_read_byte(); + occurrences_table[ i ]->weight++; + } + occurrences_table[ 256 ]->weight = 1; + + /* Sorts the occurrences table depending on the weight of each character */ + huff_enc_qsort( ( char * )occurrences_table, 257, sizeof( huff_enc_t_tree * ) ); + + _Pragma( "loopbound min 218 max 218" ) + for ( i = 256; ( i != 0 ) && ( !occurrences_table[ i ]->weight ); i-- ) + ; + i++; + /* From there, 'i' gives the number of different bytes with a 0 occurrence + in the stream to compress */ + _Pragma( "loopbound min 38 max 38" ) + while ( i > 0 ) { + /* Looks up (i+1)/2 times the occurrence table to link the nodes in an + unique tree */ + ptr_fictive_tree = &heap[ heap_top++ ]; + ptr_fictive_tree->byte = 257; + ptr_fictive_tree->weight = occurrences_table[ --i ]->weight; + ptr_fictive_tree->left_ptr = occurrences_table[ i ]; + if ( i ) { + i--; + ptr_fictive_tree->weight += occurrences_table[ i ]->weight; + ptr_fictive_tree->right_ptr = occurrences_table[ i ]; + } else ptr_fictive_tree->right_ptr = 0; + occurrences_table[ i ] = ptr_fictive_tree; + + //qsort( ( char * )occurrences_table, i + 1, sizeof( *huff_enc_t_tree ), + //huff_enc_weighhuff_enc_t_tree_comp ); + huff_enc_qsort( ( char * )occurrences_table, i + 1, + sizeof( huff_enc_t_tree * ) ); + + if ( i ) /* Is there an other node in the occurrence tables? */ + i++; /* Yes, then takes care to the fictive node */ + } + } + return ( *occurrences_table ); +} + + +void huff_enc_encode_codes_table( huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[ 257 ], + huff_enc_t_bin_val *code_val ) +/* Returned parameters: The data of 'codes_table' can have been modified + Action: Stores the encoding tree as a binary encoding table to speed up the + access. 'val_code' gives the encoding for the current node of the tree + Errors: None +*/ +{ + unsigned int i; + huff_enc_t_bin_val tmp_code_val; + + if ( tree->byte == 257 ) { + if ( tree->left_ptr != 0 ) + /* The sub-trees on left begin with an bit set to 1 */ + { + tmp_code_val = *code_val; + _Pragma( "loopbound min 31 max 31" ) + for ( i = 31; i > 0; i-- ) + code_val->bits[ i ] = ( code_val->bits[ i ] << 1 ) | + ( code_val->bits[ i - 1 ] >> 7 ); + *code_val->bits = ( *code_val->bits << 1 ) | 1; + code_val->bits_nb++; + huff_enc_encode_codes_table( tree->left_ptr, codes_table, code_val ); + *code_val = tmp_code_val; + }; + if ( tree->right_ptr != 0 ) + /* The sub-trees on right begin with an bit set to 0 */ + { + tmp_code_val = *code_val; + _Pragma( "loopbound min 31 max 31" ) + for ( i = 31; i > 0; i-- ) + code_val->bits[ i ] = ( code_val->bits[ i ] << 1 ) | + ( code_val->bits[ i - 1 ] >> 7 ); + *code_val->bits <<= 1; + code_val->bits_nb++; + huff_enc_encode_codes_table( tree->right_ptr, codes_table, code_val ); + *code_val = tmp_code_val; + }; + } else codes_table[ tree->byte ] = *code_val; +} + + +void huff_enc_create_codes_table( huff_enc_t_tree *tree, + huff_enc_t_bin_val codes_table[ 257 ] ) +/* Returned parameters: The data in 'codes_table' will be modified + Action: Stores the encoding tree as a binary encoding table to speed up + the access by calling encode_codes_table + Errors: None +*/ +{ + unsigned int i, j; + huff_enc_t_bin_val code_val; + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + code_val.bits[ i ] = 0; + code_val.bits_nb = 0; + _Pragma( "loopbound min 257 max 257" ) + for ( j = 0; j < 257; j++ ) { + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + codes_table[ j ].bits[ i ] = 0; + codes_table[ j ].bits_nb = 0; + } + _Pragma( "marker call_encode" ) + _Pragma( "flowrestriction 1*huff_enc_encode_codes_table <= 77*call_encode" ) + huff_enc_encode_codes_table( tree, codes_table, &code_val ); +} + + +void _Pragma( "entrypoint" ) huff_enc_main() +/* Returned parameters: None + Action: Compresses with Huffman method all bytes read by the function + 'huff_enc_read_byte' + Errors: None +*/ +{ + huff_enc_t_tree *tree; + huff_enc_t_tree heap[ 514 ]; + huff_enc_t_bin_val encoding_table[ 257 ]; + unsigned char byte_read; + + if ( !huff_enc_end_of_data() ) { + /* Generates only whether there are data */ + tree = huff_enc_build_tree_encoding( heap ); + /* Creation of the best adapted tree */ + huff_enc_create_codes_table( tree, encoding_table ); + /* Obtains the binary encoding in an array to speed up the accesses */ + huff_enc_write_header( encoding_table ); + /* Writes the defintion of the encoding */ + huff_enc_beginning_of_data(); /* Real compression of the data */ + _Pragma( "loopbound min 600 max 600" ) + while ( !huff_enc_end_of_data() ) { + byte_read = huff_enc_read_byte(); + huff_enc_write_bin_val( encoding_table[ byte_read ] ); + } + huff_enc_write_bin_val( encoding_table[ 256 ] ); + /* Code of the end of encoding */ + huff_enc_fill_encoding(); + /* Fills the last byte before closing file, if any */ + } +} + + +int main( void ) +{ + huff_enc_init(); + huff_enc_main(); + return ( huff_enc_return() ); +} diff --git a/targets/wasm-tacle/sequential/mpeg2/CMakeLists.txt b/targets/wasm-tacle/sequential/mpeg2/CMakeLists.txt new file mode 100644 index 0000000..8e093e5 --- /dev/null +++ b/targets/wasm-tacle/sequential/mpeg2/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(mpeg2) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/mpeg2.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/mpeg2.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/mpeg2/ChangeLog.txt b/targets/wasm-tacle/sequential/mpeg2/ChangeLog.txt new file mode 100755 index 0000000..f644576 --- /dev/null +++ b/targets/wasm-tacle/sequential/mpeg2/ChangeLog.txt @@ -0,0 +1,35 @@ +File: mpeg2.c +Original provenience: MediaBench II benchmark suite, + http://euler.slu.edu/~fritts/mediabench (mirror) + +2015-11-05: +- Removed original header comment, replaced by TACLeBench header. +- Removed unnecessary preprocessor macros, integrated required preprocessor + macros directly in the source code. +- Added prefix "mpeg2_" to all global symbols. +- Added explicit forward declarations of functions. +- Added TACLeBench-compliant initialization code. +- Added new function mpeg2_return producing a checksum as return value. +- Added new function mpeg2_main according to TACLeBench guidelines. + mpeg2_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur diff --git a/targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wasm b/targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wasm new file mode 100755 index 0000000000000000000000000000000000000000..442cbe508169eeb8eec5657cef4751fc30107100 GIT binary patch literal 115108 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%0Aj% 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wat b/targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wat new file mode 100644 index 0000000..59976b2 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wat @@ -0,0 +1,3687 @@ +(module $rijndael_dec.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (type (;3;) (func (param i32 i32 i32 i32) (result i32))) + (type (;4;) (func (param i32 i32 i32) (result i32))) + (type (;5;) (func (param i32) (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $rijndael_dec_init (type 1) + (local i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + i32.const 17616 + i32.store offset=50388 + i32.const 0 + i32.const 0 + i32.store offset=50396 + local.get 0 + i32.const 0 + i32.store offset=12 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.const 32768 + i32.xor + i32.store offset=50392 + i32.const 32768 + i32.const 32768 + call $__pragma_loopbound + block ;; label = @1 + i32.const 0 + i32.load offset=50392 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.set 1 + loop ;; label = @2 + i32.const 0 + i32.load offset=50388 + local.get 1 + i32.add + local.tee 2 + local.get 0 + i32.load offset=12 + local.get 2 + i32.load8_u + i32.xor + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.const 0 + i32.load offset=50392 + i32.lt_u + br_if 0 (;@2;) + end + end + i32.const 64 + i32.const 64 + call $__pragma_loopbound + i32.const 0 + local.set 3 + i32.const 0 + local.set 1 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + loop ;; label = @4 + local.get 1 + i32.const 1024 + i32.add + local.tee 2 + i32.load8_u + i32.eqz + br_if 1 (;@3;) + i32.const -48 + local.set 4 + block ;; label = @5 + local.get 2 + i32.load8_s + call $rijndael_dec_toupper + i32.extend8_s + local.tee 5 + i32.const -48 + i32.add + i32.const 10 + i32.lt_u + br_if 0 (;@5;) + i32.const -55 + local.set 4 + local.get 5 + i32.const -65 + i32.add + i32.const 6 + i32.lt_u + br_if 0 (;@5;) + i32.const 0 + i32.const -2 + i32.store offset=50384 + br 4 (;@1;) + end + local.get 1 + i32.const 1 + i32.add + local.set 2 + local.get 3 + i32.const 4 + i32.shl + local.get 4 + i32.add + local.get 5 + i32.add + local.set 3 + block ;; label = @5 + local.get 1 + i32.const 1 + i32.and + i32.eqz + br_if 0 (;@5;) + local.get 2 + i32.const 1 + i32.shr_u + i32.const 50399 + i32.add + local.get 3 + i32.store8 + end + local.get 2 + local.set 1 + local.get 2 + i32.const 64 + i32.ne + br_if 0 (;@4;) + end + local.get 2 + i32.const 1024 + i32.add + local.set 2 + i32.const 64 + local.set 1 + br 1 (;@2;) + end + local.get 1 + i32.const 1024 + i32.add + local.set 2 + end + block ;; label = @2 + local.get 2 + i32.load8_u + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.const -3 + i32.store offset=50384 + br 1 (;@1;) + end + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const 32 + i32.lt_u + br_if 0 (;@3;) + local.get 1 + i32.const 15 + i32.and + i32.eqz + br_if 1 (;@2;) + end + i32.const 0 + i32.const -4 + i32.store offset=50384 + br 1 (;@1;) + end + i32.const 0 + local.get 1 + i32.const 1 + i32.shr_u + i32.store offset=50432 + end + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $rijndael_dec_decfile (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 2 + global.set $__stack_pointer + local.get 2 + i32.const 32 + i32.add + i32.const 1 + i32.const 16 + local.get 0 + call $rijndael_dec_fread + drop + block ;; label = @1 + block ;; label = @2 + local.get 2 + i32.const 16 + i32.add + i32.const 1 + i32.const 16 + local.get 0 + call $rijndael_dec_fread + i32.const -17 + i32.and + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.const -10 + i32.store offset=50384 + br 1 (;@1;) + end + local.get 2 + i32.const 16 + i32.add + local.get 2 + local.get 1 + call $rijndael_dec_decrypt + drop + i32.const 0 + i32.const 0 + i32.load offset=50384 + local.get 2 + i32.load8_u offset=15 + i32.add + i32.store offset=50384 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 2 + local.get 2 + i32.load8_u + local.get 2 + i32.load8_u offset=32 + i32.xor + i32.store8 + local.get 2 + local.get 2 + i32.load8_u offset=1 + local.get 2 + i32.load8_u offset=33 + i32.xor + i32.store8 offset=1 + local.get 2 + local.get 2 + i32.load8_u offset=2 + local.get 2 + i32.load8_u offset=34 + i32.xor + i32.store8 offset=2 + local.get 2 + local.get 2 + i32.load8_u offset=3 + local.get 2 + i32.load8_u offset=35 + i32.xor + i32.store8 offset=3 + local.get 2 + local.get 2 + i32.load8_u offset=4 + local.get 2 + i32.load8_u offset=36 + i32.xor + i32.store8 offset=4 + local.get 2 + local.get 2 + i32.load8_u offset=5 + local.get 2 + i32.load8_u offset=37 + i32.xor + i32.store8 offset=5 + local.get 2 + local.get 2 + i32.load8_u offset=6 + local.get 2 + i32.load8_u offset=38 + i32.xor + i32.store8 offset=6 + local.get 2 + local.get 2 + i32.load8_u offset=7 + local.get 2 + i32.load8_u offset=39 + i32.xor + i32.store8 offset=7 + local.get 2 + local.get 2 + i32.load8_u offset=8 + local.get 2 + i32.load8_u offset=40 + i32.xor + i32.store8 offset=8 + local.get 2 + local.get 2 + i32.load8_u offset=9 + local.get 2 + i32.load8_u offset=41 + i32.xor + i32.store8 offset=9 + local.get 2 + local.get 2 + i32.load8_u offset=10 + local.get 2 + i32.load8_u offset=42 + i32.xor + i32.store8 offset=10 + local.get 2 + local.get 2 + i32.load8_u offset=11 + local.get 2 + i32.load8_u offset=43 + i32.xor + i32.store8 offset=11 + local.get 2 + local.get 2 + i32.load8_u offset=12 + local.get 2 + i32.load8_u offset=44 + i32.xor + i32.store8 offset=12 + local.get 2 + local.get 2 + i32.load8_u offset=13 + local.get 2 + i32.load8_u offset=45 + i32.xor + i32.store8 offset=13 + local.get 2 + local.get 2 + i32.load8_u offset=14 + local.get 2 + i32.load8_u offset=46 + i32.xor + i32.store8 offset=14 + local.get 2 + local.get 2 + i32.load8_u offset=15 + local.get 2 + i32.load8_u offset=47 + i32.xor + i32.store8 offset=15 + i32.const 2046 + i32.const 2046 + call $__pragma_loopbound + local.get 2 + i32.const 32 + i32.add + i32.const 1 + i32.const 16 + local.get 0 + call $rijndael_dec_fread + i32.const 16 + i32.ne + br_if 0 (;@1;) + local.get 2 + i32.const 16 + i32.add + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.set 4 + loop ;; label = @2 + local.get 4 + local.tee 5 + local.get 2 + local.get 1 + call $rijndael_dec_decrypt + drop + i32.const 0 + i32.const 0 + i32.load offset=50384 + local.get 2 + i32.load8_u offset=15 + i32.add + i32.store offset=50384 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 2 + local.get 2 + i32.load8_u + local.get 3 + i32.load8_u + i32.xor + i32.store8 + local.get 2 + local.get 2 + i32.load8_u offset=1 + local.get 3 + i32.load8_u offset=1 + i32.xor + i32.store8 offset=1 + local.get 2 + local.get 2 + i32.load8_u offset=2 + local.get 3 + i32.load8_u offset=2 + i32.xor + i32.store8 offset=2 + local.get 2 + local.get 2 + i32.load8_u offset=3 + local.get 3 + i32.load8_u offset=3 + i32.xor + i32.store8 offset=3 + local.get 2 + local.get 2 + i32.load8_u offset=4 + local.get 3 + i32.load8_u offset=4 + i32.xor + i32.store8 offset=4 + local.get 2 + local.get 2 + i32.load8_u offset=5 + local.get 3 + i32.load8_u offset=5 + i32.xor + i32.store8 offset=5 + local.get 2 + local.get 2 + i32.load8_u offset=6 + local.get 3 + i32.load8_u offset=6 + i32.xor + i32.store8 offset=6 + local.get 2 + local.get 2 + i32.load8_u offset=7 + local.get 3 + i32.load8_u offset=7 + i32.xor + i32.store8 offset=7 + local.get 2 + local.get 2 + i32.load8_u offset=8 + local.get 3 + i32.load8_u offset=8 + i32.xor + i32.store8 offset=8 + local.get 2 + local.get 2 + i32.load8_u offset=9 + local.get 3 + i32.load8_u offset=9 + i32.xor + i32.store8 offset=9 + local.get 2 + local.get 2 + i32.load8_u offset=10 + local.get 3 + i32.load8_u offset=10 + i32.xor + i32.store8 offset=10 + local.get 2 + local.get 2 + i32.load8_u offset=11 + local.get 3 + i32.load8_u offset=11 + i32.xor + i32.store8 offset=11 + local.get 2 + local.get 2 + i32.load8_u offset=12 + local.get 3 + i32.load8_u offset=12 + i32.xor + i32.store8 offset=12 + local.get 2 + local.get 2 + i32.load8_u offset=13 + local.get 3 + i32.load8_u offset=13 + i32.xor + i32.store8 offset=13 + local.get 2 + local.get 2 + i32.load8_u offset=14 + local.get 3 + i32.load8_u offset=14 + i32.xor + i32.store8 offset=14 + local.get 2 + local.get 2 + i32.load8_u offset=15 + local.get 3 + i32.load8_u offset=15 + i32.xor + i32.store8 offset=15 + local.get 3 + i32.const 1 + i32.const 16 + local.get 0 + call $rijndael_dec_fread + local.set 6 + local.get 3 + local.set 4 + local.get 5 + local.set 3 + local.get 6 + i32.const 16 + i32.eq + br_if 0 (;@2;) + end + end + local.get 2 + i32.const 48 + i32.add + global.set $__stack_pointer) + (func $rijndael_dec_main (type 1) + (local i32) + global.get $__stack_pointer + i32.const 528 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 50400 + i32.const 0 + i32.load offset=50432 + i32.const 2 + local.get 0 + call $rijndael_dec_set_key + drop + i32.const 50388 + local.get 0 + call $rijndael_dec_decfile + local.get 0 + i32.const 528 + i32.add + global.set $__stack_pointer) + (func $__original_main (type 2) (result i32) + call $rijndael_dec_init + call $rijndael_dec_main + i32.const -1 + i32.const 0 + i32.const 0 + i32.load offset=50384 + i32.const 262180 + i32.ne + select) + (func $rijndael_dec_set_key (type 3) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 1 + i32.const 7 + i32.and + br_if 0 (;@7;) + local.get 1 + i32.const -33 + i32.add + i32.const -17 + i32.lt_u + br_if 0 (;@7;) + local.get 2 + i32.const 3 + i32.and + local.tee 4 + i32.eqz + br_if 1 (;@6;) + local.get 3 + local.get 1 + i32.const 2 + i32.shr_u + local.tee 2 + i32.store + local.get 3 + local.get 2 + i32.const 6 + i32.add + i32.const 10 + local.get 1 + i32.const 16 + i32.gt_u + select + local.tee 5 + i32.store offset=4 + local.get 3 + local.get 0 + i32.load + i32.store offset=8 + local.get 3 + local.get 0 + i32.load offset=4 + i32.store offset=12 + local.get 3 + local.get 0 + i32.load offset=8 + i32.store offset=16 + local.get 3 + local.get 3 + i32.load8_u offset=520 + i32.const 252 + i32.and + local.get 4 + i32.or + i32.store8 offset=520 + local.get 3 + local.get 0 + i32.load offset=12 + i32.store offset=20 + local.get 3 + i32.const 8 + i32.add + local.tee 6 + local.get 5 + i32.const 4 + i32.shl + i32.add + local.get 1 + i32.sub + i32.const 16 + i32.add + local.set 4 + local.get 2 + i32.const -4 + i32.add + br_table 3 (;@4;) 6 (;@1;) 4 (;@3;) 6 (;@1;) 5 (;@2;) 6 (;@1;) + end + local.get 1 + i32.eqz + br_if 1 (;@5;) + end + local.get 3 + local.get 3 + i32.load8_u offset=520 + i32.const 252 + i32.and + i32.store8 offset=520 + i32.const 0 + i32.extend16_s + return + end + local.get 3 + i32.load16_u + i32.const 2 + i32.shl + i32.extend16_s + return + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 6 + i32.load + local.set 2 + i32.const 1104 + local.set 5 + local.get 3 + local.set 1 + loop ;; label = @4 + local.get 1 + i32.const 24 + i32.add + local.tee 6 + local.get 1 + i32.const 20 + i32.add + i32.load + local.tee 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 5328 + i32.add + i32.load + local.get 2 + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 6352 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 7376 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 8400 + i32.add + i32.load + i32.xor + local.get 5 + i32.load + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 28 + i32.add + local.get 1 + i32.const 12 + i32.add + i32.load + local.get 2 + i32.xor + local.tee 7 + i32.store + local.get 1 + i32.const 32 + i32.add + local.get 1 + i32.const 16 + i32.add + local.tee 8 + i32.load + local.get 7 + i32.xor + local.tee 7 + i32.store + local.get 1 + i32.const 36 + i32.add + local.get 7 + local.get 0 + i32.xor + i32.store + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 8 + local.set 1 + local.get 6 + local.get 4 + i32.lt_u + br_if 0 (;@4;) + br 3 (;@1;) + end + end + local.get 3 + local.get 0 + i32.load offset=16 + i32.store offset=24 + local.get 3 + local.get 0 + i32.load offset=20 + i32.store offset=28 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 3 + i32.load offset=8 + local.set 2 + i32.const 1104 + local.set 5 + local.get 3 + local.set 1 + loop ;; label = @3 + local.get 1 + i32.const 32 + i32.add + local.tee 6 + local.get 1 + i32.const 28 + i32.add + i32.load + local.tee 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 5328 + i32.add + i32.load + local.get 2 + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 6352 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 7376 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 8400 + i32.add + i32.load + i32.xor + local.get 5 + i32.load + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 36 + i32.add + local.get 1 + i32.const 12 + i32.add + i32.load + local.get 2 + i32.xor + local.tee 7 + i32.store + local.get 1 + i32.const 40 + i32.add + local.get 1 + i32.const 16 + i32.add + i32.load + local.get 7 + i32.xor + local.tee 7 + i32.store + local.get 1 + i32.const 44 + i32.add + local.get 1 + i32.const 20 + i32.add + i32.load + local.get 7 + i32.xor + local.tee 7 + i32.store + local.get 1 + i32.const 48 + i32.add + local.get 1 + i32.const 24 + i32.add + local.tee 8 + i32.load + local.get 7 + i32.xor + local.tee 7 + i32.store + local.get 1 + i32.const 52 + i32.add + local.get 7 + local.get 0 + i32.xor + i32.store + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 8 + local.set 1 + local.get 6 + local.get 4 + i32.lt_u + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + local.get 0 + i32.load offset=16 + i32.store offset=24 + local.get 3 + local.get 0 + i32.load offset=20 + i32.store offset=28 + local.get 3 + local.get 0 + i32.load offset=24 + i32.store offset=32 + local.get 3 + local.get 0 + i32.load offset=28 + i32.store offset=36 + i32.const 7 + i32.const 7 + call $__pragma_loopbound + local.get 3 + i32.load offset=8 + local.set 5 + i32.const 1104 + local.set 6 + local.get 3 + local.set 1 + loop ;; label = @2 + local.get 1 + i32.const 40 + i32.add + local.tee 7 + local.get 1 + i32.const 36 + i32.add + i32.load + local.tee 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 5328 + i32.add + i32.load + local.get 5 + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 6352 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 7376 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 8400 + i32.add + i32.load + i32.xor + local.get 6 + i32.load + i32.xor + local.tee 5 + i32.store + local.get 1 + i32.const 44 + i32.add + local.get 1 + i32.const 12 + i32.add + i32.load + local.get 5 + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 48 + i32.add + local.get 1 + i32.const 16 + i32.add + i32.load + local.get 2 + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 52 + i32.add + local.get 1 + i32.const 20 + i32.add + i32.load + local.get 2 + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 56 + i32.add + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 5328 + i32.add + i32.load + local.get 1 + i32.const 24 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 6352 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 7376 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 8400 + i32.add + i32.load + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 60 + i32.add + local.get 1 + i32.const 28 + i32.add + i32.load + local.get 2 + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 64 + i32.add + local.get 1 + i32.const 32 + i32.add + local.tee 8 + i32.load + local.get 2 + i32.xor + local.tee 2 + i32.store + local.get 1 + i32.const 68 + i32.add + local.get 2 + local.get 0 + i32.xor + i32.store + local.get 6 + i32.const 4 + i32.add + local.set 6 + local.get 8 + local.set 1 + local.get 7 + local.get 4 + i32.lt_u + br_if 0 (;@2;) + end + end + block ;; label = @1 + local.get 3 + i32.load8_u offset=520 + i32.const 3 + i32.and + i32.const 1 + i32.eq + br_if 0 (;@1;) + local.get 3 + local.get 3 + i32.load offset=4 + i32.const 4 + i32.shl + local.tee 4 + i32.add + local.tee 2 + i32.const 264 + i32.add + local.tee 0 + local.get 3 + i32.load offset=8 + i32.store + local.get 2 + i32.const 268 + i32.add + local.get 3 + i64.load offset=12 align=4 + i64.store align=4 + local.get 2 + i32.const 276 + i32.add + local.get 3 + i32.load offset=20 + i32.store + i32.const 13 + i32.const 13 + call $__pragma_loopbound + i32.const 24 + local.set 5 + block ;; label = @2 + block ;; label = @3 + local.get 3 + i32.load offset=4 + i32.const 2 + i32.ge_u + br_if 0 (;@3;) + local.get 3 + i32.const 24 + i32.add + local.set 1 + local.get 2 + i32.const 248 + i32.add + local.set 3 + br 1 (;@2;) + end + i32.const 1 + local.set 6 + loop ;; label = @3 + local.get 3 + local.get 4 + i32.add + local.tee 1 + i32.const 248 + i32.add + local.get 3 + local.get 5 + i32.add + local.tee 0 + i32.load + local.tee 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 14544 + i32.add + i32.load + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 13520 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 15568 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 16592 + i32.add + i32.load + i32.xor + i32.store + local.get 1 + i32.const 252 + i32.add + local.get 0 + i32.const 4 + i32.add + i32.load + local.tee 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 14544 + i32.add + i32.load + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 13520 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 15568 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 16592 + i32.add + i32.load + i32.xor + i32.store + local.get 1 + i32.const 256 + i32.add + local.get 0 + i32.const 8 + i32.add + i32.load + local.tee 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 14544 + i32.add + i32.load + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 13520 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 15568 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 16592 + i32.add + i32.load + i32.xor + i32.store + local.get 1 + i32.const 260 + i32.add + local.get 0 + i32.const 12 + i32.add + i32.load + local.tee 1 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 14544 + i32.add + i32.load + local.get 1 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 13520 + i32.add + i32.load + i32.xor + local.get 1 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 15568 + i32.add + i32.load + i32.xor + local.get 1 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 16592 + i32.add + i32.load + i32.xor + i32.store + local.get 5 + i32.const 16 + i32.add + local.set 5 + local.get 4 + i32.const -16 + i32.add + local.set 4 + local.get 6 + i32.const 1 + i32.add + local.tee 6 + local.get 3 + i32.load offset=4 + i32.lt_u + br_if 0 (;@3;) + end + local.get 3 + local.get 5 + i32.add + local.set 1 + local.get 3 + local.get 4 + i32.add + local.tee 0 + i32.const 248 + i32.add + local.set 3 + local.get 0 + i32.const 264 + i32.add + local.set 0 + end + local.get 3 + local.get 1 + i32.load + i32.store + local.get 0 + i32.const -12 + i32.add + local.get 1 + i32.load offset=4 + i32.store + local.get 0 + i32.const -8 + i32.add + local.get 1 + i32.load offset=8 + i32.store + local.get 0 + i32.const -4 + i32.add + local.get 1 + i32.load offset=12 + i32.store + end + i32.const 1 + i32.extend16_s) + (func $rijndael_dec_decrypt (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32) + i32.const 0 + local.set 3 + block ;; label = @1 + local.get 2 + i32.load8_u offset=520 + i32.const 2 + i32.and + i32.eqz + br_if 0 (;@1;) + local.get 2 + i32.const 280 + i32.add + local.set 3 + local.get 2 + i32.load offset=276 + local.get 0 + i32.load offset=12 + i32.xor + local.set 4 + local.get 2 + i32.load offset=272 + local.get 0 + i32.load offset=8 + i32.xor + local.set 5 + local.get 2 + i32.load offset=268 + local.get 0 + i32.load offset=4 + i32.xor + local.set 6 + local.get 2 + i32.load offset=264 + local.get 0 + i32.load + i32.xor + local.set 0 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.load offset=4 + i32.const -10 + i32.add + br_table 2 (;@3;) 3 (;@2;) 1 (;@4;) 3 (;@2;) 0 (;@5;) 3 (;@2;) + end + local.get 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=292 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 3 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=308 + i32.xor + local.get 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=288 + i32.xor + local.get 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=284 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=280 + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 4 + local.get 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=304 + i32.xor + local.get 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 3 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 5 + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=300 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 3 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 6 + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 2 + i32.load offset=296 + i32.xor + local.get 3 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 0 + local.get 2 + i32.const 312 + i32.add + local.set 3 + end + local.get 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=12 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=28 + i32.xor + local.get 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=8 + i32.xor + local.get 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=4 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 4 + local.get 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=24 + i32.xor + local.get 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 5 + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=20 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 6 + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=16 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.set 0 + local.get 3 + i32.const 32 + i32.add + local.set 3 + end + local.get 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=12 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=28 + i32.xor + local.get 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=8 + i32.xor + local.get 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=4 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=44 + i32.xor + local.get 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=24 + i32.xor + local.get 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=20 + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=16 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=60 + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=40 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=36 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=32 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=76 + i32.xor + local.get 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=56 + i32.xor + local.get 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=52 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=48 + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=92 + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=72 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=68 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=64 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=108 + i32.xor + local.get 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=88 + i32.xor + local.get 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=84 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=80 + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 4 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=124 + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=104 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=100 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=96 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 5 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=140 + i32.xor + local.get 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=120 + i32.xor + local.get 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 6 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=116 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 4 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 0 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=112 + i32.xor + local.get 4 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 7 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 9424 + i32.add + i32.load + local.get 3 + i32.load offset=156 + i32.xor + local.get 6 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=136 + i32.xor + local.get 0 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 8 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 10448 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=132 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 5 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 9 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 11472 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 1232 + i32.add + i32.load + local.get 3 + i32.load offset=128 + i32.xor + local.get 5 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 2256 + i32.add + i32.load + i32.xor + local.get 6 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 3280 + i32.add + i32.load + i32.xor + local.get 0 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 4304 + i32.add + i32.load + i32.xor + local.tee 2 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 12496 + i32.add + i32.load + i32.xor + local.set 4 + local.get 8 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 9424 + i32.add + i32.load + local.get 3 + i32.load offset=152 + i32.xor + local.get 9 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 10448 + i32.add + i32.load + i32.xor + local.get 2 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 11472 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 12496 + i32.add + i32.load + i32.xor + local.set 5 + local.get 9 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 9424 + i32.add + i32.load + local.get 3 + i32.load offset=148 + i32.xor + local.get 2 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 10448 + i32.add + i32.load + i32.xor + local.get 7 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 11472 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 12496 + i32.add + i32.load + i32.xor + local.set 6 + local.get 2 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 9424 + i32.add + i32.load + local.get 3 + i32.load offset=144 + i32.xor + local.get 7 + i32.const 6 + i32.shr_u + i32.const 1020 + i32.and + i32.const 10448 + i32.add + i32.load + i32.xor + local.get 8 + i32.const 14 + i32.shr_u + i32.const 1020 + i32.and + i32.const 11472 + i32.add + i32.load + i32.xor + local.get 9 + i32.const 22 + i32.shr_u + i32.const 1020 + i32.and + i32.const 12496 + i32.add + i32.load + i32.xor + local.set 0 + end + local.get 1 + local.get 4 + i32.store offset=12 + local.get 1 + local.get 5 + i32.store offset=8 + local.get 1 + local.get 6 + i32.store offset=4 + local.get 1 + local.get 0 + i32.store + i32.const 1 + local.set 3 + end + local.get 3) + (func $rijndael_dec_toupper (type 5) (param i32) (result i32) + local.get 0 + i32.const -32 + i32.add + local.get 0 + local.get 0 + i32.const -97 + i32.add + i32.const 26 + i32.lt_u + select) + (func $rijndael_dec_fread (type 3) (param i32 i32 i32 i32) (result i32) + (local i32 i32) + local.get 3 + i32.load offset=4 + local.set 4 + local.get 3 + i32.load offset=8 + local.set 5 + i32.const 0 + i32.const 16 + call $__pragma_loopbound + block ;; label = @1 + local.get 5 + local.get 3 + i32.load offset=8 + local.get 4 + local.get 5 + i32.sub + local.tee 4 + local.get 2 + local.get 1 + i32.mul + local.tee 1 + local.get 4 + local.get 1 + i32.lt_u + select + local.tee 1 + i32.add + local.tee 2 + i32.ge_u + br_if 0 (;@1;) + loop ;; label = @2 + local.get 0 + local.get 3 + i32.load + local.get 5 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + local.get 3 + i32.load offset=8 + local.get 1 + i32.add + local.tee 2 + i32.lt_u + br_if 0 (;@2;) + end + end + local.get 3 + local.get 2 + i32.store offset=8 + local.get 1) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 54544)) + (global (;1;) i32 (i32.const 50436)) + (global (;2;) i32 (i32.const 54544)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $rijndael_dec_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\04\00\00\00\08\00\00\00\10\00\00\00 \00\00\00@\00\00\00\80\00\00\00\1b\00\00\006\00\00\00l\00\00\00\d8\00\00\00\ab\00\00\00M\00\00\00\9a\00\00\00/\00\00\00^\00\00\00\bc\00\00\00c\00\00\00\c6\00\00\00\97\00\00\005\00\00\00j\00\00\00\d4\00\00\00\b3\00\00\00}\00\00\00\fa\00\00\00\ef\00\00\00\c5\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00Q\f4\a7P~AeS\1a\17\a4\c3:'^\96;\abk\cb\1f\9dE\f1\ac\faX\abK\e3\03\93 0\faU\advm\f6\88\ccv\91\f5\02L%O\e5\d7\fc\c5*\cb\d7&5D\80\b5b\a3\8f\de\b1ZI%\ba\1bgE\ea\0e\98]\fe\c0\e1\c3/u\02\81L\f0\12\8dF\97\a3k\d3\f9\c6\03\8f_\e7\15\92\9c\95\bfmz\eb\95RY\da\d4\be\83-Xt!\d3I\e0i)\8e\c9\c8Du\c2\89j\f4\8eyx\99X>k'\b9q\dd\be\e1O\b6\f0\88\ad\17\c9 \acf}\ce:\b4c\dfJ\18\e5\1a1\82\97Q3`bS\7fE\b1dw\e0\bbk\ae\84\fe\81\a0\1c\f9\08+\94pHhX\8fE\fd\19\94\del\87R{\f8\b7\abs\d3#rK\02\e2\e3\1f\8fWfU\ab*\b2\eb(\07/\b5\c2\03\86\c5{\9a\d37\08\a50(\87\f2#\bf\a5\b2\02\03j\ba\ed\16\82\5c\8a\cf\1c+\a7y\b4\92\f3\07\f2\f0Ni\e2\a1e\da\f4\cd\06\05\be\d5\d14b\1f\c4\a6\fe\8a4.S\9d\a2\f3U\a0\05\8a\e12\a4\f6\ebu\0b\83\ec9@`\ef\aa^q\9f\06\bdn\10Q>!\8a\f9\96\dd\06=\dd>\05\aeM\e6\bdF\91T\8d\b5q\c4]\05\04\06\d4o`P\15\ff\19\98\fb$\d6\bd\e9\97\89@C\ccg\d9\9ew\b0\e8B\bd\07\89\8b\88\e7\19[8y\c8\ee\db\a1|\0aG|B\0f\e9\f8\84\1e\c9\00\00\00\00\09\80\86\832+\edH\1e\11p\aclZrN\fd\0e\ff\fb\0f\858V=\ae\d5\1e6-9'\0a\0f\d9dh\5c\a6!\9b[T\d1$6.:\0c\0ag\b1\93W\e7\0f\b4\ee\96\d2\1b\9b\91\9e\80\c0\c5Oa\dc \a2ZwKi\1c\12\1a\16\e2\93\ba\0a\c0\a0*\e5<\22\e0C\12\1b\17\1d\0e\09\0d\0b\f2\8b\c7\ad-\b6\a8\b9\14\1e\a9\c8W\f1\19\85\afu\07L\ee\99\dd\bb\a3\7f`\fd\f7\01&\9f\5cr\f5\bcDf;\c5[\fb~4\8bC)v\cb#\c6\dc\b6\ed\fch\b8\e4\f1c\d71\dc\caBc\85\10\13\97\22@\84\c6\11 \85J$}\d2\bb=\f8\ae\f92\11\c7)\a1m\1d\9e/K\dc\b20\f3\0d\86R\ecw\c1\e3\d0+\b3\16l\a9p\b9\99\11\94H\faG\e9d\22\a8\fc\8c\c4\a0\f0?\1aV},\d8\223\90\ef\87IN\c7\d98\d1\c1\8c\ca\a2\fe\98\d4\0b6\a6\f5\81\cf\a5z\de(\da\b7\8e&?\ad\bf\a4,:\9d\e4Px\92\0dj_\cc\9bT~Fb\f6\8d\13\c2\90\d8\b8\e8.9\f7^\82\c3\af\f5\9f]\80\bei\d0\93|o\d5-\a9\cf%\12\b3\c8\ac\99;\10\18}\a7\e8\9ccn\db;\bb{\cd&x\09nY\18\f4\ec\9a\b7\01\83O\9a\a8\e6\95ne\aa\ff\e6~!\bc\cf\08\ef\15\e8\e6\ba\e7\9b\d9Jo6\ce\ea\9f\09\d4)\b0|\d61\a4\b2\af*?#1\c6\a5\9405\a2f\c0tN\bc7\fc\82\ca\a6\e0\90\d0\b03\a7\d8\15\f1\04\98JA\ec\da\f7\7f\cdP\0e\17\91\f6/vM\d6\8dC\ef\b0M\cc\aaMT\e4\96\04\df\9e\d1\b5\e3Lj\88\1b\c1,\1f\b8FeQ\7f\9d^\ea\04\01\8c5]\fa\87ts\fb\0bA.\b3g\1dZ\92\db\d2R\e9\10V3m\d6G\13\9a\d7a\8c7\a1\0czY\f8\14\8e\eb\13<\89\ce\a9'\ee\b7a\c95\e1\1c\e5\edzG\b1<\9c\d2\dfYU\f2s?\18\14\ceys\c77\bfS\f7\cd\ea_\fd\aa[\df=o\14xD\db\86\ca\af\f3\81\b9h\c4>8$4,\c2\a3@_\16\1d\c3r\bc\e2%\0c(\dd'\b9q\b6\be\e1O\17\f0\88\adf\c9 \ac\b4}\ce:\18c\dfJ\82\e5\1a1`\97Q3EbS\7f\e0\b1dw\84\bbk\ae\1c\fe\81\a0\94\f9\08+XpHh\19\8fE\fd\87\94\del\b7R{\f8#\abs\d3\e2rK\02W\e3\1f\8f*fU\ab\07\b2\eb(\03/\b5\c2\9a\86\c5{\a5\d37\08\f20(\87\b2#\bf\a5\ba\02\03j\5c\ed\16\82+\8a\cf\1c\92\a7y\b4\f0\f3\07\f2\a1Ni\e2\cde\da\f4\d5\06\05\be\1f\d14b\8a\c4\a6\fe\9d4.S\a0\a2\f3U2\05\8a\e1u\a4\f6\eb9\0b\83\ec\aa@`\ef\06^q\9fQ\bdn\10\f9>!\8a=\96\dd\06\ae\dd>\05FM\e6\bd\b5\91T\8d\05q\c4]o\04\06\d4\ff`P\15$\19\98\fb\97\d6\bd\e9\cc\89@Cwg\d9\9e\bd\b0\e8B\88\07\89\8b8\e7\19[\dby\c8\eeG\a1|\0a\e9|B\0f\c9\f8\84\1e\00\00\00\00\83\09\80\86H2+\ed\ac\1e\11pNlZr\fb\fd\0e\ffV\0f\858\1e=\ae\d5'6-9d\0a\0f\d9!h\5c\a6\d1\9b[T:$6.\b1\0c\0ag\0f\93W\e7\d2\b4\ee\96\9e\1b\9b\91O\80\c0\c5\a2a\dc iZwK\16\1c\12\1a\0a\e2\93\ba\e5\c0\a0*C<\22\e0\1d\12\1b\17\0b\0e\09\0d\ad\f2\8b\c7\b9-\b6\a8\c8\14\1e\a9\85W\f1\19L\afu\07\bb\ee\99\dd\fd\a3\7f`\9f\f7\01&\bc\5cr\f5\c5Df;4[\fb~v\8bC)\dc\cb#\c6h\b6\ed\fcc\b8\e4\f1\ca\d71\dc\10Bc\85@\13\97\22 \84\c6\11}\85J$\f8\d2\bb=\11\ae\f92m\c7)\a1K\1d\9e/\f3\dc\b20\ec\0d\86R\d0w\c1\e3l+\b3\16\99\a9p\b9\fa\11\94H\22G\e9d\c4\a8\fc\8c\1a\a0\f0?\d8V},\ef\223\90\c7\87IN\c1\d98\d1\fe\8c\ca\a26\98\d4\0b\cf\a6\f5\81(\a5z\de&\da\b7\8e\a4?\ad\bf\e4,:\9d\0dPx\92\9bj_\ccbT~F\c2\f6\8d\13\e8\90\d8\b8^.9\f7\f5\82\c3\af\be\9f]\80|i\d0\93\a9o\d5-\b3\cf%\12;\c8\ac\99\a7\10\18}n\e8\9cc{\db;\bb\09\cd&x\f4nY\18\01\ec\9a\b7\a8\83O\9ae\e6\95n~\aa\ff\e6\08!\bc\cf\e6\ef\15\e8\d9\ba\e7\9b\ceJo6\d4\ea\9f\09\d6)\b0|\af1\a4\b21*?#0\c6\a5\94\c05\a2f7tN\bc\a6\fc\82\ca\b0\e0\90\d0\153\a7\d8J\f1\04\98\f7A\ec\da\0e\7f\cdP/\17\91\f6\8dvM\d6MC\ef\b0T\cc\aaM\df\e4\96\04\e3\9e\d1\b5\1bLj\88\b8\c1,\1f\7fFeQ\04\9d^\ea]\01\8c5s\fa\87t.\fb\0bAZ\b3g\1dR\92\db\d23\e9\10V\13m\d6G\8c\9a\d7az7\a1\0c\8eY\f8\14\89\eb\13<\ee\ce\a9'5\b7a\c9\ed\e1\1c\e5\b9h\c4,8$4_\c2\a3@r\16\1d\c3\0c\bc\e2%\8b(k\99Xq\dd'\b9O\b6\be\e1\ad\17\f0\88\acf\c9 :\b4}\ceJ\18c\df1\82\e5\1a3`\97Q\7fEbSw\e0\b1d\ae\84\bbk\a0\1c\fe\81+\94\f9\08hXpH\fd\19\8fEl\87\94\de\f8\b7R{\d3#\abs\02\e2rK\8fW\e3\1f\ab*fU(\07\b2\eb\c2\03/\b5{\9a\86\c5\08\a5\d37\87\f20(\a5\b2#\bfj\ba\02\03\82\5c\ed\16\1c+\8a\cf\b4\92\a7y\f2\f0\f3\07\e2\a1Ni\f4\cde\da\be\d5\06\05b\1f\d14\fe\8a\c4\a6S\9d4.U\a0\a2\f3\e12\05\8a\ebu\a4\f6\ec9\0b\83\ef\aa@`\9f\06^q\10Q\bdn\8a\f9>!\06=\96\dd\05\ae\dd>\bdFM\e6\8d\b5\91T]\05q\c4\d4o\04\06\15\ff`P\fb$\19\98\e9\97\d6\bdC\cc\89@\9ewg\d9B\bd\b0\e8\8b\88\07\89[8\e7\19\ee\dby\c8\0aG\a1|\0f\e9|B\1e\c9\f8\84\00\00\00\00\86\83\09\80\edH2+p\ac\1e\11rNlZ\ff\fb\fd\0e8V\0f\85\d5\1e=\ae9'6-\d9d\0a\0f\a6!h\5cT\d1\9b[.:$6g\b1\0c\0a\e7\0f\93W\96\d2\b4\ee\91\9e\1b\9b\c5O\80\c0 \a2a\dcKiZw\1a\16\1c\12\ba\0a\e2\93*\e5\c0\a0\e0C<\22\17\1d\12\1b\0d\0b\0e\09\c7\ad\f2\8b\a8\b9-\b6\a9\c8\14\1e\19\85W\f1\07L\afu\dd\bb\ee\99`\fd\a3\7f&\9f\f7\01\f5\bc\5cr;\c5Df~4[\fb)v\8bC\c6\dc\cb#\fch\b6\ed\f1c\b8\e4\dc\ca\d71\85\10Bc\22@\13\97\11 \84\c6$}\85J=\f8\d2\bb2\11\ae\f9\a1m\c7)/K\1d\9e0\f3\dc\b2R\ec\0d\86\e3\d0w\c1\16l+\b3\b9\99\a9pH\fa\11\94d\22G\e9\8c\c4\a8\fc?\1a\a0\f0,\d8V}\90\ef\223N\c7\87I\d1\c1\d98\a2\fe\8c\ca\0b6\98\d4\81\cf\a6\f5\de(\a5z\8e&\da\b7\bf\a4?\ad\9d\e4,:\92\0dPx\cc\9bj_FbT~\13\c2\f6\8d\b8\e8\90\d8\f7^.9\af\f5\82\c3\80\be\9f]\93|i\d0-\a9o\d5\12\b3\cf%\99;\c8\ac}\a7\10\18cn\e8\9c\bb{\db;x\09\cd&\18\f4nY\b7\01\ec\9a\9a\a8\83One\e6\95\e6~\aa\ff\cf\08!\bc\e8\e6\ef\15\9b\d9\ba\e76\ceJo\09\d4\ea\9f|\d6)\b0\b2\af1\a4#1*?\940\c6\a5f\c05\a2\bc7tN\ca\a6\fc\82\d0\b0\e0\90\d8\153\a7\98J\f1\04\da\f7A\ecP\0e\7f\cd\f6/\17\91\d6\8dvM\b0MC\efMT\cc\aa\04\df\e4\96\b5\e3\9e\d1\88\1bLj\1f\b8\c1,Q\7fFe\ea\04\9d^5]\01\8cts\fa\87A.\fb\0b\1dZ\b3g\d2R\92\dbV3\e9\10G\13m\d6a\8c\9a\d7\0cz7\a1\14\8eY\f8<\89\eb\13'\ee\ce\a9\c95\b7a\e5\ed\e1\1c\b1\b9h4,8$@_\c2\a3\c3r\16\1d%\0c\bc\e2I\8b(<\95A\ff\0d\01q9\a8\b3\de\08\0c\e4\9c\d8\b4\c1\90dV\84a{\cb\b6p\d52\5ctHlWB\d0\b8\f4\a7PQAeS~\17\a4\c3\1a'^\96:\abk\cb;\9dE\f1\1f\faX\ab\ac\e3\03\93K0\faU vm\f6\ad\ccv\91\88\02L%\f5\e5\d7\fcO*\cb\d7\c55D\80&b\a3\8f\b5\b1ZI\de\ba\1bg%\ea\0e\98E\fe\c0\e1]/u\02\c3L\f0\12\81F\97\a3\8d\d3\f9\c6k\8f_\e7\03\92\9c\95\15mz\eb\bfRY\da\95\be\83-\d4t!\d3X\e0i)I\c9\c8D\8e\c2\89ju\8eyx\f4X>k\99\b9q\dd'\e1O\b6\be\88\ad\17\f0 \acf\c9\ce:\b4}\dfJ\18c\1a1\82\e5Q3`\97S\7fEbdw\e0\b1k\ae\84\bb\81\a0\1c\fe\08+\94\f9HhXpE\fd\19\8f\del\87\94{\f8\b7Rs\d3#\abK\02\e2r\1f\8fW\e3U\ab*f\eb(\07\b2\b5\c2\03/\c5{\9a\867\08\a5\d3(\87\f20\bf\a5\b2#\03j\ba\02\16\82\5c\ed\cf\1c+\8ay\b4\92\a7\07\f2\f0\f3i\e2\a1N\da\f4\cde\05\be\d5\064b\1f\d1\a6\fe\8a\c4.S\9d4\f3U\a0\a2\8a\e12\05\f6\ebu\a4\83\ec9\0b`\ef\aa@q\9f\06^n\10Q\bd!\8a\f9>\dd\06=\96>\05\ae\dd\e6\bdFMT\8d\b5\91\c4]\05q\06\d4o\04P\15\ff`\98\fb$\19\bd\e9\97\d6@C\cc\89\d9\9ewg\e8B\bd\b0\89\8b\88\07\19[8\e7\c8\ee\dby|\0aG\a1B\0f\e9|\84\1e\c9\f8\00\00\00\00\80\86\83\09+\edH2\11p\ac\1eZrNl\0e\ff\fb\fd\858V\0f\ae\d5\1e=-9'6\0f\d9d\0a\5c\a6!h[T\d1\9b6.:$\0ag\b1\0cW\e7\0f\93\ee\96\d2\b4\9b\91\9e\1b\c0\c5O\80\dc \a2awKiZ\12\1a\16\1c\93\ba\0a\e2\a0*\e5\c0\22\e0C<\1b\17\1d\12\09\0d\0b\0e\8b\c7\ad\f2\b6\a8\b9-\1e\a9\c8\14\f1\19\85Wu\07L\af\99\dd\bb\ee\7f`\fd\a3\01&\9f\f7r\f5\bc\5cf;\c5D\fb~4[C)v\8b#\c6\dc\cb\ed\fch\b6\e4\f1c\b81\dc\ca\d7c\85\10B\97\22@\13\c6\11 \84J$}\85\bb=\f8\d2\f92\11\ae)\a1m\c7\9e/K\1d\b20\f3\dc\86R\ec\0d\c1\e3\d0w\b3\16l+p\b9\99\a9\94H\fa\11\e9d\22G\fc\8c\c4\a8\f0?\1a\a0},\d8V3\90\ef\22IN\c7\878\d1\c1\d9\ca\a2\fe\8c\d4\0b6\98\f5\81\cf\a6z\de(\a5\b7\8e&\da\ad\bf\a4?:\9d\e4,x\92\0dP_\cc\9bj~FbT\8d\13\c2\f6\d8\b8\e8\909\f7^.\c3\af\f5\82]\80\be\9f\d0\93|i\d5-\a9o%\12\b3\cf\ac\99;\c8\18}\a7\10\9ccn\e8;\bb{\db&x\09\cdY\18\f4n\9a\b7\01\ecO\9a\a8\83\95ne\e6\ff\e6~\aa\bc\cf\08!\15\e8\e6\ef\e7\9b\d9\bao6\ceJ\9f\09\d4\ea\b0|\d6)\a4\b2\af1?#1*\a5\940\c6\a2f\c05N\bc7t\82\ca\a6\fc\90\d0\b0\e0\a7\d8\153\04\98J\f1\ec\da\f7A\cdP\0e\7f\91\f6/\17M\d6\8dv\ef\b0MC\aaMT\cc\96\04\df\e4\d1\b5\e3\9ej\88\1bL,\1f\b8\c1eQ\7fF^\ea\04\9d\8c5]\01\87ts\fa\0bA.\fbg\1dZ\b3\db\d2R\92\10V3\e9\d6G\13m\d7a\8c\9a\a1\0cz7\f8\14\8eY\13<\89\eb\a9'\ee\cea\c95\b7\1c\e5\ed\e1G\b1\b9$4,8\a3@_\c2\1d\c3r\16\e2%\0c\bc\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16R\00\00\00\09\00\00\00j\00\00\00\d5\00\00\000\00\00\006\00\00\00\a5\00\00\008\00\00\00\bf\00\00\00@\00\00\00\a3\00\00\00\9e\00\00\00\81\00\00\00\f3\00\00\00\d7\00\00\00\fb\00\00\00|\00\00\00\e3\00\00\009\00\00\00\82\00\00\00\9b\00\00\00/\00\00\00\ff\00\00\00\87\00\00\004\00\00\00\8e\00\00\00C\00\00\00D\00\00\00\c4\00\00\00\de\00\00\00\e9\00\00\00\cb\00\00\00T\00\00\00{\00\00\00\94\00\00\002\00\00\00\a6\00\00\00\c2\00\00\00#\00\00\00=\00\00\00\ee\00\00\00L\00\00\00\95\00\00\00\0b\00\00\00B\00\00\00\fa\00\00\00\c3\00\00\00N\00\00\00\08\00\00\00.\00\00\00\a1\00\00\00f\00\00\00(\00\00\00\d9\00\00\00$\00\00\00\b2\00\00\00v\00\00\00[\00\00\00\a2\00\00\00I\00\00\00m\00\00\00\8b\00\00\00\d1\00\00\00%\00\00\00r\00\00\00\f8\00\00\00\f6\00\00\00d\00\00\00\86\00\00\00h\00\00\00\98\00\00\00\16\00\00\00\d4\00\00\00\a4\00\00\00\5c\00\00\00\cc\00\00\00]\00\00\00e\00\00\00\b6\00\00\00\92\00\00\00l\00\00\00p\00\00\00H\00\00\00P\00\00\00\fd\00\00\00\ed\00\00\00\b9\00\00\00\da\00\00\00^\00\00\00\15\00\00\00F\00\00\00W\00\00\00\a7\00\00\00\8d\00\00\00\9d\00\00\00\84\00\00\00\90\00\00\00\d8\00\00\00\ab\00\00\00\00\00\00\00\8c\00\00\00\bc\00\00\00\d3\00\00\00\0a\00\00\00\f7\00\00\00\e4\00\00\00X\00\00\00\05\00\00\00\b8\00\00\00\b3\00\00\00E\00\00\00\06\00\00\00\d0\00\00\00,\00\00\00\1e\00\00\00\8f\00\00\00\ca\00\00\00?\00\00\00\0f\00\00\00\02\00\00\00\c1\00\00\00\af\00\00\00\bd\00\00\00\03\00\00\00\01\00\00\00\13\00\00\00\8a\00\00\00k\00\00\00:\00\00\00\91\00\00\00\11\00\00\00A\00\00\00O\00\00\00g\00\00\00\dc\00\00\00\ea\00\00\00\97\00\00\00\f2\00\00\00\cf\00\00\00\ce\00\00\00\f0\00\00\00\b4\00\00\00\e6\00\00\00s\00\00\00\96\00\00\00\ac\00\00\00t\00\00\00\22\00\00\00\e7\00\00\00\ad\00\00\005\00\00\00\85\00\00\00\e2\00\00\00\f9\00\00\007\00\00\00\e8\00\00\00\1c\00\00\00u\00\00\00\df\00\00\00n\00\00\00G\00\00\00\f1\00\00\00\1a\00\00\00q\00\00\00\1d\00\00\00)\00\00\00\c5\00\00\00\89\00\00\00o\00\00\00\b7\00\00\00b\00\00\00\0e\00\00\00\aa\00\00\00\18\00\00\00\be\00\00\00\1b\00\00\00\fc\00\00\00V\00\00\00>\00\00\00K\00\00\00\c6\00\00\00\d2\00\00\00y\00\00\00 \00\00\00\9a\00\00\00\db\00\00\00\c0\00\00\00\fe\00\00\00x\00\00\00\cd\00\00\00Z\00\00\00\f4\00\00\00\1f\00\00\00\dd\00\00\00\a8\00\00\003\00\00\00\88\00\00\00\07\00\00\00\c7\00\00\001\00\00\00\b1\00\00\00\12\00\00\00\10\00\00\00Y\00\00\00'\00\00\00\80\00\00\00\ec\00\00\00_\00\00\00`\00\00\00Q\00\00\00\7f\00\00\00\a9\00\00\00\19\00\00\00\b5\00\00\00J\00\00\00\0d\00\00\00-\00\00\00\e5\00\00\00z\00\00\00\9f\00\00\00\93\00\00\00\c9\00\00\00\9c\00\00\00\ef\00\00\00\a0\00\00\00\e0\00\00\00;\00\00\00M\00\00\00\ae\00\00\00*\00\00\00\f5\00\00\00\b0\00\00\00\c8\00\00\00\eb\00\00\00\bb\00\00\00<\00\00\00\83\00\00\00S\00\00\00\99\00\00\00a\00\00\00\17\00\00\00+\00\00\00\04\00\00\00~\00\00\00\ba\00\00\00w\00\00\00\d6\00\00\00&\00\00\00\e1\00\00\00i\00\00\00\14\00\00\00c\00\00\00U\00\00\00!\00\00\00\0c\00\00\00}\00\00\00\00R\00\00\00\09\00\00\00j\00\00\00\d5\00\00\000\00\00\006\00\00\00\a5\00\00\008\00\00\00\bf\00\00\00@\00\00\00\a3\00\00\00\9e\00\00\00\81\00\00\00\f3\00\00\00\d7\00\00\00\fb\00\00\00|\00\00\00\e3\00\00\009\00\00\00\82\00\00\00\9b\00\00\00/\00\00\00\ff\00\00\00\87\00\00\004\00\00\00\8e\00\00\00C\00\00\00D\00\00\00\c4\00\00\00\de\00\00\00\e9\00\00\00\cb\00\00\00T\00\00\00{\00\00\00\94\00\00\002\00\00\00\a6\00\00\00\c2\00\00\00#\00\00\00=\00\00\00\ee\00\00\00L\00\00\00\95\00\00\00\0b\00\00\00B\00\00\00\fa\00\00\00\c3\00\00\00N\00\00\00\08\00\00\00.\00\00\00\a1\00\00\00f\00\00\00(\00\00\00\d9\00\00\00$\00\00\00\b2\00\00\00v\00\00\00[\00\00\00\a2\00\00\00I\00\00\00m\00\00\00\8b\00\00\00\d1\00\00\00%\00\00\00r\00\00\00\f8\00\00\00\f6\00\00\00d\00\00\00\86\00\00\00h\00\00\00\98\00\00\00\16\00\00\00\d4\00\00\00\a4\00\00\00\5c\00\00\00\cc\00\00\00]\00\00\00e\00\00\00\b6\00\00\00\92\00\00\00l\00\00\00p\00\00\00H\00\00\00P\00\00\00\fd\00\00\00\ed\00\00\00\b9\00\00\00\da\00\00\00^\00\00\00\15\00\00\00F\00\00\00W\00\00\00\a7\00\00\00\8d\00\00\00\9d\00\00\00\84\00\00\00\90\00\00\00\d8\00\00\00\ab\00\00\00\00\00\00\00\8c\00\00\00\bc\00\00\00\d3\00\00\00\0a\00\00\00\f7\00\00\00\e4\00\00\00X\00\00\00\05\00\00\00\b8\00\00\00\b3\00\00\00E\00\00\00\06\00\00\00\d0\00\00\00,\00\00\00\1e\00\00\00\8f\00\00\00\ca\00\00\00?\00\00\00\0f\00\00\00\02\00\00\00\c1\00\00\00\af\00\00\00\bd\00\00\00\03\00\00\00\01\00\00\00\13\00\00\00\8a\00\00\00k\00\00\00:\00\00\00\91\00\00\00\11\00\00\00A\00\00\00O\00\00\00g\00\00\00\dc\00\00\00\ea\00\00\00\97\00\00\00\f2\00\00\00\cf\00\00\00\ce\00\00\00\f0\00\00\00\b4\00\00\00\e6\00\00\00s\00\00\00\96\00\00\00\ac\00\00\00t\00\00\00\22\00\00\00\e7\00\00\00\ad\00\00\005\00\00\00\85\00\00\00\e2\00\00\00\f9\00\00\007\00\00\00\e8\00\00\00\1c\00\00\00u\00\00\00\df\00\00\00n\00\00\00G\00\00\00\f1\00\00\00\1a\00\00\00q\00\00\00\1d\00\00\00)\00\00\00\c5\00\00\00\89\00\00\00o\00\00\00\b7\00\00\00b\00\00\00\0e\00\00\00\aa\00\00\00\18\00\00\00\be\00\00\00\1b\00\00\00\fc\00\00\00V\00\00\00>\00\00\00K\00\00\00\c6\00\00\00\d2\00\00\00y\00\00\00 \00\00\00\9a\00\00\00\db\00\00\00\c0\00\00\00\fe\00\00\00x\00\00\00\cd\00\00\00Z\00\00\00\f4\00\00\00\1f\00\00\00\dd\00\00\00\a8\00\00\003\00\00\00\88\00\00\00\07\00\00\00\c7\00\00\001\00\00\00\b1\00\00\00\12\00\00\00\10\00\00\00Y\00\00\00'\00\00\00\80\00\00\00\ec\00\00\00_\00\00\00`\00\00\00Q\00\00\00\7f\00\00\00\a9\00\00\00\19\00\00\00\b5\00\00\00J\00\00\00\0d\00\00\00-\00\00\00\e5\00\00\00z\00\00\00\9f\00\00\00\93\00\00\00\c9\00\00\00\9c\00\00\00\ef\00\00\00\a0\00\00\00\e0\00\00\00;\00\00\00M\00\00\00\ae\00\00\00*\00\00\00\f5\00\00\00\b0\00\00\00\c8\00\00\00\eb\00\00\00\bb\00\00\00<\00\00\00\83\00\00\00S\00\00\00\99\00\00\00a\00\00\00\17\00\00\00+\00\00\00\04\00\00\00~\00\00\00\ba\00\00\00w\00\00\00\d6\00\00\00&\00\00\00\e1\00\00\00i\00\00\00\14\00\00\00c\00\00\00U\00\00\00!\00\00\00\0c\00\00\00}\00\00\00\00R\00\00\00\09\00\00\00j\00\00\00\d5\00\00\000\00\00\006\00\00\00\a5\00\00\008\00\00\00\bf\00\00\00@\00\00\00\a3\00\00\00\9e\00\00\00\81\00\00\00\f3\00\00\00\d7\00\00\00\fb\00\00\00|\00\00\00\e3\00\00\009\00\00\00\82\00\00\00\9b\00\00\00/\00\00\00\ff\00\00\00\87\00\00\004\00\00\00\8e\00\00\00C\00\00\00D\00\00\00\c4\00\00\00\de\00\00\00\e9\00\00\00\cb\00\00\00T\00\00\00{\00\00\00\94\00\00\002\00\00\00\a6\00\00\00\c2\00\00\00#\00\00\00=\00\00\00\ee\00\00\00L\00\00\00\95\00\00\00\0b\00\00\00B\00\00\00\fa\00\00\00\c3\00\00\00N\00\00\00\08\00\00\00.\00\00\00\a1\00\00\00f\00\00\00(\00\00\00\d9\00\00\00$\00\00\00\b2\00\00\00v\00\00\00[\00\00\00\a2\00\00\00I\00\00\00m\00\00\00\8b\00\00\00\d1\00\00\00%\00\00\00r\00\00\00\f8\00\00\00\f6\00\00\00d\00\00\00\86\00\00\00h\00\00\00\98\00\00\00\16\00\00\00\d4\00\00\00\a4\00\00\00\5c\00\00\00\cc\00\00\00]\00\00\00e\00\00\00\b6\00\00\00\92\00\00\00l\00\00\00p\00\00\00H\00\00\00P\00\00\00\fd\00\00\00\ed\00\00\00\b9\00\00\00\da\00\00\00^\00\00\00\15\00\00\00F\00\00\00W\00\00\00\a7\00\00\00\8d\00\00\00\9d\00\00\00\84\00\00\00\90\00\00\00\d8\00\00\00\ab\00\00\00\00\00\00\00\8c\00\00\00\bc\00\00\00\d3\00\00\00\0a\00\00\00\f7\00\00\00\e4\00\00\00X\00\00\00\05\00\00\00\b8\00\00\00\b3\00\00\00E\00\00\00\06\00\00\00\d0\00\00\00,\00\00\00\1e\00\00\00\8f\00\00\00\ca\00\00\00?\00\00\00\0f\00\00\00\02\00\00\00\c1\00\00\00\af\00\00\00\bd\00\00\00\03\00\00\00\01\00\00\00\13\00\00\00\8a\00\00\00k\00\00\00:\00\00\00\91\00\00\00\11\00\00\00A\00\00\00O\00\00\00g\00\00\00\dc\00\00\00\ea\00\00\00\97\00\00\00\f2\00\00\00\cf\00\00\00\ce\00\00\00\f0\00\00\00\b4\00\00\00\e6\00\00\00s\00\00\00\96\00\00\00\ac\00\00\00t\00\00\00\22\00\00\00\e7\00\00\00\ad\00\00\005\00\00\00\85\00\00\00\e2\00\00\00\f9\00\00\007\00\00\00\e8\00\00\00\1c\00\00\00u\00\00\00\df\00\00\00n\00\00\00G\00\00\00\f1\00\00\00\1a\00\00\00q\00\00\00\1d\00\00\00)\00\00\00\c5\00\00\00\89\00\00\00o\00\00\00\b7\00\00\00b\00\00\00\0e\00\00\00\aa\00\00\00\18\00\00\00\be\00\00\00\1b\00\00\00\fc\00\00\00V\00\00\00>\00\00\00K\00\00\00\c6\00\00\00\d2\00\00\00y\00\00\00 \00\00\00\9a\00\00\00\db\00\00\00\c0\00\00\00\fe\00\00\00x\00\00\00\cd\00\00\00Z\00\00\00\f4\00\00\00\1f\00\00\00\dd\00\00\00\a8\00\00\003\00\00\00\88\00\00\00\07\00\00\00\c7\00\00\001\00\00\00\b1\00\00\00\12\00\00\00\10\00\00\00Y\00\00\00'\00\00\00\80\00\00\00\ec\00\00\00_\00\00\00`\00\00\00Q\00\00\00\7f\00\00\00\a9\00\00\00\19\00\00\00\b5\00\00\00J\00\00\00\0d\00\00\00-\00\00\00\e5\00\00\00z\00\00\00\9f\00\00\00\93\00\00\00\c9\00\00\00\9c\00\00\00\ef\00\00\00\a0\00\00\00\e0\00\00\00;\00\00\00M\00\00\00\ae\00\00\00*\00\00\00\f5\00\00\00\b0\00\00\00\c8\00\00\00\eb\00\00\00\bb\00\00\00<\00\00\00\83\00\00\00S\00\00\00\99\00\00\00a\00\00\00\17\00\00\00+\00\00\00\04\00\00\00~\00\00\00\ba\00\00\00w\00\00\00\d6\00\00\00&\00\00\00\e1\00\00\00i\00\00\00\14\00\00\00c\00\00\00U\00\00\00!\00\00\00\0c\00\00\00}\00\00\00\00R\00\00\00\09\00\00\00j\00\00\00\d5\00\00\000\00\00\006\00\00\00\a5\00\00\008\00\00\00\bf\00\00\00@\00\00\00\a3\00\00\00\9e\00\00\00\81\00\00\00\f3\00\00\00\d7\00\00\00\fb\00\00\00|\00\00\00\e3\00\00\009\00\00\00\82\00\00\00\9b\00\00\00/\00\00\00\ff\00\00\00\87\00\00\004\00\00\00\8e\00\00\00C\00\00\00D\00\00\00\c4\00\00\00\de\00\00\00\e9\00\00\00\cb\00\00\00T\00\00\00{\00\00\00\94\00\00\002\00\00\00\a6\00\00\00\c2\00\00\00#\00\00\00=\00\00\00\ee\00\00\00L\00\00\00\95\00\00\00\0b\00\00\00B\00\00\00\fa\00\00\00\c3\00\00\00N\00\00\00\08\00\00\00.\00\00\00\a1\00\00\00f\00\00\00(\00\00\00\d9\00\00\00$\00\00\00\b2\00\00\00v\00\00\00[\00\00\00\a2\00\00\00I\00\00\00m\00\00\00\8b\00\00\00\d1\00\00\00%\00\00\00r\00\00\00\f8\00\00\00\f6\00\00\00d\00\00\00\86\00\00\00h\00\00\00\98\00\00\00\16\00\00\00\d4\00\00\00\a4\00\00\00\5c\00\00\00\cc\00\00\00]\00\00\00e\00\00\00\b6\00\00\00\92\00\00\00l\00\00\00p\00\00\00H\00\00\00P\00\00\00\fd\00\00\00\ed\00\00\00\b9\00\00\00\da\00\00\00^\00\00\00\15\00\00\00F\00\00\00W\00\00\00\a7\00\00\00\8d\00\00\00\9d\00\00\00\84\00\00\00\90\00\00\00\d8\00\00\00\ab\00\00\00\00\00\00\00\8c\00\00\00\bc\00\00\00\d3\00\00\00\0a\00\00\00\f7\00\00\00\e4\00\00\00X\00\00\00\05\00\00\00\b8\00\00\00\b3\00\00\00E\00\00\00\06\00\00\00\d0\00\00\00,\00\00\00\1e\00\00\00\8f\00\00\00\ca\00\00\00?\00\00\00\0f\00\00\00\02\00\00\00\c1\00\00\00\af\00\00\00\bd\00\00\00\03\00\00\00\01\00\00\00\13\00\00\00\8a\00\00\00k\00\00\00:\00\00\00\91\00\00\00\11\00\00\00A\00\00\00O\00\00\00g\00\00\00\dc\00\00\00\ea\00\00\00\97\00\00\00\f2\00\00\00\cf\00\00\00\ce\00\00\00\f0\00\00\00\b4\00\00\00\e6\00\00\00s\00\00\00\96\00\00\00\ac\00\00\00t\00\00\00\22\00\00\00\e7\00\00\00\ad\00\00\005\00\00\00\85\00\00\00\e2\00\00\00\f9\00\00\007\00\00\00\e8\00\00\00\1c\00\00\00u\00\00\00\df\00\00\00n\00\00\00G\00\00\00\f1\00\00\00\1a\00\00\00q\00\00\00\1d\00\00\00)\00\00\00\c5\00\00\00\89\00\00\00o\00\00\00\b7\00\00\00b\00\00\00\0e\00\00\00\aa\00\00\00\18\00\00\00\be\00\00\00\1b\00\00\00\fc\00\00\00V\00\00\00>\00\00\00K\00\00\00\c6\00\00\00\d2\00\00\00y\00\00\00 \00\00\00\9a\00\00\00\db\00\00\00\c0\00\00\00\fe\00\00\00x\00\00\00\cd\00\00\00Z\00\00\00\f4\00\00\00\1f\00\00\00\dd\00\00\00\a8\00\00\003\00\00\00\88\00\00\00\07\00\00\00\c7\00\00\001\00\00\00\b1\00\00\00\12\00\00\00\10\00\00\00Y\00\00\00'\00\00\00\80\00\00\00\ec\00\00\00_\00\00\00`\00\00\00Q\00\00\00\7f\00\00\00\a9\00\00\00\19\00\00\00\b5\00\00\00J\00\00\00\0d\00\00\00-\00\00\00\e5\00\00\00z\00\00\00\9f\00\00\00\93\00\00\00\c9\00\00\00\9c\00\00\00\ef\00\00\00\a0\00\00\00\e0\00\00\00;\00\00\00M\00\00\00\ae\00\00\00*\00\00\00\f5\00\00\00\b0\00\00\00\c8\00\00\00\eb\00\00\00\bb\00\00\00<\00\00\00\83\00\00\00S\00\00\00\99\00\00\00a\00\00\00\17\00\00\00+\00\00\00\04\00\00\00~\00\00\00\ba\00\00\00w\00\00\00\d6\00\00\00&\00\00\00\e1\00\00\00i\00\00\00\14\00\00\00c\00\00\00U\00\00\00!\00\00\00\0c\00\00\00}\00\00\00\00\0e\09\0d\0b\1c\12\1a\16\12\1b\17\1d8$4,6-9'$6.:*?#1pHhX~AeSlZrNbS\7fEHl\5ctFeQ\7fT~FbZwKi\e0\90\d0\b0\ee\99\dd\bb\fc\82\ca\a6\f2\8b\c7\ad\d8\b4\e4\9c\d6\bd\e9\97\c4\a6\fe\8a\ca\af\f3\81\90\d8\b8\e8\9e\d1\b5\e3\8c\ca\a2\fe\82\c3\af\f5\a8\fc\8c\c4\a6\f5\81\cf\b4\ee\96\d2\ba\e7\9b\d9\db;\bb{\d52\b6p\c7)\a1m\c9 \acf\e3\1f\8fW\ed\16\82\5c\ff\0d\95A\f1\04\98J\abs\d3#\a5z\de(\b7a\c95\b9h\c4>\93W\e7\0f\9d^\ea\04\8fE\fd\19\81L\f0\12;\abk\cb5\a2f\c0'\b9q\dd)\b0|\d6\03\8f_\e7\0d\86R\ec\1f\9dE\f1\11\94H\faK\e3\03\93E\ea\0e\98W\f1\19\85Y\f8\14\8es\c77\bf}\ce:\b4o\d5-\a9a\dc \a2\advm\f6\a3\7f`\fd\b1dw\e0\bfmz\eb\95RY\da\9b[T\d1\89@C\cc\87IN\c7\dd>\05\ae\d37\08\a5\c1,\1f\b8\cf%\12\b3\e5\1a1\82\eb\13<\89\f9\08+\94\f7\01&\9fM\e6\bdFC\ef\b0MQ\f4\a7P_\fd\aa[u\c2\89j{\cb\84ai\d0\93|g\d9\9ew=\ae\d5\1e3\a7\d8\15!\bc\cf\08/\b5\c2\03\05\8a\e12\0b\83\ec9\19\98\fb$\17\91\f6/vM\d6\8dxD\db\86j_\cc\9bdV\c1\90Ni\e2\a1@`\ef\aaR{\f8\b7\5cr\f5\bc\06\05\be\d5\08\0c\b3\de\1a\17\a4\c3\14\1e\a9\c8>!\8a\f90(\87\f2\223\90\ef,:\9d\e4\96\dd\06=\98\d4\0b6\8a\cf\1c+\84\c6\11 \ae\f92\11\a0\f0?\1a\b2\eb(\07\bc\e2%\0c\e6\95ne\e8\9ccn\fa\87ts\f4\8eyx\de\b1ZI\d0\b8WB\c2\a3@_\cc\aaMTA\ec\da\f7O\e5\d7\fc]\fe\c0\e1S\f7\cd\eay\c8\ee\dbw\c1\e3\d0e\da\f4\cdk\d3\f9\c61\a4\b2\af?\ad\bf\a4-\b6\a8\b9#\bf\a5\b2\09\80\86\83\07\89\8b\88\15\92\9c\95\1b\9b\91\9e\a1|\0aG\afu\07L\bdn\10Q\b3g\1dZ\99X>k\97Q3`\85J$}\8bC)v\d14b\1f\df=o\14\cd&x\09\c3/u\02\e9\10V3\e7\19[8\f5\02L%\fb\0bA.\9a\d7a\8c\94\del\87\86\c5{\9a\88\ccv\91\a2\f3U\a0\ac\faX\ab\be\e1O\b6\b0\e8B\bd\ea\9f\09\d4\e4\96\04\df\f6\8d\13\c2\f8\84\1e\c9\d2\bb=\f8\dc\b20\f3\ce\a9'\ee\c0\a0*\e5zG\b1\b9h\c4\0f\93W\e7\04\9d^\ea\19\8fE\fd\12\81L\f0\cb;\abk\c05\a2f\dd'\b9q\d6)\b0|\e7\03\8f_\ec\0d\86R\f1\1f\9dE\fa\11\94H\93K\e3\03\98E\ea\0e\85W\f1\19\8eY\f8\14\bfs\c77\b4}\ce:\a9o\d5-\a2a\dc \f6\advm\fd\a3\7f`\e0\b1dw\eb\bfmz\da\95RY\d1\9b[T\cc\89@C\c7\87IN\ae\dd>\05\a5\d37\08\b8\c1,\1f\b3\cf%\12\82\e5\1a1\89\eb\13<\94\f9\08+\9f\f7\01&FM\e6\bdMC\ef\b0PQ\f4\a7[_\fd\aaju\c2\89a{\cb\84|i\d0\93wg\d9\9e\1e=\ae\d5\153\a7\d8\08!\bc\cf\03/\b5\c22\05\8a\e19\0b\83\ec$\19\98\fb/\17\91\f6\8dvM\d6\86xD\db\9bj_\cc\90dV\c1\a1Ni\e2\aa@`\ef\b7R{\f8\bc\5cr\f5\d5\06\05\be\de\08\0c\b3\c3\1a\17\a4\c8\14\1e\a9\f9>!\8a\f20(\87\ef\223\90\e4,:\9d=\96\dd\066\98\d4\0b+\8a\cf\1c \84\c6\11\11\ae\f92\1a\a0\f0?\07\b2\eb(\0c\bc\e2%e\e6\95nn\e8\9ccs\fa\87tx\f4\8eyI\de\b1ZB\d0\b8W_\c2\a3@T\cc\aaM\f7A\ec\da\fcO\e5\d7\e1]\fe\c0\eaS\f7\cd\dby\c8\ee\d0w\c1\e3\cde\da\f4\c6k\d3\f9\af1\a4\b2\a4?\ad\bf\b9-\b6\a8\b2#\bf\a5\83\09\80\86\88\07\89\8b\95\15\92\9c\9e\1b\9b\91G\a1|\0aL\afu\07Q\bdn\10Z\b3g\1dk\99X>`\97Q3}\85J$v\8bC)\1f\d14b\14\df=o\09\cd&x\02\c3/u3\e9\10V8\e7\19[%\f5\02L.\fb\0bA\8c\9a\d7a\87\94\del\9a\86\c5{\91\88\ccv\a0\a2\f3U\ab\ac\faX\b6\be\e1O\bd\b0\e8B\d4\ea\9f\09\df\e4\96\04\c2\f6\8d\13\c9\f8\84\1e\f8\d2\bb=\f3\dc\b20\ee\ce\a9'\e5\c0\a0*\b9h\e7\0f\93W\ea\04\9d^\fd\19\8fE\f0\12\81Lk\cb;\abf\c05\a2q\dd'\b9|\d6)\b0_\e7\03\8fR\ec\0d\86E\f1\1f\9dH\fa\11\94\03\93K\e3\0e\98E\ea\19\85W\f1\14\8eY\f87\bfs\c7:\b4}\ce-\a9o\d5 \a2a\dcm\f6\adv`\fd\a3\7fw\e0\b1dz\eb\bfmY\da\95RT\d1\9b[C\cc\89@N\c7\87I\05\ae\dd>\08\a5\d37\1f\b8\c1,\12\b3\cf%1\82\e5\1a<\89\eb\13+\94\f9\08&\9f\f7\01\bdFM\e6\b0MC\ef\a7PQ\f4\aa[_\fd\89ju\c2\84a{\cb\93|i\d0\9ewg\d9\d5\1e=\ae\d8\153\a7\cf\08!\bc\c2\03/\b5\e12\05\8a\ec9\0b\83\fb$\19\98\f6/\17\91\d6\8dvM\db\86xD\cc\9bj_\c1\90dV\e2\a1Ni\ef\aa@`\f8\b7R{\f5\bc\5cr\be\d5\06\05\b3\de\08\0c\a4\c3\1a\17\a9\c8\14\1e\8a\f9>!\87\f20(\90\ef\223\9d\e4,:\06=\96\dd\0b6\98\d4\1c+\8a\cf\11 \84\c62\11\ae\f9?\1a\a0\f0(\07\b2\eb%\0c\bc\e2ne\e6\95cn\e8\9cts\fa\87yx\f4\8eZI\de\b1WB\d0\b8@_\c2\a3MT\cc\aa\da\f7A\ec\d7\fcO\e5\c0\e1]\fe\cd\eaS\f7\ee\dby\c8\e3\d0w\c1\f4\cde\da\f9\c6k\d3\b2\af1\a4\bf\a4?\ad\a8\b9-\b6\a5\b2#\bf\86\83\09\80\8b\88\07\89\9c\95\15\92\91\9e\1b\9b\0aG\a1|\07L\afu\10Q\bdn\1dZ\b3g>k\99X3`\97Q$}\85J)v\8bCb\1f\d14o\14\df=x\09\cd&u\02\c3/V3\e9\10[8\e7\19L%\f5\02A.\fb\0ba\8c\9a\d7l\87\94\de{\9a\86\c5v\91\88\ccU\a0\a2\f3X\ab\ac\faO\b6\be\e1B\bd\b0\e8\09\d4\ea\9f\04\df\e4\96\13\c2\f6\8d\1e\c9\f8\84=\f8\d2\bb0\f3\dc\b2'\ee\ce\a9*\e5\c0\a0\b1\b9W\e7\0f\93^\ea\04\9dE\fd\19\8fL\f0\12\81\abk\cb;\a2f\c05\b9q\dd'\b0|\d6)\8f_\e7\03\86R\ec\0d\9dE\f1\1f\94H\fa\11\e3\03\93K\ea\0e\98E\f1\19\85W\f8\14\8eY\c77\bfs\ce:\b4}\d5-\a9o\dc \a2avm\f6\ad\7f`\fd\a3dw\e0\b1mz\eb\bfRY\da\95[T\d1\9b@C\cc\89IN\c7\87>\05\ae\dd7\08\a5\d3,\1f\b8\c1%\12\b3\cf\1a1\82\e5\13<\89\eb\08+\94\f9\01&\9f\f7\e6\bdFM\ef\b0MC\f4\a7PQ\fd\aa[_\c2\89ju\cb\84a{\d0\93|i\d9\9ewg\ae\d5\1e=\a7\d8\153\bc\cf\08!\b5\c2\03/\8a\e12\05\83\ec9\0b\98\fb$\19\91\f6/\17M\d6\8dvD\db\86x_\cc\9bjV\c1\90di\e2\a1N`\ef\aa@{\f8\b7Rr\f5\bc\5c\05\be\d5\06\0c\b3\de\08\17\a4\c3\1a\1e\a9\c8\14!\8a\f9>(\87\f203\90\ef\22:\9d\e4,\dd\06=\96\d4\0b6\98\cf\1c+\8a\c6\11 \84\f92\11\ae\f0?\1a\a0\eb(\07\b2\e2%\0c\bc\95ne\e6\9ccn\e8\87ts\fa\8eyx\f4\b1ZI\de\b8WB\d0\a3@_\c2\aaMT\cc\ec\da\f7A\e5\d7\fcO\fe\c0\e1]\f7\cd\eaS\c8\ee\dby\c1\e3\d0w\da\f4\cde\d3\f9\c6k\a4\b2\af1\ad\bf\a4?\b6\a8\b9-\bf\a5\b2#\80\86\83\09\89\8b\88\07\92\9c\95\15\9b\91\9e\1b|\0aG\a1u\07L\afn\10Q\bdg\1dZ\b3X>k\99Q3`\97J$}\85C)v\8b4b\1f\d1=o\14\df&x\09\cd/u\02\c3\10V3\e9\19[8\e7\02L%\f5\0bA.\fb\d7a\8c\9a\del\87\94\c5{\9a\86\ccv\91\88\f3U\a0\a2\faX\ab\ac\e1O\b6\be\e8B\bd\b0\9f\09\d4\ea\96\04\df\e4\8d\13\c2\f6\84\1e\c9\f8\bb=\f8\d2\b20\f3\dc\a9'\ee\ce\a0*\e5\c0G\b1\ac\06\f1Q\b5W\b1\80\ddo\85^\fb\b86\5c\f2\1cp\8at \a4\9e;3\1e\9b~\c4u\e9u\5cJ\04H\13\ed\f8\8e\b8\af~\cb\04\d2F(i\10$*vn\04\b4\d04\e8\e6k\9a\e9=\b0\aa ;\b9\ba\14[#U\94\a8D\91\f5\aa\19\be\ed\c0}\ba\b6\16\bc\a1z\c2\15\0ef\ce<\81\9c\ad\b0%p\81\91\b1e\ce\b3#\ddk\e4\b5\d44\fd\f1\91y\80DvNB\a6N\b0>\d9\f3\c1\01\fe\c8#C\e2M7H\06\90\16U\fc\d1\8eA\e2\9e~\a8\af\b3\dbt\eb\e3*1~~\d7\c8~\00'\f7\a1\d9\1a\e4\e8q5\97\22\df[\f2\9b\9c\90\e5\ed\7f\e31\efGfsJ\87g\0d\03le\d3$;\92\8f\e6,\d4\91\e55l\af*\83q{\1e\1c\95\99u\e9L!\94n\13S}\87,\ca\02\9b\04\f0\a7\07\0ds\f3\d8I\f8\d8R\e6\990\ea\9d\02\82c\93\02\f4\13}\1e'\941\86\8c\f0\80\e6\ab\185\f56Ho\e6\c0\a5\c7/\ba\eey_\dcL\e5\fd\9d/\22/'M\c7\cb\a3\94\ac8\cc`E\eb\d7`\5c\8b\5c1I\e4F\dd\12T\a7\b3\c9\efG@\1d\f7T8\94$\a9\90\c0<\99\abY}0b\c98\e6\9a\92.\b8\ca\03'qZ\f9\a3\00\bc\e9\0a\d8\11\9f*\869F\18!?\08CU\07\85\b4\7f\0c\eay\b7&\83\9a\f1\ecECt6(\e1\06\dc\16\fb\01dn\a5r\0c\aa\15\beg\f2\ab\d8B\1e\03\d6\89\e7\ac=\08\f9\c6q\b5\ab\0d\9f\15\93C\f9^\bd\ae\0f\02>\fe\1d \d1\a9\b8w\dcb\f8\a3\ab\16>}\9bd\baa\a3\f5F\d8\f6\01\0bS)d@4c\b8\97c.d\a8\9e\d2\96&\e7\1b\ff;\8d\e8\7f8'\c2h\b2\97\0f\19\db\ddQw\b2\99^\ad@\d7\80\84\a3\9f\d6\fe\b5\c2q\90\8dg\11l\b2;>\cdu9\b7a\12\d2W\a3\e7\d5\e9\fb^\88\d9\a8E07D\90\cb\bb3\d3\97\01\c2v\b5\9ag\baW+\80\d7Oe\af<\dd\9e\bd^\c2WIH\a2\fc\1a(\8eV\e4R\ffz\c0\a7N\b1(\f9\c3d\bc\1f\d0|{\1fy\f4\04R\03\84\0f\02\1d\baLjm\9er\19\d4J@\ff+(\92\9f\e1'AU%<\a0{t\7f\86-\b1\bf1\88\d3\a7\da\c5\0f`-7\0b\edgv\cf\00\d3\19\8f\13]rZi\fdX\8c\cf8\96\00\88\9f\86?K\8e\b1\00kiN\94\d6\f8FH}\dc\9c\dc\def\ca\b0\0c:\18'\fe\aa\82M\cb\c1\a28\a29L\99\aap^\00\dc::(\ad\02\c1\a4\a8\7f\e1\ee\0a\c2p\d5\b5~\de\98\0c9\0e\92\89\9a\cb\b3-\85F\ccB\f9 \88\91\00\dd\e0\0a\01\ca\8b\91\f7H\fe \a9y\a7r\c6\f4\fb\f3\08r\bc\b2\ad\19\f3z\dc-b\07\a8B:\e1\d9\98QY'\a7\92\b5\8a\fd\c4\91\04H\09\0e\89\9b \d9@\04\ad\dcBr\15\89vW\a3\d9\ccJ\ec-\aa<\8d\d8\ea\b6OJI^?Y\86X@ \f1\09r\fd\a4l\1f\1b*\ac\07f\d5\99S\01\98\88\e0\f8Fp\0f\d3\c2\d8\10\ff>S\93\ad\c0\ef7\12\df\22\98\19\a3\e5\047\db\eb\bb3t\0c\ca\c6t\bc\d9[\1e\0b\09\0d\dex\10]c8\81\1b\85\9bx|pe*\dez|;T\e4\ca\bd\0d\0b\0a,\dcaC5\f6/\e6\83\c0\01\f7\89ZM\f3\83\02\82]\b7ufE\bf\1bWg\da\9d|\11\d1\87\5cN\d3\8d\19\9d5\11\f9\d1\ceT\13\87\fd9$&p\b8=L\05\cb\9b\07\09\b3\a7&\88\bd(\13\b7\84Q\87\a70J\ba\f9\90\c1\96I\0a\c0\bf\a0J\f6\0c&k\03Bz\b8\a8\da\e9N\d8\0b9|h\a7\00\bb\02\d6\88\fc\d4\cd\03\ca\bd\9d\8dD\ab\8ejE\cf\08t\c2\06\c8`\dc\f8\84.\ab9\ea\1f\03pl\0f\8b\f3\22\b5\fa\0aVG\a2\a7U\b19\a6P)\fd\80\1c\7f\dc\95\1b\1d)\c9t\d3\ec\22\c8d\9d\82\df\04\a2l\b5(\ff`\12M$\d9\11\e1\8e|\11[\e3\0d\e0\d5%s\d8]\95gi\98\be\cf6J\e2N\85\c8\fc\9d\98'\00\ad\a8\84\8e\11B\f1\89\0cj*Q\efN\1f\831\f3z\b2\d4\89\a0h\0f\91\0ftg\8d^(\7f\b4\ae`\de\b6\e2\a8\aeq\e4\9c\0a\12\e7z\96\b2\11\c8\fe`*\f3\e1:\eb@\9fI\a2H.\a0!\bfcI\82 \87T\1dd\e8Kn\b4\e2\0b\8f\7fO\f60\94\e5\d3\ccH\12Y\16\fb\ca\08\0a\02\82\e6\dbGB\8e\95/\0cu\ca\e0\f8#K\f2W}\e6B&\a0>\f8\d5 \a6S\dc\e6\00\01\933\80n\14\10+\8eZ\00\02ho\e8&\1d\b5\f3\82yi\b1\a8q~\bf;\cd\1b\b41\80\a0\e1\17\ad\c1\9b{\0c\adH\8b?\17\e8\8a\eb'\b3\9e_g\c0\0d\f2\0b\7f\ef[\0dw\13\b9iW\c3\a8\91\0f5\92#\e3e\ea\c6\f7\13\1d\86~\d3\85N\ba\7f\81\b5s\85>\a6\85\80\e1eb\92\afnq\abu\04\82\be\ba\d8\11\c9\1d>MJ\bd2\9b\bc]\ed\1ad\e1[x\e5\a3\10\d2\a7\8a\f1\93$8\0cd!7\e8\c8v\03\de\1fH\a7[-\85>\b8@xt\f9\0c\0f\f3b\91\ea\fdG\c2=\04fp#\1bK\0d\01\04\80\ee\aa\bbP\93\d8\a5\93\f8\fa\f1Ej\e9\e3\16\99x\8aqSh\9a2c\99\bcE\fc\ab\b11J\86\db\f7\ff\bf\ca\a5\ef\b3\93[\d7\c3\9dD\15\b4p\bb3BP\cdd#N;\5c\afW\e0\aa\ed\df\e0S\b6\c7/_o*\c5\16\15\8f{\adE\f7\1f\cdE\88\89\88\f1\e9C\07\e1pf\5c\b4\d3\fe\1d\81\1d\15\bc,_9z\11\c4\d5!8\17X\ec\b9#\11\9c\a5]l\9d\c6\05|\e1\96\9c\92tXt\b5\cfZU\91\e4\e7[tO\06w\06\cf\befH\f2\02\fdO\5cX\bd\1c9\1ce\c7\86|\d7;%\de6\c2\97\fc\b9Je\c1+\ba\b8\ff\9e\81\b7S\b0\f9\86:\0f1\d5\7f\a2\b385\04rp\1dT\f6m.\99a\1e\d0b\ea\9bh\9e]\095\af16\a0\ee\96u\91\ca\d2%\0f\03d\14t\99Z\17\02\92:\b6\c7\c5zY\1e\98\f1ias\83o\04\eb\d9\d5\90\da\d9\c9\8dq\15\ed\fe\b8\b5\87\b1V\d7\f8\a97\e7\e5<\85\0c\c2\cep\ce\af\d8\83\b5)\9a\ebL\98:vo \dc\db\fd\c6\12\e3G\81\c5\e3`\9bB\003\84\96\d0\b1\bc\95d\ec\171-\ec\83\e1\ceMM^\0c\f4\9fU\f7\bdm\8d\d9Ps,\ab\8aD\80\93\f4\d5+\bb\87~\9c\9e\c7=\b4p\82\e6\92dj8FG\ea\03\ca\01-\14\88\95p\b2\19n\a0\dd9\bfN\09\fa\e9\04\90\1c\db\c8\cb\e3\da\e5l;\dd\8d\00zyA\9c\cc\13\98\d7@\a4\0fM\1aqR\e5\17g\cc\97vh\absH\bf\05\9f\85S\dd\e4x\7f.\e9\0e\1b\d8\1f?\b3\e0\e2y\1d>/\c7C<\f0U\af\f2q\a8\a0]\93\cdgCn\ed\8f\94A\d1\1fd\fc\a6\fe\aa4\cb\deK\dbM\d9\ca\12u\fd\5c\1d\cds5\ff\fb\96\a4H\92\06e\a1\7f2I\98\c2\b4\0by\0b\e5\93\97\8f\e2\c4\ee\83\8d\ad\99\bdr\10R\01F\ef\16Ulq\15\e7+\06\e46^\c8\ba\be\8fu\9c\16\1e\09@\19\08t\1b\f0\18\96\92\e0Ia_\b7\97\b9\b2\10R\f3\d0\a0\ba\f6\ea\df#\06\a6\07i\e0\f6\0e\d0\01F\f4\dd\ee\ebVQ\88(chY\16\c2($-~\8a\ae\16\ce\e4\92r\a2\04\d3\d5\a3\e0[\03U\8c\8c\ca\cc\17\c2l\a6{\01$\bf\a1&\e4A\f9\eb\1a\9cSD\c7\efm\01\cb\c6\19\16\80\a5\0f}\8b\bed\b8\9f\10\c2\f4\e4\12\d7g\a9 \d0\0ch^G\d1\c1\a0\a1I\ca\1d\c1xdb\db,\1b\e0\de\e2i\99\11\fcx\8f\be\ad\b0Y\cd\95\0bc\1fkf\bbdk\c8\01\82YKG\c4\96Y\e7\1c\d5\ad\e5\adh\9c{\e3\a3A\e6\a7C\f2\8f\e0\e0\a1\f9\cd\8c\95\9c\02\8a\b1\c1\88\e1\b1\22\f6\1b\b3lt\a9\00\b7\a9\0c\ef\e6\7f\a9\aa\90\97$o4\84\02\0f\ed\d1\85\fe\f1\b8\e8t\0b\dd\d2@`\12\1e\f5_\8eT\da\5c\97\14\9be\c9\99R\a3+\a8\98Z\e0\12p\a1{s\81\88\c62\ba\ef\1cP[\14I\06\96\bb86\c8C\1a>\00\e5*\d2k\f5S\ac\e9\c3\8c\1f\18\cd\ca\80\91\f2Iq\5c\b0\03\92\aa\15jC5\fe\c0\d4\c2\064Q\a3\ec?_\a4[<\14\09\c9J\8f7nL=s\b1Ti\bf\c7\f83Y#[,\c7\0d\fe\82\8e\88@o\80\e5\ab\d0\b7\f2\c3\fbH\a8\1fLYfz\b59n\11\c4\1f\88\b9\c4vd\bcd\15\ef\ceMa\eeN\d7\e0q\d2z\8d\beg\87\0c)\ce\9d\9a\0a\a7\85\b7<\e6\ebm!_y\22\ce\01\95r\04\fc*\11]\bf\90\85\e2e\d7|X\a3\1b\1d\bd#3\b6p\f2^8\c4c\f2M_{\dbQG\e5\8ae\08MO\02\a6\c3\ef\94\dd\bc\14\aa\1a\d7\8b*\ab\99\dbk\bfZ\b9\f1%T)\e8\1b{$Vq\ff\19\f5\bb\15n\0d\11+c[\b6\f3\ef\c2\96\bbo\1eS\1co\f9\9f\d4\bb\b8\b1\0c\eak\d3 v\84\0a\91\13\96\ce\e6\9ePe)C&O9\a4P\93@\cf\e7\e5\a2\05\b9(\a4\11T\9c\014\b5C?\b6\19D7\a7\e6}\e1\ea}Of#6\02\0c\91C\06\fc\da\e7\0e:\dd\f8\ab\17]\0e3L\9ba\ef\0b_\f5\9a\d1\7f\d0\13\d1\9eC\a4\01{\e6Z\ec\94M\d2\f0\1b\9a\10\92\13kj\8d^\90\1c\18\82o\a4.lY\ab4\c0y\bc\a6\cf\a4b9\bd6\be\12\04x\b5\12\d8\a2\13o\feG\ab\c2OIz\09s?=Xu\ea\cb\fa\a7fbe\b1\05\0d\e4\cdsk\db\d7!\96\0d\f2\b4G\1b\00\fa\e42\81\d7]\ae\a9\a7}\0eY\82\c3\7f\9e\fa\f9\8e\d5\05\01\fa\1fz\ab>\8e&T\a5_\ed\90\91\bd\c1\f8yp\16\0b\1a\c0ZLuY\a0\e4\98\18\81\eb%\18BD\a1~\93,\ac\89\86\cb\a2\98\ff\a1\87\06\1fHE\09\e4\03P\1c2\f0\b0B\ff\e7\15\e9\957\d3\0f\b6t\a5\d3\be\1cE(\03\a4\ac\d4\96\b5\d5 \ae\d8\08\f3\1d\98|\07o\8c5\9d\9e\e9\af<\bf\b3\83\f8\fc2\ab\a5\053E\d7\a8\de9\dd\a48\c1r\12Y\db\de\c6\a3\c8\e9\1c3\be\19\ce\f3?3,\0a9G\fc\e6\a1\8dO\1f\1e\96e\a8\17F\d8\d8\a0\f1\c0j\5c\c2\8dQd\de\a5\b4\1bF\c9\db\1f\b1\bdr\1eJ\06\b8r\d0\bd\f6Sk\e5\99EB\c9\fd\b7\05\86\9c\c8\84\bbI\af\d5\b2\0eBe\0d\e01\cd\f4|\e7\12G^\f6\1dN\c9\8a'\fe\83\05\f36\0e\9ekv\8fQ7\fb\97\e2\1d6\dac\bbL\b2=\ce\14\aa\e5\beM\d7/h\f4WeR2)\ff8\06\e2\16\99\13H\e3?\e0O\03\82\dc\87t'\19bk2\d6\b7x\d7\1a\a0\f7\1a\bew\92\b5\93$\0fKmGH,\0e\09=\c9\c8\de5\f69E?l\85\8c\96!\e9.Tf\96\cc\81\c3a\04E\b0\a6\b6\0a\ed\8d!F\c8be\9d\09F\e3l\c3\f1HiVC\05\f2\c7\95!+i\cez\14\0d\1c\9e\83/\caF\09\5c \0a\fbg1\b9#\f2\a8\97\ea\ed\d4[Qq\85\f7\cc\17\04\09\e2\0e\1du\ece\fa.\a1\95\83b\8d\e4H\12\a4\fc8\07\a0\d9\b7}y\9a\a9\98\d3r\18\be\8d\87)\ad\fa26\c5ACu\f6\eb\82\8e\8a>\d83\c1\f7\1e\a4\eb\d1\9d\8a\04\93\06\fd\bb\22|\01\8f<_\a8H\a7HH\0d\8e#\b9k\1d3\bd0\8d\c2!Mv\11PX\cc\93\94\8fg\f6a\b4\99\a0pQ\c4\02\de\94~\f0\1b=\80\9b\b8jY$\88\e6\80T\d9\82\8bhs\e1IM\071\b7\04\fa|\c4\22\b7\d1\11\88\5c\10^3N\ae\b9u\f3E\0b\d6\84HV\d4\04\c1\fd}-\94aW\06e\c3\a9Vs\da\fe(;\ff\89\87\b7\fdu\aa\1d\bf\8a\f7u}\ea\1e(\5c\08\b4\f0\88\8eo\efB\e1\c4\97]\82~\ff\c3\22\fc\11e\b3xL\04\e3\0d\0cB\cd\eb\b1\1d\bb\19rDwr\9e\d5\95\d2\05hG\b5~\d3 c<3KU\8a\8aDsQ%\11e$u\ec\b6Mbq\c6\c3IO\d7t\f8-\f4<\cd#_\e4&\b4\fa\f6?\d3,\c5\a2\18\c3=\88\8e[\8d>\22\8b<\8e\eeC\946\84)s\f1\db\c0y\09-K\b7\df\d5\a5\a1\db\b5\a1\1b$\9e\a3\0c\0c\8dSi\9dv\a8\f4\cc 4\83X\f6\e6y\15:[\d9\8a\1b\fb\ae\963\f0\c9\1eB\13\94\b9z5\0f\b0\90\94\03\ee;\d3\9bMSQ\f5\ba\a9\d9\c9gm\89w\92d\12\c8\b9\d4\ca\11X\92\ea1\be\13\8b+\010\15@\ebY\bfJYU\10@\cbc\98\ff=\9f$\05\c71^\e5\a3\c0)\a5\14\cb\b0\95\12\98=\d8\bc\cb\b4g\ca\b0\b1\d2\ff\1a\feF+\d6_\d0I\94|\13\d7D{\0a\b3X\a7\e0\17\f6\96\c93\9d\8b\bbg\bb\c6\bd\cc~J|\17\96lt\c4\82\5c\00\d3\97\13:\f92\ba6f\a4z\e4G\a3\a3uN\ea\c5F`O\04X\f2\dbx\1c\b2\a5\88\b2\81}O\8cA>N\edh\0b-\bf\a3\91\ae\17\22\f0+\89f\bd\8c\89\04\de7\06T\c23\a4k\ea'\d8\0f\0c,V\aay.\04\dc\c8*5\0b\e4n\bbt\b6\f2*]m/m\b4\9b\1fc\b8?\89\05\b3\e7\b9\acf\be*P\a4{D\14$\87af\9c\85\a5\ca\f0T\a8\1e_9\03\b6\e0\0aT\1b\a5\b1\a25y\92J\b5\fc\1b\cf\11f\c4\acK\04\11\d7\14`\09*\c7c\ce^Ny%\0b\98}\f9k\99\b4U\9b\dcD\dfW\cc\afu\93\d9G\06\be\84c\e3\05\b4\a8\f9~\caf*\1a\af\c6\b9\d3\ce\9a<\18\b7\18\cb.\15\b0\c2tt\d2\a2\d6\d7OW\9f\107\0c\f83\11O\b7\91\17\d1:\e1T\15\edf\fa]\deWW\cb\04\8a\c4\06\1c\8f-DM\d3\b4/\c6\05\aa\a6\ddk\caC\dc\b2\9c'\02W\93\eaU\c7a\0a\97\f0y\e5\84\e6\f9\f49M\1d{\95yQ\f5%j\9d'\b9\1f\aff\bb%\95\1b\d7\97\9b^\a0\b4;_\c8\95*\b2U\ab)\1f\14\10\c7\0e\ca\e6*;S\ef\9bA?\edY\85>\17p\ec\e2\22\fa\86\0e\ea\02\d4)\87\bdr<\931\13\c1\a9\9d)>$*\02\ac\ed\faV\fc\c7P\c2\c3\b6\88\d1ZP\09y\a4\a8c\eb\83\81;\1a)|\c2n\8f\b7~[2\a8\d3+\b1_\c4^\ce\d6\adY\98\ad'5\be\ba\c1K\17\b5A\999\8e\d7\9b\93\f1n\e6f\b0\98\e3SWn\f3\8f\fe\7f\feuu\adjP\7f\e7'\dc\b2,_\1e<\de\d4H\a9T\c2(\a4\9c\91\b6\7f3@l\90|\88\ee\04q\0eDj\9e\14\e7mcF\d6D\1d\f0\9a_\ce\bc\88\b4)\dc\e4\c6R3vA\14\c6\bb\16\08\86\fcV\e3ni\c6\f20\08\c0\a5P\d2\01\af\bcc\fc\b2\07F\1b\f9\af\91\83\e4V\e5Q]\cb\c2\e2n\fa\86\eb\c3\aak\83\b9Qc\a8|\d7l(\c6\c1uX\88\86r\91\ef\09\00\b8jo?\06\5c\1e\03t\07\e8\b6\b8< \a1\b7\a7\a3\b9r+M\86\1d\a4\87\03\9b\ffS\fe\cb\01\f3\a7\ec\a2M\8c\fa\e0\19\f6Q\93\cf\00\7fs\7f\97\bf\b3\80M\8e\cb\ab\99/\f4\a5\eb\14@$c\c9\beS\f4}p1\1a_}\fe\8cU\8ep\aa\e1\04~\f3\e0\b4\89\98f\09\5cC\f7\14\bd:XJ\b7\c9+\01\02{\e4\d3O[\14@o\ee\a3!]\9bR\e4\ceEMe\08\f0\03\87\00\b5\99\aeR\1d\81(S\ebSbi\eb\d2y\efN\f0\d9\90\e6\e1\03\9d\0ev@\e4\1dn\e6\f7\99u\03Q\18\17\a9\02\f7\ee\90\89\f1\8c\c0\b9\a5\0dz0\b4\fe6\80\86\f7W*\db\a6\07\f8['\e2\f5,\98\1eG}\81fH\10Bw\0f\bd\faFp\a8\07\05\b5\0frIp\10\b8A\c063\1f\ca&\0b\aa\95%k,\f1\1e#\17\b0cR\e6<\ce'\f9\e3r\98\85\e9<\bcO4\f1\bf\d0\a0\d5\9f\db\bc\de/\eb\bb\09\bapNe\e5s\98\d8\c4X\e4\bd\e2\d6(\a3\9b\c1\ee\e0H@\c7\04\b6\f8\8f\db\aa\e37\d7\87\5cu8\e1\dc\81J\e27\84I\d5Q]k1\1d\9b>\8d0\be\f2\dd_=\b3\a5\d51}\f5j#\189g\8cO\ac&\1d\aa\91\97\ccr\a1u\02\c7\91\d2\b8GP\fb\b6C\dc\03\02\d2\1c\11hD\96\ff\ae\22\ce\f5a\ad\08\5c\a0\90\9569r\91\d7s\ba\91\a5\ba\cfk\0e\ffX\91\e1n\beN]\93\e1\f7z4\87\93Y\03\0aw+\9a\1d\baD2}\98\cd\f2qjPD\15-\93\d4\05\01\1b'3\dd\19&fC\c2\fay3BL\9b\cd\c76\b1\ca\00\f9\e1\e7\b3E4\16WM\c1#X\03\ee>\0c\9f\dd\cb\e6z\5cG\1a\da)\daK\15\c9\a6\e0\adn\b9a\a1\e3\09+l\a2>\e4\c9 \b2\bfs#v;\a5\df\87\84\e6n\d5`D\be\ed\d5\92U\b3\f2\9bz\d9\07iF{\0a\05z\99\ca\da\c3\cfI\af\a1\1f\c8/\ed@\22\e3\22B:\1d\1c\a6\f2\80!O }<\cf\de\c3\b4\89N\b1\84\f9\93&@\f7\b5Q`\9b\a7q_\c5\1eS\12\80]\83\f2\c52\92j\8f8\d8PP\9f\a4\9a\dc\f8\c1:\fd?\db[\8c\aaG\98\08E%\8a\b3\df6b\e5\b5k2\ae\06\14Ee29f={\da\e2M\19\81\bcg\16QB\e8\13Xg\b8W\fcm\1f\f2(%\ee\ed\14\e8\aas$S\7fA\d0U8\c0xt\99\c8tl\f3n\08\09\a2\ce\ac\19\00gO\ef\08\b8\8eWV_\8b\df\b4\06\cd'L\19> \f4\ab\98\920\e0\14\17\db\fas\9f\83\0e[\05\1b\1a<\ef\05)\9f\e2g\b1+\e03{\81\94\12\f1B\c0\c7\97^\cf\eex\22\eaK\c1AB\f3}\159q\8f,1\99\a8\81f\15\11e\b6\d9\d8\11\07Fc\c2\22/1\f1\19\f2\a3\fb\1c\ac\a7\04`\d5\ec<\df4\96\d8\a8\9d\058~2\e4\82\a66\c4UV\a2\9aRT\22\e4\eb\9d\e6/M\97\7f\e2R\91\cd\c9(1\b2\e4M\84\d0]\04\02I.E\bc<\82\d9\01a\b1\f0\12\1a\8da\05\aaR8\daS\03\1d\e4\0d\b3\e8\9a2\98(:\00\ca\c3$[h%\0aY\00\fa\92-\f8D%\b4\81.\8a+b(z\ae\93U^\ffL\81\f5\87\c6\ce\90\bd\be\cf\fd\bfh\a3\8dt\01\c0\c8\c1\cd\c4\97\e7\fe\be\11\ac\fe\c4\f3H\ea\ec\5cl\99\b8'\c9m\e9&\b2\a3.\96\99\aa\eeT\c4\9b\ab\1f\03\ba7Wd\b3=\a3wRKk\ad\08\91\87\e2\f3\08&f{x\a9\d7\b1\84o\1a\f2\cd\96\8f\c5\98\89\c1\ae\ab\ea\b7\dd\bd(\d4\bf\89/\99UL;\ff\103\bai\e0\0eI)T*\0c\ba\c6\85R\08\a1\ad\82\19\1a\16\98\84\dd\b6D~\a0\f8\b7p\81S\b57\11\91\12\dc\8f\111\12\0f\bfh(C\8b\7fj8A\04xd\05X,R\f0\8a@*\9e\18\82\85\ed\ebps\a4\f9\f7\e9\adt\f5\17%\d8\b4v\b7:\f6\feg]7$\d5L\86zt\a4\0f\0bs\a8\b9\e2O\fa\ec\ac\18\e20\96C\80?\d3\eb\dbx\d8\12\1fR\88i\97v\c1+!\9b7\08\11\03\d3ns\1bz\03\c3a\01\e3\16|\d5;Y\0d\fd\dd\cf\e5\19H\c8\90\d1\93\b9D\84h\07\22\ed-\02\11\d1W\aa\e3<\e65\ba;'\fe9\bf\c9;\caw\90\a3\ffN\c7\09;\81@\e8\1f\14n?\acU\efa\d8\fc\9eL@7\85+e\16\04\1b\86\d2\09x,\ffi\8eS\06\ee=\e2vo\d9\ea\990\09\c1\85\ac\14y\d2(\f31\0d\b8\98~\f8d%\bb\d8\0f\faV\b2\18\1e\ae\d8\97\8b\1b\a6\be\c8\e4\19\98\d4F\07-\8d6\8fj\ce1\aa\c3=\18Q\14t\93_1\f5\b3\df\ed\b8n1\9e\be\d3\84\1e\16\c3\ea\a7\8f\04\1a\09\d70d5\dd\b1\ac\84\b8\e5\a5\cf\d5\c0\1a:\d3\e3A\94\c6\05\f8\a9 y\18\a4\c1\89\da\dai*\88\92[H\ee\e7\18\11l\c2\ce\05\b4e\c7\a1\ac\82Nn\ff>\9eo\cc\df!\b7+\0a]\fd\f9\c1\95Y\153\c6\ba[\8ey\9d#\fe\157\02\07w \afk\c7V\ae%\90\c0\0d\ea\f4\98\96ME[\ae\8d\d3GU\be\e7|PP\89\c3\05\c4\15\efn\5cc\9e\f7\e5\b2c\9c\de\87w\c5\f2b:\00\86a\c5\1eq\a4\b7\09\01a\a6^u\b7g-\93\d7\89\08@\09\95B\82\a6^H0\b5\9c\e9\a7t;\0au\cb5n\85\03aT<\b3Z/-N)Y\bf\eaQ\81E\b3L\dd\b0\ab:\9e\97\fbO\bd|\9f(\bd\e5~\a8\18\8d\d1\d7i\aa\a6\b5q$\04\acZ{\e8\9a\96\e0W\f9\86\88\0e\1c\17CN\bb\d17\9d_$\88Sg6\ec>QB,Ux\db\b2>~\cb\c1\e5\92\19\bb\fe\8d\93\b9\9eg\d8\d8&\22\f5+\a9\c8\81\82\07\ef\cf\9b\faY\d1\ee\14J\85dC\95)\bbH\09\87\a5\8c\0eZ3\f1\d8\07\b0\ee\feT5\e7W\0c3\de6F\a3e\82?%x\b4\db\a1E\d5\e9\82\c7|\02$\e0\8c_\c9\17H\db\de\b5\ed\86\0bg^\f6\fb\d7\da\e4Z$6\ed1\cc\0d\c2\dd\12\ba#\90\b3\02bZn\a5B&\98\ce\00yZ\19^\91\85:\8f\8a\afP\e9nNT\00\cfWN\1b\f3\a0\e7\f1S\ad\a3\bf\cd\b8\d8\e8$\c24\05H\f9*g\fe\d5)\9f\d18\de(\e0\b1\c3\d6\0bT\dd\f5\89\83\17\dc\fb\a7\11\22\d6)f\e2\dfO5wT\11\db\13PZ\84\13\b0I\91&\1c\c6\b0\8d\5c\f2E\ae?\f4,\98fx\97\a7sCnw\9f8?\1dF\fdvw\dc\b5G\c1\a7M\b2\ec\bb\c1\ec\93\e7\d18\a8\ca\07\c6\d0\11\14\1f*F\ed\94\a2\a1\80\87X%\db8S\f8t\14,\11\e7\9c\bb\fb\ed\a5{\a5\b5\a6\d4c\84\1az\f0\df\82\eb\f8\ef\0b\a1 m\d2a\ad\0c\fb^v\07k\cei\9e\10\04\f5\9fC\96\e25*\f1\f9\92koK\93\88\8da1e\e9\a8\c5H_\8a\a2g\9a\a2\c0N)f4\cf\a50])h\88[\a9\a73\d9\c5\19\ee\03\04#@\92\99 kB\e1\f9\94\e1\82\c5\c2\22d\eb\c8\cc'\e6%g\db\8b\08\e8?_\9aL\c3\e2\bb\cet\15(b\b1\f4\09r\94\16\b9\f3]\08T\89r\d9\f0E\b9{\01\e1\a0\dd\b7Q\9f\1fB\dd\c9\c5q\89\b5\f9\d3\d3\e2>\0cto\82\c5cU\1d\bf^\0e\a6\89\93\0e\85:\e6\94\90W0u\fc@r\12\b9?\a4\9f\1aO\bc\f2~\df\d5\f5\c3\90\13D\afI\0fZ-\f5o\d4\0fll\c7\b4\e7\5c\fbE\fbd\b3\a0}\fa*Ove\c3l\0f\f3|L\f8\89P1\10\e9Y\f7\bcf\d4Ro\b8CFnO\f1\0f\9d\e1BWQ#\c8\d2\15\f3\c4V0.\98\96\ecL-\b2\83ZU\93k\19\c2\b6j\bf\a1G^\d3\ac]\80\11\bc\f0\7f\04\12|\c7z\a3\8c\e4[\a3;\c5\bf\e7\a2M\f8\18\a8w\b6\a9\8c7\cfiFQ O\d4\01;\0b7\91=Z\86\ca1iu\9e[V\8b7Z\ab\a7\ed\8d\01\b81?\07\e25\99\c8\bc\e0\eahev\ee]\22\fcx\fb\b1g\d5\ad\b8\e7\e1o\ba\d2(oA\04<|\ddC\c9\d2AZJ$'X\e9@\ac\b3\12;\b6R\98\c0\9a\dc\d1\b8\da\d2\ac\fa\9b\c7\af\f6\da-\d3\cc\83\ccIk\f64\85fg\87\05.\af?\cc\5cl~~\c2\d0\b2\a6\c6\bf\f0\80\05\cb\bdf\94A\1d\92\02\18\15\c9\93\91\f8UM?\f5\b0\c7\c6\ed\22e\9f\90\a6\1df\afyNK\c4\ccP\9c\ec\c6\e8up\87=??R\02A\8bFEN@0\9a\0f\faO\be\fb^\cd\fc\ec\f1\02\ab\e8v\80G\1271\0d\1b$\95\dc\95\967\c8\c0\97/\da\86\cd]\07\ce,\e5\d0>\d077\ef?-\9a\abF\df\90N\fb\05\8a\e0\15\b8W7E\e0\e7%AWrN\d8)1\8f\e9\b6\d6T\14\14\9c\11\0c\ad\acP\97%\1c\bfE\92fA\0f\98\8f\c6-\cc\04\8cZ\95-\9d\bew\c4y\c7\b0z\c6\8d\a1\1f\18\95`\e7Fz\a0\13dKp\8d\12\afmb\13n\ed\01\05\ab\99\13\fb=\b4\f9\09\bb\c4\f8\7f\0d\15\f4\e0*a(\ec\be\12{\85\1a\eb\09\96Z\15\bd\bde\e2\beR\12-\03\ac\bbHJ\f4\d3L\02F\a8)\c3\a5\b2\8b\05\9bd\c7\00\e3H\f7\ba!\a9\22h\c4\03\fd\ca\13\8cdz\90}\c9\ca\c2\f5\b4\1b\0a\cf\b4\1f\19\98\f3\8f3Z!J\93\7fB/\0aAcG\f3\f1\dd\db \d5bCw\82\fe\0b\95@I\a8I\edn\12\f3\15\b15m\02\f2Y\88\22$\87\0c\0c}\fbh\89\80\98)F\a3\b8\ed\89\f9?8\85'\00\f3\f8P\b80\ee\9b\c1\15\89_\90\92\d1\97\c5\c7z<0\fa\01O\a2:N\e1\b8\c7#\ba\e1\13D\1f\c7\96U\c5L\f6\96/?7\c4\c8\0a\a3\aa\f6\22\c4W\00-\12\06\a8\f8\82\b8\05\c5a8\80\fe\ec \0a\b6\c6\8b\ff+)\9fw\fdQ\f8\fb\fd\b8b\e5\06\08@0\bei}\a8\bf+]\9c'\f4\dc\8a\c5u\1b\98\91\fe\e9\d3!\ea\05H\f71\dd#\bc\d2\14\e7Z\ff%\1e~\d1A\89{~\bf\9e\e3\c9\81\13\a43\e8\bc\b9`C\18\be8\10\e5\22\db\96\89\e2;:\03\93\e8#c\cfe\ad\d9\12\8b\01^{\04\e8\93\f3\0d\c1\c1\bb\e8d\bbwiHV\1e\a5\14\c0\13\9dC\fd\cc\f6\85U\fcm\a9j\cbSH3\d9\ac\07\d4h\aa\a6\15\b5\0b\0e\91!\af\eb\a9B\cbNl\d1d\83]\c0F\9d\ba\e0\ae\ad\16\a7W\f4\e3\da`b\ba\18\cd>BO\c6\fe\a0%\7f\10_\ab/\22P+\1aoA\cf\1d\8b\87E\0dn\85nA\8c=\cfubj\1d\a6\e0N\d0\fc\c2[\04&\00=\85\b4\a8\95\d3\07P\e3\873\0b\f9\e4\1a\c6\f4\02/\e2]\93\de}\c8\cd\a6\9a\eaP'FTb\d1\01\06\db\11\0b\fd~\91\e7\83\0e\a3k\c8\c3\a7@\06e\d1\fft\b3E\a4\85\17Nbi\b6\ec\22\f6:Q\b7d\1e,\bb\a4[\ef\843\9a\09\02\d7\ba\bfO\ed\b3\8d\a9\ed\ce\be\c9@\df\8f<\adl`\d8\b7Fn\05;\e6\ce\c2(\d3m\92\01f\c2\d4Z\d6+o\86z\92\09\dc\c6H\c4D\13\d6\dc\0b\ad\f3\0f\fe\9e\c1\d3\bf7\a3\d4\12\14*\c7\bfJ\ee\bfq\ad}\cb0\01w \e0\08\b2\b3\00C\99>\e3\19\fe~\17WC+-\fa*\d6v\b3o\bdg\85#\c46\17\cb\da;\b1\c27\d2\99N\cf\91\9d\e5w\da\ad\14h\fb0\cc\f5\a6\fb{R\af\ef\d7\9e\c8\01\ae(\c8 l\b8\00\89ZQ\9f\80\a5\0a\e9\d240J\a4\f6\c7\f0\9a\0c\feF%j,U{\97w\99\aa0\90\f1r@sx\9f\0d1\d3\b6c|\19FI\c4\b3\c9\db|\16\89\e5\a0\9b\0a\9e\ea\84\cb\d0LQb\1e\8e\9aD\9e\5ck\fc\04\16\da\02\a7\be\98\8d\fb\89\ecW\ba\ebZ\00\84D\e8B?\00)\eb\9d-D\c2-\12\f9\fe\17v\c7 \bf\a2\8c\bb\9dP\90;p\ee e\ee/\e1Ec\b2\f61LQe\bbG;\8c\e5Q\fd*\cc\9eJ\b8\ed\c5\0e[Q\22s{\e0\a7\0fpT\e1hg\d0\ec\b7\b9\8e\af\93\ed\bc\9f}\8e\fdyW\efN9\b3\0d{J\94\c5J\e3n0\f8\a5\f8\f9+\f9\00E\07\b7D\a7\b5'6\90'\d4$(\ab0jL2\c9o\feV\f0'\0e;:n6\9b\02\06\cd\be\ed~:\ccp\9f\91\bc\d0\c4\c546^T\7f.8]\98\be\85x\a6K4\06ppGw\8f\da\13\f2\ae0\f6\1d\f3\89^\7f_L1\14\95\9f\fb;\92f\f2\de\9d\a2|\9a\19/\f6\87&\b1\a5\f6\e0\ca\04\b1\ff\cb\f5:\ac\a4!\9b\b38)\ca'\91\b0\82\ab\1eM\b1@\cbF\e6\f2\f0v\91\1eY\b8\0b{\9d\d4\9c\1c\05\c8`\9df~\d4\95\89\90\a9'\d3\9f\c1\feA\c9\9a\a5%\81\0e\f2\1c%\11\82\ca\e3\f11\bf\d5\b3H\f3v4\85\95\08\9c\e7^\d7\0f\15v\c2\fek\f9(\99E_\8da%\e0R\92G#\1aX\7f\89\f7\f2\f3\87q\bd\9b8bcZl\bav\b2\fd2,\1e+\df\ab\ba,x\d7\80-A\b2\8e\9f'F%\a8>\7f\dbo(\ef\86/rE-W\0f\ead\09Z\dc\cb\f1(\96\ef\a4'\a4\c4u\9c\84\8fW\92\be\82\a8\f4\c1en\9e\e79\92\eb\e3\08\0c\d0\d1\cb#&\f2-+v\fc\c9\f4\82*\12\85B\81\d1M\d0E\ec\8a\fe\ff\f5p\ecV\ab\01okE\d5\de\e8\c71\c1\ae\c6d\aa\b7\96\0a\e9\1c\d2\db{\e9~iK\de\e7\0d\89\f2\b1)\89<\ca\5c\10\83\e2\c1\98O_\ebi\e3\ac\07\a0\b4\92\be\f3\22\13\ba\d7j_\981ZDGZ\de\f0H\10\99Er\c1\d7\af\a5\e0\c6\9aFhOa\996\99\b3\02\cf\c5\f3\0c\9fL\a8\88\d9tOh\15\d7H\c7#\99C2\91\0b\fd>\fey\01\08\93'\14^\9bP)\87\87-U=\8c\1a\c3P\bb\fc\af\fd\98\aa\a9v\eb\9e\86R\bcV4F \ef\d4\9ds\89\1c\bf\9c\c5\88\e2\ab\11\e7\b5O\f6\e8\b2\f2\e9q\d2\e6#\c9\d5\1cH\1b\b7\1aj\f0oo\ffz\80\ea\b3\c9B\a5\f5\c6\c9\8a\14\d4\8b\9f\c8[\96\af\d1\cb\ffQ\1e\1bS\d8w$0p\ed\e5\af\cc\95\c0\b7\b8\a5\b0\e7\b0\dfQ\d6\e1\91k\f8\e1\d5\06c;\c5\b7}\d0\1a\13\b2\92\9a\f2G\bd\0b\f60\08\07\1ci\d0\14\0d\ecM\f4\dae\d9}\c7\99M\c1\d6\e9[0\c9\d1\06\9bW\d0\dd\09IL\bf\17\f9\ed\92\bd\b17\08D\c0o\cc\13\a4\bd\dfS\dc\9cO\0cR\b2\95f^x\e5\c6M\88\f4T!ZB\c1-\fc\a0\97B\f0\87\e8\93\ebk\ad\1e\b8g\83\a87\c3o\10\ca\e3\cb\10\0e\e2h\dc~y\a3\05\1a\fd#\c4\0dZ\c4 \9d\1c\98F\cd\ece\8e\cf~\e6C\c2\8fCM[aG\87\f4(hx'\a9[|\a2oy\09v\92\d7px\9d\16\c6\f1\c4 \b0<\f4\c5%\d2\d7}z\8f\fd\afe\5c\cd+\aaF\b7\ad\a2\82\e2)z\9e\82\b7\df\a2\d4\c2&\85\fc9\f5\bb\a8\a5\ccw\08\f9\ae\0a\ce\fb7\d4v\d4J\e2\e3\8d\8az\ccS\0e\af\f8\12\9fOOd8%\e5\d1\dd\ee\c5\a4*\9f\cbC\1f\08\c3H\fb\8e\e5<\18\fea|\db\c9\ff\e8u\f5\a7?&\d8\a9\d1\1d\f5\11\04\f1\daSH0\d6\e4Ugt\f8\85\c8KQ\dc\cf;\e2f2\ee\8a,x\a2\dci\05x\0b\99b\90\04\c5\d9'\eb\8d\94{3\d5\ff\90\11\bd\90\d6\f6-_\e5\7fk\13\a4\8f0\d2\1d\f9B\0b\ab\bfIc\a1r\beP\1f\d7C\10\bb\f6/n\9d!\d0\97z\02\e4\a13\09\d7!\f6C,\13)\1d\0a*\82\f4_-\c7\9c\fb\97\d2y\c64,W\d6~\d6]\f2\c9\1f,\fa\8bN;_t-d\bba\ce\8f\9e6bq\1ee\978\bbt\c7\9dl\88Z$U\fd\ab\8c\fd\0e\e5\eeA\dc8\a2\c2\8a.\fbZ\5cy\ca\cab\85N\e5W\1f\9e\0c\afz\11A\0a\a33\a3_\8f\d0\09\c0:\1d\82\04\ed\c2\f6R\0b\141\1a\b1\22\ca\b4\d2o\ea\97%\1b\e1\07\cd#\f2\b0b\e8.\e0u\8bf\b4\83\e3\da6~4\98\94\fc\d9] \9a`\a1\f2(\aa\1a8J\fe\0a\0f\13\c9\d5Q.\9e\e9\94\a3\dftC\aa\a8\114s\de<\18\fb\06JYV\f2\f5-\80\b6\03\c3\9a\14\b3q\99,\f2\b4S\1a\5c\dcWc(\ea$/h\05\d8\0fK\1c\fa\0dT\c7\9b\97=:\d6\8e\ad\d7H\b9<\e9If\b1\b5\aa\070\a6n \e3\18\fe+\9daw\01}\9a\f4P\c4wF\89\a3\1d\9d\15`(M\95+YsNBCN\82z\8dl\f5^\0d[\e9\1cch\96\1dhz\dd\ba\96~\a4;\93\84J\01T\81\86\c7\b8\13\a4\ac\da\e2E`\bb\03\db7\14$+\dc\83\a6\8b\ad\bd\07_\d5\dcBp ,\e7\a3*\17j\fdb\8e\e9l\a4\f2o\df\82qe\b4gEO\03\d4\86q\0e\fc)\f7W\bc\93\b0\ab\da\f9\b0\c5\9dv\0dI\f6\cej2x\11\94\93\a4\b9F\90\9et\d6\5c\f6\b8DUd\f0\9a\02\9c\a4\d4n\f1\99\81\07\de\cb\9d0^gYn\c5f\0aL\ea\16\0ch\ca\a798\b24I(\d4_\c4\d4\a6U\0f)Q\8d|\82dOd\af~\e1\97ft+\11\bettO3;\f3\95\0by\03\eag\dd\ea\c9\f5\05\0b\14\1d\b5\8aC\bew\cdB\e1\9bB\0e\cdDr\cf\07\b4u\b9\b0\cc\09\09~\cd:\8e\1c\88\e85\95\ed\a9,\b9N\8fc\99\8f\bb\9dWj\c9?\02\cd`\e2\04\1c\d0Q\c5b~\a8\aa?\1d\0f\e4\17R\0cm\cc\e3\e7\e4W\c4?uD\1f\ce\13\b1\e1B\e9\f4:\b9\d0\bc\99\fd\00>\c8\9f\7f*3Z1\1c\86\06\e2\e3\9f\a3\8e\b3\ad\97\a8/j\96+\cd\14\f5\b5R\d2I\ad]I\84EG\c3\81\d6j\97u\87\8a\e0~\a70S\22$\c8\0d\1d\efP\0b\e0\92\1e\a5O\e7\d1w\a8\8a\d9d\ca\9a\84\ce6G\aaJ~\0bi`^\b0\85i\a7\b7\9d:\9d\f8#\a3Y\1b\12,\95J\ff\8c\d8\cb:fK\18{\0bO\e0\ba\bb7\b2\16\aaJA\f8\b9X\aed\b3*\93\a5^\95j\01\0e1\87n\f0\c9$\91v\97>\dc\f5\f6\bc\fe\cfb\e7/C&\e1nV2\a8\a0\03\bc\e9\98\0d\c7]\abH\98\b5\df\90i\ce@\c63}v\a8kn*W~\89d4\8b\bbTNmD\9d\f2i*\c0\c7\e3\e5\a7\95s\deu@\92\a8VE\a0%[\b8K\ack\b2\cdqm\c5\8f\b1E\f1\83\bfgp\91\c2\ea\98\bf\c4y\bdvU\f8\da\81q\f7:p\a8\d4\0f\e2\f9y\07\c1w\db\99\98\86W25\01z\e4\85F\da\eb\b0\e2\b5\e4\f7\ab\ed\d0]\db\d2\cccQ#^\d5\f4\d6\85W&\9d\dcL\f1\fa\09\ae^\c8\dc*!T!\14\06V\a5F\11\17\93:J\de\1f)\ae\84\e2\9e\02a\97vv\c7\ed\fb\b5\89z\86\b4\ce\19\7f\06\1cX\e3c\e6\153\13\c9\b3\93\831\aa1h\0f\8a\89\a9x^\cdP+\e6\ef|\a5\e1$\e4\d1l\cc\87}\9d^\cbt\8d\1d\9ca\92\e1P+\fe3x:\dd\0b\b0\a5\b3\ae5\d8\c3n\18\b1}e\abVl\b6\0e[\92\f6\7f\f9\c0\dd\8f\d3Z\09\0c\82\f6\aak\c1\86\1c1#\fe\83\89}\cf\c4HPZ\1e\ae\8f\ac\e22\0c\ec:\eb\cd\fb\ea\ab\0e\c9\e8\83\e6\d4\a2\8f\bd\b3,d\e01\0f\9b\aa\e4\9e\97\ef\13\00\e8\cc\d8L\15\95\82\8e?\92\98|\88\81\0e\b6\d4\1d\08\f4\0c$\1c\864\d8j\e5k\96\08\df\f7u\e5\fb\d8\9e\e4a\f0\94\e41\8aP\22\cc4\ed+i\8e\e7\14 F,\b4\d4y\e5\b12\98\eeH3to\12\1b\d3(\d3a\e2\12\9b\15\d8\a6\a5%\ea8y\a5\9f\c5W\cb\92E\89\19\94\8f\f6\f7\83d[-\19\7fg#\db \1f\ed]\5c\a7\c2@\ff\bc@\8bv\87\d48\d8\a7f$\dcm\15\93\5cN\08A\d5\b3\0b(\e3S\cf\af8K\c1i\ef\91\c1k\eae2a{\f6\89\1e\b4\95\12>\a2\a3\10\c0O=\de\19#\b5\0d\0aZ\19\d8L\dbud\f4\9f\ac\dfj\13\01\b0\b4\9a\de\b6\ca\f1\d9\96\cb\f4\d5^\b2\9e\82\a6i\a7v\c2\99\8e<\86\d8\8e\d8\fe\02\076\1a\c5\19\8aJ'ek\a8n\18:\bf\88\19(\1aO`\04\19 \86\b4E\13\c6\d0\fe\c5\85H\f2Bk\17\9d\8fu2\e0\c6\f6\08\131\d5\9f\09\c9\a0\9e\c8;\91wn:\be\84\a8\dc@\abg\8c\ca\a7\82\be\c39\c2Z\0b\d6\135DXY\0e\eb\142\f9\f8d\f1\0a\95#]\04T>K)\dfQ8\12\0ee\e0(v5\fcH\c2\b9\0f\ebx\aa\ab\ed\f2\c9`\9d]\f8\e3\9c\ef\f9\be\0a\b1\93M\12\9d5r\e9\a8\0e\1cP2Y\f8\7f\9cb\c1o\ca&\f8<\f3\f0\c6z\e3\a0u\8a\f7\ab\eb/\17\f5\b1\0c\18\d5\d6u\d2VU7\99\19\105\c3Q\f7\d9hm\aa?O\a9&\96*\a7\ce\e63m>\ca\cd\a4\1c\f0ZRw9\de_\c3j\c1\c5\b4I\18l\8fr6\1dd\ff|\1e\8fx\93Tn\9d5\e2huA<\bb\ad^;\84y\91\bc\dci\040Y\82R\ec\d4\8a\b3\c5\b6s\06S\c4\84\b8\94\b7e\8d\5cT\99\93\85\d4\08\fa\e2\a7\d1\16_,g\f3\1boi\80nXn\be\e5Q\1a\db\e5S\f7\10\11\9e\e4\c5 \c1\df\b8\b2Y\15+\fe|\90\c8\83\8a\05kb\8b\10\b8\7f\f43\8dX\b2\84\cd\ef{\0e\22\02\f4\ee\9a\e6\92W\0f\14\a4\ae\9f\1c\d3Q\e6\e3\9e\10\a8\08\12i\b1D2\7f@I{\e9,\22\9f\85Bd\a3\b8\f4\ab\f0\eb\e6\a0\89\83\c8\e6\bd\88\89\f0n\fd\00\fa4~{\d1S\bd=\f3\99<$\9d\9c\8d\af\d4\db\d9!\90\85~\07)\e4M\f7/\a2/\03\9d \db\95\8a3\b5A\f23L\b93\05\bc\d8!\1f\b3\f7]7\f1g\fd\0e\06 \11\89\c2~\eb\84s]\a7\bb\be\93\be\ffx\a6&v\f1\81\a3%'\9b\8e%\93\86\dd\88cr\98\fa\8f5hg\07%\b2\c3|\c8\c4\22\08\f7\ff\9c\8d\1d\ca\efF\bd\90\00\a7\b6i9\cd\da6\97\1d\07L\07T\14\f6\b9\d8]\15`\19s\b0&\b4\b1\e0ph\5c\11\987\d3\15\d2b\f9\c9\15UT\b95;\93\c6\01\fb\b9\eb\84IC\c2\dcx\bf\ceI5\9e\edf)\17\85\0eQ/\cc\09\8e|\b4s\ec\b4\be\daD\5cq6\fa\aec~\01\baX\e7`3\93\ec\a4\87\d2K\f2\c45he\e9\00\81\ad5v*\bc\8b\bb\fb\8f%\de\c6\a8\c2gk8\f0\d5b\00Ap\bb\e6\cb\cfh|N\82B\9c\d6_\16.\b5\fe\0f\c9\8a\a0\8a\ab\ca\03\a9\bbn:+\da>p1\ce\ba\a1\1f\8c\b7T\8f\fa\d9{\09\d2W\01\d0M\8f!\06\ed\adl\bb\89\83\94\91\16{\8e\92\9c\df=|\979\11X\8b8\08\1a\cd\a3\c1H\c9\d1\dc\d7a\acIc\8bo}^\c4N\eb\e0g&\ed\09\8e\83\e5-\f7\ac\db\1dfC|\abq\02U\948\96\e3-\93\c8\ab*\f4\80j\02/\f5\d3\a3\f0)V2F,[\a6\f7n\ea\8a\98\04d1\f8\c63|\fd~z\1e\a5\00\b7\f8A\1e\9c\a14\a4L,\c6c\14\18a]\e8h3\c8\00\99C]\ac^\d9\7f\22\1d@\95)N\d3?\bc=f\02\7f\a6\c2\05;\cb\05\e0D\fa:\ca\ec\da\eb\a8\00\cdR5c3\90\00\8c-.\d5\cf\11\dd/U\d3W\02#\a7\ec\bfF\93\c9\c8E\01\e4\88\f3z\fd\22\c9\5cZ\c2\08w\c5\c5\b2\9d\cf\aa\93\e8\05\c8\f1\06\1bx\f2\e8\a3\1a\ea\e62\d6\c2}\87>\1cv\18\9b'\a6\fa\cc\bd\a9^nQ\deQ\7fG1\b0\b2%?\dbH\00d\ff\c9F\b1\d0Qe\b1\1f\82\bb\c4w\a1\d9\cf\d8;j\0f8\86\e5cDI\d7\09\19wRX\13\b8*&(\b0\06\22\a7\f9\8f\06\d8\80\8bK\03\e5~y\bbD\db\bbc\9a\af\f0VK(\85\92\dfi\dcS~Z\ce\88f\c7$\d98N\e2\8a;\8e\dfD\af\bfS\e0\d0\c3\02f\a8\c2\9e\e7\8f\a2S\5c]\ee\0c\e7\8e)jB\b2DS\9b\18f\96p\01\1b\af\efU\af=K\9d\f5y>\ab\d97\daV-\0a\e4\cb\c1\d8Z\8em\e8\a8\11\95\91\a9\c7\86\c2nhB\82\d7\b3\cd\06\b7]/\83\08h\0c\a9\5cE+\c1M\df\ee$\0f;\88_W\c4\a9#v\fc\13\06\f7\ac\db\9fmv\9a\0a\c7\e3\a4$U\1b%4\95Uk\86\cb'p?\eb\e5\e1\8d\7f.\bc}0\b7\89O\9d\fb\80\d6\1d<\c0+\14\16M>\05\e5\c9=\d9\b5D\a1\e8\dc\bd\ce\aa0\c7\fb\0a]\99p#Q\ae\11\dc6\b7\04\e5\0e\e7!\0e?y}\cden\ff\917\828\04\ec\ab\1b\0a\82\bcs}h\b2)d0\c8\e7)\9c }\16\a7\d1\dd\c9?\a5\d2\0f\0eS\a2-\b0\83\c3\22\91x\9bCR\fe\e7\b3\95a\04T\1e>\8c'\eb[\91\5cYW`\90`\df\99\00\1cu\ee\a8(\0b\8c\c5\a2\acH\17x\99\93\c3\06'$6\ae\ca\b6J\e8\1e\f0\0a\82\bc\7f\020D\09\bf\f5\b0\f9\a9\13\15\9a-\f9r\89\df\be\fcW$U\f2`\15\ea\12\9dlV\b3gW\95y\e7\13o\9d\9a\ab\9e\80D\fd\9d\92\09\0bRe\da\b5%I\1f\13z\d3hf\ac\f4w^\eb\8f\f1q\18\d3\84\e3\a9\fe=:6*K\86\a3\868\14\de\01\c7\a8&\8er\0eTj\da\18\f5\81;V\d9POw\da5\88|?Z\b3\cdp\c0t\ba\dfA4m\a9\c4\d1I\ef|\e0\0fN\86\a4A\bd:\16\a69@h\b9e+\e7\fe\91\9cJ&\c9y\1c\19\dd\81R\1a\0e$ \9e\d0F\02\c9F\be\d0\f66\ef\9e\8c\d4\e1\d1\b1V\1f -]\cf\ff\0c\b0\9a\d9\c1\a6=\f15P%\d6\22A\cfr\a3\84t\85?\d9\ea\05o\bcO\01nX\9c\11\f2\01\8ai\90\d5{\d4\07\a4\c8\af\a1\91lh\ae\ca\ca#\99X\8ai:\8f9\e3Z&\bd&BP\de\ae\07\ca9\ec\efh3\1a\fc\8c\02J\04\a3\d3\c7\ca\b9A\cb\0d\d2E\e4s\1fd\8f\bdd\e4\d1k7H\96\ff\90\e8\9b\0f*\12\951\cf \94\b2p\feC3\0e\d9)\cb\d9\cde\df\a1\94!\5c\a4\fa[P\fbh\9d\e1\ac\12\f5\056\1e\08\fem\03\ca\d7\b3\a1\ec\93h\fe\e8\d9|\b2\01\ce&\a8M\08p\ea\9a\a2^\03Z^r\89s*b\ca\00\d6\caA]4\b3{JV\0a\ab\d3\ab,\e28\0d\a3\07\929\fds]\9c\84w\92kb\da\13\c3\05\c3\be\e7\da\8f0Af\5c\00\f4l\94\90\d6c\80\d0U|\05K&\83]&\15\aa\18i\aa\87\98\15&\bf\fbX\b2>T\b1\ef=\9c?/\c3u\9f\c6\b6~\d8g\a5\9e3F\22!\f1\d8\0b2\98\9dd\1eB\93X&\11\fb\13\b6GA\c7\96\d7\bc\bcPS\02SI\b7\fbUe\19\ad2\f3\8a\c2b\d1h\db\19-o\acs\ee\95\04\cd{p\da\c0\f7f\bf\1e\e1\e6$\bc\db\dc\13\d5\7f\e2\e3\11Z\d8X\81\f9\e6[*of-*\af\a1\bc\c3\b8\ee9EX\a8\a7\17@/\c93OAu\fe\92d\08\1e\d1*\8a\84\d1\f1B\f9\e4\c00\15K\ca{cLW\22c \e0\8c^Z\b2/\a5\17\e3\5c\da-,h\09\17^\fe\c3\10\0ci\870\e1\07\8b\94\c7\9d\8b\f3G\fe\0f@\8f\8c\03\dd\dauv\22\b1\9c2\dcc\db\04\f7\f4\10d3IU\b5\18\7ff\ad\ee\cd\8fD?,\c5j\a5\96\0b\f4\c6$e\0aO\cf\b7\d6\e4\e2\e2\ebM\0b\afPZ\c5#c\07y\d0\ec\8d\ab\b0\9e\db\a2\a6\a8\93\02\83\b49\e5j?\c2\fa\15?\98\10m\14\d0\e3\e1\0a\16\02\df\80Yd/e\a5\00\93\c6/m^q\b7eq\f8O\15\1a\8d\b04vG\8f\ae\c2\f8\c7\c2\f5ip\5c\b4\16\b8\daN\c0)\11\ab\8f\cb\02Q\b2\b1\8aeq\beMFIU\e4\c2\02F\bf6+\bc\e9\1b\87\8c\7f\0a;&V\e2\7f\a6\84E\15\c8k!Y\18\98XZK\90\ec,\0ay\8b\a9q\7fh\e3\a4\91E\c4\e9\ed\7f\84\cc\f4\b2\f7\bf\cf?\87\d6\87\d5\97,+\be \f1\ddvQ\91+\1d\f4\efN\f5s\e5\b2\ff\93\10\95\ff\9a\d9\e2\eac\f7\92\d1*\09J\dc\c7\b2\a5\f6\bc\163\88&?}-l\beoH\f89\10kx\f5\9e\d7\88\09\19=\a2\94mp\c18Qy\8f\d0\e1\14\82\f5\0cQ\9c\bdf\173\87L\cd;\c5\98#P\7f\a8\df0\14h9E\845H\dc\a1\b2\db!%\f5:\c7\11\f6'\02T\fb\14>\158\d1\8f\95\18D;\11\f0\d7_\c3\bc\e7a) b9k\acZ\9f\84\96\e2K\97\90\0co\06\fdp\d5\1c\b3\e8\e9I\8bT\e8\cc\00\94M0\b7%\d5C\c3\d3\ce\0cn\d4\b4\c9\e5M\070\dd,f\17\a8\91\c8Mg\07\ad\f7Tn{\17\05\91\9a|_gYN\88J/\88V\87\fa<\e4@N\e4\aco\ccY\90w\08\f8QFqYq2F|\b6:\b3M\c5\a0\88)\c3\13\a3\de\17\22F\cb\9c\89\d1\92\d5p\d2\cb\8a\ec$\189jKsp+\e5\ef\9a\85\a0\d3$\f1\e5^n\e0\b6\a2U\bd\14}\09\1a\89\b9\b1\0e\8a\05\e1\84\ae\f4\d1\bb\5c\8c\1d\9eo\96\08 cc\8e\d5\13e\a4@\be=\db\c6v\f6\d9n\ad\f8\18d\d8\bev\c6\d1@\ee\cd\b0.t\83g\f3\94{E\88\90.pp\a2\db\15\cd\88\c1\98`\86\10\16\92\be\c2\13w/,C\83\a6m\d7\9fZX\d4\0bG\eb7\1f\04q\ac\bb\a9\0a\90\a9lO\91\07\1d\18\dd\e6\1cq \be\a0C(+k\de\dd\af\b4\c8\d9\0f\80\fd\ce\cbj\a7\a3Y\1d\1c\f7\f0\0ey\85\da\9a\a7Mb\95\97\91\04N\e8\87\c3y\9d\d8\b2\d3\f3\c9G\dc\96wJGn\c8\eadi\f8/\19#\01\f1\a6\06X)\f6\b0\b5\15K\96\14\e3\13@\e2\d1\c2y\ae\f0\db\85\fd\a1\92\e6Ez*\a5RN-\b9=\0c\0e\94\0dw\9b\9d\1cZ\e2w\09\c9\c7@]xs\8a\9c\eb{4o\950I\b5\cc\b5\0a\9d\107d\f3\0a\1d\9f\8bX\10\01\1f\c9\f2\02\ed\ba\b5\d9\8bf\cdw\c5\c9\ddl\cd\ab6m\1fL\c7\1c\a0\d6\0e\c9\19\d3\bd\90,EF\cdO\96\95l\17\08\ab<\12\7f\a1)G\ef\a8Y\8c1\95\9dm\e8\8d\e3\ef\f7r\ae\81\13\fc\82J\ca\e0Iz\f6/\93\08%<\fde\0b\ab\a0'\5c\b4\b7(\fe\e9u\c8\8b%\8c\1c#\08\0a(\a7\f7\f8T\d7:\aa\02\07\01E\d6\0a\07\e9\d1\b5\d4\22D.\8d\c6\89\f8-\82a{h\8d\11~\07\c77\c2\a0E'\0dF)?\cdc\01E.\5cM8\14\f7\e0\e2<\99Q\b4[\9f\9c\1bwr~\d2\1a{\a5\cc\edQK\82-<\00\9b\0b}\1b\ca#\e6e\a4Vu\e2\17\ab\fd\de\df&h\e0|\5c\fbn\91\f7\c6\9e\19\acT1W\01\a8_|\92\05.\b3\c6\ebE\c8?\d4;n4\c36G\a9\ea\bd:\b4\95\c2\0avcBB{\c0\f83\ed\81\0a\8f^7\87\f78\a3(\8b\96\c0\8e@\a9Z*t\e4>C\82\d4\d4\17\d2\b6_m\e0\b9\ff\9cf\b8\ab*b\d9\da\1bP\ab}1\e9\10\ee*f=_\b41\c0Cp\8fj\91\b9\ef\b4\b5x\18\7f\d7\e9{\ebh\e4\f8\dfZ\d3\d3L\b3\c6\fd\dc\ab\f7\ab\0b\ed\11\f9Qzo\ff\d5x\a7\c0\95f\07\ccVk\9cS\ae\12\ed\8fUL\f5\bdVZvEd\8cy\11\ff\11\d1\90Z\03\bf\c9\86l\00\c4\85\99'\f8\8a\d7I\12\15\8c\ac\b2\9a\c2\aa-pq\d5$\9b\00\1e\d5\ba'\06\f1\5co\8b4T:\da\bb<{q\be\b9Y\f2\f8\dd\ee\ad\91\d6\ed\85e\06\8f\bct\0d\bd\cd\cb\93\8c\d7\af&cM6b\926e(\ce\af\1a\c3!?\14\d2`\e3}l\e6\b3{Q\87\b7\84\d88\df\c5\8d\9er\e4C\ac_LE\d4\bc\f4\0c\10\9ewj,'$&\a4\ad\b6\ac\d2\b0\13}\06$\8aMA\db\1e-\a7\15}1E\ad\17\f2\f6\19\9b\c2\a1\8c}a\99Dxr\17\f3\f2\c0\81DX+\a1!\98\82\e8\b3F\9c\db\c6\01\87\03\b21\5c\1e}\b9'\b9E\8f\1e\b4qm\e9\9ceR\ef\8e:\ea\97C\02\8c\c6\07\b4\a7!\a8\83\d5\9d\8b+\d0\1b\d9\f5s\00;\9bE\ec\d1e\8b\d3\f7\02)q\de\07\02m=\e8\d7\91\12\ca\9e\bb\886\be\a9\0d;\ccu%\a0\06y\c8\09\bd\1f\00\fbN\df+z\05*\18J\f7\f1D*1\1c\99\03(\a6/7S\ba\ecE\84[s\84\1a\d6\a03\a1\e8\93\ac\af\905:\f1\01\f55~\d3yb\e4A\a6\09\ba]o\f9WmU\da\b1\a0\e1c\83\a7\ad$\0ayyb\f9cD\80\9f\d9\cfA4\f75:\87\0bL\eee\a2\a6d~\88\9d+\ac\ba\9d\8a\02\84\8d\a5\98\5c\ea\03\5cQoS\ef\ea\cc\98\f0J\c6*8\83h`S\cfm\1e\b9-\f2\02\9b/\12ow9\ef\07X-V\ef\0a\b2\92:\f8`\a6\ea\fd\ca\e0ox\d8F\cd\1d\9a\e8\d8\a5\deL\99.\05\8fG\c5\af\c6\7f\e7wn/\80=\86)se\03#\7f\c9\0c\98\01\a3)[\e9\0a\e6\96,\8c\ea\a4\b8\d6\dar\17\dd\a39\02\05\93B\dfZ\ee\88_\8at\1b[\df4\f3\f6\b7\d7\a6\aa\a9\08\8c[\ad\a0\a0iE\f1\1f!!\94\d7C\82\b5\01rh\ce\c0\c3\f7\e5cT\1d\02\84\92\bf\f3%$.\b0\a4DTy\9f\06\a0\c3\aa+\80\82\a5,\9dS\ad\b6]Z\ca\e3\85\8c'\cb\ca\021`\b2\be\93\0fcG\d8\a6a\82W\04\95\17k\f6\d8\d5\de@)\d7%\d3\155Z\82\a5\b5\bcWF\085r\e3\12\c0\13\c8\c3S\e4\01\ab\ca\e5\5c\5c\e30\fb\1f\c6;\a2w\09Ks\1e\7f\08Yc\f9V\98\c65\cfR\fbDR\f7\15\d6\12\f6vQ^\f0\22\ae\e9\cd\ccG\00\fe\18\b2\a6\f8\0cF\bb\a3\a8_\17l\9c\d2\f4\c6\d86 S\9ey\1at\fczI\bc\86\9a\b4\e5\8bf\02\08\ab\c9\05\bb9#\fe#\13\a1\10X\d7\9e\94\f9\c9A\b1\90E\8a\a1\dc\ff\be\df+\b5\0b\9eg\c1\0e\151\10(\df\9b\0c\a4\17\1f\0f\14\ee\83U\b5P\95\80\c4{\9b\ec\09^\fc\b66>\d7ss\e0\f2\8d\89\eesekA\caOO\1b\ef\1d\9a\13\12\04\b9\90\bfk\5c\1d&\f8\8eQm@\a1\17I]\1fr3Qb\d1E\1b+\16\04\a8X<\95YdRz_\15&a\b9WBR\10\f2md^\a4\06I\82L\89\da\e2\a6#\15\9cH\fd\94\e4\8e\86)\91\0f\90\d7\bbx\ef\c3\cb,\fa.H\b5+\ffQ\f7d\c3\f8\d0s\8d \be\83M\e6\dc6\c5<\16s\b1t\fa\00<\90\80D\f5\e7\c7\d8\11\d8\e3x\ddD\e9\ec\cay\bd\ed\95<\f4\82\fa\a9Fe\93\081\f8=\cf\ca\94\e4W\eau\ee4\5cv\94\cb\ce\afK@\d79F\c44>\1dt\f1\b9`\83\c9\db\10\03\bc\9f\81\86\0b\8a\0d\03H\c1\b7\ec[\ab\a14\a6\17\fev\ee\b47\d7\a5\a3\9a\ca\1b=\96\1f\0c\01\f9\00\0c\1d\84\d5\a8i5p6\02\ec\83\e6\03\d3E\f3\e9\ad\91i\1b\12\fc\e0\05.\12\e9`\ed\8f4C\9e\1e\f2\97b\94\d0<\8f\0e\f5\fa\b9\97o\93\91\c5\a5\e9\12\b2\f0S\e4\d5\ed:\14\98\f9\f1\fa\cc\0f\a7a\f2\06\e4u\85\02\c7\dc\d4\ef\ceh\e7\91!\11\96\df~\ad\df\94\15\e4)?%\13fI_\c4(\97\02\13\ef\b6\16\b2\a5\f2\9f\d0\e2H\b3\c9m\9d\12\e6\82\ddY\ad\f2\aa\0b\92\14\87p\02\ca\1e\19j\974\df\01\03\12\97Jq1\bap\a0y&\e9\9b\bc\ed\fb\b2\08\c8x\86\98\16\e8\fa\db\ed\9d\17\86\9ez\caxY\f8D.\b8\b4]TU\b1\ec>2g>Qi!\0fa\cb\c0\84\dbF\cbh\a2b\b3\e0,e\ddT\b0aMT-\ff\e3Pk-FjD\ce\86\b6\cd\ff\eb,\83Q~\8e\1e\82W\85\e3\0f\c8\c2\05\e6\e6\a9Ath\c1\c4\d6\12\c78r\05\07\bd\9e w5]\a9\ac\8d\dfG\c2\cc\dd\edv\10\c6\a9\0a&\9c\98L\b9I\0f\e3v9\95\a0\0e\9e\12\8bu\f9\8e\0c\af\fc\09\caA\c4\17\d3\ae\a9U\f4\9a\ef\1c\c7\c4\ab\f1\1b\8c\de6\19\e5Ef\86}\eb\f6\9c)K\d4\e1\a9\cfX\f6\88\b0\1b(\cd\e4\ef\18\d9*\d4?\bbK<\c5a\f5\03#\f3\80$\81\91\1f\1b\c1\14zt\8f\82\9fP\cb\fd\e9Bv\5c\b1S7\8d\bds\f0}k\08\dd\ed\ab\18\b7\dc\ae\953Q\dd\bb\e9\15t%X{\14\d0\c9\8d\9b\88\94@\0ef\cc\f8\ad\f9=K\fd\c7.\c0\8aOS\a1\7f\eb\8c\ad\9e\7f\e8M\11-\cf\9a3O9\b8\16\dc\e1=\e9\bcw\dd\feWi\97\1d\9c\a2\12\ca\f4$i\18\f0\c3\c6'\1f\9b\87>\dc\b45Fy\fe\ea\c2O\b1\b5K\17\14\d9\d1kd\afS\19\d4>\0bl!\90\11\96\b0\e1V6\be\08R\96\dbPHKd\c5H_\ae\bd\9em\92gCe\a5\bf\b2\94 \ad\93\c3\91\1bw~.\bax\e2)\d13\ab\1d\04\f4\b8\d1\5c\9f\ddz\a3\1e\f6D\08\be\92\8f\9ft\d3S\f7Z\f1\c1\0a:\fa\da\0f\d2\8d\b8\e2\0b\e4\09(%v\1a\c2\d5\dcc\f7\07\89\bb=@8V\a9\8f\e0\87\a6\04\1c7W\d8-8'%\b5\ea&\04\f1\b8+\86l\f5\f7\e6c\a2_\d6\5c\bfS&\98\f1&! &\5c\de\e4\8a\0b\8f\87S\b5\8cc\09\fc{\d7\d4QlG\02\9f\f6Rv\ba0E\d4\93\da=\b7\aa\82\e9\e3\91e\9c\14j\80\d6\ee\0c\a3;\98\fap\ad*\05\01D#4\0d\c6y\0bu\10~\8f6\b8\cd,\ee/\daKp\e4\b77\16\bd#\92\1b,\e5\be\f1n*\98\0c\8d\83\b7T\1f(\b9l\b0\ad\f7\d9\d6\9bl\b0\98\c9\c9\b9\07\e3\bbWG-b\e0\9f}\e6\84\13\e9b\ae]P\f5 ^\fd#\96D\b0S2\7f\c4\95\b0\bf\88\c2T\e4j\ee/\cen\cc\09t\88\e6\f9Z\d7\a03\97=\5c\bbR\81eK\ee\16\a6\84V\b7q\95\d7'\f2\d6\94G\a8\ec\14i\f9\db\17e?\5c\ad(~\fd\91\a1\09H<\d7;\9b\e4\ff\c9\c1<\813\1d\cf\ed+\91\a1)sb\13\8a\fdB\e8\e9\baOr\01\a4\b8\0e=\97\c6<\f7s\05\b0\84\c9\f5<\15\ee<\85\ba\12\9aY\aa\17f\02o\93\19\d0\98\ad\0d:}\b5s\da\c4k\ad\c0<^\8c\feSP\d6\dc\f5\fe\fa'\ca\84\8eT\10\c7\14\81\9f\18\12{\8f\9d\b0\c7\ad8\a9\de\fc?\1b\f2\89\8a\fd\8f\04\d1|V\f3\aa\98y\e7\18\ee#q\1b\cd;\99\a1\eaA\99\eda\c5b\d8\81\1e\ae\d3\c1\a7f\e5\f0\c6U\c1\fdIv\b9?\03\e3\a5\8b&m\d6l\fd0\e3\fd\db\01\e2Y/\91V\08\ea\92\9f\e6l\d4op\81y\1c\a4i\8a\8fj\84\fe\ca\b1\ab{&\a2paX\dd_\05\a1\deL\ea\fd\ef\e7\0d>\f3P\a4\ccC\e5+g\98\1e\83\f0\da\b8\95\a1\ea|\ee~!\ea\85\01\c9q\b0\be\e7\d7c@\db\e0\1d\d9\17\e8\b9\d78\0e\80\1f\e3\e3P\d5\ef\e0$\90\1a\f3$\b5\81Eh7*\d4\1b\fcJ\ad\c4\ff`\995\03c\0d\a7\f4\b7\5c\e7\8c\d2tb$\bb~TM\90m~\8a5\edd`\d1D\cc=h\f6@#bcR\98Dv3Re\88L\95\ea\87n%\a7\9a\11\91\96\94Y\b8{l\ff\021be}Xn\02\92\82x\d4\f9\15\a4\a4\a1/\c9Fr.\95\00X\8e<\e4:\b5\af\cf\de\c7Q\87y\c8\cd\8f\84\1f]\b3\ca\84T\03\13(\becx&*\a5\9f\12\99c\d4x\04\ed\ed\089E\e4\ba\dc\b7y\8bq\b3\c8\15\a6K\13\95\87\8a\aa\95\0e\a6n^\81\e9B\bb\a3\d5`\ac\04\91\cd)\19a\1aBch\ac\e3I\c1#\8e\e4\caU\d1\0aM/\15\08\0e\d7h\d3>\ba\13\e2\b4\bbQ\8ce\bc\fc\ad\01\f2\09B\b1I\05O\e65C\1c\cfb\c74\1bB\99\c8\87\f7\f6\d2\80\9c\ad\f9\5c\a5]p\f7n\00\858@\c7G\87h\f22\da\1c\f2\d8\df\e5\5c\13'$\a1\e9h\cd8\5c\14,Q\f4\d7UtO,h\ec\c5H\11\9di\d5LZU\096L\f8\1b'\afkO\8e\1f\8c0\c2I\d6O\83A\bf\af\d3\9a\e1\b6\e2Z\a9\b2_GY\03\04S\1b\98\daCC\e1Z\9f\f4\d7\e3)5\d6(\b2V.\5c\1b\c8h~\cb\b9\96Z\dc\d2\8c!\eeq6\1fy\041\84>\fa\09\b4x\f1\f8VC\fe9\a6\8d\22\a5\daI\a7\a6U2\bf\88\b1\d4\af\85\08\1ej\c9d\d0(wk\b6\e7\1b\ed:\16\e1?\15\a0\b0\07\df|\e55\f6\aa\9bFKD\cc\dd\920m\99\19\00\9d6\d0\dc\f0\d8q\1e\e6\1e.\8bt\d7\de\0a\f7g\18V}\08M\ca'\98\0a\e1\83\12u\e3\f9\7f\a0\8fV\80\cfc\cf\e0*n\e8$V\b3\f9\8aTy2\05\95]\07\c8s\d1n\98|M4O\dd\9d\c3\8c6\13<\cd\9e\c7\7f\cf\07u\0b\e3\c5H\c7\bb\b8+_\00=\8f\b0\cfA\82WR\8c\b5\b6\b8\df\ee\f4\d1\aa\07\0bdS\05b}\1a\bc(\89\f2\16\f9\e3\b8P,\91 \8f\fe\daskL\8b\d4W\fd\0c\0by\d8\9fyW\b6e\cd\97\05\00~\96\06\a6s$\0e\80\9f~\c8*\bd\92\c0\df\ba#G\e0?!\d3\cf]B\c9\1fB\dcBak_\9d\d5\5cQ\d9}\f2e\f3\b8\ff\9b\02\a5\09\8fg\f3\85\ad\ca\ca(\ddI\b1\f89\f3}\82\7ff/\03\e3\1b\cb!\b3\f9u\1cp\9d\00\d2\8b+\0f\c0/\ca-\84\0a\1a\a3/\dcA\a9\e1\ebx9\19\b0\ce\10&nT\91\1c+?#\90\ea\f9;\16\98\10\af\f8\02\06m7\5c|M\ed\a6\cfR\ee\8c\16\1e\d6\90\b1\b6\e5\1b\b4\96\ba\bb\e7\b8\f2\17\b2w$\18\a5R\0f\c37\93k-\c6\85\c2_\14\92\08\de\ebCPw\ea0\df\a33<\d9\e4\ab\c3\e7\fa.o\8a\8f\010\aet\c5\ba(=\b15A\e1\ab_\ba\d1\c7\fe\98b\b3G\8c\7f\c1\b1\ab=\e3u\82\5c\94+\c7\9c\b0\db4\da\85\a0{\0b\ddh\fe\fd\90\9c\f5\05\9c\f6\e2\c6\de\ac\f6\0d#\d23c\cb\d5\9f\f8\8bGMxK\c3Y\0bz}+9\1e\e9-\0aWf\ab/\15\a7\af\8f\cfyb0\dc\f7H\b8aS\98H3\88\114\f9\a9\08\8c\db\98\05\dd\84\e1\11u\1cH\dcE\c7l\8c\af\ce\a5)'M\c2\f9\9ay\17U\cd\80\22v1\dcU\05\f0\b5\1a\d2\1d\b1\18\84[9\daJ\d9\87\e1\94R_b6\7f:\01U\0cz\02:Q\10 \a8\99\baa\d6Q\b0\f4\86\a8o\7f\15\fb\e3\d7\8d\bf\8dZ\15\b1\8e\ac\1d\d4\80\a36\ac\14#\ae\01\e1\e8JI\e2\9a\ec-\d3@\1c\8eZ\af\93\e6\f3B\a0\cf\ba\d4\c9\22:\ca\ec\09\da\0a\e2\bdJjK+]\01\05\a2$*6VS#\f2r\a5]L\08^\15ne\f1w\dbNs\b6\05itI2\c1f\fe+\c5@\ec\06iT\ceO\7f\c3\97jLz\ad\ea\cb\22\14\cc\22\c3\f4\d1< p\9d\96\b91#\0b)\e6\15?\89\01\7f\93\c1M\88\aemz\f3w\a0\1a\05\bb\bfZS\1a\d6\ed\a2\c6\b8\b3\cc\f6q+\91\e4\04\fa\1c\bb\16\95yC^\ca\e5@#\cc\aej\b4(\e0\92u\92\d9\09\1d\16\ca\b1`\19\a5\00a\92x\0f\1d\e6\cb\1e\b5I%;&\9c\08{\d7\fc\e5\9d\f0:[N\03\bd'\e8\1c\af\c3E^\7f\b0\da (\ecq\afn\f1\b5\ee\0f.j:\aa0:\fe\fd\be\cc\ac\d6\1f\ca\96\86a\e6\e0\ffy\cenf\e01^\f8\17m\f3\17\d02x\9b\a6\10\c1\08o\d4Xr\a3\f7\ff\90\12W\5c/<\fa#fe\96\e4\22\1c\12;\af\88x\ba\c1\0f\97\8fL6`\9d\b7>\04\f5\e7\84^\83\8b\c0\fdH\c2\f2\07\ca\13\14\f5zr\b1e\85kmmp\97G\efs+\9d\b99\95\1bR\bfvrP`s\a6O\a6;\17[\df\9f\d9D?\9b\ad\c8I \c7\e9\f1\ce\85}YWG\ac[8\db\e9s\1a?5b\d19\97\f3\8d6\8bkx\fcY\f9\85CU\90\87V\ee\09\85s_\5ca\d4QuF\e1\c7{1T\10T\13\86\9c!N\c3O\bfp,\ceQ\f9\bf\04j\9f\98\f6\b9\f6}\07\baj\ef\19\90yN\c2\c7\c3\dav\bdB\02\dci\00MA\897\a9R\9c~\92\8bG,\f7\d2-\abn\fc\dd3P\9d\a4c\0a\f1\afA \b4\fe\bbY\df\e7\e3\d8\c5c\d9A\bb\eb\98?J\b0$\aa\ec\86.b\0dl\a0~\b9\f5d`(\f0E\ab\0a\02\8d9i8R\a8.~\a1\05\db~\01\01\a5\5c\dbQ\caVN\ae\d1\c3\07\8e\f4w\ffs\f2\dc\0b\a8\87\05G\91\89l\0a\11\1e\b2\8e\ca\93\18\8d\a1\c0O6>\8e\efB\d1\f8e\86S\0awy\16\f0\19\e3<\b4\12.\a4iY\1e\c4\a7\ce L6#\0a\d2\aar\7f\00\d8\1cG\06\d8\0f8\c9\c2\f6s\b6\e7\ca>\da]\fc\97}0\e7\85YC\afXP\19\d0P\fb\e2\0c\04\e1}%N\ca\e3\d4\b3\db\ea\df\cf\bc~\d6\16;\86\a1l\0asA(D\d3\c0\81@\a3\b2\b7\a4b\d4\14\92\19\10\9a\1d\b0k\03\0f>\e2Cw\bd-{\bbS\de\ce8\87\f2y=\dc\85\ab\96\8b\ddEp\0d\b7\b4Laz\a8O\cb\88>\a1\8a(\fd\b6\033\e5:\c3O\bf\cb\f8\bf\b4e(\bd\16\7fC\8b\db\d5N\0bC\d7R)k6\8fH\dfY\f6\9c[\0b\9d\10\e1\ed\d5\94\bb\c9\e9eF\d3\c9q\a4\b9\8c\a9\82*\01\de\5c;B\11lC\c5\c0\fb7\cbm\bd\e6\83\ed\d7\f1A\94\fd\f1'\8d\9b\94\9c\f4\0cDGm\eb\f1\04\a1\b1\dar\adq\92\0b\03\db!\8d\d7>-\d7\b8\c4a\a2\fa\dan\01\be\08C\f1^R\c4@Uv\8b\f0GC1\f11\81\f7,\d3.\e3s\8c{\c0?R\09\9bS\a7\faF=B\ba\d9.\9b\80\ff\e88\e0 \fe\0c\cc\02U\ad\14K\d6I\e5\12\f7\91S\f1\14\f5\9b\0f\5co\b4e\b3\f6\05\f3p\c4,\92\10\80\9bPj\93nW`\11\f3\f7\15W\95N\f8\14\99\f9\c4\0b\b1`\e3\b9\88\07\f46\b1[\c0\c1o\15\9fi\8f\ec\a7\d7\f4y\cf\f5\ca\a1\d7-\e9 {\dc9\22\abs%\a3K\fd\8c\e83\8f\cc\fc\92\a8U\94\c9\a1\b5\e7},\acO\d2\0c\93R&\fe\9d\e1\a7\e6\b6{?\8d\92\98\88\beP\9c\a3\e7!\b8:\c8\86\1cF\caX\c3'\e0\9f\9a\ce\b7\0b`f\88\1a\ee\b3\bd\e2\12\1e\bc\94\19\03\fc\9a\8e\93\91~\0b7\01\03l\907\fb\a76\7f\b4\d8MF\8a_\a6Z0\02\d3\ec\eb\83k\fb[\ee\ff\00q)\f3\0e\f1\fc\a3cJ\19\acW}$\cb`\bd}\de\a5\8a\19L\88C\89\a1\16\e8\1f\05`\92\d6\92\15\b5\c6\c7\22\be?\bf\c9ht{\c9@\80T\8bVf\f4\f1\a2~\04\09\84\025q\15\01_\07\d4{\fcdWNG\1c\83\87\b7H\c4!B\ed\0c\87:fE\ea\d6\f49,\b5x\9c\dac\92a\0fMq\b3\8eq\e2&H\80\d3\a0_4\b5\1e\c8@\ea\08\e5\96\db\e1\1e\a2\df4\f2\1d\1f\e2[f\eb\7f\d5i{\0b\ac\be\98;E\01\fd~\13\91c!\1a\c6PJ/;M\9e<\e73A\91\d2\e8GdIG\b0\ef*|\b0\1f\fe@\df3\c3l\a5N\ca\ae\d4 \9d:\91\85T\e6\11\cekHY\81\f0\b38\e7\da7\ec\e7z\892\f5\abk\dfV\11\9bD\f1\dcx&_Jn\d6\ca\df<#x!O :M\1cy\b4c@\c9Q\9c%\1c\fe\db\99J\c8\b2F\fc\8c\89\7f\c3\eeg\e4,`\d8\0c\c6\f6\ce\82CG\81r\91\a8@\91\80\a9\a9\0b\1c\91@\90\5c\ce\ab\87\80yT\8eK%\c7\d0a\f3r:\98\f4\c9wL\b2\03\80\b9\fc\92&\a55\ba\affQ\e9s\be\e3\13\1f\86\84r\18\02\15\f9\e4\80Jw\90J+\a8\c9\83\af\fe*g\17^\8a=(\81\fc3P\96\87\8576z\bb]*\09\9a2]\8f\f1\1aPl\073\90\da\810\a8B\96lV\7f\9c\e8\056\07\b6I\d2.sT\91q\fe\c3\a6jwt\e9\9a\aa\b9\ffc\df\85sz\0a\d2L{\5c\1c\9f\8a\85F~\f0\d7$w\b4\dd\9c.YG\01\af\f7fkC\88>\8e\c5\d42\9fk\fe,\1e;\ea37#g\aa\e7)o\b2\0e\1bM(+X\c7\94\d3\8c\11;T\b6\c3\5c\e6m\da\a5u'\ea\c3^F\97\ca\a7\11\b3\cd\d5Df\0bx\d2\96/\96s\baQ\895\84$\e0ksd\8fv\d4\ef\b0\8b\f3$\eb\bd0+\19\82\8f\02\a5u\ad?\bdV\b4S\16\cc\e2\8dN\c7\e2\c3^\b7Xg\b4\cd`\fe\ebA\90\e7\0b\c1o4\81n}D*\ea\8avpE\b2\bf\d5s\e6\dd\dea<\bb\9a\a1\18\19\93\cdE/-\f1T\ee\f9\81\06k~\f5\bb>\f7\9f\b2\06dP\f4\e55S\ba\d0t\a4S\d9L\15\bf\cf,\13\15\fd\99T\5c`)\09\0a\bbR\9b\de\92G\82\d9,K38w\04M\8d.\00a\9d\b0*\1ef)'0\bf\c9\e2\9cP\18\1cm\96\d7\fe\d3\11Wro\fa\07<\e97y\8by\a7\d5\00jU\b7z\feA4_\81\c5\9c}\eb/.\bf,\8b\f4\d9\ef\d8\e4\0e\ea\d8\13\0d|\dd\a6<|\bbS\f2\9a9\b6}\ac{d\a5\9c\c4\fe\13I\eaS\d1\f2\116\0cs\a3\94 \92)V\ab\0bMG\a2\cb*\99G\d9\fe\1f\d6\b8:)\f5\84\f96\ac\a3\e1\cb\cd4@in\80\a2\b0v\f3\ad\adE\0bb\13\b7S\f7\05\89[\c0z\0f\97}\c0\dc\cf\06vT\08V\c4X;\f6\08\fa\0a\1b\07\e9\e1\dc\d5\de\ef\8a\b1\ad?:\10Dq\da\d8\18\19\93\b0\e8\f9\87\c2\05\1a%n\fb\0d\b27\1ctT\a2\91\99u\c2)\10\b3@y4\7f\e8\e85\87\d4Hz p\98\0a\f1\d9k\03c[sXk\92x\16\9c\99Dh\d4'L\906:=[\d4`\8b#\b8%\117\df\0fK\127|\e8\15\0a\93\18\dd\17W\ba\1b\983\f7p?8Y\b4\c3CYi\ecf\eb9\11-\97[\ba\e0\ab\0b\95of\952\90\fa\f3\b3\14\fb\cb\e5\e4\be!\d1\fe\edp<\de\b3\13\e0\04N\f6\ef\f8P\a9\b4G\be\1d\b2\fd\82\cfM\ca\10l\8e\c9\ee\87\f7\9b\ed\bb\f3\8b\f7\15\8d}\d5\22j\b7\04}(\08h\80Iy\a3z\bey\98-\ae4\b5\8b\fe\f2\92$\a3\b7\93\1b\ea\a0\de]\e8\fb\99\b9\9e\d7\09V1HW\9aX\a9R\ba\c6\f0h\5c\81\d9\0c|q\ceut\95\9f\95|\db\8a`2\b1\91\f4\08\e8\da\9e\16F\1f4\e2Z\07\bb\87B#\c1>zH\c9dB\89\ec\9e\bb\c3k\ea\1b\9b\bb\dd\83\02\a7\a5\12\e1CH\be?\88E \b9\b5\ea\9f9\04e\7fy\03\02\eb\dc,\f5\a0G@\af7\87S\fa\d9\efyQ\b5\a0\97F8eJ\a9\8e\a7\0a\b3\e9\8c\9c\cbn\0f_\0f\08\a9\a4(+2\94\d8\a7\a1$\8e\91~\ec\a7\9axn\ef\8a5\98\e9s!\cb\fd\f9\ae\b0+\00\b2x\85\d3\fc_\dd\dd\b9$\915\0f}\1a\e8*\f9V\08\cd\b7rQ>\bb\a2\04\fb\1aO\9f\9c*\07Sa\0e|&\fc\d7\22\8d\fc\e2=\ed\fcru\bb\155\ec\97\09\93(D?\0a\a6T\ec\00\a9\c4\efk\d6 5\8e\ac\16\f5\16\9a\96i\df\05\b20\97\bf\fb?2\ff6\ce\dd1\f9#\85\c5\f8/\9b\b9l\ac\b3hyH\19SN\cd\88\88\fa/D\b3\a6\e5\ed\d4\d6h\bfX\9f+\1e\a8Y\19\89O\8e\07\ed\13\e6W\ff\14\b6\1b\d9\c5P-ws\f1\b5`\9b\a0>9\a2g\ab\c4\d6\f3\c2)\df\bb\16\04\9d\8b\04b\c1\ab\1b\d9\08\1bd\de\1e\eb\04\7fa\f3\e7f%/\ed:O\bd\8f\c1\90\00\96\b7\00d\1d\82\a6\e9\96\f1=\af\178\ef\18;\8fO\1b\17|\04\09\cfI\15\b5\e3P\95O\e2Un\ff~\0bB\a7\cb[2\ff\bd[2Os\a0\c9p\0d\19dD\08\da\fd\b9ZUOJ\1b{\17\e59a[\7fj\bd\ba\d5J\e9\0b\89\b53Ol\10\91CR]\f5\c7\b6pr\d0d\97u\de\22\bb\e8\89r\fbu\d9\99%\d7\16q\f9\c6\15\b8\f5kk\1b\e0\02\9e\a5\9b\9bhl\d7i\9aL\ab\af\f5\f5\ce\e3U\e7\d0\7f\c4\bf0\96,&\c2\bf;\0a\0a\af\94\a2\a3z\a7\cf\91i\ea9\c7(p\cdb\f2\ee&D\c0\9e[\8dP6\0c\c1\d7\08\c9\88\b9\e5m\af\19\f5\d1\93\c5\e9\11P\bd\961\da\f6N\1ep@\d4mK\e8\e4\abf\ef\db\98\9e\d9y+\aecR\07q\dek\a4\1e\cd\ec\98\13\9d\041\a9\ea{\1a\a4bw!\aa+'\06\80\0f\d9\d1\e5m\f0\b4\96\a9\fcv\f2\f0l\cc\18k\c7l\b8n\d04\af\f5\f1{Z{\96\d38K\f7\8c\bb5\ac\aeZ\dfu\80\fea\eb\aa\c1\be\22\d7m\12m\0dv\86-\16dI\8d\c7\cb|\a9\bffl\fa\c9\bc'\ecJ\9a\9f\aa\89E?R,\b1\f0\b2\9d5Y\06c\05\0d\86\a9\c3y\e5\b3\d4{\c6\83`\fa\bb^j3\db\10\93\e3l|\f0\ed\ac+S\9d|\f6v\f9\af+\eb\dd\12\18\a6\7f\ff\d2\c79\86I\8d\fe\db\d1\13\d9$\19h\e1\85\18\03\82>g\94\d4\f3z4\d5f\1a\90\e3\bd\8f\97\e6bW\d6\93n\1f+\f8\8e~\c7_\aa\baC\e1\d012\9fl\ae\98v+\c1\bb\0d?\8d^vq\c8K\a5u\f75\d1\97\a3\f1\18\17\fc\95\12\10ME\d0\db\fe\9f\dc>c\1a\1f\e7X\96\db\a8\97\b2\b5\ea\8d|\82%\01\15\c3`\8b\b3\88\91\1d\9f\d5\f8\0a\ae\d5\16\b4\fa\fb\1e*\e4\8b\b2Z\13\e4dx\cd6\06\bd\d5\cb\c1+\da\d3\1b]L\b5\7f\9f+`\e9\f9v\fc\7f;CRA0d\aa\e3\c5\8d1\99\1f\bd\b0f\0ee\98\f2\19\fb/\f2Cr=\b8\1d<\a3\ba\13\11$*L\1f\f6\c3\e0\ce\ddYE\dap\94b<\9a\1c\c7\ce;\9d\c7\12\d65\d9\d3\fe\80\dc\bd`\869I\98)4\00]\17\d7|\d1?\fc\86@\e0\b7\c5^.\d6\d6\e9\ca\d3\9b\ec\1f\ee\dc\846Xz\8c\92\0bX\a4\ee\9cH\ef\e1R\9d\90\1b\f0\05\e7Y\19?2\e3\db\03\05\da}\0d\97;(\a2\d3O!\9dL\f57\e5\8cX2\dd*4\a2j\d4}\bb\fe\00~\9cb\95#^\f7\d7\83Vt\b0\038\1e\1a\8aqG\ffM\8f4o\14q/Xhn\e1\a4\e2\08J\b4\b6\b7\ce\d7T\0c.=\b1\a8f\f4]\c7\f3\f7\d6\e3\83\b9g\831\031\12Jo\f9\96\02q\a5\dd\07]n;\f2\f6\f3\a8-\b6-\8c\13)H\0a\a4\be\11\ae\d8$\d8\03\01\c6\e6\96\13\00r\0aK\a6\8a\a1\00q\84\80t\c9\93*?\d38\c3-}E7\b1\95\e4\07N\d9\85#l\b6\d2\b9|\bb\a7_\f6\cay\a7==\ef%\99\8fm~*E\ae\fd\84\a1v\0e\0a\07\8d\5c\bc\130\e7-\92\15\a4\01*+\bbKX\14'\e9\a5\14L\1a\91\e2\9bj\bb\1a\c3\17\d41<\91\95%\a7Ij\cb\e4\b9\dfl\0c\bb\efX~\1b\9a\eb\cb\cf\bb\01r\0cp\ee\11\b9x\e3\b1\f2\bf\0a\12\f1\8f\15\ef\1f\96f<\0f\a7\d1@u\ed--\d9\93 \1cb\dd\0c\14\02\b0\d5\93_\1f\b0@\ed75,i\f9+oI\a2\b4\04>Bv$\d7\fe\b7\f9\aa'\15E\93Ai\88\e8\a0\ae\8dT\de\bd!\fa\c5\e2\aa\f6\7fW\19\0a\b5.\97\d8\fa\e3\83s@\d9\0b\be\c7z\94\f2\dd.\a9-6\09Z\fb^=\d3\1eC\c7s\cc\04\c7\cbm\89<\df\ce\03\90\aa\d7\e0H\f7\80@\93\8c\df}\14C\f8\fd\ce\05,H\a0!\14\a6P{\c2\dc\10\86\ce\18B\d9\b1\e7\dfB\fb\fd\eb\b4$\cdk\ad\c6lSxR\80x\f5C\17\f8\cb\1c\0eK\ebuo\22\7f'4\a9e\1c\90{\14\c5t`\8d\c9\f6=e\84\7fb\b2\ba\8b\e2\847\e5tK+\f1w\8bh\a9\d7\c7\e2q\b2\d6\99\9f\8b\d0j\88M\95H\f81\b3bn\c0i\80\1b\f5$\d7\d2\bbb-\5c3\ee9\99q\15V\93z\8a\03FBT\87`\c7\17{i\e2Q\ab\17\e4I\ea\f02\87l\8f\8c\f7\1a\f5+^\b7\b4\f0\eb\9f\7f9w\06\22:p\aa>%9\ab8\df\93b\cc\b7\92\9aU\ac1LT\e7\8au.Q9\f0+f\82\ea\d0\edX\a4|\80h\a7&XI\07\83\eaC\04\d5\08\d3TQ\c5\85{\f7\fee\e6D\f5\dc\c1\98\d0[?m\e4\b8u\1cr\92b\8e\c3\04\8b0\ba\f2\d3|\af\e0E&#\0e\fd\f5\f2\b8\8a\04\ce\dd\0f}\bda\7f.\d4\0a7\01E8\1f\b4\f5]\af:\dc\03\a4X\16J\9dq\f6\bdAa\eb\bd~j2x\b4Gx\0b\c80\139\ec@\ea\b4\f3 \e4\7f\e4\fd*\14\eem\a1CI4#~\c5\05u\0cV\d7\a8<\9f\04J\c1\5ch\be\1e\b9\bb\99\d0W\f5>\c8\10\cc\bd\8d\bc\e2\bb\90e3V\cc\1a\16\f6\e6\b0Q\c3\13~:[\1e\cc\b2\f8\d9Q\9bD\91*\09\16D\16k\19V\99\e1\e0\8f\80^\a4A\a8\ad\b2\b5ad\9f\d4\a4\d5K\19#\e1\85\05\f3A'\9e\9b\99\03Q5\a5\994\ed\e2z\f5\f8\ff<\0d\02)\ca\e8\b89\98\85i\9f!\dc1\87L\c6\d4F\a8+\e9\a8\b4X\8b\f6\dbx\0c\a1\eeX\e4\09M\ec\81\e3I[h\deh\cd\1c\8c\cd\a7\b2\de\96\c5\8b\cdB\f50\f1P\e1\da\1b\9f\cd@\94k6.\be=\00\a1\e4|{\12\aa#.5=\ab\9ay\fd\bb\9ef\c2\84^1\efV9\cd\81\b9\ea28\db$8M\f7\a0K\ef\9az\22\22\8fB5\14\d4\f6\03O\e5w2\84\dd\bb\d0R\95\b7\97\c8\b5a\0c\04\88\e9\ab\f7\80\d3\eaz\98\8c\ddRSb\b9_z\17x|p\f0'\101\8c\e1\87XE`}\f6c\e0\a5\94\b2#?\c0\d9'\99? m\8e\e0\0c\84\0a71\8c\d9\8dq\0aH\5c%y`H#\b8F\9c\e1\8cn\96\18_\d1\ac\8c\bb\0a\9a:q\d7\fe$e\9b\05.\f9;\ee\a4\19\d4#\05W-\b7|\ae\06\b6\f1\ce\80v\be\ef\a0\8c\02\95Z\b9}\c0\08Ki\b83\02\0b\c6U\f9dXI\e5\bdPQ\f4\a7>n4\0d\fez\90\aa\ce@\ef\bf\00I\eb\8fxQ!WS\9a\9c\a3\1f\ach\c4N\90d\036\caC\b1\d9P\cf\eb0\0c\7fNt`\ee\e2a\9aax\13!Y\0e\a0\95\f3\f6\c4\dbJq\e1\5c \d8\0a2\b0\7fq?\9d\8f\be\f5^\f4gU\8f\a2=\b1\cb\f0\cc7\b7\e2\fb\cd5\19\13\c5\a0\22*\80\a9P\0b\d2\85i\80\afkH\de\82_\d1]\a1\10#\f4\b2\ecd\14\81\bev\f6lD\cei:[Z\95\00\a8_s?6\f0\07\a4\badLQ\e1:\b2\0e.O\1f\e2\b4\22\a4\bfT\16\f4Zi\0dS\85\e6Q-1\9dT\16\a8\a7\cd\db{\d1PW\cd\b4\98\a2\e1\e5\8eH\fa\f0\86\b9\91p\95\19\b9\c6\ae\d5S\91\97\e4\8a`\98\f2\fb\e35\e5\88%\93\b8\8dh\dd3\db\15]*\fd\b79\cb\5c\07\f0R\abg\a7s\e9\af\8e\08p\0a8,\c0\e7O\12\08D\80jy\e1\95\1e\d2\adV\f0\1e\8a\c5Y\d5?\a1jA\8d9`f\bf\1c8\09\c9\03\f8qv3y\f7S\8736\0e\131\af;\cep\ac\9b\f3K\13\9af\bc\0bL\c6\88\0b,\9a\8b0\22\c2t\aa\c6\7f\84\e7\c8,=\d2]\14\9f\c9\b7'N\b2\e1p2\fe\c6\c8\cf\12\c4\d1\de\fcC8\baG\18\d2\1ei fc\ef\c3\bf\83\f6Ay[Bp\1c\aaC\1c\90\bb.ua\bb\f0\fav\f9D\97\f8\db\d0g\f2\a6z\dc;2\d7Z\a0\0f\0f`Y\a7W\16\fd\89\ca~\91\a2\aba\b5f2k\e6\1f\b7\85i\17\e9\e4\0d\f7\a9O5L\8a\1d35\dd~\c7/\99\b8\b7\c6m\c0\cb\b2\1as\b1v\9e\b5+0\ae\c3\fd+\12\ac\abe\81\ff?)1\a0\0fVl\ebWs$].\a4\981\1f\89}\aes\c4\f0u\e2\b7\97I\1eK;=\a0`\9d\d7\f6\a0\88R_\b5\0d\cf\9ejQ\12\1b\b6#\f9H\94\80\0fRD\c5\00\9f\95\ef\22\fa\abF\c8\db\d6\12\86\0eGE\db\91\d0}A\e8\c9\d4\94'\d0\8e6& \9a|#L\ad\f0\e8\17J\b7v\89\f4\b4\95\c3\c6i\19\f6\ec\9bX\e6\86 ~\b7H\7f\81\8b\a1\e0\de\7fk\c9N\e3\cf\0a0\09\c7\f0\b01\a5_\c8eY(\e5\1c\08)\c1\ad\da?\e5\d8\aaRZ\a2\f3\00}\f8O\ba\e4,\c5\b2:\c4\fbU\13\fe\82nN[\d9\92\10Z\dd\06\81\adI8MH\13\08\0e\81T\13X\92\fc\89\a5\de\07\c7k\87\0d\fd\89\b4\b8\f0%\ee\85\87P\aa\acDC(\c4\caT\d5\a0\edU\f9})\bb~0\98|h\d3\7f`\a7\b8\17\a1Djw\e0\e2\94\ea6\9b\a8\ba\c1\a7\0f\f2dR\0f\cd\f7\22\18\86\98s\84r\c4\00\88\f2I[#Z\04\a1\8a\a3\15\10\f4<\9e\c7\f6\e9\96\0a\8e\f8\c4\e0\81\08\9eQ\0b\5c`\c5\17-h\eb\fa\09\1f/\99t\16\aa\ba\96.\d6\f6Kt\04\f2\93\a8\b1\86\8f\95$\8b\e0\7f\8f\a7\d0s\9e\fa\84\04|\ccc\d9\efa\05&2\11\b0\ab`\5cX\db\c3\b8\a0\9e\af\0a\af!\f5\1c78\cf/.rl\c4e]'\e3\b7((my{ZU\a2\a5\e3\c8\ee\88\df$M\b3-\9c3_!\0f\dbG%b\8d\96\b3N\d9\dd\82\ba\9bT\92\d9\d2\ca[\d42\81\bc\cb\1c\d5\0a\e6(/\d7M\a1XG8R|\82\f9F\8b\8e\17N\8b\fc \dfZ\d6\1b^\17\0c\f0M\91G\acK\eb\8dS\912e\a6W\9a\b3\cb\1b\e9\a9-\1c)\d3.\90{>>\cd\b2\b4Y \c2\ee\97\d9\a4\d6\f1\a4`\d7.\8d\bdVa\8f\04\e3I\14\dd\eeB\03\84\87\e5\16<\98f\d3\14\fa\e1$\d4\83\b6\d4\d8T\8d\85V\a3\88k\db\08d\bd\8a\d9<\83\ed@%\f1U\8c/6K:LBh\f5\c9\c7\ec\bcG\1e\ab\e9\beQx\a6?\ed\f9\e9\c0\05\18\e7\c1'cel\5cm\9c\d3oW\9d\82\10:q/e\98<\b7%\e34\ff\d5\10p\ea\df\c5eIx^<\9eR\e3\83\0d\04\a7N~x\9a\1a\f6#\91(\96\07\d0\f3dDY\c8\8b\8ay%\1c#\c5\e3O\13\82\ab[t9\99\8c\d9\ec\07\b4\dd\e2\a3\c7\9e\83\c8%0)\9d\af\8bG5\acq\9f\85/\8bq\9d(X,sih\db\d3\12\a4\aa\7f\05\b2s\b5\8f\1e\ad\06\ba\b7-8^\fc\d2\ab\9a\0a\11\22\99\04\0b\b0U\90r$\f7\22C\bbE\a4\a8xR\ba.\0f\93i0L\eb\0f\daV\a0\13\dcw\f1g\fc\c4:J\83\d6m\11\afK\cb\a7\11<4\fb\827\b8\a5S\e1\e7\b8\d0\c4XF\08\03+Nk\9e\b4\82\f8\c2\10.6dbyC\b9\11\b5\d2\05\0f\b2\c4P\dc\1cg\dc\e7\a7\0az\e1\c2v\9d\c0\c3\cd\82\fd^\f6\b1J\95Zx\bc\e60M\a82L\82\88\c8\db\d1\c0\14\0a\c1a\cd\88bu\80\aa\c6\dc\da\b4\b2\ba\96\e3\c4\a1\04\f4|\1fU\f3\22N\bb\e2\a4\a7z8r\e8\8c\bd\a0\13\b8\df\a5\caV\d2f\b72\1em\86\17f\ab\82]j\02uPR\c5\c1\f7\89\ff\ff\7f&\0dRg3\b3\dc\85\f7h\98\a0\e5\a0\d6\98\9dW\b7R+$\13P\c0z\ba\c9t\be\dc\83\e4\99\c5\d4p\e9|r\d4j\c3\81\8d\cc\eeb\f7Z\f4\17v\02\a8G0\df\fd\bb\10\cc\e6.\dd\1e\f3\1b\81\9b\d2\9fT8\d4\c5\83\ae;UlP$\1f\d2G\e4\fe\abC\81\9a\af\f5\8c\0b\a7+E\e7\e3[\b7\85l\04\97\80@\f3\d7J\a0\ba\d9&\1c\baK\b2\97\d6\051\9e\f2~[\f9X\9cn|\cd}\e3\13\eb\acg\c8\bey\a9\8cv\9c\15\98\22\1f\eb.\bfk%m\87p\c3\09\f5+`\e8J\08\c1\83F\8c\b4\cc\db\f3HF\10\0b\e3\00\1b\fc\8e\b7\c7gr\95\dd\ebE\5c\f5\09\e3+\ad\8bwUh\d6T~\f4\f3z\0e\a4\b9h\b07\85,\1c\d0\e82G N\c8_\99FR\f3[\a4@\9f\ad\f4gN\1d\da\d1|v\99*E\f0\ed\e4!\9b\11=\1b\e9\ab\06\f00q\f3\86\cfx\d8=\bc\f7\e7\b9\a3+\8c\8a\eb\84\db/&]\cd\06\f7\c3\c8OWo\d26\de\b3l\a3\fd\16\16e\b4\06=)[_\ed\ba\a6n\e1\8b\cd\92)\85\99r?0n\d0\a8&\e9\8d\17\88\ec\16\dc\0e>\e0.\14\c1\b5k\0e\ea\9c\eal\1ep\eb~\ed\bd\fc\f0\f0\03\af\d2U#\e6s\db\b8\ad0T\fa4q,\bb\ad\fd\99\b1 \7fbd\b4\d3G\92R\01E\c8\a5\c6y\85\e8\00\ed\9d\a9\1f\86j\f3\f5\10\e45\85\8f\ff{\af\13\0abu\b4&2\be?Fj\08\ddNB\81\be\b5\a5w\f2e\13\12\b5[\df\1e]\fdJ\f2p\8b\1ey\19d\90 \d4\8f\03`\86q\c1\be3\08\fc\dc/\b4|g\f2h\0d\f4\88!\92!\b0\1f\9f\eb\1d\dd\ff\b6Z\b7\9e\ba\9bU\89\ad\81G[\93\11\1e\f0\d6nO@\15\81am\fd\c6\cbt\ebY\a6\97tj\c2\1b3\b1\17w\c7\e32\8f\81\ea\bc\d9\09\880s\05\fc\f1\c3t\efD\b07y\02&\e5\e0^\cc\c8sT\eb\83\ac\f28\d0)\15$q\9c\89\06\e1\84\04\b5\c1T\0a\d5\9b\96H\7f\17k\ffi\fa=\ea\d3\e1\a9]?\8a_\c9J\d0cw\b8\db>V\a3\8e#\18V\5c\e05T9eqL\1aN\ae1\1c\ea\99\f0\1brW\85\82NB\90\cd\98\ab\a9\88\db\8e\df\91\95\c4\06\a7m4\bc\00b\f2\fe\b8\81\fa?\f4\0aa\bc\07\89\b7\a5D[\1a\bc\e6\f6\e3\0c\d9\aa\e0w\87\f3\95XC\17u\ad\82\a4\e9\f4\fb\0b{9Po\f9\92\e7\d5\9e\1a\ec\fa\d5\e4u\fbe\80\08\f1\fb$(\95\94<\920hy\a3\e9\02\18\0a\15]\89|\08s\dc\ffk\99i\06\ff \a0`JT\b8\1f\9bv\ce:\83o\96\89\91\16-\8a\d3v\97\f8\bd@R\de\09\89r;YM\f9\f5\c3\92\c6+\d1\ba\97y\88\aaQ5+~\0f>X\ab\ce\e8\22c4\06\16~\8c \b5z\fd\e6\7f\d3\fe=\felr&\d6\a4\f4W\f3\bb\b99i\18\f4;\fe\5c\8f\eb&F\b1~{=\f3-\7fL\7f'-\fe\efC\dd\18Q\18\82\f7j\ef]\129\f2\04\df\83V\f9\f1Q\95\e6\9a\11\0e\b3\c2\ea\11U\bc!\a2>I\9d\fd\f8oa\cd/J\df\c0\b9\d4\99\f0\9ch@.\d1\928\1b\15\b8_k_e\f3\85\92\c2\f03m\9e\e1\12PB\04O\fc\ae\bb7\e663*W\22\9f\9b\b8v\a7\96. \9c\f4|\deT\f7\0c\e7w\ed\87\e1\e3a\b2%\d0p~ \e3<\ef\c2\b7\a9\d0\dd\fa\b48\89C\99\aa\f2670\dbOj\f9\fa8\82\b8+8r\afz\f9k\bc?\a9\19+D=\f6/\bfu\96\07\a3\90*\ba\05\c3\0bD\d7\dbW\d5*Tc%\1dN\22\b4\83\0f\ab\ba\e1\a3\cc\e1H\c6\e3z\f5\04\85(\86\11=p7\9f%vp\ad\d2~\09\17\d1A\0em\10\f7\fe-\aa!\8f#k\863\84\87\e2(p\9cz\05\1f%q\18\01\99\03\b4\e3\f9\ac]\14O~*\fedPV\b4{G\d5 \b2\1c?K\b1\f6\19w!\ec\c2\1f^\a9a`*\1d\a5\ea\c7\0cL\08\f2\e5\a0\82\a9Lx\9f\19\12$\b6\de\d2i\fb\02(o\d4\f9w0\892G\92\d8/\12<\c2\12w\c5\d8T\aa\8f\f1=\cf\ce\ee3'\91\abQl@\00\e5S\beQ\95\1bM,\22\86\b2\fa\09\f4\80\af|\1c)t\fe\1e\a2X\cf\e7\de\9b\e0\ea\c98w\bf\be\9e\c3\10\99\98c\f4<\cf\cd\85\22e\00h\90\8dy\a8,(\ea1#\88'\f2\0e\c6\bc|\a1\87q\b4D\da\0a/\df\be\00\eem\95\95\19\0e\damUj}-\1d?zJ\b8'\99HQE\d4>P\a1ng8\fe\07\c6\c9/\ca\91\93s\07\fc\15\9d\d3f(ut)n\bd-)\80.\12(\e4+\9f\caZrN\c1\09\ed\ac;Y2\da/\8e\8bv\92\c9\08\9etG\85i\b1\c7\18\ca\db@\88e\a2\0b\e1\0d<\d9\0d}\09&\e0ZN\a6\91e\a7\84\18:I\13\02\b9S\94n\85\bfLG\12\a8g\00{\c3')\f3\d7>&\9ce*\90+}\9a.\98J\f2\fb\9e\b4\bd\e4\a5@K\dc\b8\a0\09\179\8a\10X\f0\05\eaj\bc\abx7\cb+H!C\81\1a\f2\80Y\90\e2\81:\8fn\b9\d8\9e\ee\af\22y;1L\b2QX\b5\17\dbB\01\e4\22\8f\fa)M\07\f5A\03\cb5\90\8c\c2G\1b\0a\af\da\95\f2\d5\96\09\c7\16\ca\9b\05,\17of\05\96 >\1f\dc\01\81\97m\1b\d76\ebh\9d{\08Y^\a1\c5\00\a3K|)\f0\c0m\09\ca|\19R_\f3\aa?[\f8\04?/\d0\f3=U>k W\13\d0Wx\eal\f4,\9e\ee[\b9\dbi\0d\feU\d0]\94\90\a0b\edH\1b;w\16c4\c1\be9\ab.\f7\b4~\1e\10\c8X#\d4\d7\fd\da\19`(,5\1d\81\99\9a\c5\eeT\c9\f4j\b8\b2\7f6\c6<\a0b\04\e5n\dc\e1\1a\fe\ee{E\f8\de+z\cf?\a6\f6\ab\81\e7\07Y\84\f5L7\ae\b8]\8b\dd\fa\0bV\ef\f8\0eb\e2B\92-;jN\06\fd\06\805\ae\07$d\82\16/\9d\93\1b\1f\0faz.\89T~h0\d9\ec\833\fd\93\17#\85+\b7|\c5\96U\aa'`\e3,\823S\e0\16\b1'A}b\1c\a28\19pQ2\1cv\b8-\ec\e2Wuo\db\9d\22\e0MD;[P\b1\b2\bc\cb\f7\85\82\0f=}\fc\12\c9W\9d\9e/\05\97h\e7\7f\a1\9a\ac\e0J_\c3y\af\c8\12\1a\f0\c2\deU\bd\eej\88\c3\1c\aa\0as\19\ec\cb\7f\fegO\af9\9ff\c1j\88\82\c3\10\13\0e\f0\82J\d9\9a\05\d9X\15q\cd\8a\f1\d1'\ff\b6d)\f3\c7\bf\07{\b9\07\ba\1c G\ec\10\dc\de\05zJ7_\13\e6\7f\c9\82\b4\8f\8e\95\e5+Q_ \8a\a5*\88\e7j\22Z\87<\e6\bdd)n=\cc\8b\ed\b9\d0\88=\f9\0c\14\e60\8dA\11\cc~\d7IM\811\e6'\f7\dem2\97\ff\f6\8d\fe\e9u\9c\acqJH\85\da\e3\04\c0\1b\b9\15c=\224pJ\12\95&\c3+\9a\08\10\bd\8e\8b\a7\89\02\9b\a5\01\ff\9ek\83\8dpWfa\0c\e4\1e\8f<\0e\ee\b7\91Xt\bb@\8a\88\8a\18\10\f1~%gc\cb\a4\c6\81\8c\bd\12\b2\f1\9a\07Q\08K\c4\83y\134Z}G\b3\08f\95uX\02:s)\fev\cd\1c\f4\99O\b3\88\c2;7\e90W\da\97\da\acmH\9cp\af\81o|\97pE\af\ed\af\d0#\0fF\bd\f5v\e53y\edj9\be\9d*%kl\f0\8e\b4{:\f3cL\99^\eb\94\03\92\c6\fa\03\b0Ii@\03\81\9bEBr75\1f\c8\ab\09\7f\e3Q\ee\00\1d6O\b8\d5,\15\15jv\c1\c1\84\d8Y'k(\1d\c6\e5\b8{ \e1\94N(\ecldp\8b!\b0\c9)8\b4Wd\a1\f7\b50\d7 X\03\02E\bd\a2\b9\9b\81\83\97\aa\c9\cb\c0\8d\1b&\15\aed0\8a\d8q{\89\a1\5c\99\81\b8\15\cd\12\be\b8\bd9\82\a8C\a1\10\cf\df#\fe(\a9Ah\b2\a4X\c6(:\dd\d3`[b\93\9d\c1y\d3\1c\b9\d9T:\ecF\b5#:\1bo4\d5g]\9a\12<\c9\b4\1d\1cU~\aa\be\e7@\1b\bfS\9e}|+\ac\c6\19\97lt\07\a4r\5c\d7\c5\de\1f\e7)p*\ac\cf\a4W{\8a\9cN,\83\7f\9br\8a\db4\df\96\e6^\a5g-\8b\ee\a1\d0u\b2\e1CZZn\b0\14n\04\bd\c2\8a\0c\a8\96\b5\8b6\f1\f3W\13\88\fbD\01\efU\a1\8bCu\ef\a2\d6`\cdBO\0d/\10H\ab!\f6]\c5AslWSt1B\22\12eA\18\b2\93\22=\f23\f6\bf\f9\a4\c8\d2\96\92.\9d\89\93\a1\19e\d9\8e}\f1IsSV\d0\a7\e9MmY\c5\dbl\ce6cqeM)\fb\18\cb\b3\1cm>\f8q\c5R#Y\84\0b\b8\c2\ed\8eGQ\ad$\dcgB\feN\fci\d3Y\95\84\da+-M@\89\f8\ee\91\ac@N{\e1\a1\a6\ca^\d2\e3$\fe\99\e6\17\15R}\a7s\0a\19\8d\90\e2\19\97\16\9d\a2\02\fa\10\a10oy\09\bf\e5)\88S\a3\a5\0a\c3\228\91\a6c\b8\b4\b4\9f_n\11.\e3\f5a\cf\1bqy7\c4\1d\f8\abl\fa\ec\01\1fl\0f\22\e9 \fa\7fC\9f\97\91\05\ab\dbf\9f\89\e7\82\e5\b1\d1\fd\96\d9L>o*\19\98\a9S\f5\a4\7f=\80#\ea\08E\98gk\12be\d6\cd\88D\a560\bd;\1d\fe\80\ff\f9.\17\f6\1d\83\b9\1b\a0\eb\104\e8\f7d\e6\89[o0\ca\1f~\a7\a2-\9fB\d7\b0 \05\ffRl\1f\b8Y\06I\08\d1V\cazo\84'\8c\a0J\94\fe\15!P\b4\a5\f1\b6J\cd\f3\c2\11\d8q\08\ef\be\22\9e\1f:\df\f93J\ae\bf\9d\b9\0cb\be\87[\c6\19\ddLvX\f0\b8\bcF\5c$\d0|+\e4\c8V\c1\b2\fbs\e9\f0\0b\86[\e6\8d\c3\a1\ff\0cgU\bbT\81\ca0U\9b\f2\e2\b9m~\02\08\ae\dd\cbC\b64r\f3\db Y\b7}\12\d1\c8ct{\b9\11\fa\fa\df\81\dd\93\f9\8e\ee\19\e6UU\8d\f8\90\0d\f1\03\0a\fdJ`Rs\d2\dd\11O\d5w\1b\c07)\a1}\a7W-\0a\f6\16L\f5S\04\a0\f2>\ddY\ceP\eb!\22Q}\1cu\e9\a7Y\06\84\8a\82X\e3\f5,\8a\b4*\d7\04\b1\09\a7\87\ad\ea\b9wdl\04\ed\914\e3=\e7\82Ma\cc\af\88\e1\1b\1d$\8e\97\81\aai\e9X9z\db<\10F\fd\da{\bc1\d2ys\96\f9\d5\f6L\02\c5\c4\18\a9\8f\af\e6\8a Q\bf\0d\a6\d3\fcnT\dd\f4\0d-t\f2{\12\99\a3\bb.!\1c\a0\db\b3U\a6\02}\5cc\93=\04\c8\f5\87\ac\bb\04efUO\a85\de\81\96\fc\fd\fc-'@!hE\ef\b4G\ea\b1\f5\b9;\eeXA:\9cT\ee\96.\ecA\e5!\dd\a8f\f9\a3\9b$\bd6\d3\9a\f7E-/\8cw?\8f\81\a3&xX\d8Buv\b0]\99*\81\c6-\cb\1a\96+\115h\c4R\ea;\81Q\0eh\e5\08\cc\bb\08\a8p\12\d3\9a\c3\b5W\f1\ea\94D\e5\e7\17\86\0eaw\160{\11si\b4|\873\b1h\bb\17\d2L\a1\08$9\da\fc\8e\ec\9a\b2w\81\bd\ff\d08\19FD29\acM\9a\a3P!\b4v9ia\052\9e\b9\e2w\ed\a3/O\e9r\a0\f6]\ee\c5\d9\f07y%\8ah\f5\b5\1e\85\81^a\1f\bcywJ\e3\a7\c4\c2l\b9?\f2\00\e0\08\a21\ad9\fa\0cq\ee\f1\00\b4\b4\c69\b4\f8\f3\d6zgQ\cd\f3\e8\d5'z\8ek\04?{\93\16N\ae\c8!\1b\10L\8b\e6 e\f6\e4\f6Y\0f\1e\0bW\aeF\c3h\0e\1a\d1\95\13\fey>\ba\e08\f7\0a\edfS\d7\d3\16{\a14\fbz\8e\e4\bf]\97\ae\b0\a6@\b8\feq\8c\d6m\9f~\c9_\f5\a7\b4\a5j=S\8f\efD\fe\00\c9\ed\a2\e7l\98\83\f8'\95\83P\e0)\0e\9d`\10\fb\8b\0f\99-\1dTt\9a\dd\ea\7f'\0a\f4\03\5c\9a]}\d1\fc\90I\8b/]bN\07=\adu.\9bIL\7f\ca\05\dfq\d7V6R\00i\104\e2\8c\e85\17Lu\d4\8b\b7p_\a2\ae\99h\04\f1\85\9f\bc\04\93\5c}\85h\1a\f1\82\0d\ef`\eb$\c3J\c1~6\1b7\bea,\1aj\1fL\f4\ae\b3\01a\a8r\0eA<\c7\b6\85\82A\af_\e0}J\9d\22c\1a\87\a0\bc\f4r\af\d3\c2Ja\b6\f4]\03\db\df\9a\cc\0a\84\e9\a5\17\cc\bb\a3\b3\17H\89\16({M\d8_,\147\d5\a5}\11\edM\8c\02\92\c1h\09S(~\b1\895Y;\171P\f0\a8Fa\fa$\a1\11\e4\a1\88\d5+vj\c6\fbD\df\22O{v[\de\ecI\ec\af\ff\f8\f9`5\f5\f8\ee\0cj\7f\b7\01\1f\c1\0e~\07\13\fcf\bfJ\d0s\8cL\85\b3R\05Sz\9aR%\13\ab\be\b1\b1\e9\f8\af\d6]\11y\a7\f9\a5\95\bf\91\bc\dac\9a7m\ca\0c\118k|\89\9c\e9U\12\ed\cf\09H\0a\dab:F\fe\cf\b3=\c9\fa\a3\87\d7\82\b6/]{\0e\fb\fc\22\f0\ac\97o\7f\13\06\a5`\fe\0f \99\f7[\c8N\a9\a0\1cF\92\fb\ae16b]\a1\13i\c3>\c4&T5z\b1\9e\b3q][fZw4x\f7\d0\e4\e9a\f0\bb\cd\0e\c2#\86\e5\f1\10\98\82\ce?]n\154\aaCc\d6y\e6\c9\85\ad\8f\e1Q\b8\8bi\e2:\edj\10[\a3\0f\04?^\baP\dbU\d1\b7\81z'\08\8c\b4\cb\a7\df\94J\93\1d\edli\8f\e5\feh\f3o\d2\0b\b9\9e\97Z/+\e9[\12w\90\b8?@\03\f4\e1\1e\86\c6\d2)g\02\1f\ddJ\1a6\12\17\f2h'\1f\a7\b7\d1i\c0X\db\19\86\e4\08\de\95\19\c3\8d=!r\d5]\06:\0c\bfq\d8\99'\eb\ad\92\22\8b\d2\0d;\f0X\0aGH\1b\e1 F\5c\b6x\97R\f6\f8]w\0d\c7\a10\caTX\e2\c6\f9\98\a5\22\b7m\09\c4\e8\a8\ec\f1Ud\b5Q\ebU\f7U\ad9\8d\91t\fe\92\f9\a1\85\f5\11u\8d\d01\f5y\b5\9e\90\c5\c8?\caw\9ekp8\b2\e3\1dW0\97\e47\c2\824\0c#\f5\ab\95Z\ce\97\cd\b8\dd-9~@\cb\f4\a7\ac\86\8d\05\91e\1d!\85Z\11@\7f\98\d1N\0a\83\97\9d\cc\e7\ff\a4z\10N\dc\f5\a1\e5Z\cb\0c\cd_\08/3\5c\17v_\d3|t\93JO\0a\c0\d9JP\7f\11i8\f8\90H\c5\9f\e6\13\93\1f2\ef\ec\5c\ed\83\9fXc\abL\d1)\b5\c2\1c\03\f2\89\e3\14\c6x\06\0ca-\d2\8f\b1$\e2\ff\d6K\a6\a3N\1e\fd4\08\be7\f1<\bb\e2\22\b1f\9b8\a53\b7\02\b5\f7}5$\ceI \13\14\cc\e4i\fe\22\c9\a1\af\e8\df\d8g\f7\0dD1\ce\acz\0b\11\037e^'\12\b7\d6\10\95\fc\89'\cdTrPe\f6\de\ad\91\e5\c7I[\db{\eb-\be'\f1\92\d1|\b2\97\1e\13\1ap\96\c0\b7\ed|\fd\a5\1c\82\84\a1\9d\8c\9f\a3W\b5\d3\a6\e9\00\b4W}\e5\ad\80Z\17&\eb\8f\1fuB\cbL\96\f9\13\17-\b88\f9\dcr\cd\01\d7\a9\cd\ad:\bc\80tz\b80r_\a7\03\bf\88\ee|\f5\a6R\bf\10\d4\95\b7\a6\0e\d4\ffCj2\9f\ac\d3e\cf\c6\f2\b3(\01I\14@\b9\1d\15\d8\f6\9ah\9c\d6\e7\c0\89\dc\96\d7\04Pn\a4\b9Drn\ea-\8f\ab\c4\94\97\ed\10\fbD\ddd\12\d4n;\93q\d9\98\1cS\c6\d3\e7#'\c6\13\a3C(\18|4\8a\a1\fe\e9Z\18\d6\dey\bd_\b4M\93\15\bbo\09\b8K\d1\faQn\22a\c6\84\b6\e5\c0\d0Cb|l\8dY%|\0b\05\80L\0d\dc\a7\c9\b6\97-\eb%\8e#\c0\1c\d1\fe(\0f\16\b7\b5\8a\90H\150\09\85\7fJ\bb\13\aaX\d1w\c2\e6\f3\ed\9c\b8\9c.v:\07\8b\a3\9d\a7A\f9f\e4\c9\1b\ff\bd6\97\a8l\81qj\f5\f4\9e\b0\f7\c1\a1^\f8\be&\d0\b1\f6l\9e\c78%\8def,m\90\17\d6\eb\fb\d2\b8g\91\f8v\a2\8bT=\92\1dF\aaP\1e\91\9c\ca\b9\deW\f7\89\99b\a6=\ad\c8\a4(\02\89\e2B\a2\18\ac.\cbP\b0\9c]\1a0E\82\c0\81TF\0f\19\e0\af\1f\a1n=\dc\d6\dc\98\16)39r\b6\8b\81\9f\c2\a9\85\f6%\17OZX\e7\06\fce\f1\fa\a8G\95\fc\c4~\02\1d\b1F\dax\cbH\f3.-\959l%\c6&\b1\d2 \fc\e3\a0M\ae\d3\cf\d4R\8b\bdO\c6t\a5\b91\bc+t\e6\b6\22\e0\8a\d8]]^\af\0a\d9)\d1\b1$\8e\cd\f1\22\81\08[N\d2\e7\a6\bc\12M\8b\c9\cb\03\9a\83\08\c1\cf\ffb\a6\c0\d7\ce\ec\d9\09\13N\e3i\9282\a3\d57G\fd\19\c1\1a\b0o\14\a7\dc\f0N\f3*h\c2\00>5w\c7\09\ca\14\a47\9b\cckx\b4\06\14rz\82\8f|Y\82B\8c+\b7\cb\d8NV\b2\10\e2\9f\c0\cdiq\8a\a5l\12\d6d\9aG\96.F\b2\b5DD\a0\fd\12\13\dc\fd\cfWi \ef\e5\89\9b\b0\8b\a8\f8\8fVC\e0\92\11P\93W\1e\a8}\a9[;7\a9\8e\e2G\b5r(\e7\e5\9b\1b\1f\90\a6`\09UZ\98\19Sq\0fAj\a2\97J\07\1b\bc\dd\96l`f\e9\ae\d0\09\aa\9f\efC\e6\bb]\8df\da\bf0\165|T`n+\1c~\1a hhAcp\cf\a76\af\a5\98i\ea\12\8a\94e\09W \9b\c0\07deH\85\cb\aa\f8\de\be\f3\00Kd&4b}B\b9h\ff\08\b8t\c3 \ef\d56\1c\b9`\b1\e9\1e\d2\19\9b\1c\805Xe\92D4<7\b7\ab\9d\cf\805<\16d5y|\cd\a37R\a2`cG\b8\f3\a9\89M\bf\107;\dc\c5\14\04=Y\04\9d`\ab\91[\91\13$\c3*\84\98S\ff\89@%H\beR\1d\b5)\af\90.\e5\ec\d9i\c2\07v\13/\97\ee\de\ff\b7\ec\b5\af\87[7\a3\04\9c\be\12\99\15\b23f$>\fd\e4\0cf\e6\8a\b7\b6\fd6\aa\fb2k\df\b4\b1J\a9\e7\d0L/\92\9e\fb\b5\09\db\f0\a9H\fa\f1}V\c8}\a6\89As\12D\f1|3\80\dfq\ef\c9\dd\98\15r\7fOe,0\f1\15\dd[\f0\d6\a6w\8c\15\8f\9b\ac\1a\cf\e9\00\80v-\16\06\deKZc\ad\d6y5G\b7\fd\13_GB\10)#\c3\09]\f7*\961.\e5I\dc\0c\e63m\93l|fSNKC\8d7\f6\9b\c3\be8t;\b9\edhNB\ad\a5\b2 ]\0e\0a.\1e\e5l24\bc\02\f4\8e\c9\08\f55\d2\84\0f\b8RU\9c\8e#1'\b7:=`\8f<\be)\98\09\b7\7fZ\9dm\c4L$\b1\f4\ad?\e9\01\10n\d8\cb^\f5\c3G7\a1\95\e6z\9f\85\8f\b4\81\06o8\d3\1e\0d\8e\d8zWE[\e9\fe\04\e8\cf\9d q2\e3\e9\9e\ab&\e4\bfy8\a5\de\16\b4\d9ohp\86\0c\16\f4,\ea\22\fd\d9\d4\8c]\eb$6\04\81 [\c5\a3\18G\85\a1or\1d\13-d\0a\cf\8b\9e\db\ce\a0\f8^\0c\f1:v\8ds\a6\b1N\ad;UQa\f0\9a\e7O\c8\c7\c3\cdb\f5\81\f6\d9a\d1\f9\c2\1c\b31\f8\0e\06\80=\b2\0f\be \fbo\e1\94\00\0b\e3\f6\92.)\e7\18P+\ae\e4\a6\ab\ceH\8e\fd`\f2\b5\1f\cf_BX\98\a5C\07\ee\17r2\e0\d4\f1\ca\e0\f7F\d7\a2\08\edy\a9\fe\bf\1e\13H\fc\03m\05\cei\82E\fa\fa\e8\87\cb\fdMf\cb(H\80\df<;Sg\a2u/\c8AX+\a8\a8\ff.\a6V\c1\e7\e3\5c\de\ba,\14\a6\88{\c1X\9b\a6\b9IU|\fdP+\b0\ad\bf\02\0a2e\8f\11\818\bfSg\b7\8f\f7\fd\a1\01L\a1L\7f\c2lX\8a\98\93\a4A\93=\a0\c0,8g\903\99\e0&a\ad\80\22UY\8f\11\ef\c8/\a0\02\97\f9\db\d0tG\cdH\d2\b2\cd\b8\cf\13%\7f\b7\15\e5\b0[\c4\cb\e1C\bd^\d6\b4\cb\8c\ba'\faB\03\80#\ce+C\f4\cf\9d\a5\bc\c9\ad+/\d2\8b\fe\90\da>7\06\bb \80\ce8JB*\9f\abl8\dc\f6\7f\7f \dd\be![]X$3s]/\cb\85\9b\a6\0d|v8\b6\ca7\e0\e2$\e9\09\c8\d9\f9\16\fc\d1\b3B \1e\810\ba\e8B\f8\c5x\a8\bf|\10\e8u,}\bc\9dG#\f5\db\11o)\9f`,\e9\03im\c7\b6*\22W\da0\8e\c4c%Y,\ad\b8\a0h\cb\e0\e6:<\d5\84\09\09\fd\fbHK\eb\e0\14\c6\d0\b2*\fd~i\e3\abY]*\de\b9\e8\08\f8SN\84%&\adCt\b9\d8/\c0\c4\dd\ac\1a\05\bf)!r(\8b\16\93\ad\ea)\fcv\f4II\ed*\06{\e4\d5\d2\caA\c3\fdp9\caU\f7\0f\a0\ed\8aLF^\e6\a3p\d9\86N\d57D\c6\1d\c3\10\8a\a2\13\22\9e\90\83@\f4PU?\af/?\e9\af\a8\be'\04/\c8\09\a1\f8\c6\b6\a68\17\05y\bc.Z8\d8H\cbk\d4\abn\86\ff\18\f3\1e\bc7o\08\ee\c6\c9\b4\96\e6\bf\f8\0aR\b2\f7r\d8S\b7\18\bc\83\1a\f6\d2*\1eo\b5\d7\81)\15\cf\0fSV\fc\a9\dc\f6ur\fe\8f\c1<{\e2\ca\12M\dd\87T\b4\e5O\8f\f1\db\d9U\9e?\05\f5\86?fD\91d#\0d\7f\f1L\d3\cc-}\af\80\8e\f4\bd\cb\8a?\f9\02\ae\a7\ab \83\0c\fa\f8\c6\f5\03b\04o\f4\e2z\88:\bd\ea\f4ju\5ca\bf\f7_r\14\973C\ae\ecm\fc\d7k\b7\ae\fe;\16\9e\cb\98\c2\87\c8=\c1\f9\c7\18\a7w\df\cd\87p3vx\fdK=e\ac\d5$\e2\876\e5\d6\97\09\02\c5T\16\cf7\b6\bf5\f3?5\0d]y,\ae\ed\c0\8at\d0\c8\86^\22zn\9d\e7\a9\b1\b4\cb\a7}I,9h\cc\ae$\ac/\15$\dc\5c>\bfMq\05 \08s=\eb\ed\1bLE\bbuH\1a1\d9\f9\82\86\8b\1b\e5\b7\92P\03\9a\19\1a4\af\9d\01[~\a5\06\a8\86< \e3D\a1~\cf\f7\a0gi\9c\81\d3\dc\9b\de<\b8\ff\95\09t\c9\97*~\00$\a7\b2(\a0\05sR\b0\cf&\0a\d5\849\ff\8a\04\cc !\80\aec^\a1\ed\00\e6\d1\c6Y\a7P\c1t\c3o\cc\f1\a9.ul\f4\f7\0c\d8j2\f2\d1=*\d6!\19&\8a\d9\e1iL\f4~\fc\fd9\eek\a6\9e\fa\84i[\b8\d1\d9\05\caT\fe3\e9:\02\8d\82/a}\f4_\b1D\09\d5sv\d7F\09@q\8b\13\a5\e7\cc\bf\81\0f\eb\8f\e1\f1K\a8\e3~:\c9b\10\e3\1b\94\a6\01\22nTx\0b\b5\96o\a7\b81\f4\e7\c0,;)z:\0c\b9\b46zj\c9\02Av\81\95\8b\1f\c9\cdZ`L\17+\da\0f\e9\cagT\12z\19\da&\fc\deh\ac`\1e9\cd\82j\b7\bd\e6C?\a2\8e.\c7-\f4\03\1a\d0w\0f\10\1d\c4\b2Z)^\c1@3\cd\88\9d")) diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.c new file mode 100644 index 0000000..b28c73d --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.c @@ -0,0 +1,479 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of 128, + bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. +*/ + +#include "aes.h" + +#include "aestab.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define four_tables(x, tab, vf, rf, c) \ + (tab[0][bval(vf(x, 0, c), rf(0, c))] ^ \ + tab[1][bval(vf(x, 1, c), rf(1, c))] ^ \ + tab[2][bval(vf(x, 2, c), rf(2, c))] ^ \ + tab[3][bval(vf(x, 3, c), rf(3, c))]) + +#define vf1(x, r, c) (x) +#define rf1(r, c) (r) +#define rf2(r, c) ((r - c) & 3) + +#define ls_box(x, c) four_tables(x, rijndael_dec_fl_tab, vf1, rf2, c) + +#define inv_mcol(x) four_tables(x, rijndael_dec_im_tab, vf1, rf1, 0) + +/* + Subroutine to set the block size (if variable) in bytes, legal + values being 16, 24 and 32. +*/ + +#define nc (Ncol) + +/* + Initialise the key schedule from the user supplied key. The key + length is now specified in bytes - 16, 24 or 32 as appropriate. + This corresponds to bit lengths of 128, 192 and 256 bits, and + to Nk values of 4, 6 and 8 respectively. +*/ + +#define mx(t, f) (*t++ = inv_mcol(*f), f++) +#define cp(t, f) *t++ = *f++ + +#define cpy(d, s) \ + do { \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + } while (0) // min 1 max 1 +#define mix(d, s) \ + do { \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + } while (0) // min 1 max 1 + +aes_ret +rijndael_dec_set_key(byte in_key[], const word n_bytes, const enum aes_key f, + struct aes *cx) { + word *kf, *kt, rci; + + if ((n_bytes & 7) || n_bytes < 16 || n_bytes > 32 || (!(f & 1) && !(f & 2))) + return (n_bytes ? cx->mode &= ~0x03, + aes_bad : (aes_ret) (cx->Nkey << 2)); + + cx->mode = (cx->mode & ~0x03) | ((byte) f & 0x03); + cx->Nkey = n_bytes >> 2; + cx->Nrnd = Nr(cx->Nkey, (word) nc); + + cx->e_key[0] = word_in(in_key); + cx->e_key[1] = word_in(in_key + 4); + cx->e_key[2] = word_in(in_key + 8); + cx->e_key[3] = word_in(in_key + 12); + + kf = cx->e_key; + kt = kf + nc * (cx->Nrnd + 1) - cx->Nkey; + rci = 0; + + switch (cx->Nkey) { + case 4: + __pragma_loopbound(0, 0); + do { + kf[4] = kf[0] ^ ls_box(kf[3], 3) ^ rijndael_dec_rcon_tab[rci++]; + kf[5] = kf[1] ^ kf[4]; + kf[6] = kf[2] ^ kf[5]; + kf[7] = kf[3] ^ kf[6]; + kf += 4; + } while (kf < kt); + break; + + case 6: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + __pragma_loopbound(0, 0); + do { + kf[6] = kf[0] ^ ls_box(kf[5], 3) ^ rijndael_dec_rcon_tab[rci++]; + kf[7] = kf[1] ^ kf[6]; + kf[8] = kf[2] ^ kf[7]; + kf[9] = kf[3] ^ kf[8]; + kf[10] = kf[4] ^ kf[9]; + kf[11] = kf[5] ^ kf[10]; + kf += 6; + } while (kf < kt); + break; + + case 8: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + cx->e_key[6] = word_in(in_key + 24); + cx->e_key[7] = word_in(in_key + 28); + __pragma_loopbound(7, 7); + do { + kf[8] = kf[0] ^ ls_box(kf[7], 3) ^ rijndael_dec_rcon_tab[rci++]; + kf[9] = kf[1] ^ kf[8]; + kf[10] = kf[2] ^ kf[9]; + kf[11] = kf[3] ^ kf[10]; + kf[12] = kf[4] ^ ls_box(kf[11], 0); + kf[13] = kf[5] ^ kf[12]; + kf[14] = kf[6] ^ kf[13]; + kf[15] = kf[7] ^ kf[14]; + kf += 8; + } while (kf < kt); + break; + } + + if ((cx->mode & 3) != enc) { + word i; + + kt = cx->d_key + nc * cx->Nrnd; + kf = cx->e_key; + + cpy(kt, kf); + kt -= 2 * nc; + + __pragma_loopbound(13, 13); + for (i = 1; i < cx->Nrnd; ++i) { + mix(kt, kf); + kt -= 2 * nc; + } + + cpy(kt, kf); + } + + return aes_good; +} + +short +rijndael_dec_decrypt(const unsigned char in_blk[], unsigned char out_blk[], + const struct aes *cx) { + const unsigned long *kp = cx->d_key; + if (!(cx->mode & 2)) + return 0; + unsigned long b0[4]; + b0[0] = *(unsigned long *) in_blk ^ kp[0]; + b0[1] = *(unsigned long *) (in_blk + 4) ^ kp[1]; + b0[2] = *(unsigned long *) (in_blk + 8) ^ kp[2]; + b0[3] = *(unsigned long *) (in_blk + 12) ^ kp[3]; + kp += 4; + unsigned long b1[4]; + switch (cx->Nrnd) { + case 14: + b1[0] = + kp[0] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + kp += 8; + case 12: + b1[0] = + kp[0] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + kp += 8; + case 10: + b1[0] = + kp[0] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 8)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 8)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 8)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 8)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 12)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 12)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 12)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 12)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 16)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 16)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 16)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 16)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 20)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 20)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 20)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 20)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 24)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 24)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 24)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 24)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 28)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 28)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 28)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 28)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 32)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 32)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 32)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 32)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 36)[0] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 36)[1] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 36)[2] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 36)[3] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[0] >> 24))]); + } + *(unsigned long *) out_blk = (b0[0]); + *(unsigned long *) (out_blk + 4) = (b0[1]); + *(unsigned long *) (out_blk + 8) = (b0[2]); + *(unsigned long *) (out_blk + 12) = (b0[3]); + return aes_good; +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.h b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.h new file mode 100644 index 0000000..62e9b88 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aes.h @@ -0,0 +1,167 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + 1. FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of + 128 bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. + + 2. THE CIPHER INTERFACE + + byte (an unsigned 8-bit type) + word (an unsigned 32-bit type) + aes_ret: (a signed 16 bit type for function return values) + aes_good (value != 0, a good return) + aes_bad (value == 0, an error return) + enum aes_key: (encryption direction) + enc (set key for encryption) + dec (set key for decryption) + both (set key for both) + class or struct aes (structure for context) + + C subroutine calls: + + aes_ret set_blk(const word block_length, aes *cx) (variable block size) + aes_ret set_key(const byte key[ ], const word key_length, + const enum aes_key direction, aes *cx) + aes_ret encrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + aes_ret decrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + + IMPORTANT NOTE: If you are using this C interface and your compiler does + not set the memory used for objects to zero before use, you will need to + ensure that cx.mode is set to zero before using the C subroutine calls. + + The block length inputs to set_block and set_key are in numbers of + BYTES, not bits. The calls to subroutines must be made in the above + order but multiple calls can be made without repeating earlier calls + if their parameters have not changed. If the cipher block length is + variable but set_blk has not been called before cipher operations a + value of 16 is assumed (that is, the AES block size). In contrast to + earlier versions the block and key length parameters are now checked + for correctness and the encryption and decryption routines check to + ensure that an appropriate key has been set before they are called. + +*/ + +#ifndef _AES_H +#define _AES_H + +/* The only supported block size for the benchmark is 16 */ +#define BLOCK_SIZE 16 + +/* + The number of key schedule words for different block and key lengths + (allowing for the method of computation which requires the length to + be a multiple of the key length): + + Key Schedule key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 44 60 54 56 64 + length 20 | 60 60 66 70 80 + (bytes) 24 | 80 80 78 84 96 + 28 | 100 100 102 98 112 + 32 | 120 120 120 126 120 + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + The following values assume that the key length will be variable and may + be of maximum length (32 bytes). + + Nk = number_of_key_bytes / 4 + Nc = number_of_columns_in_state / 4 + Nr = number of encryption/decryption rounds + Rc = number of elements in rcon table + Ks = number of 32-bit words in key schedule +*/ + +#define Nr(Nk, Nc) ((Nk > Nc ? Nk : Nc) + 6) +#define Rc(Nk, Nc) ((Nb * (Nr(Nk, Nc) + 1) - 1) / Nk) +#define Ks(Nk, Nc) (Nk * (Rc(Nk, Nc) + 1)) + +#define RC_LENGTH 5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11) +#define KS_LENGTH 4 * BLOCK_SIZE + +/* End of configuration options, but see also aes.c */ + +typedef unsigned char byte; /* must be an 8-bit storage unit */ +typedef unsigned long word; /* must be a 32-bit storage unit */ +typedef short aes_ret; /* function return value */ + +#define aes_bad 0 +#define aes_good 1 + +/* + upr(x,n): rotates bytes within words by n positions, moving bytes + to higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word +*/ + +#define upr(x, n) (((x) << 8 * (n)) | ((x) >> (32 - 8 * (n)))) +#define ups(x, n) ((x) << 8 * (n)) +#define bval(x, n) ((byte) ((x) >> 8 * (n))) +#define byte_swap(x) (upr(x, 1) & 0x00ff00ff | upr(x, 3) & 0xff00ff00) +#define bytes2word(b0, b1, b2, b3) \ + ((word) (b3) << 24 | (word) (b2) << 16 | (word) (b1) << 8 | (b0)) + +#define word_in(x) *(word *) (x) +#define word_out(x, v) *(word *) (x) = (v) + +enum aes_const { + Nrow = 4, /* the number of rows in the cipher state */ + Mcol = 8, /* maximum number of columns in the state */ + Ncol = BLOCK_SIZE / 4, + Shr0 = 0, /* the cyclic shift values for rows 0, 1, 2 & 3 */ + Shr1 = 1, + Shr2 = BLOCK_SIZE == 32 ? 3 : 2, + Shr3 = BLOCK_SIZE == 32 ? 4 : 3 +}; + +enum aes_key { + enc = 1, /* set if encryption is needed */ + dec = 2, /* set if decryption is needed */ + both = 3 /* set if both are needed */ +}; + +struct aes { + word Nkey; /* the number of words in the key input block */ + word Nrnd; /* the number of cipher rounds */ + word e_key[KS_LENGTH]; /* the encryption key schedule */ + word d_key[KS_LENGTH]; /* the decryption key schedule */ + byte mode; /* encrypt, decrypt or both */ +}; + +aes_ret rijndael_dec_set_key(byte key[], const word n_bytes, + const enum aes_key f, struct aes *cx); +aes_ret rijndael_dec_decrypt(const byte in_blk[], byte out_blk[], + const struct aes *cx); + +#endif diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aestab.h b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aestab.h new file mode 100644 index 0000000..7507254 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/aestab.h @@ -0,0 +1,426 @@ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +/* + Used to ensure table is generated in the right format + depending on the internal byte order required. +*/ + +#define w0(p) 0x000000##p + +/* + Number of elements required in this table for different + block and key lengths is: + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + this table can be a table of bytes if the key schedule + code is adjusted accordingly +*/ + +const word rijndael_dec_rcon_tab[29] = { + w0(01), w0(02), w0(04), w0(08), w0(10), w0(20), w0(40), w0(80), + w0(1b), w0(36), w0(6c), w0(d8), w0(ab), w0(4d), w0(9a), w0(2f), + w0(5e), w0(bc), w0(63), w0(c6), w0(97), w0(35), w0(6a), w0(d4), + w0(b3), w0(7d), w0(fa), w0(ef), w0(c5)}; + +#undef w0 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +#define r0(p, q, r, s) 0x##p##q##r##s +#define r1(p, q, r, s) 0x##q##r##s##p +#define r2(p, q, r, s) 0x##r##s##p##q +#define r3(p, q, r, s) 0x##s##p##q##r +#define w0(p) 0x000000##p +#define w1(p) 0x0000##p##00 +#define w2(p) 0x00##p##0000 +#define w3(p) 0x##p##000000 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +/* data for forward tables (other than last round) */ + +#define f_table \ + r(a5, 63, 63, c6), r(84, 7c, 7c, f8), r(99, 77, 77, ee), \ + r(8d, 7b, 7b, f6), r(0d, f2, f2, ff), r(bd, 6b, 6b, d6), \ + r(b1, 6f, 6f, de), r(54, c5, c5, 91), r(50, 30, 30, 60), \ + r(03, 01, 01, 02), r(a9, 67, 67, ce), r(7d, 2b, 2b, 56), \ + r(19, fe, fe, e7), r(62, d7, d7, b5), r(e6, ab, ab, 4d), \ + r(9a, 76, 76, ec), r(45, ca, ca, 8f), r(9d, 82, 82, 1f), \ + r(40, c9, c9, 89), r(87, 7d, 7d, fa), r(15, fa, fa, ef), \ + r(eb, 59, 59, b2), r(c9, 47, 47, 8e), r(0b, f0, f0, fb), \ + r(ec, ad, ad, 41), r(67, d4, d4, b3), r(fd, a2, a2, 5f), \ + r(ea, af, af, 45), r(bf, 9c, 9c, 23), r(f7, a4, a4, 53), \ + r(96, 72, 72, e4), r(5b, c0, c0, 9b), r(c2, b7, b7, 75), \ + r(1c, fd, fd, e1), r(ae, 93, 93, 3d), r(6a, 26, 26, 4c), \ + r(5a, 36, 36, 6c), r(41, 3f, 3f, 7e), r(02, f7, f7, f5), \ + r(4f, cc, cc, 83), r(5c, 34, 34, 68), r(f4, a5, a5, 51), \ + r(34, e5, e5, d1), r(08, f1, f1, f9), r(93, 71, 71, e2), \ + r(73, d8, d8, ab), r(53, 31, 31, 62), r(3f, 15, 15, 2a), \ + r(0c, 04, 04, 08), r(52, c7, c7, 95), r(65, 23, 23, 46), \ + r(5e, c3, c3, 9d), r(28, 18, 18, 30), r(a1, 96, 96, 37), \ + r(0f, 05, 05, 0a), r(b5, 9a, 9a, 2f), r(09, 07, 07, 0e), \ + r(36, 12, 12, 24), r(9b, 80, 80, 1b), r(3d, e2, e2, df), \ + r(26, eb, eb, cd), r(69, 27, 27, 4e), r(cd, b2, b2, 7f), \ + r(9f, 75, 75, ea), r(1b, 09, 09, 12), r(9e, 83, 83, 1d), \ + r(74, 2c, 2c, 58), r(2e, 1a, 1a, 34), r(2d, 1b, 1b, 36), \ + r(b2, 6e, 6e, dc), r(ee, 5a, 5a, b4), r(fb, a0, a0, 5b), \ + r(f6, 52, 52, a4), r(4d, 3b, 3b, 76), r(61, d6, d6, b7), \ + r(ce, b3, b3, 7d), r(7b, 29, 29, 52), r(3e, e3, e3, dd), \ + r(71, 2f, 2f, 5e), r(97, 84, 84, 13), r(f5, 53, 53, a6), \ + r(68, d1, d1, b9), r(00, 00, 00, 00), r(2c, ed, ed, c1), \ + r(60, 20, 20, 40), r(1f, fc, fc, e3), r(c8, b1, b1, 79), \ + r(ed, 5b, 5b, b6), r(be, 6a, 6a, d4), r(46, cb, cb, 8d), \ + r(d9, be, be, 67), r(4b, 39, 39, 72), r(de, 4a, 4a, 94), \ + r(d4, 4c, 4c, 98), r(e8, 58, 58, b0), r(4a, cf, cf, 85), \ + r(6b, d0, d0, bb), r(2a, ef, ef, c5), r(e5, aa, aa, 4f), \ + r(16, fb, fb, ed), r(c5, 43, 43, 86), r(d7, 4d, 4d, 9a), \ + r(55, 33, 33, 66), r(94, 85, 85, 11), r(cf, 45, 45, 8a), \ + r(10, f9, f9, e9), r(06, 02, 02, 04), r(81, 7f, 7f, fe), \ + r(f0, 50, 50, a0), r(44, 3c, 3c, 78), r(ba, 9f, 9f, 25), \ + r(e3, a8, a8, 4b), r(f3, 51, 51, a2), r(fe, a3, a3, 5d), \ + r(c0, 40, 40, 80), r(8a, 8f, 8f, 05), r(ad, 92, 92, 3f), \ + r(bc, 9d, 9d, 21), r(48, 38, 38, 70), r(04, f5, f5, f1), \ + r(df, bc, bc, 63), r(c1, b6, b6, 77), r(75, da, da, af), \ + r(63, 21, 21, 42), r(30, 10, 10, 20), r(1a, ff, ff, e5), \ + r(0e, f3, f3, fd), r(6d, d2, d2, bf), r(4c, cd, cd, 81), \ + r(14, 0c, 0c, 18), r(35, 13, 13, 26), r(2f, ec, ec, c3), \ + r(e1, 5f, 5f, be), r(a2, 97, 97, 35), r(cc, 44, 44, 88), \ + r(39, 17, 17, 2e), r(57, c4, c4, 93), r(f2, a7, a7, 55), \ + r(82, 7e, 7e, fc), r(47, 3d, 3d, 7a), r(ac, 64, 64, c8), \ + r(e7, 5d, 5d, ba), r(2b, 19, 19, 32), r(95, 73, 73, e6), \ + r(a0, 60, 60, c0), r(98, 81, 81, 19), r(d1, 4f, 4f, 9e), \ + r(7f, dc, dc, a3), r(66, 22, 22, 44), r(7e, 2a, 2a, 54), \ + r(ab, 90, 90, 3b), r(83, 88, 88, 0b), r(ca, 46, 46, 8c), \ + r(29, ee, ee, c7), r(d3, b8, b8, 6b), r(3c, 14, 14, 28), \ + r(79, de, de, a7), r(e2, 5e, 5e, bc), r(1d, 0b, 0b, 16), \ + r(76, db, db, ad), r(3b, e0, e0, db), r(56, 32, 32, 64), \ + r(4e, 3a, 3a, 74), r(1e, 0a, 0a, 14), r(db, 49, 49, 92), \ + r(0a, 06, 06, 0c), r(6c, 24, 24, 48), r(e4, 5c, 5c, b8), \ + r(5d, c2, c2, 9f), r(6e, d3, d3, bd), r(ef, ac, ac, 43), \ + r(a6, 62, 62, c4), r(a8, 91, 91, 39), r(a4, 95, 95, 31), \ + r(37, e4, e4, d3), r(8b, 79, 79, f2), r(32, e7, e7, d5), \ + r(43, c8, c8, 8b), r(59, 37, 37, 6e), r(b7, 6d, 6d, da), \ + r(8c, 8d, 8d, 01), r(64, d5, d5, b1), r(d2, 4e, 4e, 9c), \ + r(e0, a9, a9, 49), r(b4, 6c, 6c, d8), r(fa, 56, 56, ac), \ + r(07, f4, f4, f3), r(25, ea, ea, cf), r(af, 65, 65, ca), \ + r(8e, 7a, 7a, f4), r(e9, ae, ae, 47), r(18, 08, 08, 10), \ + r(d5, ba, ba, 6f), r(88, 78, 78, f0), r(6f, 25, 25, 4a), \ + r(72, 2e, 2e, 5c), r(24, 1c, 1c, 38), r(f1, a6, a6, 57), \ + r(c7, b4, b4, 73), r(51, c6, c6, 97), r(23, e8, e8, cb), \ + r(7c, dd, dd, a1), r(9c, 74, 74, e8), r(21, 1f, 1f, 3e), \ + r(dd, 4b, 4b, 96), r(dc, bd, bd, 61), r(86, 8b, 8b, 0d), \ + r(85, 8a, 8a, 0f), r(90, 70, 70, e0), r(42, 3e, 3e, 7c), \ + r(c4, b5, b5, 71), r(aa, 66, 66, cc), r(d8, 48, 48, 90), \ + r(05, 03, 03, 06), r(01, f6, f6, f7), r(12, 0e, 0e, 1c), \ + r(a3, 61, 61, c2), r(5f, 35, 35, 6a), r(f9, 57, 57, ae), \ + r(d0, b9, b9, 69), r(91, 86, 86, 17), r(58, c1, c1, 99), \ + r(27, 1d, 1d, 3a), r(b9, 9e, 9e, 27), r(38, e1, e1, d9), \ + r(13, f8, f8, eb), r(b3, 98, 98, 2b), r(33, 11, 11, 22), \ + r(bb, 69, 69, d2), r(70, d9, d9, a9), r(89, 8e, 8e, 07), \ + r(a7, 94, 94, 33), r(b6, 9b, 9b, 2d), r(22, 1e, 1e, 3c), \ + r(92, 87, 87, 15), r(20, e9, e9, c9), r(49, ce, ce, 87), \ + r(ff, 55, 55, aa), r(78, 28, 28, 50), r(7a, df, df, a5), \ + r(8f, 8c, 8c, 03), r(f8, a1, a1, 59), r(80, 89, 89, 09), \ + r(17, 0d, 0d, 1a), r(da, bf, bf, 65), r(31, e6, e6, d7), \ + r(c6, 42, 42, 84), r(b8, 68, 68, d0), r(c3, 41, 41, 82), \ + r(b0, 99, 99, 29), r(77, 2d, 2d, 5a), r(11, 0f, 0f, 1e), \ + r(cb, b0, b0, 7b), r(fc, 54, 54, a8), r(d6, bb, bb, 6d), \ + r(3a, 16, 16, 2c) + +/* data for inverse tables (other than last round) */ + +#define i_table \ + r(50, a7, f4, 51), r(53, 65, 41, 7e), r(c3, a4, 17, 1a), \ + r(96, 5e, 27, 3a), r(cb, 6b, ab, 3b), r(f1, 45, 9d, 1f), \ + r(ab, 58, fa, ac), r(93, 03, e3, 4b), r(55, fa, 30, 20), \ + r(f6, 6d, 76, ad), r(91, 76, cc, 88), r(25, 4c, 02, f5), \ + r(fc, d7, e5, 4f), r(d7, cb, 2a, c5), r(80, 44, 35, 26), \ + r(8f, a3, 62, b5), r(49, 5a, b1, de), r(67, 1b, ba, 25), \ + r(98, 0e, ea, 45), r(e1, c0, fe, 5d), r(02, 75, 2f, c3), \ + r(12, f0, 4c, 81), r(a3, 97, 46, 8d), r(c6, f9, d3, 6b), \ + r(e7, 5f, 8f, 03), r(95, 9c, 92, 15), r(eb, 7a, 6d, bf), \ + r(da, 59, 52, 95), r(2d, 83, be, d4), r(d3, 21, 74, 58), \ + r(29, 69, e0, 49), r(44, c8, c9, 8e), r(6a, 89, c2, 75), \ + r(78, 79, 8e, f4), r(6b, 3e, 58, 99), r(dd, 71, b9, 27), \ + r(b6, 4f, e1, be), r(17, ad, 88, f0), r(66, ac, 20, c9), \ + r(b4, 3a, ce, 7d), r(18, 4a, df, 63), r(82, 31, 1a, e5), \ + r(60, 33, 51, 97), r(45, 7f, 53, 62), r(e0, 77, 64, b1), \ + r(84, ae, 6b, bb), r(1c, a0, 81, fe), r(94, 2b, 08, f9), \ + r(58, 68, 48, 70), r(19, fd, 45, 8f), r(87, 6c, de, 94), \ + r(b7, f8, 7b, 52), r(23, d3, 73, ab), r(e2, 02, 4b, 72), \ + r(57, 8f, 1f, e3), r(2a, ab, 55, 66), r(07, 28, eb, b2), \ + r(03, c2, b5, 2f), r(9a, 7b, c5, 86), r(a5, 08, 37, d3), \ + r(f2, 87, 28, 30), r(b2, a5, bf, 23), r(ba, 6a, 03, 02), \ + r(5c, 82, 16, ed), r(2b, 1c, cf, 8a), r(92, b4, 79, a7), \ + r(f0, f2, 07, f3), r(a1, e2, 69, 4e), r(cd, f4, da, 65), \ + r(d5, be, 05, 06), r(1f, 62, 34, d1), r(8a, fe, a6, c4), \ + r(9d, 53, 2e, 34), r(a0, 55, f3, a2), r(32, e1, 8a, 05), \ + r(75, eb, f6, a4), r(39, ec, 83, 0b), r(aa, ef, 60, 40), \ + r(06, 9f, 71, 5e), r(51, 10, 6e, bd), r(f9, 8a, 21, 3e), \ + r(3d, 06, dd, 96), r(ae, 05, 3e, dd), r(46, bd, e6, 4d), \ + r(b5, 8d, 54, 91), r(05, 5d, c4, 71), r(6f, d4, 06, 04), \ + r(ff, 15, 50, 60), r(24, fb, 98, 19), r(97, e9, bd, d6), \ + r(cc, 43, 40, 89), r(77, 9e, d9, 67), r(bd, 42, e8, b0), \ + r(88, 8b, 89, 07), r(38, 5b, 19, e7), r(db, ee, c8, 79), \ + r(47, 0a, 7c, a1), r(e9, 0f, 42, 7c), r(c9, 1e, 84, f8), \ + r(00, 00, 00, 00), r(83, 86, 80, 09), r(48, ed, 2b, 32), \ + r(ac, 70, 11, 1e), r(4e, 72, 5a, 6c), r(fb, ff, 0e, fd), \ + r(56, 38, 85, 0f), r(1e, d5, ae, 3d), r(27, 39, 2d, 36), \ + r(64, d9, 0f, 0a), r(21, a6, 5c, 68), r(d1, 54, 5b, 9b), \ + r(3a, 2e, 36, 24), r(b1, 67, 0a, 0c), r(0f, e7, 57, 93), \ + r(d2, 96, ee, b4), r(9e, 91, 9b, 1b), r(4f, c5, c0, 80), \ + r(a2, 20, dc, 61), r(69, 4b, 77, 5a), r(16, 1a, 12, 1c), \ + r(0a, ba, 93, e2), r(e5, 2a, a0, c0), r(43, e0, 22, 3c), \ + r(1d, 17, 1b, 12), r(0b, 0d, 09, 0e), r(ad, c7, 8b, f2), \ + r(b9, a8, b6, 2d), r(c8, a9, 1e, 14), r(85, 19, f1, 57), \ + r(4c, 07, 75, af), r(bb, dd, 99, ee), r(fd, 60, 7f, a3), \ + r(9f, 26, 01, f7), r(bc, f5, 72, 5c), r(c5, 3b, 66, 44), \ + r(34, 7e, fb, 5b), r(76, 29, 43, 8b), r(dc, c6, 23, cb), \ + r(68, fc, ed, b6), r(63, f1, e4, b8), r(ca, dc, 31, d7), \ + r(10, 85, 63, 42), r(40, 22, 97, 13), r(20, 11, c6, 84), \ + r(7d, 24, 4a, 85), r(f8, 3d, bb, d2), r(11, 32, f9, ae), \ + r(6d, a1, 29, c7), r(4b, 2f, 9e, 1d), r(f3, 30, b2, dc), \ + r(ec, 52, 86, 0d), r(d0, e3, c1, 77), r(6c, 16, b3, 2b), \ + r(99, b9, 70, a9), r(fa, 48, 94, 11), r(22, 64, e9, 47), \ + r(c4, 8c, fc, a8), r(1a, 3f, f0, a0), r(d8, 2c, 7d, 56), \ + r(ef, 90, 33, 22), r(c7, 4e, 49, 87), r(c1, d1, 38, d9), \ + r(fe, a2, ca, 8c), r(36, 0b, d4, 98), r(cf, 81, f5, a6), \ + r(28, de, 7a, a5), r(26, 8e, b7, da), r(a4, bf, ad, 3f), \ + r(e4, 9d, 3a, 2c), r(0d, 92, 78, 50), r(9b, cc, 5f, 6a), \ + r(62, 46, 7e, 54), r(c2, 13, 8d, f6), r(e8, b8, d8, 90), \ + r(5e, f7, 39, 2e), r(f5, af, c3, 82), r(be, 80, 5d, 9f), \ + r(7c, 93, d0, 69), r(a9, 2d, d5, 6f), r(b3, 12, 25, cf), \ + r(3b, 99, ac, c8), r(a7, 7d, 18, 10), r(6e, 63, 9c, e8), \ + r(7b, bb, 3b, db), r(09, 78, 26, cd), r(f4, 18, 59, 6e), \ + r(01, b7, 9a, ec), r(a8, 9a, 4f, 83), r(65, 6e, 95, e6), \ + r(7e, e6, ff, aa), r(08, cf, bc, 21), r(e6, e8, 15, ef), \ + r(d9, 9b, e7, ba), r(ce, 36, 6f, 4a), r(d4, 09, 9f, ea), \ + r(d6, 7c, b0, 29), r(af, b2, a4, 31), r(31, 23, 3f, 2a), \ + r(30, 94, a5, c6), r(c0, 66, a2, 35), r(37, bc, 4e, 74), \ + r(a6, ca, 82, fc), r(b0, d0, 90, e0), r(15, d8, a7, 33), \ + r(4a, 98, 04, f1), r(f7, da, ec, 41), r(0e, 50, cd, 7f), \ + r(2f, f6, 91, 17), r(8d, d6, 4d, 76), r(4d, b0, ef, 43), \ + r(54, 4d, aa, cc), r(df, 04, 96, e4), r(e3, b5, d1, 9e), \ + r(1b, 88, 6a, 4c), r(b8, 1f, 2c, c1), r(7f, 51, 65, 46), \ + r(04, ea, 5e, 9d), r(5d, 35, 8c, 01), r(73, 74, 87, fa), \ + r(2e, 41, 0b, fb), r(5a, 1d, 67, b3), r(52, d2, db, 92), \ + r(33, 56, 10, e9), r(13, 47, d6, 6d), r(8c, 61, d7, 9a), \ + r(7a, 0c, a1, 37), r(8e, 14, f8, 59), r(89, 3c, 13, eb), \ + r(ee, 27, a9, ce), r(35, c9, 61, b7), r(ed, e5, 1c, e1), \ + r(3c, b1, 47, 7a), r(59, df, d2, 9c), r(3f, 73, f2, 55), \ + r(79, ce, 14, 18), r(bf, 37, c7, 73), r(ea, cd, f7, 53), \ + r(5b, aa, fd, 5f), r(14, 6f, 3d, df), r(86, db, 44, 78), \ + r(81, f3, af, ca), r(3e, c4, 68, b9), r(2c, 34, 24, 38), \ + r(5f, 40, a3, c2), r(72, c3, 1d, 16), r(0c, 25, e2, bc), \ + r(8b, 49, 3c, 28), r(41, 95, 0d, ff), r(71, 01, a8, 39), \ + r(de, b3, 0c, 08), r(9c, e4, b4, d8), r(90, c1, 56, 64), \ + r(61, 84, cb, 7b), r(70, b6, 32, d5), r(74, 5c, 6c, 48), \ + r(42, 57, b8, d0) + +/* generate the required tables in the desired endian format */ + +#undef r +#define r r0 +const word rijndael_dec_it_tab[4][256] = {{i_table}, +#undef r +#define r r1 + {i_table}, +#undef r +#define r r2 + {i_table}, +#undef r +#define r r3 + {i_table}}; + +/* data for inverse tables (last round) */ + +#define li_table \ + w(52), w(09), w(6a), w(d5), w(30), w(36), w(a5), w(38), w(bf), w(40), \ + w(a3), w(9e), w(81), w(f3), w(d7), w(fb), w(7c), w(e3), w(39), w(82), \ + w(9b), w(2f), w(ff), w(87), w(34), w(8e), w(43), w(44), w(c4), w(de), \ + w(e9), w(cb), w(54), w(7b), w(94), w(32), w(a6), w(c2), w(23), w(3d), \ + w(ee), w(4c), w(95), w(0b), w(42), w(fa), w(c3), w(4e), w(08), w(2e), \ + w(a1), w(66), w(28), w(d9), w(24), w(b2), w(76), w(5b), w(a2), w(49), \ + w(6d), w(8b), w(d1), w(25), w(72), w(f8), w(f6), w(64), w(86), w(68), \ + w(98), w(16), w(d4), w(a4), w(5c), w(cc), w(5d), w(65), w(b6), w(92), \ + w(6c), w(70), w(48), w(50), w(fd), w(ed), w(b9), w(da), w(5e), w(15), \ + w(46), w(57), w(a7), w(8d), w(9d), w(84), w(90), w(d8), w(ab), w(00), \ + w(8c), w(bc), w(d3), w(0a), w(f7), w(e4), w(58), w(05), w(b8), w(b3), \ + w(45), w(06), w(d0), w(2c), w(1e), w(8f), w(ca), w(3f), w(0f), w(02), \ + w(c1), w(af), w(bd), w(03), w(01), w(13), w(8a), w(6b), w(3a), w(91), \ + w(11), w(41), w(4f), w(67), w(dc), w(ea), w(97), w(f2), w(cf), w(ce), \ + w(f0), w(b4), w(e6), w(73), w(96), w(ac), w(74), w(22), w(e7), w(ad), \ + w(35), w(85), w(e2), w(f9), w(37), w(e8), w(1c), w(75), w(df), w(6e), \ + w(47), w(f1), w(1a), w(71), w(1d), w(29), w(c5), w(89), w(6f), w(b7), \ + w(62), w(0e), w(aa), w(18), w(be), w(1b), w(fc), w(56), w(3e), w(4b), \ + w(c6), w(d2), w(79), w(20), w(9a), w(db), w(c0), w(fe), w(78), w(cd), \ + w(5a), w(f4), w(1f), w(dd), w(a8), w(33), w(88), w(07), w(c7), w(31), \ + w(b1), w(12), w(10), w(59), w(27), w(80), w(ec), w(5f), w(60), w(51), \ + w(7f), w(a9), w(19), w(b5), w(4a), w(0d), w(2d), w(e5), w(7a), w(9f), \ + w(93), w(c9), w(9c), w(ef), w(a0), w(e0), w(3b), w(4d), w(ae), w(2a), \ + w(f5), w(b0), w(c8), w(eb), w(bb), w(3c), w(83), w(53), w(99), w(61), \ + w(17), w(2b), w(04), w(7e), w(ba), w(77), w(d6), w(26), w(e1), w(69), \ + w(14), w(63), w(55), w(21), w(0c), w(7d), + +/* generate the required tables in the desired endian format */ + +#undef r +#define r(p, q, r, s) w0(q) +const word rijndael_dec_fl_tab[4][256] = {{f_table}, +#undef r +#define r(p, q, r, s) w1(q) + {f_table}, +#undef r +#define r(p, q, r, s) w2(q) + {f_table}, +#undef r +#define r(p, q, r, s) w3(q) + {f_table}}; + +#undef w +#define w w0 +const word rijndael_dec_il_tab[4][256] = {{li_table}, +#undef w +#define w w1 + {li_table}, +#undef w +#define w w2 + {li_table}, +#undef w +#define w w3 + {li_table}}; + +#define m_table \ + r(00, 00, 00, 00), r(0b, 0d, 09, 0e), r(16, 1a, 12, 1c), \ + r(1d, 17, 1b, 12), r(2c, 34, 24, 38), r(27, 39, 2d, 36), \ + r(3a, 2e, 36, 24), r(31, 23, 3f, 2a), r(58, 68, 48, 70), \ + r(53, 65, 41, 7e), r(4e, 72, 5a, 6c), r(45, 7f, 53, 62), \ + r(74, 5c, 6c, 48), r(7f, 51, 65, 46), r(62, 46, 7e, 54), \ + r(69, 4b, 77, 5a), r(b0, d0, 90, e0), r(bb, dd, 99, ee), \ + r(a6, ca, 82, fc), r(ad, c7, 8b, f2), r(9c, e4, b4, d8), \ + r(97, e9, bd, d6), r(8a, fe, a6, c4), r(81, f3, af, ca), \ + r(e8, b8, d8, 90), r(e3, b5, d1, 9e), r(fe, a2, ca, 8c), \ + r(f5, af, c3, 82), r(c4, 8c, fc, a8), r(cf, 81, f5, a6), \ + r(d2, 96, ee, b4), r(d9, 9b, e7, ba), r(7b, bb, 3b, db), \ + r(70, b6, 32, d5), r(6d, a1, 29, c7), r(66, ac, 20, c9), \ + r(57, 8f, 1f, e3), r(5c, 82, 16, ed), r(41, 95, 0d, ff), \ + r(4a, 98, 04, f1), r(23, d3, 73, ab), r(28, de, 7a, a5), \ + r(35, c9, 61, b7), r(3e, c4, 68, b9), r(0f, e7, 57, 93), \ + r(04, ea, 5e, 9d), r(19, fd, 45, 8f), r(12, f0, 4c, 81), \ + r(cb, 6b, ab, 3b), r(c0, 66, a2, 35), r(dd, 71, b9, 27), \ + r(d6, 7c, b0, 29), r(e7, 5f, 8f, 03), r(ec, 52, 86, 0d), \ + r(f1, 45, 9d, 1f), r(fa, 48, 94, 11), r(93, 03, e3, 4b), \ + r(98, 0e, ea, 45), r(85, 19, f1, 57), r(8e, 14, f8, 59), \ + r(bf, 37, c7, 73), r(b4, 3a, ce, 7d), r(a9, 2d, d5, 6f), \ + r(a2, 20, dc, 61), r(f6, 6d, 76, ad), r(fd, 60, 7f, a3), \ + r(e0, 77, 64, b1), r(eb, 7a, 6d, bf), r(da, 59, 52, 95), \ + r(d1, 54, 5b, 9b), r(cc, 43, 40, 89), r(c7, 4e, 49, 87), \ + r(ae, 05, 3e, dd), r(a5, 08, 37, d3), r(b8, 1f, 2c, c1), \ + r(b3, 12, 25, cf), r(82, 31, 1a, e5), r(89, 3c, 13, eb), \ + r(94, 2b, 08, f9), r(9f, 26, 01, f7), r(46, bd, e6, 4d), \ + r(4d, b0, ef, 43), r(50, a7, f4, 51), r(5b, aa, fd, 5f), \ + r(6a, 89, c2, 75), r(61, 84, cb, 7b), r(7c, 93, d0, 69), \ + r(77, 9e, d9, 67), r(1e, d5, ae, 3d), r(15, d8, a7, 33), \ + r(08, cf, bc, 21), r(03, c2, b5, 2f), r(32, e1, 8a, 05), \ + r(39, ec, 83, 0b), r(24, fb, 98, 19), r(2f, f6, 91, 17), \ + r(8d, d6, 4d, 76), r(86, db, 44, 78), r(9b, cc, 5f, 6a), \ + r(90, c1, 56, 64), r(a1, e2, 69, 4e), r(aa, ef, 60, 40), \ + r(b7, f8, 7b, 52), r(bc, f5, 72, 5c), r(d5, be, 05, 06), \ + r(de, b3, 0c, 08), r(c3, a4, 17, 1a), r(c8, a9, 1e, 14), \ + r(f9, 8a, 21, 3e), r(f2, 87, 28, 30), r(ef, 90, 33, 22), \ + r(e4, 9d, 3a, 2c), r(3d, 06, dd, 96), r(36, 0b, d4, 98), \ + r(2b, 1c, cf, 8a), r(20, 11, c6, 84), r(11, 32, f9, ae), \ + r(1a, 3f, f0, a0), r(07, 28, eb, b2), r(0c, 25, e2, bc), \ + r(65, 6e, 95, e6), r(6e, 63, 9c, e8), r(73, 74, 87, fa), \ + r(78, 79, 8e, f4), r(49, 5a, b1, de), r(42, 57, b8, d0), \ + r(5f, 40, a3, c2), r(54, 4d, aa, cc), r(f7, da, ec, 41), \ + r(fc, d7, e5, 4f), r(e1, c0, fe, 5d), r(ea, cd, f7, 53), \ + r(db, ee, c8, 79), r(d0, e3, c1, 77), r(cd, f4, da, 65), \ + r(c6, f9, d3, 6b), r(af, b2, a4, 31), r(a4, bf, ad, 3f), \ + r(b9, a8, b6, 2d), r(b2, a5, bf, 23), r(83, 86, 80, 09), \ + r(88, 8b, 89, 07), r(95, 9c, 92, 15), r(9e, 91, 9b, 1b), \ + r(47, 0a, 7c, a1), r(4c, 07, 75, af), r(51, 10, 6e, bd), \ + r(5a, 1d, 67, b3), r(6b, 3e, 58, 99), r(60, 33, 51, 97), \ + r(7d, 24, 4a, 85), r(76, 29, 43, 8b), r(1f, 62, 34, d1), \ + r(14, 6f, 3d, df), r(09, 78, 26, cd), r(02, 75, 2f, c3), \ + r(33, 56, 10, e9), r(38, 5b, 19, e7), r(25, 4c, 02, f5), \ + r(2e, 41, 0b, fb), r(8c, 61, d7, 9a), r(87, 6c, de, 94), \ + r(9a, 7b, c5, 86), r(91, 76, cc, 88), r(a0, 55, f3, a2), \ + r(ab, 58, fa, ac), r(b6, 4f, e1, be), r(bd, 42, e8, b0), \ + r(d4, 09, 9f, ea), r(df, 04, 96, e4), r(c2, 13, 8d, f6), \ + r(c9, 1e, 84, f8), r(f8, 3d, bb, d2), r(f3, 30, b2, dc), \ + r(ee, 27, a9, ce), r(e5, 2a, a0, c0), r(3c, b1, 47, 7a), \ + r(37, bc, 4e, 74), r(2a, ab, 55, 66), r(21, a6, 5c, 68), \ + r(10, 85, 63, 42), r(1b, 88, 6a, 4c), r(06, 9f, 71, 5e), \ + r(0d, 92, 78, 50), r(64, d9, 0f, 0a), r(6f, d4, 06, 04), \ + r(72, c3, 1d, 16), r(79, ce, 14, 18), r(48, ed, 2b, 32), \ + r(43, e0, 22, 3c), r(5e, f7, 39, 2e), r(55, fa, 30, 20), \ + r(01, b7, 9a, ec), r(0a, ba, 93, e2), r(17, ad, 88, f0), \ + r(1c, a0, 81, fe), r(2d, 83, be, d4), r(26, 8e, b7, da), \ + r(3b, 99, ac, c8), r(30, 94, a5, c6), r(59, df, d2, 9c), \ + r(52, d2, db, 92), r(4f, c5, c0, 80), r(44, c8, c9, 8e), \ + r(75, eb, f6, a4), r(7e, e6, ff, aa), r(63, f1, e4, b8), \ + r(68, fc, ed, b6), r(b1, 67, 0a, 0c), r(ba, 6a, 03, 02), \ + r(a7, 7d, 18, 10), r(ac, 70, 11, 1e), r(9d, 53, 2e, 34), \ + r(96, 5e, 27, 3a), r(8b, 49, 3c, 28), r(80, 44, 35, 26), \ + r(e9, 0f, 42, 7c), r(e2, 02, 4b, 72), r(ff, 15, 50, 60), \ + r(f4, 18, 59, 6e), r(c5, 3b, 66, 44), r(ce, 36, 6f, 4a), \ + r(d3, 21, 74, 58), r(d8, 2c, 7d, 56), r(7a, 0c, a1, 37), \ + r(71, 01, a8, 39), r(6c, 16, b3, 2b), r(67, 1b, ba, 25), \ + r(56, 38, 85, 0f), r(5d, 35, 8c, 01), r(40, 22, 97, 13), \ + r(4b, 2f, 9e, 1d), r(22, 64, e9, 47), r(29, 69, e0, 49), \ + r(34, 7e, fb, 5b), r(3f, 73, f2, 55), r(0e, 50, cd, 7f), \ + r(05, 5d, c4, 71), r(18, 4a, df, 63), r(13, 47, d6, 6d), \ + r(ca, dc, 31, d7), r(c1, d1, 38, d9), r(dc, c6, 23, cb), \ + r(d7, cb, 2a, c5), r(e6, e8, 15, ef), r(ed, e5, 1c, e1), \ + r(f0, f2, 07, f3), r(fb, ff, 0e, fd), r(92, b4, 79, a7), \ + r(99, b9, 70, a9), r(84, ae, 6b, bb), r(8f, a3, 62, b5), \ + r(be, 80, 5d, 9f), r(b5, 8d, 54, 91), r(a8, 9a, 4f, 83), \ + r(a3, 97, 46, 8d) + +#undef r +#define r r0 + +const word rijndael_dec_im_tab[4][256] = {{m_table}, +#undef r +#define r r1 + {m_table}, +#undef r +#define r r2 + {m_table}, +#undef r +#define r r3 + {m_table}}; diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/input_small_enc.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/input_small_enc.c new file mode 100644 index 0000000..0f2c4a7 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/input_small_enc.c @@ -0,0 +1,2187 @@ + +unsigned char rijndael_dec_data[] = { + 96, 83, 127, 28, 212, 92, 146, 102, 38, 17, 193, 142, 95, 217, 184, + 105, 79, 112, 144, 112, 44, 202, 141, 48, 181, 177, 82, 92, 208, 250, + 216, 152, 41, 208, 7, 232, 238, 116, 134, 238, 230, 190, 239, 195, 235, + 80, 125, 51, 251, 39, 7, 100, 213, 190, 189, 81, 241, 49, 215, 254, + 253, 203, 13, 164, 175, 244, 25, 111, 226, 225, 176, 96, 58, 165, 32, + 243, 68, 205, 209, 242, 186, 229, 167, 155, 238, 105, 120, 173, 246, 72, + 29, 96, 71, 169, 83, 154, 226, 129, 236, 52, 243, 159, 61, 71, 20, + 119, 245, 196, 25, 203, 11, 10, 37, 163, 139, 180, 250, 191, 138, 99, + 78, 192, 73, 186, 22, 12, 119, 151, 185, 155, 195, 54, 73, 207, 108, + 170, 112, 237, 100, 165, 219, 223, 23, 179, 124, 172, 52, 22, 143, 57, + 132, 60, 176, 218, 11, 86, 89, 59, 254, 84, 180, 76, 120, 174, 17, + 214, 88, 48, 240, 12, 56, 93, 136, 156, 75, 176, 30, 43, 4, 107, + 30, 210, 26, 183, 235, 39, 35, 205, 139, 80, 249, 182, 15, 91, 210, + 234, 47, 67, 64, 234, 148, 108, 240, 242, 32, 11, 48, 199, 117, 31, + 149, 30, 97, 149, 241, 50, 177, 166, 127, 31, 135, 115, 240, 77, 198, + 88, 108, 246, 108, 148, 158, 89, 173, 233, 252, 95, 51, 42, 218, 54, + 28, 143, 203, 164, 74, 147, 55, 108, 225, 222, 87, 161, 243, 35, 179, + 130, 29, 70, 225, 178, 148, 152, 247, 167, 21, 245, 84, 139, 3, 228, + 221, 25, 53, 36, 121, 29, 204, 35, 1, 46, 26, 8, 237, 102, 231, + 252, 176, 88, 24, 110, 255, 163, 86, 64, 117, 68, 178, 73, 219, 201, + 24, 155, 76, 255, 253, 199, 165, 95, 246, 179, 15, 47, 203, 81, 92, + 231, 246, 247, 111, 58, 82, 222, 193, 24, 37, 164, 161, 8, 169, 172, + 223, 111, 186, 72, 160, 116, 242, 8, 192, 178, 224, 177, 228, 42, 102, + 206, 237, 52, 143, 16, 150, 143, 108, 3, 88, 81, 199, 49, 110, 220, + 5, 89, 244, 227, 27, 226, 101, 9, 238, 0, 206, 228, 254, 19, 189, + 240, 159, 29, 46, 2, 206, 184, 205, 228, 144, 241, 88, 78, 156, 23, + 44, 200, 99, 146, 179, 96, 1, 143, 87, 57, 39, 75, 174, 32, 190, + 125, 152, 183, 46, 39, 136, 88, 240, 110, 104, 70, 253, 29, 110, 113, + 235, 123, 56, 60, 243, 238, 246, 113, 11, 18, 246, 108, 95, 238, 177, + 43, 3, 112, 121, 161, 196, 204, 211, 171, 197, 41, 249, 71, 194, 153, + 82, 28, 10, 28, 12, 241, 212, 90, 124, 236, 171, 54, 35, 226, 152, + 246, 241, 74, 139, 133, 241, 76, 183, 197, 232, 250, 54, 202, 11, 10, + 203, 30, 169, 138, 110, 252, 62, 172, 6, 241, 81, 181, 87, 177, 128, + 221, 111, 133, 94, 251, 184, 54, 92, 242, 28, 112, 138, 116, 32, 164, + 158, 59, 51, 30, 155, 126, 196, 117, 233, 117, 92, 74, 4, 72, 19, + 237, 248, 142, 184, 175, 126, 203, 4, 210, 70, 40, 105, 16, 36, 42, + 118, 110, 4, 180, 208, 52, 232, 230, 107, 154, 233, 61, 176, 170, 32, + 59, 60, 47, 43, 70, 71, 3, 58, 24, 166, 22, 165, 154, 255, 166, + 12, 81, 63, 116, 146, 12, 5, 6, 133, 240, 110, 253, 209, 15, 71, + 179, 93, 203, 58, 138, 5, 90, 111, 140, 19, 186, 191, 68, 230, 121, + 95, 166, 219, 107, 233, 156, 18, 145, 239, 150, 234, 191, 91, 233, 114, + 5, 215, 85, 30, 66, 33, 152, 117, 128, 236, 189, 201, 203, 10, 184, + 198, 249, 61, 27, 144, 102, 246, 191, 54, 129, 86, 8, 197, 98, 231, + 234, 222, 164, 161, 40, 150, 253, 208, 82, 92, 225, 85, 206, 59, 1, + 170, 5, 255, 219, 89, 204, 122, 169, 78, 8, 5, 70, 75, 128, 80, + 176, 16, 214, 253, 176, 255, 191, 91, 89, 126, 155, 128, 195, 56, 150, + 101, 131, 255, 234, 241, 250, 61, 210, 85, 19, 21, 23, 122, 180, 34, + 100, 102, 166, 128, 21, 177, 11, 86, 110, 112, 179, 126, 36, 152, 196, + 62, 185, 186, 20, 91, 35, 85, 148, 168, 68, 145, 245, 170, 25, 190, + 237, 192, 125, 186, 182, 22, 188, 161, 122, 194, 21, 14, 102, 206, 60, + 129, 156, 173, 176, 37, 112, 129, 145, 177, 101, 206, 179, 35, 221, 107, + 228, 181, 212, 52, 253, 241, 145, 121, 128, 68, 118, 78, 66, 166, 78, + 176, 62, 217, 243, 193, 1, 254, 200, 35, 67, 226, 77, 55, 72, 6, + 144, 22, 85, 252, 209, 142, 65, 226, 158, 126, 168, 175, 179, 219, 116, + 235, 227, 42, 49, 126, 126, 215, 200, 126, 0, 39, 247, 161, 217, 26, + 228, 232, 113, 53, 151, 34, 223, 91, 242, 155, 156, 144, 229, 237, 127, + 227, 49, 239, 71, 102, 115, 74, 135, 103, 13, 3, 108, 101, 211, 36, + 59, 146, 143, 230, 44, 212, 145, 229, 53, 108, 175, 42, 131, 113, 123, + 30, 28, 149, 153, 117, 233, 76, 33, 148, 110, 19, 83, 125, 135, 44, + 202, 2, 155, 4, 240, 167, 7, 13, 115, 243, 216, 73, 248, 216, 82, + 230, 153, 48, 234, 157, 2, 130, 99, 147, 2, 244, 19, 125, 30, 39, + 148, 49, 134, 140, 240, 128, 230, 171, 24, 53, 245, 54, 72, 111, 230, + 192, 165, 199, 47, 186, 238, 121, 95, 220, 76, 229, 253, 157, 47, 34, + 47, 39, 77, 199, 203, 163, 148, 172, 56, 204, 96, 69, 235, 215, 96, + 92, 139, 92, 49, 73, 228, 70, 221, 18, 84, 167, 179, 201, 239, 71, + 64, 29, 247, 84, 56, 148, 36, 169, 144, 192, 60, 153, 171, 89, 125, + 48, 98, 201, 56, 230, 154, 146, 46, 184, 202, 3, 39, 113, 90, 249, + 163, 0, 188, 233, 10, 216, 17, 159, 42, 134, 57, 70, 24, 33, 63, + 8, 67, 85, 7, 133, 180, 127, 12, 234, 121, 183, 38, 131, 154, 241, + 236, 69, 67, 116, 54, 40, 225, 6, 220, 22, 251, 1, 100, 110, 165, + 114, 12, 170, 21, 190, 103, 242, 171, 216, 66, 30, 3, 214, 137, 231, + 172, 61, 8, 249, 198, 113, 181, 171, 13, 159, 21, 147, 67, 249, 94, + 189, 174, 15, 2, 62, 254, 29, 32, 209, 169, 184, 119, 220, 98, 248, + 163, 171, 22, 62, 125, 155, 100, 186, 97, 163, 245, 70, 216, 246, 1, + 11, 83, 41, 100, 64, 52, 99, 184, 151, 99, 46, 100, 168, 158, 210, + 150, 38, 231, 27, 255, 59, 141, 232, 127, 56, 39, 194, 104, 178, 151, + 15, 25, 219, 221, 81, 119, 178, 153, 94, 173, 64, 215, 128, 132, 163, + 159, 214, 254, 181, 194, 113, 144, 141, 103, 17, 108, 178, 59, 62, 205, + 117, 57, 183, 97, 18, 210, 87, 163, 231, 213, 233, 251, 94, 136, 217, + 168, 69, 48, 55, 68, 144, 203, 187, 51, 211, 151, 1, 194, 118, 181, + 154, 103, 186, 87, 43, 128, 215, 79, 101, 175, 60, 221, 158, 189, 94, + 194, 87, 73, 72, 162, 252, 26, 40, 142, 86, 228, 82, 255, 122, 192, + 167, 78, 177, 40, 249, 195, 100, 188, 31, 208, 124, 123, 31, 121, 244, + 4, 82, 3, 132, 15, 2, 29, 186, 76, 106, 109, 158, 114, 25, 212, + 74, 64, 255, 43, 40, 146, 159, 225, 39, 65, 85, 37, 60, 160, 123, + 116, 127, 134, 45, 177, 191, 49, 136, 211, 167, 218, 197, 15, 96, 45, + 55, 11, 237, 103, 118, 207, 0, 211, 25, 143, 19, 93, 114, 90, 105, + 253, 88, 140, 207, 56, 150, 0, 136, 159, 134, 63, 75, 142, 177, 0, + 107, 105, 78, 148, 214, 248, 70, 72, 125, 220, 156, 220, 222, 102, 202, + 176, 12, 58, 24, 39, 254, 170, 130, 77, 203, 193, 162, 56, 162, 57, + 76, 153, 170, 112, 94, 0, 220, 58, 58, 40, 173, 2, 193, 164, 168, + 127, 225, 238, 10, 194, 112, 213, 181, 126, 222, 152, 12, 57, 14, 146, + 137, 154, 203, 179, 45, 133, 70, 204, 66, 249, 32, 136, 145, 0, 221, + 224, 10, 1, 202, 139, 145, 247, 72, 254, 32, 169, 121, 167, 114, 198, + 244, 251, 243, 8, 114, 188, 178, 173, 25, 243, 122, 220, 45, 98, 7, + 168, 66, 58, 225, 217, 152, 81, 89, 39, 167, 146, 181, 138, 253, 196, + 145, 4, 72, 9, 14, 137, 155, 32, 217, 64, 4, 173, 220, 66, 114, + 21, 137, 118, 87, 163, 217, 204, 74, 236, 45, 170, 60, 141, 216, 234, + 182, 79, 74, 73, 94, 63, 89, 134, 88, 64, 32, 241, 9, 114, 253, + 164, 108, 31, 27, 42, 172, 7, 102, 213, 153, 83, 1, 152, 136, 224, + 248, 70, 112, 15, 211, 194, 216, 16, 255, 62, 83, 147, 173, 192, 239, + 55, 18, 223, 34, 152, 25, 163, 229, 4, 55, 219, 235, 187, 51, 116, + 12, 202, 198, 116, 188, 217, 91, 30, 11, 9, 13, 222, 120, 16, 93, + 99, 56, 129, 27, 133, 155, 120, 124, 112, 101, 42, 222, 122, 124, 59, + 84, 228, 202, 189, 13, 11, 10, 44, 220, 97, 67, 53, 246, 47, 230, + 131, 192, 1, 247, 137, 90, 77, 243, 131, 2, 130, 93, 183, 117, 102, + 69, 191, 27, 87, 103, 218, 157, 124, 17, 209, 135, 92, 78, 211, 141, + 25, 157, 53, 17, 249, 209, 206, 84, 19, 135, 253, 57, 36, 38, 112, + 184, 61, 76, 5, 203, 155, 7, 9, 179, 167, 38, 136, 189, 40, 19, + 183, 132, 81, 135, 167, 48, 74, 186, 249, 144, 193, 150, 73, 10, 192, + 191, 160, 74, 246, 12, 38, 107, 3, 66, 122, 184, 168, 218, 233, 78, + 216, 11, 57, 124, 104, 167, 0, 187, 2, 214, 136, 252, 60, 85, 128, + 128, 31, 70, 197, 211, 180, 216, 75, 212, 163, 168, 15, 174, 44, 194, + 231, 24, 181, 154, 161, 241, 95, 197, 227, 146, 195, 187, 69, 127, 154, + 145, 176, 180, 157, 13, 225, 107, 60, 29, 14, 223, 93, 214, 248, 107, + 65, 168, 251, 231, 46, 34, 203, 76, 20, 206, 125, 80, 25, 196, 60, + 213, 51, 238, 73, 17, 223, 151, 44, 60, 213, 164, 117, 188, 66, 195, + 170, 190, 117, 110, 21, 27, 78, 244, 124, 224, 142, 182, 10, 122, 135, + 121, 143, 240, 124, 6, 8, 22, 15, 3, 137, 12, 19, 11, 62, 212, + 205, 3, 202, 189, 157, 141, 68, 171, 142, 106, 69, 207, 8, 116, 194, + 6, 200, 96, 220, 248, 132, 46, 171, 57, 234, 31, 3, 112, 108, 15, + 139, 243, 34, 181, 250, 10, 86, 71, 162, 167, 85, 177, 57, 166, 80, + 41, 253, 128, 28, 127, 220, 149, 27, 29, 41, 201, 116, 211, 236, 34, + 200, 100, 157, 130, 223, 4, 162, 108, 181, 40, 255, 96, 18, 77, 36, + 217, 17, 225, 142, 124, 17, 91, 227, 13, 224, 213, 37, 115, 216, 93, + 149, 103, 105, 152, 190, 207, 54, 74, 226, 78, 133, 200, 252, 157, 152, + 39, 0, 173, 168, 132, 142, 17, 66, 241, 137, 12, 106, 42, 81, 239, + 78, 31, 131, 49, 243, 122, 178, 212, 137, 160, 104, 15, 145, 15, 116, + 103, 141, 94, 40, 127, 180, 174, 96, 222, 182, 226, 168, 174, 113, 228, + 156, 10, 18, 231, 122, 150, 178, 17, 200, 254, 96, 42, 243, 225, 58, + 235, 64, 159, 73, 162, 72, 46, 160, 33, 191, 99, 73, 130, 32, 135, + 84, 29, 100, 232, 75, 110, 180, 226, 11, 143, 127, 79, 246, 48, 148, + 229, 211, 204, 72, 18, 89, 22, 251, 202, 8, 10, 2, 130, 230, 219, + 71, 66, 142, 149, 47, 12, 117, 202, 224, 248, 35, 75, 242, 87, 125, + 230, 66, 38, 160, 62, 248, 213, 32, 166, 83, 220, 230, 0, 1, 147, + 51, 128, 110, 20, 16, 43, 142, 90, 0, 2, 104, 111, 232, 38, 29, + 181, 243, 130, 121, 105, 177, 168, 113, 126, 191, 59, 205, 27, 180, 49, + 128, 160, 225, 23, 173, 193, 155, 123, 12, 173, 72, 139, 63, 23, 232, + 138, 235, 39, 179, 158, 95, 103, 192, 13, 242, 11, 127, 239, 91, 13, + 119, 19, 185, 105, 87, 195, 168, 145, 15, 53, 146, 35, 227, 101, 234, + 198, 247, 19, 29, 134, 126, 211, 133, 78, 186, 127, 129, 181, 115, 133, + 62, 166, 133, 128, 225, 101, 98, 146, 175, 110, 113, 171, 117, 4, 130, + 190, 186, 216, 17, 201, 29, 62, 77, 74, 189, 50, 155, 188, 93, 237, + 26, 100, 225, 91, 120, 229, 163, 16, 210, 167, 138, 241, 147, 36, 56, + 12, 100, 33, 55, 232, 200, 118, 3, 222, 31, 72, 167, 91, 45, 133, + 62, 184, 64, 120, 116, 249, 12, 15, 243, 98, 145, 234, 253, 71, 194, + 61, 4, 102, 112, 35, 27, 75, 13, 1, 4, 128, 238, 170, 187, 80, + 147, 216, 165, 147, 248, 250, 241, 69, 106, 233, 227, 22, 153, 120, 138, + 113, 83, 104, 154, 50, 99, 153, 188, 69, 252, 171, 177, 49, 74, 134, + 219, 247, 255, 191, 202, 165, 239, 179, 147, 91, 215, 195, 157, 68, 21, + 180, 112, 187, 51, 66, 80, 205, 100, 35, 78, 59, 92, 175, 87, 224, + 170, 237, 223, 224, 83, 182, 199, 47, 95, 111, 42, 197, 22, 21, 143, + 123, 173, 69, 247, 31, 205, 69, 136, 137, 136, 241, 233, 67, 7, 225, + 112, 102, 92, 180, 211, 254, 29, 129, 29, 21, 188, 44, 95, 57, 122, + 17, 196, 213, 33, 56, 23, 88, 236, 185, 35, 17, 156, 165, 93, 108, + 157, 198, 5, 124, 225, 150, 156, 146, 116, 88, 116, 181, 207, 90, 85, + 145, 228, 231, 91, 116, 79, 6, 119, 6, 207, 190, 102, 72, 242, 2, + 253, 79, 92, 88, 189, 28, 57, 28, 101, 199, 134, 124, 215, 59, 37, + 222, 54, 194, 151, 252, 185, 74, 101, 193, 43, 186, 184, 255, 158, 129, + 183, 83, 176, 249, 134, 58, 15, 49, 213, 127, 162, 179, 56, 53, 4, + 114, 112, 29, 84, 246, 109, 46, 153, 97, 30, 208, 98, 234, 155, 104, + 158, 93, 9, 53, 175, 49, 54, 160, 238, 150, 117, 145, 202, 210, 37, + 15, 3, 100, 20, 116, 153, 90, 23, 2, 146, 58, 182, 199, 197, 122, + 89, 30, 152, 241, 105, 97, 115, 131, 111, 4, 235, 217, 213, 144, 218, + 217, 201, 141, 113, 21, 237, 254, 184, 181, 135, 177, 86, 215, 248, 169, + 55, 231, 229, 60, 133, 12, 194, 206, 112, 206, 175, 216, 131, 181, 41, + 154, 235, 76, 152, 58, 118, 111, 32, 220, 219, 253, 198, 18, 227, 71, + 129, 197, 227, 96, 155, 66, 0, 51, 132, 150, 208, 177, 188, 149, 100, + 236, 23, 49, 45, 236, 131, 225, 206, 77, 77, 94, 12, 244, 159, 85, + 247, 189, 109, 141, 217, 80, 115, 44, 171, 138, 68, 128, 147, 244, 213, + 43, 187, 135, 126, 156, 158, 199, 61, 180, 112, 130, 230, 146, 100, 106, + 56, 70, 71, 234, 3, 202, 1, 45, 20, 136, 149, 112, 178, 25, 110, + 160, 221, 57, 191, 78, 9, 250, 233, 4, 144, 28, 219, 200, 203, 227, + 218, 229, 108, 59, 221, 141, 0, 122, 121, 65, 156, 204, 19, 152, 215, + 64, 164, 15, 77, 26, 113, 82, 229, 23, 103, 204, 151, 118, 104, 171, + 115, 72, 191, 5, 159, 133, 83, 221, 228, 120, 127, 46, 233, 14, 27, + 216, 31, 63, 179, 224, 226, 121, 29, 62, 47, 199, 67, 60, 240, 85, + 175, 242, 113, 168, 160, 93, 147, 205, 103, 67, 110, 237, 143, 148, 65, + 209, 31, 100, 252, 166, 254, 170, 52, 203, 222, 75, 219, 77, 217, 202, + 18, 117, 253, 92, 29, 205, 115, 53, 255, 251, 150, 164, 72, 146, 6, + 101, 161, 127, 50, 73, 152, 194, 180, 11, 121, 11, 229, 147, 151, 143, + 226, 196, 238, 131, 141, 173, 153, 189, 114, 16, 82, 1, 70, 239, 22, + 85, 108, 113, 21, 231, 43, 6, 228, 54, 94, 200, 186, 190, 143, 117, + 156, 22, 30, 9, 64, 25, 8, 116, 27, 240, 24, 150, 146, 224, 73, + 97, 95, 183, 151, 185, 178, 16, 82, 243, 208, 160, 186, 246, 234, 223, + 35, 6, 166, 7, 105, 224, 246, 14, 208, 1, 70, 244, 221, 238, 235, + 86, 81, 136, 40, 99, 104, 89, 22, 194, 40, 36, 45, 126, 138, 174, + 22, 206, 228, 146, 114, 162, 4, 211, 213, 163, 224, 91, 3, 85, 140, + 140, 202, 204, 23, 194, 108, 166, 123, 1, 36, 191, 161, 38, 228, 65, + 249, 235, 26, 156, 83, 68, 199, 239, 109, 1, 203, 198, 25, 22, 128, + 165, 15, 125, 139, 190, 100, 184, 159, 16, 194, 244, 228, 18, 215, 103, + 169, 32, 208, 12, 104, 94, 71, 209, 193, 160, 161, 73, 38, 35, 49, + 202, 29, 193, 120, 100, 98, 219, 44, 27, 224, 222, 226, 105, 153, 17, + 252, 120, 143, 190, 173, 176, 89, 205, 149, 11, 99, 31, 107, 102, 187, + 100, 107, 200, 1, 130, 89, 75, 71, 196, 150, 89, 231, 28, 213, 173, + 229, 173, 104, 156, 123, 227, 163, 65, 230, 167, 67, 242, 143, 224, 224, + 161, 249, 205, 140, 149, 156, 2, 138, 177, 193, 136, 225, 177, 34, 246, + 27, 179, 108, 116, 169, 0, 183, 169, 12, 239, 230, 127, 169, 170, 144, + 151, 36, 111, 52, 132, 2, 15, 237, 209, 133, 254, 241, 184, 232, 116, + 11, 221, 210, 64, 96, 18, 30, 245, 95, 142, 84, 218, 92, 151, 20, + 155, 101, 201, 153, 82, 163, 43, 168, 152, 90, 224, 18, 112, 161, 123, + 115, 129, 136, 198, 50, 186, 239, 28, 80, 91, 20, 73, 6, 150, 187, + 56, 54, 200, 67, 26, 62, 0, 229, 42, 210, 107, 245, 83, 172, 233, + 195, 140, 31, 24, 205, 202, 128, 145, 242, 73, 113, 92, 176, 3, 146, + 170, 21, 106, 67, 53, 254, 192, 212, 194, 6, 52, 81, 163, 236, 63, + 95, 164, 91, 60, 20, 9, 201, 74, 143, 55, 110, 76, 61, 115, 177, + 84, 105, 191, 199, 248, 51, 89, 35, 91, 44, 199, 13, 254, 130, 142, + 136, 64, 111, 128, 229, 171, 208, 183, 242, 195, 251, 72, 168, 31, 76, + 89, 102, 122, 181, 57, 110, 17, 196, 31, 136, 185, 196, 118, 100, 188, + 100, 21, 239, 206, 77, 97, 238, 78, 215, 224, 113, 210, 122, 141, 190, + 103, 135, 12, 41, 206, 157, 154, 10, 167, 133, 183, 60, 230, 235, 109, + 33, 95, 121, 34, 206, 1, 149, 114, 4, 252, 42, 17, 93, 191, 144, + 133, 226, 101, 215, 124, 88, 163, 27, 29, 189, 35, 51, 182, 112, 242, + 94, 56, 196, 99, 242, 77, 95, 123, 219, 81, 71, 229, 138, 101, 8, + 77, 79, 2, 166, 195, 239, 148, 221, 188, 20, 170, 26, 215, 139, 42, + 171, 153, 219, 107, 191, 90, 185, 241, 37, 84, 41, 232, 27, 123, 36, + 86, 113, 255, 25, 245, 187, 21, 110, 13, 17, 43, 99, 91, 182, 243, + 239, 194, 150, 187, 111, 30, 83, 28, 111, 249, 159, 212, 187, 184, 177, + 12, 234, 107, 211, 32, 118, 132, 10, 145, 19, 150, 206, 230, 158, 80, + 101, 41, 67, 38, 79, 57, 164, 80, 147, 64, 207, 231, 229, 162, 5, + 185, 40, 164, 17, 84, 156, 1, 52, 181, 67, 63, 182, 25, 68, 55, + 167, 230, 125, 225, 234, 125, 79, 102, 35, 54, 2, 12, 145, 67, 6, + 252, 218, 231, 14, 58, 221, 248, 171, 23, 93, 14, 51, 76, 155, 97, + 239, 11, 95, 245, 154, 209, 127, 208, 19, 209, 158, 67, 164, 1, 123, + 230, 90, 236, 148, 77, 210, 240, 27, 154, 16, 146, 19, 107, 106, 141, + 94, 144, 28, 24, 130, 111, 164, 46, 108, 89, 171, 52, 192, 121, 188, + 166, 207, 164, 98, 57, 189, 54, 190, 18, 4, 120, 181, 18, 216, 162, + 19, 111, 254, 71, 171, 194, 79, 73, 122, 9, 115, 63, 61, 88, 117, + 234, 203, 250, 167, 102, 98, 101, 177, 5, 13, 228, 205, 115, 107, 219, + 215, 33, 150, 13, 242, 180, 71, 27, 0, 250, 228, 50, 129, 215, 93, + 174, 169, 167, 125, 14, 89, 130, 195, 127, 158, 250, 249, 142, 213, 5, + 1, 250, 31, 122, 171, 62, 142, 38, 84, 165, 95, 237, 144, 145, 189, + 193, 248, 121, 112, 22, 11, 26, 192, 90, 76, 117, 89, 160, 228, 152, + 24, 129, 235, 37, 24, 66, 68, 161, 126, 147, 44, 172, 137, 134, 203, + 162, 152, 255, 161, 135, 6, 31, 72, 69, 9, 228, 3, 80, 28, 50, + 240, 176, 66, 255, 231, 21, 233, 149, 55, 211, 15, 182, 116, 165, 211, + 190, 28, 69, 40, 3, 164, 172, 212, 150, 181, 213, 32, 174, 216, 8, + 243, 29, 152, 124, 7, 111, 140, 53, 157, 158, 233, 175, 60, 191, 179, + 131, 248, 252, 50, 171, 165, 5, 51, 69, 215, 168, 222, 57, 221, 164, + 56, 193, 114, 18, 89, 219, 222, 198, 163, 200, 233, 28, 51, 190, 25, + 206, 243, 63, 51, 44, 10, 57, 71, 252, 230, 161, 141, 79, 31, 30, + 150, 101, 168, 23, 70, 216, 216, 160, 241, 192, 106, 92, 194, 141, 81, + 100, 222, 165, 180, 27, 70, 201, 219, 31, 177, 189, 114, 30, 74, 6, + 184, 114, 208, 189, 246, 83, 107, 229, 153, 69, 66, 201, 253, 183, 5, + 134, 156, 200, 132, 187, 73, 175, 213, 178, 14, 66, 101, 13, 224, 49, + 205, 244, 124, 231, 18, 71, 94, 246, 29, 78, 201, 138, 60, 97, 54, + 156, 123, 144, 143, 6, 191, 113, 140, 251, 203, 125, 196, 135, 169, 197, + 34, 215, 77, 138, 218, 63, 56, 145, 74, 225, 15, 227, 112, 113, 160, + 165, 122, 85, 179, 97, 146, 5, 221, 133, 236, 170, 2, 236, 128, 19, + 252, 238, 120, 0, 192, 55, 5, 138, 161, 222, 148, 189, 130, 53, 250, + 36, 153, 248, 210, 197, 167, 236, 128, 191, 37, 251, 151, 163, 190, 155, + 38, 27, 164, 166, 238, 185, 11, 214, 212, 122, 206, 212, 255, 103, 255, + 69, 146, 54, 182, 52, 54, 169, 121, 244, 205, 244, 168, 96, 163, 220, + 75, 194, 10, 133, 204, 105, 10, 228, 139, 62, 39, 254, 131, 5, 243, + 54, 14, 158, 107, 118, 143, 81, 55, 251, 151, 226, 29, 54, 218, 99, + 187, 76, 178, 61, 206, 20, 170, 229, 190, 77, 215, 47, 104, 244, 87, + 101, 82, 50, 41, 255, 56, 6, 226, 22, 153, 19, 72, 227, 63, 224, + 79, 3, 130, 220, 135, 116, 39, 25, 98, 107, 50, 214, 183, 120, 215, + 26, 160, 247, 26, 190, 119, 146, 181, 147, 36, 15, 75, 109, 71, 72, + 44, 14, 9, 61, 201, 200, 222, 53, 246, 57, 69, 63, 108, 133, 140, + 150, 33, 233, 46, 84, 102, 150, 204, 129, 195, 97, 4, 69, 176, 166, + 182, 10, 237, 141, 33, 70, 200, 98, 101, 157, 9, 70, 227, 108, 195, + 241, 72, 105, 86, 67, 5, 242, 199, 149, 33, 43, 105, 206, 122, 20, + 13, 28, 158, 131, 47, 202, 70, 9, 92, 32, 10, 251, 103, 49, 185, + 35, 242, 168, 151, 234, 237, 212, 91, 81, 113, 133, 247, 204, 23, 4, + 9, 226, 14, 29, 117, 236, 101, 250, 46, 161, 149, 131, 98, 141, 228, + 72, 18, 164, 252, 56, 7, 160, 217, 183, 125, 121, 154, 169, 152, 211, + 114, 24, 190, 141, 135, 41, 173, 250, 50, 54, 197, 65, 67, 117, 246, + 235, 130, 142, 138, 62, 216, 51, 193, 247, 30, 164, 235, 209, 157, 138, + 4, 147, 6, 253, 187, 34, 124, 1, 143, 60, 95, 168, 72, 167, 72, + 72, 13, 142, 35, 185, 107, 29, 51, 189, 48, 141, 194, 33, 77, 118, + 17, 80, 88, 204, 147, 148, 143, 103, 246, 97, 180, 153, 160, 112, 81, + 196, 2, 222, 148, 126, 240, 27, 61, 128, 155, 184, 106, 89, 36, 136, + 230, 128, 84, 217, 130, 139, 104, 115, 225, 73, 77, 7, 49, 183, 4, + 250, 124, 196, 34, 183, 209, 17, 136, 92, 16, 94, 51, 78, 174, 185, + 117, 243, 69, 11, 214, 132, 72, 86, 212, 4, 193, 253, 125, 45, 148, + 97, 87, 6, 101, 195, 169, 86, 115, 218, 254, 40, 59, 255, 137, 135, + 183, 253, 117, 170, 29, 191, 138, 247, 117, 125, 234, 30, 40, 92, 8, + 180, 240, 136, 142, 111, 239, 66, 225, 196, 151, 93, 130, 126, 255, 195, + 34, 252, 17, 101, 179, 120, 76, 4, 227, 13, 12, 66, 205, 235, 177, + 29, 187, 25, 114, 68, 119, 114, 158, 213, 149, 210, 5, 104, 71, 181, + 126, 211, 32, 99, 60, 51, 75, 85, 138, 138, 68, 115, 81, 37, 17, + 101, 36, 117, 236, 182, 77, 98, 113, 198, 195, 73, 79, 215, 116, 248, + 45, 244, 60, 205, 35, 95, 228, 38, 180, 250, 246, 63, 211, 44, 197, + 162, 24, 195, 61, 136, 142, 91, 141, 62, 34, 139, 60, 142, 238, 67, + 148, 54, 132, 41, 115, 241, 219, 192, 121, 9, 45, 75, 183, 223, 213, + 165, 161, 219, 181, 161, 27, 36, 158, 163, 12, 12, 141, 83, 105, 157, + 118, 168, 244, 204, 32, 52, 131, 88, 246, 230, 121, 21, 58, 91, 217, + 138, 27, 251, 174, 150, 51, 240, 201, 30, 66, 19, 148, 185, 122, 53, + 15, 176, 144, 148, 3, 238, 59, 211, 155, 77, 83, 81, 245, 186, 169, + 217, 201, 103, 109, 137, 119, 146, 100, 18, 200, 185, 212, 202, 17, 88, + 146, 234, 49, 190, 19, 139, 43, 1, 48, 21, 64, 235, 89, 191, 74, + 89, 85, 16, 64, 203, 99, 152, 255, 61, 159, 36, 5, 199, 49, 94, + 229, 163, 192, 41, 165, 20, 203, 176, 149, 18, 152, 61, 216, 188, 203, + 180, 103, 202, 176, 177, 210, 255, 26, 254, 70, 43, 214, 95, 208, 73, + 148, 124, 19, 215, 68, 123, 10, 179, 88, 167, 224, 23, 246, 150, 201, + 51, 157, 139, 187, 103, 187, 198, 189, 204, 126, 74, 124, 23, 150, 108, + 116, 196, 130, 92, 0, 211, 151, 19, 58, 249, 50, 186, 54, 102, 164, + 122, 228, 71, 163, 163, 117, 78, 234, 197, 70, 96, 79, 4, 88, 242, + 219, 120, 28, 178, 165, 136, 178, 129, 125, 79, 140, 65, 62, 78, 237, + 104, 11, 45, 191, 163, 145, 174, 23, 34, 240, 43, 137, 102, 189, 140, + 137, 4, 222, 55, 6, 84, 194, 51, 164, 107, 234, 39, 216, 15, 12, + 44, 86, 170, 121, 46, 4, 220, 200, 42, 53, 11, 228, 110, 187, 116, + 182, 242, 42, 93, 109, 47, 109, 180, 155, 31, 99, 60, 107, 114, 82, + 196, 146, 45, 224, 90, 205, 34, 200, 42, 173, 113, 37, 26, 154, 74, + 18, 165, 45, 22, 141, 1, 244, 64, 159, 164, 162, 100, 6, 67, 145, + 199, 205, 254, 149, 56, 138, 15, 172, 205, 203, 191, 253, 126, 238, 167, + 210, 103, 33, 143, 85, 161, 150, 99, 12, 207, 238, 110, 157, 190, 52, + 249, 121, 139, 188, 0, 74, 92, 106, 101, 254, 190, 251, 213, 167, 78, + 36, 224, 24, 6, 195, 128, 24, 21, 35, 66, 223, 204, 84, 177, 109, + 226, 215, 79, 19, 236, 73, 74, 244, 146, 57, 228, 254, 223, 158, 42, + 83, 29, 181, 14, 147, 60, 4, 147, 107, 95, 220, 180, 130, 140, 28, + 118, 179, 39, 179, 250, 184, 27, 209, 199, 151, 154, 121, 105, 81, 215, + 143, 46, 91, 217, 94, 230, 250, 165, 21, 240, 234, 93, 0, 176, 20, + 127, 181, 36, 127, 49, 36, 79, 233, 229, 57, 241, 56, 119, 151, 222, + 239, 203, 217, 74, 164, 88, 47, 25, 43, 58, 136, 61, 233, 70, 133, + 181, 122, 250, 169, 249, 38, 36, 40, 182, 201, 40, 64, 218, 145, 63, + 209, 126, 248, 65, 23, 142, 147, 3, 241, 200, 87, 132, 93, 31, 22, + 90, 86, 244, 47, 235, 53, 187, 96, 165, 221, 185, 118, 134, 129, 94, + 64, 188, 132, 216, 198, 131, 74, 193, 32, 41, 194, 69, 201, 64, 31, + 6, 235, 95, 181, 207, 187, 60, 250, 24, 233, 127, 4, 5, 190, 242, + 168, 239, 185, 172, 78, 136, 121, 180, 191, 84, 54, 252, 83, 202, 111, + 32, 100, 213, 7, 178, 225, 71, 68, 244, 36, 141, 242, 199, 185, 71, + 55, 244, 166, 113, 41, 66, 177, 55, 251, 179, 251, 194, 2, 54, 20, + 100, 241, 82, 213, 236, 45, 196, 119, 134, 167, 163, 134, 61, 218, 207, + 200, 118, 143, 249, 165, 105, 78, 208, 213, 206, 72, 76, 123, 47, 31, + 9, 234, 18, 125, 95, 170, 199, 123, 139, 158, 244, 171, 6, 202, 240, + 214, 94, 46, 60, 109, 185, 175, 204, 176, 229, 110, 139, 249, 234, 3, + 202, 231, 25, 195, 150, 136, 186, 246, 72, 242, 133, 249, 229, 58, 112, + 28, 228, 121, 85, 115, 90, 95, 32, 141, 135, 217, 12, 187, 50, 229, + 66, 103, 204, 0, 93, 86, 245, 59, 173, 28, 71, 131, 135, 118, 125, + 113, 12, 13, 202, 242, 205, 255, 152, 243, 160, 243, 148, 10, 28, 106, + 56, 17, 93, 234, 204, 102, 53, 22, 48, 188, 15, 255, 14, 3, 117, + 190, 211, 116, 55, 77, 205, 171, 228, 120, 244, 1, 169, 51, 241, 150, + 206, 99, 20, 68, 119, 137, 180, 44, 113, 85, 242, 143, 148, 97, 149, + 75, 20, 228, 89, 226, 122, 102, 13, 195, 58, 111, 178, 82, 226, 144, + 82, 237, 27, 94, 244, 29, 102, 32, 162, 80, 228, 66, 203, 107, 211, + 171, 4, 56, 62, 184, 63, 137, 5, 179, 231, 185, 172, 102, 190, 42, + 80, 164, 123, 68, 20, 36, 135, 97, 102, 156, 133, 165, 202, 240, 84, + 168, 30, 95, 57, 3, 182, 224, 10, 84, 60, 88, 191, 0, 126, 190, + 240, 202, 141, 89, 238, 212, 101, 213, 129, 15, 245, 94, 24, 49, 72, + 59, 237, 121, 241, 199, 28, 106, 113, 237, 82, 144, 150, 112, 79, 90, + 255, 166, 230, 71, 132, 24, 6, 82, 143, 150, 194, 236, 253, 46, 158, + 143, 5, 31, 243, 156, 4, 19, 89, 81, 94, 94, 39, 9, 199, 6, + 44, 35, 4, 143, 18, 62, 27, 165, 177, 162, 53, 121, 146, 74, 181, + 252, 27, 207, 17, 102, 196, 172, 75, 4, 17, 215, 20, 96, 9, 42, + 199, 99, 206, 94, 78, 121, 37, 11, 152, 125, 249, 107, 153, 180, 85, + 155, 220, 68, 223, 87, 204, 175, 117, 147, 217, 71, 6, 190, 132, 99, + 227, 5, 180, 168, 249, 126, 202, 102, 42, 26, 175, 198, 185, 211, 206, + 154, 60, 24, 183, 24, 203, 46, 21, 176, 194, 116, 116, 210, 162, 214, + 215, 79, 87, 159, 16, 55, 12, 248, 51, 17, 79, 183, 145, 23, 209, + 58, 225, 84, 21, 237, 102, 250, 93, 222, 87, 87, 203, 4, 138, 196, + 6, 28, 143, 45, 68, 77, 211, 180, 47, 198, 5, 170, 166, 221, 107, + 202, 67, 220, 178, 156, 39, 2, 87, 147, 234, 85, 199, 97, 10, 151, + 240, 121, 229, 132, 230, 249, 244, 57, 77, 29, 123, 149, 121, 81, 245, + 37, 106, 157, 39, 185, 31, 175, 102, 187, 37, 149, 27, 215, 151, 155, + 94, 160, 180, 59, 95, 200, 149, 42, 178, 85, 171, 41, 31, 20, 16, + 199, 14, 202, 230, 42, 59, 83, 239, 155, 65, 63, 237, 89, 133, 62, + 23, 112, 236, 226, 34, 250, 134, 14, 234, 2, 212, 41, 135, 189, 114, + 60, 147, 49, 19, 193, 169, 157, 41, 62, 36, 42, 2, 172, 237, 250, + 86, 252, 199, 80, 194, 195, 182, 136, 209, 90, 80, 9, 121, 164, 168, + 99, 235, 131, 129, 59, 26, 41, 124, 194, 110, 143, 183, 126, 91, 50, + 168, 211, 43, 177, 95, 196, 94, 206, 214, 173, 89, 152, 173, 39, 53, + 190, 186, 193, 75, 23, 181, 65, 153, 57, 142, 215, 155, 147, 241, 110, + 230, 102, 176, 152, 227, 83, 87, 110, 243, 143, 254, 127, 254, 117, 117, + 173, 106, 80, 127, 231, 39, 220, 178, 44, 95, 30, 60, 222, 212, 72, + 169, 84, 194, 40, 164, 156, 145, 182, 127, 51, 64, 108, 144, 124, 136, + 238, 4, 113, 14, 68, 106, 158, 20, 231, 109, 99, 70, 214, 68, 29, + 240, 154, 95, 206, 188, 136, 180, 41, 220, 228, 198, 82, 51, 118, 65, + 20, 198, 187, 22, 8, 134, 252, 86, 227, 110, 105, 198, 242, 48, 8, + 192, 165, 80, 210, 1, 175, 188, 99, 252, 178, 7, 70, 27, 249, 175, + 145, 131, 228, 86, 229, 81, 93, 203, 194, 226, 110, 250, 134, 235, 195, + 170, 107, 131, 185, 81, 99, 168, 124, 215, 108, 40, 198, 193, 117, 88, + 136, 134, 114, 145, 239, 9, 0, 184, 106, 111, 63, 6, 92, 30, 3, + 116, 7, 232, 182, 184, 60, 32, 161, 183, 167, 163, 185, 114, 43, 77, + 134, 29, 164, 135, 3, 155, 255, 83, 254, 203, 1, 243, 167, 236, 162, + 77, 140, 250, 224, 25, 246, 81, 147, 207, 0, 127, 115, 127, 151, 191, + 179, 128, 77, 142, 203, 171, 153, 47, 244, 165, 235, 20, 64, 36, 99, + 201, 190, 83, 244, 125, 112, 49, 26, 95, 125, 254, 140, 85, 142, 112, + 170, 225, 4, 126, 243, 224, 180, 137, 152, 102, 9, 92, 67, 247, 20, + 189, 58, 88, 74, 183, 201, 43, 1, 2, 123, 228, 211, 79, 91, 20, + 64, 111, 238, 60, 76, 207, 91, 90, 130, 169, 238, 254, 208, 125, 140, + 7, 94, 63, 18, 46, 124, 16, 253, 228, 238, 179, 99, 129, 40, 89, + 12, 40, 42, 94, 237, 111, 112, 22, 162, 64, 25, 89, 102, 56, 25, + 245, 128, 221, 86, 146, 138, 242, 67, 166, 114, 204, 38, 89, 77, 127, + 64, 36, 183, 161, 254, 185, 76, 91, 10, 28, 146, 154, 254, 118, 200, + 206, 95, 6, 182, 35, 178, 179, 114, 87, 60, 208, 88, 180, 161, 171, + 39, 156, 131, 2, 83, 124, 11, 223, 57, 190, 18, 79, 245, 198, 11, + 55, 131, 197, 28, 74, 32, 223, 144, 231, 227, 25, 237, 243, 145, 64, + 183, 62, 163, 33, 93, 155, 82, 228, 206, 69, 77, 101, 8, 240, 3, + 135, 0, 181, 153, 174, 82, 29, 129, 40, 83, 235, 83, 98, 105, 235, + 210, 121, 239, 78, 240, 217, 144, 230, 225, 3, 157, 14, 118, 64, 228, + 29, 110, 230, 247, 153, 117, 3, 81, 24, 23, 169, 2, 247, 238, 144, + 137, 241, 140, 192, 185, 165, 13, 122, 48, 180, 254, 54, 128, 134, 247, + 87, 42, 219, 166, 7, 248, 91, 39, 226, 245, 44, 152, 30, 71, 125, + 129, 102, 72, 16, 66, 119, 15, 189, 250, 70, 112, 168, 7, 5, 181, + 15, 114, 73, 112, 16, 184, 65, 192, 54, 51, 31, 202, 38, 11, 170, + 149, 37, 107, 44, 241, 30, 35, 23, 176, 99, 82, 230, 60, 206, 39, + 249, 227, 114, 152, 133, 233, 60, 188, 79, 52, 241, 191, 208, 160, 213, + 159, 219, 188, 222, 47, 235, 187, 9, 186, 112, 78, 101, 229, 115, 152, + 216, 196, 88, 228, 189, 226, 214, 40, 163, 155, 193, 238, 224, 72, 64, + 199, 4, 182, 248, 143, 219, 170, 227, 55, 215, 135, 92, 117, 56, 225, + 220, 129, 74, 226, 55, 132, 73, 213, 81, 93, 107, 49, 29, 155, 62, + 141, 48, 190, 242, 221, 95, 61, 179, 165, 213, 49, 125, 245, 106, 35, + 24, 57, 103, 140, 79, 172, 38, 29, 170, 145, 151, 204, 114, 161, 117, + 2, 199, 145, 210, 184, 71, 80, 251, 182, 67, 220, 3, 2, 210, 28, + 17, 104, 68, 150, 255, 174, 34, 206, 245, 97, 173, 8, 92, 160, 144, + 149, 54, 57, 114, 145, 215, 115, 186, 145, 165, 186, 207, 107, 14, 255, + 88, 145, 225, 110, 190, 78, 93, 147, 225, 247, 122, 52, 135, 147, 89, + 3, 10, 119, 43, 154, 29, 186, 68, 50, 125, 152, 205, 242, 113, 106, + 80, 68, 21, 45, 147, 212, 5, 1, 27, 39, 51, 221, 25, 38, 102, + 67, 194, 250, 121, 51, 66, 76, 155, 205, 199, 54, 177, 202, 0, 249, + 225, 231, 179, 69, 52, 22, 87, 77, 193, 35, 88, 3, 238, 62, 12, + 159, 221, 203, 230, 122, 92, 71, 26, 218, 41, 218, 75, 21, 201, 166, + 224, 173, 110, 185, 97, 161, 227, 9, 43, 108, 162, 62, 228, 201, 32, + 178, 191, 115, 35, 118, 59, 165, 223, 135, 132, 230, 110, 213, 96, 68, + 190, 237, 213, 146, 85, 179, 242, 155, 122, 217, 7, 105, 70, 123, 10, + 5, 122, 153, 202, 218, 195, 207, 73, 175, 161, 31, 200, 47, 237, 64, + 34, 227, 34, 66, 58, 29, 28, 166, 242, 128, 33, 79, 32, 125, 60, + 207, 222, 195, 180, 137, 78, 177, 132, 249, 147, 38, 64, 247, 181, 81, + 96, 155, 167, 113, 95, 197, 30, 83, 18, 128, 93, 131, 242, 197, 50, + 146, 106, 143, 56, 216, 80, 80, 159, 164, 154, 220, 248, 193, 58, 253, + 63, 219, 91, 140, 170, 71, 152, 8, 69, 37, 138, 179, 223, 54, 98, + 229, 181, 107, 50, 174, 6, 20, 69, 101, 50, 57, 102, 61, 123, 218, + 226, 77, 25, 129, 188, 103, 22, 81, 66, 232, 19, 88, 103, 184, 87, + 252, 109, 31, 242, 40, 37, 238, 237, 20, 232, 170, 115, 36, 83, 127, + 65, 208, 85, 56, 192, 120, 116, 153, 200, 116, 108, 243, 110, 8, 9, + 162, 206, 172, 25, 0, 103, 79, 239, 8, 184, 142, 87, 86, 95, 139, + 223, 180, 6, 205, 39, 76, 25, 62, 32, 244, 171, 152, 146, 48, 224, + 20, 23, 219, 250, 115, 159, 131, 14, 91, 5, 27, 26, 60, 239, 5, + 41, 159, 226, 103, 177, 43, 224, 51, 123, 129, 148, 18, 241, 66, 192, + 199, 151, 94, 207, 238, 120, 34, 234, 75, 193, 65, 66, 243, 125, 21, + 57, 113, 143, 44, 49, 153, 168, 129, 102, 21, 17, 101, 182, 217, 216, + 17, 7, 70, 99, 194, 34, 47, 49, 241, 25, 242, 163, 251, 28, 172, + 167, 4, 96, 213, 236, 60, 223, 52, 150, 216, 168, 157, 5, 56, 126, + 50, 228, 130, 166, 54, 196, 85, 86, 162, 154, 82, 84, 34, 228, 235, + 157, 230, 47, 77, 151, 127, 226, 82, 145, 205, 201, 40, 49, 178, 228, + 77, 132, 208, 93, 4, 2, 73, 46, 69, 188, 60, 130, 217, 1, 97, + 177, 240, 18, 26, 141, 97, 5, 170, 82, 56, 218, 83, 3, 29, 228, + 13, 179, 232, 154, 50, 152, 40, 58, 0, 202, 195, 36, 91, 104, 37, + 10, 89, 0, 250, 146, 45, 248, 68, 37, 180, 129, 46, 138, 43, 98, + 40, 122, 174, 147, 85, 94, 255, 76, 129, 245, 135, 198, 206, 144, 189, + 190, 207, 253, 191, 104, 163, 141, 116, 1, 192, 200, 193, 205, 196, 151, + 231, 254, 190, 17, 172, 254, 196, 243, 72, 234, 236, 92, 108, 153, 184, + 39, 201, 109, 233, 38, 178, 163, 46, 150, 153, 170, 238, 84, 196, 155, + 171, 31, 3, 186, 55, 87, 100, 179, 61, 163, 119, 82, 75, 107, 173, + 8, 145, 135, 226, 243, 8, 38, 102, 123, 120, 169, 215, 177, 132, 111, + 26, 242, 205, 150, 143, 197, 152, 137, 193, 174, 171, 234, 183, 221, 189, + 40, 212, 191, 137, 47, 153, 85, 76, 59, 255, 16, 51, 186, 105, 224, + 14, 73, 41, 84, 42, 12, 186, 198, 133, 82, 8, 161, 173, 130, 25, + 26, 22, 152, 132, 221, 182, 68, 126, 160, 248, 183, 112, 129, 83, 181, + 55, 17, 145, 18, 220, 143, 17, 49, 18, 15, 191, 104, 40, 67, 139, + 127, 106, 56, 65, 4, 120, 100, 5, 88, 44, 82, 240, 138, 64, 42, + 158, 24, 130, 133, 237, 235, 112, 115, 164, 249, 247, 233, 173, 116, 245, + 23, 37, 216, 180, 118, 183, 58, 246, 254, 103, 93, 55, 36, 213, 76, + 134, 122, 116, 164, 15, 11, 115, 168, 185, 226, 79, 250, 236, 172, 24, + 226, 48, 150, 67, 128, 63, 211, 235, 219, 120, 216, 18, 31, 82, 136, + 105, 151, 118, 193, 43, 33, 155, 55, 8, 17, 3, 211, 110, 115, 27, + 122, 3, 195, 97, 1, 227, 22, 124, 213, 59, 89, 13, 253, 221, 207, + 229, 25, 72, 200, 144, 209, 147, 185, 68, 132, 104, 7, 34, 237, 45, + 2, 17, 209, 87, 170, 227, 60, 230, 53, 186, 59, 39, 254, 57, 191, + 201, 59, 202, 119, 144, 163, 255, 78, 199, 9, 59, 129, 64, 232, 31, + 20, 110, 63, 172, 85, 239, 97, 216, 252, 158, 76, 64, 55, 133, 43, + 101, 22, 4, 27, 134, 210, 9, 120, 44, 255, 105, 142, 83, 6, 238, + 61, 226, 118, 111, 217, 234, 153, 48, 9, 193, 133, 172, 20, 121, 210, + 40, 243, 49, 13, 184, 152, 126, 248, 100, 37, 187, 216, 15, 250, 86, + 178, 24, 30, 174, 216, 151, 139, 27, 166, 190, 200, 228, 25, 152, 212, + 70, 7, 45, 141, 54, 143, 106, 206, 49, 170, 195, 61, 24, 81, 20, + 116, 147, 95, 49, 245, 179, 223, 237, 184, 110, 49, 158, 190, 211, 132, + 30, 22, 195, 234, 167, 143, 4, 26, 9, 215, 48, 100, 53, 221, 177, + 172, 132, 184, 229, 165, 207, 213, 192, 26, 58, 211, 227, 65, 148, 198, + 5, 248, 169, 32, 121, 24, 164, 193, 137, 218, 218, 105, 42, 136, 146, + 91, 72, 238, 231, 24, 17, 108, 194, 206, 5, 180, 101, 199, 161, 172, + 130, 78, 110, 255, 62, 158, 111, 204, 223, 33, 183, 43, 10, 93, 253, + 249, 193, 149, 89, 21, 51, 198, 186, 91, 142, 121, 157, 35, 254, 21, + 55, 2, 7, 119, 32, 175, 107, 199, 86, 174, 37, 144, 192, 13, 234, + 244, 152, 150, 77, 69, 91, 174, 141, 211, 71, 85, 190, 231, 124, 80, + 80, 137, 195, 5, 196, 21, 239, 110, 92, 99, 158, 247, 229, 178, 99, + 156, 222, 135, 119, 197, 242, 98, 58, 0, 134, 97, 197, 30, 113, 164, + 183, 9, 1, 97, 166, 94, 117, 183, 103, 45, 147, 215, 137, 8, 64, + 9, 149, 66, 130, 166, 94, 72, 48, 181, 156, 233, 167, 116, 59, 10, + 117, 203, 53, 110, 133, 3, 97, 84, 60, 179, 90, 47, 45, 78, 41, + 89, 191, 234, 81, 129, 69, 179, 76, 221, 176, 171, 58, 158, 151, 251, + 79, 189, 124, 159, 40, 189, 229, 126, 168, 24, 141, 209, 215, 105, 170, + 166, 181, 113, 36, 4, 172, 90, 123, 232, 154, 150, 224, 87, 249, 134, + 136, 14, 28, 23, 67, 78, 187, 209, 55, 157, 95, 36, 136, 83, 103, + 54, 236, 62, 81, 66, 44, 85, 120, 219, 178, 62, 126, 203, 193, 229, + 146, 25, 187, 254, 141, 147, 185, 158, 103, 216, 216, 38, 34, 245, 43, + 169, 200, 129, 130, 7, 239, 207, 155, 250, 89, 209, 238, 20, 74, 133, + 100, 67, 149, 41, 187, 72, 9, 135, 165, 140, 14, 90, 51, 241, 216, + 7, 176, 238, 254, 84, 53, 231, 87, 12, 51, 222, 54, 70, 163, 101, + 130, 63, 37, 120, 180, 219, 161, 69, 213, 233, 130, 199, 124, 2, 36, + 224, 140, 95, 201, 23, 72, 219, 222, 181, 237, 134, 11, 103, 94, 246, + 251, 215, 218, 228, 90, 36, 54, 237, 49, 204, 13, 194, 221, 18, 186, + 35, 144, 179, 2, 98, 90, 110, 165, 66, 38, 152, 206, 0, 121, 90, + 25, 94, 145, 133, 58, 143, 138, 175, 80, 233, 110, 78, 84, 0, 207, + 87, 78, 27, 243, 160, 231, 241, 83, 173, 163, 191, 205, 184, 216, 232, + 36, 194, 52, 5, 72, 249, 42, 103, 254, 213, 41, 159, 209, 56, 222, + 40, 224, 177, 195, 214, 11, 84, 221, 245, 137, 131, 23, 220, 251, 167, + 17, 34, 214, 41, 102, 226, 223, 79, 53, 119, 84, 17, 219, 19, 80, + 90, 132, 19, 176, 73, 145, 38, 28, 198, 176, 141, 92, 242, 69, 174, + 63, 244, 44, 152, 102, 120, 151, 167, 115, 67, 110, 119, 159, 56, 63, + 29, 70, 253, 118, 119, 220, 181, 71, 193, 167, 77, 178, 236, 187, 193, + 236, 147, 231, 209, 56, 168, 202, 7, 198, 208, 17, 20, 31, 42, 70, + 237, 148, 162, 161, 128, 135, 88, 37, 219, 56, 83, 248, 116, 20, 44, + 17, 231, 156, 187, 251, 237, 165, 123, 165, 181, 166, 212, 99, 132, 26, + 122, 240, 223, 130, 235, 248, 239, 11, 161, 32, 109, 210, 97, 173, 12, + 251, 94, 118, 7, 107, 206, 105, 158, 16, 4, 245, 159, 67, 150, 226, + 53, 42, 241, 249, 146, 107, 111, 75, 147, 136, 141, 97, 49, 101, 233, + 168, 197, 72, 95, 138, 162, 103, 154, 162, 192, 78, 41, 102, 52, 207, + 165, 48, 93, 41, 104, 136, 91, 169, 167, 51, 217, 197, 25, 238, 3, + 4, 35, 64, 146, 153, 32, 107, 66, 225, 249, 148, 225, 130, 197, 194, + 34, 100, 235, 200, 204, 39, 230, 37, 103, 219, 139, 8, 232, 63, 95, + 154, 76, 195, 226, 187, 206, 116, 21, 40, 98, 177, 244, 9, 114, 148, + 22, 185, 243, 93, 8, 84, 137, 114, 217, 240, 69, 185, 123, 1, 225, + 160, 221, 183, 81, 159, 31, 66, 221, 201, 197, 113, 137, 181, 249, 211, + 211, 226, 62, 12, 116, 111, 130, 197, 99, 85, 29, 191, 94, 14, 166, + 137, 147, 14, 133, 58, 230, 148, 144, 87, 48, 117, 252, 64, 114, 18, + 185, 63, 164, 159, 26, 79, 188, 242, 126, 223, 213, 245, 195, 144, 19, + 68, 175, 73, 15, 90, 45, 245, 111, 212, 15, 108, 108, 199, 180, 231, + 92, 251, 69, 251, 100, 179, 160, 125, 250, 42, 79, 118, 101, 195, 108, + 15, 243, 124, 76, 248, 137, 80, 49, 16, 233, 89, 247, 188, 102, 212, + 82, 111, 184, 67, 70, 110, 79, 241, 15, 157, 225, 66, 87, 81, 35, + 200, 210, 21, 243, 196, 86, 48, 46, 152, 150, 236, 76, 45, 178, 131, + 90, 85, 147, 107, 25, 194, 182, 106, 191, 161, 71, 94, 211, 172, 93, + 128, 17, 188, 240, 127, 4, 18, 124, 199, 122, 163, 140, 228, 91, 163, + 59, 197, 191, 231, 162, 77, 248, 24, 168, 119, 182, 169, 140, 55, 207, + 105, 70, 81, 32, 79, 212, 1, 59, 11, 55, 145, 61, 90, 134, 202, + 49, 105, 117, 158, 91, 86, 139, 55, 90, 171, 167, 237, 141, 1, 184, + 49, 63, 7, 226, 53, 153, 200, 188, 224, 234, 104, 101, 118, 238, 93, + 34, 252, 120, 251, 177, 103, 213, 173, 184, 231, 225, 111, 186, 210, 40, + 111, 65, 4, 60, 124, 221, 67, 201, 210, 65, 90, 74, 36, 39, 88, + 233, 64, 172, 179, 18, 59, 182, 82, 152, 192, 154, 220, 209, 184, 218, + 210, 172, 250, 155, 199, 175, 246, 218, 45, 211, 204, 131, 204, 73, 107, + 246, 52, 133, 102, 103, 135, 5, 46, 175, 63, 204, 92, 108, 126, 126, + 194, 208, 178, 166, 198, 191, 240, 128, 5, 203, 189, 102, 148, 65, 29, + 146, 2, 24, 21, 201, 147, 145, 248, 85, 77, 63, 245, 176, 199, 198, + 237, 34, 101, 159, 144, 166, 29, 102, 175, 121, 78, 75, 196, 204, 80, + 156, 236, 198, 232, 117, 112, 135, 61, 63, 63, 82, 2, 65, 139, 70, + 69, 78, 64, 48, 154, 15, 250, 79, 190, 251, 94, 205, 252, 236, 241, + 2, 171, 232, 118, 128, 71, 18, 55, 49, 13, 27, 36, 149, 220, 149, + 150, 55, 200, 192, 151, 47, 218, 134, 205, 93, 7, 206, 44, 229, 208, + 62, 208, 55, 55, 239, 63, 45, 154, 171, 70, 223, 144, 78, 251, 5, + 138, 224, 21, 184, 87, 55, 69, 224, 231, 37, 65, 87, 114, 78, 216, + 41, 49, 143, 233, 182, 214, 84, 20, 20, 156, 17, 12, 173, 172, 80, + 151, 37, 28, 191, 69, 146, 102, 65, 15, 152, 143, 198, 45, 204, 4, + 140, 90, 149, 45, 157, 190, 119, 196, 121, 199, 176, 122, 198, 141, 161, + 31, 24, 149, 96, 231, 70, 122, 160, 19, 100, 75, 112, 141, 18, 175, + 109, 98, 19, 110, 237, 1, 5, 171, 153, 19, 251, 61, 180, 249, 9, + 187, 196, 248, 127, 13, 21, 244, 224, 42, 97, 40, 236, 190, 18, 123, + 133, 26, 235, 9, 150, 90, 21, 189, 189, 101, 226, 190, 82, 18, 45, + 3, 172, 187, 72, 74, 244, 211, 76, 2, 70, 168, 41, 195, 165, 178, + 139, 5, 155, 100, 199, 0, 227, 72, 247, 186, 33, 169, 34, 104, 196, + 3, 253, 202, 19, 140, 100, 122, 144, 125, 201, 202, 194, 245, 180, 27, + 10, 207, 180, 31, 25, 152, 243, 143, 51, 90, 33, 74, 147, 127, 66, + 47, 10, 65, 99, 71, 243, 241, 221, 219, 32, 213, 98, 67, 119, 130, + 254, 11, 149, 64, 73, 168, 73, 237, 110, 18, 243, 21, 177, 53, 109, + 2, 242, 89, 136, 34, 36, 135, 12, 12, 125, 251, 104, 137, 128, 152, + 41, 70, 163, 184, 237, 137, 249, 63, 56, 133, 39, 0, 243, 248, 80, + 184, 48, 238, 155, 193, 21, 137, 95, 144, 146, 209, 151, 197, 199, 122, + 60, 48, 250, 1, 79, 162, 58, 78, 225, 184, 199, 35, 186, 225, 19, + 68, 31, 199, 150, 85, 197, 76, 246, 150, 47, 63, 55, 196, 200, 10, + 163, 170, 246, 34, 196, 87, 0, 45, 18, 6, 168, 248, 130, 184, 5, + 197, 97, 56, 128, 254, 236, 32, 10, 182, 198, 139, 255, 43, 41, 159, + 119, 253, 81, 248, 251, 253, 184, 98, 229, 6, 8, 64, 48, 190, 105, + 125, 168, 191, 43, 93, 156, 39, 244, 220, 138, 197, 117, 27, 152, 145, + 254, 233, 211, 33, 234, 5, 72, 247, 49, 221, 35, 188, 210, 20, 231, + 90, 255, 37, 30, 126, 209, 65, 137, 123, 126, 191, 158, 227, 201, 129, + 19, 164, 51, 232, 188, 185, 96, 67, 24, 190, 56, 16, 229, 34, 219, + 150, 137, 226, 59, 58, 3, 147, 232, 35, 99, 207, 101, 173, 217, 18, + 139, 1, 94, 123, 4, 232, 147, 243, 13, 193, 193, 187, 232, 100, 187, + 119, 105, 72, 86, 30, 165, 20, 192, 19, 157, 67, 253, 204, 246, 133, + 85, 252, 109, 169, 106, 203, 83, 72, 51, 217, 172, 7, 212, 104, 170, + 166, 21, 181, 11, 14, 145, 33, 175, 235, 169, 66, 203, 78, 108, 209, + 100, 131, 93, 192, 70, 157, 186, 224, 174, 173, 22, 167, 87, 244, 227, + 218, 96, 98, 186, 24, 205, 62, 66, 79, 198, 254, 160, 37, 127, 16, + 95, 171, 47, 34, 80, 43, 26, 111, 65, 207, 29, 139, 135, 69, 13, + 110, 133, 110, 65, 140, 61, 207, 117, 98, 106, 29, 166, 224, 78, 208, + 252, 194, 91, 4, 38, 0, 61, 133, 180, 168, 149, 211, 7, 80, 227, + 135, 51, 11, 249, 228, 26, 198, 244, 2, 47, 226, 93, 147, 222, 125, + 200, 205, 166, 154, 234, 80, 39, 70, 84, 98, 209, 1, 6, 219, 17, + 11, 253, 126, 145, 231, 131, 14, 163, 107, 200, 195, 167, 64, 6, 101, + 209, 255, 116, 179, 69, 164, 133, 23, 78, 98, 105, 182, 236, 34, 246, + 58, 81, 183, 100, 30, 44, 187, 164, 91, 239, 132, 51, 154, 9, 2, + 215, 186, 191, 79, 237, 179, 141, 169, 237, 206, 190, 201, 64, 223, 143, + 60, 173, 108, 96, 216, 183, 70, 110, 5, 59, 230, 206, 194, 40, 211, + 109, 146, 1, 102, 194, 212, 90, 214, 43, 111, 134, 122, 146, 9, 220, + 198, 72, 196, 68, 19, 214, 220, 11, 173, 243, 15, 254, 158, 193, 211, + 191, 55, 163, 212, 18, 20, 42, 199, 191, 74, 238, 191, 113, 173, 125, + 203, 48, 1, 119, 32, 224, 8, 178, 179, 0, 67, 153, 62, 227, 25, + 254, 126, 23, 87, 67, 43, 45, 250, 42, 214, 118, 179, 111, 189, 103, + 133, 35, 196, 54, 23, 203, 218, 59, 177, 194, 55, 210, 153, 78, 207, + 145, 157, 229, 119, 218, 173, 20, 104, 251, 48, 204, 245, 166, 251, 123, + 82, 175, 239, 215, 158, 200, 1, 174, 40, 200, 32, 108, 184, 0, 137, + 90, 81, 159, 128, 165, 10, 233, 210, 52, 48, 74, 164, 246, 199, 240, + 154, 12, 254, 70, 37, 106, 44, 85, 123, 151, 119, 153, 170, 48, 144, + 241, 114, 64, 115, 120, 159, 13, 49, 211, 182, 99, 124, 25, 70, 73, + 196, 179, 201, 219, 124, 22, 137, 229, 160, 155, 10, 158, 234, 132, 203, + 208, 76, 81, 98, 30, 142, 154, 68, 158, 92, 107, 252, 4, 22, 218, + 2, 167, 190, 152, 141, 251, 137, 236, 87, 186, 235, 90, 0, 132, 68, + 232, 66, 63, 0, 41, 235, 157, 45, 68, 194, 45, 18, 249, 254, 60, + 33, 10, 86, 183, 45, 5, 253, 253, 212, 44, 94, 203, 41, 53, 146, + 101, 148, 123, 198, 92, 14, 181, 87, 49, 229, 177, 249, 216, 8, 12, + 37, 108, 220, 236, 13, 72, 122, 48, 235, 219, 74, 220, 187, 130, 66, + 249, 41, 184, 140, 101, 1, 203, 110, 22, 62, 23, 118, 199, 32, 191, + 162, 140, 187, 157, 80, 144, 59, 112, 238, 32, 101, 238, 47, 225, 69, + 99, 178, 246, 49, 76, 81, 101, 187, 71, 59, 140, 229, 81, 253, 42, + 204, 158, 74, 184, 237, 197, 14, 91, 81, 34, 115, 123, 224, 167, 15, + 112, 84, 225, 104, 103, 208, 236, 183, 185, 142, 175, 147, 237, 188, 159, + 125, 142, 253, 121, 87, 239, 78, 57, 179, 13, 123, 74, 148, 197, 74, + 227, 110, 48, 248, 165, 248, 249, 43, 249, 0, 69, 7, 183, 68, 167, + 181, 39, 54, 144, 39, 212, 36, 40, 171, 48, 106, 76, 50, 201, 111, + 254, 86, 240, 39, 14, 59, 58, 110, 54, 155, 2, 6, 205, 190, 237, + 126, 58, 204, 112, 159, 145, 188, 208, 196, 197, 52, 54, 94, 84, 127, + 46, 56, 93, 152, 190, 133, 120, 166, 75, 52, 6, 112, 112, 71, 119, + 143, 218, 19, 242, 174, 48, 246, 29, 243, 137, 94, 127, 95, 76, 49, + 20, 149, 159, 251, 59, 146, 102, 242, 222, 157, 162, 124, 154, 25, 47, + 246, 135, 38, 177, 165, 246, 224, 202, 4, 177, 255, 203, 245, 58, 172, + 164, 33, 155, 179, 56, 41, 202, 39, 145, 176, 130, 171, 30, 77, 177, + 64, 203, 70, 230, 242, 240, 118, 145, 30, 89, 184, 11, 123, 157, 212, + 156, 28, 5, 200, 96, 157, 102, 126, 212, 149, 137, 144, 169, 39, 211, + 159, 193, 254, 65, 201, 154, 165, 37, 129, 14, 242, 28, 37, 17, 130, + 202, 227, 241, 49, 191, 213, 179, 72, 243, 118, 52, 133, 149, 8, 156, + 231, 94, 215, 15, 21, 118, 194, 254, 107, 249, 40, 153, 69, 95, 141, + 97, 37, 224, 82, 146, 71, 35, 26, 88, 127, 137, 247, 242, 243, 135, + 113, 189, 155, 56, 98, 99, 90, 108, 186, 118, 178, 253, 50, 44, 30, + 43, 223, 171, 186, 44, 120, 215, 128, 45, 65, 178, 142, 159, 39, 70, + 37, 168, 62, 127, 219, 111, 40, 239, 134, 47, 114, 69, 45, 87, 15, + 234, 100, 9, 90, 220, 203, 241, 40, 150, 239, 164, 39, 164, 196, 117, + 156, 132, 143, 87, 146, 190, 130, 168, 244, 193, 101, 110, 158, 231, 57, + 146, 235, 227, 8, 12, 208, 209, 203, 35, 38, 242, 45, 43, 118, 252, + 201, 244, 130, 42, 18, 133, 66, 129, 209, 77, 208, 69, 236, 138, 254, + 255, 245, 112, 236, 86, 171, 1, 111, 107, 69, 213, 222, 232, 199, 49, + 193, 174, 198, 100, 170, 183, 150, 10, 233, 28, 210, 219, 123, 233, 126, + 105, 75, 222, 231, 13, 137, 242, 177, 41, 137, 60, 202, 92, 16, 131, + 226, 193, 152, 79, 95, 235, 105, 227, 172, 7, 160, 180, 146, 190, 243, + 34, 19, 186, 215, 106, 95, 152, 49, 90, 68, 71, 90, 222, 240, 72, + 16, 153, 69, 114, 193, 215, 175, 165, 224, 198, 154, 70, 104, 79, 97, + 153, 54, 153, 179, 2, 207, 197, 243, 12, 159, 76, 168, 136, 217, 116, + 79, 104, 21, 215, 72, 199, 35, 153, 67, 50, 145, 11, 253, 62, 254, + 121, 1, 8, 147, 39, 20, 94, 155, 80, 41, 135, 135, 45, 85, 61, + 140, 26, 195, 80, 187, 252, 175, 253, 152, 170, 169, 118, 235, 158, 134, + 82, 188, 86, 52, 70, 32, 239, 212, 157, 115, 137, 28, 191, 156, 197, + 136, 226, 171, 17, 231, 181, 79, 246, 232, 178, 242, 233, 113, 210, 230, + 35, 201, 213, 28, 72, 27, 183, 26, 106, 240, 111, 111, 255, 122, 128, + 234, 179, 201, 66, 165, 245, 198, 201, 138, 20, 212, 139, 159, 200, 91, + 150, 175, 209, 203, 255, 81, 30, 27, 83, 216, 119, 36, 48, 112, 237, + 229, 175, 204, 149, 192, 183, 184, 165, 176, 231, 176, 223, 81, 214, 225, + 145, 107, 248, 225, 213, 6, 99, 59, 197, 183, 125, 208, 26, 19, 178, + 146, 154, 242, 71, 189, 11, 246, 48, 8, 7, 28, 105, 208, 20, 13, + 236, 77, 244, 218, 101, 217, 125, 199, 153, 77, 193, 214, 233, 91, 48, + 201, 209, 6, 155, 87, 208, 221, 9, 73, 76, 191, 23, 249, 237, 146, + 189, 177, 55, 8, 68, 192, 111, 204, 19, 164, 189, 223, 83, 220, 156, + 79, 12, 82, 178, 149, 102, 94, 120, 229, 198, 77, 136, 244, 84, 33, + 90, 66, 193, 45, 252, 160, 151, 66, 240, 135, 232, 147, 235, 107, 173, + 30, 184, 103, 131, 168, 55, 195, 111, 16, 202, 227, 203, 16, 14, 226, + 104, 220, 126, 121, 163, 5, 26, 253, 35, 196, 13, 90, 196, 32, 157, + 28, 152, 70, 205, 236, 101, 142, 207, 126, 230, 67, 194, 143, 67, 77, + 91, 97, 71, 135, 244, 40, 104, 120, 39, 169, 91, 124, 162, 111, 121, + 9, 118, 146, 215, 112, 120, 157, 22, 198, 241, 196, 32, 176, 60, 244, + 197, 37, 210, 215, 125, 122, 143, 253, 175, 101, 92, 205, 43, 170, 70, + 183, 173, 162, 130, 226, 41, 122, 158, 130, 183, 223, 162, 212, 194, 38, + 133, 252, 57, 245, 187, 168, 165, 204, 119, 8, 249, 174, 10, 206, 251, + 55, 212, 118, 212, 74, 226, 227, 141, 138, 122, 204, 83, 14, 175, 248, + 18, 159, 79, 79, 100, 56, 37, 229, 209, 221, 238, 197, 164, 42, 159, + 203, 67, 31, 8, 195, 72, 251, 142, 229, 60, 24, 254, 97, 124, 219, + 201, 255, 232, 60, 77, 19, 220, 239, 10, 158, 62, 117, 245, 167, 63, + 38, 216, 169, 209, 29, 245, 17, 4, 241, 218, 83, 72, 48, 214, 228, + 85, 103, 116, 248, 133, 200, 75, 81, 220, 207, 59, 226, 102, 50, 238, + 138, 44, 120, 162, 220, 105, 5, 120, 11, 153, 98, 144, 4, 197, 217, + 39, 235, 141, 148, 123, 51, 213, 255, 144, 17, 189, 144, 214, 246, 45, + 95, 229, 127, 107, 19, 164, 143, 48, 210, 29, 249, 66, 11, 171, 191, + 73, 99, 161, 114, 190, 80, 31, 215, 67, 16, 187, 246, 47, 110, 157, + 33, 208, 151, 122, 2, 228, 161, 51, 9, 215, 33, 246, 67, 44, 19, + 41, 29, 10, 42, 130, 244, 95, 45, 199, 156, 251, 151, 210, 121, 198, + 52, 44, 87, 214, 126, 214, 93, 242, 201, 31, 44, 250, 139, 78, 59, + 95, 116, 45, 100, 187, 97, 206, 143, 158, 54, 98, 113, 30, 101, 151, + 56, 187, 116, 199, 157, 108, 136, 90, 36, 85, 253, 171, 140, 253, 14, + 229, 238, 65, 220, 56, 162, 194, 138, 46, 251, 90, 92, 121, 202, 202, + 98, 133, 78, 229, 87, 31, 158, 12, 175, 122, 17, 65, 10, 163, 51, + 163, 95, 143, 208, 9, 192, 58, 29, 130, 4, 237, 194, 246, 82, 11, + 20, 49, 26, 177, 34, 202, 180, 210, 111, 234, 151, 37, 27, 225, 7, + 205, 35, 242, 176, 98, 232, 60, 89, 99, 33, 233, 106, 236, 96, 248, + 71, 101, 133, 44, 190, 241, 76, 113, 146, 181, 106, 191, 130, 100, 127, + 206, 138, 118, 124, 159, 138, 215, 82, 22, 224, 17, 114, 127, 109, 203, + 60, 33, 67, 126, 145, 25, 199, 88, 97, 150, 40, 68, 185, 144, 218, + 230, 81, 203, 223, 45, 209, 250, 22, 234, 12, 153, 49, 19, 107, 97, + 79, 126, 100, 128, 16, 12, 83, 74, 94, 23, 159, 192, 193, 74, 153, + 246, 12, 157, 248, 106, 34, 35, 64, 99, 184, 137, 91, 26, 154, 127, + 155, 218, 36, 185, 64, 26, 41, 236, 232, 223, 159, 10, 29, 165, 12, + 244, 214, 231, 231, 212, 154, 169, 66, 39, 153, 129, 38, 40, 46, 140, + 140, 172, 0, 251, 41, 244, 153, 56, 180, 67, 22, 40, 33, 9, 111, + 79, 11, 215, 49, 66, 195, 45, 113, 22, 41, 109, 39, 124, 178, 49, + 173, 25, 245, 157, 190, 63, 116, 79, 213, 200, 171, 85, 121, 185, 198, + 99, 92, 235, 127, 157, 18, 45, 201, 187, 193, 140, 79, 33, 65, 24, + 11, 175, 105, 233, 47, 242, 36, 139, 254, 195, 48, 31, 146, 32, 0, + 150, 237, 52, 165, 4, 174, 230, 81, 72, 146, 101, 241, 206, 146, 151, + 105, 106, 255, 165, 127, 196, 69, 250, 155, 248, 177, 254, 232, 30, 109, + 169, 33, 76, 112, 72, 214, 254, 113, 170, 234, 191, 76, 20, 132, 209, + 243, 152, 241, 107, 12, 107, 31, 16, 149, 129, 8, 160, 7, 54, 31, + 219, 58, 93, 76, 50, 143, 210, 73, 131, 59, 34, 38, 88, 9, 217, + 193, 206, 147, 54, 244, 11, 240, 180, 243, 123, 68, 124, 81, 153, 132, + 49, 38, 33, 220, 125, 164, 236, 162, 128, 202, 246, 183, 178, 35, 242, + 109, 76, 7, 215, 92, 149, 32, 117, 34, 174, 122, 34, 101, 5, 67, + 79, 24, 48, 75, 194, 8, 12, 98, 113, 36, 13, 79, 16, 94, 249, + 110, 147, 212, 105, 205, 39, 31, 127, 182, 213, 97, 28, 226, 105, 217, + 245, 84, 138, 119, 58, 136, 137, 79, 193, 116, 226, 72, 101, 0, 142, + 171, 59, 40, 203, 158, 100, 187, 137, 8, 9, 125, 233, 16, 241, 192, + 135, 4, 72, 132, 89, 126, 34, 0, 197, 80, 159, 101, 77, 18, 52, + 179, 249, 169, 95, 125, 120, 18, 56, 177, 106, 6, 100, 99, 197, 197, + 111, 104, 120, 211, 163, 86, 224, 106, 157, 48, 112, 84, 232, 171, 172, + 220, 107, 136, 118, 170, 105, 16, 133, 223, 77, 65, 61, 41, 184, 88, + 67, 98, 175, 216, 139, 56, 140, 26, 18, 179, 212, 180, 218, 235, 78, + 180, 154, 144, 195, 188, 126, 205, 37, 58, 203, 223, 248, 156, 87, 139, + 176, 77, 244, 117, 77, 148, 85, 187, 142, 119, 144, 113, 128, 217, 33, + 5, 107, 247, 10, 178, 66, 206, 128, 187, 155, 161, 150, 166, 9, 194, + 18, 87, 82, 5, 42, 74, 250, 215, 83, 145, 8, 158, 182, 156, 82, + 161, 19, 87, 92, 77, 14, 7, 208, 23, 8, 13, 59, 57, 167, 252, + 236, 167, 68, 206, 208, 173, 237, 84, 141, 14, 118, 250, 194, 37, 131, + 146, 23, 17, 37, 228, 42, 134, 130, 193, 34, 83, 151, 107, 227, 133, + 189, 157, 96, 73, 176, 115, 205, 111, 159, 89, 182, 43, 180, 27, 36, + 57, 30, 151, 83, 181, 2, 2, 53, 17, 231, 175, 92, 52, 97, 124, + 25, 172, 17, 206, 83, 37, 79, 60, 174, 47, 181, 207, 115, 216, 0, + 59, 178, 186, 222, 154, 48, 10, 203, 237, 168, 102, 67, 97, 12, 80, + 164, 196, 36, 102, 249, 198, 223, 40, 139, 247, 238, 100, 167, 179, 209, + 170, 131, 198, 166, 105, 139, 118, 164, 153, 86, 75, 187, 187, 197, 160, + 68, 198, 18, 67, 72, 85, 158, 8, 198, 13, 38, 133, 227, 47, 6, + 64, 250, 136, 178, 128, 108, 116, 81, 186, 206, 233, 159, 179, 60, 114, + 136, 222, 26, 198, 221, 9, 223, 32, 123, 35, 23, 188, 146, 155, 213, + 76, 159, 32, 252, 211, 185, 1, 157, 178, 135, 227, 248, 103, 157, 213, + 189, 148, 107, 135, 236, 254, 236, 112, 211, 216, 133, 146, 65, 193, 156, + 12, 68, 129, 130, 145, 203, 140, 174, 99, 164, 145, 36, 252, 41, 175, + 206, 147, 115, 196, 4, 174, 108, 17, 122, 230, 134, 147, 226, 163, 123, + 125, 195, 16, 122, 59, 157, 243, 224, 222, 35, 75, 158, 165, 183, 96, + 220, 251, 154, 155, 140, 144, 238, 87, 118, 32, 40, 120, 50, 237, 231, + 139, 167, 105, 32, 225, 232, 86, 220, 154, 75, 196, 71, 65, 93, 220, + 61, 119, 51, 177, 246, 221, 145, 96, 123, 19, 25, 236, 101, 58, 161, + 73, 84, 176, 133, 105, 196, 134, 172, 27, 162, 226, 224, 55, 16, 137, + 168, 193, 190, 36, 174, 21, 216, 214, 118, 104, 129, 255, 68, 151, 108, + 167, 109, 82, 66, 183, 246, 156, 70, 234, 152, 129, 21, 156, 244, 102, + 179, 68, 253, 171, 86, 189, 188, 191, 254, 81, 210, 173, 115, 204, 35, + 164, 144, 108, 236, 225, 100, 49, 60, 210, 38, 90, 187, 49, 180, 192, + 94, 27, 241, 255, 99, 158, 7, 237, 83, 24, 236, 15, 188, 123, 165, + 197, 98, 230, 62, 46, 224, 117, 139, 102, 180, 131, 227, 218, 54, 126, + 52, 152, 148, 252, 217, 93, 32, 154, 96, 161, 242, 40, 170, 26, 56, + 74, 254, 10, 15, 19, 201, 213, 81, 46, 158, 233, 148, 163, 223, 116, + 67, 170, 168, 17, 52, 115, 222, 60, 24, 251, 6, 74, 89, 86, 242, + 245, 45, 128, 182, 3, 195, 154, 20, 179, 113, 153, 44, 242, 180, 83, + 26, 92, 220, 87, 99, 40, 234, 36, 47, 104, 5, 216, 15, 75, 28, + 250, 13, 84, 199, 155, 151, 61, 58, 214, 142, 173, 215, 72, 185, 60, + 233, 73, 102, 177, 181, 170, 7, 48, 166, 110, 32, 227, 24, 254, 43, + 157, 97, 119, 1, 125, 154, 244, 80, 196, 119, 70, 137, 163, 29, 157, + 21, 96, 40, 77, 149, 43, 89, 115, 78, 66, 67, 78, 130, 122, 141, + 108, 245, 94, 13, 91, 233, 28, 99, 104, 150, 29, 104, 122, 221, 186, + 150, 126, 164, 59, 147, 132, 74, 1, 84, 129, 134, 199, 184, 19, 164, + 172, 218, 226, 69, 96, 187, 3, 219, 55, 20, 36, 43, 220, 131, 166, + 139, 173, 189, 7, 95, 213, 220, 66, 112, 32, 44, 231, 163, 42, 23, + 106, 253, 98, 142, 233, 108, 164, 242, 111, 223, 130, 113, 101, 180, 103, + 69, 79, 3, 212, 134, 113, 14, 252, 41, 247, 87, 188, 147, 176, 171, + 218, 249, 176, 197, 157, 118, 13, 73, 246, 206, 106, 50, 120, 17, 148, + 147, 164, 185, 70, 144, 158, 116, 214, 92, 246, 184, 68, 85, 100, 240, + 154, 2, 156, 164, 212, 110, 241, 153, 129, 7, 222, 203, 157, 48, 94, + 103, 89, 110, 197, 102, 10, 76, 234, 22, 12, 104, 202, 167, 57, 56, + 178, 52, 73, 40, 212, 95, 196, 212, 166, 85, 15, 41, 81, 141, 124, + 130, 100, 79, 100, 175, 126, 225, 151, 102, 116, 43, 17, 190, 116, 116, + 79, 51, 59, 243, 149, 11, 121, 3, 234, 103, 221, 234, 201, 245, 5, + 11, 20, 29, 181, 138, 67, 190, 119, 205, 66, 225, 155, 66, 14, 205, + 68, 114, 207, 7, 180, 117, 185, 176, 204, 9, 9, 126, 205, 58, 142, + 28, 136, 232, 53, 149, 237, 169, 44, 185, 78, 143, 99, 153, 143, 187, + 157, 87, 106, 201, 63, 2, 205, 96, 226, 4, 28, 208, 81, 197, 98, + 126, 168, 170, 63, 29, 15, 228, 23, 82, 12, 109, 204, 227, 231, 228, + 87, 196, 63, 117, 68, 31, 206, 19, 177, 225, 66, 233, 244, 58, 185, + 208, 188, 153, 253, 0, 60, 122, 11, 36, 193, 235, 90, 21, 89, 103, + 232, 187, 68, 214, 232, 180, 13, 143, 157, 99, 180, 232, 213, 90, 113, + 194, 193, 194, 230, 242, 45, 135, 51, 201, 80, 171, 128, 144, 150, 184, + 193, 211, 22, 74, 186, 176, 237, 133, 181, 83, 216, 250, 76, 28, 144, + 255, 76, 29, 64, 27, 25, 54, 88, 161, 132, 38, 34, 236, 32, 77, + 106, 157, 6, 74, 120, 64, 211, 237, 173, 164, 29, 22, 107, 236, 9, + 67, 136, 70, 87, 153, 52, 245, 162, 52, 213, 109, 66, 123, 116, 19, + 54, 210, 216, 16, 72, 192, 249, 183, 108, 193, 60, 242, 120, 186, 160, + 200, 137, 184, 180, 97, 15, 95, 167, 169, 87, 146, 151, 83, 244, 178, + 11, 114, 231, 59, 246, 175, 29, 229, 95, 166, 199, 244, 74, 6, 79, + 7, 15, 150, 53, 55, 148, 10, 214, 117, 214, 214, 18, 111, 23, 77, + 192, 122, 193, 255, 196, 114, 120, 89, 233, 200, 20, 133, 140, 132, 162, + 136, 45, 10, 216, 110, 169, 138, 221, 15, 114, 80, 66, 207, 159, 89, + 31, 183, 6, 112, 209, 114, 85, 57, 171, 99, 14, 83, 218, 19, 240, + 133, 147, 208, 50, 112, 209, 213, 114, 113, 128, 67, 115, 171, 57, 184, + 202, 111, 119, 128, 8, 204, 133, 137, 179, 216, 142, 74, 57, 86, 75, + 192, 237, 228, 108, 69, 105, 193, 141, 250, 76, 204, 128, 155, 26, 66, + 172, 237, 250, 179, 186, 199, 211, 152, 65, 6, 152, 201, 105, 251, 78, + 186, 157, 66, 69, 101, 190, 17, 230, 96, 168, 156, 29, 7, 59, 250, + 141, 145, 141, 234, 100, 149, 39, 172, 205, 57, 39, 61, 6, 218, 254, + 181, 184, 94, 155, 251, 236, 8, 17, 252, 132, 153, 56, 164, 230, 249, + 203, 60, 78, 227, 136, 118, 97, 69, 247, 170, 83, 230, 125, 104, 85, + 239, 19, 220, 15, 148, 251, 249, 196, 138, 38, 81, 209, 15, 231, 239, + 183, 73, 121, 87, 157, 191, 171, 0, 99, 100, 105, 105, 223, 226, 113, + 198, 179, 200, 75, 136, 55, 190, 194, 166, 94, 142, 224, 39, 193, 163, + 138, 3, 203, 220, 34, 118, 216, 34, 142, 111, 227, 241, 205, 154, 220, + 162, 107, 200, 100, 217, 194, 122, 207, 234, 161, 104, 119, 201, 84, 46, + 37, 159, 130, 76, 136, 147, 250, 29, 209, 151, 145, 92, 189, 105, 79, + 101, 117, 4, 209, 229, 171, 22, 168, 11, 210, 160, 120, 158, 218, 39, + 129, 95, 30, 254, 37, 160, 17, 226, 65, 38, 155, 129, 122, 222, 170, + 133, 113, 134, 168, 135, 212, 57, 200, 248, 226, 62, 62, 200, 159, 127, + 42, 51, 90, 49, 28, 134, 6, 226, 227, 159, 163, 142, 179, 173, 151, + 168, 47, 106, 150, 43, 205, 20, 245, 181, 82, 210, 73, 173, 93, 73, + 132, 69, 71, 195, 129, 214, 106, 151, 117, 135, 138, 224, 126, 167, 48, + 83, 34, 36, 200, 13, 29, 239, 80, 11, 224, 146, 30, 165, 79, 231, + 209, 119, 168, 138, 217, 100, 202, 154, 132, 206, 54, 71, 170, 74, 126, + 11, 105, 96, 94, 176, 133, 105, 167, 60, 81, 127, 80, 238, 86, 126, + 54, 147, 16, 117, 54, 230, 12, 76, 196, 8, 177, 11, 61, 177, 113, + 30, 40, 18, 26, 18, 55, 37, 74, 94, 243, 222, 250, 144, 1, 67, + 236, 61, 94, 204, 49, 44, 63, 128, 123, 253, 163, 36, 31, 168, 42, + 144, 198, 132, 53, 212, 183, 1, 234, 164, 254, 55, 113, 19, 28, 184, + 210, 113, 4, 95, 146, 92, 164, 152, 120, 176, 218, 237, 134, 193, 243, + 109, 2, 35, 253, 94, 25, 192, 246, 118, 186, 220, 218, 81, 217, 36, + 126, 215, 24, 86, 127, 114, 69, 176, 237, 20, 52, 239, 1, 82, 149, + 90, 227, 216, 108, 176, 100, 41, 68, 64, 97, 13, 13, 10, 132, 104, + 252, 194, 30, 134, 21, 234, 121, 133, 137, 238, 55, 1, 233, 41, 41, + 165, 24, 135, 243, 206, 15, 65, 184, 175, 222, 34, 216, 2, 143, 84, + 207, 136, 195, 96, 7, 114, 230, 244, 158, 69, 30, 62, 183, 157, 58, + 157, 248, 35, 163, 89, 27, 18, 44, 149, 74, 255, 140, 216, 203, 58, + 102, 75, 24, 123, 11, 79, 224, 186, 187, 55, 178, 22, 170, 74, 65, + 248, 185, 88, 174, 100, 179, 42, 147, 165, 94, 149, 106, 1, 14, 49, + 135, 110, 240, 201, 36, 145, 118, 151, 62, 220, 245, 246, 188, 254, 207, + 98, 231, 47, 67, 38, 225, 110, 86, 50, 168, 160, 3, 188, 233, 152, + 13, 199, 93, 171, 72, 152, 181, 223, 144, 105, 206, 64, 198, 51, 125, + 118, 168, 107, 110, 42, 87, 126, 137, 100, 52, 139, 187, 84, 78, 109, + 68, 157, 242, 105, 42, 192, 199, 227, 229, 167, 149, 115, 222, 117, 64, + 146, 168, 86, 69, 160, 37, 91, 184, 75, 172, 107, 178, 205, 113, 109, + 197, 143, 177, 69, 241, 131, 191, 103, 112, 145, 194, 234, 152, 191, 196, + 121, 189, 118, 85, 248, 218, 129, 113, 247, 58, 112, 168, 212, 15, 226, + 249, 121, 7, 193, 119, 219, 153, 152, 134, 87, 50, 53, 1, 122, 228, + 133, 70, 218, 235, 176, 226, 181, 228, 247, 171, 237, 208, 93, 219, 210, + 204, 99, 81, 35, 94, 213, 244, 214, 133, 87, 38, 157, 220, 76, 241, + 250, 9, 174, 94, 200, 220, 42, 33, 84, 33, 20, 6, 86, 165, 70, + 17, 23, 147, 58, 74, 222, 31, 41, 174, 132, 226, 158, 2, 97, 151, + 118, 118, 199, 237, 251, 181, 137, 122, 134, 180, 206, 25, 127, 6, 28, + 88, 227, 99, 230, 21, 51, 19, 201, 179, 147, 131, 49, 170, 49, 104, + 15, 138, 137, 169, 120, 94, 205, 80, 43, 230, 239, 124, 165, 225, 36, + 228, 209, 108, 204, 135, 125, 157, 94, 203, 116, 141, 29, 156, 97, 146, + 225, 80, 43, 254, 51, 120, 58, 221, 11, 176, 165, 179, 174, 53, 216, + 195, 110, 24, 177, 125, 101, 171, 86, 108, 182, 14, 91, 146, 246, 127, + 249, 192, 221, 143, 211, 90, 9, 12, 130, 246, 170, 107, 193, 134, 28, + 49, 35, 254, 131, 137, 125, 207, 196, 72, 80, 90, 30, 174, 143, 172, + 226, 50, 12, 236, 58, 235, 205, 251, 234, 171, 14, 201, 232, 131, 230, + 212, 162, 143, 189, 179, 44, 100, 224, 49, 15, 155, 170, 228, 158, 151, + 239, 19, 0, 232, 204, 216, 76, 21, 149, 130, 142, 63, 146, 152, 124, + 136, 129, 14, 182, 212, 29, 8, 244, 12, 36, 28, 134, 52, 216, 106, + 229, 107, 150, 8, 223, 247, 117, 229, 251, 216, 158, 228, 97, 240, 148, + 228, 49, 138, 80, 34, 204, 52, 237, 43, 105, 142, 231, 20, 32, 70, + 44, 180, 212, 121, 229, 177, 50, 152, 238, 72, 51, 116, 111, 18, 27, + 211, 40, 211, 97, 226, 18, 155, 21, 216, 166, 165, 37, 234, 56, 121, + 165, 159, 197, 87, 203, 146, 69, 137, 25, 148, 143, 246, 247, 131, 100, + 91, 45, 25, 127, 103, 35, 219, 32, 31, 237, 93, 92, 167, 194, 64, + 255, 188, 64, 139, 118, 135, 212, 56, 216, 167, 102, 36, 220, 109, 21, + 147, 92, 78, 8, 65, 213, 179, 11, 40, 227, 83, 207, 175, 56, 75, + 193, 105, 239, 145, 193, 107, 234, 101, 50, 97, 123, 246, 137, 30, 180, + 149, 18, 62, 162, 163, 16, 192, 79, 61, 222, 25, 35, 181, 13, 10, + 90, 25, 216, 76, 219, 117, 100, 244, 159, 172, 223, 106, 19, 1, 176, + 180, 154, 222, 182, 202, 241, 217, 150, 203, 244, 213, 94, 178, 158, 130, + 166, 105, 167, 118, 194, 153, 142, 60, 134, 216, 142, 216, 254, 2, 7, + 54, 26, 197, 25, 138, 74, 39, 101, 107, 168, 110, 24, 58, 191, 136, + 25, 40, 26, 79, 96, 4, 25, 32, 134, 180, 69, 19, 198, 208, 254, + 197, 133, 72, 242, 66, 107, 23, 157, 143, 117, 50, 224, 198, 246, 8, + 19, 49, 213, 159, 9, 201, 160, 158, 200, 59, 145, 119, 110, 58, 190, + 132, 168, 220, 64, 171, 103, 140, 202, 167, 130, 190, 195, 57, 194, 90, + 11, 214, 19, 53, 68, 88, 89, 14, 235, 20, 50, 249, 248, 100, 241, + 10, 149, 35, 93, 4, 84, 62, 75, 41, 223, 81, 56, 18, 14, 101, + 224, 40, 118, 53, 252, 72, 194, 185, 15, 235, 120, 170, 171, 237, 242, + 201, 96, 157, 93, 248, 227, 156, 239, 249, 190, 10, 177, 147, 77, 18, + 157, 53, 114, 233, 168, 14, 28, 80, 50, 89, 248, 127, 156, 98, 193, + 111, 202, 38, 248, 60, 243, 240, 198, 122, 227, 160, 117, 138, 247, 171, + 235, 47, 23, 245, 177, 12, 24, 213, 214, 117, 210, 86, 85, 55, 153, + 25, 16, 53, 195, 81, 247, 217, 104, 109, 170, 63, 79, 169, 38, 150, + 42, 167, 206, 230, 51, 109, 62, 202, 205, 164, 28, 240, 90, 82, 119, + 57, 222, 95, 195, 106, 193, 197, 180, 73, 24, 108, 143, 114, 54, 29, + 100, 255, 124, 30, 143, 120, 147, 84, 110, 157, 53, 226, 104, 117, 65, + 60, 187, 173, 94, 59, 132, 121, 145, 188, 220, 105, 4, 48, 89, 130, + 82, 236, 212, 138, 179, 197, 182, 115, 6, 83, 196, 132, 184, 148, 183, + 101, 141, 92, 84, 153, 147, 133, 212, 8, 250, 226, 167, 209, 22, 95, + 44, 103, 243, 27, 111, 105, 128, 110, 88, 110, 190, 229, 81, 26, 219, + 229, 83, 247, 16, 17, 158, 228, 197, 32, 193, 223, 184, 178, 89, 21, + 43, 254, 124, 144, 200, 131, 138, 5, 107, 98, 139, 16, 184, 127, 244, + 51, 141, 88, 178, 132, 205, 239, 123, 14, 34, 2, 244, 238, 154, 230, + 146, 87, 15, 20, 164, 174, 159, 28, 211, 81, 230, 227, 158, 16, 168, + 8, 18, 105, 177, 68, 50, 127, 64, 73, 123, 233, 44, 34, 159, 133, + 66, 100, 163, 184, 244, 171, 240, 235, 230, 160, 137, 131, 200, 230, 189, + 136, 137, 240, 110, 253, 0, 250, 52, 126, 123, 209, 83, 189, 61, 243, + 153, 60, 36, 157, 156, 141, 175, 212, 219, 217, 33, 144, 133, 126, 7, + 41, 228, 77, 247, 47, 162, 47, 3, 157, 32, 219, 149, 138, 51, 181, + 65, 242, 51, 76, 185, 51, 5, 188, 216, 33, 31, 179, 247, 93, 55, + 241, 103, 253, 14, 6, 32, 17, 137, 194, 126, 235, 132, 115, 93, 167, + 187, 190, 147, 190, 255, 120, 166, 38, 118, 241, 129, 163, 37, 39, 155, + 142, 37, 147, 134, 221, 136, 99, 114, 152, 250, 143, 53, 104, 103, 7, + 37, 178, 195, 124, 200, 196, 34, 8, 247, 255, 156, 141, 29, 202, 239, + 70, 189, 144, 0, 167, 182, 105, 57, 205, 218, 54, 151, 29, 7, 76, + 7, 84, 20, 246, 185, 216, 93, 21, 96, 25, 115, 176, 38, 180, 177, + 224, 112, 104, 92, 17, 152, 55, 211, 21, 210, 98, 249, 201, 21, 85, + 84, 185, 53, 59, 147, 198, 1, 251, 185, 235, 132, 73, 67, 194, 220, + 120, 191, 206, 73, 53, 158, 237, 102, 41, 23, 133, 14, 81, 47, 204, + 9, 142, 124, 180, 115, 236, 180, 190, 218, 68, 92, 113, 54, 250, 174, + 99, 126, 1, 186, 88, 231, 96, 51, 147, 236, 164, 135, 210, 75, 242, + 196, 53, 104, 101, 233, 0, 129, 173, 53, 118, 42, 188, 139, 187, 251, + 143, 37, 222, 198, 168, 194, 103, 107, 56, 240, 213, 98, 0, 65, 112, + 187, 230, 203, 207, 104, 124, 78, 130, 66, 156, 214, 95, 22, 46, 181, + 254, 15, 201, 138, 160, 138, 171, 202, 3, 169, 187, 110, 58, 43, 218, + 62, 112, 49, 206, 186, 161, 31, 140, 183, 84, 143, 250, 217, 123, 9, + 210, 87, 1, 208, 77, 143, 33, 6, 237, 173, 108, 187, 137, 131, 148, + 145, 22, 123, 142, 146, 156, 223, 61, 124, 151, 57, 17, 88, 139, 56, + 8, 26, 205, 163, 193, 72, 201, 209, 220, 215, 97, 172, 73, 99, 139, + 111, 125, 94, 196, 78, 235, 224, 103, 38, 237, 9, 142, 131, 229, 45, + 247, 172, 219, 29, 102, 67, 124, 171, 113, 2, 85, 148, 56, 150, 227, + 45, 147, 200, 171, 42, 244, 128, 106, 2, 47, 245, 211, 163, 240, 41, + 86, 50, 70, 44, 91, 166, 247, 110, 234, 138, 152, 4, 100, 49, 248, + 198, 51, 124, 253, 126, 122, 30, 165, 0, 183, 248, 65, 30, 156, 161, + 52, 164, 76, 44, 198, 99, 20, 24, 97, 93, 232, 104, 51, 200, 0, + 153, 67, 93, 172, 94, 217, 127, 34, 29, 64, 149, 41, 78, 211, 63, + 188, 61, 102, 2, 127, 166, 194, 5, 59, 203, 5, 224, 68, 250, 58, + 202, 236, 218, 235, 168, 0, 205, 82, 53, 99, 51, 144, 0, 140, 45, + 46, 213, 207, 17, 221, 47, 85, 211, 87, 2, 35, 167, 236, 191, 70, + 147, 201, 200, 69, 1, 228, 136, 243, 122, 253, 34, 201, 92, 90, 194, + 8, 119, 197, 197, 178, 157, 207, 170, 147, 232, 5, 200, 241, 6, 27, + 120, 242, 232, 163, 26, 234, 230, 50, 214, 194, 125, 135, 62, 28, 118, + 24, 155, 39, 166, 250, 204, 189, 169, 94, 110, 81, 222, 81, 127, 71, + 49, 176, 178, 37, 63, 219, 72, 0, 100, 255, 201, 70, 177, 208, 81, + 101, 177, 31, 130, 187, 196, 119, 161, 217, 207, 216, 59, 106, 15, 56, + 134, 229, 99, 68, 73, 215, 9, 25, 119, 82, 88, 19, 184, 42, 38, + 40, 176, 6, 34, 167, 249, 143, 6, 216, 128, 139, 75, 3, 229, 126, + 121, 187, 68, 219, 187, 99, 154, 175, 240, 86, 75, 40, 133, 146, 223, + 105, 220, 83, 126, 90, 206, 136, 102, 199, 36, 217, 56, 78, 226, 138, + 59, 142, 223, 68, 175, 191, 83, 224, 208, 195, 2, 102, 168, 194, 158, + 231, 143, 162, 83, 92, 93, 238, 12, 231, 142, 41, 106, 66, 178, 68, + 83, 155, 24, 102, 150, 112, 1, 27, 175, 239, 85, 175, 61, 75, 157, + 245, 121, 62, 171, 217, 55, 218, 86, 45, 10, 228, 203, 193, 216, 90, + 142, 109, 232, 168, 17, 149, 145, 169, 199, 134, 194, 110, 104, 66, 130, + 215, 179, 205, 6, 183, 93, 47, 131, 8, 104, 12, 169, 92, 69, 43, + 193, 77, 223, 238, 36, 15, 59, 136, 95, 87, 196, 169, 35, 118, 252, + 19, 6, 247, 172, 219, 159, 109, 118, 154, 10, 199, 227, 164, 36, 85, + 27, 37, 52, 149, 85, 107, 134, 203, 39, 112, 63, 235, 229, 225, 141, + 127, 46, 188, 125, 48, 183, 137, 79, 157, 251, 128, 214, 29, 60, 192, + 43, 20, 22, 77, 62, 5, 229, 201, 61, 217, 181, 68, 161, 232, 220, + 189, 206, 170, 48, 199, 251, 10, 93, 153, 112, 35, 81, 174, 17, 220, + 54, 183, 4, 229, 14, 231, 33, 14, 63, 121, 125, 205, 101, 110, 255, + 145, 55, 130, 56, 4, 236, 171, 27, 10, 130, 188, 115, 125, 104, 178, + 41, 100, 48, 200, 231, 41, 156, 32, 125, 22, 167, 209, 221, 201, 63, + 165, 210, 15, 14, 83, 162, 45, 176, 131, 195, 34, 145, 120, 155, 67, + 82, 254, 231, 179, 149, 97, 4, 84, 30, 62, 140, 39, 235, 91, 145, + 92, 89, 87, 96, 144, 96, 223, 153, 0, 28, 117, 238, 168, 40, 11, + 140, 197, 162, 172, 72, 23, 120, 153, 147, 195, 6, 39, 36, 54, 174, + 202, 182, 74, 232, 30, 240, 10, 130, 188, 127, 2, 48, 68, 9, 191, + 245, 176, 249, 169, 19, 21, 154, 45, 249, 114, 137, 223, 190, 252, 87, + 36, 85, 242, 96, 21, 234, 18, 157, 108, 86, 179, 103, 87, 149, 121, + 231, 19, 111, 157, 154, 171, 158, 128, 68, 253, 157, 146, 9, 11, 82, + 101, 218, 181, 37, 73, 31, 19, 122, 211, 104, 102, 172, 244, 119, 94, + 235, 143, 241, 113, 24, 211, 132, 227, 169, 254, 60, 118, 45, 122, 177, + 97, 161, 170, 233, 212, 139, 23, 179, 61, 117, 175, 126, 18, 119, 242, + 14, 67, 254, 147, 62, 61, 58, 54, 42, 75, 134, 163, 134, 56, 20, + 222, 1, 199, 168, 38, 142, 114, 14, 84, 106, 218, 24, 245, 129, 59, + 86, 217, 80, 79, 119, 218, 53, 136, 124, 63, 90, 179, 205, 112, 192, + 116, 186, 223, 65, 52, 109, 169, 196, 209, 73, 239, 124, 224, 15, 78, + 134, 164, 65, 189, 58, 22, 166, 57, 64, 104, 185, 101, 43, 231, 254, + 145, 156, 74, 38, 201, 121, 28, 25, 221, 129, 82, 26, 14, 36, 32, + 158, 208, 70, 2, 201, 70, 190, 208, 246, 54, 239, 158, 140, 212, 225, + 209, 177, 86, 31, 32, 45, 93, 207, 255, 12, 176, 154, 217, 193, 166, + 61, 241, 53, 80, 37, 214, 34, 65, 207, 114, 163, 132, 116, 133, 63, + 217, 234, 5, 111, 188, 79, 1, 110, 88, 156, 17, 242, 1, 138, 105, + 144, 213, 123, 212, 7, 164, 200, 175, 161, 145, 108, 104, 174, 202, 202, + 35, 153, 88, 138, 105, 58, 143, 57, 227, 90, 38, 189, 38, 66, 80, + 222, 174, 7, 202, 57, 236, 239, 104, 51, 26, 252, 140, 2, 74, 4, + 163, 211, 199, 202, 185, 65, 203, 13, 210, 69, 228, 115, 31, 100, 143, + 189, 100, 228, 209, 107, 55, 72, 150, 255, 144, 232, 155, 15, 42, 18, + 149, 49, 207, 32, 148, 178, 112, 254, 67, 51, 14, 217, 41, 203, 217, + 205, 101, 223, 161, 148, 33, 92, 164, 250, 91, 80, 251, 104, 157, 225, + 172, 18, 245, 5, 54, 30, 8, 254, 109, 3, 202, 215, 179, 161, 236, + 147, 104, 254, 232, 217, 124, 178, 1, 206, 38, 168, 77, 8, 112, 234, + 154, 162, 94, 3, 90, 94, 114, 137, 115, 42, 98, 202, 0, 214, 202, + 65, 93, 52, 179, 123, 74, 86, 10, 171, 211, 171, 44, 226, 56, 13, + 163, 7, 146, 57, 253, 115, 93, 156, 132, 119, 146, 107, 98, 218, 19, + 195, 5, 195, 190, 231, 218, 143, 48, 65, 102, 92, 0, 244, 108, 148, + 144, 214, 99, 128, 208, 85, 124, 5, 75, 38, 131, 93, 38, 21, 170, + 24, 105, 170, 135, 152, 21, 38, 191, 251, 88, 178, 62, 84, 177, 239, + 61, 156, 63, 47, 195, 117, 159, 198, 182, 126, 216, 103, 165, 158, 51, + 70, 34, 33, 241, 216, 11, 50, 152, 157, 100, 30, 66, 147, 88, 38, + 17, 251, 19, 182, 71, 65, 199, 150, 215, 188, 188, 80, 83, 2, 83, + 73, 183, 251, 85, 101, 25, 173, 50, 243, 138, 194, 98, 209, 104, 219, + 25, 45, 111, 172, 115, 238, 149, 4, 205, 123, 112, 218, 192, 247, 102, + 191, 30, 225, 230, 36, 188, 219, 220, 19, 213, 127, 226, 227, 17, 90, + 216, 88, 129, 249, 230, 91, 42, 111, 102, 45, 42, 175, 161, 188, 195, + 184, 238, 57, 69, 88, 168, 167, 23, 64, 47, 201, 51, 79, 65, 117, + 254, 146, 100, 8, 30, 209, 42, 138, 132, 209, 241, 66, 249, 228, 192, + 48, 21, 75, 202, 123, 99, 76, 87, 34, 99, 32, 224, 140, 94, 90, + 178, 47, 165, 23, 227, 92, 218, 45, 44, 104, 9, 23, 94, 254, 195, + 16, 12, 105, 135, 48, 225, 7, 139, 148, 199, 157, 139, 243, 71, 254, + 15, 64, 143, 140, 3, 221, 218, 117, 118, 34, 177, 156, 50, 220, 99, + 219, 4, 247, 244, 16, 100, 51, 73, 85, 181, 24, 127, 102, 173, 238, + 205, 143, 68, 63, 44, 197, 106, 165, 150, 11, 244, 198, 36, 101, 10, + 79, 207, 183, 214, 228, 226, 226, 235, 77, 11, 175, 80, 90, 197, 35, + 99, 7, 121, 208, 236, 141, 171, 176, 158, 219, 162, 166, 168, 147, 2, + 131, 180, 57, 229, 106, 63, 194, 250, 21, 63, 152, 16, 109, 20, 208, + 227, 225, 10, 22, 2, 223, 128, 89, 100, 47, 101, 165, 0, 147, 198, + 47, 109, 94, 113, 183, 101, 113, 248, 79, 21, 26, 141, 176, 52, 118, + 71, 143, 174, 194, 248, 199, 194, 245, 105, 112, 92, 180, 22, 184, 218, + 78, 192, 41, 17, 171, 143, 203, 2, 81, 178, 177, 138, 101, 113, 190, + 77, 70, 73, 85, 228, 194, 2, 70, 191, 54, 43, 188, 233, 27, 135, + 140, 127, 10, 59, 38, 86, 226, 127, 166, 132, 69, 21, 200, 107, 33, + 89, 24, 152, 88, 90, 75, 144, 236, 44, 10, 121, 139, 169, 113, 127, + 104, 227, 164, 145, 69, 196, 233, 237, 127, 132, 204, 244, 178, 247, 191, + 207, 63, 135, 214, 135, 213, 151, 44, 43, 190, 32, 241, 221, 118, 81, + 145, 43, 29, 244, 239, 78, 245, 115, 229, 178, 255, 147, 16, 149, 255, + 154, 217, 226, 234, 99, 247, 146, 209, 42, 9, 74, 220, 199, 178, 165, + 246, 188, 22, 51, 136, 38, 63, 125, 45, 108, 190, 111, 72, 248, 57, + 16, 107, 120, 245, 158, 215, 136, 9, 25, 61, 162, 148, 109, 112, 193, + 56, 81, 121, 143, 208, 225, 20, 130, 245, 12, 81, 156, 189, 102, 23, + 51, 135, 76, 205, 59, 197, 152, 35, 80, 127, 168, 223, 48, 20, 104, + 57, 69, 132, 53, 72, 220, 161, 178, 219, 33, 37, 245, 58, 199, 17, + 246, 39, 2, 84, 251, 20, 62, 21, 56, 209, 143, 149, 24, 68, 59, + 17, 240, 215, 95, 195, 188, 231, 97, 41, 32, 98, 57, 107, 172, 90, + 159, 132, 150, 226, 75, 151, 144, 12, 111, 6, 253, 112, 213, 28, 179, + 232, 233, 73, 139, 84, 232, 204, 0, 148, 77, 48, 183, 37, 213, 67, + 195, 211, 206, 12, 110, 212, 180, 201, 229, 77, 7, 48, 221, 44, 102, + 23, 168, 145, 200, 77, 103, 7, 173, 247, 84, 110, 123, 23, 5, 145, + 154, 124, 95, 103, 89, 78, 136, 74, 47, 136, 86, 135, 250, 60, 228, + 64, 78, 228, 172, 111, 204, 89, 144, 119, 8, 248, 81, 70, 113, 89, + 113, 50, 70, 124, 182, 58, 179, 77, 197, 160, 136, 41, 195, 19, 163, + 222, 23, 34, 70, 203, 156, 137, 209, 146, 213, 112, 210, 203, 138, 236, + 36, 24, 57, 106, 75, 115, 112, 43, 229, 239, 154, 133, 160, 211, 36, + 241, 229, 94, 110, 224, 182, 162, 85, 189, 20, 125, 9, 26, 137, 185, + 177, 14, 138, 5, 225, 132, 174, 244, 209, 187, 92, 140, 29, 158, 111, + 150, 8, 32, 99, 99, 142, 213, 19, 101, 164, 64, 190, 61, 219, 198, + 118, 246, 217, 110, 173, 248, 24, 100, 216, 190, 118, 198, 209, 64, 238, + 205, 176, 46, 116, 131, 103, 243, 148, 123, 69, 136, 144, 46, 112, 112, + 162, 219, 21, 205, 136, 193, 152, 96, 134, 16, 22, 146, 190, 194, 19, + 119, 47, 44, 67, 131, 166, 109, 215, 159, 90, 88, 212, 11, 71, 235, + 55, 31, 4, 113, 172, 187, 169, 10, 144, 169, 108, 79, 145, 7, 29, + 24, 221, 230, 28, 113, 32, 190, 160, 67, 40, 43, 107, 222, 221, 175, + 180, 200, 217, 15, 128, 253, 206, 203, 106, 167, 163, 89, 29, 28, 247, + 240, 14, 121, 133, 218, 154, 167, 77, 98, 149, 151, 145, 4, 78, 232, + 135, 195, 121, 157, 216, 178, 211, 243, 201, 71, 220, 150, 119, 74, 71, + 110, 200, 234, 100, 105, 248, 47, 25, 35, 1, 241, 166, 6, 88, 41, + 246, 176, 181, 21, 75, 150, 20, 227, 19, 64, 226, 209, 194, 121, 174, + 240, 219, 133, 253, 161, 146, 230, 69, 122, 42, 165, 82, 78, 45, 185, + 61, 12, 14, 148, 13, 119, 155, 157, 28, 90, 226, 119, 9, 201, 199, + 64, 93, 120, 115, 138, 156, 235, 123, 52, 111, 149, 48, 73, 181, 204, + 181, 10, 157, 16, 55, 100, 243, 10, 29, 159, 139, 88, 16, 1, 31, + 201, 242, 2, 237, 186, 181, 217, 139, 102, 205, 119, 197, 201, 221, 108, + 205, 171, 54, 109, 31, 76, 199, 28, 160, 214, 14, 201, 25, 211, 189, + 144, 44, 69, 70, 205, 79, 150, 149, 108, 23, 8, 171, 60, 18, 127, + 161, 41, 71, 239, 168, 89, 140, 49, 149, 157, 109, 232, 141, 227, 239, + 247, 114, 174, 129, 19, 252, 130, 74, 202, 224, 73, 122, 246, 47, 147, + 8, 37, 60, 253, 101, 11, 171, 160, 39, 92, 180, 183, 40, 254, 233, + 117, 200, 139, 37, 140, 28, 35, 8, 10, 40, 167, 247, 248, 84, 215, + 58, 170, 2, 7, 1, 69, 214, 10, 7, 233, 209, 181, 212, 34, 68, + 46, 141, 198, 137, 248, 45, 130, 97, 123, 104, 141, 17, 126, 7, 199, + 55, 194, 160, 69, 39, 13, 70, 41, 63, 205, 99, 1, 69, 46, 92, + 77, 56, 20, 247, 224, 226, 60, 153, 81, 180, 91, 159, 156, 27, 119, + 114, 126, 210, 26, 123, 165, 204, 237, 81, 75, 130, 45, 60, 0, 155, + 11, 125, 27, 202, 35, 230, 101, 164, 86, 117, 226, 23, 171, 253, 222, + 223, 38, 104, 224, 124, 92, 251, 110, 145, 247, 198, 158, 25, 172, 84, + 49, 87, 1, 168, 95, 124, 146, 5, 46, 179, 198, 235, 69, 200, 63, + 212, 59, 110, 52, 195, 54, 71, 169, 234, 189, 58, 180, 149, 194, 10, + 118, 99, 66, 66, 123, 192, 248, 51, 237, 129, 10, 143, 94, 55, 135, + 247, 56, 163, 40, 139, 150, 192, 142, 64, 169, 90, 42, 116, 228, 62, + 67, 130, 212, 212, 23, 210, 182, 95, 109, 224, 185, 255, 156, 102, 184, + 171, 42, 98, 217, 218, 27, 80, 171, 125, 49, 233, 16, 238, 42, 102, + 61, 95, 180, 49, 192, 67, 112, 143, 106, 145, 185, 239, 180, 181, 120, + 24, 127, 215, 233, 123, 235, 104, 228, 248, 223, 90, 211, 211, 76, 179, + 198, 253, 220, 171, 247, 171, 11, 237, 17, 249, 81, 122, 111, 255, 213, + 120, 167, 192, 149, 102, 7, 204, 86, 107, 156, 83, 174, 18, 237, 143, + 85, 76, 245, 189, 86, 90, 118, 69, 100, 140, 121, 17, 255, 17, 209, + 144, 90, 3, 191, 201, 134, 108, 0, 196, 133, 153, 39, 248, 138, 215, + 73, 18, 21, 140, 172, 178, 154, 194, 170, 45, 112, 113, 213, 36, 155, + 0, 30, 213, 186, 39, 6, 241, 92, 111, 139, 52, 84, 58, 218, 187, + 60, 123, 113, 190, 185, 89, 242, 248, 221, 238, 173, 145, 214, 237, 133, + 101, 6, 143, 188, 116, 13, 189, 205, 203, 147, 140, 215, 175, 38, 99, + 77, 54, 98, 146, 54, 101, 40, 206, 175, 26, 195, 33, 63, 20, 210, + 96, 227, 125, 108, 230, 179, 123, 81, 135, 183, 132, 216, 56, 223, 197, + 141, 158, 114, 228, 67, 172, 95, 76, 69, 212, 188, 244, 12, 16, 158, + 119, 106, 44, 39, 36, 38, 164, 173, 182, 172, 210, 176, 19, 125, 6, + 36, 138, 77, 65, 219, 30, 45, 167, 21, 125, 49, 69, 173, 23, 242, + 246, 25, 155, 194, 161, 140, 125, 97, 153, 68, 120, 114, 23, 243, 242, + 192, 129, 68, 88, 43, 161, 33, 152, 130, 232, 179, 70, 156, 219, 198, + 1, 135, 3, 178, 49, 92, 30, 125, 185, 39, 185, 69, 143, 30, 180, + 113, 109, 233, 156, 101, 82, 239, 142, 58, 234, 151, 67, 2, 140, 198, + 7, 180, 167, 33, 168, 131, 213, 157, 139, 43, 208, 27, 217, 245, 115, + 0, 59, 155, 69, 236, 209, 101, 139, 211, 247, 2, 41, 113, 222, 7, + 2, 109, 61, 232, 215, 145, 18, 202, 158, 187, 136, 54, 190, 169, 13, + 59, 204, 117, 37, 160, 6, 121, 200, 9, 189, 31, 0, 251, 78, 223, + 43, 122, 5, 42, 24, 74, 247, 241, 68, 42, 49, 28, 153, 3, 40, + 166, 47, 55, 83, 186, 236, 69, 132, 91, 115, 132, 26, 214, 160, 51, + 161, 232, 147, 172, 175, 144, 53, 58, 241, 1, 245, 53, 126, 211, 121, + 98, 228, 65, 166, 9, 186, 93, 111, 249, 87, 109, 85, 218, 177, 160, + 225, 99, 131, 167, 173, 36, 10, 121, 121, 98, 249, 99, 68, 128, 159, + 217, 207, 65, 52, 247, 53, 58, 135, 11, 76, 238, 101, 162, 166, 100, + 126, 136, 157, 43, 172, 186, 157, 138, 2, 132, 141, 165, 152, 92, 234, + 3, 92, 81, 111, 83, 239, 234, 204, 152, 240, 74, 198, 42, 56, 131, + 104, 96, 83, 207, 109, 30, 185, 45, 242, 2, 155, 47, 18, 111, 119, + 57, 239, 7, 88, 45, 86, 239, 10, 178, 146, 58, 248, 96, 166, 234, + 253, 202, 224, 111, 120, 216, 70, 205, 29, 154, 232, 216, 165, 222, 76, + 153, 46, 5, 143, 71, 197, 175, 198, 127, 231, 119, 110, 47, 128, 61, + 134, 41, 115, 101, 3, 35, 127, 201, 12, 152, 1, 163, 41, 91, 233, + 10, 230, 150, 44, 140, 234, 164, 184, 214, 218, 114, 23, 221, 163, 57, + 2, 5, 147, 66, 223, 90, 238, 136, 95, 138, 116, 27, 91, 223, 52, + 243, 246, 183, 215, 166, 170, 169, 8, 140, 91, 173, 160, 160, 105, 69, + 241, 31, 33, 33, 148, 215, 67, 130, 181, 1, 114, 104, 206, 192, 195, + 247, 229, 99, 84, 29, 2, 132, 146, 191, 243, 37, 36, 46, 176, 164, + 68, 84, 121, 159, 6, 160, 195, 170, 43, 128, 130, 165, 44, 157, 83, + 173, 182, 93, 90, 202, 227, 133, 140, 39, 203, 202, 2, 49, 96, 178, + 190, 147, 15, 99, 71, 216, 166, 97, 130, 87, 4, 149, 23, 107, 246, + 216, 213, 222, 64, 41, 215, 37, 211, 21, 53, 90, 130, 165, 181, 188, + 87, 70, 8, 53, 114, 227, 18, 192, 19, 200, 195, 83, 228, 1, 171, + 202, 229, 92, 92, 227, 48, 251, 31, 198, 59, 162, 119, 9, 75, 115, + 30, 127, 8, 89, 99, 249, 86, 152, 198, 53, 207, 82, 251, 68, 82, + 247, 21, 214, 18, 246, 118, 81, 94, 240, 34, 174, 233, 205, 204, 71, + 0, 254, 24, 178, 166, 248, 12, 70, 187, 163, 168, 95, 23, 108, 156, + 210, 244, 198, 216, 54, 32, 83, 158, 121, 26, 116, 252, 122, 73, 188, + 134, 154, 180, 229, 139, 102, 2, 8, 171, 201, 5, 187, 57, 35, 254, + 35, 19, 161, 16, 88, 215, 158, 148, 249, 201, 65, 177, 144, 69, 138, + 161, 220, 255, 190, 223, 43, 181, 11, 158, 103, 193, 14, 21, 49, 16, + 40, 223, 155, 12, 164, 23, 31, 15, 20, 238, 131, 85, 181, 80, 149, + 128, 196, 123, 155, 236, 9, 94, 252, 182, 54, 62, 215, 115, 115, 224, + 242, 141, 137, 238, 115, 101, 107, 65, 202, 79, 79, 27, 239, 29, 154, + 19, 18, 4, 185, 144, 191, 107, 92, 29, 38, 248, 142, 81, 109, 64, + 161, 23, 73, 93, 31, 114, 51, 81, 98, 209, 69, 27, 43, 22, 4, + 168, 88, 60, 149, 89, 100, 82, 122, 95, 21, 38, 97, 185, 87, 66, + 82, 16, 242, 109, 100, 94, 164, 6, 73, 130, 76, 137, 218, 226, 166, + 35, 21, 156, 72, 253, 148, 228, 142, 134, 41, 145, 15, 144, 215, 187, + 120, 239, 195, 203, 44, 250, 46, 72, 181, 43, 255, 81, 247, 100, 195, + 248, 208, 115, 141, 32, 190, 131, 77, 230, 220, 54, 197, 60, 22, 115, + 177, 116, 250, 0, 60, 144, 128, 68, 245, 231, 199, 216, 17, 216, 227, + 120, 221, 68, 233, 236, 202, 121, 189, 237, 149, 60, 244, 130, 250, 169, + 70, 101, 147, 8, 49, 248, 61, 207, 202, 148, 228, 87, 234, 117, 238, + 52, 92, 118, 148, 203, 206, 175, 75, 64, 215, 57, 70, 196, 52, 62, + 29, 116, 241, 185, 96, 131, 201, 219, 16, 3, 188, 159, 129, 134, 11, + 138, 13, 3, 72, 193, 183, 236, 91, 171, 161, 52, 166, 23, 254, 118, + 238, 180, 55, 215, 165, 163, 154, 202, 27, 61, 150, 31, 12, 1, 249, + 0, 12, 29, 132, 213, 168, 105, 53, 112, 54, 2, 236, 131, 230, 3, + 211, 69, 243, 233, 173, 145, 105, 27, 18, 252, 224, 5, 46, 18, 233, + 96, 237, 143, 52, 67, 158, 30, 242, 151, 98, 148, 208, 60, 143, 14, + 245, 250, 185, 151, 111, 147, 145, 197, 165, 233, 18, 178, 240, 83, 228, + 213, 237, 58, 20, 152, 249, 241, 250, 204, 15, 167, 97, 242, 6, 228, + 117, 133, 2, 199, 220, 212, 239, 206, 104, 231, 145, 33, 17, 150, 223, + 126, 173, 223, 148, 21, 228, 41, 63, 37, 19, 102, 73, 95, 196, 40, + 151, 2, 19, 239, 182, 22, 178, 165, 242, 159, 208, 226, 72, 179, 201, + 109, 157, 18, 230, 130, 221, 89, 173, 242, 170, 11, 146, 20, 135, 112, + 2, 202, 30, 25, 106, 151, 52, 223, 1, 3, 18, 151, 74, 113, 49, + 186, 112, 160, 121, 38, 233, 155, 188, 237, 251, 178, 8, 200, 120, 134, + 152, 22, 232, 250, 219, 237, 157, 23, 134, 158, 122, 202, 120, 89, 248, + 68, 46, 184, 180, 93, 84, 85, 177, 236, 62, 50, 103, 62, 81, 105, + 33, 15, 97, 203, 192, 132, 219, 70, 203, 104, 162, 98, 179, 224, 44, + 101, 221, 84, 176, 97, 77, 84, 45, 255, 227, 80, 107, 45, 70, 106, + 68, 206, 134, 182, 205, 255, 235, 44, 131, 81, 126, 142, 30, 130, 87, + 133, 227, 15, 200, 194, 5, 230, 230, 169, 65, 116, 104, 193, 196, 214, + 18, 199, 56, 114, 5, 7, 189, 158, 32, 119, 53, 93, 169, 172, 141, + 223, 71, 194, 204, 221, 237, 118, 16, 198, 169, 10, 38, 156, 152, 76, + 185, 73, 15, 227, 118, 57, 149, 160, 14, 158, 18, 139, 117, 249, 142, + 12, 175, 252, 9, 202, 65, 196, 23, 211, 174, 169, 85, 244, 154, 239, + 28, 199, 196, 171, 241, 27, 140, 222, 54, 25, 229, 69, 102, 134, 125, + 235, 246, 156, 41, 75, 212, 225, 169, 207, 88, 246, 136, 176, 27, 40, + 205, 228, 239, 24, 217, 42, 212, 63, 187, 75, 60, 197, 97, 245, 3, + 35, 243, 128, 36, 129, 145, 31, 27, 193, 20, 122, 116, 143, 130, 159, + 80, 203, 253, 233, 66, 118, 92, 177, 83, 55, 141, 189, 115, 240, 125, + 107, 8, 221, 237, 171, 24, 183, 220, 174, 149, 51, 81, 221, 187, 233, + 21, 116, 37, 88, 123, 20, 208, 201, 141, 155, 136, 148, 64, 14, 102, + 204, 248, 173, 249, 61, 75, 253, 199, 46, 192, 138, 79, 83, 161, 127, + 235, 140, 173, 158, 127, 232, 77, 17, 45, 207, 154, 51, 79, 57, 184, + 22, 220, 225, 61, 233, 188, 119, 221, 254, 87, 105, 151, 29, 156, 162, + 18, 202, 244, 36, 105, 24, 240, 195, 198, 39, 31, 155, 135, 62, 220, + 180, 53, 70, 121, 254, 234, 194, 79, 177, 181, 75, 23, 20, 217, 209, + 107, 100, 175, 83, 25, 212, 62, 11, 108, 33, 144, 17, 150, 176, 225, + 86, 54, 190, 8, 82, 150, 219, 80, 72, 75, 100, 197, 72, 95, 174, + 189, 158, 109, 146, 103, 67, 101, 165, 191, 178, 148, 32, 173, 147, 195, + 145, 27, 119, 126, 46, 186, 120, 226, 41, 209, 51, 171, 29, 4, 244, + 184, 209, 92, 159, 221, 122, 163, 30, 246, 68, 8, 190, 146, 143, 159, + 116, 211, 83, 247, 90, 241, 193, 10, 58, 250, 60, 69, 182, 204, 181, + 207, 107, 37, 104, 150, 14, 69, 55, 20, 7, 158, 96, 202, 248, 68, + 220, 209, 132, 133, 164, 58, 175, 103, 166, 1, 174, 0, 32, 182, 13, + 199, 83, 48, 148, 52, 198, 19, 135, 58, 46, 109, 164, 49, 199, 26, + 109, 132, 19, 46, 118, 59, 27, 202, 73, 4, 1, 22, 183, 163, 247, + 45, 96, 206, 43, 239, 186, 131, 5, 61, 198, 46, 99, 31, 89, 194, + 241, 207, 170, 80, 250, 72, 225, 89, 154, 151, 165, 171, 42, 59, 58, + 68, 73, 178, 88, 153, 111, 247, 233, 19, 130, 51, 194, 18, 142, 129, + 52, 252, 167, 183, 238, 99, 198, 85, 134, 20, 114, 94, 90, 7, 223, + 147, 178, 135, 156, 216, 69, 14, 42, 181, 232, 203, 63, 239, 213, 42, + 225, 189, 223, 15, 238, 219, 62, 218, 15, 210, 141, 184, 226, 11, 228, + 9, 40, 37, 118, 26, 194, 213, 220, 99, 247, 7, 137, 187, 61, 64, + 56, 86, 169, 143, 224, 135, 166, 4, 28, 55, 87, 216, 45, 56, 39, + 37, 181, 234, 38, 4, 241, 184, 43, 134, 108, 245, 247, 230, 99, 162, + 95, 214, 92, 191, 83, 38, 152, 241, 38, 33, 32, 38, 92, 222, 228, + 138, 11, 143, 135, 83, 181, 140, 99, 9, 252, 123, 215, 212, 81, 108, + 71, 2, 159, 246, 82, 118, 186, 48, 69, 212, 147, 218, 61, 183, 170, + 130, 233, 227, 145, 101, 156, 20, 106, 128, 214, 238, 12, 163, 59, 152, + 250, 112, 173, 42, 5, 1, 68, 35, 52, 13, 198, 121, 11, 117, 16, + 126, 143, 54, 184, 205, 44, 238, 47, 218, 75, 112, 228, 183, 55, 22, + 189, 35, 146, 27, 44, 229, 190, 241, 110, 42, 152, 12, 141, 131, 183, + 84, 31, 40, 185, 108, 176, 173, 247, 217, 214, 155, 108, 176, 152, 201, + 201, 185, 7, 227, 187, 87, 71, 45, 98, 224, 159, 125, 230, 132, 19, + 233, 98, 174, 93, 80, 245, 32, 94, 253, 35, 150, 68, 176, 83, 50, + 127, 196, 149, 176, 191, 136, 194, 84, 228, 106, 238, 47, 206, 110, 204, + 9, 116, 136, 230, 249, 90, 215, 160, 51, 151, 61, 92, 187, 82, 129, + 101, 75, 238, 22, 166, 132, 86, 183, 113, 149, 215, 39, 242, 214, 148, + 71, 168, 236, 20, 105, 249, 219, 23, 101, 63, 92, 173, 40, 126, 253, + 145, 161, 9, 72, 60, 215, 59, 155, 228, 255, 201, 193, 60, 129, 51, + 29, 207, 237, 43, 145, 161, 41, 115, 98, 19, 138, 253, 66, 232, 233, + 186, 79, 114, 1, 164, 184, 14, 61, 151, 198, 60, 247, 115, 5, 176, + 132, 201, 245, 60, 21, 238, 60, 133, 186, 18, 154, 89, 170, 23, 102, + 2, 111, 147, 25, 208, 152, 173, 13, 58, 125, 181, 115, 218, 196, 107, + 173, 192, 60, 94, 140, 254, 83, 80, 214, 220, 245, 254, 250, 39, 202, + 132, 142, 84, 16, 199, 20, 129, 159, 24, 18, 123, 143, 157, 176, 199, + 173, 56, 169, 222, 252, 63, 27, 242, 137, 138, 253, 143, 4, 209, 124, + 86, 243, 170, 152, 121, 231, 24, 238, 35, 113, 27, 205, 59, 153, 161, + 234, 65, 153, 237, 97, 197, 98, 216, 129, 30, 174, 211, 193, 167, 102, + 229, 240, 198, 85, 193, 253, 73, 118, 185, 63, 3, 227, 165, 139, 38, + 109, 214, 108, 253, 48, 227, 253, 219, 1, 226, 89, 47, 145, 86, 8, + 234, 146, 159, 230, 108, 212, 111, 112, 129, 121, 28, 164, 105, 138, 143, + 106, 132, 254, 202, 177, 171, 123, 38, 162, 112, 97, 88, 221, 95, 5, + 161, 222, 76, 234, 253, 239, 231, 13, 62, 243, 80, 164, 204, 67, 229, + 43, 103, 152, 30, 131, 240, 218, 184, 149, 161, 234, 124, 238, 126, 33, + 234, 133, 1, 201, 113, 176, 190, 231, 215, 99, 64, 219, 224, 29, 217, + 23, 232, 185, 215, 56, 14, 128, 31, 227, 227, 80, 213, 239, 224, 36, + 144, 26, 243, 36, 181, 129, 69, 104, 55, 42, 212, 27, 252, 74, 173, + 196, 255, 96, 153, 53, 3, 99, 13, 167, 244, 183, 92, 231, 140, 210, + 116, 98, 36, 187, 126, 84, 77, 144, 109, 126, 138, 53, 237, 100, 96, + 209, 68, 204, 61, 104, 246, 64, 35, 98, 99, 82, 152, 68, 118, 51, + 82, 101, 136, 76, 149, 234, 135, 110, 37, 167, 154, 17, 145, 150, 148, + 89, 184, 123, 108, 255, 2, 49, 98, 101, 125, 88, 110, 2, 146, 130, + 120, 212, 249, 21, 164, 164, 161, 47, 201, 70, 114, 46, 149, 0, 88, + 142, 60, 228, 58, 181, 175, 207, 222, 199, 81, 135, 121, 200, 205, 143, + 132, 31, 93, 179, 202, 132, 84, 3, 19, 40, 190, 99, 120, 38, 42, + 165, 159, 18, 153, 99, 212, 120, 4, 237, 237, 8, 57, 69, 228, 186, + 220, 183, 121, 139, 113, 179, 200, 21, 166, 75, 19, 149, 135, 138, 170, + 149, 14, 166, 110, 94, 129, 233, 66, 187, 163, 213, 96, 172, 4, 145, + 205, 41, 25, 97, 26, 66, 99, 104, 172, 227, 73, 193, 35, 142, 228, + 202, 85, 209, 10, 77, 47, 21, 8, 14, 215, 104, 211, 62, 186, 19, + 226, 180, 187, 81, 140, 101, 188, 252, 173, 1, 242, 9, 66, 177, 73, + 5, 79, 230, 53, 67, 28, 207, 98, 199, 52, 27, 66, 153, 200, 135, + 247, 246, 210, 128, 156, 173, 249, 92, 165, 93, 112, 247, 110, 0, 133, + 56, 64, 199, 71, 135, 104, 242, 50, 218, 28, 242, 216, 223, 229, 92, + 19, 39, 36, 161, 233, 104, 205, 56, 92, 20, 44, 81, 244, 215, 85, + 116, 79, 44, 104, 236, 197, 72, 17, 157, 105, 213, 76, 90, 85, 9, + 54, 76, 248, 27, 39, 175, 107, 79, 142, 31, 140, 48, 194, 73, 214, + 79, 131, 65, 191, 175, 211, 154, 225, 182, 226, 90, 169, 178, 95, 71, + 89, 3, 4, 83, 27, 152, 218, 67, 67, 225, 90, 159, 244, 215, 227, + 41, 53, 214, 40, 178, 86, 46, 92, 27, 200, 104, 126, 203, 185, 150, + 90, 220, 210, 140, 33, 238, 113, 54, 31, 121, 4, 49, 132, 62, 250, + 9, 180, 120, 241, 248, 86, 67, 254, 57, 166, 141, 34, 165, 218, 73, + 167, 166, 85, 50, 191, 136, 177, 212, 175, 133, 8, 30, 106, 201, 100, + 208, 40, 119, 107, 182, 231, 27, 237, 58, 22, 225, 63, 21, 160, 176, + 7, 223, 124, 229, 53, 246, 170, 155, 70, 75, 68, 204, 221, 146, 48, + 109, 153, 25, 0, 157, 54, 208, 220, 240, 216, 113, 30, 230, 30, 46, + 139, 116, 215, 222, 10, 247, 103, 24, 86, 125, 8, 77, 202, 39, 152, + 10, 225, 131, 18, 117, 227, 249, 127, 160, 143, 86, 128, 207, 99, 207, + 224, 42, 110, 232, 36, 86, 179, 249, 138, 84, 121, 50, 5, 149, 93, + 7, 200, 115, 209, 110, 152, 124, 77, 52, 79, 221, 157, 195, 140, 54, + 19, 60, 205, 158, 199, 127, 207, 7, 117, 11, 227, 197, 72, 199, 187, + 184, 43, 95, 0, 61, 143, 176, 207, 65, 130, 87, 82, 140, 181, 182, + 184, 223, 238, 244, 209, 170, 7, 11, 100, 83, 5, 98, 125, 26, 188, + 40, 137, 242, 22, 249, 227, 184, 80, 44, 145, 32, 143, 254, 218, 115, + 107, 76, 139, 212, 87, 253, 12, 11, 121, 216, 159, 121, 87, 182, 101, + 205, 151, 5, 0, 126, 150, 6, 166, 115, 36, 14, 128, 159, 126, 200, + 42, 189, 146, 192, 223, 186, 35, 71, 224, 63, 33, 211, 207, 93, 66, + 201, 31, 66, 220, 66, 97, 107, 95, 157, 213, 92, 81, 217, 125, 242, + 101, 243, 184, 255, 155, 2, 165, 9, 143, 103, 243, 133, 173, 202, 202, + 40, 221, 73, 177, 248, 57, 243, 125, 130, 127, 102, 47, 3, 227, 27, + 203, 33, 179, 249, 117, 28, 112, 157, 0, 210, 139, 43, 15, 192, 47, + 202, 45, 132, 10, 26, 163, 47, 220, 65, 169, 225, 235, 120, 57, 25, + 176, 206, 16, 38, 110, 84, 145, 28, 43, 63, 35, 144, 234, 249, 59, + 22, 152, 16, 175, 248, 2, 6, 109, 55, 92, 124, 77, 237, 166, 207, + 82, 238, 140, 22, 30, 214, 144, 177, 182, 229, 27, 180, 150, 186, 187, + 231, 184, 242, 23, 178, 119, 36, 24, 165, 82, 15, 195, 55, 147, 107, + 45, 198, 133, 194, 95, 20, 146, 8, 222, 235, 67, 80, 119, 234, 48, + 223, 163, 51, 60, 217, 228, 171, 195, 231, 250, 46, 111, 138, 143, 1, + 48, 174, 116, 197, 186, 40, 61, 177, 53, 65, 225, 171, 95, 186, 209, + 199, 254, 152, 98, 179, 71, 140, 127, 193, 177, 171, 61, 227, 117, 130, + 92, 148, 43, 199, 156, 176, 219, 52, 218, 133, 160, 123, 11, 221, 104, + 254, 253, 144, 156, 245, 5, 156, 246, 226, 198, 222, 172, 246, 13, 35, + 210, 51, 99, 203, 213, 159, 248, 139, 71, 77, 120, 75, 195, 89, 11, + 122, 125, 43, 57, 30, 233, 45, 10, 87, 102, 171, 47, 21, 167, 175, + 143, 207, 121, 98, 48, 220, 247, 72, 184, 97, 83, 152, 72, 51, 136, + 17, 52, 249, 169, 8, 140, 219, 152, 5, 221, 132, 225, 17, 117, 28, + 72, 220, 69, 199, 108, 140, 175, 206, 165, 41, 39, 77, 194, 249, 154, + 121, 23, 85, 205, 128, 34, 118, 49, 220, 85, 5, 240, 181, 26, 210, + 29, 177, 24, 132, 91, 57, 218, 74, 217, 135, 225, 148, 82, 95, 98, + 54, 127, 58, 1, 85, 12, 122, 2, 58, 81, 16, 32, 168, 153, 186, + 97, 214, 81, 176, 244, 134, 168, 111, 127, 21, 251, 227, 215, 141, 191, + 141, 90, 21, 177, 142, 172, 29, 212, 128, 163, 54, 172, 20, 35, 174, + 1, 225, 232, 74, 73, 226, 154, 236, 45, 211, 64, 28, 142, 90, 175, + 147, 230, 243, 66, 160, 207, 186, 212, 201, 34, 58, 202, 236, 9, 218, + 10, 226, 189, 74, 106, 75, 43, 93, 1, 5, 162, 36, 42, 54, 86, + 83, 35, 242, 114, 165, 93, 76, 8, 94, 21, 110, 101, 241, 119, 219, + 78, 115, 182, 5, 105, 116, 73, 50, 193, 102, 254, 43, 197, 64, 236, + 6, 105, 84, 206, 79, 127, 195, 151, 106, 76, 122, 173, 234, 203, 34, + 20, 204, 34, 195, 244, 209, 60, 32, 112, 157, 150, 185, 49, 35, 11, + 41, 230, 21, 63, 137, 1, 127, 147, 193, 77, 136, 174, 109, 122, 243, + 119, 160, 26, 5, 187, 191, 90, 83, 26, 214, 237, 162, 198, 184, 179, + 204, 246, 113, 43, 145, 228, 4, 250, 28, 187, 22, 149, 121, 67, 94, + 202, 229, 64, 35, 204, 174, 106, 180, 40, 224, 146, 117, 146, 217, 9, + 29, 22, 202, 177, 96, 25, 165, 0, 97, 146, 120, 15, 29, 230, 203, + 30, 181, 73, 37, 59, 38, 156, 8, 123, 215, 252, 229, 157, 240, 58, + 91, 78, 3, 189, 39, 232, 28, 175, 195, 69, 94, 127, 176, 218, 32, + 40, 236, 113, 175, 110, 241, 181, 238, 15, 46, 106, 58, 170, 48, 58, + 254, 253, 190, 204, 172, 214, 31, 202, 150, 134, 97, 230, 224, 255, 121, + 206, 110, 102, 224, 49, 94, 248, 23, 109, 243, 23, 208, 50, 120, 155, + 166, 16, 193, 8, 111, 212, 88, 114, 163, 247, 255, 144, 18, 87, 92, + 47, 60, 250, 35, 102, 101, 150, 228, 34, 28, 18, 59, 175, 136, 120, + 186, 193, 15, 151, 143, 76, 54, 96, 157, 183, 62, 4, 245, 231, 132, + 94, 131, 139, 192, 253, 72, 194, 242, 7, 202, 19, 20, 245, 122, 114, + 177, 101, 133, 107, 109, 109, 112, 151, 71, 239, 115, 43, 157, 185, 57, + 149, 27, 82, 191, 118, 114, 80, 96, 115, 166, 79, 166, 59, 23, 91, + 223, 159, 217, 68, 63, 155, 173, 200, 73, 32, 199, 233, 241, 206, 133, + 125, 89, 87, 71, 172, 91, 56, 219, 233, 115, 26, 63, 53, 98, 209, + 57, 151, 243, 141, 54, 139, 107, 120, 252, 89, 249, 133, 67, 85, 144, + 135, 86, 238, 9, 133, 115, 95, 92, 97, 212, 81, 117, 70, 225, 199, + 123, 49, 84, 16, 84, 19, 134, 156, 33, 78, 195, 79, 191, 112, 44, + 206, 81, 249, 191, 4, 106, 159, 152, 246, 185, 246, 125, 7, 186, 106, + 239, 25, 144, 121, 78, 194, 199, 195, 218, 118, 189, 66, 2, 220, 105, + 0, 77, 65, 137, 55, 169, 82, 156, 126, 146, 139, 71, 44, 247, 210, + 45, 171, 110, 252, 221, 51, 80, 157, 164, 99, 10, 241, 175, 65, 32, + 180, 254, 187, 89, 223, 231, 227, 216, 197, 99, 217, 65, 187, 235, 152, + 63, 74, 176, 36, 170, 236, 134, 46, 98, 13, 108, 160, 126, 185, 245, + 100, 96, 40, 240, 69, 171, 10, 2, 141, 57, 105, 56, 82, 168, 46, + 126, 161, 5, 219, 126, 1, 1, 165, 92, 219, 81, 202, 86, 78, 174, + 209, 195, 7, 142, 244, 119, 255, 115, 242, 220, 11, 168, 135, 5, 71, + 145, 137, 108, 10, 17, 30, 178, 142, 202, 147, 24, 141, 161, 192, 79, + 54, 62, 142, 239, 66, 209, 248, 101, 134, 83, 10, 119, 121, 22, 240, + 25, 227, 60, 180, 18, 46, 164, 105, 89, 30, 196, 167, 206, 32, 32, + 76, 54, 35, 10, 210, 170, 114, 127, 0, 216, 28, 71, 6, 216, 15, + 56, 201, 194, 246, 115, 182, 231, 202, 62, 218, 93, 252, 151, 125, 48, + 231, 133, 89, 67, 175, 88, 80, 25, 208, 80, 251, 226, 12, 4, 225, + 125, 37, 78, 202, 227, 212, 179, 219, 234, 223, 207, 188, 126, 214, 22, + 59, 134, 161, 108, 10, 115, 65, 40, 68, 211, 192, 129, 64, 163, 178, + 183, 164, 98, 212, 20, 146, 25, 16, 154, 29, 176, 107, 3, 15, 62, + 226, 67, 119, 189, 45, 123, 187, 83, 222, 206, 56, 135, 242, 121, 61, + 220, 133, 171, 150, 139, 221, 69, 112, 13, 183, 180, 76, 97, 122, 168, + 79, 203, 136, 62, 161, 138, 40, 253, 182, 3, 51, 229, 58, 195, 79, + 191, 203, 248, 191, 180, 101, 40, 189, 22, 127, 67, 139, 219, 213, 78, + 11, 67, 215, 82, 41, 107, 54, 143, 72, 223, 89, 246, 156, 91, 11, + 157, 16, 225, 237, 213, 148, 187, 201, 233, 101, 70, 211, 201, 113, 164, + 185, 140, 169, 130, 42, 1, 222, 92, 59, 66, 17, 108, 67, 197, 192, + 251, 55, 203, 109, 189, 230, 131, 237, 215, 241, 65, 148, 253, 241, 39, + 141, 155, 148, 156, 244, 12, 68, 71, 109, 235, 241, 4, 161, 177, 218, + 114, 173, 113, 146, 11, 3, 219, 33, 141, 215, 62, 45, 215, 184, 196, + 97, 162, 250, 218, 110, 1, 190, 8, 67, 241, 94, 82, 196, 64, 85, + 118, 139, 240, 71, 67, 49, 241, 49, 129, 247, 44, 211, 46, 227, 115, + 140, 123, 192, 63, 82, 9, 155, 83, 167, 250, 70, 61, 66, 186, 217, + 46, 155, 128, 255, 232, 56, 224, 32, 254, 12, 204, 2, 85, 173, 20, + 75, 214, 73, 229, 18, 247, 145, 83, 241, 20, 245, 155, 15, 92, 111, + 180, 101, 179, 246, 5, 243, 112, 196, 44, 146, 16, 128, 155, 80, 106, + 147, 110, 87, 96, 17, 243, 247, 21, 87, 149, 78, 248, 20, 153, 249, + 196, 11, 177, 96, 227, 185, 136, 7, 244, 54, 177, 91, 192, 193, 111, + 21, 159, 105, 143, 236, 167, 215, 244, 121, 207, 245, 202, 161, 215, 45, + 233, 32, 123, 220, 57, 34, 171, 115, 37, 163, 75, 253, 140, 232, 51, + 143, 204, 252, 146, 168, 85, 148, 201, 161, 181, 231, 125, 44, 172, 79, + 210, 12, 147, 82, 38, 254, 157, 225, 167, 230, 182, 123, 63, 141, 146, + 152, 136, 190, 80, 156, 163, 231, 33, 184, 58, 200, 134, 28, 70, 202, + 88, 195, 39, 224, 159, 154, 206, 183, 11, 96, 102, 136, 26, 238, 179, + 189, 226, 18, 30, 188, 148, 25, 3, 252, 154, 142, 147, 145, 126, 11, + 55, 1, 3, 108, 144, 55, 251, 167, 54, 127, 180, 216, 77, 70, 138, + 95, 166, 90, 48, 2, 211, 236, 235, 131, 107, 251, 91, 238, 255, 0, + 113, 41, 243, 14, 241, 252, 163, 99, 74, 25, 172, 87, 125, 36, 203, + 96, 189, 125, 222, 165, 138, 25, 76, 136, 67, 137, 161, 22, 232, 31, + 5, 96, 146, 214, 146, 21, 181, 198, 199, 34, 190, 63, 191, 201, 104, + 116, 123, 201, 64, 128, 84, 139, 86, 102, 244, 241, 162, 126, 4, 9, + 132, 2, 53, 113, 21, 1, 95, 7, 212, 123, 252, 100, 87, 78, 71, + 28, 131, 135, 183, 72, 196, 33, 66, 237, 12, 135, 58, 102, 69, 234, + 214, 244, 57, 44, 181, 120, 156, 218, 99, 146, 97, 15, 77, 113, 179, + 142, 113, 226, 38, 72, 128, 211, 160, 95, 52, 181, 30, 200, 64, 234, + 8, 229, 150, 219, 225, 30, 162, 223, 52, 242, 29, 31, 226, 91, 102, + 235, 127, 213, 105, 123, 11, 172, 190, 152, 59, 69, 1, 253, 126, 19, + 145, 99, 33, 26, 198, 80, 74, 47, 59, 77, 158, 60, 231, 51, 65, + 145, 210, 232, 71, 100, 73, 71, 176, 239, 42, 124, 176, 31, 254, 64, + 223, 51, 195, 108, 165, 78, 202, 174, 212, 32, 157, 58, 145, 133, 84, + 230, 17, 206, 107, 72, 89, 129, 240, 179, 56, 231, 218, 55, 236, 231, + 122, 137, 50, 245, 171, 107, 223, 86, 17, 155, 68, 241, 220, 120, 38, + 95, 74, 110, 214, 202, 223, 60, 35, 120, 33, 79, 32, 58, 77, 28, + 121, 180, 99, 64, 201, 81, 156, 37, 28, 254, 219, 153, 74, 200, 178, + 70, 252, 140, 137, 127, 195, 238, 103, 228, 44, 96, 216, 12, 198, 246, + 206, 130, 67, 71, 129, 114, 145, 168, 64, 145, 128, 169, 169, 11, 28, + 145, 64, 144, 92, 206, 171, 135, 128, 121, 84, 142, 75, 37, 199, 208, + 97, 243, 114, 58, 152, 244, 201, 119, 76, 178, 3, 128, 185, 252, 146, + 38, 165, 53, 186, 175, 102, 81, 233, 115, 190, 227, 19, 31, 134, 132, + 114, 24, 2, 21, 249, 228, 128, 74, 119, 144, 74, 43, 168, 201, 131, + 175, 254, 42, 103, 23, 94, 138, 61, 40, 129, 252, 51, 80, 150, 135, + 133, 55, 54, 122, 187, 93, 42, 9, 154, 50, 93, 143, 241, 26, 80, + 108, 7, 51, 144, 218, 129, 48, 168, 66, 150, 108, 86, 127, 156, 232, + 5, 54, 7, 182, 73, 210, 46, 115, 84, 145, 113, 254, 195, 166, 106, + 119, 116, 233, 154, 170, 185, 255, 99, 223, 133, 115, 122, 10, 210, 76, + 123, 92, 28, 159, 138, 133, 70, 126, 240, 215, 36, 119, 180, 221, 156, + 46, 89, 71, 1, 175, 247, 102, 107, 67, 136, 62, 142, 197, 212, 50, + 159, 107, 254, 44, 30, 59, 234, 51, 55, 35, 103, 170, 231, 41, 111, + 178, 14, 27, 77, 40, 43, 88, 199, 148, 211, 140, 17, 59, 84, 182, + 195, 92, 230, 109, 218, 165, 117, 39, 234, 195, 94, 70, 151, 202, 167, + 17, 179, 205, 213, 68, 102, 11, 120, 210, 150, 47, 150, 115, 186, 81, + 137, 53, 132, 36, 224, 107, 115, 100, 143, 118, 212, 239, 176, 139, 243, + 36, 235, 189, 48, 43, 25, 130, 143, 2, 165, 117, 173, 63, 189, 86, + 180, 83, 22, 204, 226, 141, 78, 199, 226, 195, 94, 183, 88, 103, 180, + 205, 96, 254, 235, 65, 144, 231, 11, 193, 111, 52, 129, 110, 125, 68, + 42, 234, 138, 118, 112, 69, 178, 191, 213, 115, 230, 221, 222, 97, 60, + 187, 154, 161, 24, 25, 147, 205, 69, 47, 45, 241, 84, 238, 249, 129, + 6, 107, 126, 245, 187, 62, 247, 159, 178, 6, 100, 80, 244, 229, 53, + 83, 186, 208, 116, 164, 83, 217, 76, 21, 191, 207, 44, 19, 21, 253, + 153, 84, 92, 96, 41, 9, 10, 187, 82, 155, 222, 146, 71, 130, 217, + 44, 75, 51, 56, 119, 4, 77, 141, 46, 0, 97, 157, 176, 42, 30, + 102, 41, 39, 48, 191, 201, 226, 156, 80, 24, 28, 109, 150, 215, 254, + 211, 17, 87, 114, 111, 250, 7, 60, 233, 55, 121, 139, 121, 167, 213, + 0, 106, 85, 183, 122, 254, 65, 52, 95, 129, 197, 156, 125, 235, 47, + 46, 191, 44, 139, 244, 217, 239, 216, 228, 14, 234, 216, 19, 13, 124, + 221, 166, 60, 124, 187, 83, 242, 154, 57, 182, 125, 172, 123, 100, 165, + 156, 196, 254, 19, 73, 234, 83, 209, 242, 17, 54, 12, 115, 163, 148, + 32, 146, 41, 86, 171, 11, 77, 71, 162, 203, 42, 153, 71, 217, 254, + 31, 214, 184, 58, 41, 245, 132, 249, 54, 172, 163, 225, 203, 205, 52, + 64, 105, 110, 128, 162, 176, 118, 243, 173, 173, 69, 11, 98, 19, 183, + 83, 247, 5, 137, 91, 192, 122, 15, 151, 125, 192, 220, 207, 6, 118, + 84, 8, 86, 196, 88, 59, 246, 8, 250, 10, 27, 7, 233, 225, 220, + 213, 222, 239, 138, 177, 173, 63, 58, 16, 68, 113, 218, 216, 24, 25, + 147, 176, 232, 249, 135, 194, 5, 26, 37, 110, 251, 13, 178, 55, 28, + 116, 84, 162, 145, 153, 117, 194, 41, 16, 179, 64, 121, 52, 127, 232, + 232, 53, 135, 212, 72, 122, 32, 112, 152, 10, 241, 217, 107, 3, 99, + 91, 115, 88, 107, 146, 120, 22, 156, 153, 68, 104, 212, 39, 76, 144, + 54, 58, 61, 91, 212, 96, 139, 35, 184, 37, 17, 55, 223, 15, 75, + 18, 55, 124, 232, 21, 10, 147, 24, 221, 23, 87, 186, 27, 152, 51, + 247, 112, 63, 56, 89, 180, 195, 67, 89, 105, 236, 102, 235, 57, 17, + 45, 151, 91, 186, 224, 171, 11, 149, 111, 102, 149, 50, 144, 250, 243, + 179, 20, 251, 203, 229, 228, 190, 33, 209, 254, 237, 112, 60, 222, 179, + 19, 224, 4, 78, 246, 239, 248, 80, 169, 180, 71, 190, 29, 178, 253, + 130, 207, 77, 202, 16, 108, 142, 201, 238, 135, 247, 155, 237, 187, 243, + 139, 247, 21, 141, 125, 213, 34, 106, 183, 4, 125, 40, 8, 104, 128, + 73, 121, 163, 122, 190, 121, 152, 45, 174, 52, 181, 139, 254, 242, 146, + 36, 163, 183, 147, 27, 234, 160, 222, 93, 232, 251, 153, 185, 158, 215, + 9, 86, 49, 72, 87, 154, 88, 169, 82, 186, 198, 240, 104, 92, 129, + 217, 12, 124, 113, 206, 117, 116, 149, 159, 149, 124, 219, 138, 96, 50, + 177, 145, 244, 8, 232, 218, 158, 22, 70, 31, 52, 226, 90, 7, 187, + 135, 66, 35, 193, 62, 122, 72, 201, 100, 66, 137, 236, 158, 187, 195, + 107, 234, 27, 155, 187, 221, 131, 2, 167, 165, 18, 225, 67, 72, 190, + 63, 136, 69, 32, 185, 181, 234, 159, 57, 4, 101, 127, 121, 3, 2, + 235, 220, 44, 245, 160, 71, 64, 175, 55, 135, 83, 250, 217, 239, 121, + 81, 181, 160, 151, 70, 56, 101, 74, 169, 142, 167, 10, 179, 233, 140, + 156, 203, 110, 15, 95, 15, 8, 169, 164, 40, 43, 50, 148, 216, 167, + 161, 36, 142, 145, 126, 236, 167, 154, 120, 110, 239, 138, 53, 152, 233, + 115, 33, 203, 253, 249, 174, 176, 43, 0, 178, 120, 133, 211, 252, 95, + 221, 221, 185, 36, 145, 53, 15, 125, 26, 232, 42, 249, 86, 8, 205, + 183, 114, 81, 62, 187, 162, 4, 251, 26, 79, 159, 156, 42, 7, 83, + 97, 14, 124, 38, 252, 215, 34, 141, 252, 226, 61, 237, 252, 114, 117, + 187, 21, 53, 236, 151, 9, 147, 40, 68, 63, 10, 166, 84, 236, 0, + 169, 196, 239, 107, 214, 32, 53, 142, 172, 22, 245, 22, 154, 150, 105, + 223, 5, 178, 48, 151, 191, 251, 63, 50, 255, 54, 206, 221, 49, 249, + 35, 133, 197, 248, 47, 155, 185, 108, 172, 179, 104, 121, 72, 25, 83, + 78, 205, 136, 136, 250, 47, 68, 179, 166, 229, 237, 212, 214, 104, 191, + 88, 159, 43, 30, 168, 89, 25, 137, 79, 142, 7, 237, 19, 230, 87, + 255, 20, 182, 27, 217, 197, 80, 45, 119, 115, 241, 181, 96, 155, 160, + 62, 57, 162, 103, 171, 196, 214, 243, 194, 41, 223, 187, 22, 4, 157, + 139, 4, 98, 193, 171, 27, 217, 8, 27, 100, 222, 30, 235, 4, 127, + 97, 243, 231, 102, 37, 47, 237, 58, 79, 189, 143, 193, 144, 0, 150, + 183, 0, 100, 29, 130, 166, 233, 150, 241, 61, 175, 23, 56, 239, 24, + 59, 143, 79, 27, 23, 124, 4, 9, 207, 73, 21, 181, 227, 80, 149, + 79, 226, 85, 110, 255, 126, 11, 66, 167, 203, 91, 50, 255, 189, 91, + 50, 79, 115, 160, 201, 112, 13, 25, 100, 68, 8, 218, 253, 185, 90, + 85, 79, 74, 27, 123, 23, 229, 57, 97, 91, 127, 106, 189, 186, 213, + 74, 233, 11, 137, 181, 51, 79, 108, 16, 145, 67, 82, 93, 245, 199, + 182, 112, 114, 208, 100, 151, 117, 222, 34, 187, 232, 137, 114, 251, 117, + 217, 153, 37, 215, 22, 113, 249, 198, 21, 184, 245, 107, 107, 27, 224, + 2, 158, 165, 155, 155, 104, 108, 215, 105, 154, 76, 171, 175, 245, 245, + 206, 227, 85, 231, 208, 127, 196, 191, 48, 150, 44, 38, 194, 191, 59, + 10, 10, 175, 148, 162, 163, 122, 167, 207, 145, 105, 234, 57, 199, 40, + 112, 205, 98, 242, 238, 38, 68, 192, 158, 91, 141, 80, 54, 12, 193, + 215, 8, 201, 136, 185, 229, 109, 175, 25, 245, 209, 147, 197, 233, 17, + 80, 189, 150, 49, 218, 246, 78, 30, 112, 64, 212, 109, 75, 232, 228, + 171, 102, 239, 219, 152, 158, 217, 121, 43, 174, 99, 82, 7, 113, 222, + 107, 164, 30, 205, 236, 152, 19, 157, 60, 82, 165, 34, 117, 23, 166, + 185, 209, 212, 7, 250, 32, 167, 172, 234, 117, 139, 110, 191, 14, 44, + 158, 95, 115, 126, 115, 234, 209, 174, 95, 163, 117, 243, 203, 182, 113, + 182, 4, 33, 100, 143, 45, 225, 128, 69, 73, 183, 246, 91, 28, 57, + 20, 1, 175, 125, 128, 38, 4, 54, 93, 255, 28, 106, 122, 42, 104, + 35, 79, 242, 117, 75, 237, 149, 28, 178, 84, 224, 183, 116, 254, 120, + 3, 70, 154, 8, 57, 132, 86, 14, 119, 4, 130, 3, 155, 233, 177, + 27, 28, 233, 148, 205, 109, 29, 39, 33, 0, 160, 214, 129, 207, 180, + 227, 131, 109, 29, 136, 60, 47, 234, 99, 52, 57, 228, 87, 114, 138, + 185, 19, 148, 152, 114, 48, 12, 231, 182, 67, 228, 94, 253, 199, 34, + 171, 238, 77, 59, 83, 128, 137, 52, 74, 35, 236, 38, 181, 165, 106, + 161, 12, 100, 76, 100, 237, 69, 13, 211, 210, 117, 185, 178, 17, 231, + 85, 134, 101, 66, 9, 71, 42, 88, 125, 183, 106, 217, 38, 175, 131, + 139, 75, 163, 134, 149, 70, 120, 146, 156, 196, 151, 154, 242, 232, 163, + 33, 206, 179, 123, 102, 249, 28, 11, 115, 88, 20, 192, 244, 74, 33, + 165, 176, 215, 142, 87, 229, 188, 139, 225, 192, 111, 203, 55, 25, 241, + 218, 22, 119, 121, 89, 69, 116, 214, 254, 94, 137, 253, 168, 156, 155, + 34, 150, 56, 126, 229, 79, 49, 150, 109, 99, 194, 179, 40, 114, 63, + 220, 161, 254, 73, 154, 211, 245, 21, 255, 63, 209, 45, 135, 86, 234, + 184, 213, 95, 28, 28, 244, 42, 66, 200, 83, 190, 81, 247, 24, 153, + 129, 180, 45, 159, 132, 4, 187, 171, 88, 178, 140, 143, 60, 212, 187, + 102, 125, 212, 66, 85, 133, 248, 58, 240, 126, 196, 7, 68, 71, 137, + 202, 116, 79, 137, 229, 156, 122, 69, 94, 146, 226, 198, 191, 116, 96, + 33, 50, 189, 32, 4, 5, 92, 116, 29, 122, 137, 140, 42, 199, 138, + 59, 38, 48, 178, 115, 216, 201, 225, 170, 183, 55, 248, 151, 58, 187, + 184, 152, 106, 130, 176, 52, 36, 73, 99, 77, 12, 166, 238, 52, 231, + 86, 144, 91, 2, 248, 246, 127, 5, 182, 201, 149, 205, 246, 73, 158, + 98, 4, 20, 138, 51, 176, 71, 169, 209, 237, 230, 100, 244, 243, 107, + 80, 113, 246, 233, 115, 26, 175, 72, 11, 38, 165, 68, 108, 163, 27, + 38, 43, 246, 18, 153, 208, 118, 235, 201, 225, 235, 17, 65, 53, 173, + 72, 230, 232, 105, 215, 41, 180, 191, 61, 31, 28, 214, 219, 29, 209, + 90, 206, 232, 80, 22, 101, 237, 61, 105, 128, 249, 224, 23, 242, 8, + 250, 190, 130, 207, 148, 102, 166, 241, 67, 58, 8, 61, 43, 58, 21, + 148, 188, 40, 139, 116, 11, 79, 186, 85, 9, 240, 164, 117, 238, 157, + 59, 244, 184, 250, 69, 143, 88, 147, 126, 237, 37, 6, 159, 130, 18, + 72, 138, 251, 58, 136, 155, 92, 42, 173, 253, 171, 166, 57, 160, 162, + 211, 173, 241, 66, 121, 37, 176, 180, 140, 117, 240, 132, 181, 16, 234, + 173, 59, 98, 9, 123, 31, 18, 165, 45, 182, 89, 112, 130, 79, 53, + 10, 120, 252, 52, 114, 58, 57, 146, 87, 222, 154, 231, 215, 219, 84, + 246, 85, 57, 206, 180, 66, 125, 212, 226, 45, 212, 74, 132, 27, 185, + 34, 150, 235, 119, 218, 77, 70, 235, 171, 112, 123, 174, 87, 160, 89, + 86, 219, 3, 47, 39, 240, 116, 102, 70, 107, 31, 55, 102, 167, 4, + 101, 119, 146, 176, 237, 168, 123, 84, 118, 218, 112, 118, 52, 18, 56, + 120, 216, 66, 187, 31, 12, 205, 53, 119, 26, 225, 215, 195, 226, 2, + 201, 75, 105, 65, 81, 45, 239, 114, 182, 155, 135, 95, 153, 240, 143, + 109, 109, 219, 218, 224, 26, 175, 35, 86, 128, 209, 255, 71, 26, 86, + 115, 22, 70, 167, 3, 105, 128, 160, 142, 163, 149, 168, 112, 8, 12, + 14, 119, 65, 43, 183, 105, 197, 156, 207, 226, 231, 239, 48, 62, 4, + 49, 169, 234, 123, 26, 164, 98, 119, 33, 170, 43, 39, 6, 128, 15, + 217, 209, 229, 109, 240, 180, 150, 169, 252, 118, 242, 240, 108, 204, 24, + 107, 199, 108, 184, 110, 208, 52, 175, 245, 241, 123, 90, 123, 150, 211, + 56, 75, 247, 140, 187, 53, 172, 174, 90, 223, 117, 128, 254, 97, 235, + 170, 193, 190, 34, 215, 109, 18, 109, 13, 118, 134, 45, 22, 100, 73, + 141, 199, 203, 124, 169, 191, 102, 108, 250, 201, 188, 39, 236, 74, 154, + 159, 170, 137, 69, 63, 82, 44, 177, 240, 178, 157, 53, 89, 6, 99, + 5, 13, 134, 169, 195, 121, 229, 179, 212, 123, 198, 131, 96, 250, 187, + 94, 106, 51, 219, 16, 147, 227, 108, 124, 240, 237, 172, 43, 83, 157, + 124, 246, 118, 249, 175, 43, 235, 221, 18, 24, 166, 127, 255, 210, 199, + 57, 134, 73, 141, 254, 219, 209, 19, 217, 36, 25, 104, 225, 133, 24, + 3, 130, 62, 103, 148, 212, 243, 122, 52, 213, 102, 26, 144, 227, 189, + 143, 151, 230, 98, 87, 214, 147, 110, 31, 43, 248, 142, 126, 199, 95, + 170, 186, 67, 225, 208, 49, 50, 159, 108, 174, 152, 118, 43, 193, 187, + 13, 63, 141, 94, 118, 113, 200, 75, 165, 117, 247, 53, 209, 151, 163, + 241, 24, 23, 252, 149, 18, 16, 77, 69, 208, 219, 254, 159, 220, 62, + 99, 26, 31, 231, 88, 150, 219, 168, 151, 178, 181, 234, 141, 124, 130, + 37, 1, 21, 195, 96, 139, 179, 136, 145, 29, 159, 213, 248, 10, 174, + 213, 22, 180, 250, 251, 30, 42, 228, 139, 178, 90, 19, 228, 100, 120, + 205, 54, 6, 189, 213, 203, 193, 43, 218, 211, 27, 93, 76, 181, 127, + 159, 43, 96, 233, 249, 118, 252, 127, 59, 67, 82, 65, 48, 100, 170, + 227, 197, 141, 49, 153, 31, 189, 176, 102, 14, 101, 152, 242, 25, 251, + 47, 242, 67, 114, 61, 184, 29, 60, 163, 186, 19, 17, 36, 42, 76, + 31, 246, 195, 224, 206, 221, 89, 69, 218, 112, 148, 98, 60, 154, 28, + 199, 206, 59, 157, 199, 18, 214, 53, 217, 211, 254, 128, 220, 189, 96, + 134, 57, 73, 152, 41, 52, 0, 93, 23, 215, 124, 209, 63, 252, 134, + 64, 224, 183, 197, 94, 46, 214, 214, 233, 202, 211, 155, 236, 31, 238, + 220, 132, 54, 88, 122, 140, 146, 11, 88, 164, 238, 156, 72, 239, 225, + 82, 157, 144, 27, 240, 5, 231, 89, 25, 63, 50, 227, 219, 3, 5, + 218, 125, 13, 151, 59, 40, 162, 211, 79, 33, 157, 76, 245, 55, 229, + 140, 88, 50, 221, 42, 52, 162, 106, 212, 125, 187, 254, 0, 126, 156, + 98, 149, 35, 94, 247, 215, 131, 86, 116, 176, 3, 56, 30, 26, 138, + 113, 71, 255, 77, 143, 52, 111, 20, 113, 47, 88, 104, 110, 225, 164, + 226, 8, 74, 180, 182, 183, 206, 215, 84, 12, 46, 61, 177, 168, 102, + 244, 93, 199, 243, 247, 214, 227, 131, 185, 103, 131, 49, 3, 49, 18, + 74, 111, 249, 150, 2, 113, 165, 221, 7, 93, 110, 59, 242, 246, 243, + 168, 45, 182, 45, 140, 19, 41, 72, 10, 164, 190, 17, 174, 216, 36, + 216, 3, 1, 198, 230, 150, 19, 0, 114, 10, 75, 166, 138, 161, 0, + 113, 132, 128, 116, 201, 147, 42, 63, 211, 56, 195, 45, 125, 69, 55, + 177, 149, 228, 7, 78, 217, 133, 35, 108, 182, 210, 185, 124, 187, 167, + 95, 246, 202, 121, 167, 61, 61, 239, 37, 153, 143, 109, 126, 42, 69, + 174, 253, 132, 161, 118, 14, 10, 7, 141, 92, 188, 60, 81, 174, 93, + 28, 58, 223, 217, 119, 84, 213, 230, 132, 248, 31, 47, 141, 88, 249, + 28, 205, 19, 5, 183, 167, 88, 177, 66, 242, 50, 66, 255, 31, 218, + 182, 209, 12, 246, 151, 87, 252, 211, 231, 32, 120, 95, 76, 180, 20, + 124, 238, 190, 60, 165, 239, 207, 37, 221, 115, 145, 126, 61, 51, 141, + 54, 64, 219, 247, 164, 74, 19, 7, 93, 27, 150, 115, 224, 228, 172, + 232, 113, 6, 148, 40, 229, 228, 32, 17, 92, 215, 75, 64, 50, 235, + 127, 109, 127, 152, 99, 73, 55, 210, 245, 55, 37, 236, 244, 136, 154, + 177, 231, 119, 30, 187, 225, 83, 240, 237, 183, 80, 245, 10, 129, 181, + 156, 137, 27, 79, 97, 145, 78, 100, 127, 79, 224, 218, 244, 49, 70, + 225, 131, 138, 102, 32, 110, 123, 110, 49, 161, 246, 27, 99, 115, 171, + 159, 45, 44, 15, 108, 51, 173, 24, 4, 170, 76, 255, 41, 27, 0, + 27, 35, 61, 145, 246, 241, 138, 152, 47, 51, 2, 153, 171, 79, 81, + 176, 123, 63, 192, 74, 27, 243, 22, 51, 86, 243, 48, 24, 129, 162, + 69, 218, 102, 143, 135, 107, 52, 182, 189, 25, 142, 206, 227, 144, 140, + 57, 124, 252, 97, 157, 61, 55, 43, 76, 52, 197, 146, 154, 83, 0, + 150, 16, 85, 76, 230, 32, 23, 86, 31, 241, 251, 88, 183, 195, 242, + 192, 181, 160, 229, 185, 229, 186, 72, 219, 249, 142, 111, 178, 42, 163, + 117, 93, 31, 171, 161, 227, 194, 51, 36, 53, 116, 0, 233, 37, 150, + 128, 144, 8, 168, 198, 68, 35, 57, 148, 64, 207, 148, 64, 213, 174, + 223, 174, 129, 171, 81, 132, 1, 90, 208, 100, 105, 209, 10, 209, 228, + 138, 169, 82, 197, 37, 172, 32, 222, 70, 180, 78, 59, 234, 106, 250, + 76, 237, 59, 173, 178, 212, 151, 107, 131, 245, 14, 218, 71, 56, 187, + 138, 74, 101, 15, 32, 18, 131, 21, 57, 6, 32, 115, 75, 244, 119, + 168, 158, 154, 147, 72, 143, 232, 51, 49, 181, 115, 27, 96, 141, 93, + 202, 36, 38, 23, 61, 150, 171, 239, 66, 13, 183, 126, 24, 99, 175, + 110, 189, 88, 170, 252, 139, 127, 179, 106, 243, 140, 208, 243, 110, 145, + 64, 161, 4, 191, 209, 211, 72, 135, 24, 121, 210, 109, 42, 134, 9, + 160, 241, 186, 161, 203, 85, 212, 3, 23, 228, 75, 147, 133, 9, 100, + 65, 195, 165, 252, 229, 177, 199, 170, 63, 194, 247, 76, 171, 66, 203, + 193, 3, 74, 91, 86, 31, 85, 185, 52, 27, 175, 175, 84, 137, 51, + 233, 26, 52, 16, 75, 185, 95, 35, 167, 251, 67, 83, 217, 9, 241, + 43, 252, 76, 242, 101, 115, 133, 173, 154, 251, 33, 116, 118, 243, 152, + 63, 173, 153, 63, 75, 90, 106, 203, 197, 141, 149, 127, 9, 133, 218, + 223, 193, 62, 19, 48, 231, 45, 146, 21, 164, 1, 42, 43, 187, 75, + 88, 20, 39, 233, 165, 20, 76, 26, 145, 226, 155, 106, 187, 26, 195, + 23, 212, 49, 60, 145, 149, 37, 167, 73, 106, 203, 228, 185, 223, 108, + 12, 187, 239, 88, 126, 27, 154, 235, 203, 207, 187, 1, 114, 12, 112, + 238, 17, 185, 120, 227, 177, 242, 191, 10, 18, 241, 143, 21, 239, 31, + 150, 102, 60, 15, 167, 209, 64, 117, 237, 45, 45, 217, 147, 32, 28, + 98, 221, 12, 20, 2, 176, 213, 147, 95, 31, 176, 64, 237, 55, 53, + 44, 105, 249, 43, 111, 73, 162, 180, 4, 62, 66, 118, 36, 215, 254, + 183, 249, 170, 39, 21, 69, 147, 65, 105, 136, 232, 160, 174, 141, 84, + 222, 189, 33, 250, 197, 226, 170, 246, 127, 87, 25, 10, 181, 46, 151, + 216, 250, 227, 131, 115, 64, 217, 11, 190, 199, 122, 148, 242, 221, 46, + 169, 45, 54, 9, 90, 251, 94, 61, 211, 30, 67, 199, 115, 204, 4, + 199, 203, 109, 137, 60, 223, 206, 3, 144, 170, 215, 224, 72, 247, 128, + 64, 147, 140, 223, 125, 20, 67, 248, 253, 206, 5, 44, 72, 160, 33, + 20, 166, 80, 123, 194, 220, 16, 134, 206, 24, 66, 217, 177, 231, 223, + 66, 251, 253, 235, 180, 36, 205, 107, 173, 198, 108, 83, 120, 82, 128, + 120, 245, 67, 23, 248, 203, 28, 14, 75, 235, 117, 111, 34, 127, 39, + 52, 169, 101, 28, 144, 123, 20, 197, 116, 96, 141, 201, 246, 61, 101, + 132, 127, 98, 178, 186, 139, 226, 132, 55, 229, 116, 75, 43, 241, 119, + 139, 104, 169, 215, 199, 226, 113, 178, 214, 153, 159, 139, 208, 106, 136, + 77, 149, 72, 248, 49, 179, 98, 110, 192, 105, 128, 27, 245, 36, 215, + 210, 187, 98, 45, 92, 51, 238, 57, 153, 113, 21, 86, 147, 122, 138, + 3, 70, 66, 84, 135, 96, 199, 23, 123, 105, 226, 81, 171, 23, 228, + 73, 234, 240, 50, 135, 108, 143, 140, 247, 26, 245, 43, 94, 183, 180, + 240, 235, 159, 127, 57, 119, 6, 34, 58, 112, 170, 62, 37, 57, 171, + 56, 223, 147, 98, 204, 183, 146, 154, 85, 172, 49, 76, 84, 231, 138, + 117, 46, 81, 57, 240, 43, 102, 130, 234, 208, 237, 88, 164, 124, 128, + 104, 167, 38, 88, 73, 7, 131, 234, 67, 4, 213, 8, 211, 84, 81, + 197, 133, 123, 247, 254, 101, 230, 68, 245, 220, 193, 152, 208, 91, 63, + 109, 228, 184, 117, 28, 114, 146, 98, 142, 195, 4, 139, 48, 186, 242, + 211, 124, 175, 224, 69, 38, 35, 14, 253, 245, 242, 184, 138, 4, 206, + 221, 15, 125, 189, 97, 127, 46, 212, 10, 55, 1, 69, 56, 31, 180, + 245, 93, 175, 58, 220, 3, 164, 88, 22, 74, 157, 113, 246, 189, 65, + 97, 235, 189, 126, 106, 50, 120, 180, 71, 120, 11, 200, 48, 19, 57, + 236, 64, 234, 180, 243, 32, 228, 127, 228, 253, 42, 20, 238, 109, 161, + 67, 73, 52, 35, 126, 197, 5, 117, 12, 86, 215, 168, 60, 159, 4, + 74, 193, 92, 104, 190, 30, 185, 187, 153, 208, 87, 245, 62, 200, 16, + 204, 189, 141, 188, 226, 187, 144, 101, 51, 86, 204, 26, 22, 246, 230, + 176, 81, 195, 19, 126, 58, 91, 30, 204, 178, 248, 217, 81, 155, 68, + 145, 42, 9, 22, 68, 22, 107, 25, 86, 153, 225, 224, 143, 128, 94, + 164, 65, 168, 173, 178, 181, 97, 100, 159, 212, 164, 213, 75, 25, 35, + 225, 133, 5, 243, 65, 39, 158, 155, 153, 3, 81, 53, 165, 153, 52, + 237, 226, 122, 245, 248, 255, 60, 13, 2, 41, 202, 232, 184, 57, 152, + 133, 105, 159, 33, 220, 49, 135, 76, 198, 212, 70, 168, 43, 233, 168, + 180, 88, 139, 246, 219, 120, 12, 161, 238, 88, 228, 9, 77, 236, 129, + 227, 73, 91, 104, 222, 104, 205, 28, 140, 205, 167, 178, 222, 150, 197, + 139, 205, 66, 245, 48, 241, 80, 225, 218, 27, 159, 205, 64, 148, 107, + 54, 46, 190, 61, 0, 161, 228, 124, 123, 18, 170, 35, 46, 53, 61, + 171, 154, 121, 253, 187, 158, 102, 194, 132, 94, 49, 239, 86, 57, 205, + 129, 185, 234, 50, 56, 219, 36, 56, 77, 247, 160, 75, 239, 154, 122, + 34, 34, 143, 66, 53, 20, 212, 246, 3, 79, 229, 119, 50, 132, 221, + 187, 208, 82, 149, 183, 151, 200, 181, 97, 12, 4, 136, 233, 171, 247, + 128, 211, 234, 122, 152, 140, 221, 82, 83, 98, 185, 95, 122, 23, 120, + 124, 112, 240, 39, 16, 49, 140, 225, 135, 88, 69, 96, 125, 246, 99, + 224, 165, 148, 178, 35, 63, 192, 217, 39, 153, 63, 32, 109, 142, 224, + 12, 132, 10, 55, 49, 140, 217, 141, 113, 10, 72, 92, 37, 121, 96, + 72, 35, 184, 70, 156, 225, 140, 110, 150, 24, 95, 209, 172, 140, 187, + 10, 154, 58, 113, 215, 254, 36, 101, 155, 5, 46, 249, 59, 238, 164, + 25, 212, 35, 5, 87, 45, 183, 124, 174, 6, 182, 241, 206, 128, 118, + 190, 239, 160, 140, 2, 149, 90, 185, 125, 192, 8, 75, 105, 184, 51, + 2, 11, 198, 85, 249, 100, 88, 73, 229, 189, 80, 81, 244, 167, 62, + 110, 52, 13, 254, 122, 144, 170, 206, 64, 239, 191, 0, 73, 235, 143, + 120, 81, 33, 87, 83, 154, 156, 163, 31, 172, 104, 196, 78, 144, 100, + 3, 54, 202, 67, 177, 217, 80, 207, 235, 48, 12, 127, 78, 116, 96, + 238, 226, 97, 154, 97, 120, 19, 33, 89, 14, 160, 149, 243, 246, 196, + 219, 74, 113, 225, 92, 32, 216, 10, 50, 176, 127, 113, 63, 157, 143, + 190, 245, 94, 244, 103, 85, 143, 162, 61, 177, 203, 240, 204, 55, 183, + 226, 251, 205, 53, 25, 19, 197, 160, 34, 42, 128, 169, 80, 11, 210, + 133, 105, 128, 175, 107, 72, 222, 130, 95, 209, 93, 161, 16, 35, 244, + 178, 236, 100, 20, 129, 190, 118, 246, 108, 68, 206, 105, 58, 91, 90, + 149, 0, 168, 95, 115, 63, 54, 240, 7, 164, 186, 100, 76, 81, 225, + 58, 178, 14, 46, 79, 31, 226, 180, 34, 164, 191, 84, 22, 244, 90, + 105, 13, 83, 133, 230, 81, 45, 49, 157, 84, 22, 168, 167, 205, 219, + 123, 209, 80, 87, 205, 180, 152, 162, 225, 229, 142, 72, 250, 240, 134, + 185, 145, 112, 149, 25, 185, 198, 174, 213, 83, 145, 151, 228, 138, 96, + 152, 242, 251, 227, 53, 229, 136, 37, 147, 184, 141, 104, 221, 51, 219, + 21, 93, 42, 253, 183, 57, 203, 92, 7, 240, 82, 171, 103, 167, 115, + 233, 175, 142, 8, 112, 10, 56, 44, 192, 231, 79, 18, 8, 68, 128, + 106, 121, 225, 149, 30, 210, 173, 86, 240, 30, 138, 197, 89, 213, 63, + 161, 106, 65, 141, 57, 96, 102, 191, 28, 56, 9, 201, 3, 248, 113, + 118, 51, 121, 247, 83, 135, 51, 54, 14, 19, 49, 175, 59, 206, 112, + 172, 155, 243, 75, 19, 154, 102, 188, 11, 76, 198, 136, 11, 44, 154, + 139, 48, 34, 194, 116, 170, 198, 127, 132, 231, 200, 44, 61, 210, 93, + 20, 159, 201, 183, 39, 78, 178, 225, 112, 50, 254, 198, 200, 207, 18, + 196, 209, 222, 252, 67, 56, 186, 71, 24, 210, 30, 105, 32, 102, 99, + 239, 195, 191, 131, 246, 65, 121, 91, 66, 112, 28, 170, 67, 28, 144, + 187, 46, 117, 97, 187, 240, 250, 118, 249, 68, 151, 248, 219, 208, 103, + 242, 166, 122, 220, 59, 50, 215, 90, 160, 15, 15, 96, 89, 167, 87, + 22, 253, 137, 202, 126, 145, 162, 171, 97, 181, 102, 50, 107, 230, 31, + 183, 133, 105, 23, 233, 228, 13, 247, 169, 79, 53, 76, 138, 29, 51, + 53, 221, 126, 199, 47, 153, 184, 183, 198, 109, 192, 203, 178, 26, 115, + 177, 118, 158, 181, 43, 48, 174, 195, 253, 43, 18, 172, 171, 101, 129, + 255, 63, 41, 49, 160, 15, 86, 108, 235, 87, 115, 36, 93, 46, 164, + 152, 49, 31, 137, 125, 174, 115, 196, 240, 117, 226, 183, 151, 73, 30, + 75, 59, 61, 160, 96, 157, 215, 246, 160, 136, 82, 95, 181, 13, 207, + 158, 106, 81, 18, 27, 182, 35, 249, 72, 148, 128, 15, 82, 68, 197, + 0, 159, 149, 239, 34, 250, 171, 70, 200, 219, 214, 18, 134, 14, 71, + 69, 219, 145, 208, 125, 65, 232, 201, 212, 148, 39, 208, 142, 54, 38, + 32, 154, 124, 35, 76, 173, 240, 232, 23, 74, 183, 118, 137, 244, 180, + 149, 195, 198, 105, 25, 246, 236, 155, 88, 230, 134, 32, 126, 183, 72, + 127, 129, 139, 161, 224, 222, 127, 107, 201, 78, 227, 207, 10, 48, 9, + 199, 240, 176, 49, 165, 95, 200, 101, 89, 40, 229, 28, 8, 41, 193, + 173, 218, 63, 229, 216, 170, 82, 90, 162, 243, 0, 125, 248, 79, 186, + 228, 44, 197, 178, 58, 196, 251, 85, 19, 254, 130, 110, 78, 91, 217, + 146, 16, 90, 221, 6, 129, 173, 73, 56, 77, 72, 19, 8, 14, 129, + 84, 19, 88, 146, 252, 137, 165, 222, 7, 199, 107, 135, 13, 253, 137, + 180, 184, 240, 37, 238, 133, 135, 80, 170, 172, 60, 80, 94, 130, 246, + 166, 63, 181, 30, 103, 97, 138, 193, 148, 96, 82, 61, 47, 188, 230, + 118, 65, 74, 28, 123, 50, 73, 12, 187, 123, 129, 19, 95, 213, 61, + 153, 85, 243, 44, 195, 249, 250, 121, 175, 42, 187, 154, 233, 91, 217, + 49, 130, 129, 172, 250, 182, 203, 30, 93, 213, 217, 24, 28, 198, 4, + 208, 61, 207, 108, 120, 22, 39, 136, 252, 123, 15, 188, 34, 35, 177, + 35, 134, 178, 221, 217, 22, 51, 18, 22, 215, 47, 68, 120, 130, 0, + 192, 242, 170, 170, 202, 220, 179, 185, 81, 204, 10, 115, 181, 231, 246, + 172, 38, 43, 145, 56, 171, 219, 34, 17, 96, 165, 209, 53, 44, 68, + 74, 236, 249, 192, 35, 204, 123, 56, 118, 174, 172, 151, 249, 36, 21, + 133, 119, 237, 232, 61, 125, 6, 124, 200, 62, 68, 67, 40, 196, 202, + 84, 213, 160, 237, 85, 249, 125, 41, 187, 126, 48, 152, 124, 104, 211, + 127, 96, 167, 184, 23, 161, 68, 106, 119, 224, 226, 148, 234, 54, 155, + 168, 186, 193, 167, 15, 242, 100, 82, 15, 205, 247, 34, 24, 134, 152, + 115, 132, 114, 196, 0, 136, 242, 73, 91, 35, 90, 4, 161, 138, 163, + 21, 16, 244, 60, 158, 199, 246, 233, 150, 10, 142, 248, 196, 224, 129, + 8, 158, 81, 11, 92, 96, 197, 23, 45, 104, 235, 250, 9, 31, 47, + 153, 116, 22, 170, 186, 150, 46, 214, 246, 75, 116, 4, 242, 147, 168, + 177, 134, 143, 149, 36, 139, 224, 127, 143, 167, 208, 115, 158, 250, 132, + 4, 124, 204, 99, 217, 239, 97, 5, 38, 50, 17, 176, 171, 96, 92, + 88, 219, 195, 184, 160, 158, 175, 10, 175, 33, 245, 28, 55, 56, 207, + 47, 46, 114, 108, 196, 101, 93, 39, 227, 183, 40, 40, 109, 121, 123, + 90, 85, 162, 165, 227, 200, 238, 136, 223, 36, 77, 179, 45, 156, 51, + 95, 33, 15, 219, 71, 37, 98, 141, 150, 179, 78, 217, 221, 130, 186, + 155, 84, 146, 217, 210, 202, 91, 212, 50, 129, 188, 203, 28, 213, 10, + 230, 40, 47, 215, 77, 161, 88, 71, 56, 82, 124, 130, 249, 70, 139, + 142, 23, 78, 139, 252, 32, 223, 90, 214, 27, 94, 23, 12, 240, 77, + 145, 71, 172, 75, 235, 141, 83, 145, 50, 101, 166, 87, 154, 179, 203, + 27, 233, 169, 45, 28, 41, 211, 46, 144, 123, 62, 62, 205, 178, 180, + 89, 32, 194, 238, 151, 217, 164, 214, 241, 164, 96, 215, 46, 141, 189, + 86, 97, 143, 4, 227, 73, 20, 221, 238, 66, 3, 132, 135, 229, 22, + 60, 152, 102, 211, 20, 250, 225, 36, 212, 131, 182, 212, 216, 84, 141, + 133, 86, 163, 136, 107, 219, 8, 100, 189, 138, 217, 60, 131, 237, 64, + 37, 241, 85, 140, 47, 54, 75, 58, 76, 66, 104, 245, 201, 199, 236, + 188, 71, 30, 171, 233, 190, 81, 120, 166, 63, 237, 249, 233, 192, 5, + 24, 231, 193, 39, 99, 101, 108, 92, 109, 156, 211, 111, 87, 157, 130, + 16, 58, 113, 47, 101, 152, 60, 183, 37, 227, 52, 255, 213, 16, 112, + 234, 223, 197, 101, 73, 120, 94, 60, 158, 82, 227, 131, 13, 4, 167, + 78, 126, 120, 154, 26, 246, 35, 145, 40, 150, 7, 208, 243, 100, 68, + 89, 200, 139, 138, 121, 37, 28, 35, 197, 227, 79, 19, 130, 171, 91, + 116, 57, 153, 140, 217, 236, 7, 180, 221, 226, 163, 199, 158, 131, 200, + 37, 48, 41, 157, 175, 139, 71, 53, 172, 113, 159, 133, 47, 139, 113, + 157, 40, 88, 44, 115, 105, 104, 219, 211, 18, 164, 170, 127, 5, 178, + 115, 181, 143, 30, 173, 6, 186, 183, 45, 56, 94, 252, 210, 171, 154, + 10, 17, 34, 153, 4, 11, 176, 85, 144, 114, 36, 247, 34, 67, 187, + 69, 164, 168, 120, 82, 186, 46, 15, 147, 105, 48, 76, 235, 15, 218, + 86, 160, 19, 220, 119, 241, 103, 252, 196, 58, 74, 131, 214, 109, 17, + 175, 75, 203, 167, 17, 60, 52, 251, 130, 55, 184, 165, 83, 225, 231, + 184, 208, 196, 88, 70, 8, 3, 43, 78, 107, 158, 180, 130, 248, 194, + 16, 46, 54, 100, 98, 121, 67, 185, 17, 181, 210, 5, 15, 178, 196, + 80, 220, 28, 103, 220, 231, 167, 10, 122, 225, 194, 118, 157, 192, 195, + 205, 130, 253, 94, 246, 177, 74, 149, 90, 120, 188, 230, 48, 77, 168, + 50, 76, 130, 136, 200, 219, 209, 192, 20, 10, 193, 97, 205, 136, 98, + 117, 128, 170, 198, 220, 218, 180, 178, 186, 150, 227, 196, 161, 4, 244, + 124, 31, 85, 243, 34, 78, 187, 226, 164, 167, 122, 56, 114, 232, 140, + 189, 160, 19, 184, 223, 165, 202, 86, 210, 102, 183, 50, 30, 109, 134, + 23, 102, 171, 130, 93, 106, 2, 117, 80, 82, 197, 193, 247, 137, 255, + 255, 127, 38, 13, 82, 103, 51, 179, 220, 133, 247, 104, 152, 160, 229, + 160, 214, 152, 157, 87, 183, 82, 43, 36, 19, 80, 192, 122, 186, 201, + 116, 190, 220, 131, 228, 153, 197, 212, 112, 233, 124, 114, 212, 106, 195, + 129, 141, 204, 238, 98, 247, 90, 244, 23, 118, 2, 168, 71, 48, 223, + 253, 187, 16, 204, 230, 46, 221, 30, 243, 27, 129, 155, 210, 159, 84, + 56, 212, 197, 131, 174, 59, 85, 108, 80, 36, 31, 210, 71, 228, 254, + 171, 67, 129, 154, 175, 245, 140, 11, 167, 43, 69, 231, 227, 91, 183, + 133, 108, 4, 151, 128, 64, 243, 215, 74, 160, 186, 217, 38, 28, 186, + 75, 178, 151, 214, 5, 49, 158, 242, 126, 91, 249, 88, 156, 110, 124, + 205, 125, 227, 19, 235, 172, 103, 200, 190, 121, 169, 140, 118, 156, 21, + 152, 34, 31, 235, 46, 191, 107, 37, 109, 135, 112, 195, 9, 245, 43, + 96, 232, 74, 8, 193, 131, 70, 140, 180, 204, 219, 243, 72, 70, 16, + 11, 227, 0, 27, 252, 142, 183, 199, 103, 114, 149, 221, 235, 69, 92, + 245, 9, 227, 43, 173, 139, 119, 85, 104, 214, 84, 126, 244, 243, 122, + 14, 164, 185, 104, 176, 55, 133, 44, 28, 208, 232, 50, 71, 32, 78, + 200, 95, 153, 70, 82, 243, 91, 164, 64, 159, 173, 244, 103, 78, 29, + 218, 209, 124, 118, 153, 42, 69, 240, 237, 228, 33, 155, 17, 61, 27, + 233, 171, 6, 240, 48, 113, 243, 134, 207, 120, 216, 61, 188, 247, 231, + 185, 163, 43, 140, 138, 235, 132, 219, 47, 38, 93, 205, 6, 247, 195, + 200, 79, 87, 111, 210, 54, 222, 179, 108, 163, 253, 22, 22, 101, 180, + 6, 61, 41, 91, 95, 237, 186, 166, 110, 225, 139, 205, 146, 41, 133, + 153, 114, 63, 48, 110, 208, 168, 38, 233, 141, 23, 136, 236, 22, 220, + 14, 62, 224, 46, 20, 193, 181, 107, 14, 234, 156, 234, 108, 30, 112, + 235, 126, 237, 189, 252, 240, 240, 3, 175, 210, 85, 35, 230, 115, 219, + 184, 173, 48, 84, 250, 52, 113, 44, 187, 173, 253, 153, 177, 32, 127, + 98, 100, 180, 211, 71, 146, 82, 1, 69, 200, 165, 198, 121, 133, 232, + 0, 237, 157, 169, 31, 134, 106, 243, 245, 16, 228, 53, 133, 143, 255, + 123, 175, 19, 10, 98, 117, 180, 38, 50, 190, 63, 70, 106, 8, 221, + 78, 66, 129, 190, 181, 165, 119, 242, 101, 19, 18, 181, 91, 223, 30, + 93, 253, 74, 242, 112, 139, 30, 121, 25, 100, 144, 32, 212, 143, 3, + 96, 134, 113, 193, 190, 51, 8, 60, 108, 88, 168, 142, 47, 217, 173, + 44, 207, 174, 161, 237, 179, 147, 4, 30, 5, 177, 202, 43, 239, 15, + 135, 44, 216, 10, 183, 63, 27, 159, 195, 56, 238, 95, 213, 45, 44, + 252, 4, 101, 233, 38, 88, 66, 126, 149, 196, 87, 211, 55, 38, 17, + 92, 26, 76, 156, 183, 136, 154, 166, 219, 125, 10, 88, 240, 97, 14, + 86, 67, 4, 74, 236, 71, 72, 10, 49, 18, 158, 148, 128, 15, 241, + 17, 9, 236, 243, 22, 116, 160, 65, 166, 34, 113, 76, 41, 100, 153, + 184, 22, 62, 252, 220, 47, 180, 124, 103, 242, 104, 13, 244, 136, 33, + 146, 33, 176, 31, 159, 235, 29, 221, 255, 182, 90, 183, 158, 186, 155, + 85, 137, 173, 129, 71, 91, 147, 17, 30, 240, 214, 110, 79, 64, 21, + 129, 97, 109, 253, 198, 203, 116, 235, 89, 166, 151, 116, 106, 194, 27, + 51, 177, 23, 119, 199, 227, 50, 143, 129, 234, 188, 217, 9, 136, 48, + 115, 5, 252, 241, 195, 116, 239, 68, 176, 55, 121, 2, 38, 229, 224, + 94, 204, 200, 115, 84, 235, 131, 172, 242, 56, 208, 41, 21, 36, 113, + 156, 137, 6, 225, 132, 4, 181, 193, 84, 10, 213, 155, 150, 72, 127, + 23, 107, 255, 105, 250, 61, 234, 211, 225, 169, 93, 63, 138, 95, 201, + 74, 208, 99, 119, 184, 219, 62, 86, 163, 142, 35, 24, 86, 92, 224, + 53, 84, 57, 101, 113, 76, 26, 78, 174, 49, 28, 234, 153, 240, 27, + 114, 87, 133, 130, 78, 66, 144, 205, 152, 171, 169, 136, 219, 142, 223, + 145, 149, 196, 6, 167, 109, 52, 188, 0, 98, 242, 254, 184, 129, 250, + 63, 244, 10, 97, 188, 7, 137, 183, 165, 68, 91, 26, 188, 230, 246, + 227, 12, 217, 170, 224, 119, 135, 243, 149, 88, 67, 23, 117, 173, 130, + 164, 233, 244, 251, 11, 123, 57, 80, 111, 249, 146, 231, 213, 158, 26, + 236, 250, 213, 228, 117, 251, 101, 128, 8, 241, 251, 36, 40, 149, 148, + 60, 146, 48, 104, 121, 163, 233, 2, 24, 10, 21, 93, 137, 124, 8, + 115, 220, 255, 107, 153, 105, 6, 255, 32, 160, 96, 74, 84, 184, 31, + 155, 118, 206, 58, 131, 111, 150, 137, 145, 22, 45, 138, 211, 118, 151, + 248, 189, 64, 82, 222, 9, 137, 114, 59, 89, 77, 249, 245, 195, 146, + 198, 43, 209, 186, 151, 121, 136, 170, 81, 53, 43, 126, 15, 62, 88, + 171, 206, 232, 34, 99, 52, 6, 22, 126, 140, 32, 181, 122, 253, 230, + 127, 211, 254, 61, 254, 108, 114, 38, 214, 164, 244, 87, 243, 187, 185, + 57, 105, 24, 244, 59, 254, 92, 143, 235, 38, 70, 177, 126, 123, 61, + 243, 45, 127, 76, 127, 39, 45, 254, 239, 67, 221, 24, 81, 24, 130, + 247, 106, 239, 93, 18, 57, 242, 4, 223, 131, 86, 249, 241, 81, 149, + 230, 154, 17, 14, 179, 194, 234, 17, 85, 188, 33, 162, 62, 73, 157, + 253, 248, 111, 97, 205, 47, 74, 223, 192, 185, 212, 153, 240, 156, 104, + 64, 46, 209, 146, 56, 27, 21, 184, 95, 107, 95, 101, 243, 133, 146, + 194, 240, 51, 109, 158, 225, 18, 80, 66, 4, 79, 252, 174, 187, 55, + 230, 54, 51, 42, 87, 34, 159, 155, 184, 118, 167, 150, 46, 32, 156, + 244, 124, 222, 84, 247, 12, 231, 119, 237, 135, 225, 227, 97, 178, 37, + 208, 112, 126, 32, 227, 60, 239, 194, 183, 169, 208, 221, 250, 180, 56, + 137, 67, 153, 170, 242, 54, 55, 48, 219, 79, 106, 249, 250, 56, 130, + 184, 43, 56, 114, 175, 122, 249, 107, 188, 63, 169, 25, 43, 68, 61, + 246, 47, 191, 117, 150, 7, 163, 144, 42, 186, 5, 195, 11, 68, 215, + 219, 87, 213, 42, 84, 99, 37, 29, 78, 34, 180, 131, 15, 171, 186, + 225, 163, 204, 225, 72, 198, 227, 122, 245, 4, 133, 40, 134, 17, 61, + 112, 55, 159, 37, 118, 112, 173, 210, 126, 9, 23, 209, 65, 14, 109, + 16, 247, 254, 45, 170, 33, 143, 35, 107, 134, 51, 132, 135, 226, 40, + 112, 156, 122, 5, 31, 37, 113, 24, 1, 153, 3, 180, 227, 249, 172, + 93, 20, 79, 126, 42, 254, 100, 80, 86, 180, 123, 71, 213, 32, 178, + 28, 63, 75, 177, 246, 25, 119, 33, 236, 194, 31, 94, 169, 97, 96, + 42, 29, 165, 234, 199, 12, 76, 8, 242, 229, 160, 130, 169, 76, 120, + 159, 25, 18, 36, 182, 222, 210, 105, 251, 2, 40, 111, 212, 249, 119, + 48, 137, 50, 71, 146, 216, 47, 18, 60, 194, 18, 119, 197, 216, 84, + 170, 143, 241, 61, 207, 206, 238, 51, 39, 145, 171, 81, 108, 64, 0, + 229, 83, 190, 81, 149, 27, 77, 44, 34, 134, 178, 250, 9, 244, 128, + 175, 124, 28, 41, 116, 254, 30, 162, 88, 207, 231, 222, 155, 224, 234, + 201, 56, 119, 191, 190, 158, 195, 16, 153, 152, 99, 244, 60, 207, 205, + 133, 34, 101, 0, 104, 144, 141, 121, 168, 44, 40, 234, 49, 35, 136, + 39, 242, 14, 198, 188, 124, 161, 135, 113, 180, 68, 218, 10, 47, 223, + 190, 0, 238, 109, 149, 149, 25, 14, 218, 109, 85, 106, 125, 45, 29, + 63, 122, 74, 184, 39, 153, 72, 81, 69, 212, 62, 80, 161, 110, 103, + 56, 254, 7, 198, 201, 47, 202, 145, 147, 115, 7, 252, 21, 157, 211, + 102, 40, 117, 116, 41, 110, 189, 45, 41, 128, 46, 18, 40, 228, 43, + 159, 202, 90, 114, 78, 193, 9, 237, 172, 59, 89, 50, 218, 47, 142, + 139, 118, 146, 201, 8, 158, 116, 71, 133, 105, 177, 199, 24, 202, 219, + 64, 136, 101, 162, 11, 225, 13, 60, 217, 13, 125, 9, 38, 224, 90, + 78, 166, 145, 101, 167, 132, 24, 58, 73, 19, 2, 185, 83, 148, 110, + 133, 191, 76, 71, 18, 168, 103, 0, 123, 195, 39, 41, 243, 215, 62, + 38, 156, 101, 42, 144, 43, 125, 154, 46, 152, 74, 242, 251, 158, 180, + 189, 228, 165, 64, 75, 220, 184, 160, 9, 23, 57, 138, 16, 88, 240, + 5, 234, 106, 188, 171, 120, 55, 203, 43, 72, 33, 67, 129, 26, 242, + 128, 89, 144, 226, 129, 58, 143, 110, 185, 216, 158, 238, 175, 34, 121, + 59, 49, 76, 178, 81, 88, 181, 23, 219, 66, 1, 228, 34, 143, 250, + 41, 77, 7, 245, 65, 3, 203, 53, 144, 140, 194, 71, 27, 10, 175, + 218, 149, 242, 213, 150, 9, 199, 22, 202, 155, 5, 44, 23, 111, 102, + 5, 150, 32, 62, 31, 220, 1, 129, 151, 109, 27, 215, 54, 235, 104, + 157, 123, 8, 89, 94, 161, 197, 0, 163, 75, 124, 41, 240, 192, 109, + 9, 202, 124, 25, 82, 95, 243, 170, 63, 91, 248, 4, 63, 47, 208, + 243, 61, 85, 62, 107, 32, 87, 19, 208, 87, 120, 234, 108, 244, 44, + 158, 238, 91, 185, 219, 105, 13, 254, 85, 208, 93, 148, 144, 160, 98, + 237, 72, 27, 59, 119, 22, 99, 52, 193, 190, 57, 171, 46, 247, 180, + 126, 30, 16, 200, 88, 35, 212, 215, 253, 218, 25, 96, 40, 44, 53, + 29, 129, 153, 154, 197, 238, 84, 201, 244, 106, 184, 178, 127, 54, 198, + 60, 160, 98, 4, 229, 110, 220, 225, 26, 254, 238, 123, 69, 248, 222, + 43, 122, 207, 63, 166, 246, 171, 129, 231, 7, 89, 132, 245, 76, 55, + 174, 184, 93, 139, 221, 250, 11, 86, 239, 248, 14, 98, 226, 66, 146, + 45, 59, 106, 78, 6, 253, 6, 128, 53, 174, 7, 36, 100, 130, 22, + 47, 157, 147, 27, 31, 15, 97, 122, 46, 137, 84, 126, 104, 48, 217, + 236, 131, 51, 253, 147, 23, 35, 133, 43, 183, 124, 197, 150, 85, 170, + 39, 96, 227, 44, 130, 51, 83, 224, 22, 177, 39, 65, 125, 98, 28, + 162, 56, 25, 112, 81, 50, 28, 118, 184, 45, 236, 226, 87, 117, 111, + 219, 157, 34, 224, 77, 68, 59, 91, 80, 177, 178, 188, 203, 247, 133, + 130, 15, 61, 125, 252, 18, 201, 87, 157, 158, 47, 5, 151, 104, 231, + 127, 161, 154, 172, 224, 74, 95, 195, 121, 175, 200, 18, 26, 240, 194, + 222, 85, 189, 238, 106, 136, 195, 28, 170, 10, 115, 25, 236, 203, 127, + 254, 103, 79, 175, 57, 159, 102, 193, 106, 136, 130, 195, 16, 19, 14, + 240, 130, 74, 217, 154, 5, 217, 88, 21, 113, 205, 138, 241, 209, 39, + 255, 182, 100, 41, 243, 199, 191, 7, 123, 185, 7, 186, 28, 32, 71, + 236, 16, 220, 222, 5, 122, 74, 55, 95, 19, 230, 127, 201, 130, 180, + 143, 142, 149, 229, 43, 81, 95, 32, 138, 165, 42, 136, 231, 106, 34, + 90, 135, 60, 60, 105, 191, 50, 195, 62, 230, 189, 100, 41, 110, 61, + 204, 139, 237, 185, 208, 136, 61, 249, 12, 20, 230, 48, 141, 65, 17, + 204, 126, 215, 73, 77, 129, 49, 230, 39, 247, 222, 109, 50, 151, 255, + 246, 141, 254, 233, 117, 156, 172, 113, 74, 72, 133, 218, 227, 4, 192, + 27, 185, 21, 99, 61, 34, 52, 112, 74, 18, 149, 38, 195, 43, 154, + 8, 16, 189, 142, 139, 167, 137, 2, 155, 165, 1, 255, 158, 107, 131, + 141, 112, 87, 102, 97, 12, 228, 30, 143, 60, 14, 238, 183, 145, 88, + 116, 187, 64, 138, 136, 138, 24, 16, 241, 126, 37, 103, 99, 203, 164, + 198, 129, 140, 189, 18, 178, 241, 154, 7, 81, 8, 75, 196, 131, 121, + 19, 52, 90, 125, 71, 179, 8, 102, 149, 117, 88, 2, 58, 115, 41, + 254, 118, 205, 28, 244, 153, 79, 179, 136, 194, 59, 55, 233, 48, 87, + 218, 151, 218, 172, 109, 72, 156, 112, 175, 129, 111, 124, 151, 112, 69, + 175, 237, 175, 208, 35, 15, 70, 189, 245, 118, 229, 51, 121, 237, 106, + 57, 190, 157, 42, 37, 107, 108, 240, 142, 180, 123, 58, 243, 99, 76, + 153, 94, 235, 148, 3, 146, 198, 250, 3, 176, 73, 105, 64, 3, 129, + 155, 69, 66, 114, 55, 53, 31, 200, 171, 9, 127, 227, 81, 238, 0, + 29, 54, 79, 184, 213, 44, 21, 21, 106, 118, 193, 193, 132, 216, 89, + 39, 107, 40, 29, 198, 229, 184, 123, 32, 225, 148, 78, 40, 236, 108, + 100, 112, 139, 33, 176, 201, 41, 56, 180, 87, 100, 161, 247, 181, 48, + 215, 32, 88, 3, 2, 69, 189, 162, 185, 155, 129, 131, 151, 170, 201, + 203, 192, 141, 27, 38, 21, 174, 100, 48, 138, 216, 113, 123, 137, 161, + 92, 153, 129, 184, 21, 205, 18, 190, 184, 189, 57, 130, 168, 67, 161, + 16, 207, 223, 35, 254, 40, 169, 65, 104, 178, 164, 88, 198, 40, 58, + 221, 211, 96, 91, 98, 147, 157, 193, 121, 211, 28, 185, 217, 84, 58, + 236, 70, 181, 35, 58, 27, 111, 52, 213, 103, 93, 154, 18, 60, 201, + 180, 29, 28, 85, 126, 170, 190, 231, 64, 27, 191, 83, 158, 125, 124, + 43, 172, 198, 25, 151, 108, 116, 7, 164, 114, 92, 215, 197, 222, 31, + 231, 41, 112, 42, 172, 207, 164, 87, 123, 138, 156, 78, 44, 131, 127, + 155, 114, 138, 219, 52, 223, 150, 230, 94, 165, 103, 45, 139, 238, 161, + 208, 117, 178, 225, 67, 90, 90, 110, 176, 20, 110, 4, 189, 194, 138, + 12, 168, 150, 181, 139, 54, 241, 243, 87, 19, 136, 251, 68, 1, 239, + 85, 161, 139, 67, 117, 239, 162, 214, 96, 205, 66, 79, 13, 47, 16, + 72, 171, 33, 246, 93, 197, 65, 115, 108, 87, 83, 116, 49, 66, 34, + 18, 101, 65, 24, 178, 147, 34, 61, 242, 51, 246, 191, 249, 164, 200, + 210, 150, 146, 46, 157, 137, 147, 161, 25, 101, 217, 142, 125, 241, 73, + 115, 83, 86, 208, 167, 233, 77, 109, 89, 197, 219, 108, 206, 54, 99, + 113, 101, 77, 41, 251, 24, 203, 179, 28, 109, 62, 248, 113, 197, 82, + 35, 89, 132, 11, 184, 194, 237, 142, 71, 81, 173, 36, 220, 103, 66, + 254, 78, 252, 105, 211, 89, 149, 132, 218, 43, 45, 77, 64, 137, 248, + 238, 145, 172, 64, 78, 123, 225, 161, 166, 202, 94, 210, 227, 36, 254, + 153, 230, 23, 21, 82, 125, 167, 115, 10, 25, 141, 144, 226, 25, 151, + 22, 157, 162, 2, 250, 16, 161, 48, 111, 121, 9, 191, 229, 41, 136, + 83, 163, 165, 10, 195, 34, 56, 145, 166, 99, 184, 180, 180, 159, 95, + 110, 17, 46, 227, 245, 97, 207, 27, 113, 121, 55, 196, 29, 248, 171, + 108, 250, 236, 1, 31, 108, 15, 34, 233, 32, 250, 127, 67, 159, 151, + 145, 5, 171, 219, 102, 159, 137, 231, 130, 229, 177, 209, 253, 150, 217, + 76, 62, 111, 42, 25, 152, 169, 83, 245, 164, 127, 61, 128, 35, 234, + 8, 69, 152, 103, 107, 18, 98, 101, 214, 205, 136, 68, 165, 54, 48, + 189, 59, 29, 254, 128, 255, 249, 46, 23, 246, 29, 131, 185, 27, 160, + 235, 16, 52, 232, 247, 100, 230, 137, 91, 111, 48, 202, 31, 126, 167, + 162, 45, 159, 66, 215, 176, 32, 5, 255, 82, 108, 31, 184, 89, 6, + 73, 8, 209, 86, 202, 122, 111, 132, 39, 140, 160, 74, 148, 254, 21, + 33, 80, 180, 165, 241, 182, 74, 205, 243, 194, 17, 216, 113, 8, 239, + 190, 34, 158, 31, 58, 223, 249, 51, 74, 174, 191, 157, 185, 12, 98, + 190, 135, 91, 198, 25, 221, 76, 118, 88, 240, 184, 188, 70, 92, 36, + 208, 124, 43, 228, 200, 86, 193, 178, 251, 115, 233, 240, 11, 134, 91, + 230, 141, 195, 161, 255, 12, 103, 85, 187, 84, 129, 202, 48, 85, 155, + 242, 226, 185, 109, 126, 2, 8, 174, 221, 203, 67, 182, 52, 114, 243, + 219, 32, 89, 183, 125, 18, 209, 200, 99, 116, 123, 185, 17, 250, 250, + 223, 129, 221, 147, 249, 142, 238, 25, 230, 85, 85, 141, 248, 144, 13, + 241, 3, 10, 253, 74, 96, 82, 115, 210, 221, 17, 79, 213, 119, 27, + 192, 55, 41, 161, 125, 167, 87, 45, 10, 246, 22, 76, 245, 83, 4, + 160, 242, 62, 221, 89, 206, 80, 235, 33, 34, 81, 125, 28, 117, 233, + 167, 89, 6, 132, 138, 130, 88, 227, 245, 44, 138, 180, 42, 215, 4, + 177, 9, 167, 135, 173, 234, 185, 119, 100, 108, 4, 237, 145, 52, 227, + 61, 231, 130, 77, 97, 204, 175, 136, 225, 27, 29, 36, 142, 151, 129, + 170, 105, 233, 88, 57, 122, 219, 60, 16, 70, 253, 218, 123, 188, 49, + 210, 121, 115, 150, 249, 213, 246, 76, 2, 197, 196, 24, 169, 143, 175, + 230, 138, 32, 81, 191, 13, 166, 211, 252, 110, 84, 221, 244, 13, 45, + 116, 242, 123, 18, 153, 163, 187, 46, 33, 28, 160, 219, 179, 85, 166, + 2, 125, 92, 99, 147, 61, 4, 200, 245, 135, 172, 187, 4, 101, 102, + 85, 79, 168, 53, 222, 129, 150, 252, 253, 252, 45, 39, 64, 33, 104, + 69, 239, 180, 71, 234, 177, 245, 185, 59, 238, 88, 65, 58, 156, 84, + 238, 150, 46, 236, 65, 229, 33, 221, 168, 102, 249, 163, 155, 36, 189, + 54, 211, 154, 247, 69, 45, 47, 140, 119, 63, 143, 129, 163, 38, 120, + 88, 216, 66, 117, 118, 176, 93, 153, 42, 129, 198, 45, 203, 26, 150, + 43, 17, 53, 104, 196, 82, 234, 59, 129, 81, 14, 104, 229, 8, 204, + 187, 8, 168, 112, 18, 211, 154, 195, 181, 87, 241, 234, 148, 68, 229, + 231, 23, 134, 14, 97, 119, 22, 48, 123, 17, 115, 105, 180, 124, 135, + 51, 177, 104, 187, 23, 210, 76, 161, 8, 36, 57, 218, 252, 142, 236, + 154, 178, 119, 129, 189, 255, 208, 56, 25, 70, 68, 50, 57, 172, 77, + 154, 163, 80, 33, 180, 118, 57, 105, 97, 5, 50, 158, 185, 226, 119, + 237, 163, 47, 79, 233, 114, 160, 246, 93, 238, 197, 217, 240, 55, 121, + 37, 138, 104, 245, 181, 30, 133, 129, 94, 97, 31, 188, 121, 119, 74, + 227, 167, 196, 194, 108, 185, 63, 242, 0, 224, 8, 162, 49, 173, 57, + 250, 12, 113, 238, 241, 0, 180, 180, 198, 57, 180, 248, 243, 214, 122, + 103, 81, 205, 243, 232, 213, 39, 122, 142, 107, 4, 63, 123, 147, 22, + 78, 174, 200, 33, 27, 16, 76, 139, 230, 32, 101, 246, 228, 246, 89, + 15, 30, 11, 87, 174, 70, 195, 104, 14, 26, 209, 149, 19, 254, 121, + 62, 186, 224, 56, 247, 10, 237, 102, 83, 215, 211, 22, 123, 161, 52, + 251, 122, 142, 228, 191, 93, 151, 174, 176, 166, 64, 184, 254, 113, 140, + 214, 109, 159, 126, 201, 95, 245, 167, 180, 165, 106, 61, 83, 143, 239, + 68, 254, 0, 201, 237, 162, 231, 108, 152, 131, 248, 39, 149, 131, 80, + 224, 41, 14, 157, 96, 16, 251, 139, 15, 153, 45, 29, 84, 116, 154, + 221, 234, 127, 39, 10, 244, 3, 92, 154, 93, 125, 209, 252, 144, 73, + 139, 47, 93, 98, 78, 7, 61, 173, 117, 46, 155, 73, 76, 127, 202, + 5, 223, 113, 215, 86, 54, 82, 0, 105, 16, 52, 226, 140, 232, 53, + 23, 76, 117, 212, 139, 183, 112, 95, 162, 174, 153, 104, 4, 241, 133, + 159, 188, 4, 147, 92, 125, 133, 104, 26, 241, 130, 13, 239, 96, 235, + 36, 195, 74, 193, 126, 54, 27, 55, 190, 97, 44, 26, 106, 31, 76, + 244, 174, 179, 1, 97, 168, 114, 14, 65, 60, 199, 182, 133, 130, 65, + 175, 95, 224, 125, 74, 157, 34, 99, 26, 135, 160, 188, 244, 114, 175, + 211, 194, 74, 97, 182, 244, 93, 3, 219, 223, 154, 204, 10, 132, 233, + 165, 23, 204, 187, 163, 179, 23, 72, 137, 22, 40, 123, 77, 216, 95, + 44, 20, 55, 213, 165, 125, 17, 237, 77, 140, 2, 146, 193, 104, 9, + 83, 40, 126, 177, 137, 53, 89, 59, 23, 49, 80, 240, 168, 70, 97, + 250, 36, 161, 17, 228, 161, 136, 213, 43, 118, 106, 198, 251, 68, 223, + 34, 79, 123, 118, 91, 222, 236, 73, 236, 175, 255, 248, 249, 96, 53, + 245, 248, 238, 12, 106, 127, 183, 1, 31, 193, 14, 126, 7, 19, 252, + 102, 191, 74, 208, 115, 140, 76, 133, 179, 82, 5, 83, 122, 154, 82, + 37, 19, 171, 190, 177, 177, 233, 248, 175, 214, 93, 17, 121, 167, 249, + 165, 149, 191, 145, 188, 218, 99, 154, 55, 109, 202, 12, 17, 56, 107, + 124, 137, 156, 233, 85, 18, 237, 207, 9, 72, 10, 218, 98, 58, 70, + 254, 207, 179, 61, 201, 250, 163, 135, 215, 130, 182, 47, 93, 123, 14, + 251, 252, 34, 240, 172, 151, 111, 127, 19, 6, 165, 96, 254, 15, 32, + 153, 247, 91, 200, 78, 169, 160, 28, 70, 146, 251, 174, 49, 54, 98, + 93, 161, 19, 105, 195, 62, 196, 38, 84, 53, 122, 177, 158, 179, 113, + 93, 91, 102, 90, 119, 52, 120, 247, 208, 228, 233, 97, 240, 187, 205, + 14, 194, 35, 134, 229, 241, 16, 152, 130, 206, 63, 93, 110, 21, 52, + 170, 67, 99, 214, 121, 230, 201, 133, 173, 143, 225, 81, 184, 139, 105, + 226, 58, 237, 106, 16, 91, 163, 15, 4, 63, 94, 186, 80, 219, 85, + 209, 183, 129, 122, 39, 8, 140, 180, 203, 167, 223, 148, 74, 147, 29, + 237, 108, 105, 143, 229, 254, 104, 243, 111, 210, 11, 185, 158, 151, 90, + 47, 43, 233, 91, 18, 119, 144, 184, 63, 64, 3, 244, 225, 30, 134, + 198, 210, 41, 103, 2, 31, 221, 74, 26, 54, 18, 23, 242, 104, 39, + 31, 167, 183, 209, 105, 192, 88, 219, 25, 134, 228, 8, 222, 149, 25, + 195, 141, 61, 33, 114, 213, 93, 6, 58, 12, 191, 113, 216, 153, 39, + 235, 173, 146, 34, 139, 210, 13, 59, 240, 88, 10, 71, 72, 27, 225, + 32, 70, 92, 182, 120, 151, 82, 246, 248, 93, 119, 13, 199, 161, 48, + 202, 84, 88, 226, 198, 249, 152, 165, 34, 183, 109, 9, 196, 232, 168, + 236, 241, 85, 100, 181, 81, 235, 85, 247, 85, 173, 57, 141, 145, 116, + 254, 146, 249, 161, 133, 245, 17, 117, 141, 208, 49, 245, 121, 181, 158, + 144, 197, 200, 63, 202, 119, 158, 107, 112, 56, 178, 227, 29, 87, 48, + 151, 228, 55, 194, 130, 52, 12, 35, 245, 171, 149, 90, 206, 151, 205, + 184, 221, 45, 57, 126, 64, 203, 244, 167, 172, 134, 141, 5, 145, 101, + 29, 33, 133, 90, 17, 64, 127, 152, 209, 78, 10, 131, 151, 157, 204, + 231, 255, 164, 122, 16, 78, 220, 245, 161, 229, 90, 203, 12, 205, 95, + 8, 47, 51, 92, 23, 118, 95, 211, 124, 116, 147, 74, 79, 10, 192, + 217, 74, 80, 127, 17, 105, 56, 248, 144, 72, 197, 159, 230, 19, 147, + 31, 50, 239, 236, 92, 237, 131, 159, 88, 99, 171, 76, 209, 41, 181, + 194, 28, 3, 242, 137, 227, 20, 198, 120, 6, 12, 97, 45, 210, 143, + 177, 60, 83, 61, 135, 132, 187, 54, 61, 82, 149, 193, 23, 45, 6, + 95, 28, 167, 0, 67, 27, 17, 93, 241, 43, 221, 109, 102, 179, 204, + 80, 198, 60, 229, 38, 47, 100, 235, 50, 166, 193, 79, 255, 71, 207, + 116, 216, 201, 255, 134, 194, 201, 34, 169, 250, 28, 217, 198, 176, 10, + 203, 193, 197, 125, 80, 116, 149, 108, 224, 10, 195, 68, 228, 218, 85, + 146, 119, 67, 73, 118, 186, 171, 162, 86, 198, 176, 73, 41, 162, 237, + 196, 130, 32, 231, 70, 197, 139, 140, 182, 151, 221, 55, 95, 183, 58, + 43, 141, 160, 148, 193, 197, 162, 189, 62, 36, 226, 255, 214, 75, 166, + 163, 78, 30, 253, 52, 8, 190, 55, 241, 60, 187, 226, 34, 177, 102, + 155, 56, 165, 51, 183, 2, 181, 247, 125, 53, 36, 206, 73, 32, 19, + 20, 204, 228, 105, 254, 34, 201, 161, 175, 232, 223, 216, 103, 247, 13, + 68, 49, 206, 172, 122, 11, 17, 3, 55, 101, 94, 39, 18, 183, 214, + 16, 149, 252, 137, 39, 205, 84, 114, 80, 101, 246, 222, 173, 145, 229, + 199, 73, 91, 219, 123, 235, 45, 190, 39, 241, 146, 209, 124, 178, 151, + 30, 19, 26, 112, 150, 192, 183, 237, 124, 253, 165, 28, 130, 132, 161, + 157, 140, 159, 163, 87, 181, 211, 166, 233, 0, 180, 87, 125, 229, 173, + 128, 90, 23, 38, 235, 143, 31, 117, 66, 203, 76, 150, 249, 19, 23, + 45, 184, 56, 249, 220, 114, 205, 1, 215, 169, 205, 173, 58, 188, 128, + 116, 122, 184, 48, 114, 95, 167, 3, 191, 136, 238, 124, 245, 166, 82, + 191, 16, 212, 149, 183, 166, 14, 212, 255, 67, 106, 50, 159, 172, 211, + 101, 207, 198, 242, 179, 40, 1, 73, 20, 64, 185, 29, 21, 216, 246, + 154, 104, 156, 214, 231, 192, 137, 220, 150, 215, 4, 80, 110, 164, 185, + 68, 114, 110, 234, 45, 143, 171, 196, 148, 151, 237, 16, 251, 68, 221, + 100, 18, 212, 110, 59, 147, 113, 217, 152, 28, 83, 198, 211, 231, 35, + 39, 198, 19, 163, 67, 40, 24, 124, 52, 138, 161, 254, 233, 90, 24, + 214, 222, 121, 189, 95, 180, 77, 147, 21, 187, 111, 9, 184, 75, 209, + 250, 81, 110, 34, 97, 198, 132, 182, 229, 192, 208, 67, 98, 124, 108, + 141, 89, 37, 124, 11, 5, 128, 76, 13, 220, 167, 201, 182, 151, 45, + 235, 37, 142, 35, 192, 28, 209, 254, 40, 15, 22, 183, 181, 138, 144, + 72, 21, 48, 9, 133, 127, 74, 187, 19, 170, 88, 209, 119, 194, 230, + 243, 237, 156, 184, 156, 46, 118, 58, 7, 139, 163, 157, 167, 65, 249, + 102, 228, 201, 27, 255, 189, 54, 151, 168, 108, 129, 113, 106, 245, 244, + 158, 176, 247, 193, 161, 94, 248, 190, 38, 208, 177, 246, 108, 158, 199, + 56, 37, 141, 101, 102, 44, 109, 144, 23, 214, 235, 251, 210, 184, 103, + 145, 248, 118, 162, 139, 84, 61, 146, 29, 70, 170, 80, 30, 145, 156, + 202, 185, 222, 87, 247, 137, 153, 98, 166, 61, 173, 200, 164, 40, 2, + 137, 226, 66, 162, 24, 172, 46, 203, 80, 176, 156, 93, 26, 48, 69, + 130, 192, 129, 84, 70, 15, 25, 224, 175, 31, 161, 110, 61, 220, 214, + 220, 152, 22, 41, 51, 57, 114, 182, 139, 129, 159, 194, 169, 133, 246, + 37, 23, 79, 90, 88, 231, 6, 252, 101, 241, 250, 168, 71, 149, 252, + 196, 126, 2, 29, 177, 70, 218, 120, 203, 72, 243, 46, 45, 149, 57, + 108, 37, 198, 38, 177, 210, 32, 252, 227, 160, 77, 174, 211, 207, 212, + 82, 139, 189, 79, 198, 116, 165, 185, 49, 188, 43, 116, 230, 182, 34, + 224, 138, 216, 93, 93, 94, 175, 10, 217, 41, 209, 177, 36, 142, 205, + 241, 34, 129, 8, 91, 78, 210, 231, 166, 188, 18, 77, 139, 201, 203, + 3, 154, 131, 8, 193, 207, 255, 98, 166, 192, 215, 206, 236, 217, 9, + 19, 78, 227, 105, 146, 56, 50, 60, 114, 20, 239, 186, 119, 113, 183, + 79, 186, 126, 223, 131, 30, 217, 249, 82, 10, 188, 238, 161, 46, 174, + 96, 6, 187, 251, 234, 62, 163, 213, 55, 71, 253, 25, 193, 26, 176, + 111, 20, 167, 220, 240, 78, 243, 42, 104, 194, 0, 62, 53, 119, 199, + 9, 202, 20, 164, 55, 155, 204, 107, 120, 180, 6, 20, 114, 122, 130, + 143, 124, 89, 130, 66, 140, 43, 183, 203, 216, 78, 86, 178, 16, 226, + 159, 192, 205, 105, 113, 138, 165, 108, 18, 214, 100, 154, 71, 150, 46, + 70, 178, 181, 68, 68, 160, 253, 18, 19, 220, 253, 207, 87, 105, 32, + 239, 229, 137, 155, 176, 139, 168, 248, 143, 86, 67, 224, 146, 17, 80, + 147, 87, 30, 168, 125, 169, 91, 59, 55, 169, 142, 226, 71, 181, 114, + 40, 231, 229, 155, 27, 31, 144, 166, 96, 9, 85, 90, 152, 25, 83, + 113, 15, 65, 106, 162, 151, 74, 7, 27, 188, 221, 150, 108, 96, 102, + 233, 174, 208, 9, 170, 159, 239, 67, 230, 187, 93, 141, 102, 218, 191, + 48, 22, 53, 124, 84, 96, 110, 43, 28, 126, 26, 32, 104, 104, 65, + 99, 112, 207, 167, 54, 175, 165, 152, 105, 234, 18, 138, 148, 101, 9, + 87, 32, 155, 192, 7, 100, 101, 72, 133, 203, 170, 248, 222, 190, 243, + 0, 75, 100, 38, 52, 98, 125, 66, 185, 104, 255, 8, 184, 116, 195, + 32, 239, 213, 54, 28, 185, 96, 177, 233, 30, 210, 25, 155, 28, 128, + 53, 88, 101, 146, 68, 52, 60, 55, 183, 171, 157, 207, 128, 53, 60, + 22, 100, 53, 121, 124, 205, 163, 55, 82, 162, 96, 99, 71, 184, 243, + 169, 137, 77, 191, 16, 55, 59, 220, 197, 20, 4, 61, 89, 4, 157, + 96, 171, 145, 91, 145, 19, 36, 195, 42, 132, 152, 83, 255, 137, 64, + 37, 72, 190, 82, 29, 181, 41, 175, 144, 46, 229, 236, 217, 105, 194, + 7, 118, 19, 47, 151, 238, 222, 255, 183, 236, 181, 175, 135, 91, 55, + 163, 4, 156, 190, 18, 153, 21, 178, 51, 102, 36, 62, 253, 228, 12, + 102, 230, 138, 183, 182, 253, 54, 170, 251, 50, 107, 223, 180, 177, 74, + 169, 231, 208, 76, 47, 146, 158, 251, 181, 9, 219, 240, 169, 72, 250, + 241, 125, 86, 200, 125, 166, 137, 65, 115, 18, 68, 241, 124, 51, 128, + 223, 113, 239, 201, 221, 152, 21, 114, 127, 79, 101, 44, 48, 241, 21, + 221, 91, 240, 214, 166, 119, 140, 21, 143, 155, 172, 26, 207, 233, 0, + 128, 118, 45, 22, 6, 222, 75, 90, 99, 173, 214, 121, 53, 71, 183, + 253, 19, 95, 71, 66, 16, 41, 35, 195, 9, 93, 247, 42, 150, 49, + 46, 229, 73, 220, 12, 230, 51, 109, 147, 108, 124, 102, 83, 78, 75, + 67, 141, 55, 246, 155, 195, 190, 56, 116, 59, 185, 237, 104, 78, 66, + 173, 165, 178, 32, 93, 14, 10, 46, 30, 229, 108, 50, 52, 188, 2, + 244, 142, 201, 8, 245, 53, 210, 132, 15, 184, 82, 85, 156, 142, 35, + 49, 39, 183, 58, 61, 96, 143, 60, 190, 41, 152, 9, 183, 127, 90, + 157, 109, 196, 76, 36, 177, 244, 173, 63, 233, 1, 16, 110, 216, 203, + 94, 245, 195, 71, 55, 161, 149, 230, 122, 159, 133, 143, 180, 129, 6, + 111, 56, 211, 30, 13, 142, 216, 122, 87, 69, 91, 233, 254, 4, 232, + 207, 157, 32, 113, 50, 227, 233, 158, 171, 38, 228, 191, 121, 56, 165, + 222, 22, 180, 217, 111, 104, 112, 134, 12, 22, 244, 44, 234, 34, 253, + 217, 212, 140, 93, 235, 36, 54, 4, 129, 32, 91, 197, 163, 24, 71, + 133, 161, 111, 114, 29, 19, 45, 100, 10, 207, 139, 158, 219, 206, 160, + 248, 94, 12, 241, 58, 118, 141, 115, 166, 177, 78, 173, 59, 85, 81, + 97, 240, 154, 231, 79, 200, 199, 195, 205, 98, 245, 129, 246, 217, 97, + 209, 249, 194, 28, 179, 49, 248, 14, 6, 128, 61, 178, 15, 190, 32, + 251, 111, 225, 148, 0, 11, 227, 246, 146, 46, 41, 231, 24, 80, 43, + 174, 228, 166, 171, 206, 72, 142, 253, 96, 242, 181, 31, 207, 95, 66, + 88, 152, 165, 67, 7, 238, 23, 114, 50, 224, 212, 241, 202, 224, 247, + 70, 215, 162, 8, 237, 121, 169, 254, 191, 30, 19, 72, 252, 3, 109, + 5, 206, 105, 130, 69, 250, 250, 232, 135, 203, 253, 77, 102, 203, 40, + 72, 128, 223, 60, 59, 83, 103, 162, 117, 47, 200, 65, 88, 43, 168, + 168, 255, 46, 166, 86, 193, 231, 227, 92, 222, 186, 44, 20, 166, 136, + 123, 193, 88, 155, 166, 185, 73, 85, 124, 253, 80, 43, 176, 173, 191, + 2, 10, 50, 101, 143, 17, 129, 56, 191, 83, 103, 183, 143, 247, 253, + 161, 1, 76, 161, 76, 127, 194, 108, 88, 138, 152, 147, 164, 65, 147, + 61, 160, 192, 44, 56, 103, 144, 51, 153, 224, 38, 97, 173, 128, 34, + 85, 89, 143, 17, 239, 200, 47, 160, 2, 151, 249, 219, 208, 116, 71, + 205, 72, 210, 178, 205, 184, 207, 19, 37, 127, 183, 21, 229, 176, 91, + 196, 203, 225, 67, 189, 94, 214, 180, 203, 140, 186, 39, 250, 66, 3, + 128, 35, 206, 43, 67, 244, 207, 157, 165, 188, 201, 173, 43, 47, 210, + 139, 254, 144, 218, 62, 55, 6, 187, 32, 128, 206, 56, 74, 66, 42, + 159, 171, 108, 56, 220, 246, 127, 127, 32, 221, 190, 33, 91, 93, 88, + 36, 51, 115, 93, 47, 203, 133, 155, 166, 13, 124, 118, 56, 182, 202, + 55, 224, 226, 36, 233, 9, 200, 217, 249, 22, 252, 209, 179, 66, 32, + 30, 129, 48, 186, 232, 66, 248, 197, 120, 168, 191, 124, 16, 232, 117, + 44, 125, 188, 157, 71, 35, 245, 219, 17, 111, 41, 159, 96, 44, 233, + 3, 105, 109, 199, 182, 42, 34, 87, 218, 48, 142, 196, 99, 37, 89, + 44, 173, 184, 160, 104, 203, 224, 230, 58, 60, 213, 132, 9, 9, 253, + 251, 72, 75, 235, 224, 20, 198, 208, 178, 42, 253, 126, 105, 227, 171, + 89, 93, 42, 222, 185, 232, 8, 248, 83, 78, 132, 37, 38, 173, 67, + 116, 185, 216, 47, 192, 196, 221, 172, 26, 5, 191, 41, 33, 114, 40, + 139, 22, 147, 173, 234, 41, 252, 118, 244, 73, 73, 237, 42, 6, 123, + 228, 213, 210, 202, 65, 195, 253, 112, 57, 202, 85, 247, 15, 160, 237, + 138, 76, 70, 94, 230, 163, 112, 217, 134, 78, 213, 55, 68, 198, 29, + 195, 16, 138, 162, 19, 34, 158, 144, 131, 64, 244, 80, 85, 63, 175, + 47, 63, 233, 175, 168, 190, 39, 4, 47, 200, 9, 161, 248, 198, 182, + 166, 56, 23, 5, 121, 188, 46, 90, 56, 216, 72, 203, 107, 212, 171, + 110, 134, 255, 24, 243, 30, 188, 55, 111, 8, 238, 198, 201, 180, 150, + 230, 191, 248, 10, 82, 178, 247, 114, 216, 83, 183, 24, 188, 131, 26, + 246, 210, 42, 30, 111, 181, 215, 129, 41, 21, 207, 15, 83, 86, 252, + 169, 220, 246, 117, 114, 254, 143, 193, 60, 123, 226, 202, 18, 77, 221, + 135, 84, 180, 229, 79, 143, 241, 219, 217, 85, 158, 63, 5, 245, 134, + 63, 102, 68, 145, 100, 35, 13, 127, 241, 76, 211, 204, 45, 125, 175, + 128, 142, 244, 189, 203, 138, 63, 249, 2, 174, 167, 171, 32, 131, 12, + 250, 248, 198, 245, 3, 98, 4, 111, 244, 226, 122, 136, 58, 189, 234, + 244, 106, 117, 92, 97, 191, 247, 95, 114, 20, 151, 51, 67, 174, 236, + 109, 252, 215, 107, 183, 174, 254, 59, 22, 158, 203, 152, 194, 135, 200, + 61, 193, 249, 199, 24, 167, 119, 223, 205, 135, 112, 51, 118, 120, 253, + 75, 61, 101, 172, 213, 36, 226, 135, 54, 229, 214, 151, 9, 2, 197, + 84, 22, 207, 55, 182, 191, 53, 243, 63, 53, 13, 93, 121, 44, 174, + 237, 192, 138, 116, 208, 200, 134, 94, 34, 122, 110, 157, 231, 169, 177, + 180, 203, 167, 125, 73, 44, 57, 104, 204, 174, 36, 172, 47, 21, 36, + 220, 92, 62, 191, 77, 113, 5, 32, 8, 115, 61, 235, 237, 27, 76, + 69, 187, 117, 72, 26, 49, 217, 249, 130, 134, 139, 27, 229, 183, 146, + 80, 3, 154, 25, 26, 52, 175, 157, 1, 91, 126, 165, 6, 168, 134, + 60, 32, 227, 68, 161, 126, 207, 247, 160, 103, 105, 156, 129, 211, 220, + 155, 222, 60, 184, 255, 149, 9, 116, 201, 151, 42, 126, 0, 36, 167, + 178, 40, 160, 5, 115, 82, 176, 207, 38, 10, 213, 132, 57, 255, 138, + 4, 204, 32, 33, 128, 174, 99, 94, 161, 237, 0, 230, 209, 198, 89, + 167, 80, 193, 116, 195, 111, 204, 241, 169, 46, 117, 108, 244, 247, 12, + 216, 106, 50, 242, 209, 61, 42, 214, 33, 25, 38, 138, 217, 225, 105, + 76, 244, 126, 252, 253, 57, 238, 107, 166, 158, 250, 132, 105, 91, 184, + 209, 217, 5, 202, 84, 254, 51, 233, 58, 2, 141, 130, 47, 97, 125, + 244, 95, 177, 68, 9, 213, 115, 118, 215, 70, 9, 64, 113, 139, 19, + 165, 231, 204, 191, 129, 15, 235, 143, 225, 241, 75, 168, 227, 126, 58, + 201, 98, 16, 227, 27, 148, 166, 1, 34, 110, 84, 120, 11, 181, 150, + 111, 167, 184, 49, 244, 231, 192, 44, 59, 41, 122, 58, 12, 185, 180, + 54, 122, 106, 201, 2, 65, 118, 129, 149, 139, 31, 201, 205, 90, 96, + 76, 23, 43, 218, 15, 233, 202, 103, 84, 18, 122, 25, 218, 38, 252, + 222, 104, 172, 96, 30, 57, 205, 130, 106, 183, 189, 230, 67, 63, 162, + 142, 46, 199, 45, 244, 3, 26, 208, 119, 15, 16, 29, 196, 178, 90, + 41, 94, 193, 64, 51, 205, 136, 157}; diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec.c new file mode 100644 index 0000000..89bee66 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec.c @@ -0,0 +1,194 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: rijndael_enc + + Author: Dr Brian Gladman + + Function: rijndael_dec is an implementation of the AES decryption + algorithm (Rijndael). + + Source: security section of MiBench + + Changes: Add computation of a checksum, refactoring + + License: see below + +*/ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +#include "aes.h" +#include "rijndael_dec_libc.h" + +/* + Global variable definitions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +unsigned char rijndael_dec_key[32]; +int rijndael_dec_key_len; + +extern unsigned char rijndael_dec_data[]; +struct rijndael_dec_FILE rijndael_dec_fin; + +int rijndael_dec_checksum = 0; + +/* + Forward declaration of functions +*/ +void rijndael_dec_init(void); +int rijndael_dec_return(void); +void rijndael_dec_fillrand(unsigned char *buf, int len); +void rijndael_dec_decfile(struct rijndael_dec_FILE *fin, struct aes *ctx); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_dec_main(void); + +void +rijndael_dec_init(void) { + /* create a pseudo-file for the input*/ + rijndael_dec_fin.data = rijndael_dec_data; + rijndael_dec_fin.size = 32768; + rijndael_dec_fin.cur_pos = 0; + + unsigned i; + volatile int x = 0; + rijndael_dec_fin.size ^= x; + __pragma_loopbound(32768, 32768); + for (i = 0; i < rijndael_dec_fin.size; i++) + rijndael_dec_fin.data[i] ^= x; + + /* this is a pointer to the hexadecimal key digits */ + const volatile char *cp = + "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321"; + char ch; + int by = 0; + + i = 0; /* this is a count for the input digits processed */ + __pragma_loopbound(64, 64); + while (i < 64 && *cp) { /* the maximum key length is 32 bytes and */ + /* hence at most 64 hexadecimal digits */ + ch = rijndael_dec_toupper(*cp++); /* process a hexadecimal digit */ + if (ch >= '0' && ch <= '9') + by = (by << 4) + ch - '0'; + else if (ch >= 'A' && ch <= 'F') + by = (by << 4) + ch - 'A' + 10; + else { /* error if not hexadecimal */ + rijndael_dec_checksum = -2; + return; + } + + /* store a key byte for each pair of hexadecimal digits */ + if (i++ & 1) + rijndael_dec_key[i / 2 - 1] = by & 0xff; + } + + if (*cp) { + rijndael_dec_checksum = -3; + return; + } else if (i < 32 || (i & 15)) { + rijndael_dec_checksum = -4; + return; + } + + rijndael_dec_key_len = i / 2; +} + +int +rijndael_dec_return(void) { + return ((rijndael_dec_checksum == (int) 262180) ? 0 : -1); +} + +void +rijndael_dec_decfile(struct rijndael_dec_FILE *fin, struct aes *ctx) { + unsigned char inbuf1[16], inbuf2[16], outbuf[16], *bp1, *bp2, *tp; + int i; + + rijndael_dec_fread(inbuf1, 1, 16, fin); + + i = rijndael_dec_fread(inbuf2, 1, 16, + fin); /* read 1st encrypted file block */ + + if (i && i != 16) { + rijndael_dec_checksum = -10; + return; + } + + rijndael_dec_decrypt(inbuf2, outbuf, ctx); /* decrypt it */ + + rijndael_dec_checksum += outbuf[15]; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor with previous input */ + outbuf[i] ^= inbuf1[i]; + + bp1 = inbuf1; /* set up pointers to two input buffers */ + bp2 = inbuf2; + + /* TODO: this is necessarily an input-dependent loop bound */ + __pragma_loopbound(2046, 2046); + while (1) { + i = rijndael_dec_fread(bp1, 1, 16, fin); /* read next encrypted block */ + /* to first input buffer */ + if (i != 16) /* no more bytes in input - the decrypted */ + break; /* partial final buffer needs to be output */ + + /* if a block has been read the previous block must have been */ + /* full lnegth so we can now write it out */ + + rijndael_dec_decrypt(bp1, outbuf, + ctx); /* decrypt the new input block and */ + + rijndael_dec_checksum += outbuf[15]; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor it with previous + input block */ + outbuf[i] ^= bp2[i]; + + /* swap buffer pointers */ + tp = bp1, bp1 = bp2, bp2 = tp; + } +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_dec_main(void) { + struct aes ctx[1]; + + /* decryption in Cipher Block Chaining mode */ + rijndael_dec_set_key(rijndael_dec_key, rijndael_dec_key_len, dec, ctx); + rijndael_dec_decfile(&rijndael_dec_fin, ctx); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main() { + + rijndael_dec_init(); + rijndael_dec_main(); + + return (rijndael_dec_return()); +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.c new file mode 100644 index 0000000..7c0d384 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.c @@ -0,0 +1,70 @@ +#include "rijndael_dec_libc.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int +rijndael_dec_toupper(int c) { + if ((c >= 'a') && (c <= 'z')) + return c - 'a' + 'A'; + return c; +} + +unsigned long +rijndael_dec_fread(void *ptr, unsigned long size, unsigned long count, + struct rijndael_dec_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 16); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +unsigned long +rijndael_dec_fwrite(const void *ptr, unsigned long size, unsigned long count, + struct rijndael_dec_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_write = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 0); + while (i < stream->cur_pos + number_of_chars_to_write) + stream->data[i++] = ((unsigned char *) ptr)[i2++]; + stream->cur_pos += number_of_chars_to_write; + return number_of_chars_to_write; +} + +int +rijndael_dec_fseek(struct rijndael_dec_FILE *stream, long int offset, + Origin origin) { + if (origin == RIJNDAEL_DEC_SEEK_SET) { + stream->cur_pos = offset; + return 0; + } else if (origin == RIJNDAEL_DEC_SEEK_CUR) { + stream->cur_pos += offset; + return 0; + } else if (origin == RIJNDAEL_DEC_SEEK_END) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +int +rijndael_dec_fgetpos(struct rijndael_dec_FILE *stream, unsigned *position) { + *position = stream->cur_pos; + return 0; +} + +int +rijndael_dec_feof(struct rijndael_dec_FILE *stream) { + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.h b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.h new file mode 100644 index 0000000..c200cac --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/default/rijndael_dec_libc.h @@ -0,0 +1,30 @@ + +#ifndef RIJNDAEL_DEC_LIBC_H +#define RIJNDAEL_DEC_LIBC_H + +int rijndael_dec_toupper(int c); + +enum _Origin_ { + RIJNDAEL_DEC_SEEK_SET, + RIJNDAEL_DEC_SEEK_CUR, + RIJNDAEL_DEC_SEEK_END +}; +typedef enum _Origin_ Origin; +struct rijndael_dec_FILE { + unsigned char *data; + unsigned long size; + unsigned cur_pos; +}; + +unsigned long rijndael_dec_fread(void *ptr, unsigned long size, + unsigned long count, + struct rijndael_dec_FILE *stream); +unsigned long rijndael_dec_fwrite(const void *ptr, unsigned long size, + unsigned long count, + struct rijndael_dec_FILE *stream); +int rijndael_dec_fseek(struct rijndael_dec_FILE *stream, long int offset, + Origin origin); +int rijndael_dec_fgetpos(struct rijndael_dec_FILE *stream, unsigned *position); +int rijndael_dec_feof(struct rijndael_dec_FILE *stream); + +#endif // RIJNDAEL_DEC_LIBC_H diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.c new file mode 100644 index 0000000..8dae35b --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.c @@ -0,0 +1,479 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of 128, + bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. +*/ + +#include "aes.h" + +#include "aestab.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define four_tables(x, tab, vf, rf, c) \ + (tab[0][bval(vf(x, 0, c), rf(0, c))] ^ \ + tab[1][bval(vf(x, 1, c), rf(1, c))] ^ \ + tab[2][bval(vf(x, 2, c), rf(2, c))] ^ \ + tab[3][bval(vf(x, 3, c), rf(3, c))]) + +#define vf1(x, r, c) (x) +#define rf1(r, c) (r) +#define rf2(r, c) ((r - c) & 3) + +#define ls_box(x, c) four_tables(x, rijndael_dec_fl_tab, vf1, rf2, c) + +#define inv_mcol(x) four_tables(x, rijndael_dec_im_tab, vf1, rf1, 0) + +/* + Subroutine to set the block size (if variable) in bytes, legal + values being 16, 24 and 32. +*/ + +#define nc (Ncol) + +/* + Initialise the key schedule from the user supplied key. The key + length is now specified in bytes - 16, 24 or 32 as appropriate. + This corresponds to bit lengths of 128, 192 and 256 bits, and + to Nk values of 4, 6 and 8 respectively. +*/ + +#define mx(t, f) (*t++ = inv_mcol(*f), f++) +#define cp(t, f) *t++ = *f++ + +#define cpy(d, s) \ + do { \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + } while (0) // min 1 max 1 +#define mix(d, s) \ + do { \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + } while (0) // min 1 max 1 + +__attribute__((always_inline)) static inline aes_ret +rijndael_dec_set_key(byte in_key[], const word n_bytes, const enum aes_key f, + struct aes *cx) { + word *kf, *kt, rci; + + if ((n_bytes & 7) || n_bytes < 16 || n_bytes > 32 || (!(f & 1) && !(f & 2))) + return (n_bytes ? cx->mode &= ~0x03, + aes_bad : (aes_ret) (cx->Nkey << 2)); + + cx->mode = (cx->mode & ~0x03) | ((byte) f & 0x03); + cx->Nkey = n_bytes >> 2; + cx->Nrnd = Nr(cx->Nkey, (word) nc); + + cx->e_key[0] = word_in(in_key); + cx->e_key[1] = word_in(in_key + 4); + cx->e_key[2] = word_in(in_key + 8); + cx->e_key[3] = word_in(in_key + 12); + + kf = cx->e_key; + kt = kf + nc * (cx->Nrnd + 1) - cx->Nkey; + rci = 0; + + switch (cx->Nkey) { + case 4: + __pragma_loopbound(0, 0); + do { + kf[4] = kf[0] ^ ls_box(kf[3], 3) ^ rijndael_dec_rcon_tab[rci++]; + kf[5] = kf[1] ^ kf[4]; + kf[6] = kf[2] ^ kf[5]; + kf[7] = kf[3] ^ kf[6]; + kf += 4; + } while (kf < kt); + break; + + case 6: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + __pragma_loopbound(0, 0); + do { + kf[6] = kf[0] ^ ls_box(kf[5], 3) ^ rijndael_dec_rcon_tab[rci++]; + kf[7] = kf[1] ^ kf[6]; + kf[8] = kf[2] ^ kf[7]; + kf[9] = kf[3] ^ kf[8]; + kf[10] = kf[4] ^ kf[9]; + kf[11] = kf[5] ^ kf[10]; + kf += 6; + } while (kf < kt); + break; + + case 8: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + cx->e_key[6] = word_in(in_key + 24); + cx->e_key[7] = word_in(in_key + 28); + __pragma_loopbound(7, 7); + do { + kf[8] = kf[0] ^ ls_box(kf[7], 3) ^ rijndael_dec_rcon_tab[rci++]; + kf[9] = kf[1] ^ kf[8]; + kf[10] = kf[2] ^ kf[9]; + kf[11] = kf[3] ^ kf[10]; + kf[12] = kf[4] ^ ls_box(kf[11], 0); + kf[13] = kf[5] ^ kf[12]; + kf[14] = kf[6] ^ kf[13]; + kf[15] = kf[7] ^ kf[14]; + kf += 8; + } while (kf < kt); + break; + } + + if ((cx->mode & 3) != enc) { + word i; + + kt = cx->d_key + nc * cx->Nrnd; + kf = cx->e_key; + + cpy(kt, kf); + kt -= 2 * nc; + + __pragma_loopbound(13, 13); + for (i = 1; i < cx->Nrnd; ++i) { + mix(kt, kf); + kt -= 2 * nc; + } + + cpy(kt, kf); + } + + return aes_good; +} + +__attribute__((always_inline)) static inline short +rijndael_dec_decrypt(const unsigned char in_blk[], unsigned char out_blk[], + const struct aes *cx) { + const unsigned long *kp = cx->d_key; + if (!(cx->mode & 2)) + return 0; + unsigned long b0[4]; + b0[0] = *(unsigned long *) in_blk ^ kp[0]; + b0[1] = *(unsigned long *) (in_blk + 4) ^ kp[1]; + b0[2] = *(unsigned long *) (in_blk + 8) ^ kp[2]; + b0[3] = *(unsigned long *) (in_blk + 12) ^ kp[3]; + kp += 4; + unsigned long b1[4]; + switch (cx->Nrnd) { + case 14: + b1[0] = + kp[0] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + kp += 8; + case 12: + b1[0] = + kp[0] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + kp += 8; + case 10: + b1[0] = + kp[0] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 8)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 8)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 8)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 8)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 12)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 12)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 12)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 12)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 16)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 16)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 16)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 16)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 20)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 20)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 20)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 20)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 24)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 24)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 24)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 24)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 28)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 28)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 28)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 28)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b1[0] >> 24))]); + b1[0] = (kp + 32)[0] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[0])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[1] = (kp + 32)[1] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[1])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[2] >> 24))]); + b1[2] = (kp + 32)[2] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[2])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[3] = (kp + 32)[3] ^ + (rijndael_dec_it_tab[0][((unsigned char) b0[3])] ^ + rijndael_dec_it_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_dec_it_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_dec_it_tab[3][((unsigned char) (b0[0] >> 24))]); + b0[0] = (kp + 36)[0] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[0])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[1] = (kp + 36)[1] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[1])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[2] >> 24))]); + b0[2] = (kp + 36)[2] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[2])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[3] = (kp + 36)[3] ^ + (rijndael_dec_il_tab[0][((unsigned char) b1[3])] ^ + rijndael_dec_il_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_dec_il_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_dec_il_tab[3][((unsigned char) (b1[0] >> 24))]); + } + *(unsigned long *) out_blk = (b0[0]); + *(unsigned long *) (out_blk + 4) = (b0[1]); + *(unsigned long *) (out_blk + 8) = (b0[2]); + *(unsigned long *) (out_blk + 12) = (b0[3]); + return aes_good; +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.h b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.h new file mode 100644 index 0000000..7f3d044 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aes.h @@ -0,0 +1,168 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + 1. FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of + 128 bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. + + 2. THE CIPHER INTERFACE + + byte (an unsigned 8-bit type) + word (an unsigned 32-bit type) + aes_ret: (a signed 16 bit type for function return values) + aes_good (value != 0, a good return) + aes_bad (value == 0, an error return) + enum aes_key: (encryption direction) + enc (set key for encryption) + dec (set key for decryption) + both (set key for both) + class or struct aes (structure for context) + + C subroutine calls: + + aes_ret set_blk(const word block_length, aes *cx) (variable block size) + aes_ret set_key(const byte key[ ], const word key_length, + const enum aes_key direction, aes *cx) + aes_ret encrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + aes_ret decrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + + IMPORTANT NOTE: If you are using this C interface and your compiler does + not set the memory used for objects to zero before use, you will need to + ensure that cx.mode is set to zero before using the C subroutine calls. + + The block length inputs to set_block and set_key are in numbers of + BYTES, not bits. The calls to subroutines must be made in the above + order but multiple calls can be made without repeating earlier calls + if their parameters have not changed. If the cipher block length is + variable but set_blk has not been called before cipher operations a + value of 16 is assumed (that is, the AES block size). In contrast to + earlier versions the block and key length parameters are now checked + for correctness and the encryption and decryption routines check to + ensure that an appropriate key has been set before they are called. + +*/ + +#ifndef _AES_H +#define _AES_H + +/* The only supported block size for the benchmark is 16 */ +#define BLOCK_SIZE 16 + +/* + The number of key schedule words for different block and key lengths + (allowing for the method of computation which requires the length to + be a multiple of the key length): + + Key Schedule key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 44 60 54 56 64 + length 20 | 60 60 66 70 80 + (bytes) 24 | 80 80 78 84 96 + 28 | 100 100 102 98 112 + 32 | 120 120 120 126 120 + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + The following values assume that the key length will be variable and may + be of maximum length (32 bytes). + + Nk = number_of_key_bytes / 4 + Nc = number_of_columns_in_state / 4 + Nr = number of encryption/decryption rounds + Rc = number of elements in rcon table + Ks = number of 32-bit words in key schedule +*/ + +#define Nr(Nk, Nc) ((Nk > Nc ? Nk : Nc) + 6) +#define Rc(Nk, Nc) ((Nb * (Nr(Nk, Nc) + 1) - 1) / Nk) +#define Ks(Nk, Nc) (Nk * (Rc(Nk, Nc) + 1)) + +#define RC_LENGTH 5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11) +#define KS_LENGTH 4 * BLOCK_SIZE + +/* End of configuration options, but see also aes.c */ + +typedef unsigned char byte; /* must be an 8-bit storage unit */ +typedef unsigned long word; /* must be a 32-bit storage unit */ +typedef short aes_ret; /* function return value */ + +#define aes_bad 0 +#define aes_good 1 + +/* + upr(x,n): rotates bytes within words by n positions, moving bytes + to higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word +*/ + +#define upr(x, n) (((x) << 8 * (n)) | ((x) >> (32 - 8 * (n)))) +#define ups(x, n) ((x) << 8 * (n)) +#define bval(x, n) ((byte) ((x) >> 8 * (n))) +#define byte_swap(x) (upr(x, 1) & 0x00ff00ff | upr(x, 3) & 0xff00ff00) +#define bytes2word(b0, b1, b2, b3) \ + ((word) (b3) << 24 | (word) (b2) << 16 | (word) (b1) << 8 | (b0)) + +#define word_in(x) *(word *) (x) +#define word_out(x, v) *(word *) (x) = (v) + +enum aes_const { + Nrow = 4, /* the number of rows in the cipher state */ + Mcol = 8, /* maximum number of columns in the state */ + Ncol = BLOCK_SIZE / 4, + Shr0 = 0, /* the cyclic shift values for rows 0, 1, 2 & 3 */ + Shr1 = 1, + Shr2 = BLOCK_SIZE == 32 ? 3 : 2, + Shr3 = BLOCK_SIZE == 32 ? 4 : 3 +}; + +enum aes_key { + enc = 1, /* set if encryption is needed */ + dec = 2, /* set if decryption is needed */ + both = 3 /* set if both are needed */ +}; + +struct aes { + word Nkey; /* the number of words in the key input block */ + word Nrnd; /* the number of cipher rounds */ + word e_key[KS_LENGTH]; /* the encryption key schedule */ + word d_key[KS_LENGTH]; /* the decryption key schedule */ + byte mode; /* encrypt, decrypt or both */ +}; + +__attribute__((always_inline)) static inline aes_ret +rijndael_dec_set_key(byte key[], const word n_bytes, const enum aes_key f, + struct aes *cx); +__attribute__((always_inline)) static inline aes_ret +rijndael_dec_decrypt(const byte in_blk[], byte out_blk[], const struct aes *cx); + +#endif diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aestab.h b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aestab.h new file mode 100644 index 0000000..7507254 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/aestab.h @@ -0,0 +1,426 @@ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +/* + Used to ensure table is generated in the right format + depending on the internal byte order required. +*/ + +#define w0(p) 0x000000##p + +/* + Number of elements required in this table for different + block and key lengths is: + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + this table can be a table of bytes if the key schedule + code is adjusted accordingly +*/ + +const word rijndael_dec_rcon_tab[29] = { + w0(01), w0(02), w0(04), w0(08), w0(10), w0(20), w0(40), w0(80), + w0(1b), w0(36), w0(6c), w0(d8), w0(ab), w0(4d), w0(9a), w0(2f), + w0(5e), w0(bc), w0(63), w0(c6), w0(97), w0(35), w0(6a), w0(d4), + w0(b3), w0(7d), w0(fa), w0(ef), w0(c5)}; + +#undef w0 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +#define r0(p, q, r, s) 0x##p##q##r##s +#define r1(p, q, r, s) 0x##q##r##s##p +#define r2(p, q, r, s) 0x##r##s##p##q +#define r3(p, q, r, s) 0x##s##p##q##r +#define w0(p) 0x000000##p +#define w1(p) 0x0000##p##00 +#define w2(p) 0x00##p##0000 +#define w3(p) 0x##p##000000 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +/* data for forward tables (other than last round) */ + +#define f_table \ + r(a5, 63, 63, c6), r(84, 7c, 7c, f8), r(99, 77, 77, ee), \ + r(8d, 7b, 7b, f6), r(0d, f2, f2, ff), r(bd, 6b, 6b, d6), \ + r(b1, 6f, 6f, de), r(54, c5, c5, 91), r(50, 30, 30, 60), \ + r(03, 01, 01, 02), r(a9, 67, 67, ce), r(7d, 2b, 2b, 56), \ + r(19, fe, fe, e7), r(62, d7, d7, b5), r(e6, ab, ab, 4d), \ + r(9a, 76, 76, ec), r(45, ca, ca, 8f), r(9d, 82, 82, 1f), \ + r(40, c9, c9, 89), r(87, 7d, 7d, fa), r(15, fa, fa, ef), \ + r(eb, 59, 59, b2), r(c9, 47, 47, 8e), r(0b, f0, f0, fb), \ + r(ec, ad, ad, 41), r(67, d4, d4, b3), r(fd, a2, a2, 5f), \ + r(ea, af, af, 45), r(bf, 9c, 9c, 23), r(f7, a4, a4, 53), \ + r(96, 72, 72, e4), r(5b, c0, c0, 9b), r(c2, b7, b7, 75), \ + r(1c, fd, fd, e1), r(ae, 93, 93, 3d), r(6a, 26, 26, 4c), \ + r(5a, 36, 36, 6c), r(41, 3f, 3f, 7e), r(02, f7, f7, f5), \ + r(4f, cc, cc, 83), r(5c, 34, 34, 68), r(f4, a5, a5, 51), \ + r(34, e5, e5, d1), r(08, f1, f1, f9), r(93, 71, 71, e2), \ + r(73, d8, d8, ab), r(53, 31, 31, 62), r(3f, 15, 15, 2a), \ + r(0c, 04, 04, 08), r(52, c7, c7, 95), r(65, 23, 23, 46), \ + r(5e, c3, c3, 9d), r(28, 18, 18, 30), r(a1, 96, 96, 37), \ + r(0f, 05, 05, 0a), r(b5, 9a, 9a, 2f), r(09, 07, 07, 0e), \ + r(36, 12, 12, 24), r(9b, 80, 80, 1b), r(3d, e2, e2, df), \ + r(26, eb, eb, cd), r(69, 27, 27, 4e), r(cd, b2, b2, 7f), \ + r(9f, 75, 75, ea), r(1b, 09, 09, 12), r(9e, 83, 83, 1d), \ + r(74, 2c, 2c, 58), r(2e, 1a, 1a, 34), r(2d, 1b, 1b, 36), \ + r(b2, 6e, 6e, dc), r(ee, 5a, 5a, b4), r(fb, a0, a0, 5b), \ + r(f6, 52, 52, a4), r(4d, 3b, 3b, 76), r(61, d6, d6, b7), \ + r(ce, b3, b3, 7d), r(7b, 29, 29, 52), r(3e, e3, e3, dd), \ + r(71, 2f, 2f, 5e), r(97, 84, 84, 13), r(f5, 53, 53, a6), \ + r(68, d1, d1, b9), r(00, 00, 00, 00), r(2c, ed, ed, c1), \ + r(60, 20, 20, 40), r(1f, fc, fc, e3), r(c8, b1, b1, 79), \ + r(ed, 5b, 5b, b6), r(be, 6a, 6a, d4), r(46, cb, cb, 8d), \ + r(d9, be, be, 67), r(4b, 39, 39, 72), r(de, 4a, 4a, 94), \ + r(d4, 4c, 4c, 98), r(e8, 58, 58, b0), r(4a, cf, cf, 85), \ + r(6b, d0, d0, bb), r(2a, ef, ef, c5), r(e5, aa, aa, 4f), \ + r(16, fb, fb, ed), r(c5, 43, 43, 86), r(d7, 4d, 4d, 9a), \ + r(55, 33, 33, 66), r(94, 85, 85, 11), r(cf, 45, 45, 8a), \ + r(10, f9, f9, e9), r(06, 02, 02, 04), r(81, 7f, 7f, fe), \ + r(f0, 50, 50, a0), r(44, 3c, 3c, 78), r(ba, 9f, 9f, 25), \ + r(e3, a8, a8, 4b), r(f3, 51, 51, a2), r(fe, a3, a3, 5d), \ + r(c0, 40, 40, 80), r(8a, 8f, 8f, 05), r(ad, 92, 92, 3f), \ + r(bc, 9d, 9d, 21), r(48, 38, 38, 70), r(04, f5, f5, f1), \ + r(df, bc, bc, 63), r(c1, b6, b6, 77), r(75, da, da, af), \ + r(63, 21, 21, 42), r(30, 10, 10, 20), r(1a, ff, ff, e5), \ + r(0e, f3, f3, fd), r(6d, d2, d2, bf), r(4c, cd, cd, 81), \ + r(14, 0c, 0c, 18), r(35, 13, 13, 26), r(2f, ec, ec, c3), \ + r(e1, 5f, 5f, be), r(a2, 97, 97, 35), r(cc, 44, 44, 88), \ + r(39, 17, 17, 2e), r(57, c4, c4, 93), r(f2, a7, a7, 55), \ + r(82, 7e, 7e, fc), r(47, 3d, 3d, 7a), r(ac, 64, 64, c8), \ + r(e7, 5d, 5d, ba), r(2b, 19, 19, 32), r(95, 73, 73, e6), \ + r(a0, 60, 60, c0), r(98, 81, 81, 19), r(d1, 4f, 4f, 9e), \ + r(7f, dc, dc, a3), r(66, 22, 22, 44), r(7e, 2a, 2a, 54), \ + r(ab, 90, 90, 3b), r(83, 88, 88, 0b), r(ca, 46, 46, 8c), \ + r(29, ee, ee, c7), r(d3, b8, b8, 6b), r(3c, 14, 14, 28), \ + r(79, de, de, a7), r(e2, 5e, 5e, bc), r(1d, 0b, 0b, 16), \ + r(76, db, db, ad), r(3b, e0, e0, db), r(56, 32, 32, 64), \ + r(4e, 3a, 3a, 74), r(1e, 0a, 0a, 14), r(db, 49, 49, 92), \ + r(0a, 06, 06, 0c), r(6c, 24, 24, 48), r(e4, 5c, 5c, b8), \ + r(5d, c2, c2, 9f), r(6e, d3, d3, bd), r(ef, ac, ac, 43), \ + r(a6, 62, 62, c4), r(a8, 91, 91, 39), r(a4, 95, 95, 31), \ + r(37, e4, e4, d3), r(8b, 79, 79, f2), r(32, e7, e7, d5), \ + r(43, c8, c8, 8b), r(59, 37, 37, 6e), r(b7, 6d, 6d, da), \ + r(8c, 8d, 8d, 01), r(64, d5, d5, b1), r(d2, 4e, 4e, 9c), \ + r(e0, a9, a9, 49), r(b4, 6c, 6c, d8), r(fa, 56, 56, ac), \ + r(07, f4, f4, f3), r(25, ea, ea, cf), r(af, 65, 65, ca), \ + r(8e, 7a, 7a, f4), r(e9, ae, ae, 47), r(18, 08, 08, 10), \ + r(d5, ba, ba, 6f), r(88, 78, 78, f0), r(6f, 25, 25, 4a), \ + r(72, 2e, 2e, 5c), r(24, 1c, 1c, 38), r(f1, a6, a6, 57), \ + r(c7, b4, b4, 73), r(51, c6, c6, 97), r(23, e8, e8, cb), \ + r(7c, dd, dd, a1), r(9c, 74, 74, e8), r(21, 1f, 1f, 3e), \ + r(dd, 4b, 4b, 96), r(dc, bd, bd, 61), r(86, 8b, 8b, 0d), \ + r(85, 8a, 8a, 0f), r(90, 70, 70, e0), r(42, 3e, 3e, 7c), \ + r(c4, b5, b5, 71), r(aa, 66, 66, cc), r(d8, 48, 48, 90), \ + r(05, 03, 03, 06), r(01, f6, f6, f7), r(12, 0e, 0e, 1c), \ + r(a3, 61, 61, c2), r(5f, 35, 35, 6a), r(f9, 57, 57, ae), \ + r(d0, b9, b9, 69), r(91, 86, 86, 17), r(58, c1, c1, 99), \ + r(27, 1d, 1d, 3a), r(b9, 9e, 9e, 27), r(38, e1, e1, d9), \ + r(13, f8, f8, eb), r(b3, 98, 98, 2b), r(33, 11, 11, 22), \ + r(bb, 69, 69, d2), r(70, d9, d9, a9), r(89, 8e, 8e, 07), \ + r(a7, 94, 94, 33), r(b6, 9b, 9b, 2d), r(22, 1e, 1e, 3c), \ + r(92, 87, 87, 15), r(20, e9, e9, c9), r(49, ce, ce, 87), \ + r(ff, 55, 55, aa), r(78, 28, 28, 50), r(7a, df, df, a5), \ + r(8f, 8c, 8c, 03), r(f8, a1, a1, 59), r(80, 89, 89, 09), \ + r(17, 0d, 0d, 1a), r(da, bf, bf, 65), r(31, e6, e6, d7), \ + r(c6, 42, 42, 84), r(b8, 68, 68, d0), r(c3, 41, 41, 82), \ + r(b0, 99, 99, 29), r(77, 2d, 2d, 5a), r(11, 0f, 0f, 1e), \ + r(cb, b0, b0, 7b), r(fc, 54, 54, a8), r(d6, bb, bb, 6d), \ + r(3a, 16, 16, 2c) + +/* data for inverse tables (other than last round) */ + +#define i_table \ + r(50, a7, f4, 51), r(53, 65, 41, 7e), r(c3, a4, 17, 1a), \ + r(96, 5e, 27, 3a), r(cb, 6b, ab, 3b), r(f1, 45, 9d, 1f), \ + r(ab, 58, fa, ac), r(93, 03, e3, 4b), r(55, fa, 30, 20), \ + r(f6, 6d, 76, ad), r(91, 76, cc, 88), r(25, 4c, 02, f5), \ + r(fc, d7, e5, 4f), r(d7, cb, 2a, c5), r(80, 44, 35, 26), \ + r(8f, a3, 62, b5), r(49, 5a, b1, de), r(67, 1b, ba, 25), \ + r(98, 0e, ea, 45), r(e1, c0, fe, 5d), r(02, 75, 2f, c3), \ + r(12, f0, 4c, 81), r(a3, 97, 46, 8d), r(c6, f9, d3, 6b), \ + r(e7, 5f, 8f, 03), r(95, 9c, 92, 15), r(eb, 7a, 6d, bf), \ + r(da, 59, 52, 95), r(2d, 83, be, d4), r(d3, 21, 74, 58), \ + r(29, 69, e0, 49), r(44, c8, c9, 8e), r(6a, 89, c2, 75), \ + r(78, 79, 8e, f4), r(6b, 3e, 58, 99), r(dd, 71, b9, 27), \ + r(b6, 4f, e1, be), r(17, ad, 88, f0), r(66, ac, 20, c9), \ + r(b4, 3a, ce, 7d), r(18, 4a, df, 63), r(82, 31, 1a, e5), \ + r(60, 33, 51, 97), r(45, 7f, 53, 62), r(e0, 77, 64, b1), \ + r(84, ae, 6b, bb), r(1c, a0, 81, fe), r(94, 2b, 08, f9), \ + r(58, 68, 48, 70), r(19, fd, 45, 8f), r(87, 6c, de, 94), \ + r(b7, f8, 7b, 52), r(23, d3, 73, ab), r(e2, 02, 4b, 72), \ + r(57, 8f, 1f, e3), r(2a, ab, 55, 66), r(07, 28, eb, b2), \ + r(03, c2, b5, 2f), r(9a, 7b, c5, 86), r(a5, 08, 37, d3), \ + r(f2, 87, 28, 30), r(b2, a5, bf, 23), r(ba, 6a, 03, 02), \ + r(5c, 82, 16, ed), r(2b, 1c, cf, 8a), r(92, b4, 79, a7), \ + r(f0, f2, 07, f3), r(a1, e2, 69, 4e), r(cd, f4, da, 65), \ + r(d5, be, 05, 06), r(1f, 62, 34, d1), r(8a, fe, a6, c4), \ + r(9d, 53, 2e, 34), r(a0, 55, f3, a2), r(32, e1, 8a, 05), \ + r(75, eb, f6, a4), r(39, ec, 83, 0b), r(aa, ef, 60, 40), \ + r(06, 9f, 71, 5e), r(51, 10, 6e, bd), r(f9, 8a, 21, 3e), \ + r(3d, 06, dd, 96), r(ae, 05, 3e, dd), r(46, bd, e6, 4d), \ + r(b5, 8d, 54, 91), r(05, 5d, c4, 71), r(6f, d4, 06, 04), \ + r(ff, 15, 50, 60), r(24, fb, 98, 19), r(97, e9, bd, d6), \ + r(cc, 43, 40, 89), r(77, 9e, d9, 67), r(bd, 42, e8, b0), \ + r(88, 8b, 89, 07), r(38, 5b, 19, e7), r(db, ee, c8, 79), \ + r(47, 0a, 7c, a1), r(e9, 0f, 42, 7c), r(c9, 1e, 84, f8), \ + r(00, 00, 00, 00), r(83, 86, 80, 09), r(48, ed, 2b, 32), \ + r(ac, 70, 11, 1e), r(4e, 72, 5a, 6c), r(fb, ff, 0e, fd), \ + r(56, 38, 85, 0f), r(1e, d5, ae, 3d), r(27, 39, 2d, 36), \ + r(64, d9, 0f, 0a), r(21, a6, 5c, 68), r(d1, 54, 5b, 9b), \ + r(3a, 2e, 36, 24), r(b1, 67, 0a, 0c), r(0f, e7, 57, 93), \ + r(d2, 96, ee, b4), r(9e, 91, 9b, 1b), r(4f, c5, c0, 80), \ + r(a2, 20, dc, 61), r(69, 4b, 77, 5a), r(16, 1a, 12, 1c), \ + r(0a, ba, 93, e2), r(e5, 2a, a0, c0), r(43, e0, 22, 3c), \ + r(1d, 17, 1b, 12), r(0b, 0d, 09, 0e), r(ad, c7, 8b, f2), \ + r(b9, a8, b6, 2d), r(c8, a9, 1e, 14), r(85, 19, f1, 57), \ + r(4c, 07, 75, af), r(bb, dd, 99, ee), r(fd, 60, 7f, a3), \ + r(9f, 26, 01, f7), r(bc, f5, 72, 5c), r(c5, 3b, 66, 44), \ + r(34, 7e, fb, 5b), r(76, 29, 43, 8b), r(dc, c6, 23, cb), \ + r(68, fc, ed, b6), r(63, f1, e4, b8), r(ca, dc, 31, d7), \ + r(10, 85, 63, 42), r(40, 22, 97, 13), r(20, 11, c6, 84), \ + r(7d, 24, 4a, 85), r(f8, 3d, bb, d2), r(11, 32, f9, ae), \ + r(6d, a1, 29, c7), r(4b, 2f, 9e, 1d), r(f3, 30, b2, dc), \ + r(ec, 52, 86, 0d), r(d0, e3, c1, 77), r(6c, 16, b3, 2b), \ + r(99, b9, 70, a9), r(fa, 48, 94, 11), r(22, 64, e9, 47), \ + r(c4, 8c, fc, a8), r(1a, 3f, f0, a0), r(d8, 2c, 7d, 56), \ + r(ef, 90, 33, 22), r(c7, 4e, 49, 87), r(c1, d1, 38, d9), \ + r(fe, a2, ca, 8c), r(36, 0b, d4, 98), r(cf, 81, f5, a6), \ + r(28, de, 7a, a5), r(26, 8e, b7, da), r(a4, bf, ad, 3f), \ + r(e4, 9d, 3a, 2c), r(0d, 92, 78, 50), r(9b, cc, 5f, 6a), \ + r(62, 46, 7e, 54), r(c2, 13, 8d, f6), r(e8, b8, d8, 90), \ + r(5e, f7, 39, 2e), r(f5, af, c3, 82), r(be, 80, 5d, 9f), \ + r(7c, 93, d0, 69), r(a9, 2d, d5, 6f), r(b3, 12, 25, cf), \ + r(3b, 99, ac, c8), r(a7, 7d, 18, 10), r(6e, 63, 9c, e8), \ + r(7b, bb, 3b, db), r(09, 78, 26, cd), r(f4, 18, 59, 6e), \ + r(01, b7, 9a, ec), r(a8, 9a, 4f, 83), r(65, 6e, 95, e6), \ + r(7e, e6, ff, aa), r(08, cf, bc, 21), r(e6, e8, 15, ef), \ + r(d9, 9b, e7, ba), r(ce, 36, 6f, 4a), r(d4, 09, 9f, ea), \ + r(d6, 7c, b0, 29), r(af, b2, a4, 31), r(31, 23, 3f, 2a), \ + r(30, 94, a5, c6), r(c0, 66, a2, 35), r(37, bc, 4e, 74), \ + r(a6, ca, 82, fc), r(b0, d0, 90, e0), r(15, d8, a7, 33), \ + r(4a, 98, 04, f1), r(f7, da, ec, 41), r(0e, 50, cd, 7f), \ + r(2f, f6, 91, 17), r(8d, d6, 4d, 76), r(4d, b0, ef, 43), \ + r(54, 4d, aa, cc), r(df, 04, 96, e4), r(e3, b5, d1, 9e), \ + r(1b, 88, 6a, 4c), r(b8, 1f, 2c, c1), r(7f, 51, 65, 46), \ + r(04, ea, 5e, 9d), r(5d, 35, 8c, 01), r(73, 74, 87, fa), \ + r(2e, 41, 0b, fb), r(5a, 1d, 67, b3), r(52, d2, db, 92), \ + r(33, 56, 10, e9), r(13, 47, d6, 6d), r(8c, 61, d7, 9a), \ + r(7a, 0c, a1, 37), r(8e, 14, f8, 59), r(89, 3c, 13, eb), \ + r(ee, 27, a9, ce), r(35, c9, 61, b7), r(ed, e5, 1c, e1), \ + r(3c, b1, 47, 7a), r(59, df, d2, 9c), r(3f, 73, f2, 55), \ + r(79, ce, 14, 18), r(bf, 37, c7, 73), r(ea, cd, f7, 53), \ + r(5b, aa, fd, 5f), r(14, 6f, 3d, df), r(86, db, 44, 78), \ + r(81, f3, af, ca), r(3e, c4, 68, b9), r(2c, 34, 24, 38), \ + r(5f, 40, a3, c2), r(72, c3, 1d, 16), r(0c, 25, e2, bc), \ + r(8b, 49, 3c, 28), r(41, 95, 0d, ff), r(71, 01, a8, 39), \ + r(de, b3, 0c, 08), r(9c, e4, b4, d8), r(90, c1, 56, 64), \ + r(61, 84, cb, 7b), r(70, b6, 32, d5), r(74, 5c, 6c, 48), \ + r(42, 57, b8, d0) + +/* generate the required tables in the desired endian format */ + +#undef r +#define r r0 +const word rijndael_dec_it_tab[4][256] = {{i_table}, +#undef r +#define r r1 + {i_table}, +#undef r +#define r r2 + {i_table}, +#undef r +#define r r3 + {i_table}}; + +/* data for inverse tables (last round) */ + +#define li_table \ + w(52), w(09), w(6a), w(d5), w(30), w(36), w(a5), w(38), w(bf), w(40), \ + w(a3), w(9e), w(81), w(f3), w(d7), w(fb), w(7c), w(e3), w(39), w(82), \ + w(9b), w(2f), w(ff), w(87), w(34), w(8e), w(43), w(44), w(c4), w(de), \ + w(e9), w(cb), w(54), w(7b), w(94), w(32), w(a6), w(c2), w(23), w(3d), \ + w(ee), w(4c), w(95), w(0b), w(42), w(fa), w(c3), w(4e), w(08), w(2e), \ + w(a1), w(66), w(28), w(d9), w(24), w(b2), w(76), w(5b), w(a2), w(49), \ + w(6d), w(8b), w(d1), w(25), w(72), w(f8), w(f6), w(64), w(86), w(68), \ + w(98), w(16), w(d4), w(a4), w(5c), w(cc), w(5d), w(65), w(b6), w(92), \ + w(6c), w(70), w(48), w(50), w(fd), w(ed), w(b9), w(da), w(5e), w(15), \ + w(46), w(57), w(a7), w(8d), w(9d), w(84), w(90), w(d8), w(ab), w(00), \ + w(8c), w(bc), w(d3), w(0a), w(f7), w(e4), w(58), w(05), w(b8), w(b3), \ + w(45), w(06), w(d0), w(2c), w(1e), w(8f), w(ca), w(3f), w(0f), w(02), \ + w(c1), w(af), w(bd), w(03), w(01), w(13), w(8a), w(6b), w(3a), w(91), \ + w(11), w(41), w(4f), w(67), w(dc), w(ea), w(97), w(f2), w(cf), w(ce), \ + w(f0), w(b4), w(e6), w(73), w(96), w(ac), w(74), w(22), w(e7), w(ad), \ + w(35), w(85), w(e2), w(f9), w(37), w(e8), w(1c), w(75), w(df), w(6e), \ + w(47), w(f1), w(1a), w(71), w(1d), w(29), w(c5), w(89), w(6f), w(b7), \ + w(62), w(0e), w(aa), w(18), w(be), w(1b), w(fc), w(56), w(3e), w(4b), \ + w(c6), w(d2), w(79), w(20), w(9a), w(db), w(c0), w(fe), w(78), w(cd), \ + w(5a), w(f4), w(1f), w(dd), w(a8), w(33), w(88), w(07), w(c7), w(31), \ + w(b1), w(12), w(10), w(59), w(27), w(80), w(ec), w(5f), w(60), w(51), \ + w(7f), w(a9), w(19), w(b5), w(4a), w(0d), w(2d), w(e5), w(7a), w(9f), \ + w(93), w(c9), w(9c), w(ef), w(a0), w(e0), w(3b), w(4d), w(ae), w(2a), \ + w(f5), w(b0), w(c8), w(eb), w(bb), w(3c), w(83), w(53), w(99), w(61), \ + w(17), w(2b), w(04), w(7e), w(ba), w(77), w(d6), w(26), w(e1), w(69), \ + w(14), w(63), w(55), w(21), w(0c), w(7d), + +/* generate the required tables in the desired endian format */ + +#undef r +#define r(p, q, r, s) w0(q) +const word rijndael_dec_fl_tab[4][256] = {{f_table}, +#undef r +#define r(p, q, r, s) w1(q) + {f_table}, +#undef r +#define r(p, q, r, s) w2(q) + {f_table}, +#undef r +#define r(p, q, r, s) w3(q) + {f_table}}; + +#undef w +#define w w0 +const word rijndael_dec_il_tab[4][256] = {{li_table}, +#undef w +#define w w1 + {li_table}, +#undef w +#define w w2 + {li_table}, +#undef w +#define w w3 + {li_table}}; + +#define m_table \ + r(00, 00, 00, 00), r(0b, 0d, 09, 0e), r(16, 1a, 12, 1c), \ + r(1d, 17, 1b, 12), r(2c, 34, 24, 38), r(27, 39, 2d, 36), \ + r(3a, 2e, 36, 24), r(31, 23, 3f, 2a), r(58, 68, 48, 70), \ + r(53, 65, 41, 7e), r(4e, 72, 5a, 6c), r(45, 7f, 53, 62), \ + r(74, 5c, 6c, 48), r(7f, 51, 65, 46), r(62, 46, 7e, 54), \ + r(69, 4b, 77, 5a), r(b0, d0, 90, e0), r(bb, dd, 99, ee), \ + r(a6, ca, 82, fc), r(ad, c7, 8b, f2), r(9c, e4, b4, d8), \ + r(97, e9, bd, d6), r(8a, fe, a6, c4), r(81, f3, af, ca), \ + r(e8, b8, d8, 90), r(e3, b5, d1, 9e), r(fe, a2, ca, 8c), \ + r(f5, af, c3, 82), r(c4, 8c, fc, a8), r(cf, 81, f5, a6), \ + r(d2, 96, ee, b4), r(d9, 9b, e7, ba), r(7b, bb, 3b, db), \ + r(70, b6, 32, d5), r(6d, a1, 29, c7), r(66, ac, 20, c9), \ + r(57, 8f, 1f, e3), r(5c, 82, 16, ed), r(41, 95, 0d, ff), \ + r(4a, 98, 04, f1), r(23, d3, 73, ab), r(28, de, 7a, a5), \ + r(35, c9, 61, b7), r(3e, c4, 68, b9), r(0f, e7, 57, 93), \ + r(04, ea, 5e, 9d), r(19, fd, 45, 8f), r(12, f0, 4c, 81), \ + r(cb, 6b, ab, 3b), r(c0, 66, a2, 35), r(dd, 71, b9, 27), \ + r(d6, 7c, b0, 29), r(e7, 5f, 8f, 03), r(ec, 52, 86, 0d), \ + r(f1, 45, 9d, 1f), r(fa, 48, 94, 11), r(93, 03, e3, 4b), \ + r(98, 0e, ea, 45), r(85, 19, f1, 57), r(8e, 14, f8, 59), \ + r(bf, 37, c7, 73), r(b4, 3a, ce, 7d), r(a9, 2d, d5, 6f), \ + r(a2, 20, dc, 61), r(f6, 6d, 76, ad), r(fd, 60, 7f, a3), \ + r(e0, 77, 64, b1), r(eb, 7a, 6d, bf), r(da, 59, 52, 95), \ + r(d1, 54, 5b, 9b), r(cc, 43, 40, 89), r(c7, 4e, 49, 87), \ + r(ae, 05, 3e, dd), r(a5, 08, 37, d3), r(b8, 1f, 2c, c1), \ + r(b3, 12, 25, cf), r(82, 31, 1a, e5), r(89, 3c, 13, eb), \ + r(94, 2b, 08, f9), r(9f, 26, 01, f7), r(46, bd, e6, 4d), \ + r(4d, b0, ef, 43), r(50, a7, f4, 51), r(5b, aa, fd, 5f), \ + r(6a, 89, c2, 75), r(61, 84, cb, 7b), r(7c, 93, d0, 69), \ + r(77, 9e, d9, 67), r(1e, d5, ae, 3d), r(15, d8, a7, 33), \ + r(08, cf, bc, 21), r(03, c2, b5, 2f), r(32, e1, 8a, 05), \ + r(39, ec, 83, 0b), r(24, fb, 98, 19), r(2f, f6, 91, 17), \ + r(8d, d6, 4d, 76), r(86, db, 44, 78), r(9b, cc, 5f, 6a), \ + r(90, c1, 56, 64), r(a1, e2, 69, 4e), r(aa, ef, 60, 40), \ + r(b7, f8, 7b, 52), r(bc, f5, 72, 5c), r(d5, be, 05, 06), \ + r(de, b3, 0c, 08), r(c3, a4, 17, 1a), r(c8, a9, 1e, 14), \ + r(f9, 8a, 21, 3e), r(f2, 87, 28, 30), r(ef, 90, 33, 22), \ + r(e4, 9d, 3a, 2c), r(3d, 06, dd, 96), r(36, 0b, d4, 98), \ + r(2b, 1c, cf, 8a), r(20, 11, c6, 84), r(11, 32, f9, ae), \ + r(1a, 3f, f0, a0), r(07, 28, eb, b2), r(0c, 25, e2, bc), \ + r(65, 6e, 95, e6), r(6e, 63, 9c, e8), r(73, 74, 87, fa), \ + r(78, 79, 8e, f4), r(49, 5a, b1, de), r(42, 57, b8, d0), \ + r(5f, 40, a3, c2), r(54, 4d, aa, cc), r(f7, da, ec, 41), \ + r(fc, d7, e5, 4f), r(e1, c0, fe, 5d), r(ea, cd, f7, 53), \ + r(db, ee, c8, 79), r(d0, e3, c1, 77), r(cd, f4, da, 65), \ + r(c6, f9, d3, 6b), r(af, b2, a4, 31), r(a4, bf, ad, 3f), \ + r(b9, a8, b6, 2d), r(b2, a5, bf, 23), r(83, 86, 80, 09), \ + r(88, 8b, 89, 07), r(95, 9c, 92, 15), r(9e, 91, 9b, 1b), \ + r(47, 0a, 7c, a1), r(4c, 07, 75, af), r(51, 10, 6e, bd), \ + r(5a, 1d, 67, b3), r(6b, 3e, 58, 99), r(60, 33, 51, 97), \ + r(7d, 24, 4a, 85), r(76, 29, 43, 8b), r(1f, 62, 34, d1), \ + r(14, 6f, 3d, df), r(09, 78, 26, cd), r(02, 75, 2f, c3), \ + r(33, 56, 10, e9), r(38, 5b, 19, e7), r(25, 4c, 02, f5), \ + r(2e, 41, 0b, fb), r(8c, 61, d7, 9a), r(87, 6c, de, 94), \ + r(9a, 7b, c5, 86), r(91, 76, cc, 88), r(a0, 55, f3, a2), \ + r(ab, 58, fa, ac), r(b6, 4f, e1, be), r(bd, 42, e8, b0), \ + r(d4, 09, 9f, ea), r(df, 04, 96, e4), r(c2, 13, 8d, f6), \ + r(c9, 1e, 84, f8), r(f8, 3d, bb, d2), r(f3, 30, b2, dc), \ + r(ee, 27, a9, ce), r(e5, 2a, a0, c0), r(3c, b1, 47, 7a), \ + r(37, bc, 4e, 74), r(2a, ab, 55, 66), r(21, a6, 5c, 68), \ + r(10, 85, 63, 42), r(1b, 88, 6a, 4c), r(06, 9f, 71, 5e), \ + r(0d, 92, 78, 50), r(64, d9, 0f, 0a), r(6f, d4, 06, 04), \ + r(72, c3, 1d, 16), r(79, ce, 14, 18), r(48, ed, 2b, 32), \ + r(43, e0, 22, 3c), r(5e, f7, 39, 2e), r(55, fa, 30, 20), \ + r(01, b7, 9a, ec), r(0a, ba, 93, e2), r(17, ad, 88, f0), \ + r(1c, a0, 81, fe), r(2d, 83, be, d4), r(26, 8e, b7, da), \ + r(3b, 99, ac, c8), r(30, 94, a5, c6), r(59, df, d2, 9c), \ + r(52, d2, db, 92), r(4f, c5, c0, 80), r(44, c8, c9, 8e), \ + r(75, eb, f6, a4), r(7e, e6, ff, aa), r(63, f1, e4, b8), \ + r(68, fc, ed, b6), r(b1, 67, 0a, 0c), r(ba, 6a, 03, 02), \ + r(a7, 7d, 18, 10), r(ac, 70, 11, 1e), r(9d, 53, 2e, 34), \ + r(96, 5e, 27, 3a), r(8b, 49, 3c, 28), r(80, 44, 35, 26), \ + r(e9, 0f, 42, 7c), r(e2, 02, 4b, 72), r(ff, 15, 50, 60), \ + r(f4, 18, 59, 6e), r(c5, 3b, 66, 44), r(ce, 36, 6f, 4a), \ + r(d3, 21, 74, 58), r(d8, 2c, 7d, 56), r(7a, 0c, a1, 37), \ + r(71, 01, a8, 39), r(6c, 16, b3, 2b), r(67, 1b, ba, 25), \ + r(56, 38, 85, 0f), r(5d, 35, 8c, 01), r(40, 22, 97, 13), \ + r(4b, 2f, 9e, 1d), r(22, 64, e9, 47), r(29, 69, e0, 49), \ + r(34, 7e, fb, 5b), r(3f, 73, f2, 55), r(0e, 50, cd, 7f), \ + r(05, 5d, c4, 71), r(18, 4a, df, 63), r(13, 47, d6, 6d), \ + r(ca, dc, 31, d7), r(c1, d1, 38, d9), r(dc, c6, 23, cb), \ + r(d7, cb, 2a, c5), r(e6, e8, 15, ef), r(ed, e5, 1c, e1), \ + r(f0, f2, 07, f3), r(fb, ff, 0e, fd), r(92, b4, 79, a7), \ + r(99, b9, 70, a9), r(84, ae, 6b, bb), r(8f, a3, 62, b5), \ + r(be, 80, 5d, 9f), r(b5, 8d, 54, 91), r(a8, 9a, 4f, 83), \ + r(a3, 97, 46, 8d) + +#undef r +#define r r0 + +const word rijndael_dec_im_tab[4][256] = {{m_table}, +#undef r +#define r r1 + {m_table}, +#undef r +#define r r2 + {m_table}, +#undef r +#define r r3 + {m_table}}; diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/input_small_enc.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/input_small_enc.c new file mode 100644 index 0000000..0f2c4a7 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/input_small_enc.c @@ -0,0 +1,2187 @@ + +unsigned char rijndael_dec_data[] = { + 96, 83, 127, 28, 212, 92, 146, 102, 38, 17, 193, 142, 95, 217, 184, + 105, 79, 112, 144, 112, 44, 202, 141, 48, 181, 177, 82, 92, 208, 250, + 216, 152, 41, 208, 7, 232, 238, 116, 134, 238, 230, 190, 239, 195, 235, + 80, 125, 51, 251, 39, 7, 100, 213, 190, 189, 81, 241, 49, 215, 254, + 253, 203, 13, 164, 175, 244, 25, 111, 226, 225, 176, 96, 58, 165, 32, + 243, 68, 205, 209, 242, 186, 229, 167, 155, 238, 105, 120, 173, 246, 72, + 29, 96, 71, 169, 83, 154, 226, 129, 236, 52, 243, 159, 61, 71, 20, + 119, 245, 196, 25, 203, 11, 10, 37, 163, 139, 180, 250, 191, 138, 99, + 78, 192, 73, 186, 22, 12, 119, 151, 185, 155, 195, 54, 73, 207, 108, + 170, 112, 237, 100, 165, 219, 223, 23, 179, 124, 172, 52, 22, 143, 57, + 132, 60, 176, 218, 11, 86, 89, 59, 254, 84, 180, 76, 120, 174, 17, + 214, 88, 48, 240, 12, 56, 93, 136, 156, 75, 176, 30, 43, 4, 107, + 30, 210, 26, 183, 235, 39, 35, 205, 139, 80, 249, 182, 15, 91, 210, + 234, 47, 67, 64, 234, 148, 108, 240, 242, 32, 11, 48, 199, 117, 31, + 149, 30, 97, 149, 241, 50, 177, 166, 127, 31, 135, 115, 240, 77, 198, + 88, 108, 246, 108, 148, 158, 89, 173, 233, 252, 95, 51, 42, 218, 54, + 28, 143, 203, 164, 74, 147, 55, 108, 225, 222, 87, 161, 243, 35, 179, + 130, 29, 70, 225, 178, 148, 152, 247, 167, 21, 245, 84, 139, 3, 228, + 221, 25, 53, 36, 121, 29, 204, 35, 1, 46, 26, 8, 237, 102, 231, + 252, 176, 88, 24, 110, 255, 163, 86, 64, 117, 68, 178, 73, 219, 201, + 24, 155, 76, 255, 253, 199, 165, 95, 246, 179, 15, 47, 203, 81, 92, + 231, 246, 247, 111, 58, 82, 222, 193, 24, 37, 164, 161, 8, 169, 172, + 223, 111, 186, 72, 160, 116, 242, 8, 192, 178, 224, 177, 228, 42, 102, + 206, 237, 52, 143, 16, 150, 143, 108, 3, 88, 81, 199, 49, 110, 220, + 5, 89, 244, 227, 27, 226, 101, 9, 238, 0, 206, 228, 254, 19, 189, + 240, 159, 29, 46, 2, 206, 184, 205, 228, 144, 241, 88, 78, 156, 23, + 44, 200, 99, 146, 179, 96, 1, 143, 87, 57, 39, 75, 174, 32, 190, + 125, 152, 183, 46, 39, 136, 88, 240, 110, 104, 70, 253, 29, 110, 113, + 235, 123, 56, 60, 243, 238, 246, 113, 11, 18, 246, 108, 95, 238, 177, + 43, 3, 112, 121, 161, 196, 204, 211, 171, 197, 41, 249, 71, 194, 153, + 82, 28, 10, 28, 12, 241, 212, 90, 124, 236, 171, 54, 35, 226, 152, + 246, 241, 74, 139, 133, 241, 76, 183, 197, 232, 250, 54, 202, 11, 10, + 203, 30, 169, 138, 110, 252, 62, 172, 6, 241, 81, 181, 87, 177, 128, + 221, 111, 133, 94, 251, 184, 54, 92, 242, 28, 112, 138, 116, 32, 164, + 158, 59, 51, 30, 155, 126, 196, 117, 233, 117, 92, 74, 4, 72, 19, + 237, 248, 142, 184, 175, 126, 203, 4, 210, 70, 40, 105, 16, 36, 42, + 118, 110, 4, 180, 208, 52, 232, 230, 107, 154, 233, 61, 176, 170, 32, + 59, 60, 47, 43, 70, 71, 3, 58, 24, 166, 22, 165, 154, 255, 166, + 12, 81, 63, 116, 146, 12, 5, 6, 133, 240, 110, 253, 209, 15, 71, + 179, 93, 203, 58, 138, 5, 90, 111, 140, 19, 186, 191, 68, 230, 121, + 95, 166, 219, 107, 233, 156, 18, 145, 239, 150, 234, 191, 91, 233, 114, + 5, 215, 85, 30, 66, 33, 152, 117, 128, 236, 189, 201, 203, 10, 184, + 198, 249, 61, 27, 144, 102, 246, 191, 54, 129, 86, 8, 197, 98, 231, + 234, 222, 164, 161, 40, 150, 253, 208, 82, 92, 225, 85, 206, 59, 1, + 170, 5, 255, 219, 89, 204, 122, 169, 78, 8, 5, 70, 75, 128, 80, + 176, 16, 214, 253, 176, 255, 191, 91, 89, 126, 155, 128, 195, 56, 150, + 101, 131, 255, 234, 241, 250, 61, 210, 85, 19, 21, 23, 122, 180, 34, + 100, 102, 166, 128, 21, 177, 11, 86, 110, 112, 179, 126, 36, 152, 196, + 62, 185, 186, 20, 91, 35, 85, 148, 168, 68, 145, 245, 170, 25, 190, + 237, 192, 125, 186, 182, 22, 188, 161, 122, 194, 21, 14, 102, 206, 60, + 129, 156, 173, 176, 37, 112, 129, 145, 177, 101, 206, 179, 35, 221, 107, + 228, 181, 212, 52, 253, 241, 145, 121, 128, 68, 118, 78, 66, 166, 78, + 176, 62, 217, 243, 193, 1, 254, 200, 35, 67, 226, 77, 55, 72, 6, + 144, 22, 85, 252, 209, 142, 65, 226, 158, 126, 168, 175, 179, 219, 116, + 235, 227, 42, 49, 126, 126, 215, 200, 126, 0, 39, 247, 161, 217, 26, + 228, 232, 113, 53, 151, 34, 223, 91, 242, 155, 156, 144, 229, 237, 127, + 227, 49, 239, 71, 102, 115, 74, 135, 103, 13, 3, 108, 101, 211, 36, + 59, 146, 143, 230, 44, 212, 145, 229, 53, 108, 175, 42, 131, 113, 123, + 30, 28, 149, 153, 117, 233, 76, 33, 148, 110, 19, 83, 125, 135, 44, + 202, 2, 155, 4, 240, 167, 7, 13, 115, 243, 216, 73, 248, 216, 82, + 230, 153, 48, 234, 157, 2, 130, 99, 147, 2, 244, 19, 125, 30, 39, + 148, 49, 134, 140, 240, 128, 230, 171, 24, 53, 245, 54, 72, 111, 230, + 192, 165, 199, 47, 186, 238, 121, 95, 220, 76, 229, 253, 157, 47, 34, + 47, 39, 77, 199, 203, 163, 148, 172, 56, 204, 96, 69, 235, 215, 96, + 92, 139, 92, 49, 73, 228, 70, 221, 18, 84, 167, 179, 201, 239, 71, + 64, 29, 247, 84, 56, 148, 36, 169, 144, 192, 60, 153, 171, 89, 125, + 48, 98, 201, 56, 230, 154, 146, 46, 184, 202, 3, 39, 113, 90, 249, + 163, 0, 188, 233, 10, 216, 17, 159, 42, 134, 57, 70, 24, 33, 63, + 8, 67, 85, 7, 133, 180, 127, 12, 234, 121, 183, 38, 131, 154, 241, + 236, 69, 67, 116, 54, 40, 225, 6, 220, 22, 251, 1, 100, 110, 165, + 114, 12, 170, 21, 190, 103, 242, 171, 216, 66, 30, 3, 214, 137, 231, + 172, 61, 8, 249, 198, 113, 181, 171, 13, 159, 21, 147, 67, 249, 94, + 189, 174, 15, 2, 62, 254, 29, 32, 209, 169, 184, 119, 220, 98, 248, + 163, 171, 22, 62, 125, 155, 100, 186, 97, 163, 245, 70, 216, 246, 1, + 11, 83, 41, 100, 64, 52, 99, 184, 151, 99, 46, 100, 168, 158, 210, + 150, 38, 231, 27, 255, 59, 141, 232, 127, 56, 39, 194, 104, 178, 151, + 15, 25, 219, 221, 81, 119, 178, 153, 94, 173, 64, 215, 128, 132, 163, + 159, 214, 254, 181, 194, 113, 144, 141, 103, 17, 108, 178, 59, 62, 205, + 117, 57, 183, 97, 18, 210, 87, 163, 231, 213, 233, 251, 94, 136, 217, + 168, 69, 48, 55, 68, 144, 203, 187, 51, 211, 151, 1, 194, 118, 181, + 154, 103, 186, 87, 43, 128, 215, 79, 101, 175, 60, 221, 158, 189, 94, + 194, 87, 73, 72, 162, 252, 26, 40, 142, 86, 228, 82, 255, 122, 192, + 167, 78, 177, 40, 249, 195, 100, 188, 31, 208, 124, 123, 31, 121, 244, + 4, 82, 3, 132, 15, 2, 29, 186, 76, 106, 109, 158, 114, 25, 212, + 74, 64, 255, 43, 40, 146, 159, 225, 39, 65, 85, 37, 60, 160, 123, + 116, 127, 134, 45, 177, 191, 49, 136, 211, 167, 218, 197, 15, 96, 45, + 55, 11, 237, 103, 118, 207, 0, 211, 25, 143, 19, 93, 114, 90, 105, + 253, 88, 140, 207, 56, 150, 0, 136, 159, 134, 63, 75, 142, 177, 0, + 107, 105, 78, 148, 214, 248, 70, 72, 125, 220, 156, 220, 222, 102, 202, + 176, 12, 58, 24, 39, 254, 170, 130, 77, 203, 193, 162, 56, 162, 57, + 76, 153, 170, 112, 94, 0, 220, 58, 58, 40, 173, 2, 193, 164, 168, + 127, 225, 238, 10, 194, 112, 213, 181, 126, 222, 152, 12, 57, 14, 146, + 137, 154, 203, 179, 45, 133, 70, 204, 66, 249, 32, 136, 145, 0, 221, + 224, 10, 1, 202, 139, 145, 247, 72, 254, 32, 169, 121, 167, 114, 198, + 244, 251, 243, 8, 114, 188, 178, 173, 25, 243, 122, 220, 45, 98, 7, + 168, 66, 58, 225, 217, 152, 81, 89, 39, 167, 146, 181, 138, 253, 196, + 145, 4, 72, 9, 14, 137, 155, 32, 217, 64, 4, 173, 220, 66, 114, + 21, 137, 118, 87, 163, 217, 204, 74, 236, 45, 170, 60, 141, 216, 234, + 182, 79, 74, 73, 94, 63, 89, 134, 88, 64, 32, 241, 9, 114, 253, + 164, 108, 31, 27, 42, 172, 7, 102, 213, 153, 83, 1, 152, 136, 224, + 248, 70, 112, 15, 211, 194, 216, 16, 255, 62, 83, 147, 173, 192, 239, + 55, 18, 223, 34, 152, 25, 163, 229, 4, 55, 219, 235, 187, 51, 116, + 12, 202, 198, 116, 188, 217, 91, 30, 11, 9, 13, 222, 120, 16, 93, + 99, 56, 129, 27, 133, 155, 120, 124, 112, 101, 42, 222, 122, 124, 59, + 84, 228, 202, 189, 13, 11, 10, 44, 220, 97, 67, 53, 246, 47, 230, + 131, 192, 1, 247, 137, 90, 77, 243, 131, 2, 130, 93, 183, 117, 102, + 69, 191, 27, 87, 103, 218, 157, 124, 17, 209, 135, 92, 78, 211, 141, + 25, 157, 53, 17, 249, 209, 206, 84, 19, 135, 253, 57, 36, 38, 112, + 184, 61, 76, 5, 203, 155, 7, 9, 179, 167, 38, 136, 189, 40, 19, + 183, 132, 81, 135, 167, 48, 74, 186, 249, 144, 193, 150, 73, 10, 192, + 191, 160, 74, 246, 12, 38, 107, 3, 66, 122, 184, 168, 218, 233, 78, + 216, 11, 57, 124, 104, 167, 0, 187, 2, 214, 136, 252, 60, 85, 128, + 128, 31, 70, 197, 211, 180, 216, 75, 212, 163, 168, 15, 174, 44, 194, + 231, 24, 181, 154, 161, 241, 95, 197, 227, 146, 195, 187, 69, 127, 154, + 145, 176, 180, 157, 13, 225, 107, 60, 29, 14, 223, 93, 214, 248, 107, + 65, 168, 251, 231, 46, 34, 203, 76, 20, 206, 125, 80, 25, 196, 60, + 213, 51, 238, 73, 17, 223, 151, 44, 60, 213, 164, 117, 188, 66, 195, + 170, 190, 117, 110, 21, 27, 78, 244, 124, 224, 142, 182, 10, 122, 135, + 121, 143, 240, 124, 6, 8, 22, 15, 3, 137, 12, 19, 11, 62, 212, + 205, 3, 202, 189, 157, 141, 68, 171, 142, 106, 69, 207, 8, 116, 194, + 6, 200, 96, 220, 248, 132, 46, 171, 57, 234, 31, 3, 112, 108, 15, + 139, 243, 34, 181, 250, 10, 86, 71, 162, 167, 85, 177, 57, 166, 80, + 41, 253, 128, 28, 127, 220, 149, 27, 29, 41, 201, 116, 211, 236, 34, + 200, 100, 157, 130, 223, 4, 162, 108, 181, 40, 255, 96, 18, 77, 36, + 217, 17, 225, 142, 124, 17, 91, 227, 13, 224, 213, 37, 115, 216, 93, + 149, 103, 105, 152, 190, 207, 54, 74, 226, 78, 133, 200, 252, 157, 152, + 39, 0, 173, 168, 132, 142, 17, 66, 241, 137, 12, 106, 42, 81, 239, + 78, 31, 131, 49, 243, 122, 178, 212, 137, 160, 104, 15, 145, 15, 116, + 103, 141, 94, 40, 127, 180, 174, 96, 222, 182, 226, 168, 174, 113, 228, + 156, 10, 18, 231, 122, 150, 178, 17, 200, 254, 96, 42, 243, 225, 58, + 235, 64, 159, 73, 162, 72, 46, 160, 33, 191, 99, 73, 130, 32, 135, + 84, 29, 100, 232, 75, 110, 180, 226, 11, 143, 127, 79, 246, 48, 148, + 229, 211, 204, 72, 18, 89, 22, 251, 202, 8, 10, 2, 130, 230, 219, + 71, 66, 142, 149, 47, 12, 117, 202, 224, 248, 35, 75, 242, 87, 125, + 230, 66, 38, 160, 62, 248, 213, 32, 166, 83, 220, 230, 0, 1, 147, + 51, 128, 110, 20, 16, 43, 142, 90, 0, 2, 104, 111, 232, 38, 29, + 181, 243, 130, 121, 105, 177, 168, 113, 126, 191, 59, 205, 27, 180, 49, + 128, 160, 225, 23, 173, 193, 155, 123, 12, 173, 72, 139, 63, 23, 232, + 138, 235, 39, 179, 158, 95, 103, 192, 13, 242, 11, 127, 239, 91, 13, + 119, 19, 185, 105, 87, 195, 168, 145, 15, 53, 146, 35, 227, 101, 234, + 198, 247, 19, 29, 134, 126, 211, 133, 78, 186, 127, 129, 181, 115, 133, + 62, 166, 133, 128, 225, 101, 98, 146, 175, 110, 113, 171, 117, 4, 130, + 190, 186, 216, 17, 201, 29, 62, 77, 74, 189, 50, 155, 188, 93, 237, + 26, 100, 225, 91, 120, 229, 163, 16, 210, 167, 138, 241, 147, 36, 56, + 12, 100, 33, 55, 232, 200, 118, 3, 222, 31, 72, 167, 91, 45, 133, + 62, 184, 64, 120, 116, 249, 12, 15, 243, 98, 145, 234, 253, 71, 194, + 61, 4, 102, 112, 35, 27, 75, 13, 1, 4, 128, 238, 170, 187, 80, + 147, 216, 165, 147, 248, 250, 241, 69, 106, 233, 227, 22, 153, 120, 138, + 113, 83, 104, 154, 50, 99, 153, 188, 69, 252, 171, 177, 49, 74, 134, + 219, 247, 255, 191, 202, 165, 239, 179, 147, 91, 215, 195, 157, 68, 21, + 180, 112, 187, 51, 66, 80, 205, 100, 35, 78, 59, 92, 175, 87, 224, + 170, 237, 223, 224, 83, 182, 199, 47, 95, 111, 42, 197, 22, 21, 143, + 123, 173, 69, 247, 31, 205, 69, 136, 137, 136, 241, 233, 67, 7, 225, + 112, 102, 92, 180, 211, 254, 29, 129, 29, 21, 188, 44, 95, 57, 122, + 17, 196, 213, 33, 56, 23, 88, 236, 185, 35, 17, 156, 165, 93, 108, + 157, 198, 5, 124, 225, 150, 156, 146, 116, 88, 116, 181, 207, 90, 85, + 145, 228, 231, 91, 116, 79, 6, 119, 6, 207, 190, 102, 72, 242, 2, + 253, 79, 92, 88, 189, 28, 57, 28, 101, 199, 134, 124, 215, 59, 37, + 222, 54, 194, 151, 252, 185, 74, 101, 193, 43, 186, 184, 255, 158, 129, + 183, 83, 176, 249, 134, 58, 15, 49, 213, 127, 162, 179, 56, 53, 4, + 114, 112, 29, 84, 246, 109, 46, 153, 97, 30, 208, 98, 234, 155, 104, + 158, 93, 9, 53, 175, 49, 54, 160, 238, 150, 117, 145, 202, 210, 37, + 15, 3, 100, 20, 116, 153, 90, 23, 2, 146, 58, 182, 199, 197, 122, + 89, 30, 152, 241, 105, 97, 115, 131, 111, 4, 235, 217, 213, 144, 218, + 217, 201, 141, 113, 21, 237, 254, 184, 181, 135, 177, 86, 215, 248, 169, + 55, 231, 229, 60, 133, 12, 194, 206, 112, 206, 175, 216, 131, 181, 41, + 154, 235, 76, 152, 58, 118, 111, 32, 220, 219, 253, 198, 18, 227, 71, + 129, 197, 227, 96, 155, 66, 0, 51, 132, 150, 208, 177, 188, 149, 100, + 236, 23, 49, 45, 236, 131, 225, 206, 77, 77, 94, 12, 244, 159, 85, + 247, 189, 109, 141, 217, 80, 115, 44, 171, 138, 68, 128, 147, 244, 213, + 43, 187, 135, 126, 156, 158, 199, 61, 180, 112, 130, 230, 146, 100, 106, + 56, 70, 71, 234, 3, 202, 1, 45, 20, 136, 149, 112, 178, 25, 110, + 160, 221, 57, 191, 78, 9, 250, 233, 4, 144, 28, 219, 200, 203, 227, + 218, 229, 108, 59, 221, 141, 0, 122, 121, 65, 156, 204, 19, 152, 215, + 64, 164, 15, 77, 26, 113, 82, 229, 23, 103, 204, 151, 118, 104, 171, + 115, 72, 191, 5, 159, 133, 83, 221, 228, 120, 127, 46, 233, 14, 27, + 216, 31, 63, 179, 224, 226, 121, 29, 62, 47, 199, 67, 60, 240, 85, + 175, 242, 113, 168, 160, 93, 147, 205, 103, 67, 110, 237, 143, 148, 65, + 209, 31, 100, 252, 166, 254, 170, 52, 203, 222, 75, 219, 77, 217, 202, + 18, 117, 253, 92, 29, 205, 115, 53, 255, 251, 150, 164, 72, 146, 6, + 101, 161, 127, 50, 73, 152, 194, 180, 11, 121, 11, 229, 147, 151, 143, + 226, 196, 238, 131, 141, 173, 153, 189, 114, 16, 82, 1, 70, 239, 22, + 85, 108, 113, 21, 231, 43, 6, 228, 54, 94, 200, 186, 190, 143, 117, + 156, 22, 30, 9, 64, 25, 8, 116, 27, 240, 24, 150, 146, 224, 73, + 97, 95, 183, 151, 185, 178, 16, 82, 243, 208, 160, 186, 246, 234, 223, + 35, 6, 166, 7, 105, 224, 246, 14, 208, 1, 70, 244, 221, 238, 235, + 86, 81, 136, 40, 99, 104, 89, 22, 194, 40, 36, 45, 126, 138, 174, + 22, 206, 228, 146, 114, 162, 4, 211, 213, 163, 224, 91, 3, 85, 140, + 140, 202, 204, 23, 194, 108, 166, 123, 1, 36, 191, 161, 38, 228, 65, + 249, 235, 26, 156, 83, 68, 199, 239, 109, 1, 203, 198, 25, 22, 128, + 165, 15, 125, 139, 190, 100, 184, 159, 16, 194, 244, 228, 18, 215, 103, + 169, 32, 208, 12, 104, 94, 71, 209, 193, 160, 161, 73, 38, 35, 49, + 202, 29, 193, 120, 100, 98, 219, 44, 27, 224, 222, 226, 105, 153, 17, + 252, 120, 143, 190, 173, 176, 89, 205, 149, 11, 99, 31, 107, 102, 187, + 100, 107, 200, 1, 130, 89, 75, 71, 196, 150, 89, 231, 28, 213, 173, + 229, 173, 104, 156, 123, 227, 163, 65, 230, 167, 67, 242, 143, 224, 224, + 161, 249, 205, 140, 149, 156, 2, 138, 177, 193, 136, 225, 177, 34, 246, + 27, 179, 108, 116, 169, 0, 183, 169, 12, 239, 230, 127, 169, 170, 144, + 151, 36, 111, 52, 132, 2, 15, 237, 209, 133, 254, 241, 184, 232, 116, + 11, 221, 210, 64, 96, 18, 30, 245, 95, 142, 84, 218, 92, 151, 20, + 155, 101, 201, 153, 82, 163, 43, 168, 152, 90, 224, 18, 112, 161, 123, + 115, 129, 136, 198, 50, 186, 239, 28, 80, 91, 20, 73, 6, 150, 187, + 56, 54, 200, 67, 26, 62, 0, 229, 42, 210, 107, 245, 83, 172, 233, + 195, 140, 31, 24, 205, 202, 128, 145, 242, 73, 113, 92, 176, 3, 146, + 170, 21, 106, 67, 53, 254, 192, 212, 194, 6, 52, 81, 163, 236, 63, + 95, 164, 91, 60, 20, 9, 201, 74, 143, 55, 110, 76, 61, 115, 177, + 84, 105, 191, 199, 248, 51, 89, 35, 91, 44, 199, 13, 254, 130, 142, + 136, 64, 111, 128, 229, 171, 208, 183, 242, 195, 251, 72, 168, 31, 76, + 89, 102, 122, 181, 57, 110, 17, 196, 31, 136, 185, 196, 118, 100, 188, + 100, 21, 239, 206, 77, 97, 238, 78, 215, 224, 113, 210, 122, 141, 190, + 103, 135, 12, 41, 206, 157, 154, 10, 167, 133, 183, 60, 230, 235, 109, + 33, 95, 121, 34, 206, 1, 149, 114, 4, 252, 42, 17, 93, 191, 144, + 133, 226, 101, 215, 124, 88, 163, 27, 29, 189, 35, 51, 182, 112, 242, + 94, 56, 196, 99, 242, 77, 95, 123, 219, 81, 71, 229, 138, 101, 8, + 77, 79, 2, 166, 195, 239, 148, 221, 188, 20, 170, 26, 215, 139, 42, + 171, 153, 219, 107, 191, 90, 185, 241, 37, 84, 41, 232, 27, 123, 36, + 86, 113, 255, 25, 245, 187, 21, 110, 13, 17, 43, 99, 91, 182, 243, + 239, 194, 150, 187, 111, 30, 83, 28, 111, 249, 159, 212, 187, 184, 177, + 12, 234, 107, 211, 32, 118, 132, 10, 145, 19, 150, 206, 230, 158, 80, + 101, 41, 67, 38, 79, 57, 164, 80, 147, 64, 207, 231, 229, 162, 5, + 185, 40, 164, 17, 84, 156, 1, 52, 181, 67, 63, 182, 25, 68, 55, + 167, 230, 125, 225, 234, 125, 79, 102, 35, 54, 2, 12, 145, 67, 6, + 252, 218, 231, 14, 58, 221, 248, 171, 23, 93, 14, 51, 76, 155, 97, + 239, 11, 95, 245, 154, 209, 127, 208, 19, 209, 158, 67, 164, 1, 123, + 230, 90, 236, 148, 77, 210, 240, 27, 154, 16, 146, 19, 107, 106, 141, + 94, 144, 28, 24, 130, 111, 164, 46, 108, 89, 171, 52, 192, 121, 188, + 166, 207, 164, 98, 57, 189, 54, 190, 18, 4, 120, 181, 18, 216, 162, + 19, 111, 254, 71, 171, 194, 79, 73, 122, 9, 115, 63, 61, 88, 117, + 234, 203, 250, 167, 102, 98, 101, 177, 5, 13, 228, 205, 115, 107, 219, + 215, 33, 150, 13, 242, 180, 71, 27, 0, 250, 228, 50, 129, 215, 93, + 174, 169, 167, 125, 14, 89, 130, 195, 127, 158, 250, 249, 142, 213, 5, + 1, 250, 31, 122, 171, 62, 142, 38, 84, 165, 95, 237, 144, 145, 189, + 193, 248, 121, 112, 22, 11, 26, 192, 90, 76, 117, 89, 160, 228, 152, + 24, 129, 235, 37, 24, 66, 68, 161, 126, 147, 44, 172, 137, 134, 203, + 162, 152, 255, 161, 135, 6, 31, 72, 69, 9, 228, 3, 80, 28, 50, + 240, 176, 66, 255, 231, 21, 233, 149, 55, 211, 15, 182, 116, 165, 211, + 190, 28, 69, 40, 3, 164, 172, 212, 150, 181, 213, 32, 174, 216, 8, + 243, 29, 152, 124, 7, 111, 140, 53, 157, 158, 233, 175, 60, 191, 179, + 131, 248, 252, 50, 171, 165, 5, 51, 69, 215, 168, 222, 57, 221, 164, + 56, 193, 114, 18, 89, 219, 222, 198, 163, 200, 233, 28, 51, 190, 25, + 206, 243, 63, 51, 44, 10, 57, 71, 252, 230, 161, 141, 79, 31, 30, + 150, 101, 168, 23, 70, 216, 216, 160, 241, 192, 106, 92, 194, 141, 81, + 100, 222, 165, 180, 27, 70, 201, 219, 31, 177, 189, 114, 30, 74, 6, + 184, 114, 208, 189, 246, 83, 107, 229, 153, 69, 66, 201, 253, 183, 5, + 134, 156, 200, 132, 187, 73, 175, 213, 178, 14, 66, 101, 13, 224, 49, + 205, 244, 124, 231, 18, 71, 94, 246, 29, 78, 201, 138, 60, 97, 54, + 156, 123, 144, 143, 6, 191, 113, 140, 251, 203, 125, 196, 135, 169, 197, + 34, 215, 77, 138, 218, 63, 56, 145, 74, 225, 15, 227, 112, 113, 160, + 165, 122, 85, 179, 97, 146, 5, 221, 133, 236, 170, 2, 236, 128, 19, + 252, 238, 120, 0, 192, 55, 5, 138, 161, 222, 148, 189, 130, 53, 250, + 36, 153, 248, 210, 197, 167, 236, 128, 191, 37, 251, 151, 163, 190, 155, + 38, 27, 164, 166, 238, 185, 11, 214, 212, 122, 206, 212, 255, 103, 255, + 69, 146, 54, 182, 52, 54, 169, 121, 244, 205, 244, 168, 96, 163, 220, + 75, 194, 10, 133, 204, 105, 10, 228, 139, 62, 39, 254, 131, 5, 243, + 54, 14, 158, 107, 118, 143, 81, 55, 251, 151, 226, 29, 54, 218, 99, + 187, 76, 178, 61, 206, 20, 170, 229, 190, 77, 215, 47, 104, 244, 87, + 101, 82, 50, 41, 255, 56, 6, 226, 22, 153, 19, 72, 227, 63, 224, + 79, 3, 130, 220, 135, 116, 39, 25, 98, 107, 50, 214, 183, 120, 215, + 26, 160, 247, 26, 190, 119, 146, 181, 147, 36, 15, 75, 109, 71, 72, + 44, 14, 9, 61, 201, 200, 222, 53, 246, 57, 69, 63, 108, 133, 140, + 150, 33, 233, 46, 84, 102, 150, 204, 129, 195, 97, 4, 69, 176, 166, + 182, 10, 237, 141, 33, 70, 200, 98, 101, 157, 9, 70, 227, 108, 195, + 241, 72, 105, 86, 67, 5, 242, 199, 149, 33, 43, 105, 206, 122, 20, + 13, 28, 158, 131, 47, 202, 70, 9, 92, 32, 10, 251, 103, 49, 185, + 35, 242, 168, 151, 234, 237, 212, 91, 81, 113, 133, 247, 204, 23, 4, + 9, 226, 14, 29, 117, 236, 101, 250, 46, 161, 149, 131, 98, 141, 228, + 72, 18, 164, 252, 56, 7, 160, 217, 183, 125, 121, 154, 169, 152, 211, + 114, 24, 190, 141, 135, 41, 173, 250, 50, 54, 197, 65, 67, 117, 246, + 235, 130, 142, 138, 62, 216, 51, 193, 247, 30, 164, 235, 209, 157, 138, + 4, 147, 6, 253, 187, 34, 124, 1, 143, 60, 95, 168, 72, 167, 72, + 72, 13, 142, 35, 185, 107, 29, 51, 189, 48, 141, 194, 33, 77, 118, + 17, 80, 88, 204, 147, 148, 143, 103, 246, 97, 180, 153, 160, 112, 81, + 196, 2, 222, 148, 126, 240, 27, 61, 128, 155, 184, 106, 89, 36, 136, + 230, 128, 84, 217, 130, 139, 104, 115, 225, 73, 77, 7, 49, 183, 4, + 250, 124, 196, 34, 183, 209, 17, 136, 92, 16, 94, 51, 78, 174, 185, + 117, 243, 69, 11, 214, 132, 72, 86, 212, 4, 193, 253, 125, 45, 148, + 97, 87, 6, 101, 195, 169, 86, 115, 218, 254, 40, 59, 255, 137, 135, + 183, 253, 117, 170, 29, 191, 138, 247, 117, 125, 234, 30, 40, 92, 8, + 180, 240, 136, 142, 111, 239, 66, 225, 196, 151, 93, 130, 126, 255, 195, + 34, 252, 17, 101, 179, 120, 76, 4, 227, 13, 12, 66, 205, 235, 177, + 29, 187, 25, 114, 68, 119, 114, 158, 213, 149, 210, 5, 104, 71, 181, + 126, 211, 32, 99, 60, 51, 75, 85, 138, 138, 68, 115, 81, 37, 17, + 101, 36, 117, 236, 182, 77, 98, 113, 198, 195, 73, 79, 215, 116, 248, + 45, 244, 60, 205, 35, 95, 228, 38, 180, 250, 246, 63, 211, 44, 197, + 162, 24, 195, 61, 136, 142, 91, 141, 62, 34, 139, 60, 142, 238, 67, + 148, 54, 132, 41, 115, 241, 219, 192, 121, 9, 45, 75, 183, 223, 213, + 165, 161, 219, 181, 161, 27, 36, 158, 163, 12, 12, 141, 83, 105, 157, + 118, 168, 244, 204, 32, 52, 131, 88, 246, 230, 121, 21, 58, 91, 217, + 138, 27, 251, 174, 150, 51, 240, 201, 30, 66, 19, 148, 185, 122, 53, + 15, 176, 144, 148, 3, 238, 59, 211, 155, 77, 83, 81, 245, 186, 169, + 217, 201, 103, 109, 137, 119, 146, 100, 18, 200, 185, 212, 202, 17, 88, + 146, 234, 49, 190, 19, 139, 43, 1, 48, 21, 64, 235, 89, 191, 74, + 89, 85, 16, 64, 203, 99, 152, 255, 61, 159, 36, 5, 199, 49, 94, + 229, 163, 192, 41, 165, 20, 203, 176, 149, 18, 152, 61, 216, 188, 203, + 180, 103, 202, 176, 177, 210, 255, 26, 254, 70, 43, 214, 95, 208, 73, + 148, 124, 19, 215, 68, 123, 10, 179, 88, 167, 224, 23, 246, 150, 201, + 51, 157, 139, 187, 103, 187, 198, 189, 204, 126, 74, 124, 23, 150, 108, + 116, 196, 130, 92, 0, 211, 151, 19, 58, 249, 50, 186, 54, 102, 164, + 122, 228, 71, 163, 163, 117, 78, 234, 197, 70, 96, 79, 4, 88, 242, + 219, 120, 28, 178, 165, 136, 178, 129, 125, 79, 140, 65, 62, 78, 237, + 104, 11, 45, 191, 163, 145, 174, 23, 34, 240, 43, 137, 102, 189, 140, + 137, 4, 222, 55, 6, 84, 194, 51, 164, 107, 234, 39, 216, 15, 12, + 44, 86, 170, 121, 46, 4, 220, 200, 42, 53, 11, 228, 110, 187, 116, + 182, 242, 42, 93, 109, 47, 109, 180, 155, 31, 99, 60, 107, 114, 82, + 196, 146, 45, 224, 90, 205, 34, 200, 42, 173, 113, 37, 26, 154, 74, + 18, 165, 45, 22, 141, 1, 244, 64, 159, 164, 162, 100, 6, 67, 145, + 199, 205, 254, 149, 56, 138, 15, 172, 205, 203, 191, 253, 126, 238, 167, + 210, 103, 33, 143, 85, 161, 150, 99, 12, 207, 238, 110, 157, 190, 52, + 249, 121, 139, 188, 0, 74, 92, 106, 101, 254, 190, 251, 213, 167, 78, + 36, 224, 24, 6, 195, 128, 24, 21, 35, 66, 223, 204, 84, 177, 109, + 226, 215, 79, 19, 236, 73, 74, 244, 146, 57, 228, 254, 223, 158, 42, + 83, 29, 181, 14, 147, 60, 4, 147, 107, 95, 220, 180, 130, 140, 28, + 118, 179, 39, 179, 250, 184, 27, 209, 199, 151, 154, 121, 105, 81, 215, + 143, 46, 91, 217, 94, 230, 250, 165, 21, 240, 234, 93, 0, 176, 20, + 127, 181, 36, 127, 49, 36, 79, 233, 229, 57, 241, 56, 119, 151, 222, + 239, 203, 217, 74, 164, 88, 47, 25, 43, 58, 136, 61, 233, 70, 133, + 181, 122, 250, 169, 249, 38, 36, 40, 182, 201, 40, 64, 218, 145, 63, + 209, 126, 248, 65, 23, 142, 147, 3, 241, 200, 87, 132, 93, 31, 22, + 90, 86, 244, 47, 235, 53, 187, 96, 165, 221, 185, 118, 134, 129, 94, + 64, 188, 132, 216, 198, 131, 74, 193, 32, 41, 194, 69, 201, 64, 31, + 6, 235, 95, 181, 207, 187, 60, 250, 24, 233, 127, 4, 5, 190, 242, + 168, 239, 185, 172, 78, 136, 121, 180, 191, 84, 54, 252, 83, 202, 111, + 32, 100, 213, 7, 178, 225, 71, 68, 244, 36, 141, 242, 199, 185, 71, + 55, 244, 166, 113, 41, 66, 177, 55, 251, 179, 251, 194, 2, 54, 20, + 100, 241, 82, 213, 236, 45, 196, 119, 134, 167, 163, 134, 61, 218, 207, + 200, 118, 143, 249, 165, 105, 78, 208, 213, 206, 72, 76, 123, 47, 31, + 9, 234, 18, 125, 95, 170, 199, 123, 139, 158, 244, 171, 6, 202, 240, + 214, 94, 46, 60, 109, 185, 175, 204, 176, 229, 110, 139, 249, 234, 3, + 202, 231, 25, 195, 150, 136, 186, 246, 72, 242, 133, 249, 229, 58, 112, + 28, 228, 121, 85, 115, 90, 95, 32, 141, 135, 217, 12, 187, 50, 229, + 66, 103, 204, 0, 93, 86, 245, 59, 173, 28, 71, 131, 135, 118, 125, + 113, 12, 13, 202, 242, 205, 255, 152, 243, 160, 243, 148, 10, 28, 106, + 56, 17, 93, 234, 204, 102, 53, 22, 48, 188, 15, 255, 14, 3, 117, + 190, 211, 116, 55, 77, 205, 171, 228, 120, 244, 1, 169, 51, 241, 150, + 206, 99, 20, 68, 119, 137, 180, 44, 113, 85, 242, 143, 148, 97, 149, + 75, 20, 228, 89, 226, 122, 102, 13, 195, 58, 111, 178, 82, 226, 144, + 82, 237, 27, 94, 244, 29, 102, 32, 162, 80, 228, 66, 203, 107, 211, + 171, 4, 56, 62, 184, 63, 137, 5, 179, 231, 185, 172, 102, 190, 42, + 80, 164, 123, 68, 20, 36, 135, 97, 102, 156, 133, 165, 202, 240, 84, + 168, 30, 95, 57, 3, 182, 224, 10, 84, 60, 88, 191, 0, 126, 190, + 240, 202, 141, 89, 238, 212, 101, 213, 129, 15, 245, 94, 24, 49, 72, + 59, 237, 121, 241, 199, 28, 106, 113, 237, 82, 144, 150, 112, 79, 90, + 255, 166, 230, 71, 132, 24, 6, 82, 143, 150, 194, 236, 253, 46, 158, + 143, 5, 31, 243, 156, 4, 19, 89, 81, 94, 94, 39, 9, 199, 6, + 44, 35, 4, 143, 18, 62, 27, 165, 177, 162, 53, 121, 146, 74, 181, + 252, 27, 207, 17, 102, 196, 172, 75, 4, 17, 215, 20, 96, 9, 42, + 199, 99, 206, 94, 78, 121, 37, 11, 152, 125, 249, 107, 153, 180, 85, + 155, 220, 68, 223, 87, 204, 175, 117, 147, 217, 71, 6, 190, 132, 99, + 227, 5, 180, 168, 249, 126, 202, 102, 42, 26, 175, 198, 185, 211, 206, + 154, 60, 24, 183, 24, 203, 46, 21, 176, 194, 116, 116, 210, 162, 214, + 215, 79, 87, 159, 16, 55, 12, 248, 51, 17, 79, 183, 145, 23, 209, + 58, 225, 84, 21, 237, 102, 250, 93, 222, 87, 87, 203, 4, 138, 196, + 6, 28, 143, 45, 68, 77, 211, 180, 47, 198, 5, 170, 166, 221, 107, + 202, 67, 220, 178, 156, 39, 2, 87, 147, 234, 85, 199, 97, 10, 151, + 240, 121, 229, 132, 230, 249, 244, 57, 77, 29, 123, 149, 121, 81, 245, + 37, 106, 157, 39, 185, 31, 175, 102, 187, 37, 149, 27, 215, 151, 155, + 94, 160, 180, 59, 95, 200, 149, 42, 178, 85, 171, 41, 31, 20, 16, + 199, 14, 202, 230, 42, 59, 83, 239, 155, 65, 63, 237, 89, 133, 62, + 23, 112, 236, 226, 34, 250, 134, 14, 234, 2, 212, 41, 135, 189, 114, + 60, 147, 49, 19, 193, 169, 157, 41, 62, 36, 42, 2, 172, 237, 250, + 86, 252, 199, 80, 194, 195, 182, 136, 209, 90, 80, 9, 121, 164, 168, + 99, 235, 131, 129, 59, 26, 41, 124, 194, 110, 143, 183, 126, 91, 50, + 168, 211, 43, 177, 95, 196, 94, 206, 214, 173, 89, 152, 173, 39, 53, + 190, 186, 193, 75, 23, 181, 65, 153, 57, 142, 215, 155, 147, 241, 110, + 230, 102, 176, 152, 227, 83, 87, 110, 243, 143, 254, 127, 254, 117, 117, + 173, 106, 80, 127, 231, 39, 220, 178, 44, 95, 30, 60, 222, 212, 72, + 169, 84, 194, 40, 164, 156, 145, 182, 127, 51, 64, 108, 144, 124, 136, + 238, 4, 113, 14, 68, 106, 158, 20, 231, 109, 99, 70, 214, 68, 29, + 240, 154, 95, 206, 188, 136, 180, 41, 220, 228, 198, 82, 51, 118, 65, + 20, 198, 187, 22, 8, 134, 252, 86, 227, 110, 105, 198, 242, 48, 8, + 192, 165, 80, 210, 1, 175, 188, 99, 252, 178, 7, 70, 27, 249, 175, + 145, 131, 228, 86, 229, 81, 93, 203, 194, 226, 110, 250, 134, 235, 195, + 170, 107, 131, 185, 81, 99, 168, 124, 215, 108, 40, 198, 193, 117, 88, + 136, 134, 114, 145, 239, 9, 0, 184, 106, 111, 63, 6, 92, 30, 3, + 116, 7, 232, 182, 184, 60, 32, 161, 183, 167, 163, 185, 114, 43, 77, + 134, 29, 164, 135, 3, 155, 255, 83, 254, 203, 1, 243, 167, 236, 162, + 77, 140, 250, 224, 25, 246, 81, 147, 207, 0, 127, 115, 127, 151, 191, + 179, 128, 77, 142, 203, 171, 153, 47, 244, 165, 235, 20, 64, 36, 99, + 201, 190, 83, 244, 125, 112, 49, 26, 95, 125, 254, 140, 85, 142, 112, + 170, 225, 4, 126, 243, 224, 180, 137, 152, 102, 9, 92, 67, 247, 20, + 189, 58, 88, 74, 183, 201, 43, 1, 2, 123, 228, 211, 79, 91, 20, + 64, 111, 238, 60, 76, 207, 91, 90, 130, 169, 238, 254, 208, 125, 140, + 7, 94, 63, 18, 46, 124, 16, 253, 228, 238, 179, 99, 129, 40, 89, + 12, 40, 42, 94, 237, 111, 112, 22, 162, 64, 25, 89, 102, 56, 25, + 245, 128, 221, 86, 146, 138, 242, 67, 166, 114, 204, 38, 89, 77, 127, + 64, 36, 183, 161, 254, 185, 76, 91, 10, 28, 146, 154, 254, 118, 200, + 206, 95, 6, 182, 35, 178, 179, 114, 87, 60, 208, 88, 180, 161, 171, + 39, 156, 131, 2, 83, 124, 11, 223, 57, 190, 18, 79, 245, 198, 11, + 55, 131, 197, 28, 74, 32, 223, 144, 231, 227, 25, 237, 243, 145, 64, + 183, 62, 163, 33, 93, 155, 82, 228, 206, 69, 77, 101, 8, 240, 3, + 135, 0, 181, 153, 174, 82, 29, 129, 40, 83, 235, 83, 98, 105, 235, + 210, 121, 239, 78, 240, 217, 144, 230, 225, 3, 157, 14, 118, 64, 228, + 29, 110, 230, 247, 153, 117, 3, 81, 24, 23, 169, 2, 247, 238, 144, + 137, 241, 140, 192, 185, 165, 13, 122, 48, 180, 254, 54, 128, 134, 247, + 87, 42, 219, 166, 7, 248, 91, 39, 226, 245, 44, 152, 30, 71, 125, + 129, 102, 72, 16, 66, 119, 15, 189, 250, 70, 112, 168, 7, 5, 181, + 15, 114, 73, 112, 16, 184, 65, 192, 54, 51, 31, 202, 38, 11, 170, + 149, 37, 107, 44, 241, 30, 35, 23, 176, 99, 82, 230, 60, 206, 39, + 249, 227, 114, 152, 133, 233, 60, 188, 79, 52, 241, 191, 208, 160, 213, + 159, 219, 188, 222, 47, 235, 187, 9, 186, 112, 78, 101, 229, 115, 152, + 216, 196, 88, 228, 189, 226, 214, 40, 163, 155, 193, 238, 224, 72, 64, + 199, 4, 182, 248, 143, 219, 170, 227, 55, 215, 135, 92, 117, 56, 225, + 220, 129, 74, 226, 55, 132, 73, 213, 81, 93, 107, 49, 29, 155, 62, + 141, 48, 190, 242, 221, 95, 61, 179, 165, 213, 49, 125, 245, 106, 35, + 24, 57, 103, 140, 79, 172, 38, 29, 170, 145, 151, 204, 114, 161, 117, + 2, 199, 145, 210, 184, 71, 80, 251, 182, 67, 220, 3, 2, 210, 28, + 17, 104, 68, 150, 255, 174, 34, 206, 245, 97, 173, 8, 92, 160, 144, + 149, 54, 57, 114, 145, 215, 115, 186, 145, 165, 186, 207, 107, 14, 255, + 88, 145, 225, 110, 190, 78, 93, 147, 225, 247, 122, 52, 135, 147, 89, + 3, 10, 119, 43, 154, 29, 186, 68, 50, 125, 152, 205, 242, 113, 106, + 80, 68, 21, 45, 147, 212, 5, 1, 27, 39, 51, 221, 25, 38, 102, + 67, 194, 250, 121, 51, 66, 76, 155, 205, 199, 54, 177, 202, 0, 249, + 225, 231, 179, 69, 52, 22, 87, 77, 193, 35, 88, 3, 238, 62, 12, + 159, 221, 203, 230, 122, 92, 71, 26, 218, 41, 218, 75, 21, 201, 166, + 224, 173, 110, 185, 97, 161, 227, 9, 43, 108, 162, 62, 228, 201, 32, + 178, 191, 115, 35, 118, 59, 165, 223, 135, 132, 230, 110, 213, 96, 68, + 190, 237, 213, 146, 85, 179, 242, 155, 122, 217, 7, 105, 70, 123, 10, + 5, 122, 153, 202, 218, 195, 207, 73, 175, 161, 31, 200, 47, 237, 64, + 34, 227, 34, 66, 58, 29, 28, 166, 242, 128, 33, 79, 32, 125, 60, + 207, 222, 195, 180, 137, 78, 177, 132, 249, 147, 38, 64, 247, 181, 81, + 96, 155, 167, 113, 95, 197, 30, 83, 18, 128, 93, 131, 242, 197, 50, + 146, 106, 143, 56, 216, 80, 80, 159, 164, 154, 220, 248, 193, 58, 253, + 63, 219, 91, 140, 170, 71, 152, 8, 69, 37, 138, 179, 223, 54, 98, + 229, 181, 107, 50, 174, 6, 20, 69, 101, 50, 57, 102, 61, 123, 218, + 226, 77, 25, 129, 188, 103, 22, 81, 66, 232, 19, 88, 103, 184, 87, + 252, 109, 31, 242, 40, 37, 238, 237, 20, 232, 170, 115, 36, 83, 127, + 65, 208, 85, 56, 192, 120, 116, 153, 200, 116, 108, 243, 110, 8, 9, + 162, 206, 172, 25, 0, 103, 79, 239, 8, 184, 142, 87, 86, 95, 139, + 223, 180, 6, 205, 39, 76, 25, 62, 32, 244, 171, 152, 146, 48, 224, + 20, 23, 219, 250, 115, 159, 131, 14, 91, 5, 27, 26, 60, 239, 5, + 41, 159, 226, 103, 177, 43, 224, 51, 123, 129, 148, 18, 241, 66, 192, + 199, 151, 94, 207, 238, 120, 34, 234, 75, 193, 65, 66, 243, 125, 21, + 57, 113, 143, 44, 49, 153, 168, 129, 102, 21, 17, 101, 182, 217, 216, + 17, 7, 70, 99, 194, 34, 47, 49, 241, 25, 242, 163, 251, 28, 172, + 167, 4, 96, 213, 236, 60, 223, 52, 150, 216, 168, 157, 5, 56, 126, + 50, 228, 130, 166, 54, 196, 85, 86, 162, 154, 82, 84, 34, 228, 235, + 157, 230, 47, 77, 151, 127, 226, 82, 145, 205, 201, 40, 49, 178, 228, + 77, 132, 208, 93, 4, 2, 73, 46, 69, 188, 60, 130, 217, 1, 97, + 177, 240, 18, 26, 141, 97, 5, 170, 82, 56, 218, 83, 3, 29, 228, + 13, 179, 232, 154, 50, 152, 40, 58, 0, 202, 195, 36, 91, 104, 37, + 10, 89, 0, 250, 146, 45, 248, 68, 37, 180, 129, 46, 138, 43, 98, + 40, 122, 174, 147, 85, 94, 255, 76, 129, 245, 135, 198, 206, 144, 189, + 190, 207, 253, 191, 104, 163, 141, 116, 1, 192, 200, 193, 205, 196, 151, + 231, 254, 190, 17, 172, 254, 196, 243, 72, 234, 236, 92, 108, 153, 184, + 39, 201, 109, 233, 38, 178, 163, 46, 150, 153, 170, 238, 84, 196, 155, + 171, 31, 3, 186, 55, 87, 100, 179, 61, 163, 119, 82, 75, 107, 173, + 8, 145, 135, 226, 243, 8, 38, 102, 123, 120, 169, 215, 177, 132, 111, + 26, 242, 205, 150, 143, 197, 152, 137, 193, 174, 171, 234, 183, 221, 189, + 40, 212, 191, 137, 47, 153, 85, 76, 59, 255, 16, 51, 186, 105, 224, + 14, 73, 41, 84, 42, 12, 186, 198, 133, 82, 8, 161, 173, 130, 25, + 26, 22, 152, 132, 221, 182, 68, 126, 160, 248, 183, 112, 129, 83, 181, + 55, 17, 145, 18, 220, 143, 17, 49, 18, 15, 191, 104, 40, 67, 139, + 127, 106, 56, 65, 4, 120, 100, 5, 88, 44, 82, 240, 138, 64, 42, + 158, 24, 130, 133, 237, 235, 112, 115, 164, 249, 247, 233, 173, 116, 245, + 23, 37, 216, 180, 118, 183, 58, 246, 254, 103, 93, 55, 36, 213, 76, + 134, 122, 116, 164, 15, 11, 115, 168, 185, 226, 79, 250, 236, 172, 24, + 226, 48, 150, 67, 128, 63, 211, 235, 219, 120, 216, 18, 31, 82, 136, + 105, 151, 118, 193, 43, 33, 155, 55, 8, 17, 3, 211, 110, 115, 27, + 122, 3, 195, 97, 1, 227, 22, 124, 213, 59, 89, 13, 253, 221, 207, + 229, 25, 72, 200, 144, 209, 147, 185, 68, 132, 104, 7, 34, 237, 45, + 2, 17, 209, 87, 170, 227, 60, 230, 53, 186, 59, 39, 254, 57, 191, + 201, 59, 202, 119, 144, 163, 255, 78, 199, 9, 59, 129, 64, 232, 31, + 20, 110, 63, 172, 85, 239, 97, 216, 252, 158, 76, 64, 55, 133, 43, + 101, 22, 4, 27, 134, 210, 9, 120, 44, 255, 105, 142, 83, 6, 238, + 61, 226, 118, 111, 217, 234, 153, 48, 9, 193, 133, 172, 20, 121, 210, + 40, 243, 49, 13, 184, 152, 126, 248, 100, 37, 187, 216, 15, 250, 86, + 178, 24, 30, 174, 216, 151, 139, 27, 166, 190, 200, 228, 25, 152, 212, + 70, 7, 45, 141, 54, 143, 106, 206, 49, 170, 195, 61, 24, 81, 20, + 116, 147, 95, 49, 245, 179, 223, 237, 184, 110, 49, 158, 190, 211, 132, + 30, 22, 195, 234, 167, 143, 4, 26, 9, 215, 48, 100, 53, 221, 177, + 172, 132, 184, 229, 165, 207, 213, 192, 26, 58, 211, 227, 65, 148, 198, + 5, 248, 169, 32, 121, 24, 164, 193, 137, 218, 218, 105, 42, 136, 146, + 91, 72, 238, 231, 24, 17, 108, 194, 206, 5, 180, 101, 199, 161, 172, + 130, 78, 110, 255, 62, 158, 111, 204, 223, 33, 183, 43, 10, 93, 253, + 249, 193, 149, 89, 21, 51, 198, 186, 91, 142, 121, 157, 35, 254, 21, + 55, 2, 7, 119, 32, 175, 107, 199, 86, 174, 37, 144, 192, 13, 234, + 244, 152, 150, 77, 69, 91, 174, 141, 211, 71, 85, 190, 231, 124, 80, + 80, 137, 195, 5, 196, 21, 239, 110, 92, 99, 158, 247, 229, 178, 99, + 156, 222, 135, 119, 197, 242, 98, 58, 0, 134, 97, 197, 30, 113, 164, + 183, 9, 1, 97, 166, 94, 117, 183, 103, 45, 147, 215, 137, 8, 64, + 9, 149, 66, 130, 166, 94, 72, 48, 181, 156, 233, 167, 116, 59, 10, + 117, 203, 53, 110, 133, 3, 97, 84, 60, 179, 90, 47, 45, 78, 41, + 89, 191, 234, 81, 129, 69, 179, 76, 221, 176, 171, 58, 158, 151, 251, + 79, 189, 124, 159, 40, 189, 229, 126, 168, 24, 141, 209, 215, 105, 170, + 166, 181, 113, 36, 4, 172, 90, 123, 232, 154, 150, 224, 87, 249, 134, + 136, 14, 28, 23, 67, 78, 187, 209, 55, 157, 95, 36, 136, 83, 103, + 54, 236, 62, 81, 66, 44, 85, 120, 219, 178, 62, 126, 203, 193, 229, + 146, 25, 187, 254, 141, 147, 185, 158, 103, 216, 216, 38, 34, 245, 43, + 169, 200, 129, 130, 7, 239, 207, 155, 250, 89, 209, 238, 20, 74, 133, + 100, 67, 149, 41, 187, 72, 9, 135, 165, 140, 14, 90, 51, 241, 216, + 7, 176, 238, 254, 84, 53, 231, 87, 12, 51, 222, 54, 70, 163, 101, + 130, 63, 37, 120, 180, 219, 161, 69, 213, 233, 130, 199, 124, 2, 36, + 224, 140, 95, 201, 23, 72, 219, 222, 181, 237, 134, 11, 103, 94, 246, + 251, 215, 218, 228, 90, 36, 54, 237, 49, 204, 13, 194, 221, 18, 186, + 35, 144, 179, 2, 98, 90, 110, 165, 66, 38, 152, 206, 0, 121, 90, + 25, 94, 145, 133, 58, 143, 138, 175, 80, 233, 110, 78, 84, 0, 207, + 87, 78, 27, 243, 160, 231, 241, 83, 173, 163, 191, 205, 184, 216, 232, + 36, 194, 52, 5, 72, 249, 42, 103, 254, 213, 41, 159, 209, 56, 222, + 40, 224, 177, 195, 214, 11, 84, 221, 245, 137, 131, 23, 220, 251, 167, + 17, 34, 214, 41, 102, 226, 223, 79, 53, 119, 84, 17, 219, 19, 80, + 90, 132, 19, 176, 73, 145, 38, 28, 198, 176, 141, 92, 242, 69, 174, + 63, 244, 44, 152, 102, 120, 151, 167, 115, 67, 110, 119, 159, 56, 63, + 29, 70, 253, 118, 119, 220, 181, 71, 193, 167, 77, 178, 236, 187, 193, + 236, 147, 231, 209, 56, 168, 202, 7, 198, 208, 17, 20, 31, 42, 70, + 237, 148, 162, 161, 128, 135, 88, 37, 219, 56, 83, 248, 116, 20, 44, + 17, 231, 156, 187, 251, 237, 165, 123, 165, 181, 166, 212, 99, 132, 26, + 122, 240, 223, 130, 235, 248, 239, 11, 161, 32, 109, 210, 97, 173, 12, + 251, 94, 118, 7, 107, 206, 105, 158, 16, 4, 245, 159, 67, 150, 226, + 53, 42, 241, 249, 146, 107, 111, 75, 147, 136, 141, 97, 49, 101, 233, + 168, 197, 72, 95, 138, 162, 103, 154, 162, 192, 78, 41, 102, 52, 207, + 165, 48, 93, 41, 104, 136, 91, 169, 167, 51, 217, 197, 25, 238, 3, + 4, 35, 64, 146, 153, 32, 107, 66, 225, 249, 148, 225, 130, 197, 194, + 34, 100, 235, 200, 204, 39, 230, 37, 103, 219, 139, 8, 232, 63, 95, + 154, 76, 195, 226, 187, 206, 116, 21, 40, 98, 177, 244, 9, 114, 148, + 22, 185, 243, 93, 8, 84, 137, 114, 217, 240, 69, 185, 123, 1, 225, + 160, 221, 183, 81, 159, 31, 66, 221, 201, 197, 113, 137, 181, 249, 211, + 211, 226, 62, 12, 116, 111, 130, 197, 99, 85, 29, 191, 94, 14, 166, + 137, 147, 14, 133, 58, 230, 148, 144, 87, 48, 117, 252, 64, 114, 18, + 185, 63, 164, 159, 26, 79, 188, 242, 126, 223, 213, 245, 195, 144, 19, + 68, 175, 73, 15, 90, 45, 245, 111, 212, 15, 108, 108, 199, 180, 231, + 92, 251, 69, 251, 100, 179, 160, 125, 250, 42, 79, 118, 101, 195, 108, + 15, 243, 124, 76, 248, 137, 80, 49, 16, 233, 89, 247, 188, 102, 212, + 82, 111, 184, 67, 70, 110, 79, 241, 15, 157, 225, 66, 87, 81, 35, + 200, 210, 21, 243, 196, 86, 48, 46, 152, 150, 236, 76, 45, 178, 131, + 90, 85, 147, 107, 25, 194, 182, 106, 191, 161, 71, 94, 211, 172, 93, + 128, 17, 188, 240, 127, 4, 18, 124, 199, 122, 163, 140, 228, 91, 163, + 59, 197, 191, 231, 162, 77, 248, 24, 168, 119, 182, 169, 140, 55, 207, + 105, 70, 81, 32, 79, 212, 1, 59, 11, 55, 145, 61, 90, 134, 202, + 49, 105, 117, 158, 91, 86, 139, 55, 90, 171, 167, 237, 141, 1, 184, + 49, 63, 7, 226, 53, 153, 200, 188, 224, 234, 104, 101, 118, 238, 93, + 34, 252, 120, 251, 177, 103, 213, 173, 184, 231, 225, 111, 186, 210, 40, + 111, 65, 4, 60, 124, 221, 67, 201, 210, 65, 90, 74, 36, 39, 88, + 233, 64, 172, 179, 18, 59, 182, 82, 152, 192, 154, 220, 209, 184, 218, + 210, 172, 250, 155, 199, 175, 246, 218, 45, 211, 204, 131, 204, 73, 107, + 246, 52, 133, 102, 103, 135, 5, 46, 175, 63, 204, 92, 108, 126, 126, + 194, 208, 178, 166, 198, 191, 240, 128, 5, 203, 189, 102, 148, 65, 29, + 146, 2, 24, 21, 201, 147, 145, 248, 85, 77, 63, 245, 176, 199, 198, + 237, 34, 101, 159, 144, 166, 29, 102, 175, 121, 78, 75, 196, 204, 80, + 156, 236, 198, 232, 117, 112, 135, 61, 63, 63, 82, 2, 65, 139, 70, + 69, 78, 64, 48, 154, 15, 250, 79, 190, 251, 94, 205, 252, 236, 241, + 2, 171, 232, 118, 128, 71, 18, 55, 49, 13, 27, 36, 149, 220, 149, + 150, 55, 200, 192, 151, 47, 218, 134, 205, 93, 7, 206, 44, 229, 208, + 62, 208, 55, 55, 239, 63, 45, 154, 171, 70, 223, 144, 78, 251, 5, + 138, 224, 21, 184, 87, 55, 69, 224, 231, 37, 65, 87, 114, 78, 216, + 41, 49, 143, 233, 182, 214, 84, 20, 20, 156, 17, 12, 173, 172, 80, + 151, 37, 28, 191, 69, 146, 102, 65, 15, 152, 143, 198, 45, 204, 4, + 140, 90, 149, 45, 157, 190, 119, 196, 121, 199, 176, 122, 198, 141, 161, + 31, 24, 149, 96, 231, 70, 122, 160, 19, 100, 75, 112, 141, 18, 175, + 109, 98, 19, 110, 237, 1, 5, 171, 153, 19, 251, 61, 180, 249, 9, + 187, 196, 248, 127, 13, 21, 244, 224, 42, 97, 40, 236, 190, 18, 123, + 133, 26, 235, 9, 150, 90, 21, 189, 189, 101, 226, 190, 82, 18, 45, + 3, 172, 187, 72, 74, 244, 211, 76, 2, 70, 168, 41, 195, 165, 178, + 139, 5, 155, 100, 199, 0, 227, 72, 247, 186, 33, 169, 34, 104, 196, + 3, 253, 202, 19, 140, 100, 122, 144, 125, 201, 202, 194, 245, 180, 27, + 10, 207, 180, 31, 25, 152, 243, 143, 51, 90, 33, 74, 147, 127, 66, + 47, 10, 65, 99, 71, 243, 241, 221, 219, 32, 213, 98, 67, 119, 130, + 254, 11, 149, 64, 73, 168, 73, 237, 110, 18, 243, 21, 177, 53, 109, + 2, 242, 89, 136, 34, 36, 135, 12, 12, 125, 251, 104, 137, 128, 152, + 41, 70, 163, 184, 237, 137, 249, 63, 56, 133, 39, 0, 243, 248, 80, + 184, 48, 238, 155, 193, 21, 137, 95, 144, 146, 209, 151, 197, 199, 122, + 60, 48, 250, 1, 79, 162, 58, 78, 225, 184, 199, 35, 186, 225, 19, + 68, 31, 199, 150, 85, 197, 76, 246, 150, 47, 63, 55, 196, 200, 10, + 163, 170, 246, 34, 196, 87, 0, 45, 18, 6, 168, 248, 130, 184, 5, + 197, 97, 56, 128, 254, 236, 32, 10, 182, 198, 139, 255, 43, 41, 159, + 119, 253, 81, 248, 251, 253, 184, 98, 229, 6, 8, 64, 48, 190, 105, + 125, 168, 191, 43, 93, 156, 39, 244, 220, 138, 197, 117, 27, 152, 145, + 254, 233, 211, 33, 234, 5, 72, 247, 49, 221, 35, 188, 210, 20, 231, + 90, 255, 37, 30, 126, 209, 65, 137, 123, 126, 191, 158, 227, 201, 129, + 19, 164, 51, 232, 188, 185, 96, 67, 24, 190, 56, 16, 229, 34, 219, + 150, 137, 226, 59, 58, 3, 147, 232, 35, 99, 207, 101, 173, 217, 18, + 139, 1, 94, 123, 4, 232, 147, 243, 13, 193, 193, 187, 232, 100, 187, + 119, 105, 72, 86, 30, 165, 20, 192, 19, 157, 67, 253, 204, 246, 133, + 85, 252, 109, 169, 106, 203, 83, 72, 51, 217, 172, 7, 212, 104, 170, + 166, 21, 181, 11, 14, 145, 33, 175, 235, 169, 66, 203, 78, 108, 209, + 100, 131, 93, 192, 70, 157, 186, 224, 174, 173, 22, 167, 87, 244, 227, + 218, 96, 98, 186, 24, 205, 62, 66, 79, 198, 254, 160, 37, 127, 16, + 95, 171, 47, 34, 80, 43, 26, 111, 65, 207, 29, 139, 135, 69, 13, + 110, 133, 110, 65, 140, 61, 207, 117, 98, 106, 29, 166, 224, 78, 208, + 252, 194, 91, 4, 38, 0, 61, 133, 180, 168, 149, 211, 7, 80, 227, + 135, 51, 11, 249, 228, 26, 198, 244, 2, 47, 226, 93, 147, 222, 125, + 200, 205, 166, 154, 234, 80, 39, 70, 84, 98, 209, 1, 6, 219, 17, + 11, 253, 126, 145, 231, 131, 14, 163, 107, 200, 195, 167, 64, 6, 101, + 209, 255, 116, 179, 69, 164, 133, 23, 78, 98, 105, 182, 236, 34, 246, + 58, 81, 183, 100, 30, 44, 187, 164, 91, 239, 132, 51, 154, 9, 2, + 215, 186, 191, 79, 237, 179, 141, 169, 237, 206, 190, 201, 64, 223, 143, + 60, 173, 108, 96, 216, 183, 70, 110, 5, 59, 230, 206, 194, 40, 211, + 109, 146, 1, 102, 194, 212, 90, 214, 43, 111, 134, 122, 146, 9, 220, + 198, 72, 196, 68, 19, 214, 220, 11, 173, 243, 15, 254, 158, 193, 211, + 191, 55, 163, 212, 18, 20, 42, 199, 191, 74, 238, 191, 113, 173, 125, + 203, 48, 1, 119, 32, 224, 8, 178, 179, 0, 67, 153, 62, 227, 25, + 254, 126, 23, 87, 67, 43, 45, 250, 42, 214, 118, 179, 111, 189, 103, + 133, 35, 196, 54, 23, 203, 218, 59, 177, 194, 55, 210, 153, 78, 207, + 145, 157, 229, 119, 218, 173, 20, 104, 251, 48, 204, 245, 166, 251, 123, + 82, 175, 239, 215, 158, 200, 1, 174, 40, 200, 32, 108, 184, 0, 137, + 90, 81, 159, 128, 165, 10, 233, 210, 52, 48, 74, 164, 246, 199, 240, + 154, 12, 254, 70, 37, 106, 44, 85, 123, 151, 119, 153, 170, 48, 144, + 241, 114, 64, 115, 120, 159, 13, 49, 211, 182, 99, 124, 25, 70, 73, + 196, 179, 201, 219, 124, 22, 137, 229, 160, 155, 10, 158, 234, 132, 203, + 208, 76, 81, 98, 30, 142, 154, 68, 158, 92, 107, 252, 4, 22, 218, + 2, 167, 190, 152, 141, 251, 137, 236, 87, 186, 235, 90, 0, 132, 68, + 232, 66, 63, 0, 41, 235, 157, 45, 68, 194, 45, 18, 249, 254, 60, + 33, 10, 86, 183, 45, 5, 253, 253, 212, 44, 94, 203, 41, 53, 146, + 101, 148, 123, 198, 92, 14, 181, 87, 49, 229, 177, 249, 216, 8, 12, + 37, 108, 220, 236, 13, 72, 122, 48, 235, 219, 74, 220, 187, 130, 66, + 249, 41, 184, 140, 101, 1, 203, 110, 22, 62, 23, 118, 199, 32, 191, + 162, 140, 187, 157, 80, 144, 59, 112, 238, 32, 101, 238, 47, 225, 69, + 99, 178, 246, 49, 76, 81, 101, 187, 71, 59, 140, 229, 81, 253, 42, + 204, 158, 74, 184, 237, 197, 14, 91, 81, 34, 115, 123, 224, 167, 15, + 112, 84, 225, 104, 103, 208, 236, 183, 185, 142, 175, 147, 237, 188, 159, + 125, 142, 253, 121, 87, 239, 78, 57, 179, 13, 123, 74, 148, 197, 74, + 227, 110, 48, 248, 165, 248, 249, 43, 249, 0, 69, 7, 183, 68, 167, + 181, 39, 54, 144, 39, 212, 36, 40, 171, 48, 106, 76, 50, 201, 111, + 254, 86, 240, 39, 14, 59, 58, 110, 54, 155, 2, 6, 205, 190, 237, + 126, 58, 204, 112, 159, 145, 188, 208, 196, 197, 52, 54, 94, 84, 127, + 46, 56, 93, 152, 190, 133, 120, 166, 75, 52, 6, 112, 112, 71, 119, + 143, 218, 19, 242, 174, 48, 246, 29, 243, 137, 94, 127, 95, 76, 49, + 20, 149, 159, 251, 59, 146, 102, 242, 222, 157, 162, 124, 154, 25, 47, + 246, 135, 38, 177, 165, 246, 224, 202, 4, 177, 255, 203, 245, 58, 172, + 164, 33, 155, 179, 56, 41, 202, 39, 145, 176, 130, 171, 30, 77, 177, + 64, 203, 70, 230, 242, 240, 118, 145, 30, 89, 184, 11, 123, 157, 212, + 156, 28, 5, 200, 96, 157, 102, 126, 212, 149, 137, 144, 169, 39, 211, + 159, 193, 254, 65, 201, 154, 165, 37, 129, 14, 242, 28, 37, 17, 130, + 202, 227, 241, 49, 191, 213, 179, 72, 243, 118, 52, 133, 149, 8, 156, + 231, 94, 215, 15, 21, 118, 194, 254, 107, 249, 40, 153, 69, 95, 141, + 97, 37, 224, 82, 146, 71, 35, 26, 88, 127, 137, 247, 242, 243, 135, + 113, 189, 155, 56, 98, 99, 90, 108, 186, 118, 178, 253, 50, 44, 30, + 43, 223, 171, 186, 44, 120, 215, 128, 45, 65, 178, 142, 159, 39, 70, + 37, 168, 62, 127, 219, 111, 40, 239, 134, 47, 114, 69, 45, 87, 15, + 234, 100, 9, 90, 220, 203, 241, 40, 150, 239, 164, 39, 164, 196, 117, + 156, 132, 143, 87, 146, 190, 130, 168, 244, 193, 101, 110, 158, 231, 57, + 146, 235, 227, 8, 12, 208, 209, 203, 35, 38, 242, 45, 43, 118, 252, + 201, 244, 130, 42, 18, 133, 66, 129, 209, 77, 208, 69, 236, 138, 254, + 255, 245, 112, 236, 86, 171, 1, 111, 107, 69, 213, 222, 232, 199, 49, + 193, 174, 198, 100, 170, 183, 150, 10, 233, 28, 210, 219, 123, 233, 126, + 105, 75, 222, 231, 13, 137, 242, 177, 41, 137, 60, 202, 92, 16, 131, + 226, 193, 152, 79, 95, 235, 105, 227, 172, 7, 160, 180, 146, 190, 243, + 34, 19, 186, 215, 106, 95, 152, 49, 90, 68, 71, 90, 222, 240, 72, + 16, 153, 69, 114, 193, 215, 175, 165, 224, 198, 154, 70, 104, 79, 97, + 153, 54, 153, 179, 2, 207, 197, 243, 12, 159, 76, 168, 136, 217, 116, + 79, 104, 21, 215, 72, 199, 35, 153, 67, 50, 145, 11, 253, 62, 254, + 121, 1, 8, 147, 39, 20, 94, 155, 80, 41, 135, 135, 45, 85, 61, + 140, 26, 195, 80, 187, 252, 175, 253, 152, 170, 169, 118, 235, 158, 134, + 82, 188, 86, 52, 70, 32, 239, 212, 157, 115, 137, 28, 191, 156, 197, + 136, 226, 171, 17, 231, 181, 79, 246, 232, 178, 242, 233, 113, 210, 230, + 35, 201, 213, 28, 72, 27, 183, 26, 106, 240, 111, 111, 255, 122, 128, + 234, 179, 201, 66, 165, 245, 198, 201, 138, 20, 212, 139, 159, 200, 91, + 150, 175, 209, 203, 255, 81, 30, 27, 83, 216, 119, 36, 48, 112, 237, + 229, 175, 204, 149, 192, 183, 184, 165, 176, 231, 176, 223, 81, 214, 225, + 145, 107, 248, 225, 213, 6, 99, 59, 197, 183, 125, 208, 26, 19, 178, + 146, 154, 242, 71, 189, 11, 246, 48, 8, 7, 28, 105, 208, 20, 13, + 236, 77, 244, 218, 101, 217, 125, 199, 153, 77, 193, 214, 233, 91, 48, + 201, 209, 6, 155, 87, 208, 221, 9, 73, 76, 191, 23, 249, 237, 146, + 189, 177, 55, 8, 68, 192, 111, 204, 19, 164, 189, 223, 83, 220, 156, + 79, 12, 82, 178, 149, 102, 94, 120, 229, 198, 77, 136, 244, 84, 33, + 90, 66, 193, 45, 252, 160, 151, 66, 240, 135, 232, 147, 235, 107, 173, + 30, 184, 103, 131, 168, 55, 195, 111, 16, 202, 227, 203, 16, 14, 226, + 104, 220, 126, 121, 163, 5, 26, 253, 35, 196, 13, 90, 196, 32, 157, + 28, 152, 70, 205, 236, 101, 142, 207, 126, 230, 67, 194, 143, 67, 77, + 91, 97, 71, 135, 244, 40, 104, 120, 39, 169, 91, 124, 162, 111, 121, + 9, 118, 146, 215, 112, 120, 157, 22, 198, 241, 196, 32, 176, 60, 244, + 197, 37, 210, 215, 125, 122, 143, 253, 175, 101, 92, 205, 43, 170, 70, + 183, 173, 162, 130, 226, 41, 122, 158, 130, 183, 223, 162, 212, 194, 38, + 133, 252, 57, 245, 187, 168, 165, 204, 119, 8, 249, 174, 10, 206, 251, + 55, 212, 118, 212, 74, 226, 227, 141, 138, 122, 204, 83, 14, 175, 248, + 18, 159, 79, 79, 100, 56, 37, 229, 209, 221, 238, 197, 164, 42, 159, + 203, 67, 31, 8, 195, 72, 251, 142, 229, 60, 24, 254, 97, 124, 219, + 201, 255, 232, 60, 77, 19, 220, 239, 10, 158, 62, 117, 245, 167, 63, + 38, 216, 169, 209, 29, 245, 17, 4, 241, 218, 83, 72, 48, 214, 228, + 85, 103, 116, 248, 133, 200, 75, 81, 220, 207, 59, 226, 102, 50, 238, + 138, 44, 120, 162, 220, 105, 5, 120, 11, 153, 98, 144, 4, 197, 217, + 39, 235, 141, 148, 123, 51, 213, 255, 144, 17, 189, 144, 214, 246, 45, + 95, 229, 127, 107, 19, 164, 143, 48, 210, 29, 249, 66, 11, 171, 191, + 73, 99, 161, 114, 190, 80, 31, 215, 67, 16, 187, 246, 47, 110, 157, + 33, 208, 151, 122, 2, 228, 161, 51, 9, 215, 33, 246, 67, 44, 19, + 41, 29, 10, 42, 130, 244, 95, 45, 199, 156, 251, 151, 210, 121, 198, + 52, 44, 87, 214, 126, 214, 93, 242, 201, 31, 44, 250, 139, 78, 59, + 95, 116, 45, 100, 187, 97, 206, 143, 158, 54, 98, 113, 30, 101, 151, + 56, 187, 116, 199, 157, 108, 136, 90, 36, 85, 253, 171, 140, 253, 14, + 229, 238, 65, 220, 56, 162, 194, 138, 46, 251, 90, 92, 121, 202, 202, + 98, 133, 78, 229, 87, 31, 158, 12, 175, 122, 17, 65, 10, 163, 51, + 163, 95, 143, 208, 9, 192, 58, 29, 130, 4, 237, 194, 246, 82, 11, + 20, 49, 26, 177, 34, 202, 180, 210, 111, 234, 151, 37, 27, 225, 7, + 205, 35, 242, 176, 98, 232, 60, 89, 99, 33, 233, 106, 236, 96, 248, + 71, 101, 133, 44, 190, 241, 76, 113, 146, 181, 106, 191, 130, 100, 127, + 206, 138, 118, 124, 159, 138, 215, 82, 22, 224, 17, 114, 127, 109, 203, + 60, 33, 67, 126, 145, 25, 199, 88, 97, 150, 40, 68, 185, 144, 218, + 230, 81, 203, 223, 45, 209, 250, 22, 234, 12, 153, 49, 19, 107, 97, + 79, 126, 100, 128, 16, 12, 83, 74, 94, 23, 159, 192, 193, 74, 153, + 246, 12, 157, 248, 106, 34, 35, 64, 99, 184, 137, 91, 26, 154, 127, + 155, 218, 36, 185, 64, 26, 41, 236, 232, 223, 159, 10, 29, 165, 12, + 244, 214, 231, 231, 212, 154, 169, 66, 39, 153, 129, 38, 40, 46, 140, + 140, 172, 0, 251, 41, 244, 153, 56, 180, 67, 22, 40, 33, 9, 111, + 79, 11, 215, 49, 66, 195, 45, 113, 22, 41, 109, 39, 124, 178, 49, + 173, 25, 245, 157, 190, 63, 116, 79, 213, 200, 171, 85, 121, 185, 198, + 99, 92, 235, 127, 157, 18, 45, 201, 187, 193, 140, 79, 33, 65, 24, + 11, 175, 105, 233, 47, 242, 36, 139, 254, 195, 48, 31, 146, 32, 0, + 150, 237, 52, 165, 4, 174, 230, 81, 72, 146, 101, 241, 206, 146, 151, + 105, 106, 255, 165, 127, 196, 69, 250, 155, 248, 177, 254, 232, 30, 109, + 169, 33, 76, 112, 72, 214, 254, 113, 170, 234, 191, 76, 20, 132, 209, + 243, 152, 241, 107, 12, 107, 31, 16, 149, 129, 8, 160, 7, 54, 31, + 219, 58, 93, 76, 50, 143, 210, 73, 131, 59, 34, 38, 88, 9, 217, + 193, 206, 147, 54, 244, 11, 240, 180, 243, 123, 68, 124, 81, 153, 132, + 49, 38, 33, 220, 125, 164, 236, 162, 128, 202, 246, 183, 178, 35, 242, + 109, 76, 7, 215, 92, 149, 32, 117, 34, 174, 122, 34, 101, 5, 67, + 79, 24, 48, 75, 194, 8, 12, 98, 113, 36, 13, 79, 16, 94, 249, + 110, 147, 212, 105, 205, 39, 31, 127, 182, 213, 97, 28, 226, 105, 217, + 245, 84, 138, 119, 58, 136, 137, 79, 193, 116, 226, 72, 101, 0, 142, + 171, 59, 40, 203, 158, 100, 187, 137, 8, 9, 125, 233, 16, 241, 192, + 135, 4, 72, 132, 89, 126, 34, 0, 197, 80, 159, 101, 77, 18, 52, + 179, 249, 169, 95, 125, 120, 18, 56, 177, 106, 6, 100, 99, 197, 197, + 111, 104, 120, 211, 163, 86, 224, 106, 157, 48, 112, 84, 232, 171, 172, + 220, 107, 136, 118, 170, 105, 16, 133, 223, 77, 65, 61, 41, 184, 88, + 67, 98, 175, 216, 139, 56, 140, 26, 18, 179, 212, 180, 218, 235, 78, + 180, 154, 144, 195, 188, 126, 205, 37, 58, 203, 223, 248, 156, 87, 139, + 176, 77, 244, 117, 77, 148, 85, 187, 142, 119, 144, 113, 128, 217, 33, + 5, 107, 247, 10, 178, 66, 206, 128, 187, 155, 161, 150, 166, 9, 194, + 18, 87, 82, 5, 42, 74, 250, 215, 83, 145, 8, 158, 182, 156, 82, + 161, 19, 87, 92, 77, 14, 7, 208, 23, 8, 13, 59, 57, 167, 252, + 236, 167, 68, 206, 208, 173, 237, 84, 141, 14, 118, 250, 194, 37, 131, + 146, 23, 17, 37, 228, 42, 134, 130, 193, 34, 83, 151, 107, 227, 133, + 189, 157, 96, 73, 176, 115, 205, 111, 159, 89, 182, 43, 180, 27, 36, + 57, 30, 151, 83, 181, 2, 2, 53, 17, 231, 175, 92, 52, 97, 124, + 25, 172, 17, 206, 83, 37, 79, 60, 174, 47, 181, 207, 115, 216, 0, + 59, 178, 186, 222, 154, 48, 10, 203, 237, 168, 102, 67, 97, 12, 80, + 164, 196, 36, 102, 249, 198, 223, 40, 139, 247, 238, 100, 167, 179, 209, + 170, 131, 198, 166, 105, 139, 118, 164, 153, 86, 75, 187, 187, 197, 160, + 68, 198, 18, 67, 72, 85, 158, 8, 198, 13, 38, 133, 227, 47, 6, + 64, 250, 136, 178, 128, 108, 116, 81, 186, 206, 233, 159, 179, 60, 114, + 136, 222, 26, 198, 221, 9, 223, 32, 123, 35, 23, 188, 146, 155, 213, + 76, 159, 32, 252, 211, 185, 1, 157, 178, 135, 227, 248, 103, 157, 213, + 189, 148, 107, 135, 236, 254, 236, 112, 211, 216, 133, 146, 65, 193, 156, + 12, 68, 129, 130, 145, 203, 140, 174, 99, 164, 145, 36, 252, 41, 175, + 206, 147, 115, 196, 4, 174, 108, 17, 122, 230, 134, 147, 226, 163, 123, + 125, 195, 16, 122, 59, 157, 243, 224, 222, 35, 75, 158, 165, 183, 96, + 220, 251, 154, 155, 140, 144, 238, 87, 118, 32, 40, 120, 50, 237, 231, + 139, 167, 105, 32, 225, 232, 86, 220, 154, 75, 196, 71, 65, 93, 220, + 61, 119, 51, 177, 246, 221, 145, 96, 123, 19, 25, 236, 101, 58, 161, + 73, 84, 176, 133, 105, 196, 134, 172, 27, 162, 226, 224, 55, 16, 137, + 168, 193, 190, 36, 174, 21, 216, 214, 118, 104, 129, 255, 68, 151, 108, + 167, 109, 82, 66, 183, 246, 156, 70, 234, 152, 129, 21, 156, 244, 102, + 179, 68, 253, 171, 86, 189, 188, 191, 254, 81, 210, 173, 115, 204, 35, + 164, 144, 108, 236, 225, 100, 49, 60, 210, 38, 90, 187, 49, 180, 192, + 94, 27, 241, 255, 99, 158, 7, 237, 83, 24, 236, 15, 188, 123, 165, + 197, 98, 230, 62, 46, 224, 117, 139, 102, 180, 131, 227, 218, 54, 126, + 52, 152, 148, 252, 217, 93, 32, 154, 96, 161, 242, 40, 170, 26, 56, + 74, 254, 10, 15, 19, 201, 213, 81, 46, 158, 233, 148, 163, 223, 116, + 67, 170, 168, 17, 52, 115, 222, 60, 24, 251, 6, 74, 89, 86, 242, + 245, 45, 128, 182, 3, 195, 154, 20, 179, 113, 153, 44, 242, 180, 83, + 26, 92, 220, 87, 99, 40, 234, 36, 47, 104, 5, 216, 15, 75, 28, + 250, 13, 84, 199, 155, 151, 61, 58, 214, 142, 173, 215, 72, 185, 60, + 233, 73, 102, 177, 181, 170, 7, 48, 166, 110, 32, 227, 24, 254, 43, + 157, 97, 119, 1, 125, 154, 244, 80, 196, 119, 70, 137, 163, 29, 157, + 21, 96, 40, 77, 149, 43, 89, 115, 78, 66, 67, 78, 130, 122, 141, + 108, 245, 94, 13, 91, 233, 28, 99, 104, 150, 29, 104, 122, 221, 186, + 150, 126, 164, 59, 147, 132, 74, 1, 84, 129, 134, 199, 184, 19, 164, + 172, 218, 226, 69, 96, 187, 3, 219, 55, 20, 36, 43, 220, 131, 166, + 139, 173, 189, 7, 95, 213, 220, 66, 112, 32, 44, 231, 163, 42, 23, + 106, 253, 98, 142, 233, 108, 164, 242, 111, 223, 130, 113, 101, 180, 103, + 69, 79, 3, 212, 134, 113, 14, 252, 41, 247, 87, 188, 147, 176, 171, + 218, 249, 176, 197, 157, 118, 13, 73, 246, 206, 106, 50, 120, 17, 148, + 147, 164, 185, 70, 144, 158, 116, 214, 92, 246, 184, 68, 85, 100, 240, + 154, 2, 156, 164, 212, 110, 241, 153, 129, 7, 222, 203, 157, 48, 94, + 103, 89, 110, 197, 102, 10, 76, 234, 22, 12, 104, 202, 167, 57, 56, + 178, 52, 73, 40, 212, 95, 196, 212, 166, 85, 15, 41, 81, 141, 124, + 130, 100, 79, 100, 175, 126, 225, 151, 102, 116, 43, 17, 190, 116, 116, + 79, 51, 59, 243, 149, 11, 121, 3, 234, 103, 221, 234, 201, 245, 5, + 11, 20, 29, 181, 138, 67, 190, 119, 205, 66, 225, 155, 66, 14, 205, + 68, 114, 207, 7, 180, 117, 185, 176, 204, 9, 9, 126, 205, 58, 142, + 28, 136, 232, 53, 149, 237, 169, 44, 185, 78, 143, 99, 153, 143, 187, + 157, 87, 106, 201, 63, 2, 205, 96, 226, 4, 28, 208, 81, 197, 98, + 126, 168, 170, 63, 29, 15, 228, 23, 82, 12, 109, 204, 227, 231, 228, + 87, 196, 63, 117, 68, 31, 206, 19, 177, 225, 66, 233, 244, 58, 185, + 208, 188, 153, 253, 0, 60, 122, 11, 36, 193, 235, 90, 21, 89, 103, + 232, 187, 68, 214, 232, 180, 13, 143, 157, 99, 180, 232, 213, 90, 113, + 194, 193, 194, 230, 242, 45, 135, 51, 201, 80, 171, 128, 144, 150, 184, + 193, 211, 22, 74, 186, 176, 237, 133, 181, 83, 216, 250, 76, 28, 144, + 255, 76, 29, 64, 27, 25, 54, 88, 161, 132, 38, 34, 236, 32, 77, + 106, 157, 6, 74, 120, 64, 211, 237, 173, 164, 29, 22, 107, 236, 9, + 67, 136, 70, 87, 153, 52, 245, 162, 52, 213, 109, 66, 123, 116, 19, + 54, 210, 216, 16, 72, 192, 249, 183, 108, 193, 60, 242, 120, 186, 160, + 200, 137, 184, 180, 97, 15, 95, 167, 169, 87, 146, 151, 83, 244, 178, + 11, 114, 231, 59, 246, 175, 29, 229, 95, 166, 199, 244, 74, 6, 79, + 7, 15, 150, 53, 55, 148, 10, 214, 117, 214, 214, 18, 111, 23, 77, + 192, 122, 193, 255, 196, 114, 120, 89, 233, 200, 20, 133, 140, 132, 162, + 136, 45, 10, 216, 110, 169, 138, 221, 15, 114, 80, 66, 207, 159, 89, + 31, 183, 6, 112, 209, 114, 85, 57, 171, 99, 14, 83, 218, 19, 240, + 133, 147, 208, 50, 112, 209, 213, 114, 113, 128, 67, 115, 171, 57, 184, + 202, 111, 119, 128, 8, 204, 133, 137, 179, 216, 142, 74, 57, 86, 75, + 192, 237, 228, 108, 69, 105, 193, 141, 250, 76, 204, 128, 155, 26, 66, + 172, 237, 250, 179, 186, 199, 211, 152, 65, 6, 152, 201, 105, 251, 78, + 186, 157, 66, 69, 101, 190, 17, 230, 96, 168, 156, 29, 7, 59, 250, + 141, 145, 141, 234, 100, 149, 39, 172, 205, 57, 39, 61, 6, 218, 254, + 181, 184, 94, 155, 251, 236, 8, 17, 252, 132, 153, 56, 164, 230, 249, + 203, 60, 78, 227, 136, 118, 97, 69, 247, 170, 83, 230, 125, 104, 85, + 239, 19, 220, 15, 148, 251, 249, 196, 138, 38, 81, 209, 15, 231, 239, + 183, 73, 121, 87, 157, 191, 171, 0, 99, 100, 105, 105, 223, 226, 113, + 198, 179, 200, 75, 136, 55, 190, 194, 166, 94, 142, 224, 39, 193, 163, + 138, 3, 203, 220, 34, 118, 216, 34, 142, 111, 227, 241, 205, 154, 220, + 162, 107, 200, 100, 217, 194, 122, 207, 234, 161, 104, 119, 201, 84, 46, + 37, 159, 130, 76, 136, 147, 250, 29, 209, 151, 145, 92, 189, 105, 79, + 101, 117, 4, 209, 229, 171, 22, 168, 11, 210, 160, 120, 158, 218, 39, + 129, 95, 30, 254, 37, 160, 17, 226, 65, 38, 155, 129, 122, 222, 170, + 133, 113, 134, 168, 135, 212, 57, 200, 248, 226, 62, 62, 200, 159, 127, + 42, 51, 90, 49, 28, 134, 6, 226, 227, 159, 163, 142, 179, 173, 151, + 168, 47, 106, 150, 43, 205, 20, 245, 181, 82, 210, 73, 173, 93, 73, + 132, 69, 71, 195, 129, 214, 106, 151, 117, 135, 138, 224, 126, 167, 48, + 83, 34, 36, 200, 13, 29, 239, 80, 11, 224, 146, 30, 165, 79, 231, + 209, 119, 168, 138, 217, 100, 202, 154, 132, 206, 54, 71, 170, 74, 126, + 11, 105, 96, 94, 176, 133, 105, 167, 60, 81, 127, 80, 238, 86, 126, + 54, 147, 16, 117, 54, 230, 12, 76, 196, 8, 177, 11, 61, 177, 113, + 30, 40, 18, 26, 18, 55, 37, 74, 94, 243, 222, 250, 144, 1, 67, + 236, 61, 94, 204, 49, 44, 63, 128, 123, 253, 163, 36, 31, 168, 42, + 144, 198, 132, 53, 212, 183, 1, 234, 164, 254, 55, 113, 19, 28, 184, + 210, 113, 4, 95, 146, 92, 164, 152, 120, 176, 218, 237, 134, 193, 243, + 109, 2, 35, 253, 94, 25, 192, 246, 118, 186, 220, 218, 81, 217, 36, + 126, 215, 24, 86, 127, 114, 69, 176, 237, 20, 52, 239, 1, 82, 149, + 90, 227, 216, 108, 176, 100, 41, 68, 64, 97, 13, 13, 10, 132, 104, + 252, 194, 30, 134, 21, 234, 121, 133, 137, 238, 55, 1, 233, 41, 41, + 165, 24, 135, 243, 206, 15, 65, 184, 175, 222, 34, 216, 2, 143, 84, + 207, 136, 195, 96, 7, 114, 230, 244, 158, 69, 30, 62, 183, 157, 58, + 157, 248, 35, 163, 89, 27, 18, 44, 149, 74, 255, 140, 216, 203, 58, + 102, 75, 24, 123, 11, 79, 224, 186, 187, 55, 178, 22, 170, 74, 65, + 248, 185, 88, 174, 100, 179, 42, 147, 165, 94, 149, 106, 1, 14, 49, + 135, 110, 240, 201, 36, 145, 118, 151, 62, 220, 245, 246, 188, 254, 207, + 98, 231, 47, 67, 38, 225, 110, 86, 50, 168, 160, 3, 188, 233, 152, + 13, 199, 93, 171, 72, 152, 181, 223, 144, 105, 206, 64, 198, 51, 125, + 118, 168, 107, 110, 42, 87, 126, 137, 100, 52, 139, 187, 84, 78, 109, + 68, 157, 242, 105, 42, 192, 199, 227, 229, 167, 149, 115, 222, 117, 64, + 146, 168, 86, 69, 160, 37, 91, 184, 75, 172, 107, 178, 205, 113, 109, + 197, 143, 177, 69, 241, 131, 191, 103, 112, 145, 194, 234, 152, 191, 196, + 121, 189, 118, 85, 248, 218, 129, 113, 247, 58, 112, 168, 212, 15, 226, + 249, 121, 7, 193, 119, 219, 153, 152, 134, 87, 50, 53, 1, 122, 228, + 133, 70, 218, 235, 176, 226, 181, 228, 247, 171, 237, 208, 93, 219, 210, + 204, 99, 81, 35, 94, 213, 244, 214, 133, 87, 38, 157, 220, 76, 241, + 250, 9, 174, 94, 200, 220, 42, 33, 84, 33, 20, 6, 86, 165, 70, + 17, 23, 147, 58, 74, 222, 31, 41, 174, 132, 226, 158, 2, 97, 151, + 118, 118, 199, 237, 251, 181, 137, 122, 134, 180, 206, 25, 127, 6, 28, + 88, 227, 99, 230, 21, 51, 19, 201, 179, 147, 131, 49, 170, 49, 104, + 15, 138, 137, 169, 120, 94, 205, 80, 43, 230, 239, 124, 165, 225, 36, + 228, 209, 108, 204, 135, 125, 157, 94, 203, 116, 141, 29, 156, 97, 146, + 225, 80, 43, 254, 51, 120, 58, 221, 11, 176, 165, 179, 174, 53, 216, + 195, 110, 24, 177, 125, 101, 171, 86, 108, 182, 14, 91, 146, 246, 127, + 249, 192, 221, 143, 211, 90, 9, 12, 130, 246, 170, 107, 193, 134, 28, + 49, 35, 254, 131, 137, 125, 207, 196, 72, 80, 90, 30, 174, 143, 172, + 226, 50, 12, 236, 58, 235, 205, 251, 234, 171, 14, 201, 232, 131, 230, + 212, 162, 143, 189, 179, 44, 100, 224, 49, 15, 155, 170, 228, 158, 151, + 239, 19, 0, 232, 204, 216, 76, 21, 149, 130, 142, 63, 146, 152, 124, + 136, 129, 14, 182, 212, 29, 8, 244, 12, 36, 28, 134, 52, 216, 106, + 229, 107, 150, 8, 223, 247, 117, 229, 251, 216, 158, 228, 97, 240, 148, + 228, 49, 138, 80, 34, 204, 52, 237, 43, 105, 142, 231, 20, 32, 70, + 44, 180, 212, 121, 229, 177, 50, 152, 238, 72, 51, 116, 111, 18, 27, + 211, 40, 211, 97, 226, 18, 155, 21, 216, 166, 165, 37, 234, 56, 121, + 165, 159, 197, 87, 203, 146, 69, 137, 25, 148, 143, 246, 247, 131, 100, + 91, 45, 25, 127, 103, 35, 219, 32, 31, 237, 93, 92, 167, 194, 64, + 255, 188, 64, 139, 118, 135, 212, 56, 216, 167, 102, 36, 220, 109, 21, + 147, 92, 78, 8, 65, 213, 179, 11, 40, 227, 83, 207, 175, 56, 75, + 193, 105, 239, 145, 193, 107, 234, 101, 50, 97, 123, 246, 137, 30, 180, + 149, 18, 62, 162, 163, 16, 192, 79, 61, 222, 25, 35, 181, 13, 10, + 90, 25, 216, 76, 219, 117, 100, 244, 159, 172, 223, 106, 19, 1, 176, + 180, 154, 222, 182, 202, 241, 217, 150, 203, 244, 213, 94, 178, 158, 130, + 166, 105, 167, 118, 194, 153, 142, 60, 134, 216, 142, 216, 254, 2, 7, + 54, 26, 197, 25, 138, 74, 39, 101, 107, 168, 110, 24, 58, 191, 136, + 25, 40, 26, 79, 96, 4, 25, 32, 134, 180, 69, 19, 198, 208, 254, + 197, 133, 72, 242, 66, 107, 23, 157, 143, 117, 50, 224, 198, 246, 8, + 19, 49, 213, 159, 9, 201, 160, 158, 200, 59, 145, 119, 110, 58, 190, + 132, 168, 220, 64, 171, 103, 140, 202, 167, 130, 190, 195, 57, 194, 90, + 11, 214, 19, 53, 68, 88, 89, 14, 235, 20, 50, 249, 248, 100, 241, + 10, 149, 35, 93, 4, 84, 62, 75, 41, 223, 81, 56, 18, 14, 101, + 224, 40, 118, 53, 252, 72, 194, 185, 15, 235, 120, 170, 171, 237, 242, + 201, 96, 157, 93, 248, 227, 156, 239, 249, 190, 10, 177, 147, 77, 18, + 157, 53, 114, 233, 168, 14, 28, 80, 50, 89, 248, 127, 156, 98, 193, + 111, 202, 38, 248, 60, 243, 240, 198, 122, 227, 160, 117, 138, 247, 171, + 235, 47, 23, 245, 177, 12, 24, 213, 214, 117, 210, 86, 85, 55, 153, + 25, 16, 53, 195, 81, 247, 217, 104, 109, 170, 63, 79, 169, 38, 150, + 42, 167, 206, 230, 51, 109, 62, 202, 205, 164, 28, 240, 90, 82, 119, + 57, 222, 95, 195, 106, 193, 197, 180, 73, 24, 108, 143, 114, 54, 29, + 100, 255, 124, 30, 143, 120, 147, 84, 110, 157, 53, 226, 104, 117, 65, + 60, 187, 173, 94, 59, 132, 121, 145, 188, 220, 105, 4, 48, 89, 130, + 82, 236, 212, 138, 179, 197, 182, 115, 6, 83, 196, 132, 184, 148, 183, + 101, 141, 92, 84, 153, 147, 133, 212, 8, 250, 226, 167, 209, 22, 95, + 44, 103, 243, 27, 111, 105, 128, 110, 88, 110, 190, 229, 81, 26, 219, + 229, 83, 247, 16, 17, 158, 228, 197, 32, 193, 223, 184, 178, 89, 21, + 43, 254, 124, 144, 200, 131, 138, 5, 107, 98, 139, 16, 184, 127, 244, + 51, 141, 88, 178, 132, 205, 239, 123, 14, 34, 2, 244, 238, 154, 230, + 146, 87, 15, 20, 164, 174, 159, 28, 211, 81, 230, 227, 158, 16, 168, + 8, 18, 105, 177, 68, 50, 127, 64, 73, 123, 233, 44, 34, 159, 133, + 66, 100, 163, 184, 244, 171, 240, 235, 230, 160, 137, 131, 200, 230, 189, + 136, 137, 240, 110, 253, 0, 250, 52, 126, 123, 209, 83, 189, 61, 243, + 153, 60, 36, 157, 156, 141, 175, 212, 219, 217, 33, 144, 133, 126, 7, + 41, 228, 77, 247, 47, 162, 47, 3, 157, 32, 219, 149, 138, 51, 181, + 65, 242, 51, 76, 185, 51, 5, 188, 216, 33, 31, 179, 247, 93, 55, + 241, 103, 253, 14, 6, 32, 17, 137, 194, 126, 235, 132, 115, 93, 167, + 187, 190, 147, 190, 255, 120, 166, 38, 118, 241, 129, 163, 37, 39, 155, + 142, 37, 147, 134, 221, 136, 99, 114, 152, 250, 143, 53, 104, 103, 7, + 37, 178, 195, 124, 200, 196, 34, 8, 247, 255, 156, 141, 29, 202, 239, + 70, 189, 144, 0, 167, 182, 105, 57, 205, 218, 54, 151, 29, 7, 76, + 7, 84, 20, 246, 185, 216, 93, 21, 96, 25, 115, 176, 38, 180, 177, + 224, 112, 104, 92, 17, 152, 55, 211, 21, 210, 98, 249, 201, 21, 85, + 84, 185, 53, 59, 147, 198, 1, 251, 185, 235, 132, 73, 67, 194, 220, + 120, 191, 206, 73, 53, 158, 237, 102, 41, 23, 133, 14, 81, 47, 204, + 9, 142, 124, 180, 115, 236, 180, 190, 218, 68, 92, 113, 54, 250, 174, + 99, 126, 1, 186, 88, 231, 96, 51, 147, 236, 164, 135, 210, 75, 242, + 196, 53, 104, 101, 233, 0, 129, 173, 53, 118, 42, 188, 139, 187, 251, + 143, 37, 222, 198, 168, 194, 103, 107, 56, 240, 213, 98, 0, 65, 112, + 187, 230, 203, 207, 104, 124, 78, 130, 66, 156, 214, 95, 22, 46, 181, + 254, 15, 201, 138, 160, 138, 171, 202, 3, 169, 187, 110, 58, 43, 218, + 62, 112, 49, 206, 186, 161, 31, 140, 183, 84, 143, 250, 217, 123, 9, + 210, 87, 1, 208, 77, 143, 33, 6, 237, 173, 108, 187, 137, 131, 148, + 145, 22, 123, 142, 146, 156, 223, 61, 124, 151, 57, 17, 88, 139, 56, + 8, 26, 205, 163, 193, 72, 201, 209, 220, 215, 97, 172, 73, 99, 139, + 111, 125, 94, 196, 78, 235, 224, 103, 38, 237, 9, 142, 131, 229, 45, + 247, 172, 219, 29, 102, 67, 124, 171, 113, 2, 85, 148, 56, 150, 227, + 45, 147, 200, 171, 42, 244, 128, 106, 2, 47, 245, 211, 163, 240, 41, + 86, 50, 70, 44, 91, 166, 247, 110, 234, 138, 152, 4, 100, 49, 248, + 198, 51, 124, 253, 126, 122, 30, 165, 0, 183, 248, 65, 30, 156, 161, + 52, 164, 76, 44, 198, 99, 20, 24, 97, 93, 232, 104, 51, 200, 0, + 153, 67, 93, 172, 94, 217, 127, 34, 29, 64, 149, 41, 78, 211, 63, + 188, 61, 102, 2, 127, 166, 194, 5, 59, 203, 5, 224, 68, 250, 58, + 202, 236, 218, 235, 168, 0, 205, 82, 53, 99, 51, 144, 0, 140, 45, + 46, 213, 207, 17, 221, 47, 85, 211, 87, 2, 35, 167, 236, 191, 70, + 147, 201, 200, 69, 1, 228, 136, 243, 122, 253, 34, 201, 92, 90, 194, + 8, 119, 197, 197, 178, 157, 207, 170, 147, 232, 5, 200, 241, 6, 27, + 120, 242, 232, 163, 26, 234, 230, 50, 214, 194, 125, 135, 62, 28, 118, + 24, 155, 39, 166, 250, 204, 189, 169, 94, 110, 81, 222, 81, 127, 71, + 49, 176, 178, 37, 63, 219, 72, 0, 100, 255, 201, 70, 177, 208, 81, + 101, 177, 31, 130, 187, 196, 119, 161, 217, 207, 216, 59, 106, 15, 56, + 134, 229, 99, 68, 73, 215, 9, 25, 119, 82, 88, 19, 184, 42, 38, + 40, 176, 6, 34, 167, 249, 143, 6, 216, 128, 139, 75, 3, 229, 126, + 121, 187, 68, 219, 187, 99, 154, 175, 240, 86, 75, 40, 133, 146, 223, + 105, 220, 83, 126, 90, 206, 136, 102, 199, 36, 217, 56, 78, 226, 138, + 59, 142, 223, 68, 175, 191, 83, 224, 208, 195, 2, 102, 168, 194, 158, + 231, 143, 162, 83, 92, 93, 238, 12, 231, 142, 41, 106, 66, 178, 68, + 83, 155, 24, 102, 150, 112, 1, 27, 175, 239, 85, 175, 61, 75, 157, + 245, 121, 62, 171, 217, 55, 218, 86, 45, 10, 228, 203, 193, 216, 90, + 142, 109, 232, 168, 17, 149, 145, 169, 199, 134, 194, 110, 104, 66, 130, + 215, 179, 205, 6, 183, 93, 47, 131, 8, 104, 12, 169, 92, 69, 43, + 193, 77, 223, 238, 36, 15, 59, 136, 95, 87, 196, 169, 35, 118, 252, + 19, 6, 247, 172, 219, 159, 109, 118, 154, 10, 199, 227, 164, 36, 85, + 27, 37, 52, 149, 85, 107, 134, 203, 39, 112, 63, 235, 229, 225, 141, + 127, 46, 188, 125, 48, 183, 137, 79, 157, 251, 128, 214, 29, 60, 192, + 43, 20, 22, 77, 62, 5, 229, 201, 61, 217, 181, 68, 161, 232, 220, + 189, 206, 170, 48, 199, 251, 10, 93, 153, 112, 35, 81, 174, 17, 220, + 54, 183, 4, 229, 14, 231, 33, 14, 63, 121, 125, 205, 101, 110, 255, + 145, 55, 130, 56, 4, 236, 171, 27, 10, 130, 188, 115, 125, 104, 178, + 41, 100, 48, 200, 231, 41, 156, 32, 125, 22, 167, 209, 221, 201, 63, + 165, 210, 15, 14, 83, 162, 45, 176, 131, 195, 34, 145, 120, 155, 67, + 82, 254, 231, 179, 149, 97, 4, 84, 30, 62, 140, 39, 235, 91, 145, + 92, 89, 87, 96, 144, 96, 223, 153, 0, 28, 117, 238, 168, 40, 11, + 140, 197, 162, 172, 72, 23, 120, 153, 147, 195, 6, 39, 36, 54, 174, + 202, 182, 74, 232, 30, 240, 10, 130, 188, 127, 2, 48, 68, 9, 191, + 245, 176, 249, 169, 19, 21, 154, 45, 249, 114, 137, 223, 190, 252, 87, + 36, 85, 242, 96, 21, 234, 18, 157, 108, 86, 179, 103, 87, 149, 121, + 231, 19, 111, 157, 154, 171, 158, 128, 68, 253, 157, 146, 9, 11, 82, + 101, 218, 181, 37, 73, 31, 19, 122, 211, 104, 102, 172, 244, 119, 94, + 235, 143, 241, 113, 24, 211, 132, 227, 169, 254, 60, 118, 45, 122, 177, + 97, 161, 170, 233, 212, 139, 23, 179, 61, 117, 175, 126, 18, 119, 242, + 14, 67, 254, 147, 62, 61, 58, 54, 42, 75, 134, 163, 134, 56, 20, + 222, 1, 199, 168, 38, 142, 114, 14, 84, 106, 218, 24, 245, 129, 59, + 86, 217, 80, 79, 119, 218, 53, 136, 124, 63, 90, 179, 205, 112, 192, + 116, 186, 223, 65, 52, 109, 169, 196, 209, 73, 239, 124, 224, 15, 78, + 134, 164, 65, 189, 58, 22, 166, 57, 64, 104, 185, 101, 43, 231, 254, + 145, 156, 74, 38, 201, 121, 28, 25, 221, 129, 82, 26, 14, 36, 32, + 158, 208, 70, 2, 201, 70, 190, 208, 246, 54, 239, 158, 140, 212, 225, + 209, 177, 86, 31, 32, 45, 93, 207, 255, 12, 176, 154, 217, 193, 166, + 61, 241, 53, 80, 37, 214, 34, 65, 207, 114, 163, 132, 116, 133, 63, + 217, 234, 5, 111, 188, 79, 1, 110, 88, 156, 17, 242, 1, 138, 105, + 144, 213, 123, 212, 7, 164, 200, 175, 161, 145, 108, 104, 174, 202, 202, + 35, 153, 88, 138, 105, 58, 143, 57, 227, 90, 38, 189, 38, 66, 80, + 222, 174, 7, 202, 57, 236, 239, 104, 51, 26, 252, 140, 2, 74, 4, + 163, 211, 199, 202, 185, 65, 203, 13, 210, 69, 228, 115, 31, 100, 143, + 189, 100, 228, 209, 107, 55, 72, 150, 255, 144, 232, 155, 15, 42, 18, + 149, 49, 207, 32, 148, 178, 112, 254, 67, 51, 14, 217, 41, 203, 217, + 205, 101, 223, 161, 148, 33, 92, 164, 250, 91, 80, 251, 104, 157, 225, + 172, 18, 245, 5, 54, 30, 8, 254, 109, 3, 202, 215, 179, 161, 236, + 147, 104, 254, 232, 217, 124, 178, 1, 206, 38, 168, 77, 8, 112, 234, + 154, 162, 94, 3, 90, 94, 114, 137, 115, 42, 98, 202, 0, 214, 202, + 65, 93, 52, 179, 123, 74, 86, 10, 171, 211, 171, 44, 226, 56, 13, + 163, 7, 146, 57, 253, 115, 93, 156, 132, 119, 146, 107, 98, 218, 19, + 195, 5, 195, 190, 231, 218, 143, 48, 65, 102, 92, 0, 244, 108, 148, + 144, 214, 99, 128, 208, 85, 124, 5, 75, 38, 131, 93, 38, 21, 170, + 24, 105, 170, 135, 152, 21, 38, 191, 251, 88, 178, 62, 84, 177, 239, + 61, 156, 63, 47, 195, 117, 159, 198, 182, 126, 216, 103, 165, 158, 51, + 70, 34, 33, 241, 216, 11, 50, 152, 157, 100, 30, 66, 147, 88, 38, + 17, 251, 19, 182, 71, 65, 199, 150, 215, 188, 188, 80, 83, 2, 83, + 73, 183, 251, 85, 101, 25, 173, 50, 243, 138, 194, 98, 209, 104, 219, + 25, 45, 111, 172, 115, 238, 149, 4, 205, 123, 112, 218, 192, 247, 102, + 191, 30, 225, 230, 36, 188, 219, 220, 19, 213, 127, 226, 227, 17, 90, + 216, 88, 129, 249, 230, 91, 42, 111, 102, 45, 42, 175, 161, 188, 195, + 184, 238, 57, 69, 88, 168, 167, 23, 64, 47, 201, 51, 79, 65, 117, + 254, 146, 100, 8, 30, 209, 42, 138, 132, 209, 241, 66, 249, 228, 192, + 48, 21, 75, 202, 123, 99, 76, 87, 34, 99, 32, 224, 140, 94, 90, + 178, 47, 165, 23, 227, 92, 218, 45, 44, 104, 9, 23, 94, 254, 195, + 16, 12, 105, 135, 48, 225, 7, 139, 148, 199, 157, 139, 243, 71, 254, + 15, 64, 143, 140, 3, 221, 218, 117, 118, 34, 177, 156, 50, 220, 99, + 219, 4, 247, 244, 16, 100, 51, 73, 85, 181, 24, 127, 102, 173, 238, + 205, 143, 68, 63, 44, 197, 106, 165, 150, 11, 244, 198, 36, 101, 10, + 79, 207, 183, 214, 228, 226, 226, 235, 77, 11, 175, 80, 90, 197, 35, + 99, 7, 121, 208, 236, 141, 171, 176, 158, 219, 162, 166, 168, 147, 2, + 131, 180, 57, 229, 106, 63, 194, 250, 21, 63, 152, 16, 109, 20, 208, + 227, 225, 10, 22, 2, 223, 128, 89, 100, 47, 101, 165, 0, 147, 198, + 47, 109, 94, 113, 183, 101, 113, 248, 79, 21, 26, 141, 176, 52, 118, + 71, 143, 174, 194, 248, 199, 194, 245, 105, 112, 92, 180, 22, 184, 218, + 78, 192, 41, 17, 171, 143, 203, 2, 81, 178, 177, 138, 101, 113, 190, + 77, 70, 73, 85, 228, 194, 2, 70, 191, 54, 43, 188, 233, 27, 135, + 140, 127, 10, 59, 38, 86, 226, 127, 166, 132, 69, 21, 200, 107, 33, + 89, 24, 152, 88, 90, 75, 144, 236, 44, 10, 121, 139, 169, 113, 127, + 104, 227, 164, 145, 69, 196, 233, 237, 127, 132, 204, 244, 178, 247, 191, + 207, 63, 135, 214, 135, 213, 151, 44, 43, 190, 32, 241, 221, 118, 81, + 145, 43, 29, 244, 239, 78, 245, 115, 229, 178, 255, 147, 16, 149, 255, + 154, 217, 226, 234, 99, 247, 146, 209, 42, 9, 74, 220, 199, 178, 165, + 246, 188, 22, 51, 136, 38, 63, 125, 45, 108, 190, 111, 72, 248, 57, + 16, 107, 120, 245, 158, 215, 136, 9, 25, 61, 162, 148, 109, 112, 193, + 56, 81, 121, 143, 208, 225, 20, 130, 245, 12, 81, 156, 189, 102, 23, + 51, 135, 76, 205, 59, 197, 152, 35, 80, 127, 168, 223, 48, 20, 104, + 57, 69, 132, 53, 72, 220, 161, 178, 219, 33, 37, 245, 58, 199, 17, + 246, 39, 2, 84, 251, 20, 62, 21, 56, 209, 143, 149, 24, 68, 59, + 17, 240, 215, 95, 195, 188, 231, 97, 41, 32, 98, 57, 107, 172, 90, + 159, 132, 150, 226, 75, 151, 144, 12, 111, 6, 253, 112, 213, 28, 179, + 232, 233, 73, 139, 84, 232, 204, 0, 148, 77, 48, 183, 37, 213, 67, + 195, 211, 206, 12, 110, 212, 180, 201, 229, 77, 7, 48, 221, 44, 102, + 23, 168, 145, 200, 77, 103, 7, 173, 247, 84, 110, 123, 23, 5, 145, + 154, 124, 95, 103, 89, 78, 136, 74, 47, 136, 86, 135, 250, 60, 228, + 64, 78, 228, 172, 111, 204, 89, 144, 119, 8, 248, 81, 70, 113, 89, + 113, 50, 70, 124, 182, 58, 179, 77, 197, 160, 136, 41, 195, 19, 163, + 222, 23, 34, 70, 203, 156, 137, 209, 146, 213, 112, 210, 203, 138, 236, + 36, 24, 57, 106, 75, 115, 112, 43, 229, 239, 154, 133, 160, 211, 36, + 241, 229, 94, 110, 224, 182, 162, 85, 189, 20, 125, 9, 26, 137, 185, + 177, 14, 138, 5, 225, 132, 174, 244, 209, 187, 92, 140, 29, 158, 111, + 150, 8, 32, 99, 99, 142, 213, 19, 101, 164, 64, 190, 61, 219, 198, + 118, 246, 217, 110, 173, 248, 24, 100, 216, 190, 118, 198, 209, 64, 238, + 205, 176, 46, 116, 131, 103, 243, 148, 123, 69, 136, 144, 46, 112, 112, + 162, 219, 21, 205, 136, 193, 152, 96, 134, 16, 22, 146, 190, 194, 19, + 119, 47, 44, 67, 131, 166, 109, 215, 159, 90, 88, 212, 11, 71, 235, + 55, 31, 4, 113, 172, 187, 169, 10, 144, 169, 108, 79, 145, 7, 29, + 24, 221, 230, 28, 113, 32, 190, 160, 67, 40, 43, 107, 222, 221, 175, + 180, 200, 217, 15, 128, 253, 206, 203, 106, 167, 163, 89, 29, 28, 247, + 240, 14, 121, 133, 218, 154, 167, 77, 98, 149, 151, 145, 4, 78, 232, + 135, 195, 121, 157, 216, 178, 211, 243, 201, 71, 220, 150, 119, 74, 71, + 110, 200, 234, 100, 105, 248, 47, 25, 35, 1, 241, 166, 6, 88, 41, + 246, 176, 181, 21, 75, 150, 20, 227, 19, 64, 226, 209, 194, 121, 174, + 240, 219, 133, 253, 161, 146, 230, 69, 122, 42, 165, 82, 78, 45, 185, + 61, 12, 14, 148, 13, 119, 155, 157, 28, 90, 226, 119, 9, 201, 199, + 64, 93, 120, 115, 138, 156, 235, 123, 52, 111, 149, 48, 73, 181, 204, + 181, 10, 157, 16, 55, 100, 243, 10, 29, 159, 139, 88, 16, 1, 31, + 201, 242, 2, 237, 186, 181, 217, 139, 102, 205, 119, 197, 201, 221, 108, + 205, 171, 54, 109, 31, 76, 199, 28, 160, 214, 14, 201, 25, 211, 189, + 144, 44, 69, 70, 205, 79, 150, 149, 108, 23, 8, 171, 60, 18, 127, + 161, 41, 71, 239, 168, 89, 140, 49, 149, 157, 109, 232, 141, 227, 239, + 247, 114, 174, 129, 19, 252, 130, 74, 202, 224, 73, 122, 246, 47, 147, + 8, 37, 60, 253, 101, 11, 171, 160, 39, 92, 180, 183, 40, 254, 233, + 117, 200, 139, 37, 140, 28, 35, 8, 10, 40, 167, 247, 248, 84, 215, + 58, 170, 2, 7, 1, 69, 214, 10, 7, 233, 209, 181, 212, 34, 68, + 46, 141, 198, 137, 248, 45, 130, 97, 123, 104, 141, 17, 126, 7, 199, + 55, 194, 160, 69, 39, 13, 70, 41, 63, 205, 99, 1, 69, 46, 92, + 77, 56, 20, 247, 224, 226, 60, 153, 81, 180, 91, 159, 156, 27, 119, + 114, 126, 210, 26, 123, 165, 204, 237, 81, 75, 130, 45, 60, 0, 155, + 11, 125, 27, 202, 35, 230, 101, 164, 86, 117, 226, 23, 171, 253, 222, + 223, 38, 104, 224, 124, 92, 251, 110, 145, 247, 198, 158, 25, 172, 84, + 49, 87, 1, 168, 95, 124, 146, 5, 46, 179, 198, 235, 69, 200, 63, + 212, 59, 110, 52, 195, 54, 71, 169, 234, 189, 58, 180, 149, 194, 10, + 118, 99, 66, 66, 123, 192, 248, 51, 237, 129, 10, 143, 94, 55, 135, + 247, 56, 163, 40, 139, 150, 192, 142, 64, 169, 90, 42, 116, 228, 62, + 67, 130, 212, 212, 23, 210, 182, 95, 109, 224, 185, 255, 156, 102, 184, + 171, 42, 98, 217, 218, 27, 80, 171, 125, 49, 233, 16, 238, 42, 102, + 61, 95, 180, 49, 192, 67, 112, 143, 106, 145, 185, 239, 180, 181, 120, + 24, 127, 215, 233, 123, 235, 104, 228, 248, 223, 90, 211, 211, 76, 179, + 198, 253, 220, 171, 247, 171, 11, 237, 17, 249, 81, 122, 111, 255, 213, + 120, 167, 192, 149, 102, 7, 204, 86, 107, 156, 83, 174, 18, 237, 143, + 85, 76, 245, 189, 86, 90, 118, 69, 100, 140, 121, 17, 255, 17, 209, + 144, 90, 3, 191, 201, 134, 108, 0, 196, 133, 153, 39, 248, 138, 215, + 73, 18, 21, 140, 172, 178, 154, 194, 170, 45, 112, 113, 213, 36, 155, + 0, 30, 213, 186, 39, 6, 241, 92, 111, 139, 52, 84, 58, 218, 187, + 60, 123, 113, 190, 185, 89, 242, 248, 221, 238, 173, 145, 214, 237, 133, + 101, 6, 143, 188, 116, 13, 189, 205, 203, 147, 140, 215, 175, 38, 99, + 77, 54, 98, 146, 54, 101, 40, 206, 175, 26, 195, 33, 63, 20, 210, + 96, 227, 125, 108, 230, 179, 123, 81, 135, 183, 132, 216, 56, 223, 197, + 141, 158, 114, 228, 67, 172, 95, 76, 69, 212, 188, 244, 12, 16, 158, + 119, 106, 44, 39, 36, 38, 164, 173, 182, 172, 210, 176, 19, 125, 6, + 36, 138, 77, 65, 219, 30, 45, 167, 21, 125, 49, 69, 173, 23, 242, + 246, 25, 155, 194, 161, 140, 125, 97, 153, 68, 120, 114, 23, 243, 242, + 192, 129, 68, 88, 43, 161, 33, 152, 130, 232, 179, 70, 156, 219, 198, + 1, 135, 3, 178, 49, 92, 30, 125, 185, 39, 185, 69, 143, 30, 180, + 113, 109, 233, 156, 101, 82, 239, 142, 58, 234, 151, 67, 2, 140, 198, + 7, 180, 167, 33, 168, 131, 213, 157, 139, 43, 208, 27, 217, 245, 115, + 0, 59, 155, 69, 236, 209, 101, 139, 211, 247, 2, 41, 113, 222, 7, + 2, 109, 61, 232, 215, 145, 18, 202, 158, 187, 136, 54, 190, 169, 13, + 59, 204, 117, 37, 160, 6, 121, 200, 9, 189, 31, 0, 251, 78, 223, + 43, 122, 5, 42, 24, 74, 247, 241, 68, 42, 49, 28, 153, 3, 40, + 166, 47, 55, 83, 186, 236, 69, 132, 91, 115, 132, 26, 214, 160, 51, + 161, 232, 147, 172, 175, 144, 53, 58, 241, 1, 245, 53, 126, 211, 121, + 98, 228, 65, 166, 9, 186, 93, 111, 249, 87, 109, 85, 218, 177, 160, + 225, 99, 131, 167, 173, 36, 10, 121, 121, 98, 249, 99, 68, 128, 159, + 217, 207, 65, 52, 247, 53, 58, 135, 11, 76, 238, 101, 162, 166, 100, + 126, 136, 157, 43, 172, 186, 157, 138, 2, 132, 141, 165, 152, 92, 234, + 3, 92, 81, 111, 83, 239, 234, 204, 152, 240, 74, 198, 42, 56, 131, + 104, 96, 83, 207, 109, 30, 185, 45, 242, 2, 155, 47, 18, 111, 119, + 57, 239, 7, 88, 45, 86, 239, 10, 178, 146, 58, 248, 96, 166, 234, + 253, 202, 224, 111, 120, 216, 70, 205, 29, 154, 232, 216, 165, 222, 76, + 153, 46, 5, 143, 71, 197, 175, 198, 127, 231, 119, 110, 47, 128, 61, + 134, 41, 115, 101, 3, 35, 127, 201, 12, 152, 1, 163, 41, 91, 233, + 10, 230, 150, 44, 140, 234, 164, 184, 214, 218, 114, 23, 221, 163, 57, + 2, 5, 147, 66, 223, 90, 238, 136, 95, 138, 116, 27, 91, 223, 52, + 243, 246, 183, 215, 166, 170, 169, 8, 140, 91, 173, 160, 160, 105, 69, + 241, 31, 33, 33, 148, 215, 67, 130, 181, 1, 114, 104, 206, 192, 195, + 247, 229, 99, 84, 29, 2, 132, 146, 191, 243, 37, 36, 46, 176, 164, + 68, 84, 121, 159, 6, 160, 195, 170, 43, 128, 130, 165, 44, 157, 83, + 173, 182, 93, 90, 202, 227, 133, 140, 39, 203, 202, 2, 49, 96, 178, + 190, 147, 15, 99, 71, 216, 166, 97, 130, 87, 4, 149, 23, 107, 246, + 216, 213, 222, 64, 41, 215, 37, 211, 21, 53, 90, 130, 165, 181, 188, + 87, 70, 8, 53, 114, 227, 18, 192, 19, 200, 195, 83, 228, 1, 171, + 202, 229, 92, 92, 227, 48, 251, 31, 198, 59, 162, 119, 9, 75, 115, + 30, 127, 8, 89, 99, 249, 86, 152, 198, 53, 207, 82, 251, 68, 82, + 247, 21, 214, 18, 246, 118, 81, 94, 240, 34, 174, 233, 205, 204, 71, + 0, 254, 24, 178, 166, 248, 12, 70, 187, 163, 168, 95, 23, 108, 156, + 210, 244, 198, 216, 54, 32, 83, 158, 121, 26, 116, 252, 122, 73, 188, + 134, 154, 180, 229, 139, 102, 2, 8, 171, 201, 5, 187, 57, 35, 254, + 35, 19, 161, 16, 88, 215, 158, 148, 249, 201, 65, 177, 144, 69, 138, + 161, 220, 255, 190, 223, 43, 181, 11, 158, 103, 193, 14, 21, 49, 16, + 40, 223, 155, 12, 164, 23, 31, 15, 20, 238, 131, 85, 181, 80, 149, + 128, 196, 123, 155, 236, 9, 94, 252, 182, 54, 62, 215, 115, 115, 224, + 242, 141, 137, 238, 115, 101, 107, 65, 202, 79, 79, 27, 239, 29, 154, + 19, 18, 4, 185, 144, 191, 107, 92, 29, 38, 248, 142, 81, 109, 64, + 161, 23, 73, 93, 31, 114, 51, 81, 98, 209, 69, 27, 43, 22, 4, + 168, 88, 60, 149, 89, 100, 82, 122, 95, 21, 38, 97, 185, 87, 66, + 82, 16, 242, 109, 100, 94, 164, 6, 73, 130, 76, 137, 218, 226, 166, + 35, 21, 156, 72, 253, 148, 228, 142, 134, 41, 145, 15, 144, 215, 187, + 120, 239, 195, 203, 44, 250, 46, 72, 181, 43, 255, 81, 247, 100, 195, + 248, 208, 115, 141, 32, 190, 131, 77, 230, 220, 54, 197, 60, 22, 115, + 177, 116, 250, 0, 60, 144, 128, 68, 245, 231, 199, 216, 17, 216, 227, + 120, 221, 68, 233, 236, 202, 121, 189, 237, 149, 60, 244, 130, 250, 169, + 70, 101, 147, 8, 49, 248, 61, 207, 202, 148, 228, 87, 234, 117, 238, + 52, 92, 118, 148, 203, 206, 175, 75, 64, 215, 57, 70, 196, 52, 62, + 29, 116, 241, 185, 96, 131, 201, 219, 16, 3, 188, 159, 129, 134, 11, + 138, 13, 3, 72, 193, 183, 236, 91, 171, 161, 52, 166, 23, 254, 118, + 238, 180, 55, 215, 165, 163, 154, 202, 27, 61, 150, 31, 12, 1, 249, + 0, 12, 29, 132, 213, 168, 105, 53, 112, 54, 2, 236, 131, 230, 3, + 211, 69, 243, 233, 173, 145, 105, 27, 18, 252, 224, 5, 46, 18, 233, + 96, 237, 143, 52, 67, 158, 30, 242, 151, 98, 148, 208, 60, 143, 14, + 245, 250, 185, 151, 111, 147, 145, 197, 165, 233, 18, 178, 240, 83, 228, + 213, 237, 58, 20, 152, 249, 241, 250, 204, 15, 167, 97, 242, 6, 228, + 117, 133, 2, 199, 220, 212, 239, 206, 104, 231, 145, 33, 17, 150, 223, + 126, 173, 223, 148, 21, 228, 41, 63, 37, 19, 102, 73, 95, 196, 40, + 151, 2, 19, 239, 182, 22, 178, 165, 242, 159, 208, 226, 72, 179, 201, + 109, 157, 18, 230, 130, 221, 89, 173, 242, 170, 11, 146, 20, 135, 112, + 2, 202, 30, 25, 106, 151, 52, 223, 1, 3, 18, 151, 74, 113, 49, + 186, 112, 160, 121, 38, 233, 155, 188, 237, 251, 178, 8, 200, 120, 134, + 152, 22, 232, 250, 219, 237, 157, 23, 134, 158, 122, 202, 120, 89, 248, + 68, 46, 184, 180, 93, 84, 85, 177, 236, 62, 50, 103, 62, 81, 105, + 33, 15, 97, 203, 192, 132, 219, 70, 203, 104, 162, 98, 179, 224, 44, + 101, 221, 84, 176, 97, 77, 84, 45, 255, 227, 80, 107, 45, 70, 106, + 68, 206, 134, 182, 205, 255, 235, 44, 131, 81, 126, 142, 30, 130, 87, + 133, 227, 15, 200, 194, 5, 230, 230, 169, 65, 116, 104, 193, 196, 214, + 18, 199, 56, 114, 5, 7, 189, 158, 32, 119, 53, 93, 169, 172, 141, + 223, 71, 194, 204, 221, 237, 118, 16, 198, 169, 10, 38, 156, 152, 76, + 185, 73, 15, 227, 118, 57, 149, 160, 14, 158, 18, 139, 117, 249, 142, + 12, 175, 252, 9, 202, 65, 196, 23, 211, 174, 169, 85, 244, 154, 239, + 28, 199, 196, 171, 241, 27, 140, 222, 54, 25, 229, 69, 102, 134, 125, + 235, 246, 156, 41, 75, 212, 225, 169, 207, 88, 246, 136, 176, 27, 40, + 205, 228, 239, 24, 217, 42, 212, 63, 187, 75, 60, 197, 97, 245, 3, + 35, 243, 128, 36, 129, 145, 31, 27, 193, 20, 122, 116, 143, 130, 159, + 80, 203, 253, 233, 66, 118, 92, 177, 83, 55, 141, 189, 115, 240, 125, + 107, 8, 221, 237, 171, 24, 183, 220, 174, 149, 51, 81, 221, 187, 233, + 21, 116, 37, 88, 123, 20, 208, 201, 141, 155, 136, 148, 64, 14, 102, + 204, 248, 173, 249, 61, 75, 253, 199, 46, 192, 138, 79, 83, 161, 127, + 235, 140, 173, 158, 127, 232, 77, 17, 45, 207, 154, 51, 79, 57, 184, + 22, 220, 225, 61, 233, 188, 119, 221, 254, 87, 105, 151, 29, 156, 162, + 18, 202, 244, 36, 105, 24, 240, 195, 198, 39, 31, 155, 135, 62, 220, + 180, 53, 70, 121, 254, 234, 194, 79, 177, 181, 75, 23, 20, 217, 209, + 107, 100, 175, 83, 25, 212, 62, 11, 108, 33, 144, 17, 150, 176, 225, + 86, 54, 190, 8, 82, 150, 219, 80, 72, 75, 100, 197, 72, 95, 174, + 189, 158, 109, 146, 103, 67, 101, 165, 191, 178, 148, 32, 173, 147, 195, + 145, 27, 119, 126, 46, 186, 120, 226, 41, 209, 51, 171, 29, 4, 244, + 184, 209, 92, 159, 221, 122, 163, 30, 246, 68, 8, 190, 146, 143, 159, + 116, 211, 83, 247, 90, 241, 193, 10, 58, 250, 60, 69, 182, 204, 181, + 207, 107, 37, 104, 150, 14, 69, 55, 20, 7, 158, 96, 202, 248, 68, + 220, 209, 132, 133, 164, 58, 175, 103, 166, 1, 174, 0, 32, 182, 13, + 199, 83, 48, 148, 52, 198, 19, 135, 58, 46, 109, 164, 49, 199, 26, + 109, 132, 19, 46, 118, 59, 27, 202, 73, 4, 1, 22, 183, 163, 247, + 45, 96, 206, 43, 239, 186, 131, 5, 61, 198, 46, 99, 31, 89, 194, + 241, 207, 170, 80, 250, 72, 225, 89, 154, 151, 165, 171, 42, 59, 58, + 68, 73, 178, 88, 153, 111, 247, 233, 19, 130, 51, 194, 18, 142, 129, + 52, 252, 167, 183, 238, 99, 198, 85, 134, 20, 114, 94, 90, 7, 223, + 147, 178, 135, 156, 216, 69, 14, 42, 181, 232, 203, 63, 239, 213, 42, + 225, 189, 223, 15, 238, 219, 62, 218, 15, 210, 141, 184, 226, 11, 228, + 9, 40, 37, 118, 26, 194, 213, 220, 99, 247, 7, 137, 187, 61, 64, + 56, 86, 169, 143, 224, 135, 166, 4, 28, 55, 87, 216, 45, 56, 39, + 37, 181, 234, 38, 4, 241, 184, 43, 134, 108, 245, 247, 230, 99, 162, + 95, 214, 92, 191, 83, 38, 152, 241, 38, 33, 32, 38, 92, 222, 228, + 138, 11, 143, 135, 83, 181, 140, 99, 9, 252, 123, 215, 212, 81, 108, + 71, 2, 159, 246, 82, 118, 186, 48, 69, 212, 147, 218, 61, 183, 170, + 130, 233, 227, 145, 101, 156, 20, 106, 128, 214, 238, 12, 163, 59, 152, + 250, 112, 173, 42, 5, 1, 68, 35, 52, 13, 198, 121, 11, 117, 16, + 126, 143, 54, 184, 205, 44, 238, 47, 218, 75, 112, 228, 183, 55, 22, + 189, 35, 146, 27, 44, 229, 190, 241, 110, 42, 152, 12, 141, 131, 183, + 84, 31, 40, 185, 108, 176, 173, 247, 217, 214, 155, 108, 176, 152, 201, + 201, 185, 7, 227, 187, 87, 71, 45, 98, 224, 159, 125, 230, 132, 19, + 233, 98, 174, 93, 80, 245, 32, 94, 253, 35, 150, 68, 176, 83, 50, + 127, 196, 149, 176, 191, 136, 194, 84, 228, 106, 238, 47, 206, 110, 204, + 9, 116, 136, 230, 249, 90, 215, 160, 51, 151, 61, 92, 187, 82, 129, + 101, 75, 238, 22, 166, 132, 86, 183, 113, 149, 215, 39, 242, 214, 148, + 71, 168, 236, 20, 105, 249, 219, 23, 101, 63, 92, 173, 40, 126, 253, + 145, 161, 9, 72, 60, 215, 59, 155, 228, 255, 201, 193, 60, 129, 51, + 29, 207, 237, 43, 145, 161, 41, 115, 98, 19, 138, 253, 66, 232, 233, + 186, 79, 114, 1, 164, 184, 14, 61, 151, 198, 60, 247, 115, 5, 176, + 132, 201, 245, 60, 21, 238, 60, 133, 186, 18, 154, 89, 170, 23, 102, + 2, 111, 147, 25, 208, 152, 173, 13, 58, 125, 181, 115, 218, 196, 107, + 173, 192, 60, 94, 140, 254, 83, 80, 214, 220, 245, 254, 250, 39, 202, + 132, 142, 84, 16, 199, 20, 129, 159, 24, 18, 123, 143, 157, 176, 199, + 173, 56, 169, 222, 252, 63, 27, 242, 137, 138, 253, 143, 4, 209, 124, + 86, 243, 170, 152, 121, 231, 24, 238, 35, 113, 27, 205, 59, 153, 161, + 234, 65, 153, 237, 97, 197, 98, 216, 129, 30, 174, 211, 193, 167, 102, + 229, 240, 198, 85, 193, 253, 73, 118, 185, 63, 3, 227, 165, 139, 38, + 109, 214, 108, 253, 48, 227, 253, 219, 1, 226, 89, 47, 145, 86, 8, + 234, 146, 159, 230, 108, 212, 111, 112, 129, 121, 28, 164, 105, 138, 143, + 106, 132, 254, 202, 177, 171, 123, 38, 162, 112, 97, 88, 221, 95, 5, + 161, 222, 76, 234, 253, 239, 231, 13, 62, 243, 80, 164, 204, 67, 229, + 43, 103, 152, 30, 131, 240, 218, 184, 149, 161, 234, 124, 238, 126, 33, + 234, 133, 1, 201, 113, 176, 190, 231, 215, 99, 64, 219, 224, 29, 217, + 23, 232, 185, 215, 56, 14, 128, 31, 227, 227, 80, 213, 239, 224, 36, + 144, 26, 243, 36, 181, 129, 69, 104, 55, 42, 212, 27, 252, 74, 173, + 196, 255, 96, 153, 53, 3, 99, 13, 167, 244, 183, 92, 231, 140, 210, + 116, 98, 36, 187, 126, 84, 77, 144, 109, 126, 138, 53, 237, 100, 96, + 209, 68, 204, 61, 104, 246, 64, 35, 98, 99, 82, 152, 68, 118, 51, + 82, 101, 136, 76, 149, 234, 135, 110, 37, 167, 154, 17, 145, 150, 148, + 89, 184, 123, 108, 255, 2, 49, 98, 101, 125, 88, 110, 2, 146, 130, + 120, 212, 249, 21, 164, 164, 161, 47, 201, 70, 114, 46, 149, 0, 88, + 142, 60, 228, 58, 181, 175, 207, 222, 199, 81, 135, 121, 200, 205, 143, + 132, 31, 93, 179, 202, 132, 84, 3, 19, 40, 190, 99, 120, 38, 42, + 165, 159, 18, 153, 99, 212, 120, 4, 237, 237, 8, 57, 69, 228, 186, + 220, 183, 121, 139, 113, 179, 200, 21, 166, 75, 19, 149, 135, 138, 170, + 149, 14, 166, 110, 94, 129, 233, 66, 187, 163, 213, 96, 172, 4, 145, + 205, 41, 25, 97, 26, 66, 99, 104, 172, 227, 73, 193, 35, 142, 228, + 202, 85, 209, 10, 77, 47, 21, 8, 14, 215, 104, 211, 62, 186, 19, + 226, 180, 187, 81, 140, 101, 188, 252, 173, 1, 242, 9, 66, 177, 73, + 5, 79, 230, 53, 67, 28, 207, 98, 199, 52, 27, 66, 153, 200, 135, + 247, 246, 210, 128, 156, 173, 249, 92, 165, 93, 112, 247, 110, 0, 133, + 56, 64, 199, 71, 135, 104, 242, 50, 218, 28, 242, 216, 223, 229, 92, + 19, 39, 36, 161, 233, 104, 205, 56, 92, 20, 44, 81, 244, 215, 85, + 116, 79, 44, 104, 236, 197, 72, 17, 157, 105, 213, 76, 90, 85, 9, + 54, 76, 248, 27, 39, 175, 107, 79, 142, 31, 140, 48, 194, 73, 214, + 79, 131, 65, 191, 175, 211, 154, 225, 182, 226, 90, 169, 178, 95, 71, + 89, 3, 4, 83, 27, 152, 218, 67, 67, 225, 90, 159, 244, 215, 227, + 41, 53, 214, 40, 178, 86, 46, 92, 27, 200, 104, 126, 203, 185, 150, + 90, 220, 210, 140, 33, 238, 113, 54, 31, 121, 4, 49, 132, 62, 250, + 9, 180, 120, 241, 248, 86, 67, 254, 57, 166, 141, 34, 165, 218, 73, + 167, 166, 85, 50, 191, 136, 177, 212, 175, 133, 8, 30, 106, 201, 100, + 208, 40, 119, 107, 182, 231, 27, 237, 58, 22, 225, 63, 21, 160, 176, + 7, 223, 124, 229, 53, 246, 170, 155, 70, 75, 68, 204, 221, 146, 48, + 109, 153, 25, 0, 157, 54, 208, 220, 240, 216, 113, 30, 230, 30, 46, + 139, 116, 215, 222, 10, 247, 103, 24, 86, 125, 8, 77, 202, 39, 152, + 10, 225, 131, 18, 117, 227, 249, 127, 160, 143, 86, 128, 207, 99, 207, + 224, 42, 110, 232, 36, 86, 179, 249, 138, 84, 121, 50, 5, 149, 93, + 7, 200, 115, 209, 110, 152, 124, 77, 52, 79, 221, 157, 195, 140, 54, + 19, 60, 205, 158, 199, 127, 207, 7, 117, 11, 227, 197, 72, 199, 187, + 184, 43, 95, 0, 61, 143, 176, 207, 65, 130, 87, 82, 140, 181, 182, + 184, 223, 238, 244, 209, 170, 7, 11, 100, 83, 5, 98, 125, 26, 188, + 40, 137, 242, 22, 249, 227, 184, 80, 44, 145, 32, 143, 254, 218, 115, + 107, 76, 139, 212, 87, 253, 12, 11, 121, 216, 159, 121, 87, 182, 101, + 205, 151, 5, 0, 126, 150, 6, 166, 115, 36, 14, 128, 159, 126, 200, + 42, 189, 146, 192, 223, 186, 35, 71, 224, 63, 33, 211, 207, 93, 66, + 201, 31, 66, 220, 66, 97, 107, 95, 157, 213, 92, 81, 217, 125, 242, + 101, 243, 184, 255, 155, 2, 165, 9, 143, 103, 243, 133, 173, 202, 202, + 40, 221, 73, 177, 248, 57, 243, 125, 130, 127, 102, 47, 3, 227, 27, + 203, 33, 179, 249, 117, 28, 112, 157, 0, 210, 139, 43, 15, 192, 47, + 202, 45, 132, 10, 26, 163, 47, 220, 65, 169, 225, 235, 120, 57, 25, + 176, 206, 16, 38, 110, 84, 145, 28, 43, 63, 35, 144, 234, 249, 59, + 22, 152, 16, 175, 248, 2, 6, 109, 55, 92, 124, 77, 237, 166, 207, + 82, 238, 140, 22, 30, 214, 144, 177, 182, 229, 27, 180, 150, 186, 187, + 231, 184, 242, 23, 178, 119, 36, 24, 165, 82, 15, 195, 55, 147, 107, + 45, 198, 133, 194, 95, 20, 146, 8, 222, 235, 67, 80, 119, 234, 48, + 223, 163, 51, 60, 217, 228, 171, 195, 231, 250, 46, 111, 138, 143, 1, + 48, 174, 116, 197, 186, 40, 61, 177, 53, 65, 225, 171, 95, 186, 209, + 199, 254, 152, 98, 179, 71, 140, 127, 193, 177, 171, 61, 227, 117, 130, + 92, 148, 43, 199, 156, 176, 219, 52, 218, 133, 160, 123, 11, 221, 104, + 254, 253, 144, 156, 245, 5, 156, 246, 226, 198, 222, 172, 246, 13, 35, + 210, 51, 99, 203, 213, 159, 248, 139, 71, 77, 120, 75, 195, 89, 11, + 122, 125, 43, 57, 30, 233, 45, 10, 87, 102, 171, 47, 21, 167, 175, + 143, 207, 121, 98, 48, 220, 247, 72, 184, 97, 83, 152, 72, 51, 136, + 17, 52, 249, 169, 8, 140, 219, 152, 5, 221, 132, 225, 17, 117, 28, + 72, 220, 69, 199, 108, 140, 175, 206, 165, 41, 39, 77, 194, 249, 154, + 121, 23, 85, 205, 128, 34, 118, 49, 220, 85, 5, 240, 181, 26, 210, + 29, 177, 24, 132, 91, 57, 218, 74, 217, 135, 225, 148, 82, 95, 98, + 54, 127, 58, 1, 85, 12, 122, 2, 58, 81, 16, 32, 168, 153, 186, + 97, 214, 81, 176, 244, 134, 168, 111, 127, 21, 251, 227, 215, 141, 191, + 141, 90, 21, 177, 142, 172, 29, 212, 128, 163, 54, 172, 20, 35, 174, + 1, 225, 232, 74, 73, 226, 154, 236, 45, 211, 64, 28, 142, 90, 175, + 147, 230, 243, 66, 160, 207, 186, 212, 201, 34, 58, 202, 236, 9, 218, + 10, 226, 189, 74, 106, 75, 43, 93, 1, 5, 162, 36, 42, 54, 86, + 83, 35, 242, 114, 165, 93, 76, 8, 94, 21, 110, 101, 241, 119, 219, + 78, 115, 182, 5, 105, 116, 73, 50, 193, 102, 254, 43, 197, 64, 236, + 6, 105, 84, 206, 79, 127, 195, 151, 106, 76, 122, 173, 234, 203, 34, + 20, 204, 34, 195, 244, 209, 60, 32, 112, 157, 150, 185, 49, 35, 11, + 41, 230, 21, 63, 137, 1, 127, 147, 193, 77, 136, 174, 109, 122, 243, + 119, 160, 26, 5, 187, 191, 90, 83, 26, 214, 237, 162, 198, 184, 179, + 204, 246, 113, 43, 145, 228, 4, 250, 28, 187, 22, 149, 121, 67, 94, + 202, 229, 64, 35, 204, 174, 106, 180, 40, 224, 146, 117, 146, 217, 9, + 29, 22, 202, 177, 96, 25, 165, 0, 97, 146, 120, 15, 29, 230, 203, + 30, 181, 73, 37, 59, 38, 156, 8, 123, 215, 252, 229, 157, 240, 58, + 91, 78, 3, 189, 39, 232, 28, 175, 195, 69, 94, 127, 176, 218, 32, + 40, 236, 113, 175, 110, 241, 181, 238, 15, 46, 106, 58, 170, 48, 58, + 254, 253, 190, 204, 172, 214, 31, 202, 150, 134, 97, 230, 224, 255, 121, + 206, 110, 102, 224, 49, 94, 248, 23, 109, 243, 23, 208, 50, 120, 155, + 166, 16, 193, 8, 111, 212, 88, 114, 163, 247, 255, 144, 18, 87, 92, + 47, 60, 250, 35, 102, 101, 150, 228, 34, 28, 18, 59, 175, 136, 120, + 186, 193, 15, 151, 143, 76, 54, 96, 157, 183, 62, 4, 245, 231, 132, + 94, 131, 139, 192, 253, 72, 194, 242, 7, 202, 19, 20, 245, 122, 114, + 177, 101, 133, 107, 109, 109, 112, 151, 71, 239, 115, 43, 157, 185, 57, + 149, 27, 82, 191, 118, 114, 80, 96, 115, 166, 79, 166, 59, 23, 91, + 223, 159, 217, 68, 63, 155, 173, 200, 73, 32, 199, 233, 241, 206, 133, + 125, 89, 87, 71, 172, 91, 56, 219, 233, 115, 26, 63, 53, 98, 209, + 57, 151, 243, 141, 54, 139, 107, 120, 252, 89, 249, 133, 67, 85, 144, + 135, 86, 238, 9, 133, 115, 95, 92, 97, 212, 81, 117, 70, 225, 199, + 123, 49, 84, 16, 84, 19, 134, 156, 33, 78, 195, 79, 191, 112, 44, + 206, 81, 249, 191, 4, 106, 159, 152, 246, 185, 246, 125, 7, 186, 106, + 239, 25, 144, 121, 78, 194, 199, 195, 218, 118, 189, 66, 2, 220, 105, + 0, 77, 65, 137, 55, 169, 82, 156, 126, 146, 139, 71, 44, 247, 210, + 45, 171, 110, 252, 221, 51, 80, 157, 164, 99, 10, 241, 175, 65, 32, + 180, 254, 187, 89, 223, 231, 227, 216, 197, 99, 217, 65, 187, 235, 152, + 63, 74, 176, 36, 170, 236, 134, 46, 98, 13, 108, 160, 126, 185, 245, + 100, 96, 40, 240, 69, 171, 10, 2, 141, 57, 105, 56, 82, 168, 46, + 126, 161, 5, 219, 126, 1, 1, 165, 92, 219, 81, 202, 86, 78, 174, + 209, 195, 7, 142, 244, 119, 255, 115, 242, 220, 11, 168, 135, 5, 71, + 145, 137, 108, 10, 17, 30, 178, 142, 202, 147, 24, 141, 161, 192, 79, + 54, 62, 142, 239, 66, 209, 248, 101, 134, 83, 10, 119, 121, 22, 240, + 25, 227, 60, 180, 18, 46, 164, 105, 89, 30, 196, 167, 206, 32, 32, + 76, 54, 35, 10, 210, 170, 114, 127, 0, 216, 28, 71, 6, 216, 15, + 56, 201, 194, 246, 115, 182, 231, 202, 62, 218, 93, 252, 151, 125, 48, + 231, 133, 89, 67, 175, 88, 80, 25, 208, 80, 251, 226, 12, 4, 225, + 125, 37, 78, 202, 227, 212, 179, 219, 234, 223, 207, 188, 126, 214, 22, + 59, 134, 161, 108, 10, 115, 65, 40, 68, 211, 192, 129, 64, 163, 178, + 183, 164, 98, 212, 20, 146, 25, 16, 154, 29, 176, 107, 3, 15, 62, + 226, 67, 119, 189, 45, 123, 187, 83, 222, 206, 56, 135, 242, 121, 61, + 220, 133, 171, 150, 139, 221, 69, 112, 13, 183, 180, 76, 97, 122, 168, + 79, 203, 136, 62, 161, 138, 40, 253, 182, 3, 51, 229, 58, 195, 79, + 191, 203, 248, 191, 180, 101, 40, 189, 22, 127, 67, 139, 219, 213, 78, + 11, 67, 215, 82, 41, 107, 54, 143, 72, 223, 89, 246, 156, 91, 11, + 157, 16, 225, 237, 213, 148, 187, 201, 233, 101, 70, 211, 201, 113, 164, + 185, 140, 169, 130, 42, 1, 222, 92, 59, 66, 17, 108, 67, 197, 192, + 251, 55, 203, 109, 189, 230, 131, 237, 215, 241, 65, 148, 253, 241, 39, + 141, 155, 148, 156, 244, 12, 68, 71, 109, 235, 241, 4, 161, 177, 218, + 114, 173, 113, 146, 11, 3, 219, 33, 141, 215, 62, 45, 215, 184, 196, + 97, 162, 250, 218, 110, 1, 190, 8, 67, 241, 94, 82, 196, 64, 85, + 118, 139, 240, 71, 67, 49, 241, 49, 129, 247, 44, 211, 46, 227, 115, + 140, 123, 192, 63, 82, 9, 155, 83, 167, 250, 70, 61, 66, 186, 217, + 46, 155, 128, 255, 232, 56, 224, 32, 254, 12, 204, 2, 85, 173, 20, + 75, 214, 73, 229, 18, 247, 145, 83, 241, 20, 245, 155, 15, 92, 111, + 180, 101, 179, 246, 5, 243, 112, 196, 44, 146, 16, 128, 155, 80, 106, + 147, 110, 87, 96, 17, 243, 247, 21, 87, 149, 78, 248, 20, 153, 249, + 196, 11, 177, 96, 227, 185, 136, 7, 244, 54, 177, 91, 192, 193, 111, + 21, 159, 105, 143, 236, 167, 215, 244, 121, 207, 245, 202, 161, 215, 45, + 233, 32, 123, 220, 57, 34, 171, 115, 37, 163, 75, 253, 140, 232, 51, + 143, 204, 252, 146, 168, 85, 148, 201, 161, 181, 231, 125, 44, 172, 79, + 210, 12, 147, 82, 38, 254, 157, 225, 167, 230, 182, 123, 63, 141, 146, + 152, 136, 190, 80, 156, 163, 231, 33, 184, 58, 200, 134, 28, 70, 202, + 88, 195, 39, 224, 159, 154, 206, 183, 11, 96, 102, 136, 26, 238, 179, + 189, 226, 18, 30, 188, 148, 25, 3, 252, 154, 142, 147, 145, 126, 11, + 55, 1, 3, 108, 144, 55, 251, 167, 54, 127, 180, 216, 77, 70, 138, + 95, 166, 90, 48, 2, 211, 236, 235, 131, 107, 251, 91, 238, 255, 0, + 113, 41, 243, 14, 241, 252, 163, 99, 74, 25, 172, 87, 125, 36, 203, + 96, 189, 125, 222, 165, 138, 25, 76, 136, 67, 137, 161, 22, 232, 31, + 5, 96, 146, 214, 146, 21, 181, 198, 199, 34, 190, 63, 191, 201, 104, + 116, 123, 201, 64, 128, 84, 139, 86, 102, 244, 241, 162, 126, 4, 9, + 132, 2, 53, 113, 21, 1, 95, 7, 212, 123, 252, 100, 87, 78, 71, + 28, 131, 135, 183, 72, 196, 33, 66, 237, 12, 135, 58, 102, 69, 234, + 214, 244, 57, 44, 181, 120, 156, 218, 99, 146, 97, 15, 77, 113, 179, + 142, 113, 226, 38, 72, 128, 211, 160, 95, 52, 181, 30, 200, 64, 234, + 8, 229, 150, 219, 225, 30, 162, 223, 52, 242, 29, 31, 226, 91, 102, + 235, 127, 213, 105, 123, 11, 172, 190, 152, 59, 69, 1, 253, 126, 19, + 145, 99, 33, 26, 198, 80, 74, 47, 59, 77, 158, 60, 231, 51, 65, + 145, 210, 232, 71, 100, 73, 71, 176, 239, 42, 124, 176, 31, 254, 64, + 223, 51, 195, 108, 165, 78, 202, 174, 212, 32, 157, 58, 145, 133, 84, + 230, 17, 206, 107, 72, 89, 129, 240, 179, 56, 231, 218, 55, 236, 231, + 122, 137, 50, 245, 171, 107, 223, 86, 17, 155, 68, 241, 220, 120, 38, + 95, 74, 110, 214, 202, 223, 60, 35, 120, 33, 79, 32, 58, 77, 28, + 121, 180, 99, 64, 201, 81, 156, 37, 28, 254, 219, 153, 74, 200, 178, + 70, 252, 140, 137, 127, 195, 238, 103, 228, 44, 96, 216, 12, 198, 246, + 206, 130, 67, 71, 129, 114, 145, 168, 64, 145, 128, 169, 169, 11, 28, + 145, 64, 144, 92, 206, 171, 135, 128, 121, 84, 142, 75, 37, 199, 208, + 97, 243, 114, 58, 152, 244, 201, 119, 76, 178, 3, 128, 185, 252, 146, + 38, 165, 53, 186, 175, 102, 81, 233, 115, 190, 227, 19, 31, 134, 132, + 114, 24, 2, 21, 249, 228, 128, 74, 119, 144, 74, 43, 168, 201, 131, + 175, 254, 42, 103, 23, 94, 138, 61, 40, 129, 252, 51, 80, 150, 135, + 133, 55, 54, 122, 187, 93, 42, 9, 154, 50, 93, 143, 241, 26, 80, + 108, 7, 51, 144, 218, 129, 48, 168, 66, 150, 108, 86, 127, 156, 232, + 5, 54, 7, 182, 73, 210, 46, 115, 84, 145, 113, 254, 195, 166, 106, + 119, 116, 233, 154, 170, 185, 255, 99, 223, 133, 115, 122, 10, 210, 76, + 123, 92, 28, 159, 138, 133, 70, 126, 240, 215, 36, 119, 180, 221, 156, + 46, 89, 71, 1, 175, 247, 102, 107, 67, 136, 62, 142, 197, 212, 50, + 159, 107, 254, 44, 30, 59, 234, 51, 55, 35, 103, 170, 231, 41, 111, + 178, 14, 27, 77, 40, 43, 88, 199, 148, 211, 140, 17, 59, 84, 182, + 195, 92, 230, 109, 218, 165, 117, 39, 234, 195, 94, 70, 151, 202, 167, + 17, 179, 205, 213, 68, 102, 11, 120, 210, 150, 47, 150, 115, 186, 81, + 137, 53, 132, 36, 224, 107, 115, 100, 143, 118, 212, 239, 176, 139, 243, + 36, 235, 189, 48, 43, 25, 130, 143, 2, 165, 117, 173, 63, 189, 86, + 180, 83, 22, 204, 226, 141, 78, 199, 226, 195, 94, 183, 88, 103, 180, + 205, 96, 254, 235, 65, 144, 231, 11, 193, 111, 52, 129, 110, 125, 68, + 42, 234, 138, 118, 112, 69, 178, 191, 213, 115, 230, 221, 222, 97, 60, + 187, 154, 161, 24, 25, 147, 205, 69, 47, 45, 241, 84, 238, 249, 129, + 6, 107, 126, 245, 187, 62, 247, 159, 178, 6, 100, 80, 244, 229, 53, + 83, 186, 208, 116, 164, 83, 217, 76, 21, 191, 207, 44, 19, 21, 253, + 153, 84, 92, 96, 41, 9, 10, 187, 82, 155, 222, 146, 71, 130, 217, + 44, 75, 51, 56, 119, 4, 77, 141, 46, 0, 97, 157, 176, 42, 30, + 102, 41, 39, 48, 191, 201, 226, 156, 80, 24, 28, 109, 150, 215, 254, + 211, 17, 87, 114, 111, 250, 7, 60, 233, 55, 121, 139, 121, 167, 213, + 0, 106, 85, 183, 122, 254, 65, 52, 95, 129, 197, 156, 125, 235, 47, + 46, 191, 44, 139, 244, 217, 239, 216, 228, 14, 234, 216, 19, 13, 124, + 221, 166, 60, 124, 187, 83, 242, 154, 57, 182, 125, 172, 123, 100, 165, + 156, 196, 254, 19, 73, 234, 83, 209, 242, 17, 54, 12, 115, 163, 148, + 32, 146, 41, 86, 171, 11, 77, 71, 162, 203, 42, 153, 71, 217, 254, + 31, 214, 184, 58, 41, 245, 132, 249, 54, 172, 163, 225, 203, 205, 52, + 64, 105, 110, 128, 162, 176, 118, 243, 173, 173, 69, 11, 98, 19, 183, + 83, 247, 5, 137, 91, 192, 122, 15, 151, 125, 192, 220, 207, 6, 118, + 84, 8, 86, 196, 88, 59, 246, 8, 250, 10, 27, 7, 233, 225, 220, + 213, 222, 239, 138, 177, 173, 63, 58, 16, 68, 113, 218, 216, 24, 25, + 147, 176, 232, 249, 135, 194, 5, 26, 37, 110, 251, 13, 178, 55, 28, + 116, 84, 162, 145, 153, 117, 194, 41, 16, 179, 64, 121, 52, 127, 232, + 232, 53, 135, 212, 72, 122, 32, 112, 152, 10, 241, 217, 107, 3, 99, + 91, 115, 88, 107, 146, 120, 22, 156, 153, 68, 104, 212, 39, 76, 144, + 54, 58, 61, 91, 212, 96, 139, 35, 184, 37, 17, 55, 223, 15, 75, + 18, 55, 124, 232, 21, 10, 147, 24, 221, 23, 87, 186, 27, 152, 51, + 247, 112, 63, 56, 89, 180, 195, 67, 89, 105, 236, 102, 235, 57, 17, + 45, 151, 91, 186, 224, 171, 11, 149, 111, 102, 149, 50, 144, 250, 243, + 179, 20, 251, 203, 229, 228, 190, 33, 209, 254, 237, 112, 60, 222, 179, + 19, 224, 4, 78, 246, 239, 248, 80, 169, 180, 71, 190, 29, 178, 253, + 130, 207, 77, 202, 16, 108, 142, 201, 238, 135, 247, 155, 237, 187, 243, + 139, 247, 21, 141, 125, 213, 34, 106, 183, 4, 125, 40, 8, 104, 128, + 73, 121, 163, 122, 190, 121, 152, 45, 174, 52, 181, 139, 254, 242, 146, + 36, 163, 183, 147, 27, 234, 160, 222, 93, 232, 251, 153, 185, 158, 215, + 9, 86, 49, 72, 87, 154, 88, 169, 82, 186, 198, 240, 104, 92, 129, + 217, 12, 124, 113, 206, 117, 116, 149, 159, 149, 124, 219, 138, 96, 50, + 177, 145, 244, 8, 232, 218, 158, 22, 70, 31, 52, 226, 90, 7, 187, + 135, 66, 35, 193, 62, 122, 72, 201, 100, 66, 137, 236, 158, 187, 195, + 107, 234, 27, 155, 187, 221, 131, 2, 167, 165, 18, 225, 67, 72, 190, + 63, 136, 69, 32, 185, 181, 234, 159, 57, 4, 101, 127, 121, 3, 2, + 235, 220, 44, 245, 160, 71, 64, 175, 55, 135, 83, 250, 217, 239, 121, + 81, 181, 160, 151, 70, 56, 101, 74, 169, 142, 167, 10, 179, 233, 140, + 156, 203, 110, 15, 95, 15, 8, 169, 164, 40, 43, 50, 148, 216, 167, + 161, 36, 142, 145, 126, 236, 167, 154, 120, 110, 239, 138, 53, 152, 233, + 115, 33, 203, 253, 249, 174, 176, 43, 0, 178, 120, 133, 211, 252, 95, + 221, 221, 185, 36, 145, 53, 15, 125, 26, 232, 42, 249, 86, 8, 205, + 183, 114, 81, 62, 187, 162, 4, 251, 26, 79, 159, 156, 42, 7, 83, + 97, 14, 124, 38, 252, 215, 34, 141, 252, 226, 61, 237, 252, 114, 117, + 187, 21, 53, 236, 151, 9, 147, 40, 68, 63, 10, 166, 84, 236, 0, + 169, 196, 239, 107, 214, 32, 53, 142, 172, 22, 245, 22, 154, 150, 105, + 223, 5, 178, 48, 151, 191, 251, 63, 50, 255, 54, 206, 221, 49, 249, + 35, 133, 197, 248, 47, 155, 185, 108, 172, 179, 104, 121, 72, 25, 83, + 78, 205, 136, 136, 250, 47, 68, 179, 166, 229, 237, 212, 214, 104, 191, + 88, 159, 43, 30, 168, 89, 25, 137, 79, 142, 7, 237, 19, 230, 87, + 255, 20, 182, 27, 217, 197, 80, 45, 119, 115, 241, 181, 96, 155, 160, + 62, 57, 162, 103, 171, 196, 214, 243, 194, 41, 223, 187, 22, 4, 157, + 139, 4, 98, 193, 171, 27, 217, 8, 27, 100, 222, 30, 235, 4, 127, + 97, 243, 231, 102, 37, 47, 237, 58, 79, 189, 143, 193, 144, 0, 150, + 183, 0, 100, 29, 130, 166, 233, 150, 241, 61, 175, 23, 56, 239, 24, + 59, 143, 79, 27, 23, 124, 4, 9, 207, 73, 21, 181, 227, 80, 149, + 79, 226, 85, 110, 255, 126, 11, 66, 167, 203, 91, 50, 255, 189, 91, + 50, 79, 115, 160, 201, 112, 13, 25, 100, 68, 8, 218, 253, 185, 90, + 85, 79, 74, 27, 123, 23, 229, 57, 97, 91, 127, 106, 189, 186, 213, + 74, 233, 11, 137, 181, 51, 79, 108, 16, 145, 67, 82, 93, 245, 199, + 182, 112, 114, 208, 100, 151, 117, 222, 34, 187, 232, 137, 114, 251, 117, + 217, 153, 37, 215, 22, 113, 249, 198, 21, 184, 245, 107, 107, 27, 224, + 2, 158, 165, 155, 155, 104, 108, 215, 105, 154, 76, 171, 175, 245, 245, + 206, 227, 85, 231, 208, 127, 196, 191, 48, 150, 44, 38, 194, 191, 59, + 10, 10, 175, 148, 162, 163, 122, 167, 207, 145, 105, 234, 57, 199, 40, + 112, 205, 98, 242, 238, 38, 68, 192, 158, 91, 141, 80, 54, 12, 193, + 215, 8, 201, 136, 185, 229, 109, 175, 25, 245, 209, 147, 197, 233, 17, + 80, 189, 150, 49, 218, 246, 78, 30, 112, 64, 212, 109, 75, 232, 228, + 171, 102, 239, 219, 152, 158, 217, 121, 43, 174, 99, 82, 7, 113, 222, + 107, 164, 30, 205, 236, 152, 19, 157, 60, 82, 165, 34, 117, 23, 166, + 185, 209, 212, 7, 250, 32, 167, 172, 234, 117, 139, 110, 191, 14, 44, + 158, 95, 115, 126, 115, 234, 209, 174, 95, 163, 117, 243, 203, 182, 113, + 182, 4, 33, 100, 143, 45, 225, 128, 69, 73, 183, 246, 91, 28, 57, + 20, 1, 175, 125, 128, 38, 4, 54, 93, 255, 28, 106, 122, 42, 104, + 35, 79, 242, 117, 75, 237, 149, 28, 178, 84, 224, 183, 116, 254, 120, + 3, 70, 154, 8, 57, 132, 86, 14, 119, 4, 130, 3, 155, 233, 177, + 27, 28, 233, 148, 205, 109, 29, 39, 33, 0, 160, 214, 129, 207, 180, + 227, 131, 109, 29, 136, 60, 47, 234, 99, 52, 57, 228, 87, 114, 138, + 185, 19, 148, 152, 114, 48, 12, 231, 182, 67, 228, 94, 253, 199, 34, + 171, 238, 77, 59, 83, 128, 137, 52, 74, 35, 236, 38, 181, 165, 106, + 161, 12, 100, 76, 100, 237, 69, 13, 211, 210, 117, 185, 178, 17, 231, + 85, 134, 101, 66, 9, 71, 42, 88, 125, 183, 106, 217, 38, 175, 131, + 139, 75, 163, 134, 149, 70, 120, 146, 156, 196, 151, 154, 242, 232, 163, + 33, 206, 179, 123, 102, 249, 28, 11, 115, 88, 20, 192, 244, 74, 33, + 165, 176, 215, 142, 87, 229, 188, 139, 225, 192, 111, 203, 55, 25, 241, + 218, 22, 119, 121, 89, 69, 116, 214, 254, 94, 137, 253, 168, 156, 155, + 34, 150, 56, 126, 229, 79, 49, 150, 109, 99, 194, 179, 40, 114, 63, + 220, 161, 254, 73, 154, 211, 245, 21, 255, 63, 209, 45, 135, 86, 234, + 184, 213, 95, 28, 28, 244, 42, 66, 200, 83, 190, 81, 247, 24, 153, + 129, 180, 45, 159, 132, 4, 187, 171, 88, 178, 140, 143, 60, 212, 187, + 102, 125, 212, 66, 85, 133, 248, 58, 240, 126, 196, 7, 68, 71, 137, + 202, 116, 79, 137, 229, 156, 122, 69, 94, 146, 226, 198, 191, 116, 96, + 33, 50, 189, 32, 4, 5, 92, 116, 29, 122, 137, 140, 42, 199, 138, + 59, 38, 48, 178, 115, 216, 201, 225, 170, 183, 55, 248, 151, 58, 187, + 184, 152, 106, 130, 176, 52, 36, 73, 99, 77, 12, 166, 238, 52, 231, + 86, 144, 91, 2, 248, 246, 127, 5, 182, 201, 149, 205, 246, 73, 158, + 98, 4, 20, 138, 51, 176, 71, 169, 209, 237, 230, 100, 244, 243, 107, + 80, 113, 246, 233, 115, 26, 175, 72, 11, 38, 165, 68, 108, 163, 27, + 38, 43, 246, 18, 153, 208, 118, 235, 201, 225, 235, 17, 65, 53, 173, + 72, 230, 232, 105, 215, 41, 180, 191, 61, 31, 28, 214, 219, 29, 209, + 90, 206, 232, 80, 22, 101, 237, 61, 105, 128, 249, 224, 23, 242, 8, + 250, 190, 130, 207, 148, 102, 166, 241, 67, 58, 8, 61, 43, 58, 21, + 148, 188, 40, 139, 116, 11, 79, 186, 85, 9, 240, 164, 117, 238, 157, + 59, 244, 184, 250, 69, 143, 88, 147, 126, 237, 37, 6, 159, 130, 18, + 72, 138, 251, 58, 136, 155, 92, 42, 173, 253, 171, 166, 57, 160, 162, + 211, 173, 241, 66, 121, 37, 176, 180, 140, 117, 240, 132, 181, 16, 234, + 173, 59, 98, 9, 123, 31, 18, 165, 45, 182, 89, 112, 130, 79, 53, + 10, 120, 252, 52, 114, 58, 57, 146, 87, 222, 154, 231, 215, 219, 84, + 246, 85, 57, 206, 180, 66, 125, 212, 226, 45, 212, 74, 132, 27, 185, + 34, 150, 235, 119, 218, 77, 70, 235, 171, 112, 123, 174, 87, 160, 89, + 86, 219, 3, 47, 39, 240, 116, 102, 70, 107, 31, 55, 102, 167, 4, + 101, 119, 146, 176, 237, 168, 123, 84, 118, 218, 112, 118, 52, 18, 56, + 120, 216, 66, 187, 31, 12, 205, 53, 119, 26, 225, 215, 195, 226, 2, + 201, 75, 105, 65, 81, 45, 239, 114, 182, 155, 135, 95, 153, 240, 143, + 109, 109, 219, 218, 224, 26, 175, 35, 86, 128, 209, 255, 71, 26, 86, + 115, 22, 70, 167, 3, 105, 128, 160, 142, 163, 149, 168, 112, 8, 12, + 14, 119, 65, 43, 183, 105, 197, 156, 207, 226, 231, 239, 48, 62, 4, + 49, 169, 234, 123, 26, 164, 98, 119, 33, 170, 43, 39, 6, 128, 15, + 217, 209, 229, 109, 240, 180, 150, 169, 252, 118, 242, 240, 108, 204, 24, + 107, 199, 108, 184, 110, 208, 52, 175, 245, 241, 123, 90, 123, 150, 211, + 56, 75, 247, 140, 187, 53, 172, 174, 90, 223, 117, 128, 254, 97, 235, + 170, 193, 190, 34, 215, 109, 18, 109, 13, 118, 134, 45, 22, 100, 73, + 141, 199, 203, 124, 169, 191, 102, 108, 250, 201, 188, 39, 236, 74, 154, + 159, 170, 137, 69, 63, 82, 44, 177, 240, 178, 157, 53, 89, 6, 99, + 5, 13, 134, 169, 195, 121, 229, 179, 212, 123, 198, 131, 96, 250, 187, + 94, 106, 51, 219, 16, 147, 227, 108, 124, 240, 237, 172, 43, 83, 157, + 124, 246, 118, 249, 175, 43, 235, 221, 18, 24, 166, 127, 255, 210, 199, + 57, 134, 73, 141, 254, 219, 209, 19, 217, 36, 25, 104, 225, 133, 24, + 3, 130, 62, 103, 148, 212, 243, 122, 52, 213, 102, 26, 144, 227, 189, + 143, 151, 230, 98, 87, 214, 147, 110, 31, 43, 248, 142, 126, 199, 95, + 170, 186, 67, 225, 208, 49, 50, 159, 108, 174, 152, 118, 43, 193, 187, + 13, 63, 141, 94, 118, 113, 200, 75, 165, 117, 247, 53, 209, 151, 163, + 241, 24, 23, 252, 149, 18, 16, 77, 69, 208, 219, 254, 159, 220, 62, + 99, 26, 31, 231, 88, 150, 219, 168, 151, 178, 181, 234, 141, 124, 130, + 37, 1, 21, 195, 96, 139, 179, 136, 145, 29, 159, 213, 248, 10, 174, + 213, 22, 180, 250, 251, 30, 42, 228, 139, 178, 90, 19, 228, 100, 120, + 205, 54, 6, 189, 213, 203, 193, 43, 218, 211, 27, 93, 76, 181, 127, + 159, 43, 96, 233, 249, 118, 252, 127, 59, 67, 82, 65, 48, 100, 170, + 227, 197, 141, 49, 153, 31, 189, 176, 102, 14, 101, 152, 242, 25, 251, + 47, 242, 67, 114, 61, 184, 29, 60, 163, 186, 19, 17, 36, 42, 76, + 31, 246, 195, 224, 206, 221, 89, 69, 218, 112, 148, 98, 60, 154, 28, + 199, 206, 59, 157, 199, 18, 214, 53, 217, 211, 254, 128, 220, 189, 96, + 134, 57, 73, 152, 41, 52, 0, 93, 23, 215, 124, 209, 63, 252, 134, + 64, 224, 183, 197, 94, 46, 214, 214, 233, 202, 211, 155, 236, 31, 238, + 220, 132, 54, 88, 122, 140, 146, 11, 88, 164, 238, 156, 72, 239, 225, + 82, 157, 144, 27, 240, 5, 231, 89, 25, 63, 50, 227, 219, 3, 5, + 218, 125, 13, 151, 59, 40, 162, 211, 79, 33, 157, 76, 245, 55, 229, + 140, 88, 50, 221, 42, 52, 162, 106, 212, 125, 187, 254, 0, 126, 156, + 98, 149, 35, 94, 247, 215, 131, 86, 116, 176, 3, 56, 30, 26, 138, + 113, 71, 255, 77, 143, 52, 111, 20, 113, 47, 88, 104, 110, 225, 164, + 226, 8, 74, 180, 182, 183, 206, 215, 84, 12, 46, 61, 177, 168, 102, + 244, 93, 199, 243, 247, 214, 227, 131, 185, 103, 131, 49, 3, 49, 18, + 74, 111, 249, 150, 2, 113, 165, 221, 7, 93, 110, 59, 242, 246, 243, + 168, 45, 182, 45, 140, 19, 41, 72, 10, 164, 190, 17, 174, 216, 36, + 216, 3, 1, 198, 230, 150, 19, 0, 114, 10, 75, 166, 138, 161, 0, + 113, 132, 128, 116, 201, 147, 42, 63, 211, 56, 195, 45, 125, 69, 55, + 177, 149, 228, 7, 78, 217, 133, 35, 108, 182, 210, 185, 124, 187, 167, + 95, 246, 202, 121, 167, 61, 61, 239, 37, 153, 143, 109, 126, 42, 69, + 174, 253, 132, 161, 118, 14, 10, 7, 141, 92, 188, 60, 81, 174, 93, + 28, 58, 223, 217, 119, 84, 213, 230, 132, 248, 31, 47, 141, 88, 249, + 28, 205, 19, 5, 183, 167, 88, 177, 66, 242, 50, 66, 255, 31, 218, + 182, 209, 12, 246, 151, 87, 252, 211, 231, 32, 120, 95, 76, 180, 20, + 124, 238, 190, 60, 165, 239, 207, 37, 221, 115, 145, 126, 61, 51, 141, + 54, 64, 219, 247, 164, 74, 19, 7, 93, 27, 150, 115, 224, 228, 172, + 232, 113, 6, 148, 40, 229, 228, 32, 17, 92, 215, 75, 64, 50, 235, + 127, 109, 127, 152, 99, 73, 55, 210, 245, 55, 37, 236, 244, 136, 154, + 177, 231, 119, 30, 187, 225, 83, 240, 237, 183, 80, 245, 10, 129, 181, + 156, 137, 27, 79, 97, 145, 78, 100, 127, 79, 224, 218, 244, 49, 70, + 225, 131, 138, 102, 32, 110, 123, 110, 49, 161, 246, 27, 99, 115, 171, + 159, 45, 44, 15, 108, 51, 173, 24, 4, 170, 76, 255, 41, 27, 0, + 27, 35, 61, 145, 246, 241, 138, 152, 47, 51, 2, 153, 171, 79, 81, + 176, 123, 63, 192, 74, 27, 243, 22, 51, 86, 243, 48, 24, 129, 162, + 69, 218, 102, 143, 135, 107, 52, 182, 189, 25, 142, 206, 227, 144, 140, + 57, 124, 252, 97, 157, 61, 55, 43, 76, 52, 197, 146, 154, 83, 0, + 150, 16, 85, 76, 230, 32, 23, 86, 31, 241, 251, 88, 183, 195, 242, + 192, 181, 160, 229, 185, 229, 186, 72, 219, 249, 142, 111, 178, 42, 163, + 117, 93, 31, 171, 161, 227, 194, 51, 36, 53, 116, 0, 233, 37, 150, + 128, 144, 8, 168, 198, 68, 35, 57, 148, 64, 207, 148, 64, 213, 174, + 223, 174, 129, 171, 81, 132, 1, 90, 208, 100, 105, 209, 10, 209, 228, + 138, 169, 82, 197, 37, 172, 32, 222, 70, 180, 78, 59, 234, 106, 250, + 76, 237, 59, 173, 178, 212, 151, 107, 131, 245, 14, 218, 71, 56, 187, + 138, 74, 101, 15, 32, 18, 131, 21, 57, 6, 32, 115, 75, 244, 119, + 168, 158, 154, 147, 72, 143, 232, 51, 49, 181, 115, 27, 96, 141, 93, + 202, 36, 38, 23, 61, 150, 171, 239, 66, 13, 183, 126, 24, 99, 175, + 110, 189, 88, 170, 252, 139, 127, 179, 106, 243, 140, 208, 243, 110, 145, + 64, 161, 4, 191, 209, 211, 72, 135, 24, 121, 210, 109, 42, 134, 9, + 160, 241, 186, 161, 203, 85, 212, 3, 23, 228, 75, 147, 133, 9, 100, + 65, 195, 165, 252, 229, 177, 199, 170, 63, 194, 247, 76, 171, 66, 203, + 193, 3, 74, 91, 86, 31, 85, 185, 52, 27, 175, 175, 84, 137, 51, + 233, 26, 52, 16, 75, 185, 95, 35, 167, 251, 67, 83, 217, 9, 241, + 43, 252, 76, 242, 101, 115, 133, 173, 154, 251, 33, 116, 118, 243, 152, + 63, 173, 153, 63, 75, 90, 106, 203, 197, 141, 149, 127, 9, 133, 218, + 223, 193, 62, 19, 48, 231, 45, 146, 21, 164, 1, 42, 43, 187, 75, + 88, 20, 39, 233, 165, 20, 76, 26, 145, 226, 155, 106, 187, 26, 195, + 23, 212, 49, 60, 145, 149, 37, 167, 73, 106, 203, 228, 185, 223, 108, + 12, 187, 239, 88, 126, 27, 154, 235, 203, 207, 187, 1, 114, 12, 112, + 238, 17, 185, 120, 227, 177, 242, 191, 10, 18, 241, 143, 21, 239, 31, + 150, 102, 60, 15, 167, 209, 64, 117, 237, 45, 45, 217, 147, 32, 28, + 98, 221, 12, 20, 2, 176, 213, 147, 95, 31, 176, 64, 237, 55, 53, + 44, 105, 249, 43, 111, 73, 162, 180, 4, 62, 66, 118, 36, 215, 254, + 183, 249, 170, 39, 21, 69, 147, 65, 105, 136, 232, 160, 174, 141, 84, + 222, 189, 33, 250, 197, 226, 170, 246, 127, 87, 25, 10, 181, 46, 151, + 216, 250, 227, 131, 115, 64, 217, 11, 190, 199, 122, 148, 242, 221, 46, + 169, 45, 54, 9, 90, 251, 94, 61, 211, 30, 67, 199, 115, 204, 4, + 199, 203, 109, 137, 60, 223, 206, 3, 144, 170, 215, 224, 72, 247, 128, + 64, 147, 140, 223, 125, 20, 67, 248, 253, 206, 5, 44, 72, 160, 33, + 20, 166, 80, 123, 194, 220, 16, 134, 206, 24, 66, 217, 177, 231, 223, + 66, 251, 253, 235, 180, 36, 205, 107, 173, 198, 108, 83, 120, 82, 128, + 120, 245, 67, 23, 248, 203, 28, 14, 75, 235, 117, 111, 34, 127, 39, + 52, 169, 101, 28, 144, 123, 20, 197, 116, 96, 141, 201, 246, 61, 101, + 132, 127, 98, 178, 186, 139, 226, 132, 55, 229, 116, 75, 43, 241, 119, + 139, 104, 169, 215, 199, 226, 113, 178, 214, 153, 159, 139, 208, 106, 136, + 77, 149, 72, 248, 49, 179, 98, 110, 192, 105, 128, 27, 245, 36, 215, + 210, 187, 98, 45, 92, 51, 238, 57, 153, 113, 21, 86, 147, 122, 138, + 3, 70, 66, 84, 135, 96, 199, 23, 123, 105, 226, 81, 171, 23, 228, + 73, 234, 240, 50, 135, 108, 143, 140, 247, 26, 245, 43, 94, 183, 180, + 240, 235, 159, 127, 57, 119, 6, 34, 58, 112, 170, 62, 37, 57, 171, + 56, 223, 147, 98, 204, 183, 146, 154, 85, 172, 49, 76, 84, 231, 138, + 117, 46, 81, 57, 240, 43, 102, 130, 234, 208, 237, 88, 164, 124, 128, + 104, 167, 38, 88, 73, 7, 131, 234, 67, 4, 213, 8, 211, 84, 81, + 197, 133, 123, 247, 254, 101, 230, 68, 245, 220, 193, 152, 208, 91, 63, + 109, 228, 184, 117, 28, 114, 146, 98, 142, 195, 4, 139, 48, 186, 242, + 211, 124, 175, 224, 69, 38, 35, 14, 253, 245, 242, 184, 138, 4, 206, + 221, 15, 125, 189, 97, 127, 46, 212, 10, 55, 1, 69, 56, 31, 180, + 245, 93, 175, 58, 220, 3, 164, 88, 22, 74, 157, 113, 246, 189, 65, + 97, 235, 189, 126, 106, 50, 120, 180, 71, 120, 11, 200, 48, 19, 57, + 236, 64, 234, 180, 243, 32, 228, 127, 228, 253, 42, 20, 238, 109, 161, + 67, 73, 52, 35, 126, 197, 5, 117, 12, 86, 215, 168, 60, 159, 4, + 74, 193, 92, 104, 190, 30, 185, 187, 153, 208, 87, 245, 62, 200, 16, + 204, 189, 141, 188, 226, 187, 144, 101, 51, 86, 204, 26, 22, 246, 230, + 176, 81, 195, 19, 126, 58, 91, 30, 204, 178, 248, 217, 81, 155, 68, + 145, 42, 9, 22, 68, 22, 107, 25, 86, 153, 225, 224, 143, 128, 94, + 164, 65, 168, 173, 178, 181, 97, 100, 159, 212, 164, 213, 75, 25, 35, + 225, 133, 5, 243, 65, 39, 158, 155, 153, 3, 81, 53, 165, 153, 52, + 237, 226, 122, 245, 248, 255, 60, 13, 2, 41, 202, 232, 184, 57, 152, + 133, 105, 159, 33, 220, 49, 135, 76, 198, 212, 70, 168, 43, 233, 168, + 180, 88, 139, 246, 219, 120, 12, 161, 238, 88, 228, 9, 77, 236, 129, + 227, 73, 91, 104, 222, 104, 205, 28, 140, 205, 167, 178, 222, 150, 197, + 139, 205, 66, 245, 48, 241, 80, 225, 218, 27, 159, 205, 64, 148, 107, + 54, 46, 190, 61, 0, 161, 228, 124, 123, 18, 170, 35, 46, 53, 61, + 171, 154, 121, 253, 187, 158, 102, 194, 132, 94, 49, 239, 86, 57, 205, + 129, 185, 234, 50, 56, 219, 36, 56, 77, 247, 160, 75, 239, 154, 122, + 34, 34, 143, 66, 53, 20, 212, 246, 3, 79, 229, 119, 50, 132, 221, + 187, 208, 82, 149, 183, 151, 200, 181, 97, 12, 4, 136, 233, 171, 247, + 128, 211, 234, 122, 152, 140, 221, 82, 83, 98, 185, 95, 122, 23, 120, + 124, 112, 240, 39, 16, 49, 140, 225, 135, 88, 69, 96, 125, 246, 99, + 224, 165, 148, 178, 35, 63, 192, 217, 39, 153, 63, 32, 109, 142, 224, + 12, 132, 10, 55, 49, 140, 217, 141, 113, 10, 72, 92, 37, 121, 96, + 72, 35, 184, 70, 156, 225, 140, 110, 150, 24, 95, 209, 172, 140, 187, + 10, 154, 58, 113, 215, 254, 36, 101, 155, 5, 46, 249, 59, 238, 164, + 25, 212, 35, 5, 87, 45, 183, 124, 174, 6, 182, 241, 206, 128, 118, + 190, 239, 160, 140, 2, 149, 90, 185, 125, 192, 8, 75, 105, 184, 51, + 2, 11, 198, 85, 249, 100, 88, 73, 229, 189, 80, 81, 244, 167, 62, + 110, 52, 13, 254, 122, 144, 170, 206, 64, 239, 191, 0, 73, 235, 143, + 120, 81, 33, 87, 83, 154, 156, 163, 31, 172, 104, 196, 78, 144, 100, + 3, 54, 202, 67, 177, 217, 80, 207, 235, 48, 12, 127, 78, 116, 96, + 238, 226, 97, 154, 97, 120, 19, 33, 89, 14, 160, 149, 243, 246, 196, + 219, 74, 113, 225, 92, 32, 216, 10, 50, 176, 127, 113, 63, 157, 143, + 190, 245, 94, 244, 103, 85, 143, 162, 61, 177, 203, 240, 204, 55, 183, + 226, 251, 205, 53, 25, 19, 197, 160, 34, 42, 128, 169, 80, 11, 210, + 133, 105, 128, 175, 107, 72, 222, 130, 95, 209, 93, 161, 16, 35, 244, + 178, 236, 100, 20, 129, 190, 118, 246, 108, 68, 206, 105, 58, 91, 90, + 149, 0, 168, 95, 115, 63, 54, 240, 7, 164, 186, 100, 76, 81, 225, + 58, 178, 14, 46, 79, 31, 226, 180, 34, 164, 191, 84, 22, 244, 90, + 105, 13, 83, 133, 230, 81, 45, 49, 157, 84, 22, 168, 167, 205, 219, + 123, 209, 80, 87, 205, 180, 152, 162, 225, 229, 142, 72, 250, 240, 134, + 185, 145, 112, 149, 25, 185, 198, 174, 213, 83, 145, 151, 228, 138, 96, + 152, 242, 251, 227, 53, 229, 136, 37, 147, 184, 141, 104, 221, 51, 219, + 21, 93, 42, 253, 183, 57, 203, 92, 7, 240, 82, 171, 103, 167, 115, + 233, 175, 142, 8, 112, 10, 56, 44, 192, 231, 79, 18, 8, 68, 128, + 106, 121, 225, 149, 30, 210, 173, 86, 240, 30, 138, 197, 89, 213, 63, + 161, 106, 65, 141, 57, 96, 102, 191, 28, 56, 9, 201, 3, 248, 113, + 118, 51, 121, 247, 83, 135, 51, 54, 14, 19, 49, 175, 59, 206, 112, + 172, 155, 243, 75, 19, 154, 102, 188, 11, 76, 198, 136, 11, 44, 154, + 139, 48, 34, 194, 116, 170, 198, 127, 132, 231, 200, 44, 61, 210, 93, + 20, 159, 201, 183, 39, 78, 178, 225, 112, 50, 254, 198, 200, 207, 18, + 196, 209, 222, 252, 67, 56, 186, 71, 24, 210, 30, 105, 32, 102, 99, + 239, 195, 191, 131, 246, 65, 121, 91, 66, 112, 28, 170, 67, 28, 144, + 187, 46, 117, 97, 187, 240, 250, 118, 249, 68, 151, 248, 219, 208, 103, + 242, 166, 122, 220, 59, 50, 215, 90, 160, 15, 15, 96, 89, 167, 87, + 22, 253, 137, 202, 126, 145, 162, 171, 97, 181, 102, 50, 107, 230, 31, + 183, 133, 105, 23, 233, 228, 13, 247, 169, 79, 53, 76, 138, 29, 51, + 53, 221, 126, 199, 47, 153, 184, 183, 198, 109, 192, 203, 178, 26, 115, + 177, 118, 158, 181, 43, 48, 174, 195, 253, 43, 18, 172, 171, 101, 129, + 255, 63, 41, 49, 160, 15, 86, 108, 235, 87, 115, 36, 93, 46, 164, + 152, 49, 31, 137, 125, 174, 115, 196, 240, 117, 226, 183, 151, 73, 30, + 75, 59, 61, 160, 96, 157, 215, 246, 160, 136, 82, 95, 181, 13, 207, + 158, 106, 81, 18, 27, 182, 35, 249, 72, 148, 128, 15, 82, 68, 197, + 0, 159, 149, 239, 34, 250, 171, 70, 200, 219, 214, 18, 134, 14, 71, + 69, 219, 145, 208, 125, 65, 232, 201, 212, 148, 39, 208, 142, 54, 38, + 32, 154, 124, 35, 76, 173, 240, 232, 23, 74, 183, 118, 137, 244, 180, + 149, 195, 198, 105, 25, 246, 236, 155, 88, 230, 134, 32, 126, 183, 72, + 127, 129, 139, 161, 224, 222, 127, 107, 201, 78, 227, 207, 10, 48, 9, + 199, 240, 176, 49, 165, 95, 200, 101, 89, 40, 229, 28, 8, 41, 193, + 173, 218, 63, 229, 216, 170, 82, 90, 162, 243, 0, 125, 248, 79, 186, + 228, 44, 197, 178, 58, 196, 251, 85, 19, 254, 130, 110, 78, 91, 217, + 146, 16, 90, 221, 6, 129, 173, 73, 56, 77, 72, 19, 8, 14, 129, + 84, 19, 88, 146, 252, 137, 165, 222, 7, 199, 107, 135, 13, 253, 137, + 180, 184, 240, 37, 238, 133, 135, 80, 170, 172, 60, 80, 94, 130, 246, + 166, 63, 181, 30, 103, 97, 138, 193, 148, 96, 82, 61, 47, 188, 230, + 118, 65, 74, 28, 123, 50, 73, 12, 187, 123, 129, 19, 95, 213, 61, + 153, 85, 243, 44, 195, 249, 250, 121, 175, 42, 187, 154, 233, 91, 217, + 49, 130, 129, 172, 250, 182, 203, 30, 93, 213, 217, 24, 28, 198, 4, + 208, 61, 207, 108, 120, 22, 39, 136, 252, 123, 15, 188, 34, 35, 177, + 35, 134, 178, 221, 217, 22, 51, 18, 22, 215, 47, 68, 120, 130, 0, + 192, 242, 170, 170, 202, 220, 179, 185, 81, 204, 10, 115, 181, 231, 246, + 172, 38, 43, 145, 56, 171, 219, 34, 17, 96, 165, 209, 53, 44, 68, + 74, 236, 249, 192, 35, 204, 123, 56, 118, 174, 172, 151, 249, 36, 21, + 133, 119, 237, 232, 61, 125, 6, 124, 200, 62, 68, 67, 40, 196, 202, + 84, 213, 160, 237, 85, 249, 125, 41, 187, 126, 48, 152, 124, 104, 211, + 127, 96, 167, 184, 23, 161, 68, 106, 119, 224, 226, 148, 234, 54, 155, + 168, 186, 193, 167, 15, 242, 100, 82, 15, 205, 247, 34, 24, 134, 152, + 115, 132, 114, 196, 0, 136, 242, 73, 91, 35, 90, 4, 161, 138, 163, + 21, 16, 244, 60, 158, 199, 246, 233, 150, 10, 142, 248, 196, 224, 129, + 8, 158, 81, 11, 92, 96, 197, 23, 45, 104, 235, 250, 9, 31, 47, + 153, 116, 22, 170, 186, 150, 46, 214, 246, 75, 116, 4, 242, 147, 168, + 177, 134, 143, 149, 36, 139, 224, 127, 143, 167, 208, 115, 158, 250, 132, + 4, 124, 204, 99, 217, 239, 97, 5, 38, 50, 17, 176, 171, 96, 92, + 88, 219, 195, 184, 160, 158, 175, 10, 175, 33, 245, 28, 55, 56, 207, + 47, 46, 114, 108, 196, 101, 93, 39, 227, 183, 40, 40, 109, 121, 123, + 90, 85, 162, 165, 227, 200, 238, 136, 223, 36, 77, 179, 45, 156, 51, + 95, 33, 15, 219, 71, 37, 98, 141, 150, 179, 78, 217, 221, 130, 186, + 155, 84, 146, 217, 210, 202, 91, 212, 50, 129, 188, 203, 28, 213, 10, + 230, 40, 47, 215, 77, 161, 88, 71, 56, 82, 124, 130, 249, 70, 139, + 142, 23, 78, 139, 252, 32, 223, 90, 214, 27, 94, 23, 12, 240, 77, + 145, 71, 172, 75, 235, 141, 83, 145, 50, 101, 166, 87, 154, 179, 203, + 27, 233, 169, 45, 28, 41, 211, 46, 144, 123, 62, 62, 205, 178, 180, + 89, 32, 194, 238, 151, 217, 164, 214, 241, 164, 96, 215, 46, 141, 189, + 86, 97, 143, 4, 227, 73, 20, 221, 238, 66, 3, 132, 135, 229, 22, + 60, 152, 102, 211, 20, 250, 225, 36, 212, 131, 182, 212, 216, 84, 141, + 133, 86, 163, 136, 107, 219, 8, 100, 189, 138, 217, 60, 131, 237, 64, + 37, 241, 85, 140, 47, 54, 75, 58, 76, 66, 104, 245, 201, 199, 236, + 188, 71, 30, 171, 233, 190, 81, 120, 166, 63, 237, 249, 233, 192, 5, + 24, 231, 193, 39, 99, 101, 108, 92, 109, 156, 211, 111, 87, 157, 130, + 16, 58, 113, 47, 101, 152, 60, 183, 37, 227, 52, 255, 213, 16, 112, + 234, 223, 197, 101, 73, 120, 94, 60, 158, 82, 227, 131, 13, 4, 167, + 78, 126, 120, 154, 26, 246, 35, 145, 40, 150, 7, 208, 243, 100, 68, + 89, 200, 139, 138, 121, 37, 28, 35, 197, 227, 79, 19, 130, 171, 91, + 116, 57, 153, 140, 217, 236, 7, 180, 221, 226, 163, 199, 158, 131, 200, + 37, 48, 41, 157, 175, 139, 71, 53, 172, 113, 159, 133, 47, 139, 113, + 157, 40, 88, 44, 115, 105, 104, 219, 211, 18, 164, 170, 127, 5, 178, + 115, 181, 143, 30, 173, 6, 186, 183, 45, 56, 94, 252, 210, 171, 154, + 10, 17, 34, 153, 4, 11, 176, 85, 144, 114, 36, 247, 34, 67, 187, + 69, 164, 168, 120, 82, 186, 46, 15, 147, 105, 48, 76, 235, 15, 218, + 86, 160, 19, 220, 119, 241, 103, 252, 196, 58, 74, 131, 214, 109, 17, + 175, 75, 203, 167, 17, 60, 52, 251, 130, 55, 184, 165, 83, 225, 231, + 184, 208, 196, 88, 70, 8, 3, 43, 78, 107, 158, 180, 130, 248, 194, + 16, 46, 54, 100, 98, 121, 67, 185, 17, 181, 210, 5, 15, 178, 196, + 80, 220, 28, 103, 220, 231, 167, 10, 122, 225, 194, 118, 157, 192, 195, + 205, 130, 253, 94, 246, 177, 74, 149, 90, 120, 188, 230, 48, 77, 168, + 50, 76, 130, 136, 200, 219, 209, 192, 20, 10, 193, 97, 205, 136, 98, + 117, 128, 170, 198, 220, 218, 180, 178, 186, 150, 227, 196, 161, 4, 244, + 124, 31, 85, 243, 34, 78, 187, 226, 164, 167, 122, 56, 114, 232, 140, + 189, 160, 19, 184, 223, 165, 202, 86, 210, 102, 183, 50, 30, 109, 134, + 23, 102, 171, 130, 93, 106, 2, 117, 80, 82, 197, 193, 247, 137, 255, + 255, 127, 38, 13, 82, 103, 51, 179, 220, 133, 247, 104, 152, 160, 229, + 160, 214, 152, 157, 87, 183, 82, 43, 36, 19, 80, 192, 122, 186, 201, + 116, 190, 220, 131, 228, 153, 197, 212, 112, 233, 124, 114, 212, 106, 195, + 129, 141, 204, 238, 98, 247, 90, 244, 23, 118, 2, 168, 71, 48, 223, + 253, 187, 16, 204, 230, 46, 221, 30, 243, 27, 129, 155, 210, 159, 84, + 56, 212, 197, 131, 174, 59, 85, 108, 80, 36, 31, 210, 71, 228, 254, + 171, 67, 129, 154, 175, 245, 140, 11, 167, 43, 69, 231, 227, 91, 183, + 133, 108, 4, 151, 128, 64, 243, 215, 74, 160, 186, 217, 38, 28, 186, + 75, 178, 151, 214, 5, 49, 158, 242, 126, 91, 249, 88, 156, 110, 124, + 205, 125, 227, 19, 235, 172, 103, 200, 190, 121, 169, 140, 118, 156, 21, + 152, 34, 31, 235, 46, 191, 107, 37, 109, 135, 112, 195, 9, 245, 43, + 96, 232, 74, 8, 193, 131, 70, 140, 180, 204, 219, 243, 72, 70, 16, + 11, 227, 0, 27, 252, 142, 183, 199, 103, 114, 149, 221, 235, 69, 92, + 245, 9, 227, 43, 173, 139, 119, 85, 104, 214, 84, 126, 244, 243, 122, + 14, 164, 185, 104, 176, 55, 133, 44, 28, 208, 232, 50, 71, 32, 78, + 200, 95, 153, 70, 82, 243, 91, 164, 64, 159, 173, 244, 103, 78, 29, + 218, 209, 124, 118, 153, 42, 69, 240, 237, 228, 33, 155, 17, 61, 27, + 233, 171, 6, 240, 48, 113, 243, 134, 207, 120, 216, 61, 188, 247, 231, + 185, 163, 43, 140, 138, 235, 132, 219, 47, 38, 93, 205, 6, 247, 195, + 200, 79, 87, 111, 210, 54, 222, 179, 108, 163, 253, 22, 22, 101, 180, + 6, 61, 41, 91, 95, 237, 186, 166, 110, 225, 139, 205, 146, 41, 133, + 153, 114, 63, 48, 110, 208, 168, 38, 233, 141, 23, 136, 236, 22, 220, + 14, 62, 224, 46, 20, 193, 181, 107, 14, 234, 156, 234, 108, 30, 112, + 235, 126, 237, 189, 252, 240, 240, 3, 175, 210, 85, 35, 230, 115, 219, + 184, 173, 48, 84, 250, 52, 113, 44, 187, 173, 253, 153, 177, 32, 127, + 98, 100, 180, 211, 71, 146, 82, 1, 69, 200, 165, 198, 121, 133, 232, + 0, 237, 157, 169, 31, 134, 106, 243, 245, 16, 228, 53, 133, 143, 255, + 123, 175, 19, 10, 98, 117, 180, 38, 50, 190, 63, 70, 106, 8, 221, + 78, 66, 129, 190, 181, 165, 119, 242, 101, 19, 18, 181, 91, 223, 30, + 93, 253, 74, 242, 112, 139, 30, 121, 25, 100, 144, 32, 212, 143, 3, + 96, 134, 113, 193, 190, 51, 8, 60, 108, 88, 168, 142, 47, 217, 173, + 44, 207, 174, 161, 237, 179, 147, 4, 30, 5, 177, 202, 43, 239, 15, + 135, 44, 216, 10, 183, 63, 27, 159, 195, 56, 238, 95, 213, 45, 44, + 252, 4, 101, 233, 38, 88, 66, 126, 149, 196, 87, 211, 55, 38, 17, + 92, 26, 76, 156, 183, 136, 154, 166, 219, 125, 10, 88, 240, 97, 14, + 86, 67, 4, 74, 236, 71, 72, 10, 49, 18, 158, 148, 128, 15, 241, + 17, 9, 236, 243, 22, 116, 160, 65, 166, 34, 113, 76, 41, 100, 153, + 184, 22, 62, 252, 220, 47, 180, 124, 103, 242, 104, 13, 244, 136, 33, + 146, 33, 176, 31, 159, 235, 29, 221, 255, 182, 90, 183, 158, 186, 155, + 85, 137, 173, 129, 71, 91, 147, 17, 30, 240, 214, 110, 79, 64, 21, + 129, 97, 109, 253, 198, 203, 116, 235, 89, 166, 151, 116, 106, 194, 27, + 51, 177, 23, 119, 199, 227, 50, 143, 129, 234, 188, 217, 9, 136, 48, + 115, 5, 252, 241, 195, 116, 239, 68, 176, 55, 121, 2, 38, 229, 224, + 94, 204, 200, 115, 84, 235, 131, 172, 242, 56, 208, 41, 21, 36, 113, + 156, 137, 6, 225, 132, 4, 181, 193, 84, 10, 213, 155, 150, 72, 127, + 23, 107, 255, 105, 250, 61, 234, 211, 225, 169, 93, 63, 138, 95, 201, + 74, 208, 99, 119, 184, 219, 62, 86, 163, 142, 35, 24, 86, 92, 224, + 53, 84, 57, 101, 113, 76, 26, 78, 174, 49, 28, 234, 153, 240, 27, + 114, 87, 133, 130, 78, 66, 144, 205, 152, 171, 169, 136, 219, 142, 223, + 145, 149, 196, 6, 167, 109, 52, 188, 0, 98, 242, 254, 184, 129, 250, + 63, 244, 10, 97, 188, 7, 137, 183, 165, 68, 91, 26, 188, 230, 246, + 227, 12, 217, 170, 224, 119, 135, 243, 149, 88, 67, 23, 117, 173, 130, + 164, 233, 244, 251, 11, 123, 57, 80, 111, 249, 146, 231, 213, 158, 26, + 236, 250, 213, 228, 117, 251, 101, 128, 8, 241, 251, 36, 40, 149, 148, + 60, 146, 48, 104, 121, 163, 233, 2, 24, 10, 21, 93, 137, 124, 8, + 115, 220, 255, 107, 153, 105, 6, 255, 32, 160, 96, 74, 84, 184, 31, + 155, 118, 206, 58, 131, 111, 150, 137, 145, 22, 45, 138, 211, 118, 151, + 248, 189, 64, 82, 222, 9, 137, 114, 59, 89, 77, 249, 245, 195, 146, + 198, 43, 209, 186, 151, 121, 136, 170, 81, 53, 43, 126, 15, 62, 88, + 171, 206, 232, 34, 99, 52, 6, 22, 126, 140, 32, 181, 122, 253, 230, + 127, 211, 254, 61, 254, 108, 114, 38, 214, 164, 244, 87, 243, 187, 185, + 57, 105, 24, 244, 59, 254, 92, 143, 235, 38, 70, 177, 126, 123, 61, + 243, 45, 127, 76, 127, 39, 45, 254, 239, 67, 221, 24, 81, 24, 130, + 247, 106, 239, 93, 18, 57, 242, 4, 223, 131, 86, 249, 241, 81, 149, + 230, 154, 17, 14, 179, 194, 234, 17, 85, 188, 33, 162, 62, 73, 157, + 253, 248, 111, 97, 205, 47, 74, 223, 192, 185, 212, 153, 240, 156, 104, + 64, 46, 209, 146, 56, 27, 21, 184, 95, 107, 95, 101, 243, 133, 146, + 194, 240, 51, 109, 158, 225, 18, 80, 66, 4, 79, 252, 174, 187, 55, + 230, 54, 51, 42, 87, 34, 159, 155, 184, 118, 167, 150, 46, 32, 156, + 244, 124, 222, 84, 247, 12, 231, 119, 237, 135, 225, 227, 97, 178, 37, + 208, 112, 126, 32, 227, 60, 239, 194, 183, 169, 208, 221, 250, 180, 56, + 137, 67, 153, 170, 242, 54, 55, 48, 219, 79, 106, 249, 250, 56, 130, + 184, 43, 56, 114, 175, 122, 249, 107, 188, 63, 169, 25, 43, 68, 61, + 246, 47, 191, 117, 150, 7, 163, 144, 42, 186, 5, 195, 11, 68, 215, + 219, 87, 213, 42, 84, 99, 37, 29, 78, 34, 180, 131, 15, 171, 186, + 225, 163, 204, 225, 72, 198, 227, 122, 245, 4, 133, 40, 134, 17, 61, + 112, 55, 159, 37, 118, 112, 173, 210, 126, 9, 23, 209, 65, 14, 109, + 16, 247, 254, 45, 170, 33, 143, 35, 107, 134, 51, 132, 135, 226, 40, + 112, 156, 122, 5, 31, 37, 113, 24, 1, 153, 3, 180, 227, 249, 172, + 93, 20, 79, 126, 42, 254, 100, 80, 86, 180, 123, 71, 213, 32, 178, + 28, 63, 75, 177, 246, 25, 119, 33, 236, 194, 31, 94, 169, 97, 96, + 42, 29, 165, 234, 199, 12, 76, 8, 242, 229, 160, 130, 169, 76, 120, + 159, 25, 18, 36, 182, 222, 210, 105, 251, 2, 40, 111, 212, 249, 119, + 48, 137, 50, 71, 146, 216, 47, 18, 60, 194, 18, 119, 197, 216, 84, + 170, 143, 241, 61, 207, 206, 238, 51, 39, 145, 171, 81, 108, 64, 0, + 229, 83, 190, 81, 149, 27, 77, 44, 34, 134, 178, 250, 9, 244, 128, + 175, 124, 28, 41, 116, 254, 30, 162, 88, 207, 231, 222, 155, 224, 234, + 201, 56, 119, 191, 190, 158, 195, 16, 153, 152, 99, 244, 60, 207, 205, + 133, 34, 101, 0, 104, 144, 141, 121, 168, 44, 40, 234, 49, 35, 136, + 39, 242, 14, 198, 188, 124, 161, 135, 113, 180, 68, 218, 10, 47, 223, + 190, 0, 238, 109, 149, 149, 25, 14, 218, 109, 85, 106, 125, 45, 29, + 63, 122, 74, 184, 39, 153, 72, 81, 69, 212, 62, 80, 161, 110, 103, + 56, 254, 7, 198, 201, 47, 202, 145, 147, 115, 7, 252, 21, 157, 211, + 102, 40, 117, 116, 41, 110, 189, 45, 41, 128, 46, 18, 40, 228, 43, + 159, 202, 90, 114, 78, 193, 9, 237, 172, 59, 89, 50, 218, 47, 142, + 139, 118, 146, 201, 8, 158, 116, 71, 133, 105, 177, 199, 24, 202, 219, + 64, 136, 101, 162, 11, 225, 13, 60, 217, 13, 125, 9, 38, 224, 90, + 78, 166, 145, 101, 167, 132, 24, 58, 73, 19, 2, 185, 83, 148, 110, + 133, 191, 76, 71, 18, 168, 103, 0, 123, 195, 39, 41, 243, 215, 62, + 38, 156, 101, 42, 144, 43, 125, 154, 46, 152, 74, 242, 251, 158, 180, + 189, 228, 165, 64, 75, 220, 184, 160, 9, 23, 57, 138, 16, 88, 240, + 5, 234, 106, 188, 171, 120, 55, 203, 43, 72, 33, 67, 129, 26, 242, + 128, 89, 144, 226, 129, 58, 143, 110, 185, 216, 158, 238, 175, 34, 121, + 59, 49, 76, 178, 81, 88, 181, 23, 219, 66, 1, 228, 34, 143, 250, + 41, 77, 7, 245, 65, 3, 203, 53, 144, 140, 194, 71, 27, 10, 175, + 218, 149, 242, 213, 150, 9, 199, 22, 202, 155, 5, 44, 23, 111, 102, + 5, 150, 32, 62, 31, 220, 1, 129, 151, 109, 27, 215, 54, 235, 104, + 157, 123, 8, 89, 94, 161, 197, 0, 163, 75, 124, 41, 240, 192, 109, + 9, 202, 124, 25, 82, 95, 243, 170, 63, 91, 248, 4, 63, 47, 208, + 243, 61, 85, 62, 107, 32, 87, 19, 208, 87, 120, 234, 108, 244, 44, + 158, 238, 91, 185, 219, 105, 13, 254, 85, 208, 93, 148, 144, 160, 98, + 237, 72, 27, 59, 119, 22, 99, 52, 193, 190, 57, 171, 46, 247, 180, + 126, 30, 16, 200, 88, 35, 212, 215, 253, 218, 25, 96, 40, 44, 53, + 29, 129, 153, 154, 197, 238, 84, 201, 244, 106, 184, 178, 127, 54, 198, + 60, 160, 98, 4, 229, 110, 220, 225, 26, 254, 238, 123, 69, 248, 222, + 43, 122, 207, 63, 166, 246, 171, 129, 231, 7, 89, 132, 245, 76, 55, + 174, 184, 93, 139, 221, 250, 11, 86, 239, 248, 14, 98, 226, 66, 146, + 45, 59, 106, 78, 6, 253, 6, 128, 53, 174, 7, 36, 100, 130, 22, + 47, 157, 147, 27, 31, 15, 97, 122, 46, 137, 84, 126, 104, 48, 217, + 236, 131, 51, 253, 147, 23, 35, 133, 43, 183, 124, 197, 150, 85, 170, + 39, 96, 227, 44, 130, 51, 83, 224, 22, 177, 39, 65, 125, 98, 28, + 162, 56, 25, 112, 81, 50, 28, 118, 184, 45, 236, 226, 87, 117, 111, + 219, 157, 34, 224, 77, 68, 59, 91, 80, 177, 178, 188, 203, 247, 133, + 130, 15, 61, 125, 252, 18, 201, 87, 157, 158, 47, 5, 151, 104, 231, + 127, 161, 154, 172, 224, 74, 95, 195, 121, 175, 200, 18, 26, 240, 194, + 222, 85, 189, 238, 106, 136, 195, 28, 170, 10, 115, 25, 236, 203, 127, + 254, 103, 79, 175, 57, 159, 102, 193, 106, 136, 130, 195, 16, 19, 14, + 240, 130, 74, 217, 154, 5, 217, 88, 21, 113, 205, 138, 241, 209, 39, + 255, 182, 100, 41, 243, 199, 191, 7, 123, 185, 7, 186, 28, 32, 71, + 236, 16, 220, 222, 5, 122, 74, 55, 95, 19, 230, 127, 201, 130, 180, + 143, 142, 149, 229, 43, 81, 95, 32, 138, 165, 42, 136, 231, 106, 34, + 90, 135, 60, 60, 105, 191, 50, 195, 62, 230, 189, 100, 41, 110, 61, + 204, 139, 237, 185, 208, 136, 61, 249, 12, 20, 230, 48, 141, 65, 17, + 204, 126, 215, 73, 77, 129, 49, 230, 39, 247, 222, 109, 50, 151, 255, + 246, 141, 254, 233, 117, 156, 172, 113, 74, 72, 133, 218, 227, 4, 192, + 27, 185, 21, 99, 61, 34, 52, 112, 74, 18, 149, 38, 195, 43, 154, + 8, 16, 189, 142, 139, 167, 137, 2, 155, 165, 1, 255, 158, 107, 131, + 141, 112, 87, 102, 97, 12, 228, 30, 143, 60, 14, 238, 183, 145, 88, + 116, 187, 64, 138, 136, 138, 24, 16, 241, 126, 37, 103, 99, 203, 164, + 198, 129, 140, 189, 18, 178, 241, 154, 7, 81, 8, 75, 196, 131, 121, + 19, 52, 90, 125, 71, 179, 8, 102, 149, 117, 88, 2, 58, 115, 41, + 254, 118, 205, 28, 244, 153, 79, 179, 136, 194, 59, 55, 233, 48, 87, + 218, 151, 218, 172, 109, 72, 156, 112, 175, 129, 111, 124, 151, 112, 69, + 175, 237, 175, 208, 35, 15, 70, 189, 245, 118, 229, 51, 121, 237, 106, + 57, 190, 157, 42, 37, 107, 108, 240, 142, 180, 123, 58, 243, 99, 76, + 153, 94, 235, 148, 3, 146, 198, 250, 3, 176, 73, 105, 64, 3, 129, + 155, 69, 66, 114, 55, 53, 31, 200, 171, 9, 127, 227, 81, 238, 0, + 29, 54, 79, 184, 213, 44, 21, 21, 106, 118, 193, 193, 132, 216, 89, + 39, 107, 40, 29, 198, 229, 184, 123, 32, 225, 148, 78, 40, 236, 108, + 100, 112, 139, 33, 176, 201, 41, 56, 180, 87, 100, 161, 247, 181, 48, + 215, 32, 88, 3, 2, 69, 189, 162, 185, 155, 129, 131, 151, 170, 201, + 203, 192, 141, 27, 38, 21, 174, 100, 48, 138, 216, 113, 123, 137, 161, + 92, 153, 129, 184, 21, 205, 18, 190, 184, 189, 57, 130, 168, 67, 161, + 16, 207, 223, 35, 254, 40, 169, 65, 104, 178, 164, 88, 198, 40, 58, + 221, 211, 96, 91, 98, 147, 157, 193, 121, 211, 28, 185, 217, 84, 58, + 236, 70, 181, 35, 58, 27, 111, 52, 213, 103, 93, 154, 18, 60, 201, + 180, 29, 28, 85, 126, 170, 190, 231, 64, 27, 191, 83, 158, 125, 124, + 43, 172, 198, 25, 151, 108, 116, 7, 164, 114, 92, 215, 197, 222, 31, + 231, 41, 112, 42, 172, 207, 164, 87, 123, 138, 156, 78, 44, 131, 127, + 155, 114, 138, 219, 52, 223, 150, 230, 94, 165, 103, 45, 139, 238, 161, + 208, 117, 178, 225, 67, 90, 90, 110, 176, 20, 110, 4, 189, 194, 138, + 12, 168, 150, 181, 139, 54, 241, 243, 87, 19, 136, 251, 68, 1, 239, + 85, 161, 139, 67, 117, 239, 162, 214, 96, 205, 66, 79, 13, 47, 16, + 72, 171, 33, 246, 93, 197, 65, 115, 108, 87, 83, 116, 49, 66, 34, + 18, 101, 65, 24, 178, 147, 34, 61, 242, 51, 246, 191, 249, 164, 200, + 210, 150, 146, 46, 157, 137, 147, 161, 25, 101, 217, 142, 125, 241, 73, + 115, 83, 86, 208, 167, 233, 77, 109, 89, 197, 219, 108, 206, 54, 99, + 113, 101, 77, 41, 251, 24, 203, 179, 28, 109, 62, 248, 113, 197, 82, + 35, 89, 132, 11, 184, 194, 237, 142, 71, 81, 173, 36, 220, 103, 66, + 254, 78, 252, 105, 211, 89, 149, 132, 218, 43, 45, 77, 64, 137, 248, + 238, 145, 172, 64, 78, 123, 225, 161, 166, 202, 94, 210, 227, 36, 254, + 153, 230, 23, 21, 82, 125, 167, 115, 10, 25, 141, 144, 226, 25, 151, + 22, 157, 162, 2, 250, 16, 161, 48, 111, 121, 9, 191, 229, 41, 136, + 83, 163, 165, 10, 195, 34, 56, 145, 166, 99, 184, 180, 180, 159, 95, + 110, 17, 46, 227, 245, 97, 207, 27, 113, 121, 55, 196, 29, 248, 171, + 108, 250, 236, 1, 31, 108, 15, 34, 233, 32, 250, 127, 67, 159, 151, + 145, 5, 171, 219, 102, 159, 137, 231, 130, 229, 177, 209, 253, 150, 217, + 76, 62, 111, 42, 25, 152, 169, 83, 245, 164, 127, 61, 128, 35, 234, + 8, 69, 152, 103, 107, 18, 98, 101, 214, 205, 136, 68, 165, 54, 48, + 189, 59, 29, 254, 128, 255, 249, 46, 23, 246, 29, 131, 185, 27, 160, + 235, 16, 52, 232, 247, 100, 230, 137, 91, 111, 48, 202, 31, 126, 167, + 162, 45, 159, 66, 215, 176, 32, 5, 255, 82, 108, 31, 184, 89, 6, + 73, 8, 209, 86, 202, 122, 111, 132, 39, 140, 160, 74, 148, 254, 21, + 33, 80, 180, 165, 241, 182, 74, 205, 243, 194, 17, 216, 113, 8, 239, + 190, 34, 158, 31, 58, 223, 249, 51, 74, 174, 191, 157, 185, 12, 98, + 190, 135, 91, 198, 25, 221, 76, 118, 88, 240, 184, 188, 70, 92, 36, + 208, 124, 43, 228, 200, 86, 193, 178, 251, 115, 233, 240, 11, 134, 91, + 230, 141, 195, 161, 255, 12, 103, 85, 187, 84, 129, 202, 48, 85, 155, + 242, 226, 185, 109, 126, 2, 8, 174, 221, 203, 67, 182, 52, 114, 243, + 219, 32, 89, 183, 125, 18, 209, 200, 99, 116, 123, 185, 17, 250, 250, + 223, 129, 221, 147, 249, 142, 238, 25, 230, 85, 85, 141, 248, 144, 13, + 241, 3, 10, 253, 74, 96, 82, 115, 210, 221, 17, 79, 213, 119, 27, + 192, 55, 41, 161, 125, 167, 87, 45, 10, 246, 22, 76, 245, 83, 4, + 160, 242, 62, 221, 89, 206, 80, 235, 33, 34, 81, 125, 28, 117, 233, + 167, 89, 6, 132, 138, 130, 88, 227, 245, 44, 138, 180, 42, 215, 4, + 177, 9, 167, 135, 173, 234, 185, 119, 100, 108, 4, 237, 145, 52, 227, + 61, 231, 130, 77, 97, 204, 175, 136, 225, 27, 29, 36, 142, 151, 129, + 170, 105, 233, 88, 57, 122, 219, 60, 16, 70, 253, 218, 123, 188, 49, + 210, 121, 115, 150, 249, 213, 246, 76, 2, 197, 196, 24, 169, 143, 175, + 230, 138, 32, 81, 191, 13, 166, 211, 252, 110, 84, 221, 244, 13, 45, + 116, 242, 123, 18, 153, 163, 187, 46, 33, 28, 160, 219, 179, 85, 166, + 2, 125, 92, 99, 147, 61, 4, 200, 245, 135, 172, 187, 4, 101, 102, + 85, 79, 168, 53, 222, 129, 150, 252, 253, 252, 45, 39, 64, 33, 104, + 69, 239, 180, 71, 234, 177, 245, 185, 59, 238, 88, 65, 58, 156, 84, + 238, 150, 46, 236, 65, 229, 33, 221, 168, 102, 249, 163, 155, 36, 189, + 54, 211, 154, 247, 69, 45, 47, 140, 119, 63, 143, 129, 163, 38, 120, + 88, 216, 66, 117, 118, 176, 93, 153, 42, 129, 198, 45, 203, 26, 150, + 43, 17, 53, 104, 196, 82, 234, 59, 129, 81, 14, 104, 229, 8, 204, + 187, 8, 168, 112, 18, 211, 154, 195, 181, 87, 241, 234, 148, 68, 229, + 231, 23, 134, 14, 97, 119, 22, 48, 123, 17, 115, 105, 180, 124, 135, + 51, 177, 104, 187, 23, 210, 76, 161, 8, 36, 57, 218, 252, 142, 236, + 154, 178, 119, 129, 189, 255, 208, 56, 25, 70, 68, 50, 57, 172, 77, + 154, 163, 80, 33, 180, 118, 57, 105, 97, 5, 50, 158, 185, 226, 119, + 237, 163, 47, 79, 233, 114, 160, 246, 93, 238, 197, 217, 240, 55, 121, + 37, 138, 104, 245, 181, 30, 133, 129, 94, 97, 31, 188, 121, 119, 74, + 227, 167, 196, 194, 108, 185, 63, 242, 0, 224, 8, 162, 49, 173, 57, + 250, 12, 113, 238, 241, 0, 180, 180, 198, 57, 180, 248, 243, 214, 122, + 103, 81, 205, 243, 232, 213, 39, 122, 142, 107, 4, 63, 123, 147, 22, + 78, 174, 200, 33, 27, 16, 76, 139, 230, 32, 101, 246, 228, 246, 89, + 15, 30, 11, 87, 174, 70, 195, 104, 14, 26, 209, 149, 19, 254, 121, + 62, 186, 224, 56, 247, 10, 237, 102, 83, 215, 211, 22, 123, 161, 52, + 251, 122, 142, 228, 191, 93, 151, 174, 176, 166, 64, 184, 254, 113, 140, + 214, 109, 159, 126, 201, 95, 245, 167, 180, 165, 106, 61, 83, 143, 239, + 68, 254, 0, 201, 237, 162, 231, 108, 152, 131, 248, 39, 149, 131, 80, + 224, 41, 14, 157, 96, 16, 251, 139, 15, 153, 45, 29, 84, 116, 154, + 221, 234, 127, 39, 10, 244, 3, 92, 154, 93, 125, 209, 252, 144, 73, + 139, 47, 93, 98, 78, 7, 61, 173, 117, 46, 155, 73, 76, 127, 202, + 5, 223, 113, 215, 86, 54, 82, 0, 105, 16, 52, 226, 140, 232, 53, + 23, 76, 117, 212, 139, 183, 112, 95, 162, 174, 153, 104, 4, 241, 133, + 159, 188, 4, 147, 92, 125, 133, 104, 26, 241, 130, 13, 239, 96, 235, + 36, 195, 74, 193, 126, 54, 27, 55, 190, 97, 44, 26, 106, 31, 76, + 244, 174, 179, 1, 97, 168, 114, 14, 65, 60, 199, 182, 133, 130, 65, + 175, 95, 224, 125, 74, 157, 34, 99, 26, 135, 160, 188, 244, 114, 175, + 211, 194, 74, 97, 182, 244, 93, 3, 219, 223, 154, 204, 10, 132, 233, + 165, 23, 204, 187, 163, 179, 23, 72, 137, 22, 40, 123, 77, 216, 95, + 44, 20, 55, 213, 165, 125, 17, 237, 77, 140, 2, 146, 193, 104, 9, + 83, 40, 126, 177, 137, 53, 89, 59, 23, 49, 80, 240, 168, 70, 97, + 250, 36, 161, 17, 228, 161, 136, 213, 43, 118, 106, 198, 251, 68, 223, + 34, 79, 123, 118, 91, 222, 236, 73, 236, 175, 255, 248, 249, 96, 53, + 245, 248, 238, 12, 106, 127, 183, 1, 31, 193, 14, 126, 7, 19, 252, + 102, 191, 74, 208, 115, 140, 76, 133, 179, 82, 5, 83, 122, 154, 82, + 37, 19, 171, 190, 177, 177, 233, 248, 175, 214, 93, 17, 121, 167, 249, + 165, 149, 191, 145, 188, 218, 99, 154, 55, 109, 202, 12, 17, 56, 107, + 124, 137, 156, 233, 85, 18, 237, 207, 9, 72, 10, 218, 98, 58, 70, + 254, 207, 179, 61, 201, 250, 163, 135, 215, 130, 182, 47, 93, 123, 14, + 251, 252, 34, 240, 172, 151, 111, 127, 19, 6, 165, 96, 254, 15, 32, + 153, 247, 91, 200, 78, 169, 160, 28, 70, 146, 251, 174, 49, 54, 98, + 93, 161, 19, 105, 195, 62, 196, 38, 84, 53, 122, 177, 158, 179, 113, + 93, 91, 102, 90, 119, 52, 120, 247, 208, 228, 233, 97, 240, 187, 205, + 14, 194, 35, 134, 229, 241, 16, 152, 130, 206, 63, 93, 110, 21, 52, + 170, 67, 99, 214, 121, 230, 201, 133, 173, 143, 225, 81, 184, 139, 105, + 226, 58, 237, 106, 16, 91, 163, 15, 4, 63, 94, 186, 80, 219, 85, + 209, 183, 129, 122, 39, 8, 140, 180, 203, 167, 223, 148, 74, 147, 29, + 237, 108, 105, 143, 229, 254, 104, 243, 111, 210, 11, 185, 158, 151, 90, + 47, 43, 233, 91, 18, 119, 144, 184, 63, 64, 3, 244, 225, 30, 134, + 198, 210, 41, 103, 2, 31, 221, 74, 26, 54, 18, 23, 242, 104, 39, + 31, 167, 183, 209, 105, 192, 88, 219, 25, 134, 228, 8, 222, 149, 25, + 195, 141, 61, 33, 114, 213, 93, 6, 58, 12, 191, 113, 216, 153, 39, + 235, 173, 146, 34, 139, 210, 13, 59, 240, 88, 10, 71, 72, 27, 225, + 32, 70, 92, 182, 120, 151, 82, 246, 248, 93, 119, 13, 199, 161, 48, + 202, 84, 88, 226, 198, 249, 152, 165, 34, 183, 109, 9, 196, 232, 168, + 236, 241, 85, 100, 181, 81, 235, 85, 247, 85, 173, 57, 141, 145, 116, + 254, 146, 249, 161, 133, 245, 17, 117, 141, 208, 49, 245, 121, 181, 158, + 144, 197, 200, 63, 202, 119, 158, 107, 112, 56, 178, 227, 29, 87, 48, + 151, 228, 55, 194, 130, 52, 12, 35, 245, 171, 149, 90, 206, 151, 205, + 184, 221, 45, 57, 126, 64, 203, 244, 167, 172, 134, 141, 5, 145, 101, + 29, 33, 133, 90, 17, 64, 127, 152, 209, 78, 10, 131, 151, 157, 204, + 231, 255, 164, 122, 16, 78, 220, 245, 161, 229, 90, 203, 12, 205, 95, + 8, 47, 51, 92, 23, 118, 95, 211, 124, 116, 147, 74, 79, 10, 192, + 217, 74, 80, 127, 17, 105, 56, 248, 144, 72, 197, 159, 230, 19, 147, + 31, 50, 239, 236, 92, 237, 131, 159, 88, 99, 171, 76, 209, 41, 181, + 194, 28, 3, 242, 137, 227, 20, 198, 120, 6, 12, 97, 45, 210, 143, + 177, 60, 83, 61, 135, 132, 187, 54, 61, 82, 149, 193, 23, 45, 6, + 95, 28, 167, 0, 67, 27, 17, 93, 241, 43, 221, 109, 102, 179, 204, + 80, 198, 60, 229, 38, 47, 100, 235, 50, 166, 193, 79, 255, 71, 207, + 116, 216, 201, 255, 134, 194, 201, 34, 169, 250, 28, 217, 198, 176, 10, + 203, 193, 197, 125, 80, 116, 149, 108, 224, 10, 195, 68, 228, 218, 85, + 146, 119, 67, 73, 118, 186, 171, 162, 86, 198, 176, 73, 41, 162, 237, + 196, 130, 32, 231, 70, 197, 139, 140, 182, 151, 221, 55, 95, 183, 58, + 43, 141, 160, 148, 193, 197, 162, 189, 62, 36, 226, 255, 214, 75, 166, + 163, 78, 30, 253, 52, 8, 190, 55, 241, 60, 187, 226, 34, 177, 102, + 155, 56, 165, 51, 183, 2, 181, 247, 125, 53, 36, 206, 73, 32, 19, + 20, 204, 228, 105, 254, 34, 201, 161, 175, 232, 223, 216, 103, 247, 13, + 68, 49, 206, 172, 122, 11, 17, 3, 55, 101, 94, 39, 18, 183, 214, + 16, 149, 252, 137, 39, 205, 84, 114, 80, 101, 246, 222, 173, 145, 229, + 199, 73, 91, 219, 123, 235, 45, 190, 39, 241, 146, 209, 124, 178, 151, + 30, 19, 26, 112, 150, 192, 183, 237, 124, 253, 165, 28, 130, 132, 161, + 157, 140, 159, 163, 87, 181, 211, 166, 233, 0, 180, 87, 125, 229, 173, + 128, 90, 23, 38, 235, 143, 31, 117, 66, 203, 76, 150, 249, 19, 23, + 45, 184, 56, 249, 220, 114, 205, 1, 215, 169, 205, 173, 58, 188, 128, + 116, 122, 184, 48, 114, 95, 167, 3, 191, 136, 238, 124, 245, 166, 82, + 191, 16, 212, 149, 183, 166, 14, 212, 255, 67, 106, 50, 159, 172, 211, + 101, 207, 198, 242, 179, 40, 1, 73, 20, 64, 185, 29, 21, 216, 246, + 154, 104, 156, 214, 231, 192, 137, 220, 150, 215, 4, 80, 110, 164, 185, + 68, 114, 110, 234, 45, 143, 171, 196, 148, 151, 237, 16, 251, 68, 221, + 100, 18, 212, 110, 59, 147, 113, 217, 152, 28, 83, 198, 211, 231, 35, + 39, 198, 19, 163, 67, 40, 24, 124, 52, 138, 161, 254, 233, 90, 24, + 214, 222, 121, 189, 95, 180, 77, 147, 21, 187, 111, 9, 184, 75, 209, + 250, 81, 110, 34, 97, 198, 132, 182, 229, 192, 208, 67, 98, 124, 108, + 141, 89, 37, 124, 11, 5, 128, 76, 13, 220, 167, 201, 182, 151, 45, + 235, 37, 142, 35, 192, 28, 209, 254, 40, 15, 22, 183, 181, 138, 144, + 72, 21, 48, 9, 133, 127, 74, 187, 19, 170, 88, 209, 119, 194, 230, + 243, 237, 156, 184, 156, 46, 118, 58, 7, 139, 163, 157, 167, 65, 249, + 102, 228, 201, 27, 255, 189, 54, 151, 168, 108, 129, 113, 106, 245, 244, + 158, 176, 247, 193, 161, 94, 248, 190, 38, 208, 177, 246, 108, 158, 199, + 56, 37, 141, 101, 102, 44, 109, 144, 23, 214, 235, 251, 210, 184, 103, + 145, 248, 118, 162, 139, 84, 61, 146, 29, 70, 170, 80, 30, 145, 156, + 202, 185, 222, 87, 247, 137, 153, 98, 166, 61, 173, 200, 164, 40, 2, + 137, 226, 66, 162, 24, 172, 46, 203, 80, 176, 156, 93, 26, 48, 69, + 130, 192, 129, 84, 70, 15, 25, 224, 175, 31, 161, 110, 61, 220, 214, + 220, 152, 22, 41, 51, 57, 114, 182, 139, 129, 159, 194, 169, 133, 246, + 37, 23, 79, 90, 88, 231, 6, 252, 101, 241, 250, 168, 71, 149, 252, + 196, 126, 2, 29, 177, 70, 218, 120, 203, 72, 243, 46, 45, 149, 57, + 108, 37, 198, 38, 177, 210, 32, 252, 227, 160, 77, 174, 211, 207, 212, + 82, 139, 189, 79, 198, 116, 165, 185, 49, 188, 43, 116, 230, 182, 34, + 224, 138, 216, 93, 93, 94, 175, 10, 217, 41, 209, 177, 36, 142, 205, + 241, 34, 129, 8, 91, 78, 210, 231, 166, 188, 18, 77, 139, 201, 203, + 3, 154, 131, 8, 193, 207, 255, 98, 166, 192, 215, 206, 236, 217, 9, + 19, 78, 227, 105, 146, 56, 50, 60, 114, 20, 239, 186, 119, 113, 183, + 79, 186, 126, 223, 131, 30, 217, 249, 82, 10, 188, 238, 161, 46, 174, + 96, 6, 187, 251, 234, 62, 163, 213, 55, 71, 253, 25, 193, 26, 176, + 111, 20, 167, 220, 240, 78, 243, 42, 104, 194, 0, 62, 53, 119, 199, + 9, 202, 20, 164, 55, 155, 204, 107, 120, 180, 6, 20, 114, 122, 130, + 143, 124, 89, 130, 66, 140, 43, 183, 203, 216, 78, 86, 178, 16, 226, + 159, 192, 205, 105, 113, 138, 165, 108, 18, 214, 100, 154, 71, 150, 46, + 70, 178, 181, 68, 68, 160, 253, 18, 19, 220, 253, 207, 87, 105, 32, + 239, 229, 137, 155, 176, 139, 168, 248, 143, 86, 67, 224, 146, 17, 80, + 147, 87, 30, 168, 125, 169, 91, 59, 55, 169, 142, 226, 71, 181, 114, + 40, 231, 229, 155, 27, 31, 144, 166, 96, 9, 85, 90, 152, 25, 83, + 113, 15, 65, 106, 162, 151, 74, 7, 27, 188, 221, 150, 108, 96, 102, + 233, 174, 208, 9, 170, 159, 239, 67, 230, 187, 93, 141, 102, 218, 191, + 48, 22, 53, 124, 84, 96, 110, 43, 28, 126, 26, 32, 104, 104, 65, + 99, 112, 207, 167, 54, 175, 165, 152, 105, 234, 18, 138, 148, 101, 9, + 87, 32, 155, 192, 7, 100, 101, 72, 133, 203, 170, 248, 222, 190, 243, + 0, 75, 100, 38, 52, 98, 125, 66, 185, 104, 255, 8, 184, 116, 195, + 32, 239, 213, 54, 28, 185, 96, 177, 233, 30, 210, 25, 155, 28, 128, + 53, 88, 101, 146, 68, 52, 60, 55, 183, 171, 157, 207, 128, 53, 60, + 22, 100, 53, 121, 124, 205, 163, 55, 82, 162, 96, 99, 71, 184, 243, + 169, 137, 77, 191, 16, 55, 59, 220, 197, 20, 4, 61, 89, 4, 157, + 96, 171, 145, 91, 145, 19, 36, 195, 42, 132, 152, 83, 255, 137, 64, + 37, 72, 190, 82, 29, 181, 41, 175, 144, 46, 229, 236, 217, 105, 194, + 7, 118, 19, 47, 151, 238, 222, 255, 183, 236, 181, 175, 135, 91, 55, + 163, 4, 156, 190, 18, 153, 21, 178, 51, 102, 36, 62, 253, 228, 12, + 102, 230, 138, 183, 182, 253, 54, 170, 251, 50, 107, 223, 180, 177, 74, + 169, 231, 208, 76, 47, 146, 158, 251, 181, 9, 219, 240, 169, 72, 250, + 241, 125, 86, 200, 125, 166, 137, 65, 115, 18, 68, 241, 124, 51, 128, + 223, 113, 239, 201, 221, 152, 21, 114, 127, 79, 101, 44, 48, 241, 21, + 221, 91, 240, 214, 166, 119, 140, 21, 143, 155, 172, 26, 207, 233, 0, + 128, 118, 45, 22, 6, 222, 75, 90, 99, 173, 214, 121, 53, 71, 183, + 253, 19, 95, 71, 66, 16, 41, 35, 195, 9, 93, 247, 42, 150, 49, + 46, 229, 73, 220, 12, 230, 51, 109, 147, 108, 124, 102, 83, 78, 75, + 67, 141, 55, 246, 155, 195, 190, 56, 116, 59, 185, 237, 104, 78, 66, + 173, 165, 178, 32, 93, 14, 10, 46, 30, 229, 108, 50, 52, 188, 2, + 244, 142, 201, 8, 245, 53, 210, 132, 15, 184, 82, 85, 156, 142, 35, + 49, 39, 183, 58, 61, 96, 143, 60, 190, 41, 152, 9, 183, 127, 90, + 157, 109, 196, 76, 36, 177, 244, 173, 63, 233, 1, 16, 110, 216, 203, + 94, 245, 195, 71, 55, 161, 149, 230, 122, 159, 133, 143, 180, 129, 6, + 111, 56, 211, 30, 13, 142, 216, 122, 87, 69, 91, 233, 254, 4, 232, + 207, 157, 32, 113, 50, 227, 233, 158, 171, 38, 228, 191, 121, 56, 165, + 222, 22, 180, 217, 111, 104, 112, 134, 12, 22, 244, 44, 234, 34, 253, + 217, 212, 140, 93, 235, 36, 54, 4, 129, 32, 91, 197, 163, 24, 71, + 133, 161, 111, 114, 29, 19, 45, 100, 10, 207, 139, 158, 219, 206, 160, + 248, 94, 12, 241, 58, 118, 141, 115, 166, 177, 78, 173, 59, 85, 81, + 97, 240, 154, 231, 79, 200, 199, 195, 205, 98, 245, 129, 246, 217, 97, + 209, 249, 194, 28, 179, 49, 248, 14, 6, 128, 61, 178, 15, 190, 32, + 251, 111, 225, 148, 0, 11, 227, 246, 146, 46, 41, 231, 24, 80, 43, + 174, 228, 166, 171, 206, 72, 142, 253, 96, 242, 181, 31, 207, 95, 66, + 88, 152, 165, 67, 7, 238, 23, 114, 50, 224, 212, 241, 202, 224, 247, + 70, 215, 162, 8, 237, 121, 169, 254, 191, 30, 19, 72, 252, 3, 109, + 5, 206, 105, 130, 69, 250, 250, 232, 135, 203, 253, 77, 102, 203, 40, + 72, 128, 223, 60, 59, 83, 103, 162, 117, 47, 200, 65, 88, 43, 168, + 168, 255, 46, 166, 86, 193, 231, 227, 92, 222, 186, 44, 20, 166, 136, + 123, 193, 88, 155, 166, 185, 73, 85, 124, 253, 80, 43, 176, 173, 191, + 2, 10, 50, 101, 143, 17, 129, 56, 191, 83, 103, 183, 143, 247, 253, + 161, 1, 76, 161, 76, 127, 194, 108, 88, 138, 152, 147, 164, 65, 147, + 61, 160, 192, 44, 56, 103, 144, 51, 153, 224, 38, 97, 173, 128, 34, + 85, 89, 143, 17, 239, 200, 47, 160, 2, 151, 249, 219, 208, 116, 71, + 205, 72, 210, 178, 205, 184, 207, 19, 37, 127, 183, 21, 229, 176, 91, + 196, 203, 225, 67, 189, 94, 214, 180, 203, 140, 186, 39, 250, 66, 3, + 128, 35, 206, 43, 67, 244, 207, 157, 165, 188, 201, 173, 43, 47, 210, + 139, 254, 144, 218, 62, 55, 6, 187, 32, 128, 206, 56, 74, 66, 42, + 159, 171, 108, 56, 220, 246, 127, 127, 32, 221, 190, 33, 91, 93, 88, + 36, 51, 115, 93, 47, 203, 133, 155, 166, 13, 124, 118, 56, 182, 202, + 55, 224, 226, 36, 233, 9, 200, 217, 249, 22, 252, 209, 179, 66, 32, + 30, 129, 48, 186, 232, 66, 248, 197, 120, 168, 191, 124, 16, 232, 117, + 44, 125, 188, 157, 71, 35, 245, 219, 17, 111, 41, 159, 96, 44, 233, + 3, 105, 109, 199, 182, 42, 34, 87, 218, 48, 142, 196, 99, 37, 89, + 44, 173, 184, 160, 104, 203, 224, 230, 58, 60, 213, 132, 9, 9, 253, + 251, 72, 75, 235, 224, 20, 198, 208, 178, 42, 253, 126, 105, 227, 171, + 89, 93, 42, 222, 185, 232, 8, 248, 83, 78, 132, 37, 38, 173, 67, + 116, 185, 216, 47, 192, 196, 221, 172, 26, 5, 191, 41, 33, 114, 40, + 139, 22, 147, 173, 234, 41, 252, 118, 244, 73, 73, 237, 42, 6, 123, + 228, 213, 210, 202, 65, 195, 253, 112, 57, 202, 85, 247, 15, 160, 237, + 138, 76, 70, 94, 230, 163, 112, 217, 134, 78, 213, 55, 68, 198, 29, + 195, 16, 138, 162, 19, 34, 158, 144, 131, 64, 244, 80, 85, 63, 175, + 47, 63, 233, 175, 168, 190, 39, 4, 47, 200, 9, 161, 248, 198, 182, + 166, 56, 23, 5, 121, 188, 46, 90, 56, 216, 72, 203, 107, 212, 171, + 110, 134, 255, 24, 243, 30, 188, 55, 111, 8, 238, 198, 201, 180, 150, + 230, 191, 248, 10, 82, 178, 247, 114, 216, 83, 183, 24, 188, 131, 26, + 246, 210, 42, 30, 111, 181, 215, 129, 41, 21, 207, 15, 83, 86, 252, + 169, 220, 246, 117, 114, 254, 143, 193, 60, 123, 226, 202, 18, 77, 221, + 135, 84, 180, 229, 79, 143, 241, 219, 217, 85, 158, 63, 5, 245, 134, + 63, 102, 68, 145, 100, 35, 13, 127, 241, 76, 211, 204, 45, 125, 175, + 128, 142, 244, 189, 203, 138, 63, 249, 2, 174, 167, 171, 32, 131, 12, + 250, 248, 198, 245, 3, 98, 4, 111, 244, 226, 122, 136, 58, 189, 234, + 244, 106, 117, 92, 97, 191, 247, 95, 114, 20, 151, 51, 67, 174, 236, + 109, 252, 215, 107, 183, 174, 254, 59, 22, 158, 203, 152, 194, 135, 200, + 61, 193, 249, 199, 24, 167, 119, 223, 205, 135, 112, 51, 118, 120, 253, + 75, 61, 101, 172, 213, 36, 226, 135, 54, 229, 214, 151, 9, 2, 197, + 84, 22, 207, 55, 182, 191, 53, 243, 63, 53, 13, 93, 121, 44, 174, + 237, 192, 138, 116, 208, 200, 134, 94, 34, 122, 110, 157, 231, 169, 177, + 180, 203, 167, 125, 73, 44, 57, 104, 204, 174, 36, 172, 47, 21, 36, + 220, 92, 62, 191, 77, 113, 5, 32, 8, 115, 61, 235, 237, 27, 76, + 69, 187, 117, 72, 26, 49, 217, 249, 130, 134, 139, 27, 229, 183, 146, + 80, 3, 154, 25, 26, 52, 175, 157, 1, 91, 126, 165, 6, 168, 134, + 60, 32, 227, 68, 161, 126, 207, 247, 160, 103, 105, 156, 129, 211, 220, + 155, 222, 60, 184, 255, 149, 9, 116, 201, 151, 42, 126, 0, 36, 167, + 178, 40, 160, 5, 115, 82, 176, 207, 38, 10, 213, 132, 57, 255, 138, + 4, 204, 32, 33, 128, 174, 99, 94, 161, 237, 0, 230, 209, 198, 89, + 167, 80, 193, 116, 195, 111, 204, 241, 169, 46, 117, 108, 244, 247, 12, + 216, 106, 50, 242, 209, 61, 42, 214, 33, 25, 38, 138, 217, 225, 105, + 76, 244, 126, 252, 253, 57, 238, 107, 166, 158, 250, 132, 105, 91, 184, + 209, 217, 5, 202, 84, 254, 51, 233, 58, 2, 141, 130, 47, 97, 125, + 244, 95, 177, 68, 9, 213, 115, 118, 215, 70, 9, 64, 113, 139, 19, + 165, 231, 204, 191, 129, 15, 235, 143, 225, 241, 75, 168, 227, 126, 58, + 201, 98, 16, 227, 27, 148, 166, 1, 34, 110, 84, 120, 11, 181, 150, + 111, 167, 184, 49, 244, 231, 192, 44, 59, 41, 122, 58, 12, 185, 180, + 54, 122, 106, 201, 2, 65, 118, 129, 149, 139, 31, 201, 205, 90, 96, + 76, 23, 43, 218, 15, 233, 202, 103, 84, 18, 122, 25, 218, 38, 252, + 222, 104, 172, 96, 30, 57, 205, 130, 106, 183, 189, 230, 67, 63, 162, + 142, 46, 199, 45, 244, 3, 26, 208, 119, 15, 16, 29, 196, 178, 90, + 41, 94, 193, 64, 51, 205, 136, 157}; diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec.c new file mode 100644 index 0000000..eb4360b --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec.c @@ -0,0 +1,205 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: rijndael_enc + + Author: Dr Brian Gladman + + Function: rijndael_dec is an implementation of the AES decryption + algorithm (Rijndael). + + Source: security section of MiBench + + Changes: Add computation of a checksum, refactoring + + License: see below + +*/ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +#include "aes.h" +#include "rijndael_dec_libc.h" + +/* + Global variable definitions +*/ + +// Wasm loop bounds + + +#include "aes.c" +#include "input_small_enc.c" +#include "rijndael_dec_libc.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +unsigned char rijndael_dec_key[32]; +int rijndael_dec_key_len; + +extern unsigned char rijndael_dec_data[]; +struct rijndael_dec_FILE rijndael_dec_fin; + +int rijndael_dec_checksum = 0; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void rijndael_dec_init(void); +__attribute__((always_inline)) static inline int rijndael_dec_return(void); +__attribute__((always_inline)) static inline void +rijndael_dec_fillrand(unsigned char *buf, int len); +__attribute__((always_inline)) static inline void +rijndael_dec_decfile(struct rijndael_dec_FILE *fin, struct aes *ctx); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_dec_main(void); + +__attribute__((always_inline)) static inline void +rijndael_dec_init(void) { + /* create a pseudo-file for the input*/ + rijndael_dec_fin.data = rijndael_dec_data; + rijndael_dec_fin.size = 32768; + rijndael_dec_fin.cur_pos = 0; + + unsigned i; + volatile int x = 0; + rijndael_dec_fin.size ^= x; + __pragma_loopbound(32768, 32768); + for (i = 0; i < rijndael_dec_fin.size; i++) + rijndael_dec_fin.data[i] ^= x; + + /* this is a pointer to the hexadecimal key digits */ + const volatile char *cp = + "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321"; + char ch; + int by = 0; + + i = 0; /* this is a count for the input digits processed */ + __pragma_loopbound(64, 64); + while (i < 64 && *cp) { /* the maximum key length is 32 bytes and */ + /* hence at most 64 hexadecimal digits */ + ch = rijndael_dec_toupper(*cp++); /* process a hexadecimal digit */ + if (ch >= '0' && ch <= '9') + by = (by << 4) + ch - '0'; + else if (ch >= 'A' && ch <= 'F') + by = (by << 4) + ch - 'A' + 10; + else { /* error if not hexadecimal */ + rijndael_dec_checksum = -2; + return; + } + + /* store a key byte for each pair of hexadecimal digits */ + if (i++ & 1) + rijndael_dec_key[i / 2 - 1] = by & 0xff; + } + + if (*cp) { + rijndael_dec_checksum = -3; + return; + } else if (i < 32 || (i & 15)) { + rijndael_dec_checksum = -4; + return; + } + + rijndael_dec_key_len = i / 2; +} + +__attribute__((always_inline)) static inline int +rijndael_dec_return(void) { + return ((rijndael_dec_checksum == (int) 262180) ? 0 : -1); +} + +__attribute__((always_inline)) static inline void +rijndael_dec_decfile(struct rijndael_dec_FILE *fin, struct aes *ctx) { + unsigned char inbuf1[16], inbuf2[16], outbuf[16], *bp1, *bp2, *tp; + int i; + + rijndael_dec_fread(inbuf1, 1, 16, fin); + + i = rijndael_dec_fread(inbuf2, 1, 16, + fin); /* read 1st encrypted file block */ + + if (i && i != 16) { + rijndael_dec_checksum = -10; + return; + } + + rijndael_dec_decrypt(inbuf2, outbuf, ctx); /* decrypt it */ + + rijndael_dec_checksum += outbuf[15]; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor with previous input */ + outbuf[i] ^= inbuf1[i]; + + bp1 = inbuf1; /* set up pointers to two input buffers */ + bp2 = inbuf2; + + /* TODO: this is necessarily an input-dependent loop bound */ + __pragma_loopbound(2046, 2046); + while (1) { + i = rijndael_dec_fread(bp1, 1, 16, fin); /* read next encrypted block */ + /* to first input buffer */ + if (i != 16) /* no more bytes in input - the decrypted */ + break; /* partial final buffer needs to be output */ + + /* if a block has been read the previous block must have been */ + /* full lnegth so we can now write it out */ + + rijndael_dec_decrypt(bp1, outbuf, + ctx); /* decrypt the new input block and */ + + rijndael_dec_checksum += outbuf[15]; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor it with previous + input block */ + outbuf[i] ^= bp2[i]; + + /* swap buffer pointers */ + tp = bp1, bp1 = bp2, bp2 = tp; + } +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_dec_main(void) { + struct aes ctx[1]; + + /* decryption in Cipher Block Chaining mode */ + rijndael_dec_set_key(rijndael_dec_key, rijndael_dec_key_len, dec, ctx); + rijndael_dec_decfile(&rijndael_dec_fin, ctx); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main() { + + rijndael_dec_init(); + rijndael_dec_main(); + + return (rijndael_dec_return()); +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.c b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.c new file mode 100644 index 0000000..7923ac6 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.c @@ -0,0 +1,70 @@ +#include "rijndael_dec_libc.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int +rijndael_dec_toupper(int c) { + if ((c >= 'a') && (c <= 'z')) + return c - 'a' + 'A'; + return c; +} + +__attribute__((always_inline)) static inline unsigned long +rijndael_dec_fread(void *ptr, unsigned long size, unsigned long count, + struct rijndael_dec_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 16); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +__attribute__((always_inline)) static inline unsigned long +rijndael_dec_fwrite(const void *ptr, unsigned long size, unsigned long count, + struct rijndael_dec_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_write = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 0); + while (i < stream->cur_pos + number_of_chars_to_write) + stream->data[i++] = ((unsigned char *) ptr)[i2++]; + stream->cur_pos += number_of_chars_to_write; + return number_of_chars_to_write; +} + +__attribute__((always_inline)) static inline int +rijndael_dec_fseek(struct rijndael_dec_FILE *stream, long int offset, + Origin origin) { + if (origin == RIJNDAEL_DEC_SEEK_SET) { + stream->cur_pos = offset; + return 0; + } else if (origin == RIJNDAEL_DEC_SEEK_CUR) { + stream->cur_pos += offset; + return 0; + } else if (origin == RIJNDAEL_DEC_SEEK_END) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +__attribute__((always_inline)) static inline int +rijndael_dec_fgetpos(struct rijndael_dec_FILE *stream, unsigned *position) { + *position = stream->cur_pos; + return 0; +} + +__attribute__((always_inline)) static inline int +rijndael_dec_feof(struct rijndael_dec_FILE *stream) { + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.h b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.h new file mode 100644 index 0000000..c402be5 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/generated/modified_sources/inline/rijndael_dec_libc.h @@ -0,0 +1,33 @@ + +#ifndef RIJNDAEL_DEC_LIBC_H +#define RIJNDAEL_DEC_LIBC_H + +__attribute__((always_inline)) static inline int rijndael_dec_toupper(int c); + +enum _Origin_ { + RIJNDAEL_DEC_SEEK_SET, + RIJNDAEL_DEC_SEEK_CUR, + RIJNDAEL_DEC_SEEK_END +}; +typedef enum _Origin_ Origin; +struct rijndael_dec_FILE { + unsigned char *data; + unsigned long size; + unsigned cur_pos; +}; + +__attribute__((always_inline)) static inline unsigned long +rijndael_dec_fread(void *ptr, unsigned long size, unsigned long count, + struct rijndael_dec_FILE *stream); +__attribute__((always_inline)) static inline unsigned long +rijndael_dec_fwrite(const void *ptr, unsigned long size, unsigned long count, + struct rijndael_dec_FILE *stream); +__attribute__((always_inline)) static inline int +rijndael_dec_fseek(struct rijndael_dec_FILE *stream, long int offset, + Origin origin); +__attribute__((always_inline)) static inline int +rijndael_dec_fgetpos(struct rijndael_dec_FILE *stream, unsigned *position); +__attribute__((always_inline)) static inline int +rijndael_dec_feof(struct rijndael_dec_FILE *stream); + +#endif // RIJNDAEL_DEC_LIBC_H diff --git a/targets/wasm-tacle/sequential/rijndael_dec/input_small_enc.c b/targets/wasm-tacle/sequential/rijndael_dec/input_small_enc.c new file mode 100755 index 0000000..431ff7c --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/input_small_enc.c @@ -0,0 +1,2051 @@ +unsigned char rijndael_dec_data[ ] = { + 96, 83, 127, 28, 212, 92, 146, 102, 38, 17, 193, 142, 95, 217, 184, 105, + 79, 112, 144, 112, 44, 202, 141, 48, 181, 177, 82, 92, 208, 250, 216, 152, + 41, 208, 7, 232, 238, 116, 134, 238, 230, 190, 239, 195, 235, 80, 125, 51, + 251, 39, 7, 100, 213, 190, 189, 81, 241, 49, 215, 254, 253, 203, 13, 164, + 175, 244, 25, 111, 226, 225, 176, 96, 58, 165, 32, 243, 68, 205, 209, 242, + 186, 229, 167, 155, 238, 105, 120, 173, 246, 72, 29, 96, 71, 169, 83, 154, + 226, 129, 236, 52, 243, 159, 61, 71, 20, 119, 245, 196, 25, 203, 11, 10, + 37, 163, 139, 180, 250, 191, 138, 99, 78, 192, 73, 186, 22, 12, 119, 151, + 185, 155, 195, 54, 73, 207, 108, 170, 112, 237, 100, 165, 219, 223, 23, 179, + 124, 172, 52, 22, 143, 57, 132, 60, 176, 218, 11, 86, 89, 59, 254, 84, + 180, 76, 120, 174, 17, 214, 88, 48, 240, 12, 56, 93, 136, 156, 75, 176, + 30, 43, 4, 107, 30, 210, 26, 183, 235, 39, 35, 205, 139, 80, 249, 182, + 15, 91, 210, 234, 47, 67, 64, 234, 148, 108, 240, 242, 32, 11, 48, 199, + 117, 31, 149, 30, 97, 149, 241, 50, 177, 166, 127, 31, 135, 115, 240, 77, + 198, 88, 108, 246, 108, 148, 158, 89, 173, 233, 252, 95, 51, 42, 218, 54, + 28, 143, 203, 164, 74, 147, 55, 108, 225, 222, 87, 161, 243, 35, 179, 130, + 29, 70, 225, 178, 148, 152, 247, 167, 21, 245, 84, 139, 3, 228, 221, 25, + 53, 36, 121, 29, 204, 35, 1, 46, 26, 8, 237, 102, 231, 252, 176, 88, + 24, 110, 255, 163, 86, 64, 117, 68, 178, 73, 219, 201, 24, 155, 76, 255, + 253, 199, 165, 95, 246, 179, 15, 47, 203, 81, 92, 231, 246, 247, 111, 58, + 82, 222, 193, 24, 37, 164, 161, 8, 169, 172, 223, 111, 186, 72, 160, 116, + 242, 8, 192, 178, 224, 177, 228, 42, 102, 206, 237, 52, 143, 16, 150, 143, + 108, 3, 88, 81, 199, 49, 110, 220, 5, 89, 244, 227, 27, 226, 101, 9, + 238, 0, 206, 228, 254, 19, 189, 240, 159, 29, 46, 2, 206, 184, 205, 228, + 144, 241, 88, 78, 156, 23, 44, 200, 99, 146, 179, 96, 1, 143, 87, 57, + 39, 75, 174, 32, 190, 125, 152, 183, 46, 39, 136, 88, 240, 110, 104, 70, + 253, 29, 110, 113, 235, 123, 56, 60, 243, 238, 246, 113, 11, 18, 246, 108, + 95, 238, 177, 43, 3, 112, 121, 161, 196, 204, 211, 171, 197, 41, 249, 71, + 194, 153, 82, 28, 10, 28, 12, 241, 212, 90, 124, 236, 171, 54, 35, 226, + 152, 246, 241, 74, 139, 133, 241, 76, 183, 197, 232, 250, 54, 202, 11, 10, + 203, 30, 169, 138, 110, 252, 62, 172, 6, 241, 81, 181, 87, 177, 128, 221, + 111, 133, 94, 251, 184, 54, 92, 242, 28, 112, 138, 116, 32, 164, 158, 59, + 51, 30, 155, 126, 196, 117, 233, 117, 92, 74, 4, 72, 19, 237, 248, 142, + 184, 175, 126, 203, 4, 210, 70, 40, 105, 16, 36, 42, 118, 110, 4, 180, + 208, 52, 232, 230, 107, 154, 233, 61, 176, 170, 32, 59, 60, 47, 43, 70, + 71, 3, 58, 24, 166, 22, 165, 154, 255, 166, 12, 81, 63, 116, 146, 12, + 5, 6, 133, 240, 110, 253, 209, 15, 71, 179, 93, 203, 58, 138, 5, 90, + 111, 140, 19, 186, 191, 68, 230, 121, 95, 166, 219, 107, 233, 156, 18, 145, + 239, 150, 234, 191, 91, 233, 114, 5, 215, 85, 30, 66, 33, 152, 117, 128, + 236, 189, 201, 203, 10, 184, 198, 249, 61, 27, 144, 102, 246, 191, 54, 129, + 86, 8, 197, 98, 231, 234, 222, 164, 161, 40, 150, 253, 208, 82, 92, 225, + 85, 206, 59, 1, 170, 5, 255, 219, 89, 204, 122, 169, 78, 8, 5, 70, + 75, 128, 80, 176, 16, 214, 253, 176, 255, 191, 91, 89, 126, 155, 128, 195, + 56, 150, 101, 131, 255, 234, 241, 250, 61, 210, 85, 19, 21, 23, 122, 180, + 34, 100, 102, 166, 128, 21, 177, 11, 86, 110, 112, 179, 126, 36, 152, 196, + 62, 185, 186, 20, 91, 35, 85, 148, 168, 68, 145, 245, 170, 25, 190, 237, + 192, 125, 186, 182, 22, 188, 161, 122, 194, 21, 14, 102, 206, 60, 129, 156, + 173, 176, 37, 112, 129, 145, 177, 101, 206, 179, 35, 221, 107, 228, 181, 212, + 52, 253, 241, 145, 121, 128, 68, 118, 78, 66, 166, 78, 176, 62, 217, 243, + 193, 1, 254, 200, 35, 67, 226, 77, 55, 72, 6, 144, 22, 85, 252, 209, + 142, 65, 226, 158, 126, 168, 175, 179, 219, 116, 235, 227, 42, 49, 126, 126, + 215, 200, 126, 0, 39, 247, 161, 217, 26, 228, 232, 113, 53, 151, 34, 223, + 91, 242, 155, 156, 144, 229, 237, 127, 227, 49, 239, 71, 102, 115, 74, 135, + 103, 13, 3, 108, 101, 211, 36, 59, 146, 143, 230, 44, 212, 145, 229, 53, + 108, 175, 42, 131, 113, 123, 30, 28, 149, 153, 117, 233, 76, 33, 148, 110, + 19, 83, 125, 135, 44, 202, 2, 155, 4, 240, 167, 7, 13, 115, 243, 216, + 73, 248, 216, 82, 230, 153, 48, 234, 157, 2, 130, 99, 147, 2, 244, 19, + 125, 30, 39, 148, 49, 134, 140, 240, 128, 230, 171, 24, 53, 245, 54, 72, + 111, 230, 192, 165, 199, 47, 186, 238, 121, 95, 220, 76, 229, 253, 157, 47, + 34, 47, 39, 77, 199, 203, 163, 148, 172, 56, 204, 96, 69, 235, 215, 96, + 92, 139, 92, 49, 73, 228, 70, 221, 18, 84, 167, 179, 201, 239, 71, 64, + 29, 247, 84, 56, 148, 36, 169, 144, 192, 60, 153, 171, 89, 125, 48, 98, + 201, 56, 230, 154, 146, 46, 184, 202, 3, 39, 113, 90, 249, 163, 0, 188, + 233, 10, 216, 17, 159, 42, 134, 57, 70, 24, 33, 63, 8, 67, 85, 7, + 133, 180, 127, 12, 234, 121, 183, 38, 131, 154, 241, 236, 69, 67, 116, 54, + 40, 225, 6, 220, 22, 251, 1, 100, 110, 165, 114, 12, 170, 21, 190, 103, + 242, 171, 216, 66, 30, 3, 214, 137, 231, 172, 61, 8, 249, 198, 113, 181, + 171, 13, 159, 21, 147, 67, 249, 94, 189, 174, 15, 2, 62, 254, 29, 32, + 209, 169, 184, 119, 220, 98, 248, 163, 171, 22, 62, 125, 155, 100, 186, 97, + 163, 245, 70, 216, 246, 1, 11, 83, 41, 100, 64, 52, 99, 184, 151, 99, + 46, 100, 168, 158, 210, 150, 38, 231, 27, 255, 59, 141, 232, 127, 56, 39, + 194, 104, 178, 151, 15, 25, 219, 221, 81, 119, 178, 153, 94, 173, 64, 215, + 128, 132, 163, 159, 214, 254, 181, 194, 113, 144, 141, 103, 17, 108, 178, 59, + 62, 205, 117, 57, 183, 97, 18, 210, 87, 163, 231, 213, 233, 251, 94, 136, + 217, 168, 69, 48, 55, 68, 144, 203, 187, 51, 211, 151, 1, 194, 118, 181, + 154, 103, 186, 87, 43, 128, 215, 79, 101, 175, 60, 221, 158, 189, 94, 194, + 87, 73, 72, 162, 252, 26, 40, 142, 86, 228, 82, 255, 122, 192, 167, 78, + 177, 40, 249, 195, 100, 188, 31, 208, 124, 123, 31, 121, 244, 4, 82, 3, + 132, 15, 2, 29, 186, 76, 106, 109, 158, 114, 25, 212, 74, 64, 255, 43, + 40, 146, 159, 225, 39, 65, 85, 37, 60, 160, 123, 116, 127, 134, 45, 177, + 191, 49, 136, 211, 167, 218, 197, 15, 96, 45, 55, 11, 237, 103, 118, 207, + 0, 211, 25, 143, 19, 93, 114, 90, 105, 253, 88, 140, 207, 56, 150, 0, + 136, 159, 134, 63, 75, 142, 177, 0, 107, 105, 78, 148, 214, 248, 70, 72, + 125, 220, 156, 220, 222, 102, 202, 176, 12, 58, 24, 39, 254, 170, 130, 77, + 203, 193, 162, 56, 162, 57, 76, 153, 170, 112, 94, 0, 220, 58, 58, 40, + 173, 2, 193, 164, 168, 127, 225, 238, 10, 194, 112, 213, 181, 126, 222, 152, + 12, 57, 14, 146, 137, 154, 203, 179, 45, 133, 70, 204, 66, 249, 32, 136, + 145, 0, 221, 224, 10, 1, 202, 139, 145, 247, 72, 254, 32, 169, 121, 167, + 114, 198, 244, 251, 243, 8, 114, 188, 178, 173, 25, 243, 122, 220, 45, 98, + 7, 168, 66, 58, 225, 217, 152, 81, 89, 39, 167, 146, 181, 138, 253, 196, + 145, 4, 72, 9, 14, 137, 155, 32, 217, 64, 4, 173, 220, 66, 114, 21, + 137, 118, 87, 163, 217, 204, 74, 236, 45, 170, 60, 141, 216, 234, 182, 79, + 74, 73, 94, 63, 89, 134, 88, 64, 32, 241, 9, 114, 253, 164, 108, 31, + 27, 42, 172, 7, 102, 213, 153, 83, 1, 152, 136, 224, 248, 70, 112, 15, + 211, 194, 216, 16, 255, 62, 83, 147, 173, 192, 239, 55, 18, 223, 34, 152, + 25, 163, 229, 4, 55, 219, 235, 187, 51, 116, 12, 202, 198, 116, 188, 217, + 91, 30, 11, 9, 13, 222, 120, 16, 93, 99, 56, 129, 27, 133, 155, 120, + 124, 112, 101, 42, 222, 122, 124, 59, 84, 228, 202, 189, 13, 11, 10, 44, + 220, 97, 67, 53, 246, 47, 230, 131, 192, 1, 247, 137, 90, 77, 243, 131, + 2, 130, 93, 183, 117, 102, 69, 191, 27, 87, 103, 218, 157, 124, 17, 209, + 135, 92, 78, 211, 141, 25, 157, 53, 17, 249, 209, 206, 84, 19, 135, 253, + 57, 36, 38, 112, 184, 61, 76, 5, 203, 155, 7, 9, 179, 167, 38, 136, + 189, 40, 19, 183, 132, 81, 135, 167, 48, 74, 186, 249, 144, 193, 150, 73, + 10, 192, 191, 160, 74, 246, 12, 38, 107, 3, 66, 122, 184, 168, 218, 233, + 78, 216, 11, 57, 124, 104, 167, 0, 187, 2, 214, 136, 252, 60, 85, 128, + 128, 31, 70, 197, 211, 180, 216, 75, 212, 163, 168, 15, 174, 44, 194, 231, + 24, 181, 154, 161, 241, 95, 197, 227, 146, 195, 187, 69, 127, 154, 145, 176, + 180, 157, 13, 225, 107, 60, 29, 14, 223, 93, 214, 248, 107, 65, 168, 251, + 231, 46, 34, 203, 76, 20, 206, 125, 80, 25, 196, 60, 213, 51, 238, 73, + 17, 223, 151, 44, 60, 213, 164, 117, 188, 66, 195, 170, 190, 117, 110, 21, + 27, 78, 244, 124, 224, 142, 182, 10, 122, 135, 121, 143, 240, 124, 6, 8, + 22, 15, 3, 137, 12, 19, 11, 62, 212, 205, 3, 202, 189, 157, 141, 68, + 171, 142, 106, 69, 207, 8, 116, 194, 6, 200, 96, 220, 248, 132, 46, 171, + 57, 234, 31, 3, 112, 108, 15, 139, 243, 34, 181, 250, 10, 86, 71, 162, + 167, 85, 177, 57, 166, 80, 41, 253, 128, 28, 127, 220, 149, 27, 29, 41, + 201, 116, 211, 236, 34, 200, 100, 157, 130, 223, 4, 162, 108, 181, 40, 255, + 96, 18, 77, 36, 217, 17, 225, 142, 124, 17, 91, 227, 13, 224, 213, 37, + 115, 216, 93, 149, 103, 105, 152, 190, 207, 54, 74, 226, 78, 133, 200, 252, + 157, 152, 39, 0, 173, 168, 132, 142, 17, 66, 241, 137, 12, 106, 42, 81, + 239, 78, 31, 131, 49, 243, 122, 178, 212, 137, 160, 104, 15, 145, 15, 116, + 103, 141, 94, 40, 127, 180, 174, 96, 222, 182, 226, 168, 174, 113, 228, 156, + 10, 18, 231, 122, 150, 178, 17, 200, 254, 96, 42, 243, 225, 58, 235, 64, + 159, 73, 162, 72, 46, 160, 33, 191, 99, 73, 130, 32, 135, 84, 29, 100, + 232, 75, 110, 180, 226, 11, 143, 127, 79, 246, 48, 148, 229, 211, 204, 72, + 18, 89, 22, 251, 202, 8, 10, 2, 130, 230, 219, 71, 66, 142, 149, 47, + 12, 117, 202, 224, 248, 35, 75, 242, 87, 125, 230, 66, 38, 160, 62, 248, + 213, 32, 166, 83, 220, 230, 0, 1, 147, 51, 128, 110, 20, 16, 43, 142, + 90, 0, 2, 104, 111, 232, 38, 29, 181, 243, 130, 121, 105, 177, 168, 113, + 126, 191, 59, 205, 27, 180, 49, 128, 160, 225, 23, 173, 193, 155, 123, 12, + 173, 72, 139, 63, 23, 232, 138, 235, 39, 179, 158, 95, 103, 192, 13, 242, + 11, 127, 239, 91, 13, 119, 19, 185, 105, 87, 195, 168, 145, 15, 53, 146, + 35, 227, 101, 234, 198, 247, 19, 29, 134, 126, 211, 133, 78, 186, 127, 129, + 181, 115, 133, 62, 166, 133, 128, 225, 101, 98, 146, 175, 110, 113, 171, 117, + 4, 130, 190, 186, 216, 17, 201, 29, 62, 77, 74, 189, 50, 155, 188, 93, + 237, 26, 100, 225, 91, 120, 229, 163, 16, 210, 167, 138, 241, 147, 36, 56, + 12, 100, 33, 55, 232, 200, 118, 3, 222, 31, 72, 167, 91, 45, 133, 62, + 184, 64, 120, 116, 249, 12, 15, 243, 98, 145, 234, 253, 71, 194, 61, 4, + 102, 112, 35, 27, 75, 13, 1, 4, 128, 238, 170, 187, 80, 147, 216, 165, + 147, 248, 250, 241, 69, 106, 233, 227, 22, 153, 120, 138, 113, 83, 104, 154, + 50, 99, 153, 188, 69, 252, 171, 177, 49, 74, 134, 219, 247, 255, 191, 202, + 165, 239, 179, 147, 91, 215, 195, 157, 68, 21, 180, 112, 187, 51, 66, 80, + 205, 100, 35, 78, 59, 92, 175, 87, 224, 170, 237, 223, 224, 83, 182, 199, + 47, 95, 111, 42, 197, 22, 21, 143, 123, 173, 69, 247, 31, 205, 69, 136, + 137, 136, 241, 233, 67, 7, 225, 112, 102, 92, 180, 211, 254, 29, 129, 29, + 21, 188, 44, 95, 57, 122, 17, 196, 213, 33, 56, 23, 88, 236, 185, 35, + 17, 156, 165, 93, 108, 157, 198, 5, 124, 225, 150, 156, 146, 116, 88, 116, + 181, 207, 90, 85, 145, 228, 231, 91, 116, 79, 6, 119, 6, 207, 190, 102, + 72, 242, 2, 253, 79, 92, 88, 189, 28, 57, 28, 101, 199, 134, 124, 215, + 59, 37, 222, 54, 194, 151, 252, 185, 74, 101, 193, 43, 186, 184, 255, 158, + 129, 183, 83, 176, 249, 134, 58, 15, 49, 213, 127, 162, 179, 56, 53, 4, + 114, 112, 29, 84, 246, 109, 46, 153, 97, 30, 208, 98, 234, 155, 104, 158, + 93, 9, 53, 175, 49, 54, 160, 238, 150, 117, 145, 202, 210, 37, 15, 3, + 100, 20, 116, 153, 90, 23, 2, 146, 58, 182, 199, 197, 122, 89, 30, 152, + 241, 105, 97, 115, 131, 111, 4, 235, 217, 213, 144, 218, 217, 201, 141, 113, + 21, 237, 254, 184, 181, 135, 177, 86, 215, 248, 169, 55, 231, 229, 60, 133, + 12, 194, 206, 112, 206, 175, 216, 131, 181, 41, 154, 235, 76, 152, 58, 118, + 111, 32, 220, 219, 253, 198, 18, 227, 71, 129, 197, 227, 96, 155, 66, 0, + 51, 132, 150, 208, 177, 188, 149, 100, 236, 23, 49, 45, 236, 131, 225, 206, + 77, 77, 94, 12, 244, 159, 85, 247, 189, 109, 141, 217, 80, 115, 44, 171, + 138, 68, 128, 147, 244, 213, 43, 187, 135, 126, 156, 158, 199, 61, 180, 112, + 130, 230, 146, 100, 106, 56, 70, 71, 234, 3, 202, 1, 45, 20, 136, 149, + 112, 178, 25, 110, 160, 221, 57, 191, 78, 9, 250, 233, 4, 144, 28, 219, + 200, 203, 227, 218, 229, 108, 59, 221, 141, 0, 122, 121, 65, 156, 204, 19, + 152, 215, 64, 164, 15, 77, 26, 113, 82, 229, 23, 103, 204, 151, 118, 104, + 171, 115, 72, 191, 5, 159, 133, 83, 221, 228, 120, 127, 46, 233, 14, 27, + 216, 31, 63, 179, 224, 226, 121, 29, 62, 47, 199, 67, 60, 240, 85, 175, + 242, 113, 168, 160, 93, 147, 205, 103, 67, 110, 237, 143, 148, 65, 209, 31, + 100, 252, 166, 254, 170, 52, 203, 222, 75, 219, 77, 217, 202, 18, 117, 253, + 92, 29, 205, 115, 53, 255, 251, 150, 164, 72, 146, 6, 101, 161, 127, 50, + 73, 152, 194, 180, 11, 121, 11, 229, 147, 151, 143, 226, 196, 238, 131, 141, + 173, 153, 189, 114, 16, 82, 1, 70, 239, 22, 85, 108, 113, 21, 231, 43, + 6, 228, 54, 94, 200, 186, 190, 143, 117, 156, 22, 30, 9, 64, 25, 8, + 116, 27, 240, 24, 150, 146, 224, 73, 97, 95, 183, 151, 185, 178, 16, 82, + 243, 208, 160, 186, 246, 234, 223, 35, 6, 166, 7, 105, 224, 246, 14, 208, + 1, 70, 244, 221, 238, 235, 86, 81, 136, 40, 99, 104, 89, 22, 194, 40, + 36, 45, 126, 138, 174, 22, 206, 228, 146, 114, 162, 4, 211, 213, 163, 224, + 91, 3, 85, 140, 140, 202, 204, 23, 194, 108, 166, 123, 1, 36, 191, 161, + 38, 228, 65, 249, 235, 26, 156, 83, 68, 199, 239, 109, 1, 203, 198, 25, + 22, 128, 165, 15, 125, 139, 190, 100, 184, 159, 16, 194, 244, 228, 18, 215, + 103, 169, 32, 208, 12, 104, 94, 71, 209, 193, 160, 161, 73, 38, 35, 49, + 202, 29, 193, 120, 100, 98, 219, 44, 27, 224, 222, 226, 105, 153, 17, 252, + 120, 143, 190, 173, 176, 89, 205, 149, 11, 99, 31, 107, 102, 187, 100, 107, + 200, 1, 130, 89, 75, 71, 196, 150, 89, 231, 28, 213, 173, 229, 173, 104, + 156, 123, 227, 163, 65, 230, 167, 67, 242, 143, 224, 224, 161, 249, 205, 140, + 149, 156, 2, 138, 177, 193, 136, 225, 177, 34, 246, 27, 179, 108, 116, 169, + 0, 183, 169, 12, 239, 230, 127, 169, 170, 144, 151, 36, 111, 52, 132, 2, + 15, 237, 209, 133, 254, 241, 184, 232, 116, 11, 221, 210, 64, 96, 18, 30, + 245, 95, 142, 84, 218, 92, 151, 20, 155, 101, 201, 153, 82, 163, 43, 168, + 152, 90, 224, 18, 112, 161, 123, 115, 129, 136, 198, 50, 186, 239, 28, 80, + 91, 20, 73, 6, 150, 187, 56, 54, 200, 67, 26, 62, 0, 229, 42, 210, + 107, 245, 83, 172, 233, 195, 140, 31, 24, 205, 202, 128, 145, 242, 73, 113, + 92, 176, 3, 146, 170, 21, 106, 67, 53, 254, 192, 212, 194, 6, 52, 81, + 163, 236, 63, 95, 164, 91, 60, 20, 9, 201, 74, 143, 55, 110, 76, 61, + 115, 177, 84, 105, 191, 199, 248, 51, 89, 35, 91, 44, 199, 13, 254, 130, + 142, 136, 64, 111, 128, 229, 171, 208, 183, 242, 195, 251, 72, 168, 31, 76, + 89, 102, 122, 181, 57, 110, 17, 196, 31, 136, 185, 196, 118, 100, 188, 100, + 21, 239, 206, 77, 97, 238, 78, 215, 224, 113, 210, 122, 141, 190, 103, 135, + 12, 41, 206, 157, 154, 10, 167, 133, 183, 60, 230, 235, 109, 33, 95, 121, + 34, 206, 1, 149, 114, 4, 252, 42, 17, 93, 191, 144, 133, 226, 101, 215, + 124, 88, 163, 27, 29, 189, 35, 51, 182, 112, 242, 94, 56, 196, 99, 242, + 77, 95, 123, 219, 81, 71, 229, 138, 101, 8, 77, 79, 2, 166, 195, 239, + 148, 221, 188, 20, 170, 26, 215, 139, 42, 171, 153, 219, 107, 191, 90, 185, + 241, 37, 84, 41, 232, 27, 123, 36, 86, 113, 255, 25, 245, 187, 21, 110, + 13, 17, 43, 99, 91, 182, 243, 239, 194, 150, 187, 111, 30, 83, 28, 111, + 249, 159, 212, 187, 184, 177, 12, 234, 107, 211, 32, 118, 132, 10, 145, 19, + 150, 206, 230, 158, 80, 101, 41, 67, 38, 79, 57, 164, 80, 147, 64, 207, + 231, 229, 162, 5, 185, 40, 164, 17, 84, 156, 1, 52, 181, 67, 63, 182, + 25, 68, 55, 167, 230, 125, 225, 234, 125, 79, 102, 35, 54, 2, 12, 145, + 67, 6, 252, 218, 231, 14, 58, 221, 248, 171, 23, 93, 14, 51, 76, 155, + 97, 239, 11, 95, 245, 154, 209, 127, 208, 19, 209, 158, 67, 164, 1, 123, + 230, 90, 236, 148, 77, 210, 240, 27, 154, 16, 146, 19, 107, 106, 141, 94, + 144, 28, 24, 130, 111, 164, 46, 108, 89, 171, 52, 192, 121, 188, 166, 207, + 164, 98, 57, 189, 54, 190, 18, 4, 120, 181, 18, 216, 162, 19, 111, 254, + 71, 171, 194, 79, 73, 122, 9, 115, 63, 61, 88, 117, 234, 203, 250, 167, + 102, 98, 101, 177, 5, 13, 228, 205, 115, 107, 219, 215, 33, 150, 13, 242, + 180, 71, 27, 0, 250, 228, 50, 129, 215, 93, 174, 169, 167, 125, 14, 89, + 130, 195, 127, 158, 250, 249, 142, 213, 5, 1, 250, 31, 122, 171, 62, 142, + 38, 84, 165, 95, 237, 144, 145, 189, 193, 248, 121, 112, 22, 11, 26, 192, + 90, 76, 117, 89, 160, 228, 152, 24, 129, 235, 37, 24, 66, 68, 161, 126, + 147, 44, 172, 137, 134, 203, 162, 152, 255, 161, 135, 6, 31, 72, 69, 9, + 228, 3, 80, 28, 50, 240, 176, 66, 255, 231, 21, 233, 149, 55, 211, 15, + 182, 116, 165, 211, 190, 28, 69, 40, 3, 164, 172, 212, 150, 181, 213, 32, + 174, 216, 8, 243, 29, 152, 124, 7, 111, 140, 53, 157, 158, 233, 175, 60, + 191, 179, 131, 248, 252, 50, 171, 165, 5, 51, 69, 215, 168, 222, 57, 221, + 164, 56, 193, 114, 18, 89, 219, 222, 198, 163, 200, 233, 28, 51, 190, 25, + 206, 243, 63, 51, 44, 10, 57, 71, 252, 230, 161, 141, 79, 31, 30, 150, + 101, 168, 23, 70, 216, 216, 160, 241, 192, 106, 92, 194, 141, 81, 100, 222, + 165, 180, 27, 70, 201, 219, 31, 177, 189, 114, 30, 74, 6, 184, 114, 208, + 189, 246, 83, 107, 229, 153, 69, 66, 201, 253, 183, 5, 134, 156, 200, 132, + 187, 73, 175, 213, 178, 14, 66, 101, 13, 224, 49, 205, 244, 124, 231, 18, + 71, 94, 246, 29, 78, 201, 138, 60, 97, 54, 156, 123, 144, 143, 6, 191, + 113, 140, 251, 203, 125, 196, 135, 169, 197, 34, 215, 77, 138, 218, 63, 56, + 145, 74, 225, 15, 227, 112, 113, 160, 165, 122, 85, 179, 97, 146, 5, 221, + 133, 236, 170, 2, 236, 128, 19, 252, 238, 120, 0, 192, 55, 5, 138, 161, + 222, 148, 189, 130, 53, 250, 36, 153, 248, 210, 197, 167, 236, 128, 191, 37, + 251, 151, 163, 190, 155, 38, 27, 164, 166, 238, 185, 11, 214, 212, 122, 206, + 212, 255, 103, 255, 69, 146, 54, 182, 52, 54, 169, 121, 244, 205, 244, 168, + 96, 163, 220, 75, 194, 10, 133, 204, 105, 10, 228, 139, 62, 39, 254, 131, + 5, 243, 54, 14, 158, 107, 118, 143, 81, 55, 251, 151, 226, 29, 54, 218, + 99, 187, 76, 178, 61, 206, 20, 170, 229, 190, 77, 215, 47, 104, 244, 87, + 101, 82, 50, 41, 255, 56, 6, 226, 22, 153, 19, 72, 227, 63, 224, 79, + 3, 130, 220, 135, 116, 39, 25, 98, 107, 50, 214, 183, 120, 215, 26, 160, + 247, 26, 190, 119, 146, 181, 147, 36, 15, 75, 109, 71, 72, 44, 14, 9, + 61, 201, 200, 222, 53, 246, 57, 69, 63, 108, 133, 140, 150, 33, 233, 46, + 84, 102, 150, 204, 129, 195, 97, 4, 69, 176, 166, 182, 10, 237, 141, 33, + 70, 200, 98, 101, 157, 9, 70, 227, 108, 195, 241, 72, 105, 86, 67, 5, + 242, 199, 149, 33, 43, 105, 206, 122, 20, 13, 28, 158, 131, 47, 202, 70, + 9, 92, 32, 10, 251, 103, 49, 185, 35, 242, 168, 151, 234, 237, 212, 91, + 81, 113, 133, 247, 204, 23, 4, 9, 226, 14, 29, 117, 236, 101, 250, 46, + 161, 149, 131, 98, 141, 228, 72, 18, 164, 252, 56, 7, 160, 217, 183, 125, + 121, 154, 169, 152, 211, 114, 24, 190, 141, 135, 41, 173, 250, 50, 54, 197, + 65, 67, 117, 246, 235, 130, 142, 138, 62, 216, 51, 193, 247, 30, 164, 235, + 209, 157, 138, 4, 147, 6, 253, 187, 34, 124, 1, 143, 60, 95, 168, 72, + 167, 72, 72, 13, 142, 35, 185, 107, 29, 51, 189, 48, 141, 194, 33, 77, + 118, 17, 80, 88, 204, 147, 148, 143, 103, 246, 97, 180, 153, 160, 112, 81, + 196, 2, 222, 148, 126, 240, 27, 61, 128, 155, 184, 106, 89, 36, 136, 230, + 128, 84, 217, 130, 139, 104, 115, 225, 73, 77, 7, 49, 183, 4, 250, 124, + 196, 34, 183, 209, 17, 136, 92, 16, 94, 51, 78, 174, 185, 117, 243, 69, + 11, 214, 132, 72, 86, 212, 4, 193, 253, 125, 45, 148, 97, 87, 6, 101, + 195, 169, 86, 115, 218, 254, 40, 59, 255, 137, 135, 183, 253, 117, 170, 29, + 191, 138, 247, 117, 125, 234, 30, 40, 92, 8, 180, 240, 136, 142, 111, 239, + 66, 225, 196, 151, 93, 130, 126, 255, 195, 34, 252, 17, 101, 179, 120, 76, + 4, 227, 13, 12, 66, 205, 235, 177, 29, 187, 25, 114, 68, 119, 114, 158, + 213, 149, 210, 5, 104, 71, 181, 126, 211, 32, 99, 60, 51, 75, 85, 138, + 138, 68, 115, 81, 37, 17, 101, 36, 117, 236, 182, 77, 98, 113, 198, 195, + 73, 79, 215, 116, 248, 45, 244, 60, 205, 35, 95, 228, 38, 180, 250, 246, + 63, 211, 44, 197, 162, 24, 195, 61, 136, 142, 91, 141, 62, 34, 139, 60, + 142, 238, 67, 148, 54, 132, 41, 115, 241, 219, 192, 121, 9, 45, 75, 183, + 223, 213, 165, 161, 219, 181, 161, 27, 36, 158, 163, 12, 12, 141, 83, 105, + 157, 118, 168, 244, 204, 32, 52, 131, 88, 246, 230, 121, 21, 58, 91, 217, + 138, 27, 251, 174, 150, 51, 240, 201, 30, 66, 19, 148, 185, 122, 53, 15, + 176, 144, 148, 3, 238, 59, 211, 155, 77, 83, 81, 245, 186, 169, 217, 201, + 103, 109, 137, 119, 146, 100, 18, 200, 185, 212, 202, 17, 88, 146, 234, 49, + 190, 19, 139, 43, 1, 48, 21, 64, 235, 89, 191, 74, 89, 85, 16, 64, + 203, 99, 152, 255, 61, 159, 36, 5, 199, 49, 94, 229, 163, 192, 41, 165, + 20, 203, 176, 149, 18, 152, 61, 216, 188, 203, 180, 103, 202, 176, 177, 210, + 255, 26, 254, 70, 43, 214, 95, 208, 73, 148, 124, 19, 215, 68, 123, 10, + 179, 88, 167, 224, 23, 246, 150, 201, 51, 157, 139, 187, 103, 187, 198, 189, + 204, 126, 74, 124, 23, 150, 108, 116, 196, 130, 92, 0, 211, 151, 19, 58, + 249, 50, 186, 54, 102, 164, 122, 228, 71, 163, 163, 117, 78, 234, 197, 70, + 96, 79, 4, 88, 242, 219, 120, 28, 178, 165, 136, 178, 129, 125, 79, 140, + 65, 62, 78, 237, 104, 11, 45, 191, 163, 145, 174, 23, 34, 240, 43, 137, + 102, 189, 140, 137, 4, 222, 55, 6, 84, 194, 51, 164, 107, 234, 39, 216, + 15, 12, 44, 86, 170, 121, 46, 4, 220, 200, 42, 53, 11, 228, 110, 187, + 116, 182, 242, 42, 93, 109, 47, 109, 180, 155, 31, 99, 60, 107, 114, 82, + 196, 146, 45, 224, 90, 205, 34, 200, 42, 173, 113, 37, 26, 154, 74, 18, + 165, 45, 22, 141, 1, 244, 64, 159, 164, 162, 100, 6, 67, 145, 199, 205, + 254, 149, 56, 138, 15, 172, 205, 203, 191, 253, 126, 238, 167, 210, 103, 33, + 143, 85, 161, 150, 99, 12, 207, 238, 110, 157, 190, 52, 249, 121, 139, 188, + 0, 74, 92, 106, 101, 254, 190, 251, 213, 167, 78, 36, 224, 24, 6, 195, + 128, 24, 21, 35, 66, 223, 204, 84, 177, 109, 226, 215, 79, 19, 236, 73, + 74, 244, 146, 57, 228, 254, 223, 158, 42, 83, 29, 181, 14, 147, 60, 4, + 147, 107, 95, 220, 180, 130, 140, 28, 118, 179, 39, 179, 250, 184, 27, 209, + 199, 151, 154, 121, 105, 81, 215, 143, 46, 91, 217, 94, 230, 250, 165, 21, + 240, 234, 93, 0, 176, 20, 127, 181, 36, 127, 49, 36, 79, 233, 229, 57, + 241, 56, 119, 151, 222, 239, 203, 217, 74, 164, 88, 47, 25, 43, 58, 136, + 61, 233, 70, 133, 181, 122, 250, 169, 249, 38, 36, 40, 182, 201, 40, 64, + 218, 145, 63, 209, 126, 248, 65, 23, 142, 147, 3, 241, 200, 87, 132, 93, + 31, 22, 90, 86, 244, 47, 235, 53, 187, 96, 165, 221, 185, 118, 134, 129, + 94, 64, 188, 132, 216, 198, 131, 74, 193, 32, 41, 194, 69, 201, 64, 31, + 6, 235, 95, 181, 207, 187, 60, 250, 24, 233, 127, 4, 5, 190, 242, 168, + 239, 185, 172, 78, 136, 121, 180, 191, 84, 54, 252, 83, 202, 111, 32, 100, + 213, 7, 178, 225, 71, 68, 244, 36, 141, 242, 199, 185, 71, 55, 244, 166, + 113, 41, 66, 177, 55, 251, 179, 251, 194, 2, 54, 20, 100, 241, 82, 213, + 236, 45, 196, 119, 134, 167, 163, 134, 61, 218, 207, 200, 118, 143, 249, 165, + 105, 78, 208, 213, 206, 72, 76, 123, 47, 31, 9, 234, 18, 125, 95, 170, + 199, 123, 139, 158, 244, 171, 6, 202, 240, 214, 94, 46, 60, 109, 185, 175, + 204, 176, 229, 110, 139, 249, 234, 3, 202, 231, 25, 195, 150, 136, 186, 246, + 72, 242, 133, 249, 229, 58, 112, 28, 228, 121, 85, 115, 90, 95, 32, 141, + 135, 217, 12, 187, 50, 229, 66, 103, 204, 0, 93, 86, 245, 59, 173, 28, + 71, 131, 135, 118, 125, 113, 12, 13, 202, 242, 205, 255, 152, 243, 160, 243, + 148, 10, 28, 106, 56, 17, 93, 234, 204, 102, 53, 22, 48, 188, 15, 255, + 14, 3, 117, 190, 211, 116, 55, 77, 205, 171, 228, 120, 244, 1, 169, 51, + 241, 150, 206, 99, 20, 68, 119, 137, 180, 44, 113, 85, 242, 143, 148, 97, + 149, 75, 20, 228, 89, 226, 122, 102, 13, 195, 58, 111, 178, 82, 226, 144, + 82, 237, 27, 94, 244, 29, 102, 32, 162, 80, 228, 66, 203, 107, 211, 171, + 4, 56, 62, 184, 63, 137, 5, 179, 231, 185, 172, 102, 190, 42, 80, 164, + 123, 68, 20, 36, 135, 97, 102, 156, 133, 165, 202, 240, 84, 168, 30, 95, + 57, 3, 182, 224, 10, 84, 60, 88, 191, 0, 126, 190, 240, 202, 141, 89, + 238, 212, 101, 213, 129, 15, 245, 94, 24, 49, 72, 59, 237, 121, 241, 199, + 28, 106, 113, 237, 82, 144, 150, 112, 79, 90, 255, 166, 230, 71, 132, 24, + 6, 82, 143, 150, 194, 236, 253, 46, 158, 143, 5, 31, 243, 156, 4, 19, + 89, 81, 94, 94, 39, 9, 199, 6, 44, 35, 4, 143, 18, 62, 27, 165, + 177, 162, 53, 121, 146, 74, 181, 252, 27, 207, 17, 102, 196, 172, 75, 4, + 17, 215, 20, 96, 9, 42, 199, 99, 206, 94, 78, 121, 37, 11, 152, 125, + 249, 107, 153, 180, 85, 155, 220, 68, 223, 87, 204, 175, 117, 147, 217, 71, + 6, 190, 132, 99, 227, 5, 180, 168, 249, 126, 202, 102, 42, 26, 175, 198, + 185, 211, 206, 154, 60, 24, 183, 24, 203, 46, 21, 176, 194, 116, 116, 210, + 162, 214, 215, 79, 87, 159, 16, 55, 12, 248, 51, 17, 79, 183, 145, 23, + 209, 58, 225, 84, 21, 237, 102, 250, 93, 222, 87, 87, 203, 4, 138, 196, + 6, 28, 143, 45, 68, 77, 211, 180, 47, 198, 5, 170, 166, 221, 107, 202, + 67, 220, 178, 156, 39, 2, 87, 147, 234, 85, 199, 97, 10, 151, 240, 121, + 229, 132, 230, 249, 244, 57, 77, 29, 123, 149, 121, 81, 245, 37, 106, 157, + 39, 185, 31, 175, 102, 187, 37, 149, 27, 215, 151, 155, 94, 160, 180, 59, + 95, 200, 149, 42, 178, 85, 171, 41, 31, 20, 16, 199, 14, 202, 230, 42, + 59, 83, 239, 155, 65, 63, 237, 89, 133, 62, 23, 112, 236, 226, 34, 250, + 134, 14, 234, 2, 212, 41, 135, 189, 114, 60, 147, 49, 19, 193, 169, 157, + 41, 62, 36, 42, 2, 172, 237, 250, 86, 252, 199, 80, 194, 195, 182, 136, + 209, 90, 80, 9, 121, 164, 168, 99, 235, 131, 129, 59, 26, 41, 124, 194, + 110, 143, 183, 126, 91, 50, 168, 211, 43, 177, 95, 196, 94, 206, 214, 173, + 89, 152, 173, 39, 53, 190, 186, 193, 75, 23, 181, 65, 153, 57, 142, 215, + 155, 147, 241, 110, 230, 102, 176, 152, 227, 83, 87, 110, 243, 143, 254, 127, + 254, 117, 117, 173, 106, 80, 127, 231, 39, 220, 178, 44, 95, 30, 60, 222, + 212, 72, 169, 84, 194, 40, 164, 156, 145, 182, 127, 51, 64, 108, 144, 124, + 136, 238, 4, 113, 14, 68, 106, 158, 20, 231, 109, 99, 70, 214, 68, 29, + 240, 154, 95, 206, 188, 136, 180, 41, 220, 228, 198, 82, 51, 118, 65, 20, + 198, 187, 22, 8, 134, 252, 86, 227, 110, 105, 198, 242, 48, 8, 192, 165, + 80, 210, 1, 175, 188, 99, 252, 178, 7, 70, 27, 249, 175, 145, 131, 228, + 86, 229, 81, 93, 203, 194, 226, 110, 250, 134, 235, 195, 170, 107, 131, 185, + 81, 99, 168, 124, 215, 108, 40, 198, 193, 117, 88, 136, 134, 114, 145, 239, + 9, 0, 184, 106, 111, 63, 6, 92, 30, 3, 116, 7, 232, 182, 184, 60, + 32, 161, 183, 167, 163, 185, 114, 43, 77, 134, 29, 164, 135, 3, 155, 255, + 83, 254, 203, 1, 243, 167, 236, 162, 77, 140, 250, 224, 25, 246, 81, 147, + 207, 0, 127, 115, 127, 151, 191, 179, 128, 77, 142, 203, 171, 153, 47, 244, + 165, 235, 20, 64, 36, 99, 201, 190, 83, 244, 125, 112, 49, 26, 95, 125, + 254, 140, 85, 142, 112, 170, 225, 4, 126, 243, 224, 180, 137, 152, 102, 9, + 92, 67, 247, 20, 189, 58, 88, 74, 183, 201, 43, 1, 2, 123, 228, 211, + 79, 91, 20, 64, 111, 238, 60, 76, 207, 91, 90, 130, 169, 238, 254, 208, + 125, 140, 7, 94, 63, 18, 46, 124, 16, 253, 228, 238, 179, 99, 129, 40, + 89, 12, 40, 42, 94, 237, 111, 112, 22, 162, 64, 25, 89, 102, 56, 25, + 245, 128, 221, 86, 146, 138, 242, 67, 166, 114, 204, 38, 89, 77, 127, 64, + 36, 183, 161, 254, 185, 76, 91, 10, 28, 146, 154, 254, 118, 200, 206, 95, + 6, 182, 35, 178, 179, 114, 87, 60, 208, 88, 180, 161, 171, 39, 156, 131, + 2, 83, 124, 11, 223, 57, 190, 18, 79, 245, 198, 11, 55, 131, 197, 28, + 74, 32, 223, 144, 231, 227, 25, 237, 243, 145, 64, 183, 62, 163, 33, 93, + 155, 82, 228, 206, 69, 77, 101, 8, 240, 3, 135, 0, 181, 153, 174, 82, + 29, 129, 40, 83, 235, 83, 98, 105, 235, 210, 121, 239, 78, 240, 217, 144, + 230, 225, 3, 157, 14, 118, 64, 228, 29, 110, 230, 247, 153, 117, 3, 81, + 24, 23, 169, 2, 247, 238, 144, 137, 241, 140, 192, 185, 165, 13, 122, 48, + 180, 254, 54, 128, 134, 247, 87, 42, 219, 166, 7, 248, 91, 39, 226, 245, + 44, 152, 30, 71, 125, 129, 102, 72, 16, 66, 119, 15, 189, 250, 70, 112, + 168, 7, 5, 181, 15, 114, 73, 112, 16, 184, 65, 192, 54, 51, 31, 202, + 38, 11, 170, 149, 37, 107, 44, 241, 30, 35, 23, 176, 99, 82, 230, 60, + 206, 39, 249, 227, 114, 152, 133, 233, 60, 188, 79, 52, 241, 191, 208, 160, + 213, 159, 219, 188, 222, 47, 235, 187, 9, 186, 112, 78, 101, 229, 115, 152, + 216, 196, 88, 228, 189, 226, 214, 40, 163, 155, 193, 238, 224, 72, 64, 199, + 4, 182, 248, 143, 219, 170, 227, 55, 215, 135, 92, 117, 56, 225, 220, 129, + 74, 226, 55, 132, 73, 213, 81, 93, 107, 49, 29, 155, 62, 141, 48, 190, + 242, 221, 95, 61, 179, 165, 213, 49, 125, 245, 106, 35, 24, 57, 103, 140, + 79, 172, 38, 29, 170, 145, 151, 204, 114, 161, 117, 2, 199, 145, 210, 184, + 71, 80, 251, 182, 67, 220, 3, 2, 210, 28, 17, 104, 68, 150, 255, 174, + 34, 206, 245, 97, 173, 8, 92, 160, 144, 149, 54, 57, 114, 145, 215, 115, + 186, 145, 165, 186, 207, 107, 14, 255, 88, 145, 225, 110, 190, 78, 93, 147, + 225, 247, 122, 52, 135, 147, 89, 3, 10, 119, 43, 154, 29, 186, 68, 50, + 125, 152, 205, 242, 113, 106, 80, 68, 21, 45, 147, 212, 5, 1, 27, 39, + 51, 221, 25, 38, 102, 67, 194, 250, 121, 51, 66, 76, 155, 205, 199, 54, + 177, 202, 0, 249, 225, 231, 179, 69, 52, 22, 87, 77, 193, 35, 88, 3, + 238, 62, 12, 159, 221, 203, 230, 122, 92, 71, 26, 218, 41, 218, 75, 21, + 201, 166, 224, 173, 110, 185, 97, 161, 227, 9, 43, 108, 162, 62, 228, 201, + 32, 178, 191, 115, 35, 118, 59, 165, 223, 135, 132, 230, 110, 213, 96, 68, + 190, 237, 213, 146, 85, 179, 242, 155, 122, 217, 7, 105, 70, 123, 10, 5, + 122, 153, 202, 218, 195, 207, 73, 175, 161, 31, 200, 47, 237, 64, 34, 227, + 34, 66, 58, 29, 28, 166, 242, 128, 33, 79, 32, 125, 60, 207, 222, 195, + 180, 137, 78, 177, 132, 249, 147, 38, 64, 247, 181, 81, 96, 155, 167, 113, + 95, 197, 30, 83, 18, 128, 93, 131, 242, 197, 50, 146, 106, 143, 56, 216, + 80, 80, 159, 164, 154, 220, 248, 193, 58, 253, 63, 219, 91, 140, 170, 71, + 152, 8, 69, 37, 138, 179, 223, 54, 98, 229, 181, 107, 50, 174, 6, 20, + 69, 101, 50, 57, 102, 61, 123, 218, 226, 77, 25, 129, 188, 103, 22, 81, + 66, 232, 19, 88, 103, 184, 87, 252, 109, 31, 242, 40, 37, 238, 237, 20, + 232, 170, 115, 36, 83, 127, 65, 208, 85, 56, 192, 120, 116, 153, 200, 116, + 108, 243, 110, 8, 9, 162, 206, 172, 25, 0, 103, 79, 239, 8, 184, 142, + 87, 86, 95, 139, 223, 180, 6, 205, 39, 76, 25, 62, 32, 244, 171, 152, + 146, 48, 224, 20, 23, 219, 250, 115, 159, 131, 14, 91, 5, 27, 26, 60, + 239, 5, 41, 159, 226, 103, 177, 43, 224, 51, 123, 129, 148, 18, 241, 66, + 192, 199, 151, 94, 207, 238, 120, 34, 234, 75, 193, 65, 66, 243, 125, 21, + 57, 113, 143, 44, 49, 153, 168, 129, 102, 21, 17, 101, 182, 217, 216, 17, + 7, 70, 99, 194, 34, 47, 49, 241, 25, 242, 163, 251, 28, 172, 167, 4, + 96, 213, 236, 60, 223, 52, 150, 216, 168, 157, 5, 56, 126, 50, 228, 130, + 166, 54, 196, 85, 86, 162, 154, 82, 84, 34, 228, 235, 157, 230, 47, 77, + 151, 127, 226, 82, 145, 205, 201, 40, 49, 178, 228, 77, 132, 208, 93, 4, + 2, 73, 46, 69, 188, 60, 130, 217, 1, 97, 177, 240, 18, 26, 141, 97, + 5, 170, 82, 56, 218, 83, 3, 29, 228, 13, 179, 232, 154, 50, 152, 40, + 58, 0, 202, 195, 36, 91, 104, 37, 10, 89, 0, 250, 146, 45, 248, 68, + 37, 180, 129, 46, 138, 43, 98, 40, 122, 174, 147, 85, 94, 255, 76, 129, + 245, 135, 198, 206, 144, 189, 190, 207, 253, 191, 104, 163, 141, 116, 1, 192, + 200, 193, 205, 196, 151, 231, 254, 190, 17, 172, 254, 196, 243, 72, 234, 236, + 92, 108, 153, 184, 39, 201, 109, 233, 38, 178, 163, 46, 150, 153, 170, 238, + 84, 196, 155, 171, 31, 3, 186, 55, 87, 100, 179, 61, 163, 119, 82, 75, + 107, 173, 8, 145, 135, 226, 243, 8, 38, 102, 123, 120, 169, 215, 177, 132, + 111, 26, 242, 205, 150, 143, 197, 152, 137, 193, 174, 171, 234, 183, 221, 189, + 40, 212, 191, 137, 47, 153, 85, 76, 59, 255, 16, 51, 186, 105, 224, 14, + 73, 41, 84, 42, 12, 186, 198, 133, 82, 8, 161, 173, 130, 25, 26, 22, + 152, 132, 221, 182, 68, 126, 160, 248, 183, 112, 129, 83, 181, 55, 17, 145, + 18, 220, 143, 17, 49, 18, 15, 191, 104, 40, 67, 139, 127, 106, 56, 65, + 4, 120, 100, 5, 88, 44, 82, 240, 138, 64, 42, 158, 24, 130, 133, 237, + 235, 112, 115, 164, 249, 247, 233, 173, 116, 245, 23, 37, 216, 180, 118, 183, + 58, 246, 254, 103, 93, 55, 36, 213, 76, 134, 122, 116, 164, 15, 11, 115, + 168, 185, 226, 79, 250, 236, 172, 24, 226, 48, 150, 67, 128, 63, 211, 235, + 219, 120, 216, 18, 31, 82, 136, 105, 151, 118, 193, 43, 33, 155, 55, 8, + 17, 3, 211, 110, 115, 27, 122, 3, 195, 97, 1, 227, 22, 124, 213, 59, + 89, 13, 253, 221, 207, 229, 25, 72, 200, 144, 209, 147, 185, 68, 132, 104, + 7, 34, 237, 45, 2, 17, 209, 87, 170, 227, 60, 230, 53, 186, 59, 39, + 254, 57, 191, 201, 59, 202, 119, 144, 163, 255, 78, 199, 9, 59, 129, 64, + 232, 31, 20, 110, 63, 172, 85, 239, 97, 216, 252, 158, 76, 64, 55, 133, + 43, 101, 22, 4, 27, 134, 210, 9, 120, 44, 255, 105, 142, 83, 6, 238, + 61, 226, 118, 111, 217, 234, 153, 48, 9, 193, 133, 172, 20, 121, 210, 40, + 243, 49, 13, 184, 152, 126, 248, 100, 37, 187, 216, 15, 250, 86, 178, 24, + 30, 174, 216, 151, 139, 27, 166, 190, 200, 228, 25, 152, 212, 70, 7, 45, + 141, 54, 143, 106, 206, 49, 170, 195, 61, 24, 81, 20, 116, 147, 95, 49, + 245, 179, 223, 237, 184, 110, 49, 158, 190, 211, 132, 30, 22, 195, 234, 167, + 143, 4, 26, 9, 215, 48, 100, 53, 221, 177, 172, 132, 184, 229, 165, 207, + 213, 192, 26, 58, 211, 227, 65, 148, 198, 5, 248, 169, 32, 121, 24, 164, + 193, 137, 218, 218, 105, 42, 136, 146, 91, 72, 238, 231, 24, 17, 108, 194, + 206, 5, 180, 101, 199, 161, 172, 130, 78, 110, 255, 62, 158, 111, 204, 223, + 33, 183, 43, 10, 93, 253, 249, 193, 149, 89, 21, 51, 198, 186, 91, 142, + 121, 157, 35, 254, 21, 55, 2, 7, 119, 32, 175, 107, 199, 86, 174, 37, + 144, 192, 13, 234, 244, 152, 150, 77, 69, 91, 174, 141, 211, 71, 85, 190, + 231, 124, 80, 80, 137, 195, 5, 196, 21, 239, 110, 92, 99, 158, 247, 229, + 178, 99, 156, 222, 135, 119, 197, 242, 98, 58, 0, 134, 97, 197, 30, 113, + 164, 183, 9, 1, 97, 166, 94, 117, 183, 103, 45, 147, 215, 137, 8, 64, + 9, 149, 66, 130, 166, 94, 72, 48, 181, 156, 233, 167, 116, 59, 10, 117, + 203, 53, 110, 133, 3, 97, 84, 60, 179, 90, 47, 45, 78, 41, 89, 191, + 234, 81, 129, 69, 179, 76, 221, 176, 171, 58, 158, 151, 251, 79, 189, 124, + 159, 40, 189, 229, 126, 168, 24, 141, 209, 215, 105, 170, 166, 181, 113, 36, + 4, 172, 90, 123, 232, 154, 150, 224, 87, 249, 134, 136, 14, 28, 23, 67, + 78, 187, 209, 55, 157, 95, 36, 136, 83, 103, 54, 236, 62, 81, 66, 44, + 85, 120, 219, 178, 62, 126, 203, 193, 229, 146, 25, 187, 254, 141, 147, 185, + 158, 103, 216, 216, 38, 34, 245, 43, 169, 200, 129, 130, 7, 239, 207, 155, + 250, 89, 209, 238, 20, 74, 133, 100, 67, 149, 41, 187, 72, 9, 135, 165, + 140, 14, 90, 51, 241, 216, 7, 176, 238, 254, 84, 53, 231, 87, 12, 51, + 222, 54, 70, 163, 101, 130, 63, 37, 120, 180, 219, 161, 69, 213, 233, 130, + 199, 124, 2, 36, 224, 140, 95, 201, 23, 72, 219, 222, 181, 237, 134, 11, + 103, 94, 246, 251, 215, 218, 228, 90, 36, 54, 237, 49, 204, 13, 194, 221, + 18, 186, 35, 144, 179, 2, 98, 90, 110, 165, 66, 38, 152, 206, 0, 121, + 90, 25, 94, 145, 133, 58, 143, 138, 175, 80, 233, 110, 78, 84, 0, 207, + 87, 78, 27, 243, 160, 231, 241, 83, 173, 163, 191, 205, 184, 216, 232, 36, + 194, 52, 5, 72, 249, 42, 103, 254, 213, 41, 159, 209, 56, 222, 40, 224, + 177, 195, 214, 11, 84, 221, 245, 137, 131, 23, 220, 251, 167, 17, 34, 214, + 41, 102, 226, 223, 79, 53, 119, 84, 17, 219, 19, 80, 90, 132, 19, 176, + 73, 145, 38, 28, 198, 176, 141, 92, 242, 69, 174, 63, 244, 44, 152, 102, + 120, 151, 167, 115, 67, 110, 119, 159, 56, 63, 29, 70, 253, 118, 119, 220, + 181, 71, 193, 167, 77, 178, 236, 187, 193, 236, 147, 231, 209, 56, 168, 202, + 7, 198, 208, 17, 20, 31, 42, 70, 237, 148, 162, 161, 128, 135, 88, 37, + 219, 56, 83, 248, 116, 20, 44, 17, 231, 156, 187, 251, 237, 165, 123, 165, + 181, 166, 212, 99, 132, 26, 122, 240, 223, 130, 235, 248, 239, 11, 161, 32, + 109, 210, 97, 173, 12, 251, 94, 118, 7, 107, 206, 105, 158, 16, 4, 245, + 159, 67, 150, 226, 53, 42, 241, 249, 146, 107, 111, 75, 147, 136, 141, 97, + 49, 101, 233, 168, 197, 72, 95, 138, 162, 103, 154, 162, 192, 78, 41, 102, + 52, 207, 165, 48, 93, 41, 104, 136, 91, 169, 167, 51, 217, 197, 25, 238, + 3, 4, 35, 64, 146, 153, 32, 107, 66, 225, 249, 148, 225, 130, 197, 194, + 34, 100, 235, 200, 204, 39, 230, 37, 103, 219, 139, 8, 232, 63, 95, 154, + 76, 195, 226, 187, 206, 116, 21, 40, 98, 177, 244, 9, 114, 148, 22, 185, + 243, 93, 8, 84, 137, 114, 217, 240, 69, 185, 123, 1, 225, 160, 221, 183, + 81, 159, 31, 66, 221, 201, 197, 113, 137, 181, 249, 211, 211, 226, 62, 12, + 116, 111, 130, 197, 99, 85, 29, 191, 94, 14, 166, 137, 147, 14, 133, 58, + 230, 148, 144, 87, 48, 117, 252, 64, 114, 18, 185, 63, 164, 159, 26, 79, + 188, 242, 126, 223, 213, 245, 195, 144, 19, 68, 175, 73, 15, 90, 45, 245, + 111, 212, 15, 108, 108, 199, 180, 231, 92, 251, 69, 251, 100, 179, 160, 125, + 250, 42, 79, 118, 101, 195, 108, 15, 243, 124, 76, 248, 137, 80, 49, 16, + 233, 89, 247, 188, 102, 212, 82, 111, 184, 67, 70, 110, 79, 241, 15, 157, + 225, 66, 87, 81, 35, 200, 210, 21, 243, 196, 86, 48, 46, 152, 150, 236, + 76, 45, 178, 131, 90, 85, 147, 107, 25, 194, 182, 106, 191, 161, 71, 94, + 211, 172, 93, 128, 17, 188, 240, 127, 4, 18, 124, 199, 122, 163, 140, 228, + 91, 163, 59, 197, 191, 231, 162, 77, 248, 24, 168, 119, 182, 169, 140, 55, + 207, 105, 70, 81, 32, 79, 212, 1, 59, 11, 55, 145, 61, 90, 134, 202, + 49, 105, 117, 158, 91, 86, 139, 55, 90, 171, 167, 237, 141, 1, 184, 49, + 63, 7, 226, 53, 153, 200, 188, 224, 234, 104, 101, 118, 238, 93, 34, 252, + 120, 251, 177, 103, 213, 173, 184, 231, 225, 111, 186, 210, 40, 111, 65, 4, + 60, 124, 221, 67, 201, 210, 65, 90, 74, 36, 39, 88, 233, 64, 172, 179, + 18, 59, 182, 82, 152, 192, 154, 220, 209, 184, 218, 210, 172, 250, 155, 199, + 175, 246, 218, 45, 211, 204, 131, 204, 73, 107, 246, 52, 133, 102, 103, 135, + 5, 46, 175, 63, 204, 92, 108, 126, 126, 194, 208, 178, 166, 198, 191, 240, + 128, 5, 203, 189, 102, 148, 65, 29, 146, 2, 24, 21, 201, 147, 145, 248, + 85, 77, 63, 245, 176, 199, 198, 237, 34, 101, 159, 144, 166, 29, 102, 175, + 121, 78, 75, 196, 204, 80, 156, 236, 198, 232, 117, 112, 135, 61, 63, 63, + 82, 2, 65, 139, 70, 69, 78, 64, 48, 154, 15, 250, 79, 190, 251, 94, + 205, 252, 236, 241, 2, 171, 232, 118, 128, 71, 18, 55, 49, 13, 27, 36, + 149, 220, 149, 150, 55, 200, 192, 151, 47, 218, 134, 205, 93, 7, 206, 44, + 229, 208, 62, 208, 55, 55, 239, 63, 45, 154, 171, 70, 223, 144, 78, 251, + 5, 138, 224, 21, 184, 87, 55, 69, 224, 231, 37, 65, 87, 114, 78, 216, + 41, 49, 143, 233, 182, 214, 84, 20, 20, 156, 17, 12, 173, 172, 80, 151, + 37, 28, 191, 69, 146, 102, 65, 15, 152, 143, 198, 45, 204, 4, 140, 90, + 149, 45, 157, 190, 119, 196, 121, 199, 176, 122, 198, 141, 161, 31, 24, 149, + 96, 231, 70, 122, 160, 19, 100, 75, 112, 141, 18, 175, 109, 98, 19, 110, + 237, 1, 5, 171, 153, 19, 251, 61, 180, 249, 9, 187, 196, 248, 127, 13, + 21, 244, 224, 42, 97, 40, 236, 190, 18, 123, 133, 26, 235, 9, 150, 90, + 21, 189, 189, 101, 226, 190, 82, 18, 45, 3, 172, 187, 72, 74, 244, 211, + 76, 2, 70, 168, 41, 195, 165, 178, 139, 5, 155, 100, 199, 0, 227, 72, + 247, 186, 33, 169, 34, 104, 196, 3, 253, 202, 19, 140, 100, 122, 144, 125, + 201, 202, 194, 245, 180, 27, 10, 207, 180, 31, 25, 152, 243, 143, 51, 90, + 33, 74, 147, 127, 66, 47, 10, 65, 99, 71, 243, 241, 221, 219, 32, 213, + 98, 67, 119, 130, 254, 11, 149, 64, 73, 168, 73, 237, 110, 18, 243, 21, + 177, 53, 109, 2, 242, 89, 136, 34, 36, 135, 12, 12, 125, 251, 104, 137, + 128, 152, 41, 70, 163, 184, 237, 137, 249, 63, 56, 133, 39, 0, 243, 248, + 80, 184, 48, 238, 155, 193, 21, 137, 95, 144, 146, 209, 151, 197, 199, 122, + 60, 48, 250, 1, 79, 162, 58, 78, 225, 184, 199, 35, 186, 225, 19, 68, + 31, 199, 150, 85, 197, 76, 246, 150, 47, 63, 55, 196, 200, 10, 163, 170, + 246, 34, 196, 87, 0, 45, 18, 6, 168, 248, 130, 184, 5, 197, 97, 56, + 128, 254, 236, 32, 10, 182, 198, 139, 255, 43, 41, 159, 119, 253, 81, 248, + 251, 253, 184, 98, 229, 6, 8, 64, 48, 190, 105, 125, 168, 191, 43, 93, + 156, 39, 244, 220, 138, 197, 117, 27, 152, 145, 254, 233, 211, 33, 234, 5, + 72, 247, 49, 221, 35, 188, 210, 20, 231, 90, 255, 37, 30, 126, 209, 65, + 137, 123, 126, 191, 158, 227, 201, 129, 19, 164, 51, 232, 188, 185, 96, 67, + 24, 190, 56, 16, 229, 34, 219, 150, 137, 226, 59, 58, 3, 147, 232, 35, + 99, 207, 101, 173, 217, 18, 139, 1, 94, 123, 4, 232, 147, 243, 13, 193, + 193, 187, 232, 100, 187, 119, 105, 72, 86, 30, 165, 20, 192, 19, 157, 67, + 253, 204, 246, 133, 85, 252, 109, 169, 106, 203, 83, 72, 51, 217, 172, 7, + 212, 104, 170, 166, 21, 181, 11, 14, 145, 33, 175, 235, 169, 66, 203, 78, + 108, 209, 100, 131, 93, 192, 70, 157, 186, 224, 174, 173, 22, 167, 87, 244, + 227, 218, 96, 98, 186, 24, 205, 62, 66, 79, 198, 254, 160, 37, 127, 16, + 95, 171, 47, 34, 80, 43, 26, 111, 65, 207, 29, 139, 135, 69, 13, 110, + 133, 110, 65, 140, 61, 207, 117, 98, 106, 29, 166, 224, 78, 208, 252, 194, + 91, 4, 38, 0, 61, 133, 180, 168, 149, 211, 7, 80, 227, 135, 51, 11, + 249, 228, 26, 198, 244, 2, 47, 226, 93, 147, 222, 125, 200, 205, 166, 154, + 234, 80, 39, 70, 84, 98, 209, 1, 6, 219, 17, 11, 253, 126, 145, 231, + 131, 14, 163, 107, 200, 195, 167, 64, 6, 101, 209, 255, 116, 179, 69, 164, + 133, 23, 78, 98, 105, 182, 236, 34, 246, 58, 81, 183, 100, 30, 44, 187, + 164, 91, 239, 132, 51, 154, 9, 2, 215, 186, 191, 79, 237, 179, 141, 169, + 237, 206, 190, 201, 64, 223, 143, 60, 173, 108, 96, 216, 183, 70, 110, 5, + 59, 230, 206, 194, 40, 211, 109, 146, 1, 102, 194, 212, 90, 214, 43, 111, + 134, 122, 146, 9, 220, 198, 72, 196, 68, 19, 214, 220, 11, 173, 243, 15, + 254, 158, 193, 211, 191, 55, 163, 212, 18, 20, 42, 199, 191, 74, 238, 191, + 113, 173, 125, 203, 48, 1, 119, 32, 224, 8, 178, 179, 0, 67, 153, 62, + 227, 25, 254, 126, 23, 87, 67, 43, 45, 250, 42, 214, 118, 179, 111, 189, + 103, 133, 35, 196, 54, 23, 203, 218, 59, 177, 194, 55, 210, 153, 78, 207, + 145, 157, 229, 119, 218, 173, 20, 104, 251, 48, 204, 245, 166, 251, 123, 82, + 175, 239, 215, 158, 200, 1, 174, 40, 200, 32, 108, 184, 0, 137, 90, 81, + 159, 128, 165, 10, 233, 210, 52, 48, 74, 164, 246, 199, 240, 154, 12, 254, + 70, 37, 106, 44, 85, 123, 151, 119, 153, 170, 48, 144, 241, 114, 64, 115, + 120, 159, 13, 49, 211, 182, 99, 124, 25, 70, 73, 196, 179, 201, 219, 124, + 22, 137, 229, 160, 155, 10, 158, 234, 132, 203, 208, 76, 81, 98, 30, 142, + 154, 68, 158, 92, 107, 252, 4, 22, 218, 2, 167, 190, 152, 141, 251, 137, + 236, 87, 186, 235, 90, 0, 132, 68, 232, 66, 63, 0, 41, 235, 157, 45, + 68, 194, 45, 18, 249, 254, 60, 33, 10, 86, 183, 45, 5, 253, 253, 212, + 44, 94, 203, 41, 53, 146, 101, 148, 123, 198, 92, 14, 181, 87, 49, 229, + 177, 249, 216, 8, 12, 37, 108, 220, 236, 13, 72, 122, 48, 235, 219, 74, + 220, 187, 130, 66, 249, 41, 184, 140, 101, 1, 203, 110, 22, 62, 23, 118, + 199, 32, 191, 162, 140, 187, 157, 80, 144, 59, 112, 238, 32, 101, 238, 47, + 225, 69, 99, 178, 246, 49, 76, 81, 101, 187, 71, 59, 140, 229, 81, 253, + 42, 204, 158, 74, 184, 237, 197, 14, 91, 81, 34, 115, 123, 224, 167, 15, + 112, 84, 225, 104, 103, 208, 236, 183, 185, 142, 175, 147, 237, 188, 159, 125, + 142, 253, 121, 87, 239, 78, 57, 179, 13, 123, 74, 148, 197, 74, 227, 110, + 48, 248, 165, 248, 249, 43, 249, 0, 69, 7, 183, 68, 167, 181, 39, 54, + 144, 39, 212, 36, 40, 171, 48, 106, 76, 50, 201, 111, 254, 86, 240, 39, + 14, 59, 58, 110, 54, 155, 2, 6, 205, 190, 237, 126, 58, 204, 112, 159, + 145, 188, 208, 196, 197, 52, 54, 94, 84, 127, 46, 56, 93, 152, 190, 133, + 120, 166, 75, 52, 6, 112, 112, 71, 119, 143, 218, 19, 242, 174, 48, 246, + 29, 243, 137, 94, 127, 95, 76, 49, 20, 149, 159, 251, 59, 146, 102, 242, + 222, 157, 162, 124, 154, 25, 47, 246, 135, 38, 177, 165, 246, 224, 202, 4, + 177, 255, 203, 245, 58, 172, 164, 33, 155, 179, 56, 41, 202, 39, 145, 176, + 130, 171, 30, 77, 177, 64, 203, 70, 230, 242, 240, 118, 145, 30, 89, 184, + 11, 123, 157, 212, 156, 28, 5, 200, 96, 157, 102, 126, 212, 149, 137, 144, + 169, 39, 211, 159, 193, 254, 65, 201, 154, 165, 37, 129, 14, 242, 28, 37, + 17, 130, 202, 227, 241, 49, 191, 213, 179, 72, 243, 118, 52, 133, 149, 8, + 156, 231, 94, 215, 15, 21, 118, 194, 254, 107, 249, 40, 153, 69, 95, 141, + 97, 37, 224, 82, 146, 71, 35, 26, 88, 127, 137, 247, 242, 243, 135, 113, + 189, 155, 56, 98, 99, 90, 108, 186, 118, 178, 253, 50, 44, 30, 43, 223, + 171, 186, 44, 120, 215, 128, 45, 65, 178, 142, 159, 39, 70, 37, 168, 62, + 127, 219, 111, 40, 239, 134, 47, 114, 69, 45, 87, 15, 234, 100, 9, 90, + 220, 203, 241, 40, 150, 239, 164, 39, 164, 196, 117, 156, 132, 143, 87, 146, + 190, 130, 168, 244, 193, 101, 110, 158, 231, 57, 146, 235, 227, 8, 12, 208, + 209, 203, 35, 38, 242, 45, 43, 118, 252, 201, 244, 130, 42, 18, 133, 66, + 129, 209, 77, 208, 69, 236, 138, 254, 255, 245, 112, 236, 86, 171, 1, 111, + 107, 69, 213, 222, 232, 199, 49, 193, 174, 198, 100, 170, 183, 150, 10, 233, + 28, 210, 219, 123, 233, 126, 105, 75, 222, 231, 13, 137, 242, 177, 41, 137, + 60, 202, 92, 16, 131, 226, 193, 152, 79, 95, 235, 105, 227, 172, 7, 160, + 180, 146, 190, 243, 34, 19, 186, 215, 106, 95, 152, 49, 90, 68, 71, 90, + 222, 240, 72, 16, 153, 69, 114, 193, 215, 175, 165, 224, 198, 154, 70, 104, + 79, 97, 153, 54, 153, 179, 2, 207, 197, 243, 12, 159, 76, 168, 136, 217, + 116, 79, 104, 21, 215, 72, 199, 35, 153, 67, 50, 145, 11, 253, 62, 254, + 121, 1, 8, 147, 39, 20, 94, 155, 80, 41, 135, 135, 45, 85, 61, 140, + 26, 195, 80, 187, 252, 175, 253, 152, 170, 169, 118, 235, 158, 134, 82, 188, + 86, 52, 70, 32, 239, 212, 157, 115, 137, 28, 191, 156, 197, 136, 226, 171, + 17, 231, 181, 79, 246, 232, 178, 242, 233, 113, 210, 230, 35, 201, 213, 28, + 72, 27, 183, 26, 106, 240, 111, 111, 255, 122, 128, 234, 179, 201, 66, 165, + 245, 198, 201, 138, 20, 212, 139, 159, 200, 91, 150, 175, 209, 203, 255, 81, + 30, 27, 83, 216, 119, 36, 48, 112, 237, 229, 175, 204, 149, 192, 183, 184, + 165, 176, 231, 176, 223, 81, 214, 225, 145, 107, 248, 225, 213, 6, 99, 59, + 197, 183, 125, 208, 26, 19, 178, 146, 154, 242, 71, 189, 11, 246, 48, 8, + 7, 28, 105, 208, 20, 13, 236, 77, 244, 218, 101, 217, 125, 199, 153, 77, + 193, 214, 233, 91, 48, 201, 209, 6, 155, 87, 208, 221, 9, 73, 76, 191, + 23, 249, 237, 146, 189, 177, 55, 8, 68, 192, 111, 204, 19, 164, 189, 223, + 83, 220, 156, 79, 12, 82, 178, 149, 102, 94, 120, 229, 198, 77, 136, 244, + 84, 33, 90, 66, 193, 45, 252, 160, 151, 66, 240, 135, 232, 147, 235, 107, + 173, 30, 184, 103, 131, 168, 55, 195, 111, 16, 202, 227, 203, 16, 14, 226, + 104, 220, 126, 121, 163, 5, 26, 253, 35, 196, 13, 90, 196, 32, 157, 28, + 152, 70, 205, 236, 101, 142, 207, 126, 230, 67, 194, 143, 67, 77, 91, 97, + 71, 135, 244, 40, 104, 120, 39, 169, 91, 124, 162, 111, 121, 9, 118, 146, + 215, 112, 120, 157, 22, 198, 241, 196, 32, 176, 60, 244, 197, 37, 210, 215, + 125, 122, 143, 253, 175, 101, 92, 205, 43, 170, 70, 183, 173, 162, 130, 226, + 41, 122, 158, 130, 183, 223, 162, 212, 194, 38, 133, 252, 57, 245, 187, 168, + 165, 204, 119, 8, 249, 174, 10, 206, 251, 55, 212, 118, 212, 74, 226, 227, + 141, 138, 122, 204, 83, 14, 175, 248, 18, 159, 79, 79, 100, 56, 37, 229, + 209, 221, 238, 197, 164, 42, 159, 203, 67, 31, 8, 195, 72, 251, 142, 229, + 60, 24, 254, 97, 124, 219, 201, 255, 232, 60, 77, 19, 220, 239, 10, 158, + 62, 117, 245, 167, 63, 38, 216, 169, 209, 29, 245, 17, 4, 241, 218, 83, + 72, 48, 214, 228, 85, 103, 116, 248, 133, 200, 75, 81, 220, 207, 59, 226, + 102, 50, 238, 138, 44, 120, 162, 220, 105, 5, 120, 11, 153, 98, 144, 4, + 197, 217, 39, 235, 141, 148, 123, 51, 213, 255, 144, 17, 189, 144, 214, 246, + 45, 95, 229, 127, 107, 19, 164, 143, 48, 210, 29, 249, 66, 11, 171, 191, + 73, 99, 161, 114, 190, 80, 31, 215, 67, 16, 187, 246, 47, 110, 157, 33, + 208, 151, 122, 2, 228, 161, 51, 9, 215, 33, 246, 67, 44, 19, 41, 29, + 10, 42, 130, 244, 95, 45, 199, 156, 251, 151, 210, 121, 198, 52, 44, 87, + 214, 126, 214, 93, 242, 201, 31, 44, 250, 139, 78, 59, 95, 116, 45, 100, + 187, 97, 206, 143, 158, 54, 98, 113, 30, 101, 151, 56, 187, 116, 199, 157, + 108, 136, 90, 36, 85, 253, 171, 140, 253, 14, 229, 238, 65, 220, 56, 162, + 194, 138, 46, 251, 90, 92, 121, 202, 202, 98, 133, 78, 229, 87, 31, 158, + 12, 175, 122, 17, 65, 10, 163, 51, 163, 95, 143, 208, 9, 192, 58, 29, + 130, 4, 237, 194, 246, 82, 11, 20, 49, 26, 177, 34, 202, 180, 210, 111, + 234, 151, 37, 27, 225, 7, 205, 35, 242, 176, 98, 232, 60, 89, 99, 33, + 233, 106, 236, 96, 248, 71, 101, 133, 44, 190, 241, 76, 113, 146, 181, 106, + 191, 130, 100, 127, 206, 138, 118, 124, 159, 138, 215, 82, 22, 224, 17, 114, + 127, 109, 203, 60, 33, 67, 126, 145, 25, 199, 88, 97, 150, 40, 68, 185, + 144, 218, 230, 81, 203, 223, 45, 209, 250, 22, 234, 12, 153, 49, 19, 107, + 97, 79, 126, 100, 128, 16, 12, 83, 74, 94, 23, 159, 192, 193, 74, 153, + 246, 12, 157, 248, 106, 34, 35, 64, 99, 184, 137, 91, 26, 154, 127, 155, + 218, 36, 185, 64, 26, 41, 236, 232, 223, 159, 10, 29, 165, 12, 244, 214, + 231, 231, 212, 154, 169, 66, 39, 153, 129, 38, 40, 46, 140, 140, 172, 0, + 251, 41, 244, 153, 56, 180, 67, 22, 40, 33, 9, 111, 79, 11, 215, 49, + 66, 195, 45, 113, 22, 41, 109, 39, 124, 178, 49, 173, 25, 245, 157, 190, + 63, 116, 79, 213, 200, 171, 85, 121, 185, 198, 99, 92, 235, 127, 157, 18, + 45, 201, 187, 193, 140, 79, 33, 65, 24, 11, 175, 105, 233, 47, 242, 36, + 139, 254, 195, 48, 31, 146, 32, 0, 150, 237, 52, 165, 4, 174, 230, 81, + 72, 146, 101, 241, 206, 146, 151, 105, 106, 255, 165, 127, 196, 69, 250, 155, + 248, 177, 254, 232, 30, 109, 169, 33, 76, 112, 72, 214, 254, 113, 170, 234, + 191, 76, 20, 132, 209, 243, 152, 241, 107, 12, 107, 31, 16, 149, 129, 8, + 160, 7, 54, 31, 219, 58, 93, 76, 50, 143, 210, 73, 131, 59, 34, 38, + 88, 9, 217, 193, 206, 147, 54, 244, 11, 240, 180, 243, 123, 68, 124, 81, + 153, 132, 49, 38, 33, 220, 125, 164, 236, 162, 128, 202, 246, 183, 178, 35, + 242, 109, 76, 7, 215, 92, 149, 32, 117, 34, 174, 122, 34, 101, 5, 67, + 79, 24, 48, 75, 194, 8, 12, 98, 113, 36, 13, 79, 16, 94, 249, 110, + 147, 212, 105, 205, 39, 31, 127, 182, 213, 97, 28, 226, 105, 217, 245, 84, + 138, 119, 58, 136, 137, 79, 193, 116, 226, 72, 101, 0, 142, 171, 59, 40, + 203, 158, 100, 187, 137, 8, 9, 125, 233, 16, 241, 192, 135, 4, 72, 132, + 89, 126, 34, 0, 197, 80, 159, 101, 77, 18, 52, 179, 249, 169, 95, 125, + 120, 18, 56, 177, 106, 6, 100, 99, 197, 197, 111, 104, 120, 211, 163, 86, + 224, 106, 157, 48, 112, 84, 232, 171, 172, 220, 107, 136, 118, 170, 105, 16, + 133, 223, 77, 65, 61, 41, 184, 88, 67, 98, 175, 216, 139, 56, 140, 26, + 18, 179, 212, 180, 218, 235, 78, 180, 154, 144, 195, 188, 126, 205, 37, 58, + 203, 223, 248, 156, 87, 139, 176, 77, 244, 117, 77, 148, 85, 187, 142, 119, + 144, 113, 128, 217, 33, 5, 107, 247, 10, 178, 66, 206, 128, 187, 155, 161, + 150, 166, 9, 194, 18, 87, 82, 5, 42, 74, 250, 215, 83, 145, 8, 158, + 182, 156, 82, 161, 19, 87, 92, 77, 14, 7, 208, 23, 8, 13, 59, 57, + 167, 252, 236, 167, 68, 206, 208, 173, 237, 84, 141, 14, 118, 250, 194, 37, + 131, 146, 23, 17, 37, 228, 42, 134, 130, 193, 34, 83, 151, 107, 227, 133, + 189, 157, 96, 73, 176, 115, 205, 111, 159, 89, 182, 43, 180, 27, 36, 57, + 30, 151, 83, 181, 2, 2, 53, 17, 231, 175, 92, 52, 97, 124, 25, 172, + 17, 206, 83, 37, 79, 60, 174, 47, 181, 207, 115, 216, 0, 59, 178, 186, + 222, 154, 48, 10, 203, 237, 168, 102, 67, 97, 12, 80, 164, 196, 36, 102, + 249, 198, 223, 40, 139, 247, 238, 100, 167, 179, 209, 170, 131, 198, 166, 105, + 139, 118, 164, 153, 86, 75, 187, 187, 197, 160, 68, 198, 18, 67, 72, 85, + 158, 8, 198, 13, 38, 133, 227, 47, 6, 64, 250, 136, 178, 128, 108, 116, + 81, 186, 206, 233, 159, 179, 60, 114, 136, 222, 26, 198, 221, 9, 223, 32, + 123, 35, 23, 188, 146, 155, 213, 76, 159, 32, 252, 211, 185, 1, 157, 178, + 135, 227, 248, 103, 157, 213, 189, 148, 107, 135, 236, 254, 236, 112, 211, 216, + 133, 146, 65, 193, 156, 12, 68, 129, 130, 145, 203, 140, 174, 99, 164, 145, + 36, 252, 41, 175, 206, 147, 115, 196, 4, 174, 108, 17, 122, 230, 134, 147, + 226, 163, 123, 125, 195, 16, 122, 59, 157, 243, 224, 222, 35, 75, 158, 165, + 183, 96, 220, 251, 154, 155, 140, 144, 238, 87, 118, 32, 40, 120, 50, 237, + 231, 139, 167, 105, 32, 225, 232, 86, 220, 154, 75, 196, 71, 65, 93, 220, + 61, 119, 51, 177, 246, 221, 145, 96, 123, 19, 25, 236, 101, 58, 161, 73, + 84, 176, 133, 105, 196, 134, 172, 27, 162, 226, 224, 55, 16, 137, 168, 193, + 190, 36, 174, 21, 216, 214, 118, 104, 129, 255, 68, 151, 108, 167, 109, 82, + 66, 183, 246, 156, 70, 234, 152, 129, 21, 156, 244, 102, 179, 68, 253, 171, + 86, 189, 188, 191, 254, 81, 210, 173, 115, 204, 35, 164, 144, 108, 236, 225, + 100, 49, 60, 210, 38, 90, 187, 49, 180, 192, 94, 27, 241, 255, 99, 158, + 7, 237, 83, 24, 236, 15, 188, 123, 165, 197, 98, 230, 62, 46, 224, 117, + 139, 102, 180, 131, 227, 218, 54, 126, 52, 152, 148, 252, 217, 93, 32, 154, + 96, 161, 242, 40, 170, 26, 56, 74, 254, 10, 15, 19, 201, 213, 81, 46, + 158, 233, 148, 163, 223, 116, 67, 170, 168, 17, 52, 115, 222, 60, 24, 251, + 6, 74, 89, 86, 242, 245, 45, 128, 182, 3, 195, 154, 20, 179, 113, 153, + 44, 242, 180, 83, 26, 92, 220, 87, 99, 40, 234, 36, 47, 104, 5, 216, + 15, 75, 28, 250, 13, 84, 199, 155, 151, 61, 58, 214, 142, 173, 215, 72, + 185, 60, 233, 73, 102, 177, 181, 170, 7, 48, 166, 110, 32, 227, 24, 254, + 43, 157, 97, 119, 1, 125, 154, 244, 80, 196, 119, 70, 137, 163, 29, 157, + 21, 96, 40, 77, 149, 43, 89, 115, 78, 66, 67, 78, 130, 122, 141, 108, + 245, 94, 13, 91, 233, 28, 99, 104, 150, 29, 104, 122, 221, 186, 150, 126, + 164, 59, 147, 132, 74, 1, 84, 129, 134, 199, 184, 19, 164, 172, 218, 226, + 69, 96, 187, 3, 219, 55, 20, 36, 43, 220, 131, 166, 139, 173, 189, 7, + 95, 213, 220, 66, 112, 32, 44, 231, 163, 42, 23, 106, 253, 98, 142, 233, + 108, 164, 242, 111, 223, 130, 113, 101, 180, 103, 69, 79, 3, 212, 134, 113, + 14, 252, 41, 247, 87, 188, 147, 176, 171, 218, 249, 176, 197, 157, 118, 13, + 73, 246, 206, 106, 50, 120, 17, 148, 147, 164, 185, 70, 144, 158, 116, 214, + 92, 246, 184, 68, 85, 100, 240, 154, 2, 156, 164, 212, 110, 241, 153, 129, + 7, 222, 203, 157, 48, 94, 103, 89, 110, 197, 102, 10, 76, 234, 22, 12, + 104, 202, 167, 57, 56, 178, 52, 73, 40, 212, 95, 196, 212, 166, 85, 15, + 41, 81, 141, 124, 130, 100, 79, 100, 175, 126, 225, 151, 102, 116, 43, 17, + 190, 116, 116, 79, 51, 59, 243, 149, 11, 121, 3, 234, 103, 221, 234, 201, + 245, 5, 11, 20, 29, 181, 138, 67, 190, 119, 205, 66, 225, 155, 66, 14, + 205, 68, 114, 207, 7, 180, 117, 185, 176, 204, 9, 9, 126, 205, 58, 142, + 28, 136, 232, 53, 149, 237, 169, 44, 185, 78, 143, 99, 153, 143, 187, 157, + 87, 106, 201, 63, 2, 205, 96, 226, 4, 28, 208, 81, 197, 98, 126, 168, + 170, 63, 29, 15, 228, 23, 82, 12, 109, 204, 227, 231, 228, 87, 196, 63, + 117, 68, 31, 206, 19, 177, 225, 66, 233, 244, 58, 185, 208, 188, 153, 253, + 0, 60, 122, 11, 36, 193, 235, 90, 21, 89, 103, 232, 187, 68, 214, 232, + 180, 13, 143, 157, 99, 180, 232, 213, 90, 113, 194, 193, 194, 230, 242, 45, + 135, 51, 201, 80, 171, 128, 144, 150, 184, 193, 211, 22, 74, 186, 176, 237, + 133, 181, 83, 216, 250, 76, 28, 144, 255, 76, 29, 64, 27, 25, 54, 88, + 161, 132, 38, 34, 236, 32, 77, 106, 157, 6, 74, 120, 64, 211, 237, 173, + 164, 29, 22, 107, 236, 9, 67, 136, 70, 87, 153, 52, 245, 162, 52, 213, + 109, 66, 123, 116, 19, 54, 210, 216, 16, 72, 192, 249, 183, 108, 193, 60, + 242, 120, 186, 160, 200, 137, 184, 180, 97, 15, 95, 167, 169, 87, 146, 151, + 83, 244, 178, 11, 114, 231, 59, 246, 175, 29, 229, 95, 166, 199, 244, 74, + 6, 79, 7, 15, 150, 53, 55, 148, 10, 214, 117, 214, 214, 18, 111, 23, + 77, 192, 122, 193, 255, 196, 114, 120, 89, 233, 200, 20, 133, 140, 132, 162, + 136, 45, 10, 216, 110, 169, 138, 221, 15, 114, 80, 66, 207, 159, 89, 31, + 183, 6, 112, 209, 114, 85, 57, 171, 99, 14, 83, 218, 19, 240, 133, 147, + 208, 50, 112, 209, 213, 114, 113, 128, 67, 115, 171, 57, 184, 202, 111, 119, + 128, 8, 204, 133, 137, 179, 216, 142, 74, 57, 86, 75, 192, 237, 228, 108, + 69, 105, 193, 141, 250, 76, 204, 128, 155, 26, 66, 172, 237, 250, 179, 186, + 199, 211, 152, 65, 6, 152, 201, 105, 251, 78, 186, 157, 66, 69, 101, 190, + 17, 230, 96, 168, 156, 29, 7, 59, 250, 141, 145, 141, 234, 100, 149, 39, + 172, 205, 57, 39, 61, 6, 218, 254, 181, 184, 94, 155, 251, 236, 8, 17, + 252, 132, 153, 56, 164, 230, 249, 203, 60, 78, 227, 136, 118, 97, 69, 247, + 170, 83, 230, 125, 104, 85, 239, 19, 220, 15, 148, 251, 249, 196, 138, 38, + 81, 209, 15, 231, 239, 183, 73, 121, 87, 157, 191, 171, 0, 99, 100, 105, + 105, 223, 226, 113, 198, 179, 200, 75, 136, 55, 190, 194, 166, 94, 142, 224, + 39, 193, 163, 138, 3, 203, 220, 34, 118, 216, 34, 142, 111, 227, 241, 205, + 154, 220, 162, 107, 200, 100, 217, 194, 122, 207, 234, 161, 104, 119, 201, 84, + 46, 37, 159, 130, 76, 136, 147, 250, 29, 209, 151, 145, 92, 189, 105, 79, + 101, 117, 4, 209, 229, 171, 22, 168, 11, 210, 160, 120, 158, 218, 39, 129, + 95, 30, 254, 37, 160, 17, 226, 65, 38, 155, 129, 122, 222, 170, 133, 113, + 134, 168, 135, 212, 57, 200, 248, 226, 62, 62, 200, 159, 127, 42, 51, 90, + 49, 28, 134, 6, 226, 227, 159, 163, 142, 179, 173, 151, 168, 47, 106, 150, + 43, 205, 20, 245, 181, 82, 210, 73, 173, 93, 73, 132, 69, 71, 195, 129, + 214, 106, 151, 117, 135, 138, 224, 126, 167, 48, 83, 34, 36, 200, 13, 29, + 239, 80, 11, 224, 146, 30, 165, 79, 231, 209, 119, 168, 138, 217, 100, 202, + 154, 132, 206, 54, 71, 170, 74, 126, 11, 105, 96, 94, 176, 133, 105, 167, + 60, 81, 127, 80, 238, 86, 126, 54, 147, 16, 117, 54, 230, 12, 76, 196, + 8, 177, 11, 61, 177, 113, 30, 40, 18, 26, 18, 55, 37, 74, 94, 243, + 222, 250, 144, 1, 67, 236, 61, 94, 204, 49, 44, 63, 128, 123, 253, 163, + 36, 31, 168, 42, 144, 198, 132, 53, 212, 183, 1, 234, 164, 254, 55, 113, + 19, 28, 184, 210, 113, 4, 95, 146, 92, 164, 152, 120, 176, 218, 237, 134, + 193, 243, 109, 2, 35, 253, 94, 25, 192, 246, 118, 186, 220, 218, 81, 217, + 36, 126, 215, 24, 86, 127, 114, 69, 176, 237, 20, 52, 239, 1, 82, 149, + 90, 227, 216, 108, 176, 100, 41, 68, 64, 97, 13, 13, 10, 132, 104, 252, + 194, 30, 134, 21, 234, 121, 133, 137, 238, 55, 1, 233, 41, 41, 165, 24, + 135, 243, 206, 15, 65, 184, 175, 222, 34, 216, 2, 143, 84, 207, 136, 195, + 96, 7, 114, 230, 244, 158, 69, 30, 62, 183, 157, 58, 157, 248, 35, 163, + 89, 27, 18, 44, 149, 74, 255, 140, 216, 203, 58, 102, 75, 24, 123, 11, + 79, 224, 186, 187, 55, 178, 22, 170, 74, 65, 248, 185, 88, 174, 100, 179, + 42, 147, 165, 94, 149, 106, 1, 14, 49, 135, 110, 240, 201, 36, 145, 118, + 151, 62, 220, 245, 246, 188, 254, 207, 98, 231, 47, 67, 38, 225, 110, 86, + 50, 168, 160, 3, 188, 233, 152, 13, 199, 93, 171, 72, 152, 181, 223, 144, + 105, 206, 64, 198, 51, 125, 118, 168, 107, 110, 42, 87, 126, 137, 100, 52, + 139, 187, 84, 78, 109, 68, 157, 242, 105, 42, 192, 199, 227, 229, 167, 149, + 115, 222, 117, 64, 146, 168, 86, 69, 160, 37, 91, 184, 75, 172, 107, 178, + 205, 113, 109, 197, 143, 177, 69, 241, 131, 191, 103, 112, 145, 194, 234, 152, + 191, 196, 121, 189, 118, 85, 248, 218, 129, 113, 247, 58, 112, 168, 212, 15, + 226, 249, 121, 7, 193, 119, 219, 153, 152, 134, 87, 50, 53, 1, 122, 228, + 133, 70, 218, 235, 176, 226, 181, 228, 247, 171, 237, 208, 93, 219, 210, 204, + 99, 81, 35, 94, 213, 244, 214, 133, 87, 38, 157, 220, 76, 241, 250, 9, + 174, 94, 200, 220, 42, 33, 84, 33, 20, 6, 86, 165, 70, 17, 23, 147, + 58, 74, 222, 31, 41, 174, 132, 226, 158, 2, 97, 151, 118, 118, 199, 237, + 251, 181, 137, 122, 134, 180, 206, 25, 127, 6, 28, 88, 227, 99, 230, 21, + 51, 19, 201, 179, 147, 131, 49, 170, 49, 104, 15, 138, 137, 169, 120, 94, + 205, 80, 43, 230, 239, 124, 165, 225, 36, 228, 209, 108, 204, 135, 125, 157, + 94, 203, 116, 141, 29, 156, 97, 146, 225, 80, 43, 254, 51, 120, 58, 221, + 11, 176, 165, 179, 174, 53, 216, 195, 110, 24, 177, 125, 101, 171, 86, 108, + 182, 14, 91, 146, 246, 127, 249, 192, 221, 143, 211, 90, 9, 12, 130, 246, + 170, 107, 193, 134, 28, 49, 35, 254, 131, 137, 125, 207, 196, 72, 80, 90, + 30, 174, 143, 172, 226, 50, 12, 236, 58, 235, 205, 251, 234, 171, 14, 201, + 232, 131, 230, 212, 162, 143, 189, 179, 44, 100, 224, 49, 15, 155, 170, 228, + 158, 151, 239, 19, 0, 232, 204, 216, 76, 21, 149, 130, 142, 63, 146, 152, + 124, 136, 129, 14, 182, 212, 29, 8, 244, 12, 36, 28, 134, 52, 216, 106, + 229, 107, 150, 8, 223, 247, 117, 229, 251, 216, 158, 228, 97, 240, 148, 228, + 49, 138, 80, 34, 204, 52, 237, 43, 105, 142, 231, 20, 32, 70, 44, 180, + 212, 121, 229, 177, 50, 152, 238, 72, 51, 116, 111, 18, 27, 211, 40, 211, + 97, 226, 18, 155, 21, 216, 166, 165, 37, 234, 56, 121, 165, 159, 197, 87, + 203, 146, 69, 137, 25, 148, 143, 246, 247, 131, 100, 91, 45, 25, 127, 103, + 35, 219, 32, 31, 237, 93, 92, 167, 194, 64, 255, 188, 64, 139, 118, 135, + 212, 56, 216, 167, 102, 36, 220, 109, 21, 147, 92, 78, 8, 65, 213, 179, + 11, 40, 227, 83, 207, 175, 56, 75, 193, 105, 239, 145, 193, 107, 234, 101, + 50, 97, 123, 246, 137, 30, 180, 149, 18, 62, 162, 163, 16, 192, 79, 61, + 222, 25, 35, 181, 13, 10, 90, 25, 216, 76, 219, 117, 100, 244, 159, 172, + 223, 106, 19, 1, 176, 180, 154, 222, 182, 202, 241, 217, 150, 203, 244, 213, + 94, 178, 158, 130, 166, 105, 167, 118, 194, 153, 142, 60, 134, 216, 142, 216, + 254, 2, 7, 54, 26, 197, 25, 138, 74, 39, 101, 107, 168, 110, 24, 58, + 191, 136, 25, 40, 26, 79, 96, 4, 25, 32, 134, 180, 69, 19, 198, 208, + 254, 197, 133, 72, 242, 66, 107, 23, 157, 143, 117, 50, 224, 198, 246, 8, + 19, 49, 213, 159, 9, 201, 160, 158, 200, 59, 145, 119, 110, 58, 190, 132, + 168, 220, 64, 171, 103, 140, 202, 167, 130, 190, 195, 57, 194, 90, 11, 214, + 19, 53, 68, 88, 89, 14, 235, 20, 50, 249, 248, 100, 241, 10, 149, 35, + 93, 4, 84, 62, 75, 41, 223, 81, 56, 18, 14, 101, 224, 40, 118, 53, + 252, 72, 194, 185, 15, 235, 120, 170, 171, 237, 242, 201, 96, 157, 93, 248, + 227, 156, 239, 249, 190, 10, 177, 147, 77, 18, 157, 53, 114, 233, 168, 14, + 28, 80, 50, 89, 248, 127, 156, 98, 193, 111, 202, 38, 248, 60, 243, 240, + 198, 122, 227, 160, 117, 138, 247, 171, 235, 47, 23, 245, 177, 12, 24, 213, + 214, 117, 210, 86, 85, 55, 153, 25, 16, 53, 195, 81, 247, 217, 104, 109, + 170, 63, 79, 169, 38, 150, 42, 167, 206, 230, 51, 109, 62, 202, 205, 164, + 28, 240, 90, 82, 119, 57, 222, 95, 195, 106, 193, 197, 180, 73, 24, 108, + 143, 114, 54, 29, 100, 255, 124, 30, 143, 120, 147, 84, 110, 157, 53, 226, + 104, 117, 65, 60, 187, 173, 94, 59, 132, 121, 145, 188, 220, 105, 4, 48, + 89, 130, 82, 236, 212, 138, 179, 197, 182, 115, 6, 83, 196, 132, 184, 148, + 183, 101, 141, 92, 84, 153, 147, 133, 212, 8, 250, 226, 167, 209, 22, 95, + 44, 103, 243, 27, 111, 105, 128, 110, 88, 110, 190, 229, 81, 26, 219, 229, + 83, 247, 16, 17, 158, 228, 197, 32, 193, 223, 184, 178, 89, 21, 43, 254, + 124, 144, 200, 131, 138, 5, 107, 98, 139, 16, 184, 127, 244, 51, 141, 88, + 178, 132, 205, 239, 123, 14, 34, 2, 244, 238, 154, 230, 146, 87, 15, 20, + 164, 174, 159, 28, 211, 81, 230, 227, 158, 16, 168, 8, 18, 105, 177, 68, + 50, 127, 64, 73, 123, 233, 44, 34, 159, 133, 66, 100, 163, 184, 244, 171, + 240, 235, 230, 160, 137, 131, 200, 230, 189, 136, 137, 240, 110, 253, 0, 250, + 52, 126, 123, 209, 83, 189, 61, 243, 153, 60, 36, 157, 156, 141, 175, 212, + 219, 217, 33, 144, 133, 126, 7, 41, 228, 77, 247, 47, 162, 47, 3, 157, + 32, 219, 149, 138, 51, 181, 65, 242, 51, 76, 185, 51, 5, 188, 216, 33, + 31, 179, 247, 93, 55, 241, 103, 253, 14, 6, 32, 17, 137, 194, 126, 235, + 132, 115, 93, 167, 187, 190, 147, 190, 255, 120, 166, 38, 118, 241, 129, 163, + 37, 39, 155, 142, 37, 147, 134, 221, 136, 99, 114, 152, 250, 143, 53, 104, + 103, 7, 37, 178, 195, 124, 200, 196, 34, 8, 247, 255, 156, 141, 29, 202, + 239, 70, 189, 144, 0, 167, 182, 105, 57, 205, 218, 54, 151, 29, 7, 76, + 7, 84, 20, 246, 185, 216, 93, 21, 96, 25, 115, 176, 38, 180, 177, 224, + 112, 104, 92, 17, 152, 55, 211, 21, 210, 98, 249, 201, 21, 85, 84, 185, + 53, 59, 147, 198, 1, 251, 185, 235, 132, 73, 67, 194, 220, 120, 191, 206, + 73, 53, 158, 237, 102, 41, 23, 133, 14, 81, 47, 204, 9, 142, 124, 180, + 115, 236, 180, 190, 218, 68, 92, 113, 54, 250, 174, 99, 126, 1, 186, 88, + 231, 96, 51, 147, 236, 164, 135, 210, 75, 242, 196, 53, 104, 101, 233, 0, + 129, 173, 53, 118, 42, 188, 139, 187, 251, 143, 37, 222, 198, 168, 194, 103, + 107, 56, 240, 213, 98, 0, 65, 112, 187, 230, 203, 207, 104, 124, 78, 130, + 66, 156, 214, 95, 22, 46, 181, 254, 15, 201, 138, 160, 138, 171, 202, 3, + 169, 187, 110, 58, 43, 218, 62, 112, 49, 206, 186, 161, 31, 140, 183, 84, + 143, 250, 217, 123, 9, 210, 87, 1, 208, 77, 143, 33, 6, 237, 173, 108, + 187, 137, 131, 148, 145, 22, 123, 142, 146, 156, 223, 61, 124, 151, 57, 17, + 88, 139, 56, 8, 26, 205, 163, 193, 72, 201, 209, 220, 215, 97, 172, 73, + 99, 139, 111, 125, 94, 196, 78, 235, 224, 103, 38, 237, 9, 142, 131, 229, + 45, 247, 172, 219, 29, 102, 67, 124, 171, 113, 2, 85, 148, 56, 150, 227, + 45, 147, 200, 171, 42, 244, 128, 106, 2, 47, 245, 211, 163, 240, 41, 86, + 50, 70, 44, 91, 166, 247, 110, 234, 138, 152, 4, 100, 49, 248, 198, 51, + 124, 253, 126, 122, 30, 165, 0, 183, 248, 65, 30, 156, 161, 52, 164, 76, + 44, 198, 99, 20, 24, 97, 93, 232, 104, 51, 200, 0, 153, 67, 93, 172, + 94, 217, 127, 34, 29, 64, 149, 41, 78, 211, 63, 188, 61, 102, 2, 127, + 166, 194, 5, 59, 203, 5, 224, 68, 250, 58, 202, 236, 218, 235, 168, 0, + 205, 82, 53, 99, 51, 144, 0, 140, 45, 46, 213, 207, 17, 221, 47, 85, + 211, 87, 2, 35, 167, 236, 191, 70, 147, 201, 200, 69, 1, 228, 136, 243, + 122, 253, 34, 201, 92, 90, 194, 8, 119, 197, 197, 178, 157, 207, 170, 147, + 232, 5, 200, 241, 6, 27, 120, 242, 232, 163, 26, 234, 230, 50, 214, 194, + 125, 135, 62, 28, 118, 24, 155, 39, 166, 250, 204, 189, 169, 94, 110, 81, + 222, 81, 127, 71, 49, 176, 178, 37, 63, 219, 72, 0, 100, 255, 201, 70, + 177, 208, 81, 101, 177, 31, 130, 187, 196, 119, 161, 217, 207, 216, 59, 106, + 15, 56, 134, 229, 99, 68, 73, 215, 9, 25, 119, 82, 88, 19, 184, 42, + 38, 40, 176, 6, 34, 167, 249, 143, 6, 216, 128, 139, 75, 3, 229, 126, + 121, 187, 68, 219, 187, 99, 154, 175, 240, 86, 75, 40, 133, 146, 223, 105, + 220, 83, 126, 90, 206, 136, 102, 199, 36, 217, 56, 78, 226, 138, 59, 142, + 223, 68, 175, 191, 83, 224, 208, 195, 2, 102, 168, 194, 158, 231, 143, 162, + 83, 92, 93, 238, 12, 231, 142, 41, 106, 66, 178, 68, 83, 155, 24, 102, + 150, 112, 1, 27, 175, 239, 85, 175, 61, 75, 157, 245, 121, 62, 171, 217, + 55, 218, 86, 45, 10, 228, 203, 193, 216, 90, 142, 109, 232, 168, 17, 149, + 145, 169, 199, 134, 194, 110, 104, 66, 130, 215, 179, 205, 6, 183, 93, 47, + 131, 8, 104, 12, 169, 92, 69, 43, 193, 77, 223, 238, 36, 15, 59, 136, + 95, 87, 196, 169, 35, 118, 252, 19, 6, 247, 172, 219, 159, 109, 118, 154, + 10, 199, 227, 164, 36, 85, 27, 37, 52, 149, 85, 107, 134, 203, 39, 112, + 63, 235, 229, 225, 141, 127, 46, 188, 125, 48, 183, 137, 79, 157, 251, 128, + 214, 29, 60, 192, 43, 20, 22, 77, 62, 5, 229, 201, 61, 217, 181, 68, + 161, 232, 220, 189, 206, 170, 48, 199, 251, 10, 93, 153, 112, 35, 81, 174, + 17, 220, 54, 183, 4, 229, 14, 231, 33, 14, 63, 121, 125, 205, 101, 110, + 255, 145, 55, 130, 56, 4, 236, 171, 27, 10, 130, 188, 115, 125, 104, 178, + 41, 100, 48, 200, 231, 41, 156, 32, 125, 22, 167, 209, 221, 201, 63, 165, + 210, 15, 14, 83, 162, 45, 176, 131, 195, 34, 145, 120, 155, 67, 82, 254, + 231, 179, 149, 97, 4, 84, 30, 62, 140, 39, 235, 91, 145, 92, 89, 87, + 96, 144, 96, 223, 153, 0, 28, 117, 238, 168, 40, 11, 140, 197, 162, 172, + 72, 23, 120, 153, 147, 195, 6, 39, 36, 54, 174, 202, 182, 74, 232, 30, + 240, 10, 130, 188, 127, 2, 48, 68, 9, 191, 245, 176, 249, 169, 19, 21, + 154, 45, 249, 114, 137, 223, 190, 252, 87, 36, 85, 242, 96, 21, 234, 18, + 157, 108, 86, 179, 103, 87, 149, 121, 231, 19, 111, 157, 154, 171, 158, 128, + 68, 253, 157, 146, 9, 11, 82, 101, 218, 181, 37, 73, 31, 19, 122, 211, + 104, 102, 172, 244, 119, 94, 235, 143, 241, 113, 24, 211, 132, 227, 169, 254, + 60, 118, 45, 122, 177, 97, 161, 170, 233, 212, 139, 23, 179, 61, 117, 175, + 126, 18, 119, 242, 14, 67, 254, 147, 62, 61, 58, 54, 42, 75, 134, 163, + 134, 56, 20, 222, 1, 199, 168, 38, 142, 114, 14, 84, 106, 218, 24, 245, + 129, 59, 86, 217, 80, 79, 119, 218, 53, 136, 124, 63, 90, 179, 205, 112, + 192, 116, 186, 223, 65, 52, 109, 169, 196, 209, 73, 239, 124, 224, 15, 78, + 134, 164, 65, 189, 58, 22, 166, 57, 64, 104, 185, 101, 43, 231, 254, 145, + 156, 74, 38, 201, 121, 28, 25, 221, 129, 82, 26, 14, 36, 32, 158, 208, + 70, 2, 201, 70, 190, 208, 246, 54, 239, 158, 140, 212, 225, 209, 177, 86, + 31, 32, 45, 93, 207, 255, 12, 176, 154, 217, 193, 166, 61, 241, 53, 80, + 37, 214, 34, 65, 207, 114, 163, 132, 116, 133, 63, 217, 234, 5, 111, 188, + 79, 1, 110, 88, 156, 17, 242, 1, 138, 105, 144, 213, 123, 212, 7, 164, + 200, 175, 161, 145, 108, 104, 174, 202, 202, 35, 153, 88, 138, 105, 58, 143, + 57, 227, 90, 38, 189, 38, 66, 80, 222, 174, 7, 202, 57, 236, 239, 104, + 51, 26, 252, 140, 2, 74, 4, 163, 211, 199, 202, 185, 65, 203, 13, 210, + 69, 228, 115, 31, 100, 143, 189, 100, 228, 209, 107, 55, 72, 150, 255, 144, + 232, 155, 15, 42, 18, 149, 49, 207, 32, 148, 178, 112, 254, 67, 51, 14, + 217, 41, 203, 217, 205, 101, 223, 161, 148, 33, 92, 164, 250, 91, 80, 251, + 104, 157, 225, 172, 18, 245, 5, 54, 30, 8, 254, 109, 3, 202, 215, 179, + 161, 236, 147, 104, 254, 232, 217, 124, 178, 1, 206, 38, 168, 77, 8, 112, + 234, 154, 162, 94, 3, 90, 94, 114, 137, 115, 42, 98, 202, 0, 214, 202, + 65, 93, 52, 179, 123, 74, 86, 10, 171, 211, 171, 44, 226, 56, 13, 163, + 7, 146, 57, 253, 115, 93, 156, 132, 119, 146, 107, 98, 218, 19, 195, 5, + 195, 190, 231, 218, 143, 48, 65, 102, 92, 0, 244, 108, 148, 144, 214, 99, + 128, 208, 85, 124, 5, 75, 38, 131, 93, 38, 21, 170, 24, 105, 170, 135, + 152, 21, 38, 191, 251, 88, 178, 62, 84, 177, 239, 61, 156, 63, 47, 195, + 117, 159, 198, 182, 126, 216, 103, 165, 158, 51, 70, 34, 33, 241, 216, 11, + 50, 152, 157, 100, 30, 66, 147, 88, 38, 17, 251, 19, 182, 71, 65, 199, + 150, 215, 188, 188, 80, 83, 2, 83, 73, 183, 251, 85, 101, 25, 173, 50, + 243, 138, 194, 98, 209, 104, 219, 25, 45, 111, 172, 115, 238, 149, 4, 205, + 123, 112, 218, 192, 247, 102, 191, 30, 225, 230, 36, 188, 219, 220, 19, 213, + 127, 226, 227, 17, 90, 216, 88, 129, 249, 230, 91, 42, 111, 102, 45, 42, + 175, 161, 188, 195, 184, 238, 57, 69, 88, 168, 167, 23, 64, 47, 201, 51, + 79, 65, 117, 254, 146, 100, 8, 30, 209, 42, 138, 132, 209, 241, 66, 249, + 228, 192, 48, 21, 75, 202, 123, 99, 76, 87, 34, 99, 32, 224, 140, 94, + 90, 178, 47, 165, 23, 227, 92, 218, 45, 44, 104, 9, 23, 94, 254, 195, + 16, 12, 105, 135, 48, 225, 7, 139, 148, 199, 157, 139, 243, 71, 254, 15, + 64, 143, 140, 3, 221, 218, 117, 118, 34, 177, 156, 50, 220, 99, 219, 4, + 247, 244, 16, 100, 51, 73, 85, 181, 24, 127, 102, 173, 238, 205, 143, 68, + 63, 44, 197, 106, 165, 150, 11, 244, 198, 36, 101, 10, 79, 207, 183, 214, + 228, 226, 226, 235, 77, 11, 175, 80, 90, 197, 35, 99, 7, 121, 208, 236, + 141, 171, 176, 158, 219, 162, 166, 168, 147, 2, 131, 180, 57, 229, 106, 63, + 194, 250, 21, 63, 152, 16, 109, 20, 208, 227, 225, 10, 22, 2, 223, 128, + 89, 100, 47, 101, 165, 0, 147, 198, 47, 109, 94, 113, 183, 101, 113, 248, + 79, 21, 26, 141, 176, 52, 118, 71, 143, 174, 194, 248, 199, 194, 245, 105, + 112, 92, 180, 22, 184, 218, 78, 192, 41, 17, 171, 143, 203, 2, 81, 178, + 177, 138, 101, 113, 190, 77, 70, 73, 85, 228, 194, 2, 70, 191, 54, 43, + 188, 233, 27, 135, 140, 127, 10, 59, 38, 86, 226, 127, 166, 132, 69, 21, + 200, 107, 33, 89, 24, 152, 88, 90, 75, 144, 236, 44, 10, 121, 139, 169, + 113, 127, 104, 227, 164, 145, 69, 196, 233, 237, 127, 132, 204, 244, 178, 247, + 191, 207, 63, 135, 214, 135, 213, 151, 44, 43, 190, 32, 241, 221, 118, 81, + 145, 43, 29, 244, 239, 78, 245, 115, 229, 178, 255, 147, 16, 149, 255, 154, + 217, 226, 234, 99, 247, 146, 209, 42, 9, 74, 220, 199, 178, 165, 246, 188, + 22, 51, 136, 38, 63, 125, 45, 108, 190, 111, 72, 248, 57, 16, 107, 120, + 245, 158, 215, 136, 9, 25, 61, 162, 148, 109, 112, 193, 56, 81, 121, 143, + 208, 225, 20, 130, 245, 12, 81, 156, 189, 102, 23, 51, 135, 76, 205, 59, + 197, 152, 35, 80, 127, 168, 223, 48, 20, 104, 57, 69, 132, 53, 72, 220, + 161, 178, 219, 33, 37, 245, 58, 199, 17, 246, 39, 2, 84, 251, 20, 62, + 21, 56, 209, 143, 149, 24, 68, 59, 17, 240, 215, 95, 195, 188, 231, 97, + 41, 32, 98, 57, 107, 172, 90, 159, 132, 150, 226, 75, 151, 144, 12, 111, + 6, 253, 112, 213, 28, 179, 232, 233, 73, 139, 84, 232, 204, 0, 148, 77, + 48, 183, 37, 213, 67, 195, 211, 206, 12, 110, 212, 180, 201, 229, 77, 7, + 48, 221, 44, 102, 23, 168, 145, 200, 77, 103, 7, 173, 247, 84, 110, 123, + 23, 5, 145, 154, 124, 95, 103, 89, 78, 136, 74, 47, 136, 86, 135, 250, + 60, 228, 64, 78, 228, 172, 111, 204, 89, 144, 119, 8, 248, 81, 70, 113, + 89, 113, 50, 70, 124, 182, 58, 179, 77, 197, 160, 136, 41, 195, 19, 163, + 222, 23, 34, 70, 203, 156, 137, 209, 146, 213, 112, 210, 203, 138, 236, 36, + 24, 57, 106, 75, 115, 112, 43, 229, 239, 154, 133, 160, 211, 36, 241, 229, + 94, 110, 224, 182, 162, 85, 189, 20, 125, 9, 26, 137, 185, 177, 14, 138, + 5, 225, 132, 174, 244, 209, 187, 92, 140, 29, 158, 111, 150, 8, 32, 99, + 99, 142, 213, 19, 101, 164, 64, 190, 61, 219, 198, 118, 246, 217, 110, 173, + 248, 24, 100, 216, 190, 118, 198, 209, 64, 238, 205, 176, 46, 116, 131, 103, + 243, 148, 123, 69, 136, 144, 46, 112, 112, 162, 219, 21, 205, 136, 193, 152, + 96, 134, 16, 22, 146, 190, 194, 19, 119, 47, 44, 67, 131, 166, 109, 215, + 159, 90, 88, 212, 11, 71, 235, 55, 31, 4, 113, 172, 187, 169, 10, 144, + 169, 108, 79, 145, 7, 29, 24, 221, 230, 28, 113, 32, 190, 160, 67, 40, + 43, 107, 222, 221, 175, 180, 200, 217, 15, 128, 253, 206, 203, 106, 167, 163, + 89, 29, 28, 247, 240, 14, 121, 133, 218, 154, 167, 77, 98, 149, 151, 145, + 4, 78, 232, 135, 195, 121, 157, 216, 178, 211, 243, 201, 71, 220, 150, 119, + 74, 71, 110, 200, 234, 100, 105, 248, 47, 25, 35, 1, 241, 166, 6, 88, + 41, 246, 176, 181, 21, 75, 150, 20, 227, 19, 64, 226, 209, 194, 121, 174, + 240, 219, 133, 253, 161, 146, 230, 69, 122, 42, 165, 82, 78, 45, 185, 61, + 12, 14, 148, 13, 119, 155, 157, 28, 90, 226, 119, 9, 201, 199, 64, 93, + 120, 115, 138, 156, 235, 123, 52, 111, 149, 48, 73, 181, 204, 181, 10, 157, + 16, 55, 100, 243, 10, 29, 159, 139, 88, 16, 1, 31, 201, 242, 2, 237, + 186, 181, 217, 139, 102, 205, 119, 197, 201, 221, 108, 205, 171, 54, 109, 31, + 76, 199, 28, 160, 214, 14, 201, 25, 211, 189, 144, 44, 69, 70, 205, 79, + 150, 149, 108, 23, 8, 171, 60, 18, 127, 161, 41, 71, 239, 168, 89, 140, + 49, 149, 157, 109, 232, 141, 227, 239, 247, 114, 174, 129, 19, 252, 130, 74, + 202, 224, 73, 122, 246, 47, 147, 8, 37, 60, 253, 101, 11, 171, 160, 39, + 92, 180, 183, 40, 254, 233, 117, 200, 139, 37, 140, 28, 35, 8, 10, 40, + 167, 247, 248, 84, 215, 58, 170, 2, 7, 1, 69, 214, 10, 7, 233, 209, + 181, 212, 34, 68, 46, 141, 198, 137, 248, 45, 130, 97, 123, 104, 141, 17, + 126, 7, 199, 55, 194, 160, 69, 39, 13, 70, 41, 63, 205, 99, 1, 69, + 46, 92, 77, 56, 20, 247, 224, 226, 60, 153, 81, 180, 91, 159, 156, 27, + 119, 114, 126, 210, 26, 123, 165, 204, 237, 81, 75, 130, 45, 60, 0, 155, + 11, 125, 27, 202, 35, 230, 101, 164, 86, 117, 226, 23, 171, 253, 222, 223, + 38, 104, 224, 124, 92, 251, 110, 145, 247, 198, 158, 25, 172, 84, 49, 87, + 1, 168, 95, 124, 146, 5, 46, 179, 198, 235, 69, 200, 63, 212, 59, 110, + 52, 195, 54, 71, 169, 234, 189, 58, 180, 149, 194, 10, 118, 99, 66, 66, + 123, 192, 248, 51, 237, 129, 10, 143, 94, 55, 135, 247, 56, 163, 40, 139, + 150, 192, 142, 64, 169, 90, 42, 116, 228, 62, 67, 130, 212, 212, 23, 210, + 182, 95, 109, 224, 185, 255, 156, 102, 184, 171, 42, 98, 217, 218, 27, 80, + 171, 125, 49, 233, 16, 238, 42, 102, 61, 95, 180, 49, 192, 67, 112, 143, + 106, 145, 185, 239, 180, 181, 120, 24, 127, 215, 233, 123, 235, 104, 228, 248, + 223, 90, 211, 211, 76, 179, 198, 253, 220, 171, 247, 171, 11, 237, 17, 249, + 81, 122, 111, 255, 213, 120, 167, 192, 149, 102, 7, 204, 86, 107, 156, 83, + 174, 18, 237, 143, 85, 76, 245, 189, 86, 90, 118, 69, 100, 140, 121, 17, + 255, 17, 209, 144, 90, 3, 191, 201, 134, 108, 0, 196, 133, 153, 39, 248, + 138, 215, 73, 18, 21, 140, 172, 178, 154, 194, 170, 45, 112, 113, 213, 36, + 155, 0, 30, 213, 186, 39, 6, 241, 92, 111, 139, 52, 84, 58, 218, 187, + 60, 123, 113, 190, 185, 89, 242, 248, 221, 238, 173, 145, 214, 237, 133, 101, + 6, 143, 188, 116, 13, 189, 205, 203, 147, 140, 215, 175, 38, 99, 77, 54, + 98, 146, 54, 101, 40, 206, 175, 26, 195, 33, 63, 20, 210, 96, 227, 125, + 108, 230, 179, 123, 81, 135, 183, 132, 216, 56, 223, 197, 141, 158, 114, 228, + 67, 172, 95, 76, 69, 212, 188, 244, 12, 16, 158, 119, 106, 44, 39, 36, + 38, 164, 173, 182, 172, 210, 176, 19, 125, 6, 36, 138, 77, 65, 219, 30, + 45, 167, 21, 125, 49, 69, 173, 23, 242, 246, 25, 155, 194, 161, 140, 125, + 97, 153, 68, 120, 114, 23, 243, 242, 192, 129, 68, 88, 43, 161, 33, 152, + 130, 232, 179, 70, 156, 219, 198, 1, 135, 3, 178, 49, 92, 30, 125, 185, + 39, 185, 69, 143, 30, 180, 113, 109, 233, 156, 101, 82, 239, 142, 58, 234, + 151, 67, 2, 140, 198, 7, 180, 167, 33, 168, 131, 213, 157, 139, 43, 208, + 27, 217, 245, 115, 0, 59, 155, 69, 236, 209, 101, 139, 211, 247, 2, 41, + 113, 222, 7, 2, 109, 61, 232, 215, 145, 18, 202, 158, 187, 136, 54, 190, + 169, 13, 59, 204, 117, 37, 160, 6, 121, 200, 9, 189, 31, 0, 251, 78, + 223, 43, 122, 5, 42, 24, 74, 247, 241, 68, 42, 49, 28, 153, 3, 40, + 166, 47, 55, 83, 186, 236, 69, 132, 91, 115, 132, 26, 214, 160, 51, 161, + 232, 147, 172, 175, 144, 53, 58, 241, 1, 245, 53, 126, 211, 121, 98, 228, + 65, 166, 9, 186, 93, 111, 249, 87, 109, 85, 218, 177, 160, 225, 99, 131, + 167, 173, 36, 10, 121, 121, 98, 249, 99, 68, 128, 159, 217, 207, 65, 52, + 247, 53, 58, 135, 11, 76, 238, 101, 162, 166, 100, 126, 136, 157, 43, 172, + 186, 157, 138, 2, 132, 141, 165, 152, 92, 234, 3, 92, 81, 111, 83, 239, + 234, 204, 152, 240, 74, 198, 42, 56, 131, 104, 96, 83, 207, 109, 30, 185, + 45, 242, 2, 155, 47, 18, 111, 119, 57, 239, 7, 88, 45, 86, 239, 10, + 178, 146, 58, 248, 96, 166, 234, 253, 202, 224, 111, 120, 216, 70, 205, 29, + 154, 232, 216, 165, 222, 76, 153, 46, 5, 143, 71, 197, 175, 198, 127, 231, + 119, 110, 47, 128, 61, 134, 41, 115, 101, 3, 35, 127, 201, 12, 152, 1, + 163, 41, 91, 233, 10, 230, 150, 44, 140, 234, 164, 184, 214, 218, 114, 23, + 221, 163, 57, 2, 5, 147, 66, 223, 90, 238, 136, 95, 138, 116, 27, 91, + 223, 52, 243, 246, 183, 215, 166, 170, 169, 8, 140, 91, 173, 160, 160, 105, + 69, 241, 31, 33, 33, 148, 215, 67, 130, 181, 1, 114, 104, 206, 192, 195, + 247, 229, 99, 84, 29, 2, 132, 146, 191, 243, 37, 36, 46, 176, 164, 68, + 84, 121, 159, 6, 160, 195, 170, 43, 128, 130, 165, 44, 157, 83, 173, 182, + 93, 90, 202, 227, 133, 140, 39, 203, 202, 2, 49, 96, 178, 190, 147, 15, + 99, 71, 216, 166, 97, 130, 87, 4, 149, 23, 107, 246, 216, 213, 222, 64, + 41, 215, 37, 211, 21, 53, 90, 130, 165, 181, 188, 87, 70, 8, 53, 114, + 227, 18, 192, 19, 200, 195, 83, 228, 1, 171, 202, 229, 92, 92, 227, 48, + 251, 31, 198, 59, 162, 119, 9, 75, 115, 30, 127, 8, 89, 99, 249, 86, + 152, 198, 53, 207, 82, 251, 68, 82, 247, 21, 214, 18, 246, 118, 81, 94, + 240, 34, 174, 233, 205, 204, 71, 0, 254, 24, 178, 166, 248, 12, 70, 187, + 163, 168, 95, 23, 108, 156, 210, 244, 198, 216, 54, 32, 83, 158, 121, 26, + 116, 252, 122, 73, 188, 134, 154, 180, 229, 139, 102, 2, 8, 171, 201, 5, + 187, 57, 35, 254, 35, 19, 161, 16, 88, 215, 158, 148, 249, 201, 65, 177, + 144, 69, 138, 161, 220, 255, 190, 223, 43, 181, 11, 158, 103, 193, 14, 21, + 49, 16, 40, 223, 155, 12, 164, 23, 31, 15, 20, 238, 131, 85, 181, 80, + 149, 128, 196, 123, 155, 236, 9, 94, 252, 182, 54, 62, 215, 115, 115, 224, + 242, 141, 137, 238, 115, 101, 107, 65, 202, 79, 79, 27, 239, 29, 154, 19, + 18, 4, 185, 144, 191, 107, 92, 29, 38, 248, 142, 81, 109, 64, 161, 23, + 73, 93, 31, 114, 51, 81, 98, 209, 69, 27, 43, 22, 4, 168, 88, 60, + 149, 89, 100, 82, 122, 95, 21, 38, 97, 185, 87, 66, 82, 16, 242, 109, + 100, 94, 164, 6, 73, 130, 76, 137, 218, 226, 166, 35, 21, 156, 72, 253, + 148, 228, 142, 134, 41, 145, 15, 144, 215, 187, 120, 239, 195, 203, 44, 250, + 46, 72, 181, 43, 255, 81, 247, 100, 195, 248, 208, 115, 141, 32, 190, 131, + 77, 230, 220, 54, 197, 60, 22, 115, 177, 116, 250, 0, 60, 144, 128, 68, + 245, 231, 199, 216, 17, 216, 227, 120, 221, 68, 233, 236, 202, 121, 189, 237, + 149, 60, 244, 130, 250, 169, 70, 101, 147, 8, 49, 248, 61, 207, 202, 148, + 228, 87, 234, 117, 238, 52, 92, 118, 148, 203, 206, 175, 75, 64, 215, 57, + 70, 196, 52, 62, 29, 116, 241, 185, 96, 131, 201, 219, 16, 3, 188, 159, + 129, 134, 11, 138, 13, 3, 72, 193, 183, 236, 91, 171, 161, 52, 166, 23, + 254, 118, 238, 180, 55, 215, 165, 163, 154, 202, 27, 61, 150, 31, 12, 1, + 249, 0, 12, 29, 132, 213, 168, 105, 53, 112, 54, 2, 236, 131, 230, 3, + 211, 69, 243, 233, 173, 145, 105, 27, 18, 252, 224, 5, 46, 18, 233, 96, + 237, 143, 52, 67, 158, 30, 242, 151, 98, 148, 208, 60, 143, 14, 245, 250, + 185, 151, 111, 147, 145, 197, 165, 233, 18, 178, 240, 83, 228, 213, 237, 58, + 20, 152, 249, 241, 250, 204, 15, 167, 97, 242, 6, 228, 117, 133, 2, 199, + 220, 212, 239, 206, 104, 231, 145, 33, 17, 150, 223, 126, 173, 223, 148, 21, + 228, 41, 63, 37, 19, 102, 73, 95, 196, 40, 151, 2, 19, 239, 182, 22, + 178, 165, 242, 159, 208, 226, 72, 179, 201, 109, 157, 18, 230, 130, 221, 89, + 173, 242, 170, 11, 146, 20, 135, 112, 2, 202, 30, 25, 106, 151, 52, 223, + 1, 3, 18, 151, 74, 113, 49, 186, 112, 160, 121, 38, 233, 155, 188, 237, + 251, 178, 8, 200, 120, 134, 152, 22, 232, 250, 219, 237, 157, 23, 134, 158, + 122, 202, 120, 89, 248, 68, 46, 184, 180, 93, 84, 85, 177, 236, 62, 50, + 103, 62, 81, 105, 33, 15, 97, 203, 192, 132, 219, 70, 203, 104, 162, 98, + 179, 224, 44, 101, 221, 84, 176, 97, 77, 84, 45, 255, 227, 80, 107, 45, + 70, 106, 68, 206, 134, 182, 205, 255, 235, 44, 131, 81, 126, 142, 30, 130, + 87, 133, 227, 15, 200, 194, 5, 230, 230, 169, 65, 116, 104, 193, 196, 214, + 18, 199, 56, 114, 5, 7, 189, 158, 32, 119, 53, 93, 169, 172, 141, 223, + 71, 194, 204, 221, 237, 118, 16, 198, 169, 10, 38, 156, 152, 76, 185, 73, + 15, 227, 118, 57, 149, 160, 14, 158, 18, 139, 117, 249, 142, 12, 175, 252, + 9, 202, 65, 196, 23, 211, 174, 169, 85, 244, 154, 239, 28, 199, 196, 171, + 241, 27, 140, 222, 54, 25, 229, 69, 102, 134, 125, 235, 246, 156, 41, 75, + 212, 225, 169, 207, 88, 246, 136, 176, 27, 40, 205, 228, 239, 24, 217, 42, + 212, 63, 187, 75, 60, 197, 97, 245, 3, 35, 243, 128, 36, 129, 145, 31, + 27, 193, 20, 122, 116, 143, 130, 159, 80, 203, 253, 233, 66, 118, 92, 177, + 83, 55, 141, 189, 115, 240, 125, 107, 8, 221, 237, 171, 24, 183, 220, 174, + 149, 51, 81, 221, 187, 233, 21, 116, 37, 88, 123, 20, 208, 201, 141, 155, + 136, 148, 64, 14, 102, 204, 248, 173, 249, 61, 75, 253, 199, 46, 192, 138, + 79, 83, 161, 127, 235, 140, 173, 158, 127, 232, 77, 17, 45, 207, 154, 51, + 79, 57, 184, 22, 220, 225, 61, 233, 188, 119, 221, 254, 87, 105, 151, 29, + 156, 162, 18, 202, 244, 36, 105, 24, 240, 195, 198, 39, 31, 155, 135, 62, + 220, 180, 53, 70, 121, 254, 234, 194, 79, 177, 181, 75, 23, 20, 217, 209, + 107, 100, 175, 83, 25, 212, 62, 11, 108, 33, 144, 17, 150, 176, 225, 86, + 54, 190, 8, 82, 150, 219, 80, 72, 75, 100, 197, 72, 95, 174, 189, 158, + 109, 146, 103, 67, 101, 165, 191, 178, 148, 32, 173, 147, 195, 145, 27, 119, + 126, 46, 186, 120, 226, 41, 209, 51, 171, 29, 4, 244, 184, 209, 92, 159, + 221, 122, 163, 30, 246, 68, 8, 190, 146, 143, 159, 116, 211, 83, 247, 90, + 241, 193, 10, 58, 250, 60, 69, 182, 204, 181, 207, 107, 37, 104, 150, 14, + 69, 55, 20, 7, 158, 96, 202, 248, 68, 220, 209, 132, 133, 164, 58, 175, + 103, 166, 1, 174, 0, 32, 182, 13, 199, 83, 48, 148, 52, 198, 19, 135, + 58, 46, 109, 164, 49, 199, 26, 109, 132, 19, 46, 118, 59, 27, 202, 73, + 4, 1, 22, 183, 163, 247, 45, 96, 206, 43, 239, 186, 131, 5, 61, 198, + 46, 99, 31, 89, 194, 241, 207, 170, 80, 250, 72, 225, 89, 154, 151, 165, + 171, 42, 59, 58, 68, 73, 178, 88, 153, 111, 247, 233, 19, 130, 51, 194, + 18, 142, 129, 52, 252, 167, 183, 238, 99, 198, 85, 134, 20, 114, 94, 90, + 7, 223, 147, 178, 135, 156, 216, 69, 14, 42, 181, 232, 203, 63, 239, 213, + 42, 225, 189, 223, 15, 238, 219, 62, 218, 15, 210, 141, 184, 226, 11, 228, + 9, 40, 37, 118, 26, 194, 213, 220, 99, 247, 7, 137, 187, 61, 64, 56, + 86, 169, 143, 224, 135, 166, 4, 28, 55, 87, 216, 45, 56, 39, 37, 181, + 234, 38, 4, 241, 184, 43, 134, 108, 245, 247, 230, 99, 162, 95, 214, 92, + 191, 83, 38, 152, 241, 38, 33, 32, 38, 92, 222, 228, 138, 11, 143, 135, + 83, 181, 140, 99, 9, 252, 123, 215, 212, 81, 108, 71, 2, 159, 246, 82, + 118, 186, 48, 69, 212, 147, 218, 61, 183, 170, 130, 233, 227, 145, 101, 156, + 20, 106, 128, 214, 238, 12, 163, 59, 152, 250, 112, 173, 42, 5, 1, 68, + 35, 52, 13, 198, 121, 11, 117, 16, 126, 143, 54, 184, 205, 44, 238, 47, + 218, 75, 112, 228, 183, 55, 22, 189, 35, 146, 27, 44, 229, 190, 241, 110, + 42, 152, 12, 141, 131, 183, 84, 31, 40, 185, 108, 176, 173, 247, 217, 214, + 155, 108, 176, 152, 201, 201, 185, 7, 227, 187, 87, 71, 45, 98, 224, 159, + 125, 230, 132, 19, 233, 98, 174, 93, 80, 245, 32, 94, 253, 35, 150, 68, + 176, 83, 50, 127, 196, 149, 176, 191, 136, 194, 84, 228, 106, 238, 47, 206, + 110, 204, 9, 116, 136, 230, 249, 90, 215, 160, 51, 151, 61, 92, 187, 82, + 129, 101, 75, 238, 22, 166, 132, 86, 183, 113, 149, 215, 39, 242, 214, 148, + 71, 168, 236, 20, 105, 249, 219, 23, 101, 63, 92, 173, 40, 126, 253, 145, + 161, 9, 72, 60, 215, 59, 155, 228, 255, 201, 193, 60, 129, 51, 29, 207, + 237, 43, 145, 161, 41, 115, 98, 19, 138, 253, 66, 232, 233, 186, 79, 114, + 1, 164, 184, 14, 61, 151, 198, 60, 247, 115, 5, 176, 132, 201, 245, 60, + 21, 238, 60, 133, 186, 18, 154, 89, 170, 23, 102, 2, 111, 147, 25, 208, + 152, 173, 13, 58, 125, 181, 115, 218, 196, 107, 173, 192, 60, 94, 140, 254, + 83, 80, 214, 220, 245, 254, 250, 39, 202, 132, 142, 84, 16, 199, 20, 129, + 159, 24, 18, 123, 143, 157, 176, 199, 173, 56, 169, 222, 252, 63, 27, 242, + 137, 138, 253, 143, 4, 209, 124, 86, 243, 170, 152, 121, 231, 24, 238, 35, + 113, 27, 205, 59, 153, 161, 234, 65, 153, 237, 97, 197, 98, 216, 129, 30, + 174, 211, 193, 167, 102, 229, 240, 198, 85, 193, 253, 73, 118, 185, 63, 3, + 227, 165, 139, 38, 109, 214, 108, 253, 48, 227, 253, 219, 1, 226, 89, 47, + 145, 86, 8, 234, 146, 159, 230, 108, 212, 111, 112, 129, 121, 28, 164, 105, + 138, 143, 106, 132, 254, 202, 177, 171, 123, 38, 162, 112, 97, 88, 221, 95, + 5, 161, 222, 76, 234, 253, 239, 231, 13, 62, 243, 80, 164, 204, 67, 229, + 43, 103, 152, 30, 131, 240, 218, 184, 149, 161, 234, 124, 238, 126, 33, 234, + 133, 1, 201, 113, 176, 190, 231, 215, 99, 64, 219, 224, 29, 217, 23, 232, + 185, 215, 56, 14, 128, 31, 227, 227, 80, 213, 239, 224, 36, 144, 26, 243, + 36, 181, 129, 69, 104, 55, 42, 212, 27, 252, 74, 173, 196, 255, 96, 153, + 53, 3, 99, 13, 167, 244, 183, 92, 231, 140, 210, 116, 98, 36, 187, 126, + 84, 77, 144, 109, 126, 138, 53, 237, 100, 96, 209, 68, 204, 61, 104, 246, + 64, 35, 98, 99, 82, 152, 68, 118, 51, 82, 101, 136, 76, 149, 234, 135, + 110, 37, 167, 154, 17, 145, 150, 148, 89, 184, 123, 108, 255, 2, 49, 98, + 101, 125, 88, 110, 2, 146, 130, 120, 212, 249, 21, 164, 164, 161, 47, 201, + 70, 114, 46, 149, 0, 88, 142, 60, 228, 58, 181, 175, 207, 222, 199, 81, + 135, 121, 200, 205, 143, 132, 31, 93, 179, 202, 132, 84, 3, 19, 40, 190, + 99, 120, 38, 42, 165, 159, 18, 153, 99, 212, 120, 4, 237, 237, 8, 57, + 69, 228, 186, 220, 183, 121, 139, 113, 179, 200, 21, 166, 75, 19, 149, 135, + 138, 170, 149, 14, 166, 110, 94, 129, 233, 66, 187, 163, 213, 96, 172, 4, + 145, 205, 41, 25, 97, 26, 66, 99, 104, 172, 227, 73, 193, 35, 142, 228, + 202, 85, 209, 10, 77, 47, 21, 8, 14, 215, 104, 211, 62, 186, 19, 226, + 180, 187, 81, 140, 101, 188, 252, 173, 1, 242, 9, 66, 177, 73, 5, 79, + 230, 53, 67, 28, 207, 98, 199, 52, 27, 66, 153, 200, 135, 247, 246, 210, + 128, 156, 173, 249, 92, 165, 93, 112, 247, 110, 0, 133, 56, 64, 199, 71, + 135, 104, 242, 50, 218, 28, 242, 216, 223, 229, 92, 19, 39, 36, 161, 233, + 104, 205, 56, 92, 20, 44, 81, 244, 215, 85, 116, 79, 44, 104, 236, 197, + 72, 17, 157, 105, 213, 76, 90, 85, 9, 54, 76, 248, 27, 39, 175, 107, + 79, 142, 31, 140, 48, 194, 73, 214, 79, 131, 65, 191, 175, 211, 154, 225, + 182, 226, 90, 169, 178, 95, 71, 89, 3, 4, 83, 27, 152, 218, 67, 67, + 225, 90, 159, 244, 215, 227, 41, 53, 214, 40, 178, 86, 46, 92, 27, 200, + 104, 126, 203, 185, 150, 90, 220, 210, 140, 33, 238, 113, 54, 31, 121, 4, + 49, 132, 62, 250, 9, 180, 120, 241, 248, 86, 67, 254, 57, 166, 141, 34, + 165, 218, 73, 167, 166, 85, 50, 191, 136, 177, 212, 175, 133, 8, 30, 106, + 201, 100, 208, 40, 119, 107, 182, 231, 27, 237, 58, 22, 225, 63, 21, 160, + 176, 7, 223, 124, 229, 53, 246, 170, 155, 70, 75, 68, 204, 221, 146, 48, + 109, 153, 25, 0, 157, 54, 208, 220, 240, 216, 113, 30, 230, 30, 46, 139, + 116, 215, 222, 10, 247, 103, 24, 86, 125, 8, 77, 202, 39, 152, 10, 225, + 131, 18, 117, 227, 249, 127, 160, 143, 86, 128, 207, 99, 207, 224, 42, 110, + 232, 36, 86, 179, 249, 138, 84, 121, 50, 5, 149, 93, 7, 200, 115, 209, + 110, 152, 124, 77, 52, 79, 221, 157, 195, 140, 54, 19, 60, 205, 158, 199, + 127, 207, 7, 117, 11, 227, 197, 72, 199, 187, 184, 43, 95, 0, 61, 143, + 176, 207, 65, 130, 87, 82, 140, 181, 182, 184, 223, 238, 244, 209, 170, 7, + 11, 100, 83, 5, 98, 125, 26, 188, 40, 137, 242, 22, 249, 227, 184, 80, + 44, 145, 32, 143, 254, 218, 115, 107, 76, 139, 212, 87, 253, 12, 11, 121, + 216, 159, 121, 87, 182, 101, 205, 151, 5, 0, 126, 150, 6, 166, 115, 36, + 14, 128, 159, 126, 200, 42, 189, 146, 192, 223, 186, 35, 71, 224, 63, 33, + 211, 207, 93, 66, 201, 31, 66, 220, 66, 97, 107, 95, 157, 213, 92, 81, + 217, 125, 242, 101, 243, 184, 255, 155, 2, 165, 9, 143, 103, 243, 133, 173, + 202, 202, 40, 221, 73, 177, 248, 57, 243, 125, 130, 127, 102, 47, 3, 227, + 27, 203, 33, 179, 249, 117, 28, 112, 157, 0, 210, 139, 43, 15, 192, 47, + 202, 45, 132, 10, 26, 163, 47, 220, 65, 169, 225, 235, 120, 57, 25, 176, + 206, 16, 38, 110, 84, 145, 28, 43, 63, 35, 144, 234, 249, 59, 22, 152, + 16, 175, 248, 2, 6, 109, 55, 92, 124, 77, 237, 166, 207, 82, 238, 140, + 22, 30, 214, 144, 177, 182, 229, 27, 180, 150, 186, 187, 231, 184, 242, 23, + 178, 119, 36, 24, 165, 82, 15, 195, 55, 147, 107, 45, 198, 133, 194, 95, + 20, 146, 8, 222, 235, 67, 80, 119, 234, 48, 223, 163, 51, 60, 217, 228, + 171, 195, 231, 250, 46, 111, 138, 143, 1, 48, 174, 116, 197, 186, 40, 61, + 177, 53, 65, 225, 171, 95, 186, 209, 199, 254, 152, 98, 179, 71, 140, 127, + 193, 177, 171, 61, 227, 117, 130, 92, 148, 43, 199, 156, 176, 219, 52, 218, + 133, 160, 123, 11, 221, 104, 254, 253, 144, 156, 245, 5, 156, 246, 226, 198, + 222, 172, 246, 13, 35, 210, 51, 99, 203, 213, 159, 248, 139, 71, 77, 120, + 75, 195, 89, 11, 122, 125, 43, 57, 30, 233, 45, 10, 87, 102, 171, 47, + 21, 167, 175, 143, 207, 121, 98, 48, 220, 247, 72, 184, 97, 83, 152, 72, + 51, 136, 17, 52, 249, 169, 8, 140, 219, 152, 5, 221, 132, 225, 17, 117, + 28, 72, 220, 69, 199, 108, 140, 175, 206, 165, 41, 39, 77, 194, 249, 154, + 121, 23, 85, 205, 128, 34, 118, 49, 220, 85, 5, 240, 181, 26, 210, 29, + 177, 24, 132, 91, 57, 218, 74, 217, 135, 225, 148, 82, 95, 98, 54, 127, + 58, 1, 85, 12, 122, 2, 58, 81, 16, 32, 168, 153, 186, 97, 214, 81, + 176, 244, 134, 168, 111, 127, 21, 251, 227, 215, 141, 191, 141, 90, 21, 177, + 142, 172, 29, 212, 128, 163, 54, 172, 20, 35, 174, 1, 225, 232, 74, 73, + 226, 154, 236, 45, 211, 64, 28, 142, 90, 175, 147, 230, 243, 66, 160, 207, + 186, 212, 201, 34, 58, 202, 236, 9, 218, 10, 226, 189, 74, 106, 75, 43, + 93, 1, 5, 162, 36, 42, 54, 86, 83, 35, 242, 114, 165, 93, 76, 8, + 94, 21, 110, 101, 241, 119, 219, 78, 115, 182, 5, 105, 116, 73, 50, 193, + 102, 254, 43, 197, 64, 236, 6, 105, 84, 206, 79, 127, 195, 151, 106, 76, + 122, 173, 234, 203, 34, 20, 204, 34, 195, 244, 209, 60, 32, 112, 157, 150, + 185, 49, 35, 11, 41, 230, 21, 63, 137, 1, 127, 147, 193, 77, 136, 174, + 109, 122, 243, 119, 160, 26, 5, 187, 191, 90, 83, 26, 214, 237, 162, 198, + 184, 179, 204, 246, 113, 43, 145, 228, 4, 250, 28, 187, 22, 149, 121, 67, + 94, 202, 229, 64, 35, 204, 174, 106, 180, 40, 224, 146, 117, 146, 217, 9, + 29, 22, 202, 177, 96, 25, 165, 0, 97, 146, 120, 15, 29, 230, 203, 30, + 181, 73, 37, 59, 38, 156, 8, 123, 215, 252, 229, 157, 240, 58, 91, 78, + 3, 189, 39, 232, 28, 175, 195, 69, 94, 127, 176, 218, 32, 40, 236, 113, + 175, 110, 241, 181, 238, 15, 46, 106, 58, 170, 48, 58, 254, 253, 190, 204, + 172, 214, 31, 202, 150, 134, 97, 230, 224, 255, 121, 206, 110, 102, 224, 49, + 94, 248, 23, 109, 243, 23, 208, 50, 120, 155, 166, 16, 193, 8, 111, 212, + 88, 114, 163, 247, 255, 144, 18, 87, 92, 47, 60, 250, 35, 102, 101, 150, + 228, 34, 28, 18, 59, 175, 136, 120, 186, 193, 15, 151, 143, 76, 54, 96, + 157, 183, 62, 4, 245, 231, 132, 94, 131, 139, 192, 253, 72, 194, 242, 7, + 202, 19, 20, 245, 122, 114, 177, 101, 133, 107, 109, 109, 112, 151, 71, 239, + 115, 43, 157, 185, 57, 149, 27, 82, 191, 118, 114, 80, 96, 115, 166, 79, + 166, 59, 23, 91, 223, 159, 217, 68, 63, 155, 173, 200, 73, 32, 199, 233, + 241, 206, 133, 125, 89, 87, 71, 172, 91, 56, 219, 233, 115, 26, 63, 53, + 98, 209, 57, 151, 243, 141, 54, 139, 107, 120, 252, 89, 249, 133, 67, 85, + 144, 135, 86, 238, 9, 133, 115, 95, 92, 97, 212, 81, 117, 70, 225, 199, + 123, 49, 84, 16, 84, 19, 134, 156, 33, 78, 195, 79, 191, 112, 44, 206, + 81, 249, 191, 4, 106, 159, 152, 246, 185, 246, 125, 7, 186, 106, 239, 25, + 144, 121, 78, 194, 199, 195, 218, 118, 189, 66, 2, 220, 105, 0, 77, 65, + 137, 55, 169, 82, 156, 126, 146, 139, 71, 44, 247, 210, 45, 171, 110, 252, + 221, 51, 80, 157, 164, 99, 10, 241, 175, 65, 32, 180, 254, 187, 89, 223, + 231, 227, 216, 197, 99, 217, 65, 187, 235, 152, 63, 74, 176, 36, 170, 236, + 134, 46, 98, 13, 108, 160, 126, 185, 245, 100, 96, 40, 240, 69, 171, 10, + 2, 141, 57, 105, 56, 82, 168, 46, 126, 161, 5, 219, 126, 1, 1, 165, + 92, 219, 81, 202, 86, 78, 174, 209, 195, 7, 142, 244, 119, 255, 115, 242, + 220, 11, 168, 135, 5, 71, 145, 137, 108, 10, 17, 30, 178, 142, 202, 147, + 24, 141, 161, 192, 79, 54, 62, 142, 239, 66, 209, 248, 101, 134, 83, 10, + 119, 121, 22, 240, 25, 227, 60, 180, 18, 46, 164, 105, 89, 30, 196, 167, + 206, 32, 32, 76, 54, 35, 10, 210, 170, 114, 127, 0, 216, 28, 71, 6, + 216, 15, 56, 201, 194, 246, 115, 182, 231, 202, 62, 218, 93, 252, 151, 125, + 48, 231, 133, 89, 67, 175, 88, 80, 25, 208, 80, 251, 226, 12, 4, 225, + 125, 37, 78, 202, 227, 212, 179, 219, 234, 223, 207, 188, 126, 214, 22, 59, + 134, 161, 108, 10, 115, 65, 40, 68, 211, 192, 129, 64, 163, 178, 183, 164, + 98, 212, 20, 146, 25, 16, 154, 29, 176, 107, 3, 15, 62, 226, 67, 119, + 189, 45, 123, 187, 83, 222, 206, 56, 135, 242, 121, 61, 220, 133, 171, 150, + 139, 221, 69, 112, 13, 183, 180, 76, 97, 122, 168, 79, 203, 136, 62, 161, + 138, 40, 253, 182, 3, 51, 229, 58, 195, 79, 191, 203, 248, 191, 180, 101, + 40, 189, 22, 127, 67, 139, 219, 213, 78, 11, 67, 215, 82, 41, 107, 54, + 143, 72, 223, 89, 246, 156, 91, 11, 157, 16, 225, 237, 213, 148, 187, 201, + 233, 101, 70, 211, 201, 113, 164, 185, 140, 169, 130, 42, 1, 222, 92, 59, + 66, 17, 108, 67, 197, 192, 251, 55, 203, 109, 189, 230, 131, 237, 215, 241, + 65, 148, 253, 241, 39, 141, 155, 148, 156, 244, 12, 68, 71, 109, 235, 241, + 4, 161, 177, 218, 114, 173, 113, 146, 11, 3, 219, 33, 141, 215, 62, 45, + 215, 184, 196, 97, 162, 250, 218, 110, 1, 190, 8, 67, 241, 94, 82, 196, + 64, 85, 118, 139, 240, 71, 67, 49, 241, 49, 129, 247, 44, 211, 46, 227, + 115, 140, 123, 192, 63, 82, 9, 155, 83, 167, 250, 70, 61, 66, 186, 217, + 46, 155, 128, 255, 232, 56, 224, 32, 254, 12, 204, 2, 85, 173, 20, 75, + 214, 73, 229, 18, 247, 145, 83, 241, 20, 245, 155, 15, 92, 111, 180, 101, + 179, 246, 5, 243, 112, 196, 44, 146, 16, 128, 155, 80, 106, 147, 110, 87, + 96, 17, 243, 247, 21, 87, 149, 78, 248, 20, 153, 249, 196, 11, 177, 96, + 227, 185, 136, 7, 244, 54, 177, 91, 192, 193, 111, 21, 159, 105, 143, 236, + 167, 215, 244, 121, 207, 245, 202, 161, 215, 45, 233, 32, 123, 220, 57, 34, + 171, 115, 37, 163, 75, 253, 140, 232, 51, 143, 204, 252, 146, 168, 85, 148, + 201, 161, 181, 231, 125, 44, 172, 79, 210, 12, 147, 82, 38, 254, 157, 225, + 167, 230, 182, 123, 63, 141, 146, 152, 136, 190, 80, 156, 163, 231, 33, 184, + 58, 200, 134, 28, 70, 202, 88, 195, 39, 224, 159, 154, 206, 183, 11, 96, + 102, 136, 26, 238, 179, 189, 226, 18, 30, 188, 148, 25, 3, 252, 154, 142, + 147, 145, 126, 11, 55, 1, 3, 108, 144, 55, 251, 167, 54, 127, 180, 216, + 77, 70, 138, 95, 166, 90, 48, 2, 211, 236, 235, 131, 107, 251, 91, 238, + 255, 0, 113, 41, 243, 14, 241, 252, 163, 99, 74, 25, 172, 87, 125, 36, + 203, 96, 189, 125, 222, 165, 138, 25, 76, 136, 67, 137, 161, 22, 232, 31, + 5, 96, 146, 214, 146, 21, 181, 198, 199, 34, 190, 63, 191, 201, 104, 116, + 123, 201, 64, 128, 84, 139, 86, 102, 244, 241, 162, 126, 4, 9, 132, 2, + 53, 113, 21, 1, 95, 7, 212, 123, 252, 100, 87, 78, 71, 28, 131, 135, + 183, 72, 196, 33, 66, 237, 12, 135, 58, 102, 69, 234, 214, 244, 57, 44, + 181, 120, 156, 218, 99, 146, 97, 15, 77, 113, 179, 142, 113, 226, 38, 72, + 128, 211, 160, 95, 52, 181, 30, 200, 64, 234, 8, 229, 150, 219, 225, 30, + 162, 223, 52, 242, 29, 31, 226, 91, 102, 235, 127, 213, 105, 123, 11, 172, + 190, 152, 59, 69, 1, 253, 126, 19, 145, 99, 33, 26, 198, 80, 74, 47, + 59, 77, 158, 60, 231, 51, 65, 145, 210, 232, 71, 100, 73, 71, 176, 239, + 42, 124, 176, 31, 254, 64, 223, 51, 195, 108, 165, 78, 202, 174, 212, 32, + 157, 58, 145, 133, 84, 230, 17, 206, 107, 72, 89, 129, 240, 179, 56, 231, + 218, 55, 236, 231, 122, 137, 50, 245, 171, 107, 223, 86, 17, 155, 68, 241, + 220, 120, 38, 95, 74, 110, 214, 202, 223, 60, 35, 120, 33, 79, 32, 58, + 77, 28, 121, 180, 99, 64, 201, 81, 156, 37, 28, 254, 219, 153, 74, 200, + 178, 70, 252, 140, 137, 127, 195, 238, 103, 228, 44, 96, 216, 12, 198, 246, + 206, 130, 67, 71, 129, 114, 145, 168, 64, 145, 128, 169, 169, 11, 28, 145, + 64, 144, 92, 206, 171, 135, 128, 121, 84, 142, 75, 37, 199, 208, 97, 243, + 114, 58, 152, 244, 201, 119, 76, 178, 3, 128, 185, 252, 146, 38, 165, 53, + 186, 175, 102, 81, 233, 115, 190, 227, 19, 31, 134, 132, 114, 24, 2, 21, + 249, 228, 128, 74, 119, 144, 74, 43, 168, 201, 131, 175, 254, 42, 103, 23, + 94, 138, 61, 40, 129, 252, 51, 80, 150, 135, 133, 55, 54, 122, 187, 93, + 42, 9, 154, 50, 93, 143, 241, 26, 80, 108, 7, 51, 144, 218, 129, 48, + 168, 66, 150, 108, 86, 127, 156, 232, 5, 54, 7, 182, 73, 210, 46, 115, + 84, 145, 113, 254, 195, 166, 106, 119, 116, 233, 154, 170, 185, 255, 99, 223, + 133, 115, 122, 10, 210, 76, 123, 92, 28, 159, 138, 133, 70, 126, 240, 215, + 36, 119, 180, 221, 156, 46, 89, 71, 1, 175, 247, 102, 107, 67, 136, 62, + 142, 197, 212, 50, 159, 107, 254, 44, 30, 59, 234, 51, 55, 35, 103, 170, + 231, 41, 111, 178, 14, 27, 77, 40, 43, 88, 199, 148, 211, 140, 17, 59, + 84, 182, 195, 92, 230, 109, 218, 165, 117, 39, 234, 195, 94, 70, 151, 202, + 167, 17, 179, 205, 213, 68, 102, 11, 120, 210, 150, 47, 150, 115, 186, 81, + 137, 53, 132, 36, 224, 107, 115, 100, 143, 118, 212, 239, 176, 139, 243, 36, + 235, 189, 48, 43, 25, 130, 143, 2, 165, 117, 173, 63, 189, 86, 180, 83, + 22, 204, 226, 141, 78, 199, 226, 195, 94, 183, 88, 103, 180, 205, 96, 254, + 235, 65, 144, 231, 11, 193, 111, 52, 129, 110, 125, 68, 42, 234, 138, 118, + 112, 69, 178, 191, 213, 115, 230, 221, 222, 97, 60, 187, 154, 161, 24, 25, + 147, 205, 69, 47, 45, 241, 84, 238, 249, 129, 6, 107, 126, 245, 187, 62, + 247, 159, 178, 6, 100, 80, 244, 229, 53, 83, 186, 208, 116, 164, 83, 217, + 76, 21, 191, 207, 44, 19, 21, 253, 153, 84, 92, 96, 41, 9, 10, 187, + 82, 155, 222, 146, 71, 130, 217, 44, 75, 51, 56, 119, 4, 77, 141, 46, + 0, 97, 157, 176, 42, 30, 102, 41, 39, 48, 191, 201, 226, 156, 80, 24, + 28, 109, 150, 215, 254, 211, 17, 87, 114, 111, 250, 7, 60, 233, 55, 121, + 139, 121, 167, 213, 0, 106, 85, 183, 122, 254, 65, 52, 95, 129, 197, 156, + 125, 235, 47, 46, 191, 44, 139, 244, 217, 239, 216, 228, 14, 234, 216, 19, + 13, 124, 221, 166, 60, 124, 187, 83, 242, 154, 57, 182, 125, 172, 123, 100, + 165, 156, 196, 254, 19, 73, 234, 83, 209, 242, 17, 54, 12, 115, 163, 148, + 32, 146, 41, 86, 171, 11, 77, 71, 162, 203, 42, 153, 71, 217, 254, 31, + 214, 184, 58, 41, 245, 132, 249, 54, 172, 163, 225, 203, 205, 52, 64, 105, + 110, 128, 162, 176, 118, 243, 173, 173, 69, 11, 98, 19, 183, 83, 247, 5, + 137, 91, 192, 122, 15, 151, 125, 192, 220, 207, 6, 118, 84, 8, 86, 196, + 88, 59, 246, 8, 250, 10, 27, 7, 233, 225, 220, 213, 222, 239, 138, 177, + 173, 63, 58, 16, 68, 113, 218, 216, 24, 25, 147, 176, 232, 249, 135, 194, + 5, 26, 37, 110, 251, 13, 178, 55, 28, 116, 84, 162, 145, 153, 117, 194, + 41, 16, 179, 64, 121, 52, 127, 232, 232, 53, 135, 212, 72, 122, 32, 112, + 152, 10, 241, 217, 107, 3, 99, 91, 115, 88, 107, 146, 120, 22, 156, 153, + 68, 104, 212, 39, 76, 144, 54, 58, 61, 91, 212, 96, 139, 35, 184, 37, + 17, 55, 223, 15, 75, 18, 55, 124, 232, 21, 10, 147, 24, 221, 23, 87, + 186, 27, 152, 51, 247, 112, 63, 56, 89, 180, 195, 67, 89, 105, 236, 102, + 235, 57, 17, 45, 151, 91, 186, 224, 171, 11, 149, 111, 102, 149, 50, 144, + 250, 243, 179, 20, 251, 203, 229, 228, 190, 33, 209, 254, 237, 112, 60, 222, + 179, 19, 224, 4, 78, 246, 239, 248, 80, 169, 180, 71, 190, 29, 178, 253, + 130, 207, 77, 202, 16, 108, 142, 201, 238, 135, 247, 155, 237, 187, 243, 139, + 247, 21, 141, 125, 213, 34, 106, 183, 4, 125, 40, 8, 104, 128, 73, 121, + 163, 122, 190, 121, 152, 45, 174, 52, 181, 139, 254, 242, 146, 36, 163, 183, + 147, 27, 234, 160, 222, 93, 232, 251, 153, 185, 158, 215, 9, 86, 49, 72, + 87, 154, 88, 169, 82, 186, 198, 240, 104, 92, 129, 217, 12, 124, 113, 206, + 117, 116, 149, 159, 149, 124, 219, 138, 96, 50, 177, 145, 244, 8, 232, 218, + 158, 22, 70, 31, 52, 226, 90, 7, 187, 135, 66, 35, 193, 62, 122, 72, + 201, 100, 66, 137, 236, 158, 187, 195, 107, 234, 27, 155, 187, 221, 131, 2, + 167, 165, 18, 225, 67, 72, 190, 63, 136, 69, 32, 185, 181, 234, 159, 57, + 4, 101, 127, 121, 3, 2, 235, 220, 44, 245, 160, 71, 64, 175, 55, 135, + 83, 250, 217, 239, 121, 81, 181, 160, 151, 70, 56, 101, 74, 169, 142, 167, + 10, 179, 233, 140, 156, 203, 110, 15, 95, 15, 8, 169, 164, 40, 43, 50, + 148, 216, 167, 161, 36, 142, 145, 126, 236, 167, 154, 120, 110, 239, 138, 53, + 152, 233, 115, 33, 203, 253, 249, 174, 176, 43, 0, 178, 120, 133, 211, 252, + 95, 221, 221, 185, 36, 145, 53, 15, 125, 26, 232, 42, 249, 86, 8, 205, + 183, 114, 81, 62, 187, 162, 4, 251, 26, 79, 159, 156, 42, 7, 83, 97, + 14, 124, 38, 252, 215, 34, 141, 252, 226, 61, 237, 252, 114, 117, 187, 21, + 53, 236, 151, 9, 147, 40, 68, 63, 10, 166, 84, 236, 0, 169, 196, 239, + 107, 214, 32, 53, 142, 172, 22, 245, 22, 154, 150, 105, 223, 5, 178, 48, + 151, 191, 251, 63, 50, 255, 54, 206, 221, 49, 249, 35, 133, 197, 248, 47, + 155, 185, 108, 172, 179, 104, 121, 72, 25, 83, 78, 205, 136, 136, 250, 47, + 68, 179, 166, 229, 237, 212, 214, 104, 191, 88, 159, 43, 30, 168, 89, 25, + 137, 79, 142, 7, 237, 19, 230, 87, 255, 20, 182, 27, 217, 197, 80, 45, + 119, 115, 241, 181, 96, 155, 160, 62, 57, 162, 103, 171, 196, 214, 243, 194, + 41, 223, 187, 22, 4, 157, 139, 4, 98, 193, 171, 27, 217, 8, 27, 100, + 222, 30, 235, 4, 127, 97, 243, 231, 102, 37, 47, 237, 58, 79, 189, 143, + 193, 144, 0, 150, 183, 0, 100, 29, 130, 166, 233, 150, 241, 61, 175, 23, + 56, 239, 24, 59, 143, 79, 27, 23, 124, 4, 9, 207, 73, 21, 181, 227, + 80, 149, 79, 226, 85, 110, 255, 126, 11, 66, 167, 203, 91, 50, 255, 189, + 91, 50, 79, 115, 160, 201, 112, 13, 25, 100, 68, 8, 218, 253, 185, 90, + 85, 79, 74, 27, 123, 23, 229, 57, 97, 91, 127, 106, 189, 186, 213, 74, + 233, 11, 137, 181, 51, 79, 108, 16, 145, 67, 82, 93, 245, 199, 182, 112, + 114, 208, 100, 151, 117, 222, 34, 187, 232, 137, 114, 251, 117, 217, 153, 37, + 215, 22, 113, 249, 198, 21, 184, 245, 107, 107, 27, 224, 2, 158, 165, 155, + 155, 104, 108, 215, 105, 154, 76, 171, 175, 245, 245, 206, 227, 85, 231, 208, + 127, 196, 191, 48, 150, 44, 38, 194, 191, 59, 10, 10, 175, 148, 162, 163, + 122, 167, 207, 145, 105, 234, 57, 199, 40, 112, 205, 98, 242, 238, 38, 68, + 192, 158, 91, 141, 80, 54, 12, 193, 215, 8, 201, 136, 185, 229, 109, 175, + 25, 245, 209, 147, 197, 233, 17, 80, 189, 150, 49, 218, 246, 78, 30, 112, + 64, 212, 109, 75, 232, 228, 171, 102, 239, 219, 152, 158, 217, 121, 43, 174, + 99, 82, 7, 113, 222, 107, 164, 30, 205, 236, 152, 19, 157, 60, 82, 165, + 34, 117, 23, 166, 185, 209, 212, 7, 250, 32, 167, 172, 234, 117, 139, 110, + 191, 14, 44, 158, 95, 115, 126, 115, 234, 209, 174, 95, 163, 117, 243, 203, + 182, 113, 182, 4, 33, 100, 143, 45, 225, 128, 69, 73, 183, 246, 91, 28, + 57, 20, 1, 175, 125, 128, 38, 4, 54, 93, 255, 28, 106, 122, 42, 104, + 35, 79, 242, 117, 75, 237, 149, 28, 178, 84, 224, 183, 116, 254, 120, 3, + 70, 154, 8, 57, 132, 86, 14, 119, 4, 130, 3, 155, 233, 177, 27, 28, + 233, 148, 205, 109, 29, 39, 33, 0, 160, 214, 129, 207, 180, 227, 131, 109, + 29, 136, 60, 47, 234, 99, 52, 57, 228, 87, 114, 138, 185, 19, 148, 152, + 114, 48, 12, 231, 182, 67, 228, 94, 253, 199, 34, 171, 238, 77, 59, 83, + 128, 137, 52, 74, 35, 236, 38, 181, 165, 106, 161, 12, 100, 76, 100, 237, + 69, 13, 211, 210, 117, 185, 178, 17, 231, 85, 134, 101, 66, 9, 71, 42, + 88, 125, 183, 106, 217, 38, 175, 131, 139, 75, 163, 134, 149, 70, 120, 146, + 156, 196, 151, 154, 242, 232, 163, 33, 206, 179, 123, 102, 249, 28, 11, 115, + 88, 20, 192, 244, 74, 33, 165, 176, 215, 142, 87, 229, 188, 139, 225, 192, + 111, 203, 55, 25, 241, 218, 22, 119, 121, 89, 69, 116, 214, 254, 94, 137, + 253, 168, 156, 155, 34, 150, 56, 126, 229, 79, 49, 150, 109, 99, 194, 179, + 40, 114, 63, 220, 161, 254, 73, 154, 211, 245, 21, 255, 63, 209, 45, 135, + 86, 234, 184, 213, 95, 28, 28, 244, 42, 66, 200, 83, 190, 81, 247, 24, + 153, 129, 180, 45, 159, 132, 4, 187, 171, 88, 178, 140, 143, 60, 212, 187, + 102, 125, 212, 66, 85, 133, 248, 58, 240, 126, 196, 7, 68, 71, 137, 202, + 116, 79, 137, 229, 156, 122, 69, 94, 146, 226, 198, 191, 116, 96, 33, 50, + 189, 32, 4, 5, 92, 116, 29, 122, 137, 140, 42, 199, 138, 59, 38, 48, + 178, 115, 216, 201, 225, 170, 183, 55, 248, 151, 58, 187, 184, 152, 106, 130, + 176, 52, 36, 73, 99, 77, 12, 166, 238, 52, 231, 86, 144, 91, 2, 248, + 246, 127, 5, 182, 201, 149, 205, 246, 73, 158, 98, 4, 20, 138, 51, 176, + 71, 169, 209, 237, 230, 100, 244, 243, 107, 80, 113, 246, 233, 115, 26, 175, + 72, 11, 38, 165, 68, 108, 163, 27, 38, 43, 246, 18, 153, 208, 118, 235, + 201, 225, 235, 17, 65, 53, 173, 72, 230, 232, 105, 215, 41, 180, 191, 61, + 31, 28, 214, 219, 29, 209, 90, 206, 232, 80, 22, 101, 237, 61, 105, 128, + 249, 224, 23, 242, 8, 250, 190, 130, 207, 148, 102, 166, 241, 67, 58, 8, + 61, 43, 58, 21, 148, 188, 40, 139, 116, 11, 79, 186, 85, 9, 240, 164, + 117, 238, 157, 59, 244, 184, 250, 69, 143, 88, 147, 126, 237, 37, 6, 159, + 130, 18, 72, 138, 251, 58, 136, 155, 92, 42, 173, 253, 171, 166, 57, 160, + 162, 211, 173, 241, 66, 121, 37, 176, 180, 140, 117, 240, 132, 181, 16, 234, + 173, 59, 98, 9, 123, 31, 18, 165, 45, 182, 89, 112, 130, 79, 53, 10, + 120, 252, 52, 114, 58, 57, 146, 87, 222, 154, 231, 215, 219, 84, 246, 85, + 57, 206, 180, 66, 125, 212, 226, 45, 212, 74, 132, 27, 185, 34, 150, 235, + 119, 218, 77, 70, 235, 171, 112, 123, 174, 87, 160, 89, 86, 219, 3, 47, + 39, 240, 116, 102, 70, 107, 31, 55, 102, 167, 4, 101, 119, 146, 176, 237, + 168, 123, 84, 118, 218, 112, 118, 52, 18, 56, 120, 216, 66, 187, 31, 12, + 205, 53, 119, 26, 225, 215, 195, 226, 2, 201, 75, 105, 65, 81, 45, 239, + 114, 182, 155, 135, 95, 153, 240, 143, 109, 109, 219, 218, 224, 26, 175, 35, + 86, 128, 209, 255, 71, 26, 86, 115, 22, 70, 167, 3, 105, 128, 160, 142, + 163, 149, 168, 112, 8, 12, 14, 119, 65, 43, 183, 105, 197, 156, 207, 226, + 231, 239, 48, 62, 4, 49, 169, 234, 123, 26, 164, 98, 119, 33, 170, 43, + 39, 6, 128, 15, 217, 209, 229, 109, 240, 180, 150, 169, 252, 118, 242, 240, + 108, 204, 24, 107, 199, 108, 184, 110, 208, 52, 175, 245, 241, 123, 90, 123, + 150, 211, 56, 75, 247, 140, 187, 53, 172, 174, 90, 223, 117, 128, 254, 97, + 235, 170, 193, 190, 34, 215, 109, 18, 109, 13, 118, 134, 45, 22, 100, 73, + 141, 199, 203, 124, 169, 191, 102, 108, 250, 201, 188, 39, 236, 74, 154, 159, + 170, 137, 69, 63, 82, 44, 177, 240, 178, 157, 53, 89, 6, 99, 5, 13, + 134, 169, 195, 121, 229, 179, 212, 123, 198, 131, 96, 250, 187, 94, 106, 51, + 219, 16, 147, 227, 108, 124, 240, 237, 172, 43, 83, 157, 124, 246, 118, 249, + 175, 43, 235, 221, 18, 24, 166, 127, 255, 210, 199, 57, 134, 73, 141, 254, + 219, 209, 19, 217, 36, 25, 104, 225, 133, 24, 3, 130, 62, 103, 148, 212, + 243, 122, 52, 213, 102, 26, 144, 227, 189, 143, 151, 230, 98, 87, 214, 147, + 110, 31, 43, 248, 142, 126, 199, 95, 170, 186, 67, 225, 208, 49, 50, 159, + 108, 174, 152, 118, 43, 193, 187, 13, 63, 141, 94, 118, 113, 200, 75, 165, + 117, 247, 53, 209, 151, 163, 241, 24, 23, 252, 149, 18, 16, 77, 69, 208, + 219, 254, 159, 220, 62, 99, 26, 31, 231, 88, 150, 219, 168, 151, 178, 181, + 234, 141, 124, 130, 37, 1, 21, 195, 96, 139, 179, 136, 145, 29, 159, 213, + 248, 10, 174, 213, 22, 180, 250, 251, 30, 42, 228, 139, 178, 90, 19, 228, + 100, 120, 205, 54, 6, 189, 213, 203, 193, 43, 218, 211, 27, 93, 76, 181, + 127, 159, 43, 96, 233, 249, 118, 252, 127, 59, 67, 82, 65, 48, 100, 170, + 227, 197, 141, 49, 153, 31, 189, 176, 102, 14, 101, 152, 242, 25, 251, 47, + 242, 67, 114, 61, 184, 29, 60, 163, 186, 19, 17, 36, 42, 76, 31, 246, + 195, 224, 206, 221, 89, 69, 218, 112, 148, 98, 60, 154, 28, 199, 206, 59, + 157, 199, 18, 214, 53, 217, 211, 254, 128, 220, 189, 96, 134, 57, 73, 152, + 41, 52, 0, 93, 23, 215, 124, 209, 63, 252, 134, 64, 224, 183, 197, 94, + 46, 214, 214, 233, 202, 211, 155, 236, 31, 238, 220, 132, 54, 88, 122, 140, + 146, 11, 88, 164, 238, 156, 72, 239, 225, 82, 157, 144, 27, 240, 5, 231, + 89, 25, 63, 50, 227, 219, 3, 5, 218, 125, 13, 151, 59, 40, 162, 211, + 79, 33, 157, 76, 245, 55, 229, 140, 88, 50, 221, 42, 52, 162, 106, 212, + 125, 187, 254, 0, 126, 156, 98, 149, 35, 94, 247, 215, 131, 86, 116, 176, + 3, 56, 30, 26, 138, 113, 71, 255, 77, 143, 52, 111, 20, 113, 47, 88, + 104, 110, 225, 164, 226, 8, 74, 180, 182, 183, 206, 215, 84, 12, 46, 61, + 177, 168, 102, 244, 93, 199, 243, 247, 214, 227, 131, 185, 103, 131, 49, 3, + 49, 18, 74, 111, 249, 150, 2, 113, 165, 221, 7, 93, 110, 59, 242, 246, + 243, 168, 45, 182, 45, 140, 19, 41, 72, 10, 164, 190, 17, 174, 216, 36, + 216, 3, 1, 198, 230, 150, 19, 0, 114, 10, 75, 166, 138, 161, 0, 113, + 132, 128, 116, 201, 147, 42, 63, 211, 56, 195, 45, 125, 69, 55, 177, 149, + 228, 7, 78, 217, 133, 35, 108, 182, 210, 185, 124, 187, 167, 95, 246, 202, + 121, 167, 61, 61, 239, 37, 153, 143, 109, 126, 42, 69, 174, 253, 132, 161, + 118, 14, 10, 7, 141, 92, 188, 60, 81, 174, 93, 28, 58, 223, 217, 119, + 84, 213, 230, 132, 248, 31, 47, 141, 88, 249, 28, 205, 19, 5, 183, 167, + 88, 177, 66, 242, 50, 66, 255, 31, 218, 182, 209, 12, 246, 151, 87, 252, + 211, 231, 32, 120, 95, 76, 180, 20, 124, 238, 190, 60, 165, 239, 207, 37, + 221, 115, 145, 126, 61, 51, 141, 54, 64, 219, 247, 164, 74, 19, 7, 93, + 27, 150, 115, 224, 228, 172, 232, 113, 6, 148, 40, 229, 228, 32, 17, 92, + 215, 75, 64, 50, 235, 127, 109, 127, 152, 99, 73, 55, 210, 245, 55, 37, + 236, 244, 136, 154, 177, 231, 119, 30, 187, 225, 83, 240, 237, 183, 80, 245, + 10, 129, 181, 156, 137, 27, 79, 97, 145, 78, 100, 127, 79, 224, 218, 244, + 49, 70, 225, 131, 138, 102, 32, 110, 123, 110, 49, 161, 246, 27, 99, 115, + 171, 159, 45, 44, 15, 108, 51, 173, 24, 4, 170, 76, 255, 41, 27, 0, + 27, 35, 61, 145, 246, 241, 138, 152, 47, 51, 2, 153, 171, 79, 81, 176, + 123, 63, 192, 74, 27, 243, 22, 51, 86, 243, 48, 24, 129, 162, 69, 218, + 102, 143, 135, 107, 52, 182, 189, 25, 142, 206, 227, 144, 140, 57, 124, 252, + 97, 157, 61, 55, 43, 76, 52, 197, 146, 154, 83, 0, 150, 16, 85, 76, + 230, 32, 23, 86, 31, 241, 251, 88, 183, 195, 242, 192, 181, 160, 229, 185, + 229, 186, 72, 219, 249, 142, 111, 178, 42, 163, 117, 93, 31, 171, 161, 227, + 194, 51, 36, 53, 116, 0, 233, 37, 150, 128, 144, 8, 168, 198, 68, 35, + 57, 148, 64, 207, 148, 64, 213, 174, 223, 174, 129, 171, 81, 132, 1, 90, + 208, 100, 105, 209, 10, 209, 228, 138, 169, 82, 197, 37, 172, 32, 222, 70, + 180, 78, 59, 234, 106, 250, 76, 237, 59, 173, 178, 212, 151, 107, 131, 245, + 14, 218, 71, 56, 187, 138, 74, 101, 15, 32, 18, 131, 21, 57, 6, 32, + 115, 75, 244, 119, 168, 158, 154, 147, 72, 143, 232, 51, 49, 181, 115, 27, + 96, 141, 93, 202, 36, 38, 23, 61, 150, 171, 239, 66, 13, 183, 126, 24, + 99, 175, 110, 189, 88, 170, 252, 139, 127, 179, 106, 243, 140, 208, 243, 110, + 145, 64, 161, 4, 191, 209, 211, 72, 135, 24, 121, 210, 109, 42, 134, 9, + 160, 241, 186, 161, 203, 85, 212, 3, 23, 228, 75, 147, 133, 9, 100, 65, + 195, 165, 252, 229, 177, 199, 170, 63, 194, 247, 76, 171, 66, 203, 193, 3, + 74, 91, 86, 31, 85, 185, 52, 27, 175, 175, 84, 137, 51, 233, 26, 52, + 16, 75, 185, 95, 35, 167, 251, 67, 83, 217, 9, 241, 43, 252, 76, 242, + 101, 115, 133, 173, 154, 251, 33, 116, 118, 243, 152, 63, 173, 153, 63, 75, + 90, 106, 203, 197, 141, 149, 127, 9, 133, 218, 223, 193, 62, 19, 48, 231, + 45, 146, 21, 164, 1, 42, 43, 187, 75, 88, 20, 39, 233, 165, 20, 76, + 26, 145, 226, 155, 106, 187, 26, 195, 23, 212, 49, 60, 145, 149, 37, 167, + 73, 106, 203, 228, 185, 223, 108, 12, 187, 239, 88, 126, 27, 154, 235, 203, + 207, 187, 1, 114, 12, 112, 238, 17, 185, 120, 227, 177, 242, 191, 10, 18, + 241, 143, 21, 239, 31, 150, 102, 60, 15, 167, 209, 64, 117, 237, 45, 45, + 217, 147, 32, 28, 98, 221, 12, 20, 2, 176, 213, 147, 95, 31, 176, 64, + 237, 55, 53, 44, 105, 249, 43, 111, 73, 162, 180, 4, 62, 66, 118, 36, + 215, 254, 183, 249, 170, 39, 21, 69, 147, 65, 105, 136, 232, 160, 174, 141, + 84, 222, 189, 33, 250, 197, 226, 170, 246, 127, 87, 25, 10, 181, 46, 151, + 216, 250, 227, 131, 115, 64, 217, 11, 190, 199, 122, 148, 242, 221, 46, 169, + 45, 54, 9, 90, 251, 94, 61, 211, 30, 67, 199, 115, 204, 4, 199, 203, + 109, 137, 60, 223, 206, 3, 144, 170, 215, 224, 72, 247, 128, 64, 147, 140, + 223, 125, 20, 67, 248, 253, 206, 5, 44, 72, 160, 33, 20, 166, 80, 123, + 194, 220, 16, 134, 206, 24, 66, 217, 177, 231, 223, 66, 251, 253, 235, 180, + 36, 205, 107, 173, 198, 108, 83, 120, 82, 128, 120, 245, 67, 23, 248, 203, + 28, 14, 75, 235, 117, 111, 34, 127, 39, 52, 169, 101, 28, 144, 123, 20, + 197, 116, 96, 141, 201, 246, 61, 101, 132, 127, 98, 178, 186, 139, 226, 132, + 55, 229, 116, 75, 43, 241, 119, 139, 104, 169, 215, 199, 226, 113, 178, 214, + 153, 159, 139, 208, 106, 136, 77, 149, 72, 248, 49, 179, 98, 110, 192, 105, + 128, 27, 245, 36, 215, 210, 187, 98, 45, 92, 51, 238, 57, 153, 113, 21, + 86, 147, 122, 138, 3, 70, 66, 84, 135, 96, 199, 23, 123, 105, 226, 81, + 171, 23, 228, 73, 234, 240, 50, 135, 108, 143, 140, 247, 26, 245, 43, 94, + 183, 180, 240, 235, 159, 127, 57, 119, 6, 34, 58, 112, 170, 62, 37, 57, + 171, 56, 223, 147, 98, 204, 183, 146, 154, 85, 172, 49, 76, 84, 231, 138, + 117, 46, 81, 57, 240, 43, 102, 130, 234, 208, 237, 88, 164, 124, 128, 104, + 167, 38, 88, 73, 7, 131, 234, 67, 4, 213, 8, 211, 84, 81, 197, 133, + 123, 247, 254, 101, 230, 68, 245, 220, 193, 152, 208, 91, 63, 109, 228, 184, + 117, 28, 114, 146, 98, 142, 195, 4, 139, 48, 186, 242, 211, 124, 175, 224, + 69, 38, 35, 14, 253, 245, 242, 184, 138, 4, 206, 221, 15, 125, 189, 97, + 127, 46, 212, 10, 55, 1, 69, 56, 31, 180, 245, 93, 175, 58, 220, 3, + 164, 88, 22, 74, 157, 113, 246, 189, 65, 97, 235, 189, 126, 106, 50, 120, + 180, 71, 120, 11, 200, 48, 19, 57, 236, 64, 234, 180, 243, 32, 228, 127, + 228, 253, 42, 20, 238, 109, 161, 67, 73, 52, 35, 126, 197, 5, 117, 12, + 86, 215, 168, 60, 159, 4, 74, 193, 92, 104, 190, 30, 185, 187, 153, 208, + 87, 245, 62, 200, 16, 204, 189, 141, 188, 226, 187, 144, 101, 51, 86, 204, + 26, 22, 246, 230, 176, 81, 195, 19, 126, 58, 91, 30, 204, 178, 248, 217, + 81, 155, 68, 145, 42, 9, 22, 68, 22, 107, 25, 86, 153, 225, 224, 143, + 128, 94, 164, 65, 168, 173, 178, 181, 97, 100, 159, 212, 164, 213, 75, 25, + 35, 225, 133, 5, 243, 65, 39, 158, 155, 153, 3, 81, 53, 165, 153, 52, + 237, 226, 122, 245, 248, 255, 60, 13, 2, 41, 202, 232, 184, 57, 152, 133, + 105, 159, 33, 220, 49, 135, 76, 198, 212, 70, 168, 43, 233, 168, 180, 88, + 139, 246, 219, 120, 12, 161, 238, 88, 228, 9, 77, 236, 129, 227, 73, 91, + 104, 222, 104, 205, 28, 140, 205, 167, 178, 222, 150, 197, 139, 205, 66, 245, + 48, 241, 80, 225, 218, 27, 159, 205, 64, 148, 107, 54, 46, 190, 61, 0, + 161, 228, 124, 123, 18, 170, 35, 46, 53, 61, 171, 154, 121, 253, 187, 158, + 102, 194, 132, 94, 49, 239, 86, 57, 205, 129, 185, 234, 50, 56, 219, 36, + 56, 77, 247, 160, 75, 239, 154, 122, 34, 34, 143, 66, 53, 20, 212, 246, + 3, 79, 229, 119, 50, 132, 221, 187, 208, 82, 149, 183, 151, 200, 181, 97, + 12, 4, 136, 233, 171, 247, 128, 211, 234, 122, 152, 140, 221, 82, 83, 98, + 185, 95, 122, 23, 120, 124, 112, 240, 39, 16, 49, 140, 225, 135, 88, 69, + 96, 125, 246, 99, 224, 165, 148, 178, 35, 63, 192, 217, 39, 153, 63, 32, + 109, 142, 224, 12, 132, 10, 55, 49, 140, 217, 141, 113, 10, 72, 92, 37, + 121, 96, 72, 35, 184, 70, 156, 225, 140, 110, 150, 24, 95, 209, 172, 140, + 187, 10, 154, 58, 113, 215, 254, 36, 101, 155, 5, 46, 249, 59, 238, 164, + 25, 212, 35, 5, 87, 45, 183, 124, 174, 6, 182, 241, 206, 128, 118, 190, + 239, 160, 140, 2, 149, 90, 185, 125, 192, 8, 75, 105, 184, 51, 2, 11, + 198, 85, 249, 100, 88, 73, 229, 189, 80, 81, 244, 167, 62, 110, 52, 13, + 254, 122, 144, 170, 206, 64, 239, 191, 0, 73, 235, 143, 120, 81, 33, 87, + 83, 154, 156, 163, 31, 172, 104, 196, 78, 144, 100, 3, 54, 202, 67, 177, + 217, 80, 207, 235, 48, 12, 127, 78, 116, 96, 238, 226, 97, 154, 97, 120, + 19, 33, 89, 14, 160, 149, 243, 246, 196, 219, 74, 113, 225, 92, 32, 216, + 10, 50, 176, 127, 113, 63, 157, 143, 190, 245, 94, 244, 103, 85, 143, 162, + 61, 177, 203, 240, 204, 55, 183, 226, 251, 205, 53, 25, 19, 197, 160, 34, + 42, 128, 169, 80, 11, 210, 133, 105, 128, 175, 107, 72, 222, 130, 95, 209, + 93, 161, 16, 35, 244, 178, 236, 100, 20, 129, 190, 118, 246, 108, 68, 206, + 105, 58, 91, 90, 149, 0, 168, 95, 115, 63, 54, 240, 7, 164, 186, 100, + 76, 81, 225, 58, 178, 14, 46, 79, 31, 226, 180, 34, 164, 191, 84, 22, + 244, 90, 105, 13, 83, 133, 230, 81, 45, 49, 157, 84, 22, 168, 167, 205, + 219, 123, 209, 80, 87, 205, 180, 152, 162, 225, 229, 142, 72, 250, 240, 134, + 185, 145, 112, 149, 25, 185, 198, 174, 213, 83, 145, 151, 228, 138, 96, 152, + 242, 251, 227, 53, 229, 136, 37, 147, 184, 141, 104, 221, 51, 219, 21, 93, + 42, 253, 183, 57, 203, 92, 7, 240, 82, 171, 103, 167, 115, 233, 175, 142, + 8, 112, 10, 56, 44, 192, 231, 79, 18, 8, 68, 128, 106, 121, 225, 149, + 30, 210, 173, 86, 240, 30, 138, 197, 89, 213, 63, 161, 106, 65, 141, 57, + 96, 102, 191, 28, 56, 9, 201, 3, 248, 113, 118, 51, 121, 247, 83, 135, + 51, 54, 14, 19, 49, 175, 59, 206, 112, 172, 155, 243, 75, 19, 154, 102, + 188, 11, 76, 198, 136, 11, 44, 154, 139, 48, 34, 194, 116, 170, 198, 127, + 132, 231, 200, 44, 61, 210, 93, 20, 159, 201, 183, 39, 78, 178, 225, 112, + 50, 254, 198, 200, 207, 18, 196, 209, 222, 252, 67, 56, 186, 71, 24, 210, + 30, 105, 32, 102, 99, 239, 195, 191, 131, 246, 65, 121, 91, 66, 112, 28, + 170, 67, 28, 144, 187, 46, 117, 97, 187, 240, 250, 118, 249, 68, 151, 248, + 219, 208, 103, 242, 166, 122, 220, 59, 50, 215, 90, 160, 15, 15, 96, 89, + 167, 87, 22, 253, 137, 202, 126, 145, 162, 171, 97, 181, 102, 50, 107, 230, + 31, 183, 133, 105, 23, 233, 228, 13, 247, 169, 79, 53, 76, 138, 29, 51, + 53, 221, 126, 199, 47, 153, 184, 183, 198, 109, 192, 203, 178, 26, 115, 177, + 118, 158, 181, 43, 48, 174, 195, 253, 43, 18, 172, 171, 101, 129, 255, 63, + 41, 49, 160, 15, 86, 108, 235, 87, 115, 36, 93, 46, 164, 152, 49, 31, + 137, 125, 174, 115, 196, 240, 117, 226, 183, 151, 73, 30, 75, 59, 61, 160, + 96, 157, 215, 246, 160, 136, 82, 95, 181, 13, 207, 158, 106, 81, 18, 27, + 182, 35, 249, 72, 148, 128, 15, 82, 68, 197, 0, 159, 149, 239, 34, 250, + 171, 70, 200, 219, 214, 18, 134, 14, 71, 69, 219, 145, 208, 125, 65, 232, + 201, 212, 148, 39, 208, 142, 54, 38, 32, 154, 124, 35, 76, 173, 240, 232, + 23, 74, 183, 118, 137, 244, 180, 149, 195, 198, 105, 25, 246, 236, 155, 88, + 230, 134, 32, 126, 183, 72, 127, 129, 139, 161, 224, 222, 127, 107, 201, 78, + 227, 207, 10, 48, 9, 199, 240, 176, 49, 165, 95, 200, 101, 89, 40, 229, + 28, 8, 41, 193, 173, 218, 63, 229, 216, 170, 82, 90, 162, 243, 0, 125, + 248, 79, 186, 228, 44, 197, 178, 58, 196, 251, 85, 19, 254, 130, 110, 78, + 91, 217, 146, 16, 90, 221, 6, 129, 173, 73, 56, 77, 72, 19, 8, 14, + 129, 84, 19, 88, 146, 252, 137, 165, 222, 7, 199, 107, 135, 13, 253, 137, + 180, 184, 240, 37, 238, 133, 135, 80, 170, 172, 60, 80, 94, 130, 246, 166, + 63, 181, 30, 103, 97, 138, 193, 148, 96, 82, 61, 47, 188, 230, 118, 65, + 74, 28, 123, 50, 73, 12, 187, 123, 129, 19, 95, 213, 61, 153, 85, 243, + 44, 195, 249, 250, 121, 175, 42, 187, 154, 233, 91, 217, 49, 130, 129, 172, + 250, 182, 203, 30, 93, 213, 217, 24, 28, 198, 4, 208, 61, 207, 108, 120, + 22, 39, 136, 252, 123, 15, 188, 34, 35, 177, 35, 134, 178, 221, 217, 22, + 51, 18, 22, 215, 47, 68, 120, 130, 0, 192, 242, 170, 170, 202, 220, 179, + 185, 81, 204, 10, 115, 181, 231, 246, 172, 38, 43, 145, 56, 171, 219, 34, + 17, 96, 165, 209, 53, 44, 68, 74, 236, 249, 192, 35, 204, 123, 56, 118, + 174, 172, 151, 249, 36, 21, 133, 119, 237, 232, 61, 125, 6, 124, 200, 62, + 68, 67, 40, 196, 202, 84, 213, 160, 237, 85, 249, 125, 41, 187, 126, 48, + 152, 124, 104, 211, 127, 96, 167, 184, 23, 161, 68, 106, 119, 224, 226, 148, + 234, 54, 155, 168, 186, 193, 167, 15, 242, 100, 82, 15, 205, 247, 34, 24, + 134, 152, 115, 132, 114, 196, 0, 136, 242, 73, 91, 35, 90, 4, 161, 138, + 163, 21, 16, 244, 60, 158, 199, 246, 233, 150, 10, 142, 248, 196, 224, 129, + 8, 158, 81, 11, 92, 96, 197, 23, 45, 104, 235, 250, 9, 31, 47, 153, + 116, 22, 170, 186, 150, 46, 214, 246, 75, 116, 4, 242, 147, 168, 177, 134, + 143, 149, 36, 139, 224, 127, 143, 167, 208, 115, 158, 250, 132, 4, 124, 204, + 99, 217, 239, 97, 5, 38, 50, 17, 176, 171, 96, 92, 88, 219, 195, 184, + 160, 158, 175, 10, 175, 33, 245, 28, 55, 56, 207, 47, 46, 114, 108, 196, + 101, 93, 39, 227, 183, 40, 40, 109, 121, 123, 90, 85, 162, 165, 227, 200, + 238, 136, 223, 36, 77, 179, 45, 156, 51, 95, 33, 15, 219, 71, 37, 98, + 141, 150, 179, 78, 217, 221, 130, 186, 155, 84, 146, 217, 210, 202, 91, 212, + 50, 129, 188, 203, 28, 213, 10, 230, 40, 47, 215, 77, 161, 88, 71, 56, + 82, 124, 130, 249, 70, 139, 142, 23, 78, 139, 252, 32, 223, 90, 214, 27, + 94, 23, 12, 240, 77, 145, 71, 172, 75, 235, 141, 83, 145, 50, 101, 166, + 87, 154, 179, 203, 27, 233, 169, 45, 28, 41, 211, 46, 144, 123, 62, 62, + 205, 178, 180, 89, 32, 194, 238, 151, 217, 164, 214, 241, 164, 96, 215, 46, + 141, 189, 86, 97, 143, 4, 227, 73, 20, 221, 238, 66, 3, 132, 135, 229, + 22, 60, 152, 102, 211, 20, 250, 225, 36, 212, 131, 182, 212, 216, 84, 141, + 133, 86, 163, 136, 107, 219, 8, 100, 189, 138, 217, 60, 131, 237, 64, 37, + 241, 85, 140, 47, 54, 75, 58, 76, 66, 104, 245, 201, 199, 236, 188, 71, + 30, 171, 233, 190, 81, 120, 166, 63, 237, 249, 233, 192, 5, 24, 231, 193, + 39, 99, 101, 108, 92, 109, 156, 211, 111, 87, 157, 130, 16, 58, 113, 47, + 101, 152, 60, 183, 37, 227, 52, 255, 213, 16, 112, 234, 223, 197, 101, 73, + 120, 94, 60, 158, 82, 227, 131, 13, 4, 167, 78, 126, 120, 154, 26, 246, + 35, 145, 40, 150, 7, 208, 243, 100, 68, 89, 200, 139, 138, 121, 37, 28, + 35, 197, 227, 79, 19, 130, 171, 91, 116, 57, 153, 140, 217, 236, 7, 180, + 221, 226, 163, 199, 158, 131, 200, 37, 48, 41, 157, 175, 139, 71, 53, 172, + 113, 159, 133, 47, 139, 113, 157, 40, 88, 44, 115, 105, 104, 219, 211, 18, + 164, 170, 127, 5, 178, 115, 181, 143, 30, 173, 6, 186, 183, 45, 56, 94, + 252, 210, 171, 154, 10, 17, 34, 153, 4, 11, 176, 85, 144, 114, 36, 247, + 34, 67, 187, 69, 164, 168, 120, 82, 186, 46, 15, 147, 105, 48, 76, 235, + 15, 218, 86, 160, 19, 220, 119, 241, 103, 252, 196, 58, 74, 131, 214, 109, + 17, 175, 75, 203, 167, 17, 60, 52, 251, 130, 55, 184, 165, 83, 225, 231, + 184, 208, 196, 88, 70, 8, 3, 43, 78, 107, 158, 180, 130, 248, 194, 16, + 46, 54, 100, 98, 121, 67, 185, 17, 181, 210, 5, 15, 178, 196, 80, 220, + 28, 103, 220, 231, 167, 10, 122, 225, 194, 118, 157, 192, 195, 205, 130, 253, + 94, 246, 177, 74, 149, 90, 120, 188, 230, 48, 77, 168, 50, 76, 130, 136, + 200, 219, 209, 192, 20, 10, 193, 97, 205, 136, 98, 117, 128, 170, 198, 220, + 218, 180, 178, 186, 150, 227, 196, 161, 4, 244, 124, 31, 85, 243, 34, 78, + 187, 226, 164, 167, 122, 56, 114, 232, 140, 189, 160, 19, 184, 223, 165, 202, + 86, 210, 102, 183, 50, 30, 109, 134, 23, 102, 171, 130, 93, 106, 2, 117, + 80, 82, 197, 193, 247, 137, 255, 255, 127, 38, 13, 82, 103, 51, 179, 220, + 133, 247, 104, 152, 160, 229, 160, 214, 152, 157, 87, 183, 82, 43, 36, 19, + 80, 192, 122, 186, 201, 116, 190, 220, 131, 228, 153, 197, 212, 112, 233, 124, + 114, 212, 106, 195, 129, 141, 204, 238, 98, 247, 90, 244, 23, 118, 2, 168, + 71, 48, 223, 253, 187, 16, 204, 230, 46, 221, 30, 243, 27, 129, 155, 210, + 159, 84, 56, 212, 197, 131, 174, 59, 85, 108, 80, 36, 31, 210, 71, 228, + 254, 171, 67, 129, 154, 175, 245, 140, 11, 167, 43, 69, 231, 227, 91, 183, + 133, 108, 4, 151, 128, 64, 243, 215, 74, 160, 186, 217, 38, 28, 186, 75, + 178, 151, 214, 5, 49, 158, 242, 126, 91, 249, 88, 156, 110, 124, 205, 125, + 227, 19, 235, 172, 103, 200, 190, 121, 169, 140, 118, 156, 21, 152, 34, 31, + 235, 46, 191, 107, 37, 109, 135, 112, 195, 9, 245, 43, 96, 232, 74, 8, + 193, 131, 70, 140, 180, 204, 219, 243, 72, 70, 16, 11, 227, 0, 27, 252, + 142, 183, 199, 103, 114, 149, 221, 235, 69, 92, 245, 9, 227, 43, 173, 139, + 119, 85, 104, 214, 84, 126, 244, 243, 122, 14, 164, 185, 104, 176, 55, 133, + 44, 28, 208, 232, 50, 71, 32, 78, 200, 95, 153, 70, 82, 243, 91, 164, + 64, 159, 173, 244, 103, 78, 29, 218, 209, 124, 118, 153, 42, 69, 240, 237, + 228, 33, 155, 17, 61, 27, 233, 171, 6, 240, 48, 113, 243, 134, 207, 120, + 216, 61, 188, 247, 231, 185, 163, 43, 140, 138, 235, 132, 219, 47, 38, 93, + 205, 6, 247, 195, 200, 79, 87, 111, 210, 54, 222, 179, 108, 163, 253, 22, + 22, 101, 180, 6, 61, 41, 91, 95, 237, 186, 166, 110, 225, 139, 205, 146, + 41, 133, 153, 114, 63, 48, 110, 208, 168, 38, 233, 141, 23, 136, 236, 22, + 220, 14, 62, 224, 46, 20, 193, 181, 107, 14, 234, 156, 234, 108, 30, 112, + 235, 126, 237, 189, 252, 240, 240, 3, 175, 210, 85, 35, 230, 115, 219, 184, + 173, 48, 84, 250, 52, 113, 44, 187, 173, 253, 153, 177, 32, 127, 98, 100, + 180, 211, 71, 146, 82, 1, 69, 200, 165, 198, 121, 133, 232, 0, 237, 157, + 169, 31, 134, 106, 243, 245, 16, 228, 53, 133, 143, 255, 123, 175, 19, 10, + 98, 117, 180, 38, 50, 190, 63, 70, 106, 8, 221, 78, 66, 129, 190, 181, + 165, 119, 242, 101, 19, 18, 181, 91, 223, 30, 93, 253, 74, 242, 112, 139, + 30, 121, 25, 100, 144, 32, 212, 143, 3, 96, 134, 113, 193, 190, 51, 8, + 60, 108, 88, 168, 142, 47, 217, 173, 44, 207, 174, 161, 237, 179, 147, 4, + 30, 5, 177, 202, 43, 239, 15, 135, 44, 216, 10, 183, 63, 27, 159, 195, + 56, 238, 95, 213, 45, 44, 252, 4, 101, 233, 38, 88, 66, 126, 149, 196, + 87, 211, 55, 38, 17, 92, 26, 76, 156, 183, 136, 154, 166, 219, 125, 10, + 88, 240, 97, 14, 86, 67, 4, 74, 236, 71, 72, 10, 49, 18, 158, 148, + 128, 15, 241, 17, 9, 236, 243, 22, 116, 160, 65, 166, 34, 113, 76, 41, + 100, 153, 184, 22, 62, 252, 220, 47, 180, 124, 103, 242, 104, 13, 244, 136, + 33, 146, 33, 176, 31, 159, 235, 29, 221, 255, 182, 90, 183, 158, 186, 155, + 85, 137, 173, 129, 71, 91, 147, 17, 30, 240, 214, 110, 79, 64, 21, 129, + 97, 109, 253, 198, 203, 116, 235, 89, 166, 151, 116, 106, 194, 27, 51, 177, + 23, 119, 199, 227, 50, 143, 129, 234, 188, 217, 9, 136, 48, 115, 5, 252, + 241, 195, 116, 239, 68, 176, 55, 121, 2, 38, 229, 224, 94, 204, 200, 115, + 84, 235, 131, 172, 242, 56, 208, 41, 21, 36, 113, 156, 137, 6, 225, 132, + 4, 181, 193, 84, 10, 213, 155, 150, 72, 127, 23, 107, 255, 105, 250, 61, + 234, 211, 225, 169, 93, 63, 138, 95, 201, 74, 208, 99, 119, 184, 219, 62, + 86, 163, 142, 35, 24, 86, 92, 224, 53, 84, 57, 101, 113, 76, 26, 78, + 174, 49, 28, 234, 153, 240, 27, 114, 87, 133, 130, 78, 66, 144, 205, 152, + 171, 169, 136, 219, 142, 223, 145, 149, 196, 6, 167, 109, 52, 188, 0, 98, + 242, 254, 184, 129, 250, 63, 244, 10, 97, 188, 7, 137, 183, 165, 68, 91, + 26, 188, 230, 246, 227, 12, 217, 170, 224, 119, 135, 243, 149, 88, 67, 23, + 117, 173, 130, 164, 233, 244, 251, 11, 123, 57, 80, 111, 249, 146, 231, 213, + 158, 26, 236, 250, 213, 228, 117, 251, 101, 128, 8, 241, 251, 36, 40, 149, + 148, 60, 146, 48, 104, 121, 163, 233, 2, 24, 10, 21, 93, 137, 124, 8, + 115, 220, 255, 107, 153, 105, 6, 255, 32, 160, 96, 74, 84, 184, 31, 155, + 118, 206, 58, 131, 111, 150, 137, 145, 22, 45, 138, 211, 118, 151, 248, 189, + 64, 82, 222, 9, 137, 114, 59, 89, 77, 249, 245, 195, 146, 198, 43, 209, + 186, 151, 121, 136, 170, 81, 53, 43, 126, 15, 62, 88, 171, 206, 232, 34, + 99, 52, 6, 22, 126, 140, 32, 181, 122, 253, 230, 127, 211, 254, 61, 254, + 108, 114, 38, 214, 164, 244, 87, 243, 187, 185, 57, 105, 24, 244, 59, 254, + 92, 143, 235, 38, 70, 177, 126, 123, 61, 243, 45, 127, 76, 127, 39, 45, + 254, 239, 67, 221, 24, 81, 24, 130, 247, 106, 239, 93, 18, 57, 242, 4, + 223, 131, 86, 249, 241, 81, 149, 230, 154, 17, 14, 179, 194, 234, 17, 85, + 188, 33, 162, 62, 73, 157, 253, 248, 111, 97, 205, 47, 74, 223, 192, 185, + 212, 153, 240, 156, 104, 64, 46, 209, 146, 56, 27, 21, 184, 95, 107, 95, + 101, 243, 133, 146, 194, 240, 51, 109, 158, 225, 18, 80, 66, 4, 79, 252, + 174, 187, 55, 230, 54, 51, 42, 87, 34, 159, 155, 184, 118, 167, 150, 46, + 32, 156, 244, 124, 222, 84, 247, 12, 231, 119, 237, 135, 225, 227, 97, 178, + 37, 208, 112, 126, 32, 227, 60, 239, 194, 183, 169, 208, 221, 250, 180, 56, + 137, 67, 153, 170, 242, 54, 55, 48, 219, 79, 106, 249, 250, 56, 130, 184, + 43, 56, 114, 175, 122, 249, 107, 188, 63, 169, 25, 43, 68, 61, 246, 47, + 191, 117, 150, 7, 163, 144, 42, 186, 5, 195, 11, 68, 215, 219, 87, 213, + 42, 84, 99, 37, 29, 78, 34, 180, 131, 15, 171, 186, 225, 163, 204, 225, + 72, 198, 227, 122, 245, 4, 133, 40, 134, 17, 61, 112, 55, 159, 37, 118, + 112, 173, 210, 126, 9, 23, 209, 65, 14, 109, 16, 247, 254, 45, 170, 33, + 143, 35, 107, 134, 51, 132, 135, 226, 40, 112, 156, 122, 5, 31, 37, 113, + 24, 1, 153, 3, 180, 227, 249, 172, 93, 20, 79, 126, 42, 254, 100, 80, + 86, 180, 123, 71, 213, 32, 178, 28, 63, 75, 177, 246, 25, 119, 33, 236, + 194, 31, 94, 169, 97, 96, 42, 29, 165, 234, 199, 12, 76, 8, 242, 229, + 160, 130, 169, 76, 120, 159, 25, 18, 36, 182, 222, 210, 105, 251, 2, 40, + 111, 212, 249, 119, 48, 137, 50, 71, 146, 216, 47, 18, 60, 194, 18, 119, + 197, 216, 84, 170, 143, 241, 61, 207, 206, 238, 51, 39, 145, 171, 81, 108, + 64, 0, 229, 83, 190, 81, 149, 27, 77, 44, 34, 134, 178, 250, 9, 244, + 128, 175, 124, 28, 41, 116, 254, 30, 162, 88, 207, 231, 222, 155, 224, 234, + 201, 56, 119, 191, 190, 158, 195, 16, 153, 152, 99, 244, 60, 207, 205, 133, + 34, 101, 0, 104, 144, 141, 121, 168, 44, 40, 234, 49, 35, 136, 39, 242, + 14, 198, 188, 124, 161, 135, 113, 180, 68, 218, 10, 47, 223, 190, 0, 238, + 109, 149, 149, 25, 14, 218, 109, 85, 106, 125, 45, 29, 63, 122, 74, 184, + 39, 153, 72, 81, 69, 212, 62, 80, 161, 110, 103, 56, 254, 7, 198, 201, + 47, 202, 145, 147, 115, 7, 252, 21, 157, 211, 102, 40, 117, 116, 41, 110, + 189, 45, 41, 128, 46, 18, 40, 228, 43, 159, 202, 90, 114, 78, 193, 9, + 237, 172, 59, 89, 50, 218, 47, 142, 139, 118, 146, 201, 8, 158, 116, 71, + 133, 105, 177, 199, 24, 202, 219, 64, 136, 101, 162, 11, 225, 13, 60, 217, + 13, 125, 9, 38, 224, 90, 78, 166, 145, 101, 167, 132, 24, 58, 73, 19, + 2, 185, 83, 148, 110, 133, 191, 76, 71, 18, 168, 103, 0, 123, 195, 39, + 41, 243, 215, 62, 38, 156, 101, 42, 144, 43, 125, 154, 46, 152, 74, 242, + 251, 158, 180, 189, 228, 165, 64, 75, 220, 184, 160, 9, 23, 57, 138, 16, + 88, 240, 5, 234, 106, 188, 171, 120, 55, 203, 43, 72, 33, 67, 129, 26, + 242, 128, 89, 144, 226, 129, 58, 143, 110, 185, 216, 158, 238, 175, 34, 121, + 59, 49, 76, 178, 81, 88, 181, 23, 219, 66, 1, 228, 34, 143, 250, 41, + 77, 7, 245, 65, 3, 203, 53, 144, 140, 194, 71, 27, 10, 175, 218, 149, + 242, 213, 150, 9, 199, 22, 202, 155, 5, 44, 23, 111, 102, 5, 150, 32, + 62, 31, 220, 1, 129, 151, 109, 27, 215, 54, 235, 104, 157, 123, 8, 89, + 94, 161, 197, 0, 163, 75, 124, 41, 240, 192, 109, 9, 202, 124, 25, 82, + 95, 243, 170, 63, 91, 248, 4, 63, 47, 208, 243, 61, 85, 62, 107, 32, + 87, 19, 208, 87, 120, 234, 108, 244, 44, 158, 238, 91, 185, 219, 105, 13, + 254, 85, 208, 93, 148, 144, 160, 98, 237, 72, 27, 59, 119, 22, 99, 52, + 193, 190, 57, 171, 46, 247, 180, 126, 30, 16, 200, 88, 35, 212, 215, 253, + 218, 25, 96, 40, 44, 53, 29, 129, 153, 154, 197, 238, 84, 201, 244, 106, + 184, 178, 127, 54, 198, 60, 160, 98, 4, 229, 110, 220, 225, 26, 254, 238, + 123, 69, 248, 222, 43, 122, 207, 63, 166, 246, 171, 129, 231, 7, 89, 132, + 245, 76, 55, 174, 184, 93, 139, 221, 250, 11, 86, 239, 248, 14, 98, 226, + 66, 146, 45, 59, 106, 78, 6, 253, 6, 128, 53, 174, 7, 36, 100, 130, + 22, 47, 157, 147, 27, 31, 15, 97, 122, 46, 137, 84, 126, 104, 48, 217, + 236, 131, 51, 253, 147, 23, 35, 133, 43, 183, 124, 197, 150, 85, 170, 39, + 96, 227, 44, 130, 51, 83, 224, 22, 177, 39, 65, 125, 98, 28, 162, 56, + 25, 112, 81, 50, 28, 118, 184, 45, 236, 226, 87, 117, 111, 219, 157, 34, + 224, 77, 68, 59, 91, 80, 177, 178, 188, 203, 247, 133, 130, 15, 61, 125, + 252, 18, 201, 87, 157, 158, 47, 5, 151, 104, 231, 127, 161, 154, 172, 224, + 74, 95, 195, 121, 175, 200, 18, 26, 240, 194, 222, 85, 189, 238, 106, 136, + 195, 28, 170, 10, 115, 25, 236, 203, 127, 254, 103, 79, 175, 57, 159, 102, + 193, 106, 136, 130, 195, 16, 19, 14, 240, 130, 74, 217, 154, 5, 217, 88, + 21, 113, 205, 138, 241, 209, 39, 255, 182, 100, 41, 243, 199, 191, 7, 123, + 185, 7, 186, 28, 32, 71, 236, 16, 220, 222, 5, 122, 74, 55, 95, 19, + 230, 127, 201, 130, 180, 143, 142, 149, 229, 43, 81, 95, 32, 138, 165, 42, + 136, 231, 106, 34, 90, 135, 60, 60, 105, 191, 50, 195, 62, 230, 189, 100, + 41, 110, 61, 204, 139, 237, 185, 208, 136, 61, 249, 12, 20, 230, 48, 141, + 65, 17, 204, 126, 215, 73, 77, 129, 49, 230, 39, 247, 222, 109, 50, 151, + 255, 246, 141, 254, 233, 117, 156, 172, 113, 74, 72, 133, 218, 227, 4, 192, + 27, 185, 21, 99, 61, 34, 52, 112, 74, 18, 149, 38, 195, 43, 154, 8, + 16, 189, 142, 139, 167, 137, 2, 155, 165, 1, 255, 158, 107, 131, 141, 112, + 87, 102, 97, 12, 228, 30, 143, 60, 14, 238, 183, 145, 88, 116, 187, 64, + 138, 136, 138, 24, 16, 241, 126, 37, 103, 99, 203, 164, 198, 129, 140, 189, + 18, 178, 241, 154, 7, 81, 8, 75, 196, 131, 121, 19, 52, 90, 125, 71, + 179, 8, 102, 149, 117, 88, 2, 58, 115, 41, 254, 118, 205, 28, 244, 153, + 79, 179, 136, 194, 59, 55, 233, 48, 87, 218, 151, 218, 172, 109, 72, 156, + 112, 175, 129, 111, 124, 151, 112, 69, 175, 237, 175, 208, 35, 15, 70, 189, + 245, 118, 229, 51, 121, 237, 106, 57, 190, 157, 42, 37, 107, 108, 240, 142, + 180, 123, 58, 243, 99, 76, 153, 94, 235, 148, 3, 146, 198, 250, 3, 176, + 73, 105, 64, 3, 129, 155, 69, 66, 114, 55, 53, 31, 200, 171, 9, 127, + 227, 81, 238, 0, 29, 54, 79, 184, 213, 44, 21, 21, 106, 118, 193, 193, + 132, 216, 89, 39, 107, 40, 29, 198, 229, 184, 123, 32, 225, 148, 78, 40, + 236, 108, 100, 112, 139, 33, 176, 201, 41, 56, 180, 87, 100, 161, 247, 181, + 48, 215, 32, 88, 3, 2, 69, 189, 162, 185, 155, 129, 131, 151, 170, 201, + 203, 192, 141, 27, 38, 21, 174, 100, 48, 138, 216, 113, 123, 137, 161, 92, + 153, 129, 184, 21, 205, 18, 190, 184, 189, 57, 130, 168, 67, 161, 16, 207, + 223, 35, 254, 40, 169, 65, 104, 178, 164, 88, 198, 40, 58, 221, 211, 96, + 91, 98, 147, 157, 193, 121, 211, 28, 185, 217, 84, 58, 236, 70, 181, 35, + 58, 27, 111, 52, 213, 103, 93, 154, 18, 60, 201, 180, 29, 28, 85, 126, + 170, 190, 231, 64, 27, 191, 83, 158, 125, 124, 43, 172, 198, 25, 151, 108, + 116, 7, 164, 114, 92, 215, 197, 222, 31, 231, 41, 112, 42, 172, 207, 164, + 87, 123, 138, 156, 78, 44, 131, 127, 155, 114, 138, 219, 52, 223, 150, 230, + 94, 165, 103, 45, 139, 238, 161, 208, 117, 178, 225, 67, 90, 90, 110, 176, + 20, 110, 4, 189, 194, 138, 12, 168, 150, 181, 139, 54, 241, 243, 87, 19, + 136, 251, 68, 1, 239, 85, 161, 139, 67, 117, 239, 162, 214, 96, 205, 66, + 79, 13, 47, 16, 72, 171, 33, 246, 93, 197, 65, 115, 108, 87, 83, 116, + 49, 66, 34, 18, 101, 65, 24, 178, 147, 34, 61, 242, 51, 246, 191, 249, + 164, 200, 210, 150, 146, 46, 157, 137, 147, 161, 25, 101, 217, 142, 125, 241, + 73, 115, 83, 86, 208, 167, 233, 77, 109, 89, 197, 219, 108, 206, 54, 99, + 113, 101, 77, 41, 251, 24, 203, 179, 28, 109, 62, 248, 113, 197, 82, 35, + 89, 132, 11, 184, 194, 237, 142, 71, 81, 173, 36, 220, 103, 66, 254, 78, + 252, 105, 211, 89, 149, 132, 218, 43, 45, 77, 64, 137, 248, 238, 145, 172, + 64, 78, 123, 225, 161, 166, 202, 94, 210, 227, 36, 254, 153, 230, 23, 21, + 82, 125, 167, 115, 10, 25, 141, 144, 226, 25, 151, 22, 157, 162, 2, 250, + 16, 161, 48, 111, 121, 9, 191, 229, 41, 136, 83, 163, 165, 10, 195, 34, + 56, 145, 166, 99, 184, 180, 180, 159, 95, 110, 17, 46, 227, 245, 97, 207, + 27, 113, 121, 55, 196, 29, 248, 171, 108, 250, 236, 1, 31, 108, 15, 34, + 233, 32, 250, 127, 67, 159, 151, 145, 5, 171, 219, 102, 159, 137, 231, 130, + 229, 177, 209, 253, 150, 217, 76, 62, 111, 42, 25, 152, 169, 83, 245, 164, + 127, 61, 128, 35, 234, 8, 69, 152, 103, 107, 18, 98, 101, 214, 205, 136, + 68, 165, 54, 48, 189, 59, 29, 254, 128, 255, 249, 46, 23, 246, 29, 131, + 185, 27, 160, 235, 16, 52, 232, 247, 100, 230, 137, 91, 111, 48, 202, 31, + 126, 167, 162, 45, 159, 66, 215, 176, 32, 5, 255, 82, 108, 31, 184, 89, + 6, 73, 8, 209, 86, 202, 122, 111, 132, 39, 140, 160, 74, 148, 254, 21, + 33, 80, 180, 165, 241, 182, 74, 205, 243, 194, 17, 216, 113, 8, 239, 190, + 34, 158, 31, 58, 223, 249, 51, 74, 174, 191, 157, 185, 12, 98, 190, 135, + 91, 198, 25, 221, 76, 118, 88, 240, 184, 188, 70, 92, 36, 208, 124, 43, + 228, 200, 86, 193, 178, 251, 115, 233, 240, 11, 134, 91, 230, 141, 195, 161, + 255, 12, 103, 85, 187, 84, 129, 202, 48, 85, 155, 242, 226, 185, 109, 126, + 2, 8, 174, 221, 203, 67, 182, 52, 114, 243, 219, 32, 89, 183, 125, 18, + 209, 200, 99, 116, 123, 185, 17, 250, 250, 223, 129, 221, 147, 249, 142, 238, + 25, 230, 85, 85, 141, 248, 144, 13, 241, 3, 10, 253, 74, 96, 82, 115, + 210, 221, 17, 79, 213, 119, 27, 192, 55, 41, 161, 125, 167, 87, 45, 10, + 246, 22, 76, 245, 83, 4, 160, 242, 62, 221, 89, 206, 80, 235, 33, 34, + 81, 125, 28, 117, 233, 167, 89, 6, 132, 138, 130, 88, 227, 245, 44, 138, + 180, 42, 215, 4, 177, 9, 167, 135, 173, 234, 185, 119, 100, 108, 4, 237, + 145, 52, 227, 61, 231, 130, 77, 97, 204, 175, 136, 225, 27, 29, 36, 142, + 151, 129, 170, 105, 233, 88, 57, 122, 219, 60, 16, 70, 253, 218, 123, 188, + 49, 210, 121, 115, 150, 249, 213, 246, 76, 2, 197, 196, 24, 169, 143, 175, + 230, 138, 32, 81, 191, 13, 166, 211, 252, 110, 84, 221, 244, 13, 45, 116, + 242, 123, 18, 153, 163, 187, 46, 33, 28, 160, 219, 179, 85, 166, 2, 125, + 92, 99, 147, 61, 4, 200, 245, 135, 172, 187, 4, 101, 102, 85, 79, 168, + 53, 222, 129, 150, 252, 253, 252, 45, 39, 64, 33, 104, 69, 239, 180, 71, + 234, 177, 245, 185, 59, 238, 88, 65, 58, 156, 84, 238, 150, 46, 236, 65, + 229, 33, 221, 168, 102, 249, 163, 155, 36, 189, 54, 211, 154, 247, 69, 45, + 47, 140, 119, 63, 143, 129, 163, 38, 120, 88, 216, 66, 117, 118, 176, 93, + 153, 42, 129, 198, 45, 203, 26, 150, 43, 17, 53, 104, 196, 82, 234, 59, + 129, 81, 14, 104, 229, 8, 204, 187, 8, 168, 112, 18, 211, 154, 195, 181, + 87, 241, 234, 148, 68, 229, 231, 23, 134, 14, 97, 119, 22, 48, 123, 17, + 115, 105, 180, 124, 135, 51, 177, 104, 187, 23, 210, 76, 161, 8, 36, 57, + 218, 252, 142, 236, 154, 178, 119, 129, 189, 255, 208, 56, 25, 70, 68, 50, + 57, 172, 77, 154, 163, 80, 33, 180, 118, 57, 105, 97, 5, 50, 158, 185, + 226, 119, 237, 163, 47, 79, 233, 114, 160, 246, 93, 238, 197, 217, 240, 55, + 121, 37, 138, 104, 245, 181, 30, 133, 129, 94, 97, 31, 188, 121, 119, 74, + 227, 167, 196, 194, 108, 185, 63, 242, 0, 224, 8, 162, 49, 173, 57, 250, + 12, 113, 238, 241, 0, 180, 180, 198, 57, 180, 248, 243, 214, 122, 103, 81, + 205, 243, 232, 213, 39, 122, 142, 107, 4, 63, 123, 147, 22, 78, 174, 200, + 33, 27, 16, 76, 139, 230, 32, 101, 246, 228, 246, 89, 15, 30, 11, 87, + 174, 70, 195, 104, 14, 26, 209, 149, 19, 254, 121, 62, 186, 224, 56, 247, + 10, 237, 102, 83, 215, 211, 22, 123, 161, 52, 251, 122, 142, 228, 191, 93, + 151, 174, 176, 166, 64, 184, 254, 113, 140, 214, 109, 159, 126, 201, 95, 245, + 167, 180, 165, 106, 61, 83, 143, 239, 68, 254, 0, 201, 237, 162, 231, 108, + 152, 131, 248, 39, 149, 131, 80, 224, 41, 14, 157, 96, 16, 251, 139, 15, + 153, 45, 29, 84, 116, 154, 221, 234, 127, 39, 10, 244, 3, 92, 154, 93, + 125, 209, 252, 144, 73, 139, 47, 93, 98, 78, 7, 61, 173, 117, 46, 155, + 73, 76, 127, 202, 5, 223, 113, 215, 86, 54, 82, 0, 105, 16, 52, 226, + 140, 232, 53, 23, 76, 117, 212, 139, 183, 112, 95, 162, 174, 153, 104, 4, + 241, 133, 159, 188, 4, 147, 92, 125, 133, 104, 26, 241, 130, 13, 239, 96, + 235, 36, 195, 74, 193, 126, 54, 27, 55, 190, 97, 44, 26, 106, 31, 76, + 244, 174, 179, 1, 97, 168, 114, 14, 65, 60, 199, 182, 133, 130, 65, 175, + 95, 224, 125, 74, 157, 34, 99, 26, 135, 160, 188, 244, 114, 175, 211, 194, + 74, 97, 182, 244, 93, 3, 219, 223, 154, 204, 10, 132, 233, 165, 23, 204, + 187, 163, 179, 23, 72, 137, 22, 40, 123, 77, 216, 95, 44, 20, 55, 213, + 165, 125, 17, 237, 77, 140, 2, 146, 193, 104, 9, 83, 40, 126, 177, 137, + 53, 89, 59, 23, 49, 80, 240, 168, 70, 97, 250, 36, 161, 17, 228, 161, + 136, 213, 43, 118, 106, 198, 251, 68, 223, 34, 79, 123, 118, 91, 222, 236, + 73, 236, 175, 255, 248, 249, 96, 53, 245, 248, 238, 12, 106, 127, 183, 1, + 31, 193, 14, 126, 7, 19, 252, 102, 191, 74, 208, 115, 140, 76, 133, 179, + 82, 5, 83, 122, 154, 82, 37, 19, 171, 190, 177, 177, 233, 248, 175, 214, + 93, 17, 121, 167, 249, 165, 149, 191, 145, 188, 218, 99, 154, 55, 109, 202, + 12, 17, 56, 107, 124, 137, 156, 233, 85, 18, 237, 207, 9, 72, 10, 218, + 98, 58, 70, 254, 207, 179, 61, 201, 250, 163, 135, 215, 130, 182, 47, 93, + 123, 14, 251, 252, 34, 240, 172, 151, 111, 127, 19, 6, 165, 96, 254, 15, + 32, 153, 247, 91, 200, 78, 169, 160, 28, 70, 146, 251, 174, 49, 54, 98, + 93, 161, 19, 105, 195, 62, 196, 38, 84, 53, 122, 177, 158, 179, 113, 93, + 91, 102, 90, 119, 52, 120, 247, 208, 228, 233, 97, 240, 187, 205, 14, 194, + 35, 134, 229, 241, 16, 152, 130, 206, 63, 93, 110, 21, 52, 170, 67, 99, + 214, 121, 230, 201, 133, 173, 143, 225, 81, 184, 139, 105, 226, 58, 237, 106, + 16, 91, 163, 15, 4, 63, 94, 186, 80, 219, 85, 209, 183, 129, 122, 39, + 8, 140, 180, 203, 167, 223, 148, 74, 147, 29, 237, 108, 105, 143, 229, 254, + 104, 243, 111, 210, 11, 185, 158, 151, 90, 47, 43, 233, 91, 18, 119, 144, + 184, 63, 64, 3, 244, 225, 30, 134, 198, 210, 41, 103, 2, 31, 221, 74, + 26, 54, 18, 23, 242, 104, 39, 31, 167, 183, 209, 105, 192, 88, 219, 25, + 134, 228, 8, 222, 149, 25, 195, 141, 61, 33, 114, 213, 93, 6, 58, 12, + 191, 113, 216, 153, 39, 235, 173, 146, 34, 139, 210, 13, 59, 240, 88, 10, + 71, 72, 27, 225, 32, 70, 92, 182, 120, 151, 82, 246, 248, 93, 119, 13, + 199, 161, 48, 202, 84, 88, 226, 198, 249, 152, 165, 34, 183, 109, 9, 196, + 232, 168, 236, 241, 85, 100, 181, 81, 235, 85, 247, 85, 173, 57, 141, 145, + 116, 254, 146, 249, 161, 133, 245, 17, 117, 141, 208, 49, 245, 121, 181, 158, + 144, 197, 200, 63, 202, 119, 158, 107, 112, 56, 178, 227, 29, 87, 48, 151, + 228, 55, 194, 130, 52, 12, 35, 245, 171, 149, 90, 206, 151, 205, 184, 221, + 45, 57, 126, 64, 203, 244, 167, 172, 134, 141, 5, 145, 101, 29, 33, 133, + 90, 17, 64, 127, 152, 209, 78, 10, 131, 151, 157, 204, 231, 255, 164, 122, + 16, 78, 220, 245, 161, 229, 90, 203, 12, 205, 95, 8, 47, 51, 92, 23, + 118, 95, 211, 124, 116, 147, 74, 79, 10, 192, 217, 74, 80, 127, 17, 105, + 56, 248, 144, 72, 197, 159, 230, 19, 147, 31, 50, 239, 236, 92, 237, 131, + 159, 88, 99, 171, 76, 209, 41, 181, 194, 28, 3, 242, 137, 227, 20, 198, + 120, 6, 12, 97, 45, 210, 143, 177, 60, 83, 61, 135, 132, 187, 54, 61, + 82, 149, 193, 23, 45, 6, 95, 28, 167, 0, 67, 27, 17, 93, 241, 43, + 221, 109, 102, 179, 204, 80, 198, 60, 229, 38, 47, 100, 235, 50, 166, 193, + 79, 255, 71, 207, 116, 216, 201, 255, 134, 194, 201, 34, 169, 250, 28, 217, + 198, 176, 10, 203, 193, 197, 125, 80, 116, 149, 108, 224, 10, 195, 68, 228, + 218, 85, 146, 119, 67, 73, 118, 186, 171, 162, 86, 198, 176, 73, 41, 162, + 237, 196, 130, 32, 231, 70, 197, 139, 140, 182, 151, 221, 55, 95, 183, 58, + 43, 141, 160, 148, 193, 197, 162, 189, 62, 36, 226, 255, 214, 75, 166, 163, + 78, 30, 253, 52, 8, 190, 55, 241, 60, 187, 226, 34, 177, 102, 155, 56, + 165, 51, 183, 2, 181, 247, 125, 53, 36, 206, 73, 32, 19, 20, 204, 228, + 105, 254, 34, 201, 161, 175, 232, 223, 216, 103, 247, 13, 68, 49, 206, 172, + 122, 11, 17, 3, 55, 101, 94, 39, 18, 183, 214, 16, 149, 252, 137, 39, + 205, 84, 114, 80, 101, 246, 222, 173, 145, 229, 199, 73, 91, 219, 123, 235, + 45, 190, 39, 241, 146, 209, 124, 178, 151, 30, 19, 26, 112, 150, 192, 183, + 237, 124, 253, 165, 28, 130, 132, 161, 157, 140, 159, 163, 87, 181, 211, 166, + 233, 0, 180, 87, 125, 229, 173, 128, 90, 23, 38, 235, 143, 31, 117, 66, + 203, 76, 150, 249, 19, 23, 45, 184, 56, 249, 220, 114, 205, 1, 215, 169, + 205, 173, 58, 188, 128, 116, 122, 184, 48, 114, 95, 167, 3, 191, 136, 238, + 124, 245, 166, 82, 191, 16, 212, 149, 183, 166, 14, 212, 255, 67, 106, 50, + 159, 172, 211, 101, 207, 198, 242, 179, 40, 1, 73, 20, 64, 185, 29, 21, + 216, 246, 154, 104, 156, 214, 231, 192, 137, 220, 150, 215, 4, 80, 110, 164, + 185, 68, 114, 110, 234, 45, 143, 171, 196, 148, 151, 237, 16, 251, 68, 221, + 100, 18, 212, 110, 59, 147, 113, 217, 152, 28, 83, 198, 211, 231, 35, 39, + 198, 19, 163, 67, 40, 24, 124, 52, 138, 161, 254, 233, 90, 24, 214, 222, + 121, 189, 95, 180, 77, 147, 21, 187, 111, 9, 184, 75, 209, 250, 81, 110, + 34, 97, 198, 132, 182, 229, 192, 208, 67, 98, 124, 108, 141, 89, 37, 124, + 11, 5, 128, 76, 13, 220, 167, 201, 182, 151, 45, 235, 37, 142, 35, 192, + 28, 209, 254, 40, 15, 22, 183, 181, 138, 144, 72, 21, 48, 9, 133, 127, + 74, 187, 19, 170, 88, 209, 119, 194, 230, 243, 237, 156, 184, 156, 46, 118, + 58, 7, 139, 163, 157, 167, 65, 249, 102, 228, 201, 27, 255, 189, 54, 151, + 168, 108, 129, 113, 106, 245, 244, 158, 176, 247, 193, 161, 94, 248, 190, 38, + 208, 177, 246, 108, 158, 199, 56, 37, 141, 101, 102, 44, 109, 144, 23, 214, + 235, 251, 210, 184, 103, 145, 248, 118, 162, 139, 84, 61, 146, 29, 70, 170, + 80, 30, 145, 156, 202, 185, 222, 87, 247, 137, 153, 98, 166, 61, 173, 200, + 164, 40, 2, 137, 226, 66, 162, 24, 172, 46, 203, 80, 176, 156, 93, 26, + 48, 69, 130, 192, 129, 84, 70, 15, 25, 224, 175, 31, 161, 110, 61, 220, + 214, 220, 152, 22, 41, 51, 57, 114, 182, 139, 129, 159, 194, 169, 133, 246, + 37, 23, 79, 90, 88, 231, 6, 252, 101, 241, 250, 168, 71, 149, 252, 196, + 126, 2, 29, 177, 70, 218, 120, 203, 72, 243, 46, 45, 149, 57, 108, 37, + 198, 38, 177, 210, 32, 252, 227, 160, 77, 174, 211, 207, 212, 82, 139, 189, + 79, 198, 116, 165, 185, 49, 188, 43, 116, 230, 182, 34, 224, 138, 216, 93, + 93, 94, 175, 10, 217, 41, 209, 177, 36, 142, 205, 241, 34, 129, 8, 91, + 78, 210, 231, 166, 188, 18, 77, 139, 201, 203, 3, 154, 131, 8, 193, 207, + 255, 98, 166, 192, 215, 206, 236, 217, 9, 19, 78, 227, 105, 146, 56, 50, + 60, 114, 20, 239, 186, 119, 113, 183, 79, 186, 126, 223, 131, 30, 217, 249, + 82, 10, 188, 238, 161, 46, 174, 96, 6, 187, 251, 234, 62, 163, 213, 55, + 71, 253, 25, 193, 26, 176, 111, 20, 167, 220, 240, 78, 243, 42, 104, 194, + 0, 62, 53, 119, 199, 9, 202, 20, 164, 55, 155, 204, 107, 120, 180, 6, + 20, 114, 122, 130, 143, 124, 89, 130, 66, 140, 43, 183, 203, 216, 78, 86, + 178, 16, 226, 159, 192, 205, 105, 113, 138, 165, 108, 18, 214, 100, 154, 71, + 150, 46, 70, 178, 181, 68, 68, 160, 253, 18, 19, 220, 253, 207, 87, 105, + 32, 239, 229, 137, 155, 176, 139, 168, 248, 143, 86, 67, 224, 146, 17, 80, + 147, 87, 30, 168, 125, 169, 91, 59, 55, 169, 142, 226, 71, 181, 114, 40, + 231, 229, 155, 27, 31, 144, 166, 96, 9, 85, 90, 152, 25, 83, 113, 15, + 65, 106, 162, 151, 74, 7, 27, 188, 221, 150, 108, 96, 102, 233, 174, 208, + 9, 170, 159, 239, 67, 230, 187, 93, 141, 102, 218, 191, 48, 22, 53, 124, + 84, 96, 110, 43, 28, 126, 26, 32, 104, 104, 65, 99, 112, 207, 167, 54, + 175, 165, 152, 105, 234, 18, 138, 148, 101, 9, 87, 32, 155, 192, 7, 100, + 101, 72, 133, 203, 170, 248, 222, 190, 243, 0, 75, 100, 38, 52, 98, 125, + 66, 185, 104, 255, 8, 184, 116, 195, 32, 239, 213, 54, 28, 185, 96, 177, + 233, 30, 210, 25, 155, 28, 128, 53, 88, 101, 146, 68, 52, 60, 55, 183, + 171, 157, 207, 128, 53, 60, 22, 100, 53, 121, 124, 205, 163, 55, 82, 162, + 96, 99, 71, 184, 243, 169, 137, 77, 191, 16, 55, 59, 220, 197, 20, 4, + 61, 89, 4, 157, 96, 171, 145, 91, 145, 19, 36, 195, 42, 132, 152, 83, + 255, 137, 64, 37, 72, 190, 82, 29, 181, 41, 175, 144, 46, 229, 236, 217, + 105, 194, 7, 118, 19, 47, 151, 238, 222, 255, 183, 236, 181, 175, 135, 91, + 55, 163, 4, 156, 190, 18, 153, 21, 178, 51, 102, 36, 62, 253, 228, 12, + 102, 230, 138, 183, 182, 253, 54, 170, 251, 50, 107, 223, 180, 177, 74, 169, + 231, 208, 76, 47, 146, 158, 251, 181, 9, 219, 240, 169, 72, 250, 241, 125, + 86, 200, 125, 166, 137, 65, 115, 18, 68, 241, 124, 51, 128, 223, 113, 239, + 201, 221, 152, 21, 114, 127, 79, 101, 44, 48, 241, 21, 221, 91, 240, 214, + 166, 119, 140, 21, 143, 155, 172, 26, 207, 233, 0, 128, 118, 45, 22, 6, + 222, 75, 90, 99, 173, 214, 121, 53, 71, 183, 253, 19, 95, 71, 66, 16, + 41, 35, 195, 9, 93, 247, 42, 150, 49, 46, 229, 73, 220, 12, 230, 51, + 109, 147, 108, 124, 102, 83, 78, 75, 67, 141, 55, 246, 155, 195, 190, 56, + 116, 59, 185, 237, 104, 78, 66, 173, 165, 178, 32, 93, 14, 10, 46, 30, + 229, 108, 50, 52, 188, 2, 244, 142, 201, 8, 245, 53, 210, 132, 15, 184, + 82, 85, 156, 142, 35, 49, 39, 183, 58, 61, 96, 143, 60, 190, 41, 152, + 9, 183, 127, 90, 157, 109, 196, 76, 36, 177, 244, 173, 63, 233, 1, 16, + 110, 216, 203, 94, 245, 195, 71, 55, 161, 149, 230, 122, 159, 133, 143, 180, + 129, 6, 111, 56, 211, 30, 13, 142, 216, 122, 87, 69, 91, 233, 254, 4, + 232, 207, 157, 32, 113, 50, 227, 233, 158, 171, 38, 228, 191, 121, 56, 165, + 222, 22, 180, 217, 111, 104, 112, 134, 12, 22, 244, 44, 234, 34, 253, 217, + 212, 140, 93, 235, 36, 54, 4, 129, 32, 91, 197, 163, 24, 71, 133, 161, + 111, 114, 29, 19, 45, 100, 10, 207, 139, 158, 219, 206, 160, 248, 94, 12, + 241, 58, 118, 141, 115, 166, 177, 78, 173, 59, 85, 81, 97, 240, 154, 231, + 79, 200, 199, 195, 205, 98, 245, 129, 246, 217, 97, 209, 249, 194, 28, 179, + 49, 248, 14, 6, 128, 61, 178, 15, 190, 32, 251, 111, 225, 148, 0, 11, + 227, 246, 146, 46, 41, 231, 24, 80, 43, 174, 228, 166, 171, 206, 72, 142, + 253, 96, 242, 181, 31, 207, 95, 66, 88, 152, 165, 67, 7, 238, 23, 114, + 50, 224, 212, 241, 202, 224, 247, 70, 215, 162, 8, 237, 121, 169, 254, 191, + 30, 19, 72, 252, 3, 109, 5, 206, 105, 130, 69, 250, 250, 232, 135, 203, + 253, 77, 102, 203, 40, 72, 128, 223, 60, 59, 83, 103, 162, 117, 47, 200, + 65, 88, 43, 168, 168, 255, 46, 166, 86, 193, 231, 227, 92, 222, 186, 44, + 20, 166, 136, 123, 193, 88, 155, 166, 185, 73, 85, 124, 253, 80, 43, 176, + 173, 191, 2, 10, 50, 101, 143, 17, 129, 56, 191, 83, 103, 183, 143, 247, + 253, 161, 1, 76, 161, 76, 127, 194, 108, 88, 138, 152, 147, 164, 65, 147, + 61, 160, 192, 44, 56, 103, 144, 51, 153, 224, 38, 97, 173, 128, 34, 85, + 89, 143, 17, 239, 200, 47, 160, 2, 151, 249, 219, 208, 116, 71, 205, 72, + 210, 178, 205, 184, 207, 19, 37, 127, 183, 21, 229, 176, 91, 196, 203, 225, + 67, 189, 94, 214, 180, 203, 140, 186, 39, 250, 66, 3, 128, 35, 206, 43, + 67, 244, 207, 157, 165, 188, 201, 173, 43, 47, 210, 139, 254, 144, 218, 62, + 55, 6, 187, 32, 128, 206, 56, 74, 66, 42, 159, 171, 108, 56, 220, 246, + 127, 127, 32, 221, 190, 33, 91, 93, 88, 36, 51, 115, 93, 47, 203, 133, + 155, 166, 13, 124, 118, 56, 182, 202, 55, 224, 226, 36, 233, 9, 200, 217, + 249, 22, 252, 209, 179, 66, 32, 30, 129, 48, 186, 232, 66, 248, 197, 120, + 168, 191, 124, 16, 232, 117, 44, 125, 188, 157, 71, 35, 245, 219, 17, 111, + 41, 159, 96, 44, 233, 3, 105, 109, 199, 182, 42, 34, 87, 218, 48, 142, + 196, 99, 37, 89, 44, 173, 184, 160, 104, 203, 224, 230, 58, 60, 213, 132, + 9, 9, 253, 251, 72, 75, 235, 224, 20, 198, 208, 178, 42, 253, 126, 105, + 227, 171, 89, 93, 42, 222, 185, 232, 8, 248, 83, 78, 132, 37, 38, 173, + 67, 116, 185, 216, 47, 192, 196, 221, 172, 26, 5, 191, 41, 33, 114, 40, + 139, 22, 147, 173, 234, 41, 252, 118, 244, 73, 73, 237, 42, 6, 123, 228, + 213, 210, 202, 65, 195, 253, 112, 57, 202, 85, 247, 15, 160, 237, 138, 76, + 70, 94, 230, 163, 112, 217, 134, 78, 213, 55, 68, 198, 29, 195, 16, 138, + 162, 19, 34, 158, 144, 131, 64, 244, 80, 85, 63, 175, 47, 63, 233, 175, + 168, 190, 39, 4, 47, 200, 9, 161, 248, 198, 182, 166, 56, 23, 5, 121, + 188, 46, 90, 56, 216, 72, 203, 107, 212, 171, 110, 134, 255, 24, 243, 30, + 188, 55, 111, 8, 238, 198, 201, 180, 150, 230, 191, 248, 10, 82, 178, 247, + 114, 216, 83, 183, 24, 188, 131, 26, 246, 210, 42, 30, 111, 181, 215, 129, + 41, 21, 207, 15, 83, 86, 252, 169, 220, 246, 117, 114, 254, 143, 193, 60, + 123, 226, 202, 18, 77, 221, 135, 84, 180, 229, 79, 143, 241, 219, 217, 85, + 158, 63, 5, 245, 134, 63, 102, 68, 145, 100, 35, 13, 127, 241, 76, 211, + 204, 45, 125, 175, 128, 142, 244, 189, 203, 138, 63, 249, 2, 174, 167, 171, + 32, 131, 12, 250, 248, 198, 245, 3, 98, 4, 111, 244, 226, 122, 136, 58, + 189, 234, 244, 106, 117, 92, 97, 191, 247, 95, 114, 20, 151, 51, 67, 174, + 236, 109, 252, 215, 107, 183, 174, 254, 59, 22, 158, 203, 152, 194, 135, 200, + 61, 193, 249, 199, 24, 167, 119, 223, 205, 135, 112, 51, 118, 120, 253, 75, + 61, 101, 172, 213, 36, 226, 135, 54, 229, 214, 151, 9, 2, 197, 84, 22, + 207, 55, 182, 191, 53, 243, 63, 53, 13, 93, 121, 44, 174, 237, 192, 138, + 116, 208, 200, 134, 94, 34, 122, 110, 157, 231, 169, 177, 180, 203, 167, 125, + 73, 44, 57, 104, 204, 174, 36, 172, 47, 21, 36, 220, 92, 62, 191, 77, + 113, 5, 32, 8, 115, 61, 235, 237, 27, 76, 69, 187, 117, 72, 26, 49, + 217, 249, 130, 134, 139, 27, 229, 183, 146, 80, 3, 154, 25, 26, 52, 175, + 157, 1, 91, 126, 165, 6, 168, 134, 60, 32, 227, 68, 161, 126, 207, 247, + 160, 103, 105, 156, 129, 211, 220, 155, 222, 60, 184, 255, 149, 9, 116, 201, + 151, 42, 126, 0, 36, 167, 178, 40, 160, 5, 115, 82, 176, 207, 38, 10, + 213, 132, 57, 255, 138, 4, 204, 32, 33, 128, 174, 99, 94, 161, 237, 0, + 230, 209, 198, 89, 167, 80, 193, 116, 195, 111, 204, 241, 169, 46, 117, 108, + 244, 247, 12, 216, 106, 50, 242, 209, 61, 42, 214, 33, 25, 38, 138, 217, + 225, 105, 76, 244, 126, 252, 253, 57, 238, 107, 166, 158, 250, 132, 105, 91, + 184, 209, 217, 5, 202, 84, 254, 51, 233, 58, 2, 141, 130, 47, 97, 125, + 244, 95, 177, 68, 9, 213, 115, 118, 215, 70, 9, 64, 113, 139, 19, 165, + 231, 204, 191, 129, 15, 235, 143, 225, 241, 75, 168, 227, 126, 58, 201, 98, + 16, 227, 27, 148, 166, 1, 34, 110, 84, 120, 11, 181, 150, 111, 167, 184, + 49, 244, 231, 192, 44, 59, 41, 122, 58, 12, 185, 180, 54, 122, 106, 201, + 2, 65, 118, 129, 149, 139, 31, 201, 205, 90, 96, 76, 23, 43, 218, 15, + 233, 202, 103, 84, 18, 122, 25, 218, 38, 252, 222, 104, 172, 96, 30, 57, + 205, 130, 106, 183, 189, 230, 67, 63, 162, 142, 46, 199, 45, 244, 3, 26, + 208, 119, 15, 16, 29, 196, 178, 90, 41, 94, 193, 64, 51, 205, 136, 157 +}; + diff --git a/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec.c b/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec.c new file mode 100755 index 0000000..fc065d1 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec.c @@ -0,0 +1,190 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: rijndael_enc + + Author: Dr Brian Gladman + + Function: rijndael_dec is an implementation of the AES decryption + algorithm (Rijndael). + + Source: security section of MiBench + + Changes: Add computation of a checksum, refactoring + + License: see below + +*/ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +#include "aes.h" +#include "rijndael_dec_libc.h" + +/* + Global variable definitions +*/ +unsigned char rijndael_dec_key[ 32 ]; +int rijndael_dec_key_len; + +extern unsigned char rijndael_dec_data[ ]; +struct rijndael_dec_FILE rijndael_dec_fin; + +int rijndael_dec_checksum = 0; + +/* + Forward declaration of functions +*/ +void rijndael_dec_init( void ); +int rijndael_dec_return( void ); +void rijndael_dec_fillrand( unsigned char *buf, int len ); +void rijndael_dec_decfile( struct rijndael_dec_FILE *fin, struct aes *ctx ); +void rijndael_dec_main( void ); + +void rijndael_dec_init( void ) +{ + /* create a pseudo-file for the input*/ + rijndael_dec_fin.data = rijndael_dec_data; + rijndael_dec_fin.size = 32768; + rijndael_dec_fin.cur_pos = 0; + + unsigned i; + volatile int x = 0; + rijndael_dec_fin.size ^= x; + _Pragma( "loopbound min 32768 max 32768" ) + for ( i = 0; i < rijndael_dec_fin.size; i++ ) + rijndael_dec_fin.data[ i ] ^= x; + + /* this is a pointer to the hexadecimal key digits */ + const volatile char *cp = + "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321"; + char ch; + int by = 0; + + i = 0; /* this is a count for the input digits processed */ + _Pragma( "loopbound min 64 max 64" ) + while ( i < 64 && *cp ) { /* the maximum key length is 32 bytes and */ + /* hence at most 64 hexadecimal digits */ + ch = rijndael_dec_toupper( *cp++ ); /* process a hexadecimal digit */ + if ( ch >= '0' && ch <= '9' ) + by = ( by << 4 ) + ch - '0'; + else + if ( ch >= 'A' && ch <= 'F' ) + by = ( by << 4 ) + ch - 'A' + 10; + else { /* error if not hexadecimal */ + rijndael_dec_checksum = -2; + return; + } + + /* store a key byte for each pair of hexadecimal digits */ + if ( i++ & 1 ) + rijndael_dec_key[ i / 2 - 1 ] = by & 0xff; + } + + if ( *cp ) { + rijndael_dec_checksum = -3; + return; + } else + if ( i < 32 || ( i & 15 ) ) { + rijndael_dec_checksum = -4; + return; + } + + rijndael_dec_key_len = i / 2; +} + +int rijndael_dec_return( void ) +{ + return ( ( rijndael_dec_checksum == ( int )262180 ) ? 0 : -1 ); +} + +void rijndael_dec_decfile( struct rijndael_dec_FILE *fin, struct aes *ctx ) +{ + unsigned char inbuf1[ 16 ], inbuf2[ 16 ], outbuf[ 16 ], *bp1, *bp2, *tp; + int i; + + + rijndael_dec_fread( inbuf1, 1, 16, fin ); + + i = rijndael_dec_fread( inbuf2, 1, 16, + fin ); /* read 1st encrypted file block */ + + if ( i && i != 16 ) { + rijndael_dec_checksum = -10; + return; + } + + rijndael_dec_decrypt( inbuf2, outbuf, + ctx ); /* decrypt it */ + + rijndael_dec_checksum += outbuf[ 15 ]; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; ++i ) /* xor with previous input */ + outbuf[ i ] ^= inbuf1[ i ]; + + bp1 = inbuf1; /* set up pointers to two input buffers */ + bp2 = inbuf2; + + /* TODO: this is necessarily an input-dependent loop bound */ + _Pragma( "loopbound min 2046 max 2046" ) + while ( 1 ) { + i = rijndael_dec_fread( bp1, 1, 16, fin ); /* read next encrypted block */ + /* to first input buffer */ + if ( i != 16 ) /* no more bytes in input - the decrypted */ + break; /* partial final buffer needs to be output */ + + /* if a block has been read the previous block must have been */ + /* full lnegth so we can now write it out */ + + rijndael_dec_decrypt( bp1, outbuf, ctx ); /* decrypt the new input block and */ + + rijndael_dec_checksum += outbuf[ 15 ]; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; ++i ) /* xor it with previous input block */ + outbuf[ i ] ^= bp2[ i ]; + + /* swap buffer pointers */ + tp = bp1, bp1 = bp2, bp2 = tp; + } +} + +void _Pragma( "entrypoint" ) rijndael_dec_main( void ) +{ + struct aes ctx[ 1 ]; + + /* decryption in Cipher Block Chaining mode */ + rijndael_dec_set_key( rijndael_dec_key, rijndael_dec_key_len, dec, ctx ); + rijndael_dec_decfile( &rijndael_dec_fin, ctx ); +} + +int main() +{ + + rijndael_dec_init(); + rijndael_dec_main(); + + return ( rijndael_dec_return() ); +} + diff --git a/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.c b/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.c new file mode 100755 index 0000000..b43a76a --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.c @@ -0,0 +1,66 @@ +#include "rijndael_dec_libc.h" + +int rijndael_dec_toupper( int c ) +{ + if ( ( c >= 'a' ) && ( c <= 'z' ) ) + return c - 'a' + 'A'; + return c; +} + +unsigned long rijndael_dec_fread( void *ptr, unsigned long size, + unsigned long count, struct rijndael_dec_FILE *stream ) +{ + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count ? + size * count : stream->size - stream->cur_pos; + _Pragma( "loopbound min 0 max 16" ) + while ( i < stream->cur_pos + number_of_chars_to_read ) + ( ( unsigned char * )ptr )[ i2++ ] = stream->data[ i++ ]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +unsigned long rijndael_dec_fwrite( const void *ptr, unsigned long size, + unsigned long count, struct rijndael_dec_FILE *stream ) +{ + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_write = + stream->size - stream->cur_pos >= size * count ? + size * count : stream->size - stream->cur_pos; + _Pragma( "loopbound min 0 max 0" ) + while ( i < stream->cur_pos + number_of_chars_to_write ) + stream->data[ i++ ] = ( ( unsigned char * )ptr )[ i2++ ]; + stream->cur_pos += number_of_chars_to_write; + return number_of_chars_to_write; +} + +int rijndael_dec_fseek( struct rijndael_dec_FILE *stream, long int offset, + Origin origin ) +{ + if ( origin == RIJNDAEL_DEC_SEEK_SET ) { + stream->cur_pos = offset; + return 0; + } else + if ( origin == RIJNDAEL_DEC_SEEK_CUR ) { + stream->cur_pos += offset; + return 0; + } else + if ( origin == RIJNDAEL_DEC_SEEK_END ) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +int rijndael_dec_fgetpos( struct rijndael_dec_FILE *stream, + unsigned *position ) +{ + *position = stream->cur_pos; + return 0; +} + +int rijndael_dec_feof( struct rijndael_dec_FILE *stream ) +{ + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.h b/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.h new file mode 100755 index 0000000..eb7b8d6 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/rijndael_dec_libc.h @@ -0,0 +1,24 @@ +#ifndef RIJNDAEL_DEC_LIBC_H +#define RIJNDAEL_DEC_LIBC_H + +int rijndael_dec_toupper ( int c ); + +enum _Origin_ { RIJNDAEL_DEC_SEEK_SET, RIJNDAEL_DEC_SEEK_CUR, RIJNDAEL_DEC_SEEK_END }; +typedef enum _Origin_ Origin; +struct rijndael_dec_FILE { + unsigned char *data; + unsigned long size; + unsigned cur_pos; +}; + +unsigned long rijndael_dec_fread ( void *ptr, unsigned long size, + unsigned long count, struct rijndael_dec_FILE *stream ); +unsigned long rijndael_dec_fwrite ( const void *ptr, unsigned long size, + unsigned long count, struct rijndael_dec_FILE *stream ); +int rijndael_dec_fseek ( struct rijndael_dec_FILE *stream, long int offset, + Origin origin ); +int rijndael_dec_fgetpos( struct rijndael_dec_FILE *stream, + unsigned *position ); +int rijndael_dec_feof ( struct rijndael_dec_FILE *stream ); + +#endif // RIJNDAEL_DEC_LIBC_H diff --git a/targets/wasm-tacle/sequential/rijndael_enc/CMakeLists.txt b/targets/wasm-tacle/sequential/rijndael_enc/CMakeLists.txt new file mode 100644 index 0000000..74faf81 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/CMakeLists.txt @@ -0,0 +1,28 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(rijndael_enc) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/rijndael_enc.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/rijndael_enc.c" + "generated/modified_sources/default/aes.c" + "generated/modified_sources/default/input_small.c" + "generated/modified_sources/default/rijndael_enc_libc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/rijndael_enc/ChangeLog.txt b/targets/wasm-tacle/sequential/rijndael_enc/ChangeLog.txt new file mode 100755 index 0000000..e054122 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/ChangeLog.txt @@ -0,0 +1,98 @@ +File: rijndael_encoder.c +Source: security section of MiBench + +2016-02-26: +- Remove commented-out code +- Prefix functions with "rijndael_enc" +- Compute a checksum and return it from main +- Change return type of rijndael_enc_encfile to void +- Move functionality from function main into functions + rijndael_enc_init, rijndael_enc_main, and rijndael_enc_return +- Reordered functions in source code: initialization- and + return-value-related functions first, followed by algorithm core + functions, followed by main functions +- Added function prototypes +- Applied code formatting with astyle as in the example +- Added general TACLeBench header to beginning of source code +- Rename to rijndael_enc.c + +2016-03-15: +- Return 0 if checksum is as expected, -1 otherwise +- Add entrypoint pragma +- Make inputs volatile (or touch them with a volatile) to rule out + optimizations + +2016-04-20: +- Cast "expected" return value to int for comparison +- Make loop counter in rijndael_enc_init unsigned + +Files: aes.c, aes.h, aestab.h +Source: security section of MiBench + +2016-02-26: +- Remove unused defines UNROLL, PARTIAL_UNROLL +- Remove defines FIXED_TABLES, FF_TABLES, ARRAYS, FOUR_TABLES, + FOUR_LR_TABLES, FOUR_IM_TABLES +- Remove (undefined) define ONE_TABLE, ONE_LR_TABLE , ONE_IM_TABLE +- Assume BLOCK_SIZE is always 16 +- Remove unused define "unused" +- Remove INTERNAL_BYTE_ORDER, EXTERNAL_BYTE_ORDER, AES_BIG_ENDIAN, + AES_LITTLE_ENDIAN (assume internal == external == little endian) +- Remove defines AES_DLL and AES_IN_CPP +- Remove "#if defined(__cplusplus)" +- Replace macros c_name and cf_dec with their definition +- Remove some stale comments +- Remove defines no_table and one_table +- Remove prototypes for unusedfunctions decrypt and set_blk +- Prefix all functions and global variables with "rijndael_enc" +- Break lines in overly long macros +- Protect macros +- Applied code formatting with astyle as in the example + +2016-04-20: +- Remove unused macros s, ff_poly, ff_hi, m1, m2, m3, FFmulX, + fwd_mcol, fwd_var, inv_var, si, so, fwd_rnd, inv_rnd, fwd_lrnd, + inv_lrnd, locals, l_copy, state_in, state_out, round, i_table, + li_table +- Remove unused arrays rijndael_enc_s_box, rijndael_enc_inv_s_box, + rijndael_enc_it_tab, rijndael_enc_il_tab + +2016-06-14: +- Added cast to make C++ compiler happy + +Files: glibc_common.h, my_file.h +Source: security section of MiBench + +2016-02-26: +- Merge into file rijndael_enc_libc.h + +File: rijndael_enc_libc.h + +2016-02-26: +- Replace size_t with unsigned long +- Remove defines LITTLE_ENDIAN and NULL +- Prefix all functions with "rijndael_enc" (instead of "my_") +- Prefix definitions that clash with the standard library with + "rijndael_enc" (instead of "my_") +- Applied code formatting with astyle as in the example + +Files: glibc_common.c, my_file.c +Source: security section of MiBench + +2016-02-26: +- Merge into file rijndael_enc_libc.c + +File: rijndael_enc_libc.c + +2016-02-26: +- Replace size_t with unsigned long +- Prefix all functions with "rijndael_enc" (instead of "my_") +- Prefix definitions that clash with the standard library with + "rijndael_enc" (instead of "my_") +- Applied code formatting with astyle as in the example + +File: input_small.c +Source: security section of MiBench + +2016-02-26: +- Break long lines diff --git a/targets/wasm-tacle/sequential/rijndael_enc/aes.c b/targets/wasm-tacle/sequential/rijndael_enc/aes.c new file mode 100755 index 0000000..a803a79 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/aes.c @@ -0,0 +1,406 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of 128, + bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. +*/ + +#include "aes.h" + +#include "aestab.h" + +#define four_tables(x,tab,vf,rf,c) ( tab[ 0 ][ bval(vf(x,0,c),rf(0,c)) ] ^ \ + tab[ 1 ][ bval(vf(x,1,c),rf(1,c)) ] ^ \ + tab[ 2 ][ bval(vf(x,2,c),rf(2,c)) ] ^ \ + tab[ 3 ][ bval(vf(x,3,c),rf(3,c)) ] ) + +#define vf1(x,r,c) (x) +#define rf1(r,c) (r) +#define rf2(r,c) ((r-c)&3) + +#define ls_box(x,c) four_tables(x,rijndael_enc_fl_tab,vf1,rf2,c) + +#define inv_mcol(x) four_tables(x,rijndael_enc_im_tab,vf1,rf1,0) + +/* + Subroutine to set the block size (if variable) in bytes, legal + values being 16, 24 and 32. +*/ + +#define nc (Ncol) + +/* + Initialise the key schedule from the user supplied key. The key + length is now specified in bytes - 16, 24 or 32 as appropriate. + This corresponds to bit lengths of 128, 192 and 256 bits, and + to Nk values of 4, 6 and 8 respectively. +*/ + +#define mx(t,f) (*t++ = inv_mcol(*f),f++) +#define cp(t,f) *t++ = *f++ + +#define cpy(d,s) do { cp(d,s); cp(d,s); cp(d,s); cp(d,s); } while (0) //min 1 max 1 +#define mix(d,s) do { mx(d,s); mx(d,s); mx(d,s); mx(d,s); } while (0) //min 1 max 1 + +aes_ret rijndael_enc_set_key( byte in_key[ ], const word n_bytes, + const enum aes_key f, struct aes *cx ) +{ + word *kf, *kt, rci; + + if ( ( n_bytes & 7 ) || n_bytes < 16 || n_bytes > 32 || ( !( f & 1 ) && + !( f & 2 ) ) ) + return ( n_bytes ? cx->mode &= ~0x03, aes_bad : ( aes_ret )( cx->Nkey << 2 ) ); + + cx->mode = ( cx->mode & ~0x03 ) | ( ( byte )f & 0x03 ); + cx->Nkey = n_bytes >> 2; + cx->Nrnd = Nr( cx->Nkey, ( word )nc ); + + cx->e_key[ 0 ] = word_in( in_key ); + cx->e_key[ 1 ] = word_in( in_key + 4 ); + cx->e_key[ 2 ] = word_in( in_key + 8 ); + cx->e_key[ 3 ] = word_in( in_key + 12 ); + + kf = cx->e_key; + kt = kf + nc * ( cx->Nrnd + 1 ) - cx->Nkey; + rci = 0; + + switch ( cx->Nkey ) { + case 4: + _Pragma( "loopbound min 0 max 0" ) + do { + kf[ 4 ] = kf[ 0 ] ^ ls_box( kf[ 3 ], 3 ) ^ rijndael_enc_rcon_tab[ rci++ ]; + kf[ 5 ] = kf[ 1 ] ^ kf[ 4 ]; + kf[ 6 ] = kf[ 2 ] ^ kf[ 5 ]; + kf[ 7 ] = kf[ 3 ] ^ kf[ 6 ]; + kf += 4; + } while ( kf < kt ); + break; + + case 6: + cx->e_key[ 4 ] = word_in( in_key + 16 ); + cx->e_key[ 5 ] = word_in( in_key + 20 ); + _Pragma( "loopbound min 0 max 0" ) + do { + kf[ 6 ] = kf[ 0 ] ^ ls_box( kf[ 5 ], 3 ) ^ rijndael_enc_rcon_tab[ rci++ ]; + kf[ 7 ] = kf[ 1 ] ^ kf[ 6 ]; + kf[ 8 ] = kf[ 2 ] ^ kf[ 7 ]; + kf[ 9 ] = kf[ 3 ] ^ kf[ 8 ]; + kf[ 10 ] = kf[ 4 ] ^ kf[ 9 ]; + kf[ 11 ] = kf[ 5 ] ^ kf[ 10 ]; + kf += 6; + } while ( kf < kt ); + break; + + case 8: + cx->e_key[ 4 ] = word_in( in_key + 16 ); + cx->e_key[ 5 ] = word_in( in_key + 20 ); + cx->e_key[ 6 ] = word_in( in_key + 24 ); + cx->e_key[ 7 ] = word_in( in_key + 28 ); + _Pragma( "loopbound min 7 max 7" ) + do { + kf[ 8 ] = kf[ 0 ] ^ ls_box( kf[ 7 ], 3 ) ^ rijndael_enc_rcon_tab[ rci++ ]; + kf[ 9 ] = kf[ 1 ] ^ kf[ 8 ]; + kf[ 10 ] = kf[ 2 ] ^ kf[ 9 ]; + kf[ 11 ] = kf[ 3 ] ^ kf[ 10 ]; + kf[ 12 ] = kf[ 4 ] ^ ls_box( kf[ 11 ], 0 ); + kf[ 13 ] = kf[ 5 ] ^ kf[ 12 ]; + kf[ 14 ] = kf[ 6 ] ^ kf[ 13 ]; + kf[ 15 ] = kf[ 7 ] ^ kf[ 14 ]; + kf += 8; + } while ( kf < kt ); + break; + } + + if ( ( cx->mode & 3 ) != enc ) { + word i; + + kt = cx->d_key + nc * cx->Nrnd; + kf = cx->e_key; + + cpy( kt, kf ); + kt -= 2 * nc; + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i < cx->Nrnd; ++i ) { + mix( kt, kf ); + kt -= 2 * nc; + } + + cpy( kt, kf ); + } + + return aes_good; +} + +short rijndael_enc_encrypt( unsigned char in_blk[ ], unsigned char out_blk[ ], + const struct aes *cx ) +{ + const unsigned long *kp = cx->e_key; + if ( !( cx->mode & 1 ) ) + return 0; + unsigned long b0[ 4 ]; + b0[ 0 ] = *( unsigned long * )in_blk ^ kp[ 0 ]; + b0[ 1 ] = *( unsigned long * )( in_blk + 4 )^kp[ 1 ]; + b0[ 2 ] = *( unsigned long * )( in_blk + 8 )^kp[ 2 ]; + b0[ 3 ] = *( unsigned long * )( in_blk + 12 )^kp[ 3 ]; + kp += 4; + unsigned long b1[ 4 ]; + switch ( cx->Nrnd ) { + case 14: + b1[ 0 ] = kp[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = kp[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = kp[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = kp[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + kp += 8; + case 12: + b1[ 0 ] = kp[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = kp[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = kp[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = kp[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + kp += 8; + case 10: + b1[ 0 ] = kp[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = kp[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = kp[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = kp[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 8 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 8 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 8 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 8 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 12 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 12 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 12 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 12 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 16 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 16 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 16 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 16 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 20 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 20 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 20 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 20 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 24 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 24 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 24 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 24 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 28 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 28 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 28 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 28 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 32 )[ 0 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 32 )[ 1 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 32 )[ 2 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 32 )[ 3 ] ^ ( rijndael_enc_ft_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_enc_ft_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_ft_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_ft_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 36 )[ 0 ] ^ ( rijndael_enc_fl_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_enc_fl_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_enc_fl_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_enc_fl_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 36 )[ 1 ] ^ ( rijndael_enc_fl_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_enc_fl_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_enc_fl_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_enc_fl_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 36 )[ 2 ] ^ ( rijndael_enc_fl_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_enc_fl_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_enc_fl_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_enc_fl_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 36 )[ 3 ] ^ ( rijndael_enc_fl_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_enc_fl_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_enc_fl_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_enc_fl_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + } + *( unsigned long * )out_blk = ( b0[ 0 ] ); + *( unsigned long * )( out_blk + 4 ) = ( b0[ 1 ] ); + *( unsigned long * )( out_blk + 8 ) = ( b0[ 2 ] ); + *( unsigned long * )( out_blk + 12 ) = ( b0[ 3 ] ); + return aes_good; +} + diff --git a/targets/wasm-tacle/sequential/rijndael_enc/aes.h b/targets/wasm-tacle/sequential/rijndael_enc/aes.h new file mode 100755 index 0000000..4d4ecf1 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/aes.h @@ -0,0 +1,165 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + 1. FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of + 128 bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. + + 2. THE CIPHER INTERFACE + + byte (an unsigned 8-bit type) + word (an unsigned 32-bit type) + aes_ret: (a signed 16 bit type for function return values) + aes_good (value != 0, a good return) + aes_bad (value == 0, an error return) + enum aes_key: (encryption direction) + enc (set key for encryption) + dec (set key for decryption) + both (set key for both) + class or struct aes (structure for context) + + C subroutine calls: + + aes_ret set_blk(const word block_length, aes *cx) (variable block size) + aes_ret set_key(const byte key[ ], const word key_length, + const enum aes_key direction, aes *cx) + aes_ret encrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + aes_ret decrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + + IMPORTANT NOTE: If you are using this C interface and your compiler does + not set the memory used for objects to zero before use, you will need to + ensure that cx.mode is set to zero before using the C subroutine calls. + + The block length inputs to set_block and set_key are in numbers of + BYTES, not bits. The calls to subroutines must be made in the above + order but multiple calls can be made without repeating earlier calls + if their parameters have not changed. If the cipher block length is + variable but set_blk has not been called before cipher operations a + value of 16 is assumed (that is, the AES block size). In contrast to + earlier versions the block and key length parameters are now checked + for correctness and the encryption and decryption routines check to + ensure that an appropriate key has been set before they are called. + +*/ + +#ifndef _AES_H +#define _AES_H + +/* The only supported block size for the benchmark is 16 */ +#define BLOCK_SIZE 16 + +/* + The number of key schedule words for different block and key lengths + (allowing for the method of computation which requires the length to + be a multiple of the key length): + + Key Schedule key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 44 60 54 56 64 + length 20 | 60 60 66 70 80 + (bytes) 24 | 80 80 78 84 96 + 28 | 100 100 102 98 112 + 32 | 120 120 120 126 120 + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + The following values assume that the key length will be variable and may + be of maximum length (32 bytes). + + Nk = number_of_key_bytes / 4 + Nc = number_of_columns_in_state / 4 + Nr = number of encryption/decryption rounds + Rc = number of elements in rcon table + Ks = number of 32-bit words in key schedule +*/ + +#define Nr(Nk,Nc) ((Nk > Nc ? Nk : Nc) + 6) +#define Rc(Nk,Nc) ((Nb * (Nr(Nk,Nc) + 1) - 1) / Nk) +#define Ks(Nk,Nc) (Nk * (Rc(Nk,Nc) + 1)) + +#define RC_LENGTH 5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11) +#define KS_LENGTH 4 * BLOCK_SIZE + +/* End of configuration options, but see also aes.c */ + +typedef unsigned char byte; /* must be an 8-bit storage unit */ +typedef unsigned long word; /* must be a 32-bit storage unit */ +typedef short aes_ret; /* function return value */ + +#define aes_bad 0 +#define aes_good 1 + +/* + upr(x,n): rotates bytes within words by n positions, moving bytes + to higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word +*/ + +#define upr(x,n) (((x) << 8 * (n)) | ((x) >> (32 - 8 * (n)))) +#define ups(x,n) ((x) << 8 * (n)) +#define bval(x,n) ((byte)((x) >> 8 * (n))) +#define byte_swap(x) (upr(x,1) & 0x00ff00ff | upr(x,3) & 0xff00ff00) +#define bytes2word(b0, b1, b2, b3) ((word)(b3) << 24 | (word)(b2) << 16 | \ + (word)(b1) << 8 | (b0)) + +#define word_in(x) *(word*)(x) +#define word_out(x,v) *(word*)(x) = (v) + +enum aes_const { Nrow = 4, /* the number of rows in the cipher state */ + Mcol = 8, /* maximum number of columns in the state */ + Ncol = BLOCK_SIZE / 4, + Shr0 = 0, /* the cyclic shift values for rows 0, 1, 2 & 3 */ + Shr1 = 1, + Shr2 = BLOCK_SIZE == 32 ? 3 : 2, + Shr3 = BLOCK_SIZE == 32 ? 4 : 3 + }; + +enum aes_key { enc = 1, /* set if encryption is needed */ + dec = 2, /* set if decryption is needed */ + both = 3 /* set if both are needed */ + }; + +struct aes { + word Nkey; /* the number of words in the key input block */ + word Nrnd; /* the number of cipher rounds */ + word e_key[ KS_LENGTH ]; /* the encryption key schedule */ + word d_key[ KS_LENGTH ]; /* the decryption key schedule */ + byte mode; /* encrypt, decrypt or both */ +}; + +aes_ret rijndael_enc_set_key( byte key[ ], const word n_bytes, + const enum aes_key f, struct aes *cx ); +aes_ret rijndael_enc_encrypt( byte in_blk[ ], byte out_blk[ ], + const struct aes *cx ); + +#endif diff --git a/targets/wasm-tacle/sequential/rijndael_enc/aestab.h b/targets/wasm-tacle/sequential/rijndael_enc/aestab.h new file mode 100755 index 0000000..7a4c6bc --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/aestab.h @@ -0,0 +1,261 @@ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +/* + Used to ensure table is generated in the right format + depending on the internal byte order required. +*/ + +#define w0(p) 0x000000##p + +/* + Number of elements required in this table for different + block and key lengths is: + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + this table can be a table of bytes if the key schedule + code is adjusted accordingly +*/ + +const word rijndael_enc_rcon_tab[ 29 ] = { + w0( 01 ), w0( 02 ), w0( 04 ), w0( 08 ), + w0( 10 ), w0( 20 ), w0( 40 ), w0( 80 ), + w0( 1b ), w0( 36 ), w0( 6c ), w0( d8 ), + w0( ab ), w0( 4d ), w0( 9a ), w0( 2f ), + w0( 5e ), w0( bc ), w0( 63 ), w0( c6 ), + w0( 97 ), w0( 35 ), w0( 6a ), w0( d4 ), + w0( b3 ), w0( 7d ), w0( fa ), w0( ef ), + w0( c5 ) +}; + +#undef w0 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +#define r0(p,q,r,s) 0x##p##q##r##s +#define r1(p,q,r,s) 0x##q##r##s##p +#define r2(p,q,r,s) 0x##r##s##p##q +#define r3(p,q,r,s) 0x##s##p##q##r +#define w0(p) 0x000000##p +#define w1(p) 0x0000##p##00 +#define w2(p) 0x00##p##0000 +#define w3(p) 0x##p##000000 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +/* data for forward tables (other than last round) */ + +#define f_table \ + r(a5,63,63,c6), r(84,7c,7c,f8), r(99,77,77,ee), r(8d,7b,7b,f6), \ + r(0d,f2,f2,ff), r(bd,6b,6b,d6), r(b1,6f,6f,de), r(54,c5,c5,91), \ + r(50,30,30,60), r(03,01,01,02), r(a9,67,67,ce), r(7d,2b,2b,56), \ + r(19,fe,fe,e7), r(62,d7,d7,b5), r(e6,ab,ab,4d), r(9a,76,76,ec), \ + r(45,ca,ca,8f), r(9d,82,82,1f), r(40,c9,c9,89), r(87,7d,7d,fa), \ + r(15,fa,fa,ef), r(eb,59,59,b2), r(c9,47,47,8e), r(0b,f0,f0,fb), \ + r(ec,ad,ad,41), r(67,d4,d4,b3), r(fd,a2,a2,5f), r(ea,af,af,45), \ + r(bf,9c,9c,23), r(f7,a4,a4,53), r(96,72,72,e4), r(5b,c0,c0,9b), \ + r(c2,b7,b7,75), r(1c,fd,fd,e1), r(ae,93,93,3d), r(6a,26,26,4c), \ + r(5a,36,36,6c), r(41,3f,3f,7e), r(02,f7,f7,f5), r(4f,cc,cc,83), \ + r(5c,34,34,68), r(f4,a5,a5,51), r(34,e5,e5,d1), r(08,f1,f1,f9), \ + r(93,71,71,e2), r(73,d8,d8,ab), r(53,31,31,62), r(3f,15,15,2a), \ + r(0c,04,04,08), r(52,c7,c7,95), r(65,23,23,46), r(5e,c3,c3,9d), \ + r(28,18,18,30), r(a1,96,96,37), r(0f,05,05,0a), r(b5,9a,9a,2f), \ + r(09,07,07,0e), r(36,12,12,24), r(9b,80,80,1b), r(3d,e2,e2,df), \ + r(26,eb,eb,cd), r(69,27,27,4e), r(cd,b2,b2,7f), r(9f,75,75,ea), \ + r(1b,09,09,12), r(9e,83,83,1d), r(74,2c,2c,58), r(2e,1a,1a,34), \ + r(2d,1b,1b,36), r(b2,6e,6e,dc), r(ee,5a,5a,b4), r(fb,a0,a0,5b), \ + r(f6,52,52,a4), r(4d,3b,3b,76), r(61,d6,d6,b7), r(ce,b3,b3,7d), \ + r(7b,29,29,52), r(3e,e3,e3,dd), r(71,2f,2f,5e), r(97,84,84,13), \ + r(f5,53,53,a6), r(68,d1,d1,b9), r(00,00,00,00), r(2c,ed,ed,c1), \ + r(60,20,20,40), r(1f,fc,fc,e3), r(c8,b1,b1,79), r(ed,5b,5b,b6), \ + r(be,6a,6a,d4), r(46,cb,cb,8d), r(d9,be,be,67), r(4b,39,39,72), \ + r(de,4a,4a,94), r(d4,4c,4c,98), r(e8,58,58,b0), r(4a,cf,cf,85), \ + r(6b,d0,d0,bb), r(2a,ef,ef,c5), r(e5,aa,aa,4f), r(16,fb,fb,ed), \ + r(c5,43,43,86), r(d7,4d,4d,9a), r(55,33,33,66), r(94,85,85,11), \ + r(cf,45,45,8a), r(10,f9,f9,e9), r(06,02,02,04), r(81,7f,7f,fe), \ + r(f0,50,50,a0), r(44,3c,3c,78), r(ba,9f,9f,25), r(e3,a8,a8,4b), \ + r(f3,51,51,a2), r(fe,a3,a3,5d), r(c0,40,40,80), r(8a,8f,8f,05), \ + r(ad,92,92,3f), r(bc,9d,9d,21), r(48,38,38,70), r(04,f5,f5,f1), \ + r(df,bc,bc,63), r(c1,b6,b6,77), r(75,da,da,af), r(63,21,21,42), \ + r(30,10,10,20), r(1a,ff,ff,e5), r(0e,f3,f3,fd), r(6d,d2,d2,bf), \ + r(4c,cd,cd,81), r(14,0c,0c,18), r(35,13,13,26), r(2f,ec,ec,c3), \ + r(e1,5f,5f,be), r(a2,97,97,35), r(cc,44,44,88), r(39,17,17,2e), \ + r(57,c4,c4,93), r(f2,a7,a7,55), r(82,7e,7e,fc), r(47,3d,3d,7a), \ + r(ac,64,64,c8), r(e7,5d,5d,ba), r(2b,19,19,32), r(95,73,73,e6), \ + r(a0,60,60,c0), r(98,81,81,19), r(d1,4f,4f,9e), r(7f,dc,dc,a3), \ + r(66,22,22,44), r(7e,2a,2a,54), r(ab,90,90,3b), r(83,88,88,0b), \ + r(ca,46,46,8c), r(29,ee,ee,c7), r(d3,b8,b8,6b), r(3c,14,14,28), \ + r(79,de,de,a7), r(e2,5e,5e,bc), r(1d,0b,0b,16), r(76,db,db,ad), \ + r(3b,e0,e0,db), r(56,32,32,64), r(4e,3a,3a,74), r(1e,0a,0a,14), \ + r(db,49,49,92), r(0a,06,06,0c), r(6c,24,24,48), r(e4,5c,5c,b8), \ + r(5d,c2,c2,9f), r(6e,d3,d3,bd), r(ef,ac,ac,43), r(a6,62,62,c4), \ + r(a8,91,91,39), r(a4,95,95,31), r(37,e4,e4,d3), r(8b,79,79,f2), \ + r(32,e7,e7,d5), r(43,c8,c8,8b), r(59,37,37,6e), r(b7,6d,6d,da), \ + r(8c,8d,8d,01), r(64,d5,d5,b1), r(d2,4e,4e,9c), r(e0,a9,a9,49), \ + r(b4,6c,6c,d8), r(fa,56,56,ac), r(07,f4,f4,f3), r(25,ea,ea,cf), \ + r(af,65,65,ca), r(8e,7a,7a,f4), r(e9,ae,ae,47), r(18,08,08,10), \ + r(d5,ba,ba,6f), r(88,78,78,f0), r(6f,25,25,4a), r(72,2e,2e,5c), \ + r(24,1c,1c,38), r(f1,a6,a6,57), r(c7,b4,b4,73), r(51,c6,c6,97), \ + r(23,e8,e8,cb), r(7c,dd,dd,a1), r(9c,74,74,e8), r(21,1f,1f,3e), \ + r(dd,4b,4b,96), r(dc,bd,bd,61), r(86,8b,8b,0d), r(85,8a,8a,0f), \ + r(90,70,70,e0), r(42,3e,3e,7c), r(c4,b5,b5,71), r(aa,66,66,cc), \ + r(d8,48,48,90), r(05,03,03,06), r(01,f6,f6,f7), r(12,0e,0e,1c), \ + r(a3,61,61,c2), r(5f,35,35,6a), r(f9,57,57,ae), r(d0,b9,b9,69), \ + r(91,86,86,17), r(58,c1,c1,99), r(27,1d,1d,3a), r(b9,9e,9e,27), \ + r(38,e1,e1,d9), r(13,f8,f8,eb), r(b3,98,98,2b), r(33,11,11,22), \ + r(bb,69,69,d2), r(70,d9,d9,a9), r(89,8e,8e,07), r(a7,94,94,33), \ + r(b6,9b,9b,2d), r(22,1e,1e,3c), r(92,87,87,15), r(20,e9,e9,c9), \ + r(49,ce,ce,87), r(ff,55,55,aa), r(78,28,28,50), r(7a,df,df,a5), \ + r(8f,8c,8c,03), r(f8,a1,a1,59), r(80,89,89,09), r(17,0d,0d,1a), \ + r(da,bf,bf,65), r(31,e6,e6,d7), r(c6,42,42,84), r(b8,68,68,d0), \ + r(c3,41,41,82), r(b0,99,99,29), r(77,2d,2d,5a), r(11,0f,0f,1e), \ + r(cb,b0,b0,7b), r(fc,54,54,a8), r(d6,bb,bb,6d), r(3a,16,16,2c) + +/* generate the required tables in the desired endian format */ + +#undef r +#define r r0 + +const word rijndael_enc_ft_tab[ 4 ][ 256 ] = { + { f_table }, +#undef r +#define r r1 + { f_table }, +#undef r +#define r r2 + { f_table }, +#undef r +#define r r3 + { f_table } +}; + +/* generate the required tables in the desired endian format */ + +#undef r +#define r(p,q,r,s) w0(q) +const word rijndael_enc_fl_tab[ 4 ][ 256 ] = { + { f_table }, +#undef r +#define r(p,q,r,s) w1(q) + { f_table }, +#undef r +#define r(p,q,r,s) w2(q) + { f_table }, +#undef r +#define r(p,q,r,s) w3(q) + { f_table } +}; + +#define m_table \ + r(00,00,00,00), r(0b,0d,09,0e), r(16,1a,12,1c), r(1d,17,1b,12), \ + r(2c,34,24,38), r(27,39,2d,36), r(3a,2e,36,24), r(31,23,3f,2a), \ + r(58,68,48,70), r(53,65,41,7e), r(4e,72,5a,6c), r(45,7f,53,62), \ + r(74,5c,6c,48), r(7f,51,65,46), r(62,46,7e,54), r(69,4b,77,5a), \ + r(b0,d0,90,e0), r(bb,dd,99,ee), r(a6,ca,82,fc), r(ad,c7,8b,f2), \ + r(9c,e4,b4,d8), r(97,e9,bd,d6), r(8a,fe,a6,c4), r(81,f3,af,ca), \ + r(e8,b8,d8,90), r(e3,b5,d1,9e), r(fe,a2,ca,8c), r(f5,af,c3,82), \ + r(c4,8c,fc,a8), r(cf,81,f5,a6), r(d2,96,ee,b4), r(d9,9b,e7,ba), \ + r(7b,bb,3b,db), r(70,b6,32,d5), r(6d,a1,29,c7), r(66,ac,20,c9), \ + r(57,8f,1f,e3), r(5c,82,16,ed), r(41,95,0d,ff), r(4a,98,04,f1), \ + r(23,d3,73,ab), r(28,de,7a,a5), r(35,c9,61,b7), r(3e,c4,68,b9), \ + r(0f,e7,57,93), r(04,ea,5e,9d), r(19,fd,45,8f), r(12,f0,4c,81), \ + r(cb,6b,ab,3b), r(c0,66,a2,35), r(dd,71,b9,27), r(d6,7c,b0,29), \ + r(e7,5f,8f,03), r(ec,52,86,0d), r(f1,45,9d,1f), r(fa,48,94,11), \ + r(93,03,e3,4b), r(98,0e,ea,45), r(85,19,f1,57), r(8e,14,f8,59), \ + r(bf,37,c7,73), r(b4,3a,ce,7d), r(a9,2d,d5,6f), r(a2,20,dc,61), \ + r(f6,6d,76,ad), r(fd,60,7f,a3), r(e0,77,64,b1), r(eb,7a,6d,bf), \ + r(da,59,52,95), r(d1,54,5b,9b), r(cc,43,40,89), r(c7,4e,49,87), \ + r(ae,05,3e,dd), r(a5,08,37,d3), r(b8,1f,2c,c1), r(b3,12,25,cf), \ + r(82,31,1a,e5), r(89,3c,13,eb), r(94,2b,08,f9), r(9f,26,01,f7), \ + r(46,bd,e6,4d), r(4d,b0,ef,43), r(50,a7,f4,51), r(5b,aa,fd,5f), \ + r(6a,89,c2,75), r(61,84,cb,7b), r(7c,93,d0,69), r(77,9e,d9,67), \ + r(1e,d5,ae,3d), r(15,d8,a7,33), r(08,cf,bc,21), r(03,c2,b5,2f), \ + r(32,e1,8a,05), r(39,ec,83,0b), r(24,fb,98,19), r(2f,f6,91,17), \ + r(8d,d6,4d,76), r(86,db,44,78), r(9b,cc,5f,6a), r(90,c1,56,64), \ + r(a1,e2,69,4e), r(aa,ef,60,40), r(b7,f8,7b,52), r(bc,f5,72,5c), \ + r(d5,be,05,06), r(de,b3,0c,08), r(c3,a4,17,1a), r(c8,a9,1e,14), \ + r(f9,8a,21,3e), r(f2,87,28,30), r(ef,90,33,22), r(e4,9d,3a,2c), \ + r(3d,06,dd,96), r(36,0b,d4,98), r(2b,1c,cf,8a), r(20,11,c6,84), \ + r(11,32,f9,ae), r(1a,3f,f0,a0), r(07,28,eb,b2), r(0c,25,e2,bc), \ + r(65,6e,95,e6), r(6e,63,9c,e8), r(73,74,87,fa), r(78,79,8e,f4), \ + r(49,5a,b1,de), r(42,57,b8,d0), r(5f,40,a3,c2), r(54,4d,aa,cc), \ + r(f7,da,ec,41), r(fc,d7,e5,4f), r(e1,c0,fe,5d), r(ea,cd,f7,53), \ + r(db,ee,c8,79), r(d0,e3,c1,77), r(cd,f4,da,65), r(c6,f9,d3,6b), \ + r(af,b2,a4,31), r(a4,bf,ad,3f), r(b9,a8,b6,2d), r(b2,a5,bf,23), \ + r(83,86,80,09), r(88,8b,89,07), r(95,9c,92,15), r(9e,91,9b,1b), \ + r(47,0a,7c,a1), r(4c,07,75,af), r(51,10,6e,bd), r(5a,1d,67,b3), \ + r(6b,3e,58,99), r(60,33,51,97), r(7d,24,4a,85), r(76,29,43,8b), \ + r(1f,62,34,d1), r(14,6f,3d,df), r(09,78,26,cd), r(02,75,2f,c3), \ + r(33,56,10,e9), r(38,5b,19,e7), r(25,4c,02,f5), r(2e,41,0b,fb), \ + r(8c,61,d7,9a), r(87,6c,de,94), r(9a,7b,c5,86), r(91,76,cc,88), \ + r(a0,55,f3,a2), r(ab,58,fa,ac), r(b6,4f,e1,be), r(bd,42,e8,b0), \ + r(d4,09,9f,ea), r(df,04,96,e4), r(c2,13,8d,f6), r(c9,1e,84,f8), \ + r(f8,3d,bb,d2), r(f3,30,b2,dc), r(ee,27,a9,ce), r(e5,2a,a0,c0), \ + r(3c,b1,47,7a), r(37,bc,4e,74), r(2a,ab,55,66), r(21,a6,5c,68), \ + r(10,85,63,42), r(1b,88,6a,4c), r(06,9f,71,5e), r(0d,92,78,50), \ + r(64,d9,0f,0a), r(6f,d4,06,04), r(72,c3,1d,16), r(79,ce,14,18), \ + r(48,ed,2b,32), r(43,e0,22,3c), r(5e,f7,39,2e), r(55,fa,30,20), \ + r(01,b7,9a,ec), r(0a,ba,93,e2), r(17,ad,88,f0), r(1c,a0,81,fe), \ + r(2d,83,be,d4), r(26,8e,b7,da), r(3b,99,ac,c8), r(30,94,a5,c6), \ + r(59,df,d2,9c), r(52,d2,db,92), r(4f,c5,c0,80), r(44,c8,c9,8e), \ + r(75,eb,f6,a4), r(7e,e6,ff,aa), r(63,f1,e4,b8), r(68,fc,ed,b6), \ + r(b1,67,0a,0c), r(ba,6a,03,02), r(a7,7d,18,10), r(ac,70,11,1e), \ + r(9d,53,2e,34), r(96,5e,27,3a), r(8b,49,3c,28), r(80,44,35,26), \ + r(e9,0f,42,7c), r(e2,02,4b,72), r(ff,15,50,60), r(f4,18,59,6e), \ + r(c5,3b,66,44), r(ce,36,6f,4a), r(d3,21,74,58), r(d8,2c,7d,56), \ + r(7a,0c,a1,37), r(71,01,a8,39), r(6c,16,b3,2b), r(67,1b,ba,25), \ + r(56,38,85,0f), r(5d,35,8c,01), r(40,22,97,13), r(4b,2f,9e,1d), \ + r(22,64,e9,47), r(29,69,e0,49), r(34,7e,fb,5b), r(3f,73,f2,55), \ + r(0e,50,cd,7f), r(05,5d,c4,71), r(18,4a,df,63), r(13,47,d6,6d), \ + r(ca,dc,31,d7), r(c1,d1,38,d9), r(dc,c6,23,cb), r(d7,cb,2a,c5), \ + r(e6,e8,15,ef), r(ed,e5,1c,e1), r(f0,f2,07,f3), r(fb,ff,0e,fd), \ + r(92,b4,79,a7), r(99,b9,70,a9), r(84,ae,6b,bb), r(8f,a3,62,b5), \ + r(be,80,5d,9f), r(b5,8d,54,91), r(a8,9a,4f,83), r(a3,97,46,8d) + +#undef r +#define r r0 + +const word rijndael_enc_im_tab[ 4 ][ 256 ] = { + { m_table }, +#undef r +#define r r1 + { m_table }, +#undef r +#define r r2 + { m_table }, +#undef r +#define r r3 + { m_table } +}; diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/default/rijndael_enc.wasm b/targets/wasm-tacle/sequential/rijndael_enc/generated/default/rijndael_enc.wasm new file mode 100755 index 0000000000000000000000000000000000000000..31420e67b7d94b93e97d9a9041ef72b5a9233daa GIT binary patch literal 53709 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�I$!83Dv0 zfHnxAB?72|0O})v3kcvW0!TyvhY`RN1aK1pyg~r)5x`0WunhssM*wpWKwktf2mwq+ z03#59BLc8P0Imoi2Lh;s07@W$JP4ow0ti3=1_aOv0YoE!76_m%0;q=oR0u$g0CWhT z3j&Bi0L>9VD+JIG0aQf*4hTSj0Ma9XoCu&I0w{_A@*{wP2w(*Q*o*)cA%M9EpbrA* zj{v42fRPB`JOVg{0CpmPBM9Iz0=R|%-Xeex2w)uo*oXj@Ab{xzpceudiU1}cfYAux zDgrox0CppQeF)$o0=R59a^Pl`r zOa5mk|J}&{GUUH6`JadUFG&7JlKpVz|7()}&B*^Yx|i z|6j@f=j8t)@_!EbzmELhK>m*+|EG}u!^r<0#b#G~|CS@;@E< zUzhx^LH@TS|67y)Ci1@<`EMZq)#U#Y@_!cjzk>YVM*fc>|0j|E1IYh=EYA z{yUNXS;+s)|3LD;H~GJm{GU$#uO$CBlmBxwa z|69rb<>dbZ^8Xh3|Azd3NB*B6|1XjMN67y~^1n0rZzlhP$^TIDzbg4(kNodI{x>53 z9m#(M`JajWcPIaglm8XSe;@K+N&Y_~|8J20&&dBTu zVBQko;dy{;wtfoymV0`R_{p=Oq72lKE|E0z8?|MSTI1?2xG@_!BaKaKn!LH_q5|A$Ca$L>p< zCcKskSJA%zQ#aaZZeh^tH6hVvQ#C_Gghn5z;f+}p6lBzxOlos|zh?E+L0XMTtq%&} z9XjFNhG283CQzp~nGC^YOSjahjizY5DbT3V=>3BI0u9l+AOrts!Wd_WHt2P62EE3t zjSMyz`KaJ%b2MvCet4|#*Z_^z+$@xzys8f|Ym5;A8oef1Yi8Xk4+~YtXaZP!q|p$g z2?~fa1!{RNT9ern8>%sC)F#%S%MEA(;IW_R$>LFjTLJ;i+r&L9GqZ!g}-uGe4kKV>Fq0{D1n;X!b+L1L9&d z!RjDQP}OL&*%)myM`*PA;zi?xW6LIVI)3PFcz`-ETy2gFHJA+?9bxMxjV_oC7&U=v z9Y0c69jlJx?m)HP9AZ?PB6;qihS-Scz|cs8$)pX?>a^xKojNW+!>gg;k$fx<2v!F~ z>kQGthB%lyU7WBnjj$_fBd@kuZ3^ax;|lNAMyNxydQEkM-W+Q%8spUb99}ceKIvs` zXtdlJ5N!@;%N%U;cLVIZMRBZ&W9=^;YvKSC2beg(#M$!iFk6cAqS#f zO#A}Z-}eh#Vn>M`^}qhCRB@UUr#W$&6Q{Yq?=&YGOf=YEYA~^*#Eud>O8i;(Nap{K zpLH*OT~GYFp7?b=@!zNX&HjCg*im9fi5(?&l-N?pCL#Euewd#w1|WB4Vf7oj<>m*(X+Q zijdxxI!WC8{UeR)kO;LuzneIc-#V-hlDhl*3-9+=M@H)6{Db%v#s2)FXG5S#_QOj2 zwR){tp5goT3hNHm>NJWU9~hz5>TO*7{S8JfzvWo1^B3;0{qZCD)zJRonmD^3?`3_) zxJa}8kN27l(UJUiX$Q9-wjIpxSPpXham&FPL$IBjRKmvjjnRSO{*eZ)o?nLTkWMDC z^D!EPos-)52!Bb+I&fhtqJlDh?6=u58z)rM=SZ&-1-o=Vr6}b z`IJ_A6)zfXxw~WmiJyyEZ46-#f;DQ(@8MPya*T-9nYA%$U9_f^//q\13\84\84\97\a6SS\f5\b9\d1\d1h\00\00\00\00\c1\ed\ed,@ `\e3\fc\fc\1fy\b1\b1\c8\b6[[\ed\d4jj\be\8d\cb\cbFg\be\be\d9r99K\94JJ\de\98LL\d4\b0XX\e8\85\cf\cfJ\bb\d0\d0k\c5\ef\ef*O\aa\aa\e5\ed\fb\fb\16\86CC\c5\9aMM\d7f33U\11\85\85\94\8aEE\cf\e9\f9\f9\10\04\02\02\06\fe\7f\7f\81\a0PP\f0x<\1f\1f!\96KK\dda\bd\bd\dc\0d\8b\8b\86\0f\8a\8a\85\e0pp\90|>>Bq\b5\b5\c4\ccff\aa\90HH\d8\06\03\03\05\f7\f6\f6\01\1c\0e\0e\12\c2aa\a3j55_\aeWW\f9i\b9\b9\d0\17\86\86\91\99\c1\c1X:\1d\1d''\9e\9e\b9\d9\e1\e18\eb\f8\f8\13+\98\98\b3\22\11\113\d2ii\bb\a9\d9\d9p\07\8e\8e\893\94\94\a7-\9b\9b\b6<\1e\1e\22\15\87\87\92\c9\e9\e9 \87\ce\ceI\aaUU\ffP((x\a5\df\dfz\03\8c\8c\8fY\a1\a1\f8\09\89\89\80\1a\0d\0d\17e\bf\bf\da\d7\e6\e61\84BB\c6\d0hh\b8\82AA\c3)\99\99\b0Z--w\1e\0f\0f\11{\b0\b0\cb\a8TT\fcm\bb\bb\d6,\16\16:\a5\c6cc\84\f8||\99\eeww\8d\f6{{\0d\ff\f2\f2\bd\d6kk\b1\deooT\91\c5\c5P`00\03\02\01\01\a9\cegg}V++\19\e7\fe\feb\b5\d7\d7\e6M\ab\ab\9a\ecvvE\8f\ca\ca\9d\1f\82\82@\89\c9\c9\87\fa}}\15\ef\fa\fa\eb\b2YY\c9\8eGG\0b\fb\f0\f0\ecA\ad\adg\b3\d4\d4\fd_\a2\a2\eaE\af\af\bf#\9c\9c\f7S\a4\a4\96\e4rr[\9b\c0\c0\c2u\b7\b7\1c\e1\fd\fd\ae=\93\93jL&&Zl66A~??\02\f5\f7\f7O\83\cc\cc\5ch44\f4Q\a5\a54\d1\e5\e5\08\f9\f1\f1\93\e2qqs\ab\d8\d8Sb11?*\15\15\0c\08\04\04R\95\c7\c7eF##^\9d\c3\c3(0\18\18\a17\96\96\0f\0a\05\05\b5/\9a\9a\09\0e\07\076$\12\12\9b\1b\80\80=\df\e2\e2&\cd\eb\ebiN''\cd\7f\b2\b2\9f\eauu\1b\12\09\09\9e\1d\83\83tX,,.4\1a\1a-6\1b\1b\b2\dcnn\ee\b4ZZ\fb[\a0\a0\f6\a4RRMv;;a\b7\d6\d6\ce}\b3\b3{R))>\dd\e3\e3q^//\97\13\84\84\f5\a6SSh\b9\d1\d1\00\00\00\00,\c1\ed\ed`@ \1f\e3\fc\fc\c8y\b1\b1\ed\b6[[\be\d4jjF\8d\cb\cb\d9g\be\beKr99\de\94JJ\d4\98LL\e8\b0XXJ\85\cf\cfk\bb\d0\d0*\c5\ef\ef\e5O\aa\aa\16\ed\fb\fb\c5\86CC\d7\9aMMUf33\94\11\85\85\cf\8aEE\10\e9\f9\f9\06\04\02\02\81\fe\7f\7f\f0\a0PPDx<<\ba%\9f\9f\e3K\a8\a8\f3\a2QQ\fe]\a3\a3\c0\80@@\8a\05\8f\8f\ad?\92\92\bc!\9d\9dHp88\04\f1\f5\f5\dfc\bc\bc\c1w\b6\b6u\af\da\dacB!!0 \10\10\1a\e5\ff\ff\0e\fd\f3\f3m\bf\d2\d2L\81\cd\cd\14\18\0c\0c5&\13\13/\c3\ec\ec\e1\be__\a25\97\97\cc\88DD9.\17\17W\93\c4\c4\f2U\a7\a7\82\fc~~Gz==\ac\c8dd\e7\ba]]+2\19\19\95\e6ss\a0\c0``\98\19\81\81\d1\9eOO\7f\a3\dc\dcfD\22\22~T**\ab;\90\90\83\0b\88\88\ca\8cFF)\c7\ee\ee\d3k\b8\b8<(\14\14y\a7\de\de\e2\bc^^\1d\16\0b\0bv\ad\db\db;\db\e0\e0Vd22Nt::\1e\14\0a\0a\db\92II\0a\0c\06\06lH$$\e4\b8\5c\5c]\9f\c2\c2n\bd\d3\d3\efC\ac\ac\a6\c4bb\a89\91\91\a41\95\957\d3\e4\e4\8b\f2yy2\d5\e7\e7C\8b\c8\c8Yn77\b7\damm\8c\01\8d\8dd\b1\d5\d5\d2\9cNN\e0I\a9\a9\b4\d8ll\fa\acVV\07\f3\f4\f4%\cf\ea\ea\af\caee\8e\f4zz\e9G\ae\ae\18\10\08\08\d5o\ba\ba\88\f0xxoJ%%r\5c..$8\1c\1c\f1W\a6\a6\c7s\b4\b4Q\97\c6\c6#\cb\e8\e8|\a1\dd\dd\9c\e8tt!>\1f\1f\dd\96KK\dca\bd\bd\86\0d\8b\8b\85\0f\8a\8a\90\e0ppB|>>\c4q\b5\b5\aa\ccff\d8\90HH\05\06\03\03\01\f7\f6\f6\12\1c\0e\0e\a3\c2aa_j55\f9\aeWW\d0i\b9\b9\91\17\86\86X\99\c1\c1':\1d\1d\b9'\9e\9e8\d9\e1\e1\13\eb\f8\f8\b3+\98\983\22\11\11\bb\d2iip\a9\d9\d9\89\07\8e\8e\a73\94\94\b6-\9b\9b\22<\1e\1e\92\15\87\87 \c9\e9\e9I\87\ce\ce\ff\aaUUxP((z\a5\df\df\8f\03\8c\8c\f8Y\a1\a1\80\09\89\89\17\1a\0d\0d\dae\bf\bf1\d7\e6\e6\c6\84BB\b8\d0hh\c3\82AA\b0)\99\99wZ--\11\1e\0f\0f\cb{\b0\b0\fc\a8TT\d6m\bb\bb:,\16\16c\a5\c6c|\84\f8|w\99\eew{\8d\f6{\f2\0d\ff\f2k\bd\d6ko\b1\deo\c5T\91\c50P`0\01\03\02\01g\a9\ceg+}V+\fe\19\e7\fe\d7b\b5\d7\ab\e6M\abv\9a\ecv\caE\8f\ca\82\9d\1f\82\c9@\89\c9}\87\fa}\fa\15\ef\faY\eb\b2YG\c9\8eG\f0\0b\fb\f0\ad\ecA\ad\d4g\b3\d4\a2\fd_\a2\af\eaE\af\9c\bf#\9c\a4\f7S\a4r\96\e4r\c0[\9b\c0\b7\c2u\b7\fd\1c\e1\fd\93\ae=\93&jL&6Zl6?A~?\f7\02\f5\f7\ccO\83\cc4\5ch4\a5\f4Q\a5\e54\d1\e5\f1\08\f9\f1q\93\e2q\d8s\ab\d81Sb1\15?*\15\04\0c\08\04\c7R\95\c7#eF#\c3^\9d\c3\18(0\18\96\a17\96\05\0f\0a\05\9a\b5/\9a\07\09\0e\07\126$\12\80\9b\1b\80\e2=\df\e2\eb&\cd\eb'iN'\b2\cd\7f\b2u\9f\eau\09\1b\12\09\83\9e\1d\83,tX,\1a.4\1a\1b-6\1bn\b2\dcnZ\ee\b4Z\a0\fb[\a0R\f6\a4R;Mv;\d6a\b7\d6\b3\ce}\b3){R)\e3>\dd\e3/q^/\84\97\13\84S\f5\a6S\d1h\b9\d1\00\00\00\00\ed,\c1\ed `@ \fc\1f\e3\fc\b1\c8y\b1[\ed\b6[j\be\d4j\cbF\8d\cb\be\d9g\be9Kr9J\de\94JL\d4\98LX\e8\b0X\cfJ\85\cf\d0k\bb\d0\ef*\c5\ef\aa\e5O\aa\fb\16\ed\fbC\c5\86CM\d7\9aM3Uf3\85\94\11\85E\cf\8aE\f9\10\e9\f9\02\06\04\02\7f\81\fe\7fP\f0\a0P\1fK\dd\96K\bd\dca\bd\8b\86\0d\8b\8a\85\0f\8ap\90\e0p>B|>\b5\c4q\b5f\aa\ccfH\d8\90H\03\05\06\03\f6\01\f7\f6\0e\12\1c\0ea\a3\c2a5_j5W\f9\aeW\b9\d0i\b9\86\91\17\86\c1X\99\c1\1d':\1d\9e\b9'\9e\e18\d9\e1\f8\13\eb\f8\98\b3+\98\113\22\11i\bb\d2i\d9p\a9\d9\8e\89\07\8e\94\a73\94\9b\b6-\9b\1e\22<\1e\87\92\15\87\e9 \c9\e9\ceI\87\ceU\ff\aaU(xP(\dfz\a5\df\8c\8f\03\8c\a1\f8Y\a1\89\80\09\89\0d\17\1a\0d\bf\dae\bf\e61\d7\e6B\c6\84Bh\b8\d0hA\c3\82A\99\b0)\99-wZ-\0f\11\1e\0f\b0\cb{\b0T\fc\a8T\bb\d6m\bb\16:,\16cc\a5\c6||\84\f8ww\99\ee{{\8d\f6\f2\f2\0d\ffkk\bd\d6oo\b1\de\c5\c5T\9100P`\01\01\03\02gg\a9\ce++}V\fe\fe\19\e7\d7\d7b\b5\ab\ab\e6Mvv\9a\ec\ca\caE\8f\82\82\9d\1f\c9\c9@\89}}\87\fa\fa\fa\15\efYY\eb\b2GG\c9\8e\f0\f0\0b\fb\ad\ad\ecA\d4\d4g\b3\a2\a2\fd_\af\af\eaE\9c\9c\bf#\a4\a4\f7Srr\96\e4\c0\c0[\9b\b7\b7\c2u\fd\fd\1c\e1\93\93\ae=&&jL66Zl??A~\f7\f7\02\f5\cc\ccO\8344\5ch\a5\a5\f4Q\e5\e54\d1\f1\f1\08\f9qq\93\e2\d8\d8s\ab11Sb\15\15?*\04\04\0c\08\c7\c7R\95##eF\c3\c3^\9d\18\18(0\96\96\a17\05\05\0f\0a\9a\9a\b5/\07\07\09\0e\12\126$\80\80\9b\1b\e2\e2=\df\eb\eb&\cd''iN\b2\b2\cd\7fuu\9f\ea\09\09\1b\12\83\83\9e\1d,,tX\1a\1a.4\1b\1b-6nn\b2\dcZZ\ee\b4\a0\a0\fb[RR\f6\a4;;Mv\d6\d6a\b7\b3\b3\ce})){R\e3\e3>\dd//q^\84\84\97\13SS\f5\a6\d1\d1h\b9\00\00\00\00\ed\ed,\c1 `@\fc\fc\1f\e3\b1\b1\c8y[[\ed\b6jj\be\d4\cb\cbF\8d\be\be\d9g99KrJJ\de\94LL\d4\98XX\e8\b0\cf\cfJ\85\d0\d0k\bb\ef\ef*\c5\aa\aa\e5O\fb\fb\16\edCC\c5\86MM\d7\9a33Uf\85\85\94\11EE\cf\8a\f9\f9\10\e9\02\02\06\04\7f\7f\81\fePP\f0\a0<KK\dd\96\bd\bd\dca\8b\8b\86\0d\8a\8a\85\0fpp\90\e0>>B|\b5\b5\c4qff\aa\ccHH\d8\90\03\03\05\06\f6\f6\01\f7\0e\0e\12\1caa\a3\c255_jWW\f9\ae\b9\b9\d0i\86\86\91\17\c1\c1X\99\1d\1d':\9e\9e\b9'\e1\e18\d9\f8\f8\13\eb\98\98\b3+\11\113\22ii\bb\d2\d9\d9p\a9\8e\8e\89\07\94\94\a73\9b\9b\b6-\1e\1e\22<\87\87\92\15\e9\e9 \c9\ce\ceI\87UU\ff\aa((xP\df\dfz\a5\8c\8c\8f\03\a1\a1\f8Y\89\89\80\09\0d\0d\17\1a\bf\bf\dae\e6\e61\d7BB\c6\84hh\b8\d0AA\c3\82\99\99\b0)--wZ\0f\0f\11\1e\b0\b0\cb{TT\fc\a8\bb\bb\d6m\16\16:,c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00c\00\00\00|\00\00\00w\00\00\00{\00\00\00\f2\00\00\00k\00\00\00o\00\00\00\c5\00\00\000\00\00\00\01\00\00\00g\00\00\00+\00\00\00\fe\00\00\00\d7\00\00\00\ab\00\00\00v\00\00\00\ca\00\00\00\82\00\00\00\c9\00\00\00}\00\00\00\fa\00\00\00Y\00\00\00G\00\00\00\f0\00\00\00\ad\00\00\00\d4\00\00\00\a2\00\00\00\af\00\00\00\9c\00\00\00\a4\00\00\00r\00\00\00\c0\00\00\00\b7\00\00\00\fd\00\00\00\93\00\00\00&\00\00\006\00\00\00?\00\00\00\f7\00\00\00\cc\00\00\004\00\00\00\a5\00\00\00\e5\00\00\00\f1\00\00\00q\00\00\00\d8\00\00\001\00\00\00\15\00\00\00\04\00\00\00\c7\00\00\00#\00\00\00\c3\00\00\00\18\00\00\00\96\00\00\00\05\00\00\00\9a\00\00\00\07\00\00\00\12\00\00\00\80\00\00\00\e2\00\00\00\eb\00\00\00'\00\00\00\b2\00\00\00u\00\00\00\09\00\00\00\83\00\00\00,\00\00\00\1a\00\00\00\1b\00\00\00n\00\00\00Z\00\00\00\a0\00\00\00R\00\00\00;\00\00\00\d6\00\00\00\b3\00\00\00)\00\00\00\e3\00\00\00/\00\00\00\84\00\00\00S\00\00\00\d1\00\00\00\00\00\00\00\ed\00\00\00 \00\00\00\fc\00\00\00\b1\00\00\00[\00\00\00j\00\00\00\cb\00\00\00\be\00\00\009\00\00\00J\00\00\00L\00\00\00X\00\00\00\cf\00\00\00\d0\00\00\00\ef\00\00\00\aa\00\00\00\fb\00\00\00C\00\00\00M\00\00\003\00\00\00\85\00\00\00E\00\00\00\f9\00\00\00\02\00\00\00\7f\00\00\00P\00\00\00<\00\00\00\9f\00\00\00\a8\00\00\00Q\00\00\00\a3\00\00\00@\00\00\00\8f\00\00\00\92\00\00\00\9d\00\00\008\00\00\00\f5\00\00\00\bc\00\00\00\b6\00\00\00\da\00\00\00!\00\00\00\10\00\00\00\ff\00\00\00\f3\00\00\00\d2\00\00\00\cd\00\00\00\0c\00\00\00\13\00\00\00\ec\00\00\00_\00\00\00\97\00\00\00D\00\00\00\17\00\00\00\c4\00\00\00\a7\00\00\00~\00\00\00=\00\00\00d\00\00\00]\00\00\00\19\00\00\00s\00\00\00`\00\00\00\81\00\00\00O\00\00\00\dc\00\00\00\22\00\00\00*\00\00\00\90\00\00\00\88\00\00\00F\00\00\00\ee\00\00\00\b8\00\00\00\14\00\00\00\de\00\00\00^\00\00\00\0b\00\00\00\db\00\00\00\e0\00\00\002\00\00\00:\00\00\00\0a\00\00\00I\00\00\00\06\00\00\00$\00\00\00\5c\00\00\00\c2\00\00\00\d3\00\00\00\ac\00\00\00b\00\00\00\91\00\00\00\95\00\00\00\e4\00\00\00y\00\00\00\e7\00\00\00\c8\00\00\007\00\00\00m\00\00\00\8d\00\00\00\d5\00\00\00N\00\00\00\a9\00\00\00l\00\00\00V\00\00\00\f4\00\00\00\ea\00\00\00e\00\00\00z\00\00\00\ae\00\00\00\08\00\00\00\ba\00\00\00x\00\00\00%\00\00\00.\00\00\00\1c\00\00\00\a6\00\00\00\b4\00\00\00\c6\00\00\00\e8\00\00\00\dd\00\00\00t\00\00\00\1f\00\00\00K\00\00\00\bd\00\00\00\8b\00\00\00\8a\00\00\00p\00\00\00>\00\00\00\b5\00\00\00f\00\00\00H\00\00\00\03\00\00\00\f6\00\00\00\0e\00\00\00a\00\00\005\00\00\00W\00\00\00\b9\00\00\00\86\00\00\00\c1\00\00\00\1d\00\00\00\9e\00\00\00\e1\00\00\00\f8\00\00\00\98\00\00\00\11\00\00\00i\00\00\00\d9\00\00\00\8e\00\00\00\94\00\00\00\9b\00\00\00\1e\00\00\00\87\00\00\00\e9\00\00\00\ce\00\00\00U\00\00\00(\00\00\00\df\00\00\00\8c\00\00\00\a1\00\00\00\89\00\00\00\0d\00\00\00\bf\00\00\00\e6\00\00\00B\00\00\00h\00\00\00A\00\00\00\99\00\00\00-\00\00\00\0f\00\00\00\b0\00\00\00T\00\00\00\bb\00\00\00\16\00\00\00\00\0e\09\0d\0b\1c\12\1a\16\12\1b\17\1d8$4,6-9'$6.:*?#1pHhX~AeSlZrNbS\7fEHl\5ctFeQ\7fT~FbZwKi\e0\90\d0\b0\ee\99\dd\bb\fc\82\ca\a6\f2\8b\c7\ad\d8\b4\e4\9c\d6\bd\e9\97\c4\a6\fe\8a\ca\af\f3\81\90\d8\b8\e8\9e\d1\b5\e3\8c\ca\a2\fe\82\c3\af\f5\a8\fc\8c\c4\a6\f5\81\cf\b4\ee\96\d2\ba\e7\9b\d9\db;\bb{\d52\b6p\c7)\a1m\c9 \acf\e3\1f\8fW\ed\16\82\5c\ff\0d\95A\f1\04\98J\abs\d3#\a5z\de(\b7a\c95\b9h\c4>\93W\e7\0f\9d^\ea\04\8fE\fd\19\81L\f0\12;\abk\cb5\a2f\c0'\b9q\dd)\b0|\d6\03\8f_\e7\0d\86R\ec\1f\9dE\f1\11\94H\faK\e3\03\93E\ea\0e\98W\f1\19\85Y\f8\14\8es\c77\bf}\ce:\b4o\d5-\a9a\dc \a2\advm\f6\a3\7f`\fd\b1dw\e0\bfmz\eb\95RY\da\9b[T\d1\89@C\cc\87IN\c7\dd>\05\ae\d37\08\a5\c1,\1f\b8\cf%\12\b3\e5\1a1\82\eb\13<\89\f9\08+\94\f7\01&\9fM\e6\bdFC\ef\b0MQ\f4\a7P_\fd\aa[u\c2\89j{\cb\84ai\d0\93|g\d9\9ew=\ae\d5\1e3\a7\d8\15!\bc\cf\08/\b5\c2\03\05\8a\e12\0b\83\ec9\19\98\fb$\17\91\f6/vM\d6\8dxD\db\86j_\cc\9bdV\c1\90Ni\e2\a1@`\ef\aaR{\f8\b7\5cr\f5\bc\06\05\be\d5\08\0c\b3\de\1a\17\a4\c3\14\1e\a9\c8>!\8a\f90(\87\f2\223\90\ef,:\9d\e4\96\dd\06=\98\d4\0b6\8a\cf\1c+\84\c6\11 \ae\f92\11\a0\f0?\1a\b2\eb(\07\bc\e2%\0c\e6\95ne\e8\9ccn\fa\87ts\f4\8eyx\de\b1ZI\d0\b8WB\c2\a3@_\cc\aaMTA\ec\da\f7O\e5\d7\fc]\fe\c0\e1S\f7\cd\eay\c8\ee\dbw\c1\e3\d0e\da\f4\cdk\d3\f9\c61\a4\b2\af?\ad\bf\a4-\b6\a8\b9#\bf\a5\b2\09\80\86\83\07\89\8b\88\15\92\9c\95\1b\9b\91\9e\a1|\0aG\afu\07L\bdn\10Q\b3g\1dZ\99X>k\97Q3`\85J$}\8bC)v\d14b\1f\df=o\14\cd&x\09\c3/u\02\e9\10V3\e7\19[8\f5\02L%\fb\0bA.\9a\d7a\8c\94\del\87\86\c5{\9a\88\ccv\91\a2\f3U\a0\ac\faX\ab\be\e1O\b6\b0\e8B\bd\ea\9f\09\d4\e4\96\04\df\f6\8d\13\c2\f8\84\1e\c9\d2\bb=\f8\dc\b20\f3\ce\a9'\ee\c0\a0*\e5zG\b1\b9h\c4\0f\93W\e7\04\9d^\ea\19\8fE\fd\12\81L\f0\cb;\abk\c05\a2f\dd'\b9q\d6)\b0|\e7\03\8f_\ec\0d\86R\f1\1f\9dE\fa\11\94H\93K\e3\03\98E\ea\0e\85W\f1\19\8eY\f8\14\bfs\c77\b4}\ce:\a9o\d5-\a2a\dc \f6\advm\fd\a3\7f`\e0\b1dw\eb\bfmz\da\95RY\d1\9b[T\cc\89@C\c7\87IN\ae\dd>\05\a5\d37\08\b8\c1,\1f\b3\cf%\12\82\e5\1a1\89\eb\13<\94\f9\08+\9f\f7\01&FM\e6\bdMC\ef\b0PQ\f4\a7[_\fd\aaju\c2\89a{\cb\84|i\d0\93wg\d9\9e\1e=\ae\d5\153\a7\d8\08!\bc\cf\03/\b5\c22\05\8a\e19\0b\83\ec$\19\98\fb/\17\91\f6\8dvM\d6\86xD\db\9bj_\cc\90dV\c1\a1Ni\e2\aa@`\ef\b7R{\f8\bc\5cr\f5\d5\06\05\be\de\08\0c\b3\c3\1a\17\a4\c8\14\1e\a9\f9>!\8a\f20(\87\ef\223\90\e4,:\9d=\96\dd\066\98\d4\0b+\8a\cf\1c \84\c6\11\11\ae\f92\1a\a0\f0?\07\b2\eb(\0c\bc\e2%e\e6\95nn\e8\9ccs\fa\87tx\f4\8eyI\de\b1ZB\d0\b8W_\c2\a3@T\cc\aaM\f7A\ec\da\fcO\e5\d7\e1]\fe\c0\eaS\f7\cd\dby\c8\ee\d0w\c1\e3\cde\da\f4\c6k\d3\f9\af1\a4\b2\a4?\ad\bf\b9-\b6\a8\b2#\bf\a5\83\09\80\86\88\07\89\8b\95\15\92\9c\9e\1b\9b\91G\a1|\0aL\afu\07Q\bdn\10Z\b3g\1dk\99X>`\97Q3}\85J$v\8bC)\1f\d14b\14\df=o\09\cd&x\02\c3/u3\e9\10V8\e7\19[%\f5\02L.\fb\0bA\8c\9a\d7a\87\94\del\9a\86\c5{\91\88\ccv\a0\a2\f3U\ab\ac\faX\b6\be\e1O\bd\b0\e8B\d4\ea\9f\09\df\e4\96\04\c2\f6\8d\13\c9\f8\84\1e\f8\d2\bb=\f3\dc\b20\ee\ce\a9'\e5\c0\a0*\b9h\e7\0f\93W\ea\04\9d^\fd\19\8fE\f0\12\81Lk\cb;\abf\c05\a2q\dd'\b9|\d6)\b0_\e7\03\8fR\ec\0d\86E\f1\1f\9dH\fa\11\94\03\93K\e3\0e\98E\ea\19\85W\f1\14\8eY\f87\bfs\c7:\b4}\ce-\a9o\d5 \a2a\dcm\f6\adv`\fd\a3\7fw\e0\b1dz\eb\bfmY\da\95RT\d1\9b[C\cc\89@N\c7\87I\05\ae\dd>\08\a5\d37\1f\b8\c1,\12\b3\cf%1\82\e5\1a<\89\eb\13+\94\f9\08&\9f\f7\01\bdFM\e6\b0MC\ef\a7PQ\f4\aa[_\fd\89ju\c2\84a{\cb\93|i\d0\9ewg\d9\d5\1e=\ae\d8\153\a7\cf\08!\bc\c2\03/\b5\e12\05\8a\ec9\0b\83\fb$\19\98\f6/\17\91\d6\8dvM\db\86xD\cc\9bj_\c1\90dV\e2\a1Ni\ef\aa@`\f8\b7R{\f5\bc\5cr\be\d5\06\05\b3\de\08\0c\a4\c3\1a\17\a9\c8\14\1e\8a\f9>!\87\f20(\90\ef\223\9d\e4,:\06=\96\dd\0b6\98\d4\1c+\8a\cf\11 \84\c62\11\ae\f9?\1a\a0\f0(\07\b2\eb%\0c\bc\e2ne\e6\95cn\e8\9cts\fa\87yx\f4\8eZI\de\b1WB\d0\b8@_\c2\a3MT\cc\aa\da\f7A\ec\d7\fcO\e5\c0\e1]\fe\cd\eaS\f7\ee\dby\c8\e3\d0w\c1\f4\cde\da\f9\c6k\d3\b2\af1\a4\bf\a4?\ad\a8\b9-\b6\a5\b2#\bf\86\83\09\80\8b\88\07\89\9c\95\15\92\91\9e\1b\9b\0aG\a1|\07L\afu\10Q\bdn\1dZ\b3g>k\99X3`\97Q$}\85J)v\8bCb\1f\d14o\14\df=x\09\cd&u\02\c3/V3\e9\10[8\e7\19L%\f5\02A.\fb\0ba\8c\9a\d7l\87\94\de{\9a\86\c5v\91\88\ccU\a0\a2\f3X\ab\ac\faO\b6\be\e1B\bd\b0\e8\09\d4\ea\9f\04\df\e4\96\13\c2\f6\8d\1e\c9\f8\84=\f8\d2\bb0\f3\dc\b2'\ee\ce\a9*\e5\c0\a0\b1\b9W\e7\0f\93^\ea\04\9dE\fd\19\8fL\f0\12\81\abk\cb;\a2f\c05\b9q\dd'\b0|\d6)\8f_\e7\03\86R\ec\0d\9dE\f1\1f\94H\fa\11\e3\03\93K\ea\0e\98E\f1\19\85W\f8\14\8eY\c77\bfs\ce:\b4}\d5-\a9o\dc \a2avm\f6\ad\7f`\fd\a3dw\e0\b1mz\eb\bfRY\da\95[T\d1\9b@C\cc\89IN\c7\87>\05\ae\dd7\08\a5\d3,\1f\b8\c1%\12\b3\cf\1a1\82\e5\13<\89\eb\08+\94\f9\01&\9f\f7\e6\bdFM\ef\b0MC\f4\a7PQ\fd\aa[_\c2\89ju\cb\84a{\d0\93|i\d9\9ewg\ae\d5\1e=\a7\d8\153\bc\cf\08!\b5\c2\03/\8a\e12\05\83\ec9\0b\98\fb$\19\91\f6/\17M\d6\8dvD\db\86x_\cc\9bjV\c1\90di\e2\a1N`\ef\aa@{\f8\b7Rr\f5\bc\5c\05\be\d5\06\0c\b3\de\08\17\a4\c3\1a\1e\a9\c8\14!\8a\f9>(\87\f203\90\ef\22:\9d\e4,\dd\06=\96\d4\0b6\98\cf\1c+\8a\c6\11 \84\f92\11\ae\f0?\1a\a0\eb(\07\b2\e2%\0c\bc\95ne\e6\9ccn\e8\87ts\fa\8eyx\f4\b1ZI\de\b8WB\d0\a3@_\c2\aaMT\cc\ec\da\f7A\e5\d7\fcO\fe\c0\e1]\f7\cd\eaS\c8\ee\dby\c1\e3\d0w\da\f4\cde\d3\f9\c6k\a4\b2\af1\ad\bf\a4?\b6\a8\b9-\bf\a5\b2#\80\86\83\09\89\8b\88\07\92\9c\95\15\9b\91\9e\1b|\0aG\a1u\07L\afn\10Q\bdg\1dZ\b3X>k\99Q3`\97J$}\85C)v\8b4b\1f\d1=o\14\df&x\09\cd/u\02\c3\10V3\e9\19[8\e7\02L%\f5\0bA.\fb\d7a\8c\9a\del\87\94\c5{\9a\86\ccv\91\88\f3U\a0\a2\faX\ab\ac\e1O\b6\be\e8B\bd\b0\9f\09\d4\ea\96\04\df\e4\8d\13\c2\f6\84\1e\c9\f8\bb=\f8\d2\b20\f3\dc\a9'\ee\ce\a0*\e5\c0G\b1, Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of 128, + bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. +*/ + +#include "aes.h" + +#include "aestab.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define four_tables(x, tab, vf, rf, c) \ + (tab[0][bval(vf(x, 0, c), rf(0, c))] ^ \ + tab[1][bval(vf(x, 1, c), rf(1, c))] ^ \ + tab[2][bval(vf(x, 2, c), rf(2, c))] ^ \ + tab[3][bval(vf(x, 3, c), rf(3, c))]) + +#define vf1(x, r, c) (x) +#define rf1(r, c) (r) +#define rf2(r, c) ((r - c) & 3) + +#define ls_box(x, c) four_tables(x, rijndael_enc_fl_tab, vf1, rf2, c) + +#define inv_mcol(x) four_tables(x, rijndael_enc_im_tab, vf1, rf1, 0) + +/* + Subroutine to set the block size (if variable) in bytes, legal + values being 16, 24 and 32. +*/ + +#define nc (Ncol) + +/* + Initialise the key schedule from the user supplied key. The key + length is now specified in bytes - 16, 24 or 32 as appropriate. + This corresponds to bit lengths of 128, 192 and 256 bits, and + to Nk values of 4, 6 and 8 respectively. +*/ + +#define mx(t, f) (*t++ = inv_mcol(*f), f++) +#define cp(t, f) *t++ = *f++ + +#define cpy(d, s) \ + do { \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + } while (0) // min 1 max 1 +#define mix(d, s) \ + do { \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + } while (0) // min 1 max 1 + +aes_ret +rijndael_enc_set_key(byte in_key[], const word n_bytes, const enum aes_key f, + struct aes *cx) { + word *kf, *kt, rci; + + if ((n_bytes & 7) || n_bytes < 16 || n_bytes > 32 || (!(f & 1) && !(f & 2))) + return (n_bytes ? cx->mode &= ~0x03, + aes_bad : (aes_ret) (cx->Nkey << 2)); + + cx->mode = (cx->mode & ~0x03) | ((byte) f & 0x03); + cx->Nkey = n_bytes >> 2; + cx->Nrnd = Nr(cx->Nkey, (word) nc); + + cx->e_key[0] = word_in(in_key); + cx->e_key[1] = word_in(in_key + 4); + cx->e_key[2] = word_in(in_key + 8); + cx->e_key[3] = word_in(in_key + 12); + + kf = cx->e_key; + kt = kf + nc * (cx->Nrnd + 1) - cx->Nkey; + rci = 0; + + switch (cx->Nkey) { + case 4: + __pragma_loopbound(0, 0); + do { + kf[4] = kf[0] ^ ls_box(kf[3], 3) ^ rijndael_enc_rcon_tab[rci++]; + kf[5] = kf[1] ^ kf[4]; + kf[6] = kf[2] ^ kf[5]; + kf[7] = kf[3] ^ kf[6]; + kf += 4; + } while (kf < kt); + break; + + case 6: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + __pragma_loopbound(0, 0); + do { + kf[6] = kf[0] ^ ls_box(kf[5], 3) ^ rijndael_enc_rcon_tab[rci++]; + kf[7] = kf[1] ^ kf[6]; + kf[8] = kf[2] ^ kf[7]; + kf[9] = kf[3] ^ kf[8]; + kf[10] = kf[4] ^ kf[9]; + kf[11] = kf[5] ^ kf[10]; + kf += 6; + } while (kf < kt); + break; + + case 8: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + cx->e_key[6] = word_in(in_key + 24); + cx->e_key[7] = word_in(in_key + 28); + __pragma_loopbound(7, 7); + do { + kf[8] = kf[0] ^ ls_box(kf[7], 3) ^ rijndael_enc_rcon_tab[rci++]; + kf[9] = kf[1] ^ kf[8]; + kf[10] = kf[2] ^ kf[9]; + kf[11] = kf[3] ^ kf[10]; + kf[12] = kf[4] ^ ls_box(kf[11], 0); + kf[13] = kf[5] ^ kf[12]; + kf[14] = kf[6] ^ kf[13]; + kf[15] = kf[7] ^ kf[14]; + kf += 8; + } while (kf < kt); + break; + } + + if ((cx->mode & 3) != enc) { + word i; + + kt = cx->d_key + nc * cx->Nrnd; + kf = cx->e_key; + + cpy(kt, kf); + kt -= 2 * nc; + + __pragma_loopbound(0, 0); + for (i = 1; i < cx->Nrnd; ++i) { + mix(kt, kf); + kt -= 2 * nc; + } + + cpy(kt, kf); + } + + return aes_good; +} + +short +rijndael_enc_encrypt(unsigned char in_blk[], unsigned char out_blk[], + const struct aes *cx) { + const unsigned long *kp = cx->e_key; + if (!(cx->mode & 1)) + return 0; + unsigned long b0[4]; + b0[0] = *(unsigned long *) in_blk ^ kp[0]; + b0[1] = *(unsigned long *) (in_blk + 4) ^ kp[1]; + b0[2] = *(unsigned long *) (in_blk + 8) ^ kp[2]; + b0[3] = *(unsigned long *) (in_blk + 12) ^ kp[3]; + kp += 4; + unsigned long b1[4]; + switch (cx->Nrnd) { + case 14: + b1[0] = + kp[0] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + kp += 8; + case 12: + b1[0] = + kp[0] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + kp += 8; + case 10: + b1[0] = + kp[0] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 8)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 8)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 8)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 8)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 12)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 12)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 12)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 12)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 16)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 16)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 16)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 16)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 20)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 20)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 20)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 20)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 24)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 24)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 24)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 24)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 28)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 28)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 28)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 28)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 32)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 32)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 32)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 32)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 36)[0] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 36)[1] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 36)[2] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 36)[3] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[2] >> 24))]); + } + *(unsigned long *) out_blk = (b0[0]); + *(unsigned long *) (out_blk + 4) = (b0[1]); + *(unsigned long *) (out_blk + 8) = (b0[2]); + *(unsigned long *) (out_blk + 12) = (b0[3]); + return aes_good; +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aes.h b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aes.h new file mode 100644 index 0000000..a0f34e6 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aes.h @@ -0,0 +1,167 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + 1. FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of + 128 bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. + + 2. THE CIPHER INTERFACE + + byte (an unsigned 8-bit type) + word (an unsigned 32-bit type) + aes_ret: (a signed 16 bit type for function return values) + aes_good (value != 0, a good return) + aes_bad (value == 0, an error return) + enum aes_key: (encryption direction) + enc (set key for encryption) + dec (set key for decryption) + both (set key for both) + class or struct aes (structure for context) + + C subroutine calls: + + aes_ret set_blk(const word block_length, aes *cx) (variable block size) + aes_ret set_key(const byte key[ ], const word key_length, + const enum aes_key direction, aes *cx) + aes_ret encrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + aes_ret decrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + + IMPORTANT NOTE: If you are using this C interface and your compiler does + not set the memory used for objects to zero before use, you will need to + ensure that cx.mode is set to zero before using the C subroutine calls. + + The block length inputs to set_block and set_key are in numbers of + BYTES, not bits. The calls to subroutines must be made in the above + order but multiple calls can be made without repeating earlier calls + if their parameters have not changed. If the cipher block length is + variable but set_blk has not been called before cipher operations a + value of 16 is assumed (that is, the AES block size). In contrast to + earlier versions the block and key length parameters are now checked + for correctness and the encryption and decryption routines check to + ensure that an appropriate key has been set before they are called. + +*/ + +#ifndef _AES_H +#define _AES_H + +/* The only supported block size for the benchmark is 16 */ +#define BLOCK_SIZE 16 + +/* + The number of key schedule words for different block and key lengths + (allowing for the method of computation which requires the length to + be a multiple of the key length): + + Key Schedule key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 44 60 54 56 64 + length 20 | 60 60 66 70 80 + (bytes) 24 | 80 80 78 84 96 + 28 | 100 100 102 98 112 + 32 | 120 120 120 126 120 + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + The following values assume that the key length will be variable and may + be of maximum length (32 bytes). + + Nk = number_of_key_bytes / 4 + Nc = number_of_columns_in_state / 4 + Nr = number of encryption/decryption rounds + Rc = number of elements in rcon table + Ks = number of 32-bit words in key schedule +*/ + +#define Nr(Nk, Nc) ((Nk > Nc ? Nk : Nc) + 6) +#define Rc(Nk, Nc) ((Nb * (Nr(Nk, Nc) + 1) - 1) / Nk) +#define Ks(Nk, Nc) (Nk * (Rc(Nk, Nc) + 1)) + +#define RC_LENGTH 5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11) +#define KS_LENGTH 4 * BLOCK_SIZE + +/* End of configuration options, but see also aes.c */ + +typedef unsigned char byte; /* must be an 8-bit storage unit */ +typedef unsigned long word; /* must be a 32-bit storage unit */ +typedef short aes_ret; /* function return value */ + +#define aes_bad 0 +#define aes_good 1 + +/* + upr(x,n): rotates bytes within words by n positions, moving bytes + to higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word +*/ + +#define upr(x, n) (((x) << 8 * (n)) | ((x) >> (32 - 8 * (n)))) +#define ups(x, n) ((x) << 8 * (n)) +#define bval(x, n) ((byte) ((x) >> 8 * (n))) +#define byte_swap(x) (upr(x, 1) & 0x00ff00ff | upr(x, 3) & 0xff00ff00) +#define bytes2word(b0, b1, b2, b3) \ + ((word) (b3) << 24 | (word) (b2) << 16 | (word) (b1) << 8 | (b0)) + +#define word_in(x) *(word *) (x) +#define word_out(x, v) *(word *) (x) = (v) + +enum aes_const { + Nrow = 4, /* the number of rows in the cipher state */ + Mcol = 8, /* maximum number of columns in the state */ + Ncol = BLOCK_SIZE / 4, + Shr0 = 0, /* the cyclic shift values for rows 0, 1, 2 & 3 */ + Shr1 = 1, + Shr2 = BLOCK_SIZE == 32 ? 3 : 2, + Shr3 = BLOCK_SIZE == 32 ? 4 : 3 +}; + +enum aes_key { + enc = 1, /* set if encryption is needed */ + dec = 2, /* set if decryption is needed */ + both = 3 /* set if both are needed */ +}; + +struct aes { + word Nkey; /* the number of words in the key input block */ + word Nrnd; /* the number of cipher rounds */ + word e_key[KS_LENGTH]; /* the encryption key schedule */ + word d_key[KS_LENGTH]; /* the decryption key schedule */ + byte mode; /* encrypt, decrypt or both */ +}; + +aes_ret rijndael_enc_set_key(byte key[], const word n_bytes, + const enum aes_key f, struct aes *cx); +aes_ret rijndael_enc_encrypt(byte in_blk[], byte out_blk[], + const struct aes *cx); + +#endif diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aestab.h b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aestab.h new file mode 100644 index 0000000..22b96dc --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/aestab.h @@ -0,0 +1,294 @@ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +/* + Used to ensure table is generated in the right format + depending on the internal byte order required. +*/ + +#define w0(p) 0x000000##p + +/* + Number of elements required in this table for different + block and key lengths is: + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + this table can be a table of bytes if the key schedule + code is adjusted accordingly +*/ + +const word rijndael_enc_rcon_tab[29] = { + w0(01), w0(02), w0(04), w0(08), w0(10), w0(20), w0(40), w0(80), + w0(1b), w0(36), w0(6c), w0(d8), w0(ab), w0(4d), w0(9a), w0(2f), + w0(5e), w0(bc), w0(63), w0(c6), w0(97), w0(35), w0(6a), w0(d4), + w0(b3), w0(7d), w0(fa), w0(ef), w0(c5)}; + +#undef w0 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +#define r0(p, q, r, s) 0x##p##q##r##s +#define r1(p, q, r, s) 0x##q##r##s##p +#define r2(p, q, r, s) 0x##r##s##p##q +#define r3(p, q, r, s) 0x##s##p##q##r +#define w0(p) 0x000000##p +#define w1(p) 0x0000##p##00 +#define w2(p) 0x00##p##0000 +#define w3(p) 0x##p##000000 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +/* data for forward tables (other than last round) */ + +#define f_table \ + r(a5, 63, 63, c6), r(84, 7c, 7c, f8), r(99, 77, 77, ee), \ + r(8d, 7b, 7b, f6), r(0d, f2, f2, ff), r(bd, 6b, 6b, d6), \ + r(b1, 6f, 6f, de), r(54, c5, c5, 91), r(50, 30, 30, 60), \ + r(03, 01, 01, 02), r(a9, 67, 67, ce), r(7d, 2b, 2b, 56), \ + r(19, fe, fe, e7), r(62, d7, d7, b5), r(e6, ab, ab, 4d), \ + r(9a, 76, 76, ec), r(45, ca, ca, 8f), r(9d, 82, 82, 1f), \ + r(40, c9, c9, 89), r(87, 7d, 7d, fa), r(15, fa, fa, ef), \ + r(eb, 59, 59, b2), r(c9, 47, 47, 8e), r(0b, f0, f0, fb), \ + r(ec, ad, ad, 41), r(67, d4, d4, b3), r(fd, a2, a2, 5f), \ + r(ea, af, af, 45), r(bf, 9c, 9c, 23), r(f7, a4, a4, 53), \ + r(96, 72, 72, e4), r(5b, c0, c0, 9b), r(c2, b7, b7, 75), \ + r(1c, fd, fd, e1), r(ae, 93, 93, 3d), r(6a, 26, 26, 4c), \ + r(5a, 36, 36, 6c), r(41, 3f, 3f, 7e), r(02, f7, f7, f5), \ + r(4f, cc, cc, 83), r(5c, 34, 34, 68), r(f4, a5, a5, 51), \ + r(34, e5, e5, d1), r(08, f1, f1, f9), r(93, 71, 71, e2), \ + r(73, d8, d8, ab), r(53, 31, 31, 62), r(3f, 15, 15, 2a), \ + r(0c, 04, 04, 08), r(52, c7, c7, 95), r(65, 23, 23, 46), \ + r(5e, c3, c3, 9d), r(28, 18, 18, 30), r(a1, 96, 96, 37), \ + r(0f, 05, 05, 0a), r(b5, 9a, 9a, 2f), r(09, 07, 07, 0e), \ + r(36, 12, 12, 24), r(9b, 80, 80, 1b), r(3d, e2, e2, df), \ + r(26, eb, eb, cd), r(69, 27, 27, 4e), r(cd, b2, b2, 7f), \ + r(9f, 75, 75, ea), r(1b, 09, 09, 12), r(9e, 83, 83, 1d), \ + r(74, 2c, 2c, 58), r(2e, 1a, 1a, 34), r(2d, 1b, 1b, 36), \ + r(b2, 6e, 6e, dc), r(ee, 5a, 5a, b4), r(fb, a0, a0, 5b), \ + r(f6, 52, 52, a4), r(4d, 3b, 3b, 76), r(61, d6, d6, b7), \ + r(ce, b3, b3, 7d), r(7b, 29, 29, 52), r(3e, e3, e3, dd), \ + r(71, 2f, 2f, 5e), r(97, 84, 84, 13), r(f5, 53, 53, a6), \ + r(68, d1, d1, b9), r(00, 00, 00, 00), r(2c, ed, ed, c1), \ + r(60, 20, 20, 40), r(1f, fc, fc, e3), r(c8, b1, b1, 79), \ + r(ed, 5b, 5b, b6), r(be, 6a, 6a, d4), r(46, cb, cb, 8d), \ + r(d9, be, be, 67), r(4b, 39, 39, 72), r(de, 4a, 4a, 94), \ + r(d4, 4c, 4c, 98), r(e8, 58, 58, b0), r(4a, cf, cf, 85), \ + r(6b, d0, d0, bb), r(2a, ef, ef, c5), r(e5, aa, aa, 4f), \ + r(16, fb, fb, ed), r(c5, 43, 43, 86), r(d7, 4d, 4d, 9a), \ + r(55, 33, 33, 66), r(94, 85, 85, 11), r(cf, 45, 45, 8a), \ + r(10, f9, f9, e9), r(06, 02, 02, 04), r(81, 7f, 7f, fe), \ + r(f0, 50, 50, a0), r(44, 3c, 3c, 78), r(ba, 9f, 9f, 25), \ + r(e3, a8, a8, 4b), r(f3, 51, 51, a2), r(fe, a3, a3, 5d), \ + r(c0, 40, 40, 80), r(8a, 8f, 8f, 05), r(ad, 92, 92, 3f), \ + r(bc, 9d, 9d, 21), r(48, 38, 38, 70), r(04, f5, f5, f1), \ + r(df, bc, bc, 63), r(c1, b6, b6, 77), r(75, da, da, af), \ + r(63, 21, 21, 42), r(30, 10, 10, 20), r(1a, ff, ff, e5), \ + r(0e, f3, f3, fd), r(6d, d2, d2, bf), r(4c, cd, cd, 81), \ + r(14, 0c, 0c, 18), r(35, 13, 13, 26), r(2f, ec, ec, c3), \ + r(e1, 5f, 5f, be), r(a2, 97, 97, 35), r(cc, 44, 44, 88), \ + r(39, 17, 17, 2e), r(57, c4, c4, 93), r(f2, a7, a7, 55), \ + r(82, 7e, 7e, fc), r(47, 3d, 3d, 7a), r(ac, 64, 64, c8), \ + r(e7, 5d, 5d, ba), r(2b, 19, 19, 32), r(95, 73, 73, e6), \ + r(a0, 60, 60, c0), r(98, 81, 81, 19), r(d1, 4f, 4f, 9e), \ + r(7f, dc, dc, a3), r(66, 22, 22, 44), r(7e, 2a, 2a, 54), \ + r(ab, 90, 90, 3b), r(83, 88, 88, 0b), r(ca, 46, 46, 8c), \ + r(29, ee, ee, c7), r(d3, b8, b8, 6b), r(3c, 14, 14, 28), \ + r(79, de, de, a7), r(e2, 5e, 5e, bc), r(1d, 0b, 0b, 16), \ + r(76, db, db, ad), r(3b, e0, e0, db), r(56, 32, 32, 64), \ + r(4e, 3a, 3a, 74), r(1e, 0a, 0a, 14), r(db, 49, 49, 92), \ + r(0a, 06, 06, 0c), r(6c, 24, 24, 48), r(e4, 5c, 5c, b8), \ + r(5d, c2, c2, 9f), r(6e, d3, d3, bd), r(ef, ac, ac, 43), \ + r(a6, 62, 62, c4), r(a8, 91, 91, 39), r(a4, 95, 95, 31), \ + r(37, e4, e4, d3), r(8b, 79, 79, f2), r(32, e7, e7, d5), \ + r(43, c8, c8, 8b), r(59, 37, 37, 6e), r(b7, 6d, 6d, da), \ + r(8c, 8d, 8d, 01), r(64, d5, d5, b1), r(d2, 4e, 4e, 9c), \ + r(e0, a9, a9, 49), r(b4, 6c, 6c, d8), r(fa, 56, 56, ac), \ + r(07, f4, f4, f3), r(25, ea, ea, cf), r(af, 65, 65, ca), \ + r(8e, 7a, 7a, f4), r(e9, ae, ae, 47), r(18, 08, 08, 10), \ + r(d5, ba, ba, 6f), r(88, 78, 78, f0), r(6f, 25, 25, 4a), \ + r(72, 2e, 2e, 5c), r(24, 1c, 1c, 38), r(f1, a6, a6, 57), \ + r(c7, b4, b4, 73), r(51, c6, c6, 97), r(23, e8, e8, cb), \ + r(7c, dd, dd, a1), r(9c, 74, 74, e8), r(21, 1f, 1f, 3e), \ + r(dd, 4b, 4b, 96), r(dc, bd, bd, 61), r(86, 8b, 8b, 0d), \ + r(85, 8a, 8a, 0f), r(90, 70, 70, e0), r(42, 3e, 3e, 7c), \ + r(c4, b5, b5, 71), r(aa, 66, 66, cc), r(d8, 48, 48, 90), \ + r(05, 03, 03, 06), r(01, f6, f6, f7), r(12, 0e, 0e, 1c), \ + r(a3, 61, 61, c2), r(5f, 35, 35, 6a), r(f9, 57, 57, ae), \ + r(d0, b9, b9, 69), r(91, 86, 86, 17), r(58, c1, c1, 99), \ + r(27, 1d, 1d, 3a), r(b9, 9e, 9e, 27), r(38, e1, e1, d9), \ + r(13, f8, f8, eb), r(b3, 98, 98, 2b), r(33, 11, 11, 22), \ + r(bb, 69, 69, d2), r(70, d9, d9, a9), r(89, 8e, 8e, 07), \ + r(a7, 94, 94, 33), r(b6, 9b, 9b, 2d), r(22, 1e, 1e, 3c), \ + r(92, 87, 87, 15), r(20, e9, e9, c9), r(49, ce, ce, 87), \ + r(ff, 55, 55, aa), r(78, 28, 28, 50), r(7a, df, df, a5), \ + r(8f, 8c, 8c, 03), r(f8, a1, a1, 59), r(80, 89, 89, 09), \ + r(17, 0d, 0d, 1a), r(da, bf, bf, 65), r(31, e6, e6, d7), \ + r(c6, 42, 42, 84), r(b8, 68, 68, d0), r(c3, 41, 41, 82), \ + r(b0, 99, 99, 29), r(77, 2d, 2d, 5a), r(11, 0f, 0f, 1e), \ + r(cb, b0, b0, 7b), r(fc, 54, 54, a8), r(d6, bb, bb, 6d), \ + r(3a, 16, 16, 2c) + +/* generate the required tables in the desired endian format */ + +#undef r +#define r r0 + +const word rijndael_enc_ft_tab[4][256] = {{f_table}, +#undef r +#define r r1 + {f_table}, +#undef r +#define r r2 + {f_table}, +#undef r +#define r r3 + {f_table}}; + +/* generate the required tables in the desired endian format */ + +#undef r +#define r(p, q, r, s) w0(q) +const word rijndael_enc_fl_tab[4][256] = {{f_table}, +#undef r +#define r(p, q, r, s) w1(q) + {f_table}, +#undef r +#define r(p, q, r, s) w2(q) + {f_table}, +#undef r +#define r(p, q, r, s) w3(q) + {f_table}}; + +#define m_table \ + r(00, 00, 00, 00), r(0b, 0d, 09, 0e), r(16, 1a, 12, 1c), \ + r(1d, 17, 1b, 12), r(2c, 34, 24, 38), r(27, 39, 2d, 36), \ + r(3a, 2e, 36, 24), r(31, 23, 3f, 2a), r(58, 68, 48, 70), \ + r(53, 65, 41, 7e), r(4e, 72, 5a, 6c), r(45, 7f, 53, 62), \ + r(74, 5c, 6c, 48), r(7f, 51, 65, 46), r(62, 46, 7e, 54), \ + r(69, 4b, 77, 5a), r(b0, d0, 90, e0), r(bb, dd, 99, ee), \ + r(a6, ca, 82, fc), r(ad, c7, 8b, f2), r(9c, e4, b4, d8), \ + r(97, e9, bd, d6), r(8a, fe, a6, c4), r(81, f3, af, ca), \ + r(e8, b8, d8, 90), r(e3, b5, d1, 9e), r(fe, a2, ca, 8c), \ + r(f5, af, c3, 82), r(c4, 8c, fc, a8), r(cf, 81, f5, a6), \ + r(d2, 96, ee, b4), r(d9, 9b, e7, ba), r(7b, bb, 3b, db), \ + r(70, b6, 32, d5), r(6d, a1, 29, c7), r(66, ac, 20, c9), \ + r(57, 8f, 1f, e3), r(5c, 82, 16, ed), r(41, 95, 0d, ff), \ + r(4a, 98, 04, f1), r(23, d3, 73, ab), r(28, de, 7a, a5), \ + r(35, c9, 61, b7), r(3e, c4, 68, b9), r(0f, e7, 57, 93), \ + r(04, ea, 5e, 9d), r(19, fd, 45, 8f), r(12, f0, 4c, 81), \ + r(cb, 6b, ab, 3b), r(c0, 66, a2, 35), r(dd, 71, b9, 27), \ + r(d6, 7c, b0, 29), r(e7, 5f, 8f, 03), r(ec, 52, 86, 0d), \ + r(f1, 45, 9d, 1f), r(fa, 48, 94, 11), r(93, 03, e3, 4b), \ + r(98, 0e, ea, 45), r(85, 19, f1, 57), r(8e, 14, f8, 59), \ + r(bf, 37, c7, 73), r(b4, 3a, ce, 7d), r(a9, 2d, d5, 6f), \ + r(a2, 20, dc, 61), r(f6, 6d, 76, ad), r(fd, 60, 7f, a3), \ + r(e0, 77, 64, b1), r(eb, 7a, 6d, bf), r(da, 59, 52, 95), \ + r(d1, 54, 5b, 9b), r(cc, 43, 40, 89), r(c7, 4e, 49, 87), \ + r(ae, 05, 3e, dd), r(a5, 08, 37, d3), r(b8, 1f, 2c, c1), \ + r(b3, 12, 25, cf), r(82, 31, 1a, e5), r(89, 3c, 13, eb), \ + r(94, 2b, 08, f9), r(9f, 26, 01, f7), r(46, bd, e6, 4d), \ + r(4d, b0, ef, 43), r(50, a7, f4, 51), r(5b, aa, fd, 5f), \ + r(6a, 89, c2, 75), r(61, 84, cb, 7b), r(7c, 93, d0, 69), \ + r(77, 9e, d9, 67), r(1e, d5, ae, 3d), r(15, d8, a7, 33), \ + r(08, cf, bc, 21), r(03, c2, b5, 2f), r(32, e1, 8a, 05), \ + r(39, ec, 83, 0b), r(24, fb, 98, 19), r(2f, f6, 91, 17), \ + r(8d, d6, 4d, 76), r(86, db, 44, 78), r(9b, cc, 5f, 6a), \ + r(90, c1, 56, 64), r(a1, e2, 69, 4e), r(aa, ef, 60, 40), \ + r(b7, f8, 7b, 52), r(bc, f5, 72, 5c), r(d5, be, 05, 06), \ + r(de, b3, 0c, 08), r(c3, a4, 17, 1a), r(c8, a9, 1e, 14), \ + r(f9, 8a, 21, 3e), r(f2, 87, 28, 30), r(ef, 90, 33, 22), \ + r(e4, 9d, 3a, 2c), r(3d, 06, dd, 96), r(36, 0b, d4, 98), \ + r(2b, 1c, cf, 8a), r(20, 11, c6, 84), r(11, 32, f9, ae), \ + r(1a, 3f, f0, a0), r(07, 28, eb, b2), r(0c, 25, e2, bc), \ + r(65, 6e, 95, e6), r(6e, 63, 9c, e8), r(73, 74, 87, fa), \ + r(78, 79, 8e, f4), r(49, 5a, b1, de), r(42, 57, b8, d0), \ + r(5f, 40, a3, c2), r(54, 4d, aa, cc), r(f7, da, ec, 41), \ + r(fc, d7, e5, 4f), r(e1, c0, fe, 5d), r(ea, cd, f7, 53), \ + r(db, ee, c8, 79), r(d0, e3, c1, 77), r(cd, f4, da, 65), \ + r(c6, f9, d3, 6b), r(af, b2, a4, 31), r(a4, bf, ad, 3f), \ + r(b9, a8, b6, 2d), r(b2, a5, bf, 23), r(83, 86, 80, 09), \ + r(88, 8b, 89, 07), r(95, 9c, 92, 15), r(9e, 91, 9b, 1b), \ + r(47, 0a, 7c, a1), r(4c, 07, 75, af), r(51, 10, 6e, bd), \ + r(5a, 1d, 67, b3), r(6b, 3e, 58, 99), r(60, 33, 51, 97), \ + r(7d, 24, 4a, 85), r(76, 29, 43, 8b), r(1f, 62, 34, d1), \ + r(14, 6f, 3d, df), r(09, 78, 26, cd), r(02, 75, 2f, c3), \ + r(33, 56, 10, e9), r(38, 5b, 19, e7), r(25, 4c, 02, f5), \ + r(2e, 41, 0b, fb), r(8c, 61, d7, 9a), r(87, 6c, de, 94), \ + r(9a, 7b, c5, 86), r(91, 76, cc, 88), r(a0, 55, f3, a2), \ + r(ab, 58, fa, ac), r(b6, 4f, e1, be), r(bd, 42, e8, b0), \ + r(d4, 09, 9f, ea), r(df, 04, 96, e4), r(c2, 13, 8d, f6), \ + r(c9, 1e, 84, f8), r(f8, 3d, bb, d2), r(f3, 30, b2, dc), \ + r(ee, 27, a9, ce), r(e5, 2a, a0, c0), r(3c, b1, 47, 7a), \ + r(37, bc, 4e, 74), r(2a, ab, 55, 66), r(21, a6, 5c, 68), \ + r(10, 85, 63, 42), r(1b, 88, 6a, 4c), r(06, 9f, 71, 5e), \ + r(0d, 92, 78, 50), r(64, d9, 0f, 0a), r(6f, d4, 06, 04), \ + r(72, c3, 1d, 16), r(79, ce, 14, 18), r(48, ed, 2b, 32), \ + r(43, e0, 22, 3c), r(5e, f7, 39, 2e), r(55, fa, 30, 20), \ + r(01, b7, 9a, ec), r(0a, ba, 93, e2), r(17, ad, 88, f0), \ + r(1c, a0, 81, fe), r(2d, 83, be, d4), r(26, 8e, b7, da), \ + r(3b, 99, ac, c8), r(30, 94, a5, c6), r(59, df, d2, 9c), \ + r(52, d2, db, 92), r(4f, c5, c0, 80), r(44, c8, c9, 8e), \ + r(75, eb, f6, a4), r(7e, e6, ff, aa), r(63, f1, e4, b8), \ + r(68, fc, ed, b6), r(b1, 67, 0a, 0c), r(ba, 6a, 03, 02), \ + r(a7, 7d, 18, 10), r(ac, 70, 11, 1e), r(9d, 53, 2e, 34), \ + r(96, 5e, 27, 3a), r(8b, 49, 3c, 28), r(80, 44, 35, 26), \ + r(e9, 0f, 42, 7c), r(e2, 02, 4b, 72), r(ff, 15, 50, 60), \ + r(f4, 18, 59, 6e), r(c5, 3b, 66, 44), r(ce, 36, 6f, 4a), \ + r(d3, 21, 74, 58), r(d8, 2c, 7d, 56), r(7a, 0c, a1, 37), \ + r(71, 01, a8, 39), r(6c, 16, b3, 2b), r(67, 1b, ba, 25), \ + r(56, 38, 85, 0f), r(5d, 35, 8c, 01), r(40, 22, 97, 13), \ + r(4b, 2f, 9e, 1d), r(22, 64, e9, 47), r(29, 69, e0, 49), \ + r(34, 7e, fb, 5b), r(3f, 73, f2, 55), r(0e, 50, cd, 7f), \ + r(05, 5d, c4, 71), r(18, 4a, df, 63), r(13, 47, d6, 6d), \ + r(ca, dc, 31, d7), r(c1, d1, 38, d9), r(dc, c6, 23, cb), \ + r(d7, cb, 2a, c5), r(e6, e8, 15, ef), r(ed, e5, 1c, e1), \ + r(f0, f2, 07, f3), r(fb, ff, 0e, fd), r(92, b4, 79, a7), \ + r(99, b9, 70, a9), r(84, ae, 6b, bb), r(8f, a3, 62, b5), \ + r(be, 80, 5d, 9f), r(b5, 8d, 54, 91), r(a8, 9a, 4f, 83), \ + r(a3, 97, 46, 8d) + +#undef r +#define r r0 + +const word rijndael_enc_im_tab[4][256] = {{m_table}, +#undef r +#define r r1 + {m_table}, +#undef r +#define r r2 + {m_table}, +#undef r +#define r r3 + {m_table}}; diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/input_small.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/input_small.c new file mode 100644 index 0000000..0ff5948 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/input_small.c @@ -0,0 +1,2243 @@ + +unsigned char rijndael_enc_data[] = { + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', + 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', + 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', + 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', + 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', + 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', + 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', + 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n'}; diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc.c new file mode 100644 index 0000000..44a1c29 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc.c @@ -0,0 +1,238 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: rijndael_enc + + Author: Dr Brian Gladman + + Function: rijndael_enc is an implementation of the AES encryption + algorithm (Rijndael). + + Source: security section of MiBench + + Changes: Add computation of a checksum, refactoring + + License: see below + +*/ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +#include "aes.h" +#include "rijndael_enc_libc.h" + +/* + Global variable definitions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +unsigned char rijndael_enc_key[32]; +int rijndael_enc_key_len; + +extern unsigned char rijndael_enc_data[]; +struct rijndael_enc_FILE rijndael_enc_fin; + +int rijndael_enc_checksum = 0; + +/* + Forward declaration of functions +*/ +void rijndael_enc_init(void); +int rijndael_enc_return(void); +void rijndael_enc_fillrand(unsigned char *buf, int len); +void rijndael_enc_encfile(struct rijndael_enc_FILE *fin, struct aes *ctx); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_enc_main(void); + +void +rijndael_enc_init(void) { + /* create a pseudo-file for the input*/ + rijndael_enc_fin.data = rijndael_enc_data; + rijndael_enc_fin.size = 31369; + rijndael_enc_fin.cur_pos = 0; + + unsigned i; + volatile int x = 0; + rijndael_enc_fin.size ^= x; + __pragma_loopbound(31369, 31369); + for (i = 0; i < rijndael_enc_fin.size; i++) + rijndael_enc_fin.data[i] ^= x; + + /* this is a pointer to the hexadecimal key digits */ + const volatile char *cp = + "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321"; + char ch; + int by = 0; + + i = 0; /* this is a count for the input digits processed */ + __pragma_loopbound(64, 64); + while (i < 64 && *cp) { /* the maximum key length is 32 bytes and */ + /* hence at most 64 hexadecimal digits */ + ch = rijndael_enc_toupper(*cp++); /* process a hexadecimal digit */ + if (ch >= '0' && ch <= '9') + by = (by << 4) + ch - '0'; + else if (ch >= 'A' && ch <= 'F') + by = (by << 4) + ch - 'A' + 10; + else { /* error if not hexadecimal */ + rijndael_enc_checksum = -2; + return; + } + + /* store a key byte for each pair of hexadecimal digits */ + if (i++ & 1) + rijndael_enc_key[i / 2 - 1] = by & 0xff; + } + + if (*cp) { + rijndael_enc_checksum = -3; + return; + } else if (i < 32 || (i & 15)) { + rijndael_enc_checksum = -4; + return; + } + + rijndael_enc_key_len = i / 2; +} + +int +rijndael_enc_return(void) { + return ((rijndael_enc_checksum == (int) 249509) ? 0 : -1); +} + +/* A Pseudo Random Number Generator (PRNG) used for the */ +/* Initialisation Vector. The PRNG is George Marsaglia's */ +/* Multiply-With-Carry (MWC) PRNG that concatenates two */ +/* 16-bit MWC generators: */ +/* x(n)=36969 * x(n-1) + carry mod 2^16 */ +/* y(n)=18000 * y(n-1) + carry mod 2^16 */ +/* to produce a combined PRNG with a period of about 2^60. */ + +#define RAND(a, b) \ + (((a = 36969 * (a & 65535) + (a >> 16)) << 16) + \ + (b = 18000 * (b & 65535) + (b >> 16))) + +void +rijndael_enc_fillrand(unsigned char *buf, int len) { + static unsigned long a[2], mt = 1, count = 4; + static char r[4]; + int i; + + if (mt) { + mt = 0; + a[0] = 0xeaf3; + a[1] = 0x35fe; + } + + __pragma_loopbound(1, 16); + for (i = 0; i < len; ++i) { + if (count == 4) { + *(unsigned long *) r = RAND(a[0], a[1]); + count = 0; + } + + buf[i] = r[count++]; + } +} + +void +rijndael_enc_encfile(struct rijndael_enc_FILE *fin, struct aes *ctx) { + unsigned char inbuf[16], outbuf[16]; + long int flen; + unsigned long i = 0, l = 0; + + rijndael_enc_fillrand(outbuf, 16); /* set an IV for CBC mode */ + flen = fin->size; + + rijndael_enc_fillrand(inbuf, 1); /* make top 4 bits of a byte random */ + l = 15; /* and store the length of the last */ + /* block in the lower 4 bits */ + inbuf[0] = ((char) flen & 15) | (inbuf[0] & ~15); + + /* TODO: this is necessarily an input-dependent loop bound */ + __pragma_loopbound(1960, 1960); + while (!rijndael_enc_feof(fin)) { /* loop to encrypt the input file */ + /* input 1st 16 bytes to buf[ 1..16 ] */ + i = rijndael_enc_fread(inbuf + 16 - l, 1, l, + fin); /* on 1st round byte[ 0 ] */ + /* is the length code */ + if (i < l) + break; /* if end of the input file reached */ + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor in previous cipher + text */ + inbuf[i] ^= outbuf[i]; + + rijndael_enc_encrypt(inbuf, outbuf, ctx); /* and do the encryption */ + + rijndael_enc_checksum += outbuf[15]; + + /* in all but first round read 16 */ + l = 16; /* bytes into the buffer */ + } + + /* except for files of length less than two blocks we now have one */ + /* byte from the previous block and 'i' bytes from the current one */ + /* to encrypt and 15 - i empty buffer positions. For files of less */ + /* than two blocks (0 or 1) we have i + 1 bytes and 14 - i empty */ + /* buffer position to set to zero since the 'count' byte is extra */ + + if (l == 15) /* adjust for extra byte in the */ + ++i; /* in the first block */ + + if (i) { /* if bytes remain to be output */ + __pragma_loopbound(6, 6); + while (i < 16) /* clear empty buffer positions */ + inbuf[i++] = 0; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor in previous cipher + text */ + inbuf[i] ^= outbuf[i]; + + rijndael_enc_encrypt(inbuf, outbuf, ctx); /* encrypt and output it */ + + rijndael_enc_checksum += outbuf[15]; + } +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_enc_main(void) { + struct aes ctx[1]; + + /* encryption in Cipher Block Chaining mode */ + rijndael_enc_set_key(rijndael_enc_key, rijndael_enc_key_len, enc, ctx); + rijndael_enc_encfile(&rijndael_enc_fin, ctx); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + rijndael_enc_init(); + rijndael_enc_main(); + + return (rijndael_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.c new file mode 100644 index 0000000..581f8bf --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.c @@ -0,0 +1,70 @@ +#include "rijndael_enc_libc.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +int +rijndael_enc_toupper(int c) { + if ((c >= 'a') && (c <= 'z')) + return c - 'a' + 'A'; + return c; +} + +unsigned long +rijndael_enc_fread(void *ptr, unsigned long size, unsigned long count, + struct rijndael_enc_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(10, 16); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +unsigned long +rijndael_enc_fwrite(const void *ptr, unsigned long size, unsigned long count, + struct rijndael_enc_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_write = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 0); + while (i < stream->cur_pos + number_of_chars_to_write) + stream->data[i++] = ((unsigned char *) ptr)[i2++]; + stream->cur_pos += number_of_chars_to_write; + return number_of_chars_to_write; +} + +int +rijndael_enc_fseek(struct rijndael_enc_FILE *stream, long int offset, + Origin origin) { + if (origin == RIJNDAEL_ENC_SEEK_SET) { + stream->cur_pos = offset; + return 0; + } else if (origin == RIJNDAEL_ENC_SEEK_CUR) { + stream->cur_pos += offset; + return 0; + } else if (origin == RIJNDAEL_ENC_SEEK_END) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +int +rijndael_enc_fgetpos(struct rijndael_enc_FILE *stream, unsigned *position) { + *position = stream->cur_pos; + return 0; +} + +int +rijndael_enc_feof(struct rijndael_enc_FILE *stream) { + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.h b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.h new file mode 100644 index 0000000..1b3c468 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/default/rijndael_enc_libc.h @@ -0,0 +1,30 @@ + +#ifndef RIJNDAEL_ENC_LIBC_H +#define RIJNDAEL_ENC_LIBC_H + +int rijndael_enc_toupper(int c); + +enum _Origin_ { + RIJNDAEL_ENC_SEEK_SET, + RIJNDAEL_ENC_SEEK_CUR, + RIJNDAEL_ENC_SEEK_END +}; +typedef enum _Origin_ Origin; +struct rijndael_enc_FILE { + unsigned char *data; + unsigned long size; + unsigned cur_pos; +}; + +unsigned long rijndael_enc_fread(void *ptr, unsigned long size, + unsigned long count, + struct rijndael_enc_FILE *stream); +unsigned long rijndael_enc_fwrite(const void *ptr, unsigned long size, + unsigned long count, + struct rijndael_enc_FILE *stream); +int rijndael_enc_fseek(struct rijndael_enc_FILE *stream, long int offset, + Origin origin); +int rijndael_enc_fgetpos(struct rijndael_enc_FILE *stream, unsigned *position); +int rijndael_enc_feof(struct rijndael_enc_FILE *stream); + +#endif // RIJNDAEL_ENC_LIBC_H diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.c new file mode 100644 index 0000000..dca053d --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.c @@ -0,0 +1,479 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of 128, + bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. +*/ + +#include "aes.h" + +#include "aestab.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define four_tables(x, tab, vf, rf, c) \ + (tab[0][bval(vf(x, 0, c), rf(0, c))] ^ \ + tab[1][bval(vf(x, 1, c), rf(1, c))] ^ \ + tab[2][bval(vf(x, 2, c), rf(2, c))] ^ \ + tab[3][bval(vf(x, 3, c), rf(3, c))]) + +#define vf1(x, r, c) (x) +#define rf1(r, c) (r) +#define rf2(r, c) ((r - c) & 3) + +#define ls_box(x, c) four_tables(x, rijndael_enc_fl_tab, vf1, rf2, c) + +#define inv_mcol(x) four_tables(x, rijndael_enc_im_tab, vf1, rf1, 0) + +/* + Subroutine to set the block size (if variable) in bytes, legal + values being 16, 24 and 32. +*/ + +#define nc (Ncol) + +/* + Initialise the key schedule from the user supplied key. The key + length is now specified in bytes - 16, 24 or 32 as appropriate. + This corresponds to bit lengths of 128, 192 and 256 bits, and + to Nk values of 4, 6 and 8 respectively. +*/ + +#define mx(t, f) (*t++ = inv_mcol(*f), f++) +#define cp(t, f) *t++ = *f++ + +#define cpy(d, s) \ + do { \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + cp(d, s); \ + } while (0) // min 1 max 1 +#define mix(d, s) \ + do { \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + mx(d, s); \ + } while (0) // min 1 max 1 + +__attribute__((always_inline)) static inline aes_ret +rijndael_enc_set_key(byte in_key[], const word n_bytes, const enum aes_key f, + struct aes *cx) { + word *kf, *kt, rci; + + if ((n_bytes & 7) || n_bytes < 16 || n_bytes > 32 || (!(f & 1) && !(f & 2))) + return (n_bytes ? cx->mode &= ~0x03, + aes_bad : (aes_ret) (cx->Nkey << 2)); + + cx->mode = (cx->mode & ~0x03) | ((byte) f & 0x03); + cx->Nkey = n_bytes >> 2; + cx->Nrnd = Nr(cx->Nkey, (word) nc); + + cx->e_key[0] = word_in(in_key); + cx->e_key[1] = word_in(in_key + 4); + cx->e_key[2] = word_in(in_key + 8); + cx->e_key[3] = word_in(in_key + 12); + + kf = cx->e_key; + kt = kf + nc * (cx->Nrnd + 1) - cx->Nkey; + rci = 0; + + switch (cx->Nkey) { + case 4: + __pragma_loopbound(0, 0); + do { + kf[4] = kf[0] ^ ls_box(kf[3], 3) ^ rijndael_enc_rcon_tab[rci++]; + kf[5] = kf[1] ^ kf[4]; + kf[6] = kf[2] ^ kf[5]; + kf[7] = kf[3] ^ kf[6]; + kf += 4; + } while (kf < kt); + break; + + case 6: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + __pragma_loopbound(0, 0); + do { + kf[6] = kf[0] ^ ls_box(kf[5], 3) ^ rijndael_enc_rcon_tab[rci++]; + kf[7] = kf[1] ^ kf[6]; + kf[8] = kf[2] ^ kf[7]; + kf[9] = kf[3] ^ kf[8]; + kf[10] = kf[4] ^ kf[9]; + kf[11] = kf[5] ^ kf[10]; + kf += 6; + } while (kf < kt); + break; + + case 8: + cx->e_key[4] = word_in(in_key + 16); + cx->e_key[5] = word_in(in_key + 20); + cx->e_key[6] = word_in(in_key + 24); + cx->e_key[7] = word_in(in_key + 28); + __pragma_loopbound(7, 7); + do { + kf[8] = kf[0] ^ ls_box(kf[7], 3) ^ rijndael_enc_rcon_tab[rci++]; + kf[9] = kf[1] ^ kf[8]; + kf[10] = kf[2] ^ kf[9]; + kf[11] = kf[3] ^ kf[10]; + kf[12] = kf[4] ^ ls_box(kf[11], 0); + kf[13] = kf[5] ^ kf[12]; + kf[14] = kf[6] ^ kf[13]; + kf[15] = kf[7] ^ kf[14]; + kf += 8; + } while (kf < kt); + break; + } + + if ((cx->mode & 3) != enc) { + word i; + + kt = cx->d_key + nc * cx->Nrnd; + kf = cx->e_key; + + cpy(kt, kf); + kt -= 2 * nc; + + __pragma_loopbound(0, 0); + for (i = 1; i < cx->Nrnd; ++i) { + mix(kt, kf); + kt -= 2 * nc; + } + + cpy(kt, kf); + } + + return aes_good; +} + +__attribute__((always_inline)) static inline short +rijndael_enc_encrypt(unsigned char in_blk[], unsigned char out_blk[], + const struct aes *cx) { + const unsigned long *kp = cx->e_key; + if (!(cx->mode & 1)) + return 0; + unsigned long b0[4]; + b0[0] = *(unsigned long *) in_blk ^ kp[0]; + b0[1] = *(unsigned long *) (in_blk + 4) ^ kp[1]; + b0[2] = *(unsigned long *) (in_blk + 8) ^ kp[2]; + b0[3] = *(unsigned long *) (in_blk + 12) ^ kp[3]; + kp += 4; + unsigned long b1[4]; + switch (cx->Nrnd) { + case 14: + b1[0] = + kp[0] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + kp += 8; + case 12: + b1[0] = + kp[0] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + kp += 8; + case 10: + b1[0] = + kp[0] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = + kp[1] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = + kp[2] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = + kp[3] ^ (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 4)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 4)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 4)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 4)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 8)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 8)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 8)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 8)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 12)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 12)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 12)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 12)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 16)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 16)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 16)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 16)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 20)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 20)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 20)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 20)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 24)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 24)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 24)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 24)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 28)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 28)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 28)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 28)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b1[2] >> 24))]); + b1[0] = (kp + 32)[0] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[0])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[1] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[2] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[3] >> 24))]); + b1[1] = (kp + 32)[1] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[1])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[2] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[3] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[0] >> 24))]); + b1[2] = (kp + 32)[2] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[2])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[3] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[0] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[1] >> 24))]); + b1[3] = (kp + 32)[3] ^ + (rijndael_enc_ft_tab[0][((unsigned char) b0[3])] ^ + rijndael_enc_ft_tab[1][((unsigned char) (b0[0] >> 8))] ^ + rijndael_enc_ft_tab[2][((unsigned char) (b0[1] >> 16))] ^ + rijndael_enc_ft_tab[3][((unsigned char) (b0[2] >> 24))]); + b0[0] = (kp + 36)[0] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[0])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[1] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[2] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[3] >> 24))]); + b0[1] = (kp + 36)[1] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[1])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[2] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[3] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[0] >> 24))]); + b0[2] = (kp + 36)[2] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[2])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[3] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[0] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[1] >> 24))]); + b0[3] = (kp + 36)[3] ^ + (rijndael_enc_fl_tab[0][((unsigned char) b1[3])] ^ + rijndael_enc_fl_tab[1][((unsigned char) (b1[0] >> 8))] ^ + rijndael_enc_fl_tab[2][((unsigned char) (b1[1] >> 16))] ^ + rijndael_enc_fl_tab[3][((unsigned char) (b1[2] >> 24))]); + } + *(unsigned long *) out_blk = (b0[0]); + *(unsigned long *) (out_blk + 4) = (b0[1]); + *(unsigned long *) (out_blk + 8) = (b0[2]); + *(unsigned long *) (out_blk + 12) = (b0[3]); + return aes_good; +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.h b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.h new file mode 100644 index 0000000..d1b073a --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aes.h @@ -0,0 +1,168 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + 1. FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of + 128 bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. + + 2. THE CIPHER INTERFACE + + byte (an unsigned 8-bit type) + word (an unsigned 32-bit type) + aes_ret: (a signed 16 bit type for function return values) + aes_good (value != 0, a good return) + aes_bad (value == 0, an error return) + enum aes_key: (encryption direction) + enc (set key for encryption) + dec (set key for decryption) + both (set key for both) + class or struct aes (structure for context) + + C subroutine calls: + + aes_ret set_blk(const word block_length, aes *cx) (variable block size) + aes_ret set_key(const byte key[ ], const word key_length, + const enum aes_key direction, aes *cx) + aes_ret encrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + aes_ret decrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + + IMPORTANT NOTE: If you are using this C interface and your compiler does + not set the memory used for objects to zero before use, you will need to + ensure that cx.mode is set to zero before using the C subroutine calls. + + The block length inputs to set_block and set_key are in numbers of + BYTES, not bits. The calls to subroutines must be made in the above + order but multiple calls can be made without repeating earlier calls + if their parameters have not changed. If the cipher block length is + variable but set_blk has not been called before cipher operations a + value of 16 is assumed (that is, the AES block size). In contrast to + earlier versions the block and key length parameters are now checked + for correctness and the encryption and decryption routines check to + ensure that an appropriate key has been set before they are called. + +*/ + +#ifndef _AES_H +#define _AES_H + +/* The only supported block size for the benchmark is 16 */ +#define BLOCK_SIZE 16 + +/* + The number of key schedule words for different block and key lengths + (allowing for the method of computation which requires the length to + be a multiple of the key length): + + Key Schedule key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 44 60 54 56 64 + length 20 | 60 60 66 70 80 + (bytes) 24 | 80 80 78 84 96 + 28 | 100 100 102 98 112 + 32 | 120 120 120 126 120 + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + The following values assume that the key length will be variable and may + be of maximum length (32 bytes). + + Nk = number_of_key_bytes / 4 + Nc = number_of_columns_in_state / 4 + Nr = number of encryption/decryption rounds + Rc = number of elements in rcon table + Ks = number of 32-bit words in key schedule +*/ + +#define Nr(Nk, Nc) ((Nk > Nc ? Nk : Nc) + 6) +#define Rc(Nk, Nc) ((Nb * (Nr(Nk, Nc) + 1) - 1) / Nk) +#define Ks(Nk, Nc) (Nk * (Rc(Nk, Nc) + 1)) + +#define RC_LENGTH 5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11) +#define KS_LENGTH 4 * BLOCK_SIZE + +/* End of configuration options, but see also aes.c */ + +typedef unsigned char byte; /* must be an 8-bit storage unit */ +typedef unsigned long word; /* must be a 32-bit storage unit */ +typedef short aes_ret; /* function return value */ + +#define aes_bad 0 +#define aes_good 1 + +/* + upr(x,n): rotates bytes within words by n positions, moving bytes + to higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word +*/ + +#define upr(x, n) (((x) << 8 * (n)) | ((x) >> (32 - 8 * (n)))) +#define ups(x, n) ((x) << 8 * (n)) +#define bval(x, n) ((byte) ((x) >> 8 * (n))) +#define byte_swap(x) (upr(x, 1) & 0x00ff00ff | upr(x, 3) & 0xff00ff00) +#define bytes2word(b0, b1, b2, b3) \ + ((word) (b3) << 24 | (word) (b2) << 16 | (word) (b1) << 8 | (b0)) + +#define word_in(x) *(word *) (x) +#define word_out(x, v) *(word *) (x) = (v) + +enum aes_const { + Nrow = 4, /* the number of rows in the cipher state */ + Mcol = 8, /* maximum number of columns in the state */ + Ncol = BLOCK_SIZE / 4, + Shr0 = 0, /* the cyclic shift values for rows 0, 1, 2 & 3 */ + Shr1 = 1, + Shr2 = BLOCK_SIZE == 32 ? 3 : 2, + Shr3 = BLOCK_SIZE == 32 ? 4 : 3 +}; + +enum aes_key { + enc = 1, /* set if encryption is needed */ + dec = 2, /* set if decryption is needed */ + both = 3 /* set if both are needed */ +}; + +struct aes { + word Nkey; /* the number of words in the key input block */ + word Nrnd; /* the number of cipher rounds */ + word e_key[KS_LENGTH]; /* the encryption key schedule */ + word d_key[KS_LENGTH]; /* the decryption key schedule */ + byte mode; /* encrypt, decrypt or both */ +}; + +__attribute__((always_inline)) static inline aes_ret +rijndael_enc_set_key(byte key[], const word n_bytes, const enum aes_key f, + struct aes *cx); +__attribute__((always_inline)) static inline aes_ret +rijndael_enc_encrypt(byte in_blk[], byte out_blk[], const struct aes *cx); + +#endif diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aestab.h b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aestab.h new file mode 100644 index 0000000..22b96dc --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/aestab.h @@ -0,0 +1,294 @@ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +/* + Used to ensure table is generated in the right format + depending on the internal byte order required. +*/ + +#define w0(p) 0x000000##p + +/* + Number of elements required in this table for different + block and key lengths is: + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + this table can be a table of bytes if the key schedule + code is adjusted accordingly +*/ + +const word rijndael_enc_rcon_tab[29] = { + w0(01), w0(02), w0(04), w0(08), w0(10), w0(20), w0(40), w0(80), + w0(1b), w0(36), w0(6c), w0(d8), w0(ab), w0(4d), w0(9a), w0(2f), + w0(5e), w0(bc), w0(63), w0(c6), w0(97), w0(35), w0(6a), w0(d4), + w0(b3), w0(7d), w0(fa), w0(ef), w0(c5)}; + +#undef w0 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +#define r0(p, q, r, s) 0x##p##q##r##s +#define r1(p, q, r, s) 0x##q##r##s##p +#define r2(p, q, r, s) 0x##r##s##p##q +#define r3(p, q, r, s) 0x##s##p##q##r +#define w0(p) 0x000000##p +#define w1(p) 0x0000##p##00 +#define w2(p) 0x00##p##0000 +#define w3(p) 0x##p##000000 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +/* data for forward tables (other than last round) */ + +#define f_table \ + r(a5, 63, 63, c6), r(84, 7c, 7c, f8), r(99, 77, 77, ee), \ + r(8d, 7b, 7b, f6), r(0d, f2, f2, ff), r(bd, 6b, 6b, d6), \ + r(b1, 6f, 6f, de), r(54, c5, c5, 91), r(50, 30, 30, 60), \ + r(03, 01, 01, 02), r(a9, 67, 67, ce), r(7d, 2b, 2b, 56), \ + r(19, fe, fe, e7), r(62, d7, d7, b5), r(e6, ab, ab, 4d), \ + r(9a, 76, 76, ec), r(45, ca, ca, 8f), r(9d, 82, 82, 1f), \ + r(40, c9, c9, 89), r(87, 7d, 7d, fa), r(15, fa, fa, ef), \ + r(eb, 59, 59, b2), r(c9, 47, 47, 8e), r(0b, f0, f0, fb), \ + r(ec, ad, ad, 41), r(67, d4, d4, b3), r(fd, a2, a2, 5f), \ + r(ea, af, af, 45), r(bf, 9c, 9c, 23), r(f7, a4, a4, 53), \ + r(96, 72, 72, e4), r(5b, c0, c0, 9b), r(c2, b7, b7, 75), \ + r(1c, fd, fd, e1), r(ae, 93, 93, 3d), r(6a, 26, 26, 4c), \ + r(5a, 36, 36, 6c), r(41, 3f, 3f, 7e), r(02, f7, f7, f5), \ + r(4f, cc, cc, 83), r(5c, 34, 34, 68), r(f4, a5, a5, 51), \ + r(34, e5, e5, d1), r(08, f1, f1, f9), r(93, 71, 71, e2), \ + r(73, d8, d8, ab), r(53, 31, 31, 62), r(3f, 15, 15, 2a), \ + r(0c, 04, 04, 08), r(52, c7, c7, 95), r(65, 23, 23, 46), \ + r(5e, c3, c3, 9d), r(28, 18, 18, 30), r(a1, 96, 96, 37), \ + r(0f, 05, 05, 0a), r(b5, 9a, 9a, 2f), r(09, 07, 07, 0e), \ + r(36, 12, 12, 24), r(9b, 80, 80, 1b), r(3d, e2, e2, df), \ + r(26, eb, eb, cd), r(69, 27, 27, 4e), r(cd, b2, b2, 7f), \ + r(9f, 75, 75, ea), r(1b, 09, 09, 12), r(9e, 83, 83, 1d), \ + r(74, 2c, 2c, 58), r(2e, 1a, 1a, 34), r(2d, 1b, 1b, 36), \ + r(b2, 6e, 6e, dc), r(ee, 5a, 5a, b4), r(fb, a0, a0, 5b), \ + r(f6, 52, 52, a4), r(4d, 3b, 3b, 76), r(61, d6, d6, b7), \ + r(ce, b3, b3, 7d), r(7b, 29, 29, 52), r(3e, e3, e3, dd), \ + r(71, 2f, 2f, 5e), r(97, 84, 84, 13), r(f5, 53, 53, a6), \ + r(68, d1, d1, b9), r(00, 00, 00, 00), r(2c, ed, ed, c1), \ + r(60, 20, 20, 40), r(1f, fc, fc, e3), r(c8, b1, b1, 79), \ + r(ed, 5b, 5b, b6), r(be, 6a, 6a, d4), r(46, cb, cb, 8d), \ + r(d9, be, be, 67), r(4b, 39, 39, 72), r(de, 4a, 4a, 94), \ + r(d4, 4c, 4c, 98), r(e8, 58, 58, b0), r(4a, cf, cf, 85), \ + r(6b, d0, d0, bb), r(2a, ef, ef, c5), r(e5, aa, aa, 4f), \ + r(16, fb, fb, ed), r(c5, 43, 43, 86), r(d7, 4d, 4d, 9a), \ + r(55, 33, 33, 66), r(94, 85, 85, 11), r(cf, 45, 45, 8a), \ + r(10, f9, f9, e9), r(06, 02, 02, 04), r(81, 7f, 7f, fe), \ + r(f0, 50, 50, a0), r(44, 3c, 3c, 78), r(ba, 9f, 9f, 25), \ + r(e3, a8, a8, 4b), r(f3, 51, 51, a2), r(fe, a3, a3, 5d), \ + r(c0, 40, 40, 80), r(8a, 8f, 8f, 05), r(ad, 92, 92, 3f), \ + r(bc, 9d, 9d, 21), r(48, 38, 38, 70), r(04, f5, f5, f1), \ + r(df, bc, bc, 63), r(c1, b6, b6, 77), r(75, da, da, af), \ + r(63, 21, 21, 42), r(30, 10, 10, 20), r(1a, ff, ff, e5), \ + r(0e, f3, f3, fd), r(6d, d2, d2, bf), r(4c, cd, cd, 81), \ + r(14, 0c, 0c, 18), r(35, 13, 13, 26), r(2f, ec, ec, c3), \ + r(e1, 5f, 5f, be), r(a2, 97, 97, 35), r(cc, 44, 44, 88), \ + r(39, 17, 17, 2e), r(57, c4, c4, 93), r(f2, a7, a7, 55), \ + r(82, 7e, 7e, fc), r(47, 3d, 3d, 7a), r(ac, 64, 64, c8), \ + r(e7, 5d, 5d, ba), r(2b, 19, 19, 32), r(95, 73, 73, e6), \ + r(a0, 60, 60, c0), r(98, 81, 81, 19), r(d1, 4f, 4f, 9e), \ + r(7f, dc, dc, a3), r(66, 22, 22, 44), r(7e, 2a, 2a, 54), \ + r(ab, 90, 90, 3b), r(83, 88, 88, 0b), r(ca, 46, 46, 8c), \ + r(29, ee, ee, c7), r(d3, b8, b8, 6b), r(3c, 14, 14, 28), \ + r(79, de, de, a7), r(e2, 5e, 5e, bc), r(1d, 0b, 0b, 16), \ + r(76, db, db, ad), r(3b, e0, e0, db), r(56, 32, 32, 64), \ + r(4e, 3a, 3a, 74), r(1e, 0a, 0a, 14), r(db, 49, 49, 92), \ + r(0a, 06, 06, 0c), r(6c, 24, 24, 48), r(e4, 5c, 5c, b8), \ + r(5d, c2, c2, 9f), r(6e, d3, d3, bd), r(ef, ac, ac, 43), \ + r(a6, 62, 62, c4), r(a8, 91, 91, 39), r(a4, 95, 95, 31), \ + r(37, e4, e4, d3), r(8b, 79, 79, f2), r(32, e7, e7, d5), \ + r(43, c8, c8, 8b), r(59, 37, 37, 6e), r(b7, 6d, 6d, da), \ + r(8c, 8d, 8d, 01), r(64, d5, d5, b1), r(d2, 4e, 4e, 9c), \ + r(e0, a9, a9, 49), r(b4, 6c, 6c, d8), r(fa, 56, 56, ac), \ + r(07, f4, f4, f3), r(25, ea, ea, cf), r(af, 65, 65, ca), \ + r(8e, 7a, 7a, f4), r(e9, ae, ae, 47), r(18, 08, 08, 10), \ + r(d5, ba, ba, 6f), r(88, 78, 78, f0), r(6f, 25, 25, 4a), \ + r(72, 2e, 2e, 5c), r(24, 1c, 1c, 38), r(f1, a6, a6, 57), \ + r(c7, b4, b4, 73), r(51, c6, c6, 97), r(23, e8, e8, cb), \ + r(7c, dd, dd, a1), r(9c, 74, 74, e8), r(21, 1f, 1f, 3e), \ + r(dd, 4b, 4b, 96), r(dc, bd, bd, 61), r(86, 8b, 8b, 0d), \ + r(85, 8a, 8a, 0f), r(90, 70, 70, e0), r(42, 3e, 3e, 7c), \ + r(c4, b5, b5, 71), r(aa, 66, 66, cc), r(d8, 48, 48, 90), \ + r(05, 03, 03, 06), r(01, f6, f6, f7), r(12, 0e, 0e, 1c), \ + r(a3, 61, 61, c2), r(5f, 35, 35, 6a), r(f9, 57, 57, ae), \ + r(d0, b9, b9, 69), r(91, 86, 86, 17), r(58, c1, c1, 99), \ + r(27, 1d, 1d, 3a), r(b9, 9e, 9e, 27), r(38, e1, e1, d9), \ + r(13, f8, f8, eb), r(b3, 98, 98, 2b), r(33, 11, 11, 22), \ + r(bb, 69, 69, d2), r(70, d9, d9, a9), r(89, 8e, 8e, 07), \ + r(a7, 94, 94, 33), r(b6, 9b, 9b, 2d), r(22, 1e, 1e, 3c), \ + r(92, 87, 87, 15), r(20, e9, e9, c9), r(49, ce, ce, 87), \ + r(ff, 55, 55, aa), r(78, 28, 28, 50), r(7a, df, df, a5), \ + r(8f, 8c, 8c, 03), r(f8, a1, a1, 59), r(80, 89, 89, 09), \ + r(17, 0d, 0d, 1a), r(da, bf, bf, 65), r(31, e6, e6, d7), \ + r(c6, 42, 42, 84), r(b8, 68, 68, d0), r(c3, 41, 41, 82), \ + r(b0, 99, 99, 29), r(77, 2d, 2d, 5a), r(11, 0f, 0f, 1e), \ + r(cb, b0, b0, 7b), r(fc, 54, 54, a8), r(d6, bb, bb, 6d), \ + r(3a, 16, 16, 2c) + +/* generate the required tables in the desired endian format */ + +#undef r +#define r r0 + +const word rijndael_enc_ft_tab[4][256] = {{f_table}, +#undef r +#define r r1 + {f_table}, +#undef r +#define r r2 + {f_table}, +#undef r +#define r r3 + {f_table}}; + +/* generate the required tables in the desired endian format */ + +#undef r +#define r(p, q, r, s) w0(q) +const word rijndael_enc_fl_tab[4][256] = {{f_table}, +#undef r +#define r(p, q, r, s) w1(q) + {f_table}, +#undef r +#define r(p, q, r, s) w2(q) + {f_table}, +#undef r +#define r(p, q, r, s) w3(q) + {f_table}}; + +#define m_table \ + r(00, 00, 00, 00), r(0b, 0d, 09, 0e), r(16, 1a, 12, 1c), \ + r(1d, 17, 1b, 12), r(2c, 34, 24, 38), r(27, 39, 2d, 36), \ + r(3a, 2e, 36, 24), r(31, 23, 3f, 2a), r(58, 68, 48, 70), \ + r(53, 65, 41, 7e), r(4e, 72, 5a, 6c), r(45, 7f, 53, 62), \ + r(74, 5c, 6c, 48), r(7f, 51, 65, 46), r(62, 46, 7e, 54), \ + r(69, 4b, 77, 5a), r(b0, d0, 90, e0), r(bb, dd, 99, ee), \ + r(a6, ca, 82, fc), r(ad, c7, 8b, f2), r(9c, e4, b4, d8), \ + r(97, e9, bd, d6), r(8a, fe, a6, c4), r(81, f3, af, ca), \ + r(e8, b8, d8, 90), r(e3, b5, d1, 9e), r(fe, a2, ca, 8c), \ + r(f5, af, c3, 82), r(c4, 8c, fc, a8), r(cf, 81, f5, a6), \ + r(d2, 96, ee, b4), r(d9, 9b, e7, ba), r(7b, bb, 3b, db), \ + r(70, b6, 32, d5), r(6d, a1, 29, c7), r(66, ac, 20, c9), \ + r(57, 8f, 1f, e3), r(5c, 82, 16, ed), r(41, 95, 0d, ff), \ + r(4a, 98, 04, f1), r(23, d3, 73, ab), r(28, de, 7a, a5), \ + r(35, c9, 61, b7), r(3e, c4, 68, b9), r(0f, e7, 57, 93), \ + r(04, ea, 5e, 9d), r(19, fd, 45, 8f), r(12, f0, 4c, 81), \ + r(cb, 6b, ab, 3b), r(c0, 66, a2, 35), r(dd, 71, b9, 27), \ + r(d6, 7c, b0, 29), r(e7, 5f, 8f, 03), r(ec, 52, 86, 0d), \ + r(f1, 45, 9d, 1f), r(fa, 48, 94, 11), r(93, 03, e3, 4b), \ + r(98, 0e, ea, 45), r(85, 19, f1, 57), r(8e, 14, f8, 59), \ + r(bf, 37, c7, 73), r(b4, 3a, ce, 7d), r(a9, 2d, d5, 6f), \ + r(a2, 20, dc, 61), r(f6, 6d, 76, ad), r(fd, 60, 7f, a3), \ + r(e0, 77, 64, b1), r(eb, 7a, 6d, bf), r(da, 59, 52, 95), \ + r(d1, 54, 5b, 9b), r(cc, 43, 40, 89), r(c7, 4e, 49, 87), \ + r(ae, 05, 3e, dd), r(a5, 08, 37, d3), r(b8, 1f, 2c, c1), \ + r(b3, 12, 25, cf), r(82, 31, 1a, e5), r(89, 3c, 13, eb), \ + r(94, 2b, 08, f9), r(9f, 26, 01, f7), r(46, bd, e6, 4d), \ + r(4d, b0, ef, 43), r(50, a7, f4, 51), r(5b, aa, fd, 5f), \ + r(6a, 89, c2, 75), r(61, 84, cb, 7b), r(7c, 93, d0, 69), \ + r(77, 9e, d9, 67), r(1e, d5, ae, 3d), r(15, d8, a7, 33), \ + r(08, cf, bc, 21), r(03, c2, b5, 2f), r(32, e1, 8a, 05), \ + r(39, ec, 83, 0b), r(24, fb, 98, 19), r(2f, f6, 91, 17), \ + r(8d, d6, 4d, 76), r(86, db, 44, 78), r(9b, cc, 5f, 6a), \ + r(90, c1, 56, 64), r(a1, e2, 69, 4e), r(aa, ef, 60, 40), \ + r(b7, f8, 7b, 52), r(bc, f5, 72, 5c), r(d5, be, 05, 06), \ + r(de, b3, 0c, 08), r(c3, a4, 17, 1a), r(c8, a9, 1e, 14), \ + r(f9, 8a, 21, 3e), r(f2, 87, 28, 30), r(ef, 90, 33, 22), \ + r(e4, 9d, 3a, 2c), r(3d, 06, dd, 96), r(36, 0b, d4, 98), \ + r(2b, 1c, cf, 8a), r(20, 11, c6, 84), r(11, 32, f9, ae), \ + r(1a, 3f, f0, a0), r(07, 28, eb, b2), r(0c, 25, e2, bc), \ + r(65, 6e, 95, e6), r(6e, 63, 9c, e8), r(73, 74, 87, fa), \ + r(78, 79, 8e, f4), r(49, 5a, b1, de), r(42, 57, b8, d0), \ + r(5f, 40, a3, c2), r(54, 4d, aa, cc), r(f7, da, ec, 41), \ + r(fc, d7, e5, 4f), r(e1, c0, fe, 5d), r(ea, cd, f7, 53), \ + r(db, ee, c8, 79), r(d0, e3, c1, 77), r(cd, f4, da, 65), \ + r(c6, f9, d3, 6b), r(af, b2, a4, 31), r(a4, bf, ad, 3f), \ + r(b9, a8, b6, 2d), r(b2, a5, bf, 23), r(83, 86, 80, 09), \ + r(88, 8b, 89, 07), r(95, 9c, 92, 15), r(9e, 91, 9b, 1b), \ + r(47, 0a, 7c, a1), r(4c, 07, 75, af), r(51, 10, 6e, bd), \ + r(5a, 1d, 67, b3), r(6b, 3e, 58, 99), r(60, 33, 51, 97), \ + r(7d, 24, 4a, 85), r(76, 29, 43, 8b), r(1f, 62, 34, d1), \ + r(14, 6f, 3d, df), r(09, 78, 26, cd), r(02, 75, 2f, c3), \ + r(33, 56, 10, e9), r(38, 5b, 19, e7), r(25, 4c, 02, f5), \ + r(2e, 41, 0b, fb), r(8c, 61, d7, 9a), r(87, 6c, de, 94), \ + r(9a, 7b, c5, 86), r(91, 76, cc, 88), r(a0, 55, f3, a2), \ + r(ab, 58, fa, ac), r(b6, 4f, e1, be), r(bd, 42, e8, b0), \ + r(d4, 09, 9f, ea), r(df, 04, 96, e4), r(c2, 13, 8d, f6), \ + r(c9, 1e, 84, f8), r(f8, 3d, bb, d2), r(f3, 30, b2, dc), \ + r(ee, 27, a9, ce), r(e5, 2a, a0, c0), r(3c, b1, 47, 7a), \ + r(37, bc, 4e, 74), r(2a, ab, 55, 66), r(21, a6, 5c, 68), \ + r(10, 85, 63, 42), r(1b, 88, 6a, 4c), r(06, 9f, 71, 5e), \ + r(0d, 92, 78, 50), r(64, d9, 0f, 0a), r(6f, d4, 06, 04), \ + r(72, c3, 1d, 16), r(79, ce, 14, 18), r(48, ed, 2b, 32), \ + r(43, e0, 22, 3c), r(5e, f7, 39, 2e), r(55, fa, 30, 20), \ + r(01, b7, 9a, ec), r(0a, ba, 93, e2), r(17, ad, 88, f0), \ + r(1c, a0, 81, fe), r(2d, 83, be, d4), r(26, 8e, b7, da), \ + r(3b, 99, ac, c8), r(30, 94, a5, c6), r(59, df, d2, 9c), \ + r(52, d2, db, 92), r(4f, c5, c0, 80), r(44, c8, c9, 8e), \ + r(75, eb, f6, a4), r(7e, e6, ff, aa), r(63, f1, e4, b8), \ + r(68, fc, ed, b6), r(b1, 67, 0a, 0c), r(ba, 6a, 03, 02), \ + r(a7, 7d, 18, 10), r(ac, 70, 11, 1e), r(9d, 53, 2e, 34), \ + r(96, 5e, 27, 3a), r(8b, 49, 3c, 28), r(80, 44, 35, 26), \ + r(e9, 0f, 42, 7c), r(e2, 02, 4b, 72), r(ff, 15, 50, 60), \ + r(f4, 18, 59, 6e), r(c5, 3b, 66, 44), r(ce, 36, 6f, 4a), \ + r(d3, 21, 74, 58), r(d8, 2c, 7d, 56), r(7a, 0c, a1, 37), \ + r(71, 01, a8, 39), r(6c, 16, b3, 2b), r(67, 1b, ba, 25), \ + r(56, 38, 85, 0f), r(5d, 35, 8c, 01), r(40, 22, 97, 13), \ + r(4b, 2f, 9e, 1d), r(22, 64, e9, 47), r(29, 69, e0, 49), \ + r(34, 7e, fb, 5b), r(3f, 73, f2, 55), r(0e, 50, cd, 7f), \ + r(05, 5d, c4, 71), r(18, 4a, df, 63), r(13, 47, d6, 6d), \ + r(ca, dc, 31, d7), r(c1, d1, 38, d9), r(dc, c6, 23, cb), \ + r(d7, cb, 2a, c5), r(e6, e8, 15, ef), r(ed, e5, 1c, e1), \ + r(f0, f2, 07, f3), r(fb, ff, 0e, fd), r(92, b4, 79, a7), \ + r(99, b9, 70, a9), r(84, ae, 6b, bb), r(8f, a3, 62, b5), \ + r(be, 80, 5d, 9f), r(b5, 8d, 54, 91), r(a8, 9a, 4f, 83), \ + r(a3, 97, 46, 8d) + +#undef r +#define r r0 + +const word rijndael_enc_im_tab[4][256] = {{m_table}, +#undef r +#define r r1 + {m_table}, +#undef r +#define r r2 + {m_table}, +#undef r +#define r r3 + {m_table}}; diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/input_small.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/input_small.c new file mode 100644 index 0000000..0ff5948 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/input_small.c @@ -0,0 +1,2243 @@ + +unsigned char rijndael_enc_data[] = { + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', + 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', + 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', + 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', + 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', + 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', + 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', + 'g', 'u', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', + 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', + 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', + 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', + 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', + 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', + 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', + 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', + 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', + 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', + 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', + 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', + 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', + 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', + 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', + 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', + 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', + 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', + 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', + 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', + 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', + 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', + 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', + 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', + 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', + 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', + 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', + 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', + 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', + 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', + 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', + 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', + 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', + 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', + 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', + 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', + 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', + 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', + 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', + 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', + 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', + 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', + 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', + 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', + 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', + 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', + 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', + 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', + 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', + 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', + 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', + 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', + 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', + 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', + 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', + 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', + 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', + 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', + 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', + 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', + 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', + 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', + 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', + 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', + 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', + 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', + 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', + 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', + 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', + 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', + 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', + 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', + 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', + 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', + 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', + 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', + 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', + 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', + 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', + 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', + 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', + 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', + 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', + 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', + 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', + 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', + 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', + 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', + 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', + 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', + 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', + 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', + 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', + 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', + 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', + 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', + 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', + 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', + 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', + 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', + 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', + 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', + 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', + 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', + 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', + 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', + 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', + 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', + 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', + 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', + 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', + 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', + 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', + 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n'}; diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc.c new file mode 100644 index 0000000..1cce7a8 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc.c @@ -0,0 +1,249 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: rijndael_enc + + Author: Dr Brian Gladman + + Function: rijndael_enc is an implementation of the AES encryption + algorithm (Rijndael). + + Source: security section of MiBench + + Changes: Add computation of a checksum, refactoring + + License: see below + +*/ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +#include "aes.h" +#include "rijndael_enc_libc.h" + +/* + Global variable definitions +*/ + +// Wasm loop bounds + + +#include "aes.c" +#include "input_small.c" +#include "rijndael_enc_libc.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +unsigned char rijndael_enc_key[32]; +int rijndael_enc_key_len; + +extern unsigned char rijndael_enc_data[]; +struct rijndael_enc_FILE rijndael_enc_fin; + +int rijndael_enc_checksum = 0; + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void rijndael_enc_init(void); +__attribute__((always_inline)) static inline int rijndael_enc_return(void); +__attribute__((always_inline)) static inline void +rijndael_enc_fillrand(unsigned char *buf, int len); +__attribute__((always_inline)) static inline void +rijndael_enc_encfile(struct rijndael_enc_FILE *fin, struct aes *ctx); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_enc_main(void); + +__attribute__((always_inline)) static inline void +rijndael_enc_init(void) { + /* create a pseudo-file for the input*/ + rijndael_enc_fin.data = rijndael_enc_data; + rijndael_enc_fin.size = 31369; + rijndael_enc_fin.cur_pos = 0; + + unsigned i; + volatile int x = 0; + rijndael_enc_fin.size ^= x; + __pragma_loopbound(31369, 31369); + for (i = 0; i < rijndael_enc_fin.size; i++) + rijndael_enc_fin.data[i] ^= x; + + /* this is a pointer to the hexadecimal key digits */ + const volatile char *cp = + "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321"; + char ch; + int by = 0; + + i = 0; /* this is a count for the input digits processed */ + __pragma_loopbound(64, 64); + while (i < 64 && *cp) { /* the maximum key length is 32 bytes and */ + /* hence at most 64 hexadecimal digits */ + ch = rijndael_enc_toupper(*cp++); /* process a hexadecimal digit */ + if (ch >= '0' && ch <= '9') + by = (by << 4) + ch - '0'; + else if (ch >= 'A' && ch <= 'F') + by = (by << 4) + ch - 'A' + 10; + else { /* error if not hexadecimal */ + rijndael_enc_checksum = -2; + return; + } + + /* store a key byte for each pair of hexadecimal digits */ + if (i++ & 1) + rijndael_enc_key[i / 2 - 1] = by & 0xff; + } + + if (*cp) { + rijndael_enc_checksum = -3; + return; + } else if (i < 32 || (i & 15)) { + rijndael_enc_checksum = -4; + return; + } + + rijndael_enc_key_len = i / 2; +} + +__attribute__((always_inline)) static inline int +rijndael_enc_return(void) { + return ((rijndael_enc_checksum == (int) 249509) ? 0 : -1); +} + +/* A Pseudo Random Number Generator (PRNG) used for the */ +/* Initialisation Vector. The PRNG is George Marsaglia's */ +/* Multiply-With-Carry (MWC) PRNG that concatenates two */ +/* 16-bit MWC generators: */ +/* x(n)=36969 * x(n-1) + carry mod 2^16 */ +/* y(n)=18000 * y(n-1) + carry mod 2^16 */ +/* to produce a combined PRNG with a period of about 2^60. */ + +#define RAND(a, b) \ + (((a = 36969 * (a & 65535) + (a >> 16)) << 16) + \ + (b = 18000 * (b & 65535) + (b >> 16))) + +__attribute__((always_inline)) static inline void +rijndael_enc_fillrand(unsigned char *buf, int len) { + static unsigned long a[2], mt = 1, count = 4; + static char r[4]; + int i; + + if (mt) { + mt = 0; + a[0] = 0xeaf3; + a[1] = 0x35fe; + } + + __pragma_loopbound(1, 16); + for (i = 0; i < len; ++i) { + if (count == 4) { + *(unsigned long *) r = RAND(a[0], a[1]); + count = 0; + } + + buf[i] = r[count++]; + } +} + +__attribute__((always_inline)) static inline void +rijndael_enc_encfile(struct rijndael_enc_FILE *fin, struct aes *ctx) { + unsigned char inbuf[16], outbuf[16]; + long int flen; + unsigned long i = 0, l = 0; + + rijndael_enc_fillrand(outbuf, 16); /* set an IV for CBC mode */ + flen = fin->size; + + rijndael_enc_fillrand(inbuf, 1); /* make top 4 bits of a byte random */ + l = 15; /* and store the length of the last */ + /* block in the lower 4 bits */ + inbuf[0] = ((char) flen & 15) | (inbuf[0] & ~15); + + /* TODO: this is necessarily an input-dependent loop bound */ + __pragma_loopbound(1960, 1960); + while (!rijndael_enc_feof(fin)) { /* loop to encrypt the input file */ + /* input 1st 16 bytes to buf[ 1..16 ] */ + i = rijndael_enc_fread(inbuf + 16 - l, 1, l, + fin); /* on 1st round byte[ 0 ] */ + /* is the length code */ + if (i < l) + break; /* if end of the input file reached */ + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor in previous cipher + text */ + inbuf[i] ^= outbuf[i]; + + rijndael_enc_encrypt(inbuf, outbuf, ctx); /* and do the encryption */ + + rijndael_enc_checksum += outbuf[15]; + + /* in all but first round read 16 */ + l = 16; /* bytes into the buffer */ + } + + /* except for files of length less than two blocks we now have one */ + /* byte from the previous block and 'i' bytes from the current one */ + /* to encrypt and 15 - i empty buffer positions. For files of less */ + /* than two blocks (0 or 1) we have i + 1 bytes and 14 - i empty */ + /* buffer position to set to zero since the 'count' byte is extra */ + + if (l == 15) /* adjust for extra byte in the */ + ++i; /* in the first block */ + + if (i) { /* if bytes remain to be output */ + __pragma_loopbound(6, 6); + while (i < 16) /* clear empty buffer positions */ + inbuf[i++] = 0; + + __pragma_loopbound(16, 16); + for (i = 0; i < 16; ++i) /* xor in previous cipher + text */ + inbuf[i] ^= outbuf[i]; + + rijndael_enc_encrypt(inbuf, outbuf, ctx); /* encrypt and output it */ + + rijndael_enc_checksum += outbuf[15]; + } +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +rijndael_enc_main(void) { + struct aes ctx[1]; + + /* encryption in Cipher Block Chaining mode */ + rijndael_enc_set_key(rijndael_enc_key, rijndael_enc_key_len, enc, ctx); + rijndael_enc_encfile(&rijndael_enc_fin, ctx); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + rijndael_enc_init(); + rijndael_enc_main(); + + return (rijndael_enc_return()); +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.c b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.c new file mode 100644 index 0000000..02183d1 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.c @@ -0,0 +1,70 @@ +#include "rijndael_enc_libc.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline int +rijndael_enc_toupper(int c) { + if ((c >= 'a') && (c <= 'z')) + return c - 'a' + 'A'; + return c; +} + +__attribute__((always_inline)) static inline unsigned long +rijndael_enc_fread(void *ptr, unsigned long size, unsigned long count, + struct rijndael_enc_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(10, 16); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +__attribute__((always_inline)) static inline unsigned long +rijndael_enc_fwrite(const void *ptr, unsigned long size, unsigned long count, + struct rijndael_enc_FILE *stream) { + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_write = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(0, 0); + while (i < stream->cur_pos + number_of_chars_to_write) + stream->data[i++] = ((unsigned char *) ptr)[i2++]; + stream->cur_pos += number_of_chars_to_write; + return number_of_chars_to_write; +} + +__attribute__((always_inline)) static inline int +rijndael_enc_fseek(struct rijndael_enc_FILE *stream, long int offset, + Origin origin) { + if (origin == RIJNDAEL_ENC_SEEK_SET) { + stream->cur_pos = offset; + return 0; + } else if (origin == RIJNDAEL_ENC_SEEK_CUR) { + stream->cur_pos += offset; + return 0; + } else if (origin == RIJNDAEL_ENC_SEEK_END) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +__attribute__((always_inline)) static inline int +rijndael_enc_fgetpos(struct rijndael_enc_FILE *stream, unsigned *position) { + *position = stream->cur_pos; + return 0; +} + +__attribute__((always_inline)) static inline int +rijndael_enc_feof(struct rijndael_enc_FILE *stream) { + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.h b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.h new file mode 100644 index 0000000..0ae7796 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/generated/modified_sources/inline/rijndael_enc_libc.h @@ -0,0 +1,33 @@ + +#ifndef RIJNDAEL_ENC_LIBC_H +#define RIJNDAEL_ENC_LIBC_H + +__attribute__((always_inline)) static inline int rijndael_enc_toupper(int c); + +enum _Origin_ { + RIJNDAEL_ENC_SEEK_SET, + RIJNDAEL_ENC_SEEK_CUR, + RIJNDAEL_ENC_SEEK_END +}; +typedef enum _Origin_ Origin; +struct rijndael_enc_FILE { + unsigned char *data; + unsigned long size; + unsigned cur_pos; +}; + +__attribute__((always_inline)) static inline unsigned long +rijndael_enc_fread(void *ptr, unsigned long size, unsigned long count, + struct rijndael_enc_FILE *stream); +__attribute__((always_inline)) static inline unsigned long +rijndael_enc_fwrite(const void *ptr, unsigned long size, unsigned long count, + struct rijndael_enc_FILE *stream); +__attribute__((always_inline)) static inline int +rijndael_enc_fseek(struct rijndael_enc_FILE *stream, long int offset, + Origin origin); +__attribute__((always_inline)) static inline int +rijndael_enc_fgetpos(struct rijndael_enc_FILE *stream, unsigned *position); +__attribute__((always_inline)) static inline int +rijndael_enc_feof(struct rijndael_enc_FILE *stream); + +#endif // RIJNDAEL_ENC_LIBC_H diff --git a/targets/wasm-tacle/sequential/rijndael_enc/input_small.c b/targets/wasm-tacle/sequential/rijndael_enc/input_small.c new file mode 100755 index 0000000..e75559d --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/input_small.c @@ -0,0 +1,1963 @@ +unsigned char rijndael_enc_data[ ] = { + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', + 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', + 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', + 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', + 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', + 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', + 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', + 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', + 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', + 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', + 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', + 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', + 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', + 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', + 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', + 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', + 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', + 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', + 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', + 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', + 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', + 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', + 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', + 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', + 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', + 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', + 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', + 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', + 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', + 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', + 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', + 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', + 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', + 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', + 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', + 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', + 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', + 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', + 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', + 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', + 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', + 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', + 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', + 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', + 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', + 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', + 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', + 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', + 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', + 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', + 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', + 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', + 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', + 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', + 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', + 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', + 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', + 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', + 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', + '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', + 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', + 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', + 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', + 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', + 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', + 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', + 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', + 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', + 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', + 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', + 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', + 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', + 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', + 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', + 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', + 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', + 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', + 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', + 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', + 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', + 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', + 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', + 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', + 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', + 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', + 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', + 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', + 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', + 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', + 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', + 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', + 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', + 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', + 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', + 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', + 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', + 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', + 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', + 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', + 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', + 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', + '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', + 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', + 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', + 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', + 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', + 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', + 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', + 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', + 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', + 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', + 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', + 'a', 't', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', + 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', + 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', + 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', + 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', + 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', + 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', + 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', + 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', + 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', + 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', + 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', + 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', + 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', + 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', + 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', + 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', + 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', + 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', + 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', + 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', + 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', + 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', + 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', + 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', + 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', + 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', + 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', + 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', + 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', + 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', + 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', + 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', + 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', + 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', + 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', + 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', + 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', + 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', + 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', + 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', + 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', + 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', + 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', + 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', + 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', + 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', + 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', + 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', + 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', + 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', + 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', + 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', + 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', + 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', + 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', + 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', + 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', + 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', + 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', + 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', + 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', + 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', + 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', + 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', + 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', + 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', + 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', + 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', + 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', + 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', + 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', + 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', + 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', + 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', + 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', + 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', + 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', + 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', + 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', + 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', + 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', + 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', + 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', + 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', + 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', + 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', + 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', + 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', + 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', + 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', + 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', + 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', + 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', + 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', + 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', + 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', + 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', + 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', + 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', + 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', + 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', + 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', + 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', + 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', + 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', + 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', + 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', + 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', + 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', + 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', + 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', + 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', + 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', + 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', + 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', + 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', + 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', + 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', + 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', + 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', + 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', + 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', + 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', + 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', + 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', + 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', + 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', + 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', + 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', + 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', + 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', + 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', + 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', + 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', + 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', + 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', + 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', + 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', + 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', + 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', + 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', + 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', + 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', + 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', + 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', + 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', + 'n', 'o', 'w', 't', 'h', 'a', 't', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', + 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', + 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', + 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', + 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', + 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', + 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', + 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', + 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', + 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', + 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', + 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', + 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', + 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', + 'r', 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', + 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', + 't', 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', + 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', + 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', + 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', + 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', + 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', + 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', + 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', + 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', + 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', + 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', + 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', + 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', + 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', + '\n', 'l', 'a', 's', 's', 'o', 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', + 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', + 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'K', 'u', 'r', 't', + 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', 'c', + 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', 'I', + 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', 'e', + 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', '9', + '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', 'f', + 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', 'n', + 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', 'u', + 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', + 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', + 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', + 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', + 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', + 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', + 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', + 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', + 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', + 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', + 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', + 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', + 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', + 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', + 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', + 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', + 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', + 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', + 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', + 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', + 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', + 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', + 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', + 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', + 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', + 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', + 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', + 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', + 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', + 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', 'r', + 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', 'n', + 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', 'M', + 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', 'l', + 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', 'f', + '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'I', + 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', 'o', + 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', 'f', + 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', + 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', + 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', + 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', + 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', + 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', + 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', + 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', + 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', + 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', + 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', + 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', + 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', + 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', + 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', + 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', + 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', + 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', + 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', + 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', + 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', + 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', + 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', + 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', + 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', + 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', + 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', + 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', + 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', + 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', + 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 'K', 'u', + 'r', 't', 'V', 'o', 'n', 'n', 'e', 'g', 'u', 't', 's', 'C', 'o', 'm', 'm', 'e', + 'n', 'c', 'e', 'm', 'e', 'n', 't', 'A', 'd', 'd', 'r', 'e', 's', 's', 'a', 't', + 'M', 'I', 'T', 'L', 'a', 'd', 'i', 'e', 's', 'a', 'n', 'd', 'g', 'e', 'n', 't', + 'l', 'e', 'm', 'e', 'n', 'o', 'f', 't', 'h', 'e', 'c', 'l', 'a', 's', 's', 'o', + 'f', '9', '7', 'W', 'e', 'a', 'r', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', + 'I', 'f', 'I', 'c', 'o', 'u', 'l', 'd', 'o', 'f', 'f', 'e', 'r', 'y', 'o', 'u', + 'o', 'n', 'l', 'y', 'o', 'n', 'e', 't', 'i', 'p', 'f', 'o', 'r', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', + 'o', 'u', 'l', 'd', 'b', 'e', 'i', 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', + 'e', 'r', 'm', 'b', 'e', 'n', 'e', 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', + 's', 'c', 'r', 'e', 'e', 'n', 'h', 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', + 'o', 'v', 'e', 'd', 'b', 'y', 's', 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', + 'w', 'h', 'e', 'r', 'e', 'a', 's', 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', + 'm', 'y', 'a', 'd', 'v', 'i', 'c', 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', + 'i', 's', 'm', 'o', 'r', 'e', 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', + 'a', 'n', 'm', 'y', 'o', 'w', 'n', 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', + 'g', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', + 'd', 'i', 's', 'p', 'e', 'n', 's', 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', + 'c', 'e', 'n', 'o', 'w', 'E', 'n', 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', + 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', + 'r', 'y', 'o', 'u', 't', 'h', 'O', 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', + 'd', 'Y', 'o', 'u', 'w', 'i', 'l', 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', + 's', 't', 'a', 'n', 'd', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', + 'b', 'e', 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', + 'h', 'u', 'n', 't', 'i', 'l', 't', 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', + 'd', 'B', 'u', 't', 't', 'r', 'u', 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', + 'e', 'a', 'r', 's', 'y', 'o', 'u', 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', + 'k', 'a', 't', 'p', 'h', 'o', 't', 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', + 'e', 'l', 'f', 'a', 'n', 'd', 'r', 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', + 'a', 'y', 'y', 'o', 'u', 'c', 'a', 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', + 'w', 'h', 'o', 'w', 'm', 'u', 'c', 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', + 'i', 't', 'y', 'l', 'a', 'y', 'b', 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', + 'n', 'd', 'h', 'o', 'w', 'f', 'a', 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', + 'r', 'e', 'a', 'l', 'l', 'y', 'l', 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', + 'r', 'e', 'n', 'o', 't', 'a', 's', 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', + 'm', 'a', 'g', 'i', 'n', 'e', 'D', 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', + 'b', 'o', 'u', 't', 't', 'h', 'e', 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', + 'o', 'r', 'r', 'y', 'b', 'u', 't', 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', 's', + 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'w', 'o', 'u', 'l', 'd', 'b', 'e', 'i', + 't', 'T', 'h', 'e', 'l', 'o', 'n', 'g', 't', 'e', 'r', 'm', 'b', 'e', 'n', 'e', + 'f', 'i', 't', 's', 'o', 'f', 's', 'u', 'n', 's', 'c', 'r', 'e', 'e', 'n', 'h', + 'a', 'v', 'e', 'b', 'e', 'e', 'n', 'p', 'r', 'o', 'v', 'e', 'd', 'b', 'y', 's', + 'c', 'i', 'e', 'n', 't', 'i', 's', 't', 's', 'w', 'h', 'e', 'r', 'e', 'a', 's', + 't', 'h', 'e', 'r', 'e', 's', 't', 'o', 'f', 'm', 'y', 'a', 'd', 'v', 'i', 'c', + 'e', 'h', 'a', 's', 'n', 'o', 'b', 'a', 's', 'i', 's', 'm', 'o', 'r', 'e', 'r', + 'e', 'l', 'i', 'a', 'b', 'l', 'e', 't', 'h', 'a', 'n', 'm', 'y', 'o', 'w', 'n', + 'm', 'e', 'a', 'n', 'd', 'e', 'r', 'i', 'n', 'g', 'e', 'x', 'p', 'e', 'r', 'i', + 'e', 'n', 'c', 'e', 'I', 'w', 'i', 'l', 'l', 'd', 'i', 's', 'p', 'e', 'n', 's', + 'e', 't', 'h', 'i', 's', 'a', 'd', 'v', 'i', 'c', 'e', 'n', 'o', 'w', 'E', 'n', + 'j', 'o', 'y', 't', 'h', 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', + 'a', 'u', 't', 'y', 'o', 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'O', + 'h', 'n', 'e', 'v', 'e', 'r', 'm', 'i', 'n', 'd', 'Y', 'o', 'u', 'w', 'i', 'l', + 'l', 'n', 'o', 't', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 't', 'h', + 'e', 'p', 'o', 'w', 'e', 'r', 'a', 'n', 'd', 'b', 'e', 'a', 'u', 't', 'y', 'o', + 'f', 'y', 'o', 'u', 'r', 'y', 'o', 'u', 't', 'h', 'u', 'n', 't', 'i', 'l', 't', + 'h', 'e', 'y', 'v', 'e', 'f', 'a', 'd', 'e', 'd', 'B', 'u', 't', 't', 'r', 'u', + 's', 't', 'm', 'e', 'i', 'n', '2', '0', 'y', 'e', 'a', 'r', 's', 'y', 'o', 'u', + 'l', 'l', 'l', 'o', 'o', 'k', 'b', 'a', 'c', 'k', 'a', 't', 'p', 'h', 'o', 't', + 'o', 's', 'o', 'f', 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', 'a', 'n', 'd', 'r', + 'e', 'c', 'a', 'l', 'l', 'i', 'n', 'a', 'w', 'a', 'y', 'y', 'o', 'u', 'c', 'a', + 'n', 't', 'g', 'r', 'a', 's', 'p', 'n', 'o', 'w', 'h', 'o', 'w', 'm', 'u', 'c', + 'h', 'p', 'o', 's', 's', 'i', 'b', 'i', 'l', 'i', 't', 'y', 'l', 'a', 'y', 'b', + 'e', 'f', 'o', 'r', 'e', 'y', 'o', 'u', 'a', 'n', 'd', 'h', 'o', 'w', 'f', 'a', + 'b', 'u', 'l', 'o', 'u', 's', 'y', 'o', 'u', 'r', 'e', 'a', 'l', 'l', 'y', 'l', + 'o', 'o', 'k', 'e', 'd', 'Y', 'o', 'u', 'a', 'r', 'e', 'n', 'o', 't', 'a', 's', + 'f', 'a', 't', 'a', 's', 'y', 'o', 'u', 'i', 'm', 'a', 'g', 'i', 'n', 'e', 'D', + 'o', 'n', 't', 'w', 'o', 'r', 'r', 'y', 'a', 'b', 'o', 'u', 't', 't', 'h', 'e', + 'f', 'u', 't', 'u', 'r', 'e', 'O', 'r', 'w', 'o', 'r', 'r', 'y', 'b', 'u', 't', + 'k', 'n', 'o', 'w', 't', 'h', 'a', 't', '\n' +}; diff --git a/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc.c b/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc.c new file mode 100755 index 0000000..eaa7183 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc.c @@ -0,0 +1,232 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: rijndael_enc + + Author: Dr Brian Gladman + + Function: rijndael_enc is an implementation of the AES encryption + algorithm (Rijndael). + + Source: security section of MiBench + + Changes: Add computation of a checksum, refactoring + + License: see below + +*/ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +#include "aes.h" +#include "rijndael_enc_libc.h" + +/* + Global variable definitions +*/ +unsigned char rijndael_enc_key[ 32 ]; +int rijndael_enc_key_len; + +extern unsigned char rijndael_enc_data[ ]; +struct rijndael_enc_FILE rijndael_enc_fin; + +int rijndael_enc_checksum = 0; + +/* + Forward declaration of functions +*/ +void rijndael_enc_init( void ); +int rijndael_enc_return( void ); +void rijndael_enc_fillrand( unsigned char *buf, int len ); +void rijndael_enc_encfile( struct rijndael_enc_FILE *fin, struct aes *ctx ); +void rijndael_enc_main( void ); + +void rijndael_enc_init( void ) +{ + /* create a pseudo-file for the input*/ + rijndael_enc_fin.data = rijndael_enc_data; + rijndael_enc_fin.size = 31369; + rijndael_enc_fin.cur_pos = 0; + + unsigned i; + volatile int x = 0; + rijndael_enc_fin.size ^= x; + _Pragma( "loopbound min 31369 max 31369" ) + for ( i = 0; i < rijndael_enc_fin.size; i++ ) + rijndael_enc_fin.data[ i ] ^= x; + + /* this is a pointer to the hexadecimal key digits */ + const volatile char *cp = + "1234567890abcdeffedcba09876543211234567890abcdeffedcba0987654321"; + char ch; + int by = 0; + + i = 0; /* this is a count for the input digits processed */ + _Pragma( "loopbound min 64 max 64" ) + while ( i < 64 && *cp ) { /* the maximum key length is 32 bytes and */ + /* hence at most 64 hexadecimal digits */ + ch = rijndael_enc_toupper( *cp++ ); /* process a hexadecimal digit */ + if ( ch >= '0' && ch <= '9' ) + by = ( by << 4 ) + ch - '0'; + else + if ( ch >= 'A' && ch <= 'F' ) + by = ( by << 4 ) + ch - 'A' + 10; + else { /* error if not hexadecimal */ + rijndael_enc_checksum = -2; + return; + } + + /* store a key byte for each pair of hexadecimal digits */ + if ( i++ & 1 ) + rijndael_enc_key[ i / 2 - 1 ] = by & 0xff; + } + + if ( *cp ) { + rijndael_enc_checksum = -3; + return; + } else + if ( i < 32 || ( i & 15 ) ) { + rijndael_enc_checksum = -4; + return; + } + + rijndael_enc_key_len = i / 2; +} + +int rijndael_enc_return( void ) +{ + return ( ( rijndael_enc_checksum == ( int )249509 ) ? 0 : -1 ); +} + +/* A Pseudo Random Number Generator (PRNG) used for the */ +/* Initialisation Vector. The PRNG is George Marsaglia's */ +/* Multiply-With-Carry (MWC) PRNG that concatenates two */ +/* 16-bit MWC generators: */ +/* x(n)=36969 * x(n-1) + carry mod 2^16 */ +/* y(n)=18000 * y(n-1) + carry mod 2^16 */ +/* to produce a combined PRNG with a period of about 2^60. */ + +#define RAND(a,b) (((a = 36969 * (a & 65535) + (a >> 16)) << 16) + (b = 18000 * (b & 65535) + (b >> 16)) ) + +void rijndael_enc_fillrand( unsigned char *buf, int len ) +{ + static unsigned long a[ 2 ], mt = 1, count = 4; + static char r[ 4 ]; + int i; + + if ( mt ) { + mt = 0; + a[ 0 ] = 0xeaf3; + a[ 1 ] = 0x35fe; + } + + _Pragma( "loopbound min 1 max 16" ) + for ( i = 0; i < len; ++i ) { + if ( count == 4 ) { + *( unsigned long * )r = RAND( a[ 0 ], a[ 1 ] ); + count = 0; + } + + buf[ i ] = r[ count++ ]; + } +} + +void rijndael_enc_encfile( struct rijndael_enc_FILE *fin, struct aes *ctx ) +{ + unsigned char inbuf[ 16 ], outbuf[ 16 ]; + long int flen; + unsigned long i = 0, l = 0; + + rijndael_enc_fillrand( outbuf, + 16 ); /* set an IV for CBC mode */ + flen = fin->size; + + rijndael_enc_fillrand( inbuf, + 1 ); /* make top 4 bits of a byte random */ + l = 15; /* and store the length of the last */ + /* block in the lower 4 bits */ + inbuf[ 0 ] = ( ( char )flen & 15 ) | ( inbuf[ 0 ] & ~15 ); + + /* TODO: this is necessarily an input-dependent loop bound */ + _Pragma( "loopbound min 1960 max 1960" ) + while ( !rijndael_enc_feof( + fin ) ) { /* loop to encrypt the input file */ + /* input 1st 16 bytes to buf[ 1..16 ] */ + i = rijndael_enc_fread( inbuf + 16 - l, 1, l, fin ); /* on 1st round byte[ 0 ] */ + /* is the length code */ + if ( i < l ) break; /* if end of the input file reached */ + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; ++i ) /* xor in previous cipher text */ + inbuf[ i ] ^= outbuf[ i ]; + + rijndael_enc_encrypt( inbuf, outbuf, + ctx ); /* and do the encryption */ + + rijndael_enc_checksum += outbuf[ 15 ]; + + /* in all but first round read 16 */ + l = 16; /* bytes into the buffer */ + } + + /* except for files of length less than two blocks we now have one */ + /* byte from the previous block and 'i' bytes from the current one */ + /* to encrypt and 15 - i empty buffer positions. For files of less */ + /* than two blocks (0 or 1) we have i + 1 bytes and 14 - i empty */ + /* buffer position to set to zero since the 'count' byte is extra */ + + if ( l == 15 ) /* adjust for extra byte in the */ + ++i; /* in the first block */ + + if ( i ) { /* if bytes remain to be output */ + _Pragma( "loopbound min 6 max 6" ) + while ( i < 16 ) /* clear empty buffer positions */ + inbuf[ i++ ] = 0; + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 0; i < 16; ++i ) /* xor in previous cipher text */ + inbuf[ i ] ^= outbuf[ i ]; + + rijndael_enc_encrypt( inbuf, outbuf, ctx ); /* encrypt and output it */ + + rijndael_enc_checksum += outbuf[ 15 ]; + } +} + +void _Pragma( "entrypoint" ) rijndael_enc_main( void ) +{ + struct aes ctx[ 1 ]; + + /* encryption in Cipher Block Chaining mode */ + rijndael_enc_set_key( rijndael_enc_key, rijndael_enc_key_len, enc, ctx ); + rijndael_enc_encfile( &rijndael_enc_fin, ctx ); +} + +int main( void ) +{ + rijndael_enc_init(); + rijndael_enc_main(); + + return ( rijndael_enc_return() ); +} + diff --git a/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.c b/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.c new file mode 100755 index 0000000..d591081 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.c @@ -0,0 +1,66 @@ +#include "rijndael_enc_libc.h" + +int rijndael_enc_toupper( int c ) +{ + if ( ( c >= 'a' ) && ( c <= 'z' ) ) + return c - 'a' + 'A'; + return c; +} + +unsigned long rijndael_enc_fread( void *ptr, unsigned long size, + unsigned long count, struct rijndael_enc_FILE *stream ) +{ + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count ? + size * count : stream->size - stream->cur_pos; + _Pragma( "loopbound min 10 max 16" ) + while ( i < stream->cur_pos + number_of_chars_to_read ) + ( ( unsigned char * )ptr )[ i2++ ] = stream->data[ i++ ]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +unsigned long rijndael_enc_fwrite( const void *ptr, unsigned long size, + unsigned long count, struct rijndael_enc_FILE *stream ) +{ + unsigned i = stream->cur_pos, i2 = 0; + unsigned long number_of_chars_to_write = + stream->size - stream->cur_pos >= size * count ? + size * count : stream->size - stream->cur_pos; + _Pragma( "loopbound min 0 max 0" ) + while ( i < stream->cur_pos + number_of_chars_to_write ) + stream->data[ i++ ] = ( ( unsigned char * )ptr )[ i2++ ]; + stream->cur_pos += number_of_chars_to_write; + return number_of_chars_to_write; +} + +int rijndael_enc_fseek( struct rijndael_enc_FILE *stream, long int offset, + Origin origin ) +{ + if ( origin == RIJNDAEL_ENC_SEEK_SET ) { + stream->cur_pos = offset; + return 0; + } else + if ( origin == RIJNDAEL_ENC_SEEK_CUR ) { + stream->cur_pos += offset; + return 0; + } else + if ( origin == RIJNDAEL_ENC_SEEK_END ) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +int rijndael_enc_fgetpos( struct rijndael_enc_FILE *stream, + unsigned *position ) +{ + *position = stream->cur_pos; + return 0; +} + +int rijndael_enc_feof( struct rijndael_enc_FILE *stream ) +{ + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.h b/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.h new file mode 100755 index 0000000..6a01397 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_enc/rijndael_enc_libc.h @@ -0,0 +1,24 @@ +#ifndef RIJNDAEL_ENC_LIBC_H +#define RIJNDAEL_ENC_LIBC_H + +int rijndael_enc_toupper ( int c ); + +enum _Origin_ { RIJNDAEL_ENC_SEEK_SET, RIJNDAEL_ENC_SEEK_CUR, RIJNDAEL_ENC_SEEK_END }; +typedef enum _Origin_ Origin; +struct rijndael_enc_FILE { + unsigned char *data; + unsigned long size; + unsigned cur_pos; +}; + +unsigned long rijndael_enc_fread ( void *ptr, unsigned long size, + unsigned long count, struct rijndael_enc_FILE *stream ); +unsigned long rijndael_enc_fwrite ( const void *ptr, unsigned long size, + unsigned long count, struct rijndael_enc_FILE *stream ); +int rijndael_enc_fseek ( struct rijndael_enc_FILE *stream, long int offset, + Origin origin ); +int rijndael_enc_fgetpos( struct rijndael_enc_FILE *stream, + unsigned *position ); +int rijndael_enc_feof ( struct rijndael_enc_FILE *stream ); + +#endif // RIJNDAEL_ENC_LIBC_H diff --git a/targets/wasm-tacle/sequential/statemate/CMakeLists.txt b/targets/wasm-tacle/sequential/statemate/CMakeLists.txt new file mode 100644 index 0000000..636b38c --- /dev/null +++ b/targets/wasm-tacle/sequential/statemate/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(statemate) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/statemate.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/statemate.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/statemate/ChangeLog.txt b/targets/wasm-tacle/sequential/statemate/ChangeLog.txt new file mode 100755 index 0000000..bce75dc --- /dev/null +++ b/targets/wasm-tacle/sequential/statemate/ChangeLog.txt @@ -0,0 +1,60 @@ +File: statemate.c +Original provenience: Mälardalen benchmark suite, + http://www.mrtc.mdh.se/projects/wcet/benchmarks.html + +2016-02-02: +- Removed original header comment, replaced by TACLeBench header. +- Removed macro '#define float int' and replaced each 'float' by 'int' (8 in + total) +- Removed unused macro + - #define entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_copy_IDX 1 +- Removed unused variables + - int FH_TUERMODUL_CTRL__N_copy; + - int BLOCK_ERKENNUNG_CTRL__I_EIN_MAX_copy; + - int BLOCK_ERKENNUNG_CTRL__N_copy; + - char FH_TUERMODUL_CTRL__FT; + - char FH_TUERMODUL__COM_OPEN; + - char FH_TUERMODUL__COM_CLOSE; + - char FH_DU__S_FH_TMBFAUFCAN_copy; + - char FH_DU__S_FH_TMBFZUCAN_copy; +- Moved around all the following so that they are in the given order just after +the header + - macro definitions + - forward declarations of fuctions + - declarations of global variables +- Reordered functions in source code: initialization-related functions first, + followed by algorithm core functions, followed by main functions +- Added a new main function that first calls init function then the old main + function sans init +- Annotated statemate_main() as the entry point of the analysis +- Removed seemingly unnecessary empty lines +- Changed remaining floating number literals, all being used for time related + comparisons, to integer literals by multiplying them by 1000 so that the + code is totally floating number free. E.g: + changed 'time - sc_FH_TUERMODUL_CTRL_2375_2 >= 0.5f' + to 'time - sc_FH_TUERMODUL_CTRL_2375_2 >= 500' + Info: All time related variables were already converted to 'unsigned long' +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: statemate_) followed by lowercase letter + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + + 2016-10-10: + - added statemate_return() function diff --git a/targets/wasm-tacle/sequential/statemate/generated/default/statemate.wasm b/targets/wasm-tacle/sequential/statemate/generated/default/statemate.wasm new file mode 100755 index 0000000000000000000000000000000000000000..db1bdd1296a8c5d59d0e4e46ad730193c28e6974 GIT binary patch literal 8280 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 500)) { + statemate_FH_TUERMODUL__MFHA_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2375_2 = 0; + } + if ((statemate_sc_FH_TUERMODUL_CTRL_2352_1 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2352_1 >= 500)) { + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2352_1 = 0; + } + if ((statemate_sc_FH_TUERMODUL_CTRL_2329_1 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2329_1 >= 500)) { + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2329_1 = 0; + } + if ((statemate_sc_FH_TUERMODUL_CTRL_1781_10 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_1781_10 >= 500)) + statemate_sc_FH_TUERMODUL_CTRL_1781_10 = 0; + + if ((statemate_sc_FH_TUERMODUL_CTRL_1739_10 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_1739_10 >= 500)) + statemate_sc_FH_TUERMODUL_CTRL_1739_10 = 0; + + if ((SYS_bit_get(statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX) || + statemate_BLOCK_ERKENNUNG_CTRL__N != + statemate_BLOCK_ERKENNUNG_CTRL__N_old)) + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy = + statemate_time; +} /** statemate_interface **/ + +/* + Algorithm core functions +*/ + +void +statemate_generic_KINDERSICHERUNG_CTRL(void) { + if (SYS_bit_get(statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX)) { + switch ( + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state) { + case 1: { /** state ZENTRAL in chart KINDERSICHERUNG_CTRL **/ + if (!(statemate_FH_TUERMODUL__SFHA_ZENTRAL || + statemate_FH_TUERMODUL__SFHZ_ZENTRAL)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 3; + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 0; + break; + } + switch (statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state) { + case 1: { /** state IN_ZENTRAL in chart KINDERSICHERUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !(statemate_FH_TUERMODUL__SFHA_ZENTRAL_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + !(statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHA_ZENTRAL) && + statemate_FH_TUERMODUL__SFHA_ZENTRAL_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHZ_ZENTRAL) && + statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + break; + } + } /** switch statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state **/ + break; + } + case 2: { /** state MEC in chart KINDERSICHERUNG_CTRL **/ + if (!(statemate_FH_TUERMODUL__SFHA_MEC || + statemate_FH_TUERMODUL__SFHZ_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 3; + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 0; + break; + } + switch (statemate_MEC_KINDERSICHERUNG_CTRL_next_state) { + case 1: { /** state INMEC in chart KINDERSICHERUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHA_MEC && + !(statemate_FH_TUERMODUL__SFHA_MEC_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_MEC && + !(statemate_FH_TUERMODUL__SFHZ_MEC_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHA_MEC) && + statemate_FH_TUERMODUL__SFHA_MEC_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHZ_MEC) && + statemate_FH_TUERMODUL__SFHZ_MEC_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + break; + } + } /** switch statemate_MEC_KINDERSICHERUNG_CTRL_next_state **/ + break; + } + case 3: { /** state WAITING in chart KINDERSICHERUNG_CTRL **/ + if ((!statemate_FH_TUERMODUL__KL_50) && + (statemate_FH_TUERMODUL__SFHZ_MEC && + statemate_FH_TUERMODUL__SFHA_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 2; + break; + } + if ((!statemate_FH_TUERMODUL__KL_50) && + (statemate_FH_TUERMODUL__SFHZ_MEC && + !statemate_FH_TUERMODUL__SFHA_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 2; + break; + } + if ((!statemate_FH_TUERMODUL__KL_50) && + (!statemate_FH_TUERMODUL__SFHZ_MEC && + statemate_FH_TUERMODUL__SFHA_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 2; + break; + } + if ((!statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !statemate_FH_TUERMODUL__KL_50)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + statemate_FH_TUERMODUL__SFHA_ZENTRAL)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + !statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !statemate_FH_TUERMODUL__KL_50)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + break; + } + } /** switch + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state **/ + } +} + +void +statemate_generic_FH_TUERMODUL_CTRL(void) { + if (!SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX) && + SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_old_IDX) && + !SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX)) { + SYS_bit_clr(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX); + SYS_bit_clr(statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX); + } + if (SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX)) { + if (!SYS_bit_get(statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX)) + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + SYS_bit_clr(statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX)) { + SYS_bit_clr(statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + } + SYS_bit_clr(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + switch (statemate_B_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state ZAEHLER_WHSP_ZU_HOCH in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL_CTRL__N == 59 && + !(statemate_FH_TUERMODUL_CTRL__N_old == 59))) { + statemate_stable = 0; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 3; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + break; + } + case 2: { /** state NICHT_INITIALISIERT in chart FH_TUERMODUL_CTRL **/ + if (((statemate_FH_TUERMODUL__BLOCK && + !(statemate_FH_TUERMODUL__BLOCK_old))) && + ((statemate_FH_TUERMODUL__MFHZ))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2329_1 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 3; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state) { + case 1: { /** state SCHLIESSEN in chart NICHT_INITIALISIERT **/ + if (!(statemate_FH_TUERMODUL__SFHZ)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + break; + } + case 2: { /** state OEFFNEN in chart NICHT_INITIALISIERT **/ + if (!(statemate_FH_TUERMODUL__SFHA)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + break; + } + case 3: { /** state BEREIT in chart NICHT_INITIALISIERT **/ + if ((statemate_FH_TUERMODUL__SFHA)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 1; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 2; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 1; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + } /** switch + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state + **/ + break; + } + case 3: { /** state INITIALISIERT in chart FH_TUERMODUL_CTRL **/ + if (((statemate_FH_TUERMODUL_CTRL__N > 60 && + !(statemate_FH_TUERMODUL_CTRL__N_old > 60))) && + ((!(statemate_FH_TUERMODUL_CTRL__INREVERS1 || + statemate_FH_TUERMODUL_CTRL__INREVERS2)))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + if (((statemate_FH_TUERMODUL__BLOCK && + !(statemate_FH_TUERMODUL__BLOCK_old))) && + ((statemate_FH_TUERMODUL__MFHA))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2375_2 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + if (((statemate_FH_TUERMODUL__BLOCK && + !(statemate_FH_TUERMODUL__BLOCK_old))) && + ((statemate_FH_TUERMODUL__MFHZ))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2352_1 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + switch (statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__POSITION >= 405)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch (statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state TIPP_OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old)) || + (statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + case 2: { /** state MAN_OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old))) { + statemate_stable = 0; + + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHA) && + statemate_FH_TUERMODUL__SFHA_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + } /** switch statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state **/ + break; + } + case 2: { /** state SCHLIESSEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__POSITION <= 0)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch (statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state TIPP_SCHLIESSEN in chart FH_TUERMODUL_CTRL + **/ + if ((statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old)) || + (statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + break; + } + switch ( + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state REVERSIEREN2 in chart FH_TUERMODUL_CTRL + **/ + SYS_bit_clr(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 1; + statemate_FH_TUERMODUL_CTRL__INREVERS2_copy = 0; + + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + break; + } + break; + } + case 2: { /** state TIPP_SCHLIESSEN1 in chart + FH_TUERMODUL_CTRL **/ + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL__EINKLEMMUNG_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS2_copy = 1; + + SYS_bit_set(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 1; + SYS_bit_clr(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_sc_FH_TUERMODUL_CTRL_1781_10 = + statemate_time; + statemate_FH_TUERMODUL__MFHA_copy = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + break; + } + } /** switch + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + case 2: { /** state MANUELL_SCHLIESSEN in chart + FH_TUERMODUL_CTRL **/ + if ((!(statemate_FH_TUERMODUL__SFHZ) && + statemate_FH_TUERMODUL__SFHZ_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + break; + } + switch ( + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state REVERSIEREN1 in chart FH_TUERMODUL_CTRL + **/ + SYS_bit_clr(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS1_copy = 0; + + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + break; + } + case 2: { /** state MAN_SCHLIESSEN in chart + FH_TUERMODUL_CTRL **/ + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL__EINKLEMMUNG_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS1_copy = 1; + + SYS_bit_set(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 1; + SYS_bit_clr(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + + statemate_sc_FH_TUERMODUL_CTRL_1739_10 = + statemate_time; + statemate_FH_TUERMODUL__MFHA_copy = 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old))) { + statemate_stable = 0; + + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 1; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 0; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + } /** switch + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + default: { + statemate_stable = 0; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + } /** switch statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + case 3: { /** state BEREIT in chart FH_TUERMODUL_CTRL **/ + if (((statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old))) && + ((statemate_FH_TUERMODUL__POSITION > 0))) { + statemate_stable = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 2; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + if (((statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old))) && + ((statemate_FH_TUERMODUL__POSITION < 405))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 1; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 1; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + } /** switch statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + default: { + statemate_stable = 0; + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + } /** switch statemate_B_FH_TUERMODUL_CTRL_next_state **/ + switch (statemate_A_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state WIEDERHOLSPERRE in chart FH_TUERMODUL_CTRL **/ + SYS_bit_clr(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + if ((statemate_step == 1 && + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL != + 0 && + (statemate_time - + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL == + 1)) && + ((statemate_FH_TUERMODUL__MFHZ || + statemate_FH_TUERMODUL__MFHA))) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = + statemate_FH_TUERMODUL_CTRL__N + 1; + + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + switch (statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state WDHSP in chart FH_TUERMODUL_CTRL **/ + if ((statemate_step == 1 && + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL != + 0 && + (statemate_time - + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL == + 3)) && + (((!(statemate_FH_TUERMODUL__MFHZ || + statemate_FH_TUERMODUL__MFHA)) && + statemate_FH_TUERMODUL_CTRL__N > 0))) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = + statemate_FH_TUERMODUL_CTRL__N - 1; + + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + SYS_bit_set(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + } /** switch statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + default: { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + } /** switch statemate_A_FH_TUERMODUL_CTRL_next_state **/ + SYS_bit_cpy(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX); + } +} + +void +statemate_generic_EINKLEMMSCHUTZ_CTRL(void) { + if (SYS_bit_get(statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX)) { + switch (statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state) { + case 1: { /** state NORMALBETRIEB in chart EINKLEMMSCHUTZ_CTRL **/ + if (((statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV && + !(statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old))) && + ((!(statemate_FH_TUERMODUL__SFHZ && + statemate_FH_TUERMODUL__SFHA)))) { + statemate_stable = 0; + + SYS_bit_set(statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX); + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = + 2; + break; + } + break; + } + case 2: { /** state EINKLEMMUNG in chart EINKLEMMSCHUTZ_CTRL **/ + SYS_bit_clr(statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX); + if ((!(statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV) && + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old)) { + statemate_stable = 0; + + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = + 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 1; + break; + } + } /** switch + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state **/ + } +} + +void +statemate_generic_BLOCK_ERKENNUNG_CTRL(void) { + if (!SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX) && + SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_old_IDX) && + !SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX)) + SYS_bit_clr(statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + if (SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX)) { + switch ( + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state) { + case 1: { /** state KEINE_BEWEGUNG in chart BLOCK_ERKENNUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__I_EIN != + statemate_FH_TUERMODUL__I_EIN_old) && + ((statemate_FH_TUERMODUL__I_EIN > 0))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__BLOCK_copy = 0; + + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = + 2; + statemate_BLOCK_ERKENNUNG_CTRL__N = 0; + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = 2; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 3; + SYS_bit_set( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + break; + } + break; + } + case 2: { /** state BEWEGUNG in chart BLOCK_ERKENNUNG_CTRL **/ + if ((!(statemate_FH_TUERMODUL__MFHA) && + statemate_FH_TUERMODUL__MFHA_old) || + (!(statemate_FH_TUERMODUL__MFHZ) && + statemate_FH_TUERMODUL__MFHZ_old)) { + statemate_stable = 0; + + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = + 1; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 0; + break; + } + switch (statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state) { + case 1: { /** state FENSTER_BLOCKIERT in chart BLOCK_ERKENNUNG_CTRL + **/ + break; + } + case 2: { /** state FENSTER_BEWEGT_SICH in chart + BLOCK_ERKENNUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__I_EIN > + (statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX - 2))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__BLOCK_copy = 1; + + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 1; + break; + } + break; + } + case 3: { /** state EINSCHALTSTROM_MESSEN in chart + BLOCK_ERKENNUNG_CTRL **/ + SYS_bit_clr( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + if ((statemate_BLOCK_ERKENNUNG_CTRL__N == 11 && + !(statemate_BLOCK_ERKENNUNG_CTRL__N_old == 11))) { + statemate_stable = 0; + + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 2; + break; + } + /** static reactions: **/ + if (statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state == 3) { + if (statemate_step == 1 && + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy != + 0 && + (statemate_time - + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy == + 2)) { + statemate_BLOCK_ERKENNUNG_CTRL__N = + statemate_BLOCK_ERKENNUNG_CTRL__N + 1; + if ((statemate_FH_TUERMODUL__I_EIN > + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX)) + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = + statemate_FH_TUERMODUL__I_EIN; + } + } + /** end static reactions **/ + break; + } + default: { + statemate_stable = 0; + statemate_BLOCK_ERKENNUNG_CTRL__N = 0; + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = 2; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 3; + SYS_bit_set( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + break; + } + } /** switch statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state **/ + break; + } + default: { + statemate_stable = 0; + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + break; + } + } /** switch + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state **/ + } +} + +void +statemate_FH_DU(void) { + statemate_time = 1; /**SYS_get_clock()**/ + statemate_stable = 0; + statemate_step = 0; + // patched for wcet: replacing while statement by for + // while (!statemate_stable) + int i; + __pragma_loopbound(100, 100); + for (i = 0; i < 100; i++) { + statemate_stable = 1; + statemate_step++; + { + switch ( + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state) { + case 1: { /** state SCHLIESSEN in chart FH_STEUERUNG_DUMMY **/ + if ((!(statemate_FH_DU__MFHZ) && statemate_FH_DU__MFHZ_old)) { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 2; + break; + } + break; + } + case 2: { /** state BEREIT in chart FH_STEUERUNG_DUMMY **/ + if ((statemate_FH_DU__MFHZ && !(statemate_FH_DU__MFHZ_old))) { + statemate_stable = 0; + statemate_FH_DU__MFH = -100; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 1; + break; + } + if ((statemate_FH_DU__MFHA && !(statemate_FH_DU__MFHA_old))) { + statemate_stable = 0; + statemate_FH_DU__MFH = 100; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 3; + break; + } + break; + } + case 3: { /** state OEFFNEN in chart FH_STEUERUNG_DUMMY **/ + if ((!(statemate_FH_DU__MFHA) && statemate_FH_DU__MFHA_old)) { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 2; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 2; + break; + } + } /** switch + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state **/ + } + { + { + if (!SYS_bit_get(statemate_bitlist, + active_KINDERSICHERUNG_CTRL_IDX)) + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 3; + SYS_bit_clr(statemate_bitlist, + active_KINDERSICHERUNG_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_IDX)) + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = + 1; + SYS_bit_clr(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_IDX)) { + SYS_bit_clr( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = + 1; + } + SYS_bit_clr(statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, + active_FH_TUERMODUL_CTRL_IDX)) { + SYS_bit_clr(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX); + SYS_bit_clr(statemate_bitlist, + exited_BEREIT_FH_TUERMODUL_CTRL_IDX); + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_FH_TUERMODUL_CTRL__N = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set( + statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + } + SYS_bit_clr(statemate_bitlist, + active_FH_TUERMODUL_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_KINDERSICHERUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_FH_TUERMODUL_CTRL_copy_IDX); + /** static reactions: **/ + if (statemate_FH_DU__S_FH_TMBFZUCAN != + statemate_FH_DU__S_FH_TMBFZUCAN_old) { + if ((!statemate_FH_DU__DOOR_ID)) + statemate_FH_DU__S_FH_FTZU = + statemate_FH_DU__S_FH_TMBFZUCAN; + } + if (statemate_FH_DU__S_FH_TMBFZUDISC != + statemate_FH_DU__S_FH_TMBFZUDISC_old) { + if (statemate_FH_DU__DOOR_ID) + statemate_FH_DU__S_FH_TMBFZUCAN = + statemate_FH_DU__S_FH_TMBFZUDISC; + } + if (statemate_FH_DU__S_FH_TMBFAUFCAN != + statemate_FH_DU__S_FH_TMBFAUFCAN_old) { + if ((!statemate_FH_DU__DOOR_ID)) + statemate_FH_DU__S_FH_FTAUF = + statemate_FH_DU__S_FH_TMBFAUFCAN; + } + if (statemate_FH_DU__S_FH_TMBFAUFDISC != + statemate_FH_DU__S_FH_TMBFAUFDISC_old) { + if (statemate_FH_DU__DOOR_ID) + statemate_FH_DU__S_FH_TMBFAUFCAN = + statemate_FH_DU__S_FH_TMBFAUFDISC; + } + /** end static reactions **/ + } + } + SYS_bit_cpy(statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX, + statemate_bitlist, active_KINDERSICHERUNG_CTRL_old_IDX); + SYS_bit_cpy(statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX, + statemate_bitlist, active_FH_TUERMODUL_CTRL_old_IDX); + SYS_bit_cpy(statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX, + statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_old_IDX); + SYS_bit_cpy(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX, + statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_old_IDX); + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_KINDERSICHERUNG_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_FH_TUERMODUL_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_EINKLEMMSCHUTZ_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_BLOCK_ERKENNUNG_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + SYS_bit_cpy(statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX, + statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX, + statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX, + statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX); + statemate_FH_TUERMODUL_CTRL__N_old = statemate_FH_TUERMODUL_CTRL__N; + statemate_FH_TUERMODUL__I_EIN_old = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__MFH = statemate_FH_DU__MFH_copy; + statemate_FH_DU__I_EIN_old = statemate_FH_DU__I_EIN; + statemate_BLOCK_ERKENNUNG_CTRL__N_old = + statemate_BLOCK_ERKENNUNG_CTRL__N; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old = + statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_TUERMODUL__SFHZ_MEC_old = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL_old = + statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_TUERMODUL__SFHA_MEC_old = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_TUERMODUL__BLOCK = statemate_FH_TUERMODUL__BLOCK_copy; + statemate_FH_TUERMODUL__BLOCK_old = statemate_FH_TUERMODUL__BLOCK; + statemate_FH_TUERMODUL__SFHZ = statemate_FH_TUERMODUL__SFHZ_copy; + statemate_FH_TUERMODUL__SFHZ_old = statemate_FH_TUERMODUL__SFHZ; + statemate_FH_TUERMODUL__SFHA = statemate_FH_TUERMODUL__SFHA_copy; + statemate_FH_TUERMODUL__SFHA_old = statemate_FH_TUERMODUL__SFHA; + statemate_FH_TUERMODUL__MFHZ = statemate_FH_TUERMODUL__MFHZ_copy; + statemate_FH_TUERMODUL__MFHZ_old = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_TUERMODUL__MFHA = statemate_FH_TUERMODUL__MFHA_copy; + statemate_FH_TUERMODUL__MFHA_old = statemate_FH_TUERMODUL__MFHA; + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__EKS_LEISTE_AKTIV_old = + statemate_FH_DU__EKS_LEISTE_AKTIV; + statemate_FH_DU__S_FH_TMBFAUFCAN_old = statemate_FH_DU__S_FH_TMBFAUFCAN; + statemate_FH_DU__S_FH_TMBFZUCAN_old = statemate_FH_DU__S_FH_TMBFZUCAN; + statemate_FH_DU__S_FH_TMBFZUDISC_old = statemate_FH_DU__S_FH_TMBFZUDISC; + statemate_FH_DU__S_FH_TMBFAUFDISC_old = + statemate_FH_DU__S_FH_TMBFAUFDISC; + statemate_FH_DU__BLOCK = statemate_FH_DU__BLOCK_copy; + statemate_FH_DU__BLOCK_old = statemate_FH_DU__BLOCK; + statemate_FH_DU__MFHZ = statemate_FH_DU__MFHZ_copy; + statemate_FH_DU__MFHZ_old = statemate_FH_DU__MFHZ; + statemate_FH_DU__MFHA = statemate_FH_DU__MFHA_copy; + statemate_FH_DU__MFHA_old = statemate_FH_DU__MFHA; + + } /** while(!statemate_stable) **/ + +} /** statemate_FH_DU **/ + +/* + Main functions +*/ + +int +statemate_return() { + unsigned long int checksum = 0; + int index; + __pragma_loopbound(64, 64); + for (index = 63; index >= 0; index--) + checksum += (unsigned long) (statemate_bitlist[index]) << index; + return (checksum != 32ul); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +statemate_main(void) { + statemate_FH_DU(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + statemate_init(); + statemate_main(); + + return statemate_return(); +} diff --git a/targets/wasm-tacle/sequential/statemate/generated/modified_sources/inline/statemate.c b/targets/wasm-tacle/sequential/statemate/generated/modified_sources/inline/statemate.c new file mode 100644 index 0000000..a165c6f --- /dev/null +++ b/targets/wasm-tacle/sequential/statemate/generated/modified_sources/inline/statemate.c @@ -0,0 +1,1398 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: statemate + + Author: Friedhelm Stappert, C-LAB, Paderborn, Germany + + Function: This code was automatically generated by + the STAtechart Real-time-Code generator STARC + which was developed at C-LAB. + + The original StateChart specifies an experimental + car window lift control. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/statemate/statemate.c + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Macro definitions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define SYS_bit_get(a, b) (a)[(b)] +#define SYS_bit_clr(a, b) (a)[(b)] = 0 +#define SYS_bit_set(a, b) (a)[(b)] = 1 +#define SYS_bit_cpy(a1, i1, a2, i2) (a1)[(i1)] = (a2)[(i2)] + +#define active_KINDERSICHERUNG_CTRL_IDX 10 +#define active_KINDERSICHERUNG_CTRL_copy_IDX 11 +#define active_KINDERSICHERUNG_CTRL_old_IDX 12 +#define active_FH_TUERMODUL_CTRL_IDX 13 +#define active_FH_TUERMODUL_CTRL_copy_IDX 14 +#define active_FH_TUERMODUL_CTRL_old_IDX 15 +#define active_EINKLEMMSCHUTZ_CTRL_IDX 16 +#define active_EINKLEMMSCHUTZ_CTRL_copy_IDX 17 +#define active_EINKLEMMSCHUTZ_CTRL_old_IDX 18 +#define active_BLOCK_ERKENNUNG_CTRL_IDX 19 +#define active_BLOCK_ERKENNUNG_CTRL_copy_IDX 20 +#define active_BLOCK_ERKENNUNG_CTRL_old_IDX 21 +#define entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX 0 + +#define entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX 4 +#define entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX 5 +#define exited_BEREIT_FH_TUERMODUL_CTRL_IDX 6 +#define exited_BEREIT_FH_TUERMODUL_CTRL_copy_IDX 7 + +#define FH_TUERMODUL_CTRL__END_REVERS_IDX 22 +#define FH_TUERMODUL_CTRL__END_REVERS_copy_IDX 23 +#define FH_TUERMODUL__EINKLEMMUNG_IDX 24 + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void statemate_init(void); +__attribute__((always_inline)) static inline void statemate_interface(void); +__attribute__((always_inline)) static inline void +statemate_generic_KINDERSICHERUNG_CTRL(void); +__attribute__((always_inline)) static inline void +statemate_generic_FH_TUERMODUL_CTRL(void); +__attribute__((always_inline)) static inline void +statemate_generic_EINKLEMMSCHUTZ_CTRL(void); +__attribute__((always_inline)) static inline void +statemate_generic_BLOCK_ERKENNUNG_CTRL(void); +__attribute__((always_inline)) static inline void statemate_FH_DU(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +statemate_main(void); +__attribute__((always_inline)) static inline int statemate_return(void); + +/* + Declaration of global variables +*/ + +static char statemate_bitlist[64]; +unsigned long + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy; +unsigned long + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL; +unsigned long statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_2375_2; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_2352_1; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_2329_1; +int statemate_FH_TUERMODUL_CTRL__N; +int statemate_FH_TUERMODUL_CTRL__N_old; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_1781_10; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_1739_10; +int statemate_FH_TUERMODUL__POSITION; +int statemate_FH_TUERMODUL__I_EIN; +int statemate_FH_TUERMODUL__I_EIN_old; +int statemate_FH_DU__MFH; +int statemate_FH_DU__MFH_copy; +int statemate_FH_DU__POSITION; +int statemate_FH_DU__I_EIN; +int statemate_FH_DU__I_EIN_old; +int statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX; +int statemate_BLOCK_ERKENNUNG_CTRL__N; +int statemate_BLOCK_ERKENNUNG_CTRL__N_old; +char statemate_FH_TUERMODUL_CTRL__INREVERS2; +char statemate_FH_TUERMODUL_CTRL__INREVERS2_copy; +char statemate_FH_TUERMODUL_CTRL__INREVERS1; +char statemate_FH_TUERMODUL_CTRL__INREVERS1_copy; +char statemate_FH_TUERMODUL__SFHZ_ZENTRAL; +char statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old; +char statemate_FH_TUERMODUL__SFHZ_MEC; +char statemate_FH_TUERMODUL__SFHZ_MEC_old; +char statemate_FH_TUERMODUL__SFHA_ZENTRAL; +char statemate_FH_TUERMODUL__SFHA_ZENTRAL_old; +char statemate_FH_TUERMODUL__SFHA_MEC; +char statemate_FH_TUERMODUL__SFHA_MEC_old; +char statemate_FH_TUERMODUL__KL_50; +char statemate_FH_TUERMODUL__BLOCK; +char statemate_FH_TUERMODUL__BLOCK_copy; +char statemate_FH_TUERMODUL__BLOCK_old; +char statemate_FH_TUERMODUL__FT; +char statemate_FH_TUERMODUL__SFHZ; +char statemate_FH_TUERMODUL__SFHZ_copy; +char statemate_FH_TUERMODUL__SFHZ_old; +char statemate_FH_TUERMODUL__SFHA; +char statemate_FH_TUERMODUL__SFHA_copy; +char statemate_FH_TUERMODUL__SFHA_old; +char statemate_FH_TUERMODUL__MFHZ; +char statemate_FH_TUERMODUL__MFHZ_copy; +char statemate_FH_TUERMODUL__MFHZ_old; +char statemate_FH_TUERMODUL__MFHA; +char statemate_FH_TUERMODUL__MFHA_copy; +char statemate_FH_TUERMODUL__MFHA_old; +char statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; +char statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old; +char statemate_FH_DU__KL_50; +char statemate_FH_DU__S_FH_FTZU; +char statemate_FH_DU__S_FH_FTAUF; +char statemate_FH_DU__FT; +char statemate_FH_DU__EKS_LEISTE_AKTIV; +char statemate_FH_DU__EKS_LEISTE_AKTIV_old; +char statemate_FH_DU__S_FH_TMBFAUFCAN; +char statemate_FH_DU__S_FH_TMBFAUFCAN_old; +char statemate_FH_DU__S_FH_TMBFZUCAN; +char statemate_FH_DU__S_FH_TMBFZUCAN_old; +char statemate_FH_DU__S_FH_TMBFZUDISC; +char statemate_FH_DU__S_FH_TMBFZUDISC_old; +char statemate_FH_DU__S_FH_TMBFAUFDISC; +char statemate_FH_DU__S_FH_TMBFAUFDISC_old; +char statemate_FH_DU__S_FH_ZUDISC; +char statemate_FH_DU__S_FH_AUFDISC; +char statemate_FH_DU__DOOR_ID; +char statemate_FH_DU__BLOCK; +char statemate_FH_DU__BLOCK_copy; +char statemate_FH_DU__BLOCK_old; +char statemate_FH_DU__MFHZ; +char statemate_FH_DU__MFHZ_copy; +char statemate_FH_DU__MFHZ_old; +char statemate_FH_DU__MFHA; +char statemate_FH_DU__MFHA_copy; +char statemate_FH_DU__MFHA_old; + +unsigned long statemate_time; +char statemate_stable; +char statemate_step; + +char + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state; /** 2 bits **/ +char statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state; /** 1 bits **/ +char statemate_MEC_KINDERSICHERUNG_CTRL_next_state; /** 1 bits **/ +char statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state; /** 2 bits + **/ +char statemate_B_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_A_FH_TUERMODUL_CTRL_next_state; /** 1 bits **/ +char statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state; /** 1 bits **/ +char statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state; /** 2 bits **/ +char + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state; /** 2 bits **/ +char statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state; /** 2 bits **/ +char statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state; /** 2 bits + **/ + +/* + Initialization-related functions +*/ + +__attribute__((always_inline)) static inline void +statemate_init(void) { + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy = + 0; + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL = + 0; + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = 0; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 0; + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 0; + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 0; + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 0; + statemate_B_FH_TUERMODUL_CTRL_next_state = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 0; + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 0; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 0; + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 0; + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 0; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 0; + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 0; + + statemate_interface(); +} /** statemate_init **/ + +__attribute__((always_inline)) static inline void +statemate_interface(void) { + if (SYS_bit_get(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX)) + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = statemate_time; + if (SYS_bit_get(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX) || + SYS_bit_get(statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX)) + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL = + statemate_time; + if ((statemate_sc_FH_TUERMODUL_CTRL_2375_2 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2375_2 >= 500)) { + statemate_FH_TUERMODUL__MFHA_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2375_2 = 0; + } + if ((statemate_sc_FH_TUERMODUL_CTRL_2352_1 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2352_1 >= 500)) { + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2352_1 = 0; + } + if ((statemate_sc_FH_TUERMODUL_CTRL_2329_1 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2329_1 >= 500)) { + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2329_1 = 0; + } + if ((statemate_sc_FH_TUERMODUL_CTRL_1781_10 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_1781_10 >= 500)) + statemate_sc_FH_TUERMODUL_CTRL_1781_10 = 0; + + if ((statemate_sc_FH_TUERMODUL_CTRL_1739_10 != 0) && + (statemate_time - statemate_sc_FH_TUERMODUL_CTRL_1739_10 >= 500)) + statemate_sc_FH_TUERMODUL_CTRL_1739_10 = 0; + + if ((SYS_bit_get(statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX) || + statemate_BLOCK_ERKENNUNG_CTRL__N != + statemate_BLOCK_ERKENNUNG_CTRL__N_old)) + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy = + statemate_time; +} /** statemate_interface **/ + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +statemate_generic_KINDERSICHERUNG_CTRL(void) { + if (SYS_bit_get(statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX)) { + switch ( + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state) { + case 1: { /** state ZENTRAL in chart KINDERSICHERUNG_CTRL **/ + if (!(statemate_FH_TUERMODUL__SFHA_ZENTRAL || + statemate_FH_TUERMODUL__SFHZ_ZENTRAL)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 3; + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 0; + break; + } + switch (statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state) { + case 1: { /** state IN_ZENTRAL in chart KINDERSICHERUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !(statemate_FH_TUERMODUL__SFHA_ZENTRAL_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + !(statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHA_ZENTRAL) && + statemate_FH_TUERMODUL__SFHA_ZENTRAL_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHZ_ZENTRAL) && + statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + break; + } + } /** switch statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state **/ + break; + } + case 2: { /** state MEC in chart KINDERSICHERUNG_CTRL **/ + if (!(statemate_FH_TUERMODUL__SFHA_MEC || + statemate_FH_TUERMODUL__SFHZ_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 3; + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 0; + break; + } + switch (statemate_MEC_KINDERSICHERUNG_CTRL_next_state) { + case 1: { /** state INMEC in chart KINDERSICHERUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHA_MEC && + !(statemate_FH_TUERMODUL__SFHA_MEC_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_MEC && + !(statemate_FH_TUERMODUL__SFHZ_MEC_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHA_MEC) && + statemate_FH_TUERMODUL__SFHA_MEC_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHZ_MEC) && + statemate_FH_TUERMODUL__SFHZ_MEC_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + break; + } + } /** switch statemate_MEC_KINDERSICHERUNG_CTRL_next_state **/ + break; + } + case 3: { /** state WAITING in chart KINDERSICHERUNG_CTRL **/ + if ((!statemate_FH_TUERMODUL__KL_50) && + (statemate_FH_TUERMODUL__SFHZ_MEC && + statemate_FH_TUERMODUL__SFHA_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 2; + break; + } + if ((!statemate_FH_TUERMODUL__KL_50) && + (statemate_FH_TUERMODUL__SFHZ_MEC && + !statemate_FH_TUERMODUL__SFHA_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 2; + break; + } + if ((!statemate_FH_TUERMODUL__KL_50) && + (!statemate_FH_TUERMODUL__SFHZ_MEC && + statemate_FH_TUERMODUL__SFHA_MEC)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 2; + break; + } + if ((!statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !statemate_FH_TUERMODUL__KL_50)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + statemate_FH_TUERMODUL__SFHA_ZENTRAL)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + !statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !statemate_FH_TUERMODUL__KL_50)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + break; + } + } /** switch + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state **/ + } +} + +__attribute__((always_inline)) static inline void +statemate_generic_FH_TUERMODUL_CTRL(void) { + if (!SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX) && + SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_old_IDX) && + !SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX)) { + SYS_bit_clr(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX); + SYS_bit_clr(statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX); + } + if (SYS_bit_get(statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX)) { + if (!SYS_bit_get(statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX)) + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + SYS_bit_clr(statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX)) { + SYS_bit_clr(statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + } + SYS_bit_clr(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + switch (statemate_B_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state ZAEHLER_WHSP_ZU_HOCH in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL_CTRL__N == 59 && + !(statemate_FH_TUERMODUL_CTRL__N_old == 59))) { + statemate_stable = 0; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 3; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + break; + } + case 2: { /** state NICHT_INITIALISIERT in chart FH_TUERMODUL_CTRL **/ + if (((statemate_FH_TUERMODUL__BLOCK && + !(statemate_FH_TUERMODUL__BLOCK_old))) && + ((statemate_FH_TUERMODUL__MFHZ))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2329_1 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 3; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state) { + case 1: { /** state SCHLIESSEN in chart NICHT_INITIALISIERT **/ + if (!(statemate_FH_TUERMODUL__SFHZ)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + break; + } + case 2: { /** state OEFFNEN in chart NICHT_INITIALISIERT **/ + if (!(statemate_FH_TUERMODUL__SFHA)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + break; + } + case 3: { /** state BEREIT in chart NICHT_INITIALISIERT **/ + if ((statemate_FH_TUERMODUL__SFHA)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 1; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 2; + break; + } + if ((statemate_FH_TUERMODUL__SFHZ)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 1; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + } /** switch + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state + **/ + break; + } + case 3: { /** state INITIALISIERT in chart FH_TUERMODUL_CTRL **/ + if (((statemate_FH_TUERMODUL_CTRL__N > 60 && + !(statemate_FH_TUERMODUL_CTRL__N_old > 60))) && + ((!(statemate_FH_TUERMODUL_CTRL__INREVERS1 || + statemate_FH_TUERMODUL_CTRL__INREVERS2)))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + if (((statemate_FH_TUERMODUL__BLOCK && + !(statemate_FH_TUERMODUL__BLOCK_old))) && + ((statemate_FH_TUERMODUL__MFHA))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2375_2 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + if (((statemate_FH_TUERMODUL__BLOCK && + !(statemate_FH_TUERMODUL__BLOCK_old))) && + ((statemate_FH_TUERMODUL__MFHZ))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2352_1 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = + 3; + break; + } + switch (statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__POSITION >= 405)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch (statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state TIPP_OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old)) || + (statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + case 2: { /** state MAN_OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old))) { + statemate_stable = 0; + + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + if ((!(statemate_FH_TUERMODUL__SFHA) && + statemate_FH_TUERMODUL__SFHA_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + } /** switch statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state **/ + break; + } + case 2: { /** state SCHLIESSEN in chart FH_TUERMODUL_CTRL **/ + if ((statemate_FH_TUERMODUL__POSITION <= 0)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch (statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state TIPP_SCHLIESSEN in chart FH_TUERMODUL_CTRL + **/ + if ((statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old)) || + (statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + break; + } + switch ( + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state REVERSIEREN2 in chart FH_TUERMODUL_CTRL + **/ + SYS_bit_clr(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 1; + statemate_FH_TUERMODUL_CTRL__INREVERS2_copy = 0; + + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + break; + } + break; + } + case 2: { /** state TIPP_SCHLIESSEN1 in chart + FH_TUERMODUL_CTRL **/ + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL__EINKLEMMUNG_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS2_copy = 1; + + SYS_bit_set(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 1; + SYS_bit_clr(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_sc_FH_TUERMODUL_CTRL_1781_10 = + statemate_time; + statemate_FH_TUERMODUL__MFHA_copy = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + break; + } + } /** switch + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + case 2: { /** state MANUELL_SCHLIESSEN in chart + FH_TUERMODUL_CTRL **/ + if ((!(statemate_FH_TUERMODUL__SFHZ) && + statemate_FH_TUERMODUL__SFHZ_old)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = + 3; + break; + } + switch ( + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state REVERSIEREN1 in chart FH_TUERMODUL_CTRL + **/ + SYS_bit_clr(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS1_copy = 0; + + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + break; + } + case 2: { /** state MAN_SCHLIESSEN in chart + FH_TUERMODUL_CTRL **/ + if (SYS_bit_get(statemate_bitlist, + FH_TUERMODUL__EINKLEMMUNG_IDX)) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS1_copy = 1; + + SYS_bit_set(statemate_bitlist, + FH_TUERMODUL_CTRL__END_REVERS_copy_IDX); + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 1; + SYS_bit_clr(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + + statemate_sc_FH_TUERMODUL_CTRL_1739_10 = + statemate_time; + statemate_FH_TUERMODUL__MFHA_copy = 1; + break; + } + if ((statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old))) { + statemate_stable = 0; + + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 1; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 0; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + } /** switch + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + default: { + statemate_stable = 0; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + } /** switch statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + case 3: { /** state BEREIT in chart FH_TUERMODUL_CTRL **/ + if (((statemate_FH_TUERMODUL__SFHZ && + !(statemate_FH_TUERMODUL__SFHZ_old))) && + ((statemate_FH_TUERMODUL__POSITION > 0))) { + statemate_stable = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 2; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = + 2; + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + if (((statemate_FH_TUERMODUL__SFHA && + !(statemate_FH_TUERMODUL__SFHA_old))) && + ((statemate_FH_TUERMODUL__POSITION < 405))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 1; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 1; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + } /** switch statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + default: { + statemate_stable = 0; + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + } /** switch statemate_B_FH_TUERMODUL_CTRL_next_state **/ + switch (statemate_A_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state WIEDERHOLSPERRE in chart FH_TUERMODUL_CTRL **/ + SYS_bit_clr(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + if ((statemate_step == 1 && + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL != + 0 && + (statemate_time - + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL == + 1)) && + ((statemate_FH_TUERMODUL__MFHZ || + statemate_FH_TUERMODUL__MFHA))) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = + statemate_FH_TUERMODUL_CTRL__N + 1; + + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + switch (statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state) { + case 1: { /** state WDHSP in chart FH_TUERMODUL_CTRL **/ + if ((statemate_step == 1 && + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL != + 0 && + (statemate_time - + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL == + 3)) && + (((!(statemate_FH_TUERMODUL__MFHZ || + statemate_FH_TUERMODUL__MFHA)) && + statemate_FH_TUERMODUL_CTRL__N > 0))) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = + statemate_FH_TUERMODUL_CTRL__N - 1; + + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + SYS_bit_set(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + } /** switch statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state + **/ + break; + } + default: { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + } /** switch statemate_A_FH_TUERMODUL_CTRL_next_state **/ + SYS_bit_cpy(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX); + } +} + +__attribute__((always_inline)) static inline void +statemate_generic_EINKLEMMSCHUTZ_CTRL(void) { + if (SYS_bit_get(statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX)) { + switch (statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state) { + case 1: { /** state NORMALBETRIEB in chart EINKLEMMSCHUTZ_CTRL **/ + if (((statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV && + !(statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old))) && + ((!(statemate_FH_TUERMODUL__SFHZ && + statemate_FH_TUERMODUL__SFHA)))) { + statemate_stable = 0; + + SYS_bit_set(statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX); + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = + 2; + break; + } + break; + } + case 2: { /** state EINKLEMMUNG in chart EINKLEMMSCHUTZ_CTRL **/ + SYS_bit_clr(statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX); + if ((!(statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV) && + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old)) { + statemate_stable = 0; + + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = + 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 1; + break; + } + } /** switch + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state **/ + } +} + +__attribute__((always_inline)) static inline void +statemate_generic_BLOCK_ERKENNUNG_CTRL(void) { + if (!SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX) && + SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_old_IDX) && + !SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX)) + SYS_bit_clr(statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + if (SYS_bit_get(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX)) { + switch ( + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state) { + case 1: { /** state KEINE_BEWEGUNG in chart BLOCK_ERKENNUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__I_EIN != + statemate_FH_TUERMODUL__I_EIN_old) && + ((statemate_FH_TUERMODUL__I_EIN > 0))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__BLOCK_copy = 0; + + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = + 2; + statemate_BLOCK_ERKENNUNG_CTRL__N = 0; + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = 2; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 3; + SYS_bit_set( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + break; + } + break; + } + case 2: { /** state BEWEGUNG in chart BLOCK_ERKENNUNG_CTRL **/ + if ((!(statemate_FH_TUERMODUL__MFHA) && + statemate_FH_TUERMODUL__MFHA_old) || + (!(statemate_FH_TUERMODUL__MFHZ) && + statemate_FH_TUERMODUL__MFHZ_old)) { + statemate_stable = 0; + + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = + 1; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 0; + break; + } + switch (statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state) { + case 1: { /** state FENSTER_BLOCKIERT in chart BLOCK_ERKENNUNG_CTRL + **/ + break; + } + case 2: { /** state FENSTER_BEWEGT_SICH in chart + BLOCK_ERKENNUNG_CTRL **/ + if ((statemate_FH_TUERMODUL__I_EIN > + (statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX - 2))) { + statemate_stable = 0; + statemate_FH_TUERMODUL__BLOCK_copy = 1; + + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 1; + break; + } + break; + } + case 3: { /** state EINSCHALTSTROM_MESSEN in chart + BLOCK_ERKENNUNG_CTRL **/ + SYS_bit_clr( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + if ((statemate_BLOCK_ERKENNUNG_CTRL__N == 11 && + !(statemate_BLOCK_ERKENNUNG_CTRL__N_old == 11))) { + statemate_stable = 0; + + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 2; + break; + } + /** static reactions: **/ + if (statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state == 3) { + if (statemate_step == 1 && + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy != + 0 && + (statemate_time - + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy == + 2)) { + statemate_BLOCK_ERKENNUNG_CTRL__N = + statemate_BLOCK_ERKENNUNG_CTRL__N + 1; + if ((statemate_FH_TUERMODUL__I_EIN > + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX)) + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = + statemate_FH_TUERMODUL__I_EIN; + } + } + /** end static reactions **/ + break; + } + default: { + statemate_stable = 0; + statemate_BLOCK_ERKENNUNG_CTRL__N = 0; + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = 2; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 3; + SYS_bit_set( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + break; + } + } /** switch statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state **/ + break; + } + default: { + statemate_stable = 0; + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + break; + } + } /** switch + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state **/ + } +} + +__attribute__((always_inline)) static inline void +statemate_FH_DU(void) { + statemate_time = 1; /**SYS_get_clock()**/ + statemate_stable = 0; + statemate_step = 0; + // patched for wcet: replacing while statement by for + // while (!statemate_stable) + int i; + __pragma_loopbound(100, 100); + for (i = 0; i < 100; i++) { + statemate_stable = 1; + statemate_step++; + { + switch ( + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state) { + case 1: { /** state SCHLIESSEN in chart FH_STEUERUNG_DUMMY **/ + if ((!(statemate_FH_DU__MFHZ) && statemate_FH_DU__MFHZ_old)) { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 2; + break; + } + break; + } + case 2: { /** state BEREIT in chart FH_STEUERUNG_DUMMY **/ + if ((statemate_FH_DU__MFHZ && !(statemate_FH_DU__MFHZ_old))) { + statemate_stable = 0; + statemate_FH_DU__MFH = -100; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 1; + break; + } + if ((statemate_FH_DU__MFHA && !(statemate_FH_DU__MFHA_old))) { + statemate_stable = 0; + statemate_FH_DU__MFH = 100; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 3; + break; + } + break; + } + case 3: { /** state OEFFNEN in chart FH_STEUERUNG_DUMMY **/ + if ((!(statemate_FH_DU__MFHA) && statemate_FH_DU__MFHA_old)) { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = + 2; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 2; + break; + } + } /** switch + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state **/ + } + { + { + if (!SYS_bit_get(statemate_bitlist, + active_KINDERSICHERUNG_CTRL_IDX)) + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = + 3; + SYS_bit_clr(statemate_bitlist, + active_KINDERSICHERUNG_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_IDX)) + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = + 1; + SYS_bit_clr(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_IDX)) { + SYS_bit_clr( + statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX); + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = + 1; + } + SYS_bit_clr(statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + if (!SYS_bit_get(statemate_bitlist, + active_FH_TUERMODUL_CTRL_IDX)) { + SYS_bit_clr(statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX); + SYS_bit_clr(statemate_bitlist, + exited_BEREIT_FH_TUERMODUL_CTRL_IDX); + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_FH_TUERMODUL_CTRL__N = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set( + statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + } + SYS_bit_clr(statemate_bitlist, + active_FH_TUERMODUL_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_KINDERSICHERUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_copy_IDX); + SYS_bit_set(statemate_bitlist, + active_FH_TUERMODUL_CTRL_copy_IDX); + /** static reactions: **/ + if (statemate_FH_DU__S_FH_TMBFZUCAN != + statemate_FH_DU__S_FH_TMBFZUCAN_old) { + if ((!statemate_FH_DU__DOOR_ID)) + statemate_FH_DU__S_FH_FTZU = + statemate_FH_DU__S_FH_TMBFZUCAN; + } + if (statemate_FH_DU__S_FH_TMBFZUDISC != + statemate_FH_DU__S_FH_TMBFZUDISC_old) { + if (statemate_FH_DU__DOOR_ID) + statemate_FH_DU__S_FH_TMBFZUCAN = + statemate_FH_DU__S_FH_TMBFZUDISC; + } + if (statemate_FH_DU__S_FH_TMBFAUFCAN != + statemate_FH_DU__S_FH_TMBFAUFCAN_old) { + if ((!statemate_FH_DU__DOOR_ID)) + statemate_FH_DU__S_FH_FTAUF = + statemate_FH_DU__S_FH_TMBFAUFCAN; + } + if (statemate_FH_DU__S_FH_TMBFAUFDISC != + statemate_FH_DU__S_FH_TMBFAUFDISC_old) { + if (statemate_FH_DU__DOOR_ID) + statemate_FH_DU__S_FH_TMBFAUFCAN = + statemate_FH_DU__S_FH_TMBFAUFDISC; + } + /** end static reactions **/ + } + } + SYS_bit_cpy(statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX, + statemate_bitlist, active_KINDERSICHERUNG_CTRL_old_IDX); + SYS_bit_cpy(statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX, + statemate_bitlist, active_FH_TUERMODUL_CTRL_old_IDX); + SYS_bit_cpy(statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX, + statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_old_IDX); + SYS_bit_cpy(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX, + statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_old_IDX); + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_KINDERSICHERUNG_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_FH_TUERMODUL_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_EINKLEMMSCHUTZ_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_BLOCK_ERKENNUNG_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + SYS_bit_cpy(statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX, + statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX, + statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX); + SYS_bit_cpy(statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX, + statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX); + statemate_FH_TUERMODUL_CTRL__N_old = statemate_FH_TUERMODUL_CTRL__N; + statemate_FH_TUERMODUL__I_EIN_old = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__MFH = statemate_FH_DU__MFH_copy; + statemate_FH_DU__I_EIN_old = statemate_FH_DU__I_EIN; + statemate_BLOCK_ERKENNUNG_CTRL__N_old = + statemate_BLOCK_ERKENNUNG_CTRL__N; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old = + statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_TUERMODUL__SFHZ_MEC_old = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL_old = + statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_TUERMODUL__SFHA_MEC_old = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_TUERMODUL__BLOCK = statemate_FH_TUERMODUL__BLOCK_copy; + statemate_FH_TUERMODUL__BLOCK_old = statemate_FH_TUERMODUL__BLOCK; + statemate_FH_TUERMODUL__SFHZ = statemate_FH_TUERMODUL__SFHZ_copy; + statemate_FH_TUERMODUL__SFHZ_old = statemate_FH_TUERMODUL__SFHZ; + statemate_FH_TUERMODUL__SFHA = statemate_FH_TUERMODUL__SFHA_copy; + statemate_FH_TUERMODUL__SFHA_old = statemate_FH_TUERMODUL__SFHA; + statemate_FH_TUERMODUL__MFHZ = statemate_FH_TUERMODUL__MFHZ_copy; + statemate_FH_TUERMODUL__MFHZ_old = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_TUERMODUL__MFHA = statemate_FH_TUERMODUL__MFHA_copy; + statemate_FH_TUERMODUL__MFHA_old = statemate_FH_TUERMODUL__MFHA; + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__EKS_LEISTE_AKTIV_old = + statemate_FH_DU__EKS_LEISTE_AKTIV; + statemate_FH_DU__S_FH_TMBFAUFCAN_old = statemate_FH_DU__S_FH_TMBFAUFCAN; + statemate_FH_DU__S_FH_TMBFZUCAN_old = statemate_FH_DU__S_FH_TMBFZUCAN; + statemate_FH_DU__S_FH_TMBFZUDISC_old = statemate_FH_DU__S_FH_TMBFZUDISC; + statemate_FH_DU__S_FH_TMBFAUFDISC_old = + statemate_FH_DU__S_FH_TMBFAUFDISC; + statemate_FH_DU__BLOCK = statemate_FH_DU__BLOCK_copy; + statemate_FH_DU__BLOCK_old = statemate_FH_DU__BLOCK; + statemate_FH_DU__MFHZ = statemate_FH_DU__MFHZ_copy; + statemate_FH_DU__MFHZ_old = statemate_FH_DU__MFHZ; + statemate_FH_DU__MFHA = statemate_FH_DU__MFHA_copy; + statemate_FH_DU__MFHA_old = statemate_FH_DU__MFHA; + + } /** while(!statemate_stable) **/ + +} /** statemate_FH_DU **/ + +/* + Main functions +*/ + +__attribute__((always_inline)) static inline int +statemate_return() { + unsigned long int checksum = 0; + int index; + __pragma_loopbound(64, 64); + for (index = 63; index >= 0; index--) + checksum += (unsigned long) (statemate_bitlist[index]) << index; + return (checksum != 32ul); +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +statemate_main(void) { + statemate_FH_DU(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + statemate_init(); + statemate_main(); + + return statemate_return(); +} diff --git a/targets/wasm-tacle/sequential/statemate/statemate.c b/targets/wasm-tacle/sequential/statemate/statemate.c new file mode 100755 index 0000000..1799905 --- /dev/null +++ b/targets/wasm-tacle/sequential/statemate/statemate.c @@ -0,0 +1,1278 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: statemate + + Author: Friedhelm Stappert, C-LAB, Paderborn, Germany + + Function: This code was automatically generated by + the STAtechart Real-time-Code generator STARC + which was developed at C-LAB. + + The original StateChart specifies an experimental + car window lift control. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/statemate/statemate.c + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Macro definitions +*/ + +#define SYS_bit_get(a,b) (a)[ (b) ] +#define SYS_bit_clr(a,b) (a)[ (b) ] = 0 +#define SYS_bit_set(a,b) (a)[ (b) ] = 1 +#define SYS_bit_cpy(a1,i1,a2,i2) (a1)[ (i1) ] = (a2)[ (i2) ] + +#define active_KINDERSICHERUNG_CTRL_IDX 10 +#define active_KINDERSICHERUNG_CTRL_copy_IDX 11 +#define active_KINDERSICHERUNG_CTRL_old_IDX 12 +#define active_FH_TUERMODUL_CTRL_IDX 13 +#define active_FH_TUERMODUL_CTRL_copy_IDX 14 +#define active_FH_TUERMODUL_CTRL_old_IDX 15 +#define active_EINKLEMMSCHUTZ_CTRL_IDX 16 +#define active_EINKLEMMSCHUTZ_CTRL_copy_IDX 17 +#define active_EINKLEMMSCHUTZ_CTRL_old_IDX 18 +#define active_BLOCK_ERKENNUNG_CTRL_IDX 19 +#define active_BLOCK_ERKENNUNG_CTRL_copy_IDX 20 +#define active_BLOCK_ERKENNUNG_CTRL_old_IDX 21 +#define entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX 0 + +#define entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX 4 +#define entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX 5 +#define exited_BEREIT_FH_TUERMODUL_CTRL_IDX 6 +#define exited_BEREIT_FH_TUERMODUL_CTRL_copy_IDX 7 + +#define FH_TUERMODUL_CTRL__END_REVERS_IDX 22 +#define FH_TUERMODUL_CTRL__END_REVERS_copy_IDX 23 +#define FH_TUERMODUL__EINKLEMMUNG_IDX 24 + + +/* + Forward declaration of functions +*/ + +void statemate_init( void ); +void statemate_interface( void ); +void statemate_generic_KINDERSICHERUNG_CTRL( void ); +void statemate_generic_FH_TUERMODUL_CTRL( void ); +void statemate_generic_EINKLEMMSCHUTZ_CTRL( void ); +void statemate_generic_BLOCK_ERKENNUNG_CTRL( void ); +void statemate_FH_DU( void ); +void statemate_main( void ); +int statemate_return ( void ); + + +/* + Declaration of global variables +*/ + +static char statemate_bitlist[ 64 ]; +unsigned long +statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy; +unsigned long +statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL; +unsigned long statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_2375_2; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_2352_1; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_2329_1; +int statemate_FH_TUERMODUL_CTRL__N; +int statemate_FH_TUERMODUL_CTRL__N_old; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_1781_10; +unsigned long statemate_sc_FH_TUERMODUL_CTRL_1739_10; +int statemate_FH_TUERMODUL__POSITION; +int statemate_FH_TUERMODUL__I_EIN; +int statemate_FH_TUERMODUL__I_EIN_old; +int statemate_FH_DU__MFH; +int statemate_FH_DU__MFH_copy; +int statemate_FH_DU__POSITION; +int statemate_FH_DU__I_EIN; +int statemate_FH_DU__I_EIN_old; +int statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX; +int statemate_BLOCK_ERKENNUNG_CTRL__N; +int statemate_BLOCK_ERKENNUNG_CTRL__N_old; +char statemate_FH_TUERMODUL_CTRL__INREVERS2; +char statemate_FH_TUERMODUL_CTRL__INREVERS2_copy; +char statemate_FH_TUERMODUL_CTRL__INREVERS1; +char statemate_FH_TUERMODUL_CTRL__INREVERS1_copy; +char statemate_FH_TUERMODUL__SFHZ_ZENTRAL; +char statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old; +char statemate_FH_TUERMODUL__SFHZ_MEC; +char statemate_FH_TUERMODUL__SFHZ_MEC_old; +char statemate_FH_TUERMODUL__SFHA_ZENTRAL; +char statemate_FH_TUERMODUL__SFHA_ZENTRAL_old; +char statemate_FH_TUERMODUL__SFHA_MEC; +char statemate_FH_TUERMODUL__SFHA_MEC_old; +char statemate_FH_TUERMODUL__KL_50; +char statemate_FH_TUERMODUL__BLOCK; +char statemate_FH_TUERMODUL__BLOCK_copy; +char statemate_FH_TUERMODUL__BLOCK_old; +char statemate_FH_TUERMODUL__FT; +char statemate_FH_TUERMODUL__SFHZ; +char statemate_FH_TUERMODUL__SFHZ_copy; +char statemate_FH_TUERMODUL__SFHZ_old; +char statemate_FH_TUERMODUL__SFHA; +char statemate_FH_TUERMODUL__SFHA_copy; +char statemate_FH_TUERMODUL__SFHA_old; +char statemate_FH_TUERMODUL__MFHZ; +char statemate_FH_TUERMODUL__MFHZ_copy; +char statemate_FH_TUERMODUL__MFHZ_old; +char statemate_FH_TUERMODUL__MFHA; +char statemate_FH_TUERMODUL__MFHA_copy; +char statemate_FH_TUERMODUL__MFHA_old; +char statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; +char statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old; +char statemate_FH_DU__KL_50; +char statemate_FH_DU__S_FH_FTZU; +char statemate_FH_DU__S_FH_FTAUF; +char statemate_FH_DU__FT; +char statemate_FH_DU__EKS_LEISTE_AKTIV; +char statemate_FH_DU__EKS_LEISTE_AKTIV_old; +char statemate_FH_DU__S_FH_TMBFAUFCAN; +char statemate_FH_DU__S_FH_TMBFAUFCAN_old; +char statemate_FH_DU__S_FH_TMBFZUCAN; +char statemate_FH_DU__S_FH_TMBFZUCAN_old; +char statemate_FH_DU__S_FH_TMBFZUDISC; +char statemate_FH_DU__S_FH_TMBFZUDISC_old; +char statemate_FH_DU__S_FH_TMBFAUFDISC; +char statemate_FH_DU__S_FH_TMBFAUFDISC_old; +char statemate_FH_DU__S_FH_ZUDISC; +char statemate_FH_DU__S_FH_AUFDISC; +char statemate_FH_DU__DOOR_ID; +char statemate_FH_DU__BLOCK; +char statemate_FH_DU__BLOCK_copy; +char statemate_FH_DU__BLOCK_old; +char statemate_FH_DU__MFHZ; +char statemate_FH_DU__MFHZ_copy; +char statemate_FH_DU__MFHZ_old; +char statemate_FH_DU__MFHA; +char statemate_FH_DU__MFHA_copy; +char statemate_FH_DU__MFHA_old; + +unsigned long statemate_time; +char statemate_stable; +char statemate_step; + +char +statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state; /** 2 bits **/ +char +statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state; /** 1 bits **/ +char statemate_MEC_KINDERSICHERUNG_CTRL_next_state; /** 1 bits **/ +char +statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state; /** 2 bits **/ +char statemate_B_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_A_FH_TUERMODUL_CTRL_next_state; /** 1 bits **/ +char +statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state; /** 1 bits **/ +char +statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char +statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char +statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char +statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state; /** 2 bits **/ +char +statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state; /** 2 bits **/ +char +statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state; /** 2 bits **/ +char +statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state; /** 2 bits **/ +char +statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state; /** 2 bits **/ + + +/* + Initialization-related functions +*/ + +void statemate_init( void ) +{ + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy + = 0; + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL + = 0; + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = 0; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 0; + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 0; + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 0; + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 0; + statemate_B_FH_TUERMODUL_CTRL_next_state = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 0; + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 0; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 0; + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 0; + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 0; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 0; + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 0; + + statemate_interface(); +} /** statemate_init **/ + + +void statemate_interface( void ) +{ + if ( SYS_bit_get( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX ) ) + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = statemate_time; + if ( SYS_bit_get( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX ) || + SYS_bit_get( statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX ) ) + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL + = statemate_time; + if ( ( statemate_sc_FH_TUERMODUL_CTRL_2375_2 != 0 ) && + ( statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2375_2 >= 500 ) ) { + statemate_FH_TUERMODUL__MFHA_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2375_2 = 0; + } + if ( ( statemate_sc_FH_TUERMODUL_CTRL_2352_1 != 0 ) && + ( statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2352_1 >= 500 ) ) { + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2352_1 = 0; + } + if ( ( statemate_sc_FH_TUERMODUL_CTRL_2329_1 != 0 ) && + ( statemate_time - statemate_sc_FH_TUERMODUL_CTRL_2329_1 >= 500 ) ) { + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2329_1 = 0; + } + if ( ( statemate_sc_FH_TUERMODUL_CTRL_1781_10 != 0 ) && + ( statemate_time - statemate_sc_FH_TUERMODUL_CTRL_1781_10 >= 500 ) ) + statemate_sc_FH_TUERMODUL_CTRL_1781_10 = 0; + + if ( ( statemate_sc_FH_TUERMODUL_CTRL_1739_10 != 0 ) && + ( statemate_time - statemate_sc_FH_TUERMODUL_CTRL_1739_10 >= 500 ) ) + statemate_sc_FH_TUERMODUL_CTRL_1739_10 = 0; + + if ( ( SYS_bit_get( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ) || + statemate_BLOCK_ERKENNUNG_CTRL__N != statemate_BLOCK_ERKENNUNG_CTRL__N_old ) ) + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy + = statemate_time; +} /** statemate_interface **/ + + +/* + Algorithm core functions +*/ + +void statemate_generic_KINDERSICHERUNG_CTRL( void ) +{ + if ( SYS_bit_get( statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX ) ) { + switch ( statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state ) { + case 1: { /** state ZENTRAL in chart KINDERSICHERUNG_CTRL **/ + if ( !( statemate_FH_TUERMODUL__SFHA_ZENTRAL || + statemate_FH_TUERMODUL__SFHZ_ZENTRAL ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 0; + break; + } + switch ( statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state ) { + case 1: { /** state IN_ZENTRAL in chart KINDERSICHERUNG_CTRL **/ + if ( ( statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !( statemate_FH_TUERMODUL__SFHA_ZENTRAL_old ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + !( statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( !( statemate_FH_TUERMODUL__SFHA_ZENTRAL ) && + statemate_FH_TUERMODUL__SFHA_ZENTRAL_old ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( !( statemate_FH_TUERMODUL__SFHZ_ZENTRAL ) && + statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + + statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + break; + } + } /** switch statemate_ZENTRAL_KINDERSICHERUNG_CTRL_next_state **/ + break; + } + case 2: { /** state MEC in chart KINDERSICHERUNG_CTRL **/ + if ( !( statemate_FH_TUERMODUL__SFHA_MEC || + statemate_FH_TUERMODUL__SFHZ_MEC ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 0; + break; + } + switch ( statemate_MEC_KINDERSICHERUNG_CTRL_next_state ) { + case 1: { /** state INMEC in chart KINDERSICHERUNG_CTRL **/ + if ( ( statemate_FH_TUERMODUL__SFHA_MEC && + !( statemate_FH_TUERMODUL__SFHA_MEC_old ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( statemate_FH_TUERMODUL__SFHZ_MEC && + !( statemate_FH_TUERMODUL__SFHZ_MEC_old ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( !( statemate_FH_TUERMODUL__SFHA_MEC ) && + statemate_FH_TUERMODUL__SFHA_MEC_old ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 0; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( !( statemate_FH_TUERMODUL__SFHZ_MEC ) && + statemate_FH_TUERMODUL__SFHZ_MEC_old ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 0; + + statemate_MEC_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + break; + } + } /** switch statemate_MEC_KINDERSICHERUNG_CTRL_next_state **/ + break; + } + case 3: { /** state WAITING in chart KINDERSICHERUNG_CTRL **/ + if ( ( !statemate_FH_TUERMODUL__KL_50 ) && ( statemate_FH_TUERMODUL__SFHZ_MEC && + statemate_FH_TUERMODUL__SFHA_MEC ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 2; + break; + } + if ( ( !statemate_FH_TUERMODUL__KL_50 ) && ( statemate_FH_TUERMODUL__SFHZ_MEC && + !statemate_FH_TUERMODUL__SFHA_MEC ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 2; + break; + } + if ( ( !statemate_FH_TUERMODUL__KL_50 ) && + ( !statemate_FH_TUERMODUL__SFHZ_MEC && + statemate_FH_TUERMODUL__SFHA_MEC ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 2; + break; + } + if ( ( !statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !statemate_FH_TUERMODUL__KL_50 ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + statemate_FH_TUERMODUL__SFHA_ZENTRAL ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHA_copy = 1; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + if ( ( statemate_FH_TUERMODUL__SFHZ_ZENTRAL && + !statemate_FH_TUERMODUL__SFHA_ZENTRAL && + !statemate_FH_TUERMODUL__KL_50 ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__SFHZ_copy = 1; + + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + break; + } + } /** switch statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state **/ + } +} + + +void statemate_generic_FH_TUERMODUL_CTRL( void ) +{ + if ( !SYS_bit_get( statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX ) && + SYS_bit_get( statemate_bitlist, active_FH_TUERMODUL_CTRL_old_IDX ) && + !SYS_bit_get( statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX ) ) { + SYS_bit_clr( statemate_bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX ); + SYS_bit_clr( statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX ); + } + if ( SYS_bit_get( statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX ) ) { + if ( !SYS_bit_get( statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX ) ) + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + SYS_bit_clr( statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX ); + if ( !SYS_bit_get( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX ) ) { + SYS_bit_clr( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ); + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + } + SYS_bit_clr( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX ); + SYS_bit_set( statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX ); + SYS_bit_set( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX ); + switch ( statemate_B_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state ZAEHLER_WHSP_ZU_HOCH in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_FH_TUERMODUL_CTRL__N == 59 && + !( statemate_FH_TUERMODUL_CTRL__N_old == 59 ) ) ) { + statemate_stable = 0; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 3; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + break; + } + case 2: { /** state NICHT_INITIALISIERT in chart FH_TUERMODUL_CTRL **/ + if ( ( ( statemate_FH_TUERMODUL__BLOCK && + !( statemate_FH_TUERMODUL__BLOCK_old ) ) ) && + ( ( statemate_FH_TUERMODUL__MFHZ ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2329_1 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 3; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state ) { + case 1: { /** state SCHLIESSEN in chart NICHT_INITIALISIERT **/ + if ( !( statemate_FH_TUERMODUL__SFHZ ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; + break; + } + break; + } + case 2: { /** state OEFFNEN in chart NICHT_INITIALISIERT **/ + if ( !( statemate_FH_TUERMODUL__SFHA ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; + break; + } + break; + } + case 3: { /** state BEREIT in chart NICHT_INITIALISIERT **/ + if ( ( statemate_FH_TUERMODUL__SFHA ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 1; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 2; + break; + } + if ( ( statemate_FH_TUERMODUL__SFHZ ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 1; + + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; + break; + } + } /** switch statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state **/ + break; + } + case 3: { /** state INITIALISIERT in chart FH_TUERMODUL_CTRL **/ + if ( ( ( statemate_FH_TUERMODUL_CTRL__N > 60 && + !( statemate_FH_TUERMODUL_CTRL__N_old > 60 ) ) ) && + ( ( !( statemate_FH_TUERMODUL_CTRL__INREVERS1 || + statemate_FH_TUERMODUL_CTRL__INREVERS2 ) ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + if ( ( ( statemate_FH_TUERMODUL__BLOCK && + !( statemate_FH_TUERMODUL__BLOCK_old ) ) ) && + ( ( statemate_FH_TUERMODUL__MFHA ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2375_2 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; + break; + } + if ( ( ( statemate_FH_TUERMODUL__BLOCK && + !( statemate_FH_TUERMODUL__BLOCK_old ) ) ) && + ( ( statemate_FH_TUERMODUL__MFHZ ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_sc_FH_TUERMODUL_CTRL_2352_1 = statemate_time; + + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; + break; + } + switch ( statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_FH_TUERMODUL__POSITION >= 405 ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state TIPP_OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_FH_TUERMODUL__SFHZ && + !( statemate_FH_TUERMODUL__SFHZ_old ) ) || + ( statemate_FH_TUERMODUL__SFHA && !( statemate_FH_TUERMODUL__SFHA_old ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + case 2: { /** state MAN_OEFFNEN in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_FH_TUERMODUL__SFHZ && + !( statemate_FH_TUERMODUL__SFHZ_old ) ) ) { + statemate_stable = 0; + + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + if ( ( !( statemate_FH_TUERMODUL__SFHA ) && + statemate_FH_TUERMODUL__SFHA_old ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + } /** switch statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state **/ + break; + } + case 2: { /** state SCHLIESSEN in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_FH_TUERMODUL__POSITION <= 0 ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state TIPP_SCHLIESSEN in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_FH_TUERMODUL__SFHA && + !( statemate_FH_TUERMODUL__SFHA_old ) ) || + ( statemate_FH_TUERMODUL__SFHZ && !( statemate_FH_TUERMODUL__SFHZ_old ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state REVERSIEREN2 in chart FH_TUERMODUL_CTRL **/ + SYS_bit_clr( statemate_bitlist, FH_TUERMODUL_CTRL__END_REVERS_copy_IDX ); + if ( SYS_bit_get( statemate_bitlist, FH_TUERMODUL_CTRL__END_REVERS_IDX ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 1; + statemate_FH_TUERMODUL_CTRL__INREVERS2_copy = 0; + + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + break; + } + break; + } + case 2: { /** state TIPP_SCHLIESSEN1 in chart FH_TUERMODUL_CTRL **/ + if ( SYS_bit_get( statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS2_copy = 1; + + SYS_bit_set( statemate_bitlist, FH_TUERMODUL_CTRL__END_REVERS_copy_IDX ); + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_clr( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_sc_FH_TUERMODUL_CTRL_1781_10 = statemate_time; + statemate_FH_TUERMODUL__MFHA_copy = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + break; + } + } /** switch statemate_TIPP_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state **/ + break; + } + case 2: { /** state MANUELL_SCHLIESSEN in chart FH_TUERMODUL_CTRL **/ + if ( ( !( statemate_FH_TUERMODUL__SFHZ ) && + statemate_FH_TUERMODUL__SFHZ_old ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + switch ( statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state REVERSIEREN1 in chart FH_TUERMODUL_CTRL **/ + SYS_bit_clr( statemate_bitlist, FH_TUERMODUL_CTRL__END_REVERS_copy_IDX ); + if ( SYS_bit_get( statemate_bitlist, FH_TUERMODUL_CTRL__END_REVERS_IDX ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS1_copy = 0; + + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_FH_TUERMODUL__MFHA_copy = 0; + + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + break; + } + case 2: { /** state MAN_SCHLIESSEN in chart FH_TUERMODUL_CTRL **/ + if ( SYS_bit_get( statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHZ_copy = 0; + statemate_FH_TUERMODUL_CTRL__INREVERS1_copy = 1; + + SYS_bit_set( statemate_bitlist, FH_TUERMODUL_CTRL__END_REVERS_copy_IDX ); + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_clr( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + + statemate_sc_FH_TUERMODUL_CTRL_1739_10 = statemate_time; + statemate_FH_TUERMODUL__MFHA_copy = 1; + break; + } + if ( ( statemate_FH_TUERMODUL__SFHA && + !( statemate_FH_TUERMODUL__SFHA_old ) ) ) { + statemate_stable = 0; + + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 1; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 0; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + } /** switch statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state **/ + break; + } + default: { + statemate_stable = 0; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + } /** switch statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state **/ + break; + } + case 3: { /** state BEREIT in chart FH_TUERMODUL_CTRL **/ + if ( ( ( statemate_FH_TUERMODUL__SFHZ && + !( statemate_FH_TUERMODUL__SFHZ_old ) ) ) && + ( ( statemate_FH_TUERMODUL__POSITION > 0 ) ) ) { + statemate_stable = 0; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 2; + statemate_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + statemate_MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 2; + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + statemate_FH_TUERMODUL__MFHZ_copy = 1; + break; + } + if ( ( ( statemate_FH_TUERMODUL__SFHA && + !( statemate_FH_TUERMODUL__SFHA_old ) ) ) && + ( ( statemate_FH_TUERMODUL__POSITION < 405 ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__MFHA_copy = 1; + + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 1; + statemate_OEFFNEN_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; + break; + } + } /** switch statemate_INITIALISIERT_FH_TUERMODUL_CTRL_next_state **/ + break; + } + default: { + statemate_stable = 0; + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + break; + } + } /** switch statemate_B_FH_TUERMODUL_CTRL_next_state **/ + switch ( statemate_A_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state WIEDERHOLSPERRE in chart FH_TUERMODUL_CTRL **/ + SYS_bit_clr( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX ); + if ( ( statemate_step == 1 && + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL + != 0 + && ( statemate_time - + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL + == + 1 ) ) && ( ( statemate_FH_TUERMODUL__MFHZ || + statemate_FH_TUERMODUL__MFHA ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = statemate_FH_TUERMODUL_CTRL__N + 1; + + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX ); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + switch ( statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state ) { + case 1: { /** state WDHSP in chart FH_TUERMODUL_CTRL **/ + if ( ( statemate_step == 1 && + statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL != 0 && + ( statemate_time - statemate_tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL == + 3 ) ) && + ( ( ( !( statemate_FH_TUERMODUL__MFHZ || statemate_FH_TUERMODUL__MFHA ) ) && + statemate_FH_TUERMODUL_CTRL__N > 0 ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = statemate_FH_TUERMODUL_CTRL__N - 1; + + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + SYS_bit_set( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX ); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + } /** switch statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state **/ + break; + } + default: { + statemate_stable = 0; + statemate_FH_TUERMODUL_CTRL__N = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX ); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + break; + } + } /** switch statemate_A_FH_TUERMODUL_CTRL_next_state **/ + SYS_bit_cpy( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX ); + SYS_bit_cpy( statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, + exited_BEREIT_FH_TUERMODUL_CTRL_IDX ); + } +} + + +void statemate_generic_EINKLEMMSCHUTZ_CTRL( void ) +{ + if ( SYS_bit_get( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX ) ) { + switch ( statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state ) { + case 1: { /** state NORMALBETRIEB in chart EINKLEMMSCHUTZ_CTRL **/ + if ( ( ( statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV && + !( statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old ) ) ) && + ( ( !( statemate_FH_TUERMODUL__SFHZ && + statemate_FH_TUERMODUL__SFHA ) ) ) ) { + statemate_stable = 0; + + SYS_bit_set( statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX ); + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 2; + break; + } + break; + } + case 2: { /** state EINKLEMMUNG in chart EINKLEMMSCHUTZ_CTRL **/ + SYS_bit_clr( statemate_bitlist, FH_TUERMODUL__EINKLEMMUNG_IDX ); + if ( ( !( statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV ) && + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old ) ) { + statemate_stable = 0; + + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 1; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 1; + break; + } + } /** switch statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state **/ + } +} + + +void statemate_generic_BLOCK_ERKENNUNG_CTRL( void ) +{ + if ( !SYS_bit_get( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX ) && + SYS_bit_get( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_old_IDX ) && + !SYS_bit_get( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX ) ) + SYS_bit_clr( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ); + if ( SYS_bit_get( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX ) ) { + switch ( statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state ) { + case 1: { /** state KEINE_BEWEGUNG in chart BLOCK_ERKENNUNG_CTRL **/ + if ( ( statemate_FH_TUERMODUL__I_EIN != statemate_FH_TUERMODUL__I_EIN_old ) && + ( ( statemate_FH_TUERMODUL__I_EIN > 0 ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__BLOCK_copy = 0; + + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 2; + statemate_BLOCK_ERKENNUNG_CTRL__N = 0; + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = 2; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 3; + SYS_bit_set( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ); + break; + } + break; + } + case 2: { /** state BEWEGUNG in chart BLOCK_ERKENNUNG_CTRL **/ + if ( ( !( statemate_FH_TUERMODUL__MFHA ) && + statemate_FH_TUERMODUL__MFHA_old ) || + ( !( statemate_FH_TUERMODUL__MFHZ ) && statemate_FH_TUERMODUL__MFHZ_old ) ) { + statemate_stable = 0; + + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 0; + break; + } + switch ( statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state ) { + case 1: { /** state FENSTER_BLOCKIERT in chart BLOCK_ERKENNUNG_CTRL **/ + break; + } + case 2: { /** state FENSTER_BEWEGT_SICH in chart BLOCK_ERKENNUNG_CTRL **/ + if ( ( statemate_FH_TUERMODUL__I_EIN > + ( statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX - 2 ) ) ) { + statemate_stable = 0; + statemate_FH_TUERMODUL__BLOCK_copy = 1; + + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 1; + break; + } + break; + } + case 3: { /** state EINSCHALTSTROM_MESSEN in chart BLOCK_ERKENNUNG_CTRL **/ + SYS_bit_clr( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ); + if ( ( statemate_BLOCK_ERKENNUNG_CTRL__N == 11 && + !( statemate_BLOCK_ERKENNUNG_CTRL__N_old == 11 ) ) ) { + statemate_stable = 0; + + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 2; + break; + } + /** static reactions: **/ + if ( statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state == 3 ) { + if ( statemate_step == 1 && + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy + != 0 && ( statemate_time - + statemate_tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy + == 2 ) ) { + statemate_BLOCK_ERKENNUNG_CTRL__N = statemate_BLOCK_ERKENNUNG_CTRL__N + 1; + if ( ( statemate_FH_TUERMODUL__I_EIN > + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX ) ) + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = statemate_FH_TUERMODUL__I_EIN; + + } + } + /** end static reactions **/ + break; + } + default: { + statemate_stable = 0; + statemate_BLOCK_ERKENNUNG_CTRL__N = 0; + statemate_BLOCK_ERKENNUNG_CTRL__I_EIN_MAX = 2; + statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state = 3; + SYS_bit_set( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ); + break; + } + } /** switch statemate_BEWEGUNG_BLOCK_ERKENNUNG_CTRL_next_state **/ + break; + } + default: { + statemate_stable = 0; + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + break; + } + } /** switch statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state **/ + } +} + + +void statemate_FH_DU( void ) +{ + statemate_time = 1; /**SYS_get_clock()**/ + statemate_stable = 0; + statemate_step = 0; + // patched for wcet: replacing while statement by for + //while (!statemate_stable) + int i; + _Pragma( "loopbound min 100 max 100" ) + for ( i = 0; i < 100; i++ ) { + statemate_stable = 1; + statemate_step++; + { + switch ( statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state ) { + case 1: { /** state SCHLIESSEN in chart FH_STEUERUNG_DUMMY **/ + if ( ( !( statemate_FH_DU__MFHZ ) && statemate_FH_DU__MFHZ_old ) ) { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 2; + break; + } + break; + } + case 2: { /** state BEREIT in chart FH_STEUERUNG_DUMMY **/ + if ( ( statemate_FH_DU__MFHZ && !( statemate_FH_DU__MFHZ_old ) ) ) { + statemate_stable = 0; + statemate_FH_DU__MFH = -100; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 1; + break; + } + if ( ( statemate_FH_DU__MFHA && !( statemate_FH_DU__MFHA_old ) ) ) { + statemate_stable = 0; + statemate_FH_DU__MFH = 100; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 3; + break; + } + break; + } + case 3: { /** state OEFFNEN in chart FH_STEUERUNG_DUMMY **/ + if ( ( !( statemate_FH_DU__MFHA ) && statemate_FH_DU__MFHA_old ) ) { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 2; + break; + } + break; + } + default: { + statemate_stable = 0; + statemate_FH_DU__MFH = 0; + statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state = 2; + break; + } + } /** switch statemate_FH_STEUERUNG_DUMMY_FH_STEUERUNG_DUMMY_next_state **/ + } + { + { + if ( !SYS_bit_get( statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX ) ) + statemate_KINDERSICHERUNG_CTRL_KINDERSICHERUNG_CTRL_next_state = 3; + SYS_bit_clr( statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX ); + if ( !SYS_bit_get( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX ) ) + statemate_EINKLEMMSCHUTZ_CTRL_EINKLEMMSCHUTZ_CTRL_next_state = 1; + SYS_bit_clr( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + if ( !SYS_bit_get( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX ) ) { + SYS_bit_clr( statemate_bitlist, + entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX ); + statemate_BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state = 1; + } + SYS_bit_clr( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX ); + if ( !SYS_bit_get( statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX ) ) { + SYS_bit_clr( statemate_bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX ); + SYS_bit_clr( statemate_bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX ); + statemate_B_FH_TUERMODUL_CTRL_next_state = 2; + statemate_FH_TUERMODUL_CTRL__N = 0; + statemate_A_FH_TUERMODUL_CTRL_next_state = 1; + SYS_bit_set( statemate_bitlist, + entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_copy_IDX ); + statemate_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_next_state = 1; + } + SYS_bit_clr( statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX ); + SYS_bit_set( statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX ); + SYS_bit_set( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX ); + SYS_bit_set( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX ); + SYS_bit_set( statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX ); + /** static reactions: **/ + if ( statemate_FH_DU__S_FH_TMBFZUCAN != statemate_FH_DU__S_FH_TMBFZUCAN_old ) { + if ( ( !statemate_FH_DU__DOOR_ID ) ) + statemate_FH_DU__S_FH_FTZU = statemate_FH_DU__S_FH_TMBFZUCAN; + + } + if ( statemate_FH_DU__S_FH_TMBFZUDISC != + statemate_FH_DU__S_FH_TMBFZUDISC_old ) { + if ( statemate_FH_DU__DOOR_ID ) + statemate_FH_DU__S_FH_TMBFZUCAN = statemate_FH_DU__S_FH_TMBFZUDISC; + + } + if ( statemate_FH_DU__S_FH_TMBFAUFCAN != + statemate_FH_DU__S_FH_TMBFAUFCAN_old ) { + if ( ( !statemate_FH_DU__DOOR_ID ) ) + statemate_FH_DU__S_FH_FTAUF = statemate_FH_DU__S_FH_TMBFAUFCAN; + + } + if ( statemate_FH_DU__S_FH_TMBFAUFDISC != + statemate_FH_DU__S_FH_TMBFAUFDISC_old ) { + if ( statemate_FH_DU__DOOR_ID ) + statemate_FH_DU__S_FH_TMBFAUFCAN = statemate_FH_DU__S_FH_TMBFAUFDISC; + + } + /** end static reactions **/ + } + } + SYS_bit_cpy( statemate_bitlist, active_KINDERSICHERUNG_CTRL_IDX, + statemate_bitlist, + active_KINDERSICHERUNG_CTRL_old_IDX ); + SYS_bit_cpy( statemate_bitlist, active_FH_TUERMODUL_CTRL_IDX, statemate_bitlist, + active_FH_TUERMODUL_CTRL_old_IDX ); + SYS_bit_cpy( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_IDX, + statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_old_IDX ); + SYS_bit_cpy( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_IDX, + statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_old_IDX ); + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_KINDERSICHERUNG_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_FH_TUERMODUL_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_EINKLEMMSCHUTZ_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + statemate_FH_TUERMODUL__SFHA_MEC = statemate_FH_DU__S_FH_AUFDISC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL = statemate_FH_DU__S_FH_FTAUF; + statemate_FH_TUERMODUL__SFHZ_MEC = statemate_FH_DU__S_FH_ZUDISC; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL = statemate_FH_DU__S_FH_FTZU; + + statemate_generic_BLOCK_ERKENNUNG_CTRL(); + + statemate_FH_DU__MFHA = statemate_FH_TUERMODUL__MFHA; + statemate_FH_DU__MFHZ = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_DU__I_EIN = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__EKS_LEISTE_AKTIV = statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__POSITION = statemate_FH_TUERMODUL__POSITION; + statemate_FH_DU__FT = statemate_FH_TUERMODUL__FT; + statemate_FH_DU__S_FH_AUFDISC = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_DU__S_FH_FTAUF = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_DU__S_FH_ZUDISC = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_DU__S_FH_FTZU = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_DU__KL_50 = statemate_FH_TUERMODUL__KL_50; + statemate_FH_DU__BLOCK = statemate_FH_TUERMODUL__BLOCK; + + SYS_bit_cpy( statemate_bitlist, active_KINDERSICHERUNG_CTRL_copy_IDX, + statemate_bitlist, + active_KINDERSICHERUNG_CTRL_IDX ); + SYS_bit_cpy( statemate_bitlist, active_FH_TUERMODUL_CTRL_copy_IDX, + statemate_bitlist, + active_FH_TUERMODUL_CTRL_IDX ); + SYS_bit_cpy( statemate_bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX, + statemate_bitlist, + active_EINKLEMMSCHUTZ_CTRL_IDX ); + SYS_bit_cpy( statemate_bitlist, active_BLOCK_ERKENNUNG_CTRL_copy_IDX, + statemate_bitlist, + active_BLOCK_ERKENNUNG_CTRL_IDX ); + statemate_FH_TUERMODUL_CTRL__N_old = statemate_FH_TUERMODUL_CTRL__N; + statemate_FH_TUERMODUL__I_EIN_old = statemate_FH_TUERMODUL__I_EIN; + statemate_FH_DU__MFH = statemate_FH_DU__MFH_copy; + statemate_FH_DU__I_EIN_old = statemate_FH_DU__I_EIN; + statemate_BLOCK_ERKENNUNG_CTRL__N_old = statemate_BLOCK_ERKENNUNG_CTRL__N; + statemate_FH_TUERMODUL__SFHZ_ZENTRAL_old = statemate_FH_TUERMODUL__SFHZ_ZENTRAL; + statemate_FH_TUERMODUL__SFHZ_MEC_old = statemate_FH_TUERMODUL__SFHZ_MEC; + statemate_FH_TUERMODUL__SFHA_ZENTRAL_old = statemate_FH_TUERMODUL__SFHA_ZENTRAL; + statemate_FH_TUERMODUL__SFHA_MEC_old = statemate_FH_TUERMODUL__SFHA_MEC; + statemate_FH_TUERMODUL__BLOCK = statemate_FH_TUERMODUL__BLOCK_copy; + statemate_FH_TUERMODUL__BLOCK_old = statemate_FH_TUERMODUL__BLOCK; + statemate_FH_TUERMODUL__SFHZ = statemate_FH_TUERMODUL__SFHZ_copy; + statemate_FH_TUERMODUL__SFHZ_old = statemate_FH_TUERMODUL__SFHZ; + statemate_FH_TUERMODUL__SFHA = statemate_FH_TUERMODUL__SFHA_copy; + statemate_FH_TUERMODUL__SFHA_old = statemate_FH_TUERMODUL__SFHA; + statemate_FH_TUERMODUL__MFHZ = statemate_FH_TUERMODUL__MFHZ_copy; + statemate_FH_TUERMODUL__MFHZ_old = statemate_FH_TUERMODUL__MFHZ; + statemate_FH_TUERMODUL__MFHA = statemate_FH_TUERMODUL__MFHA_copy; + statemate_FH_TUERMODUL__MFHA_old = statemate_FH_TUERMODUL__MFHA; + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV_old = + statemate_FH_TUERMODUL__EKS_LEISTE_AKTIV; + statemate_FH_DU__EKS_LEISTE_AKTIV_old = statemate_FH_DU__EKS_LEISTE_AKTIV; + statemate_FH_DU__S_FH_TMBFAUFCAN_old = statemate_FH_DU__S_FH_TMBFAUFCAN; + statemate_FH_DU__S_FH_TMBFZUCAN_old = statemate_FH_DU__S_FH_TMBFZUCAN; + statemate_FH_DU__S_FH_TMBFZUDISC_old = statemate_FH_DU__S_FH_TMBFZUDISC; + statemate_FH_DU__S_FH_TMBFAUFDISC_old = statemate_FH_DU__S_FH_TMBFAUFDISC; + statemate_FH_DU__BLOCK = statemate_FH_DU__BLOCK_copy; + statemate_FH_DU__BLOCK_old = statemate_FH_DU__BLOCK; + statemate_FH_DU__MFHZ = statemate_FH_DU__MFHZ_copy; + statemate_FH_DU__MFHZ_old = statemate_FH_DU__MFHZ; + statemate_FH_DU__MFHA = statemate_FH_DU__MFHA_copy; + statemate_FH_DU__MFHA_old = statemate_FH_DU__MFHA; + + } /** while(!statemate_stable) **/ + +} /** statemate_FH_DU **/ + + +/* + Main functions +*/ + +int statemate_return() +{ + unsigned long int checksum = 0; + int index; + _Pragma( "loopbound min 64 max 64" ) + for ( index = 63 ; index >= 0 ; index-- ) + checksum += ( unsigned long ) ( statemate_bitlist[ index ] ) << index; + return ( checksum != 32ul ); +} + +void _Pragma ( "entrypoint" ) statemate_main( void ) +{ + statemate_FH_DU(); +} + + +int main ( void ) +{ + statemate_init(); + statemate_main(); + + return statemate_return(); +} diff --git a/targets/wasm-tacle/sequential/susan/CMakeLists.txt b/targets/wasm-tacle/sequential/susan/CMakeLists.txt new file mode 100644 index 0000000..b12e192 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/CMakeLists.txt @@ -0,0 +1,29 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(susan) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/susan.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/susan.c" + "generated/modified_sources/default/input.c" + "generated/modified_sources/default/wccfile.c" + "generated/modified_sources/default/wcclibm.c" + "generated/modified_sources/default/wccmalloc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/susan/ChangeLog.txt b/targets/wasm-tacle/sequential/susan/ChangeLog.txt new file mode 100755 index 0000000..bb603df --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/ChangeLog.txt @@ -0,0 +1,11 @@ +2017-07-04 + - Removed self-assignment to avoid clangs self-assign warning. + - Introduced susan_initm susan_main and susan_return. + - Fix possible division by zero to please tacle-lint. + - Removed unused variables. + - Added prefix 'susan_'. + - Removed exit_on_error function. + - Removed PowerPC specific typedef. + +2017-08-18: + - Give explicit name to former anonymous struct to silence g++ warnings. diff --git a/targets/wasm-tacle/sequential/susan/LICENSE b/targets/wasm-tacle/sequential/susan/LICENSE new file mode 100755 index 0000000..18d5124 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/LICENSE @@ -0,0 +1,14 @@ +This code is issued for research purposes only and remains the +property of the UK Secretary of State for Defence. This code must +not be passed on without this header information being kept +intact. This code must not be sold. + +A UK patent has been granted: "Method for digitally processing +images to determine the position of edges and/or corners therein for +guidance of unmanned vehicle", UK Patent 2272285. Proprietor: +Secretary of State for Defence, UK. 15 January 1997 + + +Source Code obtained from: + +http://www.fmrib.ox.ac.uk/~steve/susan/index.html diff --git a/targets/wasm-tacle/sequential/susan/generated/default/susan.wasm b/targets/wasm-tacle/sequential/susan/generated/default/susan.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a945ca82239a8b71476ffa7fe69dbd59b9648c20 GIT binary patch literal 28649 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 F{{v#0$yopZ literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/susan/generated/default/susan.wat b/targets/wasm-tacle/sequential/susan/generated/default/susan.wat new file mode 100644 index 0000000..d403c37 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/default/susan.wat @@ -0,0 +1,10631 @@ +(module $susan.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32) (result i32))) + (type (;3;) (func (param i32 i32 i32))) + (type (;4;) (func (param i32 i32 i32 i32 i32 i32))) + (type (;5;) (func (param i32 i32 i32 i32 i32))) + (type (;6;) (func (param i32 i32 f32 i32 i32 i32))) + (type (;7;) (func (param i32 i32 i32 i32))) + (type (;8;) (func (param i32 i32 i32 i32 i32 i32 i32))) + (type (;9;) (func (result i32))) + (type (;10;) (func (param i32 i32 i32 i32) (result i32))) + (type (;11;) (func (param i32 i32 i32) (result i32))) + (type (;12;) (func (param f32) (result f32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $susan_getint (type 2) (param i32) (result i32) + (local i32 i32 i32) + global.get $__stack_pointer + i32.const 10000 + i32.sub + local.tee 1 + global.set $__stack_pointer + local.get 0 + call $susan_wccfgetc + local.set 2 + i32.const 0 + i32.const 3 + call $__pragma_loopbound + loop ;; label = @1 + block ;; label = @2 + local.get 2 + i32.const 35 + i32.ne + br_if 0 (;@2;) + local.get 1 + i32.const 9000 + local.get 0 + call $susan_wccfgets + drop + local.get 0 + call $susan_wccfgetc + local.set 2 + br 1 (;@1;) + end + block ;; label = @2 + local.get 2 + i32.const -48 + i32.add + i32.const 10 + i32.lt_u + br_if 0 (;@2;) + local.get 0 + call $susan_wccfgetc + local.set 2 + br 1 (;@1;) + end + end + i32.const 1 + i32.const 2 + call $__pragma_loopbound + i32.const 0 + local.set 3 + loop ;; label = @1 + local.get 2 + local.get 3 + i32.const 10 + i32.mul + i32.add + i32.const -48 + i32.add + local.set 3 + local.get 0 + call $susan_wccfgetc + local.tee 2 + i32.const -58 + i32.add + i32.const -11 + i32.gt_u + br_if 0 (;@1;) + end + local.get 1 + i32.const 10000 + i32.add + global.set $__stack_pointer + local.get 3) + (func $susan_int_to_uchar (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 0 + i32.load8_s + local.set 3 + i32.const 0 + local.set 4 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 2 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + local.get 2 + i32.const 3 + i32.and + local.set 5 + local.get 2 + i32.const 4 + i32.ge_u + br_if 1 (;@2;) + local.get 3 + local.set 6 + br 2 (;@1;) + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + return + end + local.get 2 + i32.const 2147483644 + i32.and + local.set 7 + i32.const 0 + local.set 4 + local.get 3 + local.set 6 + loop ;; label = @2 + local.get 3 + local.get 0 + local.get 4 + i32.add + local.tee 8 + i32.load8_s + local.tee 9 + local.get 3 + local.get 9 + i32.lt_s + select + local.tee 3 + local.get 8 + i32.const 1 + i32.add + i32.load8_s + local.tee 10 + local.get 3 + local.get 10 + i32.lt_s + select + local.tee 3 + local.get 8 + i32.const 2 + i32.add + i32.load8_s + local.tee 11 + local.get 3 + local.get 11 + i32.lt_s + select + local.tee 3 + local.get 8 + i32.const 3 + i32.add + i32.load8_s + local.tee 8 + local.get 3 + local.get 8 + i32.lt_s + select + local.set 3 + local.get 6 + local.get 9 + local.get 6 + local.get 9 + i32.gt_s + select + local.tee 6 + local.get 10 + local.get 6 + local.get 10 + i32.gt_s + select + local.tee 6 + local.get 11 + local.get 6 + local.get 11 + i32.gt_s + select + local.tee 6 + local.get 8 + local.get 6 + local.get 8 + i32.gt_s + select + local.set 6 + local.get 7 + local.get 4 + i32.const 4 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@2;) + end + end + block ;; label = @1 + local.get 5 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 4 + i32.add + local.set 9 + loop ;; label = @2 + local.get 3 + local.get 9 + i32.load8_s + local.tee 8 + local.get 3 + local.get 8 + i32.lt_s + select + local.set 3 + local.get 6 + local.get 8 + local.get 6 + local.get 8 + i32.gt_s + select + local.set 6 + local.get 9 + i32.const 1 + i32.add + local.set 9 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@2;) + end + end + block ;; label = @1 + block ;; label = @2 + local.get 6 + local.get 3 + i32.ne + br_if 0 (;@2;) + i32.const 0 + local.set 3 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 2 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + local.get 2 + i32.const 7 + i32.and + local.set 6 + block ;; label = @3 + local.get 2 + i32.const 8 + i32.lt_u + br_if 0 (;@3;) + local.get 2 + i32.const 2147483640 + i32.and + local.set 8 + i32.const 0 + local.set 3 + loop ;; label = @4 + local.get 1 + local.get 3 + i32.add + i64.const 0 + i64.store align=1 + local.get 8 + local.get 3 + i32.const 8 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@4;) + end + end + local.get 6 + i32.eqz + br_if 1 (;@1;) + local.get 1 + local.get 3 + i32.add + local.set 3 + loop ;; label = @3 + local.get 3 + i32.const 0 + i32.store8 + local.get 3 + i32.const 1 + i32.add + local.set 3 + local.get 6 + i32.const -1 + i32.add + local.tee 6 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 0 + local.set 8 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 2 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 6 + local.get 3 + i32.sub + local.set 6 + local.get 2 + i32.const 1 + i32.and + local.set 4 + block ;; label = @2 + local.get 2 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 2 + i32.const 2147483646 + i32.and + local.set 11 + i32.const 0 + local.set 8 + loop ;; label = @3 + local.get 1 + local.get 8 + i32.add + local.tee 9 + local.get 0 + local.get 8 + i32.add + local.tee 10 + i32.load8_s + local.get 3 + i32.sub + i32.const 255 + i32.mul + local.get 6 + i32.div_s + i32.store8 + local.get 9 + i32.const 1 + i32.add + local.get 10 + i32.const 1 + i32.add + i32.load8_s + local.get 3 + i32.sub + i32.const 255 + i32.mul + local.get 6 + i32.div_s + i32.store8 + local.get 11 + local.get 8 + i32.const 2 + i32.add + local.tee 8 + i32.ne + br_if 0 (;@3;) + end + end + local.get 4 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 8 + i32.add + local.get 0 + local.get 8 + i32.add + i32.load8_s + local.get 3 + i32.sub + i32.const 255 + i32.mul + local.get 6 + i32.div_s + i32.store8 + end) + (func $susan_principle (type 4) (param i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 1 + i32.const 0 + local.get 4 + local.get 5 + i32.mul + i32.const 2 + i32.shl + call $susan_wccmemset + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @1 + local.get 5 + i32.const 7 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 4 + i32.const 6 + i32.gt_s + br_if 0 (;@2;) + local.get 5 + i32.const -6 + i32.add + local.set 5 + loop ;; label = @3 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 5 + i32.const -3 + i32.add + local.set 6 + local.get 4 + i32.const -6 + i32.add + local.set 7 + local.get 0 + local.get 4 + i32.add + local.set 8 + local.get 0 + local.get 4 + i32.const 2 + i32.shl + i32.add + local.set 9 + local.get 0 + local.get 4 + i32.const 3 + i32.mul + local.tee 5 + i32.add + local.set 10 + local.get 0 + local.get 4 + i32.const 1 + i32.shl + i32.add + local.set 11 + local.get 0 + local.get 4 + i32.const 5 + i32.mul + i32.add + local.set 12 + local.get 0 + local.get 4 + i32.const 6 + i32.mul + i32.add + local.set 13 + local.get 5 + local.get 1 + i32.add + i32.const 3 + i32.add + local.set 14 + i32.const 3 + local.set 15 + loop ;; label = @2 + i32.const 0 + local.set 1 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + loop ;; label = @3 + block ;; label = @4 + local.get 3 + local.get 2 + local.get 10 + local.get 1 + i32.add + local.tee 16 + i32.const 3 + i32.add + i32.load8_u + i32.add + local.tee 5 + local.get 0 + local.get 1 + i32.add + local.tee 17 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.get 5 + local.get 17 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 8 + local.get 1 + i32.add + local.tee 17 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 11 + local.get 1 + i32.add + local.tee 17 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 17 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 9 + local.get 1 + i32.add + local.tee 16 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 12 + local.get 1 + i32.add + local.tee 16 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 13 + local.get 1 + i32.add + local.tee 16 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 16 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 100 + i32.add + local.tee 5 + i32.lt_s + br_if 0 (;@4;) + local.get 14 + local.get 1 + i32.add + local.get 3 + local.get 5 + i32.sub + i32.store8 + end + local.get 7 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.ne + br_if 0 (;@3;) + end + local.get 9 + local.get 4 + i32.add + local.set 9 + local.get 10 + local.get 4 + i32.add + local.set 10 + local.get 11 + local.get 4 + i32.add + local.set 11 + local.get 12 + local.get 4 + i32.add + local.set 12 + local.get 13 + local.get 4 + i32.add + local.set 13 + local.get 8 + local.get 4 + i32.add + local.set 8 + local.get 0 + local.get 4 + i32.add + local.set 0 + local.get 14 + local.get 4 + i32.add + local.set 14 + local.get 15 + i32.const 1 + i32.add + local.tee 15 + local.get 6 + i32.ne + br_if 0 (;@2;) + end + end) + (func $susan_principle_small (type 4) (param i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + local.get 1 + i32.const 0 + local.get 4 + local.get 5 + i32.mul + i32.const 2 + i32.shl + call $susan_wccmemset + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @1 + local.get 5 + i32.const 3 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 4 + i32.const 2 + i32.gt_s + br_if 0 (;@2;) + local.get 5 + i32.const -2 + i32.add + local.set 5 + loop ;; label = @3 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 5 + i32.const -1 + i32.add + local.set 6 + local.get 0 + local.get 4 + i32.add + local.set 7 + local.get 4 + i32.const -2 + i32.add + local.set 8 + local.get 0 + local.get 4 + i32.const 1 + i32.shl + i32.add + local.set 9 + local.get 4 + local.get 1 + i32.add + i32.const 1 + i32.add + local.set 10 + i32.const 1 + local.set 11 + loop ;; label = @2 + i32.const 0 + local.set 1 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + loop ;; label = @3 + block ;; label = @4 + local.get 3 + local.get 2 + local.get 7 + local.get 1 + i32.add + local.tee 12 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.tee 5 + local.get 0 + local.get 1 + i32.add + local.tee 13 + i32.load8_u + i32.sub + i32.load8_u + local.get 5 + local.get 13 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 13 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 12 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 12 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 9 + local.get 1 + i32.add + local.tee 12 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 12 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 5 + local.get 12 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 100 + i32.add + local.tee 5 + i32.lt_s + br_if 0 (;@4;) + local.get 10 + local.get 1 + i32.add + local.get 3 + local.get 5 + i32.sub + i32.store8 + end + local.get 8 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + i32.ne + br_if 0 (;@3;) + end + local.get 7 + local.get 4 + i32.add + local.set 7 + local.get 9 + local.get 4 + i32.add + local.set 9 + local.get 0 + local.get 4 + i32.add + local.set 0 + local.get 10 + local.get 4 + i32.add + local.set 10 + local.get 11 + i32.const 1 + i32.add + local.tee 11 + local.get 6 + i32.ne + br_if 0 (;@2;) + end + end) + (func $susan_enlarge (type 5) (param i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32) + i32.const 95 + i32.const 95 + call $__pragma_loopbound + local.get 1 + local.get 4 + i32.add + local.set 5 + block ;; label = @1 + local.get 3 + i32.load + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 4 + i32.const 1 + i32.shl + local.set 6 + i32.const 0 + local.set 7 + loop ;; label = @2 + local.get 5 + local.get 2 + i32.load + local.tee 8 + local.get 6 + i32.add + local.get 4 + local.get 7 + i32.add + i32.mul + i32.add + local.get 0 + i32.load + local.get 8 + local.get 7 + i32.mul + i32.add + local.get 8 + call $susan_wccmemcpy + drop + local.get 7 + i32.const 1 + i32.add + local.tee 7 + local.get 3 + i32.load + i32.lt_s + br_if 0 (;@2;) + end + end + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + local.get 4 + i32.const 1 + i32.shl + local.set 9 + i32.const 0 + local.set 7 + i32.const -1 + local.set 8 + loop ;; label = @4 + local.get 5 + local.get 2 + i32.load + local.tee 6 + local.get 9 + i32.add + local.get 4 + local.get 8 + i32.add + i32.mul + i32.add + local.get 0 + i32.load + local.get 6 + local.get 7 + i32.mul + i32.add + local.get 6 + call $susan_wccmemcpy + drop + local.get 5 + local.get 4 + local.get 7 + i32.add + local.get 3 + i32.load + local.tee 10 + i32.add + local.get 2 + i32.load + local.tee 6 + local.get 9 + i32.add + i32.mul + i32.add + local.get 0 + i32.load + local.get 8 + local.get 10 + i32.add + local.get 6 + i32.mul + i32.add + local.get 6 + call $susan_wccmemcpy + drop + local.get 8 + i32.const -1 + i32.add + local.set 8 + local.get 4 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + i32.ne + br_if 0 (;@4;) + end + i32.const 0 + local.set 6 + local.get 4 + i32.const 0 + i32.gt_s + br_if 1 (;@2;) + end + local.get 4 + i32.const 1 + i32.shl + local.set 8 + br 1 (;@1;) + end + i32.const 0 + local.get 4 + i32.const 1 + i32.shl + local.tee 8 + i32.sub + local.set 11 + loop ;; label = @2 + i32.const 109 + i32.const 109 + call $__pragma_loopbound + block ;; label = @3 + local.get 3 + i32.load + local.get 11 + i32.le_s + br_if 0 (;@3;) + local.get 6 + i32.const -1 + i32.xor + local.set 9 + i32.const 0 + local.set 7 + loop ;; label = @4 + local.get 5 + local.get 2 + i32.load + local.get 8 + i32.add + local.get 7 + i32.mul + i32.add + local.tee 10 + local.get 9 + i32.add + local.get 10 + local.get 6 + i32.add + i32.load8_u + i32.store8 + local.get 1 + local.get 2 + i32.load + local.tee 10 + local.get 8 + i32.add + local.get 7 + i32.mul + i32.add + local.get 10 + i32.add + local.get 4 + i32.add + local.tee 10 + local.get 6 + i32.add + local.get 10 + local.get 9 + i32.add + i32.load8_u + i32.store8 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + local.get 3 + i32.load + local.get 8 + i32.add + i32.lt_s + br_if 0 (;@4;) + end + end + local.get 6 + i32.const 1 + i32.add + local.tee 6 + local.get 4 + i32.ne + br_if 0 (;@2;) + end + end + local.get 2 + local.get 2 + i32.load + local.get 8 + i32.add + i32.store + local.get 0 + local.get 1 + i32.store + local.get 3 + local.get 3 + i32.load + local.get 8 + i32.add + i32.store) + (func $susan_smoothing (type 6) (param i32 i32 f32 i32 i32 i32) + (local i32 f64 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 6 + global.set $__stack_pointer + local.get 6 + local.get 1 + i32.store offset=12 + block ;; label = @1 + block ;; label = @2 + local.get 2 + f64.promote_f32 + f64.const 0x1.8p+0 (;=1.5;) + f64.mul + local.tee 7 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@2;) + local.get 7 + i32.trunc_f64_s + local.set 8 + br 1 (;@1;) + end + i32.const -2147483648 + local.set 8 + end + local.get 6 + local.get 4 + i32.store offset=4 + local.get 6 + local.get 3 + i32.store offset=8 + local.get 6 + i32.const 12 + i32.add + i32.const 1 + local.get 8 + i32.const 1 + i32.add + local.tee 9 + local.get 0 + select + local.tee 10 + i32.const 1 + i32.shl + local.tee 11 + local.get 3 + i32.add + local.get 11 + local.get 4 + i32.add + i32.mul + call $susan_wccmalloc + local.get 6 + i32.const 8 + i32.add + local.get 6 + i32.const 4 + i32.add + local.get 10 + call $susan_enlarge + block ;; label = @1 + block ;; label = @2 + local.get 0 + br_if 0 (;@2;) + local.get 6 + i32.load offset=8 + local.set 12 + local.get 11 + i32.const 1 + i32.or + local.tee 13 + local.get 13 + i32.mul + call $susan_wccmalloc + local.set 14 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @3 + local.get 9 + local.get 8 + i32.const -1 + i32.xor + local.tee 15 + i32.lt_s + local.tee 16 + br_if 0 (;@3;) + local.get 2 + f32.neg + local.get 2 + f32.mul + local.set 17 + i32.const -2 + local.get 8 + i32.sub + local.set 18 + local.get 14 + local.set 4 + local.get 15 + local.set 9 + loop ;; label = @4 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 9 + local.get 9 + i32.mul + local.set 11 + local.get 18 + local.set 0 + loop ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 0 + i32.const 1 + i32.add + local.tee 0 + local.get 0 + i32.mul + local.get 11 + i32.add + f32.convert_i32_u + local.get 17 + f32.div + f32.const 0x1.7p+7 (;=184;) + f32.mul + f32.const 0x1.fbc8p+13 (;=16249;) + f32.add + local.tee 2 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@7;) + local.get 2 + i32.trunc_f32_s + local.set 3 + br 1 (;@6;) + end + i32.const -2147483648 + local.set 3 + end + block ;; label = @6 + block ;; label = @7 + local.get 3 + i32.const 65535 + i32.and + f32.reinterpret_i32 + f64.promote_f32 + f64.const 0x1.9p+6 (;=100;) + f64.mul + local.tee 7 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@7;) + local.get 7 + i32.trunc_f64_s + local.set 3 + br 1 (;@6;) + end + i32.const -2147483648 + local.set 3 + end + local.get 4 + local.get 3 + i32.store8 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 10 + local.get 0 + i32.ne + br_if 0 (;@5;) + end + local.get 9 + local.get 10 + i32.ne + local.set 0 + local.get 9 + i32.const 1 + i32.add + local.set 9 + local.get 0 + br_if 0 (;@4;) + end + end + i32.const 95 + i32.const 95 + call $__pragma_loopbound + local.get 10 + local.get 6 + i32.load offset=4 + local.tee 0 + local.get 10 + i32.sub + i32.ge_s + br_if 1 (;@1;) + local.get 12 + local.get 13 + i32.sub + local.set 19 + local.get 10 + i32.const 1 + i32.add + local.set 20 + i32.const 0 + local.get 8 + i32.sub + local.set 21 + local.get 10 + local.get 8 + i32.add + local.tee 22 + i32.const 1 + i32.and + local.set 23 + local.get 22 + i32.const 2 + i32.add + local.set 24 + local.get 6 + i32.load offset=8 + local.set 25 + local.get 10 + local.set 26 + loop ;; label = @3 + i32.const 76 + i32.const 76 + call $__pragma_loopbound + block ;; label = @4 + block ;; label = @5 + local.get 10 + local.get 25 + local.get 10 + i32.sub + i32.lt_s + br_if 0 (;@5;) + local.get 26 + i32.const 1 + i32.add + local.set 26 + br 1 (;@4;) + end + local.get 26 + i32.const 1 + i32.add + local.set 27 + local.get 26 + i32.const -1 + i32.add + local.set 28 + local.get 26 + local.get 10 + i32.sub + local.set 29 + local.get 10 + local.set 30 + loop ;; label = @5 + local.get 6 + i32.load offset=12 + local.tee 31 + local.get 25 + local.get 26 + i32.mul + i32.add + local.get 30 + i32.add + local.tee 32 + i32.load8_u + local.set 33 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 16 + i32.eqz + br_if 0 (;@8;) + i32.const 0 + local.set 3 + i32.const -10000 + local.set 0 + br 1 (;@7;) + end + local.get 5 + local.get 33 + i32.add + local.set 18 + local.get 31 + local.get 25 + local.get 29 + i32.mul + i32.add + local.get 30 + i32.add + local.get 15 + i32.add + local.set 34 + i32.const 0 + local.set 3 + local.get 14 + local.set 35 + i32.const 0 + local.set 11 + local.get 15 + local.set 36 + loop ;; label = @8 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @9 + block ;; label = @10 + local.get 23 + br_if 0 (;@10;) + local.get 35 + local.set 0 + local.get 34 + local.set 4 + local.get 15 + local.set 9 + br 1 (;@9;) + end + local.get 35 + i32.const 1 + i32.add + local.set 0 + local.get 34 + i32.const 1 + i32.add + local.set 4 + local.get 18 + local.get 34 + i32.load8_u + local.tee 9 + i32.sub + i32.load8_u + local.get 35 + i32.load8_u + i32.mul + local.tee 8 + local.get 11 + i32.add + local.set 11 + local.get 8 + local.get 9 + i32.mul + local.get 3 + i32.add + local.set 3 + local.get 21 + local.set 9 + end + block ;; label = @9 + local.get 22 + i32.const -1 + i32.eq + br_if 0 (;@9;) + local.get 20 + local.get 9 + i32.sub + local.set 9 + loop ;; label = @10 + local.get 18 + local.get 4 + i32.const 1 + i32.add + i32.load8_u + local.tee 8 + i32.sub + i32.load8_u + local.get 0 + i32.const 1 + i32.add + i32.load8_u + i32.mul + local.tee 13 + local.get 18 + local.get 4 + i32.load8_u + local.tee 12 + i32.sub + i32.load8_u + local.get 0 + i32.load8_u + i32.mul + local.tee 37 + local.get 11 + i32.add + i32.add + local.set 11 + local.get 13 + local.get 8 + i32.mul + local.get 37 + local.get 12 + i32.mul + local.get 3 + i32.add + i32.add + local.set 3 + local.get 0 + i32.const 2 + i32.add + local.set 0 + local.get 4 + i32.const 2 + i32.add + local.set 4 + local.get 9 + i32.const -2 + i32.add + local.tee 9 + br_if 0 (;@10;) + end + end + local.get 34 + local.get 24 + i32.add + local.get 19 + i32.add + local.set 34 + local.get 35 + local.get 24 + i32.add + local.set 35 + local.get 36 + local.get 10 + i32.ne + local.set 0 + local.get 36 + i32.const 1 + i32.add + local.set 36 + local.get 0 + br_if 0 (;@8;) + end + local.get 11 + i32.const -10000 + i32.add + local.tee 0 + br_if 0 (;@7;) + local.get 31 + local.get 25 + local.get 27 + i32.mul + i32.add + local.get 30 + i32.add + local.tee 0 + i32.const 1 + i32.add + i32.load8_u + local.set 34 + local.get 0 + i32.load8_u + local.set 4 + local.get 0 + i32.const -1 + i32.add + i32.load8_u + local.set 3 + local.get 32 + i32.const 1 + i32.add + i32.load8_u + local.set 11 + local.get 32 + i32.const -1 + i32.add + i32.load8_u + local.set 9 + local.get 31 + local.get 25 + local.get 28 + i32.mul + i32.add + local.get 30 + i32.add + local.tee 8 + i32.const 1 + i32.add + i32.load8_u + local.set 0 + local.get 8 + i32.load8_u + local.set 18 + local.get 8 + i32.const -1 + i32.add + i32.load8_u + local.set 8 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 8 + local.get 18 + local.get 8 + local.get 18 + i32.gt_u + select + local.tee 13 + local.get 0 + local.get 13 + local.get 0 + i32.lt_u + select + local.tee 12 + local.get 8 + local.get 18 + local.get 8 + local.get 18 + i32.lt_u + select + local.tee 8 + local.get 0 + local.get 8 + i32.lt_u + local.tee 37 + select + local.tee 18 + local.get 8 + local.get 12 + local.get 37 + select + local.tee 8 + local.get 13 + local.get 0 + local.get 13 + local.get 0 + i32.gt_u + select + local.tee 0 + local.get 9 + local.get 0 + local.get 9 + i32.lt_u + select + local.tee 13 + local.get 8 + local.get 13 + i32.lt_u + select + local.tee 12 + local.get 18 + local.get 12 + i32.gt_u + select + local.tee 37 + local.get 8 + local.get 13 + local.get 8 + local.get 13 + i32.gt_u + select + local.tee 8 + local.get 0 + local.get 9 + local.get 0 + local.get 9 + i32.gt_u + select + local.tee 9 + local.get 11 + local.get 9 + local.get 11 + i32.lt_u + select + local.tee 13 + local.get 8 + local.get 13 + i32.lt_u + select + local.tee 0 + local.get 37 + local.get 0 + i32.lt_u + select + local.tee 35 + local.get 18 + local.get 12 + local.get 18 + local.get 12 + i32.lt_u + select + local.tee 18 + local.get 0 + local.get 18 + i32.lt_u + local.tee 12 + select + local.tee 36 + local.get 18 + local.get 35 + local.get 12 + select + local.tee 18 + local.get 37 + local.get 0 + local.get 37 + local.get 0 + i32.gt_u + select + local.tee 0 + local.get 8 + local.get 13 + local.get 8 + local.get 13 + i32.gt_u + select + local.tee 8 + local.get 9 + local.get 11 + local.get 9 + local.get 11 + i32.gt_u + select + local.tee 11 + local.get 3 + local.get 11 + local.get 3 + i32.lt_u + select + local.tee 9 + local.get 8 + local.get 9 + i32.lt_u + select + local.tee 13 + local.get 0 + local.get 13 + i32.lt_u + select + local.tee 12 + local.get 18 + local.get 12 + i32.lt_u + select + local.tee 37 + local.get 36 + local.get 37 + i32.gt_u + select + local.tee 37 + local.get 18 + local.get 12 + local.get 18 + local.get 12 + i32.gt_u + select + local.tee 18 + local.get 0 + local.get 13 + local.get 0 + local.get 13 + i32.gt_u + select + local.tee 0 + local.get 8 + local.get 9 + local.get 8 + local.get 9 + i32.gt_u + select + local.tee 9 + local.get 11 + local.get 3 + local.get 11 + local.get 3 + i32.gt_u + select + local.tee 3 + local.get 4 + local.get 3 + local.get 4 + i32.lt_u + select + local.tee 11 + local.get 9 + local.get 11 + i32.lt_u + select + local.tee 8 + local.get 0 + local.get 8 + i32.lt_u + select + local.tee 13 + local.get 18 + local.get 13 + i32.lt_u + select + local.tee 12 + local.get 37 + local.get 12 + i32.gt_u + select + local.tee 12 + local.get 18 + local.get 13 + local.get 18 + local.get 13 + i32.gt_u + select + local.tee 18 + local.get 0 + local.get 8 + local.get 0 + local.get 8 + i32.gt_u + select + local.tee 0 + local.get 9 + local.get 11 + local.get 9 + local.get 11 + i32.gt_u + select + local.tee 11 + local.get 3 + local.get 4 + local.get 3 + local.get 4 + i32.gt_u + select + local.tee 4 + local.get 34 + local.get 4 + local.get 34 + i32.lt_u + select + local.tee 4 + local.get 11 + local.get 4 + i32.lt_u + select + local.tee 4 + local.get 0 + local.get 4 + i32.lt_u + select + local.tee 0 + local.get 18 + local.get 0 + i32.lt_u + select + local.tee 4 + local.get 12 + local.get 4 + i32.gt_u + select + local.get 18 + local.get 0 + local.get 18 + local.get 0 + i32.gt_u + select + i32.add + i32.const 1 + i32.shr_u + local.set 0 + br 1 (;@6;) + end + local.get 3 + local.get 33 + i32.const -10000 + i32.mul + i32.add + local.get 0 + i32.div_s + local.set 0 + end + local.get 1 + local.get 0 + i32.store8 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 30 + i32.const 1 + i32.add + local.tee 30 + local.get 6 + i32.load offset=8 + local.tee 25 + local.get 10 + i32.sub + i32.lt_s + br_if 0 (;@5;) + end + local.get 6 + i32.load offset=4 + local.set 0 + local.get 27 + local.set 26 + end + local.get 26 + local.get 0 + local.get 10 + i32.sub + i32.lt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 6 + i32.load offset=4 + local.tee 0 + i32.const 3 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 6 + i32.load offset=8 + local.tee 3 + i32.const 3 + i32.lt_s + br_if 0 (;@2;) + i32.const 1 + local.set 32 + loop ;; label = @3 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + block ;; label = @4 + block ;; label = @5 + local.get 3 + i32.const 2 + i32.gt_s + br_if 0 (;@5;) + local.get 32 + i32.const 1 + i32.add + local.set 32 + br 1 (;@4;) + end + local.get 32 + i32.const 1 + i32.add + local.set 26 + local.get 32 + i32.const -1 + i32.add + local.set 16 + i32.const 0 + local.set 4 + loop ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 5 + local.get 6 + i32.load offset=12 + local.tee 13 + local.get 3 + local.get 32 + i32.mul + i32.add + local.get 4 + i32.add + local.tee 9 + i32.const 1 + i32.add + i32.load8_u + local.tee 12 + i32.add + local.tee 0 + local.get 13 + local.get 3 + local.get 16 + i32.mul + i32.add + local.get 4 + i32.add + local.tee 11 + i32.load8_u + local.tee 18 + i32.sub + i32.load8_u + local.tee 37 + local.get 0 + local.get 11 + i32.const 1 + i32.add + i32.load8_u + local.tee 8 + i32.sub + i32.load8_u + local.tee 34 + i32.add + local.get 0 + local.get 11 + i32.const 2 + i32.add + i32.load8_u + local.tee 11 + i32.sub + i32.load8_u + local.tee 35 + i32.add + local.get 0 + local.get 9 + i32.load8_u + local.tee 36 + i32.sub + i32.load8_u + local.tee 24 + i32.add + local.get 5 + i32.load8_u + local.tee 10 + i32.add + local.get 0 + local.get 9 + i32.const 2 + i32.add + local.tee 25 + i32.load8_u + local.tee 22 + i32.sub + i32.load8_u + local.tee 19 + i32.add + local.get 0 + local.get 13 + local.get 26 + local.get 3 + i32.mul + i32.add + local.get 4 + i32.add + local.tee 3 + i32.load8_u + local.tee 13 + i32.sub + i32.load8_u + local.tee 23 + i32.add + local.get 0 + local.get 3 + i32.const 1 + i32.add + local.tee 33 + i32.load8_u + local.tee 20 + i32.sub + i32.load8_u + local.tee 15 + i32.add + local.get 0 + local.get 3 + i32.const 2 + i32.add + local.tee 31 + i32.load8_u + local.tee 21 + i32.sub + i32.load8_u + local.tee 0 + i32.add + i32.const -100 + i32.add + local.tee 30 + br_if 0 (;@7;) + local.get 31 + i32.load8_u + local.set 35 + local.get 33 + i32.load8_u + local.set 0 + local.get 3 + i32.load8_u + local.set 3 + local.get 25 + i32.load8_u + local.set 13 + local.get 9 + i32.load8_u + local.set 9 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 18 + local.get 8 + local.get 18 + local.get 8 + i32.gt_u + select + local.tee 12 + local.get 11 + local.get 12 + local.get 11 + i32.lt_u + select + local.tee 37 + local.get 18 + local.get 8 + local.get 18 + local.get 8 + i32.lt_u + select + local.tee 8 + local.get 11 + local.get 8 + i32.lt_u + local.tee 34 + select + local.tee 18 + local.get 8 + local.get 37 + local.get 34 + select + local.tee 8 + local.get 12 + local.get 11 + local.get 12 + local.get 11 + i32.gt_u + select + local.tee 11 + local.get 9 + local.get 11 + local.get 9 + i32.lt_u + select + local.tee 12 + local.get 8 + local.get 12 + i32.lt_u + select + local.tee 37 + local.get 18 + local.get 37 + i32.gt_u + select + local.tee 34 + local.get 8 + local.get 12 + local.get 8 + local.get 12 + i32.gt_u + select + local.tee 8 + local.get 11 + local.get 9 + local.get 11 + local.get 9 + i32.gt_u + select + local.tee 9 + local.get 13 + local.get 9 + local.get 13 + i32.lt_u + select + local.tee 12 + local.get 8 + local.get 12 + i32.lt_u + select + local.tee 11 + local.get 34 + local.get 11 + i32.lt_u + select + local.tee 36 + local.get 18 + local.get 37 + local.get 18 + local.get 37 + i32.lt_u + select + local.tee 18 + local.get 11 + local.get 18 + i32.lt_u + local.tee 37 + select + local.tee 24 + local.get 18 + local.get 36 + local.get 37 + select + local.tee 18 + local.get 34 + local.get 11 + local.get 34 + local.get 11 + i32.gt_u + select + local.tee 11 + local.get 8 + local.get 12 + local.get 8 + local.get 12 + i32.gt_u + select + local.tee 8 + local.get 9 + local.get 13 + local.get 9 + local.get 13 + i32.gt_u + select + local.tee 9 + local.get 3 + local.get 9 + local.get 3 + i32.lt_u + select + local.tee 13 + local.get 8 + local.get 13 + i32.lt_u + select + local.tee 12 + local.get 11 + local.get 12 + i32.lt_u + select + local.tee 37 + local.get 18 + local.get 37 + i32.lt_u + select + local.tee 34 + local.get 24 + local.get 34 + i32.gt_u + select + local.tee 34 + local.get 18 + local.get 37 + local.get 18 + local.get 37 + i32.gt_u + select + local.tee 18 + local.get 11 + local.get 12 + local.get 11 + local.get 12 + i32.gt_u + select + local.tee 11 + local.get 8 + local.get 13 + local.get 8 + local.get 13 + i32.gt_u + select + local.tee 8 + local.get 9 + local.get 3 + local.get 9 + local.get 3 + i32.gt_u + select + local.tee 3 + local.get 0 + local.get 3 + local.get 0 + i32.lt_u + select + local.tee 9 + local.get 8 + local.get 9 + i32.lt_u + select + local.tee 13 + local.get 11 + local.get 13 + i32.lt_u + select + local.tee 12 + local.get 18 + local.get 12 + i32.lt_u + select + local.tee 37 + local.get 34 + local.get 37 + i32.gt_u + select + local.tee 37 + local.get 18 + local.get 12 + local.get 18 + local.get 12 + i32.gt_u + select + local.tee 18 + local.get 11 + local.get 13 + local.get 11 + local.get 13 + i32.gt_u + select + local.tee 11 + local.get 8 + local.get 9 + local.get 8 + local.get 9 + i32.gt_u + select + local.tee 9 + local.get 3 + local.get 0 + local.get 3 + local.get 0 + i32.gt_u + select + local.tee 0 + local.get 35 + local.get 0 + local.get 35 + i32.lt_u + select + local.tee 0 + local.get 9 + local.get 0 + i32.lt_u + select + local.tee 0 + local.get 11 + local.get 0 + i32.lt_u + select + local.tee 0 + local.get 18 + local.get 0 + i32.lt_u + select + local.tee 3 + local.get 37 + local.get 3 + i32.gt_u + select + local.get 18 + local.get 0 + local.get 18 + local.get 0 + i32.gt_u + select + i32.add + i32.const 1 + i32.shr_u + local.set 0 + br 1 (;@6;) + end + local.get 37 + local.get 18 + i32.mul + local.get 12 + i32.const -100 + i32.mul + i32.add + local.get 34 + local.get 8 + i32.mul + i32.add + local.get 35 + local.get 11 + i32.mul + i32.add + local.get 24 + local.get 36 + i32.mul + i32.add + local.get 10 + local.get 12 + i32.mul + i32.add + local.get 19 + local.get 22 + i32.mul + i32.add + local.get 23 + local.get 13 + i32.mul + i32.add + local.get 15 + local.get 20 + i32.mul + i32.add + local.get 0 + local.get 21 + i32.mul + i32.add + local.get 30 + i32.div_s + local.set 0 + end + local.get 1 + local.get 4 + i32.add + local.get 0 + i32.store8 + local.get 4 + i32.const 2 + i32.add + local.set 0 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 0 + local.get 6 + i32.load offset=8 + local.tee 3 + i32.const -1 + i32.add + i32.lt_s + br_if 0 (;@5;) + end + local.get 1 + local.get 4 + i32.add + local.set 1 + local.get 6 + i32.load offset=4 + local.set 0 + local.get 26 + local.set 32 + end + local.get 32 + local.get 0 + i32.const -1 + i32.add + i32.lt_s + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 0 + i32.const -2 + i32.add + local.set 0 + loop ;; label = @2 + i32.const 15 + i32.const 15 + call $__pragma_loopbound + local.get 0 + i32.const -1 + i32.add + local.tee 0 + br_if 0 (;@2;) + end + end + local.get 6 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $susan_edge_draw (type 5) (param i32 i32 i32 i32 i32) + (local i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 4 + i32.eqz + br_if 0 (;@2;) + local.get 3 + local.get 2 + i32.mul + local.set 3 + br 1 (;@1;) + end + i32.const 7220 + i32.const 7220 + call $__pragma_loopbound + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 3 + local.get 2 + i32.mul + local.tee 3 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + i32.const 7220 + i32.const 7220 + call $__pragma_loopbound + return + end + local.get 0 + local.get 2 + i32.add + local.set 5 + local.get 0 + local.get 2 + i32.sub + local.set 6 + loop ;; label = @2 + block ;; label = @3 + local.get 1 + local.get 4 + i32.add + i32.load8_u + i32.const 7 + i32.gt_u + br_if 0 (;@3;) + local.get 6 + local.get 4 + i32.add + local.tee 2 + i32.const 1 + i32.add + i32.const 255 + i32.store8 + local.get 2 + i32.const -1 + i32.add + i32.const 65535 + i32.store16 align=1 + local.get 0 + local.get 4 + i32.add + local.tee 2 + i32.const 1 + i32.add + i32.const 255 + i32.store8 + local.get 2 + i32.const -1 + i32.add + i32.const 255 + i32.store8 + local.get 5 + local.get 4 + i32.add + local.tee 2 + i32.const 1 + i32.add + i32.const 255 + i32.store8 + local.get 2 + i32.const -1 + i32.add + i32.const 65535 + i32.store16 align=1 + end + local.get 3 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 7220 + i32.const 7220 + call $__pragma_loopbound + block ;; label = @1 + local.get 3 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 3 + i32.const 1 + i32.and + local.set 5 + local.get 1 + local.set 4 + block ;; label = @2 + local.get 3 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 3 + i32.const 2147483646 + i32.and + local.set 2 + local.get 0 + local.set 3 + local.get 1 + local.set 4 + loop ;; label = @3 + block ;; label = @4 + local.get 4 + i32.load8_u + i32.const 7 + i32.gt_u + br_if 0 (;@4;) + local.get 3 + i32.const 0 + i32.store8 + end + block ;; label = @4 + local.get 4 + i32.load8_u offset=1 + i32.const 7 + i32.gt_u + br_if 0 (;@4;) + local.get 3 + i32.const 1 + i32.add + i32.const 0 + i32.store8 + end + local.get 3 + i32.const 2 + i32.add + local.set 3 + local.get 4 + i32.const 2 + i32.add + local.set 4 + local.get 2 + i32.const -2 + i32.add + local.tee 2 + br_if 0 (;@3;) + end + end + local.get 5 + i32.eqz + br_if 0 (;@1;) + local.get 4 + i32.load8_u + i32.const 7 + i32.gt_u + br_if 0 (;@1;) + local.get 0 + local.get 4 + local.get 1 + i32.sub + i32.add + i32.const 0 + i32.store8 + end) + (func $susan_thin (type 7) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 87 + i32.const 87 + call $__pragma_loopbound + block ;; label = @1 + local.get 3 + i32.const 9 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 2 + i32.const 8 + i32.gt_s + br_if 0 (;@2;) + local.get 3 + i32.const -8 + i32.add + local.set 3 + loop ;; label = @3 + i32.const 68 + i32.const 68 + call $__pragma_loopbound + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + i32.const -4 + i32.add + local.set 4 + local.get 2 + i32.const -4 + i32.add + local.set 5 + i32.const 4 + local.set 6 + loop ;; label = @2 + i32.const 68 + i32.const 68 + call $__pragma_loopbound + i32.const 4 + local.set 3 + loop ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 6 + local.get 2 + i32.mul + local.tee 7 + local.get 3 + i32.add + local.tee 8 + i32.add + local.tee 9 + i32.load8_u + local.tee 10 + i32.const 7 + i32.gt_u + br_if 0 (;@4;) + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 1 + local.get 6 + i32.const -1 + i32.add + local.tee 11 + local.get 2 + i32.mul + local.tee 12 + i32.add + local.get 3 + i32.add + local.tee 13 + i32.load8_u + i32.const 8 + i32.lt_u + local.get 13 + i32.const -1 + i32.add + local.tee 14 + i32.load8_u + i32.const 8 + i32.lt_u + i32.add + local.get 13 + i32.load8_u offset=1 + i32.const 8 + i32.lt_u + i32.add + local.get 14 + local.get 2 + i32.add + local.tee 15 + i32.load8_u + i32.const 8 + i32.lt_u + i32.add + local.get 15 + i32.load8_u offset=2 + i32.const 8 + i32.lt_u + i32.add + local.get 15 + local.get 2 + i32.add + local.tee 15 + i32.load8_u + i32.const 8 + i32.lt_u + i32.add + local.get 15 + i32.load8_u offset=1 + i32.const 8 + i32.lt_u + i32.add + local.get 15 + i32.load8_u offset=2 + i32.const 8 + i32.lt_u + i32.add + br_table 1 (;@7;) 0 (;@8;) 3 (;@5;) 2 (;@6;) + end + local.get 10 + i32.const 5 + i32.gt_u + br_if 3 (;@4;) + local.get 0 + local.get 8 + i32.const 1 + i32.add + local.tee 16 + i32.add + i32.load8_s + local.set 10 + local.get 0 + local.get 12 + local.get 3 + i32.add + local.tee 17 + i32.const 1 + i32.add + local.tee 18 + i32.add + i32.load8_s + local.set 7 + local.get 0 + local.get 6 + i32.const 1 + i32.add + local.get 2 + i32.mul + local.get 3 + i32.add + local.tee 19 + i32.add + i32.load8_s + local.set 13 + local.get 0 + local.get 19 + i32.const 1 + i32.add + local.tee 20 + i32.add + i32.load8_s + local.set 15 + local.get 0 + local.get 19 + i32.const -1 + i32.add + local.tee 21 + i32.add + i32.load8_s + local.set 14 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + local.get 1 + local.get 17 + i32.const -1 + i32.add + local.tee 12 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@11;) + local.get 0 + local.get 8 + i32.const -1 + i32.add + local.tee 22 + i32.add + i32.load8_s + local.set 8 + block ;; label = @12 + local.get 1 + local.get 17 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@12;) + local.get 0 + local.get 12 + i32.add + i32.load8_s + local.set 12 + block ;; label = @13 + local.get 1 + local.get 18 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@13;) + local.get 0 + local.get 17 + i32.add + i32.load8_s + local.set 17 + block ;; label = @14 + local.get 1 + local.get 22 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@14;) + block ;; label = @15 + local.get 1 + local.get 16 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@15;) + block ;; label = @16 + local.get 1 + local.get 21 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@16;) + block ;; label = @17 + local.get 1 + local.get 19 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@17;) + local.get 1 + local.get 20 + i32.add + i32.load8_u + i32.const 7 + i32.gt_u + br_if 9 (;@8;) + local.get 12 + i32.const 2 + i32.shl + local.set 12 + local.get 8 + i32.const 3 + i32.mul + local.set 8 + local.get 17 + i32.const 3 + i32.mul + local.set 17 + local.get 7 + i32.const 1 + i32.shl + local.set 7 + local.get 14 + i32.const 1 + i32.shl + local.set 14 + i32.const 0 + local.set 13 + i32.const 0 + local.set 10 + i32.const 0 + local.set 15 + br 9 (;@8;) + end + local.get 17 + i32.const 2 + i32.shl + local.set 17 + local.get 7 + i32.const 3 + i32.mul + local.set 7 + local.get 12 + i32.const 3 + i32.mul + local.set 12 + local.get 10 + i32.const 1 + i32.shl + local.set 10 + local.get 8 + i32.const 1 + i32.shl + local.set 8 + i32.const 0 + local.set 13 + i32.const 0 + local.set 14 + i32.const 0 + local.set 15 + br 8 (;@8;) + end + local.get 7 + i32.const 2 + i32.shl + local.set 7 + local.get 10 + i32.const 3 + i32.mul + local.set 10 + local.get 17 + i32.const 3 + i32.mul + local.set 17 + local.get 15 + i32.const 1 + i32.shl + local.set 15 + local.get 12 + i32.const 1 + i32.shl + local.set 12 + i32.const 0 + local.set 13 + i32.const 0 + local.set 14 + i32.const 0 + local.set 8 + br 7 (;@8;) + end + local.get 8 + i32.const 2 + i32.shl + local.set 8 + local.get 14 + i32.const 3 + i32.mul + local.set 14 + local.get 12 + i32.const 3 + i32.mul + local.set 12 + local.get 13 + i32.const 1 + i32.shl + local.set 13 + local.get 17 + i32.const 1 + i32.shl + local.set 17 + i32.const 0 + local.set 10 + i32.const 0 + local.set 15 + i32.const 0 + local.set 7 + br 6 (;@8;) + end + local.get 10 + i32.const 2 + i32.shl + local.set 10 + local.get 15 + i32.const 3 + i32.mul + local.set 15 + local.get 7 + i32.const 3 + i32.mul + local.set 7 + local.get 13 + i32.const 1 + i32.shl + local.set 13 + local.get 17 + i32.const 1 + i32.shl + local.set 17 + i32.const 0 + local.set 14 + i32.const 0 + local.set 8 + br 4 (;@9;) + end + local.get 14 + i32.const 2 + i32.shl + local.set 14 + local.get 13 + i32.const 3 + i32.mul + local.set 13 + local.get 8 + i32.const 3 + i32.mul + local.set 8 + local.get 15 + i32.const 1 + i32.shl + local.set 15 + local.get 12 + i32.const 1 + i32.shl + local.set 12 + i32.const 0 + local.set 10 + i32.const 0 + local.set 7 + i32.const 0 + local.set 17 + br 4 (;@8;) + end + local.get 13 + i32.const 2 + i32.shl + local.set 13 + local.get 15 + i32.const 3 + i32.mul + local.set 15 + local.get 14 + i32.const 3 + i32.mul + local.set 14 + local.get 10 + i32.const 1 + i32.shl + local.set 10 + local.get 8 + i32.const 1 + i32.shl + local.set 8 + i32.const 0 + local.set 7 + br 1 (;@10;) + end + local.get 15 + i32.const 2 + i32.shl + local.set 15 + local.get 13 + i32.const 3 + i32.mul + local.set 13 + local.get 10 + i32.const 3 + i32.mul + local.set 10 + local.get 14 + i32.const 1 + i32.shl + local.set 14 + local.get 7 + i32.const 1 + i32.shl + local.set 7 + i32.const 0 + local.set 8 + end + i32.const 0 + local.set 17 + end + i32.const 0 + local.set 12 + end + i32.const 3 + i32.const 3 + call $__pragma_loopbound + i32.const 2 + i32.const 1 + i32.const 0 + i32.const 2 + i32.const 0 + i32.const 2 + i32.const 1 + i32.const 0 + local.get 23 + local.get 12 + i32.const 0 + i32.gt_s + local.tee 19 + select + local.get 17 + local.get 12 + i32.const 0 + local.get 19 + select + local.tee 23 + i32.gt_s + local.tee 12 + select + local.get 7 + local.get 17 + local.get 23 + local.get 12 + select + local.tee 23 + i32.gt_s + local.tee 17 + select + local.get 8 + local.get 7 + local.get 23 + local.get 17 + select + local.tee 23 + i32.gt_s + local.tee 7 + select + local.get 10 + local.get 8 + local.get 23 + local.get 7 + select + local.tee 23 + i32.gt_s + local.tee 8 + select + local.get 14 + local.get 10 + local.get 23 + local.get 8 + select + local.tee 23 + i32.gt_s + local.tee 10 + select + local.get 13 + local.get 14 + local.get 23 + local.get 10 + select + local.tee 23 + i32.gt_s + local.tee 14 + select + local.get 15 + local.get 13 + local.get 23 + local.get 14 + select + local.tee 18 + i32.gt_s + local.tee 13 + select + local.set 23 + i32.const 2 + i32.const 2 + i32.const 1 + i32.const 1 + i32.const 0 + i32.const 0 + local.get 24 + local.get 12 + local.get 19 + i32.or + i32.const 1 + i32.and + select + local.get 17 + select + local.get 7 + select + local.get 8 + select + local.get 14 + local.get 10 + i32.or + i32.const 1 + i32.and + select + local.get 13 + select + local.set 24 + local.get 15 + local.get 18 + local.get 13 + select + i32.eqz + br_if 3 (;@4;) + local.get 1 + local.get 11 + local.get 24 + i32.add + local.tee 13 + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.get 23 + i32.add + i32.const -1 + i32.add + i32.const 4 + local.get 9 + i32.load8_u + local.tee 15 + i32.const 1 + i32.add + local.get 15 + i32.const 4 + i32.lt_u + select + i32.store8 + local.get 24 + i32.const 1 + i32.shl + local.get 23 + i32.add + i32.const 2 + i32.gt_s + br_if 3 (;@4;) + local.get 13 + i32.const 4 + local.get 13 + i32.const 4 + i32.gt_s + select + local.set 6 + local.get 3 + local.get 23 + i32.add + i32.const -2 + i32.add + local.tee 3 + i32.const 4 + local.get 3 + i32.const 4 + i32.gt_s + select + local.set 3 + br 3 (;@4;) + end + local.get 9 + i32.const 100 + i32.store8 + br 2 (;@4;) + end + local.get 1 + local.get 6 + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.tee 15 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 9 + local.get 13 + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 8 + i32.add + local.get 1 + local.get 6 + i32.const 1 + i32.add + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.tee 10 + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 7 + i32.add + local.get 15 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 12 + i32.add + i32.const 2 + i32.lt_u + br_if 1 (;@4;) + local.get 9 + local.get 13 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + local.tee 13 + local.get 8 + local.get 14 + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + local.tee 14 + i32.add + local.get 12 + local.get 10 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + local.tee 11 + i32.add + local.get 7 + local.get 10 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + local.tee 10 + i32.add + local.get 14 + local.get 12 + i32.and + local.get 13 + local.get 8 + i32.and + i32.add + local.get 11 + local.get 7 + i32.and + i32.add + local.get 10 + local.get 9 + i32.and + i32.add + i32.sub + i32.const 1 + i32.gt_s + br_if 1 (;@4;) + local.get 15 + i32.const 100 + i32.store8 + local.get 3 + i32.const 6 + local.get 3 + i32.const 6 + i32.gt_s + select + i32.const -2 + i32.add + local.set 3 + local.get 6 + i32.const 5 + local.get 6 + i32.const 5 + i32.gt_s + select + i32.const -1 + i32.add + local.set 6 + br 1 (;@4;) + end + block ;; label = @5 + local.get 13 + i32.const 1 + i32.add + i32.load8_u + local.tee 11 + i32.const 8 + i32.lt_u + local.tee 9 + local.get 14 + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 14 + i32.add + local.get 1 + local.get 6 + i32.const 1 + i32.add + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.tee 15 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 10 + i32.add + local.get 15 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 12 + i32.add + i32.const 2 + i32.ne + br_if 0 (;@5;) + local.get 12 + local.get 14 + i32.or + local.get 10 + local.get 9 + i32.or + i32.and + i32.eqz + br_if 0 (;@5;) + local.get 0 + local.get 8 + i32.add + i32.load8_u + local.set 10 + local.get 11 + i32.const 7 + i32.gt_u + local.set 8 + block ;; label = @6 + block ;; label = @7 + local.get 14 + br_if 0 (;@7;) + local.get 8 + local.set 14 + local.get 9 + local.set 12 + br 1 (;@6;) + end + local.get 9 + local.set 14 + i32.const 0 + local.get 8 + i32.sub + local.set 9 + local.get 8 + local.set 12 + i32.const -1 + i32.const 0 + local.get 11 + i32.const 8 + i32.lt_u + select + local.set 8 + end + local.get 0 + local.get 9 + local.get 3 + i32.add + local.get 8 + local.get 6 + i32.add + local.get 2 + i32.mul + i32.add + local.tee 11 + i32.add + i32.load8_s + f32.convert_i32_s + local.get 10 + i32.extend8_s + f32.convert_i32_s + f32.div + f64.promote_f32 + f64.const 0x1.6666666666666p-1 (;=0.7;) + f64.gt + i32.eqz + br_if 1 (;@4;) + block ;; label = @6 + block ;; label = @7 + local.get 14 + i32.eqz + br_if 0 (;@7;) + local.get 1 + local.get 8 + i32.const 1 + i32.shl + local.get 6 + i32.add + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.tee 14 + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@7;) + local.get 14 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 0 (;@7;) + local.get 14 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.ge_u + br_if 1 (;@6;) + end + local.get 12 + i32.eqz + br_if 2 (;@4;) + local.get 1 + local.get 7 + i32.add + local.get 3 + i32.add + local.get 9 + i32.const 1 + i32.shl + local.tee 14 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 2 (;@4;) + local.get 15 + local.get 14 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 2 (;@4;) + local.get 13 + local.get 14 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + br_if 2 (;@4;) + end + local.get 1 + local.get 7 + i32.add + local.get 3 + i32.add + i32.const 100 + i32.store8 + local.get 1 + local.get 11 + i32.add + i32.const 3 + i32.store8 + br 1 (;@4;) + end + local.get 1 + local.get 7 + i32.add + local.get 3 + i32.add + local.tee 14 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 10 + local.get 13 + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 9 + i32.add + local.get 15 + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 7 + i32.add + local.get 14 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.tee 8 + i32.add + i32.const 2 + i32.ne + br_if 0 (;@4;) + local.get 8 + local.get 10 + i32.or + local.get 7 + local.get 9 + i32.or + i32.and + i32.eqz + br_if 0 (;@4;) + block ;; label = @5 + local.get 9 + local.get 1 + local.get 6 + i32.const -2 + i32.add + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.tee 12 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.get 12 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + i32.and + br_if 0 (;@5;) + local.get 8 + local.get 13 + i32.const -2 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.get 15 + i32.const -2 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + i32.and + br_if 0 (;@5;) + local.get 10 + local.get 13 + i32.const 2 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.get 15 + i32.const 2 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + i32.and + br_if 0 (;@5;) + local.get 7 + local.get 1 + local.get 6 + i32.const 2 + i32.add + local.get 2 + i32.mul + i32.add + local.get 3 + i32.add + local.tee 13 + i32.const -1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + local.get 13 + i32.const 1 + i32.add + i32.load8_u + i32.const 8 + i32.lt_u + i32.or + i32.and + i32.eqz + br_if 1 (;@4;) + end + local.get 14 + i32.const 100 + i32.store8 + local.get 3 + i32.const 6 + local.get 3 + i32.const 6 + i32.gt_s + select + i32.const -2 + i32.add + local.set 3 + local.get 6 + i32.const 5 + local.get 6 + i32.const 5 + i32.gt_s + select + i32.const -1 + i32.add + local.set 6 + end + local.get 3 + i32.const 1 + i32.add + local.tee 3 + local.get 5 + i32.lt_s + br_if 0 (;@3;) + end + local.get 6 + i32.const 1 + i32.add + local.tee 6 + local.get 4 + i32.lt_s + br_if 0 (;@2;) + end + end) + (func $susan_edges (type 8) (param i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 f32) + local.get 1 + i32.const 0 + local.get 6 + local.get 5 + i32.mul + call $susan_wccmemset + i32.const 89 + i32.const 89 + call $__pragma_loopbound + block ;; label = @1 + local.get 6 + i32.const 6 + i32.gt_s + br_if 0 (;@1;) + i32.const 87 + i32.const 87 + call $__pragma_loopbound + return + end + block ;; label = @1 + block ;; label = @2 + local.get 5 + i32.const 6 + i32.gt_s + br_if 0 (;@2;) + local.get 6 + i32.const -6 + i32.add + local.set 7 + loop ;; label = @3 + i32.const 70 + i32.const 70 + call $__pragma_loopbound + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 6 + i32.const -3 + i32.add + local.set 8 + local.get 5 + i32.const -6 + i32.add + local.set 9 + local.get 0 + local.get 5 + i32.add + local.set 10 + local.get 0 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 11 + local.get 0 + local.get 5 + i32.const 3 + i32.mul + local.tee 7 + i32.add + local.set 12 + local.get 0 + local.get 5 + i32.const 1 + i32.shl + i32.add + local.set 13 + local.get 0 + local.get 5 + i32.const 5 + i32.mul + i32.add + local.set 14 + local.get 0 + local.get 5 + i32.const 6 + i32.mul + i32.add + local.set 15 + local.get 7 + local.get 1 + i32.add + i32.const 3 + i32.add + local.set 16 + local.get 0 + local.set 17 + i32.const 3 + local.set 18 + loop ;; label = @2 + i32.const 70 + i32.const 70 + call $__pragma_loopbound + i32.const 0 + local.set 19 + loop ;; label = @3 + block ;; label = @4 + local.get 4 + local.get 3 + local.get 12 + local.get 19 + i32.add + local.tee 20 + i32.const 3 + i32.add + i32.load8_u + i32.add + local.tee 7 + local.get 17 + local.get 19 + i32.add + local.tee 21 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.get 7 + local.get 21 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 10 + local.get 19 + i32.add + local.tee 21 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 13 + local.get 19 + i32.add + local.tee 21 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 21 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 11 + local.get 19 + i32.add + local.tee 20 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 14 + local.get 19 + i32.add + local.tee 20 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 15 + local.get 19 + i32.add + local.tee 20 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 100 + i32.add + local.tee 7 + i32.lt_s + br_if 0 (;@4;) + local.get 16 + local.get 19 + i32.add + local.get 4 + local.get 7 + i32.sub + i32.store8 + end + local.get 9 + local.get 19 + i32.const 1 + i32.add + local.tee 19 + i32.ne + br_if 0 (;@3;) + end + local.get 11 + local.get 5 + i32.add + local.set 11 + local.get 12 + local.get 5 + i32.add + local.set 12 + local.get 13 + local.get 5 + i32.add + local.set 13 + local.get 14 + local.get 5 + i32.add + local.set 14 + local.get 15 + local.get 5 + i32.add + local.set 15 + local.get 10 + local.get 5 + i32.add + local.set 10 + local.get 17 + local.get 5 + i32.add + local.set 17 + local.get 16 + local.get 5 + i32.add + local.set 16 + local.get 18 + i32.const 1 + i32.add + local.tee 18 + local.get 8 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 87 + i32.const 87 + call $__pragma_loopbound + block ;; label = @1 + local.get 6 + i32.const 9 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 5 + i32.const 8 + i32.gt_s + br_if 0 (;@2;) + local.get 6 + i32.const -8 + i32.add + local.set 7 + loop ;; label = @3 + i32.const 68 + i32.const 68 + call $__pragma_loopbound + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 6 + i32.const -4 + i32.add + local.set 22 + local.get 5 + i32.const -6 + i32.add + local.set 9 + local.get 5 + i32.const -5 + i32.add + local.set 11 + local.get 5 + i32.const -3 + i32.add + local.set 14 + i32.const 4 + local.set 16 + loop ;; label = @2 + i32.const 68 + i32.const 68 + call $__pragma_loopbound + local.get 16 + local.get 5 + i32.mul + local.set 8 + local.get 0 + local.get 16 + i32.const -3 + i32.add + local.get 5 + i32.mul + i32.add + local.set 23 + i32.const 4 + local.set 7 + loop ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 7 + local.tee 21 + local.get 8 + i32.add + local.tee 12 + i32.add + i32.load8_s + local.tee 10 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 3 + local.get 0 + local.get 12 + i32.add + i32.load8_u + i32.add + local.set 7 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 4 + local.get 10 + i32.sub + local.tee 15 + i32.const 601 + i32.lt_s + br_if 0 (;@7;) + block ;; label = @8 + block ;; label = @9 + local.get 7 + local.get 23 + local.get 21 + i32.add + local.tee 13 + i32.const 1 + i32.add + local.tee 24 + local.get 5 + i32.add + local.tee 17 + i32.const 1 + i32.add + local.tee 20 + local.get 5 + i32.add + local.tee 18 + i32.const 1 + i32.add + local.tee 25 + local.get 5 + i32.add + local.tee 6 + local.get 9 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 26 + local.get 7 + local.get 20 + local.get 11 + i32.add + local.tee 20 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 27 + local.get 7 + local.get 20 + i32.load8_u + i32.sub + i32.load8_u + local.tee 28 + i32.add + local.get 7 + local.get 20 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.tee 29 + i32.add + local.get 7 + local.get 20 + i32.load8_u offset=3 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 20 + i32.load8_u offset=4 + i32.sub + i32.load8_u + local.tee 30 + i32.add + local.get 7 + local.get 18 + i32.load8_u + i32.sub + i32.load8_u + local.tee 31 + i32.add + local.get 7 + local.get 18 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 18 + i32.add + i32.sub + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 32 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.tee 33 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=3 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + local.tee 34 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=5 + i32.sub + i32.load8_u + local.tee 35 + i32.add + local.get 7 + local.get 6 + local.get 5 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 36 + i32.add + local.get 7 + local.get 19 + local.get 11 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + i32.const 1 + i32.shl + local.tee 37 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + i32.const 1 + i32.shl + local.tee 38 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 39 + local.get 7 + local.get 24 + local.get 14 + i32.add + local.tee 20 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 24 + local.get 7 + local.get 20 + i32.load8_u + i32.sub + i32.load8_u + local.tee 40 + i32.add + local.get 7 + local.get 20 + i32.load8_u offset=2 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 17 + i32.load8_u + i32.sub + i32.load8_u + local.tee 20 + i32.add + local.get 7 + local.get 17 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 41 + i32.add + i32.sub + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=3 + i32.sub + i32.load8_u + local.tee 42 + i32.add + i32.const 1 + i32.shl + i32.add + local.get 7 + local.get 19 + i32.const 4 + i32.add + local.get 14 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 43 + local.get 7 + local.get 13 + i32.load8_u + i32.sub + i32.load8_u + local.get 7 + local.get 13 + i32.const -1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 44 + i32.add + local.get 7 + local.get 13 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 13 + i32.add + i32.sub + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.tee 45 + i32.add + i32.const 3 + i32.mul + i32.add + local.tee 17 + local.get 17 + i32.mul + local.get 13 + local.get 20 + i32.add + local.get 30 + i32.add + local.get 7 + local.get 25 + local.get 9 + i32.add + local.tee 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + i32.add + local.get 34 + i32.add + local.get 44 + local.get 24 + i32.add + local.get 29 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + i32.add + local.get 33 + i32.add + local.get 37 + i32.add + local.get 39 + i32.add + i32.sub + local.get 18 + local.get 7 + local.get 6 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 28 + local.get 7 + local.get 19 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 26 + i32.add + i32.sub + local.get 36 + i32.add + i32.const 3 + i32.mul + i32.add + local.get 41 + local.get 31 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=5 + i32.sub + i32.load8_u + i32.add + local.get 40 + local.get 27 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.get 32 + i32.add + i32.sub + local.get 35 + i32.add + i32.const 1 + i32.shl + i32.add + local.get 42 + i32.add + local.get 38 + i32.add + local.get 43 + i32.sub + local.get 45 + i32.add + local.tee 13 + local.get 13 + i32.mul + i32.add + local.tee 19 + br_if 0 (;@9;) + f32.const 0x0p+0 (;=0;) + local.set 46 + br 1 (;@8;) + end + i32.const 19 + local.set 20 + i32.const 19 + i32.const 19 + call $__pragma_loopbound + local.get 19 + f32.convert_i32_u + local.tee 47 + f32.const 0x1.4p+3 (;=10;) + f32.div + local.set 46 + i32.const 0 + local.set 19 + loop ;; label = @9 + block ;; label = @10 + block ;; label = @11 + local.get 19 + br_if 0 (;@11;) + i32.const 0 + local.set 19 + local.get 47 + local.get 46 + local.get 47 + local.get 46 + local.get 46 + f32.mul + f32.sub + local.get 46 + local.get 46 + f32.add + f32.div + f32.add + local.tee 46 + local.get 46 + f32.mul + f32.sub + call $susan___fabsf + f32.const 0x1.4f8b58p-17 (;=1e-05;) + f32.le + i32.eqz + br_if 1 (;@10;) + end + i32.const 1 + local.set 19 + end + local.get 20 + i32.const -1 + i32.add + local.tee 20 + br_if 0 (;@9;) + end + end + local.get 15 + f32.convert_i32_u + f64.promote_f32 + f64.const 0x1.ccccccccccccdp-1 (;=0.9;) + f64.mul + local.get 46 + f64.promote_f32 + f64.lt + br_if 1 (;@6;) + end + i32.const 1 + local.set 13 + block ;; label = @7 + block ;; label = @8 + local.get 7 + local.get 23 + local.get 21 + i32.add + local.tee 20 + i32.const 1 + i32.add + local.tee 19 + local.get 5 + i32.add + local.tee 15 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.const 2 + i32.shl + local.tee 6 + local.get 7 + local.get 19 + local.get 14 + i32.add + local.tee 17 + i32.load8_u + i32.sub + i32.load8_u + i32.const 2 + i32.shl + local.tee 24 + i32.add + local.get 7 + local.get 15 + i32.const 1 + i32.add + local.tee 18 + local.get 11 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 25 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 26 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.tee 27 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=3 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + local.tee 28 + i32.add + local.get 7 + local.get 18 + local.get 5 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 29 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 30 + i32.add + local.get 7 + local.get 19 + i32.const 1 + i32.add + local.tee 44 + local.get 5 + i32.add + local.tee 18 + local.get 9 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 31 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 32 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.tee 33 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=3 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + local.tee 34 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=5 + i32.sub + i32.load8_u + local.tee 35 + i32.add + local.get 7 + local.get 18 + local.get 5 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 36 + i32.add + local.get 7 + local.get 19 + local.get 11 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + i32.const 2 + i32.shl + local.tee 37 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + i32.const 2 + i32.shl + local.tee 38 + i32.add + local.get 7 + local.get 17 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.get 7 + local.get 17 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 17 + i32.add + local.get 7 + local.get 15 + i32.load8_u + i32.sub + i32.load8_u + local.tee 15 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 39 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=3 + i32.sub + i32.load8_u + local.tee 40 + i32.add + i32.const 2 + i32.shl + i32.add + local.get 7 + local.get 20 + i32.load8_u + i32.sub + i32.load8_u + local.get 7 + local.get 20 + i32.const -1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 41 + i32.add + local.get 7 + local.get 20 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 20 + i32.add + local.get 7 + local.get 19 + i32.const 4 + i32.add + local.get 14 + i32.add + local.tee 19 + i32.load8_u + i32.sub + i32.load8_u + local.tee 42 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + local.tee 43 + i32.add + i32.const 9 + i32.mul + i32.add + local.tee 45 + br_if 0 (;@8;) + i32.const 0 + local.set 7 + br 1 (;@7;) + end + block ;; label = @8 + local.get 20 + local.get 41 + i32.add + local.get 24 + i32.add + local.get 17 + i32.add + local.get 15 + i32.add + local.get 6 + i32.add + local.get 27 + i32.add + local.get 28 + i32.add + local.get 33 + i32.add + local.get 34 + i32.add + local.get 37 + i32.add + local.get 39 + i32.add + local.get 40 + i32.add + local.get 38 + i32.add + local.get 42 + i32.add + local.get 43 + i32.add + local.get 7 + local.get 44 + local.get 9 + i32.add + local.tee 19 + i32.load8_u offset=2 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=4 + i32.sub + i32.load8_u + i32.add + local.get 29 + local.get 26 + i32.add + local.get 32 + i32.add + local.get 35 + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 19 + i32.load8_u offset=5 + i32.sub + i32.load8_u + i32.add + i32.const 2 + i32.shl + i32.add + local.get 30 + local.get 25 + i32.add + local.get 31 + i32.add + local.get 36 + i32.add + local.get 7 + local.get 19 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 18 + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 9 + i32.mul + i32.add + f32.convert_i32_u + local.get 45 + f32.convert_i32_u + f32.div + local.tee 46 + f32.const 0x1p-1 (;=0.5;) + f32.lt + i32.eqz + br_if 0 (;@8;) + i32.const 1 + local.set 7 + i32.const 0 + local.set 13 + br 1 (;@7;) + end + block ;; label = @8 + local.get 46 + f32.const 0x1p+1 (;=2;) + f32.gt + i32.eqz + br_if 0 (;@8;) + i32.const 0 + local.set 7 + i32.const 1 + local.set 13 + br 1 (;@7;) + end + i32.const 1 + local.set 7 + i32.const 1 + i32.const -1 + local.get 24 + local.get 27 + i32.add + local.get 34 + i32.add + local.get 6 + local.get 28 + i32.add + local.get 33 + i32.add + local.get 37 + i32.add + i32.sub + local.get 38 + i32.add + local.get 17 + local.get 26 + i32.add + local.get 35 + i32.add + local.get 15 + local.get 29 + i32.add + local.get 32 + i32.add + local.get 39 + i32.add + i32.sub + local.get 40 + i32.add + i32.const 1 + i32.shl + i32.add + local.get 41 + local.get 25 + i32.add + local.get 36 + i32.add + local.get 20 + local.get 30 + i32.add + local.get 31 + i32.add + local.get 42 + i32.add + i32.sub + local.get 43 + i32.add + i32.const 3 + i32.mul + i32.add + i32.const 1 + i32.lt_s + select + local.set 13 + end + local.get 10 + local.get 1 + local.get 13 + local.get 16 + i32.add + local.get 5 + i32.mul + i32.add + local.get 21 + i32.add + local.get 7 + i32.add + i32.load8_s + i32.le_s + br_if 2 (;@4;) + local.get 10 + local.get 1 + local.get 21 + local.get 7 + i32.sub + i32.add + local.get 16 + local.get 13 + i32.sub + local.get 5 + i32.mul + i32.add + i32.load8_s + i32.lt_s + br_if 2 (;@4;) + local.get 10 + local.get 1 + local.get 13 + i32.const 1 + i32.shl + local.tee 19 + local.get 16 + i32.add + local.get 5 + i32.mul + i32.add + local.get 21 + i32.add + local.get 7 + i32.const 1 + i32.shl + local.tee 7 + i32.add + i32.load8_s + i32.le_s + br_if 2 (;@4;) + local.get 10 + local.get 1 + local.get 21 + local.get 7 + i32.sub + i32.add + local.get 16 + local.get 19 + i32.sub + local.get 5 + i32.mul + i32.add + i32.load8_s + i32.lt_s + br_if 2 (;@4;) + i32.const 2 + local.set 7 + br 1 (;@5;) + end + block ;; label = @6 + block ;; label = @7 + local.get 13 + br_if 0 (;@7;) + f32.const 0x1.e848p+19 (;=1e+06;) + local.set 46 + br 1 (;@6;) + end + local.get 17 + f32.convert_i32_s + local.get 13 + f32.convert_i32_s + f32.div + local.set 46 + end + block ;; label = @6 + block ;; label = @7 + local.get 46 + f32.neg + local.get 46 + local.get 46 + f32.const 0x0p+0 (;=0;) + f32.lt + local.tee 19 + select + local.tee 46 + f32.const 0x1p-1 (;=0.5;) + f32.lt + i32.eqz + br_if 0 (;@7;) + i32.const 1 + local.set 7 + i32.const 0 + local.set 19 + br 1 (;@6;) + end + block ;; label = @7 + local.get 46 + f32.const 0x1p+1 (;=2;) + f32.gt + i32.eqz + br_if 0 (;@7;) + i32.const 0 + local.set 7 + i32.const 1 + local.set 19 + br 1 (;@6;) + end + i32.const 1 + local.set 7 + i32.const -1 + i32.const 1 + local.get 19 + select + local.set 19 + end + local.get 10 + local.get 1 + local.get 19 + local.get 16 + i32.add + local.get 5 + i32.mul + i32.add + local.get 21 + i32.add + local.get 7 + i32.add + i32.load8_s + i32.le_s + br_if 1 (;@4;) + local.get 10 + local.get 1 + local.get 21 + local.get 7 + i32.sub + i32.add + local.get 16 + local.get 19 + i32.sub + local.get 5 + i32.mul + i32.add + i32.load8_s + i32.lt_s + br_if 1 (;@4;) + local.get 10 + local.get 1 + local.get 19 + i32.const 1 + i32.shl + local.tee 19 + local.get 16 + i32.add + local.get 5 + i32.mul + i32.add + local.get 21 + i32.add + local.get 7 + i32.const 1 + i32.shl + local.tee 7 + i32.add + i32.load8_s + i32.le_s + br_if 1 (;@4;) + local.get 10 + local.get 1 + local.get 21 + local.get 7 + i32.sub + i32.add + local.get 16 + local.get 19 + i32.sub + local.get 5 + i32.mul + i32.add + i32.load8_s + i32.lt_s + br_if 1 (;@4;) + i32.const 1 + local.set 7 + end + local.get 2 + local.get 12 + i32.add + local.get 7 + i32.store8 + end + local.get 21 + i32.const 1 + i32.add + local.set 7 + local.get 21 + local.get 11 + i32.ne + br_if 0 (;@3;) + end + local.get 16 + i32.const 1 + i32.add + local.tee 16 + local.get 22 + i32.ne + br_if 0 (;@2;) + end + end) + (func $susan_edges_small (type 8) (param i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 f32) + local.get 1 + i32.const 0 + local.get 6 + local.get 5 + i32.mul + call $susan_wccmemset + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @1 + local.get 6 + i32.const 2 + i32.gt_s + br_if 0 (;@1;) + i32.const 0 + i32.const 0 + call $__pragma_loopbound + return + end + block ;; label = @1 + block ;; label = @2 + local.get 5 + i32.const 2 + i32.gt_s + br_if 0 (;@2;) + local.get 6 + i32.const -2 + i32.add + local.set 7 + loop ;; label = @3 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 6 + i32.const -1 + i32.add + local.set 8 + local.get 0 + local.get 5 + i32.add + local.set 9 + local.get 5 + i32.const -2 + i32.add + local.set 10 + local.get 0 + local.get 5 + i32.const 1 + i32.shl + i32.add + local.set 11 + local.get 5 + local.get 1 + i32.add + i32.const 1 + i32.add + local.set 12 + local.get 0 + local.set 13 + i32.const 1 + local.set 14 + loop ;; label = @2 + i32.const 0 + local.set 15 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + loop ;; label = @3 + block ;; label = @4 + local.get 4 + local.get 3 + local.get 9 + local.get 15 + i32.add + local.tee 16 + i32.const 1 + i32.add + i32.load8_u + i32.add + local.tee 7 + local.get 13 + local.get 15 + i32.add + local.tee 17 + i32.load8_u + i32.sub + i32.load8_u + local.get 7 + local.get 17 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 17 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 16 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 16 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 11 + local.get 15 + i32.add + local.tee 16 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 16 + i32.const 1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 7 + local.get 16 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 100 + i32.add + local.tee 7 + i32.lt_s + br_if 0 (;@4;) + local.get 12 + local.get 15 + i32.add + local.get 4 + local.get 7 + i32.sub + i32.store8 + end + local.get 10 + local.get 15 + i32.const 1 + i32.add + local.tee 15 + i32.ne + br_if 0 (;@3;) + end + local.get 9 + local.get 5 + i32.add + local.set 9 + local.get 11 + local.get 5 + i32.add + local.set 11 + local.get 13 + local.get 5 + i32.add + local.set 13 + local.get 12 + local.get 5 + i32.add + local.set 12 + local.get 14 + i32.const 1 + i32.add + local.tee 14 + local.get 8 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @1 + local.get 6 + i32.const 5 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 5 + i32.const 4 + i32.gt_s + br_if 0 (;@2;) + local.get 6 + i32.const -4 + i32.add + local.set 7 + loop ;; label = @3 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 6 + i32.const -2 + i32.add + local.set 18 + local.get 5 + i32.const -2 + i32.add + local.set 11 + i32.const 2 + local.set 12 + loop ;; label = @2 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 12 + local.get 5 + i32.mul + local.set 14 + local.get 0 + local.get 12 + i32.const -1 + i32.add + local.get 5 + i32.mul + i32.add + local.set 6 + i32.const 2 + local.set 17 + loop ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 17 + local.get 14 + i32.add + local.tee 13 + i32.add + i32.load8_s + local.tee 9 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 3 + local.get 0 + local.get 13 + i32.add + i32.load8_u + i32.add + local.set 16 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 4 + local.get 9 + i32.sub + local.tee 10 + i32.const 251 + i32.lt_s + br_if 0 (;@7;) + block ;; label = @8 + block ;; label = @9 + local.get 16 + local.get 6 + local.get 17 + i32.add + local.tee 7 + i32.load8_u offset=1 + i32.sub + i32.load8_u + local.tee 19 + local.get 16 + local.get 7 + i32.const 1 + i32.add + local.tee 8 + local.get 5 + i32.add + local.tee 15 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 16 + local.get 7 + i32.const -1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 20 + local.get 16 + local.get 8 + local.get 11 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 16 + local.get 15 + local.get 11 + i32.add + local.tee 21 + i32.load8_u + i32.sub + i32.load8_u + local.tee 22 + i32.add + i32.sub + local.get 16 + local.get 15 + local.get 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 15 + i32.add + local.tee 8 + local.get 8 + i32.mul + local.get 22 + local.get 16 + local.get 7 + i32.load8_u + i32.sub + i32.load8_u + local.get 20 + i32.add + local.get 19 + i32.add + i32.sub + local.get 16 + local.get 21 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.get 15 + i32.add + local.tee 19 + local.get 19 + i32.mul + i32.add + local.tee 7 + br_if 0 (;@9;) + f32.const 0x0p+0 (;=0;) + local.set 23 + br 1 (;@8;) + end + i32.const 19 + local.set 15 + i32.const 19 + i32.const 19 + call $__pragma_loopbound + local.get 7 + f32.convert_i32_u + local.tee 24 + f32.const 0x1.4p+3 (;=10;) + f32.div + local.set 23 + i32.const 0 + local.set 7 + loop ;; label = @9 + block ;; label = @10 + block ;; label = @11 + local.get 7 + br_if 0 (;@11;) + i32.const 0 + local.set 7 + local.get 24 + local.get 23 + local.get 24 + local.get 23 + local.get 23 + f32.mul + f32.sub + local.get 23 + local.get 23 + f32.add + f32.div + f32.add + local.tee 23 + local.get 23 + f32.mul + f32.sub + call $susan___fabsf + f32.const 0x1.4f8b58p-17 (;=1e-05;) + f32.le + i32.eqz + br_if 1 (;@10;) + end + i32.const 1 + local.set 7 + end + local.get 15 + i32.const -1 + i32.add + local.tee 15 + br_if 0 (;@9;) + end + end + local.get 10 + f32.convert_i32_u + f64.promote_f32 + f64.const 0x1.999999999999ap-2 (;=0.4;) + f64.mul + local.get 23 + f64.promote_f32 + f64.lt + br_if 1 (;@6;) + end + i32.const 1 + local.set 15 + block ;; label = @7 + block ;; label = @8 + local.get 16 + local.get 6 + local.get 17 + i32.add + local.tee 7 + i32.const 1 + i32.add + local.tee 19 + local.get 5 + i32.add + local.tee 10 + local.get 11 + i32.add + local.tee 8 + i32.load8_u + i32.sub + i32.load8_u + local.get 16 + local.get 7 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.tee 21 + local.get 16 + local.get 7 + i32.const -1 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 22 + i32.add + local.tee 20 + local.get 16 + local.get 7 + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 16 + local.get 8 + i32.load8_u offset=1 + i32.sub + i32.load8_u + i32.add + local.get 16 + local.get 10 + local.get 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 8 + i32.add + local.tee 7 + br_if 0 (;@8;) + i32.const 0 + local.set 7 + br 1 (;@7;) + end + block ;; label = @8 + local.get 20 + local.get 8 + i32.add + local.get 16 + local.get 19 + local.get 11 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 16 + local.get 10 + i32.load8_u + i32.sub + i32.load8_u + i32.add + f32.convert_i32_u + local.get 7 + f32.convert_i32_u + f32.div + local.tee 23 + f32.const 0x1p-1 (;=0.5;) + f32.lt + i32.eqz + br_if 0 (;@8;) + i32.const 1 + local.set 7 + i32.const 0 + local.set 15 + br 1 (;@7;) + end + block ;; label = @8 + local.get 23 + f32.const 0x1p+1 (;=2;) + f32.gt + i32.eqz + br_if 0 (;@8;) + i32.const 0 + local.set 7 + i32.const 1 + local.set 15 + br 1 (;@7;) + end + i32.const 1 + local.set 7 + i32.const -1 + i32.const 1 + local.get 8 + local.get 22 + i32.add + local.get 21 + i32.gt_u + select + local.set 15 + end + local.get 9 + local.get 1 + local.get 15 + local.get 12 + i32.add + local.get 5 + i32.mul + i32.add + local.get 17 + i32.add + local.get 7 + i32.add + i32.load8_s + i32.le_s + br_if 2 (;@4;) + local.get 9 + local.get 1 + local.get 17 + local.get 7 + i32.sub + i32.add + local.get 12 + local.get 15 + i32.sub + local.get 5 + i32.mul + i32.add + i32.load8_s + i32.lt_s + br_if 2 (;@4;) + i32.const 2 + local.set 7 + br 1 (;@5;) + end + block ;; label = @6 + block ;; label = @7 + local.get 8 + br_if 0 (;@7;) + f32.const 0x1.e848p+19 (;=1e+06;) + local.set 23 + br 1 (;@6;) + end + local.get 19 + f32.convert_i32_s + local.get 8 + f32.convert_i32_s + f32.div + local.set 23 + end + block ;; label = @6 + block ;; label = @7 + local.get 23 + f32.neg + local.get 23 + local.get 23 + f32.const 0x0p+0 (;=0;) + f32.lt + local.tee 15 + select + local.tee 23 + f32.const 0x1p-1 (;=0.5;) + f32.lt + i32.eqz + br_if 0 (;@7;) + i32.const 1 + local.set 7 + i32.const 0 + local.set 15 + br 1 (;@6;) + end + block ;; label = @7 + local.get 23 + f32.const 0x1p+1 (;=2;) + f32.gt + i32.eqz + br_if 0 (;@7;) + i32.const 0 + local.set 7 + i32.const 1 + local.set 15 + br 1 (;@6;) + end + i32.const 1 + local.set 7 + i32.const -1 + i32.const 1 + local.get 15 + select + local.set 15 + end + local.get 9 + local.get 1 + local.get 15 + local.get 12 + i32.add + local.get 5 + i32.mul + i32.add + local.get 17 + i32.add + local.get 7 + i32.add + i32.load8_s + i32.le_s + br_if 1 (;@4;) + local.get 9 + local.get 1 + local.get 17 + local.get 7 + i32.sub + i32.add + local.get 12 + local.get 15 + i32.sub + local.get 5 + i32.mul + i32.add + i32.load8_s + i32.lt_s + br_if 1 (;@4;) + i32.const 1 + local.set 7 + end + local.get 2 + local.get 13 + i32.add + local.get 7 + i32.store8 + end + local.get 17 + i32.const 1 + i32.add + local.tee 17 + local.get 11 + i32.ne + br_if 0 (;@3;) + end + local.get 12 + i32.const 1 + i32.add + local.tee 12 + local.get 18 + i32.ne + br_if 0 (;@2;) + end + end) + (func $susan_corners (type 8) (param i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 f32 f64 f32) + i32.const 0 + local.set 7 + local.get 1 + i32.const 0 + local.get 6 + local.get 5 + i32.mul + local.tee 8 + call $susan_wccmemset + local.get 8 + call $susan_wccmalloc + local.set 9 + local.get 8 + call $susan_wccmalloc + local.set 10 + i32.const 85 + i32.const 85 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 6 + i32.const 10 + i32.gt_s + br_if 0 (;@2;) + i32.const 85 + i32.const 85 + call $__pragma_loopbound + br 1 (;@1;) + end + local.get 6 + i32.const -5 + i32.add + local.set 11 + block ;; label = @2 + block ;; label = @3 + local.get 5 + i32.const 10 + i32.gt_s + br_if 0 (;@3;) + local.get 6 + i32.const -10 + i32.add + local.set 8 + loop ;; label = @4 + i32.const 66 + i32.const 66 + call $__pragma_loopbound + local.get 8 + i32.const -1 + i32.add + local.tee 8 + br_if 0 (;@4;) + br 2 (;@2;) + end + end + local.get 5 + i32.const -10 + i32.add + local.set 12 + local.get 0 + local.get 5 + i32.const 6 + i32.mul + i32.add + local.set 13 + local.get 0 + local.get 5 + i32.const 7 + i32.mul + i32.add + local.set 14 + local.get 0 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 15 + local.get 0 + local.get 5 + i32.const 3 + i32.shl + i32.add + local.set 16 + local.get 0 + local.get 5 + i32.const 3 + i32.mul + i32.add + local.set 17 + local.get 0 + local.get 5 + i32.const 1 + i32.shl + i32.add + local.set 18 + local.get 0 + local.get 5 + i32.const 5 + i32.mul + local.tee 8 + i32.add + local.set 19 + local.get 1 + local.get 8 + i32.const 5 + i32.add + local.tee 8 + i32.add + local.set 20 + local.get 9 + local.get 8 + i32.add + local.set 21 + local.get 10 + local.get 8 + i32.add + local.set 22 + i32.const 5 + local.set 23 + loop ;; label = @3 + i32.const 66 + i32.const 66 + call $__pragma_loopbound + i32.const 0 + local.set 24 + loop ;; label = @4 + block ;; label = @5 + local.get 2 + local.get 19 + local.get 24 + i32.add + local.tee 25 + i32.const 5 + i32.add + i32.load8_u + i32.add + local.tee 8 + local.get 18 + local.get 24 + i32.add + local.tee 26 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 27 + local.get 8 + local.get 26 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 8 + local.get 26 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 28 + i32.add + local.tee 29 + local.get 8 + local.get 17 + local.get 24 + i32.add + local.tee 26 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 30 + i32.add + local.get 8 + local.get 26 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 31 + i32.add + local.get 8 + local.get 26 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 32 + i32.add + local.get 8 + local.get 26 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 33 + i32.add + local.get 8 + local.get 26 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 34 + i32.add + local.get 8 + local.get 15 + local.get 24 + i32.add + local.tee 26 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 35 + i32.add + local.get 8 + local.get 26 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 36 + i32.add + local.get 8 + local.get 26 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 37 + i32.add + local.get 8 + local.get 26 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 38 + i32.add + local.get 8 + local.get 26 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 39 + i32.add + local.get 8 + local.get 26 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 40 + i32.add + local.get 8 + local.get 26 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 41 + i32.add + local.get 8 + local.get 25 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 42 + i32.add + local.get 8 + local.get 25 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 43 + i32.add + local.get 8 + local.get 25 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 44 + i32.add + i32.const 100 + i32.add + local.tee 26 + local.get 3 + i32.ge_s + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 25 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 45 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 25 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 46 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 25 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 25 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 13 + local.get 24 + i32.add + local.tee 47 + i32.const 2 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 48 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 47 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 49 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 47 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 50 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 47 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 51 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 47 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 52 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 47 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 53 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 47 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 47 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 14 + local.get 24 + i32.add + local.tee 54 + i32.const 3 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 55 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 54 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 56 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 54 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 57 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 54 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 58 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 54 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 54 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 16 + local.get 24 + i32.add + local.tee 59 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 60 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 26 + local.get 8 + local.get 59 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 61 + i32.add + local.tee 26 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 3 + local.get 26 + local.get 8 + local.get 59 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.tee 59 + i32.add + local.tee 26 + i32.le_u + br_if 0 (;@5;) + local.get 48 + local.get 36 + local.get 35 + i32.add + local.get 37 + i32.add + local.get 38 + i32.add + local.get 39 + i32.add + local.get 40 + i32.add + local.get 41 + i32.add + i32.sub + local.get 49 + i32.add + local.get 50 + i32.add + local.get 51 + i32.add + local.get 52 + i32.add + local.get 53 + i32.add + local.get 47 + i32.add + local.get 55 + i32.const 1 + i32.shl + local.tee 38 + i32.add + local.get 56 + local.get 31 + local.get 30 + i32.add + local.get 32 + i32.add + local.get 33 + i32.add + local.get 34 + i32.add + i32.sub + local.get 57 + i32.add + local.get 58 + i32.add + i32.const 1 + i32.shl + i32.add + local.get 54 + i32.const 1 + i32.shl + local.tee 32 + i32.add + local.get 60 + local.get 29 + i32.sub + local.get 61 + i32.add + local.get 59 + i32.add + i32.const 3 + i32.mul + i32.add + local.tee 29 + local.get 29 + i32.mul + local.tee 51 + local.get 28 + local.get 33 + i32.add + local.get 39 + i32.add + local.get 45 + i32.add + local.get 27 + local.get 31 + i32.add + local.get 37 + i32.add + local.get 44 + i32.add + local.get 50 + i32.add + i32.sub + local.get 52 + i32.add + local.get 34 + local.get 40 + i32.add + local.get 46 + i32.add + local.get 30 + local.get 36 + i32.add + local.get 43 + i32.add + local.get 49 + i32.add + i32.sub + local.get 53 + i32.add + i32.const 1 + i32.shl + i32.add + local.get 41 + local.get 25 + i32.add + local.get 35 + local.get 42 + i32.add + local.get 48 + i32.add + i32.sub + local.get 47 + i32.add + i32.const 3 + i32.mul + i32.add + local.get 38 + local.get 56 + i32.add + i32.sub + local.get 58 + i32.add + local.get 32 + i32.add + local.get 60 + i32.sub + local.get 59 + i32.add + local.tee 25 + local.get 25 + i32.mul + local.tee 30 + i32.add + local.get 26 + local.get 26 + i32.mul + i32.const 1 + i32.shr_u + i32.le_u + br_if 0 (;@5;) + block ;; label = @6 + block ;; label = @7 + local.get 51 + local.get 30 + i32.lt_u + br_if 0 (;@7;) + block ;; label = @8 + block ;; label = @9 + f64.const -0x1p-1 (;=-0.5;) + f64.const 0x1p-1 (;=0.5;) + local.get 25 + f32.convert_i32_s + local.get 29 + local.get 29 + i32.const 31 + i32.shr_s + local.tee 30 + i32.xor + local.get 30 + i32.sub + local.tee 30 + f32.convert_i32_u + f32.div + local.tee 62 + f32.const 0x0p+0 (;=0;) + f32.lt + select + local.get 62 + f64.promote_f32 + f64.add + local.tee 63 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@9;) + local.get 63 + i32.trunc_f64_s + local.set 31 + br 1 (;@8;) + end + i32.const -2147483648 + local.set 31 + end + local.get 8 + local.get 0 + local.get 24 + local.get 31 + local.get 5 + local.get 23 + local.get 30 + i32.extend16_s + local.get 29 + i32.extend16_s + i32.div_s + i32.extend16_s + local.tee 33 + i32.add + i32.mul + i32.add + i32.add + i32.add + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.set 31 + block ;; label = @8 + block ;; label = @9 + f64.const -0x1p-1 (;=-0.5;) + f64.const 0x1p-1 (;=0.5;) + local.get 62 + local.get 62 + f32.add + local.tee 64 + f32.const 0x0p+0 (;=0;) + f32.lt + select + local.get 64 + f64.promote_f32 + f64.add + local.tee 63 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@9;) + local.get 63 + i32.trunc_f64_s + local.set 30 + br 1 (;@8;) + end + i32.const -2147483648 + local.set 30 + end + local.get 8 + local.get 0 + local.get 24 + local.get 30 + local.get 5 + local.get 23 + local.get 33 + i32.const 1 + i32.shl + i32.add + i32.mul + i32.add + i32.add + i32.add + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.set 34 + block ;; label = @8 + block ;; label = @9 + f64.const -0x1p-1 (;=-0.5;) + f64.const 0x1p-1 (;=0.5;) + local.get 62 + f32.const 0x1.8p+1 (;=3;) + f32.mul + local.tee 62 + f32.const 0x0p+0 (;=0;) + f32.lt + select + local.get 62 + f64.promote_f32 + f64.add + local.tee 63 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@9;) + local.get 63 + i32.trunc_f64_s + local.set 30 + br 1 (;@8;) + end + i32.const -2147483648 + local.set 30 + end + local.get 34 + local.get 31 + i32.add + local.set 31 + local.get 33 + i32.const 3 + i32.mul + local.get 23 + i32.add + local.set 33 + br 1 (;@6;) + end + block ;; label = @7 + block ;; label = @8 + f64.const -0x1p-1 (;=-0.5;) + f64.const 0x1p-1 (;=0.5;) + local.get 29 + f32.convert_i32_s + local.get 25 + local.get 25 + i32.const 31 + i32.shr_s + local.tee 30 + i32.xor + local.get 30 + i32.sub + local.tee 30 + f32.convert_i32_u + f32.div + local.tee 62 + f32.const 0x0p+0 (;=0;) + f32.lt + select + local.get 62 + f64.promote_f32 + f64.add + local.tee 63 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@8;) + local.get 63 + i32.trunc_f64_s + local.set 31 + br 1 (;@7;) + end + i32.const -2147483648 + local.set 31 + end + local.get 8 + local.get 0 + local.get 24 + local.get 5 + local.get 23 + local.get 31 + i32.add + i32.mul + local.get 30 + i32.extend16_s + local.get 25 + i32.extend16_s + i32.div_s + i32.extend16_s + local.tee 30 + i32.add + i32.add + i32.add + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.set 31 + block ;; label = @7 + block ;; label = @8 + f64.const -0x1p-1 (;=-0.5;) + f64.const 0x1p-1 (;=0.5;) + local.get 62 + local.get 62 + f32.add + local.tee 64 + f32.const 0x0p+0 (;=0;) + f32.lt + select + local.get 64 + f64.promote_f32 + f64.add + local.tee 63 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@8;) + local.get 63 + i32.trunc_f64_s + local.set 33 + br 1 (;@7;) + end + i32.const -2147483648 + local.set 33 + end + local.get 8 + local.get 0 + local.get 24 + local.get 5 + local.get 23 + local.get 33 + i32.add + i32.mul + local.get 30 + i32.const 1 + i32.shl + i32.add + i32.add + i32.add + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.set 33 + block ;; label = @7 + block ;; label = @8 + f64.const -0x1p-1 (;=-0.5;) + f64.const 0x1p-1 (;=0.5;) + local.get 62 + f32.const 0x1.8p+1 (;=3;) + f32.mul + local.tee 62 + f32.const 0x0p+0 (;=0;) + f32.lt + select + local.get 62 + f64.promote_f32 + f64.add + local.tee 63 + f64.abs + f64.const 0x1p+31 (;=2.14748e+09;) + f64.lt + i32.eqz + br_if 0 (;@8;) + local.get 63 + i32.trunc_f64_s + local.set 34 + br 1 (;@7;) + end + i32.const -2147483648 + local.set 34 + end + local.get 33 + local.get 31 + i32.add + local.set 31 + local.get 23 + local.get 34 + i32.add + local.set 33 + local.get 30 + i32.const 3 + i32.mul + local.set 30 + end + local.get 31 + local.get 8 + local.get 0 + local.get 24 + local.get 30 + local.get 33 + local.get 5 + i32.mul + i32.add + i32.add + i32.add + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 291 + i32.lt_u + br_if 0 (;@5;) + local.get 20 + local.get 24 + i32.add + local.get 3 + local.get 26 + i32.sub + i32.store8 + local.get 21 + local.get 24 + i32.add + local.get 25 + i32.const 51 + i32.mul + local.get 26 + i32.div_s + i32.store8 + local.get 22 + local.get 24 + i32.add + local.get 29 + i32.const 51 + i32.mul + local.get 26 + i32.div_s + i32.store8 + end + local.get 12 + local.get 24 + i32.const 1 + i32.add + local.tee 24 + i32.ne + br_if 0 (;@4;) + end + local.get 13 + local.get 5 + i32.add + local.set 13 + local.get 14 + local.get 5 + i32.add + local.set 14 + local.get 15 + local.get 5 + i32.add + local.set 15 + local.get 16 + local.get 5 + i32.add + local.set 16 + local.get 17 + local.get 5 + i32.add + local.set 17 + local.get 18 + local.get 5 + i32.add + local.set 18 + local.get 19 + local.get 5 + i32.add + local.set 19 + local.get 20 + local.get 5 + i32.add + local.set 20 + local.get 21 + local.get 5 + i32.add + local.set 21 + local.get 22 + local.get 5 + i32.add + local.set 22 + local.get 23 + i32.const 1 + i32.add + local.tee 23 + local.get 11 + i32.ne + br_if 0 (;@3;) + end + end + i32.const 85 + i32.const 85 + call $__pragma_loopbound + local.get 6 + i32.const 11 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 5 + i32.const 10 + i32.gt_s + br_if 0 (;@2;) + local.get 6 + i32.const -10 + i32.add + local.set 8 + loop ;; label = @3 + i32.const 66 + i32.const 66 + call $__pragma_loopbound + local.get 8 + i32.const -1 + i32.add + local.tee 8 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 0 + local.get 5 + i32.sub + local.set 3 + local.get 1 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 2 + local.get 1 + local.get 5 + i32.const 3 + i32.mul + i32.add + local.set 19 + local.get 1 + local.get 5 + i32.const 6 + i32.mul + i32.add + local.set 12 + local.get 1 + local.get 5 + i32.const 1 + i32.shl + i32.add + local.set 17 + i32.const 5 + local.set 30 + local.get 0 + local.get 5 + i32.const 5 + i32.mul + local.tee 8 + i32.add + local.set 31 + local.get 1 + local.get 5 + i32.const 7 + i32.mul + i32.add + local.set 33 + local.get 10 + local.get 8 + i32.add + local.set 34 + local.get 9 + local.get 8 + i32.add + local.set 35 + local.get 1 + local.get 5 + i32.const 3 + i32.shl + i32.add + local.set 36 + local.get 1 + local.get 8 + i32.add + local.set 25 + i32.const 0 + local.set 7 + loop ;; label = @2 + i32.const 66 + i32.const 66 + call $__pragma_loopbound + local.get 30 + i32.const 1 + i32.add + local.set 18 + i32.const 5 + local.set 8 + loop ;; label = @3 + block ;; label = @4 + local.get 25 + local.get 8 + i32.add + local.tee 15 + i32.load8_s + local.tee 26 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 17 + local.get 8 + i32.add + local.tee 24 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 19 + local.get 8 + i32.add + local.tee 24 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 2 + local.get 8 + i32.add + local.tee 24 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 15 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 15 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 15 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 26 + local.get 15 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 15 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 15 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 12 + local.get 8 + i32.add + local.tee 24 + i32.const -3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 33 + local.get 8 + i32.add + local.tee 24 + i32.const -3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 36 + local.get 8 + i32.add + local.tee 24 + i32.const -3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const -1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 26 + local.get 24 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 4 + local.get 7 + i32.const 24 + i32.mul + i32.add + local.tee 26 + local.get 30 + i32.store offset=4 + local.get 26 + local.get 8 + i32.store + local.get 26 + i32.const 0 + i32.store offset=8 + local.get 26 + local.get 35 + local.get 8 + i32.add + i32.load8_s + i32.store offset=12 + local.get 26 + local.get 34 + local.get 8 + i32.add + i32.load8_s + i32.store offset=16 + local.get 26 + local.get 31 + local.get 8 + i32.add + i32.load8_u + i32.store offset=20 + local.get 7 + i32.const 1 + i32.add + local.set 7 + end + local.get 3 + local.get 8 + i32.const 1 + i32.add + local.tee 8 + i32.add + i32.const -5 + i32.ne + br_if 0 (;@3;) + end + local.get 2 + local.get 5 + i32.add + local.set 2 + local.get 19 + local.get 5 + i32.add + local.set 19 + local.get 12 + local.get 5 + i32.add + local.set 12 + local.get 17 + local.get 5 + i32.add + local.set 17 + local.get 31 + local.get 5 + i32.add + local.set 31 + local.get 33 + local.get 5 + i32.add + local.set 33 + local.get 34 + local.get 5 + i32.add + local.set 34 + local.get 35 + local.get 5 + i32.add + local.set 35 + local.get 36 + local.get 5 + i32.add + local.set 36 + local.get 25 + local.get 5 + i32.add + local.set 25 + local.get 18 + local.set 30 + local.get 18 + local.get 11 + i32.ne + br_if 0 (;@2;) + end + end + local.get 4 + local.get 7 + i32.const 24 + i32.mul + i32.add + i32.const 7 + i32.store offset=8) + (func $susan_corners_quick (type 8) (param i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 0 + local.set 7 + local.get 1 + i32.const 0 + local.get 6 + local.get 5 + i32.mul + call $susan_wccmemset + i32.const 0 + i32.const 0 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 6 + i32.const 14 + i32.gt_s + br_if 0 (;@2;) + i32.const 0 + i32.const 0 + call $__pragma_loopbound + br 1 (;@1;) + end + local.get 6 + i32.const -7 + i32.add + local.set 8 + block ;; label = @2 + block ;; label = @3 + local.get 5 + i32.const 14 + i32.gt_s + br_if 0 (;@3;) + local.get 6 + i32.const -14 + i32.add + local.set 9 + loop ;; label = @4 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 9 + i32.const -1 + i32.add + local.tee 9 + br_if 0 (;@4;) + br 2 (;@2;) + end + end + local.get 5 + i32.const -14 + i32.add + local.set 10 + local.get 0 + local.get 5 + i32.const 3 + i32.shl + i32.add + local.set 11 + local.get 0 + local.get 5 + i32.const 9 + i32.mul + i32.add + local.set 12 + local.get 0 + local.get 5 + i32.const 6 + i32.mul + i32.add + local.set 13 + local.get 0 + local.get 5 + i32.const 10 + i32.mul + i32.add + local.set 14 + local.get 0 + local.get 5 + i32.const 5 + i32.mul + i32.add + local.set 15 + local.get 0 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 16 + local.get 0 + local.get 5 + i32.const 7 + i32.mul + local.tee 9 + i32.add + local.set 17 + local.get 9 + local.get 1 + i32.add + i32.const 7 + i32.add + local.set 18 + i32.const 7 + local.set 19 + loop ;; label = @3 + i32.const 0 + local.set 20 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + loop ;; label = @4 + block ;; label = @5 + local.get 2 + local.get 17 + local.get 20 + i32.add + local.tee 21 + i32.const 7 + i32.add + i32.load8_u + i32.add + local.tee 9 + local.get 16 + local.get 20 + i32.add + local.tee 22 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + local.get 9 + local.get 22 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 15 + local.get 20 + i32.add + local.tee 22 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 9 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 13 + local.get 20 + i32.add + local.tee 22 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 9 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 22 + i32.const 10 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 21 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 21 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.get 9 + local.get 21 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + i32.const 100 + i32.add + local.tee 22 + local.get 3 + i32.ge_s + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 9 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 10 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 11 + local.get 20 + i32.add + local.tee 21 + i32.const 4 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 9 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 10 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 12 + local.get 20 + i32.add + local.tee 21 + i32.const 5 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 9 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 14 + local.get 20 + i32.add + local.tee 21 + i32.const 6 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 22 + local.get 9 + local.get 21 + i32.const 7 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 22 + local.get 3 + i32.ge_u + br_if 0 (;@5;) + local.get 3 + local.get 22 + local.get 9 + local.get 21 + i32.const 8 + i32.add + i32.load8_u + i32.sub + i32.load8_u + i32.add + local.tee 9 + i32.le_u + br_if 0 (;@5;) + local.get 18 + local.get 20 + i32.add + local.get 3 + local.get 9 + i32.sub + i32.store8 + end + local.get 10 + local.get 20 + i32.const 1 + i32.add + local.tee 20 + i32.ne + br_if 0 (;@4;) + end + local.get 11 + local.get 5 + i32.add + local.set 11 + local.get 12 + local.get 5 + i32.add + local.set 12 + local.get 13 + local.get 5 + i32.add + local.set 13 + local.get 14 + local.get 5 + i32.add + local.set 14 + local.get 15 + local.get 5 + i32.add + local.set 15 + local.get 16 + local.get 5 + i32.add + local.set 16 + local.get 17 + local.get 5 + i32.add + local.set 17 + local.get 18 + local.get 5 + i32.add + local.set 18 + local.get 19 + i32.const 1 + i32.add + local.tee 19 + local.get 8 + i32.ne + br_if 0 (;@3;) + end + end + i32.const 0 + local.set 7 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 6 + i32.const 15 + i32.lt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 5 + i32.const 14 + i32.gt_s + br_if 0 (;@2;) + local.get 6 + i32.const -14 + i32.add + local.set 9 + loop ;; label = @3 + i32.const 0 + local.set 7 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 9 + i32.const -1 + i32.add + local.tee 9 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 0 + local.get 5 + i32.sub + local.set 3 + local.get 1 + local.get 5 + i32.const 6 + i32.mul + local.tee 9 + i32.add + local.set 2 + local.get 0 + local.get 5 + i32.const 5 + i32.mul + local.tee 22 + i32.add + local.set 11 + local.get 0 + local.get 9 + i32.add + local.set 12 + local.get 1 + local.get 5 + i32.const 3 + i32.shl + local.tee 9 + i32.add + local.set 10 + local.get 1 + local.get 22 + i32.add + local.set 17 + local.get 0 + local.get 9 + i32.add + local.set 14 + local.get 1 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 15 + local.get 1 + local.get 5 + i32.const 9 + i32.mul + local.tee 9 + i32.add + local.set 18 + i32.const 7 + local.set 19 + local.get 0 + local.get 5 + i32.const 7 + i32.mul + local.tee 22 + i32.add + local.set 6 + local.get 0 + local.get 9 + i32.add + local.set 0 + local.get 1 + local.get 5 + i32.const 10 + i32.mul + i32.add + local.set 23 + local.get 1 + local.get 22 + i32.add + local.set 21 + i32.const 0 + local.set 7 + loop ;; label = @2 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 19 + i32.const 1 + i32.add + local.set 16 + i32.const 7 + local.set 9 + loop ;; label = @3 + block ;; label = @4 + local.get 21 + local.get 9 + i32.add + local.tee 13 + i32.load8_s + local.tee 22 + i32.const 1 + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 15 + local.get 9 + i32.add + local.tee 20 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 17 + local.get 9 + i32.add + local.tee 20 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 2 + local.get 9 + i32.add + local.tee 20 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 13 + i32.const -3 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 13 + i32.const -2 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 13 + i32.const -1 + i32.add + i32.load8_s + i32.le_s + br_if 0 (;@4;) + local.get 22 + local.get 13 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 13 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 13 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 10 + local.get 9 + i32.add + local.tee 20 + i32.const -3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 18 + local.get 9 + i32.add + local.tee 20 + i32.const -3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 23 + local.get 9 + i32.add + local.tee 20 + i32.const -3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const -1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 1 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 2 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 22 + local.get 20 + i32.const 3 + i32.add + i32.load8_s + i32.lt_s + br_if 0 (;@4;) + local.get 4 + local.get 7 + i32.const 24 + i32.mul + i32.add + local.tee 22 + local.get 19 + i32.store offset=4 + local.get 22 + local.get 9 + i32.store + local.get 22 + i32.const 0 + i32.store offset=8 + local.get 22 + local.get 11 + local.get 9 + i32.add + local.tee 20 + i32.const -1 + i32.add + local.tee 24 + i32.load8_u + local.get 20 + i32.const -2 + i32.add + local.tee 25 + i32.load8_u + i32.add + local.get 20 + i32.load8_u + i32.add + local.get 20 + i32.const 1 + i32.add + local.tee 26 + i32.load8_u + i32.add + local.get 20 + i32.const 2 + i32.add + local.tee 27 + i32.load8_u + i32.add + local.get 12 + local.get 9 + i32.add + local.tee 13 + i32.const -2 + i32.add + local.tee 28 + i32.load8_u + i32.add + local.get 13 + i32.const -1 + i32.add + local.tee 29 + i32.load8_u + i32.add + local.get 13 + i32.load8_u + i32.add + local.get 13 + i32.const 1 + i32.add + local.tee 30 + i32.load8_u + i32.add + local.get 13 + i32.const 2 + i32.add + local.tee 31 + i32.load8_u + i32.add + local.get 6 + local.get 9 + i32.add + local.tee 1 + i32.const -2 + i32.add + local.tee 32 + i32.load8_u + i32.add + local.get 1 + i32.const -1 + i32.add + local.tee 33 + i32.load8_u + i32.add + local.get 1 + i32.load8_u + i32.add + local.get 1 + i32.const 1 + i32.add + local.tee 34 + i32.load8_u + i32.add + local.get 1 + i32.const 2 + i32.add + local.tee 35 + i32.load8_u + i32.add + local.get 14 + local.get 9 + i32.add + local.tee 1 + i32.const -2 + i32.add + local.tee 36 + i32.load8_u + i32.add + local.get 1 + i32.const -1 + i32.add + local.tee 37 + i32.load8_u + i32.add + local.get 1 + i32.load8_u + i32.add + local.get 1 + i32.const 1 + i32.add + local.tee 38 + i32.load8_u + i32.add + local.get 1 + i32.const 2 + i32.add + local.tee 39 + i32.load8_u + i32.add + local.get 0 + local.get 9 + i32.add + local.tee 40 + i32.const -2 + i32.add + local.tee 41 + i32.load8_u + i32.add + local.get 40 + i32.const -1 + i32.add + local.tee 42 + i32.load8_u + i32.add + local.get 40 + i32.load8_u + i32.add + local.get 40 + i32.const 1 + i32.add + local.tee 43 + i32.load8_u + i32.add + local.get 40 + i32.const 2 + i32.add + local.tee 44 + i32.load8_u + i32.add + i32.const 65535 + i32.and + i32.const 25 + i32.div_u + i32.store offset=20 + local.get 33 + i32.load8_u + local.set 33 + local.get 34 + i32.load8_u + local.set 34 + local.get 35 + i32.load8_u + local.set 35 + local.get 32 + i32.load8_u + local.set 32 + local.get 22 + local.get 39 + i32.load8_u + local.tee 39 + local.get 36 + i32.load8_u + local.tee 36 + i32.add + local.get 38 + i32.load8_u + local.tee 38 + i32.add + local.get 31 + i32.load8_u + local.tee 31 + local.get 28 + i32.load8_u + local.tee 28 + i32.add + local.get 30 + i32.load8_u + local.tee 30 + i32.add + local.get 29 + i32.load8_u + local.tee 29 + i32.add + i32.sub + local.get 37 + i32.load8_u + local.tee 37 + i32.add + local.get 1 + i32.load8_u + i32.add + local.get 13 + i32.load8_u + i32.sub + local.get 44 + i32.load8_u + local.tee 13 + local.get 41 + i32.load8_u + local.tee 1 + i32.add + local.get 43 + i32.load8_u + local.tee 41 + i32.add + local.get 27 + i32.load8_u + local.tee 27 + local.get 25 + i32.load8_u + local.tee 25 + i32.add + local.get 26 + i32.load8_u + local.tee 26 + i32.add + local.get 24 + i32.load8_u + local.tee 24 + i32.add + i32.sub + local.get 42 + i32.load8_u + local.tee 42 + i32.add + local.get 40 + i32.load8_u + i32.add + local.get 20 + i32.load8_u + i32.sub + i32.const 1 + i32.shl + i32.add + i32.extend16_s + i32.const 15 + i32.div_s + i32.extend16_s + i32.store offset=16 + local.get 22 + local.get 41 + local.get 38 + local.get 34 + local.get 30 + local.get 26 + i32.add + local.get 13 + local.get 39 + local.get 35 + local.get 31 + local.get 27 + i32.add + i32.add + i32.add + i32.add + local.get 1 + local.get 36 + local.get 32 + local.get 25 + local.get 28 + i32.add + i32.add + i32.add + i32.add + i32.sub + i32.const 1 + i32.shl + i32.add + i32.add + i32.add + i32.add + local.get 42 + local.get 37 + local.get 33 + local.get 24 + local.get 29 + i32.add + i32.add + i32.add + i32.add + i32.sub + i32.extend16_s + i32.const 15 + i32.div_s + i32.extend16_s + i32.store offset=12 + local.get 7 + i32.const 1 + i32.add + local.set 7 + end + local.get 3 + local.get 9 + i32.const 1 + i32.add + local.tee 9 + i32.add + i32.const -7 + i32.ne + br_if 0 (;@3;) + end + local.get 2 + local.get 5 + i32.add + local.set 2 + local.get 11 + local.get 5 + i32.add + local.set 11 + local.get 12 + local.get 5 + i32.add + local.set 12 + local.get 10 + local.get 5 + i32.add + local.set 10 + local.get 17 + local.get 5 + i32.add + local.set 17 + local.get 14 + local.get 5 + i32.add + local.set 14 + local.get 15 + local.get 5 + i32.add + local.set 15 + local.get 18 + local.get 5 + i32.add + local.set 18 + local.get 6 + local.get 5 + i32.add + local.set 6 + local.get 0 + local.get 5 + i32.add + local.set 0 + local.get 23 + local.get 5 + i32.add + local.set 23 + local.get 21 + local.get 5 + i32.add + local.set 21 + local.get 16 + local.set 19 + local.get 16 + local.get 8 + i32.ne + br_if 0 (;@2;) + end + end + local.get 4 + local.get 7 + i32.const 24 + i32.mul + i32.add + i32.const 7 + i32.store offset=8) + (func $susan_call_susan (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 f32 f32 i32 i32) + global.get $__stack_pointer + i32.const 360000 + i32.sub + local.tee 2 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.const 0 + call $susan_wccfseek + drop + local.get 0 + call $susan_wccfgetc + drop + local.get 0 + call $susan_wccfgetc + drop + local.get 0 + call $susan_getint + local.set 3 + local.get 0 + call $susan_getint + local.set 4 + local.get 0 + call $susan_getint + drop + local.get 4 + local.get 3 + i32.mul + local.tee 5 + call $susan_wccmalloc + local.tee 6 + i32.const 1 + local.get 5 + local.get 0 + call $susan_wccfread + drop + block ;; label = @1 + i32.const 0 + f32.load offset=8320 + f32.const 0x0p+0 (;=0;) + f32.lt + i32.eqz + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=8324 + end + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 1 + local.get 1 + i32.const 0 + i32.load offset=8328 + i32.const 1 + i32.eq + select + local.get 1 + select + br_table 0 (;@4;) 1 (;@3;) 2 (;@2;) 3 (;@1;) + end + i32.const 0 + i32.load offset=8332 + local.set 0 + i32.const 516 + call $susan_wccmalloc + local.set 7 + i32.const 513 + i32.const 513 + call $__pragma_loopbound + local.get 7 + i32.const 258 + i32.add + local.set 5 + local.get 0 + f32.convert_i32_s + local.set 8 + i32.const 2 + local.set 0 + loop ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 0 + i32.const -258 + i32.add + f32.convert_i32_s + local.get 8 + f32.div + local.tee 9 + local.get 9 + f32.mul + f32.const -0x1.7p+7 (;=-184;) + f32.mul + f32.const 0x1.fbc8p+13 (;=16249;) + f32.add + local.tee 9 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@6;) + local.get 9 + i32.trunc_f32_s + local.set 1 + br 1 (;@5;) + end + i32.const -2147483648 + local.set 1 + end + block ;; label = @5 + block ;; label = @6 + local.get 1 + i32.const 65535 + i32.and + f32.reinterpret_i32 + f32.const 0x1.9p+6 (;=100;) + f32.mul + local.tee 9 + f32.const 0x1p+32 (;=4.29497e+09;) + f32.lt + local.get 9 + f32.const 0x0p+0 (;=0;) + f32.ge + i32.and + i32.eqz + br_if 0 (;@6;) + local.get 9 + i32.trunc_f32_u + local.set 1 + br 1 (;@5;) + end + i32.const 0 + local.set 1 + end + local.get 7 + local.get 0 + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 515 + i32.ne + br_if 0 (;@4;) + end + i32.const 0 + i32.load offset=8324 + local.get 6 + i32.const 0 + f32.load offset=8320 + local.get 3 + local.get 4 + local.get 5 + call $susan_smoothing + br 2 (;@1;) + end + local.get 5 + call $susan_wccmalloc + local.set 10 + i32.const 0 + i32.load offset=8332 + local.set 0 + i32.const 516 + call $susan_wccmalloc + local.set 7 + i32.const 513 + i32.const 513 + call $__pragma_loopbound + local.get 7 + i32.const 258 + i32.add + local.set 11 + local.get 0 + f32.convert_i32_s + local.set 8 + i32.const 2 + local.set 0 + loop ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 0 + i32.const -258 + i32.add + f32.convert_i32_s + local.get 8 + f32.div + local.tee 9 + local.get 9 + f32.mul + local.tee 9 + local.get 9 + f32.mul + local.get 9 + f32.mul + f32.const -0x1.7p+7 (;=-184;) + f32.mul + f32.const 0x1.fbc8p+13 (;=16249;) + f32.add + local.tee 9 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@5;) + local.get 9 + i32.trunc_f32_s + local.set 1 + br 1 (;@4;) + end + i32.const -2147483648 + local.set 1 + end + block ;; label = @4 + block ;; label = @5 + local.get 1 + i32.const 65535 + i32.and + f32.reinterpret_i32 + f32.const 0x1.9p+6 (;=100;) + f32.mul + local.tee 9 + f32.const 0x1p+32 (;=4.29497e+09;) + f32.lt + local.get 9 + f32.const 0x0p+0 (;=0;) + f32.ge + i32.and + i32.eqz + br_if 0 (;@5;) + local.get 9 + i32.trunc_f32_u + local.set 1 + br 1 (;@4;) + end + i32.const 0 + local.set 1 + end + local.get 7 + local.get 0 + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 515 + i32.ne + br_if 0 (;@3;) + end + block ;; label = @3 + i32.const 0 + i32.load offset=8328 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=8336 + local.set 0 + block ;; label = @4 + i32.const 0 + i32.load offset=8324 + i32.eqz + br_if 0 (;@4;) + local.get 6 + local.get 10 + local.get 11 + local.get 0 + local.get 3 + local.get 4 + call $susan_principle_small + local.get 10 + local.get 6 + local.get 5 + call $susan_int_to_uchar + br 3 (;@1;) + end + local.get 6 + local.get 10 + local.get 11 + local.get 0 + local.get 3 + local.get 4 + call $susan_principle + local.get 10 + local.get 6 + local.get 5 + call $susan_int_to_uchar + br 2 (;@1;) + end + local.get 5 + call $susan_wccmalloc + local.tee 0 + i32.const 100 + local.get 5 + call $susan_wccmemset + i32.const 0 + i32.load offset=8336 + local.set 1 + block ;; label = @3 + block ;; label = @4 + i32.const 0 + i32.load offset=8324 + i32.eqz + br_if 0 (;@4;) + local.get 6 + local.get 10 + local.get 0 + local.get 11 + local.get 1 + local.get 3 + local.get 4 + call $susan_edges_small + br 1 (;@3;) + end + local.get 6 + local.get 10 + local.get 0 + local.get 11 + local.get 1 + local.get 3 + local.get 4 + call $susan_edges + end + block ;; label = @3 + i32.const 0 + i32.load offset=8340 + i32.eqz + br_if 0 (;@3;) + local.get 10 + local.get 0 + local.get 3 + local.get 4 + call $susan_thin + end + local.get 6 + local.get 0 + local.get 3 + local.get 4 + i32.const 0 + i32.load offset=8344 + call $susan_edge_draw + br 1 (;@1;) + end + local.get 5 + call $susan_wccmalloc + local.set 10 + i32.const 0 + i32.load offset=8332 + local.set 0 + i32.const 516 + call $susan_wccmalloc + local.set 7 + i32.const 513 + i32.const 513 + call $__pragma_loopbound + local.get 7 + i32.const 258 + i32.add + local.set 11 + local.get 0 + f32.convert_i32_s + local.set 8 + i32.const 2 + local.set 0 + loop ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + i32.const -258 + i32.add + f32.convert_i32_s + local.get 8 + f32.div + local.tee 9 + local.get 9 + f32.mul + local.tee 9 + local.get 9 + f32.mul + local.get 9 + f32.mul + f32.const -0x1.7p+7 (;=-184;) + f32.mul + f32.const 0x1.fbc8p+13 (;=16249;) + f32.add + local.tee 9 + f32.abs + f32.const 0x1p+31 (;=2.14748e+09;) + f32.lt + i32.eqz + br_if 0 (;@4;) + local.get 9 + i32.trunc_f32_s + local.set 1 + br 1 (;@3;) + end + i32.const -2147483648 + local.set 1 + end + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 65535 + i32.and + f32.reinterpret_i32 + f32.const 0x1.9p+6 (;=100;) + f32.mul + local.tee 9 + f32.const 0x1p+32 (;=4.29497e+09;) + f32.lt + local.get 9 + f32.const 0x0p+0 (;=0;) + f32.ge + i32.and + i32.eqz + br_if 0 (;@4;) + local.get 9 + i32.trunc_f32_u + local.set 1 + br 1 (;@3;) + end + i32.const 0 + local.set 1 + end + local.get 7 + local.get 0 + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.tee 0 + i32.const 515 + i32.ne + br_if 0 (;@2;) + end + block ;; label = @2 + i32.const 0 + i32.load offset=8328 + i32.eqz + br_if 0 (;@2;) + local.get 6 + local.get 10 + local.get 11 + i32.const 0 + i32.load offset=8348 + local.get 3 + local.get 4 + call $susan_principle + local.get 10 + local.get 6 + local.get 5 + call $susan_int_to_uchar + br 1 (;@1;) + end + i32.const 0 + i32.load offset=8348 + local.set 0 + block ;; label = @2 + block ;; label = @3 + i32.const 0 + i32.load offset=8352 + i32.eqz + br_if 0 (;@3;) + local.get 6 + local.get 10 + local.get 11 + local.get 0 + local.get 2 + local.get 3 + local.get 4 + call $susan_corners_quick + br 1 (;@2;) + end + local.get 6 + local.get 10 + local.get 11 + local.get 0 + local.get 2 + local.get 3 + local.get 4 + call $susan_corners + end + i32.const 0 + i32.load offset=8344 + local.set 0 + i32.const 0 + i32.const 0 + call $__pragma_loopbound + local.get 2 + i32.load offset=8 + i32.const 7 + i32.eq + br_if 0 (;@1;) + block ;; label = @2 + local.get 0 + i32.eqz + br_if 0 (;@2;) + local.get 2 + local.set 0 + loop ;; label = @3 + local.get 6 + local.get 0 + i32.const 4 + i32.add + i32.load + local.get 3 + i32.mul + i32.add + local.get 0 + i32.load + i32.add + i32.const 0 + i32.store8 + local.get 0 + i32.const 32 + i32.add + local.set 1 + local.get 0 + i32.const 24 + i32.add + local.set 0 + local.get 1 + i32.load + i32.const 7 + i32.ne + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 3 + i32.const -2 + i32.add + local.set 7 + local.get 2 + local.set 0 + loop ;; label = @2 + local.get 6 + local.get 0 + i32.const 4 + i32.add + i32.load + i32.const -1 + i32.add + local.get 3 + i32.mul + i32.add + local.get 0 + i32.load + i32.add + local.tee 1 + i32.const 255 + i32.store8 offset=1 + local.get 1 + i32.const -1 + i32.add + i32.const 65535 + i32.store16 align=1 + local.get 1 + i32.const 1 + i32.add + local.tee 5 + local.get 3 + i32.add + local.tee 1 + i32.const 255 + i32.store8 + local.get 5 + local.get 7 + i32.add + i32.const 255 + i32.store16 align=1 + local.get 1 + local.get 3 + i32.add + i32.const 255 + i32.store8 + local.get 1 + local.get 7 + i32.add + i32.const 65535 + i32.store16 align=1 + local.get 0 + i32.const 32 + i32.add + local.set 1 + local.get 0 + i32.const 24 + i32.add + local.set 0 + local.get 1 + i32.load + i32.const 7 + i32.ne + br_if 0 (;@2;) + end + end + i32.const 7220 + i32.const 7220 + call $__pragma_loopbound + local.get 2 + i32.const 360000 + i32.add + global.set $__stack_pointer) + (func $susan_main (type 1) + i32.const 8356 + i32.const 0 + call $susan_call_susan + call $susan_wccfreeall + i32.const 8356 + i32.const 1 + call $susan_call_susan + call $susan_wccfreeall + i32.const 8356 + i32.const 2 + call $susan_call_susan + call $susan_wccfreeall) + (func $__original_main (type 9) (result i32) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + i32.const 0 + i32.const 1024 + i32.store offset=8356 + local.get 0 + i32.const 0 + i32.store offset=12 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.const 7292 + i32.add + i32.store offset=8360 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.store offset=8364 + i32.const 0 + local.get 0 + i32.load offset=12 + f32.convert_i32_s + f32.const 0x1p+2 (;=4;) + f32.add + f32.store offset=8320 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.const 20 + i32.add + i32.store offset=8332 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.store offset=8328 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=8340 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.store offset=8324 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.store offset=8344 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.store offset=8352 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.const 50 + i32.add + i32.store offset=8348 + i32.const 0 + local.get 0 + i32.load offset=12 + i32.const 50 + i32.add + i32.store offset=8336 + call $susan_main + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + i32.const 0) + (func $susan_wccfread (type 10) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const -1 + local.set 4 + block ;; label = @1 + local.get 3 + i32.load offset=4 + local.tee 5 + local.get 3 + i32.load offset=8 + local.tee 6 + i32.eq + br_if 0 (;@1;) + i32.const 7220 + i32.const 7220 + call $__pragma_loopbound + block ;; label = @2 + local.get 6 + local.get 3 + i32.load offset=8 + local.get 5 + local.get 6 + i32.sub + local.tee 4 + local.get 2 + local.get 1 + i32.mul + local.tee 2 + local.get 4 + local.get 2 + i32.lt_u + select + local.tee 4 + i32.add + local.tee 2 + i32.ge_u + br_if 0 (;@2;) + loop ;; label = @3 + local.get 0 + local.get 3 + i32.load + local.get 6 + i32.add + i32.load8_u + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 6 + i32.const 1 + i32.add + local.tee 6 + local.get 3 + i32.load offset=8 + local.get 4 + i32.add + local.tee 2 + i32.lt_u + br_if 0 (;@3;) + end + end + local.get 3 + local.get 2 + i32.store offset=8 + end + local.get 4) + (func $susan_wccfgetc (type 2) (param i32) (result i32) + (local i32 i32) + i32.const -1 + local.set 1 + block ;; label = @1 + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.eq + br_if 0 (;@1;) + local.get 0 + local.get 2 + i32.const 1 + i32.add + i32.store offset=8 + local.get 0 + i32.load + local.get 2 + i32.add + i32.load8_s + local.set 1 + end + local.get 1) + (func $susan_wccfgets (type 11) (param i32 i32 i32) (result i32) + (local i32 i32) + i32.const 0 + local.set 3 + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + local.get 0 + i32.eqz + br_if 0 (;@1;) + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=4 + i32.eq + br_if 0 (;@1;) + i32.const 57 + i32.const 57 + call $__pragma_loopbound + i32.const 0 + local.set 3 + block ;; label = @2 + local.get 1 + i32.const 2 + i32.lt_u + br_if 0 (;@2;) + local.get 1 + i32.const -1 + i32.add + local.set 4 + local.get 2 + i32.load offset=8 + local.set 1 + i32.const 0 + local.set 3 + loop ;; label = @3 + local.get 1 + local.get 2 + i32.load offset=4 + i32.eq + br_if 1 (;@2;) + local.get 0 + local.get 3 + i32.add + local.get 2 + i32.load + local.get 1 + i32.add + i32.load8_u + local.tee 1 + i32.store8 + local.get 1 + i32.const 10 + i32.eq + br_if 1 (;@2;) + local.get 2 + local.get 2 + i32.load offset=8 + i32.const 1 + i32.add + local.tee 1 + i32.store offset=8 + local.get 4 + local.get 3 + i32.const 1 + i32.add + local.tee 3 + i32.ne + br_if 0 (;@3;) + end + local.get 4 + local.set 3 + end + local.get 0 + local.get 3 + i32.add + i32.const 0 + i32.store8 + local.get 0 + local.set 3 + end + local.get 3) + (func $susan_wccfseek (type 11) (param i32 i32 i32) (result i32) + (local i32) + i32.const -1 + local.set 3 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 2 + br_table 0 (;@5;) 1 (;@4;) 2 (;@3;) 4 (;@1;) + end + local.get 0 + local.get 1 + i32.store offset=8 + br 2 (;@2;) + end + local.get 0 + local.get 0 + i32.load offset=8 + local.get 1 + i32.add + i32.store offset=8 + br 1 (;@2;) + end + local.get 0 + local.get 0 + i32.load offset=4 + local.get 1 + i32.add + i32.store offset=8 + end + i32.const 0 + local.set 3 + end + local.get 3) + (func $susan___fabsf (type 12) (param f32) (result f32) + local.get 0 + f32.abs) + (func $susan_wccmalloc (type 2) (param i32) (result i32) + (local i32) + i32.const 0 + i32.const 0 + i32.load offset=38368 + i32.const 3 + i32.add + i32.const -4 + i32.and + local.tee 1 + local.get 0 + i32.add + i32.store offset=38368 + local.get 1 + i32.const 8368 + i32.add) + (func $susan_wccfreeall (type 1) + i32.const 0 + i32.const 0 + i32.store offset=38368) + (func $susan_wccmemcpy (type 11) (param i32 i32 i32) (result i32) + (local i32 i32 i32) + i32.const 76 + i32.const 76 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + block ;; label = @2 + block ;; label = @3 + local.get 2 + i32.const 3 + i32.and + local.tee 3 + br_if 0 (;@3;) + local.get 2 + local.set 4 + local.get 0 + local.set 5 + br 1 (;@2;) + end + local.get 2 + i32.const -4 + i32.and + local.set 4 + local.get 0 + local.set 5 + loop ;; label = @3 + local.get 5 + local.get 1 + i32.load8_u + i32.store8 + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@3;) + end + end + local.get 2 + i32.const 4 + i32.lt_u + br_if 0 (;@1;) + loop ;; label = @2 + local.get 5 + local.get 1 + i32.load8_u + i32.store8 + local.get 5 + i32.const 1 + i32.add + local.get 1 + i32.const 1 + i32.add + i32.load8_u + i32.store8 + local.get 5 + i32.const 2 + i32.add + local.get 1 + i32.const 2 + i32.add + i32.load8_u + i32.store8 + local.get 5 + i32.const 3 + i32.add + local.get 1 + i32.const 3 + i32.add + i32.load8_u + i32.store8 + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 4 + i32.const -4 + i32.add + local.tee 4 + br_if 0 (;@2;) + end + end + local.get 0) + (func $susan_wccmemset (type 3) (param i32 i32 i32) + (local i32) + i32.const 7220 + i32.const 7220 + call $__pragma_loopbound + block ;; label = @1 + local.get 2 + i32.eqz + br_if 0 (;@1;) + local.get 2 + i32.const 7 + i32.and + local.set 3 + block ;; label = @2 + local.get 2 + i32.const 8 + i32.lt_u + br_if 0 (;@2;) + local.get 2 + i32.const -8 + i32.and + local.set 2 + loop ;; label = @3 + local.get 0 + local.get 1 + i32.store8 offset=7 + local.get 0 + local.get 1 + i32.store8 offset=6 + local.get 0 + local.get 1 + i32.store8 offset=5 + local.get 0 + local.get 1 + i32.store8 offset=4 + local.get 0 + local.get 1 + i32.store8 offset=3 + local.get 0 + local.get 1 + i32.store8 offset=2 + local.get 0 + local.get 1 + i32.store8 offset=1 + local.get 0 + local.get 1 + i32.store8 + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 2 + i32.const -8 + i32.add + local.tee 2 + br_if 0 (;@3;) + end + end + local.get 3 + i32.eqz + br_if 0 (;@1;) + loop ;; label = @2 + local.get 0 + local.get 1 + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@2;) + end + end) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 42480)) + (global (;1;) i32 (i32.const 38372)) + (global (;2;) i32 (i32.const 42480)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $susan_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "P5\0a# CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2)\0a76 95\0a255\0a#$$$$&&$%%%&&$\22&()*(&$$#$# #&**&$$$%$#!!! \1f!$'($$\22\22$&'%$$#$''%%'%&'(&%%!! !\22##$$$%&%&&'))((+*)('&#!##%'&%$&$$\22\22&''%$$\22!\22!#!$##$$%! $&&&''&'%#$\22#$%'&%\22\1f\22####$&''%&&('()+,*('&**''$!!\22$$#!!#%$\22\22\1f\1e $*++($$$#\22#!!\1e \22###$#%\22\22#$%%#$%''&#####$&%&&$##$####\22\22$$&(&%$\22\22##$%%&&''$#$#%$&'%&\22! ! \1c\22(-,(&\22\1e\1e!(-+)%%%$!\1f \1f#####&''('%%%##%%$%%%&%&%%##\22###$'-+&'&$$$#%'&%%%'&%%#\22\22%'$%&'()'$&'''$! \1e\1e\1f#####'(&%('&'''&''((')')'&'&&$#$#%&&&(&''$$!\22$#%&''&$ #&&'&##\22%'&$##!\1f\1e $%&#####')*&!\1f!%$%&%%&'&&&&%&&'))%'(*,+'*0-)'&&&&$%&'''+)&%%&$\22\22\22&))&##\22# \1e\1f!\22######'$#&)& \22&\22&(''$$'&'%&&$$#%&'&$&%#\1f#%('##$\22$$&%&%%$%&%$#\22\22\22%$%$\22$$\22\1f\1e! !####\22\1b!'*)*,-*'))*+*)(&%#%$$$%$$%%'+++*''''('&#\22$%$%&&%$##!#&&')'&%&&$%$%%$$####$*()+*'%%%%''&%#%$#$$''$$\22%(((')('''(&$\22#%\22$##\22!$$&'&%\22\22!\22#$$#$#&''(&%$$####$$*-,+(&%$%%&&&&$##\22\22$&$#&%%&&%&$!#%%&&)))&#!\1e\1d %''&'&#\22####\22#$$%&&&$#!\22####$$ !$&(**'()+*$! ! #%))'(%$&')(()'%%$%%$#%%'))+)((%%&&&&&$&%$'))*)'&&$%%###$$!#%\22###'&')+++*'&'%%&%$&&(&''$#\22!\22$%&%%%$\22\22!\22#&)&$%%%%')()*)())'(('%%$&###$%-*(,-*+**-/132321---+**+)'((('&(('''&#!%)*'%%%&&$%#! !\22##&'%&$#%&'*)&$\22####$'&$%%%$(*+/10/,+/474/,***(('&%%'&&&$!\1f\22#&'&%&&%&%*.-*''&\22$''%#$\22%%$$')*####$((&''$$&'*.1244334632343//./-+++++*))((*.,)%$%''&&'&&'%##&&&$##%#$&$&&'###$$''(('%&)'+./11100344554342010.//,*+,+-0.-,*+.-,*)&'&%$#%#%$!\1f &+*)'%&%%##$$$&&$%'&'&'*/1..//./1001321230../0/-+*,-/13331/0/1.,('(('&(&'('%$#!#\22 !\22&#$$$$#$&$%%%&&'+.34220211202211366331/04531..+.-/21//.-00-+,++*)'''%%\22\22 !#$'#$$$$('$$#\22! %+386787421..-/136631220/-./220+**+-//021//01/00//-,*'&&&*))'$###$$$\22%%#$$#$%&)2CRTPPLKJG@=:656885331/1100//00/-./..-)*,,--0/,*%#\22 !%(%%$$%##$$$%#%%%###%().:Uw\89\85{smnmkf_]XVVVVSMD@;:===:8313322-%)/225410-+*'&$&'''&%$###$$\22$$&'&%')+/8Oy\96\92\94\9d\9a\9c\9d\9b\99\9a\96\94\92\91\91\8d\8b\88\85\85\83\80\7f|vrwqhcddaYSOLIE<40/-.(%&&*-+**'&'##$$$%%(**('&(+1Y\84\9d\a3\a8\a8\a4\a6\a9\a8\a7\a9\a8\a7\a8\a9\a8\a7\a7\a9\a8\a8\a9\a7\a4\a5\a4\a4\a5\a5\a6\a7\a7\a7\a6\a4\a3\a5\a9\aa\a0\81Z<-,+$$%'&((%$$!#$$$$$\22\22\22!\22\22#%(*)2P\81\a0\a4\a7\ab\a8\a5\a8\a8\a7\a9\a6\a6\a7\a7\a6\a5\a6\a7\a9\aa\a9\a7\a6\a5\a3\a3\a3\a5\a5\a6\a6\a5\a4\a5\a4\a7\a9\a8\a0\85`A0/-&%%%%''%&$##$$$$$()()**)''-5Bd\91\aa\aa\a9\b0\aa\a4\a8\aa\a9\ac\ad\aa\aa\ab\ab\aa\ac\ac\a8\a6\a9\a8\a8\a8\a8\a6\a7\a7\a7\a7\a7\a8\a9\a8\a6\a9\a8\a6\9e\81]E223+,+)%%(&&%$&$$$$$$&'('('*.14>Z\85\9b\9c\9e\a2\a6\a8\a9\a7\a6\a7\a8\a8\a9\aa\a9\aa\aa\a9\ab\ab\a8\a7\a8\a7\a8\a7\a6\a7\a6\a6\a5\a6\a7\a5\a5\a5\a6\a4\9d\82]=-10+)&%$&&%$##'$$$$%)*())&(**-2=[\87\a2\a3\a0\a2\a2\a3\a5\a5\a3\a6\a8\a4\a6\a9\a9\a7\a8\a9\a7\a7\a6\a3\a0\a2\a5\a7\a8\a8\a6\a6\a7\a5\a4\a3\a5\a5\a4\a5\9bzT<04.\22$$%\22\22%\22 !\22%$$$%%$'')()('*,1>\5c\84\a0\ac\af\aa\a9\a7\a6\a5\a4\a6\a8\a7\a5\a6\a7\a7\a7\a6\a7\aa\a8\a7\a7\a6\a8\a6\a5\a5\a4\a4\a4\a5\a5\a3\a1\a2\a3\a3\9b}V=//1-,,+,-,*)&#&%%%%%'((*,*+/-,2Bc\91\a3\9f\a0\a4\a7\a7\a7\a9\a8\aa\a9\a6\a8\a8\a8\a9\a9\a8\a5\a3\a5\a4\a7\aa\ac\ad\ad\a9\a6\a5\a6\a5\a4\a3\a2\9f\a0\9f\95wO5''&%(&&%&()'&$$%%%%%('((((&'+,0;_\87\99\a0\a1\9f\a2\a4\a6\a6\a6\a8\ab\a8\a7\a8\a7\a5\a4\a4\a5\a6\a8\a8\a8\a6\a5\a4\a5\a7\a3\a3\a4\a4\a5\a3\a2\a2\a2\a3\97vO4&$())*'&(('''%&%%%%%)*()++-+*+/>_\88\a3\a4\a0\a4\a2\a4\a5\a8\a8\a7\a6\a5\a8\a8\a7\a8\a5\a3\a4\a5\a6\a7\a6\a7\a5\a6\a6\a2\a1\a1\a2\a5\a9\ad\a9\a8\a7\a2\96uO<3-(%&&$\22!\22\22!#%$%%%%%$(&'()&(+04>`\88\99\9d\a2\a1\a3\a4\a6\a7\a6\a5\a6\a4\a1\a1\a2\a2\a4\a4\a3\a3\a4\a5\a6\a4\a2\a3\a4\a7\a5\a7\a9\a8\a5\9f\9e\a1\a2\a2\98{V=0./(&%\22$#')('%%%%%%%''('(*)(+*+4U}\96\a4\9e\a0\ac\ae\a9\aa\ab\aa\aa\a6\a8\a8\a9\a9\a4\a3\a3\a3\a6\a5\a4\a7\a7\a7\a7\a5\a5\a3\a3\a2\a3\a4\a2\a2\a5\a4\9c{O9/-/(%$#&%'(&'$#%%%%%)&!\1f%,,,.04@`\8b\9e\99\9d\9f\a0\9f\9f\a2\a7\ab\a6\a5\a7\a7\a7\a8\a9\aa\a6\a4\a5\a3\a5\a4\a4\a5\a3\a4\a4\a4\a5\a2\a2\a2\a1\a3\9e\9a\92uS7(.0,*'(%'(&&&'*%%%%&'())))(*./4Af\8e\9a\9f\9c\a1\ad\a8\a5\a7\a5\a5\a7\a7\a8\a6\a7\a8\a8\a8\a7\a4\a6\a6\a6\a6\a4\a2\a1\a2\a3\a4\a6\a6\a4\a4\a2\a4\a4\a0\94tL92/*&)*)%$%$$%##%%%%&'()')($\22%'*=d\8f\a6\9f\a0\a6\a9\a8\a6\a5\a3\a7\a5\a5\a6\a6\a5\a5\a7\a9\a6\a5\a7\a6\a7\a6\a6\a4\a4\a4\a5\a5\a7\a6\a4\a6\a4\a3\a3\a0\95wQ0%(,-)(&$%&%%%$#%%%%'/2-()()*,05@b\8c\a1\a0\9f\a9\ad\a9\a9\a8\a9\aa\aa\a9\a5\a1\a2\a4\a8\a7\a6\a6\a8\a9\a8\a6\a2\a4\a3\a5\a7\a7\a9\aa\a9\a6\a4\a4\a5\a4\9c}O4362///.-.,($\22\22\22%%%%&)**''%#'.45De\89\9b\9b\9b\a3\a6\a7\a8\a8\a8\ab\a7\a6\a7\a5\a3\a4\a6\a6\a6\a5\a5\a6\a5\a3\a5\a4\a4\a7\a6\a5\a4\a1\a1\a2\a1\a1\a0\9f\92tQ60431-/.+,+&##\22$%%%%'++)(*))((,2Dj\90\a3\a3\a1\a4\a2\a3\a6\a7\a6\a8\a6\a7\a8\a7\a7\a7\aa\a8\a5\a4\a4\a5\a4\a5\a5\a4\a5\a4\a6\a6\a5\a8\a9\a6\a4\a5\a5\a4\98yP6+-.))(&&&%%%%'(%%%%%''(&()()+.4Ei\90\a4\a1\a2\a6\a2\a2\a4\a5\a6\a5\a6\a6\a6\a6\a7\a8\a7\a6\a6\a3\a2\a3\a4\a5\a5\a4\a2\a5\a5\a7\a7\a3\a1\a0\9f\a0\a0\a0\96yV6/520+('%((&&$%%%%%%%'&&&&%%')*->h\90\a3\a9\a5\a4\a4\a5\a7\a5\a7\a6\a8\aa\a8\a6\a5\a5\a6\a5\a5\a5\a6\a7\a6\a7\a6\a3\a5\a4\a4\a5\a4\a5\a5\a2\a2\a4\a3\a4\99|\5cA1/-'(((%%%%))&&%%%%&.**())%'+1;Np\97\a8\a2\a3\a0\a1\a4\a6\a8\a6\a5\a6\a8\a7\a6\a7\a6\a5\a6\a5\a3\a3\a4\a4\a5\a5\a6\a4\a4\a4\a3\a4\a4\a4\a2\a2\a2\a2\a3\95tM0+/+)('&&*(&%\22\22\22$%%%%))&&'(''((-?f\8b\9e\a4\a8\a9\a5\a6\a7\a6\a5\a3\a6\ad\ab\a9\a8\a6\a5\a3\a4\a3\a5\a7\a7\a7\a5\a2\a4\a5\a6\a4\a4\a4\a3\a5\a7\a6\a7\a9\9d~V6+-.*(&$\22\22$\22#\22#$$%%%&+(&&()())*2Jq\8f\9e\a1\a8\a8\a6\a5\a6\a6\a4\a5\a8\aa\a9\aa\aa\a7\a5\a4\a4\a5\a8\a6\a3\a1\9f\9f\a1\a2\a3\a4\a4\a4\a3\a2\a2\a0\a1\a0\91oI*'2-)(&&')&##!\1e\1c$%%%%%(&())+*(*1Jw\9c\a8\a2\a3\a6\a2\a2\a5\a7\a7\a6\a7\a8\a3\a2\a5\a7\a9\a6\a0\9e\a0\a2\a2\a4\a4\a4\a7\a8\a7\a5\a6\a7\a8\aa\a9\a6\a3\a1\92qO;4+&&&))')*)((('%%%%%'&((*()+/25Jp\8e\9d\a1\a4\a2\a1\a1\a4\a6\a5\a8\ab\a7\a8\a9\a8\a7\a7\a5\a5\a6\a8\a5\a2\a3\a3\a3\a2\a3\a5\a6\a6\a4\a3\a2\a4\a2\a2\a1\92qN4.1-+*+)')(&&#%'%%%%%#&&)*'*+,.7Pw\94\9d\a1\a5\a6\a1\a1\a4\a6\a2\a2\a7\a8\a4\a5\a5\a3\a3\a3\a3\a5\a7\a6\a3\a5\a7\a8\a7\a8\a7\a4\a3\a3\a3\a4\a4\a1\a1\9f\8flC0.))*''%$&&$%'&'%%%%$ \22$&&&&)*,2Cs\9e\a7\a2\a3\a9\aa\a5\a6\a4\a3\a4\a7\a5\a4\a6\a4\a4\a5\a6\a6\a7\a9\a6\a3\a4\a4\a1\a2\a2\a3\a5\a4\a2\a1\a0\a3\a3\a4\a1\90kI8--,))'&%''%&%')%%%%%(')**''+/18Lp\90\9a\a6\b2\a8\a3\a4\a4\a6\a7\a5\a8\aa\a6\a8\a9\a7\a5\a6\a6\a7\a6\a6\a8\a6\a7\a7\a7\a9\a6\a5\a6\a6\a8\a6\a4\a3\a3\9f\90lG4030-(()**)')*'%%%%%%&'((((*-.-3Hy\9e\9d\9c\a1\a3\a0\a1\a3\a6\a6\a9\a7\a7\a6\a7\a6\a6\a7\a4\a2\a6\a5\a5\a5\a6\a7\a6\a8\a6\a4\a5\a4\a3\a2\a0\a2\a2\a1\9f\8fjG40.--)%!!##%&%$#%%%%%%%&'''(*(*2Ir\95\a0\9c\9f\9c\99\9b\9f\a4\a7\a7\a9\ab\a8\a7\a9\a9\a8\a8\a7\a5\a4\a7\aa\aa\ac\aa\aa\a6\a2\a2\a3\a3\a2\a2\a3\a4\a2\9d\8djH<;970*'%%'%%&%#!%%%%&-+*'$#\22&(*2Ls\92\9f\a7\a8\a4\a1\a2\a5\a6\a8\aa\a9\a8\a9\aa\a8\a8\a8\a5\a6\a7\a6\a7\a7\a5\a6\a5\a6\a5\a3\a3\a3\a1\9f\a0\a4\a2\9f\9c\8ajH620/.,($&(*)(&$&%%%%%')))()-//.5Mw\9a\a6\a2\a7\a8\a2\a6\a9\aa\ab\a9\a9\ab\aa\aa\a9\a8\a6\a6\a5\a5\a5\a3\a5\a5\a4\a3\a3\a4\a2\a3\a6\a5\a4\a4\a5\a2\a0\a1\97rJ9325/*'%)..+(#\1f\1d%%%%&'%&'()(+.09Y\82\9a\9f\a0\a3\a0\a4\a7\a7\a5\a2\a6\a5\a6\a8\a8\a6\a6\a6\a4\a3\a3\a4\a6\a7\a6\a7\a5\a3\a5\a4\a3\a4\a2\a1\a4\a4\a1\9d\9c\8cgF6461.+($#')%&&&%%%%&&*+)))--,,.8Vw\8f\a0\a5\b2\ad\a6\a6\a6\a7\a5\a4\a4\a6\a8\a7\a5\a5\a6\a7\a7\a8\a8\a6\a6\a4\a4\a4\a6\a6\a2\a3\a5\a5\a4\a2\a5\a6\a1\9c\87[:11/-,,+)((%##$#\22%%&&&*&%&%%(--,6T{\96\a0\a1\a0\9d\9f\a0\a4\a5\a4\a5\a4\a1\a2\a3\a4\a5\a7\a5\a4\a5\a5\a4\a2\a4\a8\a7\a5\a5\a3\a2\a4\a3\a4\a3\a4\a2\a1\9f\8a_7!\22%%\22!!\1f\22$$\22#$%&%%&&&((*++))(++2Mt\92\ac\af\a9\a5\a2\a5\a8\a8\a7\a8\a8\a8\ab\a8\a7\a8\a8\a7\a4\a5\a3\a4\a4\a2\a2\a3\a3\a2\a0\a1\a5\a7\a8\a5\a4\a2\9e\9c\86[9+.)!$$&''&!!\22\22\22#%&&&',+,-,((*(.<]\81\99\a8\a9\a2\a3\a0\9f\a2\a7\a6\a7\a8\a6\a6\a5\a4\a6\a6\a5\a3\a2\a2\a2\a2\a3\a5\a2\a0\a1\9e\9f\a2\a2\a1\9d\9e\a1\a1\9b\87_:*',,'%)*))%!! !!%&&&&'),,/.,)'(4U\7f\9a\a8\ae\a9\a4\a2\a5\a6\a5\a4\a5\a7\a5\a4\a5\a7\a9\aa\a7\a5\a4\a3\a3\a4\a1\9e\a1\a6\a9\a6\a4\a3\a2\9e\9d\9f\9f\a0\9e\8ejA(*)'))+.-+(&'(('%&&&&\22%'**)*)*,:X|\93\9e\a1\a0\9f\a1\a1\a1\a0\a2\a5\a6\a4\a5\a6\a6\a7\a9\a7\a4\a2\a1\a0\a1\a2\a2\9f\9e\9f\9f\a0\a1\a0\a1\9e\9d\9e\9f\9c\87Z4%$')''(&#!\22#\22$$#%&&&&('('(,.1555Il\8e\a0\a0\9d\9c\9d\a0\a2\a1\a3\a7\ac\a8\a5\a5\a3\9f\9f\9e\9f\a3\a4\a4\a4\a1\a1\a2\a4\a5\a2\a0\a0\a2\a2\a2\a4\a3\a2\a0\8dg@$&-*,)))%&*-.+'!%&&&&**&$#\22$(''1R\85\a1\a5\a9\a7\a3\a2\a1\a2\a1\a2\a5\a4\a3\a4\a4\a2\a1\a1\a0\a2\a2\a2\a3\a2\a4\a6\a4\a6\a5\a3\a4\a4\a5\a5\a3\a3\a3\a3\9e\86Z6(()(&$$$'*+)&&$$%&&&&)(%$&**),)0It\99\a8\a9\a4\a0\a1\a3\a5\a9\ab\a8\ab\a7\a3\a5\a8\a9\ab\a9\a7\a5\a3\a4\a4\a4\a5\a2\a6\a5\a3\a3\a2\a4\a4\a1\a3\a4\a3\a0\8chB('%'*++(&%$$\22\22##%&&&&))&%$#%*,.:[\88\9e\9d\a2\a7\a3\a4\a4\a3\a3\a3\a5\a7\a8\ab\aa\a8\a7\a9\a7\a8\a6\a2\a3\a2\a2\a5\a6\aa\a6\a2\a2\a0\a1\a1\a2\a3\a4\a5\9f\85[:040,++)$&*+'%\22\1f %&&&&)(%)*)+)'-<\5c\85\9a\9a\9d\9d\9f\a4\a3\a3\a2\a2\a0\a3\a7\a4\a5\a6\a7\a6\a8\a6\a6\a5\a4\a4\a4\a4\a2\a6\a6\a6\a5\a5\a5\a3\a2\a5\a4\a1\99\81\5c;1857320+'$##\22!\22%%&&&&&'&()(*--/@d\8a\98\9a\a3\a1\a4\a0\9f\a0\a0\a2\a4\a7\a6\a3\a3\a0\9f\a2\a0\a0\9f\9e\9f\a0\a2\a2\a1\a4\a1\a2\a2\a1\a2\a1\a0\a1\a2\a2\9f\8afF557464/)&'($%%#$%&&&&('()'!!$(3@T}\9a\a9\af\a4\9e\9b\9e\9f\a1\a1\a1\a2\a2\9e\9f\a2\a3\a3\a3\a4\a5\a4\a3\a3\a3\a3\a1\a2\a2\a0\a2\a5\a5\a1\a2\a1\9e\9e\9a\89eG7//034-&\22\1e\22\22 \22\22%%%&&&)*)')'%%%,Bi\8a\97\95\96\9a\9b\9a\9c\9b\9b\9d\9e\a0\a0\9e\a2\a2\a1\a2\a0\9f\9f\a0\a0\a1\a0\a2\a0\9d\a1\a0\9e\9c\9e\9f\9f\a2\a3\9f\95{S6)-0-.,+($'$%&()(%%&&&((++)(**(,=Zy\86\87\8b\8f\91\94\98\98\97\96\96\9a\99\96\96\95\96\96\98\99\9b\9c\9d\9e\9d\9c\9b\9e\a1\a2\a2\a3\a1\a1\9f\9f\9e\9f\9f\8db:(*../0-+*('$\22#$&%%%&&%))*+()((*3DNQQQUUWXY]`adbeimnqttuvwxy~\82\82\85\88\8a\8b\8d\8e\8f\92\96\94\8duQ4(*/00-*&\22%\22$%''&%%%&&&%')'**()+5EGBA=99:<>A@DLGCDEKRWUUVW\5c^^`Z[_emmrsw{yuhM2% \1e\18\1b#''$&$%$\22! %%%%&%)()+)'&(+1542233461.20/332022222334489:;9887458;<=>;663/2/-,+(%%%'+-+'$%%%'.)&(('((&+166441//20141230011132..2144/034024/-.-0120,-02/+,,,+++)))&$$$%%%%))'&&$$%',0222444452...*+.-,..-+-.232321332321/112420-.//0/-,-*&%#\1f\1d\1f!#$$%%%''()*'%%$(,0/-.1112/010-//135310.,,+,.013321102681,+,,--,-*()*)&$%).+(%$$%%%()(''$#%&)+-.../-)-./0/-,-/...-.-+,,.33/1.,+''*...,+**,,../-(%!#(-***&$$$$%&**('&&'('&((&%&((&''('$\22%(()(&#$('&$$%'((()****())*--**(*..,+)'%()%# \1e\1f$$$$%(((''&')*(**)&&*'%'%\22#$''))''$##%)-0/0-*,))*+*)('%%%&&()*()('(&%')(%# !$$$$$&'&%&%%('+00,'&()))**'$##\22#$&&%'&$$%'((&&%#$!\22%$''&%!\1e !!#$$$%#%'($#%$#$$$$#\1f\22#%&%$'*))(&$%&'((%\22\22#%%''&(')+++('))'#!\22!$&(('(%'%\22!\22####!#\22!\22$%$##\22#$$$$$&'((*)(+*'&##\22#%%%%&%#\22$'('()($%&\22#$%'(%%%\22\22##%%&'*,*()(&#\22\22$$%'&((&$!\1f$$$$$$$')*)(&&%%)(''%'&'%###$'&&&&'''&&'()))&&%%$&('%#%#!\22#&$$&\22!#$#%'&&&%\22\1f$$$$$%))'('()*(##$\22$&&''''&%&&$\22#(,+./(#$$%%#$%#$&&'''((&! #$# \1f \22\22#&'&%#$$!$$$$$#\1f!$$%%%&&')'$$$#%\22\22 \22#'&&'&&&&$!\22!\22\22%(((%#%&%##$%&)+*%$(')+)$ !$%('$!$$$$%**'###%%&'&((',,'((*,*&&$###&&#!$##%&'&&&%$!!!\22%&'($\1f!$\22%#\22$%&&%%#!#'$\22$$$$$$#$$%#%&&()*(),**(&'%$##\22!\22#$$&%%$\22$'('&'%%$'(''#%%$()(%#$$%##\22 $\22 \1f\1e\1f!$$$$%%%$#&')(#$##\22\22&&'($#$#$$&$')*))())'&$%%#%('%%%&'+,)''*($&\22!$%)))))((,)&$$$%%&''&&%((%&&%$$$#''&)&%&')(()))(%'((''$#####\22$#%(((&$$#%$%&&&%%\22\1f! !!!#$")) diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/input.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/input.c new file mode 100644 index 0000000..9b6718d --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/input.c @@ -0,0 +1,610 @@ + +char susan_input[7292] = { + 80, 53, 10, 35, 32, 67, 82, 69, 65, 84, 79, 82, + 58, 32, 88, 86, 32, 86, 101, 114, 115, 105, 111, 110, + 32, 51, 46, 49, 48, 97, 32, 32, 82, 101, 118, 58, + 32, 49, 50, 47, 50, 57, 47, 57, 52, 32, 40, 80, + 78, 71, 32, 112, 97, 116, 99, 104, 32, 49, 46, 50, + 41, 10, 55, 54, 32, 57, 53, 10, 50, 53, 53, 10, + 35, 36, 36, 36, 36, 38, 38, 36, 37, 37, 37, 38, + 38, 36, 34, 38, 40, 41, 42, 40, 38, 36, 36, 35, + 36, 35, 32, 35, 38, 42, 42, 38, 36, 36, 36, 37, + 36, 35, 33, 33, 33, 32, 31, 33, 36, 39, 40, 36, + 36, 34, 34, 36, 38, 39, 37, 36, 36, 35, 36, 39, + 39, 37, 37, 39, 37, 38, 39, 40, 38, 37, 37, 33, + 33, 32, 33, 34, 35, 35, 36, 36, 36, 37, 38, 37, + 38, 38, 39, 41, 41, 40, 40, 43, 42, 41, 40, 39, + 38, 35, 33, 35, 35, 37, 39, 38, 37, 36, 38, 36, + 36, 34, 34, 38, 39, 39, 37, 36, 36, 34, 33, 34, + 33, 35, 33, 36, 35, 35, 36, 36, 37, 33, 32, 36, + 38, 38, 38, 39, 39, 38, 39, 37, 35, 36, 34, 35, + 36, 37, 39, 38, 37, 34, 31, 34, 35, 35, 35, 35, + 36, 38, 39, 39, 37, 38, 38, 40, 39, 40, 41, 43, + 44, 42, 40, 39, 38, 42, 42, 39, 39, 36, 33, 33, + 34, 36, 36, 35, 33, 33, 35, 37, 36, 34, 34, 31, + 30, 32, 36, 42, 43, 43, 40, 36, 36, 36, 35, 34, + 35, 33, 33, 30, 32, 34, 35, 35, 35, 36, 35, 37, + 34, 34, 35, 36, 37, 37, 35, 36, 37, 39, 39, 38, + 35, 35, 35, 35, 35, 36, 38, 37, 38, 38, 36, 35, + 35, 36, 35, 35, 35, 35, 34, 34, 36, 36, 38, 40, + 38, 37, 36, 34, 34, 35, 35, 36, 37, 37, 38, 38, + 39, 39, 36, 35, 36, 35, 37, 36, 38, 39, 37, 38, + 34, 33, 32, 33, 32, 28, 34, 40, 45, 44, 40, 38, + 34, 30, 30, 33, 40, 45, 43, 41, 37, 37, 37, 36, + 33, 31, 32, 31, 35, 35, 35, 35, 35, 38, 39, 39, + 40, 39, 37, 37, 37, 35, 35, 37, 37, 36, 37, 37, + 37, 38, 37, 38, 37, 37, 35, 35, 34, 35, 35, 35, + 36, 39, 45, 43, 38, 39, 38, 36, 36, 36, 35, 37, + 39, 38, 37, 37, 37, 39, 38, 37, 37, 35, 34, 34, + 37, 39, 36, 37, 38, 39, 40, 41, 39, 36, 38, 39, + 39, 39, 36, 33, 32, 30, 30, 31, 35, 35, 35, 35, + 35, 39, 40, 38, 37, 40, 39, 38, 39, 39, 39, 38, + 39, 39, 40, 40, 39, 41, 39, 41, 39, 38, 39, 38, + 38, 36, 35, 36, 35, 37, 38, 38, 38, 40, 38, 39, + 39, 36, 36, 33, 34, 36, 35, 37, 38, 39, 39, 38, + 36, 32, 32, 35, 38, 38, 39, 38, 35, 35, 34, 37, + 39, 38, 36, 35, 35, 33, 31, 30, 32, 36, 37, 38, + 35, 35, 35, 35, 35, 39, 41, 42, 38, 33, 31, 33, + 37, 36, 37, 38, 37, 37, 38, 39, 38, 38, 38, 38, + 37, 38, 38, 39, 41, 41, 37, 39, 40, 42, 44, 43, + 39, 42, 48, 45, 41, 39, 38, 38, 38, 38, 36, 37, + 38, 39, 39, 39, 43, 41, 38, 37, 37, 38, 36, 34, + 34, 34, 38, 41, 41, 38, 35, 35, 34, 35, 32, 30, + 31, 33, 34, 35, 35, 35, 35, 35, 35, 39, 36, 35, + 38, 41, 38, 32, 34, 38, 34, 38, 40, 39, 39, 36, + 36, 39, 38, 39, 37, 38, 38, 36, 36, 35, 37, 38, + 39, 38, 36, 38, 37, 35, 31, 35, 37, 40, 39, 35, + 35, 36, 34, 36, 36, 38, 37, 38, 37, 37, 36, 37, + 38, 37, 36, 35, 34, 34, 34, 37, 36, 37, 36, 34, + 36, 36, 34, 31, 30, 33, 32, 33, 35, 35, 35, 35, + 34, 27, 33, 39, 42, 41, 42, 44, 45, 42, 39, 41, + 41, 42, 43, 42, 41, 40, 38, 37, 35, 37, 36, 36, + 36, 37, 36, 36, 37, 37, 39, 43, 43, 43, 42, 39, + 39, 39, 39, 40, 39, 38, 35, 34, 36, 37, 36, 37, + 38, 38, 37, 36, 35, 35, 33, 35, 38, 38, 39, 41, + 39, 38, 37, 38, 38, 36, 37, 36, 37, 37, 36, 36, + 35, 35, 35, 35, 36, 42, 40, 41, 43, 42, 39, 37, + 37, 37, 37, 39, 39, 38, 37, 35, 37, 36, 35, 36, + 36, 39, 39, 36, 36, 34, 37, 40, 40, 40, 39, 41, + 40, 39, 39, 39, 40, 38, 36, 34, 35, 37, 34, 36, + 35, 35, 34, 33, 36, 36, 38, 39, 38, 37, 34, 34, + 33, 34, 35, 36, 36, 35, 36, 35, 38, 39, 39, 40, + 38, 37, 36, 36, 35, 35, 35, 35, 36, 36, 42, 45, + 44, 43, 40, 38, 37, 36, 37, 37, 38, 38, 38, 38, + 36, 35, 35, 34, 34, 36, 38, 36, 35, 38, 37, 37, + 38, 38, 37, 38, 36, 33, 35, 37, 37, 38, 38, 41, + 41, 41, 38, 35, 33, 30, 29, 32, 37, 39, 39, 38, + 39, 38, 35, 34, 35, 35, 35, 35, 34, 35, 36, 36, + 37, 38, 38, 38, 36, 35, 33, 34, 35, 35, 35, 35, + 36, 36, 32, 33, 36, 38, 40, 42, 42, 39, 40, 41, + 43, 42, 36, 33, 32, 33, 32, 35, 37, 41, 41, 39, + 40, 37, 36, 38, 39, 41, 40, 40, 41, 39, 37, 37, + 36, 37, 37, 36, 35, 37, 37, 39, 41, 41, 43, 41, + 40, 40, 37, 37, 38, 38, 38, 38, 38, 36, 38, 37, + 36, 39, 41, 41, 42, 41, 39, 38, 38, 36, 37, 37, + 35, 35, 35, 36, 36, 33, 35, 37, 34, 35, 35, 35, + 39, 38, 39, 41, 43, 43, 43, 42, 39, 38, 39, 37, + 37, 38, 37, 36, 38, 38, 40, 38, 39, 39, 36, 35, + 34, 33, 34, 36, 37, 38, 37, 37, 37, 36, 34, 34, + 33, 34, 35, 38, 41, 38, 36, 37, 37, 37, 37, 39, + 41, 40, 41, 42, 41, 40, 41, 41, 39, 40, 40, 39, + 37, 37, 36, 38, 35, 35, 35, 36, 37, 45, 42, 40, + 44, 45, 42, 43, 42, 42, 45, 47, 49, 51, 50, 51, + 50, 49, 45, 45, 45, 43, 42, 42, 43, 41, 39, 40, + 40, 40, 39, 38, 40, 40, 39, 39, 39, 38, 35, 33, + 37, 41, 42, 39, 37, 37, 37, 38, 38, 36, 37, 35, + 33, 32, 33, 34, 35, 35, 38, 39, 37, 38, 36, 35, + 37, 38, 39, 42, 41, 38, 36, 34, 35, 35, 35, 35, + 36, 39, 38, 36, 37, 37, 37, 36, 40, 42, 43, 47, + 49, 48, 47, 44, 43, 47, 52, 55, 52, 47, 44, 42, + 42, 42, 40, 40, 39, 38, 37, 37, 39, 38, 38, 38, + 36, 33, 31, 34, 35, 38, 39, 38, 37, 38, 38, 37, + 38, 37, 42, 46, 45, 42, 39, 39, 38, 34, 36, 39, + 39, 37, 35, 36, 34, 37, 37, 36, 36, 39, 41, 42, + 35, 35, 35, 35, 36, 40, 40, 38, 39, 39, 36, 36, + 38, 39, 42, 46, 49, 50, 52, 52, 51, 51, 52, 54, + 51, 50, 51, 52, 51, 47, 47, 46, 47, 45, 43, 43, + 43, 43, 43, 42, 41, 41, 40, 40, 42, 46, 44, 41, + 37, 36, 37, 39, 39, 38, 38, 39, 38, 38, 39, 37, + 35, 35, 38, 38, 38, 36, 35, 35, 37, 35, 36, 38, + 36, 38, 38, 39, 35, 35, 35, 36, 36, 39, 39, 40, + 40, 39, 37, 38, 41, 39, 43, 46, 47, 49, 49, 49, + 48, 48, 51, 52, 52, 53, 53, 52, 51, 52, 50, 48, + 49, 48, 46, 47, 47, 44, 42, 43, 44, 43, 45, 48, + 46, 45, 44, 42, 43, 46, 45, 44, 42, 41, 38, 39, + 38, 37, 36, 35, 37, 35, 37, 36, 33, 31, 32, 38, + 43, 42, 41, 39, 37, 38, 37, 37, 35, 35, 36, 36, + 36, 38, 38, 36, 37, 39, 38, 39, 38, 39, 42, 47, + 49, 46, 46, 47, 47, 46, 47, 49, 48, 48, 49, 51, + 50, 49, 50, 51, 48, 46, 46, 47, 48, 47, 45, 43, + 42, 44, 45, 47, 49, 51, 51, 51, 49, 47, 48, 47, + 49, 46, 44, 40, 39, 40, 40, 39, 38, 40, 38, 39, + 40, 39, 37, 36, 35, 33, 35, 34, 32, 33, 34, 38, + 35, 36, 36, 36, 36, 35, 36, 38, 36, 37, 37, 37, + 38, 38, 39, 43, 46, 51, 52, 50, 50, 48, 50, 49, + 49, 50, 48, 50, 50, 49, 49, 51, 54, 54, 51, 51, + 49, 47, 48, 52, 53, 51, 49, 46, 46, 43, 46, 45, + 47, 50, 49, 47, 47, 46, 45, 48, 48, 45, 43, 44, + 43, 43, 42, 41, 39, 39, 39, 37, 37, 34, 34, 32, + 33, 35, 36, 39, 35, 36, 36, 36, 36, 40, 39, 36, + 36, 35, 34, 33, 32, 37, 43, 51, 56, 54, 55, 56, + 55, 52, 50, 49, 46, 46, 45, 47, 49, 51, 54, 54, + 51, 49, 50, 50, 48, 47, 45, 46, 47, 50, 50, 48, + 43, 42, 42, 43, 45, 47, 47, 48, 50, 49, 47, 47, + 48, 49, 47, 48, 48, 47, 47, 45, 44, 42, 39, 38, + 38, 38, 42, 41, 41, 39, 36, 35, 35, 35, 36, 36, + 36, 34, 37, 37, 35, 36, 36, 35, 36, 37, 38, 41, + 50, 67, 82, 84, 80, 80, 76, 75, 74, 71, 64, 61, + 58, 54, 53, 54, 56, 56, 53, 51, 51, 49, 47, 49, + 49, 48, 48, 47, 47, 48, 48, 47, 45, 46, 47, 46, + 46, 45, 41, 42, 44, 44, 45, 45, 48, 47, 44, 42, + 37, 35, 34, 32, 33, 37, 40, 37, 37, 36, 36, 37, + 35, 35, 36, 36, 36, 37, 35, 37, 37, 37, 35, 35, + 35, 37, 40, 41, 46, 58, 85, 119, -119, -123, 123, 115, + 109, 110, 109, 107, 102, 95, 93, 88, 86, 86, 86, 86, + 83, 77, 68, 64, 59, 58, 61, 61, 61, 58, 56, 51, + 49, 51, 51, 50, 50, 45, 37, 41, 47, 50, 50, 53, + 52, 49, 48, 45, 43, 42, 39, 38, 36, 38, 39, 39, + 39, 38, 37, 36, 35, 35, 35, 36, 36, 34, 36, 36, + 38, 39, 38, 37, 39, 41, 43, 47, 56, 79, 121, -106, + -110, -108, -99, -102, -100, -99, -101, -103, -102, -106, -108, -110, + -111, -111, -115, -117, -120, -123, -123, -125, -128, 127, 124, 118, + 114, 119, 113, 104, 99, 100, 100, 97, 89, 83, 79, 76, + 73, 69, 60, 52, 48, 47, 45, 46, 40, 37, 38, 38, + 42, 45, 43, 42, 42, 39, 38, 39, 35, 35, 36, 36, + 36, 37, 37, 40, 42, 42, 40, 39, 38, 40, 43, 49, + 60, 83, 126, -105, -98, -93, -97, -94, -93, -90, -88, -91, + -94, -91, -90, -93, -94, -94, -96, -94, -94, -96, -95, -93, + -96, -100, -104, -104, -105, -108, -110, -115, -119, -120, -122, -125, + 127, 122, 118, 115, 118, 113, 97, 78, 59, 45, 48, 46, + 40, 38, 38, 37, 38, 38, 35, 37, 37, 34, 32, 32, + 35, 36, 36, 36, 36, 38, 39, 38, 37, 38, 35, 34, + 36, 35, 37, 41, 51, 77, 120, -100, -91, -96, -95, -93, + -92, -89, -90, -92, -92, -93, -93, -91, -90, -91, -94, -94, + -94, -93, -92, -93, -95, -95, -93, -94, -94, -91, -92, -94, + -93, -91, -92, -91, -92, -96, -97, -99, -105, -112, 126, 95, + 63, 43, 47, 42, 38, 38, 36, 36, 36, 38, 37, 37, + 37, 36, 37, 38, 35, 36, 36, 36, 36, 39, 39, 39, + 41, 38, 33, 35, 37, 39, 45, 51, 58, 80, 121, -104, + -94, -93, -92, -94, -94, -91, -89, -89, -88, -86, -86, -88, + -87, -88, -90, -90, -91, -91, -89, -87, -90, -92, -92, -90, + -91, -91, -89, -89, -90, -92, -93, -91, -90, -91, -90, -91, + -91, -100, -128, 88, 54, 44, 47, 48, 46, 43, 41, 36, + 37, 40, 38, 40, 38, 38, 37, 39, 35, 36, 36, 36, + 36, 38, 41, 39, 37, 35, 32, 34, 36, 38, 42, 47, + 57, 82, 118, -105, -88, -86, -84, -88, -91, -91, -91, -92, + -91, -89, -90, -89, -87, -88, -88, -89, -89, -91, -91, -91, + -92, -93, -92, -93, -97, -93, -93, -93, -92, -92, -94, -94, + -92, -94, -94, -91, -91, -98, -122, 96, 63, 53, 49, 44, + 42, 42, 41, 38, 36, 37, 36, 37, 38, 39, 38, 40, + 35, 36, 36, 36, 36, 34, 36, 35, 37, 39, 40, 43, + 41, 41, 44, 48, 56, 83, -127, -99, -89, -88, -87, -88, + -89, -87, -89, -90, -90, -89, -91, -91, -89, -87, -88, -87, + -89, -88, -89, -88, -90, -89, -87, -88, -92, -91, -88, -89, + -88, -87, -89, -91, -93, -95, -97, -94, -93, -99, -125, 91, + 59, 45, 45, 47, 43, 42, 39, 36, 36, 36, 40, 38, + 39, 39, 37, 36, 36, 36, 36, 36, 36, 34, 37, 38, + 39, 40, 43, 43, 43, 43, 40, 43, 56, 87, -127, -100, + -94, -95, -91, -88, -90, -89, -90, -92, -88, -88, -90, -88, + -90, -90, -89, -89, -91, -91, -92, -92, -91, -90, -89, -89, + -92, -90, -90, -92, -91, -89, -90, -91, -91, -95, -94, -92, + -93, -99, -124, 92, 61, 48, 47, 49, 45, 44, 41, 38, + 37, 37, 38, 34, 35, 35, 35, 35, 36, 36, 36, 36, + 36, 40, 39, 36, 34, 35, 35, 37, 37, 40, 49, 56, + 62, 89, -124, -99, -93, -88, -88, -92, -90, -87, -88, -89, + -87, -88, -89, -88, -87, -88, -89, -89, -87, -88, -88, -87, + -89, -92, -91, -92, -92, -91, -91, -90, -89, -89, -89, -90, + -92, -93, -91, -87, -86, -96, -127, 90, 60, 45, 44, 43, + 36, 36, 37, 39, 38, 40, 40, 37, 36, 36, 33, 35, + 36, 36, 36, 36, 36, 34, 34, 34, 33, 34, 34, 35, + 37, 40, 42, 41, 50, 80, -127, -96, -92, -89, -85, -88, + -91, -88, -88, -89, -87, -90, -90, -89, -89, -90, -91, -90, + -89, -87, -86, -87, -89, -90, -91, -93, -93, -93, -91, -91, + -90, -90, -91, -92, -91, -92, -89, -87, -88, -96, -123, 96, + 65, 48, 47, 45, 38, 37, 37, 37, 37, 39, 39, 37, + 38, 36, 35, 35, 36, 36, 36, 36, 36, 40, 41, 40, + 41, 42, 42, 41, 39, 39, 45, 53, 66, 100, -111, -86, + -86, -87, -80, -86, -92, -88, -86, -87, -84, -83, -86, -86, + -85, -85, -86, -84, -84, -88, -90, -87, -88, -88, -88, -88, + -90, -89, -89, -89, -89, -89, -88, -87, -88, -90, -87, -88, + -90, -98, -127, 93, 69, 50, 50, 51, 43, 44, 43, 41, + 37, 37, 40, 38, 38, 37, 36, 38, 36, 36, 36, 36, + 36, 36, 38, 39, 40, 39, 40, 39, 42, 46, 49, 52, + 62, 90, -123, -101, -100, -98, -94, -90, -88, -87, -89, -90, + -89, -88, -88, -87, -86, -87, -86, -86, -87, -85, -85, -88, + -89, -88, -89, -88, -89, -90, -89, -90, -90, -91, -90, -89, + -91, -91, -91, -90, -92, -99, -126, 93, 61, 45, 49, 48, + 43, 41, 38, 37, 36, 38, 38, 37, 36, 35, 35, 39, + 36, 36, 36, 36, 37, 41, 42, 40, 41, 41, 38, 40, + 42, 42, 45, 50, 61, 91, -121, -94, -93, -96, -94, -94, + -93, -91, -91, -93, -90, -88, -92, -90, -87, -87, -89, -88, + -87, -89, -89, -90, -93, -96, -94, -91, -89, -88, -88, -90, + -90, -89, -91, -92, -93, -91, -91, -92, -91, -101, 122, 84, + 60, 48, 52, 46, 34, 36, 36, 37, 34, 34, 37, 34, + 32, 33, 34, 37, 36, 36, 36, 37, 37, 36, 39, 39, + 41, 40, 41, 40, 39, 42, 44, 49, 62, 92, -124, -96, + -84, -81, -86, -87, -89, -90, -91, -92, -90, -88, -89, -91, + -90, -89, -89, -89, -90, -89, -86, -88, -89, -89, -90, -88, + -90, -91, -91, -92, -92, -92, -91, -91, -93, -95, -94, -93, + -93, -101, 125, 86, 61, 47, 47, 49, 45, 44, 44, 43, + 44, 45, 44, 42, 41, 38, 35, 38, 37, 37, 37, 37, + 37, 39, 40, 40, 42, 44, 42, 43, 47, 45, 44, 50, + 66, 99, -111, -93, -97, -96, -92, -89, -89, -89, -87, -88, + -86, -87, -90, -88, -88, -88, -87, -87, -88, -91, -93, -91, + -92, -89, -86, -84, -83, -83, -87, -90, -91, -90, -91, -92, + -93, -94, -97, -96, -97, -107, 119, 79, 53, 39, 39, 38, + 37, 40, 38, 38, 37, 38, 40, 41, 39, 38, 36, 36, + 37, 37, 37, 37, 37, 40, 39, 40, 40, 40, 40, 38, + 39, 43, 44, 48, 59, 95, -121, -103, -96, -95, -97, -94, + -92, -90, -90, -90, -88, -85, -88, -89, -88, -89, -91, -92, + -92, -91, -90, -88, -88, -88, -90, -91, -92, -91, -89, -93, + -93, -92, -92, -91, -93, -94, -94, -94, -93, -105, 118, 79, + 52, 38, 36, 40, 41, 41, 42, 39, 38, 40, 40, 39, + 39, 39, 37, 38, 37, 37, 37, 37, 37, 41, 42, 40, + 41, 43, 43, 45, 43, 42, 43, 47, 62, 95, -120, -93, + -92, -96, -92, -94, -92, -91, -88, -88, -89, -90, -91, -88, + -88, -89, -88, -91, -93, -92, -91, -90, -89, -90, -89, -91, + -90, -90, -94, -95, -95, -94, -91, -87, -83, -87, -88, -89, + -94, -106, 117, 79, 60, 51, 45, 40, 37, 38, 38, 36, + 34, 33, 34, 34, 33, 35, 37, 36, 37, 37, 37, 37, + 37, 36, 40, 38, 39, 40, 41, 38, 40, 43, 48, 52, + 62, 96, -120, -103, -99, -94, -95, -93, -92, -90, -89, -90, + -91, -90, -92, -95, -95, -94, -94, -92, -92, -93, -93, -92, + -91, -90, -92, -94, -93, -92, -89, -91, -89, -87, -88, -91, + -97, -98, -95, -94, -94, -104, 123, 86, 61, 48, 46, 47, + 40, 38, 37, 34, 36, 35, 39, 41, 40, 39, 37, 37, + 37, 37, 37, 37, 37, 39, 39, 40, 39, 40, 42, 41, + 40, 43, 42, 43, 52, 85, 125, -106, -92, -98, -96, -84, + -82, -87, -86, -85, -86, -86, -90, -88, -88, -87, -87, -92, + -93, -93, -93, -90, -91, -92, -89, -89, -89, -89, -91, -91, + -93, -93, -94, -93, -92, -94, -94, -91, -92, -100, 123, 79, + 57, 47, 45, 47, 40, 37, 36, 35, 38, 37, 39, 40, + 38, 39, 36, 35, 37, 37, 37, 37, 37, 41, 38, 33, + 31, 37, 44, 44, 44, 46, 48, 52, 64, 96, -117, -98, + -103, -99, -97, -96, -97, -97, -94, -89, -85, -90, -91, -89, + -89, -89, -88, -87, -86, -90, -92, -91, -93, -91, -92, -92, + -91, -93, -92, -92, -92, -91, -94, -94, -94, -95, -93, -98, + -102, -110, 117, 83, 55, 40, 46, 48, 44, 42, 39, 40, + 37, 39, 40, 38, 38, 38, 39, 42, 37, 37, 37, 37, + 38, 39, 40, 41, 41, 41, 41, 40, 42, 46, 47, 52, + 65, 102, -114, -102, -97, -100, -95, -83, -88, -91, -89, -91, + -91, -89, -89, -88, -90, -89, -88, -88, -88, -89, -92, -90, + -90, -90, -90, -92, -94, -95, -94, -93, -92, -90, -90, -92, + -92, -94, -92, -92, -96, -108, 116, 76, 57, 50, 47, 42, + 38, 41, 42, 41, 37, 36, 37, 36, 36, 37, 35, 35, + 37, 37, 37, 37, 38, 39, 40, 41, 39, 41, 40, 36, + 34, 37, 39, 42, 61, 100, -113, -90, -97, -96, -90, -87, + -88, -90, -91, -93, -89, -91, -91, -90, -90, -91, -91, -89, + -87, -90, -91, -89, -90, -89, -90, -90, -92, -92, -92, -91, + -91, -89, -90, -92, -90, -92, -93, -93, -96, -107, 119, 81, + 48, 37, 40, 44, 45, 41, 40, 38, 36, 37, 38, 37, + 37, 37, 36, 35, 37, 37, 37, 37, 39, 47, 50, 45, + 40, 41, 40, 41, 42, 44, 48, 53, 64, 98, -116, -95, + -96, -97, -87, -83, -87, -87, -88, -87, -86, -86, -87, -91, + -95, -94, -92, -88, -89, -90, -90, -88, -87, -88, -90, -94, + -92, -93, -91, -89, -89, -87, -86, -87, -90, -92, -92, -91, + -92, -100, 125, 79, 52, 51, 54, 50, 47, 47, 47, 46, + 45, 46, 44, 40, 36, 34, 34, 34, 37, 37, 37, 37, + 38, 41, 42, 42, 39, 39, 37, 35, 39, 46, 52, 53, + 68, 101, -119, -101, -101, -101, -93, -90, -89, -88, -88, -88, + -85, -89, -90, -89, -91, -93, -92, -90, -90, -90, -91, -91, + -90, -91, -93, -91, -92, -92, -89, -90, -91, -92, -95, -95, + -94, -95, -95, -96, -97, -110, 116, 81, 54, 48, 52, 51, + 49, 45, 47, 46, 43, 44, 43, 38, 35, 35, 34, 36, + 37, 37, 37, 37, 39, 43, 43, 41, 40, 42, 41, 41, + 40, 40, 44, 50, 68, 106, -112, -93, -93, -95, -92, -94, + -93, -90, -89, -90, -88, -90, -89, -88, -89, -89, -89, -86, + -88, -91, -92, -92, -91, -92, -91, -91, -92, -91, -92, -90, + -90, -91, -88, -87, -90, -92, -91, -91, -92, -104, 121, 80, + 54, 43, 45, 46, 41, 41, 40, 38, 38, 38, 37, 37, + 37, 37, 39, 40, 37, 37, 37, 37, 37, 39, 39, 40, + 38, 40, 41, 40, 41, 43, 46, 52, 69, 105, -112, -92, + -95, -94, -90, -94, -94, -92, -91, -90, -91, -90, -90, -90, + -90, -89, -88, -89, -90, -90, -93, -94, -93, -92, -91, -91, + -92, -94, -91, -91, -89, -89, -93, -95, -96, -97, -96, -96, + -96, -106, 121, 86, 54, 47, 53, 50, 48, 43, 40, 39, + 37, 40, 40, 38, 38, 36, 37, 37, 37, 37, 37, 37, + 37, 39, 38, 38, 38, 38, 37, 37, 39, 41, 42, 45, + 62, 104, -112, -93, -87, -91, -92, -92, -91, -89, -91, -89, + -90, -88, -86, -88, -90, -91, -91, -90, -91, -91, -91, -90, + -89, -90, -89, -90, -93, -91, -92, -92, -91, -92, -91, -91, + -94, -94, -92, -93, -92, -103, 124, 92, 65, 49, 47, 45, + 39, 40, 40, 40, 37, 37, 37, 37, 41, 41, 38, 38, + 37, 37, 37, 37, 38, 46, 42, 42, 40, 41, 41, 37, + 39, 43, 49, 59, 78, 112, -105, -88, -94, -93, -96, -95, + -92, -90, -88, -90, -91, -90, -88, -89, -90, -89, -90, -91, + -90, -91, -93, -93, -92, -92, -91, -91, -90, -92, -92, -92, + -93, -92, -92, -92, -94, -94, -94, -94, -93, -107, 116, 77, + 48, 43, 47, 43, 41, 40, 39, 38, 38, 42, 40, 38, + 37, 34, 34, 34, 36, 37, 37, 37, 37, 41, 41, 38, + 38, 39, 40, 39, 39, 40, 40, 45, 63, 102, -117, -98, + -92, -88, -87, -91, -90, -89, -90, -91, -93, -90, -83, -85, + -87, -88, -90, -91, -93, -92, -93, -91, -89, -89, -89, -91, + -94, -92, -91, -90, -92, -92, -92, -93, -91, -89, -90, -89, + -87, -99, 126, 86, 54, 43, 45, 46, 42, 40, 38, 36, + 34, 34, 36, 34, 35, 34, 35, 36, 36, 37, 37, 37, + 38, 43, 40, 38, 38, 40, 41, 40, 41, 41, 42, 50, + 74, 113, -113, -98, -95, -88, -88, -90, -91, -90, -90, -92, + -91, -88, -86, -87, -86, -86, -89, -91, -92, -92, -91, -88, + -90, -93, -95, -97, -97, -95, -94, -93, -92, -92, -92, -93, + -94, -94, -96, -95, -96, -111, 111, 73, 42, 39, 50, 45, + 41, 40, 38, 38, 39, 41, 38, 35, 35, 33, 30, 28, + 36, 37, 37, 37, 37, 37, 40, 38, 40, 41, 41, 43, + 42, 40, 42, 49, 74, 119, -100, -88, -94, -93, -90, -94, + -94, -91, -89, -89, -90, -89, -88, -93, -94, -91, -89, -87, + -90, -96, -98, -96, -94, -94, -92, -92, -92, -89, -88, -89, + -91, -90, -89, -88, -86, -87, -90, -93, -95, -110, 113, 79, + 59, 52, 43, 38, 38, 38, 41, 41, 39, 41, 42, 41, + 40, 40, 40, 39, 37, 37, 37, 37, 37, 39, 38, 40, + 40, 42, 40, 41, 43, 47, 50, 53, 74, 112, -114, -99, + -95, -92, -94, -95, -95, -92, -90, -91, -88, -85, -89, -88, + -87, -88, -89, -89, -91, -91, -90, -88, -91, -94, -93, -93, + -93, -94, -93, -91, -90, -90, -92, -93, -94, -92, -94, -94, + -95, -110, 113, 78, 52, 46, 49, 45, 43, 42, 43, 41, + 39, 41, 40, 38, 38, 35, 37, 39, 37, 37, 37, 37, + 37, 35, 38, 38, 41, 42, 39, 42, 43, 44, 46, 55, + 80, 119, -108, -99, -95, -91, -90, -95, -95, -92, -90, -94, + -94, -89, -88, -92, -91, -91, -93, -93, -93, -93, -91, -89, + -90, -93, -91, -89, -88, -89, -88, -89, -92, -93, -93, -93, + -92, -92, -95, -95, -97, -113, 108, 67, 48, 46, 41, 41, + 42, 39, 39, 37, 36, 38, 38, 36, 37, 39, 38, 39, + 37, 37, 37, 37, 36, 32, 34, 36, 38, 38, 38, 38, + 41, 42, 44, 50, 67, 115, -98, -89, -94, -93, -87, -86, + -91, -90, -92, -93, -92, -89, -91, -92, -90, -92, -92, -91, + -90, -90, -89, -87, -90, -93, -92, -92, -95, -94, -94, -93, + -91, -92, -94, -95, -96, -93, -93, -92, -95, -112, 107, 73, + 56, 45, 45, 44, 41, 41, 39, 38, 37, 39, 39, 37, + 38, 37, 39, 41, 37, 37, 37, 37, 37, 40, 39, 41, + 42, 42, 39, 39, 43, 47, 49, 56, 76, 112, -112, -102, + -90, -78, -88, -93, -92, -92, -90, -89, -91, -88, -86, -90, + -88, -87, -89, -91, -90, -90, -89, -90, -90, -88, -90, -89, + -89, -89, -87, -90, -91, -90, -90, -88, -90, -92, -93, -93, + -97, -112, 108, 71, 52, 48, 51, 48, 45, 40, 40, 41, + 42, 42, 41, 39, 41, 42, 39, 37, 37, 37, 37, 37, + 37, 38, 39, 40, 40, 40, 40, 42, 45, 46, 45, 51, + 72, 121, -98, -99, -100, -95, -93, -96, -95, -93, -90, -90, + -87, -89, -89, -90, -89, -90, -90, -89, -92, -94, -90, -91, + -91, -91, -90, -89, -90, -88, -90, -92, -91, -92, -93, -94, + -96, -94, -94, -95, -97, -113, 106, 71, 52, 48, 46, 45, + 45, 41, 37, 33, 33, 35, 35, 37, 38, 37, 36, 35, + 37, 37, 37, 37, 37, 37, 37, 38, 39, 39, 39, 40, + 42, 40, 42, 50, 73, 114, -107, -96, -100, -97, -100, -103, + -101, -97, -92, -89, -89, -87, -85, -88, -89, -87, -87, -88, + -88, -89, -91, -92, -89, -86, -86, -84, -86, -86, -90, -94, + -94, -93, -93, -94, -94, -93, -92, -94, -99, -115, 106, 72, + 60, 59, 57, 55, 48, 42, 39, 37, 37, 39, 37, 37, + 38, 37, 35, 33, 37, 37, 37, 37, 38, 45, 43, 42, + 39, 36, 35, 34, 38, 40, 42, 50, 76, 115, -110, -97, + -89, -88, -92, -95, -94, -91, -90, -88, -86, -87, -88, -87, + -86, -88, -88, -88, -91, -90, -89, -90, -89, -89, -91, -90, + -91, -90, -91, -93, -93, -93, -95, -97, -96, -92, -94, -97, + -100, -118, 106, 72, 54, 50, 48, 47, 46, 44, 40, 36, + 38, 40, 42, 41, 40, 38, 36, 38, 37, 37, 37, 37, + 37, 39, 41, 41, 41, 40, 41, 45, 47, 47, 46, 53, + 77, 119, -102, -90, -94, -89, -88, -94, -90, -87, -86, -85, + -87, -87, -85, -86, -86, -87, -88, -90, -90, -91, -91, -91, + -93, -91, -91, -92, -93, -93, -92, -94, -93, -90, -91, -92, + -92, -91, -94, -96, -95, -105, 114, 74, 57, 51, 50, 53, + 47, 42, 39, 37, 41, 46, 46, 43, 40, 35, 31, 29, + 37, 37, 37, 37, 38, 39, 37, 38, 39, 40, 41, 40, + 43, 46, 48, 57, 89, -126, -102, -97, -96, -93, -96, -92, + -89, -89, -91, -94, -90, -91, -90, -88, -88, -90, -90, -90, + -92, -93, -93, -92, -90, -89, -90, -89, -91, -93, -91, -92, + -93, -92, -94, -95, -92, -92, -95, -99, -100, -116, 103, 70, + 54, 52, 54, 49, 46, 43, 40, 36, 35, 39, 41, 37, + 38, 38, 38, 37, 37, 37, 37, 38, 38, 42, 43, 41, + 41, 41, 45, 45, 44, 44, 46, 56, 86, 119, -113, -96, + -91, -78, -83, -90, -90, -90, -89, -91, -92, -92, -90, -88, + -89, -91, -91, -90, -89, -89, -88, -88, -90, -90, -92, -92, + -92, -90, -90, -94, -93, -91, -91, -92, -94, -91, -90, -95, + -100, -121, 91, 58, 49, 49, 47, 45, 44, 44, 43, 41, + 40, 40, 37, 35, 35, 36, 35, 34, 37, 37, 38, 38, + 38, 42, 38, 37, 38, 37, 37, 40, 45, 45, 44, 54, + 84, 123, -106, -96, -95, -96, -99, -97, -96, -92, -91, -92, + -91, -92, -95, -94, -93, -92, -91, -89, -91, -92, -91, -91, + -92, -94, -92, -88, -89, -91, -91, -93, -94, -92, -93, -92, + -93, -92, -94, -95, -97, -118, 95, 55, 33, 34, 37, 37, + 34, 33, 33, 31, 34, 36, 36, 34, 35, 36, 37, 38, + 37, 37, 38, 38, 38, 40, 40, 42, 43, 43, 41, 41, + 40, 43, 43, 50, 77, 116, -110, -84, -81, -87, -91, -94, + -91, -88, -88, -89, -88, -88, -88, -85, -88, -89, -88, -88, + -89, -92, -91, -93, -92, -92, -94, -94, -93, -93, -94, -96, + -95, -91, -89, -88, -91, -92, -94, -98, -100, -122, 91, 57, + 43, 46, 41, 33, 36, 36, 38, 39, 39, 38, 33, 33, + 34, 34, 34, 35, 37, 38, 38, 38, 39, 44, 43, 44, + 45, 44, 40, 40, 42, 40, 46, 60, 93, -127, -103, -88, + -87, -94, -93, -96, -97, -94, -89, -90, -89, -88, -90, -90, + -91, -92, -90, -90, -91, -93, -94, -94, -94, -94, -93, -91, + -94, -96, -95, -98, -97, -94, -94, -95, -99, -98, -95, -95, + -101, -121, 95, 58, 42, 39, 44, 44, 39, 37, 41, 42, + 41, 41, 37, 33, 33, 32, 33, 33, 37, 38, 38, 38, + 38, 39, 41, 44, 44, 47, 46, 44, 41, 39, 40, 52, + 85, 127, -102, -88, -82, -87, -92, -94, -91, -90, -91, -92, + -91, -89, -91, -92, -91, -89, -87, -86, -89, -91, -92, -93, + -93, -92, -95, -98, -95, -90, -87, -90, -92, -93, -94, -98, + -99, -97, -97, -96, -98, -114, 106, 65, 40, 42, 41, 39, + 41, 41, 43, 46, 45, 43, 40, 38, 39, 40, 40, 39, + 37, 38, 38, 38, 38, 34, 37, 39, 42, 42, 41, 42, + 41, 42, 44, 58, 88, 124, -109, -98, -95, -96, -97, -95, + -95, -95, -96, -94, -91, -90, -92, -91, -90, -90, -89, -87, + -89, -92, -94, -95, -96, -95, -94, -94, -97, -98, -97, -97, + -96, -95, -96, -95, -98, -99, -98, -97, -100, -121, 90, 52, + 37, 36, 39, 41, 39, 39, 40, 38, 35, 33, 34, 35, + 34, 36, 36, 35, 37, 38, 38, 38, 38, 40, 39, 40, + 39, 40, 44, 46, 49, 53, 53, 53, 73, 108, -114, -96, + -96, -99, -100, -99, -96, -94, -95, -93, -89, -84, -88, -91, + -91, -93, -97, -97, -98, -97, -93, -92, -92, -92, -95, -95, + -94, -92, -91, -94, -96, -96, -94, -94, -94, -92, -93, -94, + -96, -115, 103, 64, 36, 38, 45, 42, 44, 41, 41, 41, + 37, 38, 42, 45, 46, 43, 39, 33, 37, 38, 38, 38, + 38, 42, 42, 38, 36, 35, 34, 36, 40, 39, 39, 49, + 82, -123, -95, -91, -87, -89, -93, -94, -95, -94, -95, -94, + -91, -92, -93, -92, -92, -94, -95, -95, -96, -94, -94, -94, + -93, -94, -92, -90, -92, -90, -91, -93, -92, -92, -91, -91, + -93, -93, -93, -93, -98, -122, 90, 54, 40, 40, 41, 40, + 38, 36, 36, 36, 39, 42, 43, 41, 38, 38, 36, 36, + 37, 38, 38, 38, 38, 41, 40, 37, 36, 38, 42, 42, + 41, 44, 41, 48, 73, 116, -103, -88, -87, -92, -96, -95, + -93, -91, -87, -85, -88, -85, -89, -93, -91, -88, -87, -85, + -87, -89, -91, -93, -92, -92, -92, -91, -94, -90, -91, -93, + -93, -94, -92, -92, -95, -93, -92, -93, -96, -116, 104, 66, + 40, 39, 37, 39, 42, 43, 43, 40, 38, 37, 36, 36, + 34, 34, 35, 35, 37, 38, 38, 38, 38, 41, 41, 38, + 37, 36, 35, 37, 42, 44, 46, 58, 91, -120, -98, -99, + -94, -89, -93, -92, -92, -93, -93, -93, -91, -89, -88, -85, + -86, -88, -89, -87, -89, -88, -90, -94, -93, -94, -94, -91, + -90, -86, -90, -94, -94, -96, -95, -95, -94, -93, -92, -91, + -97, -123, 91, 58, 48, 52, 48, 44, 43, 43, 41, 36, + 38, 42, 43, 39, 37, 34, 31, 32, 37, 38, 38, 38, + 38, 41, 40, 37, 41, 42, 41, 43, 41, 39, 45, 60, + 92, -123, -102, -102, -99, -99, -97, -92, -93, -93, -94, -94, + -96, -93, -89, -92, -91, -90, -89, -90, -88, -90, -90, -91, + -92, -92, -92, -92, -94, -90, -90, -90, -91, -91, -91, -93, + -94, -91, -92, -95, -103, -127, 92, 59, 49, 56, 53, 55, + 51, 50, 48, 43, 39, 36, 35, 35, 34, 33, 34, 37, + 37, 38, 38, 38, 38, 38, 39, 38, 40, 41, 40, 42, + 45, 45, 47, 64, 100, -118, -104, -102, -93, -95, -92, -96, + -97, -96, -96, -94, -92, -89, -90, -93, -93, -96, -97, -94, + -96, -96, -97, -98, -97, -96, -94, -94, -95, -92, -95, -94, + -94, -95, -94, -95, -96, -95, -94, -94, -97, -118, 102, 70, + 53, 53, 55, 52, 54, 52, 47, 41, 38, 39, 40, 36, + 37, 37, 35, 36, 37, 38, 38, 38, 38, 40, 39, 40, + 41, 39, 33, 33, 36, 40, 51, 64, 84, 125, -102, -87, + -81, -92, -98, -101, -98, -97, -95, -95, -95, -94, -94, -98, + -97, -94, -93, -93, -93, -92, -91, -92, -93, -93, -93, -93, + -95, -94, -94, -96, -94, -91, -91, -95, -94, -95, -98, -98, + -102, -119, 101, 71, 55, 47, 47, 48, 51, 52, 45, 38, + 34, 30, 34, 34, 32, 34, 34, 37, 37, 37, 38, 38, + 38, 41, 42, 41, 39, 41, 39, 37, 37, 37, 44, 66, + 105, -118, -105, -107, -106, -102, -101, -102, -100, -101, -101, -99, + -98, -96, -96, -98, -94, -94, -95, -94, -96, -97, -97, -96, + -96, -95, -96, -94, -96, -99, -95, -96, -98, -100, -98, -97, + -97, -94, -93, -97, -107, 123, 83, 54, 41, 45, 48, 45, + 46, 44, 43, 40, 36, 39, 36, 37, 38, 40, 41, 40, + 37, 37, 38, 38, 38, 40, 40, 43, 43, 41, 40, 42, + 42, 40, 44, 61, 90, 121, -122, -121, -117, -113, -111, -108, + -104, -104, -105, -106, -106, -102, -103, -106, -106, -107, -106, -106, + -104, -103, -101, -100, -99, -98, -99, -100, -101, -98, -95, -94, + -94, -93, -95, -95, -97, -97, -98, -97, -97, -115, 98, 58, + 40, 42, 46, 46, 47, 48, 45, 43, 42, 40, 39, 36, + 34, 35, 36, 38, 37, 37, 37, 38, 38, 37, 41, 41, + 42, 43, 40, 41, 40, 40, 42, 51, 68, 78, 81, 81, + 81, 85, 85, 87, 88, 89, 93, 96, 97, 100, 98, 101, + 105, 109, 110, 113, 116, 116, 117, 118, 119, 120, 121, 126, + -126, -126, -123, -120, -118, -117, -115, -114, -113, -110, -106, -108, + -115, 117, 81, 52, 40, 42, 47, 48, 48, 45, 42, 38, + 34, 37, 34, 36, 37, 39, 39, 38, 37, 37, 37, 38, + 38, 38, 37, 39, 41, 39, 42, 42, 40, 41, 43, 53, + 69, 71, 66, 65, 61, 57, 57, 58, 60, 62, 65, 64, + 68, 76, 71, 67, 68, 69, 75, 82, 87, 85, 85, 86, + 87, 92, 94, 94, 96, 90, 91, 95, 101, 109, 109, 114, + 115, 119, 123, 121, 117, 104, 77, 50, 37, 32, 30, 24, + 27, 35, 39, 39, 36, 38, 36, 37, 36, 34, 33, 32, + 37, 37, 37, 37, 38, 37, 41, 40, 41, 43, 41, 39, + 38, 40, 43, 49, 53, 52, 50, 50, 51, 51, 52, 54, + 49, 46, 50, 48, 47, 51, 51, 50, 48, 50, 50, 50, + 50, 50, 51, 51, 52, 52, 56, 57, 58, 59, 57, 56, + 56, 55, 52, 53, 56, 59, 60, 61, 62, 59, 54, 54, + 51, 47, 50, 47, 45, 44, 43, 40, 37, 37, 37, 39, + 43, 45, 43, 39, 36, 37, 37, 37, 39, 46, 41, 38, + 40, 40, 39, 40, 40, 38, 43, 49, 54, 54, 52, 52, + 49, 47, 47, 50, 48, 49, 52, 49, 50, 51, 48, 48, + 49, 49, 49, 51, 50, 46, 46, 50, 49, 52, 52, 47, + 48, 51, 52, 48, 50, 52, 47, 45, 46, 45, 48, 49, + 50, 48, 44, 45, 48, 50, 47, 43, 44, 44, 44, 43, + 43, 43, 41, 41, 41, 38, 36, 36, 36, 37, 37, 37, + 37, 41, 41, 39, 38, 38, 36, 36, 37, 39, 44, 48, + 50, 50, 50, 52, 52, 52, 52, 53, 50, 46, 46, 46, + 42, 43, 46, 45, 44, 46, 46, 45, 43, 45, 46, 50, + 51, 50, 51, 50, 49, 51, 51, 50, 51, 50, 49, 47, + 49, 49, 50, 52, 50, 48, 45, 46, 47, 47, 48, 47, + 45, 44, 45, 42, 38, 37, 35, 31, 29, 31, 33, 35, + 36, 36, 37, 37, 37, 39, 39, 40, 41, 42, 39, 37, + 37, 36, 40, 44, 48, 47, 45, 46, 49, 49, 49, 50, + 47, 48, 49, 48, 45, 47, 47, 49, 51, 53, 51, 49, + 48, 46, 44, 44, 43, 44, 46, 48, 49, 51, 51, 50, + 49, 49, 48, 50, 54, 56, 49, 44, 43, 44, 44, 45, + 45, 44, 45, 42, 40, 41, 42, 41, 38, 36, 37, 41, + 46, 43, 40, 37, 36, 36, 37, 37, 37, 40, 41, 40, + 39, 39, 36, 35, 37, 38, 41, 43, 45, 46, 46, 46, + 47, 45, 41, 45, 46, 47, 48, 47, 45, 44, 45, 47, + 46, 46, 46, 45, 46, 45, 43, 44, 44, 46, 51, 51, + 47, 49, 46, 44, 43, 39, 39, 42, 46, 46, 46, 44, + 43, 42, 42, 44, 44, 46, 46, 47, 45, 40, 37, 33, + 35, 40, 45, 42, 42, 42, 38, 36, 36, 36, 36, 37, + 38, 42, 42, 40, 39, 38, 38, 39, 40, 39, 38, 40, + 40, 38, 37, 38, 40, 40, 38, 39, 39, 40, 39, 36, + 34, 37, 40, 40, 41, 40, 38, 35, 36, 40, 39, 38, + 36, 36, 37, 39, 40, 40, 40, 41, 42, 42, 42, 42, + 40, 41, 41, 42, 45, 45, 42, 42, 40, 42, 46, 46, + 44, 43, 41, 39, 37, 40, 41, 37, 35, 32, 30, 31, + 36, 36, 36, 36, 37, 40, 40, 40, 39, 39, 38, 39, + 41, 42, 40, 42, 42, 41, 38, 38, 42, 39, 37, 39, + 37, 34, 35, 36, 39, 39, 41, 41, 39, 39, 36, 35, + 35, 37, 41, 45, 48, 47, 48, 45, 42, 44, 41, 41, + 42, 43, 42, 41, 40, 39, 37, 37, 37, 38, 38, 40, + 41, 42, 40, 41, 40, 39, 40, 38, 37, 39, 41, 40, + 37, 35, 32, 33, 36, 36, 36, 36, 36, 38, 39, 38, + 37, 38, 37, 37, 40, 39, 43, 48, 48, 44, 39, 38, + 40, 41, 41, 41, 42, 42, 39, 36, 35, 35, 34, 35, + 36, 38, 38, 37, 39, 38, 36, 36, 37, 39, 40, 40, + 38, 38, 37, 35, 36, 33, 34, 37, 36, 39, 39, 38, + 37, 33, 30, 32, 33, 33, 35, 36, 36, 36, 37, 35, + 37, 39, 40, 36, 35, 37, 36, 35, 36, 36, 36, 36, + 35, 31, 34, 35, 37, 38, 37, 36, 39, 42, 41, 41, + 40, 38, 36, 37, 38, 39, 40, 40, 37, 34, 34, 35, + 37, 37, 39, 39, 38, 40, 39, 41, 43, 43, 43, 40, + 39, 41, 41, 39, 35, 33, 34, 33, 36, 38, 40, 40, + 39, 40, 37, 39, 37, 34, 33, 34, 35, 35, 35, 35, + 33, 35, 34, 33, 34, 36, 37, 36, 35, 35, 34, 35, + 36, 36, 36, 36, 36, 38, 39, 40, 40, 42, 41, 40, + 43, 42, 39, 38, 35, 35, 34, 35, 37, 37, 37, 37, + 38, 37, 35, 34, 36, 39, 40, 39, 40, 41, 40, 36, + 37, 38, 34, 35, 36, 37, 39, 40, 37, 37, 37, 34, + 34, 35, 35, 37, 37, 38, 39, 42, 44, 42, 40, 41, + 40, 38, 35, 34, 34, 36, 36, 37, 39, 38, 40, 40, + 38, 36, 33, 31, 36, 36, 36, 36, 36, 36, 36, 39, + 41, 42, 41, 40, 38, 38, 37, 37, 41, 40, 39, 39, + 37, 39, 38, 39, 37, 35, 35, 35, 36, 39, 38, 38, + 38, 38, 39, 39, 39, 38, 38, 39, 40, 41, 41, 41, + 38, 38, 37, 37, 36, 38, 40, 39, 37, 35, 37, 35, + 33, 34, 35, 38, 36, 36, 38, 34, 33, 35, 36, 35, + 37, 39, 38, 38, 38, 37, 34, 31, 36, 36, 36, 36, + 36, 37, 41, 41, 39, 40, 39, 40, 41, 42, 40, 35, + 35, 36, 34, 36, 38, 38, 39, 39, 39, 39, 38, 37, + 38, 38, 36, 34, 35, 40, 44, 43, 46, 47, 40, 35, + 36, 36, 37, 37, 35, 36, 37, 35, 36, 38, 38, 39, + 39, 39, 40, 40, 38, 33, 32, 35, 36, 35, 32, 31, + 32, 34, 34, 35, 38, 39, 38, 37, 35, 36, 36, 33, + 36, 36, 36, 36, 36, 35, 31, 33, 36, 36, 37, 37, + 37, 38, 38, 39, 41, 39, 36, 36, 36, 35, 37, 34, + 34, 32, 32, 34, 35, 39, 38, 38, 39, 38, 38, 38, + 38, 36, 33, 34, 33, 34, 34, 37, 40, 40, 40, 37, + 35, 37, 38, 37, 35, 35, 36, 37, 38, 41, 43, 42, + 37, 36, 40, 39, 41, 43, 41, 36, 32, 33, 36, 37, + 40, 39, 36, 33, 36, 36, 36, 36, 37, 42, 42, 39, + 35, 35, 35, 37, 37, 38, 39, 38, 40, 40, 39, 44, + 44, 39, 40, 40, 42, 44, 42, 38, 38, 36, 35, 35, + 35, 38, 38, 35, 33, 36, 35, 35, 37, 38, 39, 38, + 38, 38, 37, 36, 33, 33, 33, 34, 37, 38, 39, 40, + 36, 31, 33, 36, 34, 37, 35, 34, 36, 37, 38, 38, + 37, 37, 35, 33, 35, 39, 36, 34, 36, 36, 36, 36, + 36, 36, 35, 36, 36, 37, 35, 37, 38, 38, 40, 41, + 42, 40, 41, 44, 42, 42, 40, 38, 39, 37, 36, 35, + 35, 34, 33, 34, 35, 36, 36, 38, 37, 37, 36, 34, + 36, 39, 40, 39, 38, 39, 37, 37, 36, 39, 40, 39, + 39, 35, 37, 37, 36, 40, 41, 40, 37, 35, 36, 36, + 37, 35, 35, 34, 32, 36, 34, 32, 31, 30, 31, 33, + 36, 36, 36, 36, 37, 37, 37, 36, 35, 38, 39, 41, + 40, 35, 36, 35, 35, 34, 34, 38, 38, 39, 40, 36, + 35, 36, 35, 36, 36, 38, 36, 39, 41, 42, 41, 41, + 40, 41, 41, 39, 38, 36, 37, 37, 35, 37, 40, 39, + 37, 37, 37, 38, 39, 43, 44, 41, 39, 39, 42, 40, + 36, 38, 34, 33, 36, 37, 41, 41, 41, 41, 41, 40, + 40, 44, 41, 38, 36, 36, 36, 37, 37, 38, 39, 39, + 38, 38, 37, 40, 40, 37, 38, 38, 37, 36, 36, 36, + 35, 39, 39, 38, 41, 38, 37, 38, 39, 41, 40, 40, + 41, 41, 41, 40, 37, 39, 40, 40, 39, 39, 36, 35, + 35, 35, 35, 35, 34, 36, 35, 37, 40, 40, 40, 38, + 36, 36, 35, 37, 36, 37, 38, 38, 38, 37, 37, 34, + 31, 33, 32, 33, 33, 33, 35, 36}; diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/math_private.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/math_private.h new file mode 100644 index 0000000..583d9a6 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/math_private.h @@ -0,0 +1,173 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +// #include +// #include + +/* A representation of a double as a union. */ +union ieee754_double { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 20; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 19; + unsigned int quiet_nan : 1; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee_nan; +}; + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */ +/* #warning USING Big Endian float word order */ +/* typedef union */ +/* { */ +/* double value; */ +/* struct */ +/* { */ +/* u_int16_t msw; */ +/* u_int16_t lsw; */ +/* } parts; */ +/* } ieeeDoubleShapeType; */ + +/* #endif */ + +/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */ +/* #warning USING Little Endian float word order */ + +typedef union { + double value; + struct { + u_int16_t lsw; + u_int16_t msw; + } parts; +} ieeeDoubleShapeType; + +/* #endif */ + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0, ix1, d) \ + { \ + ieeeDoubleShapeType ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i, d) \ + { \ + ieeeDoubleShapeType gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ + } + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i, d) \ + { \ + ieeeDoubleShapeType gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ + } + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d, ix0, ix1) \ + { \ + ieeeDoubleShapeType iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d, v) \ + { \ + ieeeDoubleShapeType sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ + } + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d, v) \ + { \ + ieeeDoubleShapeType sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ + } + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/susan.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/susan.c new file mode 100644 index 0000000..a95408b --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/susan.c @@ -0,0 +1,2869 @@ +/**********************************************************************\ + + SUSAN Version 2l by Stephen Smith + Oxford Centre for Functional Magnetic Resonance Imaging of the Brain, + Department of Clinical Neurology, Oxford University, Oxford, UK + (Previously in Computer Vision and Image Processing Group - now + Computer Vision and Electro Optics Group - DERA Chertsey, UK) + Email: steve@fmrib.ox.ac.uk + WWW: http://www.fmrib.ox.ac.uk/~steve + + (C) Crown Copyright (1995-1999), Defence Evaluation and Research Agency, + Farnborough, Hampshire, GU14 6TD, UK + DERA WWW site: + http://www.dera.gov.uk/ + DERA Computer Vision and Electro Optics Group WWW site: + http://www.dera.gov.uk/imageprocessing/dera/group_home.html + DERA Computer Vision and Electro Optics Group point of contact: + Dr. John Savage, jtsavage@dera.gov.uk, +44 1344 633203 + + A UK patent has been granted: "Method for digitally processing + images to determine the position of edges and/or corners therein for + guidance of unmanned vehicle", UK Patent 2272285. Proprietor: + Secretary of State for Defence, UK. 15 January 1997 + + This code is issued for research purposes only and remains the + property of the UK Secretary of State for Defence. This code must + not be passed on without this header information being kept + intact. This code must not be sold. + + \**********************************************************************/ + +/**********************************************************************\ + + SUSAN Version 2l + SUSAN = Smallest Univalue Segment Assimilating Nucleus + + Email: steve@fmrib.ox.ac.uk + WWW: http://www.fmrib.ox.ac.uk/~steve + + Related paper: + @article{Smith97, + author = "Smith, S.M. and Brady, J.M.", + title = "{SUSAN} - A New Approach to Low Level Image Processing", + journal = "Int. Journal of Computer Vision", + pages = "45--78", + volume = "23", + number = "1", + month = "May", + year = 1997} + + To be registered for automatic (bug) updates of SUSAN, send an email. + + Compile with: + gcc -O4 -o susan susan2l.c -lm + + See following section for different machine information. Please + report any bugs (and fixes). There are a few optional changes that + can be made in the "defines" section which follows shortly. + + Usage: type "susan" to get usage. Only PGM format files can be input + and output. Utilities such as the netpbm package and XV can be used + to convert to and from other formats. Any size of image can be + processed. + + This code is written using an emacs folding mode, making moving + around the different sections very easy. This is why there are + various marks within comments and why comments are indented. + + + SUSAN QUICK: + + This version of the SUSAN corner finder does not do all the + false-corner suppression and thus is faster and produced some false + positives, particularly on strong edges. However, because there are + less stages involving thresholds etc., the corners that are + correctly reported are usually more stable than those reported with + the full algorithm. Thus I recommend at least TRYING this algorithm + for applications where stability is important, e.g., tracking. + + THRESHOLDS: + + There are two thresholds which can be set at run-time. These are the + brightness threshold (t) and the distance threshold (d). + + SPATIAL CONTROL: d + + In SUSAN smoothing d controls the size of the Gaussian mask; its + default is 4.0. Increasing d gives more smoothing. In edge finding, + a fixed flat mask is used, either 37 pixels arranged in a "circle" + (default), or a 3 by 3 mask which gives finer detail. In corner + finding, only the larger 37 pixel mask is used; d is not + variable. In smoothing, the flat 3 by 3 mask can be used instead of + a larger Gaussian mask; this gives low smoothing and fast operation. + + BRIGHTNESS CONTROL: t + + In all three algorithms, t can be varied (default=20); this is the + main threshold to be varied. It determines the maximum difference in + greylevels between two pixels which allows them to be considered + part of the same "region" in the image. Thus it can be reduced to + give more edges or corners, i.e. to be more sensitive, and vice + versa. In smoothing, reducing t gives less smoothing, and vice + versa. Set t=10 for the test image available from the SUSAN web + page. + + ITERATIONS: + + With SUSAN smoothing, more smoothing can also be obtained by + iterating the algorithm several times. This has a different effect + from varying d or t. + + FIXED MASKS: + + 37 pixel mask: ooo 3 by 3 mask: ooo + ooooo ooo + ooooooo ooo + ooooooo + ooooooo + ooooo + ooo + + CORNER ATTRIBUTES dx, dy and I + (Only read this if you are interested in the C implementation or in + using corner attributes, e.g., for corner matching) + + Corners reported in the corner list have attributes associated with + them as well as positions. This is useful, for example, when + attempting to match corners from one image to another, as these + attributes can often be fairly unchanged between images. The + attributes are dx, dy and I. I is the value of image brightness at + the position of the corner. In the case of susan_corners_quick, dx + and dy are the first order derivatives (differentials) of the image + brightness in the x and y directions respectively, at the position + of the corner. In the case of normal susan corner finding, dx and dy + are scaled versions of the position of the centre of gravity of the + USAN with respect to the centre pixel (nucleus). + + BRIGHTNESS FUNCTION LUT IMPLEMENTATION: + (Only read this if you are interested in the C implementation) + + The SUSAN brightness function is implemented as a LUT + (Look-Up-Table) for speed. The resulting pointer-based code is a + little hard to follow, so here is a brief explanation. In + setup_brightness_lut() the LUT is setup. This mallocs enough space + for *bp and then repositions the pointer to the centre of the + malloced space. The SUSAN function e^-(x^6) or e^-(x^2) is + calculated and converted to a uchar in the range 0-100, for all + possible image brightness differences (including negative + ones). Thus bp[ 23 ] is the output for a brightness difference of 23 + greylevels. In the SUSAN algorithms this LUT is used as follows: + + p=in + (i-3)*x_size + j - 1; + p points to the first image pixel in the circular mask surrounding + point (x,y). + + cp=bp + in[ i*x_size+j ]; + cp points to a position in the LUT corresponding to the brightness + of the centre pixel (x,y). + + now for every pixel within the mask surrounding (x,y), + n+=*(cp-*p++); + the brightness difference function is found by moving the cp pointer + down by an amount equal to the value of the pixel pointed to by p, + thus subtracting the two brightness values and performing the + exponential function. This value is added to n, the running USAN + area. + + in SUSAN smoothing, the variable height mask is implemented by + multiplying the above by the moving mask pointer, reset for each new + centre pixel. + tmp = *dpt++ * *(cp-brightness); + + \**********************************************************************/ + +/**********************************************************************\ + + Success has been reported with the following: + + MACHINE OS COMPILER + + Sun 4.1.4 bundled C, gcc + + Next + + SGI IRIX SGI cc + + DEC Unix V3.2+ + + IBM RISC AIX gcc + + PC Borland 5.0 + + PC Linux gcc-2.6.3 + + PC Win32 Visual C++ 4.0 (Console Application) + + PC Win95 Visual C++ 5.0 (Console Application) + Thanks to Niu Yongsheng : + Use the FOPENB option below + + PC DOS djgpp gnu C + Thanks to Mark Pettovello + : Use the FOPENB option below + + HP HP-UX bundled cc + Thanks to Brian Dixon : + in ksh: + export CCOPTS="-Aa -D_HPUX_SOURCE | -lM" + cc -O3 -o susan susan2l.c + + \**********************************************************************/ + +/**********************************************************************\ + + SUSAN Version 2l, 12/2/99 + Changed GNUDOS option to FOPENB. + (Thanks to Niu Yongsheng .) + Took out redundant "sq=sq/2;". + + SUSAN Version 2k, 19/8/98: + In corner finding: + Changed if(yyx_size) etc. tests in smoothing. + Added a couple of free() calls for cgx and cgy. + (Thanks to geoffb@ucs.ed.ac.uk - Geoff Browitt.) + + SUSAN Version 2i, 21/7/97: + Added information about corner attributes. + + SUSAN Version 2h, 16/12/96: + Added principle (initial enhancement) option. + + SUSAN Version 2g, 2/7/96: + Minor superficial changes to code. + + SUSAN Version 2f, 16/1/96: + Added GNUDOS option (now called FOPENB; see options below). + + SUSAN Version 2e, 9/1/96: + Added -b option. + Fixed 1 pixel horizontal offset error for drawing edges. + + SUSAN Version 2d, 27/11/95: + Fixed loading of certain PGM files in get_image (again!) + + SUSAN Version 2c, 22/11/95: + Fixed loading of certain PGM files in get_image. + (Thanks to qu@San-Jose.ate.slb.com - Gongyuan Qu.) + + SUSAN Version 2b, 9/11/95: + removed "z==" error in edges routines. + + SUSAN Version 2a, 6/11/95: + Removed a few unnecessary variable declarations. + Added different machine information. + Changed "header" in get_image to char. + + SUSAN Version 2, 1/11/95: first combined version able to take any + image sizes. + + SUSAN "Versions 1", circa 1992: the various SUSAN algorithms were + developed during my doctorate within different programs and for + fixed image sizes. The algorithms themselves are virtually unaltered + between "versions 1" and the combined program, version 2. + + \**********************************************************************/ + +#include "wccfile.h" +#include "wcclibm.h" +#include "wccmalloc.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define EXP_A 184 +#define EXP_C 16249 + +float +susan_expf(float y) { + union { + float d; + struct { +#ifdef LITTLE_ENDIAN + short j, i; +#else + short i, j; +#endif + } n; + } eco; + eco.n.i = EXP_A * (y) + (EXP_C); + eco.n.j = 0; + return eco.d; +} + +float +susan_sqrtf(float val) { + float x = val / 10; + + float dx; + + float diff; + float min_tol = 0.00001f; + + int i, flag; + + flag = 0; + if (val == 0) + x = 0; + else { + __pragma_loopbound(19, 19); + for (i = 1; i < 20; i++) { + if (!flag) { + dx = (val - (x * x)) / (2.0f * x); + x = x + dx; + diff = val - (x * x); + if (fabs(diff) <= min_tol) + flag = 1; + } + } + } + return (x); +} + +/* ********** Optional settings */ + +typedef int TOTAL_TYPE; + +#define SEVEN_SUPP /* size for non-max corner suppression; SEVEN_SUPP or \ + FIVE_SUPP */ +#define MAX_CORNERS 15000 /* max corners per frame */ + +#define FTOI(a) ((a) < 0 ? ((int) (a - 0.5)) : ((int) (a + 0.5))) +#define abs(a) ((a) < 0 ? -a : a) +typedef unsigned char uchar; +typedef struct { + int x, y, info, dx, dy, I; +} corner_rep; +typedef corner_rep CORNER_LIST[MAX_CORNERS]; + +extern char susan_input[7292]; +struct wccFILE susan_file; +float susan_dt; +int susan_bt; +int susan_principle_conf; +int susan_thin_post_proc; +int susan_three_by_three; +int susan_drawing_mode; +int susan_susan_quick; +int susan_max_no_corners; +int susan_max_no_edges; + +int +susan_getint(struct wccFILE *fd) { + int c, i; + char dummy[10000]; + + c = susan_wccfgetc(fd); + __pragma_loopbound(0, 3); + while (1) { /* find next integer */ + if (c == '#') /* if we're at a comment, read to end of line */ + susan_wccfgets(dummy, 9000, fd); + if (c == EOF) { + /* "Image is not binary PGM." */ + } + if (c >= '0' && c <= '9') + break; /* found what we were looking for */ + c = susan_wccfgetc(fd); + } + + /* we're at the start of a number, continue until we hit a non-number */ + i = 0; + __pragma_loopbound(1, 2); + while (1) { + i = (i * 10) + (c - '0'); + c = susan_wccfgetc(fd); + if (c == EOF) + return (i); + if (c < '0' || c > '9') + break; + } + + return (i); +} + +void +susan_get_image(struct wccFILE *fd, unsigned char **in, int *x_size, + int *y_size) { + char header[100]; + + susan_wccfseek(fd, 0, WCCSEEK_SET); + + /* {{{ read header */ + + header[0] = susan_wccfgetc(fd); + header[1] = susan_wccfgetc(fd); + if (!(header[0] == 'P' && header[1] == '5')) { + /* "Image does not have binary PGM header." */ + } + + *x_size = susan_getint(fd); + *y_size = susan_getint(fd); + // dummy read + susan_getint(fd); + + /* }}} */ + + *in = (uchar *) susan_wccmalloc(*x_size * *y_size); + + if (susan_wccfread(*in, 1, *x_size * *y_size, fd) == 0) { + /* "Image is wrong size.\n" */ + } +} + +void +susan_put_image(int x_size, int y_size) { + int i; + __pragma_loopbound(7220, 7220); + for (i = 0; i < x_size * y_size; i++) + ; +} + +void +susan_int_to_uchar(char *r, uchar *in, int size) { + int i, max_r = r[0], min_r = r[0]; + + __pragma_loopbound(0, 0); + for (i = 0; i < size; i++) { + if (r[i] > max_r) + max_r = r[i]; + if (r[i] < min_r) + min_r = r[i]; + } + + if (max_r == min_r) { + /* Should not occur in TACLeBench. */ + __pragma_loopbound(0, 0); + for (i = 0; i < size; i++) + in[i] = (uchar) (0); + + return; + } + max_r -= min_r; + + __pragma_loopbound(0, 0); + for (i = 0; i < size; i++) + in[i] = (uchar) ((int) ((int) (r[i] - min_r) * 255) / max_r); +} + +void +susan_setup_brightness_lut(uchar **bp, int thresh, int form) { + int k; + float temp; + + *bp = (unsigned char *) susan_wccmalloc(516); + *bp = *bp + 258; + + __pragma_loopbound(513, 513); + for (k = -256; k < 257; k++) { + temp = ((float) k) / ((float) thresh); + temp = temp * temp; + if (form == 6) + temp = temp * temp * temp; + temp = 100.0 * susan_expf(-temp); + *(*bp + k) = (uchar) temp; + } +} + +void +susan_principle(uchar *in, char *r, uchar *bp, int max_no, int x_size, + int y_size) { + int i, j, n; + uchar *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size * sizeof(int)); + + __pragma_loopbound(0, 0); + for (i = 3; i < y_size - 3; i++) { + __pragma_loopbound(0, 0); + for (j = 3; j < x_size - 3; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += 2; + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } +} + +void +susan_principle_small(uchar *in, char *r, uchar *bp, int max_no, int x_size, + int y_size) { + int i, j, n; + uchar *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size * sizeof(int)); + + __pragma_loopbound(0, 0); + for (i = 1; i < y_size - 1; i++) { + __pragma_loopbound(0, 0); + for (j = 1; j < x_size - 1; j++) { + n = 100; + p = in + (i - 1) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p); + p += 2; + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } +} + +uchar +susan_median(uchar *in, int i, int j, int x_size) { + int p[8], k, l, tmp; + + p[0] = in[(i - 1) * x_size + j - 1]; + p[1] = in[(i - 1) * x_size + j]; + p[2] = in[(i - 1) * x_size + j + 1]; + p[3] = in[(i) *x_size + j - 1]; + p[4] = in[(i) *x_size + j + 1]; + p[5] = in[(i + 1) * x_size + j - 1]; + p[6] = in[(i + 1) * x_size + j]; + p[7] = in[(i + 1) * x_size + j + 1]; + + __pragma_loopbound(0, 0); + for (k = 0; k < 7; k++) { + __pragma_loopbound(0, 0); + for (l = 0; l < (7 - k); l++) { + if (p[l] > p[l + 1]) { + tmp = p[l]; + p[l] = p[l + 1]; + p[l + 1] = tmp; + } + } + } + + return ((p[3] + p[4]) / 2); +} + +/* this enlarges "in" so that borders can be dealt with easily */ +void +susan_enlarge(uchar **in, uchar *tmp_image, int *x_size, int *y_size, + int border) { + int i, j; + + __pragma_loopbound(95, 95); + for (i = 0; i < *y_size; i++) { /* copy *in into tmp_image */ + susan_wccmemcpy(tmp_image + (i + border) * (*x_size + 2 * border) + + border, + *in + i * *x_size, *x_size); + } + + _Pragma( + "loopbound min 7 max 7") for (i = 0; i < border; + i++) { /* copy top and bottom rows; invert + as many as necessary */ + susan_wccmemcpy(tmp_image + (border - 1 - i) * (*x_size + 2 * border) + + border, + *in + i * *x_size, *x_size); + susan_wccmemcpy(tmp_image + + (*y_size + border + i) * (*x_size + 2 * border) + + border, + *in + (*y_size - i - 1) * *x_size, *x_size); + } + + _Pragma( + "loopbound min 7 max 7") for (i = 0; i < border; + i++) { /* copy left and right columns */ + __pragma_loopbound(109, 109); + for (j = 0; j < *y_size + 2 * border; j++) { + tmp_image[j * (*x_size + 2 * border) + border - 1 - i] = + tmp_image[j * (*x_size + 2 * border) + border + i]; + tmp_image[j * (*x_size + 2 * border) + *x_size + border + i] = + tmp_image[j * (*x_size + 2 * border) + *x_size + border - 1 - + i]; + } + } + + *x_size += 2 * border; /* alter image size */ + *y_size += 2 * border; + *in = tmp_image; /* repoint in */ +} + +void +susan_smoothing(int three_by_three, uchar *in, float dt, int x_size, int y_size, + uchar *bp) { + float temp; + int n_max, increment, mask_size, i, j, x, y, area, brightness, tmp, centre; + uchar *ip, *dp, *dpt, *cp, *out = in, *tmp_image; + TOTAL_TYPE total; + + /* {{{ setup larger image and border sizes */ + + if (three_by_three == 0) + mask_size = ((int) (1.5 * dt)) + 1; + else + mask_size = 1; + + if (dt > 15) { + /* "Distance_thresh too big for integer arithmetic." */ + // Either reduce it to <=15 or recompile with variable "total" + // as a float: see top "defines" section. + } + + if ((2 * mask_size + 1 > x_size) || (2 * mask_size + 1 > y_size)) { + /* "Mask size too big for image." */ + } + + tmp_image = (uchar *) susan_wccmalloc((x_size + mask_size * 2) * + (y_size + mask_size * 2)); + susan_enlarge(&in, tmp_image, &x_size, &y_size, mask_size); + if (three_by_three == 0) { + /* large Gaussian masks */ + /* {{{ setup distance lut */ + + n_max = (mask_size * 2) + 1; + + increment = x_size - n_max; + + dp = (unsigned char *) susan_wccmalloc(n_max * n_max); + dpt = dp; + temp = -(dt * dt); + + __pragma_loopbound(15, 15); + for (i = -mask_size; i <= mask_size; i++) { + __pragma_loopbound(15, 15); + for (j = -mask_size; j <= mask_size; j++) { + x = (int) (100.0 * + susan_expf(((float) ((i * i) + (j * j))) / temp)); + *dpt++ = (unsigned char) x; + } + } + + /* {{{ main section */ + __pragma_loopbound(95, 95); + for (i = mask_size; i < y_size - mask_size; i++) { + __pragma_loopbound(76, 76); + for (j = mask_size; j < x_size - mask_size; j++) { + area = 0; + total = 0; + dpt = dp; + ip = in + ((i - mask_size) * x_size) + j - mask_size; + centre = in[i * x_size + j]; + cp = bp + centre; + __pragma_loopbound(15, 15); + for (y = -mask_size; y <= mask_size; y++) { + __pragma_loopbound(15, 15); + for (x = -mask_size; x <= mask_size; x++) { + brightness = *ip++; + tmp = *dpt++ * *(cp - brightness); + area += tmp; + total += tmp * brightness; + } + ip += increment; + } + tmp = area - 10000; + if (tmp == 0) + *out++ = susan_median(in, i, j, x_size); + else + *out++ = ((total - (centre * 10000)) / tmp); + } + } + } else { + /* 3x3 constant mask */ + + /* {{{ main section */ + __pragma_loopbound(15, 15); // neue Änderung min max 107 + for (i = 1; i < y_size - 1; i++) { + __pragma_loopbound(15, 15); // neue Änderung min max 88 + for (j = 1; j < x_size - 1; j++) { + area = 0; + total = 0; + ip = in + ((i - 1) * x_size) + j - 1; + centre = in[i * x_size + j]; + cp = bp + centre; + + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + ip += x_size - 2; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + ip += x_size - 2; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + + tmp = area - 100; + if (tmp == 0) + *out++ = susan_median(in, i, j, x_size); + else + *out++ = (total - (centre * 100)) / tmp; + } + } + } +} + +void +susan_edge_draw(uchar *in, uchar *mid, int x_size, int y_size, + int drawing_mode) { + int i; + uchar *inp, *midp; + + if (drawing_mode == 0) { + /* mark 3x3 white block around each edge point */ + midp = mid; + __pragma_loopbound(7220, 7220); + for (i = 0; i < x_size * y_size; i++) { + if (*midp < 8) { + inp = in + (midp - mid) - x_size - 1; + *inp++ = 255; + *inp++ = 255; + *inp = 255; + inp += x_size - 2; + *inp++ = 255; + inp++; + *inp = 255; + inp += x_size - 2; + *inp++ = 255; + *inp++ = 255; + *inp = 255; + } + midp++; + } + } + + /* now mark 1 black pixel at each edge point */ + midp = mid; + __pragma_loopbound(7220, 7220); + for (i = 0; i < x_size * y_size; i++) { + if (*midp < 8) + *(in + (midp - mid)) = 0; + midp++; + } +} + +void +susan_thin(char *r, uchar *mid, int x_size, int y_size) { + int l[9], centre, b01, b12, b21, b10, p1, p2, p3, p4, b00, b02, b20, b22, m, + n, a, b, x, y, i, j; + uchar *mp; + + __pragma_loopbound(87, 87); + for (i = 4; i < y_size - 4; i++) { + __pragma_loopbound(68, 68); + for (j = 4; j < x_size - 4; j++) { + if (mid[i * x_size + j] < 8) { + centre = r[i * x_size + j]; + /* {{{ count number of neighbours */ + + mp = mid + (i - 1) * x_size + j - 1; + + n = (*mp < 8) + (*(mp + 1) < 8) + (*(mp + 2) < 8) + + (*(mp + x_size) < 8) + (*(mp + x_size + 2) < 8) + + (*(mp + x_size + x_size) < 8) + + (*(mp + x_size + x_size + 1) < 8) + + (*(mp + x_size + x_size + 2) < 8); + + /* {{{ n==0 no neighbours - remove point */ + + if (n == 0) + mid[i * x_size + j] = 100; + + /* {{{ n==1 - extend line if I can */ + + /* extension is only allowed a few times - the value of mid is + * used to control this */ + + if ((n == 1) && (mid[i * x_size + j] < 6)) { + /* find maximum neighbour weighted in direction opposite the + neighbour already present. e.g. + have: O O O weight r by 0 2 3 + X X O 0 0 4 + O O O 0 2 3 */ + + l[0] = r[(i - 1) * x_size + j - 1]; + l[1] = r[(i - 1) * x_size + j]; + l[2] = r[(i - 1) * x_size + j + 1]; + l[3] = r[(i) *x_size + j - 1]; + l[4] = 0; + l[5] = r[(i) *x_size + j + 1]; + l[6] = r[(i + 1) * x_size + j - 1]; + l[7] = r[(i + 1) * x_size + j]; + l[8] = r[(i + 1) * x_size + j + 1]; + + if (mid[(i - 1) * x_size + j - 1] < 8) { + l[0] = 0; + l[1] = 0; + l[3] = 0; + l[2] *= 2; + l[6] *= 2; + l[5] *= 3; + l[7] *= 3; + l[8] *= 4; + } else { + if (mid[(i - 1) * x_size + j] < 8) { + l[1] = 0; + l[0] = 0; + l[2] = 0; + l[3] *= 2; + l[5] *= 2; + l[6] *= 3; + l[8] *= 3; + l[7] *= 4; + } else { + if (mid[(i - 1) * x_size + j + 1] < 8) { + l[2] = 0; + l[1] = 0; + l[5] = 0; + l[0] *= 2; + l[8] *= 2; + l[3] *= 3; + l[7] *= 3; + l[6] *= 4; + } else { + if (mid[(i) *x_size + j - 1] < 8) { + l[3] = 0; + l[0] = 0; + l[6] = 0; + l[1] *= 2; + l[7] *= 2; + l[2] *= 3; + l[8] *= 3; + l[5] *= 4; + } else { + if (mid[(i) *x_size + j + 1] < 8) { + l[5] = 0; + l[2] = 0; + l[8] = 0; + l[1] *= 2; + l[7] *= 2; + l[0] *= 3; + l[6] *= 3; + l[3] *= 4; + } else { + if (mid[(i + 1) * x_size + j - 1] < 8) { + l[6] = 0; + l[3] = 0; + l[7] = 0; + l[0] *= 2; + l[8] *= 2; + l[1] *= 3; + l[5] *= 3; + l[2] *= 4; + } else { + if (mid[(i + 1) * x_size + j] < 8) { + l[7] = 0; + l[6] = 0; + l[8] = 0; + l[3] *= 2; + l[5] *= 2; + l[0] *= 3; + l[2] *= 3; + l[1] *= 4; + } else { + if (mid[(i + 1) * x_size + j + + 1] < 8) { + l[8] = 0; + l[5] = 0; + l[7] = 0; + l[6] *= 2; + l[2] *= 2; + l[1] *= 3; + l[3] *= 3; + l[0] *= 4; + } + } + } + } + } + } + } + } + + m = 0; /* find the highest point */ + __pragma_loopbound(3, 3); + for (y = 0; y < 3; y++) + _Pragma( + "loopbound min 3 max 3") for (x = 0; x < 3; + x++) if (l[y + y + y + + x] > m) { + m = l[y + y + y + x]; + a = y; + b = x; + } + + if (m > 0) { + if (mid[i * x_size + j] < 4) + mid[(i + a - 1) * x_size + j + b - 1] = 4; + else + mid[(i + a - 1) * x_size + j + b - 1] = + mid[i * x_size + j] + 1; + if ((a + a + b) < 3) { /* need to jump back in image */ + i += a - 1; + j += b - 2; + if (i < 4) + i = 4; + if (j < 4) + j = 4; + } + } + } + + /* {{{ n==2 */ + + if (n == 2) { + /* put in a bit here to straighten edges */ + b00 = + mid[(i - 1) * x_size + j - 1] < 8; /* corners of 3x3 */ + b02 = mid[(i - 1) * x_size + j + 1] < 8; + b20 = mid[(i + 1) * x_size + j - 1] < 8; + b22 = mid[(i + 1) * x_size + j + 1] < 8; + if (((b00 + b02 + b20 + b22) == 2) && + ((b00 | b22) & (b02 | b20))) { + /* case: move a point back into line. + e.g. X O X CAN become X X X + O X O O O O + O O O O O O */ + if (b00) { + if (b02) { + x = 0; + y = -1; + } else { + x = -1; + y = 0; + } + } else { + if (b02) { + x = 1; + y = 0; + } else { + x = 0; + y = 1; + } + } + if (((float) r[(i + y) * x_size + j + x] / + (float) centre) > 0.7) { + if (((x == 0) && + (mid[(i + (2 * y)) * x_size + j] > 7) && + (mid[(i + (2 * y)) * x_size + j - 1] > 7) && + (mid[(i + (2 * y)) * x_size + j + 1] > 7)) || + ((y == 0) && + (mid[(i) *x_size + j + (2 * x)] > 7) && + (mid[(i + 1) * x_size + j + (2 * x)] > 7) && + (mid[(i - 1) * x_size + j + (2 * x)] > 7))) { + mid[(i) *x_size + j] = 100; + mid[(i + y) * x_size + j + x] = + 3; /* no jumping needed */ + } + } + } else { + b01 = mid[(i - 1) * x_size + j] < 8; + b12 = mid[(i) *x_size + j + 1] < 8; + b21 = mid[(i + 1) * x_size + j] < 8; + b10 = mid[(i) *x_size + j - 1] < 8; + /* {{{ right angle ends - not currently used */ + +#ifdef IGNORETHIS + if ((b00 & b01) | (b00 & b10) | (b02 & b01) | + (b02 & b12) | (b20 & b10) | (b20 & b21) | + (b22 & b21) | (b22 & b12)) { + /* case; right angle ends. clean up. + e.g.; X X O CAN become X X O + O X O O O O + O O O O O O */ + if (((b01) & (mid[(i - 2) * x_size + j - 1] > 7) & + (mid[(i - 2) * x_size + j] > 7) & + (mid[(i - 2) * x_size + j + 1] > 7) & + ((b00 & ((2 * r[(i - 1) * x_size + j + 1]) > + centre)) | + (b02 & ((2 * r[(i - 1) * x_size + j - 1]) > + centre)))) | + ((b10) & (mid[(i - 1) * x_size + j - 2] > 7) & + (mid[(i) *x_size + j - 2] > 7) & + (mid[(i + 1) * x_size + j - 2] > 7) & + ((b00 & ((2 * r[(i + 1) * x_size + j - 1]) > + centre)) | + (b20 & ((2 * r[(i - 1) * x_size + j - 1]) > + centre)))) | + ((b12) & (mid[(i - 1) * x_size + j + 2] > 7) & + (mid[(i) *x_size + j + 2] > 7) & + (mid[(i + 1) * x_size + j + 2] > 7) & + ((b02 & ((2 * r[(i + 1) * x_size + j + 1]) > + centre)) | + (b22 & ((2 * r[(i - 1) * x_size + j + 1]) > + centre)))) | + ((b21) & (mid[(i + 2) * x_size + j - 1] > 7) & + (mid[(i + 2) * x_size + j] > 7) & + (mid[(i + 2) * x_size + j + 1] > 7) & + ((b20 & ((2 * r[(i + 1) * x_size + j + 1]) > + centre)) | + (b22 & ((2 * r[(i + 1) * x_size + j - 1]) > + centre))))) { + mid[(i) *x_size + j] = 100; + if (b10 & b20) + j -= 2; + if (b00 | b01 | b02) { + i--; + j -= 2; + } + } + } +#endif + + if (((b01 + b12 + b21 + b10) == 2) && + ((b10 | b12) & (b01 | b21)) && + ((b01 & ((mid[(i - 2) * x_size + j - 1] < 8) | + (mid[(i - 2) * x_size + j + 1] < 8))) | + (b10 & ((mid[(i - 1) * x_size + j - 2] < 8) | + (mid[(i + 1) * x_size + j - 2] < 8))) | + (b12 & ((mid[(i - 1) * x_size + j + 2] < 8) | + (mid[(i + 1) * x_size + j + 2] < 8))) | + (b21 & ((mid[(i + 2) * x_size + j - 1] < 8) | + (mid[(i + 2) * x_size + j + 1] < 8))))) { + /* case; clears odd right angles. + e.g.; O O O becomes O O O + X X O X O O + O X O O X O */ + mid[(i) *x_size + j] = 100; + i--; /* jump back */ + j -= 2; + if (i < 4) + i = 4; + if (j < 4) + j = 4; + } + } + } + + /* {{{ n>2 the thinning is done here without breaking + * connectivity */ + + if (n > 2) { + b01 = mid[(i - 1) * x_size + j] < 8; + b12 = mid[(i) *x_size + j + 1] < 8; + b21 = mid[(i + 1) * x_size + j] < 8; + b10 = mid[(i) *x_size + j - 1] < 8; + if ((b01 + b12 + b21 + b10) > 1) { + b00 = mid[(i - 1) * x_size + j - 1] < 8; + b02 = mid[(i - 1) * x_size + j + 1] < 8; + b20 = mid[(i + 1) * x_size + j - 1] < 8; + b22 = mid[(i + 1) * x_size + j + 1] < 8; + p1 = b00 | b01; + p2 = b02 | b12; + p3 = b22 | b21; + p4 = b20 | b10; + + if (((p1 + p2 + p3 + p4) - ((b01 & p2) + (b12 & p3) + + (b21 & p4) + (b10 & p1))) < + 2) { + mid[(i) *x_size + j] = 100; + i--; + j -= 2; + if (i < 4) + i = 4; + if (j < 4) + j = 4; + } + } + } + } + } + } +} + +void +susan_edges(uchar *in, char *r, uchar *mid, uchar *bp, int max_no, int x_size, + int y_size) { + float z; + int do_symmetry, i, j, m, n, a, b, x, y, w; + uchar c, *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size); + + __pragma_loopbound(89, 89); + for (i = 3; i < y_size - 3; i++) { + __pragma_loopbound(70, 70); + for (j = 3; j < x_size - 3; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += 2; + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } + + __pragma_loopbound(87, 87); + for (i = 4; i < y_size - 4; i++) { + __pragma_loopbound(68, 68); + for (j = 4; j < x_size - 4; j++) { + if (r[i * x_size + j] > 0) { + m = r[i * x_size + j]; + n = max_no - m; + cp = bp + in[i * x_size + j]; + + if (n > 600) { + p = in + (i - 3) * x_size + j - 1; + x = 0; + y = 0; + + c = *(cp - *p++); + x -= c; + y -= 3 * c; + c = *(cp - *p++); + y -= 3 * c; + c = *(cp - *p); + x += c; + y -= 3 * c; + p += x_size - 3; + + c = *(cp - *p++); + x -= 2 * c; + y -= 2 * c; + c = *(cp - *p++); + x -= c; + y -= 2 * c; + c = *(cp - *p++); + y -= 2 * c; + c = *(cp - *p++); + x += c; + y -= 2 * c; + c = *(cp - *p); + x += 2 * c; + y -= 2 * c; + p += x_size - 5; + + c = *(cp - *p++); + x -= 3 * c; + y -= c; + c = *(cp - *p++); + x -= 2 * c; + y -= c; + c = *(cp - *p++); + x -= c; + y -= c; + c = *(cp - *p++); + y -= c; + c = *(cp - *p++); + x += c; + y -= c; + c = *(cp - *p++); + x += 2 * c; + y -= c; + c = *(cp - *p); + x += 3 * c; + y -= c; + p += x_size - 6; + + c = *(cp - *p++); + x -= 3 * c; + c = *(cp - *p++); + x -= 2 * c; + c = *(cp - *p); + x -= c; + p += 2; + c = *(cp - *p++); + x += c; + c = *(cp - *p++); + x += 2 * c; + c = *(cp - *p); + x += 3 * c; + p += x_size - 6; + + c = *(cp - *p++); + x -= 3 * c; + y += c; + c = *(cp - *p++); + x -= 2 * c; + y += c; + c = *(cp - *p++); + x -= c; + y += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p++); + x += c; + y += c; + c = *(cp - *p++); + x += 2 * c; + y += c; + c = *(cp - *p); + x += 3 * c; + y += c; + p += x_size - 5; + + c = *(cp - *p++); + x -= 2 * c; + y += 2 * c; + c = *(cp - *p++); + x -= c; + y += 2 * c; + c = *(cp - *p++); + y += 2 * c; + c = *(cp - *p++); + x += c; + y += 2 * c; + c = *(cp - *p); + x += 2 * c; + y += 2 * c; + p += x_size - 3; + + c = *(cp - *p++); + x -= c; + y += 3 * c; + c = *(cp - *p++); + y += 3 * c; + c = *(cp - *p); + x += c; + y += 3 * c; + + z = susan_sqrtf((float) ((x * x) + (y * y))); + if (z > (0.9 * (float) n)) { /* 0.5 */ + do_symmetry = 0; + if (x == 0) + z = 1000000.0; + else + z = ((float) y) / ((float) x); + if (z < 0) { + z = -z; + w = -1; + } else + w = 1; + if (z < 0.5) { + /* vert_edge */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* hor_edge */ a = 1; + b = 0; + } else { + /* diag_edge */ if (w > 0) { + a = 1; + b = 1; + } else { + a = -1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b]) && + (m > r[(i + (2 * a)) * x_size + j + (2 * b)]) && + (m >= r[(i - (2 * a)) * x_size + j - (2 * b)])) + mid[i * x_size + j] = 1; + } else + do_symmetry = 1; + } else + do_symmetry = 1; + + if (do_symmetry == 1) { + p = in + (i - 3) * x_size + j - 1; + x = 0; + y = 0; + w = 0; + + /* | \ + y -x- w + | \ */ + + c = *(cp - *p++); + x += c; + y += 9 * c; + w += 3 * c; + c = *(cp - *p++); + y += 9 * c; + c = *(cp - *p); + x += c; + y += 9 * c; + w -= 3 * c; + p += x_size - 3; + + c = *(cp - *p++); + x += 4 * c; + y += 4 * c; + w += 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w += 2 * c; + c = *(cp - *p++); + y += 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w -= 2 * c; + c = *(cp - *p); + x += 4 * c; + y += 4 * c; + w -= 4 * c; + p += x_size - 5; + + c = *(cp - *p++); + x += 9 * c; + y += c; + w += 3 * c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w += 2 * c; + c = *(cp - *p++); + x += c; + y += c; + w += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p++); + x += c; + y += c; + w -= c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w -= 2 * c; + c = *(cp - *p); + x += 9 * c; + y += c; + w -= 3 * c; + p += x_size - 6; + + c = *(cp - *p++); + x += 9 * c; + c = *(cp - *p++); + x += 4 * c; + c = *(cp - *p); + x += c; + p += 2; + c = *(cp - *p++); + x += c; + c = *(cp - *p++); + x += 4 * c; + c = *(cp - *p); + x += 9 * c; + p += x_size - 6; + + c = *(cp - *p++); + x += 9 * c; + y += c; + w -= 3 * c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w -= 2 * c; + c = *(cp - *p++); + x += c; + y += c; + w -= c; + c = *(cp - *p++); + y += c; + c = *(cp - *p++); + x += c; + y += c; + w += c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w += 2 * c; + c = *(cp - *p); + x += 9 * c; + y += c; + w += 3 * c; + p += x_size - 5; + + c = *(cp - *p++); + x += 4 * c; + y += 4 * c; + w -= 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w -= 2 * c; + c = *(cp - *p++); + y += 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w += 2 * c; + c = *(cp - *p); + x += 4 * c; + y += 4 * c; + w += 4 * c; + p += x_size - 3; + + c = *(cp - *p++); + x += c; + y += 9 * c; + w -= 3 * c; + c = *(cp - *p++); + y += 9 * c; + c = *(cp - *p); + x += c; + y += 9 * c; + w += 3 * c; + + if (y == 0) + z = 1000000.0; + else + z = ((float) x) / ((float) y); + if (z < 0.5) { + /* vertical */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* horizontal */ a = 1; + b = 0; + } else { + /* diagonal */ if (w > 0) { + a = -1; + b = 1; + } else { + a = 1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b]) && + (m > r[(i + (2 * a)) * x_size + j + (2 * b)]) && + (m >= r[(i - (2 * a)) * x_size + j - (2 * b)])) + mid[i * x_size + j] = 2; + } + } + } + } +} + +void +susan_edges_small(uchar *in, char *r, uchar *mid, uchar *bp, int max_no, + int x_size, int y_size) { + float z; + int do_symmetry, i, j, m, n, a, b, x, y, w; + uchar c, *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size); + + __pragma_loopbound(0, 0); + for (i = 1; i < y_size - 1; i++) { + __pragma_loopbound(0, 0); + for (j = 1; j < x_size - 1; j++) { + n = 100; + p = in + (i - 1) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p); + p += 2; + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } + + __pragma_loopbound(0, 0); + for (i = 2; i < y_size - 2; i++) { + __pragma_loopbound(0, 0); + for (j = 2; j < x_size - 2; j++) { + if (r[i * x_size + j] > 0) { + m = r[i * x_size + j]; + n = max_no - m; + cp = bp + in[i * x_size + j]; + + if (n > 250) { + p = in + (i - 1) * x_size + j - 1; + x = 0; + y = 0; + + c = *(cp - *p++); + x -= c; + y -= c; + c = *(cp - *p++); + y -= c; + c = *(cp - *p); + x += c; + y -= c; + p += x_size - 2; + + c = *(cp - *p); + x -= c; + p += 2; + c = *(cp - *p); + x += c; + p += x_size - 2; + + c = *(cp - *p++); + x -= c; + y += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p); + x += c; + y += c; + + z = susan_sqrtf((float) ((x * x) + (y * y))); + if (z > (0.4 * (float) n)) { /* 0.6 */ + do_symmetry = 0; + if (x == 0) + z = 1000000.0; + else + z = ((float) y) / ((float) x); + if (z < 0) { + z = -z; + w = -1; + } else + w = 1; + if (z < 0.5) { + /* vert_edge */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* hor_edge */ a = 1; + b = 0; + } else { + /* diag_edge */ if (w > 0) { + a = 1; + b = 1; + } else { + a = -1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b])) + mid[i * x_size + j] = 1; + } else + do_symmetry = 1; + } else + do_symmetry = 1; + + if (do_symmetry == 1) { + p = in + (i - 1) * x_size + j - 1; + x = 0; + y = 0; + w = 0; + + /* | \ + y -x- w + | \ */ + + c = *(cp - *p++); + x += c; + y += c; + w += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p); + x += c; + y += c; + w -= c; + p += x_size - 2; + + c = *(cp - *p); + x += c; + p += 2; + c = *(cp - *p); + x += c; + p += x_size - 2; + + c = *(cp - *p++); + x += c; + y += c; + w -= c; + c = *(cp - *p++); + y += c; + c = *(cp - *p); + x += c; + y += c; + w += c; + + if (y == 0) + z = 1000000.0; + else + z = ((float) x) / ((float) y); + if (z < 0.5) { + /* vertical */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* horizontal */ a = 1; + b = 0; + } else { + /* diagonal */ if (w > 0) { + a = -1; + b = 1; + } else { + a = 1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b])) + mid[i * x_size + j] = 2; + } + } + } + } +} + +void +susan_corner_draw(uchar *in, CORNER_LIST corner_list, int x_size, + int drawing_mode) { + uchar *p; + int n = 0; + + __pragma_loopbound(0, 0); + while (corner_list[n].info != 7) { + if (drawing_mode == 0) { + p = in + (corner_list[n].y - 1) * x_size + corner_list[n].x - 1; + *p++ = 255; + *p++ = 255; + *p = 255; + p += x_size - 2; + *p++ = 255; + *p++ = 0; + *p = 255; + p += x_size - 2; + *p++ = 255; + *p++ = 255; + *p = 255; + n++; + } else { + p = in + corner_list[n].y * x_size + corner_list[n].x; + *p = 0; + n++; + } + } +} + +void +susan_corners(uchar *in, char *r, uchar *bp, int max_no, + CORNER_LIST corner_list, int x_size, int y_size) { + int n, x, y, sq, xx, yy, i, j; + float divide; + uchar c, *p, *cp; + char *cgx, *cgy; + + susan_wccmemset(r, 0, x_size * y_size); + + cgx = (char *) susan_wccmalloc(x_size * y_size); + cgy = (char *) susan_wccmalloc(x_size * y_size); + + __pragma_loopbound(85, 85); + for (i = 5; i < y_size - 5; i++) { + __pragma_loopbound(66, 66); + for (j = 5; j < x_size - 5; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + if (n < max_no) { /* do this test early and often ONLY to save + wasted computation */ + p += 2; + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 6; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 5; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - + *p++); + if (n < + max_no) { + n += + *(cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + if (n < + max_no) { + p += + x_size - + 3; + + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + + if (n < + max_no) { + x = 0; + y = 0; + p = in + + (i - + 3) * + x_size + + j - + 1; + + c = *( + cp - + *p++); + x -= + c; + y -= + 3 * + c; + c = *( + cp - + *p++); + y -= + 3 * + c; + c = *( + cp - + *p); + x += + c; + y -= + 3 * + c; + p += + x_size - + 3; + + c = *( + cp - + *p++); + x -= + 2 * + c; + y -= + 2 * + c; + c = *( + cp - + *p++); + x -= + c; + y -= + 2 * + c; + c = *( + cp - + *p++); + y -= + 2 * + c; + c = *( + cp - + *p++); + x += + c; + y -= + 2 * + c; + c = *( + cp - + *p); + x += + 2 * + c; + y -= + 2 * + c; + p += + x_size - + 5; + + c = *( + cp - + *p++); + x -= + 3 * + c; + y -= + c; + c = *( + cp - + *p++); + x -= + 2 * + c; + y -= + c; + c = *( + cp - + *p++); + x -= + c; + y -= + c; + c = *( + cp - + *p++); + y -= + c; + c = *( + cp - + *p++); + x += + c; + y -= + c; + c = *( + cp - + *p++); + x += + 2 * + c; + y -= + c; + c = *( + cp - + *p); + x += + 3 * + c; + y -= + c; + p += + x_size - + 6; + + c = *( + cp - + *p++); + x -= + 3 * + c; + c = *( + cp - + *p++); + x -= + 2 * + c; + c = *( + cp - + *p); + x -= + c; + p += + 2; + c = *( + cp - + *p++); + x += + c; + c = *( + cp - + *p++); + x += + 2 * + c; + c = *( + cp - + *p); + x += + 3 * + c; + p += + x_size - + 6; + + c = *( + cp - + *p++); + x -= + 3 * + c; + y += + c; + c = *( + cp - + *p++); + x -= + 2 * + c; + y += + c; + c = *( + cp - + *p++); + x -= + c; + y += + c; + c = *( + cp - + *p++); + y += + c; + c = *( + cp - + *p++); + x += + c; + y += + c; + c = *( + cp - + *p++); + x += + 2 * + c; + y += + c; + c = *( + cp - + *p); + x += + 3 * + c; + y += + c; + p += + x_size - + 5; + + c = *( + cp - + *p++); + x -= + 2 * + c; + y += + 2 * + c; + c = *( + cp - + *p++); + x -= + c; + y += + 2 * + c; + c = *( + cp - + *p++); + y += + 2 * + c; + c = *( + cp - + *p++); + x += + c; + y += + 2 * + c; + c = *( + cp - + *p); + x += + 2 * + c; + y += + 2 * + c; + p += + x_size - + 3; + + c = *( + cp - + *p++); + x -= + c; + y += + 3 * + c; + c = *( + cp - + *p++); + y += + 3 * + c; + c = *( + cp - + *p); + x += + c; + y += + 3 * + c; + + xx = + x * + x; + yy = + y * + y; + sq = + xx + + yy; + if (sq > + ((n * + n) / + 2)) { + if (yy < + xx) { + divide = + (float) + y / + (float) abs( + x); + sq = + abs(x) / + x; + sq = + *(cp - + in[(i + + FTOI( + divide)) * + x_size + + j + + sq]) + + *(cp - + in[(i + + FTOI( + 2 * + divide)) * + x_size + + j + + 2 * sq]) + + *(cp - + in[(i + + FTOI( + 3 * + divide)) * + x_size + + j + + 3 * sq]); + } else { + divide = + (float) + x / + (float) abs( + y); + sq = + abs(y) / + y; + sq = + *(cp - + in[(i + + sq) * + x_size + + j + + FTOI( + divide)]) + + *(cp - + in[(i + + 2 * sq) * + x_size + + j + + FTOI( + 2 * + divide)]) + + *(cp - + in[(i + + 3 * sq) * + x_size + + j + + FTOI( + 3 * + divide)]); + } + + if (sq > + 290) { + r[i * x_size + + j] = + max_no - + n; + cgx[i * x_size + + j] = + (51 * + x) / + n; + cgy[i * x_size + + j] = + (51 * + y) / + n; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + /* to locate the local maxima */ + n = 0; + __pragma_loopbound(85, 85); + for (i = 5; i < y_size - 5; i++) { + __pragma_loopbound(66, 66); + for (j = 5; j < x_size - 5; j++) { + x = r[i * x_size + j]; + if (x > 0) { +/* 5x5 mask */ +#ifdef FIVE_SUPP + if ((x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i) *x_size + j + 1]) && + (x > r[(i) *x_size + j + 2]) && + (x > r[(i + 1) * x_size + j - 1]) && + (x > r[(i + 1) * x_size + j]) && + (x > r[(i + 1) * x_size + j + 1]) && + (x > r[(i + 1) * x_size + j + 2]) && + (x > r[(i + 2) * x_size + j - 2]) && + (x > r[(i + 2) * x_size + j - 1]) && + (x > r[(i + 2) * x_size + j]) && + (x > r[(i + 2) * x_size + j + 1]) && + (x > r[(i + 2) * x_size + j + 2]) && + (x >= r[(i - 2) * x_size + j - 2]) && + (x >= r[(i - 2) * x_size + j - 1]) && + (x >= r[(i - 2) * x_size + j]) && + (x >= r[(i - 2) * x_size + j + 1]) && + (x >= r[(i - 2) * x_size + j + 2]) && + (x >= r[(i - 1) * x_size + j - 2]) && + (x >= r[(i - 1) * x_size + j - 1]) && + (x >= r[(i - 1) * x_size + j]) && + (x >= r[(i - 1) * x_size + j + 1]) && + (x >= r[(i) *x_size + j - 2]) && + (x >= r[(i) *x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j - 2])) +#endif +#ifdef SEVEN_SUPP + if ((x > r[(i - 3) * x_size + j - 3]) && + (x > r[(i - 3) * x_size + j - 2]) && + (x > r[(i - 3) * x_size + j - 1]) && + (x > r[(i - 3) * x_size + j]) && + (x > r[(i - 3) * x_size + j + 1]) && + (x > r[(i - 3) * x_size + j + 2]) && + (x > r[(i - 3) * x_size + j + 3]) && + + (x > r[(i - 2) * x_size + j - 3]) && + (x > r[(i - 2) * x_size + j - 2]) && + (x > r[(i - 2) * x_size + j - 1]) && + (x > r[(i - 2) * x_size + j]) && + (x > r[(i - 2) * x_size + j + 1]) && + (x > r[(i - 2) * x_size + j + 2]) && + (x > r[(i - 2) * x_size + j + 3]) && + + (x > r[(i - 1) * x_size + j - 3]) && + (x > r[(i - 1) * x_size + j - 2]) && + (x > r[(i - 1) * x_size + j - 1]) && + (x > r[(i - 1) * x_size + j]) && + (x > r[(i - 1) * x_size + j + 1]) && + (x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i - 1) * x_size + j + 3]) && + + (x > r[(i) *x_size + j - 3]) && + (x > r[(i) *x_size + j - 2]) && + (x > r[(i) *x_size + j - 1]) && + (x >= r[(i) *x_size + j + 1]) && + (x >= r[(i) *x_size + j + 2]) && + (x >= r[(i) *x_size + j + 3]) && + + (x >= r[(i + 1) * x_size + j - 3]) && + (x >= r[(i + 1) * x_size + j - 2]) && + (x >= r[(i + 1) * x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j]) && + (x >= r[(i + 1) * x_size + j + 1]) && + (x >= r[(i + 1) * x_size + j + 2]) && + (x >= r[(i + 1) * x_size + j + 3]) && + + (x >= r[(i + 2) * x_size + j - 3]) && + (x >= r[(i + 2) * x_size + j - 2]) && + (x >= r[(i + 2) * x_size + j - 1]) && + (x >= r[(i + 2) * x_size + j]) && + (x >= r[(i + 2) * x_size + j + 1]) && + (x >= r[(i + 2) * x_size + j + 2]) && + (x >= r[(i + 2) * x_size + j + 3]) && + + (x >= r[(i + 3) * x_size + j - 3]) && + (x >= r[(i + 3) * x_size + j - 2]) && + (x >= r[(i + 3) * x_size + j - 1]) && + (x >= r[(i + 3) * x_size + j]) && + (x >= r[(i + 3) * x_size + j + 1]) && + (x >= r[(i + 3) * x_size + j + 2]) && + (x >= r[(i + 3) * x_size + j + 3])) +#endif + { + corner_list[n].info = 0; + corner_list[n].x = j; + corner_list[n].y = i; + corner_list[n].dx = cgx[i * x_size + j]; + corner_list[n].dy = cgy[i * x_size + j]; + corner_list[n].I = in[i * x_size + j]; + n++; + if (n == MAX_CORNERS) { + /* "Too many corners." */ + } + } + } + } + } + corner_list[n].info = 7; +} + +void +susan_corners_quick(uchar *in, char *r, uchar *bp, int max_no, + CORNER_LIST corner_list, int x_size, int y_size) { + int n, x, y, i, j; + uchar *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size); + + __pragma_loopbound(0, 0); + for (i = 7; i < y_size - 7; i++) { + __pragma_loopbound(0, 0); + for (j = 7; j < x_size - 7; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + if (n < max_no) { + p += 2; + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 6; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 5; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - + *p++); + if (n < + max_no) { + n += + *(cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + if (n < + max_no) { + p += + x_size - + 3; + + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + + if (n < + max_no) + r[i * x_size + + j] = + max_no - + n; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + /* to locate the local maxima */ + n = 0; + __pragma_loopbound(0, 0); + for (i = 7; i < y_size - 7; i++) { + __pragma_loopbound(0, 0); + for (j = 7; j < x_size - 7; j++) { + x = r[i * x_size + j]; + if (x > 0) { +/* 5x5 mask */ +#ifdef FIVE_SUPP + if ((x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i) *x_size + j + 1]) && + (x > r[(i) *x_size + j + 2]) && + (x > r[(i + 1) * x_size + j - 1]) && + (x > r[(i + 1) * x_size + j]) && + (x > r[(i + 1) * x_size + j + 1]) && + (x > r[(i + 1) * x_size + j + 2]) && + (x > r[(i + 2) * x_size + j - 2]) && + (x > r[(i + 2) * x_size + j - 1]) && + (x > r[(i + 2) * x_size + j]) && + (x > r[(i + 2) * x_size + j + 1]) && + (x > r[(i + 2) * x_size + j + 2]) && + (x >= r[(i - 2) * x_size + j - 2]) && + (x >= r[(i - 2) * x_size + j - 1]) && + (x >= r[(i - 2) * x_size + j]) && + (x >= r[(i - 2) * x_size + j + 1]) && + (x >= r[(i - 2) * x_size + j + 2]) && + (x >= r[(i - 1) * x_size + j - 2]) && + (x >= r[(i - 1) * x_size + j - 1]) && + (x >= r[(i - 1) * x_size + j]) && + (x >= r[(i - 1) * x_size + j + 1]) && + (x >= r[(i) *x_size + j - 2]) && + (x >= r[(i) *x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j - 2])) +#endif +#ifdef SEVEN_SUPP + if ((x > r[(i - 3) * x_size + j - 3]) && + (x > r[(i - 3) * x_size + j - 2]) && + (x > r[(i - 3) * x_size + j - 1]) && + (x > r[(i - 3) * x_size + j]) && + (x > r[(i - 3) * x_size + j + 1]) && + (x > r[(i - 3) * x_size + j + 2]) && + (x > r[(i - 3) * x_size + j + 3]) && + + (x > r[(i - 2) * x_size + j - 3]) && + (x > r[(i - 2) * x_size + j - 2]) && + (x > r[(i - 2) * x_size + j - 1]) && + (x > r[(i - 2) * x_size + j]) && + (x > r[(i - 2) * x_size + j + 1]) && + (x > r[(i - 2) * x_size + j + 2]) && + (x > r[(i - 2) * x_size + j + 3]) && + + (x > r[(i - 1) * x_size + j - 3]) && + (x > r[(i - 1) * x_size + j - 2]) && + (x > r[(i - 1) * x_size + j - 1]) && + (x > r[(i - 1) * x_size + j]) && + (x > r[(i - 1) * x_size + j + 1]) && + (x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i - 1) * x_size + j + 3]) && + + (x > r[(i) *x_size + j - 3]) && + (x > r[(i) *x_size + j - 2]) && + (x > r[(i) *x_size + j - 1]) && + (x >= r[(i) *x_size + j + 1]) && + (x >= r[(i) *x_size + j + 2]) && + (x >= r[(i) *x_size + j + 3]) && + + (x >= r[(i + 1) * x_size + j - 3]) && + (x >= r[(i + 1) * x_size + j - 2]) && + (x >= r[(i + 1) * x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j]) && + (x >= r[(i + 1) * x_size + j + 1]) && + (x >= r[(i + 1) * x_size + j + 2]) && + (x >= r[(i + 1) * x_size + j + 3]) && + + (x >= r[(i + 2) * x_size + j - 3]) && + (x >= r[(i + 2) * x_size + j - 2]) && + (x >= r[(i + 2) * x_size + j - 1]) && + (x >= r[(i + 2) * x_size + j]) && + (x >= r[(i + 2) * x_size + j + 1]) && + (x >= r[(i + 2) * x_size + j + 2]) && + (x >= r[(i + 2) * x_size + j + 3]) && + + (x >= r[(i + 3) * x_size + j - 3]) && + (x >= r[(i + 3) * x_size + j - 2]) && + (x >= r[(i + 3) * x_size + j - 1]) && + (x >= r[(i + 3) * x_size + j]) && + (x >= r[(i + 3) * x_size + j + 1]) && + (x >= r[(i + 3) * x_size + j + 2]) && + (x >= r[(i + 3) * x_size + j + 3])) +#endif + { + corner_list[n].info = 0; + corner_list[n].x = j; + corner_list[n].y = i; + x = in[(i - 2) * x_size + j - 2] + + in[(i - 2) * x_size + j - 1] + + in[(i - 2) * x_size + j] + + in[(i - 2) * x_size + j + 1] + + in[(i - 2) * x_size + j + 2] + + in[(i - 1) * x_size + j - 2] + + in[(i - 1) * x_size + j - 1] + + in[(i - 1) * x_size + j] + + in[(i - 1) * x_size + j + 1] + + in[(i - 1) * x_size + j + 2] + + in[(i) *x_size + j - 2] + in[(i) *x_size + j - 1] + + in[(i) *x_size + j] + in[(i) *x_size + j + 1] + + in[(i) *x_size + j + 2] + + in[(i + 1) * x_size + j - 2] + + in[(i + 1) * x_size + j - 1] + + in[(i + 1) * x_size + j] + + in[(i + 1) * x_size + j + 1] + + in[(i + 1) * x_size + j + 2] + + in[(i + 2) * x_size + j - 2] + + in[(i + 2) * x_size + j - 1] + + in[(i + 2) * x_size + j] + + in[(i + 2) * x_size + j + 1] + + in[(i + 2) * x_size + j + 2]; + + corner_list[n].I = x / 25; + /*corner_list[ n ].I=in[ i*x_size+j ];*/ + x = in[(i - 2) * x_size + j + 2] + + in[(i - 1) * x_size + j + 2] + + in[(i) *x_size + j + 2] + + in[(i + 1) * x_size + j + 2] + + in[(i + 2) * x_size + j + 2] - + (in[(i - 2) * x_size + j - 2] + + in[(i - 1) * x_size + j - 2] + + in[(i) *x_size + j - 2] + + in[(i + 1) * x_size + j - 2] + + in[(i + 2) * x_size + j - 2]); + x += x + in[(i - 2) * x_size + j + 1] + + in[(i - 1) * x_size + j + 1] + + in[(i) *x_size + j + 1] + + in[(i + 1) * x_size + j + 1] + + in[(i + 2) * x_size + j + 1] - + (in[(i - 2) * x_size + j - 1] + + in[(i - 1) * x_size + j - 1] + + in[(i) *x_size + j - 1] + + in[(i + 1) * x_size + j - 1] + + in[(i + 2) * x_size + j - 1]); + + y = in[(i + 2) * x_size + j - 2] + + in[(i + 2) * x_size + j - 1] + + in[(i + 2) * x_size + j] + + in[(i + 2) * x_size + j + 1] + + in[(i + 2) * x_size + j + 2] - + (in[(i - 2) * x_size + j - 2] + + in[(i - 2) * x_size + j - 1] + + in[(i - 2) * x_size + j] + + in[(i - 2) * x_size + j + 1] + + in[(i - 2) * x_size + j + 2]); + y += y + in[(i + 1) * x_size + j - 2] + + in[(i + 1) * x_size + j - 1] + + in[(i + 1) * x_size + j] + + in[(i + 1) * x_size + j + 1] + + in[(i + 1) * x_size + j + 2] - + (in[(i - 1) * x_size + j - 2] + + in[(i - 1) * x_size + j - 1] + + in[(i - 1) * x_size + j] + + in[(i - 1) * x_size + j + 1] + + in[(i - 1) * x_size + j + 2]); + corner_list[n].dx = x / 15; + corner_list[n].dy = y / 15; + n++; + if (n == MAX_CORNERS) { + /* "Too many corners." */ + } + } + } + } + } + corner_list[n].info = 7; +} + +void +susan_call_susan(struct wccFILE *inputFile, int mode) { + uchar *in, *bp, *mid; + int x_size, y_size; + char *r; + CORNER_LIST corner_list; + + susan_get_image(inputFile, &in, &x_size, &y_size); + + if (susan_dt < 0) + susan_three_by_three = 1; + if ((susan_principle_conf == 1) && (mode == 0)) + mode = 1; + + switch (mode) { + case 0: + /* {{{ smoothing */ + + susan_setup_brightness_lut(&bp, susan_bt, 2); + susan_smoothing(susan_three_by_three, in, susan_dt, x_size, y_size, bp); + + break; + case 1: + /* {{{ edges */ + + r = (char *) susan_wccmalloc(x_size * y_size); + susan_setup_brightness_lut(&bp, susan_bt, 6); + + if (susan_principle_conf) { + if (susan_three_by_three) + susan_principle_small(in, r, bp, susan_max_no_edges, x_size, + y_size); + else + susan_principle(in, r, bp, susan_max_no_edges, x_size, y_size); + susan_int_to_uchar(r, in, x_size * y_size); + } else { + mid = (uchar *) susan_wccmalloc(x_size * y_size); + susan_wccmemset(mid, 100, + x_size * y_size); /* note not set to zero */ + + if (susan_three_by_three) + susan_edges_small(in, r, mid, bp, susan_max_no_edges, x_size, + y_size); + else + susan_edges(in, r, mid, bp, susan_max_no_edges, x_size, y_size); + if (susan_thin_post_proc) + susan_thin(r, mid, x_size, y_size); + susan_edge_draw(in, mid, x_size, y_size, susan_drawing_mode); + } + + break; + case 2: + /* {{{ corners */ + + r = (char *) susan_wccmalloc(x_size * y_size); + susan_setup_brightness_lut(&bp, susan_bt, 6); + + if (susan_principle_conf) { + susan_principle(in, r, bp, susan_max_no_corners, x_size, y_size); + susan_int_to_uchar(r, in, x_size * y_size); + } else { + if (susan_susan_quick) + susan_corners_quick(in, r, bp, susan_max_no_corners, + corner_list, x_size, y_size); + else + susan_corners(in, r, bp, susan_max_no_corners, corner_list, + x_size, y_size); + susan_corner_draw(in, corner_list, x_size, susan_drawing_mode); + } + + break; + } + + susan_put_image(x_size, y_size); +} + +void +susan_init(void) { + volatile int a = 0; + susan_file.data = susan_input; + susan_file.size = 7292; + susan_file.size += a; + susan_file.cur_pos = 0; + susan_file.cur_pos += a; + + susan_dt = 4.0; + susan_dt += a; + susan_bt = 20; + susan_bt += a; + susan_principle_conf = 0; + susan_principle_conf += a; + susan_thin_post_proc = 1; + susan_thin_post_proc += a; + susan_three_by_three = 0; + susan_three_by_three += a; + susan_drawing_mode = 0; + susan_drawing_mode += a; + susan_susan_quick = 0; + susan_susan_quick += a; + susan_max_no_corners = 50; + susan_max_no_corners += a; + susan_max_no_edges = 50; + susan_max_no_edges += a; + + // mode=0; /* Smoothing mode */ + // mode=1; /* Edges mode */ + // mode=2; /* Corners mode */ + + // principle=1; /* Output initial enhancement image only; corners or edges + // mode (default is edges mode) */ thin_post_proc=0; /* No post-processing + // on the binary edge map (runs much faster); edges mode */ drawing_mode=1; + // /* Mark corners/edges with single black points instead of black with + // white border; corners or edges mode */ three_by_three=1; /* Use flat 3x3 + // mask, edges or smoothing mode */ susan_quick=1; /* Use faster (and + // usually stabler) corner mode; edge-like corner suppression not carried + // out; corners mode */ dt=10.0; /* Distance threshold, smoothing mode, + // (default=4) */ bt=50; /* Brightness threshold, all modes, (default=20) */ +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +susan_main(void) { + susan_call_susan(&susan_file, 0); + susan_wccfreeall(); + susan_call_susan(&susan_file, 1); + susan_wccfreeall(); + susan_call_susan(&susan_file, 2); + susan_wccfreeall(); +} + +int +susan_return(void) { + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + susan_init(); + susan_main(); + + return susan_return(); +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.c new file mode 100644 index 0000000..e898e65 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.c @@ -0,0 +1,80 @@ +#include "wccfile.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define EOF -1 + +size_t +susan_wccfread(void *ptr, size_t size, size_t count, struct wccFILE *stream) { + if (susan_wccfeof(stream)) + return EOF; + + unsigned i = stream->cur_pos, i2 = 0; + size_t number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(7220, 7220); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +int +susan_wccfgetc(struct wccFILE *stream) { + if (susan_wccfeof(stream)) + return EOF; + + else + return stream->data[stream->cur_pos++]; +} + +char * +susan_wccfgets(char *str, int num, struct wccFILE *stream) { + if (!stream || susan_wccfeof(stream) || !str || num <= 0) + return 0; + + int pos = 0; + __pragma_loopbound(57, 57); + while (pos < num - 1 && !susan_wccfeof(stream)) { + str[pos] = stream->data[stream->cur_pos]; + if (str[pos] == '\n') + break; + + stream->cur_pos++; + pos++; + } + str[pos++] = '\0'; + + return str; +} + +int +susan_wccfseek(struct wccFILE *stream, long int offset, enum _Origin_ origin) { + if (origin == WCCSEEK_SET) { + stream->cur_pos = offset; + return 0; + } else if (origin == WCCSEEK_CUR) { + stream->cur_pos += offset; + return 0; + } else if (origin == WCCSEEK_END) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +int +susan_wccfgetpos(struct wccFILE *stream, unsigned *position) { + *position = stream->cur_pos; + return 0; +} + +int +susan_wccfeof(struct wccFILE *stream) { + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.h new file mode 100644 index 0000000..6621c19 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccfile.h @@ -0,0 +1,25 @@ + +#ifndef WCC_FILE_H +#define WCC_FILE_H + +enum _Origin_ { WCCSEEK_SET, WCCSEEK_CUR, WCCSEEK_END }; +typedef enum _Origin_ Origin; +typedef unsigned int size_t; + +#define EOF -1 + +struct wccFILE { + char *data; + size_t size; + unsigned cur_pos; +}; + +size_t susan_wccfread(void *ptr, size_t size, size_t count, + struct wccFILE *stream); +int susan_wccfseek(struct wccFILE *stream, long int offset, Origin origin); +int susan_wccfgetpos(struct wccFILE *stream, unsigned *position); +int susan_wccfeof(struct wccFILE *stream); +int susan_wccfgetc(struct wccFILE *stream); +char *susan_wccfgets(char *str, int num, struct wccFILE *stream); + +#endif diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.c new file mode 100644 index 0000000..2b57a60 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.c @@ -0,0 +1,483 @@ +#include "wcclibm.h" +#include "math_private.h" + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t susan_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float + /* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ + /* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ + /* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ + susan_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + susan_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + susan_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + susan_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + susan_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + susan_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + susan_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t +susan___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - susan_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - susan_pio2_1t; + y[1] = (z - y[0]) - susan_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= susan_pio2_2; + y[0] = z - susan_pio2_2t; + y[1] = (z - y[0]) - susan_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + susan_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + susan_pio2_1t; + y[1] = (z - y[0]) + susan_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += susan_pio2_2; + y[0] = z + susan_pio2_2t; + y[1] = (z - y[0]) + susan_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf(x); + n = (int32_t) (t * susan_invpio2 + susan_half); + fn = (float) n; + r = t - fn * susan_pio2_1; + w = fn * susan_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && (int32_t) (ix & 0xffffff00) != susan_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * susan_pio2_2; + r = t - w; + w = fn * susan_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * susan_pio2_3; + r = t - w; + w = fn * susan_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + y[0] = y[1] = x - x; + return 0; /* dummy initialisation */ + return 0; /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + +static const float + /* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ + susan_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + susan_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + susan_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + susan_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + susan_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + susan_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float +susan___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return susan_one; /* generate inexact */ + } + z = x * x; + r = z * + (susan_C1 + + z * (susan_C2 + + z * (susan_C3 + z * (susan_C4 + z * (susan_C5 + z * susan_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return susan_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = susan_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + +static const float + /* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ + susan_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + susan_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + susan_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + susan_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + susan_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + susan_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float +susan___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = susan_S2 + + z * (susan_S3 + z * (susan_S4 + z * (susan_S5 + z * susan_S6))); + if (iy == 0) + return x + v * (susan_S1 + z * r); + else + return x - ((z * (susan_half * y - v * r) - y) - v * susan_S1); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + +static const float susan_atanhi[] = { + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +static const float susan_atanlo[] = { + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +static const float susan_aT[] = { + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +float +susan___atanf(float x) { + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix >= 0x50800000) { /* if |x| >= 2^34 */ + if (ix > 0x7f800000) + return x + x; /* NaN */ + if (hx > 0) + return susan_atanhi[3] + susan_atanlo[3]; + else + return -susan_atanhi[3] - susan_atanlo[3]; + } + if (ix < 0x3ee00000) { /* |x| < 0.4375 */ + if (ix < 0x31000000) { /* |x| < 2^-29 */ + if (susan_huge + x > susan_one) + return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf(x); + if (ix < 0x3f980000) { /* |x| < 1.1875 */ + if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ((float) 2.0f * x - susan_one) / ((float) 2.0f + x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = (x - susan_one) / (x + susan_one); + } + } else { + if (ix < 0x401c0000) { /* |x| < 2.4375 */ + id = 2; + x = (x - (float) 1.5f) / (susan_one + (float) 1.5f * x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -(float) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * + (susan_aT[0] + + w * (susan_aT[2] + + w * (susan_aT[4] + + w * (susan_aT[6] + w * (susan_aT[8] + w * susan_aT[10]))))); + s2 = w * (susan_aT[1] + + w * (susan_aT[3] + + w * (susan_aT[5] + w * (susan_aT[7] + w * susan_aT[9])))); + if (id < 0) + return x - x * (s1 + s2); + else { + z = susan_atanhi[id] - ((x * (s1 + s2) - susan_atanlo[id]) - x); + return (hx < 0) ? -z : z; + } +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +float +susan___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return susan___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = susan___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return susan___kernel_cosf(y[0], y[1]); + case 1: + return -susan___kernel_sinf(y[0], y[1], 1); + case 2: + return -susan___kernel_cosf(y[0], y[1]); + default: + return susan___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +float +susan___sinf(float x) { + float y[2], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return susan___kernel_sinf(x, z, 0); + + /* sin(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = susan___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return susan___kernel_sinf(y[0], y[1], 1); + case 1: + return susan___kernel_cosf(y[0], y[1]); + case 2: + return -susan___kernel_sinf(y[0], y[1], 1); + default: + return -susan___kernel_cosf(y[0], y[1]); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +float +susan___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.h new file mode 100644 index 0000000..bf94aba --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wcclibm.h @@ -0,0 +1,54 @@ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +// Often used variables/consts +#ifdef __STDC__ +static const float +#else +static float +#endif + susan_one = 1.0f, + susan_half = 5.0000000000e-01f, /* 0x3f000000 */ + susan_zero = 0.0f, susan_huge = 1.0e30, + susan_two8 = 2.5600000000e+02f, /* 0x43800000 */ + susan_twon8 = 3.9062500000e-03f; /* 0x3b800000 */ + +// The following defines map the math functions to specialized calls +#define acos susan___ieee754_acosf +#define atan susan___atanf +#define cos susan___cosf +#define fabs susan___fabsf +#define fabsf susan___fabsf +#define isinf susan___isinff +#define pow susan___ieee754_powf +#define sqrt susan___ieee754_sqrtf +#define log10 susan___ieee754_log10f +#define log susan___ieee754_logf +#define sin susan___sinf + +float susan___atanf(float x); +float susan___copysignf(float x, float y); +float susan___cosf(float x); +float susan___fabsf(float x); +float susan___floorf(float x); +float susan___ieee754_acosf(float x); +float susan___ieee754_powf(float x, float y); +int32_t susan___ieee754_rem_pio2f(float x, float *y); +float susan___ieee754_sqrtf(float x); +int susan___isinff(float x); +float susan___kernel_cosf(float x, float y); +float susan___kernel_sinf(float x, float y, int iy); +int susan___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2); +float susan___scalbnf(float x, int n); +float susan___ieee754_logf(float x); +float susan___ieee754_log10f(float x); +float susan___sinf(float x); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.c new file mode 100644 index 0000000..151b129 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.c @@ -0,0 +1,56 @@ +#include "wccmalloc.h" + +// This must be redefined for each new benchmark + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define HEAP_SIZE 30000 + +char susan_simulated_heap[HEAP_SIZE]; +unsigned int susan_freeHeapPos; + +void * +susan_wccmalloc(unsigned int numberOfBytes) { + // Get a 4-byte adress for alignment purposes + unsigned int offset = + ((unsigned long) susan_simulated_heap + susan_freeHeapPos) % 4; + if (offset) + susan_freeHeapPos += 4 - offset; + void *currentPos = (void *) &susan_simulated_heap[susan_freeHeapPos]; + susan_freeHeapPos += numberOfBytes; + return currentPos; +} +void +susan_wccfreeall(void) { + susan_freeHeapPos = 0; +} + +void * +susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len) { + unsigned long int dstp = (long int) dstpp; + unsigned long int srcp = (long int) srcpp; + + __pragma_loopbound(76, 76); + while (len > 0) { + char __x = ((char *) srcp)[0]; + srcp += 1; + len -= 1; + ((char *) dstp)[0] = __x; + dstp += 1; + } + + return dstpp; +} + +void +susan_wccmemset(void *p, int value, unsigned int num) { + unsigned long i; + char *char_ptr = (char *) p; + + __pragma_loopbound(7220, 7220); + for (i = 0; i < num; ++i) + *char_ptr++ = (unsigned char) value; +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.h new file mode 100644 index 0000000..2c449fa --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/default/wccmalloc.h @@ -0,0 +1,11 @@ + +#ifndef _WCCMALLOC_H +#define _WCCMALLOC_H + +void *susan_wccmalloc(unsigned int numberOfBytes); +//! Frees ALL allocated memory space +void susan_wccfreeall(void); +void *susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len); +void susan_wccmemset(void *p, int value, unsigned int num); + +#endif diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/input.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/input.c new file mode 100644 index 0000000..9b6718d --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/input.c @@ -0,0 +1,610 @@ + +char susan_input[7292] = { + 80, 53, 10, 35, 32, 67, 82, 69, 65, 84, 79, 82, + 58, 32, 88, 86, 32, 86, 101, 114, 115, 105, 111, 110, + 32, 51, 46, 49, 48, 97, 32, 32, 82, 101, 118, 58, + 32, 49, 50, 47, 50, 57, 47, 57, 52, 32, 40, 80, + 78, 71, 32, 112, 97, 116, 99, 104, 32, 49, 46, 50, + 41, 10, 55, 54, 32, 57, 53, 10, 50, 53, 53, 10, + 35, 36, 36, 36, 36, 38, 38, 36, 37, 37, 37, 38, + 38, 36, 34, 38, 40, 41, 42, 40, 38, 36, 36, 35, + 36, 35, 32, 35, 38, 42, 42, 38, 36, 36, 36, 37, + 36, 35, 33, 33, 33, 32, 31, 33, 36, 39, 40, 36, + 36, 34, 34, 36, 38, 39, 37, 36, 36, 35, 36, 39, + 39, 37, 37, 39, 37, 38, 39, 40, 38, 37, 37, 33, + 33, 32, 33, 34, 35, 35, 36, 36, 36, 37, 38, 37, + 38, 38, 39, 41, 41, 40, 40, 43, 42, 41, 40, 39, + 38, 35, 33, 35, 35, 37, 39, 38, 37, 36, 38, 36, + 36, 34, 34, 38, 39, 39, 37, 36, 36, 34, 33, 34, + 33, 35, 33, 36, 35, 35, 36, 36, 37, 33, 32, 36, + 38, 38, 38, 39, 39, 38, 39, 37, 35, 36, 34, 35, + 36, 37, 39, 38, 37, 34, 31, 34, 35, 35, 35, 35, + 36, 38, 39, 39, 37, 38, 38, 40, 39, 40, 41, 43, + 44, 42, 40, 39, 38, 42, 42, 39, 39, 36, 33, 33, + 34, 36, 36, 35, 33, 33, 35, 37, 36, 34, 34, 31, + 30, 32, 36, 42, 43, 43, 40, 36, 36, 36, 35, 34, + 35, 33, 33, 30, 32, 34, 35, 35, 35, 36, 35, 37, + 34, 34, 35, 36, 37, 37, 35, 36, 37, 39, 39, 38, + 35, 35, 35, 35, 35, 36, 38, 37, 38, 38, 36, 35, + 35, 36, 35, 35, 35, 35, 34, 34, 36, 36, 38, 40, + 38, 37, 36, 34, 34, 35, 35, 36, 37, 37, 38, 38, + 39, 39, 36, 35, 36, 35, 37, 36, 38, 39, 37, 38, + 34, 33, 32, 33, 32, 28, 34, 40, 45, 44, 40, 38, + 34, 30, 30, 33, 40, 45, 43, 41, 37, 37, 37, 36, + 33, 31, 32, 31, 35, 35, 35, 35, 35, 38, 39, 39, + 40, 39, 37, 37, 37, 35, 35, 37, 37, 36, 37, 37, + 37, 38, 37, 38, 37, 37, 35, 35, 34, 35, 35, 35, + 36, 39, 45, 43, 38, 39, 38, 36, 36, 36, 35, 37, + 39, 38, 37, 37, 37, 39, 38, 37, 37, 35, 34, 34, + 37, 39, 36, 37, 38, 39, 40, 41, 39, 36, 38, 39, + 39, 39, 36, 33, 32, 30, 30, 31, 35, 35, 35, 35, + 35, 39, 40, 38, 37, 40, 39, 38, 39, 39, 39, 38, + 39, 39, 40, 40, 39, 41, 39, 41, 39, 38, 39, 38, + 38, 36, 35, 36, 35, 37, 38, 38, 38, 40, 38, 39, + 39, 36, 36, 33, 34, 36, 35, 37, 38, 39, 39, 38, + 36, 32, 32, 35, 38, 38, 39, 38, 35, 35, 34, 37, + 39, 38, 36, 35, 35, 33, 31, 30, 32, 36, 37, 38, + 35, 35, 35, 35, 35, 39, 41, 42, 38, 33, 31, 33, + 37, 36, 37, 38, 37, 37, 38, 39, 38, 38, 38, 38, + 37, 38, 38, 39, 41, 41, 37, 39, 40, 42, 44, 43, + 39, 42, 48, 45, 41, 39, 38, 38, 38, 38, 36, 37, + 38, 39, 39, 39, 43, 41, 38, 37, 37, 38, 36, 34, + 34, 34, 38, 41, 41, 38, 35, 35, 34, 35, 32, 30, + 31, 33, 34, 35, 35, 35, 35, 35, 35, 39, 36, 35, + 38, 41, 38, 32, 34, 38, 34, 38, 40, 39, 39, 36, + 36, 39, 38, 39, 37, 38, 38, 36, 36, 35, 37, 38, + 39, 38, 36, 38, 37, 35, 31, 35, 37, 40, 39, 35, + 35, 36, 34, 36, 36, 38, 37, 38, 37, 37, 36, 37, + 38, 37, 36, 35, 34, 34, 34, 37, 36, 37, 36, 34, + 36, 36, 34, 31, 30, 33, 32, 33, 35, 35, 35, 35, + 34, 27, 33, 39, 42, 41, 42, 44, 45, 42, 39, 41, + 41, 42, 43, 42, 41, 40, 38, 37, 35, 37, 36, 36, + 36, 37, 36, 36, 37, 37, 39, 43, 43, 43, 42, 39, + 39, 39, 39, 40, 39, 38, 35, 34, 36, 37, 36, 37, + 38, 38, 37, 36, 35, 35, 33, 35, 38, 38, 39, 41, + 39, 38, 37, 38, 38, 36, 37, 36, 37, 37, 36, 36, + 35, 35, 35, 35, 36, 42, 40, 41, 43, 42, 39, 37, + 37, 37, 37, 39, 39, 38, 37, 35, 37, 36, 35, 36, + 36, 39, 39, 36, 36, 34, 37, 40, 40, 40, 39, 41, + 40, 39, 39, 39, 40, 38, 36, 34, 35, 37, 34, 36, + 35, 35, 34, 33, 36, 36, 38, 39, 38, 37, 34, 34, + 33, 34, 35, 36, 36, 35, 36, 35, 38, 39, 39, 40, + 38, 37, 36, 36, 35, 35, 35, 35, 36, 36, 42, 45, + 44, 43, 40, 38, 37, 36, 37, 37, 38, 38, 38, 38, + 36, 35, 35, 34, 34, 36, 38, 36, 35, 38, 37, 37, + 38, 38, 37, 38, 36, 33, 35, 37, 37, 38, 38, 41, + 41, 41, 38, 35, 33, 30, 29, 32, 37, 39, 39, 38, + 39, 38, 35, 34, 35, 35, 35, 35, 34, 35, 36, 36, + 37, 38, 38, 38, 36, 35, 33, 34, 35, 35, 35, 35, + 36, 36, 32, 33, 36, 38, 40, 42, 42, 39, 40, 41, + 43, 42, 36, 33, 32, 33, 32, 35, 37, 41, 41, 39, + 40, 37, 36, 38, 39, 41, 40, 40, 41, 39, 37, 37, + 36, 37, 37, 36, 35, 37, 37, 39, 41, 41, 43, 41, + 40, 40, 37, 37, 38, 38, 38, 38, 38, 36, 38, 37, + 36, 39, 41, 41, 42, 41, 39, 38, 38, 36, 37, 37, + 35, 35, 35, 36, 36, 33, 35, 37, 34, 35, 35, 35, + 39, 38, 39, 41, 43, 43, 43, 42, 39, 38, 39, 37, + 37, 38, 37, 36, 38, 38, 40, 38, 39, 39, 36, 35, + 34, 33, 34, 36, 37, 38, 37, 37, 37, 36, 34, 34, + 33, 34, 35, 38, 41, 38, 36, 37, 37, 37, 37, 39, + 41, 40, 41, 42, 41, 40, 41, 41, 39, 40, 40, 39, + 37, 37, 36, 38, 35, 35, 35, 36, 37, 45, 42, 40, + 44, 45, 42, 43, 42, 42, 45, 47, 49, 51, 50, 51, + 50, 49, 45, 45, 45, 43, 42, 42, 43, 41, 39, 40, + 40, 40, 39, 38, 40, 40, 39, 39, 39, 38, 35, 33, + 37, 41, 42, 39, 37, 37, 37, 38, 38, 36, 37, 35, + 33, 32, 33, 34, 35, 35, 38, 39, 37, 38, 36, 35, + 37, 38, 39, 42, 41, 38, 36, 34, 35, 35, 35, 35, + 36, 39, 38, 36, 37, 37, 37, 36, 40, 42, 43, 47, + 49, 48, 47, 44, 43, 47, 52, 55, 52, 47, 44, 42, + 42, 42, 40, 40, 39, 38, 37, 37, 39, 38, 38, 38, + 36, 33, 31, 34, 35, 38, 39, 38, 37, 38, 38, 37, + 38, 37, 42, 46, 45, 42, 39, 39, 38, 34, 36, 39, + 39, 37, 35, 36, 34, 37, 37, 36, 36, 39, 41, 42, + 35, 35, 35, 35, 36, 40, 40, 38, 39, 39, 36, 36, + 38, 39, 42, 46, 49, 50, 52, 52, 51, 51, 52, 54, + 51, 50, 51, 52, 51, 47, 47, 46, 47, 45, 43, 43, + 43, 43, 43, 42, 41, 41, 40, 40, 42, 46, 44, 41, + 37, 36, 37, 39, 39, 38, 38, 39, 38, 38, 39, 37, + 35, 35, 38, 38, 38, 36, 35, 35, 37, 35, 36, 38, + 36, 38, 38, 39, 35, 35, 35, 36, 36, 39, 39, 40, + 40, 39, 37, 38, 41, 39, 43, 46, 47, 49, 49, 49, + 48, 48, 51, 52, 52, 53, 53, 52, 51, 52, 50, 48, + 49, 48, 46, 47, 47, 44, 42, 43, 44, 43, 45, 48, + 46, 45, 44, 42, 43, 46, 45, 44, 42, 41, 38, 39, + 38, 37, 36, 35, 37, 35, 37, 36, 33, 31, 32, 38, + 43, 42, 41, 39, 37, 38, 37, 37, 35, 35, 36, 36, + 36, 38, 38, 36, 37, 39, 38, 39, 38, 39, 42, 47, + 49, 46, 46, 47, 47, 46, 47, 49, 48, 48, 49, 51, + 50, 49, 50, 51, 48, 46, 46, 47, 48, 47, 45, 43, + 42, 44, 45, 47, 49, 51, 51, 51, 49, 47, 48, 47, + 49, 46, 44, 40, 39, 40, 40, 39, 38, 40, 38, 39, + 40, 39, 37, 36, 35, 33, 35, 34, 32, 33, 34, 38, + 35, 36, 36, 36, 36, 35, 36, 38, 36, 37, 37, 37, + 38, 38, 39, 43, 46, 51, 52, 50, 50, 48, 50, 49, + 49, 50, 48, 50, 50, 49, 49, 51, 54, 54, 51, 51, + 49, 47, 48, 52, 53, 51, 49, 46, 46, 43, 46, 45, + 47, 50, 49, 47, 47, 46, 45, 48, 48, 45, 43, 44, + 43, 43, 42, 41, 39, 39, 39, 37, 37, 34, 34, 32, + 33, 35, 36, 39, 35, 36, 36, 36, 36, 40, 39, 36, + 36, 35, 34, 33, 32, 37, 43, 51, 56, 54, 55, 56, + 55, 52, 50, 49, 46, 46, 45, 47, 49, 51, 54, 54, + 51, 49, 50, 50, 48, 47, 45, 46, 47, 50, 50, 48, + 43, 42, 42, 43, 45, 47, 47, 48, 50, 49, 47, 47, + 48, 49, 47, 48, 48, 47, 47, 45, 44, 42, 39, 38, + 38, 38, 42, 41, 41, 39, 36, 35, 35, 35, 36, 36, + 36, 34, 37, 37, 35, 36, 36, 35, 36, 37, 38, 41, + 50, 67, 82, 84, 80, 80, 76, 75, 74, 71, 64, 61, + 58, 54, 53, 54, 56, 56, 53, 51, 51, 49, 47, 49, + 49, 48, 48, 47, 47, 48, 48, 47, 45, 46, 47, 46, + 46, 45, 41, 42, 44, 44, 45, 45, 48, 47, 44, 42, + 37, 35, 34, 32, 33, 37, 40, 37, 37, 36, 36, 37, + 35, 35, 36, 36, 36, 37, 35, 37, 37, 37, 35, 35, + 35, 37, 40, 41, 46, 58, 85, 119, -119, -123, 123, 115, + 109, 110, 109, 107, 102, 95, 93, 88, 86, 86, 86, 86, + 83, 77, 68, 64, 59, 58, 61, 61, 61, 58, 56, 51, + 49, 51, 51, 50, 50, 45, 37, 41, 47, 50, 50, 53, + 52, 49, 48, 45, 43, 42, 39, 38, 36, 38, 39, 39, + 39, 38, 37, 36, 35, 35, 35, 36, 36, 34, 36, 36, + 38, 39, 38, 37, 39, 41, 43, 47, 56, 79, 121, -106, + -110, -108, -99, -102, -100, -99, -101, -103, -102, -106, -108, -110, + -111, -111, -115, -117, -120, -123, -123, -125, -128, 127, 124, 118, + 114, 119, 113, 104, 99, 100, 100, 97, 89, 83, 79, 76, + 73, 69, 60, 52, 48, 47, 45, 46, 40, 37, 38, 38, + 42, 45, 43, 42, 42, 39, 38, 39, 35, 35, 36, 36, + 36, 37, 37, 40, 42, 42, 40, 39, 38, 40, 43, 49, + 60, 83, 126, -105, -98, -93, -97, -94, -93, -90, -88, -91, + -94, -91, -90, -93, -94, -94, -96, -94, -94, -96, -95, -93, + -96, -100, -104, -104, -105, -108, -110, -115, -119, -120, -122, -125, + 127, 122, 118, 115, 118, 113, 97, 78, 59, 45, 48, 46, + 40, 38, 38, 37, 38, 38, 35, 37, 37, 34, 32, 32, + 35, 36, 36, 36, 36, 38, 39, 38, 37, 38, 35, 34, + 36, 35, 37, 41, 51, 77, 120, -100, -91, -96, -95, -93, + -92, -89, -90, -92, -92, -93, -93, -91, -90, -91, -94, -94, + -94, -93, -92, -93, -95, -95, -93, -94, -94, -91, -92, -94, + -93, -91, -92, -91, -92, -96, -97, -99, -105, -112, 126, 95, + 63, 43, 47, 42, 38, 38, 36, 36, 36, 38, 37, 37, + 37, 36, 37, 38, 35, 36, 36, 36, 36, 39, 39, 39, + 41, 38, 33, 35, 37, 39, 45, 51, 58, 80, 121, -104, + -94, -93, -92, -94, -94, -91, -89, -89, -88, -86, -86, -88, + -87, -88, -90, -90, -91, -91, -89, -87, -90, -92, -92, -90, + -91, -91, -89, -89, -90, -92, -93, -91, -90, -91, -90, -91, + -91, -100, -128, 88, 54, 44, 47, 48, 46, 43, 41, 36, + 37, 40, 38, 40, 38, 38, 37, 39, 35, 36, 36, 36, + 36, 38, 41, 39, 37, 35, 32, 34, 36, 38, 42, 47, + 57, 82, 118, -105, -88, -86, -84, -88, -91, -91, -91, -92, + -91, -89, -90, -89, -87, -88, -88, -89, -89, -91, -91, -91, + -92, -93, -92, -93, -97, -93, -93, -93, -92, -92, -94, -94, + -92, -94, -94, -91, -91, -98, -122, 96, 63, 53, 49, 44, + 42, 42, 41, 38, 36, 37, 36, 37, 38, 39, 38, 40, + 35, 36, 36, 36, 36, 34, 36, 35, 37, 39, 40, 43, + 41, 41, 44, 48, 56, 83, -127, -99, -89, -88, -87, -88, + -89, -87, -89, -90, -90, -89, -91, -91, -89, -87, -88, -87, + -89, -88, -89, -88, -90, -89, -87, -88, -92, -91, -88, -89, + -88, -87, -89, -91, -93, -95, -97, -94, -93, -99, -125, 91, + 59, 45, 45, 47, 43, 42, 39, 36, 36, 36, 40, 38, + 39, 39, 37, 36, 36, 36, 36, 36, 36, 34, 37, 38, + 39, 40, 43, 43, 43, 43, 40, 43, 56, 87, -127, -100, + -94, -95, -91, -88, -90, -89, -90, -92, -88, -88, -90, -88, + -90, -90, -89, -89, -91, -91, -92, -92, -91, -90, -89, -89, + -92, -90, -90, -92, -91, -89, -90, -91, -91, -95, -94, -92, + -93, -99, -124, 92, 61, 48, 47, 49, 45, 44, 41, 38, + 37, 37, 38, 34, 35, 35, 35, 35, 36, 36, 36, 36, + 36, 40, 39, 36, 34, 35, 35, 37, 37, 40, 49, 56, + 62, 89, -124, -99, -93, -88, -88, -92, -90, -87, -88, -89, + -87, -88, -89, -88, -87, -88, -89, -89, -87, -88, -88, -87, + -89, -92, -91, -92, -92, -91, -91, -90, -89, -89, -89, -90, + -92, -93, -91, -87, -86, -96, -127, 90, 60, 45, 44, 43, + 36, 36, 37, 39, 38, 40, 40, 37, 36, 36, 33, 35, + 36, 36, 36, 36, 36, 34, 34, 34, 33, 34, 34, 35, + 37, 40, 42, 41, 50, 80, -127, -96, -92, -89, -85, -88, + -91, -88, -88, -89, -87, -90, -90, -89, -89, -90, -91, -90, + -89, -87, -86, -87, -89, -90, -91, -93, -93, -93, -91, -91, + -90, -90, -91, -92, -91, -92, -89, -87, -88, -96, -123, 96, + 65, 48, 47, 45, 38, 37, 37, 37, 37, 39, 39, 37, + 38, 36, 35, 35, 36, 36, 36, 36, 36, 40, 41, 40, + 41, 42, 42, 41, 39, 39, 45, 53, 66, 100, -111, -86, + -86, -87, -80, -86, -92, -88, -86, -87, -84, -83, -86, -86, + -85, -85, -86, -84, -84, -88, -90, -87, -88, -88, -88, -88, + -90, -89, -89, -89, -89, -89, -88, -87, -88, -90, -87, -88, + -90, -98, -127, 93, 69, 50, 50, 51, 43, 44, 43, 41, + 37, 37, 40, 38, 38, 37, 36, 38, 36, 36, 36, 36, + 36, 36, 38, 39, 40, 39, 40, 39, 42, 46, 49, 52, + 62, 90, -123, -101, -100, -98, -94, -90, -88, -87, -89, -90, + -89, -88, -88, -87, -86, -87, -86, -86, -87, -85, -85, -88, + -89, -88, -89, -88, -89, -90, -89, -90, -90, -91, -90, -89, + -91, -91, -91, -90, -92, -99, -126, 93, 61, 45, 49, 48, + 43, 41, 38, 37, 36, 38, 38, 37, 36, 35, 35, 39, + 36, 36, 36, 36, 37, 41, 42, 40, 41, 41, 38, 40, + 42, 42, 45, 50, 61, 91, -121, -94, -93, -96, -94, -94, + -93, -91, -91, -93, -90, -88, -92, -90, -87, -87, -89, -88, + -87, -89, -89, -90, -93, -96, -94, -91, -89, -88, -88, -90, + -90, -89, -91, -92, -93, -91, -91, -92, -91, -101, 122, 84, + 60, 48, 52, 46, 34, 36, 36, 37, 34, 34, 37, 34, + 32, 33, 34, 37, 36, 36, 36, 37, 37, 36, 39, 39, + 41, 40, 41, 40, 39, 42, 44, 49, 62, 92, -124, -96, + -84, -81, -86, -87, -89, -90, -91, -92, -90, -88, -89, -91, + -90, -89, -89, -89, -90, -89, -86, -88, -89, -89, -90, -88, + -90, -91, -91, -92, -92, -92, -91, -91, -93, -95, -94, -93, + -93, -101, 125, 86, 61, 47, 47, 49, 45, 44, 44, 43, + 44, 45, 44, 42, 41, 38, 35, 38, 37, 37, 37, 37, + 37, 39, 40, 40, 42, 44, 42, 43, 47, 45, 44, 50, + 66, 99, -111, -93, -97, -96, -92, -89, -89, -89, -87, -88, + -86, -87, -90, -88, -88, -88, -87, -87, -88, -91, -93, -91, + -92, -89, -86, -84, -83, -83, -87, -90, -91, -90, -91, -92, + -93, -94, -97, -96, -97, -107, 119, 79, 53, 39, 39, 38, + 37, 40, 38, 38, 37, 38, 40, 41, 39, 38, 36, 36, + 37, 37, 37, 37, 37, 40, 39, 40, 40, 40, 40, 38, + 39, 43, 44, 48, 59, 95, -121, -103, -96, -95, -97, -94, + -92, -90, -90, -90, -88, -85, -88, -89, -88, -89, -91, -92, + -92, -91, -90, -88, -88, -88, -90, -91, -92, -91, -89, -93, + -93, -92, -92, -91, -93, -94, -94, -94, -93, -105, 118, 79, + 52, 38, 36, 40, 41, 41, 42, 39, 38, 40, 40, 39, + 39, 39, 37, 38, 37, 37, 37, 37, 37, 41, 42, 40, + 41, 43, 43, 45, 43, 42, 43, 47, 62, 95, -120, -93, + -92, -96, -92, -94, -92, -91, -88, -88, -89, -90, -91, -88, + -88, -89, -88, -91, -93, -92, -91, -90, -89, -90, -89, -91, + -90, -90, -94, -95, -95, -94, -91, -87, -83, -87, -88, -89, + -94, -106, 117, 79, 60, 51, 45, 40, 37, 38, 38, 36, + 34, 33, 34, 34, 33, 35, 37, 36, 37, 37, 37, 37, + 37, 36, 40, 38, 39, 40, 41, 38, 40, 43, 48, 52, + 62, 96, -120, -103, -99, -94, -95, -93, -92, -90, -89, -90, + -91, -90, -92, -95, -95, -94, -94, -92, -92, -93, -93, -92, + -91, -90, -92, -94, -93, -92, -89, -91, -89, -87, -88, -91, + -97, -98, -95, -94, -94, -104, 123, 86, 61, 48, 46, 47, + 40, 38, 37, 34, 36, 35, 39, 41, 40, 39, 37, 37, + 37, 37, 37, 37, 37, 39, 39, 40, 39, 40, 42, 41, + 40, 43, 42, 43, 52, 85, 125, -106, -92, -98, -96, -84, + -82, -87, -86, -85, -86, -86, -90, -88, -88, -87, -87, -92, + -93, -93, -93, -90, -91, -92, -89, -89, -89, -89, -91, -91, + -93, -93, -94, -93, -92, -94, -94, -91, -92, -100, 123, 79, + 57, 47, 45, 47, 40, 37, 36, 35, 38, 37, 39, 40, + 38, 39, 36, 35, 37, 37, 37, 37, 37, 41, 38, 33, + 31, 37, 44, 44, 44, 46, 48, 52, 64, 96, -117, -98, + -103, -99, -97, -96, -97, -97, -94, -89, -85, -90, -91, -89, + -89, -89, -88, -87, -86, -90, -92, -91, -93, -91, -92, -92, + -91, -93, -92, -92, -92, -91, -94, -94, -94, -95, -93, -98, + -102, -110, 117, 83, 55, 40, 46, 48, 44, 42, 39, 40, + 37, 39, 40, 38, 38, 38, 39, 42, 37, 37, 37, 37, + 38, 39, 40, 41, 41, 41, 41, 40, 42, 46, 47, 52, + 65, 102, -114, -102, -97, -100, -95, -83, -88, -91, -89, -91, + -91, -89, -89, -88, -90, -89, -88, -88, -88, -89, -92, -90, + -90, -90, -90, -92, -94, -95, -94, -93, -92, -90, -90, -92, + -92, -94, -92, -92, -96, -108, 116, 76, 57, 50, 47, 42, + 38, 41, 42, 41, 37, 36, 37, 36, 36, 37, 35, 35, + 37, 37, 37, 37, 38, 39, 40, 41, 39, 41, 40, 36, + 34, 37, 39, 42, 61, 100, -113, -90, -97, -96, -90, -87, + -88, -90, -91, -93, -89, -91, -91, -90, -90, -91, -91, -89, + -87, -90, -91, -89, -90, -89, -90, -90, -92, -92, -92, -91, + -91, -89, -90, -92, -90, -92, -93, -93, -96, -107, 119, 81, + 48, 37, 40, 44, 45, 41, 40, 38, 36, 37, 38, 37, + 37, 37, 36, 35, 37, 37, 37, 37, 39, 47, 50, 45, + 40, 41, 40, 41, 42, 44, 48, 53, 64, 98, -116, -95, + -96, -97, -87, -83, -87, -87, -88, -87, -86, -86, -87, -91, + -95, -94, -92, -88, -89, -90, -90, -88, -87, -88, -90, -94, + -92, -93, -91, -89, -89, -87, -86, -87, -90, -92, -92, -91, + -92, -100, 125, 79, 52, 51, 54, 50, 47, 47, 47, 46, + 45, 46, 44, 40, 36, 34, 34, 34, 37, 37, 37, 37, + 38, 41, 42, 42, 39, 39, 37, 35, 39, 46, 52, 53, + 68, 101, -119, -101, -101, -101, -93, -90, -89, -88, -88, -88, + -85, -89, -90, -89, -91, -93, -92, -90, -90, -90, -91, -91, + -90, -91, -93, -91, -92, -92, -89, -90, -91, -92, -95, -95, + -94, -95, -95, -96, -97, -110, 116, 81, 54, 48, 52, 51, + 49, 45, 47, 46, 43, 44, 43, 38, 35, 35, 34, 36, + 37, 37, 37, 37, 39, 43, 43, 41, 40, 42, 41, 41, + 40, 40, 44, 50, 68, 106, -112, -93, -93, -95, -92, -94, + -93, -90, -89, -90, -88, -90, -89, -88, -89, -89, -89, -86, + -88, -91, -92, -92, -91, -92, -91, -91, -92, -91, -92, -90, + -90, -91, -88, -87, -90, -92, -91, -91, -92, -104, 121, 80, + 54, 43, 45, 46, 41, 41, 40, 38, 38, 38, 37, 37, + 37, 37, 39, 40, 37, 37, 37, 37, 37, 39, 39, 40, + 38, 40, 41, 40, 41, 43, 46, 52, 69, 105, -112, -92, + -95, -94, -90, -94, -94, -92, -91, -90, -91, -90, -90, -90, + -90, -89, -88, -89, -90, -90, -93, -94, -93, -92, -91, -91, + -92, -94, -91, -91, -89, -89, -93, -95, -96, -97, -96, -96, + -96, -106, 121, 86, 54, 47, 53, 50, 48, 43, 40, 39, + 37, 40, 40, 38, 38, 36, 37, 37, 37, 37, 37, 37, + 37, 39, 38, 38, 38, 38, 37, 37, 39, 41, 42, 45, + 62, 104, -112, -93, -87, -91, -92, -92, -91, -89, -91, -89, + -90, -88, -86, -88, -90, -91, -91, -90, -91, -91, -91, -90, + -89, -90, -89, -90, -93, -91, -92, -92, -91, -92, -91, -91, + -94, -94, -92, -93, -92, -103, 124, 92, 65, 49, 47, 45, + 39, 40, 40, 40, 37, 37, 37, 37, 41, 41, 38, 38, + 37, 37, 37, 37, 38, 46, 42, 42, 40, 41, 41, 37, + 39, 43, 49, 59, 78, 112, -105, -88, -94, -93, -96, -95, + -92, -90, -88, -90, -91, -90, -88, -89, -90, -89, -90, -91, + -90, -91, -93, -93, -92, -92, -91, -91, -90, -92, -92, -92, + -93, -92, -92, -92, -94, -94, -94, -94, -93, -107, 116, 77, + 48, 43, 47, 43, 41, 40, 39, 38, 38, 42, 40, 38, + 37, 34, 34, 34, 36, 37, 37, 37, 37, 41, 41, 38, + 38, 39, 40, 39, 39, 40, 40, 45, 63, 102, -117, -98, + -92, -88, -87, -91, -90, -89, -90, -91, -93, -90, -83, -85, + -87, -88, -90, -91, -93, -92, -93, -91, -89, -89, -89, -91, + -94, -92, -91, -90, -92, -92, -92, -93, -91, -89, -90, -89, + -87, -99, 126, 86, 54, 43, 45, 46, 42, 40, 38, 36, + 34, 34, 36, 34, 35, 34, 35, 36, 36, 37, 37, 37, + 38, 43, 40, 38, 38, 40, 41, 40, 41, 41, 42, 50, + 74, 113, -113, -98, -95, -88, -88, -90, -91, -90, -90, -92, + -91, -88, -86, -87, -86, -86, -89, -91, -92, -92, -91, -88, + -90, -93, -95, -97, -97, -95, -94, -93, -92, -92, -92, -93, + -94, -94, -96, -95, -96, -111, 111, 73, 42, 39, 50, 45, + 41, 40, 38, 38, 39, 41, 38, 35, 35, 33, 30, 28, + 36, 37, 37, 37, 37, 37, 40, 38, 40, 41, 41, 43, + 42, 40, 42, 49, 74, 119, -100, -88, -94, -93, -90, -94, + -94, -91, -89, -89, -90, -89, -88, -93, -94, -91, -89, -87, + -90, -96, -98, -96, -94, -94, -92, -92, -92, -89, -88, -89, + -91, -90, -89, -88, -86, -87, -90, -93, -95, -110, 113, 79, + 59, 52, 43, 38, 38, 38, 41, 41, 39, 41, 42, 41, + 40, 40, 40, 39, 37, 37, 37, 37, 37, 39, 38, 40, + 40, 42, 40, 41, 43, 47, 50, 53, 74, 112, -114, -99, + -95, -92, -94, -95, -95, -92, -90, -91, -88, -85, -89, -88, + -87, -88, -89, -89, -91, -91, -90, -88, -91, -94, -93, -93, + -93, -94, -93, -91, -90, -90, -92, -93, -94, -92, -94, -94, + -95, -110, 113, 78, 52, 46, 49, 45, 43, 42, 43, 41, + 39, 41, 40, 38, 38, 35, 37, 39, 37, 37, 37, 37, + 37, 35, 38, 38, 41, 42, 39, 42, 43, 44, 46, 55, + 80, 119, -108, -99, -95, -91, -90, -95, -95, -92, -90, -94, + -94, -89, -88, -92, -91, -91, -93, -93, -93, -93, -91, -89, + -90, -93, -91, -89, -88, -89, -88, -89, -92, -93, -93, -93, + -92, -92, -95, -95, -97, -113, 108, 67, 48, 46, 41, 41, + 42, 39, 39, 37, 36, 38, 38, 36, 37, 39, 38, 39, + 37, 37, 37, 37, 36, 32, 34, 36, 38, 38, 38, 38, + 41, 42, 44, 50, 67, 115, -98, -89, -94, -93, -87, -86, + -91, -90, -92, -93, -92, -89, -91, -92, -90, -92, -92, -91, + -90, -90, -89, -87, -90, -93, -92, -92, -95, -94, -94, -93, + -91, -92, -94, -95, -96, -93, -93, -92, -95, -112, 107, 73, + 56, 45, 45, 44, 41, 41, 39, 38, 37, 39, 39, 37, + 38, 37, 39, 41, 37, 37, 37, 37, 37, 40, 39, 41, + 42, 42, 39, 39, 43, 47, 49, 56, 76, 112, -112, -102, + -90, -78, -88, -93, -92, -92, -90, -89, -91, -88, -86, -90, + -88, -87, -89, -91, -90, -90, -89, -90, -90, -88, -90, -89, + -89, -89, -87, -90, -91, -90, -90, -88, -90, -92, -93, -93, + -97, -112, 108, 71, 52, 48, 51, 48, 45, 40, 40, 41, + 42, 42, 41, 39, 41, 42, 39, 37, 37, 37, 37, 37, + 37, 38, 39, 40, 40, 40, 40, 42, 45, 46, 45, 51, + 72, 121, -98, -99, -100, -95, -93, -96, -95, -93, -90, -90, + -87, -89, -89, -90, -89, -90, -90, -89, -92, -94, -90, -91, + -91, -91, -90, -89, -90, -88, -90, -92, -91, -92, -93, -94, + -96, -94, -94, -95, -97, -113, 106, 71, 52, 48, 46, 45, + 45, 41, 37, 33, 33, 35, 35, 37, 38, 37, 36, 35, + 37, 37, 37, 37, 37, 37, 37, 38, 39, 39, 39, 40, + 42, 40, 42, 50, 73, 114, -107, -96, -100, -97, -100, -103, + -101, -97, -92, -89, -89, -87, -85, -88, -89, -87, -87, -88, + -88, -89, -91, -92, -89, -86, -86, -84, -86, -86, -90, -94, + -94, -93, -93, -94, -94, -93, -92, -94, -99, -115, 106, 72, + 60, 59, 57, 55, 48, 42, 39, 37, 37, 39, 37, 37, + 38, 37, 35, 33, 37, 37, 37, 37, 38, 45, 43, 42, + 39, 36, 35, 34, 38, 40, 42, 50, 76, 115, -110, -97, + -89, -88, -92, -95, -94, -91, -90, -88, -86, -87, -88, -87, + -86, -88, -88, -88, -91, -90, -89, -90, -89, -89, -91, -90, + -91, -90, -91, -93, -93, -93, -95, -97, -96, -92, -94, -97, + -100, -118, 106, 72, 54, 50, 48, 47, 46, 44, 40, 36, + 38, 40, 42, 41, 40, 38, 36, 38, 37, 37, 37, 37, + 37, 39, 41, 41, 41, 40, 41, 45, 47, 47, 46, 53, + 77, 119, -102, -90, -94, -89, -88, -94, -90, -87, -86, -85, + -87, -87, -85, -86, -86, -87, -88, -90, -90, -91, -91, -91, + -93, -91, -91, -92, -93, -93, -92, -94, -93, -90, -91, -92, + -92, -91, -94, -96, -95, -105, 114, 74, 57, 51, 50, 53, + 47, 42, 39, 37, 41, 46, 46, 43, 40, 35, 31, 29, + 37, 37, 37, 37, 38, 39, 37, 38, 39, 40, 41, 40, + 43, 46, 48, 57, 89, -126, -102, -97, -96, -93, -96, -92, + -89, -89, -91, -94, -90, -91, -90, -88, -88, -90, -90, -90, + -92, -93, -93, -92, -90, -89, -90, -89, -91, -93, -91, -92, + -93, -92, -94, -95, -92, -92, -95, -99, -100, -116, 103, 70, + 54, 52, 54, 49, 46, 43, 40, 36, 35, 39, 41, 37, + 38, 38, 38, 37, 37, 37, 37, 38, 38, 42, 43, 41, + 41, 41, 45, 45, 44, 44, 46, 56, 86, 119, -113, -96, + -91, -78, -83, -90, -90, -90, -89, -91, -92, -92, -90, -88, + -89, -91, -91, -90, -89, -89, -88, -88, -90, -90, -92, -92, + -92, -90, -90, -94, -93, -91, -91, -92, -94, -91, -90, -95, + -100, -121, 91, 58, 49, 49, 47, 45, 44, 44, 43, 41, + 40, 40, 37, 35, 35, 36, 35, 34, 37, 37, 38, 38, + 38, 42, 38, 37, 38, 37, 37, 40, 45, 45, 44, 54, + 84, 123, -106, -96, -95, -96, -99, -97, -96, -92, -91, -92, + -91, -92, -95, -94, -93, -92, -91, -89, -91, -92, -91, -91, + -92, -94, -92, -88, -89, -91, -91, -93, -94, -92, -93, -92, + -93, -92, -94, -95, -97, -118, 95, 55, 33, 34, 37, 37, + 34, 33, 33, 31, 34, 36, 36, 34, 35, 36, 37, 38, + 37, 37, 38, 38, 38, 40, 40, 42, 43, 43, 41, 41, + 40, 43, 43, 50, 77, 116, -110, -84, -81, -87, -91, -94, + -91, -88, -88, -89, -88, -88, -88, -85, -88, -89, -88, -88, + -89, -92, -91, -93, -92, -92, -94, -94, -93, -93, -94, -96, + -95, -91, -89, -88, -91, -92, -94, -98, -100, -122, 91, 57, + 43, 46, 41, 33, 36, 36, 38, 39, 39, 38, 33, 33, + 34, 34, 34, 35, 37, 38, 38, 38, 39, 44, 43, 44, + 45, 44, 40, 40, 42, 40, 46, 60, 93, -127, -103, -88, + -87, -94, -93, -96, -97, -94, -89, -90, -89, -88, -90, -90, + -91, -92, -90, -90, -91, -93, -94, -94, -94, -94, -93, -91, + -94, -96, -95, -98, -97, -94, -94, -95, -99, -98, -95, -95, + -101, -121, 95, 58, 42, 39, 44, 44, 39, 37, 41, 42, + 41, 41, 37, 33, 33, 32, 33, 33, 37, 38, 38, 38, + 38, 39, 41, 44, 44, 47, 46, 44, 41, 39, 40, 52, + 85, 127, -102, -88, -82, -87, -92, -94, -91, -90, -91, -92, + -91, -89, -91, -92, -91, -89, -87, -86, -89, -91, -92, -93, + -93, -92, -95, -98, -95, -90, -87, -90, -92, -93, -94, -98, + -99, -97, -97, -96, -98, -114, 106, 65, 40, 42, 41, 39, + 41, 41, 43, 46, 45, 43, 40, 38, 39, 40, 40, 39, + 37, 38, 38, 38, 38, 34, 37, 39, 42, 42, 41, 42, + 41, 42, 44, 58, 88, 124, -109, -98, -95, -96, -97, -95, + -95, -95, -96, -94, -91, -90, -92, -91, -90, -90, -89, -87, + -89, -92, -94, -95, -96, -95, -94, -94, -97, -98, -97, -97, + -96, -95, -96, -95, -98, -99, -98, -97, -100, -121, 90, 52, + 37, 36, 39, 41, 39, 39, 40, 38, 35, 33, 34, 35, + 34, 36, 36, 35, 37, 38, 38, 38, 38, 40, 39, 40, + 39, 40, 44, 46, 49, 53, 53, 53, 73, 108, -114, -96, + -96, -99, -100, -99, -96, -94, -95, -93, -89, -84, -88, -91, + -91, -93, -97, -97, -98, -97, -93, -92, -92, -92, -95, -95, + -94, -92, -91, -94, -96, -96, -94, -94, -94, -92, -93, -94, + -96, -115, 103, 64, 36, 38, 45, 42, 44, 41, 41, 41, + 37, 38, 42, 45, 46, 43, 39, 33, 37, 38, 38, 38, + 38, 42, 42, 38, 36, 35, 34, 36, 40, 39, 39, 49, + 82, -123, -95, -91, -87, -89, -93, -94, -95, -94, -95, -94, + -91, -92, -93, -92, -92, -94, -95, -95, -96, -94, -94, -94, + -93, -94, -92, -90, -92, -90, -91, -93, -92, -92, -91, -91, + -93, -93, -93, -93, -98, -122, 90, 54, 40, 40, 41, 40, + 38, 36, 36, 36, 39, 42, 43, 41, 38, 38, 36, 36, + 37, 38, 38, 38, 38, 41, 40, 37, 36, 38, 42, 42, + 41, 44, 41, 48, 73, 116, -103, -88, -87, -92, -96, -95, + -93, -91, -87, -85, -88, -85, -89, -93, -91, -88, -87, -85, + -87, -89, -91, -93, -92, -92, -92, -91, -94, -90, -91, -93, + -93, -94, -92, -92, -95, -93, -92, -93, -96, -116, 104, 66, + 40, 39, 37, 39, 42, 43, 43, 40, 38, 37, 36, 36, + 34, 34, 35, 35, 37, 38, 38, 38, 38, 41, 41, 38, + 37, 36, 35, 37, 42, 44, 46, 58, 91, -120, -98, -99, + -94, -89, -93, -92, -92, -93, -93, -93, -91, -89, -88, -85, + -86, -88, -89, -87, -89, -88, -90, -94, -93, -94, -94, -91, + -90, -86, -90, -94, -94, -96, -95, -95, -94, -93, -92, -91, + -97, -123, 91, 58, 48, 52, 48, 44, 43, 43, 41, 36, + 38, 42, 43, 39, 37, 34, 31, 32, 37, 38, 38, 38, + 38, 41, 40, 37, 41, 42, 41, 43, 41, 39, 45, 60, + 92, -123, -102, -102, -99, -99, -97, -92, -93, -93, -94, -94, + -96, -93, -89, -92, -91, -90, -89, -90, -88, -90, -90, -91, + -92, -92, -92, -92, -94, -90, -90, -90, -91, -91, -91, -93, + -94, -91, -92, -95, -103, -127, 92, 59, 49, 56, 53, 55, + 51, 50, 48, 43, 39, 36, 35, 35, 34, 33, 34, 37, + 37, 38, 38, 38, 38, 38, 39, 38, 40, 41, 40, 42, + 45, 45, 47, 64, 100, -118, -104, -102, -93, -95, -92, -96, + -97, -96, -96, -94, -92, -89, -90, -93, -93, -96, -97, -94, + -96, -96, -97, -98, -97, -96, -94, -94, -95, -92, -95, -94, + -94, -95, -94, -95, -96, -95, -94, -94, -97, -118, 102, 70, + 53, 53, 55, 52, 54, 52, 47, 41, 38, 39, 40, 36, + 37, 37, 35, 36, 37, 38, 38, 38, 38, 40, 39, 40, + 41, 39, 33, 33, 36, 40, 51, 64, 84, 125, -102, -87, + -81, -92, -98, -101, -98, -97, -95, -95, -95, -94, -94, -98, + -97, -94, -93, -93, -93, -92, -91, -92, -93, -93, -93, -93, + -95, -94, -94, -96, -94, -91, -91, -95, -94, -95, -98, -98, + -102, -119, 101, 71, 55, 47, 47, 48, 51, 52, 45, 38, + 34, 30, 34, 34, 32, 34, 34, 37, 37, 37, 38, 38, + 38, 41, 42, 41, 39, 41, 39, 37, 37, 37, 44, 66, + 105, -118, -105, -107, -106, -102, -101, -102, -100, -101, -101, -99, + -98, -96, -96, -98, -94, -94, -95, -94, -96, -97, -97, -96, + -96, -95, -96, -94, -96, -99, -95, -96, -98, -100, -98, -97, + -97, -94, -93, -97, -107, 123, 83, 54, 41, 45, 48, 45, + 46, 44, 43, 40, 36, 39, 36, 37, 38, 40, 41, 40, + 37, 37, 38, 38, 38, 40, 40, 43, 43, 41, 40, 42, + 42, 40, 44, 61, 90, 121, -122, -121, -117, -113, -111, -108, + -104, -104, -105, -106, -106, -102, -103, -106, -106, -107, -106, -106, + -104, -103, -101, -100, -99, -98, -99, -100, -101, -98, -95, -94, + -94, -93, -95, -95, -97, -97, -98, -97, -97, -115, 98, 58, + 40, 42, 46, 46, 47, 48, 45, 43, 42, 40, 39, 36, + 34, 35, 36, 38, 37, 37, 37, 38, 38, 37, 41, 41, + 42, 43, 40, 41, 40, 40, 42, 51, 68, 78, 81, 81, + 81, 85, 85, 87, 88, 89, 93, 96, 97, 100, 98, 101, + 105, 109, 110, 113, 116, 116, 117, 118, 119, 120, 121, 126, + -126, -126, -123, -120, -118, -117, -115, -114, -113, -110, -106, -108, + -115, 117, 81, 52, 40, 42, 47, 48, 48, 45, 42, 38, + 34, 37, 34, 36, 37, 39, 39, 38, 37, 37, 37, 38, + 38, 38, 37, 39, 41, 39, 42, 42, 40, 41, 43, 53, + 69, 71, 66, 65, 61, 57, 57, 58, 60, 62, 65, 64, + 68, 76, 71, 67, 68, 69, 75, 82, 87, 85, 85, 86, + 87, 92, 94, 94, 96, 90, 91, 95, 101, 109, 109, 114, + 115, 119, 123, 121, 117, 104, 77, 50, 37, 32, 30, 24, + 27, 35, 39, 39, 36, 38, 36, 37, 36, 34, 33, 32, + 37, 37, 37, 37, 38, 37, 41, 40, 41, 43, 41, 39, + 38, 40, 43, 49, 53, 52, 50, 50, 51, 51, 52, 54, + 49, 46, 50, 48, 47, 51, 51, 50, 48, 50, 50, 50, + 50, 50, 51, 51, 52, 52, 56, 57, 58, 59, 57, 56, + 56, 55, 52, 53, 56, 59, 60, 61, 62, 59, 54, 54, + 51, 47, 50, 47, 45, 44, 43, 40, 37, 37, 37, 39, + 43, 45, 43, 39, 36, 37, 37, 37, 39, 46, 41, 38, + 40, 40, 39, 40, 40, 38, 43, 49, 54, 54, 52, 52, + 49, 47, 47, 50, 48, 49, 52, 49, 50, 51, 48, 48, + 49, 49, 49, 51, 50, 46, 46, 50, 49, 52, 52, 47, + 48, 51, 52, 48, 50, 52, 47, 45, 46, 45, 48, 49, + 50, 48, 44, 45, 48, 50, 47, 43, 44, 44, 44, 43, + 43, 43, 41, 41, 41, 38, 36, 36, 36, 37, 37, 37, + 37, 41, 41, 39, 38, 38, 36, 36, 37, 39, 44, 48, + 50, 50, 50, 52, 52, 52, 52, 53, 50, 46, 46, 46, + 42, 43, 46, 45, 44, 46, 46, 45, 43, 45, 46, 50, + 51, 50, 51, 50, 49, 51, 51, 50, 51, 50, 49, 47, + 49, 49, 50, 52, 50, 48, 45, 46, 47, 47, 48, 47, + 45, 44, 45, 42, 38, 37, 35, 31, 29, 31, 33, 35, + 36, 36, 37, 37, 37, 39, 39, 40, 41, 42, 39, 37, + 37, 36, 40, 44, 48, 47, 45, 46, 49, 49, 49, 50, + 47, 48, 49, 48, 45, 47, 47, 49, 51, 53, 51, 49, + 48, 46, 44, 44, 43, 44, 46, 48, 49, 51, 51, 50, + 49, 49, 48, 50, 54, 56, 49, 44, 43, 44, 44, 45, + 45, 44, 45, 42, 40, 41, 42, 41, 38, 36, 37, 41, + 46, 43, 40, 37, 36, 36, 37, 37, 37, 40, 41, 40, + 39, 39, 36, 35, 37, 38, 41, 43, 45, 46, 46, 46, + 47, 45, 41, 45, 46, 47, 48, 47, 45, 44, 45, 47, + 46, 46, 46, 45, 46, 45, 43, 44, 44, 46, 51, 51, + 47, 49, 46, 44, 43, 39, 39, 42, 46, 46, 46, 44, + 43, 42, 42, 44, 44, 46, 46, 47, 45, 40, 37, 33, + 35, 40, 45, 42, 42, 42, 38, 36, 36, 36, 36, 37, + 38, 42, 42, 40, 39, 38, 38, 39, 40, 39, 38, 40, + 40, 38, 37, 38, 40, 40, 38, 39, 39, 40, 39, 36, + 34, 37, 40, 40, 41, 40, 38, 35, 36, 40, 39, 38, + 36, 36, 37, 39, 40, 40, 40, 41, 42, 42, 42, 42, + 40, 41, 41, 42, 45, 45, 42, 42, 40, 42, 46, 46, + 44, 43, 41, 39, 37, 40, 41, 37, 35, 32, 30, 31, + 36, 36, 36, 36, 37, 40, 40, 40, 39, 39, 38, 39, + 41, 42, 40, 42, 42, 41, 38, 38, 42, 39, 37, 39, + 37, 34, 35, 36, 39, 39, 41, 41, 39, 39, 36, 35, + 35, 37, 41, 45, 48, 47, 48, 45, 42, 44, 41, 41, + 42, 43, 42, 41, 40, 39, 37, 37, 37, 38, 38, 40, + 41, 42, 40, 41, 40, 39, 40, 38, 37, 39, 41, 40, + 37, 35, 32, 33, 36, 36, 36, 36, 36, 38, 39, 38, + 37, 38, 37, 37, 40, 39, 43, 48, 48, 44, 39, 38, + 40, 41, 41, 41, 42, 42, 39, 36, 35, 35, 34, 35, + 36, 38, 38, 37, 39, 38, 36, 36, 37, 39, 40, 40, + 38, 38, 37, 35, 36, 33, 34, 37, 36, 39, 39, 38, + 37, 33, 30, 32, 33, 33, 35, 36, 36, 36, 37, 35, + 37, 39, 40, 36, 35, 37, 36, 35, 36, 36, 36, 36, + 35, 31, 34, 35, 37, 38, 37, 36, 39, 42, 41, 41, + 40, 38, 36, 37, 38, 39, 40, 40, 37, 34, 34, 35, + 37, 37, 39, 39, 38, 40, 39, 41, 43, 43, 43, 40, + 39, 41, 41, 39, 35, 33, 34, 33, 36, 38, 40, 40, + 39, 40, 37, 39, 37, 34, 33, 34, 35, 35, 35, 35, + 33, 35, 34, 33, 34, 36, 37, 36, 35, 35, 34, 35, + 36, 36, 36, 36, 36, 38, 39, 40, 40, 42, 41, 40, + 43, 42, 39, 38, 35, 35, 34, 35, 37, 37, 37, 37, + 38, 37, 35, 34, 36, 39, 40, 39, 40, 41, 40, 36, + 37, 38, 34, 35, 36, 37, 39, 40, 37, 37, 37, 34, + 34, 35, 35, 37, 37, 38, 39, 42, 44, 42, 40, 41, + 40, 38, 35, 34, 34, 36, 36, 37, 39, 38, 40, 40, + 38, 36, 33, 31, 36, 36, 36, 36, 36, 36, 36, 39, + 41, 42, 41, 40, 38, 38, 37, 37, 41, 40, 39, 39, + 37, 39, 38, 39, 37, 35, 35, 35, 36, 39, 38, 38, + 38, 38, 39, 39, 39, 38, 38, 39, 40, 41, 41, 41, + 38, 38, 37, 37, 36, 38, 40, 39, 37, 35, 37, 35, + 33, 34, 35, 38, 36, 36, 38, 34, 33, 35, 36, 35, + 37, 39, 38, 38, 38, 37, 34, 31, 36, 36, 36, 36, + 36, 37, 41, 41, 39, 40, 39, 40, 41, 42, 40, 35, + 35, 36, 34, 36, 38, 38, 39, 39, 39, 39, 38, 37, + 38, 38, 36, 34, 35, 40, 44, 43, 46, 47, 40, 35, + 36, 36, 37, 37, 35, 36, 37, 35, 36, 38, 38, 39, + 39, 39, 40, 40, 38, 33, 32, 35, 36, 35, 32, 31, + 32, 34, 34, 35, 38, 39, 38, 37, 35, 36, 36, 33, + 36, 36, 36, 36, 36, 35, 31, 33, 36, 36, 37, 37, + 37, 38, 38, 39, 41, 39, 36, 36, 36, 35, 37, 34, + 34, 32, 32, 34, 35, 39, 38, 38, 39, 38, 38, 38, + 38, 36, 33, 34, 33, 34, 34, 37, 40, 40, 40, 37, + 35, 37, 38, 37, 35, 35, 36, 37, 38, 41, 43, 42, + 37, 36, 40, 39, 41, 43, 41, 36, 32, 33, 36, 37, + 40, 39, 36, 33, 36, 36, 36, 36, 37, 42, 42, 39, + 35, 35, 35, 37, 37, 38, 39, 38, 40, 40, 39, 44, + 44, 39, 40, 40, 42, 44, 42, 38, 38, 36, 35, 35, + 35, 38, 38, 35, 33, 36, 35, 35, 37, 38, 39, 38, + 38, 38, 37, 36, 33, 33, 33, 34, 37, 38, 39, 40, + 36, 31, 33, 36, 34, 37, 35, 34, 36, 37, 38, 38, + 37, 37, 35, 33, 35, 39, 36, 34, 36, 36, 36, 36, + 36, 36, 35, 36, 36, 37, 35, 37, 38, 38, 40, 41, + 42, 40, 41, 44, 42, 42, 40, 38, 39, 37, 36, 35, + 35, 34, 33, 34, 35, 36, 36, 38, 37, 37, 36, 34, + 36, 39, 40, 39, 38, 39, 37, 37, 36, 39, 40, 39, + 39, 35, 37, 37, 36, 40, 41, 40, 37, 35, 36, 36, + 37, 35, 35, 34, 32, 36, 34, 32, 31, 30, 31, 33, + 36, 36, 36, 36, 37, 37, 37, 36, 35, 38, 39, 41, + 40, 35, 36, 35, 35, 34, 34, 38, 38, 39, 40, 36, + 35, 36, 35, 36, 36, 38, 36, 39, 41, 42, 41, 41, + 40, 41, 41, 39, 38, 36, 37, 37, 35, 37, 40, 39, + 37, 37, 37, 38, 39, 43, 44, 41, 39, 39, 42, 40, + 36, 38, 34, 33, 36, 37, 41, 41, 41, 41, 41, 40, + 40, 44, 41, 38, 36, 36, 36, 37, 37, 38, 39, 39, + 38, 38, 37, 40, 40, 37, 38, 38, 37, 36, 36, 36, + 35, 39, 39, 38, 41, 38, 37, 38, 39, 41, 40, 40, + 41, 41, 41, 40, 37, 39, 40, 40, 39, 39, 36, 35, + 35, 35, 35, 35, 34, 36, 35, 37, 40, 40, 40, 38, + 36, 36, 35, 37, 36, 37, 38, 38, 38, 37, 37, 34, + 31, 33, 32, 33, 33, 33, 35, 36}; diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/math_private.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/math_private.h new file mode 100644 index 0000000..583d9a6 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/math_private.h @@ -0,0 +1,173 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +// #include +// #include + +/* A representation of a double as a union. */ +union ieee754_double { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 20; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1 : 32; + unsigned int mantissa0 : 19; + unsigned int quiet_nan : 1; + unsigned int exponent : 11; + unsigned int negative : 1; + } ieee_nan; +}; + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */ +/* #warning USING Big Endian float word order */ +/* typedef union */ +/* { */ +/* double value; */ +/* struct */ +/* { */ +/* u_int16_t msw; */ +/* u_int16_t lsw; */ +/* } parts; */ +/* } ieeeDoubleShapeType; */ + +/* #endif */ + +/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */ +/* #warning USING Little Endian float word order */ + +typedef union { + double value; + struct { + u_int16_t lsw; + u_int16_t msw; + } parts; +} ieeeDoubleShapeType; + +/* #endif */ + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0, ix1, d) \ + { \ + ieeeDoubleShapeType ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i, d) \ + { \ + ieeeDoubleShapeType gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ + } + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i, d) \ + { \ + ieeeDoubleShapeType gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ + } + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d, ix0, ix1) \ + { \ + ieeeDoubleShapeType iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d, v) \ + { \ + ieeeDoubleShapeType sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ + } + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d, v) \ + { \ + ieeeDoubleShapeType sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ + } + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i, d) \ + { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d, i) \ + { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/susan.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/susan.c new file mode 100644 index 0000000..f7bc501 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/susan.c @@ -0,0 +1,2878 @@ +/**********************************************************************\ + + SUSAN Version 2l by Stephen Smith + Oxford Centre for Functional Magnetic Resonance Imaging of the Brain, + Department of Clinical Neurology, Oxford University, Oxford, UK + (Previously in Computer Vision and Image Processing Group - now + Computer Vision and Electro Optics Group - DERA Chertsey, UK) + Email: steve@fmrib.ox.ac.uk + WWW: http://www.fmrib.ox.ac.uk/~steve + + (C) Crown Copyright (1995-1999), Defence Evaluation and Research Agency, + Farnborough, Hampshire, GU14 6TD, UK + DERA WWW site: + http://www.dera.gov.uk/ + DERA Computer Vision and Electro Optics Group WWW site: + http://www.dera.gov.uk/imageprocessing/dera/group_home.html + DERA Computer Vision and Electro Optics Group point of contact: + Dr. John Savage, jtsavage@dera.gov.uk, +44 1344 633203 + + A UK patent has been granted: "Method for digitally processing + images to determine the position of edges and/or corners therein for + guidance of unmanned vehicle", UK Patent 2272285. Proprietor: + Secretary of State for Defence, UK. 15 January 1997 + + This code is issued for research purposes only and remains the + property of the UK Secretary of State for Defence. This code must + not be passed on without this header information being kept + intact. This code must not be sold. + + \**********************************************************************/ + +/**********************************************************************\ + + SUSAN Version 2l + SUSAN = Smallest Univalue Segment Assimilating Nucleus + + Email: steve@fmrib.ox.ac.uk + WWW: http://www.fmrib.ox.ac.uk/~steve + + Related paper: + @article{Smith97, + author = "Smith, S.M. and Brady, J.M.", + title = "{SUSAN} - A New Approach to Low Level Image Processing", + journal = "Int. Journal of Computer Vision", + pages = "45--78", + volume = "23", + number = "1", + month = "May", + year = 1997} + + To be registered for automatic (bug) updates of SUSAN, send an email. + + Compile with: + gcc -O4 -o susan susan2l.c -lm + + See following section for different machine information. Please + report any bugs (and fixes). There are a few optional changes that + can be made in the "defines" section which follows shortly. + + Usage: type "susan" to get usage. Only PGM format files can be input + and output. Utilities such as the netpbm package and XV can be used + to convert to and from other formats. Any size of image can be + processed. + + This code is written using an emacs folding mode, making moving + around the different sections very easy. This is why there are + various marks within comments and why comments are indented. + + + SUSAN QUICK: + + This version of the SUSAN corner finder does not do all the + false-corner suppression and thus is faster and produced some false + positives, particularly on strong edges. However, because there are + less stages involving thresholds etc., the corners that are + correctly reported are usually more stable than those reported with + the full algorithm. Thus I recommend at least TRYING this algorithm + for applications where stability is important, e.g., tracking. + + THRESHOLDS: + + There are two thresholds which can be set at run-time. These are the + brightness threshold (t) and the distance threshold (d). + + SPATIAL CONTROL: d + + In SUSAN smoothing d controls the size of the Gaussian mask; its + default is 4.0. Increasing d gives more smoothing. In edge finding, + a fixed flat mask is used, either 37 pixels arranged in a "circle" + (default), or a 3 by 3 mask which gives finer detail. In corner + finding, only the larger 37 pixel mask is used; d is not + variable. In smoothing, the flat 3 by 3 mask can be used instead of + a larger Gaussian mask; this gives low smoothing and fast operation. + + BRIGHTNESS CONTROL: t + + In all three algorithms, t can be varied (default=20); this is the + main threshold to be varied. It determines the maximum difference in + greylevels between two pixels which allows them to be considered + part of the same "region" in the image. Thus it can be reduced to + give more edges or corners, i.e. to be more sensitive, and vice + versa. In smoothing, reducing t gives less smoothing, and vice + versa. Set t=10 for the test image available from the SUSAN web + page. + + ITERATIONS: + + With SUSAN smoothing, more smoothing can also be obtained by + iterating the algorithm several times. This has a different effect + from varying d or t. + + FIXED MASKS: + + 37 pixel mask: ooo 3 by 3 mask: ooo + ooooo ooo + ooooooo ooo + ooooooo + ooooooo + ooooo + ooo + + CORNER ATTRIBUTES dx, dy and I + (Only read this if you are interested in the C implementation or in + using corner attributes, e.g., for corner matching) + + Corners reported in the corner list have attributes associated with + them as well as positions. This is useful, for example, when + attempting to match corners from one image to another, as these + attributes can often be fairly unchanged between images. The + attributes are dx, dy and I. I is the value of image brightness at + the position of the corner. In the case of susan_corners_quick, dx + and dy are the first order derivatives (differentials) of the image + brightness in the x and y directions respectively, at the position + of the corner. In the case of normal susan corner finding, dx and dy + are scaled versions of the position of the centre of gravity of the + USAN with respect to the centre pixel (nucleus). + + BRIGHTNESS FUNCTION LUT IMPLEMENTATION: + (Only read this if you are interested in the C implementation) + + The SUSAN brightness function is implemented as a LUT + (Look-Up-Table) for speed. The resulting pointer-based code is a + little hard to follow, so here is a brief explanation. In + setup_brightness_lut() the LUT is setup. This mallocs enough space + for *bp and then repositions the pointer to the centre of the + malloced space. The SUSAN function e^-(x^6) or e^-(x^2) is + calculated and converted to a uchar in the range 0-100, for all + possible image brightness differences (including negative + ones). Thus bp[ 23 ] is the output for a brightness difference of 23 + greylevels. In the SUSAN algorithms this LUT is used as follows: + + p=in + (i-3)*x_size + j - 1; + p points to the first image pixel in the circular mask surrounding + point (x,y). + + cp=bp + in[ i*x_size+j ]; + cp points to a position in the LUT corresponding to the brightness + of the centre pixel (x,y). + + now for every pixel within the mask surrounding (x,y), + n+=*(cp-*p++); + the brightness difference function is found by moving the cp pointer + down by an amount equal to the value of the pixel pointed to by p, + thus subtracting the two brightness values and performing the + exponential function. This value is added to n, the running USAN + area. + + in SUSAN smoothing, the variable height mask is implemented by + multiplying the above by the moving mask pointer, reset for each new + centre pixel. + tmp = *dpt++ * *(cp-brightness); + + \**********************************************************************/ + +/**********************************************************************\ + + Success has been reported with the following: + + MACHINE OS COMPILER + + Sun 4.1.4 bundled C, gcc + + Next + + SGI IRIX SGI cc + + DEC Unix V3.2+ + + IBM RISC AIX gcc + + PC Borland 5.0 + + PC Linux gcc-2.6.3 + + PC Win32 Visual C++ 4.0 (Console Application) + + PC Win95 Visual C++ 5.0 (Console Application) + Thanks to Niu Yongsheng : + Use the FOPENB option below + + PC DOS djgpp gnu C + Thanks to Mark Pettovello + : Use the FOPENB option below + + HP HP-UX bundled cc + Thanks to Brian Dixon : + in ksh: + export CCOPTS="-Aa -D_HPUX_SOURCE | -lM" + cc -O3 -o susan susan2l.c + + \**********************************************************************/ + +/**********************************************************************\ + + SUSAN Version 2l, 12/2/99 + Changed GNUDOS option to FOPENB. + (Thanks to Niu Yongsheng .) + Took out redundant "sq=sq/2;". + + SUSAN Version 2k, 19/8/98: + In corner finding: + Changed if(yyx_size) etc. tests in smoothing. + Added a couple of free() calls for cgx and cgy. + (Thanks to geoffb@ucs.ed.ac.uk - Geoff Browitt.) + + SUSAN Version 2i, 21/7/97: + Added information about corner attributes. + + SUSAN Version 2h, 16/12/96: + Added principle (initial enhancement) option. + + SUSAN Version 2g, 2/7/96: + Minor superficial changes to code. + + SUSAN Version 2f, 16/1/96: + Added GNUDOS option (now called FOPENB; see options below). + + SUSAN Version 2e, 9/1/96: + Added -b option. + Fixed 1 pixel horizontal offset error for drawing edges. + + SUSAN Version 2d, 27/11/95: + Fixed loading of certain PGM files in get_image (again!) + + SUSAN Version 2c, 22/11/95: + Fixed loading of certain PGM files in get_image. + (Thanks to qu@San-Jose.ate.slb.com - Gongyuan Qu.) + + SUSAN Version 2b, 9/11/95: + removed "z==" error in edges routines. + + SUSAN Version 2a, 6/11/95: + Removed a few unnecessary variable declarations. + Added different machine information. + Changed "header" in get_image to char. + + SUSAN Version 2, 1/11/95: first combined version able to take any + image sizes. + + SUSAN "Versions 1", circa 1992: the various SUSAN algorithms were + developed during my doctorate within different programs and for + fixed image sizes. The algorithms themselves are virtually unaltered + between "versions 1" and the combined program, version 2. + + \**********************************************************************/ + +#include "wccfile.h" +#include "wcclibm.h" +#include "wccmalloc.h" + +// Wasm loop bounds + + +#include "input.c" +#include "wccfile.c" +#include "wcclibm.c" +#include "wccmalloc.c" + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define EXP_A 184 +#define EXP_C 16249 + +__attribute__((always_inline)) static inline float +susan_expf(float y) { + union { + float d; + struct { +#ifdef LITTLE_ENDIAN + short j, i; +#else + short i, j; +#endif + } n; + } eco; + eco.n.i = EXP_A * (y) + (EXP_C); + eco.n.j = 0; + return eco.d; +} + +__attribute__((always_inline)) static inline float +susan_sqrtf(float val) { + float x = val / 10; + + float dx; + + float diff; + float min_tol = 0.00001f; + + int i, flag; + + flag = 0; + if (val == 0) + x = 0; + else { + __pragma_loopbound(19, 19); + for (i = 1; i < 20; i++) { + if (!flag) { + dx = (val - (x * x)) / (2.0f * x); + x = x + dx; + diff = val - (x * x); + if (fabs(diff) <= min_tol) + flag = 1; + } + } + } + return (x); +} + +/* ********** Optional settings */ + +typedef int TOTAL_TYPE; + +#define SEVEN_SUPP /* size for non-max corner suppression; SEVEN_SUPP or \ + FIVE_SUPP */ +#define MAX_CORNERS 15000 /* max corners per frame */ + +#define FTOI(a) ((a) < 0 ? ((int) (a - 0.5)) : ((int) (a + 0.5))) +#define abs(a) ((a) < 0 ? -a : a) +typedef unsigned char uchar; +typedef struct { + int x, y, info, dx, dy, I; +} corner_rep; +typedef corner_rep CORNER_LIST[MAX_CORNERS]; + +extern char susan_input[7292]; +struct wccFILE susan_file; +float susan_dt; +int susan_bt; +int susan_principle_conf; +int susan_thin_post_proc; +int susan_three_by_three; +int susan_drawing_mode; +int susan_susan_quick; +int susan_max_no_corners; +int susan_max_no_edges; + +__attribute__((always_inline)) static inline int +susan_getint(struct wccFILE *fd) { + int c, i; + char dummy[10000]; + + c = susan_wccfgetc(fd); + __pragma_loopbound(0, 3); + while (1) { /* find next integer */ + if (c == '#') /* if we're at a comment, read to end of line */ + susan_wccfgets(dummy, 9000, fd); + if (c == EOF) { + /* "Image is not binary PGM." */ + } + if (c >= '0' && c <= '9') + break; /* found what we were looking for */ + c = susan_wccfgetc(fd); + } + + /* we're at the start of a number, continue until we hit a non-number */ + i = 0; + __pragma_loopbound(1, 2); + while (1) { + i = (i * 10) + (c - '0'); + c = susan_wccfgetc(fd); + if (c == EOF) + return (i); + if (c < '0' || c > '9') + break; + } + + return (i); +} + +__attribute__((always_inline)) static inline void +susan_get_image(struct wccFILE *fd, unsigned char **in, int *x_size, + int *y_size) { + char header[100]; + + susan_wccfseek(fd, 0, WCCSEEK_SET); + + /* {{{ read header */ + + header[0] = susan_wccfgetc(fd); + header[1] = susan_wccfgetc(fd); + if (!(header[0] == 'P' && header[1] == '5')) { + /* "Image does not have binary PGM header." */ + } + + *x_size = susan_getint(fd); + *y_size = susan_getint(fd); + // dummy read + susan_getint(fd); + + /* }}} */ + + *in = (uchar *) susan_wccmalloc(*x_size * *y_size); + + if (susan_wccfread(*in, 1, *x_size * *y_size, fd) == 0) { + /* "Image is wrong size.\n" */ + } +} + +__attribute__((always_inline)) static inline void +susan_put_image(int x_size, int y_size) { + int i; + __pragma_loopbound(7220, 7220); + for (i = 0; i < x_size * y_size; i++) + ; +} + +__attribute__((always_inline)) static inline void +susan_int_to_uchar(char *r, uchar *in, int size) { + int i, max_r = r[0], min_r = r[0]; + + __pragma_loopbound(0, 0); + for (i = 0; i < size; i++) { + if (r[i] > max_r) + max_r = r[i]; + if (r[i] < min_r) + min_r = r[i]; + } + + if (max_r == min_r) { + /* Should not occur in TACLeBench. */ + __pragma_loopbound(0, 0); + for (i = 0; i < size; i++) + in[i] = (uchar) (0); + + return; + } + max_r -= min_r; + + __pragma_loopbound(0, 0); + for (i = 0; i < size; i++) + in[i] = (uchar) ((int) ((int) (r[i] - min_r) * 255) / max_r); +} + +__attribute__((always_inline)) static inline void +susan_setup_brightness_lut(uchar **bp, int thresh, int form) { + int k; + float temp; + + *bp = (unsigned char *) susan_wccmalloc(516); + *bp = *bp + 258; + + __pragma_loopbound(513, 513); + for (k = -256; k < 257; k++) { + temp = ((float) k) / ((float) thresh); + temp = temp * temp; + if (form == 6) + temp = temp * temp * temp; + temp = 100.0 * susan_expf(-temp); + *(*bp + k) = (uchar) temp; + } +} + +__attribute__((always_inline)) static inline void +susan_principle(uchar *in, char *r, uchar *bp, int max_no, int x_size, + int y_size) { + int i, j, n; + uchar *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size * sizeof(int)); + + __pragma_loopbound(0, 0); + for (i = 3; i < y_size - 3; i++) { + __pragma_loopbound(0, 0); + for (j = 3; j < x_size - 3; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += 2; + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } +} + +__attribute__((always_inline)) static inline void +susan_principle_small(uchar *in, char *r, uchar *bp, int max_no, int x_size, + int y_size) { + int i, j, n; + uchar *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size * sizeof(int)); + + __pragma_loopbound(0, 0); + for (i = 1; i < y_size - 1; i++) { + __pragma_loopbound(0, 0); + for (j = 1; j < x_size - 1; j++) { + n = 100; + p = in + (i - 1) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p); + p += 2; + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } +} + +__attribute__((always_inline)) static inline uchar +susan_median(uchar *in, int i, int j, int x_size) { + int p[8], k, l, tmp; + + p[0] = in[(i - 1) * x_size + j - 1]; + p[1] = in[(i - 1) * x_size + j]; + p[2] = in[(i - 1) * x_size + j + 1]; + p[3] = in[(i) *x_size + j - 1]; + p[4] = in[(i) *x_size + j + 1]; + p[5] = in[(i + 1) * x_size + j - 1]; + p[6] = in[(i + 1) * x_size + j]; + p[7] = in[(i + 1) * x_size + j + 1]; + + __pragma_loopbound(0, 0); + for (k = 0; k < 7; k++) { + __pragma_loopbound(0, 0); + for (l = 0; l < (7 - k); l++) { + if (p[l] > p[l + 1]) { + tmp = p[l]; + p[l] = p[l + 1]; + p[l + 1] = tmp; + } + } + } + + return ((p[3] + p[4]) / 2); +} + +/* this enlarges "in" so that borders can be dealt with easily */ +__attribute__((always_inline)) static inline void +susan_enlarge(uchar **in, uchar *tmp_image, int *x_size, int *y_size, + int border) { + int i, j; + + __pragma_loopbound(95, 95); + for (i = 0; i < *y_size; i++) { /* copy *in into tmp_image */ + susan_wccmemcpy(tmp_image + (i + border) * (*x_size + 2 * border) + + border, + *in + i * *x_size, *x_size); + } + + _Pragma( + "loopbound min 7 max 7") for (i = 0; i < border; + i++) { /* copy top and bottom rows; invert + as many as necessary */ + susan_wccmemcpy(tmp_image + (border - 1 - i) * (*x_size + 2 * border) + + border, + *in + i * *x_size, *x_size); + susan_wccmemcpy(tmp_image + + (*y_size + border + i) * (*x_size + 2 * border) + + border, + *in + (*y_size - i - 1) * *x_size, *x_size); + } + + _Pragma( + "loopbound min 7 max 7") for (i = 0; i < border; + i++) { /* copy left and right columns */ + __pragma_loopbound(109, 109); + for (j = 0; j < *y_size + 2 * border; j++) { + tmp_image[j * (*x_size + 2 * border) + border - 1 - i] = + tmp_image[j * (*x_size + 2 * border) + border + i]; + tmp_image[j * (*x_size + 2 * border) + *x_size + border + i] = + tmp_image[j * (*x_size + 2 * border) + *x_size + border - 1 - + i]; + } + } + + *x_size += 2 * border; /* alter image size */ + *y_size += 2 * border; + *in = tmp_image; /* repoint in */ +} + +__attribute__((always_inline)) static inline void +susan_smoothing(int three_by_three, uchar *in, float dt, int x_size, int y_size, + uchar *bp) { + float temp; + int n_max, increment, mask_size, i, j, x, y, area, brightness, tmp, centre; + uchar *ip, *dp, *dpt, *cp, *out = in, *tmp_image; + TOTAL_TYPE total; + + /* {{{ setup larger image and border sizes */ + + if (three_by_three == 0) + mask_size = ((int) (1.5 * dt)) + 1; + else + mask_size = 1; + + if (dt > 15) { + /* "Distance_thresh too big for integer arithmetic." */ + // Either reduce it to <=15 or recompile with variable "total" + // as a float: see top "defines" section. + } + + if ((2 * mask_size + 1 > x_size) || (2 * mask_size + 1 > y_size)) { + /* "Mask size too big for image." */ + } + + tmp_image = (uchar *) susan_wccmalloc((x_size + mask_size * 2) * + (y_size + mask_size * 2)); + susan_enlarge(&in, tmp_image, &x_size, &y_size, mask_size); + if (three_by_three == 0) { + /* large Gaussian masks */ + /* {{{ setup distance lut */ + + n_max = (mask_size * 2) + 1; + + increment = x_size - n_max; + + dp = (unsigned char *) susan_wccmalloc(n_max * n_max); + dpt = dp; + temp = -(dt * dt); + + __pragma_loopbound(15, 15); + for (i = -mask_size; i <= mask_size; i++) { + __pragma_loopbound(15, 15); + for (j = -mask_size; j <= mask_size; j++) { + x = (int) (100.0 * + susan_expf(((float) ((i * i) + (j * j))) / temp)); + *dpt++ = (unsigned char) x; + } + } + + /* {{{ main section */ + __pragma_loopbound(95, 95); + for (i = mask_size; i < y_size - mask_size; i++) { + __pragma_loopbound(76, 76); + for (j = mask_size; j < x_size - mask_size; j++) { + area = 0; + total = 0; + dpt = dp; + ip = in + ((i - mask_size) * x_size) + j - mask_size; + centre = in[i * x_size + j]; + cp = bp + centre; + __pragma_loopbound(15, 15); + for (y = -mask_size; y <= mask_size; y++) { + __pragma_loopbound(15, 15); + for (x = -mask_size; x <= mask_size; x++) { + brightness = *ip++; + tmp = *dpt++ * *(cp - brightness); + area += tmp; + total += tmp * brightness; + } + ip += increment; + } + tmp = area - 10000; + if (tmp == 0) + *out++ = susan_median(in, i, j, x_size); + else + *out++ = ((total - (centre * 10000)) / tmp); + } + } + } else { + /* 3x3 constant mask */ + + /* {{{ main section */ + __pragma_loopbound(15, 15); // neue Änderung min max 107 + for (i = 1; i < y_size - 1; i++) { + __pragma_loopbound(15, 15); // neue Änderung min max 88 + for (j = 1; j < x_size - 1; j++) { + area = 0; + total = 0; + ip = in + ((i - 1) * x_size) + j - 1; + centre = in[i * x_size + j]; + cp = bp + centre; + + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + ip += x_size - 2; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + ip += x_size - 2; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *(cp - brightness); + area += tmp; + total += tmp * brightness; + + tmp = area - 100; + if (tmp == 0) + *out++ = susan_median(in, i, j, x_size); + else + *out++ = (total - (centre * 100)) / tmp; + } + } + } +} + +__attribute__((always_inline)) static inline void +susan_edge_draw(uchar *in, uchar *mid, int x_size, int y_size, + int drawing_mode) { + int i; + uchar *inp, *midp; + + if (drawing_mode == 0) { + /* mark 3x3 white block around each edge point */ + midp = mid; + __pragma_loopbound(7220, 7220); + for (i = 0; i < x_size * y_size; i++) { + if (*midp < 8) { + inp = in + (midp - mid) - x_size - 1; + *inp++ = 255; + *inp++ = 255; + *inp = 255; + inp += x_size - 2; + *inp++ = 255; + inp++; + *inp = 255; + inp += x_size - 2; + *inp++ = 255; + *inp++ = 255; + *inp = 255; + } + midp++; + } + } + + /* now mark 1 black pixel at each edge point */ + midp = mid; + __pragma_loopbound(7220, 7220); + for (i = 0; i < x_size * y_size; i++) { + if (*midp < 8) + *(in + (midp - mid)) = 0; + midp++; + } +} + +__attribute__((always_inline)) static inline void +susan_thin(char *r, uchar *mid, int x_size, int y_size) { + int l[9], centre, b01, b12, b21, b10, p1, p2, p3, p4, b00, b02, b20, b22, m, + n, a, b, x, y, i, j; + uchar *mp; + + __pragma_loopbound(87, 87); + for (i = 4; i < y_size - 4; i++) { + __pragma_loopbound(68, 68); + for (j = 4; j < x_size - 4; j++) { + if (mid[i * x_size + j] < 8) { + centre = r[i * x_size + j]; + /* {{{ count number of neighbours */ + + mp = mid + (i - 1) * x_size + j - 1; + + n = (*mp < 8) + (*(mp + 1) < 8) + (*(mp + 2) < 8) + + (*(mp + x_size) < 8) + (*(mp + x_size + 2) < 8) + + (*(mp + x_size + x_size) < 8) + + (*(mp + x_size + x_size + 1) < 8) + + (*(mp + x_size + x_size + 2) < 8); + + /* {{{ n==0 no neighbours - remove point */ + + if (n == 0) + mid[i * x_size + j] = 100; + + /* {{{ n==1 - extend line if I can */ + + /* extension is only allowed a few times - the value of mid is + * used to control this */ + + if ((n == 1) && (mid[i * x_size + j] < 6)) { + /* find maximum neighbour weighted in direction opposite the + neighbour already present. e.g. + have: O O O weight r by 0 2 3 + X X O 0 0 4 + O O O 0 2 3 */ + + l[0] = r[(i - 1) * x_size + j - 1]; + l[1] = r[(i - 1) * x_size + j]; + l[2] = r[(i - 1) * x_size + j + 1]; + l[3] = r[(i) *x_size + j - 1]; + l[4] = 0; + l[5] = r[(i) *x_size + j + 1]; + l[6] = r[(i + 1) * x_size + j - 1]; + l[7] = r[(i + 1) * x_size + j]; + l[8] = r[(i + 1) * x_size + j + 1]; + + if (mid[(i - 1) * x_size + j - 1] < 8) { + l[0] = 0; + l[1] = 0; + l[3] = 0; + l[2] *= 2; + l[6] *= 2; + l[5] *= 3; + l[7] *= 3; + l[8] *= 4; + } else { + if (mid[(i - 1) * x_size + j] < 8) { + l[1] = 0; + l[0] = 0; + l[2] = 0; + l[3] *= 2; + l[5] *= 2; + l[6] *= 3; + l[8] *= 3; + l[7] *= 4; + } else { + if (mid[(i - 1) * x_size + j + 1] < 8) { + l[2] = 0; + l[1] = 0; + l[5] = 0; + l[0] *= 2; + l[8] *= 2; + l[3] *= 3; + l[7] *= 3; + l[6] *= 4; + } else { + if (mid[(i) *x_size + j - 1] < 8) { + l[3] = 0; + l[0] = 0; + l[6] = 0; + l[1] *= 2; + l[7] *= 2; + l[2] *= 3; + l[8] *= 3; + l[5] *= 4; + } else { + if (mid[(i) *x_size + j + 1] < 8) { + l[5] = 0; + l[2] = 0; + l[8] = 0; + l[1] *= 2; + l[7] *= 2; + l[0] *= 3; + l[6] *= 3; + l[3] *= 4; + } else { + if (mid[(i + 1) * x_size + j - 1] < 8) { + l[6] = 0; + l[3] = 0; + l[7] = 0; + l[0] *= 2; + l[8] *= 2; + l[1] *= 3; + l[5] *= 3; + l[2] *= 4; + } else { + if (mid[(i + 1) * x_size + j] < 8) { + l[7] = 0; + l[6] = 0; + l[8] = 0; + l[3] *= 2; + l[5] *= 2; + l[0] *= 3; + l[2] *= 3; + l[1] *= 4; + } else { + if (mid[(i + 1) * x_size + j + + 1] < 8) { + l[8] = 0; + l[5] = 0; + l[7] = 0; + l[6] *= 2; + l[2] *= 2; + l[1] *= 3; + l[3] *= 3; + l[0] *= 4; + } + } + } + } + } + } + } + } + + m = 0; /* find the highest point */ + __pragma_loopbound(3, 3); + for (y = 0; y < 3; y++) + _Pragma( + "loopbound min 3 max 3") for (x = 0; x < 3; + x++) if (l[y + y + y + + x] > m) { + m = l[y + y + y + x]; + a = y; + b = x; + } + + if (m > 0) { + if (mid[i * x_size + j] < 4) + mid[(i + a - 1) * x_size + j + b - 1] = 4; + else + mid[(i + a - 1) * x_size + j + b - 1] = + mid[i * x_size + j] + 1; + if ((a + a + b) < 3) { /* need to jump back in image */ + i += a - 1; + j += b - 2; + if (i < 4) + i = 4; + if (j < 4) + j = 4; + } + } + } + + /* {{{ n==2 */ + + if (n == 2) { + /* put in a bit here to straighten edges */ + b00 = + mid[(i - 1) * x_size + j - 1] < 8; /* corners of 3x3 */ + b02 = mid[(i - 1) * x_size + j + 1] < 8; + b20 = mid[(i + 1) * x_size + j - 1] < 8; + b22 = mid[(i + 1) * x_size + j + 1] < 8; + if (((b00 + b02 + b20 + b22) == 2) && + ((b00 | b22) & (b02 | b20))) { + /* case: move a point back into line. + e.g. X O X CAN become X X X + O X O O O O + O O O O O O */ + if (b00) { + if (b02) { + x = 0; + y = -1; + } else { + x = -1; + y = 0; + } + } else { + if (b02) { + x = 1; + y = 0; + } else { + x = 0; + y = 1; + } + } + if (((float) r[(i + y) * x_size + j + x] / + (float) centre) > 0.7) { + if (((x == 0) && + (mid[(i + (2 * y)) * x_size + j] > 7) && + (mid[(i + (2 * y)) * x_size + j - 1] > 7) && + (mid[(i + (2 * y)) * x_size + j + 1] > 7)) || + ((y == 0) && + (mid[(i) *x_size + j + (2 * x)] > 7) && + (mid[(i + 1) * x_size + j + (2 * x)] > 7) && + (mid[(i - 1) * x_size + j + (2 * x)] > 7))) { + mid[(i) *x_size + j] = 100; + mid[(i + y) * x_size + j + x] = + 3; /* no jumping needed */ + } + } + } else { + b01 = mid[(i - 1) * x_size + j] < 8; + b12 = mid[(i) *x_size + j + 1] < 8; + b21 = mid[(i + 1) * x_size + j] < 8; + b10 = mid[(i) *x_size + j - 1] < 8; + /* {{{ right angle ends - not currently used */ + +#ifdef IGNORETHIS + if ((b00 & b01) | (b00 & b10) | (b02 & b01) | + (b02 & b12) | (b20 & b10) | (b20 & b21) | + (b22 & b21) | (b22 & b12)) { + /* case; right angle ends. clean up. + e.g.; X X O CAN become X X O + O X O O O O + O O O O O O */ + if (((b01) & (mid[(i - 2) * x_size + j - 1] > 7) & + (mid[(i - 2) * x_size + j] > 7) & + (mid[(i - 2) * x_size + j + 1] > 7) & + ((b00 & ((2 * r[(i - 1) * x_size + j + 1]) > + centre)) | + (b02 & ((2 * r[(i - 1) * x_size + j - 1]) > + centre)))) | + ((b10) & (mid[(i - 1) * x_size + j - 2] > 7) & + (mid[(i) *x_size + j - 2] > 7) & + (mid[(i + 1) * x_size + j - 2] > 7) & + ((b00 & ((2 * r[(i + 1) * x_size + j - 1]) > + centre)) | + (b20 & ((2 * r[(i - 1) * x_size + j - 1]) > + centre)))) | + ((b12) & (mid[(i - 1) * x_size + j + 2] > 7) & + (mid[(i) *x_size + j + 2] > 7) & + (mid[(i + 1) * x_size + j + 2] > 7) & + ((b02 & ((2 * r[(i + 1) * x_size + j + 1]) > + centre)) | + (b22 & ((2 * r[(i - 1) * x_size + j + 1]) > + centre)))) | + ((b21) & (mid[(i + 2) * x_size + j - 1] > 7) & + (mid[(i + 2) * x_size + j] > 7) & + (mid[(i + 2) * x_size + j + 1] > 7) & + ((b20 & ((2 * r[(i + 1) * x_size + j + 1]) > + centre)) | + (b22 & ((2 * r[(i + 1) * x_size + j - 1]) > + centre))))) { + mid[(i) *x_size + j] = 100; + if (b10 & b20) + j -= 2; + if (b00 | b01 | b02) { + i--; + j -= 2; + } + } + } +#endif + + if (((b01 + b12 + b21 + b10) == 2) && + ((b10 | b12) & (b01 | b21)) && + ((b01 & ((mid[(i - 2) * x_size + j - 1] < 8) | + (mid[(i - 2) * x_size + j + 1] < 8))) | + (b10 & ((mid[(i - 1) * x_size + j - 2] < 8) | + (mid[(i + 1) * x_size + j - 2] < 8))) | + (b12 & ((mid[(i - 1) * x_size + j + 2] < 8) | + (mid[(i + 1) * x_size + j + 2] < 8))) | + (b21 & ((mid[(i + 2) * x_size + j - 1] < 8) | + (mid[(i + 2) * x_size + j + 1] < 8))))) { + /* case; clears odd right angles. + e.g.; O O O becomes O O O + X X O X O O + O X O O X O */ + mid[(i) *x_size + j] = 100; + i--; /* jump back */ + j -= 2; + if (i < 4) + i = 4; + if (j < 4) + j = 4; + } + } + } + + /* {{{ n>2 the thinning is done here without breaking + * connectivity */ + + if (n > 2) { + b01 = mid[(i - 1) * x_size + j] < 8; + b12 = mid[(i) *x_size + j + 1] < 8; + b21 = mid[(i + 1) * x_size + j] < 8; + b10 = mid[(i) *x_size + j - 1] < 8; + if ((b01 + b12 + b21 + b10) > 1) { + b00 = mid[(i - 1) * x_size + j - 1] < 8; + b02 = mid[(i - 1) * x_size + j + 1] < 8; + b20 = mid[(i + 1) * x_size + j - 1] < 8; + b22 = mid[(i + 1) * x_size + j + 1] < 8; + p1 = b00 | b01; + p2 = b02 | b12; + p3 = b22 | b21; + p4 = b20 | b10; + + if (((p1 + p2 + p3 + p4) - ((b01 & p2) + (b12 & p3) + + (b21 & p4) + (b10 & p1))) < + 2) { + mid[(i) *x_size + j] = 100; + i--; + j -= 2; + if (i < 4) + i = 4; + if (j < 4) + j = 4; + } + } + } + } + } + } +} + +__attribute__((always_inline)) static inline void +susan_edges(uchar *in, char *r, uchar *mid, uchar *bp, int max_no, int x_size, + int y_size) { + float z; + int do_symmetry, i, j, m, n, a, b, x, y, w; + uchar c, *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size); + + __pragma_loopbound(89, 89); + for (i = 3; i < y_size - 3; i++) { + __pragma_loopbound(70, 70); + for (j = 3; j < x_size - 3; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += 2; + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } + + __pragma_loopbound(87, 87); + for (i = 4; i < y_size - 4; i++) { + __pragma_loopbound(68, 68); + for (j = 4; j < x_size - 4; j++) { + if (r[i * x_size + j] > 0) { + m = r[i * x_size + j]; + n = max_no - m; + cp = bp + in[i * x_size + j]; + + if (n > 600) { + p = in + (i - 3) * x_size + j - 1; + x = 0; + y = 0; + + c = *(cp - *p++); + x -= c; + y -= 3 * c; + c = *(cp - *p++); + y -= 3 * c; + c = *(cp - *p); + x += c; + y -= 3 * c; + p += x_size - 3; + + c = *(cp - *p++); + x -= 2 * c; + y -= 2 * c; + c = *(cp - *p++); + x -= c; + y -= 2 * c; + c = *(cp - *p++); + y -= 2 * c; + c = *(cp - *p++); + x += c; + y -= 2 * c; + c = *(cp - *p); + x += 2 * c; + y -= 2 * c; + p += x_size - 5; + + c = *(cp - *p++); + x -= 3 * c; + y -= c; + c = *(cp - *p++); + x -= 2 * c; + y -= c; + c = *(cp - *p++); + x -= c; + y -= c; + c = *(cp - *p++); + y -= c; + c = *(cp - *p++); + x += c; + y -= c; + c = *(cp - *p++); + x += 2 * c; + y -= c; + c = *(cp - *p); + x += 3 * c; + y -= c; + p += x_size - 6; + + c = *(cp - *p++); + x -= 3 * c; + c = *(cp - *p++); + x -= 2 * c; + c = *(cp - *p); + x -= c; + p += 2; + c = *(cp - *p++); + x += c; + c = *(cp - *p++); + x += 2 * c; + c = *(cp - *p); + x += 3 * c; + p += x_size - 6; + + c = *(cp - *p++); + x -= 3 * c; + y += c; + c = *(cp - *p++); + x -= 2 * c; + y += c; + c = *(cp - *p++); + x -= c; + y += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p++); + x += c; + y += c; + c = *(cp - *p++); + x += 2 * c; + y += c; + c = *(cp - *p); + x += 3 * c; + y += c; + p += x_size - 5; + + c = *(cp - *p++); + x -= 2 * c; + y += 2 * c; + c = *(cp - *p++); + x -= c; + y += 2 * c; + c = *(cp - *p++); + y += 2 * c; + c = *(cp - *p++); + x += c; + y += 2 * c; + c = *(cp - *p); + x += 2 * c; + y += 2 * c; + p += x_size - 3; + + c = *(cp - *p++); + x -= c; + y += 3 * c; + c = *(cp - *p++); + y += 3 * c; + c = *(cp - *p); + x += c; + y += 3 * c; + + z = susan_sqrtf((float) ((x * x) + (y * y))); + if (z > (0.9 * (float) n)) { /* 0.5 */ + do_symmetry = 0; + if (x == 0) + z = 1000000.0; + else + z = ((float) y) / ((float) x); + if (z < 0) { + z = -z; + w = -1; + } else + w = 1; + if (z < 0.5) { + /* vert_edge */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* hor_edge */ a = 1; + b = 0; + } else { + /* diag_edge */ if (w > 0) { + a = 1; + b = 1; + } else { + a = -1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b]) && + (m > r[(i + (2 * a)) * x_size + j + (2 * b)]) && + (m >= r[(i - (2 * a)) * x_size + j - (2 * b)])) + mid[i * x_size + j] = 1; + } else + do_symmetry = 1; + } else + do_symmetry = 1; + + if (do_symmetry == 1) { + p = in + (i - 3) * x_size + j - 1; + x = 0; + y = 0; + w = 0; + + /* | \ + y -x- w + | \ */ + + c = *(cp - *p++); + x += c; + y += 9 * c; + w += 3 * c; + c = *(cp - *p++); + y += 9 * c; + c = *(cp - *p); + x += c; + y += 9 * c; + w -= 3 * c; + p += x_size - 3; + + c = *(cp - *p++); + x += 4 * c; + y += 4 * c; + w += 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w += 2 * c; + c = *(cp - *p++); + y += 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w -= 2 * c; + c = *(cp - *p); + x += 4 * c; + y += 4 * c; + w -= 4 * c; + p += x_size - 5; + + c = *(cp - *p++); + x += 9 * c; + y += c; + w += 3 * c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w += 2 * c; + c = *(cp - *p++); + x += c; + y += c; + w += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p++); + x += c; + y += c; + w -= c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w -= 2 * c; + c = *(cp - *p); + x += 9 * c; + y += c; + w -= 3 * c; + p += x_size - 6; + + c = *(cp - *p++); + x += 9 * c; + c = *(cp - *p++); + x += 4 * c; + c = *(cp - *p); + x += c; + p += 2; + c = *(cp - *p++); + x += c; + c = *(cp - *p++); + x += 4 * c; + c = *(cp - *p); + x += 9 * c; + p += x_size - 6; + + c = *(cp - *p++); + x += 9 * c; + y += c; + w -= 3 * c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w -= 2 * c; + c = *(cp - *p++); + x += c; + y += c; + w -= c; + c = *(cp - *p++); + y += c; + c = *(cp - *p++); + x += c; + y += c; + w += c; + c = *(cp - *p++); + x += 4 * c; + y += c; + w += 2 * c; + c = *(cp - *p); + x += 9 * c; + y += c; + w += 3 * c; + p += x_size - 5; + + c = *(cp - *p++); + x += 4 * c; + y += 4 * c; + w -= 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w -= 2 * c; + c = *(cp - *p++); + y += 4 * c; + c = *(cp - *p++); + x += c; + y += 4 * c; + w += 2 * c; + c = *(cp - *p); + x += 4 * c; + y += 4 * c; + w += 4 * c; + p += x_size - 3; + + c = *(cp - *p++); + x += c; + y += 9 * c; + w -= 3 * c; + c = *(cp - *p++); + y += 9 * c; + c = *(cp - *p); + x += c; + y += 9 * c; + w += 3 * c; + + if (y == 0) + z = 1000000.0; + else + z = ((float) x) / ((float) y); + if (z < 0.5) { + /* vertical */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* horizontal */ a = 1; + b = 0; + } else { + /* diagonal */ if (w > 0) { + a = -1; + b = 1; + } else { + a = 1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b]) && + (m > r[(i + (2 * a)) * x_size + j + (2 * b)]) && + (m >= r[(i - (2 * a)) * x_size + j - (2 * b)])) + mid[i * x_size + j] = 2; + } + } + } + } +} + +__attribute__((always_inline)) static inline void +susan_edges_small(uchar *in, char *r, uchar *mid, uchar *bp, int max_no, + int x_size, int y_size) { + float z; + int do_symmetry, i, j, m, n, a, b, x, y, w; + uchar c, *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size); + + __pragma_loopbound(0, 0); + for (i = 1; i < y_size - 1; i++) { + __pragma_loopbound(0, 0); + for (j = 1; j < x_size - 1; j++) { + n = 100; + p = in + (i - 1) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p); + p += 2; + n += *(cp - *p); + p += x_size - 2; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + + if (n <= max_no) + r[i * x_size + j] = max_no - n; + } + } + + __pragma_loopbound(0, 0); + for (i = 2; i < y_size - 2; i++) { + __pragma_loopbound(0, 0); + for (j = 2; j < x_size - 2; j++) { + if (r[i * x_size + j] > 0) { + m = r[i * x_size + j]; + n = max_no - m; + cp = bp + in[i * x_size + j]; + + if (n > 250) { + p = in + (i - 1) * x_size + j - 1; + x = 0; + y = 0; + + c = *(cp - *p++); + x -= c; + y -= c; + c = *(cp - *p++); + y -= c; + c = *(cp - *p); + x += c; + y -= c; + p += x_size - 2; + + c = *(cp - *p); + x -= c; + p += 2; + c = *(cp - *p); + x += c; + p += x_size - 2; + + c = *(cp - *p++); + x -= c; + y += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p); + x += c; + y += c; + + z = susan_sqrtf((float) ((x * x) + (y * y))); + if (z > (0.4 * (float) n)) { /* 0.6 */ + do_symmetry = 0; + if (x == 0) + z = 1000000.0; + else + z = ((float) y) / ((float) x); + if (z < 0) { + z = -z; + w = -1; + } else + w = 1; + if (z < 0.5) { + /* vert_edge */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* hor_edge */ a = 1; + b = 0; + } else { + /* diag_edge */ if (w > 0) { + a = 1; + b = 1; + } else { + a = -1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b])) + mid[i * x_size + j] = 1; + } else + do_symmetry = 1; + } else + do_symmetry = 1; + + if (do_symmetry == 1) { + p = in + (i - 1) * x_size + j - 1; + x = 0; + y = 0; + w = 0; + + /* | \ + y -x- w + | \ */ + + c = *(cp - *p++); + x += c; + y += c; + w += c; + c = *(cp - *p++); + y += c; + c = *(cp - *p); + x += c; + y += c; + w -= c; + p += x_size - 2; + + c = *(cp - *p); + x += c; + p += 2; + c = *(cp - *p); + x += c; + p += x_size - 2; + + c = *(cp - *p++); + x += c; + y += c; + w -= c; + c = *(cp - *p++); + y += c; + c = *(cp - *p); + x += c; + y += c; + w += c; + + if (y == 0) + z = 1000000.0; + else + z = ((float) x) / ((float) y); + if (z < 0.5) { + /* vertical */ a = 0; + b = 1; + } else { + if (z > 2.0) { + /* horizontal */ a = 1; + b = 0; + } else { + /* diagonal */ if (w > 0) { + a = -1; + b = 1; + } else { + a = 1; + b = 1; + } + } + } + if ((m > r[(i + a) * x_size + j + b]) && + (m >= r[(i - a) * x_size + j - b])) + mid[i * x_size + j] = 2; + } + } + } + } +} + +__attribute__((always_inline)) static inline void +susan_corner_draw(uchar *in, CORNER_LIST corner_list, int x_size, + int drawing_mode) { + uchar *p; + int n = 0; + + __pragma_loopbound(0, 0); + while (corner_list[n].info != 7) { + if (drawing_mode == 0) { + p = in + (corner_list[n].y - 1) * x_size + corner_list[n].x - 1; + *p++ = 255; + *p++ = 255; + *p = 255; + p += x_size - 2; + *p++ = 255; + *p++ = 0; + *p = 255; + p += x_size - 2; + *p++ = 255; + *p++ = 255; + *p = 255; + n++; + } else { + p = in + corner_list[n].y * x_size + corner_list[n].x; + *p = 0; + n++; + } + } +} + +__attribute__((always_inline)) static inline void +susan_corners(uchar *in, char *r, uchar *bp, int max_no, + CORNER_LIST corner_list, int x_size, int y_size) { + int n, x, y, sq, xx, yy, i, j; + float divide; + uchar c, *p, *cp; + char *cgx, *cgy; + + susan_wccmemset(r, 0, x_size * y_size); + + cgx = (char *) susan_wccmalloc(x_size * y_size); + cgy = (char *) susan_wccmalloc(x_size * y_size); + + __pragma_loopbound(85, 85); + for (i = 5; i < y_size - 5; i++) { + __pragma_loopbound(66, 66); + for (j = 5; j < x_size - 5; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + if (n < max_no) { /* do this test early and often ONLY to save + wasted computation */ + p += 2; + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 6; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 5; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - + *p++); + if (n < + max_no) { + n += + *(cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + if (n < + max_no) { + p += + x_size - + 3; + + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + + if (n < + max_no) { + x = 0; + y = 0; + p = in + + (i - + 3) * + x_size + + j - + 1; + + c = *( + cp - + *p++); + x -= + c; + y -= + 3 * + c; + c = *( + cp - + *p++); + y -= + 3 * + c; + c = *( + cp - + *p); + x += + c; + y -= + 3 * + c; + p += + x_size - + 3; + + c = *( + cp - + *p++); + x -= + 2 * + c; + y -= + 2 * + c; + c = *( + cp - + *p++); + x -= + c; + y -= + 2 * + c; + c = *( + cp - + *p++); + y -= + 2 * + c; + c = *( + cp - + *p++); + x += + c; + y -= + 2 * + c; + c = *( + cp - + *p); + x += + 2 * + c; + y -= + 2 * + c; + p += + x_size - + 5; + + c = *( + cp - + *p++); + x -= + 3 * + c; + y -= + c; + c = *( + cp - + *p++); + x -= + 2 * + c; + y -= + c; + c = *( + cp - + *p++); + x -= + c; + y -= + c; + c = *( + cp - + *p++); + y -= + c; + c = *( + cp - + *p++); + x += + c; + y -= + c; + c = *( + cp - + *p++); + x += + 2 * + c; + y -= + c; + c = *( + cp - + *p); + x += + 3 * + c; + y -= + c; + p += + x_size - + 6; + + c = *( + cp - + *p++); + x -= + 3 * + c; + c = *( + cp - + *p++); + x -= + 2 * + c; + c = *( + cp - + *p); + x -= + c; + p += + 2; + c = *( + cp - + *p++); + x += + c; + c = *( + cp - + *p++); + x += + 2 * + c; + c = *( + cp - + *p); + x += + 3 * + c; + p += + x_size - + 6; + + c = *( + cp - + *p++); + x -= + 3 * + c; + y += + c; + c = *( + cp - + *p++); + x -= + 2 * + c; + y += + c; + c = *( + cp - + *p++); + x -= + c; + y += + c; + c = *( + cp - + *p++); + y += + c; + c = *( + cp - + *p++); + x += + c; + y += + c; + c = *( + cp - + *p++); + x += + 2 * + c; + y += + c; + c = *( + cp - + *p); + x += + 3 * + c; + y += + c; + p += + x_size - + 5; + + c = *( + cp - + *p++); + x -= + 2 * + c; + y += + 2 * + c; + c = *( + cp - + *p++); + x -= + c; + y += + 2 * + c; + c = *( + cp - + *p++); + y += + 2 * + c; + c = *( + cp - + *p++); + x += + c; + y += + 2 * + c; + c = *( + cp - + *p); + x += + 2 * + c; + y += + 2 * + c; + p += + x_size - + 3; + + c = *( + cp - + *p++); + x -= + c; + y += + 3 * + c; + c = *( + cp - + *p++); + y += + 3 * + c; + c = *( + cp - + *p); + x += + c; + y += + 3 * + c; + + xx = + x * + x; + yy = + y * + y; + sq = + xx + + yy; + if (sq > + ((n * + n) / + 2)) { + if (yy < + xx) { + divide = + (float) + y / + (float) abs( + x); + sq = + abs(x) / + x; + sq = + *(cp - + in[(i + + FTOI( + divide)) * + x_size + + j + + sq]) + + *(cp - + in[(i + + FTOI( + 2 * + divide)) * + x_size + + j + + 2 * sq]) + + *(cp - + in[(i + + FTOI( + 3 * + divide)) * + x_size + + j + + 3 * sq]); + } else { + divide = + (float) + x / + (float) abs( + y); + sq = + abs(y) / + y; + sq = + *(cp - + in[(i + + sq) * + x_size + + j + + FTOI( + divide)]) + + *(cp - + in[(i + + 2 * sq) * + x_size + + j + + FTOI( + 2 * + divide)]) + + *(cp - + in[(i + + 3 * sq) * + x_size + + j + + FTOI( + 3 * + divide)]); + } + + if (sq > + 290) { + r[i * x_size + + j] = + max_no - + n; + cgx[i * x_size + + j] = + (51 * + x) / + n; + cgy[i * x_size + + j] = + (51 * + y) / + n; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + /* to locate the local maxima */ + n = 0; + __pragma_loopbound(85, 85); + for (i = 5; i < y_size - 5; i++) { + __pragma_loopbound(66, 66); + for (j = 5; j < x_size - 5; j++) { + x = r[i * x_size + j]; + if (x > 0) { +/* 5x5 mask */ +#ifdef FIVE_SUPP + if ((x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i) *x_size + j + 1]) && + (x > r[(i) *x_size + j + 2]) && + (x > r[(i + 1) * x_size + j - 1]) && + (x > r[(i + 1) * x_size + j]) && + (x > r[(i + 1) * x_size + j + 1]) && + (x > r[(i + 1) * x_size + j + 2]) && + (x > r[(i + 2) * x_size + j - 2]) && + (x > r[(i + 2) * x_size + j - 1]) && + (x > r[(i + 2) * x_size + j]) && + (x > r[(i + 2) * x_size + j + 1]) && + (x > r[(i + 2) * x_size + j + 2]) && + (x >= r[(i - 2) * x_size + j - 2]) && + (x >= r[(i - 2) * x_size + j - 1]) && + (x >= r[(i - 2) * x_size + j]) && + (x >= r[(i - 2) * x_size + j + 1]) && + (x >= r[(i - 2) * x_size + j + 2]) && + (x >= r[(i - 1) * x_size + j - 2]) && + (x >= r[(i - 1) * x_size + j - 1]) && + (x >= r[(i - 1) * x_size + j]) && + (x >= r[(i - 1) * x_size + j + 1]) && + (x >= r[(i) *x_size + j - 2]) && + (x >= r[(i) *x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j - 2])) +#endif +#ifdef SEVEN_SUPP + if ((x > r[(i - 3) * x_size + j - 3]) && + (x > r[(i - 3) * x_size + j - 2]) && + (x > r[(i - 3) * x_size + j - 1]) && + (x > r[(i - 3) * x_size + j]) && + (x > r[(i - 3) * x_size + j + 1]) && + (x > r[(i - 3) * x_size + j + 2]) && + (x > r[(i - 3) * x_size + j + 3]) && + + (x > r[(i - 2) * x_size + j - 3]) && + (x > r[(i - 2) * x_size + j - 2]) && + (x > r[(i - 2) * x_size + j - 1]) && + (x > r[(i - 2) * x_size + j]) && + (x > r[(i - 2) * x_size + j + 1]) && + (x > r[(i - 2) * x_size + j + 2]) && + (x > r[(i - 2) * x_size + j + 3]) && + + (x > r[(i - 1) * x_size + j - 3]) && + (x > r[(i - 1) * x_size + j - 2]) && + (x > r[(i - 1) * x_size + j - 1]) && + (x > r[(i - 1) * x_size + j]) && + (x > r[(i - 1) * x_size + j + 1]) && + (x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i - 1) * x_size + j + 3]) && + + (x > r[(i) *x_size + j - 3]) && + (x > r[(i) *x_size + j - 2]) && + (x > r[(i) *x_size + j - 1]) && + (x >= r[(i) *x_size + j + 1]) && + (x >= r[(i) *x_size + j + 2]) && + (x >= r[(i) *x_size + j + 3]) && + + (x >= r[(i + 1) * x_size + j - 3]) && + (x >= r[(i + 1) * x_size + j - 2]) && + (x >= r[(i + 1) * x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j]) && + (x >= r[(i + 1) * x_size + j + 1]) && + (x >= r[(i + 1) * x_size + j + 2]) && + (x >= r[(i + 1) * x_size + j + 3]) && + + (x >= r[(i + 2) * x_size + j - 3]) && + (x >= r[(i + 2) * x_size + j - 2]) && + (x >= r[(i + 2) * x_size + j - 1]) && + (x >= r[(i + 2) * x_size + j]) && + (x >= r[(i + 2) * x_size + j + 1]) && + (x >= r[(i + 2) * x_size + j + 2]) && + (x >= r[(i + 2) * x_size + j + 3]) && + + (x >= r[(i + 3) * x_size + j - 3]) && + (x >= r[(i + 3) * x_size + j - 2]) && + (x >= r[(i + 3) * x_size + j - 1]) && + (x >= r[(i + 3) * x_size + j]) && + (x >= r[(i + 3) * x_size + j + 1]) && + (x >= r[(i + 3) * x_size + j + 2]) && + (x >= r[(i + 3) * x_size + j + 3])) +#endif + { + corner_list[n].info = 0; + corner_list[n].x = j; + corner_list[n].y = i; + corner_list[n].dx = cgx[i * x_size + j]; + corner_list[n].dy = cgy[i * x_size + j]; + corner_list[n].I = in[i * x_size + j]; + n++; + if (n == MAX_CORNERS) { + /* "Too many corners." */ + } + } + } + } + } + corner_list[n].info = 7; +} + +__attribute__((always_inline)) static inline void +susan_corners_quick(uchar *in, char *r, uchar *bp, int max_no, + CORNER_LIST corner_list, int x_size, int y_size) { + int n, x, y, i, j; + uchar *p, *cp; + + susan_wccmemset(r, 0, x_size * y_size); + + __pragma_loopbound(0, 0); + for (i = 7; i < y_size - 7; i++) { + __pragma_loopbound(0, 0); + for (j = 7; j < x_size - 7; j++) { + n = 100; + p = in + (i - 3) * x_size + j - 1; + cp = bp + in[i * x_size + j]; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 3; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 5; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + p += x_size - 6; + + n += *(cp - *p++); + n += *(cp - *p++); + n += *(cp - *p); + if (n < max_no) { + p += 2; + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 6; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p); + if (n < max_no) { + p += x_size - 5; + + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - *p++); + if (n < max_no) { + n += *(cp - + *p++); + if (n < + max_no) { + n += + *(cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + if (n < + max_no) { + p += + x_size - + 3; + + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p++); + if (n < + max_no) { + n += *( + cp - + *p); + + if (n < + max_no) + r[i * x_size + + j] = + max_no - + n; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + /* to locate the local maxima */ + n = 0; + __pragma_loopbound(0, 0); + for (i = 7; i < y_size - 7; i++) { + __pragma_loopbound(0, 0); + for (j = 7; j < x_size - 7; j++) { + x = r[i * x_size + j]; + if (x > 0) { +/* 5x5 mask */ +#ifdef FIVE_SUPP + if ((x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i) *x_size + j + 1]) && + (x > r[(i) *x_size + j + 2]) && + (x > r[(i + 1) * x_size + j - 1]) && + (x > r[(i + 1) * x_size + j]) && + (x > r[(i + 1) * x_size + j + 1]) && + (x > r[(i + 1) * x_size + j + 2]) && + (x > r[(i + 2) * x_size + j - 2]) && + (x > r[(i + 2) * x_size + j - 1]) && + (x > r[(i + 2) * x_size + j]) && + (x > r[(i + 2) * x_size + j + 1]) && + (x > r[(i + 2) * x_size + j + 2]) && + (x >= r[(i - 2) * x_size + j - 2]) && + (x >= r[(i - 2) * x_size + j - 1]) && + (x >= r[(i - 2) * x_size + j]) && + (x >= r[(i - 2) * x_size + j + 1]) && + (x >= r[(i - 2) * x_size + j + 2]) && + (x >= r[(i - 1) * x_size + j - 2]) && + (x >= r[(i - 1) * x_size + j - 1]) && + (x >= r[(i - 1) * x_size + j]) && + (x >= r[(i - 1) * x_size + j + 1]) && + (x >= r[(i) *x_size + j - 2]) && + (x >= r[(i) *x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j - 2])) +#endif +#ifdef SEVEN_SUPP + if ((x > r[(i - 3) * x_size + j - 3]) && + (x > r[(i - 3) * x_size + j - 2]) && + (x > r[(i - 3) * x_size + j - 1]) && + (x > r[(i - 3) * x_size + j]) && + (x > r[(i - 3) * x_size + j + 1]) && + (x > r[(i - 3) * x_size + j + 2]) && + (x > r[(i - 3) * x_size + j + 3]) && + + (x > r[(i - 2) * x_size + j - 3]) && + (x > r[(i - 2) * x_size + j - 2]) && + (x > r[(i - 2) * x_size + j - 1]) && + (x > r[(i - 2) * x_size + j]) && + (x > r[(i - 2) * x_size + j + 1]) && + (x > r[(i - 2) * x_size + j + 2]) && + (x > r[(i - 2) * x_size + j + 3]) && + + (x > r[(i - 1) * x_size + j - 3]) && + (x > r[(i - 1) * x_size + j - 2]) && + (x > r[(i - 1) * x_size + j - 1]) && + (x > r[(i - 1) * x_size + j]) && + (x > r[(i - 1) * x_size + j + 1]) && + (x > r[(i - 1) * x_size + j + 2]) && + (x > r[(i - 1) * x_size + j + 3]) && + + (x > r[(i) *x_size + j - 3]) && + (x > r[(i) *x_size + j - 2]) && + (x > r[(i) *x_size + j - 1]) && + (x >= r[(i) *x_size + j + 1]) && + (x >= r[(i) *x_size + j + 2]) && + (x >= r[(i) *x_size + j + 3]) && + + (x >= r[(i + 1) * x_size + j - 3]) && + (x >= r[(i + 1) * x_size + j - 2]) && + (x >= r[(i + 1) * x_size + j - 1]) && + (x >= r[(i + 1) * x_size + j]) && + (x >= r[(i + 1) * x_size + j + 1]) && + (x >= r[(i + 1) * x_size + j + 2]) && + (x >= r[(i + 1) * x_size + j + 3]) && + + (x >= r[(i + 2) * x_size + j - 3]) && + (x >= r[(i + 2) * x_size + j - 2]) && + (x >= r[(i + 2) * x_size + j - 1]) && + (x >= r[(i + 2) * x_size + j]) && + (x >= r[(i + 2) * x_size + j + 1]) && + (x >= r[(i + 2) * x_size + j + 2]) && + (x >= r[(i + 2) * x_size + j + 3]) && + + (x >= r[(i + 3) * x_size + j - 3]) && + (x >= r[(i + 3) * x_size + j - 2]) && + (x >= r[(i + 3) * x_size + j - 1]) && + (x >= r[(i + 3) * x_size + j]) && + (x >= r[(i + 3) * x_size + j + 1]) && + (x >= r[(i + 3) * x_size + j + 2]) && + (x >= r[(i + 3) * x_size + j + 3])) +#endif + { + corner_list[n].info = 0; + corner_list[n].x = j; + corner_list[n].y = i; + x = in[(i - 2) * x_size + j - 2] + + in[(i - 2) * x_size + j - 1] + + in[(i - 2) * x_size + j] + + in[(i - 2) * x_size + j + 1] + + in[(i - 2) * x_size + j + 2] + + in[(i - 1) * x_size + j - 2] + + in[(i - 1) * x_size + j - 1] + + in[(i - 1) * x_size + j] + + in[(i - 1) * x_size + j + 1] + + in[(i - 1) * x_size + j + 2] + + in[(i) *x_size + j - 2] + in[(i) *x_size + j - 1] + + in[(i) *x_size + j] + in[(i) *x_size + j + 1] + + in[(i) *x_size + j + 2] + + in[(i + 1) * x_size + j - 2] + + in[(i + 1) * x_size + j - 1] + + in[(i + 1) * x_size + j] + + in[(i + 1) * x_size + j + 1] + + in[(i + 1) * x_size + j + 2] + + in[(i + 2) * x_size + j - 2] + + in[(i + 2) * x_size + j - 1] + + in[(i + 2) * x_size + j] + + in[(i + 2) * x_size + j + 1] + + in[(i + 2) * x_size + j + 2]; + + corner_list[n].I = x / 25; + /*corner_list[ n ].I=in[ i*x_size+j ];*/ + x = in[(i - 2) * x_size + j + 2] + + in[(i - 1) * x_size + j + 2] + + in[(i) *x_size + j + 2] + + in[(i + 1) * x_size + j + 2] + + in[(i + 2) * x_size + j + 2] - + (in[(i - 2) * x_size + j - 2] + + in[(i - 1) * x_size + j - 2] + + in[(i) *x_size + j - 2] + + in[(i + 1) * x_size + j - 2] + + in[(i + 2) * x_size + j - 2]); + x += x + in[(i - 2) * x_size + j + 1] + + in[(i - 1) * x_size + j + 1] + + in[(i) *x_size + j + 1] + + in[(i + 1) * x_size + j + 1] + + in[(i + 2) * x_size + j + 1] - + (in[(i - 2) * x_size + j - 1] + + in[(i - 1) * x_size + j - 1] + + in[(i) *x_size + j - 1] + + in[(i + 1) * x_size + j - 1] + + in[(i + 2) * x_size + j - 1]); + + y = in[(i + 2) * x_size + j - 2] + + in[(i + 2) * x_size + j - 1] + + in[(i + 2) * x_size + j] + + in[(i + 2) * x_size + j + 1] + + in[(i + 2) * x_size + j + 2] - + (in[(i - 2) * x_size + j - 2] + + in[(i - 2) * x_size + j - 1] + + in[(i - 2) * x_size + j] + + in[(i - 2) * x_size + j + 1] + + in[(i - 2) * x_size + j + 2]); + y += y + in[(i + 1) * x_size + j - 2] + + in[(i + 1) * x_size + j - 1] + + in[(i + 1) * x_size + j] + + in[(i + 1) * x_size + j + 1] + + in[(i + 1) * x_size + j + 2] - + (in[(i - 1) * x_size + j - 2] + + in[(i - 1) * x_size + j - 1] + + in[(i - 1) * x_size + j] + + in[(i - 1) * x_size + j + 1] + + in[(i - 1) * x_size + j + 2]); + corner_list[n].dx = x / 15; + corner_list[n].dy = y / 15; + n++; + if (n == MAX_CORNERS) { + /* "Too many corners." */ + } + } + } + } + } + corner_list[n].info = 7; +} + +__attribute__((always_inline)) static inline void +susan_call_susan(struct wccFILE *inputFile, int mode) { + uchar *in, *bp, *mid; + int x_size, y_size; + char *r; + CORNER_LIST corner_list; + + susan_get_image(inputFile, &in, &x_size, &y_size); + + if (susan_dt < 0) + susan_three_by_three = 1; + if ((susan_principle_conf == 1) && (mode == 0)) + mode = 1; + + switch (mode) { + case 0: + /* {{{ smoothing */ + + susan_setup_brightness_lut(&bp, susan_bt, 2); + susan_smoothing(susan_three_by_three, in, susan_dt, x_size, y_size, bp); + + break; + case 1: + /* {{{ edges */ + + r = (char *) susan_wccmalloc(x_size * y_size); + susan_setup_brightness_lut(&bp, susan_bt, 6); + + if (susan_principle_conf) { + if (susan_three_by_three) + susan_principle_small(in, r, bp, susan_max_no_edges, x_size, + y_size); + else + susan_principle(in, r, bp, susan_max_no_edges, x_size, y_size); + susan_int_to_uchar(r, in, x_size * y_size); + } else { + mid = (uchar *) susan_wccmalloc(x_size * y_size); + susan_wccmemset(mid, 100, + x_size * y_size); /* note not set to zero */ + + if (susan_three_by_three) + susan_edges_small(in, r, mid, bp, susan_max_no_edges, x_size, + y_size); + else + susan_edges(in, r, mid, bp, susan_max_no_edges, x_size, y_size); + if (susan_thin_post_proc) + susan_thin(r, mid, x_size, y_size); + susan_edge_draw(in, mid, x_size, y_size, susan_drawing_mode); + } + + break; + case 2: + /* {{{ corners */ + + r = (char *) susan_wccmalloc(x_size * y_size); + susan_setup_brightness_lut(&bp, susan_bt, 6); + + if (susan_principle_conf) { + susan_principle(in, r, bp, susan_max_no_corners, x_size, y_size); + susan_int_to_uchar(r, in, x_size * y_size); + } else { + if (susan_susan_quick) + susan_corners_quick(in, r, bp, susan_max_no_corners, + corner_list, x_size, y_size); + else + susan_corners(in, r, bp, susan_max_no_corners, corner_list, + x_size, y_size); + susan_corner_draw(in, corner_list, x_size, susan_drawing_mode); + } + + break; + } + + susan_put_image(x_size, y_size); +} + +__attribute__((always_inline)) static inline void +susan_init(void) { + volatile int a = 0; + susan_file.data = susan_input; + susan_file.size = 7292; + susan_file.size += a; + susan_file.cur_pos = 0; + susan_file.cur_pos += a; + + susan_dt = 4.0; + susan_dt += a; + susan_bt = 20; + susan_bt += a; + susan_principle_conf = 0; + susan_principle_conf += a; + susan_thin_post_proc = 1; + susan_thin_post_proc += a; + susan_three_by_three = 0; + susan_three_by_three += a; + susan_drawing_mode = 0; + susan_drawing_mode += a; + susan_susan_quick = 0; + susan_susan_quick += a; + susan_max_no_corners = 50; + susan_max_no_corners += a; + susan_max_no_edges = 50; + susan_max_no_edges += a; + + // mode=0; /* Smoothing mode */ + // mode=1; /* Edges mode */ + // mode=2; /* Corners mode */ + + // principle=1; /* Output initial enhancement image only; corners or edges + // mode (default is edges mode) */ thin_post_proc=0; /* No post-processing + // on the binary edge map (runs much faster); edges mode */ drawing_mode=1; + // /* Mark corners/edges with single black points instead of black with + // white border; corners or edges mode */ three_by_three=1; /* Use flat 3x3 + // mask, edges or smoothing mode */ susan_quick=1; /* Use faster (and + // usually stabler) corner mode; edge-like corner suppression not carried + // out; corners mode */ dt=10.0; /* Distance threshold, smoothing mode, + // (default=4) */ bt=50; /* Brightness threshold, all modes, (default=20) */ +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +susan_main(void) { + susan_call_susan(&susan_file, 0); + susan_wccfreeall(); + susan_call_susan(&susan_file, 1); + susan_wccfreeall(); + susan_call_susan(&susan_file, 2); + susan_wccfreeall(); +} + +__attribute__((always_inline)) static inline int +susan_return(void) { + return 0; +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + susan_init(); + susan_main(); + + return susan_return(); +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.c new file mode 100644 index 0000000..32fe8ba --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.c @@ -0,0 +1,80 @@ +#include "wccfile.h" + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define EOF -1 + +__attribute__((always_inline)) static inline size_t +susan_wccfread(void *ptr, size_t size, size_t count, struct wccFILE *stream) { + if (susan_wccfeof(stream)) + return EOF; + + unsigned i = stream->cur_pos, i2 = 0; + size_t number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count + ? size * count + : stream->size - stream->cur_pos; + __pragma_loopbound(7220, 7220); + while (i < stream->cur_pos + number_of_chars_to_read) + ((unsigned char *) ptr)[i2++] = stream->data[i++]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +__attribute__((always_inline)) static inline int +susan_wccfgetc(struct wccFILE *stream) { + if (susan_wccfeof(stream)) + return EOF; + + else + return stream->data[stream->cur_pos++]; +} + +__attribute__((always_inline)) static inline char * +susan_wccfgets(char *str, int num, struct wccFILE *stream) { + if (!stream || susan_wccfeof(stream) || !str || num <= 0) + return 0; + + int pos = 0; + __pragma_loopbound(57, 57); + while (pos < num - 1 && !susan_wccfeof(stream)) { + str[pos] = stream->data[stream->cur_pos]; + if (str[pos] == '\n') + break; + + stream->cur_pos++; + pos++; + } + str[pos++] = '\0'; + + return str; +} + +int +susan_wccfseek(struct wccFILE *stream, long int offset, enum _Origin_ origin) { + if (origin == WCCSEEK_SET) { + stream->cur_pos = offset; + return 0; + } else if (origin == WCCSEEK_CUR) { + stream->cur_pos += offset; + return 0; + } else if (origin == WCCSEEK_END) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + +__attribute__((always_inline)) static inline int +susan_wccfgetpos(struct wccFILE *stream, unsigned *position) { + *position = stream->cur_pos; + return 0; +} + +__attribute__((always_inline)) static inline int +susan_wccfeof(struct wccFILE *stream) { + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.h new file mode 100644 index 0000000..189f31f --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccfile.h @@ -0,0 +1,30 @@ + +#ifndef WCC_FILE_H +#define WCC_FILE_H + +enum _Origin_ { WCCSEEK_SET, WCCSEEK_CUR, WCCSEEK_END }; +typedef enum _Origin_ Origin; +typedef unsigned int size_t; + +#define EOF -1 + +struct wccFILE { + char *data; + size_t size; + unsigned cur_pos; +}; + +__attribute__((always_inline)) static inline size_t +susan_wccfread(void *ptr, size_t size, size_t count, struct wccFILE *stream); +__attribute__((always_inline)) static inline int +susan_wccfseek(struct wccFILE *stream, long int offset, Origin origin); +__attribute__((always_inline)) static inline int +susan_wccfgetpos(struct wccFILE *stream, unsigned *position); +__attribute__((always_inline)) static inline int +susan_wccfeof(struct wccFILE *stream); +__attribute__((always_inline)) static inline int +susan_wccfgetc(struct wccFILE *stream); +__attribute__((always_inline)) static inline char * +susan_wccfgets(char *str, int num, struct wccFILE *stream); + +#endif diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.c new file mode 100644 index 0000000..2e6db18 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.c @@ -0,0 +1,483 @@ +#include "wcclibm.h" +#include "math_private.h" + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t susan_npio2_hw[] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float + /* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ + /* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ + /* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ + susan_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ + susan_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ + susan_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ + susan_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ + susan_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ + susan_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ + susan_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +__attribute__((always_inline)) static inline int32_t +susan___ieee754_rem_pio2f(float x, float *y) { + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */ + y[0] = x; + y[1] = 0; + return 0; + } + if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */ + if (hx > 0) { + z = x - susan_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z - susan_pio2_1t; + y[1] = (z - y[0]) - susan_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= susan_pio2_2; + y[0] = z - susan_pio2_2t; + y[1] = (z - y[0]) - susan_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + susan_pio2_1; + if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */ + y[0] = z + susan_pio2_1t; + y[1] = (z - y[0]) + susan_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += susan_pio2_2; + y[0] = z + susan_pio2_2t; + y[1] = (z - y[0]) + susan_pio2_2t; + } + return -1; + } + } + if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf(x); + n = (int32_t) (t * susan_invpio2 + susan_half); + fn = (float) n; + r = t - fn * susan_pio2_1; + w = fn * susan_pio2_1t; /* 1st round good to 40 bit */ + if (n < 32 && (int32_t) (ix & 0xffffff00) != susan_npio2_hw[n - 1]) { + y[0] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 8) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * susan_pio2_2; + r = t - w; + w = fn * susan_pio2_2t - ((t - r) - w); + y[0] = r - w; + GET_FLOAT_WORD(high, y[0]); + i = j - ((high >> 23) & 0xff); + if (i > 25) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * susan_pio2_3; + r = t - w; + w = fn * susan_pio2_3t - ((t - r) - w); + y[0] = r - w; + } + } + } + y[1] = (r - y[0]) - w; + if (hx < 0) { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } else + return n; + } + /* + all other (large) arguments + */ + if (ix >= 0x7f800000) { /* x is inf or NaN */ + y[0] = y[1] = x - x; + return 0; + } + + y[0] = y[1] = x - x; + return 0; /* dummy initialisation */ + return 0; /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + +static const float + /* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ + susan_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ + susan_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ + susan_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ + susan_C4 = -2.7557314297e-07f, /* 0xb493f27c */ + susan_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ + susan_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +__attribute__((always_inline)) static inline float +susan___kernel_cosf(float x, float y) { + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if (ix < 0x32000000) { /* if x < 2**27 */ + if (((int) x) == 0) + return susan_one; /* generate inexact */ + } + z = x * x; + r = z * + (susan_C1 + + z * (susan_C2 + + z * (susan_C3 + z * (susan_C4 + z * (susan_C5 + z * susan_C6))))); + if (ix < 0x3e99999a) /* if |x| < 0.3 */ + return susan_one - ((float) 0.5f * z - (z * r - x * y)); + else { + if (ix > 0x3f480000) /* x > 0.78125 */ + qx = (float) 0.28125f; + + else { + SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */ + } + hz = (float) 0.5f * z - qx; + a = susan_one - qx; + return a - (hz - (z * r - x * y)); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + +static const float + /* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ + susan_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ + susan_S2 = 8.3333337680e-03f, /* 0x3c088889 */ + susan_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ + susan_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ + susan_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ + susan_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +__attribute__((always_inline)) static inline float +susan___kernel_sinf(float x, float y, int iy) { + float z, r, v; + int32_t ix; + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; /* high word of x */ + if (ix < 0x32000000) { /* |x| < 2**-27 */ + if ((int) x == 0) + return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = susan_S2 + + z * (susan_S3 + z * (susan_S4 + z * (susan_S5 + z * susan_S6))); + if (iy == 0) + return x + v * (susan_S1 + z * r); + else + return x - ((z * (susan_half * y - v * r) - y) - v * susan_S1); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + +static const float susan_atanhi[] = { + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +static const float susan_atanlo[] = { + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +static const float susan_aT[] = { + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +__attribute__((always_inline)) static inline float +susan___atanf(float x) { + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD(hx, x); + ix = hx & 0x7fffffff; + if (ix >= 0x50800000) { /* if |x| >= 2^34 */ + if (ix > 0x7f800000) + return x + x; /* NaN */ + if (hx > 0) + return susan_atanhi[3] + susan_atanlo[3]; + else + return -susan_atanhi[3] - susan_atanlo[3]; + } + if (ix < 0x3ee00000) { /* |x| < 0.4375 */ + if (ix < 0x31000000) { /* |x| < 2^-29 */ + if (susan_huge + x > susan_one) + return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf(x); + if (ix < 0x3f980000) { /* |x| < 1.1875 */ + if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ((float) 2.0f * x - susan_one) / ((float) 2.0f + x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = (x - susan_one) / (x + susan_one); + } + } else { + if (ix < 0x401c0000) { /* |x| < 2.4375 */ + id = 2; + x = (x - (float) 1.5f) / (susan_one + (float) 1.5f * x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -(float) 1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * + (susan_aT[0] + + w * (susan_aT[2] + + w * (susan_aT[4] + + w * (susan_aT[6] + w * (susan_aT[8] + w * susan_aT[10]))))); + s2 = w * (susan_aT[1] + + w * (susan_aT[3] + + w * (susan_aT[5] + w * (susan_aT[7] + w * susan_aT[9])))); + if (id < 0) + return x - x * (s1 + s2); + else { + z = susan_atanhi[id] - ((x * (s1 + s2) - susan_atanlo[id]) - x); + return (hx < 0) ? -z : z; + } +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +__attribute__((always_inline)) static inline float +susan___cosf(float x) { + float y[2], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return susan___kernel_cosf(x, z); + + /* cos(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = susan___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return susan___kernel_cosf(y[0], y[1]); + case 1: + return -susan___kernel_sinf(y[0], y[1], 1); + case 2: + return -susan___kernel_cosf(y[0], y[1]); + default: + return susan___kernel_sinf(y[0], y[1], 1); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +__attribute__((always_inline)) static inline float +susan___sinf(float x) { + float y[2], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD(ix, x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3f490fd8) + return susan___kernel_sinf(x, z, 0); + + /* sin(Inf or NaN) is NaN */ + else if (ix >= 0x7f800000) + return x - x; + + /* argument reduction needed */ + else { + n = susan___ieee754_rem_pio2f(x, y); + switch (n & 3) { + case 0: + return susan___kernel_sinf(y[0], y[1], 1); + case 1: + return susan___kernel_cosf(y[0], y[1]); + case 2: + return -susan___kernel_sinf(y[0], y[1], 1); + default: + return -susan___kernel_cosf(y[0], y[1]); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + +__attribute__((always_inline)) static inline float +susan___fabsf(float x) { + u_int32_t ix; + GET_FLOAT_WORD(ix, x); + SET_FLOAT_WORD(x, ix & 0x7fffffff); + return x; +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.h new file mode 100644 index 0000000..dceb14d --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wcclibm.h @@ -0,0 +1,65 @@ + +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +// Often used variables/consts +#ifdef __STDC__ +static const float +#else +static float +#endif + susan_one = 1.0f, + susan_half = 5.0000000000e-01f, /* 0x3f000000 */ + susan_zero = 0.0f, susan_huge = 1.0e30, + susan_two8 = 2.5600000000e+02f, /* 0x43800000 */ + susan_twon8 = 3.9062500000e-03f; /* 0x3b800000 */ + +// The following defines map the math functions to specialized calls +#define acos susan___ieee754_acosf +#define atan susan___atanf +#define cos susan___cosf +#define fabs susan___fabsf +#define fabsf susan___fabsf +#define isinf susan___isinff +#define pow susan___ieee754_powf +#define sqrt susan___ieee754_sqrtf +#define log10 susan___ieee754_log10f +#define log susan___ieee754_logf +#define sin susan___sinf + +__attribute__((always_inline)) static inline float susan___atanf(float x); +__attribute__((always_inline)) static inline float susan___copysignf(float x, + float y); +__attribute__((always_inline)) static inline float susan___cosf(float x); +__attribute__((always_inline)) static inline float susan___fabsf(float x); +__attribute__((always_inline)) static inline float susan___floorf(float x); +__attribute__((always_inline)) static inline float +susan___ieee754_acosf(float x); +__attribute__((always_inline)) static inline float +susan___ieee754_powf(float x, float y); +__attribute__((always_inline)) static inline int32_t +susan___ieee754_rem_pio2f(float x, float *y); +__attribute__((always_inline)) static inline float +susan___ieee754_sqrtf(float x); +__attribute__((always_inline)) static inline int susan___isinff(float x); +__attribute__((always_inline)) static inline float susan___kernel_cosf(float x, + float y); +__attribute__((always_inline)) static inline float +susan___kernel_sinf(float x, float y, int iy); +__attribute__((always_inline)) static inline int +susan___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2); +__attribute__((always_inline)) static inline float susan___scalbnf(float x, + int n); +__attribute__((always_inline)) static inline float +susan___ieee754_logf(float x); +__attribute__((always_inline)) static inline float +susan___ieee754_log10f(float x); +__attribute__((always_inline)) static inline float susan___sinf(float x); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.c b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.c new file mode 100644 index 0000000..c8f3150 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.c @@ -0,0 +1,56 @@ +#include "wccmalloc.h" + +// This must be redefined for each new benchmark + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#define HEAP_SIZE 30000 + +char susan_simulated_heap[HEAP_SIZE]; +unsigned int susan_freeHeapPos; + +__attribute__((always_inline)) static inline void * +susan_wccmalloc(unsigned int numberOfBytes) { + // Get a 4-byte adress for alignment purposes + unsigned int offset = + ((unsigned long) susan_simulated_heap + susan_freeHeapPos) % 4; + if (offset) + susan_freeHeapPos += 4 - offset; + void *currentPos = (void *) &susan_simulated_heap[susan_freeHeapPos]; + susan_freeHeapPos += numberOfBytes; + return currentPos; +} +__attribute__((always_inline)) static inline void +susan_wccfreeall(void) { + susan_freeHeapPos = 0; +} + +__attribute__((always_inline)) static inline void * +susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len) { + unsigned long int dstp = (long int) dstpp; + unsigned long int srcp = (long int) srcpp; + + __pragma_loopbound(76, 76); + while (len > 0) { + char __x = ((char *) srcp)[0]; + srcp += 1; + len -= 1; + ((char *) dstp)[0] = __x; + dstp += 1; + } + + return dstpp; +} + +__attribute__((always_inline)) static inline void +susan_wccmemset(void *p, int value, unsigned int num) { + unsigned long i; + char *char_ptr = (char *) p; + + __pragma_loopbound(7220, 7220); + for (i = 0; i < num; ++i) + *char_ptr++ = (unsigned char) value; +} diff --git a/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.h b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.h new file mode 100644 index 0000000..8d4cb46 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/generated/modified_sources/inline/wccmalloc.h @@ -0,0 +1,14 @@ + +#ifndef _WCCMALLOC_H +#define _WCCMALLOC_H + +__attribute__((always_inline)) static inline void * +susan_wccmalloc(unsigned int numberOfBytes); +//! Frees ALL allocated memory space +__attribute__((always_inline)) static inline void susan_wccfreeall(void); +__attribute__((always_inline)) static inline void * +susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len); +__attribute__((always_inline)) static inline void +susan_wccmemset(void *p, int value, unsigned int num); + +#endif diff --git a/targets/wasm-tacle/sequential/susan/input.c b/targets/wasm-tacle/sequential/susan/input.c new file mode 100755 index 0000000..5984488 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/input.c @@ -0,0 +1,7293 @@ +char susan_input[ 7292 ] = { 80, + 53, + 10, + 35, + 32, + 67, + 82, + 69, + 65, + 84, + 79, + 82, + 58, + 32, + 88, + 86, + 32, + 86, + 101, + 114, + 115, + 105, + 111, + 110, + 32, + 51, + 46, + 49, + 48, + 97, + 32, + 32, + 82, + 101, + 118, + 58, + 32, + 49, + 50, + 47, + 50, + 57, + 47, + 57, + 52, + 32, + 40, + 80, + 78, + 71, + 32, + 112, + 97, + 116, + 99, + 104, + 32, + 49, + 46, + 50, + 41, + 10, + 55, + 54, + 32, + 57, + 53, + 10, + 50, + 53, + 53, + 10, + 35, + 36, + 36, + 36, + 36, + 38, + 38, + 36, + 37, + 37, + 37, + 38, + 38, + 36, + 34, + 38, + 40, + 41, + 42, + 40, + 38, + 36, + 36, + 35, + 36, + 35, + 32, + 35, + 38, + 42, + 42, + 38, + 36, + 36, + 36, + 37, + 36, + 35, + 33, + 33, + 33, + 32, + 31, + 33, + 36, + 39, + 40, + 36, + 36, + 34, + 34, + 36, + 38, + 39, + 37, + 36, + 36, + 35, + 36, + 39, + 39, + 37, + 37, + 39, + 37, + 38, + 39, + 40, + 38, + 37, + 37, + 33, + 33, + 32, + 33, + 34, + 35, + 35, + 36, + 36, + 36, + 37, + 38, + 37, + 38, + 38, + 39, + 41, + 41, + 40, + 40, + 43, + 42, + 41, + 40, + 39, + 38, + 35, + 33, + 35, + 35, + 37, + 39, + 38, + 37, + 36, + 38, + 36, + 36, + 34, + 34, + 38, + 39, + 39, + 37, + 36, + 36, + 34, + 33, + 34, + 33, + 35, + 33, + 36, + 35, + 35, + 36, + 36, + 37, + 33, + 32, + 36, + 38, + 38, + 38, + 39, + 39, + 38, + 39, + 37, + 35, + 36, + 34, + 35, + 36, + 37, + 39, + 38, + 37, + 34, + 31, + 34, + 35, + 35, + 35, + 35, + 36, + 38, + 39, + 39, + 37, + 38, + 38, + 40, + 39, + 40, + 41, + 43, + 44, + 42, + 40, + 39, + 38, + 42, + 42, + 39, + 39, + 36, + 33, + 33, + 34, + 36, + 36, + 35, + 33, + 33, + 35, + 37, + 36, + 34, + 34, + 31, + 30, + 32, + 36, + 42, + 43, + 43, + 40, + 36, + 36, + 36, + 35, + 34, + 35, + 33, + 33, + 30, + 32, + 34, + 35, + 35, + 35, + 36, + 35, + 37, + 34, + 34, + 35, + 36, + 37, + 37, + 35, + 36, + 37, + 39, + 39, + 38, + 35, + 35, + 35, + 35, + 35, + 36, + 38, + 37, + 38, + 38, + 36, + 35, + 35, + 36, + 35, + 35, + 35, + 35, + 34, + 34, + 36, + 36, + 38, + 40, + 38, + 37, + 36, + 34, + 34, + 35, + 35, + 36, + 37, + 37, + 38, + 38, + 39, + 39, + 36, + 35, + 36, + 35, + 37, + 36, + 38, + 39, + 37, + 38, + 34, + 33, + 32, + 33, + 32, + 28, + 34, + 40, + 45, + 44, + 40, + 38, + 34, + 30, + 30, + 33, + 40, + 45, + 43, + 41, + 37, + 37, + 37, + 36, + 33, + 31, + 32, + 31, + 35, + 35, + 35, + 35, + 35, + 38, + 39, + 39, + 40, + 39, + 37, + 37, + 37, + 35, + 35, + 37, + 37, + 36, + 37, + 37, + 37, + 38, + 37, + 38, + 37, + 37, + 35, + 35, + 34, + 35, + 35, + 35, + 36, + 39, + 45, + 43, + 38, + 39, + 38, + 36, + 36, + 36, + 35, + 37, + 39, + 38, + 37, + 37, + 37, + 39, + 38, + 37, + 37, + 35, + 34, + 34, + 37, + 39, + 36, + 37, + 38, + 39, + 40, + 41, + 39, + 36, + 38, + 39, + 39, + 39, + 36, + 33, + 32, + 30, + 30, + 31, + 35, + 35, + 35, + 35, + 35, + 39, + 40, + 38, + 37, + 40, + 39, + 38, + 39, + 39, + 39, + 38, + 39, + 39, + 40, + 40, + 39, + 41, + 39, + 41, + 39, + 38, + 39, + 38, + 38, + 36, + 35, + 36, + 35, + 37, + 38, + 38, + 38, + 40, + 38, + 39, + 39, + 36, + 36, + 33, + 34, + 36, + 35, + 37, + 38, + 39, + 39, + 38, + 36, + 32, + 32, + 35, + 38, + 38, + 39, + 38, + 35, + 35, + 34, + 37, + 39, + 38, + 36, + 35, + 35, + 33, + 31, + 30, + 32, + 36, + 37, + 38, + 35, + 35, + 35, + 35, + 35, + 39, + 41, + 42, + 38, + 33, + 31, + 33, + 37, + 36, + 37, + 38, + 37, + 37, + 38, + 39, + 38, + 38, + 38, + 38, + 37, + 38, + 38, + 39, + 41, + 41, + 37, + 39, + 40, + 42, + 44, + 43, + 39, + 42, + 48, + 45, + 41, + 39, + 38, + 38, + 38, + 38, + 36, + 37, + 38, + 39, + 39, + 39, + 43, + 41, + 38, + 37, + 37, + 38, + 36, + 34, + 34, + 34, + 38, + 41, + 41, + 38, + 35, + 35, + 34, + 35, + 32, + 30, + 31, + 33, + 34, + 35, + 35, + 35, + 35, + 35, + 35, + 39, + 36, + 35, + 38, + 41, + 38, + 32, + 34, + 38, + 34, + 38, + 40, + 39, + 39, + 36, + 36, + 39, + 38, + 39, + 37, + 38, + 38, + 36, + 36, + 35, + 37, + 38, + 39, + 38, + 36, + 38, + 37, + 35, + 31, + 35, + 37, + 40, + 39, + 35, + 35, + 36, + 34, + 36, + 36, + 38, + 37, + 38, + 37, + 37, + 36, + 37, + 38, + 37, + 36, + 35, + 34, + 34, + 34, + 37, + 36, + 37, + 36, + 34, + 36, + 36, + 34, + 31, + 30, + 33, + 32, + 33, + 35, + 35, + 35, + 35, + 34, + 27, + 33, + 39, + 42, + 41, + 42, + 44, + 45, + 42, + 39, + 41, + 41, + 42, + 43, + 42, + 41, + 40, + 38, + 37, + 35, + 37, + 36, + 36, + 36, + 37, + 36, + 36, + 37, + 37, + 39, + 43, + 43, + 43, + 42, + 39, + 39, + 39, + 39, + 40, + 39, + 38, + 35, + 34, + 36, + 37, + 36, + 37, + 38, + 38, + 37, + 36, + 35, + 35, + 33, + 35, + 38, + 38, + 39, + 41, + 39, + 38, + 37, + 38, + 38, + 36, + 37, + 36, + 37, + 37, + 36, + 36, + 35, + 35, + 35, + 35, + 36, + 42, + 40, + 41, + 43, + 42, + 39, + 37, + 37, + 37, + 37, + 39, + 39, + 38, + 37, + 35, + 37, + 36, + 35, + 36, + 36, + 39, + 39, + 36, + 36, + 34, + 37, + 40, + 40, + 40, + 39, + 41, + 40, + 39, + 39, + 39, + 40, + 38, + 36, + 34, + 35, + 37, + 34, + 36, + 35, + 35, + 34, + 33, + 36, + 36, + 38, + 39, + 38, + 37, + 34, + 34, + 33, + 34, + 35, + 36, + 36, + 35, + 36, + 35, + 38, + 39, + 39, + 40, + 38, + 37, + 36, + 36, + 35, + 35, + 35, + 35, + 36, + 36, + 42, + 45, + 44, + 43, + 40, + 38, + 37, + 36, + 37, + 37, + 38, + 38, + 38, + 38, + 36, + 35, + 35, + 34, + 34, + 36, + 38, + 36, + 35, + 38, + 37, + 37, + 38, + 38, + 37, + 38, + 36, + 33, + 35, + 37, + 37, + 38, + 38, + 41, + 41, + 41, + 38, + 35, + 33, + 30, + 29, + 32, + 37, + 39, + 39, + 38, + 39, + 38, + 35, + 34, + 35, + 35, + 35, + 35, + 34, + 35, + 36, + 36, + 37, + 38, + 38, + 38, + 36, + 35, + 33, + 34, + 35, + 35, + 35, + 35, + 36, + 36, + 32, + 33, + 36, + 38, + 40, + 42, + 42, + 39, + 40, + 41, + 43, + 42, + 36, + 33, + 32, + 33, + 32, + 35, + 37, + 41, + 41, + 39, + 40, + 37, + 36, + 38, + 39, + 41, + 40, + 40, + 41, + 39, + 37, + 37, + 36, + 37, + 37, + 36, + 35, + 37, + 37, + 39, + 41, + 41, + 43, + 41, + 40, + 40, + 37, + 37, + 38, + 38, + 38, + 38, + 38, + 36, + 38, + 37, + 36, + 39, + 41, + 41, + 42, + 41, + 39, + 38, + 38, + 36, + 37, + 37, + 35, + 35, + 35, + 36, + 36, + 33, + 35, + 37, + 34, + 35, + 35, + 35, + 39, + 38, + 39, + 41, + 43, + 43, + 43, + 42, + 39, + 38, + 39, + 37, + 37, + 38, + 37, + 36, + 38, + 38, + 40, + 38, + 39, + 39, + 36, + 35, + 34, + 33, + 34, + 36, + 37, + 38, + 37, + 37, + 37, + 36, + 34, + 34, + 33, + 34, + 35, + 38, + 41, + 38, + 36, + 37, + 37, + 37, + 37, + 39, + 41, + 40, + 41, + 42, + 41, + 40, + 41, + 41, + 39, + 40, + 40, + 39, + 37, + 37, + 36, + 38, + 35, + 35, + 35, + 36, + 37, + 45, + 42, + 40, + 44, + 45, + 42, + 43, + 42, + 42, + 45, + 47, + 49, + 51, + 50, + 51, + 50, + 49, + 45, + 45, + 45, + 43, + 42, + 42, + 43, + 41, + 39, + 40, + 40, + 40, + 39, + 38, + 40, + 40, + 39, + 39, + 39, + 38, + 35, + 33, + 37, + 41, + 42, + 39, + 37, + 37, + 37, + 38, + 38, + 36, + 37, + 35, + 33, + 32, + 33, + 34, + 35, + 35, + 38, + 39, + 37, + 38, + 36, + 35, + 37, + 38, + 39, + 42, + 41, + 38, + 36, + 34, + 35, + 35, + 35, + 35, + 36, + 39, + 38, + 36, + 37, + 37, + 37, + 36, + 40, + 42, + 43, + 47, + 49, + 48, + 47, + 44, + 43, + 47, + 52, + 55, + 52, + 47, + 44, + 42, + 42, + 42, + 40, + 40, + 39, + 38, + 37, + 37, + 39, + 38, + 38, + 38, + 36, + 33, + 31, + 34, + 35, + 38, + 39, + 38, + 37, + 38, + 38, + 37, + 38, + 37, + 42, + 46, + 45, + 42, + 39, + 39, + 38, + 34, + 36, + 39, + 39, + 37, + 35, + 36, + 34, + 37, + 37, + 36, + 36, + 39, + 41, + 42, + 35, + 35, + 35, + 35, + 36, + 40, + 40, + 38, + 39, + 39, + 36, + 36, + 38, + 39, + 42, + 46, + 49, + 50, + 52, + 52, + 51, + 51, + 52, + 54, + 51, + 50, + 51, + 52, + 51, + 47, + 47, + 46, + 47, + 45, + 43, + 43, + 43, + 43, + 43, + 42, + 41, + 41, + 40, + 40, + 42, + 46, + 44, + 41, + 37, + 36, + 37, + 39, + 39, + 38, + 38, + 39, + 38, + 38, + 39, + 37, + 35, + 35, + 38, + 38, + 38, + 36, + 35, + 35, + 37, + 35, + 36, + 38, + 36, + 38, + 38, + 39, + 35, + 35, + 35, + 36, + 36, + 39, + 39, + 40, + 40, + 39, + 37, + 38, + 41, + 39, + 43, + 46, + 47, + 49, + 49, + 49, + 48, + 48, + 51, + 52, + 52, + 53, + 53, + 52, + 51, + 52, + 50, + 48, + 49, + 48, + 46, + 47, + 47, + 44, + 42, + 43, + 44, + 43, + 45, + 48, + 46, + 45, + 44, + 42, + 43, + 46, + 45, + 44, + 42, + 41, + 38, + 39, + 38, + 37, + 36, + 35, + 37, + 35, + 37, + 36, + 33, + 31, + 32, + 38, + 43, + 42, + 41, + 39, + 37, + 38, + 37, + 37, + 35, + 35, + 36, + 36, + 36, + 38, + 38, + 36, + 37, + 39, + 38, + 39, + 38, + 39, + 42, + 47, + 49, + 46, + 46, + 47, + 47, + 46, + 47, + 49, + 48, + 48, + 49, + 51, + 50, + 49, + 50, + 51, + 48, + 46, + 46, + 47, + 48, + 47, + 45, + 43, + 42, + 44, + 45, + 47, + 49, + 51, + 51, + 51, + 49, + 47, + 48, + 47, + 49, + 46, + 44, + 40, + 39, + 40, + 40, + 39, + 38, + 40, + 38, + 39, + 40, + 39, + 37, + 36, + 35, + 33, + 35, + 34, + 32, + 33, + 34, + 38, + 35, + 36, + 36, + 36, + 36, + 35, + 36, + 38, + 36, + 37, + 37, + 37, + 38, + 38, + 39, + 43, + 46, + 51, + 52, + 50, + 50, + 48, + 50, + 49, + 49, + 50, + 48, + 50, + 50, + 49, + 49, + 51, + 54, + 54, + 51, + 51, + 49, + 47, + 48, + 52, + 53, + 51, + 49, + 46, + 46, + 43, + 46, + 45, + 47, + 50, + 49, + 47, + 47, + 46, + 45, + 48, + 48, + 45, + 43, + 44, + 43, + 43, + 42, + 41, + 39, + 39, + 39, + 37, + 37, + 34, + 34, + 32, + 33, + 35, + 36, + 39, + 35, + 36, + 36, + 36, + 36, + 40, + 39, + 36, + 36, + 35, + 34, + 33, + 32, + 37, + 43, + 51, + 56, + 54, + 55, + 56, + 55, + 52, + 50, + 49, + 46, + 46, + 45, + 47, + 49, + 51, + 54, + 54, + 51, + 49, + 50, + 50, + 48, + 47, + 45, + 46, + 47, + 50, + 50, + 48, + 43, + 42, + 42, + 43, + 45, + 47, + 47, + 48, + 50, + 49, + 47, + 47, + 48, + 49, + 47, + 48, + 48, + 47, + 47, + 45, + 44, + 42, + 39, + 38, + 38, + 38, + 42, + 41, + 41, + 39, + 36, + 35, + 35, + 35, + 36, + 36, + 36, + 34, + 37, + 37, + 35, + 36, + 36, + 35, + 36, + 37, + 38, + 41, + 50, + 67, + 82, + 84, + 80, + 80, + 76, + 75, + 74, + 71, + 64, + 61, + 58, + 54, + 53, + 54, + 56, + 56, + 53, + 51, + 51, + 49, + 47, + 49, + 49, + 48, + 48, + 47, + 47, + 48, + 48, + 47, + 45, + 46, + 47, + 46, + 46, + 45, + 41, + 42, + 44, + 44, + 45, + 45, + 48, + 47, + 44, + 42, + 37, + 35, + 34, + 32, + 33, + 37, + 40, + 37, + 37, + 36, + 36, + 37, + 35, + 35, + 36, + 36, + 36, + 37, + 35, + 37, + 37, + 37, + 35, + 35, + 35, + 37, + 40, + 41, + 46, + 58, + 85, + 119, + -119, + -123, + 123, + 115, + 109, + 110, + 109, + 107, + 102, + 95, + 93, + 88, + 86, + 86, + 86, + 86, + 83, + 77, + 68, + 64, + 59, + 58, + 61, + 61, + 61, + 58, + 56, + 51, + 49, + 51, + 51, + 50, + 50, + 45, + 37, + 41, + 47, + 50, + 50, + 53, + 52, + 49, + 48, + 45, + 43, + 42, + 39, + 38, + 36, + 38, + 39, + 39, + 39, + 38, + 37, + 36, + 35, + 35, + 35, + 36, + 36, + 34, + 36, + 36, + 38, + 39, + 38, + 37, + 39, + 41, + 43, + 47, + 56, + 79, + 121, + -106, + -110, + -108, + -99, + -102, + -100, + -99, + -101, + -103, + -102, + -106, + -108, + -110, + -111, + -111, + -115, + -117, + -120, + -123, + -123, + -125, + -128, + 127, + 124, + 118, + 114, + 119, + 113, + 104, + 99, + 100, + 100, + 97, + 89, + 83, + 79, + 76, + 73, + 69, + 60, + 52, + 48, + 47, + 45, + 46, + 40, + 37, + 38, + 38, + 42, + 45, + 43, + 42, + 42, + 39, + 38, + 39, + 35, + 35, + 36, + 36, + 36, + 37, + 37, + 40, + 42, + 42, + 40, + 39, + 38, + 40, + 43, + 49, + 60, + 83, + 126, + -105, + -98, + -93, + -97, + -94, + -93, + -90, + -88, + -91, + -94, + -91, + -90, + -93, + -94, + -94, + -96, + -94, + -94, + -96, + -95, + -93, + -96, + -100, + -104, + -104, + -105, + -108, + -110, + -115, + -119, + -120, + -122, + -125, + 127, + 122, + 118, + 115, + 118, + 113, + 97, + 78, + 59, + 45, + 48, + 46, + 40, + 38, + 38, + 37, + 38, + 38, + 35, + 37, + 37, + 34, + 32, + 32, + 35, + 36, + 36, + 36, + 36, + 38, + 39, + 38, + 37, + 38, + 35, + 34, + 36, + 35, + 37, + 41, + 51, + 77, + 120, + -100, + -91, + -96, + -95, + -93, + -92, + -89, + -90, + -92, + -92, + -93, + -93, + -91, + -90, + -91, + -94, + -94, + -94, + -93, + -92, + -93, + -95, + -95, + -93, + -94, + -94, + -91, + -92, + -94, + -93, + -91, + -92, + -91, + -92, + -96, + -97, + -99, + -105, + -112, + 126, + 95, + 63, + 43, + 47, + 42, + 38, + 38, + 36, + 36, + 36, + 38, + 37, + 37, + 37, + 36, + 37, + 38, + 35, + 36, + 36, + 36, + 36, + 39, + 39, + 39, + 41, + 38, + 33, + 35, + 37, + 39, + 45, + 51, + 58, + 80, + 121, + -104, + -94, + -93, + -92, + -94, + -94, + -91, + -89, + -89, + -88, + -86, + -86, + -88, + -87, + -88, + -90, + -90, + -91, + -91, + -89, + -87, + -90, + -92, + -92, + -90, + -91, + -91, + -89, + -89, + -90, + -92, + -93, + -91, + -90, + -91, + -90, + -91, + -91, + -100, + -128, + 88, + 54, + 44, + 47, + 48, + 46, + 43, + 41, + 36, + 37, + 40, + 38, + 40, + 38, + 38, + 37, + 39, + 35, + 36, + 36, + 36, + 36, + 38, + 41, + 39, + 37, + 35, + 32, + 34, + 36, + 38, + 42, + 47, + 57, + 82, + 118, + -105, + -88, + -86, + -84, + -88, + -91, + -91, + -91, + -92, + -91, + -89, + -90, + -89, + -87, + -88, + -88, + -89, + -89, + -91, + -91, + -91, + -92, + -93, + -92, + -93, + -97, + -93, + -93, + -93, + -92, + -92, + -94, + -94, + -92, + -94, + -94, + -91, + -91, + -98, + -122, + 96, + 63, + 53, + 49, + 44, + 42, + 42, + 41, + 38, + 36, + 37, + 36, + 37, + 38, + 39, + 38, + 40, + 35, + 36, + 36, + 36, + 36, + 34, + 36, + 35, + 37, + 39, + 40, + 43, + 41, + 41, + 44, + 48, + 56, + 83, + -127, + -99, + -89, + -88, + -87, + -88, + -89, + -87, + -89, + -90, + -90, + -89, + -91, + -91, + -89, + -87, + -88, + -87, + -89, + -88, + -89, + -88, + -90, + -89, + -87, + -88, + -92, + -91, + -88, + -89, + -88, + -87, + -89, + -91, + -93, + -95, + -97, + -94, + -93, + -99, + -125, + 91, + 59, + 45, + 45, + 47, + 43, + 42, + 39, + 36, + 36, + 36, + 40, + 38, + 39, + 39, + 37, + 36, + 36, + 36, + 36, + 36, + 36, + 34, + 37, + 38, + 39, + 40, + 43, + 43, + 43, + 43, + 40, + 43, + 56, + 87, + -127, + -100, + -94, + -95, + -91, + -88, + -90, + -89, + -90, + -92, + -88, + -88, + -90, + -88, + -90, + -90, + -89, + -89, + -91, + -91, + -92, + -92, + -91, + -90, + -89, + -89, + -92, + -90, + -90, + -92, + -91, + -89, + -90, + -91, + -91, + -95, + -94, + -92, + -93, + -99, + -124, + 92, + 61, + 48, + 47, + 49, + 45, + 44, + 41, + 38, + 37, + 37, + 38, + 34, + 35, + 35, + 35, + 35, + 36, + 36, + 36, + 36, + 36, + 40, + 39, + 36, + 34, + 35, + 35, + 37, + 37, + 40, + 49, + 56, + 62, + 89, + -124, + -99, + -93, + -88, + -88, + -92, + -90, + -87, + -88, + -89, + -87, + -88, + -89, + -88, + -87, + -88, + -89, + -89, + -87, + -88, + -88, + -87, + -89, + -92, + -91, + -92, + -92, + -91, + -91, + -90, + -89, + -89, + -89, + -90, + -92, + -93, + -91, + -87, + -86, + -96, + -127, + 90, + 60, + 45, + 44, + 43, + 36, + 36, + 37, + 39, + 38, + 40, + 40, + 37, + 36, + 36, + 33, + 35, + 36, + 36, + 36, + 36, + 36, + 34, + 34, + 34, + 33, + 34, + 34, + 35, + 37, + 40, + 42, + 41, + 50, + 80, + -127, + -96, + -92, + -89, + -85, + -88, + -91, + -88, + -88, + -89, + -87, + -90, + -90, + -89, + -89, + -90, + -91, + -90, + -89, + -87, + -86, + -87, + -89, + -90, + -91, + -93, + -93, + -93, + -91, + -91, + -90, + -90, + -91, + -92, + -91, + -92, + -89, + -87, + -88, + -96, + -123, + 96, + 65, + 48, + 47, + 45, + 38, + 37, + 37, + 37, + 37, + 39, + 39, + 37, + 38, + 36, + 35, + 35, + 36, + 36, + 36, + 36, + 36, + 40, + 41, + 40, + 41, + 42, + 42, + 41, + 39, + 39, + 45, + 53, + 66, + 100, + -111, + -86, + -86, + -87, + -80, + -86, + -92, + -88, + -86, + -87, + -84, + -83, + -86, + -86, + -85, + -85, + -86, + -84, + -84, + -88, + -90, + -87, + -88, + -88, + -88, + -88, + -90, + -89, + -89, + -89, + -89, + -89, + -88, + -87, + -88, + -90, + -87, + -88, + -90, + -98, + -127, + 93, + 69, + 50, + 50, + 51, + 43, + 44, + 43, + 41, + 37, + 37, + 40, + 38, + 38, + 37, + 36, + 38, + 36, + 36, + 36, + 36, + 36, + 36, + 38, + 39, + 40, + 39, + 40, + 39, + 42, + 46, + 49, + 52, + 62, + 90, + -123, + -101, + -100, + -98, + -94, + -90, + -88, + -87, + -89, + -90, + -89, + -88, + -88, + -87, + -86, + -87, + -86, + -86, + -87, + -85, + -85, + -88, + -89, + -88, + -89, + -88, + -89, + -90, + -89, + -90, + -90, + -91, + -90, + -89, + -91, + -91, + -91, + -90, + -92, + -99, + -126, + 93, + 61, + 45, + 49, + 48, + 43, + 41, + 38, + 37, + 36, + 38, + 38, + 37, + 36, + 35, + 35, + 39, + 36, + 36, + 36, + 36, + 37, + 41, + 42, + 40, + 41, + 41, + 38, + 40, + 42, + 42, + 45, + 50, + 61, + 91, + -121, + -94, + -93, + -96, + -94, + -94, + -93, + -91, + -91, + -93, + -90, + -88, + -92, + -90, + -87, + -87, + -89, + -88, + -87, + -89, + -89, + -90, + -93, + -96, + -94, + -91, + -89, + -88, + -88, + -90, + -90, + -89, + -91, + -92, + -93, + -91, + -91, + -92, + -91, + -101, + 122, + 84, + 60, + 48, + 52, + 46, + 34, + 36, + 36, + 37, + 34, + 34, + 37, + 34, + 32, + 33, + 34, + 37, + 36, + 36, + 36, + 37, + 37, + 36, + 39, + 39, + 41, + 40, + 41, + 40, + 39, + 42, + 44, + 49, + 62, + 92, + -124, + -96, + -84, + -81, + -86, + -87, + -89, + -90, + -91, + -92, + -90, + -88, + -89, + -91, + -90, + -89, + -89, + -89, + -90, + -89, + -86, + -88, + -89, + -89, + -90, + -88, + -90, + -91, + -91, + -92, + -92, + -92, + -91, + -91, + -93, + -95, + -94, + -93, + -93, + -101, + 125, + 86, + 61, + 47, + 47, + 49, + 45, + 44, + 44, + 43, + 44, + 45, + 44, + 42, + 41, + 38, + 35, + 38, + 37, + 37, + 37, + 37, + 37, + 39, + 40, + 40, + 42, + 44, + 42, + 43, + 47, + 45, + 44, + 50, + 66, + 99, + -111, + -93, + -97, + -96, + -92, + -89, + -89, + -89, + -87, + -88, + -86, + -87, + -90, + -88, + -88, + -88, + -87, + -87, + -88, + -91, + -93, + -91, + -92, + -89, + -86, + -84, + -83, + -83, + -87, + -90, + -91, + -90, + -91, + -92, + -93, + -94, + -97, + -96, + -97, + -107, + 119, + 79, + 53, + 39, + 39, + 38, + 37, + 40, + 38, + 38, + 37, + 38, + 40, + 41, + 39, + 38, + 36, + 36, + 37, + 37, + 37, + 37, + 37, + 40, + 39, + 40, + 40, + 40, + 40, + 38, + 39, + 43, + 44, + 48, + 59, + 95, + -121, + -103, + -96, + -95, + -97, + -94, + -92, + -90, + -90, + -90, + -88, + -85, + -88, + -89, + -88, + -89, + -91, + -92, + -92, + -91, + -90, + -88, + -88, + -88, + -90, + -91, + -92, + -91, + -89, + -93, + -93, + -92, + -92, + -91, + -93, + -94, + -94, + -94, + -93, + -105, + 118, + 79, + 52, + 38, + 36, + 40, + 41, + 41, + 42, + 39, + 38, + 40, + 40, + 39, + 39, + 39, + 37, + 38, + 37, + 37, + 37, + 37, + 37, + 41, + 42, + 40, + 41, + 43, + 43, + 45, + 43, + 42, + 43, + 47, + 62, + 95, + -120, + -93, + -92, + -96, + -92, + -94, + -92, + -91, + -88, + -88, + -89, + -90, + -91, + -88, + -88, + -89, + -88, + -91, + -93, + -92, + -91, + -90, + -89, + -90, + -89, + -91, + -90, + -90, + -94, + -95, + -95, + -94, + -91, + -87, + -83, + -87, + -88, + -89, + -94, + -106, + 117, + 79, + 60, + 51, + 45, + 40, + 37, + 38, + 38, + 36, + 34, + 33, + 34, + 34, + 33, + 35, + 37, + 36, + 37, + 37, + 37, + 37, + 37, + 36, + 40, + 38, + 39, + 40, + 41, + 38, + 40, + 43, + 48, + 52, + 62, + 96, + -120, + -103, + -99, + -94, + -95, + -93, + -92, + -90, + -89, + -90, + -91, + -90, + -92, + -95, + -95, + -94, + -94, + -92, + -92, + -93, + -93, + -92, + -91, + -90, + -92, + -94, + -93, + -92, + -89, + -91, + -89, + -87, + -88, + -91, + -97, + -98, + -95, + -94, + -94, + -104, + 123, + 86, + 61, + 48, + 46, + 47, + 40, + 38, + 37, + 34, + 36, + 35, + 39, + 41, + 40, + 39, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 39, + 39, + 40, + 39, + 40, + 42, + 41, + 40, + 43, + 42, + 43, + 52, + 85, + 125, + -106, + -92, + -98, + -96, + -84, + -82, + -87, + -86, + -85, + -86, + -86, + -90, + -88, + -88, + -87, + -87, + -92, + -93, + -93, + -93, + -90, + -91, + -92, + -89, + -89, + -89, + -89, + -91, + -91, + -93, + -93, + -94, + -93, + -92, + -94, + -94, + -91, + -92, + -100, + 123, + 79, + 57, + 47, + 45, + 47, + 40, + 37, + 36, + 35, + 38, + 37, + 39, + 40, + 38, + 39, + 36, + 35, + 37, + 37, + 37, + 37, + 37, + 41, + 38, + 33, + 31, + 37, + 44, + 44, + 44, + 46, + 48, + 52, + 64, + 96, + -117, + -98, + -103, + -99, + -97, + -96, + -97, + -97, + -94, + -89, + -85, + -90, + -91, + -89, + -89, + -89, + -88, + -87, + -86, + -90, + -92, + -91, + -93, + -91, + -92, + -92, + -91, + -93, + -92, + -92, + -92, + -91, + -94, + -94, + -94, + -95, + -93, + -98, + -102, + -110, + 117, + 83, + 55, + 40, + 46, + 48, + 44, + 42, + 39, + 40, + 37, + 39, + 40, + 38, + 38, + 38, + 39, + 42, + 37, + 37, + 37, + 37, + 38, + 39, + 40, + 41, + 41, + 41, + 41, + 40, + 42, + 46, + 47, + 52, + 65, + 102, + -114, + -102, + -97, + -100, + -95, + -83, + -88, + -91, + -89, + -91, + -91, + -89, + -89, + -88, + -90, + -89, + -88, + -88, + -88, + -89, + -92, + -90, + -90, + -90, + -90, + -92, + -94, + -95, + -94, + -93, + -92, + -90, + -90, + -92, + -92, + -94, + -92, + -92, + -96, + -108, + 116, + 76, + 57, + 50, + 47, + 42, + 38, + 41, + 42, + 41, + 37, + 36, + 37, + 36, + 36, + 37, + 35, + 35, + 37, + 37, + 37, + 37, + 38, + 39, + 40, + 41, + 39, + 41, + 40, + 36, + 34, + 37, + 39, + 42, + 61, + 100, + -113, + -90, + -97, + -96, + -90, + -87, + -88, + -90, + -91, + -93, + -89, + -91, + -91, + -90, + -90, + -91, + -91, + -89, + -87, + -90, + -91, + -89, + -90, + -89, + -90, + -90, + -92, + -92, + -92, + -91, + -91, + -89, + -90, + -92, + -90, + -92, + -93, + -93, + -96, + -107, + 119, + 81, + 48, + 37, + 40, + 44, + 45, + 41, + 40, + 38, + 36, + 37, + 38, + 37, + 37, + 37, + 36, + 35, + 37, + 37, + 37, + 37, + 39, + 47, + 50, + 45, + 40, + 41, + 40, + 41, + 42, + 44, + 48, + 53, + 64, + 98, + -116, + -95, + -96, + -97, + -87, + -83, + -87, + -87, + -88, + -87, + -86, + -86, + -87, + -91, + -95, + -94, + -92, + -88, + -89, + -90, + -90, + -88, + -87, + -88, + -90, + -94, + -92, + -93, + -91, + -89, + -89, + -87, + -86, + -87, + -90, + -92, + -92, + -91, + -92, + -100, + 125, + 79, + 52, + 51, + 54, + 50, + 47, + 47, + 47, + 46, + 45, + 46, + 44, + 40, + 36, + 34, + 34, + 34, + 37, + 37, + 37, + 37, + 38, + 41, + 42, + 42, + 39, + 39, + 37, + 35, + 39, + 46, + 52, + 53, + 68, + 101, + -119, + -101, + -101, + -101, + -93, + -90, + -89, + -88, + -88, + -88, + -85, + -89, + -90, + -89, + -91, + -93, + -92, + -90, + -90, + -90, + -91, + -91, + -90, + -91, + -93, + -91, + -92, + -92, + -89, + -90, + -91, + -92, + -95, + -95, + -94, + -95, + -95, + -96, + -97, + -110, + 116, + 81, + 54, + 48, + 52, + 51, + 49, + 45, + 47, + 46, + 43, + 44, + 43, + 38, + 35, + 35, + 34, + 36, + 37, + 37, + 37, + 37, + 39, + 43, + 43, + 41, + 40, + 42, + 41, + 41, + 40, + 40, + 44, + 50, + 68, + 106, + -112, + -93, + -93, + -95, + -92, + -94, + -93, + -90, + -89, + -90, + -88, + -90, + -89, + -88, + -89, + -89, + -89, + -86, + -88, + -91, + -92, + -92, + -91, + -92, + -91, + -91, + -92, + -91, + -92, + -90, + -90, + -91, + -88, + -87, + -90, + -92, + -91, + -91, + -92, + -104, + 121, + 80, + 54, + 43, + 45, + 46, + 41, + 41, + 40, + 38, + 38, + 38, + 37, + 37, + 37, + 37, + 39, + 40, + 37, + 37, + 37, + 37, + 37, + 39, + 39, + 40, + 38, + 40, + 41, + 40, + 41, + 43, + 46, + 52, + 69, + 105, + -112, + -92, + -95, + -94, + -90, + -94, + -94, + -92, + -91, + -90, + -91, + -90, + -90, + -90, + -90, + -89, + -88, + -89, + -90, + -90, + -93, + -94, + -93, + -92, + -91, + -91, + -92, + -94, + -91, + -91, + -89, + -89, + -93, + -95, + -96, + -97, + -96, + -96, + -96, + -106, + 121, + 86, + 54, + 47, + 53, + 50, + 48, + 43, + 40, + 39, + 37, + 40, + 40, + 38, + 38, + 36, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 39, + 38, + 38, + 38, + 38, + 37, + 37, + 39, + 41, + 42, + 45, + 62, + 104, + -112, + -93, + -87, + -91, + -92, + -92, + -91, + -89, + -91, + -89, + -90, + -88, + -86, + -88, + -90, + -91, + -91, + -90, + -91, + -91, + -91, + -90, + -89, + -90, + -89, + -90, + -93, + -91, + -92, + -92, + -91, + -92, + -91, + -91, + -94, + -94, + -92, + -93, + -92, + -103, + 124, + 92, + 65, + 49, + 47, + 45, + 39, + 40, + 40, + 40, + 37, + 37, + 37, + 37, + 41, + 41, + 38, + 38, + 37, + 37, + 37, + 37, + 38, + 46, + 42, + 42, + 40, + 41, + 41, + 37, + 39, + 43, + 49, + 59, + 78, + 112, + -105, + -88, + -94, + -93, + -96, + -95, + -92, + -90, + -88, + -90, + -91, + -90, + -88, + -89, + -90, + -89, + -90, + -91, + -90, + -91, + -93, + -93, + -92, + -92, + -91, + -91, + -90, + -92, + -92, + -92, + -93, + -92, + -92, + -92, + -94, + -94, + -94, + -94, + -93, + -107, + 116, + 77, + 48, + 43, + 47, + 43, + 41, + 40, + 39, + 38, + 38, + 42, + 40, + 38, + 37, + 34, + 34, + 34, + 36, + 37, + 37, + 37, + 37, + 41, + 41, + 38, + 38, + 39, + 40, + 39, + 39, + 40, + 40, + 45, + 63, + 102, + -117, + -98, + -92, + -88, + -87, + -91, + -90, + -89, + -90, + -91, + -93, + -90, + -83, + -85, + -87, + -88, + -90, + -91, + -93, + -92, + -93, + -91, + -89, + -89, + -89, + -91, + -94, + -92, + -91, + -90, + -92, + -92, + -92, + -93, + -91, + -89, + -90, + -89, + -87, + -99, + 126, + 86, + 54, + 43, + 45, + 46, + 42, + 40, + 38, + 36, + 34, + 34, + 36, + 34, + 35, + 34, + 35, + 36, + 36, + 37, + 37, + 37, + 38, + 43, + 40, + 38, + 38, + 40, + 41, + 40, + 41, + 41, + 42, + 50, + 74, + 113, + -113, + -98, + -95, + -88, + -88, + -90, + -91, + -90, + -90, + -92, + -91, + -88, + -86, + -87, + -86, + -86, + -89, + -91, + -92, + -92, + -91, + -88, + -90, + -93, + -95, + -97, + -97, + -95, + -94, + -93, + -92, + -92, + -92, + -93, + -94, + -94, + -96, + -95, + -96, + -111, + 111, + 73, + 42, + 39, + 50, + 45, + 41, + 40, + 38, + 38, + 39, + 41, + 38, + 35, + 35, + 33, + 30, + 28, + 36, + 37, + 37, + 37, + 37, + 37, + 40, + 38, + 40, + 41, + 41, + 43, + 42, + 40, + 42, + 49, + 74, + 119, + -100, + -88, + -94, + -93, + -90, + -94, + -94, + -91, + -89, + -89, + -90, + -89, + -88, + -93, + -94, + -91, + -89, + -87, + -90, + -96, + -98, + -96, + -94, + -94, + -92, + -92, + -92, + -89, + -88, + -89, + -91, + -90, + -89, + -88, + -86, + -87, + -90, + -93, + -95, + -110, + 113, + 79, + 59, + 52, + 43, + 38, + 38, + 38, + 41, + 41, + 39, + 41, + 42, + 41, + 40, + 40, + 40, + 39, + 37, + 37, + 37, + 37, + 37, + 39, + 38, + 40, + 40, + 42, + 40, + 41, + 43, + 47, + 50, + 53, + 74, + 112, + -114, + -99, + -95, + -92, + -94, + -95, + -95, + -92, + -90, + -91, + -88, + -85, + -89, + -88, + -87, + -88, + -89, + -89, + -91, + -91, + -90, + -88, + -91, + -94, + -93, + -93, + -93, + -94, + -93, + -91, + -90, + -90, + -92, + -93, + -94, + -92, + -94, + -94, + -95, + -110, + 113, + 78, + 52, + 46, + 49, + 45, + 43, + 42, + 43, + 41, + 39, + 41, + 40, + 38, + 38, + 35, + 37, + 39, + 37, + 37, + 37, + 37, + 37, + 35, + 38, + 38, + 41, + 42, + 39, + 42, + 43, + 44, + 46, + 55, + 80, + 119, + -108, + -99, + -95, + -91, + -90, + -95, + -95, + -92, + -90, + -94, + -94, + -89, + -88, + -92, + -91, + -91, + -93, + -93, + -93, + -93, + -91, + -89, + -90, + -93, + -91, + -89, + -88, + -89, + -88, + -89, + -92, + -93, + -93, + -93, + -92, + -92, + -95, + -95, + -97, + -113, + 108, + 67, + 48, + 46, + 41, + 41, + 42, + 39, + 39, + 37, + 36, + 38, + 38, + 36, + 37, + 39, + 38, + 39, + 37, + 37, + 37, + 37, + 36, + 32, + 34, + 36, + 38, + 38, + 38, + 38, + 41, + 42, + 44, + 50, + 67, + 115, + -98, + -89, + -94, + -93, + -87, + -86, + -91, + -90, + -92, + -93, + -92, + -89, + -91, + -92, + -90, + -92, + -92, + -91, + -90, + -90, + -89, + -87, + -90, + -93, + -92, + -92, + -95, + -94, + -94, + -93, + -91, + -92, + -94, + -95, + -96, + -93, + -93, + -92, + -95, + -112, + 107, + 73, + 56, + 45, + 45, + 44, + 41, + 41, + 39, + 38, + 37, + 39, + 39, + 37, + 38, + 37, + 39, + 41, + 37, + 37, + 37, + 37, + 37, + 40, + 39, + 41, + 42, + 42, + 39, + 39, + 43, + 47, + 49, + 56, + 76, + 112, + -112, + -102, + -90, + -78, + -88, + -93, + -92, + -92, + -90, + -89, + -91, + -88, + -86, + -90, + -88, + -87, + -89, + -91, + -90, + -90, + -89, + -90, + -90, + -88, + -90, + -89, + -89, + -89, + -87, + -90, + -91, + -90, + -90, + -88, + -90, + -92, + -93, + -93, + -97, + -112, + 108, + 71, + 52, + 48, + 51, + 48, + 45, + 40, + 40, + 41, + 42, + 42, + 41, + 39, + 41, + 42, + 39, + 37, + 37, + 37, + 37, + 37, + 37, + 38, + 39, + 40, + 40, + 40, + 40, + 42, + 45, + 46, + 45, + 51, + 72, + 121, + -98, + -99, + -100, + -95, + -93, + -96, + -95, + -93, + -90, + -90, + -87, + -89, + -89, + -90, + -89, + -90, + -90, + -89, + -92, + -94, + -90, + -91, + -91, + -91, + -90, + -89, + -90, + -88, + -90, + -92, + -91, + -92, + -93, + -94, + -96, + -94, + -94, + -95, + -97, + -113, + 106, + 71, + 52, + 48, + 46, + 45, + 45, + 41, + 37, + 33, + 33, + 35, + 35, + 37, + 38, + 37, + 36, + 35, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 38, + 39, + 39, + 39, + 40, + 42, + 40, + 42, + 50, + 73, + 114, + -107, + -96, + -100, + -97, + -100, + -103, + -101, + -97, + -92, + -89, + -89, + -87, + -85, + -88, + -89, + -87, + -87, + -88, + -88, + -89, + -91, + -92, + -89, + -86, + -86, + -84, + -86, + -86, + -90, + -94, + -94, + -93, + -93, + -94, + -94, + -93, + -92, + -94, + -99, + -115, + 106, + 72, + 60, + 59, + 57, + 55, + 48, + 42, + 39, + 37, + 37, + 39, + 37, + 37, + 38, + 37, + 35, + 33, + 37, + 37, + 37, + 37, + 38, + 45, + 43, + 42, + 39, + 36, + 35, + 34, + 38, + 40, + 42, + 50, + 76, + 115, + -110, + -97, + -89, + -88, + -92, + -95, + -94, + -91, + -90, + -88, + -86, + -87, + -88, + -87, + -86, + -88, + -88, + -88, + -91, + -90, + -89, + -90, + -89, + -89, + -91, + -90, + -91, + -90, + -91, + -93, + -93, + -93, + -95, + -97, + -96, + -92, + -94, + -97, + -100, + -118, + 106, + 72, + 54, + 50, + 48, + 47, + 46, + 44, + 40, + 36, + 38, + 40, + 42, + 41, + 40, + 38, + 36, + 38, + 37, + 37, + 37, + 37, + 37, + 39, + 41, + 41, + 41, + 40, + 41, + 45, + 47, + 47, + 46, + 53, + 77, + 119, + -102, + -90, + -94, + -89, + -88, + -94, + -90, + -87, + -86, + -85, + -87, + -87, + -85, + -86, + -86, + -87, + -88, + -90, + -90, + -91, + -91, + -91, + -93, + -91, + -91, + -92, + -93, + -93, + -92, + -94, + -93, + -90, + -91, + -92, + -92, + -91, + -94, + -96, + -95, + -105, + 114, + 74, + 57, + 51, + 50, + 53, + 47, + 42, + 39, + 37, + 41, + 46, + 46, + 43, + 40, + 35, + 31, + 29, + 37, + 37, + 37, + 37, + 38, + 39, + 37, + 38, + 39, + 40, + 41, + 40, + 43, + 46, + 48, + 57, + 89, + -126, + -102, + -97, + -96, + -93, + -96, + -92, + -89, + -89, + -91, + -94, + -90, + -91, + -90, + -88, + -88, + -90, + -90, + -90, + -92, + -93, + -93, + -92, + -90, + -89, + -90, + -89, + -91, + -93, + -91, + -92, + -93, + -92, + -94, + -95, + -92, + -92, + -95, + -99, + -100, + -116, + 103, + 70, + 54, + 52, + 54, + 49, + 46, + 43, + 40, + 36, + 35, + 39, + 41, + 37, + 38, + 38, + 38, + 37, + 37, + 37, + 37, + 38, + 38, + 42, + 43, + 41, + 41, + 41, + 45, + 45, + 44, + 44, + 46, + 56, + 86, + 119, + -113, + -96, + -91, + -78, + -83, + -90, + -90, + -90, + -89, + -91, + -92, + -92, + -90, + -88, + -89, + -91, + -91, + -90, + -89, + -89, + -88, + -88, + -90, + -90, + -92, + -92, + -92, + -90, + -90, + -94, + -93, + -91, + -91, + -92, + -94, + -91, + -90, + -95, + -100, + -121, + 91, + 58, + 49, + 49, + 47, + 45, + 44, + 44, + 43, + 41, + 40, + 40, + 37, + 35, + 35, + 36, + 35, + 34, + 37, + 37, + 38, + 38, + 38, + 42, + 38, + 37, + 38, + 37, + 37, + 40, + 45, + 45, + 44, + 54, + 84, + 123, + -106, + -96, + -95, + -96, + -99, + -97, + -96, + -92, + -91, + -92, + -91, + -92, + -95, + -94, + -93, + -92, + -91, + -89, + -91, + -92, + -91, + -91, + -92, + -94, + -92, + -88, + -89, + -91, + -91, + -93, + -94, + -92, + -93, + -92, + -93, + -92, + -94, + -95, + -97, + -118, + 95, + 55, + 33, + 34, + 37, + 37, + 34, + 33, + 33, + 31, + 34, + 36, + 36, + 34, + 35, + 36, + 37, + 38, + 37, + 37, + 38, + 38, + 38, + 40, + 40, + 42, + 43, + 43, + 41, + 41, + 40, + 43, + 43, + 50, + 77, + 116, + -110, + -84, + -81, + -87, + -91, + -94, + -91, + -88, + -88, + -89, + -88, + -88, + -88, + -85, + -88, + -89, + -88, + -88, + -89, + -92, + -91, + -93, + -92, + -92, + -94, + -94, + -93, + -93, + -94, + -96, + -95, + -91, + -89, + -88, + -91, + -92, + -94, + -98, + -100, + -122, + 91, + 57, + 43, + 46, + 41, + 33, + 36, + 36, + 38, + 39, + 39, + 38, + 33, + 33, + 34, + 34, + 34, + 35, + 37, + 38, + 38, + 38, + 39, + 44, + 43, + 44, + 45, + 44, + 40, + 40, + 42, + 40, + 46, + 60, + 93, + -127, + -103, + -88, + -87, + -94, + -93, + -96, + -97, + -94, + -89, + -90, + -89, + -88, + -90, + -90, + -91, + -92, + -90, + -90, + -91, + -93, + -94, + -94, + -94, + -94, + -93, + -91, + -94, + -96, + -95, + -98, + -97, + -94, + -94, + -95, + -99, + -98, + -95, + -95, + -101, + -121, + 95, + 58, + 42, + 39, + 44, + 44, + 39, + 37, + 41, + 42, + 41, + 41, + 37, + 33, + 33, + 32, + 33, + 33, + 37, + 38, + 38, + 38, + 38, + 39, + 41, + 44, + 44, + 47, + 46, + 44, + 41, + 39, + 40, + 52, + 85, + 127, + -102, + -88, + -82, + -87, + -92, + -94, + -91, + -90, + -91, + -92, + -91, + -89, + -91, + -92, + -91, + -89, + -87, + -86, + -89, + -91, + -92, + -93, + -93, + -92, + -95, + -98, + -95, + -90, + -87, + -90, + -92, + -93, + -94, + -98, + -99, + -97, + -97, + -96, + -98, + -114, + 106, + 65, + 40, + 42, + 41, + 39, + 41, + 41, + 43, + 46, + 45, + 43, + 40, + 38, + 39, + 40, + 40, + 39, + 37, + 38, + 38, + 38, + 38, + 34, + 37, + 39, + 42, + 42, + 41, + 42, + 41, + 42, + 44, + 58, + 88, + 124, + -109, + -98, + -95, + -96, + -97, + -95, + -95, + -95, + -96, + -94, + -91, + -90, + -92, + -91, + -90, + -90, + -89, + -87, + -89, + -92, + -94, + -95, + -96, + -95, + -94, + -94, + -97, + -98, + -97, + -97, + -96, + -95, + -96, + -95, + -98, + -99, + -98, + -97, + -100, + -121, + 90, + 52, + 37, + 36, + 39, + 41, + 39, + 39, + 40, + 38, + 35, + 33, + 34, + 35, + 34, + 36, + 36, + 35, + 37, + 38, + 38, + 38, + 38, + 40, + 39, + 40, + 39, + 40, + 44, + 46, + 49, + 53, + 53, + 53, + 73, + 108, + -114, + -96, + -96, + -99, + -100, + -99, + -96, + -94, + -95, + -93, + -89, + -84, + -88, + -91, + -91, + -93, + -97, + -97, + -98, + -97, + -93, + -92, + -92, + -92, + -95, + -95, + -94, + -92, + -91, + -94, + -96, + -96, + -94, + -94, + -94, + -92, + -93, + -94, + -96, + -115, + 103, + 64, + 36, + 38, + 45, + 42, + 44, + 41, + 41, + 41, + 37, + 38, + 42, + 45, + 46, + 43, + 39, + 33, + 37, + 38, + 38, + 38, + 38, + 42, + 42, + 38, + 36, + 35, + 34, + 36, + 40, + 39, + 39, + 49, + 82, + -123, + -95, + -91, + -87, + -89, + -93, + -94, + -95, + -94, + -95, + -94, + -91, + -92, + -93, + -92, + -92, + -94, + -95, + -95, + -96, + -94, + -94, + -94, + -93, + -94, + -92, + -90, + -92, + -90, + -91, + -93, + -92, + -92, + -91, + -91, + -93, + -93, + -93, + -93, + -98, + -122, + 90, + 54, + 40, + 40, + 41, + 40, + 38, + 36, + 36, + 36, + 39, + 42, + 43, + 41, + 38, + 38, + 36, + 36, + 37, + 38, + 38, + 38, + 38, + 41, + 40, + 37, + 36, + 38, + 42, + 42, + 41, + 44, + 41, + 48, + 73, + 116, + -103, + -88, + -87, + -92, + -96, + -95, + -93, + -91, + -87, + -85, + -88, + -85, + -89, + -93, + -91, + -88, + -87, + -85, + -87, + -89, + -91, + -93, + -92, + -92, + -92, + -91, + -94, + -90, + -91, + -93, + -93, + -94, + -92, + -92, + -95, + -93, + -92, + -93, + -96, + -116, + 104, + 66, + 40, + 39, + 37, + 39, + 42, + 43, + 43, + 40, + 38, + 37, + 36, + 36, + 34, + 34, + 35, + 35, + 37, + 38, + 38, + 38, + 38, + 41, + 41, + 38, + 37, + 36, + 35, + 37, + 42, + 44, + 46, + 58, + 91, + -120, + -98, + -99, + -94, + -89, + -93, + -92, + -92, + -93, + -93, + -93, + -91, + -89, + -88, + -85, + -86, + -88, + -89, + -87, + -89, + -88, + -90, + -94, + -93, + -94, + -94, + -91, + -90, + -86, + -90, + -94, + -94, + -96, + -95, + -95, + -94, + -93, + -92, + -91, + -97, + -123, + 91, + 58, + 48, + 52, + 48, + 44, + 43, + 43, + 41, + 36, + 38, + 42, + 43, + 39, + 37, + 34, + 31, + 32, + 37, + 38, + 38, + 38, + 38, + 41, + 40, + 37, + 41, + 42, + 41, + 43, + 41, + 39, + 45, + 60, + 92, + -123, + -102, + -102, + -99, + -99, + -97, + -92, + -93, + -93, + -94, + -94, + -96, + -93, + -89, + -92, + -91, + -90, + -89, + -90, + -88, + -90, + -90, + -91, + -92, + -92, + -92, + -92, + -94, + -90, + -90, + -90, + -91, + -91, + -91, + -93, + -94, + -91, + -92, + -95, + -103, + -127, + 92, + 59, + 49, + 56, + 53, + 55, + 51, + 50, + 48, + 43, + 39, + 36, + 35, + 35, + 34, + 33, + 34, + 37, + 37, + 38, + 38, + 38, + 38, + 38, + 39, + 38, + 40, + 41, + 40, + 42, + 45, + 45, + 47, + 64, + 100, + -118, + -104, + -102, + -93, + -95, + -92, + -96, + -97, + -96, + -96, + -94, + -92, + -89, + -90, + -93, + -93, + -96, + -97, + -94, + -96, + -96, + -97, + -98, + -97, + -96, + -94, + -94, + -95, + -92, + -95, + -94, + -94, + -95, + -94, + -95, + -96, + -95, + -94, + -94, + -97, + -118, + 102, + 70, + 53, + 53, + 55, + 52, + 54, + 52, + 47, + 41, + 38, + 39, + 40, + 36, + 37, + 37, + 35, + 36, + 37, + 38, + 38, + 38, + 38, + 40, + 39, + 40, + 41, + 39, + 33, + 33, + 36, + 40, + 51, + 64, + 84, + 125, + -102, + -87, + -81, + -92, + -98, + -101, + -98, + -97, + -95, + -95, + -95, + -94, + -94, + -98, + -97, + -94, + -93, + -93, + -93, + -92, + -91, + -92, + -93, + -93, + -93, + -93, + -95, + -94, + -94, + -96, + -94, + -91, + -91, + -95, + -94, + -95, + -98, + -98, + -102, + -119, + 101, + 71, + 55, + 47, + 47, + 48, + 51, + 52, + 45, + 38, + 34, + 30, + 34, + 34, + 32, + 34, + 34, + 37, + 37, + 37, + 38, + 38, + 38, + 41, + 42, + 41, + 39, + 41, + 39, + 37, + 37, + 37, + 44, + 66, + 105, + -118, + -105, + -107, + -106, + -102, + -101, + -102, + -100, + -101, + -101, + -99, + -98, + -96, + -96, + -98, + -94, + -94, + -95, + -94, + -96, + -97, + -97, + -96, + -96, + -95, + -96, + -94, + -96, + -99, + -95, + -96, + -98, + -100, + -98, + -97, + -97, + -94, + -93, + -97, + -107, + 123, + 83, + 54, + 41, + 45, + 48, + 45, + 46, + 44, + 43, + 40, + 36, + 39, + 36, + 37, + 38, + 40, + 41, + 40, + 37, + 37, + 38, + 38, + 38, + 40, + 40, + 43, + 43, + 41, + 40, + 42, + 42, + 40, + 44, + 61, + 90, + 121, + -122, + -121, + -117, + -113, + -111, + -108, + -104, + -104, + -105, + -106, + -106, + -102, + -103, + -106, + -106, + -107, + -106, + -106, + -104, + -103, + -101, + -100, + -99, + -98, + -99, + -100, + -101, + -98, + -95, + -94, + -94, + -93, + -95, + -95, + -97, + -97, + -98, + -97, + -97, + -115, + 98, + 58, + 40, + 42, + 46, + 46, + 47, + 48, + 45, + 43, + 42, + 40, + 39, + 36, + 34, + 35, + 36, + 38, + 37, + 37, + 37, + 38, + 38, + 37, + 41, + 41, + 42, + 43, + 40, + 41, + 40, + 40, + 42, + 51, + 68, + 78, + 81, + 81, + 81, + 85, + 85, + 87, + 88, + 89, + 93, + 96, + 97, + 100, + 98, + 101, + 105, + 109, + 110, + 113, + 116, + 116, + 117, + 118, + 119, + 120, + 121, + 126, + -126, + -126, + -123, + -120, + -118, + -117, + -115, + -114, + -113, + -110, + -106, + -108, + -115, + 117, + 81, + 52, + 40, + 42, + 47, + 48, + 48, + 45, + 42, + 38, + 34, + 37, + 34, + 36, + 37, + 39, + 39, + 38, + 37, + 37, + 37, + 38, + 38, + 38, + 37, + 39, + 41, + 39, + 42, + 42, + 40, + 41, + 43, + 53, + 69, + 71, + 66, + 65, + 61, + 57, + 57, + 58, + 60, + 62, + 65, + 64, + 68, + 76, + 71, + 67, + 68, + 69, + 75, + 82, + 87, + 85, + 85, + 86, + 87, + 92, + 94, + 94, + 96, + 90, + 91, + 95, + 101, + 109, + 109, + 114, + 115, + 119, + 123, + 121, + 117, + 104, + 77, + 50, + 37, + 32, + 30, + 24, + 27, + 35, + 39, + 39, + 36, + 38, + 36, + 37, + 36, + 34, + 33, + 32, + 37, + 37, + 37, + 37, + 38, + 37, + 41, + 40, + 41, + 43, + 41, + 39, + 38, + 40, + 43, + 49, + 53, + 52, + 50, + 50, + 51, + 51, + 52, + 54, + 49, + 46, + 50, + 48, + 47, + 51, + 51, + 50, + 48, + 50, + 50, + 50, + 50, + 50, + 51, + 51, + 52, + 52, + 56, + 57, + 58, + 59, + 57, + 56, + 56, + 55, + 52, + 53, + 56, + 59, + 60, + 61, + 62, + 59, + 54, + 54, + 51, + 47, + 50, + 47, + 45, + 44, + 43, + 40, + 37, + 37, + 37, + 39, + 43, + 45, + 43, + 39, + 36, + 37, + 37, + 37, + 39, + 46, + 41, + 38, + 40, + 40, + 39, + 40, + 40, + 38, + 43, + 49, + 54, + 54, + 52, + 52, + 49, + 47, + 47, + 50, + 48, + 49, + 52, + 49, + 50, + 51, + 48, + 48, + 49, + 49, + 49, + 51, + 50, + 46, + 46, + 50, + 49, + 52, + 52, + 47, + 48, + 51, + 52, + 48, + 50, + 52, + 47, + 45, + 46, + 45, + 48, + 49, + 50, + 48, + 44, + 45, + 48, + 50, + 47, + 43, + 44, + 44, + 44, + 43, + 43, + 43, + 41, + 41, + 41, + 38, + 36, + 36, + 36, + 37, + 37, + 37, + 37, + 41, + 41, + 39, + 38, + 38, + 36, + 36, + 37, + 39, + 44, + 48, + 50, + 50, + 50, + 52, + 52, + 52, + 52, + 53, + 50, + 46, + 46, + 46, + 42, + 43, + 46, + 45, + 44, + 46, + 46, + 45, + 43, + 45, + 46, + 50, + 51, + 50, + 51, + 50, + 49, + 51, + 51, + 50, + 51, + 50, + 49, + 47, + 49, + 49, + 50, + 52, + 50, + 48, + 45, + 46, + 47, + 47, + 48, + 47, + 45, + 44, + 45, + 42, + 38, + 37, + 35, + 31, + 29, + 31, + 33, + 35, + 36, + 36, + 37, + 37, + 37, + 39, + 39, + 40, + 41, + 42, + 39, + 37, + 37, + 36, + 40, + 44, + 48, + 47, + 45, + 46, + 49, + 49, + 49, + 50, + 47, + 48, + 49, + 48, + 45, + 47, + 47, + 49, + 51, + 53, + 51, + 49, + 48, + 46, + 44, + 44, + 43, + 44, + 46, + 48, + 49, + 51, + 51, + 50, + 49, + 49, + 48, + 50, + 54, + 56, + 49, + 44, + 43, + 44, + 44, + 45, + 45, + 44, + 45, + 42, + 40, + 41, + 42, + 41, + 38, + 36, + 37, + 41, + 46, + 43, + 40, + 37, + 36, + 36, + 37, + 37, + 37, + 40, + 41, + 40, + 39, + 39, + 36, + 35, + 37, + 38, + 41, + 43, + 45, + 46, + 46, + 46, + 47, + 45, + 41, + 45, + 46, + 47, + 48, + 47, + 45, + 44, + 45, + 47, + 46, + 46, + 46, + 45, + 46, + 45, + 43, + 44, + 44, + 46, + 51, + 51, + 47, + 49, + 46, + 44, + 43, + 39, + 39, + 42, + 46, + 46, + 46, + 44, + 43, + 42, + 42, + 44, + 44, + 46, + 46, + 47, + 45, + 40, + 37, + 33, + 35, + 40, + 45, + 42, + 42, + 42, + 38, + 36, + 36, + 36, + 36, + 37, + 38, + 42, + 42, + 40, + 39, + 38, + 38, + 39, + 40, + 39, + 38, + 40, + 40, + 38, + 37, + 38, + 40, + 40, + 38, + 39, + 39, + 40, + 39, + 36, + 34, + 37, + 40, + 40, + 41, + 40, + 38, + 35, + 36, + 40, + 39, + 38, + 36, + 36, + 37, + 39, + 40, + 40, + 40, + 41, + 42, + 42, + 42, + 42, + 40, + 41, + 41, + 42, + 45, + 45, + 42, + 42, + 40, + 42, + 46, + 46, + 44, + 43, + 41, + 39, + 37, + 40, + 41, + 37, + 35, + 32, + 30, + 31, + 36, + 36, + 36, + 36, + 37, + 40, + 40, + 40, + 39, + 39, + 38, + 39, + 41, + 42, + 40, + 42, + 42, + 41, + 38, + 38, + 42, + 39, + 37, + 39, + 37, + 34, + 35, + 36, + 39, + 39, + 41, + 41, + 39, + 39, + 36, + 35, + 35, + 37, + 41, + 45, + 48, + 47, + 48, + 45, + 42, + 44, + 41, + 41, + 42, + 43, + 42, + 41, + 40, + 39, + 37, + 37, + 37, + 38, + 38, + 40, + 41, + 42, + 40, + 41, + 40, + 39, + 40, + 38, + 37, + 39, + 41, + 40, + 37, + 35, + 32, + 33, + 36, + 36, + 36, + 36, + 36, + 38, + 39, + 38, + 37, + 38, + 37, + 37, + 40, + 39, + 43, + 48, + 48, + 44, + 39, + 38, + 40, + 41, + 41, + 41, + 42, + 42, + 39, + 36, + 35, + 35, + 34, + 35, + 36, + 38, + 38, + 37, + 39, + 38, + 36, + 36, + 37, + 39, + 40, + 40, + 38, + 38, + 37, + 35, + 36, + 33, + 34, + 37, + 36, + 39, + 39, + 38, + 37, + 33, + 30, + 32, + 33, + 33, + 35, + 36, + 36, + 36, + 37, + 35, + 37, + 39, + 40, + 36, + 35, + 37, + 36, + 35, + 36, + 36, + 36, + 36, + 35, + 31, + 34, + 35, + 37, + 38, + 37, + 36, + 39, + 42, + 41, + 41, + 40, + 38, + 36, + 37, + 38, + 39, + 40, + 40, + 37, + 34, + 34, + 35, + 37, + 37, + 39, + 39, + 38, + 40, + 39, + 41, + 43, + 43, + 43, + 40, + 39, + 41, + 41, + 39, + 35, + 33, + 34, + 33, + 36, + 38, + 40, + 40, + 39, + 40, + 37, + 39, + 37, + 34, + 33, + 34, + 35, + 35, + 35, + 35, + 33, + 35, + 34, + 33, + 34, + 36, + 37, + 36, + 35, + 35, + 34, + 35, + 36, + 36, + 36, + 36, + 36, + 38, + 39, + 40, + 40, + 42, + 41, + 40, + 43, + 42, + 39, + 38, + 35, + 35, + 34, + 35, + 37, + 37, + 37, + 37, + 38, + 37, + 35, + 34, + 36, + 39, + 40, + 39, + 40, + 41, + 40, + 36, + 37, + 38, + 34, + 35, + 36, + 37, + 39, + 40, + 37, + 37, + 37, + 34, + 34, + 35, + 35, + 37, + 37, + 38, + 39, + 42, + 44, + 42, + 40, + 41, + 40, + 38, + 35, + 34, + 34, + 36, + 36, + 37, + 39, + 38, + 40, + 40, + 38, + 36, + 33, + 31, + 36, + 36, + 36, + 36, + 36, + 36, + 36, + 39, + 41, + 42, + 41, + 40, + 38, + 38, + 37, + 37, + 41, + 40, + 39, + 39, + 37, + 39, + 38, + 39, + 37, + 35, + 35, + 35, + 36, + 39, + 38, + 38, + 38, + 38, + 39, + 39, + 39, + 38, + 38, + 39, + 40, + 41, + 41, + 41, + 38, + 38, + 37, + 37, + 36, + 38, + 40, + 39, + 37, + 35, + 37, + 35, + 33, + 34, + 35, + 38, + 36, + 36, + 38, + 34, + 33, + 35, + 36, + 35, + 37, + 39, + 38, + 38, + 38, + 37, + 34, + 31, + 36, + 36, + 36, + 36, + 36, + 37, + 41, + 41, + 39, + 40, + 39, + 40, + 41, + 42, + 40, + 35, + 35, + 36, + 34, + 36, + 38, + 38, + 39, + 39, + 39, + 39, + 38, + 37, + 38, + 38, + 36, + 34, + 35, + 40, + 44, + 43, + 46, + 47, + 40, + 35, + 36, + 36, + 37, + 37, + 35, + 36, + 37, + 35, + 36, + 38, + 38, + 39, + 39, + 39, + 40, + 40, + 38, + 33, + 32, + 35, + 36, + 35, + 32, + 31, + 32, + 34, + 34, + 35, + 38, + 39, + 38, + 37, + 35, + 36, + 36, + 33, + 36, + 36, + 36, + 36, + 36, + 35, + 31, + 33, + 36, + 36, + 37, + 37, + 37, + 38, + 38, + 39, + 41, + 39, + 36, + 36, + 36, + 35, + 37, + 34, + 34, + 32, + 32, + 34, + 35, + 39, + 38, + 38, + 39, + 38, + 38, + 38, + 38, + 36, + 33, + 34, + 33, + 34, + 34, + 37, + 40, + 40, + 40, + 37, + 35, + 37, + 38, + 37, + 35, + 35, + 36, + 37, + 38, + 41, + 43, + 42, + 37, + 36, + 40, + 39, + 41, + 43, + 41, + 36, + 32, + 33, + 36, + 37, + 40, + 39, + 36, + 33, + 36, + 36, + 36, + 36, + 37, + 42, + 42, + 39, + 35, + 35, + 35, + 37, + 37, + 38, + 39, + 38, + 40, + 40, + 39, + 44, + 44, + 39, + 40, + 40, + 42, + 44, + 42, + 38, + 38, + 36, + 35, + 35, + 35, + 38, + 38, + 35, + 33, + 36, + 35, + 35, + 37, + 38, + 39, + 38, + 38, + 38, + 37, + 36, + 33, + 33, + 33, + 34, + 37, + 38, + 39, + 40, + 36, + 31, + 33, + 36, + 34, + 37, + 35, + 34, + 36, + 37, + 38, + 38, + 37, + 37, + 35, + 33, + 35, + 39, + 36, + 34, + 36, + 36, + 36, + 36, + 36, + 36, + 35, + 36, + 36, + 37, + 35, + 37, + 38, + 38, + 40, + 41, + 42, + 40, + 41, + 44, + 42, + 42, + 40, + 38, + 39, + 37, + 36, + 35, + 35, + 34, + 33, + 34, + 35, + 36, + 36, + 38, + 37, + 37, + 36, + 34, + 36, + 39, + 40, + 39, + 38, + 39, + 37, + 37, + 36, + 39, + 40, + 39, + 39, + 35, + 37, + 37, + 36, + 40, + 41, + 40, + 37, + 35, + 36, + 36, + 37, + 35, + 35, + 34, + 32, + 36, + 34, + 32, + 31, + 30, + 31, + 33, + 36, + 36, + 36, + 36, + 37, + 37, + 37, + 36, + 35, + 38, + 39, + 41, + 40, + 35, + 36, + 35, + 35, + 34, + 34, + 38, + 38, + 39, + 40, + 36, + 35, + 36, + 35, + 36, + 36, + 38, + 36, + 39, + 41, + 42, + 41, + 41, + 40, + 41, + 41, + 39, + 38, + 36, + 37, + 37, + 35, + 37, + 40, + 39, + 37, + 37, + 37, + 38, + 39, + 43, + 44, + 41, + 39, + 39, + 42, + 40, + 36, + 38, + 34, + 33, + 36, + 37, + 41, + 41, + 41, + 41, + 41, + 40, + 40, + 44, + 41, + 38, + 36, + 36, + 36, + 37, + 37, + 38, + 39, + 39, + 38, + 38, + 37, + 40, + 40, + 37, + 38, + 38, + 37, + 36, + 36, + 36, + 35, + 39, + 39, + 38, + 41, + 38, + 37, + 38, + 39, + 41, + 40, + 40, + 41, + 41, + 41, + 40, + 37, + 39, + 40, + 40, + 39, + 39, + 36, + 35, + 35, + 35, + 35, + 35, + 34, + 36, + 35, + 37, + 40, + 40, + 40, + 38, + 36, + 36, + 35, + 37, + 36, + 37, + 38, + 38, + 38, + 37, + 37, + 34, + 31, + 33, + 32, + 33, + 33, + 33, + 35, + 36 + }; diff --git a/targets/wasm-tacle/sequential/susan/math_private.h b/targets/wasm-tacle/sequential/susan/math_private.h new file mode 100755 index 0000000..e846510 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/math_private.h @@ -0,0 +1,174 @@ +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + from: @(#)fdlibm.h 5.1 93/09/24 +*/ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include "wcclibm.h" + +//#include +//#include + +/* A representation of a double as a union. */ +union ieee754_double { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1: 32; + unsigned int mantissa0: 20; + unsigned int exponent: 11; + unsigned int negative: 1; + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct { + /* Together these comprise the mantissa. */ + unsigned int mantissa1: 32; + unsigned int mantissa0: 19; + unsigned int quiet_nan: 1; + unsigned int exponent: 11; + unsigned int negative: 1; + } ieee_nan; +}; + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */ +/* #warning USING Big Endian float word order */ +/* typedef union */ +/* { */ +/* double value; */ +/* struct */ +/* { */ +/* u_int16_t msw; */ +/* u_int16_t lsw; */ +/* } parts; */ +/* } ieeeDoubleShapeType; */ + +/* #endif */ + +/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */ +/* #warning USING Little Endian float word order */ + +typedef union { + double value; + struct { + u_int16_t lsw; + u_int16_t msw; + } parts; +} ieeeDoubleShapeType; + +/* #endif */ + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0,ix1,d) \ +{ \ + ieeeDoubleShapeType ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ +} + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i,d) \ +{ \ + ieeeDoubleShapeType gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ +} + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i,d) \ +{ \ + ieeeDoubleShapeType gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ +} + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d,ix0,ix1) \ +{ \ + ieeeDoubleShapeType iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ +} + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d,v) \ +{ \ + ieeeDoubleShapeType sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ +} + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d,v) \ +{ \ + ieeeDoubleShapeType sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ +} + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union { + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +{ \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +{ \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} + + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/targets/wasm-tacle/sequential/susan/susan.c b/targets/wasm-tacle/sequential/susan/susan.c new file mode 100755 index 0000000..676bf61 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/susan.c @@ -0,0 +1,2508 @@ +/**********************************************************************\ + + SUSAN Version 2l by Stephen Smith + Oxford Centre for Functional Magnetic Resonance Imaging of the Brain, + Department of Clinical Neurology, Oxford University, Oxford, UK + (Previously in Computer Vision and Image Processing Group - now + Computer Vision and Electro Optics Group - DERA Chertsey, UK) + Email: steve@fmrib.ox.ac.uk + WWW: http://www.fmrib.ox.ac.uk/~steve + + (C) Crown Copyright (1995-1999), Defence Evaluation and Research Agency, + Farnborough, Hampshire, GU14 6TD, UK + DERA WWW site: + http://www.dera.gov.uk/ + DERA Computer Vision and Electro Optics Group WWW site: + http://www.dera.gov.uk/imageprocessing/dera/group_home.html + DERA Computer Vision and Electro Optics Group point of contact: + Dr. John Savage, jtsavage@dera.gov.uk, +44 1344 633203 + + A UK patent has been granted: "Method for digitally processing + images to determine the position of edges and/or corners therein for + guidance of unmanned vehicle", UK Patent 2272285. Proprietor: + Secretary of State for Defence, UK. 15 January 1997 + + This code is issued for research purposes only and remains the + property of the UK Secretary of State for Defence. This code must + not be passed on without this header information being kept + intact. This code must not be sold. + + \**********************************************************************/ + +/**********************************************************************\ + + SUSAN Version 2l + SUSAN = Smallest Univalue Segment Assimilating Nucleus + + Email: steve@fmrib.ox.ac.uk + WWW: http://www.fmrib.ox.ac.uk/~steve + + Related paper: + @article{Smith97, + author = "Smith, S.M. and Brady, J.M.", + title = "{SUSAN} - A New Approach to Low Level Image Processing", + journal = "Int. Journal of Computer Vision", + pages = "45--78", + volume = "23", + number = "1", + month = "May", + year = 1997} + + To be registered for automatic (bug) updates of SUSAN, send an email. + + Compile with: + gcc -O4 -o susan susan2l.c -lm + + See following section for different machine information. Please + report any bugs (and fixes). There are a few optional changes that + can be made in the "defines" section which follows shortly. + + Usage: type "susan" to get usage. Only PGM format files can be input + and output. Utilities such as the netpbm package and XV can be used + to convert to and from other formats. Any size of image can be + processed. + + This code is written using an emacs folding mode, making moving + around the different sections very easy. This is why there are + various marks within comments and why comments are indented. + + + SUSAN QUICK: + + This version of the SUSAN corner finder does not do all the + false-corner suppression and thus is faster and produced some false + positives, particularly on strong edges. However, because there are + less stages involving thresholds etc., the corners that are + correctly reported are usually more stable than those reported with + the full algorithm. Thus I recommend at least TRYING this algorithm + for applications where stability is important, e.g., tracking. + + THRESHOLDS: + + There are two thresholds which can be set at run-time. These are the + brightness threshold (t) and the distance threshold (d). + + SPATIAL CONTROL: d + + In SUSAN smoothing d controls the size of the Gaussian mask; its + default is 4.0. Increasing d gives more smoothing. In edge finding, + a fixed flat mask is used, either 37 pixels arranged in a "circle" + (default), or a 3 by 3 mask which gives finer detail. In corner + finding, only the larger 37 pixel mask is used; d is not + variable. In smoothing, the flat 3 by 3 mask can be used instead of + a larger Gaussian mask; this gives low smoothing and fast operation. + + BRIGHTNESS CONTROL: t + + In all three algorithms, t can be varied (default=20); this is the + main threshold to be varied. It determines the maximum difference in + greylevels between two pixels which allows them to be considered + part of the same "region" in the image. Thus it can be reduced to + give more edges or corners, i.e. to be more sensitive, and vice + versa. In smoothing, reducing t gives less smoothing, and vice + versa. Set t=10 for the test image available from the SUSAN web + page. + + ITERATIONS: + + With SUSAN smoothing, more smoothing can also be obtained by + iterating the algorithm several times. This has a different effect + from varying d or t. + + FIXED MASKS: + + 37 pixel mask: ooo 3 by 3 mask: ooo + ooooo ooo + ooooooo ooo + ooooooo + ooooooo + ooooo + ooo + + CORNER ATTRIBUTES dx, dy and I + (Only read this if you are interested in the C implementation or in + using corner attributes, e.g., for corner matching) + + Corners reported in the corner list have attributes associated with + them as well as positions. This is useful, for example, when + attempting to match corners from one image to another, as these + attributes can often be fairly unchanged between images. The + attributes are dx, dy and I. I is the value of image brightness at + the position of the corner. In the case of susan_corners_quick, dx + and dy are the first order derivatives (differentials) of the image + brightness in the x and y directions respectively, at the position + of the corner. In the case of normal susan corner finding, dx and dy + are scaled versions of the position of the centre of gravity of the + USAN with respect to the centre pixel (nucleus). + + BRIGHTNESS FUNCTION LUT IMPLEMENTATION: + (Only read this if you are interested in the C implementation) + + The SUSAN brightness function is implemented as a LUT + (Look-Up-Table) for speed. The resulting pointer-based code is a + little hard to follow, so here is a brief explanation. In + setup_brightness_lut() the LUT is setup. This mallocs enough space + for *bp and then repositions the pointer to the centre of the + malloced space. The SUSAN function e^-(x^6) or e^-(x^2) is + calculated and converted to a uchar in the range 0-100, for all + possible image brightness differences (including negative + ones). Thus bp[ 23 ] is the output for a brightness difference of 23 + greylevels. In the SUSAN algorithms this LUT is used as follows: + + p=in + (i-3)*x_size + j - 1; + p points to the first image pixel in the circular mask surrounding + point (x,y). + + cp=bp + in[ i*x_size+j ]; + cp points to a position in the LUT corresponding to the brightness + of the centre pixel (x,y). + + now for every pixel within the mask surrounding (x,y), + n+=*(cp-*p++); + the brightness difference function is found by moving the cp pointer + down by an amount equal to the value of the pixel pointed to by p, + thus subtracting the two brightness values and performing the + exponential function. This value is added to n, the running USAN + area. + + in SUSAN smoothing, the variable height mask is implemented by + multiplying the above by the moving mask pointer, reset for each new + centre pixel. + tmp = *dpt++ * *(cp-brightness); + + \**********************************************************************/ + +/**********************************************************************\ + + Success has been reported with the following: + + MACHINE OS COMPILER + + Sun 4.1.4 bundled C, gcc + + Next + + SGI IRIX SGI cc + + DEC Unix V3.2+ + + IBM RISC AIX gcc + + PC Borland 5.0 + + PC Linux gcc-2.6.3 + + PC Win32 Visual C++ 4.0 (Console Application) + + PC Win95 Visual C++ 5.0 (Console Application) + Thanks to Niu Yongsheng : + Use the FOPENB option below + + PC DOS djgpp gnu C + Thanks to Mark Pettovello : + Use the FOPENB option below + + HP HP-UX bundled cc + Thanks to Brian Dixon : + in ksh: + export CCOPTS="-Aa -D_HPUX_SOURCE | -lM" + cc -O3 -o susan susan2l.c + + \**********************************************************************/ + +/**********************************************************************\ + + SUSAN Version 2l, 12/2/99 + Changed GNUDOS option to FOPENB. + (Thanks to Niu Yongsheng .) + Took out redundant "sq=sq/2;". + + SUSAN Version 2k, 19/8/98: + In corner finding: + Changed if(yyx_size) etc. tests in smoothing. + Added a couple of free() calls for cgx and cgy. + (Thanks to geoffb@ucs.ed.ac.uk - Geoff Browitt.) + + SUSAN Version 2i, 21/7/97: + Added information about corner attributes. + + SUSAN Version 2h, 16/12/96: + Added principle (initial enhancement) option. + + SUSAN Version 2g, 2/7/96: + Minor superficial changes to code. + + SUSAN Version 2f, 16/1/96: + Added GNUDOS option (now called FOPENB; see options below). + + SUSAN Version 2e, 9/1/96: + Added -b option. + Fixed 1 pixel horizontal offset error for drawing edges. + + SUSAN Version 2d, 27/11/95: + Fixed loading of certain PGM files in get_image (again!) + + SUSAN Version 2c, 22/11/95: + Fixed loading of certain PGM files in get_image. + (Thanks to qu@San-Jose.ate.slb.com - Gongyuan Qu.) + + SUSAN Version 2b, 9/11/95: + removed "z==" error in edges routines. + + SUSAN Version 2a, 6/11/95: + Removed a few unnecessary variable declarations. + Added different machine information. + Changed "header" in get_image to char. + + SUSAN Version 2, 1/11/95: first combined version able to take any + image sizes. + + SUSAN "Versions 1", circa 1992: the various SUSAN algorithms were + developed during my doctorate within different programs and for + fixed image sizes. The algorithms themselves are virtually unaltered + between "versions 1" and the combined program, version 2. + + \**********************************************************************/ + +#include "wcclibm.h" +#include "wccfile.h" +#include "wccmalloc.h" +#define EXP_A 184 +#define EXP_C 16249 + +float susan_expf( float y ) +{ + union { + float d; + struct { + #ifdef LITTLE_ENDIAN + short j, i; + #else + short i, j; + #endif + } n; + } eco; + eco.n.i = EXP_A * ( y ) + ( EXP_C ); + eco.n.j = 0; + return eco.d; +} + +float susan_sqrtf( float val ) +{ + float x = val / 10; + + float dx; + + float diff; + float min_tol = 0.00001f; + + int i, flag; + + + flag = 0; + if ( val == 0 ) x = 0; + else { + _Pragma( "loopbound min 19 max 19" ) + for ( i = 1; i < 20; i++ ) { + if ( !flag ) { + dx = ( val - ( x * x ) ) / ( 2.0f * x ); + x = x + dx; + diff = val - ( x * x ); + if ( fabs( diff ) <= min_tol ) flag = 1; + } + } + } + return ( x ); +} + +/* ********** Optional settings */ + +typedef int TOTAL_TYPE; + +#define SEVEN_SUPP /* size for non-max corner suppression; SEVEN_SUPP or FIVE_SUPP */ +#define MAX_CORNERS 15000 /* max corners per frame */ + +#define FTOI(a) ( (a) < 0 ? ((int)(a-0.5)) : ((int)(a+0.5)) ) +#define abs(a) ( (a) < 0 ? -a : a ) +typedef unsigned char uchar; +typedef struct { + int x, y, info, dx, dy, I; +} corner_rep; +typedef corner_rep CORNER_LIST[ MAX_CORNERS ]; + +extern char susan_input[ 7292 ]; +struct wccFILE susan_file; +float susan_dt; +int susan_bt; +int susan_principle_conf; +int susan_thin_post_proc; +int susan_three_by_three; +int susan_drawing_mode; +int susan_susan_quick; +int susan_max_no_corners; +int susan_max_no_edges; + +int susan_getint( struct wccFILE *fd ) +{ + int c, i; + char dummy[ 10000 ]; + + c = susan_wccfgetc( fd ); + _Pragma( "loopbound min 0 max 3" ) + while ( 1 ) { /* find next integer */ + if ( c == '#' ) /* if we're at a comment, read to end of line */ + susan_wccfgets( dummy, 9000, fd ); + if ( c == EOF ) { + /* "Image is not binary PGM." */ + } + if ( c >= '0' && c <= '9' ) + break; /* found what we were looking for */ + c = susan_wccfgetc( fd ); + } + + /* we're at the start of a number, continue until we hit a non-number */ + i = 0; + _Pragma( "loopbound min 1 max 2" ) + while ( 1 ) { + i = ( i * 10 ) + ( c - '0' ); + c = susan_wccfgetc( fd ); + if ( c == EOF ) return ( i ); + if ( c < '0' || c > '9' ) break; + } + + return ( i ); +} + + +void susan_get_image( struct wccFILE *fd, + unsigned char **in, int *x_size, int *y_size ) +{ + char header [ 100 ]; + + susan_wccfseek( fd, 0, WCCSEEK_SET ); + + /* {{{ read header */ + + header[ 0 ] = susan_wccfgetc( fd ); + header[ 1 ] = susan_wccfgetc( fd ); + if ( !( header[ 0 ] == 'P' && header[ 1 ] == '5' ) ) { + /* "Image does not have binary PGM header." */ + } + + *x_size = susan_getint( fd ); + *y_size = susan_getint( fd ); + // dummy read + susan_getint( fd ); + + /* }}} */ + + *in = ( uchar * ) susan_wccmalloc( *x_size * *y_size ); + + if ( susan_wccfread( *in, 1, *x_size * *y_size, fd ) == 0 ) { + /* "Image is wrong size.\n" */ + } +} + + +void susan_put_image( int x_size, int y_size ) +{ + int i; + _Pragma( "loopbound min 7220 max 7220" ) + for ( i = 0; i < x_size * y_size; i++ ) + ; +} + + +void susan_int_to_uchar( char *r, uchar *in, int size ) +{ + int i, max_r = r[ 0 ], min_r = r[ 0 ]; + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < size; i++ ) { + if ( r[ i ] > max_r ) + max_r = r[ i ]; + if ( r[ i ] < min_r ) + min_r = r[ i ]; + } + + if ( max_r == min_r ) { + /* Should not occur in TACLeBench. */ + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < size; i++ ) + in[ i ] = ( uchar )( 0 ); + + return; + } + max_r -= min_r; + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 0; i < size; i++ ) + in[ i ] = ( uchar )( ( int )( ( int )( r[ i ] - min_r ) * 255 ) / max_r ); +} + + +void susan_setup_brightness_lut( uchar **bp, int thresh, int form ) +{ + int k; + float temp; + + *bp = ( unsigned char * )susan_wccmalloc( 516 ); + *bp = *bp + 258; + + _Pragma( "loopbound min 513 max 513" ) + for ( k = -256; k < 257; k++ ) { + temp = ( ( float )k ) / ( ( float )thresh ); + temp = temp * temp; + if ( form == 6 ) + temp = temp * temp * temp; + temp = 100.0 * susan_expf( -temp ); + *( *bp + k ) = ( uchar )temp; + } +} + + +void susan_principle( uchar *in, char *r, uchar *bp, + int max_no, int x_size, int y_size ) +{ + int i, j, n; + uchar *p, *cp; + + susan_wccmemset( r, 0, x_size * y_size * sizeof( int ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 3; i < y_size - 3; i++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( j = 3; j < x_size - 3; j++ ) { + n = 100; + p = in + ( i - 3 ) * x_size + j - 1; + cp = bp + in[ i * x_size + j ]; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 3; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 5; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 6; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += 2; + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 6; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 5; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 3; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + + if ( n <= max_no ) + r[ i * x_size + j ] = max_no - n; + } + } +} + + +void susan_principle_small( uchar *in, char *r, uchar *bp, + int max_no, int x_size, int y_size ) +{ + int i, j, n; + uchar *p, *cp; + + susan_wccmemset( r, 0, x_size * y_size * sizeof( int ) ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i < y_size - 1; i++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( j = 1; j < x_size - 1; j++ ) { + n = 100; + p = in + ( i - 1 ) * x_size + j - 1; + cp = bp + in[ i * x_size + j ]; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 2; + + n += *( cp - *p ); + p += 2; + n += *( cp - *p ); + p += x_size - 2; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + + if ( n <= max_no ) + r[ i * x_size + j ] = max_no - n; + } + } +} + + +uchar susan_median( uchar *in, int i, int j, int x_size ) +{ + int p[ 8 ], k, l, tmp; + + p[ 0 ] = in[ ( i - 1 ) * x_size + j - 1 ]; + p[ 1 ] = in[ ( i - 1 ) * x_size + j ]; + p[ 2 ] = in[ ( i - 1 ) * x_size + j + 1 ]; + p[ 3 ] = in[ ( i ) * x_size + j - 1 ]; + p[ 4 ] = in[ ( i ) * x_size + j + 1 ]; + p[ 5 ] = in[ ( i + 1 ) * x_size + j - 1 ]; + p[ 6 ] = in[ ( i + 1 ) * x_size + j ]; + p[ 7 ] = in[ ( i + 1 ) * x_size + j + 1 ]; + + _Pragma( "loopbound min 0 max 0" ) + for ( k = 0; k < 7; k++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( l = 0; l < ( 7 - k ); l++ ) { + if ( p[ l ] > p[ l + 1 ] ) { + tmp = p[ l ]; + p[ l ] = p[ l + 1 ]; + p[ l + 1 ] = tmp; + } + } + } + + return ( ( p[ 3 ] + p[ 4 ] ) / 2 ); +} + + +/* this enlarges "in" so that borders can be dealt with easily */ +void susan_enlarge( uchar **in, uchar *tmp_image, + int *x_size, int *y_size, int border ) +{ + int i, j; + + _Pragma( "loopbound min 95 max 95" ) + for ( i = 0; i < *y_size; i++ ) { /* copy *in into tmp_image */ + susan_wccmemcpy( tmp_image + ( i + border ) * ( *x_size + 2 * border ) + border, + *in + i * *x_size, *x_size ); + } + + _Pragma( "loopbound min 7 max 7" ) + for ( i = 0; i < border; + i++ ) { /* copy top and bottom rows; invert as many as necessary */ + susan_wccmemcpy( tmp_image + ( border - 1 - i ) * ( *x_size + 2 * border ) + + border, + *in + i * *x_size, *x_size ); + susan_wccmemcpy( tmp_image + ( *y_size + border + i ) * + ( *x_size + 2 * border ) + border, + *in + ( *y_size - i - 1 ) * *x_size, *x_size ); + } + + _Pragma( "loopbound min 7 max 7" ) + for ( i = 0; i < border; i++ ) { /* copy left and right columns */ + _Pragma( "loopbound min 109 max 109" ) + for ( j = 0; j < *y_size + 2 * border; j++ ) { + tmp_image[ j * ( *x_size + 2 * border ) + border - 1 - i ] = tmp_image[ j * + ( *x_size + 2 * border ) + border + i ]; + tmp_image[ j * ( *x_size + 2 * border ) + *x_size + border + i ] = tmp_image[ j * + ( *x_size + 2 * border ) + *x_size + border - 1 - i ]; + } + } + + *x_size += 2 * border; /* alter image size */ + *y_size += 2 * border; + *in = tmp_image; /* repoint in */ +} + + +void susan_smoothing( int three_by_three, uchar *in, float dt, + int x_size, int y_size, uchar *bp ) +{ + float temp; + int n_max, increment, mask_size, + i, j, x, y, area, brightness, tmp, centre; + uchar *ip, *dp, *dpt, *cp, *out = in, + *tmp_image; + TOTAL_TYPE total; + + /* {{{ setup larger image and border sizes */ + + if ( three_by_three == 0 ) + mask_size = ( ( int )( 1.5 * dt ) ) + 1; + else + mask_size = 1; + + if ( dt > 15 ) { + /* "Distance_thresh too big for integer arithmetic." */ + // Either reduce it to <=15 or recompile with variable "total" + // as a float: see top "defines" section. + } + + if ( ( 2 * mask_size + 1 > x_size ) || ( 2 * mask_size + 1 > y_size ) ) { + /* "Mask size too big for image." */ + } + + tmp_image = ( uchar * )susan_wccmalloc( ( x_size + mask_size * 2 ) * + ( y_size + mask_size * 2 ) ); + susan_enlarge( &in, tmp_image, &x_size, &y_size, mask_size ); + if ( three_by_three == 0 ) { + /* large Gaussian masks */ + /* {{{ setup distance lut */ + + n_max = ( mask_size * 2 ) + 1; + + increment = x_size - n_max; + + dp = ( unsigned char * )susan_wccmalloc( n_max * n_max ); + dpt = dp; + temp = -( dt * dt ); + + _Pragma( "loopbound min 15 max 15" ) + for ( i = -mask_size; i <= mask_size; i++ ) { + _Pragma( "loopbound min 15 max 15" ) + for ( j = -mask_size; j <= mask_size; j++ ) { + x = ( int ) ( 100.0 * susan_expf( ( ( float )( ( i * i ) + + ( j * j ) ) ) / temp ) ); + *dpt++ = ( unsigned char )x; + } + } + + /* {{{ main section */ + _Pragma( "loopbound min 95 max 95" ) + for ( i = mask_size; i < y_size - mask_size; i++ ) { + _Pragma( "loopbound min 76 max 76" ) + for ( j = mask_size; j < x_size - mask_size; j++ ) { + area = 0; + total = 0; + dpt = dp; + ip = in + ( ( i - mask_size ) * x_size ) + j - mask_size; + centre = in[ i * x_size + j ]; + cp = bp + centre; + _Pragma( "loopbound min 15 max 15" ) + for ( y = -mask_size; y <= mask_size; y++ ) { + _Pragma( "loopbound min 15 max 15" ) + for ( x = -mask_size; x <= mask_size; x++ ) { + brightness = *ip++; + tmp = *dpt++ * *( cp - brightness ); + area += tmp; + total += tmp * brightness; + } + ip += increment; + } + tmp = area - 10000; + if ( tmp == 0 ) + *out++ = susan_median( in, i, j, x_size ); + else + *out++ = ( ( total - ( centre * 10000 ) ) / tmp ); + } + } + } else { + /* 3x3 constant mask */ + + /* {{{ main section */ + _Pragma( "loopbound min 15 max 15" ) //neue Änderung min max 107 + for ( i = 1; i < y_size - 1; i++ ) { + _Pragma( "loopbound min 15 max 15" ) //neue Änderung min max 88 + for ( j = 1; j < x_size - 1; j++ ) { + area = 0; + total = 0; + ip = in + ( ( i - 1 ) * x_size ) + j - 1; + centre = in[ i * x_size + j ]; + cp = bp + centre; + + brightness = *ip++; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + ip += x_size - 2; + brightness = *ip++; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + ip += x_size - 2; + brightness = *ip++; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + brightness = *ip++; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + brightness = *ip; + tmp = *( cp - brightness ); + area += tmp; + total += tmp * brightness; + + tmp = area - 100; + if ( tmp == 0 ) + *out++ = susan_median( in, i, j, x_size ); + else + *out++ = ( total - ( centre * 100 ) ) / tmp; + } + } + } +} + + +void susan_edge_draw( uchar *in, uchar *mid, + int x_size, int y_size, int drawing_mode ) +{ + int i; + uchar *inp, *midp; + + if ( drawing_mode == 0 ) { + /* mark 3x3 white block around each edge point */ + midp = mid; + _Pragma( "loopbound min 7220 max 7220" ) + for ( i = 0; i < x_size * y_size; i++ ) { + if ( *midp < 8 ) { + inp = in + ( midp - mid ) - x_size - 1; + *inp++ = 255; + *inp++ = 255; + *inp = 255; + inp += x_size - 2; + *inp++ = 255; + inp++; + *inp = 255; + inp += x_size - 2; + *inp++ = 255; + *inp++ = 255; + *inp = 255; + } + midp++; + } + } + + /* now mark 1 black pixel at each edge point */ + midp = mid; + _Pragma( "loopbound min 7220 max 7220" ) + for ( i = 0; i < x_size * y_size; i++ ) { + if ( *midp < 8 ) + *( in + ( midp - mid ) ) = 0; + midp++; + } +} + + +void susan_thin( char *r, uchar *mid, int x_size, int y_size ) +{ + int l[ 9 ], centre, + b01, b12, b21, b10, + p1, p2, p3, p4, + b00, b02, b20, b22, + m, n, a, b, x, y, i, j; + uchar *mp; + + _Pragma( "loopbound min 87 max 87" ) + for ( i = 4; i < y_size - 4; i++ ) { + _Pragma( "loopbound min 68 max 68" ) + for ( j = 4; j < x_size - 4; j++ ) { + if ( mid[ i * x_size + j ] < 8 ) { + centre = r[ i * x_size + j ]; + /* {{{ count number of neighbours */ + + mp = mid + ( i - 1 ) * x_size + j - 1; + + n = ( *mp < 8 ) + + ( *( mp + 1 ) < 8 ) + + ( *( mp + 2 ) < 8 ) + + ( *( mp + x_size ) < 8 ) + + ( *( mp + x_size + 2 ) < 8 ) + + ( *( mp + x_size + x_size ) < 8 ) + + ( *( mp + x_size + x_size + 1 ) < 8 ) + + ( *( mp + x_size + x_size + 2 ) < 8 ); + + /* {{{ n==0 no neighbours - remove point */ + + if ( n == 0 ) + mid[ i * x_size + j ] = 100; + + /* {{{ n==1 - extend line if I can */ + + /* extension is only allowed a few times - the value of mid is used to control this */ + + if ( ( n == 1 ) && ( mid[ i * x_size + j ] < 6 ) ) { + /* find maximum neighbour weighted in direction opposite the + neighbour already present. e.g. + have: O O O weight r by 0 2 3 + X X O 0 0 4 + O O O 0 2 3 */ + + l[ 0 ] = r[ ( i - 1 ) * x_size + j - 1 ]; + l[ 1 ] = r[ ( i - 1 ) * x_size + j ]; + l[ 2 ] = r[ ( i - 1 ) * x_size + j + 1 ]; + l[ 3 ] = r[ ( i ) * x_size + j - 1 ]; + l[ 4 ] = 0; + l[ 5 ] = r[ ( i ) * x_size + j + 1 ]; + l[ 6 ] = r[ ( i + 1 ) * x_size + j - 1 ]; + l[ 7 ] = r[ ( i + 1 ) * x_size + j ]; + l[ 8 ] = r[ ( i + 1 ) * x_size + j + 1 ]; + + if ( mid[ ( i - 1 )*x_size + j - 1 ] < 8 ) { + l[ 0 ] = 0; + l[ 1 ] = 0; + l[ 3 ] = 0; + l[ 2 ] *= 2; + l[ 6 ] *= 2; + l[ 5 ] *= 3; + l[ 7 ] *= 3; + l[ 8 ] *= 4; + } else { + if ( mid[ ( i - 1 )*x_size + j ] < 8 ) { + l[ 1 ] = 0; + l[ 0 ] = 0; + l[ 2 ] = 0; + l[ 3 ] *= 2; + l[ 5 ] *= 2; + l[ 6 ] *= 3; + l[ 8 ] *= 3; + l[ 7 ] *= 4; + } else { + if ( mid[ ( i - 1 )*x_size + j + 1 ] < 8 ) { + l[ 2 ] = 0; + l[ 1 ] = 0; + l[ 5 ] = 0; + l[ 0 ] *= 2; + l[ 8 ] *= 2; + l[ 3 ] *= 3; + l[ 7 ] *= 3; + l[ 6 ] *= 4; + } else { + if ( mid[ ( i )*x_size + j - 1 ] < 8 ) { + l[ 3 ] = 0; + l[ 0 ] = 0; + l[ 6 ] = 0; + l[ 1 ] *= 2; + l[ 7 ] *= 2; + l[ 2 ] *= 3; + l[ 8 ] *= 3; + l[ 5 ] *= 4; + } else { + if ( mid[ ( i )*x_size + j + 1 ] < 8 ) { + l[ 5 ] = 0; + l[ 2 ] = 0; + l[ 8 ] = 0; + l[ 1 ] *= 2; + l[ 7 ] *= 2; + l[ 0 ] *= 3; + l[ 6 ] *= 3; + l[ 3 ] *= 4; + } else { + if ( mid[ ( i + 1 )*x_size + j - 1 ] < 8 ) { + l[ 6 ] = 0; + l[ 3 ] = 0; + l[ 7 ] = 0; + l[ 0 ] *= 2; + l[ 8 ] *= 2; + l[ 1 ] *= 3; + l[ 5 ] *= 3; + l[ 2 ] *= 4; + } else { + if ( mid[ ( i + 1 )*x_size + j ] < 8 ) { + l[ 7 ] = 0; + l[ 6 ] = 0; + l[ 8 ] = 0; + l[ 3 ] *= 2; + l[ 5 ] *= 2; + l[ 0 ] *= 3; + l[ 2 ] *= 3; + l[ 1 ] *= 4; + } else { + if ( mid[ ( i + 1 )*x_size + j + 1 ] < 8 ) { + l[ 8 ] = 0; + l[ 5 ] = 0; + l[ 7 ] = 0; + l[ 6 ] *= 2; + l[ 2 ] *= 2; + l[ 1 ] *= 3; + l[ 3 ] *= 3; + l[ 0 ] *= 4; + } + } + } + } + } + } + } + } + + m = 0; /* find the highest point */ + _Pragma( "loopbound min 3 max 3" ) + for ( y = 0; y < 3; y++ ) + _Pragma( "loopbound min 3 max 3" ) + for ( x = 0; x < 3; x++ ) + if ( l[ y + y + y + x ] > m ) { + m = l[ y + y + y + x ]; + a = y; + b = x; + } + + if ( m > 0 ) { + if ( mid[ i * x_size + j ] < 4 ) + mid[ ( i + a - 1 )*x_size + j + b - 1 ] = 4; + else + mid[ ( i + a - 1 )*x_size + j + b - 1 ] = mid[ i * x_size + j ] + 1; + if ( ( a + a + b ) < 3 ) { /* need to jump back in image */ + i += a - 1; + j += b - 2; + if ( i < 4 ) i = 4; + if ( j < 4 ) j = 4; + } + } + } + + /* {{{ n==2 */ + + if ( n == 2 ) { + /* put in a bit here to straighten edges */ + b00 = mid[ ( i - 1 ) * x_size + j - 1 ] < 8; /* corners of 3x3 */ + b02 = mid[ ( i - 1 ) * x_size + j + 1 ] < 8; + b20 = mid[ ( i + 1 ) * x_size + j - 1 ] < 8; + b22 = mid[ ( i + 1 ) * x_size + j + 1 ] < 8; + if ( ( ( b00 + b02 + b20 + b22 ) == 2 ) && ( ( b00 | b22 ) & ( b02 | b20 ) ) ) { + /* case: move a point back into line. + e.g. X O X CAN become X X X + O X O O O O + O O O O O O */ + if ( b00 ) { + if ( b02 ) { + x = 0; + y = -1; + } else { + x = -1; + y = 0; + } + } else { + if ( b02 ) { + x = 1; + y = 0; + } else { + x = 0; + y = 1; + } + } + if ( ( ( float )r[ ( i + y )*x_size + j + x ] / ( float )centre ) > 0.7 ) { + if ( ( ( x == 0 ) && ( mid[ ( i + ( 2 * y ) )*x_size + j ] > 7 ) && + ( mid[ ( i + ( 2 * y ) )*x_size + j - 1 ] > 7 ) && + ( mid[ ( i + ( 2 * y ) )*x_size + j + 1 ] > 7 ) ) || + ( ( y == 0 ) && ( mid[ ( i )*x_size + j + ( 2 * x ) ] > 7 ) && + ( mid[ ( i + 1 )*x_size + j + ( 2 * x ) ] > 7 ) && + ( mid[ ( i - 1 )*x_size + j + ( 2 * x ) ] > 7 ) ) ) { + mid[ ( i )*x_size + j ] = 100; + mid[ ( i + y )*x_size + j + x ] = 3; /* no jumping needed */ + } + } + } else { + b01 = mid[ ( i - 1 ) * x_size + j ] < 8; + b12 = mid[ ( i ) * x_size + j + 1 ] < 8; + b21 = mid[ ( i + 1 ) * x_size + j ] < 8; + b10 = mid[ ( i ) * x_size + j - 1 ] < 8; + /* {{{ right angle ends - not currently used */ + + #ifdef IGNORETHIS + if ( ( b00 & b01 ) | ( b00 & b10 ) | ( b02 & b01 ) | ( b02 & b12 ) | + ( b20 & b10 ) | ( b20 & b21 ) | ( b22 & b21 ) | ( b22 & b12 ) ) { + /* case; right angle ends. clean up. + e.g.; X X O CAN become X X O + O X O O O O + O O O O O O */ + if ( ( ( b01 ) & ( mid[ ( i - 2 )*x_size + j - 1 ] > 7 ) & + ( mid[ ( i - 2 )*x_size + j ] > 7 ) & ( mid[ ( i - 2 )*x_size + j + 1 ] > 7 )& + ( ( b00 & ( ( 2 * r[ ( i - 1 )*x_size + j + 1 ] ) > centre ) ) | ( b02 & ( ( + 2 * r[ ( i - 1 )*x_size + j - 1 ] ) > centre ) ) ) ) | + ( ( b10 ) & ( mid[ ( i - 1 )*x_size + j - 2 ] > 7 ) & ( mid[ ( i )*x_size + j - 2 ] + > 7 ) & ( mid[ ( i + 1 )*x_size + j - 2 ] > 7 )& + ( ( b00 & ( ( 2 * r[ ( i + 1 )*x_size + j - 1 ] ) > centre ) ) | ( b20 & ( ( + 2 * r[ ( i - 1 )*x_size + j - 1 ] ) > centre ) ) ) ) | + ( ( b12 ) & ( mid[ ( i - 1 )*x_size + j + 2 ] > 7 ) & ( mid[ ( i )*x_size + j + 2 ] + > 7 ) & ( mid[ ( i + 1 )*x_size + j + 2 ] > 7 )& + ( ( b02 & ( ( 2 * r[ ( i + 1 )*x_size + j + 1 ] ) > centre ) ) | ( b22 & ( ( + 2 * r[ ( i - 1 )*x_size + j + 1 ] ) > centre ) ) ) ) | + ( ( b21 ) & ( mid[ ( i + 2 )*x_size + j - 1 ] > 7 ) & ( mid[ ( i + 2 )*x_size + j ] + > 7 ) & ( mid[ ( i + 2 )*x_size + j + 1 ] > 7 )& + ( ( b20 & ( ( 2 * r[ ( i + 1 )*x_size + j + 1 ] ) > centre ) ) | ( b22 & ( ( + 2 * r[ ( i + 1 )*x_size + j - 1 ] ) > centre ) ) ) ) ) { + mid[ ( i )*x_size + j ] = 100; + if ( b10 & b20 ) j -= 2; + if ( b00 | b01 | b02 ) { + i--; + j -= 2; + } + } + } + #endif + + if ( ( ( b01 + b12 + b21 + b10 ) == 2 ) && ( ( b10 | b12 ) & ( b01 | b21 ) ) && + ( ( b01 & ( ( mid[ ( i - 2 )*x_size + j - 1 ] < 8 ) | ( mid[ ( i - 2 )*x_size + j + + 1 ] < 8 ) ) ) | ( b10 & ( ( mid[ ( i - 1 )*x_size + j - 2 ] < 8 ) | + ( mid[ ( i + 1 )*x_size + j - 2 ] < 8 ) ) ) | + ( b12 & ( ( mid[ ( i - 1 )*x_size + j + 2 ] < 8 ) | ( mid[ ( i + 1 )*x_size + j + + 2 ] < 8 ) ) ) | ( b21 & ( ( mid[ ( i + 2 )*x_size + j - 1 ] < 8 ) | + ( mid[ ( i + 2 )*x_size + j + 1 ] < 8 ) ) ) ) ) { + /* case; clears odd right angles. + e.g.; O O O becomes O O O + X X O X O O + O X O O X O */ + mid[ ( i )*x_size + j ] = 100; + i--; /* jump back */ + j -= 2; + if ( i < 4 ) i = 4; + if ( j < 4 ) j = 4; + } + } + } + + /* {{{ n>2 the thinning is done here without breaking connectivity */ + + if ( n > 2 ) { + b01 = mid[ ( i - 1 ) * x_size + j ] < 8; + b12 = mid[ ( i ) * x_size + j + 1 ] < 8; + b21 = mid[ ( i + 1 ) * x_size + j ] < 8; + b10 = mid[ ( i ) * x_size + j - 1 ] < 8; + if ( ( b01 + b12 + b21 + b10 ) > 1 ) { + b00 = mid[ ( i - 1 ) * x_size + j - 1 ] < 8; + b02 = mid[ ( i - 1 ) * x_size + j + 1 ] < 8; + b20 = mid[ ( i + 1 ) * x_size + j - 1 ] < 8; + b22 = mid[ ( i + 1 ) * x_size + j + 1 ] < 8; + p1 = b00 | b01; + p2 = b02 | b12; + p3 = b22 | b21; + p4 = b20 | b10; + + if ( ( ( p1 + p2 + p3 + p4 ) - ( ( b01 & p2 ) + ( b12 & p3 ) + ( b21 & p4 ) + + ( b10 & p1 ) ) ) < 2 ) { + mid[ ( i )*x_size + j ] = 100; + i--; + j -= 2; + if ( i < 4 ) i = 4; + if ( j < 4 ) j = 4; + } + } + } + } + } + } +} + + +void susan_edges( uchar *in, char *r, uchar *mid, uchar *bp, + int max_no, int x_size, int y_size ) +{ + float z; + int do_symmetry, i, j, m, n, a, b, x, y, w; + uchar c, *p, *cp; + + susan_wccmemset( r, 0, x_size * y_size ); + + _Pragma( "loopbound min 89 max 89" ) + for ( i = 3; i < y_size - 3; i++ ) { + _Pragma( "loopbound min 70 max 70" ) + for ( j = 3; j < x_size - 3; j++ ) { + n = 100; + p = in + ( i - 3 ) * x_size + j - 1; + cp = bp + in[ i * x_size + j ]; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 3; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 5; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 6; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += 2; + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 6; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 5; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 3; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + + if ( n <= max_no ) + r[ i * x_size + j ] = max_no - n; + } + } + + _Pragma( "loopbound min 87 max 87" ) + for ( i = 4; i < y_size - 4; i++ ) { + _Pragma( "loopbound min 68 max 68" ) + for ( j = 4; j < x_size - 4; j++ ) { + if ( r[ i * x_size + j ] > 0 ) { + m = r[ i * x_size + j ]; + n = max_no - m; + cp = bp + in[ i * x_size + j ]; + + if ( n > 600 ) { + p = in + ( i - 3 ) * x_size + j - 1; + x = 0; + y = 0; + + c = *( cp - *p++ ); + x -= c; + y -= 3 * c; + c = *( cp - *p++ ); + y -= 3 * c; + c = *( cp - *p ); + x += c; + y -= 3 * c; + p += x_size - 3; + + c = *( cp - *p++ ); + x -= 2 * c; + y -= 2 * c; + c = *( cp - *p++ ); + x -= c; + y -= 2 * c; + c = *( cp - *p++ ); + y -= 2 * c; + c = *( cp - *p++ ); + x += c; + y -= 2 * c; + c = *( cp - *p ); + x += 2 * c; + y -= 2 * c; + p += x_size - 5; + + c = *( cp - *p++ ); + x -= 3 * c; + y -= c; + c = *( cp - *p++ ); + x -= 2 * c; + y -= c; + c = *( cp - *p++ ); + x -= c; + y -= c; + c = *( cp - *p++ ); + y -= c; + c = *( cp - *p++ ); + x += c; + y -= c; + c = *( cp - *p++ ); + x += 2 * c; + y -= c; + c = *( cp - *p ); + x += 3 * c; + y -= c; + p += x_size - 6; + + c = *( cp - *p++ ); + x -= 3 * c; + c = *( cp - *p++ ); + x -= 2 * c; + c = *( cp - *p ); + x -= c; + p += 2; + c = *( cp - *p++ ); + x += c; + c = *( cp - *p++ ); + x += 2 * c; + c = *( cp - *p ); + x += 3 * c; + p += x_size - 6; + + c = *( cp - *p++ ); + x -= 3 * c; + y += c; + c = *( cp - *p++ ); + x -= 2 * c; + y += c; + c = *( cp - *p++ ); + x -= c; + y += c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p++ ); + x += c; + y += c; + c = *( cp - *p++ ); + x += 2 * c; + y += c; + c = *( cp - *p ); + x += 3 * c; + y += c; + p += x_size - 5; + + c = *( cp - *p++ ); + x -= 2 * c; + y += 2 * c; + c = *( cp - *p++ ); + x -= c; + y += 2 * c; + c = *( cp - *p++ ); + y += 2 * c; + c = *( cp - *p++ ); + x += c; + y += 2 * c; + c = *( cp - *p ); + x += 2 * c; + y += 2 * c; + p += x_size - 3; + + c = *( cp - *p++ ); + x -= c; + y += 3 * c; + c = *( cp - *p++ ); + y += 3 * c; + c = *( cp - *p ); + x += c; + y += 3 * c; + + z = susan_sqrtf( ( float )( ( x * x ) + ( y * y ) ) ); + if ( z > ( 0.9 * ( float )n ) ) { /* 0.5 */ + do_symmetry = 0; + if ( x == 0 ) + z = 1000000.0; + else + z = ( ( float )y ) / ( ( float )x ); + if ( z < 0 ) { + z = -z; + w = -1; + } else w = 1; + if ( z < 0.5 ) { + /* vert_edge */ a = 0; + b = 1; + } else { + if ( z > 2.0 ) { + /* hor_edge */ a = 1; + b = 0; + } else { + /* diag_edge */ if ( w > 0 ) { + a = 1; + b = 1; + } else { + a = -1; + b = 1; + } + } + } + if ( ( m > r[ ( i + a )*x_size + j + b ] ) && + ( m >= r[ ( i - a )*x_size + j - b ] ) && + ( m > r[ ( i + ( 2 * a ) )*x_size + j + ( 2 * b ) ] ) && + ( m >= r[ ( i - ( 2 * a ) )*x_size + j - ( 2 * b ) ] ) ) + mid[ i * x_size + j ] = 1; + } else + do_symmetry = 1; + } else + do_symmetry = 1; + + if ( do_symmetry == 1 ) { + p = in + ( i - 3 ) * x_size + j - 1; + x = 0; + y = 0; + w = 0; + + /* | \ + y -x- w + | \ */ + + c = *( cp - *p++ ); + x += c; + y += 9 * c; + w += 3 * c; + c = *( cp - *p++ ); + y += 9 * c; + c = *( cp - *p ); + x += c; + y += 9 * c; + w -= 3 * c; + p += x_size - 3; + + c = *( cp - *p++ ); + x += 4 * c; + y += 4 * c; + w += 4 * c; + c = *( cp - *p++ ); + x += c; + y += 4 * c; + w += 2 * c; + c = *( cp - *p++ ); + y += 4 * c; + c = *( cp - *p++ ); + x += c; + y += 4 * c; + w -= 2 * c; + c = *( cp - *p ); + x += 4 * c; + y += 4 * c; + w -= 4 * c; + p += x_size - 5; + + c = *( cp - *p++ ); + x += 9 * c; + y += c; + w += 3 * c; + c = *( cp - *p++ ); + x += 4 * c; + y += c; + w += 2 * c; + c = *( cp - *p++ ); + x += c; + y += c; + w += c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p++ ); + x += c; + y += c; + w -= c; + c = *( cp - *p++ ); + x += 4 * c; + y += c; + w -= 2 * c; + c = *( cp - *p ); + x += 9 * c; + y += c; + w -= 3 * c; + p += x_size - 6; + + c = *( cp - *p++ ); + x += 9 * c; + c = *( cp - *p++ ); + x += 4 * c; + c = *( cp - *p ); + x += c; + p += 2; + c = *( cp - *p++ ); + x += c; + c = *( cp - *p++ ); + x += 4 * c; + c = *( cp - *p ); + x += 9 * c; + p += x_size - 6; + + c = *( cp - *p++ ); + x += 9 * c; + y += c; + w -= 3 * c; + c = *( cp - *p++ ); + x += 4 * c; + y += c; + w -= 2 * c; + c = *( cp - *p++ ); + x += c; + y += c; + w -= c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p++ ); + x += c; + y += c; + w += c; + c = *( cp - *p++ ); + x += 4 * c; + y += c; + w += 2 * c; + c = *( cp - *p ); + x += 9 * c; + y += c; + w += 3 * c; + p += x_size - 5; + + c = *( cp - *p++ ); + x += 4 * c; + y += 4 * c; + w -= 4 * c; + c = *( cp - *p++ ); + x += c; + y += 4 * c; + w -= 2 * c; + c = *( cp - *p++ ); + y += 4 * c; + c = *( cp - *p++ ); + x += c; + y += 4 * c; + w += 2 * c; + c = *( cp - *p ); + x += 4 * c; + y += 4 * c; + w += 4 * c; + p += x_size - 3; + + c = *( cp - *p++ ); + x += c; + y += 9 * c; + w -= 3 * c; + c = *( cp - *p++ ); + y += 9 * c; + c = *( cp - *p ); + x += c; + y += 9 * c; + w += 3 * c; + + if ( y == 0 ) + z = 1000000.0; + else + z = ( ( float )x ) / ( ( float )y ); + if ( z < 0.5 ) { + /* vertical */ a = 0; + b = 1; + } else { + if ( z > 2.0 ) { + /* horizontal */ a = 1; + b = 0; + } else { + /* diagonal */ if ( w > 0 ) { + a = -1; + b = 1; + } else { + a = 1; + b = 1; + } + } + } + if ( ( m > r[ ( i + a )*x_size + j + b ] ) && + ( m >= r[ ( i - a )*x_size + j - b ] ) && + ( m > r[ ( i + ( 2 * a ) )*x_size + j + ( 2 * b ) ] ) && + ( m >= r[ ( i - ( 2 * a ) )*x_size + j - ( 2 * b ) ] ) ) + mid[ i * x_size + j ] = 2; + } + } + } + } +} + + +void susan_edges_small( uchar *in, char *r, uchar *mid, uchar *bp, + int max_no, int x_size, int y_size ) +{ + float z; + int do_symmetry, i, j, m, n, a, b, x, y, w; + uchar c, *p, *cp; + + susan_wccmemset( r, 0, x_size * y_size ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 1; i < y_size - 1; i++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( j = 1; j < x_size - 1; j++ ) { + n = 100; + p = in + ( i - 1 ) * x_size + j - 1; + cp = bp + in[ i * x_size + j ]; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 2; + + n += *( cp - *p ); + p += 2; + n += *( cp - *p ); + p += x_size - 2; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + + if ( n <= max_no ) + r[ i * x_size + j ] = max_no - n; + } + } + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 2; i < y_size - 2; i++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( j = 2; j < x_size - 2; j++ ) { + if ( r[ i * x_size + j ] > 0 ) { + m = r[ i * x_size + j ]; + n = max_no - m; + cp = bp + in[ i * x_size + j ]; + + if ( n > 250 ) { + p = in + ( i - 1 ) * x_size + j - 1; + x = 0; + y = 0; + + c = *( cp - *p++ ); + x -= c; + y -= c; + c = *( cp - *p++ ); + y -= c; + c = *( cp - *p ); + x += c; + y -= c; + p += x_size - 2; + + c = *( cp - *p ); + x -= c; + p += 2; + c = *( cp - *p ); + x += c; + p += x_size - 2; + + c = *( cp - *p++ ); + x -= c; + y += c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p ); + x += c; + y += c; + + z = susan_sqrtf( ( float )( ( x * x ) + ( y * y ) ) ); + if ( z > ( 0.4 * ( float )n ) ) { /* 0.6 */ + do_symmetry = 0; + if ( x == 0 ) + z = 1000000.0; + else + z = ( ( float )y ) / ( ( float )x ); + if ( z < 0 ) { + z = -z; + w = -1; + } else w = 1; + if ( z < 0.5 ) { + /* vert_edge */ a = 0; + b = 1; + } else { + if ( z > 2.0 ) { + /* hor_edge */ a = 1; + b = 0; + } else { + /* diag_edge */ if ( w > 0 ) { + a = 1; + b = 1; + } else { + a = -1; + b = 1; + } + } + } + if ( ( m > r[ ( i + a )*x_size + j + b ] ) && + ( m >= r[ ( i - a )*x_size + j - b ] ) ) + mid[ i * x_size + j ] = 1; + } else + do_symmetry = 1; + } else + do_symmetry = 1; + + if ( do_symmetry == 1 ) { + p = in + ( i - 1 ) * x_size + j - 1; + x = 0; + y = 0; + w = 0; + + /* | \ + y -x- w + | \ */ + + c = *( cp - *p++ ); + x += c; + y += c; + w += c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p ); + x += c; + y += c; + w -= c; + p += x_size - 2; + + c = *( cp - *p ); + x += c; + p += 2; + c = *( cp - *p ); + x += c; + p += x_size - 2; + + c = *( cp - *p++ ); + x += c; + y += c; + w -= c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p ); + x += c; + y += c; + w += c; + + if ( y == 0 ) + z = 1000000.0; + else + z = ( ( float )x ) / ( ( float )y ); + if ( z < 0.5 ) { + /* vertical */ a = 0; + b = 1; + } else { + if ( z > 2.0 ) { + /* horizontal */ a = 1; + b = 0; + } else { + /* diagonal */ if ( w > 0 ) { + a = -1; + b = 1; + } else { + a = 1; + b = 1; + } + } + } + if ( ( m > r[ ( i + a )*x_size + j + b ] ) && + ( m >= r[ ( i - a )*x_size + j - b ] ) ) + mid[ i * x_size + j ] = 2; + } + } + } + } +} + + +void susan_corner_draw( uchar *in, CORNER_LIST corner_list, + int x_size, int drawing_mode ) +{ + uchar *p; + int n = 0; + + _Pragma( "loopbound min 0 max 0" ) + while ( corner_list[ n ].info != 7 ) { + if ( drawing_mode == 0 ) { + p = in + ( corner_list[ n ].y - 1 ) * x_size + corner_list[ n ].x - 1; + *p++ = 255; + *p++ = 255; + *p = 255; + p += x_size - 2; + *p++ = 255; + *p++ = 0; + *p = 255; + p += x_size - 2; + *p++ = 255; + *p++ = 255; + *p = 255; + n++; + } else { + p = in + corner_list[ n ].y * x_size + corner_list[ n ].x; + *p = 0; + n++; + } + } +} + + +void susan_corners( uchar *in, char *r, uchar *bp, + int max_no, CORNER_LIST corner_list, int x_size, int y_size ) +{ + int n, x, y, sq, xx, yy, + i, j; + float divide; + uchar c, *p, *cp; + char *cgx, *cgy; + + susan_wccmemset( r, 0, x_size * y_size ); + + cgx = ( char * )susan_wccmalloc( x_size * y_size ); + cgy = ( char * )susan_wccmalloc( x_size * y_size ); + + _Pragma( "loopbound min 85 max 85" ) + for ( i = 5; i < y_size - 5; i++ ) { + _Pragma( "loopbound min 66 max 66" ) + for ( j = 5; j < x_size - 5; j++ ) { + n = 100; + p = in + ( i - 3 ) * x_size + j - 1; + cp = bp + in[ i * x_size + j ]; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 3; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 5; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 6; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + if ( n < max_no ) { /* do this test early and often ONLY to save wasted computation */ + p += 2; + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + if ( n < max_no ) { + p += x_size - 6; + + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + if ( n < max_no ) { + p += x_size - 5; + + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + if ( n < max_no ) { + p += x_size - 3; + + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + + if ( n < max_no ) { + x = 0; + y = 0; + p = in + ( i - 3 ) * x_size + j - 1; + + c = *( cp - *p++ ); + x -= c; + y -= 3 * c; + c = *( cp - *p++ ); + y -= 3 * c; + c = *( cp - *p ); + x += c; + y -= 3 * c; + p += x_size - 3; + + c = *( cp - *p++ ); + x -= 2 * c; + y -= 2 * c; + c = *( cp - *p++ ); + x -= c; + y -= 2 * c; + c = *( cp - *p++ ); + y -= 2 * c; + c = *( cp - *p++ ); + x += c; + y -= 2 * c; + c = *( cp - *p ); + x += 2 * c; + y -= 2 * c; + p += x_size - 5; + + c = *( cp - *p++ ); + x -= 3 * c; + y -= c; + c = *( cp - *p++ ); + x -= 2 * c; + y -= c; + c = *( cp - *p++ ); + x -= c; + y -= c; + c = *( cp - *p++ ); + y -= c; + c = *( cp - *p++ ); + x += c; + y -= c; + c = *( cp - *p++ ); + x += 2 * c; + y -= c; + c = *( cp - *p ); + x += 3 * c; + y -= c; + p += x_size - 6; + + c = *( cp - *p++ ); + x -= 3 * c; + c = *( cp - *p++ ); + x -= 2 * c; + c = *( cp - *p ); + x -= c; + p += 2; + c = *( cp - *p++ ); + x += c; + c = *( cp - *p++ ); + x += 2 * c; + c = *( cp - *p ); + x += 3 * c; + p += x_size - 6; + + c = *( cp - *p++ ); + x -= 3 * c; + y += c; + c = *( cp - *p++ ); + x -= 2 * c; + y += c; + c = *( cp - *p++ ); + x -= c; + y += c; + c = *( cp - *p++ ); + y += c; + c = *( cp - *p++ ); + x += c; + y += c; + c = *( cp - *p++ ); + x += 2 * c; + y += c; + c = *( cp - *p ); + x += 3 * c; + y += c; + p += x_size - 5; + + c = *( cp - *p++ ); + x -= 2 * c; + y += 2 * c; + c = *( cp - *p++ ); + x -= c; + y += 2 * c; + c = *( cp - *p++ ); + y += 2 * c; + c = *( cp - *p++ ); + x += c; + y += 2 * c; + c = *( cp - *p ); + x += 2 * c; + y += 2 * c; + p += x_size - 3; + + c = *( cp - *p++ ); + x -= c; + y += 3 * c; + c = *( cp - *p++ ); + y += 3 * c; + c = *( cp - *p ); + x += c; + y += 3 * c; + + xx = x * x; + yy = y * y; + sq = xx + yy; + if ( sq > ( ( n * n ) / 2 ) ) { + if ( yy < xx ) { + divide = ( float )y / ( float )abs( x ); + sq = abs( x ) / x; + sq = *( cp - in[ ( i + FTOI( divide ) ) * x_size + j + sq ] ) + + *( cp - in[ ( i + FTOI( 2 * divide ) ) * x_size + j + 2 * sq ] ) + + *( cp - in[ ( i + FTOI( 3 * divide ) ) * x_size + j + 3 * sq ] ); + } else { + divide = ( float )x / ( float )abs( y ); + sq = abs( y ) / y; + sq = *( cp - in[ ( i + sq ) * x_size + j + FTOI( divide ) ] ) + + *( cp - in[ ( i + 2 * sq ) * x_size + j + FTOI( 2 * divide ) ] ) + + *( cp - in[ ( i + 3 * sq ) * x_size + j + FTOI( 3 * divide ) ] ); + } + + if ( sq > 290 ) { + r[ i * x_size + j ] = max_no - n; + cgx[ i * x_size + j ] = ( 51 * x ) / n; + cgy[ i * x_size + j ] = ( 51 * y ) / n; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + /* to locate the local maxima */ + n = 0; + _Pragma( "loopbound min 85 max 85" ) + for ( i = 5; i < y_size - 5; i++ ) { + _Pragma( "loopbound min 66 max 66" ) + for ( j = 5; j < x_size - 5; j++ ) { + x = r[ i * x_size + j ]; + if ( x > 0 ) { + /* 5x5 mask */ + #ifdef FIVE_SUPP + if ( ( x > r[ ( i - 1 )*x_size + j + 2 ] ) && + ( x > r[ ( i )*x_size + j + 1 ] ) && + ( x > r[ ( i )*x_size + j + 2 ] ) && + ( x > r[ ( i + 1 )*x_size + j - 1 ] ) && + ( x > r[ ( i + 1 )*x_size + j ] ) && + ( x > r[ ( i + 1 )*x_size + j + 1 ] ) && + ( x > r[ ( i + 1 )*x_size + j + 2 ] ) && + ( x > r[ ( i + 2 )*x_size + j - 2 ] ) && + ( x > r[ ( i + 2 )*x_size + j - 1 ] ) && + ( x > r[ ( i + 2 )*x_size + j ] ) && + ( x > r[ ( i + 2 )*x_size + j + 1 ] ) && + ( x > r[ ( i + 2 )*x_size + j + 2 ] ) && + ( x >= r[ ( i - 2 )*x_size + j - 2 ] ) && + ( x >= r[ ( i - 2 )*x_size + j - 1 ] ) && + ( x >= r[ ( i - 2 )*x_size + j ] ) && + ( x >= r[ ( i - 2 )*x_size + j + 1 ] ) && + ( x >= r[ ( i - 2 )*x_size + j + 2 ] ) && + ( x >= r[ ( i - 1 )*x_size + j - 2 ] ) && + ( x >= r[ ( i - 1 )*x_size + j - 1 ] ) && + ( x >= r[ ( i - 1 )*x_size + j ] ) && + ( x >= r[ ( i - 1 )*x_size + j + 1 ] ) && + ( x >= r[ ( i )*x_size + j - 2 ] ) && + ( x >= r[ ( i )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 1 )*x_size + j - 2 ] ) ) + #endif + #ifdef SEVEN_SUPP + if ( ( x > r[ ( i - 3 )*x_size + j - 3 ] ) && + ( x > r[ ( i - 3 )*x_size + j - 2 ] ) && + ( x > r[ ( i - 3 )*x_size + j - 1 ] ) && + ( x > r[ ( i - 3 )*x_size + j ] ) && + ( x > r[ ( i - 3 )*x_size + j + 1 ] ) && + ( x > r[ ( i - 3 )*x_size + j + 2 ] ) && + ( x > r[ ( i - 3 )*x_size + j + 3 ] ) && + + ( x > r[ ( i - 2 )*x_size + j - 3 ] ) && + ( x > r[ ( i - 2 )*x_size + j - 2 ] ) && + ( x > r[ ( i - 2 )*x_size + j - 1 ] ) && + ( x > r[ ( i - 2 )*x_size + j ] ) && + ( x > r[ ( i - 2 )*x_size + j + 1 ] ) && + ( x > r[ ( i - 2 )*x_size + j + 2 ] ) && + ( x > r[ ( i - 2 )*x_size + j + 3 ] ) && + + ( x > r[ ( i - 1 )*x_size + j - 3 ] ) && + ( x > r[ ( i - 1 )*x_size + j - 2 ] ) && + ( x > r[ ( i - 1 )*x_size + j - 1 ] ) && + ( x > r[ ( i - 1 )*x_size + j ] ) && + ( x > r[ ( i - 1 )*x_size + j + 1 ] ) && + ( x > r[ ( i - 1 )*x_size + j + 2 ] ) && + ( x > r[ ( i - 1 )*x_size + j + 3 ] ) && + + ( x > r[ ( i )*x_size + j - 3 ] ) && + ( x > r[ ( i )*x_size + j - 2 ] ) && + ( x > r[ ( i )*x_size + j - 1 ] ) && + ( x >= r[ ( i )*x_size + j + 1 ] ) && + ( x >= r[ ( i )*x_size + j + 2 ] ) && + ( x >= r[ ( i )*x_size + j + 3 ] ) && + + ( x >= r[ ( i + 1 )*x_size + j - 3 ] ) && + ( x >= r[ ( i + 1 )*x_size + j - 2 ] ) && + ( x >= r[ ( i + 1 )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 1 )*x_size + j ] ) && + ( x >= r[ ( i + 1 )*x_size + j + 1 ] ) && + ( x >= r[ ( i + 1 )*x_size + j + 2 ] ) && + ( x >= r[ ( i + 1 )*x_size + j + 3 ] ) && + + ( x >= r[ ( i + 2 )*x_size + j - 3 ] ) && + ( x >= r[ ( i + 2 )*x_size + j - 2 ] ) && + ( x >= r[ ( i + 2 )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 2 )*x_size + j ] ) && + ( x >= r[ ( i + 2 )*x_size + j + 1 ] ) && + ( x >= r[ ( i + 2 )*x_size + j + 2 ] ) && + ( x >= r[ ( i + 2 )*x_size + j + 3 ] ) && + + ( x >= r[ ( i + 3 )*x_size + j - 3 ] ) && + ( x >= r[ ( i + 3 )*x_size + j - 2 ] ) && + ( x >= r[ ( i + 3 )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 3 )*x_size + j ] ) && + ( x >= r[ ( i + 3 )*x_size + j + 1 ] ) && + ( x >= r[ ( i + 3 )*x_size + j + 2 ] ) && + ( x >= r[ ( i + 3 )*x_size + j + 3 ] ) ) + #endif + { + corner_list[ n ].info = 0; + corner_list[ n ].x = j; + corner_list[ n ].y = i; + corner_list[ n ].dx = cgx[ i * x_size + j ]; + corner_list[ n ].dy = cgy[ i * x_size + j ]; + corner_list[ n ].I = in[ i * x_size + j ]; + n++; + if ( n == MAX_CORNERS ) { + /* "Too many corners." */ + } + } + } + } + } + corner_list[ n ].info = 7; +} + + +void susan_corners_quick( uchar *in, char *r, uchar *bp, + int max_no, CORNER_LIST corner_list, int x_size, int y_size ) +{ + int n, x, y, i, j; + uchar *p, *cp; + + susan_wccmemset( r, 0, x_size * y_size ); + + _Pragma( "loopbound min 0 max 0" ) + for ( i = 7; i < y_size - 7; i++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( j = 7; j < x_size - 7; j++ ) { + n = 100; + p = in + ( i - 3 ) * x_size + j - 1; + cp = bp + in[ i * x_size + j ]; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 3; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 5; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + p += x_size - 6; + + n += *( cp - *p++ ); + n += *( cp - *p++ ); + n += *( cp - *p ); + if ( n < max_no ) { + p += 2; + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + if ( n < max_no ) { + p += x_size - 6; + + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + if ( n < max_no ) { + p += x_size - 5; + + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + if ( n < max_no ) { + p += x_size - 3; + + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p++ ); + if ( n < max_no ) { + n += *( cp - *p ); + + if ( n < max_no ) + r[ i * x_size + j ] = max_no - n; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + /* to locate the local maxima */ + n = 0; + _Pragma( "loopbound min 0 max 0" ) + for ( i = 7; i < y_size - 7; i++ ) { + _Pragma( "loopbound min 0 max 0" ) + for ( j = 7; j < x_size - 7; j++ ) { + x = r[ i * x_size + j ]; + if ( x > 0 ) { + /* 5x5 mask */ + #ifdef FIVE_SUPP + if ( ( x > r[ ( i - 1 )*x_size + j + 2 ] ) && + ( x > r[ ( i )*x_size + j + 1 ] ) && + ( x > r[ ( i )*x_size + j + 2 ] ) && + ( x > r[ ( i + 1 )*x_size + j - 1 ] ) && + ( x > r[ ( i + 1 )*x_size + j ] ) && + ( x > r[ ( i + 1 )*x_size + j + 1 ] ) && + ( x > r[ ( i + 1 )*x_size + j + 2 ] ) && + ( x > r[ ( i + 2 )*x_size + j - 2 ] ) && + ( x > r[ ( i + 2 )*x_size + j - 1 ] ) && + ( x > r[ ( i + 2 )*x_size + j ] ) && + ( x > r[ ( i + 2 )*x_size + j + 1 ] ) && + ( x > r[ ( i + 2 )*x_size + j + 2 ] ) && + ( x >= r[ ( i - 2 )*x_size + j - 2 ] ) && + ( x >= r[ ( i - 2 )*x_size + j - 1 ] ) && + ( x >= r[ ( i - 2 )*x_size + j ] ) && + ( x >= r[ ( i - 2 )*x_size + j + 1 ] ) && + ( x >= r[ ( i - 2 )*x_size + j + 2 ] ) && + ( x >= r[ ( i - 1 )*x_size + j - 2 ] ) && + ( x >= r[ ( i - 1 )*x_size + j - 1 ] ) && + ( x >= r[ ( i - 1 )*x_size + j ] ) && + ( x >= r[ ( i - 1 )*x_size + j + 1 ] ) && + ( x >= r[ ( i )*x_size + j - 2 ] ) && + ( x >= r[ ( i )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 1 )*x_size + j - 2 ] ) ) + #endif + #ifdef SEVEN_SUPP + if ( ( x > r[ ( i - 3 )*x_size + j - 3 ] ) && + ( x > r[ ( i - 3 )*x_size + j - 2 ] ) && + ( x > r[ ( i - 3 )*x_size + j - 1 ] ) && + ( x > r[ ( i - 3 )*x_size + j ] ) && + ( x > r[ ( i - 3 )*x_size + j + 1 ] ) && + ( x > r[ ( i - 3 )*x_size + j + 2 ] ) && + ( x > r[ ( i - 3 )*x_size + j + 3 ] ) && + + ( x > r[ ( i - 2 )*x_size + j - 3 ] ) && + ( x > r[ ( i - 2 )*x_size + j - 2 ] ) && + ( x > r[ ( i - 2 )*x_size + j - 1 ] ) && + ( x > r[ ( i - 2 )*x_size + j ] ) && + ( x > r[ ( i - 2 )*x_size + j + 1 ] ) && + ( x > r[ ( i - 2 )*x_size + j + 2 ] ) && + ( x > r[ ( i - 2 )*x_size + j + 3 ] ) && + + ( x > r[ ( i - 1 )*x_size + j - 3 ] ) && + ( x > r[ ( i - 1 )*x_size + j - 2 ] ) && + ( x > r[ ( i - 1 )*x_size + j - 1 ] ) && + ( x > r[ ( i - 1 )*x_size + j ] ) && + ( x > r[ ( i - 1 )*x_size + j + 1 ] ) && + ( x > r[ ( i - 1 )*x_size + j + 2 ] ) && + ( x > r[ ( i - 1 )*x_size + j + 3 ] ) && + + ( x > r[ ( i )*x_size + j - 3 ] ) && + ( x > r[ ( i )*x_size + j - 2 ] ) && + ( x > r[ ( i )*x_size + j - 1 ] ) && + ( x >= r[ ( i )*x_size + j + 1 ] ) && + ( x >= r[ ( i )*x_size + j + 2 ] ) && + ( x >= r[ ( i )*x_size + j + 3 ] ) && + + ( x >= r[ ( i + 1 )*x_size + j - 3 ] ) && + ( x >= r[ ( i + 1 )*x_size + j - 2 ] ) && + ( x >= r[ ( i + 1 )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 1 )*x_size + j ] ) && + ( x >= r[ ( i + 1 )*x_size + j + 1 ] ) && + ( x >= r[ ( i + 1 )*x_size + j + 2 ] ) && + ( x >= r[ ( i + 1 )*x_size + j + 3 ] ) && + + ( x >= r[ ( i + 2 )*x_size + j - 3 ] ) && + ( x >= r[ ( i + 2 )*x_size + j - 2 ] ) && + ( x >= r[ ( i + 2 )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 2 )*x_size + j ] ) && + ( x >= r[ ( i + 2 )*x_size + j + 1 ] ) && + ( x >= r[ ( i + 2 )*x_size + j + 2 ] ) && + ( x >= r[ ( i + 2 )*x_size + j + 3 ] ) && + + ( x >= r[ ( i + 3 )*x_size + j - 3 ] ) && + ( x >= r[ ( i + 3 )*x_size + j - 2 ] ) && + ( x >= r[ ( i + 3 )*x_size + j - 1 ] ) && + ( x >= r[ ( i + 3 )*x_size + j ] ) && + ( x >= r[ ( i + 3 )*x_size + j + 1 ] ) && + ( x >= r[ ( i + 3 )*x_size + j + 2 ] ) && + ( x >= r[ ( i + 3 )*x_size + j + 3 ] ) ) + #endif + { + corner_list[ n ].info = 0; + corner_list[ n ].x = j; + corner_list[ n ].y = i; + x = in[ ( i - 2 ) * x_size + j - 2 ] + in[ ( i - 2 ) * x_size + j - 1 ] + in[ ( i - + 2 ) * x_size + j ] + in[ ( i - 2 ) * x_size + j + 1 ] + in[ ( i - 2 ) * x_size + j + + 2 ] + + in[ ( i - 1 ) * x_size + j - 2 ] + in[ ( i - 1 ) * x_size + j - 1 ] + in[ ( i - 1 ) * + x_size + j ] + in[ ( i - 1 ) * x_size + j + 1 ] + in[ ( i - 1 ) * x_size + j + 2 ] + + in[ ( i ) * x_size + j - 2 ] + in[ ( i ) * x_size + j - 1 ] + in[ ( i ) * x_size + + j ] + in[ ( i ) * x_size + j + 1 ] + in[ ( i ) * x_size + j + 2 ] + + in[ ( i + 1 ) * x_size + j - 2 ] + in[ ( i + 1 ) * x_size + j - 1 ] + in[ ( i + 1 ) * + x_size + j ] + in[ ( i + 1 ) * x_size + j + 1 ] + in[ ( i + 1 ) * x_size + j + 2 ] + + in[ ( i + 2 ) * x_size + j - 2 ] + in[ ( i + 2 ) * x_size + j - 1 ] + in[ ( i + 2 ) * + x_size + j ] + in[ ( i + 2 ) * x_size + j + 1 ] + in[ ( i + 2 ) * x_size + j + 2 ]; + + corner_list[ n ].I = x / 25; + /*corner_list[ n ].I=in[ i*x_size+j ];*/ + x = in[ ( i - 2 ) * x_size + j + 2 ] + in[ ( i - 1 ) * x_size + j + 2 ] + in[ ( i ) * + x_size + j + 2 ] + in[ ( i + 1 ) * x_size + j + 2 ] + in[ ( i + 2 ) * x_size + j + + 2 ] - + ( in[ ( i - 2 ) * x_size + j - 2 ] + in[ ( i - 1 ) * x_size + j - 2 ] + in[ ( i ) * + x_size + j - 2 ] + in[ ( i + 1 ) * x_size + j - 2 ] + in[ ( i + 2 ) * x_size + j - + 2 ] ); + x += x + in[ ( i - 2 ) * x_size + j + 1 ] + in[ ( i - 1 ) * x_size + j + 1 ] + + in[ ( i ) * x_size + j + 1 ] + in[ ( i + 1 ) * x_size + j + 1 ] + in[ ( i + 2 ) * + x_size + j + 1 ] - + ( in[ ( i - 2 ) * x_size + j - 1 ] + in[ ( i - 1 ) * x_size + j - 1 ] + in[ ( i ) * + x_size + j - 1 ] + in[ ( i + 1 ) * x_size + j - 1 ] + in[ ( i + 2 ) * x_size + j - + 1 ] ); + + y = in[ ( i + 2 ) * x_size + j - 2 ] + in[ ( i + 2 ) * x_size + j - 1 ] + in[ ( i + + 2 ) * x_size + j ] + in[ ( i + 2 ) * x_size + j + 1 ] + in[ ( i + 2 ) * x_size + j + + 2 ] - + ( in[ ( i - 2 ) * x_size + j - 2 ] + in[ ( i - 2 ) * x_size + j - 1 ] + in[ ( i - 2 ) + * x_size + j ] + in[ ( i - 2 ) * x_size + j + 1 ] + in[ ( i - 2 ) * x_size + j + + 2 ] ); + y += y + in[ ( i + 1 ) * x_size + j - 2 ] + in[ ( i + 1 ) * x_size + j - 1 ] + + in[ ( i + 1 ) * x_size + j ] + in[ ( i + 1 ) * x_size + j + 1 ] + in[ ( i + 1 ) * + x_size + j + 2 ] - + ( in[ ( i - 1 ) * x_size + j - 2 ] + in[ ( i - 1 ) * x_size + j - 1 ] + in[ ( i - 1 ) + * x_size + j ] + in[ ( i - 1 ) * x_size + j + 1 ] + in[ ( i - 1 ) * x_size + j + + 2 ] ); + corner_list[ n ].dx = x / 15; + corner_list[ n ].dy = y / 15; + n++; + if ( n == MAX_CORNERS ) { + /* "Too many corners." */ + } + } + } + } + } + corner_list[ n ].info = 7; +} + + +void susan_call_susan( struct wccFILE *inputFile, int mode ) +{ + uchar *in, *bp, *mid; + int x_size, y_size; + char *r; + CORNER_LIST corner_list; + + susan_get_image( inputFile, &in, &x_size, &y_size ); + + if ( susan_dt < 0 ) susan_three_by_three = 1; + if ( ( susan_principle_conf == 1 ) && ( mode == 0 ) ) + mode = 1; + + switch ( mode ) { + case 0: + /* {{{ smoothing */ + + susan_setup_brightness_lut( &bp, susan_bt, 2 ); + susan_smoothing( susan_three_by_three, in, susan_dt, x_size, y_size, bp ); + + break; + case 1: + /* {{{ edges */ + + r = ( char * ) susan_wccmalloc( x_size * y_size ); + susan_setup_brightness_lut( &bp, susan_bt, 6 ); + + if ( susan_principle_conf ) { + if ( susan_three_by_three ) + susan_principle_small( in, r, bp, susan_max_no_edges, x_size, y_size ); + else + susan_principle( in, r, bp, susan_max_no_edges, x_size, y_size ); + susan_int_to_uchar( r, in, x_size * y_size ); + } else { + mid = ( uchar * )susan_wccmalloc( x_size * y_size ); + susan_wccmemset( mid, 100, x_size * y_size ); /* note not set to zero */ + + if ( susan_three_by_three ) + susan_edges_small( in, r, mid, bp, susan_max_no_edges, x_size, y_size ); + else + susan_edges( in, r, mid, bp, susan_max_no_edges, x_size, y_size ); + if ( susan_thin_post_proc ) + susan_thin( r, mid, x_size, y_size ); + susan_edge_draw( in, mid, x_size, y_size, susan_drawing_mode ); + } + + break; + case 2: + /* {{{ corners */ + + r = ( char * ) susan_wccmalloc( x_size * y_size ); + susan_setup_brightness_lut( &bp, susan_bt, 6 ); + + if ( susan_principle_conf ) { + susan_principle( in, r, bp, susan_max_no_corners, x_size, y_size ); + susan_int_to_uchar( r, in, x_size * y_size ); + } else { + if ( susan_susan_quick ) + susan_corners_quick( in, r, bp, susan_max_no_corners, corner_list, x_size, + y_size ); + else + susan_corners( in, r, bp, susan_max_no_corners, corner_list, x_size, y_size ); + susan_corner_draw( in, corner_list, x_size, susan_drawing_mode ); + } + + break; + } + + susan_put_image( x_size, y_size ); +} + +void susan_init( void ) +{ + volatile int a = 0; + susan_file.data = susan_input; + susan_file.size = 7292; + susan_file.size += a; + susan_file.cur_pos = 0; + susan_file.cur_pos += a; + + susan_dt = 4.0; + susan_dt += a; + susan_bt = 20; + susan_bt += a; + susan_principle_conf = 0; + susan_principle_conf += a; + susan_thin_post_proc = 1; + susan_thin_post_proc += a; + susan_three_by_three = 0; + susan_three_by_three += a; + susan_drawing_mode = 0; + susan_drawing_mode += a; + susan_susan_quick = 0; + susan_susan_quick += a; + susan_max_no_corners = 50; + susan_max_no_corners += a; + susan_max_no_edges = 50; + susan_max_no_edges += a; + + // mode=0; /* Smoothing mode */ + // mode=1; /* Edges mode */ + // mode=2; /* Corners mode */ + + // principle=1; /* Output initial enhancement image only; corners or edges mode (default is edges mode) */ + // thin_post_proc=0; /* No post-processing on the binary edge map (runs much faster); edges mode */ + // drawing_mode=1; /* Mark corners/edges with single black points instead of black with white border; corners or edges mode */ + // three_by_three=1; /* Use flat 3x3 mask, edges or smoothing mode */ + // susan_quick=1; /* Use faster (and usually stabler) corner mode; edge-like corner suppression not carried out; corners mode */ + // dt=10.0; /* Distance threshold, smoothing mode, (default=4) */ + // bt=50; /* Brightness threshold, all modes, (default=20) */ +} + +void _Pragma( "entrypoint" ) susan_main( void ) +{ + susan_call_susan( &susan_file, 0 ); + susan_wccfreeall(); + susan_call_susan( &susan_file, 1 ); + susan_wccfreeall(); + susan_call_susan( &susan_file, 2 ); + susan_wccfreeall(); +} + +int susan_return( void ) +{ + return 0; +} + +int main( void ) +{ + susan_init(); + susan_main(); + + return susan_return(); +} diff --git a/targets/wasm-tacle/sequential/susan/wccfile.c b/targets/wasm-tacle/sequential/susan/wccfile.c new file mode 100755 index 0000000..41429a7 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/wccfile.c @@ -0,0 +1,79 @@ +#include "wccfile.h" +#define EOF -1 + +size_t susan_wccfread( void *ptr, size_t size, size_t count, + struct wccFILE *stream ) +{ + if ( susan_wccfeof( stream ) ) + return EOF; + + unsigned i = stream->cur_pos, i2 = 0; + size_t number_of_chars_to_read = + stream->size - stream->cur_pos >= size * count ? + size * count : stream->size - stream->cur_pos; + _Pragma( "loopbound min 7220 max 7220" ) + while ( i < stream->cur_pos + number_of_chars_to_read ) + ( ( unsigned char * )ptr )[ i2++ ] = stream->data[ i++ ]; + stream->cur_pos += number_of_chars_to_read; + return number_of_chars_to_read; +} + +int susan_wccfgetc( struct wccFILE *stream ) +{ + if ( susan_wccfeof( stream ) ) + return EOF; + + else + return stream->data[ stream->cur_pos++ ]; +} + +char *susan_wccfgets( char *str, int num, struct wccFILE *stream ) +{ + if ( !stream || susan_wccfeof( stream ) || !str || num <= 0 ) + return 0; + + int pos = 0; + _Pragma( "loopbound min 57 max 57" ) + while ( pos < num - 1 && !susan_wccfeof( stream ) ) { + str[ pos ] = stream->data[ stream->cur_pos ]; + if ( str[ pos ] == '\n' ) + break; + + stream->cur_pos++; + pos++; + } + str[ pos++ ] = '\0'; + + return str; +} + +int susan_wccfseek( struct wccFILE *stream, long int offset, + enum _Origin_ origin ) +{ + if ( origin == WCCSEEK_SET ) { + stream->cur_pos = offset; + return 0; + } else + if ( origin == WCCSEEK_CUR ) { + stream->cur_pos += offset; + return 0; + } else + if ( origin == WCCSEEK_END ) { + stream->cur_pos = stream->size + offset; + return 0; + } + return -1; +} + + +int susan_wccfgetpos( struct wccFILE *stream, unsigned *position ) +{ + *position = stream->cur_pos; + return 0; +} + + +int susan_wccfeof( struct wccFILE *stream ) +{ + return stream->cur_pos == stream->size ? 1 : 0; +} diff --git a/targets/wasm-tacle/sequential/susan/wccfile.h b/targets/wasm-tacle/sequential/susan/wccfile.h new file mode 100755 index 0000000..6fc2f04 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/wccfile.h @@ -0,0 +1,26 @@ +#ifndef WCC_FILE_H +#define WCC_FILE_H + +enum _Origin_ { WCCSEEK_SET, WCCSEEK_CUR, WCCSEEK_END }; +typedef enum _Origin_ Origin; +typedef unsigned int size_t; + +#define EOF -1 + +struct wccFILE { + char *data; + size_t size; + unsigned cur_pos; +}; + +size_t susan_wccfread ( void *ptr, size_t size, size_t count, + struct wccFILE *stream ); +int susan_wccfseek ( struct wccFILE *stream, long int offset, + Origin origin ); +int susan_wccfgetpos ( struct wccFILE *stream, unsigned *position ); +int susan_wccfeof ( struct wccFILE *stream ); +int susan_wccfgetc ( struct wccFILE *stream ); +char *susan_wccfgets ( char *str, int num, struct wccFILE *stream ); + +#endif + diff --git a/targets/wasm-tacle/sequential/susan/wcclibm.c b/targets/wasm-tacle/sequential/susan/wcclibm.c new file mode 100755 index 0000000..ba07d39 --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/wcclibm.c @@ -0,0 +1,473 @@ +#include "math_private.h" +#include "wcclibm.h" + + + +/* e_rem_pio2f.c -- float version of e_rem_pio2.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = + "$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $"; +#endif + +/* __ieee754_rem_pio2f(x,y) + + return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ] + use __kernel_rem_pio2f() +*/ + +/* This array is like the one in e_rem_pio2.c, but the numbers are + single precision and the last 8 bits are forced to 0. */ +static const int32_t susan_npio2_hw[ ] = { + 0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00, + 0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00, + 0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100, + 0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00, + 0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00, + 0x4242c700, 0x42490f00 +}; + +/* + invpio2: 24 bits of 2/pi + pio2_1: first 17 bit of pi/2 + pio2_1t: pi/2 - pio2_1 + pio2_2: second 17 bit of pi/2 + pio2_2t: pi/2 - (pio2_1+pio2_2) + pio2_3: third 17 bit of pi/2 + pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) +*/ + +static const float +/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */ +/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */ +/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */ +susan_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */ +susan_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */ +susan_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */ +susan_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */ +susan_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */ +susan_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */ +susan_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */ + +int32_t susan___ieee754_rem_pio2f( float x, float *y ) +{ + float z, w, t, r, fn; + int32_t i, j, n, ix, hx; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */ + y[ 0 ] = x; + y[ 1 ] = 0; + return 0; + } + if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */ + if ( hx > 0 ) { + z = x - susan_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z - susan_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) - susan_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z -= susan_pio2_2; + y[ 0 ] = z - susan_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) - susan_pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + susan_pio2_1; + if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */ + y[ 0 ] = z + susan_pio2_1t; + y[ 1 ] = ( z - y[ 0 ] ) + susan_pio2_1t; + } else { /* near pi/2, use 24+24+24 bit pi */ + z += susan_pio2_2; + y[ 0 ] = z + susan_pio2_2t; + y[ 1 ] = ( z - y[ 0 ] ) + susan_pio2_2t; + } + return -1; + } + } + if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */ + t = fabsf( x ); + n = ( int32_t ) ( t * susan_invpio2 + susan_half ); + fn = ( float )n; + r = t - fn * susan_pio2_1; + w = fn * susan_pio2_1t; /* 1st round good to 40 bit */ + if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != susan_npio2_hw[ n - 1 ] ) { + y[ 0 ] = r - w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix >> 23; + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 8 ) { /* 2nd iteration needed, good to 57 */ + t = r; + w = fn * susan_pio2_2; + r = t - w; + w = fn * susan_pio2_2t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + GET_FLOAT_WORD( high, y[ 0 ] ); + i = j - ( ( high >> 23 ) & 0xff ); + if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */ + t = r; /* will cover all possible cases */ + w = fn * susan_pio2_3; + r = t - w; + w = fn * susan_pio2_3t - ( ( t - r ) - w ); + y[ 0 ] = r - w; + } + } + } + y[ 1 ] = ( r - y[ 0 ] ) - w; + if ( hx < 0 ) { + y[ 0 ] = -y[ 0 ]; + y[ 1 ] = -y[ 1 ]; + return -n; + } else return n; + } + /* + all other (large) arguments + */ + if ( ix >= 0x7f800000 ) { /* x is inf or NaN */ + y[ 0 ] = y[ 1 ] = x - x; + return 0; + } + + y[ 0 ] = y[ 1 ] = x - x; + return 0; /* dummy initialisation */ + return 0; /* doesn't happen for our input */ +} + +/* k_cosf.c -- float version of k_cos.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $"; +#endif + + +static const float +/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */ +susan_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */ +susan_C2 = -1.3888889225e-03f, /* 0xbab60b61 */ +susan_C3 = 2.4801587642e-05f, /* 0x37d00d01 */ +susan_C4 = -2.7557314297e-07f, /* 0xb493f27c */ +susan_C5 = 2.0875723372e-09f, /* 0x310f74f6 */ +susan_C6 = -1.1359647598e-11f; /* 0xad47d74e */ + +float susan___kernel_cosf( float x, float y ) +{ + float a, hz, z, r, qx; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if ( ix < 0x32000000 ) { /* if x < 2**27 */ + if ( ( ( int )x ) == 0 ) return susan_one; /* generate inexact */ + } + z = x * x; + r = z * ( susan_C1 + z * ( susan_C2 + z * ( susan_C3 + z * ( susan_C4 + z * + ( susan_C5 + z * susan_C6 ) ) ) ) ); + if ( ix < 0x3e99999a ) /* if |x| < 0.3 */ + return susan_one - ( ( float )0.5f * z - ( z * r - x * y ) ); + else { + if ( ix > 0x3f480000 ) /* x > 0.78125 */ + qx = ( float )0.28125f; + + else { + SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */ + } + hz = ( float )0.5f * z - qx; + a = susan_one - qx; + return a - ( hz - ( z * r - x * y ) ); + } +} + +/* k_sinf.c -- float version of k_sin.c + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $"; +#endif + + +static const float +/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */ +susan_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */ +susan_S2 = 8.3333337680e-03f, /* 0x3c088889 */ +susan_S3 = -1.9841270114e-04f, /* 0xb9500d01 */ +susan_S4 = 2.7557314297e-06f, /* 0x3638ef1b */ +susan_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */ +susan_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */ + +float susan___kernel_sinf( float x, float y, int iy ) +{ + float z, r, v; + int32_t ix; + GET_FLOAT_WORD( ix, x ); + ix &= 0x7fffffff; /* high word of x */ + if ( ix < 0x32000000 ) { /* |x| < 2**-27 */ + if ( ( int )x == 0 ) return x; /* generate inexact */ + } + z = x * x; + v = z * x; + r = susan_S2 + z * ( susan_S3 + z * ( susan_S4 + z * ( susan_S5 + z * + susan_S6 ) ) ); + if ( iy == 0 ) return x + v * ( susan_S1 + z * r ); + else return x - ( ( z * ( susan_half * y - v * r ) - y ) - v * susan_S1 ); +} +/* s_atanf.c -- float version of s_atan.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[ ] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $"; +#endif + + +static const float susan_atanhi[ ] = { + 4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */ + 7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */ + 9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */ + 1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */ +}; + +static const float susan_atanlo[ ] = { + 5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */ + 3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */ + 3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */ + 7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */ +}; + +static const float susan_aT[ ] = { + 3.3333334327e-01f, /* 0x3eaaaaaa */ + -2.0000000298e-01f, /* 0xbe4ccccd */ + 1.4285714924e-01f, /* 0x3e124925 */ + -1.1111110449e-01f, /* 0xbde38e38 */ + 9.0908870101e-02f, /* 0x3dba2e6e */ + -7.6918758452e-02f, /* 0xbd9d8795 */ + 6.6610731184e-02f, /* 0x3d886b35 */ + -5.8335702866e-02f, /* 0xbd6ef16b */ + 4.9768779427e-02f, /* 0x3d4bda59 */ + -3.6531571299e-02f, /* 0xbd15a221 */ + 1.6285819933e-02f, /* 0x3c8569d7 */ +}; + +float susan___atanf( float x ) +{ + float w, s1, s2, z; + int32_t ix, hx, id; + + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; + if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */ + if ( ix > 0x7f800000 ) + return x + x; /* NaN */ + if ( hx > 0 ) return susan_atanhi[ 3 ] + susan_atanlo[ 3 ]; + else return -susan_atanhi[ 3 ] - susan_atanlo[ 3 ]; + } + if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */ + if ( ix < 0x31000000 ) { /* |x| < 2^-29 */ + if ( susan_huge + x > susan_one ) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabsf( x ); + if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */ + if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */ + id = 0; + x = ( ( float )2.0f * x - susan_one ) / ( ( float )2.0f + x ); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; + x = ( x - susan_one ) / ( x + susan_one ); + } + } else { + if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */ + id = 2; + x = ( x - ( float )1.5f ) / ( susan_one + ( float )1.5f * x ); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; + x = -( float )1.0f / x; + } + } + } + /* end of argument reduction */ + z = x * x; + w = z * z; + /* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */ + s1 = z * ( susan_aT[ 0 ] + w * ( susan_aT[ 2 ] + w * ( susan_aT[ 4 ] + w * + ( susan_aT[ 6 ] + w * ( susan_aT[ 8 ] + w * susan_aT[ 10 ] ) ) ) ) ); + s2 = w * ( susan_aT[ 1 ] + w * ( susan_aT[ 3 ] + w * ( susan_aT[ 5 ] + w * + ( susan_aT[ 7 ] + w * susan_aT[ 9 ] ) ) ) ); + if ( id < 0 ) return x - x * ( s1 + s2 ); + else { + z = susan_atanhi[ id ] - ( ( x * ( s1 + s2 ) - susan_atanlo[ id ] ) - x ); + return ( hx < 0 ) ? -z : z; + } +} + +/* s_cosf.c -- float version of s_cos.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +float susan___cosf( float x ) +{ + float y[ 2 ], z = 0.0f; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return susan___kernel_cosf( x, z ); + + /* cos(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = susan___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return susan___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 1: + return -susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 2: + return -susan___kernel_cosf( y[ 0 ], y[ 1 ] ); + default: + return susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + } + } +} + +/* s_sinf.c -- float version of s_sin.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +float susan___sinf( float x ) +{ + float y[ 2 ], z = 0.0; + int32_t n, ix; + + GET_FLOAT_WORD( ix, x ); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if ( ix <= 0x3f490fd8 ) return susan___kernel_sinf( x, z, 0 ); + + /* sin(Inf or NaN) is NaN */ + else + if ( ix >= 0x7f800000 ) return x - x; + + /* argument reduction needed */ + else { + n = susan___ieee754_rem_pio2f( x, y ); + switch ( n & 3 ) { + case 0: + return susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + case 1: + return susan___kernel_cosf( y[ 0 ], y[ 1 ] ); + case 2: + return -susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 ); + default: + return -susan___kernel_cosf( y[ 0 ], y[ 1 ] ); + } + } +} + +/* s_fabsf.c -- float version of s_fabs.c. + Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. +*/ + +/* + ==================================================== + Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + + Developed at SunPro, a Sun Microsystems, Inc. business. + Permission to use, copy, modify, and distribute this + software is freely granted, provided that this notice + is preserved. + ==================================================== +*/ + +/* + fabsf(x) returns the absolute value of x. +*/ + + +float susan___fabsf( float x ) +{ + u_int32_t ix; + GET_FLOAT_WORD( ix, x ); + SET_FLOAT_WORD( x, ix & 0x7fffffff ); + return x; +} diff --git a/targets/wasm-tacle/sequential/susan/wcclibm.h b/targets/wasm-tacle/sequential/susan/wcclibm.h new file mode 100755 index 0000000..08dd34e --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/wcclibm.h @@ -0,0 +1,54 @@ +#ifndef _WCCLIBM +#define _WCCLIBM + +#define int32_t int +#define uint32_t unsigned int +#define u_int16_t unsigned short +#define u_int32_t unsigned int + +// Often used variables/consts +#ifdef __STDC__ +static const float +#else +static float +#endif +susan_one = 1.0f, +susan_half = 5.0000000000e-01f, /* 0x3f000000 */ +susan_zero = 0.0f, +susan_huge = 1.0e30, +susan_two8 = 2.5600000000e+02f, /* 0x43800000 */ +susan_twon8 = 3.9062500000e-03f; /* 0x3b800000 */ + +// The following defines map the math functions to specialized calls +#define acos susan___ieee754_acosf +#define atan susan___atanf +#define cos susan___cosf +#define fabs susan___fabsf +#define fabsf susan___fabsf +#define isinf susan___isinff +#define pow susan___ieee754_powf +#define sqrt susan___ieee754_sqrtf +#define log10 susan___ieee754_log10f +#define log susan___ieee754_logf +#define sin susan___sinf + +float susan___atanf( float x ); +float susan___copysignf( float x, float y ); +float susan___cosf( float x ); +float susan___fabsf( float x ); +float susan___floorf( float x ); +float susan___ieee754_acosf( float x ); +float susan___ieee754_powf( float x, float y ); +int32_t susan___ieee754_rem_pio2f( float x, float *y ); +float susan___ieee754_sqrtf( float x ); +int susan___isinff ( float x ); +float susan___kernel_cosf( float x, float y ); +float susan___kernel_sinf( float x, float y, int iy ); +int susan___kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec, + const int32_t *ipio2 ); +float susan___scalbnf ( float x, int n ); +float susan___ieee754_logf( float x ); +float susan___ieee754_log10f( float x ); +float susan___sinf( float x ); + +#endif // _WCCLIBM diff --git a/targets/wasm-tacle/sequential/susan/wccmalloc.c b/targets/wasm-tacle/sequential/susan/wccmalloc.c new file mode 100755 index 0000000..7b1839f --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/wccmalloc.c @@ -0,0 +1,50 @@ +#include "wccmalloc.h" + +// This must be redefined for each new benchmark +#define HEAP_SIZE 30000 + +char susan_simulated_heap[ HEAP_SIZE ]; +unsigned int susan_freeHeapPos; + +void *susan_wccmalloc( unsigned int numberOfBytes ) +{ + // Get a 4-byte adress for alignment purposes + unsigned int offset = ( ( unsigned long )susan_simulated_heap + + susan_freeHeapPos ) % 4; + if ( offset ) + susan_freeHeapPos += 4 - offset; + void *currentPos = ( void * )&susan_simulated_heap[ susan_freeHeapPos ]; + susan_freeHeapPos += numberOfBytes; + return currentPos; +} +void susan_wccfreeall( void ) +{ + susan_freeHeapPos = 0; +} + +void *susan_wccmemcpy( void *dstpp, const void *srcpp, unsigned int len ) +{ + unsigned long int dstp = ( long int ) dstpp; + unsigned long int srcp = ( long int ) srcpp; + + _Pragma( "loopbound min 76 max 76" ) + while ( len > 0 ) { + char __x = ( ( char * ) srcp )[ 0 ]; + srcp += 1; + len -= 1; + ( ( char * ) dstp )[ 0 ] = __x; + dstp += 1; + } + + return dstpp; +} + +void susan_wccmemset( void *p, int value, unsigned int num ) +{ + unsigned long i; + char *char_ptr = ( char * )p; + + _Pragma( "loopbound min 7220 max 7220" ) + for ( i = 0; i < num; ++i ) + *char_ptr++ = ( unsigned char )value; +} diff --git a/targets/wasm-tacle/sequential/susan/wccmalloc.h b/targets/wasm-tacle/sequential/susan/wccmalloc.h new file mode 100755 index 0000000..cbd9a5d --- /dev/null +++ b/targets/wasm-tacle/sequential/susan/wccmalloc.h @@ -0,0 +1,10 @@ +#ifndef _WCCMALLOC_H +#define _WCCMALLOC_H + +void *susan_wccmalloc( unsigned int numberOfBytes ); +//! Frees ALL allocated memory space +void susan_wccfreeall( void ); +void *susan_wccmemcpy( void *dstpp, const void *srcpp, unsigned int len ); +void susan_wccmemset( void *p, int value, unsigned int num ); + +#endif diff --git a/targets/wasm-tacle/test/cover/CMakeLists.txt b/targets/wasm-tacle/test/cover/CMakeLists.txt new file mode 100644 index 0000000..d407e63 --- /dev/null +++ b/targets/wasm-tacle/test/cover/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(cover) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/cover.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/cover.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/test/cover/ChangeLog.txt b/targets/wasm-tacle/test/cover/ChangeLog.txt new file mode 100755 index 0000000..308e9e1 --- /dev/null +++ b/targets/wasm-tacle/test/cover/ChangeLog.txt @@ -0,0 +1,57 @@ +File: cover.c +Original provenience: Mälardalen benchmark suite, +Source: http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cover/cover.c + +2016-03-15: +- Made sure that cover_return returns value 0. + +2016-01-06: +- Added original name to generic TACLeBench header. +- Applied TACLeBench formatting rules via + astyle --options=doc/example/astylerc.txt + +2015-12-03: +- Replaced comment describing purpose of benchmark from lines 1-7 + with generic TACLeBench header. +- Removed all "/* k switch case traversed */ comments. + (lines 10, 144, 218) +- Introduced comments to split file in sections for forward declarations, + global variables, initialization-related and return-value-related functions, + core benchmark functions, and main routine. +- Renamed function swi10 to cover_swi10. +- Renamed function swi50 to cover_swi50. +- Renamed function swi120 to cover_swi120. +- Renamed function main to cover_main. +- Replaced local variable cnt in cover_main with global variable cover_cnt. +- Added function cover_init that handles the initialization of cover_cnt. +- Added function cover_return that handles the original return value of main. +- Changed cover_main such that no value is returned. +- Added new function main that first calls cover_init, then cover_main and + finally returns the return value of cover_return. +- Added forward declarations for all these functions. +- Applied code formatting according to the following rules: + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + - Function arguments are specified in ANSI style, i.e., + float my_sqrtf( float val ) + and NOT in Kernighan&Ritchie style like, e.g., + float my_sqrtf( val ) + float val; +- Tested conformance to C90 via + clang -fsyntax-only -Weverything -Wno-unknown-pragmas -pedantic -std=c90 diff --git a/targets/wasm-tacle/test/cover/cover.c b/targets/wasm-tacle/test/cover/cover.c new file mode 100755 index 0000000..051fa91 --- /dev/null +++ b/targets/wasm-tacle/test/cover/cover.c @@ -0,0 +1,702 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: cover + + Author: unknown + + Function: A program for testing many paths generated by switch-case + statements. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cover/cover.c + + Original name: cover + + Changes: See ChangeLog.txt + + License: may be used, modified, and re-distributed freely + +*/ + + +/* + Forward declaration of functions +*/ + +void cover_init( void ); +void cover_main( void ); +int cover_return( void ); +int cover_swi10( int ); +int cover_swi50( int ); +int cover_swi120( int ); + + +/* + Declaration of global variables +*/ + +static volatile int cover_cnt; + + +/* + Initialization- and return-value-related functions +*/ + +void cover_init( void ) +{ + cover_cnt = 0; +} + + +int cover_return( void ) +{ + return cover_cnt - 180; +} + + +/* + Core benchmark functions +*/ + +int cover_swi120( int c ) +{ + int i; + + _Pragma( "loopbound min 120 max 120" ) + for ( i = 0; i < 120; i++ ) { + switch ( i ) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + case 10: + c++; + break; + case 11: + c++; + break; + case 12: + c++; + break; + case 13: + c++; + break; + case 14: + c++; + break; + case 15: + c++; + break; + case 16: + c++; + break; + case 17: + c++; + break; + case 18: + c++; + break; + case 19: + c++; + break; + case 20: + c++; + break; + case 21: + c++; + break; + case 22: + c++; + break; + case 23: + c++; + break; + case 24: + c++; + break; + case 25: + c++; + break; + case 26: + c++; + break; + case 27: + c++; + break; + case 28: + c++; + break; + case 29: + c++; + break; + case 30: + c++; + break; + case 31: + c++; + break; + case 32: + c++; + break; + case 33: + c++; + break; + case 34: + c++; + break; + case 35: + c++; + break; + case 36: + c++; + break; + case 37: + c++; + break; + case 38: + c++; + break; + case 39: + c++; + break; + case 40: + c++; + break; + case 41: + c++; + break; + case 42: + c++; + break; + case 43: + c++; + break; + case 44: + c++; + break; + case 45: + c++; + break; + case 46: + c++; + break; + case 47: + c++; + break; + case 48: + c++; + break; + case 49: + c++; + break; + case 50: + c++; + break; + case 51: + c++; + break; + case 52: + c++; + break; + case 53: + c++; + break; + case 54: + c++; + break; + case 55: + c++; + break; + case 56: + c++; + break; + case 57: + c++; + break; + case 58: + c++; + break; + case 59: + c++; + break; + case 60: + c++; + break; + case 61: + c++; + break; + case 62: + c++; + break; + case 63: + c++; + break; + case 64: + c++; + break; + case 65: + c++; + break; + case 66: + c++; + break; + case 67: + c++; + break; + case 68: + c++; + break; + case 69: + c++; + break; + case 70: + c++; + break; + case 71: + c++; + break; + case 72: + c++; + break; + case 73: + c++; + break; + case 74: + c++; + break; + case 75: + c++; + break; + case 76: + c++; + break; + case 77: + c++; + break; + case 78: + c++; + break; + case 79: + c++; + break; + case 80: + c++; + break; + case 81: + c++; + break; + case 82: + c++; + break; + case 83: + c++; + break; + case 84: + c++; + break; + case 85: + c++; + break; + case 86: + c++; + break; + case 87: + c++; + break; + case 88: + c++; + break; + case 89: + c++; + break; + case 90: + c++; + break; + case 91: + c++; + break; + case 92: + c++; + break; + case 93: + c++; + break; + case 94: + c++; + break; + case 95: + c++; + break; + case 96: + c++; + break; + case 97: + c++; + break; + case 98: + c++; + break; + case 99: + c++; + break; + case 100: + c++; + break; + case 101: + c++; + break; + case 102: + c++; + break; + case 103: + c++; + break; + case 104: + c++; + break; + case 105: + c++; + break; + case 106: + c++; + break; + case 107: + c++; + break; + case 108: + c++; + break; + case 109: + c++; + break; + case 110: + c++; + break; + case 111: + c++; + break; + case 112: + c++; + break; + case 113: + c++; + break; + case 114: + c++; + break; + case 115: + c++; + break; + case 116: + c++; + break; + case 117: + c++; + break; + case 118: + c++; + break; + case 119: + c++; + break; + default: + c--; + break; + } + } + return c; +} + + +int cover_swi50( int c ) +{ + int i; + + _Pragma( "loopbound min 50 max 50" ) + for ( i = 0; i < 50; i++ ) { + switch ( i ) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + case 10: + c++; + break; + case 11: + c++; + break; + case 12: + c++; + break; + case 13: + c++; + break; + case 14: + c++; + break; + case 15: + c++; + break; + case 16: + c++; + break; + case 17: + c++; + break; + case 18: + c++; + break; + case 19: + c++; + break; + case 20: + c++; + break; + case 21: + c++; + break; + case 22: + c++; + break; + case 23: + c++; + break; + case 24: + c++; + break; + case 25: + c++; + break; + case 26: + c++; + break; + case 27: + c++; + break; + case 28: + c++; + break; + case 29: + c++; + break; + case 30: + c++; + break; + case 31: + c++; + break; + case 32: + c++; + break; + case 33: + c++; + break; + case 34: + c++; + break; + case 35: + c++; + break; + case 36: + c++; + break; + case 37: + c++; + break; + case 38: + c++; + break; + case 39: + c++; + break; + case 40: + c++; + break; + case 41: + c++; + break; + case 42: + c++; + break; + case 43: + c++; + break; + case 44: + c++; + break; + case 45: + c++; + break; + case 46: + c++; + break; + case 47: + c++; + break; + case 48: + c++; + break; + case 49: + c++; + break; + case 50: + c++; + break; + case 51: + c++; + break; + case 52: + c++; + break; + case 53: + c++; + break; + case 54: + c++; + break; + case 55: + c++; + break; + case 56: + c++; + break; + case 57: + c++; + break; + case 58: + c++; + break; + case 59: + c++; + break; + default: + c--; + break; + } + } + return c; +} + + +int cover_swi10( int c ) +{ + int i; + + _Pragma( "loopbound min 10 max 10" ) + for ( i = 0; i < 10; i++ ) { + switch ( i ) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + default: + c--; + break; + } + } + return c; +} + + +void _Pragma( "entrypoint" ) cover_main( void ) +{ + cover_cnt = cover_swi10( cover_cnt ); + + cover_cnt = cover_swi50( cover_cnt ); + + cover_cnt = cover_swi120( cover_cnt ); +} + + +/* + Main function +*/ + +int main( void ) +{ + cover_init(); + cover_main(); + + return cover_return(); +} diff --git a/targets/wasm-tacle/test/cover/generated/default/cover.wasm b/targets/wasm-tacle/test/cover/generated/default/cover.wasm new file mode 100755 index 0000000000000000000000000000000000000000..3011ae2428db80ce76b9935fefe2ad8f50260be4 GIT binary patch literal 594 zcmZ{gv2NQi5Qgta#c`w*3S6M*=x#0y8;Mc0$f&VE$985Y>7pv3NP(o%XsL`ML&i>h zsy>j%(sojKXpaPOy!&`R_=9u}LWp!+_Nvym%X5r?0pJUM#fAZ{AZ#4iD;x{aT3I#n zL>bfOrqd+=k2oTWj<7|HRokPx# literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/test/cover/generated/default/cover.wat b/targets/wasm-tacle/test/cover/generated/default/cover.wat new file mode 100644 index 0000000..290fbd4 --- /dev/null +++ b/targets/wasm-tacle/test/cover/generated/default/cover.wat @@ -0,0 +1,61 @@ +(module $cover.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $cover_main (type 1) + (local i32) + i32.const 0 + i32.load offset=1024 + local.set 0 + i32.const 10 + i32.const 10 + call $__pragma_loopbound + i32.const 0 + local.get 0 + i32.const 10 + i32.add + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 0 + i32.const 50 + i32.const 50 + call $__pragma_loopbound + i32.const 0 + local.get 0 + i32.const 50 + i32.add + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 0 + i32.const 120 + i32.const 120 + call $__pragma_loopbound + i32.const 0 + local.get 0 + i32.const 120 + i32.add + i32.store offset=1024) + (func $__original_main (type 2) (result i32) + i32.const 0 + i32.const 0 + i32.store offset=1024 + call $cover_main + i32.const 0 + i32.load offset=1024 + i32.const -180 + i32.add) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 5136)) + (global (;1;) i32 (i32.const 1028)) + (global (;2;) i32 (i32.const 5136)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $cover_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/test/cover/generated/modified_sources/default/cover.c b/targets/wasm-tacle/test/cover/generated/modified_sources/default/cover.c new file mode 100644 index 0000000..3a50380 --- /dev/null +++ b/targets/wasm-tacle/test/cover/generated/modified_sources/default/cover.c @@ -0,0 +1,699 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: cover + + Author: unknown + + Function: A program for testing many paths generated by switch-case + statements. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cover/cover.c + + Original name: cover + + Changes: See ChangeLog.txt + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void cover_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cover_main(void); +int cover_return(void); +int cover_swi10(int); +int cover_swi50(int); +int cover_swi120(int); + +/* + Declaration of global variables +*/ + +static volatile int cover_cnt; + +/* + Initialization- and return-value-related functions +*/ + +void +cover_init(void) { + cover_cnt = 0; +} + +int +cover_return(void) { + return cover_cnt - 180; +} + +/* + Core benchmark functions +*/ + +int +cover_swi120(int c) { + int i; + + __pragma_loopbound(120, 120); + for (i = 0; i < 120; i++) { + switch (i) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + case 10: + c++; + break; + case 11: + c++; + break; + case 12: + c++; + break; + case 13: + c++; + break; + case 14: + c++; + break; + case 15: + c++; + break; + case 16: + c++; + break; + case 17: + c++; + break; + case 18: + c++; + break; + case 19: + c++; + break; + case 20: + c++; + break; + case 21: + c++; + break; + case 22: + c++; + break; + case 23: + c++; + break; + case 24: + c++; + break; + case 25: + c++; + break; + case 26: + c++; + break; + case 27: + c++; + break; + case 28: + c++; + break; + case 29: + c++; + break; + case 30: + c++; + break; + case 31: + c++; + break; + case 32: + c++; + break; + case 33: + c++; + break; + case 34: + c++; + break; + case 35: + c++; + break; + case 36: + c++; + break; + case 37: + c++; + break; + case 38: + c++; + break; + case 39: + c++; + break; + case 40: + c++; + break; + case 41: + c++; + break; + case 42: + c++; + break; + case 43: + c++; + break; + case 44: + c++; + break; + case 45: + c++; + break; + case 46: + c++; + break; + case 47: + c++; + break; + case 48: + c++; + break; + case 49: + c++; + break; + case 50: + c++; + break; + case 51: + c++; + break; + case 52: + c++; + break; + case 53: + c++; + break; + case 54: + c++; + break; + case 55: + c++; + break; + case 56: + c++; + break; + case 57: + c++; + break; + case 58: + c++; + break; + case 59: + c++; + break; + case 60: + c++; + break; + case 61: + c++; + break; + case 62: + c++; + break; + case 63: + c++; + break; + case 64: + c++; + break; + case 65: + c++; + break; + case 66: + c++; + break; + case 67: + c++; + break; + case 68: + c++; + break; + case 69: + c++; + break; + case 70: + c++; + break; + case 71: + c++; + break; + case 72: + c++; + break; + case 73: + c++; + break; + case 74: + c++; + break; + case 75: + c++; + break; + case 76: + c++; + break; + case 77: + c++; + break; + case 78: + c++; + break; + case 79: + c++; + break; + case 80: + c++; + break; + case 81: + c++; + break; + case 82: + c++; + break; + case 83: + c++; + break; + case 84: + c++; + break; + case 85: + c++; + break; + case 86: + c++; + break; + case 87: + c++; + break; + case 88: + c++; + break; + case 89: + c++; + break; + case 90: + c++; + break; + case 91: + c++; + break; + case 92: + c++; + break; + case 93: + c++; + break; + case 94: + c++; + break; + case 95: + c++; + break; + case 96: + c++; + break; + case 97: + c++; + break; + case 98: + c++; + break; + case 99: + c++; + break; + case 100: + c++; + break; + case 101: + c++; + break; + case 102: + c++; + break; + case 103: + c++; + break; + case 104: + c++; + break; + case 105: + c++; + break; + case 106: + c++; + break; + case 107: + c++; + break; + case 108: + c++; + break; + case 109: + c++; + break; + case 110: + c++; + break; + case 111: + c++; + break; + case 112: + c++; + break; + case 113: + c++; + break; + case 114: + c++; + break; + case 115: + c++; + break; + case 116: + c++; + break; + case 117: + c++; + break; + case 118: + c++; + break; + case 119: + c++; + break; + default: + c--; + break; + } + } + return c; +} + +int +cover_swi50(int c) { + int i; + + __pragma_loopbound(50, 50); + for (i = 0; i < 50; i++) { + switch (i) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + case 10: + c++; + break; + case 11: + c++; + break; + case 12: + c++; + break; + case 13: + c++; + break; + case 14: + c++; + break; + case 15: + c++; + break; + case 16: + c++; + break; + case 17: + c++; + break; + case 18: + c++; + break; + case 19: + c++; + break; + case 20: + c++; + break; + case 21: + c++; + break; + case 22: + c++; + break; + case 23: + c++; + break; + case 24: + c++; + break; + case 25: + c++; + break; + case 26: + c++; + break; + case 27: + c++; + break; + case 28: + c++; + break; + case 29: + c++; + break; + case 30: + c++; + break; + case 31: + c++; + break; + case 32: + c++; + break; + case 33: + c++; + break; + case 34: + c++; + break; + case 35: + c++; + break; + case 36: + c++; + break; + case 37: + c++; + break; + case 38: + c++; + break; + case 39: + c++; + break; + case 40: + c++; + break; + case 41: + c++; + break; + case 42: + c++; + break; + case 43: + c++; + break; + case 44: + c++; + break; + case 45: + c++; + break; + case 46: + c++; + break; + case 47: + c++; + break; + case 48: + c++; + break; + case 49: + c++; + break; + case 50: + c++; + break; + case 51: + c++; + break; + case 52: + c++; + break; + case 53: + c++; + break; + case 54: + c++; + break; + case 55: + c++; + break; + case 56: + c++; + break; + case 57: + c++; + break; + case 58: + c++; + break; + case 59: + c++; + break; + default: + c--; + break; + } + } + return c; +} + +int +cover_swi10(int c) { + int i; + + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + switch (i) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + default: + c--; + break; + } + } + return c; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cover_main(void) { + cover_cnt = cover_swi10(cover_cnt); + + cover_cnt = cover_swi50(cover_cnt); + + cover_cnt = cover_swi120(cover_cnt); +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cover_init(); + cover_main(); + + return cover_return(); +} diff --git a/targets/wasm-tacle/test/cover/generated/modified_sources/inline/cover.c b/targets/wasm-tacle/test/cover/generated/modified_sources/inline/cover.c new file mode 100644 index 0000000..aa2a84a --- /dev/null +++ b/targets/wasm-tacle/test/cover/generated/modified_sources/inline/cover.c @@ -0,0 +1,705 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version 2.0 + + Name: cover + + Author: unknown + + Function: A program for testing many paths generated by switch-case + statements. + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cover/cover.c + + Original name: cover + + Changes: See ChangeLog.txt + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void cover_init(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cover_main(void); +__attribute__((always_inline)) static inline int cover_return(void); +__attribute__((always_inline)) static inline int cover_swi10(int); +__attribute__((always_inline)) static inline int cover_swi50(int); +__attribute__((always_inline)) static inline int cover_swi120(int); + +/* + Declaration of global variables +*/ + +static volatile int cover_cnt; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +cover_init(void) { + cover_cnt = 0; +} + +__attribute__((always_inline)) static inline int +cover_return(void) { + return cover_cnt - 180; +} + +/* + Core benchmark functions +*/ + +__attribute__((always_inline)) static inline int +cover_swi120(int c) { + int i; + + __pragma_loopbound(120, 120); + for (i = 0; i < 120; i++) { + switch (i) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + case 10: + c++; + break; + case 11: + c++; + break; + case 12: + c++; + break; + case 13: + c++; + break; + case 14: + c++; + break; + case 15: + c++; + break; + case 16: + c++; + break; + case 17: + c++; + break; + case 18: + c++; + break; + case 19: + c++; + break; + case 20: + c++; + break; + case 21: + c++; + break; + case 22: + c++; + break; + case 23: + c++; + break; + case 24: + c++; + break; + case 25: + c++; + break; + case 26: + c++; + break; + case 27: + c++; + break; + case 28: + c++; + break; + case 29: + c++; + break; + case 30: + c++; + break; + case 31: + c++; + break; + case 32: + c++; + break; + case 33: + c++; + break; + case 34: + c++; + break; + case 35: + c++; + break; + case 36: + c++; + break; + case 37: + c++; + break; + case 38: + c++; + break; + case 39: + c++; + break; + case 40: + c++; + break; + case 41: + c++; + break; + case 42: + c++; + break; + case 43: + c++; + break; + case 44: + c++; + break; + case 45: + c++; + break; + case 46: + c++; + break; + case 47: + c++; + break; + case 48: + c++; + break; + case 49: + c++; + break; + case 50: + c++; + break; + case 51: + c++; + break; + case 52: + c++; + break; + case 53: + c++; + break; + case 54: + c++; + break; + case 55: + c++; + break; + case 56: + c++; + break; + case 57: + c++; + break; + case 58: + c++; + break; + case 59: + c++; + break; + case 60: + c++; + break; + case 61: + c++; + break; + case 62: + c++; + break; + case 63: + c++; + break; + case 64: + c++; + break; + case 65: + c++; + break; + case 66: + c++; + break; + case 67: + c++; + break; + case 68: + c++; + break; + case 69: + c++; + break; + case 70: + c++; + break; + case 71: + c++; + break; + case 72: + c++; + break; + case 73: + c++; + break; + case 74: + c++; + break; + case 75: + c++; + break; + case 76: + c++; + break; + case 77: + c++; + break; + case 78: + c++; + break; + case 79: + c++; + break; + case 80: + c++; + break; + case 81: + c++; + break; + case 82: + c++; + break; + case 83: + c++; + break; + case 84: + c++; + break; + case 85: + c++; + break; + case 86: + c++; + break; + case 87: + c++; + break; + case 88: + c++; + break; + case 89: + c++; + break; + case 90: + c++; + break; + case 91: + c++; + break; + case 92: + c++; + break; + case 93: + c++; + break; + case 94: + c++; + break; + case 95: + c++; + break; + case 96: + c++; + break; + case 97: + c++; + break; + case 98: + c++; + break; + case 99: + c++; + break; + case 100: + c++; + break; + case 101: + c++; + break; + case 102: + c++; + break; + case 103: + c++; + break; + case 104: + c++; + break; + case 105: + c++; + break; + case 106: + c++; + break; + case 107: + c++; + break; + case 108: + c++; + break; + case 109: + c++; + break; + case 110: + c++; + break; + case 111: + c++; + break; + case 112: + c++; + break; + case 113: + c++; + break; + case 114: + c++; + break; + case 115: + c++; + break; + case 116: + c++; + break; + case 117: + c++; + break; + case 118: + c++; + break; + case 119: + c++; + break; + default: + c--; + break; + } + } + return c; +} + +__attribute__((always_inline)) static inline int +cover_swi50(int c) { + int i; + + __pragma_loopbound(50, 50); + for (i = 0; i < 50; i++) { + switch (i) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + case 10: + c++; + break; + case 11: + c++; + break; + case 12: + c++; + break; + case 13: + c++; + break; + case 14: + c++; + break; + case 15: + c++; + break; + case 16: + c++; + break; + case 17: + c++; + break; + case 18: + c++; + break; + case 19: + c++; + break; + case 20: + c++; + break; + case 21: + c++; + break; + case 22: + c++; + break; + case 23: + c++; + break; + case 24: + c++; + break; + case 25: + c++; + break; + case 26: + c++; + break; + case 27: + c++; + break; + case 28: + c++; + break; + case 29: + c++; + break; + case 30: + c++; + break; + case 31: + c++; + break; + case 32: + c++; + break; + case 33: + c++; + break; + case 34: + c++; + break; + case 35: + c++; + break; + case 36: + c++; + break; + case 37: + c++; + break; + case 38: + c++; + break; + case 39: + c++; + break; + case 40: + c++; + break; + case 41: + c++; + break; + case 42: + c++; + break; + case 43: + c++; + break; + case 44: + c++; + break; + case 45: + c++; + break; + case 46: + c++; + break; + case 47: + c++; + break; + case 48: + c++; + break; + case 49: + c++; + break; + case 50: + c++; + break; + case 51: + c++; + break; + case 52: + c++; + break; + case 53: + c++; + break; + case 54: + c++; + break; + case 55: + c++; + break; + case 56: + c++; + break; + case 57: + c++; + break; + case 58: + c++; + break; + case 59: + c++; + break; + default: + c--; + break; + } + } + return c; +} + +__attribute__((always_inline)) static inline int +cover_swi10(int c) { + int i; + + __pragma_loopbound(10, 10); + for (i = 0; i < 10; i++) { + switch (i) { + case 0: + c++; + break; + case 1: + c++; + break; + case 2: + c++; + break; + case 3: + c++; + break; + case 4: + c++; + break; + case 5: + c++; + break; + case 6: + c++; + break; + case 7: + c++; + break; + case 8: + c++; + break; + case 9: + c++; + break; + default: + c--; + break; + } + } + return c; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +cover_main(void) { + cover_cnt = cover_swi10(cover_cnt); + + cover_cnt = cover_swi50(cover_cnt); + + cover_cnt = cover_swi120(cover_cnt); +} + +/* + Main function +*/ + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + cover_init(); + cover_main(); + + return cover_return(); +} diff --git a/targets/wasm-tacle/test/duff/CMakeLists.txt b/targets/wasm-tacle/test/duff/CMakeLists.txt new file mode 100644 index 0000000..8f6d1c3 --- /dev/null +++ b/targets/wasm-tacle/test/duff/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(duff) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/duff.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/duff.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/test/duff/changeLog.txt b/targets/wasm-tacle/test/duff/changeLog.txt new file mode 100755 index 0000000..f0e14eb --- /dev/null +++ b/targets/wasm-tacle/test/duff/changeLog.txt @@ -0,0 +1,40 @@ +File: duff.c +Original provenience: Mälardalen benchmark suite, +ww.mrtc.mdh.se/projects/wcet/wcet_bench/duff/duff.c + + +2015-12-21: +- Susbstituted #define ARRAYSIZE 100 +- Susbstituted #define INVOCATION_COUNT 43 +- Renamed each function FUNC to duff_FUNC +- Changed the order of parameters in the functio call + duff_copy( duff_target, duff_source, 43 ). Original version was not working. +- Added functions duff_init, duff_return and main +- Added forward declarations of all functions before the declarations of global + variables +- Used duff_target[0] as the return value +- Re-ordered functions to fit template-order +- Applied code formatting according to the following rules + (incomplete, to be discussed; I basically used astyle with the attached + options file): + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: st_) followed by lowercase letter (e.g., st_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Added general TACLeBench header to beginning of source code \ No newline at end of file diff --git a/targets/wasm-tacle/test/duff/duff.c b/targets/wasm-tacle/test/duff/duff.c new file mode 100755 index 0000000..9fb49f1 --- /dev/null +++ b/targets/wasm-tacle/test/duff/duff.c @@ -0,0 +1,133 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: duff + + Author: Jakob Engblom + + Function: Duff's device + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/duff/duff.c + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + + +/* + Forward declaration of functions +*/ + +void duff_copy( char *to, char *from, int count ); +void duff_initialize( char *arr, int length ); +void duff_init(); +void duff_main( void ); +int duff_return( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +char duff_source[ 100 ]; +char duff_target[ 100 ]; + + +/* + Initialization- and return-value-related functions +*/ + +void duff_init() +{ + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + duff_initialize( duff_source, 100 ); + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &duff_source[ 0 ]; + _Pragma( "loopbound min 400 max 400" ) + for ( i = 0; i < sizeof( duff_source ); ++i, ++p ) + *p ^= bitmask; +} + + +int duff_return( void ) +{ + return ( duff_target[ 28 ] - 72 != 0 ); +} + + +/* + Algorithm core functions +*/ + +void duff_initialize( char *arr, int length ) +{ + int i; + + _Pragma( "loopbound min 100 max 100" ) + for ( i = 0; i < length; i++ ) + arr[ i ] = length - i; +} + + +void duff_copy( char *to, char *from, int count ) +{ + int n = ( count + 7 ) / 8; + + _Pragma( "marker outside" ) + switch ( count % 8 ) { + case 0: + do { + *to++ = *from++; + case 7: + *to++ = *from++; + case 6: + *to++ = *from++; + case 5: + *to++ = *from++; + case 4: + *to++ = *from++; + case 3: + *to++ = *from++; + case 2: + *to++ = *from++; + case 1: + _Pragma( "marker inside" ) + *to++ = *from++; + + + } while ( --n > 0 ); + } + _Pragma( "flowrestriction 1*inside <= 6*outside" ) +} + + +/* + Main functions +*/ + +void _Pragma( "entrypoint" ) duff_main( void ) +{ + duff_copy( duff_target, duff_source, 43 ); +} + + +int main( void ) +{ + duff_init(); + duff_main(); + + return ( duff_return() ); +} + diff --git a/targets/wasm-tacle/test/duff/generated/default/duff.wasm b/targets/wasm-tacle/test/duff/generated/default/duff.wasm new file mode 100755 index 0000000000000000000000000000000000000000..de9d3ec37bc025429ed28787401b8e2ee1ddb636 GIT binary patch literal 909 zcmZ{i&2G~`5XWb{PMVKaj)H_Zx`9KY$f2!JtA-0cRfsE`w`+S7ocK#?8_3C_PzfX| zA*3FV;K+eT;0?IL0~9E5g#$+<);4KQS&!D^-*{(cM}J_kk06&;b7r0!Ob1)2f(n2e z!Y*Kok zvxr(O=0s_HB1D1aD+E(M2F#z$=P-m{`70+~c$~Yt@OwdeaGbk)@MlR*O7eF}PD^t9 z{C}Pvye-Mef^^|sPIlpRL9WC5oZN)hIca`SkYrcqa)H^JcHmm+!Y1mnu_0*YIY?_2 znB3CQe3~Dhm}j8lbO>@cpOoawk{p%f>yi`~oS5I1q!_|P=Dx^NnRHNoA8bI=d`YC0 zRn0fqCKjd7i?kg@R}5KL4pNKD4!*An{8$zExhkN_CS(Jxqhcho#*2JT#W-4%ays(L zAK{=0LJgSDp;33z(P)rs1@EZPUdWGL$PZUaNh!|KTtP&mG!*XG4VYJewKjreal-5= zEwsi3?AId^I;qV?jO)_1c^q@cux7Y^&q{+N)oqUj 0); + } + _Pragma("flowrestriction 1*inside <= 6*outside") +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +duff_main(void) { + duff_copy(duff_target, duff_source, 43); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + duff_init(); + duff_main(); + + return (duff_return()); +} diff --git a/targets/wasm-tacle/test/duff/generated/modified_sources/inline/duff.c b/targets/wasm-tacle/test/duff/generated/modified_sources/inline/duff.c new file mode 100644 index 0000000..4f2967d --- /dev/null +++ b/targets/wasm-tacle/test/duff/generated/modified_sources/inline/duff.c @@ -0,0 +1,137 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: duff + + Author: Jakob Engblom + + Function: Duff's device + + Source: MRTC + http://www.mrtc.mdh.se/projects/wcet/wcet_bench/duff/duff.c + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void +duff_copy(char *to, char *from, int count); +__attribute__((always_inline)) static inline void duff_initialize(char *arr, + int length); +__attribute__((always_inline)) static inline void duff_init(); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +duff_main(void); +__attribute__((always_inline)) static inline int duff_return(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +char duff_source[100]; +char duff_target[100]; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +duff_init() { + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + duff_initialize(duff_source, 100); + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &duff_source[0]; + __pragma_loopbound(400, 400); + for (i = 0; i < sizeof(duff_source); ++i, ++p) + *p ^= bitmask; +} + +__attribute__((always_inline)) static inline int +duff_return(void) { + return (duff_target[28] - 72 != 0); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +duff_initialize(char *arr, int length) { + int i; + + __pragma_loopbound(100, 100); + for (i = 0; i < length; i++) + arr[i] = length - i; +} + +__attribute__((always_inline)) static inline void +duff_copy(char *to, char *from, int count) { + int n = (count + 7) / 8; + + _Pragma("marker outside") switch (count % 8) { + case 0: + do { + *to++ = *from++; + case 7: + *to++ = *from++; + case 6: + *to++ = *from++; + case 5: + *to++ = *from++; + case 4: + *to++ = *from++; + case 3: + *to++ = *from++; + case 2: + *to++ = *from++; + case 1: + _Pragma("marker inside") *to++ = *from++; + + } while (--n > 0); + } + _Pragma("flowrestriction 1*inside <= 6*outside") +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +duff_main(void) { + duff_copy(duff_target, duff_source, 43); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + duff_init(); + duff_main(); + + return (duff_return()); +} diff --git a/targets/wasm-tacle/test/test3/CMakeLists.txt b/targets/wasm-tacle/test/test3/CMakeLists.txt new file mode 100644 index 0000000..724e73d --- /dev/null +++ b/targets/wasm-tacle/test/test3/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(test3) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/test3.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/test3.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/test/test3/ChangeLog.txt b/targets/wasm-tacle/test/test3/ChangeLog.txt new file mode 100755 index 0000000..be2cca5 --- /dev/null +++ b/targets/wasm-tacle/test/test3/ChangeLog.txt @@ -0,0 +1,37 @@ +File: test3.c +Original provenience: Universitaet des Saarlandes, Saarbruecken, Germany + Compiler Research Group + +2015-10-18: +- Removed original header comment, replaced by TACLeBench header. +- Added prefix "test3_" to all global symbols. +- Added explicit forward declarations of functions. +- Replaced initialization code by TACLeBench-compliant initialization code. + Added pseudo-random initialization of the global arrays "test3_array1" ... + "test3_array8". +- Added new function test3_return producing a checksum as return value. +- Added new function test3_main according to TACLeBench guidelines. + test3_main is annotated as entry-point for timing analysis. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur +- Sanity check: Replaced all expressions 'x >> 1' by 'x >>= 1' in order to + eliminate compiler warnings showing that 'x >> 1' makes no sense. diff --git a/targets/wasm-tacle/test/test3/generated/default/test3.wasm b/targets/wasm-tacle/test/test3/generated/default/test3.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b9e9af701d6fae32ab9a2e8aa7c7dbe3d30a773c GIT binary patch literal 69499 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 literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/test/test3/generated/default/test3.wat b/targets/wasm-tacle/test/test3/generated/default/test3.wat new file mode 100644 index 0000000..34602c3 --- /dev/null +++ b/targets/wasm-tacle/test/test3/generated/default/test3.wat @@ -0,0 +1,19779 @@ +(module $test3.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $test3_init (type 1) + (local i32 i32) + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 5264 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 5268 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 9360 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 9364 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 13456 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 13460 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 17552 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 17556 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 21648 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 21652 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 25744 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 25748 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 29840 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 29844 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const -128 + local.set 0 + loop ;; label = @1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + i32.const 0 + i32.load offset=1024 + local.set 1 + i32.const 0 + i32.const 0 + i32.load offset=1024 + i32.const 133 + i32.mul + i32.const 81 + i32.add + i32.const 8095 + i32.rem_s + i32.store offset=1024 + local.get 0 + i32.const 33936 + i32.add + local.get 1 + i32.store + local.get 0 + i32.const 33940 + i32.add + i32.const 0 + i32.load offset=1024 + i32.store + local.get 0 + i32.const 8 + i32.add + local.tee 0 + br_if 0 (;@1;) + end + i32.const 0 + i32.const 0 + i32.store offset=33808) + (func $test3_func_10_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=19460 + i32.const 0 + i32.load offset=19456 + i32.const 0 + i32.load offset=19452 + i32.const 0 + i32.load offset=19448 + i32.const 0 + i32.load offset=19444 + i32.const 0 + i32.load offset=19440 + i32.const 0 + i32.load offset=19436 + i32.const 0 + i32.load offset=19432 + i32.const 0 + i32.load offset=19428 + i32.const 0 + i32.load offset=19424 + i32.const 0 + i32.load offset=19420 + i32.const 0 + i32.load offset=19408 + i32.const 0 + i32.load offset=19400 + i32.const 0 + i32.load offset=19392 + i32.const 0 + i32.load offset=19384 + i32.const 0 + i32.load offset=19376 + i32.const 0 + i32.load offset=19368 + i32.const 0 + i32.load offset=19360 + i32.const 0 + i32.load offset=19352 + i32.const 0 + i32.load offset=19344 + i32.const 0 + i32.load offset=19336 + i32.const 0 + i32.load offset=19328 + i32.const 0 + i32.load offset=19304 + i32.const 0 + i32.load offset=19288 + i32.const 0 + i32.load offset=19272 + i32.const 0 + i32.load offset=19256 + i32.const 0 + i32.load offset=19240 + i32.const 0 + i32.load offset=19224 + i32.const 0 + i32.load offset=19208 + i32.const 0 + i32.load offset=19192 + i32.const 0 + i32.load offset=19176 + i32.const 0 + i32.load offset=19160 + i32.const 0 + i32.load offset=19144 + i32.const 0 + i32.load offset=19096 + i32.const 0 + i32.load offset=19064 + i32.const 0 + i32.load offset=19032 + i32.const 0 + i32.load offset=19000 + i32.const 0 + i32.load offset=18968 + i32.const 0 + i32.load offset=18936 + i32.const 0 + i32.load offset=18904 + i32.const 0 + i32.load offset=18872 + i32.const 0 + i32.load offset=18840 + i32.const 0 + i32.load offset=18808 + i32.const 0 + i32.load offset=18776 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18744 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19128 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19320 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19416 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=15236 + i32.const 0 + i32.load offset=15232 + i32.const 0 + i32.load offset=15228 + i32.const 0 + i32.load offset=15224 + i32.const 0 + i32.load offset=15220 + i32.const 0 + i32.load offset=15216 + i32.const 0 + i32.load offset=15212 + i32.const 0 + i32.load offset=15208 + i32.const 0 + i32.load offset=15204 + i32.const 0 + i32.load offset=15200 + i32.const 0 + i32.load offset=15196 + i32.const 0 + i32.load offset=15184 + i32.const 0 + i32.load offset=15176 + i32.const 0 + i32.load offset=15168 + i32.const 0 + i32.load offset=15160 + i32.const 0 + i32.load offset=15152 + i32.const 0 + i32.load offset=15144 + i32.const 0 + i32.load offset=15136 + i32.const 0 + i32.load offset=15128 + i32.const 0 + i32.load offset=15120 + i32.const 0 + i32.load offset=15112 + i32.const 0 + i32.load offset=15104 + i32.const 0 + i32.load offset=15080 + i32.const 0 + i32.load offset=15064 + i32.const 0 + i32.load offset=15048 + i32.const 0 + i32.load offset=15032 + i32.const 0 + i32.load offset=15016 + i32.const 0 + i32.load offset=15000 + i32.const 0 + i32.load offset=14984 + i32.const 0 + i32.load offset=14968 + i32.const 0 + i32.load offset=14952 + i32.const 0 + i32.load offset=14936 + i32.const 0 + i32.load offset=14920 + i32.const 0 + i32.load offset=14872 + i32.const 0 + i32.load offset=14840 + i32.const 0 + i32.load offset=14808 + i32.const 0 + i32.load offset=14776 + i32.const 0 + i32.load offset=14744 + i32.const 0 + i32.load offset=14712 + i32.const 0 + i32.load offset=14680 + i32.const 0 + i32.load offset=14648 + i32.const 0 + i32.load offset=14616 + i32.const 0 + i32.load offset=14584 + i32.const 0 + i32.load offset=14552 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14520 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14904 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15096 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15192 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_10) + (func $test3_func_8_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=11012 + i32.const 0 + i32.load offset=11008 + i32.const 0 + i32.load offset=11004 + i32.const 0 + i32.load offset=11000 + i32.const 0 + i32.load offset=10996 + i32.const 0 + i32.load offset=10992 + i32.const 0 + i32.load offset=10988 + i32.const 0 + i32.load offset=10984 + i32.const 0 + i32.load offset=10980 + i32.const 0 + i32.load offset=10976 + i32.const 0 + i32.load offset=10972 + i32.const 0 + i32.load offset=10960 + i32.const 0 + i32.load offset=10952 + i32.const 0 + i32.load offset=10944 + i32.const 0 + i32.load offset=10936 + i32.const 0 + i32.load offset=10928 + i32.const 0 + i32.load offset=10920 + i32.const 0 + i32.load offset=10912 + i32.const 0 + i32.load offset=10904 + i32.const 0 + i32.load offset=10896 + i32.const 0 + i32.load offset=10888 + i32.const 0 + i32.load offset=10880 + i32.const 0 + i32.load offset=10856 + i32.const 0 + i32.load offset=10840 + i32.const 0 + i32.load offset=10824 + i32.const 0 + i32.load offset=10808 + i32.const 0 + i32.load offset=10792 + i32.const 0 + i32.load offset=10776 + i32.const 0 + i32.load offset=10760 + i32.const 0 + i32.load offset=10744 + i32.const 0 + i32.load offset=10728 + i32.const 0 + i32.load offset=10712 + i32.const 0 + i32.load offset=10696 + i32.const 0 + i32.load offset=10648 + i32.const 0 + i32.load offset=10616 + i32.const 0 + i32.load offset=10584 + i32.const 0 + i32.load offset=10552 + i32.const 0 + i32.load offset=10520 + i32.const 0 + i32.load offset=10488 + i32.const 0 + i32.load offset=10456 + i32.const 0 + i32.load offset=10424 + i32.const 0 + i32.load offset=10392 + i32.const 0 + i32.load offset=10360 + i32.const 0 + i32.load offset=10328 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10296 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10680 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10872 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10968 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_10) + (func $test3_func_7_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6788 + i32.const 0 + i32.load offset=6784 + i32.const 0 + i32.load offset=6780 + i32.const 0 + i32.load offset=6776 + i32.const 0 + i32.load offset=6772 + i32.const 0 + i32.load offset=6768 + i32.const 0 + i32.load offset=6764 + i32.const 0 + i32.load offset=6760 + i32.const 0 + i32.load offset=6756 + i32.const 0 + i32.load offset=6752 + i32.const 0 + i32.load offset=6748 + i32.const 0 + i32.load offset=6736 + i32.const 0 + i32.load offset=6728 + i32.const 0 + i32.load offset=6720 + i32.const 0 + i32.load offset=6712 + i32.const 0 + i32.load offset=6704 + i32.const 0 + i32.load offset=6696 + i32.const 0 + i32.load offset=6688 + i32.const 0 + i32.load offset=6680 + i32.const 0 + i32.load offset=6672 + i32.const 0 + i32.load offset=6664 + i32.const 0 + i32.load offset=6656 + i32.const 0 + i32.load offset=6632 + i32.const 0 + i32.load offset=6616 + i32.const 0 + i32.load offset=6600 + i32.const 0 + i32.load offset=6584 + i32.const 0 + i32.load offset=6568 + i32.const 0 + i32.load offset=6552 + i32.const 0 + i32.load offset=6536 + i32.const 0 + i32.load offset=6520 + i32.const 0 + i32.load offset=6504 + i32.const 0 + i32.load offset=6488 + i32.const 0 + i32.load offset=6472 + i32.const 0 + i32.load offset=6424 + i32.const 0 + i32.load offset=6392 + i32.const 0 + i32.load offset=6360 + i32.const 0 + i32.load offset=6328 + i32.const 0 + i32.load offset=6296 + i32.const 0 + i32.load offset=6264 + i32.const 0 + i32.load offset=6232 + i32.const 0 + i32.load offset=6200 + i32.const 0 + i32.load offset=6168 + i32.const 0 + i32.load offset=6136 + i32.const 0 + i32.load offset=6104 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6072 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6456 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6648 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6744 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_10) + (func $test3_func_6_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2564 + i32.const 0 + i32.load offset=2560 + i32.const 0 + i32.load offset=2556 + i32.const 0 + i32.load offset=2552 + i32.const 0 + i32.load offset=2548 + i32.const 0 + i32.load offset=2544 + i32.const 0 + i32.load offset=2540 + i32.const 0 + i32.load offset=2536 + i32.const 0 + i32.load offset=2532 + i32.const 0 + i32.load offset=2528 + i32.const 0 + i32.load offset=2524 + i32.const 0 + i32.load offset=2512 + i32.const 0 + i32.load offset=2504 + i32.const 0 + i32.load offset=2496 + i32.const 0 + i32.load offset=2488 + i32.const 0 + i32.load offset=2480 + i32.const 0 + i32.load offset=2472 + i32.const 0 + i32.load offset=2464 + i32.const 0 + i32.load offset=2456 + i32.const 0 + i32.load offset=2448 + i32.const 0 + i32.load offset=2440 + i32.const 0 + i32.load offset=2432 + i32.const 0 + i32.load offset=2408 + i32.const 0 + i32.load offset=2392 + i32.const 0 + i32.load offset=2376 + i32.const 0 + i32.load offset=2360 + i32.const 0 + i32.load offset=2344 + i32.const 0 + i32.load offset=2328 + i32.const 0 + i32.load offset=2312 + i32.const 0 + i32.load offset=2296 + i32.const 0 + i32.load offset=2280 + i32.const 0 + i32.load offset=2264 + i32.const 0 + i32.load offset=2248 + i32.const 0 + i32.load offset=2200 + i32.const 0 + i32.load offset=2168 + i32.const 0 + i32.load offset=2136 + i32.const 0 + i32.load offset=2104 + i32.const 0 + i32.load offset=2072 + i32.const 0 + i32.load offset=2040 + i32.const 0 + i32.load offset=2008 + i32.const 0 + i32.load offset=1976 + i32.const 0 + i32.load offset=1944 + i32.const 0 + i32.load offset=1912 + i32.const 0 + i32.load offset=1880 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1848 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2232 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2424 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2520 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_10) + (func $test3_func_5_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31108 + i32.const 0 + i32.load offset=31104 + i32.const 0 + i32.load offset=31100 + i32.const 0 + i32.load offset=31096 + i32.const 0 + i32.load offset=31092 + i32.const 0 + i32.load offset=31088 + i32.const 0 + i32.load offset=31084 + i32.const 0 + i32.load offset=31080 + i32.const 0 + i32.load offset=31076 + i32.const 0 + i32.load offset=31072 + i32.const 0 + i32.load offset=31068 + i32.const 0 + i32.load offset=31056 + i32.const 0 + i32.load offset=31048 + i32.const 0 + i32.load offset=31040 + i32.const 0 + i32.load offset=31032 + i32.const 0 + i32.load offset=31024 + i32.const 0 + i32.load offset=31016 + i32.const 0 + i32.load offset=31008 + i32.const 0 + i32.load offset=31000 + i32.const 0 + i32.load offset=30992 + i32.const 0 + i32.load offset=30984 + i32.const 0 + i32.load offset=30976 + i32.const 0 + i32.load offset=30952 + i32.const 0 + i32.load offset=30936 + i32.const 0 + i32.load offset=30920 + i32.const 0 + i32.load offset=30904 + i32.const 0 + i32.load offset=30888 + i32.const 0 + i32.load offset=30872 + i32.const 0 + i32.load offset=30856 + i32.const 0 + i32.load offset=30840 + i32.const 0 + i32.load offset=30824 + i32.const 0 + i32.load offset=30808 + i32.const 0 + i32.load offset=30792 + i32.const 0 + i32.load offset=30744 + i32.const 0 + i32.load offset=30712 + i32.const 0 + i32.load offset=30680 + i32.const 0 + i32.load offset=30648 + i32.const 0 + i32.load offset=30616 + i32.const 0 + i32.load offset=30584 + i32.const 0 + i32.load offset=30552 + i32.const 0 + i32.load offset=30520 + i32.const 0 + i32.load offset=30488 + i32.const 0 + i32.load offset=30456 + i32.const 0 + i32.load offset=30424 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30392 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30776 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30968 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31064 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_10) + (func $test3_func_4_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26884 + i32.const 0 + i32.load offset=26880 + i32.const 0 + i32.load offset=26876 + i32.const 0 + i32.load offset=26872 + i32.const 0 + i32.load offset=26868 + i32.const 0 + i32.load offset=26864 + i32.const 0 + i32.load offset=26860 + i32.const 0 + i32.load offset=26856 + i32.const 0 + i32.load offset=26852 + i32.const 0 + i32.load offset=26848 + i32.const 0 + i32.load offset=26844 + i32.const 0 + i32.load offset=26832 + i32.const 0 + i32.load offset=26824 + i32.const 0 + i32.load offset=26816 + i32.const 0 + i32.load offset=26808 + i32.const 0 + i32.load offset=26800 + i32.const 0 + i32.load offset=26792 + i32.const 0 + i32.load offset=26784 + i32.const 0 + i32.load offset=26776 + i32.const 0 + i32.load offset=26768 + i32.const 0 + i32.load offset=26760 + i32.const 0 + i32.load offset=26752 + i32.const 0 + i32.load offset=26728 + i32.const 0 + i32.load offset=26712 + i32.const 0 + i32.load offset=26696 + i32.const 0 + i32.load offset=26680 + i32.const 0 + i32.load offset=26664 + i32.const 0 + i32.load offset=26648 + i32.const 0 + i32.load offset=26632 + i32.const 0 + i32.load offset=26616 + i32.const 0 + i32.load offset=26600 + i32.const 0 + i32.load offset=26584 + i32.const 0 + i32.load offset=26568 + i32.const 0 + i32.load offset=26520 + i32.const 0 + i32.load offset=26488 + i32.const 0 + i32.load offset=26456 + i32.const 0 + i32.load offset=26424 + i32.const 0 + i32.load offset=26392 + i32.const 0 + i32.load offset=26360 + i32.const 0 + i32.load offset=26328 + i32.const 0 + i32.load offset=26296 + i32.const 0 + i32.load offset=26264 + i32.const 0 + i32.load offset=26232 + i32.const 0 + i32.load offset=26200 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26168 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26552 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26744 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26840 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_10) + (func $test3_func_3_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22660 + i32.const 0 + i32.load offset=22656 + i32.const 0 + i32.load offset=22652 + i32.const 0 + i32.load offset=22648 + i32.const 0 + i32.load offset=22644 + i32.const 0 + i32.load offset=22640 + i32.const 0 + i32.load offset=22636 + i32.const 0 + i32.load offset=22632 + i32.const 0 + i32.load offset=22628 + i32.const 0 + i32.load offset=22624 + i32.const 0 + i32.load offset=22620 + i32.const 0 + i32.load offset=22608 + i32.const 0 + i32.load offset=22600 + i32.const 0 + i32.load offset=22592 + i32.const 0 + i32.load offset=22584 + i32.const 0 + i32.load offset=22576 + i32.const 0 + i32.load offset=22568 + i32.const 0 + i32.load offset=22560 + i32.const 0 + i32.load offset=22552 + i32.const 0 + i32.load offset=22544 + i32.const 0 + i32.load offset=22536 + i32.const 0 + i32.load offset=22528 + i32.const 0 + i32.load offset=22504 + i32.const 0 + i32.load offset=22488 + i32.const 0 + i32.load offset=22472 + i32.const 0 + i32.load offset=22456 + i32.const 0 + i32.load offset=22440 + i32.const 0 + i32.load offset=22424 + i32.const 0 + i32.load offset=22408 + i32.const 0 + i32.load offset=22392 + i32.const 0 + i32.load offset=22376 + i32.const 0 + i32.load offset=22360 + i32.const 0 + i32.load offset=22344 + i32.const 0 + i32.load offset=22296 + i32.const 0 + i32.load offset=22264 + i32.const 0 + i32.load offset=22232 + i32.const 0 + i32.load offset=22200 + i32.const 0 + i32.load offset=22168 + i32.const 0 + i32.load offset=22136 + i32.const 0 + i32.load offset=22104 + i32.const 0 + i32.load offset=22072 + i32.const 0 + i32.load offset=22040 + i32.const 0 + i32.load offset=22008 + i32.const 0 + i32.load offset=21976 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=21944 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22328 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22520 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22616 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_10) + (func $test3_func_2_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18436 + i32.const 0 + i32.load offset=18432 + i32.const 0 + i32.load offset=18428 + i32.const 0 + i32.load offset=18424 + i32.const 0 + i32.load offset=18420 + i32.const 0 + i32.load offset=18416 + i32.const 0 + i32.load offset=18412 + i32.const 0 + i32.load offset=18408 + i32.const 0 + i32.load offset=18404 + i32.const 0 + i32.load offset=18400 + i32.const 0 + i32.load offset=18396 + i32.const 0 + i32.load offset=18384 + i32.const 0 + i32.load offset=18376 + i32.const 0 + i32.load offset=18368 + i32.const 0 + i32.load offset=18360 + i32.const 0 + i32.load offset=18352 + i32.const 0 + i32.load offset=18344 + i32.const 0 + i32.load offset=18336 + i32.const 0 + i32.load offset=18328 + i32.const 0 + i32.load offset=18320 + i32.const 0 + i32.load offset=18312 + i32.const 0 + i32.load offset=18304 + i32.const 0 + i32.load offset=18280 + i32.const 0 + i32.load offset=18264 + i32.const 0 + i32.load offset=18248 + i32.const 0 + i32.load offset=18232 + i32.const 0 + i32.load offset=18216 + i32.const 0 + i32.load offset=18200 + i32.const 0 + i32.load offset=18184 + i32.const 0 + i32.load offset=18168 + i32.const 0 + i32.load offset=18152 + i32.const 0 + i32.load offset=18136 + i32.const 0 + i32.load offset=18120 + i32.const 0 + i32.load offset=18072 + i32.const 0 + i32.load offset=18040 + i32.const 0 + i32.load offset=18008 + i32.const 0 + i32.load offset=17976 + i32.const 0 + i32.load offset=17944 + i32.const 0 + i32.load offset=17912 + i32.const 0 + i32.load offset=17880 + i32.const 0 + i32.load offset=17848 + i32.const 0 + i32.load offset=17816 + i32.const 0 + i32.load offset=17784 + i32.const 0 + i32.load offset=17752 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17720 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18104 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18296 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18392 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_10) + (func $test3_func_1_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14212 + i32.const 0 + i32.load offset=14208 + i32.const 0 + i32.load offset=14204 + i32.const 0 + i32.load offset=14200 + i32.const 0 + i32.load offset=14196 + i32.const 0 + i32.load offset=14192 + i32.const 0 + i32.load offset=14188 + i32.const 0 + i32.load offset=14184 + i32.const 0 + i32.load offset=14180 + i32.const 0 + i32.load offset=14176 + i32.const 0 + i32.load offset=14172 + i32.const 0 + i32.load offset=14160 + i32.const 0 + i32.load offset=14152 + i32.const 0 + i32.load offset=14144 + i32.const 0 + i32.load offset=14136 + i32.const 0 + i32.load offset=14128 + i32.const 0 + i32.load offset=14120 + i32.const 0 + i32.load offset=14112 + i32.const 0 + i32.load offset=14104 + i32.const 0 + i32.load offset=14096 + i32.const 0 + i32.load offset=14088 + i32.const 0 + i32.load offset=14080 + i32.const 0 + i32.load offset=14056 + i32.const 0 + i32.load offset=14040 + i32.const 0 + i32.load offset=14024 + i32.const 0 + i32.load offset=14008 + i32.const 0 + i32.load offset=13992 + i32.const 0 + i32.load offset=13976 + i32.const 0 + i32.load offset=13960 + i32.const 0 + i32.load offset=13944 + i32.const 0 + i32.load offset=13928 + i32.const 0 + i32.load offset=13912 + i32.const 0 + i32.load offset=13896 + i32.const 0 + i32.load offset=13848 + i32.const 0 + i32.load offset=13816 + i32.const 0 + i32.load offset=13784 + i32.const 0 + i32.load offset=13752 + i32.const 0 + i32.load offset=13720 + i32.const 0 + i32.load offset=13688 + i32.const 0 + i32.load offset=13656 + i32.const 0 + i32.load offset=13624 + i32.const 0 + i32.load offset=13592 + i32.const 0 + i32.load offset=13560 + i32.const 0 + i32.load offset=13528 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13496 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=13880 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14072 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14168 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_10) + (func $test3_func_0_10 (type 1) + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=9988 + i32.const 0 + i32.load offset=9984 + i32.const 0 + i32.load offset=9980 + i32.const 0 + i32.load offset=9976 + i32.const 0 + i32.load offset=9972 + i32.const 0 + i32.load offset=9968 + i32.const 0 + i32.load offset=9964 + i32.const 0 + i32.load offset=9960 + i32.const 0 + i32.load offset=9956 + i32.const 0 + i32.load offset=9952 + i32.const 0 + i32.load offset=9948 + i32.const 0 + i32.load offset=9936 + i32.const 0 + i32.load offset=9928 + i32.const 0 + i32.load offset=9920 + i32.const 0 + i32.load offset=9912 + i32.const 0 + i32.load offset=9904 + i32.const 0 + i32.load offset=9896 + i32.const 0 + i32.load offset=9888 + i32.const 0 + i32.load offset=9880 + i32.const 0 + i32.load offset=9872 + i32.const 0 + i32.load offset=9864 + i32.const 0 + i32.load offset=9856 + i32.const 0 + i32.load offset=9832 + i32.const 0 + i32.load offset=9816 + i32.const 0 + i32.load offset=9800 + i32.const 0 + i32.load offset=9784 + i32.const 0 + i32.load offset=9768 + i32.const 0 + i32.load offset=9752 + i32.const 0 + i32.load offset=9736 + i32.const 0 + i32.load offset=9720 + i32.const 0 + i32.load offset=9704 + i32.const 0 + i32.load offset=9688 + i32.const 0 + i32.load offset=9672 + i32.const 0 + i32.load offset=9624 + i32.const 0 + i32.load offset=9592 + i32.const 0 + i32.load offset=9560 + i32.const 0 + i32.load offset=9528 + i32.const 0 + i32.load offset=9496 + i32.const 0 + i32.load offset=9464 + i32.const 0 + i32.load offset=9432 + i32.const 0 + i32.load offset=9400 + i32.const 0 + i32.load offset=9368 + i32.const 0 + i32.load offset=9336 + i32.const 0 + i32.load offset=9304 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9272 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9656 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9848 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9944 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_10) + (func $test3_func_10_9 (type 1) + call $test3_func_10_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=15360 + i32.const 0 + i32.load offset=15356 + i32.const 0 + i32.load offset=15352 + i32.const 0 + i32.load offset=15348 + i32.const 0 + i32.load offset=15344 + i32.const 0 + i32.load offset=15340 + i32.const 0 + i32.load offset=15336 + i32.const 0 + i32.load offset=15332 + i32.const 0 + i32.load offset=15328 + i32.const 0 + i32.load offset=15324 + i32.const 0 + i32.load offset=15320 + i32.const 0 + i32.load offset=15308 + i32.const 0 + i32.load offset=15300 + i32.const 0 + i32.load offset=15292 + i32.const 0 + i32.load offset=15284 + i32.const 0 + i32.load offset=15276 + i32.const 0 + i32.load offset=15268 + i32.const 0 + i32.load offset=15260 + i32.const 0 + i32.load offset=15252 + i32.const 0 + i32.load offset=15244 + i32.const 0 + i32.load offset=15236 + i32.const 0 + i32.load offset=15228 + i32.const 0 + i32.load offset=15204 + i32.const 0 + i32.load offset=15188 + i32.const 0 + i32.load offset=15172 + i32.const 0 + i32.load offset=15156 + i32.const 0 + i32.load offset=15140 + i32.const 0 + i32.load offset=15124 + i32.const 0 + i32.load offset=15108 + i32.const 0 + i32.load offset=15092 + i32.const 0 + i32.load offset=15076 + i32.const 0 + i32.load offset=15060 + i32.const 0 + i32.load offset=15044 + i32.const 0 + i32.load offset=14996 + i32.const 0 + i32.load offset=14964 + i32.const 0 + i32.load offset=14932 + i32.const 0 + i32.load offset=14900 + i32.const 0 + i32.load offset=14868 + i32.const 0 + i32.load offset=14836 + i32.const 0 + i32.load offset=14804 + i32.const 0 + i32.load offset=14772 + i32.const 0 + i32.load offset=14740 + i32.const 0 + i32.load offset=14708 + i32.const 0 + i32.load offset=14676 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14644 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15028 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15220 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15316 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_9 (type 1) + call $test3_func_9_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=11136 + i32.const 0 + i32.load offset=11132 + i32.const 0 + i32.load offset=11128 + i32.const 0 + i32.load offset=11124 + i32.const 0 + i32.load offset=11120 + i32.const 0 + i32.load offset=11116 + i32.const 0 + i32.load offset=11112 + i32.const 0 + i32.load offset=11108 + i32.const 0 + i32.load offset=11104 + i32.const 0 + i32.load offset=11100 + i32.const 0 + i32.load offset=11096 + i32.const 0 + i32.load offset=11084 + i32.const 0 + i32.load offset=11076 + i32.const 0 + i32.load offset=11068 + i32.const 0 + i32.load offset=11060 + i32.const 0 + i32.load offset=11052 + i32.const 0 + i32.load offset=11044 + i32.const 0 + i32.load offset=11036 + i32.const 0 + i32.load offset=11028 + i32.const 0 + i32.load offset=11020 + i32.const 0 + i32.load offset=11012 + i32.const 0 + i32.load offset=11004 + i32.const 0 + i32.load offset=10980 + i32.const 0 + i32.load offset=10964 + i32.const 0 + i32.load offset=10948 + i32.const 0 + i32.load offset=10932 + i32.const 0 + i32.load offset=10916 + i32.const 0 + i32.load offset=10900 + i32.const 0 + i32.load offset=10884 + i32.const 0 + i32.load offset=10868 + i32.const 0 + i32.load offset=10852 + i32.const 0 + i32.load offset=10836 + i32.const 0 + i32.load offset=10820 + i32.const 0 + i32.load offset=10772 + i32.const 0 + i32.load offset=10740 + i32.const 0 + i32.load offset=10708 + i32.const 0 + i32.load offset=10676 + i32.const 0 + i32.load offset=10644 + i32.const 0 + i32.load offset=10612 + i32.const 0 + i32.load offset=10580 + i32.const 0 + i32.load offset=10548 + i32.const 0 + i32.load offset=10516 + i32.const 0 + i32.load offset=10484 + i32.const 0 + i32.load offset=10452 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10420 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10804 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10996 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=11092 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_9) + (func $test3_func_8_9 (type 1) + call $test3_func_8_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6912 + i32.const 0 + i32.load offset=6908 + i32.const 0 + i32.load offset=6904 + i32.const 0 + i32.load offset=6900 + i32.const 0 + i32.load offset=6896 + i32.const 0 + i32.load offset=6892 + i32.const 0 + i32.load offset=6888 + i32.const 0 + i32.load offset=6884 + i32.const 0 + i32.load offset=6880 + i32.const 0 + i32.load offset=6876 + i32.const 0 + i32.load offset=6872 + i32.const 0 + i32.load offset=6860 + i32.const 0 + i32.load offset=6852 + i32.const 0 + i32.load offset=6844 + i32.const 0 + i32.load offset=6836 + i32.const 0 + i32.load offset=6828 + i32.const 0 + i32.load offset=6820 + i32.const 0 + i32.load offset=6812 + i32.const 0 + i32.load offset=6804 + i32.const 0 + i32.load offset=6796 + i32.const 0 + i32.load offset=6788 + i32.const 0 + i32.load offset=6780 + i32.const 0 + i32.load offset=6756 + i32.const 0 + i32.load offset=6740 + i32.const 0 + i32.load offset=6724 + i32.const 0 + i32.load offset=6708 + i32.const 0 + i32.load offset=6692 + i32.const 0 + i32.load offset=6676 + i32.const 0 + i32.load offset=6660 + i32.const 0 + i32.load offset=6644 + i32.const 0 + i32.load offset=6628 + i32.const 0 + i32.load offset=6612 + i32.const 0 + i32.load offset=6596 + i32.const 0 + i32.load offset=6548 + i32.const 0 + i32.load offset=6516 + i32.const 0 + i32.load offset=6484 + i32.const 0 + i32.load offset=6452 + i32.const 0 + i32.load offset=6420 + i32.const 0 + i32.load offset=6388 + i32.const 0 + i32.load offset=6356 + i32.const 0 + i32.load offset=6324 + i32.const 0 + i32.load offset=6292 + i32.const 0 + i32.load offset=6260 + i32.const 0 + i32.load offset=6228 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6196 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6580 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6772 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6868 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_9) + (func $test3_func_7_9 (type 1) + call $test3_func_7_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2688 + i32.const 0 + i32.load offset=2684 + i32.const 0 + i32.load offset=2680 + i32.const 0 + i32.load offset=2676 + i32.const 0 + i32.load offset=2672 + i32.const 0 + i32.load offset=2668 + i32.const 0 + i32.load offset=2664 + i32.const 0 + i32.load offset=2660 + i32.const 0 + i32.load offset=2656 + i32.const 0 + i32.load offset=2652 + i32.const 0 + i32.load offset=2648 + i32.const 0 + i32.load offset=2636 + i32.const 0 + i32.load offset=2628 + i32.const 0 + i32.load offset=2620 + i32.const 0 + i32.load offset=2612 + i32.const 0 + i32.load offset=2604 + i32.const 0 + i32.load offset=2596 + i32.const 0 + i32.load offset=2588 + i32.const 0 + i32.load offset=2580 + i32.const 0 + i32.load offset=2572 + i32.const 0 + i32.load offset=2564 + i32.const 0 + i32.load offset=2556 + i32.const 0 + i32.load offset=2532 + i32.const 0 + i32.load offset=2516 + i32.const 0 + i32.load offset=2500 + i32.const 0 + i32.load offset=2484 + i32.const 0 + i32.load offset=2468 + i32.const 0 + i32.load offset=2452 + i32.const 0 + i32.load offset=2436 + i32.const 0 + i32.load offset=2420 + i32.const 0 + i32.load offset=2404 + i32.const 0 + i32.load offset=2388 + i32.const 0 + i32.load offset=2372 + i32.const 0 + i32.load offset=2324 + i32.const 0 + i32.load offset=2292 + i32.const 0 + i32.load offset=2260 + i32.const 0 + i32.load offset=2228 + i32.const 0 + i32.load offset=2196 + i32.const 0 + i32.load offset=2164 + i32.const 0 + i32.load offset=2132 + i32.const 0 + i32.load offset=2100 + i32.const 0 + i32.load offset=2068 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2004 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1972 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2356 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2548 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2644 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_9) + (func $test3_func_6_9 (type 1) + call $test3_func_6_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31232 + i32.const 0 + i32.load offset=31228 + i32.const 0 + i32.load offset=31224 + i32.const 0 + i32.load offset=31220 + i32.const 0 + i32.load offset=31216 + i32.const 0 + i32.load offset=31212 + i32.const 0 + i32.load offset=31208 + i32.const 0 + i32.load offset=31204 + i32.const 0 + i32.load offset=31200 + i32.const 0 + i32.load offset=31196 + i32.const 0 + i32.load offset=31192 + i32.const 0 + i32.load offset=31180 + i32.const 0 + i32.load offset=31172 + i32.const 0 + i32.load offset=31164 + i32.const 0 + i32.load offset=31156 + i32.const 0 + i32.load offset=31148 + i32.const 0 + i32.load offset=31140 + i32.const 0 + i32.load offset=31132 + i32.const 0 + i32.load offset=31124 + i32.const 0 + i32.load offset=31116 + i32.const 0 + i32.load offset=31108 + i32.const 0 + i32.load offset=31100 + i32.const 0 + i32.load offset=31076 + i32.const 0 + i32.load offset=31060 + i32.const 0 + i32.load offset=31044 + i32.const 0 + i32.load offset=31028 + i32.const 0 + i32.load offset=31012 + i32.const 0 + i32.load offset=30996 + i32.const 0 + i32.load offset=30980 + i32.const 0 + i32.load offset=30964 + i32.const 0 + i32.load offset=30948 + i32.const 0 + i32.load offset=30932 + i32.const 0 + i32.load offset=30916 + i32.const 0 + i32.load offset=30868 + i32.const 0 + i32.load offset=30836 + i32.const 0 + i32.load offset=30804 + i32.const 0 + i32.load offset=30772 + i32.const 0 + i32.load offset=30740 + i32.const 0 + i32.load offset=30708 + i32.const 0 + i32.load offset=30676 + i32.const 0 + i32.load offset=30644 + i32.const 0 + i32.load offset=30612 + i32.const 0 + i32.load offset=30580 + i32.const 0 + i32.load offset=30548 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30516 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30900 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31092 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31188 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_9) + (func $test3_func_5_9 (type 1) + call $test3_func_5_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27008 + i32.const 0 + i32.load offset=27004 + i32.const 0 + i32.load offset=27000 + i32.const 0 + i32.load offset=26996 + i32.const 0 + i32.load offset=26992 + i32.const 0 + i32.load offset=26988 + i32.const 0 + i32.load offset=26984 + i32.const 0 + i32.load offset=26980 + i32.const 0 + i32.load offset=26976 + i32.const 0 + i32.load offset=26972 + i32.const 0 + i32.load offset=26968 + i32.const 0 + i32.load offset=26956 + i32.const 0 + i32.load offset=26948 + i32.const 0 + i32.load offset=26940 + i32.const 0 + i32.load offset=26932 + i32.const 0 + i32.load offset=26924 + i32.const 0 + i32.load offset=26916 + i32.const 0 + i32.load offset=26908 + i32.const 0 + i32.load offset=26900 + i32.const 0 + i32.load offset=26892 + i32.const 0 + i32.load offset=26884 + i32.const 0 + i32.load offset=26876 + i32.const 0 + i32.load offset=26852 + i32.const 0 + i32.load offset=26836 + i32.const 0 + i32.load offset=26820 + i32.const 0 + i32.load offset=26804 + i32.const 0 + i32.load offset=26788 + i32.const 0 + i32.load offset=26772 + i32.const 0 + i32.load offset=26756 + i32.const 0 + i32.load offset=26740 + i32.const 0 + i32.load offset=26724 + i32.const 0 + i32.load offset=26708 + i32.const 0 + i32.load offset=26692 + i32.const 0 + i32.load offset=26644 + i32.const 0 + i32.load offset=26612 + i32.const 0 + i32.load offset=26580 + i32.const 0 + i32.load offset=26548 + i32.const 0 + i32.load offset=26516 + i32.const 0 + i32.load offset=26484 + i32.const 0 + i32.load offset=26452 + i32.const 0 + i32.load offset=26420 + i32.const 0 + i32.load offset=26388 + i32.const 0 + i32.load offset=26356 + i32.const 0 + i32.load offset=26324 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26292 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26676 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26868 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26964 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_9) + (func $test3_func_4_9 (type 1) + call $test3_func_4_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22784 + i32.const 0 + i32.load offset=22780 + i32.const 0 + i32.load offset=22776 + i32.const 0 + i32.load offset=22772 + i32.const 0 + i32.load offset=22768 + i32.const 0 + i32.load offset=22764 + i32.const 0 + i32.load offset=22760 + i32.const 0 + i32.load offset=22756 + i32.const 0 + i32.load offset=22752 + i32.const 0 + i32.load offset=22748 + i32.const 0 + i32.load offset=22744 + i32.const 0 + i32.load offset=22732 + i32.const 0 + i32.load offset=22724 + i32.const 0 + i32.load offset=22716 + i32.const 0 + i32.load offset=22708 + i32.const 0 + i32.load offset=22700 + i32.const 0 + i32.load offset=22692 + i32.const 0 + i32.load offset=22684 + i32.const 0 + i32.load offset=22676 + i32.const 0 + i32.load offset=22668 + i32.const 0 + i32.load offset=22660 + i32.const 0 + i32.load offset=22652 + i32.const 0 + i32.load offset=22628 + i32.const 0 + i32.load offset=22612 + i32.const 0 + i32.load offset=22596 + i32.const 0 + i32.load offset=22580 + i32.const 0 + i32.load offset=22564 + i32.const 0 + i32.load offset=22548 + i32.const 0 + i32.load offset=22532 + i32.const 0 + i32.load offset=22516 + i32.const 0 + i32.load offset=22500 + i32.const 0 + i32.load offset=22484 + i32.const 0 + i32.load offset=22468 + i32.const 0 + i32.load offset=22420 + i32.const 0 + i32.load offset=22388 + i32.const 0 + i32.load offset=22356 + i32.const 0 + i32.load offset=22324 + i32.const 0 + i32.load offset=22292 + i32.const 0 + i32.load offset=22260 + i32.const 0 + i32.load offset=22228 + i32.const 0 + i32.load offset=22196 + i32.const 0 + i32.load offset=22164 + i32.const 0 + i32.load offset=22132 + i32.const 0 + i32.load offset=22100 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22068 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22452 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22644 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22740 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_9) + (func $test3_func_3_9 (type 1) + call $test3_func_3_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18560 + i32.const 0 + i32.load offset=18556 + i32.const 0 + i32.load offset=18552 + i32.const 0 + i32.load offset=18548 + i32.const 0 + i32.load offset=18544 + i32.const 0 + i32.load offset=18540 + i32.const 0 + i32.load offset=18536 + i32.const 0 + i32.load offset=18532 + i32.const 0 + i32.load offset=18528 + i32.const 0 + i32.load offset=18524 + i32.const 0 + i32.load offset=18520 + i32.const 0 + i32.load offset=18508 + i32.const 0 + i32.load offset=18500 + i32.const 0 + i32.load offset=18492 + i32.const 0 + i32.load offset=18484 + i32.const 0 + i32.load offset=18476 + i32.const 0 + i32.load offset=18468 + i32.const 0 + i32.load offset=18460 + i32.const 0 + i32.load offset=18452 + i32.const 0 + i32.load offset=18444 + i32.const 0 + i32.load offset=18436 + i32.const 0 + i32.load offset=18428 + i32.const 0 + i32.load offset=18404 + i32.const 0 + i32.load offset=18388 + i32.const 0 + i32.load offset=18372 + i32.const 0 + i32.load offset=18356 + i32.const 0 + i32.load offset=18340 + i32.const 0 + i32.load offset=18324 + i32.const 0 + i32.load offset=18308 + i32.const 0 + i32.load offset=18292 + i32.const 0 + i32.load offset=18276 + i32.const 0 + i32.load offset=18260 + i32.const 0 + i32.load offset=18244 + i32.const 0 + i32.load offset=18196 + i32.const 0 + i32.load offset=18164 + i32.const 0 + i32.load offset=18132 + i32.const 0 + i32.load offset=18100 + i32.const 0 + i32.load offset=18068 + i32.const 0 + i32.load offset=18036 + i32.const 0 + i32.load offset=18004 + i32.const 0 + i32.load offset=17972 + i32.const 0 + i32.load offset=17940 + i32.const 0 + i32.load offset=17908 + i32.const 0 + i32.load offset=17876 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17844 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18228 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18420 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18516 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_9) + (func $test3_func_2_9 (type 1) + call $test3_func_2_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14336 + i32.const 0 + i32.load offset=14332 + i32.const 0 + i32.load offset=14328 + i32.const 0 + i32.load offset=14324 + i32.const 0 + i32.load offset=14320 + i32.const 0 + i32.load offset=14316 + i32.const 0 + i32.load offset=14312 + i32.const 0 + i32.load offset=14308 + i32.const 0 + i32.load offset=14304 + i32.const 0 + i32.load offset=14300 + i32.const 0 + i32.load offset=14296 + i32.const 0 + i32.load offset=14284 + i32.const 0 + i32.load offset=14276 + i32.const 0 + i32.load offset=14268 + i32.const 0 + i32.load offset=14260 + i32.const 0 + i32.load offset=14252 + i32.const 0 + i32.load offset=14244 + i32.const 0 + i32.load offset=14236 + i32.const 0 + i32.load offset=14228 + i32.const 0 + i32.load offset=14220 + i32.const 0 + i32.load offset=14212 + i32.const 0 + i32.load offset=14204 + i32.const 0 + i32.load offset=14180 + i32.const 0 + i32.load offset=14164 + i32.const 0 + i32.load offset=14148 + i32.const 0 + i32.load offset=14132 + i32.const 0 + i32.load offset=14116 + i32.const 0 + i32.load offset=14100 + i32.const 0 + i32.load offset=14084 + i32.const 0 + i32.load offset=14068 + i32.const 0 + i32.load offset=14052 + i32.const 0 + i32.load offset=14036 + i32.const 0 + i32.load offset=14020 + i32.const 0 + i32.load offset=13972 + i32.const 0 + i32.load offset=13940 + i32.const 0 + i32.load offset=13908 + i32.const 0 + i32.load offset=13876 + i32.const 0 + i32.load offset=13844 + i32.const 0 + i32.load offset=13812 + i32.const 0 + i32.load offset=13780 + i32.const 0 + i32.load offset=13748 + i32.const 0 + i32.load offset=13716 + i32.const 0 + i32.load offset=13684 + i32.const 0 + i32.load offset=13652 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13620 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14004 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14196 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14292 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_9) + (func $test3_func_1_9 (type 1) + call $test3_func_1_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10112 + i32.const 0 + i32.load offset=10108 + i32.const 0 + i32.load offset=10104 + i32.const 0 + i32.load offset=10100 + i32.const 0 + i32.load offset=10096 + i32.const 0 + i32.load offset=10092 + i32.const 0 + i32.load offset=10088 + i32.const 0 + i32.load offset=10084 + i32.const 0 + i32.load offset=10080 + i32.const 0 + i32.load offset=10076 + i32.const 0 + i32.load offset=10072 + i32.const 0 + i32.load offset=10060 + i32.const 0 + i32.load offset=10052 + i32.const 0 + i32.load offset=10044 + i32.const 0 + i32.load offset=10036 + i32.const 0 + i32.load offset=10028 + i32.const 0 + i32.load offset=10020 + i32.const 0 + i32.load offset=10012 + i32.const 0 + i32.load offset=10004 + i32.const 0 + i32.load offset=9996 + i32.const 0 + i32.load offset=9988 + i32.const 0 + i32.load offset=9980 + i32.const 0 + i32.load offset=9956 + i32.const 0 + i32.load offset=9940 + i32.const 0 + i32.load offset=9924 + i32.const 0 + i32.load offset=9908 + i32.const 0 + i32.load offset=9892 + i32.const 0 + i32.load offset=9876 + i32.const 0 + i32.load offset=9860 + i32.const 0 + i32.load offset=9844 + i32.const 0 + i32.load offset=9828 + i32.const 0 + i32.load offset=9812 + i32.const 0 + i32.load offset=9796 + i32.const 0 + i32.load offset=9748 + i32.const 0 + i32.load offset=9716 + i32.const 0 + i32.load offset=9684 + i32.const 0 + i32.load offset=9652 + i32.const 0 + i32.load offset=9620 + i32.const 0 + i32.load offset=9588 + i32.const 0 + i32.load offset=9556 + i32.const 0 + i32.load offset=9524 + i32.const 0 + i32.load offset=9492 + i32.const 0 + i32.load offset=9460 + i32.const 0 + i32.load offset=9428 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9396 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9780 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9972 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10068 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_9) + (func $test3_func_0_9 (type 1) + call $test3_func_0_10 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=5888 + i32.const 0 + i32.load offset=5884 + i32.const 0 + i32.load offset=5880 + i32.const 0 + i32.load offset=5876 + i32.const 0 + i32.load offset=5872 + i32.const 0 + i32.load offset=5868 + i32.const 0 + i32.load offset=5864 + i32.const 0 + i32.load offset=5860 + i32.const 0 + i32.load offset=5856 + i32.const 0 + i32.load offset=5852 + i32.const 0 + i32.load offset=5848 + i32.const 0 + i32.load offset=5836 + i32.const 0 + i32.load offset=5828 + i32.const 0 + i32.load offset=5820 + i32.const 0 + i32.load offset=5812 + i32.const 0 + i32.load offset=5804 + i32.const 0 + i32.load offset=5796 + i32.const 0 + i32.load offset=5788 + i32.const 0 + i32.load offset=5780 + i32.const 0 + i32.load offset=5772 + i32.const 0 + i32.load offset=5764 + i32.const 0 + i32.load offset=5756 + i32.const 0 + i32.load offset=5732 + i32.const 0 + i32.load offset=5716 + i32.const 0 + i32.load offset=5700 + i32.const 0 + i32.load offset=5684 + i32.const 0 + i32.load offset=5668 + i32.const 0 + i32.load offset=5652 + i32.const 0 + i32.load offset=5636 + i32.const 0 + i32.load offset=5620 + i32.const 0 + i32.load offset=5604 + i32.const 0 + i32.load offset=5588 + i32.const 0 + i32.load offset=5572 + i32.const 0 + i32.load offset=5524 + i32.const 0 + i32.load offset=5492 + i32.const 0 + i32.load offset=5460 + i32.const 0 + i32.load offset=5428 + i32.const 0 + i32.load offset=5396 + i32.const 0 + i32.load offset=5364 + i32.const 0 + i32.load offset=5332 + i32.const 0 + i32.load offset=5300 + i32.const 0 + i32.load offset=5268 + i32.const 0 + i32.load offset=5236 + i32.const 0 + i32.load offset=5204 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5172 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5556 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5748 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5844 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_9) + (func $test3_func_10_8 (type 1) + call $test3_func_10_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=11260 + i32.const 0 + i32.load offset=11256 + i32.const 0 + i32.load offset=11252 + i32.const 0 + i32.load offset=11248 + i32.const 0 + i32.load offset=11244 + i32.const 0 + i32.load offset=11240 + i32.const 0 + i32.load offset=11236 + i32.const 0 + i32.load offset=11232 + i32.const 0 + i32.load offset=11228 + i32.const 0 + i32.load offset=11224 + i32.const 0 + i32.load offset=11220 + i32.const 0 + i32.load offset=11208 + i32.const 0 + i32.load offset=11200 + i32.const 0 + i32.load offset=11192 + i32.const 0 + i32.load offset=11184 + i32.const 0 + i32.load offset=11176 + i32.const 0 + i32.load offset=11168 + i32.const 0 + i32.load offset=11160 + i32.const 0 + i32.load offset=11152 + i32.const 0 + i32.load offset=11144 + i32.const 0 + i32.load offset=11136 + i32.const 0 + i32.load offset=11128 + i32.const 0 + i32.load offset=11104 + i32.const 0 + i32.load offset=11088 + i32.const 0 + i32.load offset=11072 + i32.const 0 + i32.load offset=11056 + i32.const 0 + i32.load offset=11040 + i32.const 0 + i32.load offset=11024 + i32.const 0 + i32.load offset=11008 + i32.const 0 + i32.load offset=10992 + i32.const 0 + i32.load offset=10976 + i32.const 0 + i32.load offset=10960 + i32.const 0 + i32.load offset=10944 + i32.const 0 + i32.load offset=10896 + i32.const 0 + i32.load offset=10864 + i32.const 0 + i32.load offset=10832 + i32.const 0 + i32.load offset=10800 + i32.const 0 + i32.load offset=10768 + i32.const 0 + i32.load offset=10736 + i32.const 0 + i32.load offset=10704 + i32.const 0 + i32.load offset=10672 + i32.const 0 + i32.load offset=10640 + i32.const 0 + i32.load offset=10608 + i32.const 0 + i32.load offset=10576 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10544 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10928 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=11120 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=11216 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_8 (type 1) + call $test3_func_9_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=7036 + i32.const 0 + i32.load offset=7032 + i32.const 0 + i32.load offset=7028 + i32.const 0 + i32.load offset=7024 + i32.const 0 + i32.load offset=7020 + i32.const 0 + i32.load offset=7016 + i32.const 0 + i32.load offset=7012 + i32.const 0 + i32.load offset=7008 + i32.const 0 + i32.load offset=7004 + i32.const 0 + i32.load offset=7000 + i32.const 0 + i32.load offset=6996 + i32.const 0 + i32.load offset=6984 + i32.const 0 + i32.load offset=6976 + i32.const 0 + i32.load offset=6968 + i32.const 0 + i32.load offset=6960 + i32.const 0 + i32.load offset=6952 + i32.const 0 + i32.load offset=6944 + i32.const 0 + i32.load offset=6936 + i32.const 0 + i32.load offset=6928 + i32.const 0 + i32.load offset=6920 + i32.const 0 + i32.load offset=6912 + i32.const 0 + i32.load offset=6904 + i32.const 0 + i32.load offset=6880 + i32.const 0 + i32.load offset=6864 + i32.const 0 + i32.load offset=6848 + i32.const 0 + i32.load offset=6832 + i32.const 0 + i32.load offset=6816 + i32.const 0 + i32.load offset=6800 + i32.const 0 + i32.load offset=6784 + i32.const 0 + i32.load offset=6768 + i32.const 0 + i32.load offset=6752 + i32.const 0 + i32.load offset=6736 + i32.const 0 + i32.load offset=6720 + i32.const 0 + i32.load offset=6672 + i32.const 0 + i32.load offset=6640 + i32.const 0 + i32.load offset=6608 + i32.const 0 + i32.load offset=6576 + i32.const 0 + i32.load offset=6544 + i32.const 0 + i32.load offset=6512 + i32.const 0 + i32.load offset=6480 + i32.const 0 + i32.load offset=6448 + i32.const 0 + i32.load offset=6416 + i32.const 0 + i32.load offset=6384 + i32.const 0 + i32.load offset=6352 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6320 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6704 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6896 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6992 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_8) + (func $test3_func_8_8 (type 1) + call $test3_func_8_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2812 + i32.const 0 + i32.load offset=2808 + i32.const 0 + i32.load offset=2804 + i32.const 0 + i32.load offset=2800 + i32.const 0 + i32.load offset=2796 + i32.const 0 + i32.load offset=2792 + i32.const 0 + i32.load offset=2788 + i32.const 0 + i32.load offset=2784 + i32.const 0 + i32.load offset=2780 + i32.const 0 + i32.load offset=2776 + i32.const 0 + i32.load offset=2772 + i32.const 0 + i32.load offset=2760 + i32.const 0 + i32.load offset=2752 + i32.const 0 + i32.load offset=2744 + i32.const 0 + i32.load offset=2736 + i32.const 0 + i32.load offset=2728 + i32.const 0 + i32.load offset=2720 + i32.const 0 + i32.load offset=2712 + i32.const 0 + i32.load offset=2704 + i32.const 0 + i32.load offset=2696 + i32.const 0 + i32.load offset=2688 + i32.const 0 + i32.load offset=2680 + i32.const 0 + i32.load offset=2656 + i32.const 0 + i32.load offset=2640 + i32.const 0 + i32.load offset=2624 + i32.const 0 + i32.load offset=2608 + i32.const 0 + i32.load offset=2592 + i32.const 0 + i32.load offset=2576 + i32.const 0 + i32.load offset=2560 + i32.const 0 + i32.load offset=2544 + i32.const 0 + i32.load offset=2528 + i32.const 0 + i32.load offset=2512 + i32.const 0 + i32.load offset=2496 + i32.const 0 + i32.load offset=2448 + i32.const 0 + i32.load offset=2416 + i32.const 0 + i32.load offset=2384 + i32.const 0 + i32.load offset=2352 + i32.const 0 + i32.load offset=2320 + i32.const 0 + i32.load offset=2288 + i32.const 0 + i32.load offset=2256 + i32.const 0 + i32.load offset=2224 + i32.const 0 + i32.load offset=2192 + i32.const 0 + i32.load offset=2160 + i32.const 0 + i32.load offset=2128 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=2096 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2480 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2672 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2768 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_8) + (func $test3_func_7_8 (type 1) + call $test3_func_7_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31356 + i32.const 0 + i32.load offset=31352 + i32.const 0 + i32.load offset=31348 + i32.const 0 + i32.load offset=31344 + i32.const 0 + i32.load offset=31340 + i32.const 0 + i32.load offset=31336 + i32.const 0 + i32.load offset=31332 + i32.const 0 + i32.load offset=31328 + i32.const 0 + i32.load offset=31324 + i32.const 0 + i32.load offset=31320 + i32.const 0 + i32.load offset=31316 + i32.const 0 + i32.load offset=31304 + i32.const 0 + i32.load offset=31296 + i32.const 0 + i32.load offset=31288 + i32.const 0 + i32.load offset=31280 + i32.const 0 + i32.load offset=31272 + i32.const 0 + i32.load offset=31264 + i32.const 0 + i32.load offset=31256 + i32.const 0 + i32.load offset=31248 + i32.const 0 + i32.load offset=31240 + i32.const 0 + i32.load offset=31232 + i32.const 0 + i32.load offset=31224 + i32.const 0 + i32.load offset=31200 + i32.const 0 + i32.load offset=31184 + i32.const 0 + i32.load offset=31168 + i32.const 0 + i32.load offset=31152 + i32.const 0 + i32.load offset=31136 + i32.const 0 + i32.load offset=31120 + i32.const 0 + i32.load offset=31104 + i32.const 0 + i32.load offset=31088 + i32.const 0 + i32.load offset=31072 + i32.const 0 + i32.load offset=31056 + i32.const 0 + i32.load offset=31040 + i32.const 0 + i32.load offset=30992 + i32.const 0 + i32.load offset=30960 + i32.const 0 + i32.load offset=30928 + i32.const 0 + i32.load offset=30896 + i32.const 0 + i32.load offset=30864 + i32.const 0 + i32.load offset=30832 + i32.const 0 + i32.load offset=30800 + i32.const 0 + i32.load offset=30768 + i32.const 0 + i32.load offset=30736 + i32.const 0 + i32.load offset=30704 + i32.const 0 + i32.load offset=30672 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30640 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31024 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31216 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31312 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_8) + (func $test3_func_6_8 (type 1) + call $test3_func_6_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27132 + i32.const 0 + i32.load offset=27128 + i32.const 0 + i32.load offset=27124 + i32.const 0 + i32.load offset=27120 + i32.const 0 + i32.load offset=27116 + i32.const 0 + i32.load offset=27112 + i32.const 0 + i32.load offset=27108 + i32.const 0 + i32.load offset=27104 + i32.const 0 + i32.load offset=27100 + i32.const 0 + i32.load offset=27096 + i32.const 0 + i32.load offset=27092 + i32.const 0 + i32.load offset=27080 + i32.const 0 + i32.load offset=27072 + i32.const 0 + i32.load offset=27064 + i32.const 0 + i32.load offset=27056 + i32.const 0 + i32.load offset=27048 + i32.const 0 + i32.load offset=27040 + i32.const 0 + i32.load offset=27032 + i32.const 0 + i32.load offset=27024 + i32.const 0 + i32.load offset=27016 + i32.const 0 + i32.load offset=27008 + i32.const 0 + i32.load offset=27000 + i32.const 0 + i32.load offset=26976 + i32.const 0 + i32.load offset=26960 + i32.const 0 + i32.load offset=26944 + i32.const 0 + i32.load offset=26928 + i32.const 0 + i32.load offset=26912 + i32.const 0 + i32.load offset=26896 + i32.const 0 + i32.load offset=26880 + i32.const 0 + i32.load offset=26864 + i32.const 0 + i32.load offset=26848 + i32.const 0 + i32.load offset=26832 + i32.const 0 + i32.load offset=26816 + i32.const 0 + i32.load offset=26768 + i32.const 0 + i32.load offset=26736 + i32.const 0 + i32.load offset=26704 + i32.const 0 + i32.load offset=26672 + i32.const 0 + i32.load offset=26640 + i32.const 0 + i32.load offset=26608 + i32.const 0 + i32.load offset=26576 + i32.const 0 + i32.load offset=26544 + i32.const 0 + i32.load offset=26512 + i32.const 0 + i32.load offset=26480 + i32.const 0 + i32.load offset=26448 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26416 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26800 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26992 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27088 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_8) + (func $test3_func_5_8 (type 1) + call $test3_func_5_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22908 + i32.const 0 + i32.load offset=22904 + i32.const 0 + i32.load offset=22900 + i32.const 0 + i32.load offset=22896 + i32.const 0 + i32.load offset=22892 + i32.const 0 + i32.load offset=22888 + i32.const 0 + i32.load offset=22884 + i32.const 0 + i32.load offset=22880 + i32.const 0 + i32.load offset=22876 + i32.const 0 + i32.load offset=22872 + i32.const 0 + i32.load offset=22868 + i32.const 0 + i32.load offset=22856 + i32.const 0 + i32.load offset=22848 + i32.const 0 + i32.load offset=22840 + i32.const 0 + i32.load offset=22832 + i32.const 0 + i32.load offset=22824 + i32.const 0 + i32.load offset=22816 + i32.const 0 + i32.load offset=22808 + i32.const 0 + i32.load offset=22800 + i32.const 0 + i32.load offset=22792 + i32.const 0 + i32.load offset=22784 + i32.const 0 + i32.load offset=22776 + i32.const 0 + i32.load offset=22752 + i32.const 0 + i32.load offset=22736 + i32.const 0 + i32.load offset=22720 + i32.const 0 + i32.load offset=22704 + i32.const 0 + i32.load offset=22688 + i32.const 0 + i32.load offset=22672 + i32.const 0 + i32.load offset=22656 + i32.const 0 + i32.load offset=22640 + i32.const 0 + i32.load offset=22624 + i32.const 0 + i32.load offset=22608 + i32.const 0 + i32.load offset=22592 + i32.const 0 + i32.load offset=22544 + i32.const 0 + i32.load offset=22512 + i32.const 0 + i32.load offset=22480 + i32.const 0 + i32.load offset=22448 + i32.const 0 + i32.load offset=22416 + i32.const 0 + i32.load offset=22384 + i32.const 0 + i32.load offset=22352 + i32.const 0 + i32.load offset=22320 + i32.const 0 + i32.load offset=22288 + i32.const 0 + i32.load offset=22256 + i32.const 0 + i32.load offset=22224 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22192 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22576 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22768 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22864 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_8) + (func $test3_func_4_8 (type 1) + call $test3_func_4_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18684 + i32.const 0 + i32.load offset=18680 + i32.const 0 + i32.load offset=18676 + i32.const 0 + i32.load offset=18672 + i32.const 0 + i32.load offset=18668 + i32.const 0 + i32.load offset=18664 + i32.const 0 + i32.load offset=18660 + i32.const 0 + i32.load offset=18656 + i32.const 0 + i32.load offset=18652 + i32.const 0 + i32.load offset=18648 + i32.const 0 + i32.load offset=18644 + i32.const 0 + i32.load offset=18632 + i32.const 0 + i32.load offset=18624 + i32.const 0 + i32.load offset=18616 + i32.const 0 + i32.load offset=18608 + i32.const 0 + i32.load offset=18600 + i32.const 0 + i32.load offset=18592 + i32.const 0 + i32.load offset=18584 + i32.const 0 + i32.load offset=18576 + i32.const 0 + i32.load offset=18568 + i32.const 0 + i32.load offset=18560 + i32.const 0 + i32.load offset=18552 + i32.const 0 + i32.load offset=18528 + i32.const 0 + i32.load offset=18512 + i32.const 0 + i32.load offset=18496 + i32.const 0 + i32.load offset=18480 + i32.const 0 + i32.load offset=18464 + i32.const 0 + i32.load offset=18448 + i32.const 0 + i32.load offset=18432 + i32.const 0 + i32.load offset=18416 + i32.const 0 + i32.load offset=18400 + i32.const 0 + i32.load offset=18384 + i32.const 0 + i32.load offset=18368 + i32.const 0 + i32.load offset=18320 + i32.const 0 + i32.load offset=18288 + i32.const 0 + i32.load offset=18256 + i32.const 0 + i32.load offset=18224 + i32.const 0 + i32.load offset=18192 + i32.const 0 + i32.load offset=18160 + i32.const 0 + i32.load offset=18128 + i32.const 0 + i32.load offset=18096 + i32.const 0 + i32.load offset=18064 + i32.const 0 + i32.load offset=18032 + i32.const 0 + i32.load offset=18000 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17968 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18352 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18544 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18640 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_8) + (func $test3_func_3_8 (type 1) + call $test3_func_3_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14460 + i32.const 0 + i32.load offset=14456 + i32.const 0 + i32.load offset=14452 + i32.const 0 + i32.load offset=14448 + i32.const 0 + i32.load offset=14444 + i32.const 0 + i32.load offset=14440 + i32.const 0 + i32.load offset=14436 + i32.const 0 + i32.load offset=14432 + i32.const 0 + i32.load offset=14428 + i32.const 0 + i32.load offset=14424 + i32.const 0 + i32.load offset=14420 + i32.const 0 + i32.load offset=14408 + i32.const 0 + i32.load offset=14400 + i32.const 0 + i32.load offset=14392 + i32.const 0 + i32.load offset=14384 + i32.const 0 + i32.load offset=14376 + i32.const 0 + i32.load offset=14368 + i32.const 0 + i32.load offset=14360 + i32.const 0 + i32.load offset=14352 + i32.const 0 + i32.load offset=14344 + i32.const 0 + i32.load offset=14336 + i32.const 0 + i32.load offset=14328 + i32.const 0 + i32.load offset=14304 + i32.const 0 + i32.load offset=14288 + i32.const 0 + i32.load offset=14272 + i32.const 0 + i32.load offset=14256 + i32.const 0 + i32.load offset=14240 + i32.const 0 + i32.load offset=14224 + i32.const 0 + i32.load offset=14208 + i32.const 0 + i32.load offset=14192 + i32.const 0 + i32.load offset=14176 + i32.const 0 + i32.load offset=14160 + i32.const 0 + i32.load offset=14144 + i32.const 0 + i32.load offset=14096 + i32.const 0 + i32.load offset=14064 + i32.const 0 + i32.load offset=14032 + i32.const 0 + i32.load offset=14000 + i32.const 0 + i32.load offset=13968 + i32.const 0 + i32.load offset=13936 + i32.const 0 + i32.load offset=13904 + i32.const 0 + i32.load offset=13872 + i32.const 0 + i32.load offset=13840 + i32.const 0 + i32.load offset=13808 + i32.const 0 + i32.load offset=13776 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13744 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14128 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14320 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14416 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_8) + (func $test3_func_2_8 (type 1) + call $test3_func_2_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10236 + i32.const 0 + i32.load offset=10232 + i32.const 0 + i32.load offset=10228 + i32.const 0 + i32.load offset=10224 + i32.const 0 + i32.load offset=10220 + i32.const 0 + i32.load offset=10216 + i32.const 0 + i32.load offset=10212 + i32.const 0 + i32.load offset=10208 + i32.const 0 + i32.load offset=10204 + i32.const 0 + i32.load offset=10200 + i32.const 0 + i32.load offset=10196 + i32.const 0 + i32.load offset=10184 + i32.const 0 + i32.load offset=10176 + i32.const 0 + i32.load offset=10168 + i32.const 0 + i32.load offset=10160 + i32.const 0 + i32.load offset=10152 + i32.const 0 + i32.load offset=10144 + i32.const 0 + i32.load offset=10136 + i32.const 0 + i32.load offset=10128 + i32.const 0 + i32.load offset=10120 + i32.const 0 + i32.load offset=10112 + i32.const 0 + i32.load offset=10104 + i32.const 0 + i32.load offset=10080 + i32.const 0 + i32.load offset=10064 + i32.const 0 + i32.load offset=10048 + i32.const 0 + i32.load offset=10032 + i32.const 0 + i32.load offset=10016 + i32.const 0 + i32.load offset=10000 + i32.const 0 + i32.load offset=9984 + i32.const 0 + i32.load offset=9968 + i32.const 0 + i32.load offset=9952 + i32.const 0 + i32.load offset=9936 + i32.const 0 + i32.load offset=9920 + i32.const 0 + i32.load offset=9872 + i32.const 0 + i32.load offset=9840 + i32.const 0 + i32.load offset=9808 + i32.const 0 + i32.load offset=9776 + i32.const 0 + i32.load offset=9744 + i32.const 0 + i32.load offset=9712 + i32.const 0 + i32.load offset=9680 + i32.const 0 + i32.load offset=9648 + i32.const 0 + i32.load offset=9616 + i32.const 0 + i32.load offset=9584 + i32.const 0 + i32.load offset=9552 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9520 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9904 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10096 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10192 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_8) + (func $test3_func_1_8 (type 1) + call $test3_func_1_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6012 + i32.const 0 + i32.load offset=6008 + i32.const 0 + i32.load offset=6004 + i32.const 0 + i32.load offset=6000 + i32.const 0 + i32.load offset=5996 + i32.const 0 + i32.load offset=5992 + i32.const 0 + i32.load offset=5988 + i32.const 0 + i32.load offset=5984 + i32.const 0 + i32.load offset=5980 + i32.const 0 + i32.load offset=5976 + i32.const 0 + i32.load offset=5972 + i32.const 0 + i32.load offset=5960 + i32.const 0 + i32.load offset=5952 + i32.const 0 + i32.load offset=5944 + i32.const 0 + i32.load offset=5936 + i32.const 0 + i32.load offset=5928 + i32.const 0 + i32.load offset=5920 + i32.const 0 + i32.load offset=5912 + i32.const 0 + i32.load offset=5904 + i32.const 0 + i32.load offset=5896 + i32.const 0 + i32.load offset=5888 + i32.const 0 + i32.load offset=5880 + i32.const 0 + i32.load offset=5856 + i32.const 0 + i32.load offset=5840 + i32.const 0 + i32.load offset=5824 + i32.const 0 + i32.load offset=5808 + i32.const 0 + i32.load offset=5792 + i32.const 0 + i32.load offset=5776 + i32.const 0 + i32.load offset=5760 + i32.const 0 + i32.load offset=5744 + i32.const 0 + i32.load offset=5728 + i32.const 0 + i32.load offset=5712 + i32.const 0 + i32.load offset=5696 + i32.const 0 + i32.load offset=5648 + i32.const 0 + i32.load offset=5616 + i32.const 0 + i32.load offset=5584 + i32.const 0 + i32.load offset=5552 + i32.const 0 + i32.load offset=5520 + i32.const 0 + i32.load offset=5488 + i32.const 0 + i32.load offset=5456 + i32.const 0 + i32.load offset=5424 + i32.const 0 + i32.load offset=5392 + i32.const 0 + i32.load offset=5360 + i32.const 0 + i32.load offset=5328 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5296 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5680 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5872 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5968 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_8) + (func $test3_func_0_8 (type 1) + call $test3_func_0_9 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1788 + i32.const 0 + i32.load offset=1784 + i32.const 0 + i32.load offset=1780 + i32.const 0 + i32.load offset=1776 + i32.const 0 + i32.load offset=1772 + i32.const 0 + i32.load offset=1768 + i32.const 0 + i32.load offset=1764 + i32.const 0 + i32.load offset=1760 + i32.const 0 + i32.load offset=1756 + i32.const 0 + i32.load offset=1752 + i32.const 0 + i32.load offset=1748 + i32.const 0 + i32.load offset=1736 + i32.const 0 + i32.load offset=1728 + i32.const 0 + i32.load offset=1720 + i32.const 0 + i32.load offset=1712 + i32.const 0 + i32.load offset=1704 + i32.const 0 + i32.load offset=1696 + i32.const 0 + i32.load offset=1688 + i32.const 0 + i32.load offset=1680 + i32.const 0 + i32.load offset=1672 + i32.const 0 + i32.load offset=1664 + i32.const 0 + i32.load offset=1656 + i32.const 0 + i32.load offset=1632 + i32.const 0 + i32.load offset=1616 + i32.const 0 + i32.load offset=1600 + i32.const 0 + i32.load offset=1584 + i32.const 0 + i32.load offset=1568 + i32.const 0 + i32.load offset=1552 + i32.const 0 + i32.load offset=1536 + i32.const 0 + i32.load offset=1520 + i32.const 0 + i32.load offset=1504 + i32.const 0 + i32.load offset=1488 + i32.const 0 + i32.load offset=1472 + i32.const 0 + i32.load offset=1424 + i32.const 0 + i32.load offset=1392 + i32.const 0 + i32.load offset=1360 + i32.const 0 + i32.load offset=1328 + i32.const 0 + i32.load offset=1296 + i32.const 0 + i32.load offset=1264 + i32.const 0 + i32.load offset=1232 + i32.const 0 + i32.load offset=1200 + i32.const 0 + i32.load offset=1168 + i32.const 0 + i32.load offset=1136 + i32.const 0 + i32.load offset=1104 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1072 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1456 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1648 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1744 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_8) + (func $test3_func_10_7 (type 1) + call $test3_func_10_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=7160 + i32.const 0 + i32.load offset=7156 + i32.const 0 + i32.load offset=7152 + i32.const 0 + i32.load offset=7148 + i32.const 0 + i32.load offset=7144 + i32.const 0 + i32.load offset=7140 + i32.const 0 + i32.load offset=7136 + i32.const 0 + i32.load offset=7132 + i32.const 0 + i32.load offset=7128 + i32.const 0 + i32.load offset=7124 + i32.const 0 + i32.load offset=7120 + i32.const 0 + i32.load offset=7108 + i32.const 0 + i32.load offset=7100 + i32.const 0 + i32.load offset=7092 + i32.const 0 + i32.load offset=7084 + i32.const 0 + i32.load offset=7076 + i32.const 0 + i32.load offset=7068 + i32.const 0 + i32.load offset=7060 + i32.const 0 + i32.load offset=7052 + i32.const 0 + i32.load offset=7044 + i32.const 0 + i32.load offset=7036 + i32.const 0 + i32.load offset=7028 + i32.const 0 + i32.load offset=7004 + i32.const 0 + i32.load offset=6988 + i32.const 0 + i32.load offset=6972 + i32.const 0 + i32.load offset=6956 + i32.const 0 + i32.load offset=6940 + i32.const 0 + i32.load offset=6924 + i32.const 0 + i32.load offset=6908 + i32.const 0 + i32.load offset=6892 + i32.const 0 + i32.load offset=6876 + i32.const 0 + i32.load offset=6860 + i32.const 0 + i32.load offset=6844 + i32.const 0 + i32.load offset=6796 + i32.const 0 + i32.load offset=6764 + i32.const 0 + i32.load offset=6732 + i32.const 0 + i32.load offset=6700 + i32.const 0 + i32.load offset=6668 + i32.const 0 + i32.load offset=6636 + i32.const 0 + i32.load offset=6604 + i32.const 0 + i32.load offset=6572 + i32.const 0 + i32.load offset=6540 + i32.const 0 + i32.load offset=6508 + i32.const 0 + i32.load offset=6476 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6444 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6828 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=7020 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=7116 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_7 (type 1) + call $test3_func_9_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2936 + i32.const 0 + i32.load offset=2932 + i32.const 0 + i32.load offset=2928 + i32.const 0 + i32.load offset=2924 + i32.const 0 + i32.load offset=2920 + i32.const 0 + i32.load offset=2916 + i32.const 0 + i32.load offset=2912 + i32.const 0 + i32.load offset=2908 + i32.const 0 + i32.load offset=2904 + i32.const 0 + i32.load offset=2900 + i32.const 0 + i32.load offset=2896 + i32.const 0 + i32.load offset=2884 + i32.const 0 + i32.load offset=2876 + i32.const 0 + i32.load offset=2868 + i32.const 0 + i32.load offset=2860 + i32.const 0 + i32.load offset=2852 + i32.const 0 + i32.load offset=2844 + i32.const 0 + i32.load offset=2836 + i32.const 0 + i32.load offset=2828 + i32.const 0 + i32.load offset=2820 + i32.const 0 + i32.load offset=2812 + i32.const 0 + i32.load offset=2804 + i32.const 0 + i32.load offset=2780 + i32.const 0 + i32.load offset=2764 + i32.const 0 + i32.load offset=2748 + i32.const 0 + i32.load offset=2732 + i32.const 0 + i32.load offset=2716 + i32.const 0 + i32.load offset=2700 + i32.const 0 + i32.load offset=2684 + i32.const 0 + i32.load offset=2668 + i32.const 0 + i32.load offset=2652 + i32.const 0 + i32.load offset=2636 + i32.const 0 + i32.load offset=2620 + i32.const 0 + i32.load offset=2572 + i32.const 0 + i32.load offset=2540 + i32.const 0 + i32.load offset=2508 + i32.const 0 + i32.load offset=2476 + i32.const 0 + i32.load offset=2444 + i32.const 0 + i32.load offset=2412 + i32.const 0 + i32.load offset=2380 + i32.const 0 + i32.load offset=2348 + i32.const 0 + i32.load offset=2316 + i32.const 0 + i32.load offset=2284 + i32.const 0 + i32.load offset=2252 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=2220 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2604 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2796 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2892 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_7) + (func $test3_func_8_7 (type 1) + call $test3_func_8_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31480 + i32.const 0 + i32.load offset=31476 + i32.const 0 + i32.load offset=31472 + i32.const 0 + i32.load offset=31468 + i32.const 0 + i32.load offset=31464 + i32.const 0 + i32.load offset=31460 + i32.const 0 + i32.load offset=31456 + i32.const 0 + i32.load offset=31452 + i32.const 0 + i32.load offset=31448 + i32.const 0 + i32.load offset=31444 + i32.const 0 + i32.load offset=31440 + i32.const 0 + i32.load offset=31428 + i32.const 0 + i32.load offset=31420 + i32.const 0 + i32.load offset=31412 + i32.const 0 + i32.load offset=31404 + i32.const 0 + i32.load offset=31396 + i32.const 0 + i32.load offset=31388 + i32.const 0 + i32.load offset=31380 + i32.const 0 + i32.load offset=31372 + i32.const 0 + i32.load offset=31364 + i32.const 0 + i32.load offset=31356 + i32.const 0 + i32.load offset=31348 + i32.const 0 + i32.load offset=31324 + i32.const 0 + i32.load offset=31308 + i32.const 0 + i32.load offset=31292 + i32.const 0 + i32.load offset=31276 + i32.const 0 + i32.load offset=31260 + i32.const 0 + i32.load offset=31244 + i32.const 0 + i32.load offset=31228 + i32.const 0 + i32.load offset=31212 + i32.const 0 + i32.load offset=31196 + i32.const 0 + i32.load offset=31180 + i32.const 0 + i32.load offset=31164 + i32.const 0 + i32.load offset=31116 + i32.const 0 + i32.load offset=31084 + i32.const 0 + i32.load offset=31052 + i32.const 0 + i32.load offset=31020 + i32.const 0 + i32.load offset=30988 + i32.const 0 + i32.load offset=30956 + i32.const 0 + i32.load offset=30924 + i32.const 0 + i32.load offset=30892 + i32.const 0 + i32.load offset=30860 + i32.const 0 + i32.load offset=30828 + i32.const 0 + i32.load offset=30796 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30764 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31148 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31340 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31436 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_7) + (func $test3_func_7_7 (type 1) + call $test3_func_7_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27256 + i32.const 0 + i32.load offset=27252 + i32.const 0 + i32.load offset=27248 + i32.const 0 + i32.load offset=27244 + i32.const 0 + i32.load offset=27240 + i32.const 0 + i32.load offset=27236 + i32.const 0 + i32.load offset=27232 + i32.const 0 + i32.load offset=27228 + i32.const 0 + i32.load offset=27224 + i32.const 0 + i32.load offset=27220 + i32.const 0 + i32.load offset=27216 + i32.const 0 + i32.load offset=27204 + i32.const 0 + i32.load offset=27196 + i32.const 0 + i32.load offset=27188 + i32.const 0 + i32.load offset=27180 + i32.const 0 + i32.load offset=27172 + i32.const 0 + i32.load offset=27164 + i32.const 0 + i32.load offset=27156 + i32.const 0 + i32.load offset=27148 + i32.const 0 + i32.load offset=27140 + i32.const 0 + i32.load offset=27132 + i32.const 0 + i32.load offset=27124 + i32.const 0 + i32.load offset=27100 + i32.const 0 + i32.load offset=27084 + i32.const 0 + i32.load offset=27068 + i32.const 0 + i32.load offset=27052 + i32.const 0 + i32.load offset=27036 + i32.const 0 + i32.load offset=27020 + i32.const 0 + i32.load offset=27004 + i32.const 0 + i32.load offset=26988 + i32.const 0 + i32.load offset=26972 + i32.const 0 + i32.load offset=26956 + i32.const 0 + i32.load offset=26940 + i32.const 0 + i32.load offset=26892 + i32.const 0 + i32.load offset=26860 + i32.const 0 + i32.load offset=26828 + i32.const 0 + i32.load offset=26796 + i32.const 0 + i32.load offset=26764 + i32.const 0 + i32.load offset=26732 + i32.const 0 + i32.load offset=26700 + i32.const 0 + i32.load offset=26668 + i32.const 0 + i32.load offset=26636 + i32.const 0 + i32.load offset=26604 + i32.const 0 + i32.load offset=26572 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26540 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26924 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27116 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27212 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_7) + (func $test3_func_6_7 (type 1) + call $test3_func_6_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=23032 + i32.const 0 + i32.load offset=23028 + i32.const 0 + i32.load offset=23024 + i32.const 0 + i32.load offset=23020 + i32.const 0 + i32.load offset=23016 + i32.const 0 + i32.load offset=23012 + i32.const 0 + i32.load offset=23008 + i32.const 0 + i32.load offset=23004 + i32.const 0 + i32.load offset=23000 + i32.const 0 + i32.load offset=22996 + i32.const 0 + i32.load offset=22992 + i32.const 0 + i32.load offset=22980 + i32.const 0 + i32.load offset=22972 + i32.const 0 + i32.load offset=22964 + i32.const 0 + i32.load offset=22956 + i32.const 0 + i32.load offset=22948 + i32.const 0 + i32.load offset=22940 + i32.const 0 + i32.load offset=22932 + i32.const 0 + i32.load offset=22924 + i32.const 0 + i32.load offset=22916 + i32.const 0 + i32.load offset=22908 + i32.const 0 + i32.load offset=22900 + i32.const 0 + i32.load offset=22876 + i32.const 0 + i32.load offset=22860 + i32.const 0 + i32.load offset=22844 + i32.const 0 + i32.load offset=22828 + i32.const 0 + i32.load offset=22812 + i32.const 0 + i32.load offset=22796 + i32.const 0 + i32.load offset=22780 + i32.const 0 + i32.load offset=22764 + i32.const 0 + i32.load offset=22748 + i32.const 0 + i32.load offset=22732 + i32.const 0 + i32.load offset=22716 + i32.const 0 + i32.load offset=22668 + i32.const 0 + i32.load offset=22636 + i32.const 0 + i32.load offset=22604 + i32.const 0 + i32.load offset=22572 + i32.const 0 + i32.load offset=22540 + i32.const 0 + i32.load offset=22508 + i32.const 0 + i32.load offset=22476 + i32.const 0 + i32.load offset=22444 + i32.const 0 + i32.load offset=22412 + i32.const 0 + i32.load offset=22380 + i32.const 0 + i32.load offset=22348 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22316 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22700 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22892 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22988 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_7) + (func $test3_func_5_7 (type 1) + call $test3_func_5_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18808 + i32.const 0 + i32.load offset=18804 + i32.const 0 + i32.load offset=18800 + i32.const 0 + i32.load offset=18796 + i32.const 0 + i32.load offset=18792 + i32.const 0 + i32.load offset=18788 + i32.const 0 + i32.load offset=18784 + i32.const 0 + i32.load offset=18780 + i32.const 0 + i32.load offset=18776 + i32.const 0 + i32.load offset=18772 + i32.const 0 + i32.load offset=18768 + i32.const 0 + i32.load offset=18756 + i32.const 0 + i32.load offset=18748 + i32.const 0 + i32.load offset=18740 + i32.const 0 + i32.load offset=18732 + i32.const 0 + i32.load offset=18724 + i32.const 0 + i32.load offset=18716 + i32.const 0 + i32.load offset=18708 + i32.const 0 + i32.load offset=18700 + i32.const 0 + i32.load offset=18692 + i32.const 0 + i32.load offset=18684 + i32.const 0 + i32.load offset=18676 + i32.const 0 + i32.load offset=18652 + i32.const 0 + i32.load offset=18636 + i32.const 0 + i32.load offset=18620 + i32.const 0 + i32.load offset=18604 + i32.const 0 + i32.load offset=18588 + i32.const 0 + i32.load offset=18572 + i32.const 0 + i32.load offset=18556 + i32.const 0 + i32.load offset=18540 + i32.const 0 + i32.load offset=18524 + i32.const 0 + i32.load offset=18508 + i32.const 0 + i32.load offset=18492 + i32.const 0 + i32.load offset=18444 + i32.const 0 + i32.load offset=18412 + i32.const 0 + i32.load offset=18380 + i32.const 0 + i32.load offset=18348 + i32.const 0 + i32.load offset=18316 + i32.const 0 + i32.load offset=18284 + i32.const 0 + i32.load offset=18252 + i32.const 0 + i32.load offset=18220 + i32.const 0 + i32.load offset=18188 + i32.const 0 + i32.load offset=18156 + i32.const 0 + i32.load offset=18124 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18092 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18476 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18668 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18764 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_7) + (func $test3_func_4_7 (type 1) + call $test3_func_4_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14584 + i32.const 0 + i32.load offset=14580 + i32.const 0 + i32.load offset=14576 + i32.const 0 + i32.load offset=14572 + i32.const 0 + i32.load offset=14568 + i32.const 0 + i32.load offset=14564 + i32.const 0 + i32.load offset=14560 + i32.const 0 + i32.load offset=14556 + i32.const 0 + i32.load offset=14552 + i32.const 0 + i32.load offset=14548 + i32.const 0 + i32.load offset=14544 + i32.const 0 + i32.load offset=14532 + i32.const 0 + i32.load offset=14524 + i32.const 0 + i32.load offset=14516 + i32.const 0 + i32.load offset=14508 + i32.const 0 + i32.load offset=14500 + i32.const 0 + i32.load offset=14492 + i32.const 0 + i32.load offset=14484 + i32.const 0 + i32.load offset=14476 + i32.const 0 + i32.load offset=14468 + i32.const 0 + i32.load offset=14460 + i32.const 0 + i32.load offset=14452 + i32.const 0 + i32.load offset=14428 + i32.const 0 + i32.load offset=14412 + i32.const 0 + i32.load offset=14396 + i32.const 0 + i32.load offset=14380 + i32.const 0 + i32.load offset=14364 + i32.const 0 + i32.load offset=14348 + i32.const 0 + i32.load offset=14332 + i32.const 0 + i32.load offset=14316 + i32.const 0 + i32.load offset=14300 + i32.const 0 + i32.load offset=14284 + i32.const 0 + i32.load offset=14268 + i32.const 0 + i32.load offset=14220 + i32.const 0 + i32.load offset=14188 + i32.const 0 + i32.load offset=14156 + i32.const 0 + i32.load offset=14124 + i32.const 0 + i32.load offset=14092 + i32.const 0 + i32.load offset=14060 + i32.const 0 + i32.load offset=14028 + i32.const 0 + i32.load offset=13996 + i32.const 0 + i32.load offset=13964 + i32.const 0 + i32.load offset=13932 + i32.const 0 + i32.load offset=13900 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13868 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14252 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14444 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14540 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_7) + (func $test3_func_3_7 (type 1) + call $test3_func_3_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10360 + i32.const 0 + i32.load offset=10356 + i32.const 0 + i32.load offset=10352 + i32.const 0 + i32.load offset=10348 + i32.const 0 + i32.load offset=10344 + i32.const 0 + i32.load offset=10340 + i32.const 0 + i32.load offset=10336 + i32.const 0 + i32.load offset=10332 + i32.const 0 + i32.load offset=10328 + i32.const 0 + i32.load offset=10324 + i32.const 0 + i32.load offset=10320 + i32.const 0 + i32.load offset=10308 + i32.const 0 + i32.load offset=10300 + i32.const 0 + i32.load offset=10292 + i32.const 0 + i32.load offset=10284 + i32.const 0 + i32.load offset=10276 + i32.const 0 + i32.load offset=10268 + i32.const 0 + i32.load offset=10260 + i32.const 0 + i32.load offset=10252 + i32.const 0 + i32.load offset=10244 + i32.const 0 + i32.load offset=10236 + i32.const 0 + i32.load offset=10228 + i32.const 0 + i32.load offset=10204 + i32.const 0 + i32.load offset=10188 + i32.const 0 + i32.load offset=10172 + i32.const 0 + i32.load offset=10156 + i32.const 0 + i32.load offset=10140 + i32.const 0 + i32.load offset=10124 + i32.const 0 + i32.load offset=10108 + i32.const 0 + i32.load offset=10092 + i32.const 0 + i32.load offset=10076 + i32.const 0 + i32.load offset=10060 + i32.const 0 + i32.load offset=10044 + i32.const 0 + i32.load offset=9996 + i32.const 0 + i32.load offset=9964 + i32.const 0 + i32.load offset=9932 + i32.const 0 + i32.load offset=9900 + i32.const 0 + i32.load offset=9868 + i32.const 0 + i32.load offset=9836 + i32.const 0 + i32.load offset=9804 + i32.const 0 + i32.load offset=9772 + i32.const 0 + i32.load offset=9740 + i32.const 0 + i32.load offset=9708 + i32.const 0 + i32.load offset=9676 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9644 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10028 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10220 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10316 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_7) + (func $test3_func_2_7 (type 1) + call $test3_func_2_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6136 + i32.const 0 + i32.load offset=6132 + i32.const 0 + i32.load offset=6128 + i32.const 0 + i32.load offset=6124 + i32.const 0 + i32.load offset=6120 + i32.const 0 + i32.load offset=6116 + i32.const 0 + i32.load offset=6112 + i32.const 0 + i32.load offset=6108 + i32.const 0 + i32.load offset=6104 + i32.const 0 + i32.load offset=6100 + i32.const 0 + i32.load offset=6096 + i32.const 0 + i32.load offset=6084 + i32.const 0 + i32.load offset=6076 + i32.const 0 + i32.load offset=6068 + i32.const 0 + i32.load offset=6060 + i32.const 0 + i32.load offset=6052 + i32.const 0 + i32.load offset=6044 + i32.const 0 + i32.load offset=6036 + i32.const 0 + i32.load offset=6028 + i32.const 0 + i32.load offset=6020 + i32.const 0 + i32.load offset=6012 + i32.const 0 + i32.load offset=6004 + i32.const 0 + i32.load offset=5980 + i32.const 0 + i32.load offset=5964 + i32.const 0 + i32.load offset=5948 + i32.const 0 + i32.load offset=5932 + i32.const 0 + i32.load offset=5916 + i32.const 0 + i32.load offset=5900 + i32.const 0 + i32.load offset=5884 + i32.const 0 + i32.load offset=5868 + i32.const 0 + i32.load offset=5852 + i32.const 0 + i32.load offset=5836 + i32.const 0 + i32.load offset=5820 + i32.const 0 + i32.load offset=5772 + i32.const 0 + i32.load offset=5740 + i32.const 0 + i32.load offset=5708 + i32.const 0 + i32.load offset=5676 + i32.const 0 + i32.load offset=5644 + i32.const 0 + i32.load offset=5612 + i32.const 0 + i32.load offset=5580 + i32.const 0 + i32.load offset=5548 + i32.const 0 + i32.load offset=5516 + i32.const 0 + i32.load offset=5484 + i32.const 0 + i32.load offset=5452 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5420 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5804 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5996 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6092 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_7) + (func $test3_func_1_7 (type 1) + call $test3_func_1_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1912 + i32.const 0 + i32.load offset=1908 + i32.const 0 + i32.load offset=1904 + i32.const 0 + i32.load offset=1900 + i32.const 0 + i32.load offset=1896 + i32.const 0 + i32.load offset=1892 + i32.const 0 + i32.load offset=1888 + i32.const 0 + i32.load offset=1884 + i32.const 0 + i32.load offset=1880 + i32.const 0 + i32.load offset=1876 + i32.const 0 + i32.load offset=1872 + i32.const 0 + i32.load offset=1860 + i32.const 0 + i32.load offset=1852 + i32.const 0 + i32.load offset=1844 + i32.const 0 + i32.load offset=1836 + i32.const 0 + i32.load offset=1828 + i32.const 0 + i32.load offset=1820 + i32.const 0 + i32.load offset=1812 + i32.const 0 + i32.load offset=1804 + i32.const 0 + i32.load offset=1796 + i32.const 0 + i32.load offset=1788 + i32.const 0 + i32.load offset=1780 + i32.const 0 + i32.load offset=1756 + i32.const 0 + i32.load offset=1740 + i32.const 0 + i32.load offset=1724 + i32.const 0 + i32.load offset=1708 + i32.const 0 + i32.load offset=1692 + i32.const 0 + i32.load offset=1676 + i32.const 0 + i32.load offset=1660 + i32.const 0 + i32.load offset=1644 + i32.const 0 + i32.load offset=1628 + i32.const 0 + i32.load offset=1612 + i32.const 0 + i32.load offset=1596 + i32.const 0 + i32.load offset=1548 + i32.const 0 + i32.load offset=1516 + i32.const 0 + i32.load offset=1484 + i32.const 0 + i32.load offset=1452 + i32.const 0 + i32.load offset=1420 + i32.const 0 + i32.load offset=1388 + i32.const 0 + i32.load offset=1356 + i32.const 0 + i32.load offset=1324 + i32.const 0 + i32.load offset=1292 + i32.const 0 + i32.load offset=1260 + i32.const 0 + i32.load offset=1228 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1196 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1580 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1772 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1868 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_7) + (func $test3_func_0_7 (type 1) + call $test3_func_0_8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=30456 + i32.const 0 + i32.load offset=30452 + i32.const 0 + i32.load offset=30448 + i32.const 0 + i32.load offset=30444 + i32.const 0 + i32.load offset=30440 + i32.const 0 + i32.load offset=30436 + i32.const 0 + i32.load offset=30432 + i32.const 0 + i32.load offset=30428 + i32.const 0 + i32.load offset=30424 + i32.const 0 + i32.load offset=30420 + i32.const 0 + i32.load offset=30416 + i32.const 0 + i32.load offset=30404 + i32.const 0 + i32.load offset=30396 + i32.const 0 + i32.load offset=30388 + i32.const 0 + i32.load offset=30380 + i32.const 0 + i32.load offset=30372 + i32.const 0 + i32.load offset=30364 + i32.const 0 + i32.load offset=30356 + i32.const 0 + i32.load offset=30348 + i32.const 0 + i32.load offset=30340 + i32.const 0 + i32.load offset=30332 + i32.const 0 + i32.load offset=30324 + i32.const 0 + i32.load offset=30300 + i32.const 0 + i32.load offset=30284 + i32.const 0 + i32.load offset=30268 + i32.const 0 + i32.load offset=30252 + i32.const 0 + i32.load offset=30236 + i32.const 0 + i32.load offset=30220 + i32.const 0 + i32.load offset=30204 + i32.const 0 + i32.load offset=30188 + i32.const 0 + i32.load offset=30172 + i32.const 0 + i32.load offset=30156 + i32.const 0 + i32.load offset=30140 + i32.const 0 + i32.load offset=30092 + i32.const 0 + i32.load offset=30060 + i32.const 0 + i32.load offset=30028 + i32.const 0 + i32.load offset=29996 + i32.const 0 + i32.load offset=29964 + i32.const 0 + i32.load offset=29932 + i32.const 0 + i32.load offset=29900 + i32.const 0 + i32.load offset=29868 + i32.const 0 + i32.load offset=29836 + i32.const 0 + i32.load offset=29804 + i32.const 0 + i32.load offset=29772 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=29740 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30124 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30316 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30412 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_7) + (func $test3_func_10_6 (type 1) + call $test3_func_10_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=3060 + i32.const 0 + i32.load offset=3056 + i32.const 0 + i32.load offset=3052 + i32.const 0 + i32.load offset=3048 + i32.const 0 + i32.load offset=3044 + i32.const 0 + i32.load offset=3040 + i32.const 0 + i32.load offset=3036 + i32.const 0 + i32.load offset=3032 + i32.const 0 + i32.load offset=3028 + i32.const 0 + i32.load offset=3024 + i32.const 0 + i32.load offset=3020 + i32.const 0 + i32.load offset=3008 + i32.const 0 + i32.load offset=3000 + i32.const 0 + i32.load offset=2992 + i32.const 0 + i32.load offset=2984 + i32.const 0 + i32.load offset=2976 + i32.const 0 + i32.load offset=2968 + i32.const 0 + i32.load offset=2960 + i32.const 0 + i32.load offset=2952 + i32.const 0 + i32.load offset=2944 + i32.const 0 + i32.load offset=2936 + i32.const 0 + i32.load offset=2928 + i32.const 0 + i32.load offset=2904 + i32.const 0 + i32.load offset=2888 + i32.const 0 + i32.load offset=2872 + i32.const 0 + i32.load offset=2856 + i32.const 0 + i32.load offset=2840 + i32.const 0 + i32.load offset=2824 + i32.const 0 + i32.load offset=2808 + i32.const 0 + i32.load offset=2792 + i32.const 0 + i32.load offset=2776 + i32.const 0 + i32.load offset=2760 + i32.const 0 + i32.load offset=2744 + i32.const 0 + i32.load offset=2696 + i32.const 0 + i32.load offset=2664 + i32.const 0 + i32.load offset=2632 + i32.const 0 + i32.load offset=2600 + i32.const 0 + i32.load offset=2568 + i32.const 0 + i32.load offset=2536 + i32.const 0 + i32.load offset=2504 + i32.const 0 + i32.load offset=2472 + i32.const 0 + i32.load offset=2440 + i32.const 0 + i32.load offset=2408 + i32.const 0 + i32.load offset=2376 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=2344 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2728 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2920 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=3016 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_6 (type 1) + call $test3_func_9_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31604 + i32.const 0 + i32.load offset=31600 + i32.const 0 + i32.load offset=31596 + i32.const 0 + i32.load offset=31592 + i32.const 0 + i32.load offset=31588 + i32.const 0 + i32.load offset=31584 + i32.const 0 + i32.load offset=31580 + i32.const 0 + i32.load offset=31576 + i32.const 0 + i32.load offset=31572 + i32.const 0 + i32.load offset=31568 + i32.const 0 + i32.load offset=31564 + i32.const 0 + i32.load offset=31552 + i32.const 0 + i32.load offset=31544 + i32.const 0 + i32.load offset=31536 + i32.const 0 + i32.load offset=31528 + i32.const 0 + i32.load offset=31520 + i32.const 0 + i32.load offset=31512 + i32.const 0 + i32.load offset=31504 + i32.const 0 + i32.load offset=31496 + i32.const 0 + i32.load offset=31488 + i32.const 0 + i32.load offset=31480 + i32.const 0 + i32.load offset=31472 + i32.const 0 + i32.load offset=31448 + i32.const 0 + i32.load offset=31432 + i32.const 0 + i32.load offset=31416 + i32.const 0 + i32.load offset=31400 + i32.const 0 + i32.load offset=31384 + i32.const 0 + i32.load offset=31368 + i32.const 0 + i32.load offset=31352 + i32.const 0 + i32.load offset=31336 + i32.const 0 + i32.load offset=31320 + i32.const 0 + i32.load offset=31304 + i32.const 0 + i32.load offset=31288 + i32.const 0 + i32.load offset=31240 + i32.const 0 + i32.load offset=31208 + i32.const 0 + i32.load offset=31176 + i32.const 0 + i32.load offset=31144 + i32.const 0 + i32.load offset=31112 + i32.const 0 + i32.load offset=31080 + i32.const 0 + i32.load offset=31048 + i32.const 0 + i32.load offset=31016 + i32.const 0 + i32.load offset=30984 + i32.const 0 + i32.load offset=30952 + i32.const 0 + i32.load offset=30920 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30888 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31272 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31464 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31560 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_6) + (func $test3_func_8_6 (type 1) + call $test3_func_8_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27380 + i32.const 0 + i32.load offset=27376 + i32.const 0 + i32.load offset=27372 + i32.const 0 + i32.load offset=27368 + i32.const 0 + i32.load offset=27364 + i32.const 0 + i32.load offset=27360 + i32.const 0 + i32.load offset=27356 + i32.const 0 + i32.load offset=27352 + i32.const 0 + i32.load offset=27348 + i32.const 0 + i32.load offset=27344 + i32.const 0 + i32.load offset=27340 + i32.const 0 + i32.load offset=27328 + i32.const 0 + i32.load offset=27320 + i32.const 0 + i32.load offset=27312 + i32.const 0 + i32.load offset=27304 + i32.const 0 + i32.load offset=27296 + i32.const 0 + i32.load offset=27288 + i32.const 0 + i32.load offset=27280 + i32.const 0 + i32.load offset=27272 + i32.const 0 + i32.load offset=27264 + i32.const 0 + i32.load offset=27256 + i32.const 0 + i32.load offset=27248 + i32.const 0 + i32.load offset=27224 + i32.const 0 + i32.load offset=27208 + i32.const 0 + i32.load offset=27192 + i32.const 0 + i32.load offset=27176 + i32.const 0 + i32.load offset=27160 + i32.const 0 + i32.load offset=27144 + i32.const 0 + i32.load offset=27128 + i32.const 0 + i32.load offset=27112 + i32.const 0 + i32.load offset=27096 + i32.const 0 + i32.load offset=27080 + i32.const 0 + i32.load offset=27064 + i32.const 0 + i32.load offset=27016 + i32.const 0 + i32.load offset=26984 + i32.const 0 + i32.load offset=26952 + i32.const 0 + i32.load offset=26920 + i32.const 0 + i32.load offset=26888 + i32.const 0 + i32.load offset=26856 + i32.const 0 + i32.load offset=26824 + i32.const 0 + i32.load offset=26792 + i32.const 0 + i32.load offset=26760 + i32.const 0 + i32.load offset=26728 + i32.const 0 + i32.load offset=26696 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26664 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27048 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27240 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27336 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_6) + (func $test3_func_7_6 (type 1) + call $test3_func_7_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=23156 + i32.const 0 + i32.load offset=23152 + i32.const 0 + i32.load offset=23148 + i32.const 0 + i32.load offset=23144 + i32.const 0 + i32.load offset=23140 + i32.const 0 + i32.load offset=23136 + i32.const 0 + i32.load offset=23132 + i32.const 0 + i32.load offset=23128 + i32.const 0 + i32.load offset=23124 + i32.const 0 + i32.load offset=23120 + i32.const 0 + i32.load offset=23116 + i32.const 0 + i32.load offset=23104 + i32.const 0 + i32.load offset=23096 + i32.const 0 + i32.load offset=23088 + i32.const 0 + i32.load offset=23080 + i32.const 0 + i32.load offset=23072 + i32.const 0 + i32.load offset=23064 + i32.const 0 + i32.load offset=23056 + i32.const 0 + i32.load offset=23048 + i32.const 0 + i32.load offset=23040 + i32.const 0 + i32.load offset=23032 + i32.const 0 + i32.load offset=23024 + i32.const 0 + i32.load offset=23000 + i32.const 0 + i32.load offset=22984 + i32.const 0 + i32.load offset=22968 + i32.const 0 + i32.load offset=22952 + i32.const 0 + i32.load offset=22936 + i32.const 0 + i32.load offset=22920 + i32.const 0 + i32.load offset=22904 + i32.const 0 + i32.load offset=22888 + i32.const 0 + i32.load offset=22872 + i32.const 0 + i32.load offset=22856 + i32.const 0 + i32.load offset=22840 + i32.const 0 + i32.load offset=22792 + i32.const 0 + i32.load offset=22760 + i32.const 0 + i32.load offset=22728 + i32.const 0 + i32.load offset=22696 + i32.const 0 + i32.load offset=22664 + i32.const 0 + i32.load offset=22632 + i32.const 0 + i32.load offset=22600 + i32.const 0 + i32.load offset=22568 + i32.const 0 + i32.load offset=22536 + i32.const 0 + i32.load offset=22504 + i32.const 0 + i32.load offset=22472 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22440 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22824 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23016 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23112 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_6) + (func $test3_func_6_6 (type 1) + call $test3_func_6_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18932 + i32.const 0 + i32.load offset=18928 + i32.const 0 + i32.load offset=18924 + i32.const 0 + i32.load offset=18920 + i32.const 0 + i32.load offset=18916 + i32.const 0 + i32.load offset=18912 + i32.const 0 + i32.load offset=18908 + i32.const 0 + i32.load offset=18904 + i32.const 0 + i32.load offset=18900 + i32.const 0 + i32.load offset=18896 + i32.const 0 + i32.load offset=18892 + i32.const 0 + i32.load offset=18880 + i32.const 0 + i32.load offset=18872 + i32.const 0 + i32.load offset=18864 + i32.const 0 + i32.load offset=18856 + i32.const 0 + i32.load offset=18848 + i32.const 0 + i32.load offset=18840 + i32.const 0 + i32.load offset=18832 + i32.const 0 + i32.load offset=18824 + i32.const 0 + i32.load offset=18816 + i32.const 0 + i32.load offset=18808 + i32.const 0 + i32.load offset=18800 + i32.const 0 + i32.load offset=18776 + i32.const 0 + i32.load offset=18760 + i32.const 0 + i32.load offset=18744 + i32.const 0 + i32.load offset=18728 + i32.const 0 + i32.load offset=18712 + i32.const 0 + i32.load offset=18696 + i32.const 0 + i32.load offset=18680 + i32.const 0 + i32.load offset=18664 + i32.const 0 + i32.load offset=18648 + i32.const 0 + i32.load offset=18632 + i32.const 0 + i32.load offset=18616 + i32.const 0 + i32.load offset=18568 + i32.const 0 + i32.load offset=18536 + i32.const 0 + i32.load offset=18504 + i32.const 0 + i32.load offset=18472 + i32.const 0 + i32.load offset=18440 + i32.const 0 + i32.load offset=18408 + i32.const 0 + i32.load offset=18376 + i32.const 0 + i32.load offset=18344 + i32.const 0 + i32.load offset=18312 + i32.const 0 + i32.load offset=18280 + i32.const 0 + i32.load offset=18248 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18216 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18600 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18792 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18888 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_6) + (func $test3_func_5_6 (type 1) + call $test3_func_5_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14708 + i32.const 0 + i32.load offset=14704 + i32.const 0 + i32.load offset=14700 + i32.const 0 + i32.load offset=14696 + i32.const 0 + i32.load offset=14692 + i32.const 0 + i32.load offset=14688 + i32.const 0 + i32.load offset=14684 + i32.const 0 + i32.load offset=14680 + i32.const 0 + i32.load offset=14676 + i32.const 0 + i32.load offset=14672 + i32.const 0 + i32.load offset=14668 + i32.const 0 + i32.load offset=14656 + i32.const 0 + i32.load offset=14648 + i32.const 0 + i32.load offset=14640 + i32.const 0 + i32.load offset=14632 + i32.const 0 + i32.load offset=14624 + i32.const 0 + i32.load offset=14616 + i32.const 0 + i32.load offset=14608 + i32.const 0 + i32.load offset=14600 + i32.const 0 + i32.load offset=14592 + i32.const 0 + i32.load offset=14584 + i32.const 0 + i32.load offset=14576 + i32.const 0 + i32.load offset=14552 + i32.const 0 + i32.load offset=14536 + i32.const 0 + i32.load offset=14520 + i32.const 0 + i32.load offset=14504 + i32.const 0 + i32.load offset=14488 + i32.const 0 + i32.load offset=14472 + i32.const 0 + i32.load offset=14456 + i32.const 0 + i32.load offset=14440 + i32.const 0 + i32.load offset=14424 + i32.const 0 + i32.load offset=14408 + i32.const 0 + i32.load offset=14392 + i32.const 0 + i32.load offset=14344 + i32.const 0 + i32.load offset=14312 + i32.const 0 + i32.load offset=14280 + i32.const 0 + i32.load offset=14248 + i32.const 0 + i32.load offset=14216 + i32.const 0 + i32.load offset=14184 + i32.const 0 + i32.load offset=14152 + i32.const 0 + i32.load offset=14120 + i32.const 0 + i32.load offset=14088 + i32.const 0 + i32.load offset=14056 + i32.const 0 + i32.load offset=14024 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13992 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14376 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14568 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14664 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_6) + (func $test3_func_4_6 (type 1) + call $test3_func_4_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10484 + i32.const 0 + i32.load offset=10480 + i32.const 0 + i32.load offset=10476 + i32.const 0 + i32.load offset=10472 + i32.const 0 + i32.load offset=10468 + i32.const 0 + i32.load offset=10464 + i32.const 0 + i32.load offset=10460 + i32.const 0 + i32.load offset=10456 + i32.const 0 + i32.load offset=10452 + i32.const 0 + i32.load offset=10448 + i32.const 0 + i32.load offset=10444 + i32.const 0 + i32.load offset=10432 + i32.const 0 + i32.load offset=10424 + i32.const 0 + i32.load offset=10416 + i32.const 0 + i32.load offset=10408 + i32.const 0 + i32.load offset=10400 + i32.const 0 + i32.load offset=10392 + i32.const 0 + i32.load offset=10384 + i32.const 0 + i32.load offset=10376 + i32.const 0 + i32.load offset=10368 + i32.const 0 + i32.load offset=10360 + i32.const 0 + i32.load offset=10352 + i32.const 0 + i32.load offset=10328 + i32.const 0 + i32.load offset=10312 + i32.const 0 + i32.load offset=10296 + i32.const 0 + i32.load offset=10280 + i32.const 0 + i32.load offset=10264 + i32.const 0 + i32.load offset=10248 + i32.const 0 + i32.load offset=10232 + i32.const 0 + i32.load offset=10216 + i32.const 0 + i32.load offset=10200 + i32.const 0 + i32.load offset=10184 + i32.const 0 + i32.load offset=10168 + i32.const 0 + i32.load offset=10120 + i32.const 0 + i32.load offset=10088 + i32.const 0 + i32.load offset=10056 + i32.const 0 + i32.load offset=10024 + i32.const 0 + i32.load offset=9992 + i32.const 0 + i32.load offset=9960 + i32.const 0 + i32.load offset=9928 + i32.const 0 + i32.load offset=9896 + i32.const 0 + i32.load offset=9864 + i32.const 0 + i32.load offset=9832 + i32.const 0 + i32.load offset=9800 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9768 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10152 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10344 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10440 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_6) + (func $test3_func_3_6 (type 1) + call $test3_func_3_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6260 + i32.const 0 + i32.load offset=6256 + i32.const 0 + i32.load offset=6252 + i32.const 0 + i32.load offset=6248 + i32.const 0 + i32.load offset=6244 + i32.const 0 + i32.load offset=6240 + i32.const 0 + i32.load offset=6236 + i32.const 0 + i32.load offset=6232 + i32.const 0 + i32.load offset=6228 + i32.const 0 + i32.load offset=6224 + i32.const 0 + i32.load offset=6220 + i32.const 0 + i32.load offset=6208 + i32.const 0 + i32.load offset=6200 + i32.const 0 + i32.load offset=6192 + i32.const 0 + i32.load offset=6184 + i32.const 0 + i32.load offset=6176 + i32.const 0 + i32.load offset=6168 + i32.const 0 + i32.load offset=6160 + i32.const 0 + i32.load offset=6152 + i32.const 0 + i32.load offset=6144 + i32.const 0 + i32.load offset=6136 + i32.const 0 + i32.load offset=6128 + i32.const 0 + i32.load offset=6104 + i32.const 0 + i32.load offset=6088 + i32.const 0 + i32.load offset=6072 + i32.const 0 + i32.load offset=6056 + i32.const 0 + i32.load offset=6040 + i32.const 0 + i32.load offset=6024 + i32.const 0 + i32.load offset=6008 + i32.const 0 + i32.load offset=5992 + i32.const 0 + i32.load offset=5976 + i32.const 0 + i32.load offset=5960 + i32.const 0 + i32.load offset=5944 + i32.const 0 + i32.load offset=5896 + i32.const 0 + i32.load offset=5864 + i32.const 0 + i32.load offset=5832 + i32.const 0 + i32.load offset=5800 + i32.const 0 + i32.load offset=5768 + i32.const 0 + i32.load offset=5736 + i32.const 0 + i32.load offset=5704 + i32.const 0 + i32.load offset=5672 + i32.const 0 + i32.load offset=5640 + i32.const 0 + i32.load offset=5608 + i32.const 0 + i32.load offset=5576 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5544 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5928 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6120 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6216 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_6) + (func $test3_func_2_6 (type 1) + call $test3_func_2_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2032 + i32.const 0 + i32.load offset=2028 + i32.const 0 + i32.load offset=2024 + i32.const 0 + i32.load offset=2020 + i32.const 0 + i32.load offset=2016 + i32.const 0 + i32.load offset=2012 + i32.const 0 + i32.load offset=2008 + i32.const 0 + i32.load offset=2004 + i32.const 0 + i32.load offset=2000 + i32.const 0 + i32.load offset=1996 + i32.const 0 + i32.load offset=1984 + i32.const 0 + i32.load offset=1976 + i32.const 0 + i32.load offset=1968 + i32.const 0 + i32.load offset=1960 + i32.const 0 + i32.load offset=1952 + i32.const 0 + i32.load offset=1944 + i32.const 0 + i32.load offset=1936 + i32.const 0 + i32.load offset=1928 + i32.const 0 + i32.load offset=1920 + i32.const 0 + i32.load offset=1912 + i32.const 0 + i32.load offset=1904 + i32.const 0 + i32.load offset=1880 + i32.const 0 + i32.load offset=1864 + i32.const 0 + i32.load offset=1848 + i32.const 0 + i32.load offset=1832 + i32.const 0 + i32.load offset=1816 + i32.const 0 + i32.load offset=1800 + i32.const 0 + i32.load offset=1784 + i32.const 0 + i32.load offset=1768 + i32.const 0 + i32.load offset=1752 + i32.const 0 + i32.load offset=1736 + i32.const 0 + i32.load offset=1720 + i32.const 0 + i32.load offset=1672 + i32.const 0 + i32.load offset=1640 + i32.const 0 + i32.load offset=1608 + i32.const 0 + i32.load offset=1576 + i32.const 0 + i32.load offset=1544 + i32.const 0 + i32.load offset=1512 + i32.const 0 + i32.load offset=1480 + i32.const 0 + i32.load offset=1448 + i32.const 0 + i32.load offset=1416 + i32.const 0 + i32.load offset=1384 + i32.const 0 + i32.load offset=1352 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1320 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1704 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1896 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1992 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_6) + (func $test3_func_1_6 (type 1) + call $test3_func_1_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=30580 + i32.const 0 + i32.load offset=30576 + i32.const 0 + i32.load offset=30572 + i32.const 0 + i32.load offset=30568 + i32.const 0 + i32.load offset=30564 + i32.const 0 + i32.load offset=30560 + i32.const 0 + i32.load offset=30556 + i32.const 0 + i32.load offset=30552 + i32.const 0 + i32.load offset=30548 + i32.const 0 + i32.load offset=30544 + i32.const 0 + i32.load offset=30540 + i32.const 0 + i32.load offset=30528 + i32.const 0 + i32.load offset=30520 + i32.const 0 + i32.load offset=30512 + i32.const 0 + i32.load offset=30504 + i32.const 0 + i32.load offset=30496 + i32.const 0 + i32.load offset=30488 + i32.const 0 + i32.load offset=30480 + i32.const 0 + i32.load offset=30472 + i32.const 0 + i32.load offset=30464 + i32.const 0 + i32.load offset=30456 + i32.const 0 + i32.load offset=30448 + i32.const 0 + i32.load offset=30424 + i32.const 0 + i32.load offset=30408 + i32.const 0 + i32.load offset=30392 + i32.const 0 + i32.load offset=30376 + i32.const 0 + i32.load offset=30360 + i32.const 0 + i32.load offset=30344 + i32.const 0 + i32.load offset=30328 + i32.const 0 + i32.load offset=30312 + i32.const 0 + i32.load offset=30296 + i32.const 0 + i32.load offset=30280 + i32.const 0 + i32.load offset=30264 + i32.const 0 + i32.load offset=30216 + i32.const 0 + i32.load offset=30184 + i32.const 0 + i32.load offset=30152 + i32.const 0 + i32.load offset=30120 + i32.const 0 + i32.load offset=30088 + i32.const 0 + i32.load offset=30056 + i32.const 0 + i32.load offset=30024 + i32.const 0 + i32.load offset=29992 + i32.const 0 + i32.load offset=29960 + i32.const 0 + i32.load offset=29928 + i32.const 0 + i32.load offset=29896 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=29864 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30248 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30440 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30536 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_6) + (func $test3_func_0_6 (type 1) + call $test3_func_0_7 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26356 + i32.const 0 + i32.load offset=26352 + i32.const 0 + i32.load offset=26348 + i32.const 0 + i32.load offset=26344 + i32.const 0 + i32.load offset=26340 + i32.const 0 + i32.load offset=26336 + i32.const 0 + i32.load offset=26332 + i32.const 0 + i32.load offset=26328 + i32.const 0 + i32.load offset=26324 + i32.const 0 + i32.load offset=26320 + i32.const 0 + i32.load offset=26316 + i32.const 0 + i32.load offset=26304 + i32.const 0 + i32.load offset=26296 + i32.const 0 + i32.load offset=26288 + i32.const 0 + i32.load offset=26280 + i32.const 0 + i32.load offset=26272 + i32.const 0 + i32.load offset=26264 + i32.const 0 + i32.load offset=26256 + i32.const 0 + i32.load offset=26248 + i32.const 0 + i32.load offset=26240 + i32.const 0 + i32.load offset=26232 + i32.const 0 + i32.load offset=26224 + i32.const 0 + i32.load offset=26200 + i32.const 0 + i32.load offset=26184 + i32.const 0 + i32.load offset=26168 + i32.const 0 + i32.load offset=26152 + i32.const 0 + i32.load offset=26136 + i32.const 0 + i32.load offset=26120 + i32.const 0 + i32.load offset=26104 + i32.const 0 + i32.load offset=26088 + i32.const 0 + i32.load offset=26072 + i32.const 0 + i32.load offset=26056 + i32.const 0 + i32.load offset=26040 + i32.const 0 + i32.load offset=25992 + i32.const 0 + i32.load offset=25960 + i32.const 0 + i32.load offset=25928 + i32.const 0 + i32.load offset=25896 + i32.const 0 + i32.load offset=25864 + i32.const 0 + i32.load offset=25832 + i32.const 0 + i32.load offset=25800 + i32.const 0 + i32.load offset=25768 + i32.const 0 + i32.load offset=25736 + i32.const 0 + i32.load offset=25704 + i32.const 0 + i32.load offset=25672 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=25640 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26024 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26216 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26312 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_6) + (func $test3_func_10_5 (type 1) + call $test3_func_10_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31728 + i32.const 0 + i32.load offset=31724 + i32.const 0 + i32.load offset=31720 + i32.const 0 + i32.load offset=31716 + i32.const 0 + i32.load offset=31712 + i32.const 0 + i32.load offset=31708 + i32.const 0 + i32.load offset=31704 + i32.const 0 + i32.load offset=31700 + i32.const 0 + i32.load offset=31696 + i32.const 0 + i32.load offset=31692 + i32.const 0 + i32.load offset=31688 + i32.const 0 + i32.load offset=31676 + i32.const 0 + i32.load offset=31668 + i32.const 0 + i32.load offset=31660 + i32.const 0 + i32.load offset=31652 + i32.const 0 + i32.load offset=31644 + i32.const 0 + i32.load offset=31636 + i32.const 0 + i32.load offset=31628 + i32.const 0 + i32.load offset=31620 + i32.const 0 + i32.load offset=31612 + i32.const 0 + i32.load offset=31604 + i32.const 0 + i32.load offset=31596 + i32.const 0 + i32.load offset=31572 + i32.const 0 + i32.load offset=31556 + i32.const 0 + i32.load offset=31540 + i32.const 0 + i32.load offset=31524 + i32.const 0 + i32.load offset=31508 + i32.const 0 + i32.load offset=31492 + i32.const 0 + i32.load offset=31476 + i32.const 0 + i32.load offset=31460 + i32.const 0 + i32.load offset=31444 + i32.const 0 + i32.load offset=31428 + i32.const 0 + i32.load offset=31412 + i32.const 0 + i32.load offset=31364 + i32.const 0 + i32.load offset=31332 + i32.const 0 + i32.load offset=31300 + i32.const 0 + i32.load offset=31268 + i32.const 0 + i32.load offset=31236 + i32.const 0 + i32.load offset=31204 + i32.const 0 + i32.load offset=31172 + i32.const 0 + i32.load offset=31140 + i32.const 0 + i32.load offset=31108 + i32.const 0 + i32.load offset=31076 + i32.const 0 + i32.load offset=31044 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=31012 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31396 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31588 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31684 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_5 (type 1) + call $test3_func_9_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27504 + i32.const 0 + i32.load offset=27500 + i32.const 0 + i32.load offset=27496 + i32.const 0 + i32.load offset=27492 + i32.const 0 + i32.load offset=27488 + i32.const 0 + i32.load offset=27484 + i32.const 0 + i32.load offset=27480 + i32.const 0 + i32.load offset=27476 + i32.const 0 + i32.load offset=27472 + i32.const 0 + i32.load offset=27468 + i32.const 0 + i32.load offset=27464 + i32.const 0 + i32.load offset=27452 + i32.const 0 + i32.load offset=27444 + i32.const 0 + i32.load offset=27436 + i32.const 0 + i32.load offset=27428 + i32.const 0 + i32.load offset=27420 + i32.const 0 + i32.load offset=27412 + i32.const 0 + i32.load offset=27404 + i32.const 0 + i32.load offset=27396 + i32.const 0 + i32.load offset=27388 + i32.const 0 + i32.load offset=27380 + i32.const 0 + i32.load offset=27372 + i32.const 0 + i32.load offset=27348 + i32.const 0 + i32.load offset=27332 + i32.const 0 + i32.load offset=27316 + i32.const 0 + i32.load offset=27300 + i32.const 0 + i32.load offset=27284 + i32.const 0 + i32.load offset=27268 + i32.const 0 + i32.load offset=27252 + i32.const 0 + i32.load offset=27236 + i32.const 0 + i32.load offset=27220 + i32.const 0 + i32.load offset=27204 + i32.const 0 + i32.load offset=27188 + i32.const 0 + i32.load offset=27140 + i32.const 0 + i32.load offset=27108 + i32.const 0 + i32.load offset=27076 + i32.const 0 + i32.load offset=27044 + i32.const 0 + i32.load offset=27012 + i32.const 0 + i32.load offset=26980 + i32.const 0 + i32.load offset=26948 + i32.const 0 + i32.load offset=26916 + i32.const 0 + i32.load offset=26884 + i32.const 0 + i32.load offset=26852 + i32.const 0 + i32.load offset=26820 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26788 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27172 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27364 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27460 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_5) + (func $test3_func_8_5 (type 1) + call $test3_func_8_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=23280 + i32.const 0 + i32.load offset=23276 + i32.const 0 + i32.load offset=23272 + i32.const 0 + i32.load offset=23268 + i32.const 0 + i32.load offset=23264 + i32.const 0 + i32.load offset=23260 + i32.const 0 + i32.load offset=23256 + i32.const 0 + i32.load offset=23252 + i32.const 0 + i32.load offset=23248 + i32.const 0 + i32.load offset=23244 + i32.const 0 + i32.load offset=23240 + i32.const 0 + i32.load offset=23228 + i32.const 0 + i32.load offset=23220 + i32.const 0 + i32.load offset=23212 + i32.const 0 + i32.load offset=23204 + i32.const 0 + i32.load offset=23196 + i32.const 0 + i32.load offset=23188 + i32.const 0 + i32.load offset=23180 + i32.const 0 + i32.load offset=23172 + i32.const 0 + i32.load offset=23164 + i32.const 0 + i32.load offset=23156 + i32.const 0 + i32.load offset=23148 + i32.const 0 + i32.load offset=23124 + i32.const 0 + i32.load offset=23108 + i32.const 0 + i32.load offset=23092 + i32.const 0 + i32.load offset=23076 + i32.const 0 + i32.load offset=23060 + i32.const 0 + i32.load offset=23044 + i32.const 0 + i32.load offset=23028 + i32.const 0 + i32.load offset=23012 + i32.const 0 + i32.load offset=22996 + i32.const 0 + i32.load offset=22980 + i32.const 0 + i32.load offset=22964 + i32.const 0 + i32.load offset=22916 + i32.const 0 + i32.load offset=22884 + i32.const 0 + i32.load offset=22852 + i32.const 0 + i32.load offset=22820 + i32.const 0 + i32.load offset=22788 + i32.const 0 + i32.load offset=22756 + i32.const 0 + i32.load offset=22724 + i32.const 0 + i32.load offset=22692 + i32.const 0 + i32.load offset=22660 + i32.const 0 + i32.load offset=22628 + i32.const 0 + i32.load offset=22596 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22564 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22948 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23140 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23236 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_5) + (func $test3_func_7_5 (type 1) + call $test3_func_7_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=19056 + i32.const 0 + i32.load offset=19052 + i32.const 0 + i32.load offset=19048 + i32.const 0 + i32.load offset=19044 + i32.const 0 + i32.load offset=19040 + i32.const 0 + i32.load offset=19036 + i32.const 0 + i32.load offset=19032 + i32.const 0 + i32.load offset=19028 + i32.const 0 + i32.load offset=19024 + i32.const 0 + i32.load offset=19020 + i32.const 0 + i32.load offset=19016 + i32.const 0 + i32.load offset=19004 + i32.const 0 + i32.load offset=18996 + i32.const 0 + i32.load offset=18988 + i32.const 0 + i32.load offset=18980 + i32.const 0 + i32.load offset=18972 + i32.const 0 + i32.load offset=18964 + i32.const 0 + i32.load offset=18956 + i32.const 0 + i32.load offset=18948 + i32.const 0 + i32.load offset=18940 + i32.const 0 + i32.load offset=18932 + i32.const 0 + i32.load offset=18924 + i32.const 0 + i32.load offset=18900 + i32.const 0 + i32.load offset=18884 + i32.const 0 + i32.load offset=18868 + i32.const 0 + i32.load offset=18852 + i32.const 0 + i32.load offset=18836 + i32.const 0 + i32.load offset=18820 + i32.const 0 + i32.load offset=18804 + i32.const 0 + i32.load offset=18788 + i32.const 0 + i32.load offset=18772 + i32.const 0 + i32.load offset=18756 + i32.const 0 + i32.load offset=18740 + i32.const 0 + i32.load offset=18692 + i32.const 0 + i32.load offset=18660 + i32.const 0 + i32.load offset=18628 + i32.const 0 + i32.load offset=18596 + i32.const 0 + i32.load offset=18564 + i32.const 0 + i32.load offset=18532 + i32.const 0 + i32.load offset=18500 + i32.const 0 + i32.load offset=18468 + i32.const 0 + i32.load offset=18436 + i32.const 0 + i32.load offset=18404 + i32.const 0 + i32.load offset=18372 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18340 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18724 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18916 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19012 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_5) + (func $test3_func_6_5 (type 1) + call $test3_func_6_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14832 + i32.const 0 + i32.load offset=14828 + i32.const 0 + i32.load offset=14824 + i32.const 0 + i32.load offset=14820 + i32.const 0 + i32.load offset=14816 + i32.const 0 + i32.load offset=14812 + i32.const 0 + i32.load offset=14808 + i32.const 0 + i32.load offset=14804 + i32.const 0 + i32.load offset=14800 + i32.const 0 + i32.load offset=14796 + i32.const 0 + i32.load offset=14792 + i32.const 0 + i32.load offset=14780 + i32.const 0 + i32.load offset=14772 + i32.const 0 + i32.load offset=14764 + i32.const 0 + i32.load offset=14756 + i32.const 0 + i32.load offset=14748 + i32.const 0 + i32.load offset=14740 + i32.const 0 + i32.load offset=14732 + i32.const 0 + i32.load offset=14724 + i32.const 0 + i32.load offset=14716 + i32.const 0 + i32.load offset=14708 + i32.const 0 + i32.load offset=14700 + i32.const 0 + i32.load offset=14676 + i32.const 0 + i32.load offset=14660 + i32.const 0 + i32.load offset=14644 + i32.const 0 + i32.load offset=14628 + i32.const 0 + i32.load offset=14612 + i32.const 0 + i32.load offset=14596 + i32.const 0 + i32.load offset=14580 + i32.const 0 + i32.load offset=14564 + i32.const 0 + i32.load offset=14548 + i32.const 0 + i32.load offset=14532 + i32.const 0 + i32.load offset=14516 + i32.const 0 + i32.load offset=14468 + i32.const 0 + i32.load offset=14436 + i32.const 0 + i32.load offset=14404 + i32.const 0 + i32.load offset=14372 + i32.const 0 + i32.load offset=14340 + i32.const 0 + i32.load offset=14308 + i32.const 0 + i32.load offset=14276 + i32.const 0 + i32.load offset=14244 + i32.const 0 + i32.load offset=14212 + i32.const 0 + i32.load offset=14180 + i32.const 0 + i32.load offset=14148 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14116 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14500 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14692 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14788 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_5) + (func $test3_func_5_5 (type 1) + call $test3_func_5_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10608 + i32.const 0 + i32.load offset=10604 + i32.const 0 + i32.load offset=10600 + i32.const 0 + i32.load offset=10596 + i32.const 0 + i32.load offset=10592 + i32.const 0 + i32.load offset=10588 + i32.const 0 + i32.load offset=10584 + i32.const 0 + i32.load offset=10580 + i32.const 0 + i32.load offset=10576 + i32.const 0 + i32.load offset=10572 + i32.const 0 + i32.load offset=10568 + i32.const 0 + i32.load offset=10556 + i32.const 0 + i32.load offset=10548 + i32.const 0 + i32.load offset=10540 + i32.const 0 + i32.load offset=10532 + i32.const 0 + i32.load offset=10524 + i32.const 0 + i32.load offset=10516 + i32.const 0 + i32.load offset=10508 + i32.const 0 + i32.load offset=10500 + i32.const 0 + i32.load offset=10492 + i32.const 0 + i32.load offset=10484 + i32.const 0 + i32.load offset=10476 + i32.const 0 + i32.load offset=10452 + i32.const 0 + i32.load offset=10436 + i32.const 0 + i32.load offset=10420 + i32.const 0 + i32.load offset=10404 + i32.const 0 + i32.load offset=10388 + i32.const 0 + i32.load offset=10372 + i32.const 0 + i32.load offset=10356 + i32.const 0 + i32.load offset=10340 + i32.const 0 + i32.load offset=10324 + i32.const 0 + i32.load offset=10308 + i32.const 0 + i32.load offset=10292 + i32.const 0 + i32.load offset=10244 + i32.const 0 + i32.load offset=10212 + i32.const 0 + i32.load offset=10180 + i32.const 0 + i32.load offset=10148 + i32.const 0 + i32.load offset=10116 + i32.const 0 + i32.load offset=10084 + i32.const 0 + i32.load offset=10052 + i32.const 0 + i32.load offset=10020 + i32.const 0 + i32.load offset=9988 + i32.const 0 + i32.load offset=9956 + i32.const 0 + i32.load offset=9924 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9892 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10276 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10468 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10564 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_5) + (func $test3_func_4_5 (type 1) + call $test3_func_4_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6384 + i32.const 0 + i32.load offset=6380 + i32.const 0 + i32.load offset=6376 + i32.const 0 + i32.load offset=6372 + i32.const 0 + i32.load offset=6368 + i32.const 0 + i32.load offset=6364 + i32.const 0 + i32.load offset=6360 + i32.const 0 + i32.load offset=6356 + i32.const 0 + i32.load offset=6352 + i32.const 0 + i32.load offset=6348 + i32.const 0 + i32.load offset=6344 + i32.const 0 + i32.load offset=6332 + i32.const 0 + i32.load offset=6324 + i32.const 0 + i32.load offset=6316 + i32.const 0 + i32.load offset=6308 + i32.const 0 + i32.load offset=6300 + i32.const 0 + i32.load offset=6292 + i32.const 0 + i32.load offset=6284 + i32.const 0 + i32.load offset=6276 + i32.const 0 + i32.load offset=6268 + i32.const 0 + i32.load offset=6260 + i32.const 0 + i32.load offset=6252 + i32.const 0 + i32.load offset=6228 + i32.const 0 + i32.load offset=6212 + i32.const 0 + i32.load offset=6196 + i32.const 0 + i32.load offset=6180 + i32.const 0 + i32.load offset=6164 + i32.const 0 + i32.load offset=6148 + i32.const 0 + i32.load offset=6132 + i32.const 0 + i32.load offset=6116 + i32.const 0 + i32.load offset=6100 + i32.const 0 + i32.load offset=6084 + i32.const 0 + i32.load offset=6068 + i32.const 0 + i32.load offset=6020 + i32.const 0 + i32.load offset=5988 + i32.const 0 + i32.load offset=5956 + i32.const 0 + i32.load offset=5924 + i32.const 0 + i32.load offset=5892 + i32.const 0 + i32.load offset=5860 + i32.const 0 + i32.load offset=5828 + i32.const 0 + i32.load offset=5796 + i32.const 0 + i32.load offset=5764 + i32.const 0 + i32.load offset=5732 + i32.const 0 + i32.load offset=5700 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5668 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6052 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6244 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6340 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_5) + (func $test3_func_3_5 (type 1) + call $test3_func_3_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2160 + i32.const 0 + i32.load offset=2156 + i32.const 0 + i32.load offset=2152 + i32.const 0 + i32.load offset=2148 + i32.const 0 + i32.load offset=2144 + i32.const 0 + i32.load offset=2140 + i32.const 0 + i32.load offset=2136 + i32.const 0 + i32.load offset=2132 + i32.const 0 + i32.load offset=2128 + i32.const 0 + i32.load offset=2124 + i32.const 0 + i32.load offset=2120 + i32.const 0 + i32.load offset=2108 + i32.const 0 + i32.load offset=2100 + i32.const 0 + i32.load offset=2092 + i32.const 0 + i32.load offset=2084 + i32.const 0 + i32.load offset=2076 + i32.const 0 + i32.load offset=2068 + i32.const 0 + i32.load offset=2060 + i32.const 0 + i32.load offset=2052 + i32.const 0 + i32.load offset=2044 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2028 + i32.const 0 + i32.load offset=2004 + i32.const 0 + i32.load offset=1988 + i32.const 0 + i32.load offset=1972 + i32.const 0 + i32.load offset=1956 + i32.const 0 + i32.load offset=1940 + i32.const 0 + i32.load offset=1924 + i32.const 0 + i32.load offset=1908 + i32.const 0 + i32.load offset=1892 + i32.const 0 + i32.load offset=1876 + i32.const 0 + i32.load offset=1860 + i32.const 0 + i32.load offset=1844 + i32.const 0 + i32.load offset=1796 + i32.const 0 + i32.load offset=1764 + i32.const 0 + i32.load offset=1732 + i32.const 0 + i32.load offset=1700 + i32.const 0 + i32.load offset=1668 + i32.const 0 + i32.load offset=1636 + i32.const 0 + i32.load offset=1604 + i32.const 0 + i32.load offset=1572 + i32.const 0 + i32.load offset=1540 + i32.const 0 + i32.load offset=1508 + i32.const 0 + i32.load offset=1476 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1444 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1828 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2020 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2116 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_5) + (func $test3_func_2_5 (type 1) + call $test3_func_2_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=30704 + i32.const 0 + i32.load offset=30700 + i32.const 0 + i32.load offset=30696 + i32.const 0 + i32.load offset=30692 + i32.const 0 + i32.load offset=30688 + i32.const 0 + i32.load offset=30684 + i32.const 0 + i32.load offset=30680 + i32.const 0 + i32.load offset=30676 + i32.const 0 + i32.load offset=30672 + i32.const 0 + i32.load offset=30668 + i32.const 0 + i32.load offset=30664 + i32.const 0 + i32.load offset=30652 + i32.const 0 + i32.load offset=30644 + i32.const 0 + i32.load offset=30636 + i32.const 0 + i32.load offset=30628 + i32.const 0 + i32.load offset=30620 + i32.const 0 + i32.load offset=30612 + i32.const 0 + i32.load offset=30604 + i32.const 0 + i32.load offset=30596 + i32.const 0 + i32.load offset=30588 + i32.const 0 + i32.load offset=30580 + i32.const 0 + i32.load offset=30572 + i32.const 0 + i32.load offset=30548 + i32.const 0 + i32.load offset=30532 + i32.const 0 + i32.load offset=30516 + i32.const 0 + i32.load offset=30500 + i32.const 0 + i32.load offset=30484 + i32.const 0 + i32.load offset=30468 + i32.const 0 + i32.load offset=30452 + i32.const 0 + i32.load offset=30436 + i32.const 0 + i32.load offset=30420 + i32.const 0 + i32.load offset=30404 + i32.const 0 + i32.load offset=30388 + i32.const 0 + i32.load offset=30340 + i32.const 0 + i32.load offset=30308 + i32.const 0 + i32.load offset=30276 + i32.const 0 + i32.load offset=30244 + i32.const 0 + i32.load offset=30212 + i32.const 0 + i32.load offset=30180 + i32.const 0 + i32.load offset=30148 + i32.const 0 + i32.load offset=30116 + i32.const 0 + i32.load offset=30084 + i32.const 0 + i32.load offset=30052 + i32.const 0 + i32.load offset=30020 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=29988 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30372 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30564 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30660 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_5) + (func $test3_func_1_5 (type 1) + call $test3_func_1_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26480 + i32.const 0 + i32.load offset=26476 + i32.const 0 + i32.load offset=26472 + i32.const 0 + i32.load offset=26468 + i32.const 0 + i32.load offset=26464 + i32.const 0 + i32.load offset=26460 + i32.const 0 + i32.load offset=26456 + i32.const 0 + i32.load offset=26452 + i32.const 0 + i32.load offset=26448 + i32.const 0 + i32.load offset=26444 + i32.const 0 + i32.load offset=26440 + i32.const 0 + i32.load offset=26428 + i32.const 0 + i32.load offset=26420 + i32.const 0 + i32.load offset=26412 + i32.const 0 + i32.load offset=26404 + i32.const 0 + i32.load offset=26396 + i32.const 0 + i32.load offset=26388 + i32.const 0 + i32.load offset=26380 + i32.const 0 + i32.load offset=26372 + i32.const 0 + i32.load offset=26364 + i32.const 0 + i32.load offset=26356 + i32.const 0 + i32.load offset=26348 + i32.const 0 + i32.load offset=26324 + i32.const 0 + i32.load offset=26308 + i32.const 0 + i32.load offset=26292 + i32.const 0 + i32.load offset=26276 + i32.const 0 + i32.load offset=26260 + i32.const 0 + i32.load offset=26244 + i32.const 0 + i32.load offset=26228 + i32.const 0 + i32.load offset=26212 + i32.const 0 + i32.load offset=26196 + i32.const 0 + i32.load offset=26180 + i32.const 0 + i32.load offset=26164 + i32.const 0 + i32.load offset=26116 + i32.const 0 + i32.load offset=26084 + i32.const 0 + i32.load offset=26052 + i32.const 0 + i32.load offset=26020 + i32.const 0 + i32.load offset=25988 + i32.const 0 + i32.load offset=25956 + i32.const 0 + i32.load offset=25924 + i32.const 0 + i32.load offset=25892 + i32.const 0 + i32.load offset=25860 + i32.const 0 + i32.load offset=25828 + i32.const 0 + i32.load offset=25796 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=25764 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26148 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26340 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26436 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_5) + (func $test3_func_0_5 (type 1) + call $test3_func_0_6 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22256 + i32.const 0 + i32.load offset=22252 + i32.const 0 + i32.load offset=22248 + i32.const 0 + i32.load offset=22244 + i32.const 0 + i32.load offset=22240 + i32.const 0 + i32.load offset=22236 + i32.const 0 + i32.load offset=22232 + i32.const 0 + i32.load offset=22228 + i32.const 0 + i32.load offset=22224 + i32.const 0 + i32.load offset=22220 + i32.const 0 + i32.load offset=22216 + i32.const 0 + i32.load offset=22204 + i32.const 0 + i32.load offset=22196 + i32.const 0 + i32.load offset=22188 + i32.const 0 + i32.load offset=22180 + i32.const 0 + i32.load offset=22172 + i32.const 0 + i32.load offset=22164 + i32.const 0 + i32.load offset=22156 + i32.const 0 + i32.load offset=22148 + i32.const 0 + i32.load offset=22140 + i32.const 0 + i32.load offset=22132 + i32.const 0 + i32.load offset=22124 + i32.const 0 + i32.load offset=22100 + i32.const 0 + i32.load offset=22084 + i32.const 0 + i32.load offset=22068 + i32.const 0 + i32.load offset=22052 + i32.const 0 + i32.load offset=22036 + i32.const 0 + i32.load offset=22020 + i32.const 0 + i32.load offset=22004 + i32.const 0 + i32.load offset=21988 + i32.const 0 + i32.load offset=21972 + i32.const 0 + i32.load offset=21956 + i32.const 0 + i32.load offset=21940 + i32.const 0 + i32.load offset=21892 + i32.const 0 + i32.load offset=21860 + i32.const 0 + i32.load offset=21828 + i32.const 0 + i32.load offset=21796 + i32.const 0 + i32.load offset=21764 + i32.const 0 + i32.load offset=21732 + i32.const 0 + i32.load offset=21700 + i32.const 0 + i32.load offset=21668 + i32.const 0 + i32.load offset=21636 + i32.const 0 + i32.load offset=21604 + i32.const 0 + i32.load offset=21572 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=21540 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=21924 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22116 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22212 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_5) + (func $test3_func_10_4 (type 1) + call $test3_func_10_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27628 + i32.const 0 + i32.load offset=27624 + i32.const 0 + i32.load offset=27620 + i32.const 0 + i32.load offset=27616 + i32.const 0 + i32.load offset=27612 + i32.const 0 + i32.load offset=27608 + i32.const 0 + i32.load offset=27604 + i32.const 0 + i32.load offset=27600 + i32.const 0 + i32.load offset=27596 + i32.const 0 + i32.load offset=27592 + i32.const 0 + i32.load offset=27588 + i32.const 0 + i32.load offset=27576 + i32.const 0 + i32.load offset=27568 + i32.const 0 + i32.load offset=27560 + i32.const 0 + i32.load offset=27552 + i32.const 0 + i32.load offset=27544 + i32.const 0 + i32.load offset=27536 + i32.const 0 + i32.load offset=27528 + i32.const 0 + i32.load offset=27520 + i32.const 0 + i32.load offset=27512 + i32.const 0 + i32.load offset=27504 + i32.const 0 + i32.load offset=27496 + i32.const 0 + i32.load offset=27472 + i32.const 0 + i32.load offset=27456 + i32.const 0 + i32.load offset=27440 + i32.const 0 + i32.load offset=27424 + i32.const 0 + i32.load offset=27408 + i32.const 0 + i32.load offset=27392 + i32.const 0 + i32.load offset=27376 + i32.const 0 + i32.load offset=27360 + i32.const 0 + i32.load offset=27344 + i32.const 0 + i32.load offset=27328 + i32.const 0 + i32.load offset=27312 + i32.const 0 + i32.load offset=27264 + i32.const 0 + i32.load offset=27232 + i32.const 0 + i32.load offset=27200 + i32.const 0 + i32.load offset=27168 + i32.const 0 + i32.load offset=27136 + i32.const 0 + i32.load offset=27104 + i32.const 0 + i32.load offset=27072 + i32.const 0 + i32.load offset=27040 + i32.const 0 + i32.load offset=27008 + i32.const 0 + i32.load offset=26976 + i32.const 0 + i32.load offset=26944 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26912 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27296 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27488 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27584 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_4 (type 1) + call $test3_func_9_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=23404 + i32.const 0 + i32.load offset=23400 + i32.const 0 + i32.load offset=23396 + i32.const 0 + i32.load offset=23392 + i32.const 0 + i32.load offset=23388 + i32.const 0 + i32.load offset=23384 + i32.const 0 + i32.load offset=23380 + i32.const 0 + i32.load offset=23376 + i32.const 0 + i32.load offset=23372 + i32.const 0 + i32.load offset=23368 + i32.const 0 + i32.load offset=23364 + i32.const 0 + i32.load offset=23352 + i32.const 0 + i32.load offset=23344 + i32.const 0 + i32.load offset=23336 + i32.const 0 + i32.load offset=23328 + i32.const 0 + i32.load offset=23320 + i32.const 0 + i32.load offset=23312 + i32.const 0 + i32.load offset=23304 + i32.const 0 + i32.load offset=23296 + i32.const 0 + i32.load offset=23288 + i32.const 0 + i32.load offset=23280 + i32.const 0 + i32.load offset=23272 + i32.const 0 + i32.load offset=23248 + i32.const 0 + i32.load offset=23232 + i32.const 0 + i32.load offset=23216 + i32.const 0 + i32.load offset=23200 + i32.const 0 + i32.load offset=23184 + i32.const 0 + i32.load offset=23168 + i32.const 0 + i32.load offset=23152 + i32.const 0 + i32.load offset=23136 + i32.const 0 + i32.load offset=23120 + i32.const 0 + i32.load offset=23104 + i32.const 0 + i32.load offset=23088 + i32.const 0 + i32.load offset=23040 + i32.const 0 + i32.load offset=23008 + i32.const 0 + i32.load offset=22976 + i32.const 0 + i32.load offset=22944 + i32.const 0 + i32.load offset=22912 + i32.const 0 + i32.load offset=22880 + i32.const 0 + i32.load offset=22848 + i32.const 0 + i32.load offset=22816 + i32.const 0 + i32.load offset=22784 + i32.const 0 + i32.load offset=22752 + i32.const 0 + i32.load offset=22720 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22688 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23072 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23264 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23360 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_4) + (func $test3_func_8_4 (type 1) + call $test3_func_8_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=19180 + i32.const 0 + i32.load offset=19176 + i32.const 0 + i32.load offset=19172 + i32.const 0 + i32.load offset=19168 + i32.const 0 + i32.load offset=19164 + i32.const 0 + i32.load offset=19160 + i32.const 0 + i32.load offset=19156 + i32.const 0 + i32.load offset=19152 + i32.const 0 + i32.load offset=19148 + i32.const 0 + i32.load offset=19144 + i32.const 0 + i32.load offset=19140 + i32.const 0 + i32.load offset=19128 + i32.const 0 + i32.load offset=19120 + i32.const 0 + i32.load offset=19112 + i32.const 0 + i32.load offset=19104 + i32.const 0 + i32.load offset=19096 + i32.const 0 + i32.load offset=19088 + i32.const 0 + i32.load offset=19080 + i32.const 0 + i32.load offset=19072 + i32.const 0 + i32.load offset=19064 + i32.const 0 + i32.load offset=19056 + i32.const 0 + i32.load offset=19048 + i32.const 0 + i32.load offset=19024 + i32.const 0 + i32.load offset=19008 + i32.const 0 + i32.load offset=18992 + i32.const 0 + i32.load offset=18976 + i32.const 0 + i32.load offset=18960 + i32.const 0 + i32.load offset=18944 + i32.const 0 + i32.load offset=18928 + i32.const 0 + i32.load offset=18912 + i32.const 0 + i32.load offset=18896 + i32.const 0 + i32.load offset=18880 + i32.const 0 + i32.load offset=18864 + i32.const 0 + i32.load offset=18816 + i32.const 0 + i32.load offset=18784 + i32.const 0 + i32.load offset=18752 + i32.const 0 + i32.load offset=18720 + i32.const 0 + i32.load offset=18688 + i32.const 0 + i32.load offset=18656 + i32.const 0 + i32.load offset=18624 + i32.const 0 + i32.load offset=18592 + i32.const 0 + i32.load offset=18560 + i32.const 0 + i32.load offset=18528 + i32.const 0 + i32.load offset=18496 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18464 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18848 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19040 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19136 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_4) + (func $test3_func_7_4 (type 1) + call $test3_func_7_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14956 + i32.const 0 + i32.load offset=14952 + i32.const 0 + i32.load offset=14948 + i32.const 0 + i32.load offset=14944 + i32.const 0 + i32.load offset=14940 + i32.const 0 + i32.load offset=14936 + i32.const 0 + i32.load offset=14932 + i32.const 0 + i32.load offset=14928 + i32.const 0 + i32.load offset=14924 + i32.const 0 + i32.load offset=14920 + i32.const 0 + i32.load offset=14916 + i32.const 0 + i32.load offset=14904 + i32.const 0 + i32.load offset=14896 + i32.const 0 + i32.load offset=14888 + i32.const 0 + i32.load offset=14880 + i32.const 0 + i32.load offset=14872 + i32.const 0 + i32.load offset=14864 + i32.const 0 + i32.load offset=14856 + i32.const 0 + i32.load offset=14848 + i32.const 0 + i32.load offset=14840 + i32.const 0 + i32.load offset=14832 + i32.const 0 + i32.load offset=14824 + i32.const 0 + i32.load offset=14800 + i32.const 0 + i32.load offset=14784 + i32.const 0 + i32.load offset=14768 + i32.const 0 + i32.load offset=14752 + i32.const 0 + i32.load offset=14736 + i32.const 0 + i32.load offset=14720 + i32.const 0 + i32.load offset=14704 + i32.const 0 + i32.load offset=14688 + i32.const 0 + i32.load offset=14672 + i32.const 0 + i32.load offset=14656 + i32.const 0 + i32.load offset=14640 + i32.const 0 + i32.load offset=14592 + i32.const 0 + i32.load offset=14560 + i32.const 0 + i32.load offset=14528 + i32.const 0 + i32.load offset=14496 + i32.const 0 + i32.load offset=14464 + i32.const 0 + i32.load offset=14432 + i32.const 0 + i32.load offset=14400 + i32.const 0 + i32.load offset=14368 + i32.const 0 + i32.load offset=14336 + i32.const 0 + i32.load offset=14304 + i32.const 0 + i32.load offset=14272 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14240 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14624 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14816 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14912 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_4) + (func $test3_func_6_4 (type 1) + call $test3_func_6_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10732 + i32.const 0 + i32.load offset=10728 + i32.const 0 + i32.load offset=10724 + i32.const 0 + i32.load offset=10720 + i32.const 0 + i32.load offset=10716 + i32.const 0 + i32.load offset=10712 + i32.const 0 + i32.load offset=10708 + i32.const 0 + i32.load offset=10704 + i32.const 0 + i32.load offset=10700 + i32.const 0 + i32.load offset=10696 + i32.const 0 + i32.load offset=10692 + i32.const 0 + i32.load offset=10680 + i32.const 0 + i32.load offset=10672 + i32.const 0 + i32.load offset=10664 + i32.const 0 + i32.load offset=10656 + i32.const 0 + i32.load offset=10648 + i32.const 0 + i32.load offset=10640 + i32.const 0 + i32.load offset=10632 + i32.const 0 + i32.load offset=10624 + i32.const 0 + i32.load offset=10616 + i32.const 0 + i32.load offset=10608 + i32.const 0 + i32.load offset=10600 + i32.const 0 + i32.load offset=10576 + i32.const 0 + i32.load offset=10560 + i32.const 0 + i32.load offset=10544 + i32.const 0 + i32.load offset=10528 + i32.const 0 + i32.load offset=10512 + i32.const 0 + i32.load offset=10496 + i32.const 0 + i32.load offset=10480 + i32.const 0 + i32.load offset=10464 + i32.const 0 + i32.load offset=10448 + i32.const 0 + i32.load offset=10432 + i32.const 0 + i32.load offset=10416 + i32.const 0 + i32.load offset=10368 + i32.const 0 + i32.load offset=10336 + i32.const 0 + i32.load offset=10304 + i32.const 0 + i32.load offset=10272 + i32.const 0 + i32.load offset=10240 + i32.const 0 + i32.load offset=10208 + i32.const 0 + i32.load offset=10176 + i32.const 0 + i32.load offset=10144 + i32.const 0 + i32.load offset=10112 + i32.const 0 + i32.load offset=10080 + i32.const 0 + i32.load offset=10048 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10016 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10400 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10592 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10688 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_4) + (func $test3_func_5_4 (type 1) + call $test3_func_5_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6508 + i32.const 0 + i32.load offset=6504 + i32.const 0 + i32.load offset=6500 + i32.const 0 + i32.load offset=6496 + i32.const 0 + i32.load offset=6492 + i32.const 0 + i32.load offset=6488 + i32.const 0 + i32.load offset=6484 + i32.const 0 + i32.load offset=6480 + i32.const 0 + i32.load offset=6476 + i32.const 0 + i32.load offset=6472 + i32.const 0 + i32.load offset=6468 + i32.const 0 + i32.load offset=6456 + i32.const 0 + i32.load offset=6448 + i32.const 0 + i32.load offset=6440 + i32.const 0 + i32.load offset=6432 + i32.const 0 + i32.load offset=6424 + i32.const 0 + i32.load offset=6416 + i32.const 0 + i32.load offset=6408 + i32.const 0 + i32.load offset=6400 + i32.const 0 + i32.load offset=6392 + i32.const 0 + i32.load offset=6384 + i32.const 0 + i32.load offset=6376 + i32.const 0 + i32.load offset=6352 + i32.const 0 + i32.load offset=6336 + i32.const 0 + i32.load offset=6320 + i32.const 0 + i32.load offset=6304 + i32.const 0 + i32.load offset=6288 + i32.const 0 + i32.load offset=6272 + i32.const 0 + i32.load offset=6256 + i32.const 0 + i32.load offset=6240 + i32.const 0 + i32.load offset=6224 + i32.const 0 + i32.load offset=6208 + i32.const 0 + i32.load offset=6192 + i32.const 0 + i32.load offset=6144 + i32.const 0 + i32.load offset=6112 + i32.const 0 + i32.load offset=6080 + i32.const 0 + i32.load offset=6048 + i32.const 0 + i32.load offset=6016 + i32.const 0 + i32.load offset=5984 + i32.const 0 + i32.load offset=5952 + i32.const 0 + i32.load offset=5920 + i32.const 0 + i32.load offset=5888 + i32.const 0 + i32.load offset=5856 + i32.const 0 + i32.load offset=5824 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5792 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6176 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6368 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6464 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_4) + (func $test3_func_4_4 (type 1) + call $test3_func_4_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2284 + i32.const 0 + i32.load offset=2280 + i32.const 0 + i32.load offset=2276 + i32.const 0 + i32.load offset=2272 + i32.const 0 + i32.load offset=2268 + i32.const 0 + i32.load offset=2264 + i32.const 0 + i32.load offset=2260 + i32.const 0 + i32.load offset=2256 + i32.const 0 + i32.load offset=2252 + i32.const 0 + i32.load offset=2248 + i32.const 0 + i32.load offset=2244 + i32.const 0 + i32.load offset=2232 + i32.const 0 + i32.load offset=2224 + i32.const 0 + i32.load offset=2216 + i32.const 0 + i32.load offset=2208 + i32.const 0 + i32.load offset=2200 + i32.const 0 + i32.load offset=2192 + i32.const 0 + i32.load offset=2184 + i32.const 0 + i32.load offset=2176 + i32.const 0 + i32.load offset=2168 + i32.const 0 + i32.load offset=2160 + i32.const 0 + i32.load offset=2152 + i32.const 0 + i32.load offset=2128 + i32.const 0 + i32.load offset=2112 + i32.const 0 + i32.load offset=2096 + i32.const 0 + i32.load offset=2080 + i32.const 0 + i32.load offset=2064 + i32.const 0 + i32.load offset=2048 + i32.const 0 + i32.load offset=2032 + i32.const 0 + i32.load offset=2016 + i32.const 0 + i32.load offset=2000 + i32.const 0 + i32.load offset=1984 + i32.const 0 + i32.load offset=1968 + i32.const 0 + i32.load offset=1920 + i32.const 0 + i32.load offset=1888 + i32.const 0 + i32.load offset=1856 + i32.const 0 + i32.load offset=1824 + i32.const 0 + i32.load offset=1792 + i32.const 0 + i32.load offset=1760 + i32.const 0 + i32.load offset=1728 + i32.const 0 + i32.load offset=1696 + i32.const 0 + i32.load offset=1664 + i32.const 0 + i32.load offset=1632 + i32.const 0 + i32.load offset=1600 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1568 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1952 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2144 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2240 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_4) + (func $test3_func_3_4 (type 1) + call $test3_func_3_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=30828 + i32.const 0 + i32.load offset=30824 + i32.const 0 + i32.load offset=30820 + i32.const 0 + i32.load offset=30816 + i32.const 0 + i32.load offset=30812 + i32.const 0 + i32.load offset=30808 + i32.const 0 + i32.load offset=30804 + i32.const 0 + i32.load offset=30800 + i32.const 0 + i32.load offset=30796 + i32.const 0 + i32.load offset=30792 + i32.const 0 + i32.load offset=30788 + i32.const 0 + i32.load offset=30776 + i32.const 0 + i32.load offset=30768 + i32.const 0 + i32.load offset=30760 + i32.const 0 + i32.load offset=30752 + i32.const 0 + i32.load offset=30744 + i32.const 0 + i32.load offset=30736 + i32.const 0 + i32.load offset=30728 + i32.const 0 + i32.load offset=30720 + i32.const 0 + i32.load offset=30712 + i32.const 0 + i32.load offset=30704 + i32.const 0 + i32.load offset=30696 + i32.const 0 + i32.load offset=30672 + i32.const 0 + i32.load offset=30656 + i32.const 0 + i32.load offset=30640 + i32.const 0 + i32.load offset=30624 + i32.const 0 + i32.load offset=30608 + i32.const 0 + i32.load offset=30592 + i32.const 0 + i32.load offset=30576 + i32.const 0 + i32.load offset=30560 + i32.const 0 + i32.load offset=30544 + i32.const 0 + i32.load offset=30528 + i32.const 0 + i32.load offset=30512 + i32.const 0 + i32.load offset=30464 + i32.const 0 + i32.load offset=30432 + i32.const 0 + i32.load offset=30400 + i32.const 0 + i32.load offset=30368 + i32.const 0 + i32.load offset=30336 + i32.const 0 + i32.load offset=30304 + i32.const 0 + i32.load offset=30272 + i32.const 0 + i32.load offset=30240 + i32.const 0 + i32.load offset=30208 + i32.const 0 + i32.load offset=30176 + i32.const 0 + i32.load offset=30144 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30112 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30496 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30688 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30784 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_4) + (func $test3_func_2_4 (type 1) + call $test3_func_2_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26604 + i32.const 0 + i32.load offset=26600 + i32.const 0 + i32.load offset=26596 + i32.const 0 + i32.load offset=26592 + i32.const 0 + i32.load offset=26588 + i32.const 0 + i32.load offset=26584 + i32.const 0 + i32.load offset=26580 + i32.const 0 + i32.load offset=26576 + i32.const 0 + i32.load offset=26572 + i32.const 0 + i32.load offset=26568 + i32.const 0 + i32.load offset=26564 + i32.const 0 + i32.load offset=26552 + i32.const 0 + i32.load offset=26544 + i32.const 0 + i32.load offset=26536 + i32.const 0 + i32.load offset=26528 + i32.const 0 + i32.load offset=26520 + i32.const 0 + i32.load offset=26512 + i32.const 0 + i32.load offset=26504 + i32.const 0 + i32.load offset=26496 + i32.const 0 + i32.load offset=26488 + i32.const 0 + i32.load offset=26480 + i32.const 0 + i32.load offset=26472 + i32.const 0 + i32.load offset=26448 + i32.const 0 + i32.load offset=26432 + i32.const 0 + i32.load offset=26416 + i32.const 0 + i32.load offset=26400 + i32.const 0 + i32.load offset=26384 + i32.const 0 + i32.load offset=26368 + i32.const 0 + i32.load offset=26352 + i32.const 0 + i32.load offset=26336 + i32.const 0 + i32.load offset=26320 + i32.const 0 + i32.load offset=26304 + i32.const 0 + i32.load offset=26288 + i32.const 0 + i32.load offset=26240 + i32.const 0 + i32.load offset=26208 + i32.const 0 + i32.load offset=26176 + i32.const 0 + i32.load offset=26144 + i32.const 0 + i32.load offset=26112 + i32.const 0 + i32.load offset=26080 + i32.const 0 + i32.load offset=26048 + i32.const 0 + i32.load offset=26016 + i32.const 0 + i32.load offset=25984 + i32.const 0 + i32.load offset=25952 + i32.const 0 + i32.load offset=25920 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=25888 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26272 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26464 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26560 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_4) + (func $test3_func_1_4 (type 1) + call $test3_func_1_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22380 + i32.const 0 + i32.load offset=22376 + i32.const 0 + i32.load offset=22372 + i32.const 0 + i32.load offset=22368 + i32.const 0 + i32.load offset=22364 + i32.const 0 + i32.load offset=22360 + i32.const 0 + i32.load offset=22356 + i32.const 0 + i32.load offset=22352 + i32.const 0 + i32.load offset=22348 + i32.const 0 + i32.load offset=22344 + i32.const 0 + i32.load offset=22340 + i32.const 0 + i32.load offset=22328 + i32.const 0 + i32.load offset=22320 + i32.const 0 + i32.load offset=22312 + i32.const 0 + i32.load offset=22304 + i32.const 0 + i32.load offset=22296 + i32.const 0 + i32.load offset=22288 + i32.const 0 + i32.load offset=22280 + i32.const 0 + i32.load offset=22272 + i32.const 0 + i32.load offset=22264 + i32.const 0 + i32.load offset=22256 + i32.const 0 + i32.load offset=22248 + i32.const 0 + i32.load offset=22224 + i32.const 0 + i32.load offset=22208 + i32.const 0 + i32.load offset=22192 + i32.const 0 + i32.load offset=22176 + i32.const 0 + i32.load offset=22160 + i32.const 0 + i32.load offset=22144 + i32.const 0 + i32.load offset=22128 + i32.const 0 + i32.load offset=22112 + i32.const 0 + i32.load offset=22096 + i32.const 0 + i32.load offset=22080 + i32.const 0 + i32.load offset=22064 + i32.const 0 + i32.load offset=22016 + i32.const 0 + i32.load offset=21984 + i32.const 0 + i32.load offset=21952 + i32.const 0 + i32.load offset=21920 + i32.const 0 + i32.load offset=21888 + i32.const 0 + i32.load offset=21856 + i32.const 0 + i32.load offset=21824 + i32.const 0 + i32.load offset=21792 + i32.const 0 + i32.load offset=21760 + i32.const 0 + i32.load offset=21728 + i32.const 0 + i32.load offset=21696 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=21664 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22048 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22240 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22336 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_4) + (func $test3_func_0_4 (type 1) + call $test3_func_0_5 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18156 + i32.const 0 + i32.load offset=18152 + i32.const 0 + i32.load offset=18148 + i32.const 0 + i32.load offset=18144 + i32.const 0 + i32.load offset=18140 + i32.const 0 + i32.load offset=18136 + i32.const 0 + i32.load offset=18132 + i32.const 0 + i32.load offset=18128 + i32.const 0 + i32.load offset=18124 + i32.const 0 + i32.load offset=18120 + i32.const 0 + i32.load offset=18116 + i32.const 0 + i32.load offset=18104 + i32.const 0 + i32.load offset=18096 + i32.const 0 + i32.load offset=18088 + i32.const 0 + i32.load offset=18080 + i32.const 0 + i32.load offset=18072 + i32.const 0 + i32.load offset=18064 + i32.const 0 + i32.load offset=18056 + i32.const 0 + i32.load offset=18048 + i32.const 0 + i32.load offset=18040 + i32.const 0 + i32.load offset=18032 + i32.const 0 + i32.load offset=18024 + i32.const 0 + i32.load offset=18000 + i32.const 0 + i32.load offset=17984 + i32.const 0 + i32.load offset=17968 + i32.const 0 + i32.load offset=17952 + i32.const 0 + i32.load offset=17936 + i32.const 0 + i32.load offset=17920 + i32.const 0 + i32.load offset=17904 + i32.const 0 + i32.load offset=17888 + i32.const 0 + i32.load offset=17872 + i32.const 0 + i32.load offset=17856 + i32.const 0 + i32.load offset=17840 + i32.const 0 + i32.load offset=17792 + i32.const 0 + i32.load offset=17760 + i32.const 0 + i32.load offset=17728 + i32.const 0 + i32.load offset=17696 + i32.const 0 + i32.load offset=17664 + i32.const 0 + i32.load offset=17632 + i32.const 0 + i32.load offset=17600 + i32.const 0 + i32.load offset=17568 + i32.const 0 + i32.load offset=17536 + i32.const 0 + i32.load offset=17504 + i32.const 0 + i32.load offset=17472 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17440 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=17824 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18016 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18112 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_4) + (func $test3_func_10_3 (type 1) + call $test3_func_10_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=23528 + i32.const 0 + i32.load offset=23524 + i32.const 0 + i32.load offset=23520 + i32.const 0 + i32.load offset=23516 + i32.const 0 + i32.load offset=23512 + i32.const 0 + i32.load offset=23508 + i32.const 0 + i32.load offset=23504 + i32.const 0 + i32.load offset=23500 + i32.const 0 + i32.load offset=23496 + i32.const 0 + i32.load offset=23492 + i32.const 0 + i32.load offset=23488 + i32.const 0 + i32.load offset=23476 + i32.const 0 + i32.load offset=23468 + i32.const 0 + i32.load offset=23460 + i32.const 0 + i32.load offset=23452 + i32.const 0 + i32.load offset=23444 + i32.const 0 + i32.load offset=23436 + i32.const 0 + i32.load offset=23428 + i32.const 0 + i32.load offset=23420 + i32.const 0 + i32.load offset=23412 + i32.const 0 + i32.load offset=23404 + i32.const 0 + i32.load offset=23396 + i32.const 0 + i32.load offset=23372 + i32.const 0 + i32.load offset=23356 + i32.const 0 + i32.load offset=23340 + i32.const 0 + i32.load offset=23324 + i32.const 0 + i32.load offset=23308 + i32.const 0 + i32.load offset=23292 + i32.const 0 + i32.load offset=23276 + i32.const 0 + i32.load offset=23260 + i32.const 0 + i32.load offset=23244 + i32.const 0 + i32.load offset=23228 + i32.const 0 + i32.load offset=23212 + i32.const 0 + i32.load offset=23164 + i32.const 0 + i32.load offset=23132 + i32.const 0 + i32.load offset=23100 + i32.const 0 + i32.load offset=23068 + i32.const 0 + i32.load offset=23036 + i32.const 0 + i32.load offset=23004 + i32.const 0 + i32.load offset=22972 + i32.const 0 + i32.load offset=22940 + i32.const 0 + i32.load offset=22908 + i32.const 0 + i32.load offset=22876 + i32.const 0 + i32.load offset=22844 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22812 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23196 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23388 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=23484 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_3 (type 1) + call $test3_func_9_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=19304 + i32.const 0 + i32.load offset=19300 + i32.const 0 + i32.load offset=19296 + i32.const 0 + i32.load offset=19292 + i32.const 0 + i32.load offset=19288 + i32.const 0 + i32.load offset=19284 + i32.const 0 + i32.load offset=19280 + i32.const 0 + i32.load offset=19276 + i32.const 0 + i32.load offset=19272 + i32.const 0 + i32.load offset=19268 + i32.const 0 + i32.load offset=19264 + i32.const 0 + i32.load offset=19252 + i32.const 0 + i32.load offset=19244 + i32.const 0 + i32.load offset=19236 + i32.const 0 + i32.load offset=19228 + i32.const 0 + i32.load offset=19220 + i32.const 0 + i32.load offset=19212 + i32.const 0 + i32.load offset=19204 + i32.const 0 + i32.load offset=19196 + i32.const 0 + i32.load offset=19188 + i32.const 0 + i32.load offset=19180 + i32.const 0 + i32.load offset=19172 + i32.const 0 + i32.load offset=19148 + i32.const 0 + i32.load offset=19132 + i32.const 0 + i32.load offset=19116 + i32.const 0 + i32.load offset=19100 + i32.const 0 + i32.load offset=19084 + i32.const 0 + i32.load offset=19068 + i32.const 0 + i32.load offset=19052 + i32.const 0 + i32.load offset=19036 + i32.const 0 + i32.load offset=19020 + i32.const 0 + i32.load offset=19004 + i32.const 0 + i32.load offset=18988 + i32.const 0 + i32.load offset=18940 + i32.const 0 + i32.load offset=18908 + i32.const 0 + i32.load offset=18876 + i32.const 0 + i32.load offset=18844 + i32.const 0 + i32.load offset=18812 + i32.const 0 + i32.load offset=18780 + i32.const 0 + i32.load offset=18748 + i32.const 0 + i32.load offset=18716 + i32.const 0 + i32.load offset=18684 + i32.const 0 + i32.load offset=18652 + i32.const 0 + i32.load offset=18620 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18588 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18972 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19164 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19260 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_3) + (func $test3_func_8_3 (type 1) + call $test3_func_8_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=15080 + i32.const 0 + i32.load offset=15076 + i32.const 0 + i32.load offset=15072 + i32.const 0 + i32.load offset=15068 + i32.const 0 + i32.load offset=15064 + i32.const 0 + i32.load offset=15060 + i32.const 0 + i32.load offset=15056 + i32.const 0 + i32.load offset=15052 + i32.const 0 + i32.load offset=15048 + i32.const 0 + i32.load offset=15044 + i32.const 0 + i32.load offset=15040 + i32.const 0 + i32.load offset=15028 + i32.const 0 + i32.load offset=15020 + i32.const 0 + i32.load offset=15012 + i32.const 0 + i32.load offset=15004 + i32.const 0 + i32.load offset=14996 + i32.const 0 + i32.load offset=14988 + i32.const 0 + i32.load offset=14980 + i32.const 0 + i32.load offset=14972 + i32.const 0 + i32.load offset=14964 + i32.const 0 + i32.load offset=14956 + i32.const 0 + i32.load offset=14948 + i32.const 0 + i32.load offset=14924 + i32.const 0 + i32.load offset=14908 + i32.const 0 + i32.load offset=14892 + i32.const 0 + i32.load offset=14876 + i32.const 0 + i32.load offset=14860 + i32.const 0 + i32.load offset=14844 + i32.const 0 + i32.load offset=14828 + i32.const 0 + i32.load offset=14812 + i32.const 0 + i32.load offset=14796 + i32.const 0 + i32.load offset=14780 + i32.const 0 + i32.load offset=14764 + i32.const 0 + i32.load offset=14716 + i32.const 0 + i32.load offset=14684 + i32.const 0 + i32.load offset=14652 + i32.const 0 + i32.load offset=14620 + i32.const 0 + i32.load offset=14588 + i32.const 0 + i32.load offset=14556 + i32.const 0 + i32.load offset=14524 + i32.const 0 + i32.load offset=14492 + i32.const 0 + i32.load offset=14460 + i32.const 0 + i32.load offset=14428 + i32.const 0 + i32.load offset=14396 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14364 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14748 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14940 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15036 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_3) + (func $test3_func_7_3 (type 1) + call $test3_func_7_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10856 + i32.const 0 + i32.load offset=10852 + i32.const 0 + i32.load offset=10848 + i32.const 0 + i32.load offset=10844 + i32.const 0 + i32.load offset=10840 + i32.const 0 + i32.load offset=10836 + i32.const 0 + i32.load offset=10832 + i32.const 0 + i32.load offset=10828 + i32.const 0 + i32.load offset=10824 + i32.const 0 + i32.load offset=10820 + i32.const 0 + i32.load offset=10816 + i32.const 0 + i32.load offset=10804 + i32.const 0 + i32.load offset=10796 + i32.const 0 + i32.load offset=10788 + i32.const 0 + i32.load offset=10780 + i32.const 0 + i32.load offset=10772 + i32.const 0 + i32.load offset=10764 + i32.const 0 + i32.load offset=10756 + i32.const 0 + i32.load offset=10748 + i32.const 0 + i32.load offset=10740 + i32.const 0 + i32.load offset=10732 + i32.const 0 + i32.load offset=10724 + i32.const 0 + i32.load offset=10700 + i32.const 0 + i32.load offset=10684 + i32.const 0 + i32.load offset=10668 + i32.const 0 + i32.load offset=10652 + i32.const 0 + i32.load offset=10636 + i32.const 0 + i32.load offset=10620 + i32.const 0 + i32.load offset=10604 + i32.const 0 + i32.load offset=10588 + i32.const 0 + i32.load offset=10572 + i32.const 0 + i32.load offset=10556 + i32.const 0 + i32.load offset=10540 + i32.const 0 + i32.load offset=10492 + i32.const 0 + i32.load offset=10460 + i32.const 0 + i32.load offset=10428 + i32.const 0 + i32.load offset=10396 + i32.const 0 + i32.load offset=10364 + i32.const 0 + i32.load offset=10332 + i32.const 0 + i32.load offset=10300 + i32.const 0 + i32.load offset=10268 + i32.const 0 + i32.load offset=10236 + i32.const 0 + i32.load offset=10204 + i32.const 0 + i32.load offset=10172 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10140 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10524 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10716 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10812 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_3) + (func $test3_func_6_3 (type 1) + call $test3_func_6_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6632 + i32.const 0 + i32.load offset=6628 + i32.const 0 + i32.load offset=6624 + i32.const 0 + i32.load offset=6620 + i32.const 0 + i32.load offset=6616 + i32.const 0 + i32.load offset=6612 + i32.const 0 + i32.load offset=6608 + i32.const 0 + i32.load offset=6604 + i32.const 0 + i32.load offset=6600 + i32.const 0 + i32.load offset=6596 + i32.const 0 + i32.load offset=6592 + i32.const 0 + i32.load offset=6580 + i32.const 0 + i32.load offset=6572 + i32.const 0 + i32.load offset=6564 + i32.const 0 + i32.load offset=6556 + i32.const 0 + i32.load offset=6548 + i32.const 0 + i32.load offset=6540 + i32.const 0 + i32.load offset=6532 + i32.const 0 + i32.load offset=6524 + i32.const 0 + i32.load offset=6516 + i32.const 0 + i32.load offset=6508 + i32.const 0 + i32.load offset=6500 + i32.const 0 + i32.load offset=6476 + i32.const 0 + i32.load offset=6460 + i32.const 0 + i32.load offset=6444 + i32.const 0 + i32.load offset=6428 + i32.const 0 + i32.load offset=6412 + i32.const 0 + i32.load offset=6396 + i32.const 0 + i32.load offset=6380 + i32.const 0 + i32.load offset=6364 + i32.const 0 + i32.load offset=6348 + i32.const 0 + i32.load offset=6332 + i32.const 0 + i32.load offset=6316 + i32.const 0 + i32.load offset=6268 + i32.const 0 + i32.load offset=6236 + i32.const 0 + i32.load offset=6204 + i32.const 0 + i32.load offset=6172 + i32.const 0 + i32.load offset=6140 + i32.const 0 + i32.load offset=6108 + i32.const 0 + i32.load offset=6076 + i32.const 0 + i32.load offset=6044 + i32.const 0 + i32.load offset=6012 + i32.const 0 + i32.load offset=5980 + i32.const 0 + i32.load offset=5948 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5916 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6300 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6492 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6588 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_3) + (func $test3_func_5_3 (type 1) + call $test3_func_5_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2408 + i32.const 0 + i32.load offset=2404 + i32.const 0 + i32.load offset=2400 + i32.const 0 + i32.load offset=2396 + i32.const 0 + i32.load offset=2392 + i32.const 0 + i32.load offset=2388 + i32.const 0 + i32.load offset=2384 + i32.const 0 + i32.load offset=2380 + i32.const 0 + i32.load offset=2376 + i32.const 0 + i32.load offset=2372 + i32.const 0 + i32.load offset=2368 + i32.const 0 + i32.load offset=2356 + i32.const 0 + i32.load offset=2348 + i32.const 0 + i32.load offset=2340 + i32.const 0 + i32.load offset=2332 + i32.const 0 + i32.load offset=2324 + i32.const 0 + i32.load offset=2316 + i32.const 0 + i32.load offset=2308 + i32.const 0 + i32.load offset=2300 + i32.const 0 + i32.load offset=2292 + i32.const 0 + i32.load offset=2284 + i32.const 0 + i32.load offset=2276 + i32.const 0 + i32.load offset=2252 + i32.const 0 + i32.load offset=2236 + i32.const 0 + i32.load offset=2220 + i32.const 0 + i32.load offset=2204 + i32.const 0 + i32.load offset=2188 + i32.const 0 + i32.load offset=2172 + i32.const 0 + i32.load offset=2156 + i32.const 0 + i32.load offset=2140 + i32.const 0 + i32.load offset=2124 + i32.const 0 + i32.load offset=2108 + i32.const 0 + i32.load offset=2092 + i32.const 0 + i32.load offset=2044 + i32.const 0 + i32.load offset=2012 + i32.const 0 + i32.load offset=1980 + i32.const 0 + i32.load offset=1948 + i32.const 0 + i32.load offset=1916 + i32.const 0 + i32.load offset=1884 + i32.const 0 + i32.load offset=1852 + i32.const 0 + i32.load offset=1820 + i32.const 0 + i32.load offset=1788 + i32.const 0 + i32.load offset=1756 + i32.const 0 + i32.load offset=1724 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1692 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2076 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2268 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2364 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_3) + (func $test3_func_4_3 (type 1) + call $test3_func_4_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=30952 + i32.const 0 + i32.load offset=30948 + i32.const 0 + i32.load offset=30944 + i32.const 0 + i32.load offset=30940 + i32.const 0 + i32.load offset=30936 + i32.const 0 + i32.load offset=30932 + i32.const 0 + i32.load offset=30928 + i32.const 0 + i32.load offset=30924 + i32.const 0 + i32.load offset=30920 + i32.const 0 + i32.load offset=30916 + i32.const 0 + i32.load offset=30912 + i32.const 0 + i32.load offset=30900 + i32.const 0 + i32.load offset=30892 + i32.const 0 + i32.load offset=30884 + i32.const 0 + i32.load offset=30876 + i32.const 0 + i32.load offset=30868 + i32.const 0 + i32.load offset=30860 + i32.const 0 + i32.load offset=30852 + i32.const 0 + i32.load offset=30844 + i32.const 0 + i32.load offset=30836 + i32.const 0 + i32.load offset=30828 + i32.const 0 + i32.load offset=30820 + i32.const 0 + i32.load offset=30796 + i32.const 0 + i32.load offset=30780 + i32.const 0 + i32.load offset=30764 + i32.const 0 + i32.load offset=30748 + i32.const 0 + i32.load offset=30732 + i32.const 0 + i32.load offset=30716 + i32.const 0 + i32.load offset=30700 + i32.const 0 + i32.load offset=30684 + i32.const 0 + i32.load offset=30668 + i32.const 0 + i32.load offset=30652 + i32.const 0 + i32.load offset=30636 + i32.const 0 + i32.load offset=30588 + i32.const 0 + i32.load offset=30556 + i32.const 0 + i32.load offset=30524 + i32.const 0 + i32.load offset=30492 + i32.const 0 + i32.load offset=30460 + i32.const 0 + i32.load offset=30428 + i32.const 0 + i32.load offset=30396 + i32.const 0 + i32.load offset=30364 + i32.const 0 + i32.load offset=30332 + i32.const 0 + i32.load offset=30300 + i32.const 0 + i32.load offset=30268 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30236 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30620 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30812 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30908 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_3) + (func $test3_func_3_3 (type 1) + call $test3_func_3_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26728 + i32.const 0 + i32.load offset=26724 + i32.const 0 + i32.load offset=26720 + i32.const 0 + i32.load offset=26716 + i32.const 0 + i32.load offset=26712 + i32.const 0 + i32.load offset=26708 + i32.const 0 + i32.load offset=26704 + i32.const 0 + i32.load offset=26700 + i32.const 0 + i32.load offset=26696 + i32.const 0 + i32.load offset=26692 + i32.const 0 + i32.load offset=26688 + i32.const 0 + i32.load offset=26676 + i32.const 0 + i32.load offset=26668 + i32.const 0 + i32.load offset=26660 + i32.const 0 + i32.load offset=26652 + i32.const 0 + i32.load offset=26644 + i32.const 0 + i32.load offset=26636 + i32.const 0 + i32.load offset=26628 + i32.const 0 + i32.load offset=26620 + i32.const 0 + i32.load offset=26612 + i32.const 0 + i32.load offset=26604 + i32.const 0 + i32.load offset=26596 + i32.const 0 + i32.load offset=26572 + i32.const 0 + i32.load offset=26556 + i32.const 0 + i32.load offset=26540 + i32.const 0 + i32.load offset=26524 + i32.const 0 + i32.load offset=26508 + i32.const 0 + i32.load offset=26492 + i32.const 0 + i32.load offset=26476 + i32.const 0 + i32.load offset=26460 + i32.const 0 + i32.load offset=26444 + i32.const 0 + i32.load offset=26428 + i32.const 0 + i32.load offset=26412 + i32.const 0 + i32.load offset=26364 + i32.const 0 + i32.load offset=26332 + i32.const 0 + i32.load offset=26300 + i32.const 0 + i32.load offset=26268 + i32.const 0 + i32.load offset=26236 + i32.const 0 + i32.load offset=26204 + i32.const 0 + i32.load offset=26172 + i32.const 0 + i32.load offset=26140 + i32.const 0 + i32.load offset=26108 + i32.const 0 + i32.load offset=26076 + i32.const 0 + i32.load offset=26044 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26012 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26396 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26588 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26684 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_3) + (func $test3_func_2_3 (type 1) + call $test3_func_2_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22504 + i32.const 0 + i32.load offset=22500 + i32.const 0 + i32.load offset=22496 + i32.const 0 + i32.load offset=22492 + i32.const 0 + i32.load offset=22488 + i32.const 0 + i32.load offset=22484 + i32.const 0 + i32.load offset=22480 + i32.const 0 + i32.load offset=22476 + i32.const 0 + i32.load offset=22472 + i32.const 0 + i32.load offset=22468 + i32.const 0 + i32.load offset=22464 + i32.const 0 + i32.load offset=22452 + i32.const 0 + i32.load offset=22444 + i32.const 0 + i32.load offset=22436 + i32.const 0 + i32.load offset=22428 + i32.const 0 + i32.load offset=22420 + i32.const 0 + i32.load offset=22412 + i32.const 0 + i32.load offset=22404 + i32.const 0 + i32.load offset=22396 + i32.const 0 + i32.load offset=22388 + i32.const 0 + i32.load offset=22380 + i32.const 0 + i32.load offset=22372 + i32.const 0 + i32.load offset=22348 + i32.const 0 + i32.load offset=22332 + i32.const 0 + i32.load offset=22316 + i32.const 0 + i32.load offset=22300 + i32.const 0 + i32.load offset=22284 + i32.const 0 + i32.load offset=22268 + i32.const 0 + i32.load offset=22252 + i32.const 0 + i32.load offset=22236 + i32.const 0 + i32.load offset=22220 + i32.const 0 + i32.load offset=22204 + i32.const 0 + i32.load offset=22188 + i32.const 0 + i32.load offset=22140 + i32.const 0 + i32.load offset=22108 + i32.const 0 + i32.load offset=22076 + i32.const 0 + i32.load offset=22044 + i32.const 0 + i32.load offset=22012 + i32.const 0 + i32.load offset=21980 + i32.const 0 + i32.load offset=21948 + i32.const 0 + i32.load offset=21916 + i32.const 0 + i32.load offset=21884 + i32.const 0 + i32.load offset=21852 + i32.const 0 + i32.load offset=21820 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=21788 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22172 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22364 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22460 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_3) + (func $test3_func_1_3 (type 1) + call $test3_func_1_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18280 + i32.const 0 + i32.load offset=18276 + i32.const 0 + i32.load offset=18272 + i32.const 0 + i32.load offset=18268 + i32.const 0 + i32.load offset=18264 + i32.const 0 + i32.load offset=18260 + i32.const 0 + i32.load offset=18256 + i32.const 0 + i32.load offset=18252 + i32.const 0 + i32.load offset=18248 + i32.const 0 + i32.load offset=18244 + i32.const 0 + i32.load offset=18240 + i32.const 0 + i32.load offset=18228 + i32.const 0 + i32.load offset=18220 + i32.const 0 + i32.load offset=18212 + i32.const 0 + i32.load offset=18204 + i32.const 0 + i32.load offset=18196 + i32.const 0 + i32.load offset=18188 + i32.const 0 + i32.load offset=18180 + i32.const 0 + i32.load offset=18172 + i32.const 0 + i32.load offset=18164 + i32.const 0 + i32.load offset=18156 + i32.const 0 + i32.load offset=18148 + i32.const 0 + i32.load offset=18124 + i32.const 0 + i32.load offset=18108 + i32.const 0 + i32.load offset=18092 + i32.const 0 + i32.load offset=18076 + i32.const 0 + i32.load offset=18060 + i32.const 0 + i32.load offset=18044 + i32.const 0 + i32.load offset=18028 + i32.const 0 + i32.load offset=18012 + i32.const 0 + i32.load offset=17996 + i32.const 0 + i32.load offset=17980 + i32.const 0 + i32.load offset=17964 + i32.const 0 + i32.load offset=17916 + i32.const 0 + i32.load offset=17884 + i32.const 0 + i32.load offset=17852 + i32.const 0 + i32.load offset=17820 + i32.const 0 + i32.load offset=17788 + i32.const 0 + i32.load offset=17756 + i32.const 0 + i32.load offset=17724 + i32.const 0 + i32.load offset=17692 + i32.const 0 + i32.load offset=17660 + i32.const 0 + i32.load offset=17628 + i32.const 0 + i32.load offset=17596 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17564 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=17948 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18140 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18236 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_3) + (func $test3_func_0_3 (type 1) + call $test3_func_0_4 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14056 + i32.const 0 + i32.load offset=14052 + i32.const 0 + i32.load offset=14048 + i32.const 0 + i32.load offset=14044 + i32.const 0 + i32.load offset=14040 + i32.const 0 + i32.load offset=14036 + i32.const 0 + i32.load offset=14032 + i32.const 0 + i32.load offset=14028 + i32.const 0 + i32.load offset=14024 + i32.const 0 + i32.load offset=14020 + i32.const 0 + i32.load offset=14016 + i32.const 0 + i32.load offset=14004 + i32.const 0 + i32.load offset=13996 + i32.const 0 + i32.load offset=13988 + i32.const 0 + i32.load offset=13980 + i32.const 0 + i32.load offset=13972 + i32.const 0 + i32.load offset=13964 + i32.const 0 + i32.load offset=13956 + i32.const 0 + i32.load offset=13948 + i32.const 0 + i32.load offset=13940 + i32.const 0 + i32.load offset=13932 + i32.const 0 + i32.load offset=13924 + i32.const 0 + i32.load offset=13900 + i32.const 0 + i32.load offset=13884 + i32.const 0 + i32.load offset=13868 + i32.const 0 + i32.load offset=13852 + i32.const 0 + i32.load offset=13836 + i32.const 0 + i32.load offset=13820 + i32.const 0 + i32.load offset=13804 + i32.const 0 + i32.load offset=13788 + i32.const 0 + i32.load offset=13772 + i32.const 0 + i32.load offset=13756 + i32.const 0 + i32.load offset=13740 + i32.const 0 + i32.load offset=13692 + i32.const 0 + i32.load offset=13660 + i32.const 0 + i32.load offset=13628 + i32.const 0 + i32.load offset=13596 + i32.const 0 + i32.load offset=13564 + i32.const 0 + i32.load offset=13532 + i32.const 0 + i32.load offset=13500 + i32.const 0 + i32.load offset=13468 + i32.const 0 + i32.load offset=13436 + i32.const 0 + i32.load offset=13404 + i32.const 0 + i32.load offset=13372 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13340 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=13724 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=13916 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14012 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_3) + (func $test3_func_10_2 (type 1) + call $test3_func_10_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=19428 + i32.const 0 + i32.load offset=19424 + i32.const 0 + i32.load offset=19420 + i32.const 0 + i32.load offset=19416 + i32.const 0 + i32.load offset=19412 + i32.const 0 + i32.load offset=19408 + i32.const 0 + i32.load offset=19404 + i32.const 0 + i32.load offset=19400 + i32.const 0 + i32.load offset=19396 + i32.const 0 + i32.load offset=19392 + i32.const 0 + i32.load offset=19388 + i32.const 0 + i32.load offset=19376 + i32.const 0 + i32.load offset=19368 + i32.const 0 + i32.load offset=19360 + i32.const 0 + i32.load offset=19352 + i32.const 0 + i32.load offset=19344 + i32.const 0 + i32.load offset=19336 + i32.const 0 + i32.load offset=19328 + i32.const 0 + i32.load offset=19320 + i32.const 0 + i32.load offset=19312 + i32.const 0 + i32.load offset=19304 + i32.const 0 + i32.load offset=19296 + i32.const 0 + i32.load offset=19272 + i32.const 0 + i32.load offset=19256 + i32.const 0 + i32.load offset=19240 + i32.const 0 + i32.load offset=19224 + i32.const 0 + i32.load offset=19208 + i32.const 0 + i32.load offset=19192 + i32.const 0 + i32.load offset=19176 + i32.const 0 + i32.load offset=19160 + i32.const 0 + i32.load offset=19144 + i32.const 0 + i32.load offset=19128 + i32.const 0 + i32.load offset=19112 + i32.const 0 + i32.load offset=19064 + i32.const 0 + i32.load offset=19032 + i32.const 0 + i32.load offset=19000 + i32.const 0 + i32.load offset=18968 + i32.const 0 + i32.load offset=18936 + i32.const 0 + i32.load offset=18904 + i32.const 0 + i32.load offset=18872 + i32.const 0 + i32.load offset=18840 + i32.const 0 + i32.load offset=18808 + i32.const 0 + i32.load offset=18776 + i32.const 0 + i32.load offset=18744 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=18712 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19096 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19288 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=19384 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_2 (type 1) + call $test3_func_9_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=15204 + i32.const 0 + i32.load offset=15200 + i32.const 0 + i32.load offset=15196 + i32.const 0 + i32.load offset=15192 + i32.const 0 + i32.load offset=15188 + i32.const 0 + i32.load offset=15184 + i32.const 0 + i32.load offset=15180 + i32.const 0 + i32.load offset=15176 + i32.const 0 + i32.load offset=15172 + i32.const 0 + i32.load offset=15168 + i32.const 0 + i32.load offset=15164 + i32.const 0 + i32.load offset=15152 + i32.const 0 + i32.load offset=15144 + i32.const 0 + i32.load offset=15136 + i32.const 0 + i32.load offset=15128 + i32.const 0 + i32.load offset=15120 + i32.const 0 + i32.load offset=15112 + i32.const 0 + i32.load offset=15104 + i32.const 0 + i32.load offset=15096 + i32.const 0 + i32.load offset=15088 + i32.const 0 + i32.load offset=15080 + i32.const 0 + i32.load offset=15072 + i32.const 0 + i32.load offset=15048 + i32.const 0 + i32.load offset=15032 + i32.const 0 + i32.load offset=15016 + i32.const 0 + i32.load offset=15000 + i32.const 0 + i32.load offset=14984 + i32.const 0 + i32.load offset=14968 + i32.const 0 + i32.load offset=14952 + i32.const 0 + i32.load offset=14936 + i32.const 0 + i32.load offset=14920 + i32.const 0 + i32.load offset=14904 + i32.const 0 + i32.load offset=14888 + i32.const 0 + i32.load offset=14840 + i32.const 0 + i32.load offset=14808 + i32.const 0 + i32.load offset=14776 + i32.const 0 + i32.load offset=14744 + i32.const 0 + i32.load offset=14712 + i32.const 0 + i32.load offset=14680 + i32.const 0 + i32.load offset=14648 + i32.const 0 + i32.load offset=14616 + i32.const 0 + i32.load offset=14584 + i32.const 0 + i32.load offset=14552 + i32.const 0 + i32.load offset=14520 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14488 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14872 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15064 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15160 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_2) + (func $test3_func_8_2 (type 1) + call $test3_func_8_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10980 + i32.const 0 + i32.load offset=10976 + i32.const 0 + i32.load offset=10972 + i32.const 0 + i32.load offset=10968 + i32.const 0 + i32.load offset=10964 + i32.const 0 + i32.load offset=10960 + i32.const 0 + i32.load offset=10956 + i32.const 0 + i32.load offset=10952 + i32.const 0 + i32.load offset=10948 + i32.const 0 + i32.load offset=10944 + i32.const 0 + i32.load offset=10940 + i32.const 0 + i32.load offset=10928 + i32.const 0 + i32.load offset=10920 + i32.const 0 + i32.load offset=10912 + i32.const 0 + i32.load offset=10904 + i32.const 0 + i32.load offset=10896 + i32.const 0 + i32.load offset=10888 + i32.const 0 + i32.load offset=10880 + i32.const 0 + i32.load offset=10872 + i32.const 0 + i32.load offset=10864 + i32.const 0 + i32.load offset=10856 + i32.const 0 + i32.load offset=10848 + i32.const 0 + i32.load offset=10824 + i32.const 0 + i32.load offset=10808 + i32.const 0 + i32.load offset=10792 + i32.const 0 + i32.load offset=10776 + i32.const 0 + i32.load offset=10760 + i32.const 0 + i32.load offset=10744 + i32.const 0 + i32.load offset=10728 + i32.const 0 + i32.load offset=10712 + i32.const 0 + i32.load offset=10696 + i32.const 0 + i32.load offset=10680 + i32.const 0 + i32.load offset=10664 + i32.const 0 + i32.load offset=10616 + i32.const 0 + i32.load offset=10584 + i32.const 0 + i32.load offset=10552 + i32.const 0 + i32.load offset=10520 + i32.const 0 + i32.load offset=10488 + i32.const 0 + i32.load offset=10456 + i32.const 0 + i32.load offset=10424 + i32.const 0 + i32.load offset=10392 + i32.const 0 + i32.load offset=10360 + i32.const 0 + i32.load offset=10328 + i32.const 0 + i32.load offset=10296 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10264 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10648 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10840 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10936 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_2) + (func $test3_func_7_2 (type 1) + call $test3_func_7_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6756 + i32.const 0 + i32.load offset=6752 + i32.const 0 + i32.load offset=6748 + i32.const 0 + i32.load offset=6744 + i32.const 0 + i32.load offset=6740 + i32.const 0 + i32.load offset=6736 + i32.const 0 + i32.load offset=6732 + i32.const 0 + i32.load offset=6728 + i32.const 0 + i32.load offset=6724 + i32.const 0 + i32.load offset=6720 + i32.const 0 + i32.load offset=6716 + i32.const 0 + i32.load offset=6704 + i32.const 0 + i32.load offset=6696 + i32.const 0 + i32.load offset=6688 + i32.const 0 + i32.load offset=6680 + i32.const 0 + i32.load offset=6672 + i32.const 0 + i32.load offset=6664 + i32.const 0 + i32.load offset=6656 + i32.const 0 + i32.load offset=6648 + i32.const 0 + i32.load offset=6640 + i32.const 0 + i32.load offset=6632 + i32.const 0 + i32.load offset=6624 + i32.const 0 + i32.load offset=6600 + i32.const 0 + i32.load offset=6584 + i32.const 0 + i32.load offset=6568 + i32.const 0 + i32.load offset=6552 + i32.const 0 + i32.load offset=6536 + i32.const 0 + i32.load offset=6520 + i32.const 0 + i32.load offset=6504 + i32.const 0 + i32.load offset=6488 + i32.const 0 + i32.load offset=6472 + i32.const 0 + i32.load offset=6456 + i32.const 0 + i32.load offset=6440 + i32.const 0 + i32.load offset=6392 + i32.const 0 + i32.load offset=6360 + i32.const 0 + i32.load offset=6328 + i32.const 0 + i32.load offset=6296 + i32.const 0 + i32.load offset=6264 + i32.const 0 + i32.load offset=6232 + i32.const 0 + i32.load offset=6200 + i32.const 0 + i32.load offset=6168 + i32.const 0 + i32.load offset=6136 + i32.const 0 + i32.load offset=6104 + i32.const 0 + i32.load offset=6072 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6040 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6424 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6616 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6712 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_2) + (func $test3_func_6_2 (type 1) + call $test3_func_6_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2532 + i32.const 0 + i32.load offset=2528 + i32.const 0 + i32.load offset=2524 + i32.const 0 + i32.load offset=2520 + i32.const 0 + i32.load offset=2516 + i32.const 0 + i32.load offset=2512 + i32.const 0 + i32.load offset=2508 + i32.const 0 + i32.load offset=2504 + i32.const 0 + i32.load offset=2500 + i32.const 0 + i32.load offset=2496 + i32.const 0 + i32.load offset=2492 + i32.const 0 + i32.load offset=2480 + i32.const 0 + i32.load offset=2472 + i32.const 0 + i32.load offset=2464 + i32.const 0 + i32.load offset=2456 + i32.const 0 + i32.load offset=2448 + i32.const 0 + i32.load offset=2440 + i32.const 0 + i32.load offset=2432 + i32.const 0 + i32.load offset=2424 + i32.const 0 + i32.load offset=2416 + i32.const 0 + i32.load offset=2408 + i32.const 0 + i32.load offset=2400 + i32.const 0 + i32.load offset=2376 + i32.const 0 + i32.load offset=2360 + i32.const 0 + i32.load offset=2344 + i32.const 0 + i32.load offset=2328 + i32.const 0 + i32.load offset=2312 + i32.const 0 + i32.load offset=2296 + i32.const 0 + i32.load offset=2280 + i32.const 0 + i32.load offset=2264 + i32.const 0 + i32.load offset=2248 + i32.const 0 + i32.load offset=2232 + i32.const 0 + i32.load offset=2216 + i32.const 0 + i32.load offset=2168 + i32.const 0 + i32.load offset=2136 + i32.const 0 + i32.load offset=2104 + i32.const 0 + i32.load offset=2072 + i32.const 0 + i32.load offset=2040 + i32.const 0 + i32.load offset=2008 + i32.const 0 + i32.load offset=1976 + i32.const 0 + i32.load offset=1944 + i32.const 0 + i32.load offset=1912 + i32.const 0 + i32.load offset=1880 + i32.const 0 + i32.load offset=1848 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1816 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2200 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2392 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2488 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_2) + (func $test3_func_5_2 (type 1) + call $test3_func_5_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31076 + i32.const 0 + i32.load offset=31072 + i32.const 0 + i32.load offset=31068 + i32.const 0 + i32.load offset=31064 + i32.const 0 + i32.load offset=31060 + i32.const 0 + i32.load offset=31056 + i32.const 0 + i32.load offset=31052 + i32.const 0 + i32.load offset=31048 + i32.const 0 + i32.load offset=31044 + i32.const 0 + i32.load offset=31040 + i32.const 0 + i32.load offset=31036 + i32.const 0 + i32.load offset=31024 + i32.const 0 + i32.load offset=31016 + i32.const 0 + i32.load offset=31008 + i32.const 0 + i32.load offset=31000 + i32.const 0 + i32.load offset=30992 + i32.const 0 + i32.load offset=30984 + i32.const 0 + i32.load offset=30976 + i32.const 0 + i32.load offset=30968 + i32.const 0 + i32.load offset=30960 + i32.const 0 + i32.load offset=30952 + i32.const 0 + i32.load offset=30944 + i32.const 0 + i32.load offset=30920 + i32.const 0 + i32.load offset=30904 + i32.const 0 + i32.load offset=30888 + i32.const 0 + i32.load offset=30872 + i32.const 0 + i32.load offset=30856 + i32.const 0 + i32.load offset=30840 + i32.const 0 + i32.load offset=30824 + i32.const 0 + i32.load offset=30808 + i32.const 0 + i32.load offset=30792 + i32.const 0 + i32.load offset=30776 + i32.const 0 + i32.load offset=30760 + i32.const 0 + i32.load offset=30712 + i32.const 0 + i32.load offset=30680 + i32.const 0 + i32.load offset=30648 + i32.const 0 + i32.load offset=30616 + i32.const 0 + i32.load offset=30584 + i32.const 0 + i32.load offset=30552 + i32.const 0 + i32.load offset=30520 + i32.const 0 + i32.load offset=30488 + i32.const 0 + i32.load offset=30456 + i32.const 0 + i32.load offset=30424 + i32.const 0 + i32.load offset=30392 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30360 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30744 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30936 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31032 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_2) + (func $test3_func_4_2 (type 1) + call $test3_func_4_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26852 + i32.const 0 + i32.load offset=26848 + i32.const 0 + i32.load offset=26844 + i32.const 0 + i32.load offset=26840 + i32.const 0 + i32.load offset=26836 + i32.const 0 + i32.load offset=26832 + i32.const 0 + i32.load offset=26828 + i32.const 0 + i32.load offset=26824 + i32.const 0 + i32.load offset=26820 + i32.const 0 + i32.load offset=26816 + i32.const 0 + i32.load offset=26812 + i32.const 0 + i32.load offset=26800 + i32.const 0 + i32.load offset=26792 + i32.const 0 + i32.load offset=26784 + i32.const 0 + i32.load offset=26776 + i32.const 0 + i32.load offset=26768 + i32.const 0 + i32.load offset=26760 + i32.const 0 + i32.load offset=26752 + i32.const 0 + i32.load offset=26744 + i32.const 0 + i32.load offset=26736 + i32.const 0 + i32.load offset=26728 + i32.const 0 + i32.load offset=26720 + i32.const 0 + i32.load offset=26696 + i32.const 0 + i32.load offset=26680 + i32.const 0 + i32.load offset=26664 + i32.const 0 + i32.load offset=26648 + i32.const 0 + i32.load offset=26632 + i32.const 0 + i32.load offset=26616 + i32.const 0 + i32.load offset=26600 + i32.const 0 + i32.load offset=26584 + i32.const 0 + i32.load offset=26568 + i32.const 0 + i32.load offset=26552 + i32.const 0 + i32.load offset=26536 + i32.const 0 + i32.load offset=26488 + i32.const 0 + i32.load offset=26456 + i32.const 0 + i32.load offset=26424 + i32.const 0 + i32.load offset=26392 + i32.const 0 + i32.load offset=26360 + i32.const 0 + i32.load offset=26328 + i32.const 0 + i32.load offset=26296 + i32.const 0 + i32.load offset=26264 + i32.const 0 + i32.load offset=26232 + i32.const 0 + i32.load offset=26200 + i32.const 0 + i32.load offset=26168 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26136 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26520 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26712 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26808 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_2) + (func $test3_func_3_2 (type 1) + call $test3_func_3_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22628 + i32.const 0 + i32.load offset=22624 + i32.const 0 + i32.load offset=22620 + i32.const 0 + i32.load offset=22616 + i32.const 0 + i32.load offset=22612 + i32.const 0 + i32.load offset=22608 + i32.const 0 + i32.load offset=22604 + i32.const 0 + i32.load offset=22600 + i32.const 0 + i32.load offset=22596 + i32.const 0 + i32.load offset=22592 + i32.const 0 + i32.load offset=22588 + i32.const 0 + i32.load offset=22576 + i32.const 0 + i32.load offset=22568 + i32.const 0 + i32.load offset=22560 + i32.const 0 + i32.load offset=22552 + i32.const 0 + i32.load offset=22544 + i32.const 0 + i32.load offset=22536 + i32.const 0 + i32.load offset=22528 + i32.const 0 + i32.load offset=22520 + i32.const 0 + i32.load offset=22512 + i32.const 0 + i32.load offset=22504 + i32.const 0 + i32.load offset=22496 + i32.const 0 + i32.load offset=22472 + i32.const 0 + i32.load offset=22456 + i32.const 0 + i32.load offset=22440 + i32.const 0 + i32.load offset=22424 + i32.const 0 + i32.load offset=22408 + i32.const 0 + i32.load offset=22392 + i32.const 0 + i32.load offset=22376 + i32.const 0 + i32.load offset=22360 + i32.const 0 + i32.load offset=22344 + i32.const 0 + i32.load offset=22328 + i32.const 0 + i32.load offset=22312 + i32.const 0 + i32.load offset=22264 + i32.const 0 + i32.load offset=22232 + i32.const 0 + i32.load offset=22200 + i32.const 0 + i32.load offset=22168 + i32.const 0 + i32.load offset=22136 + i32.const 0 + i32.load offset=22104 + i32.const 0 + i32.load offset=22072 + i32.const 0 + i32.load offset=22040 + i32.const 0 + i32.load offset=22008 + i32.const 0 + i32.load offset=21976 + i32.const 0 + i32.load offset=21944 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=21912 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22296 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22488 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22584 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_2) + (func $test3_func_2_2 (type 1) + call $test3_func_2_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18404 + i32.const 0 + i32.load offset=18400 + i32.const 0 + i32.load offset=18396 + i32.const 0 + i32.load offset=18392 + i32.const 0 + i32.load offset=18388 + i32.const 0 + i32.load offset=18384 + i32.const 0 + i32.load offset=18380 + i32.const 0 + i32.load offset=18376 + i32.const 0 + i32.load offset=18372 + i32.const 0 + i32.load offset=18368 + i32.const 0 + i32.load offset=18364 + i32.const 0 + i32.load offset=18352 + i32.const 0 + i32.load offset=18344 + i32.const 0 + i32.load offset=18336 + i32.const 0 + i32.load offset=18328 + i32.const 0 + i32.load offset=18320 + i32.const 0 + i32.load offset=18312 + i32.const 0 + i32.load offset=18304 + i32.const 0 + i32.load offset=18296 + i32.const 0 + i32.load offset=18288 + i32.const 0 + i32.load offset=18280 + i32.const 0 + i32.load offset=18272 + i32.const 0 + i32.load offset=18248 + i32.const 0 + i32.load offset=18232 + i32.const 0 + i32.load offset=18216 + i32.const 0 + i32.load offset=18200 + i32.const 0 + i32.load offset=18184 + i32.const 0 + i32.load offset=18168 + i32.const 0 + i32.load offset=18152 + i32.const 0 + i32.load offset=18136 + i32.const 0 + i32.load offset=18120 + i32.const 0 + i32.load offset=18104 + i32.const 0 + i32.load offset=18088 + i32.const 0 + i32.load offset=18040 + i32.const 0 + i32.load offset=18008 + i32.const 0 + i32.load offset=17976 + i32.const 0 + i32.load offset=17944 + i32.const 0 + i32.load offset=17912 + i32.const 0 + i32.load offset=17880 + i32.const 0 + i32.load offset=17848 + i32.const 0 + i32.load offset=17816 + i32.const 0 + i32.load offset=17784 + i32.const 0 + i32.load offset=17752 + i32.const 0 + i32.load offset=17720 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17688 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18072 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18264 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18360 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_2) + (func $test3_func_1_2 (type 1) + call $test3_func_1_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14180 + i32.const 0 + i32.load offset=14176 + i32.const 0 + i32.load offset=14172 + i32.const 0 + i32.load offset=14168 + i32.const 0 + i32.load offset=14164 + i32.const 0 + i32.load offset=14160 + i32.const 0 + i32.load offset=14156 + i32.const 0 + i32.load offset=14152 + i32.const 0 + i32.load offset=14148 + i32.const 0 + i32.load offset=14144 + i32.const 0 + i32.load offset=14140 + i32.const 0 + i32.load offset=14128 + i32.const 0 + i32.load offset=14120 + i32.const 0 + i32.load offset=14112 + i32.const 0 + i32.load offset=14104 + i32.const 0 + i32.load offset=14096 + i32.const 0 + i32.load offset=14088 + i32.const 0 + i32.load offset=14080 + i32.const 0 + i32.load offset=14072 + i32.const 0 + i32.load offset=14064 + i32.const 0 + i32.load offset=14056 + i32.const 0 + i32.load offset=14048 + i32.const 0 + i32.load offset=14024 + i32.const 0 + i32.load offset=14008 + i32.const 0 + i32.load offset=13992 + i32.const 0 + i32.load offset=13976 + i32.const 0 + i32.load offset=13960 + i32.const 0 + i32.load offset=13944 + i32.const 0 + i32.load offset=13928 + i32.const 0 + i32.load offset=13912 + i32.const 0 + i32.load offset=13896 + i32.const 0 + i32.load offset=13880 + i32.const 0 + i32.load offset=13864 + i32.const 0 + i32.load offset=13816 + i32.const 0 + i32.load offset=13784 + i32.const 0 + i32.load offset=13752 + i32.const 0 + i32.load offset=13720 + i32.const 0 + i32.load offset=13688 + i32.const 0 + i32.load offset=13656 + i32.const 0 + i32.load offset=13624 + i32.const 0 + i32.load offset=13592 + i32.const 0 + i32.load offset=13560 + i32.const 0 + i32.load offset=13528 + i32.const 0 + i32.load offset=13496 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13464 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=13848 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14040 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14136 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_2) + (func $test3_func_0_2 (type 1) + call $test3_func_0_3 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=9956 + i32.const 0 + i32.load offset=9952 + i32.const 0 + i32.load offset=9948 + i32.const 0 + i32.load offset=9944 + i32.const 0 + i32.load offset=9940 + i32.const 0 + i32.load offset=9936 + i32.const 0 + i32.load offset=9932 + i32.const 0 + i32.load offset=9928 + i32.const 0 + i32.load offset=9924 + i32.const 0 + i32.load offset=9920 + i32.const 0 + i32.load offset=9916 + i32.const 0 + i32.load offset=9904 + i32.const 0 + i32.load offset=9896 + i32.const 0 + i32.load offset=9888 + i32.const 0 + i32.load offset=9880 + i32.const 0 + i32.load offset=9872 + i32.const 0 + i32.load offset=9864 + i32.const 0 + i32.load offset=9856 + i32.const 0 + i32.load offset=9848 + i32.const 0 + i32.load offset=9840 + i32.const 0 + i32.load offset=9832 + i32.const 0 + i32.load offset=9824 + i32.const 0 + i32.load offset=9800 + i32.const 0 + i32.load offset=9784 + i32.const 0 + i32.load offset=9768 + i32.const 0 + i32.load offset=9752 + i32.const 0 + i32.load offset=9736 + i32.const 0 + i32.load offset=9720 + i32.const 0 + i32.load offset=9704 + i32.const 0 + i32.load offset=9688 + i32.const 0 + i32.load offset=9672 + i32.const 0 + i32.load offset=9656 + i32.const 0 + i32.load offset=9640 + i32.const 0 + i32.load offset=9592 + i32.const 0 + i32.load offset=9560 + i32.const 0 + i32.load offset=9528 + i32.const 0 + i32.load offset=9496 + i32.const 0 + i32.load offset=9464 + i32.const 0 + i32.load offset=9432 + i32.const 0 + i32.load offset=9400 + i32.const 0 + i32.load offset=9368 + i32.const 0 + i32.load offset=9336 + i32.const 0 + i32.load offset=9304 + i32.const 0 + i32.load offset=9272 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9240 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9624 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9816 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9912 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_2) + (func $test3_func_10_1 (type 1) + call $test3_func_10_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=15328 + i32.const 0 + i32.load offset=15324 + i32.const 0 + i32.load offset=15320 + i32.const 0 + i32.load offset=15316 + i32.const 0 + i32.load offset=15312 + i32.const 0 + i32.load offset=15308 + i32.const 0 + i32.load offset=15304 + i32.const 0 + i32.load offset=15300 + i32.const 0 + i32.load offset=15296 + i32.const 0 + i32.load offset=15292 + i32.const 0 + i32.load offset=15288 + i32.const 0 + i32.load offset=15276 + i32.const 0 + i32.load offset=15268 + i32.const 0 + i32.load offset=15260 + i32.const 0 + i32.load offset=15252 + i32.const 0 + i32.load offset=15244 + i32.const 0 + i32.load offset=15236 + i32.const 0 + i32.load offset=15228 + i32.const 0 + i32.load offset=15220 + i32.const 0 + i32.load offset=15212 + i32.const 0 + i32.load offset=15204 + i32.const 0 + i32.load offset=15196 + i32.const 0 + i32.load offset=15172 + i32.const 0 + i32.load offset=15156 + i32.const 0 + i32.load offset=15140 + i32.const 0 + i32.load offset=15124 + i32.const 0 + i32.load offset=15108 + i32.const 0 + i32.load offset=15092 + i32.const 0 + i32.load offset=15076 + i32.const 0 + i32.load offset=15060 + i32.const 0 + i32.load offset=15044 + i32.const 0 + i32.load offset=15028 + i32.const 0 + i32.load offset=15012 + i32.const 0 + i32.load offset=14964 + i32.const 0 + i32.load offset=14932 + i32.const 0 + i32.load offset=14900 + i32.const 0 + i32.load offset=14868 + i32.const 0 + i32.load offset=14836 + i32.const 0 + i32.load offset=14804 + i32.const 0 + i32.load offset=14772 + i32.const 0 + i32.load offset=14740 + i32.const 0 + i32.load offset=14708 + i32.const 0 + i32.load offset=14676 + i32.const 0 + i32.load offset=14644 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=14612 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14996 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15188 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=15284 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_1 (type 1) + call $test3_func_9_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=11104 + i32.const 0 + i32.load offset=11100 + i32.const 0 + i32.load offset=11096 + i32.const 0 + i32.load offset=11092 + i32.const 0 + i32.load offset=11088 + i32.const 0 + i32.load offset=11084 + i32.const 0 + i32.load offset=11080 + i32.const 0 + i32.load offset=11076 + i32.const 0 + i32.load offset=11072 + i32.const 0 + i32.load offset=11068 + i32.const 0 + i32.load offset=11064 + i32.const 0 + i32.load offset=11052 + i32.const 0 + i32.load offset=11044 + i32.const 0 + i32.load offset=11036 + i32.const 0 + i32.load offset=11028 + i32.const 0 + i32.load offset=11020 + i32.const 0 + i32.load offset=11012 + i32.const 0 + i32.load offset=11004 + i32.const 0 + i32.load offset=10996 + i32.const 0 + i32.load offset=10988 + i32.const 0 + i32.load offset=10980 + i32.const 0 + i32.load offset=10972 + i32.const 0 + i32.load offset=10948 + i32.const 0 + i32.load offset=10932 + i32.const 0 + i32.load offset=10916 + i32.const 0 + i32.load offset=10900 + i32.const 0 + i32.load offset=10884 + i32.const 0 + i32.load offset=10868 + i32.const 0 + i32.load offset=10852 + i32.const 0 + i32.load offset=10836 + i32.const 0 + i32.load offset=10820 + i32.const 0 + i32.load offset=10804 + i32.const 0 + i32.load offset=10788 + i32.const 0 + i32.load offset=10740 + i32.const 0 + i32.load offset=10708 + i32.const 0 + i32.load offset=10676 + i32.const 0 + i32.load offset=10644 + i32.const 0 + i32.load offset=10612 + i32.const 0 + i32.load offset=10580 + i32.const 0 + i32.load offset=10548 + i32.const 0 + i32.load offset=10516 + i32.const 0 + i32.load offset=10484 + i32.const 0 + i32.load offset=10452 + i32.const 0 + i32.load offset=10420 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10388 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10772 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10964 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=11060 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_1) + (func $test3_func_8_1 (type 1) + call $test3_func_8_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=6880 + i32.const 0 + i32.load offset=6876 + i32.const 0 + i32.load offset=6872 + i32.const 0 + i32.load offset=6868 + i32.const 0 + i32.load offset=6864 + i32.const 0 + i32.load offset=6860 + i32.const 0 + i32.load offset=6856 + i32.const 0 + i32.load offset=6852 + i32.const 0 + i32.load offset=6848 + i32.const 0 + i32.load offset=6844 + i32.const 0 + i32.load offset=6840 + i32.const 0 + i32.load offset=6828 + i32.const 0 + i32.load offset=6820 + i32.const 0 + i32.load offset=6812 + i32.const 0 + i32.load offset=6804 + i32.const 0 + i32.load offset=6796 + i32.const 0 + i32.load offset=6788 + i32.const 0 + i32.load offset=6780 + i32.const 0 + i32.load offset=6772 + i32.const 0 + i32.load offset=6764 + i32.const 0 + i32.load offset=6756 + i32.const 0 + i32.load offset=6748 + i32.const 0 + i32.load offset=6724 + i32.const 0 + i32.load offset=6708 + i32.const 0 + i32.load offset=6692 + i32.const 0 + i32.load offset=6676 + i32.const 0 + i32.load offset=6660 + i32.const 0 + i32.load offset=6644 + i32.const 0 + i32.load offset=6628 + i32.const 0 + i32.load offset=6612 + i32.const 0 + i32.load offset=6596 + i32.const 0 + i32.load offset=6580 + i32.const 0 + i32.load offset=6564 + i32.const 0 + i32.load offset=6516 + i32.const 0 + i32.load offset=6484 + i32.const 0 + i32.load offset=6452 + i32.const 0 + i32.load offset=6420 + i32.const 0 + i32.load offset=6388 + i32.const 0 + i32.load offset=6356 + i32.const 0 + i32.load offset=6324 + i32.const 0 + i32.load offset=6292 + i32.const 0 + i32.load offset=6260 + i32.const 0 + i32.load offset=6228 + i32.const 0 + i32.load offset=6196 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6164 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6548 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6740 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6836 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_1) + (func $test3_func_7_1 (type 1) + call $test3_func_7_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2656 + i32.const 0 + i32.load offset=2652 + i32.const 0 + i32.load offset=2648 + i32.const 0 + i32.load offset=2644 + i32.const 0 + i32.load offset=2640 + i32.const 0 + i32.load offset=2636 + i32.const 0 + i32.load offset=2632 + i32.const 0 + i32.load offset=2628 + i32.const 0 + i32.load offset=2624 + i32.const 0 + i32.load offset=2620 + i32.const 0 + i32.load offset=2616 + i32.const 0 + i32.load offset=2604 + i32.const 0 + i32.load offset=2596 + i32.const 0 + i32.load offset=2588 + i32.const 0 + i32.load offset=2580 + i32.const 0 + i32.load offset=2572 + i32.const 0 + i32.load offset=2564 + i32.const 0 + i32.load offset=2556 + i32.const 0 + i32.load offset=2548 + i32.const 0 + i32.load offset=2540 + i32.const 0 + i32.load offset=2532 + i32.const 0 + i32.load offset=2524 + i32.const 0 + i32.load offset=2500 + i32.const 0 + i32.load offset=2484 + i32.const 0 + i32.load offset=2468 + i32.const 0 + i32.load offset=2452 + i32.const 0 + i32.load offset=2436 + i32.const 0 + i32.load offset=2420 + i32.const 0 + i32.load offset=2404 + i32.const 0 + i32.load offset=2388 + i32.const 0 + i32.load offset=2372 + i32.const 0 + i32.load offset=2356 + i32.const 0 + i32.load offset=2340 + i32.const 0 + i32.load offset=2292 + i32.const 0 + i32.load offset=2260 + i32.const 0 + i32.load offset=2228 + i32.const 0 + i32.load offset=2196 + i32.const 0 + i32.load offset=2164 + i32.const 0 + i32.load offset=2132 + i32.const 0 + i32.load offset=2100 + i32.const 0 + i32.load offset=2068 + i32.const 0 + i32.load offset=2036 + i32.const 0 + i32.load offset=2004 + i32.const 0 + i32.load offset=1972 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1940 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2324 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2516 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2612 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_1) + (func $test3_func_6_1 (type 1) + call $test3_func_6_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31200 + i32.const 0 + i32.load offset=31196 + i32.const 0 + i32.load offset=31192 + i32.const 0 + i32.load offset=31188 + i32.const 0 + i32.load offset=31184 + i32.const 0 + i32.load offset=31180 + i32.const 0 + i32.load offset=31176 + i32.const 0 + i32.load offset=31172 + i32.const 0 + i32.load offset=31168 + i32.const 0 + i32.load offset=31164 + i32.const 0 + i32.load offset=31160 + i32.const 0 + i32.load offset=31148 + i32.const 0 + i32.load offset=31140 + i32.const 0 + i32.load offset=31132 + i32.const 0 + i32.load offset=31124 + i32.const 0 + i32.load offset=31116 + i32.const 0 + i32.load offset=31108 + i32.const 0 + i32.load offset=31100 + i32.const 0 + i32.load offset=31092 + i32.const 0 + i32.load offset=31084 + i32.const 0 + i32.load offset=31076 + i32.const 0 + i32.load offset=31068 + i32.const 0 + i32.load offset=31044 + i32.const 0 + i32.load offset=31028 + i32.const 0 + i32.load offset=31012 + i32.const 0 + i32.load offset=30996 + i32.const 0 + i32.load offset=30980 + i32.const 0 + i32.load offset=30964 + i32.const 0 + i32.load offset=30948 + i32.const 0 + i32.load offset=30932 + i32.const 0 + i32.load offset=30916 + i32.const 0 + i32.load offset=30900 + i32.const 0 + i32.load offset=30884 + i32.const 0 + i32.load offset=30836 + i32.const 0 + i32.load offset=30804 + i32.const 0 + i32.load offset=30772 + i32.const 0 + i32.load offset=30740 + i32.const 0 + i32.load offset=30708 + i32.const 0 + i32.load offset=30676 + i32.const 0 + i32.load offset=30644 + i32.const 0 + i32.load offset=30612 + i32.const 0 + i32.load offset=30580 + i32.const 0 + i32.load offset=30548 + i32.const 0 + i32.load offset=30516 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30484 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30868 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31060 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31156 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_1) + (func $test3_func_5_1 (type 1) + call $test3_func_5_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=26976 + i32.const 0 + i32.load offset=26972 + i32.const 0 + i32.load offset=26968 + i32.const 0 + i32.load offset=26964 + i32.const 0 + i32.load offset=26960 + i32.const 0 + i32.load offset=26956 + i32.const 0 + i32.load offset=26952 + i32.const 0 + i32.load offset=26948 + i32.const 0 + i32.load offset=26944 + i32.const 0 + i32.load offset=26940 + i32.const 0 + i32.load offset=26936 + i32.const 0 + i32.load offset=26924 + i32.const 0 + i32.load offset=26916 + i32.const 0 + i32.load offset=26908 + i32.const 0 + i32.load offset=26900 + i32.const 0 + i32.load offset=26892 + i32.const 0 + i32.load offset=26884 + i32.const 0 + i32.load offset=26876 + i32.const 0 + i32.load offset=26868 + i32.const 0 + i32.load offset=26860 + i32.const 0 + i32.load offset=26852 + i32.const 0 + i32.load offset=26844 + i32.const 0 + i32.load offset=26820 + i32.const 0 + i32.load offset=26804 + i32.const 0 + i32.load offset=26788 + i32.const 0 + i32.load offset=26772 + i32.const 0 + i32.load offset=26756 + i32.const 0 + i32.load offset=26740 + i32.const 0 + i32.load offset=26724 + i32.const 0 + i32.load offset=26708 + i32.const 0 + i32.load offset=26692 + i32.const 0 + i32.load offset=26676 + i32.const 0 + i32.load offset=26660 + i32.const 0 + i32.load offset=26612 + i32.const 0 + i32.load offset=26580 + i32.const 0 + i32.load offset=26548 + i32.const 0 + i32.load offset=26516 + i32.const 0 + i32.load offset=26484 + i32.const 0 + i32.load offset=26452 + i32.const 0 + i32.load offset=26420 + i32.const 0 + i32.load offset=26388 + i32.const 0 + i32.load offset=26356 + i32.const 0 + i32.load offset=26324 + i32.const 0 + i32.load offset=26292 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26260 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26644 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26836 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26932 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_1) + (func $test3_func_4_1 (type 1) + call $test3_func_4_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22752 + i32.const 0 + i32.load offset=22748 + i32.const 0 + i32.load offset=22744 + i32.const 0 + i32.load offset=22740 + i32.const 0 + i32.load offset=22736 + i32.const 0 + i32.load offset=22732 + i32.const 0 + i32.load offset=22728 + i32.const 0 + i32.load offset=22724 + i32.const 0 + i32.load offset=22720 + i32.const 0 + i32.load offset=22716 + i32.const 0 + i32.load offset=22712 + i32.const 0 + i32.load offset=22700 + i32.const 0 + i32.load offset=22692 + i32.const 0 + i32.load offset=22684 + i32.const 0 + i32.load offset=22676 + i32.const 0 + i32.load offset=22668 + i32.const 0 + i32.load offset=22660 + i32.const 0 + i32.load offset=22652 + i32.const 0 + i32.load offset=22644 + i32.const 0 + i32.load offset=22636 + i32.const 0 + i32.load offset=22628 + i32.const 0 + i32.load offset=22620 + i32.const 0 + i32.load offset=22596 + i32.const 0 + i32.load offset=22580 + i32.const 0 + i32.load offset=22564 + i32.const 0 + i32.load offset=22548 + i32.const 0 + i32.load offset=22532 + i32.const 0 + i32.load offset=22516 + i32.const 0 + i32.load offset=22500 + i32.const 0 + i32.load offset=22484 + i32.const 0 + i32.load offset=22468 + i32.const 0 + i32.load offset=22452 + i32.const 0 + i32.load offset=22436 + i32.const 0 + i32.load offset=22388 + i32.const 0 + i32.load offset=22356 + i32.const 0 + i32.load offset=22324 + i32.const 0 + i32.load offset=22292 + i32.const 0 + i32.load offset=22260 + i32.const 0 + i32.load offset=22228 + i32.const 0 + i32.load offset=22196 + i32.const 0 + i32.load offset=22164 + i32.const 0 + i32.load offset=22132 + i32.const 0 + i32.load offset=22100 + i32.const 0 + i32.load offset=22068 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22036 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22420 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22612 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22708 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_1) + (func $test3_func_3_1 (type 1) + call $test3_func_3_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18528 + i32.const 0 + i32.load offset=18524 + i32.const 0 + i32.load offset=18520 + i32.const 0 + i32.load offset=18516 + i32.const 0 + i32.load offset=18512 + i32.const 0 + i32.load offset=18508 + i32.const 0 + i32.load offset=18504 + i32.const 0 + i32.load offset=18500 + i32.const 0 + i32.load offset=18496 + i32.const 0 + i32.load offset=18492 + i32.const 0 + i32.load offset=18488 + i32.const 0 + i32.load offset=18476 + i32.const 0 + i32.load offset=18468 + i32.const 0 + i32.load offset=18460 + i32.const 0 + i32.load offset=18452 + i32.const 0 + i32.load offset=18444 + i32.const 0 + i32.load offset=18436 + i32.const 0 + i32.load offset=18428 + i32.const 0 + i32.load offset=18420 + i32.const 0 + i32.load offset=18412 + i32.const 0 + i32.load offset=18404 + i32.const 0 + i32.load offset=18396 + i32.const 0 + i32.load offset=18372 + i32.const 0 + i32.load offset=18356 + i32.const 0 + i32.load offset=18340 + i32.const 0 + i32.load offset=18324 + i32.const 0 + i32.load offset=18308 + i32.const 0 + i32.load offset=18292 + i32.const 0 + i32.load offset=18276 + i32.const 0 + i32.load offset=18260 + i32.const 0 + i32.load offset=18244 + i32.const 0 + i32.load offset=18228 + i32.const 0 + i32.load offset=18212 + i32.const 0 + i32.load offset=18164 + i32.const 0 + i32.load offset=18132 + i32.const 0 + i32.load offset=18100 + i32.const 0 + i32.load offset=18068 + i32.const 0 + i32.load offset=18036 + i32.const 0 + i32.load offset=18004 + i32.const 0 + i32.load offset=17972 + i32.const 0 + i32.load offset=17940 + i32.const 0 + i32.load offset=17908 + i32.const 0 + i32.load offset=17876 + i32.const 0 + i32.load offset=17844 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17812 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18196 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18388 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18484 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_1) + (func $test3_func_2_1 (type 1) + call $test3_func_2_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14304 + i32.const 0 + i32.load offset=14300 + i32.const 0 + i32.load offset=14296 + i32.const 0 + i32.load offset=14292 + i32.const 0 + i32.load offset=14288 + i32.const 0 + i32.load offset=14284 + i32.const 0 + i32.load offset=14280 + i32.const 0 + i32.load offset=14276 + i32.const 0 + i32.load offset=14272 + i32.const 0 + i32.load offset=14268 + i32.const 0 + i32.load offset=14264 + i32.const 0 + i32.load offset=14252 + i32.const 0 + i32.load offset=14244 + i32.const 0 + i32.load offset=14236 + i32.const 0 + i32.load offset=14228 + i32.const 0 + i32.load offset=14220 + i32.const 0 + i32.load offset=14212 + i32.const 0 + i32.load offset=14204 + i32.const 0 + i32.load offset=14196 + i32.const 0 + i32.load offset=14188 + i32.const 0 + i32.load offset=14180 + i32.const 0 + i32.load offset=14172 + i32.const 0 + i32.load offset=14148 + i32.const 0 + i32.load offset=14132 + i32.const 0 + i32.load offset=14116 + i32.const 0 + i32.load offset=14100 + i32.const 0 + i32.load offset=14084 + i32.const 0 + i32.load offset=14068 + i32.const 0 + i32.load offset=14052 + i32.const 0 + i32.load offset=14036 + i32.const 0 + i32.load offset=14020 + i32.const 0 + i32.load offset=14004 + i32.const 0 + i32.load offset=13988 + i32.const 0 + i32.load offset=13940 + i32.const 0 + i32.load offset=13908 + i32.const 0 + i32.load offset=13876 + i32.const 0 + i32.load offset=13844 + i32.const 0 + i32.load offset=13812 + i32.const 0 + i32.load offset=13780 + i32.const 0 + i32.load offset=13748 + i32.const 0 + i32.load offset=13716 + i32.const 0 + i32.load offset=13684 + i32.const 0 + i32.load offset=13652 + i32.const 0 + i32.load offset=13620 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13588 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=13972 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14164 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14260 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_1) + (func $test3_func_1_1 (type 1) + call $test3_func_1_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10080 + i32.const 0 + i32.load offset=10076 + i32.const 0 + i32.load offset=10072 + i32.const 0 + i32.load offset=10068 + i32.const 0 + i32.load offset=10064 + i32.const 0 + i32.load offset=10060 + i32.const 0 + i32.load offset=10056 + i32.const 0 + i32.load offset=10052 + i32.const 0 + i32.load offset=10048 + i32.const 0 + i32.load offset=10044 + i32.const 0 + i32.load offset=10040 + i32.const 0 + i32.load offset=10028 + i32.const 0 + i32.load offset=10020 + i32.const 0 + i32.load offset=10012 + i32.const 0 + i32.load offset=10004 + i32.const 0 + i32.load offset=9996 + i32.const 0 + i32.load offset=9988 + i32.const 0 + i32.load offset=9980 + i32.const 0 + i32.load offset=9972 + i32.const 0 + i32.load offset=9964 + i32.const 0 + i32.load offset=9956 + i32.const 0 + i32.load offset=9948 + i32.const 0 + i32.load offset=9924 + i32.const 0 + i32.load offset=9908 + i32.const 0 + i32.load offset=9892 + i32.const 0 + i32.load offset=9876 + i32.const 0 + i32.load offset=9860 + i32.const 0 + i32.load offset=9844 + i32.const 0 + i32.load offset=9828 + i32.const 0 + i32.load offset=9812 + i32.const 0 + i32.load offset=9796 + i32.const 0 + i32.load offset=9780 + i32.const 0 + i32.load offset=9764 + i32.const 0 + i32.load offset=9716 + i32.const 0 + i32.load offset=9684 + i32.const 0 + i32.load offset=9652 + i32.const 0 + i32.load offset=9620 + i32.const 0 + i32.load offset=9588 + i32.const 0 + i32.load offset=9556 + i32.const 0 + i32.load offset=9524 + i32.const 0 + i32.load offset=9492 + i32.const 0 + i32.load offset=9460 + i32.const 0 + i32.load offset=9428 + i32.const 0 + i32.load offset=9396 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9364 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9748 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9940 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10036 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_1) + (func $test3_func_0_1 (type 1) + call $test3_func_0_2 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=5856 + i32.const 0 + i32.load offset=5852 + i32.const 0 + i32.load offset=5848 + i32.const 0 + i32.load offset=5844 + i32.const 0 + i32.load offset=5840 + i32.const 0 + i32.load offset=5836 + i32.const 0 + i32.load offset=5832 + i32.const 0 + i32.load offset=5828 + i32.const 0 + i32.load offset=5824 + i32.const 0 + i32.load offset=5820 + i32.const 0 + i32.load offset=5816 + i32.const 0 + i32.load offset=5804 + i32.const 0 + i32.load offset=5796 + i32.const 0 + i32.load offset=5788 + i32.const 0 + i32.load offset=5780 + i32.const 0 + i32.load offset=5772 + i32.const 0 + i32.load offset=5764 + i32.const 0 + i32.load offset=5756 + i32.const 0 + i32.load offset=5748 + i32.const 0 + i32.load offset=5740 + i32.const 0 + i32.load offset=5732 + i32.const 0 + i32.load offset=5724 + i32.const 0 + i32.load offset=5700 + i32.const 0 + i32.load offset=5684 + i32.const 0 + i32.load offset=5668 + i32.const 0 + i32.load offset=5652 + i32.const 0 + i32.load offset=5636 + i32.const 0 + i32.load offset=5620 + i32.const 0 + i32.load offset=5604 + i32.const 0 + i32.load offset=5588 + i32.const 0 + i32.load offset=5572 + i32.const 0 + i32.load offset=5556 + i32.const 0 + i32.load offset=5540 + i32.const 0 + i32.load offset=5492 + i32.const 0 + i32.load offset=5460 + i32.const 0 + i32.load offset=5428 + i32.const 0 + i32.load offset=5396 + i32.const 0 + i32.load offset=5364 + i32.const 0 + i32.load offset=5332 + i32.const 0 + i32.load offset=5300 + i32.const 0 + i32.load offset=5268 + i32.const 0 + i32.load offset=5236 + i32.const 0 + i32.load offset=5204 + i32.const 0 + i32.load offset=5172 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5140 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5524 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5716 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5812 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_1) + (func $test3_func_10_0 (type 1) + call $test3_func_10_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=11228 + i32.const 0 + i32.load offset=11224 + i32.const 0 + i32.load offset=11220 + i32.const 0 + i32.load offset=11216 + i32.const 0 + i32.load offset=11212 + i32.const 0 + i32.load offset=11208 + i32.const 0 + i32.load offset=11204 + i32.const 0 + i32.load offset=11200 + i32.const 0 + i32.load offset=11196 + i32.const 0 + i32.load offset=11192 + i32.const 0 + i32.load offset=11188 + i32.const 0 + i32.load offset=11176 + i32.const 0 + i32.load offset=11168 + i32.const 0 + i32.load offset=11160 + i32.const 0 + i32.load offset=11152 + i32.const 0 + i32.load offset=11144 + i32.const 0 + i32.load offset=11136 + i32.const 0 + i32.load offset=11128 + i32.const 0 + i32.load offset=11120 + i32.const 0 + i32.load offset=11112 + i32.const 0 + i32.load offset=11104 + i32.const 0 + i32.load offset=11096 + i32.const 0 + i32.load offset=11072 + i32.const 0 + i32.load offset=11056 + i32.const 0 + i32.load offset=11040 + i32.const 0 + i32.load offset=11024 + i32.const 0 + i32.load offset=11008 + i32.const 0 + i32.load offset=10992 + i32.const 0 + i32.load offset=10976 + i32.const 0 + i32.load offset=10960 + i32.const 0 + i32.load offset=10944 + i32.const 0 + i32.load offset=10928 + i32.const 0 + i32.load offset=10912 + i32.const 0 + i32.load offset=10864 + i32.const 0 + i32.load offset=10832 + i32.const 0 + i32.load offset=10800 + i32.const 0 + i32.load offset=10768 + i32.const 0 + i32.load offset=10736 + i32.const 0 + i32.load offset=10704 + i32.const 0 + i32.load offset=10672 + i32.const 0 + i32.load offset=10640 + i32.const 0 + i32.load offset=10608 + i32.const 0 + i32.load offset=10576 + i32.const 0 + i32.load offset=10544 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=10512 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10896 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=11088 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=11184 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808) + (func $test3_func_9_0 (type 1) + call $test3_func_9_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=7004 + i32.const 0 + i32.load offset=7000 + i32.const 0 + i32.load offset=6996 + i32.const 0 + i32.load offset=6992 + i32.const 0 + i32.load offset=6988 + i32.const 0 + i32.load offset=6984 + i32.const 0 + i32.load offset=6980 + i32.const 0 + i32.load offset=6976 + i32.const 0 + i32.load offset=6972 + i32.const 0 + i32.load offset=6968 + i32.const 0 + i32.load offset=6964 + i32.const 0 + i32.load offset=6952 + i32.const 0 + i32.load offset=6944 + i32.const 0 + i32.load offset=6936 + i32.const 0 + i32.load offset=6928 + i32.const 0 + i32.load offset=6920 + i32.const 0 + i32.load offset=6912 + i32.const 0 + i32.load offset=6904 + i32.const 0 + i32.load offset=6896 + i32.const 0 + i32.load offset=6888 + i32.const 0 + i32.load offset=6880 + i32.const 0 + i32.load offset=6872 + i32.const 0 + i32.load offset=6848 + i32.const 0 + i32.load offset=6832 + i32.const 0 + i32.load offset=6816 + i32.const 0 + i32.load offset=6800 + i32.const 0 + i32.load offset=6784 + i32.const 0 + i32.load offset=6768 + i32.const 0 + i32.load offset=6752 + i32.const 0 + i32.load offset=6736 + i32.const 0 + i32.load offset=6720 + i32.const 0 + i32.load offset=6704 + i32.const 0 + i32.load offset=6688 + i32.const 0 + i32.load offset=6640 + i32.const 0 + i32.load offset=6608 + i32.const 0 + i32.load offset=6576 + i32.const 0 + i32.load offset=6544 + i32.const 0 + i32.load offset=6512 + i32.const 0 + i32.load offset=6480 + i32.const 0 + i32.load offset=6448 + i32.const 0 + i32.load offset=6416 + i32.const 0 + i32.load offset=6384 + i32.const 0 + i32.load offset=6352 + i32.const 0 + i32.load offset=6320 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=6288 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6672 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6864 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=6960 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_10_0) + (func $test3_func_8_0 (type 1) + call $test3_func_8_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=2780 + i32.const 0 + i32.load offset=2776 + i32.const 0 + i32.load offset=2772 + i32.const 0 + i32.load offset=2768 + i32.const 0 + i32.load offset=2764 + i32.const 0 + i32.load offset=2760 + i32.const 0 + i32.load offset=2756 + i32.const 0 + i32.load offset=2752 + i32.const 0 + i32.load offset=2748 + i32.const 0 + i32.load offset=2744 + i32.const 0 + i32.load offset=2740 + i32.const 0 + i32.load offset=2728 + i32.const 0 + i32.load offset=2720 + i32.const 0 + i32.load offset=2712 + i32.const 0 + i32.load offset=2704 + i32.const 0 + i32.load offset=2696 + i32.const 0 + i32.load offset=2688 + i32.const 0 + i32.load offset=2680 + i32.const 0 + i32.load offset=2672 + i32.const 0 + i32.load offset=2664 + i32.const 0 + i32.load offset=2656 + i32.const 0 + i32.load offset=2648 + i32.const 0 + i32.load offset=2624 + i32.const 0 + i32.load offset=2608 + i32.const 0 + i32.load offset=2592 + i32.const 0 + i32.load offset=2576 + i32.const 0 + i32.load offset=2560 + i32.const 0 + i32.load offset=2544 + i32.const 0 + i32.load offset=2528 + i32.const 0 + i32.load offset=2512 + i32.const 0 + i32.load offset=2496 + i32.const 0 + i32.load offset=2480 + i32.const 0 + i32.load offset=2464 + i32.const 0 + i32.load offset=2416 + i32.const 0 + i32.load offset=2384 + i32.const 0 + i32.load offset=2352 + i32.const 0 + i32.load offset=2320 + i32.const 0 + i32.load offset=2288 + i32.const 0 + i32.load offset=2256 + i32.const 0 + i32.load offset=2224 + i32.const 0 + i32.load offset=2192 + i32.const 0 + i32.load offset=2160 + i32.const 0 + i32.load offset=2128 + i32.const 0 + i32.load offset=2096 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=2064 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2448 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2640 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=2736 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_9_0) + (func $test3_func_7_0 (type 1) + call $test3_func_7_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=31324 + i32.const 0 + i32.load offset=31320 + i32.const 0 + i32.load offset=31316 + i32.const 0 + i32.load offset=31312 + i32.const 0 + i32.load offset=31308 + i32.const 0 + i32.load offset=31304 + i32.const 0 + i32.load offset=31300 + i32.const 0 + i32.load offset=31296 + i32.const 0 + i32.load offset=31292 + i32.const 0 + i32.load offset=31288 + i32.const 0 + i32.load offset=31284 + i32.const 0 + i32.load offset=31272 + i32.const 0 + i32.load offset=31264 + i32.const 0 + i32.load offset=31256 + i32.const 0 + i32.load offset=31248 + i32.const 0 + i32.load offset=31240 + i32.const 0 + i32.load offset=31232 + i32.const 0 + i32.load offset=31224 + i32.const 0 + i32.load offset=31216 + i32.const 0 + i32.load offset=31208 + i32.const 0 + i32.load offset=31200 + i32.const 0 + i32.load offset=31192 + i32.const 0 + i32.load offset=31168 + i32.const 0 + i32.load offset=31152 + i32.const 0 + i32.load offset=31136 + i32.const 0 + i32.load offset=31120 + i32.const 0 + i32.load offset=31104 + i32.const 0 + i32.load offset=31088 + i32.const 0 + i32.load offset=31072 + i32.const 0 + i32.load offset=31056 + i32.const 0 + i32.load offset=31040 + i32.const 0 + i32.load offset=31024 + i32.const 0 + i32.load offset=31008 + i32.const 0 + i32.load offset=30960 + i32.const 0 + i32.load offset=30928 + i32.const 0 + i32.load offset=30896 + i32.const 0 + i32.load offset=30864 + i32.const 0 + i32.load offset=30832 + i32.const 0 + i32.load offset=30800 + i32.const 0 + i32.load offset=30768 + i32.const 0 + i32.load offset=30736 + i32.const 0 + i32.load offset=30704 + i32.const 0 + i32.load offset=30672 + i32.const 0 + i32.load offset=30640 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=30608 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=30992 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31184 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=31280 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_8_0) + (func $test3_func_6_0 (type 1) + call $test3_func_6_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=27100 + i32.const 0 + i32.load offset=27096 + i32.const 0 + i32.load offset=27092 + i32.const 0 + i32.load offset=27088 + i32.const 0 + i32.load offset=27084 + i32.const 0 + i32.load offset=27080 + i32.const 0 + i32.load offset=27076 + i32.const 0 + i32.load offset=27072 + i32.const 0 + i32.load offset=27068 + i32.const 0 + i32.load offset=27064 + i32.const 0 + i32.load offset=27060 + i32.const 0 + i32.load offset=27048 + i32.const 0 + i32.load offset=27040 + i32.const 0 + i32.load offset=27032 + i32.const 0 + i32.load offset=27024 + i32.const 0 + i32.load offset=27016 + i32.const 0 + i32.load offset=27008 + i32.const 0 + i32.load offset=27000 + i32.const 0 + i32.load offset=26992 + i32.const 0 + i32.load offset=26984 + i32.const 0 + i32.load offset=26976 + i32.const 0 + i32.load offset=26968 + i32.const 0 + i32.load offset=26944 + i32.const 0 + i32.load offset=26928 + i32.const 0 + i32.load offset=26912 + i32.const 0 + i32.load offset=26896 + i32.const 0 + i32.load offset=26880 + i32.const 0 + i32.load offset=26864 + i32.const 0 + i32.load offset=26848 + i32.const 0 + i32.load offset=26832 + i32.const 0 + i32.load offset=26816 + i32.const 0 + i32.load offset=26800 + i32.const 0 + i32.load offset=26784 + i32.const 0 + i32.load offset=26736 + i32.const 0 + i32.load offset=26704 + i32.const 0 + i32.load offset=26672 + i32.const 0 + i32.load offset=26640 + i32.const 0 + i32.load offset=26608 + i32.const 0 + i32.load offset=26576 + i32.const 0 + i32.load offset=26544 + i32.const 0 + i32.load offset=26512 + i32.const 0 + i32.load offset=26480 + i32.const 0 + i32.load offset=26448 + i32.const 0 + i32.load offset=26416 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=26384 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26768 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=26960 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=27056 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_7_0) + (func $test3_func_5_0 (type 1) + call $test3_func_5_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=22876 + i32.const 0 + i32.load offset=22872 + i32.const 0 + i32.load offset=22868 + i32.const 0 + i32.load offset=22864 + i32.const 0 + i32.load offset=22860 + i32.const 0 + i32.load offset=22856 + i32.const 0 + i32.load offset=22852 + i32.const 0 + i32.load offset=22848 + i32.const 0 + i32.load offset=22844 + i32.const 0 + i32.load offset=22840 + i32.const 0 + i32.load offset=22836 + i32.const 0 + i32.load offset=22824 + i32.const 0 + i32.load offset=22816 + i32.const 0 + i32.load offset=22808 + i32.const 0 + i32.load offset=22800 + i32.const 0 + i32.load offset=22792 + i32.const 0 + i32.load offset=22784 + i32.const 0 + i32.load offset=22776 + i32.const 0 + i32.load offset=22768 + i32.const 0 + i32.load offset=22760 + i32.const 0 + i32.load offset=22752 + i32.const 0 + i32.load offset=22744 + i32.const 0 + i32.load offset=22720 + i32.const 0 + i32.load offset=22704 + i32.const 0 + i32.load offset=22688 + i32.const 0 + i32.load offset=22672 + i32.const 0 + i32.load offset=22656 + i32.const 0 + i32.load offset=22640 + i32.const 0 + i32.load offset=22624 + i32.const 0 + i32.load offset=22608 + i32.const 0 + i32.load offset=22592 + i32.const 0 + i32.load offset=22576 + i32.const 0 + i32.load offset=22560 + i32.const 0 + i32.load offset=22512 + i32.const 0 + i32.load offset=22480 + i32.const 0 + i32.load offset=22448 + i32.const 0 + i32.load offset=22416 + i32.const 0 + i32.load offset=22384 + i32.const 0 + i32.load offset=22352 + i32.const 0 + i32.load offset=22320 + i32.const 0 + i32.load offset=22288 + i32.const 0 + i32.load offset=22256 + i32.const 0 + i32.load offset=22224 + i32.const 0 + i32.load offset=22192 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=22160 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22544 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22736 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=22832 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_6_0) + (func $test3_func_4_0 (type 1) + call $test3_func_4_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=18652 + i32.const 0 + i32.load offset=18648 + i32.const 0 + i32.load offset=18644 + i32.const 0 + i32.load offset=18640 + i32.const 0 + i32.load offset=18636 + i32.const 0 + i32.load offset=18632 + i32.const 0 + i32.load offset=18628 + i32.const 0 + i32.load offset=18624 + i32.const 0 + i32.load offset=18620 + i32.const 0 + i32.load offset=18616 + i32.const 0 + i32.load offset=18612 + i32.const 0 + i32.load offset=18600 + i32.const 0 + i32.load offset=18592 + i32.const 0 + i32.load offset=18584 + i32.const 0 + i32.load offset=18576 + i32.const 0 + i32.load offset=18568 + i32.const 0 + i32.load offset=18560 + i32.const 0 + i32.load offset=18552 + i32.const 0 + i32.load offset=18544 + i32.const 0 + i32.load offset=18536 + i32.const 0 + i32.load offset=18528 + i32.const 0 + i32.load offset=18520 + i32.const 0 + i32.load offset=18496 + i32.const 0 + i32.load offset=18480 + i32.const 0 + i32.load offset=18464 + i32.const 0 + i32.load offset=18448 + i32.const 0 + i32.load offset=18432 + i32.const 0 + i32.load offset=18416 + i32.const 0 + i32.load offset=18400 + i32.const 0 + i32.load offset=18384 + i32.const 0 + i32.load offset=18368 + i32.const 0 + i32.load offset=18352 + i32.const 0 + i32.load offset=18336 + i32.const 0 + i32.load offset=18288 + i32.const 0 + i32.load offset=18256 + i32.const 0 + i32.load offset=18224 + i32.const 0 + i32.load offset=18192 + i32.const 0 + i32.load offset=18160 + i32.const 0 + i32.load offset=18128 + i32.const 0 + i32.load offset=18096 + i32.const 0 + i32.load offset=18064 + i32.const 0 + i32.load offset=18032 + i32.const 0 + i32.load offset=18000 + i32.const 0 + i32.load offset=17968 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=17936 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18320 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18512 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=18608 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_5_0) + (func $test3_func_3_0 (type 1) + call $test3_func_3_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=14428 + i32.const 0 + i32.load offset=14424 + i32.const 0 + i32.load offset=14420 + i32.const 0 + i32.load offset=14416 + i32.const 0 + i32.load offset=14412 + i32.const 0 + i32.load offset=14408 + i32.const 0 + i32.load offset=14404 + i32.const 0 + i32.load offset=14400 + i32.const 0 + i32.load offset=14396 + i32.const 0 + i32.load offset=14392 + i32.const 0 + i32.load offset=14388 + i32.const 0 + i32.load offset=14376 + i32.const 0 + i32.load offset=14368 + i32.const 0 + i32.load offset=14360 + i32.const 0 + i32.load offset=14352 + i32.const 0 + i32.load offset=14344 + i32.const 0 + i32.load offset=14336 + i32.const 0 + i32.load offset=14328 + i32.const 0 + i32.load offset=14320 + i32.const 0 + i32.load offset=14312 + i32.const 0 + i32.load offset=14304 + i32.const 0 + i32.load offset=14296 + i32.const 0 + i32.load offset=14272 + i32.const 0 + i32.load offset=14256 + i32.const 0 + i32.load offset=14240 + i32.const 0 + i32.load offset=14224 + i32.const 0 + i32.load offset=14208 + i32.const 0 + i32.load offset=14192 + i32.const 0 + i32.load offset=14176 + i32.const 0 + i32.load offset=14160 + i32.const 0 + i32.load offset=14144 + i32.const 0 + i32.load offset=14128 + i32.const 0 + i32.load offset=14112 + i32.const 0 + i32.load offset=14064 + i32.const 0 + i32.load offset=14032 + i32.const 0 + i32.load offset=14000 + i32.const 0 + i32.load offset=13968 + i32.const 0 + i32.load offset=13936 + i32.const 0 + i32.load offset=13904 + i32.const 0 + i32.load offset=13872 + i32.const 0 + i32.load offset=13840 + i32.const 0 + i32.load offset=13808 + i32.const 0 + i32.load offset=13776 + i32.const 0 + i32.load offset=13744 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=13712 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14096 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14288 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=14384 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_4_0) + (func $test3_func_2_0 (type 1) + call $test3_func_2_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=10204 + i32.const 0 + i32.load offset=10200 + i32.const 0 + i32.load offset=10196 + i32.const 0 + i32.load offset=10192 + i32.const 0 + i32.load offset=10188 + i32.const 0 + i32.load offset=10184 + i32.const 0 + i32.load offset=10180 + i32.const 0 + i32.load offset=10176 + i32.const 0 + i32.load offset=10172 + i32.const 0 + i32.load offset=10168 + i32.const 0 + i32.load offset=10164 + i32.const 0 + i32.load offset=10152 + i32.const 0 + i32.load offset=10144 + i32.const 0 + i32.load offset=10136 + i32.const 0 + i32.load offset=10128 + i32.const 0 + i32.load offset=10120 + i32.const 0 + i32.load offset=10112 + i32.const 0 + i32.load offset=10104 + i32.const 0 + i32.load offset=10096 + i32.const 0 + i32.load offset=10088 + i32.const 0 + i32.load offset=10080 + i32.const 0 + i32.load offset=10072 + i32.const 0 + i32.load offset=10048 + i32.const 0 + i32.load offset=10032 + i32.const 0 + i32.load offset=10016 + i32.const 0 + i32.load offset=10000 + i32.const 0 + i32.load offset=9984 + i32.const 0 + i32.load offset=9968 + i32.const 0 + i32.load offset=9952 + i32.const 0 + i32.load offset=9936 + i32.const 0 + i32.load offset=9920 + i32.const 0 + i32.load offset=9904 + i32.const 0 + i32.load offset=9888 + i32.const 0 + i32.load offset=9840 + i32.const 0 + i32.load offset=9808 + i32.const 0 + i32.load offset=9776 + i32.const 0 + i32.load offset=9744 + i32.const 0 + i32.load offset=9712 + i32.const 0 + i32.load offset=9680 + i32.const 0 + i32.load offset=9648 + i32.const 0 + i32.load offset=9616 + i32.const 0 + i32.load offset=9584 + i32.const 0 + i32.load offset=9552 + i32.const 0 + i32.load offset=9520 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=9488 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=9872 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10064 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=10160 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_3_0) + (func $test3_func_1_0 (type 1) + call $test3_func_1_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=5980 + i32.const 0 + i32.load offset=5976 + i32.const 0 + i32.load offset=5972 + i32.const 0 + i32.load offset=5968 + i32.const 0 + i32.load offset=5964 + i32.const 0 + i32.load offset=5960 + i32.const 0 + i32.load offset=5956 + i32.const 0 + i32.load offset=5952 + i32.const 0 + i32.load offset=5948 + i32.const 0 + i32.load offset=5944 + i32.const 0 + i32.load offset=5940 + i32.const 0 + i32.load offset=5928 + i32.const 0 + i32.load offset=5920 + i32.const 0 + i32.load offset=5912 + i32.const 0 + i32.load offset=5904 + i32.const 0 + i32.load offset=5896 + i32.const 0 + i32.load offset=5888 + i32.const 0 + i32.load offset=5880 + i32.const 0 + i32.load offset=5872 + i32.const 0 + i32.load offset=5864 + i32.const 0 + i32.load offset=5856 + i32.const 0 + i32.load offset=5848 + i32.const 0 + i32.load offset=5824 + i32.const 0 + i32.load offset=5808 + i32.const 0 + i32.load offset=5792 + i32.const 0 + i32.load offset=5776 + i32.const 0 + i32.load offset=5760 + i32.const 0 + i32.load offset=5744 + i32.const 0 + i32.load offset=5728 + i32.const 0 + i32.load offset=5712 + i32.const 0 + i32.load offset=5696 + i32.const 0 + i32.load offset=5680 + i32.const 0 + i32.load offset=5664 + i32.const 0 + i32.load offset=5616 + i32.const 0 + i32.load offset=5584 + i32.const 0 + i32.load offset=5552 + i32.const 0 + i32.load offset=5520 + i32.const 0 + i32.load offset=5488 + i32.const 0 + i32.load offset=5456 + i32.const 0 + i32.load offset=5424 + i32.const 0 + i32.load offset=5392 + i32.const 0 + i32.load offset=5360 + i32.const 0 + i32.load offset=5328 + i32.const 0 + i32.load offset=5296 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=5264 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5648 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5840 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=5936 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_2_0) + (func $test3_func_0_0 (type 1) + call $test3_func_0_1 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=1756 + i32.const 0 + i32.load offset=1752 + i32.const 0 + i32.load offset=1748 + i32.const 0 + i32.load offset=1744 + i32.const 0 + i32.load offset=1740 + i32.const 0 + i32.load offset=1736 + i32.const 0 + i32.load offset=1732 + i32.const 0 + i32.load offset=1728 + i32.const 0 + i32.load offset=1724 + i32.const 0 + i32.load offset=1720 + i32.const 0 + i32.load offset=1716 + i32.const 0 + i32.load offset=1704 + i32.const 0 + i32.load offset=1696 + i32.const 0 + i32.load offset=1688 + i32.const 0 + i32.load offset=1680 + i32.const 0 + i32.load offset=1672 + i32.const 0 + i32.load offset=1664 + i32.const 0 + i32.load offset=1656 + i32.const 0 + i32.load offset=1648 + i32.const 0 + i32.load offset=1640 + i32.const 0 + i32.load offset=1632 + i32.const 0 + i32.load offset=1624 + i32.const 0 + i32.load offset=1600 + i32.const 0 + i32.load offset=1584 + i32.const 0 + i32.load offset=1568 + i32.const 0 + i32.load offset=1552 + i32.const 0 + i32.load offset=1536 + i32.const 0 + i32.load offset=1520 + i32.const 0 + i32.load offset=1504 + i32.const 0 + i32.load offset=1488 + i32.const 0 + i32.load offset=1472 + i32.const 0 + i32.load offset=1456 + i32.const 0 + i32.load offset=1440 + i32.const 0 + i32.load offset=1392 + i32.const 0 + i32.load offset=1360 + i32.const 0 + i32.load offset=1328 + i32.const 0 + i32.load offset=1296 + i32.const 0 + i32.load offset=1264 + i32.const 0 + i32.load offset=1232 + i32.const 0 + i32.load offset=1200 + i32.const 0 + i32.load offset=1168 + i32.const 0 + i32.load offset=1136 + i32.const 0 + i32.load offset=1104 + i32.const 0 + i32.load offset=1072 + i32.const 0 + i32.load offset=33808 + i32.const 0 + i32.load offset=1040 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1424 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1616 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.const 0 + i32.load offset=1712 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.store offset=33808 + call $test3_func_1_0) + (func $test3_main (type 1) + call $test3_func_0_0) + (func $__original_main (type 2) (result i32) + call $test3_init + call $test3_main + i32.const 0 + i32.load offset=33808 + i32.const 1377313800 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 37920)) + (global (;1;) i32 (i32.const 33812)) + (global (;2;) i32 (i32.const 37920)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $test3_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2))) diff --git a/targets/wasm-tacle/test/test3/generated/modified_sources/default/test3.c b/targets/wasm-tacle/test/test3/generated/modified_sources/default/test3.c new file mode 100644 index 0000000..a138fff --- /dev/null +++ b/targets/wasm-tacle/test/test3/generated/modified_sources/default/test3.c @@ -0,0 +1,4833 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: test3 + + Author: Rathijit Sen + + Function: This testcase walks through parts of 8 arrays in a 10 x 10 grid of + functions. function f_i_j calls f_i_j+1 and f_i+1,j except at the grid + boundaries. + + Source: Universitaet des Saarlandes, Saarbruecken, Germany + Compiler Research Group + + Original name: test3 + + Changes: + 26-10-2007 Creation at Saarbruecken + + License: GPL + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +void test3_initSeed(); +int test3_randomInteger(void); +void test3_init(void); +int test3_return(void); +void test3_func_10_10(void); +void test3_func_9_10(void); +void test3_func_8_10(void); +void test3_func_7_10(void); +void test3_func_6_10(void); +void test3_func_5_10(void); +void test3_func_4_10(void); +void test3_func_3_10(void); +void test3_func_2_10(void); +void test3_func_1_10(void); +void test3_func_0_10(void); +void test3_func_10_9(void); +void test3_func_9_9(void); +void test3_func_8_9(void); +void test3_func_7_9(void); +void test3_func_6_9(void); +void test3_func_5_9(void); +void test3_func_4_9(void); +void test3_func_3_9(void); +void test3_func_2_9(void); +void test3_func_1_9(void); +void test3_func_0_9(void); +void test3_func_10_8(void); +void test3_func_9_8(void); +void test3_func_8_8(void); +void test3_func_7_8(void); +void test3_func_6_8(void); +void test3_func_5_8(void); +void test3_func_4_8(void); +void test3_func_3_8(void); +void test3_func_2_8(void); +void test3_func_1_8(void); +void test3_func_0_8(void); +void test3_func_10_7(void); +void test3_func_9_7(void); +void test3_func_8_7(void); +void test3_func_7_7(void); +void test3_func_6_7(void); +void test3_func_5_7(void); +void test3_func_4_7(void); +void test3_func_3_7(void); +void test3_func_2_7(void); +void test3_func_1_7(void); +void test3_func_0_7(void); +void test3_func_10_6(void); +void test3_func_9_6(void); +void test3_func_8_6(void); +void test3_func_7_6(void); +void test3_func_6_6(void); +void test3_func_5_6(void); +void test3_func_4_6(void); +void test3_func_3_6(void); +void test3_func_2_6(void); +void test3_func_1_6(void); +void test3_func_0_6(void); +void test3_func_10_5(void); +void test3_func_9_5(void); +void test3_func_8_5(void); +void test3_func_7_5(void); +void test3_func_6_5(void); +void test3_func_5_5(void); +void test3_func_4_5(void); +void test3_func_3_5(void); +void test3_func_2_5(void); +void test3_func_1_5(void); +void test3_func_0_5(void); +void test3_func_10_4(void); +void test3_func_9_4(void); +void test3_func_8_4(void); +void test3_func_7_4(void); +void test3_func_6_4(void); +void test3_func_5_4(void); +void test3_func_4_4(void); +void test3_func_3_4(void); +void test3_func_2_4(void); +void test3_func_1_4(void); +void test3_func_0_4(void); +void test3_func_10_3(void); +void test3_func_9_3(void); +void test3_func_8_3(void); +void test3_func_7_3(void); +void test3_func_6_3(void); +void test3_func_5_3(void); +void test3_func_4_3(void); +void test3_func_3_3(void); +void test3_func_2_3(void); +void test3_func_1_3(void); +void test3_func_0_3(void); +void test3_func_10_2(void); +void test3_func_9_2(void); +void test3_func_8_2(void); +void test3_func_7_2(void); +void test3_func_6_2(void); +void test3_func_5_2(void); +void test3_func_4_2(void); +void test3_func_3_2(void); +void test3_func_2_2(void); +void test3_func_1_2(void); +void test3_func_0_2(void); +void test3_func_10_1(void); +void test3_func_9_1(void); +void test3_func_8_1(void); +void test3_func_7_1(void); +void test3_func_6_1(void); +void test3_func_5_1(void); +void test3_func_4_1(void); +void test3_func_3_1(void); +void test3_func_2_1(void); +void test3_func_1_1(void); +void test3_func_0_1(void); +void test3_func_10_0(void); +void test3_func_9_0(void); +void test3_func_8_0(void); +void test3_func_7_0(void); +void test3_func_6_0(void); +void test3_func_5_0(void); +void test3_func_4_0(void); +void test3_func_3_0(void); +void test3_func_2_0(void); +void test3_func_1_0(void); +void test3_func_0_0(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +test3_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +volatile int test3_seed; +int test3_array1[32][32]; +int test3_array2[32][32]; +int test3_array3[32][32]; +int test3_array4[32][32]; +int test3_array5[32][32]; +int test3_array6[32][32]; +int test3_array7[32][32]; +int test3_array8[32][32]; +int test3_result; + +/* + Initialization- and return-value-related functions +*/ + +/* + test3_initSeed initializes the seed used in the "random" number generator. +*/ +void +test3_initSeed() { + test3_seed = 0; +} + +/* + test3_RandomInteger generates random integers between 0 and 8094. +*/ +int +test3_randomInteger() { + test3_seed = ((test3_seed * 133) + 81) % 8095; + return (test3_seed); +} + +void +test3_init(void) { + int i, j; + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array1[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array2[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array3[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array4[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array5[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array6[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array7[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array8[i][j] = test3_randomInteger(); + + test3_result = 0; +} + +int +test3_return(void) { + return (test3_result); +} + +/* + Algorithm core functions +*/ + +void +test3_func_10_10(void) { + int i, x; + int *p = &test3_array5[10][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_10(void) { + int i, x; + int *p = &test3_array4[9][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_10(); +} + +void +test3_func_8_10(void) { + int i, x; + int *p = &test3_array3[8][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_10(); +} + +void +test3_func_7_10(void) { + int i, x; + int *p = &test3_array2[7][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_10(); +} + +void +test3_func_6_10(void) { + int i, x; + int *p = &test3_array1[6][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_10(); +} + +void +test3_func_5_10(void) { + int i, x; + int *p = &test3_array8[5][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_10(); +} + +void +test3_func_4_10(void) { + int i, x; + int *p = &test3_array7[4][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_10(); +} + +void +test3_func_3_10(void) { + int i, x; + int *p = &test3_array6[3][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_10(); +} + +void +test3_func_2_10(void) { + int i, x; + int *p = &test3_array5[2][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_10(); +} + +void +test3_func_1_10(void) { + int i, x; + int *p = &test3_array4[1][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_10(); +} + +void +test3_func_0_10(void) { + int i, x; + int *p = &test3_array3[0][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_10(); +} + +void +test3_func_10_9(void) { + int i, x; + int *p = &test3_array4[10][9]; + + test3_func_10_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_9(void) { + int i, x; + int *p = &test3_array3[9][9]; + + test3_func_9_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_9(); +} + +void +test3_func_8_9(void) { + int i, x; + int *p = &test3_array2[8][9]; + + test3_func_8_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_9(); +} + +void +test3_func_7_9(void) { + int i, x; + int *p = &test3_array1[7][9]; + + test3_func_7_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_9(); +} + +void +test3_func_6_9(void) { + int i, x; + int *p = &test3_array8[6][9]; + + test3_func_6_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_9(); +} + +void +test3_func_5_9(void) { + int i, x; + int *p = &test3_array7[5][9]; + + test3_func_5_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_9(); +} + +void +test3_func_4_9(void) { + int i, x; + int *p = &test3_array6[4][9]; + + test3_func_4_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_9(); +} + +void +test3_func_3_9(void) { + int i, x; + int *p = &test3_array5[3][9]; + + test3_func_3_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_9(); +} + +void +test3_func_2_9(void) { + int i, x; + int *p = &test3_array4[2][9]; + + test3_func_2_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_9(); +} + +void +test3_func_1_9(void) { + int i, x; + int *p = &test3_array3[1][9]; + + test3_func_1_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_9(); +} + +void +test3_func_0_9(void) { + int i, x; + int *p = &test3_array2[0][9]; + + test3_func_0_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_9(); +} + +void +test3_func_10_8(void) { + int i, x; + int *p = &test3_array3[10][8]; + + test3_func_10_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_8(void) { + int i, x; + int *p = &test3_array2[9][8]; + + test3_func_9_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_8(); +} + +void +test3_func_8_8(void) { + int i, x; + int *p = &test3_array1[8][8]; + + test3_func_8_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_8(); +} + +void +test3_func_7_8(void) { + int i, x; + int *p = &test3_array8[7][8]; + + test3_func_7_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_8(); +} + +void +test3_func_6_8(void) { + int i, x; + int *p = &test3_array7[6][8]; + + test3_func_6_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_8(); +} + +void +test3_func_5_8(void) { + int i, x; + int *p = &test3_array6[5][8]; + + test3_func_5_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_8(); +} + +void +test3_func_4_8(void) { + int i, x; + int *p = &test3_array5[4][8]; + + test3_func_4_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_8(); +} + +void +test3_func_3_8(void) { + int i, x; + int *p = &test3_array4[3][8]; + + test3_func_3_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_8(); +} + +void +test3_func_2_8(void) { + int i, x; + int *p = &test3_array3[2][8]; + + test3_func_2_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_8(); +} + +void +test3_func_1_8(void) { + int i, x; + int *p = &test3_array2[1][8]; + + test3_func_1_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_8(); +} + +void +test3_func_0_8(void) { + int i, x; + int *p = &test3_array1[0][8]; + + test3_func_0_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_8(); +} + +void +test3_func_10_7(void) { + int i, x; + int *p = &test3_array2[10][7]; + + test3_func_10_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_7(void) { + int i, x; + int *p = &test3_array1[9][7]; + + test3_func_9_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_7(); +} + +void +test3_func_8_7(void) { + int i, x; + int *p = &test3_array8[8][7]; + + test3_func_8_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_7(); +} + +void +test3_func_7_7(void) { + int i, x; + int *p = &test3_array7[7][7]; + + test3_func_7_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_7(); +} + +void +test3_func_6_7(void) { + int i, x; + int *p = &test3_array6[6][7]; + + test3_func_6_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_7(); +} + +void +test3_func_5_7(void) { + int i, x; + int *p = &test3_array5[5][7]; + + test3_func_5_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_7(); +} + +void +test3_func_4_7(void) { + int i, x; + int *p = &test3_array4[4][7]; + + test3_func_4_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_7(); +} + +void +test3_func_3_7(void) { + int i, x; + int *p = &test3_array3[3][7]; + + test3_func_3_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_7(); +} + +void +test3_func_2_7(void) { + int i, x; + int *p = &test3_array2[2][7]; + + test3_func_2_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_7(); +} + +void +test3_func_1_7(void) { + int i, x; + int *p = &test3_array1[1][7]; + + test3_func_1_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_7(); +} + +void +test3_func_0_7(void) { + int i, x; + int *p = &test3_array8[0][7]; + + test3_func_0_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_7(); +} + +void +test3_func_10_6(void) { + int i, x; + int *p = &test3_array1[10][6]; + + test3_func_10_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_6(void) { + int i, x; + int *p = &test3_array8[9][6]; + + test3_func_9_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_6(); +} + +void +test3_func_8_6(void) { + int i, x; + int *p = &test3_array7[8][6]; + + test3_func_8_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_6(); +} + +void +test3_func_7_6(void) { + int i, x; + int *p = &test3_array6[7][6]; + + test3_func_7_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_6(); +} + +void +test3_func_6_6(void) { + int i, x; + int *p = &test3_array5[6][6]; + + test3_func_6_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_6(); +} + +void +test3_func_5_6(void) { + int i, x; + int *p = &test3_array4[5][6]; + + test3_func_5_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_6(); +} + +void +test3_func_4_6(void) { + int i, x; + int *p = &test3_array3[4][6]; + + test3_func_4_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_6(); +} + +void +test3_func_3_6(void) { + int i, x; + int *p = &test3_array2[3][6]; + + test3_func_3_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_6(); +} + +void +test3_func_2_6(void) { + int i, x; + int *p = &test3_array1[2][6]; + + test3_func_2_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_6(); +} + +void +test3_func_1_6(void) { + int i, x; + int *p = &test3_array8[1][6]; + + test3_func_1_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_6(); +} + +void +test3_func_0_6(void) { + int i, x; + int *p = &test3_array7[0][6]; + + test3_func_0_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_6(); +} + +void +test3_func_10_5(void) { + int i, x; + int *p = &test3_array8[10][5]; + + test3_func_10_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_5(void) { + int i, x; + int *p = &test3_array7[9][5]; + + test3_func_9_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_5(); +} + +void +test3_func_8_5(void) { + int i, x; + int *p = &test3_array6[8][5]; + + test3_func_8_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_5(); +} + +void +test3_func_7_5(void) { + int i, x; + int *p = &test3_array5[7][5]; + + test3_func_7_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_5(); +} + +void +test3_func_6_5(void) { + int i, x; + int *p = &test3_array4[6][5]; + + test3_func_6_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_5(); +} + +void +test3_func_5_5(void) { + int i, x; + int *p = &test3_array3[5][5]; + + test3_func_5_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_5(); +} + +void +test3_func_4_5(void) { + int i, x; + int *p = &test3_array2[4][5]; + + test3_func_4_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_5(); +} + +void +test3_func_3_5(void) { + int i, x; + int *p = &test3_array1[3][5]; + + test3_func_3_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_5(); +} + +void +test3_func_2_5(void) { + int i, x; + int *p = &test3_array8[2][5]; + + test3_func_2_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_5(); +} + +void +test3_func_1_5(void) { + int i, x; + int *p = &test3_array7[1][5]; + + test3_func_1_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_5(); +} + +void +test3_func_0_5(void) { + int i, x; + int *p = &test3_array6[0][5]; + + test3_func_0_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_5(); +} + +void +test3_func_10_4(void) { + int i, x; + int *p = &test3_array7[10][4]; + + test3_func_10_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_4(void) { + int i, x; + int *p = &test3_array6[9][4]; + + test3_func_9_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_4(); +} + +void +test3_func_8_4(void) { + int i, x; + int *p = &test3_array5[8][4]; + + test3_func_8_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_4(); +} + +void +test3_func_7_4(void) { + int i, x; + int *p = &test3_array4[7][4]; + + test3_func_7_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_4(); +} + +void +test3_func_6_4(void) { + int i, x; + int *p = &test3_array3[6][4]; + + test3_func_6_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_4(); +} + +void +test3_func_5_4(void) { + int i, x; + int *p = &test3_array2[5][4]; + + test3_func_5_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_4(); +} + +void +test3_func_4_4(void) { + int i, x; + int *p = &test3_array1[4][4]; + + test3_func_4_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_4(); +} + +void +test3_func_3_4(void) { + int i, x; + int *p = &test3_array8[3][4]; + + test3_func_3_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_4(); +} + +void +test3_func_2_4(void) { + int i, x; + int *p = &test3_array7[2][4]; + + test3_func_2_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_4(); +} + +void +test3_func_1_4(void) { + int i, x; + int *p = &test3_array6[1][4]; + + test3_func_1_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_4(); +} + +void +test3_func_0_4(void) { + int i, x; + int *p = &test3_array5[0][4]; + + test3_func_0_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_4(); +} + +void +test3_func_10_3(void) { + int i, x; + int *p = &test3_array6[10][3]; + + test3_func_10_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_3(void) { + int i, x; + int *p = &test3_array5[9][3]; + + test3_func_9_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_3(); +} + +void +test3_func_8_3(void) { + int i, x; + int *p = &test3_array4[8][3]; + + test3_func_8_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_3(); +} + +void +test3_func_7_3(void) { + int i, x; + int *p = &test3_array3[7][3]; + + test3_func_7_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_3(); +} + +void +test3_func_6_3(void) { + int i, x; + int *p = &test3_array2[6][3]; + + test3_func_6_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_3(); +} + +void +test3_func_5_3(void) { + int i, x; + int *p = &test3_array1[5][3]; + + test3_func_5_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_3(); +} + +void +test3_func_4_3(void) { + int i, x; + int *p = &test3_array8[4][3]; + + test3_func_4_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_3(); +} + +void +test3_func_3_3(void) { + int i, x; + int *p = &test3_array7[3][3]; + + test3_func_3_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_3(); +} + +void +test3_func_2_3(void) { + int i, x; + int *p = &test3_array6[2][3]; + + test3_func_2_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_3(); +} + +void +test3_func_1_3(void) { + int i, x; + int *p = &test3_array5[1][3]; + + test3_func_1_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_3(); +} + +void +test3_func_0_3(void) { + int i, x; + int *p = &test3_array4[0][3]; + + test3_func_0_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_3(); +} + +void +test3_func_10_2(void) { + int i, x; + int *p = &test3_array5[10][2]; + + test3_func_10_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_2(void) { + int i, x; + int *p = &test3_array4[9][2]; + + test3_func_9_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_2(); +} + +void +test3_func_8_2(void) { + int i, x; + int *p = &test3_array3[8][2]; + + test3_func_8_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_2(); +} + +void +test3_func_7_2(void) { + int i, x; + int *p = &test3_array2[7][2]; + + test3_func_7_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_2(); +} + +void +test3_func_6_2(void) { + int i, x; + int *p = &test3_array1[6][2]; + + test3_func_6_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_2(); +} + +void +test3_func_5_2(void) { + int i, x; + int *p = &test3_array8[5][2]; + + test3_func_5_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_2(); +} + +void +test3_func_4_2(void) { + int i, x; + int *p = &test3_array7[4][2]; + + test3_func_4_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_2(); +} + +void +test3_func_3_2(void) { + int i, x; + int *p = &test3_array6[3][2]; + + test3_func_3_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_2(); +} + +void +test3_func_2_2(void) { + int i, x; + int *p = &test3_array5[2][2]; + + test3_func_2_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_2(); +} + +void +test3_func_1_2(void) { + int i, x; + int *p = &test3_array4[1][2]; + + test3_func_1_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_2(); +} + +void +test3_func_0_2(void) { + int i, x; + int *p = &test3_array3[0][2]; + + test3_func_0_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_2(); +} + +void +test3_func_10_1(void) { + int i, x; + int *p = &test3_array4[10][1]; + + test3_func_10_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_1(void) { + int i, x; + int *p = &test3_array3[9][1]; + + test3_func_9_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_1(); +} + +void +test3_func_8_1(void) { + int i, x; + int *p = &test3_array2[8][1]; + + test3_func_8_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_1(); +} + +void +test3_func_7_1(void) { + int i, x; + int *p = &test3_array1[7][1]; + + test3_func_7_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_1(); +} + +void +test3_func_6_1(void) { + int i, x; + int *p = &test3_array8[6][1]; + + test3_func_6_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_1(); +} + +void +test3_func_5_1(void) { + int i, x; + int *p = &test3_array7[5][1]; + + test3_func_5_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_1(); +} + +void +test3_func_4_1(void) { + int i, x; + int *p = &test3_array6[4][1]; + + test3_func_4_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_1(); +} + +void +test3_func_3_1(void) { + int i, x; + int *p = &test3_array5[3][1]; + + test3_func_3_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_1(); +} + +void +test3_func_2_1(void) { + int i, x; + int *p = &test3_array4[2][1]; + + test3_func_2_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_1(); +} + +void +test3_func_1_1(void) { + int i, x; + int *p = &test3_array3[1][1]; + + test3_func_1_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_1(); +} + +void +test3_func_0_1(void) { + int i, x; + int *p = &test3_array2[0][1]; + + test3_func_0_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_1(); +} + +void +test3_func_10_0(void) { + int i, x; + int *p = &test3_array3[10][0]; + + test3_func_10_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +void +test3_func_9_0(void) { + int i, x; + int *p = &test3_array2[9][0]; + + test3_func_9_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_0(); +} + +void +test3_func_8_0(void) { + int i, x; + int *p = &test3_array1[8][0]; + + test3_func_8_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_0(); +} + +void +test3_func_7_0(void) { + int i, x; + int *p = &test3_array8[7][0]; + + test3_func_7_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_0(); +} + +void +test3_func_6_0(void) { + int i, x; + int *p = &test3_array7[6][0]; + + test3_func_6_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_0(); +} + +void +test3_func_5_0(void) { + int i, x; + int *p = &test3_array6[5][0]; + + test3_func_5_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_0(); +} + +void +test3_func_4_0(void) { + int i, x; + int *p = &test3_array5[4][0]; + + test3_func_4_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_0(); +} + +void +test3_func_3_0(void) { + int i, x; + int *p = &test3_array4[3][0]; + + test3_func_3_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_0(); +} + +void +test3_func_2_0(void) { + int i, x; + int *p = &test3_array3[2][0]; + + test3_func_2_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_0(); +} + +void +test3_func_1_0(void) { + int i, x; + int *p = &test3_array2[1][0]; + + test3_func_1_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_0(); +} + +void +test3_func_0_0(void) { + int i, x; + int *p = &test3_array1[0][0]; + + test3_func_0_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_0(); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +test3_main(void) { + test3_func_0_0(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main() { + test3_init(); + test3_main(); + + return (test3_return() - 1377313800 != 0); +} diff --git a/targets/wasm-tacle/test/test3/generated/modified_sources/inline/test3.c b/targets/wasm-tacle/test/test3/generated/modified_sources/inline/test3.c new file mode 100644 index 0000000..beefb17 --- /dev/null +++ b/targets/wasm-tacle/test/test3/generated/modified_sources/inline/test3.c @@ -0,0 +1,4841 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: test3 + + Author: Rathijit Sen + + Function: This testcase walks through parts of 8 arrays in a 10 x 10 grid of + functions. function f_i_j calls f_i_j+1 and f_i+1,j except at the grid + boundaries. + + Source: Universitaet des Saarlandes, Saarbruecken, Germany + Compiler Research Group + + Original name: test3 + + Changes: + 26-10-2007 Creation at Saarbruecken + + License: GPL + +*/ + +/* + Forward declaration of functions +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +__attribute__((always_inline)) static inline void test3_initSeed(); +__attribute__((always_inline)) static inline int test3_randomInteger(void); +__attribute__((always_inline)) static inline void test3_init(void); +__attribute__((always_inline)) static inline int test3_return(void); +__attribute__((always_inline)) static inline void test3_func_10_10(void); +__attribute__((always_inline)) static inline void test3_func_9_10(void); +__attribute__((always_inline)) static inline void test3_func_8_10(void); +__attribute__((always_inline)) static inline void test3_func_7_10(void); +__attribute__((always_inline)) static inline void test3_func_6_10(void); +__attribute__((always_inline)) static inline void test3_func_5_10(void); +__attribute__((always_inline)) static inline void test3_func_4_10(void); +__attribute__((always_inline)) static inline void test3_func_3_10(void); +__attribute__((always_inline)) static inline void test3_func_2_10(void); +__attribute__((always_inline)) static inline void test3_func_1_10(void); +__attribute__((always_inline)) static inline void test3_func_0_10(void); +__attribute__((always_inline)) static inline void test3_func_10_9(void); +__attribute__((always_inline)) static inline void test3_func_9_9(void); +__attribute__((always_inline)) static inline void test3_func_8_9(void); +__attribute__((always_inline)) static inline void test3_func_7_9(void); +__attribute__((always_inline)) static inline void test3_func_6_9(void); +__attribute__((always_inline)) static inline void test3_func_5_9(void); +__attribute__((always_inline)) static inline void test3_func_4_9(void); +__attribute__((always_inline)) static inline void test3_func_3_9(void); +__attribute__((always_inline)) static inline void test3_func_2_9(void); +__attribute__((always_inline)) static inline void test3_func_1_9(void); +__attribute__((always_inline)) static inline void test3_func_0_9(void); +__attribute__((always_inline)) static inline void test3_func_10_8(void); +__attribute__((always_inline)) static inline void test3_func_9_8(void); +__attribute__((always_inline)) static inline void test3_func_8_8(void); +__attribute__((always_inline)) static inline void test3_func_7_8(void); +__attribute__((always_inline)) static inline void test3_func_6_8(void); +__attribute__((always_inline)) static inline void test3_func_5_8(void); +__attribute__((always_inline)) static inline void test3_func_4_8(void); +__attribute__((always_inline)) static inline void test3_func_3_8(void); +__attribute__((always_inline)) static inline void test3_func_2_8(void); +__attribute__((always_inline)) static inline void test3_func_1_8(void); +__attribute__((always_inline)) static inline void test3_func_0_8(void); +__attribute__((always_inline)) static inline void test3_func_10_7(void); +__attribute__((always_inline)) static inline void test3_func_9_7(void); +__attribute__((always_inline)) static inline void test3_func_8_7(void); +__attribute__((always_inline)) static inline void test3_func_7_7(void); +__attribute__((always_inline)) static inline void test3_func_6_7(void); +__attribute__((always_inline)) static inline void test3_func_5_7(void); +__attribute__((always_inline)) static inline void test3_func_4_7(void); +__attribute__((always_inline)) static inline void test3_func_3_7(void); +__attribute__((always_inline)) static inline void test3_func_2_7(void); +__attribute__((always_inline)) static inline void test3_func_1_7(void); +__attribute__((always_inline)) static inline void test3_func_0_7(void); +__attribute__((always_inline)) static inline void test3_func_10_6(void); +__attribute__((always_inline)) static inline void test3_func_9_6(void); +__attribute__((always_inline)) static inline void test3_func_8_6(void); +__attribute__((always_inline)) static inline void test3_func_7_6(void); +__attribute__((always_inline)) static inline void test3_func_6_6(void); +__attribute__((always_inline)) static inline void test3_func_5_6(void); +__attribute__((always_inline)) static inline void test3_func_4_6(void); +__attribute__((always_inline)) static inline void test3_func_3_6(void); +__attribute__((always_inline)) static inline void test3_func_2_6(void); +__attribute__((always_inline)) static inline void test3_func_1_6(void); +__attribute__((always_inline)) static inline void test3_func_0_6(void); +__attribute__((always_inline)) static inline void test3_func_10_5(void); +__attribute__((always_inline)) static inline void test3_func_9_5(void); +__attribute__((always_inline)) static inline void test3_func_8_5(void); +__attribute__((always_inline)) static inline void test3_func_7_5(void); +__attribute__((always_inline)) static inline void test3_func_6_5(void); +__attribute__((always_inline)) static inline void test3_func_5_5(void); +__attribute__((always_inline)) static inline void test3_func_4_5(void); +__attribute__((always_inline)) static inline void test3_func_3_5(void); +__attribute__((always_inline)) static inline void test3_func_2_5(void); +__attribute__((always_inline)) static inline void test3_func_1_5(void); +__attribute__((always_inline)) static inline void test3_func_0_5(void); +__attribute__((always_inline)) static inline void test3_func_10_4(void); +__attribute__((always_inline)) static inline void test3_func_9_4(void); +__attribute__((always_inline)) static inline void test3_func_8_4(void); +__attribute__((always_inline)) static inline void test3_func_7_4(void); +__attribute__((always_inline)) static inline void test3_func_6_4(void); +__attribute__((always_inline)) static inline void test3_func_5_4(void); +__attribute__((always_inline)) static inline void test3_func_4_4(void); +__attribute__((always_inline)) static inline void test3_func_3_4(void); +__attribute__((always_inline)) static inline void test3_func_2_4(void); +__attribute__((always_inline)) static inline void test3_func_1_4(void); +__attribute__((always_inline)) static inline void test3_func_0_4(void); +__attribute__((always_inline)) static inline void test3_func_10_3(void); +__attribute__((always_inline)) static inline void test3_func_9_3(void); +__attribute__((always_inline)) static inline void test3_func_8_3(void); +__attribute__((always_inline)) static inline void test3_func_7_3(void); +__attribute__((always_inline)) static inline void test3_func_6_3(void); +__attribute__((always_inline)) static inline void test3_func_5_3(void); +__attribute__((always_inline)) static inline void test3_func_4_3(void); +__attribute__((always_inline)) static inline void test3_func_3_3(void); +__attribute__((always_inline)) static inline void test3_func_2_3(void); +__attribute__((always_inline)) static inline void test3_func_1_3(void); +__attribute__((always_inline)) static inline void test3_func_0_3(void); +__attribute__((always_inline)) static inline void test3_func_10_2(void); +__attribute__((always_inline)) static inline void test3_func_9_2(void); +__attribute__((always_inline)) static inline void test3_func_8_2(void); +__attribute__((always_inline)) static inline void test3_func_7_2(void); +__attribute__((always_inline)) static inline void test3_func_6_2(void); +__attribute__((always_inline)) static inline void test3_func_5_2(void); +__attribute__((always_inline)) static inline void test3_func_4_2(void); +__attribute__((always_inline)) static inline void test3_func_3_2(void); +__attribute__((always_inline)) static inline void test3_func_2_2(void); +__attribute__((always_inline)) static inline void test3_func_1_2(void); +__attribute__((always_inline)) static inline void test3_func_0_2(void); +__attribute__((always_inline)) static inline void test3_func_10_1(void); +__attribute__((always_inline)) static inline void test3_func_9_1(void); +__attribute__((always_inline)) static inline void test3_func_8_1(void); +__attribute__((always_inline)) static inline void test3_func_7_1(void); +__attribute__((always_inline)) static inline void test3_func_6_1(void); +__attribute__((always_inline)) static inline void test3_func_5_1(void); +__attribute__((always_inline)) static inline void test3_func_4_1(void); +__attribute__((always_inline)) static inline void test3_func_3_1(void); +__attribute__((always_inline)) static inline void test3_func_2_1(void); +__attribute__((always_inline)) static inline void test3_func_1_1(void); +__attribute__((always_inline)) static inline void test3_func_0_1(void); +__attribute__((always_inline)) static inline void test3_func_10_0(void); +__attribute__((always_inline)) static inline void test3_func_9_0(void); +__attribute__((always_inline)) static inline void test3_func_8_0(void); +__attribute__((always_inline)) static inline void test3_func_7_0(void); +__attribute__((always_inline)) static inline void test3_func_6_0(void); +__attribute__((always_inline)) static inline void test3_func_5_0(void); +__attribute__((always_inline)) static inline void test3_func_4_0(void); +__attribute__((always_inline)) static inline void test3_func_3_0(void); +__attribute__((always_inline)) static inline void test3_func_2_0(void); +__attribute__((always_inline)) static inline void test3_func_1_0(void); +__attribute__((always_inline)) static inline void test3_func_0_0(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +test3_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +volatile int test3_seed; +int test3_array1[32][32]; +int test3_array2[32][32]; +int test3_array3[32][32]; +int test3_array4[32][32]; +int test3_array5[32][32]; +int test3_array6[32][32]; +int test3_array7[32][32]; +int test3_array8[32][32]; +int test3_result; + +/* + Initialization- and return-value-related functions +*/ + +/* + test3_initSeed initializes the seed used in the "random" number generator. +*/ +__attribute__((always_inline)) static inline void +test3_initSeed() { + test3_seed = 0; +} + +/* + test3_RandomInteger generates random integers between 0 and 8094. +*/ +__attribute__((always_inline)) static inline int +test3_randomInteger() { + test3_seed = ((test3_seed * 133) + 81) % 8095; + return (test3_seed); +} + +__attribute__((always_inline)) static inline void +test3_init(void) { + int i, j; + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array1[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array2[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array3[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array4[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array5[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array6[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array7[i][j] = test3_randomInteger(); + + __pragma_loopbound(32, 32); + for (i = 0; i < 32; i++) + __pragma_loopbound(32, 32); + for (j = 0; j < 32; j++) + test3_array8[i][j] = test3_randomInteger(); + + test3_result = 0; +} + +__attribute__((always_inline)) static inline int +test3_return(void) { + return (test3_result); +} + +/* + Algorithm core functions +*/ + +__attribute__((always_inline)) static inline void +test3_func_10_10(void) { + int i, x; + int *p = &test3_array5[10][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_10(void) { + int i, x; + int *p = &test3_array4[9][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_10(void) { + int i, x; + int *p = &test3_array3[8][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_10(void) { + int i, x; + int *p = &test3_array2[7][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_10(void) { + int i, x; + int *p = &test3_array1[6][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_10(void) { + int i, x; + int *p = &test3_array8[5][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_10(void) { + int i, x; + int *p = &test3_array7[4][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_10(void) { + int i, x; + int *p = &test3_array6[3][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_10(void) { + int i, x; + int *p = &test3_array5[2][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_10(void) { + int i, x; + int *p = &test3_array4[1][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_10(void) { + int i, x; + int *p = &test3_array3[0][10]; + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_10(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_9(void) { + int i, x; + int *p = &test3_array4[10][9]; + + test3_func_10_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_9(void) { + int i, x; + int *p = &test3_array3[9][9]; + + test3_func_9_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_9(void) { + int i, x; + int *p = &test3_array2[8][9]; + + test3_func_8_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_9(void) { + int i, x; + int *p = &test3_array1[7][9]; + + test3_func_7_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_9(void) { + int i, x; + int *p = &test3_array8[6][9]; + + test3_func_6_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_9(void) { + int i, x; + int *p = &test3_array7[5][9]; + + test3_func_5_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_9(void) { + int i, x; + int *p = &test3_array6[4][9]; + + test3_func_4_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_9(void) { + int i, x; + int *p = &test3_array5[3][9]; + + test3_func_3_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_9(void) { + int i, x; + int *p = &test3_array4[2][9]; + + test3_func_2_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_9(void) { + int i, x; + int *p = &test3_array3[1][9]; + + test3_func_1_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_9(void) { + int i, x; + int *p = &test3_array2[0][9]; + + test3_func_0_10(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_9(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_8(void) { + int i, x; + int *p = &test3_array3[10][8]; + + test3_func_10_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_8(void) { + int i, x; + int *p = &test3_array2[9][8]; + + test3_func_9_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_8(void) { + int i, x; + int *p = &test3_array1[8][8]; + + test3_func_8_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_8(void) { + int i, x; + int *p = &test3_array8[7][8]; + + test3_func_7_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_8(void) { + int i, x; + int *p = &test3_array7[6][8]; + + test3_func_6_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_8(void) { + int i, x; + int *p = &test3_array6[5][8]; + + test3_func_5_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_8(void) { + int i, x; + int *p = &test3_array5[4][8]; + + test3_func_4_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_8(void) { + int i, x; + int *p = &test3_array4[3][8]; + + test3_func_3_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_8(void) { + int i, x; + int *p = &test3_array3[2][8]; + + test3_func_2_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_8(void) { + int i, x; + int *p = &test3_array2[1][8]; + + test3_func_1_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_8(void) { + int i, x; + int *p = &test3_array1[0][8]; + + test3_func_0_9(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_8(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_7(void) { + int i, x; + int *p = &test3_array2[10][7]; + + test3_func_10_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_7(void) { + int i, x; + int *p = &test3_array1[9][7]; + + test3_func_9_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_7(void) { + int i, x; + int *p = &test3_array8[8][7]; + + test3_func_8_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_7(void) { + int i, x; + int *p = &test3_array7[7][7]; + + test3_func_7_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_7(void) { + int i, x; + int *p = &test3_array6[6][7]; + + test3_func_6_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_7(void) { + int i, x; + int *p = &test3_array5[5][7]; + + test3_func_5_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_7(void) { + int i, x; + int *p = &test3_array4[4][7]; + + test3_func_4_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_7(void) { + int i, x; + int *p = &test3_array3[3][7]; + + test3_func_3_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_7(void) { + int i, x; + int *p = &test3_array2[2][7]; + + test3_func_2_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_7(void) { + int i, x; + int *p = &test3_array1[1][7]; + + test3_func_1_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_7(void) { + int i, x; + int *p = &test3_array8[0][7]; + + test3_func_0_8(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_7(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_6(void) { + int i, x; + int *p = &test3_array1[10][6]; + + test3_func_10_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_6(void) { + int i, x; + int *p = &test3_array8[9][6]; + + test3_func_9_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_6(void) { + int i, x; + int *p = &test3_array7[8][6]; + + test3_func_8_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_6(void) { + int i, x; + int *p = &test3_array6[7][6]; + + test3_func_7_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_6(void) { + int i, x; + int *p = &test3_array5[6][6]; + + test3_func_6_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_6(void) { + int i, x; + int *p = &test3_array4[5][6]; + + test3_func_5_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_6(void) { + int i, x; + int *p = &test3_array3[4][6]; + + test3_func_4_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_6(void) { + int i, x; + int *p = &test3_array2[3][6]; + + test3_func_3_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_6(void) { + int i, x; + int *p = &test3_array1[2][6]; + + test3_func_2_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_6(void) { + int i, x; + int *p = &test3_array8[1][6]; + + test3_func_1_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_6(void) { + int i, x; + int *p = &test3_array7[0][6]; + + test3_func_0_7(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_6(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_5(void) { + int i, x; + int *p = &test3_array8[10][5]; + + test3_func_10_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_5(void) { + int i, x; + int *p = &test3_array7[9][5]; + + test3_func_9_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_5(void) { + int i, x; + int *p = &test3_array6[8][5]; + + test3_func_8_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_5(void) { + int i, x; + int *p = &test3_array5[7][5]; + + test3_func_7_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_5(void) { + int i, x; + int *p = &test3_array4[6][5]; + + test3_func_6_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_5(void) { + int i, x; + int *p = &test3_array3[5][5]; + + test3_func_5_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_5(void) { + int i, x; + int *p = &test3_array2[4][5]; + + test3_func_4_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_5(void) { + int i, x; + int *p = &test3_array1[3][5]; + + test3_func_3_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_5(void) { + int i, x; + int *p = &test3_array8[2][5]; + + test3_func_2_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_5(void) { + int i, x; + int *p = &test3_array7[1][5]; + + test3_func_1_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_5(void) { + int i, x; + int *p = &test3_array6[0][5]; + + test3_func_0_6(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_5(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_4(void) { + int i, x; + int *p = &test3_array7[10][4]; + + test3_func_10_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_4(void) { + int i, x; + int *p = &test3_array6[9][4]; + + test3_func_9_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_4(void) { + int i, x; + int *p = &test3_array5[8][4]; + + test3_func_8_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_4(void) { + int i, x; + int *p = &test3_array4[7][4]; + + test3_func_7_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_4(void) { + int i, x; + int *p = &test3_array3[6][4]; + + test3_func_6_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_4(void) { + int i, x; + int *p = &test3_array2[5][4]; + + test3_func_5_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_4(void) { + int i, x; + int *p = &test3_array1[4][4]; + + test3_func_4_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_4(void) { + int i, x; + int *p = &test3_array8[3][4]; + + test3_func_3_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_4(void) { + int i, x; + int *p = &test3_array7[2][4]; + + test3_func_2_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_4(void) { + int i, x; + int *p = &test3_array6[1][4]; + + test3_func_1_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_4(void) { + int i, x; + int *p = &test3_array5[0][4]; + + test3_func_0_5(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_4(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_3(void) { + int i, x; + int *p = &test3_array6[10][3]; + + test3_func_10_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_3(void) { + int i, x; + int *p = &test3_array5[9][3]; + + test3_func_9_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_3(void) { + int i, x; + int *p = &test3_array4[8][3]; + + test3_func_8_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_3(void) { + int i, x; + int *p = &test3_array3[7][3]; + + test3_func_7_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_3(void) { + int i, x; + int *p = &test3_array2[6][3]; + + test3_func_6_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_3(void) { + int i, x; + int *p = &test3_array1[5][3]; + + test3_func_5_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_3(void) { + int i, x; + int *p = &test3_array8[4][3]; + + test3_func_4_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_3(void) { + int i, x; + int *p = &test3_array7[3][3]; + + test3_func_3_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_3(void) { + int i, x; + int *p = &test3_array6[2][3]; + + test3_func_2_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_3(void) { + int i, x; + int *p = &test3_array5[1][3]; + + test3_func_1_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_3(void) { + int i, x; + int *p = &test3_array4[0][3]; + + test3_func_0_4(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_3(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_2(void) { + int i, x; + int *p = &test3_array5[10][2]; + + test3_func_10_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_2(void) { + int i, x; + int *p = &test3_array4[9][2]; + + test3_func_9_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_2(void) { + int i, x; + int *p = &test3_array3[8][2]; + + test3_func_8_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_2(void) { + int i, x; + int *p = &test3_array2[7][2]; + + test3_func_7_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_2(void) { + int i, x; + int *p = &test3_array1[6][2]; + + test3_func_6_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_2(void) { + int i, x; + int *p = &test3_array8[5][2]; + + test3_func_5_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_2(void) { + int i, x; + int *p = &test3_array7[4][2]; + + test3_func_4_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_2(void) { + int i, x; + int *p = &test3_array6[3][2]; + + test3_func_3_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_2(void) { + int i, x; + int *p = &test3_array5[2][2]; + + test3_func_2_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_2(void) { + int i, x; + int *p = &test3_array4[1][2]; + + test3_func_1_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_2(void) { + int i, x; + int *p = &test3_array3[0][2]; + + test3_func_0_3(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_2(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_1(void) { + int i, x; + int *p = &test3_array4[10][1]; + + test3_func_10_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_1(void) { + int i, x; + int *p = &test3_array3[9][1]; + + test3_func_9_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_1(void) { + int i, x; + int *p = &test3_array2[8][1]; + + test3_func_8_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_1(void) { + int i, x; + int *p = &test3_array1[7][1]; + + test3_func_7_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_1(void) { + int i, x; + int *p = &test3_array8[6][1]; + + test3_func_6_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_1(void) { + int i, x; + int *p = &test3_array7[5][1]; + + test3_func_5_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_1(void) { + int i, x; + int *p = &test3_array6[4][1]; + + test3_func_4_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_1(void) { + int i, x; + int *p = &test3_array5[3][1]; + + test3_func_3_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_1(void) { + int i, x; + int *p = &test3_array4[2][1]; + + test3_func_2_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_1(void) { + int i, x; + int *p = &test3_array3[1][1]; + + test3_func_1_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_1(void) { + int i, x; + int *p = &test3_array2[0][1]; + + test3_func_0_2(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_1(); +} + +__attribute__((always_inline)) static inline void +test3_func_10_0(void) { + int i, x; + int *p = &test3_array3[10][0]; + + test3_func_10_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + +__attribute__((always_inline)) static inline void +test3_func_9_0(void) { + int i, x; + int *p = &test3_array2[9][0]; + + test3_func_9_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_8_0(void) { + int i, x; + int *p = &test3_array1[8][0]; + + test3_func_8_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_7_0(void) { + int i, x; + int *p = &test3_array8[7][0]; + + test3_func_7_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_6_0(void) { + int i, x; + int *p = &test3_array7[6][0]; + + test3_func_6_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_5_0(void) { + int i, x; + int *p = &test3_array6[5][0]; + + test3_func_5_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_4_0(void) { + int i, x; + int *p = &test3_array5[4][0]; + + test3_func_4_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_3_0(void) { + int i, x; + int *p = &test3_array4[3][0]; + + test3_func_3_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_2_0(void) { + int i, x; + int *p = &test3_array3[2][0]; + + test3_func_2_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_1_0(void) { + int i, x; + int *p = &test3_array2[1][0]; + + test3_func_1_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_0(); +} + +__attribute__((always_inline)) static inline void +test3_func_0_0(void) { + int i, x; + int *p = &test3_array1[0][0]; + + test3_func_0_1(); + + __pragma_loopbound(4, 4); + for (i = 0, x = 8; i < 4; i++, x >>= 1) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_0(); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +test3_main(void) { + test3_func_0_0(); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main() { + test3_init(); + test3_main(); + + return (test3_return() - 1377313800 != 0); +} diff --git a/targets/wasm-tacle/test/test3/test3.c b/targets/wasm-tacle/test/test3/test3.c new file mode 100755 index 0000000..0235738 --- /dev/null +++ b/targets/wasm-tacle/test/test3/test3.c @@ -0,0 +1,5078 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: test3 + + Author: Rathijit Sen + + Function: This testcase walks through parts of 8 arrays in a 10 x 10 grid of + functions. function f_i_j calls f_i_j+1 and f_i+1,j except at the grid + boundaries. + + Source: Universitaet des Saarlandes, Saarbruecken, Germany + Compiler Research Group + + Original name: test3 + + Changes: + 26-10-2007 Creation at Saarbruecken + + License: GPL + +*/ + + +/* + Forward declaration of functions +*/ + +void test3_initSeed(); +int test3_randomInteger( void ); +void test3_init( void ); +int test3_return( void ); +void test3_func_10_10( void ); +void test3_func_9_10( void ); +void test3_func_8_10( void ); +void test3_func_7_10( void ); +void test3_func_6_10( void ); +void test3_func_5_10( void ); +void test3_func_4_10( void ); +void test3_func_3_10( void ); +void test3_func_2_10( void ); +void test3_func_1_10( void ); +void test3_func_0_10( void ); +void test3_func_10_9( void ); +void test3_func_9_9( void ); +void test3_func_8_9( void ); +void test3_func_7_9( void ); +void test3_func_6_9( void ); +void test3_func_5_9( void ); +void test3_func_4_9( void ); +void test3_func_3_9( void ); +void test3_func_2_9( void ); +void test3_func_1_9( void ); +void test3_func_0_9( void ); +void test3_func_10_8( void ); +void test3_func_9_8( void ); +void test3_func_8_8( void ); +void test3_func_7_8( void ); +void test3_func_6_8( void ); +void test3_func_5_8( void ); +void test3_func_4_8( void ); +void test3_func_3_8( void ); +void test3_func_2_8( void ); +void test3_func_1_8( void ); +void test3_func_0_8( void ); +void test3_func_10_7( void ); +void test3_func_9_7( void ); +void test3_func_8_7( void ); +void test3_func_7_7( void ); +void test3_func_6_7( void ); +void test3_func_5_7( void ); +void test3_func_4_7( void ); +void test3_func_3_7( void ); +void test3_func_2_7( void ); +void test3_func_1_7( void ); +void test3_func_0_7( void ); +void test3_func_10_6( void ); +void test3_func_9_6( void ); +void test3_func_8_6( void ); +void test3_func_7_6( void ); +void test3_func_6_6( void ); +void test3_func_5_6( void ); +void test3_func_4_6( void ); +void test3_func_3_6( void ); +void test3_func_2_6( void ); +void test3_func_1_6( void ); +void test3_func_0_6( void ); +void test3_func_10_5( void ); +void test3_func_9_5( void ); +void test3_func_8_5( void ); +void test3_func_7_5( void ); +void test3_func_6_5( void ); +void test3_func_5_5( void ); +void test3_func_4_5( void ); +void test3_func_3_5( void ); +void test3_func_2_5( void ); +void test3_func_1_5( void ); +void test3_func_0_5( void ); +void test3_func_10_4( void ); +void test3_func_9_4( void ); +void test3_func_8_4( void ); +void test3_func_7_4( void ); +void test3_func_6_4( void ); +void test3_func_5_4( void ); +void test3_func_4_4( void ); +void test3_func_3_4( void ); +void test3_func_2_4( void ); +void test3_func_1_4( void ); +void test3_func_0_4( void ); +void test3_func_10_3( void ); +void test3_func_9_3( void ); +void test3_func_8_3( void ); +void test3_func_7_3( void ); +void test3_func_6_3( void ); +void test3_func_5_3( void ); +void test3_func_4_3( void ); +void test3_func_3_3( void ); +void test3_func_2_3( void ); +void test3_func_1_3( void ); +void test3_func_0_3( void ); +void test3_func_10_2( void ); +void test3_func_9_2( void ); +void test3_func_8_2( void ); +void test3_func_7_2( void ); +void test3_func_6_2( void ); +void test3_func_5_2( void ); +void test3_func_4_2( void ); +void test3_func_3_2( void ); +void test3_func_2_2( void ); +void test3_func_1_2( void ); +void test3_func_0_2( void ); +void test3_func_10_1( void ); +void test3_func_9_1( void ); +void test3_func_8_1( void ); +void test3_func_7_1( void ); +void test3_func_6_1( void ); +void test3_func_5_1( void ); +void test3_func_4_1( void ); +void test3_func_3_1( void ); +void test3_func_2_1( void ); +void test3_func_1_1( void ); +void test3_func_0_1( void ); +void test3_func_10_0( void ); +void test3_func_9_0( void ); +void test3_func_8_0( void ); +void test3_func_7_0( void ); +void test3_func_6_0( void ); +void test3_func_5_0( void ); +void test3_func_4_0( void ); +void test3_func_3_0( void ); +void test3_func_2_0( void ); +void test3_func_1_0( void ); +void test3_func_0_0( void ); +void test3_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +volatile int test3_seed; +int test3_array1[ 32 ][ 32 ]; +int test3_array2[ 32 ][ 32 ]; +int test3_array3[ 32 ][ 32 ]; +int test3_array4[ 32 ][ 32 ]; +int test3_array5[ 32 ][ 32 ]; +int test3_array6[ 32 ][ 32 ]; +int test3_array7[ 32 ][ 32 ]; +int test3_array8[ 32 ][ 32 ]; +int test3_result; + + +/* + Initialization- and return-value-related functions +*/ + +/* + test3_initSeed initializes the seed used in the "random" number generator. +*/ +void test3_initSeed() +{ + test3_seed = 0; +} + + +/* + test3_RandomInteger generates random integers between 0 and 8094. +*/ +int test3_randomInteger() +{ + test3_seed = ( ( test3_seed * 133 ) + 81 ) % 8095; + return ( test3_seed ); +} + + +void test3_init( void ) +{ + int i, j; + + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array1[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array2[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array3[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array4[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array5[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array6[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array7[ i ][ j ] = test3_randomInteger(); + + _Pragma( "loopbound min 32 max 32" ) + for ( i = 0; i < 32; i++ ) + _Pragma( "loopbound min 32 max 32" ) + for ( j = 0; j < 32; j++ ) + test3_array8[ i ][ j ] = test3_randomInteger(); + + test3_result = 0; +} + + +int test3_return( void ) +{ + return ( test3_result ); +} + + +/* + Algorithm core functions +*/ + +void test3_func_10_10( void ) +{ + int i, x; + int *p = &test3_array5[ 10 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_10( void ) +{ + int i, x; + int *p = &test3_array4[ 9 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_10(); +} + + +void test3_func_8_10( void ) +{ + int i, x; + int *p = &test3_array3[ 8 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_10(); +} + + +void test3_func_7_10( void ) +{ + int i, x; + int *p = &test3_array2[ 7 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_10(); +} + + +void test3_func_6_10( void ) +{ + int i, x; + int *p = &test3_array1[ 6 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_10(); +} + + +void test3_func_5_10( void ) +{ + int i, x; + int *p = &test3_array8[ 5 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_10(); +} + + +void test3_func_4_10( void ) +{ + int i, x; + int *p = &test3_array7[ 4 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_10(); +} + + +void test3_func_3_10( void ) +{ + int i, x; + int *p = &test3_array6[ 3 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_10(); +} + + +void test3_func_2_10( void ) +{ + int i, x; + int *p = &test3_array5[ 2 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_10(); +} + + +void test3_func_1_10( void ) +{ + int i, x; + int *p = &test3_array4[ 1 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_10(); +} + + +void test3_func_0_10( void ) +{ + int i, x; + int *p = &test3_array3[ 0 ][ 10 ]; + + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_10(); +} + + +void test3_func_10_9( void ) +{ + int i, x; + int *p = &test3_array4[ 10 ][ 9 ]; + + + test3_func_10_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_9( void ) +{ + int i, x; + int *p = &test3_array3[ 9 ][ 9 ]; + + + test3_func_9_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_9(); +} + + +void test3_func_8_9( void ) +{ + int i, x; + int *p = &test3_array2[ 8 ][ 9 ]; + + + test3_func_8_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_9(); +} + + +void test3_func_7_9( void ) +{ + int i, x; + int *p = &test3_array1[ 7 ][ 9 ]; + + + test3_func_7_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_9(); +} + + +void test3_func_6_9( void ) +{ + int i, x; + int *p = &test3_array8[ 6 ][ 9 ]; + + + test3_func_6_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_9(); +} + + +void test3_func_5_9( void ) +{ + int i, x; + int *p = &test3_array7[ 5 ][ 9 ]; + + + test3_func_5_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_9(); +} + + +void test3_func_4_9( void ) +{ + int i, x; + int *p = &test3_array6[ 4 ][ 9 ]; + + + test3_func_4_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_9(); +} + + +void test3_func_3_9( void ) +{ + int i, x; + int *p = &test3_array5[ 3 ][ 9 ]; + + + test3_func_3_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_9(); +} + + +void test3_func_2_9( void ) +{ + int i, x; + int *p = &test3_array4[ 2 ][ 9 ]; + + + test3_func_2_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_9(); +} + + +void test3_func_1_9( void ) +{ + int i, x; + int *p = &test3_array3[ 1 ][ 9 ]; + + + test3_func_1_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_9(); +} + + +void test3_func_0_9( void ) +{ + int i, x; + int *p = &test3_array2[ 0 ][ 9 ]; + + + test3_func_0_10(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_9(); +} + + +void test3_func_10_8( void ) +{ + int i, x; + int *p = &test3_array3[ 10 ][ 8 ]; + + + test3_func_10_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_8( void ) +{ + int i, x; + int *p = &test3_array2[ 9 ][ 8 ]; + + + test3_func_9_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_8(); +} + + +void test3_func_8_8( void ) +{ + int i, x; + int *p = &test3_array1[ 8 ][ 8 ]; + + + test3_func_8_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_8(); +} + + +void test3_func_7_8( void ) +{ + int i, x; + int *p = &test3_array8[ 7 ][ 8 ]; + + + test3_func_7_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_8(); +} + + +void test3_func_6_8( void ) +{ + int i, x; + int *p = &test3_array7[ 6 ][ 8 ]; + + + test3_func_6_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_8(); +} + + +void test3_func_5_8( void ) +{ + int i, x; + int *p = &test3_array6[ 5 ][ 8 ]; + + + test3_func_5_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_8(); +} + + +void test3_func_4_8( void ) +{ + int i, x; + int *p = &test3_array5[ 4 ][ 8 ]; + + + test3_func_4_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_8(); +} + + +void test3_func_3_8( void ) +{ + int i, x; + int *p = &test3_array4[ 3 ][ 8 ]; + + + test3_func_3_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_8(); +} + + +void test3_func_2_8( void ) +{ + int i, x; + int *p = &test3_array3[ 2 ][ 8 ]; + + + test3_func_2_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_8(); +} + + +void test3_func_1_8( void ) +{ + int i, x; + int *p = &test3_array2[ 1 ][ 8 ]; + + + test3_func_1_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_8(); +} + + +void test3_func_0_8( void ) +{ + int i, x; + int *p = &test3_array1[ 0 ][ 8 ]; + + + test3_func_0_9(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_8(); +} + + +void test3_func_10_7( void ) +{ + int i, x; + int *p = &test3_array2[ 10 ][ 7 ]; + + + test3_func_10_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_7( void ) +{ + int i, x; + int *p = &test3_array1[ 9 ][ 7 ]; + + + test3_func_9_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_7(); +} + + +void test3_func_8_7( void ) +{ + int i, x; + int *p = &test3_array8[ 8 ][ 7 ]; + + + test3_func_8_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_7(); +} + + +void test3_func_7_7( void ) +{ + int i, x; + int *p = &test3_array7[ 7 ][ 7 ]; + + + test3_func_7_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_7(); +} + + +void test3_func_6_7( void ) +{ + int i, x; + int *p = &test3_array6[ 6 ][ 7 ]; + + + test3_func_6_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_7(); +} + + +void test3_func_5_7( void ) +{ + int i, x; + int *p = &test3_array5[ 5 ][ 7 ]; + + + test3_func_5_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_7(); +} + + +void test3_func_4_7( void ) +{ + int i, x; + int *p = &test3_array4[ 4 ][ 7 ]; + + + test3_func_4_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_7(); +} + + +void test3_func_3_7( void ) +{ + int i, x; + int *p = &test3_array3[ 3 ][ 7 ]; + + + test3_func_3_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_7(); +} + + +void test3_func_2_7( void ) +{ + int i, x; + int *p = &test3_array2[ 2 ][ 7 ]; + + + test3_func_2_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_7(); +} + + +void test3_func_1_7( void ) +{ + int i, x; + int *p = &test3_array1[ 1 ][ 7 ]; + + + test3_func_1_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_7(); +} + + +void test3_func_0_7( void ) +{ + int i, x; + int *p = &test3_array8[ 0 ][ 7 ]; + + + test3_func_0_8(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_7(); +} + + +void test3_func_10_6( void ) +{ + int i, x; + int *p = &test3_array1[ 10 ][ 6 ]; + + + test3_func_10_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_6( void ) +{ + int i, x; + int *p = &test3_array8[ 9 ][ 6 ]; + + + test3_func_9_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_6(); +} + + +void test3_func_8_6( void ) +{ + int i, x; + int *p = &test3_array7[ 8 ][ 6 ]; + + + test3_func_8_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_6(); +} + + +void test3_func_7_6( void ) +{ + int i, x; + int *p = &test3_array6[ 7 ][ 6 ]; + + + test3_func_7_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_6(); +} + + +void test3_func_6_6( void ) +{ + int i, x; + int *p = &test3_array5[ 6 ][ 6 ]; + + + test3_func_6_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_6(); +} + + +void test3_func_5_6( void ) +{ + int i, x; + int *p = &test3_array4[ 5 ][ 6 ]; + + + test3_func_5_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_6(); +} + + +void test3_func_4_6( void ) +{ + int i, x; + int *p = &test3_array3[ 4 ][ 6 ]; + + + test3_func_4_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_6(); +} + + +void test3_func_3_6( void ) +{ + int i, x; + int *p = &test3_array2[ 3 ][ 6 ]; + + + test3_func_3_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_6(); +} + + +void test3_func_2_6( void ) +{ + int i, x; + int *p = &test3_array1[ 2 ][ 6 ]; + + + test3_func_2_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_6(); +} + + +void test3_func_1_6( void ) +{ + int i, x; + int *p = &test3_array8[ 1 ][ 6 ]; + + + test3_func_1_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_6(); +} + + +void test3_func_0_6( void ) +{ + int i, x; + int *p = &test3_array7[ 0 ][ 6 ]; + + + test3_func_0_7(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_6(); +} + + +void test3_func_10_5( void ) +{ + int i, x; + int *p = &test3_array8[ 10 ][ 5 ]; + + + test3_func_10_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_5( void ) +{ + int i, x; + int *p = &test3_array7[ 9 ][ 5 ]; + + + test3_func_9_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_5(); +} + + +void test3_func_8_5( void ) +{ + int i, x; + int *p = &test3_array6[ 8 ][ 5 ]; + + + test3_func_8_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_5(); +} + + +void test3_func_7_5( void ) +{ + int i, x; + int *p = &test3_array5[ 7 ][ 5 ]; + + + test3_func_7_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_5(); +} + + +void test3_func_6_5( void ) +{ + int i, x; + int *p = &test3_array4[ 6 ][ 5 ]; + + + test3_func_6_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_5(); +} + + +void test3_func_5_5( void ) +{ + int i, x; + int *p = &test3_array3[ 5 ][ 5 ]; + + + test3_func_5_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_5(); +} + + +void test3_func_4_5( void ) +{ + int i, x; + int *p = &test3_array2[ 4 ][ 5 ]; + + + test3_func_4_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_5(); +} + + +void test3_func_3_5( void ) +{ + int i, x; + int *p = &test3_array1[ 3 ][ 5 ]; + + + test3_func_3_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_5(); +} + + +void test3_func_2_5( void ) +{ + int i, x; + int *p = &test3_array8[ 2 ][ 5 ]; + + + test3_func_2_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_5(); +} + + +void test3_func_1_5( void ) +{ + int i, x; + int *p = &test3_array7[ 1 ][ 5 ]; + + + test3_func_1_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_5(); +} + + +void test3_func_0_5( void ) +{ + int i, x; + int *p = &test3_array6[ 0 ][ 5 ]; + + + test3_func_0_6(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_5(); +} + + +void test3_func_10_4( void ) +{ + int i, x; + int *p = &test3_array7[ 10 ][ 4 ]; + + + test3_func_10_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_4( void ) +{ + int i, x; + int *p = &test3_array6[ 9 ][ 4 ]; + + + test3_func_9_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_4(); +} + + +void test3_func_8_4( void ) +{ + int i, x; + int *p = &test3_array5[ 8 ][ 4 ]; + + + test3_func_8_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_4(); +} + + +void test3_func_7_4( void ) +{ + int i, x; + int *p = &test3_array4[ 7 ][ 4 ]; + + + test3_func_7_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_4(); +} + + +void test3_func_6_4( void ) +{ + int i, x; + int *p = &test3_array3[ 6 ][ 4 ]; + + + test3_func_6_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_4(); +} + + +void test3_func_5_4( void ) +{ + int i, x; + int *p = &test3_array2[ 5 ][ 4 ]; + + + test3_func_5_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_4(); +} + + +void test3_func_4_4( void ) +{ + int i, x; + int *p = &test3_array1[ 4 ][ 4 ]; + + + test3_func_4_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_4(); +} + + +void test3_func_3_4( void ) +{ + int i, x; + int *p = &test3_array8[ 3 ][ 4 ]; + + + test3_func_3_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_4(); +} + + +void test3_func_2_4( void ) +{ + int i, x; + int *p = &test3_array7[ 2 ][ 4 ]; + + + test3_func_2_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_4(); +} + + +void test3_func_1_4( void ) +{ + int i, x; + int *p = &test3_array6[ 1 ][ 4 ]; + + + test3_func_1_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_4(); +} + + +void test3_func_0_4( void ) +{ + int i, x; + int *p = &test3_array5[ 0 ][ 4 ]; + + + test3_func_0_5(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_4(); +} + + +void test3_func_10_3( void ) +{ + int i, x; + int *p = &test3_array6[ 10 ][ 3 ]; + + + test3_func_10_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_3( void ) +{ + int i, x; + int *p = &test3_array5[ 9 ][ 3 ]; + + + test3_func_9_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_3(); +} + + +void test3_func_8_3( void ) +{ + int i, x; + int *p = &test3_array4[ 8 ][ 3 ]; + + + test3_func_8_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_3(); +} + + +void test3_func_7_3( void ) +{ + int i, x; + int *p = &test3_array3[ 7 ][ 3 ]; + + + test3_func_7_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_3(); +} + + +void test3_func_6_3( void ) +{ + int i, x; + int *p = &test3_array2[ 6 ][ 3 ]; + + + test3_func_6_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_3(); +} + + +void test3_func_5_3( void ) +{ + int i, x; + int *p = &test3_array1[ 5 ][ 3 ]; + + + test3_func_5_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_3(); +} + + +void test3_func_4_3( void ) +{ + int i, x; + int *p = &test3_array8[ 4 ][ 3 ]; + + + test3_func_4_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_3(); +} + + +void test3_func_3_3( void ) +{ + int i, x; + int *p = &test3_array7[ 3 ][ 3 ]; + + + test3_func_3_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_3(); +} + + +void test3_func_2_3( void ) +{ + int i, x; + int *p = &test3_array6[ 2 ][ 3 ]; + + + test3_func_2_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_3(); +} + + +void test3_func_1_3( void ) +{ + int i, x; + int *p = &test3_array5[ 1 ][ 3 ]; + + + test3_func_1_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_3(); +} + + +void test3_func_0_3( void ) +{ + int i, x; + int *p = &test3_array4[ 0 ][ 3 ]; + + + test3_func_0_4(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_3(); +} + + +void test3_func_10_2( void ) +{ + int i, x; + int *p = &test3_array5[ 10 ][ 2 ]; + + + test3_func_10_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_2( void ) +{ + int i, x; + int *p = &test3_array4[ 9 ][ 2 ]; + + + test3_func_9_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_2(); +} + + +void test3_func_8_2( void ) +{ + int i, x; + int *p = &test3_array3[ 8 ][ 2 ]; + + + test3_func_8_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_2(); +} + + +void test3_func_7_2( void ) +{ + int i, x; + int *p = &test3_array2[ 7 ][ 2 ]; + + + test3_func_7_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_2(); +} + + +void test3_func_6_2( void ) +{ + int i, x; + int *p = &test3_array1[ 6 ][ 2 ]; + + + test3_func_6_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_2(); +} + + +void test3_func_5_2( void ) +{ + int i, x; + int *p = &test3_array8[ 5 ][ 2 ]; + + + test3_func_5_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_2(); +} + + +void test3_func_4_2( void ) +{ + int i, x; + int *p = &test3_array7[ 4 ][ 2 ]; + + + test3_func_4_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_2(); +} + + +void test3_func_3_2( void ) +{ + int i, x; + int *p = &test3_array6[ 3 ][ 2 ]; + + + test3_func_3_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_2(); +} + + +void test3_func_2_2( void ) +{ + int i, x; + int *p = &test3_array5[ 2 ][ 2 ]; + + + test3_func_2_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_2(); +} + + +void test3_func_1_2( void ) +{ + int i, x; + int *p = &test3_array4[ 1 ][ 2 ]; + + + test3_func_1_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_2(); +} + + +void test3_func_0_2( void ) +{ + int i, x; + int *p = &test3_array3[ 0 ][ 2 ]; + + + test3_func_0_3(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_2(); +} + + +void test3_func_10_1( void ) +{ + int i, x; + int *p = &test3_array4[ 10 ][ 1 ]; + + + test3_func_10_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_1( void ) +{ + int i, x; + int *p = &test3_array3[ 9 ][ 1 ]; + + + test3_func_9_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_1(); +} + + +void test3_func_8_1( void ) +{ + int i, x; + int *p = &test3_array2[ 8 ][ 1 ]; + + + test3_func_8_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_1(); +} + + +void test3_func_7_1( void ) +{ + int i, x; + int *p = &test3_array1[ 7 ][ 1 ]; + + + test3_func_7_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_1(); +} + + +void test3_func_6_1( void ) +{ + int i, x; + int *p = &test3_array8[ 6 ][ 1 ]; + + + test3_func_6_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_1(); +} + + +void test3_func_5_1( void ) +{ + int i, x; + int *p = &test3_array7[ 5 ][ 1 ]; + + + test3_func_5_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_1(); +} + + +void test3_func_4_1( void ) +{ + int i, x; + int *p = &test3_array6[ 4 ][ 1 ]; + + + test3_func_4_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_1(); +} + + +void test3_func_3_1( void ) +{ + int i, x; + int *p = &test3_array5[ 3 ][ 1 ]; + + + test3_func_3_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_1(); +} + + +void test3_func_2_1( void ) +{ + int i, x; + int *p = &test3_array4[ 2 ][ 1 ]; + + + test3_func_2_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_1(); +} + + +void test3_func_1_1( void ) +{ + int i, x; + int *p = &test3_array3[ 1 ][ 1 ]; + + + test3_func_1_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_1(); +} + + +void test3_func_0_1( void ) +{ + int i, x; + int *p = &test3_array2[ 0 ][ 1 ]; + + + test3_func_0_2(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_1(); +} + + +void test3_func_10_0( void ) +{ + int i, x; + int *p = &test3_array3[ 10 ][ 0 ]; + + + test3_func_10_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } +} + + +void test3_func_9_0( void ) +{ + int i, x; + int *p = &test3_array2[ 9 ][ 0 ]; + + + test3_func_9_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_10_0(); +} + + +void test3_func_8_0( void ) +{ + int i, x; + int *p = &test3_array1[ 8 ][ 0 ]; + + + test3_func_8_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_9_0(); +} + + +void test3_func_7_0( void ) +{ + int i, x; + int *p = &test3_array8[ 7 ][ 0 ]; + + + test3_func_7_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_8_0(); +} + + +void test3_func_6_0( void ) +{ + int i, x; + int *p = &test3_array7[ 6 ][ 0 ]; + + + test3_func_6_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_7_0(); +} + + +void test3_func_5_0( void ) +{ + int i, x; + int *p = &test3_array6[ 5 ][ 0 ]; + + + test3_func_5_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_6_0(); +} + + +void test3_func_4_0( void ) +{ + int i, x; + int *p = &test3_array5[ 4 ][ 0 ]; + + + test3_func_4_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_5_0(); +} + + +void test3_func_3_0( void ) +{ + int i, x; + int *p = &test3_array4[ 3 ][ 0 ]; + + + test3_func_3_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_4_0(); +} + + +void test3_func_2_0( void ) +{ + int i, x; + int *p = &test3_array3[ 2 ][ 0 ]; + + + test3_func_2_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_3_0(); +} + + +void test3_func_1_0( void ) +{ + int i, x; + int *p = &test3_array2[ 1 ][ 0 ]; + + + test3_func_1_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_2_0(); +} + + +void test3_func_0_0( void ) +{ + int i, x; + int *p = &test3_array1[ 0 ][ 0 ]; + + + test3_func_0_1(); + + _Pragma( "loopbound min 4 max 4" ) + for ( i = 0, x = 8; i < 4; i++, x >>= 1 ) { + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + test3_result += *p; + p += x; + } + + test3_func_1_0(); +} + + +/* + Main functions +*/ + +void _Pragma ( "entrypoint" ) test3_main( void ) +{ + test3_func_0_0(); +} + + +int main() +{ + test3_init(); + test3_main(); + + return ( test3_return() - 1377313800 != 0 ); +}

    )`CkOf*a{ajRc{d{xp5VVPx=^Y3 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 X;(>(=*BF&Nb=cc#kw6~KGid$~^#ADw literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wat b/targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wat new file mode 100644 index 0000000..f969db6 --- /dev/null +++ b/targets/wasm-tacle/sequential/mpeg2/generated/default/mpeg2.wat @@ -0,0 +1,12495 @@ +(module $mpeg2.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (result i32))) + (type (;3;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32))) + (type (;4;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32))) + (type (;5;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32))) + (type (;6;) (func (param i32 i32) (result i32))) + (type (;7;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32))) + (type (;8;) (func (param i32 i32 i32 i32 i32 i32) (result i32))) + (type (;9;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32))) + (type (;10;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32))) + (type (;11;) (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32))) + (type (;12;) (func (param i32 i32 i32 i32 i32 i32 i32) (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $mpeg2_return (type 2) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 352 + i32.const 352 + call $__pragma_loopbound + i32.const 0 + local.set 0 + i32.const -33792 + local.set 1 + loop ;; label = @1 + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 2 + i32.const 2 + call $__pragma_loopbound + local.get 1 + i32.const 125004 + i32.add + i32.load + local.set 2 + local.get 1 + i32.const 125000 + i32.add + i32.load + local.set 3 + i32.const 2 + i32.const 2 + call $__pragma_loopbound + local.get 1 + i32.const 125012 + i32.add + i32.load + local.set 4 + local.get 1 + i32.const 125008 + i32.add + i32.load + local.set 5 + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 2 + i32.const 2 + call $__pragma_loopbound + local.get 1 + i32.const 125020 + i32.add + i32.load + local.set 6 + local.get 1 + i32.const 125016 + i32.add + i32.load + local.set 7 + i32.const 2 + i32.const 2 + call $__pragma_loopbound + local.get 1 + i32.const 125028 + i32.add + i32.load + local.get 1 + i32.const 125024 + i32.add + i32.load + local.get 6 + local.get 7 + local.get 4 + local.get 5 + local.get 2 + local.get 3 + local.get 0 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 0 + local.get 1 + i32.const 96 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + local.get 0) + (func $mpeg2_motion_estimation (type 3) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32) + i32.const 16 + i32.const 16 + call $__pragma_loopbound + block ;; label = @1 + i32.const 0 + i32.load offset=1036 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + local.set 13 + loop ;; label = @2 + i32.const 22 + i32.const 22 + call $__pragma_loopbound + block ;; label = @3 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.lt_s + br_if 0 (;@3;) + i32.const 0 + local.set 14 + loop ;; label = @4 + block ;; label = @5 + block ;; label = @6 + i32.const 0 + i32.load offset=1048 + i32.const 3 + i32.ne + br_if 0 (;@6;) + local.get 0 + local.get 1 + local.get 2 + local.get 3 + local.get 4 + local.get 14 + local.get 13 + local.get 6 + local.get 7 + local.get 8 + local.get 9 + local.get 10 + call $mpeg2_frame_ME + br 1 (;@5;) + end + local.get 0 + local.get 1 + local.get 2 + local.get 3 + local.get 4 + local.get 5 + local.get 14 + local.get 13 + local.get 6 + local.get 7 + local.get 8 + local.get 9 + local.get 10 + local.get 11 + local.get 12 + call $mpeg2_field_ME + end + local.get 10 + i32.const 96 + i32.add + local.set 10 + local.get 14 + i32.const 16 + i32.add + local.tee 14 + i32.const 0 + i32.load offset=1024 + i32.lt_s + br_if 0 (;@4;) + end + end + local.get 13 + i32.const 16 + i32.add + local.tee 13 + i32.const 0 + i32.load offset=1036 + i32.lt_s + br_if 0 (;@2;) + end + end) + (func $mpeg2_frame_ME (type 4) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 112 + i32.sub + local.tee 12 + global.set $__stack_pointer + local.get 4 + local.get 5 + i32.add + i32.const 0 + i32.load offset=1024 + local.get 6 + i32.mul + i32.add + local.tee 13 + i32.const 0 + i32.load offset=1024 + call $mpeg2_variance + local.set 14 + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1044 + i32.const 1 + i32.ne + br_if 0 (;@2;) + local.get 11 + i32.const 1 + i32.store + br 1 (;@1;) + end + i32.const 0 + i32.load offset=1044 + local.set 4 + i32.const 0 + i32.load offset=91168 + local.set 15 + block ;; label = @2 + local.get 4 + i32.const 2 + i32.ne + br_if 0 (;@2;) + block ;; label = @3 + block ;; label = @4 + local.get 15 + i32.eqz + br_if 0 (;@4;) + local.get 0 + local.get 2 + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 5 + local.get 6 + local.get 7 + local.get 8 + i32.const 16 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + local.get 12 + i32.const 108 + i32.add + local.get 12 + i32.const 104 + i32.add + call $mpeg2_fullsearch + drop + local.get 12 + i32.load offset=104 + local.set 4 + i32.const 0 + i32.load offset=1024 + local.set 15 + local.get 2 + local.get 12 + i32.load offset=108 + local.tee 8 + i32.const 1 + i32.shr_s + i32.add + local.get 15 + local.get 4 + i32.const 1 + i32.shr_s + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 8 + i32.const 1 + i32.and + local.get 4 + i32.const 1 + i32.and + i32.const 16 + call $mpeg2_dist2 + local.set 4 + local.get 11 + i32.const 2 + i32.store offset=4 + br 1 (;@3;) + end + local.get 0 + local.get 2 + local.get 13 + local.get 5 + local.get 6 + local.get 7 + local.get 8 + local.get 12 + i32.const 108 + i32.add + local.get 12 + i32.const 104 + i32.add + local.get 12 + i32.const 100 + i32.add + local.get 12 + i32.const 96 + i32.add + local.get 12 + i32.const 92 + i32.add + local.get 12 + i32.const 88 + i32.add + local.get 12 + i32.const 84 + i32.add + local.get 12 + i32.const 80 + i32.add + local.get 12 + i32.const 76 + i32.add + local.get 12 + i32.const 72 + i32.add + local.get 12 + i32.const 16 + i32.add + local.get 12 + call $mpeg2_frame_estimate + block ;; label = @4 + i32.const 0 + i32.load offset=1040 + i32.const 1 + i32.ne + br_if 0 (;@4;) + local.get 2 + local.get 13 + local.get 5 + local.get 6 + i32.const 1 + i32.shr_s + local.get 12 + i32.const 16 + i32.add + local.get 12 + local.get 12 + i32.const 68 + i32.add + local.get 12 + i32.const 64 + i32.add + local.get 12 + i32.const 60 + i32.add + local.get 12 + i32.const 56 + i32.add + local.get 12 + i32.const 52 + i32.add + local.get 12 + i32.const 48 + i32.add + call $mpeg2_dpframe_estimate + end + i32.const 0 + i32.load offset=1040 + local.set 8 + local.get 12 + i32.load offset=80 + local.set 15 + local.get 12 + i32.load offset=84 + local.set 4 + block ;; label = @4 + local.get 8 + i32.const 1 + i32.ne + br_if 0 (;@4;) + local.get 12 + i32.load offset=52 + local.tee 8 + local.get 4 + i32.ge_s + br_if 0 (;@4;) + local.get 8 + local.get 15 + i32.ge_s + br_if 0 (;@4;) + local.get 11 + i32.const 3 + i32.store offset=4 + local.get 12 + i32.load offset=48 + local.set 4 + br 1 (;@3;) + end + block ;; label = @4 + local.get 4 + local.get 15 + i32.gt_s + br_if 0 (;@4;) + local.get 11 + i32.const 2 + i32.store offset=4 + local.get 12 + i32.load offset=104 + local.set 4 + i32.const 0 + i32.load offset=1024 + local.set 15 + local.get 2 + local.get 12 + i32.load offset=108 + local.tee 8 + i32.const 1 + i32.shr_s + i32.add + local.get 15 + local.get 4 + i32.const 1 + i32.shr_s + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 8 + i32.const 1 + i32.and + local.get 4 + i32.const 1 + i32.and + i32.const 16 + call $mpeg2_dist2 + local.set 4 + br 1 (;@3;) + end + local.get 11 + i32.const 1 + i32.store offset=4 + i32.const 0 + local.set 15 + i32.const 0 + local.set 8 + block ;; label = @4 + local.get 12 + i32.load offset=76 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 8 + end + local.get 12 + i32.load offset=96 + local.set 4 + local.get 2 + local.get 8 + i32.add + local.get 12 + i32.load offset=100 + local.tee 8 + i32.const 1 + i32.shr_s + i32.add + i32.const 0 + i32.load offset=1024 + local.get 4 + i32.const 1 + i32.shr_u + i32.mul + i32.const 1 + i32.shl + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 8 + i32.const 1 + i32.and + local.get 4 + i32.const 1 + i32.and + i32.const 8 + call $mpeg2_dist2 + local.set 8 + block ;; label = @4 + local.get 12 + i32.load offset=72 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 15 + end + local.get 12 + i32.load offset=88 + local.set 4 + local.get 2 + local.get 15 + i32.add + local.get 12 + i32.load offset=92 + local.tee 15 + i32.const 1 + i32.shr_s + i32.add + i32.const 0 + i32.load offset=1024 + local.get 4 + i32.const 1 + i32.shr_u + i32.mul + i32.const 1 + i32.shl + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 15 + i32.const 1 + i32.and + local.get 4 + i32.const 1 + i32.and + i32.const 8 + call $mpeg2_dist2 + local.get 8 + i32.add + local.set 4 + end + block ;; label = @3 + local.get 4 + local.get 14 + i32.le_s + br_if 0 (;@3;) + local.get 4 + i32.const 2304 + i32.lt_s + br_if 0 (;@3;) + local.get 11 + i32.const 1 + i32.store + br 2 (;@1;) + end + block ;; label = @3 + local.get 2 + local.get 5 + i32.add + i32.const 0 + i32.load offset=1024 + local.get 6 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.const 0 + i32.const 16 + call $mpeg2_dist2 + local.tee 14 + i32.const 2304 + i32.lt_s + br_if 0 (;@3;) + local.get 14 + i32.const 2 + i32.shl + local.get 4 + i32.const 5 + i32.mul + i32.le_s + br_if 0 (;@3;) + local.get 11 + i32.const 8 + i32.store + local.get 5 + i32.const 1 + i32.shl + local.set 15 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 11 + i32.load offset=4 + i32.const -2 + i32.add + br_table 0 (;@6;) 1 (;@5;) 2 (;@4;) + end + local.get 11 + local.get 12 + i32.load offset=108 + local.get 15 + i32.sub + i32.store offset=24 + local.get 11 + local.get 12 + i32.load offset=104 + local.get 6 + i32.const 1 + i32.shl + i32.sub + i32.store offset=28 + local.get 4 + local.set 14 + br 4 (;@1;) + end + local.get 11 + local.get 12 + i32.load offset=60 + i32.store offset=72 + local.get 11 + local.get 12 + i32.load offset=56 + i32.store offset=76 + local.get 11 + local.get 12 + i32.load offset=68 + local.get 15 + i32.sub + i32.store offset=24 + local.get 11 + local.get 12 + i32.load offset=64 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=28 + local.get 4 + local.set 14 + br 3 (;@1;) + end + local.get 11 + local.get 12 + i32.load offset=76 + i32.store offset=56 + local.get 11 + local.get 12 + i32.load offset=72 + i32.store offset=64 + local.get 11 + local.get 12 + i32.load offset=100 + local.get 15 + i32.sub + i32.store offset=24 + local.get 11 + local.get 12 + i32.load offset=92 + local.get 15 + i32.sub + i32.store offset=40 + local.get 11 + local.get 12 + i32.load offset=96 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=28 + local.get 11 + local.get 12 + i32.load offset=88 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=44 + local.get 4 + local.set 14 + br 2 (;@1;) + end + local.get 11 + i64.const 0 + i64.store offset=24 + local.get 11 + i64.const 8589934592 + i64.store + br 1 (;@1;) + end + block ;; label = @2 + block ;; label = @3 + local.get 15 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + local.set 15 + local.get 0 + local.get 2 + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 5 + local.get 6 + local.get 7 + local.get 8 + i32.const 16 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + local.get 12 + i32.const 108 + i32.add + local.get 12 + i32.const 104 + i32.add + call $mpeg2_fullsearch + drop + local.get 12 + i32.load offset=104 + local.set 16 + i32.const 0 + i32.load offset=1024 + local.set 4 + local.get 2 + local.get 12 + i32.load offset=108 + local.tee 17 + i32.const 1 + i32.shr_s + i32.add + local.tee 7 + local.get 4 + local.get 16 + i32.const 1 + i32.shr_s + local.tee 0 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 17 + i32.const 1 + i32.and + local.tee 4 + local.get 16 + i32.const 1 + i32.and + local.tee 18 + i32.const 16 + call $mpeg2_dist2 + local.set 19 + local.get 1 + local.get 3 + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 5 + local.get 6 + local.get 9 + local.get 10 + i32.const 16 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + local.get 12 + i32.const 100 + i32.add + local.get 12 + i32.const 96 + i32.add + call $mpeg2_fullsearch + drop + local.get 12 + i32.load offset=96 + local.set 20 + i32.const 0 + i32.load offset=1024 + local.set 8 + local.get 3 + local.get 12 + i32.load offset=100 + local.tee 21 + i32.const 1 + i32.shr_s + i32.add + local.tee 9 + local.get 8 + local.get 20 + i32.const 1 + i32.shr_s + local.tee 1 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 21 + i32.const 1 + i32.and + local.tee 8 + local.get 20 + i32.const 1 + i32.and + local.tee 22 + i32.const 16 + call $mpeg2_dist2 + local.set 23 + i32.const 0 + i32.load offset=1024 + local.set 10 + i32.const 0 + i32.load offset=1024 + local.set 24 + i32.const 0 + i32.load offset=1024 + local.set 25 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 7 + local.get 10 + local.get 0 + i32.mul + i32.add + local.tee 7 + local.get 4 + i32.add + local.set 10 + local.get 9 + local.get 24 + local.get 1 + i32.mul + i32.add + local.tee 0 + local.get 8 + i32.add + local.set 9 + local.get 7 + local.get 25 + local.get 18 + i32.mul + i32.add + local.tee 1 + local.get 4 + i32.add + local.set 18 + local.get 0 + local.get 25 + local.get 22 + i32.mul + i32.add + local.tee 22 + local.get 8 + i32.add + local.set 24 + i32.const 0 + local.set 26 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 7 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 0 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 15 + i32.add + local.set 15 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 24 + local.get 25 + i32.add + local.set 24 + local.get 22 + local.get 25 + i32.add + local.set 22 + local.get 9 + local.get 25 + i32.add + local.set 9 + local.get 0 + local.get 25 + i32.add + local.set 0 + local.get 18 + local.get 25 + i32.add + local.set 18 + local.get 1 + local.get 25 + i32.add + local.set 1 + local.get 10 + local.get 25 + i32.add + local.set 10 + local.get 7 + local.get 25 + i32.add + local.set 7 + local.get 13 + local.get 25 + i32.add + local.set 13 + local.get 26 + i32.const 1 + i32.add + local.tee 26 + i32.const 16 + i32.ne + br_if 0 (;@4;) + end + local.get 11 + i32.const 2 + i32.store offset=4 + local.get 11 + i32.const 12 + i32.const 4 + local.get 23 + local.get 15 + i32.gt_s + select + i32.const 8 + local.get 19 + local.get 23 + i32.gt_s + local.get 19 + local.get 15 + i32.gt_s + i32.or + local.tee 4 + select + i32.store + local.get 23 + local.get 15 + local.get 23 + local.get 15 + i32.lt_s + select + local.get 19 + local.get 4 + select + local.set 15 + br 1 (;@2;) + end + local.get 0 + local.get 2 + local.get 13 + local.get 5 + local.get 6 + local.get 7 + local.get 8 + local.get 12 + i32.const 108 + i32.add + local.get 12 + i32.const 104 + i32.add + local.get 12 + i32.const 92 + i32.add + local.get 12 + i32.const 88 + i32.add + local.get 12 + i32.const 84 + i32.add + local.get 12 + i32.const 80 + i32.add + local.get 12 + i32.const 60 + i32.add + local.get 12 + i32.const 52 + i32.add + local.get 12 + i32.const 44 + i32.add + local.get 12 + i32.const 40 + i32.add + local.get 12 + i32.const 16 + i32.add + local.get 12 + call $mpeg2_frame_estimate + local.get 1 + local.get 3 + local.get 13 + local.get 5 + local.get 6 + local.get 9 + local.get 10 + local.get 12 + i32.const 100 + i32.add + local.get 12 + i32.const 96 + i32.add + local.get 12 + i32.const 76 + i32.add + local.get 12 + i32.const 72 + i32.add + local.get 12 + i32.const 68 + i32.add + local.get 12 + i32.const 64 + i32.add + local.get 12 + i32.const 56 + i32.add + local.get 12 + i32.const 48 + i32.add + local.get 12 + i32.const 36 + i32.add + local.get 12 + i32.const 32 + i32.add + local.get 12 + i32.const 16 + i32.add + local.get 12 + call $mpeg2_frame_estimate + i32.const 0 + local.set 15 + i32.const 0 + i32.load offset=1024 + local.set 4 + i32.const 0 + i32.load offset=1024 + local.set 8 + i32.const 0 + i32.load offset=1024 + local.set 26 + local.get 12 + i32.load offset=100 + local.set 21 + local.get 12 + i32.load offset=96 + local.set 20 + local.get 12 + i32.load offset=108 + local.set 17 + local.get 12 + i32.load offset=104 + local.set 16 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 2 + local.get 17 + i32.const 1 + i32.shr_s + i32.add + local.tee 27 + local.get 4 + local.get 16 + i32.const 1 + i32.shr_s + local.tee 28 + i32.mul + i32.add + local.tee 7 + local.get 17 + i32.const 1 + i32.and + local.tee 29 + i32.add + local.set 10 + local.get 3 + local.get 21 + i32.const 1 + i32.shr_s + i32.add + local.tee 30 + local.get 8 + local.get 20 + i32.const 1 + i32.shr_s + local.tee 31 + i32.mul + i32.add + local.tee 0 + local.get 21 + i32.const 1 + i32.and + local.tee 32 + i32.add + local.set 9 + local.get 7 + local.get 26 + local.get 16 + i32.const 1 + i32.and + local.tee 33 + i32.mul + i32.add + local.tee 1 + local.get 29 + i32.add + local.set 18 + local.get 0 + local.get 26 + local.get 20 + i32.const 1 + i32.and + local.tee 34 + i32.mul + i32.add + local.tee 22 + local.get 32 + i32.add + local.set 24 + i32.const 0 + local.set 23 + local.get 13 + local.set 25 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @4 + local.get 7 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 0 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 25 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.const 31 + i32.shr_s + local.tee 8 + i32.xor + local.get 8 + i32.sub + local.get 15 + i32.add + local.set 15 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@4;) + end + local.get 24 + local.get 26 + i32.add + local.set 24 + local.get 22 + local.get 26 + i32.add + local.set 22 + local.get 9 + local.get 26 + i32.add + local.set 9 + local.get 0 + local.get 26 + i32.add + local.set 0 + local.get 18 + local.get 26 + i32.add + local.set 18 + local.get 1 + local.get 26 + i32.add + local.set 1 + local.get 10 + local.get 26 + i32.add + local.set 10 + local.get 7 + local.get 26 + i32.add + local.set 7 + local.get 25 + local.get 26 + i32.add + local.set 25 + local.get 23 + i32.const 1 + i32.add + local.tee 23 + i32.const 16 + i32.ne + br_if 0 (;@3;) + end + local.get 2 + local.get 12 + i32.load offset=92 + local.tee 35 + i32.const 1 + i32.shr_s + local.tee 36 + i32.add + local.set 37 + i32.const 0 + local.set 4 + i32.const 0 + local.set 8 + block ;; label = @3 + local.get 12 + i32.load offset=44 + local.tee 38 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 8 + end + local.get 12 + i32.load offset=88 + local.set 39 + local.get 37 + local.get 8 + i32.add + i32.const 0 + i32.load offset=1024 + local.get 39 + i32.const 1 + i32.shr_u + i32.mul + i32.const 1 + i32.shl + i32.add + local.set 0 + local.get 3 + local.get 12 + i32.load offset=76 + local.tee 40 + i32.const 1 + i32.shr_s + local.tee 41 + i32.add + local.set 42 + block ;; label = @3 + local.get 12 + i32.load offset=36 + local.tee 43 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 0 + local.set 8 + i32.const 0 + i32.load offset=1024 + local.set 7 + i32.const 0 + i32.load offset=1024 + local.set 9 + local.get 12 + i32.load offset=72 + local.set 44 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 42 + local.get 4 + i32.add + local.get 7 + local.get 44 + i32.const 1 + i32.shr_u + i32.mul + i32.const 1 + i32.shl + i32.add + local.tee 10 + local.get 9 + i32.const 1 + i32.shl + local.tee 23 + local.get 44 + i32.const 1 + i32.and + local.tee 45 + i32.mul + i32.add + local.tee 9 + local.get 40 + i32.const 1 + i32.and + local.tee 46 + i32.add + local.set 1 + local.get 10 + local.get 46 + i32.add + local.set 18 + local.get 0 + local.get 23 + local.get 39 + i32.const 1 + i32.and + local.tee 47 + i32.mul + i32.add + local.tee 22 + local.get 35 + i32.const 1 + i32.and + local.tee 48 + i32.add + local.set 24 + local.get 0 + local.get 48 + i32.add + local.set 25 + i32.const 0 + local.set 19 + local.get 13 + local.set 26 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @4 + local.get 0 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 25 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 26 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 7 + local.get 7 + i32.const 31 + i32.shr_s + local.tee 7 + i32.xor + local.get 7 + i32.sub + local.get 8 + i32.add + local.set 8 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@4;) + end + local.get 1 + local.get 23 + i32.add + local.set 1 + local.get 9 + local.get 23 + i32.add + local.set 9 + local.get 18 + local.get 23 + i32.add + local.set 18 + local.get 10 + local.get 23 + i32.add + local.set 10 + local.get 24 + local.get 23 + i32.add + local.set 24 + local.get 22 + local.get 23 + i32.add + local.set 22 + local.get 25 + local.get 23 + i32.add + local.set 25 + local.get 0 + local.get 23 + i32.add + local.set 0 + local.get 26 + local.get 23 + i32.add + local.set 26 + local.get 19 + i32.const 1 + i32.add + local.tee 19 + i32.const 8 + i32.ne + br_if 0 (;@3;) + end + local.get 2 + local.get 12 + i32.load offset=84 + local.tee 49 + i32.const 1 + i32.shr_s + local.tee 50 + i32.add + local.set 51 + i32.const 0 + local.set 4 + i32.const 0 + local.set 7 + block ;; label = @3 + local.get 12 + i32.load offset=40 + local.tee 52 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 7 + end + local.get 12 + i32.load offset=80 + local.set 53 + local.get 51 + local.get 7 + i32.add + i32.const 0 + i32.load offset=1024 + local.get 53 + i32.const 1 + i32.shr_u + i32.mul + i32.const 1 + i32.shl + i32.add + local.set 10 + local.get 3 + local.get 12 + i32.load offset=68 + local.tee 54 + i32.const 1 + i32.shr_s + local.tee 55 + i32.add + local.set 56 + block ;; label = @3 + local.get 12 + i32.load offset=32 + local.tee 57 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 0 + local.set 7 + i32.const 0 + i32.load offset=1024 + local.set 0 + i32.const 0 + i32.load offset=1024 + local.set 23 + i32.const 0 + i32.load offset=1024 + local.set 1 + local.get 12 + i32.load offset=64 + local.set 58 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 56 + local.get 4 + i32.add + local.get 0 + local.get 58 + i32.const 1 + i32.shr_u + i32.mul + i32.const 1 + i32.shl + i32.add + local.tee 9 + local.get 1 + i32.const 1 + i32.shl + local.tee 19 + local.get 58 + i32.const 1 + i32.and + local.tee 59 + i32.mul + i32.add + local.tee 1 + local.get 54 + i32.const 1 + i32.and + local.tee 60 + i32.add + local.set 18 + local.get 9 + local.get 60 + i32.add + local.set 22 + local.get 10 + local.get 19 + local.get 53 + i32.const 1 + i32.and + local.tee 61 + i32.mul + i32.add + local.tee 24 + local.get 49 + i32.const 1 + i32.and + local.tee 62 + i32.add + local.set 25 + local.get 10 + local.get 62 + i32.add + local.set 26 + local.get 13 + local.get 23 + i32.add + local.set 23 + i32.const 0 + local.set 63 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @4 + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 26 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 25 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 23 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 0 + local.get 0 + i32.const 31 + i32.shr_s + local.tee 0 + i32.xor + local.get 0 + i32.sub + local.get 7 + i32.add + local.set 7 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@4;) + end + local.get 18 + local.get 19 + i32.add + local.set 18 + local.get 1 + local.get 19 + i32.add + local.set 1 + local.get 22 + local.get 19 + i32.add + local.set 22 + local.get 9 + local.get 19 + i32.add + local.set 9 + local.get 25 + local.get 19 + i32.add + local.set 25 + local.get 24 + local.get 19 + i32.add + local.set 24 + local.get 26 + local.get 19 + i32.add + local.set 26 + local.get 10 + local.get 19 + i32.add + local.set 10 + local.get 23 + local.get 19 + i32.add + local.set 23 + local.get 63 + i32.const 1 + i32.add + local.tee 63 + i32.const 8 + i32.ne + br_if 0 (;@3;) + end + local.get 12 + i32.load offset=48 + local.set 9 + local.get 12 + i32.load offset=56 + local.set 10 + local.get 12 + i32.load offset=52 + local.set 0 + local.get 12 + i32.load offset=60 + local.set 4 + block ;; label = @3 + local.get 15 + local.get 7 + local.get 8 + i32.add + local.tee 8 + i32.ge_s + br_if 0 (;@3;) + local.get 15 + local.get 4 + i32.ge_s + br_if 0 (;@3;) + local.get 15 + local.get 0 + i32.ge_s + br_if 0 (;@3;) + local.get 15 + local.get 10 + i32.ge_s + br_if 0 (;@3;) + local.get 15 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 11 + i64.const 8589934604 + i64.store + i32.const 0 + local.set 15 + i32.const 0 + i32.load offset=1024 + local.set 4 + i32.const 0 + i32.load offset=1024 + local.set 8 + i32.const 0 + i32.load offset=1024 + local.set 25 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 27 + local.get 4 + local.get 28 + i32.mul + i32.add + local.tee 7 + local.get 25 + local.get 33 + i32.mul + i32.add + local.tee 10 + local.get 29 + i32.add + local.set 9 + local.get 30 + local.get 8 + local.get 31 + i32.mul + i32.add + local.tee 0 + local.get 25 + local.get 34 + i32.mul + i32.add + local.tee 1 + local.get 32 + i32.add + local.set 18 + local.get 7 + local.get 29 + i32.add + local.set 22 + local.get 0 + local.get 32 + i32.add + local.set 24 + i32.const 0 + local.set 26 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 7 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 0 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 15 + i32.add + local.set 15 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 18 + local.get 25 + i32.add + local.set 18 + local.get 1 + local.get 25 + i32.add + local.set 1 + local.get 24 + local.get 25 + i32.add + local.set 24 + local.get 0 + local.get 25 + i32.add + local.set 0 + local.get 9 + local.get 25 + i32.add + local.set 9 + local.get 10 + local.get 25 + i32.add + local.set 10 + local.get 22 + local.get 25 + i32.add + local.set 22 + local.get 7 + local.get 25 + i32.add + local.set 7 + local.get 13 + local.get 25 + i32.add + local.set 13 + local.get 26 + i32.const 1 + i32.add + local.tee 26 + i32.const 16 + i32.ne + br_if 0 (;@4;) + br 2 (;@2;) + end + end + block ;; label = @3 + local.get 8 + local.get 4 + i32.ge_s + br_if 0 (;@3;) + local.get 8 + local.get 0 + i32.ge_s + br_if 0 (;@3;) + local.get 8 + local.get 10 + i32.ge_s + br_if 0 (;@3;) + local.get 8 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 11 + i64.const 4294967308 + i64.store + i32.const 0 + local.set 4 + i32.const 0 + local.set 15 + block ;; label = @4 + local.get 38 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 15 + end + local.get 37 + local.get 15 + i32.add + local.get 39 + i32.const -2 + i32.and + i32.const 0 + i32.load offset=1024 + i32.mul + i32.add + local.set 7 + block ;; label = @4 + local.get 43 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 0 + local.set 15 + i32.const 0 + i32.load offset=1024 + local.set 8 + i32.const 0 + i32.load offset=1024 + local.set 9 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 42 + local.get 4 + i32.add + local.get 8 + local.get 44 + i32.const -2 + i32.and + i32.mul + i32.add + local.tee 0 + local.get 46 + i32.add + local.set 10 + local.get 0 + local.get 9 + i32.const 1 + i32.shl + local.tee 26 + local.get 45 + i32.mul + i32.add + local.tee 9 + local.get 46 + i32.add + local.set 1 + local.get 7 + local.get 48 + i32.add + local.set 18 + local.get 7 + local.get 26 + local.get 47 + i32.mul + i32.add + local.tee 22 + local.get 48 + i32.add + local.set 24 + i32.const 0 + local.set 23 + local.get 13 + local.set 25 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 7 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 0 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 25 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 15 + i32.add + local.set 15 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 1 + local.get 26 + i32.add + local.set 1 + local.get 9 + local.get 26 + i32.add + local.set 9 + local.get 10 + local.get 26 + i32.add + local.set 10 + local.get 0 + local.get 26 + i32.add + local.set 0 + local.get 24 + local.get 26 + i32.add + local.set 24 + local.get 22 + local.get 26 + i32.add + local.set 22 + local.get 18 + local.get 26 + i32.add + local.set 18 + local.get 7 + local.get 26 + i32.add + local.set 7 + local.get 25 + local.get 26 + i32.add + local.set 25 + local.get 23 + i32.const 1 + i32.add + local.tee 23 + i32.const 8 + i32.ne + br_if 0 (;@4;) + end + i32.const 0 + local.set 4 + i32.const 0 + local.set 8 + block ;; label = @4 + local.get 52 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 8 + end + local.get 51 + local.get 8 + i32.add + local.get 53 + i32.const -2 + i32.and + i32.const 0 + i32.load offset=1024 + i32.mul + i32.add + local.set 7 + block ;; label = @4 + local.get 57 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 0 + local.set 8 + i32.const 0 + i32.load offset=1024 + local.set 0 + i32.const 0 + i32.load offset=1024 + local.set 22 + i32.const 0 + i32.load offset=1024 + local.set 9 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 56 + local.get 4 + i32.add + local.get 0 + local.get 58 + i32.const -2 + i32.and + i32.mul + i32.add + local.tee 0 + local.get 60 + i32.add + local.set 10 + local.get 0 + local.get 9 + i32.const 1 + i32.shl + local.tee 26 + local.get 59 + i32.mul + i32.add + local.tee 9 + local.get 60 + i32.add + local.set 1 + local.get 7 + local.get 62 + i32.add + local.set 18 + local.get 13 + local.get 22 + i32.add + local.set 22 + local.get 7 + local.get 26 + local.get 61 + i32.mul + i32.add + local.tee 24 + local.get 62 + i32.add + local.set 25 + i32.const 0 + local.set 23 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 7 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 25 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 0 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 13 + local.get 13 + i32.mul + local.get 8 + i32.add + local.set 8 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 1 + local.get 26 + i32.add + local.set 1 + local.get 9 + local.get 26 + i32.add + local.set 9 + local.get 10 + local.get 26 + i32.add + local.set 10 + local.get 0 + local.get 26 + i32.add + local.set 0 + local.get 25 + local.get 26 + i32.add + local.set 25 + local.get 24 + local.get 26 + i32.add + local.set 24 + local.get 18 + local.get 26 + i32.add + local.set 18 + local.get 7 + local.get 26 + i32.add + local.set 7 + local.get 22 + local.get 26 + i32.add + local.set 22 + local.get 23 + i32.const 1 + i32.add + local.tee 23 + i32.const 8 + i32.ne + br_if 0 (;@4;) + end + local.get 8 + local.get 15 + i32.add + local.set 15 + br 1 (;@2;) + end + block ;; label = @3 + local.get 4 + local.get 0 + i32.ge_s + br_if 0 (;@3;) + local.get 4 + local.get 10 + i32.ge_s + br_if 0 (;@3;) + local.get 4 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 11 + i64.const 8589934600 + i64.store + local.get 27 + i32.const 0 + i32.load offset=1024 + local.get 28 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 29 + local.get 33 + i32.const 16 + call $mpeg2_dist2 + local.set 15 + br 1 (;@2;) + end + block ;; label = @3 + local.get 0 + local.get 10 + i32.ge_s + br_if 0 (;@3;) + local.get 0 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 11 + i64.const 4294967304 + i64.store + i32.const 0 + local.set 4 + i32.const 0 + local.set 15 + block ;; label = @4 + local.get 38 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 15 + end + local.get 2 + local.get 15 + i32.add + local.get 36 + i32.add + local.get 39 + i32.const -2 + i32.and + i32.const 0 + i32.load offset=1024 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 48 + local.get 47 + i32.const 8 + call $mpeg2_dist2 + local.set 15 + block ;; label = @4 + local.get 52 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 2 + local.get 4 + i32.add + local.get 50 + i32.add + local.get 53 + i32.const -2 + i32.and + i32.const 0 + i32.load offset=1024 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 62 + local.get 61 + i32.const 8 + call $mpeg2_dist2 + local.get 15 + i32.add + local.set 15 + br 1 (;@2;) + end + local.get 11 + i32.const 4 + i32.store + block ;; label = @3 + local.get 10 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 11 + i32.const 2 + i32.store offset=4 + local.get 30 + i32.const 0 + i32.load offset=1024 + local.get 31 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + local.get 32 + local.get 34 + i32.const 16 + call $mpeg2_dist2 + local.set 15 + br 1 (;@2;) + end + local.get 11 + i32.const 1 + i32.store offset=4 + i32.const 0 + local.set 4 + i32.const 0 + local.set 15 + block ;; label = @3 + local.get 43 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 15 + end + local.get 3 + local.get 15 + i32.add + local.get 41 + i32.add + local.get 44 + i32.const -2 + i32.and + i32.const 0 + i32.load offset=1024 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 46 + local.get 45 + i32.const 8 + call $mpeg2_dist2 + local.set 15 + block ;; label = @3 + local.get 57 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 3 + local.get 4 + i32.add + local.get 55 + i32.add + local.get 58 + i32.const -2 + i32.and + i32.const 0 + i32.load offset=1024 + i32.mul + i32.add + local.get 13 + i32.const 0 + i32.load offset=1024 + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 60 + local.get 59 + i32.const 8 + call $mpeg2_dist2 + local.get 15 + i32.add + local.set 15 + end + block ;; label = @2 + local.get 15 + local.get 14 + i32.le_s + br_if 0 (;@2;) + local.get 15 + i32.const 2304 + i32.lt_s + br_if 0 (;@2;) + local.get 11 + i32.const 1 + i32.store + br 1 (;@1;) + end + local.get 5 + i32.const 1 + i32.shl + local.set 4 + block ;; label = @2 + block ;; label = @3 + local.get 11 + i32.load offset=4 + i32.const 2 + i32.ne + br_if 0 (;@3;) + local.get 11 + local.get 21 + local.get 4 + i32.sub + i32.store offset=32 + local.get 11 + local.get 17 + local.get 4 + i32.sub + i32.store offset=24 + local.get 11 + local.get 20 + local.get 6 + i32.const 1 + i32.shl + local.tee 4 + i32.sub + i32.store offset=36 + local.get 11 + local.get 16 + local.get 4 + i32.sub + i32.store offset=28 + br 1 (;@2;) + end + local.get 11 + local.get 52 + i32.store offset=64 + local.get 11 + local.get 38 + i32.store offset=56 + local.get 11 + local.get 57 + i32.store offset=68 + local.get 11 + local.get 43 + i32.store offset=60 + local.get 11 + local.get 49 + local.get 4 + i32.sub + i32.store offset=40 + local.get 11 + local.get 35 + local.get 4 + i32.sub + i32.store offset=24 + local.get 11 + local.get 54 + local.get 4 + i32.sub + i32.store offset=48 + local.get 11 + local.get 40 + local.get 4 + i32.sub + i32.store offset=32 + local.get 11 + local.get 53 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=44 + local.get 11 + local.get 39 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=28 + local.get 11 + local.get 58 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=52 + local.get 11 + local.get 44 + local.get 6 + i32.sub + i32.const 1 + i32.shl + i32.store offset=36 + end + local.get 15 + local.set 14 + end + local.get 11 + local.get 14 + i32.store offset=88 + local.get 12 + i32.const 112 + i32.add + global.set $__stack_pointer) + (func $mpeg2_field_ME (type 5) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 112 + i32.sub + local.tee 15 + global.set $__stack_pointer + local.get 4 + local.get 6 + i32.add + i32.const 0 + i32.load offset=1024 + local.tee 16 + i32.const 1 + i32.shl + local.tee 17 + local.get 7 + i32.mul + local.tee 18 + i32.add + local.set 19 + block ;; label = @1 + i32.const 0 + i32.load offset=1048 + i32.const 2 + i32.ne + br_if 0 (;@1;) + local.get 19 + i32.const 0 + i32.load offset=1024 + i32.add + local.set 19 + end + local.get 19 + local.get 17 + call $mpeg2_variance + local.set 20 + block ;; label = @1 + block ;; label = @2 + i32.const 0 + i32.load offset=1044 + i32.const 1 + i32.ne + br_if 0 (;@2;) + local.get 12 + i32.const 1 + i32.store + br 1 (;@1;) + end + i32.const 0 + local.set 21 + i32.const 0 + i32.load offset=1044 + local.set 22 + local.get 0 + i32.const 0 + i32.load offset=1024 + i32.add + local.set 23 + local.get 2 + i32.const 0 + i32.load offset=1024 + i32.add + local.set 24 + block ;; label = @2 + local.get 22 + i32.const 2 + i32.ne + br_if 0 (;@2;) + block ;; label = @3 + local.get 13 + i32.eqz + br_if 0 (;@3;) + block ;; label = @4 + i32.const 0 + i32.load offset=1048 + i32.const 1 + i32.eq + br_if 0 (;@4;) + local.get 4 + local.set 0 + local.get 5 + local.set 2 + br 1 (;@3;) + end + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.add + local.set 23 + local.get 5 + i32.const 0 + i32.load offset=1024 + i32.add + local.set 24 + end + local.get 0 + local.get 2 + local.get 23 + local.get 24 + local.get 19 + local.get 6 + local.get 7 + local.get 8 + local.get 9 + local.get 14 + local.get 15 + i32.const 108 + i32.add + local.get 15 + i32.const 104 + i32.add + local.get 15 + i32.const 100 + i32.add + local.get 15 + i32.const 96 + i32.add + local.get 15 + i32.const 92 + i32.add + local.get 15 + i32.const 88 + i32.add + local.get 15 + i32.const 84 + i32.add + local.get 15 + i32.const 80 + i32.add + local.get 15 + i32.const 76 + i32.add + local.get 15 + i32.const 72 + i32.add + local.get 15 + i32.const 68 + i32.add + local.get 15 + i32.const 20 + i32.add + local.get 15 + i32.const 16 + i32.add + local.get 15 + i32.const 12 + i32.add + call $mpeg2_field_estimate + i32.const 0 + i32.load offset=1040 + local.set 4 + block ;; label = @3 + local.get 14 + br_if 0 (;@3;) + local.get 4 + i32.const 1 + i32.ne + br_if 0 (;@3;) + local.get 2 + local.get 24 + local.get 19 + local.get 6 + local.get 7 + local.get 15 + i32.load offset=20 + local.get 15 + i32.load offset=16 + local.get 15 + i32.const 64 + i32.add + local.get 15 + i32.const 60 + i32.add + local.get 15 + i32.const 52 + i32.add + local.get 15 + i32.const 56 + i32.add + call $mpeg2_dpfield_estimate + end + i32.const 0 + i32.load offset=1040 + local.set 9 + local.get 15 + i32.load offset=84 + local.set 0 + local.get 15 + i32.load offset=80 + local.set 4 + block ;; label = @3 + block ;; label = @4 + local.get 14 + br_if 0 (;@4;) + local.get 9 + i32.const 1 + i32.ne + br_if 0 (;@4;) + local.get 15 + i32.load offset=52 + local.tee 9 + local.get 4 + i32.ge_s + br_if 0 (;@4;) + local.get 9 + local.get 0 + i32.ge_s + br_if 0 (;@4;) + local.get 12 + i32.const 3 + i32.store offset=4 + local.get 15 + i32.load offset=56 + local.set 4 + br 1 (;@3;) + end + block ;; label = @4 + local.get 4 + local.get 0 + i32.ge_s + br_if 0 (;@4;) + local.get 12 + i32.const 2 + i32.store offset=4 + local.get 24 + local.get 2 + local.get 15 + i32.load offset=72 + select + local.get 15 + i32.load offset=100 + local.tee 4 + i32.const 1 + i32.shr_s + i32.add + local.get 15 + i32.load offset=96 + local.tee 0 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + i32.add + local.get 19 + local.get 17 + local.get 4 + i32.const 1 + i32.and + local.get 0 + i32.const 1 + i32.and + i32.const 8 + call $mpeg2_dist2 + local.get 24 + local.get 2 + local.get 15 + i32.load offset=68 + select + local.get 15 + i32.load offset=92 + local.tee 4 + i32.const 1 + i32.shr_s + i32.add + local.get 15 + i32.load offset=88 + local.tee 0 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + i32.add + local.get 19 + local.get 16 + i32.const 4 + i32.shl + i32.add + local.get 17 + local.get 4 + i32.const 1 + i32.and + local.get 0 + i32.const 1 + i32.and + i32.const 8 + call $mpeg2_dist2 + i32.add + local.set 4 + br 1 (;@3;) + end + local.get 12 + i32.const 1 + i32.store offset=4 + local.get 24 + local.get 2 + local.get 15 + i32.load offset=76 + select + local.get 15 + i32.load offset=108 + local.tee 4 + i32.const 1 + i32.shr_s + i32.add + local.get 15 + i32.load offset=104 + local.tee 0 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + i32.add + local.get 19 + local.get 17 + local.get 4 + i32.const 1 + i32.and + local.get 0 + i32.const 1 + i32.and + i32.const 16 + call $mpeg2_dist2 + local.set 4 + end + block ;; label = @3 + local.get 4 + local.get 20 + i32.le_s + br_if 0 (;@3;) + local.get 4 + i32.const 2304 + i32.lt_s + br_if 0 (;@3;) + local.get 12 + i32.const 1 + i32.store + br 2 (;@1;) + end + block ;; label = @3 + block ;; label = @4 + local.get 14 + br_if 0 (;@4;) + local.get 24 + local.get 2 + i32.const 0 + i32.load offset=1048 + i32.const 2 + i32.eq + select + local.get 6 + i32.add + local.get 18 + i32.add + local.get 19 + local.get 17 + i32.const 0 + i32.const 0 + i32.const 16 + call $mpeg2_dist2 + local.tee 20 + i32.const 2304 + i32.lt_s + br_if 1 (;@3;) + local.get 20 + i32.const 2 + i32.shl + local.get 4 + i32.const 5 + i32.mul + i32.le_s + br_if 1 (;@3;) + end + local.get 12 + i32.const 8 + i32.store + local.get 7 + i32.const 1 + i32.shl + local.set 0 + local.get 6 + i32.const 1 + i32.shl + local.set 14 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 12 + i32.load offset=4 + i32.const -1 + i32.add + br_table 0 (;@6;) 2 (;@4;) 1 (;@5;) 2 (;@4;) + end + local.get 12 + local.get 15 + i32.load offset=76 + i32.store offset=56 + local.get 12 + local.get 15 + i32.load offset=108 + local.get 14 + i32.sub + i32.store offset=24 + local.get 12 + local.get 15 + i32.load offset=104 + local.get 0 + i32.sub + i32.store offset=28 + local.get 4 + local.set 20 + br 4 (;@1;) + end + local.get 12 + local.get 15 + i32.load offset=64 + i32.store offset=72 + local.get 12 + local.get 15 + i32.load offset=60 + i32.store offset=76 + local.get 12 + local.get 15 + i32.load offset=20 + local.get 14 + i32.sub + i32.store offset=24 + local.get 12 + local.get 15 + i32.load offset=16 + local.get 0 + i32.sub + i32.store offset=28 + local.get 4 + local.set 20 + br 3 (;@1;) + end + local.get 12 + local.get 15 + i32.load offset=72 + i32.store offset=56 + local.get 12 + local.get 15 + i32.load offset=68 + i32.store offset=64 + local.get 12 + local.get 15 + i32.load offset=100 + local.get 14 + i32.sub + i32.store offset=24 + local.get 12 + local.get 15 + i32.load offset=96 + local.get 0 + i32.sub + i32.store offset=28 + local.get 12 + local.get 15 + i32.load offset=92 + local.get 14 + i32.sub + i32.store offset=40 + local.get 12 + local.get 15 + i32.load offset=88 + local.get 0 + i32.sub + i32.const -16 + i32.add + i32.store offset=44 + local.get 4 + local.set 20 + br 2 (;@1;) + end + local.get 12 + i64.const 0 + i64.store offset=24 + local.get 12 + i64.const 4294967296 + i64.store + local.get 12 + i32.const 0 + i32.load offset=1048 + i32.const 2 + i32.eq + i32.store offset=56 + br 1 (;@1;) + end + local.get 0 + local.get 2 + local.get 23 + local.get 24 + local.get 19 + local.get 6 + local.get 7 + local.get 8 + local.get 9 + i32.const 0 + local.get 15 + i32.const 108 + i32.add + local.get 15 + i32.const 104 + i32.add + local.get 15 + i32.const 100 + i32.add + local.get 15 + i32.const 96 + i32.add + local.get 15 + i32.const 92 + i32.add + local.get 15 + i32.const 88 + i32.add + local.get 15 + i32.const 84 + i32.add + local.get 15 + i32.const 80 + i32.add + local.get 15 + i32.const 76 + i32.add + local.get 15 + i32.const 72 + i32.add + local.get 15 + i32.const 68 + i32.add + local.get 15 + i32.const 20 + i32.add + local.get 15 + i32.const 16 + i32.add + local.get 15 + i32.const 12 + i32.add + call $mpeg2_field_estimate + local.get 1 + local.get 3 + local.get 1 + i32.const 0 + i32.load offset=1024 + i32.add + local.get 3 + i32.const 0 + i32.load offset=1024 + i32.add + local.get 19 + local.get 6 + local.get 7 + local.get 10 + local.get 11 + i32.const 0 + local.get 15 + i32.const 64 + i32.add + local.get 15 + i32.const 60 + i32.add + local.get 15 + i32.const 56 + i32.add + local.get 15 + i32.const 52 + i32.add + local.get 15 + i32.const 48 + i32.add + local.get 15 + i32.const 44 + i32.add + local.get 15 + i32.const 40 + i32.add + local.get 15 + i32.const 36 + i32.add + local.get 15 + i32.const 32 + i32.add + local.get 15 + i32.const 28 + i32.add + local.get 15 + i32.const 24 + i32.add + local.get 15 + i32.const 20 + i32.add + local.get 15 + i32.const 16 + i32.add + local.get 15 + i32.const 12 + i32.add + call $mpeg2_field_estimate + block ;; label = @2 + local.get 15 + i32.load offset=76 + local.tee 25 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=1024 + local.set 21 + end + local.get 2 + local.get 21 + i32.add + local.get 15 + i32.load offset=108 + local.tee 26 + i32.const 1 + i32.shr_s + local.tee 27 + i32.add + local.get 15 + i32.load offset=104 + local.tee 28 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + local.tee 29 + i32.add + local.set 24 + i32.const 0 + local.set 0 + i32.const 0 + local.set 4 + block ;; label = @2 + local.get 15 + i32.load offset=32 + local.tee 30 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 15 + i32.load offset=60 + local.set 31 + local.get 15 + i32.load offset=64 + local.set 32 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 24 + local.get 28 + i32.const 1 + i32.and + local.tee 33 + local.get 17 + i32.mul + local.tee 34 + i32.add + local.tee 8 + local.get 26 + i32.const 1 + i32.and + local.tee 35 + i32.add + local.set 1 + local.get 3 + local.get 4 + i32.add + local.get 32 + i32.const 1 + i32.shr_s + local.tee 36 + i32.add + local.get 31 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + local.tee 37 + i32.add + local.tee 9 + local.get 32 + i32.const 1 + i32.and + local.tee 38 + i32.add + local.set 13 + local.get 9 + local.get 31 + i32.const 1 + i32.and + local.tee 39 + local.get 17 + i32.mul + local.tee 40 + i32.add + local.tee 11 + local.get 38 + i32.add + local.set 10 + local.get 24 + local.get 35 + i32.add + local.set 5 + i32.const 0 + local.set 18 + local.get 19 + local.set 23 + loop ;; label = @2 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @3 + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 5 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 8 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 23 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 14 + local.get 14 + i32.const 31 + i32.shr_s + local.tee 14 + i32.xor + local.get 14 + i32.sub + local.get 0 + i32.add + local.set 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@3;) + end + local.get 10 + local.get 17 + i32.add + local.set 10 + local.get 11 + local.get 17 + i32.add + local.set 11 + local.get 13 + local.get 17 + i32.add + local.set 13 + local.get 9 + local.get 17 + i32.add + local.set 9 + local.get 1 + local.get 17 + i32.add + local.set 1 + local.get 8 + local.get 17 + i32.add + local.set 8 + local.get 5 + local.get 17 + i32.add + local.set 5 + local.get 24 + local.get 17 + i32.add + local.set 24 + local.get 23 + local.get 17 + i32.add + local.set 23 + local.get 18 + i32.const 1 + i32.add + local.tee 18 + i32.const 16 + i32.ne + br_if 0 (;@2;) + end + i32.const 0 + local.set 4 + i32.const 0 + local.set 14 + block ;; label = @2 + local.get 15 + i32.load offset=72 + local.tee 41 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=1024 + local.set 14 + end + local.get 2 + local.get 14 + i32.add + local.get 15 + i32.load offset=100 + local.tee 42 + i32.const 1 + i32.shr_s + local.tee 43 + i32.add + local.get 15 + i32.load offset=96 + local.tee 44 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + local.tee 45 + i32.add + local.set 9 + block ;; label = @2 + local.get 15 + i32.load offset=28 + local.tee 46 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 15 + i32.load offset=52 + local.set 47 + local.get 15 + i32.load offset=56 + local.set 48 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 9 + local.get 44 + i32.const 1 + i32.and + local.tee 49 + local.get 17 + i32.mul + local.tee 50 + i32.add + local.tee 1 + local.get 42 + i32.const 1 + i32.and + local.tee 51 + i32.add + local.set 13 + local.get 3 + local.get 4 + i32.add + local.get 48 + i32.const 1 + i32.shr_s + local.tee 52 + i32.add + local.get 47 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + local.tee 53 + i32.add + local.tee 8 + local.get 48 + i32.const 1 + i32.and + local.tee 54 + i32.add + local.set 11 + local.get 8 + local.get 47 + i32.const 1 + i32.and + local.tee 55 + local.get 17 + i32.mul + local.tee 56 + i32.add + local.tee 10 + local.get 54 + i32.add + local.set 5 + local.get 9 + local.get 51 + i32.add + local.set 23 + i32.const 0 + local.set 14 + i32.const 0 + local.set 22 + local.get 19 + local.set 18 + loop ;; label = @2 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @3 + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 23 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 8 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 11 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 5 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 24 + local.get 24 + i32.const 31 + i32.shr_s + local.tee 24 + i32.xor + local.get 24 + i32.sub + local.get 14 + i32.add + local.set 14 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@3;) + end + local.get 5 + local.get 17 + i32.add + local.set 5 + local.get 10 + local.get 17 + i32.add + local.set 10 + local.get 11 + local.get 17 + i32.add + local.set 11 + local.get 8 + local.get 17 + i32.add + local.set 8 + local.get 13 + local.get 17 + i32.add + local.set 13 + local.get 1 + local.get 17 + i32.add + local.set 1 + local.get 23 + local.get 17 + i32.add + local.set 23 + local.get 9 + local.get 17 + i32.add + local.set 9 + local.get 18 + local.get 17 + i32.add + local.set 18 + local.get 22 + i32.const 1 + i32.add + local.tee 22 + i32.const 8 + i32.ne + br_if 0 (;@2;) + end + i32.const 0 + local.set 4 + i32.const 0 + local.set 24 + block ;; label = @2 + local.get 15 + i32.load offset=68 + local.tee 57 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=1024 + local.set 24 + end + local.get 2 + local.get 24 + i32.add + local.get 15 + i32.load offset=92 + local.tee 58 + i32.const 1 + i32.shr_s + local.tee 59 + i32.add + local.get 15 + i32.load offset=88 + local.tee 60 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + local.tee 61 + i32.add + local.set 8 + block ;; label = @2 + local.get 15 + i32.load offset=24 + local.tee 62 + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 15 + i32.load offset=44 + local.set 63 + local.get 15 + i32.load offset=48 + local.set 64 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 8 + local.get 60 + i32.const 1 + i32.and + local.tee 65 + local.get 17 + i32.mul + local.tee 66 + i32.add + local.tee 13 + local.get 58 + i32.const 1 + i32.and + local.tee 67 + i32.add + local.set 11 + local.get 3 + local.get 4 + i32.add + local.get 64 + i32.const 1 + i32.shr_s + local.tee 68 + i32.add + local.get 63 + i32.const 1 + i32.shr_s + local.get 17 + i32.mul + local.tee 69 + i32.add + local.tee 1 + local.get 64 + i32.const 1 + i32.and + local.tee 70 + i32.add + local.set 10 + local.get 1 + local.get 63 + i32.const 1 + i32.and + local.tee 71 + local.get 17 + i32.mul + local.tee 72 + i32.add + local.tee 5 + local.get 70 + i32.add + local.set 23 + local.get 8 + local.get 67 + i32.add + local.set 18 + i32.const 0 + local.set 24 + i32.const 0 + local.set 21 + local.get 19 + local.get 16 + i32.const 4 + i32.shl + i32.add + local.tee 16 + local.set 22 + loop ;; label = @2 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @3 + local.get 8 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 18 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 5 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 23 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 22 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 24 + i32.add + local.set 24 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@3;) + end + local.get 23 + local.get 17 + i32.add + local.set 23 + local.get 5 + local.get 17 + i32.add + local.set 5 + local.get 10 + local.get 17 + i32.add + local.set 10 + local.get 1 + local.get 17 + i32.add + local.set 1 + local.get 11 + local.get 17 + i32.add + local.set 11 + local.get 13 + local.get 17 + i32.add + local.set 13 + local.get 18 + local.get 17 + i32.add + local.set 18 + local.get 8 + local.get 17 + i32.add + local.set 8 + local.get 22 + local.get 17 + i32.add + local.set 22 + local.get 21 + i32.const 1 + i32.add + local.tee 21 + i32.const 8 + i32.ne + br_if 0 (;@2;) + end + local.get 15 + i32.load offset=36 + local.set 1 + local.get 15 + i32.load offset=40 + local.set 8 + local.get 15 + i32.load offset=80 + local.set 9 + local.get 15 + i32.load offset=84 + local.set 4 + block ;; label = @2 + block ;; label = @3 + local.get 0 + local.get 24 + local.get 14 + i32.add + local.tee 14 + i32.ge_s + br_if 0 (;@3;) + local.get 0 + local.get 4 + i32.ge_s + br_if 0 (;@3;) + local.get 0 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 0 + local.get 8 + i32.ge_s + br_if 0 (;@3;) + local.get 0 + local.get 1 + i32.ge_s + br_if 0 (;@3;) + local.get 12 + i64.const 4294967309 + i64.store + i32.const 0 + local.set 4 + i32.const 0 + local.set 0 + block ;; label = @4 + local.get 25 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 0 + end + local.get 2 + local.get 0 + i32.add + local.get 27 + i32.add + local.get 29 + i32.add + local.set 24 + block ;; label = @4 + local.get 30 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 24 + local.get 35 + i32.add + local.set 8 + local.get 24 + local.get 34 + i32.add + local.tee 1 + local.get 35 + i32.add + local.set 13 + local.get 3 + local.get 4 + i32.add + local.get 36 + i32.add + local.get 37 + i32.add + local.tee 9 + local.get 38 + i32.add + local.set 11 + local.get 9 + local.get 40 + i32.add + local.tee 10 + local.get 38 + i32.add + local.set 5 + i32.const 0 + local.set 0 + i32.const 0 + local.set 23 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 8 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 11 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 5 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 19 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 14 + local.get 14 + i32.mul + local.get 0 + i32.add + local.set 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 5 + local.get 17 + i32.add + local.set 5 + local.get 10 + local.get 17 + i32.add + local.set 10 + local.get 11 + local.get 17 + i32.add + local.set 11 + local.get 9 + local.get 17 + i32.add + local.set 9 + local.get 13 + local.get 17 + i32.add + local.set 13 + local.get 1 + local.get 17 + i32.add + local.set 1 + local.get 8 + local.get 17 + i32.add + local.set 8 + local.get 24 + local.get 17 + i32.add + local.set 24 + local.get 19 + local.get 17 + i32.add + local.set 19 + local.get 23 + i32.const 1 + i32.add + local.tee 23 + i32.const 16 + i32.ne + br_if 0 (;@4;) + br 2 (;@2;) + end + end + block ;; label = @3 + local.get 14 + local.get 4 + i32.ge_s + br_if 0 (;@3;) + local.get 14 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 14 + local.get 8 + i32.ge_s + br_if 0 (;@3;) + local.get 14 + local.get 1 + i32.ge_s + br_if 0 (;@3;) + local.get 12 + i64.const 8589934604 + i64.store + i32.const 0 + local.set 4 + i32.const 0 + local.set 0 + block ;; label = @4 + local.get 41 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 0 + end + local.get 2 + local.get 0 + i32.add + local.get 43 + i32.add + local.get 45 + i32.add + local.set 24 + block ;; label = @4 + local.get 46 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 24 + local.get 51 + i32.add + local.set 8 + local.get 24 + local.get 50 + i32.add + local.tee 1 + local.get 51 + i32.add + local.set 13 + local.get 3 + local.get 4 + i32.add + local.get 52 + i32.add + local.get 53 + i32.add + local.tee 9 + local.get 54 + i32.add + local.set 11 + local.get 9 + local.get 56 + i32.add + local.tee 10 + local.get 54 + i32.add + local.set 5 + i32.const 0 + local.set 0 + i32.const 0 + local.set 23 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 24 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 8 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 11 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 5 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 19 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 14 + local.get 14 + i32.mul + local.get 0 + i32.add + local.set 0 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 5 + local.get 17 + i32.add + local.set 5 + local.get 10 + local.get 17 + i32.add + local.set 10 + local.get 11 + local.get 17 + i32.add + local.set 11 + local.get 9 + local.get 17 + i32.add + local.set 9 + local.get 13 + local.get 17 + i32.add + local.set 13 + local.get 1 + local.get 17 + i32.add + local.set 1 + local.get 8 + local.get 17 + i32.add + local.set 8 + local.get 24 + local.get 17 + i32.add + local.set 24 + local.get 19 + local.get 17 + i32.add + local.set 19 + local.get 23 + i32.const 1 + i32.add + local.tee 23 + i32.const 8 + i32.ne + br_if 0 (;@4;) + end + i32.const 0 + local.set 4 + i32.const 0 + local.set 14 + block ;; label = @4 + local.get 57 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 14 + end + local.get 2 + local.get 14 + i32.add + local.get 59 + i32.add + local.get 61 + i32.add + local.set 9 + block ;; label = @4 + local.get 62 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 9 + local.get 67 + i32.add + local.set 1 + local.get 9 + local.get 66 + i32.add + local.tee 13 + local.get 67 + i32.add + local.set 11 + local.get 3 + local.get 4 + i32.add + local.get 68 + i32.add + local.get 69 + i32.add + local.tee 8 + local.get 70 + i32.add + local.set 10 + local.get 8 + local.get 72 + i32.add + local.tee 5 + local.get 70 + i32.add + local.set 23 + i32.const 0 + local.set 14 + i32.const 0 + local.set 18 + loop ;; label = @4 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 4 + loop ;; label = @5 + local.get 9 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 1 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 13 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 8 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 10 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 5 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 23 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 16 + local.get 4 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 24 + local.get 24 + i32.mul + local.get 14 + i32.add + local.set 14 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@5;) + end + local.get 23 + local.get 17 + i32.add + local.set 23 + local.get 5 + local.get 17 + i32.add + local.set 5 + local.get 10 + local.get 17 + i32.add + local.set 10 + local.get 8 + local.get 17 + i32.add + local.set 8 + local.get 11 + local.get 17 + i32.add + local.set 11 + local.get 13 + local.get 17 + i32.add + local.set 13 + local.get 1 + local.get 17 + i32.add + local.set 1 + local.get 9 + local.get 17 + i32.add + local.set 9 + local.get 16 + local.get 17 + i32.add + local.set 16 + local.get 18 + i32.const 1 + i32.add + local.tee 18 + i32.const 8 + i32.ne + br_if 0 (;@4;) + end + local.get 14 + local.get 0 + i32.add + local.set 0 + br 1 (;@2;) + end + block ;; label = @3 + local.get 4 + local.get 9 + i32.ge_s + br_if 0 (;@3;) + local.get 4 + local.get 8 + i32.ge_s + br_if 0 (;@3;) + local.get 4 + local.get 1 + i32.ge_s + br_if 0 (;@3;) + local.get 12 + i64.const 4294967304 + i64.store + block ;; label = @4 + block ;; label = @5 + local.get 25 + br_if 0 (;@5;) + i32.const 0 + local.set 4 + br 1 (;@4;) + end + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 2 + local.get 4 + i32.add + local.get 27 + i32.add + local.get 29 + i32.add + local.get 19 + local.get 17 + local.get 35 + local.get 33 + i32.const 16 + call $mpeg2_dist2 + local.set 0 + br 1 (;@2;) + end + block ;; label = @3 + local.get 9 + local.get 8 + i32.ge_s + br_if 0 (;@3;) + local.get 9 + local.get 1 + i32.ge_s + br_if 0 (;@3;) + local.get 12 + i64.const 8589934600 + i64.store + i32.const 0 + local.set 4 + i32.const 0 + local.set 0 + block ;; label = @4 + local.get 41 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 0 + end + local.get 2 + local.get 0 + i32.add + local.get 43 + i32.add + local.get 45 + i32.add + local.get 19 + local.get 17 + local.get 51 + local.get 49 + i32.const 8 + call $mpeg2_dist2 + local.set 0 + block ;; label = @4 + local.get 57 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 2 + local.get 4 + i32.add + local.get 59 + i32.add + local.get 61 + i32.add + local.get 16 + local.get 17 + local.get 67 + local.get 65 + i32.const 8 + call $mpeg2_dist2 + local.get 0 + i32.add + local.set 0 + br 1 (;@2;) + end + local.get 12 + i32.const 4 + i32.store + block ;; label = @3 + local.get 8 + local.get 1 + i32.ge_s + br_if 0 (;@3;) + local.get 12 + i32.const 1 + i32.store offset=4 + block ;; label = @4 + block ;; label = @5 + local.get 30 + br_if 0 (;@5;) + i32.const 0 + local.set 4 + br 1 (;@4;) + end + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 3 + local.get 4 + i32.add + local.get 36 + i32.add + local.get 37 + i32.add + local.get 19 + local.get 17 + local.get 38 + local.get 39 + i32.const 16 + call $mpeg2_dist2 + local.set 0 + br 1 (;@2;) + end + local.get 12 + i32.const 2 + i32.store offset=4 + i32.const 0 + local.set 4 + i32.const 0 + local.set 0 + block ;; label = @3 + local.get 46 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 0 + end + local.get 3 + local.get 0 + i32.add + local.get 52 + i32.add + local.get 53 + i32.add + local.get 19 + local.get 17 + local.get 54 + local.get 55 + i32.const 8 + call $mpeg2_dist2 + local.set 0 + block ;; label = @3 + local.get 62 + i32.eqz + br_if 0 (;@3;) + i32.const 0 + i32.load offset=1024 + local.set 4 + end + local.get 3 + local.get 4 + i32.add + local.get 68 + i32.add + local.get 69 + i32.add + local.get 16 + local.get 17 + local.get 70 + local.get 71 + i32.const 8 + call $mpeg2_dist2 + local.get 0 + i32.add + local.set 0 + end + block ;; label = @2 + local.get 0 + local.get 20 + i32.le_s + br_if 0 (;@2;) + local.get 0 + i32.const 2304 + i32.lt_s + br_if 0 (;@2;) + local.get 12 + i32.const 1 + i32.store + br 1 (;@1;) + end + local.get 7 + i32.const 1 + i32.shl + local.set 14 + local.get 6 + i32.const 1 + i32.shl + local.set 4 + block ;; label = @2 + block ;; label = @3 + local.get 12 + i32.load offset=4 + i32.const 1 + i32.ne + br_if 0 (;@3;) + local.get 12 + local.get 25 + i32.store offset=56 + local.get 12 + local.get 30 + i32.store offset=60 + local.get 12 + local.get 28 + local.get 14 + i32.sub + i32.store offset=28 + local.get 12 + local.get 26 + local.get 4 + i32.sub + i32.store offset=24 + local.get 12 + local.get 31 + local.get 14 + i32.sub + i32.store offset=36 + local.get 12 + local.get 32 + local.get 4 + i32.sub + i32.store offset=32 + br 1 (;@2;) + end + local.get 12 + local.get 41 + i32.store offset=56 + local.get 12 + local.get 57 + i32.store offset=64 + local.get 12 + local.get 46 + i32.store offset=60 + local.get 12 + local.get 62 + i32.store offset=68 + local.get 12 + local.get 44 + local.get 14 + i32.sub + i32.store offset=28 + local.get 12 + local.get 42 + local.get 4 + i32.sub + i32.store offset=24 + local.get 12 + local.get 58 + local.get 4 + i32.sub + i32.store offset=40 + local.get 12 + local.get 47 + local.get 14 + i32.sub + i32.store offset=36 + local.get 12 + local.get 48 + local.get 4 + i32.sub + i32.store offset=32 + local.get 12 + local.get 64 + local.get 4 + i32.sub + i32.store offset=48 + local.get 12 + local.get 60 + local.get 14 + i32.const 16 + i32.add + local.tee 4 + i32.sub + i32.store offset=44 + local.get 12 + local.get 63 + local.get 4 + i32.sub + i32.store offset=52 + end + local.get 0 + local.set 20 + end + local.get 12 + local.get 20 + i32.store offset=88 + local.get 15 + i32.const 112 + i32.add + global.set $__stack_pointer) + (func $mpeg2_variance (type 6) (param i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const 0 + local.set 2 + i32.const 16 + local.set 3 + i32.const 0 + local.set 4 + loop ;; label = @1 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 4 + local.get 0 + i32.load8_u + local.tee 5 + i32.add + local.get 0 + i32.load8_u offset=1 + local.tee 6 + i32.add + local.get 0 + i32.load8_u offset=2 + local.tee 7 + i32.add + local.get 0 + i32.load8_u offset=3 + local.tee 8 + i32.add + local.get 0 + i32.load8_u offset=4 + local.tee 9 + i32.add + local.get 0 + i32.load8_u offset=5 + local.tee 10 + i32.add + local.get 0 + i32.load8_u offset=6 + local.tee 11 + i32.add + local.get 0 + i32.load8_u offset=7 + local.tee 12 + i32.add + local.get 0 + i32.load8_u offset=8 + local.tee 13 + i32.add + local.get 0 + i32.load8_u offset=9 + local.tee 14 + i32.add + local.get 0 + i32.load8_u offset=10 + local.tee 15 + i32.add + local.get 0 + i32.load8_u offset=11 + local.tee 16 + i32.add + local.get 0 + i32.load8_u offset=12 + local.tee 17 + i32.add + local.get 0 + i32.load8_u offset=13 + local.tee 18 + i32.add + local.get 0 + i32.load8_u offset=14 + local.tee 19 + i32.add + local.get 0 + i32.load8_u offset=15 + local.tee 20 + i32.add + local.set 4 + local.get 20 + local.get 20 + i32.mul + local.get 19 + local.get 19 + i32.mul + local.get 18 + local.get 18 + i32.mul + local.get 17 + local.get 17 + i32.mul + local.get 16 + local.get 16 + i32.mul + local.get 15 + local.get 15 + i32.mul + local.get 14 + local.get 14 + i32.mul + local.get 13 + local.get 13 + i32.mul + local.get 12 + local.get 12 + i32.mul + local.get 11 + local.get 11 + i32.mul + local.get 10 + local.get 10 + i32.mul + local.get 9 + local.get 9 + i32.mul + local.get 8 + local.get 8 + i32.mul + local.get 7 + local.get 7 + i32.mul + local.get 6 + local.get 6 + i32.mul + local.get 5 + local.get 5 + i32.mul + local.get 2 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 2 + local.get 0 + local.get 1 + i32.add + local.set 0 + local.get 3 + i32.const -1 + i32.add + local.tee 3 + br_if 0 (;@1;) + end + local.get 2 + local.get 4 + local.get 4 + i32.mul + i32.const 8 + i32.shr_u + i32.sub) + (func $mpeg2_fullsearch (type 7) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 65536 + local.set 13 + local.get 0 + local.get 4 + i32.add + local.get 5 + local.get 3 + i32.mul + i32.add + local.get 2 + local.get 3 + i32.const 0 + i32.const 0 + local.get 8 + i32.const 65536 + call $mpeg2_dist1 + local.set 14 + i32.const 3 + i32.const 7 + call $__pragma_loopbound + local.get 10 + local.get 8 + i32.sub + local.set 15 + local.get 9 + i32.const -16 + i32.add + local.set 16 + block ;; label = @1 + block ;; label = @2 + local.get 6 + local.get 7 + local.get 6 + local.get 7 + i32.gt_s + select + local.tee 17 + i32.const 1 + i32.ge_s + br_if 0 (;@2;) + local.get 4 + local.set 18 + local.get 5 + local.set 19 + br 1 (;@1;) + end + local.get 7 + local.get 5 + i32.add + local.tee 10 + local.get 15 + local.get 10 + local.get 15 + i32.lt_s + select + local.set 20 + local.get 5 + local.get 7 + i32.sub + local.tee 7 + i32.const 0 + local.get 7 + i32.const 0 + i32.gt_s + select + local.set 21 + local.get 6 + local.get 4 + i32.add + local.tee 7 + local.get 16 + local.get 7 + local.get 16 + i32.lt_s + select + local.set 22 + local.get 4 + local.get 6 + i32.sub + local.tee 7 + i32.const 0 + local.get 7 + i32.const 0 + i32.gt_s + select + local.set 23 + block ;; label = @2 + local.get 8 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + i32.const 8 + local.set 24 + i32.const 1 + local.set 25 + local.get 5 + local.set 19 + local.get 4 + local.set 18 + loop ;; label = @3 + i32.const 8 + i32.const 56 + call $__pragma_loopbound + local.get 24 + i32.const 1 + local.get 24 + i32.const 1 + i32.gt_u + select + local.set 9 + local.get 25 + i32.const 6 + i32.mul + local.set 26 + local.get 25 + i32.const 2 + i32.shl + local.set 27 + local.get 25 + i32.const 1 + i32.shl + local.set 28 + local.get 5 + local.get 25 + i32.sub + local.set 10 + local.get 4 + local.get 25 + i32.sub + local.set 6 + i32.const 0 + local.set 7 + loop ;; label = @4 + block ;; label = @5 + local.get 6 + local.get 23 + i32.lt_s + br_if 0 (;@5;) + local.get 6 + local.get 22 + i32.gt_s + br_if 0 (;@5;) + local.get 10 + local.get 21 + i32.lt_s + br_if 0 (;@5;) + local.get 10 + local.get 20 + i32.gt_s + br_if 0 (;@5;) + i32.const 0 + i32.const 16 + call $__pragma_loopbound + local.get 14 + i32.const 1 + i32.lt_s + br_if 0 (;@5;) + i32.const 0 + local.set 14 + local.get 6 + local.set 18 + local.get 10 + local.set 19 + end + block ;; label = @5 + block ;; label = @6 + local.get 7 + local.get 28 + i32.ge_u + br_if 0 (;@6;) + local.get 6 + i32.const 1 + i32.add + local.set 6 + br 1 (;@5;) + end + block ;; label = @6 + local.get 7 + local.get 27 + i32.ge_u + br_if 0 (;@6;) + local.get 10 + i32.const 1 + i32.add + local.set 10 + br 1 (;@5;) + end + block ;; label = @6 + local.get 7 + local.get 26 + i32.ge_u + br_if 0 (;@6;) + local.get 6 + i32.const -1 + i32.add + local.set 6 + br 1 (;@5;) + end + local.get 10 + i32.const -1 + i32.add + local.set 10 + end + local.get 9 + local.get 7 + i32.const 1 + i32.add + local.tee 7 + i32.ne + br_if 0 (;@4;) + end + local.get 24 + i32.const 8 + i32.add + local.set 24 + local.get 25 + local.get 17 + i32.ne + local.set 7 + local.get 25 + i32.const 1 + i32.add + local.set 25 + local.get 7 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 8 + local.set 29 + i32.const 1 + local.set 30 + local.get 5 + local.set 19 + local.get 4 + local.set 18 + loop ;; label = @2 + i32.const 8 + i32.const 56 + call $__pragma_loopbound + local.get 29 + i32.const 1 + local.get 29 + i32.const 1 + i32.gt_u + select + local.set 31 + local.get 30 + i32.const 6 + i32.mul + local.set 32 + local.get 30 + i32.const 2 + i32.shl + local.set 33 + local.get 30 + i32.const 1 + i32.shl + local.set 34 + local.get 5 + local.get 30 + i32.sub + local.set 35 + local.get 4 + local.get 30 + i32.sub + local.set 25 + i32.const 0 + local.set 24 + loop ;; label = @3 + block ;; label = @4 + local.get 25 + local.get 23 + i32.lt_s + br_if 0 (;@4;) + local.get 25 + local.get 22 + i32.gt_s + br_if 0 (;@4;) + local.get 35 + local.get 21 + i32.lt_s + br_if 0 (;@4;) + local.get 35 + local.get 20 + i32.gt_s + br_if 0 (;@4;) + i32.const 0 + local.set 10 + i32.const 0 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 25 + i32.add + local.get 35 + local.get 3 + i32.mul + i32.add + local.set 26 + local.get 8 + local.set 27 + i32.const 0 + local.set 9 + loop ;; label = @5 + local.get 26 + local.get 10 + i32.add + local.tee 7 + i32.load8_u + local.get 2 + local.get 10 + i32.add + local.tee 6 + i32.load8_u + i32.sub + local.tee 28 + local.get 28 + i32.const 31 + i32.shr_s + local.tee 28 + i32.xor + local.get 28 + i32.sub + local.get 9 + i32.add + local.get 7 + i32.const 1 + i32.add + i32.load8_u + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 2 + i32.add + i32.load8_u + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 3 + i32.add + i32.load8_u + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 4 + i32.add + i32.load8_u + local.get 6 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 5 + i32.add + i32.load8_u + local.get 6 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 6 + i32.add + i32.load8_u + local.get 6 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 7 + i32.add + i32.load8_u + local.get 6 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 8 + i32.add + i32.load8_u + local.get 6 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 9 + i32.add + i32.load8_u + local.get 6 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 10 + i32.add + i32.load8_u + local.get 6 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 11 + i32.add + i32.load8_u + local.get 6 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 12 + i32.add + i32.load8_u + local.get 6 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 13 + i32.add + i32.load8_u + local.get 6 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 14 + i32.add + i32.load8_u + local.get 6 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + i32.add + local.get 7 + i32.const 15 + i32.add + i32.load8_u + local.get 6 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 7 + local.get 7 + i32.const 31 + i32.shr_s + local.tee 7 + i32.xor + local.get 7 + i32.sub + i32.add + local.tee 9 + local.get 14 + i32.ge_s + br_if 1 (;@4;) + local.get 10 + local.get 3 + i32.add + local.set 10 + local.get 27 + i32.const -1 + i32.add + local.tee 27 + br_if 0 (;@5;) + end + local.get 25 + local.set 18 + local.get 35 + local.set 19 + local.get 9 + local.set 14 + end + block ;; label = @4 + block ;; label = @5 + local.get 24 + local.get 34 + i32.lt_u + br_if 0 (;@5;) + block ;; label = @6 + local.get 24 + local.get 33 + i32.lt_u + br_if 0 (;@6;) + block ;; label = @7 + local.get 24 + local.get 32 + i32.lt_u + br_if 0 (;@7;) + local.get 35 + i32.const -1 + i32.add + local.set 35 + br 3 (;@4;) + end + local.get 25 + i32.const -1 + i32.add + local.set 25 + br 2 (;@4;) + end + local.get 35 + i32.const 1 + i32.add + local.set 35 + br 1 (;@4;) + end + local.get 25 + i32.const 1 + i32.add + local.set 25 + end + local.get 24 + i32.const 1 + i32.add + local.tee 24 + local.get 31 + i32.ne + br_if 0 (;@3;) + end + local.get 29 + i32.const 8 + i32.add + local.set 29 + local.get 30 + local.get 17 + i32.eq + local.set 7 + local.get 30 + i32.const 1 + i32.add + local.set 30 + local.get 7 + i32.eqz + br_if 0 (;@2;) + end + end + i32.const 2 + i32.const 3 + call $__pragma_loopbound + local.get 18 + i32.const 1 + i32.shl + local.set 9 + block ;; label = @1 + local.get 19 + i32.const 1 + i32.shl + local.tee 10 + local.get 10 + i32.const 0 + i32.gt_s + local.tee 7 + i32.sub + local.tee 28 + local.get 10 + local.get 10 + local.get 15 + i32.const 1 + i32.shl + i32.lt_s + local.tee 6 + i32.or + local.tee 25 + i32.gt_s + br_if 0 (;@1;) + block ;; label = @2 + local.get 9 + local.get 9 + i32.const 0 + i32.gt_s + i32.sub + local.tee 24 + local.get 9 + local.get 9 + local.get 16 + i32.const 1 + i32.shl + i32.lt_s + i32.or + local.tee 26 + i32.gt_s + br_if 0 (;@2;) + i32.const 65536 + local.set 13 + loop ;; label = @3 + i32.const 2 + i32.const 3 + call $__pragma_loopbound + local.get 28 + i32.const 1 + i32.and + local.set 27 + local.get 1 + local.get 28 + i32.const 1 + i32.shr_s + local.get 3 + i32.mul + i32.add + local.set 14 + local.get 24 + local.set 7 + loop ;; label = @4 + local.get 14 + local.get 7 + i32.const 1 + i32.shr_s + i32.add + local.get 2 + local.get 3 + local.get 7 + i32.const 1 + i32.and + local.get 27 + local.get 8 + local.get 13 + call $mpeg2_dist1 + local.tee 6 + local.get 13 + local.get 6 + local.get 13 + i32.lt_s + local.tee 6 + select + local.set 13 + local.get 28 + local.get 10 + local.get 6 + select + local.set 10 + local.get 7 + local.get 9 + local.get 6 + select + local.set 9 + local.get 7 + local.get 26 + i32.lt_s + local.set 6 + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 6 + br_if 0 (;@4;) + end + local.get 28 + local.get 25 + i32.ne + local.set 7 + local.get 28 + i32.const 1 + i32.add + local.set 28 + local.get 7 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + local.get 6 + i32.const -1 + i32.const 0 + local.get 7 + select + i32.sub + i32.const 1 + i32.add + local.set 7 + loop ;; label = @2 + i32.const 2 + i32.const 3 + call $__pragma_loopbound + local.get 7 + i32.const -1 + i32.add + local.tee 7 + br_if 0 (;@2;) + end + end + local.get 11 + local.get 9 + i32.store + local.get 12 + local.get 10 + i32.store + local.get 13) + (func $mpeg2_dist2 (type 8) (param i32 i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 4 + local.get 3 + i32.or + br_if 0 (;@2;) + i32.const 8 + i32.const 16 + call $__pragma_loopbound + block ;; label = @3 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + i32.const 0 + return + end + i32.const 0 + local.set 6 + i32.const 0 + local.set 7 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 6 + i32.add + local.tee 3 + i32.const 15 + i32.add + i32.load8_u + local.get 1 + local.get 6 + i32.add + local.tee 4 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.get 4 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.get 4 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.get 4 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.get 4 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.get 4 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.get 4 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.get 4 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.get 4 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.get 4 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.get 4 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.get 4 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.get 4 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.get 4 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.get 4 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.load8_u + local.get 4 + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.mul + local.get 7 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 7 + local.get 6 + local.get 2 + i32.add + local.set 6 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + block ;; label = @2 + local.get 3 + i32.eqz + br_if 0 (;@2;) + local.get 4 + br_if 0 (;@2;) + i32.const 8 + i32.const 16 + call $__pragma_loopbound + block ;; label = @3 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + i32.const 0 + return + end + i32.const 0 + local.set 6 + i32.const 0 + local.set 7 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 6 + i32.add + local.tee 3 + i32.const 15 + i32.add + i32.load8_u + local.tee 8 + local.get 3 + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 1 + local.get 6 + i32.add + local.tee 4 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.tee 9 + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 8 + local.get 8 + i32.mul + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.tee 8 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.load8_u + local.get 8 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 4 + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.mul + local.get 7 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 7 + local.get 6 + local.get 2 + i32.add + local.set 6 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 8 + i32.const 16 + call $__pragma_loopbound + block ;; label = @2 + local.get 3 + br_if 0 (;@2;) + local.get 4 + i32.eqz + br_if 0 (;@2;) + block ;; label = @3 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + i32.const 0 + return + end + local.get 0 + local.get 2 + i32.add + local.set 10 + i32.const 0 + local.set 8 + i32.const 0 + local.set 7 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 8 + i32.add + local.tee 3 + i32.const 15 + i32.add + i32.load8_u + local.get 10 + local.get 8 + i32.add + local.tee 4 + i32.const 15 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 1 + local.get 8 + i32.add + local.tee 6 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.get 4 + i32.const 14 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.get 4 + i32.const 13 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.get 4 + i32.const 12 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.get 4 + i32.const 11 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.get 4 + i32.const 10 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.get 4 + i32.const 9 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.get 4 + i32.const 8 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.get 4 + i32.const 7 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.get 4 + i32.const 6 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.get 4 + i32.const 5 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.get 4 + i32.const 4 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.get 4 + i32.const 3 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.get 4 + i32.const 2 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.get 4 + i32.const 1 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.load8_u + local.get 4 + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 6 + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.mul + local.get 7 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 7 + local.get 8 + local.get 2 + i32.add + local.set 8 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + block ;; label = @2 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@2;) + i32.const 0 + return + end + local.get 0 + local.get 2 + i32.add + local.set 11 + i32.const 0 + local.set 8 + i32.const 0 + local.set 7 + loop ;; label = @2 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 8 + i32.add + local.tee 3 + i32.const 15 + i32.add + i32.load8_u + local.tee 9 + local.get 3 + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 8 + i32.add + local.tee 4 + i32.const 15 + i32.add + i32.load8_u + local.tee 10 + i32.add + local.get 4 + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 1 + local.get 8 + i32.add + local.tee 6 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 12 + local.get 12 + i32.mul + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.tee 12 + local.get 9 + i32.add + local.get 4 + i32.const 14 + i32.add + i32.load8_u + local.tee 9 + i32.add + local.get 10 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 10 + local.get 10 + i32.mul + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.tee 10 + local.get 12 + i32.add + local.get 4 + i32.const 13 + i32.add + i32.load8_u + local.tee 12 + i32.add + local.get 9 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.tee 9 + local.get 10 + i32.add + local.get 4 + i32.const 12 + i32.add + i32.load8_u + local.tee 10 + i32.add + local.get 12 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 12 + local.get 12 + i32.mul + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.tee 12 + local.get 9 + i32.add + local.get 4 + i32.const 11 + i32.add + i32.load8_u + local.tee 9 + i32.add + local.get 10 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 10 + local.get 10 + i32.mul + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.tee 10 + local.get 12 + i32.add + local.get 4 + i32.const 10 + i32.add + i32.load8_u + local.tee 12 + i32.add + local.get 9 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.tee 9 + local.get 10 + i32.add + local.get 4 + i32.const 9 + i32.add + i32.load8_u + local.tee 10 + i32.add + local.get 12 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 12 + local.get 12 + i32.mul + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.tee 12 + local.get 9 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.load8_u + local.tee 9 + i32.add + local.get 10 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 10 + local.get 10 + i32.mul + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.tee 10 + local.get 12 + i32.add + local.get 4 + i32.const 7 + i32.add + i32.load8_u + local.tee 12 + i32.add + local.get 9 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.tee 9 + local.get 10 + i32.add + local.get 4 + i32.const 6 + i32.add + i32.load8_u + local.tee 10 + i32.add + local.get 12 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 12 + local.get 12 + i32.mul + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.tee 12 + local.get 9 + i32.add + local.get 4 + i32.const 5 + i32.add + i32.load8_u + local.tee 9 + i32.add + local.get 10 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 10 + local.get 10 + i32.mul + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.tee 10 + local.get 12 + i32.add + local.get 4 + i32.const 4 + i32.add + i32.load8_u + local.tee 12 + i32.add + local.get 9 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.tee 9 + local.get 10 + i32.add + local.get 4 + i32.const 3 + i32.add + i32.load8_u + local.tee 10 + i32.add + local.get 12 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 12 + local.get 12 + i32.mul + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.tee 12 + local.get 9 + i32.add + local.get 4 + i32.const 2 + i32.add + i32.load8_u + local.tee 9 + i32.add + local.get 10 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 10 + local.get 10 + i32.mul + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.tee 10 + local.get 12 + i32.add + local.get 4 + i32.const 1 + i32.add + i32.load8_u + local.tee 12 + i32.add + local.get 9 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.mul + local.get 3 + i32.load8_u + local.get 10 + i32.add + local.get 4 + i32.load8_u + i32.add + local.get 12 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 6 + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.mul + local.get 7 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 7 + local.get 8 + local.get 2 + i32.add + local.set 8 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@2;) + end + end + local.get 7) + (func $mpeg2_frame_estimate (type 9) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 19 + global.set $__stack_pointer + local.get 13 + local.get 0 + local.get 1 + local.get 2 + i32.const 0 + i32.load offset=1024 + local.get 3 + local.get 4 + local.get 5 + local.get 6 + i32.const 16 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + local.get 7 + local.get 8 + call $mpeg2_fullsearch + i32.store + i32.const 1 + local.set 20 + local.get 0 + local.get 1 + local.get 2 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 3 + local.get 4 + i32.const 1 + i32.shr_s + local.tee 4 + local.get 5 + local.get 6 + i32.const 1 + i32.shr_s + local.tee 6 + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 19 + i32.const 12 + i32.add + local.get 19 + i32.const 4 + i32.add + call $mpeg2_fullsearch + local.set 13 + local.get 0 + i32.const 0 + i32.load offset=1024 + i32.add + local.get 1 + i32.const 0 + i32.load offset=1024 + i32.add + local.get 2 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 3 + local.get 4 + local.get 5 + local.get 6 + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 19 + i32.const 8 + i32.add + local.get 19 + call $mpeg2_fullsearch + local.set 8 + local.get 17 + local.get 19 + i32.load offset=12 + local.tee 21 + i32.store + local.get 18 + local.get 19 + i32.load offset=4 + local.tee 22 + i32.store + local.get 17 + local.get 19 + i32.load offset=8 + local.tee 23 + i32.store offset=8 + local.get 18 + local.get 19 + i32.load + local.tee 24 + i32.store offset=8 + local.get 9 + local.get 23 + local.get 21 + local.get 13 + local.get 8 + i32.gt_s + local.tee 7 + select + i32.store + local.get 10 + local.get 24 + local.get 22 + local.get 7 + select + i32.store + local.get 15 + local.get 7 + i32.store + local.get 0 + local.get 1 + local.get 2 + i32.const 0 + i32.load offset=1024 + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 3 + local.get 4 + local.get 5 + local.get 6 + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 19 + i32.const 12 + i32.add + local.get 19 + i32.const 4 + i32.add + call $mpeg2_fullsearch + local.set 7 + local.get 0 + i32.const 0 + i32.load offset=1024 + i32.add + local.get 1 + i32.const 0 + i32.load offset=1024 + i32.add + local.get 2 + i32.const 0 + i32.load offset=1024 + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 3 + local.get 4 + local.get 5 + local.get 6 + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 19 + i32.const 8 + i32.add + local.get 19 + call $mpeg2_fullsearch + local.set 5 + local.get 17 + local.get 19 + i32.load offset=12 + local.tee 1 + i32.store offset=4 + local.get 18 + local.get 19 + i32.load offset=4 + local.tee 0 + i32.store offset=4 + local.get 17 + local.get 19 + i32.load offset=8 + local.tee 3 + i32.store offset=12 + local.get 18 + local.get 19 + i32.load + local.tee 2 + i32.store offset=12 + block ;; label = @1 + local.get 5 + local.get 7 + i32.le_s + br_if 0 (;@1;) + local.get 0 + local.set 2 + local.get 1 + local.set 3 + i32.const 0 + local.set 20 + local.get 7 + local.set 5 + end + local.get 11 + local.get 3 + i32.store + local.get 12 + local.get 2 + i32.store + local.get 16 + local.get 20 + i32.store + local.get 14 + local.get 5 + local.get 13 + local.get 8 + local.get 13 + local.get 8 + i32.lt_s + select + i32.add + i32.store + local.get 19 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $mpeg2_dpframe_estimate (type 4) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 2 + i32.const 2 + call $__pragma_loopbound + local.get 2 + i32.const 1 + i32.shl + local.set 12 + local.get 3 + i32.const 1 + i32.shl + local.tee 13 + i32.const 1 + i32.or + local.set 14 + local.get 13 + i32.const -1 + i32.add + local.set 15 + i32.const 1073741824 + local.set 16 + i32.const 0 + local.set 17 + i32.const 0 + local.set 18 + i32.const 0 + local.set 19 + i32.const 0 + local.set 20 + i32.const 0 + local.set 21 + i32.const 0 + local.set 22 + i32.const 0 + local.set 23 + i32.const 0 + local.set 24 + i32.const 1 + local.set 25 + i32.const 0 + local.set 26 + loop ;; label = @1 + i32.const 2 + i32.const 2 + call $__pragma_loopbound + local.get 5 + local.get 26 + i32.const 3 + i32.shl + local.tee 2 + i32.add + local.set 27 + local.get 4 + local.get 2 + i32.add + local.set 28 + i32.const 1 + local.set 29 + i32.const 1 + local.set 30 + i32.const 0 + local.set 31 + loop ;; label = @2 + local.get 27 + local.get 31 + i32.const 2 + i32.shl + local.tee 2 + i32.add + i32.load + local.get 13 + i32.sub + local.set 3 + local.get 28 + local.get 2 + i32.add + i32.load + local.get 12 + i32.sub + local.set 2 + block ;; label = @3 + block ;; label = @4 + local.get 26 + local.get 31 + i32.eq + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1052 + local.get 31 + i32.ne + br_if 1 (;@3;) + local.get 3 + local.get 29 + i32.add + i32.const 1 + i32.shl + local.set 3 + block ;; label = @5 + block ;; label = @6 + local.get 2 + i32.const 1 + i32.shl + local.tee 2 + i32.const 0 + i32.lt_s + br_if 0 (;@6;) + local.get 2 + i32.const 1 + i32.or + i32.const 3 + i32.div_u + local.set 2 + br 1 (;@5;) + end + i32.const 0 + i32.const 1 + local.get 2 + i32.sub + i32.const 3 + i32.div_u + i32.sub + local.set 2 + end + block ;; label = @5 + local.get 3 + i32.const 0 + i32.lt_s + br_if 0 (;@5;) + local.get 3 + i32.const 1 + i32.or + i32.const 3 + i32.div_u + local.set 3 + br 1 (;@4;) + end + i32.const 0 + i32.const 1 + local.get 3 + i32.sub + i32.const 3 + i32.div_u + i32.sub + local.set 3 + end + block ;; label = @4 + block ;; label = @5 + i32.const 0 + i32.load offset=1052 + i32.eqz + br_if 0 (;@5;) + local.get 3 + i32.const 3 + i32.mul + local.get 3 + i32.const 0 + i32.gt_s + local.tee 31 + i32.add + local.set 32 + local.get 2 + i32.const 3 + i32.mul + local.get 2 + i32.const 0 + i32.gt_s + local.tee 29 + i32.add + local.set 33 + local.get 3 + local.get 31 + i32.add + local.set 31 + local.get 2 + local.get 29 + i32.add + local.set 29 + br 1 (;@4;) + end + local.get 3 + i32.const 3 + i32.mul + local.get 3 + i32.const 0 + i32.gt_s + local.tee 32 + i32.add + local.set 31 + local.get 2 + i32.const 3 + i32.mul + local.get 2 + i32.const 0 + i32.gt_s + local.tee 33 + i32.add + local.set 29 + local.get 3 + local.get 32 + i32.add + local.set 32 + local.get 2 + local.get 33 + i32.add + local.set 33 + end + local.get 2 + local.get 12 + i32.add + local.tee 34 + i32.const 0 + i32.lt_s + br_if 0 (;@3;) + local.get 34 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 0 (;@3;) + local.get 3 + local.get 13 + i32.add + local.tee 35 + i32.const 0 + i32.lt_s + br_if 0 (;@3;) + local.get 35 + i32.const 0 + i32.load offset=1028 + i32.const -16 + i32.add + i32.gt_s + br_if 0 (;@3;) + local.get 33 + i32.const 1 + i32.shr_s + local.get 12 + i32.add + local.set 36 + i32.const 3 + i32.const 3 + call $__pragma_loopbound + i32.const -1 + local.set 37 + local.get 29 + i32.const 1 + i32.shr_s + local.get 12 + i32.add + local.tee 38 + i32.const -1 + i32.add + local.set 39 + local.get 3 + i32.const 1 + i32.and + local.set 40 + local.get 2 + i32.const 1 + i32.and + local.set 41 + local.get 35 + i32.const 2147483646 + i32.and + local.set 42 + local.get 14 + local.get 32 + i32.const 1 + i32.shr_s + i32.add + local.set 43 + local.get 15 + local.get 31 + i32.const 1 + i32.shr_s + i32.add + local.set 44 + local.get 0 + local.get 34 + i32.const 1 + i32.shr_u + i32.add + local.set 45 + loop ;; label = @4 + i32.const 3 + i32.const 3 + call $__pragma_loopbound + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + local.get 44 + local.get 37 + i32.add + local.tee 46 + i32.const -1 + i32.gt_s + br_if 0 (;@7;) + block ;; label = @8 + local.get 38 + i32.const 1 + i32.lt_s + br_if 0 (;@8;) + i32.const 0 + i32.load offset=1024 + drop + i32.const 0 + i32.load offset=1024 + drop + i32.const 0 + i32.load offset=1024 + drop + br 3 (;@5;) + end + block ;; label = @8 + local.get 38 + i32.const 0 + i32.lt_s + br_if 0 (;@8;) + i32.const 0 + i32.load offset=1024 + drop + i32.const 0 + i32.load offset=1024 + drop + br 3 (;@5;) + end + local.get 38 + i32.const -1 + i32.ne + br_if 2 (;@5;) + br 1 (;@6;) + end + block ;; label = @7 + local.get 43 + local.get 37 + i32.add + local.tee 47 + i32.const 0 + i32.lt_s + br_if 0 (;@7;) + local.get 47 + i32.const -2 + i32.and + local.set 48 + local.get 46 + i32.const -2 + i32.and + local.set 49 + i32.const -1 + local.set 50 + loop ;; label = @8 + block ;; label = @9 + local.get 38 + local.get 50 + i32.add + local.tee 51 + i32.const 0 + i32.lt_s + br_if 0 (;@9;) + local.get 51 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 0 (;@9;) + local.get 46 + i32.const 0 + i32.load offset=1028 + i32.const -16 + i32.add + i32.gt_s + br_if 0 (;@9;) + local.get 36 + local.get 50 + i32.add + local.tee 52 + i32.const 0 + i32.lt_s + br_if 0 (;@9;) + local.get 52 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 0 (;@9;) + local.get 47 + i32.const 0 + i32.load offset=1028 + i32.const -16 + i32.add + i32.gt_s + br_if 0 (;@9;) + i32.const 0 + local.set 3 + i32.const 0 + i32.load offset=1024 + local.set 2 + i32.const 0 + i32.load offset=1024 + local.set 31 + i32.const 0 + i32.load offset=1024 + local.set 29 + i32.const 0 + i32.load offset=1024 + local.set 32 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 31 + i32.add + local.get 51 + i32.const 1 + i32.shr_u + i32.add + local.get 49 + local.get 29 + i32.mul + i32.add + local.tee 29 + local.get 32 + i32.const 1 + i32.shl + local.tee 53 + i32.const 0 + local.get 46 + i32.const 1 + i32.and + select + i32.add + local.tee 33 + local.get 51 + i32.const 1 + i32.and + local.tee 31 + i32.add + local.set 54 + local.get 29 + local.get 31 + i32.add + local.set 55 + local.get 45 + local.get 42 + local.get 2 + i32.mul + i32.add + local.tee 32 + local.get 53 + local.get 40 + i32.mul + i32.add + local.tee 56 + local.get 41 + i32.add + local.set 57 + local.get 32 + local.get 41 + i32.add + local.set 58 + i32.const 0 + local.set 59 + local.get 1 + local.set 60 + loop ;; label = @10 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 2 + loop ;; label = @11 + local.get 32 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 58 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 56 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 57 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 29 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 55 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 33 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 54 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 60 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 31 + local.get 31 + i32.mul + local.get 3 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + br_if 0 (;@11;) + end + local.get 54 + local.get 53 + i32.add + local.set 54 + local.get 33 + local.get 53 + i32.add + local.set 33 + local.get 55 + local.get 53 + i32.add + local.set 55 + local.get 29 + local.get 53 + i32.add + local.set 29 + local.get 57 + local.get 53 + i32.add + local.set 57 + local.get 56 + local.get 53 + i32.add + local.set 56 + local.get 58 + local.get 53 + i32.add + local.set 58 + local.get 32 + local.get 53 + i32.add + local.set 32 + local.get 60 + local.get 53 + i32.add + local.set 60 + local.get 59 + i32.const 1 + i32.add + local.tee 59 + i32.const 8 + i32.ne + br_if 0 (;@10;) + end + i32.const 0 + local.set 31 + i32.const 0 + i32.load offset=1024 + local.set 2 + i32.const 0 + i32.load offset=1024 + local.set 29 + i32.const 0 + i32.load offset=1024 + local.set 32 + i32.const 0 + i32.load offset=1024 + local.set 53 + i32.const 0 + i32.load offset=1024 + local.set 33 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 52 + i32.const 1 + i32.shr_u + i32.add + local.get 48 + local.get 32 + i32.mul + i32.add + local.tee 32 + local.get 33 + i32.const 1 + i32.shl + local.tee 59 + i32.const 0 + local.get 47 + i32.const 1 + i32.and + select + i32.add + local.tee 54 + local.get 52 + i32.const 1 + i32.and + local.tee 57 + i32.add + local.set 55 + local.get 45 + local.get 2 + i32.add + local.get 42 + local.get 29 + i32.mul + i32.add + local.tee 33 + local.get 41 + i32.add + local.set 56 + local.get 32 + local.get 57 + i32.add + local.set 57 + local.get 33 + local.get 59 + local.get 40 + i32.mul + i32.add + local.tee 58 + local.get 41 + i32.add + local.set 60 + local.get 1 + local.get 53 + i32.add + local.set 53 + i32.const 0 + local.set 61 + loop ;; label = @10 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 2 + loop ;; label = @11 + local.get 33 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 56 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 58 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 60 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 32 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 57 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 54 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 55 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 53 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 29 + local.get 29 + i32.mul + local.get 31 + i32.add + local.set 31 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + br_if 0 (;@11;) + end + local.get 55 + local.get 59 + i32.add + local.set 55 + local.get 54 + local.get 59 + i32.add + local.set 54 + local.get 57 + local.get 59 + i32.add + local.set 57 + local.get 32 + local.get 59 + i32.add + local.set 32 + local.get 60 + local.get 59 + i32.add + local.set 60 + local.get 58 + local.get 59 + i32.add + local.set 58 + local.get 56 + local.get 59 + i32.add + local.set 56 + local.get 33 + local.get 59 + i32.add + local.set 33 + local.get 53 + local.get 59 + i32.add + local.set 53 + local.get 61 + i32.const 1 + i32.add + local.tee 61 + i32.const 8 + i32.ne + br_if 0 (;@10;) + end + local.get 31 + local.get 3 + i32.add + local.tee 2 + local.get 16 + i32.ge_s + br_if 0 (;@9;) + local.get 34 + local.set 24 + local.get 35 + local.set 23 + local.get 51 + local.set 22 + local.get 46 + local.set 21 + local.get 52 + local.set 20 + local.get 47 + local.set 19 + local.get 50 + local.set 18 + local.get 37 + local.set 17 + local.get 2 + local.set 16 + end + local.get 50 + i32.const 1 + i32.add + local.tee 50 + i32.const 2 + i32.ne + br_if 0 (;@8;) + br 3 (;@5;) + end + end + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 38 + i32.const 1 + i32.lt_s + br_if 0 (;@10;) + local.get 39 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 1 (;@9;) + local.get 46 + i32.const 0 + i32.load offset=1028 + i32.const -16 + i32.add + i32.gt_s + br_if 1 (;@9;) + local.get 36 + i32.const 1 + i32.lt_s + br_if 1 (;@9;) + i32.const 0 + i32.load offset=1024 + drop + br 1 (;@9;) + end + local.get 38 + i32.const 0 + i32.lt_s + br_if 1 (;@8;) + end + local.get 38 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 1 (;@7;) + local.get 46 + i32.const 0 + i32.load offset=1028 + i32.const -16 + i32.add + i32.gt_s + br_if 1 (;@7;) + local.get 36 + i32.const 0 + i32.lt_s + br_if 1 (;@7;) + i32.const 0 + i32.load offset=1024 + drop + br 1 (;@7;) + end + local.get 38 + i32.const -1 + i32.ne + br_if 2 (;@5;) + end + local.get 38 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.ge_s + br_if 1 (;@5;) + local.get 46 + i32.const 0 + i32.load offset=1028 + i32.const -16 + i32.add + i32.gt_s + br_if 1 (;@5;) + local.get 36 + i32.const -2 + i32.le_s + br_if 1 (;@5;) + end + i32.const 0 + i32.load offset=1024 + drop + end + local.get 37 + i32.const 1 + i32.add + local.tee 37 + i32.const 2 + i32.ne + br_if 0 (;@4;) + end + end + i32.const 1 + local.set 31 + local.get 30 + i32.const 1 + i32.and + local.set 2 + i32.const 0 + local.set 30 + i32.const 2147483647 + local.set 29 + local.get 2 + br_if 0 (;@2;) + end + i32.const 1 + local.set 26 + local.get 25 + i32.const 1 + i32.and + local.set 2 + i32.const 0 + local.set 25 + local.get 2 + br_if 0 (;@1;) + end + i32.const 0 + local.set 3 + i32.const 0 + i32.load offset=1024 + local.set 2 + i32.const 0 + i32.load offset=1024 + local.set 31 + i32.const 0 + i32.load offset=1024 + local.set 32 + i32.const 0 + i32.load offset=1024 + local.set 33 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 24 + i32.const 1 + i32.shr_u + local.tee 61 + i32.add + local.get 2 + local.get 23 + i32.const -2 + i32.and + local.tee 51 + i32.mul + i32.add + local.tee 29 + local.get 33 + i32.const 1 + i32.shl + local.tee 53 + local.get 23 + i32.const 1 + i32.and + local.tee 38 + i32.mul + i32.add + local.tee 33 + local.get 24 + i32.const 1 + i32.and + local.tee 50 + i32.add + local.set 54 + local.get 0 + local.get 31 + i32.add + local.get 22 + i32.const 1 + i32.shr_s + i32.add + local.get 32 + local.get 21 + i32.const -2 + i32.and + i32.mul + i32.add + local.tee 32 + local.get 53 + i32.const 0 + local.get 21 + i32.const 1 + i32.and + select + i32.add + local.tee 55 + local.get 22 + i32.const 1 + i32.and + local.tee 2 + i32.add + local.set 56 + local.get 29 + local.get 50 + i32.add + local.set 57 + local.get 32 + local.get 2 + i32.add + local.set 58 + i32.const 0 + local.set 59 + local.get 1 + local.set 60 + loop ;; label = @1 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 2 + loop ;; label = @2 + local.get 29 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 57 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 33 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 54 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 32 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 58 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 55 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 56 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 60 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 31 + local.get 31 + i32.const 31 + i32.shr_s + local.tee 31 + i32.xor + local.get 31 + i32.sub + local.get 3 + i32.add + local.set 3 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + br_if 0 (;@2;) + end + local.get 56 + local.get 53 + i32.add + local.set 56 + local.get 55 + local.get 53 + i32.add + local.set 55 + local.get 58 + local.get 53 + i32.add + local.set 58 + local.get 32 + local.get 53 + i32.add + local.set 32 + local.get 54 + local.get 53 + i32.add + local.set 54 + local.get 33 + local.get 53 + i32.add + local.set 33 + local.get 57 + local.get 53 + i32.add + local.set 57 + local.get 29 + local.get 53 + i32.add + local.set 29 + local.get 60 + local.get 53 + i32.add + local.set 60 + local.get 59 + i32.const 1 + i32.add + local.tee 59 + i32.const 8 + i32.ne + br_if 0 (;@1;) + end + i32.const 0 + local.set 31 + i32.const 0 + i32.load offset=1024 + local.set 2 + i32.const 0 + i32.load offset=1024 + local.set 29 + i32.const 0 + i32.load offset=1024 + local.set 32 + i32.const 0 + i32.load offset=1024 + local.set 53 + i32.const 0 + i32.load offset=1024 + local.set 33 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 20 + i32.const 1 + i32.shr_s + i32.add + local.get 32 + local.get 19 + i32.const -2 + i32.and + i32.mul + i32.add + local.tee 32 + local.get 33 + i32.const 1 + i32.shl + local.tee 59 + i32.const 0 + local.get 19 + i32.const 1 + i32.and + select + i32.add + local.tee 54 + local.get 20 + i32.const 1 + i32.and + local.tee 57 + i32.add + local.set 55 + local.get 0 + local.get 2 + i32.add + local.get 61 + i32.add + local.get 51 + local.get 29 + i32.mul + i32.add + local.tee 33 + local.get 50 + i32.add + local.set 56 + local.get 32 + local.get 57 + i32.add + local.set 57 + local.get 33 + local.get 59 + local.get 38 + i32.mul + i32.add + local.tee 58 + local.get 50 + i32.add + local.set 60 + local.get 1 + local.get 53 + i32.add + local.set 53 + i32.const 0 + local.set 50 + loop ;; label = @1 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 2 + loop ;; label = @2 + local.get 33 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 56 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 58 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 60 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 32 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 57 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 54 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 55 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 53 + local.get 2 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 29 + local.get 29 + i32.const 31 + i32.shr_s + local.tee 29 + i32.xor + local.get 29 + i32.sub + local.get 31 + i32.add + local.set 31 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + br_if 0 (;@2;) + end + local.get 55 + local.get 59 + i32.add + local.set 55 + local.get 54 + local.get 59 + i32.add + local.set 54 + local.get 57 + local.get 59 + i32.add + local.set 57 + local.get 32 + local.get 59 + i32.add + local.set 32 + local.get 60 + local.get 59 + i32.add + local.set 60 + local.get 58 + local.get 59 + i32.add + local.set 58 + local.get 56 + local.get 59 + i32.add + local.set 56 + local.get 33 + local.get 59 + i32.add + local.set 33 + local.get 53 + local.get 59 + i32.add + local.set 53 + local.get 50 + i32.const 1 + i32.add + local.tee 50 + i32.const 8 + i32.ne + br_if 0 (;@1;) + end + local.get 10 + local.get 31 + local.get 3 + i32.add + i32.store + local.get 6 + local.get 24 + i32.store + local.get 7 + local.get 23 + i32.store + local.get 8 + local.get 18 + i32.store + local.get 9 + local.get 17 + i32.store + local.get 11 + local.get 16 + i32.store) + (func $mpeg2_field_estimate (type 10) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 24 + global.set $__stack_pointer + i32.const 0 + local.set 25 + i32.const 0 + local.set 26 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 9 + i32.eqz + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1048 + local.set 9 + i32.const 0 + i32.load offset=1048 + local.set 26 + i32.const 1 + local.set 27 + local.get 9 + i32.const 1 + i32.eq + br_if 1 (;@3;) + local.get 26 + i32.const 2 + i32.eq + local.set 26 + end + i32.const 1 + local.set 27 + local.get 0 + local.get 1 + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 5 + local.get 6 + local.get 7 + local.get 8 + i32.const 1 + i32.shr_s + local.tee 28 + i32.const 16 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 24 + i32.const 12 + i32.add + local.get 24 + i32.const 8 + i32.add + call $mpeg2_fullsearch + local.set 9 + local.get 26 + i32.eqz + br_if 1 (;@2;) + i32.const 65536 + local.set 26 + br 2 (;@1;) + end + block ;; label = @3 + local.get 26 + i32.const 2 + i32.ne + br_if 0 (;@3;) + i32.const 65536 + local.set 9 + i32.const 1 + local.set 25 + i32.const 65536 + local.set 26 + br 2 (;@1;) + end + i32.const 1 + local.set 25 + local.get 8 + i32.const 1 + i32.shr_s + local.set 28 + i32.const 65536 + local.set 9 + end + i32.const 0 + local.set 27 + local.get 2 + local.get 3 + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 5 + local.get 6 + local.get 7 + local.get 28 + i32.const 16 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 24 + i32.const 4 + i32.add + local.get 24 + call $mpeg2_fullsearch + local.set 26 + local.get 24 + i32.load + local.set 28 + local.get 24 + i32.load offset=4 + local.set 29 + end + i32.const 0 + local.set 30 + i32.const 0 + i32.load offset=1048 + local.set 31 + local.get 21 + local.get 24 + i32.load offset=12 + local.tee 32 + local.get 29 + local.get 31 + i32.const 1 + i32.eq + local.tee 31 + select + i32.store + local.get 22 + local.get 24 + i32.load offset=8 + local.tee 21 + local.get 28 + local.get 31 + select + i32.store + local.get 23 + local.get 9 + local.get 26 + local.get 31 + select + i32.store + block ;; label = @1 + local.get 9 + local.get 26 + i32.le_s + br_if 0 (;@1;) + local.get 28 + local.set 21 + local.get 29 + local.set 32 + local.get 26 + local.set 9 + i32.const 1 + local.set 30 + end + local.get 16 + local.get 9 + i32.store + local.get 10 + local.get 32 + i32.store + local.get 11 + local.get 21 + i32.store + local.get 18 + local.get 30 + i32.store + i32.const 65536 + local.set 9 + i32.const 65536 + local.set 26 + block ;; label = @1 + local.get 25 + br_if 0 (;@1;) + local.get 0 + local.get 1 + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 5 + local.get 6 + local.get 7 + local.get 8 + i32.const 1 + i32.shr_s + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 24 + i32.const 12 + i32.add + local.get 24 + i32.const 8 + i32.add + call $mpeg2_fullsearch + local.set 26 + end + block ;; label = @1 + local.get 27 + br_if 0 (;@1;) + local.get 2 + local.get 3 + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 5 + local.get 6 + local.get 7 + local.get 8 + i32.const 1 + i32.shr_s + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 24 + i32.const 4 + i32.add + local.get 24 + call $mpeg2_fullsearch + local.set 9 + local.get 24 + i32.load + local.set 28 + local.get 24 + i32.load offset=4 + local.set 29 + end + local.get 17 + local.get 26 + local.get 9 + local.get 26 + local.get 9 + i32.lt_s + select + i32.store + local.get 12 + local.get 29 + local.get 24 + i32.load offset=12 + local.get 26 + local.get 9 + i32.gt_s + local.tee 9 + select + i32.store + local.get 13 + local.get 28 + local.get 24 + i32.load offset=8 + local.get 9 + select + i32.store + local.get 19 + local.get 9 + i32.store + i32.const 65536 + local.set 9 + i32.const 65536 + local.set 26 + block ;; label = @1 + local.get 25 + br_if 0 (;@1;) + local.get 0 + local.get 1 + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.const 4 + i32.shl + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 5 + local.get 6 + i32.const 8 + i32.add + local.get 7 + local.get 8 + i32.const 1 + i32.shr_s + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 24 + i32.const 12 + i32.add + local.get 24 + i32.const 8 + i32.add + call $mpeg2_fullsearch + local.set 26 + end + block ;; label = @1 + local.get 27 + br_if 0 (;@1;) + local.get 2 + local.get 3 + local.get 4 + i32.const 0 + i32.load offset=1024 + i32.const 4 + i32.shl + i32.add + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + local.get 5 + local.get 6 + i32.const 8 + i32.add + local.get 7 + local.get 8 + i32.const 1 + i32.shr_s + i32.const 8 + i32.const 0 + i32.load offset=1024 + i32.const 0 + i32.load offset=1028 + i32.const 1 + i32.shr_s + local.get 24 + i32.const 4 + i32.add + local.get 24 + call $mpeg2_fullsearch + local.set 9 + end + local.get 17 + local.get 17 + i32.load + local.get 26 + local.get 9 + local.get 26 + local.get 9 + i32.lt_s + select + i32.add + i32.store + local.get 14 + local.get 24 + i32.const 4 + i32.add + local.get 24 + i32.const 12 + i32.add + local.get 26 + local.get 9 + i32.gt_s + local.tee 9 + select + i32.load + i32.store + local.get 15 + local.get 24 + local.get 24 + i32.const 8 + i32.add + local.get 9 + select + i32.load + i32.store + local.get 20 + local.get 9 + i32.store + local.get 24 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $mpeg2_dpfield_estimate (type 11) (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + i32.const 0 + i32.load offset=1048 + local.set 11 + i32.const 0 + i32.load offset=1048 + local.set 12 + i32.const 3 + i32.const 3 + call $__pragma_loopbound + local.get 0 + local.get 1 + local.get 11 + i32.const 1 + i32.eq + local.tee 11 + select + local.get 5 + i32.const 1 + i32.shr_s + i32.add + local.set 13 + local.get 5 + local.get 3 + i32.const 1 + i32.shl + local.tee 3 + i32.sub + local.tee 14 + local.get 14 + i32.const 0 + i32.gt_s + i32.add + i32.const 1 + i32.shr_s + local.tee 14 + i32.const 1 + i32.and + local.set 15 + local.get 6 + local.get 4 + i32.const 1 + i32.shl + local.tee 4 + i32.sub + local.tee 16 + local.get 16 + i32.const 0 + i32.gt_s + i32.add + i32.const 1 + i32.shr_s + local.get 4 + i32.add + i32.const -1 + i32.const 1 + local.get 12 + i32.const 1 + i32.eq + select + i32.add + local.set 17 + local.get 14 + local.get 3 + i32.add + local.tee 18 + i32.const 1 + i32.add + local.tee 19 + i32.const 1 + i32.and + local.set 20 + local.get 1 + local.get 0 + local.get 11 + select + local.tee 21 + local.get 18 + i32.const 1 + i32.shr_u + i32.add + local.set 22 + local.get 18 + i32.const -1 + i32.add + local.tee 23 + i32.const 1 + i32.and + local.set 24 + local.get 21 + local.get 19 + i32.const 1 + i32.shr_u + i32.add + local.set 25 + local.get 21 + local.get 23 + i32.const 1 + i32.shr_u + i32.add + local.set 26 + local.get 5 + i32.const 1 + i32.and + local.set 27 + local.get 6 + i32.const 1 + i32.shr_s + local.set 28 + i32.const 1073741824 + local.set 29 + i32.const 0 + local.set 30 + i32.const 0 + local.set 31 + i32.const 0 + local.set 32 + i32.const 0 + local.set 33 + i32.const -1 + local.set 34 + loop ;; label = @1 + i32.const 3 + i32.const 3 + call $__pragma_loopbound + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 17 + local.get 34 + i32.add + local.tee 35 + i32.const -1 + i32.gt_s + br_if 0 (;@5;) + local.get 18 + i32.const 0 + i32.le_s + br_if 1 (;@4;) + i32.const 0 + i32.load offset=1024 + drop + i32.const 0 + i32.load offset=1024 + drop + br 2 (;@3;) + end + local.get 35 + i32.const 1 + i32.shr_u + local.set 36 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 18 + i32.const 0 + i32.le_s + br_if 0 (;@8;) + local.get 23 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 1 (;@7;) + local.get 35 + i32.const 0 + i32.load offset=1036 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 1 (;@7;) + i32.const 0 + local.set 1 + i32.const 0 + i32.load offset=1032 + local.set 5 + i32.const 0 + i32.load offset=1032 + local.set 0 + i32.const 0 + i32.load offset=1032 + local.set 37 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 13 + local.get 5 + local.get 28 + i32.mul + i32.add + local.tee 3 + local.get 37 + i32.const 0 + local.get 6 + i32.const 1 + i32.and + select + i32.add + local.tee 11 + local.get 27 + i32.add + local.set 12 + local.get 26 + local.get 0 + local.get 36 + i32.mul + i32.add + local.tee 4 + local.get 37 + i32.const 0 + local.get 35 + i32.const 1 + i32.and + select + i32.add + local.tee 14 + local.get 24 + i32.add + local.set 16 + local.get 3 + local.get 27 + i32.add + local.set 38 + local.get 4 + local.get 24 + i32.add + local.set 39 + i32.const 0 + local.set 40 + local.get 2 + local.set 41 + loop ;; label = @9 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 5 + loop ;; label = @10 + local.get 3 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 38 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 12 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 4 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 39 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 14 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 16 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 41 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 0 + local.get 0 + i32.mul + local.get 1 + i32.add + local.set 1 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + br_if 0 (;@10;) + end + local.get 16 + local.get 37 + i32.add + local.set 16 + local.get 14 + local.get 37 + i32.add + local.set 14 + local.get 39 + local.get 37 + i32.add + local.set 39 + local.get 4 + local.get 37 + i32.add + local.set 4 + local.get 12 + local.get 37 + i32.add + local.set 12 + local.get 11 + local.get 37 + i32.add + local.set 11 + local.get 38 + local.get 37 + i32.add + local.set 38 + local.get 3 + local.get 37 + i32.add + local.set 3 + local.get 41 + local.get 37 + i32.add + local.set 41 + local.get 40 + i32.const 1 + i32.add + local.tee 40 + i32.const 16 + i32.ne + br_if 0 (;@9;) + end + local.get 1 + local.get 29 + i32.ge_s + br_if 0 (;@8;) + i32.const -1 + local.set 31 + local.get 23 + local.set 33 + local.get 35 + local.set 32 + local.get 34 + local.set 30 + local.get 1 + local.set 29 + end + local.get 18 + i32.const 0 + i32.lt_s + br_if 1 (;@6;) + end + local.get 18 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 1 (;@5;) + local.get 35 + i32.const 0 + i32.load offset=1036 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 1 (;@5;) + i32.const 0 + local.set 1 + i32.const 0 + i32.load offset=1032 + local.set 5 + i32.const 0 + i32.load offset=1032 + local.set 0 + i32.const 0 + i32.load offset=1032 + local.set 37 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 13 + local.get 5 + local.get 28 + i32.mul + i32.add + local.tee 3 + local.get 37 + i32.const 0 + local.get 6 + i32.const 1 + i32.and + select + i32.add + local.tee 11 + local.get 27 + i32.add + local.set 12 + local.get 22 + local.get 0 + local.get 36 + i32.mul + i32.add + local.tee 4 + local.get 37 + i32.const 0 + local.get 35 + i32.const 1 + i32.and + select + i32.add + local.tee 14 + local.get 15 + i32.add + local.set 16 + local.get 3 + local.get 27 + i32.add + local.set 38 + local.get 4 + local.get 15 + i32.add + local.set 39 + i32.const 0 + local.set 40 + local.get 2 + local.set 41 + loop ;; label = @7 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 5 + loop ;; label = @8 + local.get 3 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 38 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 12 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 4 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 39 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 14 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 16 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 41 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 0 + local.get 0 + i32.mul + local.get 1 + i32.add + local.set 1 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + br_if 0 (;@8;) + end + local.get 16 + local.get 37 + i32.add + local.set 16 + local.get 14 + local.get 37 + i32.add + local.set 14 + local.get 39 + local.get 37 + i32.add + local.set 39 + local.get 4 + local.get 37 + i32.add + local.set 4 + local.get 12 + local.get 37 + i32.add + local.set 12 + local.get 11 + local.get 37 + i32.add + local.set 11 + local.get 38 + local.get 37 + i32.add + local.set 38 + local.get 3 + local.get 37 + i32.add + local.set 3 + local.get 41 + local.get 37 + i32.add + local.set 41 + local.get 40 + i32.const 1 + i32.add + local.tee 40 + i32.const 16 + i32.ne + br_if 0 (;@7;) + end + local.get 1 + local.get 29 + i32.ge_s + br_if 0 (;@6;) + i32.const 0 + local.set 31 + local.get 18 + local.set 33 + local.get 35 + local.set 32 + local.get 34 + local.set 30 + local.get 1 + local.set 29 + end + local.get 18 + i32.const -1 + i32.lt_s + br_if 3 (;@2;) + end + local.get 18 + i32.const 0 + i32.load offset=1024 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.ge_s + br_if 2 (;@2;) + local.get 35 + i32.const 0 + i32.load offset=1036 + i32.const 1 + i32.shl + i32.const -32 + i32.add + i32.gt_s + br_if 2 (;@2;) + i32.const 0 + local.set 1 + i32.const 0 + i32.load offset=1032 + local.set 5 + i32.const 0 + i32.load offset=1032 + local.set 0 + i32.const 0 + i32.load offset=1032 + local.set 37 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 13 + local.get 5 + local.get 28 + i32.mul + i32.add + local.tee 3 + local.get 37 + i32.const 0 + local.get 6 + i32.const 1 + i32.and + select + i32.add + local.tee 11 + local.get 27 + i32.add + local.set 12 + local.get 25 + local.get 0 + local.get 36 + i32.mul + i32.add + local.tee 4 + local.get 37 + i32.const 0 + local.get 35 + i32.const 1 + i32.and + select + i32.add + local.tee 14 + local.get 20 + i32.add + local.set 16 + local.get 3 + local.get 27 + i32.add + local.set 38 + local.get 4 + local.get 20 + i32.add + local.set 39 + i32.const 0 + local.set 40 + local.get 2 + local.set 41 + loop ;; label = @5 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const -16 + local.set 5 + loop ;; label = @6 + local.get 3 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 38 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 12 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 4 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 39 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 14 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 16 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 41 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 0 + local.get 0 + i32.mul + local.get 1 + i32.add + local.set 1 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + br_if 0 (;@6;) + end + local.get 16 + local.get 37 + i32.add + local.set 16 + local.get 14 + local.get 37 + i32.add + local.set 14 + local.get 39 + local.get 37 + i32.add + local.set 39 + local.get 4 + local.get 37 + i32.add + local.set 4 + local.get 12 + local.get 37 + i32.add + local.set 12 + local.get 11 + local.get 37 + i32.add + local.set 11 + local.get 38 + local.get 37 + i32.add + local.set 38 + local.get 3 + local.get 37 + i32.add + local.set 3 + local.get 41 + local.get 37 + i32.add + local.set 41 + local.get 40 + i32.const 1 + i32.add + local.tee 40 + i32.const 16 + i32.ne + br_if 0 (;@5;) + end + local.get 1 + local.get 29 + i32.ge_s + br_if 2 (;@2;) + i32.const 1 + local.set 31 + local.get 19 + local.set 33 + local.get 35 + local.set 32 + local.get 34 + local.set 30 + local.get 1 + local.set 29 + br 2 (;@2;) + end + block ;; label = @4 + local.get 18 + i32.const 0 + i32.lt_s + br_if 0 (;@4;) + i32.const 0 + i32.load offset=1024 + drop + br 1 (;@3;) + end + local.get 18 + i32.const -1 + i32.ne + br_if 1 (;@2;) + end + i32.const 0 + i32.load offset=1024 + drop + end + local.get 34 + i32.const 1 + i32.add + local.tee 34 + i32.const 2 + i32.ne + br_if 0 (;@1;) + end + i32.const 0 + local.set 37 + i32.const 0 + i32.load offset=1032 + local.set 5 + i32.const 0 + i32.load offset=1032 + local.set 1 + i32.const 0 + i32.load offset=1032 + local.set 41 + i32.const 8 + i32.const 16 + call $__pragma_loopbound + local.get 21 + local.get 33 + i32.const 1 + i32.shr_u + i32.add + local.get 1 + local.get 32 + i32.const 1 + i32.shr_s + i32.mul + i32.add + local.tee 34 + local.get 33 + i32.const 1 + i32.and + local.tee 1 + i32.add + local.set 4 + local.get 13 + local.get 5 + local.get 28 + i32.mul + i32.add + local.tee 3 + local.get 41 + i32.const 0 + local.get 6 + i32.const 1 + i32.and + select + i32.add + local.tee 11 + local.get 27 + i32.add + local.set 12 + local.get 34 + local.get 41 + i32.const 0 + local.get 32 + i32.const 1 + i32.and + select + i32.add + local.tee 14 + local.get 1 + i32.add + local.set 16 + local.get 3 + local.get 27 + i32.add + local.set 38 + i32.const 0 + local.set 1 + i32.const 0 + local.set 40 + loop ;; label = @1 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 34 + local.get 37 + i32.add + local.set 39 + i32.const -16 + local.set 5 + loop ;; label = @2 + local.get 3 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 38 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 11 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 12 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 39 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + local.get 4 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 14 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + local.get 16 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 2 + local.get 5 + i32.add + i32.const 16 + i32.add + i32.load8_u + i32.sub + local.tee 0 + local.get 0 + i32.const 31 + i32.shr_s + local.tee 0 + i32.xor + local.get 0 + i32.sub + local.get 1 + i32.add + local.set 1 + local.get 5 + i32.const 1 + i32.add + local.tee 5 + br_if 0 (;@2;) + end + local.get 37 + local.get 41 + i32.add + local.set 37 + local.get 16 + local.get 41 + i32.add + local.set 16 + local.get 14 + local.get 41 + i32.add + local.set 14 + local.get 4 + local.get 41 + i32.add + local.set 4 + local.get 12 + local.get 41 + i32.add + local.set 12 + local.get 11 + local.get 41 + i32.add + local.set 11 + local.get 38 + local.get 41 + i32.add + local.set 38 + local.get 3 + local.get 41 + i32.add + local.set 3 + local.get 2 + local.get 41 + i32.add + local.set 2 + local.get 40 + i32.const 1 + i32.add + local.tee 40 + i32.const 16 + i32.ne + br_if 0 (;@1;) + end + local.get 9 + local.get 1 + i32.store + local.get 7 + local.get 31 + i32.store + local.get 8 + local.get 30 + i32.store + local.get 10 + local.get 29 + i32.store) + (func $mpeg2_dist1 (type 12) (param i32 i32 i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 4 + local.get 3 + i32.or + br_if 0 (;@2;) + i32.const 0 + local.set 4 + i32.const 0 + i32.const 16 + call $__pragma_loopbound + local.get 5 + i32.const 1 + i32.lt_s + br_if 1 (;@1;) + i32.const 0 + local.set 7 + i32.const 0 + local.set 4 + loop ;; label = @3 + local.get 0 + local.get 7 + i32.add + local.tee 3 + i32.load8_u + local.get 1 + local.get 7 + i32.add + local.tee 8 + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 4 + i32.add + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.get 8 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.get 8 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.get 8 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.get 8 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.get 8 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.get 8 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.get 8 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.get 8 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.get 8 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.get 8 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.get 8 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.get 8 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.get 8 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 4 + local.get 4 + i32.const 31 + i32.shr_s + local.tee 4 + i32.xor + local.get 4 + i32.sub + i32.add + local.get 3 + i32.const 15 + i32.add + i32.load8_u + local.get 8 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.const 31 + i32.shr_s + local.tee 3 + i32.xor + local.get 3 + i32.sub + i32.add + local.tee 4 + local.get 6 + i32.ge_s + br_if 2 (;@1;) + local.get 7 + local.get 2 + i32.add + local.set 7 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + block ;; label = @2 + local.get 3 + i32.eqz + br_if 0 (;@2;) + local.get 4 + br_if 0 (;@2;) + i32.const 8 + i32.const 16 + call $__pragma_loopbound + block ;; label = @3 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + i32.const 0 + return + end + i32.const 0 + local.set 7 + i32.const 0 + local.set 4 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 7 + i32.add + local.tee 3 + i32.const 15 + i32.add + i32.load8_u + local.tee 9 + local.get 3 + i32.const 16 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 1 + local.get 7 + i32.add + local.tee 8 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.tee 6 + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.tee 9 + local.get 6 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.load8_u + local.get 9 + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 8 + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.const 31 + i32.shr_s + local.tee 3 + i32.xor + local.get 3 + i32.sub + local.get 4 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 4 + local.get 7 + local.get 2 + i32.add + local.set 7 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + i32.const 8 + i32.const 16 + call $__pragma_loopbound + block ;; label = @2 + local.get 3 + br_if 0 (;@2;) + local.get 4 + i32.eqz + br_if 0 (;@2;) + block ;; label = @3 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@3;) + i32.const 0 + return + end + local.get 0 + local.get 2 + i32.add + local.set 10 + i32.const 0 + local.set 9 + i32.const 0 + local.set 4 + loop ;; label = @3 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 9 + i32.add + local.tee 3 + i32.const 15 + i32.add + i32.load8_u + local.get 10 + local.get 9 + i32.add + local.tee 8 + i32.const 15 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 1 + local.get 9 + i32.add + local.tee 7 + i32.const 15 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 14 + i32.add + i32.load8_u + local.get 8 + i32.const 14 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 14 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 13 + i32.add + i32.load8_u + local.get 8 + i32.const 13 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 13 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 12 + i32.add + i32.load8_u + local.get 8 + i32.const 12 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 12 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 11 + i32.add + i32.load8_u + local.get 8 + i32.const 11 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 11 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 10 + i32.add + i32.load8_u + local.get 8 + i32.const 10 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 10 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 9 + i32.add + i32.load8_u + local.get 8 + i32.const 9 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 9 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 8 + i32.add + i32.load8_u + local.get 8 + i32.const 8 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 8 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 7 + i32.add + i32.load8_u + local.get 8 + i32.const 7 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 7 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 6 + i32.add + i32.load8_u + local.get 8 + i32.const 6 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 6 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 5 + i32.add + i32.load8_u + local.get 8 + i32.const 5 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 5 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 4 + i32.add + i32.load8_u + local.get 8 + i32.const 4 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 4 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 3 + i32.add + i32.load8_u + local.get 8 + i32.const 3 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 3 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 2 + i32.add + i32.load8_u + local.get 8 + i32.const 2 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 2 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.const 1 + i32.add + i32.load8_u + local.get 8 + i32.const 1 + i32.add + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.const 1 + i32.add + i32.load8_u + i32.sub + local.tee 6 + local.get 6 + i32.const 31 + i32.shr_s + local.tee 6 + i32.xor + local.get 6 + i32.sub + local.get 3 + i32.load8_u + local.get 8 + i32.load8_u + i32.add + i32.const 1 + i32.add + i32.const 1 + i32.shr_u + local.get 7 + i32.load8_u + i32.sub + local.tee 3 + local.get 3 + i32.const 31 + i32.shr_s + local.tee 3 + i32.xor + local.get 3 + i32.sub + local.get 4 + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + i32.add + local.set 4 + local.get 9 + local.get 2 + i32.add + local.set 9 + local.get 5 + i32.const -1 + i32.add + local.tee 5 + br_if 0 (;@3;) + br 2 (;@1;) + end + end + block ;; label = @2 + local.get 5 + i32.const 1 + i32.ge_s + br_if 0 (;@2;) + i32.const 0 + return + end + local.get 2 + local.get 0 + i32.add + i32.const 1 + i32.add + local.set 6 + i32.const 0 + local.set 4 + i32.const 0 + local.set 10 + loop ;; label = @2 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 0 + local.get 2 + i32.add + local.tee 11 + i32.load8_u + local.set 8 + local.get 0 + i32.load8_u + local.set 7 + i32.const 0 + local.set 3 + loop ;; label = @3 + local.get 7 + i32.const 255 + i32.and + local.get 0 + local.get 3 + i32.add + i32.const 1 + i32.add + i32.load8_u + local.tee 7 + i32.add + local.get 8 + i32.const 255 + i32.and + i32.add + local.get 6 + local.get 3 + i32.add + i32.load8_u + local.tee 8 + i32.add + i32.const 2 + i32.add + i32.const 2 + i32.shr_u + local.get 1 + local.get 3 + i32.add + i32.load8_u + i32.sub + local.tee 9 + local.get 9 + i32.const 31 + i32.shr_s + local.tee 9 + i32.xor + local.get 9 + i32.sub + local.get 4 + i32.add + local.set 4 + local.get 3 + i32.const 1 + i32.add + local.tee 3 + i32.const 16 + i32.ne + br_if 0 (;@3;) + end + local.get 6 + local.get 2 + i32.add + local.set 6 + local.get 1 + local.get 2 + i32.add + local.set 1 + local.get 11 + local.set 0 + local.get 10 + i32.const 1 + i32.add + local.tee 10 + local.get 5 + i32.ne + br_if 0 (;@2;) + end + end + local.get 4) + (func $mpeg2_main (type 1) + i32.const 1056 + i32.const 1056 + i32.const 1056 + i32.const 1056 + i32.const 1056 + i32.const 1056 + i32.const 7 + i32.const 7 + i32.const 3 + i32.const 3 + i32.const 91184 + i32.const 0 + i32.const 0 + call $mpeg2_motion_estimation) + (func $__original_main (type 2) (result i32) + (local i32 i32 i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i32.store8 offset=15 + i32.const 90112 + i32.const 90112 + call $__pragma_loopbound + i32.const -90112 + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const 91168 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 91169 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 91170 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 91171 + i32.add + local.tee 2 + local.get 2 + i32.load8_u + local.get 0 + i32.load8_u offset=15 + i32.xor + i32.store8 + local.get 1 + i32.const 4 + i32.add + local.tee 1 + br_if 0 (;@1;) + end + call $mpeg2_main + call $mpeg2_return + local.set 1 + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer + local.get 1 + i32.const -116 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 2) + (global $__stack_pointer (mut i32) (i32.const 129072)) + (global (;1;) i32 (i32.const 124976)) + (global (;2;) i32 (i32.const 129072)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $mpeg2_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.data (i32.const 1024) "`\01\00\00\00\01\00\00`\01\00\00\00\01\00\00\03\00\00\00\03\00\00\00\03\00\00\00\01\00\00\00\9f\9d\9b\9d\9f\a1\a2\a3\9e\a2\a5\a5\a2\a1\a4\a7\a3\a3\a5\a6\a5\a5\a3\a2\9d\a1\a5\a8\a6\a1\9a\95\8e~zxpv|s}zzy{\83\82tdWH^~\84oJ1Ca\81\9b\ac\b6\b9\b0\a8\9e\9a\9b\a1\aa\b1\9d\83eI3042KTh\83\99\9f\94\87O^r\7fuR#\02\1a$$\1b\14\13\1e0C`{\8a\96\9c\97\90\99\99\92\88\7f\80\97\b5\a0\94\9a\96f-\14\12\15\17'\1c\15\1e%;z\a2\be\bf\b2\9f\9e\af\ba{d\8a\a9\a7\a4\aa\a8\ab\ad\ab\a7\a6\aa\af\a4\a6\a9\ab\ac\ac\aa\a9\a7\af\ba\bc\af\94u`z\85\90\9a\a7\a2|P/Hew~\8b\a3\b7\ae\95zouysiVcnnjkrxegaQ?6;C3$%=MKHMWKBGVbc_`mo[?8MgL<-/:>3%;Nm\84\82uqx\7fxlaZXZ]idYLA:<9-%!\18+).B`{\89\8d\ae\89kz\ab\d3\d9\ce\92~\99\ba\b8\b8\a3nYgyv]OLF]ls\86\99|H4Lm\82\81{mcg\8d\87w\91\a9\a0\8aa9\1f2dynYFTt\9f\b7\b8\b8\b6\ac\ad\b7\ba\a8\8by|\86\83\83\84\85\88\8c\90\92\95\a7\be\cb\cb\c3\bb\b7\9e\a8\af\b7\c6\ce\ba\9d_UTj\8c\9d\95\85yhVS_jmk\85|k\5cYVE1_gnplijmjyv\5cRdvzjc]_cbXN>;767741=:>Sm|xogf^X[b]RVWXWTPKHJMNE9004\22-#)0\1c=\8f\b2\b3\b0\ad\ad\af\ad\aa\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\ad\ab\a4\a3\a9\a6\9e\a4\a4\a1\a3\a8\a8\a8\b0\a8\a8\a8\a8\a8\a8\a8\a8\a7\a6\a6\a5\a5\a4\a4\a3\9e\a0\9d\9a\a1\95\1d\06\a6\a3\a0\9f\a2\a4\a0\9b\89\90\9d\ab\b5\b6\b1\ab\a7\a6\a3\9c\92\86|uxy{||zyx\8d\95\87y\89\a3\ae\b2\9e\86\88\95\97\98zB\12-J\85\ba\bd\ac\9f\af\8cX*\18#>Tn\8b\aa\b5\b5\bb\ca\d6\ca\c1\c3\cc\ce\c9\b6\9f\88waRH=.\22$2Q}\a2\a9\94}\9d\8d\93\93{uu_3?,-a~tsR_\82~H?x\a7\a4\94\83jRZx\8a\85\84z\7f\83\82\86\7fjL9?Qiyzqnw\81\80xiWJJTp\94\ae\b7\b6\b1\b0\b0\b1\b4\b9\be\c0\ba\c3\be\9fzq\8b\ab\c3\c2\b6\a7\a4\a6\97\80lodI7L\85\b8\c4\ae\91{oh_XJ,&?F32FWbr~\83\82~{\89\92\8fzh`YQ,?H7\22,Y\86qWBKp\96\a7\a9}}~}{yvts\5cJMWZXWSQNLKLMNPE7-**,, '(&\1dA\91\b8\ad\a5\ab\b2\ac\aa\ac\a6\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\ae\a4\a5\af\b0\a8\a8\b1\a9\a6\9e\a4\b0\a9\a0\a7\a8\a8\a8\a8\a8\a8\a8\a8\a7\a6\a6\a5\a5\a4\a4\a3\9e\a0\9d\9a\a1\95\1d\06\a8\9c\9a\a1\9b\8b\86\8f\a6\a6\a6\a3\a0\a0\a3\a6\ad\a9\a4\a1\a3\a9\b2\b7\af\af\ad\a9\a4\9e\99\96\88upsor\81\89\94\b7\bf\8eK'1M\85\a9\b4\b0\99iH=7Ik\95\b8\ca\cc\c7\c3\c4\bd\b0\a9\ab\ac\a9\a4\a0\a4\a9\a9\ab\ab\a4\90\8d\8d\96\a2\a6\a0\97~|g=\1d(]\8fonu\84\8d\82dJ>5385'&3sl>!=by\90\80ul^Q^t|}\81\8b~qsz\8d\9c\87`L^z\89\8f\92\8b\92\97\82jjt\85\85\82~yrlhsqmjgdcckdajvyocXUF8B\5cjhouyvqs\7f\8b|n\5cQNQTUWDG^]KWy\b3\b0\ab\a5\9d\94\8a\83\8as^XRHEI]O?;CKKHGXt\8e\92wH#DFJQ[fpuZVW]]Z_jfffaXL@940,+,,)'&\1d0\1c<\9c\b4\a9\b0\a7\ae\b2\a6\a8\ae\a6\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a3\ac\b0\ac\a8\aa\af\b1\af\a4\a3\aa\ac\a9\aa\ab\a8\a8\a8\a8\a8\a8\a8\a8\a7\a6\a6\a5\a5\a4\a4\a3\9e\a0\9d\9a\a1\95\1d\06\91\9d\a0\93\85\88\99\a8\a1\a5\a7\a5\a1\9f\a2\a6\98\97\97\99\a0\a9\b2\b8\b2\b3\b4\b5\b5\b4\b2\b1\bd\9f\9c\a8\a2\92z]^8\1b\1b?\82\b5\be\90\80bH5I\82\9f\c5\c6\c4\bd\b4\ac\a9\a8\a0\a7\a6\9e\9c\a4\a7\a4\9e\9e\a6\a9\a3\a2\a6\a3\88\85\85\8e\99\9b\93\8a\9a\9e\a1\99\84eG36SimdPDI>7,'/B`zL-4I=4ETgobQ[lqsxu\81umsn|yhMPw\8e\8f\91\81\8e\8al]u\8e\8c\85\88\8b\8d\8b\89\86\85\85\86\86\85\82~yvpuywpkkn`knhiqnanhgs\82\82o[i^NA;@@>GCBJUWNC8(6:\22'5%:)\84\aaRU\94|\89wniT9,).\22&358?>@E>LVXfa^SQRSg\7f\84mmonoz\7fvihmx\86\8c\88\82{\81\8a\8f\8e\87}vu}\86\88\84\80\80\82aqxrs|~vo\80\8d\85qjy\8b{rbPB>CI<74@Zu\84\87\87\82\7f\84\89\85wibv~m``^UDIH<-,:JRPI>56AK=JTN?9CQQD:7516?9:<;84.+%&&#!\22&*\1e6\8c\9f\9c\ae\a0\ab\ab\aa\ab\af\ab\a4\aa\ba\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a1\a7\a9\a7\ad\b9\bb\b3\b0\8eA6\89\b6\a7\a6\a8\a8\a8\a8\a8\a8\a8\a8\a7\a6\a6\a5\a5\a4\a4\a3\9e\a0\9d\9a\a1\95\1d\06e}\9b\ab\aa\a4\a1\a3\a2\9a\88o[T\5cf\82\9e\ac\b3\bc\b3\b0\c3\b0\ac\b7\b2\a6\bf\c1\94NLSWD[\a5\c8\b9\ab\a2\8f\8d\84o\83\97\8a\91\a2\a6\a7\a6\9d\a6\a5\a4\a2\a1\9f\9e\9d\a3\a3\a3\a3\a2\a2\a2\a2\a1\aa\99\a8\ab\a1\a9\8c\a8\af\a2k52@9023104>FC@;51>m\a2\c2\b3wP\84\c4\b3}\99\a7\93\ab\cc\c0\b5\a6wqdO6\22\18\15%(/5306?EFO[^VPOJSZ[]diiZ`irx{||\83\8b{mvtd_t\82\81upoibUbu\84\8a\84ypz~\83\87\89\88\85\83{~{jQ?:<78>K\5ciopy\82\86}ldir\86\87\80lR@;=5BA5;[x\83cTC9:?BB>943440,+08>@?<:541.*'$#\22#'$\1d\1e# /\84\97\90\9d\a2\aa\af\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\a8\a8\a8\a8\a8\a8\a8\a8\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a2\a3\ac\ae\a8\a9\b0\a9\a9\a9\a9\a9\a9\a9\a9\a6\a6\a5\a5\a4\a4\a3\a3\a2\a0\9f\a0\a6\94\1b\06\7f\89\95\99\92\83sjL[o\82\92\a3\b5\c2\b8\a9\a6\ad\a9\9e\a0\a8\98\a8\a0\a3\b2\8cRFQ[\81\a4\83]o|\8b\8f\a0\b2\a7\95\a3\b8\99\88\8a\9a\a3\aa\aa\a2\a7\a6\a6\a5\a4\a3\a2\a1\9e\9f\a0\a2\a4\a5\a6\a7\a6\9d\a5\aa\a8\9f\91\8f\bc\a7\85\8e\a0kBb:_YHNBCmrtz\87\a8\d5\e3\d1~:g\bc\ba\ae\a0j\88\92\7ft\84\9b\b4\c4\c9\cd\cf\cb\c2\ba\b6\b6\aa\95nJ<:/\1e )/15>@=C@BCA=988752-'#\1f\1d(\1e $\1e\1e!\1c\7f\aa\af\99\97\a6\af\a8\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\a9\a9\a9\a9\a9\a9\a9\a9\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a1th\92\b3\ab\9f\a4\a9\a9\a9\a9\a9\a9\a9\a9\a6\a6\a6\a5\a4\a4\a3\a3\a2\a0\9f\a0\a7\95\1b\06tl`Y_s\8c\9e\ad\b3\b7\b5\af\a9\a9\ab\a1\a8\ae\a9\a1\a2\a3\a0\9c\ae\af\81JJ\81\b1x\a3\bd\ae\8a\89\97~lnz\9d\9d\94\a7\9c\8f\90\9b\a4\a1\a1\a7\ab\a7\a7\a7\a6\a6\a6\a6\a6\97\99\9c\a1\a5\aa\ad\af\aa\a2\ae\a7\a3\a5\98\a3\95~\9c\a2w\8c\b6\a2\81\9f\88\90\cf\c8\9c\ab\b9\bb\b8\ac\9a|K\1cF\a0\ca\b4\ab\af\a1\93y\98\af\9f\95\a0\a1\a1\ab\ac\ad\ad\ae\b2\b9\bf\c4\c9\ce\ca\bd\af\aa\ac\a0\89`9(*/..12124.%.39>BFJMFMTX]dbYdfe^\5cac_cehjjige_bfijhebrsuwthWJE82Df\80\85\80~|r`T[u\8c\8c\81ursm]Ogdq\83zW@??\5cwsW=8>F>2**08==5+(,00./.-*(&$##$\1f$*!0[\a7\a9\a9\90\89\a7\b0\9f\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\a9\a9\a9\a9\a9\a9\a9\a9\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a7\b0\b4\ad\a8\aa\ae\ae\a9\a9\a9\a9\a9\a9\a9\a9\a7\a6\a6\a5\a5\a4\a4\a4\a2\a1\9f\a1\a7\95\1b\06t\88\a1\b1\b4\b1\b0\b1\aa\ab\a9\a5\9f\9e\a2\a6\9e\a9\a7\a2\ab\ad\a1\99\b9\b4r@q\ac\98gy\9b\ac\a1\8a\92\ae\a8\a7\8agl\8a\aa\b2\90\9a\94\94\9a\a1\a5\a5\a1\a5\a5\a5\a6\a6\a7\a7\a7\a7\a6\a5\a4\a3\a2\a1\a1\a1\9d\a2\ae\af\9f\98\a4}\b4\81M\8e\b6\96\8dS\86\a2\af\bc\a6\91\a1\ba\9e\a4\d1\b6L:\92\bf\b8\aa\9d\a1\ab\a2\8b\95\ab\b6\a3\91\9d\ab\a8\a3\a5\a8\a9\a9\a8\a8\a8\ac\a9\ac\b3\b1\a9\a8\af\c6\af\a4\b6\c9\bd\97va_YQMI>2\1e\19\18 ,30+)-.157DZXLEEFLL@IMRWZZXVY\5cafhgedxuuz{nT?K.\1c4i\93\9b\91Uboqnq\80\8e\9a\89sc\5cYVSqqqiWTp\94wj[UUTME#,>Xp}}y\5cRD83369;94/)#\1f\1c!$&)! T\9f\a2\99\9f\90\92\b5\b6\a6\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a7\ab\ab\a7\a8\ac\ad\a9\a9\a9\a9\a9\a9\a9\a9\a9\a7\a7\a7\a6\a5\a5\a4\a4\a3\a1\a0\a1\a8\96\1c\07\a1\a7\ac\ab\a5\a2\a3\a7\9d\a0\a3\a4\a4\a4\a6\a8\a3\9c\a7\aa\99\9b\ac\b0\a6_N\8d\b0\8fw\83\9b\a3\a8\ac\95\83\9c\af\ac\b2\a9\83t|\83\97\ae\a4\98\97\a4\ac\aa\a5\a3\a3\a3\a4\a4\a5\a5\a5\a3\a4\a4\a4\a4\a5\a5\a5\a5\ae\8f_`\83\91\8b\9d3T\b5\a7\85\92\90w\88\b8\c3\9b\91\a3\9f\b4\b2\b0o([\b4\be\b0\a7\b7\ad\90\a8\afu\97\a9\a5\a2\93\90\ac\aa\aa\aa\aa\ab\ab\aa\a8\a6\ab\ae\ac\a9\ad\b0\a4\93i~\9f\b7\ba\b0\ad\b2\81\a0\c2\d3\d6\d4\d0\cc\c2\bd\b7\b2\a7\92t_7%\22(,77#2,55&&3361*(,8ENNQUYZXUShgiqukT?8Fd\88\9a\86U,Vhyyk\5cWYQSQJB@GN>^yyqrwxg_M6'+?Q\88\93\9e\a0\99\8f\88\86|xjR8+/85531/-,+%\1f'&\1e>z\9d\98\99\a0\96\a1\b7\ae\a9\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a7\aa\ad\a7\9e\a1\ab\a9\a9\a9\a9\a9\a9\a9\a9\a8\a8\a7\a7\a6\a5\a5\a5\a3\a2\a1\a2\a8\96\1d\08\a4\a2\a1\a4\a7\a8\a5\a1\a2\a3\a4\a6\a6\a6\a6\a6\9a\96\b0\aa\8c\a7\b8\88E]\aa\c5\91\88\9e\8dm\8c\9e\a5\99\8f\9d\a0\a7\a4\a9\9b\92zVg\a2\a4\9c\99\a1\a6\a4\a2\a4\a4\a4\a4\a4\a3\a3\a3\a9\a8\a7\a6\a4\a3\a2\a1\a5\a0\ac\aa\a7\8a]d,\8f\92l\99\c1\b7\bb\a5|\92\a4\8b\a8\cc\ad\be\9fI=\90\a9\94\aa\a2\a6\a5\ad\bd\b5\99\88\99\b0\a9\b0\a1\8b\a5\ab\af\aa\a5\a4\a6\a9\aa\aa\a9\ae\af\ab\a5\a3\a6\a8\ba\aa\97\94\a4\af\a2\8c\91\a0\ad\ad\aa\ad\b2\b5\bc\bf\c2\c5\c6\c8\cb\ce\d4\d1\d4\a0S`\9b\a5l@*,+46#!\22#%(+.//461+(A?;60+'$\1b-\1f X\87\8d\8e\91\9d\9b\94\a3\ab\a2\a8\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\a5\ab\a9\a4\a8\b2\b1\a7\a9\a9\a9\a9\a9\a9\a9\a9\a8\a8\a8\a7\a7\a6\a6\a5\a4\a2\a1\a3\a9\97\1d\08\aa\a5\9f\9f\a2\a4\a3\a0\a5\a3\a0\9e\9e\a0\a1\a2\af\a7\a0\9d\a5\b0\8aGu\b4\bd\93\80\80\82\8d\88\95\93\94\89\81\9b\b1\ab\9e\9e\a8\a6\93\87\91uvnu\94\ab\ad\ad\a9\a8\a7\a6\a5\a4\a4\a3\a1\a2\a3\a5\a6\a8\a9\a9\ad\a9\a9\ac\a6\7f`r\af}\88\aa\a3\a7\b9\ae\99\82\90\95~\8d\a9\9c>\14W\bd\c0\a7\ad\aa\aa\a5\a4\9e\9e\ae\a5~\94\ac\ac\af\a8\94\9b\ab\ac\aa\ab\ae\b1\b0\aa\a5\af\a9\a9\b0\af\a6\a4\a9\ab\b4\b3\a1\91\92\9e\a7\af\b0\ad\a8\aa\af\af\aa\a6\ac\b0\ae\a9\a6\a8\ab\b3\a7\b3\b5\89h\85\b7\94;\08!^\aa\d2\c7\c9\c8\c0\ae\8egB,')-//,(&;DOUVVXZMMD2'6[|\9c\a4\a5\94v]RR>BFE?70-A:9H`gS:8G[ku}\88\90\9c\92\86\81\81\80zti_VY``VJ98630.,+\16/!<\94\aa\8b\90\95\a4\9b\9b\a8\a7\a7\ad\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\aa\a8\a7\aa\ab\a9\a9\aa\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a8\a8\a7\a6\a6\a6\a4\a3\a2\a3\a9\97\1e\09\a0\a1\a2\a1\a0\a1\a3\a5\a9\a8\a6\a6\a7\a6\a4\a2\9e\a7\97\a5\b5sN\8a\b4\b3\9a\82\8d\a5\a8\9e\9e\ad\a9\a3\93\84\94\a2\a6\9f\97\a4\99\92\a9\a5\9d\9b\83ms\83\92\a1\ad\ac\ab\a9\a8\a6\a5\a4\a7\a7\a6\a6\a5\a5\a4\a4\ad\aayrmVu\94\82\a9\bf\bd\b4\a4\9f\ae\af\87ej\81w@\0aO\9e\c4\b1\aa\ad\aa\a9\a9\a7\a9\a3\a1\b1\a6|\99\aa\ad\a7\aa\9c\8f\a1\ac\a8\a5\a6\ac\af\ae\ac\a6\aa\ab\a8\aa\ae\ae\a9\a6\a9\af\b0\a4\96\96\9f\ae\b2\b0\a9\a6\a9\ab\aa\ab\aa\a8\a6\a6\a8\aa\ad\a5\b3\a9\b4\bdu:U}\80\b1\d7\cb\c3\c8\bd\b9\be\c5\cb\ce\cb\c7\c4\a9\a4\98\86pYF;+5=;318@JP\5cinhZNaq\7f|kZSTQC57G[gkh[_w\81r^Wiu\82\85zk_Z`o\83\8d\88yh^X`d^N@;;;962.)&%%\15,m\97\90\83\87\99\a6\9a\a1\a9\a3\aa\a8\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\aa\aa\aa\aa\aa\aa\aa\aa\a9\a9\a9\a9\a9\a9\a9\a9\ab\a5\a5\ab\ac\a7\a7\ab\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a8\a8\a7\a7\a6\a6\a5\a3\a2\a3\a9\97\1e\09\a2\a2\a2\a2\a2\a2\a2\a2\a3\a0\ac\a7\a6\a5\97\9e\99\a8\b5\a4^M\8e\a9\b6\99\81\91\ae\a9\a1\b0\9c\a3\a8\ad\a3\8b\8f\af\aa\9c\8e\8d\9a\a6\ab\aa\ab\a4\a1\9e\8eta[j\7f\94\9e\a7\b2\b5\b2\a2\b5\b7\ad\ae\af\b0\b7\b2\ab\91OT\86\8e\a5\b0\b0\aa\a3\a6\ac\aa\a5\aa\9f{so?I\a1\b9\b6\b1\ac\a8\a5\a4\a3\a8\a8\aa\a7\a7\ae\a0\82\9b\a4\a9\a7\a5\a4\9c\92\aa\af\ac\a4\a3\aa\ab\a5\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\87\9b\ab\ab\a7\a9\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\b2\aa\a1\ab\ad\86XMl\aa\c3\ac\a3\ab\ab\a7\ab\ac\ad\ae\af\b0\b0\b1\b7\bf\ca\d2\d2\ca\bf\b7\85\5c*\0f\12\1e$#/6::?B7&AO`kj^PFHOX]cr\88\9a\9a\94\8f\91\94\8czjypdZVZbhv\83~galiXZ[\5cZUME?>4*',/,'\1c_\97\89\95\9c|\90\aa\9b\a2\ac\a5\a6\ac\a6\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\a9\a9\a9\a9\a9\a9\a9\a9\ab\ab\ab\ab\ab\ab\ab\ab\a9\a9\a9\a9\a9\a9\a9\a9\a9\a9\a8\a7\a7\a6\a5\a5\a4\a3\a1\a2\ab\9e\16\07\a2\a2\a2\a2\a2\a2\a2\a2\a3\a6\97\af\b1\9a\a9\aa\9f\a8\a5XK\96\b4\bc\9a\88\91\a8\aa\a6\a7\a2\9d\a3\a8\ac\a4\8d\8f\ac\a6\9b\90\91\9d\a7\aa\a8\a5\aa\ae\af\ae\aa\a3\9d\99\8e~rjfgj~u\82\8e\88\87}a\5c\87\83j\8e\87O^\a3\a4\9e\9f\ac\ad\a3\9f\ae\be\a9}Z\8a\cc\b0\b2\b0\ad\aa\a8\a7\a8\a8\a8\a8\aa\a7\a7\ae\a0\82\9d\a6\aa\a8\a7\a6\9f\95\a4\ab\ad\a7\a5\aa\ab\a7\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\a2\99\98\a4\ac\ab\a9\ab\ab\ab\ab\ab\ab\ab\ab\ab\a8\a2\b1\ab\94\a4\ac\88b\8f\a9\aa\ae\ae\a6\a3\ab\ab\ac\ac\ad\ae\af\af\b8\b4\ae\aa\aa\ae\b4\b8\b9\bd\c5\cf\cf\bd\9e\86_@9;?A<==>>=<><966DKGHMG9?=9668<>0 2E\8d\a4\8b\81\82\81\97\97\a2\96\98\a4\a9\ae\b2\b3\b1\b1\b1\b1\b1\b1\b1\b1\ae\ae\ae\ae\ae\ae\ae\ae\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ad\ad\ad\ad\ad\ad\ad\ad\ab\ab\ab\ab\ab\ab\ab\ab\ad\ad\ad\ad\ad\ad\ad\ad\ad\ac\ac\ab\aa\aa\a9\a9\a7\a6\a5\a6\af\a1\1a\0b\a6\a6\a6\a6\a6\a6\a6\a6\af\9b\a7\bf\87My\b3\b0\96\a6\9d\8d\a7\b1\a6\9e\aa\a6\a1\a5\a2\a1\af\a2\a9\a4\a3\ad\a7\92\87\9d\9f\a0\a0\a1\a4\aa\ae\a3\aa\ab\a5\a3\a6\a2\9a\95\8e\90\9e\a8\a9\a9\ac\9d\a3\bf\c0\88Va\83l\92\c5\b6\aa\b1\ac\ce\86+,\8e\c8\c2\b1\a3\a2\93\97\ae\b4\9a\81\84\ae\ad\ab\aa\aa\ab\ad\af\a8\a8\aa\a7\a7\ae\a0\82\a5\aa\ab\a7\a8\ac\ab\a6\ae\9e\97\a1\ac\ab\a7\a6\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\aa\af\ae\a6\a5\a8\a6\9f\ab\ab\ab\ab\ab\ab\ab\ab\99\9a\ae\b9\ad\aa\b0\ac\b5\a5\a6\ac\a9\af\b3\a7\b1\b0\b0\af\ae\ad\ac\ab\aa\aa\ab\ac\ac\ab\aa\aa\ab\ad\af\af\ad\ac\ab\ac\b9\aa\a8\b1\9dlG?M[ilebhqnllr{\7f}xvnggh`N>YN=0.6CL77:??<:;HD?:9:=@NE7(#-AR\9d\a0\88yy\89\a4\9e\98\8f\9f\b1\ae\af\b2\aa\b1\b1\b1\b1\b1\b1\b1\b1\ae\ae\ae\ae\ae\ae\ae\ae\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ad\ad\ad\ad\ad\ad\ad\ad\ab\ab\ab\ab\ab\ab\ab\ab\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ac\ab\ab\aa\a9\a9\a8\a7\a5\a6\af\a2\1a\0b\ac\ad\9f\a6\a8\a2\a9\9e\a5\a5\b6\85Rw\a7\b5\ab\a6\95\8b\98\aa\ab\a4\a6\a6\a7\a7\a6\a4\a1\9f\a3\9b\a1\a1\ac\a2~\8c\9b\98\a0\a3\9b\9f\a9\a7\a2\a3\a5\a6\a7\a6\a5\a4\a1\a9\ac\a7\a6\ac\b2\b2\b4\a1}[Fq\b8\bc\bb\88H|\b1\b9\aaD\15\85\c0\bd\b3\ad\af\ab\96t\95\a5\ab\ba\9b\87\a2\b4\ad\aa\ac\a7\aa\a7\a9\ac\a6\a5\a8\b4\90\85\a9\a9\a9\a9\a9\a9\a9\a9\ab\ab\9a\93\a3\a9\a8\b2\aa\aa\aa\aa\aa\aa\aa\aa\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\9b\a7\a5\a5\b0\ab\9f\a1\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\b0\ac\ac\af\a2|K(GU`^XYbhdgklh`WQ^\5cUJADR^4?KOI@<;@;66:<:7=:61/./0920(151N\a2\ac\88|\85\8c\a4\a4\8c\9a\9e\a4\b3\b2\aa\b1\ad\ae\af\b0\b0\ae\ac\ab\ad\ad\ad\ad\ad\ad\ad\ad\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\aa\ab\ad\b0\b8\a8\1c\0a\a4\9b\ae\ae\a5\a5\9d\a3\a6\b7\7fV{\ae\bb\9f\ab\a1\88\8b\a9\ab\9f\a9\a5\a6\a6\a5\a3\a4\a8\ab\ad\a8\a5\a5\ad\9f\87\8f\96\98\a7\af\a7\a6\aa\a4\aa\a9\a8\a7\a7\a8\a9\aa\a7\aa\af\b6\b7\aa\8fwg\91\aa\82\87\af\ac\b6\ac}`\84\5c\0f\1a\1e\92\af\b1\af\ab\a1\a4\a3\b0\8d\ad\bd\b5\af\92\8c\9f\b2\ab\a9\ac\a7\ab\a8\a9\ac\a6\a6\a9\b3\90\86\a9\a9\a9\a9\a9\a9\a9\a9\a8\ac\a2\96\9d\a9\ad\ad\aa\aa\aa\aa\aa\aa\aa\aa\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\90\9d\a7\a8\a9\af\ab\9c\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\af\b0\b3\b6\b1\9arRV`gf``fl_ciorqon\5cOFMasxveije^\5c`fl\5cG958;<<81+*2ALI40($,Fy\99\aa\8duw\8b\a6\9d\8c\99\9e\a5\b3\b2\ac\b1\ac\ad\af\b0\b0\af\ad\ac\ad\ad\ad\ad\ad\ad\ad\ad\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\aa\ac\ad\b0\b8\a7\1c\0a\a3\a3\a3\9c\ae\b6\a1\a9\b8{R\83\b0\a9\a8\a4\ab\8f\80\97\af\a8\9f\a7\a4\a9\ac\aa\a4\a3\a8\ad\ac\af\a4\a9\ae\9e\97\96\9b\98\9f\a2\9a\a0\ab\ab\a7\a6\a5\a5\a8\ad\b3\b6\ae\a8\97{fm\91\b4\c0\b8~e\93\b5\b2\aa\a0\7fj{|\87\b7\cb\c2\b3\a6\af\ae\a9\b3\aeq_st\80\a3\9b\89\9b\ae\a8\a7\ab\a8\ac\aa\aa\ac\a7\a8\aa\b1\8f\89\aa\aa\aa\aa\aa\aa\aa\aa\a5\ab\aa\9d\97\a7\b1\a8\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\a4\9a\a1\ab\aa\af\a9\8f\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\a8\ae\b2\b1\b2\ac\91sEJS]cit}pomkgc`^]__][Z]`]cjlmr|\85qbNCDMV[.8DFA<>B)\1d %17N\8c\a6\a1yau\a2\ad\81\8d\98\9f\a7\b2\b3\ae\b1\ab\ad\af\b0\b0\af\ad\ac\ae\ae\ae\ae\ae\ae\ae\ae\ad\ad\ad\ad\ad\ad\ad\ad\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ab\ac\ae\b0\b8\a7\1b\09\a7\a6\9a\a9\aa\9a\aa\b9\82U\83\b7\af\a3\a2\a8\a6~\8a\a8\a3\a3\ac\a1\a4\ac\b3\b1\a9\a3\a4\a8\a1\aa\9c\a6\a9\9e\a7\a0\8b\90\a2\ae\ac\b0\b7\b4\ad\ae\af\ac\a1\92\83ylt\89\a5\b7\b8\b1\ac\c0\8fc\8b\b0\ad\b1\a3\9c\95\a5\b8\bd\c2\be\b2\b1\a5\a1\a9\a5\ac\b5\952Ciu\8c\b5\ac\90\98\ac\a6\a6\ab\a8\ad\ab\aa\ac\a8\ab\ab\af\8e\8c\ab\ab\ab\ab\ab\ab\ab\ab\a8\a7\ae\a8\99\a2\af\a7\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ae\98\9b\b0\b3\ac\aa\ab\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\a7\b0\b0\aa\ac\b0\9f\85WRT`ims{trnjea_]\82\80ucSTeuirzxl_VSMQX`bXG95G[_R>/*-&\1b\1b=Qa\9b\8a\95\86aW\7f\9b\8a\90\98\a1\a9\b1\b2\b0\b0\aa\ac\ae\b0\b0\b0\ae\ad\af\af\af\af\af\af\af\af\ae\ae\ae\ae\ae\ae\ae\ae\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ac\ad\ae\b1\b8\a6\1a\08\a7\a4\a5\ab\9b\a0\ac\85O\7f\b7\b1\a3\b1\ae\ab\96\87\9c\aa\99\a1\b1\a2\a6\aa\ad\ac\a7\a5\a9\ae\a6\b2\ab\b4\ad\9f\a5\95\8c\8c\97\99\8a\82\7fuzyx|\86\95\a4\ae\b0\b8\be\b9\ac\a2\a3\a8\a7s\87\a4\a7\a7\9c\a5\93\9a\b5\b9\ac\a7\a5\ae\ab\a6\a9\b1\a8\aa\9c^~\c1\cd~_\95\9dp\99\ac\a7\a7\ac\a9\ae\ac\ab\ac\a9\ae\ac\ad\8d\8f\ab\ab\ab\ab\ab\ab\ab\ab\ad\a3\ac\b1\a2\9d\a7\a8\ac\ac\ac\ac\ac\ac\ac\ac\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\a6\a5\a8\b4\b4\9c\8f\9c\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\af\b7\b5\ad\b0\b9\b0\9bue`p}\7f\82\8a||zxtoki]VT^mvqj_jvyrieddXH@BINPW[ZQC968/#$\1e0Yx\96\89\90\84^Uw\90\92\95\99\a4\ad\b0\b1\b0\ac\a9\ab\ae\b0\b1\b0\af\ae\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ad\ae\af\b1\b8\a6\19\07\a4\a6\a9\9d\a9\ac}]\8b\aa\ab\ad\ad\a8\ae\a4\89\a1\a8\9e\9c\a4\a8\aa\a8\a5\a2\a1\a4\aa\af\b3\a9\9f\88s`f}{ux\8a\97\98\a2\b0\b0\bb\bc\bd\bc\b9\b4\af\ab\b2\b3\ac\a2\a2\ac\b1\af\7f\88\9c\a3\ab\b5\ab\9c\9d\aa\b3\a6\a3\b2\b3\af\ab\aa\af\b9\b0\b1\ae\82\89\86\85\8f\a8\bc\b2\9a\9d\b0\aa\a9\ad\aa\ae\ac\ac\ab\aa\b1\ad\ab\8c\93\ac\ac\ac\ac\ac\ac\ac\ac\b0\a4\a9\b4\ac\9e\9f\a7\ad\ad\ad\ad\ad\ad\ad\ad\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\aa\a3\89\7f\95\a1\9e\a1\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\af\af\af\af\af\af\af\af\ad\b2\b2\ad\b2\bb\b8\ac~dZn\81\82\83\8aquz|zunijmt{}yogW^eghmw\80niddec]XaYLC@BFJ;%;.\14Bty}\8f\84TNn\80\97\9c\9d\a8\b0\ae\ae\ae\a7\a8\aa\ad\af\b1\b1\b0\af\b0\b0\b0\b0\b0\b0\b0\b0\b1\b1\b1\b1\b1\b1\b1\b1\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\ae\af\af\b1\b7\a5\19\06\a4\a1\a8\ae\a8w]\98\bd\b3\a5\ab\a7\a8\ad\8c\8f\ae\aa\98\a0\a7\a5\ad\aa\a5\a2\a6\ac\ad\a4\9b{\83\9e\a3\a1\b5\be\b9\90\97\ad\ba\b3\b0\ae\a4\a9\aa\ab\ac\ac\ab\aa\a9\ab\b1\ac\a2\a8\b4\aa\93y\aa\ab\ad\af\a9\ae\95\a3\ae\b2\b2\b0\ad\ad\ac\ae\ae\a9\ac\aa\b2\b8\9b\95\a3\a8\ae\b4\b2\a5\92\a2\b5\ae\ac\af\ab\ae\ab\ac\ab\aa\b3\ae\aa\8c\95\ad\ad\ad\ad\ad\ad\ad\ad\af\ab\a8\af\b2\a5\9c\a1\ae\ae\ae\ae\ae\ae\ae\ae\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ba\af\9c\98\af\c1\b3\9b\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\ac\ad\ac\ad\b1\b5\b3\af\94oZhumeiU_n|\81\7fwqxvkUA>M]@JW`iu\85\91\8d\84zsojc\5cXNEFNRKC4\1e/'\1dP\8b\a3\9b\a7\84Ml\9d\93\97\a3\a0\ab\b3\ac\ab\ac\a1\a8\aa\ad\af\b1\b1\b1\b0\b1\b1\b1\b1\b1\b1\b1\b1\b2\b2\b2\b2\b2\b2\b2\b2\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\ae\af\b0\b1\b7\a5\18\05\a8\a6\ad\aeza\95\b7\aa\a5\b0\a3\a3\b6\a4\8b\9e\aa\a8\9d\9e\a8\ab\a8\ab\a9\ac\b5\ba\ad\90x\9a\99\b7\ac\9d\ac\a5\9e\8d\90\a0\aa\a3\a4\a8\a3\aa\a9\a7\a6\a6\a6\a8\a8\9c\ae\b1\a7\ab\b3\9ey\9d\9c\ab\ac\b1\b2\9b\98\a6\b7\b0\aa\aa\aa\b1\ab\a7\af\ab\b2\b8\af\83:\8f\b1\ac\96\9b\ae\a8\84\a6\b8\b1\ae\b0\ab\ae\ab\ac\ab\ab\b4\ae\a9\8b\96\ad\ad\ad\ad\ad\ad\ad\ad\ac\b2\aa\a9\b4\ac\9b\9c\ae\ae\ae\ae\ae\ae\ae\ae\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\ab\99\86}yx\8c\a1\a1\ab\ab\ab\ab\ab\ab\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ad\ad\ad\ad\ad\ad\ad\ad\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\b6\b2\b1\b3\b4\b2\af\af\99pZjzsjnit\82\8c\8c\81qgABHR[YMAr{\83\81tf]Zgeehlkd]\5cNBFRVJ;5/-(;NZ}r\a3\8c=N\7f~\96\a7\a2\ae\b4\ab\aa\aa\9e\a7\a9\ac\af\b1\b1\b1\b0\b1\b1\b1\b1\b1\b1\b1\b1\b3\b3\b3\b3\b3\b3\b3\b3\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\af\b0\b0\b1\b7\a5\18\05\a7\b0\a9z^\8a\b5\a9\a9\a2\ae\a7\a7\aa\97\99\a7\ab\ab\a2\98\99\a5\b2\ab\a7\b0\b5\96py\a0\a8\b3\a2\97\aa\ae\a6\ad\8c\81\ad\ad\9e\af\a7\a7\ab\a5\a5\ab\ab\a7\a8\ae\a7\b8\a8\a1\b6\9d\7f\9d\ad\9a\a7\ae\b0\a9\97\a4\b3\b3\b1\b0\af\ae\ae\ad\b1\ad\a6\ad\b4\a4\a1\bc\c7\b0\a8\a0\a5\b1\a6\9d\ae\ae\ae\ae\ae\ae\ae\ae\b2\b2\aa\b1\af\a7\8a\a2\b0\b0\af\ae\ae\ad\ac\ac\af\ae\ae\ad\ac\ab\aa\a9\97\ae\b0\a9\b0\af\a8\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\97M(Y\98\a5\96\8e\a2\ab\b0\ac\aa\ad\ae\ab\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\af\b0\b0\b1\b2\b2\b1\b1\b1\b1\b1\b1\b1\b1\b4\b4\b4\b4\b4\b4\b4\b4\95nT_qtv}w{\82\85\81uf[cZW_mocTeoo[?3@Sjouxtj^VUUTQLE>:,74'RdIf\80\9ctOhy\82\a4\a5\9c\a5\b3\b0\a9\a8\a5\a2\a9\b1\b4\b3\b0\af\af\b4\b4\b4\b4\b4\b4\b4\b4\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b0\b0\b0\b0\b0\b0\b0\b0\af\ae\ae\b3\bc\aa\19\02\ab\ac{a\96\bf\b0\9e\a5\aa\aa\a6\ac\a4\94\a0\a7\ab\ad\a9\a1\9d\a1\a6\ac\a7\8dov\9e\b9\ba\b3\ab\9f\9d\9f\a0\aa\bc\96|\9f\ac\ab\b8\ab\aa\ab\ad\ad\aa\a5\a3\a9\b1\aa\a9\ad\ad\ab\92\89\ba\ab\9d\aa\b0\ae\a7\99\a7\b0\ac\a8\a5\a5\a9\af\b3\b2\ae\ae\b5\b3\a3\a2\b5\b9\ab\ae\ae\b3\b6\a0\92\af\af\af\af\af\af\af\af\b2\b2\ab\b1\af\a7\8b\a3\b0\b0\af\af\ae\ad\ad\ac\af\ae\ae\ad\ac\ab\aa\aa\9a\ab\b0\ac\ad\af\ab\ab\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ac\ba\c2\cb\cb\bf\ad\a0\9a\a3\ac\b0\ac\aa\ad\ae\ab\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ae\ae\ae\ae\ae\ae\af\af\b0\b1\b1\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b4\b4\b4\b4\b4\b4\b4\b4\a6\82gktpmpju~yj_`fccfjmh^Vie^WU\5cirmpssncXQ[[[YTNHE&)18e{bn\9e\a9\86a\5c}\a4\99\a1\a2\ae\b3\a7\a1\a8\aa\a3\a9\b1\b4\b3\b0\af\b0\b3\b3\b3\b3\b3\b3\b3\b3\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b2\b0\b1\b5\be\ac\1b\03\a2yj\94\bc\b3\a5\af\a2\b1\a6\a7\af\9b\95\a8\a7\aa\ae\ae\ab\a5\9e\9a\b2\a6\9e\a5\b4\b9\b1\a5\ac\a9\a6\a1\a5\b8\c0\b4\83e\7f\91\94\9e\99\a3\a4\a9\ae\ae\ac\ac\ae\b1\ac\b3\a7\b7\8f}\bd\b7\a6\a1\ae\b2\ab\a2\9c\ac\b4\b1\ad\aa\ab\ae\b2\b5\ab\a6\ad\b2\a7\9f\a9\b6\b0\aa\b2\b6\bb\b6\9b\91\b0\b0\b0\b0\b0\b0\b0\b0\b2\b2\ab\b2\b0\a7\8b\a3\b1\b1\b0\af\af\ae\ad\ad\ae\ae\ae\ad\ad\ac\ac\ab\a0\a6\af\b0\ab\ae\b0\aa\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\a5\b7\bc\b0\aa\af\ab\9e\a3\ac\b1\ad\ab\ae\af\ac\ae\ae\ae\ae\ae\ae\ae\ae\af\af\af\af\af\af\af\af\af\af\b0\b1\b1\b2\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b5\b5\b5\b5\b5\b5\b5\b5\ad\8ai`dgnwlw\82\83{qllomha]blub\5cX[dlpokosupg\5cUXYYXUPKHL0*8b\82unRp\84eRz\99\96\a3\a7\b0\ad\a0\a1\aa\a8\a5\aa\b1\b4\b2\b0\b0\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b4\b4\b4\b4\b4\b4\b4\b4\b4\b3\b2\b6\c0\ad\1c\04ru\a0\bc\a8\a1\af\ab\a4\b1\a5\ac\aa\93\9e\ac\a9\a9\aa\ae\b0\ac\a2\9a\ad\b0\ab\9e\9c\a7\af\ae\b0\a7\99\9b\b3\b2s)Ud\9b\af\9f\98\9f\b6\b3\ab\a6\a9\ab\ac\b0\b6\ad\a8\c1\9d\84\ac\b0\a1\a3\a6\b2\b4\a9\9f\a2\b1\b3\b4\b5\b6\b4\b2\af\ad\b8\b0\b6\b4\a0\a0\b1\b6\b3\ad\b2\b2\b7\b1\9b\9d\b1\b1\b1\b1\b1\b1\b1\b1\b3\b3\ac\b3\b0\a8\8c\a4\b2\b1\b1\b0\af\af\ae\ae\ae\ae\ae\ae\ae\ad\ad\ad\a7\a2\ad\b2\a9\ae\b4\aa\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ac\ae\ad\ab\ac\ae\a7\9d\a4\ad\b1\ad\ab\ae\af\ac\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b1\b1\b2\b3\b3\b4\b4\b4\b4\b4\b4\b4\b4\b4\b6\b6\b6\b6\b6\b6\b6\b6\bb\9e{e_bktt{\80~rbTN_djmorw{w}\84\88\85|qj|\81\85\82t^G8MNOOLHC@?9JOCQp\85\92o\87rf\8e\86x\aa\a9\aa\a4\9e\a8\ac\a0\a7\ac\b1\b3\b2\b0\b1\b3\b0\b0\b0\b0\b0\b0\b0\b0\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b6\b6\b6\b6\b6\b6\b6\b6\b4\b2\b2\b6\bf\ac\1a\02m\a0\bc\ae\a6\af\af\a2\ab\aa\a7\b0\9f\93\ab\aa\ac\a8\a5\a8\ae\b0\ab\a5\8c\a1\a9\9d\9b\aa\af\a7\ab\ad\a3\a6\b1\96eP\9f\98\a2\a9\ad\b4\ae\a8\b3\ab\ac\b3\b0\a4\a6\b2\b5\ad\a0~\99\bd\a3\a3\a1\ab\b3\b4\a8\9e\a8\b4\aa\ac\af\b1\b1\af\ac\aa\ad\aa\b2\ae\9e\a4\b4\b2\b5\b0\b2\af\b5\ac\9b\a9\b3\b3\b3\b3\b3\b3\b3\b3\b4\b4\ad\b3\b1\a9\8d\a5\b2\b2\b1\b1\b0\af\af\ae\ae\ae\ae\ae\ae\af\af\af\ab\a2\aa\b2\ab\ae\b4\ac\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ae\ab\ab\af\b3\b3\ac\a5\a1\a5\ae\b2\ae\ac\af\b0\ad\af\af\af\af\af\af\af\af\b0\b0\b0\b0\b0\b0\b0\b0\b0\b1\b1\b2\b3\b3\b4\b4\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\ab\97\82xy~\80pz\80xf[^fym`\5ccs\82\8c\85\89\90\95\93\87uhlie`\5cYWVJKKJGB=:1&;VPUmm\94t\87\98\86\8b\9a\92\a8\a7\a8\a3\9e\a8\ad\a0\a9\ad\b1\b3\b1\b1\b3\b5\b0\b0\b0\b0\b0\b0\b0\b0\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b2\b1\b4\bd\aa\18\00\a5\af\aa\aa\b6\b1\a7\ac\b0\a6\aa\ac\97\9b\b2\a8\ae\a9\a4\a6\ac\b0\b0\ae\a8\98\97\ab\b7\b2\af\b4\aa\ad\9d\a0\b2\90S;\93\99\a0\a4\a8\ae\ae\ac\a4\a6\ac\b1\aa\a4\ad\bd\b2\9er\9c\b4\a6\bb\a0\a1\b0\b2\b4\a9\a0\ae\b5\ad\ad\ad\ae\b0\b3\b5\b7\ac\b1\b3\aa\a3\ac\b2\a9\b0\b1\b4\b3\b8\ab\98\ae\b4\b4\b4\b4\b4\b4\b4\b4\b5\b5\ad\b4\b2\aa\8d\a5\b3\b3\b2\b1\b1\b0\af\af\ae\ae\ae\af\af\b0\b0\b1\ae\a5\a7\af\af\af\b1\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\af\b6\b6\af\a8\a9\ad\a8\9e\a5\ae\b3\af\ad\b0\b1\ae\b0\b0\b0\b0\b0\b0\b0\b0\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\b2\b3\b3\b4\b5\b5\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b3\9cxbaghgnw|~~\81\84vrnosusqsliq~\7fqb^k}\88\85t^NUUTQLF?<00A\5cNDcl\94\b1ey\bb\9f\8e\86\9e\a2\ac\aa\9e\a1\aa\a8\ab\ae\b2\b2\b1\b1\b4\b7\b1\b1\b1\b1\b1\b1\b1\b1\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b2\b2\b2\b2\b2\b2\b2\b2\b6\b4\b3\b6\be\ab\18\00\b9\ad\a9\aa\aa\ae\af\a9\b1\a9\ad\9f\95\a8\b1\a9\af\ac\a9\a9\ab\ae\af\af\af\9f\93\9a\a7\af\b3\b5\a6\a7\9f\a3\b4\b1\9f\98\b1\a4\94\98\a3\a8\ae\b0\ab\ad\a7\9d\9f\ae\b6\b4\98z\9f\c0\ba\b9\ab\96\a3\b2\af\b2\aa\a3\b3\b4\b7\b6\b6\b5\b4\b4\b4\b4\c1\c6\b6\a0\a3\b1\b3\ad\ae\b1\b5\b5\ba\a9\96\b2\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\ae\b5\b2\aa\8e\a6\b4\b3\b3\b2\b1\b1\b0\b0\ad\ae\ae\af\b0\b1\b2\b2\af\a9\a4\ab\b4\b1\ad\b4\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\b0\a4\b0\b5\ad\a9\ad\ae\a9\a6\af\b3\af\ad\b0\b1\ae\b1\b1\b1\b1\b1\b1\b1\b1\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b3\b3\b4\b5\b5\b6\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\be\bd\a3w`l\80\88\82\7f\81\8c\98\98\8c\7f|yskfhrzupnt}}ti[ZZ[\5c^ab`_]XQIA928;k}iss\7f\ac\8a\1dP\b5\9a\98\9c\94\9e\ae\ad\a8\a8\a7\ad\b0\b2\b1\b0\b1\b5\b9\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\ca\ca\ca\ca\ca\ca\ca\ca\c1\bf\be\c0\c8\b4!\09\ab\ab\ab\ab\ab\ab\ab\ab\ab\b9\9e\95\aa\ae\ad\ad\ac\ac\ac\ac\ac\ac\ac\ac\ae\b2\b3\af\a6\9d\99\98\af\9a\a4\b4\ac\ac\b1\a5\ae\a7\9b\a8\b0\ac\b1\ad\b6\a4\b1\cb\b1yy\a6\c6\ac\ab\ac\b7\b5\99\99\b3\af\b0\a8\9e\ac\ba\b2\b6\b2\b1\b5\b2\99nLw\97\ae\ae\b0\bb\bc\b1\b7\b3\ab\bf\b3\93\a7\bf\b6\b6\b6\b6\b6\b6\b6\b6\b3\b4\b9\b1\b6\aa\96\b9\b5\b5\b4\b3\b3\b2\b1\b1\b1\b1\b1\b1\b1\b1\b1\b1\ae\b4\a8\a0\ae\b5\b0\b2\b0\b0\b0\b0\b0\b0\b0\b0\ae\af\b0\b1\b1\af\ad\ac\b2\ae\ac\af\b4\b1\a5\9a\98\a9\b1\aa\ab\b6\b8\ae\b1\b1\b1\b1\b1\b1\b1\b1\b0\b0\b1\b2\b2\b3\b4\b4\b3\b3\b4\b5\b5\b6\b7\b7\b8\b8\b8\b8\b8\b8\b8\b8\ba\ba\ba\ba\ba\ba\ba\ba\c0\b1\a1\80ptnpwux}|x|\85wy{zxx{~{z\82\8b\83qoz\82ymb]\5c\5c]YTQQSQKE@C/HwU1Xz\8e~1>h\97\8d\98\9e\a3\ac\a6\a0\ae\af\b7\b2\ad\ae\b3\b6\b4\b1\b3\b3\b4\b5\b5\b6\b7\b7\b9\b8\b6\b4\b4\b5\b6\b7\b8\b7\b4\b2\b2\b5\b8\ba\c6\c3\be\b9\b7\b7\b9\ba\b3\b3\b3\b3\b3\b2\b2\b2\b6\b8\bb\bf\c4\c8\cc\cd\cd\cd\cd\cc\cc\cb\cb\cb\c6\c7\c3\c9\d4\b4\18\07\ab\ab\ab\ab\ab\ab\ab\ab\ab\b8\9e\97\ab\ae\ae\ae\ac\ac\ac\ac\ac\ac\ac\ac\b4\af\a9\aa\ad\ac\a4\9c\90\84\98\b2\b1\b4\b8\ab\b1\a8\99\a5\ae\ae\b8\b7\bc\be\a1sp\99\b5\b2\af\b2\a9\af\b6\a0\94\a2\b2\ae\af\a8\a0\ad\b9\b3\b4\b1\af\b1\b4\b2\a9\a2\c0\c9\c4\b1\a5\aa\b2\b2\b5\b3\b1\be\ad\95\ac\be\b6\b6\b6\b6\b6\b6\b6\b6\b4\b5\b9\b2\b6\a9\99\ba\b5\b5\b4\b4\b3\b2\b2\b1\b1\b1\b1\b1\b1\b1\b1\b1\af\b4\a9\a2\ae\b5\b1\b2\b0\b0\b0\b0\b0\b0\b0\b0\ad\ae\b0\b1\b1\b0\ae\ad\ac\ab\ac\af\b2\b3\b1\af\9c\a7\b0\b2\b2\b4\b3\b1\b1\b1\b1\b1\b1\b1\b1\b1\b0\b1\b1\b2\b3\b3\b4\b4\b3\b4\b4\b5\b6\b6\b7\b7\b8\b8\b8\b8\b8\b8\b8\b8\ba\ba\ba\ba\ba\ba\ba\ba\bd\b4\ac\90\81\83|~xrs|\81\7f|~\92\86uihp{\83\80{{}uilxwdPLT[WPCACGLJB:>SFEcV7?\88\93\7f^GJQ_\84\a5\b5\ac\99\9b\b0\ae\b1\ae\ad\af\b4\b6\b4\b0\b3\b4\b4\b5\b6\b6\b7\b7\b9\b8\b6\b4\b4\b5\b7\b8\b9\b7\b6\b5\b6\b9\bc\be\c3\c1\be\bb\b8\b7\b7\b7\b4\b4\b5\b6\b7\b8\b9\ba\be\bf\c1\c4\c7\ca\cc\cd\cd\cd\cd\cc\cb\cb\ca\ca\c6\c7\c3\c9\d4\b4\18\07\ac\ac\ac\ac\ac\ac\ac\ac\ac\b5\9d\9a\ac\ae\af\ae\ad\ad\ad\ad\ad\ad\ad\ad\ae\ae\ae\ac\ab\ac\ae\b0\ad\93\89\88\81\8e\a4\a7\a9\a8\a3\b2\b6\a6\9d\90ll\80\a5\bf\c0\b7\b4\a2\b2\ad\b7\ac\91\a0\ac\b2\ad\ac\a8\a4\ae\b8\b3\ab\b1\b7\b8\b7\b8\bd\c2\bb\bb\b8\af\a9\ac\b6\be\b3\b4\b9\bc\a4\9a\b4\bb\b7\b7\b7\b7\b7\b7\b7\b7\b5\b6\b8\b4\b6\a8\9e\bb\b6\b6\b5\b4\b4\b3\b2\b2\b2\b2\b2\b2\b2\b2\b2\b2\b0\b4\ac\a4\ac\b3\b2\b2\b1\b1\b1\b1\b1\b1\b1\b1\ac\ae\b0\b1\b1\b0\ae\ad\b5\b5\b4\b1\ae\ad\b0\b3\98\9e\aa\b4\b5\b1\af\b2\b2\b2\b2\b2\b2\b2\b2\b2\b1\b1\b2\b3\b3\b4\b5\b5\b4\b4\b5\b6\b6\b7\b8\b8\b9\b9\b9\b9\b9\b9\b9\b9\bb\bb\bb\bb\bb\bb\bb\bb\bc\b5\ad\91\81\86\85\8c\84\89\8f\8e\80rt~\86xjgq~\86\89}\80\87\8d\86vopjdaeiaM;9FMD66KaLD9CQFF`\80\a6\86hW\84vk\8d\c6\ae\9e\9f\9d\b5\ac\a9\a9\ac\b1\b6\b7\b3\b0\b4\b4\b5\b6\b6\b7\b8\b8\b9\b7\b6\b5\b5\b6\b8\b9\ba\b9\b9\ba\bc\bf\c2\c4\c0\c0\c0\bf\bc\b9\b6\b4\b6\b7\b8\ba\bc\be\bf\c0\c5\c6\c7\c8\ca\cb\cd\cd\ce\cd\cc\cc\cb\ca\c9\c9\c6\c7\c3\c9\d4\b4\18\07\ad\ad\ad\ad\ad\ad\ad\ad\ad\b1\9d\9f\ae\ae\b1\af\ae\ae\ae\ae\ae\ae\ae\ae\ab\ae\af\ac\a7\a9\b0\b8\a6\a3\af\b7\ab\a0\95\84\8d\82pz\86\8b\9c\a0\b9\c2\c0\b4\b3\ba\b3\a1\ad\ab\b3\b6\99\9a\b8\ae\b1\ac\a9\a7\a9\b0\b5\b4\ab\b5\bf\c0\b8\b2\b1\b3\b2\b0\b3\b8\b4\ad\b0\b8\b1\b5\be\b7\9d\a2\ba\b9\b8\b8\b8\b8\b8\b8\b8\b8\b7\b7\b6\b7\b6\a7\a5\bd\b7\b6\b6\b5\b4\b4\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b1\b4\af\a7\aa\b1\b3\b2\b2\b2\b2\b2\b2\b2\b2\b2\ab\ad\af\b1\b1\b1\af\ae\b0\b0\b0\b0\b1\b2\b3\b3\91\9b\a9\b2\b4\b3\b2\b1\b3\b3\b3\b3\b3\b3\b3\b3\b2\b2\b3\b3\b4\b5\b5\b6\b5\b5\b6\b6\b7\b8\b8\b9\ba\ba\ba\ba\ba\ba\ba\ba\bc\bc\bc\bc\bc\bc\bc\bc\c0\af\97kQVZgskiqwvtu\88zllw\7f}wx\7f\8b\93\8f\82uoyvm\5cF5,*LA53;DIH:DD8:Tgdu\a7\7fJb\af\96\5c\91\a5\bd\9d\94\af\ac\b0\a3\a7\ad\b4\b8\b7\b3\b0\b5\b5\b6\b6\b7\b8\b8\b9\b8\b7\b6\b5\b6\b8\ba\bb\bb\bc\be\c0\c3\c6\c9\ca\c2\c3\c5\c5\c3\be\b9\b6\ba\bb\bb\bc\bd\be\bf\bf\c6\c6\c8\c9\cb\cd\ce\cf\ce\cd\cc\cb\ca\c8\c7\c7\c6\c7\c3\c9\d4\b4\18\07\ad\ad\ad\ad\ad\ad\ad\ad\ad\ad\9d\a4\b0\ae\b2\af\ae\ae\ae\ae\ae\ae\ae\ae\b4\ad\a6\a6\ab\b0\af\ad\97\9d\ac\b7\b9\bc\bd\b6\b9\b3\a8\b4\bc\b8\bc\b8\b0\ae\ae\af\ad\a9\aa\ad\b8\a8\b0\9e\8f\ae\bd\ac\b0\ab\a6\a7\af\b2\b2\b5\b3\b7\ba\b9\b7\b7\b9\bc\bc\b3\af\b0\a9\9d\9d\a7\b2\b7\bf\af\9d\ab\bb\b9\b8\b8\b8\b8\b8\b8\b8\b8\b9\b9\b5\b9\b5\a6\ac\bf\b7\b7\b6\b6\b5\b4\b4\b3\b3\b3\b3\b3\b3\b3\b3\b3\b3\b4\b2\ab\a8\b0\b5\b2\b2\b2\b2\b2\b2\b2\b2\b2\aa\ac\af\b1\b2\b1\b0\af\b1\ae\ad\b1\b6\b5\ac\a4\a2\b3\bc\b7\b4\b8\b4\aa\b3\b3\b3\b3\b3\b3\b3\b3\b2\b3\b3\b4\b5\b5\b6\b6\b5\b6\b6\b7\b8\b8\b9\b9\ba\ba\ba\ba\ba\ba\ba\ba\bc\bc\bc\bc\bc\bc\bc\bc\ca\b6\9cr`lv\86}nen{~|z\84sb`kvyuxzzzz{xtz}{rgdlu`hngWE;8.ARMJ_ePq\8btJ\86\a8\8fYx\b6\9a\84\a3\ab\b1\b7\a2\a8\af\b5\b7\b6\b4\b2\b5\b6\b6\b7\b8\b8\b9\b9\b8\b7\b6\b6\b7\b9\bb\bd\be\c0\c2\c5\c8\cb\cc\cd\c6\c8\ca\ca\c7\c3\be\ba\c0\bf\bf\be\bd\bc\bb\bb\c2\c3\c5\c8\cb\ce\d0\d1\ce\cd\cc\cb\c9\c7\c6\c5\c6\c7\c3\c9\d4\b4\18\07\ae\ae\ae\ae\ae\ae\ae\ae\ae\a9\9d\a8\b2\af\b4\b0\af\af\af\af\af\af\af\af\b0\ae\ab\ab\ab\ad\ad\ac\9b\a3\a9\a9\a7\aa\ab\a8\ad\a7\9d\a9\b0\a9\ab\a4\a0\a9\ae\ac\b0\b5\ad\9e\b5\ad\a5\88\94\b5\ad\ac\af\aa\a3\a7\b4\b4\b0\b5\b1\b1\b1\b3\b7\ba\bd\be\c0\b8\b7\bc\bb\b4\b5\bd\b6\ba\bb\a5\a3\b5\b7\ba\b9\b9\b9\b9\b9\b9\b9\b9\bb\ba\b4\bc\b5\a5\b3\c0\b8\b8\b7\b6\b6\b5\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b4\b5\ae\a6\ae\b6\b2\b3\b3\b3\b3\b3\b3\b3\b3\a9\ab\ae\b0\b2\b2\b1\b0\b8\b3\b0\b3\b7\b3\a5\98\91\a4\ae\a8\aa\b7\b9\af\b4\b4\b4\b4\b4\b4\b4\b4\b3\b3\b4\b5\b5\b6\b7\b7\b6\b6\b7\b8\b8\b9\ba\ba\bb\bb\bb\bb\bb\bb\bb\bb\bd\bd\bd\bd\bd\bd\bd\bd\bd\ab\96sfoov|ww}\81\80\83\8a\82ztx\83\8d\8f\8d{}{vy}yoxvutrmfaZNGQaaM877FX_bdaq\87xR\97\a9\9f\84n\c3\a7\a0\b3\a3\b2\b2\a7\ad\b3\b6\b6\b5\b5\b6\b6\b6\b7\b8\b8\b9\ba\ba\b8\b7\b6\b6\b8\ba\bd\bf\c1\c3\c6\ca\cc\cd\cc\cc\ca\ca\ca\c9\c6\c3\c0\be\c4\c3\c2\c0\be\bc\bb\ba\c3\c4\c6\c9\cc\cf\d2\d3\ce\ce\cc\ca\c8\c6\c4\c3\c6\c7\c3\c9\d4\b4\18\07\af\af\af\af\af\af\af\af\af\a6\9d\ac\b3\af\b5\b0\b0\b0\b0\b0\b0\b0\b0\b0\a9\b0\b6\b5\af\ab\af\b4\8d\9f\ac\af\b0\b0\ab\a6\b1\ab\a0\ad\b4\ae\b1\ac\b5\b0\aa\aa\b0\b5\b4\b1\ae\b1\a0\91\a1\a9\a4\ae\af\aa\a0\a7\b8\b5\ae\b6\af\b1\b4\b6\b6\b5\b4\b4\b3\b2\b6\bd\bf\bb\b8\b8\b9\bd\b4\9c\ab\bd\b1\bc\ba\ba\ba\ba\ba\ba\ba\ba\bd\bb\b3\be\b5\a5\b8\c2\b9\b8\b8\b7\b6\b6\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b4\b8\b1\a5\ad\b8\b2\b4\b4\b4\b4\b4\b4\b4\b4\a9\ab\ae\b0\b2\b2\b2\b1\af\ae\ae\b2\b6\b7\b2\ad\ba\c2\c2\b8\b2\b5\b5\b0\b5\b5\b5\b5\b5\b5\b5\b5\b4\b4\b5\b5\b6\b7\b7\b8\b7\b7\b8\b8\b9\ba\ba\bb\bc\bc\bc\bc\bc\bc\bc\bc\be\be\be\be\be\be\be\be\ba\a9\99~v|okvnmtvmb]pnkklmmm\84\87\82z{~tcda]XUUVWba\5cQGDHM:JJEYtteu\97vP\86\aa\94|\80o\d4\e6\ab\ad\a8\a8\af\b3\b7\b6\b3\b3\b6\ba\b7\b7\b8\b8\b9\ba\ba\bb\b8\b7\b6\b7\b8\bb\be\c0\c4\c6\ca\cc\cd\cc\cb\c9\cb\c9\c6\c3\c0\bf\bf\bf\c6\c6\c5\c4\c3\c2\c1\c0\ca\cb\cc\ce\d0\d1\d2\d3\cf\ce\cc\ca\c7\c5\c3\c2\c6\c7\c3\c9\d4\b4\18\07\af\af\af\af\af\af\af\af\af\a5\9d\ae\b4\af\b6\b1\b0\b0\b0\b0\b0\b0\b0\b0\af\ae\b0\b5\ba\ba\b5\b0\9a\ab\b2\ad\ae\b1\b0\ae\b3\ac\9e\aa\b3\b1\b9\b7\b4\b8\b7\b2\b0\b1\ae\a8\ac\b0\a3\ab\a9\9a\a9\b0\ae\a9\9f\a7\ba\b6\ad\b6\b9\bb\bc\b8\b4\b3\b7\bc\b4\b4\b4\b5\b8\b9\b7\b5\bc\be\af\97\b1\c2\ad\be\ba\ba\ba\ba\ba\ba\ba\ba\be\bc\b2\bf\b5\a4\bb\c3\b9\b9\b8\b7\b7\b6\b5\b5\b5\b5\b5\b5\b5\b5\b5\b5\b6\b4\b9\b2\a4\ac\b8\b2\b4\b4\b4\b4\b4\b4\b4\b4\a8\aa\ad\b0\b2\b2\b2\b1\b5\b6\b5\b3\b2\b2\b4\b6\b5\b4\b4\b2\af\af\b3\b9\b5\b5\b5\b5\b5\b5\b5\b5\b4\b4\b5\b6\b6\b7\b8\b8\b7\b7\b8\b9\b9\ba\bb\bb\bc\bc\bc\bc\bc\bc\bc\bc\be\be\be\be\be\be\be\be\c4\ae\97wieM?]l\81\8b\81rrzqkaXYfy\87\91\8bxcalj^K^omZHBE49@CEJT[RQKYpjYYo\90fg\95\bb\82j\97ej\ca\d0\a7\bc\a7\b4\b7\b9\b6\b2\b1\b7\bc\b7\b7\b8\b9\b9\ba\bb\bb\b7\b7\b6\b7\b9\bc\bf\c1\c6\c8\cb\cd\ce\cc\c9\c7\ca\c6\c1\bd\ba\bb\bc\be\c7\c7\c7\c7\c7\c8\c8\c8\d2\d2\d2\d2\d2\d2\d3\d3\cf\ce\cc\c9\c7\c4\c2\c1\c6\c7\c3\c9\d4\b4\18\07\b4\b4\b4\b4\b4\b4\b4\b4\ba\a3\a0\ae\b1\b0\b2\b2\b3\b3\b3\b3\b3\b3\b3\b3\ad\97\8a\87\87\8a\84u\9d\a8\b3\b5\b0\ad\b2\b9\ba\b3\94\9e\b2\ac\b2\b5\b3\b3\b3\b3\b3\b3\b3\b3\b0\b0\af\ae\ac\ab\ac\af\bc\9e\9d\b2\b5\b2\b4\b3\b9\b9\b9\b9\b9\b9\b9\b9\bc\bd\be\be\bc\b9\b5\b2\c5\b4\a0\a7\be\bf\b7\be\b9\b9\ba\bb\bb\bc\bd\bd\bf\ba\bd\b9\ab\ac\ba\c1\bb\bb\ba\b9\b9\b8\b7\b7\b6\b6\b6\b6\b6\b6\b6\b6\bb\b9\b7\be\a6\9a\b8\b8\b6\b5\b4\b3\b3\b3\b3\b4\b0\a2\a9\b5\b2\b3\b8\b2\b1\b1\b2\b3\b3\b4\b5\b5\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b7\b7\b8\b9\b9\ba\bb\bb\b9\b9\b9\b9\b9\b9\b9\b9\b9\ba\bb\bc\bd\be\be\bf\bc\bb\bd\c1\c5\c3\ba\b2\c2\b4\ab|\5ccYSfkidl{\7fyxux\82\8c\8azkWZ_fjljhzxwseWXac\5cQJJOW\5cUF=Bp_TZi~en\9f\a5\8f{s\88\94i\ac\ab\a8\b3\b2\b2\b6\b9\b7\b4\b2\b0\bf\aa\bd\c1\cb\c3\be\b6\ac\bf\b5\c1\b8\bf\c4\bf\c5\bf\cc\ca\ce\d4\c6\c9\c8\cd\cc\c0\b2\b0\be\cd\cd\cb\c8\c6\c4\c4\c5\c6\d2\d2\d2\d2\d2\d2\d2\d2\c6\cd\d2\ce\c5\c1\c5\cc\be\c4\cb\ce\d1\b7\1f\03\b4\b4\b4\b4\b4\b4\b4\b4\ba\a3\a1\af\b2\b0\b3\b3\b4\b4\b4\b4\b4\b4\b4\b4\b5\b0\c1\c1\a4\a1\ac\a4\ab\a7\a4\a8\af\b4\b2\af\bd\bd\a8\a3\b0\b1\b2\b3\b3\b3\b3\b3\b3\b3\b3\b3\bc\af\a7\ab\b0\ae\aa\a9\b4\a0\a4\b4\b5\b4\b7\b4\b9\b9\b9\b9\b9\b9\b9\b9\b9\b8\b6\b5\b7\ba\be\c0\bb\a2\a5\ba\bb\b4\b9\bd\b9\ba\ba\bb\bc\bc\bd\bd\be\bb\bd\b9\ab\ad\bb\c1\bb\bb\ba\ba\b9\b8\b8\b7\b7\b7\b7\b7\b7\b7\b7\b7\b1\c0\b7\b8\af\9d\aa\b5\b4\b6\b8\b9\b7\b2\ac\a8\b0\a3\a9\b4\b2\b3\b7\b3\b2\b2\b3\b3\b4\b5\b5\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b6\b7\b8\b8\b9\ba\ba\bb\bb\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\bb\bc\bd\be\be\bf\be\bd\bd\c0\c3\c1\bb\b5\b7\b6\b4\80S\5ck|wonv|xtt\85t_RPSUTWZ`gmruvwkccbZUVDIPX[WMEVN\5cTagwe\83\82kd\93\a1\80\84x\9f\d0\81|\ae\9f\ab\ae\b1\ba\b9\b1\b6\bd\b9\b4\c0\d6\d2\df\da\d9\ce\d0\c0\c4\be\b3\c3\b0\c4\c2\cd\c6\cb\c7\bf\cb\c8\ce\cb\c6\c0\bd\bf\c3\c6\cb\c9\c7\c6\c5\c6\c7\c8\d2\d2\d2\d2\d2\d2\d2\d2\d4\cc\c4\c2\c5\c8\c6\c2\c0\c2\bb\c0\d8\c1\1f\03\b5\b5\b5\b5\b5\b5\b5\b5\b8\a4\a3\b2\b4\b1\b4\b5\b5\b5\b5\b5\b5\b5\b5\b5\b3\b4\c0\97JM\97\c3\b8\ad\a3\a5\af\b6\b4\ae\b5\b2\ad\a4\ab\b2\ad\b5\b4\b4\b4\b4\b4\b4\b4\b4\bc\af\a6\aa\b1\b1\ae\ae\a7\a5\ae\b6\b5\b8\ba\b5\ba\ba\ba\ba\ba\ba\ba\ba\b8\b6\b5\b4\b6\b9\bc\bf\a7\a2\b2\c1\b8\b2\b8\ba\ba\ba\bb\bc\bc\bd\be\be\be\bb\bd\b8\ac\b0\bd\c0\bc\bc\bb\ba\ba\b9\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\ba\bb\b3\b8\b3\a7\b2\bb\b4\b7\ba\bc\ba\b6\b0\ac\b0\a5\a8\b2\b2\b3\b6\b5\b3\b3\b4\b4\b5\b6\b6\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b7\b8\b8\b9\ba\ba\bb\bc\bc\bb\bb\bb\bb\bb\bb\bb\bb\bb\bc\bc\bd\bd\be\be\be\c1\bf\bd\bd\bf\bf\bd\ba\c5\c0\b9\8babmw\7fmbhqrswx~\85\88\83tbUnmpw|yncYPMU\5cYVV`fjdTE=;IF^Zdk|bzqfc\95\9cj{\96\95\9b\81v\b0\e2\b7\b4\bc\ba\b4\b6\ba\b6\b2\b3\d2\c4\84nr\b2\e5\e7\da\c3\cf\ca\cb\be\ba\c0\c7\bf\c9\cc\c7\d0\c9\c3\c2\c4\c8\cd\cd\c9\c5\c9\c8\c6\c6\c6\c8\ca\cb\d1\d1\d1\d1\d1\d1\d1\d1\ce\ce\cb\c3\bb\ba\c1\c8\ba\a7\a8\c2\d4\b2\14\00\b6\b6\b6\b6\b6\b6\b6\b6\b6\a4\a6\b5\b6\b2\b5\b8\b6\b6\b6\b6\b6\b6\b6\b6\b9\ac\b4\b6\a9\b2\c5\c0\b8\b7\b6\b4\b2\b3\b5\b8\ba\ad\b2\ab\af\b7\ae\bb\b5\b5\b5\b5\b5\b5\b5\b5\b1\b3\b2\ae\ae\b4\b8\b9\9e\ab\b7\b8\b6\bb\bd\b7\bb\bb\bb\bb\bb\bb\bb\bb\bb\bc\bc\bc\b9\b5\b1\ae\9d\ba\c0\b5\b8\bc\b7\b6\bb\bb\bc\bc\bd\be\be\bf\be\bc\bd\b6\ac\b4\c0\bf\bd\bc\bc\bb\ba\ba\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b5\b5\b1\be\c2\ae\aa\bb\c1\bf\bd\b9\b7\b5\b3\b3\b1\a8\a7\af\b3\b3\b5\b7\b4\b5\b5\b6\b7\b7\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b9\b9\ba\ba\bb\bc\bc\bd\bc\bc\bc\bc\bc\bc\bc\bc\bd\bd\bd\be\be\be\be\be\c3\c1\be\bd\bd\be\be\be\b8\bd\b7\89RFXhmkls\7f\86\7fsw{~~zvtsncZ^ij^PHKUaaXUYVSNIFGLPA>LW|qj_y{ds\ab\a3|\8d\91\9a\90\a3\90o\c8\d2\a8\ba\b7\b2\be\ba\b6\c7\cb\c5\95q~X8)b\96\b9\ef\eb\d9\d1\c5\cc\c3\cc\c5\c6\ce\c6\cd\cc\cb\ca\c6\c3\c3\c7\ca\c7\c7\c6\c6\c7\ca\cc\ce\d0\d0\d0\d0\d0\d0\d0\d0\c5\ce\d3\c9\b8\b2\bc\c9\c6\ba\ad\bc\d8\ba\18\06\b6\b6\b6\b6\b6\b6\b6\b6\b4\a4\a9\b9\b8\b3\b7\ba\b8\b8\b8\b8\b8\b8\b8\b8\ba\bb\bb\bd\c0\be\b8\b6\b3\ba\c1\bf\b7\b2\b5\b9\ba\b1\b6\a7\a7\b8\b2\b4\b5\b5\b5\b5\b5\b5\b5\b5\b1\bc\bd\b1\af\ba\bb\b1\9e\b2\bd\b9\b8\bd\bd\ba\bb\bb\bb\bb\bb\bb\bb\bb\c0\c0\c0\bd\b9\b4\ae\ab\ae\c6\c4\b3\b7\c0\bb\b5\bb\bc\bc\bd\be\be\bf\bf\be\bd\bd\b4\ad\b8\c4\be\bd\bd\bc\bc\bb\ba\ba\b9\bb\bb\bb\bb\bb\bb\bb\bb\ba\c3\bd\bc\c0\a6\a0\cf\c3\c1\bd\b8\b3\b0\ad\ac\b1\aa\a6\ac\b3\b3\b3\ba\b6\b6\b7\b7\b8\b9\b9\ba\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b8\b9\ba\ba\bb\bc\bc\bd\bd\be\be\be\be\be\be\be\be\bf\bf\bf\be\be\be\be\be\c3\c2\c0\be\bd\bd\be\c0\bb\b9\a8\81UNixysorxxqivvuqlhhinok^MCCHBGWhj\5cPLaTIHPQH=D@PVtqtf\81\91Si\a6\91\89\95\9e\9b\8a\a0\a8\8as\c1\bd\c2\c5\bf\b2\a8\b3\c9\a5\82W]\98xF9\1c)55R\a7\bc\ca\f6\e3\de\ce\cc\d3\c8\cd\ca\cb\ca\c7\c4\c4\c7\cb\c8\c7\c7\c7\c8\ca\cd\cf\d0\d0\d0\d0\d0\d0\d0\d0\cd\c9\c6\c7\ca\c7\bf\b8\c0\d7\c1\b9\e1\c8\15\00\b7\b7\b7\b7\b7\b7\b7\b7\b2\a5\ac\bc\ba\b4\b8\bd\b9\b9\b9\b9\b9\b9\b9\b9\ba\c1\b9\b5\be\ba\b1\b7\b4\b7\bb\bd\bb\b8\b5\b3\b1\b8\bc\a6\9f\b9\c4\bd\b6\b6\b6\b6\b6\b6\b6\b6\b9\be\ba\b2\b6\bd\b1\9d\a6\b9\bd\b8\ba\bd\bc\bc\bc\bc\bc\bc\bc\bc\bc\bc\c1\bf\bb\b8\b6\b7\b8\ba\c7\be\bf\be\b5\b9\bf\b7\bc\bc\bd\be\be\bf\c0\c0\be\be\bd\b3\ad\bc\c7\bd\be\be\bd\bc\bc\bb\ba\ba\bc\bc\bc\bc\bc\bc\bc\bc\c0\bc\c5\af\86tz\90\af\b2\b6\b8\b8\b4\af\ac\b1\ad\a5\a9\b3\b3\b2\bc\b7\b8\b8\b9\ba\ba\bb\bb\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\b9\ba\ba\bb\bc\bc\bd\be\be\bf\bf\bf\bf\bf\bf\bf\bf\c1\c0\c0\bf\bf\be\be\be\c0\c2\c4\c2\bf\bd\be\c0\b6\ad\96\81f^qprlx\93\96\81sw\91\87yolpw{\8bnNBL\5ccbd]`oucG3:=@>;9Td_L=9CJE:8CQ26`RB[}Pv\a1^g\a7\91}y\8e\88\91\ab\9d\d5\afp\ae\aa\b0\b3\b6\be\a9zuq\84k\84\81au\99\a5\80}i\5cM)3,\1eC|\b0\df\e7\de\da\d4\cd\c9\ca\cd\d0\ce\cd\cb\c9\c8\c9\ca\cb\ce\ce\ce\ce\ce\ce\ce\ce\cd\cc\cd\d1\d3\d2\cd\c8\c0\bd\ec\f4\b8\92\1e\04\b8\b8\b8\b8\b8\b8\b8\b8\af\a5\b0\c0\bc\b5\ba\c0\bb\bb\bb\bb\bb\bb\bb\bb\b6\b6\bf\c2\ba\ba\be\bb\c0\be\bc\bb\bc\bf\c3\c5\bf\b5\ac\aazW\7f\a0\b7\b7\b7\b7\b7\b7\b7\b7\9d\9a\a7\bd\be\aa\a1\a8\ba\c1\b9\b5\be\bb\b7\c0\bd\bd\bd\bd\bd\bd\bd\bd\ba\bc\bf\c1\c1\c0\be\bc\b2\c2\bf\b5\b8\b9\b7\bc\bd\bd\be\bf\bf\c0\c1\c1\bd\bf\bc\b1\ae\c1\ca\bc\bf\bf\be\bd\bd\bc\bb\bb\be\be\be\be\be\be\be\be\b6\d0\9bX\90\c8\b5\c3\cf\cb\c6\bf\b7\b2\ad\ab\b1\af\a4\a6\b4\b2\b1\bf\b9\b9\ba\bb\bb\bc\bd\bd\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\ba\bb\bb\bc\bd\bd\be\bf\bf\c1\c1\c1\c1\c1\c1\c1\c1\c3\c2\c1\c0\bf\be\be\bd\b9\c1\c9\ca\c4\be\bc\bc\bb\bb\aa\9e~k\83\85\83vh_Y`x\92\81wmmqodX\84\7fr_PMWbg``gfZLGKE@EMND96<^colmLx\9a^S\98\9c\82\8d\9d\95\b1\8c\a7\b9\bf\88k\a7\b9\af\bd\b5\84_`l\91dy\93tzy\81\91\96\86\8at|MHM;/32B\9c\ba\df\f2\f0\e4\dd\dc\d0\cf\cc\c9\c8\c8\c9\ca\ce\ce\ce\ce\ce\ce\ce\ce\cf\d0\d0\d1\d1\d2\d3\d4\c9\db\d2\a6\94\9b$\09\c3\b9\c0\b3\b2\bc\b5\c1\a9\a0\b8\b6\bf\c0\c0\b9\ba\bb\bb\bb\bb\bb\bb\bb\bc\bc\bc\bc\bc\bc\bc\bc\be\be\be\be\be\be\be\be\b5\be\a8l_\a5\cc\a6\bb\bb\ba\b9\b9\b8\b7\b7\92\81\91\ba\c1\a7\a2\b8\bb\bb\bb\bb\bb\bb\bb\bb\bf\bf\bf\bf\bf\bf\bf\bf\be\be\be\be\be\be\be\be\c0\bf\bd\bc\bc\bd\bf\c0\bd\bd\be\bf\bf\c0\c1\c1\c5\c2\b9\bb\af\ca\c2\c8\c2\c2\c2\c2\c2\c2\c2\c2\bf\bf\bf\bf\bf\bf\bf\bf\bd\c0\c6\cd\cf\c7\b7\aa\86\b9\cc\bb\b7\ba\b7\b6\bb\af\a6\a7\a7\b2\b9\b7\bc\bc\bc\bc\bc\bc\bc\bc\bd\bd\bd\bd\bd\bd\bd\bd\be\be\be\be\be\be\be\be\be\be\bf\c0\c0\c1\c2\c2\c2\c2\c3\c4\c4\c5\c6\c6\c1\c2\c3\c3\c1\bf\bc\bb\bb\be\c6\c6\c2\c5\bf\ab\b5\b6\b6\a4\85uvsZ_ejllmnd]etlV[u{h]ejd]\5cPi\7f|dNKQGKQY]XLC?D]f\7fv}{o\85\5ce\94vg\94\a3\9d\a1\a2\9c\b1\a9\bd\86\89\c3\b0\8e\8ce^\88\80\85vg\89b[\8f~x\85rp\95\94\9b\9a|p]/R/\1b'5^\a1\ba\e6\fa\ee\e0\d7\cb\c9\cd\c7\c8\d3\ce\cf\d6\d4\cb\c6\c9\d8\d6\d7\d7\cc\cb\d7\d8\f4\e6\96cQR/\0a\bf\b3\bd\bc\bf\c3\b8\c1\ad\a4\bd\ba\c2\c1\c0\b9\bf\bf\be\be\bd\bc\bc\bb\bd\bd\bd\bd\bd\bd\bd\bd\bf\bf\bf\bf\bf\bf\bf\bf\d0\c7\8ad\8c\b6\be\c9\bc\bb\bb\ba\b9\b9\b8\b8\ae\9b\95\a1\a4\9c\a5\ba\bc\bc\bc\bc\bc\bc\bc\bc\bf\bf\bf\bf\bf\bf\bf\bf\bd\bd\bd\bd\bd\bd\bd\bd\c0\be\bd\bb\bb\bd\be\c0\be\be\bf\bf\c0\c1\c1\c2\cb\c5\d5\b5\9e\cf\be\cc\c3\c3\c3\c3\c3\c3\c3\c3\c0\c0\c0\c0\c0\c0\c0\c0\c2\c2\c3\c6\c9\c5\bd\b5\9f\c0\c9\bd\bd\c0\b8\b3\b2\b7\a1\b0\a9\b6\b2\b5\bd\bd\bd\bd\bd\bd\bd\bd\be\be\be\be\be\be\be\be\be\be\be\be\be\be\be\be\be\bf\bf\c0\c1\c1\c2\c2\c2\c3\c3\c4\c5\c5\c6\c6\c3\c4\c4\c4\c2\bf\bc\ba\b6\b8\c0\c3\c3\ca\c8\b7\ac\b5\b0\b0\8adlhfnuwtqqrooe[g\7f\85zqry\82\81td\5cXdlcRIQ]UX[YTOLK<=[ctmzsa{Xb\93\82z\a1\9c\90\96\a9\ad\bb\a8\b4\abw\a9\cdr<`m~\82x|k\89\85\5c\85oq\87\90\83z\86y\86\8c\98\a6\83\81db;>-&$>[\aa\ce\db\eb\e4\d3\db\cd\d2\d8\dd\db\d6\d0\cb\c7\da\d2\cd\d3\df\d0\d0\fd\e9\ab\8e\8f\90}\1f\04\c2\c4\c9\bb\bc\cb\c8\c7\b1\a7\bc\b6\bc\be\c2\bf\c2\c1\c1\c0\bf\be\bd\bd\be\be\be\be\be\be\be\be\c0\c0\c0\c0\c0\c0\c0\c0\be\c4\c9\d2\d3\c2\b6\bb\bd\bc\bc\bb\ba\ba\b9\b9\c3\c2\a9\87\87\a8\c0\c1\bd\bd\bd\bd\bd\bd\bd\bd\c0\c0\c0\c0\c0\c0\c0\c0\bd\bd\bd\bd\bd\bd\bd\bd\bf\be\bc\bb\bb\bc\be\bf\bf\bf\c0\c0\c1\c2\c2\c3\b4\bf\b3\c2\af\b3\c9\bd\c4\c4\c4\c4\c4\c4\c4\c4\c2\c2\c2\c2\c2\c2\c2\c2\c7\c3\c0\c0\c2\c4\c4\c3\c5\ce\ca\c1\c2\bf\b3\ac\b7\c5\98\a9\a0\b2\b1\c0\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\c0\c1\c1\c2\c3\c3\c3\c3\c4\c5\c5\c6\c7\c7\c7\c7\c7\c5\c2\bf\bb\b9\c1\be\c2\c3\c0\c6\c5\b8\ab\b6\ad\b6\8dZjico|\7fytw|dbdkrtojfhdZUX\5c]Vbpqi`]_^_\5cSHCGM99\5caecwkr\8bge\89}v\8e\9d\99\98\9f\a2\b6\a5\a3\c7\b7\81\cf\c0Qz\98\8e\84ou^w\8d^\88|\8c\8d\85wf\80\96\8b~y\8az\85\9f\9e\7f\84gO5.0(!Os\ab\e1\df\f1\eb\eb\e3\da\da\de\d5\c4\b8\c2\e5\e3\c6\d4\e3\cb\80~\8e_Ab%\04\d8\cc\c9\cb\cd\ca\c4\c5\b4\ad\c6\bf\c2\be\bf\ba\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\bf\c1\c1\c1\c1\c1\c1\c1\c1\c6\af\bb\c7\b8\bb\c7\bc\be\be\bd\bd\bc\bb\bb\ba\bb\bb\c0\ca\cb\c4\c0\c1\be\be\be\be\be\be\be\be\c1\c1\c1\c1\c1\c1\c1\c1\bd\bd\bd\bd\bd\bd\bd\bd\bf\be\bc\bb\bb\bc\be\bf\c0\c1\c1\c2\c3\c3\c4\c4\c3\c1\cd\c2\b4\c8\cd\d0\c5\c5\c5\c5\c5\c5\c5\c5\c4\c4\c4\c4\c4\c4\c4\c4\c6\c3\c0\bf\c2\c5\c8\ca\c8\c5\c0\c0\c5\c5\c1\c0\ab\c3\a1\ad\b2\b0\ac\b7\c1\c1\c1\c1\c1\c1\c1\c1\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c0\c1\c1\c2\c3\c3\c4\c4\c4\c5\c5\c6\c7\c7\c8\c9\c9\c9\c7\c4\c0\bc\b9\bc\b7\bb\c1\c2\c9\cd\c5\c0\b3\a4\a7\90qpegt\7f|ndfl`CDm\85oPFH[ks~\89\86{quywncZU[XQIDACD;>cb]\5cwiw\8bke\7f||\87\8a\93\95\a0\9f\b2\ab\ac\c7\aaQ\96\dd\96q_oq\84\87hn~r\84w\7fvm\81\8d\90w|wv\82}xum\87\8e\94\a8\8ctMAD$43-h~\bf\db\f7\fb\f1\e7\e2\df\c8\ce\d2\df\d5\e3\e8\96\90r@C{w\14\0f\cc\d3\d6\d7\d2\d2\de\e6\bb\b3\c9\bf\be\bb\bf\bd\bc\bc\bd\be\bf\c0\c1\c2\c1\c1\c1\c1\c1\c1\c1\c1\c3\c3\c3\c3\c3\c3\c3\c3\ca\c0\b7\bc\c9\cb\c4\c0\c0\bf\bf\be\bd\bd\bc\bc\be\b3\b3\bd\bf\b8\bb\c7\c0\c0\c0\c0\c0\c0\c0\c0\c1\c1\c1\c1\c1\c1\c1\c1\bf\bf\bf\bf\bf\bf\bf\bf\c1\c0\be\bd\bd\be\c0\c1\c2\c2\c3\c3\c4\c5\c5\c6\d0\dc\e5\b5\a7\c6\d1\da\c7\c7\c7\c7\c7\c7\c7\c7\c6\c6\c6\c6\c6\c6\c6\c6\c1\c3\c4\c5\c6\c7\c9\cb\c8\c1\c0\c2\c1\c1\c5\c9\a8\ba\b0\a7\c0\a9\ad\b1\c3\c3\c3\c3\c3\c3\c3\c3\c2\c2\c2\c2\c2\c2\c2\c2\c0\c0\c0\c0\c0\c0\c0\c0\c0\c1\c1\c2\c3\c3\c4\c4\c4\c5\c5\c6\c7\c7\c8\c8\ca\ca\ca\c8\c6\c2\be\bc\bb\b4\b9\c1\c2\c8\cc\c7\b1\b7\ca\acw_Yh[grqfbhrcit~\80zy|wuj`erpcgikjd\5cTNWNGIOPG>>Lod\5c[vns~c_prz}\97\99\92\a5\a7\b4\b3\b7\b4\a0^R\d0\e9zq\86{slq{{cZs\83\89|x}ic\8b\8f\87z\87\93po\86\83x\88\85\9b\9a\a1}{TCD **+F\82\c4\ef\ff\ff\f4\d4\e0\df\f9\e2\8a\9f\94Ti\98\8au-\04\e1\de\db\e7\db\ba\af\ab\a2\a6\cc\ce\d0\c6\c2\bc\bf\c0\c0\c1\c1\c2\c2\c3\c2\c2\c2\c2\c2\c2\c2\c2\c4\c4\c4\c4\c4\c4\c4\c4\c4\c8\c3\c2\c5\b8\b4\c9\c1\c1\c0\c0\bf\be\be\bd\bd\c6\c6\bd\bd\c6\c6\bc\c1\c1\c1\c1\c1\c1\c1\c1\c2\c2\c2\c2\c2\c2\c2\c2\c1\c1\c1\c1\c1\c1\c1\c1\c4\c2\c0\bf\bf\c0\c2\c4\c3\c4\c4\c5\c6\c6\c7\c7\c1\7f@D\8e\aa\b8\c2\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c8\c0\c4\c9\cb\c9\c8\c8\c9\d0\ca\ca\c7\bb\b9\bf\c1\b4\b2\ba\9d\b8\a4\b0\b7\c5\c5\c5\c5\c5\c5\c5\c5\c3\c3\c3\c3\c3\c3\c3\c3\c1\c1\c1\c1\c1\c1\c1\c1\c1\c1\c2\c3\c3\c4\c5\c5\c5\c5\c6\c7\c7\c8\c9\c9\c8\c9\c9\c9\c8\c5\c2\c0\bf\b6\bb\c4\c3\c1\c2\bc\b2\aa\c6\af\93\8eqqlqtmb_envqigoxvnojegrzrebdfc]UOLVMHP]_QB>]ya_Zqt\87\83ms|}\8e\90\82\96\90\a0\a7\b6\a0{ie\7fpw\cd\cbb^\81\8a\84\82x\8dxp\94\89\82|ix\88\8f\92~\81l{\99\8f\83f{\7f\8d\8b\86\82m\97\97\a5\a0\89\80RKD9*\1d*Z\8b\c4\f5\ef\ff\c2f\86\8aRgrNWn\17\04\e8\dd\d8\e7\bf\85\a3\db\d0\cd\ea\e1\dd\d5\d6\d4\cb\cb\c9\c7\c6\c4\c2\c2\c3\c3\c3\c3\c3\c3\c3\c3\c5\c5\c5\c5\c5\c5\c5\c5\c4\b9\ba\c0\bc\bd\c6\cb\c2\c2\c1\c1\c0\bf\bf\be\c0\bc\be\c6\c6\bc\b9\bd\c2\c2\c2\c2\c2\c2\c2\c2\c3\c3\c3\c3\c3\c3\c3\c3\c4\c4\c4\c4\c4\c4\c4\c4\c6\c5\c3\c2\c2\c3\c5\c6\c4\c5\c5\c6\c7\c7\c8\c8\c5\b5\b1P\85\c4\82}\c9\c9\c9\c9\c9\c9\c9\c9\ca\ca\ca\ca\ca\ca\ca\ca\c3\c8\cc\cc\c8\c6\c8\ca\ca\c6\ca\c8\be\c3\cc\c6\b6\aa\c0\a5\af\ab\ab\b6\c7\c7\c7\c7\c7\c7\c7\c7\c4\c4\c4\c4\c4\c4\c4\c4\c2\c2\c2\c2\c2\c2\c2\c2\c2\c2\c3\c3\c4\c5\c5\c6\c6\c6\c7\c7\c8\c9\c9\ca\c6\c7\c8\ca\c9\c8\c6\c5\b4\ac\b5\c5\c6\c3\c3\be\b0\a9\bd\ab\87qXZopmheju~{rnndY_nhhr\82\8c\89\7fy\7f{qaRJMQUOMT^_TG:j|Y`WgxeUG\5cfh\83\8b\97\a4\8e\99\a0\b2\a9\89k\91\86ub\8a\d5\b9xs\7fuhVoj\5cped}\83{\7f\8euh\8d\91\8fwv~p\93\92\86s|\92\92\8a\8fxy\94\97\a5\a7\87`JE?3(1\22r\83z\87Q4fdu\80\8a\83$\03\e0\ef\e6\ee\f8\f9\f7\d9If\b3\d8\ee\e9\e1\d5\d6\d5\d2\ce\c9\c5\c2\c0\c4\c4\c4\c4\c4\c4\c4\c4\c6\c6\c6\c6\c6\c6\c6\c6\bf\c4\c5\c0\be\c2\c1\bc\c3\c3\c2\c1\c1\c0\bf\bf\bc\bc\bd\bf\c0\bf\bf\c0\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c3\c6\c6\c6\c6\c6\c6\c6\c6\c8\c7\c5\c4\c4\c5\c7\c8\c5\c5\c6\c7\c7\c8\c9\c9\b9\86~m\a5\90s\ca\ca\ca\ca\ca\ca\ca\ca\ca\cb\cb\cb\cb\cb\cb\cb\cb\c7\cb\cd\cb\c6\c4\c8\cd\ce\c9\cd\ca\c1\ca\cf\c2\c5\ac\bb\9f\97\ae\ab\c4\c8\c8\c8\c8\c8\c8\c8\c8\c5\c5\c5\c5\c5\c5\c5\c5\c2\c2\c2\c2\c2\c2\c2\c2\c2\c2\c3\c4\c4\c5\c6\c6\c6\c6\c7\c8\c8\c9\ca\ca\c4\c5\c8\ca\cb\ca\c9\c8\b8\af\b8\c8\c6\be\b9\b3\ac\a8\b3\b0\8cmjtzumfelw\7f\85rb`cdjstu\81\8e\87p_][eond[XZQONQUTOI5p|S`T^ytYI^^Xrz\8c\89\89\c1\bb\8frjsrv\8b\8dr\98\fe\a7h\90\8dv\5c`xh{\8f}\7f\8doU\8d\91\8f\84q~j\8f\a1\94xr\89|\8b\8e\86~|\8e\8f~~\84k\86\a0\a3\97\81fP9F H\92w_\82\84\8btuk^2\08\f1\eb\e4\f6\b8ez\96\89u}\83\b4\e4\d8\e3\e2\e2\e0\df\dd\db\da\d9\db\d9\d6\d1\cc\c7\c3\c1\be\bf\c1\c3\c5\c7\c8\c9\c5\c5\c5\c6\c7\c7\c8\c8\c0\c0\c0\c1\c1\c1\c1\c2\c3\c3\c3\c3\c4\c4\c4\c4\c2\c3\c3\c4\c5\c6\c7\c7\c7\c7\c8\c9\c9\ca\cb\cb\cb\cb\cb\cb\cb\cb\cb\cb\c6\ca\cc\c9\c3\c0\c2\c6\c4\c9\cf\cf\cb\c9\cb\ce\c6\a0t\c7\ec\b3\c3\db\ce\ce\ce\ce\ce\ce\ce\ce\cd\cd\cd\cd\cd\cd\cd\cd\cb\cb\cb\cb\cb\cb\cb\cb\cc\cb\c9\c8\c8\c9\cb\cc\ae\b8\b6\8a\9e\9d\95\c1\c5\c6\c9\cb\cb\cb\ca\c9\ca\ca\ca\ca\ca\ca\ca\ca\c8\c8\c8\c8\c8\c8\c8\c8\c6\c6\c6\c6\c6\c6\c6\c6\cb\cb\cb\cb\cb\cb\cb\cb\be\c4\c9\ca\c7\c6\c9\cd\c1\a8\a0\cc\cb\ca\bb\c7\a6\a1\bf\bd\9c\7febjkou}\84\87\88si]Zdu\84\8d\8d\8a\87\86\84|pf}ticaba_dVHFMSQLH\85t]]Vk{cK[N_\83\80\a5\93\84\a1\cf\a9`]}\88{\87\7fg\5cq\a8\de\80es~zm\7fiy\89|fs\8b\8f{{\86qy\95\83yy\84\80\80\8b\85vw\88\8e\96\8a\90xZ\8c\8f\94\84\84y|\a1\9e\94kFWvgTb_jflmx&\10\e8\f8\eb\f4\d4\95\b5\f2\fd\ff\f0\92\8c\d8\e9\ea\eb\ea\e9\e7\e6\e4\e3\e2\e8\e6\e3\e0\dc\d8\d5\d3\cd\cb\ca\c7\c4\c2\c0\bf\c5\c5\c5\c4\c4\c4\c4\c4\c3\c3\c4\c4\c4\c4\c4\c4\c3\c3\c3\c3\c3\c3\c3\c3\c4\c4\c5\c6\c7\c7\c8\c8\c8\c8\c9\c9\ca\cb\cb\cc\cc\cc\cc\cc\cc\cc\cc\cc\cc\cb\c9\c8\c7\c6\c4\c3\c5\ca\cf\cf\cc\ca\cc\ce\d8\c8\c8\cc~l\c5\d4\cf\cf\cf\cf\cf\cf\cf\cf\ce\ce\ce\ce\ce\ce\ce\ce\cc\cc\cc\cc\cc\cc\cc\cc\cf\cf\cf\ce\cd\cc\cb\ca\ab\aa\bd\8f\a1\aa\97\bd\c6\c7\ca\cc\cc\cc\cb\ca\cb\cb\cb\cb\cb\cb\cb\cb\c9\c9\c9\c9\c9\c9\c9\c9\c7\c7\c7\c7\c7\c7\c7\c7\cb\cb\cb\cb\cb\cb\cb\cb\d0\cc\c6\c3\c3\c5\c7\c8\d4\bb\a9\c2\ba\ba\b6\ca\d6\b8\cd\c0\83gfkt\7f\89\85vjhln{\87\86|uy\80\80ulmv{umhd^\5c\5cZTOXNEFMOIB=}xgfZbg[NQ5Hps\a1\97\98\ab\a0t_o\88kq\8a\8b\85\80rz\d1\c7\84mtbj}sfu\80\8c\9b\8arys\8c\9f\93uk\84w\80\9b\96su\8c\8a\92t\82\7f}\93\8b\7f\89kx\8d\8d\91\8d|s\95\b8\87m\95\8a\a9\9f\80\92xi~w\8ai}\94\81y\84siZ\96\e1\b7ieoq}Yimp\7fw\84n\80ln\81\94\9dvu\85\85\89\95\83kp\97\86\81\83\80st\8d\89s\85se\9d\a1eyV_}oU[lz\86\80\82zy\1c\00\eb\fb\f3\f0\f6\ef\f1\fc\f8\ff\ff\ec\ed\f5\f0\f4\eb\eb\eb\ea\ea\e9\e9\e9\e9\e9\e9\ea\ea\ea\ea\ea\e8\e8\e8\e8\e9\e9\e9\e9\e8\e7\e6\e4\e2\e0\de\dd\d7\d7\d6\d5\d4\d3\d3\d2\d1\d1\d0\cf\ce\cd\cd\cc\cf\cf\cf\cf\cf\ce\ce\ce\ce\cf\cf\d0\d1\d1\d2\d2\d2\d2\d2\d2\d2\d2\d2\d2\d1\d3\d3\cf\ca\c6\c6\c8\cc\cd\cf\d1\d3\d3\d1\cf\d2\cd\d7\d7\d4\d3\ca\ce\d3\d3\d3\d3\d3\d3\d3\d3\d4\d4\d4\d4\d4\d4\d4\d4\d5\d5\d5\d5\d5\d5\d5\d5\d3\d5\d8\d7\d4\cc\c4\bf\c8\b6\bb\a4\9d\9e\b1\b8\cc\ce\d0\d2\d3\d2\d1\d0\cf\cf\cf\cf\cf\cf\cf\cf\cd\cd\cd\cd\cd\cd\cd\cd\cb\cb\cb\cb\cb\cb\cb\cb\cd\cd\cd\cd\cd\cd\cd\cd\c4\c8\cc\cd\ca\c8\c9\ca\d4\d0\be\b0\bd\bd\b3\ac\a1\bd\d2\a9zg^mea^_envz\80xmffhhhenz\81}qbY^\5c\5c`cb\5cW`bde`SA5_\9c\a0dXwc37gj[\86\9e\92\aavUtsq\80o\81\83rnco\88\85\89hY\ad\d5\a1}mfwi\81\81kedwv\8f\8e\90yc\7f\8a\86\80}ld\87\9c\84\83\87w\83\97~n\85\82tw\a3\98`x\b6s]VVZv\8d\86\85\84k_Wc\1a\0a\fb\f5\ea\e9\ef\f1\ee\ed\f6\f4\ee\ef\f3\eb\e8\f5\ee\ee\ee\ee\ee\ed\ed\ed\ea\ea\ea\eb\eb\eb\eb\eb\e9\e9\e8\e8\e7\e6\e6\e6\ea\e9\e8\e7\e6\e4\e3\e3\e6\e5\e4\e3\e2\e0\df\df\d3\d3\d2\d0\cf\ce\cd\cc\d3\d3\d2\d2\d1\d1\d0\d0\d1\d1\d1\d2\d3\d4\d4\d4\d4\d4\d4\d4\d4\d4\d4\d4\d0\d3\d5\d0\c8\c3\c5\c8\cf\ce\cf\d2\d5\d6\d2\cf\d6\cf\d2\d3\d9\dc\d1\cd\d4\d4\d4\d4\d4\d4\d4\d4\d6\d6\d6\d6\d6\d6\d6\d6\d8\d8\d8\d8\d8\d8\d8\d8\d5\d6\d6\d5\d2\cc\c6\c3\b8\b0\b4\b1\ac\9a\b5\c4\ce\d0\d2\d4\d5\d4\d3\d2\d0\d0\d0\d0\d0\d0\d0\d0\ce\ce\ce\ce\ce\ce\ce\ce\cc\cc\cc\cc\cc\cc\cc\cc\ce\ce\ce\ce\ce\ce\ce\ce\d1\d3\d1\c9\c2\c0\c5\cc\c0\cc\c6\b8\d4\d5\c4\b0\b0\c7\c9\9d\83tau}\7f|obam{xnedkpoldkpngbbed\5cSPV_fieec^UI<4;l\80SNoS#5TQT\84\9e\9c\ab\92t\81\7f\86\98\82u{w\89\8a\81uai\8eiw\c7\b8cUb\8ftdhkw\88\85\9e\82gt\86\88\90\91~tw\86\8e\8f\8e\8bq\89\8e\95\8fztj\90\88\84\87hx\9daU\92\96\82\90\85jr`u~\8c\8b\89(\06\f1\ed\f9\f5\eb\f9\fd\eb\e9\f4\ef\ed\f3\f3\f4\f6\ef\ef\ef\f0\f0\f0\f0\f0\ed\ed\ed\ed\ec\ec\ec\ec\ec\eb\eb\eb\eb\ea\ea\ea\e9\e9\e9\e8\e8\e8\e8\e8\ec\eb\ea\e9\e7\e5\e4\e4\db\da\d9\d8\d6\d5\d3\d3\d6\d6\d5\d4\d3\d3\d2\d2\d2\d3\d3\d4\d5\d5\d6\d6\d6\d6\d6\d6\d6\d6\d6\d6\d2\d2\d0\cd\c9\c5\c4\c3\d1\cf\cf\d2\d7\d8\d4\cf\d0\d9\cd\c6\d0\d4\d4\d9\d5\d5\d5\d5\d5\d5\d5\d5\d8\d8\d8\d8\d8\d8\d8\d8\da\da\da\da\da\da\da\da\d9\d9\d7\d5\d2\cf\cd\cc\b8\ab\b3\ae\a7\89\9c\c1\d0\d2\d4\d6\d7\d6\d5\d4\d1\d1\d1\d1\d1\d1\d1\d1\cf\cf\cf\cf\cf\cf\cf\cf\cd\cd\cd\cd\cd\cd\cd\cd\cf\cf\cf\cf\cf\cf\cf\cf\ca\ce\d3\d4\d0\c9\c1\bc\c2\d3\cb\ac\cb\d0\ca\ba\a9\a4\ab\a0\91{cr||wj`dw\88odYW]dfey|~}yvuv}p`WV\5cacKKKIHHJLLaX@I_[HftiVVTHCvry\89\8d\80pi\84\8d\8c\7fvtl`\8c~\89\93tv\a4\acuh`W\84\8b^\89{t\81i\81no\98\98\94s\80\8e}\89\98\92wsm`}\97\83V{\ae]Y\91_mZf|\87\88\96\98\84xXNu\82\81)\13\f2\f2\f2\f2\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\e7\e7\e7\e7\e7\e7\e7\e7\e7\e6\e6\e5\e4\e4\e3\e3\e4\e4\e4\e4\e4\e4\e4\e4\e5\e5\e4\e3\e3\e2\e1\e1\db\da\dd\d9\ce\cc\c9\bc\b4\d0\d2\d3\d6\d4\d9\d5\db\db\db\db\db\db\db\db\da\db\dc\dd\de\e0\e1\e1\df\df\df\df\df\df\df\df\de\de\de\de\de\de\de\de\d8\e1\e3\dc\d9\dc\d7\cc\d8\e2\96\92\af\a1\a7\c9\ca\d5\dc\da\d8\d9\d7\d2\d5\d5\d5\d5\d5\d5\d5\d5\d4\d4\d4\d4\d4\d4\d4\d4\d2\d2\d2\d2\d2\d2\d2\d2\d2\d3\d4\d4\d2\d0\cd\cb\bf\b0\c1\c7\c9\d1\ca\cd\d2\e4\d9\b9\98\cc\d1\c1Z\af\d3\b4|gsezodbit}\83}\81{j`eou\87\87\86\82|wtr]bgihjot^XYVICA8Ejsgmp`R@]f]_fr\85~ndjty\7f\87uoc_o\83\83ty]^noi\8d\d9\c2~rn{\82o\95zekc\8b\a3\8feq\80r{\8f\87|p~rw\8b\84gi\89\96\a0NMto\84\84\85\90\82id]MEz{\88\8a[S\11\00\f2\f2\f2\f2\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e7\e7\e6\e5\e5\e4\e6\e6\e6\e6\e6\e6\e6\e6\e7\e7\e6\e6\e5\e4\e4\e3\e3\d5\d6\dd\d6\cc\c3\b8\a8\c8\d9\d5\d2\d7\db\d5\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\de\df\e0\e1\e1\e2\e0\e0\e0\e0\e0\e0\e0\e0\df\df\df\df\df\df\df\df\dc\e1\e1\dd\da\da\d6\d0\b3\e3\a5\87\ad\b3\c1\c8\c9\d5\dd\dc\da\da\d7\d2\d6\d6\d6\d6\d6\d6\d6\d6\d5\d5\d5\d5\d5\d5\d5\d5\d3\d3\d3\d3\d3\d3\d3\d3\d3\d3\d4\d5\d4\d2\cf\ce\c5\c6\c3\d4\d6\ca\c6\af\b7\d4\cb\d2\bc\ca\d9\af\86\d0\df\ba\84Y]hpnu\80\83whansm`[fv~\8c\8a\89\89\87\81xr\5cgnhZT[f`__ZOIHENiolm]P^A4.Jnmbjel{\87\82qjmqs}\87\80qnvy\84\9c\8btad\a2\dd\9dhirs|\81\83g{\8e~ku\7fn\87\9c\8bdg\86\8b\86\9c\80j\83}[YjZ\5c\87\92zz|gqa`zxu\95\8ff_mJK\18\0e\f2\f2\f2\f2\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ea\e9\e9\e8\e7\e7\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e7\e6\e6\e5\e4\e4\e3\e3\e2\d8\d5\d6\d5\d5\c7\af\a3\c0\db\d7\d1\da\de\d9\df\df\df\df\df\df\df\df\df\e0\e0\e1\e1\e2\e2\e2\e2\e2\e2\e2\e2\e2\e2\e2\e1\e1\e1\e1\e1\e1\e1\e1\e2\de\dd\e0\de\d6\d4\d6\c4\d3\ab\85\9e\87\b0\ca\cb\d6\de\dc\d9\db\d9\d4\d8\d8\d8\d8\d8\d8\d8\d8\d7\d7\d7\d7\d7\d7\d7\d7\d5\d5\d5\d5\d5\d5\d5\d5\d3\d4\d5\d6\d6\d4\d2\d0\bf\ba\9f\aa\c4\cd\d3\c6\ae\b9\d4\d0\b7\9d\b9\c5\98\c9\c0\a0\81ai~\86wputjeh\7f}rb]gpr\85\86\84~wv|\82\90\8b\82wk`WRJOOID?@F[jmxxN;aHGK_laf\86xvz\7f{v~\8b~g[i~\86\87\89pkxkr\85l`\9f\be\8bVk{|\8e\84uZm\82yy\9b\91sx\88\88\8b\8f\8d\81v\8b\9b\88\84\97\a0q[\8f}Zjao\91\8d\7f\8a\96nWzWhz\82o\827\08\f2\f2\f2\f2\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\e9\e8\e8\e7\e6\e6\e6\e6\e6\e6\e6\e6\e7\e6\e6\e5\e4\e4\e3\e3\dd\e1\dd\ce\cd\de\d4\af\a6\b8\d9\d9\d2\de\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e2\e2\e2\e2\e2\e2\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e2\e2\e2\e2\e2\e2\e2\e2\e6\de\dc\e1\df\d5\d3\d9\c9\c6\c4\a5\b0\80\98\b0\d0\d9\dd\d9\d6\da\db\d8\d9\d9\d9\d9\d9\d9\d9\d9\d8\d8\d8\d8\d8\d8\d8\d8\d6\d6\d6\d6\d6\d6\d6\d6\d4\d5\d6\d7\d7\d6\d4\d3\d4\db\db\b7\a4\ad\bb\e0\eb\d8\cc\d0\ce\9a\b9\cd\ae\da\c4\96yjtxwkkz{kadooi_`mwy}\89\90\88ys|\88\94\91\8b\82wnheY`ZMD:7Bbqu\86\8bT6^g`NGRSVf\82xv\7f\83|trq~\84ypnh^\91\84\85serpau\9d\a9ZT\8asd]\85\84\8d\82\85va\80\89\90\86\85xap\8f\8e\93\84w\94\97ePg`u}\80\9d\8a\8bt`fiUXzv}`B+<\0c\18\f2\f2\f2\f2\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\ea\e9\e9\e8\e8\e8\e8\e8\e8\e8\e8\e8\e9\e8\e8\e7\e6\e6\e5\e5\e0\e4\e4\d7\cf\da\d9\c4\ad\b2\d4\d9\d4\e1\e4\e9\e3\e3\e3\e3\e3\e3\e3\e3\e4\e4\e4\e3\e3\e3\e3\e3\e4\e4\e4\e4\e4\e4\e4\e4\e3\e3\e3\e3\e3\e3\e3\e3\e4\e1\df\de\db\d8\d7\d8\c5\c3\c4\a8\b4\a3\a0\b3\d5\db\dc\d5\d3\d8\dd\dd\da\da\da\da\da\da\da\da\d9\d9\d9\d9\d9\d9\d9\d9\d7\d7\d7\d7\d7\d7\d7\d7\d4\d5\d7\d8\d9\d7\d6\d5\d4\ce\db\cf\c2\bf\a4\91\ba\cb\d0\f5\fd\c7\c4\d6\a1\bd\b9\a7~Yj\82\84uu\84\82k\5c_nvuh`ens\8f\92\92\8b}pfcz~\80}vsuyZcYG<.*8gxjhuS=cY^XSVWk\8fqiky\82~xxrqkjz\8e\8f\83umj}\88\8d\8dv[}\e7\c3Y`{\80\8bx_\80co\8c\90x\81\81ft\90\89\99x\8buiwaRvz\92\91{z}k^S`}\8aybE\22 -\5c\d8\ff\bf\19\18\f2\f2\f2\f2\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\eb\eb\ea\e9\e9\ea\ea\ea\ea\ea\ea\ea\ea\eb\eb\ea\ea\e9\e8\e8\e7\e9\e0\e4\e7\d7\ce\d5\dd\b3\ae\d1\da\d6\e3\e5\ee\e4\e4\e4\e4\e4\e4\e4\e4\e5\e5\e4\e4\e4\e4\e3\e3\e5\e5\e5\e5\e5\e5\e5\e5\e4\e4\e4\e4\e4\e4\e4\e4\e1\e6\e3\da\d7\dc\db\d5\c7\c4\c0\b2\bb\b4\86\97\d8\dc\db\d2\d0\d8\df\e0\db\db\db\db\db\db\db\db\da\da\da\da\da\da\da\da\d8\d8\d8\d8\d8\d8\d8\d8\d4\d5\d7\d9\d9\d8\d7\d6\d4\d3\d7\dd\c9\ca\db\bbsOC?^\8dz\c5\a6\e3\f0\c5\85iywl\5c_svcZbk|\84xjm{\85\93\7fkhopaQ`VNPY\5cTJN\5cUGD;;Na\82wn\82kMbsYJavhh\86\88\86\88\88}nlttlmx|uty|\8d~\80yhtogP\98\da\a0m{sy\82]\87\8a\84rqqg\92\9c\8c\88x|c\92\83\84\b4\91^\7fx`Xdopw\8coZ?\13\09T\97\8f\bc\ff\ff\e9\f9\d5*\00\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\e8\e8\e8\e8\e8\e8\e8\e8\ed\ea\e6\e0\db\da\dc\df\c6\ac\bb\c2\db\e8\e9\e6\e9\e8\e8\e7\e6\e5\e5\e4\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e6\e5\e5\e5\e5\e5\e5\e5\e5\e4\e3\e2\e0\de\dd\dd\de\cf\c6\d4\a2\c3\c1\94\a3\cf\de\ce\cf\cc\d7\de\e3\d8\d9\db\dc\db\da\d8\d7\dc\dc\dc\dc\dc\dc\dc\dc\dd\dd\dc\dc\db\db\da\da\d9\d9\d8\d7\d6\d5\d5\d5\e6\d1\ce\ce\d3\dc\adcmrHM*.HQ>m\8e\83kgorskp{t_Zfky|m`^\5cWJJSeplfejid][[RFOPLHA7Gi{wnps`VfhIiQWx\85\86\7f}uot~~w\82b\5c]u\8a~\82zpa[i~\82zl\5cb\af\cf\a0\83w\81\90|St\88i\80}\96\84el{\80\8a\a4ok\96vUjQ\87}\7f\8ayI\1f\0f9z\ce\ff\ff\ff\fa\fe\d3\cc\bf\97]d.\00\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\e9\e9\e9\e9\e9\e9\e9\e9\ea\e8\e6\e3\df\db\d6\d3\d6\be\bf\c6\e6\ec\e8\e1\e9\e8\e8\e7\e6\e6\e5\e5\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e6\e6\e6\e6\e6\e6\e6\e6\e1\e4\e6\e2\dd\da\dd\e1\d3\c1\cc\c2\c4\ad\82\a0\cf\d2\ce\d9\ca\d0\dd\df\d9\da\dc\dd\dd\dc\da\d9\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dc\db\db\da\da\d9\d9\d8\d8\d7\d6\d6\d5\d9\d0\da\cc\e8\d6jO\8cgI_Xgl}D>6:MagbSZgrqiegx\82\81rfgkkymegkloucec_ae_UHFACC9@ZunjniYYiNYf\16\13\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\e9\e9\e9\e9\e9\e9\e9\e9\e8\e6\e5\e6\e5\de\d2\c8\d7\bc\ad\c7\f1\e0\e0\ee\e8\e8\e8\e7\e7\e6\e6\e6\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e7\e6\e6\e6\e6\e6\e6\e6\e6\e0\e5\e9\e5\dd\da\dd\e3\d9\c5\b9\cc\b5\ae\86\8d\dd\d0\ce\e2\ca\ce\dc\d7\db\dc\dd\df\df\de\dc\db\dd\dd\dd\dd\dd\dd\dd\dd\de\dd\dd\dc\dc\db\db\db\d9\d9\d9\d8\d8\d7\d7\d7\dd\db\db\ef\a6c\82o\84_|\a8\99}IPaI=Rs\82wganz{vof^tyvh^blqvjba\5cQIH^a`^`d`WKJEDD?Now|}\84\81bN[U^K3iz}\8erz{ut~\89\8ehs`_q\88\9a\85\85zhao\85\8b\83whmc\a5\e7\ab|d\82\85o|~m\85\96w|\8dwey\91\9e\8b\82cXA\10\18\90\d0\ff\ff\fe\ff\ff\f9\e0\b2qA3@WgL=4Piq!\00\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ea\e6\e4\e7\e9\e4\d6\cb\d0\d1\b4\b2\de\dd\e3\e5\e8\e8\e8\e8\e8\e7\e7\e7\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e7\e7\e7\e7\e7\e7\e7\e7\e2\e5\e7\e6\e1\de\df\e0\da\bf\a4\cf\94\8a|\8b\c7\bf\c3\de\d2\da\e1\d4\dc\dd\df\e0\e1\e0\df\de\de\de\de\de\de\de\de\de\de\de\de\dd\dc\dc\db\db\da\da\da\d9\d9\d9\d9\d9\da\d1\ed\d4lT\87\87\9a_g}qki\8a\9e\90}okmpqlrzzsha^hkjaY[fonkp|\7ftgbmqoiffaYKMOTTHMev\9b\89doycRWvY2evp`}\80\80}}zl\5c\7f|\87xrximq\80\87~tsts{gjwf\a8\f3\afjckkr\90\8cghi`j\91\a3|L10\1b'\94\ee\f5\ff\f5\ff\ff\ff\d7\91W<1)%.APTQ?d^HH^\22\06\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ed\e8\e4\e6\ea\e8\df\d7\d7\d7\af\a5\da\e3\eb\eb\e8\e8\e8\e8\e8\e9\e9\e9\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e8\e7\e7\e7\e7\e7\e7\e7\e7\e7\e5\e4\e5\e7\e6\e0\dc\de\d5\ae\c5\97\be\ba\8e\bb\c0\bc\c9\c0\d1\e0\dd\db\dd\df\e1\e1\e1\e0\df\de\de\de\de\de\de\de\de\df\df\de\de\dd\dc\dc\dc\da\da\da\db\db\db\db\db\d2\e9\a8et\88yiwQi\8f\90\7fvjt{qXSm\8f\a0\87\7f~\82xfblhknkdbjuulhmmf``kpnf_]YQSLDDE:8S~\80htxdt{PZP]_vpi[\83\8a\88{qpqpT\82\8b\83mcpd]t\88\8a\82yk^a\80`d\7f[l\c1\e5\a9RU}ld|\86psr}\ca\ff\f4\ff\fd\ff\e6\89v\8c9\17\11\18(*$3MXdpn_MC@ZRM`b^\1e\10\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\ed\eb\e9\e7\e5\e4\e1\e0\d8\d2\b9\9d\c8\e5\e3\dc\e7\e8\e8\e9\ea\ea\eb\eb\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\e8\e8\e8\e8\e8\e8\e8\e8\e8\e6\e6\e9\ec\e9\e2\db\cf\ce\cd\c1\a0\a7\ba~\a9\b3\c4\de\cd\d9\e8\df\d8\da\dc\df\e0\e0\e0\df\df\df\df\df\df\df\df\df\e0\e0\df\df\de\dd\dd\dd\db\db\dc\dc\dd\de\de\df\b7\5cw\7fcqnw\84Kljly\8f\94~zm`drwqnkntpgisnigf^Yew|sqush^[bknf```]ISWRC5Hp\89mswZVcXTPfQj\83\84\7ftxsiiy\8c\95\80xemcRr\8a\8a\8b~f[h}\8a\85qpv\87iAo\d7\cb\8d_Vo\87g}\87\9b\85q\b2\df\b4i9\10\1c\1b\019\a4X>0B\5chjlocWXbgaYaQIPPj1\03\f5\f4\f4\f3\f3\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\ec\ec\ec\ec\ec\ec\ec\ec\eb\ec\eb\e8\e3\df\dc\db\d0\d6\d2\ad\c7\e5\e8\e6\e7\e8\e8\e9\ea\eb\eb\ec\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\e9\e9\e9\e9\e9\e9\e9\e9\e5\e7\ea\eb\eb\e7\e2\de\d4\cc\df\d1\b4\a0\c2\a0\b3\9f\ab\d1\c2\d5\eb\d9\d7\d9\db\de\df\e0\df\df\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\df\df\de\de\dd\dd\db\db\dc\dd\de\df\df\dfp\5ch\85\8f\7fpx\abU\84\80\8a\8fsewtpjdclvmuyvojfcvmfbZVf|qhejjaYXforia`_\5ci]PPSE?Lrw|\84{YOk`EXH_fa\81t{~~~ziVms\92\94\8a\7fiqnu{\80\89\8e\81o|Uf\7f\92\8bba\a2\fd\cdtgz\8b\82\87ps\80wmi``UJ279;wtgk|{eY^x\8b\9d\9c\84fQH8?^nOU(\04\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\e9\e9\ea\ea\e9\e6\e4\e2\e4\dd\da\9a\a0\c9\ec\e3\e2\e5\e8\eb\ed\ec\eb\ea\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ed\e7\e9\ec\e7\e4\e2\dc\e3\a5\b2\b9\8a\83\b6\a5\bf\a8\ad\b6\bd\dc\e0\db\d7\e2\e2\e3\ed\e8\df\e4\dc\dd\e0\e2\e2\e2\e1\e1\df\df\df\df\df\df\df\df\df\e1\d8\df\e1\ea\c3AFy\8d|q\94\8d\95\88W\82\8dlzqLmljfgp}\86hotnebirzogm~\89\89\84zrqwwi[Tdhjhe_TJSVVK;;Xx\83yinzgU_\5cXdPY\7f\7f\8aoluup\82\8dz\93|zhjzr}\82|wehc\82\7fie\81K1\10\16/G\a0\ef\acZemg\8d\8a\8c{~~n\90\84\8e\9c\88ngZOYcZIv\a5\aa\8de;#3C=6;NON>GE\1a\0b\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\e9\ea\ea\ea\e9\e7\e4\e3\da\dc\d3\80\8f\d1\dd\ed\e3\e5\e8\eb\ec\ec\eb\ea\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ec\e7\e9\eb\e7\e7\e1\d5\ea\cc\c0\c7\96\8f\db\a7\c0\c1\96\a9\da\da\e7\e3\df\e1\de\db\de\de\dc\e0\df\e0\e1\e3\e3\e3\e1\e0\e0\e0\e0\e0\e0\e0\e0\e0\d8\dc\d4\d9\f3\ccxd}\91\91\85w\85s\7fqIh\85\8f\97\88\8f\85{k`ftxsxyxtomnp_dmvyseYvsuwo^SSZYWSMJOVUMGC@CRcw\80\81}pP@PiXT7Cpu\80}~\84\85\7f~ylrp\81{|\7fe^kq\8fpxlMO#M\a1\b5\f1\ff\f4\c2\88Y\9f\d6\a5xw\8fe|}es\8c\87\87\96\83tjnyrfinx\91\5c\18\1c=#,E]ZHFTg\5cRH^]\22\02\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ea\ea\eb\eb\e9\e7\e5\e3\e1\c7\d7\94\84\e8\e5\d9\e5\e6\e8\ea\eb\eb\eb\ea\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ea\e8\ea\e9\e8\eb\e0\ca\e5\d4\bf\dd\b5{\be\ae\af\b1\81\9c\e5\ca\d5\d9\d9\d7\db\dd\da\d9\da\d5\e2\e3\e4\e5\e4\e3\e1\e0\e0\e0\e0\e0\e0\e0\e0\e0\e8\d5\cf\fd\c7Yc\90\8byl}\8b\95rwpw\9c\97\89~alt\80\84znlmlfdceilki[clojb\5cYfglndXW_c[^lqdVRXI<:?Lbu\8b}igpfRKZQ\5cNa\87|z\7fwjitx{\85z|\7fharz\85z{WS`_\b4\c7\dc\fc\f2\d0\fb\e3\c3\eb\ff\89~\ce\db\88<;WTZ\84\92ph{\5c\84\97\87uttm\94\b2\a7\be`-L_h`XQG<67OKKIa`$\04\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ea\eb\eb\eb\ea\e8\e5\e4\ef\d8\dd\a7\8b\ef\e9\e9\e6\e7\e8\e9\ea\ea\ea\ea\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\e9\e9\ea\e8\e9\ee\e0\c4\e9\e1\bb\c7\bex\98\b9\81\8e\a3\a4\da\d7\e1\e6\ca\c6\d3\dd\da\e0\e6\df\e4\e5\e6\e6\e5\e4\e2\e0\e1\e1\e1\e1\e1\e1\e1\e1\df\dd\f6\cbqd\80~\90\87\80\87\82\86z\9bzm~lg\80xy\93\81mdfn{\86|||zxtqoyyxtnkkm}vpkaVX`k_ZZOBLbNNOMEEXn\83\85\81ztgSFRIQ;Fkejt\81\83\87\89tk\80f{\8a\7fpdM:1P\9e\a5\ed\ff\dd\e5\f4\a7{e@\11\12,ZpX[\ab\d3\cd\e8\9c\8fY@9Br\86\97\94z~\9a\ad\b7\b2\b9\c2\a7\f4\90EWZL?23CLB25I^WYL\1c\0d\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\ec\ec\ea\e8\e6\e4\e7\d7\e1\cf\9c\e4\ef\ed\e8\e8\e8\e8\e9\e9\ea\eb\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\e9\e9\eb\e8\e9\ef\e2\c5\c1\e4\c1\b0\c0\95\95\a3\ab\b3\d4\a7\c2\df\e2\d1\da\d1\d6\d9\d4\dc\e7\e3\e3\e4\e5\e6\e5\e4\e2\e1\e1\e1\e1\e1\e1\e1\e1\e1\df\ff\d6bJ\8b\9b\86q\81\8e\96\87\80eycUt\81\89\8cos\7fqr\82\84tnucmvxsqu{x{\81\88\8d\8d\87\82\7fpeehinus\5cPX\5cSPVHHG@7@c\87yzxuxyeH8?WHPss\7fsqdfuqs\8d\85_*\1cG\8f\cc\e2\f7\ff\ac\b9\f3\8fS<7>(;T6\14'K:'[\b1\c1\a7\a0\ad\cd\e2\f8\d5\8diE#:S\9e\cd\b7\b0\b6\9c\a2\94\ff\b4MZcY\5cXL@951Mj\84r`F\17\10\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\eb\ec\ec\ec\eb\e9\e6\e5\eb\c3\ba\ba\86\c4\e9\e1\ea\e9\e8\e7\e7\e8\ea\eb\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\e9\e8\ea\ea\ea\ee\e4\cf\cd\eb\c9\b3\b2{\88\ae\81\8d\b1\ad\ca\d6\dd\dc\e3\df\de\dd\d9\db\df\dd\df\e1\e3\e4\e5\e4\e3\e3\e2\e2\e2\e2\e2\e2\e2\e2\f3\c8\7fm{~\88\87\92\8c|xy\8f\80\91t~\8cz\80\82fz\86}~\81ucgyiu\7f}qjlqz|\82\8a\90\90\8a\85\81qddfcabNTdrkXPT@@@>78Kb\81\87\86rbe[>BH\5cCA`evu\85\90\8dxN+\22Y\a1\e8\ff\ff\e1\de\df\e3\81^4@.\13;&1Pt=+.\17A>>16\98\d1\80\1d;`\86\a0\c2\e8\e8\d5\bbms\a9\b7\ba\a7\ae\bf\a6\f3\b0]gYpj]H3->TZm~ohS\1f\0f\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ed\ed\eb\e9\e7\e5\eb\e4\c4\b8\af\cb\ce\e5\ec\ea\e8\e7\e6\e8\ea\eb\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\eb\e7\ea\ed\eb\eb\e7\db\c3\ce\cc\c4\c7\83\7f\d7\b2\7ft\9c\ca\d0\cc\d1\d6\db\dc\dd\e3\e4\e2\e5\db\dd\df\e2\e4\e5\e4\e4\e2\e2\e2\e2\e2\e2\e2\e2\e1l_v\86\92z\82\85\8a\84{lvo\8ebkxas\98\89\8b\96\89wllolf\5ceospmmo\87\86\82zsquzoloxyqklmcYW[`cfYQIEDMf~ytrpx\88j+0>^RSi\5c`\8aZ6F\86\d2\f9\f7\f8\ff\ff\ff\d6\83N*\1f1DGNf\94S F;eaB-EXQF,\18t\e0\c4|&\18>9\1e/f\8b\d7\d3\cf\c7\a7\b0\af\af\a6\92\dd\b7C:9B51883?TPXbZbW\22\0c\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ed\ed\ed\ec\e9\e7\e5\ed\f4\e3\c4\ad\ba\c0\e9\ed\eb\e8\e6\e6\e7\ea\eb\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\ec\e6\ea\ef\eb\e9\e9\e4\c8\cc\ce\9d\b9\9bh\c8\b5\98\b1\d3\d1\cd\ca\dd\e2\e6\dc\d6\de\dd\dc\e6\d8\da\dd\e1\e3\e5\e5\e5\e3\e3\e3\e3\e3\e3\e3\e3hdlz\8d\94\88\82\7f\82\83\88}~l\88b\5c\88\80blkny\8a\8aukql[[^cikhb]emrnhl|\8c|\84\94\9f\98\86{{jhbYUX]^SPLHBE[rq{\82um\7fuHON]FIdZ]{\98\cf\f6\ff\ff\f3\cd\be|&\18\1e#I[-=TY\8azJ. H7a_O>ITS*/IZ\95\c3\c8Z33(\1f\22H?/\03W\bb\bc\c0\be\b4\a5\9c\dc\b9)\1d4B7XU[bUZO\1b\06\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f2\f2\f2\f2\f2\f2\f2\f2\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ee\ee\e9\e6\ea\ef\e9\dd\d7\f0\eb\c4\b3\b8\ba\de\f4\eb\d9\f5\e8\e8\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\ec\ed\eb\e9\e9\ec\f0\cd\bc\e0\ba\9c\95\90\aa\ad\a6\a7\cb\d2\b8\c5\e2\d2\c9\d0\d8\d9\e4\e7\d5\d9\e8\dd\e0\e6\e2\e6\dd\e1\df\e1\e8\d2\f7\e4gd\8e\93\90\91\83\84\93\9f\8bib|\86zvJg{\84\85uio\82\82{meit}tnovse]_`bcekz\8d\9b\90vfo{wjcWXM>?P\5c]BGF=>Ss\8a\89di`h\7faLTaU+KWU\cd\ff\f3\f6\ed\84;C\1b$1././(Hb>_q_]J2HQ^nnRDUXA/Rg00\8f\e3\e3\5c\12\22+<*\15\0c\079\be\ce\ba\bc\ab\ab\9d\e8\ffqKbK8.:JPRUC[Ym`G\1f\11\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f2\f2\f2\f2\f2\f2\f2\f2\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\f0\ec\e9\e9\e9\e6\e3\e2\d8\e7\f4\c2\9b\c0\cb\d1\d6\ea\da\e7\e7\ed\ea\ea\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\ec\ed\eb\e8\e8\ec\ef\d6\a2\e0\cf\8a{\80\ab\9a\94\8e\c6\cc\bb\cb\ea\d2\d4\e2\e7\de\df\e0\d3\d3\dc\dd\e5\e7\dc\dd\e5\df\e1\e2\e6\fb\cef\5c_PFRGDP0+Let\7fyv\83dr\88\87\81\96\91bl~\85zstl\5ca_doqjhkty{siht\80{wy\80{nim\5ca_VTYXQACB=Hc\85\90}\86\86\80iGQe\8d\8d\84\8fyQMC7RfF/54\9a\dc\bd>\12?=\17\1b\16\11;\b3\b4\92\8a\a1\bc\aa\ca\e3mHD9GNA.)7GHQ=B=7\14\04\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f2\f2\f2\f2\f2\f2\f2\f2\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\f1\eb\ea\ec\e8\df\de\e4\c9\ce\f9\e3\ad\c1\be\d0\c6\df\db\e6\ec\f4\f0\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\ec\ed\ea\e8\e8\eb\ee\e9\a1\c7\d5\b3\a5\8e\bd\a6\9c\89\c3\cb\be\d0\de\de\e5\da\ce\da\e6\dd\d1\ec\e8\e6\e3\e4\e1\de\ed\e9\f9\fd\ff\9c\1eC\82\a0\bf\c9\d3\e0\fc\ee\92E\5cm~\90\8b|}cj~\7fljj[mlptpgejdgmoh^\5cbjqtj]]m}z}\83\84xkjsxyticc`ZRXP>;Nck[CH[\95\ce\a8dYi^Th^4.9UG,2\5cg-T.^\95\95s^qT^\87\8etSJw\98\a5\97wfb^Z7UZA7EH9d\ae\cc\8d2\1c5-%\1c\0f1\ae\c4\b8\bd\c1\b9\98\be\e7|[gdtv^FACC`m``TJ\1c\08\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f2\f2\f2\f2\f2\f2\f2\f2\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ee\eb\eb\ed\ea\e2\dd\dd\cf\c5\e3\df\be\c3\ad\e5\d6\d2\d8\e9\ea\ee\ef\e5\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\ec\ec\ea\e7\e7\ea\ed\ea\bc\cc\e1\bc\98\84\ad\a0\9e\9a\c8\df\cc\e0\d0\ea\ea\ca\b9\c3\b9\b6\d7\e1\e7\ee\de\e0\ef\ef\ff\d7\90Eg\c7\f4\ff\e3\a5\99\8b}g[XLUkvz\81\7f\7f\8eMkrt~oi\87\a2|cktnjpskehli_VV`jliku~vojkorvy\80\80{slgb]NOL?08`\89\b6\e5\fa\c7\9a\a1\8dY3`i[QNSNkOAJP\5cgZUai+(2+?Q-[}llx\88\88q\94\9eg`ybaQAALL@7%\85\e5\ec\81)-2$%\1d;\b3\c6\b5\b4\b0\99\8c\d2\ff\94LLKQU[gtuoTPDPWV!\0f\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f2\f2\f2\f2\f2\f2\f2\f2\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ea\ec\ec\ec\ee\ec\e1\d4\d4\cd\d1\c5\b4\c8\a0\d1\d7\c3\c8\d6\e5\ee\ee\e4\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ec\ed\ec\ea\e6\e6\e8\eb\f8\c5\c0\ec\c2\84\8c\8b\9b\86\9f\c8\dc\aa\dc\f1\db\e9\d0\ac\af\c4\d0\d7\c9\ca\d7\da\e1\c9\80T\94\d5\ff\eb\b7\cb\f5\eb\98\8f\a3\a7\af\bf\97bk\83\8e\8c\89{t\80Z\84|l\8b\97\83\7f\80wlhkmjffjnmkkllhnx\7f\81|rkf`[_o\7f\85\84pt{\7fyj[RLO@7f\bb\f3\fc\f5\e4\aegDYeDPbXMT^T.r}jXdVB[Bn\95<>UG@mEdrV[o\82ZAq\8fio~M[piYWJCTI,\8e\fa\ebu\17+69,<\ab\c0\b1\af\cd\be\a9\c6\fa\9d\5cY<:>DD>>CPLWs}p%\10\f6\f5\f5\f4\f4\f3\f3\f2\f3\f3\f3\f3\f3\f3\f3\f3\f2\f2\f2\f2\f2\f2\f2\f2\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ea\ec\ec\ea\ef\f2\e6\d6\bf\c4\d3\d8\bc\d4\b3\d5\d8\c9\c5\c4\e9\f5\ed\e9\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ec\ed\ec\e9\e5\e5\e7\ea\e8\d2\bd\e8\db|\a0\b2\86x\8e\99\c2\cb\e9\cd\ac\9a\b8\ea\f1\e7\ea\ed\eb\e9\e9\e8\ea\e6\e1\ef\be\af\ba\de\d8\f3\fa\e3\ac\b6\c4\c2\ca\b9}^_u~\80\83zu\80PfmedcWLgjpwywutu~\80tgbde\85~vuvvoiu|\7f}\7f\86\8b\8b||\81\86\81rfcbcMWZA0=jzeknKSlj[_c^ahmYSt\b4\cd\9dejK=\9a\b4\b0\b0\a1\b7\ba\b3\ff\e2i\11.;=3.:IORp\82_Nc\1e\01\f4\f4\f4\f4\f5\f5\f5\f5\f3\f3\f3\f3\f2\f2\f2\f2\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ee\ee\ee\ee\ee\ee\ee\ee\ec\ec\ec\ed\ed\ed\ed\ed\eb\ef\f0\e6\e7\f0\f0\f2\e7\e4\c0\bc\a5\b4\b7\9d\cf\b3\ad\c2\e6\e8\f1\ef\ec\ec\ec\ec\eb\eb\eb\eb\ed\ed\ed\ed\ed\ed\ed\ed\eb\eb\eb\eb\eb\eb\eb\eb\ea\e8\eb\f1\ed\e2\de\e1\e5\db\d3\d5\c1\84\ad\c9\97\a1\9c\97}\ae\bc\cc\ef\ea\e5\e4\e6\e8\e7\e5\e7\e8\e6\dd\ea\e3\ff\ea\f6\b8~\96\cc\f9\ff\d8\a2\b6\c0\beqg[u\94\9a\90\83ibsaBty\87y\8c{\8a\86vbW]iooliaat\89\86u~~~}}}~\80\9c\93\85zw|\85\8cyv|\88\86wmoRbgP48b\8c\95\8b]Qcq{n@KFDS[\5cf_az\7f{uo\88\8d\93\bfpISPSa7OjW:3TXC>^V= cxe^\5cWakde[^LM|\b4\e8\89KOB\a8\cb\b8\cd\bf\bd\a9\b5\f1\f1\85\13$;32.=8E2>RGW]&\0f\f4\f4\f4\f4\f4\f4\f5\f5\f3\f3\f3\f3\f3\f3\f3\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ed\ed\ed\ed\ed\ed\ed\ed\eb\eb\eb\eb\eb\eb\eb\eb\f3\f1\ea\e9\e2\ec\fb\e3\f8\dc\bb\b6\8e\91\9e\92\d5\c6\a7\b2\e7\e7\ea\ea\ec\ec\eb\eb\eb\eb\eb\eb\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\ea\e9\ea\ee\ed\e6\e1\df\ed\e0\d2\d4\c5\84\a3\cf\84{\8b\d0\a9\b0\e8\e9\e4\e6\e7\e4\e1\e0\e4\e8\e1\e6\df\e8\fd\c4\d3\f3\ff\b5\a9\d6\d3\f9\f8\e1\a4\af\c5\9edZep\86ws\8b\83p}xL\acxJi\80Y\87yjYU_lomne`m\87\96\8atoz\83\80tlmr\87\7funnqtusx\88\95\8fxgch\5cPPVUI@FLcwdm\89gT_UKZgmwtrzw\87\90\82\8e\85nuITj^6BE_UPeR4?UOFC]]}|oqV>Vph>)jcRmy\7fymccihq`fmimS\86\c8\b7[u\c1\b2\d0\aa\c6\a8y\92\bc\a0cj\b6\a7cN\81n>IBZPEB\1b\0d\f5\f4\f4\f3\f2\f1\f0\ef\ed\ee\ee\ef\f0\f1\f2\f3\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\f0\ef\ef\ee\ed\ec\eb\ea\f4\e8\eb\dd\ce\da\db\cb\da\d2\d6\c1\91\95\c3\92\98\d2\ac\89\b0\b3\ce\e8\e6\e7\e8\e9\ea\eb\eb\ec\ea\ea\ea\ea\ea\ea\ea\ea\eb\eb\eb\eb\eb\eb\eb\eb\ee\ec\e9\e7\eb\ee\ea\e3\e7\e1\d9\cb\c8\b6\96\e4\9d\87\ba\ff\ee\8d\ce\d5\e1\e5\ea\ea\e6\e4\e4\e5\fb\e8cN\81y\e4\fc\f9\d5\86\9c\87\ca\f1\ff\cbhkZw\87zr\8c\8b\85\87si\80}it\83v\82xxlg__ggcl|{mhomchxabcb``bdyvqmmrz\7f\8a\8b\85yqme\5cghaN:6DS,Ot\86iZfLBIGM\5c\5c[hnNj\8e\9d\9cwZNfyG9JkY`VogPNBAMKG\5cVOH\84\a32Bvy`YICH-6Zf\93zgmmb_jkdhcZjdhmVeEw\c6\e1\b2\d8\e6\ff\ff\fc\d0\9boD2?/6>C\1d!0C:8KFKA\13\12\f5\f5\f4\f2\f1\ef\ee\ee\e8\e9\ea\eb\ed\ee\ef\f0\f1\f1\f1\f1\f1\f1\f1\f1\f0\f0\f0\f0\f0\f0\f0\f0\ef\ef\ef\ef\ef\ef\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ed\ed\ed\ed\ed\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ec\ea\ea\ea\ea\ea\ea\ea\ea\e9\e9\e8\e6\e5\e4\e3\e2\e5\ec\e2\ef\d9\ab\b0\b7\cd\f1\d7\c2\a6n\a1\ae\7f\a9\a6\96\b7\b3\c7\f7\e5\e5\e6\e8\e9\eb\ec\ec\e9\e9\e9\e9\e9\e9\e9\e9\eb\eb\eb\eb\eb\eb\eb\eb\ef\e9\e9\ed\eb\e6\e7\ee\dd\dd\df\bb\a7\b5\88\bbrJ\b5\eb\f7\a6\c4\d8\d9\d9\db\e2\ea\ee\ee\ebjY\84\94~\93\fc\f7\e7\d7\cf\c3\cc\f3\ff\fc\aec`{}|\81\86\93\82u\83xehUw39X\97\b6\f8\ff\ff\bdygqocZSarufW]kpjir\7f\83ym\83\8b\8e\81k[Y^]^\5c]irdM`b^QDH[nm\81rmk]TAC;7IYNQo^JXC/RdZG@QQM8[aS`\81gBGJM[;3AI\88}hpwojpi_ddnL>D4.1[\99\9f\ca\d0\c1d/\1c\13\0b\22GLEPJI/48E>NL7TM51\19\12\fb\f6\f7\e5\f0\ea\ec\f3\ef\e9\f4\f7\ec\e5\e7\f2\e8\e8\e9\ea\ea\eb\ec\ec\f1\f1\f0\ef\ef\ee\ed\ed\ef\f0\f1\f1\f0\ed\eb\e9\ed\ec\ec\ec\ec\eb\eb\eb\f1\f0\ef\ee\ed\ec\ec\eb\ea\ea\eb\eb\eb\eb\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\f4\ed\e8\e9\eb\e9\e7\e8\de\de\ea\ea\d6\de\d2\e0\df\df\e3\e8\e0\be\ac\c0\cc\c4\fc\de\b9\95\92\87\95\ab\ae\8b\c4\bc\c8\d8\e1\ee\ef\ed\f4\ed\e6\ef\e4\db\e3\ef\ec\e7\ea\eb\f4\eb\ef\f1\e7\ea\f0\e9\e9\e9\e9\e9\e9\e9\e9\e9\e7\c9\ea\eb\dd\af{\f4\aa,\a8\fb\ee\b2\c9\ef\f5\d3\dd\e8\df\f0\d6{y\92\98wx\c2\f3\de\d0\ec\f6\f8\ff\e0\91PXsx\90\8dx\81t\7fu}U7%\1c_\ab\ff\fd\ff\d8\a0\e9\a3^]]cmobRido\86\8d}lha]e{\88\82vohcfpsopwhTIUglga[_ZOFAQlHKtrfiNE;0Korl`IVa\5cX84ek_95:2LdS2&f{1UD/Cdzy{\94~kqxvkb^WN?7F~\c6\f6\fd\f3\e5\9dg\ab\db\c5\82\00!;5972B684;B7(2LTSN_N@\1f\14\fb\ea\ed\ee\f3\e3\eb\e3\ef\f2\e4\df\e8\ec\ed\ef\e7\e8\e8\e9\ea\ea\eb\eb\e8\e8\e8\e7\e6\e5\e5\e5\eb\ec\ee\ef\f0\ef\ed\ec\ed\ed\ed\ed\ed\ed\ec\ec\f0\f0\ef\ee\ed\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\f2\e5\e9\ef\e8\e9\e7\d7\e9\eb\df\e3\c7\d6\ed\e1\e6\b8\e7\e6\c6\cb\ae\9c\95\ce\db\de\d7\8e\7f\94\8e\9e\c4\93\b7\b7\b3\c3\f0\ee\ed\eb\e7\e7\eb\eb\ed\e1\e4\ee\ea\e8\eb\ea\ed\e6\eb\ee\e7\eb\f1\eb\e9\e9\e9\e9\e9\e9\e9\e9\eb\d3\ea\e9\d7\b3L|\abS\ad\f8\ff\b0\bf\ea\e8\ff\dc\d7\ff\dcqTi\89\9e\86}\bf\ff\ff\f7\ea\a6`]rdIF\5cuw{\84{o_@1|\d2\f3\ff\f2\ff\fa\d1zdE!\00\145^suomn\80\81\88\8c~lly\7fjbt\88\86te[[etvkdekb_hldXR`bTJK@6>G48Zw\5c0+*7]iMc`S1FaC>>>[_91=1H)k\94S`NM6PCCZvzqu\5c@8Lu\a4\c5\ee\ee\ed\d2\8a9\19\22\22$\19M\93\d5\dft\1a*22==.->69@9-5I84.C<6\1a\11\f9\f2\ee\e2\e0\ec\ff\cb\f0\f3\e7\f3\f0\e0\ea\e7\e6\e7\e7\e8\e9\e9\ea\ea\e9\e9\e8\e8\e7\e6\e6\e5\e7\e8\eb\ee\ef\ef\ee\ee\ee\ee\ee\ee\ee\ee\ee\ee\ef\ee\ee\ed\ed\ec\ec\ec\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\eb\f0\dc\e5\ee\da\d7\e4\e1\f6\e8\d3\d2\b5\d7\f7\dd\d9\ab\ce\e7\ba\bc\de\d8\af\dd\c6\d8\e8\bd\95\a2\b5\8a\90\81\aa\a7\ce\ed\f4\e7\e9\eb\e1\e7\ef\e5\ec\df\e0\e8\e9\eb\ed\e8\ea\e6\ea\ec\e7\e9\ed\e8\e9\e9\e9\e9\e9\e9\e9\e9\ef\df\e3\e4\d7\e3\90\bdr7\88\e1\ff\ae\c1\dd\f0\e9\e7\eb\c6v[\85\80\85\82jg\93\9fvjbK6\22\0b\16QRXN*J/t\91ORN^?@4Q\84\a3\9d`m\b2\ec\f8\f5\e5\abg-\19\15(3)\22&$-%<[\9b\df\c5C#3888&:=57@:( %))+KLD\1c\09\e8\e1\df\e2\e6\ee\e7s\96\e5\eb\e3\e2\df\f0\e5\e5\e5\e6\e6\e7\e8\e8\e9\eb\eb\ea\e9\e9\e8\e7\e7\e7\e8\eb\ed\ed\ed\ec\eb\ed\ed\ee\ee\ef\ef\f0\f0\ed\ed\ed\ec\ec\ec\ec\ec\ec\ec\ec\eb\eb\ea\ea\ea\eb\eb\eb\eb\eb\eb\eb\eb\e8\e5\e0\c7\ab\b6\d9\ec\f5\e7\ec\da\b4\d6\e5\e8\d6\dc\c6\b8\b5\d4\fd\ed\82\88\ad\cb\af\ba\8cw\b3\94\83\97\b2\95\e5\e8\ea\e3\e6\ea\e7\ea\ea\e2\e1\d8\dc\e6\e9\ee\ee\e4\ed\ec\ed\ed\ea\e9\e8\e5\e9\e9\e9\e9\e9\e9\e9\e9\e2\df\dd\ec\db\dby\ab\9fJ\96\e0\e7\ae\da\e8\dd\d2\ff\ef{Py\85\a9tt\9c\9axZE#\22#Dz\91\89\87fF[\96\e1\ff\fd\fc\ff\eb\acL\18\0c\06\17;CEP\90~jxxf[dx\8d\a2\b1\a3\88jZ\5ceov``goojp{\80uookdel|qihf`afmTCBY\82\87e\86\a7\8dc7(LR2;Vk`KKWQ@:fxpi9:2=D;4NOL'\15\ed\ed\e2\d8\dd\e9\e2l\9c\ff\f4\d8\e6\df\e1\e1\e3\e4\e4\e5\e6\e6\e7\e7\e7\e7\e6\e5\e5\e4\e3\e3\e9\ea\eb\ec\eb\e9\e7\e5\eb\ec\ec\ed\ee\ef\f0\f0\eb\eb\eb\ec\ec\ec\ec\ec\ed\ed\ec\eb\eb\ea\e9\e9\eb\eb\eb\eb\eb\eb\eb\eb\ea\ed\f0\f1\d9\aa\a0\c0\f8\ea\e7\df\c7\d1\c1\c3\ea\d3\ab\9f\db\f9\dd\e9\c1r\8b\cb\b5\da\aaUr\96\ad\a1\a0\97\f5\e2\e7\eb\e6\e3\e8\e4\de\e2\e2\de\e5\eb\eb\ed\ea\dd\e9\ec\ed\ee\ef\ed\e9\e9\e9\e9\e9\e9\e9\e9\e9\e9\f1\ea\cf\df\e7\eb\7f\a5\be]\b4\e8\d1\a0\d7\ed\f1\ff\d1~i\84\84jp\81\93l\1d\071Ss\93\9a{N9b\a7\f5\ff\f2\f8\ff\f6\9e&\03#&!26Etsyjp\87k{`ylkw~|\81\8cryzrjlv\7f\5cX]nyxtvwsv\7f~tpsrigoska]TJTLJ\9a\e4\db\bb\ae\91\83e`g,>f\80zme\5cT}\82bF8Ng8%@beF5*#,.#\22-$'!\1c&52\22#***%E\91\c0\d8\97MET\5cmfJ8&\22&(+.;:=^]N\1b\00\e7\df\df\ec\f5\ce\9dEd\c0\f4\fa\e9\dd\e7\de\e2\e2\e3\e3\e4\e5\e5\e6\e9\e8\e8\e7\e6\e6\e5\e5\e9\ea\eb\eb\e9\e7\e4\e2\e8\e9\ea\eb\ec\ee\ef\ef\e9\ea\ea\eb\eb\ec\ec\ec\ee\ee\ed\ec\ea\e9\e8\e8\eb\eb\eb\eb\eb\eb\eb\eb\ee\e9\e5\f5\f4\bf\a0\bb\cf\da\d1\e7\dc\d4\cf\c6\cd\df\b3\9a\c4\da\cd\c6\c9\81t\b7\b4\ba\b9vi}\b0\84\88\a5\ec\f7\ee\f5\e7\da\dd\d8\d6\e6\ea\eb\f1\ef\e6\e7\e6\da\e0\e7\e9\eb\f2\ef\ea\ed\e9\e9\e9\e9\e9\e9\e9\e9\e5\ee\d9\db\eb\fb\96\9a\ben\c8\f5\da\9a\c8\ef\fd\d7|Nu\91\88\8e|\7f\87~z\95\99sMRw\c7\ff\ff\f2\ff\f5\e9\83$\00\12UXy\aaveT4-7<\8d|]XTMYVVL\a7\9e\87\80V=*1BD3#%)1899=DYCHcX;N|\b9\cez?KOK561/4;=94;97SPF\1d\09\e9\e5\e4\d2\a7I2N^3i\df\ff\e7\db\d6\e1\e1\e2\e2\e3\e4\e4\e5\e9\e9\e9\e8\e7\e6\e6\e6\e5\e6\e8\e9\e9\e7\e5\e4\e5\e6\e7\e9\ea\ec\ed\ee\e8\e8\e9\ea\eb\ec\ec\ed\ef\ef\ed\ec\ea\e9\e7\e7\eb\eb\eb\eb\eb\eb\eb\eb\e3\f9\f2\df\e0\d5\b3\99\b9\dc\ee\f9\cd\c3\d3\d3\cd\d9\b5\d1\e1\c9\ed\ff\ad\83f\89\c6\d3\c2y\85~\ae\83\94\a7\cc\e3\e6\eb\e8\dd\d4\d3\de\ec\e6\e9\ed\e3\d6\dc\e6\e2\df\e9\e7\e7\ee\e7\de\e1\e9\e9\e9\e9\e9\e9\e9\e9\e3\ec\ea\d5\d0\e9\aa\98\b3b\9f\dd\e0\a2\dd\ff\b3ym\8d\90\7f~\85\9doq\86oe\9c\db\f6\ff\ff\fe\f7\c3h&\02\0c\17/GMA)MH(ZQ9\87\88\a2\b6\de\c7\a1\96\c4\b8\97p[n\82{nkjg]Wdwymfr\81\81ocr\8a\a2\92\84|tloyukca]WX_ZUB8z\ea\ee\91\953He2;dYX\5c`u\82gNX\88V:-80$W^YNEB=99@V\a2j?8;0KYk\96\c7j\87\92zI,;IABR;J_ki`UNbjnc_ZF:\82\d2\ce|GAGGG?2'&+/009Ee^K\1c\06\ea\e4\97\22\0f\10\1c4.$\0e\1av\d0\e4\de\e0\e0\e1\e2\e2\e3\e4\e4\e1\e1\e0\df\df\de\dd\dd\e1\e3\e5\e8\e9\e9\e8\e7\e3\e4\e5\e7\e9\eb\ec\ed\e7\e8\e9\ea\eb\ec\ec\ed\f0\ef\ee\ec\ea\e8\e7\e6\eb\eb\eb\eb\eb\eb\eb\eb\ec\e9\e7\e8\e9\e7\e3\df\9d\a4\cb\d3\b6\d6\d9\cc\df\c0\ad\ce\f1\e8\e4\f6\df\cb\b7~\b9\e4\c7\8aw\97\b5\82\92\a5\df\e8\d4\d7\e6\e7\d5\d7\ea\f1\d8\dc\df\d3\c6\d4\e9\ed\e7\f0\ea\e5\e8\dc\cd\d0\e9\e9\e9\e9\e9\e9\e9\e9\f4\eb\f7\de\cc\e4\bc\99\ccj\8a\dc\ec\a6\de\e1\86\88\83{{\80r[Ml\8d\96\a8\df\f0\c6\da\8e1\130;'\19H_\84qfkF5D6Ma@j\c5\bb\c8\ba\b1\be\b0\85\b8\ac\9e\7fkjaQZrj\81\90\8c\87\87\80sqopqkgs\85oihmmhho_agi`ST]`YSTG'\16\1e5EF1JN(@YuthongohE/LB)>;VI53DNJH.j\baS\17)LG=2W\c8\cc;\8buehg`^dhhB_iVKUXMaddY`eLOF\1d\11\e7\eb\db\bf\db\d7\da\fa\e2\f2\e7\c8\ec\e3\e3\d3\de\de\df\df\e0\e1\e1\e2\df\e0\e1\e3\e4\e6\e7\e7\e6\e6\e6\e6\e6\e6\e6\e6\ea\ea\ea\ea\ea\ea\ea\ea\ee\dd\e8\ef\e1\e8\ec\ec\ea\eb\ed\ee\ed\eb\e8\e5\e8\ef\ea\e6\ed\ec\e5\e7\c8\df\dd\e3\cf\95\c3\ea\d8\db\ce\ba\e5\e0\ce\c9\f0\a3\df\f6\ed\d9\c2\be\c5\f7\d7\d1\a9j\af\86y\82\9f\95\9c\b5\e7\ea\cb\cb\d6\de\c8\d7\fa\df\d8\f2\dc\e2\d6\cd\ee\d2\c8\e0\e3\eb\dc\d3\f0\f2\f2\eb\e8\ee\f0\eb\e7\e8\e4\ea\e2\ea\f1\e5\c4\b7\aeO\7f\c1\d5\87K:du\b4\ef\fa\f9\f9\ec\aa\86C&>C8CdNMv\89_8?a;0IVLA@DVdvN]\c3\ce\b1\b6\c5\d4\b6\89\c1\b4\84oer\7fzj_knkhnvpa^x\8b\84tpv|\81\7f{umf_[qrtvvnaW_COf7\15+)\0e=XSB'#=jfkrj[]ks<4;@8,O66FYT=8E\11T\8cfC=0Og3\9d\f7o+f\83gRbdYUHHYEIV\5cVKU\5cQ^_MZl\5cUIo\bc\c1i(-G1('AH7O`YIXPI$\07\e1\e1\da\ba\c3\b0\a2\b4\af\da\b8\c2\eb\e0\e9\e1\dd\dd\de\df\df\e0\e1\e1\e0\e1\e2\e3\e5\e6\e7\e8\e8\e8\e8\e8\e8\e8\e8\e8\ea\ea\ea\ea\ea\ea\ea\ea\e9\eb\db\f0\e2\ea\e8\ef\ea\eb\ec\ec\ec\ea\e8\e7\dd\ed\ed\e7\ec\ee\e8\e7\db\e1\df\ea\d6\af\e3\ec\d9\d4\d9\cd\d1\d5\e6\e2\c6\cb\f3\c9\e9\d8\c8\e4\e9\c2\d7\d0\c3\ae\ae\a2\8e~sa\83\a6\d8\e9\d9\cd\d6\e4\d5\de\f2\d5\d7\e3\c9\db\d7\bb\dd\ec\de\d9\e9\f2\d7\d7\ec\da\e6\e3\e7\ef\ee\e3\e0\e5\e7\da\e2\f0\e3\f4\bc\96\d4an\df\bcg\aa\ff\ff\ef\ff\f9\9f<\1a\1e\1f)6O_QTxWibEFgf@h<;M:/I_WadV\22P\cb\d4\cd\ce\c5\ac\96\95\d6\b8\8fxhp|{tprngi{\8e\8b|\80\85\82{{\84\88\84orvwuohciijkkcWMNKPTR\93\f4\ff\fc\ee\b5sJ0/INo{h`j`DBe\8dvMS_\5cWP\5cO^`^SIPNHP@=SMBU-0?\8f\dd\b7z\88\82\92\8djka56/20<--\17\0e\dd\e0\e0\b4\b9\b3\a5\b2\b9\ce\b4\e2\e9\db\e6\de\dc\dd\dd\de\df\df\e0\e0\e1\e1\e2\e4\e5\e7\e8\e9\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\e2\f3\da\e3\e6\ea\ec\ed\e9\ea\ea\ea\ea\e9\e9\e8\da\dd\e7\eb\e7\e7\e9\e5\d1\c2\d9\f6\e5\bc\d5\d4\ef\e7\cd\bd\c1\c6\d9\e1\bf\db\fa\dc\d5\bb\d2\dc\a9\cd\ff\ff\f0\c0\a5\9f\ae|~\91\b2\c2\e4\e2\cc\e4\cb\c2\ea\f0\d1\c4\fc\e9\e4\ee\e0\bd\bf\e7\e2\b7\de\eb\de\eb\e0\df\d9\e4\eb\e8\e1\df\e3\e5\f0\ee\ec\f3\e0\ff\bf\86\dd`M\d7\ff\cd\a5\dc\8a;+Q@\1b2cbWP\5cfZNQog\87\9b\88\89\95\84C'*CF?AB174??]\a8\bf\aazt\97\a9\90\b8\b8\91zinwxwysgWTgztaaoqaQQY_biqwtj^UZZ[^`[RJXMP\98\e9\fd\d1\8aG* $';G:SZhtnYF?s\82\81fbqgQXjhG-3FP.SUGJZ_H6<\ef\96%Hh\81kCK^b`UZEb[XQPeYRLQUQZd`\8f\7fWe\b7\d9\a2hX_EA8\1f/Demex\88u \02\e2\e7\ed\ba\aa\88j\85\b8\b8\b0\e2\dc\e2\dd\d0\dc\dc\dd\dd\de\df\df\e0\e1\e2\e3\e5\e6\e8\e9\e9\eb\eb\eb\eb\eb\eb\eb\eb\ea\ea\ea\ea\ea\ea\ea\ea\de\f2\df\d0\e9\e7\f2\e7\e9\e8\e8\e8\e8\e9\e9\ea\e4\cf\df\f3\e5\e1\eb\e7\c5\c1\e1\ef\df\a3\aa\df\e1\d6\d1\dc\ca\d2\f2\ea\b4\e5\ff\d7\9f\b9\dc\b4\d7\ef\eb\ca\ef\d6\a6\a4\5cIcp\81\94\ce\e4\e5\e3\ba\bc\f1\dd\b8\de\e8\d4\dc\e9\e8\e0\d6\d9\f0\cb\e1\e2\db\e2\d1\dd\e6\e6\e5\e5\e5\e6\ea\ed\de\ed\d4\e3\ca\aagu\c6nV\de\e5\823\1d\18\00!dvkhhgd^W`|\8e\8ah\81\7f]N[L!\22@T]aQACH[6*>-&BO+,TyOMQwiepwqhfkaUXp\89\87w\5cw\8e\8f\85\7f|xvxyywrmjjhgijf^W?F^g\92\84{_4,@Fo[\5cpmQHWmdRPUY]W7''8B:6;g[b\81qA7@!\82\f8w%Ex\9frLKOQYRTbO1GWKPCL[jd_u\89\84\85rVEu\d3\d7\81\10\12$Vfj\88\89uxv\88\99\87(\09\eb\e0\ea\ca\b7Z\00\18X\9c\d1\ee\d9\db\cf\d9\db\db\dc\dd\dd\de\df\df\e2\e3\e4\e5\e7\e8\e9\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\ea\df\e7\df\c8\e6\e5\f0\e5\e8\e7\e6\e6\e6\e8\ea\eb\f1\d2\db\f3\ea\e3\ec\ec\c3\cb\e7\d6\b8\9f\c0\e7\f2\cf\d5\ef\b7\c9\ff\e8\d0\eb\e9\c4\b5\ca\d0\f3\e6\d3\eb\e5\e6\d8\ca\b1\8a\82v\5c\81\b1\e2\e6\fa\d8\cd\db\e0\c1\b1\da\dd\d7\d3\e9\e4\cf\d1\c4\e1\e3\d8\d7\d9\de\ed\f0\f1\d8\cf\e1\ec\e6\e4\ed\eb\ed\ca\a6aA6Z^KW\de\9fP\8bwnv{eQfoO:VpaFUmfv\8b\8c\a5\c5\92KE+B9.@@.,$.;1(DXEEZUJ\7fvq\7fm`Zbgcadrla^lztbj{\8b\92\96\97\8d\7f{|~~{wqnrnjhe`VOMUQS`\86\a0\81dR3:i|nhg[YefWNP]bQRZ_dOYG2&'2EUBV^=/MQ60\a4\a8P45j\9bwOGB@PXdRF8Jckl_}\a2\95pmldlG7:1=\9d\e7\d1\98z\89\80jun_k_ggTQ\18\0a\e4\d1\dd\db\f1\95(J\db\f6\e9\d9\da\e8\df\e1\da\db\db\dc\dd\dd\de\de\e3\e3\e4\e6\e7\e9\ea\eb\e9\e9\e9\e9\e9\e9\e9\e9\ea\ea\ea\ea\ea\ea\ea\ea\e5\d9\d4\cf\de\e5\e3\e9\e8\e7\e5\e4\e5\e7\ea\ed\f4\e0\d5\e2\ee\e8\e5\ed\cb\dd\eb\e2\c4\bb\f0\df\fb\d5\a5\c1\bc\d4\f2\e0\c1\e9\dc\a0\b7\d7\d9\e1\c9\c2\b2\dd\bb\8f\de\8f\85\b5\dd\a7}\89\c6\d1\ab\ae\cc\d2\cf\d6\cf\d3\e8\ea\de\e5\e4\cf\ce\d4\dd\df\ca\d6\e3\e5\f7\ec\e4\d0\ce\e2\e9\de\dd\ea\e7\98nNZ\b2\b7\81kWCbs\87\94\88beu\84\9d\ba\98Fxa`_Vk\7fqv{\89\af\b9z@C2FM?0,8I@Apa1]u3DO?D\8c]B\87yi^`ddkulppoy\84\80rk\81\8d~g_cg{xsle^XUkf`]ZULE\5cIB_qu\80rVgc[\5cPGTmKKptRG\5cDe^\5c\5c`hHMLB>QdU44?yqC3>BR_VRe]/)F?,1>\22'\8fjE\95{rqz}vuz\81\8a\8d\8a\8c\90\89|jz\85\82|{un\87{i]\5chx\84lgcbb_YTSaIEUQPNZWdcNQdfzk__fklm^j^nePjpHA?B<-',\18D\85L\22H0\12o\c8K;A5e\9a\8aX\5ciU<;^N>RZ_X3/8<;CW^and}\81\83\7f_{\d7\eb\a0B5O_qg\80y|\80\8f\86#\10\d9\d9\d3\d9\e0\96\1ai\e0\da\d4\d1\d2\d4\d5\d4\d5\d6\d7\d7\d9\da\da\db\dc\dd\de\e0\e2\e4\e5\e6\e7\e7\e7\e7\e7\e7\e7\e7\e9\e9\e9\e9\e9\e9\e9\e9\e7\ef\cd\d0\e4\d1\ca\d5\ed\e2\db\ce\df\f2\df\de\dc\f2\c8\cb\db\ed\d1\d2\d7\de\b9\e5\c5\b9\ef\ec\e3\c8\bf\f9\db\cf\f6\90\c8\fb\95\c3\f1\e7\f4\de\e2\f1\e9\cf\d1\c3\bd\f1\9f\83\a0\ad\98\9c\ac\be\ed\e7\da\cd\e2\e0\cb\ef\eb\f3\ef\e1\d2\c5\cd\e2\e6\aa\bc\ec\e5\d8\dd\d9\cb\e9\ff\d3\ef\e6\d3\db\d7\e6\9bVUVay\81jBEq\82\86\9f\bd\bd\b4\c8\afmS@h^^`X`\86\aat\5cy`cyGFGFEEFD>8((),28=?)\1a=j\96\83\9d\c1\86sp\81\85xv\82\90\96\93\8e\96\9b\80ZmnhXLRk\81kgcdhifaKJJQXZUNY_YGBQbjT[]XV]gkl^G\5ci^`TV`ffjmcSAA?=82+&\1bX\a3d\1fEG!\ae\a1*SG1'\19_\91T,:()\d9\82'TY5@\87\99LXrKUk;kqlYXu\8d\8cx\92\93\92\9e\8cja|zthG';r\c3\e0\be\85rdk\95\8do\8bfk\80\19\00\d8\d9\d7\cc\e4\9b%\9d\e6\e0\d9\d6\d8\da\da\da\d8\d8\d9\d9\da\db\db\db\de\de\df\e0\e2\e3\e4\e4\e6\e6\e6\e6\e6\e6\e6\e6\e8\e8\e8\e8\e8\e8\e8\e8\e6\e4\e9\ce\c5\d4\d0\db\d1\e1\e8\dc\cc\dc\ef\dc\e4\e1\ed\c1\df\d6\c9\d5\ef\d2\cf\e9\90\b1\d1\d3\c8\da\da\ca\c9\ea\bd\a7\a8\88\ce\e9\f6\e3\ea\e0\db\e8\e5\dd\e3\be\9e\cc\d1\94~k[\96\dc\e7\ea\f4\f6\e7\ec\da\c0\e6\d7\df\e6\e7\e9\e8\d6\bd\cf\cd\d4\ef\e9\d0\9e:4\1b|\ed\c6\d0\d7~WJj\88h@Qy^TBBRXe\82\cd\ba\a8\a7\a1\c2\c1UHbQLTWO;)0Pn6GFQ\9d~^neqqhhncNHW_WLLT[RXk\8b\a6\aa\96\80\83\82\83\87\89\84ypokhikh_VFHEETjogpYQ^f\5cV[Pststx{\5cMVZZ^`TBQKA5-,05\1f]{RZlh\a4\cck_S;\0d.r\9ddS`e{\8awqcgzuVM^jxv|\8d\83z\8dvl\7f\95\9a\9c|@[\a3\ca\b4\82QZ\93\99b\83`\86\b38\13\e3\e4\e4\ce\e6\8e\19\a1\ea\e4\dd\da\db\dd\de\dd\db\db\db\db\db\dc\dc\dc\df\df\e0\e1\e1\e2\e3\e3\e5\e5\e5\e5\e5\e5\e5\e5\e7\e7\e7\e7\e7\e7\e7\e7\e6\e7\f5\e2\c6\cd\d9\e3\d8\ed\e7\e2\da\d9\e8\d8\eb\e4\fa\d1\dc\dd\c9\e2\f5\b1\bf\ea\a4\d7\c6\b4\b6\e4\e9\ab\cb\f5\c4\8e~\c9\d5\bd\c4\b5\d4\d8\cd\ae\b4\bb\b3\a9\a1\ad\c4s|nO\94\d4\d8\bb\d1\e2\de\e8\d9\c4\ef\dc\e4\e2\d2\d7\f4\ee\c2\c3\d7\c4\ee\d3\a6\d8\c1YXX\c5\dd\e2\d4\c5^dMFsh9Ri`UPNOd\83\97\a1\99\a2\b2\c7\acA8:Pjmis\80bTA[jLCR5GYZL>9/@JFHUac\83eXddRP`{Q$AdfhXYYJ4/C\5chZdmlhlz\88\96\9e\a0o[\5ca\a4\9fN\8c{\a5\aa\9fu{}jq\95\97\84\8bm\93\91ok{|tmxtu|ke\82\a9\99\8a\a1\c5\b8\8bt\d7\dd\da\d5\d2\ca\cb\d9\c1w\ae\b3\cb\a7\00\00\e3\e8\ee\db\f2\8b%\b5\ec\e6\df\dc\de\e0\e0\e0\dd\dd\dd\dd\dd\dc\dc\dc\e0\e0\e0\e1\e1\e2\e2\e2\e5\e5\e5\e5\e5\e5\e5\e5\e7\e7\e7\e7\e7\e7\e7\e7\e9\e3\e7\f0\dc\d0\de\d4\cd\eb\e1\e3\e7\d4\d9\e5\ec\e7\f2\e2\d0\e0\c2\e5\dd\aa\c4\cf\a0\ec\d4\c2\bb\dd\de\a6\e0\e8\d2w\89\e4\ee\ff\e2\cd\e4\db\eb\f3\f7\ed\fd\ff\cd\a6\ab\8efet\aa\de\b6\cf\e3\f2\e8\ea\d3\b7\de\de\dd\f1\f3\d7\ca\ca\bf\de\d7\db\d4\d5\da\b2~\ad\ea\d0\ea\dc\cc\aa\a1a>_q_IK\86[RTWS[}\9c\9d\bf\a9\af\c9\b2\7fE:7G\5c[POSEgrYTN4[efddjrrmgZf\7ftQTu\84\88\86vaUV]ocWT^n|\83tohec[OEEU\5cUS]fgnC3WwmREhSN}\82Y]nJg}zry\8a\95\8f\8a~o`UPNr[\80tR`x\a0\81b\b9\86\83\84\94\80TaotpgYLw\82\8c\9e\9bm_\89\96\8afYi\5c?~\86`ku}\88Saf\89\91\89u^~\83x}ys|~\85V:k\90\84{Z\a7\bb}6\0f\1dJ\a6\8c\8b\91\87\8c\8ey\8e5[\d2\c3UN8jVI]ur{\93\9a\8e\ae\9d\aa\b8\85O,Ph[S`HAq\88\5cGnc(,JA>;:?IV_7?A5#\1f+;1tc@\92\82Zim^QRX]gq^l}\82vkmwvspprog`rkdeny\81\83vroprne\5c[WJ@HY^VYGB\5c\85\a2\aa\a8\9fX2t\99p[Xp\88\99\94\89\81zqronqtm]Naf\8f\80o{s\81a\85s\84wiSNbvpcr\89\97\a2B-\09+{|QQ=}\99\a5\d7\ed\b9}\a2\8bR4d\a3\a5\84\d9\b0\bd\f1\ff\ff\88\00D\80w\b9\f5\972\0a\e9\e9\e6\e4\e5aG\cf\ed\e7\e0\dd\de\e0\e1\e0\e3\e2\e1\e1\df\de\de\dd\e2\e2\e1\e1\e1\e1\e0\e0\e3\e3\e3\e3\e3\e3\e3\e3\e5\e5\e5\e5\e5\e5\e5\e5\ec\e2\e6\de\e9\f3\d4\c3\bd\cd\e4\dd\df\e5\d6\e1\ee\da\de\d8\e0\c5\d6\d3\90\ae\d6\a1\d3\c1\9b\bb\e8\e6\a0\ce\d2\d3\a4\ba\f8\da\ef\e0\de\cd\d8\d7\c6\b4\d7\e9\e2\ef\d9\a8\c1\b2\8d\86\8a\9c\cc\e0\e5\e5\e1\d8\ec\e0\bf\db\e6\97{}aW`SZ=ht\8d\93WgbP\85\a5\e3\a6m\81bMjC1F;oyUOVOc\8a\96\ad\ae\91\97\a6\a6\a3}r[QVTOQVNrR\88\a9aB-347OUP?:I[c\96\a2\a8\9c\8a\80~\7f\7fkSo\80m`Idovy\82\8d\8b\81q~\88\84ulpy~\93\8eX_rd\8f\be\fa\86ru\bb\c8\bd\bacVA\11k\d4\b5X}qez`5;\1dY_Mw\96`\15%P73K\12\1f\b1\d4\ac\d0\ff\f1\ce\b5\8f\e6\dar\c0\f6a\14\05\e4\e2\d6\e3\ddDL\d6\ea\e6\e0\df\e0\e0\df\dd\dc\dd\dd\de\df\df\e0\e0\e1\e1\e0\e0\e0\e0\df\df\e2\e2\e2\e2\e2\e2\e2\e2\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\e3\b1\9e\d6\d1\e7\f2\d6\cc\e9\e9\f2\d3\d6\d3\d8\cb\95\e2\d8\a1\ac\8d\a4\d9\d6\e7\a0\ad\e7\d0\a8\ea\f2\e1\dd\e1\db\d4\d5\d7\cb\e9\f6\ec\ce\c6\d3\c5\98\a0\96Sk\aa\ea\f1\dc\dd\e2\f2\e4\d9\b0\cd\c6\b4\b6\8ew\90}Wz\94u\90Q\83\ab\ab\ac\aa\be\b8\ca\85Y|X_`YOKIHjHqCi~~\98\a9\a7\a7\ac\b6\8aJLD^@YuZO6FkYiN\12\02\df\dc\d3\e0\cccv]?:DJf[NILTZ]diXS\98\81\5cX]jwxpkpwr\87\89qdntmonlifdddlqvvpha]`inbPJTc6=Lbw\87\95\9en{uu}no\94\8a=RZhR[\86Dg\80\a3\c8\bd\b5\d5\c1\a9\ea\c0xj\8b\d0\ca\bf\b9\d2\ce\bf\afnB+-QeWFE@#k\b9s\1e=q\1c4\1f6\1e.\14,0dIJiT6\1a6?\16\1eVr\8a\9d~\d7\fe\da\e4\dfj\01U1=>T\5c\1f\09\da\d8\d2\dd\bd5d\d6\de\da\d5\d4\d6\d8\d7\d5\d6\d6\d7\d7\d8\d9\d9\da\db\dc\dc\dd\dd\de\de\de\e0\e0\e0\e0\e0\e0\e0\e0\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e9\df\9e\97\df\e4\f2\e1\a3\b1\cd\e1\df\96\e3\c7\af\bf\98\aa\bb\b6\e5\bb\c1\c9\a2\e5\bb\b1\f6\e5\da\ec\cf\c0\de\da\c2\d1\df\d8\d8\d5\e0\e9\d8\d2|`\8bUT\8b`V\90\b1\c5\d6\df\f2\b8\aa\90\a0rj`=E<\87\ac\8dt\8a\8f\9b\c8^a\b0\d1\c2iHeFVZOLM8\19\88n`oU]1R\82pJ\90\b7\a8\aaZ8QP[n[DA;VasZ,:N989?LX][T?)'8O\5c_Y_RU\a2\8eieelrsomptmqvyxy\80\88\89v`X^gighnphZPPTJV`^RKNULVQFVx\81s\98\8c\8azn\90\aa\93\80n\90\8a{\9b\98\d0\b3\87\85\b7\b2\88\8d\a1ygV2\85\b2\9ek9Q\b1Y\18K+6\1d;?5f\bf\e2\ccjC\b1\b9\dd\fdJ\00\cc\b9kC-7\18\166\e7\e9oQ\90\963)%\164(>\c7\ff\9d\22ed\15 !22*:\1a\193\18\16\d5\d3\d0\da\ae.p\d6\d8\d4\d0\cf\d2\d3\d3\d1\d2\d3\d3\d4\d5\d5\d6\d6\d9\d9\da\db\dc\dd\dd\de\e0\e0\e0\e0\e0\e0\e0\e0\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\e1\eb\e2\c0}\9b\ca\de\cc\cc\b3\cb\d4\d2\95\b9\b7\df\cek\96\b4\c6\e2\d0\9a\ba\a9\dd\9f\d1\f3\ea\e2\d7\cd\cf\d7\dc\d8\d0\e5\e0\d8\ba\b2\d2\besse^\1dN\b2tN\80\af\d7\ec\da\cb\8a\88\84d\9cj;L:r\b1\5c7\9c\9c|P\8b\93Th\ab\e2\805TvxgKENH5oi]c)(1\81\ba\b9ao\a4\ac\bc\89~\84whqeKUKF8C\5copQSMGIPTOGP>.3HY[V_`Wb\ab\8afkfeit\7f\81yoi\5c^q|ww\80\8d}jbfotu|sklrsldvslcXLC>M\5cXFOu\91\93\8e\85\82\c0\f6\afZd\8f\8e\8b\96\90\e3\aa\b7\8c\9f\9e\a1\97\98\a6\86O\81s\a7\d4c\89\cd\931\1f\5cvAN\0d3M+@\1a !0\13*W!\00\d0\ce\ce\d7\9f'{\d7\d3\cf\cb\cb\cd\d0\cf\ce\cf\d0\d0\d1\d2\d2\d3\d3\d6\d7\d8\d9\da\dc\dd\dd\df\df\df\df\df\df\df\df\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\e0\dc\df\ea\a7P\a3\e1\d9\ca\af\c1\e3\f1\9ae\96\ff\eb\8b\86\c3\ea\ca\d5\97\cf\b9\b8\9a\ef\df\cc\d7\d4\c9\c7\d8\e6\e1\d4\ca\d6\e7\e7\c6\c9\cf\8feumHO}z\ac\af\d2\e7\ec\db\e5\cf\ee\dax\8e\95\91\8cIG:xz\9d\84\862R{N=N\a6\8eSU2`nL9F>\1f0[hA+\8b\9cK|\c2\a1\8e\9e\90v@O2EC;ONI506905GL[a]X`hR0\22\22-Hgwrg^eai\a7~ZfZl\82\8e\8e\8a\88\89\83zu|\85\85}tgnrla]cllmpv|\81\82\81wk[RPSVWFKMIJc\95\bf\8e\ac\85p\9a\8cp\95\ff\db\92\81x\aaO5\a2\d3\cc\e0\e4\b4\b2\be\b5\bd\b8\b9\c3xJf--Fm@\07\17\1a'.*\1c\1f17.<;\0bK\84)#\97\e4\a4\f7\fc\c6\b9\ff\c0J;$#\1cG~P3V++G\16\1bu\ff\c2:\1dN< -4#%\03\119\14\00\cc\cb\cc\d5\94\22\84\d7\cf\cb\c7\c7\ca\cc\cc\cb\cd\cd\ce\cf\cf\d0\d1\d1\d4\d5\d6\d8\d9\db\dc\dd\de\de\de\de\de\de\de\de\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\ec\da\de\dclg\bc\dd\e4\c8\b9\e7\f7\b5y\d3\ec\a0\a8\ba\de\db\cc\a9\b1\e6\ba\88\ad\e6\d5\d6\ce\c8\b8\c1\df\e4\d9\de\de\d9\c8\e5\dc\cb\d4\95n\82bep\89zr\bb\d5\de\e7\ed\fb\b2\95c>O\a6\a3PIn\7f\84\cb\e0\af\ff\dfiLe\82h\87\80\5cGgL@NVKCEUu\8dY=p\b0\88\7f\92\84fK:96;6fV,/+8:0Md[D67=9;CScg]Q>]d`\97z_fdqyqb^m~qsrsz\80zne_[]caVLYdoof`ciMQUUQNNPGAH`wv_IJ8\91\c1{|\ac\8e\0f4/\17`\a9\8fM\19T]\5c_\a1\e4\a6:'L\8d\c5\b25\1b!bN:\18+t0$EZROE>BDB>\16M^Q\8a\80moohbbhmmjoqstrojflooh]W[`bchqz{skqvviZXgwdY=1X\9a\bd\ba\c0\ca\d7\aabUE\08&\14\1a/\e5\ff\f6\8ed[\19\220\1b.\22\1a-v\eb|p\a6\1f%2)'{\fe\fay68<;4,+/@0*F(\10.\0e]\97\a8\e1\afH1\d2\ff\f2p\1c*>=\1c=\000+)\a6\f5\f8\f3\ff\f8\ff\d0{\c2\ff\f7J\0aB\82b\04\00\c3\cc\ba\d6w#\96\d3\c3\c4\c5\c4\c2\c1\c1\c2\ce\ca\c9\cb\cb\c9\ca\cd\d2\d3\d4\d6\d8\da\dc\dd\da\da\db\dc\dd\de\de\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\e2\d3\e6\ec\d7y\83\d1\ce\cd\b3\d9\e3\9a\86\a3\96\de\ce\be\c5\b8\be\bd\a9\c7\c9\a2\e7\d2\dd\d4\c7\bf\c5\d6\d8\cd\cd\d7\dc\e0\e4\d5\e3\db\d1fPaITUm]n\b3\a0\b7\cd\97LB`\ca\d0\b1\a0\9d\85a<)')00-/7\86\c0\a1bhiRXVOQUH2/;^[\8eV.KX\acL-Nw\5c?ISeIF7RL\17B>!BWaW/BlG8KQ:4GF\5ceX7\11\19EXuij\96\99shh`Z`muslxqkkrx{zagkjfdhnbkqiYNPWmf]Z\5c]ZWED4prc1\0cu\eb\ff\98qsK>6 (5D'e\aas\a7\ff\c5\aeu(27CuV?B+\226;B`\ff\86u\db\c6Ko\ff\fe\86\1c\0a$65,9\1a\22-+\5c\8ay\a9\9e\d4\db\95\a1\eb\f9\e6\bd\8bl^K*\0e\c3\ca\bb\d1r'\99\d2\cc\c7\c2\c1\c6\cc\cf\d0\cb\ca\ca\cd\cf\ce\ce\ce\d2\d3\d4\d6\d8\da\db\dc\da\da\db\db\dc\dd\de\de\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\df\e3\e4\de\de\e2\ad|\c2\e4\d4\bb\ce\c6\a9\ac\9a\af\d8\a8\be\e2\b8\b5\bd\bc\f0\be\a1\d2\c0\d5\c9\af\c3\d7\dc\d8\d6\d7\d9\c0\d4\d1\cd\ec\cf\bf\90s{pqRcj{\b4\f2\f7\a2TIcwv\88\89R\1e\1b%.KC96?E:*$@3>z\84m|[OMTO=8A\1bJ\88zE5[\a4yUC]nXJ[?O^3@b2\1e#/:YwwT#9A32OVA5) $Bi\81\93\a3\8b\85us}yoqqpolga\5cYlhfhllgbfs\82\86}nb\5cuz{o`[dojd\5cUQMKIKF@; \1b\bc\ef\b3uZ\a3\c0o\059D?Y\dc\dbjB?N\8d;\0e\22&7=KNQ\82\b7\96eq@=BG:)/CH^bb=%g\a5JN@LeK@psXZ>2J@7\18:EyvIVLQu^)'@@7g\90\83r\90\93{\81]jv\81}fe\81nnj^UWesvohkw\86\92\97\8e\8b\81ulnz\85vxtgXWfuwtmbVONOF,,??)-e@\13@W<=\e5\eb\f5\ef\a9FE\99b\1d\1b1\1e2ck8.(1=7\1d\04\bf\c4\bd\bd\5c4\a6\cd\c5\c5\c6\c6\c6\c4\c3\c1\c9\cf\d2\cf\ce\d2\d4\d2\d3\d3\d4\d5\d6\d7\d8\d8\d8\d9\d9\da\db\dc\dc\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\dd\e5\dc\de\e0\de\f1\aab\ba\b9\c4\e7\c7\97\9e\8f\dc\bb\7f\d2\e7\ad\cb\b1\c6\ffx\c7\e1\c7\c2\a1\bb\d1\e1\e0\dd\df\df\da\d9\c5\d2\d8\c4\c4\d3\b7\87hSUVo\88\93t\8ejI\5cUIlRO\99^\16AA<+Q]B:S^Qvqk\80\86O$6AJXW>,@cdish=%S\98[kqwrL4)5M-C\8di/1S\c1eMZvxtlUbV]aNe\8aupu\85dMZd\81vJb\91\9d\b6\b7\80\81f\91\c3\a2\84\ab\db\81\92\ab\bd\c1\b2\8a^_djljfb_ym^WY`fhggc\5cX\5chs:FRSOP[grpke`^_aUPFHLa\1b$-\b8\cb\97#\1e\9alS\9c\de\e3\bf\90^6\8d\fb\e9\ff\e7\ad\8f\bfI9~dps9\82\ff\d0O\1a(EX\1b\16UE-\22$j\a65(C`n\8d\81=\1f\17#<;#\19$Ct\95zJ<=4\00Ui?9=Cc\89\8fz6\09-ZVD7&\1b\18\16\11\0c\bb\bd\c0\a5CD\b5\c7\c2\c0\bd\ba\bb\c3\cf\d9\9b\bf\da\d5\c7\c8\cf\d2\d3\d3\d3\d4\d4\d4\d4\d4\d6\d7\d7\d8\d9\da\db\db\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\dc\d7\df\e2\dd\e4\d8\e5\87X\93\ba\f1\d3ag\be\d0\ac\bd\d4\a6\b1\e0\b3\b3\c5\90\dd\af\a8\c1\e8\fc\da\c7\d2\de\d7\d0\d3\d2\db\dc\d1\c6\de\abwseTDU:;Q\a4\b1z75DK[X>_B!=<<0YkQ7>QXY`]\5cl\7f~qoO;CPNJMKN\92_9N<{\81binQT`Gnvpxh_zl\89Ych\8d\af\8f\95\ca\bb\b6\89Z\8c\ce\c4\f4\d9\a7\a3\cc\c4\96\84:d\b1\bf\8c\86\94yjlnnkfa^igfjmld]Zbih_VQQ\5cgpk^UX_\5cUNNSWURTF;8=\125*pvOYE1T*.2@KE9BV)y^M6\1b\1b,j\12.\89\5c\22\ad\e4m&CQ;3'G&\00n\ff\96'W,WJCJol\88\a8nEny\84{eds{\81\a9\91\90\8bt\85|\ad\99\ab\c9\c8\b1\b0\d4\e2\b6\b4\d7\baW(Dx\c7\a7k\96\c1\ca\ed\ff\ff\fa\ea\d2\b1\8bolpog_ap~\93\89}wy}~~~{th_`kttz|q`X^gdUIL[c\5cQH?L\95\a9@MFNJ%#AO]eV/\1c'&\1c7e/=INS87\1dI\ce\c5:xr6a;\181%!?28\1f\19\131;\15\06\14HM23O,\01\14/#\1c'7=7/}NN\b0\caQT\ff\d6\c8\a7`\19\1aDY3\1a\18Fx|kh`\5cRC2& \1f\b9\b9\c2\984L\be\c3\c7\ba\b5\c3\d4\cb\a6\82J\95\dc\e9\d7\cd\ce\cf\d4\d3\d3\d3\d3\d2\d2\d2\d5\d6\d6\d7\d8\d9\da\da\db\db\db\db\db\db\db\db\db\db\db\db\db\db\db\db\d6\d7\d3\e5\cd\d8\d0\cc\89\a5\a2\80Hj\d8\f3\d0\b8\c1\a5\c3\d1\9f\d7\aa\82\bb\c3\9b\e7\d9\c8\cc\d9\dc\d3\d3\dc\d8\c9\d6\c9\c4\d1\ca\e0\b1\b2\96]UM^W{\81PQ\85\acs'3p^UBRY?@TA@FQWW]gYfr\5c67_}cgj\5c9%?i\a3\ad\8du\84\96v(i~qj\82vROq\dd\abey\b7\e5\be\ab\d1\cd\d1\b5\96\b6\b9\b3\c4\b4\bd\c6xH\81\82\a4\dc\ed\d1\aft)\0b)\0f2\9a\8fRlds|r`]n\82\82zqlkhb\5c\5cix~zqjh{}wfTNYfiUDI]f[KK`/p\d8\ff\acQ\15/.\1a*&\1f[#1QjY.\19\1f+8FV\a1[(*@9#\15A9c>AWMiP\11%86|\96@,D9q\9anh{ylK\1a&\1a\16 '%%+4Ck\a1\c9\cd\9fdPGhsVaqQ)S\82\95v8!;-5;7*\1a\0f\0a\c0\ba\ca\8d%l\bd\c6\c3\bc\cc\d1\c1\ab)\16\1d\0e>\b2\c8\ce\d8\d1\cd\ce\ce\cf\d0\d1\d2\d2\d2\d3\d3\d4\d5\d6\d7\d7\d9\d9\d9\d9\d9\d9\d9\d9\da\da\da\da\da\da\da\da\d6\d6\d6\d6\d6\d6\d6\d6\99w\b4_4U\92n\82\9e\c2\d7\d2\c1\b7\b8\ae\9c\c8\ae\d7\de\d7\cf\ce\d1\d6\da\da\d8\d4\d1\dd\be\c0\cd\a4\b1\d9\9es{K5CXwvC.\80n>]\5cg[ha`gPFgQifUSE01,\1aNXazP8Pk\5c5B}\ad\c1\97\9b\a3nq\c1\c2\924fb\a4\c8\bf\e0\b6\ad\d4\84s\d3\d0\8b}\c7fV\a5\dd\e1\c3\9b\af\5c=\93\af\c0\ff\de\96\807%'\17).6,$4+%EPpswxsj`Zjnng]Y\5ca\5cdt\84\8c\83o_\81\8a\88tc\5cVM]WSUZXMCG@>D)*e\801&\1b\1e)0-&B:.%\22%+.\22O\8br0CU\1a;'\16#:5\22 \15DM<1\17\0f.:Zb>!&58TBOrpPQsw\99e9^X.6i_L6*2J^=8>JMM^tT4!%!\1a0T_Va@;I\1e\0c\bd\bc\cd\92.t\bf\c4\c6\c7\ca\c4\c2\c7\91\cb\da\c1\9b\b8\ca\dc\d7\c8\cd\cd\ce\cf\cf\d0\d1\d1\d2\d2\d3\d4\d4\d5\d6\d6\d8\d8\d8\d8\d8\d8\d8\d8\d9\d9\d9\d9\d9\d9\d9\d9\d6\d6\d6\d6\d6\d6\d6\d6\a4b\c0{Q\9a\8ad\ca\bb\c8\e7\dd\b2\a5\ba\b7v\a7\c1\e1\d6\d8\da\ed\da\c7\c5\d1\dd\dc\d7\ca\bc\c4\b3\aa\d1\bfgX\88\93dB@La\94-,RJNZ[Bpu^]R5(d\5c\5cPNMd\b2\9fWNBDa\5cgd`u\9d\a9\96\9e\c2p9c\9e\b1\b8\c2\ec\fd\bb\df\f1\c4\db\d9\83\94\ad\d5\d6\b3\91~\85\b1\af\d7\e1\9ev\ad\f3P#41Fwnn8=\1d\172?9'\18/Q^d\92\a9|`v\83sTGXp\88u]NMRVXlifinnhb}\84~j^_b_NPV`gbSF6?-+,.DGPWT=\1e\11\1d.uY7'-:BC5@IKQ[J($:!4\85\91\88\baOG\8d\c8\8d8.H21'\1a\1d1AEH>+\18\198l\954:'\1e4>44J8)+76\22\0d\98f8*+4RufaWE)\1b/O-+A+.@\15\02\bc\bb\c6\87+w\c0\c4\c5\c5\ba\bb\ca\bf\87\b3\ce\bf\a6\cb\d3\cb\c3\cd\cb\cc\cc\cd\ce\cf\d0\d0\d0\d1\d1\d2\d3\d4\d5\d5\d7\d7\d7\d7\d7\d7\d7\d7\d8\d8\d8\d8\d8\d8\d8\d8\d5\d5\d5\d5\d5\d5\d5\d5\dcy\c1v9\9fcw\d4\bf\c5\e3\e4\c4\b2\bb\a2n\b1\e0\e2\cb\d3\d1\d7\d4\d2\d4\d5\d3\cc\c6\c4\ab\b7\af\b5\c3\a0\8e\a1jQGXR+;[h9CnPGrorgdiWABH\1a(*\1c\12P\fa\cdwo\8d\a0\ae\af\c7\e9\ce\c0\c0\b1\97\88\87\a2\a5\a9dF~\85iAe\ae\c4\c7\e6\c1h\bf\9bk\151\90\94\9b\87s\84\95i/$2;GnI\86\cf]\12G&\1d0B0 D@YD\1e7RNcuywj[]o\82\93\80hZ\5cgqv\81xnknpolaf_LDNX[ceinohYNLW3(4&\22\22;8530(\1d\14>AFIJKNP\80v@!21F\87\ed\ff\ff\e6mG\94\e0\d2\86\93\d6\bfsQQ7) #$\1f\1f$JUQ6\1b\19+<4\1a\1d+(0;530#\13\139{\ae\98\cd\db\bc\bf\d2\9fE$/.\22 -:>04RDHT\22\0a\c7\c6\c5\80/\82\cc\d0\ba\c2\c4\c6\cd\c2\a0\a7\cb\af\a1\d5\d5\c8\c5\cd\ca\ca\cb\cb\cc\cd\ce\ce\cf\cf\d0\d0\d1\d2\d3\d3\d5\d5\d5\d5\d5\d5\d5\d5\d6\d6\d6\d6\d6\d6\d6\d6\d4\d4\d4\d4\d4\d4\d4\d4\d1\9c\bc\9bk\adi\c7\bc\c4\c8\cb\d6\db\c5\a5W\81\d1\e6\d7\d3\dc\d3\e7\d8\ca\ca\d4\d8\cf\c4\be\b7\b6\b0\b5\a5\86\93\7fl]P`_8.e\96U%aaF}SW[V;\1e*QNO\80\8a\a4\b6\a7\e5\ec\80Votfl\87\8a\97\a9\9d\81\84\93\8e^|\8d9\0eB>\0f\ab\afZr\97~\9d\9a\9ds\a5\b7\da\dd\84\8c{P2)\1f0v\beqln^~\97`A'?dP928z\81v>\1bNeQwvhYWbpwxxyvoggpy{zz\7f\83\7fulv~zjbktu^[XVUSPN;?&*5/?MM8\22\1d'-%\1a\1d!1Qq}qao`,\1f>V=S_ebVa\8c\ac\ae\9d\95\ad\af\b0\9d\89\c1\ff\bc\a4\cc\c6\9c\8f\8a\aa\a8\d2\f2\dd\ca\c4\b1\b9\b1\cb\ac\8d\a2\a6\a6\a7\ff\e4\7f.E\b5\aa\90f\a9k0\89\8e_)\18 Ntp``*\13\1e\1fP\91m3='%\1e9G$.6PwrXk\85\81opojegpxv{~xlcacils~\84\81tinyzlceeaGIKMPU[`JH;;9HcS$&#\1d$H\80\ach>\19 BO5\12(&#*5-)8f5\17+MQ4\16\0d<6\13\17$1MXIGM=#&=7340 \192V(!\1a%0!\22B()-7=7&\16D0(Chi<\0c;6#\195TC\177=]NMP\15\00\b4\be\b8r6\8f\c6\c0\c0\c4\c9\be\b1\ba\d3\80c\cb\d3\c5\c5\ce\c0\c3\c6\c6\c7\c8\c9\ca\ca\cb\cb\cb\cc\cd\ce\cf\cf\d0\d1\d1\d1\d1\d1\d1\d1\d1\d2\d2\d2\d2\d2\d2\d2\d2\d3\d3\d3\d3\d3\d3\d3\d3\de\e0D*\0b\16\22OD\11\1920>!)!&7* 5<$\7f\e9\ff\95\11\1dSnN/?TG\1f\b2\b8IJ\81j|\90\87\81yvvrjcph_^ekljxqihntusqzxh]_a]X^c^TKIK[T8016B-J<4AXcXI\0b>kgD=f\96?'&0/7;-4*$-2)%,4$5:\19\1b@N\17%\1f\15*+\14-+(\1f\0c\06!D))B2:Q*\19\ba\b6\8f5\04u\c0\c7\b8\c2\b5\b9\cb\b5\d0\80\8a\c6\be\c1\c7\ce\c0\c1\c4\c4\c5\c6\c7\c8\c8\c9\c9\c9\ca\cb\cc\cd\cd\ce\cf\cf\cf\cf\cf\cf\cf\cf\d0\d0\d0\d0\d0\d0\d0\d0\d2\d2\d2\d2\d2\d2\d2\d2\d3\f7\b4Ws\9b\ff\c5\b1\e5\fb\db\c0\bc\a3zL\ac\aa\a7ebR,]_ZMDPn\89\9d\aa\e1\ba\92\d2\c3YsAEz\c3\d5\ae\b4\91\ba\b3\a8\b5\bb\bd\ba\9a\88\87\7fr\8a\99\7f}\9ee\93\a6w\a1\99y\b0\b0\aa\9a\ab\ce\91\8cYgi&'~\b4r993+815\16\1d.E\17n\f3\82bP8+\18\1f8#-2 \1e5.$;=Y&R\93a6#&Q@=D7.\0cs\aeI2Ub\a4\9a\87\81|{~\81\80~~\81\80ypkoujc[Z]^[Wsyq^U]fhdfcYOLT^bS5JXCb\9a\ae\99sG+.Je\5cO8\1e\0f\14(9QQRD!\112^jF& #!\1f$04\1b\1bDF$\1a&65&(:9&6*\1f%9F@1\16\0fRcM4\1a\0f\17*?MK,\19\1e\1c\15,Q92A'(;\15\06\e4\c7v%/\85\c4\cb\c7\be\c9\c2\ad\b6\a8m\8d\cb\ce\c8\d0\c2\bd\c1\bd\c8\c8\c8\cd\c4\c0\d0\bf\c9\bf\c2\d6\cb\ba\c8\ce\c8\d1\c3\c8\d2\c5\d9\d4\d2\d9\d4\c7\d2\da\c9\c6\d7\d1\dd\d6\ce\e6\df\e9\dd\c0\8bXV\83\a9\1c\0d\17:LSt\a2\9b\9d\83\9a\d5\c8\b4\e1\cc\cb\bf\b7\c4\c3\8cG\92\aa\b2\98nM6'\a8\9a\bb\b0XJ\a1\e2\e9\b4{}x\9a\bce\90\b3\af\9c\9a\8e\95\bf\a4\a9\8aq\81y@\0e(\136vg\19\062\18\8a\a2<\08:L\1c@\18N\bd\af0\005/L*12N\cd\ff\b0-6B/64fy&\1a7*',\1097*&Eg[46)G?$\0d\16),2:$\11!Z877\14\0d+; \22\15\1e;0\17\1c\1c'$2MJJi\83}N?T4\1cFG>74,%,:+\1d\16\19\1b)W\88]Jadmd\1f\00\c9\bfz&0\8a\be\b2\9f\a0\b8\c0\b7\c8\bd\83\90\c8\c4\b7\bc\b6\be\ca\c4\b6\c5\cc\b8\bb\cd\c9\c6\c3\d6\d7\b6\b3\c9\cd\de\e8\d5\cd\de\db\ce\ca\de\d9\e2\e5\da\e1\ec\e6\cd\f4\de\a4\a4\af\9b\96\90CVh#/%>Q7+Lli\5cf\81\7fX94\17TjWl\b0\e9\ffc:@1/s\99\8cwoinwyqhdeir{}xr|}}|xsmi\80yl_XX_d]VNLPSSQV@5>UfQ'\16*==.\22%..1:A>3.1\1dVz](\14$8*>QQ@-&&/C+\0c\1d:HVUf;\1d;5\17\22 2&\1c3BKb3 \124]C\17\17\180\1d\0c;kbGKA1\1d\0c\0c 7:)\1e\1d\19!FpZFYXb_#\0c\b3\be\83+7\9a\c5\a6\bb\bc\d3\d5\c1\c3\a9f\a2\cb\c0\b8\c5\c3\c3\bf\c8\c0\b7\bf\d3\de\de\df\e3\e5\d9\cf\d8\de\da\d8\a7\d2\cc\d3\d6\c8\d4\d0\94\8d~un][qsptj\81}Vx\99~\b3\c5\83\91\c0\a0\bc\d2\c1{?I\8b\c2\a0\a0\aa\8dm\9f\d7\ca\fc\9fXg\96\9c{_\1e}\c0\b1\96\9c\9d\8a\95\c6\af\9d\d3\d8\9c\81\a8\bd\86\87\b0\c5\da\c1\96\b3\b6\ba\cc\b5\90\91Z:\1f)Oe[I9CEFYkY5RFDOUD'\12\0a65\10#fqEZSW;/>=MA\1dJ_OF2>'$\22;WA\1f\1e*\1a\1a' \10\1b8'1 D\93\87MM4+\22#W\7fs\7fx}\82\83\7fysqxpgdhlmlgjnqrqnl~yrke_[Yc]WVY\5cZWR@1>SK;]l\1c\03S;C59A\1e\1d\b7\bf\853D\a8\d8\c0\b5\b5\cb\cd\b9\bc\a3a\bb\db\d3\c7\c1\be\c4\ba\9eTCaN'-GB\9a\9cs\8f\a8\93\88\a8\bd\a4\84\9a\91\86\ce\b3\b9\a4\87\94\b6\a9z\9c\c7\d1\ca\bb\b2\a4t]\98\9b\9d\c2\ae\91\b6\95q\95\df\c5o\82\e7\98\95_p\ca\c1\8c\a3gug=,E`g\183,\1aH\a4\ca\b3\c6\95\8c\8djUUGS\a3r:'\17N\87\b5\a2iJ^ZDK=,:hb\1b\0dJFCB@86FZ\1c/ERTOF>>jybbyj>[:L4?]02\93\5cE\81\9dkR_\9a\ff\ff\ee\9c/\00\19\ac\98kDId`DcsS)'**:D[*#\a7\db\90\86\95\8a\7f}\82\84\7fy|yvuqgXMehmruuts\9c\86j[^lz\81zunkjf^WCA1:UJ.-\19\1a\1b\1b\1f*;H96)$Cx\97\9bB$@\83\7f?7k\9e\8ezphX>(;1-ES69p?R[t{8\0e8g\81]&/D2\1a\5c.\11:eLE/*/\11\156;$\0f=\9c\d4\d5\cb\c1\c7\bb\a1\a5\93VCkshRBD5p\8b\a7\aa\a0\a7\ba\c4\9d\94\96\a2\b0\be\bc\a9\81\8e\c2\b2\b4\ed\b01f\80\9e\c0\c5\89UX\9f\b4\86wnMm\99\9e\86\8e\b3\ce\d2\abr\8fth\81\9f\94^*\07\12){\cc\ab_S\a7\b0\c4\c7\a4\83\9a\cc\e5\c3\cb\fa\fc\c2\94\90g]\99\abT5r\9bRvKCN;2\0aSqdF;-6cIT\5cTE=CNg\a2\9fd?1'*Rc^Vl\81vaLaL:\5cudTDWs\8cs/6\8a\b4i0*GiW\1d\16\84\d9\c7\86X7\1a;(&:FBAJ~ilK5+\06\08gWA6E:CC?`k?\80\b7\cf\c0\9a\90\b0\ba\c9\a3\85\a6\d6\c2\a0\ab\d2\bc\93\90\b5\bd\b3\bd\ad\c0\9c\82\9c\8a|\b9\d4\ba\c8\a6`\81\a5hn\8bus\b5\de\cd\b1\99\9b\90ubx\b3\e6\8e\be\c1\91\83\a3\a3\7fk\7f\e4\e9ni\cf\ec\8b\93\b2\ce\c6\aa\ae\c9\a1\a0|FC5.7:2/:C@77DS[I-/<%\15,3+3\1d\13Y{>'CHOln^a(\86\82%\07$'\12>/5h\88Y%'7u\87M\1f+@=(\15\14,;4+-6-D5,.\11\19\e9\d4\ce\db\d5\b0\8d\81\ba\a9\aa\a4\a1\c9\dc\b7\ca\bf\97\7f}\94\b0\a1\82\8a\91\8b\92\b7\c1\a4\a6\a0\b9\bb\88p\8d\a6\b5\9bu\80\7fo|s|\8a\9f\bb\be\98\83\97\b4\b2\d1\c0\9b\85w\94\a8\f0\c4\97\b6\80G\85\a9\8c\99\aai#h\f3\f8\a3jLH\83\91HdX4\12\16+\1f\00$\12\0e%8/\18\07N\7fnUvzXSD2!78l\b4\7f.IHLdYDQ5T \1baA\19c;!\1d:RST^,188/+8J,RS)\1e@N=\07H;Pn\80\894n\fe\d6k'3\b6\ff\ff\e7\c9x 4fU 7:&\2236('.1/&#Y\a9\97Y[I-`\86usqsy\7f\7fwo\92\8e\8b\8a\87\7fqghjnrsqomnaWZeh]P``bhnnhaSK>0O\98\9cW\180GLIY\80\a3;@XmX*\19'*=ZfL%\16 1%\1e';IICH4\1aB\9b\a9Z\14>prUTN83\1f/'\1f#\17\1b@2B3\22$\1b\17-\15B-\1337 **KN5Bi]+-\19\18/>3%\22\1c\1b<627\1d'`\8c\b9\c2\ae\9e\a9\bc\86\9a\af\b4\ac\a6\aa\b1\be\bf\ae\95\ad\b0\90\a5\ad\92\90\a8\9a\bf\be\92\9b\97\85\8dv\96\97\95\89\9c\aa\a4\b1\a3\7f\99\b0\93\95\97\91\84h\96\a0\83\92\ad\b0\80GOU\93\d4\e3\c4\a7\ab\bd\af\baw\1c8\a1\a5RmK`oF9:\16*?@2>`hU_mTG\5cP7DVy\8cl9*O{KVci`J1 3([.\13FH_CH$\16B\5c]q\9bxQ2$0?>/7<79RlsIB\22&PO=NHRD\1f\0b\17&):\83\98,\12\bf\f3Q\b7\ef\ff\d4i#)K`2\14\1c#\1f/LEBZE\22&).?\224;\1d;rkysnov|}|\8b\88\83\7f{xxwprtsog_Zgghijklmd_[]ekmlY19\81s137 \191A6E]V6\1e\1b/2\1d\15 ,VU(!EF!y\8bsdxjYt%UmYKRF(IQEz\cd\9e.\0c*!,'\0e\1c?Hlm\85uA?F#\ac\80RFU_TBE\1eBO*Ti\102\18\151?1(/#\16 =? \0a\0ago\84\a5\c3\ce\c4\b6\c0\cf\d4\be\97\7f\82\8f\95\98\8a\9f\a4\82b9_\ae\b0\b9\b7\9cw\8b\ca\d3\98\8b\a0\b9\94\97\ae\8f\85\b8\a4x\9a\a0\8b`\a9\b1\ac\bf\ab\b9p`\88\8e{{\91\d2\ca\b0\86^JQj\80r\85n>Dz\8bplVK4_\ea\ebE\123JB:Kk\81\22NOUmQi\dbwwR\1a\102F'6P`T7&&?'\18\1f)#\16\0e\95\9b\a5\b0\b3\ac\9d\91\8a\97\9b\8bts\8e\ab\a4\bb\91jf|\a2\a4\c5\b5\8d\85R`\93\9e\a2\93\89\b3\c9\ca\ac\ab\c3\a6\9d\96\91\a2\b5\c0\a5\89\a9\af\d4\8aRl}V\aa\b4iSEF[.\01\01)Q_[\92\9d\86C\0a\16a\a6}8V\a3\b0\ab\95Y\c1\90`RRJ=6/U3@\b9\ceO\00&KH\1a\16AP8@8-%%-8?:kTdO6O\02)\1f\22@\9d\fe\b5\00F\ae\ff\ff\81t\83<\00*\a8\fd\bdT1699=-\14\1b00HX^[fxt`A%#8:28C0\16\10\1c\13\01\15?I \0f3`gP<=\5c\94\8d\5c:(9=1\19/@T\7fqxtru}\82\81\7fy{\7f\82\83\81~|rtx{{zxvwvtrpnlkqjb_ab`]P781JZ/*\16EIp\85yszjK|]Og\80y`NJ!Csieb<1,%\1c\18%C_((5BSsrJl?:_\82\94u5\1dnR\1d2\1b\04@\16.ACCD8'-\1a\0f6_PLzL9-G~\a0\88\5c3,\22#5@/\13u\9c\b8\9eb;Ea\88\82yrv\8a\a6\ba\97Ua\9a\ba\af\a5\d1\b5\ad\89\b4\bc\b9\bc\b6\a5\af\c5\c9\bb\d6\cf\9a|\9b\8ek\a2\b2bS\94\89\98\a4\a0M\a3\c1\af\94\b1\83o\b1\b6\adaF6Mz\92\83iP4#C~\8dN\02!S\8d\b3\b6\9f\9a\b00 (CC)%848d\b2\cf\94N;K`^B381\1c\10\1b+9=7-%98Hx\96\e0\e46\0b!\1fI\ba\ff\f9\ed\8d\5c\7fu\13\1bM t\d8\ed\8b$\073q\86<1M.\08\1c@'/+#-@;& 84\19\07\061qpN.'0:@EMW]R=8SsF[\ae\bcq2\1d-F5\1f83/EE.+G[Y)87(+3\1e\00\b5\ad\a8\ad\b5\b3\a6\98\95\94\9c\aa\ad\91^3US~\84\8a\b2\a4yS\d5\e3\b8\8f\a4\d1\ff\cb\bb\b9\af\9f\92\90\86\89\da\c6\bb\d9\d2\cb\c2k\86\8c{x:{T3l\a8\ab\c4\abMI$V\a4\e5\f4\c7x<6/ 7\8f\dc\c3xm\b0h\06\19\22\17D\1b!L\86\8d\5c/\22D\a0\e4\9dH\97\ff\ff\a2[&.E?(\1c\1f!%*05:ME@:'\1b2V.1)\1d\226CBHo[8VwdG\bd\cc\b8\87u\84~b\a6\b8\9d\81tA/f:\13\11.FYH\17\17 \8a\ad]l\96X\00Ec9&Qwv@$(3\1d\0f\19\1e\18,1'/DB+VmpVB:!\00Py\9b\90j^\7f\a7\cb\b1\93\89\92\9e\9e\99f\89ph|v_9##>_[\85q3\10j\ce\b4wq\b4\cb\bf\87\97\bf\83Et\b5\be\95R\17JB=2\98vX6+58Cc\5cM@Kx\bb\ed\c4\fa\f2\906$12\13[x\b3\ed\86 TA\22\1b@dY&\00&b\b6\95\14\0d\91\f9d'\129I)\1a.ZC#\0e\12.Uo\98:hfA>\16'\16!>8\1c.;\16;!\19\00\1b\af\eb\82s\a5oT\c6\ff\b7v1+>{\82&\005&87\22 ?^jGGB.\1a$kU.(,2\5c~|sqry\82\87\86\83\8e\8d\8a\85\80zur\8a\87\82}zyz{\7f~|zxutsslebegebSV+-92@1 H\8b\97bPisR50JO2\1f$\1d4B=;DF>\1br\82n\87{=\1f4,6]~s@\12S\8el1;JG\18x\82\0cM\f2\ff\98\b6\fb\f8\84#\0f\0f\1e7B\1c\17x\be\a4PO:\10\00\18(\174\1b\10\94\ff\cd*\1b)O`H4CdxaP]SVi^6\13%ZX2($*GN+\1f\1d\14$0\1eMy;\00\17.K\9eo6\07\07\18\1b\16\15m\fa\ff\a7\aa\f6\e1\8a'\12!m\c1\dc\bb\935#%HaM\17\00g\87\99\7fN:Uzk\82\87^'\1aFy[\18Dnm\98\a7\834&nm&;1>mP(\1ea;0XPC0@B7>/1?';70(%(07\0f\03=\b4\f4\cb\85d\915\16!\15*L@<<13XwV\1bb\b9d\12[W\17>\19\0e\0a\17-:=<-Ip\8c\8amD'\03\aa\ff\ff\b7\ae\ed\a8u\a3s\17\0e-44iC\1f\19:cZ.0E\85\80p\e1\ff\8b]\e4\df\b8\dc\8e\16!=q\8eqGBXk,9Z3\0bx\dd\b8\ac\c1\b3\8d\8b\9at1H0\15$g\92a\0e$\1f#\1f.0!>Wb\e5\d5naWfnor{\85\89\87\82\92\8b\80wtw}\82usqqt{\83\88tuvwxyzz\84{pheb\5cWV4:-7eZ=-!/1\18\1b(\1bV\ab\e8\ca\84VE>W\1d\13LlWOe\1a\0eY\9bf(0E9`lQEVU>2+9@++Y\87\91b?!\07\19:<\1b\17\1d\15\0f9b]N[C\14\13;D*t\e4\e0\b5\d7\c4\8b\98\0fH\af\ff\ff\ff\e9\ed\cah\15\158;!\0cL2\131dQ>f_'\00$q\95o6\1f1g\9f\93J\0f\00\00<`a\80\b5\b1\82h\c6N(c@IhEdN;RI?g~_?;Rp\80\84:@\17\0e.\11\00+8615FN;\1f\03T\84\ca\bdX93\17BloS=DVHe.,\8e\8cUs)>?DSB%$6\1d9<\17A~oAs\93n(\0f@~xI\92\f7\d8\89bJ8ij,\0b %\0bZ^dhdU@18.s\fc\fb\fc\ff\9a\a1\94Z@\83\c2\9bQ0+$\1f\1f$+0N\0b\0d3-,8+\b9\84K:JUD+1\1a\1fKgU3!uy]>7+#/5:5\0e1nfk\5cdouvtrq\8c\8d\84urwtjjs\7f\8a\8f\8c\85\80v{~xlfinrmf`^_beG:99,'6C;I5)u\d9\ce{\ae\8fwlT:A^Ux\9f\93j\5cE\14`\7f\80wrRFk\94vO97>BA.ASL+\11\1b5\0f6A\22\11$/$\1c90!*\1e\199hJ)$#\1bI\9e\f1\ef\d7\d4\d3\d1\e5\e4\af\b3\d1\f0\e9\d7\f7\ff\f0\cb\d9\b1k(\00\18m\96\b8\e5\fc\a84\0b7?KZjy\85\8d5BI[\93\c7\ba\89z<\19>mh;\163fTV]@ES\aeqegPXT\1c,.7GSQ@012/\1c\151B1 \1f\1c\1a *,)A6Z\abi\037i*;LPE956>>)-N=\0a\00&;829, .\18@\5c0\0cL}W/333G\80\d1\ff\e4x\87\d9\b7x\a5\f4\a3^8KM*!93X\7f\84c7\17\0b\13\0a\8b\fc\f8\f7\ff\ff\ff\bdnUheA$\1a&7CB5#\16!@;11\0a\00\1f\95m?+06-\1f\1c&7;&%a\a9\8eK,+\12\06*P|U_M?emb]ckpokfc~\82}qqz{suuusqnlj\80\84\86\81wrty\83}rg^XVVGIF0\1c-FI\80MEu\82T5>,$\1c4w\ab\94\5cGDRrzXBPllH5JOX\7ft_F83,\1e\10NB \05\199)\00\1f:A15PWHi(\00R\ff\ff\80\00\04\0f\82\f0\a6\16-\b4\ba\bf\d0\c9\bc\b3\a1\a3vx\a6\f1\ff\f1\c4\b1\d9\97\98\99\9c~)\1cv\82V3JM69C;3254,$I;\18\02#UR+\0a-:-8Y[@-\1cLK4LSVbEVV-7VC%\1d\1b(=IE<6\0c2P'-D \22\1c!6HE2!2\16\19\ad\fc\a8d8xma\5c[TD7&\17(5&*0\1a0B8*-%%=X^P'\0c @H\12\1b)33'\15\07\85\a0\d3\beS\1cH|\897\060qyQ-\1b\0e\16F{\82P\191\5c\e1\da\a9\a4\9b\f2\ea\9cC\13\0f$8?;5-% !$&XsV6E=&2./4;.=5+\1bAyujehmqpkc]jqqhjv{w\92\8b\80wrtx|svwtnklpedcbeimpqWN>\19!g\a3Q@18Smvs$g\87V\17\16Em*VZ[_+ kSO.5v\99\97\a3z\7f\8b\97\94uC\1dK\5cO'\18*/\1eP\5cYIHURAWMA\82\f7\ff\c7\94\8e\9f\d4\e0\c3\de\fb\da\d6\aa\bd\ac\c5\ef\cd\dd\a4\9a\a7\c9\ce\a6tYo@^\80\9f\83\0c\00\12F:\1c9K3%H2#1O]N8\1c\0d\19;D8FgCsz]s\a7\94M>'Z,+z\5cI\b4\a8u{\b7\94)\00*AE!\03*\97\f9\8c9;S\08\00b\faR(\10'IM>3;\afsu\bc^\07\1f8209L]efJ!\1c]H(k\9d\88S9@MP8\22%Jah]L\00H\b9X\0c\16>2$:1-\5c5(\16\120v\ce\ff\ff\90\1f_\b7\80:SR1\22,%\0e\12+E\e5\b7\81\85\1e\00C798/&%-6.8)!158NBH:8NH24F9Dt\84O&39BLNG?:8E\22\11:mf<%$i\b6\c2\89_\81\c1\89]*\14!9GI\f0\e4VS\e4\ff\8b\00\00\0d/#\12BO\0c55445677\0f\1448(@:\00BZojSDKX\86dMPOEL_+#(NfI?f7/-).\5cyWihku\7f\7fvlr~\80skrz{rrqqsvy{uqkd_XRNZ[\5c\5c\5c[ZYW>LK\1f\1b>H!\00\00#PVE:i[bvkC+,\00=)>\bb\d3\88w\d8\c2o9a\8a\81v\a0}Q63>FI\a6\b6\91E'=;\18,Eai\5cYv\98|\87lYfS7Bu\1f\1b\22\00\22\97\c4u8aPs\a3RV\5c\9a\c3\9fO\1c\22=\00'\87\93\7f`\0f\00Foa@B7%4@67Pv\90\90\86XS<.Lo[)\18F_J7Z\a2\d9\85\fa\ffz1c\9a\e0\93I,$\132L)UMU\7f\b9\e1\e8\df\d1\baZ.VB\19:+\1a\18\19\03\0bn\e5\f9\bcPMR0GP *32*&,4\0d8C<\039lkG5Nr\0d\1b\18#QjM(7I\83\b1\84(\105>\19\07IWJa595378-\15\00;$@v\90\8dV\04.KI7.\22*M7\180C\1e$j\99($';XntqTh7\12>P%\099L;\15%^iG\1f.93&*BZ23.MN!-^P\14,I);N\18\16\1f0DVdmrkD\0f3\94\97N+TH2\19\0d\15.C\00#YlB\09\02\1e%o\83\e2\d4\9a\7fw\7frjdcn|~pap\80\83rcfpt\81\81\82\80|vpl|wsv}\81}w`befd_YUC@e\5c\1f$J<\1d\06\1aKJ\1d\19?A\86\ad\87OD\5cqvqx\8c\83N(,4\86\8bM9>78e_^m\83\90\8f\88\96\a1\8eu\96\d6\df\ba\8caK]dL66\1a//Fvi6&%C}\a6\9f\81iZ\92X6?q\8dgA=HC>f\ab\d3\d3\c4\ae\adxox+\00{u[ZgUu\d0\b7\cf\d4\a5[-1II:C\5cU4-B\0f\0e)i\a3\a2d&(B\af\ff\9e*_\1e:X4\06\12*h\cc\a7d\1e\111F1\10i\19\156/HfM\87M>ee.\13&,W%\196EN\1fRCCa\86\8bg@!\02AY\1dK\a8\9f5_dA!\136v\7fK=(\0dL\88gLh}pM7?R.\1f\05.qkw\cd_(\1bEQ/'DF;+ \1c\1d\1e\1f!$sgQU1T2\10#\1e\0ea\87(L=(\19\19)>Mi1c\e2\ff\ff\b1A\19\1c\22*28;PX[w\9dav\8arLPQ0\00StA:f\99\c6\a6\84[L^\84\a6\b9gKw\df\ff\dd\d4\fb\bcnAe\90\82U9p\8f~U<\16\08):VieA\0d\10E\95\88Z<%!DR\81}X,3d{n-=iT\5cq,\00G6>[X6)7\88\fb\9b\00\0079Q\00G\b1\f4\f1\d0\c6\d2\dd[\00\12/\1d\16.\22\1fFmF\04\1co`[1\05%\8c\e2\ff\87_\82\df\e3y&\1f[0\18$+#.JqQ'\0e\0f 1;.CH.$I_M-$IN`s\5ct79\8b\d3\be\99t=+SY-\04\19@g\92\b0\86kJ3^j(.BZffekrm[P]kZ%\00IF.\1a4bdD\15\5cH\14!2^\ba\f1\f3\e2\acc8DcE\10\085;\0a\00\10]#%\81\ca\b1c/!41\1e2h\87\83L07YK\15\08&v:*OM(@\854ShW0!9ZlWrmAbw2bU\ae\8f;x\9frBu\ab\8aCKdF9|\aa\a1g=K_b[I1\22)C[\9e\89tdSSr\99|\94]\09/\a7\bal\b2\ed\be;\18Vi@j\86\a6\b7\b3\9dxY\83O\227\89\d3\e2\cd\d1\e0\d6\f9\ed\b9\c2\b8\fd\f9{l\b5\9b{\7f\92\93h[\8b\99\85\8dxvy|pft\8d.7<^\8c\84b\5c\80aTs_)(+'094Dho]mkkqy}ytuz~zrnqwkqz\80\7fwmeiklllov|okhhjf\5cTd_\82\90dHMI-;bKFP\18\00\00)/>Jj\85C<\90\fb\ebp1/\19CBADKVah\a0\93\81kSDIWt.R\a9\91JImuZ7\22#1?G5?EHTivv\84h?@_f\80\bd]?CK(\0c\1e9l\83o~\ba\9eL8\84kTS[L#\00EH>;ZrK\09D;38>Ex\c0\d8\bf\92a@40.X$\133A5Hu\a4\86u\84\95\89fKdvwcXWG,\7f~rT/!8X\b3\8f\ab\e8\c2UA\81;8Hw\aa\bc\a5\86>v\b6\b4\81kfOR\94\c6e6\88\a6\9daAPa1\0c(NJ[O\80o,BE[Q=)!-I_dusV:0+#Q\92\b1\8dmx\85~Z`~bQ\be\dfbXkb@>[bMex~\81\a7\d4\cb\a1\d0\b3F8\91\e9\e3g\ac\de\f1\c2\9b[O\d3\b1\98<\12c\b0\b7\b3\ea\a3{\a3\db\e9\e0\dde,\22946[z%%CUTYaiKSl\a3\a5ie\94qkfipvwu\7f\83\85\83}{}\81\82\86\8b\8b\83uf\5cvqljmppoieaab^TKDU_H&*FU\1b.M!\12=Lk\a9\d8\bd\98M\00\0c.dW.0T@7puhTB99@Ejj:\00\07S|oiFF<\0e\16\5c\8aRMCSgA]\98\f1\ff\a73\16Xx\b2\e5\c7],Q\d5\f3\c2\c3\ff\cdA\1d-\22 2IH-\10,\03\00\1c=CNfhDEh\8c\ac\a7|\9b\88on\8f\a2~Hg-\14>lrlq9p\8aY\16\10M\8cVWQHIU]\5c7X]=,h\85@\5cvIk\ad\95idI'&GaeS\87\a7\8ffTQN\81M\00\1be~u*XR\8d\8c\5cg\9b\d7\ff\c8\87lx\c1\e7\bem\a1\e2\e6\93P\80\e2\ddYB\8a\a1\99\85V? XWMn\8b\93}qrk]`pBw\a6\da\ff\d9o-H\5cNLaQ`\ac\eb\df\a1\86\a6\95ea>?HZdT.\0d_MLWM?_\94uTj\a3\b6\9aT\07\09\15\0e\03!WeOQ-\1f;Z[LC?t\a1\9d}f^\5c}hQC=>L\5ce\80{\5c_v[!1N`K+(Jn\90\80dE12BQ\af\cf\94\8f\e9\cf\83\a1\a4v\b6\af\81\b7\b7sV\88\95kA?`\85\80A3Cx\95eNqbM<57qnjfE?0=ahD\22\1a\06\00b\b2xB[t\9fwM2,.5K\1d\16+Yotxskjnu|zpgyxwxz{zy\84}tmnt~\84xpjmv}}yojedd^SJ4>,=tp\5czs?EGRS4J\b4\d9\a2\9f\c3\b1\af\b2\b3\b7\ae\84P8,\1a\1d&4DS^dg4Xri]g|\8axZb\89\bc\f2\d8{Tq\8f\90vYLLTaw\87\80dD1>\a6\ca\bc\ea\ff\a96HcZWbJX\a5v^\85\b7\bc\bd\9fULJKOOA(\14\db\ff\ff\d4\9a\8e\93\90!\08!r\90_S\86g\a3\a8[\1d(FLp\80\91\91}igp\92\98\b2\d5\db\b1tJJ;>Uabq\8aV[F-?`N\1c\16>E\1d\0c+KOIHEG\5c\8d\ce\fc\cc\cf\dd\b9[-U\87\84[\84l*3R{iL'$-!H\9f(>\91\9c\a8\a9O-1Eh\8b\9c\91sZ\97\99\81R/+35!^\8b|S7(\1fA@$!9.)PP65PRAMG.2Z~_s\92aIhj\82Zm^\87\9a\83\b0\dbma\a5\c2uOS.\08#Lo~wdT+Gp\80Y$\1c5G\0d?\bc\ee\d8\b2\8d;Z\7f\8e|S)\11\05G\87\a4\b1\ab}FT\b5\b2p\8d\c6\9323>Uo`=r\e3\d2h`\80|\b5\d1\81LF>5.(!\1d|\8bo,\0b'N\5cV`K]\7fM;\8ez\ca\e3\9dep\82vi\9f\d6\e2\c4\97oYMOq\9a\8fhq\9emPHVN0-D=FD?Mgpfbt|skkcVe|\80S\13\00\14=9\04!:\0e0\98\c2E9b\9c\e7\d1]HV\85~z\b6\c7\84Ks\af\da\a3M(3U\8d}lhnsohW`u\84ya]jq/\126N3\19\1bz\a5\99|\87{G*S=&\1d 0Kc'4B@0-Hj (0\97\e7\f5\ff\fb\b6~gBPk?4 DA=L9/W=oyD\1c%/$ORFKc_Zn\8f\ab\84]Ko\d1\f2\ee\d7\de\87Wup\96pnnsxwogwqnrz~zujpy\80\82~wrwwtoigjnsnife^RHWGx\a9\88^fu\80omAO\8f\9a\ab\8dA#sl#5Kr)T\95Z\1d\1f\197.\22\19\18\1e(/+)5EC>Z\83\0b\15y\da\c4\81^L\17,Ooyc9\18D\8e\b1\9d\aa\d5\c4\854kkQfvZ=8:`p@!Ev\8fPOea{\80D\a3\aa\ac\9cwG\1b\01\83_JNC+1Oc\c0\ac\95\d7\b3G7\85\a4\8bD2VO\1cppiaa`J/cd\8c\ac{9^\be\b3\87nseHMo\c8\d2\cf\adwJ65dF:M[ZdxH45c\a2\ba\9bq`\84\ce\ec\a4C!,%\00^\92{\83c4G>\10\0d=BDwke.;PY\83rkdafmeO;\5cRb\81\80kz\a2\81G\22*-!1Uq~h>:^\82\91FUK04VfZ\be\c9\a7Y#!,*\a9\e3\d0\bb\b1\c5\f8\e2\975\bb\a8RkDaFOlb?S`4L\86\8eYKol>4\5c?\1d9DN\83OD\a3\91z\e0\d7~C:\b4\95Gih~\88\82||\81\84\82~~xtx\82\87\82|gny\83\86\83}xotxtoox\82qkfcaZNE9;CZ\88\ac\99ihUiG\18\09\14]fx\aa\da\8b>Q9:i\c0\d0\7fB)\07Qbz\89\86rVC',:NZVI@Zgy^5@=\058jzeO9 6\8e\d6\bdu_\81\88W\1c\14@n\8d[\1d\06)g\91\9e\88\dc\b4VZl[a\8c\c6\a3*\0dl\aa\98K\86\8e\99\c7\a1J0Z\bb\cc\9avNY\a8\ab\b7\c6\b0c'F\8en\8b\92f'\01\00\01\8b\84{ZV\9b\ade>f\8c\85x\88}If\ff\b5^\90\93\89`&*EcZ4 '*7\1c\1c6\15\18oOe[Iu\b0\91>\09\89\c9\89Pj\8c\87\8a\84\9e\c4\b3}l\84\99ch\94n\1c6\9d||ugYU_iu\7fcLK-\1d>JXcbYZiypliY6\14\0d\1d\1dEKJm\83yt\84|tqtuqlqty\7f\83\86\87\87|~\81\82\80|xu\80}yvuwz|si]Y]bcbNB:9q\dc\d7a\15\12>\8c\a9\80PAg\a3\90QIN>;;\90\b1d\0a\03;j\b6\a1\98tOp\8ci)gR1[hJM\88svQ\1d@V\16\8a]boH1BH\80\bb\a1cZOJnLLS@&9A\19WeP,;jh>QijNAOUJ\8e\a0\96}\9bn\09#\8ckHAYz\90\98\8c\85|\80\89\8f\ac\d8\fa\e2\acxw\aa\df\f7\be\d8\c5\a4\cc\ff\d5f4f\85\96\cd\ff\d6}Tl\8b\84F\1aH\9a\92\8eF\04!]po\fa\ff\ec\ca\c5\ca\a6nchIMx^+1b\a9\828e\aa\a1\86Y\8e\9el?Jjy7L@@\a1\ff\e6my\5c\a1\f7\d9\90qh>L^s\9a\bc\9cU\a9\bdDD\90p@\09\0e T~d)!DV:(S\83a#\14Y\a0\c5\9epgcRFNJ0\12\0c%A\0fQ\b2\f0\e0\a4{v\99@\19g\c8\d1\8fR!&2CT^_\5c\89=\09={`]\a7N@50#\128\1f\13'=;*\1d:\87\d4\ea\e0\d7\d3\cfnGV\82`\13 sxh\5cahY2\0f8TXe\7fpd\86`VC-\1f!.;m~nm\e7\d8>YD\16$Ymtt`{vrtyzvpdgmt{\81\85\87\8a\8b\8e\8f\8d\8a\85\82\88\84|smihhqeXPQRQO?1a\8c^\1f\16!=8E]X3\17\12C\81\c8\ff\f6\842DN!+|\b2\95]BWGKDI\9c\e7\df\b8\90gz\91T\11\14E3658cvO:192*LR\1c\11HL%\10\12>\83K\00\00G\8f\b7\c2\b1J5(-41.1P44XgN9;\a9\ca\b9iaT\0c\14_dmwzqaT\90\bc\e2\c1\89\8b\93r8H\8e\e2\e5\96TF\006Q7Cy{K\a3kYiA\00\00D\8e\8c\b0\d9\baa*+@6y\9fk[kPPq_\a0\ff\d5xR\00\0c\10%]\80wj\86\81~\7f\7fymb]gu\7f\7fuf\5clnpqolgd^]]^bhos{oaXWXVSOBJp\a5\c6\aap_dz\a7\d6\de\b0{\99\ac\ab\bd\d2\97?#>Z\5c6\19\1f*(66MD)DP ?RT+\04\0f''\ca\db\d4\aaqCFjL\14\10\22\15\22Tm) \5c\c6\fb\eb\ca\b7\a1\9d\ca\df\9fZC8$HS>DfmULTD#%b\b2\e4\cd\dc\c9jM[+\1aWp\8f\a0\a3\a2\a5\ab>\07\22\5c\86\dc\ff\b6\d7\9daFMt\ba\f9\dc\a5yc9\0a\10;\8bhLUp{m[\9d{RG_lI\19$\08\05\11&Xwd>\8d\a2R\08\0e2@k( 8&!Fa\aea878QfVHTG+3TW=@DMO;\22\1d)XrtA?\96\98'EM,Q\b8\bb\98\c0\9d#N\9d\a7\97dP\82\8f\bb\ef\f8\ce\9d\86nXNDEdgYr\ab\b7\91\83^\0bhZF\1a\048W.%v\c2\e8\cff\15\19\e1\bd\91J\0b\12\19\00F\14\0b%;`{n\9b\86\ae\cb\8220L=nxPEba>-YgGKTD\bc\c5b9Nam9TnlXPaw!?9C$\09d\b5\ff\db\9ahX]k{mmotwqcWvuuw|\84\8c\91uwyzyuqnhea^]_bdsi\5cWY]^\5cK<\1f\09X\a5\98]JZeG6/\17Fjw^KNK;*Lii[_w\8c\ab{rVV`(\09\8f\ab\c8\c9\b2\9c\96\9a\99T\8e\c2x[rN\00 9-7SF\1cEMF?WxrQ\12XtQP\88\a6\95U\1d\19UmA\1d\22-\96\8eJW`>6-Wneo\9b\bf\c6\91_ZV@k\8efK\1e9\5cHOX-TAAK9\1d-WnYA2%!0DG@m\88gd\84\89\96\d7\dc\f9\ff\af?h\a5vx?`\a9qhrbES\af\ff\e7\90W\c7\d7\9c}J\1a'\00\87\f7\c4_>HK\89X\22\0b\11\1e&++\10\18CXXw\abwR4%\0b\00*jIKH>56BO\8f\c1\c3\aa\9f|Ze$%/EXW@*Y^]B5u\d4\fd\f3\ba\94~hnzmgip{\84\83xnxyz{zwtrkmopokgdnkhggjnqyod`dijicQ?AE;8Gk\9b\ab\85gothg]e\85g\0a%\b3sq\97\d1\d4\9dpijcpeS\80\a2\7f=<\94\cd\93u\9d\ae\e3\c6\93\ac\e5\adY_}x\a7\b9xGTcw2.:\19!JLF$,\8b\c8\f5\eb\c9\ac\8bk\a3\aa\8fa\5cr`2/vmCWns\8e\b8\b5\88wz7\0b]W\0a\0d$<76k\b2][_lvmR:T9.ASNB>Gn\a4\a0T'Q\8e\ac\b9\ba\ad\a6\a2\8dr\19B\a2\b7\d4\f7\c2\b0\9a\af\82W\91\df\e5\c9\bd\a6{\5cbvmQ(\82\e2\c1\5cW~k\93y\83xLc\99\9c\a6\a0\7fXTbL!9`ujo\99\c5\d8z\bc\db\af}z\89\8d\94N]g3W\9e\8dM\87\9c\a7\b3~J[\cd\82?01&!)\01\10Ma52@#H+\11\12(Hj\83\9au~D2yrK\1cBclnuwqvtqomlkkkgejsxvrmmmllkkkgjljfa^^\81yokmmjfW:/?C44GJ.\12$l\b5\c3\ab\e6\d4\ed\e8\9a{\b3\e7\f8\aer\aa\ff\ec\ab\ad\c6\dc\bdrSihFl8@\8c\a8m4+Yj_AFhmU\06m\b5\85\c5\b2\af\b3\8eI\1f\1dEc\7f\97\bd\dd\d1\af\eb\fc\d5i\12\16]\99\91Y#\220.S\9b\d3\ef\e1\c7\c3\b0\a6\c0\e3\97TJW]gy\14o\d4\b5@$;&[S@V\b7\ff\ce]UUi\a6\fd\fb\ba\bb\c2\b8\9f\86\84\8d\85r\7f\7f~~}|{zsmggkke_fghikmnnhnodSJNUiaWRSSPKHA5++276&\228i\93\a3\a8\ad\ce\a2\a6\b2\8f}\83w\c5\c1\94\8b\b9\a4N\1e?h\81oUOTU6\12\1e^zYCOGlgHi\ab\9eWzj\92\d6\cf\8ay\a2\e6\a1J\18\18/AFJ/,,,i\bc\de\cc\c1\aa\a2\9amEH\83iRG:+.>JFM=TV\221MJZ\86\b2\b7\92iUXbpzyk_{\81\82xg]_e\a4\ac\ac\a1\96\8f\84w]\91\8fy\8e\94}vrxmO:=KSw\97\95hQk\8b\94hZOWecL4W{zG'04$d\d2\ebrL\d7\ff\ae~Zj\bc\f4\de\ad\94\e5v;\168n_x\84s\b7\e9\c1\a8\90J\22O\8b\b4\be\ad\8dt\99^\08\00.)+i\a8\c4\a9i}\d6\d3xf\1f(\9e\ec\d1\a8\a8\c9\90F0o\c6\e2\cd\d1\96]c\99\b6\8dQal4\1a>4F\a9\ee\d0\b1\ab\a6\85q|dE:Qhu\93\b8\f3\ec\9c_o\5c\1a\00O\84\91or\9d\9cpUG9\af\f9\f8\ff\dd\9dlGOglbZy{}\80\80\7f}|{vrty{wr\5c_elt|\81\84\8a\88\80sfbgnlcXTTSOJ<:21?K?)\a4\d9\ff\ff\e0\be\bb\c8\c7\a4\bc\ca}7:Mb}C\00\17<:93\1fL\97\892\18DH:CZN+-MQgV+,J7\006<80H\88\cf\f9\f9\c1\81din]GeNPNDn\ae\c3~\ae\b0\a3\9cZ\1d)o[C3++7DFNe]lY\0c\0aKSdz\8c\92\8e\87iS?BYs\80\81y\97\a8\8dZ>PndKGm\94\92h@C~\8c\8d\b4\bc\96\811(7TTDW\7f\88m3\07!d\83x6\16\05%\5csU,2n\8etUJ.\07{\b7\92G_\93\84_\90us\8a\8c\88\b4\f5\ee\5c,>ki,AzE\8a\d5\93NYfv\9c\8dA\191C6\81\d1\c7\82ngb{Bm\96\92^8p\d2\b6\9f\ba\e9\c8wu\b5\a7\bd\ce\db\ec\e5\a7`\00.\8c\ad\89^b\80dh\9b\8fKp\b4\a0\b2cN\83\9b\80lnPM\5cqtx\a6\e0\eb\e9\c1\b3\c1\9a}\a3fxpE!'F] VFE\1d\16ol((8Saaj{qu{\80\82\81~|woe`^ZPHUX^emtz}vrnopmcZzpe`_^YTA3&'051+Lr|l\84\bb\c5\a6z\00\003iaRB\5cPH\7f\bb\9bv\97X\22.|\8fT<]aG&;MMA:<@(82\1b(d\9e\b7\9a\bd\d9\cc\9eyu\81\90z{sZp\9d\a6\94\b8\a7\95\a1r+ *4>BEHD=\1cJ\98\b8\cb\95\16\00\b5\d2\e2\c3\89iv\92^^UA3_yf?(0>/\194<#$\0d\1c/3&\1e+?DP``C&,E/,@bnp\8e\b9\ce\ce\bd\91cSi\85T?BC;g\a9\bf\a4\ac\a2\af\d7\c8t/)9B@I[_VOy\be\d5\e1\a8&\00\93\a4\ac\98qTQZP97d\a5\c2\a9\83\95\97\9f\b1\c7\d9\e1\e3\c3\85\5cdeJ=I\037`\7f\87j}\cc\d1\cb\98G\1f4QVX1-[x^7'B=D`\7f\85mRkJ9Jdnt{\90\bb\87\11\00Qajuw`ASZfputolzupquwrlhhggfffenv\82\8c\8c\82qeuk_YWUOJCCD@/\1f\1e'\02+=-(97!',f\9f\ae\acv\19\00r\91`PH20[q^3@~\96}\7f\a3\bd\aa\7fdgtjeK1D\86\c8\e7\c5\ea\c7fL\88\a6\8b\89mPIU\5cRD5\1b\1a\15\0b6y\90ms\89\99\a1\a2n\1b7B:$&ALCdm\83w\7fa\09\00\8ckWu\b6\e9\f3\e8\9e\a2\af\c2\d0\cd\bb\aaZ8(M\90\b6\a5\84\8b_IO>!2c\17SQ,?p\a8\e3\de\ff\d1U2y\9byWTAr\86]HeL;HdpeU[J0:l\7fbJ+%8d\85\84ul]er}\83\82}y}wpprrkeghjmprtuouwpe`fnsi]VTRLFA;1**,*%M9\22\16\10\16+B\1f\7f\d4\c2\a0\c9\caw\9b\8am\86\af\81?@Ki\82~jael<0(8Ya6\00\0f*\1e\06:\9c\ba\95\8d\9e\9atI,\13\00#%)030&\1f5 $ \0e-an\8b\8d\a0{6PG\5cT\13\18\b1\9c\8e\9e\c0\d5\cf\c0\e2\c5\9e\81uuwxq\93\ac\9d|x\9f\cb\b6\c3\ad`\0e\07U\a8ct\90\a8\aa\8d_<\93\82uy\80sN-`SM[onS7^HPs~v\90\bf\b2\99_4U\a7\d3\ce\c6\da\df\bc}I8=$)6R{\ae\dc\f7\d6\a4gFBF=0\133d\94\b1\b4\a6\98\17F\88\a4\82`\85\c8\ff\c2xZgxo\5c\8aKw\e6\ca>,\91\c3t\1a\00)^m_\19]\a0\a6\80o\93\c2\e5\d9\ca\c0\b6\a6\90~1_zz\8f\b3\a8|Jn\99\b5\c8\d6\d9\d3~oO(\185v\ac\c9\c3\c1\c3\bc\9bg=\8dtWKQZ\5cYC,9TSH1\0e.8HYejkj^l{\82}vrrztpsz~ytkovz|zvs\87\82ypjhhhic]]``ZTTIp\ba\f1\b7E--169961-K\8a\98s\83\c3\c5\8cQ\1f\1bIM$-b\88d`zj/\16'Z\a8\eb\de\9aw\9d\d5:4\15\07I\ae\d1\b5\8f\bb\e0\b7L\1d\82\ff\e8\9b\5cTS?9F&\13\11#'\1d!3E)\1e/;2'(;[wrQ4/85p}\a0\cf\ea\e4\cf\c0\c5\c4\b3\8a]DIX\94\87xw\8b\b3\df\fb\ce\97X:=<&\0d\91\9a\b1\d0\e5\e0\c3\a8UKNS?'9blN10GXTG\1c*FT:\1e7i_fdcx\8f\84e\c0\ad\95\89\8e\9d\ac\b5\d1\db\d5\aey\5ccx\8a\85\85\89\85\81\8a\9be=P\af\f4\dc\9ap\bc\818\10\19;XfvS+\1d,FV[7q\a2\92]Jt\aaQ4-<;,&'6?N]gkjigr}~uica\82|x{\81\84\80zahr|\82\84\83\81yyywsmgca[UUXWQKFRx\96\c0\c5\87gcU?(\18\11\10\12#R\88\a3\a6\9f\93\880LUFAH8\19Ha}xPG?&&@tx}~zqf_lv\80\81xnjj\8c\86\81\83\89\8b\86\80uz\81\86\85\80xsr\81\96\a4\a2\92{knhaacb\5cUD\13(Y{}]W?.\17\06\06\16-=A3T\8c\88Y`\96\9d_0'\15\00\11BWc^MZ\8d\bf\d6\ae\9b\8e\95\a5\a1\82d+E\81\c1\d5\be\a8\a4{\8e\91yfitxq\88\a2\94S\11\0a'\9b\a8\af\ad\ab\9cn>:751*/Hb|jRC@?=9\22$'(%\1d\12\0a\bc\99e:#\1f%*\086[J\1e\15E{\c8\c6\adu<+Io5#\17(H[RAnlcQ?:DP4Z\81\86jG41\1b*9;7=QeA\220o\8dd-\15\a2\a1\ab\ae\92r}\a0\98\9b\9c\95\84mWK\c4\d0\dd\e1\d3\b5\93|\a7\b0\ae\94x~\a8\d1\9b\a8\a8\90x\82\b4\e4|D\1e+CLYm\16:i\86\84mRC@#)Vk_i\8a\81lVMQn\a8\dd\e9\dd\ce\c0\a6t1\00K!\13R\b1\d7\a7dG\9d\ff\ff\b8\5cc\a1\d5V\1aq\d4\cb~Hr~\81lK9?M\e2\b6\7fck\86\9b\a5\90\a0\9es6\15!:FD \01\0d&@\5chmtxwphbkv\82\87\84\82\84\88|vqrwysmjr\7f\89\8e\8b\85\80iiiijklmsleded]VM-o\a5\83N@bTNHKZs\8e\a0\a9H*\85\d9\d4\b2\ac\84?2ca+6y`n[=\5c\a8\c7\b5\90q[i\8b\95xU\80@9\8c\cb\aflGOoyju\9d\ab\9bZw\8f\82^U\7f\b3\a4\ac\9bzu\8e\9c\93M$\152I?35@<89;91)(+2:<0\1a\09JHB937BLmhb`chmpc9\10\102PTI45646@Sab\82\a5\ad\97zjf\88\87wT2.KiNNWjztY@\0f\12@\80\8aY68\15c\b0\cc\ce\ce\c1\ac)Em\8d\a1\b2\c3\cfb~\ab\d3\e8\e8\da\cd\5ck\7f\90\a1\b8\d5\ea\af\a9\99\7faH;6\18\0b\14080@_QQK?69HW,5\18\008\93\91L7hY$T\d7\ff\e4\d1\b3\94\8a\8ayO*L<08Pekh~\ab\b9\8d`UUO\9f\99\8f\80iQB>\1b)1(\1a\1e:U\d0\b4\93\84\86\87~r\81\81\84\89\87x`Lxc\89\eb\ff\c7oSZajqtpjfnw\82\85\83\84\89\8f\82{uvz{unis\81\8e\92\8e\85\7fvqjegnw~UNGDEC;4:AskCFIIyxvsokhflz\98\b0\a2xZUTYK/$+)\1b\1de\84ZBm\a3\b7\af\99\80tqiVDH0/<&\0f=\8bX\93\b5\9f\84{gG\8c\8f\7f[AJk\86\90OC\82\a4\89{\92\c0\ads.\18.:/(3@B9-$!;/&'/0&\1b,:GHABRa7:=?CLZe\83paj\84\98\97\8e\90\b4\d1\bf\85O77\a1\bf\da\d6\ba\a5\a8\b5\87\8c\8ax[@1-oB\12\06\1f?KI8n\91\8f\9c\c2\cf\bd@z\9e\9b\ab\d4\df\c9_pv^;2Np\96\96\94\91\8c\86\80}\85cJa\a0\dd\fa\feVB@j\a3\b9\9ct3@^mK\1a\176\a4~H\1d\0f\19.=\84a1#HjO\19\00\00/\87\c4\ce\cc\d4\e7\a6nv\a6\b3\81F\ad\80QKw\b8\ed\ff\bd\cf\b7\7fp}]\1e\1dS|qO=97Z6\13\113]x\82EQk\8a\98\81N#>\1c\1cd\c0\d1\83**i\bd\e8\f1\ec\aaE]cmtvslhsy~{usw}\85~ww{ztmq{\88\91\91\87ypcjsz{umgjc[XXUME>6:$8tnORSRMC3$\1b^\b9\f1\bea8JefJ774.=V,N_QLg\8b\9e\a6\9e\8f~pjlpU,\1cBq~qfJ{\9c\87\5cHLTborn\81\a8\bf\bf~G:j\88~\89\ae\bc\d6\d4\9bK\1d\1f1.%\19\14$P\87\af\db\b0vL8-\1e\11R[\5cL;A`~\87\ae\d7\df\c2\9d\87\81\e1\e2\d6\b2}J*\1dPt\94\91s`k\7f\90\8fxC\0c\00\1eD&! *9A=6cL.\1d!4IV\90\a4\a0\8a\94\b3\ab\85\92\83mdy\9f\ba\c2\dc\f5\f2\afQ\1e1ZVQJFFJQV!N\94\d2\ea\d2\9eviI.8f\9a\b9\c3\b2\b7\c5\bd\804\1b,TIFXlfC!iPy\d5\ed\ae\81\89\c2\94\b2\fe\dfjK\88\f5\b4sj\90\ad\a1\86\c1{,\0d!;;-\17b\96p\1f\00\1bI\1a\1b3W`K>DD,\17\1b3EC9\1a\11\0e\1d3;/ (3?@5'\1f\1c\11\02g\ce\aaiVE7AQalqrqqvyvqpw~ungfihaZ\5ci}\8d\94\8f\84|rrrqpoon`YPMLI@9++>HewcmRQOQV^flYP<:`\84rE'\0fS\d7\ff\ca\c2\fa\9fmDBOWew\aa\96zbUOLJO\85\af\a7\8f\84\81{O+\11\19*,'']x\82y\87\a8\b1\a1\90_,0p\b7\ce\c3\ac\82q\85\87eIHXA(%Bo\99\b1\a2}P865(\19KQM>9X\98\cc\c2\86H;WgS57,9p\b2\cb\ac\82_\7f\a6\bc\c2\ca\de\f0\90\a2\a8\91t{\ab\dbpI\1f\172VkpOQG-\17!Io\8c^\5c\98\c1\aa\80nTHl\b9\e0\c3\9a\8c/r\a6\899\0c)\5c\0f\1d3J[cdcVz\88^# f\b1\9c\cc\f9\f4\c5\9b\94\a0t{\9a\bb\b5\9a\9d\b9\96^\22\13,C<)HWaZSd\8c\af\ba\ff\f9\846Nogs\96\c3\d8\c8\9bkLz\9a\b9\ba\a6\a1\b7\d2\c8q>f\a3\bc\ce\e6\beN\15Gj@\19\1fj\93\bf\c8\a9}^Q\ba\be\cc\e5\f6\ec\c9\aa\be\96h[y\ae\dd\f6\d5\81od3\c5\cd\a3YA`jRNXv\88f:J}Xwz\5cTp~rr=$X\ad\dd\db\c9\af\ad\ab\b7\cd\c0t#dE+7a\8a\99\97\a7\8fvkgS+\0978>HWjz\84\f6\ac\5cBWbF!%.RxpKG_k@%G\94\d0\d9\c9/Dh\90\b3\cd\dc\e3ECBEO]lumVBHi\8e\a6\ae\eb\bd\94\97\af\a7p73@I>(\1a\1f+(U\8f\b2\b0\95weIW6\22=AAfbQCGUXI8`lpifdUBO\86\c5\dc\c8\ab\9e\a0\8bTH\81\b0\a2\7foOJ1(e\c7\f8\f2\c5\c2\9bK\0b#\8e\f3`h\91\b8\a1i_\7f~\a0\c3\cb\bf\ba\ca\de\95]Db}~\8e\af\d2\a8|q~\7feH\88|\9a\cd\c7\87[\5cjNi\c6\ff\e7\9dm8`\93\af\a8\8bn]\86>XG.\85\be\bb\a0\82hm\86\91\80iu{\85\8d\92\91\8f\8cy\81\89\8a\81qbYmw\83\86\81|{|rlb[[bkrnf\5cWTOE=1\8f\d3\e1\eb\e3\a8h/]\94\b6\c2\cb\d9\e4]UXO\22\05=\94\e4\ca\b2\b5\c6\c8\b1\97\e3{Y\9e\b1_ %JmvYDA.\0e\aa\e6\f0\a9h\5c\5cM[blspbM>TY^^\5c[]`\7fYF\80\c8\c4\ae\c0\8e\92\b4\c0\b2\ba\a2X5\5c_@L\8d\b5\af\97\a5\92ve<\16\16.3>\1f\00\07@x\ac\d1\f8\f5\c6\9e\a6\c7\e8\e2\d8\c9\b1\8deK\07[\b3\d1\ba\9c\8e\8c\10$Q\85\9a\85\5cAZUi\a0\d0\c0r'\06y\ca\acne\7f\90\c9\bf\a1tONq\94Nb\5cIc\9c\ad\96l\89\9b\83YNp\9a\93\8e\b5\f5\f9\b2hI\94\ab\90TNnU\121h\aa\c9\bb\98|q7$1 \1c\22\18@tlaYWUROinu{~}zw\85scdrztiu{\82\80yssv\89\83zqlloqwne`^YPG0W\a4\c6\c0\d5\c4sJI.\1bD\8a\96s\a8dAm\a8\bd\bf\c6\b2\a6\9b\9a\9f\9e\93\87H\12\00H\b8\f7\eb\c9u\85sA.G][\cf\db\c2\90\81\93\88dC:2130%\1a:l\98\92ma\83\ae\c2\a4sm\8d\88symp\99\b8\b7\bc\a9sD`\ab\b9\87R(C\97\95\a6\b4\ad\97\85\84\8a\c1\a2\9e\b4\ab\8c\99\c6\cc\d6\c9\93S>_\89\98\7fJ.[\99\89Jrm\8b\b2\98L$-#PoP\10\00\0a5y\a5\a9sMU\5cODD?3/Bi\89}S\1b!\8b\ff\ff\d9\b9\bb\b1\92n\5ccr\abm;Qek{\8cqv\86\82\84\8a\80/*9J7&R\99\b7\c7\b9\a4\93_$\15U_p\81\90\99\9d\9e;HPMMf\96\be\ce\c8\d2\d7\aemTb,StjC0Ed\c1\a6zQ82:BTOGABHPV\87~wxu]4\13Zx\99\a8\a9\b0\c7\dd\a3\9f\99\96\98\9d\a3\a8[Y\5cjvudS{\a9\bb\cf\ed\c5\83w\a9\b4\c4\d2\dc\e3\ea\ee\e7\87HRQ;\5c\a2~\a3\afx&\086s\91\ce\e1\9bKG\81\b7u\83\a4\b6\99i_u\99\9b\95\85~\97\ca\f5\e0\bb\b0\c0\aakEH-.1:Os\9d\b9i}\b2\dd\c4\8b\86\ac\9e~[PWXG3mYC9Bg\a5\d9\e1\bf\bd\d2\b9\82\80\ab\96qLHg\8d\a1\a6\dd\f2\ff\db\af\b5\ae\8dvrmjlry}ttttspnm\81\80{sia\5c[]jx}yqllstttqlhdh`XTTPG@C=':R\1f\04;z\83u\5cg\8c\93}\af\c7\c8\92G;\89\e2\c3\d1\d2\b2\81bbp\a4\df\d1m5MS/n\a4\c1\aa\98\ab\c0\c2\0eK\81}O&\15\12]grwrkfe\96\95\8e\80odcf}uJ*19In\96rcjaS\5cndOQ^K.G~\a1\ad\9d\8c\84V\1d\0c\af\b3\b9\b8\ae\9d\8a~Ox\a1\a3\86ln{v\85\b0\d0\b0e87\22/BUp\97\c4\e4\b9\a4\82\5c=) \1dKC9/+-26`M94:8)\19J]h^Re\98\c7\a2\b4\d1\ef\f9\e5\bd\9ew[9)0AMR\5c\94\96oI\09\00\076r\af\b7\92ty\8evH9D)\15e\dd\b8\d4\f2\f2\ca\89H\22QBF[[EAPHirWLk\91\a2\89lc\90\d8\fe\ea\c6\d3\a0i:\0a\0aj\dd\d0\a5lFIo\a0\c0\92\aa\dd\f8\c7~v\a0\bd\a7\88oaUH=?_kJ\1f\1a=`\c9\dc\c0\7fbb6\00\a7[\16\1ea\92\87c\1e\82o+Jx\5c'_adegmv~}|zwvvvvyqcWS[itUj\86\98\9c\96\90\8dyzzzwrnkpia^^[SL\1b<$?\8fi3m/\1d&GQBHc\e0\9e^c\a1\c8\a8ps\86\90|XEOaM~\9a}P@HP\14u\cb\d6\bf\b1\a1\8cy\82\80`.\18:i\94\80w\8c\a5\99b-;h\96\9a{_`mUG29E7G\84oks\87\82]IVwg[\5c][`k\80\94\94\95\99j$\07\88\99\b1\c7\d1\ce\c3\bb\b4\d2\ed\eb\d1\bd\c0\cc\ce\a3xV'\03\16DTMOb}\8b\84w\b1\93d:%&6D\1e#.B]|\98\a8\df\aeoE;BHJ\09!9?>Ov\98\c9\dd\e9\d6\a8}faWgmV4)@\5c\a2\99ox\ba\bf\91\85}\9e\c7\da\c2\88F\1b2#2RN;Z\98\ff\e0\84-\00\03*M\8ecLSE1O\8a\8a\9b~<(Ojb0Igx|\80\8a\95\a1\cf\e1\c5\b7\c3\b6\94w[>4\5cjjy]XfW?@ABCDEg}qw\89\81\1f\09\9c\a6\95w\82\b4\d5\d4\c9\bf\9fmGP\83\b4\88x_H:8>CP[J\1f\0f%98X^y\8dk2$=|gE4BL,\00\1b:b|\82|xw\b1\b7\b9\ad\8fe=%?8Q}\81V53$a\aa\ce\c4\aa\9c\9aW\8a\be\c7\ab\93\98\a9\88\8c\9a\ab\af\95d>\a6\84fm\93\b8\c3\bf\de\df\e5\e8\d8\a8e2;Rv\8c~Y=3--7EF:23?\12\00&\83\c7\cc\b5\91\b8\e3\ee\dd\cb\cd\d7\e4\cc\c1\bc\99r\80\af\d1\cb\9f\96\c9\c8{AjuhE3D]g>5$\13\17>|\ab\a7\ae\b5\b7\ae\9c\88z\93\97\99\93\89\84\86\8b\83\aa\a8{YOIFhb_epwtopsx|\7f\80\80\80sx\80\84\81wkcfghiklmn\8b\8d\8e\8c\86|smeffd^WOJUC0+151+:7/\22\19\1c+9k@%2Kb\83\a6\92\80dH:@SdITULQfoj&Y\97\a7xFLr\b3\d4\c3\bb\ed\fa\cd\b1\c9\828(MldLA@><;$&+18>BEPOMJFCA@(P\9b\ab\97\a9\ba\c6\e6\ab\a6\9b\88oUA5QC;EUT<#+1>KW]^]lkieb_\5c[rpnjfc`_LYMP_g\1d\0f\ac\cc\d4\b5\96{G\0fLW|\ba\e9\df\9fb[P?2/8EODKHKl\90\87cT_pva?(\2273.5IP0\07W#\00\008u\8f\8er\91\a5\8f\5c63AG#\0e\11\10\18K\8a\aa\97\90\aa\d1\dd\c2\a1kC 'K_N3h|\96\a5\a8\aa\b1\b9\99\84njy\8f\9d\a2\229T^R9!\144$&75%,E)6f\9d\a4ySJ\09G\8f\af\9f\7fonw1\00\15e\93wDo\8d\97p7\17\19%/.\1d2fi[oH<_\99\8fD\1a'3+3SvwR,/B`}\8f\93\8e\89\89zljj^C+L<-2>9/.9F[q\81\87\83\7f}}~\80\83\85\87\89wvvvwz}~rstvwyzzghjkllkjhhigaZRM2\1e 50\17\1d<#-8=;89;#!8]gXVe`\87\aa\a0l6\1c\18fN64CI6\1diX;N\b6\ff\fa\9eEbLG\8b\b8\af\ac\a2\a3\90a50Y\84Z0\04\00\0e&+$1'\1c\1c'9GN^^]\5c[ZYY````____gkYST]\1b\0e\b2\c9\c7\a6\94\93|WYYi\8e\b3\b6\95rym[LHO\5ce\5caZWr\91\84])p\ad\a3mIQhMjvij{u]6^~nC1Msv\9a\b0\94Y5?Z\b7\a0\92\8bpZz\b2\b4\95\82\99\c2\cb\a5x>Pfpl`UP\e0\c6\a5\91\8d\91\91\8fe\5cTW^\5cOB]6\1a2h\83lI\07\15!5Xb+\00\116Wo\9f\df\ff\ff\e3\946\07\0c\1c\17\07\0fQ\92\9a{w\a7\de\ff\e4\89\1e\00(;$\03\22'9ntK7GF;1?`vz'$'2@E?6\8f\89\80wrqrtr\84\9a\a5\9c\85k[0>?40-'#CObv\87\95\9f\a4\a0\a4\a8\a9\a3\98\8c\84wvvvwz}~{{|~\7f\81\82\83uttuvy{|ijjhc[TOfkaI851)6'\1d&56\22\0c[\80\b0\b6w*\13(O\89\c8\d8\b2|YNZre5%80\0d0&Y\b9\da\a6slq~VC|\9a~l\a9\96\87\92\b5\dd\f6\ff\e9\da\cf\d4\e2\e3\d2\bfz\83\95\a6\aa\97sXcba_][ZYTTSRQQPPGH<:8J\18\0d\9a\96p:1Uok=d\85zR[c\5ceqa+\0b:\86\e1\ff\ff\ac/\00\1eb\ac\a6\a2\a7\b1\b5\b0\a9\bb\bc\c7\bd}/\1b4\84\7f\82\94\b2\cd\de\e3TWi\8d\ab\a6\7fZ9U\85\b0\bb\94P\1b\00&OZMESfu\80\86{g\5cbmoeHAz\b3\90?V\88\a3\9b\ab\d2\cf\a9\e1\a4jn\aa\e7\ff\fc\ff\f7\e6\d5\ce\d8\ee\ff\c9\a9\81owy_=k\94\82M8.4UN2\1e&:Mez?, .Ogiaiv\88\96\99\90\82xh\82\a5\b7\af\91oZ9E2&-\1b\1cKrsropy\88\95\a2\a7\ae\af\a8\99\88}}\84\8d\94\94\8c\82{\7f\80\81\82\84\85\87\87\8b\87\81|yyz|kllje]UP\8c\c7\d8\97I($ [cjidepz\d2\c2\c6\da\cb\8cK+\0f7g}wieiSiV1J\8e\99m\0f!a\ac\b5x:#/aYDcsgm3M|\b3\db\e3\d1\bd\b5\c0\ce\d4\ce\c0\b2\a8\ab\9c\8c\86\87\81qalje`ZTPNOMIC=84121-.'=\12\07\97\92g+\1c:OHk\ac\e0\c3n4>bG?507I]k\db\ea\de\bb\b3\d2\eb\ed\ff\df\8cFCb\5c7(H/\00 \84\95Z]HGu\b8\da\c6\a5\97\b8\cd\b7\8by\96\bb\d9\da\e1\cc\7f,\1d=y\87\a3\c0\c7\a6j:5&:\87\d7\d6| \1f9Vc_[aj\80iW_rqT6CLWais\81\8b\ff\ec\da\e1\f8\f2\ba}\f3\ed\db\c6\c3\d2\e0\e4\a8\a8\ae\be\ca\c4\ac\96\8d\8a}iax\a8\d1\a0\88vlQ.$1Q\86\98\80W2]\c1\dc\82CD9\14\1cL,E]aXZo\85S^o|\81|sk~\86\97\aa\af\97jFP9(.2 !>RX\5cZUV`jY_jt|\7f~}sx\80\84\81wkcopqrtuvw\88\83|vtvy|lmmkf^VRUu\b5\cf\85\1e\17Sq\83\8arOGe\88\91U9h\a1\9fmCDHJHEEJN?ILZ\92\d3\de\c3L=;g\a9\aeQ\00\1f(\0d&\90\be\87T[l\84\98\a5\ad\b4\b9\92\a4\ae\9e\81y\8d\a7\92|c\5cdje[\5c]_begijda]WPKFDCA@@0B\18\09\a4\b8\b2\93\87\92\88l\ab\cb\da\b1f0-@]XTXh\81\9b\ac\a0\cc\e4\d4\c8\da\ec\ed\ba\f2\fb\b5so\87\91~\81zmt\83~j\9e\c7\f3\fe\ea\d3\cc\d1\cc\ba\aa\aa\b6\be\b8\af\ec\dc\c9\a5a3U\99\e5\ba\9e\b8\e2\d5\831O<0Bk\8d\97\94\b2\c7\c5\92J*Dl:@C>8=PaLYee[SUZfTq\b7\da\c3\ac\b0\d1\c0\ce\ef\df\a3\7f\83\91gCLr\83jG)P}\8e\83w{\86\a7\be\bf\8dA\15#D)\1d\1a:G\22?\a6\db\afuOFLNJubSWkxti\88\80tkhltzmz\89\8d\7fbB.<#-/(T`\1f\182Tmx}\83\89|ytolkkl\83\80{upmkk{|}~\80\81\82\83\80}yx{\83\8b\91mnnlf_WRF[Y>7LZSJ1\1a\1d8UbclM74*\18\1b0D;13>JQRc\96\d5\f1\e7\db\ef\ff\ff_\00\16o\86~\84-Z]j\ac\c2\98}pTLz\be\da\ba\8cFi\81nB1Mr{`EAReliaa``__^^WVTRPNLKKIMP=O'\16\0e&:6\22\16!1q\80\94\9a\8af< )\22\1b :f\97\b7\d4\c1\b0\b3\c6\d6\d8\d3\ba\c9\b5{U^syH[pvngip\94\a1\b2\b6\a4\7fV;_{\a3\c5\d5\d6\d0\cb\da\d9\cd\b2\97\91\a3\b7mz\8a\93\8bsXEg\89\ad\b6\a3\8d\86\89\83\86\88\85{k[Pg\7f\90\83eT_r)!)8.\1a(J\15\190]\92\b6\c0\bb\bc\b1\90Z*\1d8W\83]r\c1\d7\8fD,1f\9d\aa\96\8e\a7\c7\cf\c2\ac\8fpS<0;840--./\0d\13\1e(./-+ghkorvyz}\81\87\89\87\7fvp\8b\82tdWNIHF1\1b\1c;o\a1\bf\7fn][k\7f\8d\92\8aykq\84\8d\85wgjou{\81\86\88\85\84\82\80~}{zonnmlkjjic^^_YLAM\83\a3\84R@O`}\8e\9a\91|nt\80wma^j\83\9f\b1\80xgRFMey\a0\a6\ae\b2\b4\b5\b8\ba\d8\bf\8dV@i\c0\ff\b4\94qeowqfOKTr\96\a5\98\84\08&^\80dDm\b8\a7\96nEB^pnfcaekjaYSPLIGHKLHMUM]X\1f\07BVv\93\9c\8bjPqdP=1059Iv\a0\9d{h{\99m\96\c3\d1\c1\b3\b9\c7\c8\d7\c1\81M?:.y];-<]~\91\9f\a4\a8\a9\a2\94\86|\7f\92\af\c9\d6\d3\c6\bb]\81\aa\b6\9fy[N1W\8d\b6\bc\9dnL^h\83\ad\cf\cd\a9\86\ab\b5\bf\b9\9bj7\16<<>CIOTVZ>,*$(U\8d\d4\8a7\1eBu\8f\92\1eS\92\b0\a1|\5cMYy\a2\bb\b4\84:\00\19-?DKm\a8\d9\90\92\97\9d\a4\ab\af\b2\b8\ad\9b\86rbYT]cmw|}{yfjpy\82\8a\91\94\99\91\85yrprttm`SHB??.B`}\91\9b\9f\9f~siirz|z}rlv\85\87wd\91\8f\8b\85\7fzvtyyxxwwwvsrrrqpppic]\5c]VI=\83\a9\e2\ff\e0\9doeowypdh~\93|eE.+=Ym16E`{\86}q\e1\d5\b4\83_d\8f\b9\86\b0\ce\ba\85hz\9aiiga]_hqP=.7Skro_?7NUFKdf\8c\9e\84a\5ckwe`^aecYPQNJFEFHJIMTL\5cW\1f\07\a2\8d\7f\8d\ab\b8\a9\92QV]`\5cRE=\a0\a3\ae\bd\c1\ab\81_br\8f\af\c5\c9\be\b2\b0\ae\84=\13\19&%,\1f\1a1Wpqf\88\8b\8e\8e\8a\82ys\90\af\cd\cc\b0\98\93\9aXenjaf|\91\de\e1\e1\d4\b3\85W:4Bf\9f\d4\e8\d7\be\9a\8dyidiu}\ae\91slsnS75/=QL'()\1b\0a'1%\0c\18Kt}\95\95\97\9e\a6\a9\a8\a5y}\82\83~re\5cS\8d\c1\ba\8bs\8f\b9\c5\ca\c7\b6\a2\a1\b5\cb\b4\b0\a7\98\85p]RhbN.\1a*Z\84\89sS<=Vw\8f\b4|7\11\15*8;THJVL=Qx\ae\8fu}\98\9e\80^V[]UC0!\1b8\16!XdDIt\9f\8cyy\86\8c\82v\9c\9b\98\95\91\8d\8b\89\92\89znjnv|\86\8c\94\9c\9f\9e\9a\97\87\83~vnga^cju\7f\84\84\81~]XQJGGJLgq\7f\8b\91\91\8d\8a\81\91\aa\c2\cd\c9\bb\b0\a0\99\93\92\8f\83lZHJLORUWY[\5c`dhloqwvtrpnmllgcdfbVK><34S~\8e\84\a2\92wYD>ENosuqbM6(\1cFi_=6^\8c\83O\19\14=m\82\82pH$*Oh^HDXllZF==@GUfrtldN@/\22\22?x\ab\ad\a0\93\94\9f\a0\8culgbcd_TIKIEA@ACEKMPFVS\1e\09f\89\b1\bb\a2xUD\1d'5@EA92\83\95\a2\9a\8a\8f\ae\cd\b1\a4\82K\1d\154VL@%\17\225QJGOZYH7\19\1c5u\c8\fe\fb\e1s_OUjum_\8c\8c\8a\88\87\85\83\83~oZKIUgt~\82\89\8e\8e\8a\85\81ZZZ[[[\5c\5cibXOKMQTMHA;78:=KYU5\14cP9.28679L@=Uy\8c\84t\8d\99\a5\a6\9d\93\8f\90\97\9d\a5\ac\af\b2\b5\b8\c4\c2\be\b9\b4\af\ab\a9\ab\a9\a4\9e\98\92\8d\8b\80}xpha[X_\5c\5cckme]NDPs\8a\84yx\97\8f\8b\94\9e\99\82lkcXQS\5cirnhgoywhY]|\9d\a3\92\85\8b\98\a5\a1\95\81olx\85yobZZ[ZXOSM6\1c\15%8C\8f\bd\9ahas|\8bxt\86\90\82pkdaahpqjbQNJFEFHJNLJ'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c)2N{\9d\9arK??<93-'$\06!Jp\88\91\90\8d\ba\cd\dc\d4\b7\9a\8b\89[jrx\95\ae\98l\a3\a8\a3\8bhOHL8I`lcG$\0cZ@+6Vi`MocJ0.S\94\c7\e4\dd\cc\ad\80K\1c\00\12\1e$\1b\11\1d@`EFHJJIHG4\1c\1dS\9b\b3\88RH64CM\5c\90\cb\d9\b3\81^SQMGX>'*BRL>Y46YN\1e\1dI67;DSh|\89nopqrstt~o[OTj\86\99\8c\90\96\99\98\93\8c\88srpmjgec\5c`fhf^VPf`VKD@@A&:Uk{\8a\9a\a6\a8\ab\aa\a3\9d\a4\b6\c6\c7\cf\d8\d7\cc\bd\b0\aa\9c\99\95\8e\87\81|z\8f\91\95\99\9e\a3\a6\a8\b1\b2\b4\b7\ba\bd\c0\c1\b3\ab\a3\9f\9b\91\81tf`RSs\98\9a\85\83ulx\93\a4\a2\98\89\88\84\7fxpjfjszxplqx\84\80xrs\80\93\a1\8e\81x\81\94\9c\90\80\98\9f\9c\89st\8e\a9p\82\8bxO,\1f!4y\a7\9b\89\88wVcQQhseVUZXYbloibSPLIGHKLNLI:JL\1d\0c")) diff --git a/targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/default/mpeg2.c b/targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/default/mpeg2.c new file mode 100644 index 0000000..b4886ef --- /dev/null +++ b/targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/default/mpeg2.c @@ -0,0 +1,9369 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: mpeg2 + + Author: MPEG Software Simulation Group + + Function: This file contains MPEG 2 motion estimation code. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: MPEG-2 + + Changes: For TACLeBench, the code has been changed such that input and + output arrays are scaled down so that the code plus its data fits to the + memories of typical resource-constrained embedded devices. + + License: See the following disclaimer from the original source codes. + + Disclaimer of Warranty + + These software programs are available to the user without any license fee or + royalty on an "as is" basis. The MPEG Software Simulation Group disclaims + any and all warranties, whether express, implied, or statuary, including any + implied warranties or merchantability or of fitness for a particular + purpose. In no event shall the copyright-holder be liable for any + incidental, punitive, or consequential damages of any kind whatsoever + arising from the use of these programs. + + This disclaimer of warranty extends to the user of these programs and user's + customers, employees, agents, transferees, successors, and assigns. + + The MPEG Software Simulation Group does not represent or warrant that the + programs furnished hereunder are free of infringement of any third-party + patents. + + Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, + are subject to royalty fees to patent holders. Many of these patents are + general enough such that they are unavoidable regardless of implementation + design. + +*/ + +/* + Forward declaration of data types +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +struct mbinfo; + +/* + Forward declaration of functions +*/ + +void mpeg2_init(void); +int mpeg2_return(void); +void mpeg2_motion_estimation(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, + int, int, int, int, struct mbinfo *, int, int); +void mpeg2_frame_ME(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, int, int, int, int, int, + int, struct mbinfo *); +void mpeg2_field_ME(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, int, int, + int, int, int, int, struct mbinfo *, int, int); +void mpeg2_frame_estimate(unsigned char *, unsigned char *, unsigned char *, + int, int, int, int, int *, int *, int *, int *, int *, + int *, int *, int *, int *, int *, int[2][2], + int[2][2]); +void mpeg2_field_estimate(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, int, int, int, int, + int, int *, int *, int *, int *, int *, int *, int *, + int *, int *, int *, int *, int *, int *, int *); +void mpeg2_dpframe_estimate(unsigned char *, unsigned char *, int, int, + int[2][2], int[2][2], int *, int *, int *, int *, + int *, int *); +void mpeg2_dpfield_estimate(unsigned char *, unsigned char *, unsigned char *, + int, int, int, int, int *, int *, int *, int *); +int mpeg2_fullsearch(unsigned char *, unsigned char *, unsigned char *, int, + int, int, int, int, int, int, int, int *, int *); +int mpeg2_dist1(unsigned char *, unsigned char *, int, int, int, int, int); +int mpeg2_dist2(unsigned char *, unsigned char *, int, int, int, int); +int mpeg2_bdist1(unsigned char *, unsigned char *, unsigned char *, int, int, + int, int, int, int); +int mpeg2_bdist2(unsigned char *, unsigned char *, unsigned char *, int, int, + int, int, int, int); +int mpeg2_variance(unsigned char *, int); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +mpeg2_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Declaration of global variables +*/ + +struct mbinfo { + int mb_type; + int motion_type; + int dct_type; + int mquant; + int cbp; + int skipped; + int MV[2][2][2]; + int mv_field_sel[2][2]; + int dmvector[2]; + double act; + int var; +}; + +volatile int mpeg2_width = 352; +volatile int mpeg2_height = 256; +volatile int mpeg2_width2 = 352; +volatile int mpeg2_height2 = 256; +volatile int mpeg2_M = 3; +volatile int mpeg2_pict_type = 3; +volatile int mpeg2_pict_struct = 3; +volatile int mpeg2_topfirst = 1; +volatile int mpeg2_frame_pred_dct = 0; +struct mbinfo mpeg2_mbinfo[352]; + +unsigned char mpeg2_oldorgframe[] = { + 0x9f, 0x9d, 0x9b, 0x9d, 0x9f, 0xa1, 0xa2, 0xa3, 0x9e, 0xa2, 0xa5, 0xa5, + 0xa2, 0xa1, 0xa4, 0xa7, 0xa3, 0xa3, 0xa5, 0xa6, 0xa5, 0xa5, 0xa3, 0xa2, + 0x9d, 0xa1, 0xa5, 0xa8, 0xa6, 0xa1, 0x9a, 0x95, 0x8e, 0x7e, 0x7a, 0x78, + 0x70, 0x76, 0x7c, 0x73, 0x7d, 0x7a, 0x7a, 0x79, 0x7b, 0x83, 0x82, 0x74, + 0x64, 0x57, 0x48, 0x5e, 0x7e, 0x84, 0x6f, 0x4a, 0x31, 0x43, 0x61, 0x81, + 0x9b, 0xac, 0xb6, 0xb9, 0xb0, 0xa8, 0x9e, 0x9a, 0x9b, 0xa1, 0xaa, 0xb1, + 0x9d, 0x83, 0x65, 0x49, 0x33, 0x30, 0x34, 0x32, 0x4b, 0x54, 0x68, 0x83, + 0x99, 0x9f, 0x94, 0x87, 0x4f, 0x5e, 0x72, 0x7f, 0x75, 0x52, 0x23, 0x02, + 0x1a, 0x24, 0x24, 0x1b, 0x14, 0x13, 0x1e, 0x30, 0x43, 0x60, 0x7b, 0x8a, + 0x96, 0x9c, 0x97, 0x90, 0x99, 0x99, 0x92, 0x88, 0x7f, 0x80, 0x97, 0xb5, + 0xa0, 0x94, 0x9a, 0x96, 0x66, 0x2d, 0x14, 0x12, 0x15, 0x17, 0x27, 0x1c, + 0x15, 0x1e, 0x25, 0x3b, 0x7a, 0xa2, 0xbe, 0xbf, 0xb2, 0x9f, 0x9e, 0xaf, + 0xba, 0x7b, 0x64, 0x8a, 0xa9, 0xa7, 0xa4, 0xaa, 0xa8, 0xab, 0xad, 0xab, + 0xa7, 0xa6, 0xaa, 0xaf, 0xa4, 0xa6, 0xa9, 0xab, 0xac, 0xac, 0xaa, 0xa9, + 0xa7, 0xaf, 0xba, 0xbc, 0xaf, 0x94, 0x75, 0x60, 0x7a, 0x85, 0x90, 0x9a, + 0xa7, 0xa2, 0x7c, 0x50, 0x2f, 0x48, 0x65, 0x77, 0x7e, 0x8b, 0xa3, 0xb7, + 0xae, 0x95, 0x7a, 0x6f, 0x75, 0x79, 0x73, 0x69, 0x56, 0x63, 0x6e, 0x6e, + 0x6a, 0x6b, 0x72, 0x78, 0x65, 0x67, 0x61, 0x51, 0x3f, 0x36, 0x3b, 0x43, + 0x33, 0x24, 0x25, 0x3d, 0x4d, 0x4b, 0x48, 0x4d, 0x57, 0x4b, 0x42, 0x47, + 0x56, 0x62, 0x63, 0x5f, 0x60, 0x6d, 0x6f, 0x5b, 0x3f, 0x38, 0x4d, 0x67, + 0x4c, 0x3c, 0x2d, 0x2f, 0x3a, 0x3e, 0x33, 0x25, 0x3b, 0x4e, 0x6d, 0x84, + 0x82, 0x75, 0x71, 0x78, 0x7f, 0x78, 0x6c, 0x61, 0x5a, 0x58, 0x5a, 0x5d, + 0x69, 0x64, 0x59, 0x4c, 0x41, 0x3c, 0x3f, 0x43, 0x32, 0x3c, 0x26, 0x26, + 0x2f, 0x2b, 0x2e, 0x1f, 0x34, 0x8e, 0xbb, 0xaf, 0xae, 0xb0, 0xa7, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa5, 0xa4, 0xa5, 0xa7, 0xa7, 0xa5, 0xa4, 0xa0, 0xac, 0xa1, 0x97, + 0xa7, 0xac, 0xa5, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, + 0xa1, 0x95, 0x1d, 0x06, 0x8b, 0x86, 0x87, 0x8e, 0x95, 0x94, 0x90, 0x8d, + 0x92, 0x94, 0x97, 0x9b, 0x9f, 0xa0, 0x9e, 0x9d, 0x99, 0x9b, 0x9e, 0x9d, + 0x98, 0x8e, 0x83, 0x7c, 0x80, 0x7b, 0x76, 0x74, 0x78, 0x83, 0x8f, 0x97, + 0x92, 0x8f, 0x99, 0xaf, 0xb8, 0xa8, 0x99, 0x9b, 0x97, 0xb9, 0xc0, 0xb5, + 0xb2, 0x9e, 0x8a, 0x90, 0xa7, 0xc1, 0x9d, 0x6a, 0x56, 0x4a, 0x48, 0x4c, + 0x58, 0x86, 0xb9, 0xca, 0xb8, 0xa1, 0x9c, 0xa1, 0xbd, 0xc1, 0xba, 0x99, + 0x63, 0x30, 0x11, 0x06, 0x1b, 0x33, 0x5d, 0x7f, 0x91, 0xa7, 0xbf, 0xcb, + 0xbb, 0xb5, 0xb1, 0xb2, 0xb5, 0xb0, 0xa2, 0x95, 0xca, 0xc3, 0xa6, 0x74, + 0x4f, 0x5d, 0x99, 0xd1, 0xcb, 0xbb, 0xb0, 0x95, 0x69, 0x54, 0x52, 0x48, + 0x5a, 0x51, 0x3d, 0x42, 0x5d, 0x64, 0x73, 0x9c, 0x9d, 0x91, 0x96, 0x9f, + 0x9b, 0x98, 0x91, 0x7f, 0x64, 0x41, 0x15, 0x12, 0x39, 0x5f, 0x74, 0x83, + 0x86, 0x80, 0x7b, 0x84, 0x8a, 0x7c, 0x5e, 0x41, 0x36, 0x42, 0x6f, 0xa7, + 0xbb, 0xa8, 0x91, 0x89, 0x88, 0x98, 0xb2, 0xbc, 0xb2, 0xae, 0xb3, 0xb4, + 0xb6, 0xb4, 0xb3, 0xb5, 0xb9, 0xbb, 0xbc, 0xbb, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb5, 0xb4, 0xb3, 0xb2, 0x9d, 0x80, 0x61, 0x5e, 0x79, 0x9c, 0xb3, 0xbb, + 0xca, 0xc1, 0xaf, 0xa3, 0xac, 0xb9, 0xaf, 0x98, 0x6e, 0x48, 0x2b, 0x41, + 0x7a, 0xa5, 0xa7, 0x96, 0x9d, 0x87, 0x6e, 0x65, 0x6c, 0x72, 0x6e, 0x67, + 0x66, 0x78, 0x7d, 0x76, 0x7f, 0x96, 0x99, 0x89, 0x6a, 0x78, 0x87, 0x8a, + 0x80, 0x72, 0x6a, 0x68, 0x56, 0x5a, 0x59, 0x55, 0x55, 0x59, 0x5e, 0x60, + 0x5a, 0x86, 0xb2, 0xb6, 0x92, 0x69, 0x57, 0x57, 0x6a, 0x59, 0x46, 0x3b, + 0x39, 0x34, 0x29, 0x1f, 0x26, 0x25, 0x23, 0x21, 0x21, 0x26, 0x2e, 0x35, + 0x5c, 0x6e, 0x7a, 0x74, 0x6c, 0x6f, 0x77, 0x7c, 0x6a, 0x67, 0x62, 0x5d, + 0x5b, 0x5b, 0x5d, 0x5f, 0x54, 0x50, 0x4c, 0x4d, 0x4f, 0x49, 0x3c, 0x31, + 0x35, 0x24, 0x2d, 0x2f, 0x2e, 0x2a, 0x22, 0x3a, 0x87, 0xaf, 0xb9, 0xab, + 0xac, 0xb0, 0xac, 0xad, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xac, 0xa6, 0xa2, 0xa5, 0xad, 0xb0, 0xac, 0xa6, + 0xb1, 0xaa, 0x9d, 0x99, 0xa5, 0xad, 0xaa, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, 0x97, 0xa2, 0xa5, 0x9b, + 0x93, 0x94, 0x97, 0x96, 0x8c, 0x84, 0x7c, 0x76, 0x73, 0x6f, 0x69, 0x63, + 0x68, 0x6e, 0x79, 0x87, 0x94, 0x9e, 0xa6, 0xa9, 0xaa, 0xac, 0xaf, 0xb3, + 0xb5, 0xb6, 0xb7, 0xb6, 0xaa, 0xab, 0x98, 0x90, 0xa3, 0xab, 0xa5, 0xa7, + 0x9e, 0x91, 0x82, 0x7a, 0x85, 0xa2, 0xbb, 0xc0, 0xba, 0x79, 0x34, 0x26, + 0x35, 0x53, 0x73, 0x75, 0x82, 0x83, 0x87, 0x8b, 0x89, 0x7d, 0x69, 0x59, + 0x27, 0x1c, 0x0f, 0x0c, 0x17, 0x29, 0x39, 0x41, 0x3e, 0x3a, 0x3c, 0x39, + 0x2d, 0x25, 0x21, 0x18, 0x2b, 0x29, 0x2e, 0x42, 0x60, 0x7b, 0x89, 0x8d, + 0xae, 0x89, 0x6b, 0x7a, 0xab, 0xd3, 0xd9, 0xce, 0x92, 0x7e, 0x99, 0xba, + 0xb8, 0xb8, 0xa3, 0x6e, 0x59, 0x67, 0x79, 0x76, 0x5d, 0x4f, 0x4c, 0x46, + 0x5d, 0x6c, 0x73, 0x86, 0x99, 0x7c, 0x48, 0x34, 0x4c, 0x6d, 0x82, 0x81, + 0x7b, 0x6d, 0x63, 0x67, 0x8d, 0x87, 0x77, 0x91, 0xa9, 0xa0, 0x8a, 0x61, + 0x39, 0x1f, 0x32, 0x64, 0x79, 0x6e, 0x59, 0x46, 0x54, 0x74, 0x9f, 0xb7, + 0xb8, 0xb8, 0xb6, 0xac, 0xad, 0xb7, 0xba, 0xa8, 0x8b, 0x79, 0x7c, 0x86, + 0x83, 0x83, 0x84, 0x85, 0x88, 0x8c, 0x90, 0x92, 0x95, 0xa7, 0xbe, 0xcb, + 0xcb, 0xc3, 0xbb, 0xb7, 0x9e, 0xa8, 0xaf, 0xb7, 0xc6, 0xce, 0xba, 0x9d, + 0x5f, 0x55, 0x54, 0x6a, 0x8c, 0x9d, 0x95, 0x85, 0x79, 0x68, 0x56, 0x53, + 0x5f, 0x6a, 0x6d, 0x6b, 0x85, 0x7c, 0x6b, 0x5c, 0x59, 0x56, 0x45, 0x31, + 0x5f, 0x67, 0x6e, 0x70, 0x6c, 0x69, 0x6a, 0x6d, 0x6a, 0x79, 0x76, 0x5c, + 0x52, 0x64, 0x76, 0x7a, 0x6a, 0x63, 0x5d, 0x5f, 0x63, 0x62, 0x58, 0x4e, + 0x3e, 0x3b, 0x37, 0x36, 0x37, 0x37, 0x34, 0x31, 0x3d, 0x3a, 0x3e, 0x53, + 0x6d, 0x7c, 0x78, 0x6f, 0x67, 0x66, 0x5e, 0x58, 0x5b, 0x62, 0x5d, 0x52, + 0x56, 0x57, 0x58, 0x57, 0x54, 0x50, 0x4b, 0x48, 0x4a, 0x4d, 0x4e, 0x45, + 0x39, 0x30, 0x30, 0x34, 0x22, 0x2d, 0x23, 0x29, 0x30, 0x1c, 0x3d, 0x8f, + 0xb2, 0xb3, 0xb0, 0xad, 0xad, 0xaf, 0xad, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xad, 0xab, 0xa4, + 0xa3, 0xa9, 0xa6, 0x9e, 0xa4, 0xa4, 0xa1, 0xa3, 0xa8, 0xa8, 0xa8, 0xb0, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0xa6, 0xa3, 0xa0, 0x9f, 0xa2, 0xa4, 0xa0, 0x9b, 0x89, 0x90, 0x9d, 0xab, + 0xb5, 0xb6, 0xb1, 0xab, 0xa7, 0xa6, 0xa3, 0x9c, 0x92, 0x86, 0x7c, 0x75, + 0x78, 0x79, 0x7b, 0x7c, 0x7c, 0x7a, 0x79, 0x78, 0x8d, 0x95, 0x87, 0x79, + 0x89, 0xa3, 0xae, 0xb2, 0x9e, 0x86, 0x88, 0x95, 0x97, 0x98, 0x7a, 0x42, + 0x12, 0x2d, 0x4a, 0x85, 0xba, 0xbd, 0xac, 0x9f, 0xaf, 0x8c, 0x58, 0x2a, + 0x18, 0x23, 0x3e, 0x54, 0x6e, 0x8b, 0xaa, 0xb5, 0xb5, 0xbb, 0xca, 0xd6, + 0xca, 0xc1, 0xc3, 0xcc, 0xce, 0xc9, 0xb6, 0x9f, 0x88, 0x77, 0x61, 0x52, + 0x48, 0x3d, 0x2e, 0x22, 0x24, 0x32, 0x51, 0x7d, 0xa2, 0xa9, 0x94, 0x7d, + 0x9d, 0x8d, 0x93, 0x93, 0x7b, 0x75, 0x75, 0x5f, 0x33, 0x3f, 0x2c, 0x2d, + 0x61, 0x7e, 0x74, 0x73, 0x52, 0x5f, 0x82, 0x7e, 0x48, 0x3f, 0x78, 0xa7, + 0xa4, 0x94, 0x83, 0x6a, 0x52, 0x5a, 0x78, 0x8a, 0x85, 0x84, 0x7a, 0x7f, + 0x83, 0x82, 0x86, 0x7f, 0x6a, 0x4c, 0x39, 0x3f, 0x51, 0x69, 0x79, 0x7a, + 0x71, 0x6e, 0x77, 0x81, 0x80, 0x78, 0x69, 0x57, 0x4a, 0x4a, 0x54, 0x70, + 0x94, 0xae, 0xb7, 0xb6, 0xb1, 0xb0, 0xb0, 0xb1, 0xb4, 0xb9, 0xbe, 0xc0, + 0xba, 0xc3, 0xbe, 0x9f, 0x7a, 0x71, 0x8b, 0xab, 0xc3, 0xc2, 0xb6, 0xa7, + 0xa4, 0xa6, 0x97, 0x80, 0x6c, 0x6f, 0x64, 0x49, 0x37, 0x4c, 0x85, 0xb8, + 0xc4, 0xae, 0x91, 0x7b, 0x6f, 0x68, 0x5f, 0x58, 0x4a, 0x2c, 0x26, 0x3f, + 0x46, 0x33, 0x32, 0x46, 0x57, 0x62, 0x72, 0x7e, 0x83, 0x82, 0x7e, 0x7b, + 0x89, 0x92, 0x8f, 0x7a, 0x68, 0x60, 0x59, 0x51, 0x2c, 0x3f, 0x48, 0x37, + 0x22, 0x2c, 0x59, 0x86, 0x71, 0x57, 0x42, 0x4b, 0x70, 0x96, 0xa7, 0xa9, + 0x7d, 0x7d, 0x7e, 0x7d, 0x7b, 0x79, 0x76, 0x74, 0x73, 0x5c, 0x4a, 0x4d, + 0x57, 0x5a, 0x58, 0x57, 0x53, 0x51, 0x4e, 0x4c, 0x4b, 0x4c, 0x4d, 0x4e, + 0x50, 0x45, 0x37, 0x2d, 0x2a, 0x2a, 0x2c, 0x2c, 0x20, 0x27, 0x28, 0x26, + 0x1d, 0x41, 0x91, 0xb8, 0xad, 0xa5, 0xab, 0xb2, 0xac, 0xaa, 0xac, 0xa6, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xae, 0xa4, 0xa5, 0xaf, 0xb0, 0xa8, 0xa8, 0xb1, 0xa9, 0xa6, 0x9e, 0xa4, + 0xb0, 0xa9, 0xa0, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, + 0xa1, 0x95, 0x1d, 0x06, 0xa8, 0x9c, 0x9a, 0xa1, 0x9b, 0x8b, 0x86, 0x8f, + 0xa6, 0xa6, 0xa6, 0xa3, 0xa0, 0xa0, 0xa3, 0xa6, 0xad, 0xa9, 0xa4, 0xa1, + 0xa3, 0xa9, 0xb2, 0xb7, 0xaf, 0xaf, 0xad, 0xa9, 0xa4, 0x9e, 0x99, 0x96, + 0x88, 0x75, 0x70, 0x73, 0x6f, 0x72, 0x81, 0x89, 0x94, 0xb7, 0xbf, 0x8e, + 0x4b, 0x27, 0x31, 0x4d, 0x85, 0xa9, 0xb4, 0xb0, 0x99, 0x69, 0x48, 0x3d, + 0x37, 0x49, 0x6b, 0x95, 0xb8, 0xca, 0xcc, 0xc7, 0xc3, 0xc4, 0xbd, 0xb0, + 0xa9, 0xab, 0xac, 0xa9, 0xa4, 0xa0, 0xa4, 0xa9, 0xa9, 0xab, 0xab, 0xa4, + 0x90, 0x8d, 0x8d, 0x96, 0xa2, 0xa6, 0xa0, 0x97, 0x7e, 0x7c, 0x67, 0x3d, + 0x1d, 0x28, 0x5d, 0x8f, 0x6f, 0x6e, 0x75, 0x84, 0x8d, 0x82, 0x64, 0x4a, + 0x3e, 0x35, 0x33, 0x38, 0x35, 0x27, 0x26, 0x33, 0x73, 0x6c, 0x3e, 0x21, + 0x3d, 0x62, 0x79, 0x90, 0x80, 0x75, 0x6c, 0x5e, 0x51, 0x5e, 0x74, 0x7c, + 0x7d, 0x81, 0x8b, 0x7e, 0x71, 0x73, 0x7a, 0x8d, 0x9c, 0x87, 0x60, 0x4c, + 0x5e, 0x7a, 0x89, 0x8f, 0x92, 0x8b, 0x92, 0x97, 0x82, 0x6a, 0x6a, 0x74, + 0x85, 0x85, 0x82, 0x7e, 0x79, 0x72, 0x6c, 0x68, 0x73, 0x71, 0x6d, 0x6a, + 0x67, 0x64, 0x63, 0x63, 0x6b, 0x64, 0x61, 0x6a, 0x76, 0x79, 0x6f, 0x63, + 0x58, 0x55, 0x46, 0x38, 0x42, 0x5c, 0x6a, 0x68, 0x6f, 0x75, 0x79, 0x76, + 0x71, 0x73, 0x7f, 0x8b, 0x7c, 0x6e, 0x5c, 0x51, 0x4e, 0x51, 0x54, 0x55, + 0x57, 0x44, 0x47, 0x5e, 0x5d, 0x4b, 0x57, 0x79, 0xb3, 0xb0, 0xab, 0xa5, + 0x9d, 0x94, 0x8a, 0x83, 0x8a, 0x73, 0x5e, 0x58, 0x52, 0x48, 0x45, 0x49, + 0x5d, 0x4f, 0x3f, 0x3b, 0x43, 0x4b, 0x4b, 0x48, 0x47, 0x58, 0x74, 0x8e, + 0x92, 0x77, 0x48, 0x23, 0x44, 0x46, 0x4a, 0x51, 0x5b, 0x66, 0x70, 0x75, + 0x5a, 0x56, 0x57, 0x5d, 0x5d, 0x5a, 0x5f, 0x6a, 0x66, 0x66, 0x66, 0x61, + 0x58, 0x4c, 0x40, 0x39, 0x34, 0x30, 0x2c, 0x2b, 0x2c, 0x2c, 0x29, 0x27, + 0x26, 0x1d, 0x30, 0x1c, 0x3c, 0x9c, 0xb4, 0xa9, 0xb0, 0xa7, 0xae, 0xb2, + 0xa6, 0xa8, 0xae, 0xa6, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa3, 0xac, 0xb0, 0xac, 0xa8, 0xaa, 0xaf, 0xb1, + 0xaf, 0xa4, 0xa3, 0xaa, 0xac, 0xa9, 0xaa, 0xab, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, 0x91, 0x9d, 0xa0, 0x93, + 0x85, 0x88, 0x99, 0xa8, 0xa1, 0xa5, 0xa7, 0xa5, 0xa1, 0x9f, 0xa2, 0xa6, + 0x98, 0x97, 0x97, 0x99, 0xa0, 0xa9, 0xb2, 0xb8, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb5, 0xb4, 0xb2, 0xb1, 0xbd, 0x9f, 0x9c, 0xa8, 0xa2, 0x92, 0x7a, 0x5d, + 0x5e, 0x38, 0x1b, 0x1b, 0x3f, 0x82, 0xb5, 0xbe, 0x90, 0x80, 0x62, 0x48, + 0x35, 0x49, 0x82, 0x9f, 0xc5, 0xc6, 0xc4, 0xbd, 0xb4, 0xac, 0xa9, 0xa8, + 0xa0, 0xa7, 0xa6, 0x9e, 0x9c, 0xa4, 0xa7, 0xa4, 0x9e, 0x9e, 0xa6, 0xa9, + 0xa3, 0xa2, 0xa6, 0xa3, 0x88, 0x85, 0x85, 0x8e, 0x99, 0x9b, 0x93, 0x8a, + 0x9a, 0x9e, 0xa1, 0x99, 0x84, 0x65, 0x47, 0x33, 0x36, 0x53, 0x69, 0x6d, + 0x64, 0x50, 0x44, 0x49, 0x3e, 0x37, 0x2c, 0x27, 0x2f, 0x42, 0x60, 0x7a, + 0x4c, 0x2d, 0x34, 0x49, 0x3d, 0x34, 0x45, 0x54, 0x67, 0x6f, 0x62, 0x51, + 0x5b, 0x6c, 0x71, 0x73, 0x78, 0x75, 0x81, 0x75, 0x6d, 0x73, 0x6e, 0x7c, + 0x79, 0x68, 0x4d, 0x50, 0x77, 0x8e, 0x8f, 0x91, 0x81, 0x8e, 0x8a, 0x6c, + 0x5d, 0x75, 0x8e, 0x8c, 0x85, 0x88, 0x8b, 0x8d, 0x8b, 0x89, 0x86, 0x85, + 0x85, 0x86, 0x86, 0x85, 0x82, 0x7e, 0x79, 0x76, 0x70, 0x75, 0x79, 0x77, + 0x70, 0x6b, 0x6b, 0x6e, 0x60, 0x6b, 0x6e, 0x68, 0x69, 0x71, 0x6e, 0x61, + 0x6e, 0x68, 0x67, 0x73, 0x82, 0x82, 0x6f, 0x5b, 0x69, 0x5e, 0x4e, 0x41, + 0x3b, 0x3c, 0x41, 0x45, 0x5b, 0x68, 0x6d, 0x66, 0x62, 0x6f, 0x81, 0x8c, + 0x82, 0x77, 0x6c, 0x69, 0x71, 0x7d, 0x85, 0x89, 0x6c, 0x50, 0x42, 0x4f, + 0x5a, 0x57, 0x58, 0x62, 0x32, 0x30, 0x31, 0x38, 0x44, 0x4d, 0x50, 0x50, + 0x46, 0x50, 0x53, 0x45, 0x32, 0x30, 0x43, 0x59, 0x2b, 0x45, 0x62, 0x69, + 0x59, 0x41, 0x31, 0x2b, 0x3d, 0x4a, 0x54, 0x57, 0x59, 0x5e, 0x5c, 0x56, + 0x58, 0x5b, 0x5d, 0x5c, 0x55, 0x49, 0x3d, 0x35, 0x25, 0x2c, 0x31, 0x2e, + 0x25, 0x20, 0x22, 0x26, 0x23, 0x20, 0x27, 0x37, 0x81, 0xbb, 0xad, 0xb0, + 0xab, 0xa5, 0xaa, 0xae, 0xa8, 0xac, 0xaf, 0xa4, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xac, 0xac, 0xa5, 0x9e, + 0xa7, 0xb2, 0xab, 0x99, 0x8e, 0x7d, 0x88, 0x9a, 0x9a, 0xa7, 0xb3, 0xa6, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x97, 0x9a, 0x91, 0x82, 0x87, 0x9d, 0xa6, 0x9f, 0xa3, 0xa1, 0x9f, 0x9d, + 0x9d, 0x9f, 0xa3, 0xa7, 0xac, 0xae, 0xb0, 0xab, 0x9d, 0x89, 0x75, 0x68, + 0x68, 0x65, 0x61, 0x62, 0x69, 0x76, 0x84, 0x8d, 0x9f, 0x9f, 0xa9, 0xaf, + 0x9b, 0x71, 0x44, 0x26, 0x20, 0x2b, 0x73, 0xb5, 0xc1, 0xc5, 0xa8, 0x62, + 0x51, 0x64, 0x59, 0x6b, 0xa2, 0xbe, 0xbe, 0xb8, 0xa6, 0xa6, 0xa4, 0xa2, + 0xa1, 0xa3, 0xa5, 0xa7, 0xa5, 0xa7, 0x9f, 0x92, 0x93, 0xa2, 0xaa, 0xa7, + 0x9b, 0x98, 0x9d, 0xa2, 0xa1, 0xa6, 0xab, 0xa8, 0x92, 0x85, 0x76, 0x6f, + 0x71, 0x71, 0x6c, 0x65, 0x75, 0x82, 0x91, 0x95, 0x89, 0x72, 0x5a, 0x4c, + 0x36, 0x36, 0x41, 0x48, 0x42, 0x3c, 0x34, 0x26, 0x1f, 0x38, 0x24, 0x32, + 0x80, 0x87, 0x44, 0x24, 0x1a, 0x37, 0x3c, 0x2f, 0x2d, 0x2e, 0x2f, 0x36, + 0x45, 0x5a, 0x5f, 0x58, 0x5c, 0x61, 0x63, 0x69, 0x53, 0x4f, 0x50, 0x53, + 0x5b, 0x65, 0x67, 0x69, 0x71, 0x5e, 0x4f, 0x59, 0x73, 0x84, 0x87, 0x87, + 0x80, 0x68, 0x6b, 0x84, 0x87, 0x7a, 0x7b, 0x85, 0x81, 0x83, 0x86, 0x8a, + 0x8e, 0x8d, 0x89, 0x85, 0x84, 0x89, 0x90, 0x95, 0x96, 0x92, 0x8c, 0x88, + 0x7e, 0x6f, 0x63, 0x67, 0x76, 0x7e, 0x78, 0x6e, 0x6f, 0x79, 0x79, 0x6b, + 0x65, 0x69, 0x65, 0x5a, 0x71, 0x7b, 0x86, 0x8b, 0x87, 0x7f, 0x78, 0x75, + 0x7e, 0x73, 0x61, 0x4c, 0x3d, 0x38, 0x3b, 0x3f, 0x4c, 0x5c, 0x5a, 0x4b, + 0x51, 0x6d, 0x7c, 0x76, 0x7a, 0x7b, 0x80, 0x8c, 0x96, 0x94, 0x88, 0x7b, + 0x67, 0x70, 0x81, 0x8f, 0x8c, 0x77, 0x5d, 0x4d, 0x3b, 0x45, 0x4e, 0x4c, + 0x40, 0x34, 0x2e, 0x2e, 0x34, 0x38, 0x41, 0x4d, 0x52, 0x4b, 0x3a, 0x2c, + 0x48, 0x43, 0x3f, 0x40, 0x45, 0x4b, 0x50, 0x52, 0x50, 0x4c, 0x41, 0x3b, + 0x43, 0x51, 0x53, 0x4c, 0x59, 0x51, 0x45, 0x3a, 0x32, 0x30, 0x31, 0x33, + 0x36, 0x2c, 0x22, 0x20, 0x23, 0x25, 0x22, 0x1d, 0x24, 0x20, 0x48, 0x80, + 0x99, 0xa6, 0xb3, 0xb6, 0xa2, 0xa0, 0xa5, 0xad, 0xad, 0xac, 0xac, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa7, 0xad, 0xad, 0x92, 0x74, 0x7a, 0x95, 0x99, 0x9d, 0x9b, 0x8e, + 0x84, 0x8a, 0x9b, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, + 0xa1, 0x95, 0x1d, 0x06, 0x8b, 0x7f, 0x81, 0x95, 0xa5, 0xa5, 0xa2, 0xa4, + 0xa3, 0xa3, 0xa5, 0xa8, 0xa8, 0xa2, 0x96, 0x8d, 0x5c, 0x56, 0x4f, 0x4d, + 0x55, 0x66, 0x78, 0x84, 0x8f, 0x90, 0x90, 0x8e, 0x86, 0x7b, 0x70, 0x69, + 0x6a, 0x73, 0x75, 0x68, 0x42, 0x1e, 0x41, 0x8e, 0x9a, 0x98, 0xa1, 0xa8, + 0xa7, 0xaa, 0xa0, 0x86, 0x9d, 0x87, 0x80, 0xa5, 0xba, 0xac, 0xa6, 0xa4, + 0xa5, 0xa5, 0xa5, 0xa4, 0xa3, 0xa3, 0xa4, 0xa6, 0xa4, 0xa2, 0x97, 0x8c, + 0x93, 0xa5, 0xa8, 0x9f, 0xa2, 0xa3, 0xaa, 0xac, 0xa3, 0xa1, 0xa3, 0xa0, + 0x8d, 0x76, 0x57, 0x43, 0x3e, 0x40, 0x40, 0x3e, 0x47, 0x43, 0x42, 0x4a, + 0x55, 0x57, 0x4e, 0x43, 0x38, 0x28, 0x36, 0x3a, 0x22, 0x27, 0x35, 0x25, + 0x3a, 0x29, 0x84, 0xaa, 0x52, 0x55, 0x94, 0x7c, 0x89, 0x77, 0x6e, 0x69, + 0x54, 0x39, 0x2c, 0x29, 0x2e, 0x22, 0x26, 0x33, 0x35, 0x38, 0x3f, 0x3e, + 0x40, 0x45, 0x3e, 0x4c, 0x56, 0x58, 0x66, 0x61, 0x5e, 0x53, 0x51, 0x52, + 0x53, 0x67, 0x7f, 0x84, 0x6d, 0x6d, 0x6f, 0x6e, 0x6f, 0x7a, 0x7f, 0x76, + 0x69, 0x68, 0x6d, 0x78, 0x86, 0x8c, 0x88, 0x82, 0x7b, 0x81, 0x8a, 0x8f, + 0x8e, 0x87, 0x7d, 0x76, 0x75, 0x7d, 0x86, 0x88, 0x84, 0x80, 0x80, 0x82, + 0x61, 0x71, 0x78, 0x72, 0x73, 0x7c, 0x7e, 0x76, 0x6f, 0x80, 0x8d, 0x85, + 0x71, 0x6a, 0x79, 0x8b, 0x7b, 0x72, 0x62, 0x50, 0x42, 0x3e, 0x43, 0x49, + 0x3c, 0x37, 0x34, 0x40, 0x5a, 0x75, 0x84, 0x87, 0x87, 0x82, 0x7f, 0x84, + 0x89, 0x85, 0x77, 0x69, 0x62, 0x76, 0x7e, 0x6d, 0x60, 0x60, 0x5e, 0x55, + 0x44, 0x49, 0x48, 0x3c, 0x2d, 0x2c, 0x3a, 0x4a, 0x52, 0x50, 0x49, 0x3e, + 0x35, 0x36, 0x41, 0x4b, 0x3d, 0x4a, 0x54, 0x4e, 0x3f, 0x39, 0x43, 0x51, + 0x51, 0x44, 0x3a, 0x37, 0x35, 0x31, 0x36, 0x3f, 0x39, 0x3a, 0x3c, 0x3b, + 0x38, 0x34, 0x2e, 0x2b, 0x25, 0x26, 0x26, 0x23, 0x21, 0x22, 0x26, 0x2a, + 0x1e, 0x36, 0x8c, 0x9f, 0x9c, 0xae, 0xa0, 0xab, 0xab, 0xaa, 0xab, 0xaf, + 0xab, 0xa4, 0xaa, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa1, 0xa7, 0xa9, 0xa7, 0xad, 0xb9, 0xbb, 0xb3, + 0xb0, 0x8e, 0x41, 0x36, 0x89, 0xb6, 0xa7, 0xa6, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, 0x65, 0x7d, 0x9b, 0xab, + 0xaa, 0xa4, 0xa1, 0xa3, 0xa2, 0x9a, 0x88, 0x6f, 0x5b, 0x54, 0x5c, 0x66, + 0x82, 0x9e, 0xac, 0xb3, 0xbc, 0xb3, 0xb0, 0xc3, 0xb0, 0xac, 0xb7, 0xb2, + 0xa6, 0xbf, 0xc1, 0x94, 0x4e, 0x4c, 0x53, 0x57, 0x44, 0x5b, 0xa5, 0xc8, + 0xb9, 0xab, 0xa2, 0x8f, 0x8d, 0x84, 0x6f, 0x83, 0x97, 0x8a, 0x91, 0xa2, + 0xa6, 0xa7, 0xa6, 0x9d, 0xa6, 0xa5, 0xa4, 0xa2, 0xa1, 0x9f, 0x9e, 0x9d, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xaa, 0x99, 0xa8, + 0xab, 0xa1, 0xa9, 0x8c, 0xa8, 0xaf, 0xa2, 0x6b, 0x35, 0x32, 0x40, 0x39, + 0x30, 0x32, 0x33, 0x31, 0x30, 0x34, 0x3e, 0x46, 0x43, 0x40, 0x3b, 0x35, + 0x31, 0x3e, 0x6d, 0xa2, 0xc2, 0xb3, 0x77, 0x50, 0x84, 0xc4, 0xb3, 0x7d, + 0x99, 0xa7, 0x93, 0xab, 0xcc, 0xc0, 0xb5, 0xa6, 0x77, 0x71, 0x64, 0x4f, + 0x36, 0x22, 0x18, 0x15, 0x25, 0x28, 0x2f, 0x35, 0x33, 0x30, 0x36, 0x3f, + 0x45, 0x46, 0x4f, 0x5b, 0x5e, 0x56, 0x50, 0x4f, 0x4a, 0x53, 0x5a, 0x5b, + 0x5d, 0x64, 0x69, 0x69, 0x5a, 0x60, 0x69, 0x72, 0x78, 0x7b, 0x7c, 0x7c, + 0x83, 0x8b, 0x7b, 0x6d, 0x76, 0x74, 0x64, 0x5f, 0x74, 0x82, 0x81, 0x75, + 0x70, 0x6f, 0x69, 0x62, 0x55, 0x62, 0x75, 0x84, 0x8a, 0x84, 0x79, 0x70, + 0x7a, 0x7e, 0x83, 0x87, 0x89, 0x88, 0x85, 0x83, 0x7b, 0x7e, 0x7b, 0x6a, + 0x51, 0x3f, 0x3a, 0x3c, 0x37, 0x38, 0x3e, 0x4b, 0x5c, 0x69, 0x6f, 0x70, + 0x79, 0x82, 0x86, 0x7d, 0x6c, 0x64, 0x69, 0x72, 0x86, 0x87, 0x80, 0x6c, + 0x52, 0x40, 0x3b, 0x3d, 0x35, 0x42, 0x41, 0x35, 0x3b, 0x5b, 0x78, 0x83, + 0x63, 0x54, 0x43, 0x39, 0x3a, 0x3f, 0x42, 0x42, 0x3e, 0x39, 0x34, 0x33, + 0x34, 0x34, 0x30, 0x2c, 0x2b, 0x30, 0x38, 0x3e, 0x40, 0x3f, 0x3c, 0x3a, + 0x35, 0x34, 0x31, 0x2e, 0x2a, 0x27, 0x24, 0x23, 0x22, 0x23, 0x27, 0x24, + 0x1d, 0x1e, 0x23, 0x20, 0x2f, 0x84, 0x97, 0x90, 0x9d, 0xa2, 0xaa, 0xaf, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa2, 0xa3, 0xac, 0xae, 0xa8, 0xa9, 0xb0, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa6, 0xa6, 0xa5, 0xa5, + 0xa4, 0xa4, 0xa3, 0xa3, 0xa2, 0xa0, 0x9f, 0xa0, 0xa6, 0x94, 0x1b, 0x06, + 0x7f, 0x89, 0x95, 0x99, 0x92, 0x83, 0x73, 0x6a, 0x4c, 0x5b, 0x6f, 0x82, + 0x92, 0xa3, 0xb5, 0xc2, 0xb8, 0xa9, 0xa6, 0xad, 0xa9, 0x9e, 0xa0, 0xa8, + 0x98, 0xa8, 0xa0, 0xa3, 0xb2, 0x8c, 0x52, 0x46, 0x51, 0x5b, 0x81, 0xa4, + 0x83, 0x5d, 0x6f, 0x7c, 0x8b, 0x8f, 0xa0, 0xb2, 0xa7, 0x95, 0xa3, 0xb8, + 0x99, 0x88, 0x8a, 0x9a, 0xa3, 0xaa, 0xaa, 0xa2, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa4, 0xa3, 0xa2, 0xa1, 0x9e, 0x9f, 0xa0, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa6, 0x9d, 0xa5, 0xaa, 0xa8, 0x9f, 0x91, 0x8f, 0xbc, 0xa7, 0x85, 0x8e, + 0xa0, 0x6b, 0x42, 0x62, 0x3a, 0x5f, 0x59, 0x48, 0x4e, 0x42, 0x43, 0x6d, + 0x72, 0x74, 0x7a, 0x87, 0xa8, 0xd5, 0xe3, 0xd1, 0x7e, 0x3a, 0x67, 0xbc, + 0xba, 0xae, 0xa0, 0x6a, 0x88, 0x92, 0x7f, 0x74, 0x84, 0x9b, 0xb4, 0xc4, + 0xc9, 0xcd, 0xcf, 0xcb, 0xc2, 0xba, 0xb6, 0xb6, 0xaa, 0x95, 0x6e, 0x4a, + 0x3c, 0x3a, 0x2f, 0x1e, 0x20, 0x29, 0x2f, 0x31, 0x35, 0x3e, 0x40, 0x3d, + 0x3c, 0x47, 0x4f, 0x4c, 0x49, 0x4f, 0x58, 0x5d, 0x5f, 0x62, 0x63, 0x61, + 0x5f, 0x63, 0x6d, 0x76, 0x6e, 0x62, 0x65, 0x72, 0x6d, 0x5f, 0x64, 0x76, + 0x68, 0x74, 0x76, 0x6f, 0x6e, 0x6f, 0x6a, 0x63, 0x6a, 0x69, 0x67, 0x67, + 0x67, 0x69, 0x6a, 0x6c, 0x7d, 0x7f, 0x81, 0x81, 0x7f, 0x7a, 0x74, 0x71, + 0x7f, 0x82, 0x83, 0x7c, 0x6f, 0x62, 0x5a, 0x57, 0x6a, 0x5d, 0x4d, 0x47, + 0x4e, 0x5d, 0x6d, 0x75, 0x77, 0x79, 0x74, 0x69, 0x61, 0x6c, 0x87, 0x9f, + 0xa5, 0x90, 0x71, 0x56, 0x4a, 0x4b, 0x52, 0x58, 0x48, 0x49, 0x51, 0x60, + 0x69, 0x68, 0x62, 0x5e, 0x3f, 0x45, 0x53, 0x66, 0x77, 0x7b, 0x75, 0x6c, + 0x4b, 0x4f, 0x51, 0x4b, 0x41, 0x3c, 0x3e, 0x43, 0x40, 0x42, 0x43, 0x41, + 0x3d, 0x39, 0x38, 0x38, 0x37, 0x35, 0x32, 0x2d, 0x27, 0x23, 0x1f, 0x1d, + 0x28, 0x1e, 0x20, 0x24, 0x1e, 0x1e, 0x21, 0x1c, 0x7f, 0xaa, 0xaf, 0x99, + 0x97, 0xa6, 0xaf, 0xa8, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa1, 0x74, 0x68, 0x92, + 0xb3, 0xab, 0x9f, 0xa4, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa6, 0xa6, 0xa6, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, 0xa2, 0xa0, 0x9f, 0xa0, + 0xa7, 0x95, 0x1b, 0x06, 0x74, 0x6c, 0x60, 0x59, 0x5f, 0x73, 0x8c, 0x9e, + 0xad, 0xb3, 0xb7, 0xb5, 0xaf, 0xa9, 0xa9, 0xab, 0xa1, 0xa8, 0xae, 0xa9, + 0xa1, 0xa2, 0xa3, 0xa0, 0x9c, 0xae, 0xaf, 0x81, 0x4a, 0x4a, 0x81, 0xb1, + 0x78, 0xa3, 0xbd, 0xae, 0x8a, 0x89, 0x97, 0x7e, 0x6c, 0x6e, 0x7a, 0x9d, + 0x9d, 0x94, 0xa7, 0x9c, 0x8f, 0x90, 0x9b, 0xa4, 0xa1, 0xa1, 0xa7, 0xab, + 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0x97, 0x99, 0x9c, 0xa1, + 0xa5, 0xaa, 0xad, 0xaf, 0xaa, 0xa2, 0xae, 0xa7, 0xa3, 0xa5, 0x98, 0xa3, + 0x95, 0x7e, 0x9c, 0xa2, 0x77, 0x8c, 0xb6, 0xa2, 0x81, 0x9f, 0x88, 0x90, + 0xcf, 0xc8, 0x9c, 0xab, 0xb9, 0xbb, 0xb8, 0xac, 0x9a, 0x7c, 0x4b, 0x1c, + 0x46, 0xa0, 0xca, 0xb4, 0xab, 0xaf, 0xa1, 0x93, 0x79, 0x98, 0xaf, 0x9f, + 0x95, 0xa0, 0xa1, 0xa1, 0xab, 0xac, 0xad, 0xad, 0xae, 0xb2, 0xb9, 0xbf, + 0xc4, 0xc9, 0xce, 0xca, 0xbd, 0xaf, 0xaa, 0xac, 0xa0, 0x89, 0x60, 0x39, + 0x28, 0x2a, 0x2f, 0x2e, 0x2e, 0x31, 0x32, 0x31, 0x32, 0x34, 0x2e, 0x25, + 0x2e, 0x33, 0x39, 0x3e, 0x42, 0x46, 0x4a, 0x4d, 0x46, 0x4d, 0x54, 0x58, + 0x5d, 0x64, 0x62, 0x59, 0x64, 0x66, 0x65, 0x5e, 0x5c, 0x61, 0x63, 0x5f, + 0x63, 0x65, 0x68, 0x6a, 0x6a, 0x69, 0x67, 0x65, 0x5f, 0x62, 0x66, 0x69, + 0x6a, 0x68, 0x65, 0x62, 0x72, 0x73, 0x75, 0x77, 0x74, 0x68, 0x57, 0x4a, + 0x45, 0x38, 0x32, 0x44, 0x66, 0x80, 0x85, 0x80, 0x7e, 0x7c, 0x72, 0x60, + 0x54, 0x5b, 0x75, 0x8c, 0x8c, 0x81, 0x75, 0x72, 0x73, 0x6d, 0x5d, 0x4f, + 0x67, 0x64, 0x71, 0x83, 0x7a, 0x57, 0x40, 0x3f, 0x3f, 0x5c, 0x77, 0x73, + 0x57, 0x3d, 0x38, 0x3e, 0x46, 0x3e, 0x32, 0x2a, 0x2a, 0x30, 0x38, 0x3d, + 0x3d, 0x35, 0x2b, 0x28, 0x2c, 0x30, 0x30, 0x2e, 0x2f, 0x2e, 0x2d, 0x2a, + 0x28, 0x26, 0x24, 0x23, 0x23, 0x24, 0x1f, 0x24, 0x2a, 0x21, 0x30, 0x5b, + 0xa7, 0xa9, 0xa9, 0x90, 0x89, 0xa7, 0xb0, 0x9f, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa7, 0xb0, 0xb4, 0xad, 0xa8, 0xaa, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, + 0xa2, 0xa1, 0x9f, 0xa1, 0xa7, 0x95, 0x1b, 0x06, 0x74, 0x88, 0xa1, 0xb1, + 0xb4, 0xb1, 0xb0, 0xb1, 0xaa, 0xab, 0xa9, 0xa5, 0x9f, 0x9e, 0xa2, 0xa6, + 0x9e, 0xa9, 0xa7, 0xa2, 0xab, 0xad, 0xa1, 0x99, 0xb9, 0xb4, 0x72, 0x40, + 0x71, 0xac, 0x98, 0x67, 0x79, 0x9b, 0xac, 0xa1, 0x8a, 0x92, 0xae, 0xa8, + 0xa7, 0x8a, 0x67, 0x6c, 0x8a, 0xaa, 0xb2, 0x90, 0x9a, 0x94, 0x94, 0x9a, + 0xa1, 0xa5, 0xa5, 0xa1, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa1, 0xa1, 0x9d, 0xa2, 0xae, + 0xaf, 0x9f, 0x98, 0xa4, 0x7d, 0xb4, 0x81, 0x4d, 0x8e, 0xb6, 0x96, 0x8d, + 0x53, 0x86, 0xa2, 0xaf, 0xbc, 0xa6, 0x91, 0xa1, 0xba, 0x9e, 0xa4, 0xd1, + 0xb6, 0x4c, 0x3a, 0x92, 0xbf, 0xb8, 0xaa, 0x9d, 0xa1, 0xab, 0xa2, 0x8b, + 0x95, 0xab, 0xb6, 0xa3, 0x91, 0x9d, 0xab, 0xa8, 0xa3, 0xa5, 0xa8, 0xa9, + 0xa9, 0xa8, 0xa8, 0xa8, 0xac, 0xa9, 0xac, 0xb3, 0xb1, 0xa9, 0xa8, 0xaf, + 0xc6, 0xaf, 0xa4, 0xb6, 0xc9, 0xbd, 0x97, 0x76, 0x61, 0x5f, 0x59, 0x51, + 0x4d, 0x49, 0x3e, 0x32, 0x1e, 0x19, 0x18, 0x20, 0x2c, 0x33, 0x30, 0x2b, + 0x29, 0x2d, 0x2e, 0x31, 0x35, 0x37, 0x44, 0x5a, 0x58, 0x4c, 0x45, 0x45, + 0x46, 0x4c, 0x4c, 0x40, 0x49, 0x4d, 0x52, 0x57, 0x5a, 0x5a, 0x58, 0x56, + 0x59, 0x5c, 0x61, 0x66, 0x68, 0x67, 0x65, 0x64, 0x78, 0x75, 0x75, 0x7a, + 0x7b, 0x6e, 0x54, 0x3f, 0x4b, 0x2e, 0x1c, 0x34, 0x69, 0x93, 0x9b, 0x91, + 0x55, 0x62, 0x6f, 0x71, 0x6e, 0x71, 0x80, 0x8e, 0x9a, 0x89, 0x73, 0x63, + 0x5c, 0x59, 0x56, 0x53, 0x71, 0x71, 0x71, 0x69, 0x57, 0x54, 0x70, 0x94, + 0x77, 0x6a, 0x5b, 0x55, 0x55, 0x54, 0x4d, 0x45, 0x23, 0x2c, 0x3e, 0x58, + 0x70, 0x7d, 0x7d, 0x79, 0x5c, 0x52, 0x44, 0x38, 0x33, 0x33, 0x36, 0x39, + 0x3b, 0x39, 0x34, 0x2f, 0x29, 0x23, 0x1f, 0x1c, 0x21, 0x24, 0x26, 0x29, + 0x21, 0x20, 0x54, 0x9f, 0xa2, 0x99, 0x9f, 0x90, 0x92, 0xb5, 0xb6, 0xa6, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xab, 0xab, 0xa7, 0xa8, 0xac, 0xad, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xa7, 0xa7, 0xa6, + 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0xa1, 0xa0, 0xa1, 0xa8, 0x96, 0x1c, 0x07, + 0xa1, 0xa7, 0xac, 0xab, 0xa5, 0xa2, 0xa3, 0xa7, 0x9d, 0xa0, 0xa3, 0xa4, + 0xa4, 0xa4, 0xa6, 0xa8, 0xa3, 0x9c, 0xa7, 0xaa, 0x99, 0x9b, 0xac, 0xb0, + 0xa6, 0x5f, 0x4e, 0x8d, 0xb0, 0x8f, 0x77, 0x83, 0x9b, 0xa3, 0xa8, 0xac, + 0x95, 0x83, 0x9c, 0xaf, 0xac, 0xb2, 0xa9, 0x83, 0x74, 0x7c, 0x83, 0x97, + 0xae, 0xa4, 0x98, 0x97, 0xa4, 0xac, 0xaa, 0xa5, 0xa3, 0xa3, 0xa3, 0xa4, + 0xa4, 0xa5, 0xa5, 0xa5, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, + 0xa5, 0xae, 0x8f, 0x5f, 0x60, 0x83, 0x91, 0x8b, 0x9d, 0x33, 0x54, 0xb5, + 0xa7, 0x85, 0x92, 0x90, 0x77, 0x88, 0xb8, 0xc3, 0x9b, 0x91, 0xa3, 0x9f, + 0xb4, 0xb2, 0xb0, 0x6f, 0x28, 0x5b, 0xb4, 0xbe, 0xb0, 0xa7, 0xb7, 0xad, + 0x90, 0xa8, 0xaf, 0x75, 0x97, 0xa9, 0xa5, 0xa2, 0x93, 0x90, 0xac, 0xaa, + 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xaa, 0xa8, 0xa6, 0xab, 0xae, 0xac, 0xa9, + 0xad, 0xb0, 0xa4, 0x93, 0x69, 0x7e, 0x9f, 0xb7, 0xba, 0xb0, 0xad, 0xb2, + 0x81, 0xa0, 0xc2, 0xd3, 0xd6, 0xd4, 0xd0, 0xcc, 0xc2, 0xbd, 0xb7, 0xb2, + 0xa7, 0x92, 0x74, 0x5f, 0x37, 0x25, 0x22, 0x28, 0x2c, 0x37, 0x37, 0x23, + 0x32, 0x2c, 0x35, 0x35, 0x26, 0x26, 0x33, 0x33, 0x36, 0x31, 0x2a, 0x28, + 0x2c, 0x38, 0x45, 0x4e, 0x4e, 0x51, 0x55, 0x59, 0x5a, 0x58, 0x55, 0x53, + 0x68, 0x67, 0x69, 0x71, 0x75, 0x6b, 0x54, 0x3f, 0x38, 0x46, 0x64, 0x88, + 0x9a, 0x86, 0x55, 0x2c, 0x56, 0x68, 0x79, 0x79, 0x6b, 0x5c, 0x57, 0x59, + 0x51, 0x53, 0x51, 0x4a, 0x42, 0x40, 0x47, 0x4e, 0x3e, 0x5e, 0x79, 0x79, + 0x71, 0x72, 0x77, 0x78, 0x67, 0x5f, 0x4d, 0x36, 0x27, 0x2b, 0x3f, 0x51, + 0x88, 0x93, 0x9e, 0xa0, 0x99, 0x8f, 0x88, 0x86, 0x7c, 0x78, 0x6a, 0x52, + 0x38, 0x2b, 0x2f, 0x38, 0x35, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2c, 0x2b, + 0x25, 0x1f, 0x27, 0x26, 0x1e, 0x3e, 0x7a, 0x9d, 0x98, 0x99, 0xa0, 0x96, + 0xa1, 0xb7, 0xae, 0xa9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xaa, 0xad, + 0xa7, 0x9e, 0xa1, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, 0xa5, 0xa3, 0xa2, 0xa1, 0xa2, + 0xa8, 0x96, 0x1d, 0x08, 0xa4, 0xa2, 0xa1, 0xa4, 0xa7, 0xa8, 0xa5, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0x9a, 0x96, 0xb0, 0xaa, + 0x8c, 0xa7, 0xb8, 0x88, 0x45, 0x5d, 0xaa, 0xc5, 0x91, 0x88, 0x9e, 0x8d, + 0x6d, 0x8c, 0x9e, 0xa5, 0x99, 0x8f, 0x9d, 0xa0, 0xa7, 0xa4, 0xa9, 0x9b, + 0x92, 0x7a, 0x56, 0x67, 0xa2, 0xa4, 0x9c, 0x99, 0xa1, 0xa6, 0xa4, 0xa2, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa9, 0xa8, 0xa7, 0xa6, + 0xa4, 0xa3, 0xa2, 0xa1, 0xa5, 0xa0, 0xac, 0xaa, 0xa7, 0x8a, 0x5d, 0x64, + 0x2c, 0x8f, 0x92, 0x6c, 0x99, 0xc1, 0xb7, 0xbb, 0xa5, 0x7c, 0x92, 0xa4, + 0x8b, 0xa8, 0xcc, 0xad, 0xbe, 0x9f, 0x49, 0x3d, 0x90, 0xa9, 0x94, 0xaa, + 0xa2, 0xa6, 0xa5, 0xad, 0xbd, 0xb5, 0x99, 0x88, 0x99, 0xb0, 0xa9, 0xb0, + 0xa1, 0x8b, 0xa5, 0xab, 0xaf, 0xaa, 0xa5, 0xa4, 0xa6, 0xa9, 0xaa, 0xaa, + 0xa9, 0xae, 0xaf, 0xab, 0xa5, 0xa3, 0xa6, 0xa8, 0xba, 0xaa, 0x97, 0x94, + 0xa4, 0xaf, 0xa2, 0x8c, 0x91, 0xa0, 0xad, 0xad, 0xaa, 0xad, 0xb2, 0xb5, + 0xbc, 0xbf, 0xc2, 0xc5, 0xc6, 0xc8, 0xcb, 0xce, 0xd4, 0xd1, 0xd4, 0xa0, + 0x53, 0x60, 0x9b, 0xa5, 0x6c, 0x40, 0x2a, 0x2c, 0x2b, 0x34, 0x36, 0x23, + 0x21, 0x22, 0x23, 0x25, 0x28, 0x2b, 0x2e, 0x2f, 0x2f, 0x34, 0x3c, 0x44, + 0x4b, 0x4e, 0x4f, 0x4f, 0x45, 0x49, 0x52, 0x5d, 0x63, 0x60, 0x56, 0x4d, + 0x4c, 0x59, 0x64, 0x5f, 0x4d, 0x41, 0x42, 0x49, 0x41, 0x54, 0x6a, 0x74, + 0x71, 0x6f, 0x76, 0x7e, 0x53, 0x52, 0x4c, 0x41, 0x3b, 0x46, 0x5f, 0x75, + 0x50, 0x54, 0x4e, 0x43, 0x4d, 0x5f, 0x5a, 0x46, 0x4b, 0x36, 0x26, 0x35, + 0x5b, 0x79, 0x7f, 0x79, 0x9d, 0xa0, 0xa2, 0x9f, 0x96, 0x8a, 0x7f, 0x78, + 0x63, 0x59, 0x4b, 0x3e, 0x36, 0x31, 0x2b, 0x28, 0x41, 0x3f, 0x3b, 0x36, + 0x30, 0x2b, 0x27, 0x24, 0x1b, 0x2d, 0x1f, 0x20, 0x58, 0x87, 0x8d, 0x8e, + 0x91, 0x9d, 0x9b, 0x94, 0xa3, 0xab, 0xa2, 0xa8, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa5, 0xab, 0xa9, 0xa4, 0xa8, 0xb2, 0xb1, 0xa7, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa4, 0xa2, 0xa1, 0xa3, 0xa9, 0x97, 0x1d, 0x08, 0xaa, 0xa5, 0x9f, 0x9f, + 0xa2, 0xa4, 0xa3, 0xa0, 0xa5, 0xa3, 0xa0, 0x9e, 0x9e, 0xa0, 0xa1, 0xa2, + 0xaf, 0xa7, 0xa0, 0x9d, 0xa5, 0xb0, 0x8a, 0x47, 0x75, 0xb4, 0xbd, 0x93, + 0x80, 0x80, 0x82, 0x8d, 0x88, 0x95, 0x93, 0x94, 0x89, 0x81, 0x9b, 0xb1, + 0xab, 0x9e, 0x9e, 0xa8, 0xa6, 0x93, 0x87, 0x91, 0x75, 0x76, 0x6e, 0x75, + 0x94, 0xab, 0xad, 0xad, 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa4, 0xa3, + 0xa1, 0xa2, 0xa3, 0xa5, 0xa6, 0xa8, 0xa9, 0xa9, 0xad, 0xa9, 0xa9, 0xac, + 0xa6, 0x7f, 0x60, 0x72, 0xaf, 0x7d, 0x88, 0xaa, 0xa3, 0xa7, 0xb9, 0xae, + 0x99, 0x82, 0x90, 0x95, 0x7e, 0x8d, 0xa9, 0x9c, 0x3e, 0x14, 0x57, 0xbd, + 0xc0, 0xa7, 0xad, 0xaa, 0xaa, 0xa5, 0xa4, 0x9e, 0x9e, 0xae, 0xa5, 0x7e, + 0x94, 0xac, 0xac, 0xaf, 0xa8, 0x94, 0x9b, 0xab, 0xac, 0xaa, 0xab, 0xae, + 0xb1, 0xb0, 0xaa, 0xa5, 0xaf, 0xa9, 0xa9, 0xb0, 0xaf, 0xa6, 0xa4, 0xa9, + 0xab, 0xb4, 0xb3, 0xa1, 0x91, 0x92, 0x9e, 0xa7, 0xaf, 0xb0, 0xad, 0xa8, + 0xaa, 0xaf, 0xaf, 0xaa, 0xa6, 0xac, 0xb0, 0xae, 0xa9, 0xa6, 0xa8, 0xab, + 0xb3, 0xa7, 0xb3, 0xb5, 0x89, 0x68, 0x85, 0xb7, 0x94, 0x3b, 0x08, 0x21, + 0x5e, 0xaa, 0xd2, 0xc7, 0xc9, 0xc8, 0xc0, 0xae, 0x8e, 0x67, 0x42, 0x2c, + 0x27, 0x29, 0x2d, 0x2f, 0x2f, 0x2c, 0x28, 0x26, 0x3b, 0x44, 0x4f, 0x55, + 0x56, 0x56, 0x58, 0x5a, 0x4d, 0x4d, 0x44, 0x32, 0x27, 0x36, 0x5b, 0x7c, + 0x9c, 0xa4, 0xa5, 0x94, 0x76, 0x5d, 0x52, 0x52, 0x3e, 0x42, 0x46, 0x45, + 0x3f, 0x37, 0x30, 0x2d, 0x41, 0x3a, 0x39, 0x48, 0x60, 0x67, 0x53, 0x3a, + 0x38, 0x47, 0x5b, 0x6b, 0x75, 0x7d, 0x88, 0x90, 0x9c, 0x92, 0x86, 0x81, + 0x81, 0x80, 0x7a, 0x74, 0x69, 0x5f, 0x56, 0x59, 0x60, 0x60, 0x56, 0x4a, + 0x39, 0x38, 0x36, 0x33, 0x30, 0x2e, 0x2c, 0x2b, 0x16, 0x2f, 0x21, 0x3c, + 0x94, 0xaa, 0x8b, 0x90, 0x95, 0xa4, 0x9b, 0x9b, 0xa8, 0xa7, 0xa7, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xa8, 0xa7, 0xaa, 0xab, 0xa9, 0xa9, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa6, 0xa4, 0xa3, 0xa2, 0xa3, 0xa9, 0x97, 0x1e, 0x09, + 0xa0, 0xa1, 0xa2, 0xa1, 0xa0, 0xa1, 0xa3, 0xa5, 0xa9, 0xa8, 0xa6, 0xa6, + 0xa7, 0xa6, 0xa4, 0xa2, 0x9e, 0xa7, 0x97, 0xa5, 0xb5, 0x73, 0x4e, 0x8a, + 0xb4, 0xb3, 0x9a, 0x82, 0x8d, 0xa5, 0xa8, 0x9e, 0x9e, 0xad, 0xa9, 0xa3, + 0x93, 0x84, 0x94, 0xa2, 0xa6, 0x9f, 0x97, 0xa4, 0x99, 0x92, 0xa9, 0xa5, + 0x9d, 0x9b, 0x83, 0x6d, 0x73, 0x83, 0x92, 0xa1, 0xad, 0xac, 0xab, 0xa9, + 0xa8, 0xa6, 0xa5, 0xa4, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, + 0xad, 0xaa, 0x79, 0x72, 0x6d, 0x56, 0x75, 0x94, 0x82, 0xa9, 0xbf, 0xbd, + 0xb4, 0xa4, 0x9f, 0xae, 0xaf, 0x87, 0x65, 0x6a, 0x81, 0x77, 0x40, 0x0a, + 0x4f, 0x9e, 0xc4, 0xb1, 0xaa, 0xad, 0xaa, 0xa9, 0xa9, 0xa7, 0xa9, 0xa3, + 0xa1, 0xb1, 0xa6, 0x7c, 0x99, 0xaa, 0xad, 0xa7, 0xaa, 0x9c, 0x8f, 0xa1, + 0xac, 0xa8, 0xa5, 0xa6, 0xac, 0xaf, 0xae, 0xac, 0xa6, 0xaa, 0xab, 0xa8, + 0xaa, 0xae, 0xae, 0xa9, 0xa6, 0xa9, 0xaf, 0xb0, 0xa4, 0x96, 0x96, 0x9f, + 0xae, 0xb2, 0xb0, 0xa9, 0xa6, 0xa9, 0xab, 0xaa, 0xab, 0xaa, 0xa8, 0xa6, + 0xa6, 0xa8, 0xaa, 0xad, 0xa5, 0xb3, 0xa9, 0xb4, 0xbd, 0x75, 0x3a, 0x55, + 0x7d, 0x80, 0xb1, 0xd7, 0xcb, 0xc3, 0xc8, 0xbd, 0xb9, 0xbe, 0xc5, 0xcb, + 0xce, 0xcb, 0xc7, 0xc4, 0xa9, 0xa4, 0x98, 0x86, 0x70, 0x59, 0x46, 0x3b, + 0x2b, 0x35, 0x3d, 0x3b, 0x33, 0x31, 0x38, 0x40, 0x4a, 0x50, 0x5c, 0x69, + 0x6e, 0x68, 0x5a, 0x4e, 0x61, 0x71, 0x7f, 0x7c, 0x6b, 0x5a, 0x53, 0x54, + 0x51, 0x43, 0x35, 0x37, 0x47, 0x5b, 0x67, 0x6b, 0x68, 0x5b, 0x5f, 0x77, + 0x81, 0x72, 0x5e, 0x57, 0x69, 0x75, 0x82, 0x85, 0x7a, 0x6b, 0x5f, 0x5a, + 0x60, 0x6f, 0x83, 0x8d, 0x88, 0x79, 0x68, 0x5e, 0x58, 0x60, 0x64, 0x5e, + 0x4e, 0x40, 0x3b, 0x3b, 0x3b, 0x39, 0x36, 0x32, 0x2e, 0x29, 0x26, 0x25, + 0x25, 0x15, 0x2c, 0x6d, 0x97, 0x90, 0x83, 0x87, 0x99, 0xa6, 0x9a, 0xa1, + 0xa9, 0xa3, 0xaa, 0xa8, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xab, 0xa5, 0xa5, 0xab, + 0xac, 0xa7, 0xa7, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, 0xa3, 0xa2, 0xa3, + 0xa9, 0x97, 0x1e, 0x09, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa3, 0xa0, 0xac, 0xa7, 0xa6, 0xa5, 0x97, 0x9e, 0x99, 0xa8, 0xb5, 0xa4, + 0x5e, 0x4d, 0x8e, 0xa9, 0xb6, 0x99, 0x81, 0x91, 0xae, 0xa9, 0xa1, 0xb0, + 0x9c, 0xa3, 0xa8, 0xad, 0xa3, 0x8b, 0x8f, 0xaf, 0xaa, 0x9c, 0x8e, 0x8d, + 0x9a, 0xa6, 0xab, 0xaa, 0xab, 0xa4, 0xa1, 0x9e, 0x8e, 0x74, 0x61, 0x5b, + 0x6a, 0x7f, 0x94, 0x9e, 0xa7, 0xb2, 0xb5, 0xb2, 0xa2, 0xb5, 0xb7, 0xad, + 0xae, 0xaf, 0xb0, 0xb7, 0xb2, 0xab, 0x91, 0x4f, 0x54, 0x86, 0x8e, 0xa5, + 0xb0, 0xb0, 0xaa, 0xa3, 0xa6, 0xac, 0xaa, 0xa5, 0xaa, 0x9f, 0x7b, 0x73, + 0x6f, 0x3f, 0x49, 0xa1, 0xb9, 0xb6, 0xb1, 0xac, 0xa8, 0xa5, 0xa4, 0xa3, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, 0x9b, 0xa4, 0xa9, 0xa7, + 0xa5, 0xa4, 0x9c, 0x92, 0xaa, 0xaf, 0xac, 0xa4, 0xa3, 0xaa, 0xab, 0xa5, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x87, 0x9b, 0xab, 0xab, 0xa7, 0xa9, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xb2, 0xaa, 0xa1, 0xab, + 0xad, 0x86, 0x58, 0x4d, 0x6c, 0xaa, 0xc3, 0xac, 0xa3, 0xab, 0xab, 0xa7, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb7, 0xbf, 0xca, 0xd2, + 0xd2, 0xca, 0xbf, 0xb7, 0x85, 0x5c, 0x2a, 0x0f, 0x12, 0x1e, 0x24, 0x23, + 0x2f, 0x36, 0x3a, 0x3a, 0x3f, 0x42, 0x37, 0x26, 0x41, 0x4f, 0x60, 0x6b, + 0x6a, 0x5e, 0x50, 0x46, 0x48, 0x4f, 0x58, 0x5d, 0x63, 0x72, 0x88, 0x9a, + 0x9a, 0x94, 0x8f, 0x91, 0x94, 0x8c, 0x7a, 0x6a, 0x79, 0x70, 0x64, 0x5a, + 0x56, 0x5a, 0x62, 0x68, 0x76, 0x83, 0x7e, 0x67, 0x61, 0x6c, 0x69, 0x58, + 0x5a, 0x5b, 0x5c, 0x5a, 0x55, 0x4d, 0x45, 0x3f, 0x3e, 0x34, 0x2a, 0x27, + 0x2c, 0x2f, 0x2c, 0x27, 0x1c, 0x5f, 0x97, 0x89, 0x95, 0x9c, 0x7c, 0x90, + 0xaa, 0x9b, 0xa2, 0xac, 0xa5, 0xa6, 0xac, 0xa6, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, + 0xa4, 0xa3, 0xa1, 0xa2, 0xab, 0x9e, 0x16, 0x07, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa3, 0xa6, 0x97, 0xaf, 0xb1, 0x9a, 0xa9, 0xaa, + 0x9f, 0xa8, 0xa5, 0x58, 0x4b, 0x96, 0xb4, 0xbc, 0x9a, 0x88, 0x91, 0xa8, + 0xaa, 0xa6, 0xa7, 0xa2, 0x9d, 0xa3, 0xa8, 0xac, 0xa4, 0x8d, 0x8f, 0xac, + 0xa6, 0x9b, 0x90, 0x91, 0x9d, 0xa7, 0xaa, 0xa8, 0xa5, 0xaa, 0xae, 0xaf, + 0xae, 0xaa, 0xa3, 0x9d, 0x99, 0x8e, 0x7e, 0x72, 0x6a, 0x66, 0x67, 0x6a, + 0x7e, 0x75, 0x82, 0x8e, 0x88, 0x87, 0x7d, 0x61, 0x5c, 0x87, 0x83, 0x6a, + 0x8e, 0x87, 0x4f, 0x5e, 0xa3, 0xa4, 0x9e, 0x9f, 0xac, 0xad, 0xa3, 0x9f, + 0xae, 0xbe, 0xa9, 0x7d, 0x5a, 0x8a, 0xcc, 0xb0, 0xb2, 0xb0, 0xad, 0xaa, + 0xa8, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0x9d, 0xa6, 0xaa, 0xa8, 0xa7, 0xa6, 0x9f, 0x95, 0xa4, 0xab, 0xad, 0xa7, + 0xa5, 0xaa, 0xab, 0xa7, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa2, 0x99, 0x98, 0xa4, + 0xac, 0xab, 0xa9, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa2, 0xb1, 0xab, 0x94, 0xa4, 0xac, 0x88, 0x62, 0x8f, 0xa9, 0xaa, + 0xae, 0xae, 0xa6, 0xa3, 0xab, 0xab, 0xac, 0xac, 0xad, 0xae, 0xaf, 0xaf, + 0xb8, 0xb4, 0xae, 0xaa, 0xaa, 0xae, 0xb4, 0xb8, 0xb9, 0xbd, 0xc5, 0xcf, + 0xcf, 0xbd, 0x9e, 0x86, 0x5f, 0x40, 0x3c, 0x5a, 0x6c, 0x68, 0x74, 0x90, + 0x8d, 0x7e, 0x6e, 0x69, 0x6a, 0x65, 0x58, 0x4b, 0x74, 0x77, 0x78, 0x72, + 0x6d, 0x71, 0x7e, 0x8b, 0x8a, 0x74, 0x56, 0x40, 0x3b, 0x42, 0x4c, 0x54, + 0x57, 0x54, 0x4e, 0x48, 0x42, 0x3d, 0x3b, 0x39, 0x51, 0x5d, 0x66, 0x67, + 0x66, 0x64, 0x59, 0x4c, 0x4c, 0x4f, 0x53, 0x57, 0x57, 0x55, 0x52, 0x50, + 0x28, 0x2c, 0x30, 0x2f, 0x2a, 0x27, 0x28, 0x2a, 0x16, 0x61, 0x91, 0x93, + 0xa3, 0x9c, 0x85, 0xa2, 0xb1, 0xa1, 0x9b, 0xa0, 0xa2, 0xa6, 0xad, 0xaf, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa3, 0xab, 0x9e, 0x17, 0x07, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa6, 0x9a, 0xa2, 0xa3, + 0x9f, 0xac, 0xac, 0x9b, 0xb1, 0x9c, 0x55, 0x4b, 0x91, 0xb1, 0xa9, 0xaf, + 0x83, 0x88, 0xa0, 0xaf, 0xa6, 0xa3, 0xa6, 0x9f, 0x9d, 0xa4, 0xa7, 0xab, + 0xa5, 0x91, 0x90, 0xa6, 0xa1, 0x9a, 0x94, 0x98, 0xa2, 0xa9, 0xa8, 0xa5, + 0xa0, 0xa8, 0xaa, 0xa4, 0xa4, 0xaa, 0xa8, 0x9f, 0x8d, 0x8a, 0x95, 0xaa, + 0xb6, 0xaf, 0xa5, 0xa3, 0x99, 0x9e, 0x9d, 0x95, 0x90, 0x93, 0xa3, 0xb6, + 0xcb, 0x91, 0x62, 0x75, 0xa8, 0xb0, 0xa6, 0xb9, 0xac, 0xa5, 0xa2, 0xa2, + 0xa1, 0xa5, 0xa8, 0xa6, 0xc1, 0x8a, 0x54, 0x3d, 0x81, 0xc0, 0xaa, 0xa4, + 0xaa, 0xa9, 0xa7, 0xa7, 0xa7, 0xa9, 0xab, 0xad, 0xa8, 0xa8, 0xaa, 0xa7, + 0xa7, 0xae, 0xa0, 0x82, 0xa0, 0xa8, 0xad, 0xaa, 0xa9, 0xa9, 0xa2, 0x9a, + 0x9b, 0xa6, 0xad, 0xac, 0xa8, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xb1, 0xa0, 0x95, 0x9c, 0xa7, 0xaa, 0xa9, 0xaa, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa5, 0xb0, 0xaf, 0x9c, 0x93, 0xa5, 0xb6, 0xb5, + 0xb9, 0xba, 0xb3, 0xae, 0xaf, 0xaa, 0xa8, 0xaf, 0xaa, 0xaa, 0xaa, 0xab, + 0xab, 0xac, 0xac, 0xad, 0xb1, 0xac, 0xa5, 0xa1, 0xa1, 0xa5, 0xac, 0xb1, + 0xb4, 0xb5, 0xb6, 0xb6, 0xb8, 0xbc, 0xc2, 0xc6, 0xc4, 0xaf, 0x80, 0x52, + 0x49, 0x59, 0x5a, 0x49, 0x45, 0x4d, 0x53, 0x4d, 0x43, 0x43, 0x4f, 0x5c, + 0x71, 0x6a, 0x64, 0x65, 0x6d, 0x75, 0x79, 0x7a, 0x64, 0x72, 0x82, 0x88, + 0x7f, 0x6e, 0x5e, 0x54, 0x5f, 0x56, 0x48, 0x3f, 0x40, 0x4a, 0x58, 0x62, + 0x51, 0x50, 0x52, 0x57, 0x57, 0x52, 0x50, 0x52, 0x48, 0x49, 0x49, 0x48, + 0x45, 0x41, 0x3d, 0x3a, 0x36, 0x34, 0x2e, 0x25, 0x20, 0x24, 0x31, 0x3c, + 0x48, 0x9d, 0x9f, 0x8b, 0xa3, 0xa2, 0x8b, 0x89, 0xaa, 0xa1, 0x98, 0xa0, + 0xae, 0xae, 0xa8, 0xaa, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa4, 0xa2, 0xa3, + 0xac, 0x9f, 0x17, 0x08, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa7, 0xa1, 0xa0, 0x98, 0xab, 0xab, 0x96, 0xb6, 0xa0, 0x57, 0x52, 0xa5, + 0xb4, 0xa3, 0xa7, 0x76, 0x85, 0xa0, 0xa7, 0xa1, 0xa5, 0xa4, 0xa2, 0xa9, + 0x9f, 0xa5, 0xa7, 0xa9, 0xa7, 0x96, 0x90, 0x9f, 0x9c, 0x99, 0x99, 0x9e, + 0xa6, 0xa9, 0xa7, 0xa3, 0xa6, 0xaa, 0xaa, 0xa6, 0xa7, 0xac, 0xae, 0xab, + 0xb7, 0xa7, 0x99, 0x96, 0x99, 0xa0, 0xaa, 0xb5, 0xaa, 0xbb, 0xb7, 0xae, + 0xb3, 0xb2, 0xb0, 0xba, 0x7c, 0x53, 0x6e, 0xb7, 0xc3, 0xb2, 0xb2, 0xa7, + 0xbc, 0xb5, 0xba, 0xb5, 0xaa, 0xb8, 0xbd, 0xa3, 0x53, 0x2d, 0x77, 0x96, + 0x7d, 0x99, 0xa8, 0xa3, 0xa7, 0xa6, 0xa5, 0xa5, 0xa6, 0xa9, 0xab, 0xad, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, 0xa3, 0xab, 0xae, 0xac, + 0xab, 0xab, 0xa7, 0x9e, 0x95, 0xa1, 0xac, 0xae, 0xab, 0xa9, 0xaa, 0xac, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xad, 0xa8, 0x9d, 0x9b, 0xa4, 0xaa, 0xa8, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xb6, 0xa8, 0xab, 0xa3, + 0x8c, 0x9b, 0xb0, 0xa4, 0xae, 0xa7, 0xa2, 0xa7, 0xad, 0xab, 0xaa, 0xb0, + 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xac, + 0xac, 0xab, 0xab, 0xaa, 0xa1, 0xa6, 0xaa, 0xaa, 0xa7, 0xa5, 0xa8, 0xab, + 0xaa, 0xa1, 0x75, 0x43, 0x44, 0x6a, 0x75, 0x60, 0x59, 0x4c, 0x3b, 0x33, + 0x39, 0x4d, 0x65, 0x76, 0x7a, 0x68, 0x59, 0x5f, 0x73, 0x7e, 0x76, 0x69, + 0x77, 0x79, 0x75, 0x65, 0x50, 0x44, 0x46, 0x4d, 0x4c, 0x5c, 0x71, 0x81, + 0x83, 0x76, 0x62, 0x54, 0x59, 0x54, 0x49, 0x3e, 0x39, 0x3b, 0x3f, 0x41, + 0x3c, 0x3d, 0x3d, 0x3e, 0x3e, 0x3d, 0x3c, 0x3c, 0x55, 0x4c, 0x41, 0x38, + 0x34, 0x33, 0x32, 0x31, 0x56, 0x97, 0x87, 0x88, 0x8c, 0x5d, 0x6d, 0xa5, + 0xaf, 0xa5, 0x91, 0x94, 0xac, 0xaf, 0xaa, 0xb3, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, + 0xa5, 0xa4, 0xa3, 0xa4, 0xad, 0x9f, 0x18, 0x09, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa1, 0xac, 0xa2, 0xa7, 0xa4, 0xa5, 0xb5, 0x9f, + 0x5f, 0x5a, 0xab, 0xc3, 0xa0, 0xa5, 0x99, 0x7c, 0x9a, 0xaf, 0xac, 0x9f, + 0xa4, 0xa9, 0xa6, 0xa7, 0xa0, 0xa6, 0xa6, 0xa7, 0xa9, 0x9c, 0x91, 0x97, + 0x99, 0x9a, 0x9c, 0xa2, 0xa7, 0xa9, 0xa7, 0xa4, 0xa4, 0x9f, 0x9f, 0xa3, + 0xa5, 0xa4, 0xa7, 0xae, 0xa8, 0xab, 0xa7, 0x9d, 0x98, 0x9c, 0xa0, 0xa1, + 0xaf, 0xa3, 0x9f, 0x9b, 0x9a, 0xa7, 0x9f, 0x7d, 0x59, 0x80, 0xab, 0xc2, + 0xb4, 0x9d, 0x91, 0x84, 0x6f, 0x78, 0x8e, 0xae, 0xc6, 0xb4, 0x6c, 0x22, + 0x6c, 0x9c, 0x99, 0xa0, 0x91, 0x77, 0x9c, 0xb0, 0xaa, 0xa9, 0xa7, 0xa6, + 0xa6, 0xa7, 0xa9, 0xaa, 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xac, 0xaf, 0xac, 0xab, 0xad, 0xaa, 0xa2, 0x96, 0x9d, 0xa8, 0xae, + 0xad, 0xaa, 0xa9, 0xac, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xaf, 0xb2, 0xa6, + 0x9d, 0x9f, 0xa4, 0xa5, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xb2, 0xaa, 0xa1, 0x99, 0x9c, 0xaf, 0xb2, 0xa0, 0xa1, 0xa4, 0xab, 0xb0, + 0xb1, 0xaf, 0xaa, 0xa3, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, + 0xac, 0xaa, 0xa8, 0xa7, 0xa7, 0xa8, 0xaa, 0xac, 0xb1, 0xaf, 0xad, 0xaa, + 0xaa, 0xaa, 0xab, 0xac, 0xa5, 0xa1, 0x8b, 0x67, 0x4e, 0x48, 0x45, 0x40, + 0x42, 0x4f, 0x5a, 0x58, 0x4e, 0x4b, 0x55, 0x62, 0x6b, 0x63, 0x5d, 0x62, + 0x6e, 0x75, 0x73, 0x6d, 0x67, 0x71, 0x79, 0x75, 0x68, 0x5e, 0x5d, 0x62, + 0x72, 0x68, 0x59, 0x4c, 0x44, 0x44, 0x48, 0x4c, 0x5e, 0x76, 0x84, 0x7f, + 0x7b, 0x78, 0x64, 0x48, 0x4e, 0x4c, 0x4a, 0x47, 0x44, 0x42, 0x41, 0x41, + 0x37, 0x31, 0x28, 0x22, 0x22, 0x28, 0x30, 0x36, 0x6d, 0xb2, 0x94, 0x89, + 0x8e, 0x73, 0x91, 0xb6, 0xac, 0xa3, 0x90, 0x95, 0xad, 0xb1, 0xab, 0xb4, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, + 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa5, 0xad, 0xa0, 0x19, 0x09, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0x9f, 0xa5, 0xab, 0xa4, + 0xa1, 0xb4, 0x9e, 0x52, 0x69, 0xa7, 0xbc, 0xab, 0xa8, 0x90, 0x82, 0xac, + 0xa9, 0xa9, 0xb1, 0xad, 0xa4, 0xac, 0xae, 0x9b, 0xa1, 0xa7, 0xa5, 0xa5, + 0xab, 0xa1, 0x91, 0x90, 0x9a, 0x9b, 0x9f, 0xa2, 0xa6, 0xa8, 0xa8, 0xa7, + 0xb2, 0xa9, 0xa6, 0xab, 0xa9, 0xa1, 0xa1, 0xa8, 0xa2, 0xad, 0xaf, 0xa5, + 0xa0, 0xa6, 0xab, 0xa9, 0xa1, 0x9e, 0xa1, 0xab, 0xb4, 0xa9, 0x7b, 0x49, + 0x8b, 0x92, 0x7e, 0x58, 0x52, 0x68, 0x80, 0x98, 0x97, 0x9c, 0x81, 0x5a, + 0x37, 0x1e, 0x4f, 0xb1, 0xae, 0xa6, 0x93, 0xaf, 0xa4, 0x76, 0x8b, 0xad, + 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa7, 0xa8, 0xa9, 0xa8, 0xa8, 0xaa, 0xa7, + 0xa7, 0xae, 0xa0, 0x82, 0xa6, 0xac, 0xae, 0xaa, 0xaa, 0xad, 0xab, 0xa5, + 0x9e, 0x9d, 0xa1, 0xaa, 0xad, 0xaa, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xad, 0xa9, 0xaa, 0xae, 0xab, 0xa1, 0x9e, 0xa2, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xa5, 0x8d, 0x91, 0xb4, 0xb2, 0xa4, 0xb2, + 0xa4, 0xa6, 0xab, 0xa8, 0xa4, 0xad, 0xb2, 0xaa, 0xad, 0xac, 0xac, 0xab, + 0xab, 0xaa, 0xaa, 0xaa, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, + 0xac, 0xa8, 0xa4, 0xa5, 0xaa, 0xaf, 0xb1, 0xb0, 0xb1, 0xb5, 0xa6, 0x7d, + 0x53, 0x45, 0x52, 0x63, 0x54, 0x3c, 0x2a, 0x33, 0x4e, 0x5e, 0x56, 0x45, + 0x59, 0x65, 0x6f, 0x6e, 0x66, 0x66, 0x71, 0x7c, 0x81, 0x84, 0x84, 0x7b, + 0x6d, 0x5e, 0x55, 0x51, 0x68, 0x64, 0x5e, 0x57, 0x50, 0x4c, 0x49, 0x48, + 0xa4, 0xab, 0x99, 0x74, 0x66, 0x70, 0x6e, 0x5b, 0x58, 0x54, 0x4c, 0x44, + 0x3d, 0x38, 0x35, 0x34, 0x2f, 0x30, 0x2c, 0x20, 0x1a, 0x27, 0x44, 0x5d, + 0xa2, 0xa6, 0x7a, 0x92, 0xa4, 0x79, 0x84, 0xa0, 0xa0, 0x9a, 0x96, 0xa2, + 0xb3, 0xb3, 0xab, 0xac, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa4, 0xa5, + 0xae, 0xa1, 0x19, 0x0a, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa7, 0xa1, 0xa1, 0xa0, 0xb4, 0x92, 0x51, 0x6a, 0xb0, 0xac, 0x9b, 0xb1, + 0xa0, 0x80, 0xa0, 0xad, 0xa6, 0xa5, 0xae, 0xaf, 0xa4, 0xa8, 0xab, 0x9f, + 0xa2, 0xa8, 0xa4, 0xa4, 0xad, 0xa5, 0x92, 0x8a, 0x9c, 0x9d, 0xa0, 0xa1, + 0xa3, 0xa6, 0xa9, 0xac, 0xa8, 0xa7, 0xa7, 0xa8, 0xa8, 0xa5, 0xa3, 0xa4, + 0xac, 0xa8, 0xa0, 0x98, 0x96, 0x9b, 0xa3, 0xa7, 0xa9, 0xaa, 0xa4, 0xad, + 0xb5, 0x8c, 0x55, 0x42, 0x1e, 0x4b, 0x9d, 0xbe, 0xc0, 0xc0, 0xb5, 0xc0, + 0xd2, 0xc7, 0x77, 0x29, 0x4a, 0xa4, 0xca, 0xc0, 0xb1, 0x8f, 0x9c, 0xae, + 0xab, 0x8f, 0x7a, 0xa1, 0xaf, 0xad, 0xab, 0xa9, 0xa8, 0xa9, 0xaa, 0xab, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, 0xa5, 0xab, 0xac, 0xa9, + 0xa9, 0xad, 0xac, 0xa6, 0xa7, 0x9d, 0x9b, 0xa5, 0xad, 0xab, 0xa8, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xb0, 0xa8, 0xa6, 0xad, 0xad, 0xa5, 0x9f, 0xa0, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xae, 0x89, 0x93, 0xb1, + 0xa9, 0xa2, 0xac, 0xac, 0xb1, 0xab, 0xaf, 0xaf, 0xa9, 0xaf, 0xb2, 0xa5, + 0xaf, 0xaf, 0xae, 0xad, 0xac, 0xac, 0xab, 0xab, 0xab, 0xad, 0xb1, 0xb3, + 0xb3, 0xb1, 0xad, 0xab, 0xaf, 0xac, 0xaa, 0xa9, 0xaa, 0xa9, 0xa7, 0xa4, + 0xac, 0xa8, 0xae, 0xac, 0x85, 0x4d, 0x37, 0x42, 0x51, 0x57, 0x60, 0x69, + 0x6b, 0x66, 0x5d, 0x56, 0x78, 0x82, 0x88, 0x82, 0x75, 0x6e, 0x73, 0x7c, + 0x61, 0x65, 0x6c, 0x72, 0x70, 0x63, 0x4f, 0x40, 0x36, 0x39, 0x3c, 0x3e, + 0x3e, 0x3c, 0x39, 0x36, 0x36, 0x44, 0x4b, 0x47, 0x48, 0x4d, 0x47, 0x39, + 0x3f, 0x3d, 0x39, 0x36, 0x36, 0x38, 0x3c, 0x3e, 0x3c, 0x41, 0x3e, 0x30, + 0x20, 0x20, 0x32, 0x45, 0x8d, 0xa4, 0x8b, 0x81, 0x82, 0x81, 0x97, 0x97, + 0xa2, 0x96, 0x98, 0xa4, 0xa9, 0xae, 0xb2, 0xb3, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xa9, 0xa9, + 0xa7, 0xa6, 0xa5, 0xa6, 0xaf, 0xa1, 0x1a, 0x0b, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xaf, 0x9b, 0xa7, 0xbf, 0x87, 0x4d, 0x79, 0xb3, + 0xb0, 0x96, 0xa6, 0x9d, 0x8d, 0xa7, 0xb1, 0xa6, 0x9e, 0xaa, 0xa6, 0xa1, + 0xa5, 0xa2, 0xa1, 0xaf, 0xa2, 0xa9, 0xa4, 0xa3, 0xad, 0xa7, 0x92, 0x87, + 0x9d, 0x9f, 0xa0, 0xa0, 0xa1, 0xa4, 0xaa, 0xae, 0xa3, 0xaa, 0xab, 0xa5, + 0xa3, 0xa6, 0xa2, 0x9a, 0x95, 0x8e, 0x90, 0x9e, 0xa8, 0xa9, 0xa9, 0xac, + 0x9d, 0xa3, 0xbf, 0xc0, 0x88, 0x56, 0x61, 0x83, 0x6c, 0x92, 0xc5, 0xb6, + 0xaa, 0xb1, 0xac, 0xce, 0x86, 0x2b, 0x2c, 0x8e, 0xc8, 0xc2, 0xb1, 0xa3, + 0xa2, 0x93, 0x97, 0xae, 0xb4, 0x9a, 0x81, 0x84, 0xae, 0xad, 0xab, 0xaa, + 0xaa, 0xab, 0xad, 0xaf, 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xaa, 0xab, 0xa7, 0xa8, 0xac, 0xab, 0xa6, 0xae, 0x9e, 0x97, 0xa1, + 0xac, 0xab, 0xa7, 0xa6, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0xae, 0xa6, + 0xa5, 0xa8, 0xa6, 0x9f, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x99, 0x9a, 0xae, 0xb9, 0xad, 0xaa, 0xb0, 0xac, 0xb5, 0xa5, 0xa6, 0xac, + 0xa9, 0xaf, 0xb3, 0xa7, 0xb1, 0xb0, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, + 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xab, 0xad, 0xaf, 0xaf, + 0xad, 0xac, 0xab, 0xac, 0xb9, 0xaa, 0xa8, 0xb1, 0x9d, 0x6c, 0x47, 0x3f, + 0x4d, 0x5b, 0x69, 0x6c, 0x65, 0x62, 0x68, 0x71, 0x6e, 0x6c, 0x6c, 0x72, + 0x7b, 0x7f, 0x7d, 0x78, 0x76, 0x6e, 0x67, 0x67, 0x68, 0x60, 0x4e, 0x3e, + 0x59, 0x4e, 0x3d, 0x30, 0x2e, 0x36, 0x43, 0x4c, 0x37, 0x37, 0x3a, 0x3f, + 0x3f, 0x3c, 0x3a, 0x3b, 0x48, 0x44, 0x3f, 0x3a, 0x39, 0x3a, 0x3d, 0x40, + 0x4e, 0x45, 0x37, 0x28, 0x23, 0x2d, 0x41, 0x52, 0x9d, 0xa0, 0x88, 0x79, + 0x79, 0x89, 0xa4, 0x9e, 0x98, 0x8f, 0x9f, 0xb1, 0xae, 0xaf, 0xb2, 0xaa, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xab, + 0xab, 0xaa, 0xa9, 0xa9, 0xa8, 0xa7, 0xa5, 0xa6, 0xaf, 0xa2, 0x1a, 0x0b, + 0xac, 0xad, 0x9f, 0xa6, 0xa8, 0xa2, 0xa9, 0x9e, 0xa5, 0xa5, 0xb6, 0x85, + 0x52, 0x77, 0xa7, 0xb5, 0xab, 0xa6, 0x95, 0x8b, 0x98, 0xaa, 0xab, 0xa4, + 0xa6, 0xa6, 0xa7, 0xa7, 0xa6, 0xa4, 0xa1, 0x9f, 0xa3, 0x9b, 0xa1, 0xa1, + 0xac, 0xa2, 0x7e, 0x8c, 0x9b, 0x98, 0xa0, 0xa3, 0x9b, 0x9f, 0xa9, 0xa7, + 0xa2, 0xa3, 0xa5, 0xa6, 0xa7, 0xa6, 0xa5, 0xa4, 0xa1, 0xa9, 0xac, 0xa7, + 0xa6, 0xac, 0xb2, 0xb2, 0xb4, 0xa1, 0x7d, 0x5b, 0x46, 0x71, 0xb8, 0xbc, + 0xbb, 0x88, 0x48, 0x7c, 0xb1, 0xb9, 0xaa, 0x44, 0x15, 0x85, 0xc0, 0xbd, + 0xb3, 0xad, 0xaf, 0xab, 0x96, 0x74, 0x95, 0xa5, 0xab, 0xba, 0x9b, 0x87, + 0xa2, 0xb4, 0xad, 0xaa, 0xac, 0xa7, 0xaa, 0xa7, 0xa9, 0xac, 0xa6, 0xa5, + 0xa8, 0xb4, 0x90, 0x85, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0x9a, 0x93, 0xa3, 0xa9, 0xa8, 0xb2, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0x9b, 0xa7, 0xa5, 0xa5, + 0xb0, 0xab, 0x9f, 0xa1, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb0, 0xac, 0xac, 0xaf, + 0xa2, 0x7c, 0x4b, 0x28, 0x47, 0x55, 0x60, 0x5e, 0x58, 0x59, 0x62, 0x68, + 0x64, 0x67, 0x6b, 0x6c, 0x68, 0x60, 0x57, 0x51, 0x5e, 0x5c, 0x55, 0x4a, + 0x41, 0x44, 0x52, 0x5e, 0x34, 0x3f, 0x4b, 0x4f, 0x49, 0x40, 0x3c, 0x3b, + 0x40, 0x3b, 0x36, 0x36, 0x3a, 0x3c, 0x3a, 0x37, 0x3d, 0x3a, 0x36, 0x31, + 0x2f, 0x2e, 0x2f, 0x30, 0x39, 0x32, 0x30, 0x28, 0x31, 0x35, 0x31, 0x4e, + 0xa2, 0xac, 0x88, 0x7c, 0x85, 0x8c, 0xa4, 0xa4, 0x8c, 0x9a, 0x9e, 0xa4, + 0xb3, 0xb2, 0xaa, 0xb1, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xae, 0xac, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaa, 0xab, 0xad, 0xb0, + 0xb8, 0xa8, 0x1c, 0x0a, 0xa4, 0x9b, 0xae, 0xae, 0xa5, 0xa5, 0x9d, 0xa3, + 0xa6, 0xb7, 0x7f, 0x56, 0x7b, 0xae, 0xbb, 0x9f, 0xab, 0xa1, 0x88, 0x8b, + 0xa9, 0xab, 0x9f, 0xa9, 0xa5, 0xa6, 0xa6, 0xa5, 0xa3, 0xa4, 0xa8, 0xab, + 0xad, 0xa8, 0xa5, 0xa5, 0xad, 0x9f, 0x87, 0x8f, 0x96, 0x98, 0xa7, 0xaf, + 0xa7, 0xa6, 0xaa, 0xa4, 0xaa, 0xa9, 0xa8, 0xa7, 0xa7, 0xa8, 0xa9, 0xaa, + 0xa7, 0xaa, 0xaf, 0xb6, 0xb7, 0xaa, 0x8f, 0x77, 0x67, 0x91, 0xaa, 0x82, + 0x87, 0xaf, 0xac, 0xb6, 0xac, 0x7d, 0x60, 0x84, 0x5c, 0x0f, 0x1a, 0x1e, + 0x92, 0xaf, 0xb1, 0xaf, 0xab, 0xa1, 0xa4, 0xa3, 0xb0, 0x8d, 0xad, 0xbd, + 0xb5, 0xaf, 0x92, 0x8c, 0x9f, 0xb2, 0xab, 0xa9, 0xac, 0xa7, 0xab, 0xa8, + 0xa9, 0xac, 0xa6, 0xa6, 0xa9, 0xb3, 0x90, 0x86, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xac, 0xa2, 0x96, 0x9d, 0xa9, 0xad, 0xad, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x90, 0x9d, 0xa7, 0xa8, 0xa9, 0xaf, 0xab, 0x9c, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaf, 0xb0, 0xb3, 0xb6, 0xb1, 0x9a, 0x72, 0x52, 0x56, 0x60, 0x67, 0x66, + 0x60, 0x60, 0x66, 0x6c, 0x5f, 0x63, 0x69, 0x6f, 0x72, 0x71, 0x6f, 0x6e, + 0x5c, 0x4f, 0x46, 0x4d, 0x61, 0x73, 0x78, 0x76, 0x65, 0x69, 0x6a, 0x65, + 0x5e, 0x5c, 0x60, 0x66, 0x6c, 0x5c, 0x47, 0x39, 0x35, 0x38, 0x3b, 0x3c, + 0x3c, 0x38, 0x31, 0x2b, 0x2a, 0x32, 0x41, 0x4c, 0x49, 0x34, 0x30, 0x28, + 0x24, 0x2c, 0x46, 0x79, 0x99, 0xaa, 0x8d, 0x75, 0x77, 0x8b, 0xa6, 0x9d, + 0x8c, 0x99, 0x9e, 0xa5, 0xb3, 0xb2, 0xac, 0xb1, 0xac, 0xad, 0xaf, 0xb0, + 0xb0, 0xaf, 0xad, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaa, 0xac, 0xad, 0xb0, 0xb8, 0xa7, 0x1c, 0x0a, 0xa3, 0xa3, 0xa3, 0x9c, + 0xae, 0xb6, 0xa1, 0xa9, 0xb8, 0x7b, 0x52, 0x83, 0xb0, 0xa9, 0xa8, 0xa4, + 0xab, 0x8f, 0x80, 0x97, 0xaf, 0xa8, 0x9f, 0xa7, 0xa4, 0xa9, 0xac, 0xaa, + 0xa4, 0xa3, 0xa8, 0xad, 0xac, 0xaf, 0xa4, 0xa9, 0xae, 0x9e, 0x97, 0x96, + 0x9b, 0x98, 0x9f, 0xa2, 0x9a, 0xa0, 0xab, 0xab, 0xa7, 0xa6, 0xa5, 0xa5, + 0xa8, 0xad, 0xb3, 0xb6, 0xae, 0xa8, 0x97, 0x7b, 0x66, 0x6d, 0x91, 0xb4, + 0xc0, 0xb8, 0x7e, 0x65, 0x93, 0xb5, 0xb2, 0xaa, 0xa0, 0x7f, 0x6a, 0x7b, + 0x7c, 0x87, 0xb7, 0xcb, 0xc2, 0xb3, 0xa6, 0xaf, 0xae, 0xa9, 0xb3, 0xae, + 0x71, 0x5f, 0x73, 0x74, 0x80, 0xa3, 0x9b, 0x89, 0x9b, 0xae, 0xa8, 0xa7, + 0xab, 0xa8, 0xac, 0xaa, 0xaa, 0xac, 0xa7, 0xa8, 0xaa, 0xb1, 0x8f, 0x89, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xab, 0xaa, 0x9d, + 0x97, 0xa7, 0xb1, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa4, 0x9a, 0xa1, 0xab, 0xaa, 0xaf, 0xa9, 0x8f, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xa8, 0xae, 0xb2, 0xb1, 0xb2, 0xac, 0x91, 0x73, + 0x45, 0x4a, 0x53, 0x5d, 0x63, 0x69, 0x74, 0x7d, 0x70, 0x6f, 0x6d, 0x6b, + 0x67, 0x63, 0x60, 0x5e, 0x5d, 0x5f, 0x5f, 0x5d, 0x5b, 0x5a, 0x5d, 0x60, + 0x5d, 0x63, 0x6a, 0x6c, 0x6d, 0x72, 0x7c, 0x85, 0x71, 0x62, 0x4e, 0x43, + 0x44, 0x4d, 0x56, 0x5b, 0x2e, 0x38, 0x44, 0x46, 0x41, 0x3c, 0x3e, 0x42, + 0x29, 0x1d, 0x20, 0x25, 0x31, 0x37, 0x4e, 0x8c, 0xa6, 0xa1, 0x79, 0x61, + 0x75, 0xa2, 0xad, 0x81, 0x8d, 0x98, 0x9f, 0xa7, 0xb2, 0xb3, 0xae, 0xb1, + 0xab, 0xad, 0xaf, 0xb0, 0xb0, 0xaf, 0xad, 0xac, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xab, 0xac, 0xae, 0xb0, 0xb8, 0xa7, 0x1b, 0x09, + 0xa7, 0xa6, 0x9a, 0xa9, 0xaa, 0x9a, 0xaa, 0xb9, 0x82, 0x55, 0x83, 0xb7, + 0xaf, 0xa3, 0xa2, 0xa8, 0xa6, 0x7e, 0x8a, 0xa8, 0xa3, 0xa3, 0xac, 0xa1, + 0xa4, 0xac, 0xb3, 0xb1, 0xa9, 0xa3, 0xa4, 0xa8, 0xa1, 0xaa, 0x9c, 0xa6, + 0xa9, 0x9e, 0xa7, 0xa0, 0x8b, 0x90, 0xa2, 0xae, 0xac, 0xb0, 0xb7, 0xb4, + 0xad, 0xae, 0xaf, 0xac, 0xa1, 0x92, 0x83, 0x79, 0x6c, 0x74, 0x89, 0xa5, + 0xb7, 0xb8, 0xb1, 0xac, 0xc0, 0x8f, 0x63, 0x8b, 0xb0, 0xad, 0xb1, 0xa3, + 0x9c, 0x95, 0xa5, 0xb8, 0xbd, 0xc2, 0xbe, 0xb2, 0xb1, 0xa5, 0xa1, 0xa9, + 0xa5, 0xac, 0xb5, 0x95, 0x32, 0x43, 0x69, 0x75, 0x8c, 0xb5, 0xac, 0x90, + 0x98, 0xac, 0xa6, 0xa6, 0xab, 0xa8, 0xad, 0xab, 0xaa, 0xac, 0xa8, 0xab, + 0xab, 0xaf, 0x8e, 0x8c, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa7, 0xae, 0xa8, 0x99, 0xa2, 0xaf, 0xa7, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xae, 0x98, 0x9b, 0xb0, + 0xb3, 0xac, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa7, 0xb0, 0xb0, 0xaa, + 0xac, 0xb0, 0x9f, 0x85, 0x57, 0x52, 0x54, 0x60, 0x69, 0x6d, 0x73, 0x7b, + 0x74, 0x72, 0x6e, 0x6a, 0x65, 0x61, 0x5f, 0x5d, 0x82, 0x80, 0x75, 0x63, + 0x53, 0x54, 0x65, 0x75, 0x69, 0x72, 0x7a, 0x78, 0x6c, 0x5f, 0x56, 0x53, + 0x4d, 0x51, 0x58, 0x60, 0x62, 0x58, 0x47, 0x39, 0x35, 0x47, 0x5b, 0x5f, + 0x52, 0x3e, 0x2f, 0x2a, 0x2d, 0x26, 0x1b, 0x1b, 0x3d, 0x51, 0x61, 0x9b, + 0x8a, 0x95, 0x86, 0x61, 0x57, 0x7f, 0x9b, 0x8a, 0x90, 0x98, 0xa1, 0xa9, + 0xb1, 0xb2, 0xb0, 0xb0, 0xaa, 0xac, 0xae, 0xb0, 0xb0, 0xb0, 0xae, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xad, 0xae, 0xb1, + 0xb8, 0xa6, 0x1a, 0x08, 0xa7, 0xa4, 0xa5, 0xab, 0x9b, 0xa0, 0xac, 0x85, + 0x4f, 0x7f, 0xb7, 0xb1, 0xa3, 0xb1, 0xae, 0xab, 0x96, 0x87, 0x9c, 0xaa, + 0x99, 0xa1, 0xb1, 0xa2, 0xa6, 0xaa, 0xad, 0xac, 0xa7, 0xa5, 0xa9, 0xae, + 0xa6, 0xb2, 0xab, 0xb4, 0xad, 0x9f, 0xa5, 0x95, 0x8c, 0x8c, 0x97, 0x99, + 0x8a, 0x82, 0x7f, 0x75, 0x7a, 0x79, 0x78, 0x7c, 0x86, 0x95, 0xa4, 0xae, + 0xb0, 0xb8, 0xbe, 0xb9, 0xac, 0xa2, 0xa3, 0xa8, 0xa7, 0x73, 0x87, 0xa4, + 0xa7, 0xa7, 0x9c, 0xa5, 0x93, 0x9a, 0xb5, 0xb9, 0xac, 0xa7, 0xa5, 0xae, + 0xab, 0xa6, 0xa9, 0xb1, 0xa8, 0xaa, 0x9c, 0x5e, 0x7e, 0xc1, 0xcd, 0x7e, + 0x5f, 0x95, 0x9d, 0x70, 0x99, 0xac, 0xa7, 0xa7, 0xac, 0xa9, 0xae, 0xac, + 0xab, 0xac, 0xa9, 0xae, 0xac, 0xad, 0x8d, 0x8f, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xad, 0xa3, 0xac, 0xb1, 0xa2, 0x9d, 0xa7, 0xa8, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa6, 0xa5, 0xa8, 0xb4, 0xb4, 0x9c, 0x8f, 0x9c, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xb7, 0xb5, 0xad, 0xb0, 0xb9, 0xb0, 0x9b, 0x75, 0x65, 0x60, 0x70, + 0x7d, 0x7f, 0x82, 0x8a, 0x7c, 0x7c, 0x7a, 0x78, 0x74, 0x6f, 0x6b, 0x69, + 0x5d, 0x56, 0x54, 0x5e, 0x6d, 0x76, 0x71, 0x6a, 0x5f, 0x6a, 0x76, 0x79, + 0x72, 0x69, 0x65, 0x64, 0x64, 0x58, 0x48, 0x40, 0x42, 0x49, 0x4e, 0x50, + 0x57, 0x5b, 0x5a, 0x51, 0x43, 0x39, 0x36, 0x38, 0x2f, 0x23, 0x24, 0x1e, + 0x30, 0x59, 0x78, 0x96, 0x89, 0x90, 0x84, 0x5e, 0x55, 0x77, 0x90, 0x92, + 0x95, 0x99, 0xa4, 0xad, 0xb0, 0xb1, 0xb0, 0xac, 0xa9, 0xab, 0xae, 0xb0, + 0xb1, 0xb0, 0xaf, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xad, 0xae, 0xaf, 0xb1, 0xb8, 0xa6, 0x19, 0x07, 0xa4, 0xa6, 0xa9, 0x9d, + 0xa9, 0xac, 0x7d, 0x5d, 0x8b, 0xaa, 0xab, 0xad, 0xad, 0xa8, 0xae, 0xa4, + 0x89, 0xa1, 0xa8, 0x9e, 0x9c, 0xa4, 0xa8, 0xaa, 0xa8, 0xa5, 0xa2, 0xa1, + 0xa4, 0xaa, 0xaf, 0xb3, 0xa9, 0x9f, 0x88, 0x73, 0x60, 0x66, 0x7d, 0x7b, + 0x75, 0x78, 0x8a, 0x97, 0x98, 0xa2, 0xb0, 0xb0, 0xbb, 0xbc, 0xbd, 0xbc, + 0xb9, 0xb4, 0xaf, 0xab, 0xb2, 0xb3, 0xac, 0xa2, 0xa2, 0xac, 0xb1, 0xaf, + 0x7f, 0x88, 0x9c, 0xa3, 0xab, 0xb5, 0xab, 0x9c, 0x9d, 0xaa, 0xb3, 0xa6, + 0xa3, 0xb2, 0xb3, 0xaf, 0xab, 0xaa, 0xaf, 0xb9, 0xb0, 0xb1, 0xae, 0x82, + 0x89, 0x86, 0x85, 0x8f, 0xa8, 0xbc, 0xb2, 0x9a, 0x9d, 0xb0, 0xaa, 0xa9, + 0xad, 0xaa, 0xae, 0xac, 0xac, 0xab, 0xaa, 0xb1, 0xad, 0xab, 0x8c, 0x93, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb0, 0xa4, 0xa9, 0xb4, + 0xac, 0x9e, 0x9f, 0xa7, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xa3, 0x89, 0x7f, 0x95, 0xa1, 0x9e, 0xa1, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xad, 0xb2, 0xb2, 0xad, 0xb2, 0xbb, 0xb8, 0xac, + 0x7e, 0x64, 0x5a, 0x6e, 0x81, 0x82, 0x83, 0x8a, 0x71, 0x75, 0x7a, 0x7c, + 0x7a, 0x75, 0x6e, 0x69, 0x6a, 0x6d, 0x74, 0x7b, 0x7d, 0x79, 0x6f, 0x67, + 0x57, 0x5e, 0x65, 0x67, 0x68, 0x6d, 0x77, 0x80, 0x6e, 0x69, 0x64, 0x64, + 0x65, 0x63, 0x5d, 0x58, 0x61, 0x59, 0x4c, 0x43, 0x40, 0x42, 0x46, 0x4a, + 0x3b, 0x25, 0x3b, 0x2e, 0x14, 0x42, 0x74, 0x79, 0x7d, 0x8f, 0x84, 0x54, + 0x4e, 0x6e, 0x80, 0x97, 0x9c, 0x9d, 0xa8, 0xb0, 0xae, 0xae, 0xae, 0xa7, + 0xa8, 0xaa, 0xad, 0xaf, 0xb1, 0xb1, 0xb0, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xaf, 0xaf, 0xb1, 0xb7, 0xa5, 0x19, 0x06, + 0xa4, 0xa1, 0xa8, 0xae, 0xa8, 0x77, 0x5d, 0x98, 0xbd, 0xb3, 0xa5, 0xab, + 0xa7, 0xa8, 0xad, 0x8c, 0x8f, 0xae, 0xaa, 0x98, 0xa0, 0xa7, 0xa5, 0xad, + 0xaa, 0xa5, 0xa2, 0xa6, 0xac, 0xad, 0xa4, 0x9b, 0x7b, 0x83, 0x9e, 0xa3, + 0xa1, 0xb5, 0xbe, 0xb9, 0x90, 0x97, 0xad, 0xba, 0xb3, 0xb0, 0xae, 0xa4, + 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xab, 0xaa, 0xa9, 0xab, 0xb1, 0xac, 0xa2, + 0xa8, 0xb4, 0xaa, 0x93, 0x79, 0xaa, 0xab, 0xad, 0xaf, 0xa9, 0xae, 0x95, + 0xa3, 0xae, 0xb2, 0xb2, 0xb0, 0xad, 0xad, 0xac, 0xae, 0xae, 0xa9, 0xac, + 0xaa, 0xb2, 0xb8, 0x9b, 0x95, 0xa3, 0xa8, 0xae, 0xb4, 0xb2, 0xa5, 0x92, + 0xa2, 0xb5, 0xae, 0xac, 0xaf, 0xab, 0xae, 0xab, 0xac, 0xab, 0xaa, 0xb3, + 0xae, 0xaa, 0x8c, 0x95, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xab, 0xa8, 0xaf, 0xb2, 0xa5, 0x9c, 0xa1, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xba, 0xaf, 0x9c, 0x98, + 0xaf, 0xc1, 0xb3, 0x9b, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xac, 0xad, 0xac, 0xad, + 0xb1, 0xb5, 0xb3, 0xaf, 0x94, 0x6f, 0x5a, 0x68, 0x75, 0x6d, 0x65, 0x69, + 0x55, 0x5f, 0x6e, 0x7c, 0x81, 0x7f, 0x77, 0x71, 0x78, 0x76, 0x6b, 0x55, + 0x41, 0x3e, 0x4d, 0x5d, 0x40, 0x4a, 0x57, 0x60, 0x69, 0x75, 0x85, 0x91, + 0x8d, 0x84, 0x7a, 0x73, 0x6f, 0x6a, 0x63, 0x5c, 0x58, 0x4e, 0x45, 0x46, + 0x4e, 0x52, 0x4b, 0x43, 0x34, 0x1e, 0x2f, 0x27, 0x1d, 0x50, 0x8b, 0xa3, + 0x9b, 0xa7, 0x84, 0x4d, 0x6c, 0x9d, 0x93, 0x97, 0xa3, 0xa0, 0xab, 0xb3, + 0xac, 0xab, 0xac, 0xa1, 0xa8, 0xaa, 0xad, 0xaf, 0xb1, 0xb1, 0xb1, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xae, 0xaf, 0xb0, 0xb1, + 0xb7, 0xa5, 0x18, 0x05, 0xa8, 0xa6, 0xad, 0xae, 0x7a, 0x61, 0x95, 0xb7, + 0xaa, 0xa5, 0xb0, 0xa3, 0xa3, 0xb6, 0xa4, 0x8b, 0x9e, 0xaa, 0xa8, 0x9d, + 0x9e, 0xa8, 0xab, 0xa8, 0xab, 0xa9, 0xac, 0xb5, 0xba, 0xad, 0x90, 0x78, + 0x9a, 0x99, 0xb7, 0xac, 0x9d, 0xac, 0xa5, 0x9e, 0x8d, 0x90, 0xa0, 0xaa, + 0xa3, 0xa4, 0xa8, 0xa3, 0xaa, 0xa9, 0xa7, 0xa6, 0xa6, 0xa6, 0xa8, 0xa8, + 0x9c, 0xae, 0xb1, 0xa7, 0xab, 0xb3, 0x9e, 0x79, 0x9d, 0x9c, 0xab, 0xac, + 0xb1, 0xb2, 0x9b, 0x98, 0xa6, 0xb7, 0xb0, 0xaa, 0xaa, 0xaa, 0xb1, 0xab, + 0xa7, 0xaf, 0xab, 0xb2, 0xb8, 0xaf, 0x83, 0x3a, 0x8f, 0xb1, 0xac, 0x96, + 0x9b, 0xae, 0xa8, 0x84, 0xa6, 0xb8, 0xb1, 0xae, 0xb0, 0xab, 0xae, 0xab, + 0xac, 0xab, 0xab, 0xb4, 0xae, 0xa9, 0x8b, 0x96, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xac, 0xb2, 0xaa, 0xa9, 0xb4, 0xac, 0x9b, 0x9c, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x99, 0x86, 0x7d, 0x79, 0x78, 0x8c, 0xa1, 0xa1, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb6, 0xb2, 0xb1, 0xb3, 0xb4, 0xb2, 0xaf, 0xaf, 0x99, 0x70, 0x5a, 0x6a, + 0x7a, 0x73, 0x6a, 0x6e, 0x69, 0x74, 0x82, 0x8c, 0x8c, 0x81, 0x71, 0x67, + 0x41, 0x42, 0x48, 0x52, 0x5b, 0x59, 0x4d, 0x41, 0x72, 0x7b, 0x83, 0x81, + 0x74, 0x66, 0x5d, 0x5a, 0x67, 0x65, 0x65, 0x68, 0x6c, 0x6b, 0x64, 0x5d, + 0x5c, 0x4e, 0x42, 0x46, 0x52, 0x56, 0x4a, 0x3b, 0x35, 0x2f, 0x2d, 0x28, + 0x3b, 0x4e, 0x5a, 0x7d, 0x72, 0xa3, 0x8c, 0x3d, 0x4e, 0x7f, 0x7e, 0x96, + 0xa7, 0xa2, 0xae, 0xb4, 0xab, 0xaa, 0xaa, 0x9e, 0xa7, 0xa9, 0xac, 0xaf, + 0xb1, 0xb1, 0xb1, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xaf, 0xb0, 0xb0, 0xb1, 0xb7, 0xa5, 0x18, 0x05, 0xa7, 0xb0, 0xa9, 0x7a, + 0x5e, 0x8a, 0xb5, 0xa9, 0xa9, 0xa2, 0xae, 0xa7, 0xa7, 0xaa, 0x97, 0x99, + 0xa7, 0xab, 0xab, 0xa2, 0x98, 0x99, 0xa5, 0xb2, 0xab, 0xa7, 0xb0, 0xb5, + 0x96, 0x70, 0x79, 0xa0, 0xa8, 0xb3, 0xa2, 0x97, 0xaa, 0xae, 0xa6, 0xad, + 0x8c, 0x81, 0xad, 0xad, 0x9e, 0xaf, 0xa7, 0xa7, 0xab, 0xa5, 0xa5, 0xab, + 0xab, 0xa7, 0xa8, 0xae, 0xa7, 0xb8, 0xa8, 0xa1, 0xb6, 0x9d, 0x7f, 0x9d, + 0xad, 0x9a, 0xa7, 0xae, 0xb0, 0xa9, 0x97, 0xa4, 0xb3, 0xb3, 0xb1, 0xb0, + 0xaf, 0xae, 0xae, 0xad, 0xb1, 0xad, 0xa6, 0xad, 0xb4, 0xa4, 0xa1, 0xbc, + 0xc7, 0xb0, 0xa8, 0xa0, 0xa5, 0xb1, 0xa6, 0x9d, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xb2, 0xb2, 0xaa, 0xb1, 0xaf, 0xa7, 0x8a, 0xa2, + 0xb0, 0xb0, 0xaf, 0xae, 0xae, 0xad, 0xac, 0xac, 0xaf, 0xae, 0xae, 0xad, + 0xac, 0xab, 0xaa, 0xa9, 0x97, 0xae, 0xb0, 0xa9, 0xb0, 0xaf, 0xa8, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0x97, 0x4d, 0x28, 0x59, 0x98, 0xa5, 0x96, 0x8e, + 0xa2, 0xab, 0xb0, 0xac, 0xaa, 0xad, 0xae, 0xab, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0x95, 0x6e, 0x54, 0x5f, 0x71, 0x74, 0x76, 0x7d, 0x77, 0x7b, 0x82, 0x85, + 0x81, 0x75, 0x66, 0x5b, 0x63, 0x5a, 0x57, 0x5f, 0x6d, 0x6f, 0x63, 0x54, + 0x65, 0x6f, 0x6f, 0x5b, 0x3f, 0x33, 0x40, 0x53, 0x6a, 0x6f, 0x75, 0x78, + 0x74, 0x6a, 0x5e, 0x56, 0x55, 0x55, 0x54, 0x51, 0x4c, 0x45, 0x3e, 0x3a, + 0x2c, 0x37, 0x34, 0x27, 0x52, 0x64, 0x49, 0x66, 0x80, 0x9c, 0x74, 0x4f, + 0x68, 0x79, 0x82, 0xa4, 0xa5, 0x9c, 0xa5, 0xb3, 0xb0, 0xa9, 0xa8, 0xa5, + 0xa2, 0xa9, 0xb1, 0xb4, 0xb3, 0xb0, 0xaf, 0xaf, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xae, 0xae, 0xb3, 0xbc, 0xaa, 0x19, 0x02, + 0xab, 0xac, 0x7b, 0x61, 0x96, 0xbf, 0xb0, 0x9e, 0xa5, 0xaa, 0xaa, 0xa6, + 0xac, 0xa4, 0x94, 0xa0, 0xa7, 0xab, 0xad, 0xa9, 0xa1, 0x9d, 0xa1, 0xa6, + 0xac, 0xa7, 0x8d, 0x6f, 0x76, 0x9e, 0xb9, 0xba, 0xb3, 0xab, 0x9f, 0x9d, + 0x9f, 0xa0, 0xaa, 0xbc, 0x96, 0x7c, 0x9f, 0xac, 0xab, 0xb8, 0xab, 0xaa, + 0xab, 0xad, 0xad, 0xaa, 0xa5, 0xa3, 0xa9, 0xb1, 0xaa, 0xa9, 0xad, 0xad, + 0xab, 0x92, 0x89, 0xba, 0xab, 0x9d, 0xaa, 0xb0, 0xae, 0xa7, 0x99, 0xa7, + 0xb0, 0xac, 0xa8, 0xa5, 0xa5, 0xa9, 0xaf, 0xb3, 0xb2, 0xae, 0xae, 0xb5, + 0xb3, 0xa3, 0xa2, 0xb5, 0xb9, 0xab, 0xae, 0xae, 0xb3, 0xb6, 0xa0, 0x92, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb2, 0xb2, 0xab, 0xb1, + 0xaf, 0xa7, 0x8b, 0xa3, 0xb0, 0xb0, 0xaf, 0xaf, 0xae, 0xad, 0xad, 0xac, + 0xaf, 0xae, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xaa, 0x9a, 0xab, 0xb0, 0xac, + 0xad, 0xaf, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xba, 0xc2, 0xcb, 0xcb, + 0xbf, 0xad, 0xa0, 0x9a, 0xa3, 0xac, 0xb0, 0xac, 0xaa, 0xad, 0xae, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xa6, 0x82, 0x67, 0x6b, 0x74, 0x70, 0x6d, 0x70, + 0x6a, 0x75, 0x7e, 0x79, 0x6a, 0x5f, 0x60, 0x66, 0x63, 0x63, 0x66, 0x6a, + 0x6d, 0x68, 0x5e, 0x56, 0x69, 0x65, 0x5e, 0x57, 0x55, 0x5c, 0x69, 0x72, + 0x6d, 0x70, 0x73, 0x73, 0x6e, 0x63, 0x58, 0x51, 0x5b, 0x5b, 0x5b, 0x59, + 0x54, 0x4e, 0x48, 0x45, 0x26, 0x29, 0x31, 0x38, 0x65, 0x7b, 0x62, 0x6e, + 0x9e, 0xa9, 0x86, 0x61, 0x5c, 0x7d, 0xa4, 0x99, 0xa1, 0xa2, 0xae, 0xb3, + 0xa7, 0xa1, 0xa8, 0xaa, 0xa3, 0xa9, 0xb1, 0xb4, 0xb3, 0xb0, 0xaf, 0xb0, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb0, 0xb1, 0xb5, + 0xbe, 0xac, 0x1b, 0x03, 0xa2, 0x79, 0x6a, 0x94, 0xbc, 0xb3, 0xa5, 0xaf, + 0xa2, 0xb1, 0xa6, 0xa7, 0xaf, 0x9b, 0x95, 0xa8, 0xa7, 0xaa, 0xae, 0xae, + 0xab, 0xa5, 0x9e, 0x9a, 0xb2, 0xa6, 0x9e, 0xa5, 0xb4, 0xb9, 0xb1, 0xa5, + 0xac, 0xa9, 0xa6, 0xa1, 0xa5, 0xb8, 0xc0, 0xb4, 0x83, 0x65, 0x7f, 0x91, + 0x94, 0x9e, 0x99, 0xa3, 0xa4, 0xa9, 0xae, 0xae, 0xac, 0xac, 0xae, 0xb1, + 0xac, 0xb3, 0xa7, 0xb7, 0x8f, 0x7d, 0xbd, 0xb7, 0xa6, 0xa1, 0xae, 0xb2, + 0xab, 0xa2, 0x9c, 0xac, 0xb4, 0xb1, 0xad, 0xaa, 0xab, 0xae, 0xb2, 0xb5, + 0xab, 0xa6, 0xad, 0xb2, 0xa7, 0x9f, 0xa9, 0xb6, 0xb0, 0xaa, 0xb2, 0xb6, + 0xbb, 0xb6, 0x9b, 0x91, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb2, 0xb2, 0xab, 0xb2, 0xb0, 0xa7, 0x8b, 0xa3, 0xb1, 0xb1, 0xb0, 0xaf, + 0xaf, 0xae, 0xad, 0xad, 0xae, 0xae, 0xae, 0xad, 0xad, 0xac, 0xac, 0xab, + 0xa0, 0xa6, 0xaf, 0xb0, 0xab, 0xae, 0xb0, 0xaa, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xa5, 0xb7, 0xbc, 0xb0, 0xaa, 0xaf, 0xab, 0x9e, 0xa3, 0xac, 0xb1, 0xad, + 0xab, 0xae, 0xaf, 0xac, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb1, + 0xb1, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xad, 0x8a, 0x69, 0x60, + 0x64, 0x67, 0x6e, 0x77, 0x6c, 0x77, 0x82, 0x83, 0x7b, 0x71, 0x6c, 0x6c, + 0x6f, 0x6d, 0x68, 0x61, 0x5d, 0x62, 0x6c, 0x75, 0x62, 0x5c, 0x58, 0x5b, + 0x64, 0x6c, 0x70, 0x6f, 0x6b, 0x6f, 0x73, 0x75, 0x70, 0x67, 0x5c, 0x55, + 0x58, 0x59, 0x59, 0x58, 0x55, 0x50, 0x4b, 0x48, 0x4c, 0x30, 0x2a, 0x38, + 0x62, 0x82, 0x75, 0x6e, 0x52, 0x70, 0x84, 0x65, 0x52, 0x7a, 0x99, 0x96, + 0xa3, 0xa7, 0xb0, 0xad, 0xa0, 0xa1, 0xaa, 0xa8, 0xa5, 0xaa, 0xb1, 0xb4, + 0xb2, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb3, 0xb2, 0xb6, 0xc0, 0xad, 0x1c, 0x04, 0x72, 0x75, 0xa0, 0xbc, + 0xa8, 0xa1, 0xaf, 0xab, 0xa4, 0xb1, 0xa5, 0xac, 0xaa, 0x93, 0x9e, 0xac, + 0xa9, 0xa9, 0xaa, 0xae, 0xb0, 0xac, 0xa2, 0x9a, 0xad, 0xb0, 0xab, 0x9e, + 0x9c, 0xa7, 0xaf, 0xae, 0xb0, 0xa7, 0x99, 0x9b, 0xb3, 0xb2, 0x73, 0x29, + 0x55, 0x64, 0x9b, 0xaf, 0x9f, 0x98, 0x9f, 0xb6, 0xb3, 0xab, 0xa6, 0xa9, + 0xab, 0xac, 0xb0, 0xb6, 0xad, 0xa8, 0xc1, 0x9d, 0x84, 0xac, 0xb0, 0xa1, + 0xa3, 0xa6, 0xb2, 0xb4, 0xa9, 0x9f, 0xa2, 0xb1, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb4, 0xb2, 0xaf, 0xad, 0xb8, 0xb0, 0xb6, 0xb4, 0xa0, 0xa0, 0xb1, 0xb6, + 0xb3, 0xad, 0xb2, 0xb2, 0xb7, 0xb1, 0x9b, 0x9d, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb3, 0xb3, 0xac, 0xb3, 0xb0, 0xa8, 0x8c, 0xa4, + 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xad, 0xad, 0xad, 0xa7, 0xa2, 0xad, 0xb2, 0xa9, 0xae, 0xb4, 0xaa, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xae, 0xad, 0xab, 0xac, 0xae, 0xa7, 0x9d, + 0xa4, 0xad, 0xb1, 0xad, 0xab, 0xae, 0xaf, 0xac, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xbb, 0x9e, 0x7b, 0x65, 0x5f, 0x62, 0x6b, 0x74, 0x74, 0x7b, 0x80, 0x7e, + 0x72, 0x62, 0x54, 0x4e, 0x5f, 0x64, 0x6a, 0x6d, 0x6f, 0x72, 0x77, 0x7b, + 0x77, 0x7d, 0x84, 0x88, 0x85, 0x7c, 0x71, 0x6a, 0x7c, 0x81, 0x85, 0x82, + 0x74, 0x5e, 0x47, 0x38, 0x4d, 0x4e, 0x4f, 0x4f, 0x4c, 0x48, 0x43, 0x40, + 0x3f, 0x39, 0x4a, 0x4f, 0x43, 0x51, 0x70, 0x85, 0x92, 0x6f, 0x87, 0x72, + 0x66, 0x8e, 0x86, 0x78, 0xaa, 0xa9, 0xaa, 0xa4, 0x9e, 0xa8, 0xac, 0xa0, + 0xa7, 0xac, 0xb1, 0xb3, 0xb2, 0xb0, 0xb1, 0xb3, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb2, 0xb2, 0xb6, 0xbf, 0xac, 0x1a, 0x02, + 0x6d, 0xa0, 0xbc, 0xae, 0xa6, 0xaf, 0xaf, 0xa2, 0xab, 0xaa, 0xa7, 0xb0, + 0x9f, 0x93, 0xab, 0xaa, 0xac, 0xa8, 0xa5, 0xa8, 0xae, 0xb0, 0xab, 0xa5, + 0x8c, 0xa1, 0xa9, 0x9d, 0x9b, 0xaa, 0xaf, 0xa7, 0xab, 0xad, 0xa3, 0xa6, + 0xb1, 0x96, 0x65, 0x50, 0x9f, 0x98, 0xa2, 0xa9, 0xad, 0xb4, 0xae, 0xa8, + 0xb3, 0xab, 0xac, 0xb3, 0xb0, 0xa4, 0xa6, 0xb2, 0xb5, 0xad, 0xa0, 0x7e, + 0x99, 0xbd, 0xa3, 0xa3, 0xa1, 0xab, 0xb3, 0xb4, 0xa8, 0x9e, 0xa8, 0xb4, + 0xaa, 0xac, 0xaf, 0xb1, 0xb1, 0xaf, 0xac, 0xaa, 0xad, 0xaa, 0xb2, 0xae, + 0x9e, 0xa4, 0xb4, 0xb2, 0xb5, 0xb0, 0xb2, 0xaf, 0xb5, 0xac, 0x9b, 0xa9, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, 0xb4, 0xad, 0xb3, + 0xb1, 0xa9, 0x8d, 0xa5, 0xb2, 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xab, 0xa2, 0xaa, 0xb2, + 0xab, 0xae, 0xb4, 0xac, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xab, 0xab, 0xaf, 0xb3, + 0xb3, 0xac, 0xa5, 0xa1, 0xa5, 0xae, 0xb2, 0xae, 0xac, 0xaf, 0xb0, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xab, 0x97, 0x82, 0x78, 0x79, 0x7e, 0x80, + 0x70, 0x7a, 0x80, 0x78, 0x66, 0x5b, 0x5e, 0x66, 0x79, 0x6d, 0x60, 0x5c, + 0x63, 0x73, 0x82, 0x8c, 0x85, 0x89, 0x90, 0x95, 0x93, 0x87, 0x75, 0x68, + 0x6c, 0x69, 0x65, 0x60, 0x5c, 0x59, 0x57, 0x56, 0x4a, 0x4b, 0x4b, 0x4a, + 0x47, 0x42, 0x3d, 0x3a, 0x31, 0x26, 0x3b, 0x56, 0x50, 0x55, 0x6d, 0x6d, + 0x94, 0x74, 0x87, 0x98, 0x86, 0x8b, 0x9a, 0x92, 0xa8, 0xa7, 0xa8, 0xa3, + 0x9e, 0xa8, 0xad, 0xa0, 0xa9, 0xad, 0xb1, 0xb3, 0xb1, 0xb1, 0xb3, 0xb5, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb1, 0xb4, + 0xbd, 0xaa, 0x18, 0x00, 0xa5, 0xaf, 0xaa, 0xaa, 0xb6, 0xb1, 0xa7, 0xac, + 0xb0, 0xa6, 0xaa, 0xac, 0x97, 0x9b, 0xb2, 0xa8, 0xae, 0xa9, 0xa4, 0xa6, + 0xac, 0xb0, 0xb0, 0xae, 0xa8, 0x98, 0x97, 0xab, 0xb7, 0xb2, 0xaf, 0xb4, + 0xaa, 0xad, 0x9d, 0xa0, 0xb2, 0x90, 0x53, 0x3b, 0x93, 0x99, 0xa0, 0xa4, + 0xa8, 0xae, 0xae, 0xac, 0xa4, 0xa6, 0xac, 0xb1, 0xaa, 0xa4, 0xad, 0xbd, + 0xb2, 0x9e, 0x72, 0x9c, 0xb4, 0xa6, 0xbb, 0xa0, 0xa1, 0xb0, 0xb2, 0xb4, + 0xa9, 0xa0, 0xae, 0xb5, 0xad, 0xad, 0xad, 0xae, 0xb0, 0xb3, 0xb5, 0xb7, + 0xac, 0xb1, 0xb3, 0xaa, 0xa3, 0xac, 0xb2, 0xa9, 0xb0, 0xb1, 0xb4, 0xb3, + 0xb8, 0xab, 0x98, 0xae, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xad, 0xb4, 0xb2, 0xaa, 0x8d, 0xa5, 0xb3, 0xb3, 0xb2, 0xb1, + 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, + 0xae, 0xa5, 0xa7, 0xaf, 0xaf, 0xaf, 0xb1, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb6, 0xb6, 0xaf, 0xa8, 0xa9, 0xad, 0xa8, 0x9e, 0xa5, 0xae, 0xb3, 0xaf, + 0xad, 0xb0, 0xb1, 0xae, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb4, 0xb5, 0xb5, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb3, 0x9c, 0x78, + 0x62, 0x61, 0x67, 0x68, 0x67, 0x6e, 0x77, 0x7c, 0x7e, 0x7e, 0x81, 0x84, + 0x76, 0x72, 0x6e, 0x6f, 0x73, 0x75, 0x73, 0x71, 0x73, 0x6c, 0x69, 0x71, + 0x7e, 0x7f, 0x71, 0x62, 0x5e, 0x6b, 0x7d, 0x88, 0x85, 0x74, 0x5e, 0x4e, + 0x55, 0x55, 0x54, 0x51, 0x4c, 0x46, 0x3f, 0x3c, 0x30, 0x30, 0x41, 0x5c, + 0x4e, 0x44, 0x63, 0x6c, 0x94, 0xb1, 0x65, 0x79, 0xbb, 0x9f, 0x8e, 0x86, + 0x9e, 0xa2, 0xac, 0xaa, 0x9e, 0xa1, 0xaa, 0xa8, 0xab, 0xae, 0xb2, 0xb2, + 0xb1, 0xb1, 0xb4, 0xb7, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb6, 0xb4, 0xb3, 0xb6, 0xbe, 0xab, 0x18, 0x00, 0xb9, 0xad, 0xa9, 0xaa, + 0xaa, 0xae, 0xaf, 0xa9, 0xb1, 0xa9, 0xad, 0x9f, 0x95, 0xa8, 0xb1, 0xa9, + 0xaf, 0xac, 0xa9, 0xa9, 0xab, 0xae, 0xaf, 0xaf, 0xaf, 0x9f, 0x93, 0x9a, + 0xa7, 0xaf, 0xb3, 0xb5, 0xa6, 0xa7, 0x9f, 0xa3, 0xb4, 0xb1, 0x9f, 0x98, + 0xb1, 0xa4, 0x94, 0x98, 0xa3, 0xa8, 0xae, 0xb0, 0xab, 0xad, 0xa7, 0x9d, + 0x9f, 0xae, 0xb6, 0xb4, 0x98, 0x7a, 0x9f, 0xc0, 0xba, 0xb9, 0xab, 0x96, + 0xa3, 0xb2, 0xaf, 0xb2, 0xaa, 0xa3, 0xb3, 0xb4, 0xb7, 0xb6, 0xb6, 0xb5, + 0xb4, 0xb4, 0xb4, 0xb4, 0xc1, 0xc6, 0xb6, 0xa0, 0xa3, 0xb1, 0xb3, 0xad, + 0xae, 0xb1, 0xb5, 0xb5, 0xba, 0xa9, 0x96, 0xb2, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xae, 0xb5, 0xb2, 0xaa, 0x8e, 0xa6, + 0xb4, 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, 0xb0, 0xb0, 0xad, 0xae, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb2, 0xaf, 0xa9, 0xa4, 0xab, 0xb4, 0xb1, 0xad, 0xb4, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xa4, 0xb0, 0xb5, 0xad, 0xa9, 0xad, 0xae, 0xa9, + 0xa6, 0xaf, 0xb3, 0xaf, 0xad, 0xb0, 0xb1, 0xae, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xbe, 0xbd, 0xa3, 0x77, 0x60, 0x6c, 0x80, 0x88, 0x82, 0x7f, 0x81, 0x8c, + 0x98, 0x98, 0x8c, 0x7f, 0x7c, 0x79, 0x73, 0x6b, 0x66, 0x68, 0x72, 0x7a, + 0x75, 0x70, 0x6e, 0x74, 0x7d, 0x7d, 0x74, 0x69, 0x5b, 0x5a, 0x5a, 0x5b, + 0x5c, 0x5e, 0x61, 0x62, 0x60, 0x5f, 0x5d, 0x58, 0x51, 0x49, 0x41, 0x3c, + 0x4e, 0x3d, 0x31, 0x55, 0x64, 0x5a, 0x68, 0x61, 0x71, 0xc5, 0x60, 0x23, + 0x7a, 0x87, 0x75, 0x98, 0x99, 0x9b, 0xa8, 0xaf, 0xa4, 0xa1, 0xa8, 0xab, + 0xac, 0xaf, 0xb2, 0xb2, 0xb0, 0xb1, 0xb5, 0xb9, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xba, 0xb9, 0xbb, 0xc3, 0xaf, 0x1d, 0x05, + 0xad, 0xa9, 0xa6, 0xa7, 0xa9, 0xa9, 0xa8, 0xa5, 0xb0, 0xae, 0xaf, 0x95, + 0x96, 0xb1, 0xac, 0xaa, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, 0xab, 0xab, + 0xae, 0xad, 0xa8, 0x9e, 0x98, 0x99, 0xa1, 0xa8, 0xb9, 0x98, 0x90, 0xa7, + 0xb2, 0xae, 0xb4, 0xc1, 0xba, 0xad, 0x9f, 0xad, 0xb7, 0xac, 0xac, 0xb1, + 0xa9, 0xb4, 0xb3, 0xac, 0xb8, 0xc2, 0xa1, 0x70, 0x7f, 0xa7, 0xba, 0xad, + 0xad, 0xb5, 0xaa, 0xa1, 0xa5, 0xb4, 0xad, 0xb1, 0xac, 0xa5, 0xb6, 0xb3, + 0xb8, 0xb9, 0xbb, 0xb9, 0xb4, 0xab, 0xa1, 0x9b, 0xa4, 0xa8, 0x8d, 0x76, + 0x8c, 0xae, 0xbc, 0xc2, 0xb1, 0xb4, 0xb4, 0xb1, 0xb7, 0xa6, 0x97, 0xb9, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xae, 0xb5, + 0xb3, 0xaa, 0x8e, 0xa6, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, 0xb1, 0xb0, 0xb0, + 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xaf, 0xad, 0xa3, 0xa8, + 0xb8, 0xb2, 0xaa, 0xb6, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb6, 0xb0, 0xaa, 0xaa, + 0xae, 0xaf, 0xaa, 0xa5, 0xa6, 0xaf, 0xb4, 0xb0, 0xae, 0xb1, 0xb2, 0xaf, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbd, 0xa8, 0x7d, 0x66, 0x73, 0x88, 0x8f, + 0x79, 0x76, 0x74, 0x74, 0x76, 0x76, 0x73, 0x70, 0x66, 0x72, 0x7a, 0x76, + 0x6a, 0x67, 0x71, 0x7e, 0x7e, 0x89, 0x93, 0x92, 0x86, 0x77, 0x6e, 0x6b, + 0x66, 0x6d, 0x75, 0x79, 0x73, 0x65, 0x55, 0x4a, 0x64, 0x63, 0x60, 0x5a, + 0x51, 0x47, 0x3e, 0x39, 0x32, 0x38, 0x3b, 0x6b, 0x7d, 0x69, 0x73, 0x73, + 0x7f, 0xac, 0x8a, 0x1d, 0x50, 0xb5, 0x9a, 0x98, 0x9c, 0x94, 0x9e, 0xae, + 0xad, 0xa8, 0xa8, 0xa7, 0xad, 0xb0, 0xb2, 0xb1, 0xb0, 0xb1, 0xb5, 0xb9, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc1, 0xbf, 0xbe, 0xc0, + 0xc8, 0xb4, 0x21, 0x09, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xb9, 0x9e, 0x95, 0xaa, 0xae, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xae, 0xb2, 0xb3, 0xaf, 0xa6, 0x9d, 0x99, 0x98, + 0xaf, 0x9a, 0xa4, 0xb4, 0xac, 0xac, 0xb1, 0xa5, 0xae, 0xa7, 0x9b, 0xa8, + 0xb0, 0xac, 0xb1, 0xad, 0xb6, 0xa4, 0xb1, 0xcb, 0xb1, 0x79, 0x79, 0xa6, + 0xc6, 0xac, 0xab, 0xac, 0xb7, 0xb5, 0x99, 0x99, 0xb3, 0xaf, 0xb0, 0xa8, + 0x9e, 0xac, 0xba, 0xb2, 0xb6, 0xb2, 0xb1, 0xb5, 0xb2, 0x99, 0x6e, 0x4c, + 0x77, 0x97, 0xae, 0xae, 0xb0, 0xbb, 0xbc, 0xb1, 0xb7, 0xb3, 0xab, 0xbf, + 0xb3, 0x93, 0xa7, 0xbf, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb3, 0xb4, 0xb9, 0xb1, 0xb6, 0xaa, 0x96, 0xb9, 0xb5, 0xb5, 0xb4, 0xb3, + 0xb3, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xb4, 0xa8, 0xa0, 0xae, 0xb5, 0xb0, 0xb2, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xae, 0xaf, 0xb0, 0xb1, 0xb1, 0xaf, 0xad, 0xac, + 0xb2, 0xae, 0xac, 0xaf, 0xb4, 0xb1, 0xa5, 0x9a, 0x98, 0xa9, 0xb1, 0xaa, + 0xab, 0xb6, 0xb8, 0xae, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb4, 0xb4, 0xb3, 0xb3, 0xb4, 0xb5, + 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xc0, 0xb1, 0xa1, 0x80, + 0x70, 0x74, 0x6e, 0x70, 0x77, 0x75, 0x78, 0x7d, 0x7c, 0x78, 0x7c, 0x85, + 0x77, 0x79, 0x7b, 0x7a, 0x78, 0x78, 0x7b, 0x7e, 0x7b, 0x7a, 0x82, 0x8b, + 0x83, 0x71, 0x6f, 0x7a, 0x82, 0x79, 0x6d, 0x62, 0x5d, 0x5c, 0x5c, 0x5d, + 0x59, 0x54, 0x51, 0x51, 0x53, 0x51, 0x4b, 0x45, 0x40, 0x43, 0x2f, 0x48, + 0x77, 0x55, 0x31, 0x58, 0x7a, 0x8e, 0x7e, 0x31, 0x3e, 0x68, 0x97, 0x8d, + 0x98, 0x9e, 0xa3, 0xac, 0xa6, 0xa0, 0xae, 0xaf, 0xb7, 0xb2, 0xad, 0xae, + 0xb3, 0xb6, 0xb4, 0xb1, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb6, 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb7, 0xb4, 0xb2, + 0xb2, 0xb5, 0xb8, 0xba, 0xc6, 0xc3, 0xbe, 0xb9, 0xb7, 0xb7, 0xb9, 0xba, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb6, 0xb8, 0xbb, 0xbf, + 0xc4, 0xc8, 0xcc, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xb8, 0x9e, 0x97, 0xab, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb4, 0xaf, 0xa9, 0xaa, + 0xad, 0xac, 0xa4, 0x9c, 0x90, 0x84, 0x98, 0xb2, 0xb1, 0xb4, 0xb8, 0xab, + 0xb1, 0xa8, 0x99, 0xa5, 0xae, 0xae, 0xb8, 0xb7, 0xbc, 0xbe, 0xa1, 0x73, + 0x70, 0x99, 0xb5, 0xb2, 0xaf, 0xb2, 0xa9, 0xaf, 0xb6, 0xa0, 0x94, 0xa2, + 0xb2, 0xae, 0xaf, 0xa8, 0xa0, 0xad, 0xb9, 0xb3, 0xb4, 0xb1, 0xaf, 0xb1, + 0xb4, 0xb2, 0xa9, 0xa2, 0xc0, 0xc9, 0xc4, 0xb1, 0xa5, 0xaa, 0xb2, 0xb2, + 0xb5, 0xb3, 0xb1, 0xbe, 0xad, 0x95, 0xac, 0xbe, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb5, 0xb9, 0xb2, 0xb6, 0xa9, 0x99, 0xba, + 0xb5, 0xb5, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xaf, 0xb4, 0xa9, 0xa2, 0xae, 0xb5, 0xb1, 0xb2, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xad, 0xae, 0xb0, 0xb1, + 0xb1, 0xb0, 0xae, 0xad, 0xac, 0xab, 0xac, 0xaf, 0xb2, 0xb3, 0xb1, 0xaf, + 0x9c, 0xa7, 0xb0, 0xb2, 0xb2, 0xb4, 0xb3, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, + 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbd, 0xb4, 0xac, 0x90, 0x81, 0x83, 0x7c, 0x7e, 0x78, 0x72, 0x73, 0x7c, + 0x81, 0x7f, 0x7c, 0x7e, 0x92, 0x86, 0x75, 0x69, 0x68, 0x70, 0x7b, 0x83, + 0x80, 0x7b, 0x7b, 0x7d, 0x75, 0x69, 0x6c, 0x78, 0x77, 0x64, 0x50, 0x4c, + 0x54, 0x5b, 0x57, 0x50, 0x43, 0x41, 0x43, 0x47, 0x4c, 0x4a, 0x42, 0x3a, + 0x3e, 0x53, 0x46, 0x45, 0x63, 0x56, 0x37, 0x3f, 0x88, 0x93, 0x7f, 0x5e, + 0x47, 0x4a, 0x51, 0x5f, 0x84, 0xa5, 0xb5, 0xac, 0x99, 0x9b, 0xb0, 0xae, + 0xb1, 0xae, 0xad, 0xaf, 0xb4, 0xb6, 0xb4, 0xb0, 0xb3, 0xb4, 0xb4, 0xb5, + 0xb6, 0xb6, 0xb7, 0xb7, 0xb9, 0xb8, 0xb6, 0xb4, 0xb4, 0xb5, 0xb7, 0xb8, + 0xb9, 0xb7, 0xb6, 0xb5, 0xb6, 0xb9, 0xbc, 0xbe, 0xc3, 0xc1, 0xbe, 0xbb, + 0xb8, 0xb7, 0xb7, 0xb7, 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, + 0xbe, 0xbf, 0xc1, 0xc4, 0xc7, 0xca, 0xcc, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, + 0xcb, 0xcb, 0xca, 0xca, 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb5, 0x9d, 0x9a, + 0xac, 0xae, 0xaf, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xac, 0xab, 0xac, 0xae, 0xb0, 0xad, 0x93, 0x89, 0x88, + 0x81, 0x8e, 0xa4, 0xa7, 0xa9, 0xa8, 0xa3, 0xb2, 0xb6, 0xa6, 0x9d, 0x90, + 0x6c, 0x6c, 0x80, 0xa5, 0xbf, 0xc0, 0xb7, 0xb4, 0xa2, 0xb2, 0xad, 0xb7, + 0xac, 0x91, 0xa0, 0xac, 0xb2, 0xad, 0xac, 0xa8, 0xa4, 0xae, 0xb8, 0xb3, + 0xab, 0xb1, 0xb7, 0xb8, 0xb7, 0xb8, 0xbd, 0xc2, 0xbb, 0xbb, 0xb8, 0xaf, + 0xa9, 0xac, 0xb6, 0xbe, 0xb3, 0xb4, 0xb9, 0xbc, 0xa4, 0x9a, 0xb4, 0xbb, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb5, 0xb6, 0xb8, 0xb4, + 0xb6, 0xa8, 0x9e, 0xbb, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb0, 0xb4, 0xac, 0xa4, + 0xac, 0xb3, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xac, 0xae, 0xb0, 0xb1, 0xb1, 0xb0, 0xae, 0xad, 0xb5, 0xb5, 0xb4, 0xb1, + 0xae, 0xad, 0xb0, 0xb3, 0x98, 0x9e, 0xaa, 0xb4, 0xb5, 0xb1, 0xaf, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb4, 0xb5, 0xb5, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xb5, 0xad, 0x91, 0x81, 0x86, 0x85, 0x8c, + 0x84, 0x89, 0x8f, 0x8e, 0x80, 0x72, 0x74, 0x7e, 0x86, 0x78, 0x6a, 0x67, + 0x71, 0x7e, 0x86, 0x89, 0x7d, 0x80, 0x87, 0x8d, 0x86, 0x76, 0x6f, 0x70, + 0x6a, 0x64, 0x61, 0x65, 0x69, 0x61, 0x4d, 0x3b, 0x39, 0x46, 0x4d, 0x44, + 0x36, 0x36, 0x4b, 0x61, 0x4c, 0x44, 0x39, 0x43, 0x51, 0x46, 0x46, 0x60, + 0x80, 0xa6, 0x86, 0x68, 0x57, 0x84, 0x76, 0x6b, 0x8d, 0xc6, 0xae, 0x9e, + 0x9f, 0x9d, 0xb5, 0xac, 0xa9, 0xa9, 0xac, 0xb1, 0xb6, 0xb7, 0xb3, 0xb0, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xb7, 0xb6, 0xb5, + 0xb5, 0xb6, 0xb8, 0xb9, 0xba, 0xb9, 0xb9, 0xba, 0xbc, 0xbf, 0xc2, 0xc4, + 0xc0, 0xc0, 0xc0, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4, 0xb6, 0xb7, 0xb8, 0xba, + 0xbc, 0xbe, 0xbf, 0xc0, 0xc5, 0xc6, 0xc7, 0xc8, 0xca, 0xcb, 0xcd, 0xcd, + 0xce, 0xcd, 0xcc, 0xcc, 0xcb, 0xca, 0xc9, 0xc9, 0xc6, 0xc7, 0xc3, 0xc9, + 0xd4, 0xb4, 0x18, 0x07, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xb1, 0x9d, 0x9f, 0xae, 0xae, 0xb1, 0xaf, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xab, 0xae, 0xaf, 0xac, 0xa7, 0xa9, 0xb0, 0xb8, + 0xa6, 0xa3, 0xaf, 0xb7, 0xab, 0xa0, 0x95, 0x84, 0x8d, 0x82, 0x70, 0x7a, + 0x86, 0x8b, 0x9c, 0xa0, 0xb9, 0xc2, 0xc0, 0xb4, 0xb3, 0xba, 0xb3, 0xa1, + 0xad, 0xab, 0xb3, 0xb6, 0x99, 0x9a, 0xb8, 0xae, 0xb1, 0xac, 0xa9, 0xa7, + 0xa9, 0xb0, 0xb5, 0xb4, 0xab, 0xb5, 0xbf, 0xc0, 0xb8, 0xb2, 0xb1, 0xb3, + 0xb2, 0xb0, 0xb3, 0xb8, 0xb4, 0xad, 0xb0, 0xb8, 0xb1, 0xb5, 0xbe, 0xb7, + 0x9d, 0xa2, 0xba, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb7, 0xb7, 0xb6, 0xb7, 0xb6, 0xa7, 0xa5, 0xbd, 0xb7, 0xb6, 0xb6, 0xb5, + 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb1, 0xb4, 0xaf, 0xa7, 0xaa, 0xb1, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xab, 0xad, 0xaf, 0xb1, 0xb1, 0xb1, 0xaf, 0xae, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb2, 0xb3, 0xb3, 0x91, 0x9b, 0xa9, 0xb2, + 0xb4, 0xb3, 0xb2, 0xb1, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb5, 0xb5, 0xb6, 0xb6, + 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xc0, 0xaf, 0x97, 0x6b, + 0x51, 0x56, 0x5a, 0x67, 0x73, 0x6b, 0x69, 0x71, 0x77, 0x76, 0x74, 0x75, + 0x88, 0x7a, 0x6c, 0x6c, 0x77, 0x7f, 0x7d, 0x77, 0x78, 0x7f, 0x8b, 0x93, + 0x8f, 0x82, 0x75, 0x6f, 0x79, 0x76, 0x6d, 0x5c, 0x46, 0x35, 0x2c, 0x2a, + 0x4c, 0x41, 0x35, 0x33, 0x3b, 0x44, 0x49, 0x48, 0x3a, 0x44, 0x44, 0x38, + 0x3a, 0x54, 0x67, 0x64, 0x75, 0xa7, 0x7f, 0x4a, 0x62, 0xaf, 0x96, 0x5c, + 0x91, 0xa5, 0xbd, 0x9d, 0x94, 0xaf, 0xac, 0xb0, 0xa3, 0xa7, 0xad, 0xb4, + 0xb8, 0xb7, 0xb3, 0xb0, 0xb5, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, + 0xb8, 0xb7, 0xb6, 0xb5, 0xb6, 0xb8, 0xba, 0xbb, 0xbb, 0xbc, 0xbe, 0xc0, + 0xc3, 0xc6, 0xc9, 0xca, 0xc2, 0xc3, 0xc5, 0xc5, 0xc3, 0xbe, 0xb9, 0xb6, + 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xbf, 0xc6, 0xc6, 0xc8, 0xc9, + 0xcb, 0xcd, 0xce, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc8, 0xc7, 0xc7, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0x9d, 0xa4, 0xb0, 0xae, 0xb2, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xb4, 0xad, 0xa6, 0xa6, + 0xab, 0xb0, 0xaf, 0xad, 0x97, 0x9d, 0xac, 0xb7, 0xb9, 0xbc, 0xbd, 0xb6, + 0xb9, 0xb3, 0xa8, 0xb4, 0xbc, 0xb8, 0xbc, 0xb8, 0xb0, 0xae, 0xae, 0xaf, + 0xad, 0xa9, 0xaa, 0xad, 0xb8, 0xa8, 0xb0, 0x9e, 0x8f, 0xae, 0xbd, 0xac, + 0xb0, 0xab, 0xa6, 0xa7, 0xaf, 0xb2, 0xb2, 0xb5, 0xb3, 0xb7, 0xba, 0xb9, + 0xb7, 0xb7, 0xb9, 0xbc, 0xbc, 0xb3, 0xaf, 0xb0, 0xa9, 0x9d, 0x9d, 0xa7, + 0xb2, 0xb7, 0xbf, 0xaf, 0x9d, 0xab, 0xbb, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb5, 0xb9, 0xb5, 0xa6, 0xac, 0xbf, + 0xb7, 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, 0xb2, 0xab, 0xa8, 0xb0, 0xb5, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xaa, 0xac, 0xaf, 0xb1, + 0xb2, 0xb1, 0xb0, 0xaf, 0xb1, 0xae, 0xad, 0xb1, 0xb6, 0xb5, 0xac, 0xa4, + 0xa2, 0xb3, 0xbc, 0xb7, 0xb4, 0xb8, 0xb4, 0xaa, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, + 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xca, 0xb6, 0x9c, 0x72, 0x60, 0x6c, 0x76, 0x86, 0x7d, 0x6e, 0x65, 0x6e, + 0x7b, 0x7e, 0x7c, 0x7a, 0x84, 0x73, 0x62, 0x60, 0x6b, 0x76, 0x79, 0x75, + 0x78, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x78, 0x74, 0x7a, 0x7d, 0x7b, 0x72, + 0x67, 0x64, 0x6c, 0x75, 0x60, 0x68, 0x6e, 0x67, 0x57, 0x45, 0x3b, 0x38, + 0x2e, 0x41, 0x52, 0x4d, 0x4a, 0x5f, 0x65, 0x50, 0x71, 0x8b, 0x74, 0x4a, + 0x86, 0xa8, 0x8f, 0x59, 0x78, 0xb6, 0x9a, 0x84, 0xa3, 0xab, 0xb1, 0xb7, + 0xa2, 0xa8, 0xaf, 0xb5, 0xb7, 0xb6, 0xb4, 0xb2, 0xb5, 0xb6, 0xb6, 0xb7, + 0xb8, 0xb8, 0xb9, 0xb9, 0xb8, 0xb7, 0xb6, 0xb6, 0xb7, 0xb9, 0xbb, 0xbd, + 0xbe, 0xc0, 0xc2, 0xc5, 0xc8, 0xcb, 0xcc, 0xcd, 0xc6, 0xc8, 0xca, 0xca, + 0xc7, 0xc3, 0xbe, 0xba, 0xc0, 0xbf, 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xbb, + 0xc2, 0xc3, 0xc5, 0xc8, 0xcb, 0xce, 0xd0, 0xd1, 0xce, 0xcd, 0xcc, 0xcb, + 0xc9, 0xc7, 0xc6, 0xc5, 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0x9d, 0xa8, + 0xb2, 0xaf, 0xb4, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xae, 0xab, 0xab, 0xab, 0xad, 0xad, 0xac, 0x9b, 0xa3, 0xa9, 0xa9, + 0xa7, 0xaa, 0xab, 0xa8, 0xad, 0xa7, 0x9d, 0xa9, 0xb0, 0xa9, 0xab, 0xa4, + 0xa0, 0xa9, 0xae, 0xac, 0xb0, 0xb5, 0xad, 0x9e, 0xb5, 0xad, 0xa5, 0x88, + 0x94, 0xb5, 0xad, 0xac, 0xaf, 0xaa, 0xa3, 0xa7, 0xb4, 0xb4, 0xb0, 0xb5, + 0xb1, 0xb1, 0xb1, 0xb3, 0xb7, 0xba, 0xbd, 0xbe, 0xc0, 0xb8, 0xb7, 0xbc, + 0xbb, 0xb4, 0xb5, 0xbd, 0xb6, 0xba, 0xbb, 0xa5, 0xa3, 0xb5, 0xb7, 0xba, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xbb, 0xba, 0xb4, 0xbc, + 0xb5, 0xa5, 0xb3, 0xc0, 0xb8, 0xb8, 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xae, + 0xa6, 0xae, 0xb6, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xa9, 0xab, 0xae, 0xb0, 0xb2, 0xb2, 0xb1, 0xb0, 0xb8, 0xb3, 0xb0, 0xb3, + 0xb7, 0xb3, 0xa5, 0x98, 0x91, 0xa4, 0xae, 0xa8, 0xaa, 0xb7, 0xb9, 0xaf, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb4, 0xb5, + 0xb5, 0xb6, 0xb7, 0xb7, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xab, 0x96, 0x73, 0x66, 0x6f, 0x6f, 0x76, + 0x7c, 0x77, 0x77, 0x7d, 0x81, 0x80, 0x83, 0x8a, 0x82, 0x7a, 0x74, 0x78, + 0x83, 0x8d, 0x8f, 0x8d, 0x7b, 0x7d, 0x7b, 0x76, 0x79, 0x7d, 0x79, 0x6f, + 0x78, 0x76, 0x75, 0x74, 0x72, 0x6d, 0x66, 0x61, 0x5a, 0x4e, 0x47, 0x51, + 0x61, 0x61, 0x4d, 0x38, 0x37, 0x37, 0x46, 0x58, 0x5f, 0x62, 0x64, 0x61, + 0x71, 0x87, 0x78, 0x52, 0x97, 0xa9, 0x9f, 0x84, 0x6e, 0xc3, 0xa7, 0xa0, + 0xb3, 0xa3, 0xb2, 0xb2, 0xa7, 0xad, 0xb3, 0xb6, 0xb6, 0xb5, 0xb5, 0xb6, + 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xb8, 0xb7, 0xb6, 0xb6, + 0xb8, 0xba, 0xbd, 0xbf, 0xc1, 0xc3, 0xc6, 0xca, 0xcc, 0xcd, 0xcc, 0xcc, + 0xca, 0xca, 0xca, 0xc9, 0xc6, 0xc3, 0xc0, 0xbe, 0xc4, 0xc3, 0xc2, 0xc0, + 0xbe, 0xbc, 0xbb, 0xba, 0xc3, 0xc4, 0xc6, 0xc9, 0xcc, 0xcf, 0xd2, 0xd3, + 0xce, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc3, 0xc6, 0xc7, 0xc3, 0xc9, + 0xd4, 0xb4, 0x18, 0x07, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xa6, 0x9d, 0xac, 0xb3, 0xaf, 0xb5, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xa9, 0xb0, 0xb6, 0xb5, 0xaf, 0xab, 0xaf, 0xb4, + 0x8d, 0x9f, 0xac, 0xaf, 0xb0, 0xb0, 0xab, 0xa6, 0xb1, 0xab, 0xa0, 0xad, + 0xb4, 0xae, 0xb1, 0xac, 0xb5, 0xb0, 0xaa, 0xaa, 0xb0, 0xb5, 0xb4, 0xb1, + 0xae, 0xb1, 0xa0, 0x91, 0xa1, 0xa9, 0xa4, 0xae, 0xaf, 0xaa, 0xa0, 0xa7, + 0xb8, 0xb5, 0xae, 0xb6, 0xaf, 0xb1, 0xb4, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, + 0xb3, 0xb2, 0xb6, 0xbd, 0xbf, 0xbb, 0xb8, 0xb8, 0xb9, 0xbd, 0xb4, 0x9c, + 0xab, 0xbd, 0xb1, 0xbc, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbd, 0xbb, 0xb3, 0xbe, 0xb5, 0xa5, 0xb8, 0xc2, 0xb9, 0xb8, 0xb8, 0xb7, + 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb4, 0xb8, 0xb1, 0xa5, 0xad, 0xb8, 0xb2, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xa9, 0xab, 0xae, 0xb0, 0xb2, 0xb2, 0xb2, 0xb1, + 0xaf, 0xae, 0xae, 0xb2, 0xb6, 0xb7, 0xb2, 0xad, 0xba, 0xc2, 0xc2, 0xb8, + 0xb2, 0xb5, 0xb5, 0xb0, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb7, 0xb7, 0xb8, 0xb8, + 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xba, 0xa9, 0x99, 0x7e, + 0x76, 0x7c, 0x6f, 0x6b, 0x76, 0x6e, 0x6d, 0x74, 0x76, 0x6d, 0x62, 0x5d, + 0x70, 0x6e, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6d, 0x84, 0x87, 0x82, 0x7a, + 0x7b, 0x7e, 0x74, 0x63, 0x64, 0x61, 0x5d, 0x58, 0x55, 0x55, 0x56, 0x57, + 0x62, 0x61, 0x5c, 0x51, 0x47, 0x44, 0x48, 0x4d, 0x3a, 0x4a, 0x4a, 0x45, + 0x59, 0x74, 0x74, 0x65, 0x75, 0x97, 0x76, 0x50, 0x86, 0xaa, 0x94, 0x7c, + 0x80, 0x6f, 0xd4, 0xe6, 0xab, 0xad, 0xa8, 0xa8, 0xaf, 0xb3, 0xb7, 0xb6, + 0xb3, 0xb3, 0xb6, 0xba, 0xb7, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, + 0xb8, 0xb7, 0xb6, 0xb7, 0xb8, 0xbb, 0xbe, 0xc0, 0xc4, 0xc6, 0xca, 0xcc, + 0xcd, 0xcc, 0xcb, 0xc9, 0xcb, 0xc9, 0xc6, 0xc3, 0xc0, 0xbf, 0xbf, 0xbf, + 0xc6, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0, 0xca, 0xcb, 0xcc, 0xce, + 0xd0, 0xd1, 0xd2, 0xd3, 0xcf, 0xce, 0xcc, 0xca, 0xc7, 0xc5, 0xc3, 0xc2, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xa5, 0x9d, 0xae, 0xb4, 0xaf, 0xb6, 0xb1, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xae, 0xb0, 0xb5, + 0xba, 0xba, 0xb5, 0xb0, 0x9a, 0xab, 0xb2, 0xad, 0xae, 0xb1, 0xb0, 0xae, + 0xb3, 0xac, 0x9e, 0xaa, 0xb3, 0xb1, 0xb9, 0xb7, 0xb4, 0xb8, 0xb7, 0xb2, + 0xb0, 0xb1, 0xae, 0xa8, 0xac, 0xb0, 0xa3, 0xab, 0xa9, 0x9a, 0xa9, 0xb0, + 0xae, 0xa9, 0x9f, 0xa7, 0xba, 0xb6, 0xad, 0xb6, 0xb9, 0xbb, 0xbc, 0xb8, + 0xb4, 0xb3, 0xb7, 0xbc, 0xb4, 0xb4, 0xb4, 0xb5, 0xb8, 0xb9, 0xb7, 0xb5, + 0xbc, 0xbe, 0xaf, 0x97, 0xb1, 0xc2, 0xad, 0xbe, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xbe, 0xbc, 0xb2, 0xbf, 0xb5, 0xa4, 0xbb, 0xc3, + 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb6, 0xb4, 0xb9, 0xb2, 0xa4, 0xac, 0xb8, 0xb2, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xa8, 0xaa, 0xad, 0xb0, + 0xb2, 0xb2, 0xb2, 0xb1, 0xb5, 0xb6, 0xb5, 0xb3, 0xb2, 0xb2, 0xb4, 0xb6, + 0xb5, 0xb4, 0xb4, 0xb2, 0xaf, 0xaf, 0xb3, 0xb9, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc4, 0xae, 0x97, 0x77, 0x69, 0x65, 0x4d, 0x3f, 0x5d, 0x6c, 0x81, 0x8b, + 0x81, 0x72, 0x72, 0x7a, 0x71, 0x6b, 0x61, 0x58, 0x59, 0x66, 0x79, 0x87, + 0x91, 0x8b, 0x78, 0x63, 0x61, 0x6c, 0x6a, 0x5e, 0x4b, 0x5e, 0x6f, 0x6d, + 0x5a, 0x48, 0x42, 0x45, 0x34, 0x39, 0x40, 0x43, 0x45, 0x4a, 0x54, 0x5b, + 0x52, 0x51, 0x4b, 0x59, 0x70, 0x6a, 0x59, 0x59, 0x6f, 0x90, 0x66, 0x67, + 0x95, 0xbb, 0x82, 0x6a, 0x97, 0x65, 0x6a, 0xca, 0xd0, 0xa7, 0xbc, 0xa7, + 0xb4, 0xb7, 0xb9, 0xb6, 0xb2, 0xb1, 0xb7, 0xbc, 0xb7, 0xb7, 0xb8, 0xb9, + 0xb9, 0xba, 0xbb, 0xbb, 0xb7, 0xb7, 0xb6, 0xb7, 0xb9, 0xbc, 0xbf, 0xc1, + 0xc6, 0xc8, 0xcb, 0xcd, 0xce, 0xcc, 0xc9, 0xc7, 0xca, 0xc6, 0xc1, 0xbd, + 0xba, 0xbb, 0xbc, 0xbe, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xcf, 0xce, 0xcc, 0xc9, + 0xc7, 0xc4, 0xc2, 0xc1, 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xba, 0xa3, 0xa0, 0xae, + 0xb1, 0xb0, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xad, 0x97, 0x8a, 0x87, 0x87, 0x8a, 0x84, 0x75, 0x9d, 0xa8, 0xb3, 0xb5, + 0xb0, 0xad, 0xb2, 0xb9, 0xba, 0xb3, 0x94, 0x9e, 0xb2, 0xac, 0xb2, 0xb5, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb0, 0xb0, 0xaf, 0xae, + 0xac, 0xab, 0xac, 0xaf, 0xbc, 0x9e, 0x9d, 0xb2, 0xb5, 0xb2, 0xb4, 0xb3, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xbc, 0xbd, 0xbe, 0xbe, + 0xbc, 0xb9, 0xb5, 0xb2, 0xc5, 0xb4, 0xa0, 0xa7, 0xbe, 0xbf, 0xb7, 0xbe, + 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbf, 0xba, 0xbd, 0xb9, + 0xab, 0xac, 0xba, 0xc1, 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xbb, 0xb9, 0xb7, 0xbe, + 0xa6, 0x9a, 0xb8, 0xb8, 0xb6, 0xb5, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, + 0xb0, 0xa2, 0xa9, 0xb5, 0xb2, 0xb3, 0xb8, 0xb2, 0xb1, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9, + 0xb9, 0xba, 0xbb, 0xbb, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbc, 0xbb, 0xbd, 0xc1, + 0xc5, 0xc3, 0xba, 0xb2, 0xc2, 0xb4, 0xab, 0x7c, 0x5c, 0x63, 0x59, 0x53, + 0x66, 0x6b, 0x69, 0x64, 0x6c, 0x7b, 0x7f, 0x79, 0x78, 0x75, 0x78, 0x82, + 0x8c, 0x8a, 0x7a, 0x6b, 0x57, 0x5a, 0x5f, 0x66, 0x6a, 0x6c, 0x6a, 0x68, + 0x7a, 0x78, 0x77, 0x73, 0x65, 0x57, 0x58, 0x61, 0x63, 0x5c, 0x51, 0x4a, + 0x4a, 0x4f, 0x57, 0x5c, 0x55, 0x46, 0x3d, 0x42, 0x70, 0x5f, 0x54, 0x5a, + 0x69, 0x7e, 0x65, 0x6e, 0x9f, 0xa5, 0x8f, 0x7b, 0x73, 0x88, 0x94, 0x69, + 0xac, 0xab, 0xa8, 0xb3, 0xb2, 0xb2, 0xb6, 0xb9, 0xb7, 0xb4, 0xb2, 0xb0, + 0xbf, 0xaa, 0xbd, 0xc1, 0xcb, 0xc3, 0xbe, 0xb6, 0xac, 0xbf, 0xb5, 0xc1, + 0xb8, 0xbf, 0xc4, 0xbf, 0xc5, 0xbf, 0xcc, 0xca, 0xce, 0xd4, 0xc6, 0xc9, + 0xc8, 0xcd, 0xcc, 0xc0, 0xb2, 0xb0, 0xbe, 0xcd, 0xcd, 0xcb, 0xc8, 0xc6, + 0xc4, 0xc4, 0xc5, 0xc6, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xc6, 0xcd, 0xd2, 0xce, 0xc5, 0xc1, 0xc5, 0xcc, 0xbe, 0xc4, 0xcb, 0xce, + 0xd1, 0xb7, 0x1f, 0x03, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xba, 0xa3, 0xa1, 0xaf, 0xb2, 0xb0, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb0, 0xc1, 0xc1, 0xa4, 0xa1, 0xac, 0xa4, + 0xab, 0xa7, 0xa4, 0xa8, 0xaf, 0xb4, 0xb2, 0xaf, 0xbd, 0xbd, 0xa8, 0xa3, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xbc, 0xaf, 0xa7, 0xab, 0xb0, 0xae, 0xaa, 0xa9, 0xb4, 0xa0, 0xa4, 0xb4, + 0xb5, 0xb4, 0xb7, 0xb4, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb8, 0xb6, 0xb5, 0xb7, 0xba, 0xbe, 0xc0, 0xbb, 0xa2, 0xa5, 0xba, + 0xbb, 0xb4, 0xb9, 0xbd, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, + 0xbe, 0xbb, 0xbd, 0xb9, 0xab, 0xad, 0xbb, 0xc1, 0xbb, 0xbb, 0xba, 0xba, + 0xb9, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb1, 0xc0, 0xb7, 0xb8, 0xaf, 0x9d, 0xaa, 0xb5, 0xb4, 0xb6, 0xb8, 0xb9, + 0xb7, 0xb2, 0xac, 0xa8, 0xb0, 0xa3, 0xa9, 0xb4, 0xb2, 0xb3, 0xb7, 0xb3, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, + 0xbe, 0xbd, 0xbd, 0xc0, 0xc3, 0xc1, 0xbb, 0xb5, 0xb7, 0xb6, 0xb4, 0x80, + 0x53, 0x5c, 0x6b, 0x7c, 0x77, 0x6f, 0x6e, 0x76, 0x7c, 0x78, 0x74, 0x74, + 0x85, 0x74, 0x5f, 0x52, 0x50, 0x53, 0x55, 0x54, 0x57, 0x5a, 0x60, 0x67, + 0x6d, 0x72, 0x75, 0x76, 0x77, 0x6b, 0x63, 0x63, 0x62, 0x5a, 0x55, 0x56, + 0x44, 0x49, 0x50, 0x58, 0x5b, 0x57, 0x4d, 0x45, 0x56, 0x4e, 0x5c, 0x54, + 0x61, 0x67, 0x77, 0x65, 0x83, 0x82, 0x6b, 0x64, 0x93, 0xa1, 0x80, 0x84, + 0x78, 0x9f, 0xd0, 0x81, 0x7c, 0xae, 0x9f, 0xab, 0xae, 0xb1, 0xba, 0xb9, + 0xb1, 0xb6, 0xbd, 0xb9, 0xb4, 0xc0, 0xd6, 0xd2, 0xdf, 0xda, 0xd9, 0xce, + 0xd0, 0xc0, 0xc4, 0xbe, 0xb3, 0xc3, 0xb0, 0xc4, 0xc2, 0xcd, 0xc6, 0xcb, + 0xc7, 0xbf, 0xcb, 0xc8, 0xce, 0xcb, 0xc6, 0xc0, 0xbd, 0xbf, 0xc3, 0xc6, + 0xcb, 0xc9, 0xc7, 0xc6, 0xc5, 0xc6, 0xc7, 0xc8, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd4, 0xcc, 0xc4, 0xc2, 0xc5, 0xc8, 0xc6, 0xc2, + 0xc0, 0xc2, 0xbb, 0xc0, 0xd8, 0xc1, 0x1f, 0x03, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb8, 0xa4, 0xa3, 0xb2, 0xb4, 0xb1, 0xb4, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb3, 0xb4, 0xc0, 0x97, + 0x4a, 0x4d, 0x97, 0xc3, 0xb8, 0xad, 0xa3, 0xa5, 0xaf, 0xb6, 0xb4, 0xae, + 0xb5, 0xb2, 0xad, 0xa4, 0xab, 0xb2, 0xad, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xbc, 0xaf, 0xa6, 0xaa, 0xb1, 0xb1, 0xae, 0xae, + 0xa7, 0xa5, 0xae, 0xb6, 0xb5, 0xb8, 0xba, 0xb5, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xb8, 0xb6, 0xb5, 0xb4, 0xb6, 0xb9, 0xbc, 0xbf, + 0xa7, 0xa2, 0xb2, 0xc1, 0xb8, 0xb2, 0xb8, 0xba, 0xba, 0xba, 0xbb, 0xbc, + 0xbc, 0xbd, 0xbe, 0xbe, 0xbe, 0xbb, 0xbd, 0xb8, 0xac, 0xb0, 0xbd, 0xc0, + 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xba, 0xbb, 0xb3, 0xb8, 0xb3, 0xa7, 0xb2, 0xbb, + 0xb4, 0xb7, 0xba, 0xbc, 0xba, 0xb6, 0xb0, 0xac, 0xb0, 0xa5, 0xa8, 0xb2, + 0xb2, 0xb3, 0xb6, 0xb5, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xc1, 0xbf, 0xbd, 0xbd, 0xbf, 0xbf, 0xbd, 0xba, + 0xc5, 0xc0, 0xb9, 0x8b, 0x61, 0x62, 0x6d, 0x77, 0x7f, 0x6d, 0x62, 0x68, + 0x71, 0x72, 0x73, 0x77, 0x78, 0x7e, 0x85, 0x88, 0x83, 0x74, 0x62, 0x55, + 0x6e, 0x6d, 0x70, 0x77, 0x7c, 0x79, 0x6e, 0x63, 0x59, 0x50, 0x4d, 0x55, + 0x5c, 0x59, 0x56, 0x56, 0x60, 0x66, 0x6a, 0x64, 0x54, 0x45, 0x3d, 0x3b, + 0x49, 0x46, 0x5e, 0x5a, 0x64, 0x6b, 0x7c, 0x62, 0x7a, 0x71, 0x66, 0x63, + 0x95, 0x9c, 0x6a, 0x7b, 0x96, 0x95, 0x9b, 0x81, 0x76, 0xb0, 0xe2, 0xb7, + 0xb4, 0xbc, 0xba, 0xb4, 0xb6, 0xba, 0xb6, 0xb2, 0xb3, 0xd2, 0xc4, 0x84, + 0x6e, 0x72, 0xb2, 0xe5, 0xe7, 0xda, 0xc3, 0xcf, 0xca, 0xcb, 0xbe, 0xba, + 0xc0, 0xc7, 0xbf, 0xc9, 0xcc, 0xc7, 0xd0, 0xc9, 0xc3, 0xc2, 0xc4, 0xc8, + 0xcd, 0xcd, 0xc9, 0xc5, 0xc9, 0xc8, 0xc6, 0xc6, 0xc6, 0xc8, 0xca, 0xcb, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xce, 0xce, 0xcb, 0xc3, + 0xbb, 0xba, 0xc1, 0xc8, 0xba, 0xa7, 0xa8, 0xc2, 0xd4, 0xb2, 0x14, 0x00, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xa4, 0xa6, 0xb5, + 0xb6, 0xb2, 0xb5, 0xb8, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb9, 0xac, 0xb4, 0xb6, 0xa9, 0xb2, 0xc5, 0xc0, 0xb8, 0xb7, 0xb6, 0xb4, + 0xb2, 0xb3, 0xb5, 0xb8, 0xba, 0xad, 0xb2, 0xab, 0xaf, 0xb7, 0xae, 0xbb, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb1, 0xb3, 0xb2, 0xae, + 0xae, 0xb4, 0xb8, 0xb9, 0x9e, 0xab, 0xb7, 0xb8, 0xb6, 0xbb, 0xbd, 0xb7, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, + 0xb9, 0xb5, 0xb1, 0xae, 0x9d, 0xba, 0xc0, 0xb5, 0xb8, 0xbc, 0xb7, 0xb6, + 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbe, 0xbc, 0xbd, 0xb6, + 0xac, 0xb4, 0xc0, 0xbf, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb5, 0xb5, 0xb1, 0xbe, + 0xc2, 0xae, 0xaa, 0xbb, 0xc1, 0xbf, 0xbd, 0xb9, 0xb7, 0xb5, 0xb3, 0xb3, + 0xb1, 0xa8, 0xa7, 0xaf, 0xb3, 0xb3, 0xb5, 0xb7, 0xb4, 0xb5, 0xb5, 0xb6, + 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, + 0xbb, 0xbc, 0xbc, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xc3, 0xc1, 0xbe, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xb8, 0xbd, 0xb7, 0x89, 0x52, 0x46, 0x58, 0x68, + 0x6d, 0x6b, 0x6c, 0x73, 0x7f, 0x86, 0x7f, 0x73, 0x77, 0x7b, 0x7e, 0x7e, + 0x7a, 0x76, 0x74, 0x73, 0x6e, 0x63, 0x5a, 0x5e, 0x69, 0x6a, 0x5e, 0x50, + 0x48, 0x4b, 0x55, 0x61, 0x61, 0x58, 0x55, 0x59, 0x56, 0x53, 0x4e, 0x49, + 0x46, 0x47, 0x4c, 0x50, 0x41, 0x3e, 0x4c, 0x57, 0x7c, 0x71, 0x6a, 0x5f, + 0x79, 0x7b, 0x64, 0x73, 0xab, 0xa3, 0x7c, 0x8d, 0x91, 0x9a, 0x90, 0xa3, + 0x90, 0x6f, 0xc8, 0xd2, 0xa8, 0xba, 0xb7, 0xb2, 0xbe, 0xba, 0xb6, 0xc7, + 0xcb, 0xc5, 0x95, 0x71, 0x7e, 0x58, 0x38, 0x29, 0x62, 0x96, 0xb9, 0xef, + 0xeb, 0xd9, 0xd1, 0xc5, 0xcc, 0xc3, 0xcc, 0xc5, 0xc6, 0xce, 0xc6, 0xcd, + 0xcc, 0xcb, 0xca, 0xc6, 0xc3, 0xc3, 0xc7, 0xca, 0xc7, 0xc7, 0xc6, 0xc6, + 0xc7, 0xca, 0xcc, 0xce, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xc5, 0xce, 0xd3, 0xc9, 0xb8, 0xb2, 0xbc, 0xc9, 0xc6, 0xba, 0xad, 0xbc, + 0xd8, 0xba, 0x18, 0x06, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb4, 0xa4, 0xa9, 0xb9, 0xb8, 0xb3, 0xb7, 0xba, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xba, 0xbb, 0xbb, 0xbd, 0xc0, 0xbe, 0xb8, 0xb6, + 0xb3, 0xba, 0xc1, 0xbf, 0xb7, 0xb2, 0xb5, 0xb9, 0xba, 0xb1, 0xb6, 0xa7, + 0xa7, 0xb8, 0xb2, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb1, 0xbc, 0xbd, 0xb1, 0xaf, 0xba, 0xbb, 0xb1, 0x9e, 0xb2, 0xbd, 0xb9, + 0xb8, 0xbd, 0xbd, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xc0, 0xc0, 0xc0, 0xbd, 0xb9, 0xb4, 0xae, 0xab, 0xae, 0xc6, 0xc4, 0xb3, + 0xb7, 0xc0, 0xbb, 0xb5, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbf, + 0xbe, 0xbd, 0xbd, 0xb4, 0xad, 0xb8, 0xc4, 0xbe, 0xbd, 0xbd, 0xbc, 0xbc, + 0xbb, 0xba, 0xba, 0xb9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xc3, 0xbd, 0xbc, 0xc0, 0xa6, 0xa0, 0xcf, 0xc3, 0xc1, 0xbd, 0xb8, + 0xb3, 0xb0, 0xad, 0xac, 0xb1, 0xaa, 0xa6, 0xac, 0xb3, 0xb3, 0xb3, 0xba, + 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc3, 0xc2, 0xc0, 0xbe, 0xbd, 0xbd, 0xbe, 0xc0, 0xbb, 0xb9, 0xa8, 0x81, + 0x55, 0x4e, 0x69, 0x78, 0x79, 0x73, 0x6f, 0x72, 0x78, 0x78, 0x71, 0x69, + 0x76, 0x76, 0x75, 0x71, 0x6c, 0x68, 0x68, 0x69, 0x6e, 0x6f, 0x6b, 0x5e, + 0x4d, 0x43, 0x43, 0x48, 0x42, 0x47, 0x57, 0x68, 0x6a, 0x5c, 0x50, 0x4c, + 0x61, 0x54, 0x49, 0x48, 0x50, 0x51, 0x48, 0x3d, 0x44, 0x40, 0x50, 0x56, + 0x74, 0x71, 0x74, 0x66, 0x81, 0x91, 0x53, 0x69, 0xa6, 0x91, 0x89, 0x95, + 0x9e, 0x9b, 0x8a, 0xa0, 0xa8, 0x8a, 0x73, 0xc1, 0xbd, 0xc2, 0xc5, 0xbf, + 0xb2, 0xa8, 0xb3, 0xc9, 0xa5, 0x82, 0x57, 0x5d, 0x98, 0x78, 0x46, 0x39, + 0x1c, 0x29, 0x35, 0x35, 0x52, 0xa7, 0xbc, 0xca, 0xf6, 0xe3, 0xde, 0xce, + 0xcc, 0xd3, 0xc8, 0xcd, 0xca, 0xcb, 0xca, 0xc7, 0xc4, 0xc4, 0xc7, 0xcb, + 0xc8, 0xc7, 0xc7, 0xc7, 0xc8, 0xca, 0xcd, 0xcf, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xcd, 0xc9, 0xc6, 0xc7, 0xca, 0xc7, 0xbf, 0xb8, + 0xc0, 0xd7, 0xc1, 0xb9, 0xe1, 0xc8, 0x15, 0x00, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb2, 0xa5, 0xac, 0xbc, 0xba, 0xb4, 0xb8, 0xbd, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xba, 0xc1, 0xb9, 0xb5, + 0xbe, 0xba, 0xb1, 0xb7, 0xb4, 0xb7, 0xbb, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, + 0xb1, 0xb8, 0xbc, 0xa6, 0x9f, 0xb9, 0xc4, 0xbd, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb9, 0xbe, 0xba, 0xb2, 0xb6, 0xbd, 0xb1, 0x9d, + 0xa6, 0xb9, 0xbd, 0xb8, 0xba, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xc1, 0xbf, 0xbb, 0xb8, 0xb6, 0xb7, 0xb8, 0xba, + 0xc7, 0xbe, 0xbf, 0xbe, 0xb5, 0xb9, 0xbf, 0xb7, 0xbc, 0xbc, 0xbd, 0xbe, + 0xbe, 0xbf, 0xc0, 0xc0, 0xbe, 0xbe, 0xbd, 0xb3, 0xad, 0xbc, 0xc7, 0xbd, + 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xc0, 0xbc, 0xc5, 0xaf, 0x86, 0x74, 0x7a, 0x90, + 0xaf, 0xb2, 0xb6, 0xb8, 0xb8, 0xb4, 0xaf, 0xac, 0xb1, 0xad, 0xa5, 0xa9, + 0xb3, 0xb3, 0xb2, 0xbc, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xc1, 0xc0, 0xc0, 0xbf, + 0xbf, 0xbe, 0xbe, 0xbe, 0xc0, 0xc2, 0xc4, 0xc2, 0xbf, 0xbd, 0xbe, 0xc0, + 0xb6, 0xad, 0x96, 0x81, 0x66, 0x5e, 0x71, 0x70, 0x72, 0x6c, 0x78, 0x93, + 0x96, 0x81, 0x73, 0x77, 0x91, 0x87, 0x79, 0x6f, 0x6c, 0x70, 0x77, 0x7b, + 0x8b, 0x6e, 0x4e, 0x42, 0x4c, 0x5c, 0x63, 0x62, 0x64, 0x5d, 0x60, 0x6f, + 0x75, 0x63, 0x47, 0x33, 0x3a, 0x3d, 0x40, 0x3e, 0x3b, 0x39, 0x3c, 0x3f, + 0x3c, 0x3b, 0x5e, 0x50, 0x46, 0x60, 0x85, 0x5f, 0x77, 0x99, 0x4a, 0x60, + 0x9d, 0x7e, 0x7b, 0x79, 0xa8, 0x9f, 0x91, 0xa7, 0x92, 0xb9, 0x67, 0x87, + 0xc5, 0xae, 0xb5, 0xbd, 0xaf, 0xb8, 0xc5, 0xb6, 0x8a, 0x61, 0x47, 0x4c, + 0x8c, 0x85, 0x69, 0x7a, 0x5d, 0x3d, 0x2d, 0x3d, 0x2f, 0x25, 0x26, 0x4d, + 0x74, 0xa1, 0xc8, 0xea, 0xe9, 0xd3, 0xd1, 0xc7, 0xd6, 0xd0, 0xc9, 0xc6, + 0xc8, 0xca, 0xca, 0xc8, 0xcb, 0xca, 0xc8, 0xc8, 0xc8, 0xca, 0xcc, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xd1, 0xc8, 0xc3, 0xca, + 0xd5, 0xd5, 0xc6, 0xb5, 0xcc, 0xcc, 0xd4, 0xcf, 0xbc, 0x9f, 0x1a, 0x0e, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb0, 0xa5, 0xaf, 0xbf, + 0xbc, 0xb5, 0xb9, 0xbf, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xb5, 0xbd, 0xbf, 0xbd, 0xbd, 0xb7, 0xb4, 0xb8, 0xba, 0xb8, 0xb7, 0xb9, + 0xbd, 0xbe, 0xbb, 0xb8, 0xb9, 0xc0, 0xc0, 0xb1, 0x98, 0x9c, 0xbb, 0xc3, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb0, 0xae, 0xaf, 0xb7, + 0xbc, 0xb5, 0xa6, 0x9a, 0xb2, 0xbe, 0xbb, 0xb6, 0xbc, 0xbc, 0xb9, 0xbf, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbc, 0xba, 0xb9, + 0xba, 0xbc, 0xc0, 0xc2, 0xc5, 0xba, 0xbd, 0xc0, 0xb6, 0xb6, 0xbd, 0xbb, + 0xbd, 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xbe, 0xbe, 0xbd, 0xb2, + 0xae, 0xbf, 0xc9, 0xbd, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xc2, 0xd0, 0xb4, + 0xa1, 0xb6, 0xb7, 0xad, 0xb0, 0xb3, 0xb7, 0xba, 0xbb, 0xb8, 0xb3, 0xb0, + 0xb1, 0xae, 0xa5, 0xa7, 0xb4, 0xb2, 0xb1, 0xbe, 0xb8, 0xb9, 0xb9, 0xba, + 0xbb, 0xbb, 0xbc, 0xbc, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, + 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc2, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xc1, 0xc7, 0xc7, + 0xc2, 0xbe, 0xbd, 0xbe, 0xb2, 0xba, 0xb2, 0xa2, 0x7a, 0x63, 0x79, 0x7e, + 0x8f, 0x7c, 0x75, 0x7b, 0x72, 0x60, 0x64, 0x79, 0x7f, 0x76, 0x6c, 0x6a, + 0x6d, 0x70, 0x6d, 0x69, 0x5e, 0x70, 0x7c, 0x70, 0x54, 0x43, 0x48, 0x55, + 0x42, 0x3a, 0x3e, 0x54, 0x64, 0x5f, 0x4c, 0x3d, 0x39, 0x43, 0x4a, 0x45, + 0x3a, 0x38, 0x43, 0x51, 0x32, 0x36, 0x60, 0x52, 0x42, 0x5b, 0x7d, 0x50, + 0x76, 0xa1, 0x5e, 0x67, 0xa7, 0x91, 0x7d, 0x79, 0x8e, 0x88, 0x91, 0xab, + 0x9d, 0xd5, 0xaf, 0x70, 0xae, 0xaa, 0xb0, 0xb3, 0xb6, 0xbe, 0xa9, 0x7a, + 0x75, 0x71, 0x84, 0x6b, 0x84, 0x81, 0x61, 0x75, 0x99, 0xa5, 0x80, 0x7d, + 0x69, 0x5c, 0x4d, 0x29, 0x33, 0x2c, 0x1e, 0x43, 0x7c, 0xb0, 0xdf, 0xe7, + 0xde, 0xda, 0xd4, 0xcd, 0xc9, 0xca, 0xcd, 0xd0, 0xce, 0xcd, 0xcb, 0xc9, + 0xc8, 0xc9, 0xca, 0xcb, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcd, 0xcc, 0xcd, 0xd1, 0xd3, 0xd2, 0xcd, 0xc8, 0xc0, 0xbd, 0xec, 0xf4, + 0xb8, 0x92, 0x1e, 0x04, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xaf, 0xa5, 0xb0, 0xc0, 0xbc, 0xb5, 0xba, 0xc0, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb6, 0xb6, 0xbf, 0xc2, 0xba, 0xba, 0xbe, 0xbb, + 0xc0, 0xbe, 0xbc, 0xbb, 0xbc, 0xbf, 0xc3, 0xc5, 0xbf, 0xb5, 0xac, 0xaa, + 0x7a, 0x57, 0x7f, 0xa0, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0x9d, 0x9a, 0xa7, 0xbd, 0xbe, 0xaa, 0xa1, 0xa8, 0xba, 0xc1, 0xb9, 0xb5, + 0xbe, 0xbb, 0xb7, 0xc0, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xba, 0xbc, 0xbf, 0xc1, 0xc1, 0xc0, 0xbe, 0xbc, 0xb2, 0xc2, 0xbf, 0xb5, + 0xb8, 0xb9, 0xb7, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, + 0xbd, 0xbf, 0xbc, 0xb1, 0xae, 0xc1, 0xca, 0xbc, 0xbf, 0xbf, 0xbe, 0xbd, + 0xbd, 0xbc, 0xbb, 0xbb, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xb6, 0xd0, 0x9b, 0x58, 0x90, 0xc8, 0xb5, 0xc3, 0xcf, 0xcb, 0xc6, 0xbf, + 0xb7, 0xb2, 0xad, 0xab, 0xb1, 0xaf, 0xa4, 0xa6, 0xb4, 0xb2, 0xb1, 0xbf, + 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc3, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xb9, 0xc1, 0xc9, 0xca, 0xc4, 0xbe, 0xbc, 0xbc, 0xbb, 0xbb, 0xaa, 0x9e, + 0x7e, 0x6b, 0x83, 0x85, 0x83, 0x76, 0x68, 0x5f, 0x59, 0x60, 0x78, 0x92, + 0x81, 0x77, 0x6d, 0x6d, 0x71, 0x6f, 0x64, 0x58, 0x84, 0x7f, 0x72, 0x5f, + 0x50, 0x4d, 0x57, 0x62, 0x67, 0x60, 0x60, 0x67, 0x66, 0x5a, 0x4c, 0x47, + 0x4b, 0x45, 0x40, 0x45, 0x4d, 0x4e, 0x44, 0x39, 0x36, 0x3c, 0x5e, 0x63, + 0x6f, 0x6c, 0x6d, 0x4c, 0x78, 0x9a, 0x5e, 0x53, 0x98, 0x9c, 0x82, 0x8d, + 0x9d, 0x95, 0xb1, 0x8c, 0xa7, 0xb9, 0xbf, 0x88, 0x6b, 0xa7, 0xb9, 0xaf, + 0xbd, 0xb5, 0x84, 0x5f, 0x60, 0x6c, 0x91, 0x64, 0x79, 0x93, 0x74, 0x7a, + 0x79, 0x81, 0x91, 0x96, 0x86, 0x8a, 0x74, 0x7c, 0x4d, 0x48, 0x4d, 0x3b, + 0x2f, 0x33, 0x32, 0x42, 0x9c, 0xba, 0xdf, 0xf2, 0xf0, 0xe4, 0xdd, 0xdc, + 0xd0, 0xcf, 0xcc, 0xc9, 0xc8, 0xc8, 0xc9, 0xca, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xcf, 0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, + 0xc9, 0xdb, 0xd2, 0xa6, 0x94, 0x9b, 0x24, 0x09, 0xc3, 0xb9, 0xc0, 0xb3, + 0xb2, 0xbc, 0xb5, 0xc1, 0xa9, 0xa0, 0xb8, 0xb6, 0xbf, 0xc0, 0xc0, 0xb9, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xb5, 0xbe, 0xa8, 0x6c, 0x5f, 0xa5, 0xcc, 0xa6, 0xbb, 0xbb, 0xba, 0xb9, + 0xb9, 0xb8, 0xb7, 0xb7, 0x92, 0x81, 0x91, 0xba, 0xc1, 0xa7, 0xa2, 0xb8, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc0, 0xbf, 0xbd, 0xbc, 0xbc, 0xbd, 0xbf, 0xc0, 0xbd, 0xbd, 0xbe, 0xbf, + 0xbf, 0xc0, 0xc1, 0xc1, 0xc5, 0xc2, 0xb9, 0xbb, 0xaf, 0xca, 0xc2, 0xc8, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbd, 0xc0, 0xc6, 0xcd, 0xcf, 0xc7, 0xb7, 0xaa, + 0x86, 0xb9, 0xcc, 0xbb, 0xb7, 0xba, 0xb7, 0xb6, 0xbb, 0xaf, 0xa6, 0xa7, + 0xa7, 0xb2, 0xb9, 0xb7, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc1, 0xc2, 0xc3, 0xc3, + 0xc1, 0xbf, 0xbc, 0xbb, 0xbb, 0xbe, 0xc6, 0xc6, 0xc2, 0xc5, 0xbf, 0xab, + 0xb5, 0xb6, 0xb6, 0xa4, 0x85, 0x75, 0x76, 0x73, 0x5a, 0x5f, 0x65, 0x6a, + 0x6c, 0x6c, 0x6d, 0x6e, 0x64, 0x5d, 0x65, 0x74, 0x6c, 0x56, 0x5b, 0x75, + 0x7b, 0x68, 0x5d, 0x65, 0x6a, 0x64, 0x5d, 0x5c, 0x50, 0x69, 0x7f, 0x7c, + 0x64, 0x4e, 0x4b, 0x51, 0x47, 0x4b, 0x51, 0x59, 0x5d, 0x58, 0x4c, 0x43, + 0x3f, 0x44, 0x5d, 0x66, 0x7f, 0x76, 0x7d, 0x7b, 0x6f, 0x85, 0x5c, 0x65, + 0x94, 0x76, 0x67, 0x94, 0xa3, 0x9d, 0xa1, 0xa2, 0x9c, 0xb1, 0xa9, 0xbd, + 0x86, 0x89, 0xc3, 0xb0, 0x8e, 0x8c, 0x65, 0x5e, 0x88, 0x80, 0x85, 0x76, + 0x67, 0x89, 0x62, 0x5b, 0x8f, 0x7e, 0x78, 0x85, 0x72, 0x70, 0x95, 0x94, + 0x9b, 0x9a, 0x7c, 0x70, 0x5d, 0x2f, 0x52, 0x2f, 0x1b, 0x27, 0x35, 0x5e, + 0xa1, 0xba, 0xe6, 0xfa, 0xee, 0xe0, 0xd7, 0xcb, 0xc9, 0xcd, 0xc7, 0xc8, + 0xd3, 0xce, 0xcf, 0xd6, 0xd4, 0xcb, 0xc6, 0xc9, 0xd8, 0xd6, 0xd7, 0xd7, + 0xcc, 0xcb, 0xd7, 0xd8, 0xf4, 0xe6, 0x96, 0x63, 0x51, 0x52, 0x2f, 0x0a, + 0xbf, 0xb3, 0xbd, 0xbc, 0xbf, 0xc3, 0xb8, 0xc1, 0xad, 0xa4, 0xbd, 0xba, + 0xc2, 0xc1, 0xc0, 0xb9, 0xbf, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xd0, 0xc7, 0x8a, 0x64, 0x8c, 0xb6, 0xbe, 0xc9, + 0xbc, 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb8, 0xae, 0x9b, 0x95, 0xa1, + 0xa4, 0x9c, 0xa5, 0xba, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xc0, 0xbe, 0xbd, 0xbb, 0xbb, 0xbd, 0xbe, 0xc0, + 0xbe, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, 0xcb, 0xc5, 0xd5, 0xb5, + 0x9e, 0xcf, 0xbe, 0xcc, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0xc2, 0xc3, 0xc6, + 0xc9, 0xc5, 0xbd, 0xb5, 0x9f, 0xc0, 0xc9, 0xbd, 0xbd, 0xc0, 0xb8, 0xb3, + 0xb2, 0xb7, 0xa1, 0xb0, 0xa9, 0xb6, 0xb2, 0xb5, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xc0, + 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, + 0xc3, 0xc4, 0xc4, 0xc4, 0xc2, 0xbf, 0xbc, 0xba, 0xb6, 0xb8, 0xc0, 0xc3, + 0xc3, 0xca, 0xc8, 0xb7, 0xac, 0xb5, 0xb0, 0xb0, 0x8a, 0x64, 0x6c, 0x68, + 0x66, 0x6e, 0x75, 0x77, 0x74, 0x71, 0x71, 0x72, 0x6f, 0x6f, 0x65, 0x5b, + 0x67, 0x7f, 0x85, 0x7a, 0x71, 0x72, 0x79, 0x82, 0x81, 0x74, 0x64, 0x5c, + 0x58, 0x64, 0x6c, 0x63, 0x52, 0x49, 0x51, 0x5d, 0x55, 0x58, 0x5b, 0x59, + 0x54, 0x4f, 0x4c, 0x4b, 0x3c, 0x3d, 0x5b, 0x63, 0x74, 0x6d, 0x7a, 0x73, + 0x61, 0x7b, 0x58, 0x62, 0x93, 0x82, 0x7a, 0xa1, 0x9c, 0x90, 0x96, 0xa9, + 0xad, 0xbb, 0xa8, 0xb4, 0xab, 0x77, 0xa9, 0xcd, 0x72, 0x3c, 0x60, 0x6d, + 0x7e, 0x82, 0x78, 0x7c, 0x6b, 0x89, 0x85, 0x5c, 0x85, 0x6f, 0x71, 0x87, + 0x90, 0x83, 0x7a, 0x86, 0x79, 0x86, 0x8c, 0x98, 0xa6, 0x83, 0x81, 0x64, + 0x62, 0x3b, 0x3e, 0x2d, 0x26, 0x24, 0x3e, 0x5b, 0xaa, 0xce, 0xdb, 0xeb, + 0xe4, 0xd3, 0xdb, 0xcd, 0xd2, 0xd8, 0xdd, 0xdb, 0xd6, 0xd0, 0xcb, 0xc7, + 0xda, 0xd2, 0xcd, 0xd3, 0xdf, 0xd0, 0xd0, 0xfd, 0xe9, 0xab, 0x8e, 0x8f, + 0x90, 0x7d, 0x1f, 0x04, 0xc2, 0xc4, 0xc9, 0xbb, 0xbc, 0xcb, 0xc8, 0xc7, + 0xb1, 0xa7, 0xbc, 0xb6, 0xbc, 0xbe, 0xc2, 0xbf, 0xc2, 0xc1, 0xc1, 0xc0, + 0xbf, 0xbe, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbe, 0xc4, 0xc9, 0xd2, + 0xd3, 0xc2, 0xb6, 0xbb, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb9, + 0xc3, 0xc2, 0xa9, 0x87, 0x87, 0xa8, 0xc0, 0xc1, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbf, 0xbe, 0xbc, 0xbb, + 0xbb, 0xbc, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc2, 0xc3, + 0xb4, 0xbf, 0xb3, 0xc2, 0xaf, 0xb3, 0xc9, 0xbd, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc7, 0xc3, 0xc0, 0xc0, 0xc2, 0xc4, 0xc4, 0xc3, 0xc5, 0xce, 0xca, 0xc1, + 0xc2, 0xbf, 0xb3, 0xac, 0xb7, 0xc5, 0x98, 0xa9, 0xa0, 0xb2, 0xb1, 0xc0, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc5, + 0xc5, 0xc6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc5, 0xc2, 0xbf, 0xbb, 0xb9, + 0xc1, 0xbe, 0xc2, 0xc3, 0xc0, 0xc6, 0xc5, 0xb8, 0xab, 0xb6, 0xad, 0xb6, + 0x8d, 0x5a, 0x6a, 0x69, 0x63, 0x6f, 0x7c, 0x7f, 0x79, 0x74, 0x77, 0x7c, + 0x64, 0x62, 0x64, 0x6b, 0x72, 0x74, 0x6f, 0x6a, 0x66, 0x68, 0x64, 0x5a, + 0x55, 0x58, 0x5c, 0x5d, 0x56, 0x62, 0x70, 0x71, 0x69, 0x60, 0x5d, 0x5f, + 0x5e, 0x5f, 0x5c, 0x53, 0x48, 0x43, 0x47, 0x4d, 0x39, 0x39, 0x5c, 0x61, + 0x65, 0x63, 0x77, 0x6b, 0x72, 0x8b, 0x67, 0x65, 0x89, 0x7d, 0x76, 0x8e, + 0x9d, 0x99, 0x98, 0x9f, 0xa2, 0xb6, 0xa5, 0xa3, 0xc7, 0xb7, 0x81, 0xcf, + 0xc0, 0x51, 0x7a, 0x98, 0x8e, 0x84, 0x6f, 0x75, 0x5e, 0x77, 0x8d, 0x5e, + 0x88, 0x7c, 0x8c, 0x8d, 0x85, 0x77, 0x66, 0x80, 0x96, 0x8b, 0x7e, 0x79, + 0x8a, 0x7a, 0x85, 0x9f, 0x9e, 0x7f, 0x84, 0x67, 0x4f, 0x35, 0x2e, 0x30, + 0x28, 0x21, 0x4f, 0x73, 0xab, 0xe1, 0xdf, 0xf1, 0xeb, 0xeb, 0xe3, 0xda, + 0xda, 0xde, 0xd5, 0xc4, 0xb8, 0xc2, 0xe5, 0xe3, 0xc6, 0xd4, 0xe3, 0xcb, + 0x80, 0x7e, 0x8e, 0x5f, 0x41, 0x62, 0x25, 0x04, 0xd8, 0xcc, 0xc9, 0xcb, + 0xcd, 0xca, 0xc4, 0xc5, 0xb4, 0xad, 0xc6, 0xbf, 0xc2, 0xbe, 0xbf, 0xba, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc6, 0xaf, 0xbb, 0xc7, 0xb8, 0xbb, 0xc7, 0xbc, 0xbe, 0xbe, 0xbd, 0xbd, + 0xbc, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xc0, 0xca, 0xcb, 0xc4, 0xc0, 0xc1, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbc, 0xbb, 0xbb, 0xbc, 0xbe, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc4, 0xc4, 0xc3, 0xc1, 0xcd, 0xc2, 0xb4, 0xc8, 0xcd, 0xd0, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc6, 0xc3, 0xc0, 0xbf, 0xc2, 0xc5, 0xc8, 0xca, + 0xc8, 0xc5, 0xc0, 0xc0, 0xc5, 0xc5, 0xc1, 0xc0, 0xab, 0xc3, 0xa1, 0xad, + 0xb2, 0xb0, 0xac, 0xb7, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, + 0xc4, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xc9, 0xc7, + 0xc4, 0xc0, 0xbc, 0xb9, 0xbc, 0xb7, 0xbb, 0xc1, 0xc2, 0xc9, 0xcd, 0xc5, + 0xc0, 0xb3, 0xa4, 0xa7, 0x90, 0x71, 0x70, 0x65, 0x67, 0x74, 0x7f, 0x7c, + 0x6e, 0x64, 0x66, 0x6c, 0x60, 0x43, 0x44, 0x6d, 0x85, 0x6f, 0x50, 0x46, + 0x48, 0x5b, 0x6b, 0x73, 0x7e, 0x89, 0x86, 0x7b, 0x71, 0x75, 0x79, 0x77, + 0x6e, 0x63, 0x5a, 0x55, 0x5b, 0x58, 0x51, 0x49, 0x44, 0x41, 0x43, 0x44, + 0x3b, 0x3e, 0x63, 0x62, 0x5d, 0x5c, 0x77, 0x69, 0x77, 0x8b, 0x6b, 0x65, + 0x7f, 0x7c, 0x7c, 0x87, 0x8a, 0x93, 0x95, 0xa0, 0x9f, 0xb2, 0xab, 0xac, + 0xc7, 0xaa, 0x51, 0x96, 0xdd, 0x96, 0x71, 0x5f, 0x6f, 0x71, 0x84, 0x87, + 0x68, 0x6e, 0x7e, 0x72, 0x84, 0x77, 0x7f, 0x76, 0x6d, 0x81, 0x8d, 0x90, + 0x77, 0x7c, 0x77, 0x76, 0x82, 0x7d, 0x78, 0x75, 0x6d, 0x87, 0x8e, 0x94, + 0xa8, 0x8c, 0x74, 0x4d, 0x41, 0x44, 0x24, 0x34, 0x33, 0x2d, 0x68, 0x7e, + 0xbf, 0xdb, 0xf7, 0xfb, 0xf1, 0xe7, 0xe2, 0xdf, 0xc8, 0xce, 0xd2, 0xdf, + 0xd5, 0xe3, 0xe8, 0x96, 0x90, 0x72, 0x40, 0x43, 0x7b, 0x77, 0x14, 0x0f, + 0xcc, 0xd3, 0xd6, 0xd7, 0xd2, 0xd2, 0xde, 0xe6, 0xbb, 0xb3, 0xc9, 0xbf, + 0xbe, 0xbb, 0xbf, 0xbd, 0xbc, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xca, 0xc0, 0xb7, 0xbc, 0xc9, 0xcb, 0xc4, 0xc0, + 0xc0, 0xbf, 0xbf, 0xbe, 0xbd, 0xbd, 0xbc, 0xbc, 0xbe, 0xb3, 0xb3, 0xbd, + 0xbf, 0xb8, 0xbb, 0xc7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xc1, 0xc0, 0xbe, 0xbd, 0xbd, 0xbe, 0xc0, 0xc1, + 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xd0, 0xdc, 0xe5, 0xb5, + 0xa7, 0xc6, 0xd1, 0xda, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc1, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc9, 0xcb, 0xc8, 0xc1, 0xc0, 0xc2, 0xc1, 0xc1, 0xc5, 0xc9, + 0xa8, 0xba, 0xb0, 0xa7, 0xc0, 0xa9, 0xad, 0xb1, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, + 0xca, 0xca, 0xca, 0xc8, 0xc6, 0xc2, 0xbe, 0xbc, 0xbb, 0xb4, 0xb9, 0xc1, + 0xc2, 0xc8, 0xcc, 0xc7, 0xb1, 0xb7, 0xca, 0xac, 0x77, 0x5f, 0x59, 0x68, + 0x5b, 0x67, 0x72, 0x71, 0x66, 0x62, 0x68, 0x72, 0x63, 0x69, 0x74, 0x7e, + 0x80, 0x7a, 0x79, 0x7c, 0x77, 0x75, 0x6a, 0x60, 0x65, 0x72, 0x70, 0x63, + 0x67, 0x69, 0x6b, 0x6a, 0x64, 0x5c, 0x54, 0x4e, 0x57, 0x4e, 0x47, 0x49, + 0x4f, 0x50, 0x47, 0x3e, 0x3e, 0x4c, 0x6f, 0x64, 0x5c, 0x5b, 0x76, 0x6e, + 0x73, 0x7e, 0x63, 0x5f, 0x70, 0x72, 0x7a, 0x7d, 0x97, 0x99, 0x92, 0xa5, + 0xa7, 0xb4, 0xb3, 0xb7, 0xb4, 0xa0, 0x5e, 0x52, 0xd0, 0xe9, 0x7a, 0x71, + 0x86, 0x7b, 0x73, 0x6c, 0x71, 0x7b, 0x7b, 0x63, 0x5a, 0x73, 0x83, 0x89, + 0x7c, 0x78, 0x7d, 0x69, 0x63, 0x8b, 0x8f, 0x87, 0x7a, 0x87, 0x93, 0x70, + 0x6f, 0x86, 0x83, 0x78, 0x88, 0x85, 0x9b, 0x9a, 0xa1, 0x7d, 0x7b, 0x54, + 0x43, 0x44, 0x20, 0x2a, 0x2a, 0x2b, 0x46, 0x82, 0xc4, 0xef, 0xff, 0xff, + 0xf4, 0xd4, 0xe0, 0xdf, 0xf9, 0xe2, 0x8a, 0x9f, 0x94, 0x54, 0x69, 0x98, + 0x8a, 0x75, 0x2d, 0x04, 0xe1, 0xde, 0xdb, 0xe7, 0xdb, 0xba, 0xaf, 0xab, + 0xa2, 0xa6, 0xcc, 0xce, 0xd0, 0xc6, 0xc2, 0xbc, 0xbf, 0xc0, 0xc0, 0xc1, + 0xc1, 0xc2, 0xc2, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc8, 0xc3, 0xc2, + 0xc5, 0xb8, 0xb4, 0xc9, 0xc1, 0xc1, 0xc0, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xbd, 0xc6, 0xc6, 0xbd, 0xbd, 0xc6, 0xc6, 0xbc, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc4, 0xc2, 0xc0, 0xbf, + 0xbf, 0xc0, 0xc2, 0xc4, 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, + 0xc1, 0x7f, 0x40, 0x44, 0x8e, 0xaa, 0xb8, 0xc2, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc0, 0xc4, 0xc9, 0xcb, 0xc9, 0xc8, 0xc8, 0xc9, 0xd0, 0xca, 0xca, 0xc7, + 0xbb, 0xb9, 0xbf, 0xc1, 0xb4, 0xb2, 0xba, 0x9d, 0xb8, 0xa4, 0xb0, 0xb7, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc5, 0xc5, 0xc6, 0xc7, + 0xc7, 0xc8, 0xc9, 0xc9, 0xc8, 0xc9, 0xc9, 0xc9, 0xc8, 0xc5, 0xc2, 0xc0, + 0xbf, 0xb6, 0xbb, 0xc4, 0xc3, 0xc1, 0xc2, 0xbc, 0xb2, 0xaa, 0xc6, 0xaf, + 0x93, 0x8e, 0x71, 0x71, 0x6c, 0x71, 0x74, 0x6d, 0x62, 0x5f, 0x65, 0x6e, + 0x76, 0x71, 0x69, 0x67, 0x6f, 0x78, 0x76, 0x6e, 0x6f, 0x6a, 0x65, 0x67, + 0x72, 0x7a, 0x72, 0x65, 0x62, 0x64, 0x66, 0x63, 0x5d, 0x55, 0x4f, 0x4c, + 0x56, 0x4d, 0x48, 0x50, 0x5d, 0x5f, 0x51, 0x42, 0x3e, 0x5d, 0x79, 0x61, + 0x5f, 0x5a, 0x71, 0x74, 0x87, 0x83, 0x6d, 0x73, 0x7c, 0x7d, 0x8e, 0x90, + 0x82, 0x96, 0x90, 0xa0, 0xa7, 0xb6, 0xa0, 0x7b, 0x69, 0x65, 0x7f, 0x70, + 0x77, 0xcd, 0xcb, 0x62, 0x5e, 0x81, 0x8a, 0x84, 0x82, 0x78, 0x8d, 0x78, + 0x70, 0x94, 0x89, 0x82, 0x7c, 0x69, 0x78, 0x88, 0x8f, 0x92, 0x7e, 0x81, + 0x6c, 0x7b, 0x99, 0x8f, 0x83, 0x66, 0x7b, 0x7f, 0x8d, 0x8b, 0x86, 0x82, + 0x6d, 0x97, 0x97, 0xa5, 0xa0, 0x89, 0x80, 0x52, 0x4b, 0x44, 0x39, 0x2a, + 0x1d, 0x2a, 0x5a, 0x8b, 0xc4, 0xf5, 0xef, 0xff, 0xc2, 0x66, 0x86, 0x8a, + 0x52, 0x67, 0x72, 0x4e, 0x57, 0x6e, 0x17, 0x04, 0xe8, 0xdd, 0xd8, 0xe7, + 0xbf, 0x85, 0xa3, 0xdb, 0xd0, 0xcd, 0xea, 0xe1, 0xdd, 0xd5, 0xd6, 0xd4, + 0xcb, 0xcb, 0xc9, 0xc7, 0xc6, 0xc4, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc4, 0xb9, 0xba, 0xc0, 0xbc, 0xbd, 0xc6, 0xcb, 0xc2, 0xc2, 0xc1, 0xc1, + 0xc0, 0xbf, 0xbf, 0xbe, 0xc0, 0xbc, 0xbe, 0xc6, 0xc6, 0xbc, 0xb9, 0xbd, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc6, 0xc5, 0xc3, 0xc2, 0xc2, 0xc3, 0xc5, 0xc6, 0xc4, 0xc5, 0xc5, 0xc6, + 0xc7, 0xc7, 0xc8, 0xc8, 0xc5, 0xb5, 0xb1, 0x50, 0x85, 0xc4, 0x82, 0x7d, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, 0xc3, 0xc8, 0xcc, 0xcc, 0xc8, 0xc6, 0xc8, 0xca, + 0xca, 0xc6, 0xca, 0xc8, 0xbe, 0xc3, 0xcc, 0xc6, 0xb6, 0xaa, 0xc0, 0xa5, + 0xaf, 0xab, 0xab, 0xb6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, + 0xc6, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xc6, 0xc7, 0xc8, 0xca, + 0xc9, 0xc8, 0xc6, 0xc5, 0xb4, 0xac, 0xb5, 0xc5, 0xc6, 0xc3, 0xc3, 0xbe, + 0xb0, 0xa9, 0xbd, 0xab, 0x87, 0x71, 0x58, 0x5a, 0x6f, 0x70, 0x6d, 0x68, + 0x65, 0x6a, 0x75, 0x7e, 0x7b, 0x72, 0x6e, 0x6e, 0x64, 0x59, 0x5f, 0x6e, + 0x68, 0x68, 0x72, 0x82, 0x8c, 0x89, 0x7f, 0x79, 0x7f, 0x7b, 0x71, 0x61, + 0x52, 0x4a, 0x4d, 0x51, 0x55, 0x4f, 0x4d, 0x54, 0x5e, 0x5f, 0x54, 0x47, + 0x3a, 0x6a, 0x7c, 0x59, 0x60, 0x57, 0x67, 0x78, 0x65, 0x55, 0x47, 0x5c, + 0x66, 0x68, 0x83, 0x8b, 0x97, 0xa4, 0x8e, 0x99, 0xa0, 0xb2, 0xa9, 0x89, + 0x6b, 0x91, 0x86, 0x75, 0x62, 0x8a, 0xd5, 0xb9, 0x78, 0x73, 0x7f, 0x75, + 0x68, 0x56, 0x6f, 0x6a, 0x5c, 0x70, 0x65, 0x64, 0x7d, 0x83, 0x7b, 0x7f, + 0x8e, 0x75, 0x68, 0x8d, 0x91, 0x8f, 0x77, 0x76, 0x7e, 0x70, 0x93, 0x92, + 0x86, 0x73, 0x7c, 0x92, 0x92, 0x8a, 0x8f, 0x78, 0x79, 0x94, 0x97, 0xa5, + 0xa7, 0x87, 0x60, 0x4a, 0x45, 0x3f, 0x33, 0x28, 0x31, 0x22, 0x72, 0x83, + 0x7a, 0x87, 0x51, 0x34, 0x66, 0x64, 0x75, 0x80, 0x8a, 0x83, 0x24, 0x03, + 0xe0, 0xef, 0xe6, 0xee, 0xf8, 0xf9, 0xf7, 0xd9, 0x49, 0x66, 0xb3, 0xd8, + 0xee, 0xe9, 0xe1, 0xd5, 0xd6, 0xd5, 0xd2, 0xce, 0xc9, 0xc5, 0xc2, 0xc0, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xbf, 0xc4, 0xc5, 0xc0, 0xbe, 0xc2, 0xc1, 0xbc, + 0xc3, 0xc3, 0xc2, 0xc1, 0xc1, 0xc0, 0xbf, 0xbf, 0xbc, 0xbc, 0xbd, 0xbf, + 0xc0, 0xbf, 0xbf, 0xc0, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc8, 0xc7, 0xc5, 0xc4, 0xc4, 0xc5, 0xc7, 0xc8, + 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xb9, 0x86, 0x7e, 0x6d, + 0xa5, 0x90, 0x73, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xc7, 0xcb, 0xcd, 0xcb, + 0xc6, 0xc4, 0xc8, 0xcd, 0xce, 0xc9, 0xcd, 0xca, 0xc1, 0xca, 0xcf, 0xc2, + 0xc5, 0xac, 0xbb, 0x9f, 0x97, 0xae, 0xab, 0xc4, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc4, + 0xc4, 0xc5, 0xc6, 0xc6, 0xc6, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, 0xca, 0xca, + 0xc4, 0xc5, 0xc8, 0xca, 0xcb, 0xca, 0xc9, 0xc8, 0xb8, 0xaf, 0xb8, 0xc8, + 0xc6, 0xbe, 0xb9, 0xb3, 0xac, 0xa8, 0xb3, 0xb0, 0x8c, 0x6d, 0x6a, 0x74, + 0x7a, 0x75, 0x6d, 0x66, 0x65, 0x6c, 0x77, 0x7f, 0x85, 0x72, 0x62, 0x60, + 0x63, 0x64, 0x6a, 0x73, 0x74, 0x75, 0x81, 0x8e, 0x87, 0x70, 0x5f, 0x5d, + 0x5b, 0x65, 0x6f, 0x6e, 0x64, 0x5b, 0x58, 0x5a, 0x51, 0x4f, 0x4e, 0x51, + 0x55, 0x54, 0x4f, 0x49, 0x35, 0x70, 0x7c, 0x53, 0x60, 0x54, 0x5e, 0x79, + 0x74, 0x59, 0x49, 0x5e, 0x5e, 0x58, 0x72, 0x7a, 0x8c, 0x89, 0x89, 0xc1, + 0xbb, 0x8f, 0x72, 0x6a, 0x73, 0x72, 0x76, 0x8b, 0x8d, 0x72, 0x98, 0xfe, + 0xa7, 0x68, 0x90, 0x8d, 0x76, 0x5c, 0x60, 0x78, 0x68, 0x7b, 0x8f, 0x7d, + 0x7f, 0x8d, 0x6f, 0x55, 0x8d, 0x91, 0x8f, 0x84, 0x71, 0x7e, 0x6a, 0x8f, + 0xa1, 0x94, 0x78, 0x72, 0x89, 0x7c, 0x8b, 0x8e, 0x86, 0x7e, 0x7c, 0x8e, + 0x8f, 0x7e, 0x7e, 0x84, 0x6b, 0x86, 0xa0, 0xa3, 0x97, 0x81, 0x66, 0x50, + 0x39, 0x46, 0x20, 0x48, 0x92, 0x77, 0x5f, 0x82, 0x84, 0x8b, 0x74, 0x75, + 0x6b, 0x5e, 0x32, 0x08, 0xf1, 0xeb, 0xe4, 0xf6, 0xb8, 0x65, 0x7a, 0x96, + 0x89, 0x75, 0x7d, 0x83, 0xb4, 0xe4, 0xd8, 0xe3, 0xe2, 0xe2, 0xe0, 0xdf, + 0xdd, 0xdb, 0xda, 0xd9, 0xdb, 0xd9, 0xd6, 0xd1, 0xcc, 0xc7, 0xc3, 0xc1, + 0xbe, 0xbf, 0xc1, 0xc3, 0xc5, 0xc7, 0xc8, 0xc9, 0xc5, 0xc5, 0xc5, 0xc6, + 0xc7, 0xc7, 0xc8, 0xc8, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc2, 0xc3, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xcb, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xc6, 0xca, 0xcc, 0xc9, + 0xc3, 0xc0, 0xc2, 0xc6, 0xc4, 0xc9, 0xcf, 0xcf, 0xcb, 0xc9, 0xcb, 0xce, + 0xc6, 0xa0, 0x74, 0xc7, 0xec, 0xb3, 0xc3, 0xdb, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcc, 0xcb, 0xc9, 0xc8, + 0xc8, 0xc9, 0xcb, 0xcc, 0xae, 0xb8, 0xb6, 0x8a, 0x9e, 0x9d, 0x95, 0xc1, + 0xc5, 0xc6, 0xc9, 0xcb, 0xcb, 0xcb, 0xca, 0xc9, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xbe, 0xc4, 0xc9, 0xca, 0xc7, 0xc6, 0xc9, 0xcd, + 0xc1, 0xa8, 0xa0, 0xcc, 0xcb, 0xca, 0xbb, 0xc7, 0xa6, 0xa1, 0xbf, 0xbd, + 0x9c, 0x7f, 0x65, 0x62, 0x6a, 0x6b, 0x6f, 0x75, 0x7d, 0x84, 0x87, 0x88, + 0x73, 0x69, 0x5d, 0x5a, 0x64, 0x75, 0x84, 0x8d, 0x8d, 0x8a, 0x87, 0x86, + 0x84, 0x7c, 0x70, 0x66, 0x7d, 0x74, 0x69, 0x63, 0x61, 0x62, 0x61, 0x5f, + 0x64, 0x56, 0x48, 0x46, 0x4d, 0x53, 0x51, 0x4c, 0x48, 0x85, 0x74, 0x5d, + 0x5d, 0x56, 0x6b, 0x7b, 0x63, 0x4b, 0x5b, 0x4e, 0x5f, 0x83, 0x80, 0xa5, + 0x93, 0x84, 0xa1, 0xcf, 0xa9, 0x60, 0x5d, 0x7d, 0x88, 0x7b, 0x87, 0x7f, + 0x67, 0x5c, 0x71, 0xa8, 0xde, 0x80, 0x65, 0x73, 0x7e, 0x7a, 0x6d, 0x7f, + 0x69, 0x79, 0x89, 0x7c, 0x66, 0x73, 0x8b, 0x8f, 0x7b, 0x7b, 0x86, 0x71, + 0x79, 0x95, 0x83, 0x79, 0x79, 0x84, 0x80, 0x80, 0x8b, 0x85, 0x76, 0x77, + 0x88, 0x8e, 0x96, 0x8a, 0x90, 0x78, 0x5a, 0x8c, 0x8f, 0x94, 0x84, 0x84, + 0x79, 0x7c, 0xa1, 0x9e, 0x94, 0x6b, 0x46, 0x57, 0x76, 0x67, 0x54, 0x62, + 0x5f, 0x6a, 0x66, 0x6c, 0x6d, 0x78, 0x26, 0x10, 0xe8, 0xf8, 0xeb, 0xf4, + 0xd4, 0x95, 0xb5, 0xf2, 0xfd, 0xff, 0xf0, 0x92, 0x8c, 0xd8, 0xe9, 0xea, + 0xeb, 0xea, 0xe9, 0xe7, 0xe6, 0xe4, 0xe3, 0xe2, 0xe8, 0xe6, 0xe3, 0xe0, + 0xdc, 0xd8, 0xd5, 0xd3, 0xcd, 0xcb, 0xca, 0xc7, 0xc4, 0xc2, 0xc0, 0xbf, + 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc4, 0xc4, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, + 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcb, 0xc9, 0xc8, 0xc7, 0xc6, 0xc4, 0xc3, 0xc5, 0xca, 0xcf, 0xcf, + 0xcc, 0xca, 0xcc, 0xce, 0xd8, 0xc8, 0xc8, 0xcc, 0x7e, 0x6c, 0xc5, 0xd4, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcf, 0xcf, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xab, 0xaa, 0xbd, 0x8f, + 0xa1, 0xaa, 0x97, 0xbd, 0xc6, 0xc7, 0xca, 0xcc, 0xcc, 0xcc, 0xcb, 0xca, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xc9, 0xc9, 0xc9, 0xc9, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xd0, 0xcc, 0xc6, 0xc3, + 0xc3, 0xc5, 0xc7, 0xc8, 0xd4, 0xbb, 0xa9, 0xc2, 0xba, 0xba, 0xb6, 0xca, + 0xd6, 0xb8, 0xcd, 0xc0, 0x83, 0x67, 0x66, 0x6b, 0x74, 0x7f, 0x89, 0x85, + 0x76, 0x6a, 0x68, 0x6c, 0x6e, 0x7b, 0x87, 0x86, 0x7c, 0x75, 0x79, 0x80, + 0x80, 0x75, 0x6c, 0x6d, 0x76, 0x7b, 0x75, 0x6d, 0x68, 0x64, 0x5e, 0x5c, + 0x5c, 0x5a, 0x54, 0x4f, 0x58, 0x4e, 0x45, 0x46, 0x4d, 0x4f, 0x49, 0x42, + 0x3d, 0x7d, 0x78, 0x67, 0x66, 0x5a, 0x62, 0x67, 0x5b, 0x4e, 0x51, 0x35, + 0x48, 0x70, 0x73, 0xa1, 0x97, 0x98, 0xab, 0xa0, 0x74, 0x5f, 0x6f, 0x88, + 0x6b, 0x71, 0x8a, 0x8b, 0x85, 0x80, 0x72, 0x7a, 0xd1, 0xc7, 0x84, 0x6d, + 0x74, 0x62, 0x6a, 0x7d, 0x73, 0x66, 0x75, 0x80, 0x8c, 0x9b, 0x8a, 0x72, + 0x79, 0x73, 0x8c, 0x9f, 0x93, 0x75, 0x6b, 0x84, 0x77, 0x80, 0x9b, 0x96, + 0x73, 0x75, 0x8c, 0x8a, 0x92, 0x74, 0x82, 0x7f, 0x7d, 0x93, 0x8b, 0x7f, + 0x89, 0x6b, 0x78, 0x8d, 0x8d, 0x91, 0x8d, 0x7c, 0x73, 0x95, 0xb8, 0x87, + 0x3c, 0x56, 0x8e, 0x86, 0x79, 0x80, 0x74, 0x71, 0x6b, 0x72, 0x1f, 0x09, + 0xec, 0xf3, 0xe5, 0xef, 0xf0, 0xee, 0xfe, 0xf0, 0x67, 0xa8, 0xec, 0xeb, + 0xec, 0xfa, 0xe6, 0xe6, 0xef, 0xef, 0xee, 0xed, 0xeb, 0xea, 0xe9, 0xe9, + 0xf0, 0xef, 0xee, 0xec, 0xe9, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xdf, 0xdb, + 0xd6, 0xd2, 0xcf, 0xcd, 0xcd, 0xcd, 0xcc, 0xca, 0xc9, 0xc8, 0xc7, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc7, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xcb, 0xcc, 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xd2, 0xcd, 0xc8, 0xc8, 0xcb, 0xcc, 0xc7, 0xc1, + 0xc7, 0xcb, 0xcf, 0xd0, 0xce, 0xcc, 0xcd, 0xce, 0xd0, 0xd4, 0xdd, 0xd0, + 0xa5, 0xb7, 0xe6, 0xcf, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xd3, 0xd4, 0xd5, 0xd5, 0xd3, 0xcf, 0xca, 0xc7, + 0xc4, 0xb4, 0xd0, 0x9f, 0xa6, 0xb8, 0xa1, 0xbe, 0xc8, 0xc9, 0xcb, 0xcd, + 0xce, 0xce, 0xcc, 0xcb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xce, 0xca, 0xc6, 0xc7, 0xcb, 0xcb, 0xc5, 0xbf, 0xc9, 0xbc, 0xb0, 0xbe, + 0xb8, 0xb6, 0xb3, 0xc4, 0xba, 0xa2, 0xca, 0xc2, 0x77, 0x59, 0x5f, 0x63, + 0x69, 0x6f, 0x72, 0x6b, 0x63, 0x65, 0x72, 0x80, 0x85, 0x87, 0x89, 0x87, + 0x83, 0x7f, 0x7d, 0x7d, 0x85, 0x6f, 0x59, 0x56, 0x65, 0x76, 0x7d, 0x7c, + 0x68, 0x62, 0x5c, 0x5b, 0x5d, 0x5e, 0x5c, 0x5a, 0x4a, 0x46, 0x44, 0x47, + 0x4a, 0x46, 0x39, 0x2d, 0x30, 0x72, 0x76, 0x62, 0x62, 0x61, 0x61, 0x58, + 0x5a, 0x53, 0x43, 0x2f, 0x69, 0x9c, 0x8b, 0xa2, 0x9a, 0x86, 0x88, 0x68, + 0x5d, 0x7f, 0x85, 0x89, 0x92, 0x7f, 0x70, 0x5d, 0x71, 0x95, 0x86, 0x72, + 0x81, 0xbf, 0xa9, 0x84, 0x7c, 0x6e, 0x62, 0x4e, 0x69, 0x69, 0x93, 0x92, + 0x7c, 0x78, 0x6f, 0x7c, 0x8e, 0x84, 0x72, 0x75, 0x78, 0x79, 0x8a, 0x93, + 0x85, 0x7e, 0x7c, 0x85, 0x89, 0x81, 0x83, 0x93, 0x84, 0x6d, 0x8d, 0x98, + 0x86, 0x90, 0x88, 0x69, 0x73, 0x86, 0x94, 0x80, 0x8b, 0x88, 0x6b, 0x90, + 0x8a, 0x93, 0x6d, 0x60, 0x93, 0xa1, 0x8a, 0x8e, 0x63, 0x6d, 0x65, 0x68, + 0x67, 0x71, 0x20, 0x0a, 0xea, 0xf6, 0xf3, 0xed, 0xe5, 0xef, 0xf2, 0xc5, + 0x8a, 0xb5, 0xe9, 0xf4, 0xfa, 0xfb, 0xe8, 0xee, 0xed, 0xed, 0xec, 0xeb, + 0xea, 0xe9, 0xe8, 0xe8, 0xee, 0xed, 0xed, 0xec, 0xec, 0xeb, 0xeb, 0xea, + 0xee, 0xee, 0xec, 0xeb, 0xe9, 0xe7, 0xe6, 0xe5, 0xdd, 0xdc, 0xda, 0xd8, + 0xd6, 0xd4, 0xd3, 0xd2, 0xcb, 0xcb, 0xca, 0xca, 0xc9, 0xc9, 0xc8, 0xc8, + 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd3, 0xd0, 0xcc, 0xcb, + 0xcc, 0xcb, 0xc8, 0xc4, 0xc9, 0xcc, 0xcf, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, + 0xc7, 0xd1, 0xd1, 0xcd, 0xdc, 0xe8, 0xde, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd3, 0xd6, 0xd8, 0xd9, + 0xd5, 0xce, 0xc7, 0xc2, 0xc1, 0xab, 0xc1, 0x9b, 0x9e, 0xb3, 0xb3, 0xc6, + 0xca, 0xcb, 0xce, 0xd0, 0xd0, 0xd0, 0xcf, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xd3, 0xcb, 0xc1, 0xbc, 0xc0, 0xc8, 0xcf, 0xd3, + 0xd6, 0xca, 0xb6, 0xb0, 0xaf, 0xae, 0xac, 0xb6, 0x8c, 0x95, 0xc7, 0xbb, + 0x79, 0x5d, 0x5a, 0x5e, 0x71, 0x67, 0x5a, 0x54, 0x58, 0x64, 0x72, 0x7b, + 0x77, 0x6a, 0x5f, 0x60, 0x6e, 0x7c, 0x83, 0x84, 0x6e, 0x69, 0x67, 0x6c, + 0x74, 0x74, 0x6a, 0x5f, 0x74, 0x6f, 0x68, 0x64, 0x63, 0x60, 0x5a, 0x55, + 0x44, 0x46, 0x4b, 0x53, 0x56, 0x4f, 0x41, 0x35, 0x51, 0x91, 0x94, 0x69, + 0x64, 0x77, 0x70, 0x54, 0x54, 0x6c, 0x5c, 0x3e, 0x6d, 0x95, 0x8a, 0xa9, + 0x9f, 0x80, 0x92, 0x78, 0x69, 0x7e, 0x77, 0x8a, 0x69, 0x7d, 0x94, 0x81, + 0x79, 0x84, 0x73, 0x69, 0x5a, 0x96, 0xe1, 0xb7, 0x69, 0x65, 0x6f, 0x71, + 0x7d, 0x59, 0x69, 0x6d, 0x70, 0x7f, 0x77, 0x84, 0x6e, 0x80, 0x6c, 0x6e, + 0x81, 0x94, 0x9d, 0x76, 0x75, 0x85, 0x85, 0x89, 0x95, 0x83, 0x6b, 0x70, + 0x97, 0x86, 0x81, 0x83, 0x80, 0x73, 0x74, 0x8d, 0x89, 0x73, 0x85, 0x73, + 0x65, 0x9d, 0xa1, 0x65, 0x79, 0x56, 0x5f, 0x7d, 0x6f, 0x55, 0x5b, 0x6c, + 0x7a, 0x86, 0x80, 0x82, 0x7a, 0x79, 0x1c, 0x00, 0xeb, 0xfb, 0xf3, 0xf0, + 0xf6, 0xef, 0xf1, 0xfc, 0xf8, 0xff, 0xff, 0xec, 0xed, 0xf5, 0xf0, 0xf4, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe7, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdd, 0xd7, 0xd7, 0xd6, 0xd5, + 0xd4, 0xd3, 0xd3, 0xd2, 0xd1, 0xd1, 0xd0, 0xcf, 0xce, 0xcd, 0xcd, 0xcc, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xcf, 0xcf, 0xd0, + 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd3, 0xd3, 0xcf, 0xca, 0xc6, 0xc6, 0xc8, 0xcc, 0xcd, 0xcf, 0xd1, + 0xd3, 0xd3, 0xd1, 0xcf, 0xd2, 0xcd, 0xd7, 0xd7, 0xd4, 0xd3, 0xca, 0xce, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd3, 0xd5, 0xd8, 0xd7, 0xd4, 0xcc, 0xc4, 0xbf, 0xc8, 0xb6, 0xbb, 0xa4, + 0x9d, 0x9e, 0xb1, 0xb8, 0xcc, 0xce, 0xd0, 0xd2, 0xd3, 0xd2, 0xd1, 0xd0, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xc4, 0xc8, 0xcc, 0xcd, + 0xca, 0xc8, 0xc9, 0xca, 0xd4, 0xd0, 0xbe, 0xb0, 0xbd, 0xbd, 0xb3, 0xac, + 0xa1, 0xbd, 0xd2, 0xa9, 0x7a, 0x67, 0x5e, 0x6d, 0x65, 0x61, 0x5e, 0x5f, + 0x65, 0x6e, 0x76, 0x7a, 0x80, 0x78, 0x6d, 0x66, 0x66, 0x68, 0x68, 0x68, + 0x65, 0x6e, 0x7a, 0x81, 0x7d, 0x71, 0x62, 0x59, 0x5e, 0x5c, 0x5c, 0x60, + 0x63, 0x62, 0x5c, 0x57, 0x60, 0x62, 0x64, 0x65, 0x60, 0x53, 0x41, 0x35, + 0x5f, 0x9c, 0xa0, 0x64, 0x58, 0x77, 0x63, 0x33, 0x37, 0x67, 0x6a, 0x5b, + 0x86, 0x9e, 0x92, 0xaa, 0x76, 0x55, 0x74, 0x73, 0x71, 0x80, 0x6f, 0x81, + 0x83, 0x72, 0x6e, 0x63, 0x6f, 0x88, 0x85, 0x89, 0x68, 0x59, 0xad, 0xd5, + 0xa1, 0x7d, 0x6d, 0x66, 0x77, 0x69, 0x81, 0x81, 0x6b, 0x65, 0x64, 0x77, + 0x76, 0x8f, 0x8e, 0x90, 0x79, 0x63, 0x7f, 0x8a, 0x86, 0x80, 0x7d, 0x6c, + 0x64, 0x87, 0x9c, 0x84, 0x83, 0x87, 0x77, 0x83, 0x97, 0x7e, 0x6e, 0x85, + 0x82, 0x74, 0x77, 0xa3, 0x98, 0x60, 0x78, 0xb6, 0x73, 0x5d, 0x56, 0x56, + 0x5a, 0x76, 0x8d, 0x86, 0x85, 0x84, 0x6b, 0x5f, 0x57, 0x63, 0x1a, 0x0a, + 0xfb, 0xf5, 0xea, 0xe9, 0xef, 0xf1, 0xee, 0xed, 0xf6, 0xf4, 0xee, 0xef, + 0xf3, 0xeb, 0xe8, 0xf5, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, + 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xe9, 0xe9, 0xe8, 0xe8, + 0xe7, 0xe6, 0xe6, 0xe6, 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe4, 0xe3, 0xe3, + 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdf, 0xdf, 0xd3, 0xd3, 0xd2, 0xd0, + 0xcf, 0xce, 0xcd, 0xcc, 0xd3, 0xd3, 0xd2, 0xd2, 0xd1, 0xd1, 0xd0, 0xd0, + 0xd1, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd0, 0xd3, 0xd5, 0xd0, 0xc8, 0xc3, 0xc5, 0xc8, + 0xcf, 0xce, 0xcf, 0xd2, 0xd5, 0xd6, 0xd2, 0xcf, 0xd6, 0xcf, 0xd2, 0xd3, + 0xd9, 0xdc, 0xd1, 0xcd, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd5, 0xd6, 0xd6, 0xd5, 0xd2, 0xcc, 0xc6, 0xc3, + 0xb8, 0xb0, 0xb4, 0xb1, 0xac, 0x9a, 0xb5, 0xc4, 0xce, 0xd0, 0xd2, 0xd4, + 0xd5, 0xd4, 0xd3, 0xd2, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xd1, 0xd3, 0xd1, 0xc9, 0xc2, 0xc0, 0xc5, 0xcc, 0xc0, 0xcc, 0xc6, 0xb8, + 0xd4, 0xd5, 0xc4, 0xb0, 0xb0, 0xc7, 0xc9, 0x9d, 0x83, 0x74, 0x61, 0x75, + 0x7d, 0x7f, 0x7c, 0x6f, 0x62, 0x61, 0x6d, 0x7b, 0x78, 0x6e, 0x65, 0x64, + 0x6b, 0x70, 0x6f, 0x6c, 0x64, 0x6b, 0x70, 0x6e, 0x67, 0x62, 0x62, 0x65, + 0x64, 0x5c, 0x53, 0x50, 0x56, 0x5f, 0x66, 0x69, 0x65, 0x65, 0x63, 0x5e, + 0x55, 0x49, 0x3c, 0x34, 0x3b, 0x6c, 0x80, 0x53, 0x4e, 0x6f, 0x53, 0x23, + 0x35, 0x54, 0x51, 0x54, 0x84, 0x9e, 0x9c, 0xab, 0x92, 0x74, 0x81, 0x7f, + 0x86, 0x98, 0x82, 0x75, 0x7b, 0x77, 0x89, 0x8a, 0x81, 0x75, 0x61, 0x69, + 0x8e, 0x69, 0x77, 0xc7, 0xb8, 0x63, 0x55, 0x62, 0x8f, 0x74, 0x64, 0x68, + 0x6b, 0x77, 0x88, 0x85, 0x9e, 0x82, 0x67, 0x74, 0x86, 0x88, 0x90, 0x91, + 0x7e, 0x74, 0x77, 0x86, 0x8e, 0x8f, 0x8e, 0x8b, 0x71, 0x89, 0x8e, 0x95, + 0x8f, 0x7a, 0x74, 0x6a, 0x90, 0x88, 0x84, 0x87, 0x68, 0x78, 0x9d, 0x61, + 0x55, 0x92, 0x96, 0x82, 0x90, 0x85, 0x6a, 0x72, 0x60, 0x75, 0x7e, 0x8c, + 0x8b, 0x89, 0x28, 0x06, 0xf1, 0xed, 0xf9, 0xf5, 0xeb, 0xf9, 0xfd, 0xeb, + 0xe9, 0xf4, 0xef, 0xed, 0xf3, 0xf3, 0xf4, 0xf6, 0xef, 0xef, 0xef, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xec, 0xeb, 0xea, 0xe9, 0xe7, 0xe5, 0xe4, 0xe4, + 0xdb, 0xda, 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd3, 0xd6, 0xd6, 0xd5, 0xd4, + 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd2, 0xd2, 0xd0, 0xcd, + 0xc9, 0xc5, 0xc4, 0xc3, 0xd1, 0xcf, 0xcf, 0xd2, 0xd7, 0xd8, 0xd4, 0xcf, + 0xd0, 0xd9, 0xcd, 0xc6, 0xd0, 0xd4, 0xd4, 0xd9, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd7, 0xd5, + 0xd2, 0xcf, 0xcd, 0xcc, 0xb8, 0xab, 0xb3, 0xae, 0xa7, 0x89, 0x9c, 0xc1, + 0xd0, 0xd2, 0xd4, 0xd6, 0xd7, 0xd6, 0xd5, 0xd4, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcf, 0xcf, 0xcf, 0xcf, 0xca, 0xce, 0xd3, 0xd4, 0xd0, 0xc9, 0xc1, 0xbc, + 0xc2, 0xd3, 0xcb, 0xac, 0xcb, 0xd0, 0xca, 0xba, 0xa9, 0xa4, 0xab, 0xa0, + 0x91, 0x7b, 0x63, 0x72, 0x7c, 0x7c, 0x77, 0x6a, 0x60, 0x64, 0x77, 0x88, + 0x6f, 0x64, 0x59, 0x57, 0x5d, 0x64, 0x66, 0x65, 0x79, 0x7c, 0x7e, 0x7d, + 0x79, 0x76, 0x75, 0x76, 0x7d, 0x70, 0x60, 0x57, 0x56, 0x5c, 0x61, 0x63, + 0x4b, 0x4b, 0x4b, 0x49, 0x48, 0x48, 0x4a, 0x4c, 0x3c, 0x4d, 0x68, 0x58, + 0x5a, 0x72, 0x5a, 0x42, 0x58, 0x5e, 0x44, 0x34, 0x41, 0x54, 0x73, 0x92, + 0x72, 0x72, 0x84, 0x84, 0x7b, 0x84, 0x8a, 0x86, 0x88, 0x6b, 0x64, 0x64, + 0x74, 0x85, 0x80, 0x8a, 0x76, 0x66, 0x56, 0x9c, 0xda, 0xb8, 0x85, 0x64, + 0x7f, 0x80, 0x70, 0x84, 0x87, 0x7d, 0x81, 0x55, 0x78, 0x84, 0x96, 0x8f, + 0x84, 0x7e, 0x6c, 0x67, 0x8c, 0x8c, 0x84, 0x8a, 0x8f, 0x70, 0x6b, 0x96, + 0x94, 0x96, 0x85, 0x7d, 0x67, 0x63, 0x85, 0x84, 0x76, 0x96, 0x72, 0x54, + 0x74, 0x7a, 0x54, 0x3c, 0x80, 0x5b, 0x64, 0x6f, 0x57, 0x66, 0x87, 0x7d, + 0x86, 0x85, 0x6d, 0x63, 0x5d, 0x6c, 0x24, 0x15, 0xf6, 0xf3, 0xf2, 0xf0, + 0xf7, 0xf3, 0xe8, 0xf4, 0xfa, 0xfa, 0xea, 0xe9, 0xef, 0xea, 0xec, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xed, + 0xec, 0xeb, 0xeb, 0xeb, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xec, 0xed, 0xee, + 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xea, 0xea, 0xe8, 0xe7, + 0xe5, 0xe3, 0xe2, 0xe1, 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, 0xde, 0xdd, 0xdc, + 0xd8, 0xd7, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, + 0xd5, 0xd6, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd6, 0xd0, 0xcb, 0xc9, 0xca, 0xc9, 0xc3, 0xbe, 0xd2, 0xd0, 0xcf, 0xd2, + 0xd8, 0xd9, 0xd5, 0xcf, 0xcc, 0xd2, 0xd4, 0xda, 0xd3, 0xd3, 0xe0, 0xd9, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd9, 0xd9, 0xd9, 0xd9, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdd, 0xdb, 0xd8, 0xd5, 0xd3, 0xd2, 0xd2, 0xd3, 0xc0, 0xa9, 0xb8, 0xad, + 0xa8, 0x8d, 0x9b, 0xda, 0xd1, 0xd3, 0xd5, 0xd7, 0xd8, 0xd7, 0xd6, 0xd5, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xc9, 0xc9, 0xca, 0xcf, + 0xd3, 0xd1, 0xc8, 0xc0, 0xa6, 0xc5, 0xc9, 0xaa, 0xcb, 0xd1, 0xcf, 0xc0, + 0xbb, 0x91, 0x99, 0xa6, 0x95, 0x79, 0x66, 0x73, 0x82, 0x7d, 0x75, 0x6f, + 0x69, 0x65, 0x60, 0x5d, 0x5d, 0x6b, 0x75, 0x70, 0x63, 0x60, 0x6e, 0x7e, + 0x81, 0x76, 0x68, 0x5f, 0x5f, 0x64, 0x69, 0x6b, 0x57, 0x5a, 0x60, 0x69, + 0x70, 0x6f, 0x67, 0x60, 0x5e, 0x5a, 0x53, 0x4a, 0x44, 0x44, 0x49, 0x4d, + 0x5d, 0x4c, 0x5d, 0x59, 0x58, 0x61, 0x4d, 0x4e, 0x68, 0x59, 0x3f, 0x44, + 0x55, 0x59, 0x5b, 0x56, 0x73, 0x68, 0x6b, 0x7e, 0x7c, 0x77, 0x7a, 0x6d, + 0x6c, 0x6f, 0x87, 0x88, 0x84, 0x7e, 0x68, 0x67, 0x83, 0x8b, 0x78, 0x59, + 0x8e, 0xc2, 0x8e, 0x5b, 0x79, 0x8b, 0x6c, 0x74, 0x6a, 0x65, 0x8e, 0x6e, + 0x67, 0x60, 0x72, 0x6d, 0x74, 0x84, 0x7a, 0x84, 0x81, 0x77, 0x70, 0x6b, + 0x77, 0x97, 0x9c, 0x7d, 0x7d, 0x76, 0x6b, 0x90, 0x9b, 0x81, 0x80, 0x71, + 0x58, 0x75, 0x8d, 0x93, 0xa2, 0x73, 0x3a, 0x6a, 0x72, 0x7c, 0x78, 0x7b, + 0x88, 0x7c, 0x69, 0x6c, 0x65, 0x73, 0x72, 0x7b, 0x7c, 0x84, 0x2f, 0x16, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe1, 0xe1, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xdb, 0xda, 0xda, 0xd9, + 0xd8, 0xd8, 0xd7, 0xd7, 0xd9, 0xd4, 0xd2, 0xcc, 0xc5, 0xcb, 0xcc, 0xc0, + 0xcd, 0xd8, 0xc5, 0xcf, 0xdd, 0xd3, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd8, 0xd9, 0xdb, 0xdd, 0xdf, 0xe0, 0xe1, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xd9, 0xdc, 0xe3, 0xe0, 0xd5, 0xcf, 0xd1, + 0xc6, 0xa7, 0xad, 0xb5, 0xbb, 0x83, 0xaa, 0xcd, 0xcd, 0xd6, 0xda, 0xd5, + 0xd3, 0xd7, 0xd8, 0xd5, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd1, 0xd2, 0xd2, 0xd2, 0xd0, 0xcd, 0xca, 0xc8, + 0xc6, 0xdc, 0xca, 0xcd, 0xd5, 0xbc, 0xbc, 0xd0, 0xc2, 0xbc, 0xb1, 0xa7, + 0xb6, 0xa8, 0xb7, 0xa8, 0xbe, 0xa2, 0xab, 0xc1, 0x95, 0x73, 0x7f, 0x6b, + 0x76, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6d, 0x69, 0x7b, 0x76, 0x6c, 0x65, + 0x6a, 0x71, 0x6d, 0x62, 0x5d, 0x5c, 0x5e, 0x67, 0x72, 0x77, 0x75, 0x70, + 0x6d, 0x69, 0x64, 0x5f, 0x5b, 0x56, 0x51, 0x4d, 0x53, 0x48, 0x4f, 0x52, + 0x45, 0x43, 0x43, 0x33, 0x50, 0x5e, 0x55, 0x43, 0x4e, 0x61, 0x55, 0x3b, + 0x51, 0x54, 0x50, 0x53, 0x58, 0x45, 0x2f, 0x2e, 0x5f, 0x61, 0x69, 0x74, + 0x76, 0x75, 0x80, 0x8f, 0x75, 0x68, 0x65, 0x72, 0x7c, 0x7b, 0x7a, 0x7f, + 0x71, 0x69, 0x71, 0x71, 0x59, 0x94, 0xc7, 0x72, 0x65, 0x76, 0x71, 0x7b, + 0x90, 0x88, 0x79, 0x7c, 0x7b, 0x59, 0x7e, 0x77, 0x87, 0x7f, 0x80, 0x81, + 0x67, 0x84, 0x92, 0x9c, 0x81, 0x6f, 0x7d, 0x61, 0x84, 0x94, 0x80, 0x6b, + 0x76, 0x74, 0x6d, 0x7b, 0x85, 0x5c, 0x4c, 0x7e, 0x71, 0x5d, 0x92, 0x94, + 0x89, 0x70, 0x72, 0x6f, 0x57, 0x63, 0x77, 0x68, 0x84, 0x8f, 0x87, 0x8a, + 0x87, 0x83, 0x1d, 0x00, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe3, 0xe3, 0xe2, 0xe2, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xde, 0xdd, 0xdc, 0xdc, 0xdc, 0xd7, 0xda, 0xdb, 0xd0, + 0xc6, 0xcd, 0xce, 0xbe, 0xc3, 0xd5, 0xcb, 0xd0, 0xda, 0xd3, 0xd8, 0xd7, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd9, 0xda, 0xdc, + 0xdd, 0xdf, 0xe0, 0xe1, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, 0xdd, 0xe0, 0xdf, + 0xdc, 0xd9, 0xd3, 0xce, 0xd1, 0xb5, 0x96, 0xb1, 0xc1, 0x88, 0x95, 0xc7, + 0xcc, 0xd5, 0xdb, 0xd7, 0xd5, 0xd8, 0xd7, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd1, 0xce, 0xcb, 0xc9, 0xba, 0xbc, 0xcf, 0xd2, 0xd4, 0xca, 0xb5, 0xc1, + 0xdc, 0xc4, 0xc0, 0x98, 0x9c, 0xd3, 0xc9, 0xc9, 0xa1, 0xa7, 0xc1, 0xd2, + 0x9c, 0x6a, 0x76, 0x76, 0x78, 0x7a, 0x7d, 0x80, 0x81, 0x7c, 0x6f, 0x63, + 0x7a, 0x7c, 0x76, 0x6d, 0x6c, 0x74, 0x79, 0x77, 0x80, 0x7c, 0x75, 0x6d, + 0x67, 0x65, 0x67, 0x6a, 0x6a, 0x60, 0x58, 0x5a, 0x62, 0x64, 0x5c, 0x52, + 0x59, 0x50, 0x56, 0x58, 0x4d, 0x4b, 0x4a, 0x3e, 0x4c, 0x61, 0x58, 0x40, + 0x49, 0x5f, 0x5b, 0x48, 0x66, 0x74, 0x69, 0x56, 0x56, 0x54, 0x48, 0x43, + 0x76, 0x72, 0x79, 0x89, 0x8d, 0x80, 0x70, 0x69, 0x84, 0x8d, 0x8c, 0x7f, + 0x76, 0x74, 0x6c, 0x60, 0x8c, 0x7e, 0x89, 0x93, 0x74, 0x76, 0xa4, 0xac, + 0x75, 0x68, 0x60, 0x57, 0x84, 0x8b, 0x5e, 0x89, 0x7b, 0x74, 0x81, 0x69, + 0x81, 0x6e, 0x6f, 0x98, 0x98, 0x94, 0x73, 0x80, 0x8e, 0x7d, 0x89, 0x98, + 0x92, 0x77, 0x73, 0x6d, 0x60, 0x7d, 0x97, 0x83, 0x56, 0x7b, 0xae, 0x5d, + 0x59, 0x91, 0x5f, 0x6d, 0x5a, 0x66, 0x7c, 0x87, 0x88, 0x96, 0x98, 0x84, + 0x78, 0x58, 0x4e, 0x75, 0x82, 0x81, 0x29, 0x13, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe1, 0xe1, + 0xdb, 0xda, 0xdd, 0xd9, 0xce, 0xcc, 0xc9, 0xbc, 0xb4, 0xd0, 0xd2, 0xd3, + 0xd6, 0xd4, 0xd9, 0xd5, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe1, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xd8, 0xe1, 0xe3, 0xdc, 0xd9, 0xdc, 0xd7, 0xcc, 0xd8, 0xe2, 0x96, 0x92, + 0xaf, 0xa1, 0xa7, 0xc9, 0xca, 0xd5, 0xdc, 0xda, 0xd8, 0xd9, 0xd7, 0xd2, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd4, 0xd4, 0xd2, 0xd0, 0xcd, 0xcb, 0xbf, 0xb0, 0xc1, 0xc7, + 0xc9, 0xd1, 0xca, 0xcd, 0xd2, 0xe4, 0xd9, 0xb9, 0x98, 0xcc, 0xd1, 0xc1, + 0x5a, 0xaf, 0xd3, 0xb4, 0x7c, 0x67, 0x73, 0x65, 0x7a, 0x6f, 0x64, 0x62, + 0x69, 0x74, 0x7d, 0x83, 0x7d, 0x81, 0x7b, 0x6a, 0x60, 0x65, 0x6f, 0x75, + 0x87, 0x87, 0x86, 0x82, 0x7c, 0x77, 0x74, 0x72, 0x5d, 0x62, 0x67, 0x69, + 0x68, 0x6a, 0x6f, 0x74, 0x5e, 0x58, 0x59, 0x56, 0x49, 0x43, 0x41, 0x38, + 0x45, 0x6a, 0x73, 0x67, 0x6d, 0x70, 0x60, 0x52, 0x40, 0x5d, 0x66, 0x5d, + 0x5f, 0x66, 0x72, 0x85, 0x7e, 0x6e, 0x64, 0x6a, 0x74, 0x79, 0x7f, 0x87, + 0x75, 0x6f, 0x63, 0x5f, 0x6f, 0x83, 0x83, 0x74, 0x79, 0x5d, 0x5e, 0x6e, + 0x6f, 0x69, 0x8d, 0xd9, 0xc2, 0x7e, 0x72, 0x6e, 0x7b, 0x82, 0x6f, 0x95, + 0x7a, 0x65, 0x6b, 0x63, 0x8b, 0xa3, 0x8f, 0x65, 0x71, 0x80, 0x72, 0x7b, + 0x8f, 0x87, 0x7c, 0x70, 0x7e, 0x72, 0x77, 0x8b, 0x84, 0x67, 0x69, 0x89, + 0x96, 0xa0, 0x4e, 0x4d, 0x74, 0x6f, 0x84, 0x84, 0x85, 0x90, 0x82, 0x69, + 0x64, 0x5d, 0x4d, 0x45, 0x7a, 0x7b, 0x88, 0x8a, 0x5b, 0x53, 0x11, 0x00, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe6, 0xe6, + 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, 0xd5, 0xd6, 0xdd, 0xd6, 0xcc, 0xc3, 0xb8, + 0xa8, 0xc8, 0xd9, 0xd5, 0xd2, 0xd7, 0xdb, 0xd5, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe1, 0xe2, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdc, 0xe1, 0xe1, 0xdd, 0xda, 0xda, 0xd6, 0xd0, + 0xb3, 0xe3, 0xa5, 0x87, 0xad, 0xb3, 0xc1, 0xc8, 0xc9, 0xd5, 0xdd, 0xdc, + 0xda, 0xda, 0xd7, 0xd2, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, 0xd4, 0xd2, 0xcf, 0xce, + 0xc5, 0xc6, 0xc3, 0xd4, 0xd6, 0xca, 0xc6, 0xaf, 0xb7, 0xd4, 0xcb, 0xd2, + 0xbc, 0xca, 0xd9, 0xaf, 0x86, 0xd0, 0xdf, 0xba, 0x84, 0x59, 0x5d, 0x68, + 0x70, 0x6e, 0x75, 0x80, 0x83, 0x77, 0x68, 0x61, 0x6e, 0x73, 0x6d, 0x60, + 0x5b, 0x66, 0x76, 0x7e, 0x8c, 0x8a, 0x89, 0x89, 0x87, 0x81, 0x78, 0x72, + 0x5c, 0x67, 0x6e, 0x68, 0x5a, 0x54, 0x5b, 0x66, 0x60, 0x5f, 0x5f, 0x5a, + 0x4f, 0x49, 0x48, 0x45, 0x4e, 0x69, 0x6f, 0x6c, 0x6d, 0x5d, 0x50, 0x5e, + 0x41, 0x34, 0x2e, 0x4a, 0x6e, 0x6d, 0x62, 0x6a, 0x65, 0x6c, 0x7b, 0x87, + 0x82, 0x71, 0x6a, 0x6d, 0x71, 0x73, 0x7d, 0x87, 0x80, 0x71, 0x6e, 0x76, + 0x79, 0x84, 0x9c, 0x8b, 0x74, 0x61, 0x64, 0xa2, 0xdd, 0x9d, 0x68, 0x69, + 0x72, 0x73, 0x7c, 0x81, 0x83, 0x67, 0x7b, 0x8e, 0x7e, 0x6b, 0x75, 0x7f, + 0x6e, 0x87, 0x9c, 0x8b, 0x64, 0x67, 0x86, 0x8b, 0x86, 0x9c, 0x80, 0x6a, + 0x83, 0x7d, 0x5b, 0x59, 0x6a, 0x5a, 0x5c, 0x87, 0x92, 0x7a, 0x7a, 0x7c, + 0x67, 0x71, 0x61, 0x60, 0x7a, 0x78, 0x75, 0x95, 0x8f, 0x66, 0x5f, 0x6d, + 0x4a, 0x4b, 0x18, 0x0e, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe8, + 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, 0xe2, 0xd8, 0xd5, 0xd6, + 0xd5, 0xd5, 0xc7, 0xaf, 0xa3, 0xc0, 0xdb, 0xd7, 0xd1, 0xda, 0xde, 0xd9, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe1, + 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xde, 0xdd, 0xe0, + 0xde, 0xd6, 0xd4, 0xd6, 0xc4, 0xd3, 0xab, 0x85, 0x9e, 0x87, 0xb0, 0xca, + 0xcb, 0xd6, 0xde, 0xdc, 0xd9, 0xdb, 0xd9, 0xd4, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd3, 0xd4, 0xd5, 0xd6, + 0xd6, 0xd4, 0xd2, 0xd0, 0xbf, 0xba, 0x9f, 0xaa, 0xc4, 0xcd, 0xd3, 0xc6, + 0xae, 0xb9, 0xd4, 0xd0, 0xb7, 0x9d, 0xb9, 0xc5, 0x98, 0xc9, 0xc0, 0xa0, + 0x81, 0x61, 0x69, 0x7e, 0x86, 0x77, 0x70, 0x75, 0x74, 0x6a, 0x65, 0x68, + 0x7f, 0x7d, 0x72, 0x62, 0x5d, 0x67, 0x70, 0x72, 0x85, 0x86, 0x84, 0x7e, + 0x77, 0x76, 0x7c, 0x82, 0x90, 0x8b, 0x82, 0x77, 0x6b, 0x60, 0x57, 0x52, + 0x4a, 0x4f, 0x4f, 0x49, 0x44, 0x3f, 0x40, 0x46, 0x5b, 0x6a, 0x6d, 0x78, + 0x78, 0x4e, 0x3b, 0x61, 0x48, 0x47, 0x4b, 0x5f, 0x6c, 0x61, 0x66, 0x86, + 0x78, 0x76, 0x7a, 0x7f, 0x7b, 0x76, 0x7e, 0x8b, 0x7e, 0x67, 0x5b, 0x69, + 0x7e, 0x86, 0x87, 0x89, 0x70, 0x6b, 0x78, 0x6b, 0x72, 0x85, 0x6c, 0x60, + 0x9f, 0xbe, 0x8b, 0x56, 0x6b, 0x7b, 0x7c, 0x8e, 0x84, 0x75, 0x5a, 0x6d, + 0x82, 0x79, 0x79, 0x9b, 0x91, 0x73, 0x78, 0x88, 0x88, 0x8b, 0x8f, 0x8d, + 0x81, 0x76, 0x8b, 0x9b, 0x88, 0x84, 0x97, 0xa0, 0x71, 0x5b, 0x8f, 0x7d, + 0x5a, 0x6a, 0x61, 0x6f, 0x91, 0x8d, 0x7f, 0x8a, 0x96, 0x6e, 0x57, 0x7a, + 0x57, 0x68, 0x7a, 0x82, 0x6f, 0x82, 0x37, 0x08, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, + 0xdd, 0xe1, 0xdd, 0xce, 0xcd, 0xde, 0xd4, 0xaf, 0xa6, 0xb8, 0xd9, 0xd9, + 0xd2, 0xde, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe6, 0xde, 0xdc, 0xe1, 0xdf, 0xd5, 0xd3, 0xd9, 0xc9, 0xc6, 0xc4, 0xa5, + 0xb0, 0x80, 0x98, 0xb0, 0xd0, 0xd9, 0xdd, 0xd9, 0xd6, 0xda, 0xdb, 0xd8, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd7, 0xd6, 0xd4, 0xd3, 0xd4, 0xdb, 0xdb, 0xb7, + 0xa4, 0xad, 0xbb, 0xe0, 0xeb, 0xd8, 0xcc, 0xd0, 0xce, 0x9a, 0xb9, 0xcd, + 0xae, 0xda, 0xc4, 0x96, 0x79, 0x6a, 0x74, 0x78, 0x77, 0x6b, 0x6b, 0x7a, + 0x7b, 0x6b, 0x61, 0x64, 0x6f, 0x6f, 0x69, 0x5f, 0x60, 0x6d, 0x77, 0x79, + 0x7d, 0x89, 0x90, 0x88, 0x79, 0x73, 0x7c, 0x88, 0x94, 0x91, 0x8b, 0x82, + 0x77, 0x6e, 0x68, 0x65, 0x59, 0x60, 0x5a, 0x4d, 0x44, 0x3a, 0x37, 0x42, + 0x62, 0x71, 0x75, 0x86, 0x8b, 0x54, 0x36, 0x5e, 0x67, 0x60, 0x4e, 0x47, + 0x52, 0x53, 0x56, 0x66, 0x82, 0x78, 0x76, 0x7f, 0x83, 0x7c, 0x74, 0x72, + 0x71, 0x7e, 0x84, 0x79, 0x70, 0x6e, 0x68, 0x5e, 0x91, 0x84, 0x85, 0x73, + 0x65, 0x72, 0x70, 0x61, 0x75, 0x9d, 0xa9, 0x5a, 0x54, 0x8a, 0x73, 0x64, + 0x5d, 0x85, 0x84, 0x8d, 0x82, 0x85, 0x76, 0x61, 0x80, 0x89, 0x90, 0x86, + 0x85, 0x78, 0x61, 0x70, 0x8f, 0x8e, 0x93, 0x84, 0x77, 0x94, 0x97, 0x65, + 0x50, 0x67, 0x60, 0x75, 0x7d, 0x80, 0x9d, 0x8a, 0x8b, 0x74, 0x60, 0x66, + 0x69, 0x55, 0x58, 0x7a, 0x76, 0x7d, 0x60, 0x42, 0x2b, 0x3c, 0x0c, 0x18, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe6, 0xe5, 0xe5, 0xe0, 0xe4, 0xe4, 0xd7, 0xcf, 0xda, 0xd9, 0xc4, + 0xad, 0xb2, 0xd4, 0xd9, 0xd4, 0xe1, 0xe4, 0xe9, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe1, 0xdf, 0xde, 0xdb, 0xd8, 0xd7, 0xd8, + 0xc5, 0xc3, 0xc4, 0xa8, 0xb4, 0xa3, 0xa0, 0xb3, 0xd5, 0xdb, 0xdc, 0xd5, + 0xd3, 0xd8, 0xdd, 0xdd, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd4, 0xd5, 0xd7, 0xd8, 0xd9, 0xd7, 0xd6, 0xd5, + 0xd4, 0xce, 0xdb, 0xcf, 0xc2, 0xbf, 0xa4, 0x91, 0xba, 0xcb, 0xd0, 0xf5, + 0xfd, 0xc7, 0xc4, 0xd6, 0xa1, 0xbd, 0xb9, 0xa7, 0x7e, 0x59, 0x6a, 0x82, + 0x84, 0x75, 0x75, 0x84, 0x82, 0x6b, 0x5c, 0x5f, 0x6e, 0x76, 0x75, 0x68, + 0x60, 0x65, 0x6e, 0x73, 0x8f, 0x92, 0x92, 0x8b, 0x7d, 0x70, 0x66, 0x63, + 0x7a, 0x7e, 0x80, 0x7d, 0x76, 0x73, 0x75, 0x79, 0x5a, 0x63, 0x59, 0x47, + 0x3c, 0x2e, 0x2a, 0x38, 0x67, 0x78, 0x6a, 0x68, 0x75, 0x53, 0x3d, 0x63, + 0x59, 0x5e, 0x58, 0x53, 0x56, 0x57, 0x6b, 0x8f, 0x71, 0x69, 0x6b, 0x79, + 0x82, 0x7e, 0x78, 0x78, 0x72, 0x71, 0x6b, 0x6a, 0x7a, 0x8e, 0x8f, 0x83, + 0x75, 0x6d, 0x6a, 0x7d, 0x88, 0x8d, 0x8d, 0x76, 0x5b, 0x7d, 0xe7, 0xc3, + 0x59, 0x60, 0x7b, 0x80, 0x8b, 0x78, 0x5f, 0x80, 0x63, 0x6f, 0x8c, 0x90, + 0x78, 0x81, 0x81, 0x66, 0x74, 0x90, 0x89, 0x99, 0x78, 0x8b, 0x75, 0x69, + 0x77, 0x61, 0x52, 0x76, 0x7a, 0x92, 0x91, 0x7b, 0x7a, 0x7d, 0x6b, 0x5e, + 0x53, 0x60, 0x7d, 0x8a, 0x79, 0x62, 0x45, 0x22, 0x20, 0x2d, 0x5c, 0xd8, + 0xff, 0xbf, 0x19, 0x18, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xeb, + 0xeb, 0xea, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, 0xe9, 0xe0, 0xe4, 0xe7, + 0xd7, 0xce, 0xd5, 0xdd, 0xb3, 0xae, 0xd1, 0xda, 0xd6, 0xe3, 0xe5, 0xee, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe3, 0xe3, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe1, 0xe6, 0xe3, 0xda, + 0xd7, 0xdc, 0xdb, 0xd5, 0xc7, 0xc4, 0xc0, 0xb2, 0xbb, 0xb4, 0x86, 0x97, + 0xd8, 0xdc, 0xdb, 0xd2, 0xd0, 0xd8, 0xdf, 0xe0, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd4, 0xd5, 0xd7, 0xd9, + 0xd9, 0xd8, 0xd7, 0xd6, 0xd4, 0xd3, 0xd7, 0xdd, 0xc9, 0xca, 0xdb, 0xbb, + 0x73, 0x4f, 0x43, 0x3f, 0x5e, 0x8d, 0x7a, 0xc5, 0xa6, 0xe3, 0xf0, 0xc5, + 0x85, 0x69, 0x79, 0x77, 0x6c, 0x5c, 0x5f, 0x73, 0x76, 0x63, 0x5a, 0x62, + 0x6b, 0x7c, 0x84, 0x78, 0x6a, 0x6d, 0x7b, 0x85, 0x93, 0x7f, 0x6b, 0x68, + 0x6f, 0x70, 0x61, 0x51, 0x60, 0x56, 0x4e, 0x50, 0x59, 0x5c, 0x54, 0x4a, + 0x4e, 0x5c, 0x55, 0x47, 0x44, 0x3b, 0x3b, 0x4e, 0x61, 0x82, 0x77, 0x6e, + 0x82, 0x6b, 0x4d, 0x62, 0x73, 0x59, 0x4a, 0x61, 0x76, 0x68, 0x68, 0x86, + 0x88, 0x86, 0x88, 0x88, 0x7d, 0x6e, 0x6c, 0x74, 0x74, 0x6c, 0x6d, 0x78, + 0x7c, 0x75, 0x74, 0x79, 0x7c, 0x8d, 0x7e, 0x80, 0x79, 0x68, 0x74, 0x6f, + 0x67, 0x50, 0x98, 0xda, 0xa0, 0x6d, 0x7b, 0x73, 0x79, 0x82, 0x5d, 0x87, + 0x8a, 0x84, 0x72, 0x71, 0x71, 0x67, 0x92, 0x9c, 0x8c, 0x88, 0x78, 0x7c, + 0x63, 0x92, 0x83, 0x84, 0xb4, 0x91, 0x5e, 0x7f, 0x78, 0x60, 0x58, 0x64, + 0x6f, 0x70, 0x77, 0x8c, 0x6f, 0x5a, 0x3f, 0x13, 0x09, 0x54, 0x97, 0x8f, + 0xbc, 0xff, 0xff, 0xe9, 0xf9, 0xd5, 0x2a, 0x00, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xed, 0xea, 0xe6, 0xe0, 0xdb, 0xda, 0xdc, 0xdf, 0xc6, 0xac, 0xbb, 0xc2, + 0xdb, 0xe8, 0xe9, 0xe6, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe4, 0xe3, 0xe2, 0xe0, 0xde, 0xdd, 0xdd, 0xde, 0xcf, 0xc6, 0xd4, 0xa2, + 0xc3, 0xc1, 0x94, 0xa3, 0xcf, 0xde, 0xce, 0xcf, 0xcc, 0xd7, 0xde, 0xe3, + 0xd8, 0xd9, 0xdb, 0xdc, 0xdb, 0xda, 0xd8, 0xd7, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, 0xda, 0xda, + 0xd9, 0xd9, 0xd8, 0xd7, 0xd6, 0xd5, 0xd5, 0xd5, 0xe6, 0xd1, 0xce, 0xce, + 0xd3, 0xdc, 0xad, 0x63, 0x6d, 0x72, 0x48, 0x4d, 0x2a, 0x2e, 0x48, 0x51, + 0x3e, 0x6d, 0x8e, 0x83, 0x6b, 0x67, 0x6f, 0x72, 0x73, 0x6b, 0x70, 0x7b, + 0x74, 0x5f, 0x5a, 0x66, 0x6b, 0x79, 0x7c, 0x6d, 0x60, 0x5e, 0x5c, 0x57, + 0x4a, 0x4a, 0x53, 0x65, 0x70, 0x6c, 0x66, 0x65, 0x6a, 0x69, 0x64, 0x5d, + 0x5b, 0x5b, 0x52, 0x46, 0x4f, 0x50, 0x4c, 0x48, 0x41, 0x37, 0x47, 0x69, + 0x7b, 0x77, 0x6e, 0x70, 0x73, 0x60, 0x56, 0x66, 0x68, 0x49, 0x69, 0x51, + 0x57, 0x78, 0x85, 0x86, 0x7f, 0x7d, 0x75, 0x6f, 0x74, 0x7e, 0x7e, 0x77, + 0x82, 0x62, 0x5c, 0x5d, 0x75, 0x8a, 0x7e, 0x82, 0x7a, 0x70, 0x61, 0x5b, + 0x69, 0x7e, 0x82, 0x7a, 0x6c, 0x5c, 0x62, 0xaf, 0xcf, 0xa0, 0x83, 0x77, + 0x81, 0x90, 0x7c, 0x53, 0x74, 0x88, 0x69, 0x80, 0x7d, 0x96, 0x84, 0x65, + 0x6c, 0x7b, 0x80, 0x8a, 0xa4, 0x6f, 0x6b, 0x96, 0x76, 0x55, 0x6a, 0x51, + 0x87, 0x7d, 0x7f, 0x8a, 0x79, 0x49, 0x1f, 0x0f, 0x39, 0x7a, 0xce, 0xff, + 0xff, 0xff, 0xfa, 0xfe, 0xd3, 0xcc, 0xbf, 0x97, 0x5d, 0x64, 0x2e, 0x00, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xe8, 0xe6, 0xe3, 0xdf, 0xdb, 0xd6, 0xd3, + 0xd6, 0xbe, 0xbf, 0xc6, 0xe6, 0xec, 0xe8, 0xe1, 0xe9, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe6, 0xe5, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe4, 0xe6, 0xe2, 0xdd, 0xda, 0xdd, 0xe1, + 0xd3, 0xc1, 0xcc, 0xc2, 0xc4, 0xad, 0x82, 0xa0, 0xcf, 0xd2, 0xce, 0xd9, + 0xca, 0xd0, 0xdd, 0xdf, 0xd9, 0xda, 0xdc, 0xdd, 0xdd, 0xdc, 0xda, 0xd9, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, + 0xdb, 0xdb, 0xda, 0xda, 0xd9, 0xd9, 0xd8, 0xd8, 0xd7, 0xd6, 0xd6, 0xd5, + 0xd9, 0xd0, 0xda, 0xcc, 0xe8, 0xd6, 0x6a, 0x4f, 0x8c, 0x67, 0x49, 0x5f, + 0x58, 0x67, 0x6c, 0x7d, 0x44, 0x3e, 0x36, 0x3a, 0x4d, 0x61, 0x67, 0x62, + 0x53, 0x5a, 0x67, 0x72, 0x71, 0x69, 0x65, 0x67, 0x78, 0x82, 0x81, 0x72, + 0x66, 0x67, 0x6b, 0x6b, 0x79, 0x6d, 0x65, 0x67, 0x6b, 0x6c, 0x6f, 0x75, + 0x63, 0x65, 0x63, 0x5f, 0x61, 0x65, 0x5f, 0x55, 0x48, 0x46, 0x41, 0x43, + 0x43, 0x39, 0x40, 0x5a, 0x75, 0x6e, 0x6a, 0x6e, 0x69, 0x59, 0x59, 0x69, + 0x4e, 0x59, 0x66, 0x3c, 0x54, 0x75, 0x70, 0x61, 0x6c, 0x7a, 0x84, 0x83, + 0x80, 0x81, 0x80, 0x7d, 0x7c, 0x78, 0x70, 0x87, 0x85, 0x6a, 0x71, 0x74, + 0x70, 0x87, 0x93, 0x81, 0x68, 0x60, 0x68, 0x71, 0x6b, 0x71, 0x67, 0x73, + 0xd7, 0xd8, 0x6c, 0x70, 0x82, 0x68, 0x75, 0x79, 0x7c, 0x87, 0x87, 0x9b, + 0x65, 0x79, 0x87, 0x7c, 0x7b, 0x94, 0x8f, 0x65, 0x6e, 0x94, 0x76, 0x40, + 0x5d, 0x8c, 0x91, 0x97, 0x75, 0x49, 0x15, 0x10, 0x56, 0xbb, 0xfa, 0xff, + 0xff, 0xfc, 0xf8, 0xf6, 0xe9, 0xc2, 0x8b, 0x61, 0x51, 0x2f, 0x2d, 0x49, + 0x3f, 0x3e, 0x16, 0x13, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe6, 0xe5, 0xe6, + 0xe5, 0xde, 0xd2, 0xc8, 0xd7, 0xbc, 0xad, 0xc7, 0xf1, 0xe0, 0xe0, 0xee, + 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe0, 0xe5, 0xe9, 0xe5, + 0xdd, 0xda, 0xdd, 0xe3, 0xd9, 0xc5, 0xb9, 0xcc, 0xb5, 0xae, 0x86, 0x8d, + 0xdd, 0xd0, 0xce, 0xe2, 0xca, 0xce, 0xdc, 0xd7, 0xdb, 0xdc, 0xdd, 0xdf, + 0xdf, 0xde, 0xdc, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xde, 0xdd, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xd9, 0xd9, 0xd9, 0xd8, + 0xd8, 0xd7, 0xd7, 0xd7, 0xdd, 0xdb, 0xdb, 0xef, 0xa6, 0x63, 0x82, 0x6f, + 0x84, 0x5f, 0x7c, 0xa8, 0x99, 0x7d, 0x49, 0x50, 0x61, 0x49, 0x3d, 0x52, + 0x73, 0x82, 0x77, 0x67, 0x61, 0x6e, 0x7a, 0x7b, 0x76, 0x6f, 0x66, 0x5e, + 0x74, 0x79, 0x76, 0x68, 0x5e, 0x62, 0x6c, 0x71, 0x76, 0x6a, 0x62, 0x61, + 0x5c, 0x51, 0x49, 0x48, 0x5e, 0x61, 0x60, 0x5e, 0x60, 0x64, 0x60, 0x57, + 0x4b, 0x4a, 0x45, 0x44, 0x44, 0x3f, 0x4e, 0x6f, 0x77, 0x7c, 0x7d, 0x84, + 0x81, 0x62, 0x4e, 0x5b, 0x55, 0x5e, 0x4b, 0x33, 0x69, 0x7a, 0x7d, 0x8e, + 0x72, 0x7a, 0x7b, 0x75, 0x74, 0x7e, 0x89, 0x8e, 0x68, 0x73, 0x60, 0x5f, + 0x71, 0x88, 0x9a, 0x85, 0x85, 0x7a, 0x68, 0x61, 0x6f, 0x85, 0x8b, 0x83, + 0x77, 0x68, 0x6d, 0x63, 0xa5, 0xe7, 0xab, 0x7c, 0x64, 0x82, 0x85, 0x6f, + 0x7c, 0x7e, 0x6d, 0x85, 0x96, 0x77, 0x7c, 0x8d, 0x77, 0x65, 0x79, 0x91, + 0x9e, 0x8b, 0x82, 0x63, 0x58, 0x41, 0x10, 0x18, 0x90, 0xd0, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xf9, 0xe0, 0xb2, 0x71, 0x41, 0x33, 0x40, 0x57, 0x67, + 0x4c, 0x3d, 0x34, 0x50, 0x69, 0x71, 0x21, 0x00, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xe6, 0xe4, 0xe7, 0xe9, 0xe4, 0xd6, 0xcb, 0xd0, 0xd1, 0xb4, 0xb2, + 0xde, 0xdd, 0xe3, 0xe5, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe2, 0xe5, 0xe7, 0xe6, 0xe1, 0xde, 0xdf, 0xe0, 0xda, 0xbf, 0xa4, 0xcf, + 0x94, 0x8a, 0x7c, 0x8b, 0xc7, 0xbf, 0xc3, 0xde, 0xd2, 0xda, 0xe1, 0xd4, + 0xdc, 0xdd, 0xdf, 0xe0, 0xe1, 0xe0, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, + 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xd1, 0xed, 0xd4, + 0x6c, 0x54, 0x87, 0x87, 0x9a, 0x5f, 0x67, 0x7d, 0x71, 0x6b, 0x69, 0x8a, + 0x9e, 0x90, 0x7d, 0x6f, 0x6b, 0x6d, 0x70, 0x71, 0x6c, 0x72, 0x7a, 0x7a, + 0x73, 0x68, 0x61, 0x5e, 0x68, 0x6b, 0x6a, 0x61, 0x59, 0x5b, 0x66, 0x6f, + 0x6e, 0x6b, 0x70, 0x7c, 0x7f, 0x74, 0x67, 0x62, 0x6d, 0x71, 0x6f, 0x69, + 0x66, 0x66, 0x61, 0x59, 0x4b, 0x4d, 0x4f, 0x54, 0x54, 0x48, 0x4d, 0x65, + 0x76, 0x9b, 0x89, 0x64, 0x6f, 0x79, 0x63, 0x52, 0x57, 0x76, 0x59, 0x32, + 0x65, 0x76, 0x70, 0x60, 0x7d, 0x80, 0x80, 0x7d, 0x7d, 0x7a, 0x6c, 0x5c, + 0x7f, 0x7c, 0x87, 0x78, 0x72, 0x78, 0x69, 0x6d, 0x71, 0x80, 0x87, 0x7e, + 0x74, 0x73, 0x74, 0x73, 0x7b, 0x67, 0x6a, 0x77, 0x66, 0xa8, 0xf3, 0xaf, + 0x6a, 0x63, 0x6b, 0x6b, 0x72, 0x90, 0x8c, 0x67, 0x68, 0x69, 0x60, 0x6a, + 0x91, 0xa3, 0x7c, 0x4c, 0x31, 0x30, 0x1b, 0x27, 0x94, 0xee, 0xf5, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xd7, 0x91, 0x57, 0x3c, 0x31, 0x29, 0x25, 0x2e, + 0x41, 0x50, 0x54, 0x51, 0x3f, 0x64, 0x5e, 0x48, 0x48, 0x5e, 0x22, 0x06, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xed, 0xe8, 0xe4, 0xe6, 0xea, 0xe8, 0xdf, 0xd7, + 0xd7, 0xd7, 0xaf, 0xa5, 0xda, 0xe3, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe5, 0xe4, 0xe5, 0xe7, 0xe6, 0xe0, 0xdc, + 0xde, 0xd5, 0xae, 0xc5, 0x97, 0xbe, 0xba, 0x8e, 0xbb, 0xc0, 0xbc, 0xc9, + 0xc0, 0xd1, 0xe0, 0xdd, 0xdb, 0xdd, 0xdf, 0xe1, 0xe1, 0xe1, 0xe0, 0xdf, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xde, 0xde, + 0xdd, 0xdc, 0xdc, 0xdc, 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd2, 0xe9, 0xa8, 0x65, 0x74, 0x88, 0x79, 0x69, 0x77, 0x51, 0x69, 0x8f, + 0x90, 0x7f, 0x76, 0x6a, 0x74, 0x7b, 0x71, 0x58, 0x53, 0x6d, 0x8f, 0xa0, + 0x87, 0x7f, 0x7e, 0x82, 0x78, 0x66, 0x62, 0x6c, 0x68, 0x6b, 0x6e, 0x6b, + 0x64, 0x62, 0x6a, 0x75, 0x75, 0x6c, 0x68, 0x6d, 0x6d, 0x66, 0x60, 0x60, + 0x6b, 0x70, 0x6e, 0x66, 0x5f, 0x5d, 0x59, 0x51, 0x53, 0x4c, 0x44, 0x44, + 0x45, 0x3a, 0x3c, 0x51, 0x7c, 0x5d, 0x53, 0x66, 0x6c, 0x5b, 0x55, 0x5f, + 0x51, 0x60, 0x4e, 0x35, 0x64, 0x83, 0x92, 0x80, 0x6e, 0x70, 0x6f, 0x6e, + 0x77, 0x82, 0x82, 0x7a, 0x8c, 0x73, 0x69, 0x59, 0x69, 0x89, 0x89, 0x90, + 0x82, 0x75, 0x63, 0x5c, 0x6b, 0x82, 0x88, 0x81, 0x7a, 0x93, 0x6c, 0x73, + 0x61, 0x5c, 0xb7, 0xc7, 0x8e, 0x69, 0x67, 0x7e, 0x72, 0x66, 0x83, 0x9c, + 0x73, 0x79, 0x92, 0x9c, 0x6f, 0x34, 0x36, 0x60, 0xb6, 0xe3, 0xfc, 0xfe, + 0xf1, 0xfb, 0xff, 0xe6, 0xaf, 0x73, 0x43, 0x3b, 0x34, 0x1f, 0x1a, 0x28, + 0x31, 0x30, 0x31, 0x36, 0x41, 0x4f, 0x5c, 0x63, 0x47, 0x3f, 0x27, 0x31, + 0x4c, 0x5c, 0x17, 0x02, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xef, 0xea, 0xe6, 0xe6, + 0xe8, 0xe8, 0xe4, 0xe0, 0xdf, 0xc6, 0x9f, 0xa1, 0xdc, 0xe2, 0xe6, 0xf1, + 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe5, 0xe3, 0xe6, + 0xeb, 0xea, 0xe2, 0xd9, 0xcc, 0xc9, 0xba, 0xcd, 0x9e, 0xb0, 0xc1, 0x9c, + 0xbc, 0xcb, 0xc8, 0xcb, 0xba, 0xca, 0xe0, 0xe4, 0xda, 0xdc, 0xde, 0xe0, + 0xe1, 0xe1, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xdd, 0xdd, 0xdc, 0xdb, 0xdb, 0xdb, 0xdc, + 0xdc, 0xdd, 0xdd, 0xdd, 0xec, 0xd7, 0x73, 0x5d, 0x7a, 0x85, 0x96, 0x75, + 0x8a, 0x60, 0x6c, 0x76, 0x72, 0x6e, 0x82, 0x78, 0x79, 0x83, 0x7f, 0x70, + 0x76, 0x92, 0xa2, 0x9f, 0x80, 0x72, 0x6f, 0x74, 0x69, 0x55, 0x54, 0x64, + 0x6b, 0x6b, 0x6e, 0x6e, 0x68, 0x62, 0x6a, 0x77, 0x6d, 0x63, 0x5e, 0x64, + 0x67, 0x65, 0x65, 0x68, 0x6b, 0x72, 0x73, 0x6c, 0x66, 0x65, 0x63, 0x5e, + 0x5f, 0x5e, 0x55, 0x4a, 0x3e, 0x38, 0x53, 0x7e, 0x80, 0x68, 0x74, 0x78, + 0x64, 0x74, 0x7b, 0x50, 0x5a, 0x50, 0x5d, 0x5f, 0x76, 0x70, 0x69, 0x5b, + 0x83, 0x8a, 0x88, 0x7b, 0x71, 0x70, 0x71, 0x70, 0x54, 0x82, 0x8b, 0x83, + 0x6d, 0x63, 0x70, 0x64, 0x5d, 0x74, 0x88, 0x8a, 0x82, 0x79, 0x6b, 0x5e, + 0x61, 0x80, 0x60, 0x64, 0x7f, 0x5b, 0x6c, 0xc1, 0xe5, 0xa9, 0x52, 0x55, + 0x7d, 0x6c, 0x64, 0x7c, 0x86, 0x70, 0x73, 0x72, 0x7d, 0xca, 0xff, 0xf4, + 0xff, 0xfd, 0xff, 0xe6, 0x89, 0x76, 0x8c, 0x39, 0x17, 0x11, 0x18, 0x28, + 0x2a, 0x24, 0x33, 0x4d, 0x58, 0x64, 0x70, 0x6e, 0x5f, 0x4d, 0x43, 0x40, + 0x5a, 0x52, 0x4d, 0x60, 0x62, 0x5e, 0x1e, 0x10, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xed, 0xeb, 0xe9, 0xe7, 0xe5, 0xe4, 0xe1, 0xe0, 0xd8, 0xd2, 0xb9, 0x9d, + 0xc8, 0xe5, 0xe3, 0xdc, 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe6, 0xe6, 0xe9, 0xec, 0xe9, 0xe2, 0xdb, 0xcf, 0xce, 0xcd, 0xc1, + 0xa0, 0xa7, 0xba, 0x7e, 0xa9, 0xb3, 0xc4, 0xde, 0xcd, 0xd9, 0xe8, 0xdf, + 0xd8, 0xda, 0xdc, 0xdf, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xdd, 0xdd, + 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xde, 0xde, 0xdf, 0xb7, 0x5c, 0x77, 0x7f, + 0x63, 0x71, 0x6e, 0x77, 0x84, 0x4b, 0x6c, 0x6a, 0x6c, 0x79, 0x8f, 0x94, + 0x7e, 0x7a, 0x6d, 0x60, 0x64, 0x72, 0x77, 0x71, 0x6e, 0x6b, 0x6e, 0x74, + 0x70, 0x67, 0x69, 0x73, 0x6e, 0x69, 0x67, 0x66, 0x5e, 0x59, 0x65, 0x77, + 0x7c, 0x73, 0x71, 0x75, 0x73, 0x68, 0x5e, 0x5b, 0x62, 0x6b, 0x6e, 0x66, + 0x60, 0x60, 0x60, 0x5d, 0x49, 0x53, 0x57, 0x52, 0x43, 0x35, 0x48, 0x70, + 0x89, 0x6d, 0x73, 0x77, 0x5a, 0x56, 0x63, 0x58, 0x54, 0x50, 0x66, 0x51, + 0x6a, 0x83, 0x84, 0x7f, 0x74, 0x78, 0x73, 0x69, 0x69, 0x79, 0x8c, 0x95, + 0x80, 0x78, 0x65, 0x6d, 0x63, 0x52, 0x72, 0x8a, 0x8a, 0x8b, 0x7e, 0x66, + 0x5b, 0x68, 0x7d, 0x8a, 0x85, 0x71, 0x70, 0x76, 0x87, 0x69, 0x41, 0x6f, + 0xd7, 0xcb, 0x8d, 0x5f, 0x56, 0x6f, 0x87, 0x67, 0x7d, 0x87, 0x9b, 0x85, + 0x71, 0xb2, 0xdf, 0xb4, 0x69, 0x39, 0x10, 0x1c, 0x1b, 0x01, 0x39, 0xa4, + 0x58, 0x3e, 0x30, 0x42, 0x5c, 0x68, 0x6a, 0x6c, 0x6f, 0x63, 0x57, 0x58, + 0x62, 0x67, 0x61, 0x59, 0x61, 0x51, 0x49, 0x50, 0x50, 0x6a, 0x31, 0x03, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xec, 0xeb, 0xe8, 0xe3, 0xdf, 0xdc, 0xdb, + 0xd0, 0xd6, 0xd2, 0xad, 0xc7, 0xe5, 0xe8, 0xe6, 0xe7, 0xe8, 0xe8, 0xe9, + 0xea, 0xeb, 0xeb, 0xec, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe5, 0xe7, 0xea, 0xeb, 0xeb, 0xe7, 0xe2, 0xde, + 0xd4, 0xcc, 0xdf, 0xd1, 0xb4, 0xa0, 0xc2, 0xa0, 0xb3, 0x9f, 0xab, 0xd1, + 0xc2, 0xd5, 0xeb, 0xd9, 0xd7, 0xd9, 0xdb, 0xde, 0xdf, 0xe0, 0xdf, 0xdf, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, + 0xde, 0xde, 0xdd, 0xdd, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xdf, 0xdf, + 0x70, 0x5c, 0x68, 0x85, 0x8f, 0x7f, 0x70, 0x78, 0xab, 0x55, 0x84, 0x80, + 0x8a, 0x8f, 0x73, 0x65, 0x77, 0x74, 0x70, 0x6a, 0x64, 0x63, 0x6c, 0x76, + 0x6d, 0x75, 0x79, 0x76, 0x6f, 0x6a, 0x66, 0x63, 0x76, 0x6d, 0x66, 0x62, + 0x5a, 0x56, 0x66, 0x7c, 0x71, 0x68, 0x65, 0x6a, 0x6a, 0x61, 0x59, 0x58, + 0x66, 0x6f, 0x72, 0x69, 0x61, 0x60, 0x5f, 0x5c, 0x69, 0x5d, 0x50, 0x50, + 0x53, 0x45, 0x3f, 0x4c, 0x72, 0x77, 0x7c, 0x84, 0x7b, 0x59, 0x4f, 0x6b, + 0x60, 0x45, 0x58, 0x48, 0x5f, 0x66, 0x61, 0x81, 0x74, 0x7b, 0x7e, 0x7e, + 0x7e, 0x7a, 0x69, 0x56, 0x6d, 0x73, 0x92, 0x94, 0x8a, 0x7f, 0x69, 0x71, + 0x6e, 0x75, 0x7b, 0x80, 0x89, 0x8e, 0x81, 0x6f, 0x7c, 0x55, 0x66, 0x7f, + 0x92, 0x8b, 0x62, 0x61, 0xa2, 0xfd, 0xcd, 0x74, 0x67, 0x7a, 0x8b, 0x82, + 0x87, 0x70, 0x73, 0x80, 0x77, 0x6d, 0x69, 0x60, 0x60, 0x55, 0x4a, 0x32, + 0x37, 0x39, 0x3b, 0x77, 0x74, 0x67, 0x6b, 0x7c, 0x7b, 0x65, 0x59, 0x5e, + 0x78, 0x8b, 0x9d, 0x9c, 0x84, 0x66, 0x51, 0x48, 0x38, 0x3f, 0x5e, 0x6e, + 0x4f, 0x55, 0x28, 0x04, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xe9, 0xe9, 0xea, 0xea, + 0xe9, 0xe6, 0xe4, 0xe2, 0xe4, 0xdd, 0xda, 0x9a, 0xa0, 0xc9, 0xec, 0xe3, + 0xe2, 0xe5, 0xe8, 0xeb, 0xed, 0xec, 0xeb, 0xea, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xed, 0xe7, 0xe9, 0xec, + 0xe7, 0xe4, 0xe2, 0xdc, 0xe3, 0xa5, 0xb2, 0xb9, 0x8a, 0x83, 0xb6, 0xa5, + 0xbf, 0xa8, 0xad, 0xb6, 0xbd, 0xdc, 0xe0, 0xdb, 0xd7, 0xe2, 0xe2, 0xe3, + 0xed, 0xe8, 0xdf, 0xe4, 0xdc, 0xdd, 0xe0, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe1, 0xd8, 0xdf, + 0xe1, 0xea, 0xc3, 0x41, 0x46, 0x79, 0x8d, 0x7c, 0x71, 0x94, 0x8d, 0x95, + 0x88, 0x57, 0x82, 0x8d, 0x6c, 0x7a, 0x71, 0x4c, 0x6d, 0x6c, 0x6a, 0x66, + 0x67, 0x70, 0x7d, 0x86, 0x68, 0x6f, 0x74, 0x6e, 0x65, 0x62, 0x69, 0x72, + 0x7a, 0x6f, 0x67, 0x6d, 0x7e, 0x89, 0x89, 0x84, 0x7a, 0x72, 0x71, 0x77, + 0x77, 0x69, 0x5b, 0x54, 0x64, 0x68, 0x6a, 0x68, 0x65, 0x5f, 0x54, 0x4a, + 0x53, 0x56, 0x56, 0x4b, 0x3b, 0x3b, 0x58, 0x78, 0x83, 0x79, 0x69, 0x6e, + 0x7a, 0x67, 0x55, 0x5f, 0x5c, 0x58, 0x64, 0x50, 0x59, 0x7f, 0x7f, 0x8a, + 0x6f, 0x6c, 0x75, 0x75, 0x70, 0x82, 0x8d, 0x7a, 0x93, 0x7c, 0x7a, 0x68, + 0x6a, 0x7a, 0x72, 0x7d, 0x82, 0x7c, 0x77, 0x65, 0x68, 0x63, 0x82, 0x7f, + 0x69, 0x65, 0x81, 0x4b, 0x31, 0x10, 0x16, 0x2f, 0x47, 0xa0, 0xef, 0xac, + 0x5a, 0x65, 0x6d, 0x67, 0x8d, 0x8a, 0x8c, 0x7b, 0x7e, 0x7e, 0x6e, 0x90, + 0x84, 0x8e, 0x9c, 0x88, 0x6e, 0x67, 0x5a, 0x4f, 0x59, 0x63, 0x5a, 0x49, + 0x76, 0xa5, 0xaa, 0x8d, 0x65, 0x3b, 0x23, 0x33, 0x43, 0x3d, 0x36, 0x3b, + 0x4e, 0x4f, 0x4e, 0x3e, 0x47, 0x45, 0x1a, 0x0b, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xe9, 0xea, 0xea, 0xea, 0xe9, 0xe7, 0xe4, 0xe3, 0xda, 0xdc, 0xd3, 0x80, + 0x8f, 0xd1, 0xdd, 0xed, 0xe3, 0xe5, 0xe8, 0xeb, 0xec, 0xec, 0xeb, 0xea, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xe7, 0xe9, 0xeb, 0xe7, 0xe7, 0xe1, 0xd5, 0xea, 0xcc, 0xc0, 0xc7, + 0x96, 0x8f, 0xdb, 0xa7, 0xc0, 0xc1, 0x96, 0xa9, 0xda, 0xda, 0xe7, 0xe3, + 0xdf, 0xe1, 0xde, 0xdb, 0xde, 0xde, 0xdc, 0xe0, 0xdf, 0xe0, 0xe1, 0xe3, + 0xe3, 0xe3, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xd8, 0xdc, 0xd4, 0xd9, 0xf3, 0xcc, 0x78, 0x64, 0x7d, 0x91, 0x91, 0x85, + 0x77, 0x85, 0x73, 0x7f, 0x71, 0x49, 0x68, 0x85, 0x8f, 0x97, 0x88, 0x8f, + 0x85, 0x7b, 0x6b, 0x60, 0x66, 0x74, 0x78, 0x73, 0x78, 0x79, 0x78, 0x74, + 0x6f, 0x6d, 0x6e, 0x70, 0x5f, 0x64, 0x6d, 0x76, 0x79, 0x73, 0x65, 0x59, + 0x76, 0x73, 0x75, 0x77, 0x6f, 0x5e, 0x53, 0x53, 0x5a, 0x59, 0x57, 0x53, + 0x4d, 0x4a, 0x4f, 0x56, 0x55, 0x4d, 0x47, 0x43, 0x40, 0x43, 0x52, 0x63, + 0x77, 0x80, 0x81, 0x7d, 0x70, 0x50, 0x40, 0x50, 0x69, 0x58, 0x54, 0x37, + 0x43, 0x70, 0x75, 0x80, 0x7d, 0x7e, 0x84, 0x85, 0x7f, 0x7e, 0x79, 0x6c, + 0x72, 0x70, 0x81, 0x7b, 0x7c, 0x7f, 0x65, 0x5e, 0x6b, 0x71, 0x8f, 0x70, + 0x78, 0x6c, 0x4d, 0x4f, 0x23, 0x4d, 0xa1, 0xb5, 0xf1, 0xff, 0xf4, 0xc2, + 0x88, 0x59, 0x9f, 0xd6, 0xa5, 0x78, 0x77, 0x8f, 0x65, 0x7c, 0x7d, 0x65, + 0x73, 0x8c, 0x87, 0x87, 0x96, 0x83, 0x74, 0x6a, 0x6e, 0x79, 0x72, 0x66, + 0x69, 0x6e, 0x78, 0x91, 0x5c, 0x18, 0x1c, 0x3d, 0x23, 0x2c, 0x45, 0x5d, + 0x5a, 0x48, 0x46, 0x54, 0x67, 0x5c, 0x52, 0x48, 0x5e, 0x5d, 0x22, 0x02, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xea, 0xea, 0xeb, 0xeb, 0xe9, 0xe7, 0xe5, 0xe3, + 0xe1, 0xc7, 0xd7, 0x94, 0x84, 0xe8, 0xe5, 0xd9, 0xe5, 0xe6, 0xe8, 0xea, + 0xeb, 0xeb, 0xeb, 0xea, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xe8, 0xea, 0xe9, 0xe8, 0xeb, 0xe0, 0xca, + 0xe5, 0xd4, 0xbf, 0xdd, 0xb5, 0x7b, 0xbe, 0xae, 0xaf, 0xb1, 0x81, 0x9c, + 0xe5, 0xca, 0xd5, 0xd9, 0xd9, 0xd7, 0xdb, 0xdd, 0xda, 0xd9, 0xda, 0xd5, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xd5, 0xcf, 0xfd, 0xc7, 0x59, 0x63, 0x90, + 0x8b, 0x79, 0x6c, 0x7d, 0x8b, 0x95, 0x72, 0x77, 0x70, 0x77, 0x9c, 0x97, + 0x89, 0x7e, 0x61, 0x6c, 0x74, 0x80, 0x84, 0x7a, 0x6e, 0x6c, 0x6d, 0x6c, + 0x66, 0x64, 0x63, 0x65, 0x69, 0x6c, 0x6b, 0x69, 0x5b, 0x63, 0x6c, 0x6f, + 0x6a, 0x62, 0x5c, 0x59, 0x66, 0x67, 0x6c, 0x6e, 0x64, 0x58, 0x57, 0x5f, + 0x63, 0x5b, 0x5e, 0x6c, 0x71, 0x64, 0x56, 0x52, 0x58, 0x49, 0x3c, 0x3a, + 0x3f, 0x4c, 0x62, 0x75, 0x8b, 0x7d, 0x69, 0x67, 0x70, 0x66, 0x52, 0x4b, + 0x5a, 0x51, 0x5c, 0x4e, 0x61, 0x87, 0x7c, 0x7a, 0x7f, 0x77, 0x6a, 0x69, + 0x74, 0x78, 0x7b, 0x85, 0x7a, 0x7c, 0x7f, 0x68, 0x61, 0x72, 0x7a, 0x85, + 0x7a, 0x7b, 0x57, 0x53, 0x60, 0x5f, 0xb4, 0xc7, 0xdc, 0xfc, 0xf2, 0xd0, + 0xfb, 0xe3, 0xc3, 0xeb, 0xff, 0x89, 0x7e, 0xce, 0xdb, 0x88, 0x3c, 0x3b, + 0x57, 0x54, 0x5a, 0x84, 0x92, 0x70, 0x68, 0x7b, 0x5c, 0x84, 0x97, 0x87, + 0x75, 0x74, 0x74, 0x6d, 0x94, 0xb2, 0xa7, 0xbe, 0x60, 0x2d, 0x4c, 0x5f, + 0x68, 0x60, 0x58, 0x51, 0x47, 0x3c, 0x36, 0x37, 0x4f, 0x4b, 0x4b, 0x49, + 0x61, 0x60, 0x24, 0x04, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xea, 0xeb, 0xeb, 0xeb, + 0xea, 0xe8, 0xe5, 0xe4, 0xef, 0xd8, 0xdd, 0xa7, 0x8b, 0xef, 0xe9, 0xe9, + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xea, 0xe8, + 0xe9, 0xee, 0xe0, 0xc4, 0xe9, 0xe1, 0xbb, 0xc7, 0xbe, 0x78, 0x98, 0xb9, + 0x81, 0x8e, 0xa3, 0xa4, 0xda, 0xd7, 0xe1, 0xe6, 0xca, 0xc6, 0xd3, 0xdd, + 0xda, 0xe0, 0xe6, 0xdf, 0xe4, 0xe5, 0xe6, 0xe6, 0xe5, 0xe4, 0xe2, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xdf, 0xdd, 0xf6, 0xcb, + 0x71, 0x64, 0x80, 0x7e, 0x90, 0x87, 0x80, 0x87, 0x82, 0x86, 0x7a, 0x9b, + 0x7a, 0x6d, 0x7e, 0x6c, 0x67, 0x80, 0x78, 0x79, 0x93, 0x81, 0x6d, 0x64, + 0x66, 0x6e, 0x7b, 0x86, 0x7c, 0x7c, 0x7c, 0x7a, 0x78, 0x74, 0x71, 0x6f, + 0x79, 0x79, 0x78, 0x74, 0x6e, 0x6b, 0x6b, 0x6d, 0x7d, 0x76, 0x70, 0x6b, + 0x61, 0x56, 0x58, 0x60, 0x6b, 0x5f, 0x5a, 0x5a, 0x4f, 0x42, 0x4c, 0x62, + 0x4e, 0x4e, 0x4f, 0x4d, 0x45, 0x45, 0x58, 0x6e, 0x83, 0x85, 0x81, 0x7a, + 0x74, 0x67, 0x53, 0x46, 0x52, 0x49, 0x51, 0x3b, 0x46, 0x6b, 0x65, 0x6a, + 0x74, 0x81, 0x83, 0x87, 0x89, 0x74, 0x6b, 0x80, 0x66, 0x7b, 0x8a, 0x7f, + 0x70, 0x64, 0x4d, 0x3a, 0x31, 0x50, 0x9e, 0xa5, 0xed, 0xff, 0xdd, 0xe5, + 0xf4, 0xa7, 0x7b, 0x65, 0x40, 0x11, 0x12, 0x2c, 0x5a, 0x70, 0x58, 0x5b, + 0xab, 0xd3, 0xcd, 0xe8, 0x9c, 0x8f, 0x59, 0x40, 0x39, 0x42, 0x72, 0x86, + 0x97, 0x94, 0x7a, 0x7e, 0x9a, 0xad, 0xb7, 0xb2, 0xb9, 0xc2, 0xa7, 0xf4, + 0x90, 0x45, 0x57, 0x5a, 0x4c, 0x3f, 0x32, 0x33, 0x43, 0x4c, 0x42, 0x32, + 0x35, 0x49, 0x5e, 0x57, 0x59, 0x4c, 0x1c, 0x0d, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xec, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe7, 0xd7, 0xe1, 0xcf, + 0x9c, 0xe4, 0xef, 0xed, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xeb, 0xe8, 0xe9, 0xef, 0xe2, 0xc5, 0xc1, 0xe4, 0xc1, 0xb0, + 0xc0, 0x95, 0x95, 0xa3, 0xab, 0xb3, 0xd4, 0xa7, 0xc2, 0xdf, 0xe2, 0xd1, + 0xda, 0xd1, 0xd6, 0xd9, 0xd4, 0xdc, 0xe7, 0xe3, 0xe3, 0xe4, 0xe5, 0xe6, + 0xe5, 0xe4, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xdf, 0xff, 0xd6, 0x62, 0x4a, 0x8b, 0x9b, 0x86, 0x71, 0x81, 0x8e, 0x96, + 0x87, 0x80, 0x65, 0x79, 0x63, 0x55, 0x74, 0x81, 0x89, 0x8c, 0x6f, 0x73, + 0x7f, 0x71, 0x72, 0x82, 0x84, 0x74, 0x6e, 0x75, 0x63, 0x6d, 0x76, 0x78, + 0x73, 0x71, 0x75, 0x7b, 0x78, 0x7b, 0x81, 0x88, 0x8d, 0x8d, 0x87, 0x82, + 0x7f, 0x70, 0x65, 0x65, 0x68, 0x69, 0x6e, 0x75, 0x73, 0x5c, 0x50, 0x58, + 0x5c, 0x53, 0x50, 0x56, 0x48, 0x48, 0x47, 0x40, 0x37, 0x40, 0x63, 0x87, + 0x79, 0x7a, 0x78, 0x75, 0x78, 0x79, 0x65, 0x48, 0x38, 0x3f, 0x57, 0x48, + 0x50, 0x73, 0x73, 0x7f, 0x73, 0x71, 0x64, 0x66, 0x75, 0x71, 0x73, 0x8d, + 0x85, 0x5f, 0x2a, 0x1c, 0x47, 0x8f, 0xcc, 0xe2, 0xf7, 0xff, 0xac, 0xb9, + 0xf3, 0x8f, 0x53, 0x3c, 0x37, 0x3e, 0x28, 0x3b, 0x54, 0x36, 0x14, 0x27, + 0x4b, 0x3a, 0x27, 0x5b, 0xb1, 0xc1, 0xa7, 0xa0, 0xad, 0xcd, 0xe2, 0xf8, + 0xd5, 0x8d, 0x69, 0x45, 0x23, 0x3a, 0x53, 0x9e, 0xcd, 0xb7, 0xb0, 0xb6, + 0x9c, 0xa2, 0x94, 0xff, 0xb4, 0x4d, 0x5a, 0x63, 0x59, 0x5c, 0x58, 0x4c, + 0x40, 0x39, 0x35, 0x31, 0x4d, 0x6a, 0x84, 0x72, 0x60, 0x46, 0x17, 0x10, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xec, 0xec, 0xec, 0xeb, 0xe9, 0xe6, 0xe5, + 0xeb, 0xc3, 0xba, 0xba, 0x86, 0xc4, 0xe9, 0xe1, 0xea, 0xe9, 0xe8, 0xe7, + 0xe7, 0xe8, 0xea, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe8, 0xea, 0xea, 0xea, 0xee, 0xe4, 0xcf, + 0xcd, 0xeb, 0xc9, 0xb3, 0xb2, 0x7b, 0x88, 0xae, 0x81, 0x8d, 0xb1, 0xad, + 0xca, 0xd6, 0xdd, 0xdc, 0xe3, 0xdf, 0xde, 0xdd, 0xd9, 0xdb, 0xdf, 0xdd, + 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xf3, 0xc8, 0x7f, 0x6d, 0x7b, 0x7e, 0x88, 0x87, + 0x92, 0x8c, 0x7c, 0x78, 0x79, 0x8f, 0x80, 0x91, 0x74, 0x7e, 0x8c, 0x7a, + 0x80, 0x82, 0x66, 0x7a, 0x86, 0x7d, 0x7e, 0x81, 0x75, 0x63, 0x67, 0x79, + 0x69, 0x75, 0x7f, 0x7d, 0x71, 0x6a, 0x6c, 0x71, 0x7a, 0x7c, 0x82, 0x8a, + 0x90, 0x90, 0x8a, 0x85, 0x81, 0x71, 0x64, 0x64, 0x66, 0x63, 0x61, 0x62, + 0x4e, 0x54, 0x64, 0x72, 0x6b, 0x58, 0x50, 0x54, 0x40, 0x40, 0x40, 0x3e, + 0x37, 0x38, 0x4b, 0x62, 0x81, 0x87, 0x86, 0x72, 0x62, 0x65, 0x5b, 0x3e, + 0x42, 0x48, 0x5c, 0x43, 0x41, 0x60, 0x65, 0x76, 0x75, 0x85, 0x90, 0x8d, + 0x78, 0x4e, 0x2b, 0x22, 0x59, 0xa1, 0xe8, 0xff, 0xff, 0xe1, 0xde, 0xdf, + 0xe3, 0x81, 0x5e, 0x34, 0x40, 0x2e, 0x13, 0x3b, 0x26, 0x31, 0x50, 0x74, + 0x3d, 0x2b, 0x2e, 0x17, 0x41, 0x3e, 0x3e, 0x31, 0x36, 0x98, 0xd1, 0x80, + 0x1d, 0x3b, 0x60, 0x86, 0xa0, 0xc2, 0xe8, 0xe8, 0xd5, 0xbb, 0x6d, 0x73, + 0xa9, 0xb7, 0xba, 0xa7, 0xae, 0xbf, 0xa6, 0xf3, 0xb0, 0x5d, 0x67, 0x59, + 0x70, 0x6a, 0x5d, 0x48, 0x33, 0x2d, 0x3e, 0x54, 0x5a, 0x6d, 0x7e, 0x6f, + 0x68, 0x53, 0x1f, 0x0f, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, + 0xeb, 0xe9, 0xe7, 0xe5, 0xeb, 0xe4, 0xc4, 0xb8, 0xaf, 0xcb, 0xce, 0xe5, + 0xec, 0xea, 0xe8, 0xe7, 0xe6, 0xe8, 0xea, 0xeb, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xe7, 0xea, 0xed, + 0xeb, 0xeb, 0xe7, 0xdb, 0xc3, 0xce, 0xcc, 0xc4, 0xc7, 0x83, 0x7f, 0xd7, + 0xb2, 0x7f, 0x74, 0x9c, 0xca, 0xd0, 0xcc, 0xd1, 0xd6, 0xdb, 0xdc, 0xdd, + 0xe3, 0xe4, 0xe2, 0xe5, 0xdb, 0xdd, 0xdf, 0xe2, 0xe4, 0xe5, 0xe4, 0xe4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0x6c, 0x5f, 0x76, + 0x86, 0x92, 0x7a, 0x82, 0x85, 0x8a, 0x84, 0x7b, 0x6c, 0x76, 0x6f, 0x8e, + 0x62, 0x6b, 0x78, 0x61, 0x73, 0x98, 0x89, 0x8b, 0x96, 0x89, 0x77, 0x6c, + 0x6c, 0x6f, 0x6c, 0x66, 0x5c, 0x65, 0x6f, 0x73, 0x70, 0x6d, 0x6d, 0x6f, + 0x87, 0x86, 0x82, 0x7a, 0x73, 0x71, 0x75, 0x7a, 0x6f, 0x6c, 0x6f, 0x78, + 0x79, 0x71, 0x6b, 0x6c, 0x6d, 0x63, 0x59, 0x57, 0x5b, 0x60, 0x63, 0x66, + 0x59, 0x51, 0x49, 0x45, 0x44, 0x4d, 0x66, 0x7e, 0x79, 0x74, 0x72, 0x70, + 0x78, 0x88, 0x6a, 0x2b, 0x30, 0x3e, 0x5e, 0x52, 0x53, 0x69, 0x5c, 0x60, + 0x8a, 0x5a, 0x36, 0x46, 0x86, 0xd2, 0xf9, 0xf7, 0xf8, 0xff, 0xff, 0xff, + 0xd6, 0x83, 0x4e, 0x2a, 0x1f, 0x31, 0x44, 0x47, 0x4e, 0x66, 0x94, 0x53, + 0x20, 0x46, 0x3b, 0x65, 0x61, 0x42, 0x2d, 0x45, 0x58, 0x51, 0x46, 0x2c, + 0x18, 0x74, 0xe0, 0xc4, 0x7c, 0x26, 0x18, 0x3e, 0x39, 0x1e, 0x2f, 0x66, + 0x8b, 0xd7, 0xd3, 0xcf, 0xc7, 0xa7, 0xb0, 0xaf, 0xaf, 0xa6, 0x92, 0xdd, + 0xb7, 0x43, 0x3a, 0x39, 0x42, 0x35, 0x31, 0x38, 0x38, 0x33, 0x3f, 0x54, + 0x50, 0x58, 0x62, 0x5a, 0x62, 0x57, 0x22, 0x0c, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xed, 0xed, 0xed, 0xec, 0xe9, 0xe7, 0xe5, 0xed, 0xf4, 0xe3, 0xc4, + 0xad, 0xba, 0xc0, 0xe9, 0xed, 0xeb, 0xe8, 0xe6, 0xe6, 0xe7, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xe6, 0xea, 0xef, 0xeb, 0xe9, 0xe9, 0xe4, 0xc8, 0xcc, 0xce, 0x9d, + 0xb9, 0x9b, 0x68, 0xc8, 0xb5, 0x98, 0xb1, 0xd3, 0xd1, 0xcd, 0xca, 0xdd, + 0xe2, 0xe6, 0xdc, 0xd6, 0xde, 0xdd, 0xdc, 0xe6, 0xd8, 0xda, 0xdd, 0xe1, + 0xe3, 0xe5, 0xe5, 0xe5, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0x68, 0x64, 0x6c, 0x7a, 0x8d, 0x94, 0x88, 0x82, 0x7f, 0x82, 0x83, 0x88, + 0x7d, 0x7e, 0x6c, 0x88, 0x62, 0x5c, 0x88, 0x80, 0x62, 0x6c, 0x6b, 0x6e, + 0x79, 0x8a, 0x8a, 0x75, 0x6b, 0x71, 0x6c, 0x5b, 0x5b, 0x5e, 0x63, 0x69, + 0x6b, 0x68, 0x62, 0x5d, 0x65, 0x6d, 0x72, 0x6e, 0x68, 0x6c, 0x7c, 0x8c, + 0x7c, 0x84, 0x94, 0x9f, 0x98, 0x86, 0x7b, 0x7b, 0x6a, 0x68, 0x62, 0x59, + 0x55, 0x58, 0x5d, 0x5e, 0x53, 0x50, 0x4c, 0x48, 0x42, 0x45, 0x5b, 0x72, + 0x71, 0x7b, 0x82, 0x75, 0x6d, 0x7f, 0x75, 0x48, 0x4f, 0x4e, 0x5d, 0x46, + 0x49, 0x64, 0x5a, 0x5d, 0x7b, 0x98, 0xcf, 0xf6, 0xff, 0xff, 0xf3, 0xcd, + 0xbe, 0x7c, 0x26, 0x18, 0x1e, 0x23, 0x49, 0x5b, 0x2d, 0x3d, 0x54, 0x59, + 0x8a, 0x7a, 0x4a, 0x2e, 0x20, 0x48, 0x37, 0x61, 0x5f, 0x4f, 0x3e, 0x49, + 0x54, 0x53, 0x2a, 0x2f, 0x49, 0x5a, 0x95, 0xc3, 0xc8, 0x5a, 0x33, 0x33, + 0x28, 0x1f, 0x22, 0x48, 0x3f, 0x2f, 0x03, 0x57, 0xbb, 0xbc, 0xc0, 0xbe, + 0xb4, 0xa5, 0x9c, 0xdc, 0xb9, 0x29, 0x1d, 0x34, 0x42, 0x37, 0x3c, 0x4c, + 0x47, 0x36, 0x3e, 0x58, 0x55, 0x5b, 0x62, 0x55, 0x5a, 0x4f, 0x1b, 0x06, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xe9, 0xe6, 0xea, 0xef, 0xe9, 0xdd, + 0xd7, 0xf0, 0xeb, 0xc4, 0xb3, 0xb8, 0xba, 0xde, 0xf4, 0xeb, 0xd9, 0xf5, + 0xe8, 0xe8, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xeb, 0xe9, 0xe9, 0xec, 0xf0, + 0xcd, 0xbc, 0xe0, 0xba, 0x9c, 0x95, 0x90, 0xaa, 0xad, 0xa6, 0xa7, 0xcb, + 0xd2, 0xb8, 0xc5, 0xe2, 0xd2, 0xc9, 0xd0, 0xd8, 0xd9, 0xe4, 0xe7, 0xd5, + 0xd9, 0xe8, 0xdd, 0xe0, 0xe6, 0xe2, 0xe6, 0xdd, 0xe1, 0xdf, 0xe1, 0xe8, + 0xd2, 0xf7, 0xe4, 0x67, 0x64, 0x8e, 0x93, 0x90, 0x91, 0x83, 0x84, 0x93, + 0x9f, 0x8b, 0x69, 0x62, 0x7c, 0x86, 0x7a, 0x76, 0x4a, 0x67, 0x7b, 0x84, + 0x85, 0x75, 0x69, 0x6f, 0x82, 0x82, 0x7b, 0x6d, 0x65, 0x69, 0x74, 0x7d, + 0x74, 0x6e, 0x6f, 0x76, 0x73, 0x65, 0x5d, 0x5f, 0x60, 0x62, 0x63, 0x65, + 0x6b, 0x7a, 0x8d, 0x9b, 0x90, 0x76, 0x66, 0x6f, 0x7b, 0x77, 0x6a, 0x63, + 0x57, 0x58, 0x4d, 0x3e, 0x3f, 0x50, 0x5c, 0x5d, 0x42, 0x47, 0x46, 0x3d, + 0x3e, 0x53, 0x73, 0x8a, 0x89, 0x64, 0x69, 0x60, 0x68, 0x7f, 0x61, 0x4c, + 0x54, 0x61, 0x55, 0x2b, 0x4b, 0x57, 0x55, 0xcd, 0xff, 0xf3, 0xf6, 0xed, + 0x84, 0x3b, 0x43, 0x1b, 0x24, 0x31, 0x2e, 0x2f, 0x2e, 0x2f, 0x28, 0x48, + 0x62, 0x3e, 0x5f, 0x71, 0x5f, 0x5d, 0x4a, 0x32, 0x48, 0x51, 0x5e, 0x6e, + 0x6e, 0x52, 0x44, 0x55, 0x58, 0x41, 0x2f, 0x52, 0x67, 0x30, 0x30, 0x8f, + 0xe3, 0xe3, 0x5c, 0x12, 0x22, 0x2b, 0x3c, 0x2a, 0x15, 0x0c, 0x07, 0x39, + 0xbe, 0xce, 0xba, 0xbc, 0xab, 0xab, 0x9d, 0xe8, 0xff, 0x71, 0x4b, 0x62, + 0x4b, 0x38, 0x2e, 0x3a, 0x4a, 0x50, 0x52, 0x55, 0x43, 0x5b, 0x59, 0x6d, + 0x60, 0x47, 0x1f, 0x11, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xf0, 0xec, 0xe9, 0xe9, + 0xe9, 0xe6, 0xe3, 0xe2, 0xd8, 0xe7, 0xf4, 0xc2, 0x9b, 0xc0, 0xcb, 0xd1, + 0xd6, 0xea, 0xda, 0xe7, 0xe7, 0xed, 0xea, 0xea, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xeb, + 0xe8, 0xe8, 0xec, 0xef, 0xd6, 0xa2, 0xe0, 0xcf, 0x8a, 0x7b, 0x80, 0xab, + 0x9a, 0x94, 0x8e, 0xc6, 0xcc, 0xbb, 0xcb, 0xea, 0xd2, 0xd4, 0xe2, 0xe7, + 0xde, 0xdf, 0xe0, 0xd3, 0xd3, 0xdc, 0xdd, 0xe5, 0xe7, 0xdc, 0xdd, 0xe5, + 0xdf, 0xe1, 0xe2, 0xe6, 0xfb, 0xce, 0x66, 0x5c, 0x5f, 0x50, 0x46, 0x52, + 0x47, 0x44, 0x50, 0x30, 0x2b, 0x4c, 0x65, 0x74, 0x7f, 0x79, 0x76, 0x83, + 0x64, 0x72, 0x88, 0x87, 0x81, 0x96, 0x91, 0x62, 0x6c, 0x7e, 0x85, 0x7a, + 0x73, 0x74, 0x6c, 0x5c, 0x61, 0x5f, 0x64, 0x6f, 0x71, 0x6a, 0x68, 0x6b, + 0x74, 0x79, 0x7b, 0x73, 0x69, 0x68, 0x74, 0x80, 0x7b, 0x77, 0x79, 0x80, + 0x7b, 0x6e, 0x69, 0x6d, 0x5c, 0x61, 0x5f, 0x56, 0x54, 0x59, 0x58, 0x51, + 0x41, 0x43, 0x42, 0x3d, 0x3c, 0x48, 0x61, 0x76, 0x8c, 0x7d, 0x8d, 0x77, + 0x5d, 0x5e, 0x4b, 0x46, 0x4a, 0x57, 0x48, 0x28, 0x48, 0x5a, 0x5f, 0xb4, + 0x8e, 0x4a, 0x13, 0x42, 0x56, 0x27, 0x28, 0x3f, 0x41, 0x39, 0x51, 0x58, + 0x3e, 0x48, 0x63, 0x85, 0x90, 0x7d, 0x86, 0x86, 0x80, 0x69, 0x47, 0x51, + 0x65, 0x8d, 0x8d, 0x84, 0x8f, 0x79, 0x51, 0x4d, 0x43, 0x37, 0x52, 0x66, + 0x46, 0x2f, 0x35, 0x34, 0x9a, 0xdc, 0xbd, 0x3e, 0x12, 0x3f, 0x3d, 0x17, + 0x1b, 0x16, 0x11, 0x3b, 0xb3, 0xb4, 0x92, 0x8a, 0xa1, 0xbc, 0xaa, 0xca, + 0xe3, 0x6d, 0x48, 0x44, 0x39, 0x47, 0x4e, 0x41, 0x2e, 0x29, 0x37, 0x47, + 0x48, 0x51, 0x3d, 0x42, 0x3d, 0x37, 0x14, 0x04, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xf1, 0xeb, 0xea, 0xec, 0xe8, 0xdf, 0xde, 0xe4, 0xc9, 0xce, 0xf9, 0xe3, + 0xad, 0xc1, 0xbe, 0xd0, 0xc6, 0xdf, 0xdb, 0xe6, 0xec, 0xf4, 0xf0, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xec, 0xed, 0xea, 0xe8, 0xe8, 0xeb, 0xee, 0xe9, 0xa1, 0xc7, 0xd5, + 0xb3, 0xa5, 0x8e, 0xbd, 0xa6, 0x9c, 0x89, 0xc3, 0xcb, 0xbe, 0xd0, 0xde, + 0xde, 0xe5, 0xda, 0xce, 0xda, 0xe6, 0xdd, 0xd1, 0xec, 0xe8, 0xe6, 0xe3, + 0xe4, 0xe1, 0xde, 0xed, 0xe9, 0xf9, 0xfd, 0xff, 0x9c, 0x1e, 0x43, 0x82, + 0xa0, 0xbf, 0xc9, 0xd3, 0xe0, 0xfc, 0xee, 0x92, 0x45, 0x5c, 0x6d, 0x7e, + 0x90, 0x8b, 0x7c, 0x7d, 0x63, 0x6a, 0x7e, 0x7f, 0x6c, 0x6a, 0x6a, 0x5b, + 0x6d, 0x6c, 0x70, 0x74, 0x70, 0x67, 0x65, 0x6a, 0x64, 0x67, 0x6d, 0x6f, + 0x68, 0x5e, 0x5c, 0x62, 0x6a, 0x71, 0x74, 0x6a, 0x5d, 0x5d, 0x6d, 0x7d, + 0x7a, 0x7d, 0x83, 0x84, 0x78, 0x6b, 0x6a, 0x73, 0x78, 0x79, 0x74, 0x69, + 0x63, 0x63, 0x60, 0x5a, 0x52, 0x58, 0x50, 0x3e, 0x3b, 0x4e, 0x63, 0x6b, + 0x5b, 0x43, 0x48, 0x5b, 0x95, 0xce, 0xa8, 0x64, 0x59, 0x69, 0x5e, 0x54, + 0x68, 0x5e, 0x34, 0x2e, 0x39, 0x55, 0x47, 0x2c, 0x32, 0x5c, 0x67, 0x2d, + 0x54, 0x2e, 0x5e, 0x95, 0x95, 0x73, 0x5e, 0x71, 0x54, 0x5e, 0x87, 0x8e, + 0x74, 0x53, 0x4a, 0x77, 0x98, 0xa5, 0x97, 0x77, 0x66, 0x62, 0x5e, 0x5a, + 0x37, 0x55, 0x5a, 0x41, 0x37, 0x45, 0x48, 0x39, 0x64, 0xae, 0xcc, 0x8d, + 0x32, 0x1c, 0x35, 0x2d, 0x25, 0x1c, 0x0f, 0x31, 0xae, 0xc4, 0xb8, 0xbd, + 0xc1, 0xb9, 0x98, 0xbe, 0xe7, 0x7c, 0x5b, 0x67, 0x64, 0x74, 0x76, 0x5e, + 0x46, 0x41, 0x43, 0x43, 0x60, 0x6d, 0x60, 0x60, 0x54, 0x4a, 0x1c, 0x08, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xee, 0xeb, 0xeb, 0xed, 0xea, 0xe2, 0xdd, 0xdd, + 0xcf, 0xc5, 0xe3, 0xdf, 0xbe, 0xc3, 0xad, 0xe5, 0xd6, 0xd2, 0xd8, 0xe9, + 0xea, 0xee, 0xef, 0xe5, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xea, 0xe7, 0xe7, 0xea, 0xed, + 0xea, 0xbc, 0xcc, 0xe1, 0xbc, 0x98, 0x84, 0xad, 0xa0, 0x9e, 0x9a, 0xc8, + 0xdf, 0xcc, 0xe0, 0xd0, 0xea, 0xea, 0xca, 0xb9, 0xc3, 0xb9, 0xb6, 0xd7, + 0xe1, 0xe7, 0xee, 0xde, 0xe0, 0xef, 0xef, 0xff, 0xd7, 0x90, 0x45, 0x67, + 0xc7, 0xf4, 0xff, 0xe3, 0xa5, 0x99, 0x8b, 0x7d, 0x67, 0x5b, 0x58, 0x4c, + 0x55, 0x6b, 0x76, 0x7a, 0x81, 0x7f, 0x7f, 0x8e, 0x4d, 0x6b, 0x72, 0x74, + 0x7e, 0x6f, 0x69, 0x87, 0xa2, 0x7c, 0x63, 0x6b, 0x74, 0x6e, 0x6a, 0x70, + 0x73, 0x6b, 0x65, 0x68, 0x6c, 0x69, 0x5f, 0x56, 0x56, 0x60, 0x6a, 0x6c, + 0x69, 0x6b, 0x75, 0x7e, 0x76, 0x6f, 0x6a, 0x6b, 0x6f, 0x72, 0x76, 0x79, + 0x80, 0x80, 0x7b, 0x73, 0x6c, 0x67, 0x62, 0x5d, 0x4e, 0x4f, 0x4c, 0x3f, + 0x30, 0x38, 0x60, 0x89, 0xb6, 0xe5, 0xfa, 0xc7, 0x9a, 0xa1, 0x8d, 0x59, + 0x33, 0x60, 0x69, 0x5b, 0x51, 0x4e, 0x53, 0x4e, 0x6b, 0x4f, 0x41, 0x4a, + 0x50, 0x5c, 0x67, 0x5a, 0x55, 0x61, 0x69, 0x2b, 0x28, 0x32, 0x2b, 0x3f, + 0x51, 0x2d, 0x5b, 0x7d, 0x6c, 0x6c, 0x78, 0x88, 0x88, 0x71, 0x94, 0x9e, + 0x67, 0x60, 0x79, 0x62, 0x61, 0x51, 0x41, 0x41, 0x4c, 0x4c, 0x40, 0x37, + 0x25, 0x85, 0xe5, 0xec, 0x81, 0x29, 0x2d, 0x32, 0x24, 0x25, 0x1d, 0x3b, + 0xb3, 0xc6, 0xb5, 0xb4, 0xb0, 0x99, 0x8c, 0xd2, 0xff, 0x94, 0x4c, 0x4c, + 0x4b, 0x51, 0x55, 0x5b, 0x67, 0x74, 0x75, 0x6f, 0x54, 0x50, 0x44, 0x50, + 0x57, 0x56, 0x21, 0x0f, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xea, 0xec, 0xec, 0xec, + 0xee, 0xec, 0xe1, 0xd4, 0xd4, 0xcd, 0xd1, 0xc5, 0xb4, 0xc8, 0xa0, 0xd1, + 0xd7, 0xc3, 0xc8, 0xd6, 0xe5, 0xee, 0xee, 0xe4, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xec, 0xea, + 0xe6, 0xe6, 0xe8, 0xeb, 0xf8, 0xc5, 0xc0, 0xec, 0xc2, 0x84, 0x8c, 0x8b, + 0x9b, 0x86, 0x9f, 0xc8, 0xdc, 0xaa, 0xdc, 0xf1, 0xdb, 0xe9, 0xd0, 0xac, + 0xaf, 0xc4, 0xd0, 0xd7, 0xc9, 0xca, 0xd7, 0xda, 0xe1, 0xc9, 0x80, 0x54, + 0x94, 0xd5, 0xff, 0xeb, 0xb7, 0xcb, 0xf5, 0xeb, 0x98, 0x8f, 0xa3, 0xa7, + 0xaf, 0xbf, 0x97, 0x62, 0x6b, 0x83, 0x8e, 0x8c, 0x89, 0x7b, 0x74, 0x80, + 0x5a, 0x84, 0x7c, 0x6c, 0x8b, 0x97, 0x83, 0x7f, 0x80, 0x77, 0x6c, 0x68, + 0x6b, 0x6d, 0x6a, 0x66, 0x66, 0x6a, 0x6e, 0x6d, 0x6b, 0x6b, 0x6c, 0x6c, + 0x68, 0x6e, 0x78, 0x7f, 0x81, 0x7c, 0x72, 0x6b, 0x66, 0x60, 0x5b, 0x5f, + 0x6f, 0x7f, 0x85, 0x84, 0x70, 0x74, 0x7b, 0x7f, 0x79, 0x6a, 0x5b, 0x52, + 0x4c, 0x4f, 0x40, 0x37, 0x66, 0xbb, 0xf3, 0xfc, 0xf5, 0xe4, 0xae, 0x67, + 0x44, 0x59, 0x65, 0x44, 0x50, 0x62, 0x58, 0x4d, 0x54, 0x5e, 0x54, 0x2e, + 0x72, 0x7d, 0x6a, 0x58, 0x64, 0x56, 0x42, 0x5b, 0x42, 0x6e, 0x95, 0x3c, + 0x3e, 0x55, 0x47, 0x40, 0x6d, 0x45, 0x64, 0x72, 0x56, 0x5b, 0x6f, 0x82, + 0x5a, 0x41, 0x71, 0x8f, 0x69, 0x6f, 0x7e, 0x4d, 0x5b, 0x70, 0x69, 0x59, + 0x57, 0x4a, 0x43, 0x54, 0x49, 0x2c, 0x8e, 0xfa, 0xeb, 0x75, 0x17, 0x2b, + 0x36, 0x39, 0x2c, 0x3c, 0xab, 0xc0, 0xb1, 0xaf, 0xcd, 0xbe, 0xa9, 0xc6, + 0xfa, 0x9d, 0x5c, 0x59, 0x3c, 0x3a, 0x3e, 0x44, 0x44, 0x3e, 0x3e, 0x43, + 0x50, 0x4c, 0x57, 0x73, 0x7d, 0x70, 0x25, 0x10, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xec, 0xec, 0xea, 0xef, 0xf2, 0xe6, 0xd6, 0xbf, 0xc4, 0xd3, 0xd8, + 0xbc, 0xd4, 0xb3, 0xd5, 0xd8, 0xc9, 0xc5, 0xc4, 0xe9, 0xf5, 0xed, 0xe9, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe5, 0xe7, 0xea, 0xe8, 0xd2, 0xbd, 0xe8, + 0xdb, 0x7c, 0xa0, 0xb2, 0x86, 0x78, 0x8e, 0x99, 0xc2, 0xcb, 0xe9, 0xcd, + 0xac, 0x9a, 0xb8, 0xea, 0xf1, 0xe7, 0xea, 0xed, 0xeb, 0xe9, 0xe9, 0xe8, + 0xea, 0xe6, 0xe1, 0xef, 0xbe, 0xaf, 0xba, 0xde, 0xd8, 0xf3, 0xfa, 0xe3, + 0xac, 0xb6, 0xc4, 0xc2, 0xca, 0xb9, 0x7d, 0x5e, 0x5f, 0x75, 0x7e, 0x80, + 0x83, 0x7a, 0x75, 0x80, 0x50, 0x66, 0x6d, 0x65, 0x64, 0x63, 0x57, 0x4c, + 0x67, 0x6a, 0x70, 0x77, 0x79, 0x77, 0x75, 0x74, 0x75, 0x7e, 0x80, 0x74, + 0x67, 0x62, 0x64, 0x65, 0x85, 0x7e, 0x76, 0x75, 0x76, 0x76, 0x6f, 0x69, + 0x75, 0x7c, 0x7f, 0x7d, 0x7f, 0x86, 0x8b, 0x8b, 0x7c, 0x7c, 0x81, 0x86, + 0x81, 0x72, 0x66, 0x63, 0x62, 0x63, 0x4d, 0x3c, 0x62, 0x9a, 0x95, 0x67, + 0x31, 0x1f, 0x15, 0x34, 0x4f, 0x62, 0x6f, 0x55, 0x54, 0x64, 0x63, 0x4f, + 0x5c, 0x7d, 0x86, 0x86, 0x7d, 0x4f, 0x43, 0x52, 0x6b, 0x76, 0x71, 0x87, + 0x9c, 0x84, 0xad, 0x51, 0x3f, 0x4d, 0x56, 0x55, 0x43, 0x5e, 0x87, 0x78, + 0x51, 0x37, 0x34, 0x5d, 0x8a, 0x82, 0x76, 0x65, 0x6a, 0x8c, 0x84, 0x4f, + 0x66, 0x7a, 0x63, 0x50, 0x6c, 0x73, 0x64, 0x6a, 0x5d, 0x48, 0x58, 0x9a, + 0xcb, 0xae, 0x5a, 0x1b, 0x3d, 0x3f, 0x2a, 0x2f, 0x9f, 0xc2, 0xc4, 0xcb, + 0xa2, 0xa1, 0xa9, 0xc6, 0xf1, 0x90, 0x47, 0x4c, 0x36, 0x31, 0x34, 0x3c, + 0x39, 0x30, 0x34, 0x41, 0x7e, 0x5e, 0x4f, 0x5b, 0x71, 0x75, 0x22, 0x03, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xee, 0xec, 0xea, 0xea, 0xed, 0xee, 0xea, 0xe5, + 0xcc, 0xc3, 0xc3, 0xd1, 0xa5, 0xb6, 0xa1, 0xc2, 0xe7, 0xcf, 0xcd, 0xca, + 0xed, 0xef, 0xe4, 0xe8, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe4, 0xe6, 0xe9, + 0xf0, 0xe2, 0xae, 0xb9, 0xe6, 0x88, 0xa0, 0xb3, 0x90, 0x75, 0x9b, 0xc9, + 0xbe, 0xaa, 0xa6, 0xbb, 0xc1, 0xba, 0xd3, 0xeb, 0xdd, 0xd1, 0xdc, 0xe3, + 0xe2, 0xe7, 0xe2, 0xe4, 0xe6, 0xe1, 0xec, 0xfc, 0xff, 0xc2, 0xaf, 0x73, + 0x25, 0xbc, 0xff, 0xe0, 0x9b, 0xb5, 0xae, 0xbc, 0xc8, 0x94, 0x63, 0x5b, + 0x78, 0x94, 0x9d, 0x8e, 0x7b, 0x6c, 0x73, 0x8f, 0x56, 0x6f, 0x83, 0x8d, + 0x8a, 0x74, 0x6d, 0x7f, 0x84, 0x6d, 0x5f, 0x6a, 0x79, 0x79, 0x6c, 0x61, + 0x6c, 0x67, 0x61, 0x64, 0x75, 0x84, 0x7e, 0x6f, 0x7f, 0x77, 0x6c, 0x67, + 0x69, 0x6f, 0x75, 0x79, 0x8b, 0x98, 0x9a, 0x8c, 0x81, 0x84, 0x8a, 0x8c, + 0x90, 0x88, 0x85, 0x88, 0x82, 0x75, 0x6f, 0x72, 0x7d, 0x65, 0x54, 0x4d, + 0x38, 0x22, 0x2e, 0x4d, 0x49, 0x59, 0x64, 0x7d, 0x74, 0x62, 0x6c, 0x54, + 0x4e, 0x57, 0x60, 0x4d, 0x61, 0x6b, 0x3b, 0x32, 0x4f, 0x3c, 0x7f, 0x97, + 0x7a, 0x8b, 0x96, 0x8a, 0x5b, 0x8a, 0xef, 0x7a, 0x4f, 0x54, 0x4f, 0x39, + 0x39, 0x53, 0x78, 0x71, 0x66, 0x5c, 0x3c, 0x38, 0x6f, 0x7c, 0x75, 0x5f, + 0x65, 0x7b, 0x66, 0x33, 0x6b, 0x52, 0x5c, 0x70, 0x65, 0x5b, 0x61, 0x62, + 0x53, 0x65, 0x39, 0x55, 0xa5, 0xdd, 0xcf, 0x56, 0x3c, 0x47, 0x37, 0x37, + 0x9c, 0xb3, 0xa7, 0xa3, 0xac, 0xa3, 0xa5, 0xbc, 0xf6, 0xad, 0x5f, 0x5b, + 0x5a, 0x54, 0x4b, 0x44, 0x3d, 0x37, 0x36, 0x38, 0x3b, 0x5d, 0x7b, 0x67, + 0x4a, 0x4a, 0x12, 0x12, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xf2, 0xec, 0xe9, 0xeb, + 0xea, 0xe7, 0xec, 0xf4, 0xdc, 0xc7, 0xac, 0xbe, 0xaa, 0xca, 0xb3, 0xc6, + 0xde, 0xb0, 0xc1, 0xd2, 0xec, 0xe7, 0xeb, 0xf5, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xec, 0xe9, + 0xe5, 0xe3, 0xe6, 0xe8, 0xeb, 0xe7, 0xcc, 0xad, 0xc7, 0x7b, 0xac, 0xbb, + 0x8f, 0x73, 0x80, 0xb0, 0xac, 0xe1, 0xc9, 0xcd, 0xd5, 0xe5, 0xe7, 0xe1, + 0xe6, 0xe8, 0xe3, 0xe0, 0xe1, 0xf2, 0xe8, 0xe7, 0xe9, 0xe4, 0xec, 0xe7, + 0xf7, 0xb3, 0x23, 0x41, 0x66, 0xcb, 0xfe, 0xe4, 0xa7, 0xb6, 0xae, 0xcd, + 0xb2, 0x66, 0x65, 0x63, 0x71, 0x78, 0x74, 0x78, 0x88, 0x86, 0x7a, 0x7a, + 0x4d, 0x86, 0x81, 0x75, 0x9a, 0x94, 0x6e, 0x72, 0x7c, 0x86, 0x82, 0x6e, + 0x68, 0x73, 0x78, 0x71, 0x74, 0x7e, 0x7e, 0x70, 0x65, 0x65, 0x68, 0x66, + 0x68, 0x6f, 0x77, 0x7b, 0x7a, 0x79, 0x7a, 0x7b, 0x83, 0x8b, 0x87, 0x77, + 0x71, 0x7d, 0x8a, 0x8e, 0x85, 0x80, 0x82, 0x89, 0x82, 0x6e, 0x61, 0x61, + 0x5f, 0x66, 0x67, 0x5a, 0x44, 0x37, 0x3a, 0x43, 0x51, 0x6e, 0x69, 0x68, + 0x60, 0x69, 0x76, 0x45, 0x33, 0x4a, 0x66, 0x46, 0x4e, 0x5a, 0x39, 0x5e, + 0x6f, 0x4f, 0x75, 0x8a, 0x85, 0x83, 0x6c, 0x6c, 0x7b, 0x9e, 0xda, 0x51, + 0x45, 0x49, 0x44, 0x55, 0x42, 0x40, 0x68, 0x5c, 0x3e, 0x57, 0x5a, 0x41, + 0x30, 0x3d, 0x6a, 0x7a, 0x65, 0x6b, 0x6e, 0x4b, 0x53, 0x6c, 0x6a, 0x5b, + 0x5f, 0x63, 0x5e, 0x61, 0x68, 0x6d, 0x59, 0x53, 0x74, 0xb4, 0xcd, 0x9d, + 0x65, 0x6a, 0x4b, 0x3d, 0x9a, 0xb4, 0xb0, 0xb0, 0xa1, 0xb7, 0xba, 0xb3, + 0xff, 0xe2, 0x69, 0x11, 0x2e, 0x3b, 0x3d, 0x33, 0x2e, 0x3a, 0x49, 0x4f, + 0x52, 0x70, 0x82, 0x5f, 0x4e, 0x63, 0x1e, 0x01, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xef, 0xf0, 0xe6, 0xe7, 0xf0, 0xf0, 0xf2, 0xe7, 0xe4, 0xc0, 0xbc, + 0xa5, 0xb4, 0xb7, 0x9d, 0xcf, 0xb3, 0xad, 0xc2, 0xe6, 0xe8, 0xf1, 0xef, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xe8, 0xeb, 0xf1, 0xed, 0xe2, 0xde, 0xe1, 0xe5, 0xdb, 0xd3, 0xd5, + 0xc1, 0x84, 0xad, 0xc9, 0x97, 0xa1, 0x9c, 0x97, 0x7d, 0xae, 0xbc, 0xcc, + 0xef, 0xea, 0xe5, 0xe4, 0xe6, 0xe8, 0xe7, 0xe5, 0xe7, 0xe8, 0xe6, 0xdd, + 0xea, 0xe3, 0xff, 0xea, 0xf6, 0xb8, 0x7e, 0x96, 0xcc, 0xf9, 0xff, 0xd8, + 0xa2, 0xb6, 0xc0, 0xbe, 0x71, 0x67, 0x5b, 0x75, 0x94, 0x9a, 0x90, 0x83, + 0x69, 0x62, 0x73, 0x61, 0x42, 0x74, 0x79, 0x87, 0x79, 0x8c, 0x7b, 0x8a, + 0x86, 0x76, 0x62, 0x57, 0x5d, 0x69, 0x6f, 0x6f, 0x6c, 0x69, 0x61, 0x61, + 0x74, 0x89, 0x86, 0x75, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x80, + 0x9c, 0x93, 0x85, 0x7a, 0x77, 0x7c, 0x85, 0x8c, 0x79, 0x76, 0x7c, 0x88, + 0x86, 0x77, 0x6d, 0x6f, 0x52, 0x62, 0x67, 0x50, 0x34, 0x38, 0x62, 0x8c, + 0x95, 0x8b, 0x5d, 0x51, 0x63, 0x71, 0x7b, 0x6e, 0x40, 0x4b, 0x46, 0x44, + 0x53, 0x5b, 0x5c, 0x66, 0x5f, 0x61, 0x7a, 0x7f, 0x7b, 0x75, 0x6f, 0x88, + 0x8d, 0x93, 0xbf, 0x70, 0x49, 0x53, 0x50, 0x53, 0x61, 0x37, 0x4f, 0x6a, + 0x57, 0x3a, 0x33, 0x54, 0x58, 0x43, 0x3e, 0x5e, 0x56, 0x3d, 0x20, 0x63, + 0x78, 0x65, 0x5e, 0x5c, 0x57, 0x61, 0x6b, 0x64, 0x65, 0x5b, 0x5e, 0x4c, + 0x4d, 0x7c, 0xb4, 0xe8, 0x89, 0x4b, 0x4f, 0x42, 0xa8, 0xcb, 0xb8, 0xcd, + 0xbf, 0xbd, 0xa9, 0xb5, 0xf1, 0xf1, 0x85, 0x13, 0x24, 0x3b, 0x33, 0x32, + 0x2e, 0x3d, 0x38, 0x45, 0x32, 0x3e, 0x52, 0x47, 0x57, 0x5d, 0x26, 0x0f, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xf3, 0xf1, 0xea, 0xe9, 0xe2, 0xec, 0xfb, 0xe3, + 0xf8, 0xdc, 0xbb, 0xb6, 0x8e, 0x91, 0x9e, 0x92, 0xd5, 0xc6, 0xa7, 0xb2, + 0xe7, 0xe7, 0xea, 0xea, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xe9, 0xea, 0xee, 0xed, 0xe6, 0xe1, 0xdf, + 0xed, 0xe0, 0xd2, 0xd4, 0xc5, 0x84, 0xa3, 0xcf, 0x84, 0x7b, 0x8b, 0xd0, + 0xa9, 0xb0, 0xe8, 0xe9, 0xe4, 0xe6, 0xe7, 0xe4, 0xe1, 0xe0, 0xe4, 0xe8, + 0xe1, 0xe6, 0xdf, 0xe8, 0xfd, 0xc4, 0xd3, 0xf3, 0xff, 0xb5, 0xa9, 0xd6, + 0xd3, 0xf9, 0xf8, 0xe1, 0xa4, 0xaf, 0xc5, 0x9e, 0x64, 0x5a, 0x65, 0x70, + 0x86, 0x77, 0x73, 0x8b, 0x83, 0x70, 0x7d, 0x78, 0x4c, 0xac, 0x78, 0x4a, + 0x69, 0x80, 0x59, 0x87, 0x79, 0x6a, 0x59, 0x55, 0x5f, 0x6c, 0x6f, 0x6d, + 0x6e, 0x65, 0x60, 0x6d, 0x87, 0x96, 0x8a, 0x74, 0x6f, 0x7a, 0x83, 0x80, + 0x74, 0x6c, 0x6d, 0x72, 0x87, 0x7f, 0x75, 0x6e, 0x6e, 0x71, 0x74, 0x75, + 0x73, 0x78, 0x88, 0x95, 0x8f, 0x78, 0x67, 0x63, 0x68, 0x5c, 0x50, 0x50, + 0x56, 0x55, 0x49, 0x3c, 0x46, 0x5b, 0x60, 0x6c, 0x71, 0x75, 0x82, 0x71, + 0x41, 0x6a, 0x5f, 0x34, 0x44, 0x76, 0x80, 0x6d, 0x5e, 0x3d, 0x73, 0x94, + 0x72, 0x69, 0x80, 0x97, 0x72, 0x75, 0x9b, 0x51, 0x33, 0x44, 0x45, 0x44, + 0x55, 0x37, 0x48, 0x50, 0x4b, 0x57, 0x61, 0x77, 0x5a, 0x39, 0x38, 0x72, + 0x82, 0x6a, 0x36, 0x60, 0x86, 0x75, 0x6b, 0x63, 0x58, 0x5f, 0x6c, 0x6b, + 0x60, 0x70, 0x62, 0x72, 0x70, 0x65, 0xa4, 0xdf, 0xb8, 0x6a, 0x39, 0x3a, + 0xa2, 0xb4, 0xa3, 0x9b, 0xb3, 0xb8, 0xad, 0xba, 0xe9, 0xe6, 0x8e, 0x37, + 0x3d, 0x33, 0x39, 0x62, 0x71, 0x8a, 0x7d, 0x68, 0x7d, 0x7d, 0x72, 0x66, + 0x95, 0x91, 0x2e, 0x06, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xf0, 0xe8, 0xf1, + 0xe1, 0xd8, 0xf1, 0xdd, 0xf0, 0xe5, 0xcf, 0xb9, 0xa0, 0xba, 0xb8, 0x8b, + 0xd0, 0xce, 0xa5, 0xa9, 0xd3, 0xc9, 0xde, 0xed, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xe9, + 0xec, 0xec, 0xe5, 0xdc, 0xe1, 0xf2, 0xd9, 0xb1, 0xa9, 0x8f, 0xa2, 0xc1, + 0x64, 0x8d, 0x9d, 0xcb, 0xb3, 0xaf, 0xe1, 0xce, 0xdd, 0xe0, 0xe4, 0xe4, + 0xe1, 0xdf, 0xe1, 0xe3, 0xdd, 0xec, 0xdd, 0xff, 0xd3, 0x5d, 0xc5, 0xff, + 0xff, 0xb4, 0x3a, 0x2d, 0x12, 0xa3, 0xff, 0xe0, 0xa9, 0xc7, 0xa9, 0x70, + 0x5f, 0x5f, 0x7b, 0x91, 0x84, 0x7b, 0x6e, 0x75, 0x74, 0x79, 0x87, 0x71, + 0x92, 0x6e, 0x48, 0x74, 0x8f, 0x7e, 0x60, 0x86, 0x76, 0x6c, 0x5f, 0x55, + 0x51, 0x55, 0x5e, 0x66, 0x66, 0x5a, 0x59, 0x6a, 0x7a, 0x77, 0x65, 0x55, + 0x67, 0x75, 0x84, 0x87, 0x7e, 0x74, 0x6f, 0x70, 0x70, 0x6b, 0x68, 0x6c, + 0x77, 0x7f, 0x81, 0x80, 0x7b, 0x7a, 0x79, 0x74, 0x64, 0x52, 0x4c, 0x4f, + 0x6e, 0x6a, 0x61, 0x54, 0x47, 0x3d, 0x3a, 0x3a, 0x4b, 0x5d, 0x6f, 0x7a, + 0x64, 0x60, 0x72, 0x59, 0x43, 0x54, 0x4f, 0x45, 0x4f, 0x55, 0x50, 0x51, + 0x74, 0x57, 0x6b, 0x82, 0x84, 0x7d, 0x7b, 0x96, 0x85, 0x5f, 0x81, 0x6f, + 0x64, 0x4a, 0x35, 0x39, 0x41, 0x45, 0x68, 0x69, 0x64, 0x72, 0x5c, 0x43, + 0x57, 0x52, 0x51, 0x61, 0x5d, 0x69, 0x59, 0x85, 0x63, 0x66, 0x73, 0x79, + 0x70, 0x68, 0x63, 0x59, 0x57, 0x5e, 0x61, 0x65, 0x66, 0x51, 0x60, 0xa4, + 0xd5, 0xa7, 0x34, 0x1d, 0xa1, 0xcf, 0xc6, 0xb6, 0xbc, 0xbf, 0xae, 0xb4, + 0xe1, 0xee, 0xbc, 0x87, 0x9a, 0xa1, 0x9b, 0x93, 0x74, 0x7d, 0x6e, 0x55, + 0x67, 0x71, 0x68, 0x43, 0x4f, 0x4b, 0x14, 0x17, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf5, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, + 0xe2, 0xea, 0xe1, 0xed, 0xe7, 0xd0, 0xd9, 0xda, 0xe3, 0xdd, 0xcb, 0xae, + 0xa2, 0xc0, 0xbc, 0x8b, 0xc0, 0xc7, 0xaa, 0xb8, 0xd4, 0xc2, 0xe8, 0xf8, + 0xe9, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xe9, 0xe6, 0xeb, 0xf0, 0xe8, 0xdb, 0xe5, 0xe5, 0xd8, 0xd5, + 0xd4, 0x9c, 0x90, 0xd2, 0x5b, 0x3f, 0x8a, 0xef, 0xcc, 0xa3, 0xe1, 0xec, + 0xeb, 0xe4, 0xdc, 0xd9, 0xdc, 0xe1, 0xe4, 0xe4, 0xe1, 0xe3, 0xff, 0xce, + 0x50, 0x4d, 0xe8, 0xf8, 0xfb, 0xcf, 0x30, 0x5c, 0x7e, 0xe6, 0xf9, 0xda, + 0xa6, 0xc8, 0x85, 0x71, 0x6b, 0x70, 0x76, 0x78, 0x69, 0x7f, 0x8a, 0x91, + 0x7e, 0x64, 0x49, 0x0f, 0x2f, 0x76, 0x8f, 0x86, 0x85, 0x85, 0x76, 0x7a, + 0x7c, 0x71, 0x63, 0x59, 0x53, 0x53, 0x5f, 0x6c, 0x75, 0x65, 0x5e, 0x64, + 0x64, 0x5b, 0x5d, 0x68, 0x79, 0x73, 0x6c, 0x69, 0x6b, 0x6c, 0x6b, 0x68, + 0x6b, 0x66, 0x65, 0x6e, 0x7f, 0x8c, 0x91, 0x90, 0x85, 0x7f, 0x74, 0x64, + 0x57, 0x56, 0x63, 0x72, 0x6c, 0x6c, 0x67, 0x5a, 0x49, 0x3f, 0x3e, 0x40, + 0x46, 0x4c, 0x63, 0x77, 0x64, 0x6d, 0x89, 0x67, 0x54, 0x5f, 0x55, 0x4b, + 0x5a, 0x67, 0x6d, 0x77, 0x74, 0x72, 0x7a, 0x77, 0x87, 0x90, 0x82, 0x8e, + 0x85, 0x6e, 0x75, 0x49, 0x54, 0x6a, 0x5e, 0x36, 0x42, 0x45, 0x5f, 0x55, + 0x50, 0x65, 0x52, 0x34, 0x3f, 0x55, 0x4f, 0x3c, 0x41, 0x84, 0x7a, 0x75, + 0x7b, 0x69, 0x5b, 0x5f, 0x6c, 0x74, 0x6c, 0x5e, 0x60, 0x5f, 0x65, 0x5b, + 0x65, 0x6a, 0x5c, 0x7a, 0xbb, 0xf2, 0x94, 0x31, 0x80, 0xb3, 0xa4, 0xb6, + 0xae, 0xa7, 0xb4, 0xda, 0xd9, 0x95, 0x5e, 0x63, 0x1b, 0x2f, 0x28, 0x33, + 0x3b, 0x47, 0x2e, 0x26, 0x40, 0x4d, 0x6f, 0x62, 0x53, 0x48, 0x1b, 0x0f, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf3, 0xf4, 0xf4, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xf0, 0xef, 0xef, 0xee, + 0xed, 0xed, 0xec, 0xec, 0xed, 0xe5, 0xdd, 0xde, 0xe3, 0xdf, 0xd4, 0xd0, + 0xd7, 0xf0, 0xec, 0xaf, 0x8a, 0xb6, 0xc7, 0x7c, 0xb2, 0xc5, 0xa1, 0xa1, + 0xc5, 0xc3, 0xec, 0xfb, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xeb, 0xeb, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xed, 0xed, 0xe9, 0xe5, 0xea, 0xf1, 0xea, 0xde, + 0xe1, 0xe0, 0xd2, 0xc8, 0xd0, 0xb6, 0xa8, 0xf9, 0x8d, 0x5c, 0x8b, 0xbb, + 0x92, 0x77, 0xd9, 0xe5, 0xe8, 0xe5, 0xe2, 0xe2, 0xe5, 0xe5, 0xe2, 0xdf, + 0xe6, 0xf0, 0xcf, 0x8d, 0x6f, 0x7c, 0xe2, 0xf5, 0xfe, 0xd9, 0x7b, 0xad, + 0xb2, 0xfc, 0xf0, 0xf2, 0xcb, 0x9c, 0x69, 0x66, 0x64, 0x86, 0x95, 0x88, + 0x84, 0x79, 0x74, 0x83, 0x71, 0x5d, 0x6e, 0x6d, 0x70, 0x6e, 0x6d, 0x7d, + 0x9d, 0x8f, 0x7a, 0x7a, 0x6e, 0x68, 0x69, 0x72, 0x74, 0x6b, 0x61, 0x60, + 0x5a, 0x59, 0x67, 0x7e, 0x7f, 0x70, 0x70, 0x7d, 0x70, 0x6b, 0x67, 0x6a, + 0x72, 0x76, 0x73, 0x6f, 0x75, 0x6e, 0x68, 0x6a, 0x73, 0x7d, 0x83, 0x85, + 0x81, 0x80, 0x7a, 0x6d, 0x63, 0x62, 0x67, 0x6c, 0x70, 0x69, 0x5d, 0x51, + 0x48, 0x44, 0x45, 0x47, 0x43, 0x53, 0x74, 0x8a, 0x6d, 0x65, 0x70, 0x44, + 0x5a, 0x5e, 0x50, 0x45, 0x4e, 0x52, 0x53, 0x5f, 0x3f, 0x4f, 0x94, 0x98, + 0x68, 0x6e, 0x85, 0x8b, 0x84, 0x59, 0x58, 0x43, 0x45, 0x3e, 0x46, 0x43, + 0x5d, 0x5d, 0x7d, 0x7c, 0x6f, 0x71, 0x56, 0x3e, 0x56, 0x70, 0x68, 0x3e, + 0x29, 0x6a, 0x63, 0x52, 0x6d, 0x79, 0x7f, 0x79, 0x6d, 0x63, 0x63, 0x69, + 0x68, 0x71, 0x60, 0x66, 0x6d, 0x69, 0x6d, 0x53, 0x86, 0xc8, 0xb7, 0x5b, + 0x75, 0xc1, 0xb2, 0xd0, 0xaa, 0xc6, 0xa8, 0x79, 0x92, 0xbc, 0xa0, 0x63, + 0x6a, 0xb6, 0xa7, 0x63, 0x4e, 0x81, 0x6e, 0x3e, 0x49, 0x42, 0x5a, 0x50, + 0x45, 0x42, 0x1b, 0x0d, 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, 0xef, + 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf0, 0xef, 0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xf4, 0xe8, 0xeb, 0xdd, + 0xce, 0xda, 0xdb, 0xcb, 0xda, 0xd2, 0xd6, 0xc1, 0x91, 0x95, 0xc3, 0x92, + 0x98, 0xd2, 0xac, 0x89, 0xb0, 0xb3, 0xce, 0xe8, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xeb, 0xec, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xee, 0xec, 0xe9, 0xe7, + 0xeb, 0xee, 0xea, 0xe3, 0xe7, 0xe1, 0xd9, 0xcb, 0xc8, 0xb6, 0x96, 0xe4, + 0x9d, 0x87, 0xba, 0xff, 0xee, 0x8d, 0xce, 0xd5, 0xe1, 0xe5, 0xea, 0xea, + 0xe6, 0xe4, 0xe4, 0xe5, 0xfb, 0xe8, 0x63, 0x4e, 0x81, 0x79, 0xe4, 0xfc, + 0xf9, 0xd5, 0x86, 0x9c, 0x87, 0xca, 0xf1, 0xff, 0xcb, 0x68, 0x6b, 0x5a, + 0x77, 0x87, 0x7a, 0x72, 0x8c, 0x8b, 0x85, 0x87, 0x73, 0x69, 0x80, 0x7d, + 0x69, 0x74, 0x83, 0x76, 0x82, 0x78, 0x78, 0x6c, 0x67, 0x5f, 0x5f, 0x67, + 0x67, 0x63, 0x6c, 0x7c, 0x7b, 0x6d, 0x68, 0x6f, 0x6d, 0x63, 0x68, 0x78, + 0x61, 0x62, 0x63, 0x62, 0x60, 0x60, 0x62, 0x64, 0x79, 0x76, 0x71, 0x6d, + 0x6d, 0x72, 0x7a, 0x7f, 0x8a, 0x8b, 0x85, 0x79, 0x71, 0x6d, 0x65, 0x5c, + 0x67, 0x68, 0x61, 0x4e, 0x3a, 0x36, 0x44, 0x53, 0x2c, 0x4f, 0x74, 0x86, + 0x69, 0x5a, 0x66, 0x4c, 0x42, 0x49, 0x47, 0x4d, 0x5c, 0x5c, 0x5b, 0x68, + 0x6e, 0x4e, 0x6a, 0x8e, 0x9d, 0x9c, 0x77, 0x5a, 0x4e, 0x66, 0x79, 0x47, + 0x39, 0x4a, 0x6b, 0x59, 0x60, 0x56, 0x6f, 0x67, 0x50, 0x4e, 0x42, 0x41, + 0x3c, 0x48, 0x57, 0x51, 0x39, 0x6c, 0x77, 0x88, 0x7b, 0x75, 0x68, 0x64, + 0x6e, 0x6f, 0x67, 0x64, 0x62, 0x61, 0x64, 0x6d, 0x6c, 0x66, 0x60, 0x4f, + 0x5c, 0x82, 0xd1, 0xc2, 0x99, 0xc2, 0xa0, 0xa3, 0xbc, 0xbd, 0xbe, 0xd9, + 0xfc, 0xe7, 0xa5, 0x77, 0x8a, 0x82, 0x6a, 0x53, 0x2e, 0x3c, 0x39, 0x2c, + 0x32, 0x3d, 0x56, 0x4b, 0x49, 0x3a, 0x0b, 0x0f, 0xf5, 0xf5, 0xf4, 0xf2, + 0xf1, 0xf0, 0xef, 0xee, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe7, 0xe7, 0xe6, + 0xeb, 0xec, 0xf1, 0xe8, 0xc8, 0xbe, 0xcb, 0xc5, 0xd5, 0xda, 0xcb, 0xb5, + 0x94, 0x89, 0xc8, 0xac, 0x7f, 0xca, 0xbf, 0x9d, 0xbb, 0xb1, 0xbb, 0xe0, + 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xeb, 0xec, 0xec, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xeb, 0xe9, 0xeb, 0xeb, 0xe9, 0xe8, 0xea, 0xd4, 0xeb, 0xe5, 0xae, + 0xa6, 0xd0, 0xb3, 0xdd, 0x91, 0x59, 0xa8, 0xf1, 0xdc, 0x88, 0xda, 0xd8, + 0xe6, 0xe5, 0xe1, 0xdc, 0xdb, 0xe2, 0xee, 0xf7, 0xd9, 0x66, 0x52, 0x73, + 0x6b, 0x6b, 0xd9, 0xf7, 0xf6, 0xdb, 0x91, 0xc8, 0xf0, 0xe7, 0xe9, 0xff, + 0xb2, 0x5a, 0x6b, 0x65, 0x90, 0x8c, 0x75, 0x80, 0x6c, 0x7c, 0x79, 0x74, + 0x67, 0x6b, 0x77, 0x59, 0x64, 0x8c, 0x8b, 0x70, 0x95, 0x5e, 0x40, 0x59, + 0x7d, 0x6e, 0x69, 0x72, 0x74, 0x6c, 0x6b, 0x73, 0x66, 0x64, 0x6a, 0x71, + 0x6e, 0x67, 0x6d, 0x7a, 0x8d, 0x81, 0x6f, 0x60, 0x5a, 0x5c, 0x65, 0x6b, + 0x7b, 0x7f, 0x80, 0x79, 0x6f, 0x6b, 0x71, 0x78, 0x88, 0x88, 0x82, 0x7d, + 0x83, 0x8a, 0x83, 0x75, 0x5c, 0x5e, 0x5e, 0x56, 0x4c, 0x46, 0x48, 0x4d, + 0x44, 0x64, 0x6f, 0x72, 0x61, 0x55, 0x60, 0x54, 0x48, 0x5e, 0x50, 0x34, + 0x41, 0x5e, 0x66, 0x62, 0x51, 0x50, 0x5a, 0x5d, 0x66, 0x5b, 0x3e, 0x4d, + 0x4b, 0x47, 0x5c, 0x56, 0x4f, 0x48, 0x84, 0xa3, 0x32, 0x42, 0x76, 0x79, + 0x60, 0x59, 0x49, 0x43, 0x48, 0x2d, 0x36, 0x5a, 0x66, 0x93, 0x7a, 0x67, + 0x6d, 0x6d, 0x62, 0x5f, 0x6a, 0x6b, 0x64, 0x68, 0x63, 0x5a, 0x6a, 0x64, + 0x68, 0x6d, 0x56, 0x65, 0x45, 0x77, 0xc6, 0xe1, 0xb2, 0xd8, 0xe6, 0xff, + 0xff, 0xfc, 0xd0, 0x9b, 0x6f, 0x44, 0x32, 0x3f, 0x2f, 0x36, 0x3e, 0x43, + 0x1d, 0x21, 0x30, 0x43, 0x3a, 0x38, 0x4b, 0x46, 0x4b, 0x41, 0x13, 0x12, + 0xf5, 0xf5, 0xf4, 0xf2, 0xf1, 0xef, 0xee, 0xee, 0xe8, 0xe9, 0xea, 0xeb, + 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe8, 0xe6, + 0xe5, 0xe4, 0xe3, 0xe2, 0xe5, 0xec, 0xe2, 0xef, 0xd9, 0xab, 0xb0, 0xb7, + 0xcd, 0xf1, 0xd7, 0xc2, 0xa6, 0x6e, 0xa1, 0xae, 0x7f, 0xa9, 0xa6, 0x96, + 0xb7, 0xb3, 0xc7, 0xf7, 0xe5, 0xe5, 0xe6, 0xe8, 0xe9, 0xeb, 0xec, 0xec, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xef, 0xe9, 0xe9, 0xed, 0xeb, 0xe6, 0xe7, 0xee, + 0xdd, 0xdd, 0xdf, 0xbb, 0xa7, 0xb5, 0x88, 0xbb, 0x72, 0x4a, 0xb5, 0xeb, + 0xf7, 0xa6, 0xc4, 0xd8, 0xd9, 0xd9, 0xdb, 0xe2, 0xea, 0xee, 0xee, 0xeb, + 0x6a, 0x59, 0x84, 0x94, 0x7e, 0x93, 0xfc, 0xf7, 0xe7, 0xd7, 0xcf, 0xc3, + 0xcc, 0xf3, 0xff, 0xfc, 0xae, 0x63, 0x60, 0x7b, 0x7d, 0x7c, 0x81, 0x86, + 0x93, 0x82, 0x75, 0x83, 0x78, 0x65, 0x68, 0x55, 0x77, 0x33, 0x39, 0x58, + 0x97, 0xb6, 0xf8, 0xff, 0xff, 0xbd, 0x79, 0x67, 0x71, 0x6f, 0x63, 0x5a, + 0x53, 0x61, 0x72, 0x75, 0x66, 0x57, 0x5d, 0x6b, 0x70, 0x6a, 0x69, 0x72, + 0x7f, 0x83, 0x79, 0x6d, 0x83, 0x8b, 0x8e, 0x81, 0x6b, 0x5b, 0x59, 0x5e, + 0x5d, 0x5e, 0x5c, 0x5d, 0x69, 0x72, 0x64, 0x4d, 0x60, 0x62, 0x5e, 0x51, + 0x44, 0x48, 0x5b, 0x6e, 0x6d, 0x81, 0x72, 0x6d, 0x6b, 0x5d, 0x54, 0x41, + 0x43, 0x3b, 0x37, 0x49, 0x59, 0x4e, 0x51, 0x6f, 0x5e, 0x4a, 0x58, 0x43, + 0x2f, 0x52, 0x64, 0x5a, 0x47, 0x40, 0x51, 0x51, 0x4d, 0x38, 0x5b, 0x61, + 0x53, 0x60, 0x81, 0x67, 0x42, 0x47, 0x4a, 0x4d, 0x5b, 0x3b, 0x33, 0x41, + 0x49, 0x88, 0x7d, 0x68, 0x70, 0x77, 0x6f, 0x6a, 0x70, 0x69, 0x5f, 0x64, + 0x64, 0x6e, 0x4c, 0x3e, 0x44, 0x34, 0x2e, 0x31, 0x5b, 0x99, 0x9f, 0xca, + 0xd0, 0xc1, 0x64, 0x2f, 0x1c, 0x13, 0x0b, 0x22, 0x47, 0x4c, 0x45, 0x50, + 0x4a, 0x49, 0x2f, 0x34, 0x38, 0x45, 0x3e, 0x4e, 0x4c, 0x37, 0x54, 0x4d, + 0x35, 0x31, 0x19, 0x12, 0xfb, 0xf6, 0xf7, 0xe5, 0xf0, 0xea, 0xec, 0xf3, + 0xef, 0xe9, 0xf4, 0xf7, 0xec, 0xe5, 0xe7, 0xf2, 0xe8, 0xe8, 0xe9, 0xea, + 0xea, 0xeb, 0xec, 0xec, 0xf1, 0xf1, 0xf0, 0xef, 0xef, 0xee, 0xed, 0xed, + 0xef, 0xf0, 0xf1, 0xf1, 0xf0, 0xed, 0xeb, 0xe9, 0xed, 0xec, 0xec, 0xec, + 0xec, 0xeb, 0xeb, 0xeb, 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xec, 0xeb, + 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xf4, 0xed, 0xe8, 0xe9, 0xeb, 0xe9, 0xe7, 0xe8, + 0xde, 0xde, 0xea, 0xea, 0xd6, 0xde, 0xd2, 0xe0, 0xdf, 0xdf, 0xe3, 0xe8, + 0xe0, 0xbe, 0xac, 0xc0, 0xcc, 0xc4, 0xfc, 0xde, 0xb9, 0x95, 0x92, 0x87, + 0x95, 0xab, 0xae, 0x8b, 0xc4, 0xbc, 0xc8, 0xd8, 0xe1, 0xee, 0xef, 0xed, + 0xf4, 0xed, 0xe6, 0xef, 0xe4, 0xdb, 0xe3, 0xef, 0xec, 0xe7, 0xea, 0xeb, + 0xf4, 0xeb, 0xef, 0xf1, 0xe7, 0xea, 0xf0, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe7, 0xc9, 0xea, 0xeb, 0xdd, 0xaf, 0x7b, 0xf4, + 0xaa, 0x2c, 0xa8, 0xfb, 0xee, 0xb2, 0xc9, 0xef, 0xf5, 0xd3, 0xdd, 0xe8, + 0xdf, 0xf0, 0xd6, 0x7b, 0x79, 0x92, 0x98, 0x77, 0x78, 0xc2, 0xf3, 0xde, + 0xd0, 0xec, 0xf6, 0xf8, 0xff, 0xe0, 0x91, 0x50, 0x58, 0x73, 0x78, 0x90, + 0x8d, 0x78, 0x81, 0x74, 0x7f, 0x75, 0x7d, 0x55, 0x37, 0x25, 0x1c, 0x5f, + 0xab, 0xff, 0xfd, 0xff, 0xd8, 0xa0, 0xe9, 0xa3, 0x5e, 0x5d, 0x5d, 0x63, + 0x6d, 0x6f, 0x62, 0x52, 0x69, 0x64, 0x6f, 0x86, 0x8d, 0x7d, 0x6c, 0x68, + 0x61, 0x5d, 0x65, 0x7b, 0x88, 0x82, 0x76, 0x6f, 0x68, 0x63, 0x66, 0x70, + 0x73, 0x6f, 0x70, 0x77, 0x68, 0x54, 0x49, 0x55, 0x67, 0x6c, 0x67, 0x61, + 0x5b, 0x5f, 0x5a, 0x4f, 0x46, 0x41, 0x51, 0x6c, 0x48, 0x4b, 0x74, 0x72, + 0x66, 0x69, 0x4e, 0x45, 0x3b, 0x30, 0x4b, 0x6f, 0x72, 0x6c, 0x60, 0x49, + 0x56, 0x61, 0x5c, 0x58, 0x38, 0x34, 0x65, 0x6b, 0x5f, 0x39, 0x35, 0x3a, + 0x32, 0x4c, 0x64, 0x53, 0x32, 0x26, 0x66, 0x7b, 0x31, 0x55, 0x44, 0x2f, + 0x43, 0x64, 0x7a, 0x79, 0x7b, 0x94, 0x7e, 0x6b, 0x71, 0x78, 0x76, 0x6b, + 0x62, 0x5e, 0x57, 0x4e, 0x3f, 0x37, 0x46, 0x7e, 0xc6, 0xf6, 0xfd, 0xf3, + 0xe5, 0x9d, 0x67, 0xab, 0xdb, 0xc5, 0x82, 0x00, 0x21, 0x3b, 0x35, 0x39, + 0x37, 0x32, 0x42, 0x36, 0x38, 0x34, 0x3b, 0x42, 0x37, 0x28, 0x32, 0x4c, + 0x54, 0x53, 0x4e, 0x5f, 0x4e, 0x40, 0x1f, 0x14, 0xfb, 0xea, 0xed, 0xee, + 0xf3, 0xe3, 0xeb, 0xe3, 0xef, 0xf2, 0xe4, 0xdf, 0xe8, 0xec, 0xed, 0xef, + 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe5, 0xe5, 0xe5, 0xeb, 0xec, 0xee, 0xef, 0xf0, 0xef, 0xed, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xf0, 0xf0, 0xef, 0xee, + 0xed, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xf2, 0xe5, 0xe9, 0xef, + 0xe8, 0xe9, 0xe7, 0xd7, 0xe9, 0xeb, 0xdf, 0xe3, 0xc7, 0xd6, 0xed, 0xe1, + 0xe6, 0xb8, 0xe7, 0xe6, 0xc6, 0xcb, 0xae, 0x9c, 0x95, 0xce, 0xdb, 0xde, + 0xd7, 0x8e, 0x7f, 0x94, 0x8e, 0x9e, 0xc4, 0x93, 0xb7, 0xb7, 0xb3, 0xc3, + 0xf0, 0xee, 0xed, 0xeb, 0xe7, 0xe7, 0xeb, 0xeb, 0xed, 0xe1, 0xe4, 0xee, + 0xea, 0xe8, 0xeb, 0xea, 0xed, 0xe6, 0xeb, 0xee, 0xe7, 0xeb, 0xf1, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xeb, 0xd3, 0xea, 0xe9, + 0xd7, 0xb3, 0x4c, 0x7c, 0xab, 0x53, 0xad, 0xf8, 0xff, 0xb0, 0xbf, 0xea, + 0xe8, 0xff, 0xdc, 0xd7, 0xff, 0xdc, 0x71, 0x54, 0x69, 0x89, 0x9e, 0x86, + 0x7d, 0xbf, 0xff, 0xff, 0xf7, 0xea, 0xa6, 0x60, 0x5d, 0x72, 0x64, 0x49, + 0x46, 0x5c, 0x75, 0x77, 0x7b, 0x84, 0x7b, 0x6f, 0x5f, 0x40, 0x31, 0x7c, + 0xd2, 0xf3, 0xff, 0xf2, 0xff, 0xfa, 0xd1, 0x7a, 0x64, 0x45, 0x21, 0x00, + 0x14, 0x35, 0x5e, 0x73, 0x75, 0x6f, 0x6d, 0x6e, 0x80, 0x81, 0x88, 0x8c, + 0x7e, 0x6c, 0x6c, 0x79, 0x7f, 0x6a, 0x62, 0x74, 0x88, 0x86, 0x74, 0x65, + 0x5b, 0x5b, 0x65, 0x74, 0x76, 0x6b, 0x64, 0x65, 0x6b, 0x62, 0x5f, 0x68, + 0x6c, 0x64, 0x58, 0x52, 0x60, 0x62, 0x54, 0x4a, 0x4b, 0x40, 0x36, 0x3e, + 0x47, 0x34, 0x38, 0x5a, 0x77, 0x5c, 0x3c, 0x56, 0x3e, 0x30, 0x2b, 0x2a, + 0x37, 0x5d, 0x69, 0x4d, 0x63, 0x60, 0x53, 0x31, 0x46, 0x61, 0x43, 0x3e, + 0x3e, 0x3e, 0x5b, 0x5f, 0x39, 0x31, 0x3d, 0x31, 0x48, 0x29, 0x6b, 0x94, + 0x53, 0x60, 0x4e, 0x4d, 0x36, 0x50, 0x43, 0x43, 0x5a, 0x76, 0x7a, 0x71, + 0x75, 0x5c, 0x40, 0x38, 0x4c, 0x75, 0xa4, 0xc5, 0xee, 0xee, 0xed, 0xd2, + 0x8a, 0x39, 0x19, 0x22, 0x22, 0x24, 0x19, 0x4d, 0x93, 0xd5, 0xdf, 0x74, + 0x1a, 0x2a, 0x32, 0x32, 0x3d, 0x3d, 0x2e, 0x2d, 0x3e, 0x36, 0x39, 0x40, + 0x39, 0x2d, 0x35, 0x49, 0x38, 0x34, 0x2e, 0x43, 0x3c, 0x36, 0x1a, 0x11, + 0xf9, 0xf2, 0xee, 0xe2, 0xe0, 0xec, 0xff, 0xcb, 0xf0, 0xf3, 0xe7, 0xf3, + 0xf0, 0xe0, 0xea, 0xe7, 0xe6, 0xe7, 0xe7, 0xe8, 0xe9, 0xe9, 0xea, 0xea, + 0xe9, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe7, 0xe8, 0xeb, 0xee, + 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xef, 0xee, 0xee, 0xed, 0xed, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf0, 0xdc, 0xe5, 0xee, 0xda, 0xd7, 0xe4, 0xe1, 0xf6, 0xe8, 0xd3, 0xd2, + 0xb5, 0xd7, 0xf7, 0xdd, 0xd9, 0xab, 0xce, 0xe7, 0xba, 0xbc, 0xde, 0xd8, + 0xaf, 0xdd, 0xc6, 0xd8, 0xe8, 0xbd, 0x95, 0xa2, 0xb5, 0x8a, 0x90, 0x81, + 0xaa, 0xa7, 0xce, 0xed, 0xf4, 0xe7, 0xe9, 0xeb, 0xe1, 0xe7, 0xef, 0xe5, + 0xec, 0xdf, 0xe0, 0xe8, 0xe9, 0xeb, 0xed, 0xe8, 0xea, 0xe6, 0xea, 0xec, + 0xe7, 0xe9, 0xed, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xef, 0xdf, 0xe3, 0xe4, 0xd7, 0xe3, 0x90, 0xbd, 0x72, 0x37, 0x88, 0xe1, + 0xff, 0xae, 0xc1, 0xdd, 0xf0, 0xe9, 0xe7, 0xeb, 0xc6, 0x76, 0x5b, 0x85, + 0x80, 0x85, 0x82, 0x6a, 0x67, 0x93, 0x9f, 0x76, 0x6a, 0x62, 0x4b, 0x36, + 0x22, 0x0b, 0x16, 0x3c, 0x68, 0x68, 0x89, 0x73, 0x4c, 0x40, 0x46, 0x80, + 0xde, 0xfd, 0xf1, 0xf1, 0xfb, 0xfc, 0xdf, 0x8e, 0x24, 0x00, 0x0d, 0x0e, + 0x5c, 0x5d, 0x35, 0x6c, 0x5d, 0x5e, 0x60, 0x62, 0x65, 0x6e, 0x80, 0x90, + 0xa3, 0x95, 0x88, 0x83, 0x7c, 0x73, 0x71, 0x75, 0x6c, 0x62, 0x62, 0x70, + 0x7b, 0x7c, 0x7c, 0x7f, 0x7f, 0x78, 0x76, 0x7a, 0x77, 0x6d, 0x69, 0x6d, + 0x7a, 0x71, 0x6b, 0x6a, 0x65, 0x5b, 0x57, 0x5a, 0x5a, 0x53, 0x4b, 0x4b, + 0x44, 0x2b, 0x24, 0x39, 0x48, 0x5e, 0x68, 0x67, 0x56, 0x52, 0x5b, 0x4b, + 0x43, 0x2b, 0x21, 0x29, 0x38, 0x56, 0x74, 0x7d, 0x81, 0x5f, 0x42, 0x27, + 0x3c, 0x50, 0x42, 0x5c, 0x4a, 0x34, 0x3e, 0x51, 0x52, 0x58, 0x4e, 0x2a, + 0x4a, 0x2f, 0x74, 0x91, 0x4f, 0x52, 0x4e, 0x5e, 0x3f, 0x40, 0x34, 0x51, + 0x84, 0xa3, 0x9d, 0x60, 0x6d, 0xb2, 0xec, 0xf8, 0xf5, 0xe5, 0xab, 0x67, + 0x2d, 0x19, 0x15, 0x28, 0x33, 0x29, 0x22, 0x26, 0x24, 0x2d, 0x25, 0x3c, + 0x5b, 0x9b, 0xdf, 0xc5, 0x43, 0x23, 0x33, 0x38, 0x38, 0x38, 0x26, 0x3a, + 0x3d, 0x35, 0x37, 0x40, 0x3a, 0x28, 0x20, 0x25, 0x29, 0x29, 0x2b, 0x4b, + 0x4c, 0x44, 0x1c, 0x09, 0xe8, 0xe1, 0xdf, 0xe2, 0xe6, 0xee, 0xe7, 0x73, + 0x96, 0xe5, 0xeb, 0xe3, 0xe2, 0xdf, 0xf0, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, + 0xe7, 0xe8, 0xe8, 0xe9, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, 0xe7, 0xe7, + 0xe7, 0xe8, 0xeb, 0xed, 0xed, 0xed, 0xec, 0xeb, 0xed, 0xed, 0xee, 0xee, + 0xef, 0xef, 0xf0, 0xf0, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe8, 0xe5, 0xe0, 0xc7, 0xab, 0xb6, 0xd9, 0xec, + 0xf5, 0xe7, 0xec, 0xda, 0xb4, 0xd6, 0xe5, 0xe8, 0xd6, 0xdc, 0xc6, 0xb8, + 0xb5, 0xd4, 0xfd, 0xed, 0x82, 0x88, 0xad, 0xcb, 0xaf, 0xba, 0x8c, 0x77, + 0xb3, 0x94, 0x83, 0x97, 0xb2, 0x95, 0xe5, 0xe8, 0xea, 0xe3, 0xe6, 0xea, + 0xe7, 0xea, 0xea, 0xe2, 0xe1, 0xd8, 0xdc, 0xe6, 0xe9, 0xee, 0xee, 0xe4, + 0xed, 0xec, 0xed, 0xed, 0xea, 0xe9, 0xe8, 0xe5, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe2, 0xdf, 0xdd, 0xec, 0xdb, 0xdb, 0x79, 0xab, + 0x9f, 0x4a, 0x96, 0xe0, 0xe7, 0xae, 0xda, 0xe8, 0xdd, 0xd2, 0xff, 0xef, + 0x7b, 0x50, 0x79, 0x85, 0xa9, 0x74, 0x74, 0x9c, 0x9a, 0x78, 0x5a, 0x45, + 0x23, 0x22, 0x23, 0x44, 0x7a, 0x91, 0x89, 0x87, 0x66, 0x46, 0x5b, 0x96, + 0xe1, 0xff, 0xfd, 0xfc, 0xff, 0xeb, 0xac, 0x4c, 0x18, 0x0c, 0x06, 0x17, + 0x3b, 0x43, 0x45, 0x50, 0x90, 0x7e, 0x6a, 0x78, 0x78, 0x66, 0x5b, 0x64, + 0x78, 0x8d, 0xa2, 0xb1, 0xa3, 0x88, 0x6a, 0x5a, 0x5c, 0x65, 0x6f, 0x76, + 0x60, 0x60, 0x67, 0x6f, 0x6f, 0x6a, 0x70, 0x7b, 0x80, 0x75, 0x6f, 0x6f, + 0x6b, 0x64, 0x65, 0x6c, 0x7c, 0x71, 0x69, 0x68, 0x66, 0x60, 0x61, 0x66, + 0x6d, 0x54, 0x43, 0x42, 0x59, 0x82, 0x87, 0x65, 0x86, 0xa7, 0x8d, 0x63, + 0x37, 0x28, 0x4c, 0x52, 0x32, 0x3b, 0x56, 0x6b, 0x60, 0x4b, 0x4b, 0x57, + 0x51, 0x40, 0x3a, 0x66, 0x78, 0x70, 0x69, 0x39, 0x3a, 0x32, 0x3d, 0x44, + 0x3b, 0x3c, 0x3f, 0x31, 0x4e, 0x4e, 0x95, 0x88, 0x3f, 0x49, 0x55, 0x64, + 0x3a, 0x31, 0x43, 0x44, 0x5c, 0x8a, 0xa5, 0x73, 0x9d, 0x8e, 0x6c, 0x41, + 0x21, 0x19, 0x22, 0x2c, 0x23, 0x2c, 0x2f, 0x29, 0x27, 0x2e, 0x32, 0x31, + 0x17, 0x32, 0x2d, 0x20, 0x29, 0x74, 0xda, 0xec, 0xca, 0x50, 0x21, 0x34, + 0x45, 0x4c, 0x38, 0x28, 0x49, 0x38, 0x2b, 0x2e, 0x32, 0x33, 0x38, 0x41, + 0x48, 0x3e, 0x34, 0x4e, 0x4f, 0x4c, 0x27, 0x15, 0xed, 0xed, 0xe2, 0xd8, + 0xdd, 0xe9, 0xe2, 0x6c, 0x9c, 0xff, 0xf4, 0xd8, 0xe6, 0xdf, 0xe1, 0xe1, + 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe5, + 0xe5, 0xe4, 0xe3, 0xe3, 0xe9, 0xea, 0xeb, 0xec, 0xeb, 0xe9, 0xe7, 0xe5, + 0xeb, 0xec, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf0, 0xeb, 0xeb, 0xeb, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xed, 0xf0, 0xf1, + 0xd9, 0xaa, 0xa0, 0xc0, 0xf8, 0xea, 0xe7, 0xdf, 0xc7, 0xd1, 0xc1, 0xc3, + 0xea, 0xd3, 0xab, 0x9f, 0xdb, 0xf9, 0xdd, 0xe9, 0xc1, 0x72, 0x8b, 0xcb, + 0xb5, 0xda, 0xaa, 0x55, 0x72, 0x96, 0xad, 0xa1, 0xa0, 0x97, 0xf5, 0xe2, + 0xe7, 0xeb, 0xe6, 0xe3, 0xe8, 0xe4, 0xde, 0xe2, 0xe2, 0xde, 0xe5, 0xeb, + 0xeb, 0xed, 0xea, 0xdd, 0xe9, 0xec, 0xed, 0xee, 0xef, 0xed, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xf1, 0xea, 0xcf, 0xdf, + 0xe7, 0xeb, 0x7f, 0xa5, 0xbe, 0x5d, 0xb4, 0xe8, 0xd1, 0xa0, 0xd7, 0xed, + 0xf1, 0xff, 0xd1, 0x7e, 0x69, 0x84, 0x84, 0x6a, 0x70, 0x81, 0x93, 0x6c, + 0x1d, 0x07, 0x31, 0x53, 0x73, 0x93, 0x9a, 0x7b, 0x4e, 0x39, 0x62, 0xa7, + 0xf5, 0xff, 0xf2, 0xf8, 0xff, 0xf6, 0x9e, 0x26, 0x03, 0x23, 0x26, 0x21, + 0x32, 0x36, 0x45, 0x74, 0x73, 0x79, 0x6a, 0x70, 0x87, 0x6b, 0x7b, 0x60, + 0x79, 0x6c, 0x6b, 0x77, 0x7e, 0x7c, 0x81, 0x8c, 0x72, 0x79, 0x7a, 0x72, + 0x6a, 0x6c, 0x76, 0x7f, 0x5c, 0x58, 0x5d, 0x6e, 0x79, 0x78, 0x74, 0x76, + 0x77, 0x73, 0x76, 0x7f, 0x7e, 0x74, 0x70, 0x73, 0x72, 0x69, 0x67, 0x6f, + 0x73, 0x6b, 0x61, 0x5d, 0x54, 0x4a, 0x54, 0x4c, 0x4a, 0x9a, 0xe4, 0xdb, + 0xbb, 0xae, 0x91, 0x83, 0x65, 0x60, 0x67, 0x2c, 0x3e, 0x66, 0x80, 0x7a, + 0x6d, 0x65, 0x5c, 0x54, 0x7d, 0x82, 0x62, 0x46, 0x38, 0x4e, 0x67, 0x38, + 0x25, 0x40, 0x62, 0x65, 0x46, 0x35, 0x3c, 0x42, 0x4b, 0x52, 0x98, 0x76, + 0x36, 0x35, 0x37, 0x36, 0x43, 0x35, 0x43, 0x20, 0x4c, 0x7b, 0x8e, 0x7e, + 0x3e, 0x2a, 0x23, 0x2c, 0x2e, 0x23, 0x22, 0x2d, 0x24, 0x27, 0x21, 0x1c, + 0x26, 0x35, 0x32, 0x22, 0x23, 0x2a, 0x2a, 0x2a, 0x25, 0x45, 0x91, 0xc0, + 0xd8, 0x97, 0x4d, 0x45, 0x54, 0x5c, 0x6d, 0x66, 0x4a, 0x38, 0x26, 0x22, + 0x26, 0x28, 0x2b, 0x2e, 0x3b, 0x3a, 0x3d, 0x5e, 0x5d, 0x4e, 0x1b, 0x00, + 0xe7, 0xdf, 0xdf, 0xec, 0xf5, 0xce, 0x9d, 0x45, 0x64, 0xc0, 0xf4, 0xfa, + 0xe9, 0xdd, 0xe7, 0xde, 0xe2, 0xe2, 0xe3, 0xe3, 0xe4, 0xe5, 0xe5, 0xe6, + 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe5, 0xe9, 0xea, 0xeb, 0xeb, + 0xe9, 0xe7, 0xe4, 0xe2, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xee, 0xef, 0xef, + 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xee, 0xee, 0xed, 0xec, + 0xea, 0xe9, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xe9, 0xe5, 0xf5, 0xf4, 0xbf, 0xa0, 0xbb, 0xcf, 0xda, 0xd1, 0xe7, + 0xdc, 0xd4, 0xcf, 0xc6, 0xcd, 0xdf, 0xb3, 0x9a, 0xc4, 0xda, 0xcd, 0xc6, + 0xc9, 0x81, 0x74, 0xb7, 0xb4, 0xba, 0xb9, 0x76, 0x69, 0x7d, 0xb0, 0x84, + 0x88, 0xa5, 0xec, 0xf7, 0xee, 0xf5, 0xe7, 0xda, 0xdd, 0xd8, 0xd6, 0xe6, + 0xea, 0xeb, 0xf1, 0xef, 0xe6, 0xe7, 0xe6, 0xda, 0xe0, 0xe7, 0xe9, 0xeb, + 0xf2, 0xef, 0xea, 0xed, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe5, 0xee, 0xd9, 0xdb, 0xeb, 0xfb, 0x96, 0x9a, 0xbe, 0x6e, 0xc8, 0xf5, + 0xda, 0x9a, 0xc8, 0xef, 0xfd, 0xd7, 0x7c, 0x4e, 0x75, 0x91, 0x88, 0x8e, + 0x7c, 0x7f, 0x87, 0x7e, 0x7a, 0x95, 0x99, 0x73, 0x4d, 0x52, 0x77, 0xc7, + 0xff, 0xff, 0xf2, 0xff, 0xf5, 0xe9, 0x83, 0x24, 0x00, 0x12, 0x55, 0x58, + 0x79, 0xaa, 0x76, 0x65, 0x54, 0x3c, 0x74, 0x83, 0x5f, 0x5a, 0x80, 0x97, + 0x95, 0x87, 0xbb, 0xc3, 0xa7, 0x85, 0x6e, 0x73, 0x77, 0x69, 0x5d, 0x5c, + 0x43, 0x52, 0x5e, 0x62, 0x64, 0x68, 0x65, 0x5d, 0x53, 0x59, 0x69, 0x7a, + 0x7e, 0x7a, 0x80, 0x8c, 0x8b, 0x82, 0x7c, 0x7c, 0x77, 0x6c, 0x69, 0x6e, + 0x77, 0x6a, 0x64, 0x69, 0x6b, 0x65, 0x5c, 0x59, 0x5f, 0x47, 0x49, 0x4c, + 0x69, 0xbf, 0xd1, 0x7f, 0xa4, 0xd3, 0x8e, 0x43, 0x3d, 0x23, 0x26, 0x63, + 0x43, 0x52, 0x55, 0x56, 0x61, 0x61, 0x5c, 0x60, 0x50, 0x6a, 0x79, 0x51, + 0x41, 0x42, 0x30, 0x45, 0x30, 0x3a, 0x49, 0x4f, 0x49, 0x3e, 0x34, 0x2d, + 0x37, 0x3c, 0x8d, 0x7c, 0x5d, 0x58, 0x54, 0x4d, 0x59, 0x56, 0x56, 0x4c, + 0xa7, 0x9e, 0x87, 0x80, 0x56, 0x3d, 0x2a, 0x31, 0x42, 0x44, 0x33, 0x23, + 0x25, 0x29, 0x31, 0x38, 0x39, 0x39, 0x3d, 0x44, 0x59, 0x43, 0x48, 0x63, + 0x58, 0x3b, 0x4e, 0x7c, 0xb9, 0xce, 0x7a, 0x3f, 0x4b, 0x4f, 0x4b, 0x35, + 0x36, 0x31, 0x2f, 0x34, 0x3b, 0x3d, 0x39, 0x34, 0x3b, 0x39, 0x37, 0x53, + 0x50, 0x46, 0x1d, 0x09, 0xe9, 0xe5, 0xe4, 0xd2, 0xa7, 0x49, 0x32, 0x4e, + 0x5e, 0x33, 0x69, 0xdf, 0xff, 0xe7, 0xdb, 0xd6, 0xe1, 0xe1, 0xe2, 0xe2, + 0xe3, 0xe4, 0xe4, 0xe5, 0xe9, 0xe9, 0xe9, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, + 0xe5, 0xe6, 0xe8, 0xe9, 0xe9, 0xe7, 0xe5, 0xe4, 0xe5, 0xe6, 0xe7, 0xe9, + 0xea, 0xec, 0xed, 0xee, 0xe8, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xed, + 0xef, 0xef, 0xed, 0xec, 0xea, 0xe9, 0xe7, 0xe7, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe3, 0xf9, 0xf2, 0xdf, 0xe0, 0xd5, 0xb3, 0x99, + 0xb9, 0xdc, 0xee, 0xf9, 0xcd, 0xc3, 0xd3, 0xd3, 0xcd, 0xd9, 0xb5, 0xd1, + 0xe1, 0xc9, 0xed, 0xff, 0xad, 0x83, 0x66, 0x89, 0xc6, 0xd3, 0xc2, 0x79, + 0x85, 0x7e, 0xae, 0x83, 0x94, 0xa7, 0xcc, 0xe3, 0xe6, 0xeb, 0xe8, 0xdd, + 0xd4, 0xd3, 0xde, 0xec, 0xe6, 0xe9, 0xed, 0xe3, 0xd6, 0xdc, 0xe6, 0xe2, + 0xdf, 0xe9, 0xe7, 0xe7, 0xee, 0xe7, 0xde, 0xe1, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe3, 0xec, 0xea, 0xd5, 0xd0, 0xe9, 0xaa, 0x98, + 0xb3, 0x62, 0x9f, 0xdd, 0xe0, 0xa2, 0xdd, 0xff, 0xb3, 0x79, 0x6d, 0x8d, + 0x90, 0x7f, 0x7e, 0x85, 0x9d, 0x6f, 0x71, 0x86, 0x6f, 0x65, 0x9c, 0xdb, + 0xf6, 0xff, 0xff, 0xfe, 0xf7, 0xc3, 0x68, 0x26, 0x02, 0x0c, 0x17, 0x2f, + 0x47, 0x4d, 0x41, 0x29, 0x4d, 0x48, 0x28, 0x5a, 0x51, 0x39, 0x87, 0x88, + 0xa2, 0xb6, 0xde, 0xc7, 0xa1, 0x96, 0xc4, 0xb8, 0x97, 0x70, 0x5b, 0x6e, + 0x82, 0x7b, 0x6e, 0x6b, 0x6a, 0x67, 0x5d, 0x57, 0x64, 0x77, 0x79, 0x6d, + 0x66, 0x72, 0x81, 0x81, 0x6f, 0x63, 0x72, 0x8a, 0xa2, 0x92, 0x84, 0x7c, + 0x74, 0x6c, 0x6f, 0x79, 0x75, 0x6b, 0x63, 0x61, 0x5d, 0x57, 0x58, 0x5f, + 0x5a, 0x55, 0x42, 0x38, 0x7a, 0xea, 0xee, 0x91, 0x95, 0x33, 0x48, 0x65, + 0x32, 0x3b, 0x64, 0x59, 0x58, 0x5c, 0x60, 0x75, 0x82, 0x67, 0x4e, 0x58, + 0x88, 0x56, 0x3a, 0x2d, 0x38, 0x30, 0x24, 0x57, 0x5e, 0x59, 0x4e, 0x45, + 0x42, 0x3d, 0x39, 0x39, 0x40, 0x56, 0xa2, 0x6a, 0x3f, 0x38, 0x3b, 0x30, + 0x4b, 0x59, 0x6b, 0x96, 0xc7, 0x6a, 0x87, 0x92, 0x7a, 0x49, 0x2c, 0x3b, + 0x49, 0x41, 0x42, 0x52, 0x3b, 0x4a, 0x5f, 0x6b, 0x69, 0x60, 0x55, 0x4e, + 0x62, 0x6a, 0x6e, 0x63, 0x5f, 0x5a, 0x46, 0x3a, 0x82, 0xd2, 0xce, 0x7c, + 0x47, 0x41, 0x47, 0x47, 0x47, 0x3f, 0x32, 0x27, 0x26, 0x2b, 0x2f, 0x30, + 0x30, 0x39, 0x45, 0x65, 0x5e, 0x4b, 0x1c, 0x06, 0xea, 0xe4, 0x97, 0x22, + 0x0f, 0x10, 0x1c, 0x34, 0x2e, 0x24, 0x0e, 0x1a, 0x76, 0xd0, 0xe4, 0xde, + 0xe0, 0xe0, 0xe1, 0xe2, 0xe2, 0xe3, 0xe4, 0xe4, 0xe1, 0xe1, 0xe0, 0xdf, + 0xdf, 0xde, 0xdd, 0xdd, 0xe1, 0xe3, 0xe5, 0xe8, 0xe9, 0xe9, 0xe8, 0xe7, + 0xe3, 0xe4, 0xe5, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xe7, 0xe8, 0xe9, 0xea, + 0xeb, 0xec, 0xec, 0xed, 0xf0, 0xef, 0xee, 0xec, 0xea, 0xe8, 0xe7, 0xe6, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xe9, 0xe7, 0xe8, + 0xe9, 0xe7, 0xe3, 0xdf, 0x9d, 0xa4, 0xcb, 0xd3, 0xb6, 0xd6, 0xd9, 0xcc, + 0xdf, 0xc0, 0xad, 0xce, 0xf1, 0xe8, 0xe4, 0xf6, 0xdf, 0xcb, 0xb7, 0x7e, + 0xb9, 0xe4, 0xc7, 0x8a, 0x77, 0x97, 0xb5, 0x82, 0x92, 0xa5, 0xdf, 0xe8, + 0xd4, 0xd7, 0xe6, 0xe7, 0xd5, 0xd7, 0xea, 0xf1, 0xd8, 0xdc, 0xdf, 0xd3, + 0xc6, 0xd4, 0xe9, 0xed, 0xe7, 0xf0, 0xea, 0xe5, 0xe8, 0xdc, 0xcd, 0xd0, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xf4, 0xeb, 0xf7, 0xde, + 0xcc, 0xe4, 0xbc, 0x99, 0xcc, 0x6a, 0x8a, 0xdc, 0xec, 0xa6, 0xde, 0xe1, + 0x86, 0x88, 0x83, 0x7b, 0x7b, 0x80, 0x72, 0x5b, 0x4d, 0x6c, 0x8d, 0x96, + 0xa8, 0xdf, 0xf0, 0xc6, 0xda, 0x8e, 0x31, 0x13, 0x30, 0x3b, 0x27, 0x19, + 0x48, 0x5f, 0x84, 0x71, 0x66, 0x6b, 0x46, 0x35, 0x44, 0x36, 0x4d, 0x61, + 0x40, 0x6a, 0xc5, 0xbb, 0xc8, 0xba, 0xb1, 0xbe, 0xb0, 0x85, 0xb8, 0xac, + 0x9e, 0x7f, 0x6b, 0x6a, 0x61, 0x51, 0x5a, 0x72, 0x6a, 0x81, 0x90, 0x8c, + 0x87, 0x87, 0x80, 0x73, 0x71, 0x6f, 0x70, 0x71, 0x6b, 0x67, 0x73, 0x85, + 0x6f, 0x69, 0x68, 0x6d, 0x6d, 0x68, 0x68, 0x6f, 0x5f, 0x61, 0x67, 0x69, + 0x60, 0x53, 0x54, 0x5d, 0x60, 0x59, 0x53, 0x54, 0x47, 0x27, 0x16, 0x1e, + 0x35, 0x45, 0x46, 0x31, 0x4a, 0x4e, 0x28, 0x40, 0x59, 0x75, 0x74, 0x68, + 0x6f, 0x6e, 0x67, 0x6f, 0x68, 0x45, 0x2f, 0x4c, 0x42, 0x29, 0x3e, 0x3b, + 0x56, 0x49, 0x35, 0x33, 0x44, 0x4e, 0x4a, 0x48, 0x2e, 0x6a, 0xba, 0x53, + 0x17, 0x29, 0x4c, 0x47, 0x3d, 0x32, 0x57, 0xc8, 0xcc, 0x3b, 0x8b, 0x75, + 0x65, 0x68, 0x67, 0x60, 0x5e, 0x64, 0x68, 0x68, 0x42, 0x5f, 0x69, 0x56, + 0x4b, 0x55, 0x58, 0x4d, 0x61, 0x64, 0x64, 0x59, 0x60, 0x65, 0x4c, 0x3c, + 0x6a, 0x96, 0xd4, 0x96, 0x35, 0x31, 0x3c, 0x37, 0x4a, 0x45, 0x39, 0x2c, + 0x27, 0x2d, 0x33, 0x36, 0x39, 0x41, 0x4b, 0x66, 0x59, 0x45, 0x1a, 0x09, + 0xf3, 0xf7, 0xd2, 0xa4, 0xbe, 0xad, 0x8a, 0x84, 0x5f, 0x56, 0x9b, 0xa0, + 0xd3, 0xe2, 0xec, 0xd5, 0xde, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe2, + 0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe4, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xf0, 0xd4, 0xf4, 0xe9, 0xe1, 0xe5, 0xf2, 0xe7, 0xea, 0xec, 0xee, 0xef, + 0xee, 0xeb, 0xe7, 0xe5, 0xef, 0xe8, 0xe3, 0xe6, 0xe9, 0xe4, 0xe1, 0xe3, + 0xe1, 0xda, 0xe0, 0xe8, 0xd1, 0xb2, 0xe4, 0xf1, 0xda, 0xcb, 0xd9, 0xc6, + 0xcf, 0xd1, 0xd9, 0xc6, 0xec, 0xc1, 0xb8, 0xd2, 0xea, 0xec, 0xd1, 0xd5, + 0xd3, 0xd9, 0xda, 0x9f, 0x91, 0xba, 0xd8, 0x9d, 0x83, 0x62, 0x88, 0x87, + 0x6d, 0x8c, 0xe3, 0xe7, 0xe1, 0xf1, 0xd4, 0xcc, 0xd5, 0xd7, 0xea, 0xf5, + 0xcb, 0xd9, 0xee, 0xf4, 0xd3, 0xcd, 0xe8, 0xd8, 0xdb, 0xea, 0xea, 0xe9, + 0xe2, 0xc7, 0xc4, 0xe4, 0xeb, 0xef, 0xeb, 0xe0, 0xdf, 0xe8, 0xe9, 0xe3, + 0xe9, 0xef, 0xe7, 0xee, 0xe4, 0xc8, 0xc8, 0xa9, 0xad, 0x4f, 0x5e, 0xb6, + 0xe5, 0xac, 0xbb, 0x7b, 0x77, 0x66, 0x67, 0x60, 0x4e, 0x70, 0xc3, 0xfe, + 0xf8, 0xff, 0xcd, 0x92, 0x85, 0x6f, 0x4b, 0x41, 0x1a, 0x24, 0x21, 0x1f, + 0x3f, 0x6b, 0x74, 0x64, 0x4a, 0x4f, 0x40, 0x34, 0x36, 0x33, 0x49, 0x78, + 0x54, 0x2b, 0x38, 0x7b, 0x54, 0x49, 0xac, 0xb2, 0xb4, 0xb3, 0xaf, 0xb6, + 0xa0, 0x7e, 0xbf, 0xb3, 0x8d, 0x71, 0x5d, 0x64, 0x72, 0x73, 0x6b, 0x66, + 0x73, 0x7c, 0x81, 0x7f, 0x82, 0x87, 0x81, 0x75, 0x62, 0x6f, 0x76, 0x72, + 0x70, 0x75, 0x78, 0x76, 0x64, 0x6d, 0x7a, 0x83, 0x82, 0x78, 0x6b, 0x61, + 0x58, 0x5a, 0x5f, 0x65, 0x67, 0x62, 0x57, 0x4d, 0x54, 0x51, 0x54, 0x5f, + 0x4a, 0x42, 0x6d, 0x86, 0x7d, 0x66, 0x57, 0x44, 0x2c, 0x37, 0x53, 0x59, + 0x4f, 0x5b, 0x68, 0x6b, 0x63, 0x5a, 0x57, 0x59, 0x71, 0x43, 0x3f, 0x40, + 0x4e, 0x52, 0x34, 0x3d, 0x3c, 0x44, 0x3f, 0x2e, 0x2d, 0x48, 0x6b, 0x7f, + 0x59, 0x76, 0x95, 0x65, 0x58, 0x5e, 0x32, 0x3f, 0x48, 0x31, 0x50, 0xe2, + 0x87, 0x41, 0x87, 0x76, 0x5b, 0x50, 0x5a, 0x4c, 0x42, 0x55, 0x5b, 0x5d, + 0x5d, 0x58, 0x63, 0x4e, 0x49, 0x57, 0x47, 0x4a, 0x4f, 0x6c, 0x6b, 0x52, + 0x4e, 0x57, 0x5b, 0x5e, 0x42, 0x4c, 0x9b, 0xca, 0x89, 0x47, 0x46, 0x50, + 0x2e, 0x40, 0x37, 0x38, 0x37, 0x36, 0x42, 0x34, 0x2a, 0x3c, 0x29, 0x3e, + 0x4f, 0x46, 0x1d, 0x11, 0xe7, 0xeb, 0xdb, 0xbf, 0xdb, 0xd7, 0xda, 0xfa, + 0xe2, 0xf2, 0xe7, 0xc8, 0xec, 0xe3, 0xe3, 0xd3, 0xde, 0xde, 0xdf, 0xdf, + 0xe0, 0xe1, 0xe1, 0xe2, 0xdf, 0xe0, 0xe1, 0xe3, 0xe4, 0xe6, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xee, 0xdd, 0xe8, 0xef, 0xe1, 0xe8, 0xec, 0xec, + 0xea, 0xeb, 0xed, 0xee, 0xed, 0xeb, 0xe8, 0xe5, 0xe8, 0xef, 0xea, 0xe6, + 0xed, 0xec, 0xe5, 0xe7, 0xc8, 0xdf, 0xdd, 0xe3, 0xcf, 0x95, 0xc3, 0xea, + 0xd8, 0xdb, 0xce, 0xba, 0xe5, 0xe0, 0xce, 0xc9, 0xf0, 0xa3, 0xdf, 0xf6, + 0xed, 0xd9, 0xc2, 0xbe, 0xc5, 0xf7, 0xd7, 0xd1, 0xa9, 0x6a, 0xaf, 0x86, + 0x79, 0x82, 0x9f, 0x95, 0x9c, 0xb5, 0xe7, 0xea, 0xcb, 0xcb, 0xd6, 0xde, + 0xc8, 0xd7, 0xfa, 0xdf, 0xd8, 0xf2, 0xdc, 0xe2, 0xd6, 0xcd, 0xee, 0xd2, + 0xc8, 0xe0, 0xe3, 0xeb, 0xdc, 0xd3, 0xf0, 0xf2, 0xf2, 0xeb, 0xe8, 0xee, + 0xf0, 0xeb, 0xe7, 0xe8, 0xe4, 0xea, 0xe2, 0xea, 0xf1, 0xe5, 0xc4, 0xb7, + 0xae, 0x4f, 0x7f, 0xc1, 0xd5, 0x87, 0x4b, 0x3a, 0x64, 0x75, 0xb4, 0xef, + 0xfa, 0xf9, 0xf9, 0xec, 0xaa, 0x86, 0x43, 0x26, 0x3e, 0x43, 0x38, 0x43, + 0x64, 0x4e, 0x4d, 0x76, 0x89, 0x5f, 0x38, 0x3f, 0x61, 0x3b, 0x30, 0x49, + 0x56, 0x4c, 0x41, 0x40, 0x44, 0x56, 0x64, 0x76, 0x4e, 0x5d, 0xc3, 0xce, + 0xb1, 0xb6, 0xc5, 0xd4, 0xb6, 0x89, 0xc1, 0xb4, 0x84, 0x6f, 0x65, 0x72, + 0x7f, 0x7a, 0x6a, 0x5f, 0x6b, 0x6e, 0x6b, 0x68, 0x6e, 0x76, 0x70, 0x61, + 0x5e, 0x78, 0x8b, 0x84, 0x74, 0x70, 0x76, 0x7c, 0x81, 0x7f, 0x7b, 0x75, + 0x6d, 0x66, 0x5f, 0x5b, 0x71, 0x72, 0x74, 0x76, 0x76, 0x6e, 0x61, 0x57, + 0x5f, 0x43, 0x4f, 0x66, 0x37, 0x15, 0x2b, 0x29, 0x0e, 0x3d, 0x58, 0x53, + 0x42, 0x27, 0x23, 0x3d, 0x6a, 0x66, 0x6b, 0x72, 0x6a, 0x5b, 0x5d, 0x6b, + 0x73, 0x3c, 0x34, 0x3b, 0x40, 0x38, 0x2c, 0x4f, 0x36, 0x36, 0x46, 0x59, + 0x54, 0x3d, 0x38, 0x45, 0x11, 0x54, 0x8c, 0x66, 0x43, 0x3d, 0x30, 0x4f, + 0x67, 0x33, 0x9d, 0xf7, 0x6f, 0x2b, 0x66, 0x83, 0x67, 0x52, 0x62, 0x64, + 0x59, 0x55, 0x48, 0x48, 0x59, 0x45, 0x49, 0x56, 0x5c, 0x56, 0x4b, 0x55, + 0x5c, 0x51, 0x5e, 0x5f, 0x4d, 0x5a, 0x6c, 0x5c, 0x55, 0x49, 0x6f, 0xbc, + 0xc1, 0x69, 0x28, 0x2d, 0x47, 0x31, 0x28, 0x27, 0x41, 0x48, 0x37, 0x4f, + 0x60, 0x59, 0x49, 0x58, 0x50, 0x49, 0x24, 0x07, 0xe1, 0xe1, 0xda, 0xba, + 0xc3, 0xb0, 0xa2, 0xb4, 0xaf, 0xda, 0xb8, 0xc2, 0xeb, 0xe0, 0xe9, 0xe1, + 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, 0xe0, 0xe1, 0xe2, 0xe3, + 0xe5, 0xe6, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xeb, 0xdb, 0xf0, + 0xe2, 0xea, 0xe8, 0xef, 0xea, 0xeb, 0xec, 0xec, 0xec, 0xea, 0xe8, 0xe7, + 0xdd, 0xed, 0xed, 0xe7, 0xec, 0xee, 0xe8, 0xe7, 0xdb, 0xe1, 0xdf, 0xea, + 0xd6, 0xaf, 0xe3, 0xec, 0xd9, 0xd4, 0xd9, 0xcd, 0xd1, 0xd5, 0xe6, 0xe2, + 0xc6, 0xcb, 0xf3, 0xc9, 0xe9, 0xd8, 0xc8, 0xe4, 0xe9, 0xc2, 0xd7, 0xd0, + 0xc3, 0xae, 0xae, 0xa2, 0x8e, 0x7e, 0x73, 0x61, 0x83, 0xa6, 0xd8, 0xe9, + 0xd9, 0xcd, 0xd6, 0xe4, 0xd5, 0xde, 0xf2, 0xd5, 0xd7, 0xe3, 0xc9, 0xdb, + 0xd7, 0xbb, 0xdd, 0xec, 0xde, 0xd9, 0xe9, 0xf2, 0xd7, 0xd7, 0xec, 0xda, + 0xe6, 0xe3, 0xe7, 0xef, 0xee, 0xe3, 0xe0, 0xe5, 0xe7, 0xda, 0xe2, 0xf0, + 0xe3, 0xf4, 0xbc, 0x96, 0xd4, 0x61, 0x6e, 0xdf, 0xbc, 0x67, 0xaa, 0xff, + 0xff, 0xef, 0xff, 0xf9, 0x9f, 0x3c, 0x1a, 0x1e, 0x1f, 0x29, 0x36, 0x4f, + 0x5f, 0x51, 0x54, 0x78, 0x57, 0x69, 0x62, 0x45, 0x46, 0x67, 0x66, 0x40, + 0x68, 0x3c, 0x3b, 0x4d, 0x3a, 0x2f, 0x49, 0x5f, 0x57, 0x61, 0x64, 0x56, + 0x22, 0x50, 0xcb, 0xd4, 0xcd, 0xce, 0xc5, 0xac, 0x96, 0x95, 0xd6, 0xb8, + 0x8f, 0x78, 0x68, 0x70, 0x7c, 0x7b, 0x74, 0x70, 0x72, 0x6e, 0x67, 0x69, + 0x7b, 0x8e, 0x8b, 0x7c, 0x80, 0x85, 0x82, 0x7b, 0x7b, 0x84, 0x88, 0x84, + 0x6f, 0x72, 0x76, 0x77, 0x75, 0x6f, 0x68, 0x63, 0x69, 0x69, 0x6a, 0x6b, + 0x6b, 0x63, 0x57, 0x4d, 0x4e, 0x4b, 0x50, 0x54, 0x52, 0x93, 0xf4, 0xff, + 0xfc, 0xee, 0xb5, 0x73, 0x4a, 0x30, 0x2f, 0x49, 0x4e, 0x6f, 0x7b, 0x68, + 0x60, 0x6a, 0x60, 0x44, 0x42, 0x3c, 0x46, 0x42, 0x4a, 0x5c, 0x5b, 0x65, + 0x4d, 0x4c, 0x4f, 0x57, 0x62, 0x60, 0x4c, 0x36, 0x31, 0x7e, 0xa3, 0x6b, + 0x2f, 0x29, 0x4e, 0x80, 0x5a, 0x1e, 0xcf, 0xd5, 0x4d, 0x3e, 0x65, 0x8d, + 0x76, 0x4d, 0x53, 0x5f, 0x5c, 0x57, 0x50, 0x5c, 0x4f, 0x5e, 0x60, 0x5e, + 0x53, 0x49, 0x50, 0x4e, 0x48, 0x50, 0x40, 0x3d, 0x53, 0x4d, 0x42, 0x55, + 0x2d, 0x30, 0x3f, 0x8f, 0xdd, 0xb7, 0x7a, 0x88, 0x82, 0x92, 0x8d, 0x6a, + 0x6b, 0x61, 0x35, 0x36, 0x2f, 0x32, 0x30, 0x3c, 0x2d, 0x2d, 0x17, 0x0e, + 0xdd, 0xe0, 0xe0, 0xb4, 0xb9, 0xb3, 0xa5, 0xb2, 0xb9, 0xce, 0xb4, 0xe2, + 0xe9, 0xdb, 0xe6, 0xde, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe2, 0xe4, 0xe5, 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe2, 0xf3, 0xda, 0xe3, 0xe6, 0xea, 0xec, 0xed, 0xe9, 0xea, 0xea, 0xea, + 0xea, 0xe9, 0xe9, 0xe8, 0xda, 0xdd, 0xe7, 0xeb, 0xe7, 0xe7, 0xe9, 0xe5, + 0xd1, 0xc2, 0xd9, 0xf6, 0xe5, 0xbc, 0xd5, 0xd4, 0xef, 0xe7, 0xcd, 0xbd, + 0xc1, 0xc6, 0xd9, 0xe1, 0xbf, 0xdb, 0xfa, 0xdc, 0xd5, 0xbb, 0xd2, 0xdc, + 0xa9, 0xcd, 0xff, 0xff, 0xf0, 0xc0, 0xa5, 0x9f, 0xae, 0x7c, 0x7e, 0x91, + 0xb2, 0xc2, 0xe4, 0xe2, 0xcc, 0xe4, 0xcb, 0xc2, 0xea, 0xf0, 0xd1, 0xc4, + 0xfc, 0xe9, 0xe4, 0xee, 0xe0, 0xbd, 0xbf, 0xe7, 0xe2, 0xb7, 0xde, 0xeb, + 0xde, 0xeb, 0xe0, 0xdf, 0xd9, 0xe4, 0xeb, 0xe8, 0xe1, 0xdf, 0xe3, 0xe5, + 0xf0, 0xee, 0xec, 0xf3, 0xe0, 0xff, 0xbf, 0x86, 0xdd, 0x60, 0x4d, 0xd7, + 0xff, 0xcd, 0xa5, 0xdc, 0x8a, 0x3b, 0x2b, 0x51, 0x40, 0x1b, 0x32, 0x63, + 0x62, 0x57, 0x50, 0x5c, 0x66, 0x5a, 0x4e, 0x51, 0x6f, 0x67, 0x87, 0x9b, + 0x88, 0x89, 0x95, 0x84, 0x43, 0x27, 0x2a, 0x43, 0x46, 0x3f, 0x41, 0x42, + 0x31, 0x37, 0x34, 0x3f, 0x3f, 0x5d, 0xa8, 0xbf, 0xaa, 0x7a, 0x74, 0x97, + 0xa9, 0x90, 0xb8, 0xb8, 0x91, 0x7a, 0x69, 0x6e, 0x77, 0x78, 0x77, 0x79, + 0x73, 0x67, 0x57, 0x54, 0x67, 0x7a, 0x74, 0x61, 0x61, 0x6f, 0x71, 0x61, + 0x51, 0x51, 0x59, 0x5f, 0x62, 0x69, 0x71, 0x77, 0x74, 0x6a, 0x5e, 0x55, + 0x5a, 0x5a, 0x5b, 0x5e, 0x60, 0x5b, 0x52, 0x4a, 0x58, 0x4d, 0x50, 0x98, + 0xe9, 0xfd, 0xd1, 0x8a, 0x47, 0x2a, 0x20, 0x24, 0x27, 0x3b, 0x47, 0x3a, + 0x53, 0x5a, 0x68, 0x74, 0x6e, 0x59, 0x46, 0x3f, 0x73, 0x82, 0x81, 0x66, + 0x62, 0x71, 0x67, 0x51, 0x58, 0x6a, 0x68, 0x47, 0x2d, 0x33, 0x46, 0x50, + 0x2e, 0x53, 0x55, 0x47, 0x4a, 0x5a, 0x5f, 0x48, 0x36, 0x3c, 0xef, 0x96, + 0x25, 0x48, 0x68, 0x81, 0x6b, 0x43, 0x4b, 0x5e, 0x62, 0x60, 0x55, 0x5a, + 0x45, 0x62, 0x5b, 0x58, 0x51, 0x50, 0x65, 0x59, 0x52, 0x4c, 0x51, 0x55, + 0x51, 0x5a, 0x64, 0x60, 0x8f, 0x7f, 0x57, 0x65, 0xb7, 0xd9, 0xa2, 0x68, + 0x58, 0x5f, 0x45, 0x41, 0x38, 0x1f, 0x2f, 0x44, 0x65, 0x6d, 0x65, 0x78, + 0x88, 0x75, 0x20, 0x02, 0xe2, 0xe7, 0xed, 0xba, 0xaa, 0x88, 0x6a, 0x85, + 0xb8, 0xb8, 0xb0, 0xe2, 0xdc, 0xe2, 0xdd, 0xd0, 0xdc, 0xdc, 0xdd, 0xdd, + 0xde, 0xdf, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe5, 0xe6, 0xe8, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xde, 0xf2, 0xdf, 0xd0, 0xe9, 0xe7, 0xf2, 0xe7, + 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xe4, 0xcf, 0xdf, 0xf3, + 0xe5, 0xe1, 0xeb, 0xe7, 0xc5, 0xc1, 0xe1, 0xef, 0xdf, 0xa3, 0xaa, 0xdf, + 0xe1, 0xd6, 0xd1, 0xdc, 0xca, 0xd2, 0xf2, 0xea, 0xb4, 0xe5, 0xff, 0xd7, + 0x9f, 0xb9, 0xdc, 0xb4, 0xd7, 0xef, 0xeb, 0xca, 0xef, 0xd6, 0xa6, 0xa4, + 0x5c, 0x49, 0x63, 0x70, 0x81, 0x94, 0xce, 0xe4, 0xe5, 0xe3, 0xba, 0xbc, + 0xf1, 0xdd, 0xb8, 0xde, 0xe8, 0xd4, 0xdc, 0xe9, 0xe8, 0xe0, 0xd6, 0xd9, + 0xf0, 0xcb, 0xe1, 0xe2, 0xdb, 0xe2, 0xd1, 0xdd, 0xe6, 0xe6, 0xe5, 0xe5, + 0xe5, 0xe6, 0xea, 0xed, 0xde, 0xed, 0xd4, 0xe3, 0xca, 0xaa, 0x67, 0x75, + 0xc6, 0x6e, 0x56, 0xde, 0xe5, 0x82, 0x33, 0x1d, 0x18, 0x00, 0x21, 0x64, + 0x76, 0x6b, 0x68, 0x68, 0x67, 0x64, 0x5e, 0x57, 0x60, 0x7c, 0x8e, 0x8a, + 0x68, 0x81, 0x7f, 0x5d, 0x4e, 0x5b, 0x4c, 0x21, 0x22, 0x40, 0x54, 0x5d, + 0x61, 0x51, 0x41, 0x43, 0x48, 0x5b, 0x36, 0x2a, 0x3e, 0x2d, 0x26, 0x42, + 0x4f, 0x2b, 0x2c, 0x54, 0x79, 0x4f, 0x4d, 0x51, 0x77, 0x69, 0x65, 0x70, + 0x77, 0x71, 0x68, 0x66, 0x6b, 0x61, 0x55, 0x58, 0x70, 0x89, 0x87, 0x77, + 0x5c, 0x77, 0x8e, 0x8f, 0x85, 0x7f, 0x7c, 0x78, 0x76, 0x78, 0x79, 0x79, + 0x77, 0x72, 0x6d, 0x6a, 0x6a, 0x68, 0x67, 0x69, 0x6a, 0x66, 0x5e, 0x57, + 0x3c, 0x4e, 0x43, 0x3e, 0x3f, 0x46, 0x5e, 0x67, 0x92, 0x84, 0x7b, 0x5f, + 0x34, 0x2c, 0x40, 0x46, 0x6f, 0x5b, 0x5c, 0x70, 0x6d, 0x51, 0x48, 0x57, + 0x6d, 0x64, 0x52, 0x50, 0x55, 0x59, 0x5d, 0x57, 0x37, 0x27, 0x27, 0x38, + 0x42, 0x3a, 0x36, 0x3b, 0x67, 0x5b, 0x62, 0x81, 0x71, 0x41, 0x37, 0x40, + 0x21, 0x82, 0xf8, 0x77, 0x25, 0x45, 0x78, 0x9f, 0x72, 0x4c, 0x4b, 0x4f, + 0x51, 0x59, 0x52, 0x54, 0x62, 0x4f, 0x31, 0x47, 0x57, 0x4b, 0x50, 0x43, + 0x4c, 0x5b, 0x6a, 0x64, 0x5f, 0x75, 0x89, 0x84, 0x85, 0x72, 0x56, 0x45, + 0x75, 0xd3, 0xd7, 0x81, 0x10, 0x12, 0x24, 0x56, 0x66, 0x6a, 0x88, 0x89, + 0x75, 0x78, 0x76, 0x88, 0x99, 0x87, 0x28, 0x09, 0xeb, 0xe0, 0xea, 0xca, + 0xb7, 0x5a, 0x00, 0x18, 0x58, 0x9c, 0xd1, 0xee, 0xd9, 0xdb, 0xcf, 0xd9, + 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe2, 0xe3, 0xe4, 0xe5, + 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xdf, 0xe7, 0xdf, 0xc8, + 0xe6, 0xe5, 0xf0, 0xe5, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, 0xe8, 0xea, 0xeb, + 0xf1, 0xd2, 0xdb, 0xf3, 0xea, 0xe3, 0xec, 0xec, 0xc3, 0xcb, 0xe7, 0xd6, + 0xb8, 0x9f, 0xc0, 0xe7, 0xf2, 0xcf, 0xd5, 0xef, 0xb7, 0xc9, 0xff, 0xe8, + 0xd0, 0xeb, 0xe9, 0xc4, 0xb5, 0xca, 0xd0, 0xf3, 0xe6, 0xd3, 0xeb, 0xe5, + 0xe6, 0xd8, 0xca, 0xb1, 0x8a, 0x82, 0x76, 0x5c, 0x81, 0xb1, 0xe2, 0xe6, + 0xfa, 0xd8, 0xcd, 0xdb, 0xe0, 0xc1, 0xb1, 0xda, 0xdd, 0xd7, 0xd3, 0xe9, + 0xe4, 0xcf, 0xd1, 0xc4, 0xe1, 0xe3, 0xd8, 0xd7, 0xd9, 0xde, 0xed, 0xf0, + 0xf1, 0xd8, 0xcf, 0xe1, 0xec, 0xe6, 0xe4, 0xed, 0xeb, 0xed, 0xca, 0xa6, + 0x61, 0x41, 0x36, 0x5a, 0x5e, 0x4b, 0x57, 0xde, 0x9f, 0x50, 0x8b, 0x77, + 0x6e, 0x76, 0x7b, 0x65, 0x51, 0x66, 0x6f, 0x4f, 0x3a, 0x56, 0x70, 0x61, + 0x46, 0x55, 0x6d, 0x66, 0x76, 0x8b, 0x8c, 0xa5, 0xc5, 0x92, 0x4b, 0x45, + 0x2b, 0x42, 0x39, 0x2e, 0x40, 0x40, 0x2e, 0x2c, 0x24, 0x2e, 0x3b, 0x31, + 0x28, 0x44, 0x58, 0x45, 0x45, 0x5a, 0x55, 0x4a, 0x7f, 0x76, 0x71, 0x7f, + 0x6d, 0x60, 0x5a, 0x62, 0x67, 0x63, 0x61, 0x64, 0x72, 0x6c, 0x61, 0x5e, + 0x6c, 0x7a, 0x74, 0x62, 0x6a, 0x7b, 0x8b, 0x92, 0x96, 0x97, 0x8d, 0x7f, + 0x7b, 0x7c, 0x7e, 0x7e, 0x7b, 0x77, 0x71, 0x6e, 0x72, 0x6e, 0x6a, 0x68, + 0x65, 0x60, 0x56, 0x4f, 0x4d, 0x55, 0x51, 0x53, 0x60, 0x86, 0xa0, 0x81, + 0x64, 0x52, 0x33, 0x3a, 0x69, 0x7c, 0x6e, 0x68, 0x67, 0x5b, 0x59, 0x65, + 0x66, 0x57, 0x4e, 0x50, 0x5d, 0x62, 0x51, 0x52, 0x5a, 0x5f, 0x64, 0x4f, + 0x59, 0x47, 0x32, 0x26, 0x27, 0x32, 0x45, 0x55, 0x42, 0x56, 0x5e, 0x3d, + 0x2f, 0x4d, 0x51, 0x36, 0x30, 0xa4, 0xa8, 0x50, 0x34, 0x35, 0x6a, 0x9b, + 0x77, 0x4f, 0x47, 0x42, 0x40, 0x50, 0x58, 0x64, 0x52, 0x46, 0x38, 0x4a, + 0x63, 0x6b, 0x6c, 0x5f, 0x7d, 0xa2, 0x95, 0x70, 0x6d, 0x6c, 0x64, 0x6c, + 0x47, 0x37, 0x3a, 0x31, 0x3d, 0x9d, 0xe7, 0xd1, 0x98, 0x7a, 0x89, 0x80, + 0x6a, 0x75, 0x6e, 0x5f, 0x6b, 0x5f, 0x67, 0x67, 0x54, 0x51, 0x18, 0x0a, + 0xe4, 0xd1, 0xdd, 0xdb, 0xf1, 0x95, 0x28, 0x4a, 0xdb, 0xf6, 0xe9, 0xd9, + 0xda, 0xe8, 0xdf, 0xe1, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xde, + 0xe3, 0xe3, 0xe4, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe5, 0xd9, 0xd4, 0xcf, 0xde, 0xe5, 0xe3, 0xe9, 0xe8, 0xe7, 0xe5, 0xe4, + 0xe5, 0xe7, 0xea, 0xed, 0xf4, 0xe0, 0xd5, 0xe2, 0xee, 0xe8, 0xe5, 0xed, + 0xcb, 0xdd, 0xeb, 0xe2, 0xc4, 0xbb, 0xf0, 0xdf, 0xfb, 0xd5, 0xa5, 0xc1, + 0xbc, 0xd4, 0xf2, 0xe0, 0xc1, 0xe9, 0xdc, 0xa0, 0xb7, 0xd7, 0xd9, 0xe1, + 0xc9, 0xc2, 0xb2, 0xdd, 0xbb, 0x8f, 0xde, 0x8f, 0x85, 0xb5, 0xdd, 0xa7, + 0x7d, 0x89, 0xc6, 0xd1, 0xab, 0xae, 0xcc, 0xd2, 0xcf, 0xd6, 0xcf, 0xd3, + 0xe8, 0xea, 0xde, 0xe5, 0xe4, 0xcf, 0xce, 0xd4, 0xdd, 0xdf, 0xca, 0xd6, + 0xe3, 0xe5, 0xf7, 0xec, 0xe4, 0xd0, 0xce, 0xe2, 0xe9, 0xde, 0xdd, 0xea, + 0xe7, 0x98, 0x6e, 0x4e, 0x5a, 0xb2, 0xb7, 0x81, 0x6b, 0x57, 0x43, 0x62, + 0x73, 0x87, 0x94, 0x88, 0x62, 0x65, 0x75, 0x84, 0x9d, 0xba, 0x98, 0x46, + 0x78, 0x61, 0x60, 0x5f, 0x56, 0x6b, 0x7f, 0x71, 0x76, 0x7b, 0x89, 0xaf, + 0xb9, 0x7a, 0x40, 0x43, 0x32, 0x46, 0x4d, 0x3f, 0x30, 0x2c, 0x38, 0x49, + 0x40, 0x41, 0x70, 0x61, 0x31, 0x5d, 0x75, 0x33, 0x44, 0x4f, 0x3f, 0x44, + 0x8c, 0x5d, 0x42, 0x87, 0x79, 0x69, 0x5e, 0x60, 0x64, 0x64, 0x6b, 0x75, + 0x6c, 0x70, 0x70, 0x6f, 0x79, 0x84, 0x80, 0x72, 0x6b, 0x81, 0x8d, 0x7e, + 0x67, 0x5f, 0x63, 0x67, 0x7b, 0x78, 0x73, 0x6c, 0x65, 0x5e, 0x58, 0x55, + 0x6b, 0x66, 0x60, 0x5d, 0x5a, 0x55, 0x4c, 0x45, 0x5c, 0x49, 0x42, 0x5f, + 0x71, 0x75, 0x80, 0x72, 0x56, 0x67, 0x63, 0x5b, 0x5c, 0x50, 0x47, 0x54, + 0x6d, 0x4b, 0x4b, 0x70, 0x74, 0x52, 0x47, 0x5c, 0x44, 0x65, 0x5e, 0x5c, + 0x5c, 0x60, 0x68, 0x48, 0x4d, 0x4c, 0x42, 0x3e, 0x51, 0x64, 0x55, 0x34, + 0x34, 0x3f, 0x79, 0x71, 0x43, 0x3c, 0x48, 0x6f, 0x80, 0xd8, 0x78, 0x50, + 0x56, 0x43, 0x69, 0x96, 0x6d, 0x48, 0x51, 0x5d, 0x55, 0x4e, 0x4d, 0x60, + 0x36, 0x41, 0x4c, 0x43, 0x46, 0x53, 0x46, 0x37, 0x37, 0x33, 0x41, 0x3b, + 0x25, 0x34, 0x47, 0x36, 0x65, 0x50, 0x45, 0x45, 0x4d, 0x71, 0xab, 0xd2, + 0xc0, 0x76, 0x61, 0x5e, 0x54, 0x53, 0x54, 0x68, 0x73, 0x5b, 0x64, 0x6f, + 0x6e, 0x70, 0x22, 0x02, 0xd9, 0xd1, 0xda, 0xcd, 0xe5, 0x8c, 0x1d, 0x46, + 0xd0, 0xe5, 0xdc, 0xd6, 0xd6, 0xd4, 0xd9, 0xda, 0xda, 0xda, 0xdb, 0xdc, + 0xdc, 0xdd, 0xde, 0xde, 0xe3, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9, 0xea, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xeb, 0xcf, 0xc8, 0xda, 0xd7, 0xe7, 0xd7, 0xee, + 0xe8, 0xe6, 0xe4, 0xe3, 0xe4, 0xe7, 0xeb, 0xed, 0xee, 0xea, 0xcf, 0xce, + 0xed, 0xea, 0xdb, 0xea, 0xd0, 0xe5, 0xcb, 0xd8, 0xcd, 0x9d, 0xd8, 0xdd, + 0xf5, 0xd7, 0xc3, 0xf7, 0xe3, 0xe4, 0xe4, 0xaf, 0xc1, 0xfe, 0xd5, 0x97, + 0xdd, 0xe3, 0xf1, 0xe9, 0xed, 0xe4, 0xdc, 0xbf, 0xc5, 0xca, 0xe6, 0xe8, + 0x75, 0x78, 0xa9, 0x87, 0x50, 0x73, 0xd5, 0xd8, 0xdc, 0xc7, 0xc5, 0xc5, + 0xca, 0xba, 0xac, 0xd8, 0xe4, 0xea, 0xde, 0xbe, 0xd8, 0xf1, 0xd6, 0xdc, + 0xe9, 0xc9, 0xc0, 0xdb, 0xf1, 0xf1, 0xe5, 0xd5, 0xd4, 0xda, 0xe5, 0xec, + 0xe7, 0xde, 0xe3, 0xf0, 0xec, 0x7f, 0x8e, 0x94, 0x7f, 0x72, 0x52, 0x55, + 0x66, 0x66, 0x42, 0x5e, 0x7d, 0x85, 0x9e, 0x8b, 0xbe, 0xac, 0xbd, 0xd6, + 0xcc, 0xb1, 0x8b, 0x5f, 0x5e, 0x47, 0x57, 0x66, 0x4e, 0x59, 0x8c, 0xa8, + 0x5a, 0x51, 0x79, 0x8c, 0x60, 0x4c, 0x57, 0x4d, 0x64, 0x3e, 0x33, 0x3e, + 0x42, 0x52, 0x5f, 0x56, 0x52, 0x65, 0x5d, 0x2f, 0x29, 0x46, 0x3f, 0x2c, + 0x31, 0x3e, 0x22, 0x27, 0x8f, 0x6a, 0x45, 0x95, 0x7b, 0x72, 0x71, 0x7a, + 0x7d, 0x76, 0x75, 0x7a, 0x81, 0x8a, 0x8d, 0x8a, 0x8c, 0x90, 0x89, 0x7c, + 0x6a, 0x7a, 0x85, 0x82, 0x7c, 0x7b, 0x75, 0x6e, 0x87, 0x7b, 0x69, 0x5d, + 0x5c, 0x68, 0x78, 0x84, 0x6c, 0x67, 0x63, 0x62, 0x62, 0x5f, 0x59, 0x54, + 0x53, 0x61, 0x49, 0x45, 0x55, 0x51, 0x50, 0x4e, 0x5a, 0x57, 0x64, 0x63, + 0x4e, 0x51, 0x64, 0x66, 0x7a, 0x6b, 0x5f, 0x5f, 0x66, 0x6b, 0x6c, 0x6d, + 0x5e, 0x6a, 0x5e, 0x6e, 0x65, 0x50, 0x6a, 0x70, 0x48, 0x41, 0x3f, 0x42, + 0x3c, 0x2d, 0x27, 0x2c, 0x18, 0x44, 0x85, 0x4c, 0x22, 0x48, 0x30, 0x12, + 0x6f, 0xc8, 0x4b, 0x3b, 0x41, 0x35, 0x65, 0x9a, 0x8a, 0x58, 0x5c, 0x69, + 0x55, 0x3c, 0x3b, 0x5e, 0x4e, 0x3e, 0x52, 0x5a, 0x5f, 0x58, 0x33, 0x2f, + 0x38, 0x3c, 0x3b, 0x43, 0x57, 0x5e, 0x61, 0x6e, 0x64, 0x7d, 0x81, 0x83, + 0x7f, 0x5f, 0x7b, 0xd7, 0xeb, 0xa0, 0x42, 0x35, 0x4f, 0x5f, 0x71, 0x67, + 0x80, 0x79, 0x7c, 0x80, 0x8f, 0x86, 0x23, 0x10, 0xd9, 0xd9, 0xd3, 0xd9, + 0xe0, 0x96, 0x1a, 0x69, 0xe0, 0xda, 0xd4, 0xd1, 0xd2, 0xd4, 0xd5, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd7, 0xd9, 0xda, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, + 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe7, 0xef, 0xcd, 0xd0, + 0xe4, 0xd1, 0xca, 0xd5, 0xed, 0xe2, 0xdb, 0xce, 0xdf, 0xf2, 0xdf, 0xde, + 0xdc, 0xf2, 0xc8, 0xcb, 0xdb, 0xed, 0xd1, 0xd2, 0xd7, 0xde, 0xb9, 0xe5, + 0xc5, 0xb9, 0xef, 0xec, 0xe3, 0xc8, 0xbf, 0xf9, 0xdb, 0xcf, 0xf6, 0x90, + 0xc8, 0xfb, 0x95, 0xc3, 0xf1, 0xe7, 0xf4, 0xde, 0xe2, 0xf1, 0xe9, 0xcf, + 0xd1, 0xc3, 0xbd, 0xf1, 0x9f, 0x83, 0xa0, 0xad, 0x98, 0x9c, 0xac, 0xbe, + 0xed, 0xe7, 0xda, 0xcd, 0xe2, 0xe0, 0xcb, 0xef, 0xeb, 0xf3, 0xef, 0xe1, + 0xd2, 0xc5, 0xcd, 0xe2, 0xe6, 0xaa, 0xbc, 0xec, 0xe5, 0xd8, 0xdd, 0xd9, + 0xcb, 0xe9, 0xff, 0xd3, 0xef, 0xe6, 0xd3, 0xdb, 0xd7, 0xe6, 0x9b, 0x56, + 0x55, 0x56, 0x61, 0x79, 0x81, 0x6a, 0x42, 0x45, 0x71, 0x82, 0x86, 0x9f, + 0xbd, 0xbd, 0xb4, 0xc8, 0xaf, 0x6d, 0x53, 0x40, 0x68, 0x5e, 0x5e, 0x60, + 0x58, 0x60, 0x86, 0xaa, 0x74, 0x5c, 0x79, 0x60, 0x63, 0x79, 0x47, 0x46, + 0x47, 0x46, 0x45, 0x45, 0x46, 0x44, 0x3e, 0x38, 0x28, 0x28, 0x29, 0x2c, + 0x32, 0x38, 0x3d, 0x3f, 0x29, 0x1a, 0x3d, 0x6a, 0x96, 0x83, 0x9d, 0xc1, + 0x86, 0x73, 0x70, 0x81, 0x85, 0x78, 0x76, 0x82, 0x90, 0x96, 0x93, 0x8e, + 0x96, 0x9b, 0x80, 0x5a, 0x6d, 0x6e, 0x68, 0x58, 0x4c, 0x52, 0x6b, 0x81, + 0x6b, 0x67, 0x63, 0x64, 0x68, 0x69, 0x66, 0x61, 0x4b, 0x4a, 0x4a, 0x51, + 0x58, 0x5a, 0x55, 0x4e, 0x59, 0x5f, 0x59, 0x47, 0x42, 0x51, 0x62, 0x6a, + 0x54, 0x5b, 0x5d, 0x58, 0x56, 0x5d, 0x67, 0x6b, 0x6c, 0x5e, 0x47, 0x5c, + 0x69, 0x5e, 0x60, 0x54, 0x56, 0x60, 0x66, 0x66, 0x6a, 0x6d, 0x63, 0x53, + 0x41, 0x41, 0x3f, 0x3d, 0x38, 0x32, 0x2b, 0x26, 0x1b, 0x58, 0xa3, 0x64, + 0x1f, 0x45, 0x47, 0x21, 0xae, 0xa1, 0x2a, 0x53, 0x47, 0x3c, 0x4e, 0x95, + 0x7d, 0x58, 0x38, 0x33, 0x35, 0x34, 0x41, 0x56, 0x51, 0x39, 0x35, 0x47, + 0x5a, 0x6a, 0x70, 0x69, 0x85, 0x8d, 0x70, 0x5a, 0x74, 0x8c, 0x8d, 0x93, + 0x80, 0x9e, 0x66, 0x4e, 0x82, 0x68, 0x53, 0xa6, 0xe2, 0xee, 0x92, 0x29, + 0x2f, 0x59, 0x67, 0x76, 0x6d, 0x49, 0x70, 0x7d, 0x77, 0x65, 0x22, 0x0f, + 0xd3, 0xd4, 0xd2, 0xd4, 0xe7, 0xa3, 0x2d, 0x8f, 0xe3, 0xdd, 0xd6, 0xd3, + 0xd4, 0xd6, 0xd7, 0xd6, 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, + 0xdd, 0xdd, 0xdf, 0xe0, 0xe2, 0xe3, 0xe5, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe4, 0xe7, 0xde, 0xdc, 0xed, 0xe8, 0xcc, 0xc7, 0xdc, 0xe1, 0xe7, 0xda, + 0xd9, 0xef, 0xf3, 0xeb, 0xec, 0xf4, 0xdf, 0xc4, 0xd9, 0xd6, 0xc0, 0xc0, + 0xe4, 0xdf, 0xc8, 0xf0, 0xc0, 0xcc, 0xf0, 0xde, 0xdc, 0xcd, 0xc7, 0xea, + 0xd3, 0xd9, 0xd5, 0xa4, 0xe1, 0x9c, 0xab, 0xee, 0xf2, 0xde, 0xeb, 0xd7, + 0xd7, 0xcd, 0xe9, 0xe1, 0xbd, 0xb9, 0xb6, 0xab, 0x95, 0x93, 0x68, 0x63, + 0x74, 0x9c, 0xe6, 0xf6, 0xc1, 0xc5, 0xc4, 0xbd, 0xd4, 0xd4, 0xc3, 0xeb, + 0xf3, 0xe8, 0xe9, 0xf3, 0xe7, 0xc8, 0xc6, 0xe0, 0xbb, 0xac, 0xee, 0xda, + 0xc4, 0xdf, 0xa2, 0x72, 0x25, 0x90, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xda, + 0xad, 0x4e, 0x4c, 0x88, 0x7d, 0x73, 0x8e, 0x86, 0x61, 0x5d, 0x50, 0x60, + 0x83, 0x84, 0x7b, 0x8b, 0xbd, 0xaa, 0x98, 0xa2, 0x99, 0x9d, 0xa7, 0x72, + 0x6c, 0x8c, 0x80, 0x6b, 0x67, 0x51, 0x60, 0xa7, 0x78, 0x4c, 0x5b, 0x60, + 0x50, 0x57, 0x48, 0x2b, 0x41, 0x42, 0x43, 0x42, 0x41, 0x3f, 0x40, 0x41, + 0x41, 0x46, 0x44, 0x35, 0x26, 0x2e, 0x4c, 0x69, 0x65, 0x49, 0x34, 0x4c, + 0x96, 0x62, 0x3a, 0x4e, 0x6f, 0x67, 0x61, 0x61, 0x66, 0x6b, 0x6e, 0x70, + 0x6b, 0x52, 0x53, 0x72, 0x7d, 0x69, 0x62, 0x70, 0x5c, 0x5c, 0x63, 0x71, + 0x81, 0x85, 0x7f, 0x76, 0x7e, 0x75, 0x6a, 0x64, 0x65, 0x67, 0x66, 0x64, + 0x5d, 0x5b, 0x5c, 0x62, 0x69, 0x6a, 0x65, 0x5e, 0x5f, 0x5d, 0x53, 0x4c, + 0x58, 0x6e, 0x75, 0x6f, 0x6b, 0x66, 0x67, 0x6e, 0x70, 0x67, 0x5b, 0x53, + 0x5a, 0x61, 0x5d, 0x63, 0x44, 0x28, 0x58, 0x8c, 0x6f, 0x6b, 0x5e, 0x52, + 0x55, 0x5f, 0x5e, 0x53, 0x3a, 0x3a, 0x3d, 0x42, 0x44, 0x3e, 0x31, 0x27, + 0x19, 0x5f, 0x91, 0x54, 0x2c, 0x3a, 0x28, 0x29, 0xd9, 0x82, 0x27, 0x54, + 0x59, 0x35, 0x40, 0x87, 0x99, 0x4c, 0x58, 0x72, 0x4b, 0x55, 0x6b, 0x3b, + 0x6b, 0x71, 0x6c, 0x59, 0x58, 0x75, 0x8d, 0x8c, 0x78, 0x92, 0x93, 0x92, + 0x9e, 0x8c, 0x6a, 0x61, 0x7c, 0x7a, 0x74, 0x68, 0x47, 0x27, 0x3b, 0x72, + 0xc3, 0xe0, 0xbe, 0x85, 0x72, 0x64, 0x6b, 0x95, 0x8d, 0x6f, 0x8b, 0x66, + 0x6b, 0x80, 0x19, 0x00, 0xd8, 0xd9, 0xd7, 0xcc, 0xe4, 0x9b, 0x25, 0x9d, + 0xe6, 0xe0, 0xd9, 0xd6, 0xd8, 0xda, 0xda, 0xda, 0xd8, 0xd8, 0xd9, 0xd9, + 0xda, 0xdb, 0xdb, 0xdb, 0xde, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe6, 0xe4, 0xe9, 0xce, 0xc5, 0xd4, 0xd0, 0xdb, + 0xd1, 0xe1, 0xe8, 0xdc, 0xcc, 0xdc, 0xef, 0xdc, 0xe4, 0xe1, 0xed, 0xc1, + 0xdf, 0xd6, 0xc9, 0xd5, 0xef, 0xd2, 0xcf, 0xe9, 0x90, 0xb1, 0xd1, 0xd3, + 0xc8, 0xda, 0xda, 0xca, 0xc9, 0xea, 0xbd, 0xa7, 0xa8, 0x88, 0xce, 0xe9, + 0xf6, 0xe3, 0xea, 0xe0, 0xdb, 0xe8, 0xe5, 0xdd, 0xe3, 0xbe, 0x9e, 0xcc, + 0xd1, 0x94, 0x7e, 0x6b, 0x5b, 0x96, 0xdc, 0xe7, 0xea, 0xf4, 0xf6, 0xe7, + 0xec, 0xda, 0xc0, 0xe6, 0xd7, 0xdf, 0xe6, 0xe7, 0xe9, 0xe8, 0xd6, 0xbd, + 0xcf, 0xcd, 0xd4, 0xef, 0xe9, 0xd0, 0x9e, 0x3a, 0x34, 0x1b, 0x7c, 0xed, + 0xc6, 0xd0, 0xd7, 0x7e, 0x57, 0x4a, 0x6a, 0x88, 0x68, 0x40, 0x51, 0x79, + 0x5e, 0x54, 0x42, 0x42, 0x52, 0x58, 0x65, 0x82, 0xcd, 0xba, 0xa8, 0xa7, + 0xa1, 0xc2, 0xc1, 0x55, 0x48, 0x62, 0x51, 0x3c, 0x41, 0x36, 0x4f, 0x9b, + 0x83, 0x63, 0x6e, 0x93, 0x6d, 0x39, 0x43, 0x46, 0x46, 0x46, 0x40, 0x35, + 0x2c, 0x30, 0x3e, 0x4c, 0x54, 0x57, 0x4f, 0x3b, 0x29, 0x30, 0x50, 0x6e, + 0x36, 0x47, 0x46, 0x51, 0x9d, 0x7e, 0x5e, 0x6e, 0x65, 0x71, 0x71, 0x68, + 0x68, 0x6e, 0x63, 0x4e, 0x48, 0x57, 0x5f, 0x57, 0x4c, 0x4c, 0x54, 0x5b, + 0x52, 0x58, 0x6b, 0x8b, 0xa6, 0xaa, 0x96, 0x80, 0x83, 0x82, 0x83, 0x87, + 0x89, 0x84, 0x79, 0x70, 0x6f, 0x6b, 0x68, 0x69, 0x6b, 0x68, 0x5f, 0x56, + 0x46, 0x48, 0x45, 0x45, 0x54, 0x6a, 0x6f, 0x67, 0x70, 0x59, 0x51, 0x5e, + 0x66, 0x5c, 0x56, 0x5b, 0x50, 0x73, 0x74, 0x73, 0x74, 0x78, 0x7b, 0x5c, + 0x4d, 0x56, 0x5a, 0x5a, 0x5e, 0x60, 0x54, 0x42, 0x51, 0x4b, 0x41, 0x35, + 0x2d, 0x2c, 0x30, 0x35, 0x1f, 0x5d, 0x7b, 0x52, 0x5a, 0x6c, 0x68, 0xa4, + 0xcc, 0x6b, 0x5f, 0x53, 0x3b, 0x0d, 0x2e, 0x72, 0x9d, 0x64, 0x53, 0x60, + 0x65, 0x7b, 0x8a, 0x77, 0x71, 0x63, 0x67, 0x7a, 0x75, 0x56, 0x4d, 0x5e, + 0x6a, 0x78, 0x76, 0x7c, 0x8d, 0x83, 0x7a, 0x8d, 0x76, 0x6c, 0x7f, 0x95, + 0x9a, 0x9c, 0x7c, 0x40, 0x5b, 0xa3, 0xca, 0xb4, 0x82, 0x51, 0x5a, 0x93, + 0x99, 0x62, 0x83, 0x60, 0x86, 0xb3, 0x38, 0x13, 0xe3, 0xe4, 0xe4, 0xce, + 0xe6, 0x8e, 0x19, 0xa1, 0xea, 0xe4, 0xdd, 0xda, 0xdb, 0xdd, 0xde, 0xdd, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdf, 0xdf, 0xe0, 0xe1, + 0xe1, 0xe2, 0xe3, 0xe3, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe7, 0xf5, 0xe2, + 0xc6, 0xcd, 0xd9, 0xe3, 0xd8, 0xed, 0xe7, 0xe2, 0xda, 0xd9, 0xe8, 0xd8, + 0xeb, 0xe4, 0xfa, 0xd1, 0xdc, 0xdd, 0xc9, 0xe2, 0xf5, 0xb1, 0xbf, 0xea, + 0xa4, 0xd7, 0xc6, 0xb4, 0xb6, 0xe4, 0xe9, 0xab, 0xcb, 0xf5, 0xc4, 0x8e, + 0x7e, 0xc9, 0xd5, 0xbd, 0xc4, 0xb5, 0xd4, 0xd8, 0xcd, 0xae, 0xb4, 0xbb, + 0xb3, 0xa9, 0xa1, 0xad, 0xc4, 0x73, 0x7c, 0x6e, 0x4f, 0x94, 0xd4, 0xd8, + 0xbb, 0xd1, 0xe2, 0xde, 0xe8, 0xd9, 0xc4, 0xef, 0xdc, 0xe4, 0xe2, 0xd2, + 0xd7, 0xf4, 0xee, 0xc2, 0xc3, 0xd7, 0xc4, 0xee, 0xd3, 0xa6, 0xd8, 0xc1, + 0x59, 0x58, 0x58, 0xc5, 0xdd, 0xe2, 0xd4, 0xc5, 0x5e, 0x64, 0x4d, 0x46, + 0x73, 0x68, 0x39, 0x52, 0x69, 0x60, 0x55, 0x50, 0x4e, 0x4f, 0x64, 0x83, + 0x97, 0xa1, 0x99, 0xa2, 0xb2, 0xc7, 0xac, 0x41, 0x38, 0x3a, 0x50, 0x6a, + 0x6d, 0x69, 0x73, 0x80, 0x62, 0x54, 0x41, 0x5b, 0x6a, 0x4c, 0x43, 0x52, + 0x35, 0x47, 0x59, 0x5a, 0x4c, 0x3e, 0x39, 0x3c, 0x44, 0x3a, 0x2e, 0x29, + 0x2b, 0x2f, 0x2f, 0x2e, 0x34, 0x4a, 0x72, 0x87, 0xa0, 0x64, 0x45, 0x49, + 0x6b, 0x74, 0x6f, 0x60, 0x5f, 0x69, 0x63, 0x51, 0x50, 0x4b, 0x58, 0x76, + 0x87, 0x7e, 0x6f, 0x69, 0x6a, 0x71, 0x7a, 0x7e, 0x79, 0x6e, 0x62, 0x5b, + 0x76, 0x6e, 0x66, 0x66, 0x6e, 0x77, 0x7e, 0x80, 0x75, 0x6f, 0x68, 0x63, + 0x5f, 0x56, 0x49, 0x3e, 0x2f, 0x40, 0x4a, 0x46, 0x48, 0x55, 0x61, 0x63, + 0x83, 0x65, 0x58, 0x64, 0x64, 0x52, 0x50, 0x60, 0x7b, 0x51, 0x24, 0x41, + 0x64, 0x66, 0x68, 0x58, 0x59, 0x59, 0x4a, 0x34, 0x2f, 0x43, 0x5c, 0x68, + 0x5a, 0x64, 0x6d, 0x6c, 0x68, 0x6c, 0x7a, 0x88, 0x96, 0x9e, 0xa0, 0x6f, + 0x5b, 0x5c, 0x61, 0xa4, 0x9f, 0x4e, 0x8c, 0x7b, 0xa5, 0xaa, 0x9f, 0x75, + 0x7b, 0x7d, 0x6a, 0x71, 0x95, 0x97, 0x84, 0x8b, 0x6d, 0x93, 0x91, 0x6f, + 0x6b, 0x7b, 0x7c, 0x74, 0x6d, 0x78, 0x74, 0x75, 0x7c, 0x6b, 0x65, 0x82, + 0xa9, 0x99, 0x8a, 0xa1, 0xc5, 0xb8, 0x8b, 0x74, 0xd7, 0xdd, 0xda, 0xd5, + 0xd2, 0xca, 0xcb, 0xd9, 0xc1, 0x77, 0xae, 0xb3, 0xcb, 0xa7, 0x00, 0x00, + 0xe3, 0xe8, 0xee, 0xdb, 0xf2, 0x8b, 0x25, 0xb5, 0xec, 0xe6, 0xdf, 0xdc, + 0xde, 0xe0, 0xe0, 0xe0, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, + 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe3, 0xe7, 0xf0, 0xdc, 0xd0, 0xde, 0xd4, 0xcd, 0xeb, 0xe1, 0xe3, + 0xe7, 0xd4, 0xd9, 0xe5, 0xec, 0xe7, 0xf2, 0xe2, 0xd0, 0xe0, 0xc2, 0xe5, + 0xdd, 0xaa, 0xc4, 0xcf, 0xa0, 0xec, 0xd4, 0xc2, 0xbb, 0xdd, 0xde, 0xa6, + 0xe0, 0xe8, 0xd2, 0x77, 0x89, 0xe4, 0xee, 0xff, 0xe2, 0xcd, 0xe4, 0xdb, + 0xeb, 0xf3, 0xf7, 0xed, 0xfd, 0xff, 0xcd, 0xa6, 0xab, 0x8e, 0x66, 0x65, + 0x74, 0xaa, 0xde, 0xb6, 0xcf, 0xe3, 0xf2, 0xe8, 0xea, 0xd3, 0xb7, 0xde, + 0xde, 0xdd, 0xf1, 0xf3, 0xd7, 0xca, 0xca, 0xbf, 0xde, 0xd7, 0xdb, 0xd4, + 0xd5, 0xda, 0xb2, 0x7e, 0xad, 0xea, 0xd0, 0xea, 0xdc, 0xcc, 0xaa, 0xa1, + 0x61, 0x3e, 0x5f, 0x71, 0x5f, 0x49, 0x4b, 0x86, 0x5b, 0x52, 0x54, 0x57, + 0x53, 0x5b, 0x7d, 0x9c, 0x9d, 0xbf, 0xa9, 0xaf, 0xc9, 0xb2, 0x7f, 0x45, + 0x3a, 0x37, 0x47, 0x5c, 0x5b, 0x50, 0x4f, 0x53, 0x45, 0x67, 0x72, 0x59, + 0x54, 0x4e, 0x3c, 0x49, 0x2c, 0x37, 0x3f, 0x3c, 0x34, 0x36, 0x45, 0x54, + 0x44, 0x36, 0x2a, 0x2e, 0x38, 0x38, 0x28, 0x16, 0x40, 0x21, 0x1a, 0x36, + 0x6c, 0x3e, 0x34, 0x5b, 0x65, 0x66, 0x64, 0x64, 0x6a, 0x72, 0x72, 0x6d, + 0x67, 0x5a, 0x66, 0x7f, 0x74, 0x51, 0x54, 0x75, 0x84, 0x88, 0x86, 0x76, + 0x61, 0x55, 0x56, 0x5d, 0x6f, 0x63, 0x57, 0x54, 0x5e, 0x6e, 0x7c, 0x83, + 0x74, 0x6f, 0x68, 0x65, 0x63, 0x5b, 0x4f, 0x45, 0x45, 0x55, 0x5c, 0x55, + 0x53, 0x5d, 0x66, 0x67, 0x6e, 0x43, 0x33, 0x57, 0x77, 0x6d, 0x52, 0x45, + 0x68, 0x53, 0x4e, 0x7d, 0x82, 0x59, 0x5d, 0x6e, 0x4a, 0x67, 0x7d, 0x7a, + 0x72, 0x79, 0x8a, 0x95, 0x8f, 0x8a, 0x7e, 0x6f, 0x60, 0x55, 0x50, 0x4e, + 0x72, 0x5b, 0x80, 0x74, 0x52, 0x60, 0x78, 0xa0, 0x81, 0x62, 0xb9, 0x86, + 0x83, 0x84, 0x94, 0x80, 0x54, 0x61, 0x6f, 0x74, 0x70, 0x67, 0x59, 0x4c, + 0x77, 0x82, 0x8c, 0x9e, 0x9b, 0x6d, 0x5f, 0x89, 0x96, 0x8a, 0x66, 0x59, + 0x69, 0x5c, 0x3f, 0x3c, 0x75, 0x6d, 0x81, 0xab, 0xa5, 0x71, 0x81, 0xd1, + 0xba, 0xe8, 0xd0, 0x6e, 0x4c, 0x88, 0x99, 0x63, 0xb3, 0x7c, 0x9e, 0xa4, + 0xba, 0x8a, 0x0a, 0x36, 0xdf, 0xe5, 0xec, 0xe1, 0xf1, 0x7b, 0x2e, 0xbd, + 0xed, 0xe7, 0xe0, 0xdd, 0xdf, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xdf, 0xdf, + 0xde, 0xdd, 0xdd, 0xdd, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xed, 0xe5, 0xdb, 0xe8, 0xd8, 0xc9, 0xdd, 0xd7, + 0xc2, 0xe6, 0xe5, 0xe2, 0xe4, 0xc7, 0xc4, 0xe7, 0xe8, 0xe3, 0xe2, 0xe4, + 0xc6, 0xd7, 0xbd, 0xdb, 0xc6, 0xcc, 0xea, 0xab, 0x86, 0xd0, 0xcd, 0xd1, + 0xd3, 0xd2, 0xbf, 0xb9, 0xf2, 0xd2, 0xcb, 0x81, 0xb0, 0xd2, 0xcc, 0xd8, + 0xbf, 0xd9, 0xe3, 0xf0, 0xe9, 0xda, 0xf7, 0xf2, 0xdb, 0xf4, 0xf0, 0xc4, + 0x82, 0x6e, 0x6e, 0x6d, 0x63, 0x91, 0xd1, 0xd4, 0xd2, 0xe2, 0xec, 0xe4, + 0xed, 0xda, 0xbd, 0xe0, 0xcc, 0xd4, 0xec, 0xd6, 0x93, 0x7c, 0x8d, 0x8e, + 0x6a, 0xa7, 0xc7, 0xa6, 0x75, 0x74, 0x99, 0xb1, 0x3f, 0x37, 0x51, 0xa1, + 0xbe, 0xcd, 0xb9, 0x87, 0x5c, 0x20, 0x4f, 0x69, 0x50, 0x43, 0x42, 0x72, + 0x77, 0x63, 0x60, 0x5d, 0x4b, 0x4d, 0x6a, 0x7e, 0x86, 0xb8, 0xaa, 0xbd, + 0xde, 0xa8, 0x69, 0x50, 0x56, 0x68, 0x52, 0x40, 0x49, 0x38, 0x3d, 0x77, + 0x9d, 0x76, 0x74, 0x76, 0x6a, 0x52, 0x31, 0x2d, 0x3a, 0x41, 0x45, 0x40, + 0x34, 0x2c, 0x2c, 0x30, 0x46, 0x43, 0x3d, 0x38, 0x34, 0x31, 0x30, 0x30, + 0x2e, 0x51, 0x40, 0x3f, 0x9e, 0x82, 0x54, 0x67, 0x65, 0x5f, 0x61, 0x6d, + 0x74, 0x73, 0x71, 0x73, 0x77, 0x75, 0x71, 0x6a, 0x66, 0x68, 0x6f, 0x75, + 0x69, 0x69, 0x67, 0x64, 0x60, 0x5f, 0x60, 0x63, 0x63, 0x5d, 0x57, 0x58, + 0x60, 0x68, 0x6c, 0x6d, 0x75, 0x71, 0x6f, 0x71, 0x73, 0x71, 0x68, 0x60, + 0x60, 0x5f, 0x57, 0x50, 0x59, 0x67, 0x68, 0x5d, 0x61, 0x5e, 0x62, 0x63, + 0x4e, 0x34, 0x36, 0x4a, 0x77, 0x65, 0x55, 0x76, 0x7f, 0x65, 0x68, 0x6a, + 0x4b, 0x70, 0x90, 0x91, 0x86, 0x85, 0x8d, 0x93, 0x91, 0x7e, 0x6c, 0x6b, + 0x77, 0x81, 0x7e, 0x76, 0x50, 0x3e, 0x7e, 0x86, 0x60, 0x6b, 0x75, 0x7d, + 0x88, 0x53, 0x61, 0x66, 0x89, 0x91, 0x89, 0x75, 0x5e, 0x7e, 0x83, 0x78, + 0x7d, 0x79, 0x73, 0x7c, 0x7e, 0x85, 0x56, 0x3a, 0x6b, 0x90, 0x84, 0x7b, + 0x5a, 0xa7, 0xbb, 0x7d, 0x36, 0x0f, 0x1d, 0x4a, 0xa6, 0x8c, 0x8b, 0x91, + 0x87, 0x8c, 0x8e, 0x79, 0x8e, 0x35, 0x5b, 0xd2, 0xc3, 0x55, 0x3c, 0x6f, + 0x89, 0x94, 0x8f, 0x86, 0xa1, 0x75, 0x1a, 0x25, 0xe3, 0xe5, 0xe7, 0xe0, + 0xe6, 0x65, 0x35, 0xbf, 0xed, 0xe7, 0xe0, 0xdd, 0xdf, 0xe1, 0xe1, 0xe0, + 0xe2, 0xe1, 0xe1, 0xe0, 0xdf, 0xde, 0xdd, 0xdd, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xea, 0xea, 0xec, 0xef, + 0xe5, 0xdc, 0xdc, 0xd7, 0xc8, 0xe4, 0xf0, 0xe8, 0xe5, 0xd4, 0xc9, 0xe7, + 0xf8, 0xe9, 0xe3, 0xe0, 0xcd, 0xc2, 0xba, 0xc4, 0xb9, 0xd3, 0xf2, 0xac, + 0xbd, 0xd9, 0xb4, 0xb3, 0xe5, 0xd7, 0xa7, 0xca, 0xe8, 0xcb, 0xb5, 0xa1, + 0xf3, 0xfa, 0xf8, 0xe0, 0xe2, 0xf7, 0xe5, 0xf0, 0xe4, 0xe2, 0xcc, 0xad, + 0xb1, 0xb1, 0xac, 0xd0, 0xd3, 0x73, 0x6c, 0x6e, 0x6f, 0xab, 0xd3, 0xe3, + 0xdf, 0xe6, 0xe9, 0xe2, 0xf2, 0xe5, 0xc6, 0xe6, 0xdc, 0xc3, 0xaf, 0x7d, + 0x3f, 0x4b, 0x72, 0x6e, 0x6b, 0xb3, 0xd1, 0xca, 0x7b, 0x35, 0x62, 0x93, + 0x3a, 0x22, 0x28, 0x63, 0xb7, 0x7f, 0x37, 0x4b, 0x39, 0x2d, 0x4c, 0x3a, + 0x3e, 0x4e, 0x38, 0x6a, 0x56, 0x49, 0x5d, 0x75, 0x72, 0x7b, 0x93, 0x9a, + 0x8e, 0xae, 0x9d, 0xaa, 0xb8, 0x85, 0x4f, 0x2c, 0x50, 0x68, 0x5b, 0x53, + 0x60, 0x48, 0x41, 0x71, 0x88, 0x5c, 0x47, 0x6e, 0x63, 0x28, 0x2c, 0x4a, + 0x41, 0x3e, 0x3b, 0x3a, 0x3f, 0x49, 0x56, 0x5f, 0x37, 0x3f, 0x41, 0x35, + 0x23, 0x1f, 0x2b, 0x3b, 0x31, 0x74, 0x63, 0x40, 0x92, 0x82, 0x5a, 0x69, + 0x6d, 0x5e, 0x51, 0x52, 0x58, 0x5d, 0x67, 0x71, 0x5e, 0x6c, 0x7d, 0x82, + 0x76, 0x6b, 0x6d, 0x77, 0x76, 0x73, 0x70, 0x70, 0x72, 0x6f, 0x67, 0x60, + 0x72, 0x6b, 0x64, 0x65, 0x6e, 0x79, 0x81, 0x83, 0x76, 0x72, 0x6f, 0x70, + 0x72, 0x6e, 0x65, 0x5c, 0x5b, 0x57, 0x4a, 0x40, 0x48, 0x59, 0x5e, 0x56, + 0x59, 0x47, 0x42, 0x5c, 0x85, 0xa2, 0xaa, 0xa8, 0x9f, 0x58, 0x32, 0x74, + 0x99, 0x70, 0x5b, 0x58, 0x70, 0x88, 0x99, 0x94, 0x89, 0x81, 0x7a, 0x71, + 0x72, 0x6f, 0x6e, 0x71, 0x74, 0x6d, 0x5d, 0x4e, 0x61, 0x66, 0x8f, 0x80, + 0x6f, 0x7b, 0x73, 0x81, 0x61, 0x85, 0x73, 0x84, 0x77, 0x69, 0x53, 0x4e, + 0x62, 0x76, 0x70, 0x63, 0x72, 0x89, 0x97, 0xa2, 0x42, 0x2d, 0x09, 0x2b, + 0x7b, 0x7c, 0x51, 0x51, 0x3d, 0x7d, 0x99, 0xa5, 0xd7, 0xed, 0xb9, 0x7d, + 0xa2, 0x8b, 0x52, 0x34, 0x64, 0xa3, 0xa5, 0x84, 0xd9, 0xb0, 0xbd, 0xf1, + 0xff, 0xff, 0x88, 0x00, 0x44, 0x80, 0x77, 0xb9, 0xf5, 0x97, 0x32, 0x0a, + 0xe9, 0xe9, 0xe6, 0xe4, 0xe5, 0x61, 0x47, 0xcf, 0xed, 0xe7, 0xe0, 0xdd, + 0xde, 0xe0, 0xe1, 0xe0, 0xe3, 0xe2, 0xe1, 0xe1, 0xdf, 0xde, 0xde, 0xdd, + 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xec, 0xe2, 0xe6, 0xde, 0xe9, 0xf3, 0xd4, 0xc3, 0xbd, 0xcd, 0xe4, 0xdd, + 0xdf, 0xe5, 0xd6, 0xe1, 0xee, 0xda, 0xde, 0xd8, 0xe0, 0xc5, 0xd6, 0xd3, + 0x90, 0xae, 0xd6, 0xa1, 0xd3, 0xc1, 0x9b, 0xbb, 0xe8, 0xe6, 0xa0, 0xce, + 0xd2, 0xd3, 0xa4, 0xba, 0xf8, 0xda, 0xef, 0xe0, 0xde, 0xcd, 0xd8, 0xd7, + 0xc6, 0xb4, 0xd7, 0xe9, 0xe2, 0xef, 0xd9, 0xa8, 0xc1, 0xb2, 0x8d, 0x86, + 0x8a, 0x9c, 0xcc, 0xe0, 0xe5, 0xe5, 0xe1, 0xd8, 0xec, 0xe0, 0xbf, 0xdb, + 0xe6, 0x97, 0x7b, 0x7d, 0x61, 0x57, 0x60, 0x53, 0x5a, 0x3d, 0x68, 0x74, + 0x8d, 0x93, 0x57, 0x67, 0x62, 0x50, 0x85, 0xa5, 0xe3, 0xa6, 0x6d, 0x81, + 0x62, 0x4d, 0x6a, 0x43, 0x31, 0x46, 0x3b, 0x6f, 0x79, 0x55, 0x4f, 0x56, + 0x4f, 0x63, 0x8a, 0x96, 0xad, 0xae, 0x91, 0x97, 0xa6, 0xa6, 0xa3, 0x7d, + 0x72, 0x5b, 0x51, 0x56, 0x54, 0x4f, 0x51, 0x56, 0x4e, 0x72, 0x52, 0x88, + 0xa9, 0x61, 0x42, 0x2d, 0x33, 0x34, 0x37, 0x3c, 0x3f, 0x3c, 0x35, 0x2e, + 0x45, 0x51, 0x57, 0x4e, 0x3d, 0x36, 0x40, 0x4e, 0x52, 0x53, 0x50, 0x61, + 0xa1, 0x76, 0x5e, 0x80, 0x63, 0x5b, 0x54, 0x56, 0x5e, 0x69, 0x71, 0x76, + 0x79, 0x75, 0x71, 0x75, 0x7f, 0x86, 0x84, 0x7e, 0x6d, 0x6d, 0x6f, 0x6f, + 0x6e, 0x6a, 0x66, 0x62, 0x48, 0x4e, 0x5a, 0x6b, 0x79, 0x7d, 0x78, 0x70, + 0x77, 0x70, 0x69, 0x64, 0x60, 0x57, 0x49, 0x3e, 0x4f, 0x55, 0x50, 0x3f, + 0x3a, 0x49, 0x5b, 0x63, 0x96, 0xa2, 0xa8, 0x9c, 0x8a, 0x80, 0x7e, 0x7f, + 0x7f, 0x6b, 0x53, 0x6f, 0x80, 0x6d, 0x60, 0x49, 0x64, 0x6f, 0x76, 0x79, + 0x82, 0x8d, 0x8b, 0x81, 0x71, 0x7e, 0x88, 0x84, 0x75, 0x6c, 0x70, 0x79, + 0x7e, 0x93, 0x8e, 0x58, 0x5f, 0x72, 0x64, 0x8f, 0xbe, 0xfa, 0x86, 0x72, + 0x75, 0xbb, 0xc8, 0xbd, 0xba, 0x63, 0x56, 0x41, 0x11, 0x6b, 0xd4, 0xb5, + 0x58, 0x7d, 0x71, 0x65, 0x7a, 0x60, 0x35, 0x3b, 0x1d, 0x59, 0x5f, 0x4d, + 0x77, 0x96, 0x60, 0x15, 0x25, 0x50, 0x37, 0x33, 0x4b, 0x12, 0x1f, 0xb1, + 0xd4, 0xac, 0xd0, 0xff, 0xf1, 0xce, 0xb5, 0x8f, 0xe6, 0xda, 0x72, 0xc0, + 0xf6, 0x61, 0x14, 0x05, 0xe4, 0xe2, 0xd6, 0xe3, 0xdd, 0x44, 0x4c, 0xd6, + 0xea, 0xe6, 0xe0, 0xdf, 0xe0, 0xe0, 0xdf, 0xdd, 0xdc, 0xdd, 0xdd, 0xde, + 0xdf, 0xdf, 0xe0, 0xe0, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xb1, 0x9e, 0xd6, 0xd1, 0xe7, 0xf2, 0xd6, 0xcc, 0xe9, 0xe9, 0xf2, 0xd3, + 0xd6, 0xd3, 0xd8, 0xcb, 0x95, 0xe2, 0xd8, 0xa1, 0xac, 0x8d, 0xa4, 0xd9, + 0xd6, 0xe7, 0xa0, 0xad, 0xe7, 0xd0, 0xa8, 0xea, 0xf2, 0xe1, 0xdd, 0xe1, + 0xdb, 0xd4, 0xd5, 0xd7, 0xcb, 0xe9, 0xf6, 0xec, 0xce, 0xc6, 0xd3, 0xc5, + 0x98, 0xa0, 0x96, 0x53, 0x6b, 0xaa, 0xea, 0xf1, 0xdc, 0xdd, 0xe2, 0xf2, + 0xe4, 0xd9, 0xb0, 0xcd, 0xc6, 0xb4, 0xb6, 0x8e, 0x77, 0x90, 0x7d, 0x57, + 0x7a, 0x94, 0x75, 0x90, 0x51, 0x83, 0xab, 0xab, 0xac, 0xaa, 0xbe, 0xb8, + 0xca, 0x85, 0x59, 0x7c, 0x58, 0x5f, 0x60, 0x59, 0x4f, 0x4b, 0x49, 0x48, + 0x6a, 0x48, 0x71, 0x43, 0x69, 0x7e, 0x7e, 0x98, 0xa9, 0xa7, 0xa7, 0xac, + 0xb6, 0x8a, 0x4a, 0x4c, 0x44, 0x5e, 0x40, 0x59, 0x75, 0x5a, 0x4f, 0x36, + 0x46, 0x6b, 0x59, 0x69, 0x4e, 0x12, 0x3c, 0x6c, 0x65, 0x47, 0x3b, 0x48, + 0x48, 0x36, 0x35, 0x45, 0x37, 0x41, 0x48, 0x45, 0x3d, 0x3d, 0x49, 0x56, + 0x7a, 0x69, 0x5a, 0x69, 0xa2, 0x6b, 0x4d, 0x6c, 0x65, 0x6a, 0x71, 0x74, + 0x72, 0x6f, 0x6f, 0x70, 0x61, 0x52, 0x4f, 0x5c, 0x5d, 0x52, 0x57, 0x69, + 0x70, 0x6a, 0x67, 0x6f, 0x7d, 0x86, 0x87, 0x83, 0x6c, 0x7b, 0x8f, 0x98, + 0x93, 0x87, 0x7c, 0x76, 0x76, 0x74, 0x71, 0x70, 0x6d, 0x68, 0x61, 0x5b, + 0x5b, 0x6d, 0x71, 0x68, 0x74, 0x92, 0x9a, 0x8d, 0x9e, 0x9e, 0x90, 0x8f, + 0x9e, 0x94, 0x82, 0x83, 0x8b, 0x70, 0x60, 0x5e, 0x57, 0x68, 0x8a, 0x82, + 0x5e, 0x75, 0x8e, 0x8f, 0x8e, 0x83, 0x76, 0x88, 0x8d, 0x80, 0x7a, 0x73, + 0x64, 0x9f, 0x87, 0x78, 0x64, 0x75, 0x85, 0x80, 0x7e, 0xa7, 0xbc, 0x96, + 0xc4, 0xd5, 0xa5, 0x57, 0x63, 0xaf, 0xb4, 0x74, 0x7a, 0x97, 0x7c, 0x5a, + 0x90, 0x85, 0x2d, 0x34, 0x0e, 0x33, 0x63, 0x34, 0x3d, 0x49, 0x57, 0x11, + 0x46, 0x7d, 0xa0, 0x8e, 0x37, 0x18, 0x4a, 0x41, 0x2f, 0x20, 0x27, 0x31, + 0x61, 0x5c, 0x54, 0xd6, 0xd1, 0x64, 0x81, 0x9a, 0xa6, 0xd5, 0x8f, 0x24, + 0x0f, 0x1b, 0x3f, 0x2a, 0x2e, 0x45, 0x18, 0x02, 0xe2, 0xe0, 0xd5, 0xe2, + 0xd7, 0x41, 0x51, 0xd6, 0xe8, 0xe3, 0xde, 0xdd, 0xde, 0xdf, 0xdd, 0xdb, + 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe1, 0x9b, 0x8a, 0xcf, 0xe0, 0xf0, 0xdb, 0xb8, + 0xd1, 0xe7, 0xe2, 0xd9, 0xe2, 0x9e, 0xad, 0xaf, 0x9f, 0xad, 0xdb, 0xb0, + 0xa8, 0x99, 0xbe, 0xd8, 0xb8, 0xe6, 0xb9, 0xc9, 0xe0, 0xb5, 0xc9, 0xec, + 0xea, 0xdc, 0xe3, 0xdb, 0xc5, 0xd8, 0xe4, 0xc2, 0xdf, 0xe7, 0xde, 0xd8, + 0xdf, 0xe3, 0xde, 0xd7, 0x8d, 0xa4, 0xad, 0x41, 0x3c, 0x9e, 0xdb, 0xcb, + 0xe2, 0xea, 0xe3, 0xdc, 0xcf, 0xdf, 0xc8, 0xe4, 0x94, 0x4c, 0x65, 0x78, + 0x7f, 0x64, 0x2a, 0x5b, 0x58, 0x7a, 0x47, 0x5d, 0x81, 0x72, 0x8b, 0xe5, + 0xb4, 0xb8, 0xb2, 0x67, 0x66, 0x69, 0x58, 0x3f, 0x5c, 0x4b, 0x4c, 0x65, + 0x71, 0x64, 0x54, 0x51, 0x96, 0x3c, 0x5e, 0x62, 0x6e, 0x85, 0x75, 0x6e, + 0x97, 0xa6, 0xb6, 0xc0, 0xad, 0x87, 0x5e, 0x32, 0x4b, 0x5b, 0x5c, 0x68, + 0x4a, 0x48, 0x84, 0x86, 0x4e, 0xa0, 0x8d, 0x66, 0x4d, 0x40, 0x4e, 0x2c, + 0x42, 0x41, 0x3f, 0x41, 0x49, 0x50, 0x47, 0x39, 0x29, 0x2f, 0x34, 0x37, + 0x38, 0x3c, 0x46, 0x4e, 0x73, 0x6e, 0x5c, 0x5e, 0x9a, 0x72, 0x4f, 0x5c, + 0x66, 0x63, 0x5e, 0x58, 0x54, 0x55, 0x59, 0x5c, 0x69, 0x75, 0x77, 0x6a, + 0x64, 0x6d, 0x75, 0x74, 0x7a, 0x6b, 0x61, 0x6d, 0x83, 0x8b, 0x7b, 0x66, + 0x80, 0x7c, 0x7d, 0x83, 0x86, 0x7c, 0x65, 0x52, 0x3c, 0x4d, 0x62, 0x6d, + 0x6e, 0x6a, 0x6a, 0x6c, 0x76, 0x5b, 0x47, 0x51, 0x70, 0x88, 0x8d, 0x88, + 0x82, 0x8c, 0x82, 0x6c, 0x70, 0x85, 0x84, 0x70, 0x69, 0x5f, 0x7b, 0x71, + 0x78, 0x79, 0x85, 0x6f, 0x56, 0x5c, 0x85, 0x88, 0x6a, 0x73, 0x82, 0x77, + 0x68, 0x77, 0x77, 0xa6, 0xeb, 0xf9, 0xc5, 0xc5, 0xc9, 0xc3, 0xa8, 0xcd, + 0x98, 0x55, 0x98, 0xa7, 0xa3, 0x7d, 0x7d, 0xad, 0xbf, 0x9d, 0x80, 0x82, + 0xae, 0xeb, 0xb4, 0xcd, 0xb1, 0x66, 0x8b, 0x57, 0x4e, 0x3f, 0x34, 0x36, + 0x25, 0x2b, 0x2e, 0x2f, 0x37, 0x33, 0x17, 0x3c, 0x69, 0x62, 0x4c, 0x1b, + 0x38, 0x4f, 0x29, 0x13, 0x60, 0x62, 0x0a, 0x00, 0x54, 0x80, 0x28, 0x92, + 0xff, 0xd3, 0xa7, 0x9f, 0x61, 0x41, 0x55, 0x67, 0x92, 0x9c, 0x3e, 0x02, + 0xdf, 0xdc, 0xd3, 0xe0, 0xcc, 0x3c, 0x59, 0xd6, 0xe4, 0xdf, 0xda, 0xd9, + 0xdb, 0xdc, 0xda, 0xd8, 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xd7, 0x99, 0xc8, + 0xdb, 0xe9, 0xf1, 0xc8, 0xc7, 0xe1, 0xd6, 0xdc, 0xe5, 0x8e, 0xd3, 0xd5, + 0xa7, 0xdb, 0xdf, 0x98, 0xb3, 0xb8, 0xd2, 0xcb, 0xb6, 0xdc, 0xb9, 0xe9, + 0xde, 0xaa, 0xe3, 0xd6, 0xda, 0xeb, 0xdc, 0xc4, 0xcd, 0xdb, 0xd1, 0xc4, + 0xd0, 0xda, 0xe6, 0xeb, 0xec, 0xd7, 0xca, 0xe5, 0x7e, 0x85, 0xa5, 0x4a, + 0x5e, 0xd0, 0xb5, 0x5b, 0xaf, 0xd7, 0xe6, 0xde, 0xcf, 0xe4, 0xca, 0xda, + 0xab, 0xa8, 0x7a, 0x7f, 0x87, 0x5e, 0x50, 0x57, 0x91, 0x9c, 0x74, 0x21, + 0x1f, 0x7d, 0xf1, 0xef, 0x8c, 0xbc, 0xff, 0xd3, 0xb4, 0x9e, 0x86, 0x60, + 0x47, 0x6d, 0x72, 0x4d, 0x42, 0x60, 0x6d, 0x5c, 0x70, 0x5d, 0x6f, 0x48, + 0x27, 0x76, 0x7b, 0x69, 0x39, 0x45, 0x5d, 0xa2, 0xb3, 0xb0, 0xb7, 0x71, + 0x66, 0x5d, 0x57, 0x68, 0x5e, 0x5c, 0x71, 0x55, 0x2e, 0x4c, 0x47, 0x5f, + 0x5c, 0x33, 0x34, 0x2e, 0x3e, 0x63, 0x76, 0x5d, 0x3f, 0x3a, 0x44, 0x4a, + 0x66, 0x5b, 0x4e, 0x49, 0x4c, 0x54, 0x5a, 0x5d, 0x64, 0x69, 0x58, 0x53, + 0x98, 0x81, 0x5c, 0x58, 0x5d, 0x6a, 0x77, 0x78, 0x70, 0x6b, 0x70, 0x77, + 0x72, 0x87, 0x89, 0x71, 0x64, 0x6e, 0x74, 0x6d, 0x6f, 0x6e, 0x6c, 0x69, + 0x66, 0x64, 0x64, 0x64, 0x6c, 0x71, 0x76, 0x76, 0x70, 0x68, 0x61, 0x5d, + 0x60, 0x69, 0x6e, 0x62, 0x50, 0x4a, 0x54, 0x63, 0x36, 0x3d, 0x4c, 0x62, + 0x77, 0x87, 0x95, 0x9e, 0x6e, 0x7b, 0x75, 0x75, 0x7d, 0x6e, 0x6f, 0x94, + 0x8a, 0x3d, 0x52, 0x5a, 0x68, 0x52, 0x5b, 0x86, 0x44, 0x67, 0x80, 0xa3, + 0xc8, 0xbd, 0xb5, 0xd5, 0xc1, 0xa9, 0xea, 0xc0, 0x78, 0x6a, 0x8b, 0xd0, + 0xca, 0xbf, 0xb9, 0xd2, 0xce, 0xbf, 0xaf, 0x6e, 0x42, 0x2b, 0x2d, 0x51, + 0x65, 0x57, 0x46, 0x45, 0x40, 0x23, 0x6b, 0xb9, 0x73, 0x1e, 0x3d, 0x71, + 0x1c, 0x34, 0x1f, 0x36, 0x1e, 0x2e, 0x14, 0x2c, 0x30, 0x64, 0x49, 0x4a, + 0x69, 0x54, 0x36, 0x1a, 0x36, 0x3f, 0x16, 0x1e, 0x56, 0x72, 0x8a, 0x9d, + 0x7e, 0xd7, 0xfe, 0xda, 0xe4, 0xdf, 0x6a, 0x01, 0x55, 0x31, 0x3d, 0x3e, + 0x54, 0x5c, 0x1f, 0x09, 0xda, 0xd8, 0xd2, 0xdd, 0xbd, 0x35, 0x64, 0xd6, + 0xde, 0xda, 0xd5, 0xd4, 0xd6, 0xd8, 0xd7, 0xd5, 0xd6, 0xd6, 0xd7, 0xd7, + 0xd8, 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xde, 0xde, 0xde, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe9, 0xdf, 0x9e, 0x97, 0xdf, 0xe4, 0xf2, 0xe1, 0xa3, 0xb1, 0xcd, 0xe1, + 0xdf, 0x96, 0xe3, 0xc7, 0xaf, 0xbf, 0x98, 0xaa, 0xbb, 0xb6, 0xe5, 0xbb, + 0xc1, 0xc9, 0xa2, 0xe5, 0xbb, 0xb1, 0xf6, 0xe5, 0xda, 0xec, 0xcf, 0xc0, + 0xde, 0xda, 0xc2, 0xd1, 0xdf, 0xd8, 0xd8, 0xd5, 0xe0, 0xe9, 0xd8, 0xd2, + 0x7c, 0x60, 0x8b, 0x55, 0x54, 0x8b, 0x60, 0x56, 0x90, 0xb1, 0xc5, 0xd6, + 0xdf, 0xf2, 0xb8, 0xaa, 0x90, 0xa0, 0x72, 0x6a, 0x60, 0x3d, 0x45, 0x3c, + 0x87, 0xac, 0x8d, 0x74, 0x8a, 0x8f, 0x9b, 0xc8, 0x5e, 0x61, 0xb0, 0xd1, + 0xc2, 0x69, 0x48, 0x65, 0x46, 0x56, 0x5a, 0x4f, 0x4c, 0x4d, 0x38, 0x19, + 0x88, 0x6e, 0x60, 0x6f, 0x55, 0x5d, 0x31, 0x52, 0x82, 0x70, 0x4a, 0x90, + 0xb7, 0xa8, 0xaa, 0x5a, 0x38, 0x51, 0x50, 0x5b, 0x6e, 0x5b, 0x44, 0x41, + 0x3b, 0x56, 0x61, 0x73, 0x5a, 0x2c, 0x3a, 0x4e, 0x39, 0x38, 0x39, 0x3f, + 0x4c, 0x58, 0x5d, 0x5b, 0x54, 0x3f, 0x29, 0x27, 0x38, 0x4f, 0x5c, 0x5f, + 0x59, 0x5f, 0x52, 0x55, 0xa2, 0x8e, 0x69, 0x65, 0x65, 0x6c, 0x72, 0x73, + 0x6f, 0x6d, 0x70, 0x74, 0x6d, 0x71, 0x76, 0x79, 0x78, 0x79, 0x80, 0x88, + 0x89, 0x76, 0x60, 0x58, 0x5e, 0x67, 0x69, 0x67, 0x68, 0x6e, 0x70, 0x68, + 0x5a, 0x50, 0x50, 0x54, 0x4a, 0x56, 0x60, 0x5e, 0x52, 0x4b, 0x4e, 0x55, + 0x4c, 0x56, 0x51, 0x46, 0x56, 0x78, 0x81, 0x73, 0x98, 0x8c, 0x8a, 0x7a, + 0x6e, 0x90, 0xaa, 0x93, 0x80, 0x6e, 0x90, 0x8a, 0x7b, 0x9b, 0x98, 0xd0, + 0xb3, 0x87, 0x85, 0xb7, 0xb2, 0x88, 0x8d, 0xa1, 0x79, 0x67, 0x56, 0x32, + 0x85, 0xb2, 0x9e, 0x6b, 0x39, 0x51, 0xb1, 0x59, 0x18, 0x4b, 0x2b, 0x36, + 0x1d, 0x3b, 0x3f, 0x35, 0x66, 0xbf, 0xe2, 0xcc, 0x6a, 0x43, 0xb1, 0xb9, + 0xdd, 0xfd, 0x4a, 0x00, 0xcc, 0xb9, 0x6b, 0x43, 0x2d, 0x37, 0x18, 0x16, + 0x36, 0xe7, 0xe9, 0x6f, 0x51, 0x90, 0x96, 0x33, 0x29, 0x25, 0x16, 0x34, + 0x28, 0x3e, 0xc7, 0xff, 0x9d, 0x22, 0x65, 0x64, 0x15, 0x20, 0x21, 0x32, + 0x32, 0x2a, 0x3a, 0x1a, 0x19, 0x33, 0x18, 0x16, 0xd5, 0xd3, 0xd0, 0xda, + 0xae, 0x2e, 0x70, 0xd6, 0xd8, 0xd4, 0xd0, 0xcf, 0xd2, 0xd3, 0xd3, 0xd1, + 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, 0xd9, 0xd9, 0xda, 0xdb, + 0xdc, 0xdd, 0xdd, 0xde, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xeb, 0xe2, 0xc0, 0x7d, 0x9b, 0xca, 0xde, 0xcc, + 0xcc, 0xb3, 0xcb, 0xd4, 0xd2, 0x95, 0xb9, 0xb7, 0xdf, 0xce, 0x6b, 0x96, + 0xb4, 0xc6, 0xe2, 0xd0, 0x9a, 0xba, 0xa9, 0xdd, 0x9f, 0xd1, 0xf3, 0xea, + 0xe2, 0xd7, 0xcd, 0xcf, 0xd7, 0xdc, 0xd8, 0xd0, 0xe5, 0xe0, 0xd8, 0xba, + 0xb2, 0xd2, 0xbe, 0x73, 0x73, 0x65, 0x5e, 0x1d, 0x4e, 0xb2, 0x74, 0x4e, + 0x80, 0xaf, 0xd7, 0xec, 0xda, 0xcb, 0x8a, 0x88, 0x84, 0x64, 0x9c, 0x6a, + 0x3b, 0x4c, 0x3a, 0x72, 0xb1, 0x5c, 0x37, 0x9c, 0x9c, 0x7c, 0x50, 0x8b, + 0x93, 0x54, 0x68, 0xab, 0xe2, 0x80, 0x35, 0x54, 0x76, 0x78, 0x67, 0x4b, + 0x45, 0x4e, 0x48, 0x35, 0x6f, 0x69, 0x5d, 0x63, 0x29, 0x28, 0x31, 0x81, + 0xba, 0xb9, 0x61, 0x6f, 0xa4, 0xac, 0xbc, 0x89, 0x7e, 0x84, 0x77, 0x68, + 0x71, 0x65, 0x4b, 0x55, 0x4b, 0x46, 0x38, 0x43, 0x5c, 0x6f, 0x70, 0x51, + 0x53, 0x4d, 0x47, 0x49, 0x50, 0x54, 0x4f, 0x47, 0x50, 0x3e, 0x2e, 0x33, + 0x48, 0x59, 0x5b, 0x56, 0x5f, 0x60, 0x57, 0x62, 0xab, 0x8a, 0x66, 0x6b, + 0x66, 0x65, 0x69, 0x74, 0x7f, 0x81, 0x79, 0x6f, 0x69, 0x5c, 0x5e, 0x71, + 0x7c, 0x77, 0x77, 0x80, 0x8d, 0x7d, 0x6a, 0x62, 0x66, 0x6f, 0x74, 0x75, + 0x7c, 0x73, 0x6b, 0x6c, 0x72, 0x73, 0x6c, 0x64, 0x76, 0x73, 0x6c, 0x63, + 0x58, 0x4c, 0x43, 0x3e, 0x4d, 0x5c, 0x58, 0x46, 0x4f, 0x75, 0x91, 0x93, + 0x8e, 0x85, 0x82, 0xc0, 0xf6, 0xaf, 0x5a, 0x64, 0x8f, 0x8e, 0x8b, 0x96, + 0x90, 0xe3, 0xaa, 0xb7, 0x8c, 0x9f, 0x9e, 0xa1, 0x97, 0x98, 0xa6, 0x86, + 0x4f, 0x81, 0x73, 0xa7, 0xd4, 0x63, 0x89, 0xcd, 0x93, 0x3c, 0x72, 0x67, + 0x61, 0x71, 0x26, 0x33, 0x39, 0x40, 0x31, 0x17, 0x19, 0x32, 0x34, 0x20, + 0x45, 0x9c, 0xea, 0xff, 0xff, 0xc1, 0x75, 0x9d, 0xd6, 0xff, 0xb0, 0x50, + 0xce, 0xff, 0xfa, 0xf0, 0xdf, 0xab, 0x62, 0x44, 0x21, 0x16, 0x35, 0x1f, + 0x1b, 0x44, 0x34, 0x3e, 0x31, 0x1f, 0x5c, 0x76, 0x41, 0x4e, 0x0d, 0x33, + 0x4d, 0x2b, 0x40, 0x1a, 0x20, 0x21, 0x30, 0x13, 0x2a, 0x57, 0x21, 0x00, + 0xd0, 0xce, 0xce, 0xd7, 0x9f, 0x27, 0x7b, 0xd7, 0xd3, 0xcf, 0xcb, 0xcb, + 0xcd, 0xd0, 0xcf, 0xce, 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdc, 0xdd, 0xdd, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdc, 0xdf, 0xea, 0xa7, + 0x50, 0xa3, 0xe1, 0xd9, 0xca, 0xaf, 0xc1, 0xe3, 0xf1, 0x9a, 0x65, 0x96, + 0xff, 0xeb, 0x8b, 0x86, 0xc3, 0xea, 0xca, 0xd5, 0x97, 0xcf, 0xb9, 0xb8, + 0x9a, 0xef, 0xdf, 0xcc, 0xd7, 0xd4, 0xc9, 0xc7, 0xd8, 0xe6, 0xe1, 0xd4, + 0xca, 0xd6, 0xe7, 0xe7, 0xc6, 0xc9, 0xcf, 0x8f, 0x65, 0x75, 0x6d, 0x48, + 0x4f, 0x7d, 0x7a, 0xac, 0xaf, 0xd2, 0xe7, 0xec, 0xdb, 0xe5, 0xcf, 0xee, + 0xda, 0x78, 0x8e, 0x95, 0x91, 0x8c, 0x49, 0x47, 0x3a, 0x78, 0x7a, 0x9d, + 0x84, 0x86, 0x32, 0x52, 0x7b, 0x4e, 0x3d, 0x4e, 0xa6, 0x8e, 0x53, 0x55, + 0x32, 0x60, 0x6e, 0x4c, 0x39, 0x46, 0x3e, 0x1f, 0x30, 0x5b, 0x68, 0x41, + 0x2b, 0x8b, 0x9c, 0x4b, 0x7c, 0xc2, 0xa1, 0x8e, 0x9e, 0x90, 0x76, 0x40, + 0x4f, 0x32, 0x45, 0x43, 0x3b, 0x4f, 0x4e, 0x49, 0x35, 0x30, 0x36, 0x39, + 0x30, 0x35, 0x47, 0x4c, 0x5b, 0x61, 0x5d, 0x58, 0x60, 0x68, 0x52, 0x30, + 0x22, 0x22, 0x2d, 0x48, 0x67, 0x77, 0x72, 0x67, 0x5e, 0x65, 0x61, 0x69, + 0xa7, 0x7e, 0x5a, 0x66, 0x5a, 0x6c, 0x82, 0x8e, 0x8e, 0x8a, 0x88, 0x89, + 0x83, 0x7a, 0x75, 0x7c, 0x85, 0x85, 0x7d, 0x74, 0x67, 0x6e, 0x72, 0x6c, + 0x61, 0x5d, 0x63, 0x6c, 0x6c, 0x6d, 0x70, 0x76, 0x7c, 0x81, 0x82, 0x81, + 0x77, 0x6b, 0x5b, 0x52, 0x50, 0x53, 0x56, 0x57, 0x46, 0x4b, 0x4d, 0x49, + 0x4a, 0x63, 0x95, 0xbf, 0x8e, 0xac, 0x85, 0x70, 0x9a, 0x8c, 0x70, 0x95, + 0xff, 0xdb, 0x92, 0x81, 0x78, 0xaa, 0x4f, 0x35, 0xa2, 0xd3, 0xcc, 0xe0, + 0xe4, 0xb4, 0xb2, 0xbe, 0xb5, 0xbd, 0xb8, 0xb9, 0xc3, 0x78, 0x4a, 0x66, + 0x2d, 0x2d, 0x46, 0x6d, 0x40, 0x07, 0x17, 0x1a, 0x27, 0x2e, 0x2a, 0x1c, + 0x1f, 0x31, 0x37, 0x2e, 0x3c, 0x3b, 0x0b, 0x4b, 0x84, 0x29, 0x23, 0x97, + 0xe4, 0xa4, 0xf7, 0xfc, 0xc6, 0xb9, 0xff, 0xc0, 0x4a, 0x3b, 0x24, 0x23, + 0x1c, 0x47, 0x7e, 0x50, 0x33, 0x56, 0x2b, 0x2b, 0x47, 0x16, 0x1b, 0x75, + 0xff, 0xc2, 0x3a, 0x1d, 0x4e, 0x3c, 0x20, 0x2d, 0x34, 0x23, 0x25, 0x03, + 0x11, 0x39, 0x14, 0x00, 0xcc, 0xcb, 0xcc, 0xd5, 0x94, 0x22, 0x84, 0xd7, + 0xcf, 0xcb, 0xc7, 0xc7, 0xca, 0xcc, 0xcc, 0xcb, 0xcd, 0xcd, 0xce, 0xcf, + 0xcf, 0xd0, 0xd1, 0xd1, 0xd4, 0xd5, 0xd6, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xec, 0xda, 0xde, 0xdc, 0x6c, 0x67, 0xbc, 0xdd, 0xe4, 0xc8, 0xb9, 0xe7, + 0xf7, 0xb5, 0x79, 0xd3, 0xec, 0xa0, 0xa8, 0xba, 0xde, 0xdb, 0xcc, 0xa9, + 0xb1, 0xe6, 0xba, 0x88, 0xad, 0xe6, 0xd5, 0xd6, 0xce, 0xc8, 0xb8, 0xc1, + 0xdf, 0xe4, 0xd9, 0xde, 0xde, 0xd9, 0xc8, 0xe5, 0xdc, 0xcb, 0xd4, 0x95, + 0x6e, 0x82, 0x62, 0x65, 0x70, 0x89, 0x7a, 0x72, 0xbb, 0xd5, 0xde, 0xe7, + 0xed, 0xfb, 0xb2, 0x95, 0x63, 0x3e, 0x4f, 0xa6, 0xa3, 0x50, 0x49, 0x6e, + 0x7f, 0x84, 0xcb, 0xe0, 0xaf, 0xff, 0xdf, 0x69, 0x4c, 0x65, 0x82, 0x68, + 0x87, 0x80, 0x5c, 0x47, 0x67, 0x4c, 0x40, 0x4e, 0x56, 0x4b, 0x43, 0x45, + 0x55, 0x75, 0x8d, 0x59, 0x3d, 0x70, 0xb0, 0x88, 0x7f, 0x92, 0x84, 0x66, + 0x4b, 0x3a, 0x39, 0x36, 0x3b, 0x36, 0x66, 0x56, 0x2c, 0x2f, 0x2b, 0x38, + 0x3a, 0x3c, 0x4e, 0x49, 0x3c, 0x49, 0x4c, 0x3e, 0x30, 0x4d, 0x64, 0x5b, + 0x44, 0x36, 0x37, 0x3d, 0x39, 0x3b, 0x43, 0x53, 0x63, 0x67, 0x5d, 0x51, + 0x3e, 0x5d, 0x64, 0x60, 0x97, 0x7a, 0x5f, 0x66, 0x64, 0x71, 0x79, 0x71, + 0x62, 0x5e, 0x6d, 0x7e, 0x71, 0x73, 0x72, 0x73, 0x7a, 0x80, 0x7a, 0x6e, + 0x65, 0x5f, 0x5b, 0x5d, 0x63, 0x61, 0x56, 0x4c, 0x59, 0x64, 0x6f, 0x6f, + 0x66, 0x60, 0x63, 0x69, 0x4d, 0x51, 0x55, 0x55, 0x51, 0x4e, 0x4e, 0x50, + 0x47, 0x41, 0x48, 0x60, 0x77, 0x76, 0x5f, 0x49, 0x4a, 0x38, 0x91, 0xc1, + 0x7b, 0x7c, 0xac, 0x8e, 0x0f, 0x34, 0x2f, 0x17, 0x60, 0xa9, 0x8f, 0x4d, + 0x19, 0x54, 0x5d, 0x5c, 0x5f, 0xa1, 0xe4, 0xa6, 0x3a, 0x27, 0x4c, 0x8d, + 0xc5, 0xb2, 0x35, 0x1b, 0x21, 0x62, 0x4e, 0x3a, 0x18, 0x2b, 0x74, 0x3c, + 0x59, 0x68, 0x57, 0x2b, 0x1d, 0x32, 0x36, 0x22, 0x10, 0x65, 0x71, 0x33, + 0x2b, 0x4c, 0x63, 0x7b, 0x3f, 0xe4, 0xfa, 0x90, 0x71, 0x4d, 0x3b, 0x64, + 0xff, 0xe9, 0x90, 0x4d, 0x20, 0x2e, 0x80, 0x9e, 0x51, 0x2f, 0x17, 0x13, + 0x24, 0x28, 0x5b, 0xd9, 0x9a, 0x86, 0x99, 0x30, 0x4d, 0xff, 0xff, 0xff, + 0xa2, 0x4d, 0x2f, 0x23, 0x2e, 0x34, 0x17, 0x30, 0xcb, 0xc9, 0xcc, 0xd4, + 0x8d, 0x1f, 0x88, 0xd7, 0xcc, 0xc8, 0xc5, 0xc5, 0xc8, 0xcb, 0xcb, 0xc9, + 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd3, 0xd4, 0xd5, 0xd7, + 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xd5, 0xe6, 0xdc, 0xea, 0xaf, 0x51, 0xb3, 0xeb, + 0xdc, 0xc9, 0xaf, 0xe5, 0xe0, 0xc0, 0x9a, 0xe9, 0xe5, 0xc3, 0xca, 0xa7, + 0xe1, 0xc4, 0xd8, 0x93, 0x82, 0xd0, 0xc7, 0x9b, 0xea, 0xd7, 0xcd, 0xec, + 0xdb, 0xa0, 0xa8, 0xd6, 0xd7, 0xd4, 0xe1, 0xdf, 0xd4, 0xe9, 0xc2, 0xd8, + 0xec, 0xe6, 0xd8, 0x6e, 0x7c, 0x86, 0x52, 0x67, 0x68, 0x82, 0x9f, 0x99, + 0xae, 0xe2, 0xeb, 0xcd, 0xbc, 0xe8, 0xd8, 0xe0, 0xad, 0x92, 0x6c, 0x4d, + 0x5e, 0x67, 0x56, 0x68, 0x5e, 0x7c, 0xa8, 0x73, 0x72, 0xcb, 0xfd, 0xfd, + 0xab, 0xb1, 0xc0, 0x74, 0x4a, 0x3b, 0x43, 0x43, 0x58, 0x61, 0x67, 0x62, + 0x59, 0x53, 0x4f, 0x4b, 0x42, 0x4b, 0x64, 0x59, 0x60, 0x3a, 0x74, 0x9a, + 0x44, 0x1d, 0x48, 0x79, 0x60, 0x39, 0x35, 0x4f, 0x71, 0x61, 0x63, 0x4e, + 0x63, 0x68, 0x33, 0x3e, 0x30, 0x24, 0x45, 0x5a, 0x52, 0x4f, 0x45, 0x3c, + 0x48, 0x31, 0x30, 0x48, 0x4f, 0x3d, 0x34, 0x3f, 0x4b, 0x45, 0x3e, 0x3e, + 0x42, 0x44, 0x42, 0x3e, 0x16, 0x4d, 0x5e, 0x51, 0x8a, 0x80, 0x6d, 0x6f, + 0x6f, 0x68, 0x62, 0x62, 0x68, 0x6d, 0x6d, 0x6a, 0x6f, 0x71, 0x73, 0x74, + 0x72, 0x6f, 0x6a, 0x66, 0x6c, 0x6f, 0x6f, 0x68, 0x5d, 0x57, 0x5b, 0x60, + 0x62, 0x63, 0x68, 0x71, 0x7a, 0x7b, 0x73, 0x6b, 0x71, 0x76, 0x76, 0x69, + 0x5a, 0x58, 0x67, 0x77, 0x64, 0x59, 0x3d, 0x31, 0x58, 0x9a, 0xbd, 0xba, + 0xc0, 0xca, 0xd7, 0xaa, 0x62, 0x55, 0x45, 0x08, 0x26, 0x14, 0x1a, 0x2f, + 0xe5, 0xff, 0xf6, 0x8e, 0x64, 0x5b, 0x19, 0x22, 0x30, 0x1b, 0x2e, 0x22, + 0x1a, 0x2d, 0x76, 0xeb, 0x7c, 0x70, 0xa6, 0x1f, 0x25, 0x32, 0x29, 0x27, + 0x7b, 0xfe, 0xfa, 0x79, 0x36, 0x38, 0x3c, 0x3b, 0x34, 0x2c, 0x2b, 0x2f, + 0x40, 0x30, 0x2a, 0x46, 0x28, 0x10, 0x2e, 0x0e, 0x5d, 0x97, 0xa8, 0xe1, + 0xaf, 0x48, 0x31, 0xd2, 0xff, 0xf2, 0x70, 0x1c, 0x2a, 0x3e, 0x3d, 0x1c, + 0x3d, 0x00, 0x30, 0x2b, 0x29, 0xa6, 0xf5, 0xf8, 0xf3, 0xff, 0xf8, 0xff, + 0xd0, 0x7b, 0xc2, 0xff, 0xf7, 0x4a, 0x0a, 0x42, 0x82, 0x62, 0x04, 0x00, + 0xc3, 0xcc, 0xba, 0xd6, 0x77, 0x23, 0x96, 0xd3, 0xc3, 0xc4, 0xc5, 0xc4, + 0xc2, 0xc1, 0xc1, 0xc2, 0xce, 0xca, 0xc9, 0xcb, 0xcb, 0xc9, 0xca, 0xcd, + 0xd2, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xdd, 0xda, 0xda, 0xdb, 0xdc, + 0xdd, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe2, 0xd3, 0xe6, 0xec, + 0xd7, 0x79, 0x83, 0xd1, 0xce, 0xcd, 0xb3, 0xd9, 0xe3, 0x9a, 0x86, 0xa3, + 0x96, 0xde, 0xce, 0xbe, 0xc5, 0xb8, 0xbe, 0xbd, 0xa9, 0xc7, 0xc9, 0xa2, + 0xe7, 0xd2, 0xdd, 0xd4, 0xc7, 0xbf, 0xc5, 0xd6, 0xd8, 0xcd, 0xcd, 0xd7, + 0xdc, 0xe0, 0xe4, 0xd5, 0xe3, 0xdb, 0xd1, 0x66, 0x50, 0x61, 0x49, 0x54, + 0x55, 0x6d, 0x5d, 0x6e, 0xb3, 0xa0, 0xb7, 0xcd, 0x97, 0x4c, 0x42, 0x60, + 0xca, 0xd0, 0xb1, 0xa0, 0x9d, 0x85, 0x61, 0x3c, 0x29, 0x27, 0x29, 0x30, + 0x30, 0x2d, 0x2f, 0x37, 0x86, 0xc0, 0xa1, 0x62, 0x68, 0x69, 0x52, 0x58, + 0x56, 0x4f, 0x51, 0x55, 0x48, 0x32, 0x2f, 0x3b, 0x5e, 0x5b, 0x8e, 0x56, + 0x2e, 0x4b, 0x58, 0xac, 0x4c, 0x2d, 0x4e, 0x77, 0x5c, 0x3f, 0x49, 0x53, + 0x65, 0x49, 0x46, 0x37, 0x52, 0x4c, 0x17, 0x42, 0x3e, 0x21, 0x42, 0x57, + 0x61, 0x57, 0x2f, 0x42, 0x6c, 0x47, 0x38, 0x4b, 0x51, 0x3a, 0x34, 0x47, + 0x46, 0x5c, 0x65, 0x58, 0x37, 0x11, 0x19, 0x45, 0x58, 0x75, 0x69, 0x6a, + 0x96, 0x99, 0x73, 0x68, 0x68, 0x60, 0x5a, 0x60, 0x6d, 0x75, 0x73, 0x6c, + 0x78, 0x71, 0x6b, 0x6b, 0x72, 0x78, 0x7b, 0x7a, 0x61, 0x67, 0x6b, 0x6a, + 0x66, 0x64, 0x68, 0x6e, 0x62, 0x6b, 0x71, 0x69, 0x59, 0x4e, 0x50, 0x57, + 0x6d, 0x66, 0x5d, 0x5a, 0x5c, 0x5d, 0x5a, 0x57, 0x45, 0x44, 0x34, 0x70, + 0x72, 0x63, 0x31, 0x0c, 0x75, 0xeb, 0xff, 0x98, 0x71, 0x73, 0x4b, 0x3c, + 0x4f, 0x5f, 0x53, 0x31, 0x33, 0x64, 0x92, 0xa1, 0xcc, 0xd4, 0xf9, 0x73, + 0x4b, 0x3d, 0x20, 0x32, 0x75, 0xb3, 0x3e, 0x3e, 0x36, 0x20, 0x28, 0x35, + 0x44, 0x27, 0x65, 0xaa, 0x73, 0xa7, 0xff, 0xc5, 0xae, 0x75, 0x28, 0x32, + 0x37, 0x43, 0x75, 0x56, 0x3f, 0x42, 0x2b, 0x22, 0x36, 0x3b, 0x42, 0x60, + 0xff, 0x86, 0x75, 0xdb, 0xc6, 0x4b, 0x6f, 0xff, 0xfe, 0x86, 0x1c, 0x0a, + 0x24, 0x36, 0x35, 0x2c, 0x39, 0x1a, 0x22, 0x2d, 0x2b, 0x5c, 0x8a, 0x79, + 0xa9, 0x9e, 0xd4, 0xdb, 0x95, 0xa1, 0xeb, 0xf9, 0xe6, 0xbd, 0x8b, 0x6c, + 0x5e, 0x4b, 0x2a, 0x0e, 0xc3, 0xca, 0xbb, 0xd1, 0x72, 0x27, 0x99, 0xd2, + 0xcc, 0xc7, 0xc2, 0xc1, 0xc6, 0xcc, 0xcf, 0xd0, 0xcb, 0xca, 0xca, 0xcd, + 0xcf, 0xce, 0xce, 0xce, 0xd2, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdb, 0xdc, + 0xda, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe3, 0xe4, 0xde, 0xde, 0xe2, 0xad, 0x7c, 0xc2, 0xe4, 0xd4, 0xbb, 0xce, + 0xc6, 0xa9, 0xac, 0x9a, 0xaf, 0xd8, 0xa8, 0xbe, 0xe2, 0xb8, 0xb5, 0xbd, + 0xbc, 0xf0, 0xbe, 0xa1, 0xd2, 0xc0, 0xd5, 0xc9, 0xaf, 0xc3, 0xd7, 0xdc, + 0xd8, 0xd6, 0xd7, 0xd9, 0xc0, 0xd4, 0xd1, 0xcd, 0xec, 0xcf, 0xbf, 0x90, + 0x73, 0x7b, 0x70, 0x71, 0x52, 0x63, 0x6a, 0x7b, 0xb4, 0xf2, 0xf7, 0xa2, + 0x54, 0x49, 0x63, 0x77, 0x76, 0x88, 0x89, 0x52, 0x1e, 0x1b, 0x25, 0x2e, + 0x4b, 0x43, 0x39, 0x36, 0x3f, 0x45, 0x3a, 0x2a, 0x24, 0x40, 0x33, 0x3e, + 0x7a, 0x84, 0x6d, 0x7c, 0x5b, 0x4f, 0x4d, 0x54, 0x4f, 0x3d, 0x38, 0x41, + 0x1b, 0x4a, 0x88, 0x7a, 0x45, 0x35, 0x5b, 0xa4, 0x79, 0x55, 0x43, 0x5d, + 0x6e, 0x58, 0x4a, 0x5b, 0x3f, 0x4f, 0x5e, 0x33, 0x40, 0x62, 0x32, 0x1e, + 0x23, 0x2f, 0x3a, 0x59, 0x77, 0x77, 0x54, 0x23, 0x39, 0x41, 0x33, 0x32, + 0x4f, 0x56, 0x41, 0x35, 0x29, 0x20, 0x24, 0x42, 0x69, 0x81, 0x93, 0xa3, + 0x8b, 0x85, 0x75, 0x73, 0x7d, 0x79, 0x6f, 0x71, 0x71, 0x70, 0x6f, 0x6c, + 0x67, 0x61, 0x5c, 0x59, 0x6c, 0x68, 0x66, 0x68, 0x6c, 0x6c, 0x67, 0x62, + 0x66, 0x73, 0x82, 0x86, 0x7d, 0x6e, 0x62, 0x5c, 0x75, 0x7a, 0x7b, 0x6f, + 0x60, 0x5b, 0x64, 0x6f, 0x6a, 0x64, 0x5c, 0x55, 0x51, 0x4d, 0x4b, 0x49, + 0x4b, 0x46, 0x40, 0x3b, 0x20, 0x1b, 0xbc, 0xef, 0xb3, 0x75, 0x5a, 0xa3, + 0xc0, 0x6f, 0x3c, 0x4b, 0x6b, 0x46, 0x54, 0x98, 0xb4, 0x87, 0x55, 0x49, + 0x1e, 0x40, 0x4e, 0x19, 0x31, 0x22, 0x1b, 0x87, 0xfe, 0xb6, 0x0e, 0x4e, + 0x3e, 0x05, 0x39, 0x44, 0x3f, 0x59, 0xdc, 0xdb, 0x6a, 0x42, 0x3f, 0x4e, + 0x8d, 0x3b, 0x0e, 0x3c, 0x71, 0x4a, 0x1e, 0x46, 0x3a, 0x19, 0x1b, 0x29, + 0x3d, 0x77, 0x7b, 0x2f, 0x57, 0x20, 0x19, 0x4e, 0x5e, 0x34, 0x21, 0x36, + 0x0f, 0x20, 0x16, 0x46, 0x9a, 0x84, 0x4d, 0x61, 0x00, 0x4f, 0xa2, 0x93, + 0x3f, 0x1d, 0x39, 0x51, 0x16, 0x4d, 0x77, 0x3a, 0x0b, 0x7a, 0xd7, 0xaa, + 0x83, 0x6a, 0x4e, 0x44, 0x44, 0x36, 0x17, 0x00, 0xc1, 0xc8, 0xbc, 0xc8, + 0x69, 0x2c, 0x9f, 0xd0, 0xce, 0xc8, 0xc2, 0xc3, 0xc9, 0xcf, 0xcf, 0xcd, + 0xca, 0xcc, 0xcd, 0xcf, 0xd2, 0xd3, 0xd2, 0xd0, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd7, 0xd9, 0xda, 0xda, 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xd4, 0xde, 0xd6, 0xd8, 0xdf, 0xcf, 0x64, 0x6a, + 0xe3, 0xbb, 0xb8, 0xe5, 0xcb, 0xa3, 0xab, 0x8d, 0xcd, 0xcb, 0x82, 0xc4, + 0xf7, 0xb4, 0xb5, 0xb9, 0xb5, 0xfc, 0x91, 0xa8, 0xd5, 0xcb, 0xdd, 0xc4, + 0xa2, 0xca, 0xe6, 0xe2, 0xd9, 0xde, 0xe0, 0xda, 0xc6, 0xc7, 0xcf, 0xc9, + 0xc9, 0xc4, 0xd4, 0xb1, 0x79, 0x67, 0x60, 0x6c, 0x5b, 0x75, 0x84, 0x85, + 0x73, 0x96, 0x73, 0x36, 0x35, 0x41, 0x38, 0x35, 0x2f, 0x4c, 0x94, 0x6d, + 0x34, 0x49, 0x48, 0x45, 0x23, 0x4a, 0x5b, 0x3e, 0x22, 0x26, 0x37, 0x3d, + 0x4b, 0x4e, 0x51, 0x82, 0xb7, 0x96, 0x65, 0x71, 0x40, 0x3d, 0x42, 0x47, + 0x3a, 0x29, 0x2f, 0x43, 0x48, 0x5e, 0x62, 0x62, 0x3d, 0x25, 0x67, 0xa5, + 0x4a, 0x4e, 0x40, 0x4c, 0x65, 0x4b, 0x40, 0x70, 0x73, 0x58, 0x5a, 0x3e, + 0x32, 0x4a, 0x40, 0x37, 0x18, 0x3a, 0x45, 0x79, 0x76, 0x49, 0x56, 0x4c, + 0x51, 0x75, 0x5e, 0x29, 0x27, 0x40, 0x40, 0x37, 0x67, 0x90, 0x83, 0x72, + 0x90, 0x93, 0x7b, 0x81, 0x5d, 0x6a, 0x76, 0x81, 0x7d, 0x66, 0x65, 0x81, + 0x6e, 0x6e, 0x6a, 0x5e, 0x55, 0x57, 0x65, 0x73, 0x76, 0x6f, 0x68, 0x6b, + 0x77, 0x86, 0x92, 0x97, 0x8e, 0x8b, 0x81, 0x75, 0x6c, 0x6e, 0x7a, 0x85, + 0x76, 0x78, 0x74, 0x67, 0x58, 0x57, 0x66, 0x75, 0x77, 0x74, 0x6d, 0x62, + 0x56, 0x4f, 0x4e, 0x4f, 0x46, 0x3c, 0x42, 0x45, 0x4c, 0x39, 0x5a, 0x23, + 0x14, 0x3d, 0x62, 0xa9, 0x82, 0x33, 0x55, 0x58, 0xab, 0x45, 0x12, 0x3d, + 0x58, 0x39, 0x2f, 0x4e, 0x73, 0x46, 0x1f, 0x3c, 0x43, 0x22, 0x0b, 0x47, + 0x22, 0x2f, 0x41, 0x38, 0x1b, 0x22, 0x18, 0x5d, 0x46, 0x1a, 0x6a, 0xdc, + 0xff, 0x9e, 0x20, 0x2f, 0x65, 0x6c, 0xba, 0x91, 0x55, 0x74, 0x74, 0x77, + 0x3d, 0x6d, 0x68, 0x3a, 0x43, 0x72, 0x72, 0x4e, 0x1c, 0x37, 0x3e, 0x2c, + 0x2c, 0x3f, 0x3f, 0x29, 0x2d, 0x65, 0x40, 0x13, 0x40, 0x57, 0x3c, 0x3d, + 0xe5, 0xeb, 0xf5, 0xef, 0xa9, 0x46, 0x45, 0x99, 0x62, 0x1d, 0x1b, 0x31, + 0x1e, 0x32, 0x63, 0x6b, 0x38, 0x2e, 0x28, 0x31, 0x3d, 0x37, 0x1d, 0x04, + 0xbf, 0xc4, 0xbd, 0xbd, 0x5c, 0x34, 0xa6, 0xcd, 0xc5, 0xc5, 0xc6, 0xc6, + 0xc6, 0xc4, 0xc3, 0xc1, 0xc9, 0xcf, 0xd2, 0xcf, 0xce, 0xd2, 0xd4, 0xd2, + 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xda, + 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xe5, 0xdc, 0xde, 0xe0, + 0xde, 0xf1, 0xaa, 0x62, 0xba, 0xb9, 0xc4, 0xe7, 0xc7, 0x97, 0x9e, 0x8f, + 0xdc, 0xbb, 0x7f, 0xd2, 0xe7, 0xad, 0xcb, 0xb1, 0xc6, 0xff, 0x78, 0xc7, + 0xe1, 0xc7, 0xc2, 0xa1, 0xbb, 0xd1, 0xe1, 0xe0, 0xdd, 0xdf, 0xdf, 0xda, + 0xd9, 0xc5, 0xd2, 0xd8, 0xc4, 0xc4, 0xd3, 0xb7, 0x87, 0x68, 0x53, 0x55, + 0x56, 0x6f, 0x88, 0x93, 0x74, 0x8e, 0x6a, 0x49, 0x5c, 0x55, 0x49, 0x6c, + 0x52, 0x4f, 0x99, 0x5e, 0x16, 0x41, 0x41, 0x3c, 0x2b, 0x51, 0x5d, 0x42, + 0x3a, 0x53, 0x5e, 0x51, 0x76, 0x71, 0x6b, 0x80, 0x86, 0x4f, 0x24, 0x36, + 0x41, 0x4a, 0x58, 0x57, 0x3e, 0x2c, 0x40, 0x63, 0x64, 0x69, 0x73, 0x68, + 0x3d, 0x25, 0x53, 0x98, 0x5b, 0x6b, 0x71, 0x77, 0x72, 0x4c, 0x3c, 0x59, + 0x50, 0x3a, 0x6b, 0x95, 0x7d, 0x60, 0x46, 0x2b, 0x4f, 0x44, 0x3f, 0x70, + 0x80, 0x69, 0x7c, 0x8b, 0x65, 0x27, 0x1b, 0x4e, 0x70, 0x6e, 0x66, 0x61, + 0x75, 0x8c, 0x8b, 0x7f, 0x7e, 0x79, 0x8e, 0xbc, 0xc6, 0xae, 0x81, 0x77, + 0x92, 0x8c, 0x77, 0x7f, 0x61, 0x61, 0x5f, 0x58, 0x55, 0x5e, 0x71, 0x82, + 0x7e, 0x7a, 0x77, 0x76, 0x74, 0x6c, 0x60, 0x56, 0x62, 0x65, 0x66, 0x63, + 0x5e, 0x5f, 0x67, 0x6e, 0x6d, 0x6f, 0x69, 0x58, 0x44, 0x3c, 0x44, 0x4f, + 0x70, 0x6f, 0x6a, 0x5f, 0x53, 0x4d, 0x4d, 0x50, 0x66, 0x51, 0x3f, 0x37, + 0x2e, 0x58, 0x54, 0x96, 0xc3, 0xc5, 0x4c, 0x18, 0x26, 0x80, 0xbf, 0x1b, + 0x2c, 0x23, 0x23, 0x2d, 0x31, 0x2f, 0x36, 0x44, 0x2e, 0x1c, 0x20, 0xc0, + 0xff, 0xf2, 0x9d, 0x6b, 0x4f, 0x55, 0x13, 0x1e, 0x11, 0x0a, 0x39, 0x0f, + 0x83, 0xea, 0xfc, 0xf1, 0xb3, 0x4e, 0x3b, 0x3f, 0x02, 0xb9, 0xe7, 0x6d, + 0x62, 0x80, 0x45, 0x37, 0x5f, 0x74, 0x59, 0x6f, 0xec, 0xff, 0xe0, 0x80, + 0x34, 0x2d, 0x1f, 0x19, 0x2a, 0x42, 0x43, 0x33, 0x44, 0x43, 0x3f, 0x32, + 0x27, 0x31, 0x3b, 0x37, 0x85, 0x9b, 0x61, 0x22, 0x35, 0x45, 0x2d, 0x25, + 0x38, 0x28, 0x4c, 0x73, 0x6d, 0x6d, 0x6b, 0x4f, 0x2c, 0x25, 0x21, 0x28, + 0x32, 0x30, 0x21, 0x11, 0xbd, 0xc1, 0xbf, 0xb1, 0x4f, 0x3c, 0xae, 0xca, + 0xbf, 0xc3, 0xc5, 0xc2, 0xbd, 0xbd, 0xc5, 0xcc, 0xbd, 0xce, 0xd6, 0xcf, + 0xc8, 0xcc, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd1, 0xda, 0xd8, 0xd6, 0xe2, 0xd8, 0x66, 0x92, 0xd7, 0xe7, 0xe8, + 0xcc, 0x9b, 0xa5, 0xb9, 0xd9, 0xaf, 0x9e, 0xdc, 0xbf, 0xa9, 0xe3, 0xac, + 0xc5, 0xef, 0x78, 0xde, 0xd5, 0xb4, 0xb4, 0xb4, 0xe7, 0xd7, 0xd0, 0xd9, + 0xdf, 0xdb, 0xd6, 0xd7, 0xd9, 0xca, 0xbf, 0xc9, 0xd3, 0xd0, 0xbe, 0xc5, + 0x70, 0x89, 0x99, 0x8c, 0x7a, 0x6e, 0x95, 0xcf, 0xcb, 0xcf, 0x75, 0x23, + 0x3c, 0x54, 0x3f, 0x3a, 0x49, 0x4c, 0xa1, 0x6f, 0x25, 0x47, 0x48, 0x4a, + 0x30, 0x56, 0x62, 0x49, 0x42, 0x5b, 0x67, 0x5b, 0x7a, 0x76, 0x65, 0x5f, + 0x64, 0x5d, 0x5c, 0x6f, 0x41, 0x3a, 0x3b, 0x3e, 0x34, 0x29, 0x35, 0x4d, + 0x2d, 0x43, 0x8d, 0x69, 0x2f, 0x31, 0x53, 0xc1, 0x65, 0x4d, 0x5a, 0x76, + 0x78, 0x74, 0x6c, 0x55, 0x62, 0x56, 0x5d, 0x61, 0x4e, 0x65, 0x8a, 0x75, + 0x70, 0x75, 0x85, 0x64, 0x4d, 0x5a, 0x64, 0x81, 0x76, 0x4a, 0x62, 0x91, + 0x9d, 0xb6, 0xb7, 0x80, 0x81, 0x66, 0x91, 0xc3, 0xa2, 0x84, 0xab, 0xdb, + 0x81, 0x92, 0xab, 0xbd, 0xc1, 0xb2, 0x8a, 0x5e, 0x5f, 0x64, 0x6a, 0x6c, + 0x6a, 0x66, 0x62, 0x5f, 0x79, 0x6d, 0x5e, 0x57, 0x59, 0x60, 0x66, 0x68, + 0x67, 0x67, 0x63, 0x5c, 0x58, 0x5c, 0x68, 0x73, 0x3a, 0x46, 0x52, 0x53, + 0x4f, 0x50, 0x5b, 0x67, 0x72, 0x70, 0x6b, 0x65, 0x60, 0x5e, 0x5f, 0x61, + 0x55, 0x50, 0x46, 0x48, 0x4c, 0x61, 0x1b, 0x24, 0x2d, 0xb8, 0xcb, 0x97, + 0x23, 0x1e, 0x9a, 0x6c, 0x53, 0x9c, 0xde, 0xe3, 0xbf, 0x90, 0x5e, 0x36, + 0x8d, 0xfb, 0xe9, 0xff, 0xe7, 0xad, 0x8f, 0xbf, 0x49, 0x39, 0x7e, 0x64, + 0x70, 0x73, 0x39, 0x82, 0xff, 0xd0, 0x4f, 0x1a, 0x28, 0x45, 0x58, 0x1b, + 0x16, 0x55, 0x45, 0x2d, 0x22, 0x24, 0x6a, 0xa6, 0x35, 0x28, 0x43, 0x60, + 0x6e, 0x8d, 0x81, 0x3d, 0x1f, 0x17, 0x23, 0x3c, 0x3b, 0x23, 0x19, 0x24, + 0x43, 0x74, 0x95, 0x7a, 0x4a, 0x3c, 0x3d, 0x34, 0x00, 0x55, 0x69, 0x3f, + 0x39, 0x3d, 0x43, 0x63, 0x89, 0x8f, 0x7a, 0x36, 0x09, 0x2d, 0x5a, 0x56, + 0x44, 0x37, 0x26, 0x1b, 0x18, 0x16, 0x11, 0x0c, 0xbb, 0xbd, 0xc0, 0xa5, + 0x43, 0x44, 0xb5, 0xc7, 0xc2, 0xc0, 0xbd, 0xba, 0xbb, 0xc3, 0xcf, 0xd9, + 0x9b, 0xbf, 0xda, 0xd5, 0xc7, 0xc8, 0xcf, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xd7, 0xdf, 0xe2, 0xdd, 0xe4, 0xd8, 0xe5, 0x87, + 0x58, 0x93, 0xba, 0xf1, 0xd3, 0x61, 0x67, 0xbe, 0xd0, 0xac, 0xbd, 0xd4, + 0xa6, 0xb1, 0xe0, 0xb3, 0xb3, 0xc5, 0x90, 0xdd, 0xaf, 0xa8, 0xc1, 0xe8, + 0xfc, 0xda, 0xc7, 0xd2, 0xde, 0xd7, 0xd0, 0xd3, 0xd2, 0xdb, 0xdc, 0xd1, + 0xc6, 0xde, 0xab, 0x77, 0x73, 0x65, 0x54, 0x44, 0x55, 0x3a, 0x3b, 0x51, + 0xa4, 0xb1, 0x7a, 0x37, 0x35, 0x44, 0x4b, 0x5b, 0x58, 0x3e, 0x5f, 0x42, + 0x21, 0x3d, 0x3c, 0x3c, 0x30, 0x59, 0x6b, 0x51, 0x37, 0x3e, 0x51, 0x58, + 0x59, 0x60, 0x5d, 0x5c, 0x6c, 0x7f, 0x7e, 0x71, 0x6f, 0x4f, 0x3b, 0x43, + 0x50, 0x4e, 0x4a, 0x4d, 0x4b, 0x4e, 0x92, 0x5f, 0x39, 0x4e, 0x3c, 0x7b, + 0x81, 0x62, 0x69, 0x6e, 0x51, 0x54, 0x60, 0x47, 0x6e, 0x76, 0x70, 0x78, + 0x68, 0x5f, 0x7a, 0x6c, 0x89, 0x59, 0x63, 0x68, 0x8d, 0xaf, 0x8f, 0x95, + 0xca, 0xbb, 0xb6, 0x89, 0x5a, 0x8c, 0xce, 0xc4, 0xf4, 0xd9, 0xa7, 0xa3, + 0xcc, 0xc4, 0x96, 0x84, 0x3a, 0x64, 0xb1, 0xbf, 0x8c, 0x86, 0x94, 0x79, + 0x6a, 0x6c, 0x6e, 0x6e, 0x6b, 0x66, 0x61, 0x5e, 0x69, 0x67, 0x66, 0x6a, + 0x6d, 0x6c, 0x64, 0x5d, 0x5a, 0x62, 0x69, 0x68, 0x5f, 0x56, 0x51, 0x51, + 0x5c, 0x67, 0x70, 0x6b, 0x5e, 0x55, 0x58, 0x5f, 0x5c, 0x55, 0x4e, 0x4e, + 0x53, 0x57, 0x55, 0x52, 0x54, 0x46, 0x3b, 0x38, 0x3d, 0x12, 0x35, 0x2a, + 0x70, 0x76, 0x4f, 0x59, 0x45, 0x31, 0x54, 0x2a, 0x2e, 0x32, 0x40, 0x4b, + 0x45, 0x39, 0x42, 0x56, 0x29, 0x79, 0x5e, 0x4d, 0x36, 0x1b, 0x1b, 0x2c, + 0x6a, 0x12, 0x2e, 0x89, 0x5c, 0x22, 0xad, 0xe4, 0x6d, 0x26, 0x43, 0x51, + 0x3b, 0x33, 0x27, 0x47, 0x26, 0x00, 0x6e, 0xff, 0x96, 0x27, 0x57, 0x2c, + 0x57, 0x3c, 0x2f, 0x32, 0x30, 0x33, 0x3f, 0x45, 0x0e, 0x2f, 0x62, 0x84, + 0x7f, 0x73, 0x87, 0xab, 0x2b, 0x60, 0x5f, 0x4c, 0x41, 0x17, 0x37, 0xb3, + 0xe4, 0x9a, 0x64, 0x7a, 0x8e, 0x65, 0x4f, 0x70, 0x59, 0x28, 0x1d, 0x45, + 0x58, 0x4b, 0x51, 0x6b, 0x68, 0x5a, 0x44, 0x2e, 0x1f, 0x18, 0x17, 0x17, + 0xb9, 0xbb, 0xc1, 0x9d, 0x39, 0x49, 0xbb, 0xc5, 0xc7, 0xbd, 0xb6, 0xbb, + 0xc6, 0xca, 0xc2, 0xb7, 0x6d, 0xa8, 0xdb, 0xe0, 0xcf, 0xca, 0xce, 0xd0, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd6, 0xd6, 0xd7, 0xd8, + 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xd5, 0xdd, 0xd2, 0xd4, + 0xd6, 0xd8, 0xe8, 0xc8, 0x7e, 0x90, 0xb6, 0xf9, 0xce, 0x6b, 0x93, 0xf3, + 0xce, 0xb2, 0xc6, 0xbb, 0xaf, 0xc2, 0xc0, 0xc6, 0xbb, 0xab, 0xb7, 0xd2, + 0x94, 0xb6, 0xc2, 0xda, 0xe9, 0xda, 0xcf, 0xd1, 0xd8, 0xd9, 0xd2, 0xcd, + 0xd7, 0xcd, 0xc7, 0xac, 0x95, 0xe8, 0xde, 0xa8, 0x84, 0x62, 0x4e, 0x2f, + 0x34, 0x26, 0x51, 0x78, 0xb0, 0x86, 0x70, 0x7f, 0x78, 0x49, 0x2f, 0x3c, + 0x2e, 0x1d, 0x2f, 0x4f, 0x67, 0x67, 0x4c, 0x39, 0x5f, 0x59, 0x51, 0x53, + 0x5f, 0x69, 0x61, 0x52, 0x59, 0x69, 0x77, 0x73, 0x6a, 0x6d, 0x6a, 0x5b, + 0x6b, 0x52, 0x41, 0x42, 0x42, 0x3b, 0x3e, 0x4a, 0x43, 0x4a, 0x6f, 0x6c, + 0x88, 0xa8, 0x6e, 0x45, 0x6e, 0x79, 0x84, 0x7b, 0x65, 0x64, 0x73, 0x7b, + 0x81, 0xa9, 0x91, 0x90, 0x8b, 0x74, 0x85, 0x7c, 0xad, 0x99, 0xab, 0xc9, + 0xc8, 0xb1, 0xb0, 0xd4, 0xe2, 0xb6, 0xb4, 0xd7, 0xba, 0x57, 0x28, 0x44, + 0x78, 0xc7, 0xa7, 0x6b, 0x96, 0xc1, 0xca, 0xed, 0xff, 0xff, 0xfa, 0xea, + 0xd2, 0xb1, 0x8b, 0x6f, 0x6c, 0x70, 0x6f, 0x67, 0x5f, 0x61, 0x70, 0x7e, + 0x93, 0x89, 0x7d, 0x77, 0x79, 0x7d, 0x7e, 0x7e, 0x7e, 0x7b, 0x74, 0x68, + 0x5f, 0x60, 0x6b, 0x74, 0x74, 0x7a, 0x7c, 0x71, 0x60, 0x58, 0x5e, 0x67, + 0x64, 0x55, 0x49, 0x4c, 0x5b, 0x63, 0x5c, 0x51, 0x48, 0x3f, 0x4c, 0x95, + 0xa9, 0x40, 0x4d, 0x46, 0x4e, 0x4a, 0x25, 0x23, 0x41, 0x4f, 0x5d, 0x65, + 0x56, 0x2f, 0x1c, 0x27, 0x26, 0x1c, 0x37, 0x65, 0x2f, 0x3d, 0x49, 0x4e, + 0x53, 0x38, 0x37, 0x1d, 0x49, 0xce, 0xc5, 0x3a, 0x78, 0x72, 0x36, 0x61, + 0x3b, 0x18, 0x31, 0x25, 0x21, 0x3f, 0x32, 0x38, 0x1f, 0x19, 0x13, 0x31, + 0x3b, 0x15, 0x06, 0x14, 0x48, 0x4d, 0x32, 0x33, 0x4f, 0x2c, 0x01, 0x14, + 0x2f, 0x23, 0x1c, 0x27, 0x37, 0x3d, 0x37, 0x2f, 0x7d, 0x4e, 0x4e, 0xb0, + 0xca, 0x51, 0x54, 0xff, 0xd6, 0xc8, 0xa7, 0x60, 0x19, 0x1a, 0x44, 0x59, + 0x33, 0x1a, 0x18, 0x46, 0x78, 0x7c, 0x6b, 0x68, 0x60, 0x5c, 0x52, 0x43, + 0x32, 0x26, 0x20, 0x1f, 0xb9, 0xb9, 0xc2, 0x98, 0x34, 0x4c, 0xbe, 0xc3, + 0xc7, 0xba, 0xb5, 0xc3, 0xd4, 0xcb, 0xa6, 0x82, 0x4a, 0x95, 0xdc, 0xe9, + 0xd7, 0xcd, 0xce, 0xcf, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, + 0xd5, 0xd6, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd6, 0xd7, 0xd3, 0xe5, 0xcd, 0xd8, 0xd0, 0xcc, 0x89, 0xa5, 0xa2, 0x80, + 0x48, 0x6a, 0xd8, 0xf3, 0xd0, 0xb8, 0xc1, 0xa5, 0xc3, 0xd1, 0x9f, 0xd7, + 0xaa, 0x82, 0xbb, 0xc3, 0x9b, 0xe7, 0xd9, 0xc8, 0xcc, 0xd9, 0xdc, 0xd3, + 0xd3, 0xdc, 0xd8, 0xc9, 0xd6, 0xc9, 0xc4, 0xd1, 0xca, 0xe0, 0xb1, 0xb2, + 0x96, 0x5d, 0x55, 0x4d, 0x5e, 0x57, 0x7b, 0x81, 0x50, 0x51, 0x85, 0xac, + 0x73, 0x27, 0x33, 0x70, 0x5e, 0x55, 0x42, 0x52, 0x59, 0x3f, 0x40, 0x54, + 0x41, 0x40, 0x46, 0x51, 0x57, 0x57, 0x5d, 0x67, 0x59, 0x66, 0x72, 0x5c, + 0x36, 0x37, 0x5f, 0x7d, 0x63, 0x67, 0x6a, 0x5c, 0x39, 0x25, 0x3f, 0x69, + 0xa3, 0xad, 0x8d, 0x75, 0x84, 0x96, 0x76, 0x28, 0x69, 0x7e, 0x71, 0x6a, + 0x82, 0x76, 0x52, 0x4f, 0x71, 0xdd, 0xab, 0x65, 0x79, 0xb7, 0xe5, 0xbe, + 0xab, 0xd1, 0xcd, 0xd1, 0xb5, 0x96, 0xb6, 0xb9, 0xb3, 0xc4, 0xb4, 0xbd, + 0xc6, 0x78, 0x48, 0x81, 0x82, 0xa4, 0xdc, 0xed, 0xd1, 0xaf, 0x74, 0x29, + 0x0b, 0x29, 0x0f, 0x32, 0x9a, 0x8f, 0x52, 0x6c, 0x64, 0x73, 0x7c, 0x72, + 0x60, 0x5d, 0x6e, 0x82, 0x82, 0x7a, 0x71, 0x6c, 0x6b, 0x68, 0x62, 0x5c, + 0x5c, 0x69, 0x78, 0x7e, 0x7a, 0x71, 0x6a, 0x68, 0x7b, 0x7d, 0x77, 0x66, + 0x54, 0x4e, 0x59, 0x66, 0x69, 0x55, 0x44, 0x49, 0x5d, 0x66, 0x5b, 0x4b, + 0x4b, 0x60, 0x2f, 0x70, 0xd8, 0xff, 0xac, 0x51, 0x15, 0x2f, 0x2e, 0x1a, + 0x2a, 0x26, 0x1f, 0x5b, 0x23, 0x31, 0x51, 0x6a, 0x59, 0x2e, 0x19, 0x1f, + 0x2b, 0x38, 0x46, 0x56, 0xa1, 0x5b, 0x28, 0x2a, 0x40, 0x39, 0x23, 0x15, + 0x41, 0x39, 0x63, 0x3e, 0x41, 0x57, 0x4d, 0x69, 0x50, 0x11, 0x25, 0x38, + 0x36, 0x7c, 0x96, 0x40, 0x2c, 0x44, 0x39, 0x71, 0x9a, 0x6e, 0x68, 0x7b, + 0x79, 0x6c, 0x4b, 0x1a, 0x26, 0x1a, 0x16, 0x20, 0x27, 0x25, 0x25, 0x2b, + 0x34, 0x43, 0x6b, 0xa1, 0xc9, 0xcd, 0x9f, 0x64, 0x50, 0x47, 0x68, 0x73, + 0x56, 0x61, 0x71, 0x51, 0x29, 0x53, 0x82, 0x95, 0x76, 0x38, 0x21, 0x3b, + 0x2d, 0x35, 0x3b, 0x37, 0x2a, 0x1a, 0x0f, 0x0a, 0xc0, 0xba, 0xca, 0x8d, + 0x25, 0x6c, 0xbd, 0xc6, 0xc3, 0xbc, 0xcc, 0xd1, 0xc1, 0xab, 0x29, 0x16, + 0x1d, 0x0e, 0x3e, 0xb2, 0xc8, 0xce, 0xd8, 0xd1, 0xcd, 0xce, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd7, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xda, 0xda, 0xda, + 0xda, 0xda, 0xda, 0xda, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0x99, 0x77, 0xb4, 0x5f, 0x34, 0x55, 0x92, 0x6e, 0x82, 0x9e, 0xc2, 0xd7, + 0xd2, 0xc1, 0xb7, 0xb8, 0xae, 0x9c, 0xc8, 0xae, 0xd7, 0xde, 0xd7, 0xcf, + 0xce, 0xd1, 0xd6, 0xda, 0xda, 0xd8, 0xd4, 0xd1, 0xdd, 0xbe, 0xc0, 0xcd, + 0xa4, 0xb1, 0xd9, 0x9e, 0x73, 0x7b, 0x4b, 0x35, 0x43, 0x58, 0x77, 0x76, + 0x43, 0x2e, 0x80, 0x6e, 0x3e, 0x5d, 0x5c, 0x67, 0x5b, 0x68, 0x61, 0x60, + 0x67, 0x50, 0x46, 0x67, 0x51, 0x69, 0x66, 0x55, 0x53, 0x45, 0x30, 0x31, + 0x2c, 0x1a, 0x4e, 0x58, 0x61, 0x7a, 0x50, 0x38, 0x50, 0x6b, 0x5c, 0x35, + 0x42, 0x7d, 0xad, 0xc1, 0x97, 0x9b, 0xa3, 0x6e, 0x71, 0xc1, 0xc2, 0x92, + 0x34, 0x66, 0x62, 0xa4, 0xc8, 0xbf, 0xe0, 0xb6, 0xad, 0xd4, 0x84, 0x73, + 0xd3, 0xd0, 0x8b, 0x7d, 0xc7, 0x66, 0x56, 0xa5, 0xdd, 0xe1, 0xc3, 0x9b, + 0xaf, 0x5c, 0x3d, 0x93, 0xaf, 0xc0, 0xff, 0xde, 0x96, 0x80, 0x37, 0x25, + 0x27, 0x17, 0x29, 0x2e, 0x36, 0x2c, 0x24, 0x34, 0x2b, 0x25, 0x45, 0x50, + 0x70, 0x73, 0x77, 0x78, 0x73, 0x6a, 0x60, 0x5a, 0x6a, 0x6e, 0x6e, 0x67, + 0x5d, 0x59, 0x5c, 0x61, 0x5c, 0x64, 0x74, 0x84, 0x8c, 0x83, 0x6f, 0x5f, + 0x81, 0x8a, 0x88, 0x74, 0x63, 0x5c, 0x56, 0x4d, 0x5d, 0x57, 0x53, 0x55, + 0x5a, 0x58, 0x4d, 0x43, 0x47, 0x40, 0x3e, 0x44, 0x29, 0x2a, 0x65, 0x80, + 0x31, 0x26, 0x1b, 0x1e, 0x29, 0x30, 0x2d, 0x26, 0x42, 0x3a, 0x2e, 0x25, + 0x22, 0x25, 0x2b, 0x2e, 0x22, 0x4f, 0x8b, 0x72, 0x30, 0x43, 0x55, 0x1a, + 0x3b, 0x27, 0x16, 0x23, 0x3a, 0x35, 0x22, 0x20, 0x15, 0x44, 0x4d, 0x3c, + 0x31, 0x17, 0x0f, 0x2e, 0x3a, 0x5a, 0x62, 0x3e, 0x21, 0x26, 0x35, 0x38, + 0x54, 0x42, 0x4f, 0x72, 0x70, 0x50, 0x51, 0x73, 0x77, 0x99, 0x65, 0x39, + 0x5e, 0x58, 0x2e, 0x36, 0x69, 0x5f, 0x4c, 0x36, 0x2a, 0x32, 0x4a, 0x5e, + 0x3d, 0x38, 0x3e, 0x4a, 0x4d, 0x4d, 0x5e, 0x74, 0x54, 0x34, 0x21, 0x25, + 0x21, 0x1a, 0x30, 0x54, 0x5f, 0x56, 0x61, 0x40, 0x3b, 0x49, 0x1e, 0x0c, + 0xbd, 0xbc, 0xcd, 0x92, 0x2e, 0x74, 0xbf, 0xc4, 0xc6, 0xc7, 0xca, 0xc4, + 0xc2, 0xc7, 0x91, 0xcb, 0xda, 0xc1, 0x9b, 0xb8, 0xca, 0xdc, 0xd7, 0xc8, + 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd4, + 0xd4, 0xd5, 0xd6, 0xd6, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xa4, 0x62, 0xc0, 0x7b, 0x51, 0x9a, 0x8a, 0x64, + 0xca, 0xbb, 0xc8, 0xe7, 0xdd, 0xb2, 0xa5, 0xba, 0xb7, 0x76, 0xa7, 0xc1, + 0xe1, 0xd6, 0xd8, 0xda, 0xed, 0xda, 0xc7, 0xc5, 0xd1, 0xdd, 0xdc, 0xd7, + 0xca, 0xbc, 0xc4, 0xb3, 0xaa, 0xd1, 0xbf, 0x67, 0x58, 0x88, 0x93, 0x64, + 0x42, 0x40, 0x4c, 0x61, 0x94, 0x2d, 0x2c, 0x52, 0x4a, 0x4e, 0x5a, 0x5b, + 0x42, 0x70, 0x75, 0x5e, 0x5d, 0x52, 0x35, 0x28, 0x64, 0x5c, 0x5c, 0x50, + 0x4e, 0x4d, 0x64, 0xb2, 0x9f, 0x57, 0x4e, 0x42, 0x44, 0x61, 0x5c, 0x67, + 0x64, 0x60, 0x75, 0x9d, 0xa9, 0x96, 0x9e, 0xc2, 0x70, 0x39, 0x63, 0x9e, + 0xb1, 0xb8, 0xc2, 0xec, 0xfd, 0xbb, 0xdf, 0xf1, 0xc4, 0xdb, 0xd9, 0x83, + 0x94, 0xad, 0xd5, 0xd6, 0xb3, 0x91, 0x7e, 0x85, 0xb1, 0xaf, 0xd7, 0xe1, + 0x9e, 0x76, 0xad, 0xf3, 0x50, 0x23, 0x34, 0x31, 0x46, 0x77, 0x6e, 0x6e, + 0x38, 0x3d, 0x1d, 0x17, 0x32, 0x3f, 0x39, 0x27, 0x18, 0x2f, 0x51, 0x5e, + 0x64, 0x92, 0xa9, 0x7c, 0x60, 0x76, 0x83, 0x73, 0x54, 0x47, 0x58, 0x70, + 0x88, 0x75, 0x5d, 0x4e, 0x4d, 0x52, 0x56, 0x58, 0x6c, 0x69, 0x66, 0x69, + 0x6e, 0x6e, 0x68, 0x62, 0x7d, 0x84, 0x7e, 0x6a, 0x5e, 0x5f, 0x62, 0x5f, + 0x4e, 0x50, 0x56, 0x60, 0x67, 0x62, 0x53, 0x46, 0x36, 0x3f, 0x2d, 0x2b, + 0x2c, 0x2e, 0x44, 0x47, 0x50, 0x57, 0x54, 0x3d, 0x1e, 0x11, 0x1d, 0x2e, + 0x75, 0x59, 0x37, 0x27, 0x2d, 0x3a, 0x42, 0x43, 0x35, 0x40, 0x49, 0x4b, + 0x51, 0x5b, 0x4a, 0x28, 0x24, 0x3a, 0x21, 0x34, 0x85, 0x91, 0x88, 0xba, + 0x4f, 0x47, 0x8d, 0xc8, 0x8d, 0x38, 0x2e, 0x48, 0x32, 0x31, 0x27, 0x1a, + 0x1d, 0x31, 0x41, 0x45, 0x48, 0x3e, 0x2b, 0x18, 0x19, 0x38, 0x6c, 0x95, + 0x34, 0x3a, 0x27, 0x1e, 0x34, 0x3e, 0x34, 0x34, 0x4a, 0x38, 0x29, 0x2b, + 0x37, 0x36, 0x22, 0x0d, 0x98, 0x66, 0x38, 0x2a, 0x2b, 0x34, 0x52, 0x75, + 0x66, 0x61, 0x57, 0x45, 0x29, 0x1b, 0x2f, 0x4f, 0x2d, 0x2b, 0x41, 0x2b, + 0x2e, 0x40, 0x15, 0x02, 0xbc, 0xbb, 0xc6, 0x87, 0x2b, 0x77, 0xc0, 0xc4, + 0xc5, 0xc5, 0xba, 0xbb, 0xca, 0xbf, 0x87, 0xb3, 0xce, 0xbf, 0xa6, 0xcb, + 0xd3, 0xcb, 0xc3, 0xcd, 0xcb, 0xcc, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd0, + 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd5, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xdc, 0x79, 0xc1, 0x76, + 0x39, 0x9f, 0x63, 0x77, 0xd4, 0xbf, 0xc5, 0xe3, 0xe4, 0xc4, 0xb2, 0xbb, + 0xa2, 0x6e, 0xb1, 0xe0, 0xe2, 0xcb, 0xd3, 0xd1, 0xd7, 0xd4, 0xd2, 0xd4, + 0xd5, 0xd3, 0xcc, 0xc6, 0xc4, 0xab, 0xb7, 0xaf, 0xb5, 0xc3, 0xa0, 0x8e, + 0xa1, 0x6a, 0x51, 0x47, 0x58, 0x52, 0x2b, 0x3b, 0x5b, 0x68, 0x39, 0x43, + 0x6e, 0x50, 0x47, 0x72, 0x6f, 0x72, 0x67, 0x64, 0x69, 0x57, 0x41, 0x42, + 0x48, 0x1a, 0x28, 0x2a, 0x1c, 0x12, 0x50, 0xfa, 0xcd, 0x77, 0x6f, 0x8d, + 0xa0, 0xae, 0xaf, 0xc7, 0xe9, 0xce, 0xc0, 0xc0, 0xb1, 0x97, 0x88, 0x87, + 0xa2, 0xa5, 0xa9, 0x64, 0x46, 0x7e, 0x85, 0x69, 0x41, 0x65, 0xae, 0xc4, + 0xc7, 0xe6, 0xc1, 0x68, 0xbf, 0x9b, 0x6b, 0x15, 0x31, 0x90, 0x94, 0x9b, + 0x87, 0x73, 0x84, 0x95, 0x69, 0x2f, 0x24, 0x32, 0x3b, 0x47, 0x6e, 0x49, + 0x86, 0xcf, 0x5d, 0x12, 0x47, 0x26, 0x1d, 0x30, 0x42, 0x30, 0x20, 0x44, + 0x40, 0x59, 0x44, 0x1e, 0x37, 0x52, 0x4e, 0x63, 0x75, 0x79, 0x77, 0x6a, + 0x5b, 0x5d, 0x6f, 0x82, 0x93, 0x80, 0x68, 0x5a, 0x5c, 0x67, 0x71, 0x76, + 0x81, 0x78, 0x6e, 0x6b, 0x6e, 0x70, 0x6f, 0x6c, 0x61, 0x66, 0x5f, 0x4c, + 0x44, 0x4e, 0x58, 0x5b, 0x63, 0x65, 0x69, 0x6e, 0x6f, 0x68, 0x59, 0x4e, + 0x4c, 0x57, 0x33, 0x28, 0x34, 0x26, 0x22, 0x22, 0x3b, 0x38, 0x35, 0x33, + 0x30, 0x28, 0x1d, 0x14, 0x3e, 0x41, 0x46, 0x49, 0x4a, 0x4b, 0x4e, 0x50, + 0x80, 0x76, 0x40, 0x21, 0x32, 0x31, 0x46, 0x87, 0xed, 0xff, 0xff, 0xe6, + 0x6d, 0x47, 0x94, 0xe0, 0xd2, 0x86, 0x93, 0xd6, 0xbf, 0x73, 0x51, 0x51, + 0x37, 0x29, 0x20, 0x23, 0x24, 0x1f, 0x1f, 0x24, 0x4a, 0x55, 0x51, 0x36, + 0x1b, 0x19, 0x2b, 0x3c, 0x34, 0x1a, 0x1d, 0x2b, 0x28, 0x30, 0x3b, 0x35, + 0x33, 0x30, 0x23, 0x13, 0x13, 0x39, 0x7b, 0xae, 0x98, 0xcd, 0xdb, 0xbc, + 0xbf, 0xd2, 0x9f, 0x45, 0x24, 0x2f, 0x2e, 0x22, 0x20, 0x2d, 0x3a, 0x3e, + 0x30, 0x34, 0x52, 0x44, 0x48, 0x54, 0x22, 0x0a, 0xc7, 0xc6, 0xc5, 0x80, + 0x2f, 0x82, 0xcc, 0xd0, 0xba, 0xc2, 0xc4, 0xc6, 0xcd, 0xc2, 0xa0, 0xa7, + 0xcb, 0xaf, 0xa1, 0xd5, 0xd5, 0xc8, 0xc5, 0xcd, 0xca, 0xca, 0xcb, 0xcb, + 0xcc, 0xcd, 0xce, 0xce, 0xcf, 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd3, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd1, 0x9c, 0xbc, 0x9b, 0x6b, 0xad, 0x69, 0xc7, 0xbc, 0xc4, 0xc8, 0xcb, + 0xd6, 0xdb, 0xc5, 0xa5, 0x57, 0x81, 0xd1, 0xe6, 0xd7, 0xd3, 0xdc, 0xd3, + 0xe7, 0xd8, 0xca, 0xca, 0xd4, 0xd8, 0xcf, 0xc4, 0xbe, 0xb7, 0xb6, 0xb0, + 0xb5, 0xa5, 0x86, 0x93, 0x7f, 0x6c, 0x5d, 0x50, 0x60, 0x5f, 0x38, 0x2e, + 0x65, 0x96, 0x55, 0x25, 0x61, 0x61, 0x46, 0x7d, 0x53, 0x57, 0x5b, 0x56, + 0x3b, 0x1e, 0x2a, 0x51, 0x4e, 0x4f, 0x80, 0x8a, 0xa4, 0xb6, 0xa7, 0xe5, + 0xec, 0x80, 0x56, 0x6f, 0x74, 0x66, 0x6c, 0x87, 0x8a, 0x97, 0xa9, 0x9d, + 0x81, 0x84, 0x93, 0x8e, 0x5e, 0x7c, 0x8d, 0x39, 0x0e, 0x42, 0x3e, 0x0f, + 0xab, 0xaf, 0x5a, 0x72, 0x97, 0x7e, 0x9d, 0x9a, 0x9d, 0x73, 0xa5, 0xb7, + 0xda, 0xdd, 0x84, 0x8c, 0x7b, 0x50, 0x32, 0x29, 0x1f, 0x30, 0x76, 0xbe, + 0x71, 0x6c, 0x6e, 0x5e, 0x7e, 0x97, 0x60, 0x41, 0x27, 0x3f, 0x64, 0x50, + 0x39, 0x32, 0x38, 0x7a, 0x81, 0x76, 0x3e, 0x1b, 0x4e, 0x65, 0x51, 0x77, + 0x76, 0x68, 0x59, 0x57, 0x62, 0x70, 0x77, 0x78, 0x78, 0x79, 0x76, 0x6f, + 0x67, 0x67, 0x70, 0x79, 0x7b, 0x7a, 0x7a, 0x7f, 0x83, 0x7f, 0x75, 0x6c, + 0x76, 0x7e, 0x7a, 0x6a, 0x62, 0x6b, 0x74, 0x75, 0x5e, 0x5b, 0x58, 0x56, + 0x55, 0x53, 0x50, 0x4e, 0x3b, 0x3f, 0x26, 0x2a, 0x35, 0x2f, 0x3f, 0x4d, + 0x4d, 0x38, 0x22, 0x1d, 0x27, 0x2d, 0x25, 0x1a, 0x1d, 0x21, 0x31, 0x51, + 0x71, 0x7d, 0x71, 0x61, 0x6f, 0x60, 0x2c, 0x1f, 0x3e, 0x3c, 0x4a, 0x8d, + 0xff, 0x87, 0x87, 0xbc, 0xae, 0xb3, 0x86, 0x00, 0x2e, 0x35, 0x22, 0x18, + 0x1f, 0x0f, 0x11, 0x3d, 0x2b, 0x25, 0x2d, 0x3a, 0x2e, 0x1a, 0x26, 0x44, + 0x26, 0x32, 0x4e, 0x5c, 0x40, 0x15, 0x0f, 0x26, 0x3a, 0x1c, 0x1d, 0x2f, + 0x28, 0x20, 0x2b, 0x33, 0x5b, 0x42, 0x24, 0x13, 0x18, 0x29, 0x39, 0x41, + 0x31, 0x9c, 0xbd, 0x6f, 0x45, 0x6e, 0x79, 0x4f, 0x39, 0x39, 0x30, 0x33, + 0x5d, 0x8a, 0x82, 0x5c, 0x4c, 0x52, 0x72, 0x61, 0x5e, 0x61, 0x24, 0x06, + 0xbc, 0xc1, 0xbc, 0x76, 0x2f, 0x87, 0xc8, 0xc7, 0xc4, 0xb9, 0xb8, 0xc3, + 0xd2, 0xd1, 0xaa, 0x55, 0x36, 0x85, 0xb4, 0xd2, 0xbf, 0xc0, 0xc5, 0xc9, + 0xc8, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, + 0xd0, 0xd0, 0xd1, 0xd1, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd8, 0xc9, 0x79, 0x6e, 0x66, 0x64, 0x41, 0xba, + 0xd8, 0xdc, 0xd0, 0xbe, 0xc3, 0xd2, 0xc4, 0xa4, 0x50, 0xb6, 0xdf, 0xd3, + 0xc8, 0xd2, 0xcf, 0xcb, 0xcc, 0xd4, 0xda, 0xd7, 0xcd, 0xc7, 0xc8, 0xcc, + 0xd6, 0xbf, 0x93, 0x8f, 0x82, 0x59, 0x64, 0x89, 0x6b, 0x6f, 0x4b, 0x3f, + 0x49, 0x46, 0x3d, 0x26, 0x47, 0x46, 0x67, 0x45, 0x3e, 0x56, 0x3d, 0x53, + 0x5f, 0x65, 0x62, 0x56, 0x61, 0x8c, 0xac, 0xae, 0x9d, 0x95, 0xad, 0xaf, + 0xb0, 0x9d, 0x89, 0xc1, 0xff, 0xbc, 0xa4, 0xcc, 0xc6, 0x9c, 0x8f, 0x8a, + 0xaa, 0xa8, 0xd2, 0xf2, 0xdd, 0xca, 0xc4, 0xb1, 0xb9, 0xb1, 0xcb, 0xac, + 0x8d, 0xa2, 0xa6, 0xa6, 0xa7, 0xff, 0xe4, 0x7f, 0x2e, 0x45, 0xb5, 0xaa, + 0x90, 0x66, 0xa9, 0x6b, 0x30, 0x89, 0x8e, 0x5f, 0x29, 0x18, 0x20, 0x4e, + 0x74, 0x70, 0x60, 0x60, 0x2a, 0x13, 0x1e, 0x1f, 0x50, 0x91, 0x6d, 0x33, + 0x3d, 0x27, 0x25, 0x1e, 0x39, 0x47, 0x24, 0x2e, 0x36, 0x50, 0x77, 0x72, + 0x58, 0x6b, 0x85, 0x81, 0x6f, 0x70, 0x6f, 0x6a, 0x65, 0x67, 0x70, 0x78, + 0x76, 0x7b, 0x7e, 0x78, 0x6c, 0x63, 0x61, 0x63, 0x69, 0x6c, 0x73, 0x7e, + 0x84, 0x81, 0x74, 0x69, 0x6e, 0x79, 0x7a, 0x6c, 0x63, 0x65, 0x65, 0x61, + 0x47, 0x49, 0x4b, 0x4d, 0x50, 0x55, 0x5b, 0x60, 0x4a, 0x48, 0x3b, 0x3b, + 0x39, 0x48, 0x63, 0x53, 0x24, 0x26, 0x23, 0x1d, 0x24, 0x48, 0x80, 0xac, + 0x68, 0x3e, 0x19, 0x20, 0x42, 0x4f, 0x35, 0x12, 0x28, 0x26, 0x23, 0x2a, + 0x35, 0x2d, 0x29, 0x38, 0x66, 0x35, 0x17, 0x2b, 0x4d, 0x51, 0x34, 0x16, + 0x0d, 0x3c, 0x36, 0x13, 0x17, 0x24, 0x31, 0x4d, 0x58, 0x49, 0x47, 0x4d, + 0x3d, 0x23, 0x26, 0x3d, 0x37, 0x33, 0x34, 0x30, 0x20, 0x19, 0x32, 0x56, + 0x28, 0x21, 0x1a, 0x25, 0x30, 0x21, 0x22, 0x42, 0x28, 0x29, 0x2d, 0x37, + 0x3d, 0x37, 0x26, 0x16, 0x44, 0x30, 0x28, 0x43, 0x68, 0x69, 0x3c, 0x0c, + 0x3b, 0x36, 0x23, 0x19, 0x35, 0x54, 0x43, 0x17, 0x37, 0x3d, 0x5d, 0x4e, + 0x4d, 0x50, 0x15, 0x00, 0xb4, 0xbe, 0xb8, 0x72, 0x36, 0x8f, 0xc6, 0xc0, + 0xc0, 0xc4, 0xc9, 0xbe, 0xb1, 0xba, 0xd3, 0x80, 0x63, 0xcb, 0xd3, 0xc5, + 0xc5, 0xce, 0xc0, 0xc3, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xca, 0xcb, + 0xcb, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xde, 0xe0, 0x44, 0x3c, + 0x75, 0x6d, 0x8c, 0xdc, 0xf0, 0xdc, 0xc8, 0xc1, 0xc2, 0xc5, 0xcc, 0xd4, + 0x7e, 0xda, 0xd1, 0xca, 0xcf, 0xdc, 0xd2, 0xda, 0xd2, 0xda, 0xe4, 0xea, + 0xea, 0xe3, 0xda, 0xd3, 0xd0, 0x95, 0x49, 0x4c, 0x5d, 0x67, 0x86, 0x7d, + 0x5d, 0x7e, 0x83, 0xa5, 0xb7, 0xae, 0xce, 0xe1, 0x6a, 0x7b, 0x9d, 0x53, + 0x58, 0xb1, 0xb6, 0xd5, 0xc8, 0xbd, 0xc2, 0xcb, 0xcd, 0xd9, 0xd9, 0xc3, + 0xc8, 0xcd, 0xc2, 0xc9, 0xc5, 0x9b, 0x8a, 0x9c, 0x86, 0x6d, 0x62, 0x85, + 0x80, 0x69, 0x6d, 0x54, 0xa6, 0xab, 0xc0, 0xa5, 0x6e, 0x86, 0xc2, 0xc8, + 0x77, 0x67, 0x79, 0x61, 0x58, 0x87, 0x9d, 0xa4, 0x75, 0x6b, 0x82, 0xac, + 0xb3, 0x72, 0x43, 0x68, 0x58, 0x19, 0x3d, 0x3b, 0x21, 0x33, 0x2b, 0x31, + 0x47, 0x42, 0x36, 0x35, 0x36, 0x20, 0x16, 0x2a, 0x33, 0x5d, 0xec, 0xff, + 0xe9, 0xd7, 0x6a, 0x42, 0x21, 0x26, 0x41, 0x62, 0x79, 0x5f, 0x30, 0x30, + 0x45, 0x3b, 0x2a, 0x4f, 0x74, 0x7e, 0x84, 0x64, 0x81, 0x87, 0x89, 0x81, + 0x73, 0x6a, 0x6c, 0x71, 0x7d, 0x75, 0x6d, 0x6b, 0x6e, 0x6f, 0x6a, 0x64, + 0x70, 0x6e, 0x6d, 0x73, 0x7b, 0x7e, 0x7b, 0x76, 0x6e, 0x7a, 0x7d, 0x6f, + 0x64, 0x62, 0x5f, 0x58, 0x4d, 0x55, 0x5e, 0x62, 0x60, 0x5e, 0x5e, 0x60, + 0x4c, 0x4d, 0x40, 0x38, 0x38, 0x58, 0x6a, 0x36, 0x32, 0x33, 0x35, 0x39, + 0x43, 0x56, 0x6c, 0x7c, 0x4a, 0x4d, 0x4a, 0x3a, 0x26, 0x1c, 0x1f, 0x28, + 0x27, 0x22, 0x2a, 0x28, 0x13, 0x13, 0x1d, 0x16, 0x3b, 0x3d, 0x1b, 0x1e, + 0x4b, 0x3c, 0x1a, 0x2e, 0x3d, 0x25, 0x26, 0x23, 0x0d, 0x18, 0x28, 0x17, + 0x20, 0x1f, 0x34, 0x5e, 0x78, 0x6d, 0x4c, 0x34, 0x17, 0x33, 0x3a, 0x2b, + 0x39, 0x67, 0x83, 0x80, 0x2a, 0x31, 0x28, 0x24, 0x2b, 0x20, 0x20, 0x3b, + 0x61, 0x6c, 0x6f, 0x5d, 0x42, 0x36, 0x40, 0x51, 0x2b, 0x36, 0x43, 0x42, + 0x30, 0x20, 0x23, 0x2f, 0x33, 0x3a, 0x32, 0x1c, 0x0e, 0x12, 0x17, 0x17, + 0x1d, 0x22, 0x43, 0x38, 0x3f, 0x4f, 0x1f, 0x08, 0xc1, 0xc8, 0xb3, 0x65, + 0x30, 0x94, 0xd1, 0xce, 0xb5, 0xbd, 0xbe, 0xc3, 0xcb, 0xc1, 0xd3, 0x6e, + 0x74, 0xd1, 0xcc, 0xbe, 0xbf, 0xbe, 0xb8, 0xd7, 0xc5, 0xc5, 0xc6, 0xc7, + 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcc, 0xcc, 0xcd, 0xce, 0xce, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xcb, 0xe6, 0x6e, 0x45, 0x7c, 0x7a, 0xb3, 0x9e, 0xd2, 0xd5, 0xd4, 0xce, + 0xc6, 0xc3, 0xc6, 0xcb, 0x9a, 0xef, 0xe1, 0xee, 0xe5, 0xf4, 0xee, 0xeb, + 0xee, 0xc2, 0x9a, 0x9f, 0xc6, 0xe2, 0xdb, 0xc5, 0x69, 0x2d, 0x53, 0xa7, + 0x98, 0x7c, 0xb2, 0xea, 0xdc, 0xd7, 0xb6, 0xa4, 0xad, 0xb1, 0xab, 0xa3, + 0x8b, 0xbd, 0x9b, 0x43, 0x71, 0xa7, 0x68, 0x4f, 0x7d, 0x92, 0xd4, 0xf4, + 0xc3, 0x92, 0x91, 0x9a, 0x94, 0xb5, 0x5f, 0x48, 0x89, 0xc4, 0xcf, 0x76, + 0xa6, 0xcb, 0xd8, 0xea, 0xd0, 0xb0, 0xa1, 0x59, 0xa5, 0x86, 0x8e, 0x9b, + 0xa3, 0xc6, 0xa7, 0x3b, 0x4f, 0x1b, 0x30, 0x42, 0x38, 0x32, 0x28, 0x38, + 0x46, 0x39, 0x33, 0x35, 0x3e, 0x2a, 0x0b, 0x16, 0x22, 0x4f, 0x44, 0x11, + 0x19, 0x32, 0x30, 0x3e, 0x21, 0x29, 0x21, 0x26, 0x37, 0x2a, 0x20, 0x35, + 0x3c, 0x24, 0x7f, 0xe9, 0xff, 0x95, 0x11, 0x1d, 0x53, 0x6e, 0x4e, 0x2f, + 0x3f, 0x54, 0x47, 0x1f, 0xb2, 0xb8, 0x49, 0x4a, 0x81, 0x6a, 0x7c, 0x90, + 0x87, 0x81, 0x79, 0x76, 0x76, 0x72, 0x6a, 0x63, 0x70, 0x68, 0x5f, 0x5e, + 0x65, 0x6b, 0x6c, 0x6a, 0x78, 0x71, 0x69, 0x68, 0x6e, 0x74, 0x75, 0x73, + 0x71, 0x7a, 0x78, 0x68, 0x5d, 0x5f, 0x61, 0x5d, 0x58, 0x5e, 0x63, 0x5e, + 0x54, 0x4b, 0x49, 0x4b, 0x5b, 0x54, 0x38, 0x30, 0x31, 0x36, 0x42, 0x2d, + 0x4a, 0x3c, 0x34, 0x41, 0x58, 0x63, 0x58, 0x49, 0x0b, 0x3e, 0x6b, 0x67, + 0x44, 0x3d, 0x66, 0x96, 0x3f, 0x27, 0x26, 0x30, 0x2f, 0x37, 0x3b, 0x2d, + 0x34, 0x2a, 0x24, 0x2d, 0x32, 0x29, 0x25, 0x2c, 0x34, 0x24, 0x35, 0x3a, + 0x19, 0x1b, 0x40, 0x4e, 0x17, 0x25, 0x3c, 0x59, 0x71, 0x69, 0x38, 0x05, + 0x2b, 0x4c, 0x58, 0x4e, 0x5a, 0x72, 0x63, 0x38, 0x5d, 0x5f, 0x6c, 0x66, + 0x53, 0x60, 0x76, 0x71, 0x67, 0x54, 0x42, 0x44, 0x53, 0x58, 0x4b, 0x3a, + 0x1d, 0x3c, 0x3e, 0x1f, 0x15, 0x2a, 0x2b, 0x14, 0x2d, 0x2b, 0x28, 0x1f, + 0x0c, 0x06, 0x21, 0x44, 0x29, 0x29, 0x42, 0x32, 0x3a, 0x51, 0x2a, 0x19, + 0xba, 0xb6, 0x8f, 0x35, 0x04, 0x75, 0xc0, 0xc7, 0xb8, 0xc2, 0xb5, 0xb9, + 0xcb, 0xb5, 0xd0, 0x80, 0x8a, 0xc6, 0xbe, 0xc1, 0xc7, 0xce, 0xc0, 0xc1, + 0xc4, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xf7, 0xb4, 0x57, 0x73, 0x9b, 0xff, 0xc5, + 0xb1, 0xe5, 0xfb, 0xdb, 0xc0, 0xbc, 0xa3, 0x7a, 0x4c, 0xac, 0xaa, 0xa7, + 0x65, 0x62, 0x52, 0x2c, 0x5d, 0x5f, 0x5a, 0x4d, 0x44, 0x50, 0x6e, 0x89, + 0x9d, 0xaa, 0xe1, 0xba, 0x92, 0xd2, 0xc3, 0x59, 0x73, 0x41, 0x45, 0x7a, + 0xc3, 0xd5, 0xae, 0xb4, 0x91, 0xba, 0xb3, 0xa8, 0xb5, 0xbb, 0xbd, 0xba, + 0x9a, 0x88, 0x87, 0x7f, 0x72, 0x8a, 0x99, 0x7f, 0x7d, 0x9e, 0x65, 0x93, + 0xa6, 0x77, 0xa1, 0x99, 0x79, 0xb0, 0xb0, 0xaa, 0x9a, 0xab, 0xce, 0x91, + 0x8c, 0x59, 0x67, 0x69, 0x26, 0x27, 0x7e, 0xb4, 0x72, 0x39, 0x39, 0x33, + 0x2b, 0x38, 0x31, 0x35, 0x16, 0x1d, 0x2e, 0x45, 0x17, 0x6e, 0xf3, 0x82, + 0x62, 0x50, 0x38, 0x2b, 0x18, 0x1f, 0x38, 0x23, 0x2d, 0x32, 0x20, 0x1e, + 0x35, 0x2e, 0x24, 0x3b, 0x3d, 0x59, 0x26, 0x52, 0x93, 0x61, 0x36, 0x23, + 0x26, 0x51, 0x40, 0x3d, 0x44, 0x37, 0x2e, 0x0c, 0x73, 0xae, 0x49, 0x32, + 0x55, 0x62, 0xa4, 0x9a, 0x87, 0x81, 0x7c, 0x7b, 0x7e, 0x81, 0x80, 0x7e, + 0x7e, 0x81, 0x80, 0x79, 0x70, 0x6b, 0x6f, 0x75, 0x6a, 0x63, 0x5b, 0x5a, + 0x5d, 0x5e, 0x5b, 0x57, 0x73, 0x79, 0x71, 0x5e, 0x55, 0x5d, 0x66, 0x68, + 0x64, 0x66, 0x63, 0x59, 0x4f, 0x4c, 0x54, 0x5e, 0x62, 0x53, 0x35, 0x4a, + 0x58, 0x43, 0x62, 0x9a, 0xae, 0x99, 0x73, 0x47, 0x2b, 0x2e, 0x4a, 0x65, + 0x5c, 0x4f, 0x38, 0x1e, 0x0f, 0x14, 0x28, 0x39, 0x51, 0x51, 0x52, 0x44, + 0x21, 0x11, 0x32, 0x5e, 0x6a, 0x46, 0x26, 0x20, 0x23, 0x21, 0x1f, 0x24, + 0x30, 0x34, 0x1b, 0x1b, 0x44, 0x46, 0x24, 0x1a, 0x26, 0x36, 0x35, 0x26, + 0x28, 0x3a, 0x39, 0x26, 0x36, 0x2a, 0x1f, 0x25, 0x39, 0x46, 0x40, 0x31, + 0x16, 0x0f, 0x3c, 0x45, 0x24, 0x54, 0x8a, 0x69, 0x2d, 0x31, 0x33, 0x32, + 0x33, 0x3e, 0x52, 0x63, 0x4d, 0x34, 0x1a, 0x0f, 0x17, 0x2a, 0x3f, 0x4d, + 0x4b, 0x2c, 0x19, 0x1e, 0x1c, 0x15, 0x2c, 0x51, 0x39, 0x32, 0x41, 0x27, + 0x28, 0x3b, 0x15, 0x06, 0xe4, 0xc7, 0x76, 0x25, 0x2f, 0x85, 0xc4, 0xcb, + 0xc7, 0xbe, 0xc9, 0xc2, 0xad, 0xb6, 0xa8, 0x6d, 0x8d, 0xcb, 0xce, 0xc8, + 0xd0, 0xc2, 0xbd, 0xc1, 0xbd, 0xc8, 0xc8, 0xc8, 0xcd, 0xc4, 0xc0, 0xd0, + 0xbf, 0xc9, 0xbf, 0xc2, 0xd6, 0xcb, 0xba, 0xc8, 0xce, 0xc8, 0xd1, 0xc3, + 0xc8, 0xd2, 0xc5, 0xd9, 0xd4, 0xd2, 0xd9, 0xd4, 0xc7, 0xd2, 0xda, 0xc9, + 0xc6, 0xd7, 0xd1, 0xdd, 0xd6, 0xce, 0xe6, 0xdf, 0xe9, 0xdd, 0xc0, 0x8b, + 0x58, 0x56, 0x83, 0xa9, 0x1c, 0x0d, 0x17, 0x3a, 0x4c, 0x53, 0x74, 0xa2, + 0x9b, 0x9d, 0x83, 0x9a, 0xd5, 0xc8, 0xb4, 0xe1, 0xcc, 0xcb, 0xbf, 0xb7, + 0xc4, 0xc3, 0x8c, 0x47, 0x92, 0xaa, 0xb2, 0x98, 0x6e, 0x4d, 0x36, 0x27, + 0xa8, 0x9a, 0xbb, 0xb0, 0x58, 0x4a, 0xa1, 0xe2, 0xe9, 0xb4, 0x7b, 0x7d, + 0x78, 0x9a, 0xbc, 0x65, 0x90, 0xb3, 0xaf, 0x9c, 0x9a, 0x8e, 0x95, 0xbf, + 0xa4, 0xa9, 0x8a, 0x71, 0x81, 0x79, 0x40, 0x0e, 0x28, 0x13, 0x36, 0x76, + 0x67, 0x19, 0x06, 0x32, 0x18, 0x8a, 0xa2, 0x3c, 0x08, 0x3a, 0x4c, 0x1c, + 0x40, 0x18, 0x4e, 0xbd, 0xaf, 0x30, 0x00, 0x35, 0x2f, 0x4c, 0x2a, 0x31, + 0x32, 0x4e, 0xcd, 0xff, 0xb0, 0x2d, 0x36, 0x42, 0x2f, 0x36, 0x34, 0x66, + 0x79, 0x26, 0x1a, 0x37, 0x2a, 0x27, 0x2c, 0x10, 0x39, 0x37, 0x2a, 0x26, + 0x45, 0x67, 0x5b, 0x34, 0x36, 0x29, 0x3c, 0x46, 0x32, 0x38, 0x41, 0x28, + 0x2a, 0x37, 0x42, 0x39, 0x65, 0xa0, 0x91, 0x77, 0x78, 0x7a, 0x7a, 0x75, + 0x71, 0x73, 0x7c, 0x84, 0x87, 0x80, 0x77, 0x75, 0x78, 0x7b, 0x7a, 0x78, + 0x8b, 0x8b, 0x89, 0x86, 0x80, 0x78, 0x71, 0x6c, 0x77, 0x75, 0x71, 0x69, + 0x61, 0x5c, 0x5b, 0x5d, 0x70, 0x68, 0x5f, 0x5c, 0x5e, 0x61, 0x60, 0x5e, + 0x42, 0x46, 0x44, 0x37, 0x4f, 0x96, 0xa2, 0x65, 0x18, 0x43, 0x60, 0x47, + 0x14, 0x06, 0x34, 0x6a, 0x59, 0x52, 0x35, 0x17, 0x1f, 0x3f, 0x42, 0x2b, + 0x55, 0x3d, 0x2c, 0x2b, 0x28, 0x21, 0x24, 0x31, 0x31, 0x2e, 0x32, 0x3e, + 0x47, 0x3f, 0x24, 0x0d, 0x16, 0x29, 0x2c, 0x32, 0x3a, 0x24, 0x11, 0x21, + 0x5a, 0x38, 0x37, 0x37, 0x14, 0x0d, 0x2b, 0x3b, 0x20, 0x22, 0x15, 0x1e, + 0x3b, 0x30, 0x17, 0x1c, 0x1c, 0x27, 0x24, 0x32, 0x4d, 0x4a, 0x4a, 0x69, + 0x83, 0x7d, 0x4e, 0x3f, 0x54, 0x34, 0x1c, 0x46, 0x47, 0x3e, 0x37, 0x34, + 0x2c, 0x25, 0x2c, 0x3a, 0x2b, 0x1d, 0x16, 0x19, 0x1b, 0x29, 0x57, 0x88, + 0x5d, 0x4a, 0x61, 0x64, 0x6d, 0x64, 0x1f, 0x00, 0xc9, 0xbf, 0x7a, 0x26, + 0x30, 0x8a, 0xbe, 0xb2, 0x9f, 0xa0, 0xb8, 0xc0, 0xb7, 0xc8, 0xbd, 0x83, + 0x90, 0xc8, 0xc4, 0xb7, 0xbc, 0xb6, 0xbe, 0xca, 0xc4, 0xb6, 0xc5, 0xcc, + 0xb8, 0xbb, 0xcd, 0xc9, 0xc6, 0xc3, 0xd6, 0xd7, 0xb6, 0xb3, 0xc9, 0xcd, + 0xde, 0xe8, 0xd5, 0xcd, 0xde, 0xdb, 0xce, 0xca, 0xde, 0xd9, 0xe2, 0xe5, + 0xda, 0xe1, 0xec, 0xe6, 0xcd, 0xf4, 0xde, 0xa4, 0xa4, 0xaf, 0x9b, 0x96, + 0x90, 0x43, 0x56, 0x68, 0x3c, 0x6d, 0xaf, 0x81, 0xbb, 0xc2, 0xe1, 0xf2, + 0xbf, 0x77, 0x72, 0x9f, 0x6c, 0xac, 0x87, 0x5e, 0x79, 0x4e, 0x18, 0x43, + 0x6e, 0x5f, 0x61, 0x71, 0x75, 0x78, 0x9b, 0xc9, 0xff, 0xbc, 0x87, 0xad, + 0xde, 0xc8, 0x7e, 0x46, 0x6a, 0x76, 0x82, 0x9d, 0xc3, 0xc5, 0x9e, 0x7d, + 0x78, 0xbb, 0xd7, 0xd4, 0x92, 0x67, 0x7b, 0x56, 0x27, 0x7b, 0xb5, 0xc0, + 0xb4, 0x89, 0x76, 0x94, 0x95, 0x5b, 0xb2, 0xdd, 0x6b, 0x5b, 0x92, 0x67, + 0x7b, 0x54, 0x35, 0x30, 0x2b, 0x23, 0x31, 0x4d, 0x3a, 0x64, 0x61, 0x2a, + 0x16, 0x38, 0x46, 0x30, 0x8a, 0xd0, 0xd3, 0x6e, 0x15, 0x14, 0x35, 0x41, + 0x4e, 0x39, 0x32, 0x7f, 0xc8, 0xd5, 0xce, 0xae, 0x3d, 0x1e, 0x55, 0x51, + 0x43, 0x60, 0x3e, 0x23, 0x2f, 0x25, 0x3e, 0x51, 0x37, 0x2b, 0x4c, 0x6c, + 0x69, 0x5c, 0x66, 0x81, 0x7f, 0x58, 0x39, 0x34, 0x17, 0x54, 0x6a, 0x57, + 0x6c, 0xb0, 0xe9, 0xff, 0x63, 0x3a, 0x40, 0x31, 0x2f, 0x73, 0x99, 0x8c, + 0x77, 0x6f, 0x69, 0x6e, 0x77, 0x79, 0x71, 0x68, 0x64, 0x65, 0x69, 0x72, + 0x7b, 0x7d, 0x78, 0x72, 0x7c, 0x7d, 0x7d, 0x7c, 0x78, 0x73, 0x6d, 0x69, + 0x80, 0x79, 0x6c, 0x5f, 0x58, 0x58, 0x5f, 0x64, 0x5d, 0x56, 0x4e, 0x4c, + 0x50, 0x53, 0x53, 0x51, 0x56, 0x40, 0x35, 0x3e, 0x55, 0x66, 0x51, 0x27, + 0x16, 0x2a, 0x3d, 0x3d, 0x2e, 0x22, 0x25, 0x2e, 0x2e, 0x31, 0x3a, 0x41, + 0x3e, 0x33, 0x2e, 0x31, 0x1d, 0x56, 0x7a, 0x5d, 0x28, 0x14, 0x24, 0x38, + 0x2a, 0x3e, 0x51, 0x51, 0x40, 0x2d, 0x26, 0x26, 0x2f, 0x43, 0x2b, 0x0c, + 0x1d, 0x3a, 0x48, 0x56, 0x55, 0x66, 0x3b, 0x1d, 0x3b, 0x35, 0x17, 0x22, + 0x20, 0x32, 0x26, 0x1c, 0x33, 0x42, 0x4b, 0x62, 0x33, 0x20, 0x12, 0x34, + 0x5d, 0x43, 0x17, 0x17, 0x18, 0x30, 0x1d, 0x0c, 0x3b, 0x6b, 0x62, 0x47, + 0x4b, 0x41, 0x31, 0x1d, 0x0c, 0x0c, 0x20, 0x37, 0x3a, 0x29, 0x1e, 0x1d, + 0x19, 0x21, 0x46, 0x70, 0x5a, 0x46, 0x59, 0x58, 0x62, 0x5f, 0x23, 0x0c, + 0xb3, 0xbe, 0x83, 0x2b, 0x37, 0x9a, 0xc5, 0xa6, 0xbb, 0xbc, 0xd3, 0xd5, + 0xc1, 0xc3, 0xa9, 0x66, 0xa2, 0xcb, 0xc0, 0xb8, 0xc5, 0xc3, 0xc3, 0xbf, + 0xc8, 0xc0, 0xb7, 0xbf, 0xd3, 0xde, 0xde, 0xdf, 0xe3, 0xe5, 0xd9, 0xcf, + 0xd8, 0xde, 0xda, 0xd8, 0xa7, 0xd2, 0xcc, 0xd3, 0xd6, 0xc8, 0xd4, 0xd0, + 0x94, 0x8d, 0x7e, 0x75, 0x6e, 0x5d, 0x5b, 0x71, 0x73, 0x70, 0x74, 0x6a, + 0x81, 0x7d, 0x56, 0x78, 0x99, 0x7e, 0xb3, 0xc5, 0x83, 0x91, 0xc0, 0xa0, + 0xbc, 0xd2, 0xc1, 0x7b, 0x3f, 0x49, 0x8b, 0xc2, 0xa0, 0xa0, 0xaa, 0x8d, + 0x6d, 0x9f, 0xd7, 0xca, 0xfc, 0x9f, 0x58, 0x67, 0x96, 0x9c, 0x7b, 0x5f, + 0x1e, 0x7d, 0xc0, 0xb1, 0x96, 0x9c, 0x9d, 0x8a, 0x95, 0xc6, 0xaf, 0x9d, + 0xd3, 0xd8, 0x9c, 0x81, 0xa8, 0xbd, 0x86, 0x87, 0xb0, 0xc5, 0xda, 0xc1, + 0x96, 0xb3, 0xb6, 0xba, 0xcc, 0xb5, 0x90, 0x91, 0x5a, 0x3a, 0x1f, 0x29, + 0x4f, 0x65, 0x5b, 0x49, 0x39, 0x43, 0x45, 0x46, 0x59, 0x6b, 0x59, 0x35, + 0x52, 0x46, 0x44, 0x4f, 0x55, 0x44, 0x27, 0x12, 0x0a, 0x36, 0x35, 0x10, + 0x23, 0x66, 0x71, 0x45, 0x5a, 0x53, 0x57, 0x3b, 0x2f, 0x3e, 0x3d, 0x4d, + 0x41, 0x1d, 0x4a, 0x5f, 0x4f, 0x46, 0x32, 0x3e, 0x27, 0x24, 0x22, 0x3b, + 0x57, 0x41, 0x1f, 0x1e, 0x2a, 0x1a, 0x1a, 0x27, 0x20, 0x10, 0x1b, 0x38, + 0x27, 0x31, 0x20, 0x44, 0x93, 0x87, 0x4d, 0x4d, 0x34, 0x2b, 0x22, 0x23, + 0x57, 0x7f, 0x73, 0x7f, 0x78, 0x7d, 0x82, 0x83, 0x7f, 0x79, 0x73, 0x71, + 0x78, 0x70, 0x67, 0x64, 0x68, 0x6c, 0x6d, 0x6c, 0x67, 0x6a, 0x6e, 0x71, + 0x72, 0x71, 0x6e, 0x6c, 0x7e, 0x79, 0x72, 0x6b, 0x65, 0x5f, 0x5b, 0x59, + 0x63, 0x5d, 0x57, 0x56, 0x59, 0x5c, 0x5a, 0x57, 0x52, 0x40, 0x31, 0x3e, + 0x53, 0x4b, 0x3b, 0x3c, 0x53, 0x54, 0x55, 0x54, 0x4d, 0x40, 0x31, 0x27, + 0x4f, 0x4c, 0x5c, 0x6d, 0x56, 0x2d, 0x2b, 0x47, 0x5e, 0x39, 0x1d, 0x26, + 0x3c, 0x3d, 0x25, 0x0e, 0x39, 0x4a, 0x5a, 0x58, 0x45, 0x34, 0x2e, 0x30, + 0x3b, 0x23, 0x10, 0x2b, 0x4e, 0x3f, 0x36, 0x57, 0x5c, 0x42, 0x30, 0x2b, + 0x29, 0x2d, 0x2f, 0x25, 0x0a, 0x3d, 0x41, 0x26, 0x2b, 0x36, 0x36, 0x3d, + 0x36, 0x2b, 0x31, 0x51, 0x4a, 0x18, 0x38, 0xa5, 0xa2, 0xb2, 0xd0, 0xc4, + 0x89, 0x77, 0x9d, 0xbe, 0x21, 0x1e, 0x1c, 0x23, 0x3b, 0x5c, 0x76, 0x82, + 0x58, 0x45, 0x37, 0x33, 0x2c, 0x2b, 0x43, 0x65, 0x85, 0x6a, 0x6f, 0x5f, + 0x5c, 0x56, 0x21, 0x11, 0x9e, 0xb1, 0x7a, 0x21, 0x33, 0xa1, 0xd2, 0xb0, + 0xa8, 0xad, 0xca, 0xd3, 0xc4, 0xc8, 0xaf, 0x6c, 0x95, 0xc4, 0xc4, 0xbd, + 0xbf, 0xbe, 0xc9, 0xcb, 0xd0, 0xd7, 0xc5, 0xb9, 0xbb, 0xa0, 0x79, 0x6e, + 0x5b, 0x31, 0x5a, 0x95, 0x86, 0x6f, 0x64, 0x42, 0x1d, 0x31, 0x2e, 0x23, + 0x19, 0x3b, 0x7a, 0x88, 0x89, 0x79, 0xad, 0xcb, 0x94, 0x85, 0xaf, 0xbc, + 0xc1, 0x98, 0xb6, 0xe2, 0xd1, 0x97, 0x84, 0xb7, 0xcb, 0xa9, 0x6a, 0x71, + 0xc6, 0xe5, 0xc8, 0xbd, 0x82, 0x65, 0x6d, 0xaf, 0xee, 0xec, 0xb5, 0x83, + 0x7b, 0x38, 0x44, 0x6f, 0x86, 0xc4, 0xc7, 0x63, 0x73, 0xa2, 0xb5, 0x94, + 0x79, 0x8f, 0xbb, 0xd6, 0xff, 0xac, 0x6f, 0x84, 0x9e, 0x9c, 0xb0, 0xdb, + 0xd5, 0xbc, 0x77, 0x60, 0x97, 0xae, 0x84, 0x62, 0x73, 0xae, 0x74, 0x58, + 0x6e, 0x66, 0x79, 0x87, 0x61, 0x89, 0x82, 0x5e, 0x4d, 0x49, 0x70, 0xb8, + 0xc0, 0x5e, 0x41, 0x81, 0x89, 0x43, 0x39, 0x76, 0x3a, 0x4e, 0x56, 0x51, + 0x58, 0x62, 0x4d, 0x28, 0x6c, 0x41, 0x23, 0x29, 0x34, 0x31, 0x32, 0x3c, + 0x2c, 0x46, 0x5a, 0x52, 0x38, 0x27, 0x28, 0x2f, 0x34, 0x47, 0x78, 0x52, + 0x59, 0x8b, 0x62, 0x52, 0x4a, 0x41, 0x30, 0x25, 0x69, 0xc8, 0xb5, 0x64, + 0xb0, 0xa3, 0x5a, 0x28, 0x33, 0x23, 0x16, 0x3d, 0x4e, 0x5b, 0x53, 0x38, + 0x32, 0x41, 0x40, 0x2d, 0x4a, 0x5f, 0x32, 0x0f, 0x26, 0x22, 0x28, 0x66, + 0x8a, 0x79, 0x8d, 0x6e, 0x40, 0x4f, 0x5b, 0x52, 0x78, 0x80, 0x87, 0x83, + 0x77, 0x6f, 0x6f, 0x73, 0x6f, 0x6e, 0x6e, 0x72, 0x76, 0x74, 0x6c, 0x64, + 0x88, 0x89, 0x8a, 0x8a, 0x87, 0x81, 0x7c, 0x79, 0x75, 0x70, 0x6b, 0x6a, + 0x6f, 0x73, 0x73, 0x72, 0x6b, 0x65, 0x5f, 0x5d, 0x5e, 0x5d, 0x59, 0x54, + 0x43, 0x40, 0x2b, 0x2d, 0x45, 0x3f, 0x2e, 0x38, 0x47, 0x49, 0x45, 0x38, + 0x29, 0x27, 0x34, 0x41, 0x4d, 0x3f, 0x38, 0x38, 0x30, 0x2a, 0x3e, 0x5d, + 0x6c, 0x1c, 0x03, 0x3c, 0x52, 0x29, 0x1e, 0x42, 0x27, 0x23, 0x26, 0x36, + 0x49, 0x4e, 0x42, 0x33, 0x0b, 0x28, 0x18, 0x0c, 0x43, 0x7c, 0x7b, 0x67, + 0x5d, 0x2d, 0x47, 0x6d, 0x42, 0x1b, 0x2b, 0x3a, 0x59, 0x8f, 0x89, 0x59, + 0x51, 0x53, 0x3a, 0x25, 0x6d, 0x63, 0x3c, 0x29, 0x40, 0x57, 0x77, 0xa9, + 0xc5, 0xc2, 0xf2, 0xe6, 0x74, 0x49, 0x92, 0xd2, 0xb1, 0x71, 0x2e, 0x2d, + 0x6c, 0x97, 0x73, 0x33, 0x40, 0x2c, 0x1f, 0x20, 0x1d, 0x17, 0x25, 0x3e, + 0x53, 0x3b, 0x43, 0x35, 0x39, 0x41, 0x1e, 0x1d, 0xb7, 0xbf, 0x85, 0x33, + 0x44, 0xa8, 0xd8, 0xc0, 0xb5, 0xb5, 0xcb, 0xcd, 0xb9, 0xbc, 0xa3, 0x61, + 0xbb, 0xdb, 0xd3, 0xc7, 0xc1, 0xbe, 0xc4, 0xba, 0x9e, 0x54, 0x43, 0x61, + 0x4e, 0x27, 0x2d, 0x47, 0x42, 0x9a, 0x9c, 0x73, 0x8f, 0xa8, 0x93, 0x88, + 0xa8, 0xbd, 0xa4, 0x84, 0x9a, 0x91, 0x86, 0xce, 0xb3, 0xb9, 0xa4, 0x87, + 0x94, 0xb6, 0xa9, 0x7a, 0x9c, 0xc7, 0xd1, 0xca, 0xbb, 0xb2, 0xa4, 0x74, + 0x5d, 0x98, 0x9b, 0x9d, 0xc2, 0xae, 0x91, 0xb6, 0x95, 0x71, 0x95, 0xdf, + 0xc5, 0x6f, 0x82, 0xe7, 0x98, 0x95, 0x5f, 0x70, 0xca, 0xc1, 0x8c, 0xa3, + 0x67, 0x75, 0x67, 0x3d, 0x2c, 0x45, 0x60, 0x67, 0x18, 0x33, 0x2c, 0x1a, + 0x48, 0xa4, 0xca, 0xb3, 0xc6, 0x95, 0x8c, 0x8d, 0x6a, 0x55, 0x55, 0x47, + 0x53, 0xa3, 0x72, 0x3a, 0x27, 0x17, 0x4e, 0x87, 0xb5, 0xa2, 0x69, 0x4a, + 0x5e, 0x5a, 0x44, 0x4b, 0x3d, 0x2c, 0x3a, 0x68, 0x62, 0x1b, 0x0d, 0x4a, + 0x46, 0x43, 0x42, 0x40, 0x38, 0x36, 0x46, 0x5a, 0x1c, 0x2f, 0x45, 0x52, + 0x54, 0x4f, 0x46, 0x3e, 0x3e, 0x6a, 0x79, 0x62, 0x62, 0x79, 0x6a, 0x3e, + 0x5b, 0x3a, 0x4c, 0x34, 0x3f, 0x5d, 0x30, 0x32, 0x93, 0x5c, 0x45, 0x81, + 0x9d, 0x6b, 0x52, 0x5f, 0x9a, 0xff, 0xff, 0xee, 0x9c, 0x2f, 0x00, 0x19, + 0xac, 0x98, 0x6b, 0x44, 0x49, 0x64, 0x60, 0x44, 0x63, 0x73, 0x53, 0x29, + 0x27, 0x2a, 0x2a, 0x3a, 0x44, 0x5b, 0x2a, 0x23, 0xa7, 0xdb, 0x90, 0x86, + 0x95, 0x8a, 0x7f, 0x7d, 0x82, 0x84, 0x7f, 0x79, 0x7c, 0x79, 0x76, 0x75, + 0x71, 0x67, 0x58, 0x4d, 0x65, 0x68, 0x6d, 0x72, 0x75, 0x75, 0x74, 0x73, + 0x9c, 0x86, 0x6a, 0x5b, 0x5e, 0x6c, 0x7a, 0x81, 0x7a, 0x75, 0x6e, 0x6b, + 0x6a, 0x66, 0x5e, 0x57, 0x43, 0x41, 0x31, 0x3a, 0x55, 0x4a, 0x2e, 0x2d, + 0x19, 0x1a, 0x1b, 0x1b, 0x1f, 0x2a, 0x3b, 0x48, 0x39, 0x36, 0x29, 0x24, + 0x43, 0x78, 0x97, 0x9b, 0x42, 0x24, 0x40, 0x83, 0x7f, 0x3f, 0x37, 0x6b, + 0x9e, 0x8e, 0x7a, 0x70, 0x68, 0x58, 0x3e, 0x28, 0x3b, 0x31, 0x2d, 0x45, + 0x53, 0x36, 0x39, 0x70, 0x3f, 0x52, 0x5b, 0x74, 0x7b, 0x38, 0x0e, 0x38, + 0x67, 0x81, 0x5d, 0x26, 0x2f, 0x44, 0x32, 0x1a, 0x5c, 0x2e, 0x11, 0x3a, + 0x65, 0x4c, 0x3c, 0x63, 0x88, 0x87, 0xa4, 0xa3, 0x86, 0x96, 0x87, 0x35, + 0x4d, 0xb3, 0xff, 0xef, 0xae, 0x89, 0x8a, 0x91, 0x31, 0x1e, 0x17, 0x22, + 0x27, 0x22, 0x28, 0x38, 0x56, 0x3e, 0x45, 0x2f, 0x2a, 0x2f, 0x11, 0x15, + 0x36, 0x3b, 0x24, 0x0f, 0x3d, 0x9c, 0xd4, 0xd5, 0xcb, 0xc1, 0xc7, 0xbb, + 0xa1, 0xa5, 0x93, 0x56, 0x43, 0x6b, 0x73, 0x68, 0x52, 0x42, 0x44, 0x35, + 0x70, 0x8b, 0xa7, 0xaa, 0xa0, 0xa7, 0xba, 0xc4, 0x9d, 0x94, 0x96, 0xa2, + 0xb0, 0xbe, 0xbc, 0xa9, 0x81, 0x8e, 0xc2, 0xb2, 0xb4, 0xed, 0xb0, 0x31, + 0x66, 0x80, 0x9e, 0xc0, 0xc5, 0x89, 0x55, 0x58, 0x9f, 0xb4, 0x86, 0x77, + 0x6e, 0x4d, 0x6d, 0x99, 0x9e, 0x86, 0x8e, 0xb3, 0xce, 0xd2, 0xab, 0x72, + 0x8f, 0x74, 0x68, 0x81, 0x9f, 0x94, 0x5e, 0x2a, 0x07, 0x12, 0x29, 0x7b, + 0xcc, 0xab, 0x5f, 0x53, 0xa7, 0xb0, 0xc4, 0xc7, 0xa4, 0x83, 0x9a, 0xcc, + 0xe5, 0xc3, 0xcb, 0xfa, 0xfc, 0xc2, 0x94, 0x90, 0x67, 0x5d, 0x99, 0xab, + 0x54, 0x35, 0x72, 0x9b, 0x52, 0x76, 0x4b, 0x43, 0x4e, 0x3b, 0x32, 0x0a, + 0x53, 0x71, 0x64, 0x46, 0x3b, 0x2d, 0x36, 0x63, 0x3c, 0x6a, 0x43, 0x18, + 0x54, 0x85, 0x6a, 0x4d, 0x27, 0x1c, 0x2a, 0x47, 0x42, 0x2f, 0x45, 0x75, + 0xcc, 0xd7, 0xbc, 0x74, 0x37, 0x24, 0x23, 0x1f, 0x2b, 0x69, 0x7c, 0x50, + 0x3f, 0x66, 0x83, 0x7b, 0x4e, 0x2f, 0x43, 0x4f, 0x37, 0x21, 0x44, 0xa4, + 0x2c, 0x6b, 0x61, 0x64, 0x7e, 0x90, 0xb3, 0xb4, 0xdf, 0xea, 0xcd, 0xa6, + 0xa5, 0xaa, 0xa8, 0xae, 0xc1, 0x73, 0x2c, 0x1e, 0x28, 0x2b, 0x33, 0x42, + 0x35, 0x49, 0x51, 0x43, 0x3b, 0x3c, 0x2f, 0x19, 0x25, 0x26, 0x25, 0x11, + 0x3b, 0x8d, 0x9e, 0x93, 0x7f, 0x79, 0x71, 0x6c, 0x6c, 0x6e, 0x71, 0x72, + 0x87, 0x83, 0x7f, 0x81, 0x86, 0x88, 0x85, 0x81, 0x74, 0x78, 0x7e, 0x85, + 0x89, 0x8b, 0x8b, 0x8a, 0x98, 0x82, 0x68, 0x5d, 0x63, 0x6e, 0x74, 0x74, + 0x63, 0x5f, 0x5a, 0x59, 0x58, 0x53, 0x49, 0x41, 0x37, 0x34, 0x30, 0x32, + 0x31, 0x21, 0x21, 0x36, 0x24, 0x1a, 0x16, 0x24, 0x37, 0x3a, 0x27, 0x12, + 0x15, 0x22, 0x22, 0x22, 0x45, 0x74, 0x77, 0x5a, 0x41, 0x33, 0x35, 0x51, + 0x6d, 0x6c, 0x54, 0x3e, 0x49, 0x54, 0x5c, 0x54, 0x45, 0x3d, 0x43, 0x4e, + 0x67, 0xa2, 0x9f, 0x64, 0x3f, 0x31, 0x27, 0x2a, 0x52, 0x63, 0x5e, 0x56, + 0x6c, 0x81, 0x76, 0x61, 0x4c, 0x61, 0x4c, 0x3a, 0x5c, 0x75, 0x64, 0x54, + 0x44, 0x57, 0x73, 0x8c, 0x73, 0x2f, 0x36, 0x8a, 0xb4, 0x69, 0x30, 0x2a, + 0x47, 0x69, 0x57, 0x1d, 0x16, 0x84, 0xd9, 0xc7, 0x86, 0x58, 0x37, 0x1a, + 0x3b, 0x28, 0x26, 0x3a, 0x46, 0x42, 0x41, 0x4a, 0x7e, 0x69, 0x6c, 0x4b, + 0x35, 0x2b, 0x06, 0x08, 0x67, 0x57, 0x41, 0x36, 0x3c, 0x47, 0x46, 0x3e, + 0x45, 0x3a, 0x43, 0x43, 0x3f, 0x60, 0x6b, 0x3f, 0x80, 0xb7, 0xcf, 0xc0, + 0x9a, 0x90, 0xb0, 0xba, 0xc9, 0xa3, 0x85, 0xa6, 0xd6, 0xc2, 0xa0, 0xab, + 0xd2, 0xbc, 0x93, 0x90, 0xb5, 0xbd, 0xb3, 0xbd, 0xad, 0xc0, 0x9c, 0x82, + 0x9c, 0x8a, 0x7c, 0xb9, 0xd4, 0xba, 0xc8, 0xa6, 0x60, 0x81, 0xa5, 0x68, + 0x6e, 0x8b, 0x75, 0x73, 0xb5, 0xde, 0xcd, 0xb1, 0x99, 0x9b, 0x90, 0x75, + 0x62, 0x78, 0xb3, 0xe6, 0x8e, 0xbe, 0xc1, 0x91, 0x83, 0xa3, 0xa3, 0x7f, + 0x6b, 0x7f, 0xe4, 0xe9, 0x6e, 0x69, 0xcf, 0xec, 0x8b, 0x93, 0xb2, 0xce, + 0xc6, 0xaa, 0xae, 0xc9, 0xa1, 0xa0, 0x7c, 0x46, 0x3c, 0x63, 0x83, 0x85, + 0x21, 0x15, 0x22, 0x42, 0x5f, 0x7f, 0x99, 0xa1, 0x60, 0x5d, 0x35, 0x37, + 0x44, 0x77, 0xc4, 0xb1, 0x6c, 0x63, 0x38, 0x28, 0x44, 0x43, 0x2d, 0x34, + 0x68, 0x63, 0xba, 0xff, 0xdc, 0xa8, 0x6e, 0x17, 0x52, 0x32, 0x28, 0x39, + 0x39, 0x2a, 0x3c, 0x64, 0x85, 0xa0, 0xa9, 0x8a, 0x61, 0x4b, 0x41, 0x3c, + 0xa5, 0x6e, 0x28, 0x0e, 0x33, 0x69, 0x7a, 0x6c, 0x93, 0x65, 0x28, 0x29, + 0x34, 0x4c, 0xa2, 0xe3, 0xa2, 0x9e, 0x3d, 0x29, 0x36, 0x23, 0x4b, 0x66, + 0x39, 0x28, 0x37, 0x6c, 0xb0, 0xd8, 0xa0, 0x37, 0x9d, 0x75, 0x5b, 0x5e, + 0x54, 0x32, 0x18, 0x16, 0x0d, 0x33, 0x38, 0x1b, 0x22, 0x4e, 0x57, 0x39, + 0x2b, 0x57, 0x67, 0x3b, 0x32, 0x4b, 0x5c, 0x83, 0x72, 0x79, 0x7f, 0x7a, + 0x70, 0x6d, 0x75, 0x7e, 0x78, 0x7b, 0x80, 0x86, 0x85, 0x7a, 0x67, 0x59, + 0x6d, 0x6d, 0x6b, 0x67, 0x60, 0x57, 0x4f, 0x4b, 0x60, 0x58, 0x55, 0x61, + 0x74, 0x7d, 0x78, 0x6f, 0x61, 0x5f, 0x5e, 0x60, 0x63, 0x60, 0x58, 0x50, + 0x59, 0x55, 0x4d, 0x39, 0x2a, 0x39, 0x4e, 0x50, 0x21, 0x1e, 0x20, 0x2a, + 0x33, 0x32, 0x23, 0x16, 0x3b, 0x49, 0x57, 0x5e, 0x5f, 0x56, 0x40, 0x2b, + 0x2b, 0x3e, 0x43, 0x35, 0x2e, 0x37, 0x3a, 0x32, 0x2f, 0x3a, 0x43, 0x40, + 0x37, 0x37, 0x44, 0x53, 0x5b, 0x49, 0x2d, 0x2f, 0x3c, 0x25, 0x15, 0x2c, + 0x33, 0x2b, 0x33, 0x1d, 0x13, 0x59, 0x7b, 0x3e, 0x27, 0x43, 0x48, 0x4f, + 0x6c, 0x6e, 0x5e, 0x61, 0x28, 0x86, 0x82, 0x25, 0x07, 0x24, 0x27, 0x12, + 0x3e, 0x2f, 0x35, 0x68, 0x88, 0x59, 0x25, 0x27, 0x37, 0x75, 0x87, 0x4d, + 0x1f, 0x2b, 0x40, 0x3d, 0x28, 0x15, 0x14, 0x2c, 0x3b, 0x34, 0x2b, 0x2d, + 0x36, 0x2d, 0x44, 0x35, 0x2c, 0x2e, 0x11, 0x19, 0xe9, 0xd4, 0xce, 0xdb, + 0xd5, 0xb0, 0x8d, 0x81, 0xba, 0xa9, 0xaa, 0xa4, 0xa1, 0xc9, 0xdc, 0xb7, + 0xca, 0xbf, 0x97, 0x7f, 0x7d, 0x94, 0xb0, 0xa1, 0x82, 0x8a, 0x91, 0x8b, + 0x92, 0xb7, 0xc1, 0xa4, 0xa6, 0xa0, 0xb9, 0xbb, 0x88, 0x70, 0x8d, 0xa6, + 0xb5, 0x9b, 0x75, 0x80, 0x7f, 0x6f, 0x7c, 0x73, 0x7c, 0x8a, 0x9f, 0xbb, + 0xbe, 0x98, 0x83, 0x97, 0xb4, 0xb2, 0xd1, 0xc0, 0x9b, 0x85, 0x77, 0x94, + 0xa8, 0xf0, 0xc4, 0x97, 0xb6, 0x80, 0x47, 0x85, 0xa9, 0x8c, 0x99, 0xaa, + 0x69, 0x23, 0x68, 0xf3, 0xf8, 0xa3, 0x6a, 0x4c, 0x48, 0x83, 0x91, 0x48, + 0x64, 0x58, 0x34, 0x12, 0x16, 0x2b, 0x1f, 0x00, 0x24, 0x12, 0x0e, 0x25, + 0x38, 0x2f, 0x18, 0x07, 0x4e, 0x7f, 0x6e, 0x55, 0x76, 0x7a, 0x58, 0x53, + 0x44, 0x32, 0x21, 0x37, 0x38, 0x6c, 0xb4, 0x7f, 0x2e, 0x49, 0x48, 0x4c, + 0x64, 0x59, 0x44, 0x51, 0x35, 0x54, 0x20, 0x1b, 0x61, 0x41, 0x19, 0x63, + 0x3b, 0x21, 0x1d, 0x3a, 0x52, 0x53, 0x54, 0x5e, 0x2c, 0x31, 0x38, 0x38, + 0x2f, 0x2b, 0x38, 0x4a, 0x2c, 0x52, 0x53, 0x29, 0x1e, 0x40, 0x4e, 0x3d, + 0x07, 0x48, 0x3b, 0x50, 0x6e, 0x80, 0x89, 0x34, 0x6e, 0xfe, 0xd6, 0x6b, + 0x27, 0x33, 0xb6, 0xff, 0xff, 0xe7, 0xc9, 0x78, 0x20, 0x34, 0x66, 0x55, + 0x20, 0x37, 0x3a, 0x26, 0x22, 0x33, 0x36, 0x28, 0x27, 0x2e, 0x31, 0x2f, + 0x26, 0x23, 0x59, 0xa9, 0x97, 0x59, 0x5b, 0x49, 0x2d, 0x60, 0x86, 0x75, + 0x73, 0x71, 0x73, 0x79, 0x7f, 0x7f, 0x77, 0x6f, 0x92, 0x8e, 0x8b, 0x8a, + 0x87, 0x7f, 0x71, 0x67, 0x68, 0x6a, 0x6e, 0x72, 0x73, 0x71, 0x6f, 0x6d, + 0x6e, 0x61, 0x57, 0x5a, 0x65, 0x68, 0x5d, 0x50, 0x60, 0x60, 0x62, 0x68, + 0x6e, 0x6e, 0x68, 0x61, 0x53, 0x4b, 0x3e, 0x30, 0x4f, 0x98, 0x9c, 0x57, + 0x18, 0x30, 0x47, 0x4c, 0x49, 0x59, 0x80, 0xa3, 0x3b, 0x40, 0x58, 0x6d, + 0x58, 0x2a, 0x19, 0x27, 0x2a, 0x3d, 0x5a, 0x66, 0x4c, 0x25, 0x16, 0x20, + 0x31, 0x25, 0x1e, 0x27, 0x3b, 0x49, 0x49, 0x43, 0x48, 0x34, 0x1a, 0x42, + 0x9b, 0xa9, 0x5a, 0x14, 0x3e, 0x70, 0x72, 0x55, 0x54, 0x4e, 0x38, 0x33, + 0x1f, 0x2f, 0x27, 0x1f, 0x23, 0x17, 0x1b, 0x40, 0x32, 0x42, 0x33, 0x22, + 0x24, 0x1b, 0x17, 0x2d, 0x15, 0x42, 0x2d, 0x13, 0x33, 0x37, 0x20, 0x2a, + 0x2a, 0x4b, 0x4e, 0x35, 0x42, 0x69, 0x5d, 0x2b, 0x2d, 0x19, 0x18, 0x2f, + 0x3e, 0x33, 0x25, 0x22, 0x1c, 0x1b, 0x3c, 0x36, 0x32, 0x37, 0x1d, 0x27, + 0x60, 0x8c, 0xb9, 0xc2, 0xae, 0x9e, 0xa9, 0xbc, 0x86, 0x9a, 0xaf, 0xb4, + 0xac, 0xa6, 0xaa, 0xb1, 0xbe, 0xbf, 0xae, 0x95, 0xad, 0xb0, 0x90, 0xa5, + 0xad, 0x92, 0x90, 0xa8, 0x9a, 0xbf, 0xbe, 0x92, 0x9b, 0x97, 0x85, 0x8d, + 0x76, 0x96, 0x97, 0x95, 0x89, 0x9c, 0xaa, 0xa4, 0xb1, 0xa3, 0x7f, 0x99, + 0xb0, 0x93, 0x95, 0x97, 0x91, 0x84, 0x68, 0x96, 0xa0, 0x83, 0x92, 0xad, + 0xb0, 0x80, 0x47, 0x4f, 0x55, 0x93, 0xd4, 0xe3, 0xc4, 0xa7, 0xab, 0xbd, + 0xaf, 0xba, 0x77, 0x1c, 0x38, 0xa1, 0xa5, 0x52, 0x6d, 0x4b, 0x60, 0x6f, + 0x46, 0x39, 0x3a, 0x16, 0x2a, 0x3f, 0x40, 0x32, 0x3e, 0x60, 0x68, 0x55, + 0x5f, 0x6d, 0x54, 0x47, 0x5c, 0x50, 0x37, 0x44, 0x56, 0x79, 0x8c, 0x6c, + 0x39, 0x2a, 0x4f, 0x7b, 0x4b, 0x56, 0x63, 0x69, 0x60, 0x4a, 0x31, 0x20, + 0x33, 0x28, 0x5b, 0x2e, 0x13, 0x46, 0x48, 0x5f, 0x43, 0x48, 0x24, 0x16, + 0x42, 0x5c, 0x5d, 0x71, 0x9b, 0x78, 0x51, 0x32, 0x24, 0x30, 0x3f, 0x3e, + 0x2f, 0x37, 0x3c, 0x37, 0x39, 0x52, 0x6c, 0x73, 0x49, 0x42, 0x22, 0x26, + 0x50, 0x4f, 0x3d, 0x4e, 0x48, 0x52, 0x44, 0x1f, 0x0b, 0x17, 0x26, 0x29, + 0x3a, 0x83, 0x98, 0x2c, 0x12, 0xbf, 0xf3, 0x51, 0xb7, 0xef, 0xff, 0xd4, + 0x69, 0x23, 0x29, 0x4b, 0x60, 0x32, 0x14, 0x1c, 0x23, 0x1f, 0x2f, 0x4c, + 0x45, 0x42, 0x5a, 0x45, 0x22, 0x26, 0x29, 0x2e, 0x3f, 0x22, 0x34, 0x3b, + 0x1d, 0x3b, 0x72, 0x6b, 0x79, 0x73, 0x6e, 0x6f, 0x76, 0x7c, 0x7d, 0x7c, + 0x8b, 0x88, 0x83, 0x7f, 0x7b, 0x78, 0x78, 0x77, 0x70, 0x72, 0x74, 0x73, + 0x6f, 0x67, 0x5f, 0x5a, 0x67, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x64, 0x5f, 0x5b, 0x5d, 0x65, 0x6b, 0x6d, 0x6c, 0x59, 0x31, 0x39, 0x81, + 0x73, 0x31, 0x33, 0x37, 0x20, 0x19, 0x31, 0x41, 0x36, 0x45, 0x5d, 0x56, + 0x36, 0x1e, 0x1b, 0x2f, 0x32, 0x1d, 0x15, 0x20, 0x2c, 0x56, 0x55, 0x28, + 0x21, 0x45, 0x46, 0x21, 0x79, 0x8b, 0x73, 0x64, 0x78, 0x6a, 0x59, 0x74, + 0x25, 0x55, 0x6d, 0x59, 0x4b, 0x52, 0x46, 0x28, 0x49, 0x51, 0x45, 0x7a, + 0xcd, 0x9e, 0x2e, 0x0c, 0x2a, 0x21, 0x2c, 0x27, 0x0e, 0x1c, 0x3f, 0x48, + 0x6c, 0x6d, 0x85, 0x75, 0x41, 0x3f, 0x46, 0x23, 0xac, 0x80, 0x52, 0x46, + 0x55, 0x5f, 0x54, 0x42, 0x45, 0x1e, 0x42, 0x4f, 0x2a, 0x54, 0x69, 0x10, + 0x32, 0x18, 0x15, 0x31, 0x3f, 0x31, 0x28, 0x2f, 0x23, 0x16, 0x20, 0x3d, + 0x3f, 0x20, 0x0a, 0x0a, 0x67, 0x6f, 0x84, 0xa5, 0xc3, 0xce, 0xc4, 0xb6, + 0xc0, 0xcf, 0xd4, 0xbe, 0x97, 0x7f, 0x82, 0x8f, 0x95, 0x98, 0x8a, 0x9f, + 0xa4, 0x82, 0x62, 0x39, 0x5f, 0xae, 0xb0, 0xb9, 0xb7, 0x9c, 0x77, 0x8b, + 0xca, 0xd3, 0x98, 0x8b, 0xa0, 0xb9, 0x94, 0x97, 0xae, 0x8f, 0x85, 0xb8, + 0xa4, 0x78, 0x9a, 0xa0, 0x8b, 0x60, 0xa9, 0xb1, 0xac, 0xbf, 0xab, 0xb9, + 0x70, 0x60, 0x88, 0x8e, 0x7b, 0x7b, 0x91, 0xd2, 0xca, 0xb0, 0x86, 0x5e, + 0x4a, 0x51, 0x6a, 0x80, 0x72, 0x85, 0x6e, 0x3e, 0x44, 0x7a, 0x8b, 0x70, + 0x6c, 0x56, 0x4b, 0x34, 0x5f, 0xea, 0xeb, 0x45, 0x12, 0x33, 0x4a, 0x42, + 0x3a, 0x4b, 0x6b, 0x81, 0x22, 0x4e, 0x4f, 0x55, 0x6d, 0x51, 0x69, 0xdb, + 0x77, 0x77, 0x52, 0x1a, 0x10, 0x32, 0x46, 0x3c, 0x43, 0x39, 0x2a, 0x1d, + 0x18, 0x1b, 0x23, 0x28, 0x28, 0x51, 0x26, 0x26, 0x61, 0x46, 0x14, 0x1d, + 0x28, 0x2b, 0x54, 0x5a, 0x25, 0x19, 0x3d, 0x4c, 0x23, 0x5e, 0xd8, 0xfb, + 0x7d, 0x0f, 0x26, 0x65, 0x85, 0x55, 0x29, 0x0c, 0x1a, 0x56, 0x59, 0x14, + 0x24, 0x64, 0x64, 0x29, 0x26, 0x5e, 0x7e, 0x7a, 0x2b, 0x3b, 0x3b, 0x2b, + 0x29, 0x39, 0x41, 0x39, 0x31, 0x2c, 0x34, 0x22, 0x1f, 0x62, 0x6d, 0x17, + 0x92, 0x6c, 0x35, 0x13, 0x1d, 0x37, 0x38, 0x26, 0x4b, 0x30, 0x34, 0x60, + 0x81, 0x7b, 0x6d, 0x6b, 0xa1, 0x69, 0x2a, 0x11, 0x34, 0x3b, 0x21, 0x3d, + 0x58, 0x74, 0x72, 0x6c, 0x5d, 0x50, 0x66, 0x7b, 0x6b, 0x6b, 0x70, 0x78, + 0x7e, 0x7e, 0x77, 0x6f, 0x68, 0x63, 0x5c, 0x57, 0x58, 0x5f, 0x67, 0x6d, + 0x65, 0x68, 0x6d, 0x71, 0x71, 0x6e, 0x6b, 0x68, 0x69, 0x69, 0x69, 0x68, + 0x68, 0x68, 0x67, 0x67, 0x63, 0x5d, 0x57, 0x57, 0x5b, 0x5f, 0x5e, 0x5c, + 0x3f, 0x3a, 0x4c, 0x4a, 0x2a, 0x1a, 0x2f, 0x52, 0x63, 0x4c, 0x4b, 0x42, + 0x26, 0x2c, 0x3f, 0x36, 0x4f, 0x41, 0x2d, 0x23, 0x2a, 0x34, 0x2f, 0x23, + 0x56, 0x53, 0x46, 0x43, 0x63, 0x92, 0xa7, 0xa2, 0x9a, 0x65, 0x3c, 0x2b, + 0x1e, 0x21, 0x39, 0x4e, 0x9d, 0x7f, 0x54, 0x2f, 0x1a, 0x1d, 0x32, 0x48, + 0x43, 0x4b, 0x46, 0x5b, 0x96, 0xaf, 0x86, 0x57, 0x18, 0x13, 0x2a, 0x34, + 0x23, 0x27, 0x34, 0x29, 0x4c, 0x45, 0x38, 0x22, 0x19, 0x2c, 0x35, 0x25, + 0x30, 0x69, 0x74, 0x45, 0x39, 0x62, 0x6d, 0x4f, 0x17, 0x09, 0x17, 0x2b, + 0x35, 0x52, 0x5c, 0x3e, 0x27, 0x36, 0x50, 0x60, 0x54, 0x37, 0x26, 0x26, + 0x3f, 0x27, 0x18, 0x1f, 0x29, 0x23, 0x16, 0x0e, 0x95, 0x9b, 0xa5, 0xb0, + 0xb3, 0xac, 0x9d, 0x91, 0x8a, 0x97, 0x9b, 0x8b, 0x74, 0x73, 0x8e, 0xab, + 0xa4, 0xbb, 0x91, 0x6a, 0x66, 0x7c, 0xa2, 0xa4, 0xc5, 0xb5, 0x8d, 0x85, + 0x52, 0x60, 0x93, 0x9e, 0xa2, 0x93, 0x89, 0xb3, 0xc9, 0xca, 0xac, 0xab, + 0xc3, 0xa6, 0x9d, 0x96, 0x91, 0xa2, 0xb5, 0xc0, 0xa5, 0x89, 0xa9, 0xaf, + 0xd4, 0x8a, 0x52, 0x6c, 0x7d, 0x56, 0xaa, 0xb4, 0x69, 0x53, 0x45, 0x46, + 0x5b, 0x2e, 0x01, 0x01, 0x29, 0x51, 0x5f, 0x5b, 0x92, 0x9d, 0x86, 0x43, + 0x0a, 0x16, 0x61, 0xa6, 0x7d, 0x38, 0x56, 0xa3, 0xb0, 0xab, 0x95, 0x59, + 0xc1, 0x90, 0x60, 0x52, 0x52, 0x4a, 0x3d, 0x36, 0x2f, 0x55, 0x33, 0x40, + 0xb9, 0xce, 0x4f, 0x00, 0x26, 0x4b, 0x48, 0x1a, 0x16, 0x41, 0x50, 0x38, + 0x40, 0x38, 0x2d, 0x25, 0x25, 0x2d, 0x38, 0x3f, 0x3a, 0x6b, 0x54, 0x64, + 0x4f, 0x36, 0x4f, 0x02, 0x29, 0x1f, 0x22, 0x40, 0x9d, 0xfe, 0xb5, 0x00, + 0x46, 0xae, 0xff, 0xff, 0x81, 0x74, 0x83, 0x3c, 0x00, 0x2a, 0xa8, 0xfd, + 0xbd, 0x54, 0x31, 0x36, 0x39, 0x39, 0x3d, 0x2d, 0x14, 0x1b, 0x30, 0x30, + 0x48, 0x58, 0x5e, 0x5b, 0x66, 0x78, 0x74, 0x60, 0x41, 0x25, 0x23, 0x38, + 0x3a, 0x32, 0x38, 0x43, 0x30, 0x16, 0x10, 0x1c, 0x13, 0x01, 0x15, 0x3f, + 0x49, 0x20, 0x0f, 0x33, 0x60, 0x67, 0x50, 0x3c, 0x3d, 0x5c, 0x94, 0x8d, + 0x5c, 0x3a, 0x28, 0x39, 0x3d, 0x31, 0x19, 0x2f, 0x40, 0x54, 0x7f, 0x71, + 0x78, 0x74, 0x72, 0x75, 0x7d, 0x82, 0x81, 0x7f, 0x79, 0x7b, 0x7f, 0x82, + 0x83, 0x81, 0x7e, 0x7c, 0x72, 0x74, 0x78, 0x7b, 0x7b, 0x7a, 0x78, 0x76, + 0x77, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6b, 0x71, 0x6a, 0x62, 0x5f, + 0x61, 0x62, 0x60, 0x5d, 0x50, 0x37, 0x38, 0x31, 0x4a, 0x5a, 0x2f, 0x2a, + 0x16, 0x3c, 0x7a, 0x7f, 0x43, 0x2a, 0x3e, 0x45, 0x49, 0x70, 0x85, 0x79, + 0x73, 0x7a, 0x6a, 0x4b, 0x7c, 0x5d, 0x4f, 0x67, 0x80, 0x79, 0x60, 0x4e, + 0x4a, 0x21, 0x43, 0x73, 0x69, 0x65, 0x62, 0x3c, 0x31, 0x2c, 0x25, 0x1c, + 0x18, 0x25, 0x43, 0x5f, 0x28, 0x28, 0x35, 0x42, 0x53, 0x73, 0x72, 0x4a, + 0x6c, 0x3f, 0x3a, 0x5f, 0x82, 0x94, 0x75, 0x35, 0x1d, 0x6e, 0x52, 0x1d, + 0x32, 0x1b, 0x04, 0x40, 0x16, 0x2e, 0x41, 0x43, 0x43, 0x44, 0x38, 0x27, + 0x2d, 0x1a, 0x0f, 0x36, 0x5f, 0x50, 0x4c, 0x7a, 0x4c, 0x39, 0x2d, 0x47, + 0x7e, 0xa0, 0x88, 0x5c, 0x33, 0x2c, 0x22, 0x23, 0x35, 0x40, 0x2f, 0x13, + 0x75, 0x9c, 0xb8, 0x9e, 0x62, 0x3b, 0x45, 0x61, 0x88, 0x82, 0x79, 0x72, + 0x76, 0x8a, 0xa6, 0xba, 0x97, 0x55, 0x61, 0x9a, 0xba, 0xaf, 0xa5, 0xd1, + 0xb5, 0xad, 0x89, 0xb4, 0xbc, 0xb9, 0xbc, 0xb6, 0xa5, 0xaf, 0xc5, 0xc9, + 0xbb, 0xd6, 0xcf, 0x9a, 0x7c, 0x9b, 0x8e, 0x6b, 0xa2, 0xb2, 0x62, 0x53, + 0x94, 0x89, 0x98, 0xa4, 0xa0, 0x4d, 0xa3, 0xc1, 0xaf, 0x94, 0xb1, 0x83, + 0x6f, 0xb1, 0xb6, 0xad, 0x61, 0x46, 0x36, 0x4d, 0x7a, 0x92, 0x83, 0x69, + 0x50, 0x34, 0x23, 0x43, 0x7e, 0x8d, 0x4e, 0x02, 0x21, 0x53, 0x8d, 0xb3, + 0xb6, 0x9f, 0x9a, 0xb0, 0x30, 0x20, 0x28, 0x43, 0x43, 0x29, 0x25, 0x38, + 0x34, 0x38, 0x64, 0xb2, 0xcf, 0x94, 0x4e, 0x3b, 0x4b, 0x60, 0x5e, 0x42, + 0x33, 0x38, 0x31, 0x1c, 0x10, 0x1b, 0x2b, 0x39, 0x3d, 0x37, 0x2d, 0x25, + 0x39, 0x38, 0x48, 0x78, 0x96, 0xe0, 0xe4, 0x36, 0x0b, 0x21, 0x1f, 0x49, + 0xba, 0xff, 0xf9, 0xed, 0x8d, 0x5c, 0x7f, 0x75, 0x13, 0x1b, 0x4d, 0x20, + 0x74, 0xd8, 0xed, 0x8b, 0x24, 0x07, 0x33, 0x71, 0x86, 0x3c, 0x31, 0x4d, + 0x2e, 0x08, 0x1c, 0x40, 0x27, 0x2f, 0x2b, 0x23, 0x2d, 0x40, 0x3b, 0x26, + 0x20, 0x38, 0x34, 0x19, 0x07, 0x06, 0x31, 0x71, 0x70, 0x4e, 0x2e, 0x27, + 0x30, 0x3a, 0x40, 0x45, 0x4d, 0x57, 0x5d, 0x52, 0x3d, 0x38, 0x53, 0x73, + 0x46, 0x5b, 0xae, 0xbc, 0x71, 0x32, 0x1d, 0x2d, 0x46, 0x35, 0x1f, 0x38, + 0x3c, 0x50, 0x86, 0x6f, 0x79, 0x73, 0x6d, 0x6e, 0x76, 0x7e, 0x82, 0x83, + 0x7b, 0x80, 0x86, 0x87, 0x81, 0x74, 0x66, 0x5c, 0x63, 0x65, 0x68, 0x6c, + 0x6f, 0x71, 0x73, 0x73, 0x6d, 0x6b, 0x69, 0x65, 0x62, 0x5e, 0x5b, 0x5a, + 0x6a, 0x63, 0x5b, 0x58, 0x59, 0x5a, 0x58, 0x55, 0x4d, 0x38, 0x37, 0x50, + 0x79, 0x66, 0x22, 0x18, 0x25, 0x18, 0x32, 0x53, 0x5c, 0x6e, 0x72, 0x56, + 0x67, 0x83, 0x85, 0x57, 0x27, 0x1b, 0x26, 0x30, 0x67, 0x44, 0x27, 0x2a, + 0x36, 0x35, 0x2e, 0x2a, 0x3b, 0x20, 0x1c, 0x22, 0x29, 0x4a, 0x56, 0x34, + 0x1b, 0x4a, 0x60, 0x53, 0x62, 0xa2, 0xda, 0xec, 0xd5, 0xae, 0x86, 0x6b, + 0x51, 0x42, 0x55, 0x75, 0x5e, 0x48, 0x51, 0x61, 0x63, 0x75, 0x80, 0x6d, + 0x49, 0x59, 0x37, 0x1d, 0x3a, 0x41, 0x2a, 0x28, 0x1f, 0x20, 0x2f, 0x46, + 0x4b, 0x3d, 0x32, 0x32, 0x22, 0x41, 0x31, 0x11, 0x24, 0x41, 0x3e, 0x33, + 0x2f, 0x45, 0x45, 0x2e, 0x2b, 0x47, 0x5b, 0x59, 0x29, 0x38, 0x37, 0x28, + 0x2b, 0x33, 0x1e, 0x00, 0xb5, 0xad, 0xa8, 0xad, 0xb5, 0xb3, 0xa6, 0x98, + 0x95, 0x94, 0x9c, 0xaa, 0xad, 0x91, 0x5e, 0x33, 0x55, 0x53, 0x7e, 0x84, + 0x8a, 0xb2, 0xa4, 0x79, 0x53, 0xd5, 0xe3, 0xb8, 0x8f, 0xa4, 0xd1, 0xff, + 0xcb, 0xbb, 0xb9, 0xaf, 0x9f, 0x92, 0x90, 0x86, 0x89, 0xda, 0xc6, 0xbb, + 0xd9, 0xd2, 0xcb, 0xc2, 0x6b, 0x86, 0x8c, 0x7b, 0x78, 0x3a, 0x7b, 0x54, + 0x33, 0x6c, 0xa8, 0xab, 0xc4, 0xab, 0x4d, 0x49, 0x24, 0x56, 0xa4, 0xe5, + 0xf4, 0xc7, 0x78, 0x3c, 0x36, 0x2f, 0x20, 0x37, 0x8f, 0xdc, 0xc3, 0x78, + 0x6d, 0xb0, 0x68, 0x06, 0x19, 0x22, 0x17, 0x44, 0x1b, 0x21, 0x4c, 0x86, + 0x8d, 0x5c, 0x2f, 0x22, 0x44, 0xa0, 0xe4, 0x9d, 0x48, 0x97, 0xff, 0xff, + 0xa2, 0x5b, 0x26, 0x2e, 0x45, 0x3f, 0x28, 0x1c, 0x1f, 0x21, 0x25, 0x2a, + 0x30, 0x35, 0x3a, 0x3c, 0x3f, 0x4d, 0x5a, 0x25, 0x23, 0x47, 0x36, 0x45, + 0x2b, 0x43, 0x33, 0x1e, 0x29, 0x47, 0x98, 0xff, 0xa5, 0x19, 0x0d, 0x3c, + 0x25, 0x45, 0x7d, 0x5e, 0x38, 0x52, 0x60, 0xb6, 0xff, 0xc4, 0x5c, 0x73, + 0xc5, 0x67, 0x2e, 0x3c, 0x48, 0x38, 0x29, 0x25, 0x34, 0x39, 0x2e, 0x1c, + 0x22, 0x3d, 0x49, 0x42, 0x31, 0x5b, 0x55, 0x21, 0x04, 0x12, 0x41, 0x77, + 0x69, 0x66, 0x3a, 0x0e, 0x31, 0x78, 0x72, 0x33, 0x22, 0x2d, 0x33, 0x2f, + 0x2c, 0x33, 0x3d, 0x42, 0x51, 0xb0, 0xbb, 0x4f, 0x2b, 0x53, 0x55, 0x56, + 0x71, 0x69, 0x34, 0x31, 0x4c, 0x58, 0x71, 0x78, 0x74, 0x75, 0x79, 0x82, + 0x8b, 0x8d, 0x87, 0x81, 0x81, 0x7d, 0x77, 0x6e, 0x65, 0x5c, 0x56, 0x52, + 0x62, 0x63, 0x66, 0x6b, 0x71, 0x77, 0x7c, 0x7f, 0x70, 0x6e, 0x6b, 0x68, + 0x64, 0x61, 0x5e, 0x5d, 0x69, 0x62, 0x5a, 0x58, 0x5b, 0x5d, 0x5c, 0x59, + 0x47, 0x46, 0x31, 0x4a, 0x5b, 0x34, 0x21, 0x29, 0x22, 0x14, 0x2b, 0x48, + 0x4d, 0x5a, 0x5c, 0x3e, 0x4d, 0x45, 0x40, 0x3a, 0x27, 0x1b, 0x32, 0x56, + 0x2e, 0x31, 0x29, 0x1d, 0x22, 0x36, 0x43, 0x42, 0x48, 0x6f, 0x5b, 0x38, + 0x56, 0x77, 0x64, 0x47, 0xbd, 0xcc, 0xb8, 0x87, 0x75, 0x84, 0x7e, 0x62, + 0xa6, 0xb8, 0x9d, 0x81, 0x74, 0x41, 0x2f, 0x66, 0x3a, 0x13, 0x11, 0x2e, + 0x46, 0x59, 0x48, 0x17, 0x17, 0x20, 0x8a, 0xad, 0x5d, 0x6c, 0x96, 0x58, + 0x00, 0x45, 0x63, 0x39, 0x26, 0x51, 0x77, 0x76, 0x40, 0x24, 0x28, 0x33, + 0x1d, 0x0f, 0x19, 0x1e, 0x18, 0x2c, 0x31, 0x27, 0x2f, 0x44, 0x42, 0x2b, + 0x56, 0x6d, 0x70, 0x56, 0x42, 0x3a, 0x21, 0x00, 0x50, 0x79, 0x9b, 0x90, + 0x6a, 0x5e, 0x7f, 0xa7, 0xcb, 0xb1, 0x93, 0x89, 0x92, 0x9e, 0x9e, 0x99, + 0x66, 0x89, 0x70, 0x68, 0x7c, 0x76, 0x5f, 0x39, 0x23, 0x23, 0x3e, 0x5f, + 0x5b, 0x85, 0x71, 0x33, 0x10, 0x6a, 0xce, 0xb4, 0x77, 0x71, 0xb4, 0xcb, + 0xbf, 0x87, 0x97, 0xbf, 0x83, 0x45, 0x74, 0xb5, 0xbe, 0x95, 0x52, 0x17, + 0x4a, 0x42, 0x3d, 0x32, 0x98, 0x76, 0x58, 0x36, 0x2b, 0x35, 0x38, 0x43, + 0x63, 0x5c, 0x4d, 0x40, 0x4b, 0x78, 0xbb, 0xed, 0xc4, 0xfa, 0xf2, 0x90, + 0x36, 0x24, 0x31, 0x32, 0x13, 0x5b, 0x78, 0xb3, 0xed, 0x86, 0x20, 0x54, + 0x41, 0x22, 0x1b, 0x40, 0x64, 0x59, 0x26, 0x00, 0x26, 0x62, 0xb6, 0x95, + 0x14, 0x0d, 0x91, 0xf9, 0x64, 0x27, 0x12, 0x39, 0x49, 0x29, 0x1a, 0x2e, + 0x5a, 0x43, 0x23, 0x0e, 0x12, 0x2e, 0x55, 0x6f, 0x98, 0x3a, 0x68, 0x66, + 0x41, 0x3e, 0x16, 0x27, 0x16, 0x21, 0x3e, 0x38, 0x1c, 0x2e, 0x3b, 0x16, + 0x3b, 0x21, 0x19, 0x00, 0x1b, 0xaf, 0xeb, 0x82, 0x73, 0xa5, 0x6f, 0x54, + 0xc6, 0xff, 0xb7, 0x76, 0x31, 0x2b, 0x3e, 0x7b, 0x82, 0x26, 0x00, 0x35, + 0x26, 0x38, 0x37, 0x22, 0x20, 0x3f, 0x5e, 0x6a, 0x47, 0x47, 0x42, 0x2e, + 0x1a, 0x24, 0x3c, 0x46, 0x1e, 0x1d, 0x25, 0x2d, 0x28, 0x29, 0x4c, 0x78, + 0x5d, 0x53, 0x3b, 0x25, 0x2c, 0x44, 0x4a, 0x3d, 0x58, 0x5d, 0x6e, 0x59, + 0x40, 0x37, 0x3e, 0x6b, 0x55, 0x2e, 0x28, 0x2c, 0x32, 0x5c, 0x7e, 0x7c, + 0x73, 0x71, 0x72, 0x79, 0x82, 0x87, 0x86, 0x83, 0x8e, 0x8d, 0x8a, 0x85, + 0x80, 0x7a, 0x75, 0x72, 0x8a, 0x87, 0x82, 0x7d, 0x7a, 0x79, 0x7a, 0x7b, + 0x7f, 0x7e, 0x7c, 0x7a, 0x78, 0x75, 0x74, 0x73, 0x73, 0x6c, 0x65, 0x62, + 0x65, 0x67, 0x65, 0x62, 0x53, 0x56, 0x2b, 0x2d, 0x39, 0x32, 0x40, 0x31, + 0x20, 0x48, 0x8b, 0x97, 0x62, 0x50, 0x69, 0x73, 0x52, 0x35, 0x30, 0x4a, + 0x4f, 0x32, 0x1f, 0x24, 0x1d, 0x34, 0x42, 0x3d, 0x3b, 0x44, 0x46, 0x3e, + 0x1b, 0x72, 0x82, 0x6e, 0x87, 0x7b, 0x3d, 0x1f, 0x34, 0x2c, 0x36, 0x5d, + 0x7e, 0x73, 0x40, 0x12, 0x53, 0x8e, 0x6c, 0x31, 0x3b, 0x3c, 0x45, 0x81, + 0x3a, 0x26, 0x22, 0x1a, 0x13, 0x4c, 0xa6, 0xd3, 0xa4, 0x7b, 0x4e, 0x22, + 0x11, 0x36, 0x57, 0x4c, 0x2d, 0x40, 0x39, 0x17, 0x12, 0x34, 0x52, 0x56, + 0x48, 0x35, 0x4d, 0x63, 0x47, 0x33, 0x3c, 0x3f, 0x05, 0x16, 0x23, 0x26, + 0x2a, 0x2f, 0x29, 0x1d, 0x3a, 0x55, 0x71, 0x7d, 0x78, 0x5d, 0x2d, 0x03, + 0xd9, 0xae, 0x8b, 0x94, 0xb8, 0xc4, 0xa5, 0x7f, 0x6b, 0x8f, 0xba, 0xd0, + 0xcc, 0xbf, 0xb7, 0xb7, 0xba, 0xdb, 0xca, 0xcd, 0xd1, 0xb1, 0xb3, 0xc8, + 0xbe, 0x6d, 0x85, 0xb7, 0x7e, 0x44, 0x13, 0x2d, 0x39, 0x22, 0x3a, 0x33, + 0x25, 0x1d, 0x68, 0x9a, 0x46, 0x1e, 0x56, 0x5f, 0x48, 0x69, 0x5e, 0x39, + 0x64, 0x31, 0x45, 0x5c, 0x59, 0x4d, 0x44, 0x32, 0x34, 0x35, 0x3f, 0x40, + 0x3f, 0x83, 0xa2, 0x45, 0x8a, 0x70, 0x45, 0x1f, 0x1c, 0x49, 0x94, 0xcd, + 0xc6, 0x9e, 0x62, 0x30, 0x1b, 0x23, 0x35, 0x41, 0x80, 0x95, 0xa5, 0xb9, + 0xb5, 0x77, 0x47, 0x54, 0x43, 0x40, 0x2f, 0x19, 0x14, 0x1d, 0x1e, 0x15, + 0x9f, 0xe3, 0xcd, 0xa1, 0xdd, 0xff, 0xdc, 0x95, 0x25, 0x23, 0x38, 0x4f, + 0x39, 0x08, 0x00, 0x17, 0x44, 0x39, 0x2a, 0x20, 0x21, 0x2d, 0x3e, 0x4a, + 0x47, 0x18, 0x78, 0x82, 0x0c, 0x4d, 0xf2, 0xff, 0x98, 0xb6, 0xfb, 0xf8, + 0x84, 0x23, 0x0f, 0x0f, 0x1e, 0x37, 0x42, 0x1c, 0x17, 0x78, 0xbe, 0xa4, + 0x50, 0x4f, 0x3a, 0x10, 0x00, 0x18, 0x28, 0x17, 0x34, 0x1b, 0x10, 0x94, + 0xff, 0xcd, 0x2a, 0x1b, 0x29, 0x4f, 0x60, 0x48, 0x34, 0x43, 0x64, 0x78, + 0x61, 0x50, 0x5d, 0x53, 0x3c, 0x6a, 0x99, 0x80, 0x7f, 0x3a, 0x1f, 0x40, + 0x47, 0x30, 0x4d, 0x8f, 0x5b, 0x75, 0x6e, 0x3b, 0x18, 0x28, 0x4b, 0x5e, + 0x8b, 0x3b, 0x39, 0x58, 0x6a, 0x73, 0x4f, 0x28, 0x39, 0x2b, 0xa1, 0xa9, + 0x4b, 0x5b, 0x81, 0x7a, 0x68, 0x61, 0x5c, 0x5e, 0x68, 0x72, 0x78, 0x7a, + 0x81, 0x83, 0x85, 0x85, 0x82, 0x7d, 0x78, 0x74, 0x8d, 0x88, 0x7f, 0x75, + 0x6e, 0x6b, 0x6b, 0x6b, 0x74, 0x74, 0x74, 0x74, 0x73, 0x73, 0x73, 0x73, + 0x74, 0x6c, 0x63, 0x5e, 0x5e, 0x5d, 0x59, 0x55, 0x4e, 0x50, 0x43, 0x33, + 0x31, 0x49, 0x56, 0x3f, 0x2f, 0x1d, 0x25, 0x29, 0x1a, 0x2c, 0x49, 0x45, + 0x23, 0x26, 0x2d, 0x30, 0x29, 0x1d, 0x1c, 0x23, 0x3d, 0x23, 0x17, 0x26, + 0x3a, 0x48, 0x5e, 0x76, 0x66, 0x72, 0x6f, 0x5b, 0x40, 0x26, 0x27, 0x3d, + 0x48, 0x3d, 0x3e, 0x56, 0x69, 0x5e, 0x36, 0x13, 0x25, 0x5a, 0x58, 0x32, + 0x28, 0x24, 0x2a, 0x47, 0x4e, 0x2b, 0x1f, 0x1d, 0x14, 0x24, 0x30, 0x1e, + 0x4d, 0x79, 0x3b, 0x00, 0x17, 0x2e, 0x4b, 0x9e, 0x6f, 0x36, 0x07, 0x07, + 0x18, 0x1b, 0x16, 0x15, 0x6d, 0xfa, 0xff, 0xa7, 0xaa, 0xf6, 0xe1, 0x8a, + 0x27, 0x12, 0x21, 0x6d, 0xc1, 0xdc, 0xbb, 0x93, 0x35, 0x23, 0x25, 0x48, + 0x61, 0x4d, 0x17, 0x00, 0x67, 0x87, 0x99, 0x7f, 0x4e, 0x3a, 0x55, 0x7a, + 0x6b, 0x82, 0x87, 0x5e, 0x27, 0x1a, 0x46, 0x79, 0x5b, 0x18, 0x44, 0x6e, + 0x6d, 0x98, 0xa7, 0x83, 0x34, 0x26, 0x6e, 0x6d, 0x26, 0x3b, 0x31, 0x3e, + 0x6d, 0x50, 0x28, 0x1e, 0x61, 0x3b, 0x30, 0x58, 0x50, 0x43, 0x30, 0x40, + 0x42, 0x37, 0x3e, 0x2f, 0x3c, 0x47, 0x29, 0x3b, 0x42, 0x3f, 0x53, 0x60, + 0x60, 0x56, 0x28, 0x35, 0x3e, 0x31, 0x3f, 0x27, 0x3b, 0x37, 0x30, 0x28, + 0x25, 0x28, 0x30, 0x37, 0x0f, 0x03, 0x3d, 0xb4, 0xf4, 0xcb, 0x85, 0x64, + 0x91, 0x35, 0x16, 0x21, 0x15, 0x2a, 0x4c, 0x40, 0x3c, 0x3c, 0x31, 0x33, + 0x58, 0x77, 0x56, 0x1b, 0x62, 0xb9, 0x64, 0x12, 0x5b, 0x57, 0x17, 0x3e, + 0x19, 0x0e, 0x0a, 0x17, 0x2d, 0x3a, 0x3d, 0x3c, 0x2d, 0x49, 0x70, 0x8c, + 0x8a, 0x6d, 0x44, 0x27, 0x03, 0xaa, 0xff, 0xff, 0xb7, 0xae, 0xed, 0xa8, + 0x75, 0xa3, 0x73, 0x17, 0x0e, 0x2d, 0x34, 0x34, 0x69, 0x43, 0x1f, 0x19, + 0x3a, 0x63, 0x5a, 0x2e, 0x30, 0x45, 0x85, 0x80, 0x70, 0xe1, 0xff, 0x8b, + 0x5d, 0xe4, 0xdf, 0xb8, 0xdc, 0x8e, 0x16, 0x21, 0x3d, 0x71, 0x8e, 0x71, + 0x47, 0x42, 0x58, 0x6b, 0x2c, 0x39, 0x5a, 0x33, 0x0b, 0x78, 0xdd, 0xb8, + 0xac, 0xc1, 0xb3, 0x8d, 0x8b, 0x9a, 0x74, 0x31, 0x48, 0x30, 0x15, 0x24, + 0x67, 0x92, 0x61, 0x0e, 0x24, 0x1f, 0x23, 0x1f, 0x2e, 0x30, 0x21, 0x3e, + 0x57, 0x62, 0xe5, 0xd5, 0x6e, 0x61, 0x57, 0x66, 0x6e, 0x6f, 0x72, 0x7b, + 0x85, 0x89, 0x87, 0x82, 0x92, 0x8b, 0x80, 0x77, 0x74, 0x77, 0x7d, 0x82, + 0x75, 0x73, 0x71, 0x71, 0x74, 0x7b, 0x83, 0x88, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7a, 0x84, 0x7b, 0x70, 0x68, 0x65, 0x62, 0x5c, 0x57, + 0x56, 0x34, 0x3a, 0x2d, 0x37, 0x65, 0x5a, 0x3d, 0x2d, 0x21, 0x2f, 0x31, + 0x18, 0x1b, 0x28, 0x1b, 0x56, 0xab, 0xe8, 0xca, 0x84, 0x56, 0x45, 0x3e, + 0x57, 0x1d, 0x13, 0x4c, 0x6c, 0x57, 0x4f, 0x65, 0x1a, 0x0e, 0x59, 0x9b, + 0x66, 0x28, 0x30, 0x45, 0x39, 0x60, 0x6c, 0x51, 0x45, 0x56, 0x55, 0x3e, + 0x32, 0x2b, 0x39, 0x40, 0x2b, 0x2b, 0x59, 0x87, 0x91, 0x62, 0x3f, 0x21, + 0x07, 0x19, 0x3a, 0x3c, 0x1b, 0x17, 0x1d, 0x15, 0x0f, 0x39, 0x62, 0x5d, + 0x4e, 0x5b, 0x43, 0x14, 0x13, 0x3b, 0x44, 0x2a, 0x74, 0xe4, 0xe0, 0xb5, + 0xd7, 0xc4, 0x8b, 0x98, 0x0f, 0x48, 0xaf, 0xff, 0xff, 0xff, 0xe9, 0xed, + 0xca, 0x68, 0x15, 0x15, 0x38, 0x3b, 0x21, 0x0c, 0x4c, 0x32, 0x13, 0x31, + 0x64, 0x51, 0x3e, 0x66, 0x5f, 0x27, 0x00, 0x24, 0x71, 0x95, 0x6f, 0x36, + 0x1f, 0x31, 0x67, 0x9f, 0x93, 0x4a, 0x0f, 0x00, 0x00, 0x3c, 0x60, 0x61, + 0x80, 0xb5, 0xb1, 0x82, 0x68, 0xc6, 0x4e, 0x28, 0x63, 0x40, 0x49, 0x68, + 0x45, 0x64, 0x4e, 0x3b, 0x52, 0x49, 0x3f, 0x67, 0x7e, 0x5f, 0x3f, 0x3b, + 0x52, 0x70, 0x80, 0x84, 0x3a, 0x40, 0x17, 0x0e, 0x2e, 0x11, 0x00, 0x2b, + 0x38, 0x36, 0x31, 0x35, 0x46, 0x4e, 0x3b, 0x1f, 0x03, 0x54, 0x84, 0xca, + 0xbd, 0x58, 0x39, 0x33, 0x17, 0x42, 0x6c, 0x6f, 0x53, 0x3d, 0x44, 0x56, + 0x48, 0x65, 0x2e, 0x2c, 0x8e, 0x8c, 0x55, 0x73, 0x29, 0x3e, 0x3f, 0x44, + 0x53, 0x42, 0x25, 0x24, 0x36, 0x1d, 0x39, 0x3c, 0x17, 0x41, 0x7e, 0x6f, + 0x41, 0x73, 0x93, 0x6e, 0x28, 0x0f, 0x40, 0x7e, 0x78, 0x49, 0x92, 0xf7, + 0xd8, 0x89, 0x62, 0x4a, 0x38, 0x69, 0x6a, 0x2c, 0x0b, 0x20, 0x25, 0x0b, + 0x5a, 0x5e, 0x64, 0x68, 0x64, 0x55, 0x40, 0x31, 0x38, 0x2e, 0x73, 0xfc, + 0xfb, 0xfc, 0xff, 0x9a, 0xa1, 0x94, 0x5a, 0x40, 0x83, 0xc2, 0x9b, 0x51, + 0x30, 0x2b, 0x24, 0x1f, 0x1f, 0x24, 0x2b, 0x30, 0x4e, 0x0b, 0x0d, 0x33, + 0x2d, 0x2c, 0x38, 0x2b, 0xb9, 0x84, 0x4b, 0x3a, 0x4a, 0x55, 0x44, 0x2b, + 0x31, 0x1a, 0x1f, 0x4b, 0x67, 0x55, 0x33, 0x21, 0x75, 0x79, 0x5d, 0x3e, + 0x37, 0x2b, 0x23, 0x2f, 0x35, 0x3a, 0x35, 0x0e, 0x31, 0x6e, 0x66, 0x6b, + 0x5c, 0x64, 0x6f, 0x75, 0x76, 0x74, 0x72, 0x71, 0x8c, 0x8d, 0x84, 0x75, + 0x72, 0x77, 0x74, 0x6a, 0x6a, 0x73, 0x7f, 0x8a, 0x8f, 0x8c, 0x85, 0x80, + 0x76, 0x7b, 0x7e, 0x78, 0x6c, 0x66, 0x69, 0x6e, 0x72, 0x6d, 0x66, 0x60, + 0x5e, 0x5f, 0x62, 0x65, 0x47, 0x3a, 0x39, 0x39, 0x2c, 0x27, 0x36, 0x43, + 0x3b, 0x49, 0x35, 0x29, 0x75, 0xd9, 0xce, 0x7b, 0xae, 0x8f, 0x77, 0x6c, + 0x54, 0x3a, 0x41, 0x5e, 0x55, 0x78, 0x9f, 0x93, 0x6a, 0x5c, 0x45, 0x14, + 0x60, 0x7f, 0x80, 0x77, 0x72, 0x52, 0x46, 0x6b, 0x94, 0x76, 0x4f, 0x39, + 0x37, 0x3e, 0x42, 0x41, 0x2e, 0x41, 0x53, 0x4c, 0x2b, 0x11, 0x1b, 0x35, + 0x0f, 0x36, 0x41, 0x22, 0x11, 0x24, 0x2f, 0x24, 0x1c, 0x39, 0x30, 0x21, + 0x2a, 0x1e, 0x19, 0x39, 0x68, 0x4a, 0x29, 0x24, 0x23, 0x1b, 0x49, 0x9e, + 0xf1, 0xef, 0xd7, 0xd4, 0xd3, 0xd1, 0xe5, 0xe4, 0xaf, 0xb3, 0xd1, 0xf0, + 0xe9, 0xd7, 0xf7, 0xff, 0xf0, 0xcb, 0xd9, 0xb1, 0x6b, 0x28, 0x00, 0x18, + 0x6d, 0x96, 0xb8, 0xe5, 0xfc, 0xa8, 0x34, 0x0b, 0x37, 0x3f, 0x4b, 0x5a, + 0x6a, 0x79, 0x85, 0x8d, 0x35, 0x42, 0x49, 0x5b, 0x93, 0xc7, 0xba, 0x89, + 0x7a, 0x3c, 0x19, 0x3e, 0x6d, 0x68, 0x3b, 0x16, 0x33, 0x66, 0x54, 0x56, + 0x5d, 0x40, 0x45, 0x53, 0xae, 0x71, 0x65, 0x67, 0x50, 0x58, 0x54, 0x1c, + 0x2c, 0x2e, 0x37, 0x47, 0x53, 0x51, 0x40, 0x30, 0x31, 0x32, 0x2f, 0x1c, + 0x15, 0x31, 0x42, 0x31, 0x20, 0x1f, 0x1c, 0x1a, 0x20, 0x2a, 0x2c, 0x29, + 0x41, 0x36, 0x5a, 0xab, 0x69, 0x03, 0x37, 0x69, 0x2a, 0x3b, 0x4c, 0x50, + 0x45, 0x39, 0x35, 0x36, 0x3e, 0x3e, 0x29, 0x2d, 0x4e, 0x3d, 0x0a, 0x00, + 0x26, 0x3b, 0x38, 0x32, 0x39, 0x2c, 0x20, 0x2e, 0x18, 0x40, 0x5c, 0x30, + 0x0c, 0x4c, 0x7d, 0x57, 0x2f, 0x33, 0x33, 0x33, 0x47, 0x80, 0xd1, 0xff, + 0xe4, 0x78, 0x87, 0xd9, 0xb7, 0x78, 0xa5, 0xf4, 0xa3, 0x5e, 0x38, 0x4b, + 0x4d, 0x2a, 0x21, 0x39, 0x33, 0x58, 0x7f, 0x84, 0x63, 0x37, 0x17, 0x0b, + 0x13, 0x0a, 0x8b, 0xfc, 0xf8, 0xf7, 0xff, 0xff, 0xff, 0xbd, 0x6e, 0x55, + 0x68, 0x65, 0x41, 0x24, 0x1a, 0x26, 0x37, 0x43, 0x42, 0x35, 0x23, 0x16, + 0x21, 0x40, 0x3b, 0x31, 0x31, 0x0a, 0x00, 0x1f, 0x95, 0x6d, 0x3f, 0x2b, + 0x30, 0x36, 0x2d, 0x1f, 0x1c, 0x26, 0x37, 0x3b, 0x26, 0x25, 0x61, 0xa9, + 0x8e, 0x4b, 0x2c, 0x2b, 0x12, 0x06, 0x2a, 0x50, 0x7c, 0x55, 0x5f, 0x4d, + 0x3f, 0x65, 0x6d, 0x62, 0x5d, 0x63, 0x6b, 0x70, 0x6f, 0x6b, 0x66, 0x63, + 0x7e, 0x82, 0x7d, 0x71, 0x71, 0x7a, 0x7b, 0x73, 0x75, 0x75, 0x75, 0x73, + 0x71, 0x6e, 0x6c, 0x6a, 0x80, 0x84, 0x86, 0x81, 0x77, 0x72, 0x74, 0x79, + 0x83, 0x7d, 0x72, 0x67, 0x5e, 0x58, 0x56, 0x56, 0x47, 0x49, 0x46, 0x30, + 0x1c, 0x2d, 0x46, 0x49, 0x80, 0x4d, 0x45, 0x75, 0x82, 0x54, 0x35, 0x3e, + 0x2c, 0x24, 0x1c, 0x34, 0x77, 0xab, 0x94, 0x5c, 0x47, 0x44, 0x52, 0x72, + 0x7a, 0x58, 0x42, 0x50, 0x6c, 0x6c, 0x48, 0x35, 0x4a, 0x4f, 0x58, 0x7f, + 0x74, 0x5f, 0x46, 0x38, 0x33, 0x2c, 0x1e, 0x10, 0x4e, 0x42, 0x20, 0x05, + 0x19, 0x39, 0x29, 0x00, 0x1f, 0x3a, 0x41, 0x31, 0x35, 0x50, 0x57, 0x48, + 0x69, 0x28, 0x00, 0x52, 0xff, 0xff, 0x80, 0x00, 0x04, 0x0f, 0x82, 0xf0, + 0xa6, 0x16, 0x2d, 0xb4, 0xba, 0xbf, 0xd0, 0xc9, 0xbc, 0xb3, 0xa1, 0xa3, + 0x76, 0x78, 0xa6, 0xf1, 0xff, 0xf1, 0xc4, 0xb1, 0xd9, 0x97, 0x98, 0x99, + 0x9c, 0x7e, 0x29, 0x1c, 0x76, 0x82, 0x56, 0x33, 0x4a, 0x4d, 0x36, 0x39, + 0x43, 0x3b, 0x33, 0x32, 0x35, 0x34, 0x2c, 0x24, 0x49, 0x3b, 0x18, 0x02, + 0x23, 0x55, 0x52, 0x2b, 0x0a, 0x2d, 0x3a, 0x2d, 0x38, 0x59, 0x5b, 0x40, + 0x2d, 0x1c, 0x4c, 0x4b, 0x34, 0x4c, 0x53, 0x56, 0x62, 0x45, 0x56, 0x56, + 0x2d, 0x37, 0x56, 0x43, 0x25, 0x1d, 0x1b, 0x28, 0x3d, 0x49, 0x45, 0x3c, + 0x36, 0x0c, 0x32, 0x50, 0x27, 0x2d, 0x44, 0x20, 0x22, 0x1c, 0x21, 0x36, + 0x48, 0x45, 0x32, 0x21, 0x32, 0x16, 0x19, 0xad, 0xfc, 0xa8, 0x64, 0x38, + 0x78, 0x6d, 0x61, 0x5c, 0x5b, 0x54, 0x44, 0x37, 0x26, 0x17, 0x28, 0x35, + 0x26, 0x2a, 0x30, 0x1a, 0x30, 0x42, 0x38, 0x2a, 0x2d, 0x25, 0x25, 0x3d, + 0x58, 0x5e, 0x50, 0x27, 0x0c, 0x20, 0x40, 0x48, 0x12, 0x1b, 0x29, 0x33, + 0x33, 0x27, 0x15, 0x07, 0x85, 0xa0, 0xd3, 0xbe, 0x53, 0x1c, 0x48, 0x7c, + 0x89, 0x37, 0x06, 0x30, 0x71, 0x79, 0x51, 0x2d, 0x1b, 0x0e, 0x16, 0x46, + 0x7b, 0x82, 0x50, 0x19, 0x31, 0x5c, 0xe1, 0xda, 0xa9, 0xa4, 0x9b, 0xf2, + 0xea, 0x9c, 0x43, 0x13, 0x0f, 0x24, 0x38, 0x3f, 0x3b, 0x35, 0x2d, 0x25, + 0x20, 0x21, 0x24, 0x26, 0x58, 0x73, 0x56, 0x36, 0x45, 0x3d, 0x26, 0x32, + 0x2e, 0x2f, 0x34, 0x3c, 0x45, 0x4b, 0x4c, 0x4b, 0x75, 0x4b, 0x2b, 0x29, + 0x29, 0x23, 0x2d, 0x42, 0x16, 0x1c, 0x40, 0x59, 0x4a, 0x3e, 0x3b, 0x2e, + 0x3d, 0x35, 0x2b, 0x1b, 0x41, 0x79, 0x75, 0x6a, 0x65, 0x68, 0x6d, 0x71, + 0x70, 0x6b, 0x63, 0x5d, 0x6a, 0x71, 0x71, 0x68, 0x6a, 0x76, 0x7b, 0x77, + 0x92, 0x8b, 0x80, 0x77, 0x72, 0x74, 0x78, 0x7c, 0x73, 0x76, 0x77, 0x74, + 0x6e, 0x6b, 0x6c, 0x70, 0x65, 0x64, 0x63, 0x62, 0x65, 0x69, 0x6d, 0x70, + 0x71, 0x57, 0x4e, 0x3e, 0x19, 0x21, 0x67, 0xa3, 0x51, 0x40, 0x31, 0x38, + 0x53, 0x6d, 0x76, 0x73, 0x24, 0x67, 0x87, 0x56, 0x17, 0x16, 0x45, 0x6d, + 0x2a, 0x56, 0x5a, 0x5b, 0x5f, 0x2b, 0x20, 0x6b, 0x53, 0x4f, 0x2e, 0x35, + 0x76, 0x99, 0x97, 0xa3, 0x7a, 0x7f, 0x8b, 0x97, 0x94, 0x75, 0x43, 0x1d, + 0x4b, 0x5c, 0x4f, 0x27, 0x18, 0x2a, 0x2f, 0x1e, 0x50, 0x5c, 0x59, 0x49, + 0x48, 0x55, 0x52, 0x41, 0x57, 0x4d, 0x41, 0x82, 0xf7, 0xff, 0xc7, 0x94, + 0x8e, 0x9f, 0xd4, 0xe0, 0xc3, 0xde, 0xfb, 0xda, 0xd6, 0xaa, 0xbd, 0xac, + 0xc5, 0xef, 0xcd, 0xdd, 0xa4, 0x9a, 0xa7, 0xc9, 0xce, 0xa6, 0x74, 0x59, + 0x6f, 0x40, 0x5e, 0x80, 0x9f, 0x83, 0x0c, 0x00, 0x12, 0x46, 0x3a, 0x1c, + 0x39, 0x4b, 0x33, 0x25, 0x48, 0x32, 0x23, 0x31, 0x4f, 0x5d, 0x4e, 0x38, + 0x1c, 0x0d, 0x19, 0x3b, 0x44, 0x38, 0x46, 0x67, 0x43, 0x73, 0x7a, 0x5d, + 0x73, 0xa7, 0x94, 0x4d, 0x3e, 0x27, 0x5a, 0x2c, 0x2b, 0x7a, 0x5c, 0x49, + 0xb4, 0xa8, 0x75, 0x7b, 0xb7, 0x94, 0x29, 0x00, 0x2a, 0x41, 0x45, 0x21, + 0x03, 0x2a, 0x97, 0xf9, 0x8c, 0x39, 0x3b, 0x53, 0x08, 0x00, 0x62, 0xfa, + 0x52, 0x28, 0x10, 0x27, 0x49, 0x4d, 0x3e, 0x33, 0x3b, 0xaf, 0x73, 0x75, + 0xbc, 0x5e, 0x07, 0x1f, 0x38, 0x32, 0x30, 0x39, 0x4c, 0x5d, 0x65, 0x66, + 0x4a, 0x21, 0x1c, 0x3c, 0x58, 0x64, 0x44, 0x07, 0x41, 0x4c, 0x3d, 0x33, + 0x3f, 0x3a, 0x32, 0x42, 0x11, 0x71, 0x82, 0x3b, 0x2a, 0x60, 0x88, 0x89, + 0x77, 0x66, 0x45, 0x1f, 0x07, 0x0f, 0x2f, 0x4d, 0xce, 0xb1, 0x6d, 0x1d, + 0x0b, 0x3e, 0x5d, 0x48, 0x28, 0x6b, 0x9d, 0x88, 0x53, 0x39, 0x40, 0x4d, + 0x50, 0x38, 0x22, 0x25, 0x3c, 0x4c, 0x4a, 0x40, 0xe0, 0xff, 0xd8, 0x5c, + 0x56, 0x89, 0x77, 0x90, 0xa0, 0xa5, 0x95, 0x63, 0x4c, 0x70, 0x70, 0x34, + 0x00, 0x07, 0x20, 0x36, 0x40, 0x3c, 0x31, 0x28, 0x0d, 0x41, 0x7c, 0x58, + 0x05, 0x0d, 0x43, 0x46, 0x28, 0x45, 0x66, 0x71, 0x64, 0x50, 0x46, 0x44, + 0x40, 0x28, 0x24, 0x3a, 0x4b, 0x4d, 0x5b, 0x71, 0x90, 0x94, 0x71, 0x53, + 0x68, 0x80, 0x7e, 0x7a, 0x5d, 0x6a, 0x5a, 0x49, 0x65, 0x78, 0x71, 0x7d, + 0x6c, 0x6d, 0x71, 0x77, 0x7a, 0x77, 0x6e, 0x66, 0x79, 0x83, 0x84, 0x7b, + 0x7a, 0x85, 0x8c, 0x8b, 0x83, 0x7d, 0x75, 0x6f, 0x6f, 0x74, 0x7c, 0x82, + 0x6c, 0x6f, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x88, 0x76, 0x72, 0x6c, 0x64, + 0x5d, 0x56, 0x52, 0x50, 0x58, 0x4c, 0x41, 0x2c, 0x32, 0x75, 0x9f, 0x86, + 0x33, 0x0f, 0x0c, 0x43, 0x7f, 0x91, 0x84, 0x77, 0xa2, 0x7e, 0x70, 0x82, + 0x83, 0x5a, 0x2c, 0x18, 0xb3, 0xd7, 0x96, 0x79, 0xcb, 0xc5, 0x69, 0x52, + 0xe2, 0xcc, 0x87, 0x67, 0x90, 0x9b, 0x70, 0x54, 0x4b, 0x50, 0x5f, 0x78, + 0x8c, 0x8b, 0x76, 0x62, 0x39, 0x2a, 0x19, 0x19, 0x2d, 0x3c, 0x2f, 0x16, + 0x31, 0x3f, 0x45, 0x39, 0x2b, 0x29, 0x2e, 0x32, 0x2e, 0x53, 0x5e, 0x6d, + 0x8d, 0x81, 0x64, 0x6e, 0x4f, 0x51, 0x9b, 0xba, 0x91, 0xa7, 0xbc, 0x7c, + 0x23, 0x2e, 0x94, 0x75, 0x5d, 0x79, 0x5e, 0xa5, 0x7a, 0x8d, 0x95, 0x77, + 0x3b, 0x11, 0x16, 0x31, 0x2d, 0x43, 0xa1, 0xc8, 0xc9, 0x9c, 0x2b, 0x02, + 0x63, 0x8b, 0x67, 0x2c, 0x37, 0x4a, 0x45, 0x49, 0x49, 0x48, 0x46, 0x43, + 0x3f, 0x3c, 0x3a, 0x39, 0x85, 0x74, 0x7a, 0x8d, 0x7d, 0x51, 0x41, 0x50, + 0x48, 0x44, 0x49, 0x51, 0x49, 0x3e, 0x4a, 0x61, 0x68, 0x5d, 0x4c, 0x00, + 0x48, 0xb9, 0x58, 0x0c, 0x16, 0x3e, 0x32, 0x24, 0x3a, 0x31, 0x2d, 0x5c, + 0x35, 0x28, 0x16, 0x12, 0x30, 0x76, 0xce, 0xff, 0xff, 0x90, 0x1f, 0x5f, + 0xb7, 0x80, 0x3a, 0x53, 0x52, 0x31, 0x22, 0x2c, 0x25, 0x0e, 0x12, 0x2b, + 0x45, 0xe5, 0xb7, 0x81, 0x85, 0x1e, 0x00, 0x43, 0x37, 0x39, 0x38, 0x2f, + 0x26, 0x25, 0x2d, 0x36, 0x2e, 0x38, 0x29, 0x21, 0x31, 0x35, 0x38, 0x4e, + 0x42, 0x48, 0x3a, 0x38, 0x4e, 0x48, 0x32, 0x34, 0x46, 0x39, 0x44, 0x74, + 0x84, 0x4f, 0x26, 0x33, 0x39, 0x42, 0x4c, 0x4e, 0x47, 0x3f, 0x3a, 0x38, + 0x45, 0x22, 0x11, 0x3a, 0x6d, 0x66, 0x3c, 0x25, 0x24, 0x69, 0xb6, 0xc2, + 0x89, 0x5f, 0x81, 0xc1, 0x89, 0x5d, 0x2a, 0x14, 0x21, 0x39, 0x47, 0x49, + 0xf0, 0xe4, 0x56, 0x53, 0xe4, 0xff, 0x8b, 0x00, 0x00, 0x0d, 0x2f, 0x23, + 0x12, 0x42, 0x4f, 0x0c, 0x35, 0x35, 0x34, 0x34, 0x35, 0x36, 0x37, 0x37, + 0x0f, 0x14, 0x34, 0x38, 0x28, 0x40, 0x3a, 0x00, 0x42, 0x5a, 0x6f, 0x6a, + 0x53, 0x44, 0x4b, 0x58, 0x86, 0x64, 0x4d, 0x50, 0x4f, 0x45, 0x4c, 0x5f, + 0x2b, 0x23, 0x28, 0x4e, 0x66, 0x49, 0x3f, 0x66, 0x37, 0x2f, 0x2d, 0x29, + 0x2e, 0x5c, 0x79, 0x57, 0x69, 0x68, 0x6b, 0x75, 0x7f, 0x7f, 0x76, 0x6c, + 0x72, 0x7e, 0x80, 0x73, 0x6b, 0x72, 0x7a, 0x7b, 0x72, 0x72, 0x71, 0x71, + 0x73, 0x76, 0x79, 0x7b, 0x75, 0x71, 0x6b, 0x64, 0x5f, 0x58, 0x52, 0x4e, + 0x5a, 0x5b, 0x5c, 0x5c, 0x5c, 0x5b, 0x5a, 0x59, 0x57, 0x3e, 0x4c, 0x4b, + 0x1f, 0x1b, 0x3e, 0x48, 0x21, 0x00, 0x00, 0x23, 0x50, 0x56, 0x45, 0x3a, + 0x69, 0x5b, 0x62, 0x76, 0x6b, 0x43, 0x2b, 0x2c, 0x00, 0x3d, 0x29, 0x3e, + 0xbb, 0xd3, 0x88, 0x77, 0xd8, 0xc2, 0x6f, 0x39, 0x61, 0x8a, 0x81, 0x76, + 0xa0, 0x7d, 0x51, 0x36, 0x33, 0x3e, 0x46, 0x49, 0xa6, 0xb6, 0x91, 0x45, + 0x27, 0x3d, 0x3b, 0x18, 0x2c, 0x45, 0x61, 0x69, 0x5c, 0x59, 0x76, 0x98, + 0x7c, 0x87, 0x6c, 0x59, 0x66, 0x53, 0x37, 0x42, 0x75, 0x1f, 0x1b, 0x22, + 0x00, 0x22, 0x97, 0xc4, 0x75, 0x38, 0x61, 0x50, 0x73, 0xa3, 0x52, 0x56, + 0x5c, 0x9a, 0xc3, 0x9f, 0x4f, 0x1c, 0x22, 0x3d, 0x00, 0x27, 0x87, 0x93, + 0x7f, 0x60, 0x0f, 0x00, 0x46, 0x6f, 0x61, 0x40, 0x42, 0x37, 0x25, 0x34, + 0x40, 0x36, 0x37, 0x50, 0x76, 0x90, 0x90, 0x86, 0x58, 0x53, 0x3c, 0x2e, + 0x4c, 0x6f, 0x5b, 0x29, 0x18, 0x46, 0x5f, 0x4a, 0x37, 0x5a, 0xa2, 0xd9, + 0x85, 0xfa, 0xff, 0x7a, 0x31, 0x63, 0x9a, 0xe0, 0x93, 0x49, 0x2c, 0x24, + 0x13, 0x32, 0x4c, 0x29, 0x55, 0x4d, 0x55, 0x7f, 0xb9, 0xe1, 0xe8, 0xdf, + 0xd1, 0xba, 0x5a, 0x2e, 0x56, 0x42, 0x19, 0x3a, 0x2b, 0x1a, 0x18, 0x19, + 0x03, 0x0b, 0x6e, 0xe5, 0xf9, 0xbc, 0x50, 0x4d, 0x52, 0x30, 0x47, 0x50, + 0x20, 0x2a, 0x33, 0x32, 0x2a, 0x26, 0x2c, 0x34, 0x0d, 0x38, 0x43, 0x3c, + 0x3f, 0x37, 0x41, 0x6c, 0x34, 0x41, 0x37, 0x34, 0x44, 0x3b, 0x28, 0x2e, + 0x3d, 0x34, 0x37, 0x50, 0x73, 0x84, 0x64, 0x30, 0x6a, 0x54, 0x40, 0x44, + 0x56, 0x5c, 0x4c, 0x38, 0x3d, 0x60, 0x64, 0x5e, 0x62, 0x4a, 0x32, 0x3f, + 0x51, 0x49, 0x30, 0x21, 0x39, 0x58, 0x48, 0x1e, 0x55, 0x26, 0x00, 0x0d, + 0x44, 0x6f, 0x70, 0x5d, 0x60, 0x9a, 0x55, 0x5a, 0x60, 0x2e, 0x69, 0x97, + 0x97, 0x5a, 0x55, 0x51, 0x23, 0x2f, 0x4d, 0x30, 0x1b, 0x3a, 0x67, 0x85, + 0x83, 0x60, 0x30, 0x0e, 0x26, 0x4e, 0x40, 0x29, 0x39, 0x33, 0x23, 0x36, + 0x46, 0x47, 0x3f, 0x2c, 0x1f, 0x2e, 0x54, 0x77, 0x4b, 0x39, 0x3b, 0x52, + 0x56, 0x3c, 0x28, 0x28, 0x14, 0x05, 0x54, 0xc6, 0xc9, 0x74, 0x30, 0x18, + 0x19, 0x17, 0x38, 0x84, 0x8c, 0x5d, 0x59, 0x63, 0x62, 0x5f, 0x61, 0x6d, + 0x7b, 0x7e, 0x73, 0x67, 0x7a, 0x88, 0x8a, 0x79, 0x6d, 0x70, 0x78, 0x7a, + 0x69, 0x6a, 0x6c, 0x6d, 0x6b, 0x67, 0x62, 0x5f, 0x71, 0x6d, 0x69, 0x6a, + 0x6e, 0x6f, 0x6c, 0x68, 0x5a, 0x5c, 0x5e, 0x5e, 0x5d, 0x59, 0x55, 0x53, + 0x58, 0x5b, 0x67, 0x45, 0x1d, 0x46, 0x64, 0x36, 0x35, 0x32, 0x2e, 0x2c, + 0x34, 0x45, 0x58, 0x65, 0x5c, 0x7d, 0x7c, 0x49, 0x1b, 0x18, 0x27, 0x2c, + 0x42, 0x81, 0xa2, 0xb8, 0xc0, 0x7e, 0x5d, 0x98, 0xd1, 0xe6, 0xaf, 0x68, + 0x6b, 0x7e, 0x71, 0x67, 0x74, 0x62, 0x52, 0x55, 0x6a, 0x81, 0x8e, 0x90, + 0xb1, 0xff, 0xe0, 0x45, 0x00, 0x26, 0x4d, 0x32, 0x2d, 0x32, 0x43, 0x51, + 0x46, 0x37, 0x49, 0x6a, 0x6b, 0x7c, 0x67, 0x57, 0x69, 0x67, 0x65, 0x84, + 0x87, 0x60, 0x4e, 0x42, 0x54, 0xb0, 0xe2, 0xb1, 0xdb, 0x9d, 0x9b, 0x81, + 0x9d, 0xcd, 0xaa, 0xb6, 0x86, 0xa7, 0xae, 0x83, 0x4d, 0x2e, 0x1d, 0x10, + 0x93, 0x8e, 0xa6, 0x7f, 0x6b, 0x66, 0x1d, 0x00, 0x55, 0x61, 0x49, 0x3b, + 0x48, 0x41, 0x56, 0x99, 0x83, 0x66, 0x4b, 0x4b, 0x5b, 0x5b, 0x41, 0x24, + 0x39, 0x34, 0x1e, 0x14, 0x38, 0x64, 0x59, 0x2b, 0x25, 0x3d, 0x2d, 0x19, + 0x59, 0xb5, 0xa6, 0x4f, 0x96, 0x96, 0x83, 0x70, 0x44, 0x4b, 0x7e, 0x63, + 0x62, 0x6c, 0x9d, 0x8f, 0x36, 0x1d, 0x3e, 0x3c, 0x03, 0x39, 0x6c, 0x6b, + 0x47, 0x35, 0x4e, 0x72, 0x0d, 0x1b, 0x18, 0x23, 0x51, 0x6a, 0x4d, 0x28, + 0x37, 0x49, 0x83, 0xb1, 0x84, 0x28, 0x10, 0x35, 0x3e, 0x19, 0x07, 0x49, + 0x57, 0x4a, 0x61, 0x35, 0x39, 0x35, 0x33, 0x37, 0x38, 0x2d, 0x15, 0x00, + 0x3b, 0x24, 0x40, 0x76, 0x90, 0x8d, 0x56, 0x04, 0x2e, 0x4b, 0x49, 0x37, + 0x2e, 0x22, 0x2a, 0x4d, 0x37, 0x18, 0x30, 0x43, 0x1e, 0x24, 0x6a, 0x99, + 0x28, 0x24, 0x27, 0x3b, 0x58, 0x6e, 0x74, 0x71, 0x54, 0x68, 0x37, 0x12, + 0x3e, 0x50, 0x25, 0x09, 0x39, 0x4c, 0x3b, 0x15, 0x25, 0x5e, 0x69, 0x47, + 0x1f, 0x2e, 0x39, 0x33, 0x26, 0x2a, 0x42, 0x5a, 0x32, 0x33, 0x2e, 0x4d, + 0x4e, 0x21, 0x2d, 0x5e, 0x50, 0x14, 0x2c, 0x49, 0x29, 0x3b, 0x4e, 0x18, + 0x16, 0x1f, 0x30, 0x44, 0x56, 0x64, 0x6d, 0x72, 0x6b, 0x44, 0x0f, 0x33, + 0x94, 0x97, 0x4e, 0x2b, 0x54, 0x48, 0x32, 0x19, 0x0d, 0x15, 0x2e, 0x43, + 0x00, 0x23, 0x59, 0x6c, 0x42, 0x09, 0x02, 0x1e, 0x25, 0x3c, 0x79, 0x8d, + 0x4f, 0x20, 0x3e, 0x6f, 0x83, 0xe2, 0xd4, 0x9a, 0x7f, 0x77, 0x7f, 0x72, + 0x6a, 0x64, 0x63, 0x6e, 0x7c, 0x7e, 0x70, 0x61, 0x70, 0x80, 0x83, 0x72, + 0x63, 0x66, 0x70, 0x74, 0x81, 0x81, 0x82, 0x80, 0x7c, 0x76, 0x70, 0x6c, + 0x7c, 0x77, 0x73, 0x76, 0x7d, 0x81, 0x7d, 0x77, 0x60, 0x62, 0x65, 0x66, + 0x64, 0x5f, 0x59, 0x55, 0x43, 0x40, 0x65, 0x5c, 0x1f, 0x24, 0x4a, 0x3c, + 0x1d, 0x06, 0x1a, 0x4b, 0x4a, 0x1d, 0x19, 0x3f, 0x41, 0x86, 0xad, 0x87, + 0x4f, 0x44, 0x5c, 0x71, 0x76, 0x71, 0x78, 0x8c, 0x83, 0x4e, 0x28, 0x2c, + 0x34, 0x86, 0x8b, 0x4d, 0x39, 0x3e, 0x37, 0x38, 0x65, 0x5f, 0x5e, 0x6d, + 0x83, 0x90, 0x8f, 0x88, 0x96, 0xa1, 0x8e, 0x75, 0x96, 0xd6, 0xdf, 0xba, + 0x8c, 0x61, 0x4b, 0x5d, 0x64, 0x4c, 0x36, 0x36, 0x1a, 0x2f, 0x2f, 0x46, + 0x76, 0x69, 0x36, 0x26, 0x25, 0x43, 0x7d, 0xa6, 0x9f, 0x81, 0x69, 0x5a, + 0x92, 0x58, 0x36, 0x3f, 0x71, 0x8d, 0x67, 0x41, 0x3d, 0x48, 0x43, 0x3e, + 0x66, 0xab, 0xd3, 0xd3, 0xc4, 0xae, 0xad, 0x78, 0x6f, 0x78, 0x2b, 0x00, + 0x7b, 0x75, 0x5b, 0x5a, 0x67, 0x55, 0x75, 0xd0, 0xb7, 0xcf, 0xd4, 0xa5, + 0x5b, 0x2d, 0x31, 0x49, 0x49, 0x3a, 0x43, 0x5c, 0x55, 0x34, 0x2d, 0x42, + 0x0f, 0x0e, 0x29, 0x69, 0xa3, 0xa2, 0x64, 0x26, 0x28, 0x42, 0xaf, 0xff, + 0x9e, 0x2a, 0x5f, 0x1e, 0x3a, 0x58, 0x34, 0x06, 0x12, 0x2a, 0x68, 0xcc, + 0xa7, 0x64, 0x1e, 0x11, 0x31, 0x46, 0x31, 0x10, 0x69, 0x19, 0x15, 0x36, + 0x2f, 0x48, 0x66, 0x4d, 0x87, 0x4d, 0x3e, 0x65, 0x65, 0x2e, 0x13, 0x26, + 0x2c, 0x57, 0x25, 0x19, 0x36, 0x45, 0x4e, 0x1f, 0x52, 0x43, 0x43, 0x61, + 0x86, 0x8b, 0x67, 0x40, 0x21, 0x02, 0x41, 0x59, 0x1d, 0x4b, 0xa8, 0x9f, + 0x35, 0x5f, 0x64, 0x41, 0x21, 0x13, 0x36, 0x76, 0x7f, 0x4b, 0x3d, 0x28, + 0x0d, 0x4c, 0x88, 0x67, 0x4c, 0x68, 0x7d, 0x70, 0x4d, 0x37, 0x3f, 0x52, + 0x2e, 0x1f, 0x05, 0x2e, 0x71, 0x6b, 0x77, 0xcd, 0x5f, 0x28, 0x1b, 0x45, + 0x51, 0x2f, 0x27, 0x44, 0x46, 0x3b, 0x2b, 0x20, 0x1c, 0x1d, 0x1e, 0x1f, + 0x21, 0x24, 0x73, 0x67, 0x51, 0x55, 0x31, 0x54, 0x32, 0x10, 0x23, 0x1e, + 0x0e, 0x61, 0x87, 0x28, 0x4c, 0x3d, 0x28, 0x19, 0x19, 0x29, 0x3e, 0x4d, + 0x69, 0x31, 0x63, 0xe2, 0xff, 0xff, 0xb1, 0x41, 0x19, 0x1c, 0x22, 0x2a, + 0x32, 0x38, 0x3b, 0x3c, 0x72, 0x4a, 0x37, 0x4b, 0x5a, 0x48, 0x2c, 0x20, + 0x37, 0x47, 0x5b, 0x7d, 0x91, 0x74, 0x5e, 0x70, 0x9b, 0x78, 0x65, 0x9a, + 0xa6, 0x8b, 0x8f, 0x74, 0x79, 0x71, 0x6d, 0x76, 0x83, 0x82, 0x72, 0x61, + 0x77, 0x89, 0x8e, 0x7d, 0x6f, 0x72, 0x7d, 0x83, 0x80, 0x7f, 0x7e, 0x7c, + 0x79, 0x76, 0x74, 0x73, 0x71, 0x6b, 0x67, 0x6b, 0x74, 0x78, 0x73, 0x6d, + 0x61, 0x65, 0x69, 0x6d, 0x6c, 0x69, 0x63, 0x60, 0x5d, 0x49, 0x51, 0x3a, + 0x18, 0x4a, 0x76, 0x4e, 0x21, 0x49, 0x46, 0x28, 0x4e, 0xa0, 0xa7, 0x6d, + 0x56, 0x42, 0x3e, 0x50, 0x58, 0x5b, 0x77, 0x9d, 0x61, 0x76, 0x8a, 0x72, + 0x4c, 0x50, 0x51, 0x30, 0x00, 0x53, 0x74, 0x41, 0x3a, 0x66, 0x99, 0xc6, + 0xa6, 0x84, 0x5b, 0x4c, 0x5e, 0x84, 0xa6, 0xb9, 0x67, 0x4b, 0x77, 0xdf, + 0xff, 0xdd, 0xd4, 0xfb, 0xbc, 0x6e, 0x41, 0x65, 0x90, 0x82, 0x55, 0x39, + 0x70, 0x8f, 0x7e, 0x55, 0x3c, 0x16, 0x08, 0x29, 0x3a, 0x56, 0x69, 0x65, + 0x41, 0x0d, 0x10, 0x45, 0x95, 0x88, 0x5a, 0x3c, 0x25, 0x21, 0x44, 0x52, + 0x81, 0x7d, 0x58, 0x2c, 0x33, 0x64, 0x7b, 0x6e, 0x2d, 0x3d, 0x69, 0x54, + 0x5c, 0x71, 0x2c, 0x00, 0x47, 0x36, 0x3e, 0x5b, 0x58, 0x36, 0x29, 0x37, + 0x88, 0xfb, 0x9b, 0x00, 0x00, 0x37, 0x39, 0x51, 0x00, 0x47, 0xb1, 0xf4, + 0xf1, 0xd0, 0xc6, 0xd2, 0xdd, 0x5b, 0x00, 0x12, 0x2f, 0x1d, 0x16, 0x2e, + 0x22, 0x1f, 0x46, 0x6d, 0x46, 0x04, 0x1c, 0x6f, 0x60, 0x5b, 0x31, 0x05, + 0x25, 0x8c, 0xe2, 0xff, 0x87, 0x5f, 0x82, 0xdf, 0xe3, 0x79, 0x26, 0x1f, + 0x5b, 0x30, 0x18, 0x24, 0x2b, 0x23, 0x2e, 0x4a, 0x71, 0x51, 0x27, 0x0e, + 0x0f, 0x20, 0x31, 0x3b, 0x2e, 0x43, 0x48, 0x2e, 0x24, 0x49, 0x5f, 0x4d, + 0x2d, 0x24, 0x49, 0x4e, 0x60, 0x73, 0x5c, 0x74, 0x37, 0x39, 0x8b, 0xd3, + 0xbe, 0x99, 0x74, 0x3c, 0x62, 0x86, 0xac, 0x66, 0x43, 0x67, 0x5c, 0x66, + 0x23, 0x2a, 0x2e, 0x2b, 0x28, 0x34, 0x4f, 0x65, 0x7e, 0x62, 0x57, 0x5b, + 0x48, 0x2d, 0x3f, 0x6a, 0x0d, 0x03, 0x12, 0x37, 0x4b, 0x40, 0x34, 0x36, + 0x00, 0x86, 0x9e, 0x5d, 0x53, 0x29, 0x23, 0x85, 0x46, 0x48, 0x69, 0x95, + 0x92, 0x5e, 0x37, 0x32, 0x36, 0x1d, 0x14, 0x22, 0x29, 0x32, 0x61, 0x9b, + 0xd1, 0xac, 0x59, 0x7d, 0xe0, 0xff, 0xc0, 0x23, 0x13, 0x4a, 0x13, 0x8d, + 0xfb, 0xf2, 0xed, 0x4e, 0x00, 0x20, 0x9d, 0xff, 0xee, 0xa3, 0x5d, 0x1e, + 0x15, 0x43, 0x76, 0x89, 0x7b, 0x6a, 0x67, 0x6e, 0x8c, 0x85, 0x40, 0x29, + 0x68, 0x75, 0x4d, 0x4c, 0xaf, 0x44, 0x33, 0x72, 0x70, 0x4d, 0x4b, 0x4f, + 0x5e, 0x30, 0x6c, 0x96, 0x70, 0x6f, 0x83, 0x82, 0x62, 0x64, 0x6b, 0x75, + 0x7e, 0x7d, 0x74, 0x6a, 0x7c, 0x82, 0x87, 0x82, 0x78, 0x74, 0x78, 0x7e, + 0x6d, 0x6d, 0x6d, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x77, 0x7b, 0x7c, 0x76, + 0x6d, 0x6b, 0x72, 0x7a, 0x76, 0x72, 0x6f, 0x70, 0x72, 0x6e, 0x65, 0x5c, + 0x4e, 0x54, 0x3f, 0x25, 0x45, 0x83, 0x7b, 0x3c, 0x38, 0x4b, 0x9a, 0xab, + 0x91, 0x75, 0x63, 0x96, 0x84, 0x6c, 0x69, 0x8e, 0x7a, 0x83, 0xcb, 0xbd, + 0x7a, 0x5b, 0xd9, 0xfc, 0x43, 0x00, 0x4e, 0x52, 0x26, 0x30, 0x3f, 0x4d, + 0x56, 0x57, 0x54, 0x50, 0x28, 0x19, 0x3a, 0x6d, 0x5a, 0x22, 0x36, 0x80, + 0x97, 0x61, 0x90, 0xd6, 0x9b, 0x45, 0x5d, 0xa5, 0xb2, 0x91, 0x6c, 0x5e, + 0x66, 0x6e, 0x68, 0x5e, 0x4e, 0x5b, 0x52, 0x37, 0x30, 0x3e, 0x3d, 0x2b, + 0x53, 0x59, 0x2d, 0x04, 0x19, 0x40, 0x67, 0x92, 0xb0, 0x86, 0x6b, 0x4a, + 0x33, 0x5e, 0x6a, 0x28, 0x2e, 0x42, 0x5a, 0x66, 0x66, 0x65, 0x6b, 0x72, + 0x6d, 0x5b, 0x50, 0x5d, 0x6b, 0x5a, 0x25, 0x00, 0x49, 0x46, 0x2e, 0x1a, + 0x34, 0x62, 0x64, 0x44, 0x15, 0x5c, 0x48, 0x14, 0x21, 0x32, 0x5e, 0xba, + 0xf1, 0xf3, 0xe2, 0xac, 0x63, 0x38, 0x44, 0x63, 0x45, 0x10, 0x08, 0x35, + 0x3b, 0x0a, 0x00, 0x10, 0x5d, 0x23, 0x25, 0x81, 0xca, 0xb1, 0x63, 0x2f, + 0x21, 0x34, 0x31, 0x1e, 0x32, 0x68, 0x87, 0x83, 0x4c, 0x30, 0x37, 0x59, + 0x4b, 0x15, 0x08, 0x26, 0x76, 0x3a, 0x2a, 0x4f, 0x4d, 0x28, 0x40, 0x85, + 0x34, 0x53, 0x68, 0x57, 0x30, 0x21, 0x39, 0x5a, 0x6c, 0x57, 0x72, 0x6d, + 0x41, 0x62, 0x77, 0x32, 0x62, 0x55, 0xae, 0x8f, 0x3b, 0x78, 0x9f, 0x72, + 0x42, 0x75, 0xab, 0x8a, 0x43, 0x4b, 0x64, 0x46, 0x39, 0x7c, 0xaa, 0xa1, + 0x67, 0x3d, 0x4b, 0x5f, 0x62, 0x5b, 0x49, 0x31, 0x22, 0x29, 0x43, 0x5b, + 0x9e, 0x89, 0x74, 0x64, 0x53, 0x53, 0x72, 0x99, 0x7c, 0x94, 0x5d, 0x09, + 0x2f, 0xa7, 0xba, 0x6c, 0xb2, 0xed, 0xbe, 0x3b, 0x18, 0x56, 0x69, 0x40, + 0x6a, 0x86, 0xa6, 0xb7, 0xb3, 0x9d, 0x78, 0x59, 0x83, 0x4f, 0x22, 0x37, + 0x89, 0xd3, 0xe2, 0xcd, 0xd1, 0xe0, 0xd6, 0xf9, 0xed, 0xb9, 0xc2, 0xb8, + 0xfd, 0xf9, 0x7b, 0x6c, 0xb5, 0x9b, 0x7b, 0x7f, 0x92, 0x93, 0x68, 0x5b, + 0x8b, 0x99, 0x85, 0x8d, 0x78, 0x76, 0x79, 0x7c, 0x70, 0x66, 0x74, 0x8d, + 0x2e, 0x37, 0x3c, 0x5e, 0x8c, 0x84, 0x62, 0x5c, 0x80, 0x61, 0x54, 0x73, + 0x5f, 0x29, 0x28, 0x2b, 0x27, 0x30, 0x39, 0x34, 0x44, 0x68, 0x6f, 0x5d, + 0x6d, 0x6b, 0x6b, 0x71, 0x79, 0x7d, 0x79, 0x74, 0x75, 0x7a, 0x7e, 0x7a, + 0x72, 0x6e, 0x71, 0x77, 0x6b, 0x71, 0x7a, 0x80, 0x7f, 0x77, 0x6d, 0x65, + 0x69, 0x6b, 0x6c, 0x6c, 0x6c, 0x6f, 0x76, 0x7c, 0x6f, 0x6b, 0x68, 0x68, + 0x6a, 0x66, 0x5c, 0x54, 0x64, 0x5f, 0x82, 0x90, 0x64, 0x48, 0x4d, 0x49, + 0x2d, 0x3b, 0x62, 0x4b, 0x46, 0x50, 0x18, 0x00, 0x00, 0x29, 0x2f, 0x3e, + 0x4a, 0x6a, 0x85, 0x43, 0x3c, 0x90, 0xfb, 0xeb, 0x70, 0x31, 0x2f, 0x19, + 0x43, 0x42, 0x41, 0x44, 0x4b, 0x56, 0x61, 0x68, 0xa0, 0x93, 0x81, 0x6b, + 0x53, 0x44, 0x49, 0x57, 0x74, 0x2e, 0x52, 0xa9, 0x91, 0x4a, 0x49, 0x6d, + 0x75, 0x5a, 0x37, 0x22, 0x23, 0x31, 0x3f, 0x47, 0x35, 0x3f, 0x45, 0x48, + 0x54, 0x69, 0x76, 0x76, 0x84, 0x68, 0x3f, 0x40, 0x5f, 0x66, 0x80, 0xbd, + 0x5d, 0x3f, 0x43, 0x4b, 0x28, 0x0c, 0x1e, 0x39, 0x6c, 0x83, 0x6f, 0x7e, + 0xba, 0x9e, 0x4c, 0x38, 0x84, 0x6b, 0x54, 0x53, 0x5b, 0x4c, 0x23, 0x00, + 0x45, 0x48, 0x3e, 0x3b, 0x5a, 0x72, 0x4b, 0x09, 0x44, 0x3b, 0x33, 0x38, + 0x3e, 0x45, 0x78, 0xc0, 0xd8, 0xbf, 0x92, 0x61, 0x40, 0x34, 0x30, 0x2e, + 0x58, 0x24, 0x13, 0x33, 0x41, 0x35, 0x48, 0x75, 0xa4, 0x86, 0x75, 0x84, + 0x95, 0x89, 0x66, 0x4b, 0x64, 0x76, 0x77, 0x63, 0x58, 0x57, 0x47, 0x2c, + 0x7f, 0x7e, 0x72, 0x54, 0x2f, 0x21, 0x38, 0x58, 0xb3, 0x8f, 0xab, 0xe8, + 0xc2, 0x55, 0x41, 0x81, 0x3b, 0x38, 0x48, 0x77, 0xaa, 0xbc, 0xa5, 0x86, + 0x3e, 0x76, 0xb6, 0xb4, 0x81, 0x6b, 0x66, 0x4f, 0x52, 0x94, 0xc6, 0x65, + 0x36, 0x88, 0xa6, 0x9d, 0x61, 0x41, 0x50, 0x61, 0x31, 0x0c, 0x28, 0x4e, + 0x4a, 0x5b, 0x4f, 0x80, 0x6f, 0x2c, 0x42, 0x45, 0x5b, 0x51, 0x3d, 0x29, + 0x21, 0x2d, 0x49, 0x5f, 0x64, 0x75, 0x73, 0x56, 0x3a, 0x30, 0x2b, 0x23, + 0x51, 0x92, 0xb1, 0x8d, 0x6d, 0x78, 0x85, 0x7e, 0x5a, 0x60, 0x7e, 0x62, + 0x51, 0xbe, 0xdf, 0x62, 0x58, 0x6b, 0x62, 0x40, 0x3e, 0x5b, 0x62, 0x4d, + 0x65, 0x78, 0x7e, 0x81, 0xa7, 0xd4, 0xcb, 0xa1, 0xd0, 0xb3, 0x46, 0x38, + 0x91, 0xe9, 0xe3, 0x67, 0xac, 0xde, 0xf1, 0xc2, 0x9b, 0x5b, 0x4f, 0xd3, + 0xb1, 0x98, 0x3c, 0x12, 0x63, 0xb0, 0xb7, 0xb3, 0xea, 0xa3, 0x7b, 0xa3, + 0xdb, 0xe9, 0xe0, 0xdd, 0x65, 0x2c, 0x22, 0x39, 0x34, 0x36, 0x5b, 0x7a, + 0x25, 0x25, 0x43, 0x55, 0x54, 0x59, 0x61, 0x69, 0x4b, 0x53, 0x6c, 0xa3, + 0xa5, 0x69, 0x65, 0x94, 0x71, 0x6b, 0x66, 0x69, 0x70, 0x76, 0x77, 0x75, + 0x7f, 0x83, 0x85, 0x83, 0x7d, 0x7b, 0x7d, 0x81, 0x82, 0x86, 0x8b, 0x8b, + 0x83, 0x75, 0x66, 0x5c, 0x76, 0x71, 0x6c, 0x6a, 0x6d, 0x70, 0x70, 0x6f, + 0x69, 0x65, 0x61, 0x61, 0x62, 0x5e, 0x54, 0x4b, 0x44, 0x55, 0x5f, 0x48, + 0x26, 0x2a, 0x46, 0x55, 0x1b, 0x2e, 0x4d, 0x21, 0x12, 0x3d, 0x4c, 0x6b, + 0xa9, 0xd8, 0xbd, 0x98, 0x4d, 0x00, 0x0c, 0x2e, 0x64, 0x57, 0x2e, 0x30, + 0x54, 0x40, 0x37, 0x70, 0x75, 0x68, 0x54, 0x42, 0x39, 0x39, 0x40, 0x45, + 0x6a, 0x6a, 0x3a, 0x00, 0x07, 0x53, 0x7c, 0x6f, 0x69, 0x46, 0x46, 0x3c, + 0x0e, 0x16, 0x5c, 0x8a, 0x52, 0x4d, 0x43, 0x3c, 0x44, 0x61, 0x8b, 0xaa, + 0x26, 0x1c, 0x1a, 0x25, 0x32, 0x3e, 0x53, 0x67, 0x41, 0x5d, 0x98, 0xf1, + 0xff, 0xa7, 0x33, 0x16, 0x58, 0x78, 0xb2, 0xe5, 0xc7, 0x5d, 0x2c, 0x51, + 0xd5, 0xf3, 0xc2, 0xc3, 0xff, 0xcd, 0x41, 0x1d, 0x2d, 0x22, 0x20, 0x32, + 0x49, 0x48, 0x2d, 0x10, 0x2c, 0x03, 0x00, 0x1c, 0x3d, 0x43, 0x4e, 0x66, + 0x68, 0x44, 0x45, 0x68, 0x8c, 0xac, 0xa7, 0x7c, 0x9b, 0x88, 0x6f, 0x6e, + 0x8f, 0xa2, 0x7e, 0x48, 0x67, 0x2d, 0x14, 0x3e, 0x6c, 0x72, 0x6c, 0x71, + 0x39, 0x70, 0x8a, 0x59, 0x16, 0x10, 0x4d, 0x8c, 0x56, 0x57, 0x51, 0x48, + 0x49, 0x55, 0x5d, 0x5c, 0x37, 0x58, 0x5d, 0x3d, 0x2c, 0x3c, 0x44, 0x38, + 0x6d, 0x74, 0xa3, 0xc8, 0x91, 0x2b, 0x0f, 0x39, 0x59, 0x4d, 0x45, 0x4b, + 0x56, 0x51, 0x38, 0x20, 0x5f, 0x8a, 0x57, 0x58, 0xc3, 0xbb, 0x6d, 0x7a, + 0xa3, 0x9b, 0x63, 0x00, 0x25, 0x82, 0x5c, 0x2d, 0x33, 0x3c, 0x3d, 0x2c, + 0x2c, 0x5a, 0x8e, 0xa1, 0xff, 0xcd, 0x70, 0x63, 0x4f, 0x27, 0x3a, 0x48, + 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x3a, 0x44, 0x4b, 0x60, 0x71, 0x5d, 0x2b, + 0x1e, 0x45, 0x67, 0x6b, 0x7d, 0x5e, 0x6b, 0x97, 0x87, 0x49, 0x3e, 0x68, + 0x85, 0x40, 0x5c, 0x76, 0x49, 0x6b, 0xad, 0x95, 0x69, 0x64, 0x49, 0x27, + 0x26, 0x47, 0x61, 0x65, 0x53, 0x87, 0xa7, 0x8f, 0x66, 0x54, 0x51, 0x4e, + 0x81, 0x4d, 0x00, 0x1b, 0x65, 0x7e, 0x75, 0x2a, 0x58, 0x52, 0x8d, 0x8c, + 0x5c, 0x67, 0x9b, 0xd7, 0xff, 0xc8, 0x87, 0x6c, 0x78, 0xc1, 0xe7, 0xbe, + 0x6d, 0xa1, 0xe2, 0xe6, 0x93, 0x50, 0x80, 0xe2, 0xdd, 0x59, 0x42, 0x8a, + 0xa1, 0x99, 0x85, 0x56, 0x3f, 0x20, 0x58, 0x57, 0x3c, 0x47, 0x4b, 0x73, + 0xd1, 0xfa, 0xf6, 0xc6, 0x8a, 0x79, 0x85, 0x6e, 0x80, 0x7c, 0x79, 0x7c, + 0x83, 0x87, 0x85, 0x81, 0x79, 0x7a, 0x7b, 0x7a, 0x78, 0x77, 0x78, 0x79, + 0x81, 0x7f, 0x7b, 0x79, 0x78, 0x7a, 0x7d, 0x7f, 0x84, 0x7a, 0x70, 0x6f, + 0x74, 0x77, 0x73, 0x6d, 0x69, 0x65, 0x60, 0x60, 0x60, 0x5b, 0x51, 0x48, + 0x41, 0x4c, 0x31, 0x31, 0x56, 0x42, 0x1d, 0x2d, 0x5f, 0x21, 0x1b, 0x1f, + 0x40, 0x68, 0x73, 0xa4, 0xf4, 0xf8, 0xbe, 0xce, 0xda, 0x9c, 0xb0, 0xf4, + 0xff, 0xa3, 0x22, 0x13, 0x4e, 0x44, 0x45, 0x93, 0x9b, 0x7d, 0x50, 0x2c, + 0x23, 0x36, 0x56, 0x6e, 0x1c, 0x54, 0x6a, 0x53, 0x58, 0x79, 0x6b, 0x38, + 0x31, 0x46, 0x4d, 0x1c, 0x00, 0x39, 0x6d, 0x52, 0x16, 0x29, 0x3b, 0x3f, + 0x3e, 0x4d, 0x6e, 0x8b, 0x93, 0x7d, 0x71, 0x72, 0x6b, 0x5d, 0x60, 0x70, + 0x42, 0x77, 0xa6, 0xda, 0xff, 0xd9, 0x6f, 0x2d, 0x48, 0x5c, 0x4e, 0x4c, + 0x61, 0x51, 0x60, 0xac, 0xeb, 0xdf, 0xa1, 0x86, 0xa6, 0x95, 0x65, 0x61, + 0x3e, 0x3f, 0x48, 0x5a, 0x64, 0x54, 0x2e, 0x0d, 0x5f, 0x4d, 0x4c, 0x57, + 0x4d, 0x3f, 0x5f, 0x94, 0x75, 0x54, 0x6a, 0xa3, 0xb6, 0x9a, 0x54, 0x07, + 0x09, 0x15, 0x0e, 0x03, 0x21, 0x57, 0x65, 0x4f, 0x51, 0x2d, 0x1f, 0x3b, + 0x5a, 0x5b, 0x4c, 0x43, 0x3f, 0x74, 0xa1, 0x9d, 0x7d, 0x66, 0x5e, 0x5c, + 0x7d, 0x68, 0x51, 0x43, 0x3d, 0x3e, 0x4c, 0x5c, 0x65, 0x80, 0x7b, 0x5c, + 0x5f, 0x76, 0x5b, 0x21, 0x31, 0x4e, 0x60, 0x4b, 0x2b, 0x28, 0x4a, 0x6e, + 0x90, 0x80, 0x64, 0x45, 0x31, 0x32, 0x42, 0x51, 0xaf, 0xcf, 0x94, 0x8f, + 0xe9, 0xcf, 0x83, 0xa1, 0xa4, 0x76, 0xb6, 0xaf, 0x81, 0xb7, 0xb7, 0x73, + 0x56, 0x88, 0x95, 0x6b, 0x41, 0x3f, 0x60, 0x85, 0x80, 0x41, 0x33, 0x43, + 0x78, 0x95, 0x65, 0x4e, 0x71, 0x62, 0x4d, 0x3c, 0x35, 0x37, 0x3c, 0x3f, + 0x53, 0x7f, 0x90, 0x75, 0x64, 0x6a, 0x61, 0x46, 0x71, 0x78, 0x79, 0x6c, + 0x5a, 0x4d, 0x4a, 0x4c, 0x55, 0x28, 0x3d, 0x6a, 0x46, 0x0b, 0x15, 0x40, + 0x6f, 0x63, 0x66, 0x78, 0x78, 0x68, 0x66, 0x73, 0x5c, 0x3f, 0x2b, 0x2e, + 0x31, 0x34, 0x49, 0x67, 0x99, 0xc0, 0xb1, 0xa5, 0x70, 0x30, 0x30, 0x16, + 0x13, 0x09, 0x09, 0x16, 0x14, 0x5e, 0xca, 0xc5, 0x40, 0x1d, 0x3e, 0x71, + 0x6e, 0x6a, 0x66, 0x45, 0x3f, 0x30, 0x3d, 0x61, 0x68, 0x44, 0x22, 0x1a, + 0x06, 0x00, 0x62, 0xb2, 0x78, 0x42, 0x5b, 0x74, 0x9f, 0x77, 0x4d, 0x32, + 0x2c, 0x2e, 0x35, 0x4b, 0x1d, 0x16, 0x2b, 0x59, 0x6f, 0x74, 0x78, 0x73, + 0x6b, 0x6a, 0x6e, 0x75, 0x7c, 0x7a, 0x70, 0x67, 0x79, 0x78, 0x77, 0x78, + 0x7a, 0x7b, 0x7a, 0x79, 0x84, 0x7d, 0x74, 0x6d, 0x6e, 0x74, 0x7e, 0x84, + 0x78, 0x70, 0x6a, 0x6d, 0x76, 0x7d, 0x7d, 0x79, 0x6f, 0x6a, 0x65, 0x64, + 0x64, 0x5e, 0x53, 0x4a, 0x34, 0x3e, 0x2c, 0x3d, 0x74, 0x70, 0x5c, 0x7a, + 0x73, 0x3f, 0x45, 0x47, 0x52, 0x53, 0x34, 0x4a, 0xb4, 0xd9, 0xa2, 0x9f, + 0xc3, 0xb1, 0xaf, 0xb2, 0xb3, 0xb7, 0xae, 0x84, 0x50, 0x38, 0x2c, 0x1a, + 0x1d, 0x26, 0x34, 0x44, 0x53, 0x5e, 0x64, 0x67, 0x34, 0x58, 0x72, 0x69, + 0x5d, 0x67, 0x7c, 0x8a, 0x78, 0x5a, 0x62, 0x89, 0xbc, 0xf2, 0xd8, 0x7b, + 0x54, 0x71, 0x8f, 0x90, 0x76, 0x59, 0x4c, 0x4c, 0x54, 0x61, 0x77, 0x87, + 0x80, 0x64, 0x44, 0x31, 0x3e, 0xa6, 0xca, 0xbc, 0xea, 0xff, 0xa9, 0x36, + 0x48, 0x63, 0x5a, 0x57, 0x62, 0x4a, 0x58, 0xa5, 0x76, 0x5e, 0x85, 0xb7, + 0xbc, 0xbd, 0x9f, 0x55, 0x4c, 0x4a, 0x4b, 0x4f, 0x4f, 0x41, 0x28, 0x14, + 0xdb, 0xff, 0xff, 0xd4, 0x9a, 0x8e, 0x93, 0x90, 0x21, 0x08, 0x21, 0x72, + 0x90, 0x5f, 0x53, 0x86, 0x67, 0xa3, 0xa8, 0x5b, 0x1d, 0x28, 0x46, 0x4c, + 0x70, 0x80, 0x91, 0x91, 0x7d, 0x69, 0x67, 0x70, 0x92, 0x98, 0xb2, 0xd5, + 0xdb, 0xb1, 0x74, 0x4a, 0x4a, 0x3b, 0x3e, 0x55, 0x61, 0x62, 0x71, 0x8a, + 0x56, 0x5b, 0x46, 0x2d, 0x3f, 0x60, 0x4e, 0x1c, 0x16, 0x3e, 0x45, 0x1d, + 0x0c, 0x2b, 0x4b, 0x4f, 0x49, 0x48, 0x45, 0x47, 0x5c, 0x8d, 0xce, 0xfc, + 0xcc, 0xcf, 0xdd, 0xb9, 0x5b, 0x2d, 0x55, 0x87, 0x84, 0x5b, 0x84, 0x6c, + 0x2a, 0x33, 0x52, 0x7b, 0x69, 0x4c, 0x27, 0x24, 0x2d, 0x21, 0x48, 0x9f, + 0x28, 0x3e, 0x91, 0x9c, 0xa8, 0xa9, 0x4f, 0x2d, 0x31, 0x45, 0x68, 0x8b, + 0x9c, 0x91, 0x73, 0x5a, 0x97, 0x99, 0x81, 0x52, 0x2f, 0x2b, 0x33, 0x35, + 0x21, 0x5e, 0x8b, 0x7c, 0x53, 0x37, 0x28, 0x1f, 0x41, 0x40, 0x24, 0x21, + 0x39, 0x2e, 0x29, 0x50, 0x50, 0x36, 0x35, 0x50, 0x52, 0x3c, 0x3f, 0x5b, + 0xa5, 0x6f, 0x4c, 0x53, 0x57, 0x4c, 0x59, 0x78, 0xaa, 0xa2, 0x30, 0x00, + 0x06, 0x5f, 0xa7, 0x7a, 0x44, 0x74, 0x5a, 0x4d, 0x63, 0x89, 0xc0, 0xc0, + 0x75, 0x70, 0x51, 0x4d, 0x58, 0x38, 0x38, 0x7a, 0x58, 0x5c, 0x61, 0x6a, + 0x73, 0x74, 0x66, 0x55, 0x88, 0x4d, 0x47, 0x67, 0x5f, 0x40, 0x2b, 0x1c, + 0x1d, 0x24, 0x34, 0xe0, 0xff, 0xa0, 0x8e, 0xc3, 0xff, 0xde, 0xae, 0x72, + 0x70, 0x7f, 0x66, 0x6b, 0x6c, 0x6e, 0x73, 0x7c, 0x81, 0x7d, 0x71, 0x66, + 0x81, 0x7d, 0x7b, 0x7d, 0x83, 0x85, 0x83, 0x7f, 0x85, 0x83, 0x7e, 0x78, + 0x72, 0x6e, 0x6a, 0x69, 0x73, 0x6f, 0x6a, 0x6a, 0x6e, 0x71, 0x72, 0x72, + 0x74, 0x6f, 0x69, 0x68, 0x66, 0x60, 0x55, 0x4b, 0x3e, 0x41, 0x4d, 0x47, + 0x2e, 0x32, 0x5a, 0x7e, 0x5f, 0x73, 0x92, 0x61, 0x49, 0x68, 0x6a, 0x82, + 0x5a, 0x6d, 0x5e, 0x87, 0x9a, 0x83, 0xb0, 0xdb, 0x6d, 0x61, 0xa5, 0xc2, + 0x75, 0x4f, 0x53, 0x2e, 0x08, 0x23, 0x4c, 0x6f, 0x7e, 0x77, 0x64, 0x54, + 0x2b, 0x47, 0x70, 0x80, 0x59, 0x24, 0x1c, 0x35, 0x47, 0x0d, 0x3f, 0xbc, + 0xee, 0xd8, 0xb2, 0x8d, 0x3b, 0x5a, 0x7f, 0x8e, 0x7c, 0x53, 0x29, 0x11, + 0x05, 0x47, 0x87, 0xa4, 0xb1, 0xab, 0x7d, 0x46, 0x54, 0xb5, 0xb2, 0x70, + 0x8d, 0xc6, 0x93, 0x32, 0x33, 0x3e, 0x55, 0x6f, 0x60, 0x3d, 0x72, 0xe3, + 0xd2, 0x68, 0x60, 0x80, 0x7c, 0xb5, 0xd1, 0x81, 0x4c, 0x46, 0x3e, 0x35, + 0x2e, 0x28, 0x21, 0x1d, 0x7c, 0x8b, 0x6f, 0x2c, 0x0b, 0x27, 0x4e, 0x5c, + 0x56, 0x60, 0x4b, 0x5d, 0x7f, 0x4d, 0x3b, 0x8e, 0x7a, 0xca, 0xe3, 0x9d, + 0x65, 0x70, 0x82, 0x76, 0x69, 0x9f, 0xd6, 0xe2, 0xc4, 0x97, 0x6f, 0x59, + 0x4d, 0x4f, 0x71, 0x9a, 0x8f, 0x68, 0x71, 0x9e, 0x6d, 0x50, 0x48, 0x56, + 0x4e, 0x30, 0x2d, 0x44, 0x3d, 0x46, 0x44, 0x3f, 0x4d, 0x67, 0x70, 0x66, + 0x62, 0x74, 0x7c, 0x73, 0x6b, 0x6b, 0x63, 0x56, 0x65, 0x7c, 0x80, 0x53, + 0x13, 0x00, 0x14, 0x3d, 0x39, 0x04, 0x21, 0x3a, 0x0e, 0x30, 0x98, 0xc2, + 0x45, 0x39, 0x62, 0x9c, 0xe7, 0xd1, 0x5d, 0x48, 0x56, 0x85, 0x7e, 0x7a, + 0xb6, 0xc7, 0x84, 0x4b, 0x73, 0xaf, 0xda, 0xa3, 0x4d, 0x28, 0x33, 0x55, + 0x8d, 0x7d, 0x6c, 0x68, 0x6e, 0x73, 0x6f, 0x68, 0x57, 0x60, 0x75, 0x84, + 0x79, 0x61, 0x5d, 0x6a, 0x71, 0x2f, 0x12, 0x36, 0x4e, 0x33, 0x19, 0x1b, + 0x7a, 0xa5, 0x99, 0x7c, 0x87, 0x7b, 0x47, 0x2a, 0x53, 0x3d, 0x26, 0x1d, + 0x20, 0x30, 0x4b, 0x63, 0x27, 0x34, 0x42, 0x40, 0x30, 0x2d, 0x48, 0x6a, + 0x20, 0x28, 0x30, 0x97, 0xe7, 0xf5, 0xff, 0xfb, 0xb6, 0x7e, 0x67, 0x42, + 0x50, 0x6b, 0x3f, 0x34, 0x20, 0x44, 0x41, 0x3d, 0x4c, 0x39, 0x2f, 0x57, + 0x3d, 0x6f, 0x79, 0x44, 0x1c, 0x25, 0x2f, 0x24, 0x4f, 0x52, 0x46, 0x4b, + 0x63, 0x5f, 0x5a, 0x6e, 0x8f, 0xab, 0x84, 0x5d, 0x4b, 0x6f, 0xd1, 0xf2, + 0xee, 0xd7, 0xde, 0x87, 0x57, 0x75, 0x70, 0x96, 0x70, 0x6e, 0x6e, 0x73, + 0x78, 0x77, 0x6f, 0x67, 0x77, 0x71, 0x6e, 0x72, 0x7a, 0x7e, 0x7a, 0x75, + 0x6a, 0x70, 0x79, 0x80, 0x82, 0x7e, 0x77, 0x72, 0x77, 0x77, 0x74, 0x6f, + 0x69, 0x67, 0x6a, 0x6e, 0x73, 0x6e, 0x69, 0x66, 0x65, 0x5e, 0x52, 0x48, + 0x57, 0x47, 0x78, 0xa9, 0x88, 0x5e, 0x66, 0x75, 0x80, 0x6f, 0x6d, 0x41, + 0x4f, 0x8f, 0x9a, 0xab, 0x8d, 0x41, 0x23, 0x73, 0x6c, 0x23, 0x35, 0x4b, + 0x72, 0x29, 0x54, 0x95, 0x5a, 0x1d, 0x1f, 0x19, 0x37, 0x2e, 0x22, 0x19, + 0x18, 0x1e, 0x28, 0x2f, 0x2b, 0x29, 0x35, 0x45, 0x43, 0x3e, 0x5a, 0x83, + 0x0b, 0x15, 0x79, 0xda, 0xc4, 0x81, 0x5e, 0x4c, 0x17, 0x2c, 0x4f, 0x6f, + 0x79, 0x63, 0x39, 0x18, 0x44, 0x8e, 0xb1, 0x9d, 0xaa, 0xd5, 0xc4, 0x85, + 0x34, 0x6b, 0x6b, 0x51, 0x66, 0x76, 0x5a, 0x3d, 0x38, 0x3a, 0x60, 0x70, + 0x40, 0x21, 0x45, 0x76, 0x8f, 0x50, 0x4f, 0x65, 0x61, 0x7b, 0x80, 0x44, + 0xa3, 0xaa, 0xac, 0x9c, 0x77, 0x47, 0x1b, 0x01, 0x83, 0x5f, 0x4a, 0x4e, + 0x43, 0x2b, 0x31, 0x4f, 0x63, 0xc0, 0xac, 0x95, 0xd7, 0xb3, 0x47, 0x37, + 0x85, 0xa4, 0x8b, 0x44, 0x32, 0x56, 0x4f, 0x1c, 0x70, 0x70, 0x69, 0x61, + 0x61, 0x60, 0x4a, 0x2f, 0x63, 0x64, 0x8c, 0xac, 0x7b, 0x39, 0x5e, 0xbe, + 0xb3, 0x87, 0x6e, 0x73, 0x65, 0x48, 0x4d, 0x6f, 0xc8, 0xd2, 0xcf, 0xad, + 0x77, 0x4a, 0x36, 0x35, 0x64, 0x46, 0x3a, 0x4d, 0x5b, 0x5a, 0x64, 0x78, + 0x48, 0x34, 0x35, 0x63, 0xa2, 0xba, 0x9b, 0x71, 0x60, 0x84, 0xce, 0xec, + 0xa4, 0x43, 0x21, 0x2c, 0x25, 0x00, 0x5e, 0x92, 0x7b, 0x83, 0x63, 0x34, + 0x47, 0x3e, 0x10, 0x0d, 0x3d, 0x42, 0x44, 0x77, 0x6b, 0x65, 0x2e, 0x3b, + 0x50, 0x59, 0x83, 0x72, 0x6b, 0x64, 0x61, 0x66, 0x6d, 0x65, 0x4f, 0x3b, + 0x5c, 0x52, 0x62, 0x81, 0x80, 0x6b, 0x7a, 0xa2, 0x81, 0x47, 0x22, 0x2a, + 0x2d, 0x21, 0x31, 0x55, 0x71, 0x7e, 0x68, 0x3e, 0x3a, 0x5e, 0x82, 0x91, + 0x46, 0x55, 0x4b, 0x30, 0x34, 0x56, 0x66, 0x5a, 0xbe, 0xc9, 0xa7, 0x59, + 0x23, 0x21, 0x2c, 0x2a, 0xa9, 0xe3, 0xd0, 0xbb, 0xb1, 0xc5, 0xf8, 0xe2, + 0x97, 0x35, 0xbb, 0xa8, 0x52, 0x6b, 0x44, 0x61, 0x46, 0x4f, 0x6c, 0x62, + 0x3f, 0x53, 0x60, 0x34, 0x4c, 0x86, 0x8e, 0x59, 0x4b, 0x6f, 0x6c, 0x3e, + 0x34, 0x5c, 0x3f, 0x1d, 0x39, 0x44, 0x4e, 0x83, 0x4f, 0x44, 0xa3, 0x91, + 0x7a, 0xe0, 0xd7, 0x7e, 0x43, 0x3a, 0xb4, 0x95, 0x47, 0x69, 0x68, 0x7e, + 0x88, 0x82, 0x7c, 0x7c, 0x81, 0x84, 0x82, 0x7e, 0x7e, 0x78, 0x74, 0x78, + 0x82, 0x87, 0x82, 0x7c, 0x67, 0x6e, 0x79, 0x83, 0x86, 0x83, 0x7d, 0x78, + 0x6f, 0x74, 0x78, 0x74, 0x6f, 0x6f, 0x78, 0x82, 0x71, 0x6b, 0x66, 0x63, + 0x61, 0x5a, 0x4e, 0x45, 0x39, 0x3b, 0x43, 0x5a, 0x88, 0xac, 0x99, 0x69, + 0x68, 0x55, 0x69, 0x47, 0x18, 0x09, 0x14, 0x5d, 0x66, 0x78, 0xaa, 0xda, + 0x8b, 0x3e, 0x51, 0x39, 0x3a, 0x69, 0xc0, 0xd0, 0x7f, 0x42, 0x29, 0x07, + 0x51, 0x62, 0x7a, 0x89, 0x86, 0x72, 0x56, 0x43, 0x27, 0x2c, 0x3a, 0x4e, + 0x5a, 0x56, 0x49, 0x40, 0x5a, 0x67, 0x79, 0x5e, 0x35, 0x40, 0x3d, 0x05, + 0x38, 0x3c, 0x4d, 0x6a, 0x7d, 0x70, 0x45, 0x1f, 0xd2, 0xff, 0xe0, 0x82, + 0x7b, 0xcd, 0xe3, 0xaf, 0x7b, 0x6e, 0x57, 0x57, 0x56, 0x2d, 0x21, 0x4d, + 0x34, 0x40, 0x64, 0x5b, 0x37, 0x4e, 0x59, 0x22, 0x18, 0x35, 0x5a, 0x72, + 0x77, 0x74, 0x73, 0x75, 0x85, 0xad, 0xdd, 0xec, 0xc6, 0x78, 0x24, 0x00, + 0xb5, 0x8c, 0x5e, 0x4d, 0x5f, 0x7b, 0x8c, 0x8f, 0x71, 0x8c, 0xbd, 0xf3, + 0xee, 0x96, 0x4e, 0x4d, 0x6c, 0x80, 0x6e, 0x3f, 0x3e, 0x6a, 0x7a, 0x65, + 0x4f, 0x39, 0x20, 0x36, 0x8e, 0xd6, 0xbd, 0x75, 0x5f, 0x81, 0x88, 0x57, + 0x1c, 0x14, 0x40, 0x6e, 0x8d, 0x5b, 0x1d, 0x06, 0x29, 0x67, 0x91, 0x9e, + 0x88, 0xdc, 0xb4, 0x56, 0x5a, 0x6c, 0x5b, 0x61, 0x8c, 0xc6, 0xa3, 0x2a, + 0x0d, 0x6c, 0xaa, 0x98, 0x4b, 0x86, 0x8e, 0x99, 0xc7, 0xa1, 0x4a, 0x30, + 0x5a, 0xbb, 0xcc, 0x9a, 0x76, 0x4e, 0x59, 0xa8, 0xab, 0xb7, 0xc6, 0xb0, + 0x63, 0x27, 0x46, 0x8e, 0x6e, 0x8b, 0x92, 0x66, 0x27, 0x01, 0x00, 0x01, + 0x8b, 0x84, 0x7b, 0x5a, 0x56, 0x9b, 0xad, 0x65, 0x3e, 0x66, 0x8c, 0x85, + 0x78, 0x88, 0x7d, 0x49, 0x66, 0xff, 0xb5, 0x5e, 0x90, 0x93, 0x89, 0x60, + 0x26, 0x2a, 0x45, 0x63, 0x5a, 0x34, 0x20, 0x27, 0x2a, 0x37, 0x1c, 0x1c, + 0x36, 0x15, 0x18, 0x6f, 0x4f, 0x65, 0x5b, 0x49, 0x75, 0xb0, 0x91, 0x3e, + 0x09, 0x89, 0xc9, 0x89, 0x50, 0x6a, 0x8c, 0x87, 0x8a, 0x84, 0x9e, 0xc4, + 0xb3, 0x7d, 0x6c, 0x84, 0x99, 0x63, 0x68, 0x94, 0x6e, 0x1c, 0x36, 0x9d, + 0x7c, 0x7c, 0x75, 0x67, 0x59, 0x55, 0x5f, 0x69, 0x75, 0x7f, 0x63, 0x4c, + 0x4b, 0x2d, 0x1d, 0x3e, 0x4a, 0x58, 0x63, 0x62, 0x59, 0x5a, 0x69, 0x79, + 0x70, 0x6c, 0x69, 0x59, 0x36, 0x14, 0x0d, 0x1d, 0x1d, 0x45, 0x4b, 0x4a, + 0x6d, 0x83, 0x79, 0x74, 0x84, 0x7c, 0x74, 0x71, 0x74, 0x75, 0x71, 0x6c, + 0x71, 0x74, 0x79, 0x7f, 0x83, 0x86, 0x87, 0x87, 0x7c, 0x7e, 0x81, 0x82, + 0x80, 0x7c, 0x78, 0x75, 0x80, 0x7d, 0x79, 0x76, 0x75, 0x77, 0x7a, 0x7c, + 0x73, 0x69, 0x5d, 0x59, 0x5d, 0x62, 0x63, 0x62, 0x4e, 0x42, 0x3a, 0x39, + 0x71, 0xdc, 0xd7, 0x61, 0x15, 0x12, 0x3e, 0x8c, 0xa9, 0x80, 0x50, 0x41, + 0x67, 0xa3, 0x90, 0x51, 0x49, 0x4e, 0x3e, 0x3b, 0x3b, 0x90, 0xb1, 0x64, + 0x0a, 0x03, 0x3b, 0x6a, 0xb6, 0xa1, 0x98, 0x74, 0x4f, 0x70, 0x8c, 0x69, + 0x29, 0x67, 0x52, 0x31, 0x5b, 0x68, 0x4a, 0x4d, 0x88, 0x73, 0x76, 0x51, + 0x1d, 0x40, 0x56, 0x16, 0x8a, 0x5d, 0x62, 0x6f, 0x48, 0x31, 0x42, 0x48, + 0x80, 0xbb, 0xa1, 0x63, 0x5a, 0x4f, 0x4a, 0x6e, 0x4c, 0x4c, 0x53, 0x40, + 0x26, 0x39, 0x41, 0x19, 0x57, 0x65, 0x50, 0x2c, 0x3b, 0x6a, 0x68, 0x3e, + 0x51, 0x69, 0x6a, 0x4e, 0x41, 0x4f, 0x55, 0x4a, 0x8e, 0xa0, 0x96, 0x7d, + 0x9b, 0x6e, 0x09, 0x23, 0x8c, 0x6b, 0x48, 0x41, 0x59, 0x7a, 0x90, 0x98, + 0x8c, 0x85, 0x7c, 0x80, 0x89, 0x8f, 0xac, 0xd8, 0xfa, 0xe2, 0xac, 0x78, + 0x77, 0xaa, 0xdf, 0xf7, 0xbe, 0xd8, 0xc5, 0xa4, 0xcc, 0xff, 0xd5, 0x66, + 0x34, 0x66, 0x85, 0x96, 0xcd, 0xff, 0xd6, 0x7d, 0x54, 0x6c, 0x8b, 0x84, + 0x46, 0x1a, 0x48, 0x9a, 0x92, 0x8e, 0x46, 0x04, 0x21, 0x5d, 0x70, 0x6f, + 0xfa, 0xff, 0xec, 0xca, 0xc5, 0xca, 0xa6, 0x6e, 0x63, 0x68, 0x49, 0x4d, + 0x78, 0x5e, 0x2b, 0x31, 0x62, 0xa9, 0x82, 0x38, 0x65, 0xaa, 0xa1, 0x86, + 0x59, 0x8e, 0x9e, 0x6c, 0x3f, 0x4a, 0x6a, 0x79, 0x37, 0x4c, 0x40, 0x40, + 0xa1, 0xff, 0xe6, 0x6d, 0x79, 0x5c, 0xa1, 0xf7, 0xd9, 0x90, 0x71, 0x68, + 0x3e, 0x4c, 0x5e, 0x73, 0x9a, 0xbc, 0x9c, 0x55, 0xa9, 0xbd, 0x44, 0x44, + 0x90, 0x70, 0x40, 0x09, 0x0e, 0x20, 0x54, 0x7e, 0x64, 0x29, 0x21, 0x44, + 0x56, 0x3a, 0x28, 0x53, 0x83, 0x61, 0x23, 0x14, 0x59, 0xa0, 0xc5, 0x9e, + 0x70, 0x67, 0x63, 0x52, 0x46, 0x4e, 0x4a, 0x30, 0x12, 0x0c, 0x25, 0x41, + 0x0f, 0x51, 0xb2, 0xf0, 0xe0, 0xa4, 0x7b, 0x76, 0x99, 0x40, 0x19, 0x67, + 0xc8, 0xd1, 0x8f, 0x52, 0x21, 0x26, 0x32, 0x43, 0x54, 0x5e, 0x5f, 0x5c, + 0x89, 0x3d, 0x09, 0x3d, 0x7b, 0x60, 0x5d, 0xa7, 0x4e, 0x40, 0x3c, 0x52, + 0x6f, 0x76, 0x5e, 0x42, 0x82, 0x46, 0x35, 0x25, 0x34, 0x4a, 0x48, 0x75, + 0x8f, 0x50, 0x35, 0x51, 0x5f, 0x5a, 0x6d, 0x91, 0x7d, 0x78, 0x75, 0x78, + 0x81, 0x86, 0x85, 0x82, 0x6c, 0x6b, 0x6a, 0x6b, 0x70, 0x77, 0x7e, 0x83, + 0x7b, 0x7c, 0x7f, 0x80, 0x7e, 0x7b, 0x76, 0x73, 0x6a, 0x69, 0x68, 0x69, + 0x6c, 0x71, 0x77, 0x7b, 0x6e, 0x63, 0x57, 0x52, 0x54, 0x58, 0x58, 0x56, + 0x4d, 0x4d, 0x68, 0x5f, 0x24, 0x15, 0x29, 0x24, 0x6b, 0x4e, 0x41, 0x4d, + 0x50, 0x54, 0x7d, 0xb3, 0x18, 0x3b, 0x31, 0x17, 0x11, 0x00, 0x08, 0x3a, + 0x2d, 0x2d, 0x2f, 0x30, 0x2e, 0x39, 0x5c, 0x80, 0x56, 0x50, 0x5f, 0x54, + 0x41, 0x6c, 0x8c, 0x68, 0x26, 0x3f, 0x46, 0x7e, 0xd8, 0xd0, 0x8f, 0x81, + 0x78, 0x75, 0x95, 0x9d, 0x8e, 0xad, 0xa9, 0x5c, 0x1b, 0x3c, 0x66, 0x52, + 0x23, 0x39, 0x61, 0x56, 0x48, 0x38, 0x16, 0x20, 0x3f, 0x2e, 0x42, 0x9a, + 0x42, 0x19, 0x3d, 0x65, 0x2a, 0x05, 0x6d, 0xf3, 0x7b, 0x71, 0x5c, 0x4b, + 0x52, 0x62, 0x5c, 0x49, 0x3a, 0x31, 0x2e, 0x37, 0x41, 0x44, 0x44, 0x46, + 0x97, 0xb0, 0xa3, 0x73, 0x81, 0x61, 0x07, 0x1b, 0x9c, 0xa5, 0xb9, 0xcf, + 0xd8, 0xc6, 0xa0, 0x81, 0x76, 0x67, 0x63, 0x7f, 0xb1, 0xcd, 0xa8, 0x69, + 0x6f, 0x69, 0x74, 0x89, 0x8a, 0x76, 0x6c, 0x73, 0x8c, 0xd7, 0xdf, 0xa5, + 0xb1, 0xec, 0xc2, 0x51, 0x77, 0x6b, 0x80, 0xb5, 0xd3, 0xc0, 0xa0, 0x91, + 0x91, 0x8e, 0xbb, 0xf1, 0xd0, 0x75, 0x56, 0x78, 0x6d, 0x45, 0x2f, 0x2a, + 0x38, 0x6d, 0x94, 0x89, 0x5f, 0x39, 0x22, 0x27, 0x27, 0x26, 0x46, 0x74, + 0x90, 0x51, 0x26, 0x69, 0xca, 0xbf, 0x7c, 0x6c, 0x64, 0x57, 0x2e, 0x39, + 0x85, 0x9b, 0x69, 0x45, 0x52, 0x71, 0x6e, 0x41, 0x29, 0x39, 0x46, 0x3f, + 0x48, 0x3c, 0x3f, 0x6a, 0xac, 0xcb, 0xa3, 0x68, 0x43, 0x62, 0xa5, 0xb5, + 0x81, 0x69, 0x60, 0x3a, 0x4e, 0x4c, 0x40, 0x4c, 0x85, 0xb7, 0xb2, 0x94, + 0xc1, 0xad, 0x64, 0x49, 0x1c, 0x00, 0x1e, 0x41, 0x4c, 0x16, 0x19, 0x62, + 0x82, 0x57, 0x35, 0x3d, 0x66, 0x58, 0x71, 0x87, 0x6d, 0x5b, 0x66, 0x6c, + 0x57, 0x57, 0x4e, 0x3e, 0x35, 0x30, 0x23, 0x12, 0x38, 0x1f, 0x13, 0x27, + 0x3d, 0x3b, 0x2a, 0x1d, 0x3a, 0x87, 0xd4, 0xea, 0xe0, 0xd7, 0xd3, 0xcf, + 0x6e, 0x47, 0x56, 0x82, 0x60, 0x13, 0x20, 0x73, 0x78, 0x68, 0x5c, 0x61, + 0x68, 0x59, 0x32, 0x0f, 0x38, 0x54, 0x58, 0x65, 0x7f, 0x70, 0x64, 0x86, + 0x60, 0x56, 0x43, 0x2d, 0x1f, 0x21, 0x2e, 0x3b, 0x6d, 0x7e, 0x6e, 0x6d, + 0xe7, 0xd8, 0x3e, 0x59, 0x44, 0x16, 0x24, 0x59, 0x6d, 0x74, 0x74, 0x60, + 0x7b, 0x76, 0x72, 0x74, 0x79, 0x7a, 0x76, 0x70, 0x64, 0x67, 0x6d, 0x74, + 0x7b, 0x81, 0x85, 0x87, 0x8a, 0x8b, 0x8e, 0x8f, 0x8d, 0x8a, 0x85, 0x82, + 0x88, 0x84, 0x7c, 0x73, 0x6d, 0x69, 0x68, 0x68, 0x71, 0x65, 0x58, 0x50, + 0x51, 0x52, 0x51, 0x4f, 0x3f, 0x31, 0x61, 0x8c, 0x5e, 0x1f, 0x16, 0x21, + 0x3d, 0x38, 0x45, 0x5d, 0x58, 0x33, 0x17, 0x12, 0x43, 0x81, 0xc8, 0xff, + 0xf6, 0x84, 0x32, 0x44, 0x4e, 0x21, 0x2b, 0x7c, 0xb2, 0x95, 0x5d, 0x42, + 0x57, 0x47, 0x4b, 0x44, 0x49, 0x9c, 0xe7, 0xdf, 0xb8, 0x90, 0x67, 0x7a, + 0x91, 0x54, 0x11, 0x14, 0x45, 0x33, 0x36, 0x35, 0x38, 0x63, 0x76, 0x4f, + 0x3a, 0x31, 0x39, 0x32, 0x2a, 0x4c, 0x52, 0x1c, 0x11, 0x48, 0x4c, 0x25, + 0x10, 0x12, 0x3e, 0x83, 0x4b, 0x00, 0x00, 0x47, 0x8f, 0xb7, 0xc2, 0xb1, + 0x4a, 0x35, 0x28, 0x2d, 0x34, 0x31, 0x2e, 0x31, 0x50, 0x34, 0x34, 0x58, + 0x67, 0x4e, 0x39, 0x3b, 0xa9, 0xca, 0xb9, 0x69, 0x61, 0x54, 0x0c, 0x14, + 0x5f, 0x64, 0x6d, 0x77, 0x7a, 0x71, 0x61, 0x54, 0x90, 0xbc, 0xe2, 0xc1, + 0x89, 0x8b, 0x93, 0x72, 0x38, 0x48, 0x8e, 0xe2, 0xe5, 0x96, 0x54, 0x46, + 0x00, 0x36, 0x51, 0x37, 0x43, 0x79, 0x7b, 0x4b, 0xa3, 0x6b, 0x59, 0x69, + 0x41, 0x00, 0x00, 0x44, 0x8e, 0x8c, 0xb0, 0xd9, 0xba, 0x61, 0x2a, 0x2b, + 0x40, 0x36, 0x79, 0x9f, 0x6b, 0x5b, 0x6b, 0x50, 0x50, 0x3c, 0x43, 0x63, + 0x68, 0x58, 0x67, 0x8e, 0x48, 0x40, 0x57, 0x7b, 0x62, 0x1f, 0x2c, 0x7c, + 0xb9, 0x8b, 0x6d, 0x84, 0x99, 0x7c, 0x5d, 0x61, 0x6a, 0x44, 0x34, 0x40, + 0x3c, 0x23, 0x22, 0x39, 0x2d, 0x3a, 0x63, 0x85, 0x6e, 0x38, 0x30, 0x4e, + 0x6d, 0x3a, 0x49, 0x64, 0x38, 0x19, 0x35, 0x4d, 0x2b, 0x63, 0x85, 0x97, + 0xa5, 0x87, 0x56, 0x47, 0x77, 0x5a, 0x6c, 0x9e, 0xac, 0xcd, 0xea, 0xba, + 0x39, 0x1e, 0x33, 0x62, 0x4e, 0x13, 0x20, 0x65, 0x79, 0x64, 0x9d, 0xcf, + 0xb9, 0xbc, 0xc0, 0x90, 0x84, 0x74, 0x6d, 0x73, 0x74, 0x6a, 0x64, 0x67, + 0x21, 0x2c, 0x22, 0x19, 0x3d, 0x67, 0x4a, 0x09, 0x8f, 0x74, 0x42, 0x2b, + 0x55, 0x81, 0x58, 0x07, 0x3f, 0x20, 0x2c, 0x59, 0x56, 0x30, 0x44, 0x84, + 0x5e, 0x43, 0x30, 0x42, 0x67, 0x75, 0x5d, 0x3d, 0x35, 0x77, 0x74, 0x43, + 0x3d, 0x48, 0x56, 0x74, 0x56, 0x63, 0x69, 0x60, 0x56, 0x63, 0x8a, 0xad, + 0x76, 0x55, 0x38, 0x1f, 0x4c, 0x7d, 0x6b, 0x6d, 0x57, 0x2b, 0x33, 0x65, + 0x79, 0x74, 0x75, 0x77, 0x65, 0x63, 0x65, 0x6e, 0x79, 0x7e, 0x7c, 0x77, + 0x78, 0x80, 0x89, 0x8d, 0x86, 0x76, 0x62, 0x55, 0x62, 0x64, 0x66, 0x67, + 0x66, 0x62, 0x5d, 0x5b, 0x4e, 0x50, 0x55, 0x5d, 0x69, 0x76, 0x81, 0x88, + 0x7a, 0x6e, 0x5f, 0x57, 0x56, 0x56, 0x54, 0x51, 0x36, 0x2f, 0x41, 0x47, + 0x30, 0x3f, 0x84, 0xbc, 0xb9, 0xab, 0xb6, 0xe1, 0xff, 0xe2, 0x93, 0x50, + 0x88, 0x98, 0xa7, 0xce, 0xe2, 0xa9, 0x83, 0xa8, 0x96, 0x67, 0x52, 0x73, + 0x92, 0x84, 0x60, 0x4b, 0x3d, 0x4a, 0x72, 0x75, 0x58, 0x62, 0x5a, 0x1b, + 0x36, 0x2d, 0x24, 0x26, 0x24, 0x1c, 0x35, 0x68, 0x29, 0x32, 0x44, 0x50, + 0x5e, 0x8a, 0xba, 0xcb, 0x84, 0x32, 0x21, 0x4f, 0x6b, 0x7e, 0x85, 0x70, + 0x5e, 0x96, 0x95, 0x4f, 0x26, 0x42, 0x7c, 0xa5, 0x93, 0xc0, 0xf0, 0xdd, + 0xa6, 0x95, 0x78, 0x36, 0x46, 0x48, 0x4a, 0x50, 0x5c, 0x68, 0x6e, 0x6e, + 0x69, 0x54, 0x4a, 0x54, 0x5c, 0x5c, 0x69, 0x7e, 0xbf, 0xe0, 0xcc, 0x68, + 0x4f, 0x53, 0x1a, 0x15, 0x5d, 0x69, 0x7b, 0x8c, 0x9c, 0xab, 0xba, 0xc3, + 0xb5, 0xbb, 0xc5, 0x8b, 0x3d, 0x54, 0x81, 0x67, 0x86, 0x65, 0x66, 0x8a, + 0x8f, 0x74, 0x7a, 0x9e, 0xc2, 0xb9, 0xa4, 0x83, 0x5d, 0x47, 0x4b, 0x5a, + 0x48, 0x2f, 0x18, 0x1a, 0x31, 0x41, 0x37, 0x24, 0x57, 0x53, 0x5e, 0x7f, + 0x9d, 0x9d, 0x82, 0x68, 0x55, 0x4a, 0x8b, 0xac, 0x6e, 0x52, 0x57, 0x34, + 0x22, 0x82, 0xd2, 0xc0, 0x74, 0x49, 0x60, 0x88, 0x3c, 0x32, 0x51, 0x65, + 0x2f, 0x11, 0x71, 0xf4, 0xe1, 0xc7, 0x8f, 0x4c, 0x3b, 0x68, 0x86, 0x77, + 0x4c, 0x25, 0x19, 0x38, 0x4b, 0x43, 0x47, 0x5c, 0x4a, 0x7c, 0x95, 0x81, + 0x72, 0x77, 0x69, 0x4a, 0x74, 0x51, 0x56, 0x5d, 0x4d, 0x58, 0x5d, 0x37, + 0x45, 0x5c, 0x46, 0x43, 0x72, 0x7b, 0x86, 0xbf, 0x73, 0x36, 0x5d, 0x81, + 0x75, 0xab, 0xe5, 0xe1, 0x61, 0x6a, 0x97, 0xbd, 0x96, 0x51, 0x58, 0x95, + 0x9a, 0xb5, 0xf2, 0xd0, 0x4b, 0x1d, 0x3c, 0x36, 0x18, 0x56, 0x98, 0x9f, + 0x71, 0x58, 0x85, 0xc7, 0xb4, 0xa5, 0x7a, 0x4e, 0x50, 0x70, 0x78, 0x66, + 0x00, 0x35, 0x56, 0x3f, 0x2f, 0x40, 0x44, 0x32, 0x4f, 0xd8, 0xff, 0xbb, + 0x6f, 0x8a, 0xb6, 0xb6, 0xd2, 0x9d, 0x64, 0x4f, 0x5b, 0x60, 0x4b, 0x30, + 0x33, 0x2e, 0x1f, 0x38, 0x5f, 0x4e, 0x46, 0x76, 0x56, 0x5c, 0x74, 0x9c, + 0xbc, 0xb8, 0x93, 0x6e, 0x3e, 0x71, 0x5f, 0xa0, 0xff, 0xd5, 0x78, 0x52, + 0x00, 0x0c, 0x10, 0x25, 0x5d, 0x80, 0x77, 0x6a, 0x86, 0x81, 0x7e, 0x7f, + 0x7f, 0x79, 0x6d, 0x62, 0x5d, 0x67, 0x75, 0x7f, 0x7f, 0x75, 0x66, 0x5c, + 0x6c, 0x6e, 0x70, 0x71, 0x6f, 0x6c, 0x67, 0x64, 0x5e, 0x5d, 0x5d, 0x5e, + 0x62, 0x68, 0x6f, 0x73, 0x7b, 0x6f, 0x61, 0x58, 0x57, 0x58, 0x56, 0x53, + 0x4f, 0x42, 0x4a, 0x70, 0xa5, 0xc6, 0xaa, 0x70, 0x5f, 0x64, 0x7a, 0xa7, + 0xd6, 0xde, 0xb0, 0x7b, 0x99, 0xac, 0xab, 0xbd, 0xd2, 0x97, 0x3f, 0x23, + 0x3e, 0x5a, 0x5c, 0x36, 0x19, 0x1f, 0x2a, 0x28, 0x36, 0x36, 0x4d, 0x44, + 0x29, 0x44, 0x50, 0x20, 0x3f, 0x52, 0x54, 0x2b, 0x04, 0x0f, 0x27, 0x27, + 0xca, 0xdb, 0xd4, 0xaa, 0x71, 0x43, 0x46, 0x6a, 0x4c, 0x14, 0x10, 0x22, + 0x15, 0x22, 0x54, 0x6d, 0x29, 0x20, 0x5c, 0xc6, 0xfb, 0xeb, 0xca, 0xb7, + 0xa1, 0x9d, 0xca, 0xdf, 0x9f, 0x5a, 0x43, 0x38, 0x24, 0x48, 0x53, 0x3e, + 0x44, 0x66, 0x6d, 0x55, 0x4c, 0x54, 0x44, 0x23, 0x25, 0x62, 0xb2, 0xe4, + 0xcd, 0xdc, 0xc9, 0x6a, 0x4d, 0x5b, 0x2b, 0x1a, 0x57, 0x70, 0x8f, 0xa0, + 0xa3, 0xa2, 0xa5, 0xab, 0x3e, 0x07, 0x22, 0x5c, 0x86, 0xdc, 0xff, 0xb6, + 0xd7, 0x9d, 0x61, 0x46, 0x4d, 0x74, 0xba, 0xf9, 0xdc, 0xa5, 0x79, 0x63, + 0x39, 0x0a, 0x10, 0x3b, 0x8b, 0x68, 0x4c, 0x55, 0x70, 0x7b, 0x6d, 0x5b, + 0x9d, 0x7b, 0x52, 0x47, 0x5f, 0x6c, 0x49, 0x19, 0x24, 0x08, 0x05, 0x11, + 0x26, 0x58, 0x77, 0x64, 0x3e, 0x8d, 0xa2, 0x52, 0x08, 0x0e, 0x32, 0x40, + 0x6b, 0x28, 0x20, 0x38, 0x26, 0x21, 0x46, 0x61, 0xae, 0x61, 0x38, 0x37, + 0x38, 0x51, 0x66, 0x56, 0x48, 0x54, 0x47, 0x2b, 0x33, 0x54, 0x57, 0x3d, + 0x40, 0x44, 0x4d, 0x4f, 0x3b, 0x22, 0x1d, 0x29, 0x58, 0x72, 0x74, 0x41, + 0x3f, 0x96, 0x98, 0x27, 0x45, 0x4d, 0x2c, 0x51, 0xb8, 0xbb, 0x98, 0xc0, + 0x9d, 0x23, 0x4e, 0x9d, 0xa7, 0x97, 0x64, 0x50, 0x82, 0x8f, 0xbb, 0xef, + 0xf8, 0xce, 0x9d, 0x86, 0x6e, 0x58, 0x4e, 0x44, 0x45, 0x64, 0x67, 0x3c, + 0x77, 0x6e, 0x5b, 0x4d, 0x56, 0x71, 0x84, 0x89, 0x99, 0x60, 0x49, 0x5e, + 0x53, 0x2e, 0x3d, 0x75, 0x41, 0xa5, 0xe8, 0xb4, 0x47, 0x15, 0x36, 0x69, + 0x85, 0x7d, 0x40, 0x00, 0x10, 0x5f, 0x71, 0x46, 0xe1, 0xb2, 0x79, 0x5c, + 0x60, 0x6c, 0x6d, 0x67, 0x02, 0x42, 0x5b, 0x5a, 0x67, 0x59, 0x46, 0x58, + 0x5a, 0x68, 0x7d, 0x8c, 0x88, 0x6c, 0x44, 0x26, 0x7e, 0x78, 0x8a, 0xba, + 0x61, 0x16, 0x5d, 0x61, 0x7a, 0xec, 0xfd, 0xa5, 0x73, 0x76, 0x79, 0x78, + 0x70, 0x6f, 0x72, 0x79, 0x7f, 0x7d, 0x73, 0x69, 0x77, 0x77, 0x77, 0x76, + 0x74, 0x72, 0x70, 0x6f, 0x76, 0x78, 0x7a, 0x7c, 0x7a, 0x76, 0x72, 0x6f, + 0x70, 0x6e, 0x6a, 0x68, 0x68, 0x6a, 0x6d, 0x70, 0x74, 0x69, 0x5b, 0x54, + 0x54, 0x56, 0x55, 0x53, 0x3b, 0x3b, 0x54, 0x88, 0xb7, 0xb0, 0x69, 0x1e, + 0x2c, 0x6f, 0xb1, 0xc5, 0xc1, 0xb8, 0xa5, 0x8f, 0x7a, 0x7b, 0x5d, 0x5a, + 0x79, 0x67, 0x41, 0x44, 0x6c, 0xbf, 0xe3, 0xa4, 0x57, 0x40, 0x43, 0x3e, + 0x59, 0x72, 0xab, 0xb7, 0x91, 0x83, 0x5e, 0x0b, 0x68, 0x5a, 0x46, 0x1a, + 0x04, 0x38, 0x57, 0x2e, 0x25, 0x76, 0xc2, 0xe8, 0xcf, 0x66, 0x15, 0x19, + 0xe1, 0xbd, 0x91, 0x4a, 0x0b, 0x12, 0x19, 0x00, 0x46, 0x14, 0x0b, 0x25, + 0x3b, 0x60, 0x7b, 0x6e, 0x9b, 0x86, 0xae, 0xcb, 0x82, 0x32, 0x30, 0x4c, + 0x3d, 0x6e, 0x78, 0x50, 0x45, 0x62, 0x61, 0x3e, 0x2d, 0x59, 0x67, 0x47, + 0x3c, 0x6e, 0xb0, 0xd4, 0xc5, 0xb6, 0xa7, 0x65, 0x53, 0x62, 0x31, 0x17, + 0x80, 0x84, 0x7e, 0x69, 0x53, 0x51, 0x66, 0x7c, 0x9d, 0x67, 0x95, 0xb9, + 0x86, 0x9c, 0xd8, 0xc4, 0x68, 0x65, 0x4e, 0x33, 0x3c, 0x65, 0x88, 0x92, + 0x39, 0x25, 0x1f, 0x34, 0x4e, 0x62, 0x7c, 0x95, 0x4d, 0x45, 0x55, 0x75, + 0x83, 0x8f, 0xc1, 0xfd, 0x84, 0x86, 0x8b, 0x83, 0x61, 0x40, 0x44, 0x5e, + 0x48, 0x5f, 0x41, 0x2a, 0x66, 0xb0, 0xc5, 0xc0, 0x91, 0x74, 0x37, 0x14, + 0x3c, 0x69, 0x34, 0x00, 0x27, 0x1c, 0x47, 0x5c, 0x32, 0x36, 0x60, 0x61, + 0x85, 0x17, 0x23, 0x82, 0x89, 0x60, 0x55, 0x4f, 0x60, 0x72, 0x64, 0x37, + 0x25, 0x36, 0x38, 0x24, 0x61, 0x3a, 0x49, 0x76, 0x59, 0x16, 0x36, 0x98, + 0x75, 0x35, 0x3d, 0x66, 0x59, 0x51, 0x6f, 0x7f, 0xd7, 0xcc, 0x81, 0x7f, + 0xc6, 0x9a, 0x56, 0x83, 0xc2, 0x7c, 0x97, 0x6d, 0x1f, 0x00, 0x00, 0x31, + 0x31, 0x63, 0x94, 0xaa, 0xb3, 0xb6, 0xa1, 0x82, 0x27, 0x81, 0xb0, 0xa4, + 0x99, 0x86, 0x6c, 0x65, 0x2e, 0x25, 0x0d, 0x12, 0x5c, 0xb2, 0xbb, 0x8e, + 0x6f, 0x37, 0x33, 0x67, 0x6b, 0x3c, 0x3b, 0x6d, 0x60, 0x3a, 0x21, 0x2c, + 0x40, 0x43, 0x41, 0x45, 0x09, 0x00, 0x2c, 0xb6, 0xff, 0xe9, 0x98, 0x6b, + 0x7b, 0x66, 0x49, 0x36, 0x34, 0x3e, 0x4b, 0x54, 0x44, 0xbc, 0xc5, 0x62, + 0x39, 0x4e, 0x61, 0x6d, 0x39, 0x54, 0x6e, 0x6c, 0x58, 0x50, 0x61, 0x77, + 0x21, 0x3f, 0x39, 0x43, 0x24, 0x09, 0x64, 0xb5, 0xff, 0xdb, 0x9a, 0x68, + 0x58, 0x5d, 0x6b, 0x7b, 0x6d, 0x6d, 0x6f, 0x74, 0x77, 0x71, 0x63, 0x57, + 0x76, 0x75, 0x75, 0x77, 0x7c, 0x84, 0x8c, 0x91, 0x75, 0x77, 0x79, 0x7a, + 0x79, 0x75, 0x71, 0x6e, 0x68, 0x65, 0x61, 0x5e, 0x5d, 0x5f, 0x62, 0x64, + 0x73, 0x69, 0x5c, 0x57, 0x59, 0x5d, 0x5e, 0x5c, 0x4b, 0x3c, 0x3c, 0x56, + 0x6c, 0x61, 0x46, 0x38, 0x4a, 0x8b, 0xad, 0x89, 0x5b, 0x56, 0x65, 0x6a, + 0x9d, 0x8f, 0x73, 0x70, 0x67, 0x30, 0x2e, 0x79, 0x9b, 0xb5, 0xba, 0x8e, + 0x53, 0x34, 0x39, 0x46, 0x62, 0x61, 0x77, 0x74, 0x66, 0x92, 0xb0, 0x8b, + 0x42, 0x23, 0x31, 0x3a, 0x32, 0x6a, 0xa8, 0xa0, 0xa0, 0x9c, 0x81, 0x92, + 0xc1, 0xb1, 0xac, 0xe9, 0xe8, 0xd6, 0xd2, 0xc3, 0xb9, 0xdc, 0xe0, 0xa9, + 0x26, 0x2f, 0x3e, 0x1f, 0x09, 0x58, 0xa5, 0x98, 0x5d, 0x4a, 0x5a, 0x65, + 0x47, 0x36, 0x2f, 0x17, 0x46, 0x6a, 0x77, 0x5e, 0x4b, 0x4e, 0x4b, 0x3b, + 0x2a, 0x4c, 0x69, 0x69, 0x5b, 0x5f, 0x77, 0x8c, 0xab, 0x7b, 0x72, 0x56, + 0x56, 0x60, 0x28, 0x09, 0x8f, 0xab, 0xc8, 0xc9, 0xb2, 0x9c, 0x96, 0x9a, + 0x99, 0x54, 0x8e, 0xc2, 0x78, 0x5b, 0x72, 0x4e, 0x00, 0x20, 0x39, 0x2d, + 0x37, 0x53, 0x46, 0x1c, 0x45, 0x4d, 0x46, 0x3f, 0x57, 0x78, 0x72, 0x51, + 0x12, 0x58, 0x74, 0x51, 0x50, 0x88, 0xa6, 0x95, 0x55, 0x1d, 0x19, 0x55, + 0x6d, 0x41, 0x1d, 0x22, 0x2d, 0x96, 0x8e, 0x4a, 0x57, 0x60, 0x3e, 0x36, + 0x2d, 0x57, 0x6e, 0x65, 0x6f, 0x9b, 0xbf, 0xc6, 0x91, 0x5f, 0x5a, 0x56, + 0x40, 0x6b, 0x8e, 0x66, 0x4b, 0x1e, 0x39, 0x5c, 0x48, 0x4f, 0x58, 0x2d, + 0x54, 0x41, 0x41, 0x4b, 0x39, 0x1d, 0x2d, 0x57, 0x6e, 0x59, 0x41, 0x32, + 0x25, 0x21, 0x30, 0x44, 0x47, 0x40, 0x6d, 0x88, 0x67, 0x64, 0x84, 0x89, + 0x96, 0xd7, 0xdc, 0xf9, 0xff, 0xaf, 0x3f, 0x68, 0xa5, 0x76, 0x78, 0x3f, + 0x60, 0xa9, 0x71, 0x68, 0x72, 0x62, 0x45, 0x53, 0xaf, 0xff, 0xe7, 0x90, + 0x57, 0xc7, 0xd7, 0x9c, 0x7d, 0x4a, 0x1a, 0x27, 0x00, 0x87, 0xf7, 0xc4, + 0x5f, 0x3e, 0x48, 0x4b, 0x89, 0x58, 0x22, 0x0b, 0x11, 0x1e, 0x26, 0x2b, + 0x2b, 0x10, 0x18, 0x43, 0x58, 0x58, 0x77, 0xab, 0x77, 0x52, 0x34, 0x25, + 0x0b, 0x00, 0x2a, 0x6a, 0x49, 0x4b, 0x48, 0x3e, 0x35, 0x36, 0x42, 0x4f, + 0x8f, 0xc1, 0xc3, 0xaa, 0x9f, 0x7c, 0x5a, 0x65, 0x24, 0x25, 0x2f, 0x45, + 0x58, 0x57, 0x40, 0x2a, 0x59, 0x5e, 0x5d, 0x42, 0x35, 0x75, 0xd4, 0xfd, + 0xf3, 0xba, 0x94, 0x7e, 0x68, 0x6e, 0x7a, 0x6d, 0x67, 0x69, 0x70, 0x7b, + 0x84, 0x83, 0x78, 0x6e, 0x78, 0x79, 0x7a, 0x7b, 0x7a, 0x77, 0x74, 0x72, + 0x6b, 0x6d, 0x6f, 0x70, 0x6f, 0x6b, 0x67, 0x64, 0x6e, 0x6b, 0x68, 0x67, + 0x67, 0x6a, 0x6e, 0x71, 0x79, 0x6f, 0x64, 0x60, 0x64, 0x69, 0x6a, 0x69, + 0x63, 0x51, 0x3f, 0x41, 0x45, 0x3b, 0x38, 0x47, 0x6b, 0x9b, 0xab, 0x85, + 0x67, 0x6f, 0x74, 0x68, 0x67, 0x5d, 0x65, 0x85, 0x67, 0x0a, 0x25, 0xb3, + 0x73, 0x71, 0x97, 0xd1, 0xd4, 0x9d, 0x70, 0x69, 0x6a, 0x63, 0x70, 0x65, + 0x53, 0x80, 0xa2, 0x7f, 0x3d, 0x3c, 0x94, 0xcd, 0x93, 0x75, 0x9d, 0xae, + 0xe3, 0xc6, 0x93, 0xac, 0xe5, 0xad, 0x59, 0x5f, 0x7d, 0x78, 0xa7, 0xb9, + 0x78, 0x47, 0x54, 0x63, 0x77, 0x32, 0x2e, 0x3a, 0x19, 0x21, 0x4a, 0x4c, + 0x46, 0x24, 0x2c, 0x3c, 0x2f, 0x3a, 0x5f, 0x6b, 0x32, 0x42, 0x56, 0x5b, + 0x4b, 0x3a, 0x3b, 0x47, 0x28, 0x19, 0x1a, 0x2c, 0x30, 0x32, 0x55, 0x83, + 0x94, 0x4f, 0x49, 0x48, 0x55, 0x5b, 0x1d, 0x00, 0x46, 0x6c, 0xa1, 0xc4, + 0xc1, 0x9b, 0x67, 0x43, 0x2f, 0x65, 0xa2, 0xb6, 0xa0, 0x84, 0x7d, 0x84, + 0x4f, 0x4c, 0x49, 0x49, 0x4a, 0x4a, 0x48, 0x45, 0x65, 0x92, 0x9c, 0x76, + 0x64, 0x70, 0x66, 0x43, 0x80, 0x63, 0x1c, 0x1b, 0x80, 0xb5, 0x7c, 0x3d, + 0x09, 0x2b, 0x38, 0x25, 0x1e, 0x31, 0x3b, 0x32, 0x37, 0x78, 0x9e, 0x83, + 0x5f, 0x5a, 0x5c, 0x53, 0x63, 0x6e, 0x77, 0x76, 0x73, 0x7b, 0x91, 0xa5, + 0x96, 0x6e, 0x52, 0x48, 0x30, 0x1f, 0x49, 0x8b, 0x24, 0x59, 0x3d, 0x11, + 0x2b, 0x36, 0x2f, 0x4b, 0x23, 0x40, 0x5f, 0x88, 0xc6, 0xdb, 0x8a, 0x1d, + 0x76, 0x2e, 0x1d, 0x14, 0x4e, 0x8e, 0x66, 0x5b, 0x6e, 0xa5, 0x7e, 0x58, + 0x97, 0xb7, 0x99, 0x97, 0x9d, 0x9a, 0x64, 0x24, 0x39, 0x81, 0x88, 0x53, + 0x45, 0x8e, 0xb0, 0xa4, 0x80, 0x45, 0x5c, 0xc5, 0xd1, 0x85, 0x96, 0xc8, + 0xa8, 0x8b, 0x93, 0x8b, 0x71, 0xa7, 0x91, 0x2a, 0x00, 0x26, 0x4b, 0x3e, + 0x8b, 0xc8, 0xf5, 0xeb, 0xc9, 0xac, 0x8b, 0x6b, 0xa3, 0xaa, 0x8f, 0x61, + 0x5c, 0x72, 0x60, 0x32, 0x2f, 0x76, 0x6d, 0x43, 0x57, 0x6e, 0x73, 0x8e, + 0xb8, 0xb5, 0x88, 0x77, 0x7a, 0x37, 0x0b, 0x3c, 0x59, 0x37, 0x2c, 0x45, + 0x56, 0x4d, 0x48, 0x50, 0x74, 0x72, 0x5d, 0x70, 0x92, 0x68, 0x40, 0x63, + 0x55, 0x33, 0x45, 0x77, 0x64, 0x1b, 0x0e, 0x3f, 0x47, 0x2d, 0x20, 0x2e, + 0x2c, 0x1f, 0x59, 0xc3, 0xb8, 0x97, 0x7c, 0x7b, 0x80, 0x7d, 0x7d, 0x84, + 0x86, 0x83, 0x7f, 0x7b, 0x79, 0x78, 0x78, 0x78, 0x85, 0x7e, 0x77, 0x75, + 0x76, 0x74, 0x6c, 0x65, 0x6d, 0x6e, 0x70, 0x73, 0x76, 0x78, 0x7a, 0x7b, + 0x77, 0x6e, 0x68, 0x6c, 0x77, 0x7d, 0x7a, 0x74, 0x79, 0x71, 0x67, 0x64, + 0x65, 0x66, 0x63, 0x5f, 0x58, 0x2e, 0x3a, 0x7e, 0x95, 0x66, 0x43, 0x4a, + 0x1b, 0x66, 0x84, 0x5c, 0x50, 0x82, 0xa9, 0xa4, 0x81, 0x55, 0x77, 0xa6, + 0x79, 0x41, 0x49, 0x5f, 0xb6, 0xf0, 0xeb, 0xcb, 0xcf, 0xb5, 0x7a, 0x61, + 0x5b, 0x44, 0x28, 0x23, 0x3b, 0x56, 0x5b, 0x51, 0x05, 0x15, 0x5d, 0xa7, + 0x8c, 0x37, 0x2a, 0x5f, 0x19, 0x4f, 0x99, 0xc5, 0xb7, 0x88, 0x61, 0x53, + 0xa5, 0x7d, 0x73, 0x81, 0x65, 0x2f, 0x32, 0x62, 0x30, 0x3a, 0x43, 0x43, + 0x38, 0x27, 0x17, 0x0e, 0x10, 0x13, 0x37, 0x47, 0x2c, 0x28, 0x2f, 0x1e, + 0x3f, 0x10, 0x32, 0x6b, 0x61, 0x59, 0x5e, 0x46, 0x45, 0x22, 0x0e, 0x16, + 0x18, 0x15, 0x2c, 0x51, 0x49, 0x40, 0x40, 0x26, 0x33, 0x2e, 0x00, 0x01, + 0x5d, 0x61, 0x60, 0x55, 0x4b, 0x52, 0x69, 0x7e, 0x99, 0x7d, 0x5a, 0x45, + 0x45, 0x4f, 0x57, 0x5a, 0x45, 0x3b, 0x39, 0x49, 0x63, 0x72, 0x70, 0x66, + 0x94, 0x96, 0x62, 0x0d, 0x00, 0x47, 0xaf, 0xe9, 0xff, 0xf6, 0xd1, 0xd1, + 0xdb, 0xa7, 0x76, 0x84, 0x5c, 0x74, 0x5f, 0x22, 0x12, 0x3e, 0x5d, 0x57, + 0x0a, 0x0d, 0x24, 0x3c, 0x37, 0x36, 0x6b, 0xb2, 0x5d, 0x5b, 0x5f, 0x6c, + 0x76, 0x6d, 0x52, 0x3a, 0x54, 0x39, 0x2e, 0x41, 0x53, 0x4e, 0x42, 0x3e, + 0x47, 0x6e, 0xa4, 0xa0, 0x54, 0x27, 0x51, 0x8e, 0xac, 0xb9, 0xba, 0xad, + 0xa6, 0xa2, 0x8d, 0x72, 0x19, 0x42, 0xa2, 0xb7, 0xd4, 0xf7, 0xc2, 0xb0, + 0x9a, 0xaf, 0x82, 0x57, 0x91, 0xdf, 0xe5, 0xc9, 0xbd, 0xa6, 0x7b, 0x5c, + 0x62, 0x76, 0x6d, 0x51, 0x28, 0x82, 0xe2, 0xc1, 0x5c, 0x57, 0x7e, 0x6b, + 0x93, 0x79, 0x83, 0x78, 0x4c, 0x63, 0x99, 0x9c, 0xa6, 0xa0, 0x7f, 0x58, + 0x54, 0x62, 0x4c, 0x21, 0x39, 0x60, 0x75, 0x6a, 0x6f, 0x99, 0xc5, 0xd8, + 0x7a, 0xbc, 0xdb, 0xaf, 0x7d, 0x7a, 0x89, 0x8d, 0x94, 0x4e, 0x5d, 0x67, + 0x33, 0x57, 0x9e, 0x8d, 0x4d, 0x87, 0x9c, 0xa7, 0xb3, 0x7e, 0x4a, 0x5b, + 0xcd, 0x82, 0x3f, 0x30, 0x31, 0x26, 0x21, 0x29, 0x01, 0x10, 0x4d, 0x61, + 0x35, 0x32, 0x40, 0x23, 0x48, 0x2b, 0x11, 0x12, 0x28, 0x48, 0x6a, 0x83, + 0x9a, 0x75, 0x7e, 0x44, 0x32, 0x79, 0x72, 0x4b, 0x1c, 0x42, 0x63, 0x6c, + 0x6e, 0x75, 0x77, 0x71, 0x76, 0x74, 0x71, 0x6f, 0x6d, 0x6c, 0x6b, 0x6b, + 0x6b, 0x67, 0x65, 0x6a, 0x73, 0x78, 0x76, 0x72, 0x6d, 0x6d, 0x6d, 0x6c, + 0x6c, 0x6b, 0x6b, 0x6b, 0x67, 0x6a, 0x6c, 0x6a, 0x66, 0x61, 0x5e, 0x5e, + 0x81, 0x79, 0x6f, 0x6b, 0x6d, 0x6d, 0x6a, 0x66, 0x57, 0x3a, 0x2f, 0x3f, + 0x43, 0x34, 0x34, 0x47, 0x4a, 0x2e, 0x12, 0x24, 0x6c, 0xb5, 0xc3, 0xab, + 0xe6, 0xd4, 0xed, 0xe8, 0x9a, 0x7b, 0xb3, 0xe7, 0xf8, 0xae, 0x72, 0xaa, + 0xff, 0xec, 0xab, 0xad, 0xc6, 0xdc, 0xbd, 0x72, 0x53, 0x69, 0x68, 0x46, + 0x6c, 0x38, 0x40, 0x8c, 0xa8, 0x6d, 0x34, 0x2b, 0x59, 0x6a, 0x5f, 0x41, + 0x46, 0x68, 0x6d, 0x55, 0x3c, 0x61, 0x7d, 0x7a, 0x6d, 0x64, 0x56, 0x45, + 0x09, 0x28, 0x49, 0x51, 0x44, 0x37, 0x3b, 0x45, 0x64, 0x4d, 0x4c, 0x41, + 0x26, 0x3a, 0x66, 0x6f, 0xb5, 0x78, 0x5e, 0x67, 0x5d, 0x4e, 0x46, 0x3b, + 0x44, 0x2f, 0x29, 0x33, 0x2c, 0x15, 0x11, 0x20, 0x17, 0x1c, 0x30, 0x2a, + 0x44, 0x43, 0x09, 0x12, 0x5e, 0x56, 0x4d, 0x4d, 0x56, 0x60, 0x67, 0x69, + 0x2b, 0x48, 0x5e, 0x52, 0x3a, 0x41, 0x71, 0xa1, 0x95, 0x83, 0x72, 0x6f, + 0x74, 0x71, 0x5f, 0x4d, 0x10, 0x9c, 0xff, 0xf7, 0xa2, 0x8b, 0xc8, 0xff, + 0xff, 0xbe, 0x65, 0x4e, 0x63, 0x40, 0x13, 0x1d, 0x98, 0xbc, 0xb4, 0x7a, + 0x5a, 0x67, 0x63, 0x45, 0x53, 0x31, 0x3c, 0x84, 0xbd, 0xb4, 0x8f, 0x7b, + 0x8e, 0xa3, 0xa7, 0x82, 0x4f, 0x40, 0x62, 0x8d, 0x6d, 0x65, 0x52, 0x47, + 0x55, 0x68, 0x5e, 0x45, 0x51, 0x67, 0xc9, 0xd6, 0x51, 0x0d, 0x3b, 0x59, + 0x44, 0x3a, 0x54, 0x9c, 0xdb, 0xe9, 0xd4, 0xc0, 0xb6, 0xbd, 0xde, 0xac, + 0x92, 0x9b, 0x68, 0x5f, 0x65, 0x63, 0x61, 0x57, 0x6b, 0xa9, 0xaa, 0x64, + 0x66, 0x71, 0x95, 0xc5, 0xd5, 0xb8, 0x8d, 0x75, 0x4d, 0x2a, 0x40, 0x59, + 0x4b, 0x67, 0x94, 0x90, 0x4d, 0xa3, 0xb0, 0x3e, 0x06, 0x6d, 0xb5, 0x85, + 0xc5, 0xb2, 0xaf, 0xb3, 0x8e, 0x49, 0x1f, 0x1d, 0x45, 0x63, 0x7f, 0x97, + 0xbd, 0xdd, 0xd1, 0xaf, 0xeb, 0xfc, 0xd5, 0x69, 0x12, 0x16, 0x5d, 0x99, + 0x91, 0x59, 0x23, 0x22, 0x30, 0x2e, 0x53, 0x9b, 0xd3, 0xef, 0xe1, 0xc7, + 0xc3, 0xb0, 0xa6, 0xc0, 0xe3, 0x97, 0x54, 0x4a, 0x57, 0x5d, 0x67, 0x79, + 0x14, 0x6f, 0xd4, 0xb5, 0x40, 0x24, 0x3b, 0x26, 0x5b, 0x53, 0x40, 0x56, + 0xb7, 0xff, 0xce, 0x5d, 0x55, 0x55, 0x69, 0xa6, 0xfd, 0xfb, 0xba, 0xbb, + 0xc2, 0xb8, 0x9f, 0x86, 0x84, 0x8d, 0x85, 0x72, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7d, 0x7c, 0x7b, 0x7a, 0x73, 0x6d, 0x67, 0x67, 0x6b, 0x6b, 0x65, 0x5f, + 0x66, 0x67, 0x68, 0x69, 0x6b, 0x6d, 0x6e, 0x6e, 0x68, 0x6e, 0x6f, 0x64, + 0x53, 0x4a, 0x4e, 0x55, 0x69, 0x61, 0x57, 0x52, 0x53, 0x53, 0x50, 0x4b, + 0x48, 0x41, 0x35, 0x2b, 0x2b, 0x32, 0x37, 0x36, 0x26, 0x22, 0x38, 0x69, + 0x93, 0xa3, 0xa8, 0xad, 0xce, 0xa2, 0xa6, 0xb2, 0x8f, 0x7d, 0x83, 0x77, + 0xc5, 0xc1, 0x94, 0x8b, 0xb9, 0xa4, 0x4e, 0x1e, 0x3f, 0x68, 0x81, 0x6f, + 0x55, 0x4f, 0x54, 0x55, 0x36, 0x12, 0x1e, 0x5e, 0x7a, 0x59, 0x43, 0x4f, + 0x47, 0x6c, 0x67, 0x48, 0x69, 0xab, 0x9e, 0x57, 0x7a, 0x6a, 0x92, 0xd6, + 0xcf, 0x8a, 0x79, 0xa2, 0xe6, 0xa1, 0x4a, 0x18, 0x18, 0x2f, 0x41, 0x46, + 0x4a, 0x2f, 0x2c, 0x2c, 0x2c, 0x69, 0xbc, 0xde, 0xcc, 0xc1, 0xaa, 0xa2, + 0x9a, 0x6d, 0x45, 0x48, 0x83, 0x69, 0x52, 0x47, 0x3a, 0x2b, 0x2e, 0x3e, + 0x4a, 0x46, 0x4d, 0x3d, 0x54, 0x56, 0x22, 0x31, 0x4d, 0x4a, 0x5a, 0x86, + 0xb2, 0xb7, 0x92, 0x69, 0x55, 0x58, 0x62, 0x70, 0x7a, 0x79, 0x6b, 0x5f, + 0x7b, 0x81, 0x82, 0x78, 0x67, 0x5d, 0x5f, 0x65, 0xa4, 0xac, 0xac, 0xa1, + 0x96, 0x8f, 0x84, 0x77, 0x5d, 0x91, 0x8f, 0x79, 0x8e, 0x94, 0x7d, 0x76, + 0x72, 0x78, 0x6d, 0x4f, 0x3a, 0x3d, 0x4b, 0x53, 0x77, 0x97, 0x95, 0x68, + 0x51, 0x6b, 0x8b, 0x94, 0x68, 0x5a, 0x4f, 0x57, 0x65, 0x63, 0x4c, 0x34, + 0x57, 0x7b, 0x7a, 0x47, 0x27, 0x30, 0x34, 0x24, 0x64, 0xd2, 0xeb, 0x72, + 0x4c, 0xd7, 0xff, 0xae, 0x7e, 0x5a, 0x6a, 0xbc, 0xf4, 0xde, 0xad, 0x94, + 0xe5, 0x76, 0x3b, 0x16, 0x38, 0x6e, 0x5f, 0x78, 0x84, 0x73, 0xb7, 0xe9, + 0xc1, 0xa8, 0x90, 0x4a, 0x22, 0x4f, 0x8b, 0xb4, 0xbe, 0xad, 0x8d, 0x74, + 0x99, 0x5e, 0x08, 0x00, 0x2e, 0x29, 0x2b, 0x69, 0xa8, 0xc4, 0xa9, 0x69, + 0x7d, 0xd6, 0xd3, 0x78, 0x66, 0x1f, 0x28, 0x9e, 0xec, 0xd1, 0xa8, 0xa8, + 0xc9, 0x90, 0x46, 0x30, 0x6f, 0xc6, 0xe2, 0xcd, 0xd1, 0x96, 0x5d, 0x63, + 0x99, 0xb6, 0x8d, 0x51, 0x61, 0x6c, 0x34, 0x1a, 0x3e, 0x34, 0x46, 0xa9, + 0xee, 0xd0, 0xb1, 0xab, 0xa6, 0x85, 0x71, 0x7c, 0x64, 0x45, 0x3a, 0x51, + 0x68, 0x75, 0x93, 0xb8, 0xf3, 0xec, 0x9c, 0x5f, 0x6f, 0x5c, 0x1a, 0x00, + 0x4f, 0x84, 0x91, 0x6f, 0x72, 0x9d, 0x9c, 0x70, 0x55, 0x47, 0x39, 0xaf, + 0xf9, 0xf8, 0xff, 0xdd, 0x9d, 0x6c, 0x47, 0x4f, 0x67, 0x6c, 0x62, 0x5a, + 0x79, 0x7b, 0x7d, 0x80, 0x80, 0x7f, 0x7d, 0x7c, 0x7b, 0x76, 0x72, 0x74, + 0x79, 0x7b, 0x77, 0x72, 0x5c, 0x5f, 0x65, 0x6c, 0x74, 0x7c, 0x81, 0x84, + 0x8a, 0x88, 0x80, 0x73, 0x66, 0x62, 0x67, 0x6e, 0x6c, 0x63, 0x58, 0x54, + 0x54, 0x53, 0x4f, 0x4a, 0x3c, 0x3a, 0x32, 0x31, 0x3f, 0x4b, 0x3f, 0x29, + 0xa4, 0xd9, 0xff, 0xff, 0xe0, 0xbe, 0xbb, 0xc8, 0xc7, 0xa4, 0xbc, 0xca, + 0x7d, 0x37, 0x3a, 0x4d, 0x62, 0x7d, 0x43, 0x00, 0x17, 0x3c, 0x3a, 0x39, + 0x33, 0x1f, 0x4c, 0x97, 0x89, 0x32, 0x18, 0x44, 0x48, 0x3a, 0x43, 0x5a, + 0x4e, 0x2b, 0x2d, 0x4d, 0x51, 0x67, 0x56, 0x2b, 0x2c, 0x4a, 0x37, 0x00, + 0x36, 0x3c, 0x38, 0x30, 0x48, 0x88, 0xcf, 0xf9, 0xf9, 0xc1, 0x81, 0x64, + 0x69, 0x6e, 0x5d, 0x47, 0x65, 0x4e, 0x50, 0x4e, 0x44, 0x6e, 0xae, 0xc3, + 0x7e, 0xae, 0xb0, 0xa3, 0x9c, 0x5a, 0x1d, 0x29, 0x6f, 0x5b, 0x43, 0x33, + 0x2b, 0x2b, 0x37, 0x44, 0x46, 0x4e, 0x65, 0x5d, 0x6c, 0x59, 0x0c, 0x0a, + 0x4b, 0x53, 0x64, 0x7a, 0x8c, 0x92, 0x8e, 0x87, 0x69, 0x53, 0x3f, 0x42, + 0x59, 0x73, 0x80, 0x81, 0x79, 0x97, 0xa8, 0x8d, 0x5a, 0x3e, 0x50, 0x6e, + 0x64, 0x4b, 0x47, 0x6d, 0x94, 0x92, 0x68, 0x40, 0x43, 0x7e, 0x8c, 0x8d, + 0xb4, 0xbc, 0x96, 0x81, 0x31, 0x28, 0x37, 0x54, 0x54, 0x44, 0x57, 0x7f, + 0x88, 0x6d, 0x33, 0x07, 0x21, 0x64, 0x83, 0x78, 0x36, 0x16, 0x05, 0x25, + 0x5c, 0x73, 0x55, 0x2c, 0x32, 0x6e, 0x8e, 0x74, 0x55, 0x4a, 0x2e, 0x07, + 0x7b, 0xb7, 0x92, 0x47, 0x5f, 0x93, 0x84, 0x5f, 0x90, 0x75, 0x73, 0x8a, + 0x8c, 0x88, 0xb4, 0xf5, 0xee, 0x5c, 0x2c, 0x3e, 0x6b, 0x69, 0x2c, 0x41, + 0x7a, 0x45, 0x8a, 0xd5, 0x93, 0x4e, 0x59, 0x66, 0x76, 0x9c, 0x8d, 0x41, + 0x19, 0x31, 0x43, 0x36, 0x81, 0xd1, 0xc7, 0x82, 0x6e, 0x67, 0x62, 0x7b, + 0x42, 0x6d, 0x96, 0x92, 0x5e, 0x38, 0x70, 0xd2, 0xb6, 0x9f, 0xba, 0xe9, + 0xc8, 0x77, 0x75, 0xb5, 0xa7, 0xbd, 0xce, 0xdb, 0xec, 0xe5, 0xa7, 0x60, + 0x00, 0x2e, 0x8c, 0xad, 0x89, 0x5e, 0x62, 0x80, 0x64, 0x68, 0x9b, 0x8f, + 0x4b, 0x70, 0xb4, 0xa0, 0xb2, 0x63, 0x4e, 0x83, 0x9b, 0x80, 0x6c, 0x6e, + 0x50, 0x4d, 0x5c, 0x71, 0x74, 0x78, 0xa6, 0xe0, 0xeb, 0xe9, 0xc1, 0xb3, + 0xc1, 0x9a, 0x7d, 0xa3, 0x66, 0x78, 0x70, 0x45, 0x21, 0x27, 0x46, 0x5d, + 0x20, 0x56, 0x46, 0x45, 0x1d, 0x16, 0x6f, 0x6c, 0x28, 0x28, 0x38, 0x53, + 0x61, 0x61, 0x6a, 0x7b, 0x71, 0x75, 0x7b, 0x80, 0x82, 0x81, 0x7e, 0x7c, + 0x77, 0x6f, 0x65, 0x60, 0x5e, 0x5a, 0x50, 0x48, 0x55, 0x58, 0x5e, 0x65, + 0x6d, 0x74, 0x7a, 0x7d, 0x76, 0x72, 0x6e, 0x6f, 0x70, 0x6d, 0x63, 0x5a, + 0x7a, 0x70, 0x65, 0x60, 0x5f, 0x5e, 0x59, 0x54, 0x41, 0x33, 0x26, 0x27, + 0x30, 0x35, 0x31, 0x2b, 0x4c, 0x72, 0x7c, 0x6c, 0x84, 0xbb, 0xc5, 0xa6, + 0x7a, 0x00, 0x00, 0x33, 0x69, 0x61, 0x52, 0x42, 0x5c, 0x50, 0x48, 0x7f, + 0xbb, 0x9b, 0x76, 0x97, 0x58, 0x22, 0x2e, 0x7c, 0x8f, 0x54, 0x3c, 0x5d, + 0x61, 0x47, 0x3c, 0x4a, 0x50, 0x43, 0x3a, 0x3e, 0x26, 0x3b, 0x4d, 0x4d, + 0x41, 0x3a, 0x3c, 0x40, 0x28, 0x38, 0x32, 0x1b, 0x28, 0x64, 0x9e, 0xb7, + 0x9a, 0xbd, 0xd9, 0xcc, 0x9e, 0x79, 0x75, 0x81, 0x90, 0x7a, 0x7b, 0x73, + 0x5a, 0x70, 0x9d, 0xa6, 0x94, 0xb8, 0xa7, 0x95, 0xa1, 0x72, 0x2b, 0x20, + 0x2a, 0x34, 0x3e, 0x42, 0x45, 0x48, 0x44, 0x3d, 0x1c, 0x4a, 0x98, 0xb8, + 0xcb, 0x95, 0x16, 0x00, 0xb5, 0xd2, 0xe2, 0xc3, 0x89, 0x69, 0x76, 0x92, + 0x5e, 0x5e, 0x55, 0x41, 0x33, 0x3c, 0x5a, 0x77, 0xc6, 0xdf, 0xeb, 0xcc, + 0x97, 0x78, 0x84, 0x9e, 0x63, 0x62, 0x6d, 0x76, 0x6b, 0x6b, 0x9e, 0xde, + 0xe4, 0xb8, 0x7d, 0x7c, 0x92, 0x5f, 0x1b, 0x14, 0x29, 0x27, 0x39, 0x4e, + 0x3f, 0x1b, 0x14, 0x29, 0x22, 0x3b, 0x6a, 0x84, 0x63, 0x35, 0x42, 0x71, + 0x4b, 0x43, 0x3d, 0x45, 0x5c, 0x79, 0x92, 0xa0, 0x5a, 0x62, 0x68, 0x70, + 0x83, 0x8c, 0x72, 0x4c, 0x6a, 0x6d, 0x4b, 0x54, 0x71, 0x3f, 0x32, 0x8d, + 0xa4, 0x80, 0x5c, 0x4e, 0x4f, 0x64, 0x95, 0xc5, 0x99, 0x54, 0x72, 0x90, + 0x93, 0x69, 0x24, 0x43, 0x9c, 0x50, 0x50, 0x7d, 0x64, 0x48, 0x87, 0xde, + 0xbd, 0xef, 0xd1, 0x58, 0x0c, 0x20, 0x39, 0x2c, 0x00, 0x1f, 0x6b, 0x82, + 0x55, 0x5a, 0x7b, 0x6d, 0x64, 0x6d, 0x4d, 0x44, 0x80, 0xaf, 0xaf, 0xae, + 0xaf, 0x7f, 0x69, 0x83, 0x92, 0x78, 0x57, 0x4b, 0x8a, 0xa5, 0x9e, 0x66, + 0x39, 0x3d, 0x56, 0x64, 0xb1, 0xa3, 0xa1, 0xa4, 0x90, 0x73, 0x74, 0x8b, + 0x52, 0x89, 0xb3, 0x9e, 0x82, 0x96, 0x9f, 0x7e, 0x61, 0x24, 0x2e, 0x6c, + 0x7e, 0x77, 0x69, 0x4e, 0x80, 0x73, 0x74, 0x80, 0x81, 0x8a, 0xbd, 0xfa, + 0xff, 0x9d, 0x87, 0xb3, 0xb9, 0xb8, 0xb5, 0x96, 0x78, 0x4e, 0x3e, 0x5f, + 0x79, 0x66, 0x3f, 0x28, 0x30, 0x3e, 0x2f, 0x19, 0x34, 0x3c, 0x23, 0x3c, + 0x51, 0x6e, 0x7d, 0x70, 0x61, 0x60, 0x62, 0x5f, 0x67, 0x6d, 0x77, 0x7f, + 0x82, 0x81, 0x7e, 0x7a, 0x6b, 0x68, 0x67, 0x6d, 0x76, 0x7c, 0x7b, 0x78, + 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x82, 0x83, 0x83, 0x78, 0x7b, 0x85, 0x94, + 0x9d, 0x93, 0x79, 0x62, 0x72, 0x69, 0x5d, 0x57, 0x56, 0x54, 0x4f, 0x4a, + 0x46, 0x3c, 0x37, 0x33, 0x26, 0x18, 0x1d, 0x2c, 0x26, 0x45, 0x3c, 0x1b, + 0x36, 0x70, 0x62, 0x20, 0x82, 0x44, 0x5f, 0xa9, 0xa3, 0x7b, 0x6f, 0x6b, + 0x52, 0x65, 0x4e, 0x3a, 0x42, 0x35, 0x3d, 0x76, 0x96, 0x78, 0x47, 0x25, + 0x2d, 0x44, 0x3e, 0x24, 0x0d, 0x1c, 0x2f, 0x33, 0x26, 0x1e, 0x2b, 0x3f, + 0x44, 0x50, 0x60, 0x60, 0x43, 0x26, 0x2c, 0x45, 0x2f, 0x2c, 0x40, 0x62, + 0x6e, 0x70, 0x8e, 0xb9, 0xce, 0xce, 0xbd, 0x91, 0x63, 0x53, 0x69, 0x85, + 0x54, 0x3f, 0x42, 0x43, 0x3b, 0x67, 0xa9, 0xbf, 0xa4, 0xac, 0xa2, 0xaf, + 0xd7, 0xc8, 0x74, 0x2f, 0x29, 0x39, 0x42, 0x40, 0x49, 0x5b, 0x5f, 0x56, + 0x4f, 0x79, 0xbe, 0xd5, 0xe1, 0xa8, 0x26, 0x00, 0x93, 0xa4, 0xac, 0x98, + 0x71, 0x54, 0x51, 0x5a, 0x50, 0x39, 0x37, 0x64, 0xa5, 0xc2, 0xa9, 0x83, + 0x95, 0x97, 0x9f, 0xb1, 0xc7, 0xd9, 0xe1, 0xe3, 0xc3, 0x85, 0x5c, 0x64, + 0x65, 0x4a, 0x3d, 0x49, 0x03, 0x37, 0x60, 0x7f, 0x87, 0x6a, 0x7d, 0xcc, + 0xd1, 0xcb, 0x98, 0x47, 0x1f, 0x34, 0x51, 0x56, 0x58, 0x31, 0x2d, 0x5b, + 0x78, 0x5e, 0x37, 0x27, 0x42, 0x3d, 0x44, 0x60, 0x7f, 0x85, 0x6d, 0x52, + 0x6b, 0x4a, 0x39, 0x4a, 0x64, 0x6e, 0x74, 0x7b, 0x90, 0xbb, 0x87, 0x11, + 0x00, 0x3c, 0x71, 0x74, 0x8b, 0x7e, 0x67, 0x5f, 0x75, 0x8d, 0x81, 0x64, + 0x69, 0x76, 0xa9, 0x82, 0x5d, 0x5a, 0x3b, 0x55, 0x8c, 0x68, 0x3b, 0x45, + 0x76, 0x88, 0x9a, 0xc8, 0xac, 0xeb, 0xfd, 0xba, 0x6d, 0x58, 0x60, 0x64, + 0x5f, 0x20, 0x34, 0x64, 0x4a, 0x31, 0x3f, 0x41, 0x3d, 0x77, 0x51, 0x20, + 0x68, 0xaf, 0x8d, 0x55, 0x4a, 0x69, 0x7c, 0x83, 0xa0, 0xc7, 0xc8, 0xad, + 0x3f, 0x8a, 0xca, 0xd1, 0xbf, 0xb7, 0xae, 0xa1, 0xaf, 0xa7, 0xaf, 0xb4, + 0x8f, 0x5e, 0x63, 0x8b, 0x79, 0xa8, 0x84, 0x7a, 0xbb, 0x9c, 0x49, 0x4a, + 0x50, 0x80, 0xd3, 0xeb, 0xcb, 0xcc, 0xad, 0x4f, 0x65, 0x3f, 0x31, 0x4d, + 0x69, 0x6e, 0x74, 0x83, 0x34, 0x06, 0x05, 0x08, 0x00, 0x40, 0xa8, 0xd0, + 0x51, 0x42, 0x44, 0x58, 0x59, 0x4a, 0x4b, 0x5c, 0x4c, 0x24, 0x42, 0x33, + 0x3d, 0x83, 0x72, 0x46, 0x3e, 0x51, 0x61, 0x6a, 0x75, 0x77, 0x60, 0x41, + 0x53, 0x5a, 0x66, 0x70, 0x75, 0x74, 0x6f, 0x6c, 0x7a, 0x75, 0x70, 0x71, + 0x75, 0x77, 0x72, 0x6c, 0x68, 0x68, 0x67, 0x67, 0x66, 0x66, 0x66, 0x65, + 0x6e, 0x76, 0x82, 0x8c, 0x8c, 0x82, 0x71, 0x65, 0x75, 0x6b, 0x5f, 0x59, + 0x57, 0x55, 0x4f, 0x4a, 0x43, 0x43, 0x44, 0x40, 0x2f, 0x1f, 0x1e, 0x27, + 0x02, 0x2b, 0x3d, 0x2d, 0x28, 0x39, 0x37, 0x21, 0x27, 0x2c, 0x66, 0x9f, + 0xae, 0xac, 0x76, 0x19, 0x00, 0x72, 0x91, 0x60, 0x50, 0x48, 0x32, 0x30, + 0x5b, 0x71, 0x5e, 0x33, 0x40, 0x7e, 0x96, 0x7d, 0x7f, 0xa3, 0xbd, 0xaa, + 0x7f, 0x64, 0x67, 0x74, 0x6a, 0x65, 0x4b, 0x31, 0x44, 0x86, 0xc8, 0xe7, + 0xc5, 0xea, 0xc7, 0x66, 0x4c, 0x88, 0xa6, 0x8b, 0x89, 0x6d, 0x50, 0x49, + 0x55, 0x5c, 0x52, 0x44, 0x35, 0x1b, 0x1a, 0x15, 0x0b, 0x36, 0x79, 0x90, + 0x6d, 0x73, 0x89, 0x99, 0xa1, 0xa2, 0x6e, 0x1b, 0x37, 0x42, 0x3a, 0x24, + 0x26, 0x41, 0x4c, 0x43, 0x64, 0x6d, 0x83, 0x77, 0x7f, 0x61, 0x09, 0x00, + 0x8c, 0x6b, 0x57, 0x75, 0xb6, 0xe9, 0xf3, 0xe8, 0x9e, 0xa2, 0xaf, 0xc2, + 0xd0, 0xcd, 0xbb, 0xaa, 0x5a, 0x38, 0x28, 0x4d, 0x90, 0xb6, 0xa5, 0x84, + 0x8b, 0x5f, 0x49, 0x4f, 0x3e, 0x21, 0x32, 0x63, 0x17, 0x53, 0x51, 0x2c, + 0x3f, 0x70, 0xa8, 0xe3, 0xde, 0xff, 0xd1, 0x55, 0x32, 0x79, 0x9b, 0x79, + 0x57, 0x54, 0x41, 0x3c, 0x62, 0x8c, 0x7a, 0x47, 0x36, 0x5f, 0x7a, 0x5f, + 0x2a, 0x19, 0x41, 0x72, 0x6c, 0x66, 0x7b, 0x98, 0x89, 0x62, 0x68, 0x8f, + 0x6f, 0x47, 0x70, 0x99, 0x72, 0x65, 0x7e, 0x76, 0x3f, 0x72, 0x80, 0x52, + 0x29, 0x25, 0x1d, 0x06, 0x41, 0x82, 0xb7, 0x63, 0x47, 0x89, 0x82, 0x7c, + 0x52, 0x72, 0x4a, 0x4a, 0xaf, 0xc6, 0x74, 0x41, 0xa3, 0xc8, 0xe0, 0xbf, + 0x73, 0x43, 0x58, 0x86, 0x9a, 0xcf, 0xb2, 0x6b, 0x50, 0x31, 0x14, 0x22, + 0x62, 0x5b, 0x44, 0x69, 0xa1, 0x69, 0x1a, 0x21, 0x72, 0x80, 0x66, 0x4c, + 0x7c, 0xb5, 0x78, 0x00, 0x52, 0x5b, 0x58, 0x55, 0x6d, 0x8c, 0x88, 0x6b, + 0xb5, 0xa2, 0xac, 0xc9, 0xba, 0x85, 0x72, 0x86, 0xfb, 0x8f, 0x7c, 0xb5, + 0xc0, 0xa6, 0x6b, 0x19, 0x4e, 0xb7, 0xff, 0xcb, 0x87, 0xcc, 0xee, 0x91, + 0x73, 0x3b, 0x25, 0x53, 0x7e, 0x67, 0x26, 0x00, 0x59, 0x79, 0x57, 0x3e, + 0x72, 0x86, 0x5d, 0x48, 0x65, 0x4c, 0x3b, 0x48, 0x64, 0x70, 0x65, 0x55, + 0x5b, 0x4a, 0x30, 0x3a, 0x6c, 0x7f, 0x62, 0x4a, 0x2b, 0x25, 0x38, 0x64, + 0x85, 0x84, 0x75, 0x6c, 0x5d, 0x65, 0x72, 0x7d, 0x83, 0x82, 0x7d, 0x79, + 0x7d, 0x77, 0x70, 0x70, 0x72, 0x72, 0x6b, 0x65, 0x67, 0x68, 0x6a, 0x6d, + 0x70, 0x72, 0x74, 0x75, 0x6f, 0x75, 0x77, 0x70, 0x65, 0x60, 0x66, 0x6e, + 0x73, 0x69, 0x5d, 0x56, 0x54, 0x52, 0x4c, 0x46, 0x41, 0x3b, 0x31, 0x2a, + 0x2a, 0x2c, 0x2a, 0x25, 0x4d, 0x39, 0x22, 0x16, 0x10, 0x16, 0x2b, 0x42, + 0x1f, 0x7f, 0xd4, 0xc2, 0xa0, 0xc9, 0xca, 0x77, 0x9b, 0x8a, 0x6d, 0x86, + 0xaf, 0x81, 0x3f, 0x40, 0x4b, 0x69, 0x82, 0x7e, 0x6a, 0x61, 0x65, 0x6c, + 0x3c, 0x30, 0x28, 0x38, 0x59, 0x61, 0x36, 0x00, 0x0f, 0x2a, 0x1e, 0x06, + 0x3a, 0x9c, 0xba, 0x95, 0x8d, 0x9e, 0x9a, 0x74, 0x49, 0x2c, 0x13, 0x00, + 0x23, 0x25, 0x29, 0x30, 0x33, 0x30, 0x26, 0x1f, 0x35, 0x20, 0x24, 0x20, + 0x0e, 0x2d, 0x61, 0x6e, 0x8b, 0x8d, 0xa0, 0x7b, 0x36, 0x3c, 0x4f, 0x25, + 0x49, 0x62, 0x67, 0x54, 0x4d, 0x53, 0x44, 0x25, 0x39, 0x3e, 0x50, 0x47, + 0x5c, 0x54, 0x13, 0x18, 0xb1, 0x9c, 0x8e, 0x9e, 0xc0, 0xd5, 0xcf, 0xc0, + 0xe2, 0xc5, 0x9e, 0x81, 0x75, 0x75, 0x77, 0x78, 0x71, 0x93, 0xac, 0x9d, + 0x7c, 0x78, 0x9f, 0xcb, 0xb6, 0xc3, 0xad, 0x60, 0x0e, 0x07, 0x55, 0xa8, + 0x63, 0x74, 0x90, 0xa8, 0xaa, 0x8d, 0x5f, 0x3c, 0x93, 0x82, 0x75, 0x79, + 0x80, 0x73, 0x4e, 0x2d, 0x60, 0x53, 0x4d, 0x5b, 0x6f, 0x6e, 0x53, 0x37, + 0x5e, 0x48, 0x50, 0x73, 0x7e, 0x76, 0x90, 0xbf, 0xb2, 0x99, 0x5f, 0x34, + 0x55, 0xa7, 0xd3, 0xce, 0xc6, 0xda, 0xdf, 0xbc, 0x7d, 0x49, 0x38, 0x3d, + 0x24, 0x29, 0x36, 0x52, 0x7b, 0xae, 0xdc, 0xf7, 0xd6, 0xa4, 0x67, 0x46, + 0x42, 0x46, 0x3d, 0x30, 0x13, 0x33, 0x64, 0x94, 0xb1, 0xb4, 0xa6, 0x98, + 0x17, 0x46, 0x88, 0xa4, 0x82, 0x60, 0x85, 0xc8, 0xff, 0xc2, 0x78, 0x5a, + 0x67, 0x78, 0x6f, 0x5c, 0x8a, 0x4b, 0x77, 0xe6, 0xca, 0x3e, 0x2c, 0x91, + 0xc3, 0x74, 0x1a, 0x00, 0x29, 0x5e, 0x6d, 0x5f, 0x19, 0x5d, 0xa0, 0xa6, + 0x80, 0x6f, 0x93, 0xc2, 0xe5, 0xd9, 0xca, 0xc0, 0xb6, 0xa6, 0x90, 0x7e, + 0x31, 0x5f, 0x7a, 0x7a, 0x8f, 0xb3, 0xa8, 0x7c, 0x4a, 0x6e, 0x99, 0xb5, + 0xc8, 0xd6, 0xd9, 0xd3, 0x7e, 0x6f, 0x4f, 0x28, 0x18, 0x35, 0x76, 0xac, + 0xc9, 0xc3, 0xc1, 0xc3, 0xbc, 0x9b, 0x67, 0x3d, 0x8d, 0x74, 0x57, 0x4b, + 0x51, 0x5a, 0x5c, 0x59, 0x43, 0x2c, 0x39, 0x54, 0x53, 0x48, 0x31, 0x0e, + 0x2e, 0x38, 0x48, 0x59, 0x65, 0x6a, 0x6b, 0x6a, 0x5e, 0x6c, 0x7b, 0x82, + 0x7d, 0x76, 0x72, 0x72, 0x7a, 0x74, 0x70, 0x73, 0x7a, 0x7e, 0x79, 0x74, + 0x6b, 0x6f, 0x76, 0x7a, 0x7c, 0x7a, 0x76, 0x73, 0x87, 0x82, 0x79, 0x70, + 0x6a, 0x68, 0x68, 0x68, 0x69, 0x63, 0x5d, 0x5d, 0x60, 0x60, 0x5a, 0x54, + 0x54, 0x49, 0x70, 0xba, 0xf1, 0xb7, 0x45, 0x2d, 0x2d, 0x31, 0x36, 0x39, + 0x39, 0x36, 0x31, 0x2d, 0x4b, 0x8a, 0x98, 0x73, 0x83, 0xc3, 0xc5, 0x8c, + 0x51, 0x1f, 0x1b, 0x49, 0x4d, 0x24, 0x2d, 0x62, 0x88, 0x64, 0x60, 0x7a, + 0x6a, 0x2f, 0x16, 0x27, 0x5a, 0xa8, 0xeb, 0xde, 0x9a, 0x77, 0x9d, 0xd5, + 0x3a, 0x34, 0x15, 0x07, 0x49, 0xae, 0xd1, 0xb5, 0x8f, 0xbb, 0xe0, 0xb7, + 0x4c, 0x1d, 0x82, 0xff, 0xe8, 0x9b, 0x5c, 0x54, 0x53, 0x3f, 0x39, 0x46, + 0x26, 0x13, 0x11, 0x23, 0x27, 0x1d, 0x21, 0x33, 0x45, 0x29, 0x1e, 0x2f, + 0x3b, 0x32, 0x27, 0x28, 0x3b, 0x5b, 0x77, 0x72, 0x51, 0x34, 0x2f, 0x38, + 0x35, 0x3c, 0x42, 0x40, 0x36, 0x2a, 0x22, 0x1f, 0xad, 0x8e, 0x70, 0x71, + 0x8e, 0xad, 0xbc, 0xbc, 0x4b, 0x47, 0x60, 0xa4, 0xed, 0xff, 0xde, 0xad, + 0xb7, 0xa0, 0x86, 0x7a, 0x7f, 0x88, 0x8a, 0x88, 0xbc, 0xe9, 0xff, 0xff, + 0xf2, 0xb1, 0x7c, 0x62, 0x49, 0x65, 0x8f, 0xb2, 0xb8, 0x9d, 0x71, 0x4f, + 0x41, 0x69, 0xa8, 0xdc, 0xe5, 0xb9, 0x6e, 0x36, 0x39, 0x68, 0xa8, 0xcf, + 0xc8, 0x99, 0x5d, 0x36, 0x67, 0x5f, 0x39, 0x13, 0x24, 0x56, 0x5d, 0x3e, + 0x70, 0x7d, 0xa0, 0xcf, 0xea, 0xe4, 0xcf, 0xc0, 0xc5, 0xc4, 0xb3, 0x8a, + 0x5d, 0x44, 0x49, 0x58, 0x94, 0x87, 0x78, 0x77, 0x8b, 0xb3, 0xdf, 0xfb, + 0xce, 0x97, 0x58, 0x3a, 0x3d, 0x3c, 0x26, 0x0d, 0x91, 0x9a, 0xb1, 0xd0, + 0xe5, 0xe0, 0xc3, 0xa8, 0x55, 0x4b, 0x4e, 0x53, 0x3f, 0x27, 0x39, 0x62, + 0x6c, 0x4e, 0x31, 0x30, 0x47, 0x58, 0x54, 0x47, 0x1c, 0x2a, 0x46, 0x54, + 0x3a, 0x1e, 0x37, 0x69, 0x5f, 0x66, 0x64, 0x63, 0x78, 0x8f, 0x84, 0x65, + 0xc0, 0xad, 0x95, 0x89, 0x8e, 0x9d, 0xac, 0xb5, 0xd1, 0xdb, 0xd5, 0xae, + 0x79, 0x5c, 0x63, 0x78, 0x8a, 0x85, 0x85, 0x89, 0x85, 0x81, 0x8a, 0x9b, + 0x65, 0x3d, 0x50, 0xaf, 0xf4, 0xdc, 0x9a, 0x70, 0xbc, 0x81, 0x38, 0x10, + 0x19, 0x3b, 0x58, 0x66, 0x76, 0x53, 0x2b, 0x1d, 0x2c, 0x46, 0x56, 0x5b, + 0x37, 0x71, 0xa2, 0x92, 0x5d, 0x4a, 0x74, 0xaa, 0x51, 0x34, 0x2d, 0x3c, + 0x3b, 0x2c, 0x26, 0x27, 0x36, 0x3f, 0x4e, 0x5d, 0x67, 0x6b, 0x6a, 0x69, + 0x67, 0x72, 0x7d, 0x7e, 0x75, 0x69, 0x63, 0x61, 0x82, 0x7c, 0x78, 0x7b, + 0x81, 0x84, 0x80, 0x7a, 0x61, 0x68, 0x72, 0x7c, 0x82, 0x84, 0x83, 0x81, + 0x79, 0x79, 0x79, 0x77, 0x73, 0x6d, 0x67, 0x63, 0x61, 0x5b, 0x55, 0x55, + 0x58, 0x57, 0x51, 0x4b, 0x46, 0x52, 0x78, 0x96, 0xc0, 0xc5, 0x87, 0x67, + 0x63, 0x55, 0x3f, 0x28, 0x18, 0x11, 0x10, 0x12, 0x23, 0x52, 0x88, 0xa3, + 0xa6, 0x9f, 0x93, 0x88, 0x30, 0x4c, 0x55, 0x46, 0x41, 0x48, 0x38, 0x19, + 0x48, 0x61, 0x7d, 0x78, 0x50, 0x3c, 0x6a, 0xad, 0xe3, 0xf5, 0xf9, 0xd7, + 0x9a, 0x65, 0x51, 0x51, 0x48, 0x28, 0x0f, 0x31, 0x8d, 0xd9, 0xd4, 0xa6, + 0x92, 0x90, 0x9e, 0xb6, 0xc2, 0xc4, 0xd1, 0xe5, 0xd1, 0xbb, 0xb1, 0xac, + 0x87, 0x4f, 0x39, 0x47, 0x0c, 0x57, 0xbe, 0xda, 0x7e, 0x11, 0x10, 0x54, + 0x1c, 0x28, 0x26, 0x23, 0x40, 0x5f, 0x49, 0x17, 0x2f, 0x4b, 0x6d, 0x7e, + 0x75, 0x5c, 0x43, 0x35, 0x2d, 0x2e, 0x2e, 0x29, 0x21, 0x1a, 0x16, 0x15, + 0xd7, 0xaa, 0x6f, 0x4a, 0x45, 0x52, 0x60, 0x66, 0x5f, 0x67, 0x69, 0x59, + 0x41, 0x39, 0x45, 0x56, 0x83, 0x84, 0x7a, 0x62, 0x50, 0x5a, 0x7f, 0xa1, + 0xfd, 0xc5, 0x7d, 0x4f, 0x45, 0x4a, 0x4b, 0x47, 0x8b, 0x94, 0xa1, 0xae, + 0xb8, 0xc0, 0xc5, 0xc8, 0xee, 0xf2, 0xf0, 0xe1, 0xcb, 0xbb, 0xb7, 0xba, + 0xd8, 0xde, 0xd0, 0xa1, 0x62, 0x3a, 0x37, 0x44, 0x62, 0x58, 0x3c, 0x34, + 0x65, 0x9c, 0x8b, 0x51, 0x0a, 0x0c, 0x3b, 0x82, 0x9e, 0x92, 0xa2, 0xcc, + 0xd5, 0xd2, 0xc9, 0xbc, 0xb3, 0xb6, 0xc3, 0xd0, 0x78, 0x70, 0x66, 0x60, + 0x65, 0x72, 0x82, 0x8d, 0xb6, 0xa8, 0x95, 0x83, 0x73, 0x60, 0x4b, 0x3c, + 0x33, 0x54, 0x86, 0xb4, 0xd1, 0xe0, 0xe7, 0xea, 0x81, 0x48, 0x1f, 0x26, + 0x39, 0x3f, 0x4f, 0x66, 0x55, 0x4f, 0x49, 0x46, 0x45, 0x41, 0x3a, 0x33, + 0x35, 0x21, 0x29, 0x48, 0x50, 0x5d, 0xab, 0xff, 0x8b, 0x70, 0x74, 0x88, + 0x65, 0x20, 0x12, 0x37, 0x76, 0x74, 0x89, 0xbd, 0xef, 0xf4, 0xc7, 0x96, + 0x70, 0x52, 0x39, 0x42, 0x5d, 0x61, 0x41, 0x1e, 0x41, 0x2f, 0x49, 0x7d, + 0x76, 0x37, 0x15, 0x24, 0x24, 0x32, 0x82, 0xd9, 0xc2, 0x6e, 0x71, 0xbc, + 0xff, 0xdc, 0xa1, 0x7f, 0x7e, 0x87, 0x87, 0x82, 0x3f, 0x28, 0x13, 0x15, + 0x2c, 0x43, 0x4c, 0x4b, 0x0f, 0x1c, 0x2a, 0x30, 0x2f, 0x31, 0x3a, 0x43, + 0x22, 0x30, 0x3e, 0x47, 0x3f, 0x26, 0x26, 0x40, 0x74, 0x78, 0x7d, 0x7e, + 0x7a, 0x71, 0x66, 0x5f, 0x6c, 0x76, 0x80, 0x81, 0x78, 0x6e, 0x6a, 0x6a, + 0x8c, 0x86, 0x81, 0x83, 0x89, 0x8b, 0x86, 0x80, 0x75, 0x7a, 0x81, 0x86, + 0x85, 0x80, 0x78, 0x73, 0x72, 0x81, 0x96, 0xa4, 0xa2, 0x92, 0x7b, 0x6b, + 0x6e, 0x68, 0x61, 0x61, 0x63, 0x62, 0x5c, 0x55, 0x44, 0x13, 0x28, 0x59, + 0x7b, 0x7d, 0x5d, 0x57, 0x3f, 0x2e, 0x17, 0x06, 0x06, 0x16, 0x2d, 0x3d, + 0x41, 0x33, 0x54, 0x8c, 0x88, 0x59, 0x60, 0x96, 0x9d, 0x5f, 0x30, 0x27, + 0x15, 0x00, 0x11, 0x42, 0x57, 0x63, 0x5e, 0x4d, 0x5a, 0x8d, 0xbf, 0xd6, + 0xae, 0x9b, 0x8e, 0x95, 0xa5, 0xa1, 0x82, 0x64, 0x2b, 0x45, 0x81, 0xc1, + 0xd5, 0xbe, 0xa8, 0xa4, 0x7b, 0x8e, 0x91, 0x79, 0x66, 0x69, 0x74, 0x78, + 0x71, 0x88, 0xa2, 0x94, 0x53, 0x11, 0x0a, 0x27, 0x9b, 0xa8, 0xaf, 0xad, + 0xab, 0x9c, 0x6e, 0x3e, 0x3a, 0x37, 0x35, 0x31, 0x2a, 0x2f, 0x48, 0x62, + 0x7c, 0x6a, 0x52, 0x43, 0x40, 0x3f, 0x3d, 0x39, 0x22, 0x24, 0x27, 0x28, + 0x25, 0x1d, 0x12, 0x0a, 0xbc, 0x99, 0x65, 0x3a, 0x23, 0x1f, 0x25, 0x2a, + 0x08, 0x36, 0x5b, 0x4a, 0x1e, 0x15, 0x45, 0x7b, 0xc8, 0xc6, 0xad, 0x75, + 0x3c, 0x2b, 0x49, 0x6f, 0x35, 0x23, 0x17, 0x28, 0x48, 0x5b, 0x52, 0x41, + 0x6e, 0x6c, 0x63, 0x51, 0x3f, 0x3a, 0x44, 0x50, 0x34, 0x5a, 0x81, 0x86, + 0x6a, 0x47, 0x34, 0x31, 0x1b, 0x2a, 0x39, 0x3b, 0x37, 0x3d, 0x51, 0x65, + 0x41, 0x22, 0x30, 0x6f, 0x8d, 0x64, 0x2d, 0x15, 0xa2, 0xa1, 0xab, 0xae, + 0x92, 0x72, 0x7d, 0xa0, 0x98, 0x9b, 0x9c, 0x95, 0x84, 0x6d, 0x57, 0x4b, + 0xc4, 0xd0, 0xdd, 0xe1, 0xd3, 0xb5, 0x93, 0x7c, 0xa7, 0xb0, 0xae, 0x94, + 0x78, 0x7e, 0xa8, 0xd1, 0x9b, 0xa8, 0xa8, 0x90, 0x78, 0x82, 0xb4, 0xe4, + 0x7c, 0x44, 0x1e, 0x2b, 0x43, 0x4c, 0x59, 0x6d, 0x16, 0x3a, 0x69, 0x86, + 0x84, 0x6d, 0x52, 0x43, 0x40, 0x23, 0x29, 0x56, 0x6b, 0x5f, 0x69, 0x8a, + 0x81, 0x6c, 0x56, 0x4d, 0x51, 0x6e, 0xa8, 0xdd, 0xe9, 0xdd, 0xce, 0xc0, + 0xa6, 0x74, 0x31, 0x00, 0x4b, 0x21, 0x13, 0x52, 0xb1, 0xd7, 0xa7, 0x64, + 0x47, 0x9d, 0xff, 0xff, 0xb8, 0x5c, 0x63, 0xa1, 0xd5, 0x56, 0x1a, 0x71, + 0xd4, 0xcb, 0x7e, 0x48, 0x72, 0x7e, 0x81, 0x6c, 0x4b, 0x39, 0x3f, 0x4d, + 0xe2, 0xb6, 0x7f, 0x63, 0x6b, 0x86, 0x9b, 0xa5, 0x90, 0xa0, 0x9e, 0x73, + 0x36, 0x15, 0x21, 0x3a, 0x46, 0x44, 0x20, 0x01, 0x0d, 0x26, 0x40, 0x5c, + 0x68, 0x6d, 0x74, 0x78, 0x77, 0x70, 0x68, 0x62, 0x6b, 0x76, 0x82, 0x87, + 0x84, 0x82, 0x84, 0x88, 0x7c, 0x76, 0x71, 0x72, 0x77, 0x79, 0x73, 0x6d, + 0x6a, 0x72, 0x7f, 0x89, 0x8e, 0x8b, 0x85, 0x80, 0x69, 0x69, 0x69, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x73, 0x6c, 0x65, 0x64, 0x65, 0x64, 0x5d, 0x56, + 0x4d, 0x2d, 0x6f, 0xa5, 0x83, 0x4e, 0x40, 0x62, 0x54, 0x4e, 0x48, 0x4b, + 0x5a, 0x73, 0x8e, 0xa0, 0xa9, 0x48, 0x2a, 0x85, 0xd9, 0xd4, 0xb2, 0xac, + 0x84, 0x3f, 0x32, 0x63, 0x61, 0x2b, 0x36, 0x79, 0x60, 0x6e, 0x5b, 0x3d, + 0x5c, 0xa8, 0xc7, 0xb5, 0x90, 0x71, 0x5b, 0x69, 0x8b, 0x95, 0x78, 0x55, + 0x80, 0x40, 0x39, 0x8c, 0xcb, 0xaf, 0x6c, 0x47, 0x4f, 0x6f, 0x79, 0x6a, + 0x75, 0x9d, 0xab, 0x9b, 0x5a, 0x77, 0x8f, 0x82, 0x5e, 0x55, 0x7f, 0xb3, + 0xa4, 0xac, 0x9b, 0x7a, 0x75, 0x8e, 0x9c, 0x93, 0x4d, 0x24, 0x15, 0x32, + 0x49, 0x3f, 0x33, 0x35, 0x40, 0x3c, 0x38, 0x39, 0x3b, 0x39, 0x31, 0x29, + 0x28, 0x2b, 0x32, 0x3a, 0x3c, 0x30, 0x1a, 0x09, 0x4a, 0x48, 0x42, 0x39, + 0x33, 0x37, 0x42, 0x4c, 0x6d, 0x68, 0x62, 0x60, 0x63, 0x68, 0x6d, 0x70, + 0x63, 0x39, 0x10, 0x10, 0x32, 0x50, 0x54, 0x49, 0x34, 0x35, 0x36, 0x34, + 0x36, 0x40, 0x53, 0x61, 0x62, 0x82, 0xa5, 0xad, 0x97, 0x7a, 0x6a, 0x66, + 0x88, 0x87, 0x77, 0x54, 0x32, 0x2e, 0x4b, 0x69, 0x4e, 0x4e, 0x57, 0x6a, + 0x7a, 0x74, 0x59, 0x40, 0x0f, 0x12, 0x40, 0x80, 0x8a, 0x59, 0x36, 0x38, + 0x15, 0x63, 0xb0, 0xcc, 0xce, 0xce, 0xc1, 0xac, 0x29, 0x45, 0x6d, 0x8d, + 0xa1, 0xb2, 0xc3, 0xcf, 0x62, 0x7e, 0xab, 0xd3, 0xe8, 0xe8, 0xda, 0xcd, + 0x5c, 0x6b, 0x7f, 0x90, 0xa1, 0xb8, 0xd5, 0xea, 0xaf, 0xa9, 0x99, 0x7f, + 0x61, 0x48, 0x3b, 0x36, 0x18, 0x0b, 0x14, 0x30, 0x38, 0x30, 0x40, 0x5f, + 0x51, 0x51, 0x4b, 0x3f, 0x36, 0x39, 0x48, 0x57, 0x2c, 0x35, 0x18, 0x00, + 0x38, 0x93, 0x91, 0x4c, 0x37, 0x68, 0x59, 0x24, 0x54, 0xd7, 0xff, 0xe4, + 0xd1, 0xb3, 0x94, 0x8a, 0x8a, 0x79, 0x4f, 0x2a, 0x4c, 0x3c, 0x30, 0x38, + 0x50, 0x65, 0x6b, 0x68, 0x7e, 0xab, 0xb9, 0x8d, 0x60, 0x55, 0x55, 0x4f, + 0x9f, 0x99, 0x8f, 0x80, 0x69, 0x51, 0x42, 0x3e, 0x1b, 0x29, 0x31, 0x28, + 0x1a, 0x1e, 0x3a, 0x55, 0xd0, 0xb4, 0x93, 0x84, 0x86, 0x87, 0x7e, 0x72, + 0x81, 0x81, 0x84, 0x89, 0x87, 0x78, 0x60, 0x4c, 0x78, 0x63, 0x89, 0xeb, + 0xff, 0xc7, 0x6f, 0x53, 0x5a, 0x61, 0x6a, 0x71, 0x74, 0x70, 0x6a, 0x66, + 0x6e, 0x77, 0x82, 0x85, 0x83, 0x84, 0x89, 0x8f, 0x82, 0x7b, 0x75, 0x76, + 0x7a, 0x7b, 0x75, 0x6e, 0x69, 0x73, 0x81, 0x8e, 0x92, 0x8e, 0x85, 0x7f, + 0x76, 0x71, 0x6a, 0x65, 0x67, 0x6e, 0x77, 0x7e, 0x55, 0x4e, 0x47, 0x44, + 0x45, 0x43, 0x3b, 0x34, 0x3a, 0x41, 0x73, 0x6b, 0x43, 0x46, 0x49, 0x49, + 0x79, 0x78, 0x76, 0x73, 0x6f, 0x6b, 0x68, 0x66, 0x6c, 0x7a, 0x98, 0xb0, + 0xa2, 0x78, 0x5a, 0x55, 0x54, 0x59, 0x4b, 0x2f, 0x24, 0x2b, 0x29, 0x1b, + 0x1d, 0x65, 0x84, 0x5a, 0x42, 0x6d, 0xa3, 0xb7, 0xaf, 0x99, 0x80, 0x74, + 0x71, 0x69, 0x56, 0x44, 0x48, 0x30, 0x2f, 0x3c, 0x26, 0x0f, 0x3d, 0x8b, + 0x58, 0x93, 0xb5, 0x9f, 0x84, 0x7b, 0x67, 0x47, 0x8c, 0x8f, 0x7f, 0x5b, + 0x41, 0x4a, 0x6b, 0x86, 0x90, 0x4f, 0x43, 0x82, 0xa4, 0x89, 0x7b, 0x92, + 0xc0, 0xad, 0x73, 0x2e, 0x18, 0x2e, 0x3a, 0x2f, 0x28, 0x33, 0x40, 0x42, + 0x39, 0x2d, 0x24, 0x21, 0x3b, 0x2f, 0x26, 0x27, 0x2f, 0x30, 0x26, 0x1b, + 0x2c, 0x3a, 0x47, 0x48, 0x41, 0x42, 0x52, 0x61, 0x37, 0x3a, 0x3d, 0x3f, + 0x43, 0x4c, 0x5a, 0x65, 0x83, 0x70, 0x61, 0x6a, 0x84, 0x98, 0x97, 0x8e, + 0x90, 0xb4, 0xd1, 0xbf, 0x85, 0x4f, 0x37, 0x37, 0xa1, 0xbf, 0xda, 0xd6, + 0xba, 0xa5, 0xa8, 0xb5, 0x87, 0x8c, 0x8a, 0x78, 0x5b, 0x40, 0x31, 0x2d, + 0x6f, 0x42, 0x12, 0x06, 0x1f, 0x3f, 0x4b, 0x49, 0x38, 0x6e, 0x91, 0x8f, + 0x9c, 0xc2, 0xcf, 0xbd, 0x40, 0x7a, 0x9e, 0x9b, 0xab, 0xd4, 0xdf, 0xc9, + 0x5f, 0x70, 0x76, 0x5e, 0x3b, 0x32, 0x4e, 0x70, 0x96, 0x96, 0x94, 0x91, + 0x8c, 0x86, 0x80, 0x7d, 0x85, 0x63, 0x4a, 0x61, 0xa0, 0xdd, 0xfa, 0xfe, + 0x56, 0x42, 0x40, 0x6a, 0xa3, 0xb9, 0x9c, 0x74, 0x33, 0x40, 0x5e, 0x6d, + 0x4b, 0x1a, 0x17, 0x36, 0xa4, 0x7e, 0x48, 0x1d, 0x0f, 0x19, 0x2e, 0x3d, + 0x84, 0x61, 0x31, 0x23, 0x48, 0x6a, 0x4f, 0x19, 0x00, 0x00, 0x2f, 0x87, + 0xc4, 0xce, 0xcc, 0xd4, 0xe7, 0xa6, 0x6e, 0x76, 0xa6, 0xb3, 0x81, 0x46, + 0xad, 0x80, 0x51, 0x4b, 0x77, 0xb8, 0xed, 0xff, 0xbd, 0xcf, 0xb7, 0x7f, + 0x70, 0x7d, 0x5d, 0x1e, 0x1d, 0x53, 0x7c, 0x71, 0x4f, 0x3d, 0x39, 0x37, + 0x5a, 0x36, 0x13, 0x11, 0x33, 0x5d, 0x78, 0x82, 0x45, 0x51, 0x6b, 0x8a, + 0x98, 0x81, 0x4e, 0x23, 0x3e, 0x1c, 0x1c, 0x64, 0xc0, 0xd1, 0x83, 0x2a, + 0x2a, 0x69, 0xbd, 0xe8, 0xf1, 0xec, 0xaa, 0x45, 0x5d, 0x63, 0x6d, 0x74, + 0x76, 0x73, 0x6c, 0x68, 0x73, 0x79, 0x7e, 0x7b, 0x75, 0x73, 0x77, 0x7d, + 0x85, 0x7e, 0x77, 0x77, 0x7b, 0x7a, 0x74, 0x6d, 0x71, 0x7b, 0x88, 0x91, + 0x91, 0x87, 0x79, 0x70, 0x63, 0x6a, 0x73, 0x7a, 0x7b, 0x75, 0x6d, 0x67, + 0x6a, 0x63, 0x5b, 0x58, 0x58, 0x55, 0x4d, 0x45, 0x3e, 0x36, 0x3a, 0x24, + 0x38, 0x74, 0x6e, 0x4f, 0x52, 0x53, 0x52, 0x4d, 0x43, 0x33, 0x24, 0x1b, + 0x5e, 0xb9, 0xf1, 0xbe, 0x61, 0x38, 0x4a, 0x65, 0x66, 0x4a, 0x37, 0x37, + 0x34, 0x2e, 0x3d, 0x56, 0x2c, 0x4e, 0x5f, 0x51, 0x4c, 0x67, 0x8b, 0x9e, + 0xa6, 0x9e, 0x8f, 0x7e, 0x70, 0x6a, 0x6c, 0x70, 0x55, 0x2c, 0x1c, 0x42, + 0x71, 0x7e, 0x71, 0x66, 0x4a, 0x7b, 0x9c, 0x87, 0x5c, 0x48, 0x4c, 0x54, + 0x62, 0x6f, 0x72, 0x6e, 0x81, 0xa8, 0xbf, 0xbf, 0x7e, 0x47, 0x3a, 0x6a, + 0x88, 0x7e, 0x89, 0xae, 0xbc, 0xd6, 0xd4, 0x9b, 0x4b, 0x1d, 0x1f, 0x31, + 0x2e, 0x25, 0x19, 0x14, 0x24, 0x50, 0x87, 0xaf, 0xdb, 0xb0, 0x76, 0x4c, + 0x38, 0x2d, 0x1e, 0x11, 0x52, 0x5b, 0x5c, 0x4c, 0x3b, 0x41, 0x60, 0x7e, + 0x87, 0xae, 0xd7, 0xdf, 0xc2, 0x9d, 0x87, 0x81, 0xe1, 0xe2, 0xd6, 0xb2, + 0x7d, 0x4a, 0x2a, 0x1d, 0x50, 0x74, 0x94, 0x91, 0x73, 0x60, 0x6b, 0x7f, + 0x90, 0x8f, 0x78, 0x43, 0x0c, 0x00, 0x1e, 0x44, 0x26, 0x21, 0x20, 0x2a, + 0x39, 0x41, 0x3d, 0x36, 0x63, 0x4c, 0x2e, 0x1d, 0x21, 0x34, 0x49, 0x56, + 0x90, 0xa4, 0xa0, 0x8a, 0x94, 0xb3, 0xab, 0x85, 0x92, 0x83, 0x6d, 0x64, + 0x79, 0x9f, 0xba, 0xc2, 0xdc, 0xf5, 0xf2, 0xaf, 0x51, 0x1e, 0x31, 0x5a, + 0x56, 0x51, 0x4a, 0x46, 0x46, 0x4a, 0x51, 0x56, 0x21, 0x4e, 0x94, 0xd2, + 0xea, 0xd2, 0x9e, 0x76, 0x69, 0x49, 0x2e, 0x38, 0x66, 0x9a, 0xb9, 0xc3, + 0xb2, 0xb7, 0xc5, 0xbd, 0x80, 0x34, 0x1b, 0x2c, 0x54, 0x49, 0x46, 0x58, + 0x6c, 0x66, 0x43, 0x21, 0x69, 0x50, 0x79, 0xd5, 0xed, 0xae, 0x81, 0x89, + 0xc2, 0x94, 0xb2, 0xfe, 0xdf, 0x6a, 0x4b, 0x88, 0xf5, 0xb4, 0x73, 0x6a, + 0x90, 0xad, 0xa1, 0x86, 0xc1, 0x7b, 0x2c, 0x0d, 0x21, 0x3b, 0x3b, 0x2d, + 0x17, 0x62, 0x96, 0x70, 0x1f, 0x00, 0x1b, 0x49, 0x1a, 0x1b, 0x33, 0x57, + 0x60, 0x4b, 0x3e, 0x44, 0x44, 0x2c, 0x17, 0x1b, 0x33, 0x45, 0x43, 0x39, + 0x1a, 0x11, 0x0e, 0x1d, 0x33, 0x3b, 0x2f, 0x20, 0x28, 0x33, 0x3f, 0x40, + 0x35, 0x27, 0x1f, 0x1c, 0x11, 0x02, 0x67, 0xce, 0xaa, 0x69, 0x56, 0x45, + 0x37, 0x41, 0x51, 0x61, 0x6c, 0x71, 0x72, 0x71, 0x71, 0x76, 0x79, 0x76, + 0x71, 0x70, 0x77, 0x7e, 0x75, 0x6e, 0x67, 0x66, 0x69, 0x68, 0x61, 0x5a, + 0x5c, 0x69, 0x7d, 0x8d, 0x94, 0x8f, 0x84, 0x7c, 0x72, 0x72, 0x72, 0x71, + 0x70, 0x6f, 0x6f, 0x6e, 0x60, 0x59, 0x50, 0x4d, 0x4c, 0x49, 0x40, 0x39, + 0x2b, 0x2b, 0x3e, 0x48, 0x65, 0x77, 0x63, 0x6d, 0x52, 0x51, 0x4f, 0x51, + 0x56, 0x5e, 0x66, 0x6c, 0x59, 0x50, 0x3c, 0x3a, 0x60, 0x84, 0x72, 0x45, + 0x27, 0x0f, 0x53, 0xd7, 0xff, 0xca, 0xc2, 0xfa, 0x9f, 0x6d, 0x44, 0x42, + 0x4f, 0x57, 0x65, 0x77, 0xaa, 0x96, 0x7a, 0x62, 0x55, 0x4f, 0x4c, 0x4a, + 0x4f, 0x85, 0xaf, 0xa7, 0x8f, 0x84, 0x81, 0x7b, 0x4f, 0x2b, 0x11, 0x19, + 0x2a, 0x2c, 0x27, 0x27, 0x5d, 0x78, 0x82, 0x79, 0x87, 0xa8, 0xb1, 0xa1, + 0x90, 0x5f, 0x2c, 0x30, 0x70, 0xb7, 0xce, 0xc3, 0xac, 0x82, 0x71, 0x85, + 0x87, 0x65, 0x49, 0x48, 0x58, 0x41, 0x28, 0x25, 0x42, 0x6f, 0x99, 0xb1, + 0xa2, 0x7d, 0x50, 0x38, 0x36, 0x35, 0x28, 0x19, 0x4b, 0x51, 0x4d, 0x3e, + 0x39, 0x58, 0x98, 0xcc, 0xc2, 0x86, 0x48, 0x3b, 0x57, 0x67, 0x53, 0x35, + 0x37, 0x2c, 0x39, 0x70, 0xb2, 0xcb, 0xac, 0x82, 0x5f, 0x7f, 0xa6, 0xbc, + 0xc2, 0xca, 0xde, 0xf0, 0x90, 0xa2, 0xa8, 0x91, 0x74, 0x7b, 0xab, 0xdb, + 0x70, 0x49, 0x1f, 0x17, 0x32, 0x56, 0x6b, 0x70, 0x4f, 0x51, 0x47, 0x2d, + 0x17, 0x21, 0x49, 0x6f, 0x8c, 0x5e, 0x5c, 0x98, 0xc1, 0xaa, 0x80, 0x6e, + 0x54, 0x48, 0x6c, 0xb9, 0xe0, 0xc3, 0x9a, 0x8c, 0x2f, 0x72, 0xa6, 0x89, + 0x39, 0x0c, 0x29, 0x5c, 0x0f, 0x1d, 0x33, 0x4a, 0x5b, 0x63, 0x64, 0x63, + 0x56, 0x7a, 0x88, 0x5e, 0x23, 0x20, 0x66, 0xb1, 0x9c, 0xcc, 0xf9, 0xf4, + 0xc5, 0x9b, 0x94, 0xa0, 0x74, 0x7b, 0x9a, 0xbb, 0xb5, 0x9a, 0x9d, 0xb9, + 0x96, 0x5e, 0x22, 0x13, 0x2c, 0x43, 0x3c, 0x29, 0x48, 0x57, 0x61, 0x5a, + 0x53, 0x64, 0x8c, 0xaf, 0xba, 0xff, 0xf9, 0x84, 0x36, 0x4e, 0x6f, 0x67, + 0x73, 0x96, 0xc3, 0xd8, 0xc8, 0x9b, 0x6b, 0x4c, 0x7a, 0x9a, 0xb9, 0xba, + 0xa6, 0xa1, 0xb7, 0xd2, 0xc8, 0x71, 0x3e, 0x66, 0xa3, 0xbc, 0xce, 0xe6, + 0xbe, 0x4e, 0x15, 0x47, 0x6a, 0x40, 0x19, 0x1f, 0x6a, 0x93, 0xbf, 0xc8, + 0xa9, 0x7d, 0x5e, 0x51, 0xba, 0xbe, 0xcc, 0xe5, 0xf6, 0xec, 0xc9, 0xaa, + 0xbe, 0x96, 0x68, 0x5b, 0x79, 0xae, 0xdd, 0xf6, 0xd5, 0x81, 0x6f, 0x64, + 0x3c, 0x6e, 0xac, 0x8b, 0x4d, 0x55, 0x62, 0x6d, 0x74, 0x74, 0x71, 0x6f, + 0x6a, 0x70, 0x77, 0x79, 0x79, 0x7e, 0x8a, 0x94, 0x8f, 0x87, 0x80, 0x7f, + 0x82, 0x81, 0x79, 0x72, 0x65, 0x71, 0x82, 0x8f, 0x90, 0x87, 0x78, 0x6d, + 0x6e, 0x72, 0x77, 0x7a, 0x78, 0x72, 0x69, 0x64, 0x69, 0x61, 0x58, 0x54, + 0x54, 0x50, 0x47, 0x3f, 0x47, 0x2f, 0x1d, 0x1d, 0x4b, 0x5d, 0x4a, 0x67, + 0x64, 0x59, 0x4c, 0x48, 0x53, 0x6c, 0x89, 0x9c, 0x67, 0x6d, 0x76, 0x7d, + 0x7a, 0x63, 0x39, 0x16, 0x31, 0x4d, 0x77, 0x9e, 0xb8, 0xc1, 0xbc, 0xb4, + 0xe7, 0xb6, 0x89, 0x61, 0x22, 0x00, 0x2d, 0x85, 0x76, 0x55, 0x33, 0x2a, + 0x38, 0x44, 0x3e, 0x33, 0xc5, 0xcd, 0xa3, 0x59, 0x41, 0x60, 0x6a, 0x52, + 0x4e, 0x58, 0x76, 0x88, 0x66, 0x3a, 0x4a, 0x7d, 0x58, 0x77, 0x7a, 0x5c, + 0x54, 0x70, 0x7e, 0x72, 0x72, 0x3d, 0x24, 0x58, 0xad, 0xdd, 0xdb, 0xc9, + 0xaf, 0xad, 0xab, 0xb7, 0xcd, 0xc0, 0x74, 0x23, 0x64, 0x45, 0x2b, 0x37, + 0x61, 0x8a, 0x99, 0x97, 0xa7, 0x8f, 0x76, 0x6b, 0x67, 0x53, 0x2b, 0x09, + 0x37, 0x38, 0x3e, 0x48, 0x57, 0x6a, 0x7a, 0x84, 0xf6, 0xac, 0x5c, 0x42, + 0x57, 0x62, 0x46, 0x21, 0x25, 0x2e, 0x52, 0x78, 0x70, 0x4b, 0x47, 0x5f, + 0x6b, 0x40, 0x25, 0x47, 0x94, 0xd0, 0xd9, 0xc9, 0x2f, 0x44, 0x68, 0x90, + 0xb3, 0xcd, 0xdc, 0xe3, 0x45, 0x43, 0x42, 0x45, 0x4f, 0x5d, 0x6c, 0x75, + 0x6d, 0x56, 0x42, 0x48, 0x69, 0x8e, 0xa6, 0xae, 0xeb, 0xbd, 0x94, 0x97, + 0xaf, 0xa7, 0x70, 0x37, 0x33, 0x40, 0x49, 0x3e, 0x28, 0x1a, 0x1f, 0x2b, + 0x28, 0x55, 0x8f, 0xb2, 0xb0, 0x95, 0x77, 0x65, 0x49, 0x57, 0x36, 0x22, + 0x3d, 0x41, 0x41, 0x66, 0x62, 0x51, 0x43, 0x47, 0x55, 0x58, 0x49, 0x38, + 0x60, 0x6c, 0x70, 0x69, 0x66, 0x64, 0x55, 0x42, 0x4f, 0x86, 0xc5, 0xdc, + 0xc8, 0xab, 0x9e, 0xa0, 0x8b, 0x54, 0x48, 0x81, 0xb0, 0xa2, 0x7f, 0x6f, + 0x4f, 0x4a, 0x31, 0x28, 0x65, 0xc7, 0xf8, 0xf2, 0xc5, 0xc2, 0x9b, 0x4b, + 0x0b, 0x23, 0x8e, 0xf3, 0x60, 0x68, 0x91, 0xb8, 0xa1, 0x69, 0x5f, 0x7f, + 0x7e, 0xa0, 0xc3, 0xcb, 0xbf, 0xba, 0xca, 0xde, 0x95, 0x5d, 0x44, 0x62, + 0x7d, 0x7e, 0x8e, 0xaf, 0xd2, 0xa8, 0x7c, 0x71, 0x7e, 0x7f, 0x65, 0x48, + 0x88, 0x7c, 0x9a, 0xcd, 0xc7, 0x87, 0x5b, 0x5c, 0x6a, 0x4e, 0x69, 0xc6, + 0xff, 0xe7, 0x9d, 0x6d, 0x38, 0x60, 0x93, 0xaf, 0xa8, 0x8b, 0x6e, 0x5d, + 0x86, 0x3e, 0x58, 0x47, 0x2e, 0x85, 0xbe, 0xbb, 0xa0, 0x82, 0x68, 0x6d, + 0x86, 0x91, 0x80, 0x69, 0x75, 0x7b, 0x85, 0x8d, 0x92, 0x91, 0x8f, 0x8c, + 0x79, 0x81, 0x89, 0x8a, 0x81, 0x71, 0x62, 0x59, 0x6d, 0x77, 0x83, 0x86, + 0x81, 0x7c, 0x7b, 0x7c, 0x72, 0x6c, 0x62, 0x5b, 0x5b, 0x62, 0x6b, 0x72, + 0x6e, 0x66, 0x5c, 0x57, 0x54, 0x4f, 0x45, 0x3d, 0x31, 0x8f, 0xd3, 0xe1, + 0xeb, 0xe3, 0xa8, 0x68, 0x2f, 0x5d, 0x94, 0xb6, 0xc2, 0xcb, 0xd9, 0xe4, + 0x5d, 0x55, 0x58, 0x4f, 0x22, 0x05, 0x3d, 0x94, 0xe4, 0xca, 0xb2, 0xb5, + 0xc6, 0xc8, 0xb1, 0x97, 0xe3, 0x7b, 0x59, 0x9e, 0xb1, 0x5f, 0x20, 0x25, + 0x4a, 0x6d, 0x76, 0x59, 0x44, 0x41, 0x2e, 0x0e, 0xaa, 0xe6, 0xf0, 0xa9, + 0x68, 0x5c, 0x5c, 0x4d, 0x5b, 0x62, 0x6c, 0x73, 0x70, 0x62, 0x4d, 0x3e, + 0x54, 0x59, 0x5e, 0x5e, 0x5c, 0x5b, 0x5d, 0x60, 0x7f, 0x59, 0x46, 0x80, + 0xc8, 0xc4, 0xae, 0xc0, 0x8e, 0x92, 0xb4, 0xc0, 0xb2, 0xba, 0xa2, 0x58, + 0x35, 0x5c, 0x5f, 0x40, 0x4c, 0x8d, 0xb5, 0xaf, 0x97, 0xa5, 0x92, 0x76, + 0x65, 0x3c, 0x16, 0x16, 0x2e, 0x33, 0x3c, 0x49, 0x5b, 0x6d, 0x7d, 0x87, + 0x48, 0x31, 0x24, 0x35, 0x54, 0x5b, 0x3f, 0x1e, 0x37, 0x2b, 0x31, 0x3d, + 0x2d, 0x12, 0x1f, 0x46, 0x30, 0x3c, 0x4f, 0x60, 0x62, 0x4f, 0x31, 0x19, + 0x1d, 0x27, 0x39, 0x4e, 0x61, 0x6f, 0x78, 0x7c, 0x69, 0x60, 0x52, 0x45, + 0x3c, 0x3a, 0x3d, 0x3f, 0x29, 0x36, 0x58, 0x8b, 0xbb, 0xd0, 0xc7, 0xb7, + 0xe5, 0xb9, 0x85, 0x69, 0x5e, 0x45, 0x15, 0x00, 0x1e, 0x58, 0x8f, 0x8c, + 0x5f, 0x42, 0x54, 0x74, 0xda, 0xbb, 0x9b, 0x8f, 0x8c, 0x75, 0x44, 0x1a, + 0x3d, 0x4d, 0x2f, 0x1d, 0x36, 0x32, 0x29, 0x47, 0x30, 0x3e, 0x3e, 0x1f, + 0x00, 0x07, 0x40, 0x78, 0xac, 0xd1, 0xf8, 0xf5, 0xc6, 0x9e, 0xa6, 0xc7, + 0xe8, 0xe2, 0xd8, 0xc9, 0xb1, 0x8d, 0x65, 0x4b, 0x07, 0x5b, 0xb3, 0xd1, + 0xba, 0x9c, 0x8e, 0x8c, 0x10, 0x24, 0x51, 0x85, 0x9a, 0x85, 0x5c, 0x41, + 0x5a, 0x55, 0x69, 0xa0, 0xd0, 0xc0, 0x72, 0x27, 0x06, 0x79, 0xca, 0xac, + 0x6e, 0x65, 0x7f, 0x90, 0xc9, 0xbf, 0xa1, 0x74, 0x4f, 0x4e, 0x71, 0x94, + 0x4e, 0x62, 0x5c, 0x49, 0x63, 0x9c, 0xad, 0x96, 0x6c, 0x89, 0x9b, 0x83, + 0x59, 0x4e, 0x70, 0x9a, 0x93, 0x8e, 0xb5, 0xf5, 0xf9, 0xb2, 0x68, 0x49, + 0x94, 0xab, 0x90, 0x54, 0x4e, 0x6e, 0x55, 0x12, 0x31, 0x68, 0xaa, 0xc9, + 0xbb, 0x98, 0x7c, 0x71, 0x37, 0x24, 0x31, 0x20, 0x1c, 0x22, 0x18, 0x40, + 0x74, 0x6c, 0x61, 0x59, 0x57, 0x55, 0x52, 0x4f, 0x69, 0x6e, 0x75, 0x7b, + 0x7e, 0x7d, 0x7a, 0x77, 0x85, 0x73, 0x63, 0x64, 0x72, 0x7a, 0x74, 0x69, + 0x75, 0x7b, 0x82, 0x80, 0x79, 0x73, 0x73, 0x76, 0x89, 0x83, 0x7a, 0x71, + 0x6c, 0x6c, 0x6f, 0x71, 0x77, 0x6e, 0x65, 0x60, 0x5e, 0x59, 0x50, 0x47, + 0x30, 0x57, 0xa4, 0xc6, 0xc0, 0xd5, 0xc4, 0x73, 0x4a, 0x49, 0x2e, 0x1b, + 0x44, 0x8a, 0x96, 0x73, 0xa8, 0x64, 0x41, 0x6d, 0xa8, 0xbd, 0xbf, 0xc6, + 0xb2, 0xa6, 0x9b, 0x9a, 0x9f, 0x9e, 0x93, 0x87, 0x48, 0x12, 0x00, 0x48, + 0xb8, 0xf7, 0xeb, 0xc9, 0x75, 0x85, 0x73, 0x41, 0x2e, 0x47, 0x5d, 0x5b, + 0xcf, 0xdb, 0xc2, 0x90, 0x81, 0x93, 0x88, 0x64, 0x43, 0x3a, 0x32, 0x31, + 0x33, 0x30, 0x25, 0x1a, 0x3a, 0x6c, 0x98, 0x92, 0x6d, 0x61, 0x83, 0xae, + 0xc2, 0xa4, 0x73, 0x6d, 0x8d, 0x88, 0x73, 0x79, 0x6d, 0x70, 0x99, 0xb8, + 0xb7, 0xbc, 0xa9, 0x73, 0x3c, 0x4c, 0x51, 0x42, 0x36, 0x46, 0x6d, 0x8e, + 0x99, 0xac, 0xa0, 0x8a, 0x76, 0x43, 0x0f, 0x05, 0x19, 0x25, 0x3a, 0x55, + 0x72, 0x8c, 0x9f, 0xaa, 0xa7, 0x94, 0x78, 0x5f, 0x4e, 0x46, 0x43, 0x41, + 0x24, 0x3b, 0x73, 0xa6, 0x9c, 0x67, 0x4c, 0x55, 0x12, 0x4d, 0x8b, 0x98, + 0x73, 0x4a, 0x3b, 0x40, 0x4a, 0x4f, 0x55, 0x57, 0x52, 0x45, 0x37, 0x2e, + 0x40, 0x3f, 0x40, 0x46, 0x52, 0x63, 0x74, 0x7e, 0x8b, 0x79, 0x66, 0x61, + 0x66, 0x62, 0x51, 0x3f, 0x00, 0x05, 0x4f, 0x99, 0xcb, 0xd9, 0xcd, 0xbe, + 0x62, 0x85, 0x9d, 0x89, 0x5e, 0x51, 0x74, 0x9f, 0x9b, 0xb3, 0xc1, 0xa8, + 0x74, 0x49, 0x3e, 0x44, 0x60, 0xab, 0xb9, 0x87, 0x52, 0x28, 0x43, 0x97, + 0x95, 0xa6, 0xb4, 0xad, 0x97, 0x85, 0x84, 0x8a, 0xc1, 0xa2, 0x9e, 0xb4, + 0xab, 0x8c, 0x99, 0xc6, 0xcc, 0xd6, 0xc9, 0x93, 0x53, 0x3e, 0x5f, 0x89, + 0x98, 0x7f, 0x4a, 0x2e, 0x5b, 0x99, 0x89, 0x4a, 0x72, 0x6d, 0x8b, 0xb2, + 0x98, 0x4c, 0x24, 0x2d, 0x23, 0x50, 0x6f, 0x50, 0x10, 0x00, 0x0a, 0x35, + 0x79, 0xa5, 0xa9, 0x73, 0x4d, 0x55, 0x5c, 0x4f, 0x44, 0x44, 0x3f, 0x33, + 0x2f, 0x42, 0x69, 0x89, 0x7d, 0x53, 0x1b, 0x21, 0x8b, 0xff, 0xff, 0xd9, + 0xb9, 0xbb, 0xb1, 0x92, 0x6e, 0x5c, 0x63, 0x72, 0xab, 0x6d, 0x3b, 0x3c, + 0x58, 0x78, 0xa6, 0xd0, 0xda, 0xc4, 0xa6, 0x83, 0x5e, 0x4c, 0x5d, 0x7b, + 0x87, 0xa5, 0xc9, 0xd9, 0xd4, 0xca, 0xc9, 0xcd, 0xf4, 0xbc, 0x6f, 0x29, + 0x68, 0xdc, 0xad, 0x33, 0x41, 0x52, 0x66, 0x70, 0x6c, 0x63, 0x5d, 0x5c, + 0x76, 0x78, 0x7c, 0x7f, 0x7f, 0x7d, 0x7a, 0x77, 0x98, 0x88, 0x78, 0x77, + 0x81, 0x82, 0x75, 0x66, 0x78, 0x7e, 0x83, 0x81, 0x79, 0x73, 0x72, 0x75, + 0x70, 0x70, 0x71, 0x72, 0x74, 0x76, 0x78, 0x79, 0x6e, 0x66, 0x5d, 0x59, + 0x57, 0x53, 0x4a, 0x42, 0x3d, 0x39, 0x81, 0xb3, 0x77, 0x4b, 0x86, 0xcd, + 0xac, 0x9a, 0x51, 0x0b, 0x22, 0x6c, 0x6a, 0x2b, 0x43, 0x0c, 0x00, 0x2a, + 0x7e, 0xb8, 0xd7, 0xe8, 0xbe, 0xc2, 0xbf, 0xae, 0x95, 0x84, 0x81, 0x85, + 0x95, 0x98, 0x6e, 0x42, 0x6d, 0xbf, 0xb8, 0x6f, 0x2b, 0x80, 0xcd, 0xdd, + 0xcc, 0xb0, 0x7d, 0x49, 0x6b, 0x8b, 0x9e, 0x99, 0x94, 0x89, 0x60, 0x2e, + 0x6b, 0x65, 0x51, 0x32, 0x22, 0x38, 0x6e, 0x9d, 0x90, 0x9b, 0x9c, 0x87, + 0x6c, 0x69, 0x84, 0xa1, 0x9f, 0x94, 0x61, 0x3e, 0x51, 0x65, 0x6b, 0x7b, + 0x8c, 0x71, 0x76, 0x86, 0x82, 0x84, 0x8a, 0x80, 0x2f, 0x2a, 0x39, 0x4a, + 0x37, 0x26, 0x52, 0x99, 0xb7, 0xc7, 0xb9, 0xa4, 0x93, 0x5f, 0x24, 0x15, + 0x55, 0x5f, 0x70, 0x81, 0x90, 0x99, 0x9d, 0x9e, 0x3b, 0x48, 0x50, 0x4d, + 0x4d, 0x66, 0x96, 0xbe, 0xce, 0xc8, 0xd2, 0xd7, 0xae, 0x6d, 0x54, 0x62, + 0x2c, 0x53, 0x74, 0x6a, 0x43, 0x30, 0x45, 0x64, 0xc1, 0xa6, 0x7a, 0x51, + 0x38, 0x32, 0x3a, 0x42, 0x54, 0x4f, 0x47, 0x41, 0x42, 0x48, 0x50, 0x56, + 0x87, 0x7e, 0x77, 0x78, 0x75, 0x5d, 0x34, 0x13, 0x5a, 0x78, 0x99, 0xa8, + 0xa9, 0xb0, 0xc7, 0xdd, 0xa3, 0x9f, 0x99, 0x96, 0x98, 0x9d, 0xa3, 0xa8, + 0x5b, 0x59, 0x5c, 0x6a, 0x76, 0x75, 0x64, 0x53, 0x7b, 0xa9, 0xbb, 0xcf, + 0xed, 0xc5, 0x83, 0x77, 0xa9, 0xb4, 0xc4, 0xd2, 0xdc, 0xe3, 0xea, 0xee, + 0xe7, 0x87, 0x48, 0x52, 0x51, 0x3b, 0x5c, 0xa2, 0x7e, 0xa3, 0xaf, 0x78, + 0x26, 0x08, 0x36, 0x73, 0x91, 0xce, 0xe1, 0x9b, 0x4b, 0x47, 0x81, 0xb7, + 0x75, 0x83, 0xa4, 0xb6, 0x99, 0x69, 0x5f, 0x75, 0x99, 0x9b, 0x95, 0x85, + 0x7e, 0x97, 0xca, 0xf5, 0xe0, 0xbb, 0xb0, 0xc0, 0xaa, 0x6b, 0x45, 0x48, + 0x2d, 0x2e, 0x31, 0x3a, 0x4f, 0x73, 0x9d, 0xb9, 0x69, 0x7d, 0xb2, 0xdd, + 0xc4, 0x8b, 0x86, 0xac, 0x9e, 0x7e, 0x5b, 0x50, 0x57, 0x58, 0x47, 0x33, + 0x6d, 0x59, 0x43, 0x39, 0x42, 0x67, 0xa5, 0xd9, 0xe1, 0xbf, 0xbd, 0xd2, + 0xb9, 0x82, 0x80, 0xab, 0x96, 0x71, 0x4c, 0x48, 0x67, 0x8d, 0xa1, 0xa6, + 0xdd, 0xf2, 0xff, 0xdb, 0xaf, 0xb5, 0xae, 0x8d, 0x76, 0x72, 0x6d, 0x6a, + 0x6c, 0x72, 0x79, 0x7d, 0x74, 0x74, 0x74, 0x74, 0x73, 0x70, 0x6e, 0x6d, + 0x81, 0x80, 0x7b, 0x73, 0x69, 0x61, 0x5c, 0x5b, 0x5d, 0x6a, 0x78, 0x7d, + 0x79, 0x71, 0x6c, 0x6c, 0x73, 0x74, 0x74, 0x74, 0x71, 0x6c, 0x68, 0x64, + 0x68, 0x60, 0x58, 0x54, 0x54, 0x50, 0x47, 0x40, 0x43, 0x3d, 0x27, 0x3a, + 0x52, 0x1f, 0x04, 0x3b, 0x7a, 0x83, 0x75, 0x5c, 0x67, 0x8c, 0x93, 0x7d, + 0xaf, 0xc7, 0xc8, 0x92, 0x47, 0x3b, 0x89, 0xe2, 0xc3, 0xd1, 0xd2, 0xb2, + 0x81, 0x62, 0x62, 0x70, 0xa4, 0xdf, 0xd1, 0x6d, 0x35, 0x4d, 0x53, 0x2f, + 0x6e, 0xa4, 0xc1, 0xaa, 0x98, 0xab, 0xc0, 0xc2, 0x0e, 0x4b, 0x81, 0x7d, + 0x4f, 0x26, 0x15, 0x12, 0x5d, 0x67, 0x72, 0x77, 0x72, 0x6b, 0x66, 0x65, + 0x96, 0x95, 0x8e, 0x80, 0x6f, 0x64, 0x63, 0x66, 0x7d, 0x75, 0x4a, 0x2a, + 0x31, 0x39, 0x49, 0x6e, 0x96, 0x72, 0x63, 0x6a, 0x61, 0x53, 0x5c, 0x6e, + 0x64, 0x4f, 0x51, 0x5e, 0x4b, 0x2e, 0x47, 0x7e, 0xa1, 0xad, 0x9d, 0x8c, + 0x84, 0x56, 0x1d, 0x0c, 0xaf, 0xb3, 0xb9, 0xb8, 0xae, 0x9d, 0x8a, 0x7e, + 0x4f, 0x78, 0xa1, 0xa3, 0x86, 0x6c, 0x6e, 0x7b, 0x76, 0x85, 0xb0, 0xd0, + 0xb0, 0x65, 0x38, 0x37, 0x22, 0x2f, 0x42, 0x55, 0x70, 0x97, 0xc4, 0xe4, + 0xb9, 0xa4, 0x82, 0x5c, 0x3d, 0x29, 0x20, 0x1d, 0x4b, 0x43, 0x39, 0x2f, + 0x2b, 0x2d, 0x32, 0x36, 0x60, 0x4d, 0x39, 0x34, 0x3a, 0x38, 0x29, 0x19, + 0x4a, 0x5d, 0x68, 0x5e, 0x52, 0x65, 0x98, 0xc7, 0xa2, 0xb4, 0xd1, 0xef, + 0xf9, 0xe5, 0xbd, 0x9e, 0x77, 0x5b, 0x39, 0x29, 0x30, 0x41, 0x4d, 0x52, + 0x5c, 0x94, 0x96, 0x6f, 0x49, 0x09, 0x00, 0x07, 0x36, 0x72, 0xaf, 0xb7, + 0x92, 0x74, 0x79, 0x8e, 0x76, 0x48, 0x39, 0x44, 0x29, 0x15, 0x65, 0xdd, + 0xb8, 0xd4, 0xf2, 0xf2, 0xca, 0x89, 0x48, 0x22, 0x51, 0x42, 0x46, 0x5b, + 0x5b, 0x45, 0x41, 0x50, 0x48, 0x69, 0x72, 0x57, 0x4c, 0x6b, 0x91, 0xa2, + 0x89, 0x6c, 0x63, 0x90, 0xd8, 0xfe, 0xea, 0xc6, 0xd3, 0xa0, 0x69, 0x3a, + 0x0a, 0x0a, 0x6a, 0xdd, 0xd0, 0xa5, 0x6c, 0x46, 0x49, 0x6f, 0xa0, 0xc0, + 0x92, 0xaa, 0xdd, 0xf8, 0xc7, 0x7e, 0x76, 0xa0, 0xbd, 0xa7, 0x88, 0x6f, + 0x61, 0x55, 0x48, 0x3d, 0x3f, 0x5f, 0x6b, 0x4a, 0x1f, 0x1a, 0x3d, 0x60, + 0xc9, 0xdc, 0xc0, 0x7f, 0x62, 0x62, 0x36, 0x00, 0xa7, 0x5b, 0x16, 0x1e, + 0x61, 0x92, 0x87, 0x63, 0x1e, 0x82, 0x6f, 0x2b, 0x4a, 0x78, 0x5c, 0x27, + 0x5f, 0x61, 0x64, 0x65, 0x67, 0x6d, 0x76, 0x7e, 0x7d, 0x7c, 0x7a, 0x77, + 0x76, 0x76, 0x76, 0x76, 0x79, 0x71, 0x63, 0x57, 0x53, 0x5b, 0x69, 0x74, + 0x55, 0x6a, 0x86, 0x98, 0x9c, 0x96, 0x90, 0x8d, 0x79, 0x7a, 0x7a, 0x7a, + 0x77, 0x72, 0x6e, 0x6b, 0x70, 0x69, 0x61, 0x5e, 0x5e, 0x5b, 0x53, 0x4c, + 0x1b, 0x3c, 0x24, 0x3f, 0x8f, 0x69, 0x33, 0x6d, 0x2f, 0x1d, 0x26, 0x47, + 0x51, 0x42, 0x48, 0x63, 0xe0, 0x9e, 0x5e, 0x63, 0xa1, 0xc8, 0xa8, 0x70, + 0x73, 0x86, 0x90, 0x7c, 0x58, 0x45, 0x4f, 0x61, 0x4d, 0x7e, 0x9a, 0x7d, + 0x50, 0x40, 0x48, 0x50, 0x14, 0x75, 0xcb, 0xd6, 0xbf, 0xb1, 0xa1, 0x8c, + 0x79, 0x82, 0x80, 0x60, 0x2e, 0x18, 0x3a, 0x69, 0x94, 0x80, 0x77, 0x8c, + 0xa5, 0x99, 0x62, 0x2d, 0x3b, 0x68, 0x96, 0x9a, 0x7b, 0x5f, 0x60, 0x6d, + 0x55, 0x47, 0x32, 0x39, 0x45, 0x37, 0x47, 0x84, 0x6f, 0x6b, 0x73, 0x87, + 0x82, 0x5d, 0x49, 0x56, 0x77, 0x67, 0x5b, 0x5c, 0x5d, 0x5b, 0x60, 0x6b, + 0x80, 0x94, 0x94, 0x95, 0x99, 0x6a, 0x24, 0x07, 0x88, 0x99, 0xb1, 0xc7, + 0xd1, 0xce, 0xc3, 0xbb, 0xb4, 0xd2, 0xed, 0xeb, 0xd1, 0xbd, 0xc0, 0xcc, + 0xce, 0xa3, 0x78, 0x56, 0x27, 0x03, 0x16, 0x44, 0x54, 0x4d, 0x4f, 0x62, + 0x7d, 0x8b, 0x84, 0x77, 0xb1, 0x93, 0x64, 0x3a, 0x25, 0x26, 0x36, 0x44, + 0x1e, 0x23, 0x2e, 0x42, 0x5d, 0x7c, 0x98, 0xa8, 0xdf, 0xae, 0x6f, 0x45, + 0x3b, 0x42, 0x48, 0x4a, 0x09, 0x21, 0x39, 0x3f, 0x3e, 0x4f, 0x76, 0x98, + 0xc9, 0xdd, 0xe9, 0xd6, 0xa8, 0x7d, 0x66, 0x61, 0x57, 0x67, 0x6d, 0x56, + 0x34, 0x29, 0x40, 0x5c, 0xa2, 0x99, 0x6f, 0x78, 0xba, 0xbf, 0x91, 0x85, + 0x7d, 0x9e, 0xc7, 0xda, 0xc2, 0x88, 0x46, 0x1b, 0x32, 0x23, 0x32, 0x52, + 0x4e, 0x3b, 0x5a, 0x98, 0xff, 0xe0, 0x84, 0x2d, 0x00, 0x03, 0x2a, 0x4d, + 0x8e, 0x63, 0x4c, 0x53, 0x45, 0x31, 0x4f, 0x8a, 0x8a, 0x9b, 0x7e, 0x3c, + 0x28, 0x4f, 0x6a, 0x62, 0x30, 0x49, 0x67, 0x78, 0x7c, 0x80, 0x8a, 0x95, + 0xa1, 0xcf, 0xe1, 0xc5, 0xb7, 0xc3, 0xb6, 0x94, 0x77, 0x5b, 0x3e, 0x3c, + 0x58, 0x81, 0xa0, 0xae, 0xa3, 0x87, 0x4f, 0x30, 0x62, 0xb1, 0xbf, 0x99, + 0xe3, 0xa4, 0x62, 0x4e, 0x5b, 0x54, 0x24, 0x00, 0x1a, 0x84, 0xeb, 0xff, + 0xd7, 0x9b, 0x5d, 0x2f, 0x45, 0x36, 0x1f, 0x16, 0x31, 0x5a, 0x70, 0x6f, + 0xea, 0xb7, 0x97, 0xbb, 0xfc, 0xff, 0xc1, 0x73, 0x27, 0xcf, 0xff, 0xb0, + 0x6a, 0x77, 0x7c, 0x35, 0x16, 0x3a, 0x64, 0x78, 0x74, 0x6b, 0x6d, 0x75, + 0x8a, 0x87, 0x84, 0x82, 0x82, 0x85, 0x89, 0x8b, 0x89, 0x76, 0x64, 0x63, + 0x6e, 0x73, 0x6a, 0x5d, 0x65, 0x74, 0x83, 0x86, 0x7a, 0x67, 0x57, 0x4e, + 0x6c, 0x6d, 0x6d, 0x6e, 0x70, 0x73, 0x75, 0x76, 0x6b, 0x64, 0x5c, 0x5a, + 0x5b, 0x58, 0x51, 0x4a, 0x4b, 0x57, 0x41, 0x3d, 0x4c, 0x3d, 0x6b, 0xe3, + 0x95, 0x4a, 0x2c, 0x52, 0x5f, 0x42, 0x49, 0x78, 0x44, 0x7d, 0x9c, 0x77, + 0x3c, 0x1e, 0x1a, 0x19, 0x39, 0x48, 0x59, 0x61, 0x64, 0x6c, 0x7d, 0x8c, + 0x6c, 0x53, 0x54, 0x73, 0x76, 0x4f, 0x2e, 0x28, 0x44, 0x9a, 0xdb, 0xd0, + 0xb0, 0xb1, 0xc2, 0xc8, 0x97, 0x72, 0x59, 0x59, 0x50, 0x3c, 0x3b, 0x4d, + 0x9d, 0xa2, 0xa3, 0x9d, 0x98, 0xa1, 0xb7, 0xcb, 0x85, 0x78, 0x6b, 0x69, + 0x70, 0x77, 0x78, 0x75, 0x6e, 0x58, 0x44, 0x52, 0x59, 0x34, 0x33, 0x6b, + 0x86, 0x95, 0x94, 0x90, 0x87, 0x60, 0x44, 0x4f, 0x52, 0x51, 0x48, 0x45, + 0x5b, 0x78, 0x7a, 0x69, 0x74, 0x90, 0x9f, 0xb2, 0xbe, 0x89, 0x33, 0x08, + 0x43, 0x5f, 0x8c, 0xba, 0xdb, 0xeb, 0xec, 0xea, 0xd8, 0xd8, 0xd0, 0xbd, + 0xa9, 0xa0, 0xa7, 0xb1, 0x5d, 0x5e, 0x76, 0x8f, 0x7e, 0x55, 0x4f, 0x68, + 0x52, 0x57, 0x68, 0x87, 0xa3, 0xa9, 0x96, 0x81, 0x0f, 0x38, 0x71, 0x98, + 0x93, 0x63, 0x22, 0x00, 0x51, 0x52, 0x57, 0x62, 0x74, 0x8a, 0x9f, 0xac, + 0x6f, 0x67, 0x62, 0x67, 0x6a, 0x5a, 0x38, 0x1b, 0x53, 0x4b, 0x3d, 0x33, + 0x3c, 0x61, 0x96, 0xbd, 0xe3, 0xcb, 0x9a, 0x5b, 0x26, 0x11, 0x1d, 0x30, + 0x49, 0x45, 0x53, 0x7c, 0xa9, 0xb6, 0x9c, 0x7b, 0x83, 0xd3, 0xfe, 0xff, + 0xf7, 0xb9, 0x85, 0x92, 0xd9, 0xa6, 0x80, 0x96, 0xce, 0xe3, 0xbd, 0x8a, + 0xa0, 0x8e, 0x85, 0x8b, 0x84, 0x64, 0x3d, 0x27, 0x0d, 0x1b, 0x2c, 0x3a, + 0x4e, 0x73, 0xa5, 0xcb, 0xa6, 0x97, 0x8a, 0x83, 0x79, 0x6f, 0x6e, 0x74, + 0x82, 0x8f, 0x99, 0x9b, 0x92, 0x76, 0x45, 0x19, 0x10, 0x0e, 0x1a, 0x40, + 0x6f, 0x87, 0x81, 0x72, 0xb4, 0xb9, 0xaa, 0xa2, 0xc5, 0xe4, 0xba, 0x6f, + 0x0a, 0x0c, 0x23, 0x57, 0x94, 0xbd, 0xc3, 0xba, 0xc0, 0xf1, 0xf8, 0xc1, + 0x9c, 0xb0, 0xcf, 0xd5, 0xe2, 0x9a, 0x5c, 0x6b, 0xab, 0xc7, 0x9a, 0x5e, + 0x73, 0xa2, 0xc0, 0xc1, 0xcb, 0xd6, 0xb7, 0x83, 0x96, 0x55, 0x31, 0x38, + 0x28, 0x14, 0x4c, 0xa7, 0xbb, 0xbb, 0xcb, 0xec, 0xff, 0xde, 0x8f, 0x4d, + 0x4a, 0x1a, 0x52, 0xbb, 0x76, 0x15, 0x2c, 0x29, 0x37, 0x4a, 0x60, 0x68, + 0x65, 0x64, 0x6d, 0x77, 0x78, 0x75, 0x72, 0x71, 0x74, 0x7a, 0x81, 0x86, + 0x7c, 0x72, 0x6d, 0x72, 0x78, 0x6e, 0x53, 0x3a, 0x53, 0x5f, 0x6d, 0x74, + 0x75, 0x74, 0x77, 0x7b, 0x81, 0x7b, 0x72, 0x69, 0x64, 0x64, 0x67, 0x69, + 0x62, 0x5b, 0x54, 0x52, 0x54, 0x52, 0x4b, 0x44, 0x76, 0x7c, 0x69, 0x51, + 0x4e, 0x48, 0x30, 0x1f, 0x49, 0x21, 0x12, 0x25, 0x2f, 0x37, 0x6d, 0xb3, + 0x9c, 0xd4, 0xe2, 0xa1, 0x57, 0x3a, 0x36, 0x30, 0x46, 0x43, 0x47, 0x5a, + 0x75, 0x88, 0x8c, 0x89, 0x7e, 0x51, 0x3f, 0x5d, 0x73, 0x62, 0x49, 0x42, + 0x5b, 0xaa, 0xdc, 0xbf, 0x96, 0x9f, 0xc4, 0xdb, 0xcd, 0xbc, 0xcf, 0xfb, + 0xfc, 0xcc, 0xac, 0xb1, 0x46, 0x74, 0xa2, 0xa6, 0x8e, 0x88, 0xa8, 0xcd, + 0xce, 0x82, 0x3a, 0x3c, 0x75, 0x99, 0x83, 0x5a, 0x4e, 0x44, 0x31, 0x3b, + 0x53, 0x49, 0x49, 0x6e, 0x97, 0xb2, 0x9c, 0x75, 0x6a, 0x54, 0x42, 0x50, + 0x45, 0x4c, 0x48, 0x40, 0x4a, 0x5f, 0x62, 0x55, 0x6e, 0x7d, 0x7c, 0x85, + 0x93, 0x67, 0x1a, 0x00, 0x5a, 0x72, 0x96, 0xb7, 0xc9, 0xc9, 0xbe, 0xb3, + 0xad, 0xb5, 0xbd, 0xba, 0xa3, 0x7b, 0x4f, 0x33, 0x3d, 0x53, 0x8a, 0xbc, + 0xb2, 0x7e, 0x64, 0x6e, 0x2b, 0x31, 0x3d, 0x48, 0x4e, 0x4b, 0x41, 0x38, + 0x2c, 0x23, 0x17, 0x11, 0x19, 0x2b, 0x41, 0x50, 0x61, 0x5b, 0x52, 0x4c, + 0x4b, 0x50, 0x57, 0x5c, 0x61, 0x56, 0x4f, 0x56, 0x61, 0x5e, 0x49, 0x34, + 0x21, 0x31, 0x4e, 0x71, 0x92, 0xaa, 0xb8, 0xbe, 0xac, 0x7a, 0x40, 0x26, + 0x30, 0x41, 0x43, 0x3c, 0x3c, 0x55, 0x78, 0x97, 0xb2, 0xd0, 0xf3, 0xff, + 0xcd, 0xea, 0xc9, 0x8d, 0x68, 0x3b, 0x2d, 0x58, 0x65, 0x50, 0x42, 0x55, + 0x79, 0x8a, 0x7c, 0x66, 0x67, 0x8e, 0xa6, 0x92, 0x6e, 0x5f, 0x65, 0x6d, + 0x4f, 0x41, 0x4b, 0x84, 0xca, 0xe2, 0xbe, 0x8f, 0x67, 0x6f, 0x65, 0x5d, + 0x7e, 0xa7, 0x93, 0x5e, 0x50, 0x32, 0x3f, 0x7f, 0xa6, 0x97, 0x83, 0x85, + 0xd4, 0x96, 0x50, 0x39, 0x59, 0x89, 0xa8, 0xb2, 0x6b, 0x52, 0x56, 0x78, + 0x83, 0x83, 0xac, 0xe8, 0xb7, 0x9c, 0x87, 0x92, 0xb8, 0xd6, 0xdb, 0xd3, + 0x99, 0x8a, 0x8b, 0x8f, 0x6f, 0x55, 0x80, 0xcb, 0xbe, 0xb6, 0xaa, 0x9e, + 0x97, 0x98, 0x9e, 0xa2, 0xc3, 0xd3, 0xd5, 0xdc, 0xff, 0xff, 0xca, 0x63, + 0x56, 0x80, 0x7b, 0x37, 0x0e, 0x39, 0x89, 0xbb, 0x74, 0x92, 0xb3, 0xba, + 0x9f, 0x6e, 0x3f, 0x24, 0x24, 0x14, 0x1a, 0x60, 0x61, 0x41, 0x57, 0x40, + 0x34, 0x37, 0x43, 0x5a, 0x73, 0x7f, 0x7c, 0x74, 0x7a, 0x78, 0x75, 0x74, + 0x79, 0x82, 0x8b, 0x91, 0x7c, 0x7e, 0x80, 0x7e, 0x79, 0x74, 0x71, 0x71, + 0x71, 0x75, 0x76, 0x74, 0x72, 0x77, 0x83, 0x8d, 0x89, 0x82, 0x79, 0x72, + 0x72, 0x78, 0x82, 0x89, 0x6b, 0x64, 0x5d, 0x5c, 0x5d, 0x5c, 0x55, 0x4e, + 0x4e, 0x4e, 0x44, 0x39, 0x29, 0x1c, 0x39, 0x70, 0x3f, 0x66, 0x7f, 0x68, + 0x41, 0x4f, 0xa5, 0xfb, 0xfd, 0xd6, 0x8d, 0x59, 0x6f, 0x9c, 0x89, 0x4f, + 0x56, 0x3f, 0x2f, 0x3a, 0x54, 0x5f, 0x4e, 0x38, 0x7a, 0x6f, 0x62, 0x57, + 0x52, 0x56, 0x66, 0x77, 0x24, 0x75, 0xa6, 0x85, 0x55, 0x5b, 0x83, 0x9d, + 0xa4, 0xaf, 0xd9, 0xfb, 0xdc, 0xa8, 0xb9, 0xf5, 0xa4, 0x82, 0x63, 0x65, + 0x7d, 0x89, 0x78, 0x61, 0x5e, 0x49, 0x45, 0x6a, 0x9c, 0xa7, 0x7f, 0x50, + 0x5b, 0x58, 0x33, 0x1c, 0x2f, 0x34, 0x2c, 0x36, 0x58, 0x8f, 0x8a, 0x68, + 0x69, 0x5f, 0x48, 0x4c, 0x1e, 0x2b, 0x3a, 0x42, 0x4a, 0x58, 0x6b, 0x78, + 0x93, 0x8b, 0x6a, 0x5c, 0x69, 0x4f, 0x1a, 0x05, 0xed, 0xed, 0xcb, 0x97, + 0x8d, 0xad, 0xc0, 0xb8, 0xcc, 0xc1, 0xaf, 0x9c, 0x89, 0x73, 0x5f, 0x52, + 0x9d, 0x8a, 0x6b, 0x4b, 0x35, 0x2b, 0x2b, 0x2d, 0x14, 0x3c, 0x4d, 0x32, + 0x1c, 0x23, 0x2d, 0x2a, 0x2a, 0x10, 0x0e, 0x23, 0x26, 0x27, 0x59, 0x9d, + 0x3f, 0x3f, 0x6c, 0x9e, 0x82, 0x3d, 0x3c, 0x72, 0x56, 0x5e, 0x54, 0x2d, + 0x03, 0x00, 0x29, 0x54, 0x4c, 0x33, 0x38, 0x7e, 0xda, 0xff, 0xd6, 0x9b, + 0x35, 0x2f, 0x4c, 0x80, 0x8c, 0x63, 0x3f, 0x38, 0x3c, 0x4e, 0x73, 0xa3, + 0xc9, 0xd2, 0xc0, 0xab, 0x62, 0x55, 0x4a, 0x4e, 0x61, 0x75, 0x80, 0x83, + 0x3f, 0x25, 0x1f, 0x4d, 0x94, 0xba, 0xa8, 0x85, 0x81, 0x7b, 0x68, 0x45, + 0x20, 0x08, 0x04, 0x09, 0x22, 0x8d, 0xf6, 0xfd, 0xb3, 0x78, 0x84, 0xad, + 0xc8, 0xc3, 0x98, 0x63, 0x62, 0x86, 0x89, 0x6a, 0x5b, 0x7f, 0x89, 0x6f, + 0x65, 0x6d, 0x56, 0x2a, 0x47, 0x24, 0x13, 0x38, 0x77, 0x94, 0x77, 0x4d, + 0x1a, 0x5c, 0xa5, 0xbd, 0xab, 0x9e, 0xb2, 0xcf, 0xb4, 0xcd, 0xc0, 0x9e, + 0xb2, 0xe2, 0xce, 0x8d, 0xa3, 0xd2, 0xa0, 0x3e, 0x34, 0x5c, 0x6a, 0x6a, + 0x79, 0x5d, 0x58, 0x66, 0x57, 0x3c, 0x57, 0x91, 0x97, 0x9f, 0xa3, 0xa0, + 0x9d, 0xa9, 0xc4, 0xdb, 0x85, 0x72, 0x59, 0x4a, 0x51, 0x6f, 0x93, 0xac, + 0x8b, 0x51, 0x29, 0x49, 0x8f, 0xa5, 0x6e, 0x2b, 0x12, 0x19, 0x63, 0x7f, + 0x33, 0x12, 0x40, 0x5f, 0x67, 0x61, 0x60, 0x68, 0x74, 0x78, 0x71, 0x68, + 0x61, 0x6b, 0x7a, 0x87, 0x8d, 0x8b, 0x85, 0x80, 0x83, 0x80, 0x7b, 0x75, + 0x70, 0x6d, 0x6b, 0x6b, 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x83, 0x84, 0x85, + 0x6d, 0x71, 0x76, 0x79, 0x78, 0x73, 0x6c, 0x67, 0x64, 0x65, 0x65, 0x63, + 0x5e, 0x56, 0x4e, 0x4a, 0x56, 0x4b, 0x3c, 0x2f, 0x26, 0x24, 0x2b, 0x34, + 0x4b, 0x83, 0xa6, 0x7d, 0x33, 0x24, 0x6c, 0xbf, 0xa5, 0x60, 0x24, 0x1f, + 0x31, 0x3c, 0x45, 0x53, 0x2f, 0x29, 0x28, 0x33, 0x49, 0x5f, 0x6e, 0x73, + 0x5c, 0x63, 0x5b, 0x67, 0xb0, 0xeb, 0xb9, 0x54, 0x52, 0x8f, 0x9d, 0x6f, + 0x62, 0x78, 0x59, 0x12, 0x6f, 0xbd, 0xd5, 0xc8, 0xd6, 0xd2, 0xbd, 0xc3, + 0xb1, 0x80, 0x44, 0x25, 0x2a, 0x3f, 0x4d, 0x51, 0x74, 0x66, 0x50, 0x3f, + 0x3a, 0x45, 0x58, 0x66, 0x55, 0x56, 0x54, 0x4b, 0x3d, 0x31, 0x29, 0x25, + 0x36, 0x37, 0x3a, 0x3d, 0x41, 0x44, 0x47, 0x49, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x67, 0x7d, 0x71, 0x77, 0x89, 0x81, 0x1f, 0x09, + 0x9c, 0xa6, 0x95, 0x77, 0x82, 0xb4, 0xd5, 0xd4, 0xc9, 0xbf, 0x9f, 0x6d, + 0x47, 0x50, 0x83, 0xb4, 0x88, 0x78, 0x5f, 0x48, 0x3a, 0x38, 0x3e, 0x43, + 0x50, 0x5b, 0x4a, 0x1f, 0x0f, 0x25, 0x39, 0x38, 0x58, 0x5e, 0x79, 0x8d, + 0x6b, 0x32, 0x24, 0x3d, 0x7c, 0x67, 0x45, 0x34, 0x42, 0x4c, 0x2c, 0x00, + 0x1b, 0x3a, 0x62, 0x7c, 0x82, 0x7c, 0x78, 0x77, 0xb1, 0xb7, 0xb9, 0xad, + 0x8f, 0x65, 0x3d, 0x25, 0x3f, 0x38, 0x51, 0x7d, 0x81, 0x56, 0x35, 0x33, + 0x24, 0x61, 0xaa, 0xce, 0xc4, 0xaa, 0x9c, 0x9a, 0x57, 0x8a, 0xbe, 0xc7, + 0xab, 0x93, 0x98, 0xa9, 0x88, 0x8c, 0x9a, 0xab, 0xaf, 0x95, 0x64, 0x3e, + 0xa6, 0x84, 0x66, 0x6d, 0x93, 0xb8, 0xc3, 0xbf, 0xde, 0xdf, 0xe5, 0xe8, + 0xd8, 0xa8, 0x65, 0x32, 0x3b, 0x52, 0x76, 0x8c, 0x7e, 0x59, 0x3d, 0x33, + 0x2d, 0x2d, 0x37, 0x45, 0x46, 0x3a, 0x32, 0x33, 0x3f, 0x12, 0x00, 0x26, + 0x83, 0xc7, 0xcc, 0xb5, 0x91, 0xb8, 0xe3, 0xee, 0xdd, 0xcb, 0xcd, 0xd7, + 0xe4, 0xcc, 0xc1, 0xbc, 0x99, 0x72, 0x80, 0xaf, 0xd1, 0xcb, 0x9f, 0x96, + 0xc9, 0xc8, 0x7b, 0x41, 0x6a, 0x75, 0x68, 0x45, 0x33, 0x44, 0x5d, 0x67, + 0x3e, 0x35, 0x24, 0x13, 0x17, 0x3e, 0x7c, 0xab, 0xa7, 0xae, 0xb5, 0xb7, + 0xae, 0x9c, 0x88, 0x7a, 0x93, 0x97, 0x99, 0x93, 0x89, 0x84, 0x86, 0x8b, + 0x83, 0xaa, 0xa8, 0x7b, 0x59, 0x4f, 0x49, 0x46, 0x68, 0x62, 0x5f, 0x65, + 0x70, 0x77, 0x74, 0x6f, 0x70, 0x73, 0x78, 0x7c, 0x7f, 0x80, 0x80, 0x80, + 0x73, 0x78, 0x80, 0x84, 0x81, 0x77, 0x6b, 0x63, 0x66, 0x67, 0x68, 0x69, + 0x6b, 0x6c, 0x6d, 0x6e, 0x8b, 0x8d, 0x8e, 0x8c, 0x86, 0x7c, 0x73, 0x6d, + 0x65, 0x66, 0x66, 0x64, 0x5e, 0x57, 0x4f, 0x4a, 0x55, 0x43, 0x30, 0x2b, + 0x31, 0x35, 0x31, 0x2b, 0x3a, 0x37, 0x2f, 0x22, 0x19, 0x1c, 0x2b, 0x39, + 0x6b, 0x40, 0x25, 0x32, 0x4b, 0x62, 0x83, 0xa6, 0x92, 0x80, 0x64, 0x48, + 0x3a, 0x40, 0x53, 0x64, 0x49, 0x54, 0x55, 0x4c, 0x51, 0x66, 0x6f, 0x6a, + 0x26, 0x59, 0x97, 0xa7, 0x78, 0x46, 0x4c, 0x72, 0xb3, 0xd4, 0xc3, 0xbb, + 0xed, 0xfa, 0xcd, 0xb1, 0xc9, 0x82, 0x38, 0x28, 0x4d, 0x6c, 0x64, 0x4c, + 0x3c, 0x47, 0x5a, 0x6e, 0x72, 0x5f, 0x3c, 0x20, 0x34, 0x39, 0x3e, 0x41, + 0x40, 0x3e, 0x3c, 0x3b, 0x24, 0x26, 0x2b, 0x31, 0x38, 0x3e, 0x42, 0x45, + 0x50, 0x4f, 0x4d, 0x4a, 0x46, 0x43, 0x41, 0x40, 0x3c, 0x51, 0x4a, 0x55, + 0x6e, 0x73, 0x1f, 0x0f, 0x85, 0x9b, 0x98, 0x7d, 0x76, 0x84, 0x7d, 0x62, + 0x16, 0x21, 0x2b, 0x29, 0x21, 0x21, 0x2e, 0x3c, 0x5c, 0x50, 0x3d, 0x2e, + 0x29, 0x2f, 0x3b, 0x44, 0x72, 0x70, 0x55, 0x36, 0x3d, 0x5f, 0x6a, 0x5b, + 0x58, 0x3c, 0x31, 0x46, 0x59, 0x5d, 0x67, 0x7a, 0x67, 0x36, 0x39, 0x6f, + 0x71, 0x43, 0x4e, 0x8c, 0x75, 0x6a, 0x56, 0x45, 0x4d, 0x7b, 0xc2, 0xf8, + 0xd7, 0xbb, 0xa3, 0xa5, 0xaf, 0x99, 0x60, 0x2b, 0x4e, 0x38, 0x3a, 0x53, + 0x56, 0x44, 0x4b, 0x68, 0xe3, 0xea, 0xe7, 0xce, 0xae, 0x9f, 0xaa, 0xba, + 0x9a, 0x84, 0x69, 0x5f, 0x69, 0x7d, 0x8e, 0x97, 0x92, 0x94, 0x8f, 0x82, + 0x78, 0x80, 0x99, 0xb0, 0xac, 0xb1, 0xa8, 0x8c, 0x75, 0x82, 0xb4, 0xe1, + 0xaf, 0xb3, 0x9b, 0x5d, 0x23, 0x29, 0x73, 0xbb, 0xc9, 0xa5, 0x90, 0x83, + 0x53, 0x20, 0x32, 0x6e, 0x66, 0x3a, 0x2e, 0x4e, 0x5d, 0x58, 0x79, 0xb0, + 0xd1, 0xed, 0xff, 0xff, 0xec, 0xb4, 0x81, 0x63, 0x71, 0x72, 0x74, 0x7a, + 0x87, 0x9e, 0xb8, 0xcb, 0xad, 0x96, 0x99, 0x9c, 0x67, 0x37, 0x76, 0xe6, + 0xd8, 0xa5, 0x5c, 0x53, 0x7f, 0x77, 0x51, 0x50, 0x4f, 0x66, 0x9d, 0xd1, + 0xc5, 0x86, 0x57, 0x4f, 0x87, 0x52, 0x2a, 0x45, 0x8c, 0xb9, 0xac, 0x89, + 0x22, 0x1f, 0x1e, 0x24, 0x37, 0x52, 0x6e, 0x80, 0x73, 0x80, 0x8e, 0x92, + 0x92, 0x9a, 0xaf, 0xc1, 0xb1, 0xd8, 0xda, 0xd6, 0xe7, 0xcc, 0x91, 0x79, + 0x62, 0x63, 0x68, 0x72, 0x7c, 0x7f, 0x7a, 0x74, 0x8e, 0x8a, 0x85, 0x7f, + 0x7c, 0x7c, 0x7e, 0x7f, 0x7d, 0x84, 0x8d, 0x94, 0x94, 0x8c, 0x82, 0x7b, + 0x6f, 0x70, 0x71, 0x72, 0x74, 0x76, 0x77, 0x77, 0x81, 0x82, 0x81, 0x7f, + 0x79, 0x72, 0x6a, 0x66, 0x66, 0x67, 0x67, 0x65, 0x60, 0x58, 0x50, 0x4b, + 0x4a, 0x4e, 0x3a, 0x15, 0x0a, 0x1d, 0x28, 0x23, 0x20, 0x24, 0x2c, 0x38, + 0x48, 0x56, 0x62, 0x68, 0x69, 0x40, 0x2f, 0x51, 0x7c, 0x92, 0x9f, 0xac, + 0x96, 0x9a, 0x92, 0x75, 0x55, 0x49, 0x57, 0x6b, 0x69, 0x51, 0x40, 0x45, + 0x50, 0x56, 0x62, 0x71, 0x86, 0x77, 0x46, 0x12, 0x12, 0x36, 0x3e, 0x28, + 0x50, 0x9b, 0xab, 0x97, 0xa9, 0xba, 0xc6, 0xe6, 0xab, 0xa6, 0x9b, 0x88, + 0x6f, 0x55, 0x41, 0x35, 0x51, 0x43, 0x3b, 0x45, 0x55, 0x54, 0x3c, 0x23, + 0x2b, 0x31, 0x3e, 0x4b, 0x57, 0x5d, 0x5e, 0x5d, 0x6c, 0x6b, 0x69, 0x65, + 0x62, 0x5f, 0x5c, 0x5b, 0x72, 0x70, 0x6e, 0x6a, 0x66, 0x63, 0x60, 0x5f, + 0x4c, 0x59, 0x4d, 0x50, 0x5f, 0x67, 0x1d, 0x0f, 0xac, 0xcc, 0xd4, 0xb5, + 0x96, 0x7b, 0x47, 0x0f, 0x4c, 0x57, 0x7c, 0xba, 0xe9, 0xdf, 0x9f, 0x62, + 0x5b, 0x50, 0x3f, 0x32, 0x2f, 0x38, 0x45, 0x4f, 0x44, 0x4b, 0x48, 0x4b, + 0x6c, 0x90, 0x87, 0x63, 0x54, 0x5f, 0x70, 0x76, 0x61, 0x3f, 0x28, 0x22, + 0x37, 0x33, 0x2e, 0x35, 0x49, 0x50, 0x30, 0x07, 0x57, 0x23, 0x00, 0x00, + 0x38, 0x75, 0x8f, 0x8e, 0x72, 0x91, 0xa5, 0x8f, 0x5c, 0x36, 0x33, 0x41, + 0x47, 0x23, 0x0e, 0x11, 0x10, 0x18, 0x4b, 0x8a, 0xaa, 0x97, 0x90, 0xaa, + 0xd1, 0xdd, 0xc2, 0xa1, 0x6b, 0x43, 0x20, 0x27, 0x4b, 0x5f, 0x4e, 0x33, + 0x68, 0x7c, 0x96, 0xa5, 0xa8, 0xaa, 0xb1, 0xb9, 0x99, 0x84, 0x6e, 0x6a, + 0x79, 0x8f, 0x9d, 0xa2, 0x22, 0x39, 0x54, 0x5e, 0x52, 0x39, 0x21, 0x14, + 0x34, 0x24, 0x26, 0x37, 0x35, 0x25, 0x2c, 0x45, 0x29, 0x36, 0x66, 0x9d, + 0xa4, 0x79, 0x53, 0x4a, 0x09, 0x47, 0x8f, 0xaf, 0x9f, 0x7f, 0x6f, 0x6e, + 0x77, 0x31, 0x00, 0x15, 0x65, 0x93, 0x77, 0x44, 0x6f, 0x8d, 0x97, 0x70, + 0x37, 0x17, 0x19, 0x25, 0x2f, 0x2e, 0x1d, 0x32, 0x66, 0x69, 0x5b, 0x6f, + 0x48, 0x3c, 0x5f, 0x99, 0x8f, 0x44, 0x1a, 0x27, 0x33, 0x2b, 0x33, 0x53, + 0x76, 0x77, 0x52, 0x2c, 0x2f, 0x42, 0x60, 0x7d, 0x8f, 0x93, 0x8e, 0x89, + 0x89, 0x7a, 0x6c, 0x6a, 0x6a, 0x5e, 0x43, 0x2b, 0x4c, 0x3c, 0x2d, 0x32, + 0x3e, 0x39, 0x2f, 0x2e, 0x39, 0x46, 0x5b, 0x71, 0x81, 0x87, 0x83, 0x7f, + 0x7d, 0x7d, 0x7e, 0x80, 0x83, 0x85, 0x87, 0x89, 0x77, 0x76, 0x76, 0x76, + 0x77, 0x7a, 0x7d, 0x7e, 0x72, 0x73, 0x74, 0x76, 0x77, 0x79, 0x7a, 0x7a, + 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6c, 0x6b, 0x6a, 0x68, 0x68, 0x69, 0x67, + 0x61, 0x5a, 0x52, 0x4d, 0x32, 0x1e, 0x20, 0x35, 0x30, 0x17, 0x1d, 0x3c, + 0x23, 0x2d, 0x38, 0x3d, 0x3b, 0x38, 0x39, 0x3b, 0x23, 0x21, 0x38, 0x5d, + 0x67, 0x58, 0x56, 0x65, 0x60, 0x87, 0xaa, 0xa0, 0x6c, 0x36, 0x1c, 0x18, + 0x66, 0x4e, 0x36, 0x34, 0x43, 0x49, 0x36, 0x1d, 0x69, 0x58, 0x3b, 0x4e, + 0xb6, 0xff, 0xfa, 0x9e, 0x45, 0x62, 0x4c, 0x47, 0x8b, 0xb8, 0xaf, 0xac, + 0xa2, 0xa3, 0x90, 0x61, 0x35, 0x30, 0x59, 0x84, 0x5a, 0x30, 0x04, 0x00, + 0x0e, 0x26, 0x2b, 0x24, 0x31, 0x27, 0x1c, 0x1c, 0x27, 0x39, 0x47, 0x4e, + 0x5e, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x59, 0x60, 0x60, 0x60, 0x60, + 0x5f, 0x5f, 0x5f, 0x5f, 0x67, 0x6b, 0x59, 0x53, 0x54, 0x5d, 0x1b, 0x0e, + 0xb2, 0xc9, 0xc7, 0xa6, 0x94, 0x93, 0x7c, 0x57, 0x59, 0x59, 0x69, 0x8e, + 0xb3, 0xb6, 0x95, 0x72, 0x79, 0x6d, 0x5b, 0x4c, 0x48, 0x4f, 0x5c, 0x65, + 0x5c, 0x61, 0x5a, 0x57, 0x72, 0x91, 0x84, 0x5d, 0x29, 0x70, 0xad, 0xa3, + 0x6d, 0x49, 0x51, 0x68, 0x4d, 0x6a, 0x76, 0x69, 0x6a, 0x7b, 0x75, 0x5d, + 0x36, 0x5e, 0x7e, 0x6e, 0x43, 0x31, 0x4d, 0x73, 0x76, 0x9a, 0xb0, 0x94, + 0x59, 0x35, 0x3f, 0x5a, 0xb7, 0xa0, 0x92, 0x8b, 0x70, 0x5a, 0x7a, 0xb2, + 0xb4, 0x95, 0x82, 0x99, 0xc2, 0xcb, 0xa5, 0x78, 0x3e, 0x50, 0x66, 0x70, + 0x6c, 0x60, 0x55, 0x50, 0xe0, 0xc6, 0xa5, 0x91, 0x8d, 0x91, 0x91, 0x8f, + 0x65, 0x5c, 0x54, 0x57, 0x5e, 0x5c, 0x4f, 0x42, 0x5d, 0x36, 0x1a, 0x32, + 0x68, 0x83, 0x6c, 0x49, 0x07, 0x15, 0x21, 0x35, 0x58, 0x62, 0x2b, 0x00, + 0x11, 0x36, 0x57, 0x6f, 0x9f, 0xdf, 0xff, 0xff, 0xe3, 0x94, 0x36, 0x07, + 0x0c, 0x1c, 0x17, 0x07, 0x0f, 0x51, 0x92, 0x9a, 0x7b, 0x77, 0xa7, 0xde, + 0xff, 0xe4, 0x89, 0x1e, 0x00, 0x28, 0x3b, 0x24, 0x03, 0x22, 0x27, 0x39, + 0x6e, 0x74, 0x4b, 0x37, 0x47, 0x46, 0x3b, 0x31, 0x3f, 0x60, 0x76, 0x7a, + 0x27, 0x24, 0x27, 0x32, 0x40, 0x45, 0x3f, 0x36, 0x8f, 0x89, 0x80, 0x77, + 0x72, 0x71, 0x72, 0x74, 0x72, 0x84, 0x9a, 0xa5, 0x9c, 0x85, 0x6b, 0x5b, + 0x30, 0x3e, 0x3f, 0x34, 0x30, 0x2d, 0x27, 0x23, 0x43, 0x4f, 0x62, 0x76, + 0x87, 0x95, 0x9f, 0xa4, 0xa0, 0xa4, 0xa8, 0xa9, 0xa3, 0x98, 0x8c, 0x84, + 0x77, 0x76, 0x76, 0x76, 0x77, 0x7a, 0x7d, 0x7e, 0x7b, 0x7b, 0x7c, 0x7e, + 0x7f, 0x81, 0x82, 0x83, 0x75, 0x74, 0x74, 0x75, 0x76, 0x79, 0x7b, 0x7c, + 0x69, 0x6a, 0x6a, 0x68, 0x63, 0x5b, 0x54, 0x4f, 0x66, 0x6b, 0x61, 0x49, + 0x38, 0x35, 0x31, 0x29, 0x36, 0x27, 0x1d, 0x26, 0x35, 0x36, 0x22, 0x0c, + 0x5b, 0x80, 0xb0, 0xb6, 0x77, 0x2a, 0x13, 0x28, 0x4f, 0x89, 0xc8, 0xd8, + 0xb2, 0x7c, 0x59, 0x4e, 0x5a, 0x72, 0x65, 0x35, 0x25, 0x38, 0x30, 0x0d, + 0x30, 0x26, 0x59, 0xb9, 0xda, 0xa6, 0x73, 0x6c, 0x71, 0x7e, 0x56, 0x43, + 0x7c, 0x9a, 0x7e, 0x6c, 0xa9, 0x96, 0x87, 0x92, 0xb5, 0xdd, 0xf6, 0xff, + 0xe9, 0xda, 0xcf, 0xd4, 0xe2, 0xe3, 0xd2, 0xbf, 0x7a, 0x83, 0x95, 0xa6, + 0xaa, 0x97, 0x73, 0x58, 0x63, 0x62, 0x61, 0x5f, 0x5d, 0x5b, 0x5a, 0x59, + 0x54, 0x54, 0x53, 0x52, 0x51, 0x51, 0x50, 0x50, 0x47, 0x48, 0x3c, 0x3a, + 0x38, 0x4a, 0x18, 0x0d, 0x9a, 0x96, 0x70, 0x3a, 0x31, 0x55, 0x6f, 0x6b, + 0x3d, 0x64, 0x85, 0x7a, 0x52, 0x3c, 0x4e, 0x6b, 0x63, 0x58, 0x47, 0x3b, + 0x39, 0x42, 0x50, 0x5a, 0x20, 0x2b, 0x2b, 0x2e, 0x59, 0x9d, 0xc2, 0xc2, + 0xe1, 0xc7, 0x87, 0x3f, 0x25, 0x3e, 0x5b, 0x63, 0x5c, 0x65, 0x71, 0x61, + 0x2b, 0x0b, 0x3a, 0x86, 0xe1, 0xff, 0xff, 0xac, 0x2f, 0x00, 0x1e, 0x62, + 0xac, 0xa6, 0xa2, 0xa7, 0xb1, 0xb5, 0xb0, 0xa9, 0xbb, 0xbc, 0xc7, 0xbd, + 0x7d, 0x2f, 0x1b, 0x34, 0x84, 0x7f, 0x82, 0x94, 0xb2, 0xcd, 0xde, 0xe3, + 0x54, 0x57, 0x69, 0x8d, 0xab, 0xa6, 0x7f, 0x5a, 0x39, 0x55, 0x85, 0xb0, + 0xbb, 0x94, 0x50, 0x1b, 0x00, 0x26, 0x4f, 0x5a, 0x4d, 0x45, 0x53, 0x66, + 0x75, 0x80, 0x86, 0x7b, 0x67, 0x5c, 0x62, 0x6d, 0x6f, 0x65, 0x48, 0x41, + 0x7a, 0xb3, 0x90, 0x3f, 0x56, 0x88, 0xa3, 0x9b, 0xab, 0xd2, 0xcf, 0xa9, + 0xe1, 0xa4, 0x6a, 0x6e, 0xaa, 0xe7, 0xff, 0xfc, 0xff, 0xf7, 0xe6, 0xd5, + 0xce, 0xd8, 0xee, 0xff, 0xc9, 0xa9, 0x81, 0x6f, 0x77, 0x79, 0x5f, 0x3d, + 0x6b, 0x94, 0x82, 0x4d, 0x38, 0x2e, 0x34, 0x55, 0x4e, 0x32, 0x1e, 0x26, + 0x3a, 0x4d, 0x65, 0x7a, 0x3f, 0x2c, 0x20, 0x2e, 0x4f, 0x67, 0x69, 0x61, + 0x69, 0x76, 0x88, 0x96, 0x99, 0x90, 0x82, 0x78, 0x68, 0x82, 0xa5, 0xb7, + 0xaf, 0x91, 0x6f, 0x5a, 0x39, 0x45, 0x32, 0x26, 0x2d, 0x1b, 0x1c, 0x4b, + 0x72, 0x73, 0x72, 0x6f, 0x70, 0x79, 0x88, 0x95, 0xa2, 0xa7, 0xae, 0xaf, + 0xa8, 0x99, 0x88, 0x7d, 0x7d, 0x84, 0x8d, 0x94, 0x94, 0x8c, 0x82, 0x7b, + 0x7f, 0x80, 0x81, 0x82, 0x84, 0x85, 0x87, 0x87, 0x8b, 0x87, 0x81, 0x7c, + 0x79, 0x79, 0x7a, 0x7c, 0x6b, 0x6c, 0x6c, 0x6a, 0x65, 0x5d, 0x55, 0x50, + 0x8c, 0xc7, 0xd8, 0x97, 0x49, 0x28, 0x24, 0x20, 0x5b, 0x63, 0x6a, 0x69, + 0x64, 0x65, 0x70, 0x7a, 0xd2, 0xc2, 0xc6, 0xda, 0xcb, 0x8c, 0x4b, 0x2b, + 0x0f, 0x37, 0x67, 0x7d, 0x77, 0x69, 0x65, 0x69, 0x53, 0x69, 0x56, 0x31, + 0x4a, 0x8e, 0x99, 0x6d, 0x0f, 0x21, 0x61, 0xac, 0xb5, 0x78, 0x3a, 0x23, + 0x2f, 0x61, 0x59, 0x44, 0x63, 0x73, 0x67, 0x6d, 0x33, 0x4d, 0x7c, 0xb3, + 0xdb, 0xe3, 0xd1, 0xbd, 0xb5, 0xc0, 0xce, 0xd4, 0xce, 0xc0, 0xb2, 0xa8, + 0xab, 0x9c, 0x8c, 0x86, 0x87, 0x81, 0x71, 0x61, 0x6c, 0x6a, 0x65, 0x60, + 0x5a, 0x54, 0x50, 0x4e, 0x4f, 0x4d, 0x49, 0x43, 0x3d, 0x38, 0x34, 0x31, + 0x32, 0x31, 0x2d, 0x2e, 0x27, 0x3d, 0x12, 0x07, 0x97, 0x92, 0x67, 0x2b, + 0x1c, 0x3a, 0x4f, 0x48, 0x6b, 0xac, 0xe0, 0xc3, 0x6e, 0x34, 0x3e, 0x62, + 0x47, 0x3f, 0x35, 0x30, 0x37, 0x49, 0x5d, 0x6b, 0xdb, 0xea, 0xde, 0xbb, + 0xb3, 0xd2, 0xeb, 0xed, 0xff, 0xdf, 0x8c, 0x46, 0x43, 0x62, 0x5c, 0x37, + 0x28, 0x48, 0x2f, 0x00, 0x20, 0x84, 0x95, 0x5a, 0x5d, 0x48, 0x47, 0x75, + 0xb8, 0xda, 0xc6, 0xa5, 0x97, 0xb8, 0xcd, 0xb7, 0x8b, 0x79, 0x96, 0xbb, + 0xd9, 0xda, 0xe1, 0xcc, 0x7f, 0x2c, 0x1d, 0x3d, 0x79, 0x87, 0xa3, 0xc0, + 0xc7, 0xa6, 0x6a, 0x3a, 0x35, 0x26, 0x3a, 0x87, 0xd7, 0xd6, 0x7c, 0x20, + 0x1f, 0x39, 0x56, 0x63, 0x5f, 0x5b, 0x61, 0x6a, 0x80, 0x69, 0x57, 0x5f, + 0x72, 0x71, 0x54, 0x36, 0x43, 0x4c, 0x57, 0x61, 0x69, 0x73, 0x81, 0x8b, + 0xff, 0xec, 0xda, 0xe1, 0xf8, 0xf2, 0xba, 0x7d, 0xf3, 0xed, 0xdb, 0xc6, + 0xc3, 0xd2, 0xe0, 0xe4, 0xa8, 0xa8, 0xae, 0xbe, 0xca, 0xc4, 0xac, 0x96, + 0x8d, 0x8a, 0x7d, 0x69, 0x61, 0x78, 0xa8, 0xd1, 0xa0, 0x88, 0x76, 0x6c, + 0x51, 0x2e, 0x24, 0x31, 0x51, 0x86, 0x98, 0x80, 0x57, 0x32, 0x5d, 0xc1, + 0xdc, 0x82, 0x43, 0x44, 0x39, 0x14, 0x1c, 0x4c, 0x2c, 0x45, 0x5d, 0x61, + 0x58, 0x5a, 0x6f, 0x85, 0x53, 0x5e, 0x6f, 0x7c, 0x81, 0x7c, 0x73, 0x6b, + 0x7e, 0x86, 0x97, 0xaa, 0xaf, 0x97, 0x6a, 0x46, 0x50, 0x39, 0x28, 0x2e, + 0x32, 0x20, 0x21, 0x3e, 0x52, 0x58, 0x5c, 0x5a, 0x55, 0x56, 0x60, 0x6a, + 0x59, 0x5f, 0x6a, 0x74, 0x7c, 0x7f, 0x7e, 0x7d, 0x73, 0x78, 0x80, 0x84, + 0x81, 0x77, 0x6b, 0x63, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, + 0x88, 0x83, 0x7c, 0x76, 0x74, 0x76, 0x79, 0x7c, 0x6c, 0x6d, 0x6d, 0x6b, + 0x66, 0x5e, 0x56, 0x52, 0x55, 0x75, 0xb5, 0xcf, 0x85, 0x1e, 0x17, 0x53, + 0x71, 0x83, 0x8a, 0x72, 0x4f, 0x47, 0x65, 0x88, 0x91, 0x55, 0x39, 0x68, + 0xa1, 0x9f, 0x6d, 0x43, 0x44, 0x48, 0x4a, 0x48, 0x45, 0x45, 0x4a, 0x4e, + 0x3f, 0x49, 0x4c, 0x5a, 0x92, 0xd3, 0xde, 0xc3, 0x4c, 0x3d, 0x3b, 0x67, + 0xa9, 0xae, 0x51, 0x00, 0x1f, 0x28, 0x0d, 0x26, 0x90, 0xbe, 0x87, 0x54, + 0x5b, 0x6c, 0x84, 0x98, 0xa5, 0xad, 0xb4, 0xb9, 0x92, 0xa4, 0xae, 0x9e, + 0x81, 0x79, 0x8d, 0xa7, 0x92, 0x7c, 0x63, 0x5c, 0x64, 0x6a, 0x65, 0x5b, + 0x5c, 0x5d, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6a, 0x64, 0x61, 0x5d, 0x57, + 0x50, 0x4b, 0x46, 0x44, 0x43, 0x41, 0x40, 0x40, 0x30, 0x42, 0x18, 0x09, + 0xa4, 0xb8, 0xb2, 0x93, 0x87, 0x92, 0x88, 0x6c, 0xab, 0xcb, 0xda, 0xb1, + 0x66, 0x30, 0x2d, 0x40, 0x5d, 0x58, 0x54, 0x58, 0x68, 0x81, 0x9b, 0xac, + 0xa0, 0xcc, 0xe4, 0xd4, 0xc8, 0xda, 0xec, 0xed, 0xba, 0xf2, 0xfb, 0xb5, + 0x73, 0x6f, 0x87, 0x91, 0x7e, 0x81, 0x7a, 0x6d, 0x74, 0x83, 0x7e, 0x6a, + 0x9e, 0xc7, 0xf3, 0xfe, 0xea, 0xd3, 0xcc, 0xd1, 0xcc, 0xba, 0xaa, 0xaa, + 0xb6, 0xbe, 0xb8, 0xaf, 0xec, 0xdc, 0xc9, 0xa5, 0x61, 0x33, 0x55, 0x99, + 0xe5, 0xba, 0x9e, 0xb8, 0xe2, 0xd5, 0x83, 0x31, 0x4f, 0x3c, 0x30, 0x42, + 0x6b, 0x8d, 0x97, 0x94, 0xb2, 0xc7, 0xc5, 0x92, 0x4a, 0x2a, 0x44, 0x6c, + 0x3a, 0x40, 0x43, 0x3e, 0x38, 0x3d, 0x50, 0x61, 0x4c, 0x59, 0x65, 0x65, + 0x5b, 0x53, 0x55, 0x5a, 0x66, 0x54, 0x71, 0xb7, 0xda, 0xc3, 0xac, 0xb0, + 0xd1, 0xc0, 0xce, 0xef, 0xdf, 0xa3, 0x7f, 0x83, 0x91, 0x67, 0x43, 0x4c, + 0x72, 0x83, 0x6a, 0x47, 0x29, 0x50, 0x7d, 0x8e, 0x83, 0x77, 0x7b, 0x86, + 0xa7, 0xbe, 0xbf, 0x8d, 0x41, 0x15, 0x23, 0x44, 0x29, 0x1d, 0x1a, 0x3a, + 0x47, 0x22, 0x3f, 0xa6, 0xdb, 0xaf, 0x75, 0x4f, 0x46, 0x4c, 0x4e, 0x4a, + 0x75, 0x62, 0x53, 0x57, 0x6b, 0x78, 0x74, 0x69, 0x88, 0x80, 0x74, 0x6b, + 0x68, 0x6c, 0x74, 0x7a, 0x6d, 0x7a, 0x89, 0x8d, 0x7f, 0x62, 0x42, 0x2e, + 0x3c, 0x23, 0x2d, 0x2f, 0x28, 0x54, 0x60, 0x1f, 0x18, 0x32, 0x54, 0x6d, + 0x78, 0x7d, 0x83, 0x89, 0x7c, 0x79, 0x74, 0x6f, 0x6c, 0x6b, 0x6b, 0x6c, + 0x83, 0x80, 0x7b, 0x75, 0x70, 0x6d, 0x6b, 0x6b, 0x7b, 0x7c, 0x7d, 0x7e, + 0x80, 0x81, 0x82, 0x83, 0x80, 0x7d, 0x79, 0x78, 0x7b, 0x83, 0x8b, 0x91, + 0x6d, 0x6e, 0x6e, 0x6c, 0x66, 0x5f, 0x57, 0x52, 0x46, 0x5b, 0x59, 0x3e, + 0x37, 0x4c, 0x5a, 0x53, 0x4a, 0x31, 0x1a, 0x1d, 0x38, 0x55, 0x62, 0x63, + 0x6c, 0x4d, 0x37, 0x34, 0x2a, 0x18, 0x1b, 0x30, 0x44, 0x3b, 0x31, 0x33, + 0x3e, 0x4a, 0x51, 0x52, 0x63, 0x96, 0xd5, 0xf1, 0xe7, 0xdb, 0xef, 0xff, + 0xff, 0x5f, 0x00, 0x16, 0x6f, 0x86, 0x7e, 0x84, 0x2d, 0x5a, 0x5d, 0x6a, + 0xac, 0xc2, 0x98, 0x7d, 0x70, 0x54, 0x4c, 0x7a, 0xbe, 0xda, 0xba, 0x8c, + 0x46, 0x69, 0x81, 0x6e, 0x42, 0x31, 0x4d, 0x72, 0x7b, 0x60, 0x45, 0x41, + 0x52, 0x65, 0x6c, 0x69, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 0x5e, + 0x57, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4b, 0x4b, 0x49, 0x4d, 0x50, + 0x3d, 0x4f, 0x27, 0x16, 0x0e, 0x26, 0x3a, 0x36, 0x22, 0x16, 0x21, 0x31, + 0x71, 0x80, 0x94, 0x9a, 0x8a, 0x66, 0x3c, 0x20, 0x29, 0x22, 0x1b, 0x20, + 0x3a, 0x66, 0x97, 0xb7, 0xd4, 0xc1, 0xb0, 0xb3, 0xc6, 0xd6, 0xd8, 0xd3, + 0xba, 0xc9, 0xb5, 0x7b, 0x55, 0x5e, 0x73, 0x79, 0x48, 0x5b, 0x70, 0x76, + 0x6e, 0x67, 0x69, 0x70, 0x94, 0xa1, 0xb2, 0xb6, 0xa4, 0x7f, 0x56, 0x3b, + 0x5f, 0x7b, 0xa3, 0xc5, 0xd5, 0xd6, 0xd0, 0xcb, 0xda, 0xd9, 0xcd, 0xb2, + 0x97, 0x91, 0xa3, 0xb7, 0x6d, 0x7a, 0x8a, 0x93, 0x8b, 0x73, 0x58, 0x45, + 0x67, 0x89, 0xad, 0xb6, 0xa3, 0x8d, 0x86, 0x89, 0x83, 0x86, 0x88, 0x85, + 0x7b, 0x6b, 0x5b, 0x50, 0x67, 0x7f, 0x90, 0x83, 0x65, 0x54, 0x5f, 0x72, + 0x29, 0x21, 0x29, 0x38, 0x2e, 0x1a, 0x28, 0x4a, 0x15, 0x19, 0x30, 0x5d, + 0x92, 0xb6, 0xc0, 0xbb, 0xbc, 0xb1, 0x90, 0x5a, 0x2a, 0x1d, 0x38, 0x57, + 0x83, 0x5d, 0x72, 0xc1, 0xd7, 0x8f, 0x44, 0x2c, 0x31, 0x66, 0x9d, 0xaa, + 0x96, 0x8e, 0xa7, 0xc7, 0xcf, 0xc2, 0xac, 0x8f, 0x70, 0x53, 0x3c, 0x30, + 0x3b, 0x38, 0x34, 0x30, 0x2d, 0x2d, 0x2e, 0x2f, 0x0d, 0x13, 0x1e, 0x28, + 0x2e, 0x2f, 0x2d, 0x2b, 0x67, 0x68, 0x6b, 0x6f, 0x72, 0x76, 0x79, 0x7a, + 0x7d, 0x81, 0x87, 0x89, 0x87, 0x7f, 0x76, 0x70, 0x8b, 0x82, 0x74, 0x64, + 0x57, 0x4e, 0x49, 0x48, 0x46, 0x31, 0x1b, 0x1c, 0x3b, 0x6f, 0xa1, 0xbf, + 0x7f, 0x6e, 0x5d, 0x5b, 0x6b, 0x7f, 0x8d, 0x92, 0x8a, 0x79, 0x6b, 0x71, + 0x84, 0x8d, 0x85, 0x77, 0x67, 0x6a, 0x6f, 0x75, 0x7b, 0x81, 0x86, 0x88, + 0x85, 0x84, 0x82, 0x80, 0x7e, 0x7d, 0x7b, 0x7a, 0x6f, 0x6e, 0x6e, 0x6d, + 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x63, 0x5e, 0x5e, 0x5f, 0x59, 0x4c, 0x41, + 0x4d, 0x83, 0xa3, 0x84, 0x52, 0x40, 0x4f, 0x60, 0x7d, 0x8e, 0x9a, 0x91, + 0x7c, 0x6e, 0x74, 0x80, 0x77, 0x6d, 0x61, 0x5e, 0x6a, 0x83, 0x9f, 0xb1, + 0x80, 0x78, 0x67, 0x52, 0x46, 0x4d, 0x65, 0x79, 0xa0, 0xa6, 0xae, 0xb2, + 0xb4, 0xb5, 0xb8, 0xba, 0xd8, 0xbf, 0x8d, 0x56, 0x40, 0x69, 0xc0, 0xff, + 0xb4, 0x94, 0x71, 0x65, 0x6f, 0x77, 0x71, 0x66, 0x4f, 0x4b, 0x54, 0x72, + 0x96, 0xa5, 0x98, 0x84, 0x08, 0x26, 0x5e, 0x80, 0x64, 0x44, 0x6d, 0xb8, + 0xa7, 0x96, 0x6e, 0x45, 0x42, 0x5e, 0x70, 0x6e, 0x66, 0x63, 0x61, 0x65, + 0x6b, 0x6a, 0x61, 0x59, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x48, 0x4d, 0x55, 0x4d, 0x5d, 0x58, 0x1f, 0x07, 0x42, 0x56, 0x76, 0x93, + 0x9c, 0x8b, 0x6a, 0x50, 0x71, 0x64, 0x50, 0x3d, 0x31, 0x30, 0x35, 0x39, + 0x49, 0x76, 0xa0, 0x9d, 0x7b, 0x68, 0x7b, 0x99, 0x6d, 0x96, 0xc3, 0xd1, + 0xc1, 0xb3, 0xb9, 0xc7, 0xc8, 0xd7, 0xc1, 0x81, 0x4d, 0x3f, 0x3a, 0x2e, + 0x79, 0x5d, 0x3b, 0x2d, 0x3c, 0x5d, 0x7e, 0x91, 0x9f, 0xa4, 0xa8, 0xa9, + 0xa2, 0x94, 0x86, 0x7c, 0x7f, 0x92, 0xaf, 0xc9, 0xd6, 0xd3, 0xc6, 0xbb, + 0x5d, 0x81, 0xaa, 0xb6, 0x9f, 0x79, 0x5b, 0x4e, 0x31, 0x57, 0x8d, 0xb6, + 0xbc, 0x9d, 0x6e, 0x4c, 0x5e, 0x68, 0x83, 0xad, 0xcf, 0xcd, 0xa9, 0x86, + 0xab, 0xb5, 0xbf, 0xb9, 0x9b, 0x6a, 0x37, 0x16, 0x3c, 0x3c, 0x3e, 0x43, + 0x49, 0x4f, 0x54, 0x56, 0x5a, 0x3e, 0x2c, 0x2a, 0x24, 0x28, 0x55, 0x8d, + 0xd4, 0x8a, 0x37, 0x1e, 0x42, 0x75, 0x8f, 0x92, 0x1e, 0x53, 0x92, 0xb0, + 0xa1, 0x7c, 0x5c, 0x4d, 0x59, 0x79, 0xa2, 0xbb, 0xb4, 0x84, 0x3a, 0x00, + 0x19, 0x2d, 0x3f, 0x44, 0x4b, 0x6d, 0xa8, 0xd9, 0x90, 0x92, 0x97, 0x9d, + 0xa4, 0xab, 0xaf, 0xb2, 0xb8, 0xad, 0x9b, 0x86, 0x72, 0x62, 0x59, 0x54, + 0x5d, 0x63, 0x6d, 0x77, 0x7c, 0x7d, 0x7b, 0x79, 0x66, 0x6a, 0x70, 0x79, + 0x82, 0x8a, 0x91, 0x94, 0x99, 0x91, 0x85, 0x79, 0x72, 0x70, 0x72, 0x74, + 0x74, 0x6d, 0x60, 0x53, 0x48, 0x42, 0x3f, 0x3f, 0x2e, 0x42, 0x60, 0x7d, + 0x91, 0x9b, 0x9f, 0x9f, 0x7e, 0x73, 0x69, 0x69, 0x72, 0x7a, 0x7c, 0x7a, + 0x7d, 0x72, 0x6c, 0x76, 0x85, 0x87, 0x77, 0x64, 0x91, 0x8f, 0x8b, 0x85, + 0x7f, 0x7a, 0x76, 0x74, 0x79, 0x79, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, + 0x73, 0x72, 0x72, 0x72, 0x71, 0x70, 0x70, 0x70, 0x69, 0x63, 0x5d, 0x5c, + 0x5d, 0x56, 0x49, 0x3d, 0x83, 0xa9, 0xe2, 0xff, 0xe0, 0x9d, 0x6f, 0x65, + 0x6f, 0x77, 0x79, 0x70, 0x64, 0x68, 0x7e, 0x93, 0x7c, 0x65, 0x45, 0x2e, + 0x2b, 0x3d, 0x59, 0x6d, 0x31, 0x36, 0x45, 0x60, 0x7b, 0x86, 0x7d, 0x71, + 0xe1, 0xd5, 0xb4, 0x83, 0x5f, 0x64, 0x8f, 0xb9, 0x86, 0xb0, 0xce, 0xba, + 0x85, 0x68, 0x7a, 0x9a, 0x69, 0x69, 0x67, 0x61, 0x5d, 0x5f, 0x68, 0x71, + 0x50, 0x3d, 0x2e, 0x37, 0x53, 0x6b, 0x72, 0x6f, 0x5f, 0x3f, 0x37, 0x4e, + 0x55, 0x46, 0x4b, 0x64, 0x66, 0x8c, 0x9e, 0x84, 0x61, 0x5c, 0x6b, 0x77, + 0x65, 0x60, 0x5e, 0x61, 0x65, 0x63, 0x59, 0x50, 0x51, 0x4e, 0x4a, 0x46, + 0x45, 0x46, 0x48, 0x4a, 0x49, 0x4d, 0x54, 0x4c, 0x5c, 0x57, 0x1f, 0x07, + 0xa2, 0x8d, 0x7f, 0x8d, 0xab, 0xb8, 0xa9, 0x92, 0x51, 0x56, 0x5d, 0x60, + 0x5c, 0x52, 0x45, 0x3d, 0xa0, 0xa3, 0xae, 0xbd, 0xc1, 0xab, 0x81, 0x5f, + 0x62, 0x72, 0x8f, 0xaf, 0xc5, 0xc9, 0xbe, 0xb2, 0xb0, 0xae, 0x84, 0x3d, + 0x13, 0x19, 0x26, 0x25, 0x2c, 0x1f, 0x1a, 0x31, 0x57, 0x70, 0x71, 0x66, + 0x88, 0x8b, 0x8e, 0x8e, 0x8a, 0x82, 0x79, 0x73, 0x90, 0xaf, 0xcd, 0xcc, + 0xb0, 0x98, 0x93, 0x9a, 0x58, 0x65, 0x6e, 0x6a, 0x61, 0x66, 0x7c, 0x91, + 0xde, 0xe1, 0xe1, 0xd4, 0xb3, 0x85, 0x57, 0x3a, 0x34, 0x42, 0x66, 0x9f, + 0xd4, 0xe8, 0xd7, 0xbe, 0x9a, 0x8d, 0x79, 0x69, 0x64, 0x69, 0x75, 0x7d, + 0xae, 0x91, 0x73, 0x6c, 0x73, 0x6e, 0x53, 0x37, 0x35, 0x2f, 0x3d, 0x51, + 0x4c, 0x3c, 0x4c, 0x6f, 0x8e, 0x82, 0x91, 0xcd, 0xff, 0xff, 0xb7, 0x6a, + 0x00, 0x23, 0x69, 0x98, 0x9e, 0x89, 0x70, 0x61, 0x24, 0x5a, 0xa1, 0xd6, + 0xef, 0xf4, 0xea, 0xde, 0xae, 0x96, 0x70, 0x4f, 0x41, 0x4c, 0x65, 0x79, + 0x96, 0x95, 0x93, 0x91, 0x8e, 0x8c, 0x8a, 0x89, 0x95, 0x8e, 0x82, 0x77, + 0x70, 0x70, 0x73, 0x75, 0x88, 0x8e, 0x97, 0x9f, 0xa4, 0xa4, 0xa1, 0x9f, + 0x66, 0x67, 0x6a, 0x6e, 0x73, 0x77, 0x7a, 0x7b, 0x7b, 0x75, 0x6b, 0x62, + 0x5e, 0x5f, 0x64, 0x67, 0x62, 0x5c, 0x52, 0x49, 0x42, 0x3f, 0x40, 0x41, + 0x4d, 0x5d, 0x69, 0x64, 0x58, 0x5c, 0x74, 0x8d, 0xb2, 0x9d, 0x80, 0x6a, + 0x62, 0x64, 0x69, 0x6b, 0x43, 0x44, 0x4f, 0x67, 0x7f, 0x87, 0x7b, 0x6b, + 0x7f, 0x7e, 0x7c, 0x79, 0x76, 0x74, 0x72, 0x70, 0x76, 0x78, 0x7a, 0x7d, + 0x80, 0x83, 0x85, 0x86, 0x88, 0x86, 0x82, 0x7e, 0x79, 0x74, 0x71, 0x6f, + 0x5e, 0x5a, 0x58, 0x5c, 0x61, 0x5f, 0x55, 0x4c, 0x50, 0x4b, 0x59, 0x75, + 0x7d, 0x6b, 0x5c, 0x5c, 0x73, 0x89, 0xa2, 0xad, 0xa9, 0x9f, 0x9c, 0x9c, + 0x96, 0x84, 0x68, 0x4d, 0x3d, 0x3a, 0x40, 0x46, 0x3d, 0x53, 0x72, 0x89, + 0x8e, 0x85, 0x78, 0x70, 0x8e, 0x8b, 0x81, 0x70, 0x64, 0x64, 0x71, 0x7d, + 0x6d, 0x86, 0x9c, 0x96, 0x78, 0x5f, 0x59, 0x5e, 0x54, 0x6a, 0x7a, 0x6e, + 0x4f, 0x3b, 0x3f, 0x4d, 0x6a, 0x5b, 0x4d, 0x50, 0x63, 0x75, 0x7e, 0x7e, + 0x92, 0x72, 0x51, 0x3a, 0x1f, 0x0c, 0x20, 0x44, 0x3c, 0x69, 0x99, 0xab, + 0xa4, 0x93, 0x7a, 0x65, 0x66, 0x61, 0x5d, 0x5e, 0x61, 0x5d, 0x52, 0x48, + 0x4d, 0x4b, 0x47, 0x43, 0x42, 0x43, 0x45, 0x47, 0x4a, 0x4d, 0x52, 0x49, + 0x59, 0x55, 0x1e, 0x08, 0x75, 0x7d, 0x90, 0xa9, 0xb5, 0xa2, 0x76, 0x51, + 0x40, 0x3b, 0x34, 0x30, 0x32, 0x3a, 0x44, 0x4a, 0xab, 0xc2, 0xd5, 0xcd, + 0xb4, 0xa8, 0xb6, 0xc9, 0x95, 0x6d, 0x3e, 0x27, 0x28, 0x29, 0x1b, 0x0a, + 0x27, 0x31, 0x25, 0x0c, 0x18, 0x4b, 0x74, 0x7d, 0x95, 0x95, 0x97, 0x9e, + 0xa6, 0xa9, 0xa8, 0xa5, 0x79, 0x7d, 0x82, 0x83, 0x7e, 0x72, 0x65, 0x5c, + 0x53, 0x8d, 0xc1, 0xba, 0x8b, 0x73, 0x8f, 0xb9, 0xc5, 0xca, 0xc7, 0xb6, + 0xa2, 0xa1, 0xb5, 0xcb, 0xb4, 0xb0, 0xa7, 0x98, 0x85, 0x70, 0x5d, 0x52, + 0x68, 0x62, 0x4e, 0x2e, 0x1a, 0x2a, 0x5a, 0x84, 0x89, 0x73, 0x53, 0x3c, + 0x3d, 0x56, 0x77, 0x8f, 0xb4, 0x7c, 0x37, 0x11, 0x15, 0x2a, 0x38, 0x3b, + 0x54, 0x48, 0x4a, 0x56, 0x4c, 0x3d, 0x51, 0x78, 0xae, 0x8f, 0x75, 0x7d, + 0x98, 0x9e, 0x80, 0x5e, 0x56, 0x5b, 0x5d, 0x55, 0x43, 0x30, 0x21, 0x1b, + 0x38, 0x16, 0x21, 0x58, 0x64, 0x44, 0x49, 0x74, 0x9f, 0x8c, 0x79, 0x79, + 0x86, 0x8c, 0x82, 0x76, 0x9c, 0x9b, 0x98, 0x95, 0x91, 0x8d, 0x8b, 0x89, + 0x92, 0x89, 0x7a, 0x6e, 0x6a, 0x6e, 0x76, 0x7c, 0x86, 0x8c, 0x94, 0x9c, + 0x9f, 0x9e, 0x9a, 0x97, 0x87, 0x83, 0x7e, 0x76, 0x6e, 0x67, 0x61, 0x5e, + 0x63, 0x6a, 0x75, 0x7f, 0x84, 0x84, 0x81, 0x7e, 0x5d, 0x58, 0x51, 0x4a, + 0x47, 0x47, 0x4a, 0x4c, 0x67, 0x71, 0x7f, 0x8b, 0x91, 0x91, 0x8d, 0x8a, + 0x81, 0x91, 0xaa, 0xc2, 0xcd, 0xc9, 0xbb, 0xb0, 0xa0, 0x99, 0x93, 0x92, + 0x8f, 0x83, 0x6c, 0x5a, 0x48, 0x4a, 0x4c, 0x4f, 0x52, 0x55, 0x57, 0x59, + 0x5b, 0x5c, 0x60, 0x64, 0x68, 0x6c, 0x6f, 0x71, 0x77, 0x76, 0x74, 0x72, + 0x70, 0x6e, 0x6d, 0x6c, 0x6c, 0x67, 0x63, 0x64, 0x66, 0x62, 0x56, 0x4b, + 0x3e, 0x3c, 0x33, 0x34, 0x53, 0x7e, 0x8e, 0x84, 0xa2, 0x92, 0x77, 0x59, + 0x44, 0x3e, 0x45, 0x4e, 0x6f, 0x73, 0x75, 0x71, 0x62, 0x4d, 0x36, 0x28, + 0x1c, 0x46, 0x69, 0x5f, 0x3d, 0x36, 0x5e, 0x8c, 0x83, 0x4f, 0x19, 0x14, + 0x3d, 0x6d, 0x82, 0x82, 0x70, 0x48, 0x24, 0x2a, 0x4f, 0x68, 0x5e, 0x48, + 0x44, 0x58, 0x6c, 0x6c, 0x5a, 0x46, 0x3d, 0x3d, 0x40, 0x47, 0x55, 0x66, + 0x72, 0x74, 0x6c, 0x64, 0x4e, 0x40, 0x2f, 0x22, 0x22, 0x3f, 0x78, 0xab, + 0xad, 0xa0, 0x93, 0x94, 0x9f, 0xa0, 0x8c, 0x75, 0x6c, 0x67, 0x62, 0x63, + 0x64, 0x5f, 0x54, 0x49, 0x4b, 0x49, 0x45, 0x41, 0x40, 0x41, 0x43, 0x45, + 0x4b, 0x4d, 0x50, 0x46, 0x56, 0x53, 0x1e, 0x09, 0x66, 0x89, 0xb1, 0xbb, + 0xa2, 0x78, 0x55, 0x44, 0x1d, 0x27, 0x35, 0x40, 0x45, 0x41, 0x39, 0x32, + 0x83, 0x95, 0xa2, 0x9a, 0x8a, 0x8f, 0xae, 0xcd, 0xb1, 0xa4, 0x82, 0x4b, + 0x1d, 0x15, 0x34, 0x56, 0x3c, 0x70, 0xa2, 0xba, 0xc8, 0xc5, 0x9c, 0x69, + 0x63, 0xa2, 0xe7, 0xf4, 0xc1, 0x76, 0x3d, 0x24, 0x31, 0x28, 0x1d, 0x18, + 0x1f, 0x31, 0x46, 0x54, 0x4b, 0x41, 0x4b, 0x7b, 0xbb, 0xe2, 0xe0, 0xce, + 0xeb, 0xe4, 0xcd, 0xa5, 0x7e, 0x6e, 0x7a, 0x8c, 0x5d, 0x77, 0x9e, 0xbd, + 0xc7, 0xb8, 0x9e, 0x8b, 0x35, 0x54, 0x75, 0x80, 0x76, 0x70, 0x7a, 0x89, + 0x46, 0x66, 0x94, 0xb6, 0xb9, 0x9d, 0x73, 0x56, 0x48, 0x3f, 0x35, 0x36, + 0x44, 0x59, 0x6b, 0x75, 0x5b, 0x58, 0x67, 0x79, 0x6b, 0x4b, 0x4b, 0x64, + 0x7c, 0x82, 0x85, 0x7a, 0x61, 0x41, 0x26, 0x18, 0x08, 0x14, 0x2a, 0x44, + 0x56, 0x5b, 0x53, 0x49, 0x8c, 0x42, 0x21, 0x42, 0x4b, 0x22, 0x0c, 0x1e, + 0x0c, 0x08, 0x16, 0x3f, 0x72, 0x8c, 0x83, 0x70, 0x85, 0x87, 0x8a, 0x8e, + 0x92, 0x96, 0x99, 0x9b, 0x94, 0x87, 0x76, 0x68, 0x65, 0x6e, 0x7b, 0x85, + 0x88, 0x8d, 0x94, 0x9a, 0x9c, 0x99, 0x95, 0x91, 0xaf, 0xac, 0xa5, 0x9c, + 0x93, 0x8a, 0x83, 0x80, 0x5d, 0x64, 0x6f, 0x79, 0x7e, 0x7e, 0x7a, 0x77, + 0x55, 0x51, 0x4b, 0x45, 0x43, 0x45, 0x48, 0x4b, 0x4e, 0x66, 0x7c, 0x79, + 0x63, 0x54, 0x59, 0x65, 0x84, 0x82, 0x7f, 0x7e, 0x81, 0x8c, 0x99, 0xa3, + 0xc8, 0xc6, 0xc6, 0xcd, 0xd7, 0xde, 0xdf, 0xdd, 0xd6, 0xd2, 0xcb, 0xc2, + 0xb8, 0xaf, 0xa8, 0xa4, 0xa1, 0x9e, 0x99, 0x92, 0x8b, 0x84, 0x7f, 0x7c, + 0x7f, 0x81, 0x84, 0x88, 0x8c, 0x90, 0x93, 0x94, 0x99, 0x91, 0x88, 0x82, + 0x7e, 0x73, 0x62, 0x54, 0x4b, 0x53, 0x52, 0x51, 0x65, 0x81, 0x85, 0x76, + 0x72, 0x7c, 0x8c, 0x9b, 0xa0, 0x97, 0x85, 0x76, 0x59, 0x64, 0x73, 0x7e, + 0x7c, 0x6e, 0x5d, 0x50, 0x67, 0x7f, 0x84, 0x5c, 0x24, 0x13, 0x39, 0x68, + 0xa7, 0x6b, 0x29, 0x17, 0x38, 0x62, 0x76, 0x76, 0x6c, 0x47, 0x2e, 0x42, + 0x70, 0x80, 0x60, 0x37, 0x12, 0x17, 0x28, 0x47, 0x65, 0x70, 0x65, 0x56, + 0x30, 0x3f, 0x53, 0x63, 0x69, 0x69, 0x68, 0x67, 0x6d, 0x47, 0x1f, 0x20, + 0x52, 0x8c, 0xa5, 0xa2, 0xad, 0xa0, 0x90, 0x83, 0x7a, 0x76, 0x7b, 0x82, + 0x72, 0x6d, 0x69, 0x6a, 0x6d, 0x69, 0x5e, 0x53, 0x4b, 0x49, 0x45, 0x41, + 0x40, 0x41, 0x43, 0x45, 0x4c, 0x4c, 0x4e, 0x42, 0x52, 0x51, 0x1e, 0x0a, + 0x88, 0xa8, 0xc4, 0xbd, 0x99, 0x7a, 0x73, 0x7b, 0x5e, 0x7e, 0xab, 0xcc, + 0xce, 0xb1, 0x87, 0x68, 0x74, 0x73, 0x7b, 0x8f, 0xa5, 0xaa, 0x9b, 0x8b, + 0xaa, 0xab, 0xaa, 0xa9, 0xab, 0xb6, 0xc8, 0xd6, 0xfc, 0xe3, 0xa9, 0x71, + 0x6f, 0x97, 0xae, 0xa9, 0x4b, 0x75, 0x93, 0x7a, 0x3f, 0x1c, 0x2c, 0x4c, + 0x76, 0x5f, 0x43, 0x38, 0x4e, 0x83, 0xbf, 0xe7, 0xb6, 0xe1, 0xf6, 0xc5, + 0x6d, 0x3b, 0x4f, 0x79, 0x7b, 0x79, 0x6d, 0x58, 0x48, 0x53, 0x75, 0x94, + 0x7a, 0x80, 0x86, 0x86, 0x7b, 0x67, 0x51, 0x43, 0x37, 0x4b, 0x72, 0xa1, + 0xb7, 0x9c, 0x5b, 0x25, 0x51, 0x87, 0xd4, 0xff, 0xff, 0xd5, 0x88, 0x52, + 0x38, 0x39, 0x39, 0x38, 0x35, 0x2d, 0x22, 0x1b, 0x1c, 0x29, 0x4e, 0x70, + 0x64, 0x38, 0x26, 0x32, 0x2a, 0x3e, 0x4c, 0x40, 0x25, 0x17, 0x22, 0x35, + 0x51, 0x4a, 0x47, 0x4f, 0x5a, 0x59, 0x48, 0x37, 0x19, 0x1c, 0x35, 0x75, + 0xc8, 0xfe, 0xfb, 0xe1, 0x73, 0x5f, 0x4f, 0x55, 0x6a, 0x75, 0x6d, 0x5f, + 0x8c, 0x8c, 0x8a, 0x88, 0x87, 0x85, 0x83, 0x83, 0x7e, 0x6f, 0x5a, 0x4b, + 0x49, 0x55, 0x67, 0x74, 0x7e, 0x82, 0x89, 0x8e, 0x8e, 0x8a, 0x85, 0x81, + 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x69, 0x62, 0x58, 0x4f, + 0x4b, 0x4d, 0x51, 0x54, 0x4d, 0x48, 0x41, 0x3b, 0x37, 0x38, 0x3a, 0x3d, + 0x3c, 0x46, 0x47, 0x37, 0x2b, 0x3d, 0x6d, 0x97, 0xb3, 0xb9, 0xbd, 0xbb, + 0xb5, 0xb2, 0xb3, 0xb7, 0x9a, 0x95, 0x8c, 0x84, 0x7f, 0x7c, 0x7b, 0x7b, + 0x95, 0x98, 0x9d, 0xa3, 0xaa, 0xb1, 0xb6, 0xb9, 0xb6, 0xb7, 0xba, 0xbe, + 0xc1, 0xc5, 0xc8, 0xc9, 0xd0, 0xcf, 0xcc, 0xc9, 0xc6, 0xc2, 0xc0, 0xbe, + 0x9f, 0x9b, 0x97, 0x9a, 0x9d, 0x9a, 0x8f, 0x84, 0x80, 0x74, 0x78, 0x8f, + 0x9a, 0x93, 0x91, 0x9a, 0x9b, 0x82, 0x62, 0x4d, 0x48, 0x48, 0x45, 0x40, + 0x6c, 0x6b, 0x6a, 0x6c, 0x72, 0x7c, 0x85, 0x8b, 0x6b, 0x6f, 0x72, 0x74, + 0x76, 0x7c, 0x86, 0x8e, 0x67, 0x7b, 0x91, 0x99, 0x8e, 0x7a, 0x68, 0x5f, + 0x47, 0x44, 0x40, 0x3c, 0x36, 0x2b, 0x1e, 0x15, 0x29, 0x1d, 0x1c, 0x35, + 0x59, 0x6a, 0x5d, 0x49, 0x4f, 0x53, 0x52, 0x4a, 0x43, 0x4b, 0x60, 0x74, + 0x9a, 0x9c, 0x87, 0x65, 0x5b, 0x69, 0x6d, 0x61, 0x65, 0x6d, 0x7f, 0x90, + 0x8b, 0x78, 0x6f, 0x72, 0x6f, 0x6b, 0x69, 0x6d, 0x72, 0x70, 0x67, 0x5e, + 0x4d, 0x4b, 0x47, 0x43, 0x42, 0x43, 0x45, 0x47, 0x4d, 0x4c, 0x4c, 0x3f, + 0x4f, 0x4f, 0x1d, 0x0b, 0x3f, 0x6d, 0xaa, 0xd2, 0xce, 0xa5, 0x71, 0x4e, + 0x3b, 0x36, 0x2e, 0x28, 0x26, 0x28, 0x2c, 0x2f, 0x41, 0x7d, 0xbd, 0xce, + 0xb6, 0xa2, 0xad, 0xc4, 0x9d, 0x8d, 0x85, 0x94, 0xa8, 0xa4, 0x80, 0x5c, + 0x45, 0x4f, 0x4d, 0x4b, 0x66, 0x89, 0x83, 0x63, 0x6f, 0x98, 0xbd, 0xb8, + 0x94, 0x79, 0x7f, 0x92, 0x6d, 0x63, 0x57, 0x55, 0x63, 0x7f, 0x9e, 0xb3, + 0xda, 0x89, 0x44, 0x54, 0x98, 0xad, 0x6f, 0x22, 0x29, 0x49, 0x71, 0x8a, + 0x95, 0xa1, 0xb4, 0xc6, 0xdb, 0xc7, 0xa7, 0x86, 0x6c, 0x5e, 0x59, 0x59, + 0x63, 0x48, 0x31, 0x3c, 0x66, 0x93, 0xac, 0xb3, 0x9f, 0xad, 0xbd, 0xbf, + 0xab, 0x82, 0x55, 0x37, 0x9f, 0x69, 0x29, 0x0b, 0x12, 0x23, 0x26, 0x21, + 0x35, 0x1f, 0x17, 0x1d, 0x1c, 0x21, 0x4c, 0x82, 0x8d, 0x94, 0x96, 0x88, + 0x6e, 0x57, 0x4a, 0x48, 0x6d, 0x50, 0x32, 0x2e, 0x44, 0x5b, 0x62, 0x5f, + 0x39, 0x3a, 0x3e, 0x4b, 0x59, 0x55, 0x35, 0x14, 0x63, 0x50, 0x39, 0x2e, + 0x32, 0x3c, 0x43, 0x45, 0x88, 0x8a, 0x8e, 0x92, 0x97, 0x9c, 0x9f, 0xa1, + 0xaa, 0x95, 0x75, 0x59, 0x4c, 0x50, 0x5d, 0x68, 0x78, 0x7c, 0x82, 0x86, + 0x86, 0x81, 0x7b, 0x76, 0x62, 0x63, 0x65, 0x68, 0x6b, 0x6e, 0x70, 0x72, + 0x7d, 0x75, 0x69, 0x5d, 0x56, 0x54, 0x56, 0x58, 0x55, 0x4f, 0x46, 0x3e, + 0x38, 0x36, 0x37, 0x39, 0x4c, 0x40, 0x3d, 0x55, 0x79, 0x8c, 0x84, 0x74, + 0x8d, 0x99, 0xa5, 0xa6, 0x9d, 0x93, 0x8f, 0x90, 0x97, 0x9d, 0xa5, 0xac, + 0xaf, 0xb2, 0xb5, 0xb8, 0xc4, 0xc2, 0xbe, 0xb9, 0xb4, 0xaf, 0xab, 0xa9, + 0xab, 0xa9, 0xa4, 0x9e, 0x98, 0x92, 0x8d, 0x8b, 0x80, 0x7d, 0x78, 0x70, + 0x68, 0x61, 0x5b, 0x58, 0x5f, 0x5c, 0x5c, 0x63, 0x6b, 0x6d, 0x65, 0x5d, + 0x4e, 0x44, 0x50, 0x73, 0x8a, 0x84, 0x79, 0x78, 0x97, 0x8f, 0x8b, 0x94, + 0x9e, 0x99, 0x82, 0x6c, 0x6b, 0x63, 0x58, 0x51, 0x53, 0x5c, 0x69, 0x72, + 0x6e, 0x68, 0x67, 0x6f, 0x79, 0x77, 0x68, 0x59, 0x5d, 0x7c, 0x9d, 0xa3, + 0x92, 0x85, 0x8b, 0x98, 0xa5, 0xa1, 0x95, 0x81, 0x6f, 0x6c, 0x78, 0x85, + 0x79, 0x6f, 0x62, 0x5a, 0x5a, 0x5b, 0x5a, 0x58, 0x4f, 0x53, 0x4d, 0x36, + 0x1c, 0x15, 0x25, 0x38, 0x43, 0x8f, 0xbd, 0x9a, 0x68, 0x61, 0x73, 0x7c, + 0x8b, 0x78, 0x74, 0x86, 0x90, 0x82, 0x70, 0x6b, 0x64, 0x61, 0x61, 0x68, + 0x70, 0x71, 0x6a, 0x62, 0x51, 0x4e, 0x4a, 0x46, 0x45, 0x46, 0x48, 0x4a, + 0x4e, 0x4c, 0x4a, 0x3c, 0x4c, 0x4d, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c}; + +/* + Initialization- and return-value-related functions +*/ + +void +mpeg2_init(void) { + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &mpeg2_oldorgframe[0]; + __pragma_loopbound(90112, 90112); + for (i = 0; i < sizeof(mpeg2_oldorgframe); ++i, ++p) + *p ^= bitmask; +} + +int +mpeg2_return(void) { + int checksum = 0; + int i, j, k, l; + + __pragma_loopbound(352, 352); + for (i = 0; i < 352; i++) { + j = 0; + __pragma_loopbound(2, 2); + for (; j < 2; j++) { + k = 0; + __pragma_loopbound(2, 2); + for (; k < 2; k++) { + l = 0; + __pragma_loopbound(2, 2); + for (; l < 2; l++) + checksum += mpeg2_mbinfo[i].MV[j][k][l]; + } + } + } + + return (checksum); +} + +/* + Algorithm core functions +*/ + +/* + motion estimation for progressive and interlaced frame pictures + + oldorg: source frame for forward prediction (used for P and B frames) + neworg: source frame for backward prediction (B frames only) + oldref: reconstructed frame for forward prediction (P and B frames) + newref: reconstructed frame for backward prediction (B frames only) + cur: current frame (the one for which the prediction is formed) + sxf,syf: forward search window (frame coordinates) + sxb,syb: backward search window (frame coordinates) + mbi: pointer to macroblock info structure + + results: + mbi-> + mb_type: 0, MB_INTRA, MB_FORWARD, MB_BACKWARD, MB_FORWARD|MB_BACKWARD + MV[][][]: motion vectors (frame format) + mv_field_sel: top/bottom field (for field prediction) + motion_type: MC_FRAME, MC_FIELD + + uses global vars: mpeg2_pict_type, frame_pred_dct +*/ +void +mpeg2_motion_estimation(unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, + unsigned char *cur, unsigned char *curref, int sxf, + int syf, int sxb, int syb, struct mbinfo *mbi, + int secondfield, int ipflag) { + int i, j; + + /* loop through all macroblocks of the picture */ + __pragma_loopbound(16, 16); + for (j = 0; j < mpeg2_height2; j += 16) { + i = 0; + __pragma_loopbound(22, 22); + for (; i < mpeg2_width; i += 16) { + if (mpeg2_pict_struct == 3) + mpeg2_frame_ME(oldorg, neworg, oldref, newref, cur, i, j, sxf, + syf, sxb, syb, mbi); + else + mpeg2_field_ME(oldorg, neworg, oldref, newref, cur, curref, i, + j, sxf, syf, sxb, syb, mbi, secondfield, ipflag); + mbi++; + } + } +} + +void +mpeg2_frame_ME(unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, unsigned char *cur, + int i, int j, int sxf, int syf, int sxb, int syb, + struct mbinfo *mbi) { + int imin, jmin, iminf, jminf, iminr, jminr; + int imint, jmint, iminb, jminb; + int imintf, jmintf, iminbf, jminbf; + int imintr, jmintr, iminbr, jminbr; + int var, v0; + int dmc, dmcf, dmcr, dmci, vmc, vmcf, vmcr, vmci; + int dmcfield, dmcfieldf, dmcfieldr, dmcfieldi; + int tsel, bsel, tself, bself, tselr, bselr; + unsigned char *mb; + int imins[2][2], jmins[2][2]; + int imindp, jmindp, imindmv, jmindmv, dmc_dp, vmc_dp; + + mb = cur + i + mpeg2_width * j; + + var = mpeg2_variance(mb, mpeg2_width); + + if (mpeg2_pict_type == 1) + mbi->mb_type = 1; + else + + if (mpeg2_pict_type == 2) { + if (mpeg2_frame_pred_dct) { + dmc = mpeg2_fullsearch(oldorg, oldref, mb, mpeg2_width, i, j, sxf, + syf, 16, mpeg2_width, mpeg2_height, &imin, + &jmin); + vmc = mpeg2_dist2(oldref + (imin >> 1) + mpeg2_width * (jmin >> 1), + mb, mpeg2_width, imin & 1, jmin & 1, 16); + mbi->motion_type = 2; + } else { + mpeg2_frame_estimate(oldorg, oldref, mb, i, j, sxf, syf, &imin, + &jmin, &imint, &jmint, &iminb, &jminb, &dmc, + &dmcfield, &tsel, &bsel, imins, jmins); + + if (mpeg2_M == 1) + mpeg2_dpframe_estimate(oldref, mb, i, j >> 1, imins, jmins, + &imindp, &jmindp, &imindmv, &jmindmv, + &dmc_dp, &vmc_dp); + + /* select between dual prime, frame and field prediction */ + if ((mpeg2_M == 1) && (dmc_dp < dmc) && (dmc_dp < dmcfield)) { + mbi->motion_type = 3; + dmc = dmc_dp; + vmc = vmc_dp; + } else + + if (dmc <= dmcfield) { + mbi->motion_type = 2; + vmc = mpeg2_dist2(oldref + (imin >> 1) + + mpeg2_width * (jmin >> 1), + mb, mpeg2_width, imin & 1, jmin & 1, 16); + } else { + mbi->motion_type = 1; + dmc = dmcfield; + vmc = mpeg2_dist2( + oldref + (tsel ? mpeg2_width : 0) + (imint >> 1) + + (mpeg2_width << 1) * (jmint >> 1), + mb, mpeg2_width << 1, imint & 1, jmint & 1, 8); + vmc += mpeg2_dist2(oldref + (bsel ? mpeg2_width : 0) + + (iminb >> 1) + + (mpeg2_width << 1) * (jminb >> 1), + mb + mpeg2_width, mpeg2_width << 1, + iminb & 1, jminb & 1, 8); + } + } + + /* + select between intra or non-intra coding: + + selection is based on intra block variance (var) vs. + prediction error variance (vmc) + + blocks with small prediction error are always coded non-intra + even if variance is smaller (is this reasonable?) + */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + /* + select between MC / No-MC + + use No-MC if var(No-MC) <= 1.25*var(MC) + (i.e slightly biased towards No-MC) + + blocks with small prediction error are always coded as No-MC + (requires no motion vectors, allows skipping) + */ + v0 = mpeg2_dist2(oldref + i + mpeg2_width * j, mb, mpeg2_width, 0, + 0, 16); + + if ((4 * v0 > 5 * vmc) && (v0 >= 9 * 256)) { + /* use MC */ + var = vmc; + mbi->mb_type = 8; + + if (mbi->motion_type == 2) { + mbi->MV[0][0][0] = imin - (i << 1); + mbi->MV[0][0][1] = jmin - (j << 1); + } else + + if (mbi->motion_type == 3) { + /* these are FRAME vectors */ + /* same parity vector */ + mbi->MV[0][0][0] = imindp - (i << 1); + mbi->MV[0][0][1] = (jmindp << 1) - (j << 1); + + /* opposite parity vector */ + mbi->dmvector[0] = imindmv; + mbi->dmvector[1] = jmindmv; + } else { + /* these are FRAME vectors */ + mbi->MV[0][0][0] = imint - (i << 1); + mbi->MV[0][0][1] = (jmint << 1) - (j << 1); + mbi->MV[1][0][0] = iminb - (i << 1); + mbi->MV[1][0][1] = (jminb << 1) - (j << 1); + mbi->mv_field_sel[0][0] = tsel; + mbi->mv_field_sel[1][0] = bsel; + } + } else { + /* No-MC */ + var = v0; + mbi->mb_type = 0; + mbi->motion_type = 2; + mbi->MV[0][0][0] = 0; + mbi->MV[0][0][1] = 0; + } + } + } else { /* if (mpeg2_pict_type==B_TYPE) */ + + if (mpeg2_frame_pred_dct) { + /* forward */ + dmcf = mpeg2_fullsearch(oldorg, oldref, mb, mpeg2_width, i, j, sxf, + syf, 16, mpeg2_width, mpeg2_height, &iminf, + &jminf); + vmcf = + mpeg2_dist2(oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + mb, mpeg2_width, iminf & 1, jminf & 1, 16); + + /* backward */ + dmcr = mpeg2_fullsearch(neworg, newref, mb, mpeg2_width, i, j, sxb, + syb, 16, mpeg2_width, mpeg2_height, &iminr, + &jminr); + vmcr = + mpeg2_dist2(newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), + mb, mpeg2_width, iminr & 1, jminr & 1, 16); + + /* interpolated (bidirectional) */ + vmci = mpeg2_bdist2( + oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), mb, + mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16); + + /* decisions */ + + /* + select between forward/backward/interpolated prediction: + use the one with smallest mean sqaured prediction error + */ + if ((vmcf <= vmcr) && (vmcf <= vmci)) { + vmc = vmcf; + mbi->mb_type = 8; + } else + + if (vmcr <= vmci) { + vmc = vmcr; + mbi->mb_type = 4; + } else { + vmc = vmci; + mbi->mb_type = 8 | 4; + } + + mbi->motion_type = 2; + } else { + /* forward prediction */ + mpeg2_frame_estimate(oldorg, oldref, mb, i, j, sxf, syf, &iminf, + &jminf, &imintf, &jmintf, &iminbf, &jminbf, + &dmcf, &dmcfieldf, &tself, &bself, imins, + jmins); + + /* backward prediction */ + mpeg2_frame_estimate(neworg, newref, mb, i, j, sxb, syb, &iminr, + &jminr, &imintr, &jmintr, &iminbr, &jminbr, + &dmcr, &dmcfieldr, &tselr, &bselr, imins, + jmins); + + /* calculate interpolated distance */ + /* frame */ + dmci = mpeg2_bdist1( + oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), mb, + mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16); + + /* top field */ + dmcfieldi = mpeg2_bdist1( + oldref + (imintf >> 1) + (tself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintf >> 1), + newref + (imintr >> 1) + (tselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintr >> 1), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, imintr & 1, + jmintr & 1, 8); + + /* bottom field */ + dmcfieldi += mpeg2_bdist1( + oldref + (iminbf >> 1) + (bself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbf >> 1), + newref + (iminbr >> 1) + (bselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbr >> 1), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, + iminbr & 1, jminbr & 1, 8); + + /* + select prediction type of minimum distance from the + six candidates (field/frame * forward/backward/interpolated) + */ + if ((dmci < dmcfieldi) && (dmci < dmcf) && (dmci < dmcfieldf) && + (dmci < dmcr) && (dmci < dmcfieldr)) { + /* frame, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 2; + vmc = mpeg2_bdist2( + oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), mb, + mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, + 16); + } else + + if ((dmcfieldi < dmcf) && (dmcfieldi < dmcfieldf) && + (dmcfieldi < dmcr) && (dmcfieldi < dmcfieldr)) { + /* field, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 1; + vmc = mpeg2_bdist2( + oldref + (imintf >> 1) + (tself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintf >> 1), + newref + (imintr >> 1) + (tselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintr >> 1), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, imintr & 1, + jmintr & 1, 8); + vmc += mpeg2_bdist2( + oldref + (iminbf >> 1) + (bself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbf >> 1), + newref + (iminbr >> 1) + (bselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbr >> 1), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, + iminbr & 1, jminbr & 1, 8); + } else + + if ((dmcf < dmcfieldf) && (dmcf < dmcr) && (dmcf < dmcfieldr)) { + /* frame, forward */ + mbi->mb_type = 8; + mbi->motion_type = 2; + vmc = mpeg2_dist2(oldref + (iminf >> 1) + + mpeg2_width * (jminf >> 1), + mb, mpeg2_width, iminf & 1, jminf & 1, 16); + } else + + if ((dmcfieldf < dmcr) && (dmcfieldf < dmcfieldr)) { + /* field, forward */ + mbi->mb_type = 8; + mbi->motion_type = 1; + vmc = mpeg2_dist2( + oldref + (tself ? mpeg2_width : 0) + (imintf >> 1) + + (mpeg2_width << 1) * (jmintf >> 1), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, 8); + vmc += mpeg2_dist2(oldref + (bself ? mpeg2_width : 0) + + (iminbf >> 1) + + (mpeg2_width << 1) * (jminbf >> 1), + mb + mpeg2_width, mpeg2_width << 1, + iminbf & 1, jminbf & 1, 8); + } else + + if (dmcr < dmcfieldr) { + /* frame, backward */ + mbi->mb_type = 4; + mbi->motion_type = 2; + vmc = mpeg2_dist2(newref + (iminr >> 1) + + mpeg2_width * (jminr >> 1), + mb, mpeg2_width, iminr & 1, jminr & 1, 16); + } else { + /* field, backward */ + mbi->mb_type = 4; + mbi->motion_type = 1; + vmc = mpeg2_dist2( + newref + (tselr ? mpeg2_width : 0) + (imintr >> 1) + + (mpeg2_width << 1) * (jmintr >> 1), + mb, mpeg2_width << 1, imintr & 1, jmintr & 1, 8); + vmc += mpeg2_dist2(newref + (bselr ? mpeg2_width : 0) + + (iminbr >> 1) + + (mpeg2_width << 1) * (jminbr >> 1), + mb + mpeg2_width, mpeg2_width << 1, + iminbr & 1, jminbr & 1, 8); + } + } + + /* + select between intra or non-intra coding: + + selection is based on intra block variance (var) vs. + prediction error variance (vmc) + + blocks with small prediction error are always coded non-intra + even if variance is smaller (is this reasonable?) + */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + var = vmc; + + if (mbi->motion_type == 2) { + /* forward */ + mbi->MV[0][0][0] = iminf - (i << 1); + mbi->MV[0][0][1] = jminf - (j << 1); + /* backward */ + mbi->MV[0][1][0] = iminr - (i << 1); + mbi->MV[0][1][1] = jminr - (j << 1); + } else { + /* these are FRAME vectors */ + /* forward */ + mbi->MV[0][0][0] = imintf - (i << 1); + mbi->MV[0][0][1] = (jmintf << 1) - (j << 1); + mbi->MV[1][0][0] = iminbf - (i << 1); + mbi->MV[1][0][1] = (jminbf << 1) - (j << 1); + mbi->mv_field_sel[0][0] = tself; + mbi->mv_field_sel[1][0] = bself; + /* backward */ + mbi->MV[0][1][0] = imintr - (i << 1); + mbi->MV[0][1][1] = (jmintr << 1) - (j << 1); + mbi->MV[1][1][0] = iminbr - (i << 1); + mbi->MV[1][1][1] = (jminbr << 1) - (j << 1); + mbi->mv_field_sel[0][1] = tselr; + mbi->mv_field_sel[1][1] = bselr; + } + } + } + + mbi->var = var; +} + +/* + motion estimation for field pictures + + oldorg: original frame for forward prediction (P and B frames) + neworg: original frame for backward prediction (B frames only) + oldref: reconstructed frame for forward prediction (P and B frames) + newref: reconstructed frame for backward prediction (B frames only) + cur: current original frame (the one for which the prediction is formed) + curref: current reconstructed frame (to predict second field from first) + sxf,syf: forward search window (frame coordinates) + sxb,syb: backward search window (frame coordinates) + mbi: pointer to macroblock info structure + secondfield: indicates second field of a frame (in P fields this means + that reference field of opposite parity is in curref instead + of oldref) + ipflag: indicates a P type field which is the second field of a frame + in which the first field is I type (this restricts predictions + to be based only on the opposite parity (=I) field) + + results: + mbi-> + mb_type: 0, MB_INTRA, MB_FORWARD, MB_BACKWARD, MB_FORWARD|MB_BACKWARD + MV[][][]: motion vectors (field format) + mv_field_sel: top/bottom field + motion_type: MC_FIELD, MC_16X8 + + uses global vars: mpeg2_pict_type, mpeg2_pict_struct +*/ +void +mpeg2_field_ME(unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, unsigned char *cur, + unsigned char *curref, int i, int j, int sxf, int syf, int sxb, + int syb, struct mbinfo *mbi, int secondfield, int ipflag) { + int w2; + unsigned char *mb, *toporg, *topref, *botorg, *botref; + int var, vmc, v0, dmcfieldi, dmc8i; + int imin, jmin, imin8u, jmin8u, imin8l, jmin8l, dmcfield, dmc8, sel, sel8u, + sel8l; + int iminf, jminf, imin8uf, jmin8uf, imin8lf, jmin8lf, dmcfieldf, dmc8f, + self, sel8uf, sel8lf; + int iminr, jminr, imin8ur, jmin8ur, imin8lr, jmin8lr, dmcfieldr, dmc8r, + selr, sel8ur, sel8lr; + int imins, jmins, ds, imindmv, jmindmv, vmc_dp, dmc_dp; + + w2 = mpeg2_width << 1; + mb = cur + i + w2 * j; + + if (mpeg2_pict_struct == 2) + mb += mpeg2_width; + + var = mpeg2_variance(mb, w2); + + if (mpeg2_pict_type == 1) + mbi->mb_type = 1; + else + + if (mpeg2_pict_type == 2) { + toporg = oldorg; + topref = oldref; + botorg = oldorg + mpeg2_width; + botref = oldref + mpeg2_width; + + if (secondfield) { + /* opposite parity field is in same frame */ + if (mpeg2_pict_struct == 1) { + /* current is top field */ + botorg = cur + mpeg2_width; + botref = curref + mpeg2_width; + } else { + /* current is bottom field */ + toporg = cur; + topref = curref; + } + } + + mpeg2_field_estimate(toporg, topref, botorg, botref, mb, i, j, sxf, syf, + ipflag, &imin, &jmin, &imin8u, &jmin8u, &imin8l, + &jmin8l, &dmcfield, &dmc8, &sel, &sel8u, &sel8l, + &imins, &jmins, &ds); + + if ((mpeg2_M == 1) && !ipflag) + /* generic condition which permits Dual Prime */ + mpeg2_dpfield_estimate(topref, botref, mb, i, j, imins, jmins, + &imindmv, &jmindmv, &dmc_dp, &vmc_dp); + + /* select between dual prime, field and 16x8 prediction */ + if ((mpeg2_M == 1) && !ipflag && (dmc_dp < dmc8) && + (dmc_dp < dmcfield)) { + /* Dual Prime prediction */ + mbi->motion_type = 3; + vmc = vmc_dp; /* we already calculated L2 error for Dual */ + + } else + + if (dmc8 < dmcfield) { + /* 16x8 prediction */ + mbi->motion_type = 2; + /* upper half block */ + vmc = mpeg2_dist2((sel8u ? botref : topref) + (imin8u >> 1) + + w2 * (jmin8u >> 1), + mb, w2, imin8u & 1, jmin8u & 1, 8); + /* lower half block */ + vmc += mpeg2_dist2((sel8l ? botref : topref) + (imin8l >> 1) + + w2 * (jmin8l >> 1), + mb + 8 * w2, w2, imin8l & 1, jmin8l & 1, 8); + } else { + /* field prediction */ + mbi->motion_type = 1; + vmc = mpeg2_dist2((sel ? botref : topref) + (imin >> 1) + + w2 * (jmin >> 1), + mb, w2, imin & 1, jmin & 1, 16); + } + + /* select between intra and non-intra coding */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + /* + zero MV field prediction from same parity ref. field + (not allowed if ipflag is set) + */ + if (!ipflag) + v0 = mpeg2_dist2(((mpeg2_pict_struct == 2) ? botref : topref) + + i + w2 * j, + mb, w2, 0, 0, 16); + + if (ipflag || ((4 * v0 > 5 * vmc) && (v0 >= 9 * 256))) { + var = vmc; + mbi->mb_type = 8; + + if (mbi->motion_type == 1) { + mbi->MV[0][0][0] = imin - (i << 1); + mbi->MV[0][0][1] = jmin - (j << 1); + mbi->mv_field_sel[0][0] = sel; + } else + + if (mbi->motion_type == 3) { + /* same parity vector */ + mbi->MV[0][0][0] = imins - (i << 1); + mbi->MV[0][0][1] = jmins - (j << 1); + + /* opposite parity vector */ + mbi->dmvector[0] = imindmv; + mbi->dmvector[1] = jmindmv; + } else { + mbi->MV[0][0][0] = imin8u - (i << 1); + mbi->MV[0][0][1] = jmin8u - (j << 1); + mbi->MV[1][0][0] = imin8l - (i << 1); + mbi->MV[1][0][1] = jmin8l - ((j + 8) << 1); + mbi->mv_field_sel[0][0] = sel8u; + mbi->mv_field_sel[1][0] = sel8l; + } + } else { + /* No MC */ + var = v0; + mbi->mb_type = 0; + mbi->motion_type = 1; + mbi->MV[0][0][0] = 0; + mbi->MV[0][0][1] = 0; + mbi->mv_field_sel[0][0] = (mpeg2_pict_struct == 2); + } + } + } else { /* if (mpeg2_pict_type==B_TYPE) */ + /* forward prediction */ + mpeg2_field_estimate(oldorg, oldref, oldorg + mpeg2_width, + oldref + mpeg2_width, mb, i, j, sxf, syf, 0, + &iminf, &jminf, &imin8uf, &jmin8uf, &imin8lf, + &jmin8lf, &dmcfieldf, &dmc8f, &self, &sel8uf, + &sel8lf, &imins, &jmins, &ds); + + /* backward prediction */ + mpeg2_field_estimate(neworg, newref, neworg + mpeg2_width, + newref + mpeg2_width, mb, i, j, sxb, syb, 0, + &iminr, &jminr, &imin8ur, &jmin8ur, &imin8lr, + &jmin8lr, &dmcfieldr, &dmc8r, &selr, &sel8ur, + &sel8lr, &imins, &jmins, &ds); + + /* calculate distances for bidirectional prediction */ + /* field */ + dmcfieldi = mpeg2_bdist1(oldref + (self ? mpeg2_width : 0) + + (iminf >> 1) + w2 * (jminf >> 1), + newref + (selr ? mpeg2_width : 0) + + (iminr >> 1) + w2 * (jminr >> 1), + mb, w2, iminf & 1, jminf & 1, iminr & 1, + jminr & 1, 16); + + /* 16x8 upper half block */ + dmc8i = mpeg2_bdist1(oldref + (sel8uf ? mpeg2_width : 0) + + (imin8uf >> 1) + w2 * (jmin8uf >> 1), + newref + (sel8ur ? mpeg2_width : 0) + + (imin8ur >> 1) + w2 * (jmin8ur >> 1), + mb, w2, imin8uf & 1, jmin8uf & 1, imin8ur & 1, + jmin8ur & 1, 8); + + /* 16x8 lower half block */ + dmc8i += mpeg2_bdist1(oldref + (sel8lf ? mpeg2_width : 0) + + (imin8lf >> 1) + w2 * (jmin8lf >> 1), + newref + (sel8lr ? mpeg2_width : 0) + + (imin8lr >> 1) + w2 * (jmin8lr >> 1), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, + imin8lr & 1, jmin8lr & 1, 8); + + /* select prediction type of minimum distance */ + if ((dmcfieldi < dmc8i) && (dmcfieldi < dmcfieldf) && + (dmcfieldi < dmc8f) && (dmcfieldi < dmcfieldr) && + (dmcfieldi < dmc8r)) { + /* field, interpolated */ + mbi->mb_type = 8 | 5; + mbi->motion_type = 1; + vmc = mpeg2_bdist2(oldref + (self ? mpeg2_width : 0) + + (iminf >> 1) + w2 * (jminf >> 1), + newref + (selr ? mpeg2_width : 0) + + (iminr >> 1) + w2 * (jminr >> 1), + mb, w2, iminf & 1, jminf & 1, iminr & 1, + jminr & 1, 16); + } else + + if ((dmc8i < dmcfieldf) && (dmc8i < dmc8f) && (dmc8i < dmcfieldr) && + (dmc8i < dmc8r)) { + /* 16x8, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 2; + + /* upper half block */ + vmc = mpeg2_bdist2(oldref + (sel8uf ? mpeg2_width : 0) + + (imin8uf >> 1) + w2 * (jmin8uf >> 1), + newref + (sel8ur ? mpeg2_width : 0) + + (imin8ur >> 1) + w2 * (jmin8ur >> 1), + mb, w2, imin8uf & 1, jmin8uf & 1, imin8ur & 1, + jmin8ur & 1, 8); + + /* lower half block */ + vmc += mpeg2_bdist2(oldref + (sel8lf ? mpeg2_width : 0) + + (imin8lf >> 1) + w2 * (jmin8lf >> 1), + newref + (sel8lr ? mpeg2_width : 0) + + (imin8lr >> 1) + w2 * (jmin8lr >> 1), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, + imin8lr & 1, jmin8lr & 1, 8); + } else + + if ((dmcfieldf < dmc8f) && (dmcfieldf < dmcfieldr) && + (dmcfieldf < dmc8r)) { + /* field, forward */ + mbi->mb_type = 8; + mbi->motion_type = 1; + vmc = mpeg2_dist2(oldref + (self ? mpeg2_width : 0) + (iminf >> 1) + + w2 * (jminf >> 1), + mb, w2, iminf & 1, jminf & 1, 16); + } else + + if ((dmc8f < dmcfieldr) && (dmc8f < dmc8r)) { + /* 16x8, forward */ + mbi->mb_type = 8; + mbi->motion_type = 2; + + /* upper half block */ + vmc = mpeg2_dist2(oldref + (sel8uf ? mpeg2_width : 0) + + (imin8uf >> 1) + w2 * (jmin8uf >> 1), + mb, w2, imin8uf & 1, jmin8uf & 1, 8); + + /* lower half block */ + vmc += mpeg2_dist2(oldref + (sel8lf ? mpeg2_width : 0) + + (imin8lf >> 1) + w2 * (jmin8lf >> 1), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, 8); + } else + + if (dmcfieldr < dmc8r) { + /* field, backward */ + mbi->mb_type = 4; + mbi->motion_type = 1; + vmc = mpeg2_dist2(newref + (selr ? mpeg2_width : 0) + (iminr >> 1) + + w2 * (jminr >> 1), + mb, w2, iminr & 1, jminr & 1, 16); + } else { + /* 16x8, backward */ + mbi->mb_type = 4; + mbi->motion_type = 2; + + /* upper half block */ + vmc = mpeg2_dist2(newref + (sel8ur ? mpeg2_width : 0) + + (imin8ur >> 1) + w2 * (jmin8ur >> 1), + mb, w2, imin8ur & 1, jmin8ur & 1, 8); + + /* lower half block */ + vmc += mpeg2_dist2(newref + (sel8lr ? mpeg2_width : 0) + + (imin8lr >> 1) + w2 * (jmin8lr >> 1), + mb + 8 * w2, w2, imin8lr & 1, jmin8lr & 1, 8); + } + + /* select between intra and non-intra coding */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + var = vmc; + + if (mbi->motion_type == 1) { + /* forward */ + mbi->MV[0][0][0] = iminf - (i << 1); + mbi->MV[0][0][1] = jminf - (j << 1); + mbi->mv_field_sel[0][0] = self; + /* backward */ + mbi->MV[0][1][0] = iminr - (i << 1); + mbi->MV[0][1][1] = jminr - (j << 1); + mbi->mv_field_sel[0][1] = selr; + } else { /* MC_16X8 */ + /* forward */ + mbi->MV[0][0][0] = imin8uf - (i << 1); + mbi->MV[0][0][1] = jmin8uf - (j << 1); + mbi->mv_field_sel[0][0] = sel8uf; + mbi->MV[1][0][0] = imin8lf - (i << 1); + mbi->MV[1][0][1] = jmin8lf - ((j + 8) << 1); + mbi->mv_field_sel[1][0] = sel8lf; + /* backward */ + mbi->MV[0][1][0] = imin8ur - (i << 1); + mbi->MV[0][1][1] = jmin8ur - (j << 1); + mbi->mv_field_sel[0][1] = sel8ur; + mbi->MV[1][1][0] = imin8lr - (i << 1); + mbi->MV[1][1][1] = jmin8lr - ((j + 8) << 1); + mbi->mv_field_sel[1][1] = sel8lr; + } + } + } + + mbi->var = var; +} + +/* + frame picture motion estimation + + org: top left pel of source reference frame + ref: top left pel of reconstructed reference frame + mb: macroblock to be matched + i,j: location of mb relative to ref (=center of search window) + sx,sy: half widths of search window + iminp,jminp,dframep: location and value of best frame prediction + imintp,jmintp,tselp: location of best field pred. for top field of mb + iminbp,jminbp,bselp: location of best field pred. for bottom field of mb + dfieldp: value of field prediction +*/ +void +mpeg2_frame_estimate(unsigned char *org, unsigned char *ref, unsigned char *mb, + int i, int j, int sx, int sy, int *iminp, int *jminp, + int *imintp, int *jmintp, int *iminbp, int *jminbp, + int *dframep, int *dfieldp, int *tselp, int *bselp, + int imins[2][2], int jmins[2][2]) { + int dt, db, dmint, dminb; + int imint, iminb, jmint, jminb; + + /* frame prediction */ + *dframep = mpeg2_fullsearch(org, ref, mb, mpeg2_width, i, j, sx, sy, 16, + mpeg2_width, mpeg2_height, iminp, jminp); + + /* predict top field from top field */ + dt = + mpeg2_fullsearch(org, ref, mb, mpeg2_width << 1, i, j >> 1, sx, sy >> 1, + 8, mpeg2_width, mpeg2_height >> 1, &imint, &jmint); + + /* predict top field from bottom field */ + db = mpeg2_fullsearch(org + mpeg2_width, ref + mpeg2_width, mb, + mpeg2_width << 1, i, j >> 1, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &iminb, &jminb); + + imins[0][0] = imint; + jmins[0][0] = jmint; + imins[1][0] = iminb; + jmins[1][0] = jminb; + + /* select prediction for top field */ + if (dt <= db) { + dmint = dt; + *imintp = imint; + *jmintp = jmint; + *tselp = 0; + } else { + dmint = db; + *imintp = iminb; + *jmintp = jminb; + *tselp = 1; + } + + /* predict bottom field from top field */ + dt = mpeg2_fullsearch(org, ref, mb + mpeg2_width, mpeg2_width << 1, i, + j >> 1, sx, sy >> 1, 8, mpeg2_width, + mpeg2_height >> 1, &imint, &jmint); + + /* predict bottom field from bottom field */ + db = + mpeg2_fullsearch(org + mpeg2_width, ref + mpeg2_width, mb + mpeg2_width, + mpeg2_width << 1, i, j >> 1, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &iminb, &jminb); + + imins[0][1] = imint; + jmins[0][1] = jmint; + imins[1][1] = iminb; + jmins[1][1] = jminb; + + /* select prediction for bottom field */ + if (db <= dt) { + dminb = db; + *iminbp = iminb; + *jminbp = jminb; + *bselp = 1; + } else { + dminb = dt; + *iminbp = imint; + *jminbp = jmint; + *bselp = 0; + } + + *dfieldp = dmint + dminb; +} + +/* + field picture motion estimation subroutine + + toporg: address of original top reference field + topref: address of reconstructed top reference field + botorg: address of original bottom reference field + botref: address of reconstructed bottom reference field + mb: macroblock to be matched + i,j: location of mb (=center of search window) + sx,sy: half width/height of search window + + iminp,jminp,selp,dfieldp: location and distance of best field prediction + imin8up,jmin8up,sel8up: location of best 16x8 pred. for upper half of mb + imin8lp,jmin8lp,sel8lp: location of best 16x8 pred. for lower half of mb + d8p: distance of best 16x8 prediction + iminsp,jminsp,dsp: location and distance of best same parity field + prediction (needed for dual prime, only valid if + ipflag==0) +*/ +void +mpeg2_field_estimate(unsigned char *toporg, unsigned char *topref, + unsigned char *botorg, unsigned char *botref, + unsigned char *mb, int i, int j, int sx, int sy, + int ipflag, int *iminp, int *jminp, int *imin8up, + int *jmin8up, int *imin8lp, int *jmin8lp, int *dfieldp, + int *d8p, int *selp, int *sel8up, int *sel8lp, int *iminsp, + int *jminsp, int *dsp) { + int dt, db, imint, jmint, iminb, jminb, notop, nobot; + + /* if ipflag is set, predict from field of opposite parity only */ + notop = ipflag && (mpeg2_pict_struct == 1); + nobot = ipflag && (mpeg2_pict_struct == 2); + + /* field prediction */ + + /* predict current field from top field */ + if (notop) + dt = 65536; /* infinity */ + else + dt = mpeg2_fullsearch(toporg, topref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 16, mpeg2_width, mpeg2_height >> 1, + &imint, &jmint); + + /* predict current field from bottom field */ + if (nobot) + db = 65536; /* infinity */ + else + db = mpeg2_fullsearch(botorg, botref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 16, mpeg2_width, mpeg2_height >> 1, + &iminb, &jminb); + + /* same parity prediction (only valid if ipflag==0) */ + if (mpeg2_pict_struct == 1) { + *iminsp = imint; + *jminsp = jmint; + *dsp = dt; + } else { + *iminsp = iminb; + *jminsp = jminb; + *dsp = db; + } + + /* select field prediction */ + if (dt <= db) { + *dfieldp = dt; + *iminp = imint; + *jminp = jmint; + *selp = 0; + } else { + *dfieldp = db; + *iminp = iminb; + *jminp = jminb; + *selp = 1; + } + + /* 16x8 motion compensation */ + + /* predict upper half field from top field */ + if (notop) + dt = 65536; + else + dt = mpeg2_fullsearch(toporg, topref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, + &imint, &jmint); + + /* predict upper half field from bottom field */ + if (nobot) + db = 65536; + else + db = mpeg2_fullsearch(botorg, botref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, + &iminb, &jminb); + + /* select prediction for upper half field */ + if (dt <= db) { + *d8p = dt; + *imin8up = imint; + *jmin8up = jmint; + *sel8up = 0; + } else { + *d8p = db; + *imin8up = iminb; + *jmin8up = jminb; + *sel8up = 1; + } + + /* predict lower half field from top field */ + if (notop) + dt = 65536; + else + dt = mpeg2_fullsearch(toporg, topref, mb + (mpeg2_width << 4), + mpeg2_width << 1, i, j + 8, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &imint, &jmint); + + /* predict lower half field from bottom field */ + if (nobot) + db = 65536; + else + db = mpeg2_fullsearch(botorg, botref, mb + (mpeg2_width << 4), + mpeg2_width << 1, i, j + 8, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &iminb, &jminb); + + /* select prediction for lower half field */ + if (dt <= db) { + *d8p += dt; + *imin8lp = imint; + *jmin8lp = jmint; + *sel8lp = 0; + } else { + *d8p += db; + *imin8lp = iminb; + *jmin8lp = jminb; + *sel8lp = 1; + } +} + +void +mpeg2_dpframe_estimate(unsigned char *ref, unsigned char *mb, int i, int j, + int iminf[2][2], int jminf[2][2], int *iminp, int *jminp, + int *imindmvp, int *jmindmvp, int *dmcp, int *vmcp) { + int pref, ppred, delta_x, delta_y; + int is, js, it, jt, ib, jb, it0, jt0, ib0, jb0; + int imins = 0, jmins = 0, imint = 0, jmint = 0, iminb = 0, jminb = 0, + imindmv = 0, jmindmv = 0; + int vmc, local_dist; + + /* + Calculate Dual Prime distortions for 9 delta candidates + for each of the four minimum field vectors + Note: only for P pictures! + */ + + /* initialize minimum dual prime distortion to large value */ + vmc = 1 << 30; + + __pragma_loopbound(2, 2); + for (pref = 0; pref < 2; pref++) { + ppred = 0; + __pragma_loopbound(2, 2); + for (; ppred < 2; ppred++) { + /* + convert Cartesian absolute to relative motion vector + values (wrt current macroblock address (i,j) + */ + is = iminf[pref][ppred] - (i << 1); + js = jminf[pref][ppred] - (j << 1); + + if (pref != ppred) { + /* vertical field shift adjustment */ + if (ppred == 0) + js++; + else + js--; + + /* mvxs and mvys scaling*/ + is <<= 1; + js <<= 1; + if (mpeg2_topfirst == ppred) { + /* second field: scale by 1/3 */ + is = (is >= 0) ? (is + 1) / 3 : -((-is + 1) / 3); + js = (js >= 0) ? (js + 1) / 3 : -((-js + 1) / 3); + } else + continue; + } + + /* vector for prediction from field of opposite 'parity' */ + if (mpeg2_topfirst) { + /* vector for prediction of top field from bottom field */ + it0 = ((is + (is > 0)) >> 1); + jt0 = ((js + (js > 0)) >> 1) - 1; + + /* vector for prediction of bottom field from top field */ + ib0 = ((3 * is + (is > 0)) >> 1); + jb0 = ((3 * js + (js > 0)) >> 1) + 1; + } else { + /* vector for prediction of top field from bottom field */ + it0 = ((3 * is + (is > 0)) >> 1); + jt0 = ((3 * js + (js > 0)) >> 1) - 1; + + /* vector for prediction of bottom field from top field */ + ib0 = ((is + (is > 0)) >> 1); + jb0 = ((js + (js > 0)) >> 1) + 1; + } + + /* convert back to absolute half-pel field picture coordinates */ + is += i << 1; + js += j << 1; + it0 += i << 1; + jt0 += j << 1; + ib0 += i << 1; + jb0 += j << 1; + + if ((is >= 0) && (is <= (mpeg2_width - 16) << 1) && (js >= 0) && + (js <= (mpeg2_height - 16))) { + __pragma_loopbound(3, 3); + for (delta_y = -1; delta_y <= 1; delta_y++) { + delta_x = -1; + __pragma_loopbound(3, 3); + for (; delta_x <= 1; delta_x++) { + /* opposite field coordinates */ + it = it0 + delta_x; + jt = jt0 + delta_y; + ib = ib0 + delta_x; + jb = jb0 + delta_y; + + if ((it >= 0) && (it <= (mpeg2_width - 16) << 1) && + (jt >= 0) && (jt <= (mpeg2_height - 16)) && + (ib >= 0) && (ib <= (mpeg2_width - 16) << 1) && + (jb >= 0) && (jb <= (mpeg2_height - 16))) { + /* compute prediction error */ + local_dist = mpeg2_bdist2( + ref + (is >> 1) + + (mpeg2_width << 1) * (js >> 1), + ref + mpeg2_width + (it >> 1) + + (mpeg2_width << 1) * (jt >> 1), + mb, /* current mb location */ + mpeg2_width << 1, /* adjacent line distance */ + is & 1, js & 1, it & 1, + jt & 1, /* half-pel flags */ + 8); /* block height */ + local_dist += mpeg2_bdist2( + ref + mpeg2_width + (is >> 1) + + (mpeg2_width << 1) * (js >> 1), + ref + (ib >> 1) + + (mpeg2_width << 1) * (jb >> 1), + mb + mpeg2_width, /* current mb location */ + mpeg2_width << 1, /* adjacent line distance */ + is & 1, js & 1, ib & 1, + jb & 1, /* half-pel flags */ + 8); /* block height */ + + /* update delta with least distortion vector */ + if (local_dist < vmc) { + imins = is; + jmins = js; + imint = it; + jmint = jt; + iminb = ib; + jminb = jb; + imindmv = delta_x; + jmindmv = delta_y; + vmc = local_dist; + } + } + } /* end delta x loop */ + } /* end delta y loop */ + } + } + } + + /* Compute L1 error for decision purposes */ + local_dist = mpeg2_bdist1( + ref + (imins >> 1) + (mpeg2_width << 1) * (jmins >> 1), + ref + mpeg2_width + (imint >> 1) + (mpeg2_width << 1) * (jmint >> 1), + mb, mpeg2_width << 1, imins & 1, jmins & 1, imint & 1, jmint & 1, 8); + local_dist += mpeg2_bdist1( + ref + mpeg2_width + (imins >> 1) + (mpeg2_width << 1) * (jmins >> 1), + ref + (iminb >> 1) + (mpeg2_width << 1) * (jminb >> 1), + mb + mpeg2_width, mpeg2_width << 1, imins & 1, jmins & 1, iminb & 1, + jminb & 1, 8); + + *dmcp = local_dist; + *iminp = imins; + *jminp = jmins; + *imindmvp = imindmv; + *jmindmvp = jmindmv; + *vmcp = vmc; +} + +void +mpeg2_dpfield_estimate(unsigned char *topref, unsigned char *botref, + unsigned char *mb, int i, int j, int imins, int jmins, + int *imindmvp, int *jmindmvp, int *dmcp, int *vmcp) { + unsigned char *sameref, *oppref; + int io0, jo0, io, jo, delta_x, delta_y, mvxs, mvys, mvxo0, mvyo0; + int imino = 0, jmino = 0, imindmv = 0, jmindmv = 0, vmc_dp = 0, + local_dist = 0; + + /* Calculate Dual Prime distortions for 9 delta candidates */ + /* Note: only for P pictures! */ + + /* Assign opposite and same reference pointer */ + if (mpeg2_pict_struct == 1) { + sameref = topref; + oppref = botref; + } else { + sameref = botref; + oppref = topref; + } + + /* + convert Cartesian absolute to relative motion vector + values (wrt current macroblock address (i,j) + */ + mvxs = imins - (i << 1); + mvys = jmins - (j << 1); + + /* vector for prediction from field of opposite 'parity' */ + mvxo0 = (mvxs + (mvxs > 0)) >> 1; /* mvxs // 2 */ + mvyo0 = (mvys + (mvys > 0)) >> 1; /* mvys // 2 */ + + /* vertical field shift correction */ + if (mpeg2_pict_struct == 1) + mvyo0--; + else + mvyo0++; + + /* convert back to absolute coordinates */ + io0 = mvxo0 + (i << 1); + jo0 = mvyo0 + (j << 1); + + /* initialize minimum dual prime distortion to large value */ + vmc_dp = 1 << 30; + + __pragma_loopbound(3, 3); + for (delta_y = -1; delta_y <= 1; delta_y++) { + delta_x = -1; + __pragma_loopbound(3, 3); + for (; delta_x <= 1; delta_x++) { + /* opposite field coordinates */ + io = io0 + delta_x; + jo = jo0 + delta_y; + + if ((io >= 0) && (io <= (mpeg2_width - 16) << 1) && (jo >= 0) && + (jo <= (mpeg2_height2 - 16) << 1)) { + /* compute prediction error */ + local_dist = mpeg2_bdist2( + sameref + (imins >> 1) + mpeg2_width2 * (jmins >> 1), + oppref + (io >> 1) + mpeg2_width2 * (jo >> 1), + mb, /* current mb location */ + mpeg2_width2, /* adjacent line distance */ + imins & 1, jmins & 1, io & 1, jo & 1, /* half-pel flags */ + 16); /* block height */ + + /* update delta with least distortion vector */ + if (local_dist < vmc_dp) { + imino = io; + jmino = jo; + imindmv = delta_x; + jmindmv = delta_y; + vmc_dp = local_dist; + } + } + } /* end delta x loop */ + } /* end delta y loop */ + + /* Compute L1 error for decision purposes */ + *dmcp = mpeg2_bdist1(sameref + (imins >> 1) + mpeg2_width2 * (jmins >> 1), + oppref + (imino >> 1) + mpeg2_width2 * (jmino >> 1), + mb, /* current mb location */ + mpeg2_width2, /* adjacent line distance */ + imins & 1, jmins & 1, imino & 1, + jmino & 1, /* half-pel flags */ + 16); /* block height */ + + *imindmvp = imindmv; + *jmindmvp = jmindmv; + *vmcp = vmc_dp; +} + +/* + full search block matching + + blk: top left pel of (16*h) block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in ref,blk + org: top left pel of source reference picture + ref: top left pel of reconstructed reference picture + i0,j0: center of search window + sx,sy: half widths of search window + xmax,ymax: right/bottom limits of search area + iminp,jminp: pointers to where the result is stored + result is given as half pel offset from ref(0,0) + i.e. NOT relative to (i0,j0) +*/ +int +mpeg2_fullsearch(unsigned char *org, unsigned char *ref, unsigned char *blk, + int lx, int i0, int j0, int sx, int sy, int h, int xmax, + int ymax, int *iminp, int *jminp) { + int i, j, imin, jmin, ilow, ihigh, jlow, jhigh; + int d, dmin; + int k, l, sxy; + + ilow = i0 - sx; + ihigh = i0 + sx; + + if (ilow < 0) + ilow = 0; + + if (ihigh > xmax - 16) + ihigh = xmax - 16; + + jlow = j0 - sy; + jhigh = j0 + sy; + + if (jlow < 0) + jlow = 0; + + if (jhigh > ymax - h) + jhigh = ymax - h; + + /* full pel search, spiraling outwards */ + + imin = i0; + jmin = j0; + dmin = mpeg2_dist1(org + imin + lx * jmin, blk, lx, 0, 0, h, 65536); + + sxy = (sx > sy) ? sx : sy; + + __pragma_loopbound(3, 7); + for (l = 1; l <= sxy; l++) { + i = i0 - l; + j = j0 - l; + __pragma_loopbound(8, 56); + for (k = 0; k < 8 * l; k++) { + if ((i >= ilow) && (i <= ihigh) && (j >= jlow) && (j <= jhigh)) { + d = mpeg2_dist1(org + i + lx * j, blk, lx, 0, 0, h, dmin); + + if (d < dmin) { + dmin = d; + imin = i; + jmin = j; + } + } + + if (k < 2 * l) + i++; + else + + if (k < 4 * l) + j++; + else + + if (k < 6 * l) + i--; + else + j--; + } + } + + /* half pel */ + dmin = 65536; + imin <<= 1; + jmin <<= 1; + ilow = imin - (imin > 0); + ihigh = imin + (imin < ((xmax - 16) << 1)); + jlow = jmin - (jmin > 0); + jhigh = jmin + (jmin < ((ymax - h) << 1)); + + __pragma_loopbound(2, 3); + for (j = jlow; j <= jhigh; j++) { + i = ilow; + __pragma_loopbound(2, 3); + for (; i <= ihigh; i++) { + d = mpeg2_dist1(ref + (i >> 1) + lx * (j >> 1), blk, lx, i & 1, + j & 1, h, dmin); + + if (d < dmin) { + dmin = d; + imin = i; + jmin = j; + } + } + } + + *iminp = imin; + *jminp = jmin; + + return (dmin); +} + +/* + total absolute difference between two (16*h) blocks + including optional half pel interpolation of blk1 (hx,hy) + blk1,blk2: addresses of top left pels of both blocks + lx: distance (in bytes) of vertically adjacent pels + hx,hy: flags for horizontal and/or vertical interpolation + h: height of block (usually 8 or 16) + distlim: bail out if sum exceeds this value +*/ +int +mpeg2_dist1(unsigned char *blk1, unsigned char *blk2, int lx, int hx, int hy, + int h, int distlim) { + unsigned char *p1, *p1a, *p2; + int i, j; + int s, v; + + s = 0; + p1 = blk1; + p2 = blk2; + + if (!hx && !hy) { + __pragma_loopbound(0, 16); + for (j = 0; j < h; j++) { + if ((v = p1[0] - p2[0]) < 0) + v = -v; + s += v; + + if ((v = p1[1] - p2[1]) < 0) + v = -v; + s += v; + + if ((v = p1[2] - p2[2]) < 0) + v = -v; + s += v; + + if ((v = p1[3] - p2[3]) < 0) + v = -v; + s += v; + + if ((v = p1[4] - p2[4]) < 0) + v = -v; + s += v; + + if ((v = p1[5] - p2[5]) < 0) + v = -v; + s += v; + + if ((v = p1[6] - p2[6]) < 0) + v = -v; + s += v; + + if ((v = p1[7] - p2[7]) < 0) + v = -v; + s += v; + + if ((v = p1[8] - p2[8]) < 0) + v = -v; + s += v; + + if ((v = p1[9] - p2[9]) < 0) + v = -v; + s += v; + + if ((v = p1[10] - p2[10]) < 0) + v = -v; + s += v; + + if ((v = p1[11] - p2[11]) < 0) + v = -v; + s += v; + + if ((v = p1[12] - p2[12]) < 0) + v = -v; + s += v; + + if ((v = p1[13] - p2[13]) < 0) + v = -v; + s += v; + + if ((v = p1[14] - p2[14]) < 0) + v = -v; + s += v; + + if ((v = p1[15] - p2[15]) < 0) + v = -v; + s += v; + + if (s >= distlim) + break; + + p1 += lx; + p2 += lx; + } + } else + + if (hx && !hy) { + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + 1) >> 1) - p2[i]; + if (v >= 0) + s += v; + else + s -= v; + } + p1 += lx; + p2 += lx; + } + } else + + if (!hx && hy) { + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1a[i] + 1) >> 1) - p2[i]; + if (v >= 0) + s += v; + else + s -= v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } else { /* if (hx && hy) */ + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + p1a[i] + p1a[i + 1] + + 2) >> + 2) - + p2[i]; + if (v >= 0) + s += v; + else + s -= v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } + + return (s); +} + +/* + total squared difference between two (16*h) blocks + including optional half pel interpolation of blk1 (hx,hy) + blk1,blk2: addresses of top left pels of both blocks + lx: distance (in bytes) of vertically adjacent pels + hx,hy: flags for horizontal and/or vertical interpolation + h: height of block (usually 8 or 16) +*/ +int +mpeg2_dist2(unsigned char *blk1, unsigned char *blk2, int lx, int hx, int hy, + int h) { + unsigned char *p1, *p1a, *p2; + int i, j; + int s, v; + + s = 0; + p1 = blk1; + p2 = blk2; + + if (!hx && !hy) { + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = p1[i] - p2[i]; + s += v * v; + } + p1 += lx; + p2 += lx; + } + } else + + if (hx && !hy) { + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + 1) >> 1) - p2[i]; + s += v * v; + } + p1 += lx; + p2 += lx; + } + } else + + if (!hx && hy) { + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1a[i] + 1) >> 1) - p2[i]; + s += v * v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } else { /* if (hx && hy) */ + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + p1a[i] + p1a[i + 1] + + 2) >> + 2) - + p2[i]; + s += v * v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } + + return (s); +} + +/* + absolute difference error between a (16*h) block and a bidirectional + prediction + + p2: address of top left pel of block + pf,hxf,hyf: address and half pel flags of forward ref. block + pb,hxb,hyb: address and half pel flags of backward ref. block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in p2,pf,pb +*/ +int +mpeg2_bdist1(unsigned char *pf, unsigned char *pb, unsigned char *p2, int lx, + int hxf, int hyf, int hxb, int hyb, int h) { + unsigned char *pfa, *pfb, *pfc, *pba, *pbb, *pbc; + int i, j; + int s, v; + + pfa = pf + hxf; + pfb = pf + lx * hyf; + pfc = pfb + hxf; + + pba = pb + hxb; + pbb = pb + lx * hyb; + pbc = pbb + hxb; + + s = 0; + + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((((unsigned int) (*pf++ + *pfa++ + *pfb++ + *pfc++ + 2) >> 2) + + ((unsigned int) (*pb++ + *pba++ + *pbb++ + *pbc++ + 2) >> 2) + + 1) >> + 1) - + *p2++; + if (v >= 0) + s += v; + else + s -= v; + } + p2 += lx - 16; + pf += lx - 16; + pfa += lx - 16; + pfb += lx - 16; + pfc += lx - 16; + pb += lx - 16; + pba += lx - 16; + pbb += lx - 16; + pbc += lx - 16; + } + + return (s); +} + +/* + squared error between a (16*h) block and a bidirectional + prediction + + p2: address of top left pel of block + pf,hxf,hyf: address and half pel flags of forward ref. block + pb,hxb,hyb: address and half pel flags of backward ref. block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in p2,pf,pb +*/ +int +mpeg2_bdist2(unsigned char *pf, unsigned char *pb, unsigned char *p2, int lx, + int hxf, int hyf, int hxb, int hyb, int h) { + unsigned char *pfa, *pfb, *pfc, *pba, *pbb, *pbc; + int i, j; + int s, v; + + pfa = pf + hxf; + pfb = pf + lx * hyf; + pfc = pfb + hxf; + + pba = pb + hxb; + pbb = pb + lx * hyb; + pbc = pbb + hxb; + + s = 0; + + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((((unsigned int) (*pf++ + *pfa++ + *pfb++ + *pfc++ + 2) >> 2) + + ((unsigned int) (*pb++ + *pba++ + *pbb++ + *pbc++ + 2) >> 2) + + 1) >> + 1) - + *p2++; + s += v * v; + } + p2 += lx - 16; + pf += lx - 16; + pfa += lx - 16; + pfb += lx - 16; + pfc += lx - 16; + pb += lx - 16; + pba += lx - 16; + pbb += lx - 16; + pbc += lx - 16; + } + + return (s); +} + +/* + variance of a (16*16) block, multiplied by 256 + p: address of top left pel of block + lx: distance (in bytes) of vertically adjacent pels +*/ +int +mpeg2_variance(unsigned char *p, int lx) { + int i, j; + unsigned int v, s, s2; + + s = s2 = 0; + + __pragma_loopbound(16, 16); + for (j = 0; j < 16; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = *p++; + s += v; + s2 += v * v; + } + p += lx - 16; + } + + return (s2 - (s * s) / 256); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +mpeg2_main(void) { + mpeg2_motion_estimation(mpeg2_oldorgframe, mpeg2_oldorgframe, + mpeg2_oldorgframe, mpeg2_oldorgframe, + mpeg2_oldorgframe, mpeg2_oldorgframe, 7, 7, 3, 3, + mpeg2_mbinfo, 0, 0); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + mpeg2_init(); + mpeg2_main(); + + return (mpeg2_return() - (-116) != 0); +} diff --git a/targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/inline/mpeg2.c b/targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/inline/mpeg2.c new file mode 100644 index 0000000..94d3a63 --- /dev/null +++ b/targets/wasm-tacle/sequential/mpeg2/generated/modified_sources/inline/mpeg2.c @@ -0,0 +1,9388 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: mpeg2 + + Author: MPEG Software Simulation Group + + Function: This file contains MPEG 2 motion estimation code. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: MPEG-2 + + Changes: For TACLeBench, the code has been changed such that input and + output arrays are scaled down so that the code plus its data fits to the + memories of typical resource-constrained embedded devices. + + License: See the following disclaimer from the original source codes. + + Disclaimer of Warranty + + These software programs are available to the user without any license fee or + royalty on an "as is" basis. The MPEG Software Simulation Group disclaims + any and all warranties, whether express, implied, or statuary, including any + implied warranties or merchantability or of fitness for a particular + purpose. In no event shall the copyright-holder be liable for any + incidental, punitive, or consequential damages of any kind whatsoever + arising from the use of these programs. + + This disclaimer of warranty extends to the user of these programs and user's + customers, employees, agents, transferees, successors, and assigns. + + The MPEG Software Simulation Group does not represent or warrant that the + programs furnished hereunder are free of infringement of any third-party + patents. + + Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, + are subject to royalty fees to patent holders. Many of these patents are + general enough such that they are unavoidable regardless of implementation + design. + +*/ + +/* + Forward declaration of data types +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +struct mbinfo; + +/* + Forward declaration of functions +*/ + +__attribute__((always_inline)) static inline void mpeg2_init(void); +__attribute__((always_inline)) static inline int mpeg2_return(void); +__attribute__((always_inline)) static inline void +mpeg2_motion_estimation(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, int, + int, int, int, struct mbinfo *, int, int); +__attribute__((always_inline)) static inline void +mpeg2_frame_ME(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, int, int, int, int, int, int, + struct mbinfo *); +__attribute__((always_inline)) static inline void +mpeg2_field_ME(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, int, int, int, + int, int, int, struct mbinfo *, int, int); +__attribute__((always_inline)) static inline void +mpeg2_frame_estimate(unsigned char *, unsigned char *, unsigned char *, int, + int, int, int, int *, int *, int *, int *, int *, int *, + int *, int *, int *, int *, int[2][2], int[2][2]); +__attribute__((always_inline)) static inline void +mpeg2_field_estimate(unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, int, int, int, int, int, + int *, int *, int *, int *, int *, int *, int *, int *, + int *, int *, int *, int *, int *, int *); +__attribute__((always_inline)) static inline void +mpeg2_dpframe_estimate(unsigned char *, unsigned char *, int, int, int[2][2], + int[2][2], int *, int *, int *, int *, int *, int *); +__attribute__((always_inline)) static inline void +mpeg2_dpfield_estimate(unsigned char *, unsigned char *, unsigned char *, int, + int, int, int, int *, int *, int *, int *); +__attribute__((always_inline)) static inline int +mpeg2_fullsearch(unsigned char *, unsigned char *, unsigned char *, int, int, + int, int, int, int, int, int, int *, int *); +__attribute__((always_inline)) static inline int +mpeg2_dist1(unsigned char *, unsigned char *, int, int, int, int, int); +__attribute__((always_inline)) static inline int +mpeg2_dist2(unsigned char *, unsigned char *, int, int, int, int); +__attribute__((always_inline)) static inline int +mpeg2_bdist1(unsigned char *, unsigned char *, unsigned char *, int, int, int, + int, int, int); +__attribute__((always_inline)) static inline int +mpeg2_bdist2(unsigned char *, unsigned char *, unsigned char *, int, int, int, + int, int, int); +__attribute__((always_inline)) static inline int mpeg2_variance(unsigned char *, + int); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +mpeg2_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Declaration of global variables +*/ + +struct mbinfo { + int mb_type; + int motion_type; + int dct_type; + int mquant; + int cbp; + int skipped; + int MV[2][2][2]; + int mv_field_sel[2][2]; + int dmvector[2]; + double act; + int var; +}; + +volatile int mpeg2_width = 352; +volatile int mpeg2_height = 256; +volatile int mpeg2_width2 = 352; +volatile int mpeg2_height2 = 256; +volatile int mpeg2_M = 3; +volatile int mpeg2_pict_type = 3; +volatile int mpeg2_pict_struct = 3; +volatile int mpeg2_topfirst = 1; +volatile int mpeg2_frame_pred_dct = 0; +struct mbinfo mpeg2_mbinfo[352]; + +unsigned char mpeg2_oldorgframe[] = { + 0x9f, 0x9d, 0x9b, 0x9d, 0x9f, 0xa1, 0xa2, 0xa3, 0x9e, 0xa2, 0xa5, 0xa5, + 0xa2, 0xa1, 0xa4, 0xa7, 0xa3, 0xa3, 0xa5, 0xa6, 0xa5, 0xa5, 0xa3, 0xa2, + 0x9d, 0xa1, 0xa5, 0xa8, 0xa6, 0xa1, 0x9a, 0x95, 0x8e, 0x7e, 0x7a, 0x78, + 0x70, 0x76, 0x7c, 0x73, 0x7d, 0x7a, 0x7a, 0x79, 0x7b, 0x83, 0x82, 0x74, + 0x64, 0x57, 0x48, 0x5e, 0x7e, 0x84, 0x6f, 0x4a, 0x31, 0x43, 0x61, 0x81, + 0x9b, 0xac, 0xb6, 0xb9, 0xb0, 0xa8, 0x9e, 0x9a, 0x9b, 0xa1, 0xaa, 0xb1, + 0x9d, 0x83, 0x65, 0x49, 0x33, 0x30, 0x34, 0x32, 0x4b, 0x54, 0x68, 0x83, + 0x99, 0x9f, 0x94, 0x87, 0x4f, 0x5e, 0x72, 0x7f, 0x75, 0x52, 0x23, 0x02, + 0x1a, 0x24, 0x24, 0x1b, 0x14, 0x13, 0x1e, 0x30, 0x43, 0x60, 0x7b, 0x8a, + 0x96, 0x9c, 0x97, 0x90, 0x99, 0x99, 0x92, 0x88, 0x7f, 0x80, 0x97, 0xb5, + 0xa0, 0x94, 0x9a, 0x96, 0x66, 0x2d, 0x14, 0x12, 0x15, 0x17, 0x27, 0x1c, + 0x15, 0x1e, 0x25, 0x3b, 0x7a, 0xa2, 0xbe, 0xbf, 0xb2, 0x9f, 0x9e, 0xaf, + 0xba, 0x7b, 0x64, 0x8a, 0xa9, 0xa7, 0xa4, 0xaa, 0xa8, 0xab, 0xad, 0xab, + 0xa7, 0xa6, 0xaa, 0xaf, 0xa4, 0xa6, 0xa9, 0xab, 0xac, 0xac, 0xaa, 0xa9, + 0xa7, 0xaf, 0xba, 0xbc, 0xaf, 0x94, 0x75, 0x60, 0x7a, 0x85, 0x90, 0x9a, + 0xa7, 0xa2, 0x7c, 0x50, 0x2f, 0x48, 0x65, 0x77, 0x7e, 0x8b, 0xa3, 0xb7, + 0xae, 0x95, 0x7a, 0x6f, 0x75, 0x79, 0x73, 0x69, 0x56, 0x63, 0x6e, 0x6e, + 0x6a, 0x6b, 0x72, 0x78, 0x65, 0x67, 0x61, 0x51, 0x3f, 0x36, 0x3b, 0x43, + 0x33, 0x24, 0x25, 0x3d, 0x4d, 0x4b, 0x48, 0x4d, 0x57, 0x4b, 0x42, 0x47, + 0x56, 0x62, 0x63, 0x5f, 0x60, 0x6d, 0x6f, 0x5b, 0x3f, 0x38, 0x4d, 0x67, + 0x4c, 0x3c, 0x2d, 0x2f, 0x3a, 0x3e, 0x33, 0x25, 0x3b, 0x4e, 0x6d, 0x84, + 0x82, 0x75, 0x71, 0x78, 0x7f, 0x78, 0x6c, 0x61, 0x5a, 0x58, 0x5a, 0x5d, + 0x69, 0x64, 0x59, 0x4c, 0x41, 0x3c, 0x3f, 0x43, 0x32, 0x3c, 0x26, 0x26, + 0x2f, 0x2b, 0x2e, 0x1f, 0x34, 0x8e, 0xbb, 0xaf, 0xae, 0xb0, 0xa7, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa5, 0xa4, 0xa5, 0xa7, 0xa7, 0xa5, 0xa4, 0xa0, 0xac, 0xa1, 0x97, + 0xa7, 0xac, 0xa5, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, + 0xa1, 0x95, 0x1d, 0x06, 0x8b, 0x86, 0x87, 0x8e, 0x95, 0x94, 0x90, 0x8d, + 0x92, 0x94, 0x97, 0x9b, 0x9f, 0xa0, 0x9e, 0x9d, 0x99, 0x9b, 0x9e, 0x9d, + 0x98, 0x8e, 0x83, 0x7c, 0x80, 0x7b, 0x76, 0x74, 0x78, 0x83, 0x8f, 0x97, + 0x92, 0x8f, 0x99, 0xaf, 0xb8, 0xa8, 0x99, 0x9b, 0x97, 0xb9, 0xc0, 0xb5, + 0xb2, 0x9e, 0x8a, 0x90, 0xa7, 0xc1, 0x9d, 0x6a, 0x56, 0x4a, 0x48, 0x4c, + 0x58, 0x86, 0xb9, 0xca, 0xb8, 0xa1, 0x9c, 0xa1, 0xbd, 0xc1, 0xba, 0x99, + 0x63, 0x30, 0x11, 0x06, 0x1b, 0x33, 0x5d, 0x7f, 0x91, 0xa7, 0xbf, 0xcb, + 0xbb, 0xb5, 0xb1, 0xb2, 0xb5, 0xb0, 0xa2, 0x95, 0xca, 0xc3, 0xa6, 0x74, + 0x4f, 0x5d, 0x99, 0xd1, 0xcb, 0xbb, 0xb0, 0x95, 0x69, 0x54, 0x52, 0x48, + 0x5a, 0x51, 0x3d, 0x42, 0x5d, 0x64, 0x73, 0x9c, 0x9d, 0x91, 0x96, 0x9f, + 0x9b, 0x98, 0x91, 0x7f, 0x64, 0x41, 0x15, 0x12, 0x39, 0x5f, 0x74, 0x83, + 0x86, 0x80, 0x7b, 0x84, 0x8a, 0x7c, 0x5e, 0x41, 0x36, 0x42, 0x6f, 0xa7, + 0xbb, 0xa8, 0x91, 0x89, 0x88, 0x98, 0xb2, 0xbc, 0xb2, 0xae, 0xb3, 0xb4, + 0xb6, 0xb4, 0xb3, 0xb5, 0xb9, 0xbb, 0xbc, 0xbb, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb5, 0xb4, 0xb3, 0xb2, 0x9d, 0x80, 0x61, 0x5e, 0x79, 0x9c, 0xb3, 0xbb, + 0xca, 0xc1, 0xaf, 0xa3, 0xac, 0xb9, 0xaf, 0x98, 0x6e, 0x48, 0x2b, 0x41, + 0x7a, 0xa5, 0xa7, 0x96, 0x9d, 0x87, 0x6e, 0x65, 0x6c, 0x72, 0x6e, 0x67, + 0x66, 0x78, 0x7d, 0x76, 0x7f, 0x96, 0x99, 0x89, 0x6a, 0x78, 0x87, 0x8a, + 0x80, 0x72, 0x6a, 0x68, 0x56, 0x5a, 0x59, 0x55, 0x55, 0x59, 0x5e, 0x60, + 0x5a, 0x86, 0xb2, 0xb6, 0x92, 0x69, 0x57, 0x57, 0x6a, 0x59, 0x46, 0x3b, + 0x39, 0x34, 0x29, 0x1f, 0x26, 0x25, 0x23, 0x21, 0x21, 0x26, 0x2e, 0x35, + 0x5c, 0x6e, 0x7a, 0x74, 0x6c, 0x6f, 0x77, 0x7c, 0x6a, 0x67, 0x62, 0x5d, + 0x5b, 0x5b, 0x5d, 0x5f, 0x54, 0x50, 0x4c, 0x4d, 0x4f, 0x49, 0x3c, 0x31, + 0x35, 0x24, 0x2d, 0x2f, 0x2e, 0x2a, 0x22, 0x3a, 0x87, 0xaf, 0xb9, 0xab, + 0xac, 0xb0, 0xac, 0xad, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xac, 0xa6, 0xa2, 0xa5, 0xad, 0xb0, 0xac, 0xa6, + 0xb1, 0xaa, 0x9d, 0x99, 0xa5, 0xad, 0xaa, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, 0x97, 0xa2, 0xa5, 0x9b, + 0x93, 0x94, 0x97, 0x96, 0x8c, 0x84, 0x7c, 0x76, 0x73, 0x6f, 0x69, 0x63, + 0x68, 0x6e, 0x79, 0x87, 0x94, 0x9e, 0xa6, 0xa9, 0xaa, 0xac, 0xaf, 0xb3, + 0xb5, 0xb6, 0xb7, 0xb6, 0xaa, 0xab, 0x98, 0x90, 0xa3, 0xab, 0xa5, 0xa7, + 0x9e, 0x91, 0x82, 0x7a, 0x85, 0xa2, 0xbb, 0xc0, 0xba, 0x79, 0x34, 0x26, + 0x35, 0x53, 0x73, 0x75, 0x82, 0x83, 0x87, 0x8b, 0x89, 0x7d, 0x69, 0x59, + 0x27, 0x1c, 0x0f, 0x0c, 0x17, 0x29, 0x39, 0x41, 0x3e, 0x3a, 0x3c, 0x39, + 0x2d, 0x25, 0x21, 0x18, 0x2b, 0x29, 0x2e, 0x42, 0x60, 0x7b, 0x89, 0x8d, + 0xae, 0x89, 0x6b, 0x7a, 0xab, 0xd3, 0xd9, 0xce, 0x92, 0x7e, 0x99, 0xba, + 0xb8, 0xb8, 0xa3, 0x6e, 0x59, 0x67, 0x79, 0x76, 0x5d, 0x4f, 0x4c, 0x46, + 0x5d, 0x6c, 0x73, 0x86, 0x99, 0x7c, 0x48, 0x34, 0x4c, 0x6d, 0x82, 0x81, + 0x7b, 0x6d, 0x63, 0x67, 0x8d, 0x87, 0x77, 0x91, 0xa9, 0xa0, 0x8a, 0x61, + 0x39, 0x1f, 0x32, 0x64, 0x79, 0x6e, 0x59, 0x46, 0x54, 0x74, 0x9f, 0xb7, + 0xb8, 0xb8, 0xb6, 0xac, 0xad, 0xb7, 0xba, 0xa8, 0x8b, 0x79, 0x7c, 0x86, + 0x83, 0x83, 0x84, 0x85, 0x88, 0x8c, 0x90, 0x92, 0x95, 0xa7, 0xbe, 0xcb, + 0xcb, 0xc3, 0xbb, 0xb7, 0x9e, 0xa8, 0xaf, 0xb7, 0xc6, 0xce, 0xba, 0x9d, + 0x5f, 0x55, 0x54, 0x6a, 0x8c, 0x9d, 0x95, 0x85, 0x79, 0x68, 0x56, 0x53, + 0x5f, 0x6a, 0x6d, 0x6b, 0x85, 0x7c, 0x6b, 0x5c, 0x59, 0x56, 0x45, 0x31, + 0x5f, 0x67, 0x6e, 0x70, 0x6c, 0x69, 0x6a, 0x6d, 0x6a, 0x79, 0x76, 0x5c, + 0x52, 0x64, 0x76, 0x7a, 0x6a, 0x63, 0x5d, 0x5f, 0x63, 0x62, 0x58, 0x4e, + 0x3e, 0x3b, 0x37, 0x36, 0x37, 0x37, 0x34, 0x31, 0x3d, 0x3a, 0x3e, 0x53, + 0x6d, 0x7c, 0x78, 0x6f, 0x67, 0x66, 0x5e, 0x58, 0x5b, 0x62, 0x5d, 0x52, + 0x56, 0x57, 0x58, 0x57, 0x54, 0x50, 0x4b, 0x48, 0x4a, 0x4d, 0x4e, 0x45, + 0x39, 0x30, 0x30, 0x34, 0x22, 0x2d, 0x23, 0x29, 0x30, 0x1c, 0x3d, 0x8f, + 0xb2, 0xb3, 0xb0, 0xad, 0xad, 0xaf, 0xad, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xad, 0xab, 0xa4, + 0xa3, 0xa9, 0xa6, 0x9e, 0xa4, 0xa4, 0xa1, 0xa3, 0xa8, 0xa8, 0xa8, 0xb0, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0xa6, 0xa3, 0xa0, 0x9f, 0xa2, 0xa4, 0xa0, 0x9b, 0x89, 0x90, 0x9d, 0xab, + 0xb5, 0xb6, 0xb1, 0xab, 0xa7, 0xa6, 0xa3, 0x9c, 0x92, 0x86, 0x7c, 0x75, + 0x78, 0x79, 0x7b, 0x7c, 0x7c, 0x7a, 0x79, 0x78, 0x8d, 0x95, 0x87, 0x79, + 0x89, 0xa3, 0xae, 0xb2, 0x9e, 0x86, 0x88, 0x95, 0x97, 0x98, 0x7a, 0x42, + 0x12, 0x2d, 0x4a, 0x85, 0xba, 0xbd, 0xac, 0x9f, 0xaf, 0x8c, 0x58, 0x2a, + 0x18, 0x23, 0x3e, 0x54, 0x6e, 0x8b, 0xaa, 0xb5, 0xb5, 0xbb, 0xca, 0xd6, + 0xca, 0xc1, 0xc3, 0xcc, 0xce, 0xc9, 0xb6, 0x9f, 0x88, 0x77, 0x61, 0x52, + 0x48, 0x3d, 0x2e, 0x22, 0x24, 0x32, 0x51, 0x7d, 0xa2, 0xa9, 0x94, 0x7d, + 0x9d, 0x8d, 0x93, 0x93, 0x7b, 0x75, 0x75, 0x5f, 0x33, 0x3f, 0x2c, 0x2d, + 0x61, 0x7e, 0x74, 0x73, 0x52, 0x5f, 0x82, 0x7e, 0x48, 0x3f, 0x78, 0xa7, + 0xa4, 0x94, 0x83, 0x6a, 0x52, 0x5a, 0x78, 0x8a, 0x85, 0x84, 0x7a, 0x7f, + 0x83, 0x82, 0x86, 0x7f, 0x6a, 0x4c, 0x39, 0x3f, 0x51, 0x69, 0x79, 0x7a, + 0x71, 0x6e, 0x77, 0x81, 0x80, 0x78, 0x69, 0x57, 0x4a, 0x4a, 0x54, 0x70, + 0x94, 0xae, 0xb7, 0xb6, 0xb1, 0xb0, 0xb0, 0xb1, 0xb4, 0xb9, 0xbe, 0xc0, + 0xba, 0xc3, 0xbe, 0x9f, 0x7a, 0x71, 0x8b, 0xab, 0xc3, 0xc2, 0xb6, 0xa7, + 0xa4, 0xa6, 0x97, 0x80, 0x6c, 0x6f, 0x64, 0x49, 0x37, 0x4c, 0x85, 0xb8, + 0xc4, 0xae, 0x91, 0x7b, 0x6f, 0x68, 0x5f, 0x58, 0x4a, 0x2c, 0x26, 0x3f, + 0x46, 0x33, 0x32, 0x46, 0x57, 0x62, 0x72, 0x7e, 0x83, 0x82, 0x7e, 0x7b, + 0x89, 0x92, 0x8f, 0x7a, 0x68, 0x60, 0x59, 0x51, 0x2c, 0x3f, 0x48, 0x37, + 0x22, 0x2c, 0x59, 0x86, 0x71, 0x57, 0x42, 0x4b, 0x70, 0x96, 0xa7, 0xa9, + 0x7d, 0x7d, 0x7e, 0x7d, 0x7b, 0x79, 0x76, 0x74, 0x73, 0x5c, 0x4a, 0x4d, + 0x57, 0x5a, 0x58, 0x57, 0x53, 0x51, 0x4e, 0x4c, 0x4b, 0x4c, 0x4d, 0x4e, + 0x50, 0x45, 0x37, 0x2d, 0x2a, 0x2a, 0x2c, 0x2c, 0x20, 0x27, 0x28, 0x26, + 0x1d, 0x41, 0x91, 0xb8, 0xad, 0xa5, 0xab, 0xb2, 0xac, 0xaa, 0xac, 0xa6, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xae, 0xa4, 0xa5, 0xaf, 0xb0, 0xa8, 0xa8, 0xb1, 0xa9, 0xa6, 0x9e, 0xa4, + 0xb0, 0xa9, 0xa0, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, + 0xa1, 0x95, 0x1d, 0x06, 0xa8, 0x9c, 0x9a, 0xa1, 0x9b, 0x8b, 0x86, 0x8f, + 0xa6, 0xa6, 0xa6, 0xa3, 0xa0, 0xa0, 0xa3, 0xa6, 0xad, 0xa9, 0xa4, 0xa1, + 0xa3, 0xa9, 0xb2, 0xb7, 0xaf, 0xaf, 0xad, 0xa9, 0xa4, 0x9e, 0x99, 0x96, + 0x88, 0x75, 0x70, 0x73, 0x6f, 0x72, 0x81, 0x89, 0x94, 0xb7, 0xbf, 0x8e, + 0x4b, 0x27, 0x31, 0x4d, 0x85, 0xa9, 0xb4, 0xb0, 0x99, 0x69, 0x48, 0x3d, + 0x37, 0x49, 0x6b, 0x95, 0xb8, 0xca, 0xcc, 0xc7, 0xc3, 0xc4, 0xbd, 0xb0, + 0xa9, 0xab, 0xac, 0xa9, 0xa4, 0xa0, 0xa4, 0xa9, 0xa9, 0xab, 0xab, 0xa4, + 0x90, 0x8d, 0x8d, 0x96, 0xa2, 0xa6, 0xa0, 0x97, 0x7e, 0x7c, 0x67, 0x3d, + 0x1d, 0x28, 0x5d, 0x8f, 0x6f, 0x6e, 0x75, 0x84, 0x8d, 0x82, 0x64, 0x4a, + 0x3e, 0x35, 0x33, 0x38, 0x35, 0x27, 0x26, 0x33, 0x73, 0x6c, 0x3e, 0x21, + 0x3d, 0x62, 0x79, 0x90, 0x80, 0x75, 0x6c, 0x5e, 0x51, 0x5e, 0x74, 0x7c, + 0x7d, 0x81, 0x8b, 0x7e, 0x71, 0x73, 0x7a, 0x8d, 0x9c, 0x87, 0x60, 0x4c, + 0x5e, 0x7a, 0x89, 0x8f, 0x92, 0x8b, 0x92, 0x97, 0x82, 0x6a, 0x6a, 0x74, + 0x85, 0x85, 0x82, 0x7e, 0x79, 0x72, 0x6c, 0x68, 0x73, 0x71, 0x6d, 0x6a, + 0x67, 0x64, 0x63, 0x63, 0x6b, 0x64, 0x61, 0x6a, 0x76, 0x79, 0x6f, 0x63, + 0x58, 0x55, 0x46, 0x38, 0x42, 0x5c, 0x6a, 0x68, 0x6f, 0x75, 0x79, 0x76, + 0x71, 0x73, 0x7f, 0x8b, 0x7c, 0x6e, 0x5c, 0x51, 0x4e, 0x51, 0x54, 0x55, + 0x57, 0x44, 0x47, 0x5e, 0x5d, 0x4b, 0x57, 0x79, 0xb3, 0xb0, 0xab, 0xa5, + 0x9d, 0x94, 0x8a, 0x83, 0x8a, 0x73, 0x5e, 0x58, 0x52, 0x48, 0x45, 0x49, + 0x5d, 0x4f, 0x3f, 0x3b, 0x43, 0x4b, 0x4b, 0x48, 0x47, 0x58, 0x74, 0x8e, + 0x92, 0x77, 0x48, 0x23, 0x44, 0x46, 0x4a, 0x51, 0x5b, 0x66, 0x70, 0x75, + 0x5a, 0x56, 0x57, 0x5d, 0x5d, 0x5a, 0x5f, 0x6a, 0x66, 0x66, 0x66, 0x61, + 0x58, 0x4c, 0x40, 0x39, 0x34, 0x30, 0x2c, 0x2b, 0x2c, 0x2c, 0x29, 0x27, + 0x26, 0x1d, 0x30, 0x1c, 0x3c, 0x9c, 0xb4, 0xa9, 0xb0, 0xa7, 0xae, 0xb2, + 0xa6, 0xa8, 0xae, 0xa6, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa3, 0xac, 0xb0, 0xac, 0xa8, 0xaa, 0xaf, 0xb1, + 0xaf, 0xa4, 0xa3, 0xaa, 0xac, 0xa9, 0xaa, 0xab, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, 0x91, 0x9d, 0xa0, 0x93, + 0x85, 0x88, 0x99, 0xa8, 0xa1, 0xa5, 0xa7, 0xa5, 0xa1, 0x9f, 0xa2, 0xa6, + 0x98, 0x97, 0x97, 0x99, 0xa0, 0xa9, 0xb2, 0xb8, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb5, 0xb4, 0xb2, 0xb1, 0xbd, 0x9f, 0x9c, 0xa8, 0xa2, 0x92, 0x7a, 0x5d, + 0x5e, 0x38, 0x1b, 0x1b, 0x3f, 0x82, 0xb5, 0xbe, 0x90, 0x80, 0x62, 0x48, + 0x35, 0x49, 0x82, 0x9f, 0xc5, 0xc6, 0xc4, 0xbd, 0xb4, 0xac, 0xa9, 0xa8, + 0xa0, 0xa7, 0xa6, 0x9e, 0x9c, 0xa4, 0xa7, 0xa4, 0x9e, 0x9e, 0xa6, 0xa9, + 0xa3, 0xa2, 0xa6, 0xa3, 0x88, 0x85, 0x85, 0x8e, 0x99, 0x9b, 0x93, 0x8a, + 0x9a, 0x9e, 0xa1, 0x99, 0x84, 0x65, 0x47, 0x33, 0x36, 0x53, 0x69, 0x6d, + 0x64, 0x50, 0x44, 0x49, 0x3e, 0x37, 0x2c, 0x27, 0x2f, 0x42, 0x60, 0x7a, + 0x4c, 0x2d, 0x34, 0x49, 0x3d, 0x34, 0x45, 0x54, 0x67, 0x6f, 0x62, 0x51, + 0x5b, 0x6c, 0x71, 0x73, 0x78, 0x75, 0x81, 0x75, 0x6d, 0x73, 0x6e, 0x7c, + 0x79, 0x68, 0x4d, 0x50, 0x77, 0x8e, 0x8f, 0x91, 0x81, 0x8e, 0x8a, 0x6c, + 0x5d, 0x75, 0x8e, 0x8c, 0x85, 0x88, 0x8b, 0x8d, 0x8b, 0x89, 0x86, 0x85, + 0x85, 0x86, 0x86, 0x85, 0x82, 0x7e, 0x79, 0x76, 0x70, 0x75, 0x79, 0x77, + 0x70, 0x6b, 0x6b, 0x6e, 0x60, 0x6b, 0x6e, 0x68, 0x69, 0x71, 0x6e, 0x61, + 0x6e, 0x68, 0x67, 0x73, 0x82, 0x82, 0x6f, 0x5b, 0x69, 0x5e, 0x4e, 0x41, + 0x3b, 0x3c, 0x41, 0x45, 0x5b, 0x68, 0x6d, 0x66, 0x62, 0x6f, 0x81, 0x8c, + 0x82, 0x77, 0x6c, 0x69, 0x71, 0x7d, 0x85, 0x89, 0x6c, 0x50, 0x42, 0x4f, + 0x5a, 0x57, 0x58, 0x62, 0x32, 0x30, 0x31, 0x38, 0x44, 0x4d, 0x50, 0x50, + 0x46, 0x50, 0x53, 0x45, 0x32, 0x30, 0x43, 0x59, 0x2b, 0x45, 0x62, 0x69, + 0x59, 0x41, 0x31, 0x2b, 0x3d, 0x4a, 0x54, 0x57, 0x59, 0x5e, 0x5c, 0x56, + 0x58, 0x5b, 0x5d, 0x5c, 0x55, 0x49, 0x3d, 0x35, 0x25, 0x2c, 0x31, 0x2e, + 0x25, 0x20, 0x22, 0x26, 0x23, 0x20, 0x27, 0x37, 0x81, 0xbb, 0xad, 0xb0, + 0xab, 0xa5, 0xaa, 0xae, 0xa8, 0xac, 0xaf, 0xa4, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xac, 0xac, 0xa5, 0x9e, + 0xa7, 0xb2, 0xab, 0x99, 0x8e, 0x7d, 0x88, 0x9a, 0x9a, 0xa7, 0xb3, 0xa6, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x97, 0x9a, 0x91, 0x82, 0x87, 0x9d, 0xa6, 0x9f, 0xa3, 0xa1, 0x9f, 0x9d, + 0x9d, 0x9f, 0xa3, 0xa7, 0xac, 0xae, 0xb0, 0xab, 0x9d, 0x89, 0x75, 0x68, + 0x68, 0x65, 0x61, 0x62, 0x69, 0x76, 0x84, 0x8d, 0x9f, 0x9f, 0xa9, 0xaf, + 0x9b, 0x71, 0x44, 0x26, 0x20, 0x2b, 0x73, 0xb5, 0xc1, 0xc5, 0xa8, 0x62, + 0x51, 0x64, 0x59, 0x6b, 0xa2, 0xbe, 0xbe, 0xb8, 0xa6, 0xa6, 0xa4, 0xa2, + 0xa1, 0xa3, 0xa5, 0xa7, 0xa5, 0xa7, 0x9f, 0x92, 0x93, 0xa2, 0xaa, 0xa7, + 0x9b, 0x98, 0x9d, 0xa2, 0xa1, 0xa6, 0xab, 0xa8, 0x92, 0x85, 0x76, 0x6f, + 0x71, 0x71, 0x6c, 0x65, 0x75, 0x82, 0x91, 0x95, 0x89, 0x72, 0x5a, 0x4c, + 0x36, 0x36, 0x41, 0x48, 0x42, 0x3c, 0x34, 0x26, 0x1f, 0x38, 0x24, 0x32, + 0x80, 0x87, 0x44, 0x24, 0x1a, 0x37, 0x3c, 0x2f, 0x2d, 0x2e, 0x2f, 0x36, + 0x45, 0x5a, 0x5f, 0x58, 0x5c, 0x61, 0x63, 0x69, 0x53, 0x4f, 0x50, 0x53, + 0x5b, 0x65, 0x67, 0x69, 0x71, 0x5e, 0x4f, 0x59, 0x73, 0x84, 0x87, 0x87, + 0x80, 0x68, 0x6b, 0x84, 0x87, 0x7a, 0x7b, 0x85, 0x81, 0x83, 0x86, 0x8a, + 0x8e, 0x8d, 0x89, 0x85, 0x84, 0x89, 0x90, 0x95, 0x96, 0x92, 0x8c, 0x88, + 0x7e, 0x6f, 0x63, 0x67, 0x76, 0x7e, 0x78, 0x6e, 0x6f, 0x79, 0x79, 0x6b, + 0x65, 0x69, 0x65, 0x5a, 0x71, 0x7b, 0x86, 0x8b, 0x87, 0x7f, 0x78, 0x75, + 0x7e, 0x73, 0x61, 0x4c, 0x3d, 0x38, 0x3b, 0x3f, 0x4c, 0x5c, 0x5a, 0x4b, + 0x51, 0x6d, 0x7c, 0x76, 0x7a, 0x7b, 0x80, 0x8c, 0x96, 0x94, 0x88, 0x7b, + 0x67, 0x70, 0x81, 0x8f, 0x8c, 0x77, 0x5d, 0x4d, 0x3b, 0x45, 0x4e, 0x4c, + 0x40, 0x34, 0x2e, 0x2e, 0x34, 0x38, 0x41, 0x4d, 0x52, 0x4b, 0x3a, 0x2c, + 0x48, 0x43, 0x3f, 0x40, 0x45, 0x4b, 0x50, 0x52, 0x50, 0x4c, 0x41, 0x3b, + 0x43, 0x51, 0x53, 0x4c, 0x59, 0x51, 0x45, 0x3a, 0x32, 0x30, 0x31, 0x33, + 0x36, 0x2c, 0x22, 0x20, 0x23, 0x25, 0x22, 0x1d, 0x24, 0x20, 0x48, 0x80, + 0x99, 0xa6, 0xb3, 0xb6, 0xa2, 0xa0, 0xa5, 0xad, 0xad, 0xac, 0xac, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa7, 0xad, 0xad, 0x92, 0x74, 0x7a, 0x95, 0x99, 0x9d, 0x9b, 0x8e, + 0x84, 0x8a, 0x9b, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0x9e, 0xa0, 0x9d, 0x9a, + 0xa1, 0x95, 0x1d, 0x06, 0x8b, 0x7f, 0x81, 0x95, 0xa5, 0xa5, 0xa2, 0xa4, + 0xa3, 0xa3, 0xa5, 0xa8, 0xa8, 0xa2, 0x96, 0x8d, 0x5c, 0x56, 0x4f, 0x4d, + 0x55, 0x66, 0x78, 0x84, 0x8f, 0x90, 0x90, 0x8e, 0x86, 0x7b, 0x70, 0x69, + 0x6a, 0x73, 0x75, 0x68, 0x42, 0x1e, 0x41, 0x8e, 0x9a, 0x98, 0xa1, 0xa8, + 0xa7, 0xaa, 0xa0, 0x86, 0x9d, 0x87, 0x80, 0xa5, 0xba, 0xac, 0xa6, 0xa4, + 0xa5, 0xa5, 0xa5, 0xa4, 0xa3, 0xa3, 0xa4, 0xa6, 0xa4, 0xa2, 0x97, 0x8c, + 0x93, 0xa5, 0xa8, 0x9f, 0xa2, 0xa3, 0xaa, 0xac, 0xa3, 0xa1, 0xa3, 0xa0, + 0x8d, 0x76, 0x57, 0x43, 0x3e, 0x40, 0x40, 0x3e, 0x47, 0x43, 0x42, 0x4a, + 0x55, 0x57, 0x4e, 0x43, 0x38, 0x28, 0x36, 0x3a, 0x22, 0x27, 0x35, 0x25, + 0x3a, 0x29, 0x84, 0xaa, 0x52, 0x55, 0x94, 0x7c, 0x89, 0x77, 0x6e, 0x69, + 0x54, 0x39, 0x2c, 0x29, 0x2e, 0x22, 0x26, 0x33, 0x35, 0x38, 0x3f, 0x3e, + 0x40, 0x45, 0x3e, 0x4c, 0x56, 0x58, 0x66, 0x61, 0x5e, 0x53, 0x51, 0x52, + 0x53, 0x67, 0x7f, 0x84, 0x6d, 0x6d, 0x6f, 0x6e, 0x6f, 0x7a, 0x7f, 0x76, + 0x69, 0x68, 0x6d, 0x78, 0x86, 0x8c, 0x88, 0x82, 0x7b, 0x81, 0x8a, 0x8f, + 0x8e, 0x87, 0x7d, 0x76, 0x75, 0x7d, 0x86, 0x88, 0x84, 0x80, 0x80, 0x82, + 0x61, 0x71, 0x78, 0x72, 0x73, 0x7c, 0x7e, 0x76, 0x6f, 0x80, 0x8d, 0x85, + 0x71, 0x6a, 0x79, 0x8b, 0x7b, 0x72, 0x62, 0x50, 0x42, 0x3e, 0x43, 0x49, + 0x3c, 0x37, 0x34, 0x40, 0x5a, 0x75, 0x84, 0x87, 0x87, 0x82, 0x7f, 0x84, + 0x89, 0x85, 0x77, 0x69, 0x62, 0x76, 0x7e, 0x6d, 0x60, 0x60, 0x5e, 0x55, + 0x44, 0x49, 0x48, 0x3c, 0x2d, 0x2c, 0x3a, 0x4a, 0x52, 0x50, 0x49, 0x3e, + 0x35, 0x36, 0x41, 0x4b, 0x3d, 0x4a, 0x54, 0x4e, 0x3f, 0x39, 0x43, 0x51, + 0x51, 0x44, 0x3a, 0x37, 0x35, 0x31, 0x36, 0x3f, 0x39, 0x3a, 0x3c, 0x3b, + 0x38, 0x34, 0x2e, 0x2b, 0x25, 0x26, 0x26, 0x23, 0x21, 0x22, 0x26, 0x2a, + 0x1e, 0x36, 0x8c, 0x9f, 0x9c, 0xae, 0xa0, 0xab, 0xab, 0xaa, 0xab, 0xaf, + 0xab, 0xa4, 0xaa, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa1, 0xa7, 0xa9, 0xa7, 0xad, 0xb9, 0xbb, 0xb3, + 0xb0, 0x8e, 0x41, 0x36, 0x89, 0xb6, 0xa7, 0xa6, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, 0x65, 0x7d, 0x9b, 0xab, + 0xaa, 0xa4, 0xa1, 0xa3, 0xa2, 0x9a, 0x88, 0x6f, 0x5b, 0x54, 0x5c, 0x66, + 0x82, 0x9e, 0xac, 0xb3, 0xbc, 0xb3, 0xb0, 0xc3, 0xb0, 0xac, 0xb7, 0xb2, + 0xa6, 0xbf, 0xc1, 0x94, 0x4e, 0x4c, 0x53, 0x57, 0x44, 0x5b, 0xa5, 0xc8, + 0xb9, 0xab, 0xa2, 0x8f, 0x8d, 0x84, 0x6f, 0x83, 0x97, 0x8a, 0x91, 0xa2, + 0xa6, 0xa7, 0xa6, 0x9d, 0xa6, 0xa5, 0xa4, 0xa2, 0xa1, 0x9f, 0x9e, 0x9d, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xaa, 0x99, 0xa8, + 0xab, 0xa1, 0xa9, 0x8c, 0xa8, 0xaf, 0xa2, 0x6b, 0x35, 0x32, 0x40, 0x39, + 0x30, 0x32, 0x33, 0x31, 0x30, 0x34, 0x3e, 0x46, 0x43, 0x40, 0x3b, 0x35, + 0x31, 0x3e, 0x6d, 0xa2, 0xc2, 0xb3, 0x77, 0x50, 0x84, 0xc4, 0xb3, 0x7d, + 0x99, 0xa7, 0x93, 0xab, 0xcc, 0xc0, 0xb5, 0xa6, 0x77, 0x71, 0x64, 0x4f, + 0x36, 0x22, 0x18, 0x15, 0x25, 0x28, 0x2f, 0x35, 0x33, 0x30, 0x36, 0x3f, + 0x45, 0x46, 0x4f, 0x5b, 0x5e, 0x56, 0x50, 0x4f, 0x4a, 0x53, 0x5a, 0x5b, + 0x5d, 0x64, 0x69, 0x69, 0x5a, 0x60, 0x69, 0x72, 0x78, 0x7b, 0x7c, 0x7c, + 0x83, 0x8b, 0x7b, 0x6d, 0x76, 0x74, 0x64, 0x5f, 0x74, 0x82, 0x81, 0x75, + 0x70, 0x6f, 0x69, 0x62, 0x55, 0x62, 0x75, 0x84, 0x8a, 0x84, 0x79, 0x70, + 0x7a, 0x7e, 0x83, 0x87, 0x89, 0x88, 0x85, 0x83, 0x7b, 0x7e, 0x7b, 0x6a, + 0x51, 0x3f, 0x3a, 0x3c, 0x37, 0x38, 0x3e, 0x4b, 0x5c, 0x69, 0x6f, 0x70, + 0x79, 0x82, 0x86, 0x7d, 0x6c, 0x64, 0x69, 0x72, 0x86, 0x87, 0x80, 0x6c, + 0x52, 0x40, 0x3b, 0x3d, 0x35, 0x42, 0x41, 0x35, 0x3b, 0x5b, 0x78, 0x83, + 0x63, 0x54, 0x43, 0x39, 0x3a, 0x3f, 0x42, 0x42, 0x3e, 0x39, 0x34, 0x33, + 0x34, 0x34, 0x30, 0x2c, 0x2b, 0x30, 0x38, 0x3e, 0x40, 0x3f, 0x3c, 0x3a, + 0x35, 0x34, 0x31, 0x2e, 0x2a, 0x27, 0x24, 0x23, 0x22, 0x23, 0x27, 0x24, + 0x1d, 0x1e, 0x23, 0x20, 0x2f, 0x84, 0x97, 0x90, 0x9d, 0xa2, 0xaa, 0xaf, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa2, 0xa3, 0xac, 0xae, 0xa8, 0xa9, 0xb0, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa6, 0xa6, 0xa5, 0xa5, + 0xa4, 0xa4, 0xa3, 0xa3, 0xa2, 0xa0, 0x9f, 0xa0, 0xa6, 0x94, 0x1b, 0x06, + 0x7f, 0x89, 0x95, 0x99, 0x92, 0x83, 0x73, 0x6a, 0x4c, 0x5b, 0x6f, 0x82, + 0x92, 0xa3, 0xb5, 0xc2, 0xb8, 0xa9, 0xa6, 0xad, 0xa9, 0x9e, 0xa0, 0xa8, + 0x98, 0xa8, 0xa0, 0xa3, 0xb2, 0x8c, 0x52, 0x46, 0x51, 0x5b, 0x81, 0xa4, + 0x83, 0x5d, 0x6f, 0x7c, 0x8b, 0x8f, 0xa0, 0xb2, 0xa7, 0x95, 0xa3, 0xb8, + 0x99, 0x88, 0x8a, 0x9a, 0xa3, 0xaa, 0xaa, 0xa2, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa4, 0xa3, 0xa2, 0xa1, 0x9e, 0x9f, 0xa0, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa6, 0x9d, 0xa5, 0xaa, 0xa8, 0x9f, 0x91, 0x8f, 0xbc, 0xa7, 0x85, 0x8e, + 0xa0, 0x6b, 0x42, 0x62, 0x3a, 0x5f, 0x59, 0x48, 0x4e, 0x42, 0x43, 0x6d, + 0x72, 0x74, 0x7a, 0x87, 0xa8, 0xd5, 0xe3, 0xd1, 0x7e, 0x3a, 0x67, 0xbc, + 0xba, 0xae, 0xa0, 0x6a, 0x88, 0x92, 0x7f, 0x74, 0x84, 0x9b, 0xb4, 0xc4, + 0xc9, 0xcd, 0xcf, 0xcb, 0xc2, 0xba, 0xb6, 0xb6, 0xaa, 0x95, 0x6e, 0x4a, + 0x3c, 0x3a, 0x2f, 0x1e, 0x20, 0x29, 0x2f, 0x31, 0x35, 0x3e, 0x40, 0x3d, + 0x3c, 0x47, 0x4f, 0x4c, 0x49, 0x4f, 0x58, 0x5d, 0x5f, 0x62, 0x63, 0x61, + 0x5f, 0x63, 0x6d, 0x76, 0x6e, 0x62, 0x65, 0x72, 0x6d, 0x5f, 0x64, 0x76, + 0x68, 0x74, 0x76, 0x6f, 0x6e, 0x6f, 0x6a, 0x63, 0x6a, 0x69, 0x67, 0x67, + 0x67, 0x69, 0x6a, 0x6c, 0x7d, 0x7f, 0x81, 0x81, 0x7f, 0x7a, 0x74, 0x71, + 0x7f, 0x82, 0x83, 0x7c, 0x6f, 0x62, 0x5a, 0x57, 0x6a, 0x5d, 0x4d, 0x47, + 0x4e, 0x5d, 0x6d, 0x75, 0x77, 0x79, 0x74, 0x69, 0x61, 0x6c, 0x87, 0x9f, + 0xa5, 0x90, 0x71, 0x56, 0x4a, 0x4b, 0x52, 0x58, 0x48, 0x49, 0x51, 0x60, + 0x69, 0x68, 0x62, 0x5e, 0x3f, 0x45, 0x53, 0x66, 0x77, 0x7b, 0x75, 0x6c, + 0x4b, 0x4f, 0x51, 0x4b, 0x41, 0x3c, 0x3e, 0x43, 0x40, 0x42, 0x43, 0x41, + 0x3d, 0x39, 0x38, 0x38, 0x37, 0x35, 0x32, 0x2d, 0x27, 0x23, 0x1f, 0x1d, + 0x28, 0x1e, 0x20, 0x24, 0x1e, 0x1e, 0x21, 0x1c, 0x7f, 0xaa, 0xaf, 0x99, + 0x97, 0xa6, 0xaf, 0xa8, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa1, 0x74, 0x68, 0x92, + 0xb3, 0xab, 0x9f, 0xa4, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa6, 0xa6, 0xa6, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, 0xa2, 0xa0, 0x9f, 0xa0, + 0xa7, 0x95, 0x1b, 0x06, 0x74, 0x6c, 0x60, 0x59, 0x5f, 0x73, 0x8c, 0x9e, + 0xad, 0xb3, 0xb7, 0xb5, 0xaf, 0xa9, 0xa9, 0xab, 0xa1, 0xa8, 0xae, 0xa9, + 0xa1, 0xa2, 0xa3, 0xa0, 0x9c, 0xae, 0xaf, 0x81, 0x4a, 0x4a, 0x81, 0xb1, + 0x78, 0xa3, 0xbd, 0xae, 0x8a, 0x89, 0x97, 0x7e, 0x6c, 0x6e, 0x7a, 0x9d, + 0x9d, 0x94, 0xa7, 0x9c, 0x8f, 0x90, 0x9b, 0xa4, 0xa1, 0xa1, 0xa7, 0xab, + 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0x97, 0x99, 0x9c, 0xa1, + 0xa5, 0xaa, 0xad, 0xaf, 0xaa, 0xa2, 0xae, 0xa7, 0xa3, 0xa5, 0x98, 0xa3, + 0x95, 0x7e, 0x9c, 0xa2, 0x77, 0x8c, 0xb6, 0xa2, 0x81, 0x9f, 0x88, 0x90, + 0xcf, 0xc8, 0x9c, 0xab, 0xb9, 0xbb, 0xb8, 0xac, 0x9a, 0x7c, 0x4b, 0x1c, + 0x46, 0xa0, 0xca, 0xb4, 0xab, 0xaf, 0xa1, 0x93, 0x79, 0x98, 0xaf, 0x9f, + 0x95, 0xa0, 0xa1, 0xa1, 0xab, 0xac, 0xad, 0xad, 0xae, 0xb2, 0xb9, 0xbf, + 0xc4, 0xc9, 0xce, 0xca, 0xbd, 0xaf, 0xaa, 0xac, 0xa0, 0x89, 0x60, 0x39, + 0x28, 0x2a, 0x2f, 0x2e, 0x2e, 0x31, 0x32, 0x31, 0x32, 0x34, 0x2e, 0x25, + 0x2e, 0x33, 0x39, 0x3e, 0x42, 0x46, 0x4a, 0x4d, 0x46, 0x4d, 0x54, 0x58, + 0x5d, 0x64, 0x62, 0x59, 0x64, 0x66, 0x65, 0x5e, 0x5c, 0x61, 0x63, 0x5f, + 0x63, 0x65, 0x68, 0x6a, 0x6a, 0x69, 0x67, 0x65, 0x5f, 0x62, 0x66, 0x69, + 0x6a, 0x68, 0x65, 0x62, 0x72, 0x73, 0x75, 0x77, 0x74, 0x68, 0x57, 0x4a, + 0x45, 0x38, 0x32, 0x44, 0x66, 0x80, 0x85, 0x80, 0x7e, 0x7c, 0x72, 0x60, + 0x54, 0x5b, 0x75, 0x8c, 0x8c, 0x81, 0x75, 0x72, 0x73, 0x6d, 0x5d, 0x4f, + 0x67, 0x64, 0x71, 0x83, 0x7a, 0x57, 0x40, 0x3f, 0x3f, 0x5c, 0x77, 0x73, + 0x57, 0x3d, 0x38, 0x3e, 0x46, 0x3e, 0x32, 0x2a, 0x2a, 0x30, 0x38, 0x3d, + 0x3d, 0x35, 0x2b, 0x28, 0x2c, 0x30, 0x30, 0x2e, 0x2f, 0x2e, 0x2d, 0x2a, + 0x28, 0x26, 0x24, 0x23, 0x23, 0x24, 0x1f, 0x24, 0x2a, 0x21, 0x30, 0x5b, + 0xa7, 0xa9, 0xa9, 0x90, 0x89, 0xa7, 0xb0, 0x9f, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa7, 0xb0, 0xb4, 0xad, 0xa8, 0xaa, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, + 0xa2, 0xa1, 0x9f, 0xa1, 0xa7, 0x95, 0x1b, 0x06, 0x74, 0x88, 0xa1, 0xb1, + 0xb4, 0xb1, 0xb0, 0xb1, 0xaa, 0xab, 0xa9, 0xa5, 0x9f, 0x9e, 0xa2, 0xa6, + 0x9e, 0xa9, 0xa7, 0xa2, 0xab, 0xad, 0xa1, 0x99, 0xb9, 0xb4, 0x72, 0x40, + 0x71, 0xac, 0x98, 0x67, 0x79, 0x9b, 0xac, 0xa1, 0x8a, 0x92, 0xae, 0xa8, + 0xa7, 0x8a, 0x67, 0x6c, 0x8a, 0xaa, 0xb2, 0x90, 0x9a, 0x94, 0x94, 0x9a, + 0xa1, 0xa5, 0xa5, 0xa1, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa1, 0xa1, 0x9d, 0xa2, 0xae, + 0xaf, 0x9f, 0x98, 0xa4, 0x7d, 0xb4, 0x81, 0x4d, 0x8e, 0xb6, 0x96, 0x8d, + 0x53, 0x86, 0xa2, 0xaf, 0xbc, 0xa6, 0x91, 0xa1, 0xba, 0x9e, 0xa4, 0xd1, + 0xb6, 0x4c, 0x3a, 0x92, 0xbf, 0xb8, 0xaa, 0x9d, 0xa1, 0xab, 0xa2, 0x8b, + 0x95, 0xab, 0xb6, 0xa3, 0x91, 0x9d, 0xab, 0xa8, 0xa3, 0xa5, 0xa8, 0xa9, + 0xa9, 0xa8, 0xa8, 0xa8, 0xac, 0xa9, 0xac, 0xb3, 0xb1, 0xa9, 0xa8, 0xaf, + 0xc6, 0xaf, 0xa4, 0xb6, 0xc9, 0xbd, 0x97, 0x76, 0x61, 0x5f, 0x59, 0x51, + 0x4d, 0x49, 0x3e, 0x32, 0x1e, 0x19, 0x18, 0x20, 0x2c, 0x33, 0x30, 0x2b, + 0x29, 0x2d, 0x2e, 0x31, 0x35, 0x37, 0x44, 0x5a, 0x58, 0x4c, 0x45, 0x45, + 0x46, 0x4c, 0x4c, 0x40, 0x49, 0x4d, 0x52, 0x57, 0x5a, 0x5a, 0x58, 0x56, + 0x59, 0x5c, 0x61, 0x66, 0x68, 0x67, 0x65, 0x64, 0x78, 0x75, 0x75, 0x7a, + 0x7b, 0x6e, 0x54, 0x3f, 0x4b, 0x2e, 0x1c, 0x34, 0x69, 0x93, 0x9b, 0x91, + 0x55, 0x62, 0x6f, 0x71, 0x6e, 0x71, 0x80, 0x8e, 0x9a, 0x89, 0x73, 0x63, + 0x5c, 0x59, 0x56, 0x53, 0x71, 0x71, 0x71, 0x69, 0x57, 0x54, 0x70, 0x94, + 0x77, 0x6a, 0x5b, 0x55, 0x55, 0x54, 0x4d, 0x45, 0x23, 0x2c, 0x3e, 0x58, + 0x70, 0x7d, 0x7d, 0x79, 0x5c, 0x52, 0x44, 0x38, 0x33, 0x33, 0x36, 0x39, + 0x3b, 0x39, 0x34, 0x2f, 0x29, 0x23, 0x1f, 0x1c, 0x21, 0x24, 0x26, 0x29, + 0x21, 0x20, 0x54, 0x9f, 0xa2, 0x99, 0x9f, 0x90, 0x92, 0xb5, 0xb6, 0xa6, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xab, 0xab, 0xa7, 0xa8, 0xac, 0xad, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xa7, 0xa7, 0xa6, + 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0xa1, 0xa0, 0xa1, 0xa8, 0x96, 0x1c, 0x07, + 0xa1, 0xa7, 0xac, 0xab, 0xa5, 0xa2, 0xa3, 0xa7, 0x9d, 0xa0, 0xa3, 0xa4, + 0xa4, 0xa4, 0xa6, 0xa8, 0xa3, 0x9c, 0xa7, 0xaa, 0x99, 0x9b, 0xac, 0xb0, + 0xa6, 0x5f, 0x4e, 0x8d, 0xb0, 0x8f, 0x77, 0x83, 0x9b, 0xa3, 0xa8, 0xac, + 0x95, 0x83, 0x9c, 0xaf, 0xac, 0xb2, 0xa9, 0x83, 0x74, 0x7c, 0x83, 0x97, + 0xae, 0xa4, 0x98, 0x97, 0xa4, 0xac, 0xaa, 0xa5, 0xa3, 0xa3, 0xa3, 0xa4, + 0xa4, 0xa5, 0xa5, 0xa5, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, + 0xa5, 0xae, 0x8f, 0x5f, 0x60, 0x83, 0x91, 0x8b, 0x9d, 0x33, 0x54, 0xb5, + 0xa7, 0x85, 0x92, 0x90, 0x77, 0x88, 0xb8, 0xc3, 0x9b, 0x91, 0xa3, 0x9f, + 0xb4, 0xb2, 0xb0, 0x6f, 0x28, 0x5b, 0xb4, 0xbe, 0xb0, 0xa7, 0xb7, 0xad, + 0x90, 0xa8, 0xaf, 0x75, 0x97, 0xa9, 0xa5, 0xa2, 0x93, 0x90, 0xac, 0xaa, + 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xaa, 0xa8, 0xa6, 0xab, 0xae, 0xac, 0xa9, + 0xad, 0xb0, 0xa4, 0x93, 0x69, 0x7e, 0x9f, 0xb7, 0xba, 0xb0, 0xad, 0xb2, + 0x81, 0xa0, 0xc2, 0xd3, 0xd6, 0xd4, 0xd0, 0xcc, 0xc2, 0xbd, 0xb7, 0xb2, + 0xa7, 0x92, 0x74, 0x5f, 0x37, 0x25, 0x22, 0x28, 0x2c, 0x37, 0x37, 0x23, + 0x32, 0x2c, 0x35, 0x35, 0x26, 0x26, 0x33, 0x33, 0x36, 0x31, 0x2a, 0x28, + 0x2c, 0x38, 0x45, 0x4e, 0x4e, 0x51, 0x55, 0x59, 0x5a, 0x58, 0x55, 0x53, + 0x68, 0x67, 0x69, 0x71, 0x75, 0x6b, 0x54, 0x3f, 0x38, 0x46, 0x64, 0x88, + 0x9a, 0x86, 0x55, 0x2c, 0x56, 0x68, 0x79, 0x79, 0x6b, 0x5c, 0x57, 0x59, + 0x51, 0x53, 0x51, 0x4a, 0x42, 0x40, 0x47, 0x4e, 0x3e, 0x5e, 0x79, 0x79, + 0x71, 0x72, 0x77, 0x78, 0x67, 0x5f, 0x4d, 0x36, 0x27, 0x2b, 0x3f, 0x51, + 0x88, 0x93, 0x9e, 0xa0, 0x99, 0x8f, 0x88, 0x86, 0x7c, 0x78, 0x6a, 0x52, + 0x38, 0x2b, 0x2f, 0x38, 0x35, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2c, 0x2b, + 0x25, 0x1f, 0x27, 0x26, 0x1e, 0x3e, 0x7a, 0x9d, 0x98, 0x99, 0xa0, 0x96, + 0xa1, 0xb7, 0xae, 0xa9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xaa, 0xad, + 0xa7, 0x9e, 0xa1, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, 0xa5, 0xa3, 0xa2, 0xa1, 0xa2, + 0xa8, 0x96, 0x1d, 0x08, 0xa4, 0xa2, 0xa1, 0xa4, 0xa7, 0xa8, 0xa5, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0x9a, 0x96, 0xb0, 0xaa, + 0x8c, 0xa7, 0xb8, 0x88, 0x45, 0x5d, 0xaa, 0xc5, 0x91, 0x88, 0x9e, 0x8d, + 0x6d, 0x8c, 0x9e, 0xa5, 0x99, 0x8f, 0x9d, 0xa0, 0xa7, 0xa4, 0xa9, 0x9b, + 0x92, 0x7a, 0x56, 0x67, 0xa2, 0xa4, 0x9c, 0x99, 0xa1, 0xa6, 0xa4, 0xa2, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa9, 0xa8, 0xa7, 0xa6, + 0xa4, 0xa3, 0xa2, 0xa1, 0xa5, 0xa0, 0xac, 0xaa, 0xa7, 0x8a, 0x5d, 0x64, + 0x2c, 0x8f, 0x92, 0x6c, 0x99, 0xc1, 0xb7, 0xbb, 0xa5, 0x7c, 0x92, 0xa4, + 0x8b, 0xa8, 0xcc, 0xad, 0xbe, 0x9f, 0x49, 0x3d, 0x90, 0xa9, 0x94, 0xaa, + 0xa2, 0xa6, 0xa5, 0xad, 0xbd, 0xb5, 0x99, 0x88, 0x99, 0xb0, 0xa9, 0xb0, + 0xa1, 0x8b, 0xa5, 0xab, 0xaf, 0xaa, 0xa5, 0xa4, 0xa6, 0xa9, 0xaa, 0xaa, + 0xa9, 0xae, 0xaf, 0xab, 0xa5, 0xa3, 0xa6, 0xa8, 0xba, 0xaa, 0x97, 0x94, + 0xa4, 0xaf, 0xa2, 0x8c, 0x91, 0xa0, 0xad, 0xad, 0xaa, 0xad, 0xb2, 0xb5, + 0xbc, 0xbf, 0xc2, 0xc5, 0xc6, 0xc8, 0xcb, 0xce, 0xd4, 0xd1, 0xd4, 0xa0, + 0x53, 0x60, 0x9b, 0xa5, 0x6c, 0x40, 0x2a, 0x2c, 0x2b, 0x34, 0x36, 0x23, + 0x21, 0x22, 0x23, 0x25, 0x28, 0x2b, 0x2e, 0x2f, 0x2f, 0x34, 0x3c, 0x44, + 0x4b, 0x4e, 0x4f, 0x4f, 0x45, 0x49, 0x52, 0x5d, 0x63, 0x60, 0x56, 0x4d, + 0x4c, 0x59, 0x64, 0x5f, 0x4d, 0x41, 0x42, 0x49, 0x41, 0x54, 0x6a, 0x74, + 0x71, 0x6f, 0x76, 0x7e, 0x53, 0x52, 0x4c, 0x41, 0x3b, 0x46, 0x5f, 0x75, + 0x50, 0x54, 0x4e, 0x43, 0x4d, 0x5f, 0x5a, 0x46, 0x4b, 0x36, 0x26, 0x35, + 0x5b, 0x79, 0x7f, 0x79, 0x9d, 0xa0, 0xa2, 0x9f, 0x96, 0x8a, 0x7f, 0x78, + 0x63, 0x59, 0x4b, 0x3e, 0x36, 0x31, 0x2b, 0x28, 0x41, 0x3f, 0x3b, 0x36, + 0x30, 0x2b, 0x27, 0x24, 0x1b, 0x2d, 0x1f, 0x20, 0x58, 0x87, 0x8d, 0x8e, + 0x91, 0x9d, 0x9b, 0x94, 0xa3, 0xab, 0xa2, 0xa8, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa5, 0xab, 0xa9, 0xa4, 0xa8, 0xb2, 0xb1, 0xa7, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa4, 0xa2, 0xa1, 0xa3, 0xa9, 0x97, 0x1d, 0x08, 0xaa, 0xa5, 0x9f, 0x9f, + 0xa2, 0xa4, 0xa3, 0xa0, 0xa5, 0xa3, 0xa0, 0x9e, 0x9e, 0xa0, 0xa1, 0xa2, + 0xaf, 0xa7, 0xa0, 0x9d, 0xa5, 0xb0, 0x8a, 0x47, 0x75, 0xb4, 0xbd, 0x93, + 0x80, 0x80, 0x82, 0x8d, 0x88, 0x95, 0x93, 0x94, 0x89, 0x81, 0x9b, 0xb1, + 0xab, 0x9e, 0x9e, 0xa8, 0xa6, 0x93, 0x87, 0x91, 0x75, 0x76, 0x6e, 0x75, + 0x94, 0xab, 0xad, 0xad, 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa4, 0xa3, + 0xa1, 0xa2, 0xa3, 0xa5, 0xa6, 0xa8, 0xa9, 0xa9, 0xad, 0xa9, 0xa9, 0xac, + 0xa6, 0x7f, 0x60, 0x72, 0xaf, 0x7d, 0x88, 0xaa, 0xa3, 0xa7, 0xb9, 0xae, + 0x99, 0x82, 0x90, 0x95, 0x7e, 0x8d, 0xa9, 0x9c, 0x3e, 0x14, 0x57, 0xbd, + 0xc0, 0xa7, 0xad, 0xaa, 0xaa, 0xa5, 0xa4, 0x9e, 0x9e, 0xae, 0xa5, 0x7e, + 0x94, 0xac, 0xac, 0xaf, 0xa8, 0x94, 0x9b, 0xab, 0xac, 0xaa, 0xab, 0xae, + 0xb1, 0xb0, 0xaa, 0xa5, 0xaf, 0xa9, 0xa9, 0xb0, 0xaf, 0xa6, 0xa4, 0xa9, + 0xab, 0xb4, 0xb3, 0xa1, 0x91, 0x92, 0x9e, 0xa7, 0xaf, 0xb0, 0xad, 0xa8, + 0xaa, 0xaf, 0xaf, 0xaa, 0xa6, 0xac, 0xb0, 0xae, 0xa9, 0xa6, 0xa8, 0xab, + 0xb3, 0xa7, 0xb3, 0xb5, 0x89, 0x68, 0x85, 0xb7, 0x94, 0x3b, 0x08, 0x21, + 0x5e, 0xaa, 0xd2, 0xc7, 0xc9, 0xc8, 0xc0, 0xae, 0x8e, 0x67, 0x42, 0x2c, + 0x27, 0x29, 0x2d, 0x2f, 0x2f, 0x2c, 0x28, 0x26, 0x3b, 0x44, 0x4f, 0x55, + 0x56, 0x56, 0x58, 0x5a, 0x4d, 0x4d, 0x44, 0x32, 0x27, 0x36, 0x5b, 0x7c, + 0x9c, 0xa4, 0xa5, 0x94, 0x76, 0x5d, 0x52, 0x52, 0x3e, 0x42, 0x46, 0x45, + 0x3f, 0x37, 0x30, 0x2d, 0x41, 0x3a, 0x39, 0x48, 0x60, 0x67, 0x53, 0x3a, + 0x38, 0x47, 0x5b, 0x6b, 0x75, 0x7d, 0x88, 0x90, 0x9c, 0x92, 0x86, 0x81, + 0x81, 0x80, 0x7a, 0x74, 0x69, 0x5f, 0x56, 0x59, 0x60, 0x60, 0x56, 0x4a, + 0x39, 0x38, 0x36, 0x33, 0x30, 0x2e, 0x2c, 0x2b, 0x16, 0x2f, 0x21, 0x3c, + 0x94, 0xaa, 0x8b, 0x90, 0x95, 0xa4, 0x9b, 0x9b, 0xa8, 0xa7, 0xa7, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xa8, 0xa7, 0xaa, 0xab, 0xa9, 0xa9, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa6, 0xa4, 0xa3, 0xa2, 0xa3, 0xa9, 0x97, 0x1e, 0x09, + 0xa0, 0xa1, 0xa2, 0xa1, 0xa0, 0xa1, 0xa3, 0xa5, 0xa9, 0xa8, 0xa6, 0xa6, + 0xa7, 0xa6, 0xa4, 0xa2, 0x9e, 0xa7, 0x97, 0xa5, 0xb5, 0x73, 0x4e, 0x8a, + 0xb4, 0xb3, 0x9a, 0x82, 0x8d, 0xa5, 0xa8, 0x9e, 0x9e, 0xad, 0xa9, 0xa3, + 0x93, 0x84, 0x94, 0xa2, 0xa6, 0x9f, 0x97, 0xa4, 0x99, 0x92, 0xa9, 0xa5, + 0x9d, 0x9b, 0x83, 0x6d, 0x73, 0x83, 0x92, 0xa1, 0xad, 0xac, 0xab, 0xa9, + 0xa8, 0xa6, 0xa5, 0xa4, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, + 0xad, 0xaa, 0x79, 0x72, 0x6d, 0x56, 0x75, 0x94, 0x82, 0xa9, 0xbf, 0xbd, + 0xb4, 0xa4, 0x9f, 0xae, 0xaf, 0x87, 0x65, 0x6a, 0x81, 0x77, 0x40, 0x0a, + 0x4f, 0x9e, 0xc4, 0xb1, 0xaa, 0xad, 0xaa, 0xa9, 0xa9, 0xa7, 0xa9, 0xa3, + 0xa1, 0xb1, 0xa6, 0x7c, 0x99, 0xaa, 0xad, 0xa7, 0xaa, 0x9c, 0x8f, 0xa1, + 0xac, 0xa8, 0xa5, 0xa6, 0xac, 0xaf, 0xae, 0xac, 0xa6, 0xaa, 0xab, 0xa8, + 0xaa, 0xae, 0xae, 0xa9, 0xa6, 0xa9, 0xaf, 0xb0, 0xa4, 0x96, 0x96, 0x9f, + 0xae, 0xb2, 0xb0, 0xa9, 0xa6, 0xa9, 0xab, 0xaa, 0xab, 0xaa, 0xa8, 0xa6, + 0xa6, 0xa8, 0xaa, 0xad, 0xa5, 0xb3, 0xa9, 0xb4, 0xbd, 0x75, 0x3a, 0x55, + 0x7d, 0x80, 0xb1, 0xd7, 0xcb, 0xc3, 0xc8, 0xbd, 0xb9, 0xbe, 0xc5, 0xcb, + 0xce, 0xcb, 0xc7, 0xc4, 0xa9, 0xa4, 0x98, 0x86, 0x70, 0x59, 0x46, 0x3b, + 0x2b, 0x35, 0x3d, 0x3b, 0x33, 0x31, 0x38, 0x40, 0x4a, 0x50, 0x5c, 0x69, + 0x6e, 0x68, 0x5a, 0x4e, 0x61, 0x71, 0x7f, 0x7c, 0x6b, 0x5a, 0x53, 0x54, + 0x51, 0x43, 0x35, 0x37, 0x47, 0x5b, 0x67, 0x6b, 0x68, 0x5b, 0x5f, 0x77, + 0x81, 0x72, 0x5e, 0x57, 0x69, 0x75, 0x82, 0x85, 0x7a, 0x6b, 0x5f, 0x5a, + 0x60, 0x6f, 0x83, 0x8d, 0x88, 0x79, 0x68, 0x5e, 0x58, 0x60, 0x64, 0x5e, + 0x4e, 0x40, 0x3b, 0x3b, 0x3b, 0x39, 0x36, 0x32, 0x2e, 0x29, 0x26, 0x25, + 0x25, 0x15, 0x2c, 0x6d, 0x97, 0x90, 0x83, 0x87, 0x99, 0xa6, 0x9a, 0xa1, + 0xa9, 0xa3, 0xaa, 0xa8, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xab, 0xa5, 0xa5, 0xab, + 0xac, 0xa7, 0xa7, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, 0xa3, 0xa2, 0xa3, + 0xa9, 0x97, 0x1e, 0x09, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa3, 0xa0, 0xac, 0xa7, 0xa6, 0xa5, 0x97, 0x9e, 0x99, 0xa8, 0xb5, 0xa4, + 0x5e, 0x4d, 0x8e, 0xa9, 0xb6, 0x99, 0x81, 0x91, 0xae, 0xa9, 0xa1, 0xb0, + 0x9c, 0xa3, 0xa8, 0xad, 0xa3, 0x8b, 0x8f, 0xaf, 0xaa, 0x9c, 0x8e, 0x8d, + 0x9a, 0xa6, 0xab, 0xaa, 0xab, 0xa4, 0xa1, 0x9e, 0x8e, 0x74, 0x61, 0x5b, + 0x6a, 0x7f, 0x94, 0x9e, 0xa7, 0xb2, 0xb5, 0xb2, 0xa2, 0xb5, 0xb7, 0xad, + 0xae, 0xaf, 0xb0, 0xb7, 0xb2, 0xab, 0x91, 0x4f, 0x54, 0x86, 0x8e, 0xa5, + 0xb0, 0xb0, 0xaa, 0xa3, 0xa6, 0xac, 0xaa, 0xa5, 0xaa, 0x9f, 0x7b, 0x73, + 0x6f, 0x3f, 0x49, 0xa1, 0xb9, 0xb6, 0xb1, 0xac, 0xa8, 0xa5, 0xa4, 0xa3, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, 0x9b, 0xa4, 0xa9, 0xa7, + 0xa5, 0xa4, 0x9c, 0x92, 0xaa, 0xaf, 0xac, 0xa4, 0xa3, 0xaa, 0xab, 0xa5, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x87, 0x9b, 0xab, 0xab, 0xa7, 0xa9, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xb2, 0xaa, 0xa1, 0xab, + 0xad, 0x86, 0x58, 0x4d, 0x6c, 0xaa, 0xc3, 0xac, 0xa3, 0xab, 0xab, 0xa7, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb7, 0xbf, 0xca, 0xd2, + 0xd2, 0xca, 0xbf, 0xb7, 0x85, 0x5c, 0x2a, 0x0f, 0x12, 0x1e, 0x24, 0x23, + 0x2f, 0x36, 0x3a, 0x3a, 0x3f, 0x42, 0x37, 0x26, 0x41, 0x4f, 0x60, 0x6b, + 0x6a, 0x5e, 0x50, 0x46, 0x48, 0x4f, 0x58, 0x5d, 0x63, 0x72, 0x88, 0x9a, + 0x9a, 0x94, 0x8f, 0x91, 0x94, 0x8c, 0x7a, 0x6a, 0x79, 0x70, 0x64, 0x5a, + 0x56, 0x5a, 0x62, 0x68, 0x76, 0x83, 0x7e, 0x67, 0x61, 0x6c, 0x69, 0x58, + 0x5a, 0x5b, 0x5c, 0x5a, 0x55, 0x4d, 0x45, 0x3f, 0x3e, 0x34, 0x2a, 0x27, + 0x2c, 0x2f, 0x2c, 0x27, 0x1c, 0x5f, 0x97, 0x89, 0x95, 0x9c, 0x7c, 0x90, + 0xaa, 0x9b, 0xa2, 0xac, 0xa5, 0xa6, 0xac, 0xa6, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, + 0xa4, 0xa3, 0xa1, 0xa2, 0xab, 0x9e, 0x16, 0x07, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa3, 0xa6, 0x97, 0xaf, 0xb1, 0x9a, 0xa9, 0xaa, + 0x9f, 0xa8, 0xa5, 0x58, 0x4b, 0x96, 0xb4, 0xbc, 0x9a, 0x88, 0x91, 0xa8, + 0xaa, 0xa6, 0xa7, 0xa2, 0x9d, 0xa3, 0xa8, 0xac, 0xa4, 0x8d, 0x8f, 0xac, + 0xa6, 0x9b, 0x90, 0x91, 0x9d, 0xa7, 0xaa, 0xa8, 0xa5, 0xaa, 0xae, 0xaf, + 0xae, 0xaa, 0xa3, 0x9d, 0x99, 0x8e, 0x7e, 0x72, 0x6a, 0x66, 0x67, 0x6a, + 0x7e, 0x75, 0x82, 0x8e, 0x88, 0x87, 0x7d, 0x61, 0x5c, 0x87, 0x83, 0x6a, + 0x8e, 0x87, 0x4f, 0x5e, 0xa3, 0xa4, 0x9e, 0x9f, 0xac, 0xad, 0xa3, 0x9f, + 0xae, 0xbe, 0xa9, 0x7d, 0x5a, 0x8a, 0xcc, 0xb0, 0xb2, 0xb0, 0xad, 0xaa, + 0xa8, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0x9d, 0xa6, 0xaa, 0xa8, 0xa7, 0xa6, 0x9f, 0x95, 0xa4, 0xab, 0xad, 0xa7, + 0xa5, 0xaa, 0xab, 0xa7, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa2, 0x99, 0x98, 0xa4, + 0xac, 0xab, 0xa9, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa2, 0xb1, 0xab, 0x94, 0xa4, 0xac, 0x88, 0x62, 0x8f, 0xa9, 0xaa, + 0xae, 0xae, 0xa6, 0xa3, 0xab, 0xab, 0xac, 0xac, 0xad, 0xae, 0xaf, 0xaf, + 0xb8, 0xb4, 0xae, 0xaa, 0xaa, 0xae, 0xb4, 0xb8, 0xb9, 0xbd, 0xc5, 0xcf, + 0xcf, 0xbd, 0x9e, 0x86, 0x5f, 0x40, 0x3c, 0x5a, 0x6c, 0x68, 0x74, 0x90, + 0x8d, 0x7e, 0x6e, 0x69, 0x6a, 0x65, 0x58, 0x4b, 0x74, 0x77, 0x78, 0x72, + 0x6d, 0x71, 0x7e, 0x8b, 0x8a, 0x74, 0x56, 0x40, 0x3b, 0x42, 0x4c, 0x54, + 0x57, 0x54, 0x4e, 0x48, 0x42, 0x3d, 0x3b, 0x39, 0x51, 0x5d, 0x66, 0x67, + 0x66, 0x64, 0x59, 0x4c, 0x4c, 0x4f, 0x53, 0x57, 0x57, 0x55, 0x52, 0x50, + 0x28, 0x2c, 0x30, 0x2f, 0x2a, 0x27, 0x28, 0x2a, 0x16, 0x61, 0x91, 0x93, + 0xa3, 0x9c, 0x85, 0xa2, 0xb1, 0xa1, 0x9b, 0xa0, 0xa2, 0xa6, 0xad, 0xaf, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa3, 0xab, 0x9e, 0x17, 0x07, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa6, 0x9a, 0xa2, 0xa3, + 0x9f, 0xac, 0xac, 0x9b, 0xb1, 0x9c, 0x55, 0x4b, 0x91, 0xb1, 0xa9, 0xaf, + 0x83, 0x88, 0xa0, 0xaf, 0xa6, 0xa3, 0xa6, 0x9f, 0x9d, 0xa4, 0xa7, 0xab, + 0xa5, 0x91, 0x90, 0xa6, 0xa1, 0x9a, 0x94, 0x98, 0xa2, 0xa9, 0xa8, 0xa5, + 0xa0, 0xa8, 0xaa, 0xa4, 0xa4, 0xaa, 0xa8, 0x9f, 0x8d, 0x8a, 0x95, 0xaa, + 0xb6, 0xaf, 0xa5, 0xa3, 0x99, 0x9e, 0x9d, 0x95, 0x90, 0x93, 0xa3, 0xb6, + 0xcb, 0x91, 0x62, 0x75, 0xa8, 0xb0, 0xa6, 0xb9, 0xac, 0xa5, 0xa2, 0xa2, + 0xa1, 0xa5, 0xa8, 0xa6, 0xc1, 0x8a, 0x54, 0x3d, 0x81, 0xc0, 0xaa, 0xa4, + 0xaa, 0xa9, 0xa7, 0xa7, 0xa7, 0xa9, 0xab, 0xad, 0xa8, 0xa8, 0xaa, 0xa7, + 0xa7, 0xae, 0xa0, 0x82, 0xa0, 0xa8, 0xad, 0xaa, 0xa9, 0xa9, 0xa2, 0x9a, + 0x9b, 0xa6, 0xad, 0xac, 0xa8, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xb1, 0xa0, 0x95, 0x9c, 0xa7, 0xaa, 0xa9, 0xaa, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa5, 0xb0, 0xaf, 0x9c, 0x93, 0xa5, 0xb6, 0xb5, + 0xb9, 0xba, 0xb3, 0xae, 0xaf, 0xaa, 0xa8, 0xaf, 0xaa, 0xaa, 0xaa, 0xab, + 0xab, 0xac, 0xac, 0xad, 0xb1, 0xac, 0xa5, 0xa1, 0xa1, 0xa5, 0xac, 0xb1, + 0xb4, 0xb5, 0xb6, 0xb6, 0xb8, 0xbc, 0xc2, 0xc6, 0xc4, 0xaf, 0x80, 0x52, + 0x49, 0x59, 0x5a, 0x49, 0x45, 0x4d, 0x53, 0x4d, 0x43, 0x43, 0x4f, 0x5c, + 0x71, 0x6a, 0x64, 0x65, 0x6d, 0x75, 0x79, 0x7a, 0x64, 0x72, 0x82, 0x88, + 0x7f, 0x6e, 0x5e, 0x54, 0x5f, 0x56, 0x48, 0x3f, 0x40, 0x4a, 0x58, 0x62, + 0x51, 0x50, 0x52, 0x57, 0x57, 0x52, 0x50, 0x52, 0x48, 0x49, 0x49, 0x48, + 0x45, 0x41, 0x3d, 0x3a, 0x36, 0x34, 0x2e, 0x25, 0x20, 0x24, 0x31, 0x3c, + 0x48, 0x9d, 0x9f, 0x8b, 0xa3, 0xa2, 0x8b, 0x89, 0xaa, 0xa1, 0x98, 0xa0, + 0xae, 0xae, 0xa8, 0xaa, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, 0xa4, 0xa2, 0xa3, + 0xac, 0x9f, 0x17, 0x08, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa7, 0xa1, 0xa0, 0x98, 0xab, 0xab, 0x96, 0xb6, 0xa0, 0x57, 0x52, 0xa5, + 0xb4, 0xa3, 0xa7, 0x76, 0x85, 0xa0, 0xa7, 0xa1, 0xa5, 0xa4, 0xa2, 0xa9, + 0x9f, 0xa5, 0xa7, 0xa9, 0xa7, 0x96, 0x90, 0x9f, 0x9c, 0x99, 0x99, 0x9e, + 0xa6, 0xa9, 0xa7, 0xa3, 0xa6, 0xaa, 0xaa, 0xa6, 0xa7, 0xac, 0xae, 0xab, + 0xb7, 0xa7, 0x99, 0x96, 0x99, 0xa0, 0xaa, 0xb5, 0xaa, 0xbb, 0xb7, 0xae, + 0xb3, 0xb2, 0xb0, 0xba, 0x7c, 0x53, 0x6e, 0xb7, 0xc3, 0xb2, 0xb2, 0xa7, + 0xbc, 0xb5, 0xba, 0xb5, 0xaa, 0xb8, 0xbd, 0xa3, 0x53, 0x2d, 0x77, 0x96, + 0x7d, 0x99, 0xa8, 0xa3, 0xa7, 0xa6, 0xa5, 0xa5, 0xa6, 0xa9, 0xab, 0xad, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, 0xa3, 0xab, 0xae, 0xac, + 0xab, 0xab, 0xa7, 0x9e, 0x95, 0xa1, 0xac, 0xae, 0xab, 0xa9, 0xaa, 0xac, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xad, 0xa8, 0x9d, 0x9b, 0xa4, 0xaa, 0xa8, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xb6, 0xa8, 0xab, 0xa3, + 0x8c, 0x9b, 0xb0, 0xa4, 0xae, 0xa7, 0xa2, 0xa7, 0xad, 0xab, 0xaa, 0xb0, + 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xac, + 0xac, 0xab, 0xab, 0xaa, 0xa1, 0xa6, 0xaa, 0xaa, 0xa7, 0xa5, 0xa8, 0xab, + 0xaa, 0xa1, 0x75, 0x43, 0x44, 0x6a, 0x75, 0x60, 0x59, 0x4c, 0x3b, 0x33, + 0x39, 0x4d, 0x65, 0x76, 0x7a, 0x68, 0x59, 0x5f, 0x73, 0x7e, 0x76, 0x69, + 0x77, 0x79, 0x75, 0x65, 0x50, 0x44, 0x46, 0x4d, 0x4c, 0x5c, 0x71, 0x81, + 0x83, 0x76, 0x62, 0x54, 0x59, 0x54, 0x49, 0x3e, 0x39, 0x3b, 0x3f, 0x41, + 0x3c, 0x3d, 0x3d, 0x3e, 0x3e, 0x3d, 0x3c, 0x3c, 0x55, 0x4c, 0x41, 0x38, + 0x34, 0x33, 0x32, 0x31, 0x56, 0x97, 0x87, 0x88, 0x8c, 0x5d, 0x6d, 0xa5, + 0xaf, 0xa5, 0x91, 0x94, 0xac, 0xaf, 0xaa, 0xb3, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, + 0xa5, 0xa4, 0xa3, 0xa4, 0xad, 0x9f, 0x18, 0x09, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa1, 0xac, 0xa2, 0xa7, 0xa4, 0xa5, 0xb5, 0x9f, + 0x5f, 0x5a, 0xab, 0xc3, 0xa0, 0xa5, 0x99, 0x7c, 0x9a, 0xaf, 0xac, 0x9f, + 0xa4, 0xa9, 0xa6, 0xa7, 0xa0, 0xa6, 0xa6, 0xa7, 0xa9, 0x9c, 0x91, 0x97, + 0x99, 0x9a, 0x9c, 0xa2, 0xa7, 0xa9, 0xa7, 0xa4, 0xa4, 0x9f, 0x9f, 0xa3, + 0xa5, 0xa4, 0xa7, 0xae, 0xa8, 0xab, 0xa7, 0x9d, 0x98, 0x9c, 0xa0, 0xa1, + 0xaf, 0xa3, 0x9f, 0x9b, 0x9a, 0xa7, 0x9f, 0x7d, 0x59, 0x80, 0xab, 0xc2, + 0xb4, 0x9d, 0x91, 0x84, 0x6f, 0x78, 0x8e, 0xae, 0xc6, 0xb4, 0x6c, 0x22, + 0x6c, 0x9c, 0x99, 0xa0, 0x91, 0x77, 0x9c, 0xb0, 0xaa, 0xa9, 0xa7, 0xa6, + 0xa6, 0xa7, 0xa9, 0xaa, 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xac, 0xaf, 0xac, 0xab, 0xad, 0xaa, 0xa2, 0x96, 0x9d, 0xa8, 0xae, + 0xad, 0xaa, 0xa9, 0xac, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xaf, 0xb2, 0xa6, + 0x9d, 0x9f, 0xa4, 0xa5, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xb2, 0xaa, 0xa1, 0x99, 0x9c, 0xaf, 0xb2, 0xa0, 0xa1, 0xa4, 0xab, 0xb0, + 0xb1, 0xaf, 0xaa, 0xa3, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, + 0xac, 0xaa, 0xa8, 0xa7, 0xa7, 0xa8, 0xaa, 0xac, 0xb1, 0xaf, 0xad, 0xaa, + 0xaa, 0xaa, 0xab, 0xac, 0xa5, 0xa1, 0x8b, 0x67, 0x4e, 0x48, 0x45, 0x40, + 0x42, 0x4f, 0x5a, 0x58, 0x4e, 0x4b, 0x55, 0x62, 0x6b, 0x63, 0x5d, 0x62, + 0x6e, 0x75, 0x73, 0x6d, 0x67, 0x71, 0x79, 0x75, 0x68, 0x5e, 0x5d, 0x62, + 0x72, 0x68, 0x59, 0x4c, 0x44, 0x44, 0x48, 0x4c, 0x5e, 0x76, 0x84, 0x7f, + 0x7b, 0x78, 0x64, 0x48, 0x4e, 0x4c, 0x4a, 0x47, 0x44, 0x42, 0x41, 0x41, + 0x37, 0x31, 0x28, 0x22, 0x22, 0x28, 0x30, 0x36, 0x6d, 0xb2, 0x94, 0x89, + 0x8e, 0x73, 0x91, 0xb6, 0xac, 0xa3, 0x90, 0x95, 0xad, 0xb1, 0xab, 0xb4, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, + 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa5, 0xad, 0xa0, 0x19, 0x09, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0x9f, 0xa5, 0xab, 0xa4, + 0xa1, 0xb4, 0x9e, 0x52, 0x69, 0xa7, 0xbc, 0xab, 0xa8, 0x90, 0x82, 0xac, + 0xa9, 0xa9, 0xb1, 0xad, 0xa4, 0xac, 0xae, 0x9b, 0xa1, 0xa7, 0xa5, 0xa5, + 0xab, 0xa1, 0x91, 0x90, 0x9a, 0x9b, 0x9f, 0xa2, 0xa6, 0xa8, 0xa8, 0xa7, + 0xb2, 0xa9, 0xa6, 0xab, 0xa9, 0xa1, 0xa1, 0xa8, 0xa2, 0xad, 0xaf, 0xa5, + 0xa0, 0xa6, 0xab, 0xa9, 0xa1, 0x9e, 0xa1, 0xab, 0xb4, 0xa9, 0x7b, 0x49, + 0x8b, 0x92, 0x7e, 0x58, 0x52, 0x68, 0x80, 0x98, 0x97, 0x9c, 0x81, 0x5a, + 0x37, 0x1e, 0x4f, 0xb1, 0xae, 0xa6, 0x93, 0xaf, 0xa4, 0x76, 0x8b, 0xad, + 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa7, 0xa8, 0xa9, 0xa8, 0xa8, 0xaa, 0xa7, + 0xa7, 0xae, 0xa0, 0x82, 0xa6, 0xac, 0xae, 0xaa, 0xaa, 0xad, 0xab, 0xa5, + 0x9e, 0x9d, 0xa1, 0xaa, 0xad, 0xaa, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xad, 0xa9, 0xaa, 0xae, 0xab, 0xa1, 0x9e, 0xa2, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xa5, 0x8d, 0x91, 0xb4, 0xb2, 0xa4, 0xb2, + 0xa4, 0xa6, 0xab, 0xa8, 0xa4, 0xad, 0xb2, 0xaa, 0xad, 0xac, 0xac, 0xab, + 0xab, 0xaa, 0xaa, 0xaa, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, + 0xac, 0xa8, 0xa4, 0xa5, 0xaa, 0xaf, 0xb1, 0xb0, 0xb1, 0xb5, 0xa6, 0x7d, + 0x53, 0x45, 0x52, 0x63, 0x54, 0x3c, 0x2a, 0x33, 0x4e, 0x5e, 0x56, 0x45, + 0x59, 0x65, 0x6f, 0x6e, 0x66, 0x66, 0x71, 0x7c, 0x81, 0x84, 0x84, 0x7b, + 0x6d, 0x5e, 0x55, 0x51, 0x68, 0x64, 0x5e, 0x57, 0x50, 0x4c, 0x49, 0x48, + 0xa4, 0xab, 0x99, 0x74, 0x66, 0x70, 0x6e, 0x5b, 0x58, 0x54, 0x4c, 0x44, + 0x3d, 0x38, 0x35, 0x34, 0x2f, 0x30, 0x2c, 0x20, 0x1a, 0x27, 0x44, 0x5d, + 0xa2, 0xa6, 0x7a, 0x92, 0xa4, 0x79, 0x84, 0xa0, 0xa0, 0x9a, 0x96, 0xa2, + 0xb3, 0xb3, 0xab, 0xac, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa4, 0xa5, + 0xae, 0xa1, 0x19, 0x0a, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa7, 0xa1, 0xa1, 0xa0, 0xb4, 0x92, 0x51, 0x6a, 0xb0, 0xac, 0x9b, 0xb1, + 0xa0, 0x80, 0xa0, 0xad, 0xa6, 0xa5, 0xae, 0xaf, 0xa4, 0xa8, 0xab, 0x9f, + 0xa2, 0xa8, 0xa4, 0xa4, 0xad, 0xa5, 0x92, 0x8a, 0x9c, 0x9d, 0xa0, 0xa1, + 0xa3, 0xa6, 0xa9, 0xac, 0xa8, 0xa7, 0xa7, 0xa8, 0xa8, 0xa5, 0xa3, 0xa4, + 0xac, 0xa8, 0xa0, 0x98, 0x96, 0x9b, 0xa3, 0xa7, 0xa9, 0xaa, 0xa4, 0xad, + 0xb5, 0x8c, 0x55, 0x42, 0x1e, 0x4b, 0x9d, 0xbe, 0xc0, 0xc0, 0xb5, 0xc0, + 0xd2, 0xc7, 0x77, 0x29, 0x4a, 0xa4, 0xca, 0xc0, 0xb1, 0x8f, 0x9c, 0xae, + 0xab, 0x8f, 0x7a, 0xa1, 0xaf, 0xad, 0xab, 0xa9, 0xa8, 0xa9, 0xaa, 0xab, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, 0xa5, 0xab, 0xac, 0xa9, + 0xa9, 0xad, 0xac, 0xa6, 0xa7, 0x9d, 0x9b, 0xa5, 0xad, 0xab, 0xa8, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xb0, 0xa8, 0xa6, 0xad, 0xad, 0xa5, 0x9f, 0xa0, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xae, 0x89, 0x93, 0xb1, + 0xa9, 0xa2, 0xac, 0xac, 0xb1, 0xab, 0xaf, 0xaf, 0xa9, 0xaf, 0xb2, 0xa5, + 0xaf, 0xaf, 0xae, 0xad, 0xac, 0xac, 0xab, 0xab, 0xab, 0xad, 0xb1, 0xb3, + 0xb3, 0xb1, 0xad, 0xab, 0xaf, 0xac, 0xaa, 0xa9, 0xaa, 0xa9, 0xa7, 0xa4, + 0xac, 0xa8, 0xae, 0xac, 0x85, 0x4d, 0x37, 0x42, 0x51, 0x57, 0x60, 0x69, + 0x6b, 0x66, 0x5d, 0x56, 0x78, 0x82, 0x88, 0x82, 0x75, 0x6e, 0x73, 0x7c, + 0x61, 0x65, 0x6c, 0x72, 0x70, 0x63, 0x4f, 0x40, 0x36, 0x39, 0x3c, 0x3e, + 0x3e, 0x3c, 0x39, 0x36, 0x36, 0x44, 0x4b, 0x47, 0x48, 0x4d, 0x47, 0x39, + 0x3f, 0x3d, 0x39, 0x36, 0x36, 0x38, 0x3c, 0x3e, 0x3c, 0x41, 0x3e, 0x30, + 0x20, 0x20, 0x32, 0x45, 0x8d, 0xa4, 0x8b, 0x81, 0x82, 0x81, 0x97, 0x97, + 0xa2, 0x96, 0x98, 0xa4, 0xa9, 0xae, 0xb2, 0xb3, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xa9, 0xa9, + 0xa7, 0xa6, 0xa5, 0xa6, 0xaf, 0xa1, 0x1a, 0x0b, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xaf, 0x9b, 0xa7, 0xbf, 0x87, 0x4d, 0x79, 0xb3, + 0xb0, 0x96, 0xa6, 0x9d, 0x8d, 0xa7, 0xb1, 0xa6, 0x9e, 0xaa, 0xa6, 0xa1, + 0xa5, 0xa2, 0xa1, 0xaf, 0xa2, 0xa9, 0xa4, 0xa3, 0xad, 0xa7, 0x92, 0x87, + 0x9d, 0x9f, 0xa0, 0xa0, 0xa1, 0xa4, 0xaa, 0xae, 0xa3, 0xaa, 0xab, 0xa5, + 0xa3, 0xa6, 0xa2, 0x9a, 0x95, 0x8e, 0x90, 0x9e, 0xa8, 0xa9, 0xa9, 0xac, + 0x9d, 0xa3, 0xbf, 0xc0, 0x88, 0x56, 0x61, 0x83, 0x6c, 0x92, 0xc5, 0xb6, + 0xaa, 0xb1, 0xac, 0xce, 0x86, 0x2b, 0x2c, 0x8e, 0xc8, 0xc2, 0xb1, 0xa3, + 0xa2, 0x93, 0x97, 0xae, 0xb4, 0x9a, 0x81, 0x84, 0xae, 0xad, 0xab, 0xaa, + 0xaa, 0xab, 0xad, 0xaf, 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xaa, 0xab, 0xa7, 0xa8, 0xac, 0xab, 0xa6, 0xae, 0x9e, 0x97, 0xa1, + 0xac, 0xab, 0xa7, 0xa6, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0xae, 0xa6, + 0xa5, 0xa8, 0xa6, 0x9f, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x99, 0x9a, 0xae, 0xb9, 0xad, 0xaa, 0xb0, 0xac, 0xb5, 0xa5, 0xa6, 0xac, + 0xa9, 0xaf, 0xb3, 0xa7, 0xb1, 0xb0, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, + 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xab, 0xad, 0xaf, 0xaf, + 0xad, 0xac, 0xab, 0xac, 0xb9, 0xaa, 0xa8, 0xb1, 0x9d, 0x6c, 0x47, 0x3f, + 0x4d, 0x5b, 0x69, 0x6c, 0x65, 0x62, 0x68, 0x71, 0x6e, 0x6c, 0x6c, 0x72, + 0x7b, 0x7f, 0x7d, 0x78, 0x76, 0x6e, 0x67, 0x67, 0x68, 0x60, 0x4e, 0x3e, + 0x59, 0x4e, 0x3d, 0x30, 0x2e, 0x36, 0x43, 0x4c, 0x37, 0x37, 0x3a, 0x3f, + 0x3f, 0x3c, 0x3a, 0x3b, 0x48, 0x44, 0x3f, 0x3a, 0x39, 0x3a, 0x3d, 0x40, + 0x4e, 0x45, 0x37, 0x28, 0x23, 0x2d, 0x41, 0x52, 0x9d, 0xa0, 0x88, 0x79, + 0x79, 0x89, 0xa4, 0x9e, 0x98, 0x8f, 0x9f, 0xb1, 0xae, 0xaf, 0xb2, 0xaa, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xab, + 0xab, 0xaa, 0xa9, 0xa9, 0xa8, 0xa7, 0xa5, 0xa6, 0xaf, 0xa2, 0x1a, 0x0b, + 0xac, 0xad, 0x9f, 0xa6, 0xa8, 0xa2, 0xa9, 0x9e, 0xa5, 0xa5, 0xb6, 0x85, + 0x52, 0x77, 0xa7, 0xb5, 0xab, 0xa6, 0x95, 0x8b, 0x98, 0xaa, 0xab, 0xa4, + 0xa6, 0xa6, 0xa7, 0xa7, 0xa6, 0xa4, 0xa1, 0x9f, 0xa3, 0x9b, 0xa1, 0xa1, + 0xac, 0xa2, 0x7e, 0x8c, 0x9b, 0x98, 0xa0, 0xa3, 0x9b, 0x9f, 0xa9, 0xa7, + 0xa2, 0xa3, 0xa5, 0xa6, 0xa7, 0xa6, 0xa5, 0xa4, 0xa1, 0xa9, 0xac, 0xa7, + 0xa6, 0xac, 0xb2, 0xb2, 0xb4, 0xa1, 0x7d, 0x5b, 0x46, 0x71, 0xb8, 0xbc, + 0xbb, 0x88, 0x48, 0x7c, 0xb1, 0xb9, 0xaa, 0x44, 0x15, 0x85, 0xc0, 0xbd, + 0xb3, 0xad, 0xaf, 0xab, 0x96, 0x74, 0x95, 0xa5, 0xab, 0xba, 0x9b, 0x87, + 0xa2, 0xb4, 0xad, 0xaa, 0xac, 0xa7, 0xaa, 0xa7, 0xa9, 0xac, 0xa6, 0xa5, + 0xa8, 0xb4, 0x90, 0x85, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0x9a, 0x93, 0xa3, 0xa9, 0xa8, 0xb2, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0x9b, 0xa7, 0xa5, 0xa5, + 0xb0, 0xab, 0x9f, 0xa1, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb0, 0xac, 0xac, 0xaf, + 0xa2, 0x7c, 0x4b, 0x28, 0x47, 0x55, 0x60, 0x5e, 0x58, 0x59, 0x62, 0x68, + 0x64, 0x67, 0x6b, 0x6c, 0x68, 0x60, 0x57, 0x51, 0x5e, 0x5c, 0x55, 0x4a, + 0x41, 0x44, 0x52, 0x5e, 0x34, 0x3f, 0x4b, 0x4f, 0x49, 0x40, 0x3c, 0x3b, + 0x40, 0x3b, 0x36, 0x36, 0x3a, 0x3c, 0x3a, 0x37, 0x3d, 0x3a, 0x36, 0x31, + 0x2f, 0x2e, 0x2f, 0x30, 0x39, 0x32, 0x30, 0x28, 0x31, 0x35, 0x31, 0x4e, + 0xa2, 0xac, 0x88, 0x7c, 0x85, 0x8c, 0xa4, 0xa4, 0x8c, 0x9a, 0x9e, 0xa4, + 0xb3, 0xb2, 0xaa, 0xb1, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xae, 0xac, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaa, 0xab, 0xad, 0xb0, + 0xb8, 0xa8, 0x1c, 0x0a, 0xa4, 0x9b, 0xae, 0xae, 0xa5, 0xa5, 0x9d, 0xa3, + 0xa6, 0xb7, 0x7f, 0x56, 0x7b, 0xae, 0xbb, 0x9f, 0xab, 0xa1, 0x88, 0x8b, + 0xa9, 0xab, 0x9f, 0xa9, 0xa5, 0xa6, 0xa6, 0xa5, 0xa3, 0xa4, 0xa8, 0xab, + 0xad, 0xa8, 0xa5, 0xa5, 0xad, 0x9f, 0x87, 0x8f, 0x96, 0x98, 0xa7, 0xaf, + 0xa7, 0xa6, 0xaa, 0xa4, 0xaa, 0xa9, 0xa8, 0xa7, 0xa7, 0xa8, 0xa9, 0xaa, + 0xa7, 0xaa, 0xaf, 0xb6, 0xb7, 0xaa, 0x8f, 0x77, 0x67, 0x91, 0xaa, 0x82, + 0x87, 0xaf, 0xac, 0xb6, 0xac, 0x7d, 0x60, 0x84, 0x5c, 0x0f, 0x1a, 0x1e, + 0x92, 0xaf, 0xb1, 0xaf, 0xab, 0xa1, 0xa4, 0xa3, 0xb0, 0x8d, 0xad, 0xbd, + 0xb5, 0xaf, 0x92, 0x8c, 0x9f, 0xb2, 0xab, 0xa9, 0xac, 0xa7, 0xab, 0xa8, + 0xa9, 0xac, 0xa6, 0xa6, 0xa9, 0xb3, 0x90, 0x86, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xac, 0xa2, 0x96, 0x9d, 0xa9, 0xad, 0xad, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x90, 0x9d, 0xa7, 0xa8, 0xa9, 0xaf, 0xab, 0x9c, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaf, 0xb0, 0xb3, 0xb6, 0xb1, 0x9a, 0x72, 0x52, 0x56, 0x60, 0x67, 0x66, + 0x60, 0x60, 0x66, 0x6c, 0x5f, 0x63, 0x69, 0x6f, 0x72, 0x71, 0x6f, 0x6e, + 0x5c, 0x4f, 0x46, 0x4d, 0x61, 0x73, 0x78, 0x76, 0x65, 0x69, 0x6a, 0x65, + 0x5e, 0x5c, 0x60, 0x66, 0x6c, 0x5c, 0x47, 0x39, 0x35, 0x38, 0x3b, 0x3c, + 0x3c, 0x38, 0x31, 0x2b, 0x2a, 0x32, 0x41, 0x4c, 0x49, 0x34, 0x30, 0x28, + 0x24, 0x2c, 0x46, 0x79, 0x99, 0xaa, 0x8d, 0x75, 0x77, 0x8b, 0xa6, 0x9d, + 0x8c, 0x99, 0x9e, 0xa5, 0xb3, 0xb2, 0xac, 0xb1, 0xac, 0xad, 0xaf, 0xb0, + 0xb0, 0xaf, 0xad, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaa, 0xac, 0xad, 0xb0, 0xb8, 0xa7, 0x1c, 0x0a, 0xa3, 0xa3, 0xa3, 0x9c, + 0xae, 0xb6, 0xa1, 0xa9, 0xb8, 0x7b, 0x52, 0x83, 0xb0, 0xa9, 0xa8, 0xa4, + 0xab, 0x8f, 0x80, 0x97, 0xaf, 0xa8, 0x9f, 0xa7, 0xa4, 0xa9, 0xac, 0xaa, + 0xa4, 0xa3, 0xa8, 0xad, 0xac, 0xaf, 0xa4, 0xa9, 0xae, 0x9e, 0x97, 0x96, + 0x9b, 0x98, 0x9f, 0xa2, 0x9a, 0xa0, 0xab, 0xab, 0xa7, 0xa6, 0xa5, 0xa5, + 0xa8, 0xad, 0xb3, 0xb6, 0xae, 0xa8, 0x97, 0x7b, 0x66, 0x6d, 0x91, 0xb4, + 0xc0, 0xb8, 0x7e, 0x65, 0x93, 0xb5, 0xb2, 0xaa, 0xa0, 0x7f, 0x6a, 0x7b, + 0x7c, 0x87, 0xb7, 0xcb, 0xc2, 0xb3, 0xa6, 0xaf, 0xae, 0xa9, 0xb3, 0xae, + 0x71, 0x5f, 0x73, 0x74, 0x80, 0xa3, 0x9b, 0x89, 0x9b, 0xae, 0xa8, 0xa7, + 0xab, 0xa8, 0xac, 0xaa, 0xaa, 0xac, 0xa7, 0xa8, 0xaa, 0xb1, 0x8f, 0x89, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xab, 0xaa, 0x9d, + 0x97, 0xa7, 0xb1, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xa4, 0x9a, 0xa1, 0xab, 0xaa, 0xaf, 0xa9, 0x8f, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xa8, 0xae, 0xb2, 0xb1, 0xb2, 0xac, 0x91, 0x73, + 0x45, 0x4a, 0x53, 0x5d, 0x63, 0x69, 0x74, 0x7d, 0x70, 0x6f, 0x6d, 0x6b, + 0x67, 0x63, 0x60, 0x5e, 0x5d, 0x5f, 0x5f, 0x5d, 0x5b, 0x5a, 0x5d, 0x60, + 0x5d, 0x63, 0x6a, 0x6c, 0x6d, 0x72, 0x7c, 0x85, 0x71, 0x62, 0x4e, 0x43, + 0x44, 0x4d, 0x56, 0x5b, 0x2e, 0x38, 0x44, 0x46, 0x41, 0x3c, 0x3e, 0x42, + 0x29, 0x1d, 0x20, 0x25, 0x31, 0x37, 0x4e, 0x8c, 0xa6, 0xa1, 0x79, 0x61, + 0x75, 0xa2, 0xad, 0x81, 0x8d, 0x98, 0x9f, 0xa7, 0xb2, 0xb3, 0xae, 0xb1, + 0xab, 0xad, 0xaf, 0xb0, 0xb0, 0xaf, 0xad, 0xac, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xab, 0xac, 0xae, 0xb0, 0xb8, 0xa7, 0x1b, 0x09, + 0xa7, 0xa6, 0x9a, 0xa9, 0xaa, 0x9a, 0xaa, 0xb9, 0x82, 0x55, 0x83, 0xb7, + 0xaf, 0xa3, 0xa2, 0xa8, 0xa6, 0x7e, 0x8a, 0xa8, 0xa3, 0xa3, 0xac, 0xa1, + 0xa4, 0xac, 0xb3, 0xb1, 0xa9, 0xa3, 0xa4, 0xa8, 0xa1, 0xaa, 0x9c, 0xa6, + 0xa9, 0x9e, 0xa7, 0xa0, 0x8b, 0x90, 0xa2, 0xae, 0xac, 0xb0, 0xb7, 0xb4, + 0xad, 0xae, 0xaf, 0xac, 0xa1, 0x92, 0x83, 0x79, 0x6c, 0x74, 0x89, 0xa5, + 0xb7, 0xb8, 0xb1, 0xac, 0xc0, 0x8f, 0x63, 0x8b, 0xb0, 0xad, 0xb1, 0xa3, + 0x9c, 0x95, 0xa5, 0xb8, 0xbd, 0xc2, 0xbe, 0xb2, 0xb1, 0xa5, 0xa1, 0xa9, + 0xa5, 0xac, 0xb5, 0x95, 0x32, 0x43, 0x69, 0x75, 0x8c, 0xb5, 0xac, 0x90, + 0x98, 0xac, 0xa6, 0xa6, 0xab, 0xa8, 0xad, 0xab, 0xaa, 0xac, 0xa8, 0xab, + 0xab, 0xaf, 0x8e, 0x8c, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa7, 0xae, 0xa8, 0x99, 0xa2, 0xaf, 0xa7, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xae, 0x98, 0x9b, 0xb0, + 0xb3, 0xac, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa7, 0xb0, 0xb0, 0xaa, + 0xac, 0xb0, 0x9f, 0x85, 0x57, 0x52, 0x54, 0x60, 0x69, 0x6d, 0x73, 0x7b, + 0x74, 0x72, 0x6e, 0x6a, 0x65, 0x61, 0x5f, 0x5d, 0x82, 0x80, 0x75, 0x63, + 0x53, 0x54, 0x65, 0x75, 0x69, 0x72, 0x7a, 0x78, 0x6c, 0x5f, 0x56, 0x53, + 0x4d, 0x51, 0x58, 0x60, 0x62, 0x58, 0x47, 0x39, 0x35, 0x47, 0x5b, 0x5f, + 0x52, 0x3e, 0x2f, 0x2a, 0x2d, 0x26, 0x1b, 0x1b, 0x3d, 0x51, 0x61, 0x9b, + 0x8a, 0x95, 0x86, 0x61, 0x57, 0x7f, 0x9b, 0x8a, 0x90, 0x98, 0xa1, 0xa9, + 0xb1, 0xb2, 0xb0, 0xb0, 0xaa, 0xac, 0xae, 0xb0, 0xb0, 0xb0, 0xae, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xad, 0xae, 0xb1, + 0xb8, 0xa6, 0x1a, 0x08, 0xa7, 0xa4, 0xa5, 0xab, 0x9b, 0xa0, 0xac, 0x85, + 0x4f, 0x7f, 0xb7, 0xb1, 0xa3, 0xb1, 0xae, 0xab, 0x96, 0x87, 0x9c, 0xaa, + 0x99, 0xa1, 0xb1, 0xa2, 0xa6, 0xaa, 0xad, 0xac, 0xa7, 0xa5, 0xa9, 0xae, + 0xa6, 0xb2, 0xab, 0xb4, 0xad, 0x9f, 0xa5, 0x95, 0x8c, 0x8c, 0x97, 0x99, + 0x8a, 0x82, 0x7f, 0x75, 0x7a, 0x79, 0x78, 0x7c, 0x86, 0x95, 0xa4, 0xae, + 0xb0, 0xb8, 0xbe, 0xb9, 0xac, 0xa2, 0xa3, 0xa8, 0xa7, 0x73, 0x87, 0xa4, + 0xa7, 0xa7, 0x9c, 0xa5, 0x93, 0x9a, 0xb5, 0xb9, 0xac, 0xa7, 0xa5, 0xae, + 0xab, 0xa6, 0xa9, 0xb1, 0xa8, 0xaa, 0x9c, 0x5e, 0x7e, 0xc1, 0xcd, 0x7e, + 0x5f, 0x95, 0x9d, 0x70, 0x99, 0xac, 0xa7, 0xa7, 0xac, 0xa9, 0xae, 0xac, + 0xab, 0xac, 0xa9, 0xae, 0xac, 0xad, 0x8d, 0x8f, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xad, 0xa3, 0xac, 0xb1, 0xa2, 0x9d, 0xa7, 0xa8, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa6, 0xa5, 0xa8, 0xb4, 0xb4, 0x9c, 0x8f, 0x9c, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xb7, 0xb5, 0xad, 0xb0, 0xb9, 0xb0, 0x9b, 0x75, 0x65, 0x60, 0x70, + 0x7d, 0x7f, 0x82, 0x8a, 0x7c, 0x7c, 0x7a, 0x78, 0x74, 0x6f, 0x6b, 0x69, + 0x5d, 0x56, 0x54, 0x5e, 0x6d, 0x76, 0x71, 0x6a, 0x5f, 0x6a, 0x76, 0x79, + 0x72, 0x69, 0x65, 0x64, 0x64, 0x58, 0x48, 0x40, 0x42, 0x49, 0x4e, 0x50, + 0x57, 0x5b, 0x5a, 0x51, 0x43, 0x39, 0x36, 0x38, 0x2f, 0x23, 0x24, 0x1e, + 0x30, 0x59, 0x78, 0x96, 0x89, 0x90, 0x84, 0x5e, 0x55, 0x77, 0x90, 0x92, + 0x95, 0x99, 0xa4, 0xad, 0xb0, 0xb1, 0xb0, 0xac, 0xa9, 0xab, 0xae, 0xb0, + 0xb1, 0xb0, 0xaf, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xad, 0xae, 0xaf, 0xb1, 0xb8, 0xa6, 0x19, 0x07, 0xa4, 0xa6, 0xa9, 0x9d, + 0xa9, 0xac, 0x7d, 0x5d, 0x8b, 0xaa, 0xab, 0xad, 0xad, 0xa8, 0xae, 0xa4, + 0x89, 0xa1, 0xa8, 0x9e, 0x9c, 0xa4, 0xa8, 0xaa, 0xa8, 0xa5, 0xa2, 0xa1, + 0xa4, 0xaa, 0xaf, 0xb3, 0xa9, 0x9f, 0x88, 0x73, 0x60, 0x66, 0x7d, 0x7b, + 0x75, 0x78, 0x8a, 0x97, 0x98, 0xa2, 0xb0, 0xb0, 0xbb, 0xbc, 0xbd, 0xbc, + 0xb9, 0xb4, 0xaf, 0xab, 0xb2, 0xb3, 0xac, 0xa2, 0xa2, 0xac, 0xb1, 0xaf, + 0x7f, 0x88, 0x9c, 0xa3, 0xab, 0xb5, 0xab, 0x9c, 0x9d, 0xaa, 0xb3, 0xa6, + 0xa3, 0xb2, 0xb3, 0xaf, 0xab, 0xaa, 0xaf, 0xb9, 0xb0, 0xb1, 0xae, 0x82, + 0x89, 0x86, 0x85, 0x8f, 0xa8, 0xbc, 0xb2, 0x9a, 0x9d, 0xb0, 0xaa, 0xa9, + 0xad, 0xaa, 0xae, 0xac, 0xac, 0xab, 0xaa, 0xb1, 0xad, 0xab, 0x8c, 0x93, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb0, 0xa4, 0xa9, 0xb4, + 0xac, 0x9e, 0x9f, 0xa7, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xa3, 0x89, 0x7f, 0x95, 0xa1, 0x9e, 0xa1, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xad, 0xb2, 0xb2, 0xad, 0xb2, 0xbb, 0xb8, 0xac, + 0x7e, 0x64, 0x5a, 0x6e, 0x81, 0x82, 0x83, 0x8a, 0x71, 0x75, 0x7a, 0x7c, + 0x7a, 0x75, 0x6e, 0x69, 0x6a, 0x6d, 0x74, 0x7b, 0x7d, 0x79, 0x6f, 0x67, + 0x57, 0x5e, 0x65, 0x67, 0x68, 0x6d, 0x77, 0x80, 0x6e, 0x69, 0x64, 0x64, + 0x65, 0x63, 0x5d, 0x58, 0x61, 0x59, 0x4c, 0x43, 0x40, 0x42, 0x46, 0x4a, + 0x3b, 0x25, 0x3b, 0x2e, 0x14, 0x42, 0x74, 0x79, 0x7d, 0x8f, 0x84, 0x54, + 0x4e, 0x6e, 0x80, 0x97, 0x9c, 0x9d, 0xa8, 0xb0, 0xae, 0xae, 0xae, 0xa7, + 0xa8, 0xaa, 0xad, 0xaf, 0xb1, 0xb1, 0xb0, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xaf, 0xaf, 0xb1, 0xb7, 0xa5, 0x19, 0x06, + 0xa4, 0xa1, 0xa8, 0xae, 0xa8, 0x77, 0x5d, 0x98, 0xbd, 0xb3, 0xa5, 0xab, + 0xa7, 0xa8, 0xad, 0x8c, 0x8f, 0xae, 0xaa, 0x98, 0xa0, 0xa7, 0xa5, 0xad, + 0xaa, 0xa5, 0xa2, 0xa6, 0xac, 0xad, 0xa4, 0x9b, 0x7b, 0x83, 0x9e, 0xa3, + 0xa1, 0xb5, 0xbe, 0xb9, 0x90, 0x97, 0xad, 0xba, 0xb3, 0xb0, 0xae, 0xa4, + 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xab, 0xaa, 0xa9, 0xab, 0xb1, 0xac, 0xa2, + 0xa8, 0xb4, 0xaa, 0x93, 0x79, 0xaa, 0xab, 0xad, 0xaf, 0xa9, 0xae, 0x95, + 0xa3, 0xae, 0xb2, 0xb2, 0xb0, 0xad, 0xad, 0xac, 0xae, 0xae, 0xa9, 0xac, + 0xaa, 0xb2, 0xb8, 0x9b, 0x95, 0xa3, 0xa8, 0xae, 0xb4, 0xb2, 0xa5, 0x92, + 0xa2, 0xb5, 0xae, 0xac, 0xaf, 0xab, 0xae, 0xab, 0xac, 0xab, 0xaa, 0xb3, + 0xae, 0xaa, 0x8c, 0x95, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xab, 0xa8, 0xaf, 0xb2, 0xa5, 0x9c, 0xa1, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xba, 0xaf, 0x9c, 0x98, + 0xaf, 0xc1, 0xb3, 0x9b, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xac, 0xad, 0xac, 0xad, + 0xb1, 0xb5, 0xb3, 0xaf, 0x94, 0x6f, 0x5a, 0x68, 0x75, 0x6d, 0x65, 0x69, + 0x55, 0x5f, 0x6e, 0x7c, 0x81, 0x7f, 0x77, 0x71, 0x78, 0x76, 0x6b, 0x55, + 0x41, 0x3e, 0x4d, 0x5d, 0x40, 0x4a, 0x57, 0x60, 0x69, 0x75, 0x85, 0x91, + 0x8d, 0x84, 0x7a, 0x73, 0x6f, 0x6a, 0x63, 0x5c, 0x58, 0x4e, 0x45, 0x46, + 0x4e, 0x52, 0x4b, 0x43, 0x34, 0x1e, 0x2f, 0x27, 0x1d, 0x50, 0x8b, 0xa3, + 0x9b, 0xa7, 0x84, 0x4d, 0x6c, 0x9d, 0x93, 0x97, 0xa3, 0xa0, 0xab, 0xb3, + 0xac, 0xab, 0xac, 0xa1, 0xa8, 0xaa, 0xad, 0xaf, 0xb1, 0xb1, 0xb1, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xae, 0xaf, 0xb0, 0xb1, + 0xb7, 0xa5, 0x18, 0x05, 0xa8, 0xa6, 0xad, 0xae, 0x7a, 0x61, 0x95, 0xb7, + 0xaa, 0xa5, 0xb0, 0xa3, 0xa3, 0xb6, 0xa4, 0x8b, 0x9e, 0xaa, 0xa8, 0x9d, + 0x9e, 0xa8, 0xab, 0xa8, 0xab, 0xa9, 0xac, 0xb5, 0xba, 0xad, 0x90, 0x78, + 0x9a, 0x99, 0xb7, 0xac, 0x9d, 0xac, 0xa5, 0x9e, 0x8d, 0x90, 0xa0, 0xaa, + 0xa3, 0xa4, 0xa8, 0xa3, 0xaa, 0xa9, 0xa7, 0xa6, 0xa6, 0xa6, 0xa8, 0xa8, + 0x9c, 0xae, 0xb1, 0xa7, 0xab, 0xb3, 0x9e, 0x79, 0x9d, 0x9c, 0xab, 0xac, + 0xb1, 0xb2, 0x9b, 0x98, 0xa6, 0xb7, 0xb0, 0xaa, 0xaa, 0xaa, 0xb1, 0xab, + 0xa7, 0xaf, 0xab, 0xb2, 0xb8, 0xaf, 0x83, 0x3a, 0x8f, 0xb1, 0xac, 0x96, + 0x9b, 0xae, 0xa8, 0x84, 0xa6, 0xb8, 0xb1, 0xae, 0xb0, 0xab, 0xae, 0xab, + 0xac, 0xab, 0xab, 0xb4, 0xae, 0xa9, 0x8b, 0x96, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xac, 0xb2, 0xaa, 0xa9, 0xb4, 0xac, 0x9b, 0x9c, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x99, 0x86, 0x7d, 0x79, 0x78, 0x8c, 0xa1, 0xa1, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb6, 0xb2, 0xb1, 0xb3, 0xb4, 0xb2, 0xaf, 0xaf, 0x99, 0x70, 0x5a, 0x6a, + 0x7a, 0x73, 0x6a, 0x6e, 0x69, 0x74, 0x82, 0x8c, 0x8c, 0x81, 0x71, 0x67, + 0x41, 0x42, 0x48, 0x52, 0x5b, 0x59, 0x4d, 0x41, 0x72, 0x7b, 0x83, 0x81, + 0x74, 0x66, 0x5d, 0x5a, 0x67, 0x65, 0x65, 0x68, 0x6c, 0x6b, 0x64, 0x5d, + 0x5c, 0x4e, 0x42, 0x46, 0x52, 0x56, 0x4a, 0x3b, 0x35, 0x2f, 0x2d, 0x28, + 0x3b, 0x4e, 0x5a, 0x7d, 0x72, 0xa3, 0x8c, 0x3d, 0x4e, 0x7f, 0x7e, 0x96, + 0xa7, 0xa2, 0xae, 0xb4, 0xab, 0xaa, 0xaa, 0x9e, 0xa7, 0xa9, 0xac, 0xaf, + 0xb1, 0xb1, 0xb1, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xaf, 0xb0, 0xb0, 0xb1, 0xb7, 0xa5, 0x18, 0x05, 0xa7, 0xb0, 0xa9, 0x7a, + 0x5e, 0x8a, 0xb5, 0xa9, 0xa9, 0xa2, 0xae, 0xa7, 0xa7, 0xaa, 0x97, 0x99, + 0xa7, 0xab, 0xab, 0xa2, 0x98, 0x99, 0xa5, 0xb2, 0xab, 0xa7, 0xb0, 0xb5, + 0x96, 0x70, 0x79, 0xa0, 0xa8, 0xb3, 0xa2, 0x97, 0xaa, 0xae, 0xa6, 0xad, + 0x8c, 0x81, 0xad, 0xad, 0x9e, 0xaf, 0xa7, 0xa7, 0xab, 0xa5, 0xa5, 0xab, + 0xab, 0xa7, 0xa8, 0xae, 0xa7, 0xb8, 0xa8, 0xa1, 0xb6, 0x9d, 0x7f, 0x9d, + 0xad, 0x9a, 0xa7, 0xae, 0xb0, 0xa9, 0x97, 0xa4, 0xb3, 0xb3, 0xb1, 0xb0, + 0xaf, 0xae, 0xae, 0xad, 0xb1, 0xad, 0xa6, 0xad, 0xb4, 0xa4, 0xa1, 0xbc, + 0xc7, 0xb0, 0xa8, 0xa0, 0xa5, 0xb1, 0xa6, 0x9d, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xb2, 0xb2, 0xaa, 0xb1, 0xaf, 0xa7, 0x8a, 0xa2, + 0xb0, 0xb0, 0xaf, 0xae, 0xae, 0xad, 0xac, 0xac, 0xaf, 0xae, 0xae, 0xad, + 0xac, 0xab, 0xaa, 0xa9, 0x97, 0xae, 0xb0, 0xa9, 0xb0, 0xaf, 0xa8, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0x97, 0x4d, 0x28, 0x59, 0x98, 0xa5, 0x96, 0x8e, + 0xa2, 0xab, 0xb0, 0xac, 0xaa, 0xad, 0xae, 0xab, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0x95, 0x6e, 0x54, 0x5f, 0x71, 0x74, 0x76, 0x7d, 0x77, 0x7b, 0x82, 0x85, + 0x81, 0x75, 0x66, 0x5b, 0x63, 0x5a, 0x57, 0x5f, 0x6d, 0x6f, 0x63, 0x54, + 0x65, 0x6f, 0x6f, 0x5b, 0x3f, 0x33, 0x40, 0x53, 0x6a, 0x6f, 0x75, 0x78, + 0x74, 0x6a, 0x5e, 0x56, 0x55, 0x55, 0x54, 0x51, 0x4c, 0x45, 0x3e, 0x3a, + 0x2c, 0x37, 0x34, 0x27, 0x52, 0x64, 0x49, 0x66, 0x80, 0x9c, 0x74, 0x4f, + 0x68, 0x79, 0x82, 0xa4, 0xa5, 0x9c, 0xa5, 0xb3, 0xb0, 0xa9, 0xa8, 0xa5, + 0xa2, 0xa9, 0xb1, 0xb4, 0xb3, 0xb0, 0xaf, 0xaf, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xae, 0xae, 0xb3, 0xbc, 0xaa, 0x19, 0x02, + 0xab, 0xac, 0x7b, 0x61, 0x96, 0xbf, 0xb0, 0x9e, 0xa5, 0xaa, 0xaa, 0xa6, + 0xac, 0xa4, 0x94, 0xa0, 0xa7, 0xab, 0xad, 0xa9, 0xa1, 0x9d, 0xa1, 0xa6, + 0xac, 0xa7, 0x8d, 0x6f, 0x76, 0x9e, 0xb9, 0xba, 0xb3, 0xab, 0x9f, 0x9d, + 0x9f, 0xa0, 0xaa, 0xbc, 0x96, 0x7c, 0x9f, 0xac, 0xab, 0xb8, 0xab, 0xaa, + 0xab, 0xad, 0xad, 0xaa, 0xa5, 0xa3, 0xa9, 0xb1, 0xaa, 0xa9, 0xad, 0xad, + 0xab, 0x92, 0x89, 0xba, 0xab, 0x9d, 0xaa, 0xb0, 0xae, 0xa7, 0x99, 0xa7, + 0xb0, 0xac, 0xa8, 0xa5, 0xa5, 0xa9, 0xaf, 0xb3, 0xb2, 0xae, 0xae, 0xb5, + 0xb3, 0xa3, 0xa2, 0xb5, 0xb9, 0xab, 0xae, 0xae, 0xb3, 0xb6, 0xa0, 0x92, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb2, 0xb2, 0xab, 0xb1, + 0xaf, 0xa7, 0x8b, 0xa3, 0xb0, 0xb0, 0xaf, 0xaf, 0xae, 0xad, 0xad, 0xac, + 0xaf, 0xae, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xaa, 0x9a, 0xab, 0xb0, 0xac, + 0xad, 0xaf, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xba, 0xc2, 0xcb, 0xcb, + 0xbf, 0xad, 0xa0, 0x9a, 0xa3, 0xac, 0xb0, 0xac, 0xaa, 0xad, 0xae, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xa6, 0x82, 0x67, 0x6b, 0x74, 0x70, 0x6d, 0x70, + 0x6a, 0x75, 0x7e, 0x79, 0x6a, 0x5f, 0x60, 0x66, 0x63, 0x63, 0x66, 0x6a, + 0x6d, 0x68, 0x5e, 0x56, 0x69, 0x65, 0x5e, 0x57, 0x55, 0x5c, 0x69, 0x72, + 0x6d, 0x70, 0x73, 0x73, 0x6e, 0x63, 0x58, 0x51, 0x5b, 0x5b, 0x5b, 0x59, + 0x54, 0x4e, 0x48, 0x45, 0x26, 0x29, 0x31, 0x38, 0x65, 0x7b, 0x62, 0x6e, + 0x9e, 0xa9, 0x86, 0x61, 0x5c, 0x7d, 0xa4, 0x99, 0xa1, 0xa2, 0xae, 0xb3, + 0xa7, 0xa1, 0xa8, 0xaa, 0xa3, 0xa9, 0xb1, 0xb4, 0xb3, 0xb0, 0xaf, 0xb0, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb0, 0xb1, 0xb5, + 0xbe, 0xac, 0x1b, 0x03, 0xa2, 0x79, 0x6a, 0x94, 0xbc, 0xb3, 0xa5, 0xaf, + 0xa2, 0xb1, 0xa6, 0xa7, 0xaf, 0x9b, 0x95, 0xa8, 0xa7, 0xaa, 0xae, 0xae, + 0xab, 0xa5, 0x9e, 0x9a, 0xb2, 0xa6, 0x9e, 0xa5, 0xb4, 0xb9, 0xb1, 0xa5, + 0xac, 0xa9, 0xa6, 0xa1, 0xa5, 0xb8, 0xc0, 0xb4, 0x83, 0x65, 0x7f, 0x91, + 0x94, 0x9e, 0x99, 0xa3, 0xa4, 0xa9, 0xae, 0xae, 0xac, 0xac, 0xae, 0xb1, + 0xac, 0xb3, 0xa7, 0xb7, 0x8f, 0x7d, 0xbd, 0xb7, 0xa6, 0xa1, 0xae, 0xb2, + 0xab, 0xa2, 0x9c, 0xac, 0xb4, 0xb1, 0xad, 0xaa, 0xab, 0xae, 0xb2, 0xb5, + 0xab, 0xa6, 0xad, 0xb2, 0xa7, 0x9f, 0xa9, 0xb6, 0xb0, 0xaa, 0xb2, 0xb6, + 0xbb, 0xb6, 0x9b, 0x91, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb2, 0xb2, 0xab, 0xb2, 0xb0, 0xa7, 0x8b, 0xa3, 0xb1, 0xb1, 0xb0, 0xaf, + 0xaf, 0xae, 0xad, 0xad, 0xae, 0xae, 0xae, 0xad, 0xad, 0xac, 0xac, 0xab, + 0xa0, 0xa6, 0xaf, 0xb0, 0xab, 0xae, 0xb0, 0xaa, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xa5, 0xb7, 0xbc, 0xb0, 0xaa, 0xaf, 0xab, 0x9e, 0xa3, 0xac, 0xb1, 0xad, + 0xab, 0xae, 0xaf, 0xac, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb1, + 0xb1, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xad, 0x8a, 0x69, 0x60, + 0x64, 0x67, 0x6e, 0x77, 0x6c, 0x77, 0x82, 0x83, 0x7b, 0x71, 0x6c, 0x6c, + 0x6f, 0x6d, 0x68, 0x61, 0x5d, 0x62, 0x6c, 0x75, 0x62, 0x5c, 0x58, 0x5b, + 0x64, 0x6c, 0x70, 0x6f, 0x6b, 0x6f, 0x73, 0x75, 0x70, 0x67, 0x5c, 0x55, + 0x58, 0x59, 0x59, 0x58, 0x55, 0x50, 0x4b, 0x48, 0x4c, 0x30, 0x2a, 0x38, + 0x62, 0x82, 0x75, 0x6e, 0x52, 0x70, 0x84, 0x65, 0x52, 0x7a, 0x99, 0x96, + 0xa3, 0xa7, 0xb0, 0xad, 0xa0, 0xa1, 0xaa, 0xa8, 0xa5, 0xaa, 0xb1, 0xb4, + 0xb2, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb3, 0xb2, 0xb6, 0xc0, 0xad, 0x1c, 0x04, 0x72, 0x75, 0xa0, 0xbc, + 0xa8, 0xa1, 0xaf, 0xab, 0xa4, 0xb1, 0xa5, 0xac, 0xaa, 0x93, 0x9e, 0xac, + 0xa9, 0xa9, 0xaa, 0xae, 0xb0, 0xac, 0xa2, 0x9a, 0xad, 0xb0, 0xab, 0x9e, + 0x9c, 0xa7, 0xaf, 0xae, 0xb0, 0xa7, 0x99, 0x9b, 0xb3, 0xb2, 0x73, 0x29, + 0x55, 0x64, 0x9b, 0xaf, 0x9f, 0x98, 0x9f, 0xb6, 0xb3, 0xab, 0xa6, 0xa9, + 0xab, 0xac, 0xb0, 0xb6, 0xad, 0xa8, 0xc1, 0x9d, 0x84, 0xac, 0xb0, 0xa1, + 0xa3, 0xa6, 0xb2, 0xb4, 0xa9, 0x9f, 0xa2, 0xb1, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb4, 0xb2, 0xaf, 0xad, 0xb8, 0xb0, 0xb6, 0xb4, 0xa0, 0xa0, 0xb1, 0xb6, + 0xb3, 0xad, 0xb2, 0xb2, 0xb7, 0xb1, 0x9b, 0x9d, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb3, 0xb3, 0xac, 0xb3, 0xb0, 0xa8, 0x8c, 0xa4, + 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xad, 0xad, 0xad, 0xa7, 0xa2, 0xad, 0xb2, 0xa9, 0xae, 0xb4, 0xaa, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xac, 0xae, 0xad, 0xab, 0xac, 0xae, 0xa7, 0x9d, + 0xa4, 0xad, 0xb1, 0xad, 0xab, 0xae, 0xaf, 0xac, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xbb, 0x9e, 0x7b, 0x65, 0x5f, 0x62, 0x6b, 0x74, 0x74, 0x7b, 0x80, 0x7e, + 0x72, 0x62, 0x54, 0x4e, 0x5f, 0x64, 0x6a, 0x6d, 0x6f, 0x72, 0x77, 0x7b, + 0x77, 0x7d, 0x84, 0x88, 0x85, 0x7c, 0x71, 0x6a, 0x7c, 0x81, 0x85, 0x82, + 0x74, 0x5e, 0x47, 0x38, 0x4d, 0x4e, 0x4f, 0x4f, 0x4c, 0x48, 0x43, 0x40, + 0x3f, 0x39, 0x4a, 0x4f, 0x43, 0x51, 0x70, 0x85, 0x92, 0x6f, 0x87, 0x72, + 0x66, 0x8e, 0x86, 0x78, 0xaa, 0xa9, 0xaa, 0xa4, 0x9e, 0xa8, 0xac, 0xa0, + 0xa7, 0xac, 0xb1, 0xb3, 0xb2, 0xb0, 0xb1, 0xb3, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb2, 0xb2, 0xb6, 0xbf, 0xac, 0x1a, 0x02, + 0x6d, 0xa0, 0xbc, 0xae, 0xa6, 0xaf, 0xaf, 0xa2, 0xab, 0xaa, 0xa7, 0xb0, + 0x9f, 0x93, 0xab, 0xaa, 0xac, 0xa8, 0xa5, 0xa8, 0xae, 0xb0, 0xab, 0xa5, + 0x8c, 0xa1, 0xa9, 0x9d, 0x9b, 0xaa, 0xaf, 0xa7, 0xab, 0xad, 0xa3, 0xa6, + 0xb1, 0x96, 0x65, 0x50, 0x9f, 0x98, 0xa2, 0xa9, 0xad, 0xb4, 0xae, 0xa8, + 0xb3, 0xab, 0xac, 0xb3, 0xb0, 0xa4, 0xa6, 0xb2, 0xb5, 0xad, 0xa0, 0x7e, + 0x99, 0xbd, 0xa3, 0xa3, 0xa1, 0xab, 0xb3, 0xb4, 0xa8, 0x9e, 0xa8, 0xb4, + 0xaa, 0xac, 0xaf, 0xb1, 0xb1, 0xaf, 0xac, 0xaa, 0xad, 0xaa, 0xb2, 0xae, + 0x9e, 0xa4, 0xb4, 0xb2, 0xb5, 0xb0, 0xb2, 0xaf, 0xb5, 0xac, 0x9b, 0xa9, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, 0xb4, 0xad, 0xb3, + 0xb1, 0xa9, 0x8d, 0xa5, 0xb2, 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xab, 0xa2, 0xaa, 0xb2, + 0xab, 0xae, 0xb4, 0xac, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xab, 0xab, 0xaf, 0xb3, + 0xb3, 0xac, 0xa5, 0xa1, 0xa5, 0xae, 0xb2, 0xae, 0xac, 0xaf, 0xb0, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xab, 0x97, 0x82, 0x78, 0x79, 0x7e, 0x80, + 0x70, 0x7a, 0x80, 0x78, 0x66, 0x5b, 0x5e, 0x66, 0x79, 0x6d, 0x60, 0x5c, + 0x63, 0x73, 0x82, 0x8c, 0x85, 0x89, 0x90, 0x95, 0x93, 0x87, 0x75, 0x68, + 0x6c, 0x69, 0x65, 0x60, 0x5c, 0x59, 0x57, 0x56, 0x4a, 0x4b, 0x4b, 0x4a, + 0x47, 0x42, 0x3d, 0x3a, 0x31, 0x26, 0x3b, 0x56, 0x50, 0x55, 0x6d, 0x6d, + 0x94, 0x74, 0x87, 0x98, 0x86, 0x8b, 0x9a, 0x92, 0xa8, 0xa7, 0xa8, 0xa3, + 0x9e, 0xa8, 0xad, 0xa0, 0xa9, 0xad, 0xb1, 0xb3, 0xb1, 0xb1, 0xb3, 0xb5, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb1, 0xb4, + 0xbd, 0xaa, 0x18, 0x00, 0xa5, 0xaf, 0xaa, 0xaa, 0xb6, 0xb1, 0xa7, 0xac, + 0xb0, 0xa6, 0xaa, 0xac, 0x97, 0x9b, 0xb2, 0xa8, 0xae, 0xa9, 0xa4, 0xa6, + 0xac, 0xb0, 0xb0, 0xae, 0xa8, 0x98, 0x97, 0xab, 0xb7, 0xb2, 0xaf, 0xb4, + 0xaa, 0xad, 0x9d, 0xa0, 0xb2, 0x90, 0x53, 0x3b, 0x93, 0x99, 0xa0, 0xa4, + 0xa8, 0xae, 0xae, 0xac, 0xa4, 0xa6, 0xac, 0xb1, 0xaa, 0xa4, 0xad, 0xbd, + 0xb2, 0x9e, 0x72, 0x9c, 0xb4, 0xa6, 0xbb, 0xa0, 0xa1, 0xb0, 0xb2, 0xb4, + 0xa9, 0xa0, 0xae, 0xb5, 0xad, 0xad, 0xad, 0xae, 0xb0, 0xb3, 0xb5, 0xb7, + 0xac, 0xb1, 0xb3, 0xaa, 0xa3, 0xac, 0xb2, 0xa9, 0xb0, 0xb1, 0xb4, 0xb3, + 0xb8, 0xab, 0x98, 0xae, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xad, 0xb4, 0xb2, 0xaa, 0x8d, 0xa5, 0xb3, 0xb3, 0xb2, 0xb1, + 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, + 0xae, 0xa5, 0xa7, 0xaf, 0xaf, 0xaf, 0xb1, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb6, 0xb6, 0xaf, 0xa8, 0xa9, 0xad, 0xa8, 0x9e, 0xa5, 0xae, 0xb3, 0xaf, + 0xad, 0xb0, 0xb1, 0xae, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb4, 0xb5, 0xb5, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb3, 0x9c, 0x78, + 0x62, 0x61, 0x67, 0x68, 0x67, 0x6e, 0x77, 0x7c, 0x7e, 0x7e, 0x81, 0x84, + 0x76, 0x72, 0x6e, 0x6f, 0x73, 0x75, 0x73, 0x71, 0x73, 0x6c, 0x69, 0x71, + 0x7e, 0x7f, 0x71, 0x62, 0x5e, 0x6b, 0x7d, 0x88, 0x85, 0x74, 0x5e, 0x4e, + 0x55, 0x55, 0x54, 0x51, 0x4c, 0x46, 0x3f, 0x3c, 0x30, 0x30, 0x41, 0x5c, + 0x4e, 0x44, 0x63, 0x6c, 0x94, 0xb1, 0x65, 0x79, 0xbb, 0x9f, 0x8e, 0x86, + 0x9e, 0xa2, 0xac, 0xaa, 0x9e, 0xa1, 0xaa, 0xa8, 0xab, 0xae, 0xb2, 0xb2, + 0xb1, 0xb1, 0xb4, 0xb7, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb6, 0xb4, 0xb3, 0xb6, 0xbe, 0xab, 0x18, 0x00, 0xb9, 0xad, 0xa9, 0xaa, + 0xaa, 0xae, 0xaf, 0xa9, 0xb1, 0xa9, 0xad, 0x9f, 0x95, 0xa8, 0xb1, 0xa9, + 0xaf, 0xac, 0xa9, 0xa9, 0xab, 0xae, 0xaf, 0xaf, 0xaf, 0x9f, 0x93, 0x9a, + 0xa7, 0xaf, 0xb3, 0xb5, 0xa6, 0xa7, 0x9f, 0xa3, 0xb4, 0xb1, 0x9f, 0x98, + 0xb1, 0xa4, 0x94, 0x98, 0xa3, 0xa8, 0xae, 0xb0, 0xab, 0xad, 0xa7, 0x9d, + 0x9f, 0xae, 0xb6, 0xb4, 0x98, 0x7a, 0x9f, 0xc0, 0xba, 0xb9, 0xab, 0x96, + 0xa3, 0xb2, 0xaf, 0xb2, 0xaa, 0xa3, 0xb3, 0xb4, 0xb7, 0xb6, 0xb6, 0xb5, + 0xb4, 0xb4, 0xb4, 0xb4, 0xc1, 0xc6, 0xb6, 0xa0, 0xa3, 0xb1, 0xb3, 0xad, + 0xae, 0xb1, 0xb5, 0xb5, 0xba, 0xa9, 0x96, 0xb2, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xae, 0xb5, 0xb2, 0xaa, 0x8e, 0xa6, + 0xb4, 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, 0xb0, 0xb0, 0xad, 0xae, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb2, 0xaf, 0xa9, 0xa4, 0xab, 0xb4, 0xb1, 0xad, 0xb4, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xa4, 0xb0, 0xb5, 0xad, 0xa9, 0xad, 0xae, 0xa9, + 0xa6, 0xaf, 0xb3, 0xaf, 0xad, 0xb0, 0xb1, 0xae, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xbe, 0xbd, 0xa3, 0x77, 0x60, 0x6c, 0x80, 0x88, 0x82, 0x7f, 0x81, 0x8c, + 0x98, 0x98, 0x8c, 0x7f, 0x7c, 0x79, 0x73, 0x6b, 0x66, 0x68, 0x72, 0x7a, + 0x75, 0x70, 0x6e, 0x74, 0x7d, 0x7d, 0x74, 0x69, 0x5b, 0x5a, 0x5a, 0x5b, + 0x5c, 0x5e, 0x61, 0x62, 0x60, 0x5f, 0x5d, 0x58, 0x51, 0x49, 0x41, 0x3c, + 0x4e, 0x3d, 0x31, 0x55, 0x64, 0x5a, 0x68, 0x61, 0x71, 0xc5, 0x60, 0x23, + 0x7a, 0x87, 0x75, 0x98, 0x99, 0x9b, 0xa8, 0xaf, 0xa4, 0xa1, 0xa8, 0xab, + 0xac, 0xaf, 0xb2, 0xb2, 0xb0, 0xb1, 0xb5, 0xb9, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xba, 0xb9, 0xbb, 0xc3, 0xaf, 0x1d, 0x05, + 0xad, 0xa9, 0xa6, 0xa7, 0xa9, 0xa9, 0xa8, 0xa5, 0xb0, 0xae, 0xaf, 0x95, + 0x96, 0xb1, 0xac, 0xaa, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, 0xab, 0xab, + 0xae, 0xad, 0xa8, 0x9e, 0x98, 0x99, 0xa1, 0xa8, 0xb9, 0x98, 0x90, 0xa7, + 0xb2, 0xae, 0xb4, 0xc1, 0xba, 0xad, 0x9f, 0xad, 0xb7, 0xac, 0xac, 0xb1, + 0xa9, 0xb4, 0xb3, 0xac, 0xb8, 0xc2, 0xa1, 0x70, 0x7f, 0xa7, 0xba, 0xad, + 0xad, 0xb5, 0xaa, 0xa1, 0xa5, 0xb4, 0xad, 0xb1, 0xac, 0xa5, 0xb6, 0xb3, + 0xb8, 0xb9, 0xbb, 0xb9, 0xb4, 0xab, 0xa1, 0x9b, 0xa4, 0xa8, 0x8d, 0x76, + 0x8c, 0xae, 0xbc, 0xc2, 0xb1, 0xb4, 0xb4, 0xb1, 0xb7, 0xa6, 0x97, 0xb9, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xae, 0xb5, + 0xb3, 0xaa, 0x8e, 0xa6, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, 0xb1, 0xb0, 0xb0, + 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xaf, 0xad, 0xa3, 0xa8, + 0xb8, 0xb2, 0xaa, 0xb6, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb6, 0xb0, 0xaa, 0xaa, + 0xae, 0xaf, 0xaa, 0xa5, 0xa6, 0xaf, 0xb4, 0xb0, 0xae, 0xb1, 0xb2, 0xaf, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbd, 0xa8, 0x7d, 0x66, 0x73, 0x88, 0x8f, + 0x79, 0x76, 0x74, 0x74, 0x76, 0x76, 0x73, 0x70, 0x66, 0x72, 0x7a, 0x76, + 0x6a, 0x67, 0x71, 0x7e, 0x7e, 0x89, 0x93, 0x92, 0x86, 0x77, 0x6e, 0x6b, + 0x66, 0x6d, 0x75, 0x79, 0x73, 0x65, 0x55, 0x4a, 0x64, 0x63, 0x60, 0x5a, + 0x51, 0x47, 0x3e, 0x39, 0x32, 0x38, 0x3b, 0x6b, 0x7d, 0x69, 0x73, 0x73, + 0x7f, 0xac, 0x8a, 0x1d, 0x50, 0xb5, 0x9a, 0x98, 0x9c, 0x94, 0x9e, 0xae, + 0xad, 0xa8, 0xa8, 0xa7, 0xad, 0xb0, 0xb2, 0xb1, 0xb0, 0xb1, 0xb5, 0xb9, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc1, 0xbf, 0xbe, 0xc0, + 0xc8, 0xb4, 0x21, 0x09, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xb9, 0x9e, 0x95, 0xaa, 0xae, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xae, 0xb2, 0xb3, 0xaf, 0xa6, 0x9d, 0x99, 0x98, + 0xaf, 0x9a, 0xa4, 0xb4, 0xac, 0xac, 0xb1, 0xa5, 0xae, 0xa7, 0x9b, 0xa8, + 0xb0, 0xac, 0xb1, 0xad, 0xb6, 0xa4, 0xb1, 0xcb, 0xb1, 0x79, 0x79, 0xa6, + 0xc6, 0xac, 0xab, 0xac, 0xb7, 0xb5, 0x99, 0x99, 0xb3, 0xaf, 0xb0, 0xa8, + 0x9e, 0xac, 0xba, 0xb2, 0xb6, 0xb2, 0xb1, 0xb5, 0xb2, 0x99, 0x6e, 0x4c, + 0x77, 0x97, 0xae, 0xae, 0xb0, 0xbb, 0xbc, 0xb1, 0xb7, 0xb3, 0xab, 0xbf, + 0xb3, 0x93, 0xa7, 0xbf, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb3, 0xb4, 0xb9, 0xb1, 0xb6, 0xaa, 0x96, 0xb9, 0xb5, 0xb5, 0xb4, 0xb3, + 0xb3, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xb4, 0xa8, 0xa0, 0xae, 0xb5, 0xb0, 0xb2, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xae, 0xaf, 0xb0, 0xb1, 0xb1, 0xaf, 0xad, 0xac, + 0xb2, 0xae, 0xac, 0xaf, 0xb4, 0xb1, 0xa5, 0x9a, 0x98, 0xa9, 0xb1, 0xaa, + 0xab, 0xb6, 0xb8, 0xae, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb4, 0xb4, 0xb3, 0xb3, 0xb4, 0xb5, + 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xc0, 0xb1, 0xa1, 0x80, + 0x70, 0x74, 0x6e, 0x70, 0x77, 0x75, 0x78, 0x7d, 0x7c, 0x78, 0x7c, 0x85, + 0x77, 0x79, 0x7b, 0x7a, 0x78, 0x78, 0x7b, 0x7e, 0x7b, 0x7a, 0x82, 0x8b, + 0x83, 0x71, 0x6f, 0x7a, 0x82, 0x79, 0x6d, 0x62, 0x5d, 0x5c, 0x5c, 0x5d, + 0x59, 0x54, 0x51, 0x51, 0x53, 0x51, 0x4b, 0x45, 0x40, 0x43, 0x2f, 0x48, + 0x77, 0x55, 0x31, 0x58, 0x7a, 0x8e, 0x7e, 0x31, 0x3e, 0x68, 0x97, 0x8d, + 0x98, 0x9e, 0xa3, 0xac, 0xa6, 0xa0, 0xae, 0xaf, 0xb7, 0xb2, 0xad, 0xae, + 0xb3, 0xb6, 0xb4, 0xb1, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb6, 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb7, 0xb4, 0xb2, + 0xb2, 0xb5, 0xb8, 0xba, 0xc6, 0xc3, 0xbe, 0xb9, 0xb7, 0xb7, 0xb9, 0xba, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb6, 0xb8, 0xbb, 0xbf, + 0xc4, 0xc8, 0xcc, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xb8, 0x9e, 0x97, 0xab, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb4, 0xaf, 0xa9, 0xaa, + 0xad, 0xac, 0xa4, 0x9c, 0x90, 0x84, 0x98, 0xb2, 0xb1, 0xb4, 0xb8, 0xab, + 0xb1, 0xa8, 0x99, 0xa5, 0xae, 0xae, 0xb8, 0xb7, 0xbc, 0xbe, 0xa1, 0x73, + 0x70, 0x99, 0xb5, 0xb2, 0xaf, 0xb2, 0xa9, 0xaf, 0xb6, 0xa0, 0x94, 0xa2, + 0xb2, 0xae, 0xaf, 0xa8, 0xa0, 0xad, 0xb9, 0xb3, 0xb4, 0xb1, 0xaf, 0xb1, + 0xb4, 0xb2, 0xa9, 0xa2, 0xc0, 0xc9, 0xc4, 0xb1, 0xa5, 0xaa, 0xb2, 0xb2, + 0xb5, 0xb3, 0xb1, 0xbe, 0xad, 0x95, 0xac, 0xbe, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb5, 0xb9, 0xb2, 0xb6, 0xa9, 0x99, 0xba, + 0xb5, 0xb5, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xaf, 0xb4, 0xa9, 0xa2, 0xae, 0xb5, 0xb1, 0xb2, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xad, 0xae, 0xb0, 0xb1, + 0xb1, 0xb0, 0xae, 0xad, 0xac, 0xab, 0xac, 0xaf, 0xb2, 0xb3, 0xb1, 0xaf, + 0x9c, 0xa7, 0xb0, 0xb2, 0xb2, 0xb4, 0xb3, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, + 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbd, 0xb4, 0xac, 0x90, 0x81, 0x83, 0x7c, 0x7e, 0x78, 0x72, 0x73, 0x7c, + 0x81, 0x7f, 0x7c, 0x7e, 0x92, 0x86, 0x75, 0x69, 0x68, 0x70, 0x7b, 0x83, + 0x80, 0x7b, 0x7b, 0x7d, 0x75, 0x69, 0x6c, 0x78, 0x77, 0x64, 0x50, 0x4c, + 0x54, 0x5b, 0x57, 0x50, 0x43, 0x41, 0x43, 0x47, 0x4c, 0x4a, 0x42, 0x3a, + 0x3e, 0x53, 0x46, 0x45, 0x63, 0x56, 0x37, 0x3f, 0x88, 0x93, 0x7f, 0x5e, + 0x47, 0x4a, 0x51, 0x5f, 0x84, 0xa5, 0xb5, 0xac, 0x99, 0x9b, 0xb0, 0xae, + 0xb1, 0xae, 0xad, 0xaf, 0xb4, 0xb6, 0xb4, 0xb0, 0xb3, 0xb4, 0xb4, 0xb5, + 0xb6, 0xb6, 0xb7, 0xb7, 0xb9, 0xb8, 0xb6, 0xb4, 0xb4, 0xb5, 0xb7, 0xb8, + 0xb9, 0xb7, 0xb6, 0xb5, 0xb6, 0xb9, 0xbc, 0xbe, 0xc3, 0xc1, 0xbe, 0xbb, + 0xb8, 0xb7, 0xb7, 0xb7, 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, + 0xbe, 0xbf, 0xc1, 0xc4, 0xc7, 0xca, 0xcc, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, + 0xcb, 0xcb, 0xca, 0xca, 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xb5, 0x9d, 0x9a, + 0xac, 0xae, 0xaf, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xac, 0xab, 0xac, 0xae, 0xb0, 0xad, 0x93, 0x89, 0x88, + 0x81, 0x8e, 0xa4, 0xa7, 0xa9, 0xa8, 0xa3, 0xb2, 0xb6, 0xa6, 0x9d, 0x90, + 0x6c, 0x6c, 0x80, 0xa5, 0xbf, 0xc0, 0xb7, 0xb4, 0xa2, 0xb2, 0xad, 0xb7, + 0xac, 0x91, 0xa0, 0xac, 0xb2, 0xad, 0xac, 0xa8, 0xa4, 0xae, 0xb8, 0xb3, + 0xab, 0xb1, 0xb7, 0xb8, 0xb7, 0xb8, 0xbd, 0xc2, 0xbb, 0xbb, 0xb8, 0xaf, + 0xa9, 0xac, 0xb6, 0xbe, 0xb3, 0xb4, 0xb9, 0xbc, 0xa4, 0x9a, 0xb4, 0xbb, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb5, 0xb6, 0xb8, 0xb4, + 0xb6, 0xa8, 0x9e, 0xbb, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb0, 0xb4, 0xac, 0xa4, + 0xac, 0xb3, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xac, 0xae, 0xb0, 0xb1, 0xb1, 0xb0, 0xae, 0xad, 0xb5, 0xb5, 0xb4, 0xb1, + 0xae, 0xad, 0xb0, 0xb3, 0x98, 0x9e, 0xaa, 0xb4, 0xb5, 0xb1, 0xaf, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb4, 0xb5, 0xb5, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xb5, 0xad, 0x91, 0x81, 0x86, 0x85, 0x8c, + 0x84, 0x89, 0x8f, 0x8e, 0x80, 0x72, 0x74, 0x7e, 0x86, 0x78, 0x6a, 0x67, + 0x71, 0x7e, 0x86, 0x89, 0x7d, 0x80, 0x87, 0x8d, 0x86, 0x76, 0x6f, 0x70, + 0x6a, 0x64, 0x61, 0x65, 0x69, 0x61, 0x4d, 0x3b, 0x39, 0x46, 0x4d, 0x44, + 0x36, 0x36, 0x4b, 0x61, 0x4c, 0x44, 0x39, 0x43, 0x51, 0x46, 0x46, 0x60, + 0x80, 0xa6, 0x86, 0x68, 0x57, 0x84, 0x76, 0x6b, 0x8d, 0xc6, 0xae, 0x9e, + 0x9f, 0x9d, 0xb5, 0xac, 0xa9, 0xa9, 0xac, 0xb1, 0xb6, 0xb7, 0xb3, 0xb0, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xb7, 0xb6, 0xb5, + 0xb5, 0xb6, 0xb8, 0xb9, 0xba, 0xb9, 0xb9, 0xba, 0xbc, 0xbf, 0xc2, 0xc4, + 0xc0, 0xc0, 0xc0, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4, 0xb6, 0xb7, 0xb8, 0xba, + 0xbc, 0xbe, 0xbf, 0xc0, 0xc5, 0xc6, 0xc7, 0xc8, 0xca, 0xcb, 0xcd, 0xcd, + 0xce, 0xcd, 0xcc, 0xcc, 0xcb, 0xca, 0xc9, 0xc9, 0xc6, 0xc7, 0xc3, 0xc9, + 0xd4, 0xb4, 0x18, 0x07, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xb1, 0x9d, 0x9f, 0xae, 0xae, 0xb1, 0xaf, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xab, 0xae, 0xaf, 0xac, 0xa7, 0xa9, 0xb0, 0xb8, + 0xa6, 0xa3, 0xaf, 0xb7, 0xab, 0xa0, 0x95, 0x84, 0x8d, 0x82, 0x70, 0x7a, + 0x86, 0x8b, 0x9c, 0xa0, 0xb9, 0xc2, 0xc0, 0xb4, 0xb3, 0xba, 0xb3, 0xa1, + 0xad, 0xab, 0xb3, 0xb6, 0x99, 0x9a, 0xb8, 0xae, 0xb1, 0xac, 0xa9, 0xa7, + 0xa9, 0xb0, 0xb5, 0xb4, 0xab, 0xb5, 0xbf, 0xc0, 0xb8, 0xb2, 0xb1, 0xb3, + 0xb2, 0xb0, 0xb3, 0xb8, 0xb4, 0xad, 0xb0, 0xb8, 0xb1, 0xb5, 0xbe, 0xb7, + 0x9d, 0xa2, 0xba, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb7, 0xb7, 0xb6, 0xb7, 0xb6, 0xa7, 0xa5, 0xbd, 0xb7, 0xb6, 0xb6, 0xb5, + 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb1, 0xb4, 0xaf, 0xa7, 0xaa, 0xb1, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xab, 0xad, 0xaf, 0xb1, 0xb1, 0xb1, 0xaf, 0xae, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb2, 0xb3, 0xb3, 0x91, 0x9b, 0xa9, 0xb2, + 0xb4, 0xb3, 0xb2, 0xb1, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb5, 0xb5, 0xb6, 0xb6, + 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xc0, 0xaf, 0x97, 0x6b, + 0x51, 0x56, 0x5a, 0x67, 0x73, 0x6b, 0x69, 0x71, 0x77, 0x76, 0x74, 0x75, + 0x88, 0x7a, 0x6c, 0x6c, 0x77, 0x7f, 0x7d, 0x77, 0x78, 0x7f, 0x8b, 0x93, + 0x8f, 0x82, 0x75, 0x6f, 0x79, 0x76, 0x6d, 0x5c, 0x46, 0x35, 0x2c, 0x2a, + 0x4c, 0x41, 0x35, 0x33, 0x3b, 0x44, 0x49, 0x48, 0x3a, 0x44, 0x44, 0x38, + 0x3a, 0x54, 0x67, 0x64, 0x75, 0xa7, 0x7f, 0x4a, 0x62, 0xaf, 0x96, 0x5c, + 0x91, 0xa5, 0xbd, 0x9d, 0x94, 0xaf, 0xac, 0xb0, 0xa3, 0xa7, 0xad, 0xb4, + 0xb8, 0xb7, 0xb3, 0xb0, 0xb5, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, + 0xb8, 0xb7, 0xb6, 0xb5, 0xb6, 0xb8, 0xba, 0xbb, 0xbb, 0xbc, 0xbe, 0xc0, + 0xc3, 0xc6, 0xc9, 0xca, 0xc2, 0xc3, 0xc5, 0xc5, 0xc3, 0xbe, 0xb9, 0xb6, + 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xbf, 0xc6, 0xc6, 0xc8, 0xc9, + 0xcb, 0xcd, 0xce, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc8, 0xc7, 0xc7, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0x9d, 0xa4, 0xb0, 0xae, 0xb2, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xb4, 0xad, 0xa6, 0xa6, + 0xab, 0xb0, 0xaf, 0xad, 0x97, 0x9d, 0xac, 0xb7, 0xb9, 0xbc, 0xbd, 0xb6, + 0xb9, 0xb3, 0xa8, 0xb4, 0xbc, 0xb8, 0xbc, 0xb8, 0xb0, 0xae, 0xae, 0xaf, + 0xad, 0xa9, 0xaa, 0xad, 0xb8, 0xa8, 0xb0, 0x9e, 0x8f, 0xae, 0xbd, 0xac, + 0xb0, 0xab, 0xa6, 0xa7, 0xaf, 0xb2, 0xb2, 0xb5, 0xb3, 0xb7, 0xba, 0xb9, + 0xb7, 0xb7, 0xb9, 0xbc, 0xbc, 0xb3, 0xaf, 0xb0, 0xa9, 0x9d, 0x9d, 0xa7, + 0xb2, 0xb7, 0xbf, 0xaf, 0x9d, 0xab, 0xbb, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb5, 0xb9, 0xb5, 0xa6, 0xac, 0xbf, + 0xb7, 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, 0xb2, 0xab, 0xa8, 0xb0, 0xb5, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xaa, 0xac, 0xaf, 0xb1, + 0xb2, 0xb1, 0xb0, 0xaf, 0xb1, 0xae, 0xad, 0xb1, 0xb6, 0xb5, 0xac, 0xa4, + 0xa2, 0xb3, 0xbc, 0xb7, 0xb4, 0xb8, 0xb4, 0xaa, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, + 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xca, 0xb6, 0x9c, 0x72, 0x60, 0x6c, 0x76, 0x86, 0x7d, 0x6e, 0x65, 0x6e, + 0x7b, 0x7e, 0x7c, 0x7a, 0x84, 0x73, 0x62, 0x60, 0x6b, 0x76, 0x79, 0x75, + 0x78, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x78, 0x74, 0x7a, 0x7d, 0x7b, 0x72, + 0x67, 0x64, 0x6c, 0x75, 0x60, 0x68, 0x6e, 0x67, 0x57, 0x45, 0x3b, 0x38, + 0x2e, 0x41, 0x52, 0x4d, 0x4a, 0x5f, 0x65, 0x50, 0x71, 0x8b, 0x74, 0x4a, + 0x86, 0xa8, 0x8f, 0x59, 0x78, 0xb6, 0x9a, 0x84, 0xa3, 0xab, 0xb1, 0xb7, + 0xa2, 0xa8, 0xaf, 0xb5, 0xb7, 0xb6, 0xb4, 0xb2, 0xb5, 0xb6, 0xb6, 0xb7, + 0xb8, 0xb8, 0xb9, 0xb9, 0xb8, 0xb7, 0xb6, 0xb6, 0xb7, 0xb9, 0xbb, 0xbd, + 0xbe, 0xc0, 0xc2, 0xc5, 0xc8, 0xcb, 0xcc, 0xcd, 0xc6, 0xc8, 0xca, 0xca, + 0xc7, 0xc3, 0xbe, 0xba, 0xc0, 0xbf, 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xbb, + 0xc2, 0xc3, 0xc5, 0xc8, 0xcb, 0xce, 0xd0, 0xd1, 0xce, 0xcd, 0xcc, 0xcb, + 0xc9, 0xc7, 0xc6, 0xc5, 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0x9d, 0xa8, + 0xb2, 0xaf, 0xb4, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xae, 0xab, 0xab, 0xab, 0xad, 0xad, 0xac, 0x9b, 0xa3, 0xa9, 0xa9, + 0xa7, 0xaa, 0xab, 0xa8, 0xad, 0xa7, 0x9d, 0xa9, 0xb0, 0xa9, 0xab, 0xa4, + 0xa0, 0xa9, 0xae, 0xac, 0xb0, 0xb5, 0xad, 0x9e, 0xb5, 0xad, 0xa5, 0x88, + 0x94, 0xb5, 0xad, 0xac, 0xaf, 0xaa, 0xa3, 0xa7, 0xb4, 0xb4, 0xb0, 0xb5, + 0xb1, 0xb1, 0xb1, 0xb3, 0xb7, 0xba, 0xbd, 0xbe, 0xc0, 0xb8, 0xb7, 0xbc, + 0xbb, 0xb4, 0xb5, 0xbd, 0xb6, 0xba, 0xbb, 0xa5, 0xa3, 0xb5, 0xb7, 0xba, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xbb, 0xba, 0xb4, 0xbc, + 0xb5, 0xa5, 0xb3, 0xc0, 0xb8, 0xb8, 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xae, + 0xa6, 0xae, 0xb6, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xa9, 0xab, 0xae, 0xb0, 0xb2, 0xb2, 0xb1, 0xb0, 0xb8, 0xb3, 0xb0, 0xb3, + 0xb7, 0xb3, 0xa5, 0x98, 0x91, 0xa4, 0xae, 0xa8, 0xaa, 0xb7, 0xb9, 0xaf, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb4, 0xb5, + 0xb5, 0xb6, 0xb7, 0xb7, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xab, 0x96, 0x73, 0x66, 0x6f, 0x6f, 0x76, + 0x7c, 0x77, 0x77, 0x7d, 0x81, 0x80, 0x83, 0x8a, 0x82, 0x7a, 0x74, 0x78, + 0x83, 0x8d, 0x8f, 0x8d, 0x7b, 0x7d, 0x7b, 0x76, 0x79, 0x7d, 0x79, 0x6f, + 0x78, 0x76, 0x75, 0x74, 0x72, 0x6d, 0x66, 0x61, 0x5a, 0x4e, 0x47, 0x51, + 0x61, 0x61, 0x4d, 0x38, 0x37, 0x37, 0x46, 0x58, 0x5f, 0x62, 0x64, 0x61, + 0x71, 0x87, 0x78, 0x52, 0x97, 0xa9, 0x9f, 0x84, 0x6e, 0xc3, 0xa7, 0xa0, + 0xb3, 0xa3, 0xb2, 0xb2, 0xa7, 0xad, 0xb3, 0xb6, 0xb6, 0xb5, 0xb5, 0xb6, + 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xb8, 0xb7, 0xb6, 0xb6, + 0xb8, 0xba, 0xbd, 0xbf, 0xc1, 0xc3, 0xc6, 0xca, 0xcc, 0xcd, 0xcc, 0xcc, + 0xca, 0xca, 0xca, 0xc9, 0xc6, 0xc3, 0xc0, 0xbe, 0xc4, 0xc3, 0xc2, 0xc0, + 0xbe, 0xbc, 0xbb, 0xba, 0xc3, 0xc4, 0xc6, 0xc9, 0xcc, 0xcf, 0xd2, 0xd3, + 0xce, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc3, 0xc6, 0xc7, 0xc3, 0xc9, + 0xd4, 0xb4, 0x18, 0x07, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xa6, 0x9d, 0xac, 0xb3, 0xaf, 0xb5, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xa9, 0xb0, 0xb6, 0xb5, 0xaf, 0xab, 0xaf, 0xb4, + 0x8d, 0x9f, 0xac, 0xaf, 0xb0, 0xb0, 0xab, 0xa6, 0xb1, 0xab, 0xa0, 0xad, + 0xb4, 0xae, 0xb1, 0xac, 0xb5, 0xb0, 0xaa, 0xaa, 0xb0, 0xb5, 0xb4, 0xb1, + 0xae, 0xb1, 0xa0, 0x91, 0xa1, 0xa9, 0xa4, 0xae, 0xaf, 0xaa, 0xa0, 0xa7, + 0xb8, 0xb5, 0xae, 0xb6, 0xaf, 0xb1, 0xb4, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, + 0xb3, 0xb2, 0xb6, 0xbd, 0xbf, 0xbb, 0xb8, 0xb8, 0xb9, 0xbd, 0xb4, 0x9c, + 0xab, 0xbd, 0xb1, 0xbc, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbd, 0xbb, 0xb3, 0xbe, 0xb5, 0xa5, 0xb8, 0xc2, 0xb9, 0xb8, 0xb8, 0xb7, + 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb4, 0xb8, 0xb1, 0xa5, 0xad, 0xb8, 0xb2, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xa9, 0xab, 0xae, 0xb0, 0xb2, 0xb2, 0xb2, 0xb1, + 0xaf, 0xae, 0xae, 0xb2, 0xb6, 0xb7, 0xb2, 0xad, 0xba, 0xc2, 0xc2, 0xb8, + 0xb2, 0xb5, 0xb5, 0xb0, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb7, 0xb7, 0xb8, 0xb8, + 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xba, 0xa9, 0x99, 0x7e, + 0x76, 0x7c, 0x6f, 0x6b, 0x76, 0x6e, 0x6d, 0x74, 0x76, 0x6d, 0x62, 0x5d, + 0x70, 0x6e, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6d, 0x84, 0x87, 0x82, 0x7a, + 0x7b, 0x7e, 0x74, 0x63, 0x64, 0x61, 0x5d, 0x58, 0x55, 0x55, 0x56, 0x57, + 0x62, 0x61, 0x5c, 0x51, 0x47, 0x44, 0x48, 0x4d, 0x3a, 0x4a, 0x4a, 0x45, + 0x59, 0x74, 0x74, 0x65, 0x75, 0x97, 0x76, 0x50, 0x86, 0xaa, 0x94, 0x7c, + 0x80, 0x6f, 0xd4, 0xe6, 0xab, 0xad, 0xa8, 0xa8, 0xaf, 0xb3, 0xb7, 0xb6, + 0xb3, 0xb3, 0xb6, 0xba, 0xb7, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, + 0xb8, 0xb7, 0xb6, 0xb7, 0xb8, 0xbb, 0xbe, 0xc0, 0xc4, 0xc6, 0xca, 0xcc, + 0xcd, 0xcc, 0xcb, 0xc9, 0xcb, 0xc9, 0xc6, 0xc3, 0xc0, 0xbf, 0xbf, 0xbf, + 0xc6, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0, 0xca, 0xcb, 0xcc, 0xce, + 0xd0, 0xd1, 0xd2, 0xd3, 0xcf, 0xce, 0xcc, 0xca, 0xc7, 0xc5, 0xc3, 0xc2, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xa5, 0x9d, 0xae, 0xb4, 0xaf, 0xb6, 0xb1, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xae, 0xb0, 0xb5, + 0xba, 0xba, 0xb5, 0xb0, 0x9a, 0xab, 0xb2, 0xad, 0xae, 0xb1, 0xb0, 0xae, + 0xb3, 0xac, 0x9e, 0xaa, 0xb3, 0xb1, 0xb9, 0xb7, 0xb4, 0xb8, 0xb7, 0xb2, + 0xb0, 0xb1, 0xae, 0xa8, 0xac, 0xb0, 0xa3, 0xab, 0xa9, 0x9a, 0xa9, 0xb0, + 0xae, 0xa9, 0x9f, 0xa7, 0xba, 0xb6, 0xad, 0xb6, 0xb9, 0xbb, 0xbc, 0xb8, + 0xb4, 0xb3, 0xb7, 0xbc, 0xb4, 0xb4, 0xb4, 0xb5, 0xb8, 0xb9, 0xb7, 0xb5, + 0xbc, 0xbe, 0xaf, 0x97, 0xb1, 0xc2, 0xad, 0xbe, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xbe, 0xbc, 0xb2, 0xbf, 0xb5, 0xa4, 0xbb, 0xc3, + 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb6, 0xb4, 0xb9, 0xb2, 0xa4, 0xac, 0xb8, 0xb2, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xa8, 0xaa, 0xad, 0xb0, + 0xb2, 0xb2, 0xb2, 0xb1, 0xb5, 0xb6, 0xb5, 0xb3, 0xb2, 0xb2, 0xb4, 0xb6, + 0xb5, 0xb4, 0xb4, 0xb2, 0xaf, 0xaf, 0xb3, 0xb9, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc4, 0xae, 0x97, 0x77, 0x69, 0x65, 0x4d, 0x3f, 0x5d, 0x6c, 0x81, 0x8b, + 0x81, 0x72, 0x72, 0x7a, 0x71, 0x6b, 0x61, 0x58, 0x59, 0x66, 0x79, 0x87, + 0x91, 0x8b, 0x78, 0x63, 0x61, 0x6c, 0x6a, 0x5e, 0x4b, 0x5e, 0x6f, 0x6d, + 0x5a, 0x48, 0x42, 0x45, 0x34, 0x39, 0x40, 0x43, 0x45, 0x4a, 0x54, 0x5b, + 0x52, 0x51, 0x4b, 0x59, 0x70, 0x6a, 0x59, 0x59, 0x6f, 0x90, 0x66, 0x67, + 0x95, 0xbb, 0x82, 0x6a, 0x97, 0x65, 0x6a, 0xca, 0xd0, 0xa7, 0xbc, 0xa7, + 0xb4, 0xb7, 0xb9, 0xb6, 0xb2, 0xb1, 0xb7, 0xbc, 0xb7, 0xb7, 0xb8, 0xb9, + 0xb9, 0xba, 0xbb, 0xbb, 0xb7, 0xb7, 0xb6, 0xb7, 0xb9, 0xbc, 0xbf, 0xc1, + 0xc6, 0xc8, 0xcb, 0xcd, 0xce, 0xcc, 0xc9, 0xc7, 0xca, 0xc6, 0xc1, 0xbd, + 0xba, 0xbb, 0xbc, 0xbe, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xcf, 0xce, 0xcc, 0xc9, + 0xc7, 0xc4, 0xc2, 0xc1, 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xba, 0xa3, 0xa0, 0xae, + 0xb1, 0xb0, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xad, 0x97, 0x8a, 0x87, 0x87, 0x8a, 0x84, 0x75, 0x9d, 0xa8, 0xb3, 0xb5, + 0xb0, 0xad, 0xb2, 0xb9, 0xba, 0xb3, 0x94, 0x9e, 0xb2, 0xac, 0xb2, 0xb5, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb0, 0xb0, 0xaf, 0xae, + 0xac, 0xab, 0xac, 0xaf, 0xbc, 0x9e, 0x9d, 0xb2, 0xb5, 0xb2, 0xb4, 0xb3, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xbc, 0xbd, 0xbe, 0xbe, + 0xbc, 0xb9, 0xb5, 0xb2, 0xc5, 0xb4, 0xa0, 0xa7, 0xbe, 0xbf, 0xb7, 0xbe, + 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbf, 0xba, 0xbd, 0xb9, + 0xab, 0xac, 0xba, 0xc1, 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xbb, 0xb9, 0xb7, 0xbe, + 0xa6, 0x9a, 0xb8, 0xb8, 0xb6, 0xb5, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, + 0xb0, 0xa2, 0xa9, 0xb5, 0xb2, 0xb3, 0xb8, 0xb2, 0xb1, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9, + 0xb9, 0xba, 0xbb, 0xbb, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbc, 0xbb, 0xbd, 0xc1, + 0xc5, 0xc3, 0xba, 0xb2, 0xc2, 0xb4, 0xab, 0x7c, 0x5c, 0x63, 0x59, 0x53, + 0x66, 0x6b, 0x69, 0x64, 0x6c, 0x7b, 0x7f, 0x79, 0x78, 0x75, 0x78, 0x82, + 0x8c, 0x8a, 0x7a, 0x6b, 0x57, 0x5a, 0x5f, 0x66, 0x6a, 0x6c, 0x6a, 0x68, + 0x7a, 0x78, 0x77, 0x73, 0x65, 0x57, 0x58, 0x61, 0x63, 0x5c, 0x51, 0x4a, + 0x4a, 0x4f, 0x57, 0x5c, 0x55, 0x46, 0x3d, 0x42, 0x70, 0x5f, 0x54, 0x5a, + 0x69, 0x7e, 0x65, 0x6e, 0x9f, 0xa5, 0x8f, 0x7b, 0x73, 0x88, 0x94, 0x69, + 0xac, 0xab, 0xa8, 0xb3, 0xb2, 0xb2, 0xb6, 0xb9, 0xb7, 0xb4, 0xb2, 0xb0, + 0xbf, 0xaa, 0xbd, 0xc1, 0xcb, 0xc3, 0xbe, 0xb6, 0xac, 0xbf, 0xb5, 0xc1, + 0xb8, 0xbf, 0xc4, 0xbf, 0xc5, 0xbf, 0xcc, 0xca, 0xce, 0xd4, 0xc6, 0xc9, + 0xc8, 0xcd, 0xcc, 0xc0, 0xb2, 0xb0, 0xbe, 0xcd, 0xcd, 0xcb, 0xc8, 0xc6, + 0xc4, 0xc4, 0xc5, 0xc6, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xc6, 0xcd, 0xd2, 0xce, 0xc5, 0xc1, 0xc5, 0xcc, 0xbe, 0xc4, 0xcb, 0xce, + 0xd1, 0xb7, 0x1f, 0x03, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xba, 0xa3, 0xa1, 0xaf, 0xb2, 0xb0, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb0, 0xc1, 0xc1, 0xa4, 0xa1, 0xac, 0xa4, + 0xab, 0xa7, 0xa4, 0xa8, 0xaf, 0xb4, 0xb2, 0xaf, 0xbd, 0xbd, 0xa8, 0xa3, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xbc, 0xaf, 0xa7, 0xab, 0xb0, 0xae, 0xaa, 0xa9, 0xb4, 0xa0, 0xa4, 0xb4, + 0xb5, 0xb4, 0xb7, 0xb4, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb8, 0xb6, 0xb5, 0xb7, 0xba, 0xbe, 0xc0, 0xbb, 0xa2, 0xa5, 0xba, + 0xbb, 0xb4, 0xb9, 0xbd, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, + 0xbe, 0xbb, 0xbd, 0xb9, 0xab, 0xad, 0xbb, 0xc1, 0xbb, 0xbb, 0xba, 0xba, + 0xb9, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb1, 0xc0, 0xb7, 0xb8, 0xaf, 0x9d, 0xaa, 0xb5, 0xb4, 0xb6, 0xb8, 0xb9, + 0xb7, 0xb2, 0xac, 0xa8, 0xb0, 0xa3, 0xa9, 0xb4, 0xb2, 0xb3, 0xb7, 0xb3, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, + 0xbe, 0xbd, 0xbd, 0xc0, 0xc3, 0xc1, 0xbb, 0xb5, 0xb7, 0xb6, 0xb4, 0x80, + 0x53, 0x5c, 0x6b, 0x7c, 0x77, 0x6f, 0x6e, 0x76, 0x7c, 0x78, 0x74, 0x74, + 0x85, 0x74, 0x5f, 0x52, 0x50, 0x53, 0x55, 0x54, 0x57, 0x5a, 0x60, 0x67, + 0x6d, 0x72, 0x75, 0x76, 0x77, 0x6b, 0x63, 0x63, 0x62, 0x5a, 0x55, 0x56, + 0x44, 0x49, 0x50, 0x58, 0x5b, 0x57, 0x4d, 0x45, 0x56, 0x4e, 0x5c, 0x54, + 0x61, 0x67, 0x77, 0x65, 0x83, 0x82, 0x6b, 0x64, 0x93, 0xa1, 0x80, 0x84, + 0x78, 0x9f, 0xd0, 0x81, 0x7c, 0xae, 0x9f, 0xab, 0xae, 0xb1, 0xba, 0xb9, + 0xb1, 0xb6, 0xbd, 0xb9, 0xb4, 0xc0, 0xd6, 0xd2, 0xdf, 0xda, 0xd9, 0xce, + 0xd0, 0xc0, 0xc4, 0xbe, 0xb3, 0xc3, 0xb0, 0xc4, 0xc2, 0xcd, 0xc6, 0xcb, + 0xc7, 0xbf, 0xcb, 0xc8, 0xce, 0xcb, 0xc6, 0xc0, 0xbd, 0xbf, 0xc3, 0xc6, + 0xcb, 0xc9, 0xc7, 0xc6, 0xc5, 0xc6, 0xc7, 0xc8, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd4, 0xcc, 0xc4, 0xc2, 0xc5, 0xc8, 0xc6, 0xc2, + 0xc0, 0xc2, 0xbb, 0xc0, 0xd8, 0xc1, 0x1f, 0x03, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb8, 0xa4, 0xa3, 0xb2, 0xb4, 0xb1, 0xb4, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb3, 0xb4, 0xc0, 0x97, + 0x4a, 0x4d, 0x97, 0xc3, 0xb8, 0xad, 0xa3, 0xa5, 0xaf, 0xb6, 0xb4, 0xae, + 0xb5, 0xb2, 0xad, 0xa4, 0xab, 0xb2, 0xad, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xbc, 0xaf, 0xa6, 0xaa, 0xb1, 0xb1, 0xae, 0xae, + 0xa7, 0xa5, 0xae, 0xb6, 0xb5, 0xb8, 0xba, 0xb5, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xb8, 0xb6, 0xb5, 0xb4, 0xb6, 0xb9, 0xbc, 0xbf, + 0xa7, 0xa2, 0xb2, 0xc1, 0xb8, 0xb2, 0xb8, 0xba, 0xba, 0xba, 0xbb, 0xbc, + 0xbc, 0xbd, 0xbe, 0xbe, 0xbe, 0xbb, 0xbd, 0xb8, 0xac, 0xb0, 0xbd, 0xc0, + 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xba, 0xbb, 0xb3, 0xb8, 0xb3, 0xa7, 0xb2, 0xbb, + 0xb4, 0xb7, 0xba, 0xbc, 0xba, 0xb6, 0xb0, 0xac, 0xb0, 0xa5, 0xa8, 0xb2, + 0xb2, 0xb3, 0xb6, 0xb5, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xc1, 0xbf, 0xbd, 0xbd, 0xbf, 0xbf, 0xbd, 0xba, + 0xc5, 0xc0, 0xb9, 0x8b, 0x61, 0x62, 0x6d, 0x77, 0x7f, 0x6d, 0x62, 0x68, + 0x71, 0x72, 0x73, 0x77, 0x78, 0x7e, 0x85, 0x88, 0x83, 0x74, 0x62, 0x55, + 0x6e, 0x6d, 0x70, 0x77, 0x7c, 0x79, 0x6e, 0x63, 0x59, 0x50, 0x4d, 0x55, + 0x5c, 0x59, 0x56, 0x56, 0x60, 0x66, 0x6a, 0x64, 0x54, 0x45, 0x3d, 0x3b, + 0x49, 0x46, 0x5e, 0x5a, 0x64, 0x6b, 0x7c, 0x62, 0x7a, 0x71, 0x66, 0x63, + 0x95, 0x9c, 0x6a, 0x7b, 0x96, 0x95, 0x9b, 0x81, 0x76, 0xb0, 0xe2, 0xb7, + 0xb4, 0xbc, 0xba, 0xb4, 0xb6, 0xba, 0xb6, 0xb2, 0xb3, 0xd2, 0xc4, 0x84, + 0x6e, 0x72, 0xb2, 0xe5, 0xe7, 0xda, 0xc3, 0xcf, 0xca, 0xcb, 0xbe, 0xba, + 0xc0, 0xc7, 0xbf, 0xc9, 0xcc, 0xc7, 0xd0, 0xc9, 0xc3, 0xc2, 0xc4, 0xc8, + 0xcd, 0xcd, 0xc9, 0xc5, 0xc9, 0xc8, 0xc6, 0xc6, 0xc6, 0xc8, 0xca, 0xcb, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xce, 0xce, 0xcb, 0xc3, + 0xbb, 0xba, 0xc1, 0xc8, 0xba, 0xa7, 0xa8, 0xc2, 0xd4, 0xb2, 0x14, 0x00, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xa4, 0xa6, 0xb5, + 0xb6, 0xb2, 0xb5, 0xb8, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb9, 0xac, 0xb4, 0xb6, 0xa9, 0xb2, 0xc5, 0xc0, 0xb8, 0xb7, 0xb6, 0xb4, + 0xb2, 0xb3, 0xb5, 0xb8, 0xba, 0xad, 0xb2, 0xab, 0xaf, 0xb7, 0xae, 0xbb, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb1, 0xb3, 0xb2, 0xae, + 0xae, 0xb4, 0xb8, 0xb9, 0x9e, 0xab, 0xb7, 0xb8, 0xb6, 0xbb, 0xbd, 0xb7, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, + 0xb9, 0xb5, 0xb1, 0xae, 0x9d, 0xba, 0xc0, 0xb5, 0xb8, 0xbc, 0xb7, 0xb6, + 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbe, 0xbc, 0xbd, 0xb6, + 0xac, 0xb4, 0xc0, 0xbf, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb5, 0xb5, 0xb1, 0xbe, + 0xc2, 0xae, 0xaa, 0xbb, 0xc1, 0xbf, 0xbd, 0xb9, 0xb7, 0xb5, 0xb3, 0xb3, + 0xb1, 0xa8, 0xa7, 0xaf, 0xb3, 0xb3, 0xb5, 0xb7, 0xb4, 0xb5, 0xb5, 0xb6, + 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, + 0xbb, 0xbc, 0xbc, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xc3, 0xc1, 0xbe, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xb8, 0xbd, 0xb7, 0x89, 0x52, 0x46, 0x58, 0x68, + 0x6d, 0x6b, 0x6c, 0x73, 0x7f, 0x86, 0x7f, 0x73, 0x77, 0x7b, 0x7e, 0x7e, + 0x7a, 0x76, 0x74, 0x73, 0x6e, 0x63, 0x5a, 0x5e, 0x69, 0x6a, 0x5e, 0x50, + 0x48, 0x4b, 0x55, 0x61, 0x61, 0x58, 0x55, 0x59, 0x56, 0x53, 0x4e, 0x49, + 0x46, 0x47, 0x4c, 0x50, 0x41, 0x3e, 0x4c, 0x57, 0x7c, 0x71, 0x6a, 0x5f, + 0x79, 0x7b, 0x64, 0x73, 0xab, 0xa3, 0x7c, 0x8d, 0x91, 0x9a, 0x90, 0xa3, + 0x90, 0x6f, 0xc8, 0xd2, 0xa8, 0xba, 0xb7, 0xb2, 0xbe, 0xba, 0xb6, 0xc7, + 0xcb, 0xc5, 0x95, 0x71, 0x7e, 0x58, 0x38, 0x29, 0x62, 0x96, 0xb9, 0xef, + 0xeb, 0xd9, 0xd1, 0xc5, 0xcc, 0xc3, 0xcc, 0xc5, 0xc6, 0xce, 0xc6, 0xcd, + 0xcc, 0xcb, 0xca, 0xc6, 0xc3, 0xc3, 0xc7, 0xca, 0xc7, 0xc7, 0xc6, 0xc6, + 0xc7, 0xca, 0xcc, 0xce, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xc5, 0xce, 0xd3, 0xc9, 0xb8, 0xb2, 0xbc, 0xc9, 0xc6, 0xba, 0xad, 0xbc, + 0xd8, 0xba, 0x18, 0x06, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb4, 0xa4, 0xa9, 0xb9, 0xb8, 0xb3, 0xb7, 0xba, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xba, 0xbb, 0xbb, 0xbd, 0xc0, 0xbe, 0xb8, 0xb6, + 0xb3, 0xba, 0xc1, 0xbf, 0xb7, 0xb2, 0xb5, 0xb9, 0xba, 0xb1, 0xb6, 0xa7, + 0xa7, 0xb8, 0xb2, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb1, 0xbc, 0xbd, 0xb1, 0xaf, 0xba, 0xbb, 0xb1, 0x9e, 0xb2, 0xbd, 0xb9, + 0xb8, 0xbd, 0xbd, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xc0, 0xc0, 0xc0, 0xbd, 0xb9, 0xb4, 0xae, 0xab, 0xae, 0xc6, 0xc4, 0xb3, + 0xb7, 0xc0, 0xbb, 0xb5, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbf, + 0xbe, 0xbd, 0xbd, 0xb4, 0xad, 0xb8, 0xc4, 0xbe, 0xbd, 0xbd, 0xbc, 0xbc, + 0xbb, 0xba, 0xba, 0xb9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xc3, 0xbd, 0xbc, 0xc0, 0xa6, 0xa0, 0xcf, 0xc3, 0xc1, 0xbd, 0xb8, + 0xb3, 0xb0, 0xad, 0xac, 0xb1, 0xaa, 0xa6, 0xac, 0xb3, 0xb3, 0xb3, 0xba, + 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc3, 0xc2, 0xc0, 0xbe, 0xbd, 0xbd, 0xbe, 0xc0, 0xbb, 0xb9, 0xa8, 0x81, + 0x55, 0x4e, 0x69, 0x78, 0x79, 0x73, 0x6f, 0x72, 0x78, 0x78, 0x71, 0x69, + 0x76, 0x76, 0x75, 0x71, 0x6c, 0x68, 0x68, 0x69, 0x6e, 0x6f, 0x6b, 0x5e, + 0x4d, 0x43, 0x43, 0x48, 0x42, 0x47, 0x57, 0x68, 0x6a, 0x5c, 0x50, 0x4c, + 0x61, 0x54, 0x49, 0x48, 0x50, 0x51, 0x48, 0x3d, 0x44, 0x40, 0x50, 0x56, + 0x74, 0x71, 0x74, 0x66, 0x81, 0x91, 0x53, 0x69, 0xa6, 0x91, 0x89, 0x95, + 0x9e, 0x9b, 0x8a, 0xa0, 0xa8, 0x8a, 0x73, 0xc1, 0xbd, 0xc2, 0xc5, 0xbf, + 0xb2, 0xa8, 0xb3, 0xc9, 0xa5, 0x82, 0x57, 0x5d, 0x98, 0x78, 0x46, 0x39, + 0x1c, 0x29, 0x35, 0x35, 0x52, 0xa7, 0xbc, 0xca, 0xf6, 0xe3, 0xde, 0xce, + 0xcc, 0xd3, 0xc8, 0xcd, 0xca, 0xcb, 0xca, 0xc7, 0xc4, 0xc4, 0xc7, 0xcb, + 0xc8, 0xc7, 0xc7, 0xc7, 0xc8, 0xca, 0xcd, 0xcf, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xcd, 0xc9, 0xc6, 0xc7, 0xca, 0xc7, 0xbf, 0xb8, + 0xc0, 0xd7, 0xc1, 0xb9, 0xe1, 0xc8, 0x15, 0x00, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb2, 0xa5, 0xac, 0xbc, 0xba, 0xb4, 0xb8, 0xbd, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xba, 0xc1, 0xb9, 0xb5, + 0xbe, 0xba, 0xb1, 0xb7, 0xb4, 0xb7, 0xbb, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, + 0xb1, 0xb8, 0xbc, 0xa6, 0x9f, 0xb9, 0xc4, 0xbd, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb9, 0xbe, 0xba, 0xb2, 0xb6, 0xbd, 0xb1, 0x9d, + 0xa6, 0xb9, 0xbd, 0xb8, 0xba, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xc1, 0xbf, 0xbb, 0xb8, 0xb6, 0xb7, 0xb8, 0xba, + 0xc7, 0xbe, 0xbf, 0xbe, 0xb5, 0xb9, 0xbf, 0xb7, 0xbc, 0xbc, 0xbd, 0xbe, + 0xbe, 0xbf, 0xc0, 0xc0, 0xbe, 0xbe, 0xbd, 0xb3, 0xad, 0xbc, 0xc7, 0xbd, + 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xc0, 0xbc, 0xc5, 0xaf, 0x86, 0x74, 0x7a, 0x90, + 0xaf, 0xb2, 0xb6, 0xb8, 0xb8, 0xb4, 0xaf, 0xac, 0xb1, 0xad, 0xa5, 0xa9, + 0xb3, 0xb3, 0xb2, 0xbc, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xc1, 0xc0, 0xc0, 0xbf, + 0xbf, 0xbe, 0xbe, 0xbe, 0xc0, 0xc2, 0xc4, 0xc2, 0xbf, 0xbd, 0xbe, 0xc0, + 0xb6, 0xad, 0x96, 0x81, 0x66, 0x5e, 0x71, 0x70, 0x72, 0x6c, 0x78, 0x93, + 0x96, 0x81, 0x73, 0x77, 0x91, 0x87, 0x79, 0x6f, 0x6c, 0x70, 0x77, 0x7b, + 0x8b, 0x6e, 0x4e, 0x42, 0x4c, 0x5c, 0x63, 0x62, 0x64, 0x5d, 0x60, 0x6f, + 0x75, 0x63, 0x47, 0x33, 0x3a, 0x3d, 0x40, 0x3e, 0x3b, 0x39, 0x3c, 0x3f, + 0x3c, 0x3b, 0x5e, 0x50, 0x46, 0x60, 0x85, 0x5f, 0x77, 0x99, 0x4a, 0x60, + 0x9d, 0x7e, 0x7b, 0x79, 0xa8, 0x9f, 0x91, 0xa7, 0x92, 0xb9, 0x67, 0x87, + 0xc5, 0xae, 0xb5, 0xbd, 0xaf, 0xb8, 0xc5, 0xb6, 0x8a, 0x61, 0x47, 0x4c, + 0x8c, 0x85, 0x69, 0x7a, 0x5d, 0x3d, 0x2d, 0x3d, 0x2f, 0x25, 0x26, 0x4d, + 0x74, 0xa1, 0xc8, 0xea, 0xe9, 0xd3, 0xd1, 0xc7, 0xd6, 0xd0, 0xc9, 0xc6, + 0xc8, 0xca, 0xca, 0xc8, 0xcb, 0xca, 0xc8, 0xc8, 0xc8, 0xca, 0xcc, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xd1, 0xc8, 0xc3, 0xca, + 0xd5, 0xd5, 0xc6, 0xb5, 0xcc, 0xcc, 0xd4, 0xcf, 0xbc, 0x9f, 0x1a, 0x0e, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb0, 0xa5, 0xaf, 0xbf, + 0xbc, 0xb5, 0xb9, 0xbf, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xb5, 0xbd, 0xbf, 0xbd, 0xbd, 0xb7, 0xb4, 0xb8, 0xba, 0xb8, 0xb7, 0xb9, + 0xbd, 0xbe, 0xbb, 0xb8, 0xb9, 0xc0, 0xc0, 0xb1, 0x98, 0x9c, 0xbb, 0xc3, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb0, 0xae, 0xaf, 0xb7, + 0xbc, 0xb5, 0xa6, 0x9a, 0xb2, 0xbe, 0xbb, 0xb6, 0xbc, 0xbc, 0xb9, 0xbf, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbc, 0xba, 0xb9, + 0xba, 0xbc, 0xc0, 0xc2, 0xc5, 0xba, 0xbd, 0xc0, 0xb6, 0xb6, 0xbd, 0xbb, + 0xbd, 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xbe, 0xbe, 0xbd, 0xb2, + 0xae, 0xbf, 0xc9, 0xbd, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xc2, 0xd0, 0xb4, + 0xa1, 0xb6, 0xb7, 0xad, 0xb0, 0xb3, 0xb7, 0xba, 0xbb, 0xb8, 0xb3, 0xb0, + 0xb1, 0xae, 0xa5, 0xa7, 0xb4, 0xb2, 0xb1, 0xbe, 0xb8, 0xb9, 0xb9, 0xba, + 0xbb, 0xbb, 0xbc, 0xbc, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, + 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc2, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xc1, 0xc7, 0xc7, + 0xc2, 0xbe, 0xbd, 0xbe, 0xb2, 0xba, 0xb2, 0xa2, 0x7a, 0x63, 0x79, 0x7e, + 0x8f, 0x7c, 0x75, 0x7b, 0x72, 0x60, 0x64, 0x79, 0x7f, 0x76, 0x6c, 0x6a, + 0x6d, 0x70, 0x6d, 0x69, 0x5e, 0x70, 0x7c, 0x70, 0x54, 0x43, 0x48, 0x55, + 0x42, 0x3a, 0x3e, 0x54, 0x64, 0x5f, 0x4c, 0x3d, 0x39, 0x43, 0x4a, 0x45, + 0x3a, 0x38, 0x43, 0x51, 0x32, 0x36, 0x60, 0x52, 0x42, 0x5b, 0x7d, 0x50, + 0x76, 0xa1, 0x5e, 0x67, 0xa7, 0x91, 0x7d, 0x79, 0x8e, 0x88, 0x91, 0xab, + 0x9d, 0xd5, 0xaf, 0x70, 0xae, 0xaa, 0xb0, 0xb3, 0xb6, 0xbe, 0xa9, 0x7a, + 0x75, 0x71, 0x84, 0x6b, 0x84, 0x81, 0x61, 0x75, 0x99, 0xa5, 0x80, 0x7d, + 0x69, 0x5c, 0x4d, 0x29, 0x33, 0x2c, 0x1e, 0x43, 0x7c, 0xb0, 0xdf, 0xe7, + 0xde, 0xda, 0xd4, 0xcd, 0xc9, 0xca, 0xcd, 0xd0, 0xce, 0xcd, 0xcb, 0xc9, + 0xc8, 0xc9, 0xca, 0xcb, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcd, 0xcc, 0xcd, 0xd1, 0xd3, 0xd2, 0xcd, 0xc8, 0xc0, 0xbd, 0xec, 0xf4, + 0xb8, 0x92, 0x1e, 0x04, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xaf, 0xa5, 0xb0, 0xc0, 0xbc, 0xb5, 0xba, 0xc0, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb6, 0xb6, 0xbf, 0xc2, 0xba, 0xba, 0xbe, 0xbb, + 0xc0, 0xbe, 0xbc, 0xbb, 0xbc, 0xbf, 0xc3, 0xc5, 0xbf, 0xb5, 0xac, 0xaa, + 0x7a, 0x57, 0x7f, 0xa0, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0x9d, 0x9a, 0xa7, 0xbd, 0xbe, 0xaa, 0xa1, 0xa8, 0xba, 0xc1, 0xb9, 0xb5, + 0xbe, 0xbb, 0xb7, 0xc0, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xba, 0xbc, 0xbf, 0xc1, 0xc1, 0xc0, 0xbe, 0xbc, 0xb2, 0xc2, 0xbf, 0xb5, + 0xb8, 0xb9, 0xb7, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, + 0xbd, 0xbf, 0xbc, 0xb1, 0xae, 0xc1, 0xca, 0xbc, 0xbf, 0xbf, 0xbe, 0xbd, + 0xbd, 0xbc, 0xbb, 0xbb, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xb6, 0xd0, 0x9b, 0x58, 0x90, 0xc8, 0xb5, 0xc3, 0xcf, 0xcb, 0xc6, 0xbf, + 0xb7, 0xb2, 0xad, 0xab, 0xb1, 0xaf, 0xa4, 0xa6, 0xb4, 0xb2, 0xb1, 0xbf, + 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc3, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xb9, 0xc1, 0xc9, 0xca, 0xc4, 0xbe, 0xbc, 0xbc, 0xbb, 0xbb, 0xaa, 0x9e, + 0x7e, 0x6b, 0x83, 0x85, 0x83, 0x76, 0x68, 0x5f, 0x59, 0x60, 0x78, 0x92, + 0x81, 0x77, 0x6d, 0x6d, 0x71, 0x6f, 0x64, 0x58, 0x84, 0x7f, 0x72, 0x5f, + 0x50, 0x4d, 0x57, 0x62, 0x67, 0x60, 0x60, 0x67, 0x66, 0x5a, 0x4c, 0x47, + 0x4b, 0x45, 0x40, 0x45, 0x4d, 0x4e, 0x44, 0x39, 0x36, 0x3c, 0x5e, 0x63, + 0x6f, 0x6c, 0x6d, 0x4c, 0x78, 0x9a, 0x5e, 0x53, 0x98, 0x9c, 0x82, 0x8d, + 0x9d, 0x95, 0xb1, 0x8c, 0xa7, 0xb9, 0xbf, 0x88, 0x6b, 0xa7, 0xb9, 0xaf, + 0xbd, 0xb5, 0x84, 0x5f, 0x60, 0x6c, 0x91, 0x64, 0x79, 0x93, 0x74, 0x7a, + 0x79, 0x81, 0x91, 0x96, 0x86, 0x8a, 0x74, 0x7c, 0x4d, 0x48, 0x4d, 0x3b, + 0x2f, 0x33, 0x32, 0x42, 0x9c, 0xba, 0xdf, 0xf2, 0xf0, 0xe4, 0xdd, 0xdc, + 0xd0, 0xcf, 0xcc, 0xc9, 0xc8, 0xc8, 0xc9, 0xca, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xcf, 0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, + 0xc9, 0xdb, 0xd2, 0xa6, 0x94, 0x9b, 0x24, 0x09, 0xc3, 0xb9, 0xc0, 0xb3, + 0xb2, 0xbc, 0xb5, 0xc1, 0xa9, 0xa0, 0xb8, 0xb6, 0xbf, 0xc0, 0xc0, 0xb9, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xb5, 0xbe, 0xa8, 0x6c, 0x5f, 0xa5, 0xcc, 0xa6, 0xbb, 0xbb, 0xba, 0xb9, + 0xb9, 0xb8, 0xb7, 0xb7, 0x92, 0x81, 0x91, 0xba, 0xc1, 0xa7, 0xa2, 0xb8, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc0, 0xbf, 0xbd, 0xbc, 0xbc, 0xbd, 0xbf, 0xc0, 0xbd, 0xbd, 0xbe, 0xbf, + 0xbf, 0xc0, 0xc1, 0xc1, 0xc5, 0xc2, 0xb9, 0xbb, 0xaf, 0xca, 0xc2, 0xc8, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbd, 0xc0, 0xc6, 0xcd, 0xcf, 0xc7, 0xb7, 0xaa, + 0x86, 0xb9, 0xcc, 0xbb, 0xb7, 0xba, 0xb7, 0xb6, 0xbb, 0xaf, 0xa6, 0xa7, + 0xa7, 0xb2, 0xb9, 0xb7, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc1, 0xc2, 0xc3, 0xc3, + 0xc1, 0xbf, 0xbc, 0xbb, 0xbb, 0xbe, 0xc6, 0xc6, 0xc2, 0xc5, 0xbf, 0xab, + 0xb5, 0xb6, 0xb6, 0xa4, 0x85, 0x75, 0x76, 0x73, 0x5a, 0x5f, 0x65, 0x6a, + 0x6c, 0x6c, 0x6d, 0x6e, 0x64, 0x5d, 0x65, 0x74, 0x6c, 0x56, 0x5b, 0x75, + 0x7b, 0x68, 0x5d, 0x65, 0x6a, 0x64, 0x5d, 0x5c, 0x50, 0x69, 0x7f, 0x7c, + 0x64, 0x4e, 0x4b, 0x51, 0x47, 0x4b, 0x51, 0x59, 0x5d, 0x58, 0x4c, 0x43, + 0x3f, 0x44, 0x5d, 0x66, 0x7f, 0x76, 0x7d, 0x7b, 0x6f, 0x85, 0x5c, 0x65, + 0x94, 0x76, 0x67, 0x94, 0xa3, 0x9d, 0xa1, 0xa2, 0x9c, 0xb1, 0xa9, 0xbd, + 0x86, 0x89, 0xc3, 0xb0, 0x8e, 0x8c, 0x65, 0x5e, 0x88, 0x80, 0x85, 0x76, + 0x67, 0x89, 0x62, 0x5b, 0x8f, 0x7e, 0x78, 0x85, 0x72, 0x70, 0x95, 0x94, + 0x9b, 0x9a, 0x7c, 0x70, 0x5d, 0x2f, 0x52, 0x2f, 0x1b, 0x27, 0x35, 0x5e, + 0xa1, 0xba, 0xe6, 0xfa, 0xee, 0xe0, 0xd7, 0xcb, 0xc9, 0xcd, 0xc7, 0xc8, + 0xd3, 0xce, 0xcf, 0xd6, 0xd4, 0xcb, 0xc6, 0xc9, 0xd8, 0xd6, 0xd7, 0xd7, + 0xcc, 0xcb, 0xd7, 0xd8, 0xf4, 0xe6, 0x96, 0x63, 0x51, 0x52, 0x2f, 0x0a, + 0xbf, 0xb3, 0xbd, 0xbc, 0xbf, 0xc3, 0xb8, 0xc1, 0xad, 0xa4, 0xbd, 0xba, + 0xc2, 0xc1, 0xc0, 0xb9, 0xbf, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xd0, 0xc7, 0x8a, 0x64, 0x8c, 0xb6, 0xbe, 0xc9, + 0xbc, 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb8, 0xae, 0x9b, 0x95, 0xa1, + 0xa4, 0x9c, 0xa5, 0xba, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xc0, 0xbe, 0xbd, 0xbb, 0xbb, 0xbd, 0xbe, 0xc0, + 0xbe, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, 0xcb, 0xc5, 0xd5, 0xb5, + 0x9e, 0xcf, 0xbe, 0xcc, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0xc2, 0xc3, 0xc6, + 0xc9, 0xc5, 0xbd, 0xb5, 0x9f, 0xc0, 0xc9, 0xbd, 0xbd, 0xc0, 0xb8, 0xb3, + 0xb2, 0xb7, 0xa1, 0xb0, 0xa9, 0xb6, 0xb2, 0xb5, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xc0, + 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, + 0xc3, 0xc4, 0xc4, 0xc4, 0xc2, 0xbf, 0xbc, 0xba, 0xb6, 0xb8, 0xc0, 0xc3, + 0xc3, 0xca, 0xc8, 0xb7, 0xac, 0xb5, 0xb0, 0xb0, 0x8a, 0x64, 0x6c, 0x68, + 0x66, 0x6e, 0x75, 0x77, 0x74, 0x71, 0x71, 0x72, 0x6f, 0x6f, 0x65, 0x5b, + 0x67, 0x7f, 0x85, 0x7a, 0x71, 0x72, 0x79, 0x82, 0x81, 0x74, 0x64, 0x5c, + 0x58, 0x64, 0x6c, 0x63, 0x52, 0x49, 0x51, 0x5d, 0x55, 0x58, 0x5b, 0x59, + 0x54, 0x4f, 0x4c, 0x4b, 0x3c, 0x3d, 0x5b, 0x63, 0x74, 0x6d, 0x7a, 0x73, + 0x61, 0x7b, 0x58, 0x62, 0x93, 0x82, 0x7a, 0xa1, 0x9c, 0x90, 0x96, 0xa9, + 0xad, 0xbb, 0xa8, 0xb4, 0xab, 0x77, 0xa9, 0xcd, 0x72, 0x3c, 0x60, 0x6d, + 0x7e, 0x82, 0x78, 0x7c, 0x6b, 0x89, 0x85, 0x5c, 0x85, 0x6f, 0x71, 0x87, + 0x90, 0x83, 0x7a, 0x86, 0x79, 0x86, 0x8c, 0x98, 0xa6, 0x83, 0x81, 0x64, + 0x62, 0x3b, 0x3e, 0x2d, 0x26, 0x24, 0x3e, 0x5b, 0xaa, 0xce, 0xdb, 0xeb, + 0xe4, 0xd3, 0xdb, 0xcd, 0xd2, 0xd8, 0xdd, 0xdb, 0xd6, 0xd0, 0xcb, 0xc7, + 0xda, 0xd2, 0xcd, 0xd3, 0xdf, 0xd0, 0xd0, 0xfd, 0xe9, 0xab, 0x8e, 0x8f, + 0x90, 0x7d, 0x1f, 0x04, 0xc2, 0xc4, 0xc9, 0xbb, 0xbc, 0xcb, 0xc8, 0xc7, + 0xb1, 0xa7, 0xbc, 0xb6, 0xbc, 0xbe, 0xc2, 0xbf, 0xc2, 0xc1, 0xc1, 0xc0, + 0xbf, 0xbe, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbe, 0xc4, 0xc9, 0xd2, + 0xd3, 0xc2, 0xb6, 0xbb, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb9, + 0xc3, 0xc2, 0xa9, 0x87, 0x87, 0xa8, 0xc0, 0xc1, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbf, 0xbe, 0xbc, 0xbb, + 0xbb, 0xbc, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc2, 0xc3, + 0xb4, 0xbf, 0xb3, 0xc2, 0xaf, 0xb3, 0xc9, 0xbd, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc7, 0xc3, 0xc0, 0xc0, 0xc2, 0xc4, 0xc4, 0xc3, 0xc5, 0xce, 0xca, 0xc1, + 0xc2, 0xbf, 0xb3, 0xac, 0xb7, 0xc5, 0x98, 0xa9, 0xa0, 0xb2, 0xb1, 0xc0, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc5, + 0xc5, 0xc6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc5, 0xc2, 0xbf, 0xbb, 0xb9, + 0xc1, 0xbe, 0xc2, 0xc3, 0xc0, 0xc6, 0xc5, 0xb8, 0xab, 0xb6, 0xad, 0xb6, + 0x8d, 0x5a, 0x6a, 0x69, 0x63, 0x6f, 0x7c, 0x7f, 0x79, 0x74, 0x77, 0x7c, + 0x64, 0x62, 0x64, 0x6b, 0x72, 0x74, 0x6f, 0x6a, 0x66, 0x68, 0x64, 0x5a, + 0x55, 0x58, 0x5c, 0x5d, 0x56, 0x62, 0x70, 0x71, 0x69, 0x60, 0x5d, 0x5f, + 0x5e, 0x5f, 0x5c, 0x53, 0x48, 0x43, 0x47, 0x4d, 0x39, 0x39, 0x5c, 0x61, + 0x65, 0x63, 0x77, 0x6b, 0x72, 0x8b, 0x67, 0x65, 0x89, 0x7d, 0x76, 0x8e, + 0x9d, 0x99, 0x98, 0x9f, 0xa2, 0xb6, 0xa5, 0xa3, 0xc7, 0xb7, 0x81, 0xcf, + 0xc0, 0x51, 0x7a, 0x98, 0x8e, 0x84, 0x6f, 0x75, 0x5e, 0x77, 0x8d, 0x5e, + 0x88, 0x7c, 0x8c, 0x8d, 0x85, 0x77, 0x66, 0x80, 0x96, 0x8b, 0x7e, 0x79, + 0x8a, 0x7a, 0x85, 0x9f, 0x9e, 0x7f, 0x84, 0x67, 0x4f, 0x35, 0x2e, 0x30, + 0x28, 0x21, 0x4f, 0x73, 0xab, 0xe1, 0xdf, 0xf1, 0xeb, 0xeb, 0xe3, 0xda, + 0xda, 0xde, 0xd5, 0xc4, 0xb8, 0xc2, 0xe5, 0xe3, 0xc6, 0xd4, 0xe3, 0xcb, + 0x80, 0x7e, 0x8e, 0x5f, 0x41, 0x62, 0x25, 0x04, 0xd8, 0xcc, 0xc9, 0xcb, + 0xcd, 0xca, 0xc4, 0xc5, 0xb4, 0xad, 0xc6, 0xbf, 0xc2, 0xbe, 0xbf, 0xba, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc6, 0xaf, 0xbb, 0xc7, 0xb8, 0xbb, 0xc7, 0xbc, 0xbe, 0xbe, 0xbd, 0xbd, + 0xbc, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xc0, 0xca, 0xcb, 0xc4, 0xc0, 0xc1, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbc, 0xbb, 0xbb, 0xbc, 0xbe, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc4, 0xc4, 0xc3, 0xc1, 0xcd, 0xc2, 0xb4, 0xc8, 0xcd, 0xd0, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc6, 0xc3, 0xc0, 0xbf, 0xc2, 0xc5, 0xc8, 0xca, + 0xc8, 0xc5, 0xc0, 0xc0, 0xc5, 0xc5, 0xc1, 0xc0, 0xab, 0xc3, 0xa1, 0xad, + 0xb2, 0xb0, 0xac, 0xb7, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, + 0xc4, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xc9, 0xc7, + 0xc4, 0xc0, 0xbc, 0xb9, 0xbc, 0xb7, 0xbb, 0xc1, 0xc2, 0xc9, 0xcd, 0xc5, + 0xc0, 0xb3, 0xa4, 0xa7, 0x90, 0x71, 0x70, 0x65, 0x67, 0x74, 0x7f, 0x7c, + 0x6e, 0x64, 0x66, 0x6c, 0x60, 0x43, 0x44, 0x6d, 0x85, 0x6f, 0x50, 0x46, + 0x48, 0x5b, 0x6b, 0x73, 0x7e, 0x89, 0x86, 0x7b, 0x71, 0x75, 0x79, 0x77, + 0x6e, 0x63, 0x5a, 0x55, 0x5b, 0x58, 0x51, 0x49, 0x44, 0x41, 0x43, 0x44, + 0x3b, 0x3e, 0x63, 0x62, 0x5d, 0x5c, 0x77, 0x69, 0x77, 0x8b, 0x6b, 0x65, + 0x7f, 0x7c, 0x7c, 0x87, 0x8a, 0x93, 0x95, 0xa0, 0x9f, 0xb2, 0xab, 0xac, + 0xc7, 0xaa, 0x51, 0x96, 0xdd, 0x96, 0x71, 0x5f, 0x6f, 0x71, 0x84, 0x87, + 0x68, 0x6e, 0x7e, 0x72, 0x84, 0x77, 0x7f, 0x76, 0x6d, 0x81, 0x8d, 0x90, + 0x77, 0x7c, 0x77, 0x76, 0x82, 0x7d, 0x78, 0x75, 0x6d, 0x87, 0x8e, 0x94, + 0xa8, 0x8c, 0x74, 0x4d, 0x41, 0x44, 0x24, 0x34, 0x33, 0x2d, 0x68, 0x7e, + 0xbf, 0xdb, 0xf7, 0xfb, 0xf1, 0xe7, 0xe2, 0xdf, 0xc8, 0xce, 0xd2, 0xdf, + 0xd5, 0xe3, 0xe8, 0x96, 0x90, 0x72, 0x40, 0x43, 0x7b, 0x77, 0x14, 0x0f, + 0xcc, 0xd3, 0xd6, 0xd7, 0xd2, 0xd2, 0xde, 0xe6, 0xbb, 0xb3, 0xc9, 0xbf, + 0xbe, 0xbb, 0xbf, 0xbd, 0xbc, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xca, 0xc0, 0xb7, 0xbc, 0xc9, 0xcb, 0xc4, 0xc0, + 0xc0, 0xbf, 0xbf, 0xbe, 0xbd, 0xbd, 0xbc, 0xbc, 0xbe, 0xb3, 0xb3, 0xbd, + 0xbf, 0xb8, 0xbb, 0xc7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xc1, 0xc0, 0xbe, 0xbd, 0xbd, 0xbe, 0xc0, 0xc1, + 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xd0, 0xdc, 0xe5, 0xb5, + 0xa7, 0xc6, 0xd1, 0xda, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc1, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc9, 0xcb, 0xc8, 0xc1, 0xc0, 0xc2, 0xc1, 0xc1, 0xc5, 0xc9, + 0xa8, 0xba, 0xb0, 0xa7, 0xc0, 0xa9, 0xad, 0xb1, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, + 0xca, 0xca, 0xca, 0xc8, 0xc6, 0xc2, 0xbe, 0xbc, 0xbb, 0xb4, 0xb9, 0xc1, + 0xc2, 0xc8, 0xcc, 0xc7, 0xb1, 0xb7, 0xca, 0xac, 0x77, 0x5f, 0x59, 0x68, + 0x5b, 0x67, 0x72, 0x71, 0x66, 0x62, 0x68, 0x72, 0x63, 0x69, 0x74, 0x7e, + 0x80, 0x7a, 0x79, 0x7c, 0x77, 0x75, 0x6a, 0x60, 0x65, 0x72, 0x70, 0x63, + 0x67, 0x69, 0x6b, 0x6a, 0x64, 0x5c, 0x54, 0x4e, 0x57, 0x4e, 0x47, 0x49, + 0x4f, 0x50, 0x47, 0x3e, 0x3e, 0x4c, 0x6f, 0x64, 0x5c, 0x5b, 0x76, 0x6e, + 0x73, 0x7e, 0x63, 0x5f, 0x70, 0x72, 0x7a, 0x7d, 0x97, 0x99, 0x92, 0xa5, + 0xa7, 0xb4, 0xb3, 0xb7, 0xb4, 0xa0, 0x5e, 0x52, 0xd0, 0xe9, 0x7a, 0x71, + 0x86, 0x7b, 0x73, 0x6c, 0x71, 0x7b, 0x7b, 0x63, 0x5a, 0x73, 0x83, 0x89, + 0x7c, 0x78, 0x7d, 0x69, 0x63, 0x8b, 0x8f, 0x87, 0x7a, 0x87, 0x93, 0x70, + 0x6f, 0x86, 0x83, 0x78, 0x88, 0x85, 0x9b, 0x9a, 0xa1, 0x7d, 0x7b, 0x54, + 0x43, 0x44, 0x20, 0x2a, 0x2a, 0x2b, 0x46, 0x82, 0xc4, 0xef, 0xff, 0xff, + 0xf4, 0xd4, 0xe0, 0xdf, 0xf9, 0xe2, 0x8a, 0x9f, 0x94, 0x54, 0x69, 0x98, + 0x8a, 0x75, 0x2d, 0x04, 0xe1, 0xde, 0xdb, 0xe7, 0xdb, 0xba, 0xaf, 0xab, + 0xa2, 0xa6, 0xcc, 0xce, 0xd0, 0xc6, 0xc2, 0xbc, 0xbf, 0xc0, 0xc0, 0xc1, + 0xc1, 0xc2, 0xc2, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc8, 0xc3, 0xc2, + 0xc5, 0xb8, 0xb4, 0xc9, 0xc1, 0xc1, 0xc0, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xbd, 0xc6, 0xc6, 0xbd, 0xbd, 0xc6, 0xc6, 0xbc, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc4, 0xc2, 0xc0, 0xbf, + 0xbf, 0xc0, 0xc2, 0xc4, 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, + 0xc1, 0x7f, 0x40, 0x44, 0x8e, 0xaa, 0xb8, 0xc2, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc0, 0xc4, 0xc9, 0xcb, 0xc9, 0xc8, 0xc8, 0xc9, 0xd0, 0xca, 0xca, 0xc7, + 0xbb, 0xb9, 0xbf, 0xc1, 0xb4, 0xb2, 0xba, 0x9d, 0xb8, 0xa4, 0xb0, 0xb7, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc5, 0xc5, 0xc6, 0xc7, + 0xc7, 0xc8, 0xc9, 0xc9, 0xc8, 0xc9, 0xc9, 0xc9, 0xc8, 0xc5, 0xc2, 0xc0, + 0xbf, 0xb6, 0xbb, 0xc4, 0xc3, 0xc1, 0xc2, 0xbc, 0xb2, 0xaa, 0xc6, 0xaf, + 0x93, 0x8e, 0x71, 0x71, 0x6c, 0x71, 0x74, 0x6d, 0x62, 0x5f, 0x65, 0x6e, + 0x76, 0x71, 0x69, 0x67, 0x6f, 0x78, 0x76, 0x6e, 0x6f, 0x6a, 0x65, 0x67, + 0x72, 0x7a, 0x72, 0x65, 0x62, 0x64, 0x66, 0x63, 0x5d, 0x55, 0x4f, 0x4c, + 0x56, 0x4d, 0x48, 0x50, 0x5d, 0x5f, 0x51, 0x42, 0x3e, 0x5d, 0x79, 0x61, + 0x5f, 0x5a, 0x71, 0x74, 0x87, 0x83, 0x6d, 0x73, 0x7c, 0x7d, 0x8e, 0x90, + 0x82, 0x96, 0x90, 0xa0, 0xa7, 0xb6, 0xa0, 0x7b, 0x69, 0x65, 0x7f, 0x70, + 0x77, 0xcd, 0xcb, 0x62, 0x5e, 0x81, 0x8a, 0x84, 0x82, 0x78, 0x8d, 0x78, + 0x70, 0x94, 0x89, 0x82, 0x7c, 0x69, 0x78, 0x88, 0x8f, 0x92, 0x7e, 0x81, + 0x6c, 0x7b, 0x99, 0x8f, 0x83, 0x66, 0x7b, 0x7f, 0x8d, 0x8b, 0x86, 0x82, + 0x6d, 0x97, 0x97, 0xa5, 0xa0, 0x89, 0x80, 0x52, 0x4b, 0x44, 0x39, 0x2a, + 0x1d, 0x2a, 0x5a, 0x8b, 0xc4, 0xf5, 0xef, 0xff, 0xc2, 0x66, 0x86, 0x8a, + 0x52, 0x67, 0x72, 0x4e, 0x57, 0x6e, 0x17, 0x04, 0xe8, 0xdd, 0xd8, 0xe7, + 0xbf, 0x85, 0xa3, 0xdb, 0xd0, 0xcd, 0xea, 0xe1, 0xdd, 0xd5, 0xd6, 0xd4, + 0xcb, 0xcb, 0xc9, 0xc7, 0xc6, 0xc4, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc4, 0xb9, 0xba, 0xc0, 0xbc, 0xbd, 0xc6, 0xcb, 0xc2, 0xc2, 0xc1, 0xc1, + 0xc0, 0xbf, 0xbf, 0xbe, 0xc0, 0xbc, 0xbe, 0xc6, 0xc6, 0xbc, 0xb9, 0xbd, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc6, 0xc5, 0xc3, 0xc2, 0xc2, 0xc3, 0xc5, 0xc6, 0xc4, 0xc5, 0xc5, 0xc6, + 0xc7, 0xc7, 0xc8, 0xc8, 0xc5, 0xb5, 0xb1, 0x50, 0x85, 0xc4, 0x82, 0x7d, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, 0xc3, 0xc8, 0xcc, 0xcc, 0xc8, 0xc6, 0xc8, 0xca, + 0xca, 0xc6, 0xca, 0xc8, 0xbe, 0xc3, 0xcc, 0xc6, 0xb6, 0xaa, 0xc0, 0xa5, + 0xaf, 0xab, 0xab, 0xb6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, + 0xc6, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xc6, 0xc7, 0xc8, 0xca, + 0xc9, 0xc8, 0xc6, 0xc5, 0xb4, 0xac, 0xb5, 0xc5, 0xc6, 0xc3, 0xc3, 0xbe, + 0xb0, 0xa9, 0xbd, 0xab, 0x87, 0x71, 0x58, 0x5a, 0x6f, 0x70, 0x6d, 0x68, + 0x65, 0x6a, 0x75, 0x7e, 0x7b, 0x72, 0x6e, 0x6e, 0x64, 0x59, 0x5f, 0x6e, + 0x68, 0x68, 0x72, 0x82, 0x8c, 0x89, 0x7f, 0x79, 0x7f, 0x7b, 0x71, 0x61, + 0x52, 0x4a, 0x4d, 0x51, 0x55, 0x4f, 0x4d, 0x54, 0x5e, 0x5f, 0x54, 0x47, + 0x3a, 0x6a, 0x7c, 0x59, 0x60, 0x57, 0x67, 0x78, 0x65, 0x55, 0x47, 0x5c, + 0x66, 0x68, 0x83, 0x8b, 0x97, 0xa4, 0x8e, 0x99, 0xa0, 0xb2, 0xa9, 0x89, + 0x6b, 0x91, 0x86, 0x75, 0x62, 0x8a, 0xd5, 0xb9, 0x78, 0x73, 0x7f, 0x75, + 0x68, 0x56, 0x6f, 0x6a, 0x5c, 0x70, 0x65, 0x64, 0x7d, 0x83, 0x7b, 0x7f, + 0x8e, 0x75, 0x68, 0x8d, 0x91, 0x8f, 0x77, 0x76, 0x7e, 0x70, 0x93, 0x92, + 0x86, 0x73, 0x7c, 0x92, 0x92, 0x8a, 0x8f, 0x78, 0x79, 0x94, 0x97, 0xa5, + 0xa7, 0x87, 0x60, 0x4a, 0x45, 0x3f, 0x33, 0x28, 0x31, 0x22, 0x72, 0x83, + 0x7a, 0x87, 0x51, 0x34, 0x66, 0x64, 0x75, 0x80, 0x8a, 0x83, 0x24, 0x03, + 0xe0, 0xef, 0xe6, 0xee, 0xf8, 0xf9, 0xf7, 0xd9, 0x49, 0x66, 0xb3, 0xd8, + 0xee, 0xe9, 0xe1, 0xd5, 0xd6, 0xd5, 0xd2, 0xce, 0xc9, 0xc5, 0xc2, 0xc0, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xbf, 0xc4, 0xc5, 0xc0, 0xbe, 0xc2, 0xc1, 0xbc, + 0xc3, 0xc3, 0xc2, 0xc1, 0xc1, 0xc0, 0xbf, 0xbf, 0xbc, 0xbc, 0xbd, 0xbf, + 0xc0, 0xbf, 0xbf, 0xc0, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc8, 0xc7, 0xc5, 0xc4, 0xc4, 0xc5, 0xc7, 0xc8, + 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xb9, 0x86, 0x7e, 0x6d, + 0xa5, 0x90, 0x73, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xc7, 0xcb, 0xcd, 0xcb, + 0xc6, 0xc4, 0xc8, 0xcd, 0xce, 0xc9, 0xcd, 0xca, 0xc1, 0xca, 0xcf, 0xc2, + 0xc5, 0xac, 0xbb, 0x9f, 0x97, 0xae, 0xab, 0xc4, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc4, + 0xc4, 0xc5, 0xc6, 0xc6, 0xc6, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, 0xca, 0xca, + 0xc4, 0xc5, 0xc8, 0xca, 0xcb, 0xca, 0xc9, 0xc8, 0xb8, 0xaf, 0xb8, 0xc8, + 0xc6, 0xbe, 0xb9, 0xb3, 0xac, 0xa8, 0xb3, 0xb0, 0x8c, 0x6d, 0x6a, 0x74, + 0x7a, 0x75, 0x6d, 0x66, 0x65, 0x6c, 0x77, 0x7f, 0x85, 0x72, 0x62, 0x60, + 0x63, 0x64, 0x6a, 0x73, 0x74, 0x75, 0x81, 0x8e, 0x87, 0x70, 0x5f, 0x5d, + 0x5b, 0x65, 0x6f, 0x6e, 0x64, 0x5b, 0x58, 0x5a, 0x51, 0x4f, 0x4e, 0x51, + 0x55, 0x54, 0x4f, 0x49, 0x35, 0x70, 0x7c, 0x53, 0x60, 0x54, 0x5e, 0x79, + 0x74, 0x59, 0x49, 0x5e, 0x5e, 0x58, 0x72, 0x7a, 0x8c, 0x89, 0x89, 0xc1, + 0xbb, 0x8f, 0x72, 0x6a, 0x73, 0x72, 0x76, 0x8b, 0x8d, 0x72, 0x98, 0xfe, + 0xa7, 0x68, 0x90, 0x8d, 0x76, 0x5c, 0x60, 0x78, 0x68, 0x7b, 0x8f, 0x7d, + 0x7f, 0x8d, 0x6f, 0x55, 0x8d, 0x91, 0x8f, 0x84, 0x71, 0x7e, 0x6a, 0x8f, + 0xa1, 0x94, 0x78, 0x72, 0x89, 0x7c, 0x8b, 0x8e, 0x86, 0x7e, 0x7c, 0x8e, + 0x8f, 0x7e, 0x7e, 0x84, 0x6b, 0x86, 0xa0, 0xa3, 0x97, 0x81, 0x66, 0x50, + 0x39, 0x46, 0x20, 0x48, 0x92, 0x77, 0x5f, 0x82, 0x84, 0x8b, 0x74, 0x75, + 0x6b, 0x5e, 0x32, 0x08, 0xf1, 0xeb, 0xe4, 0xf6, 0xb8, 0x65, 0x7a, 0x96, + 0x89, 0x75, 0x7d, 0x83, 0xb4, 0xe4, 0xd8, 0xe3, 0xe2, 0xe2, 0xe0, 0xdf, + 0xdd, 0xdb, 0xda, 0xd9, 0xdb, 0xd9, 0xd6, 0xd1, 0xcc, 0xc7, 0xc3, 0xc1, + 0xbe, 0xbf, 0xc1, 0xc3, 0xc5, 0xc7, 0xc8, 0xc9, 0xc5, 0xc5, 0xc5, 0xc6, + 0xc7, 0xc7, 0xc8, 0xc8, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc2, 0xc3, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xcb, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xc6, 0xca, 0xcc, 0xc9, + 0xc3, 0xc0, 0xc2, 0xc6, 0xc4, 0xc9, 0xcf, 0xcf, 0xcb, 0xc9, 0xcb, 0xce, + 0xc6, 0xa0, 0x74, 0xc7, 0xec, 0xb3, 0xc3, 0xdb, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcc, 0xcb, 0xc9, 0xc8, + 0xc8, 0xc9, 0xcb, 0xcc, 0xae, 0xb8, 0xb6, 0x8a, 0x9e, 0x9d, 0x95, 0xc1, + 0xc5, 0xc6, 0xc9, 0xcb, 0xcb, 0xcb, 0xca, 0xc9, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xbe, 0xc4, 0xc9, 0xca, 0xc7, 0xc6, 0xc9, 0xcd, + 0xc1, 0xa8, 0xa0, 0xcc, 0xcb, 0xca, 0xbb, 0xc7, 0xa6, 0xa1, 0xbf, 0xbd, + 0x9c, 0x7f, 0x65, 0x62, 0x6a, 0x6b, 0x6f, 0x75, 0x7d, 0x84, 0x87, 0x88, + 0x73, 0x69, 0x5d, 0x5a, 0x64, 0x75, 0x84, 0x8d, 0x8d, 0x8a, 0x87, 0x86, + 0x84, 0x7c, 0x70, 0x66, 0x7d, 0x74, 0x69, 0x63, 0x61, 0x62, 0x61, 0x5f, + 0x64, 0x56, 0x48, 0x46, 0x4d, 0x53, 0x51, 0x4c, 0x48, 0x85, 0x74, 0x5d, + 0x5d, 0x56, 0x6b, 0x7b, 0x63, 0x4b, 0x5b, 0x4e, 0x5f, 0x83, 0x80, 0xa5, + 0x93, 0x84, 0xa1, 0xcf, 0xa9, 0x60, 0x5d, 0x7d, 0x88, 0x7b, 0x87, 0x7f, + 0x67, 0x5c, 0x71, 0xa8, 0xde, 0x80, 0x65, 0x73, 0x7e, 0x7a, 0x6d, 0x7f, + 0x69, 0x79, 0x89, 0x7c, 0x66, 0x73, 0x8b, 0x8f, 0x7b, 0x7b, 0x86, 0x71, + 0x79, 0x95, 0x83, 0x79, 0x79, 0x84, 0x80, 0x80, 0x8b, 0x85, 0x76, 0x77, + 0x88, 0x8e, 0x96, 0x8a, 0x90, 0x78, 0x5a, 0x8c, 0x8f, 0x94, 0x84, 0x84, + 0x79, 0x7c, 0xa1, 0x9e, 0x94, 0x6b, 0x46, 0x57, 0x76, 0x67, 0x54, 0x62, + 0x5f, 0x6a, 0x66, 0x6c, 0x6d, 0x78, 0x26, 0x10, 0xe8, 0xf8, 0xeb, 0xf4, + 0xd4, 0x95, 0xb5, 0xf2, 0xfd, 0xff, 0xf0, 0x92, 0x8c, 0xd8, 0xe9, 0xea, + 0xeb, 0xea, 0xe9, 0xe7, 0xe6, 0xe4, 0xe3, 0xe2, 0xe8, 0xe6, 0xe3, 0xe0, + 0xdc, 0xd8, 0xd5, 0xd3, 0xcd, 0xcb, 0xca, 0xc7, 0xc4, 0xc2, 0xc0, 0xbf, + 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc4, 0xc4, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, + 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcb, 0xc9, 0xc8, 0xc7, 0xc6, 0xc4, 0xc3, 0xc5, 0xca, 0xcf, 0xcf, + 0xcc, 0xca, 0xcc, 0xce, 0xd8, 0xc8, 0xc8, 0xcc, 0x7e, 0x6c, 0xc5, 0xd4, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcf, 0xcf, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xab, 0xaa, 0xbd, 0x8f, + 0xa1, 0xaa, 0x97, 0xbd, 0xc6, 0xc7, 0xca, 0xcc, 0xcc, 0xcc, 0xcb, 0xca, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xc9, 0xc9, 0xc9, 0xc9, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xd0, 0xcc, 0xc6, 0xc3, + 0xc3, 0xc5, 0xc7, 0xc8, 0xd4, 0xbb, 0xa9, 0xc2, 0xba, 0xba, 0xb6, 0xca, + 0xd6, 0xb8, 0xcd, 0xc0, 0x83, 0x67, 0x66, 0x6b, 0x74, 0x7f, 0x89, 0x85, + 0x76, 0x6a, 0x68, 0x6c, 0x6e, 0x7b, 0x87, 0x86, 0x7c, 0x75, 0x79, 0x80, + 0x80, 0x75, 0x6c, 0x6d, 0x76, 0x7b, 0x75, 0x6d, 0x68, 0x64, 0x5e, 0x5c, + 0x5c, 0x5a, 0x54, 0x4f, 0x58, 0x4e, 0x45, 0x46, 0x4d, 0x4f, 0x49, 0x42, + 0x3d, 0x7d, 0x78, 0x67, 0x66, 0x5a, 0x62, 0x67, 0x5b, 0x4e, 0x51, 0x35, + 0x48, 0x70, 0x73, 0xa1, 0x97, 0x98, 0xab, 0xa0, 0x74, 0x5f, 0x6f, 0x88, + 0x6b, 0x71, 0x8a, 0x8b, 0x85, 0x80, 0x72, 0x7a, 0xd1, 0xc7, 0x84, 0x6d, + 0x74, 0x62, 0x6a, 0x7d, 0x73, 0x66, 0x75, 0x80, 0x8c, 0x9b, 0x8a, 0x72, + 0x79, 0x73, 0x8c, 0x9f, 0x93, 0x75, 0x6b, 0x84, 0x77, 0x80, 0x9b, 0x96, + 0x73, 0x75, 0x8c, 0x8a, 0x92, 0x74, 0x82, 0x7f, 0x7d, 0x93, 0x8b, 0x7f, + 0x89, 0x6b, 0x78, 0x8d, 0x8d, 0x91, 0x8d, 0x7c, 0x73, 0x95, 0xb8, 0x87, + 0x3c, 0x56, 0x8e, 0x86, 0x79, 0x80, 0x74, 0x71, 0x6b, 0x72, 0x1f, 0x09, + 0xec, 0xf3, 0xe5, 0xef, 0xf0, 0xee, 0xfe, 0xf0, 0x67, 0xa8, 0xec, 0xeb, + 0xec, 0xfa, 0xe6, 0xe6, 0xef, 0xef, 0xee, 0xed, 0xeb, 0xea, 0xe9, 0xe9, + 0xf0, 0xef, 0xee, 0xec, 0xe9, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xdf, 0xdb, + 0xd6, 0xd2, 0xcf, 0xcd, 0xcd, 0xcd, 0xcc, 0xca, 0xc9, 0xc8, 0xc7, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc7, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xcb, 0xcc, 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xd2, 0xcd, 0xc8, 0xc8, 0xcb, 0xcc, 0xc7, 0xc1, + 0xc7, 0xcb, 0xcf, 0xd0, 0xce, 0xcc, 0xcd, 0xce, 0xd0, 0xd4, 0xdd, 0xd0, + 0xa5, 0xb7, 0xe6, 0xcf, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xd3, 0xd4, 0xd5, 0xd5, 0xd3, 0xcf, 0xca, 0xc7, + 0xc4, 0xb4, 0xd0, 0x9f, 0xa6, 0xb8, 0xa1, 0xbe, 0xc8, 0xc9, 0xcb, 0xcd, + 0xce, 0xce, 0xcc, 0xcb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xce, 0xca, 0xc6, 0xc7, 0xcb, 0xcb, 0xc5, 0xbf, 0xc9, 0xbc, 0xb0, 0xbe, + 0xb8, 0xb6, 0xb3, 0xc4, 0xba, 0xa2, 0xca, 0xc2, 0x77, 0x59, 0x5f, 0x63, + 0x69, 0x6f, 0x72, 0x6b, 0x63, 0x65, 0x72, 0x80, 0x85, 0x87, 0x89, 0x87, + 0x83, 0x7f, 0x7d, 0x7d, 0x85, 0x6f, 0x59, 0x56, 0x65, 0x76, 0x7d, 0x7c, + 0x68, 0x62, 0x5c, 0x5b, 0x5d, 0x5e, 0x5c, 0x5a, 0x4a, 0x46, 0x44, 0x47, + 0x4a, 0x46, 0x39, 0x2d, 0x30, 0x72, 0x76, 0x62, 0x62, 0x61, 0x61, 0x58, + 0x5a, 0x53, 0x43, 0x2f, 0x69, 0x9c, 0x8b, 0xa2, 0x9a, 0x86, 0x88, 0x68, + 0x5d, 0x7f, 0x85, 0x89, 0x92, 0x7f, 0x70, 0x5d, 0x71, 0x95, 0x86, 0x72, + 0x81, 0xbf, 0xa9, 0x84, 0x7c, 0x6e, 0x62, 0x4e, 0x69, 0x69, 0x93, 0x92, + 0x7c, 0x78, 0x6f, 0x7c, 0x8e, 0x84, 0x72, 0x75, 0x78, 0x79, 0x8a, 0x93, + 0x85, 0x7e, 0x7c, 0x85, 0x89, 0x81, 0x83, 0x93, 0x84, 0x6d, 0x8d, 0x98, + 0x86, 0x90, 0x88, 0x69, 0x73, 0x86, 0x94, 0x80, 0x8b, 0x88, 0x6b, 0x90, + 0x8a, 0x93, 0x6d, 0x60, 0x93, 0xa1, 0x8a, 0x8e, 0x63, 0x6d, 0x65, 0x68, + 0x67, 0x71, 0x20, 0x0a, 0xea, 0xf6, 0xf3, 0xed, 0xe5, 0xef, 0xf2, 0xc5, + 0x8a, 0xb5, 0xe9, 0xf4, 0xfa, 0xfb, 0xe8, 0xee, 0xed, 0xed, 0xec, 0xeb, + 0xea, 0xe9, 0xe8, 0xe8, 0xee, 0xed, 0xed, 0xec, 0xec, 0xeb, 0xeb, 0xea, + 0xee, 0xee, 0xec, 0xeb, 0xe9, 0xe7, 0xe6, 0xe5, 0xdd, 0xdc, 0xda, 0xd8, + 0xd6, 0xd4, 0xd3, 0xd2, 0xcb, 0xcb, 0xca, 0xca, 0xc9, 0xc9, 0xc8, 0xc8, + 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd3, 0xd0, 0xcc, 0xcb, + 0xcc, 0xcb, 0xc8, 0xc4, 0xc9, 0xcc, 0xcf, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, + 0xc7, 0xd1, 0xd1, 0xcd, 0xdc, 0xe8, 0xde, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd3, 0xd6, 0xd8, 0xd9, + 0xd5, 0xce, 0xc7, 0xc2, 0xc1, 0xab, 0xc1, 0x9b, 0x9e, 0xb3, 0xb3, 0xc6, + 0xca, 0xcb, 0xce, 0xd0, 0xd0, 0xd0, 0xcf, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xd3, 0xcb, 0xc1, 0xbc, 0xc0, 0xc8, 0xcf, 0xd3, + 0xd6, 0xca, 0xb6, 0xb0, 0xaf, 0xae, 0xac, 0xb6, 0x8c, 0x95, 0xc7, 0xbb, + 0x79, 0x5d, 0x5a, 0x5e, 0x71, 0x67, 0x5a, 0x54, 0x58, 0x64, 0x72, 0x7b, + 0x77, 0x6a, 0x5f, 0x60, 0x6e, 0x7c, 0x83, 0x84, 0x6e, 0x69, 0x67, 0x6c, + 0x74, 0x74, 0x6a, 0x5f, 0x74, 0x6f, 0x68, 0x64, 0x63, 0x60, 0x5a, 0x55, + 0x44, 0x46, 0x4b, 0x53, 0x56, 0x4f, 0x41, 0x35, 0x51, 0x91, 0x94, 0x69, + 0x64, 0x77, 0x70, 0x54, 0x54, 0x6c, 0x5c, 0x3e, 0x6d, 0x95, 0x8a, 0xa9, + 0x9f, 0x80, 0x92, 0x78, 0x69, 0x7e, 0x77, 0x8a, 0x69, 0x7d, 0x94, 0x81, + 0x79, 0x84, 0x73, 0x69, 0x5a, 0x96, 0xe1, 0xb7, 0x69, 0x65, 0x6f, 0x71, + 0x7d, 0x59, 0x69, 0x6d, 0x70, 0x7f, 0x77, 0x84, 0x6e, 0x80, 0x6c, 0x6e, + 0x81, 0x94, 0x9d, 0x76, 0x75, 0x85, 0x85, 0x89, 0x95, 0x83, 0x6b, 0x70, + 0x97, 0x86, 0x81, 0x83, 0x80, 0x73, 0x74, 0x8d, 0x89, 0x73, 0x85, 0x73, + 0x65, 0x9d, 0xa1, 0x65, 0x79, 0x56, 0x5f, 0x7d, 0x6f, 0x55, 0x5b, 0x6c, + 0x7a, 0x86, 0x80, 0x82, 0x7a, 0x79, 0x1c, 0x00, 0xeb, 0xfb, 0xf3, 0xf0, + 0xf6, 0xef, 0xf1, 0xfc, 0xf8, 0xff, 0xff, 0xec, 0xed, 0xf5, 0xf0, 0xf4, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe7, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdd, 0xd7, 0xd7, 0xd6, 0xd5, + 0xd4, 0xd3, 0xd3, 0xd2, 0xd1, 0xd1, 0xd0, 0xcf, 0xce, 0xcd, 0xcd, 0xcc, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xcf, 0xcf, 0xd0, + 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd3, 0xd3, 0xcf, 0xca, 0xc6, 0xc6, 0xc8, 0xcc, 0xcd, 0xcf, 0xd1, + 0xd3, 0xd3, 0xd1, 0xcf, 0xd2, 0xcd, 0xd7, 0xd7, 0xd4, 0xd3, 0xca, 0xce, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd3, 0xd5, 0xd8, 0xd7, 0xd4, 0xcc, 0xc4, 0xbf, 0xc8, 0xb6, 0xbb, 0xa4, + 0x9d, 0x9e, 0xb1, 0xb8, 0xcc, 0xce, 0xd0, 0xd2, 0xd3, 0xd2, 0xd1, 0xd0, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xc4, 0xc8, 0xcc, 0xcd, + 0xca, 0xc8, 0xc9, 0xca, 0xd4, 0xd0, 0xbe, 0xb0, 0xbd, 0xbd, 0xb3, 0xac, + 0xa1, 0xbd, 0xd2, 0xa9, 0x7a, 0x67, 0x5e, 0x6d, 0x65, 0x61, 0x5e, 0x5f, + 0x65, 0x6e, 0x76, 0x7a, 0x80, 0x78, 0x6d, 0x66, 0x66, 0x68, 0x68, 0x68, + 0x65, 0x6e, 0x7a, 0x81, 0x7d, 0x71, 0x62, 0x59, 0x5e, 0x5c, 0x5c, 0x60, + 0x63, 0x62, 0x5c, 0x57, 0x60, 0x62, 0x64, 0x65, 0x60, 0x53, 0x41, 0x35, + 0x5f, 0x9c, 0xa0, 0x64, 0x58, 0x77, 0x63, 0x33, 0x37, 0x67, 0x6a, 0x5b, + 0x86, 0x9e, 0x92, 0xaa, 0x76, 0x55, 0x74, 0x73, 0x71, 0x80, 0x6f, 0x81, + 0x83, 0x72, 0x6e, 0x63, 0x6f, 0x88, 0x85, 0x89, 0x68, 0x59, 0xad, 0xd5, + 0xa1, 0x7d, 0x6d, 0x66, 0x77, 0x69, 0x81, 0x81, 0x6b, 0x65, 0x64, 0x77, + 0x76, 0x8f, 0x8e, 0x90, 0x79, 0x63, 0x7f, 0x8a, 0x86, 0x80, 0x7d, 0x6c, + 0x64, 0x87, 0x9c, 0x84, 0x83, 0x87, 0x77, 0x83, 0x97, 0x7e, 0x6e, 0x85, + 0x82, 0x74, 0x77, 0xa3, 0x98, 0x60, 0x78, 0xb6, 0x73, 0x5d, 0x56, 0x56, + 0x5a, 0x76, 0x8d, 0x86, 0x85, 0x84, 0x6b, 0x5f, 0x57, 0x63, 0x1a, 0x0a, + 0xfb, 0xf5, 0xea, 0xe9, 0xef, 0xf1, 0xee, 0xed, 0xf6, 0xf4, 0xee, 0xef, + 0xf3, 0xeb, 0xe8, 0xf5, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, + 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xe9, 0xe9, 0xe8, 0xe8, + 0xe7, 0xe6, 0xe6, 0xe6, 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe4, 0xe3, 0xe3, + 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdf, 0xdf, 0xd3, 0xd3, 0xd2, 0xd0, + 0xcf, 0xce, 0xcd, 0xcc, 0xd3, 0xd3, 0xd2, 0xd2, 0xd1, 0xd1, 0xd0, 0xd0, + 0xd1, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd0, 0xd3, 0xd5, 0xd0, 0xc8, 0xc3, 0xc5, 0xc8, + 0xcf, 0xce, 0xcf, 0xd2, 0xd5, 0xd6, 0xd2, 0xcf, 0xd6, 0xcf, 0xd2, 0xd3, + 0xd9, 0xdc, 0xd1, 0xcd, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd5, 0xd6, 0xd6, 0xd5, 0xd2, 0xcc, 0xc6, 0xc3, + 0xb8, 0xb0, 0xb4, 0xb1, 0xac, 0x9a, 0xb5, 0xc4, 0xce, 0xd0, 0xd2, 0xd4, + 0xd5, 0xd4, 0xd3, 0xd2, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xd1, 0xd3, 0xd1, 0xc9, 0xc2, 0xc0, 0xc5, 0xcc, 0xc0, 0xcc, 0xc6, 0xb8, + 0xd4, 0xd5, 0xc4, 0xb0, 0xb0, 0xc7, 0xc9, 0x9d, 0x83, 0x74, 0x61, 0x75, + 0x7d, 0x7f, 0x7c, 0x6f, 0x62, 0x61, 0x6d, 0x7b, 0x78, 0x6e, 0x65, 0x64, + 0x6b, 0x70, 0x6f, 0x6c, 0x64, 0x6b, 0x70, 0x6e, 0x67, 0x62, 0x62, 0x65, + 0x64, 0x5c, 0x53, 0x50, 0x56, 0x5f, 0x66, 0x69, 0x65, 0x65, 0x63, 0x5e, + 0x55, 0x49, 0x3c, 0x34, 0x3b, 0x6c, 0x80, 0x53, 0x4e, 0x6f, 0x53, 0x23, + 0x35, 0x54, 0x51, 0x54, 0x84, 0x9e, 0x9c, 0xab, 0x92, 0x74, 0x81, 0x7f, + 0x86, 0x98, 0x82, 0x75, 0x7b, 0x77, 0x89, 0x8a, 0x81, 0x75, 0x61, 0x69, + 0x8e, 0x69, 0x77, 0xc7, 0xb8, 0x63, 0x55, 0x62, 0x8f, 0x74, 0x64, 0x68, + 0x6b, 0x77, 0x88, 0x85, 0x9e, 0x82, 0x67, 0x74, 0x86, 0x88, 0x90, 0x91, + 0x7e, 0x74, 0x77, 0x86, 0x8e, 0x8f, 0x8e, 0x8b, 0x71, 0x89, 0x8e, 0x95, + 0x8f, 0x7a, 0x74, 0x6a, 0x90, 0x88, 0x84, 0x87, 0x68, 0x78, 0x9d, 0x61, + 0x55, 0x92, 0x96, 0x82, 0x90, 0x85, 0x6a, 0x72, 0x60, 0x75, 0x7e, 0x8c, + 0x8b, 0x89, 0x28, 0x06, 0xf1, 0xed, 0xf9, 0xf5, 0xeb, 0xf9, 0xfd, 0xeb, + 0xe9, 0xf4, 0xef, 0xed, 0xf3, 0xf3, 0xf4, 0xf6, 0xef, 0xef, 0xef, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xec, 0xeb, 0xea, 0xe9, 0xe7, 0xe5, 0xe4, 0xe4, + 0xdb, 0xda, 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd3, 0xd6, 0xd6, 0xd5, 0xd4, + 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd2, 0xd2, 0xd0, 0xcd, + 0xc9, 0xc5, 0xc4, 0xc3, 0xd1, 0xcf, 0xcf, 0xd2, 0xd7, 0xd8, 0xd4, 0xcf, + 0xd0, 0xd9, 0xcd, 0xc6, 0xd0, 0xd4, 0xd4, 0xd9, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd7, 0xd5, + 0xd2, 0xcf, 0xcd, 0xcc, 0xb8, 0xab, 0xb3, 0xae, 0xa7, 0x89, 0x9c, 0xc1, + 0xd0, 0xd2, 0xd4, 0xd6, 0xd7, 0xd6, 0xd5, 0xd4, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcf, 0xcf, 0xcf, 0xcf, 0xca, 0xce, 0xd3, 0xd4, 0xd0, 0xc9, 0xc1, 0xbc, + 0xc2, 0xd3, 0xcb, 0xac, 0xcb, 0xd0, 0xca, 0xba, 0xa9, 0xa4, 0xab, 0xa0, + 0x91, 0x7b, 0x63, 0x72, 0x7c, 0x7c, 0x77, 0x6a, 0x60, 0x64, 0x77, 0x88, + 0x6f, 0x64, 0x59, 0x57, 0x5d, 0x64, 0x66, 0x65, 0x79, 0x7c, 0x7e, 0x7d, + 0x79, 0x76, 0x75, 0x76, 0x7d, 0x70, 0x60, 0x57, 0x56, 0x5c, 0x61, 0x63, + 0x4b, 0x4b, 0x4b, 0x49, 0x48, 0x48, 0x4a, 0x4c, 0x3c, 0x4d, 0x68, 0x58, + 0x5a, 0x72, 0x5a, 0x42, 0x58, 0x5e, 0x44, 0x34, 0x41, 0x54, 0x73, 0x92, + 0x72, 0x72, 0x84, 0x84, 0x7b, 0x84, 0x8a, 0x86, 0x88, 0x6b, 0x64, 0x64, + 0x74, 0x85, 0x80, 0x8a, 0x76, 0x66, 0x56, 0x9c, 0xda, 0xb8, 0x85, 0x64, + 0x7f, 0x80, 0x70, 0x84, 0x87, 0x7d, 0x81, 0x55, 0x78, 0x84, 0x96, 0x8f, + 0x84, 0x7e, 0x6c, 0x67, 0x8c, 0x8c, 0x84, 0x8a, 0x8f, 0x70, 0x6b, 0x96, + 0x94, 0x96, 0x85, 0x7d, 0x67, 0x63, 0x85, 0x84, 0x76, 0x96, 0x72, 0x54, + 0x74, 0x7a, 0x54, 0x3c, 0x80, 0x5b, 0x64, 0x6f, 0x57, 0x66, 0x87, 0x7d, + 0x86, 0x85, 0x6d, 0x63, 0x5d, 0x6c, 0x24, 0x15, 0xf6, 0xf3, 0xf2, 0xf0, + 0xf7, 0xf3, 0xe8, 0xf4, 0xfa, 0xfa, 0xea, 0xe9, 0xef, 0xea, 0xec, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xed, + 0xec, 0xeb, 0xeb, 0xeb, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xec, 0xed, 0xee, + 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xea, 0xea, 0xe8, 0xe7, + 0xe5, 0xe3, 0xe2, 0xe1, 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, 0xde, 0xdd, 0xdc, + 0xd8, 0xd7, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, + 0xd5, 0xd6, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd6, 0xd0, 0xcb, 0xc9, 0xca, 0xc9, 0xc3, 0xbe, 0xd2, 0xd0, 0xcf, 0xd2, + 0xd8, 0xd9, 0xd5, 0xcf, 0xcc, 0xd2, 0xd4, 0xda, 0xd3, 0xd3, 0xe0, 0xd9, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd9, 0xd9, 0xd9, 0xd9, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdd, 0xdb, 0xd8, 0xd5, 0xd3, 0xd2, 0xd2, 0xd3, 0xc0, 0xa9, 0xb8, 0xad, + 0xa8, 0x8d, 0x9b, 0xda, 0xd1, 0xd3, 0xd5, 0xd7, 0xd8, 0xd7, 0xd6, 0xd5, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xc9, 0xc9, 0xca, 0xcf, + 0xd3, 0xd1, 0xc8, 0xc0, 0xa6, 0xc5, 0xc9, 0xaa, 0xcb, 0xd1, 0xcf, 0xc0, + 0xbb, 0x91, 0x99, 0xa6, 0x95, 0x79, 0x66, 0x73, 0x82, 0x7d, 0x75, 0x6f, + 0x69, 0x65, 0x60, 0x5d, 0x5d, 0x6b, 0x75, 0x70, 0x63, 0x60, 0x6e, 0x7e, + 0x81, 0x76, 0x68, 0x5f, 0x5f, 0x64, 0x69, 0x6b, 0x57, 0x5a, 0x60, 0x69, + 0x70, 0x6f, 0x67, 0x60, 0x5e, 0x5a, 0x53, 0x4a, 0x44, 0x44, 0x49, 0x4d, + 0x5d, 0x4c, 0x5d, 0x59, 0x58, 0x61, 0x4d, 0x4e, 0x68, 0x59, 0x3f, 0x44, + 0x55, 0x59, 0x5b, 0x56, 0x73, 0x68, 0x6b, 0x7e, 0x7c, 0x77, 0x7a, 0x6d, + 0x6c, 0x6f, 0x87, 0x88, 0x84, 0x7e, 0x68, 0x67, 0x83, 0x8b, 0x78, 0x59, + 0x8e, 0xc2, 0x8e, 0x5b, 0x79, 0x8b, 0x6c, 0x74, 0x6a, 0x65, 0x8e, 0x6e, + 0x67, 0x60, 0x72, 0x6d, 0x74, 0x84, 0x7a, 0x84, 0x81, 0x77, 0x70, 0x6b, + 0x77, 0x97, 0x9c, 0x7d, 0x7d, 0x76, 0x6b, 0x90, 0x9b, 0x81, 0x80, 0x71, + 0x58, 0x75, 0x8d, 0x93, 0xa2, 0x73, 0x3a, 0x6a, 0x72, 0x7c, 0x78, 0x7b, + 0x88, 0x7c, 0x69, 0x6c, 0x65, 0x73, 0x72, 0x7b, 0x7c, 0x84, 0x2f, 0x16, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe1, 0xe1, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xdb, 0xda, 0xda, 0xd9, + 0xd8, 0xd8, 0xd7, 0xd7, 0xd9, 0xd4, 0xd2, 0xcc, 0xc5, 0xcb, 0xcc, 0xc0, + 0xcd, 0xd8, 0xc5, 0xcf, 0xdd, 0xd3, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd8, 0xd9, 0xdb, 0xdd, 0xdf, 0xe0, 0xe1, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xd9, 0xdc, 0xe3, 0xe0, 0xd5, 0xcf, 0xd1, + 0xc6, 0xa7, 0xad, 0xb5, 0xbb, 0x83, 0xaa, 0xcd, 0xcd, 0xd6, 0xda, 0xd5, + 0xd3, 0xd7, 0xd8, 0xd5, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd1, 0xd2, 0xd2, 0xd2, 0xd0, 0xcd, 0xca, 0xc8, + 0xc6, 0xdc, 0xca, 0xcd, 0xd5, 0xbc, 0xbc, 0xd0, 0xc2, 0xbc, 0xb1, 0xa7, + 0xb6, 0xa8, 0xb7, 0xa8, 0xbe, 0xa2, 0xab, 0xc1, 0x95, 0x73, 0x7f, 0x6b, + 0x76, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6d, 0x69, 0x7b, 0x76, 0x6c, 0x65, + 0x6a, 0x71, 0x6d, 0x62, 0x5d, 0x5c, 0x5e, 0x67, 0x72, 0x77, 0x75, 0x70, + 0x6d, 0x69, 0x64, 0x5f, 0x5b, 0x56, 0x51, 0x4d, 0x53, 0x48, 0x4f, 0x52, + 0x45, 0x43, 0x43, 0x33, 0x50, 0x5e, 0x55, 0x43, 0x4e, 0x61, 0x55, 0x3b, + 0x51, 0x54, 0x50, 0x53, 0x58, 0x45, 0x2f, 0x2e, 0x5f, 0x61, 0x69, 0x74, + 0x76, 0x75, 0x80, 0x8f, 0x75, 0x68, 0x65, 0x72, 0x7c, 0x7b, 0x7a, 0x7f, + 0x71, 0x69, 0x71, 0x71, 0x59, 0x94, 0xc7, 0x72, 0x65, 0x76, 0x71, 0x7b, + 0x90, 0x88, 0x79, 0x7c, 0x7b, 0x59, 0x7e, 0x77, 0x87, 0x7f, 0x80, 0x81, + 0x67, 0x84, 0x92, 0x9c, 0x81, 0x6f, 0x7d, 0x61, 0x84, 0x94, 0x80, 0x6b, + 0x76, 0x74, 0x6d, 0x7b, 0x85, 0x5c, 0x4c, 0x7e, 0x71, 0x5d, 0x92, 0x94, + 0x89, 0x70, 0x72, 0x6f, 0x57, 0x63, 0x77, 0x68, 0x84, 0x8f, 0x87, 0x8a, + 0x87, 0x83, 0x1d, 0x00, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe3, 0xe3, 0xe2, 0xe2, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xde, 0xdd, 0xdc, 0xdc, 0xdc, 0xd7, 0xda, 0xdb, 0xd0, + 0xc6, 0xcd, 0xce, 0xbe, 0xc3, 0xd5, 0xcb, 0xd0, 0xda, 0xd3, 0xd8, 0xd7, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd9, 0xda, 0xdc, + 0xdd, 0xdf, 0xe0, 0xe1, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, 0xdd, 0xe0, 0xdf, + 0xdc, 0xd9, 0xd3, 0xce, 0xd1, 0xb5, 0x96, 0xb1, 0xc1, 0x88, 0x95, 0xc7, + 0xcc, 0xd5, 0xdb, 0xd7, 0xd5, 0xd8, 0xd7, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd1, 0xce, 0xcb, 0xc9, 0xba, 0xbc, 0xcf, 0xd2, 0xd4, 0xca, 0xb5, 0xc1, + 0xdc, 0xc4, 0xc0, 0x98, 0x9c, 0xd3, 0xc9, 0xc9, 0xa1, 0xa7, 0xc1, 0xd2, + 0x9c, 0x6a, 0x76, 0x76, 0x78, 0x7a, 0x7d, 0x80, 0x81, 0x7c, 0x6f, 0x63, + 0x7a, 0x7c, 0x76, 0x6d, 0x6c, 0x74, 0x79, 0x77, 0x80, 0x7c, 0x75, 0x6d, + 0x67, 0x65, 0x67, 0x6a, 0x6a, 0x60, 0x58, 0x5a, 0x62, 0x64, 0x5c, 0x52, + 0x59, 0x50, 0x56, 0x58, 0x4d, 0x4b, 0x4a, 0x3e, 0x4c, 0x61, 0x58, 0x40, + 0x49, 0x5f, 0x5b, 0x48, 0x66, 0x74, 0x69, 0x56, 0x56, 0x54, 0x48, 0x43, + 0x76, 0x72, 0x79, 0x89, 0x8d, 0x80, 0x70, 0x69, 0x84, 0x8d, 0x8c, 0x7f, + 0x76, 0x74, 0x6c, 0x60, 0x8c, 0x7e, 0x89, 0x93, 0x74, 0x76, 0xa4, 0xac, + 0x75, 0x68, 0x60, 0x57, 0x84, 0x8b, 0x5e, 0x89, 0x7b, 0x74, 0x81, 0x69, + 0x81, 0x6e, 0x6f, 0x98, 0x98, 0x94, 0x73, 0x80, 0x8e, 0x7d, 0x89, 0x98, + 0x92, 0x77, 0x73, 0x6d, 0x60, 0x7d, 0x97, 0x83, 0x56, 0x7b, 0xae, 0x5d, + 0x59, 0x91, 0x5f, 0x6d, 0x5a, 0x66, 0x7c, 0x87, 0x88, 0x96, 0x98, 0x84, + 0x78, 0x58, 0x4e, 0x75, 0x82, 0x81, 0x29, 0x13, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe1, 0xe1, + 0xdb, 0xda, 0xdd, 0xd9, 0xce, 0xcc, 0xc9, 0xbc, 0xb4, 0xd0, 0xd2, 0xd3, + 0xd6, 0xd4, 0xd9, 0xd5, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe1, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xd8, 0xe1, 0xe3, 0xdc, 0xd9, 0xdc, 0xd7, 0xcc, 0xd8, 0xe2, 0x96, 0x92, + 0xaf, 0xa1, 0xa7, 0xc9, 0xca, 0xd5, 0xdc, 0xda, 0xd8, 0xd9, 0xd7, 0xd2, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd4, 0xd4, 0xd2, 0xd0, 0xcd, 0xcb, 0xbf, 0xb0, 0xc1, 0xc7, + 0xc9, 0xd1, 0xca, 0xcd, 0xd2, 0xe4, 0xd9, 0xb9, 0x98, 0xcc, 0xd1, 0xc1, + 0x5a, 0xaf, 0xd3, 0xb4, 0x7c, 0x67, 0x73, 0x65, 0x7a, 0x6f, 0x64, 0x62, + 0x69, 0x74, 0x7d, 0x83, 0x7d, 0x81, 0x7b, 0x6a, 0x60, 0x65, 0x6f, 0x75, + 0x87, 0x87, 0x86, 0x82, 0x7c, 0x77, 0x74, 0x72, 0x5d, 0x62, 0x67, 0x69, + 0x68, 0x6a, 0x6f, 0x74, 0x5e, 0x58, 0x59, 0x56, 0x49, 0x43, 0x41, 0x38, + 0x45, 0x6a, 0x73, 0x67, 0x6d, 0x70, 0x60, 0x52, 0x40, 0x5d, 0x66, 0x5d, + 0x5f, 0x66, 0x72, 0x85, 0x7e, 0x6e, 0x64, 0x6a, 0x74, 0x79, 0x7f, 0x87, + 0x75, 0x6f, 0x63, 0x5f, 0x6f, 0x83, 0x83, 0x74, 0x79, 0x5d, 0x5e, 0x6e, + 0x6f, 0x69, 0x8d, 0xd9, 0xc2, 0x7e, 0x72, 0x6e, 0x7b, 0x82, 0x6f, 0x95, + 0x7a, 0x65, 0x6b, 0x63, 0x8b, 0xa3, 0x8f, 0x65, 0x71, 0x80, 0x72, 0x7b, + 0x8f, 0x87, 0x7c, 0x70, 0x7e, 0x72, 0x77, 0x8b, 0x84, 0x67, 0x69, 0x89, + 0x96, 0xa0, 0x4e, 0x4d, 0x74, 0x6f, 0x84, 0x84, 0x85, 0x90, 0x82, 0x69, + 0x64, 0x5d, 0x4d, 0x45, 0x7a, 0x7b, 0x88, 0x8a, 0x5b, 0x53, 0x11, 0x00, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe6, 0xe6, + 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, 0xd5, 0xd6, 0xdd, 0xd6, 0xcc, 0xc3, 0xb8, + 0xa8, 0xc8, 0xd9, 0xd5, 0xd2, 0xd7, 0xdb, 0xd5, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe1, 0xe2, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdc, 0xe1, 0xe1, 0xdd, 0xda, 0xda, 0xd6, 0xd0, + 0xb3, 0xe3, 0xa5, 0x87, 0xad, 0xb3, 0xc1, 0xc8, 0xc9, 0xd5, 0xdd, 0xdc, + 0xda, 0xda, 0xd7, 0xd2, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd4, 0xd5, 0xd4, 0xd2, 0xcf, 0xce, + 0xc5, 0xc6, 0xc3, 0xd4, 0xd6, 0xca, 0xc6, 0xaf, 0xb7, 0xd4, 0xcb, 0xd2, + 0xbc, 0xca, 0xd9, 0xaf, 0x86, 0xd0, 0xdf, 0xba, 0x84, 0x59, 0x5d, 0x68, + 0x70, 0x6e, 0x75, 0x80, 0x83, 0x77, 0x68, 0x61, 0x6e, 0x73, 0x6d, 0x60, + 0x5b, 0x66, 0x76, 0x7e, 0x8c, 0x8a, 0x89, 0x89, 0x87, 0x81, 0x78, 0x72, + 0x5c, 0x67, 0x6e, 0x68, 0x5a, 0x54, 0x5b, 0x66, 0x60, 0x5f, 0x5f, 0x5a, + 0x4f, 0x49, 0x48, 0x45, 0x4e, 0x69, 0x6f, 0x6c, 0x6d, 0x5d, 0x50, 0x5e, + 0x41, 0x34, 0x2e, 0x4a, 0x6e, 0x6d, 0x62, 0x6a, 0x65, 0x6c, 0x7b, 0x87, + 0x82, 0x71, 0x6a, 0x6d, 0x71, 0x73, 0x7d, 0x87, 0x80, 0x71, 0x6e, 0x76, + 0x79, 0x84, 0x9c, 0x8b, 0x74, 0x61, 0x64, 0xa2, 0xdd, 0x9d, 0x68, 0x69, + 0x72, 0x73, 0x7c, 0x81, 0x83, 0x67, 0x7b, 0x8e, 0x7e, 0x6b, 0x75, 0x7f, + 0x6e, 0x87, 0x9c, 0x8b, 0x64, 0x67, 0x86, 0x8b, 0x86, 0x9c, 0x80, 0x6a, + 0x83, 0x7d, 0x5b, 0x59, 0x6a, 0x5a, 0x5c, 0x87, 0x92, 0x7a, 0x7a, 0x7c, + 0x67, 0x71, 0x61, 0x60, 0x7a, 0x78, 0x75, 0x95, 0x8f, 0x66, 0x5f, 0x6d, + 0x4a, 0x4b, 0x18, 0x0e, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe8, + 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, 0xe2, 0xd8, 0xd5, 0xd6, + 0xd5, 0xd5, 0xc7, 0xaf, 0xa3, 0xc0, 0xdb, 0xd7, 0xd1, 0xda, 0xde, 0xd9, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe1, + 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xde, 0xdd, 0xe0, + 0xde, 0xd6, 0xd4, 0xd6, 0xc4, 0xd3, 0xab, 0x85, 0x9e, 0x87, 0xb0, 0xca, + 0xcb, 0xd6, 0xde, 0xdc, 0xd9, 0xdb, 0xd9, 0xd4, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd3, 0xd4, 0xd5, 0xd6, + 0xd6, 0xd4, 0xd2, 0xd0, 0xbf, 0xba, 0x9f, 0xaa, 0xc4, 0xcd, 0xd3, 0xc6, + 0xae, 0xb9, 0xd4, 0xd0, 0xb7, 0x9d, 0xb9, 0xc5, 0x98, 0xc9, 0xc0, 0xa0, + 0x81, 0x61, 0x69, 0x7e, 0x86, 0x77, 0x70, 0x75, 0x74, 0x6a, 0x65, 0x68, + 0x7f, 0x7d, 0x72, 0x62, 0x5d, 0x67, 0x70, 0x72, 0x85, 0x86, 0x84, 0x7e, + 0x77, 0x76, 0x7c, 0x82, 0x90, 0x8b, 0x82, 0x77, 0x6b, 0x60, 0x57, 0x52, + 0x4a, 0x4f, 0x4f, 0x49, 0x44, 0x3f, 0x40, 0x46, 0x5b, 0x6a, 0x6d, 0x78, + 0x78, 0x4e, 0x3b, 0x61, 0x48, 0x47, 0x4b, 0x5f, 0x6c, 0x61, 0x66, 0x86, + 0x78, 0x76, 0x7a, 0x7f, 0x7b, 0x76, 0x7e, 0x8b, 0x7e, 0x67, 0x5b, 0x69, + 0x7e, 0x86, 0x87, 0x89, 0x70, 0x6b, 0x78, 0x6b, 0x72, 0x85, 0x6c, 0x60, + 0x9f, 0xbe, 0x8b, 0x56, 0x6b, 0x7b, 0x7c, 0x8e, 0x84, 0x75, 0x5a, 0x6d, + 0x82, 0x79, 0x79, 0x9b, 0x91, 0x73, 0x78, 0x88, 0x88, 0x8b, 0x8f, 0x8d, + 0x81, 0x76, 0x8b, 0x9b, 0x88, 0x84, 0x97, 0xa0, 0x71, 0x5b, 0x8f, 0x7d, + 0x5a, 0x6a, 0x61, 0x6f, 0x91, 0x8d, 0x7f, 0x8a, 0x96, 0x6e, 0x57, 0x7a, + 0x57, 0x68, 0x7a, 0x82, 0x6f, 0x82, 0x37, 0x08, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, + 0xdd, 0xe1, 0xdd, 0xce, 0xcd, 0xde, 0xd4, 0xaf, 0xa6, 0xb8, 0xd9, 0xd9, + 0xd2, 0xde, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe6, 0xde, 0xdc, 0xe1, 0xdf, 0xd5, 0xd3, 0xd9, 0xc9, 0xc6, 0xc4, 0xa5, + 0xb0, 0x80, 0x98, 0xb0, 0xd0, 0xd9, 0xdd, 0xd9, 0xd6, 0xda, 0xdb, 0xd8, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd7, 0xd6, 0xd4, 0xd3, 0xd4, 0xdb, 0xdb, 0xb7, + 0xa4, 0xad, 0xbb, 0xe0, 0xeb, 0xd8, 0xcc, 0xd0, 0xce, 0x9a, 0xb9, 0xcd, + 0xae, 0xda, 0xc4, 0x96, 0x79, 0x6a, 0x74, 0x78, 0x77, 0x6b, 0x6b, 0x7a, + 0x7b, 0x6b, 0x61, 0x64, 0x6f, 0x6f, 0x69, 0x5f, 0x60, 0x6d, 0x77, 0x79, + 0x7d, 0x89, 0x90, 0x88, 0x79, 0x73, 0x7c, 0x88, 0x94, 0x91, 0x8b, 0x82, + 0x77, 0x6e, 0x68, 0x65, 0x59, 0x60, 0x5a, 0x4d, 0x44, 0x3a, 0x37, 0x42, + 0x62, 0x71, 0x75, 0x86, 0x8b, 0x54, 0x36, 0x5e, 0x67, 0x60, 0x4e, 0x47, + 0x52, 0x53, 0x56, 0x66, 0x82, 0x78, 0x76, 0x7f, 0x83, 0x7c, 0x74, 0x72, + 0x71, 0x7e, 0x84, 0x79, 0x70, 0x6e, 0x68, 0x5e, 0x91, 0x84, 0x85, 0x73, + 0x65, 0x72, 0x70, 0x61, 0x75, 0x9d, 0xa9, 0x5a, 0x54, 0x8a, 0x73, 0x64, + 0x5d, 0x85, 0x84, 0x8d, 0x82, 0x85, 0x76, 0x61, 0x80, 0x89, 0x90, 0x86, + 0x85, 0x78, 0x61, 0x70, 0x8f, 0x8e, 0x93, 0x84, 0x77, 0x94, 0x97, 0x65, + 0x50, 0x67, 0x60, 0x75, 0x7d, 0x80, 0x9d, 0x8a, 0x8b, 0x74, 0x60, 0x66, + 0x69, 0x55, 0x58, 0x7a, 0x76, 0x7d, 0x60, 0x42, 0x2b, 0x3c, 0x0c, 0x18, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe6, 0xe5, 0xe5, 0xe0, 0xe4, 0xe4, 0xd7, 0xcf, 0xda, 0xd9, 0xc4, + 0xad, 0xb2, 0xd4, 0xd9, 0xd4, 0xe1, 0xe4, 0xe9, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe1, 0xdf, 0xde, 0xdb, 0xd8, 0xd7, 0xd8, + 0xc5, 0xc3, 0xc4, 0xa8, 0xb4, 0xa3, 0xa0, 0xb3, 0xd5, 0xdb, 0xdc, 0xd5, + 0xd3, 0xd8, 0xdd, 0xdd, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd4, 0xd5, 0xd7, 0xd8, 0xd9, 0xd7, 0xd6, 0xd5, + 0xd4, 0xce, 0xdb, 0xcf, 0xc2, 0xbf, 0xa4, 0x91, 0xba, 0xcb, 0xd0, 0xf5, + 0xfd, 0xc7, 0xc4, 0xd6, 0xa1, 0xbd, 0xb9, 0xa7, 0x7e, 0x59, 0x6a, 0x82, + 0x84, 0x75, 0x75, 0x84, 0x82, 0x6b, 0x5c, 0x5f, 0x6e, 0x76, 0x75, 0x68, + 0x60, 0x65, 0x6e, 0x73, 0x8f, 0x92, 0x92, 0x8b, 0x7d, 0x70, 0x66, 0x63, + 0x7a, 0x7e, 0x80, 0x7d, 0x76, 0x73, 0x75, 0x79, 0x5a, 0x63, 0x59, 0x47, + 0x3c, 0x2e, 0x2a, 0x38, 0x67, 0x78, 0x6a, 0x68, 0x75, 0x53, 0x3d, 0x63, + 0x59, 0x5e, 0x58, 0x53, 0x56, 0x57, 0x6b, 0x8f, 0x71, 0x69, 0x6b, 0x79, + 0x82, 0x7e, 0x78, 0x78, 0x72, 0x71, 0x6b, 0x6a, 0x7a, 0x8e, 0x8f, 0x83, + 0x75, 0x6d, 0x6a, 0x7d, 0x88, 0x8d, 0x8d, 0x76, 0x5b, 0x7d, 0xe7, 0xc3, + 0x59, 0x60, 0x7b, 0x80, 0x8b, 0x78, 0x5f, 0x80, 0x63, 0x6f, 0x8c, 0x90, + 0x78, 0x81, 0x81, 0x66, 0x74, 0x90, 0x89, 0x99, 0x78, 0x8b, 0x75, 0x69, + 0x77, 0x61, 0x52, 0x76, 0x7a, 0x92, 0x91, 0x7b, 0x7a, 0x7d, 0x6b, 0x5e, + 0x53, 0x60, 0x7d, 0x8a, 0x79, 0x62, 0x45, 0x22, 0x20, 0x2d, 0x5c, 0xd8, + 0xff, 0xbf, 0x19, 0x18, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xeb, + 0xeb, 0xea, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, 0xe9, 0xe0, 0xe4, 0xe7, + 0xd7, 0xce, 0xd5, 0xdd, 0xb3, 0xae, 0xd1, 0xda, 0xd6, 0xe3, 0xe5, 0xee, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe3, 0xe3, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe1, 0xe6, 0xe3, 0xda, + 0xd7, 0xdc, 0xdb, 0xd5, 0xc7, 0xc4, 0xc0, 0xb2, 0xbb, 0xb4, 0x86, 0x97, + 0xd8, 0xdc, 0xdb, 0xd2, 0xd0, 0xd8, 0xdf, 0xe0, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd4, 0xd5, 0xd7, 0xd9, + 0xd9, 0xd8, 0xd7, 0xd6, 0xd4, 0xd3, 0xd7, 0xdd, 0xc9, 0xca, 0xdb, 0xbb, + 0x73, 0x4f, 0x43, 0x3f, 0x5e, 0x8d, 0x7a, 0xc5, 0xa6, 0xe3, 0xf0, 0xc5, + 0x85, 0x69, 0x79, 0x77, 0x6c, 0x5c, 0x5f, 0x73, 0x76, 0x63, 0x5a, 0x62, + 0x6b, 0x7c, 0x84, 0x78, 0x6a, 0x6d, 0x7b, 0x85, 0x93, 0x7f, 0x6b, 0x68, + 0x6f, 0x70, 0x61, 0x51, 0x60, 0x56, 0x4e, 0x50, 0x59, 0x5c, 0x54, 0x4a, + 0x4e, 0x5c, 0x55, 0x47, 0x44, 0x3b, 0x3b, 0x4e, 0x61, 0x82, 0x77, 0x6e, + 0x82, 0x6b, 0x4d, 0x62, 0x73, 0x59, 0x4a, 0x61, 0x76, 0x68, 0x68, 0x86, + 0x88, 0x86, 0x88, 0x88, 0x7d, 0x6e, 0x6c, 0x74, 0x74, 0x6c, 0x6d, 0x78, + 0x7c, 0x75, 0x74, 0x79, 0x7c, 0x8d, 0x7e, 0x80, 0x79, 0x68, 0x74, 0x6f, + 0x67, 0x50, 0x98, 0xda, 0xa0, 0x6d, 0x7b, 0x73, 0x79, 0x82, 0x5d, 0x87, + 0x8a, 0x84, 0x72, 0x71, 0x71, 0x67, 0x92, 0x9c, 0x8c, 0x88, 0x78, 0x7c, + 0x63, 0x92, 0x83, 0x84, 0xb4, 0x91, 0x5e, 0x7f, 0x78, 0x60, 0x58, 0x64, + 0x6f, 0x70, 0x77, 0x8c, 0x6f, 0x5a, 0x3f, 0x13, 0x09, 0x54, 0x97, 0x8f, + 0xbc, 0xff, 0xff, 0xe9, 0xf9, 0xd5, 0x2a, 0x00, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xed, 0xea, 0xe6, 0xe0, 0xdb, 0xda, 0xdc, 0xdf, 0xc6, 0xac, 0xbb, 0xc2, + 0xdb, 0xe8, 0xe9, 0xe6, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe4, 0xe3, 0xe2, 0xe0, 0xde, 0xdd, 0xdd, 0xde, 0xcf, 0xc6, 0xd4, 0xa2, + 0xc3, 0xc1, 0x94, 0xa3, 0xcf, 0xde, 0xce, 0xcf, 0xcc, 0xd7, 0xde, 0xe3, + 0xd8, 0xd9, 0xdb, 0xdc, 0xdb, 0xda, 0xd8, 0xd7, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, 0xda, 0xda, + 0xd9, 0xd9, 0xd8, 0xd7, 0xd6, 0xd5, 0xd5, 0xd5, 0xe6, 0xd1, 0xce, 0xce, + 0xd3, 0xdc, 0xad, 0x63, 0x6d, 0x72, 0x48, 0x4d, 0x2a, 0x2e, 0x48, 0x51, + 0x3e, 0x6d, 0x8e, 0x83, 0x6b, 0x67, 0x6f, 0x72, 0x73, 0x6b, 0x70, 0x7b, + 0x74, 0x5f, 0x5a, 0x66, 0x6b, 0x79, 0x7c, 0x6d, 0x60, 0x5e, 0x5c, 0x57, + 0x4a, 0x4a, 0x53, 0x65, 0x70, 0x6c, 0x66, 0x65, 0x6a, 0x69, 0x64, 0x5d, + 0x5b, 0x5b, 0x52, 0x46, 0x4f, 0x50, 0x4c, 0x48, 0x41, 0x37, 0x47, 0x69, + 0x7b, 0x77, 0x6e, 0x70, 0x73, 0x60, 0x56, 0x66, 0x68, 0x49, 0x69, 0x51, + 0x57, 0x78, 0x85, 0x86, 0x7f, 0x7d, 0x75, 0x6f, 0x74, 0x7e, 0x7e, 0x77, + 0x82, 0x62, 0x5c, 0x5d, 0x75, 0x8a, 0x7e, 0x82, 0x7a, 0x70, 0x61, 0x5b, + 0x69, 0x7e, 0x82, 0x7a, 0x6c, 0x5c, 0x62, 0xaf, 0xcf, 0xa0, 0x83, 0x77, + 0x81, 0x90, 0x7c, 0x53, 0x74, 0x88, 0x69, 0x80, 0x7d, 0x96, 0x84, 0x65, + 0x6c, 0x7b, 0x80, 0x8a, 0xa4, 0x6f, 0x6b, 0x96, 0x76, 0x55, 0x6a, 0x51, + 0x87, 0x7d, 0x7f, 0x8a, 0x79, 0x49, 0x1f, 0x0f, 0x39, 0x7a, 0xce, 0xff, + 0xff, 0xff, 0xfa, 0xfe, 0xd3, 0xcc, 0xbf, 0x97, 0x5d, 0x64, 0x2e, 0x00, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xe8, 0xe6, 0xe3, 0xdf, 0xdb, 0xd6, 0xd3, + 0xd6, 0xbe, 0xbf, 0xc6, 0xe6, 0xec, 0xe8, 0xe1, 0xe9, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe6, 0xe5, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe4, 0xe6, 0xe2, 0xdd, 0xda, 0xdd, 0xe1, + 0xd3, 0xc1, 0xcc, 0xc2, 0xc4, 0xad, 0x82, 0xa0, 0xcf, 0xd2, 0xce, 0xd9, + 0xca, 0xd0, 0xdd, 0xdf, 0xd9, 0xda, 0xdc, 0xdd, 0xdd, 0xdc, 0xda, 0xd9, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, + 0xdb, 0xdb, 0xda, 0xda, 0xd9, 0xd9, 0xd8, 0xd8, 0xd7, 0xd6, 0xd6, 0xd5, + 0xd9, 0xd0, 0xda, 0xcc, 0xe8, 0xd6, 0x6a, 0x4f, 0x8c, 0x67, 0x49, 0x5f, + 0x58, 0x67, 0x6c, 0x7d, 0x44, 0x3e, 0x36, 0x3a, 0x4d, 0x61, 0x67, 0x62, + 0x53, 0x5a, 0x67, 0x72, 0x71, 0x69, 0x65, 0x67, 0x78, 0x82, 0x81, 0x72, + 0x66, 0x67, 0x6b, 0x6b, 0x79, 0x6d, 0x65, 0x67, 0x6b, 0x6c, 0x6f, 0x75, + 0x63, 0x65, 0x63, 0x5f, 0x61, 0x65, 0x5f, 0x55, 0x48, 0x46, 0x41, 0x43, + 0x43, 0x39, 0x40, 0x5a, 0x75, 0x6e, 0x6a, 0x6e, 0x69, 0x59, 0x59, 0x69, + 0x4e, 0x59, 0x66, 0x3c, 0x54, 0x75, 0x70, 0x61, 0x6c, 0x7a, 0x84, 0x83, + 0x80, 0x81, 0x80, 0x7d, 0x7c, 0x78, 0x70, 0x87, 0x85, 0x6a, 0x71, 0x74, + 0x70, 0x87, 0x93, 0x81, 0x68, 0x60, 0x68, 0x71, 0x6b, 0x71, 0x67, 0x73, + 0xd7, 0xd8, 0x6c, 0x70, 0x82, 0x68, 0x75, 0x79, 0x7c, 0x87, 0x87, 0x9b, + 0x65, 0x79, 0x87, 0x7c, 0x7b, 0x94, 0x8f, 0x65, 0x6e, 0x94, 0x76, 0x40, + 0x5d, 0x8c, 0x91, 0x97, 0x75, 0x49, 0x15, 0x10, 0x56, 0xbb, 0xfa, 0xff, + 0xff, 0xfc, 0xf8, 0xf6, 0xe9, 0xc2, 0x8b, 0x61, 0x51, 0x2f, 0x2d, 0x49, + 0x3f, 0x3e, 0x16, 0x13, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe6, 0xe5, 0xe6, + 0xe5, 0xde, 0xd2, 0xc8, 0xd7, 0xbc, 0xad, 0xc7, 0xf1, 0xe0, 0xe0, 0xee, + 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe0, 0xe5, 0xe9, 0xe5, + 0xdd, 0xda, 0xdd, 0xe3, 0xd9, 0xc5, 0xb9, 0xcc, 0xb5, 0xae, 0x86, 0x8d, + 0xdd, 0xd0, 0xce, 0xe2, 0xca, 0xce, 0xdc, 0xd7, 0xdb, 0xdc, 0xdd, 0xdf, + 0xdf, 0xde, 0xdc, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xde, 0xdd, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xd9, 0xd9, 0xd9, 0xd8, + 0xd8, 0xd7, 0xd7, 0xd7, 0xdd, 0xdb, 0xdb, 0xef, 0xa6, 0x63, 0x82, 0x6f, + 0x84, 0x5f, 0x7c, 0xa8, 0x99, 0x7d, 0x49, 0x50, 0x61, 0x49, 0x3d, 0x52, + 0x73, 0x82, 0x77, 0x67, 0x61, 0x6e, 0x7a, 0x7b, 0x76, 0x6f, 0x66, 0x5e, + 0x74, 0x79, 0x76, 0x68, 0x5e, 0x62, 0x6c, 0x71, 0x76, 0x6a, 0x62, 0x61, + 0x5c, 0x51, 0x49, 0x48, 0x5e, 0x61, 0x60, 0x5e, 0x60, 0x64, 0x60, 0x57, + 0x4b, 0x4a, 0x45, 0x44, 0x44, 0x3f, 0x4e, 0x6f, 0x77, 0x7c, 0x7d, 0x84, + 0x81, 0x62, 0x4e, 0x5b, 0x55, 0x5e, 0x4b, 0x33, 0x69, 0x7a, 0x7d, 0x8e, + 0x72, 0x7a, 0x7b, 0x75, 0x74, 0x7e, 0x89, 0x8e, 0x68, 0x73, 0x60, 0x5f, + 0x71, 0x88, 0x9a, 0x85, 0x85, 0x7a, 0x68, 0x61, 0x6f, 0x85, 0x8b, 0x83, + 0x77, 0x68, 0x6d, 0x63, 0xa5, 0xe7, 0xab, 0x7c, 0x64, 0x82, 0x85, 0x6f, + 0x7c, 0x7e, 0x6d, 0x85, 0x96, 0x77, 0x7c, 0x8d, 0x77, 0x65, 0x79, 0x91, + 0x9e, 0x8b, 0x82, 0x63, 0x58, 0x41, 0x10, 0x18, 0x90, 0xd0, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xf9, 0xe0, 0xb2, 0x71, 0x41, 0x33, 0x40, 0x57, 0x67, + 0x4c, 0x3d, 0x34, 0x50, 0x69, 0x71, 0x21, 0x00, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xe6, 0xe4, 0xe7, 0xe9, 0xe4, 0xd6, 0xcb, 0xd0, 0xd1, 0xb4, 0xb2, + 0xde, 0xdd, 0xe3, 0xe5, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe2, 0xe5, 0xe7, 0xe6, 0xe1, 0xde, 0xdf, 0xe0, 0xda, 0xbf, 0xa4, 0xcf, + 0x94, 0x8a, 0x7c, 0x8b, 0xc7, 0xbf, 0xc3, 0xde, 0xd2, 0xda, 0xe1, 0xd4, + 0xdc, 0xdd, 0xdf, 0xe0, 0xe1, 0xe0, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, + 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xd1, 0xed, 0xd4, + 0x6c, 0x54, 0x87, 0x87, 0x9a, 0x5f, 0x67, 0x7d, 0x71, 0x6b, 0x69, 0x8a, + 0x9e, 0x90, 0x7d, 0x6f, 0x6b, 0x6d, 0x70, 0x71, 0x6c, 0x72, 0x7a, 0x7a, + 0x73, 0x68, 0x61, 0x5e, 0x68, 0x6b, 0x6a, 0x61, 0x59, 0x5b, 0x66, 0x6f, + 0x6e, 0x6b, 0x70, 0x7c, 0x7f, 0x74, 0x67, 0x62, 0x6d, 0x71, 0x6f, 0x69, + 0x66, 0x66, 0x61, 0x59, 0x4b, 0x4d, 0x4f, 0x54, 0x54, 0x48, 0x4d, 0x65, + 0x76, 0x9b, 0x89, 0x64, 0x6f, 0x79, 0x63, 0x52, 0x57, 0x76, 0x59, 0x32, + 0x65, 0x76, 0x70, 0x60, 0x7d, 0x80, 0x80, 0x7d, 0x7d, 0x7a, 0x6c, 0x5c, + 0x7f, 0x7c, 0x87, 0x78, 0x72, 0x78, 0x69, 0x6d, 0x71, 0x80, 0x87, 0x7e, + 0x74, 0x73, 0x74, 0x73, 0x7b, 0x67, 0x6a, 0x77, 0x66, 0xa8, 0xf3, 0xaf, + 0x6a, 0x63, 0x6b, 0x6b, 0x72, 0x90, 0x8c, 0x67, 0x68, 0x69, 0x60, 0x6a, + 0x91, 0xa3, 0x7c, 0x4c, 0x31, 0x30, 0x1b, 0x27, 0x94, 0xee, 0xf5, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xd7, 0x91, 0x57, 0x3c, 0x31, 0x29, 0x25, 0x2e, + 0x41, 0x50, 0x54, 0x51, 0x3f, 0x64, 0x5e, 0x48, 0x48, 0x5e, 0x22, 0x06, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xed, 0xe8, 0xe4, 0xe6, 0xea, 0xe8, 0xdf, 0xd7, + 0xd7, 0xd7, 0xaf, 0xa5, 0xda, 0xe3, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe5, 0xe4, 0xe5, 0xe7, 0xe6, 0xe0, 0xdc, + 0xde, 0xd5, 0xae, 0xc5, 0x97, 0xbe, 0xba, 0x8e, 0xbb, 0xc0, 0xbc, 0xc9, + 0xc0, 0xd1, 0xe0, 0xdd, 0xdb, 0xdd, 0xdf, 0xe1, 0xe1, 0xe1, 0xe0, 0xdf, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xde, 0xde, + 0xdd, 0xdc, 0xdc, 0xdc, 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd2, 0xe9, 0xa8, 0x65, 0x74, 0x88, 0x79, 0x69, 0x77, 0x51, 0x69, 0x8f, + 0x90, 0x7f, 0x76, 0x6a, 0x74, 0x7b, 0x71, 0x58, 0x53, 0x6d, 0x8f, 0xa0, + 0x87, 0x7f, 0x7e, 0x82, 0x78, 0x66, 0x62, 0x6c, 0x68, 0x6b, 0x6e, 0x6b, + 0x64, 0x62, 0x6a, 0x75, 0x75, 0x6c, 0x68, 0x6d, 0x6d, 0x66, 0x60, 0x60, + 0x6b, 0x70, 0x6e, 0x66, 0x5f, 0x5d, 0x59, 0x51, 0x53, 0x4c, 0x44, 0x44, + 0x45, 0x3a, 0x3c, 0x51, 0x7c, 0x5d, 0x53, 0x66, 0x6c, 0x5b, 0x55, 0x5f, + 0x51, 0x60, 0x4e, 0x35, 0x64, 0x83, 0x92, 0x80, 0x6e, 0x70, 0x6f, 0x6e, + 0x77, 0x82, 0x82, 0x7a, 0x8c, 0x73, 0x69, 0x59, 0x69, 0x89, 0x89, 0x90, + 0x82, 0x75, 0x63, 0x5c, 0x6b, 0x82, 0x88, 0x81, 0x7a, 0x93, 0x6c, 0x73, + 0x61, 0x5c, 0xb7, 0xc7, 0x8e, 0x69, 0x67, 0x7e, 0x72, 0x66, 0x83, 0x9c, + 0x73, 0x79, 0x92, 0x9c, 0x6f, 0x34, 0x36, 0x60, 0xb6, 0xe3, 0xfc, 0xfe, + 0xf1, 0xfb, 0xff, 0xe6, 0xaf, 0x73, 0x43, 0x3b, 0x34, 0x1f, 0x1a, 0x28, + 0x31, 0x30, 0x31, 0x36, 0x41, 0x4f, 0x5c, 0x63, 0x47, 0x3f, 0x27, 0x31, + 0x4c, 0x5c, 0x17, 0x02, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xef, 0xea, 0xe6, 0xe6, + 0xe8, 0xe8, 0xe4, 0xe0, 0xdf, 0xc6, 0x9f, 0xa1, 0xdc, 0xe2, 0xe6, 0xf1, + 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe5, 0xe3, 0xe6, + 0xeb, 0xea, 0xe2, 0xd9, 0xcc, 0xc9, 0xba, 0xcd, 0x9e, 0xb0, 0xc1, 0x9c, + 0xbc, 0xcb, 0xc8, 0xcb, 0xba, 0xca, 0xe0, 0xe4, 0xda, 0xdc, 0xde, 0xe0, + 0xe1, 0xe1, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xdd, 0xdd, 0xdc, 0xdb, 0xdb, 0xdb, 0xdc, + 0xdc, 0xdd, 0xdd, 0xdd, 0xec, 0xd7, 0x73, 0x5d, 0x7a, 0x85, 0x96, 0x75, + 0x8a, 0x60, 0x6c, 0x76, 0x72, 0x6e, 0x82, 0x78, 0x79, 0x83, 0x7f, 0x70, + 0x76, 0x92, 0xa2, 0x9f, 0x80, 0x72, 0x6f, 0x74, 0x69, 0x55, 0x54, 0x64, + 0x6b, 0x6b, 0x6e, 0x6e, 0x68, 0x62, 0x6a, 0x77, 0x6d, 0x63, 0x5e, 0x64, + 0x67, 0x65, 0x65, 0x68, 0x6b, 0x72, 0x73, 0x6c, 0x66, 0x65, 0x63, 0x5e, + 0x5f, 0x5e, 0x55, 0x4a, 0x3e, 0x38, 0x53, 0x7e, 0x80, 0x68, 0x74, 0x78, + 0x64, 0x74, 0x7b, 0x50, 0x5a, 0x50, 0x5d, 0x5f, 0x76, 0x70, 0x69, 0x5b, + 0x83, 0x8a, 0x88, 0x7b, 0x71, 0x70, 0x71, 0x70, 0x54, 0x82, 0x8b, 0x83, + 0x6d, 0x63, 0x70, 0x64, 0x5d, 0x74, 0x88, 0x8a, 0x82, 0x79, 0x6b, 0x5e, + 0x61, 0x80, 0x60, 0x64, 0x7f, 0x5b, 0x6c, 0xc1, 0xe5, 0xa9, 0x52, 0x55, + 0x7d, 0x6c, 0x64, 0x7c, 0x86, 0x70, 0x73, 0x72, 0x7d, 0xca, 0xff, 0xf4, + 0xff, 0xfd, 0xff, 0xe6, 0x89, 0x76, 0x8c, 0x39, 0x17, 0x11, 0x18, 0x28, + 0x2a, 0x24, 0x33, 0x4d, 0x58, 0x64, 0x70, 0x6e, 0x5f, 0x4d, 0x43, 0x40, + 0x5a, 0x52, 0x4d, 0x60, 0x62, 0x5e, 0x1e, 0x10, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xed, 0xeb, 0xe9, 0xe7, 0xe5, 0xe4, 0xe1, 0xe0, 0xd8, 0xd2, 0xb9, 0x9d, + 0xc8, 0xe5, 0xe3, 0xdc, 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe6, 0xe6, 0xe9, 0xec, 0xe9, 0xe2, 0xdb, 0xcf, 0xce, 0xcd, 0xc1, + 0xa0, 0xa7, 0xba, 0x7e, 0xa9, 0xb3, 0xc4, 0xde, 0xcd, 0xd9, 0xe8, 0xdf, + 0xd8, 0xda, 0xdc, 0xdf, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xdd, 0xdd, + 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xde, 0xde, 0xdf, 0xb7, 0x5c, 0x77, 0x7f, + 0x63, 0x71, 0x6e, 0x77, 0x84, 0x4b, 0x6c, 0x6a, 0x6c, 0x79, 0x8f, 0x94, + 0x7e, 0x7a, 0x6d, 0x60, 0x64, 0x72, 0x77, 0x71, 0x6e, 0x6b, 0x6e, 0x74, + 0x70, 0x67, 0x69, 0x73, 0x6e, 0x69, 0x67, 0x66, 0x5e, 0x59, 0x65, 0x77, + 0x7c, 0x73, 0x71, 0x75, 0x73, 0x68, 0x5e, 0x5b, 0x62, 0x6b, 0x6e, 0x66, + 0x60, 0x60, 0x60, 0x5d, 0x49, 0x53, 0x57, 0x52, 0x43, 0x35, 0x48, 0x70, + 0x89, 0x6d, 0x73, 0x77, 0x5a, 0x56, 0x63, 0x58, 0x54, 0x50, 0x66, 0x51, + 0x6a, 0x83, 0x84, 0x7f, 0x74, 0x78, 0x73, 0x69, 0x69, 0x79, 0x8c, 0x95, + 0x80, 0x78, 0x65, 0x6d, 0x63, 0x52, 0x72, 0x8a, 0x8a, 0x8b, 0x7e, 0x66, + 0x5b, 0x68, 0x7d, 0x8a, 0x85, 0x71, 0x70, 0x76, 0x87, 0x69, 0x41, 0x6f, + 0xd7, 0xcb, 0x8d, 0x5f, 0x56, 0x6f, 0x87, 0x67, 0x7d, 0x87, 0x9b, 0x85, + 0x71, 0xb2, 0xdf, 0xb4, 0x69, 0x39, 0x10, 0x1c, 0x1b, 0x01, 0x39, 0xa4, + 0x58, 0x3e, 0x30, 0x42, 0x5c, 0x68, 0x6a, 0x6c, 0x6f, 0x63, 0x57, 0x58, + 0x62, 0x67, 0x61, 0x59, 0x61, 0x51, 0x49, 0x50, 0x50, 0x6a, 0x31, 0x03, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xec, 0xeb, 0xe8, 0xe3, 0xdf, 0xdc, 0xdb, + 0xd0, 0xd6, 0xd2, 0xad, 0xc7, 0xe5, 0xe8, 0xe6, 0xe7, 0xe8, 0xe8, 0xe9, + 0xea, 0xeb, 0xeb, 0xec, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe5, 0xe7, 0xea, 0xeb, 0xeb, 0xe7, 0xe2, 0xde, + 0xd4, 0xcc, 0xdf, 0xd1, 0xb4, 0xa0, 0xc2, 0xa0, 0xb3, 0x9f, 0xab, 0xd1, + 0xc2, 0xd5, 0xeb, 0xd9, 0xd7, 0xd9, 0xdb, 0xde, 0xdf, 0xe0, 0xdf, 0xdf, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, + 0xde, 0xde, 0xdd, 0xdd, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xdf, 0xdf, + 0x70, 0x5c, 0x68, 0x85, 0x8f, 0x7f, 0x70, 0x78, 0xab, 0x55, 0x84, 0x80, + 0x8a, 0x8f, 0x73, 0x65, 0x77, 0x74, 0x70, 0x6a, 0x64, 0x63, 0x6c, 0x76, + 0x6d, 0x75, 0x79, 0x76, 0x6f, 0x6a, 0x66, 0x63, 0x76, 0x6d, 0x66, 0x62, + 0x5a, 0x56, 0x66, 0x7c, 0x71, 0x68, 0x65, 0x6a, 0x6a, 0x61, 0x59, 0x58, + 0x66, 0x6f, 0x72, 0x69, 0x61, 0x60, 0x5f, 0x5c, 0x69, 0x5d, 0x50, 0x50, + 0x53, 0x45, 0x3f, 0x4c, 0x72, 0x77, 0x7c, 0x84, 0x7b, 0x59, 0x4f, 0x6b, + 0x60, 0x45, 0x58, 0x48, 0x5f, 0x66, 0x61, 0x81, 0x74, 0x7b, 0x7e, 0x7e, + 0x7e, 0x7a, 0x69, 0x56, 0x6d, 0x73, 0x92, 0x94, 0x8a, 0x7f, 0x69, 0x71, + 0x6e, 0x75, 0x7b, 0x80, 0x89, 0x8e, 0x81, 0x6f, 0x7c, 0x55, 0x66, 0x7f, + 0x92, 0x8b, 0x62, 0x61, 0xa2, 0xfd, 0xcd, 0x74, 0x67, 0x7a, 0x8b, 0x82, + 0x87, 0x70, 0x73, 0x80, 0x77, 0x6d, 0x69, 0x60, 0x60, 0x55, 0x4a, 0x32, + 0x37, 0x39, 0x3b, 0x77, 0x74, 0x67, 0x6b, 0x7c, 0x7b, 0x65, 0x59, 0x5e, + 0x78, 0x8b, 0x9d, 0x9c, 0x84, 0x66, 0x51, 0x48, 0x38, 0x3f, 0x5e, 0x6e, + 0x4f, 0x55, 0x28, 0x04, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xe9, 0xe9, 0xea, 0xea, + 0xe9, 0xe6, 0xe4, 0xe2, 0xe4, 0xdd, 0xda, 0x9a, 0xa0, 0xc9, 0xec, 0xe3, + 0xe2, 0xe5, 0xe8, 0xeb, 0xed, 0xec, 0xeb, 0xea, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xed, 0xe7, 0xe9, 0xec, + 0xe7, 0xe4, 0xe2, 0xdc, 0xe3, 0xa5, 0xb2, 0xb9, 0x8a, 0x83, 0xb6, 0xa5, + 0xbf, 0xa8, 0xad, 0xb6, 0xbd, 0xdc, 0xe0, 0xdb, 0xd7, 0xe2, 0xe2, 0xe3, + 0xed, 0xe8, 0xdf, 0xe4, 0xdc, 0xdd, 0xe0, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe1, 0xd8, 0xdf, + 0xe1, 0xea, 0xc3, 0x41, 0x46, 0x79, 0x8d, 0x7c, 0x71, 0x94, 0x8d, 0x95, + 0x88, 0x57, 0x82, 0x8d, 0x6c, 0x7a, 0x71, 0x4c, 0x6d, 0x6c, 0x6a, 0x66, + 0x67, 0x70, 0x7d, 0x86, 0x68, 0x6f, 0x74, 0x6e, 0x65, 0x62, 0x69, 0x72, + 0x7a, 0x6f, 0x67, 0x6d, 0x7e, 0x89, 0x89, 0x84, 0x7a, 0x72, 0x71, 0x77, + 0x77, 0x69, 0x5b, 0x54, 0x64, 0x68, 0x6a, 0x68, 0x65, 0x5f, 0x54, 0x4a, + 0x53, 0x56, 0x56, 0x4b, 0x3b, 0x3b, 0x58, 0x78, 0x83, 0x79, 0x69, 0x6e, + 0x7a, 0x67, 0x55, 0x5f, 0x5c, 0x58, 0x64, 0x50, 0x59, 0x7f, 0x7f, 0x8a, + 0x6f, 0x6c, 0x75, 0x75, 0x70, 0x82, 0x8d, 0x7a, 0x93, 0x7c, 0x7a, 0x68, + 0x6a, 0x7a, 0x72, 0x7d, 0x82, 0x7c, 0x77, 0x65, 0x68, 0x63, 0x82, 0x7f, + 0x69, 0x65, 0x81, 0x4b, 0x31, 0x10, 0x16, 0x2f, 0x47, 0xa0, 0xef, 0xac, + 0x5a, 0x65, 0x6d, 0x67, 0x8d, 0x8a, 0x8c, 0x7b, 0x7e, 0x7e, 0x6e, 0x90, + 0x84, 0x8e, 0x9c, 0x88, 0x6e, 0x67, 0x5a, 0x4f, 0x59, 0x63, 0x5a, 0x49, + 0x76, 0xa5, 0xaa, 0x8d, 0x65, 0x3b, 0x23, 0x33, 0x43, 0x3d, 0x36, 0x3b, + 0x4e, 0x4f, 0x4e, 0x3e, 0x47, 0x45, 0x1a, 0x0b, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xe9, 0xea, 0xea, 0xea, 0xe9, 0xe7, 0xe4, 0xe3, 0xda, 0xdc, 0xd3, 0x80, + 0x8f, 0xd1, 0xdd, 0xed, 0xe3, 0xe5, 0xe8, 0xeb, 0xec, 0xec, 0xeb, 0xea, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xe7, 0xe9, 0xeb, 0xe7, 0xe7, 0xe1, 0xd5, 0xea, 0xcc, 0xc0, 0xc7, + 0x96, 0x8f, 0xdb, 0xa7, 0xc0, 0xc1, 0x96, 0xa9, 0xda, 0xda, 0xe7, 0xe3, + 0xdf, 0xe1, 0xde, 0xdb, 0xde, 0xde, 0xdc, 0xe0, 0xdf, 0xe0, 0xe1, 0xe3, + 0xe3, 0xe3, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xd8, 0xdc, 0xd4, 0xd9, 0xf3, 0xcc, 0x78, 0x64, 0x7d, 0x91, 0x91, 0x85, + 0x77, 0x85, 0x73, 0x7f, 0x71, 0x49, 0x68, 0x85, 0x8f, 0x97, 0x88, 0x8f, + 0x85, 0x7b, 0x6b, 0x60, 0x66, 0x74, 0x78, 0x73, 0x78, 0x79, 0x78, 0x74, + 0x6f, 0x6d, 0x6e, 0x70, 0x5f, 0x64, 0x6d, 0x76, 0x79, 0x73, 0x65, 0x59, + 0x76, 0x73, 0x75, 0x77, 0x6f, 0x5e, 0x53, 0x53, 0x5a, 0x59, 0x57, 0x53, + 0x4d, 0x4a, 0x4f, 0x56, 0x55, 0x4d, 0x47, 0x43, 0x40, 0x43, 0x52, 0x63, + 0x77, 0x80, 0x81, 0x7d, 0x70, 0x50, 0x40, 0x50, 0x69, 0x58, 0x54, 0x37, + 0x43, 0x70, 0x75, 0x80, 0x7d, 0x7e, 0x84, 0x85, 0x7f, 0x7e, 0x79, 0x6c, + 0x72, 0x70, 0x81, 0x7b, 0x7c, 0x7f, 0x65, 0x5e, 0x6b, 0x71, 0x8f, 0x70, + 0x78, 0x6c, 0x4d, 0x4f, 0x23, 0x4d, 0xa1, 0xb5, 0xf1, 0xff, 0xf4, 0xc2, + 0x88, 0x59, 0x9f, 0xd6, 0xa5, 0x78, 0x77, 0x8f, 0x65, 0x7c, 0x7d, 0x65, + 0x73, 0x8c, 0x87, 0x87, 0x96, 0x83, 0x74, 0x6a, 0x6e, 0x79, 0x72, 0x66, + 0x69, 0x6e, 0x78, 0x91, 0x5c, 0x18, 0x1c, 0x3d, 0x23, 0x2c, 0x45, 0x5d, + 0x5a, 0x48, 0x46, 0x54, 0x67, 0x5c, 0x52, 0x48, 0x5e, 0x5d, 0x22, 0x02, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xea, 0xea, 0xeb, 0xeb, 0xe9, 0xe7, 0xe5, 0xe3, + 0xe1, 0xc7, 0xd7, 0x94, 0x84, 0xe8, 0xe5, 0xd9, 0xe5, 0xe6, 0xe8, 0xea, + 0xeb, 0xeb, 0xeb, 0xea, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xe8, 0xea, 0xe9, 0xe8, 0xeb, 0xe0, 0xca, + 0xe5, 0xd4, 0xbf, 0xdd, 0xb5, 0x7b, 0xbe, 0xae, 0xaf, 0xb1, 0x81, 0x9c, + 0xe5, 0xca, 0xd5, 0xd9, 0xd9, 0xd7, 0xdb, 0xdd, 0xda, 0xd9, 0xda, 0xd5, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xd5, 0xcf, 0xfd, 0xc7, 0x59, 0x63, 0x90, + 0x8b, 0x79, 0x6c, 0x7d, 0x8b, 0x95, 0x72, 0x77, 0x70, 0x77, 0x9c, 0x97, + 0x89, 0x7e, 0x61, 0x6c, 0x74, 0x80, 0x84, 0x7a, 0x6e, 0x6c, 0x6d, 0x6c, + 0x66, 0x64, 0x63, 0x65, 0x69, 0x6c, 0x6b, 0x69, 0x5b, 0x63, 0x6c, 0x6f, + 0x6a, 0x62, 0x5c, 0x59, 0x66, 0x67, 0x6c, 0x6e, 0x64, 0x58, 0x57, 0x5f, + 0x63, 0x5b, 0x5e, 0x6c, 0x71, 0x64, 0x56, 0x52, 0x58, 0x49, 0x3c, 0x3a, + 0x3f, 0x4c, 0x62, 0x75, 0x8b, 0x7d, 0x69, 0x67, 0x70, 0x66, 0x52, 0x4b, + 0x5a, 0x51, 0x5c, 0x4e, 0x61, 0x87, 0x7c, 0x7a, 0x7f, 0x77, 0x6a, 0x69, + 0x74, 0x78, 0x7b, 0x85, 0x7a, 0x7c, 0x7f, 0x68, 0x61, 0x72, 0x7a, 0x85, + 0x7a, 0x7b, 0x57, 0x53, 0x60, 0x5f, 0xb4, 0xc7, 0xdc, 0xfc, 0xf2, 0xd0, + 0xfb, 0xe3, 0xc3, 0xeb, 0xff, 0x89, 0x7e, 0xce, 0xdb, 0x88, 0x3c, 0x3b, + 0x57, 0x54, 0x5a, 0x84, 0x92, 0x70, 0x68, 0x7b, 0x5c, 0x84, 0x97, 0x87, + 0x75, 0x74, 0x74, 0x6d, 0x94, 0xb2, 0xa7, 0xbe, 0x60, 0x2d, 0x4c, 0x5f, + 0x68, 0x60, 0x58, 0x51, 0x47, 0x3c, 0x36, 0x37, 0x4f, 0x4b, 0x4b, 0x49, + 0x61, 0x60, 0x24, 0x04, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xea, 0xeb, 0xeb, 0xeb, + 0xea, 0xe8, 0xe5, 0xe4, 0xef, 0xd8, 0xdd, 0xa7, 0x8b, 0xef, 0xe9, 0xe9, + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xea, 0xe8, + 0xe9, 0xee, 0xe0, 0xc4, 0xe9, 0xe1, 0xbb, 0xc7, 0xbe, 0x78, 0x98, 0xb9, + 0x81, 0x8e, 0xa3, 0xa4, 0xda, 0xd7, 0xe1, 0xe6, 0xca, 0xc6, 0xd3, 0xdd, + 0xda, 0xe0, 0xe6, 0xdf, 0xe4, 0xe5, 0xe6, 0xe6, 0xe5, 0xe4, 0xe2, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xdf, 0xdd, 0xf6, 0xcb, + 0x71, 0x64, 0x80, 0x7e, 0x90, 0x87, 0x80, 0x87, 0x82, 0x86, 0x7a, 0x9b, + 0x7a, 0x6d, 0x7e, 0x6c, 0x67, 0x80, 0x78, 0x79, 0x93, 0x81, 0x6d, 0x64, + 0x66, 0x6e, 0x7b, 0x86, 0x7c, 0x7c, 0x7c, 0x7a, 0x78, 0x74, 0x71, 0x6f, + 0x79, 0x79, 0x78, 0x74, 0x6e, 0x6b, 0x6b, 0x6d, 0x7d, 0x76, 0x70, 0x6b, + 0x61, 0x56, 0x58, 0x60, 0x6b, 0x5f, 0x5a, 0x5a, 0x4f, 0x42, 0x4c, 0x62, + 0x4e, 0x4e, 0x4f, 0x4d, 0x45, 0x45, 0x58, 0x6e, 0x83, 0x85, 0x81, 0x7a, + 0x74, 0x67, 0x53, 0x46, 0x52, 0x49, 0x51, 0x3b, 0x46, 0x6b, 0x65, 0x6a, + 0x74, 0x81, 0x83, 0x87, 0x89, 0x74, 0x6b, 0x80, 0x66, 0x7b, 0x8a, 0x7f, + 0x70, 0x64, 0x4d, 0x3a, 0x31, 0x50, 0x9e, 0xa5, 0xed, 0xff, 0xdd, 0xe5, + 0xf4, 0xa7, 0x7b, 0x65, 0x40, 0x11, 0x12, 0x2c, 0x5a, 0x70, 0x58, 0x5b, + 0xab, 0xd3, 0xcd, 0xe8, 0x9c, 0x8f, 0x59, 0x40, 0x39, 0x42, 0x72, 0x86, + 0x97, 0x94, 0x7a, 0x7e, 0x9a, 0xad, 0xb7, 0xb2, 0xb9, 0xc2, 0xa7, 0xf4, + 0x90, 0x45, 0x57, 0x5a, 0x4c, 0x3f, 0x32, 0x33, 0x43, 0x4c, 0x42, 0x32, + 0x35, 0x49, 0x5e, 0x57, 0x59, 0x4c, 0x1c, 0x0d, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xec, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe7, 0xd7, 0xe1, 0xcf, + 0x9c, 0xe4, 0xef, 0xed, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xeb, 0xe8, 0xe9, 0xef, 0xe2, 0xc5, 0xc1, 0xe4, 0xc1, 0xb0, + 0xc0, 0x95, 0x95, 0xa3, 0xab, 0xb3, 0xd4, 0xa7, 0xc2, 0xdf, 0xe2, 0xd1, + 0xda, 0xd1, 0xd6, 0xd9, 0xd4, 0xdc, 0xe7, 0xe3, 0xe3, 0xe4, 0xe5, 0xe6, + 0xe5, 0xe4, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xdf, 0xff, 0xd6, 0x62, 0x4a, 0x8b, 0x9b, 0x86, 0x71, 0x81, 0x8e, 0x96, + 0x87, 0x80, 0x65, 0x79, 0x63, 0x55, 0x74, 0x81, 0x89, 0x8c, 0x6f, 0x73, + 0x7f, 0x71, 0x72, 0x82, 0x84, 0x74, 0x6e, 0x75, 0x63, 0x6d, 0x76, 0x78, + 0x73, 0x71, 0x75, 0x7b, 0x78, 0x7b, 0x81, 0x88, 0x8d, 0x8d, 0x87, 0x82, + 0x7f, 0x70, 0x65, 0x65, 0x68, 0x69, 0x6e, 0x75, 0x73, 0x5c, 0x50, 0x58, + 0x5c, 0x53, 0x50, 0x56, 0x48, 0x48, 0x47, 0x40, 0x37, 0x40, 0x63, 0x87, + 0x79, 0x7a, 0x78, 0x75, 0x78, 0x79, 0x65, 0x48, 0x38, 0x3f, 0x57, 0x48, + 0x50, 0x73, 0x73, 0x7f, 0x73, 0x71, 0x64, 0x66, 0x75, 0x71, 0x73, 0x8d, + 0x85, 0x5f, 0x2a, 0x1c, 0x47, 0x8f, 0xcc, 0xe2, 0xf7, 0xff, 0xac, 0xb9, + 0xf3, 0x8f, 0x53, 0x3c, 0x37, 0x3e, 0x28, 0x3b, 0x54, 0x36, 0x14, 0x27, + 0x4b, 0x3a, 0x27, 0x5b, 0xb1, 0xc1, 0xa7, 0xa0, 0xad, 0xcd, 0xe2, 0xf8, + 0xd5, 0x8d, 0x69, 0x45, 0x23, 0x3a, 0x53, 0x9e, 0xcd, 0xb7, 0xb0, 0xb6, + 0x9c, 0xa2, 0x94, 0xff, 0xb4, 0x4d, 0x5a, 0x63, 0x59, 0x5c, 0x58, 0x4c, + 0x40, 0x39, 0x35, 0x31, 0x4d, 0x6a, 0x84, 0x72, 0x60, 0x46, 0x17, 0x10, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xec, 0xec, 0xec, 0xeb, 0xe9, 0xe6, 0xe5, + 0xeb, 0xc3, 0xba, 0xba, 0x86, 0xc4, 0xe9, 0xe1, 0xea, 0xe9, 0xe8, 0xe7, + 0xe7, 0xe8, 0xea, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe8, 0xea, 0xea, 0xea, 0xee, 0xe4, 0xcf, + 0xcd, 0xeb, 0xc9, 0xb3, 0xb2, 0x7b, 0x88, 0xae, 0x81, 0x8d, 0xb1, 0xad, + 0xca, 0xd6, 0xdd, 0xdc, 0xe3, 0xdf, 0xde, 0xdd, 0xd9, 0xdb, 0xdf, 0xdd, + 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xf3, 0xc8, 0x7f, 0x6d, 0x7b, 0x7e, 0x88, 0x87, + 0x92, 0x8c, 0x7c, 0x78, 0x79, 0x8f, 0x80, 0x91, 0x74, 0x7e, 0x8c, 0x7a, + 0x80, 0x82, 0x66, 0x7a, 0x86, 0x7d, 0x7e, 0x81, 0x75, 0x63, 0x67, 0x79, + 0x69, 0x75, 0x7f, 0x7d, 0x71, 0x6a, 0x6c, 0x71, 0x7a, 0x7c, 0x82, 0x8a, + 0x90, 0x90, 0x8a, 0x85, 0x81, 0x71, 0x64, 0x64, 0x66, 0x63, 0x61, 0x62, + 0x4e, 0x54, 0x64, 0x72, 0x6b, 0x58, 0x50, 0x54, 0x40, 0x40, 0x40, 0x3e, + 0x37, 0x38, 0x4b, 0x62, 0x81, 0x87, 0x86, 0x72, 0x62, 0x65, 0x5b, 0x3e, + 0x42, 0x48, 0x5c, 0x43, 0x41, 0x60, 0x65, 0x76, 0x75, 0x85, 0x90, 0x8d, + 0x78, 0x4e, 0x2b, 0x22, 0x59, 0xa1, 0xe8, 0xff, 0xff, 0xe1, 0xde, 0xdf, + 0xe3, 0x81, 0x5e, 0x34, 0x40, 0x2e, 0x13, 0x3b, 0x26, 0x31, 0x50, 0x74, + 0x3d, 0x2b, 0x2e, 0x17, 0x41, 0x3e, 0x3e, 0x31, 0x36, 0x98, 0xd1, 0x80, + 0x1d, 0x3b, 0x60, 0x86, 0xa0, 0xc2, 0xe8, 0xe8, 0xd5, 0xbb, 0x6d, 0x73, + 0xa9, 0xb7, 0xba, 0xa7, 0xae, 0xbf, 0xa6, 0xf3, 0xb0, 0x5d, 0x67, 0x59, + 0x70, 0x6a, 0x5d, 0x48, 0x33, 0x2d, 0x3e, 0x54, 0x5a, 0x6d, 0x7e, 0x6f, + 0x68, 0x53, 0x1f, 0x0f, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, + 0xeb, 0xe9, 0xe7, 0xe5, 0xeb, 0xe4, 0xc4, 0xb8, 0xaf, 0xcb, 0xce, 0xe5, + 0xec, 0xea, 0xe8, 0xe7, 0xe6, 0xe8, 0xea, 0xeb, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xe7, 0xea, 0xed, + 0xeb, 0xeb, 0xe7, 0xdb, 0xc3, 0xce, 0xcc, 0xc4, 0xc7, 0x83, 0x7f, 0xd7, + 0xb2, 0x7f, 0x74, 0x9c, 0xca, 0xd0, 0xcc, 0xd1, 0xd6, 0xdb, 0xdc, 0xdd, + 0xe3, 0xe4, 0xe2, 0xe5, 0xdb, 0xdd, 0xdf, 0xe2, 0xe4, 0xe5, 0xe4, 0xe4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0x6c, 0x5f, 0x76, + 0x86, 0x92, 0x7a, 0x82, 0x85, 0x8a, 0x84, 0x7b, 0x6c, 0x76, 0x6f, 0x8e, + 0x62, 0x6b, 0x78, 0x61, 0x73, 0x98, 0x89, 0x8b, 0x96, 0x89, 0x77, 0x6c, + 0x6c, 0x6f, 0x6c, 0x66, 0x5c, 0x65, 0x6f, 0x73, 0x70, 0x6d, 0x6d, 0x6f, + 0x87, 0x86, 0x82, 0x7a, 0x73, 0x71, 0x75, 0x7a, 0x6f, 0x6c, 0x6f, 0x78, + 0x79, 0x71, 0x6b, 0x6c, 0x6d, 0x63, 0x59, 0x57, 0x5b, 0x60, 0x63, 0x66, + 0x59, 0x51, 0x49, 0x45, 0x44, 0x4d, 0x66, 0x7e, 0x79, 0x74, 0x72, 0x70, + 0x78, 0x88, 0x6a, 0x2b, 0x30, 0x3e, 0x5e, 0x52, 0x53, 0x69, 0x5c, 0x60, + 0x8a, 0x5a, 0x36, 0x46, 0x86, 0xd2, 0xf9, 0xf7, 0xf8, 0xff, 0xff, 0xff, + 0xd6, 0x83, 0x4e, 0x2a, 0x1f, 0x31, 0x44, 0x47, 0x4e, 0x66, 0x94, 0x53, + 0x20, 0x46, 0x3b, 0x65, 0x61, 0x42, 0x2d, 0x45, 0x58, 0x51, 0x46, 0x2c, + 0x18, 0x74, 0xe0, 0xc4, 0x7c, 0x26, 0x18, 0x3e, 0x39, 0x1e, 0x2f, 0x66, + 0x8b, 0xd7, 0xd3, 0xcf, 0xc7, 0xa7, 0xb0, 0xaf, 0xaf, 0xa6, 0x92, 0xdd, + 0xb7, 0x43, 0x3a, 0x39, 0x42, 0x35, 0x31, 0x38, 0x38, 0x33, 0x3f, 0x54, + 0x50, 0x58, 0x62, 0x5a, 0x62, 0x57, 0x22, 0x0c, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xed, 0xed, 0xed, 0xec, 0xe9, 0xe7, 0xe5, 0xed, 0xf4, 0xe3, 0xc4, + 0xad, 0xba, 0xc0, 0xe9, 0xed, 0xeb, 0xe8, 0xe6, 0xe6, 0xe7, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xe6, 0xea, 0xef, 0xeb, 0xe9, 0xe9, 0xe4, 0xc8, 0xcc, 0xce, 0x9d, + 0xb9, 0x9b, 0x68, 0xc8, 0xb5, 0x98, 0xb1, 0xd3, 0xd1, 0xcd, 0xca, 0xdd, + 0xe2, 0xe6, 0xdc, 0xd6, 0xde, 0xdd, 0xdc, 0xe6, 0xd8, 0xda, 0xdd, 0xe1, + 0xe3, 0xe5, 0xe5, 0xe5, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0x68, 0x64, 0x6c, 0x7a, 0x8d, 0x94, 0x88, 0x82, 0x7f, 0x82, 0x83, 0x88, + 0x7d, 0x7e, 0x6c, 0x88, 0x62, 0x5c, 0x88, 0x80, 0x62, 0x6c, 0x6b, 0x6e, + 0x79, 0x8a, 0x8a, 0x75, 0x6b, 0x71, 0x6c, 0x5b, 0x5b, 0x5e, 0x63, 0x69, + 0x6b, 0x68, 0x62, 0x5d, 0x65, 0x6d, 0x72, 0x6e, 0x68, 0x6c, 0x7c, 0x8c, + 0x7c, 0x84, 0x94, 0x9f, 0x98, 0x86, 0x7b, 0x7b, 0x6a, 0x68, 0x62, 0x59, + 0x55, 0x58, 0x5d, 0x5e, 0x53, 0x50, 0x4c, 0x48, 0x42, 0x45, 0x5b, 0x72, + 0x71, 0x7b, 0x82, 0x75, 0x6d, 0x7f, 0x75, 0x48, 0x4f, 0x4e, 0x5d, 0x46, + 0x49, 0x64, 0x5a, 0x5d, 0x7b, 0x98, 0xcf, 0xf6, 0xff, 0xff, 0xf3, 0xcd, + 0xbe, 0x7c, 0x26, 0x18, 0x1e, 0x23, 0x49, 0x5b, 0x2d, 0x3d, 0x54, 0x59, + 0x8a, 0x7a, 0x4a, 0x2e, 0x20, 0x48, 0x37, 0x61, 0x5f, 0x4f, 0x3e, 0x49, + 0x54, 0x53, 0x2a, 0x2f, 0x49, 0x5a, 0x95, 0xc3, 0xc8, 0x5a, 0x33, 0x33, + 0x28, 0x1f, 0x22, 0x48, 0x3f, 0x2f, 0x03, 0x57, 0xbb, 0xbc, 0xc0, 0xbe, + 0xb4, 0xa5, 0x9c, 0xdc, 0xb9, 0x29, 0x1d, 0x34, 0x42, 0x37, 0x3c, 0x4c, + 0x47, 0x36, 0x3e, 0x58, 0x55, 0x5b, 0x62, 0x55, 0x5a, 0x4f, 0x1b, 0x06, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xe9, 0xe6, 0xea, 0xef, 0xe9, 0xdd, + 0xd7, 0xf0, 0xeb, 0xc4, 0xb3, 0xb8, 0xba, 0xde, 0xf4, 0xeb, 0xd9, 0xf5, + 0xe8, 0xe8, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xeb, 0xe9, 0xe9, 0xec, 0xf0, + 0xcd, 0xbc, 0xe0, 0xba, 0x9c, 0x95, 0x90, 0xaa, 0xad, 0xa6, 0xa7, 0xcb, + 0xd2, 0xb8, 0xc5, 0xe2, 0xd2, 0xc9, 0xd0, 0xd8, 0xd9, 0xe4, 0xe7, 0xd5, + 0xd9, 0xe8, 0xdd, 0xe0, 0xe6, 0xe2, 0xe6, 0xdd, 0xe1, 0xdf, 0xe1, 0xe8, + 0xd2, 0xf7, 0xe4, 0x67, 0x64, 0x8e, 0x93, 0x90, 0x91, 0x83, 0x84, 0x93, + 0x9f, 0x8b, 0x69, 0x62, 0x7c, 0x86, 0x7a, 0x76, 0x4a, 0x67, 0x7b, 0x84, + 0x85, 0x75, 0x69, 0x6f, 0x82, 0x82, 0x7b, 0x6d, 0x65, 0x69, 0x74, 0x7d, + 0x74, 0x6e, 0x6f, 0x76, 0x73, 0x65, 0x5d, 0x5f, 0x60, 0x62, 0x63, 0x65, + 0x6b, 0x7a, 0x8d, 0x9b, 0x90, 0x76, 0x66, 0x6f, 0x7b, 0x77, 0x6a, 0x63, + 0x57, 0x58, 0x4d, 0x3e, 0x3f, 0x50, 0x5c, 0x5d, 0x42, 0x47, 0x46, 0x3d, + 0x3e, 0x53, 0x73, 0x8a, 0x89, 0x64, 0x69, 0x60, 0x68, 0x7f, 0x61, 0x4c, + 0x54, 0x61, 0x55, 0x2b, 0x4b, 0x57, 0x55, 0xcd, 0xff, 0xf3, 0xf6, 0xed, + 0x84, 0x3b, 0x43, 0x1b, 0x24, 0x31, 0x2e, 0x2f, 0x2e, 0x2f, 0x28, 0x48, + 0x62, 0x3e, 0x5f, 0x71, 0x5f, 0x5d, 0x4a, 0x32, 0x48, 0x51, 0x5e, 0x6e, + 0x6e, 0x52, 0x44, 0x55, 0x58, 0x41, 0x2f, 0x52, 0x67, 0x30, 0x30, 0x8f, + 0xe3, 0xe3, 0x5c, 0x12, 0x22, 0x2b, 0x3c, 0x2a, 0x15, 0x0c, 0x07, 0x39, + 0xbe, 0xce, 0xba, 0xbc, 0xab, 0xab, 0x9d, 0xe8, 0xff, 0x71, 0x4b, 0x62, + 0x4b, 0x38, 0x2e, 0x3a, 0x4a, 0x50, 0x52, 0x55, 0x43, 0x5b, 0x59, 0x6d, + 0x60, 0x47, 0x1f, 0x11, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xf0, 0xec, 0xe9, 0xe9, + 0xe9, 0xe6, 0xe3, 0xe2, 0xd8, 0xe7, 0xf4, 0xc2, 0x9b, 0xc0, 0xcb, 0xd1, + 0xd6, 0xea, 0xda, 0xe7, 0xe7, 0xed, 0xea, 0xea, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xeb, + 0xe8, 0xe8, 0xec, 0xef, 0xd6, 0xa2, 0xe0, 0xcf, 0x8a, 0x7b, 0x80, 0xab, + 0x9a, 0x94, 0x8e, 0xc6, 0xcc, 0xbb, 0xcb, 0xea, 0xd2, 0xd4, 0xe2, 0xe7, + 0xde, 0xdf, 0xe0, 0xd3, 0xd3, 0xdc, 0xdd, 0xe5, 0xe7, 0xdc, 0xdd, 0xe5, + 0xdf, 0xe1, 0xe2, 0xe6, 0xfb, 0xce, 0x66, 0x5c, 0x5f, 0x50, 0x46, 0x52, + 0x47, 0x44, 0x50, 0x30, 0x2b, 0x4c, 0x65, 0x74, 0x7f, 0x79, 0x76, 0x83, + 0x64, 0x72, 0x88, 0x87, 0x81, 0x96, 0x91, 0x62, 0x6c, 0x7e, 0x85, 0x7a, + 0x73, 0x74, 0x6c, 0x5c, 0x61, 0x5f, 0x64, 0x6f, 0x71, 0x6a, 0x68, 0x6b, + 0x74, 0x79, 0x7b, 0x73, 0x69, 0x68, 0x74, 0x80, 0x7b, 0x77, 0x79, 0x80, + 0x7b, 0x6e, 0x69, 0x6d, 0x5c, 0x61, 0x5f, 0x56, 0x54, 0x59, 0x58, 0x51, + 0x41, 0x43, 0x42, 0x3d, 0x3c, 0x48, 0x61, 0x76, 0x8c, 0x7d, 0x8d, 0x77, + 0x5d, 0x5e, 0x4b, 0x46, 0x4a, 0x57, 0x48, 0x28, 0x48, 0x5a, 0x5f, 0xb4, + 0x8e, 0x4a, 0x13, 0x42, 0x56, 0x27, 0x28, 0x3f, 0x41, 0x39, 0x51, 0x58, + 0x3e, 0x48, 0x63, 0x85, 0x90, 0x7d, 0x86, 0x86, 0x80, 0x69, 0x47, 0x51, + 0x65, 0x8d, 0x8d, 0x84, 0x8f, 0x79, 0x51, 0x4d, 0x43, 0x37, 0x52, 0x66, + 0x46, 0x2f, 0x35, 0x34, 0x9a, 0xdc, 0xbd, 0x3e, 0x12, 0x3f, 0x3d, 0x17, + 0x1b, 0x16, 0x11, 0x3b, 0xb3, 0xb4, 0x92, 0x8a, 0xa1, 0xbc, 0xaa, 0xca, + 0xe3, 0x6d, 0x48, 0x44, 0x39, 0x47, 0x4e, 0x41, 0x2e, 0x29, 0x37, 0x47, + 0x48, 0x51, 0x3d, 0x42, 0x3d, 0x37, 0x14, 0x04, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xf1, 0xeb, 0xea, 0xec, 0xe8, 0xdf, 0xde, 0xe4, 0xc9, 0xce, 0xf9, 0xe3, + 0xad, 0xc1, 0xbe, 0xd0, 0xc6, 0xdf, 0xdb, 0xe6, 0xec, 0xf4, 0xf0, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xec, 0xed, 0xea, 0xe8, 0xe8, 0xeb, 0xee, 0xe9, 0xa1, 0xc7, 0xd5, + 0xb3, 0xa5, 0x8e, 0xbd, 0xa6, 0x9c, 0x89, 0xc3, 0xcb, 0xbe, 0xd0, 0xde, + 0xde, 0xe5, 0xda, 0xce, 0xda, 0xe6, 0xdd, 0xd1, 0xec, 0xe8, 0xe6, 0xe3, + 0xe4, 0xe1, 0xde, 0xed, 0xe9, 0xf9, 0xfd, 0xff, 0x9c, 0x1e, 0x43, 0x82, + 0xa0, 0xbf, 0xc9, 0xd3, 0xe0, 0xfc, 0xee, 0x92, 0x45, 0x5c, 0x6d, 0x7e, + 0x90, 0x8b, 0x7c, 0x7d, 0x63, 0x6a, 0x7e, 0x7f, 0x6c, 0x6a, 0x6a, 0x5b, + 0x6d, 0x6c, 0x70, 0x74, 0x70, 0x67, 0x65, 0x6a, 0x64, 0x67, 0x6d, 0x6f, + 0x68, 0x5e, 0x5c, 0x62, 0x6a, 0x71, 0x74, 0x6a, 0x5d, 0x5d, 0x6d, 0x7d, + 0x7a, 0x7d, 0x83, 0x84, 0x78, 0x6b, 0x6a, 0x73, 0x78, 0x79, 0x74, 0x69, + 0x63, 0x63, 0x60, 0x5a, 0x52, 0x58, 0x50, 0x3e, 0x3b, 0x4e, 0x63, 0x6b, + 0x5b, 0x43, 0x48, 0x5b, 0x95, 0xce, 0xa8, 0x64, 0x59, 0x69, 0x5e, 0x54, + 0x68, 0x5e, 0x34, 0x2e, 0x39, 0x55, 0x47, 0x2c, 0x32, 0x5c, 0x67, 0x2d, + 0x54, 0x2e, 0x5e, 0x95, 0x95, 0x73, 0x5e, 0x71, 0x54, 0x5e, 0x87, 0x8e, + 0x74, 0x53, 0x4a, 0x77, 0x98, 0xa5, 0x97, 0x77, 0x66, 0x62, 0x5e, 0x5a, + 0x37, 0x55, 0x5a, 0x41, 0x37, 0x45, 0x48, 0x39, 0x64, 0xae, 0xcc, 0x8d, + 0x32, 0x1c, 0x35, 0x2d, 0x25, 0x1c, 0x0f, 0x31, 0xae, 0xc4, 0xb8, 0xbd, + 0xc1, 0xb9, 0x98, 0xbe, 0xe7, 0x7c, 0x5b, 0x67, 0x64, 0x74, 0x76, 0x5e, + 0x46, 0x41, 0x43, 0x43, 0x60, 0x6d, 0x60, 0x60, 0x54, 0x4a, 0x1c, 0x08, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xee, 0xeb, 0xeb, 0xed, 0xea, 0xe2, 0xdd, 0xdd, + 0xcf, 0xc5, 0xe3, 0xdf, 0xbe, 0xc3, 0xad, 0xe5, 0xd6, 0xd2, 0xd8, 0xe9, + 0xea, 0xee, 0xef, 0xe5, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xea, 0xe7, 0xe7, 0xea, 0xed, + 0xea, 0xbc, 0xcc, 0xe1, 0xbc, 0x98, 0x84, 0xad, 0xa0, 0x9e, 0x9a, 0xc8, + 0xdf, 0xcc, 0xe0, 0xd0, 0xea, 0xea, 0xca, 0xb9, 0xc3, 0xb9, 0xb6, 0xd7, + 0xe1, 0xe7, 0xee, 0xde, 0xe0, 0xef, 0xef, 0xff, 0xd7, 0x90, 0x45, 0x67, + 0xc7, 0xf4, 0xff, 0xe3, 0xa5, 0x99, 0x8b, 0x7d, 0x67, 0x5b, 0x58, 0x4c, + 0x55, 0x6b, 0x76, 0x7a, 0x81, 0x7f, 0x7f, 0x8e, 0x4d, 0x6b, 0x72, 0x74, + 0x7e, 0x6f, 0x69, 0x87, 0xa2, 0x7c, 0x63, 0x6b, 0x74, 0x6e, 0x6a, 0x70, + 0x73, 0x6b, 0x65, 0x68, 0x6c, 0x69, 0x5f, 0x56, 0x56, 0x60, 0x6a, 0x6c, + 0x69, 0x6b, 0x75, 0x7e, 0x76, 0x6f, 0x6a, 0x6b, 0x6f, 0x72, 0x76, 0x79, + 0x80, 0x80, 0x7b, 0x73, 0x6c, 0x67, 0x62, 0x5d, 0x4e, 0x4f, 0x4c, 0x3f, + 0x30, 0x38, 0x60, 0x89, 0xb6, 0xe5, 0xfa, 0xc7, 0x9a, 0xa1, 0x8d, 0x59, + 0x33, 0x60, 0x69, 0x5b, 0x51, 0x4e, 0x53, 0x4e, 0x6b, 0x4f, 0x41, 0x4a, + 0x50, 0x5c, 0x67, 0x5a, 0x55, 0x61, 0x69, 0x2b, 0x28, 0x32, 0x2b, 0x3f, + 0x51, 0x2d, 0x5b, 0x7d, 0x6c, 0x6c, 0x78, 0x88, 0x88, 0x71, 0x94, 0x9e, + 0x67, 0x60, 0x79, 0x62, 0x61, 0x51, 0x41, 0x41, 0x4c, 0x4c, 0x40, 0x37, + 0x25, 0x85, 0xe5, 0xec, 0x81, 0x29, 0x2d, 0x32, 0x24, 0x25, 0x1d, 0x3b, + 0xb3, 0xc6, 0xb5, 0xb4, 0xb0, 0x99, 0x8c, 0xd2, 0xff, 0x94, 0x4c, 0x4c, + 0x4b, 0x51, 0x55, 0x5b, 0x67, 0x74, 0x75, 0x6f, 0x54, 0x50, 0x44, 0x50, + 0x57, 0x56, 0x21, 0x0f, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xea, 0xec, 0xec, 0xec, + 0xee, 0xec, 0xe1, 0xd4, 0xd4, 0xcd, 0xd1, 0xc5, 0xb4, 0xc8, 0xa0, 0xd1, + 0xd7, 0xc3, 0xc8, 0xd6, 0xe5, 0xee, 0xee, 0xe4, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xec, 0xea, + 0xe6, 0xe6, 0xe8, 0xeb, 0xf8, 0xc5, 0xc0, 0xec, 0xc2, 0x84, 0x8c, 0x8b, + 0x9b, 0x86, 0x9f, 0xc8, 0xdc, 0xaa, 0xdc, 0xf1, 0xdb, 0xe9, 0xd0, 0xac, + 0xaf, 0xc4, 0xd0, 0xd7, 0xc9, 0xca, 0xd7, 0xda, 0xe1, 0xc9, 0x80, 0x54, + 0x94, 0xd5, 0xff, 0xeb, 0xb7, 0xcb, 0xf5, 0xeb, 0x98, 0x8f, 0xa3, 0xa7, + 0xaf, 0xbf, 0x97, 0x62, 0x6b, 0x83, 0x8e, 0x8c, 0x89, 0x7b, 0x74, 0x80, + 0x5a, 0x84, 0x7c, 0x6c, 0x8b, 0x97, 0x83, 0x7f, 0x80, 0x77, 0x6c, 0x68, + 0x6b, 0x6d, 0x6a, 0x66, 0x66, 0x6a, 0x6e, 0x6d, 0x6b, 0x6b, 0x6c, 0x6c, + 0x68, 0x6e, 0x78, 0x7f, 0x81, 0x7c, 0x72, 0x6b, 0x66, 0x60, 0x5b, 0x5f, + 0x6f, 0x7f, 0x85, 0x84, 0x70, 0x74, 0x7b, 0x7f, 0x79, 0x6a, 0x5b, 0x52, + 0x4c, 0x4f, 0x40, 0x37, 0x66, 0xbb, 0xf3, 0xfc, 0xf5, 0xe4, 0xae, 0x67, + 0x44, 0x59, 0x65, 0x44, 0x50, 0x62, 0x58, 0x4d, 0x54, 0x5e, 0x54, 0x2e, + 0x72, 0x7d, 0x6a, 0x58, 0x64, 0x56, 0x42, 0x5b, 0x42, 0x6e, 0x95, 0x3c, + 0x3e, 0x55, 0x47, 0x40, 0x6d, 0x45, 0x64, 0x72, 0x56, 0x5b, 0x6f, 0x82, + 0x5a, 0x41, 0x71, 0x8f, 0x69, 0x6f, 0x7e, 0x4d, 0x5b, 0x70, 0x69, 0x59, + 0x57, 0x4a, 0x43, 0x54, 0x49, 0x2c, 0x8e, 0xfa, 0xeb, 0x75, 0x17, 0x2b, + 0x36, 0x39, 0x2c, 0x3c, 0xab, 0xc0, 0xb1, 0xaf, 0xcd, 0xbe, 0xa9, 0xc6, + 0xfa, 0x9d, 0x5c, 0x59, 0x3c, 0x3a, 0x3e, 0x44, 0x44, 0x3e, 0x3e, 0x43, + 0x50, 0x4c, 0x57, 0x73, 0x7d, 0x70, 0x25, 0x10, 0xf6, 0xf5, 0xf5, 0xf4, + 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xec, 0xec, 0xea, 0xef, 0xf2, 0xe6, 0xd6, 0xbf, 0xc4, 0xd3, 0xd8, + 0xbc, 0xd4, 0xb3, 0xd5, 0xd8, 0xc9, 0xc5, 0xc4, 0xe9, 0xf5, 0xed, 0xe9, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe5, 0xe7, 0xea, 0xe8, 0xd2, 0xbd, 0xe8, + 0xdb, 0x7c, 0xa0, 0xb2, 0x86, 0x78, 0x8e, 0x99, 0xc2, 0xcb, 0xe9, 0xcd, + 0xac, 0x9a, 0xb8, 0xea, 0xf1, 0xe7, 0xea, 0xed, 0xeb, 0xe9, 0xe9, 0xe8, + 0xea, 0xe6, 0xe1, 0xef, 0xbe, 0xaf, 0xba, 0xde, 0xd8, 0xf3, 0xfa, 0xe3, + 0xac, 0xb6, 0xc4, 0xc2, 0xca, 0xb9, 0x7d, 0x5e, 0x5f, 0x75, 0x7e, 0x80, + 0x83, 0x7a, 0x75, 0x80, 0x50, 0x66, 0x6d, 0x65, 0x64, 0x63, 0x57, 0x4c, + 0x67, 0x6a, 0x70, 0x77, 0x79, 0x77, 0x75, 0x74, 0x75, 0x7e, 0x80, 0x74, + 0x67, 0x62, 0x64, 0x65, 0x85, 0x7e, 0x76, 0x75, 0x76, 0x76, 0x6f, 0x69, + 0x75, 0x7c, 0x7f, 0x7d, 0x7f, 0x86, 0x8b, 0x8b, 0x7c, 0x7c, 0x81, 0x86, + 0x81, 0x72, 0x66, 0x63, 0x62, 0x63, 0x4d, 0x3c, 0x62, 0x9a, 0x95, 0x67, + 0x31, 0x1f, 0x15, 0x34, 0x4f, 0x62, 0x6f, 0x55, 0x54, 0x64, 0x63, 0x4f, + 0x5c, 0x7d, 0x86, 0x86, 0x7d, 0x4f, 0x43, 0x52, 0x6b, 0x76, 0x71, 0x87, + 0x9c, 0x84, 0xad, 0x51, 0x3f, 0x4d, 0x56, 0x55, 0x43, 0x5e, 0x87, 0x78, + 0x51, 0x37, 0x34, 0x5d, 0x8a, 0x82, 0x76, 0x65, 0x6a, 0x8c, 0x84, 0x4f, + 0x66, 0x7a, 0x63, 0x50, 0x6c, 0x73, 0x64, 0x6a, 0x5d, 0x48, 0x58, 0x9a, + 0xcb, 0xae, 0x5a, 0x1b, 0x3d, 0x3f, 0x2a, 0x2f, 0x9f, 0xc2, 0xc4, 0xcb, + 0xa2, 0xa1, 0xa9, 0xc6, 0xf1, 0x90, 0x47, 0x4c, 0x36, 0x31, 0x34, 0x3c, + 0x39, 0x30, 0x34, 0x41, 0x7e, 0x5e, 0x4f, 0x5b, 0x71, 0x75, 0x22, 0x03, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xee, 0xec, 0xea, 0xea, 0xed, 0xee, 0xea, 0xe5, + 0xcc, 0xc3, 0xc3, 0xd1, 0xa5, 0xb6, 0xa1, 0xc2, 0xe7, 0xcf, 0xcd, 0xca, + 0xed, 0xef, 0xe4, 0xe8, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe4, 0xe6, 0xe9, + 0xf0, 0xe2, 0xae, 0xb9, 0xe6, 0x88, 0xa0, 0xb3, 0x90, 0x75, 0x9b, 0xc9, + 0xbe, 0xaa, 0xa6, 0xbb, 0xc1, 0xba, 0xd3, 0xeb, 0xdd, 0xd1, 0xdc, 0xe3, + 0xe2, 0xe7, 0xe2, 0xe4, 0xe6, 0xe1, 0xec, 0xfc, 0xff, 0xc2, 0xaf, 0x73, + 0x25, 0xbc, 0xff, 0xe0, 0x9b, 0xb5, 0xae, 0xbc, 0xc8, 0x94, 0x63, 0x5b, + 0x78, 0x94, 0x9d, 0x8e, 0x7b, 0x6c, 0x73, 0x8f, 0x56, 0x6f, 0x83, 0x8d, + 0x8a, 0x74, 0x6d, 0x7f, 0x84, 0x6d, 0x5f, 0x6a, 0x79, 0x79, 0x6c, 0x61, + 0x6c, 0x67, 0x61, 0x64, 0x75, 0x84, 0x7e, 0x6f, 0x7f, 0x77, 0x6c, 0x67, + 0x69, 0x6f, 0x75, 0x79, 0x8b, 0x98, 0x9a, 0x8c, 0x81, 0x84, 0x8a, 0x8c, + 0x90, 0x88, 0x85, 0x88, 0x82, 0x75, 0x6f, 0x72, 0x7d, 0x65, 0x54, 0x4d, + 0x38, 0x22, 0x2e, 0x4d, 0x49, 0x59, 0x64, 0x7d, 0x74, 0x62, 0x6c, 0x54, + 0x4e, 0x57, 0x60, 0x4d, 0x61, 0x6b, 0x3b, 0x32, 0x4f, 0x3c, 0x7f, 0x97, + 0x7a, 0x8b, 0x96, 0x8a, 0x5b, 0x8a, 0xef, 0x7a, 0x4f, 0x54, 0x4f, 0x39, + 0x39, 0x53, 0x78, 0x71, 0x66, 0x5c, 0x3c, 0x38, 0x6f, 0x7c, 0x75, 0x5f, + 0x65, 0x7b, 0x66, 0x33, 0x6b, 0x52, 0x5c, 0x70, 0x65, 0x5b, 0x61, 0x62, + 0x53, 0x65, 0x39, 0x55, 0xa5, 0xdd, 0xcf, 0x56, 0x3c, 0x47, 0x37, 0x37, + 0x9c, 0xb3, 0xa7, 0xa3, 0xac, 0xa3, 0xa5, 0xbc, 0xf6, 0xad, 0x5f, 0x5b, + 0x5a, 0x54, 0x4b, 0x44, 0x3d, 0x37, 0x36, 0x38, 0x3b, 0x5d, 0x7b, 0x67, + 0x4a, 0x4a, 0x12, 0x12, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xf2, 0xec, 0xe9, 0xeb, + 0xea, 0xe7, 0xec, 0xf4, 0xdc, 0xc7, 0xac, 0xbe, 0xaa, 0xca, 0xb3, 0xc6, + 0xde, 0xb0, 0xc1, 0xd2, 0xec, 0xe7, 0xeb, 0xf5, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xed, 0xec, 0xe9, + 0xe5, 0xe3, 0xe6, 0xe8, 0xeb, 0xe7, 0xcc, 0xad, 0xc7, 0x7b, 0xac, 0xbb, + 0x8f, 0x73, 0x80, 0xb0, 0xac, 0xe1, 0xc9, 0xcd, 0xd5, 0xe5, 0xe7, 0xe1, + 0xe6, 0xe8, 0xe3, 0xe0, 0xe1, 0xf2, 0xe8, 0xe7, 0xe9, 0xe4, 0xec, 0xe7, + 0xf7, 0xb3, 0x23, 0x41, 0x66, 0xcb, 0xfe, 0xe4, 0xa7, 0xb6, 0xae, 0xcd, + 0xb2, 0x66, 0x65, 0x63, 0x71, 0x78, 0x74, 0x78, 0x88, 0x86, 0x7a, 0x7a, + 0x4d, 0x86, 0x81, 0x75, 0x9a, 0x94, 0x6e, 0x72, 0x7c, 0x86, 0x82, 0x6e, + 0x68, 0x73, 0x78, 0x71, 0x74, 0x7e, 0x7e, 0x70, 0x65, 0x65, 0x68, 0x66, + 0x68, 0x6f, 0x77, 0x7b, 0x7a, 0x79, 0x7a, 0x7b, 0x83, 0x8b, 0x87, 0x77, + 0x71, 0x7d, 0x8a, 0x8e, 0x85, 0x80, 0x82, 0x89, 0x82, 0x6e, 0x61, 0x61, + 0x5f, 0x66, 0x67, 0x5a, 0x44, 0x37, 0x3a, 0x43, 0x51, 0x6e, 0x69, 0x68, + 0x60, 0x69, 0x76, 0x45, 0x33, 0x4a, 0x66, 0x46, 0x4e, 0x5a, 0x39, 0x5e, + 0x6f, 0x4f, 0x75, 0x8a, 0x85, 0x83, 0x6c, 0x6c, 0x7b, 0x9e, 0xda, 0x51, + 0x45, 0x49, 0x44, 0x55, 0x42, 0x40, 0x68, 0x5c, 0x3e, 0x57, 0x5a, 0x41, + 0x30, 0x3d, 0x6a, 0x7a, 0x65, 0x6b, 0x6e, 0x4b, 0x53, 0x6c, 0x6a, 0x5b, + 0x5f, 0x63, 0x5e, 0x61, 0x68, 0x6d, 0x59, 0x53, 0x74, 0xb4, 0xcd, 0x9d, + 0x65, 0x6a, 0x4b, 0x3d, 0x9a, 0xb4, 0xb0, 0xb0, 0xa1, 0xb7, 0xba, 0xb3, + 0xff, 0xe2, 0x69, 0x11, 0x2e, 0x3b, 0x3d, 0x33, 0x2e, 0x3a, 0x49, 0x4f, + 0x52, 0x70, 0x82, 0x5f, 0x4e, 0x63, 0x1e, 0x01, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xef, 0xf0, 0xe6, 0xe7, 0xf0, 0xf0, 0xf2, 0xe7, 0xe4, 0xc0, 0xbc, + 0xa5, 0xb4, 0xb7, 0x9d, 0xcf, 0xb3, 0xad, 0xc2, 0xe6, 0xe8, 0xf1, 0xef, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xe8, 0xeb, 0xf1, 0xed, 0xe2, 0xde, 0xe1, 0xe5, 0xdb, 0xd3, 0xd5, + 0xc1, 0x84, 0xad, 0xc9, 0x97, 0xa1, 0x9c, 0x97, 0x7d, 0xae, 0xbc, 0xcc, + 0xef, 0xea, 0xe5, 0xe4, 0xe6, 0xe8, 0xe7, 0xe5, 0xe7, 0xe8, 0xe6, 0xdd, + 0xea, 0xe3, 0xff, 0xea, 0xf6, 0xb8, 0x7e, 0x96, 0xcc, 0xf9, 0xff, 0xd8, + 0xa2, 0xb6, 0xc0, 0xbe, 0x71, 0x67, 0x5b, 0x75, 0x94, 0x9a, 0x90, 0x83, + 0x69, 0x62, 0x73, 0x61, 0x42, 0x74, 0x79, 0x87, 0x79, 0x8c, 0x7b, 0x8a, + 0x86, 0x76, 0x62, 0x57, 0x5d, 0x69, 0x6f, 0x6f, 0x6c, 0x69, 0x61, 0x61, + 0x74, 0x89, 0x86, 0x75, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x80, + 0x9c, 0x93, 0x85, 0x7a, 0x77, 0x7c, 0x85, 0x8c, 0x79, 0x76, 0x7c, 0x88, + 0x86, 0x77, 0x6d, 0x6f, 0x52, 0x62, 0x67, 0x50, 0x34, 0x38, 0x62, 0x8c, + 0x95, 0x8b, 0x5d, 0x51, 0x63, 0x71, 0x7b, 0x6e, 0x40, 0x4b, 0x46, 0x44, + 0x53, 0x5b, 0x5c, 0x66, 0x5f, 0x61, 0x7a, 0x7f, 0x7b, 0x75, 0x6f, 0x88, + 0x8d, 0x93, 0xbf, 0x70, 0x49, 0x53, 0x50, 0x53, 0x61, 0x37, 0x4f, 0x6a, + 0x57, 0x3a, 0x33, 0x54, 0x58, 0x43, 0x3e, 0x5e, 0x56, 0x3d, 0x20, 0x63, + 0x78, 0x65, 0x5e, 0x5c, 0x57, 0x61, 0x6b, 0x64, 0x65, 0x5b, 0x5e, 0x4c, + 0x4d, 0x7c, 0xb4, 0xe8, 0x89, 0x4b, 0x4f, 0x42, 0xa8, 0xcb, 0xb8, 0xcd, + 0xbf, 0xbd, 0xa9, 0xb5, 0xf1, 0xf1, 0x85, 0x13, 0x24, 0x3b, 0x33, 0x32, + 0x2e, 0x3d, 0x38, 0x45, 0x32, 0x3e, 0x52, 0x47, 0x57, 0x5d, 0x26, 0x0f, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xf3, 0xf1, 0xea, 0xe9, 0xe2, 0xec, 0xfb, 0xe3, + 0xf8, 0xdc, 0xbb, 0xb6, 0x8e, 0x91, 0x9e, 0x92, 0xd5, 0xc6, 0xa7, 0xb2, + 0xe7, 0xe7, 0xea, 0xea, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xe9, 0xea, 0xee, 0xed, 0xe6, 0xe1, 0xdf, + 0xed, 0xe0, 0xd2, 0xd4, 0xc5, 0x84, 0xa3, 0xcf, 0x84, 0x7b, 0x8b, 0xd0, + 0xa9, 0xb0, 0xe8, 0xe9, 0xe4, 0xe6, 0xe7, 0xe4, 0xe1, 0xe0, 0xe4, 0xe8, + 0xe1, 0xe6, 0xdf, 0xe8, 0xfd, 0xc4, 0xd3, 0xf3, 0xff, 0xb5, 0xa9, 0xd6, + 0xd3, 0xf9, 0xf8, 0xe1, 0xa4, 0xaf, 0xc5, 0x9e, 0x64, 0x5a, 0x65, 0x70, + 0x86, 0x77, 0x73, 0x8b, 0x83, 0x70, 0x7d, 0x78, 0x4c, 0xac, 0x78, 0x4a, + 0x69, 0x80, 0x59, 0x87, 0x79, 0x6a, 0x59, 0x55, 0x5f, 0x6c, 0x6f, 0x6d, + 0x6e, 0x65, 0x60, 0x6d, 0x87, 0x96, 0x8a, 0x74, 0x6f, 0x7a, 0x83, 0x80, + 0x74, 0x6c, 0x6d, 0x72, 0x87, 0x7f, 0x75, 0x6e, 0x6e, 0x71, 0x74, 0x75, + 0x73, 0x78, 0x88, 0x95, 0x8f, 0x78, 0x67, 0x63, 0x68, 0x5c, 0x50, 0x50, + 0x56, 0x55, 0x49, 0x3c, 0x46, 0x5b, 0x60, 0x6c, 0x71, 0x75, 0x82, 0x71, + 0x41, 0x6a, 0x5f, 0x34, 0x44, 0x76, 0x80, 0x6d, 0x5e, 0x3d, 0x73, 0x94, + 0x72, 0x69, 0x80, 0x97, 0x72, 0x75, 0x9b, 0x51, 0x33, 0x44, 0x45, 0x44, + 0x55, 0x37, 0x48, 0x50, 0x4b, 0x57, 0x61, 0x77, 0x5a, 0x39, 0x38, 0x72, + 0x82, 0x6a, 0x36, 0x60, 0x86, 0x75, 0x6b, 0x63, 0x58, 0x5f, 0x6c, 0x6b, + 0x60, 0x70, 0x62, 0x72, 0x70, 0x65, 0xa4, 0xdf, 0xb8, 0x6a, 0x39, 0x3a, + 0xa2, 0xb4, 0xa3, 0x9b, 0xb3, 0xb8, 0xad, 0xba, 0xe9, 0xe6, 0x8e, 0x37, + 0x3d, 0x33, 0x39, 0x62, 0x71, 0x8a, 0x7d, 0x68, 0x7d, 0x7d, 0x72, 0x66, + 0x95, 0x91, 0x2e, 0x06, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xf0, 0xe8, 0xf1, + 0xe1, 0xd8, 0xf1, 0xdd, 0xf0, 0xe5, 0xcf, 0xb9, 0xa0, 0xba, 0xb8, 0x8b, + 0xd0, 0xce, 0xa5, 0xa9, 0xd3, 0xc9, 0xde, 0xed, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xe9, + 0xec, 0xec, 0xe5, 0xdc, 0xe1, 0xf2, 0xd9, 0xb1, 0xa9, 0x8f, 0xa2, 0xc1, + 0x64, 0x8d, 0x9d, 0xcb, 0xb3, 0xaf, 0xe1, 0xce, 0xdd, 0xe0, 0xe4, 0xe4, + 0xe1, 0xdf, 0xe1, 0xe3, 0xdd, 0xec, 0xdd, 0xff, 0xd3, 0x5d, 0xc5, 0xff, + 0xff, 0xb4, 0x3a, 0x2d, 0x12, 0xa3, 0xff, 0xe0, 0xa9, 0xc7, 0xa9, 0x70, + 0x5f, 0x5f, 0x7b, 0x91, 0x84, 0x7b, 0x6e, 0x75, 0x74, 0x79, 0x87, 0x71, + 0x92, 0x6e, 0x48, 0x74, 0x8f, 0x7e, 0x60, 0x86, 0x76, 0x6c, 0x5f, 0x55, + 0x51, 0x55, 0x5e, 0x66, 0x66, 0x5a, 0x59, 0x6a, 0x7a, 0x77, 0x65, 0x55, + 0x67, 0x75, 0x84, 0x87, 0x7e, 0x74, 0x6f, 0x70, 0x70, 0x6b, 0x68, 0x6c, + 0x77, 0x7f, 0x81, 0x80, 0x7b, 0x7a, 0x79, 0x74, 0x64, 0x52, 0x4c, 0x4f, + 0x6e, 0x6a, 0x61, 0x54, 0x47, 0x3d, 0x3a, 0x3a, 0x4b, 0x5d, 0x6f, 0x7a, + 0x64, 0x60, 0x72, 0x59, 0x43, 0x54, 0x4f, 0x45, 0x4f, 0x55, 0x50, 0x51, + 0x74, 0x57, 0x6b, 0x82, 0x84, 0x7d, 0x7b, 0x96, 0x85, 0x5f, 0x81, 0x6f, + 0x64, 0x4a, 0x35, 0x39, 0x41, 0x45, 0x68, 0x69, 0x64, 0x72, 0x5c, 0x43, + 0x57, 0x52, 0x51, 0x61, 0x5d, 0x69, 0x59, 0x85, 0x63, 0x66, 0x73, 0x79, + 0x70, 0x68, 0x63, 0x59, 0x57, 0x5e, 0x61, 0x65, 0x66, 0x51, 0x60, 0xa4, + 0xd5, 0xa7, 0x34, 0x1d, 0xa1, 0xcf, 0xc6, 0xb6, 0xbc, 0xbf, 0xae, 0xb4, + 0xe1, 0xee, 0xbc, 0x87, 0x9a, 0xa1, 0x9b, 0x93, 0x74, 0x7d, 0x6e, 0x55, + 0x67, 0x71, 0x68, 0x43, 0x4f, 0x4b, 0x14, 0x17, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf5, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, + 0xe2, 0xea, 0xe1, 0xed, 0xe7, 0xd0, 0xd9, 0xda, 0xe3, 0xdd, 0xcb, 0xae, + 0xa2, 0xc0, 0xbc, 0x8b, 0xc0, 0xc7, 0xaa, 0xb8, 0xd4, 0xc2, 0xe8, 0xf8, + 0xe9, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xe9, 0xe6, 0xeb, 0xf0, 0xe8, 0xdb, 0xe5, 0xe5, 0xd8, 0xd5, + 0xd4, 0x9c, 0x90, 0xd2, 0x5b, 0x3f, 0x8a, 0xef, 0xcc, 0xa3, 0xe1, 0xec, + 0xeb, 0xe4, 0xdc, 0xd9, 0xdc, 0xe1, 0xe4, 0xe4, 0xe1, 0xe3, 0xff, 0xce, + 0x50, 0x4d, 0xe8, 0xf8, 0xfb, 0xcf, 0x30, 0x5c, 0x7e, 0xe6, 0xf9, 0xda, + 0xa6, 0xc8, 0x85, 0x71, 0x6b, 0x70, 0x76, 0x78, 0x69, 0x7f, 0x8a, 0x91, + 0x7e, 0x64, 0x49, 0x0f, 0x2f, 0x76, 0x8f, 0x86, 0x85, 0x85, 0x76, 0x7a, + 0x7c, 0x71, 0x63, 0x59, 0x53, 0x53, 0x5f, 0x6c, 0x75, 0x65, 0x5e, 0x64, + 0x64, 0x5b, 0x5d, 0x68, 0x79, 0x73, 0x6c, 0x69, 0x6b, 0x6c, 0x6b, 0x68, + 0x6b, 0x66, 0x65, 0x6e, 0x7f, 0x8c, 0x91, 0x90, 0x85, 0x7f, 0x74, 0x64, + 0x57, 0x56, 0x63, 0x72, 0x6c, 0x6c, 0x67, 0x5a, 0x49, 0x3f, 0x3e, 0x40, + 0x46, 0x4c, 0x63, 0x77, 0x64, 0x6d, 0x89, 0x67, 0x54, 0x5f, 0x55, 0x4b, + 0x5a, 0x67, 0x6d, 0x77, 0x74, 0x72, 0x7a, 0x77, 0x87, 0x90, 0x82, 0x8e, + 0x85, 0x6e, 0x75, 0x49, 0x54, 0x6a, 0x5e, 0x36, 0x42, 0x45, 0x5f, 0x55, + 0x50, 0x65, 0x52, 0x34, 0x3f, 0x55, 0x4f, 0x3c, 0x41, 0x84, 0x7a, 0x75, + 0x7b, 0x69, 0x5b, 0x5f, 0x6c, 0x74, 0x6c, 0x5e, 0x60, 0x5f, 0x65, 0x5b, + 0x65, 0x6a, 0x5c, 0x7a, 0xbb, 0xf2, 0x94, 0x31, 0x80, 0xb3, 0xa4, 0xb6, + 0xae, 0xa7, 0xb4, 0xda, 0xd9, 0x95, 0x5e, 0x63, 0x1b, 0x2f, 0x28, 0x33, + 0x3b, 0x47, 0x2e, 0x26, 0x40, 0x4d, 0x6f, 0x62, 0x53, 0x48, 0x1b, 0x0f, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf3, 0xf4, 0xf4, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xf0, 0xef, 0xef, 0xee, + 0xed, 0xed, 0xec, 0xec, 0xed, 0xe5, 0xdd, 0xde, 0xe3, 0xdf, 0xd4, 0xd0, + 0xd7, 0xf0, 0xec, 0xaf, 0x8a, 0xb6, 0xc7, 0x7c, 0xb2, 0xc5, 0xa1, 0xa1, + 0xc5, 0xc3, 0xec, 0xfb, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xeb, 0xeb, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xed, 0xed, 0xe9, 0xe5, 0xea, 0xf1, 0xea, 0xde, + 0xe1, 0xe0, 0xd2, 0xc8, 0xd0, 0xb6, 0xa8, 0xf9, 0x8d, 0x5c, 0x8b, 0xbb, + 0x92, 0x77, 0xd9, 0xe5, 0xe8, 0xe5, 0xe2, 0xe2, 0xe5, 0xe5, 0xe2, 0xdf, + 0xe6, 0xf0, 0xcf, 0x8d, 0x6f, 0x7c, 0xe2, 0xf5, 0xfe, 0xd9, 0x7b, 0xad, + 0xb2, 0xfc, 0xf0, 0xf2, 0xcb, 0x9c, 0x69, 0x66, 0x64, 0x86, 0x95, 0x88, + 0x84, 0x79, 0x74, 0x83, 0x71, 0x5d, 0x6e, 0x6d, 0x70, 0x6e, 0x6d, 0x7d, + 0x9d, 0x8f, 0x7a, 0x7a, 0x6e, 0x68, 0x69, 0x72, 0x74, 0x6b, 0x61, 0x60, + 0x5a, 0x59, 0x67, 0x7e, 0x7f, 0x70, 0x70, 0x7d, 0x70, 0x6b, 0x67, 0x6a, + 0x72, 0x76, 0x73, 0x6f, 0x75, 0x6e, 0x68, 0x6a, 0x73, 0x7d, 0x83, 0x85, + 0x81, 0x80, 0x7a, 0x6d, 0x63, 0x62, 0x67, 0x6c, 0x70, 0x69, 0x5d, 0x51, + 0x48, 0x44, 0x45, 0x47, 0x43, 0x53, 0x74, 0x8a, 0x6d, 0x65, 0x70, 0x44, + 0x5a, 0x5e, 0x50, 0x45, 0x4e, 0x52, 0x53, 0x5f, 0x3f, 0x4f, 0x94, 0x98, + 0x68, 0x6e, 0x85, 0x8b, 0x84, 0x59, 0x58, 0x43, 0x45, 0x3e, 0x46, 0x43, + 0x5d, 0x5d, 0x7d, 0x7c, 0x6f, 0x71, 0x56, 0x3e, 0x56, 0x70, 0x68, 0x3e, + 0x29, 0x6a, 0x63, 0x52, 0x6d, 0x79, 0x7f, 0x79, 0x6d, 0x63, 0x63, 0x69, + 0x68, 0x71, 0x60, 0x66, 0x6d, 0x69, 0x6d, 0x53, 0x86, 0xc8, 0xb7, 0x5b, + 0x75, 0xc1, 0xb2, 0xd0, 0xaa, 0xc6, 0xa8, 0x79, 0x92, 0xbc, 0xa0, 0x63, + 0x6a, 0xb6, 0xa7, 0x63, 0x4e, 0x81, 0x6e, 0x3e, 0x49, 0x42, 0x5a, 0x50, + 0x45, 0x42, 0x1b, 0x0d, 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, 0xef, + 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf0, 0xef, 0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xf4, 0xe8, 0xeb, 0xdd, + 0xce, 0xda, 0xdb, 0xcb, 0xda, 0xd2, 0xd6, 0xc1, 0x91, 0x95, 0xc3, 0x92, + 0x98, 0xd2, 0xac, 0x89, 0xb0, 0xb3, 0xce, 0xe8, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xeb, 0xec, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xee, 0xec, 0xe9, 0xe7, + 0xeb, 0xee, 0xea, 0xe3, 0xe7, 0xe1, 0xd9, 0xcb, 0xc8, 0xb6, 0x96, 0xe4, + 0x9d, 0x87, 0xba, 0xff, 0xee, 0x8d, 0xce, 0xd5, 0xe1, 0xe5, 0xea, 0xea, + 0xe6, 0xe4, 0xe4, 0xe5, 0xfb, 0xe8, 0x63, 0x4e, 0x81, 0x79, 0xe4, 0xfc, + 0xf9, 0xd5, 0x86, 0x9c, 0x87, 0xca, 0xf1, 0xff, 0xcb, 0x68, 0x6b, 0x5a, + 0x77, 0x87, 0x7a, 0x72, 0x8c, 0x8b, 0x85, 0x87, 0x73, 0x69, 0x80, 0x7d, + 0x69, 0x74, 0x83, 0x76, 0x82, 0x78, 0x78, 0x6c, 0x67, 0x5f, 0x5f, 0x67, + 0x67, 0x63, 0x6c, 0x7c, 0x7b, 0x6d, 0x68, 0x6f, 0x6d, 0x63, 0x68, 0x78, + 0x61, 0x62, 0x63, 0x62, 0x60, 0x60, 0x62, 0x64, 0x79, 0x76, 0x71, 0x6d, + 0x6d, 0x72, 0x7a, 0x7f, 0x8a, 0x8b, 0x85, 0x79, 0x71, 0x6d, 0x65, 0x5c, + 0x67, 0x68, 0x61, 0x4e, 0x3a, 0x36, 0x44, 0x53, 0x2c, 0x4f, 0x74, 0x86, + 0x69, 0x5a, 0x66, 0x4c, 0x42, 0x49, 0x47, 0x4d, 0x5c, 0x5c, 0x5b, 0x68, + 0x6e, 0x4e, 0x6a, 0x8e, 0x9d, 0x9c, 0x77, 0x5a, 0x4e, 0x66, 0x79, 0x47, + 0x39, 0x4a, 0x6b, 0x59, 0x60, 0x56, 0x6f, 0x67, 0x50, 0x4e, 0x42, 0x41, + 0x3c, 0x48, 0x57, 0x51, 0x39, 0x6c, 0x77, 0x88, 0x7b, 0x75, 0x68, 0x64, + 0x6e, 0x6f, 0x67, 0x64, 0x62, 0x61, 0x64, 0x6d, 0x6c, 0x66, 0x60, 0x4f, + 0x5c, 0x82, 0xd1, 0xc2, 0x99, 0xc2, 0xa0, 0xa3, 0xbc, 0xbd, 0xbe, 0xd9, + 0xfc, 0xe7, 0xa5, 0x77, 0x8a, 0x82, 0x6a, 0x53, 0x2e, 0x3c, 0x39, 0x2c, + 0x32, 0x3d, 0x56, 0x4b, 0x49, 0x3a, 0x0b, 0x0f, 0xf5, 0xf5, 0xf4, 0xf2, + 0xf1, 0xf0, 0xef, 0xee, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe7, 0xe7, 0xe6, + 0xeb, 0xec, 0xf1, 0xe8, 0xc8, 0xbe, 0xcb, 0xc5, 0xd5, 0xda, 0xcb, 0xb5, + 0x94, 0x89, 0xc8, 0xac, 0x7f, 0xca, 0xbf, 0x9d, 0xbb, 0xb1, 0xbb, 0xe0, + 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xeb, 0xec, 0xec, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xeb, 0xe9, 0xeb, 0xeb, 0xe9, 0xe8, 0xea, 0xd4, 0xeb, 0xe5, 0xae, + 0xa6, 0xd0, 0xb3, 0xdd, 0x91, 0x59, 0xa8, 0xf1, 0xdc, 0x88, 0xda, 0xd8, + 0xe6, 0xe5, 0xe1, 0xdc, 0xdb, 0xe2, 0xee, 0xf7, 0xd9, 0x66, 0x52, 0x73, + 0x6b, 0x6b, 0xd9, 0xf7, 0xf6, 0xdb, 0x91, 0xc8, 0xf0, 0xe7, 0xe9, 0xff, + 0xb2, 0x5a, 0x6b, 0x65, 0x90, 0x8c, 0x75, 0x80, 0x6c, 0x7c, 0x79, 0x74, + 0x67, 0x6b, 0x77, 0x59, 0x64, 0x8c, 0x8b, 0x70, 0x95, 0x5e, 0x40, 0x59, + 0x7d, 0x6e, 0x69, 0x72, 0x74, 0x6c, 0x6b, 0x73, 0x66, 0x64, 0x6a, 0x71, + 0x6e, 0x67, 0x6d, 0x7a, 0x8d, 0x81, 0x6f, 0x60, 0x5a, 0x5c, 0x65, 0x6b, + 0x7b, 0x7f, 0x80, 0x79, 0x6f, 0x6b, 0x71, 0x78, 0x88, 0x88, 0x82, 0x7d, + 0x83, 0x8a, 0x83, 0x75, 0x5c, 0x5e, 0x5e, 0x56, 0x4c, 0x46, 0x48, 0x4d, + 0x44, 0x64, 0x6f, 0x72, 0x61, 0x55, 0x60, 0x54, 0x48, 0x5e, 0x50, 0x34, + 0x41, 0x5e, 0x66, 0x62, 0x51, 0x50, 0x5a, 0x5d, 0x66, 0x5b, 0x3e, 0x4d, + 0x4b, 0x47, 0x5c, 0x56, 0x4f, 0x48, 0x84, 0xa3, 0x32, 0x42, 0x76, 0x79, + 0x60, 0x59, 0x49, 0x43, 0x48, 0x2d, 0x36, 0x5a, 0x66, 0x93, 0x7a, 0x67, + 0x6d, 0x6d, 0x62, 0x5f, 0x6a, 0x6b, 0x64, 0x68, 0x63, 0x5a, 0x6a, 0x64, + 0x68, 0x6d, 0x56, 0x65, 0x45, 0x77, 0xc6, 0xe1, 0xb2, 0xd8, 0xe6, 0xff, + 0xff, 0xfc, 0xd0, 0x9b, 0x6f, 0x44, 0x32, 0x3f, 0x2f, 0x36, 0x3e, 0x43, + 0x1d, 0x21, 0x30, 0x43, 0x3a, 0x38, 0x4b, 0x46, 0x4b, 0x41, 0x13, 0x12, + 0xf5, 0xf5, 0xf4, 0xf2, 0xf1, 0xef, 0xee, 0xee, 0xe8, 0xe9, 0xea, 0xeb, + 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe8, 0xe6, + 0xe5, 0xe4, 0xe3, 0xe2, 0xe5, 0xec, 0xe2, 0xef, 0xd9, 0xab, 0xb0, 0xb7, + 0xcd, 0xf1, 0xd7, 0xc2, 0xa6, 0x6e, 0xa1, 0xae, 0x7f, 0xa9, 0xa6, 0x96, + 0xb7, 0xb3, 0xc7, 0xf7, 0xe5, 0xe5, 0xe6, 0xe8, 0xe9, 0xeb, 0xec, 0xec, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xef, 0xe9, 0xe9, 0xed, 0xeb, 0xe6, 0xe7, 0xee, + 0xdd, 0xdd, 0xdf, 0xbb, 0xa7, 0xb5, 0x88, 0xbb, 0x72, 0x4a, 0xb5, 0xeb, + 0xf7, 0xa6, 0xc4, 0xd8, 0xd9, 0xd9, 0xdb, 0xe2, 0xea, 0xee, 0xee, 0xeb, + 0x6a, 0x59, 0x84, 0x94, 0x7e, 0x93, 0xfc, 0xf7, 0xe7, 0xd7, 0xcf, 0xc3, + 0xcc, 0xf3, 0xff, 0xfc, 0xae, 0x63, 0x60, 0x7b, 0x7d, 0x7c, 0x81, 0x86, + 0x93, 0x82, 0x75, 0x83, 0x78, 0x65, 0x68, 0x55, 0x77, 0x33, 0x39, 0x58, + 0x97, 0xb6, 0xf8, 0xff, 0xff, 0xbd, 0x79, 0x67, 0x71, 0x6f, 0x63, 0x5a, + 0x53, 0x61, 0x72, 0x75, 0x66, 0x57, 0x5d, 0x6b, 0x70, 0x6a, 0x69, 0x72, + 0x7f, 0x83, 0x79, 0x6d, 0x83, 0x8b, 0x8e, 0x81, 0x6b, 0x5b, 0x59, 0x5e, + 0x5d, 0x5e, 0x5c, 0x5d, 0x69, 0x72, 0x64, 0x4d, 0x60, 0x62, 0x5e, 0x51, + 0x44, 0x48, 0x5b, 0x6e, 0x6d, 0x81, 0x72, 0x6d, 0x6b, 0x5d, 0x54, 0x41, + 0x43, 0x3b, 0x37, 0x49, 0x59, 0x4e, 0x51, 0x6f, 0x5e, 0x4a, 0x58, 0x43, + 0x2f, 0x52, 0x64, 0x5a, 0x47, 0x40, 0x51, 0x51, 0x4d, 0x38, 0x5b, 0x61, + 0x53, 0x60, 0x81, 0x67, 0x42, 0x47, 0x4a, 0x4d, 0x5b, 0x3b, 0x33, 0x41, + 0x49, 0x88, 0x7d, 0x68, 0x70, 0x77, 0x6f, 0x6a, 0x70, 0x69, 0x5f, 0x64, + 0x64, 0x6e, 0x4c, 0x3e, 0x44, 0x34, 0x2e, 0x31, 0x5b, 0x99, 0x9f, 0xca, + 0xd0, 0xc1, 0x64, 0x2f, 0x1c, 0x13, 0x0b, 0x22, 0x47, 0x4c, 0x45, 0x50, + 0x4a, 0x49, 0x2f, 0x34, 0x38, 0x45, 0x3e, 0x4e, 0x4c, 0x37, 0x54, 0x4d, + 0x35, 0x31, 0x19, 0x12, 0xfb, 0xf6, 0xf7, 0xe5, 0xf0, 0xea, 0xec, 0xf3, + 0xef, 0xe9, 0xf4, 0xf7, 0xec, 0xe5, 0xe7, 0xf2, 0xe8, 0xe8, 0xe9, 0xea, + 0xea, 0xeb, 0xec, 0xec, 0xf1, 0xf1, 0xf0, 0xef, 0xef, 0xee, 0xed, 0xed, + 0xef, 0xf0, 0xf1, 0xf1, 0xf0, 0xed, 0xeb, 0xe9, 0xed, 0xec, 0xec, 0xec, + 0xec, 0xeb, 0xeb, 0xeb, 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xec, 0xeb, + 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xf4, 0xed, 0xe8, 0xe9, 0xeb, 0xe9, 0xe7, 0xe8, + 0xde, 0xde, 0xea, 0xea, 0xd6, 0xde, 0xd2, 0xe0, 0xdf, 0xdf, 0xe3, 0xe8, + 0xe0, 0xbe, 0xac, 0xc0, 0xcc, 0xc4, 0xfc, 0xde, 0xb9, 0x95, 0x92, 0x87, + 0x95, 0xab, 0xae, 0x8b, 0xc4, 0xbc, 0xc8, 0xd8, 0xe1, 0xee, 0xef, 0xed, + 0xf4, 0xed, 0xe6, 0xef, 0xe4, 0xdb, 0xe3, 0xef, 0xec, 0xe7, 0xea, 0xeb, + 0xf4, 0xeb, 0xef, 0xf1, 0xe7, 0xea, 0xf0, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe7, 0xc9, 0xea, 0xeb, 0xdd, 0xaf, 0x7b, 0xf4, + 0xaa, 0x2c, 0xa8, 0xfb, 0xee, 0xb2, 0xc9, 0xef, 0xf5, 0xd3, 0xdd, 0xe8, + 0xdf, 0xf0, 0xd6, 0x7b, 0x79, 0x92, 0x98, 0x77, 0x78, 0xc2, 0xf3, 0xde, + 0xd0, 0xec, 0xf6, 0xf8, 0xff, 0xe0, 0x91, 0x50, 0x58, 0x73, 0x78, 0x90, + 0x8d, 0x78, 0x81, 0x74, 0x7f, 0x75, 0x7d, 0x55, 0x37, 0x25, 0x1c, 0x5f, + 0xab, 0xff, 0xfd, 0xff, 0xd8, 0xa0, 0xe9, 0xa3, 0x5e, 0x5d, 0x5d, 0x63, + 0x6d, 0x6f, 0x62, 0x52, 0x69, 0x64, 0x6f, 0x86, 0x8d, 0x7d, 0x6c, 0x68, + 0x61, 0x5d, 0x65, 0x7b, 0x88, 0x82, 0x76, 0x6f, 0x68, 0x63, 0x66, 0x70, + 0x73, 0x6f, 0x70, 0x77, 0x68, 0x54, 0x49, 0x55, 0x67, 0x6c, 0x67, 0x61, + 0x5b, 0x5f, 0x5a, 0x4f, 0x46, 0x41, 0x51, 0x6c, 0x48, 0x4b, 0x74, 0x72, + 0x66, 0x69, 0x4e, 0x45, 0x3b, 0x30, 0x4b, 0x6f, 0x72, 0x6c, 0x60, 0x49, + 0x56, 0x61, 0x5c, 0x58, 0x38, 0x34, 0x65, 0x6b, 0x5f, 0x39, 0x35, 0x3a, + 0x32, 0x4c, 0x64, 0x53, 0x32, 0x26, 0x66, 0x7b, 0x31, 0x55, 0x44, 0x2f, + 0x43, 0x64, 0x7a, 0x79, 0x7b, 0x94, 0x7e, 0x6b, 0x71, 0x78, 0x76, 0x6b, + 0x62, 0x5e, 0x57, 0x4e, 0x3f, 0x37, 0x46, 0x7e, 0xc6, 0xf6, 0xfd, 0xf3, + 0xe5, 0x9d, 0x67, 0xab, 0xdb, 0xc5, 0x82, 0x00, 0x21, 0x3b, 0x35, 0x39, + 0x37, 0x32, 0x42, 0x36, 0x38, 0x34, 0x3b, 0x42, 0x37, 0x28, 0x32, 0x4c, + 0x54, 0x53, 0x4e, 0x5f, 0x4e, 0x40, 0x1f, 0x14, 0xfb, 0xea, 0xed, 0xee, + 0xf3, 0xe3, 0xeb, 0xe3, 0xef, 0xf2, 0xe4, 0xdf, 0xe8, 0xec, 0xed, 0xef, + 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xe8, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe5, 0xe5, 0xe5, 0xeb, 0xec, 0xee, 0xef, 0xf0, 0xef, 0xed, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xf0, 0xf0, 0xef, 0xee, + 0xed, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xf2, 0xe5, 0xe9, 0xef, + 0xe8, 0xe9, 0xe7, 0xd7, 0xe9, 0xeb, 0xdf, 0xe3, 0xc7, 0xd6, 0xed, 0xe1, + 0xe6, 0xb8, 0xe7, 0xe6, 0xc6, 0xcb, 0xae, 0x9c, 0x95, 0xce, 0xdb, 0xde, + 0xd7, 0x8e, 0x7f, 0x94, 0x8e, 0x9e, 0xc4, 0x93, 0xb7, 0xb7, 0xb3, 0xc3, + 0xf0, 0xee, 0xed, 0xeb, 0xe7, 0xe7, 0xeb, 0xeb, 0xed, 0xe1, 0xe4, 0xee, + 0xea, 0xe8, 0xeb, 0xea, 0xed, 0xe6, 0xeb, 0xee, 0xe7, 0xeb, 0xf1, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xeb, 0xd3, 0xea, 0xe9, + 0xd7, 0xb3, 0x4c, 0x7c, 0xab, 0x53, 0xad, 0xf8, 0xff, 0xb0, 0xbf, 0xea, + 0xe8, 0xff, 0xdc, 0xd7, 0xff, 0xdc, 0x71, 0x54, 0x69, 0x89, 0x9e, 0x86, + 0x7d, 0xbf, 0xff, 0xff, 0xf7, 0xea, 0xa6, 0x60, 0x5d, 0x72, 0x64, 0x49, + 0x46, 0x5c, 0x75, 0x77, 0x7b, 0x84, 0x7b, 0x6f, 0x5f, 0x40, 0x31, 0x7c, + 0xd2, 0xf3, 0xff, 0xf2, 0xff, 0xfa, 0xd1, 0x7a, 0x64, 0x45, 0x21, 0x00, + 0x14, 0x35, 0x5e, 0x73, 0x75, 0x6f, 0x6d, 0x6e, 0x80, 0x81, 0x88, 0x8c, + 0x7e, 0x6c, 0x6c, 0x79, 0x7f, 0x6a, 0x62, 0x74, 0x88, 0x86, 0x74, 0x65, + 0x5b, 0x5b, 0x65, 0x74, 0x76, 0x6b, 0x64, 0x65, 0x6b, 0x62, 0x5f, 0x68, + 0x6c, 0x64, 0x58, 0x52, 0x60, 0x62, 0x54, 0x4a, 0x4b, 0x40, 0x36, 0x3e, + 0x47, 0x34, 0x38, 0x5a, 0x77, 0x5c, 0x3c, 0x56, 0x3e, 0x30, 0x2b, 0x2a, + 0x37, 0x5d, 0x69, 0x4d, 0x63, 0x60, 0x53, 0x31, 0x46, 0x61, 0x43, 0x3e, + 0x3e, 0x3e, 0x5b, 0x5f, 0x39, 0x31, 0x3d, 0x31, 0x48, 0x29, 0x6b, 0x94, + 0x53, 0x60, 0x4e, 0x4d, 0x36, 0x50, 0x43, 0x43, 0x5a, 0x76, 0x7a, 0x71, + 0x75, 0x5c, 0x40, 0x38, 0x4c, 0x75, 0xa4, 0xc5, 0xee, 0xee, 0xed, 0xd2, + 0x8a, 0x39, 0x19, 0x22, 0x22, 0x24, 0x19, 0x4d, 0x93, 0xd5, 0xdf, 0x74, + 0x1a, 0x2a, 0x32, 0x32, 0x3d, 0x3d, 0x2e, 0x2d, 0x3e, 0x36, 0x39, 0x40, + 0x39, 0x2d, 0x35, 0x49, 0x38, 0x34, 0x2e, 0x43, 0x3c, 0x36, 0x1a, 0x11, + 0xf9, 0xf2, 0xee, 0xe2, 0xe0, 0xec, 0xff, 0xcb, 0xf0, 0xf3, 0xe7, 0xf3, + 0xf0, 0xe0, 0xea, 0xe7, 0xe6, 0xe7, 0xe7, 0xe8, 0xe9, 0xe9, 0xea, 0xea, + 0xe9, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe7, 0xe8, 0xeb, 0xee, + 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xef, 0xee, 0xee, 0xed, 0xed, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf0, 0xdc, 0xe5, 0xee, 0xda, 0xd7, 0xe4, 0xe1, 0xf6, 0xe8, 0xd3, 0xd2, + 0xb5, 0xd7, 0xf7, 0xdd, 0xd9, 0xab, 0xce, 0xe7, 0xba, 0xbc, 0xde, 0xd8, + 0xaf, 0xdd, 0xc6, 0xd8, 0xe8, 0xbd, 0x95, 0xa2, 0xb5, 0x8a, 0x90, 0x81, + 0xaa, 0xa7, 0xce, 0xed, 0xf4, 0xe7, 0xe9, 0xeb, 0xe1, 0xe7, 0xef, 0xe5, + 0xec, 0xdf, 0xe0, 0xe8, 0xe9, 0xeb, 0xed, 0xe8, 0xea, 0xe6, 0xea, 0xec, + 0xe7, 0xe9, 0xed, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xef, 0xdf, 0xe3, 0xe4, 0xd7, 0xe3, 0x90, 0xbd, 0x72, 0x37, 0x88, 0xe1, + 0xff, 0xae, 0xc1, 0xdd, 0xf0, 0xe9, 0xe7, 0xeb, 0xc6, 0x76, 0x5b, 0x85, + 0x80, 0x85, 0x82, 0x6a, 0x67, 0x93, 0x9f, 0x76, 0x6a, 0x62, 0x4b, 0x36, + 0x22, 0x0b, 0x16, 0x3c, 0x68, 0x68, 0x89, 0x73, 0x4c, 0x40, 0x46, 0x80, + 0xde, 0xfd, 0xf1, 0xf1, 0xfb, 0xfc, 0xdf, 0x8e, 0x24, 0x00, 0x0d, 0x0e, + 0x5c, 0x5d, 0x35, 0x6c, 0x5d, 0x5e, 0x60, 0x62, 0x65, 0x6e, 0x80, 0x90, + 0xa3, 0x95, 0x88, 0x83, 0x7c, 0x73, 0x71, 0x75, 0x6c, 0x62, 0x62, 0x70, + 0x7b, 0x7c, 0x7c, 0x7f, 0x7f, 0x78, 0x76, 0x7a, 0x77, 0x6d, 0x69, 0x6d, + 0x7a, 0x71, 0x6b, 0x6a, 0x65, 0x5b, 0x57, 0x5a, 0x5a, 0x53, 0x4b, 0x4b, + 0x44, 0x2b, 0x24, 0x39, 0x48, 0x5e, 0x68, 0x67, 0x56, 0x52, 0x5b, 0x4b, + 0x43, 0x2b, 0x21, 0x29, 0x38, 0x56, 0x74, 0x7d, 0x81, 0x5f, 0x42, 0x27, + 0x3c, 0x50, 0x42, 0x5c, 0x4a, 0x34, 0x3e, 0x51, 0x52, 0x58, 0x4e, 0x2a, + 0x4a, 0x2f, 0x74, 0x91, 0x4f, 0x52, 0x4e, 0x5e, 0x3f, 0x40, 0x34, 0x51, + 0x84, 0xa3, 0x9d, 0x60, 0x6d, 0xb2, 0xec, 0xf8, 0xf5, 0xe5, 0xab, 0x67, + 0x2d, 0x19, 0x15, 0x28, 0x33, 0x29, 0x22, 0x26, 0x24, 0x2d, 0x25, 0x3c, + 0x5b, 0x9b, 0xdf, 0xc5, 0x43, 0x23, 0x33, 0x38, 0x38, 0x38, 0x26, 0x3a, + 0x3d, 0x35, 0x37, 0x40, 0x3a, 0x28, 0x20, 0x25, 0x29, 0x29, 0x2b, 0x4b, + 0x4c, 0x44, 0x1c, 0x09, 0xe8, 0xe1, 0xdf, 0xe2, 0xe6, 0xee, 0xe7, 0x73, + 0x96, 0xe5, 0xeb, 0xe3, 0xe2, 0xdf, 0xf0, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, + 0xe7, 0xe8, 0xe8, 0xe9, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, 0xe7, 0xe7, + 0xe7, 0xe8, 0xeb, 0xed, 0xed, 0xed, 0xec, 0xeb, 0xed, 0xed, 0xee, 0xee, + 0xef, 0xef, 0xf0, 0xf0, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe8, 0xe5, 0xe0, 0xc7, 0xab, 0xb6, 0xd9, 0xec, + 0xf5, 0xe7, 0xec, 0xda, 0xb4, 0xd6, 0xe5, 0xe8, 0xd6, 0xdc, 0xc6, 0xb8, + 0xb5, 0xd4, 0xfd, 0xed, 0x82, 0x88, 0xad, 0xcb, 0xaf, 0xba, 0x8c, 0x77, + 0xb3, 0x94, 0x83, 0x97, 0xb2, 0x95, 0xe5, 0xe8, 0xea, 0xe3, 0xe6, 0xea, + 0xe7, 0xea, 0xea, 0xe2, 0xe1, 0xd8, 0xdc, 0xe6, 0xe9, 0xee, 0xee, 0xe4, + 0xed, 0xec, 0xed, 0xed, 0xea, 0xe9, 0xe8, 0xe5, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe2, 0xdf, 0xdd, 0xec, 0xdb, 0xdb, 0x79, 0xab, + 0x9f, 0x4a, 0x96, 0xe0, 0xe7, 0xae, 0xda, 0xe8, 0xdd, 0xd2, 0xff, 0xef, + 0x7b, 0x50, 0x79, 0x85, 0xa9, 0x74, 0x74, 0x9c, 0x9a, 0x78, 0x5a, 0x45, + 0x23, 0x22, 0x23, 0x44, 0x7a, 0x91, 0x89, 0x87, 0x66, 0x46, 0x5b, 0x96, + 0xe1, 0xff, 0xfd, 0xfc, 0xff, 0xeb, 0xac, 0x4c, 0x18, 0x0c, 0x06, 0x17, + 0x3b, 0x43, 0x45, 0x50, 0x90, 0x7e, 0x6a, 0x78, 0x78, 0x66, 0x5b, 0x64, + 0x78, 0x8d, 0xa2, 0xb1, 0xa3, 0x88, 0x6a, 0x5a, 0x5c, 0x65, 0x6f, 0x76, + 0x60, 0x60, 0x67, 0x6f, 0x6f, 0x6a, 0x70, 0x7b, 0x80, 0x75, 0x6f, 0x6f, + 0x6b, 0x64, 0x65, 0x6c, 0x7c, 0x71, 0x69, 0x68, 0x66, 0x60, 0x61, 0x66, + 0x6d, 0x54, 0x43, 0x42, 0x59, 0x82, 0x87, 0x65, 0x86, 0xa7, 0x8d, 0x63, + 0x37, 0x28, 0x4c, 0x52, 0x32, 0x3b, 0x56, 0x6b, 0x60, 0x4b, 0x4b, 0x57, + 0x51, 0x40, 0x3a, 0x66, 0x78, 0x70, 0x69, 0x39, 0x3a, 0x32, 0x3d, 0x44, + 0x3b, 0x3c, 0x3f, 0x31, 0x4e, 0x4e, 0x95, 0x88, 0x3f, 0x49, 0x55, 0x64, + 0x3a, 0x31, 0x43, 0x44, 0x5c, 0x8a, 0xa5, 0x73, 0x9d, 0x8e, 0x6c, 0x41, + 0x21, 0x19, 0x22, 0x2c, 0x23, 0x2c, 0x2f, 0x29, 0x27, 0x2e, 0x32, 0x31, + 0x17, 0x32, 0x2d, 0x20, 0x29, 0x74, 0xda, 0xec, 0xca, 0x50, 0x21, 0x34, + 0x45, 0x4c, 0x38, 0x28, 0x49, 0x38, 0x2b, 0x2e, 0x32, 0x33, 0x38, 0x41, + 0x48, 0x3e, 0x34, 0x4e, 0x4f, 0x4c, 0x27, 0x15, 0xed, 0xed, 0xe2, 0xd8, + 0xdd, 0xe9, 0xe2, 0x6c, 0x9c, 0xff, 0xf4, 0xd8, 0xe6, 0xdf, 0xe1, 0xe1, + 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe5, + 0xe5, 0xe4, 0xe3, 0xe3, 0xe9, 0xea, 0xeb, 0xec, 0xeb, 0xe9, 0xe7, 0xe5, + 0xeb, 0xec, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf0, 0xeb, 0xeb, 0xeb, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xed, 0xf0, 0xf1, + 0xd9, 0xaa, 0xa0, 0xc0, 0xf8, 0xea, 0xe7, 0xdf, 0xc7, 0xd1, 0xc1, 0xc3, + 0xea, 0xd3, 0xab, 0x9f, 0xdb, 0xf9, 0xdd, 0xe9, 0xc1, 0x72, 0x8b, 0xcb, + 0xb5, 0xda, 0xaa, 0x55, 0x72, 0x96, 0xad, 0xa1, 0xa0, 0x97, 0xf5, 0xe2, + 0xe7, 0xeb, 0xe6, 0xe3, 0xe8, 0xe4, 0xde, 0xe2, 0xe2, 0xde, 0xe5, 0xeb, + 0xeb, 0xed, 0xea, 0xdd, 0xe9, 0xec, 0xed, 0xee, 0xef, 0xed, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xf1, 0xea, 0xcf, 0xdf, + 0xe7, 0xeb, 0x7f, 0xa5, 0xbe, 0x5d, 0xb4, 0xe8, 0xd1, 0xa0, 0xd7, 0xed, + 0xf1, 0xff, 0xd1, 0x7e, 0x69, 0x84, 0x84, 0x6a, 0x70, 0x81, 0x93, 0x6c, + 0x1d, 0x07, 0x31, 0x53, 0x73, 0x93, 0x9a, 0x7b, 0x4e, 0x39, 0x62, 0xa7, + 0xf5, 0xff, 0xf2, 0xf8, 0xff, 0xf6, 0x9e, 0x26, 0x03, 0x23, 0x26, 0x21, + 0x32, 0x36, 0x45, 0x74, 0x73, 0x79, 0x6a, 0x70, 0x87, 0x6b, 0x7b, 0x60, + 0x79, 0x6c, 0x6b, 0x77, 0x7e, 0x7c, 0x81, 0x8c, 0x72, 0x79, 0x7a, 0x72, + 0x6a, 0x6c, 0x76, 0x7f, 0x5c, 0x58, 0x5d, 0x6e, 0x79, 0x78, 0x74, 0x76, + 0x77, 0x73, 0x76, 0x7f, 0x7e, 0x74, 0x70, 0x73, 0x72, 0x69, 0x67, 0x6f, + 0x73, 0x6b, 0x61, 0x5d, 0x54, 0x4a, 0x54, 0x4c, 0x4a, 0x9a, 0xe4, 0xdb, + 0xbb, 0xae, 0x91, 0x83, 0x65, 0x60, 0x67, 0x2c, 0x3e, 0x66, 0x80, 0x7a, + 0x6d, 0x65, 0x5c, 0x54, 0x7d, 0x82, 0x62, 0x46, 0x38, 0x4e, 0x67, 0x38, + 0x25, 0x40, 0x62, 0x65, 0x46, 0x35, 0x3c, 0x42, 0x4b, 0x52, 0x98, 0x76, + 0x36, 0x35, 0x37, 0x36, 0x43, 0x35, 0x43, 0x20, 0x4c, 0x7b, 0x8e, 0x7e, + 0x3e, 0x2a, 0x23, 0x2c, 0x2e, 0x23, 0x22, 0x2d, 0x24, 0x27, 0x21, 0x1c, + 0x26, 0x35, 0x32, 0x22, 0x23, 0x2a, 0x2a, 0x2a, 0x25, 0x45, 0x91, 0xc0, + 0xd8, 0x97, 0x4d, 0x45, 0x54, 0x5c, 0x6d, 0x66, 0x4a, 0x38, 0x26, 0x22, + 0x26, 0x28, 0x2b, 0x2e, 0x3b, 0x3a, 0x3d, 0x5e, 0x5d, 0x4e, 0x1b, 0x00, + 0xe7, 0xdf, 0xdf, 0xec, 0xf5, 0xce, 0x9d, 0x45, 0x64, 0xc0, 0xf4, 0xfa, + 0xe9, 0xdd, 0xe7, 0xde, 0xe2, 0xe2, 0xe3, 0xe3, 0xe4, 0xe5, 0xe5, 0xe6, + 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe5, 0xe9, 0xea, 0xeb, 0xeb, + 0xe9, 0xe7, 0xe4, 0xe2, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xee, 0xef, 0xef, + 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xee, 0xee, 0xed, 0xec, + 0xea, 0xe9, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xe9, 0xe5, 0xf5, 0xf4, 0xbf, 0xa0, 0xbb, 0xcf, 0xda, 0xd1, 0xe7, + 0xdc, 0xd4, 0xcf, 0xc6, 0xcd, 0xdf, 0xb3, 0x9a, 0xc4, 0xda, 0xcd, 0xc6, + 0xc9, 0x81, 0x74, 0xb7, 0xb4, 0xba, 0xb9, 0x76, 0x69, 0x7d, 0xb0, 0x84, + 0x88, 0xa5, 0xec, 0xf7, 0xee, 0xf5, 0xe7, 0xda, 0xdd, 0xd8, 0xd6, 0xe6, + 0xea, 0xeb, 0xf1, 0xef, 0xe6, 0xe7, 0xe6, 0xda, 0xe0, 0xe7, 0xe9, 0xeb, + 0xf2, 0xef, 0xea, 0xed, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe5, 0xee, 0xd9, 0xdb, 0xeb, 0xfb, 0x96, 0x9a, 0xbe, 0x6e, 0xc8, 0xf5, + 0xda, 0x9a, 0xc8, 0xef, 0xfd, 0xd7, 0x7c, 0x4e, 0x75, 0x91, 0x88, 0x8e, + 0x7c, 0x7f, 0x87, 0x7e, 0x7a, 0x95, 0x99, 0x73, 0x4d, 0x52, 0x77, 0xc7, + 0xff, 0xff, 0xf2, 0xff, 0xf5, 0xe9, 0x83, 0x24, 0x00, 0x12, 0x55, 0x58, + 0x79, 0xaa, 0x76, 0x65, 0x54, 0x3c, 0x74, 0x83, 0x5f, 0x5a, 0x80, 0x97, + 0x95, 0x87, 0xbb, 0xc3, 0xa7, 0x85, 0x6e, 0x73, 0x77, 0x69, 0x5d, 0x5c, + 0x43, 0x52, 0x5e, 0x62, 0x64, 0x68, 0x65, 0x5d, 0x53, 0x59, 0x69, 0x7a, + 0x7e, 0x7a, 0x80, 0x8c, 0x8b, 0x82, 0x7c, 0x7c, 0x77, 0x6c, 0x69, 0x6e, + 0x77, 0x6a, 0x64, 0x69, 0x6b, 0x65, 0x5c, 0x59, 0x5f, 0x47, 0x49, 0x4c, + 0x69, 0xbf, 0xd1, 0x7f, 0xa4, 0xd3, 0x8e, 0x43, 0x3d, 0x23, 0x26, 0x63, + 0x43, 0x52, 0x55, 0x56, 0x61, 0x61, 0x5c, 0x60, 0x50, 0x6a, 0x79, 0x51, + 0x41, 0x42, 0x30, 0x45, 0x30, 0x3a, 0x49, 0x4f, 0x49, 0x3e, 0x34, 0x2d, + 0x37, 0x3c, 0x8d, 0x7c, 0x5d, 0x58, 0x54, 0x4d, 0x59, 0x56, 0x56, 0x4c, + 0xa7, 0x9e, 0x87, 0x80, 0x56, 0x3d, 0x2a, 0x31, 0x42, 0x44, 0x33, 0x23, + 0x25, 0x29, 0x31, 0x38, 0x39, 0x39, 0x3d, 0x44, 0x59, 0x43, 0x48, 0x63, + 0x58, 0x3b, 0x4e, 0x7c, 0xb9, 0xce, 0x7a, 0x3f, 0x4b, 0x4f, 0x4b, 0x35, + 0x36, 0x31, 0x2f, 0x34, 0x3b, 0x3d, 0x39, 0x34, 0x3b, 0x39, 0x37, 0x53, + 0x50, 0x46, 0x1d, 0x09, 0xe9, 0xe5, 0xe4, 0xd2, 0xa7, 0x49, 0x32, 0x4e, + 0x5e, 0x33, 0x69, 0xdf, 0xff, 0xe7, 0xdb, 0xd6, 0xe1, 0xe1, 0xe2, 0xe2, + 0xe3, 0xe4, 0xe4, 0xe5, 0xe9, 0xe9, 0xe9, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, + 0xe5, 0xe6, 0xe8, 0xe9, 0xe9, 0xe7, 0xe5, 0xe4, 0xe5, 0xe6, 0xe7, 0xe9, + 0xea, 0xec, 0xed, 0xee, 0xe8, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xed, + 0xef, 0xef, 0xed, 0xec, 0xea, 0xe9, 0xe7, 0xe7, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe3, 0xf9, 0xf2, 0xdf, 0xe0, 0xd5, 0xb3, 0x99, + 0xb9, 0xdc, 0xee, 0xf9, 0xcd, 0xc3, 0xd3, 0xd3, 0xcd, 0xd9, 0xb5, 0xd1, + 0xe1, 0xc9, 0xed, 0xff, 0xad, 0x83, 0x66, 0x89, 0xc6, 0xd3, 0xc2, 0x79, + 0x85, 0x7e, 0xae, 0x83, 0x94, 0xa7, 0xcc, 0xe3, 0xe6, 0xeb, 0xe8, 0xdd, + 0xd4, 0xd3, 0xde, 0xec, 0xe6, 0xe9, 0xed, 0xe3, 0xd6, 0xdc, 0xe6, 0xe2, + 0xdf, 0xe9, 0xe7, 0xe7, 0xee, 0xe7, 0xde, 0xe1, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe3, 0xec, 0xea, 0xd5, 0xd0, 0xe9, 0xaa, 0x98, + 0xb3, 0x62, 0x9f, 0xdd, 0xe0, 0xa2, 0xdd, 0xff, 0xb3, 0x79, 0x6d, 0x8d, + 0x90, 0x7f, 0x7e, 0x85, 0x9d, 0x6f, 0x71, 0x86, 0x6f, 0x65, 0x9c, 0xdb, + 0xf6, 0xff, 0xff, 0xfe, 0xf7, 0xc3, 0x68, 0x26, 0x02, 0x0c, 0x17, 0x2f, + 0x47, 0x4d, 0x41, 0x29, 0x4d, 0x48, 0x28, 0x5a, 0x51, 0x39, 0x87, 0x88, + 0xa2, 0xb6, 0xde, 0xc7, 0xa1, 0x96, 0xc4, 0xb8, 0x97, 0x70, 0x5b, 0x6e, + 0x82, 0x7b, 0x6e, 0x6b, 0x6a, 0x67, 0x5d, 0x57, 0x64, 0x77, 0x79, 0x6d, + 0x66, 0x72, 0x81, 0x81, 0x6f, 0x63, 0x72, 0x8a, 0xa2, 0x92, 0x84, 0x7c, + 0x74, 0x6c, 0x6f, 0x79, 0x75, 0x6b, 0x63, 0x61, 0x5d, 0x57, 0x58, 0x5f, + 0x5a, 0x55, 0x42, 0x38, 0x7a, 0xea, 0xee, 0x91, 0x95, 0x33, 0x48, 0x65, + 0x32, 0x3b, 0x64, 0x59, 0x58, 0x5c, 0x60, 0x75, 0x82, 0x67, 0x4e, 0x58, + 0x88, 0x56, 0x3a, 0x2d, 0x38, 0x30, 0x24, 0x57, 0x5e, 0x59, 0x4e, 0x45, + 0x42, 0x3d, 0x39, 0x39, 0x40, 0x56, 0xa2, 0x6a, 0x3f, 0x38, 0x3b, 0x30, + 0x4b, 0x59, 0x6b, 0x96, 0xc7, 0x6a, 0x87, 0x92, 0x7a, 0x49, 0x2c, 0x3b, + 0x49, 0x41, 0x42, 0x52, 0x3b, 0x4a, 0x5f, 0x6b, 0x69, 0x60, 0x55, 0x4e, + 0x62, 0x6a, 0x6e, 0x63, 0x5f, 0x5a, 0x46, 0x3a, 0x82, 0xd2, 0xce, 0x7c, + 0x47, 0x41, 0x47, 0x47, 0x47, 0x3f, 0x32, 0x27, 0x26, 0x2b, 0x2f, 0x30, + 0x30, 0x39, 0x45, 0x65, 0x5e, 0x4b, 0x1c, 0x06, 0xea, 0xe4, 0x97, 0x22, + 0x0f, 0x10, 0x1c, 0x34, 0x2e, 0x24, 0x0e, 0x1a, 0x76, 0xd0, 0xe4, 0xde, + 0xe0, 0xe0, 0xe1, 0xe2, 0xe2, 0xe3, 0xe4, 0xe4, 0xe1, 0xe1, 0xe0, 0xdf, + 0xdf, 0xde, 0xdd, 0xdd, 0xe1, 0xe3, 0xe5, 0xe8, 0xe9, 0xe9, 0xe8, 0xe7, + 0xe3, 0xe4, 0xe5, 0xe7, 0xe9, 0xeb, 0xec, 0xed, 0xe7, 0xe8, 0xe9, 0xea, + 0xeb, 0xec, 0xec, 0xed, 0xf0, 0xef, 0xee, 0xec, 0xea, 0xe8, 0xe7, 0xe6, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xe9, 0xe7, 0xe8, + 0xe9, 0xe7, 0xe3, 0xdf, 0x9d, 0xa4, 0xcb, 0xd3, 0xb6, 0xd6, 0xd9, 0xcc, + 0xdf, 0xc0, 0xad, 0xce, 0xf1, 0xe8, 0xe4, 0xf6, 0xdf, 0xcb, 0xb7, 0x7e, + 0xb9, 0xe4, 0xc7, 0x8a, 0x77, 0x97, 0xb5, 0x82, 0x92, 0xa5, 0xdf, 0xe8, + 0xd4, 0xd7, 0xe6, 0xe7, 0xd5, 0xd7, 0xea, 0xf1, 0xd8, 0xdc, 0xdf, 0xd3, + 0xc6, 0xd4, 0xe9, 0xed, 0xe7, 0xf0, 0xea, 0xe5, 0xe8, 0xdc, 0xcd, 0xd0, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xf4, 0xeb, 0xf7, 0xde, + 0xcc, 0xe4, 0xbc, 0x99, 0xcc, 0x6a, 0x8a, 0xdc, 0xec, 0xa6, 0xde, 0xe1, + 0x86, 0x88, 0x83, 0x7b, 0x7b, 0x80, 0x72, 0x5b, 0x4d, 0x6c, 0x8d, 0x96, + 0xa8, 0xdf, 0xf0, 0xc6, 0xda, 0x8e, 0x31, 0x13, 0x30, 0x3b, 0x27, 0x19, + 0x48, 0x5f, 0x84, 0x71, 0x66, 0x6b, 0x46, 0x35, 0x44, 0x36, 0x4d, 0x61, + 0x40, 0x6a, 0xc5, 0xbb, 0xc8, 0xba, 0xb1, 0xbe, 0xb0, 0x85, 0xb8, 0xac, + 0x9e, 0x7f, 0x6b, 0x6a, 0x61, 0x51, 0x5a, 0x72, 0x6a, 0x81, 0x90, 0x8c, + 0x87, 0x87, 0x80, 0x73, 0x71, 0x6f, 0x70, 0x71, 0x6b, 0x67, 0x73, 0x85, + 0x6f, 0x69, 0x68, 0x6d, 0x6d, 0x68, 0x68, 0x6f, 0x5f, 0x61, 0x67, 0x69, + 0x60, 0x53, 0x54, 0x5d, 0x60, 0x59, 0x53, 0x54, 0x47, 0x27, 0x16, 0x1e, + 0x35, 0x45, 0x46, 0x31, 0x4a, 0x4e, 0x28, 0x40, 0x59, 0x75, 0x74, 0x68, + 0x6f, 0x6e, 0x67, 0x6f, 0x68, 0x45, 0x2f, 0x4c, 0x42, 0x29, 0x3e, 0x3b, + 0x56, 0x49, 0x35, 0x33, 0x44, 0x4e, 0x4a, 0x48, 0x2e, 0x6a, 0xba, 0x53, + 0x17, 0x29, 0x4c, 0x47, 0x3d, 0x32, 0x57, 0xc8, 0xcc, 0x3b, 0x8b, 0x75, + 0x65, 0x68, 0x67, 0x60, 0x5e, 0x64, 0x68, 0x68, 0x42, 0x5f, 0x69, 0x56, + 0x4b, 0x55, 0x58, 0x4d, 0x61, 0x64, 0x64, 0x59, 0x60, 0x65, 0x4c, 0x3c, + 0x6a, 0x96, 0xd4, 0x96, 0x35, 0x31, 0x3c, 0x37, 0x4a, 0x45, 0x39, 0x2c, + 0x27, 0x2d, 0x33, 0x36, 0x39, 0x41, 0x4b, 0x66, 0x59, 0x45, 0x1a, 0x09, + 0xf3, 0xf7, 0xd2, 0xa4, 0xbe, 0xad, 0x8a, 0x84, 0x5f, 0x56, 0x9b, 0xa0, + 0xd3, 0xe2, 0xec, 0xd5, 0xde, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe2, + 0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe4, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xf0, 0xd4, 0xf4, 0xe9, 0xe1, 0xe5, 0xf2, 0xe7, 0xea, 0xec, 0xee, 0xef, + 0xee, 0xeb, 0xe7, 0xe5, 0xef, 0xe8, 0xe3, 0xe6, 0xe9, 0xe4, 0xe1, 0xe3, + 0xe1, 0xda, 0xe0, 0xe8, 0xd1, 0xb2, 0xe4, 0xf1, 0xda, 0xcb, 0xd9, 0xc6, + 0xcf, 0xd1, 0xd9, 0xc6, 0xec, 0xc1, 0xb8, 0xd2, 0xea, 0xec, 0xd1, 0xd5, + 0xd3, 0xd9, 0xda, 0x9f, 0x91, 0xba, 0xd8, 0x9d, 0x83, 0x62, 0x88, 0x87, + 0x6d, 0x8c, 0xe3, 0xe7, 0xe1, 0xf1, 0xd4, 0xcc, 0xd5, 0xd7, 0xea, 0xf5, + 0xcb, 0xd9, 0xee, 0xf4, 0xd3, 0xcd, 0xe8, 0xd8, 0xdb, 0xea, 0xea, 0xe9, + 0xe2, 0xc7, 0xc4, 0xe4, 0xeb, 0xef, 0xeb, 0xe0, 0xdf, 0xe8, 0xe9, 0xe3, + 0xe9, 0xef, 0xe7, 0xee, 0xe4, 0xc8, 0xc8, 0xa9, 0xad, 0x4f, 0x5e, 0xb6, + 0xe5, 0xac, 0xbb, 0x7b, 0x77, 0x66, 0x67, 0x60, 0x4e, 0x70, 0xc3, 0xfe, + 0xf8, 0xff, 0xcd, 0x92, 0x85, 0x6f, 0x4b, 0x41, 0x1a, 0x24, 0x21, 0x1f, + 0x3f, 0x6b, 0x74, 0x64, 0x4a, 0x4f, 0x40, 0x34, 0x36, 0x33, 0x49, 0x78, + 0x54, 0x2b, 0x38, 0x7b, 0x54, 0x49, 0xac, 0xb2, 0xb4, 0xb3, 0xaf, 0xb6, + 0xa0, 0x7e, 0xbf, 0xb3, 0x8d, 0x71, 0x5d, 0x64, 0x72, 0x73, 0x6b, 0x66, + 0x73, 0x7c, 0x81, 0x7f, 0x82, 0x87, 0x81, 0x75, 0x62, 0x6f, 0x76, 0x72, + 0x70, 0x75, 0x78, 0x76, 0x64, 0x6d, 0x7a, 0x83, 0x82, 0x78, 0x6b, 0x61, + 0x58, 0x5a, 0x5f, 0x65, 0x67, 0x62, 0x57, 0x4d, 0x54, 0x51, 0x54, 0x5f, + 0x4a, 0x42, 0x6d, 0x86, 0x7d, 0x66, 0x57, 0x44, 0x2c, 0x37, 0x53, 0x59, + 0x4f, 0x5b, 0x68, 0x6b, 0x63, 0x5a, 0x57, 0x59, 0x71, 0x43, 0x3f, 0x40, + 0x4e, 0x52, 0x34, 0x3d, 0x3c, 0x44, 0x3f, 0x2e, 0x2d, 0x48, 0x6b, 0x7f, + 0x59, 0x76, 0x95, 0x65, 0x58, 0x5e, 0x32, 0x3f, 0x48, 0x31, 0x50, 0xe2, + 0x87, 0x41, 0x87, 0x76, 0x5b, 0x50, 0x5a, 0x4c, 0x42, 0x55, 0x5b, 0x5d, + 0x5d, 0x58, 0x63, 0x4e, 0x49, 0x57, 0x47, 0x4a, 0x4f, 0x6c, 0x6b, 0x52, + 0x4e, 0x57, 0x5b, 0x5e, 0x42, 0x4c, 0x9b, 0xca, 0x89, 0x47, 0x46, 0x50, + 0x2e, 0x40, 0x37, 0x38, 0x37, 0x36, 0x42, 0x34, 0x2a, 0x3c, 0x29, 0x3e, + 0x4f, 0x46, 0x1d, 0x11, 0xe7, 0xeb, 0xdb, 0xbf, 0xdb, 0xd7, 0xda, 0xfa, + 0xe2, 0xf2, 0xe7, 0xc8, 0xec, 0xe3, 0xe3, 0xd3, 0xde, 0xde, 0xdf, 0xdf, + 0xe0, 0xe1, 0xe1, 0xe2, 0xdf, 0xe0, 0xe1, 0xe3, 0xe4, 0xe6, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xee, 0xdd, 0xe8, 0xef, 0xe1, 0xe8, 0xec, 0xec, + 0xea, 0xeb, 0xed, 0xee, 0xed, 0xeb, 0xe8, 0xe5, 0xe8, 0xef, 0xea, 0xe6, + 0xed, 0xec, 0xe5, 0xe7, 0xc8, 0xdf, 0xdd, 0xe3, 0xcf, 0x95, 0xc3, 0xea, + 0xd8, 0xdb, 0xce, 0xba, 0xe5, 0xe0, 0xce, 0xc9, 0xf0, 0xa3, 0xdf, 0xf6, + 0xed, 0xd9, 0xc2, 0xbe, 0xc5, 0xf7, 0xd7, 0xd1, 0xa9, 0x6a, 0xaf, 0x86, + 0x79, 0x82, 0x9f, 0x95, 0x9c, 0xb5, 0xe7, 0xea, 0xcb, 0xcb, 0xd6, 0xde, + 0xc8, 0xd7, 0xfa, 0xdf, 0xd8, 0xf2, 0xdc, 0xe2, 0xd6, 0xcd, 0xee, 0xd2, + 0xc8, 0xe0, 0xe3, 0xeb, 0xdc, 0xd3, 0xf0, 0xf2, 0xf2, 0xeb, 0xe8, 0xee, + 0xf0, 0xeb, 0xe7, 0xe8, 0xe4, 0xea, 0xe2, 0xea, 0xf1, 0xe5, 0xc4, 0xb7, + 0xae, 0x4f, 0x7f, 0xc1, 0xd5, 0x87, 0x4b, 0x3a, 0x64, 0x75, 0xb4, 0xef, + 0xfa, 0xf9, 0xf9, 0xec, 0xaa, 0x86, 0x43, 0x26, 0x3e, 0x43, 0x38, 0x43, + 0x64, 0x4e, 0x4d, 0x76, 0x89, 0x5f, 0x38, 0x3f, 0x61, 0x3b, 0x30, 0x49, + 0x56, 0x4c, 0x41, 0x40, 0x44, 0x56, 0x64, 0x76, 0x4e, 0x5d, 0xc3, 0xce, + 0xb1, 0xb6, 0xc5, 0xd4, 0xb6, 0x89, 0xc1, 0xb4, 0x84, 0x6f, 0x65, 0x72, + 0x7f, 0x7a, 0x6a, 0x5f, 0x6b, 0x6e, 0x6b, 0x68, 0x6e, 0x76, 0x70, 0x61, + 0x5e, 0x78, 0x8b, 0x84, 0x74, 0x70, 0x76, 0x7c, 0x81, 0x7f, 0x7b, 0x75, + 0x6d, 0x66, 0x5f, 0x5b, 0x71, 0x72, 0x74, 0x76, 0x76, 0x6e, 0x61, 0x57, + 0x5f, 0x43, 0x4f, 0x66, 0x37, 0x15, 0x2b, 0x29, 0x0e, 0x3d, 0x58, 0x53, + 0x42, 0x27, 0x23, 0x3d, 0x6a, 0x66, 0x6b, 0x72, 0x6a, 0x5b, 0x5d, 0x6b, + 0x73, 0x3c, 0x34, 0x3b, 0x40, 0x38, 0x2c, 0x4f, 0x36, 0x36, 0x46, 0x59, + 0x54, 0x3d, 0x38, 0x45, 0x11, 0x54, 0x8c, 0x66, 0x43, 0x3d, 0x30, 0x4f, + 0x67, 0x33, 0x9d, 0xf7, 0x6f, 0x2b, 0x66, 0x83, 0x67, 0x52, 0x62, 0x64, + 0x59, 0x55, 0x48, 0x48, 0x59, 0x45, 0x49, 0x56, 0x5c, 0x56, 0x4b, 0x55, + 0x5c, 0x51, 0x5e, 0x5f, 0x4d, 0x5a, 0x6c, 0x5c, 0x55, 0x49, 0x6f, 0xbc, + 0xc1, 0x69, 0x28, 0x2d, 0x47, 0x31, 0x28, 0x27, 0x41, 0x48, 0x37, 0x4f, + 0x60, 0x59, 0x49, 0x58, 0x50, 0x49, 0x24, 0x07, 0xe1, 0xe1, 0xda, 0xba, + 0xc3, 0xb0, 0xa2, 0xb4, 0xaf, 0xda, 0xb8, 0xc2, 0xeb, 0xe0, 0xe9, 0xe1, + 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, 0xe0, 0xe1, 0xe2, 0xe3, + 0xe5, 0xe6, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xeb, 0xdb, 0xf0, + 0xe2, 0xea, 0xe8, 0xef, 0xea, 0xeb, 0xec, 0xec, 0xec, 0xea, 0xe8, 0xe7, + 0xdd, 0xed, 0xed, 0xe7, 0xec, 0xee, 0xe8, 0xe7, 0xdb, 0xe1, 0xdf, 0xea, + 0xd6, 0xaf, 0xe3, 0xec, 0xd9, 0xd4, 0xd9, 0xcd, 0xd1, 0xd5, 0xe6, 0xe2, + 0xc6, 0xcb, 0xf3, 0xc9, 0xe9, 0xd8, 0xc8, 0xe4, 0xe9, 0xc2, 0xd7, 0xd0, + 0xc3, 0xae, 0xae, 0xa2, 0x8e, 0x7e, 0x73, 0x61, 0x83, 0xa6, 0xd8, 0xe9, + 0xd9, 0xcd, 0xd6, 0xe4, 0xd5, 0xde, 0xf2, 0xd5, 0xd7, 0xe3, 0xc9, 0xdb, + 0xd7, 0xbb, 0xdd, 0xec, 0xde, 0xd9, 0xe9, 0xf2, 0xd7, 0xd7, 0xec, 0xda, + 0xe6, 0xe3, 0xe7, 0xef, 0xee, 0xe3, 0xe0, 0xe5, 0xe7, 0xda, 0xe2, 0xf0, + 0xe3, 0xf4, 0xbc, 0x96, 0xd4, 0x61, 0x6e, 0xdf, 0xbc, 0x67, 0xaa, 0xff, + 0xff, 0xef, 0xff, 0xf9, 0x9f, 0x3c, 0x1a, 0x1e, 0x1f, 0x29, 0x36, 0x4f, + 0x5f, 0x51, 0x54, 0x78, 0x57, 0x69, 0x62, 0x45, 0x46, 0x67, 0x66, 0x40, + 0x68, 0x3c, 0x3b, 0x4d, 0x3a, 0x2f, 0x49, 0x5f, 0x57, 0x61, 0x64, 0x56, + 0x22, 0x50, 0xcb, 0xd4, 0xcd, 0xce, 0xc5, 0xac, 0x96, 0x95, 0xd6, 0xb8, + 0x8f, 0x78, 0x68, 0x70, 0x7c, 0x7b, 0x74, 0x70, 0x72, 0x6e, 0x67, 0x69, + 0x7b, 0x8e, 0x8b, 0x7c, 0x80, 0x85, 0x82, 0x7b, 0x7b, 0x84, 0x88, 0x84, + 0x6f, 0x72, 0x76, 0x77, 0x75, 0x6f, 0x68, 0x63, 0x69, 0x69, 0x6a, 0x6b, + 0x6b, 0x63, 0x57, 0x4d, 0x4e, 0x4b, 0x50, 0x54, 0x52, 0x93, 0xf4, 0xff, + 0xfc, 0xee, 0xb5, 0x73, 0x4a, 0x30, 0x2f, 0x49, 0x4e, 0x6f, 0x7b, 0x68, + 0x60, 0x6a, 0x60, 0x44, 0x42, 0x3c, 0x46, 0x42, 0x4a, 0x5c, 0x5b, 0x65, + 0x4d, 0x4c, 0x4f, 0x57, 0x62, 0x60, 0x4c, 0x36, 0x31, 0x7e, 0xa3, 0x6b, + 0x2f, 0x29, 0x4e, 0x80, 0x5a, 0x1e, 0xcf, 0xd5, 0x4d, 0x3e, 0x65, 0x8d, + 0x76, 0x4d, 0x53, 0x5f, 0x5c, 0x57, 0x50, 0x5c, 0x4f, 0x5e, 0x60, 0x5e, + 0x53, 0x49, 0x50, 0x4e, 0x48, 0x50, 0x40, 0x3d, 0x53, 0x4d, 0x42, 0x55, + 0x2d, 0x30, 0x3f, 0x8f, 0xdd, 0xb7, 0x7a, 0x88, 0x82, 0x92, 0x8d, 0x6a, + 0x6b, 0x61, 0x35, 0x36, 0x2f, 0x32, 0x30, 0x3c, 0x2d, 0x2d, 0x17, 0x0e, + 0xdd, 0xe0, 0xe0, 0xb4, 0xb9, 0xb3, 0xa5, 0xb2, 0xb9, 0xce, 0xb4, 0xe2, + 0xe9, 0xdb, 0xe6, 0xde, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe2, 0xe4, 0xe5, 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe2, 0xf3, 0xda, 0xe3, 0xe6, 0xea, 0xec, 0xed, 0xe9, 0xea, 0xea, 0xea, + 0xea, 0xe9, 0xe9, 0xe8, 0xda, 0xdd, 0xe7, 0xeb, 0xe7, 0xe7, 0xe9, 0xe5, + 0xd1, 0xc2, 0xd9, 0xf6, 0xe5, 0xbc, 0xd5, 0xd4, 0xef, 0xe7, 0xcd, 0xbd, + 0xc1, 0xc6, 0xd9, 0xe1, 0xbf, 0xdb, 0xfa, 0xdc, 0xd5, 0xbb, 0xd2, 0xdc, + 0xa9, 0xcd, 0xff, 0xff, 0xf0, 0xc0, 0xa5, 0x9f, 0xae, 0x7c, 0x7e, 0x91, + 0xb2, 0xc2, 0xe4, 0xe2, 0xcc, 0xe4, 0xcb, 0xc2, 0xea, 0xf0, 0xd1, 0xc4, + 0xfc, 0xe9, 0xe4, 0xee, 0xe0, 0xbd, 0xbf, 0xe7, 0xe2, 0xb7, 0xde, 0xeb, + 0xde, 0xeb, 0xe0, 0xdf, 0xd9, 0xe4, 0xeb, 0xe8, 0xe1, 0xdf, 0xe3, 0xe5, + 0xf0, 0xee, 0xec, 0xf3, 0xe0, 0xff, 0xbf, 0x86, 0xdd, 0x60, 0x4d, 0xd7, + 0xff, 0xcd, 0xa5, 0xdc, 0x8a, 0x3b, 0x2b, 0x51, 0x40, 0x1b, 0x32, 0x63, + 0x62, 0x57, 0x50, 0x5c, 0x66, 0x5a, 0x4e, 0x51, 0x6f, 0x67, 0x87, 0x9b, + 0x88, 0x89, 0x95, 0x84, 0x43, 0x27, 0x2a, 0x43, 0x46, 0x3f, 0x41, 0x42, + 0x31, 0x37, 0x34, 0x3f, 0x3f, 0x5d, 0xa8, 0xbf, 0xaa, 0x7a, 0x74, 0x97, + 0xa9, 0x90, 0xb8, 0xb8, 0x91, 0x7a, 0x69, 0x6e, 0x77, 0x78, 0x77, 0x79, + 0x73, 0x67, 0x57, 0x54, 0x67, 0x7a, 0x74, 0x61, 0x61, 0x6f, 0x71, 0x61, + 0x51, 0x51, 0x59, 0x5f, 0x62, 0x69, 0x71, 0x77, 0x74, 0x6a, 0x5e, 0x55, + 0x5a, 0x5a, 0x5b, 0x5e, 0x60, 0x5b, 0x52, 0x4a, 0x58, 0x4d, 0x50, 0x98, + 0xe9, 0xfd, 0xd1, 0x8a, 0x47, 0x2a, 0x20, 0x24, 0x27, 0x3b, 0x47, 0x3a, + 0x53, 0x5a, 0x68, 0x74, 0x6e, 0x59, 0x46, 0x3f, 0x73, 0x82, 0x81, 0x66, + 0x62, 0x71, 0x67, 0x51, 0x58, 0x6a, 0x68, 0x47, 0x2d, 0x33, 0x46, 0x50, + 0x2e, 0x53, 0x55, 0x47, 0x4a, 0x5a, 0x5f, 0x48, 0x36, 0x3c, 0xef, 0x96, + 0x25, 0x48, 0x68, 0x81, 0x6b, 0x43, 0x4b, 0x5e, 0x62, 0x60, 0x55, 0x5a, + 0x45, 0x62, 0x5b, 0x58, 0x51, 0x50, 0x65, 0x59, 0x52, 0x4c, 0x51, 0x55, + 0x51, 0x5a, 0x64, 0x60, 0x8f, 0x7f, 0x57, 0x65, 0xb7, 0xd9, 0xa2, 0x68, + 0x58, 0x5f, 0x45, 0x41, 0x38, 0x1f, 0x2f, 0x44, 0x65, 0x6d, 0x65, 0x78, + 0x88, 0x75, 0x20, 0x02, 0xe2, 0xe7, 0xed, 0xba, 0xaa, 0x88, 0x6a, 0x85, + 0xb8, 0xb8, 0xb0, 0xe2, 0xdc, 0xe2, 0xdd, 0xd0, 0xdc, 0xdc, 0xdd, 0xdd, + 0xde, 0xdf, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe5, 0xe6, 0xe8, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xde, 0xf2, 0xdf, 0xd0, 0xe9, 0xe7, 0xf2, 0xe7, + 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xe4, 0xcf, 0xdf, 0xf3, + 0xe5, 0xe1, 0xeb, 0xe7, 0xc5, 0xc1, 0xe1, 0xef, 0xdf, 0xa3, 0xaa, 0xdf, + 0xe1, 0xd6, 0xd1, 0xdc, 0xca, 0xd2, 0xf2, 0xea, 0xb4, 0xe5, 0xff, 0xd7, + 0x9f, 0xb9, 0xdc, 0xb4, 0xd7, 0xef, 0xeb, 0xca, 0xef, 0xd6, 0xa6, 0xa4, + 0x5c, 0x49, 0x63, 0x70, 0x81, 0x94, 0xce, 0xe4, 0xe5, 0xe3, 0xba, 0xbc, + 0xf1, 0xdd, 0xb8, 0xde, 0xe8, 0xd4, 0xdc, 0xe9, 0xe8, 0xe0, 0xd6, 0xd9, + 0xf0, 0xcb, 0xe1, 0xe2, 0xdb, 0xe2, 0xd1, 0xdd, 0xe6, 0xe6, 0xe5, 0xe5, + 0xe5, 0xe6, 0xea, 0xed, 0xde, 0xed, 0xd4, 0xe3, 0xca, 0xaa, 0x67, 0x75, + 0xc6, 0x6e, 0x56, 0xde, 0xe5, 0x82, 0x33, 0x1d, 0x18, 0x00, 0x21, 0x64, + 0x76, 0x6b, 0x68, 0x68, 0x67, 0x64, 0x5e, 0x57, 0x60, 0x7c, 0x8e, 0x8a, + 0x68, 0x81, 0x7f, 0x5d, 0x4e, 0x5b, 0x4c, 0x21, 0x22, 0x40, 0x54, 0x5d, + 0x61, 0x51, 0x41, 0x43, 0x48, 0x5b, 0x36, 0x2a, 0x3e, 0x2d, 0x26, 0x42, + 0x4f, 0x2b, 0x2c, 0x54, 0x79, 0x4f, 0x4d, 0x51, 0x77, 0x69, 0x65, 0x70, + 0x77, 0x71, 0x68, 0x66, 0x6b, 0x61, 0x55, 0x58, 0x70, 0x89, 0x87, 0x77, + 0x5c, 0x77, 0x8e, 0x8f, 0x85, 0x7f, 0x7c, 0x78, 0x76, 0x78, 0x79, 0x79, + 0x77, 0x72, 0x6d, 0x6a, 0x6a, 0x68, 0x67, 0x69, 0x6a, 0x66, 0x5e, 0x57, + 0x3c, 0x4e, 0x43, 0x3e, 0x3f, 0x46, 0x5e, 0x67, 0x92, 0x84, 0x7b, 0x5f, + 0x34, 0x2c, 0x40, 0x46, 0x6f, 0x5b, 0x5c, 0x70, 0x6d, 0x51, 0x48, 0x57, + 0x6d, 0x64, 0x52, 0x50, 0x55, 0x59, 0x5d, 0x57, 0x37, 0x27, 0x27, 0x38, + 0x42, 0x3a, 0x36, 0x3b, 0x67, 0x5b, 0x62, 0x81, 0x71, 0x41, 0x37, 0x40, + 0x21, 0x82, 0xf8, 0x77, 0x25, 0x45, 0x78, 0x9f, 0x72, 0x4c, 0x4b, 0x4f, + 0x51, 0x59, 0x52, 0x54, 0x62, 0x4f, 0x31, 0x47, 0x57, 0x4b, 0x50, 0x43, + 0x4c, 0x5b, 0x6a, 0x64, 0x5f, 0x75, 0x89, 0x84, 0x85, 0x72, 0x56, 0x45, + 0x75, 0xd3, 0xd7, 0x81, 0x10, 0x12, 0x24, 0x56, 0x66, 0x6a, 0x88, 0x89, + 0x75, 0x78, 0x76, 0x88, 0x99, 0x87, 0x28, 0x09, 0xeb, 0xe0, 0xea, 0xca, + 0xb7, 0x5a, 0x00, 0x18, 0x58, 0x9c, 0xd1, 0xee, 0xd9, 0xdb, 0xcf, 0xd9, + 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe2, 0xe3, 0xe4, 0xe5, + 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xdf, 0xe7, 0xdf, 0xc8, + 0xe6, 0xe5, 0xf0, 0xe5, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, 0xe8, 0xea, 0xeb, + 0xf1, 0xd2, 0xdb, 0xf3, 0xea, 0xe3, 0xec, 0xec, 0xc3, 0xcb, 0xe7, 0xd6, + 0xb8, 0x9f, 0xc0, 0xe7, 0xf2, 0xcf, 0xd5, 0xef, 0xb7, 0xc9, 0xff, 0xe8, + 0xd0, 0xeb, 0xe9, 0xc4, 0xb5, 0xca, 0xd0, 0xf3, 0xe6, 0xd3, 0xeb, 0xe5, + 0xe6, 0xd8, 0xca, 0xb1, 0x8a, 0x82, 0x76, 0x5c, 0x81, 0xb1, 0xe2, 0xe6, + 0xfa, 0xd8, 0xcd, 0xdb, 0xe0, 0xc1, 0xb1, 0xda, 0xdd, 0xd7, 0xd3, 0xe9, + 0xe4, 0xcf, 0xd1, 0xc4, 0xe1, 0xe3, 0xd8, 0xd7, 0xd9, 0xde, 0xed, 0xf0, + 0xf1, 0xd8, 0xcf, 0xe1, 0xec, 0xe6, 0xe4, 0xed, 0xeb, 0xed, 0xca, 0xa6, + 0x61, 0x41, 0x36, 0x5a, 0x5e, 0x4b, 0x57, 0xde, 0x9f, 0x50, 0x8b, 0x77, + 0x6e, 0x76, 0x7b, 0x65, 0x51, 0x66, 0x6f, 0x4f, 0x3a, 0x56, 0x70, 0x61, + 0x46, 0x55, 0x6d, 0x66, 0x76, 0x8b, 0x8c, 0xa5, 0xc5, 0x92, 0x4b, 0x45, + 0x2b, 0x42, 0x39, 0x2e, 0x40, 0x40, 0x2e, 0x2c, 0x24, 0x2e, 0x3b, 0x31, + 0x28, 0x44, 0x58, 0x45, 0x45, 0x5a, 0x55, 0x4a, 0x7f, 0x76, 0x71, 0x7f, + 0x6d, 0x60, 0x5a, 0x62, 0x67, 0x63, 0x61, 0x64, 0x72, 0x6c, 0x61, 0x5e, + 0x6c, 0x7a, 0x74, 0x62, 0x6a, 0x7b, 0x8b, 0x92, 0x96, 0x97, 0x8d, 0x7f, + 0x7b, 0x7c, 0x7e, 0x7e, 0x7b, 0x77, 0x71, 0x6e, 0x72, 0x6e, 0x6a, 0x68, + 0x65, 0x60, 0x56, 0x4f, 0x4d, 0x55, 0x51, 0x53, 0x60, 0x86, 0xa0, 0x81, + 0x64, 0x52, 0x33, 0x3a, 0x69, 0x7c, 0x6e, 0x68, 0x67, 0x5b, 0x59, 0x65, + 0x66, 0x57, 0x4e, 0x50, 0x5d, 0x62, 0x51, 0x52, 0x5a, 0x5f, 0x64, 0x4f, + 0x59, 0x47, 0x32, 0x26, 0x27, 0x32, 0x45, 0x55, 0x42, 0x56, 0x5e, 0x3d, + 0x2f, 0x4d, 0x51, 0x36, 0x30, 0xa4, 0xa8, 0x50, 0x34, 0x35, 0x6a, 0x9b, + 0x77, 0x4f, 0x47, 0x42, 0x40, 0x50, 0x58, 0x64, 0x52, 0x46, 0x38, 0x4a, + 0x63, 0x6b, 0x6c, 0x5f, 0x7d, 0xa2, 0x95, 0x70, 0x6d, 0x6c, 0x64, 0x6c, + 0x47, 0x37, 0x3a, 0x31, 0x3d, 0x9d, 0xe7, 0xd1, 0x98, 0x7a, 0x89, 0x80, + 0x6a, 0x75, 0x6e, 0x5f, 0x6b, 0x5f, 0x67, 0x67, 0x54, 0x51, 0x18, 0x0a, + 0xe4, 0xd1, 0xdd, 0xdb, 0xf1, 0x95, 0x28, 0x4a, 0xdb, 0xf6, 0xe9, 0xd9, + 0xda, 0xe8, 0xdf, 0xe1, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xde, + 0xe3, 0xe3, 0xe4, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe5, 0xd9, 0xd4, 0xcf, 0xde, 0xe5, 0xe3, 0xe9, 0xe8, 0xe7, 0xe5, 0xe4, + 0xe5, 0xe7, 0xea, 0xed, 0xf4, 0xe0, 0xd5, 0xe2, 0xee, 0xe8, 0xe5, 0xed, + 0xcb, 0xdd, 0xeb, 0xe2, 0xc4, 0xbb, 0xf0, 0xdf, 0xfb, 0xd5, 0xa5, 0xc1, + 0xbc, 0xd4, 0xf2, 0xe0, 0xc1, 0xe9, 0xdc, 0xa0, 0xb7, 0xd7, 0xd9, 0xe1, + 0xc9, 0xc2, 0xb2, 0xdd, 0xbb, 0x8f, 0xde, 0x8f, 0x85, 0xb5, 0xdd, 0xa7, + 0x7d, 0x89, 0xc6, 0xd1, 0xab, 0xae, 0xcc, 0xd2, 0xcf, 0xd6, 0xcf, 0xd3, + 0xe8, 0xea, 0xde, 0xe5, 0xe4, 0xcf, 0xce, 0xd4, 0xdd, 0xdf, 0xca, 0xd6, + 0xe3, 0xe5, 0xf7, 0xec, 0xe4, 0xd0, 0xce, 0xe2, 0xe9, 0xde, 0xdd, 0xea, + 0xe7, 0x98, 0x6e, 0x4e, 0x5a, 0xb2, 0xb7, 0x81, 0x6b, 0x57, 0x43, 0x62, + 0x73, 0x87, 0x94, 0x88, 0x62, 0x65, 0x75, 0x84, 0x9d, 0xba, 0x98, 0x46, + 0x78, 0x61, 0x60, 0x5f, 0x56, 0x6b, 0x7f, 0x71, 0x76, 0x7b, 0x89, 0xaf, + 0xb9, 0x7a, 0x40, 0x43, 0x32, 0x46, 0x4d, 0x3f, 0x30, 0x2c, 0x38, 0x49, + 0x40, 0x41, 0x70, 0x61, 0x31, 0x5d, 0x75, 0x33, 0x44, 0x4f, 0x3f, 0x44, + 0x8c, 0x5d, 0x42, 0x87, 0x79, 0x69, 0x5e, 0x60, 0x64, 0x64, 0x6b, 0x75, + 0x6c, 0x70, 0x70, 0x6f, 0x79, 0x84, 0x80, 0x72, 0x6b, 0x81, 0x8d, 0x7e, + 0x67, 0x5f, 0x63, 0x67, 0x7b, 0x78, 0x73, 0x6c, 0x65, 0x5e, 0x58, 0x55, + 0x6b, 0x66, 0x60, 0x5d, 0x5a, 0x55, 0x4c, 0x45, 0x5c, 0x49, 0x42, 0x5f, + 0x71, 0x75, 0x80, 0x72, 0x56, 0x67, 0x63, 0x5b, 0x5c, 0x50, 0x47, 0x54, + 0x6d, 0x4b, 0x4b, 0x70, 0x74, 0x52, 0x47, 0x5c, 0x44, 0x65, 0x5e, 0x5c, + 0x5c, 0x60, 0x68, 0x48, 0x4d, 0x4c, 0x42, 0x3e, 0x51, 0x64, 0x55, 0x34, + 0x34, 0x3f, 0x79, 0x71, 0x43, 0x3c, 0x48, 0x6f, 0x80, 0xd8, 0x78, 0x50, + 0x56, 0x43, 0x69, 0x96, 0x6d, 0x48, 0x51, 0x5d, 0x55, 0x4e, 0x4d, 0x60, + 0x36, 0x41, 0x4c, 0x43, 0x46, 0x53, 0x46, 0x37, 0x37, 0x33, 0x41, 0x3b, + 0x25, 0x34, 0x47, 0x36, 0x65, 0x50, 0x45, 0x45, 0x4d, 0x71, 0xab, 0xd2, + 0xc0, 0x76, 0x61, 0x5e, 0x54, 0x53, 0x54, 0x68, 0x73, 0x5b, 0x64, 0x6f, + 0x6e, 0x70, 0x22, 0x02, 0xd9, 0xd1, 0xda, 0xcd, 0xe5, 0x8c, 0x1d, 0x46, + 0xd0, 0xe5, 0xdc, 0xd6, 0xd6, 0xd4, 0xd9, 0xda, 0xda, 0xda, 0xdb, 0xdc, + 0xdc, 0xdd, 0xde, 0xde, 0xe3, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9, 0xea, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xeb, 0xcf, 0xc8, 0xda, 0xd7, 0xe7, 0xd7, 0xee, + 0xe8, 0xe6, 0xe4, 0xe3, 0xe4, 0xe7, 0xeb, 0xed, 0xee, 0xea, 0xcf, 0xce, + 0xed, 0xea, 0xdb, 0xea, 0xd0, 0xe5, 0xcb, 0xd8, 0xcd, 0x9d, 0xd8, 0xdd, + 0xf5, 0xd7, 0xc3, 0xf7, 0xe3, 0xe4, 0xe4, 0xaf, 0xc1, 0xfe, 0xd5, 0x97, + 0xdd, 0xe3, 0xf1, 0xe9, 0xed, 0xe4, 0xdc, 0xbf, 0xc5, 0xca, 0xe6, 0xe8, + 0x75, 0x78, 0xa9, 0x87, 0x50, 0x73, 0xd5, 0xd8, 0xdc, 0xc7, 0xc5, 0xc5, + 0xca, 0xba, 0xac, 0xd8, 0xe4, 0xea, 0xde, 0xbe, 0xd8, 0xf1, 0xd6, 0xdc, + 0xe9, 0xc9, 0xc0, 0xdb, 0xf1, 0xf1, 0xe5, 0xd5, 0xd4, 0xda, 0xe5, 0xec, + 0xe7, 0xde, 0xe3, 0xf0, 0xec, 0x7f, 0x8e, 0x94, 0x7f, 0x72, 0x52, 0x55, + 0x66, 0x66, 0x42, 0x5e, 0x7d, 0x85, 0x9e, 0x8b, 0xbe, 0xac, 0xbd, 0xd6, + 0xcc, 0xb1, 0x8b, 0x5f, 0x5e, 0x47, 0x57, 0x66, 0x4e, 0x59, 0x8c, 0xa8, + 0x5a, 0x51, 0x79, 0x8c, 0x60, 0x4c, 0x57, 0x4d, 0x64, 0x3e, 0x33, 0x3e, + 0x42, 0x52, 0x5f, 0x56, 0x52, 0x65, 0x5d, 0x2f, 0x29, 0x46, 0x3f, 0x2c, + 0x31, 0x3e, 0x22, 0x27, 0x8f, 0x6a, 0x45, 0x95, 0x7b, 0x72, 0x71, 0x7a, + 0x7d, 0x76, 0x75, 0x7a, 0x81, 0x8a, 0x8d, 0x8a, 0x8c, 0x90, 0x89, 0x7c, + 0x6a, 0x7a, 0x85, 0x82, 0x7c, 0x7b, 0x75, 0x6e, 0x87, 0x7b, 0x69, 0x5d, + 0x5c, 0x68, 0x78, 0x84, 0x6c, 0x67, 0x63, 0x62, 0x62, 0x5f, 0x59, 0x54, + 0x53, 0x61, 0x49, 0x45, 0x55, 0x51, 0x50, 0x4e, 0x5a, 0x57, 0x64, 0x63, + 0x4e, 0x51, 0x64, 0x66, 0x7a, 0x6b, 0x5f, 0x5f, 0x66, 0x6b, 0x6c, 0x6d, + 0x5e, 0x6a, 0x5e, 0x6e, 0x65, 0x50, 0x6a, 0x70, 0x48, 0x41, 0x3f, 0x42, + 0x3c, 0x2d, 0x27, 0x2c, 0x18, 0x44, 0x85, 0x4c, 0x22, 0x48, 0x30, 0x12, + 0x6f, 0xc8, 0x4b, 0x3b, 0x41, 0x35, 0x65, 0x9a, 0x8a, 0x58, 0x5c, 0x69, + 0x55, 0x3c, 0x3b, 0x5e, 0x4e, 0x3e, 0x52, 0x5a, 0x5f, 0x58, 0x33, 0x2f, + 0x38, 0x3c, 0x3b, 0x43, 0x57, 0x5e, 0x61, 0x6e, 0x64, 0x7d, 0x81, 0x83, + 0x7f, 0x5f, 0x7b, 0xd7, 0xeb, 0xa0, 0x42, 0x35, 0x4f, 0x5f, 0x71, 0x67, + 0x80, 0x79, 0x7c, 0x80, 0x8f, 0x86, 0x23, 0x10, 0xd9, 0xd9, 0xd3, 0xd9, + 0xe0, 0x96, 0x1a, 0x69, 0xe0, 0xda, 0xd4, 0xd1, 0xd2, 0xd4, 0xd5, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd7, 0xd9, 0xda, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, + 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe7, 0xef, 0xcd, 0xd0, + 0xe4, 0xd1, 0xca, 0xd5, 0xed, 0xe2, 0xdb, 0xce, 0xdf, 0xf2, 0xdf, 0xde, + 0xdc, 0xf2, 0xc8, 0xcb, 0xdb, 0xed, 0xd1, 0xd2, 0xd7, 0xde, 0xb9, 0xe5, + 0xc5, 0xb9, 0xef, 0xec, 0xe3, 0xc8, 0xbf, 0xf9, 0xdb, 0xcf, 0xf6, 0x90, + 0xc8, 0xfb, 0x95, 0xc3, 0xf1, 0xe7, 0xf4, 0xde, 0xe2, 0xf1, 0xe9, 0xcf, + 0xd1, 0xc3, 0xbd, 0xf1, 0x9f, 0x83, 0xa0, 0xad, 0x98, 0x9c, 0xac, 0xbe, + 0xed, 0xe7, 0xda, 0xcd, 0xe2, 0xe0, 0xcb, 0xef, 0xeb, 0xf3, 0xef, 0xe1, + 0xd2, 0xc5, 0xcd, 0xe2, 0xe6, 0xaa, 0xbc, 0xec, 0xe5, 0xd8, 0xdd, 0xd9, + 0xcb, 0xe9, 0xff, 0xd3, 0xef, 0xe6, 0xd3, 0xdb, 0xd7, 0xe6, 0x9b, 0x56, + 0x55, 0x56, 0x61, 0x79, 0x81, 0x6a, 0x42, 0x45, 0x71, 0x82, 0x86, 0x9f, + 0xbd, 0xbd, 0xb4, 0xc8, 0xaf, 0x6d, 0x53, 0x40, 0x68, 0x5e, 0x5e, 0x60, + 0x58, 0x60, 0x86, 0xaa, 0x74, 0x5c, 0x79, 0x60, 0x63, 0x79, 0x47, 0x46, + 0x47, 0x46, 0x45, 0x45, 0x46, 0x44, 0x3e, 0x38, 0x28, 0x28, 0x29, 0x2c, + 0x32, 0x38, 0x3d, 0x3f, 0x29, 0x1a, 0x3d, 0x6a, 0x96, 0x83, 0x9d, 0xc1, + 0x86, 0x73, 0x70, 0x81, 0x85, 0x78, 0x76, 0x82, 0x90, 0x96, 0x93, 0x8e, + 0x96, 0x9b, 0x80, 0x5a, 0x6d, 0x6e, 0x68, 0x58, 0x4c, 0x52, 0x6b, 0x81, + 0x6b, 0x67, 0x63, 0x64, 0x68, 0x69, 0x66, 0x61, 0x4b, 0x4a, 0x4a, 0x51, + 0x58, 0x5a, 0x55, 0x4e, 0x59, 0x5f, 0x59, 0x47, 0x42, 0x51, 0x62, 0x6a, + 0x54, 0x5b, 0x5d, 0x58, 0x56, 0x5d, 0x67, 0x6b, 0x6c, 0x5e, 0x47, 0x5c, + 0x69, 0x5e, 0x60, 0x54, 0x56, 0x60, 0x66, 0x66, 0x6a, 0x6d, 0x63, 0x53, + 0x41, 0x41, 0x3f, 0x3d, 0x38, 0x32, 0x2b, 0x26, 0x1b, 0x58, 0xa3, 0x64, + 0x1f, 0x45, 0x47, 0x21, 0xae, 0xa1, 0x2a, 0x53, 0x47, 0x3c, 0x4e, 0x95, + 0x7d, 0x58, 0x38, 0x33, 0x35, 0x34, 0x41, 0x56, 0x51, 0x39, 0x35, 0x47, + 0x5a, 0x6a, 0x70, 0x69, 0x85, 0x8d, 0x70, 0x5a, 0x74, 0x8c, 0x8d, 0x93, + 0x80, 0x9e, 0x66, 0x4e, 0x82, 0x68, 0x53, 0xa6, 0xe2, 0xee, 0x92, 0x29, + 0x2f, 0x59, 0x67, 0x76, 0x6d, 0x49, 0x70, 0x7d, 0x77, 0x65, 0x22, 0x0f, + 0xd3, 0xd4, 0xd2, 0xd4, 0xe7, 0xa3, 0x2d, 0x8f, 0xe3, 0xdd, 0xd6, 0xd3, + 0xd4, 0xd6, 0xd7, 0xd6, 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, + 0xdd, 0xdd, 0xdf, 0xe0, 0xe2, 0xe3, 0xe5, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe4, 0xe7, 0xde, 0xdc, 0xed, 0xe8, 0xcc, 0xc7, 0xdc, 0xe1, 0xe7, 0xda, + 0xd9, 0xef, 0xf3, 0xeb, 0xec, 0xf4, 0xdf, 0xc4, 0xd9, 0xd6, 0xc0, 0xc0, + 0xe4, 0xdf, 0xc8, 0xf0, 0xc0, 0xcc, 0xf0, 0xde, 0xdc, 0xcd, 0xc7, 0xea, + 0xd3, 0xd9, 0xd5, 0xa4, 0xe1, 0x9c, 0xab, 0xee, 0xf2, 0xde, 0xeb, 0xd7, + 0xd7, 0xcd, 0xe9, 0xe1, 0xbd, 0xb9, 0xb6, 0xab, 0x95, 0x93, 0x68, 0x63, + 0x74, 0x9c, 0xe6, 0xf6, 0xc1, 0xc5, 0xc4, 0xbd, 0xd4, 0xd4, 0xc3, 0xeb, + 0xf3, 0xe8, 0xe9, 0xf3, 0xe7, 0xc8, 0xc6, 0xe0, 0xbb, 0xac, 0xee, 0xda, + 0xc4, 0xdf, 0xa2, 0x72, 0x25, 0x90, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xda, + 0xad, 0x4e, 0x4c, 0x88, 0x7d, 0x73, 0x8e, 0x86, 0x61, 0x5d, 0x50, 0x60, + 0x83, 0x84, 0x7b, 0x8b, 0xbd, 0xaa, 0x98, 0xa2, 0x99, 0x9d, 0xa7, 0x72, + 0x6c, 0x8c, 0x80, 0x6b, 0x67, 0x51, 0x60, 0xa7, 0x78, 0x4c, 0x5b, 0x60, + 0x50, 0x57, 0x48, 0x2b, 0x41, 0x42, 0x43, 0x42, 0x41, 0x3f, 0x40, 0x41, + 0x41, 0x46, 0x44, 0x35, 0x26, 0x2e, 0x4c, 0x69, 0x65, 0x49, 0x34, 0x4c, + 0x96, 0x62, 0x3a, 0x4e, 0x6f, 0x67, 0x61, 0x61, 0x66, 0x6b, 0x6e, 0x70, + 0x6b, 0x52, 0x53, 0x72, 0x7d, 0x69, 0x62, 0x70, 0x5c, 0x5c, 0x63, 0x71, + 0x81, 0x85, 0x7f, 0x76, 0x7e, 0x75, 0x6a, 0x64, 0x65, 0x67, 0x66, 0x64, + 0x5d, 0x5b, 0x5c, 0x62, 0x69, 0x6a, 0x65, 0x5e, 0x5f, 0x5d, 0x53, 0x4c, + 0x58, 0x6e, 0x75, 0x6f, 0x6b, 0x66, 0x67, 0x6e, 0x70, 0x67, 0x5b, 0x53, + 0x5a, 0x61, 0x5d, 0x63, 0x44, 0x28, 0x58, 0x8c, 0x6f, 0x6b, 0x5e, 0x52, + 0x55, 0x5f, 0x5e, 0x53, 0x3a, 0x3a, 0x3d, 0x42, 0x44, 0x3e, 0x31, 0x27, + 0x19, 0x5f, 0x91, 0x54, 0x2c, 0x3a, 0x28, 0x29, 0xd9, 0x82, 0x27, 0x54, + 0x59, 0x35, 0x40, 0x87, 0x99, 0x4c, 0x58, 0x72, 0x4b, 0x55, 0x6b, 0x3b, + 0x6b, 0x71, 0x6c, 0x59, 0x58, 0x75, 0x8d, 0x8c, 0x78, 0x92, 0x93, 0x92, + 0x9e, 0x8c, 0x6a, 0x61, 0x7c, 0x7a, 0x74, 0x68, 0x47, 0x27, 0x3b, 0x72, + 0xc3, 0xe0, 0xbe, 0x85, 0x72, 0x64, 0x6b, 0x95, 0x8d, 0x6f, 0x8b, 0x66, + 0x6b, 0x80, 0x19, 0x00, 0xd8, 0xd9, 0xd7, 0xcc, 0xe4, 0x9b, 0x25, 0x9d, + 0xe6, 0xe0, 0xd9, 0xd6, 0xd8, 0xda, 0xda, 0xda, 0xd8, 0xd8, 0xd9, 0xd9, + 0xda, 0xdb, 0xdb, 0xdb, 0xde, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe6, 0xe4, 0xe9, 0xce, 0xc5, 0xd4, 0xd0, 0xdb, + 0xd1, 0xe1, 0xe8, 0xdc, 0xcc, 0xdc, 0xef, 0xdc, 0xe4, 0xe1, 0xed, 0xc1, + 0xdf, 0xd6, 0xc9, 0xd5, 0xef, 0xd2, 0xcf, 0xe9, 0x90, 0xb1, 0xd1, 0xd3, + 0xc8, 0xda, 0xda, 0xca, 0xc9, 0xea, 0xbd, 0xa7, 0xa8, 0x88, 0xce, 0xe9, + 0xf6, 0xe3, 0xea, 0xe0, 0xdb, 0xe8, 0xe5, 0xdd, 0xe3, 0xbe, 0x9e, 0xcc, + 0xd1, 0x94, 0x7e, 0x6b, 0x5b, 0x96, 0xdc, 0xe7, 0xea, 0xf4, 0xf6, 0xe7, + 0xec, 0xda, 0xc0, 0xe6, 0xd7, 0xdf, 0xe6, 0xe7, 0xe9, 0xe8, 0xd6, 0xbd, + 0xcf, 0xcd, 0xd4, 0xef, 0xe9, 0xd0, 0x9e, 0x3a, 0x34, 0x1b, 0x7c, 0xed, + 0xc6, 0xd0, 0xd7, 0x7e, 0x57, 0x4a, 0x6a, 0x88, 0x68, 0x40, 0x51, 0x79, + 0x5e, 0x54, 0x42, 0x42, 0x52, 0x58, 0x65, 0x82, 0xcd, 0xba, 0xa8, 0xa7, + 0xa1, 0xc2, 0xc1, 0x55, 0x48, 0x62, 0x51, 0x3c, 0x41, 0x36, 0x4f, 0x9b, + 0x83, 0x63, 0x6e, 0x93, 0x6d, 0x39, 0x43, 0x46, 0x46, 0x46, 0x40, 0x35, + 0x2c, 0x30, 0x3e, 0x4c, 0x54, 0x57, 0x4f, 0x3b, 0x29, 0x30, 0x50, 0x6e, + 0x36, 0x47, 0x46, 0x51, 0x9d, 0x7e, 0x5e, 0x6e, 0x65, 0x71, 0x71, 0x68, + 0x68, 0x6e, 0x63, 0x4e, 0x48, 0x57, 0x5f, 0x57, 0x4c, 0x4c, 0x54, 0x5b, + 0x52, 0x58, 0x6b, 0x8b, 0xa6, 0xaa, 0x96, 0x80, 0x83, 0x82, 0x83, 0x87, + 0x89, 0x84, 0x79, 0x70, 0x6f, 0x6b, 0x68, 0x69, 0x6b, 0x68, 0x5f, 0x56, + 0x46, 0x48, 0x45, 0x45, 0x54, 0x6a, 0x6f, 0x67, 0x70, 0x59, 0x51, 0x5e, + 0x66, 0x5c, 0x56, 0x5b, 0x50, 0x73, 0x74, 0x73, 0x74, 0x78, 0x7b, 0x5c, + 0x4d, 0x56, 0x5a, 0x5a, 0x5e, 0x60, 0x54, 0x42, 0x51, 0x4b, 0x41, 0x35, + 0x2d, 0x2c, 0x30, 0x35, 0x1f, 0x5d, 0x7b, 0x52, 0x5a, 0x6c, 0x68, 0xa4, + 0xcc, 0x6b, 0x5f, 0x53, 0x3b, 0x0d, 0x2e, 0x72, 0x9d, 0x64, 0x53, 0x60, + 0x65, 0x7b, 0x8a, 0x77, 0x71, 0x63, 0x67, 0x7a, 0x75, 0x56, 0x4d, 0x5e, + 0x6a, 0x78, 0x76, 0x7c, 0x8d, 0x83, 0x7a, 0x8d, 0x76, 0x6c, 0x7f, 0x95, + 0x9a, 0x9c, 0x7c, 0x40, 0x5b, 0xa3, 0xca, 0xb4, 0x82, 0x51, 0x5a, 0x93, + 0x99, 0x62, 0x83, 0x60, 0x86, 0xb3, 0x38, 0x13, 0xe3, 0xe4, 0xe4, 0xce, + 0xe6, 0x8e, 0x19, 0xa1, 0xea, 0xe4, 0xdd, 0xda, 0xdb, 0xdd, 0xde, 0xdd, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdf, 0xdf, 0xe0, 0xe1, + 0xe1, 0xe2, 0xe3, 0xe3, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe7, 0xf5, 0xe2, + 0xc6, 0xcd, 0xd9, 0xe3, 0xd8, 0xed, 0xe7, 0xe2, 0xda, 0xd9, 0xe8, 0xd8, + 0xeb, 0xe4, 0xfa, 0xd1, 0xdc, 0xdd, 0xc9, 0xe2, 0xf5, 0xb1, 0xbf, 0xea, + 0xa4, 0xd7, 0xc6, 0xb4, 0xb6, 0xe4, 0xe9, 0xab, 0xcb, 0xf5, 0xc4, 0x8e, + 0x7e, 0xc9, 0xd5, 0xbd, 0xc4, 0xb5, 0xd4, 0xd8, 0xcd, 0xae, 0xb4, 0xbb, + 0xb3, 0xa9, 0xa1, 0xad, 0xc4, 0x73, 0x7c, 0x6e, 0x4f, 0x94, 0xd4, 0xd8, + 0xbb, 0xd1, 0xe2, 0xde, 0xe8, 0xd9, 0xc4, 0xef, 0xdc, 0xe4, 0xe2, 0xd2, + 0xd7, 0xf4, 0xee, 0xc2, 0xc3, 0xd7, 0xc4, 0xee, 0xd3, 0xa6, 0xd8, 0xc1, + 0x59, 0x58, 0x58, 0xc5, 0xdd, 0xe2, 0xd4, 0xc5, 0x5e, 0x64, 0x4d, 0x46, + 0x73, 0x68, 0x39, 0x52, 0x69, 0x60, 0x55, 0x50, 0x4e, 0x4f, 0x64, 0x83, + 0x97, 0xa1, 0x99, 0xa2, 0xb2, 0xc7, 0xac, 0x41, 0x38, 0x3a, 0x50, 0x6a, + 0x6d, 0x69, 0x73, 0x80, 0x62, 0x54, 0x41, 0x5b, 0x6a, 0x4c, 0x43, 0x52, + 0x35, 0x47, 0x59, 0x5a, 0x4c, 0x3e, 0x39, 0x3c, 0x44, 0x3a, 0x2e, 0x29, + 0x2b, 0x2f, 0x2f, 0x2e, 0x34, 0x4a, 0x72, 0x87, 0xa0, 0x64, 0x45, 0x49, + 0x6b, 0x74, 0x6f, 0x60, 0x5f, 0x69, 0x63, 0x51, 0x50, 0x4b, 0x58, 0x76, + 0x87, 0x7e, 0x6f, 0x69, 0x6a, 0x71, 0x7a, 0x7e, 0x79, 0x6e, 0x62, 0x5b, + 0x76, 0x6e, 0x66, 0x66, 0x6e, 0x77, 0x7e, 0x80, 0x75, 0x6f, 0x68, 0x63, + 0x5f, 0x56, 0x49, 0x3e, 0x2f, 0x40, 0x4a, 0x46, 0x48, 0x55, 0x61, 0x63, + 0x83, 0x65, 0x58, 0x64, 0x64, 0x52, 0x50, 0x60, 0x7b, 0x51, 0x24, 0x41, + 0x64, 0x66, 0x68, 0x58, 0x59, 0x59, 0x4a, 0x34, 0x2f, 0x43, 0x5c, 0x68, + 0x5a, 0x64, 0x6d, 0x6c, 0x68, 0x6c, 0x7a, 0x88, 0x96, 0x9e, 0xa0, 0x6f, + 0x5b, 0x5c, 0x61, 0xa4, 0x9f, 0x4e, 0x8c, 0x7b, 0xa5, 0xaa, 0x9f, 0x75, + 0x7b, 0x7d, 0x6a, 0x71, 0x95, 0x97, 0x84, 0x8b, 0x6d, 0x93, 0x91, 0x6f, + 0x6b, 0x7b, 0x7c, 0x74, 0x6d, 0x78, 0x74, 0x75, 0x7c, 0x6b, 0x65, 0x82, + 0xa9, 0x99, 0x8a, 0xa1, 0xc5, 0xb8, 0x8b, 0x74, 0xd7, 0xdd, 0xda, 0xd5, + 0xd2, 0xca, 0xcb, 0xd9, 0xc1, 0x77, 0xae, 0xb3, 0xcb, 0xa7, 0x00, 0x00, + 0xe3, 0xe8, 0xee, 0xdb, 0xf2, 0x8b, 0x25, 0xb5, 0xec, 0xe6, 0xdf, 0xdc, + 0xde, 0xe0, 0xe0, 0xe0, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, + 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe3, 0xe7, 0xf0, 0xdc, 0xd0, 0xde, 0xd4, 0xcd, 0xeb, 0xe1, 0xe3, + 0xe7, 0xd4, 0xd9, 0xe5, 0xec, 0xe7, 0xf2, 0xe2, 0xd0, 0xe0, 0xc2, 0xe5, + 0xdd, 0xaa, 0xc4, 0xcf, 0xa0, 0xec, 0xd4, 0xc2, 0xbb, 0xdd, 0xde, 0xa6, + 0xe0, 0xe8, 0xd2, 0x77, 0x89, 0xe4, 0xee, 0xff, 0xe2, 0xcd, 0xe4, 0xdb, + 0xeb, 0xf3, 0xf7, 0xed, 0xfd, 0xff, 0xcd, 0xa6, 0xab, 0x8e, 0x66, 0x65, + 0x74, 0xaa, 0xde, 0xb6, 0xcf, 0xe3, 0xf2, 0xe8, 0xea, 0xd3, 0xb7, 0xde, + 0xde, 0xdd, 0xf1, 0xf3, 0xd7, 0xca, 0xca, 0xbf, 0xde, 0xd7, 0xdb, 0xd4, + 0xd5, 0xda, 0xb2, 0x7e, 0xad, 0xea, 0xd0, 0xea, 0xdc, 0xcc, 0xaa, 0xa1, + 0x61, 0x3e, 0x5f, 0x71, 0x5f, 0x49, 0x4b, 0x86, 0x5b, 0x52, 0x54, 0x57, + 0x53, 0x5b, 0x7d, 0x9c, 0x9d, 0xbf, 0xa9, 0xaf, 0xc9, 0xb2, 0x7f, 0x45, + 0x3a, 0x37, 0x47, 0x5c, 0x5b, 0x50, 0x4f, 0x53, 0x45, 0x67, 0x72, 0x59, + 0x54, 0x4e, 0x3c, 0x49, 0x2c, 0x37, 0x3f, 0x3c, 0x34, 0x36, 0x45, 0x54, + 0x44, 0x36, 0x2a, 0x2e, 0x38, 0x38, 0x28, 0x16, 0x40, 0x21, 0x1a, 0x36, + 0x6c, 0x3e, 0x34, 0x5b, 0x65, 0x66, 0x64, 0x64, 0x6a, 0x72, 0x72, 0x6d, + 0x67, 0x5a, 0x66, 0x7f, 0x74, 0x51, 0x54, 0x75, 0x84, 0x88, 0x86, 0x76, + 0x61, 0x55, 0x56, 0x5d, 0x6f, 0x63, 0x57, 0x54, 0x5e, 0x6e, 0x7c, 0x83, + 0x74, 0x6f, 0x68, 0x65, 0x63, 0x5b, 0x4f, 0x45, 0x45, 0x55, 0x5c, 0x55, + 0x53, 0x5d, 0x66, 0x67, 0x6e, 0x43, 0x33, 0x57, 0x77, 0x6d, 0x52, 0x45, + 0x68, 0x53, 0x4e, 0x7d, 0x82, 0x59, 0x5d, 0x6e, 0x4a, 0x67, 0x7d, 0x7a, + 0x72, 0x79, 0x8a, 0x95, 0x8f, 0x8a, 0x7e, 0x6f, 0x60, 0x55, 0x50, 0x4e, + 0x72, 0x5b, 0x80, 0x74, 0x52, 0x60, 0x78, 0xa0, 0x81, 0x62, 0xb9, 0x86, + 0x83, 0x84, 0x94, 0x80, 0x54, 0x61, 0x6f, 0x74, 0x70, 0x67, 0x59, 0x4c, + 0x77, 0x82, 0x8c, 0x9e, 0x9b, 0x6d, 0x5f, 0x89, 0x96, 0x8a, 0x66, 0x59, + 0x69, 0x5c, 0x3f, 0x3c, 0x75, 0x6d, 0x81, 0xab, 0xa5, 0x71, 0x81, 0xd1, + 0xba, 0xe8, 0xd0, 0x6e, 0x4c, 0x88, 0x99, 0x63, 0xb3, 0x7c, 0x9e, 0xa4, + 0xba, 0x8a, 0x0a, 0x36, 0xdf, 0xe5, 0xec, 0xe1, 0xf1, 0x7b, 0x2e, 0xbd, + 0xed, 0xe7, 0xe0, 0xdd, 0xdf, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xdf, 0xdf, + 0xde, 0xdd, 0xdd, 0xdd, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xed, 0xe5, 0xdb, 0xe8, 0xd8, 0xc9, 0xdd, 0xd7, + 0xc2, 0xe6, 0xe5, 0xe2, 0xe4, 0xc7, 0xc4, 0xe7, 0xe8, 0xe3, 0xe2, 0xe4, + 0xc6, 0xd7, 0xbd, 0xdb, 0xc6, 0xcc, 0xea, 0xab, 0x86, 0xd0, 0xcd, 0xd1, + 0xd3, 0xd2, 0xbf, 0xb9, 0xf2, 0xd2, 0xcb, 0x81, 0xb0, 0xd2, 0xcc, 0xd8, + 0xbf, 0xd9, 0xe3, 0xf0, 0xe9, 0xda, 0xf7, 0xf2, 0xdb, 0xf4, 0xf0, 0xc4, + 0x82, 0x6e, 0x6e, 0x6d, 0x63, 0x91, 0xd1, 0xd4, 0xd2, 0xe2, 0xec, 0xe4, + 0xed, 0xda, 0xbd, 0xe0, 0xcc, 0xd4, 0xec, 0xd6, 0x93, 0x7c, 0x8d, 0x8e, + 0x6a, 0xa7, 0xc7, 0xa6, 0x75, 0x74, 0x99, 0xb1, 0x3f, 0x37, 0x51, 0xa1, + 0xbe, 0xcd, 0xb9, 0x87, 0x5c, 0x20, 0x4f, 0x69, 0x50, 0x43, 0x42, 0x72, + 0x77, 0x63, 0x60, 0x5d, 0x4b, 0x4d, 0x6a, 0x7e, 0x86, 0xb8, 0xaa, 0xbd, + 0xde, 0xa8, 0x69, 0x50, 0x56, 0x68, 0x52, 0x40, 0x49, 0x38, 0x3d, 0x77, + 0x9d, 0x76, 0x74, 0x76, 0x6a, 0x52, 0x31, 0x2d, 0x3a, 0x41, 0x45, 0x40, + 0x34, 0x2c, 0x2c, 0x30, 0x46, 0x43, 0x3d, 0x38, 0x34, 0x31, 0x30, 0x30, + 0x2e, 0x51, 0x40, 0x3f, 0x9e, 0x82, 0x54, 0x67, 0x65, 0x5f, 0x61, 0x6d, + 0x74, 0x73, 0x71, 0x73, 0x77, 0x75, 0x71, 0x6a, 0x66, 0x68, 0x6f, 0x75, + 0x69, 0x69, 0x67, 0x64, 0x60, 0x5f, 0x60, 0x63, 0x63, 0x5d, 0x57, 0x58, + 0x60, 0x68, 0x6c, 0x6d, 0x75, 0x71, 0x6f, 0x71, 0x73, 0x71, 0x68, 0x60, + 0x60, 0x5f, 0x57, 0x50, 0x59, 0x67, 0x68, 0x5d, 0x61, 0x5e, 0x62, 0x63, + 0x4e, 0x34, 0x36, 0x4a, 0x77, 0x65, 0x55, 0x76, 0x7f, 0x65, 0x68, 0x6a, + 0x4b, 0x70, 0x90, 0x91, 0x86, 0x85, 0x8d, 0x93, 0x91, 0x7e, 0x6c, 0x6b, + 0x77, 0x81, 0x7e, 0x76, 0x50, 0x3e, 0x7e, 0x86, 0x60, 0x6b, 0x75, 0x7d, + 0x88, 0x53, 0x61, 0x66, 0x89, 0x91, 0x89, 0x75, 0x5e, 0x7e, 0x83, 0x78, + 0x7d, 0x79, 0x73, 0x7c, 0x7e, 0x85, 0x56, 0x3a, 0x6b, 0x90, 0x84, 0x7b, + 0x5a, 0xa7, 0xbb, 0x7d, 0x36, 0x0f, 0x1d, 0x4a, 0xa6, 0x8c, 0x8b, 0x91, + 0x87, 0x8c, 0x8e, 0x79, 0x8e, 0x35, 0x5b, 0xd2, 0xc3, 0x55, 0x3c, 0x6f, + 0x89, 0x94, 0x8f, 0x86, 0xa1, 0x75, 0x1a, 0x25, 0xe3, 0xe5, 0xe7, 0xe0, + 0xe6, 0x65, 0x35, 0xbf, 0xed, 0xe7, 0xe0, 0xdd, 0xdf, 0xe1, 0xe1, 0xe0, + 0xe2, 0xe1, 0xe1, 0xe0, 0xdf, 0xde, 0xdd, 0xdd, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xea, 0xea, 0xec, 0xef, + 0xe5, 0xdc, 0xdc, 0xd7, 0xc8, 0xe4, 0xf0, 0xe8, 0xe5, 0xd4, 0xc9, 0xe7, + 0xf8, 0xe9, 0xe3, 0xe0, 0xcd, 0xc2, 0xba, 0xc4, 0xb9, 0xd3, 0xf2, 0xac, + 0xbd, 0xd9, 0xb4, 0xb3, 0xe5, 0xd7, 0xa7, 0xca, 0xe8, 0xcb, 0xb5, 0xa1, + 0xf3, 0xfa, 0xf8, 0xe0, 0xe2, 0xf7, 0xe5, 0xf0, 0xe4, 0xe2, 0xcc, 0xad, + 0xb1, 0xb1, 0xac, 0xd0, 0xd3, 0x73, 0x6c, 0x6e, 0x6f, 0xab, 0xd3, 0xe3, + 0xdf, 0xe6, 0xe9, 0xe2, 0xf2, 0xe5, 0xc6, 0xe6, 0xdc, 0xc3, 0xaf, 0x7d, + 0x3f, 0x4b, 0x72, 0x6e, 0x6b, 0xb3, 0xd1, 0xca, 0x7b, 0x35, 0x62, 0x93, + 0x3a, 0x22, 0x28, 0x63, 0xb7, 0x7f, 0x37, 0x4b, 0x39, 0x2d, 0x4c, 0x3a, + 0x3e, 0x4e, 0x38, 0x6a, 0x56, 0x49, 0x5d, 0x75, 0x72, 0x7b, 0x93, 0x9a, + 0x8e, 0xae, 0x9d, 0xaa, 0xb8, 0x85, 0x4f, 0x2c, 0x50, 0x68, 0x5b, 0x53, + 0x60, 0x48, 0x41, 0x71, 0x88, 0x5c, 0x47, 0x6e, 0x63, 0x28, 0x2c, 0x4a, + 0x41, 0x3e, 0x3b, 0x3a, 0x3f, 0x49, 0x56, 0x5f, 0x37, 0x3f, 0x41, 0x35, + 0x23, 0x1f, 0x2b, 0x3b, 0x31, 0x74, 0x63, 0x40, 0x92, 0x82, 0x5a, 0x69, + 0x6d, 0x5e, 0x51, 0x52, 0x58, 0x5d, 0x67, 0x71, 0x5e, 0x6c, 0x7d, 0x82, + 0x76, 0x6b, 0x6d, 0x77, 0x76, 0x73, 0x70, 0x70, 0x72, 0x6f, 0x67, 0x60, + 0x72, 0x6b, 0x64, 0x65, 0x6e, 0x79, 0x81, 0x83, 0x76, 0x72, 0x6f, 0x70, + 0x72, 0x6e, 0x65, 0x5c, 0x5b, 0x57, 0x4a, 0x40, 0x48, 0x59, 0x5e, 0x56, + 0x59, 0x47, 0x42, 0x5c, 0x85, 0xa2, 0xaa, 0xa8, 0x9f, 0x58, 0x32, 0x74, + 0x99, 0x70, 0x5b, 0x58, 0x70, 0x88, 0x99, 0x94, 0x89, 0x81, 0x7a, 0x71, + 0x72, 0x6f, 0x6e, 0x71, 0x74, 0x6d, 0x5d, 0x4e, 0x61, 0x66, 0x8f, 0x80, + 0x6f, 0x7b, 0x73, 0x81, 0x61, 0x85, 0x73, 0x84, 0x77, 0x69, 0x53, 0x4e, + 0x62, 0x76, 0x70, 0x63, 0x72, 0x89, 0x97, 0xa2, 0x42, 0x2d, 0x09, 0x2b, + 0x7b, 0x7c, 0x51, 0x51, 0x3d, 0x7d, 0x99, 0xa5, 0xd7, 0xed, 0xb9, 0x7d, + 0xa2, 0x8b, 0x52, 0x34, 0x64, 0xa3, 0xa5, 0x84, 0xd9, 0xb0, 0xbd, 0xf1, + 0xff, 0xff, 0x88, 0x00, 0x44, 0x80, 0x77, 0xb9, 0xf5, 0x97, 0x32, 0x0a, + 0xe9, 0xe9, 0xe6, 0xe4, 0xe5, 0x61, 0x47, 0xcf, 0xed, 0xe7, 0xe0, 0xdd, + 0xde, 0xe0, 0xe1, 0xe0, 0xe3, 0xe2, 0xe1, 0xe1, 0xdf, 0xde, 0xde, 0xdd, + 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xec, 0xe2, 0xe6, 0xde, 0xe9, 0xf3, 0xd4, 0xc3, 0xbd, 0xcd, 0xe4, 0xdd, + 0xdf, 0xe5, 0xd6, 0xe1, 0xee, 0xda, 0xde, 0xd8, 0xe0, 0xc5, 0xd6, 0xd3, + 0x90, 0xae, 0xd6, 0xa1, 0xd3, 0xc1, 0x9b, 0xbb, 0xe8, 0xe6, 0xa0, 0xce, + 0xd2, 0xd3, 0xa4, 0xba, 0xf8, 0xda, 0xef, 0xe0, 0xde, 0xcd, 0xd8, 0xd7, + 0xc6, 0xb4, 0xd7, 0xe9, 0xe2, 0xef, 0xd9, 0xa8, 0xc1, 0xb2, 0x8d, 0x86, + 0x8a, 0x9c, 0xcc, 0xe0, 0xe5, 0xe5, 0xe1, 0xd8, 0xec, 0xe0, 0xbf, 0xdb, + 0xe6, 0x97, 0x7b, 0x7d, 0x61, 0x57, 0x60, 0x53, 0x5a, 0x3d, 0x68, 0x74, + 0x8d, 0x93, 0x57, 0x67, 0x62, 0x50, 0x85, 0xa5, 0xe3, 0xa6, 0x6d, 0x81, + 0x62, 0x4d, 0x6a, 0x43, 0x31, 0x46, 0x3b, 0x6f, 0x79, 0x55, 0x4f, 0x56, + 0x4f, 0x63, 0x8a, 0x96, 0xad, 0xae, 0x91, 0x97, 0xa6, 0xa6, 0xa3, 0x7d, + 0x72, 0x5b, 0x51, 0x56, 0x54, 0x4f, 0x51, 0x56, 0x4e, 0x72, 0x52, 0x88, + 0xa9, 0x61, 0x42, 0x2d, 0x33, 0x34, 0x37, 0x3c, 0x3f, 0x3c, 0x35, 0x2e, + 0x45, 0x51, 0x57, 0x4e, 0x3d, 0x36, 0x40, 0x4e, 0x52, 0x53, 0x50, 0x61, + 0xa1, 0x76, 0x5e, 0x80, 0x63, 0x5b, 0x54, 0x56, 0x5e, 0x69, 0x71, 0x76, + 0x79, 0x75, 0x71, 0x75, 0x7f, 0x86, 0x84, 0x7e, 0x6d, 0x6d, 0x6f, 0x6f, + 0x6e, 0x6a, 0x66, 0x62, 0x48, 0x4e, 0x5a, 0x6b, 0x79, 0x7d, 0x78, 0x70, + 0x77, 0x70, 0x69, 0x64, 0x60, 0x57, 0x49, 0x3e, 0x4f, 0x55, 0x50, 0x3f, + 0x3a, 0x49, 0x5b, 0x63, 0x96, 0xa2, 0xa8, 0x9c, 0x8a, 0x80, 0x7e, 0x7f, + 0x7f, 0x6b, 0x53, 0x6f, 0x80, 0x6d, 0x60, 0x49, 0x64, 0x6f, 0x76, 0x79, + 0x82, 0x8d, 0x8b, 0x81, 0x71, 0x7e, 0x88, 0x84, 0x75, 0x6c, 0x70, 0x79, + 0x7e, 0x93, 0x8e, 0x58, 0x5f, 0x72, 0x64, 0x8f, 0xbe, 0xfa, 0x86, 0x72, + 0x75, 0xbb, 0xc8, 0xbd, 0xba, 0x63, 0x56, 0x41, 0x11, 0x6b, 0xd4, 0xb5, + 0x58, 0x7d, 0x71, 0x65, 0x7a, 0x60, 0x35, 0x3b, 0x1d, 0x59, 0x5f, 0x4d, + 0x77, 0x96, 0x60, 0x15, 0x25, 0x50, 0x37, 0x33, 0x4b, 0x12, 0x1f, 0xb1, + 0xd4, 0xac, 0xd0, 0xff, 0xf1, 0xce, 0xb5, 0x8f, 0xe6, 0xda, 0x72, 0xc0, + 0xf6, 0x61, 0x14, 0x05, 0xe4, 0xe2, 0xd6, 0xe3, 0xdd, 0x44, 0x4c, 0xd6, + 0xea, 0xe6, 0xe0, 0xdf, 0xe0, 0xe0, 0xdf, 0xdd, 0xdc, 0xdd, 0xdd, 0xde, + 0xdf, 0xdf, 0xe0, 0xe0, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xb1, 0x9e, 0xd6, 0xd1, 0xe7, 0xf2, 0xd6, 0xcc, 0xe9, 0xe9, 0xf2, 0xd3, + 0xd6, 0xd3, 0xd8, 0xcb, 0x95, 0xe2, 0xd8, 0xa1, 0xac, 0x8d, 0xa4, 0xd9, + 0xd6, 0xe7, 0xa0, 0xad, 0xe7, 0xd0, 0xa8, 0xea, 0xf2, 0xe1, 0xdd, 0xe1, + 0xdb, 0xd4, 0xd5, 0xd7, 0xcb, 0xe9, 0xf6, 0xec, 0xce, 0xc6, 0xd3, 0xc5, + 0x98, 0xa0, 0x96, 0x53, 0x6b, 0xaa, 0xea, 0xf1, 0xdc, 0xdd, 0xe2, 0xf2, + 0xe4, 0xd9, 0xb0, 0xcd, 0xc6, 0xb4, 0xb6, 0x8e, 0x77, 0x90, 0x7d, 0x57, + 0x7a, 0x94, 0x75, 0x90, 0x51, 0x83, 0xab, 0xab, 0xac, 0xaa, 0xbe, 0xb8, + 0xca, 0x85, 0x59, 0x7c, 0x58, 0x5f, 0x60, 0x59, 0x4f, 0x4b, 0x49, 0x48, + 0x6a, 0x48, 0x71, 0x43, 0x69, 0x7e, 0x7e, 0x98, 0xa9, 0xa7, 0xa7, 0xac, + 0xb6, 0x8a, 0x4a, 0x4c, 0x44, 0x5e, 0x40, 0x59, 0x75, 0x5a, 0x4f, 0x36, + 0x46, 0x6b, 0x59, 0x69, 0x4e, 0x12, 0x3c, 0x6c, 0x65, 0x47, 0x3b, 0x48, + 0x48, 0x36, 0x35, 0x45, 0x37, 0x41, 0x48, 0x45, 0x3d, 0x3d, 0x49, 0x56, + 0x7a, 0x69, 0x5a, 0x69, 0xa2, 0x6b, 0x4d, 0x6c, 0x65, 0x6a, 0x71, 0x74, + 0x72, 0x6f, 0x6f, 0x70, 0x61, 0x52, 0x4f, 0x5c, 0x5d, 0x52, 0x57, 0x69, + 0x70, 0x6a, 0x67, 0x6f, 0x7d, 0x86, 0x87, 0x83, 0x6c, 0x7b, 0x8f, 0x98, + 0x93, 0x87, 0x7c, 0x76, 0x76, 0x74, 0x71, 0x70, 0x6d, 0x68, 0x61, 0x5b, + 0x5b, 0x6d, 0x71, 0x68, 0x74, 0x92, 0x9a, 0x8d, 0x9e, 0x9e, 0x90, 0x8f, + 0x9e, 0x94, 0x82, 0x83, 0x8b, 0x70, 0x60, 0x5e, 0x57, 0x68, 0x8a, 0x82, + 0x5e, 0x75, 0x8e, 0x8f, 0x8e, 0x83, 0x76, 0x88, 0x8d, 0x80, 0x7a, 0x73, + 0x64, 0x9f, 0x87, 0x78, 0x64, 0x75, 0x85, 0x80, 0x7e, 0xa7, 0xbc, 0x96, + 0xc4, 0xd5, 0xa5, 0x57, 0x63, 0xaf, 0xb4, 0x74, 0x7a, 0x97, 0x7c, 0x5a, + 0x90, 0x85, 0x2d, 0x34, 0x0e, 0x33, 0x63, 0x34, 0x3d, 0x49, 0x57, 0x11, + 0x46, 0x7d, 0xa0, 0x8e, 0x37, 0x18, 0x4a, 0x41, 0x2f, 0x20, 0x27, 0x31, + 0x61, 0x5c, 0x54, 0xd6, 0xd1, 0x64, 0x81, 0x9a, 0xa6, 0xd5, 0x8f, 0x24, + 0x0f, 0x1b, 0x3f, 0x2a, 0x2e, 0x45, 0x18, 0x02, 0xe2, 0xe0, 0xd5, 0xe2, + 0xd7, 0x41, 0x51, 0xd6, 0xe8, 0xe3, 0xde, 0xdd, 0xde, 0xdf, 0xdd, 0xdb, + 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe1, 0x9b, 0x8a, 0xcf, 0xe0, 0xf0, 0xdb, 0xb8, + 0xd1, 0xe7, 0xe2, 0xd9, 0xe2, 0x9e, 0xad, 0xaf, 0x9f, 0xad, 0xdb, 0xb0, + 0xa8, 0x99, 0xbe, 0xd8, 0xb8, 0xe6, 0xb9, 0xc9, 0xe0, 0xb5, 0xc9, 0xec, + 0xea, 0xdc, 0xe3, 0xdb, 0xc5, 0xd8, 0xe4, 0xc2, 0xdf, 0xe7, 0xde, 0xd8, + 0xdf, 0xe3, 0xde, 0xd7, 0x8d, 0xa4, 0xad, 0x41, 0x3c, 0x9e, 0xdb, 0xcb, + 0xe2, 0xea, 0xe3, 0xdc, 0xcf, 0xdf, 0xc8, 0xe4, 0x94, 0x4c, 0x65, 0x78, + 0x7f, 0x64, 0x2a, 0x5b, 0x58, 0x7a, 0x47, 0x5d, 0x81, 0x72, 0x8b, 0xe5, + 0xb4, 0xb8, 0xb2, 0x67, 0x66, 0x69, 0x58, 0x3f, 0x5c, 0x4b, 0x4c, 0x65, + 0x71, 0x64, 0x54, 0x51, 0x96, 0x3c, 0x5e, 0x62, 0x6e, 0x85, 0x75, 0x6e, + 0x97, 0xa6, 0xb6, 0xc0, 0xad, 0x87, 0x5e, 0x32, 0x4b, 0x5b, 0x5c, 0x68, + 0x4a, 0x48, 0x84, 0x86, 0x4e, 0xa0, 0x8d, 0x66, 0x4d, 0x40, 0x4e, 0x2c, + 0x42, 0x41, 0x3f, 0x41, 0x49, 0x50, 0x47, 0x39, 0x29, 0x2f, 0x34, 0x37, + 0x38, 0x3c, 0x46, 0x4e, 0x73, 0x6e, 0x5c, 0x5e, 0x9a, 0x72, 0x4f, 0x5c, + 0x66, 0x63, 0x5e, 0x58, 0x54, 0x55, 0x59, 0x5c, 0x69, 0x75, 0x77, 0x6a, + 0x64, 0x6d, 0x75, 0x74, 0x7a, 0x6b, 0x61, 0x6d, 0x83, 0x8b, 0x7b, 0x66, + 0x80, 0x7c, 0x7d, 0x83, 0x86, 0x7c, 0x65, 0x52, 0x3c, 0x4d, 0x62, 0x6d, + 0x6e, 0x6a, 0x6a, 0x6c, 0x76, 0x5b, 0x47, 0x51, 0x70, 0x88, 0x8d, 0x88, + 0x82, 0x8c, 0x82, 0x6c, 0x70, 0x85, 0x84, 0x70, 0x69, 0x5f, 0x7b, 0x71, + 0x78, 0x79, 0x85, 0x6f, 0x56, 0x5c, 0x85, 0x88, 0x6a, 0x73, 0x82, 0x77, + 0x68, 0x77, 0x77, 0xa6, 0xeb, 0xf9, 0xc5, 0xc5, 0xc9, 0xc3, 0xa8, 0xcd, + 0x98, 0x55, 0x98, 0xa7, 0xa3, 0x7d, 0x7d, 0xad, 0xbf, 0x9d, 0x80, 0x82, + 0xae, 0xeb, 0xb4, 0xcd, 0xb1, 0x66, 0x8b, 0x57, 0x4e, 0x3f, 0x34, 0x36, + 0x25, 0x2b, 0x2e, 0x2f, 0x37, 0x33, 0x17, 0x3c, 0x69, 0x62, 0x4c, 0x1b, + 0x38, 0x4f, 0x29, 0x13, 0x60, 0x62, 0x0a, 0x00, 0x54, 0x80, 0x28, 0x92, + 0xff, 0xd3, 0xa7, 0x9f, 0x61, 0x41, 0x55, 0x67, 0x92, 0x9c, 0x3e, 0x02, + 0xdf, 0xdc, 0xd3, 0xe0, 0xcc, 0x3c, 0x59, 0xd6, 0xe4, 0xdf, 0xda, 0xd9, + 0xdb, 0xdc, 0xda, 0xd8, 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xd7, 0x99, 0xc8, + 0xdb, 0xe9, 0xf1, 0xc8, 0xc7, 0xe1, 0xd6, 0xdc, 0xe5, 0x8e, 0xd3, 0xd5, + 0xa7, 0xdb, 0xdf, 0x98, 0xb3, 0xb8, 0xd2, 0xcb, 0xb6, 0xdc, 0xb9, 0xe9, + 0xde, 0xaa, 0xe3, 0xd6, 0xda, 0xeb, 0xdc, 0xc4, 0xcd, 0xdb, 0xd1, 0xc4, + 0xd0, 0xda, 0xe6, 0xeb, 0xec, 0xd7, 0xca, 0xe5, 0x7e, 0x85, 0xa5, 0x4a, + 0x5e, 0xd0, 0xb5, 0x5b, 0xaf, 0xd7, 0xe6, 0xde, 0xcf, 0xe4, 0xca, 0xda, + 0xab, 0xa8, 0x7a, 0x7f, 0x87, 0x5e, 0x50, 0x57, 0x91, 0x9c, 0x74, 0x21, + 0x1f, 0x7d, 0xf1, 0xef, 0x8c, 0xbc, 0xff, 0xd3, 0xb4, 0x9e, 0x86, 0x60, + 0x47, 0x6d, 0x72, 0x4d, 0x42, 0x60, 0x6d, 0x5c, 0x70, 0x5d, 0x6f, 0x48, + 0x27, 0x76, 0x7b, 0x69, 0x39, 0x45, 0x5d, 0xa2, 0xb3, 0xb0, 0xb7, 0x71, + 0x66, 0x5d, 0x57, 0x68, 0x5e, 0x5c, 0x71, 0x55, 0x2e, 0x4c, 0x47, 0x5f, + 0x5c, 0x33, 0x34, 0x2e, 0x3e, 0x63, 0x76, 0x5d, 0x3f, 0x3a, 0x44, 0x4a, + 0x66, 0x5b, 0x4e, 0x49, 0x4c, 0x54, 0x5a, 0x5d, 0x64, 0x69, 0x58, 0x53, + 0x98, 0x81, 0x5c, 0x58, 0x5d, 0x6a, 0x77, 0x78, 0x70, 0x6b, 0x70, 0x77, + 0x72, 0x87, 0x89, 0x71, 0x64, 0x6e, 0x74, 0x6d, 0x6f, 0x6e, 0x6c, 0x69, + 0x66, 0x64, 0x64, 0x64, 0x6c, 0x71, 0x76, 0x76, 0x70, 0x68, 0x61, 0x5d, + 0x60, 0x69, 0x6e, 0x62, 0x50, 0x4a, 0x54, 0x63, 0x36, 0x3d, 0x4c, 0x62, + 0x77, 0x87, 0x95, 0x9e, 0x6e, 0x7b, 0x75, 0x75, 0x7d, 0x6e, 0x6f, 0x94, + 0x8a, 0x3d, 0x52, 0x5a, 0x68, 0x52, 0x5b, 0x86, 0x44, 0x67, 0x80, 0xa3, + 0xc8, 0xbd, 0xb5, 0xd5, 0xc1, 0xa9, 0xea, 0xc0, 0x78, 0x6a, 0x8b, 0xd0, + 0xca, 0xbf, 0xb9, 0xd2, 0xce, 0xbf, 0xaf, 0x6e, 0x42, 0x2b, 0x2d, 0x51, + 0x65, 0x57, 0x46, 0x45, 0x40, 0x23, 0x6b, 0xb9, 0x73, 0x1e, 0x3d, 0x71, + 0x1c, 0x34, 0x1f, 0x36, 0x1e, 0x2e, 0x14, 0x2c, 0x30, 0x64, 0x49, 0x4a, + 0x69, 0x54, 0x36, 0x1a, 0x36, 0x3f, 0x16, 0x1e, 0x56, 0x72, 0x8a, 0x9d, + 0x7e, 0xd7, 0xfe, 0xda, 0xe4, 0xdf, 0x6a, 0x01, 0x55, 0x31, 0x3d, 0x3e, + 0x54, 0x5c, 0x1f, 0x09, 0xda, 0xd8, 0xd2, 0xdd, 0xbd, 0x35, 0x64, 0xd6, + 0xde, 0xda, 0xd5, 0xd4, 0xd6, 0xd8, 0xd7, 0xd5, 0xd6, 0xd6, 0xd7, 0xd7, + 0xd8, 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xde, 0xde, 0xde, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe9, 0xdf, 0x9e, 0x97, 0xdf, 0xe4, 0xf2, 0xe1, 0xa3, 0xb1, 0xcd, 0xe1, + 0xdf, 0x96, 0xe3, 0xc7, 0xaf, 0xbf, 0x98, 0xaa, 0xbb, 0xb6, 0xe5, 0xbb, + 0xc1, 0xc9, 0xa2, 0xe5, 0xbb, 0xb1, 0xf6, 0xe5, 0xda, 0xec, 0xcf, 0xc0, + 0xde, 0xda, 0xc2, 0xd1, 0xdf, 0xd8, 0xd8, 0xd5, 0xe0, 0xe9, 0xd8, 0xd2, + 0x7c, 0x60, 0x8b, 0x55, 0x54, 0x8b, 0x60, 0x56, 0x90, 0xb1, 0xc5, 0xd6, + 0xdf, 0xf2, 0xb8, 0xaa, 0x90, 0xa0, 0x72, 0x6a, 0x60, 0x3d, 0x45, 0x3c, + 0x87, 0xac, 0x8d, 0x74, 0x8a, 0x8f, 0x9b, 0xc8, 0x5e, 0x61, 0xb0, 0xd1, + 0xc2, 0x69, 0x48, 0x65, 0x46, 0x56, 0x5a, 0x4f, 0x4c, 0x4d, 0x38, 0x19, + 0x88, 0x6e, 0x60, 0x6f, 0x55, 0x5d, 0x31, 0x52, 0x82, 0x70, 0x4a, 0x90, + 0xb7, 0xa8, 0xaa, 0x5a, 0x38, 0x51, 0x50, 0x5b, 0x6e, 0x5b, 0x44, 0x41, + 0x3b, 0x56, 0x61, 0x73, 0x5a, 0x2c, 0x3a, 0x4e, 0x39, 0x38, 0x39, 0x3f, + 0x4c, 0x58, 0x5d, 0x5b, 0x54, 0x3f, 0x29, 0x27, 0x38, 0x4f, 0x5c, 0x5f, + 0x59, 0x5f, 0x52, 0x55, 0xa2, 0x8e, 0x69, 0x65, 0x65, 0x6c, 0x72, 0x73, + 0x6f, 0x6d, 0x70, 0x74, 0x6d, 0x71, 0x76, 0x79, 0x78, 0x79, 0x80, 0x88, + 0x89, 0x76, 0x60, 0x58, 0x5e, 0x67, 0x69, 0x67, 0x68, 0x6e, 0x70, 0x68, + 0x5a, 0x50, 0x50, 0x54, 0x4a, 0x56, 0x60, 0x5e, 0x52, 0x4b, 0x4e, 0x55, + 0x4c, 0x56, 0x51, 0x46, 0x56, 0x78, 0x81, 0x73, 0x98, 0x8c, 0x8a, 0x7a, + 0x6e, 0x90, 0xaa, 0x93, 0x80, 0x6e, 0x90, 0x8a, 0x7b, 0x9b, 0x98, 0xd0, + 0xb3, 0x87, 0x85, 0xb7, 0xb2, 0x88, 0x8d, 0xa1, 0x79, 0x67, 0x56, 0x32, + 0x85, 0xb2, 0x9e, 0x6b, 0x39, 0x51, 0xb1, 0x59, 0x18, 0x4b, 0x2b, 0x36, + 0x1d, 0x3b, 0x3f, 0x35, 0x66, 0xbf, 0xe2, 0xcc, 0x6a, 0x43, 0xb1, 0xb9, + 0xdd, 0xfd, 0x4a, 0x00, 0xcc, 0xb9, 0x6b, 0x43, 0x2d, 0x37, 0x18, 0x16, + 0x36, 0xe7, 0xe9, 0x6f, 0x51, 0x90, 0x96, 0x33, 0x29, 0x25, 0x16, 0x34, + 0x28, 0x3e, 0xc7, 0xff, 0x9d, 0x22, 0x65, 0x64, 0x15, 0x20, 0x21, 0x32, + 0x32, 0x2a, 0x3a, 0x1a, 0x19, 0x33, 0x18, 0x16, 0xd5, 0xd3, 0xd0, 0xda, + 0xae, 0x2e, 0x70, 0xd6, 0xd8, 0xd4, 0xd0, 0xcf, 0xd2, 0xd3, 0xd3, 0xd1, + 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, 0xd9, 0xd9, 0xda, 0xdb, + 0xdc, 0xdd, 0xdd, 0xde, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xeb, 0xe2, 0xc0, 0x7d, 0x9b, 0xca, 0xde, 0xcc, + 0xcc, 0xb3, 0xcb, 0xd4, 0xd2, 0x95, 0xb9, 0xb7, 0xdf, 0xce, 0x6b, 0x96, + 0xb4, 0xc6, 0xe2, 0xd0, 0x9a, 0xba, 0xa9, 0xdd, 0x9f, 0xd1, 0xf3, 0xea, + 0xe2, 0xd7, 0xcd, 0xcf, 0xd7, 0xdc, 0xd8, 0xd0, 0xe5, 0xe0, 0xd8, 0xba, + 0xb2, 0xd2, 0xbe, 0x73, 0x73, 0x65, 0x5e, 0x1d, 0x4e, 0xb2, 0x74, 0x4e, + 0x80, 0xaf, 0xd7, 0xec, 0xda, 0xcb, 0x8a, 0x88, 0x84, 0x64, 0x9c, 0x6a, + 0x3b, 0x4c, 0x3a, 0x72, 0xb1, 0x5c, 0x37, 0x9c, 0x9c, 0x7c, 0x50, 0x8b, + 0x93, 0x54, 0x68, 0xab, 0xe2, 0x80, 0x35, 0x54, 0x76, 0x78, 0x67, 0x4b, + 0x45, 0x4e, 0x48, 0x35, 0x6f, 0x69, 0x5d, 0x63, 0x29, 0x28, 0x31, 0x81, + 0xba, 0xb9, 0x61, 0x6f, 0xa4, 0xac, 0xbc, 0x89, 0x7e, 0x84, 0x77, 0x68, + 0x71, 0x65, 0x4b, 0x55, 0x4b, 0x46, 0x38, 0x43, 0x5c, 0x6f, 0x70, 0x51, + 0x53, 0x4d, 0x47, 0x49, 0x50, 0x54, 0x4f, 0x47, 0x50, 0x3e, 0x2e, 0x33, + 0x48, 0x59, 0x5b, 0x56, 0x5f, 0x60, 0x57, 0x62, 0xab, 0x8a, 0x66, 0x6b, + 0x66, 0x65, 0x69, 0x74, 0x7f, 0x81, 0x79, 0x6f, 0x69, 0x5c, 0x5e, 0x71, + 0x7c, 0x77, 0x77, 0x80, 0x8d, 0x7d, 0x6a, 0x62, 0x66, 0x6f, 0x74, 0x75, + 0x7c, 0x73, 0x6b, 0x6c, 0x72, 0x73, 0x6c, 0x64, 0x76, 0x73, 0x6c, 0x63, + 0x58, 0x4c, 0x43, 0x3e, 0x4d, 0x5c, 0x58, 0x46, 0x4f, 0x75, 0x91, 0x93, + 0x8e, 0x85, 0x82, 0xc0, 0xf6, 0xaf, 0x5a, 0x64, 0x8f, 0x8e, 0x8b, 0x96, + 0x90, 0xe3, 0xaa, 0xb7, 0x8c, 0x9f, 0x9e, 0xa1, 0x97, 0x98, 0xa6, 0x86, + 0x4f, 0x81, 0x73, 0xa7, 0xd4, 0x63, 0x89, 0xcd, 0x93, 0x3c, 0x72, 0x67, + 0x61, 0x71, 0x26, 0x33, 0x39, 0x40, 0x31, 0x17, 0x19, 0x32, 0x34, 0x20, + 0x45, 0x9c, 0xea, 0xff, 0xff, 0xc1, 0x75, 0x9d, 0xd6, 0xff, 0xb0, 0x50, + 0xce, 0xff, 0xfa, 0xf0, 0xdf, 0xab, 0x62, 0x44, 0x21, 0x16, 0x35, 0x1f, + 0x1b, 0x44, 0x34, 0x3e, 0x31, 0x1f, 0x5c, 0x76, 0x41, 0x4e, 0x0d, 0x33, + 0x4d, 0x2b, 0x40, 0x1a, 0x20, 0x21, 0x30, 0x13, 0x2a, 0x57, 0x21, 0x00, + 0xd0, 0xce, 0xce, 0xd7, 0x9f, 0x27, 0x7b, 0xd7, 0xd3, 0xcf, 0xcb, 0xcb, + 0xcd, 0xd0, 0xcf, 0xce, 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdc, 0xdd, 0xdd, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdc, 0xdf, 0xea, 0xa7, + 0x50, 0xa3, 0xe1, 0xd9, 0xca, 0xaf, 0xc1, 0xe3, 0xf1, 0x9a, 0x65, 0x96, + 0xff, 0xeb, 0x8b, 0x86, 0xc3, 0xea, 0xca, 0xd5, 0x97, 0xcf, 0xb9, 0xb8, + 0x9a, 0xef, 0xdf, 0xcc, 0xd7, 0xd4, 0xc9, 0xc7, 0xd8, 0xe6, 0xe1, 0xd4, + 0xca, 0xd6, 0xe7, 0xe7, 0xc6, 0xc9, 0xcf, 0x8f, 0x65, 0x75, 0x6d, 0x48, + 0x4f, 0x7d, 0x7a, 0xac, 0xaf, 0xd2, 0xe7, 0xec, 0xdb, 0xe5, 0xcf, 0xee, + 0xda, 0x78, 0x8e, 0x95, 0x91, 0x8c, 0x49, 0x47, 0x3a, 0x78, 0x7a, 0x9d, + 0x84, 0x86, 0x32, 0x52, 0x7b, 0x4e, 0x3d, 0x4e, 0xa6, 0x8e, 0x53, 0x55, + 0x32, 0x60, 0x6e, 0x4c, 0x39, 0x46, 0x3e, 0x1f, 0x30, 0x5b, 0x68, 0x41, + 0x2b, 0x8b, 0x9c, 0x4b, 0x7c, 0xc2, 0xa1, 0x8e, 0x9e, 0x90, 0x76, 0x40, + 0x4f, 0x32, 0x45, 0x43, 0x3b, 0x4f, 0x4e, 0x49, 0x35, 0x30, 0x36, 0x39, + 0x30, 0x35, 0x47, 0x4c, 0x5b, 0x61, 0x5d, 0x58, 0x60, 0x68, 0x52, 0x30, + 0x22, 0x22, 0x2d, 0x48, 0x67, 0x77, 0x72, 0x67, 0x5e, 0x65, 0x61, 0x69, + 0xa7, 0x7e, 0x5a, 0x66, 0x5a, 0x6c, 0x82, 0x8e, 0x8e, 0x8a, 0x88, 0x89, + 0x83, 0x7a, 0x75, 0x7c, 0x85, 0x85, 0x7d, 0x74, 0x67, 0x6e, 0x72, 0x6c, + 0x61, 0x5d, 0x63, 0x6c, 0x6c, 0x6d, 0x70, 0x76, 0x7c, 0x81, 0x82, 0x81, + 0x77, 0x6b, 0x5b, 0x52, 0x50, 0x53, 0x56, 0x57, 0x46, 0x4b, 0x4d, 0x49, + 0x4a, 0x63, 0x95, 0xbf, 0x8e, 0xac, 0x85, 0x70, 0x9a, 0x8c, 0x70, 0x95, + 0xff, 0xdb, 0x92, 0x81, 0x78, 0xaa, 0x4f, 0x35, 0xa2, 0xd3, 0xcc, 0xe0, + 0xe4, 0xb4, 0xb2, 0xbe, 0xb5, 0xbd, 0xb8, 0xb9, 0xc3, 0x78, 0x4a, 0x66, + 0x2d, 0x2d, 0x46, 0x6d, 0x40, 0x07, 0x17, 0x1a, 0x27, 0x2e, 0x2a, 0x1c, + 0x1f, 0x31, 0x37, 0x2e, 0x3c, 0x3b, 0x0b, 0x4b, 0x84, 0x29, 0x23, 0x97, + 0xe4, 0xa4, 0xf7, 0xfc, 0xc6, 0xb9, 0xff, 0xc0, 0x4a, 0x3b, 0x24, 0x23, + 0x1c, 0x47, 0x7e, 0x50, 0x33, 0x56, 0x2b, 0x2b, 0x47, 0x16, 0x1b, 0x75, + 0xff, 0xc2, 0x3a, 0x1d, 0x4e, 0x3c, 0x20, 0x2d, 0x34, 0x23, 0x25, 0x03, + 0x11, 0x39, 0x14, 0x00, 0xcc, 0xcb, 0xcc, 0xd5, 0x94, 0x22, 0x84, 0xd7, + 0xcf, 0xcb, 0xc7, 0xc7, 0xca, 0xcc, 0xcc, 0xcb, 0xcd, 0xcd, 0xce, 0xcf, + 0xcf, 0xd0, 0xd1, 0xd1, 0xd4, 0xd5, 0xd6, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xec, 0xda, 0xde, 0xdc, 0x6c, 0x67, 0xbc, 0xdd, 0xe4, 0xc8, 0xb9, 0xe7, + 0xf7, 0xb5, 0x79, 0xd3, 0xec, 0xa0, 0xa8, 0xba, 0xde, 0xdb, 0xcc, 0xa9, + 0xb1, 0xe6, 0xba, 0x88, 0xad, 0xe6, 0xd5, 0xd6, 0xce, 0xc8, 0xb8, 0xc1, + 0xdf, 0xe4, 0xd9, 0xde, 0xde, 0xd9, 0xc8, 0xe5, 0xdc, 0xcb, 0xd4, 0x95, + 0x6e, 0x82, 0x62, 0x65, 0x70, 0x89, 0x7a, 0x72, 0xbb, 0xd5, 0xde, 0xe7, + 0xed, 0xfb, 0xb2, 0x95, 0x63, 0x3e, 0x4f, 0xa6, 0xa3, 0x50, 0x49, 0x6e, + 0x7f, 0x84, 0xcb, 0xe0, 0xaf, 0xff, 0xdf, 0x69, 0x4c, 0x65, 0x82, 0x68, + 0x87, 0x80, 0x5c, 0x47, 0x67, 0x4c, 0x40, 0x4e, 0x56, 0x4b, 0x43, 0x45, + 0x55, 0x75, 0x8d, 0x59, 0x3d, 0x70, 0xb0, 0x88, 0x7f, 0x92, 0x84, 0x66, + 0x4b, 0x3a, 0x39, 0x36, 0x3b, 0x36, 0x66, 0x56, 0x2c, 0x2f, 0x2b, 0x38, + 0x3a, 0x3c, 0x4e, 0x49, 0x3c, 0x49, 0x4c, 0x3e, 0x30, 0x4d, 0x64, 0x5b, + 0x44, 0x36, 0x37, 0x3d, 0x39, 0x3b, 0x43, 0x53, 0x63, 0x67, 0x5d, 0x51, + 0x3e, 0x5d, 0x64, 0x60, 0x97, 0x7a, 0x5f, 0x66, 0x64, 0x71, 0x79, 0x71, + 0x62, 0x5e, 0x6d, 0x7e, 0x71, 0x73, 0x72, 0x73, 0x7a, 0x80, 0x7a, 0x6e, + 0x65, 0x5f, 0x5b, 0x5d, 0x63, 0x61, 0x56, 0x4c, 0x59, 0x64, 0x6f, 0x6f, + 0x66, 0x60, 0x63, 0x69, 0x4d, 0x51, 0x55, 0x55, 0x51, 0x4e, 0x4e, 0x50, + 0x47, 0x41, 0x48, 0x60, 0x77, 0x76, 0x5f, 0x49, 0x4a, 0x38, 0x91, 0xc1, + 0x7b, 0x7c, 0xac, 0x8e, 0x0f, 0x34, 0x2f, 0x17, 0x60, 0xa9, 0x8f, 0x4d, + 0x19, 0x54, 0x5d, 0x5c, 0x5f, 0xa1, 0xe4, 0xa6, 0x3a, 0x27, 0x4c, 0x8d, + 0xc5, 0xb2, 0x35, 0x1b, 0x21, 0x62, 0x4e, 0x3a, 0x18, 0x2b, 0x74, 0x3c, + 0x59, 0x68, 0x57, 0x2b, 0x1d, 0x32, 0x36, 0x22, 0x10, 0x65, 0x71, 0x33, + 0x2b, 0x4c, 0x63, 0x7b, 0x3f, 0xe4, 0xfa, 0x90, 0x71, 0x4d, 0x3b, 0x64, + 0xff, 0xe9, 0x90, 0x4d, 0x20, 0x2e, 0x80, 0x9e, 0x51, 0x2f, 0x17, 0x13, + 0x24, 0x28, 0x5b, 0xd9, 0x9a, 0x86, 0x99, 0x30, 0x4d, 0xff, 0xff, 0xff, + 0xa2, 0x4d, 0x2f, 0x23, 0x2e, 0x34, 0x17, 0x30, 0xcb, 0xc9, 0xcc, 0xd4, + 0x8d, 0x1f, 0x88, 0xd7, 0xcc, 0xc8, 0xc5, 0xc5, 0xc8, 0xcb, 0xcb, 0xc9, + 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd3, 0xd4, 0xd5, 0xd7, + 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xd5, 0xe6, 0xdc, 0xea, 0xaf, 0x51, 0xb3, 0xeb, + 0xdc, 0xc9, 0xaf, 0xe5, 0xe0, 0xc0, 0x9a, 0xe9, 0xe5, 0xc3, 0xca, 0xa7, + 0xe1, 0xc4, 0xd8, 0x93, 0x82, 0xd0, 0xc7, 0x9b, 0xea, 0xd7, 0xcd, 0xec, + 0xdb, 0xa0, 0xa8, 0xd6, 0xd7, 0xd4, 0xe1, 0xdf, 0xd4, 0xe9, 0xc2, 0xd8, + 0xec, 0xe6, 0xd8, 0x6e, 0x7c, 0x86, 0x52, 0x67, 0x68, 0x82, 0x9f, 0x99, + 0xae, 0xe2, 0xeb, 0xcd, 0xbc, 0xe8, 0xd8, 0xe0, 0xad, 0x92, 0x6c, 0x4d, + 0x5e, 0x67, 0x56, 0x68, 0x5e, 0x7c, 0xa8, 0x73, 0x72, 0xcb, 0xfd, 0xfd, + 0xab, 0xb1, 0xc0, 0x74, 0x4a, 0x3b, 0x43, 0x43, 0x58, 0x61, 0x67, 0x62, + 0x59, 0x53, 0x4f, 0x4b, 0x42, 0x4b, 0x64, 0x59, 0x60, 0x3a, 0x74, 0x9a, + 0x44, 0x1d, 0x48, 0x79, 0x60, 0x39, 0x35, 0x4f, 0x71, 0x61, 0x63, 0x4e, + 0x63, 0x68, 0x33, 0x3e, 0x30, 0x24, 0x45, 0x5a, 0x52, 0x4f, 0x45, 0x3c, + 0x48, 0x31, 0x30, 0x48, 0x4f, 0x3d, 0x34, 0x3f, 0x4b, 0x45, 0x3e, 0x3e, + 0x42, 0x44, 0x42, 0x3e, 0x16, 0x4d, 0x5e, 0x51, 0x8a, 0x80, 0x6d, 0x6f, + 0x6f, 0x68, 0x62, 0x62, 0x68, 0x6d, 0x6d, 0x6a, 0x6f, 0x71, 0x73, 0x74, + 0x72, 0x6f, 0x6a, 0x66, 0x6c, 0x6f, 0x6f, 0x68, 0x5d, 0x57, 0x5b, 0x60, + 0x62, 0x63, 0x68, 0x71, 0x7a, 0x7b, 0x73, 0x6b, 0x71, 0x76, 0x76, 0x69, + 0x5a, 0x58, 0x67, 0x77, 0x64, 0x59, 0x3d, 0x31, 0x58, 0x9a, 0xbd, 0xba, + 0xc0, 0xca, 0xd7, 0xaa, 0x62, 0x55, 0x45, 0x08, 0x26, 0x14, 0x1a, 0x2f, + 0xe5, 0xff, 0xf6, 0x8e, 0x64, 0x5b, 0x19, 0x22, 0x30, 0x1b, 0x2e, 0x22, + 0x1a, 0x2d, 0x76, 0xeb, 0x7c, 0x70, 0xa6, 0x1f, 0x25, 0x32, 0x29, 0x27, + 0x7b, 0xfe, 0xfa, 0x79, 0x36, 0x38, 0x3c, 0x3b, 0x34, 0x2c, 0x2b, 0x2f, + 0x40, 0x30, 0x2a, 0x46, 0x28, 0x10, 0x2e, 0x0e, 0x5d, 0x97, 0xa8, 0xe1, + 0xaf, 0x48, 0x31, 0xd2, 0xff, 0xf2, 0x70, 0x1c, 0x2a, 0x3e, 0x3d, 0x1c, + 0x3d, 0x00, 0x30, 0x2b, 0x29, 0xa6, 0xf5, 0xf8, 0xf3, 0xff, 0xf8, 0xff, + 0xd0, 0x7b, 0xc2, 0xff, 0xf7, 0x4a, 0x0a, 0x42, 0x82, 0x62, 0x04, 0x00, + 0xc3, 0xcc, 0xba, 0xd6, 0x77, 0x23, 0x96, 0xd3, 0xc3, 0xc4, 0xc5, 0xc4, + 0xc2, 0xc1, 0xc1, 0xc2, 0xce, 0xca, 0xc9, 0xcb, 0xcb, 0xc9, 0xca, 0xcd, + 0xd2, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xdd, 0xda, 0xda, 0xdb, 0xdc, + 0xdd, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe2, 0xd3, 0xe6, 0xec, + 0xd7, 0x79, 0x83, 0xd1, 0xce, 0xcd, 0xb3, 0xd9, 0xe3, 0x9a, 0x86, 0xa3, + 0x96, 0xde, 0xce, 0xbe, 0xc5, 0xb8, 0xbe, 0xbd, 0xa9, 0xc7, 0xc9, 0xa2, + 0xe7, 0xd2, 0xdd, 0xd4, 0xc7, 0xbf, 0xc5, 0xd6, 0xd8, 0xcd, 0xcd, 0xd7, + 0xdc, 0xe0, 0xe4, 0xd5, 0xe3, 0xdb, 0xd1, 0x66, 0x50, 0x61, 0x49, 0x54, + 0x55, 0x6d, 0x5d, 0x6e, 0xb3, 0xa0, 0xb7, 0xcd, 0x97, 0x4c, 0x42, 0x60, + 0xca, 0xd0, 0xb1, 0xa0, 0x9d, 0x85, 0x61, 0x3c, 0x29, 0x27, 0x29, 0x30, + 0x30, 0x2d, 0x2f, 0x37, 0x86, 0xc0, 0xa1, 0x62, 0x68, 0x69, 0x52, 0x58, + 0x56, 0x4f, 0x51, 0x55, 0x48, 0x32, 0x2f, 0x3b, 0x5e, 0x5b, 0x8e, 0x56, + 0x2e, 0x4b, 0x58, 0xac, 0x4c, 0x2d, 0x4e, 0x77, 0x5c, 0x3f, 0x49, 0x53, + 0x65, 0x49, 0x46, 0x37, 0x52, 0x4c, 0x17, 0x42, 0x3e, 0x21, 0x42, 0x57, + 0x61, 0x57, 0x2f, 0x42, 0x6c, 0x47, 0x38, 0x4b, 0x51, 0x3a, 0x34, 0x47, + 0x46, 0x5c, 0x65, 0x58, 0x37, 0x11, 0x19, 0x45, 0x58, 0x75, 0x69, 0x6a, + 0x96, 0x99, 0x73, 0x68, 0x68, 0x60, 0x5a, 0x60, 0x6d, 0x75, 0x73, 0x6c, + 0x78, 0x71, 0x6b, 0x6b, 0x72, 0x78, 0x7b, 0x7a, 0x61, 0x67, 0x6b, 0x6a, + 0x66, 0x64, 0x68, 0x6e, 0x62, 0x6b, 0x71, 0x69, 0x59, 0x4e, 0x50, 0x57, + 0x6d, 0x66, 0x5d, 0x5a, 0x5c, 0x5d, 0x5a, 0x57, 0x45, 0x44, 0x34, 0x70, + 0x72, 0x63, 0x31, 0x0c, 0x75, 0xeb, 0xff, 0x98, 0x71, 0x73, 0x4b, 0x3c, + 0x4f, 0x5f, 0x53, 0x31, 0x33, 0x64, 0x92, 0xa1, 0xcc, 0xd4, 0xf9, 0x73, + 0x4b, 0x3d, 0x20, 0x32, 0x75, 0xb3, 0x3e, 0x3e, 0x36, 0x20, 0x28, 0x35, + 0x44, 0x27, 0x65, 0xaa, 0x73, 0xa7, 0xff, 0xc5, 0xae, 0x75, 0x28, 0x32, + 0x37, 0x43, 0x75, 0x56, 0x3f, 0x42, 0x2b, 0x22, 0x36, 0x3b, 0x42, 0x60, + 0xff, 0x86, 0x75, 0xdb, 0xc6, 0x4b, 0x6f, 0xff, 0xfe, 0x86, 0x1c, 0x0a, + 0x24, 0x36, 0x35, 0x2c, 0x39, 0x1a, 0x22, 0x2d, 0x2b, 0x5c, 0x8a, 0x79, + 0xa9, 0x9e, 0xd4, 0xdb, 0x95, 0xa1, 0xeb, 0xf9, 0xe6, 0xbd, 0x8b, 0x6c, + 0x5e, 0x4b, 0x2a, 0x0e, 0xc3, 0xca, 0xbb, 0xd1, 0x72, 0x27, 0x99, 0xd2, + 0xcc, 0xc7, 0xc2, 0xc1, 0xc6, 0xcc, 0xcf, 0xd0, 0xcb, 0xca, 0xca, 0xcd, + 0xcf, 0xce, 0xce, 0xce, 0xd2, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdb, 0xdc, + 0xda, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe3, 0xe4, 0xde, 0xde, 0xe2, 0xad, 0x7c, 0xc2, 0xe4, 0xd4, 0xbb, 0xce, + 0xc6, 0xa9, 0xac, 0x9a, 0xaf, 0xd8, 0xa8, 0xbe, 0xe2, 0xb8, 0xb5, 0xbd, + 0xbc, 0xf0, 0xbe, 0xa1, 0xd2, 0xc0, 0xd5, 0xc9, 0xaf, 0xc3, 0xd7, 0xdc, + 0xd8, 0xd6, 0xd7, 0xd9, 0xc0, 0xd4, 0xd1, 0xcd, 0xec, 0xcf, 0xbf, 0x90, + 0x73, 0x7b, 0x70, 0x71, 0x52, 0x63, 0x6a, 0x7b, 0xb4, 0xf2, 0xf7, 0xa2, + 0x54, 0x49, 0x63, 0x77, 0x76, 0x88, 0x89, 0x52, 0x1e, 0x1b, 0x25, 0x2e, + 0x4b, 0x43, 0x39, 0x36, 0x3f, 0x45, 0x3a, 0x2a, 0x24, 0x40, 0x33, 0x3e, + 0x7a, 0x84, 0x6d, 0x7c, 0x5b, 0x4f, 0x4d, 0x54, 0x4f, 0x3d, 0x38, 0x41, + 0x1b, 0x4a, 0x88, 0x7a, 0x45, 0x35, 0x5b, 0xa4, 0x79, 0x55, 0x43, 0x5d, + 0x6e, 0x58, 0x4a, 0x5b, 0x3f, 0x4f, 0x5e, 0x33, 0x40, 0x62, 0x32, 0x1e, + 0x23, 0x2f, 0x3a, 0x59, 0x77, 0x77, 0x54, 0x23, 0x39, 0x41, 0x33, 0x32, + 0x4f, 0x56, 0x41, 0x35, 0x29, 0x20, 0x24, 0x42, 0x69, 0x81, 0x93, 0xa3, + 0x8b, 0x85, 0x75, 0x73, 0x7d, 0x79, 0x6f, 0x71, 0x71, 0x70, 0x6f, 0x6c, + 0x67, 0x61, 0x5c, 0x59, 0x6c, 0x68, 0x66, 0x68, 0x6c, 0x6c, 0x67, 0x62, + 0x66, 0x73, 0x82, 0x86, 0x7d, 0x6e, 0x62, 0x5c, 0x75, 0x7a, 0x7b, 0x6f, + 0x60, 0x5b, 0x64, 0x6f, 0x6a, 0x64, 0x5c, 0x55, 0x51, 0x4d, 0x4b, 0x49, + 0x4b, 0x46, 0x40, 0x3b, 0x20, 0x1b, 0xbc, 0xef, 0xb3, 0x75, 0x5a, 0xa3, + 0xc0, 0x6f, 0x3c, 0x4b, 0x6b, 0x46, 0x54, 0x98, 0xb4, 0x87, 0x55, 0x49, + 0x1e, 0x40, 0x4e, 0x19, 0x31, 0x22, 0x1b, 0x87, 0xfe, 0xb6, 0x0e, 0x4e, + 0x3e, 0x05, 0x39, 0x44, 0x3f, 0x59, 0xdc, 0xdb, 0x6a, 0x42, 0x3f, 0x4e, + 0x8d, 0x3b, 0x0e, 0x3c, 0x71, 0x4a, 0x1e, 0x46, 0x3a, 0x19, 0x1b, 0x29, + 0x3d, 0x77, 0x7b, 0x2f, 0x57, 0x20, 0x19, 0x4e, 0x5e, 0x34, 0x21, 0x36, + 0x0f, 0x20, 0x16, 0x46, 0x9a, 0x84, 0x4d, 0x61, 0x00, 0x4f, 0xa2, 0x93, + 0x3f, 0x1d, 0x39, 0x51, 0x16, 0x4d, 0x77, 0x3a, 0x0b, 0x7a, 0xd7, 0xaa, + 0x83, 0x6a, 0x4e, 0x44, 0x44, 0x36, 0x17, 0x00, 0xc1, 0xc8, 0xbc, 0xc8, + 0x69, 0x2c, 0x9f, 0xd0, 0xce, 0xc8, 0xc2, 0xc3, 0xc9, 0xcf, 0xcf, 0xcd, + 0xca, 0xcc, 0xcd, 0xcf, 0xd2, 0xd3, 0xd2, 0xd0, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd7, 0xd9, 0xda, 0xda, 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xd4, 0xde, 0xd6, 0xd8, 0xdf, 0xcf, 0x64, 0x6a, + 0xe3, 0xbb, 0xb8, 0xe5, 0xcb, 0xa3, 0xab, 0x8d, 0xcd, 0xcb, 0x82, 0xc4, + 0xf7, 0xb4, 0xb5, 0xb9, 0xb5, 0xfc, 0x91, 0xa8, 0xd5, 0xcb, 0xdd, 0xc4, + 0xa2, 0xca, 0xe6, 0xe2, 0xd9, 0xde, 0xe0, 0xda, 0xc6, 0xc7, 0xcf, 0xc9, + 0xc9, 0xc4, 0xd4, 0xb1, 0x79, 0x67, 0x60, 0x6c, 0x5b, 0x75, 0x84, 0x85, + 0x73, 0x96, 0x73, 0x36, 0x35, 0x41, 0x38, 0x35, 0x2f, 0x4c, 0x94, 0x6d, + 0x34, 0x49, 0x48, 0x45, 0x23, 0x4a, 0x5b, 0x3e, 0x22, 0x26, 0x37, 0x3d, + 0x4b, 0x4e, 0x51, 0x82, 0xb7, 0x96, 0x65, 0x71, 0x40, 0x3d, 0x42, 0x47, + 0x3a, 0x29, 0x2f, 0x43, 0x48, 0x5e, 0x62, 0x62, 0x3d, 0x25, 0x67, 0xa5, + 0x4a, 0x4e, 0x40, 0x4c, 0x65, 0x4b, 0x40, 0x70, 0x73, 0x58, 0x5a, 0x3e, + 0x32, 0x4a, 0x40, 0x37, 0x18, 0x3a, 0x45, 0x79, 0x76, 0x49, 0x56, 0x4c, + 0x51, 0x75, 0x5e, 0x29, 0x27, 0x40, 0x40, 0x37, 0x67, 0x90, 0x83, 0x72, + 0x90, 0x93, 0x7b, 0x81, 0x5d, 0x6a, 0x76, 0x81, 0x7d, 0x66, 0x65, 0x81, + 0x6e, 0x6e, 0x6a, 0x5e, 0x55, 0x57, 0x65, 0x73, 0x76, 0x6f, 0x68, 0x6b, + 0x77, 0x86, 0x92, 0x97, 0x8e, 0x8b, 0x81, 0x75, 0x6c, 0x6e, 0x7a, 0x85, + 0x76, 0x78, 0x74, 0x67, 0x58, 0x57, 0x66, 0x75, 0x77, 0x74, 0x6d, 0x62, + 0x56, 0x4f, 0x4e, 0x4f, 0x46, 0x3c, 0x42, 0x45, 0x4c, 0x39, 0x5a, 0x23, + 0x14, 0x3d, 0x62, 0xa9, 0x82, 0x33, 0x55, 0x58, 0xab, 0x45, 0x12, 0x3d, + 0x58, 0x39, 0x2f, 0x4e, 0x73, 0x46, 0x1f, 0x3c, 0x43, 0x22, 0x0b, 0x47, + 0x22, 0x2f, 0x41, 0x38, 0x1b, 0x22, 0x18, 0x5d, 0x46, 0x1a, 0x6a, 0xdc, + 0xff, 0x9e, 0x20, 0x2f, 0x65, 0x6c, 0xba, 0x91, 0x55, 0x74, 0x74, 0x77, + 0x3d, 0x6d, 0x68, 0x3a, 0x43, 0x72, 0x72, 0x4e, 0x1c, 0x37, 0x3e, 0x2c, + 0x2c, 0x3f, 0x3f, 0x29, 0x2d, 0x65, 0x40, 0x13, 0x40, 0x57, 0x3c, 0x3d, + 0xe5, 0xeb, 0xf5, 0xef, 0xa9, 0x46, 0x45, 0x99, 0x62, 0x1d, 0x1b, 0x31, + 0x1e, 0x32, 0x63, 0x6b, 0x38, 0x2e, 0x28, 0x31, 0x3d, 0x37, 0x1d, 0x04, + 0xbf, 0xc4, 0xbd, 0xbd, 0x5c, 0x34, 0xa6, 0xcd, 0xc5, 0xc5, 0xc6, 0xc6, + 0xc6, 0xc4, 0xc3, 0xc1, 0xc9, 0xcf, 0xd2, 0xcf, 0xce, 0xd2, 0xd4, 0xd2, + 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xda, + 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xe5, 0xdc, 0xde, 0xe0, + 0xde, 0xf1, 0xaa, 0x62, 0xba, 0xb9, 0xc4, 0xe7, 0xc7, 0x97, 0x9e, 0x8f, + 0xdc, 0xbb, 0x7f, 0xd2, 0xe7, 0xad, 0xcb, 0xb1, 0xc6, 0xff, 0x78, 0xc7, + 0xe1, 0xc7, 0xc2, 0xa1, 0xbb, 0xd1, 0xe1, 0xe0, 0xdd, 0xdf, 0xdf, 0xda, + 0xd9, 0xc5, 0xd2, 0xd8, 0xc4, 0xc4, 0xd3, 0xb7, 0x87, 0x68, 0x53, 0x55, + 0x56, 0x6f, 0x88, 0x93, 0x74, 0x8e, 0x6a, 0x49, 0x5c, 0x55, 0x49, 0x6c, + 0x52, 0x4f, 0x99, 0x5e, 0x16, 0x41, 0x41, 0x3c, 0x2b, 0x51, 0x5d, 0x42, + 0x3a, 0x53, 0x5e, 0x51, 0x76, 0x71, 0x6b, 0x80, 0x86, 0x4f, 0x24, 0x36, + 0x41, 0x4a, 0x58, 0x57, 0x3e, 0x2c, 0x40, 0x63, 0x64, 0x69, 0x73, 0x68, + 0x3d, 0x25, 0x53, 0x98, 0x5b, 0x6b, 0x71, 0x77, 0x72, 0x4c, 0x3c, 0x59, + 0x50, 0x3a, 0x6b, 0x95, 0x7d, 0x60, 0x46, 0x2b, 0x4f, 0x44, 0x3f, 0x70, + 0x80, 0x69, 0x7c, 0x8b, 0x65, 0x27, 0x1b, 0x4e, 0x70, 0x6e, 0x66, 0x61, + 0x75, 0x8c, 0x8b, 0x7f, 0x7e, 0x79, 0x8e, 0xbc, 0xc6, 0xae, 0x81, 0x77, + 0x92, 0x8c, 0x77, 0x7f, 0x61, 0x61, 0x5f, 0x58, 0x55, 0x5e, 0x71, 0x82, + 0x7e, 0x7a, 0x77, 0x76, 0x74, 0x6c, 0x60, 0x56, 0x62, 0x65, 0x66, 0x63, + 0x5e, 0x5f, 0x67, 0x6e, 0x6d, 0x6f, 0x69, 0x58, 0x44, 0x3c, 0x44, 0x4f, + 0x70, 0x6f, 0x6a, 0x5f, 0x53, 0x4d, 0x4d, 0x50, 0x66, 0x51, 0x3f, 0x37, + 0x2e, 0x58, 0x54, 0x96, 0xc3, 0xc5, 0x4c, 0x18, 0x26, 0x80, 0xbf, 0x1b, + 0x2c, 0x23, 0x23, 0x2d, 0x31, 0x2f, 0x36, 0x44, 0x2e, 0x1c, 0x20, 0xc0, + 0xff, 0xf2, 0x9d, 0x6b, 0x4f, 0x55, 0x13, 0x1e, 0x11, 0x0a, 0x39, 0x0f, + 0x83, 0xea, 0xfc, 0xf1, 0xb3, 0x4e, 0x3b, 0x3f, 0x02, 0xb9, 0xe7, 0x6d, + 0x62, 0x80, 0x45, 0x37, 0x5f, 0x74, 0x59, 0x6f, 0xec, 0xff, 0xe0, 0x80, + 0x34, 0x2d, 0x1f, 0x19, 0x2a, 0x42, 0x43, 0x33, 0x44, 0x43, 0x3f, 0x32, + 0x27, 0x31, 0x3b, 0x37, 0x85, 0x9b, 0x61, 0x22, 0x35, 0x45, 0x2d, 0x25, + 0x38, 0x28, 0x4c, 0x73, 0x6d, 0x6d, 0x6b, 0x4f, 0x2c, 0x25, 0x21, 0x28, + 0x32, 0x30, 0x21, 0x11, 0xbd, 0xc1, 0xbf, 0xb1, 0x4f, 0x3c, 0xae, 0xca, + 0xbf, 0xc3, 0xc5, 0xc2, 0xbd, 0xbd, 0xc5, 0xcc, 0xbd, 0xce, 0xd6, 0xcf, + 0xc8, 0xcc, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd1, 0xda, 0xd8, 0xd6, 0xe2, 0xd8, 0x66, 0x92, 0xd7, 0xe7, 0xe8, + 0xcc, 0x9b, 0xa5, 0xb9, 0xd9, 0xaf, 0x9e, 0xdc, 0xbf, 0xa9, 0xe3, 0xac, + 0xc5, 0xef, 0x78, 0xde, 0xd5, 0xb4, 0xb4, 0xb4, 0xe7, 0xd7, 0xd0, 0xd9, + 0xdf, 0xdb, 0xd6, 0xd7, 0xd9, 0xca, 0xbf, 0xc9, 0xd3, 0xd0, 0xbe, 0xc5, + 0x70, 0x89, 0x99, 0x8c, 0x7a, 0x6e, 0x95, 0xcf, 0xcb, 0xcf, 0x75, 0x23, + 0x3c, 0x54, 0x3f, 0x3a, 0x49, 0x4c, 0xa1, 0x6f, 0x25, 0x47, 0x48, 0x4a, + 0x30, 0x56, 0x62, 0x49, 0x42, 0x5b, 0x67, 0x5b, 0x7a, 0x76, 0x65, 0x5f, + 0x64, 0x5d, 0x5c, 0x6f, 0x41, 0x3a, 0x3b, 0x3e, 0x34, 0x29, 0x35, 0x4d, + 0x2d, 0x43, 0x8d, 0x69, 0x2f, 0x31, 0x53, 0xc1, 0x65, 0x4d, 0x5a, 0x76, + 0x78, 0x74, 0x6c, 0x55, 0x62, 0x56, 0x5d, 0x61, 0x4e, 0x65, 0x8a, 0x75, + 0x70, 0x75, 0x85, 0x64, 0x4d, 0x5a, 0x64, 0x81, 0x76, 0x4a, 0x62, 0x91, + 0x9d, 0xb6, 0xb7, 0x80, 0x81, 0x66, 0x91, 0xc3, 0xa2, 0x84, 0xab, 0xdb, + 0x81, 0x92, 0xab, 0xbd, 0xc1, 0xb2, 0x8a, 0x5e, 0x5f, 0x64, 0x6a, 0x6c, + 0x6a, 0x66, 0x62, 0x5f, 0x79, 0x6d, 0x5e, 0x57, 0x59, 0x60, 0x66, 0x68, + 0x67, 0x67, 0x63, 0x5c, 0x58, 0x5c, 0x68, 0x73, 0x3a, 0x46, 0x52, 0x53, + 0x4f, 0x50, 0x5b, 0x67, 0x72, 0x70, 0x6b, 0x65, 0x60, 0x5e, 0x5f, 0x61, + 0x55, 0x50, 0x46, 0x48, 0x4c, 0x61, 0x1b, 0x24, 0x2d, 0xb8, 0xcb, 0x97, + 0x23, 0x1e, 0x9a, 0x6c, 0x53, 0x9c, 0xde, 0xe3, 0xbf, 0x90, 0x5e, 0x36, + 0x8d, 0xfb, 0xe9, 0xff, 0xe7, 0xad, 0x8f, 0xbf, 0x49, 0x39, 0x7e, 0x64, + 0x70, 0x73, 0x39, 0x82, 0xff, 0xd0, 0x4f, 0x1a, 0x28, 0x45, 0x58, 0x1b, + 0x16, 0x55, 0x45, 0x2d, 0x22, 0x24, 0x6a, 0xa6, 0x35, 0x28, 0x43, 0x60, + 0x6e, 0x8d, 0x81, 0x3d, 0x1f, 0x17, 0x23, 0x3c, 0x3b, 0x23, 0x19, 0x24, + 0x43, 0x74, 0x95, 0x7a, 0x4a, 0x3c, 0x3d, 0x34, 0x00, 0x55, 0x69, 0x3f, + 0x39, 0x3d, 0x43, 0x63, 0x89, 0x8f, 0x7a, 0x36, 0x09, 0x2d, 0x5a, 0x56, + 0x44, 0x37, 0x26, 0x1b, 0x18, 0x16, 0x11, 0x0c, 0xbb, 0xbd, 0xc0, 0xa5, + 0x43, 0x44, 0xb5, 0xc7, 0xc2, 0xc0, 0xbd, 0xba, 0xbb, 0xc3, 0xcf, 0xd9, + 0x9b, 0xbf, 0xda, 0xd5, 0xc7, 0xc8, 0xcf, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xd7, 0xdf, 0xe2, 0xdd, 0xe4, 0xd8, 0xe5, 0x87, + 0x58, 0x93, 0xba, 0xf1, 0xd3, 0x61, 0x67, 0xbe, 0xd0, 0xac, 0xbd, 0xd4, + 0xa6, 0xb1, 0xe0, 0xb3, 0xb3, 0xc5, 0x90, 0xdd, 0xaf, 0xa8, 0xc1, 0xe8, + 0xfc, 0xda, 0xc7, 0xd2, 0xde, 0xd7, 0xd0, 0xd3, 0xd2, 0xdb, 0xdc, 0xd1, + 0xc6, 0xde, 0xab, 0x77, 0x73, 0x65, 0x54, 0x44, 0x55, 0x3a, 0x3b, 0x51, + 0xa4, 0xb1, 0x7a, 0x37, 0x35, 0x44, 0x4b, 0x5b, 0x58, 0x3e, 0x5f, 0x42, + 0x21, 0x3d, 0x3c, 0x3c, 0x30, 0x59, 0x6b, 0x51, 0x37, 0x3e, 0x51, 0x58, + 0x59, 0x60, 0x5d, 0x5c, 0x6c, 0x7f, 0x7e, 0x71, 0x6f, 0x4f, 0x3b, 0x43, + 0x50, 0x4e, 0x4a, 0x4d, 0x4b, 0x4e, 0x92, 0x5f, 0x39, 0x4e, 0x3c, 0x7b, + 0x81, 0x62, 0x69, 0x6e, 0x51, 0x54, 0x60, 0x47, 0x6e, 0x76, 0x70, 0x78, + 0x68, 0x5f, 0x7a, 0x6c, 0x89, 0x59, 0x63, 0x68, 0x8d, 0xaf, 0x8f, 0x95, + 0xca, 0xbb, 0xb6, 0x89, 0x5a, 0x8c, 0xce, 0xc4, 0xf4, 0xd9, 0xa7, 0xa3, + 0xcc, 0xc4, 0x96, 0x84, 0x3a, 0x64, 0xb1, 0xbf, 0x8c, 0x86, 0x94, 0x79, + 0x6a, 0x6c, 0x6e, 0x6e, 0x6b, 0x66, 0x61, 0x5e, 0x69, 0x67, 0x66, 0x6a, + 0x6d, 0x6c, 0x64, 0x5d, 0x5a, 0x62, 0x69, 0x68, 0x5f, 0x56, 0x51, 0x51, + 0x5c, 0x67, 0x70, 0x6b, 0x5e, 0x55, 0x58, 0x5f, 0x5c, 0x55, 0x4e, 0x4e, + 0x53, 0x57, 0x55, 0x52, 0x54, 0x46, 0x3b, 0x38, 0x3d, 0x12, 0x35, 0x2a, + 0x70, 0x76, 0x4f, 0x59, 0x45, 0x31, 0x54, 0x2a, 0x2e, 0x32, 0x40, 0x4b, + 0x45, 0x39, 0x42, 0x56, 0x29, 0x79, 0x5e, 0x4d, 0x36, 0x1b, 0x1b, 0x2c, + 0x6a, 0x12, 0x2e, 0x89, 0x5c, 0x22, 0xad, 0xe4, 0x6d, 0x26, 0x43, 0x51, + 0x3b, 0x33, 0x27, 0x47, 0x26, 0x00, 0x6e, 0xff, 0x96, 0x27, 0x57, 0x2c, + 0x57, 0x3c, 0x2f, 0x32, 0x30, 0x33, 0x3f, 0x45, 0x0e, 0x2f, 0x62, 0x84, + 0x7f, 0x73, 0x87, 0xab, 0x2b, 0x60, 0x5f, 0x4c, 0x41, 0x17, 0x37, 0xb3, + 0xe4, 0x9a, 0x64, 0x7a, 0x8e, 0x65, 0x4f, 0x70, 0x59, 0x28, 0x1d, 0x45, + 0x58, 0x4b, 0x51, 0x6b, 0x68, 0x5a, 0x44, 0x2e, 0x1f, 0x18, 0x17, 0x17, + 0xb9, 0xbb, 0xc1, 0x9d, 0x39, 0x49, 0xbb, 0xc5, 0xc7, 0xbd, 0xb6, 0xbb, + 0xc6, 0xca, 0xc2, 0xb7, 0x6d, 0xa8, 0xdb, 0xe0, 0xcf, 0xca, 0xce, 0xd0, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd6, 0xd6, 0xd7, 0xd8, + 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xd5, 0xdd, 0xd2, 0xd4, + 0xd6, 0xd8, 0xe8, 0xc8, 0x7e, 0x90, 0xb6, 0xf9, 0xce, 0x6b, 0x93, 0xf3, + 0xce, 0xb2, 0xc6, 0xbb, 0xaf, 0xc2, 0xc0, 0xc6, 0xbb, 0xab, 0xb7, 0xd2, + 0x94, 0xb6, 0xc2, 0xda, 0xe9, 0xda, 0xcf, 0xd1, 0xd8, 0xd9, 0xd2, 0xcd, + 0xd7, 0xcd, 0xc7, 0xac, 0x95, 0xe8, 0xde, 0xa8, 0x84, 0x62, 0x4e, 0x2f, + 0x34, 0x26, 0x51, 0x78, 0xb0, 0x86, 0x70, 0x7f, 0x78, 0x49, 0x2f, 0x3c, + 0x2e, 0x1d, 0x2f, 0x4f, 0x67, 0x67, 0x4c, 0x39, 0x5f, 0x59, 0x51, 0x53, + 0x5f, 0x69, 0x61, 0x52, 0x59, 0x69, 0x77, 0x73, 0x6a, 0x6d, 0x6a, 0x5b, + 0x6b, 0x52, 0x41, 0x42, 0x42, 0x3b, 0x3e, 0x4a, 0x43, 0x4a, 0x6f, 0x6c, + 0x88, 0xa8, 0x6e, 0x45, 0x6e, 0x79, 0x84, 0x7b, 0x65, 0x64, 0x73, 0x7b, + 0x81, 0xa9, 0x91, 0x90, 0x8b, 0x74, 0x85, 0x7c, 0xad, 0x99, 0xab, 0xc9, + 0xc8, 0xb1, 0xb0, 0xd4, 0xe2, 0xb6, 0xb4, 0xd7, 0xba, 0x57, 0x28, 0x44, + 0x78, 0xc7, 0xa7, 0x6b, 0x96, 0xc1, 0xca, 0xed, 0xff, 0xff, 0xfa, 0xea, + 0xd2, 0xb1, 0x8b, 0x6f, 0x6c, 0x70, 0x6f, 0x67, 0x5f, 0x61, 0x70, 0x7e, + 0x93, 0x89, 0x7d, 0x77, 0x79, 0x7d, 0x7e, 0x7e, 0x7e, 0x7b, 0x74, 0x68, + 0x5f, 0x60, 0x6b, 0x74, 0x74, 0x7a, 0x7c, 0x71, 0x60, 0x58, 0x5e, 0x67, + 0x64, 0x55, 0x49, 0x4c, 0x5b, 0x63, 0x5c, 0x51, 0x48, 0x3f, 0x4c, 0x95, + 0xa9, 0x40, 0x4d, 0x46, 0x4e, 0x4a, 0x25, 0x23, 0x41, 0x4f, 0x5d, 0x65, + 0x56, 0x2f, 0x1c, 0x27, 0x26, 0x1c, 0x37, 0x65, 0x2f, 0x3d, 0x49, 0x4e, + 0x53, 0x38, 0x37, 0x1d, 0x49, 0xce, 0xc5, 0x3a, 0x78, 0x72, 0x36, 0x61, + 0x3b, 0x18, 0x31, 0x25, 0x21, 0x3f, 0x32, 0x38, 0x1f, 0x19, 0x13, 0x31, + 0x3b, 0x15, 0x06, 0x14, 0x48, 0x4d, 0x32, 0x33, 0x4f, 0x2c, 0x01, 0x14, + 0x2f, 0x23, 0x1c, 0x27, 0x37, 0x3d, 0x37, 0x2f, 0x7d, 0x4e, 0x4e, 0xb0, + 0xca, 0x51, 0x54, 0xff, 0xd6, 0xc8, 0xa7, 0x60, 0x19, 0x1a, 0x44, 0x59, + 0x33, 0x1a, 0x18, 0x46, 0x78, 0x7c, 0x6b, 0x68, 0x60, 0x5c, 0x52, 0x43, + 0x32, 0x26, 0x20, 0x1f, 0xb9, 0xb9, 0xc2, 0x98, 0x34, 0x4c, 0xbe, 0xc3, + 0xc7, 0xba, 0xb5, 0xc3, 0xd4, 0xcb, 0xa6, 0x82, 0x4a, 0x95, 0xdc, 0xe9, + 0xd7, 0xcd, 0xce, 0xcf, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, + 0xd5, 0xd6, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd6, 0xd7, 0xd3, 0xe5, 0xcd, 0xd8, 0xd0, 0xcc, 0x89, 0xa5, 0xa2, 0x80, + 0x48, 0x6a, 0xd8, 0xf3, 0xd0, 0xb8, 0xc1, 0xa5, 0xc3, 0xd1, 0x9f, 0xd7, + 0xaa, 0x82, 0xbb, 0xc3, 0x9b, 0xe7, 0xd9, 0xc8, 0xcc, 0xd9, 0xdc, 0xd3, + 0xd3, 0xdc, 0xd8, 0xc9, 0xd6, 0xc9, 0xc4, 0xd1, 0xca, 0xe0, 0xb1, 0xb2, + 0x96, 0x5d, 0x55, 0x4d, 0x5e, 0x57, 0x7b, 0x81, 0x50, 0x51, 0x85, 0xac, + 0x73, 0x27, 0x33, 0x70, 0x5e, 0x55, 0x42, 0x52, 0x59, 0x3f, 0x40, 0x54, + 0x41, 0x40, 0x46, 0x51, 0x57, 0x57, 0x5d, 0x67, 0x59, 0x66, 0x72, 0x5c, + 0x36, 0x37, 0x5f, 0x7d, 0x63, 0x67, 0x6a, 0x5c, 0x39, 0x25, 0x3f, 0x69, + 0xa3, 0xad, 0x8d, 0x75, 0x84, 0x96, 0x76, 0x28, 0x69, 0x7e, 0x71, 0x6a, + 0x82, 0x76, 0x52, 0x4f, 0x71, 0xdd, 0xab, 0x65, 0x79, 0xb7, 0xe5, 0xbe, + 0xab, 0xd1, 0xcd, 0xd1, 0xb5, 0x96, 0xb6, 0xb9, 0xb3, 0xc4, 0xb4, 0xbd, + 0xc6, 0x78, 0x48, 0x81, 0x82, 0xa4, 0xdc, 0xed, 0xd1, 0xaf, 0x74, 0x29, + 0x0b, 0x29, 0x0f, 0x32, 0x9a, 0x8f, 0x52, 0x6c, 0x64, 0x73, 0x7c, 0x72, + 0x60, 0x5d, 0x6e, 0x82, 0x82, 0x7a, 0x71, 0x6c, 0x6b, 0x68, 0x62, 0x5c, + 0x5c, 0x69, 0x78, 0x7e, 0x7a, 0x71, 0x6a, 0x68, 0x7b, 0x7d, 0x77, 0x66, + 0x54, 0x4e, 0x59, 0x66, 0x69, 0x55, 0x44, 0x49, 0x5d, 0x66, 0x5b, 0x4b, + 0x4b, 0x60, 0x2f, 0x70, 0xd8, 0xff, 0xac, 0x51, 0x15, 0x2f, 0x2e, 0x1a, + 0x2a, 0x26, 0x1f, 0x5b, 0x23, 0x31, 0x51, 0x6a, 0x59, 0x2e, 0x19, 0x1f, + 0x2b, 0x38, 0x46, 0x56, 0xa1, 0x5b, 0x28, 0x2a, 0x40, 0x39, 0x23, 0x15, + 0x41, 0x39, 0x63, 0x3e, 0x41, 0x57, 0x4d, 0x69, 0x50, 0x11, 0x25, 0x38, + 0x36, 0x7c, 0x96, 0x40, 0x2c, 0x44, 0x39, 0x71, 0x9a, 0x6e, 0x68, 0x7b, + 0x79, 0x6c, 0x4b, 0x1a, 0x26, 0x1a, 0x16, 0x20, 0x27, 0x25, 0x25, 0x2b, + 0x34, 0x43, 0x6b, 0xa1, 0xc9, 0xcd, 0x9f, 0x64, 0x50, 0x47, 0x68, 0x73, + 0x56, 0x61, 0x71, 0x51, 0x29, 0x53, 0x82, 0x95, 0x76, 0x38, 0x21, 0x3b, + 0x2d, 0x35, 0x3b, 0x37, 0x2a, 0x1a, 0x0f, 0x0a, 0xc0, 0xba, 0xca, 0x8d, + 0x25, 0x6c, 0xbd, 0xc6, 0xc3, 0xbc, 0xcc, 0xd1, 0xc1, 0xab, 0x29, 0x16, + 0x1d, 0x0e, 0x3e, 0xb2, 0xc8, 0xce, 0xd8, 0xd1, 0xcd, 0xce, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd7, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xda, 0xda, 0xda, + 0xda, 0xda, 0xda, 0xda, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0x99, 0x77, 0xb4, 0x5f, 0x34, 0x55, 0x92, 0x6e, 0x82, 0x9e, 0xc2, 0xd7, + 0xd2, 0xc1, 0xb7, 0xb8, 0xae, 0x9c, 0xc8, 0xae, 0xd7, 0xde, 0xd7, 0xcf, + 0xce, 0xd1, 0xd6, 0xda, 0xda, 0xd8, 0xd4, 0xd1, 0xdd, 0xbe, 0xc0, 0xcd, + 0xa4, 0xb1, 0xd9, 0x9e, 0x73, 0x7b, 0x4b, 0x35, 0x43, 0x58, 0x77, 0x76, + 0x43, 0x2e, 0x80, 0x6e, 0x3e, 0x5d, 0x5c, 0x67, 0x5b, 0x68, 0x61, 0x60, + 0x67, 0x50, 0x46, 0x67, 0x51, 0x69, 0x66, 0x55, 0x53, 0x45, 0x30, 0x31, + 0x2c, 0x1a, 0x4e, 0x58, 0x61, 0x7a, 0x50, 0x38, 0x50, 0x6b, 0x5c, 0x35, + 0x42, 0x7d, 0xad, 0xc1, 0x97, 0x9b, 0xa3, 0x6e, 0x71, 0xc1, 0xc2, 0x92, + 0x34, 0x66, 0x62, 0xa4, 0xc8, 0xbf, 0xe0, 0xb6, 0xad, 0xd4, 0x84, 0x73, + 0xd3, 0xd0, 0x8b, 0x7d, 0xc7, 0x66, 0x56, 0xa5, 0xdd, 0xe1, 0xc3, 0x9b, + 0xaf, 0x5c, 0x3d, 0x93, 0xaf, 0xc0, 0xff, 0xde, 0x96, 0x80, 0x37, 0x25, + 0x27, 0x17, 0x29, 0x2e, 0x36, 0x2c, 0x24, 0x34, 0x2b, 0x25, 0x45, 0x50, + 0x70, 0x73, 0x77, 0x78, 0x73, 0x6a, 0x60, 0x5a, 0x6a, 0x6e, 0x6e, 0x67, + 0x5d, 0x59, 0x5c, 0x61, 0x5c, 0x64, 0x74, 0x84, 0x8c, 0x83, 0x6f, 0x5f, + 0x81, 0x8a, 0x88, 0x74, 0x63, 0x5c, 0x56, 0x4d, 0x5d, 0x57, 0x53, 0x55, + 0x5a, 0x58, 0x4d, 0x43, 0x47, 0x40, 0x3e, 0x44, 0x29, 0x2a, 0x65, 0x80, + 0x31, 0x26, 0x1b, 0x1e, 0x29, 0x30, 0x2d, 0x26, 0x42, 0x3a, 0x2e, 0x25, + 0x22, 0x25, 0x2b, 0x2e, 0x22, 0x4f, 0x8b, 0x72, 0x30, 0x43, 0x55, 0x1a, + 0x3b, 0x27, 0x16, 0x23, 0x3a, 0x35, 0x22, 0x20, 0x15, 0x44, 0x4d, 0x3c, + 0x31, 0x17, 0x0f, 0x2e, 0x3a, 0x5a, 0x62, 0x3e, 0x21, 0x26, 0x35, 0x38, + 0x54, 0x42, 0x4f, 0x72, 0x70, 0x50, 0x51, 0x73, 0x77, 0x99, 0x65, 0x39, + 0x5e, 0x58, 0x2e, 0x36, 0x69, 0x5f, 0x4c, 0x36, 0x2a, 0x32, 0x4a, 0x5e, + 0x3d, 0x38, 0x3e, 0x4a, 0x4d, 0x4d, 0x5e, 0x74, 0x54, 0x34, 0x21, 0x25, + 0x21, 0x1a, 0x30, 0x54, 0x5f, 0x56, 0x61, 0x40, 0x3b, 0x49, 0x1e, 0x0c, + 0xbd, 0xbc, 0xcd, 0x92, 0x2e, 0x74, 0xbf, 0xc4, 0xc6, 0xc7, 0xca, 0xc4, + 0xc2, 0xc7, 0x91, 0xcb, 0xda, 0xc1, 0x9b, 0xb8, 0xca, 0xdc, 0xd7, 0xc8, + 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd4, + 0xd4, 0xd5, 0xd6, 0xd6, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xa4, 0x62, 0xc0, 0x7b, 0x51, 0x9a, 0x8a, 0x64, + 0xca, 0xbb, 0xc8, 0xe7, 0xdd, 0xb2, 0xa5, 0xba, 0xb7, 0x76, 0xa7, 0xc1, + 0xe1, 0xd6, 0xd8, 0xda, 0xed, 0xda, 0xc7, 0xc5, 0xd1, 0xdd, 0xdc, 0xd7, + 0xca, 0xbc, 0xc4, 0xb3, 0xaa, 0xd1, 0xbf, 0x67, 0x58, 0x88, 0x93, 0x64, + 0x42, 0x40, 0x4c, 0x61, 0x94, 0x2d, 0x2c, 0x52, 0x4a, 0x4e, 0x5a, 0x5b, + 0x42, 0x70, 0x75, 0x5e, 0x5d, 0x52, 0x35, 0x28, 0x64, 0x5c, 0x5c, 0x50, + 0x4e, 0x4d, 0x64, 0xb2, 0x9f, 0x57, 0x4e, 0x42, 0x44, 0x61, 0x5c, 0x67, + 0x64, 0x60, 0x75, 0x9d, 0xa9, 0x96, 0x9e, 0xc2, 0x70, 0x39, 0x63, 0x9e, + 0xb1, 0xb8, 0xc2, 0xec, 0xfd, 0xbb, 0xdf, 0xf1, 0xc4, 0xdb, 0xd9, 0x83, + 0x94, 0xad, 0xd5, 0xd6, 0xb3, 0x91, 0x7e, 0x85, 0xb1, 0xaf, 0xd7, 0xe1, + 0x9e, 0x76, 0xad, 0xf3, 0x50, 0x23, 0x34, 0x31, 0x46, 0x77, 0x6e, 0x6e, + 0x38, 0x3d, 0x1d, 0x17, 0x32, 0x3f, 0x39, 0x27, 0x18, 0x2f, 0x51, 0x5e, + 0x64, 0x92, 0xa9, 0x7c, 0x60, 0x76, 0x83, 0x73, 0x54, 0x47, 0x58, 0x70, + 0x88, 0x75, 0x5d, 0x4e, 0x4d, 0x52, 0x56, 0x58, 0x6c, 0x69, 0x66, 0x69, + 0x6e, 0x6e, 0x68, 0x62, 0x7d, 0x84, 0x7e, 0x6a, 0x5e, 0x5f, 0x62, 0x5f, + 0x4e, 0x50, 0x56, 0x60, 0x67, 0x62, 0x53, 0x46, 0x36, 0x3f, 0x2d, 0x2b, + 0x2c, 0x2e, 0x44, 0x47, 0x50, 0x57, 0x54, 0x3d, 0x1e, 0x11, 0x1d, 0x2e, + 0x75, 0x59, 0x37, 0x27, 0x2d, 0x3a, 0x42, 0x43, 0x35, 0x40, 0x49, 0x4b, + 0x51, 0x5b, 0x4a, 0x28, 0x24, 0x3a, 0x21, 0x34, 0x85, 0x91, 0x88, 0xba, + 0x4f, 0x47, 0x8d, 0xc8, 0x8d, 0x38, 0x2e, 0x48, 0x32, 0x31, 0x27, 0x1a, + 0x1d, 0x31, 0x41, 0x45, 0x48, 0x3e, 0x2b, 0x18, 0x19, 0x38, 0x6c, 0x95, + 0x34, 0x3a, 0x27, 0x1e, 0x34, 0x3e, 0x34, 0x34, 0x4a, 0x38, 0x29, 0x2b, + 0x37, 0x36, 0x22, 0x0d, 0x98, 0x66, 0x38, 0x2a, 0x2b, 0x34, 0x52, 0x75, + 0x66, 0x61, 0x57, 0x45, 0x29, 0x1b, 0x2f, 0x4f, 0x2d, 0x2b, 0x41, 0x2b, + 0x2e, 0x40, 0x15, 0x02, 0xbc, 0xbb, 0xc6, 0x87, 0x2b, 0x77, 0xc0, 0xc4, + 0xc5, 0xc5, 0xba, 0xbb, 0xca, 0xbf, 0x87, 0xb3, 0xce, 0xbf, 0xa6, 0xcb, + 0xd3, 0xcb, 0xc3, 0xcd, 0xcb, 0xcc, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd0, + 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd5, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xdc, 0x79, 0xc1, 0x76, + 0x39, 0x9f, 0x63, 0x77, 0xd4, 0xbf, 0xc5, 0xe3, 0xe4, 0xc4, 0xb2, 0xbb, + 0xa2, 0x6e, 0xb1, 0xe0, 0xe2, 0xcb, 0xd3, 0xd1, 0xd7, 0xd4, 0xd2, 0xd4, + 0xd5, 0xd3, 0xcc, 0xc6, 0xc4, 0xab, 0xb7, 0xaf, 0xb5, 0xc3, 0xa0, 0x8e, + 0xa1, 0x6a, 0x51, 0x47, 0x58, 0x52, 0x2b, 0x3b, 0x5b, 0x68, 0x39, 0x43, + 0x6e, 0x50, 0x47, 0x72, 0x6f, 0x72, 0x67, 0x64, 0x69, 0x57, 0x41, 0x42, + 0x48, 0x1a, 0x28, 0x2a, 0x1c, 0x12, 0x50, 0xfa, 0xcd, 0x77, 0x6f, 0x8d, + 0xa0, 0xae, 0xaf, 0xc7, 0xe9, 0xce, 0xc0, 0xc0, 0xb1, 0x97, 0x88, 0x87, + 0xa2, 0xa5, 0xa9, 0x64, 0x46, 0x7e, 0x85, 0x69, 0x41, 0x65, 0xae, 0xc4, + 0xc7, 0xe6, 0xc1, 0x68, 0xbf, 0x9b, 0x6b, 0x15, 0x31, 0x90, 0x94, 0x9b, + 0x87, 0x73, 0x84, 0x95, 0x69, 0x2f, 0x24, 0x32, 0x3b, 0x47, 0x6e, 0x49, + 0x86, 0xcf, 0x5d, 0x12, 0x47, 0x26, 0x1d, 0x30, 0x42, 0x30, 0x20, 0x44, + 0x40, 0x59, 0x44, 0x1e, 0x37, 0x52, 0x4e, 0x63, 0x75, 0x79, 0x77, 0x6a, + 0x5b, 0x5d, 0x6f, 0x82, 0x93, 0x80, 0x68, 0x5a, 0x5c, 0x67, 0x71, 0x76, + 0x81, 0x78, 0x6e, 0x6b, 0x6e, 0x70, 0x6f, 0x6c, 0x61, 0x66, 0x5f, 0x4c, + 0x44, 0x4e, 0x58, 0x5b, 0x63, 0x65, 0x69, 0x6e, 0x6f, 0x68, 0x59, 0x4e, + 0x4c, 0x57, 0x33, 0x28, 0x34, 0x26, 0x22, 0x22, 0x3b, 0x38, 0x35, 0x33, + 0x30, 0x28, 0x1d, 0x14, 0x3e, 0x41, 0x46, 0x49, 0x4a, 0x4b, 0x4e, 0x50, + 0x80, 0x76, 0x40, 0x21, 0x32, 0x31, 0x46, 0x87, 0xed, 0xff, 0xff, 0xe6, + 0x6d, 0x47, 0x94, 0xe0, 0xd2, 0x86, 0x93, 0xd6, 0xbf, 0x73, 0x51, 0x51, + 0x37, 0x29, 0x20, 0x23, 0x24, 0x1f, 0x1f, 0x24, 0x4a, 0x55, 0x51, 0x36, + 0x1b, 0x19, 0x2b, 0x3c, 0x34, 0x1a, 0x1d, 0x2b, 0x28, 0x30, 0x3b, 0x35, + 0x33, 0x30, 0x23, 0x13, 0x13, 0x39, 0x7b, 0xae, 0x98, 0xcd, 0xdb, 0xbc, + 0xbf, 0xd2, 0x9f, 0x45, 0x24, 0x2f, 0x2e, 0x22, 0x20, 0x2d, 0x3a, 0x3e, + 0x30, 0x34, 0x52, 0x44, 0x48, 0x54, 0x22, 0x0a, 0xc7, 0xc6, 0xc5, 0x80, + 0x2f, 0x82, 0xcc, 0xd0, 0xba, 0xc2, 0xc4, 0xc6, 0xcd, 0xc2, 0xa0, 0xa7, + 0xcb, 0xaf, 0xa1, 0xd5, 0xd5, 0xc8, 0xc5, 0xcd, 0xca, 0xca, 0xcb, 0xcb, + 0xcc, 0xcd, 0xce, 0xce, 0xcf, 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd3, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd1, 0x9c, 0xbc, 0x9b, 0x6b, 0xad, 0x69, 0xc7, 0xbc, 0xc4, 0xc8, 0xcb, + 0xd6, 0xdb, 0xc5, 0xa5, 0x57, 0x81, 0xd1, 0xe6, 0xd7, 0xd3, 0xdc, 0xd3, + 0xe7, 0xd8, 0xca, 0xca, 0xd4, 0xd8, 0xcf, 0xc4, 0xbe, 0xb7, 0xb6, 0xb0, + 0xb5, 0xa5, 0x86, 0x93, 0x7f, 0x6c, 0x5d, 0x50, 0x60, 0x5f, 0x38, 0x2e, + 0x65, 0x96, 0x55, 0x25, 0x61, 0x61, 0x46, 0x7d, 0x53, 0x57, 0x5b, 0x56, + 0x3b, 0x1e, 0x2a, 0x51, 0x4e, 0x4f, 0x80, 0x8a, 0xa4, 0xb6, 0xa7, 0xe5, + 0xec, 0x80, 0x56, 0x6f, 0x74, 0x66, 0x6c, 0x87, 0x8a, 0x97, 0xa9, 0x9d, + 0x81, 0x84, 0x93, 0x8e, 0x5e, 0x7c, 0x8d, 0x39, 0x0e, 0x42, 0x3e, 0x0f, + 0xab, 0xaf, 0x5a, 0x72, 0x97, 0x7e, 0x9d, 0x9a, 0x9d, 0x73, 0xa5, 0xb7, + 0xda, 0xdd, 0x84, 0x8c, 0x7b, 0x50, 0x32, 0x29, 0x1f, 0x30, 0x76, 0xbe, + 0x71, 0x6c, 0x6e, 0x5e, 0x7e, 0x97, 0x60, 0x41, 0x27, 0x3f, 0x64, 0x50, + 0x39, 0x32, 0x38, 0x7a, 0x81, 0x76, 0x3e, 0x1b, 0x4e, 0x65, 0x51, 0x77, + 0x76, 0x68, 0x59, 0x57, 0x62, 0x70, 0x77, 0x78, 0x78, 0x79, 0x76, 0x6f, + 0x67, 0x67, 0x70, 0x79, 0x7b, 0x7a, 0x7a, 0x7f, 0x83, 0x7f, 0x75, 0x6c, + 0x76, 0x7e, 0x7a, 0x6a, 0x62, 0x6b, 0x74, 0x75, 0x5e, 0x5b, 0x58, 0x56, + 0x55, 0x53, 0x50, 0x4e, 0x3b, 0x3f, 0x26, 0x2a, 0x35, 0x2f, 0x3f, 0x4d, + 0x4d, 0x38, 0x22, 0x1d, 0x27, 0x2d, 0x25, 0x1a, 0x1d, 0x21, 0x31, 0x51, + 0x71, 0x7d, 0x71, 0x61, 0x6f, 0x60, 0x2c, 0x1f, 0x3e, 0x3c, 0x4a, 0x8d, + 0xff, 0x87, 0x87, 0xbc, 0xae, 0xb3, 0x86, 0x00, 0x2e, 0x35, 0x22, 0x18, + 0x1f, 0x0f, 0x11, 0x3d, 0x2b, 0x25, 0x2d, 0x3a, 0x2e, 0x1a, 0x26, 0x44, + 0x26, 0x32, 0x4e, 0x5c, 0x40, 0x15, 0x0f, 0x26, 0x3a, 0x1c, 0x1d, 0x2f, + 0x28, 0x20, 0x2b, 0x33, 0x5b, 0x42, 0x24, 0x13, 0x18, 0x29, 0x39, 0x41, + 0x31, 0x9c, 0xbd, 0x6f, 0x45, 0x6e, 0x79, 0x4f, 0x39, 0x39, 0x30, 0x33, + 0x5d, 0x8a, 0x82, 0x5c, 0x4c, 0x52, 0x72, 0x61, 0x5e, 0x61, 0x24, 0x06, + 0xbc, 0xc1, 0xbc, 0x76, 0x2f, 0x87, 0xc8, 0xc7, 0xc4, 0xb9, 0xb8, 0xc3, + 0xd2, 0xd1, 0xaa, 0x55, 0x36, 0x85, 0xb4, 0xd2, 0xbf, 0xc0, 0xc5, 0xc9, + 0xc8, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, + 0xd0, 0xd0, 0xd1, 0xd1, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd8, 0xc9, 0x79, 0x6e, 0x66, 0x64, 0x41, 0xba, + 0xd8, 0xdc, 0xd0, 0xbe, 0xc3, 0xd2, 0xc4, 0xa4, 0x50, 0xb6, 0xdf, 0xd3, + 0xc8, 0xd2, 0xcf, 0xcb, 0xcc, 0xd4, 0xda, 0xd7, 0xcd, 0xc7, 0xc8, 0xcc, + 0xd6, 0xbf, 0x93, 0x8f, 0x82, 0x59, 0x64, 0x89, 0x6b, 0x6f, 0x4b, 0x3f, + 0x49, 0x46, 0x3d, 0x26, 0x47, 0x46, 0x67, 0x45, 0x3e, 0x56, 0x3d, 0x53, + 0x5f, 0x65, 0x62, 0x56, 0x61, 0x8c, 0xac, 0xae, 0x9d, 0x95, 0xad, 0xaf, + 0xb0, 0x9d, 0x89, 0xc1, 0xff, 0xbc, 0xa4, 0xcc, 0xc6, 0x9c, 0x8f, 0x8a, + 0xaa, 0xa8, 0xd2, 0xf2, 0xdd, 0xca, 0xc4, 0xb1, 0xb9, 0xb1, 0xcb, 0xac, + 0x8d, 0xa2, 0xa6, 0xa6, 0xa7, 0xff, 0xe4, 0x7f, 0x2e, 0x45, 0xb5, 0xaa, + 0x90, 0x66, 0xa9, 0x6b, 0x30, 0x89, 0x8e, 0x5f, 0x29, 0x18, 0x20, 0x4e, + 0x74, 0x70, 0x60, 0x60, 0x2a, 0x13, 0x1e, 0x1f, 0x50, 0x91, 0x6d, 0x33, + 0x3d, 0x27, 0x25, 0x1e, 0x39, 0x47, 0x24, 0x2e, 0x36, 0x50, 0x77, 0x72, + 0x58, 0x6b, 0x85, 0x81, 0x6f, 0x70, 0x6f, 0x6a, 0x65, 0x67, 0x70, 0x78, + 0x76, 0x7b, 0x7e, 0x78, 0x6c, 0x63, 0x61, 0x63, 0x69, 0x6c, 0x73, 0x7e, + 0x84, 0x81, 0x74, 0x69, 0x6e, 0x79, 0x7a, 0x6c, 0x63, 0x65, 0x65, 0x61, + 0x47, 0x49, 0x4b, 0x4d, 0x50, 0x55, 0x5b, 0x60, 0x4a, 0x48, 0x3b, 0x3b, + 0x39, 0x48, 0x63, 0x53, 0x24, 0x26, 0x23, 0x1d, 0x24, 0x48, 0x80, 0xac, + 0x68, 0x3e, 0x19, 0x20, 0x42, 0x4f, 0x35, 0x12, 0x28, 0x26, 0x23, 0x2a, + 0x35, 0x2d, 0x29, 0x38, 0x66, 0x35, 0x17, 0x2b, 0x4d, 0x51, 0x34, 0x16, + 0x0d, 0x3c, 0x36, 0x13, 0x17, 0x24, 0x31, 0x4d, 0x58, 0x49, 0x47, 0x4d, + 0x3d, 0x23, 0x26, 0x3d, 0x37, 0x33, 0x34, 0x30, 0x20, 0x19, 0x32, 0x56, + 0x28, 0x21, 0x1a, 0x25, 0x30, 0x21, 0x22, 0x42, 0x28, 0x29, 0x2d, 0x37, + 0x3d, 0x37, 0x26, 0x16, 0x44, 0x30, 0x28, 0x43, 0x68, 0x69, 0x3c, 0x0c, + 0x3b, 0x36, 0x23, 0x19, 0x35, 0x54, 0x43, 0x17, 0x37, 0x3d, 0x5d, 0x4e, + 0x4d, 0x50, 0x15, 0x00, 0xb4, 0xbe, 0xb8, 0x72, 0x36, 0x8f, 0xc6, 0xc0, + 0xc0, 0xc4, 0xc9, 0xbe, 0xb1, 0xba, 0xd3, 0x80, 0x63, 0xcb, 0xd3, 0xc5, + 0xc5, 0xce, 0xc0, 0xc3, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xca, 0xcb, + 0xcb, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xde, 0xe0, 0x44, 0x3c, + 0x75, 0x6d, 0x8c, 0xdc, 0xf0, 0xdc, 0xc8, 0xc1, 0xc2, 0xc5, 0xcc, 0xd4, + 0x7e, 0xda, 0xd1, 0xca, 0xcf, 0xdc, 0xd2, 0xda, 0xd2, 0xda, 0xe4, 0xea, + 0xea, 0xe3, 0xda, 0xd3, 0xd0, 0x95, 0x49, 0x4c, 0x5d, 0x67, 0x86, 0x7d, + 0x5d, 0x7e, 0x83, 0xa5, 0xb7, 0xae, 0xce, 0xe1, 0x6a, 0x7b, 0x9d, 0x53, + 0x58, 0xb1, 0xb6, 0xd5, 0xc8, 0xbd, 0xc2, 0xcb, 0xcd, 0xd9, 0xd9, 0xc3, + 0xc8, 0xcd, 0xc2, 0xc9, 0xc5, 0x9b, 0x8a, 0x9c, 0x86, 0x6d, 0x62, 0x85, + 0x80, 0x69, 0x6d, 0x54, 0xa6, 0xab, 0xc0, 0xa5, 0x6e, 0x86, 0xc2, 0xc8, + 0x77, 0x67, 0x79, 0x61, 0x58, 0x87, 0x9d, 0xa4, 0x75, 0x6b, 0x82, 0xac, + 0xb3, 0x72, 0x43, 0x68, 0x58, 0x19, 0x3d, 0x3b, 0x21, 0x33, 0x2b, 0x31, + 0x47, 0x42, 0x36, 0x35, 0x36, 0x20, 0x16, 0x2a, 0x33, 0x5d, 0xec, 0xff, + 0xe9, 0xd7, 0x6a, 0x42, 0x21, 0x26, 0x41, 0x62, 0x79, 0x5f, 0x30, 0x30, + 0x45, 0x3b, 0x2a, 0x4f, 0x74, 0x7e, 0x84, 0x64, 0x81, 0x87, 0x89, 0x81, + 0x73, 0x6a, 0x6c, 0x71, 0x7d, 0x75, 0x6d, 0x6b, 0x6e, 0x6f, 0x6a, 0x64, + 0x70, 0x6e, 0x6d, 0x73, 0x7b, 0x7e, 0x7b, 0x76, 0x6e, 0x7a, 0x7d, 0x6f, + 0x64, 0x62, 0x5f, 0x58, 0x4d, 0x55, 0x5e, 0x62, 0x60, 0x5e, 0x5e, 0x60, + 0x4c, 0x4d, 0x40, 0x38, 0x38, 0x58, 0x6a, 0x36, 0x32, 0x33, 0x35, 0x39, + 0x43, 0x56, 0x6c, 0x7c, 0x4a, 0x4d, 0x4a, 0x3a, 0x26, 0x1c, 0x1f, 0x28, + 0x27, 0x22, 0x2a, 0x28, 0x13, 0x13, 0x1d, 0x16, 0x3b, 0x3d, 0x1b, 0x1e, + 0x4b, 0x3c, 0x1a, 0x2e, 0x3d, 0x25, 0x26, 0x23, 0x0d, 0x18, 0x28, 0x17, + 0x20, 0x1f, 0x34, 0x5e, 0x78, 0x6d, 0x4c, 0x34, 0x17, 0x33, 0x3a, 0x2b, + 0x39, 0x67, 0x83, 0x80, 0x2a, 0x31, 0x28, 0x24, 0x2b, 0x20, 0x20, 0x3b, + 0x61, 0x6c, 0x6f, 0x5d, 0x42, 0x36, 0x40, 0x51, 0x2b, 0x36, 0x43, 0x42, + 0x30, 0x20, 0x23, 0x2f, 0x33, 0x3a, 0x32, 0x1c, 0x0e, 0x12, 0x17, 0x17, + 0x1d, 0x22, 0x43, 0x38, 0x3f, 0x4f, 0x1f, 0x08, 0xc1, 0xc8, 0xb3, 0x65, + 0x30, 0x94, 0xd1, 0xce, 0xb5, 0xbd, 0xbe, 0xc3, 0xcb, 0xc1, 0xd3, 0x6e, + 0x74, 0xd1, 0xcc, 0xbe, 0xbf, 0xbe, 0xb8, 0xd7, 0xc5, 0xc5, 0xc6, 0xc7, + 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcc, 0xcc, 0xcd, 0xce, 0xce, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xcb, 0xe6, 0x6e, 0x45, 0x7c, 0x7a, 0xb3, 0x9e, 0xd2, 0xd5, 0xd4, 0xce, + 0xc6, 0xc3, 0xc6, 0xcb, 0x9a, 0xef, 0xe1, 0xee, 0xe5, 0xf4, 0xee, 0xeb, + 0xee, 0xc2, 0x9a, 0x9f, 0xc6, 0xe2, 0xdb, 0xc5, 0x69, 0x2d, 0x53, 0xa7, + 0x98, 0x7c, 0xb2, 0xea, 0xdc, 0xd7, 0xb6, 0xa4, 0xad, 0xb1, 0xab, 0xa3, + 0x8b, 0xbd, 0x9b, 0x43, 0x71, 0xa7, 0x68, 0x4f, 0x7d, 0x92, 0xd4, 0xf4, + 0xc3, 0x92, 0x91, 0x9a, 0x94, 0xb5, 0x5f, 0x48, 0x89, 0xc4, 0xcf, 0x76, + 0xa6, 0xcb, 0xd8, 0xea, 0xd0, 0xb0, 0xa1, 0x59, 0xa5, 0x86, 0x8e, 0x9b, + 0xa3, 0xc6, 0xa7, 0x3b, 0x4f, 0x1b, 0x30, 0x42, 0x38, 0x32, 0x28, 0x38, + 0x46, 0x39, 0x33, 0x35, 0x3e, 0x2a, 0x0b, 0x16, 0x22, 0x4f, 0x44, 0x11, + 0x19, 0x32, 0x30, 0x3e, 0x21, 0x29, 0x21, 0x26, 0x37, 0x2a, 0x20, 0x35, + 0x3c, 0x24, 0x7f, 0xe9, 0xff, 0x95, 0x11, 0x1d, 0x53, 0x6e, 0x4e, 0x2f, + 0x3f, 0x54, 0x47, 0x1f, 0xb2, 0xb8, 0x49, 0x4a, 0x81, 0x6a, 0x7c, 0x90, + 0x87, 0x81, 0x79, 0x76, 0x76, 0x72, 0x6a, 0x63, 0x70, 0x68, 0x5f, 0x5e, + 0x65, 0x6b, 0x6c, 0x6a, 0x78, 0x71, 0x69, 0x68, 0x6e, 0x74, 0x75, 0x73, + 0x71, 0x7a, 0x78, 0x68, 0x5d, 0x5f, 0x61, 0x5d, 0x58, 0x5e, 0x63, 0x5e, + 0x54, 0x4b, 0x49, 0x4b, 0x5b, 0x54, 0x38, 0x30, 0x31, 0x36, 0x42, 0x2d, + 0x4a, 0x3c, 0x34, 0x41, 0x58, 0x63, 0x58, 0x49, 0x0b, 0x3e, 0x6b, 0x67, + 0x44, 0x3d, 0x66, 0x96, 0x3f, 0x27, 0x26, 0x30, 0x2f, 0x37, 0x3b, 0x2d, + 0x34, 0x2a, 0x24, 0x2d, 0x32, 0x29, 0x25, 0x2c, 0x34, 0x24, 0x35, 0x3a, + 0x19, 0x1b, 0x40, 0x4e, 0x17, 0x25, 0x3c, 0x59, 0x71, 0x69, 0x38, 0x05, + 0x2b, 0x4c, 0x58, 0x4e, 0x5a, 0x72, 0x63, 0x38, 0x5d, 0x5f, 0x6c, 0x66, + 0x53, 0x60, 0x76, 0x71, 0x67, 0x54, 0x42, 0x44, 0x53, 0x58, 0x4b, 0x3a, + 0x1d, 0x3c, 0x3e, 0x1f, 0x15, 0x2a, 0x2b, 0x14, 0x2d, 0x2b, 0x28, 0x1f, + 0x0c, 0x06, 0x21, 0x44, 0x29, 0x29, 0x42, 0x32, 0x3a, 0x51, 0x2a, 0x19, + 0xba, 0xb6, 0x8f, 0x35, 0x04, 0x75, 0xc0, 0xc7, 0xb8, 0xc2, 0xb5, 0xb9, + 0xcb, 0xb5, 0xd0, 0x80, 0x8a, 0xc6, 0xbe, 0xc1, 0xc7, 0xce, 0xc0, 0xc1, + 0xc4, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xf7, 0xb4, 0x57, 0x73, 0x9b, 0xff, 0xc5, + 0xb1, 0xe5, 0xfb, 0xdb, 0xc0, 0xbc, 0xa3, 0x7a, 0x4c, 0xac, 0xaa, 0xa7, + 0x65, 0x62, 0x52, 0x2c, 0x5d, 0x5f, 0x5a, 0x4d, 0x44, 0x50, 0x6e, 0x89, + 0x9d, 0xaa, 0xe1, 0xba, 0x92, 0xd2, 0xc3, 0x59, 0x73, 0x41, 0x45, 0x7a, + 0xc3, 0xd5, 0xae, 0xb4, 0x91, 0xba, 0xb3, 0xa8, 0xb5, 0xbb, 0xbd, 0xba, + 0x9a, 0x88, 0x87, 0x7f, 0x72, 0x8a, 0x99, 0x7f, 0x7d, 0x9e, 0x65, 0x93, + 0xa6, 0x77, 0xa1, 0x99, 0x79, 0xb0, 0xb0, 0xaa, 0x9a, 0xab, 0xce, 0x91, + 0x8c, 0x59, 0x67, 0x69, 0x26, 0x27, 0x7e, 0xb4, 0x72, 0x39, 0x39, 0x33, + 0x2b, 0x38, 0x31, 0x35, 0x16, 0x1d, 0x2e, 0x45, 0x17, 0x6e, 0xf3, 0x82, + 0x62, 0x50, 0x38, 0x2b, 0x18, 0x1f, 0x38, 0x23, 0x2d, 0x32, 0x20, 0x1e, + 0x35, 0x2e, 0x24, 0x3b, 0x3d, 0x59, 0x26, 0x52, 0x93, 0x61, 0x36, 0x23, + 0x26, 0x51, 0x40, 0x3d, 0x44, 0x37, 0x2e, 0x0c, 0x73, 0xae, 0x49, 0x32, + 0x55, 0x62, 0xa4, 0x9a, 0x87, 0x81, 0x7c, 0x7b, 0x7e, 0x81, 0x80, 0x7e, + 0x7e, 0x81, 0x80, 0x79, 0x70, 0x6b, 0x6f, 0x75, 0x6a, 0x63, 0x5b, 0x5a, + 0x5d, 0x5e, 0x5b, 0x57, 0x73, 0x79, 0x71, 0x5e, 0x55, 0x5d, 0x66, 0x68, + 0x64, 0x66, 0x63, 0x59, 0x4f, 0x4c, 0x54, 0x5e, 0x62, 0x53, 0x35, 0x4a, + 0x58, 0x43, 0x62, 0x9a, 0xae, 0x99, 0x73, 0x47, 0x2b, 0x2e, 0x4a, 0x65, + 0x5c, 0x4f, 0x38, 0x1e, 0x0f, 0x14, 0x28, 0x39, 0x51, 0x51, 0x52, 0x44, + 0x21, 0x11, 0x32, 0x5e, 0x6a, 0x46, 0x26, 0x20, 0x23, 0x21, 0x1f, 0x24, + 0x30, 0x34, 0x1b, 0x1b, 0x44, 0x46, 0x24, 0x1a, 0x26, 0x36, 0x35, 0x26, + 0x28, 0x3a, 0x39, 0x26, 0x36, 0x2a, 0x1f, 0x25, 0x39, 0x46, 0x40, 0x31, + 0x16, 0x0f, 0x3c, 0x45, 0x24, 0x54, 0x8a, 0x69, 0x2d, 0x31, 0x33, 0x32, + 0x33, 0x3e, 0x52, 0x63, 0x4d, 0x34, 0x1a, 0x0f, 0x17, 0x2a, 0x3f, 0x4d, + 0x4b, 0x2c, 0x19, 0x1e, 0x1c, 0x15, 0x2c, 0x51, 0x39, 0x32, 0x41, 0x27, + 0x28, 0x3b, 0x15, 0x06, 0xe4, 0xc7, 0x76, 0x25, 0x2f, 0x85, 0xc4, 0xcb, + 0xc7, 0xbe, 0xc9, 0xc2, 0xad, 0xb6, 0xa8, 0x6d, 0x8d, 0xcb, 0xce, 0xc8, + 0xd0, 0xc2, 0xbd, 0xc1, 0xbd, 0xc8, 0xc8, 0xc8, 0xcd, 0xc4, 0xc0, 0xd0, + 0xbf, 0xc9, 0xbf, 0xc2, 0xd6, 0xcb, 0xba, 0xc8, 0xce, 0xc8, 0xd1, 0xc3, + 0xc8, 0xd2, 0xc5, 0xd9, 0xd4, 0xd2, 0xd9, 0xd4, 0xc7, 0xd2, 0xda, 0xc9, + 0xc6, 0xd7, 0xd1, 0xdd, 0xd6, 0xce, 0xe6, 0xdf, 0xe9, 0xdd, 0xc0, 0x8b, + 0x58, 0x56, 0x83, 0xa9, 0x1c, 0x0d, 0x17, 0x3a, 0x4c, 0x53, 0x74, 0xa2, + 0x9b, 0x9d, 0x83, 0x9a, 0xd5, 0xc8, 0xb4, 0xe1, 0xcc, 0xcb, 0xbf, 0xb7, + 0xc4, 0xc3, 0x8c, 0x47, 0x92, 0xaa, 0xb2, 0x98, 0x6e, 0x4d, 0x36, 0x27, + 0xa8, 0x9a, 0xbb, 0xb0, 0x58, 0x4a, 0xa1, 0xe2, 0xe9, 0xb4, 0x7b, 0x7d, + 0x78, 0x9a, 0xbc, 0x65, 0x90, 0xb3, 0xaf, 0x9c, 0x9a, 0x8e, 0x95, 0xbf, + 0xa4, 0xa9, 0x8a, 0x71, 0x81, 0x79, 0x40, 0x0e, 0x28, 0x13, 0x36, 0x76, + 0x67, 0x19, 0x06, 0x32, 0x18, 0x8a, 0xa2, 0x3c, 0x08, 0x3a, 0x4c, 0x1c, + 0x40, 0x18, 0x4e, 0xbd, 0xaf, 0x30, 0x00, 0x35, 0x2f, 0x4c, 0x2a, 0x31, + 0x32, 0x4e, 0xcd, 0xff, 0xb0, 0x2d, 0x36, 0x42, 0x2f, 0x36, 0x34, 0x66, + 0x79, 0x26, 0x1a, 0x37, 0x2a, 0x27, 0x2c, 0x10, 0x39, 0x37, 0x2a, 0x26, + 0x45, 0x67, 0x5b, 0x34, 0x36, 0x29, 0x3c, 0x46, 0x32, 0x38, 0x41, 0x28, + 0x2a, 0x37, 0x42, 0x39, 0x65, 0xa0, 0x91, 0x77, 0x78, 0x7a, 0x7a, 0x75, + 0x71, 0x73, 0x7c, 0x84, 0x87, 0x80, 0x77, 0x75, 0x78, 0x7b, 0x7a, 0x78, + 0x8b, 0x8b, 0x89, 0x86, 0x80, 0x78, 0x71, 0x6c, 0x77, 0x75, 0x71, 0x69, + 0x61, 0x5c, 0x5b, 0x5d, 0x70, 0x68, 0x5f, 0x5c, 0x5e, 0x61, 0x60, 0x5e, + 0x42, 0x46, 0x44, 0x37, 0x4f, 0x96, 0xa2, 0x65, 0x18, 0x43, 0x60, 0x47, + 0x14, 0x06, 0x34, 0x6a, 0x59, 0x52, 0x35, 0x17, 0x1f, 0x3f, 0x42, 0x2b, + 0x55, 0x3d, 0x2c, 0x2b, 0x28, 0x21, 0x24, 0x31, 0x31, 0x2e, 0x32, 0x3e, + 0x47, 0x3f, 0x24, 0x0d, 0x16, 0x29, 0x2c, 0x32, 0x3a, 0x24, 0x11, 0x21, + 0x5a, 0x38, 0x37, 0x37, 0x14, 0x0d, 0x2b, 0x3b, 0x20, 0x22, 0x15, 0x1e, + 0x3b, 0x30, 0x17, 0x1c, 0x1c, 0x27, 0x24, 0x32, 0x4d, 0x4a, 0x4a, 0x69, + 0x83, 0x7d, 0x4e, 0x3f, 0x54, 0x34, 0x1c, 0x46, 0x47, 0x3e, 0x37, 0x34, + 0x2c, 0x25, 0x2c, 0x3a, 0x2b, 0x1d, 0x16, 0x19, 0x1b, 0x29, 0x57, 0x88, + 0x5d, 0x4a, 0x61, 0x64, 0x6d, 0x64, 0x1f, 0x00, 0xc9, 0xbf, 0x7a, 0x26, + 0x30, 0x8a, 0xbe, 0xb2, 0x9f, 0xa0, 0xb8, 0xc0, 0xb7, 0xc8, 0xbd, 0x83, + 0x90, 0xc8, 0xc4, 0xb7, 0xbc, 0xb6, 0xbe, 0xca, 0xc4, 0xb6, 0xc5, 0xcc, + 0xb8, 0xbb, 0xcd, 0xc9, 0xc6, 0xc3, 0xd6, 0xd7, 0xb6, 0xb3, 0xc9, 0xcd, + 0xde, 0xe8, 0xd5, 0xcd, 0xde, 0xdb, 0xce, 0xca, 0xde, 0xd9, 0xe2, 0xe5, + 0xda, 0xe1, 0xec, 0xe6, 0xcd, 0xf4, 0xde, 0xa4, 0xa4, 0xaf, 0x9b, 0x96, + 0x90, 0x43, 0x56, 0x68, 0x3c, 0x6d, 0xaf, 0x81, 0xbb, 0xc2, 0xe1, 0xf2, + 0xbf, 0x77, 0x72, 0x9f, 0x6c, 0xac, 0x87, 0x5e, 0x79, 0x4e, 0x18, 0x43, + 0x6e, 0x5f, 0x61, 0x71, 0x75, 0x78, 0x9b, 0xc9, 0xff, 0xbc, 0x87, 0xad, + 0xde, 0xc8, 0x7e, 0x46, 0x6a, 0x76, 0x82, 0x9d, 0xc3, 0xc5, 0x9e, 0x7d, + 0x78, 0xbb, 0xd7, 0xd4, 0x92, 0x67, 0x7b, 0x56, 0x27, 0x7b, 0xb5, 0xc0, + 0xb4, 0x89, 0x76, 0x94, 0x95, 0x5b, 0xb2, 0xdd, 0x6b, 0x5b, 0x92, 0x67, + 0x7b, 0x54, 0x35, 0x30, 0x2b, 0x23, 0x31, 0x4d, 0x3a, 0x64, 0x61, 0x2a, + 0x16, 0x38, 0x46, 0x30, 0x8a, 0xd0, 0xd3, 0x6e, 0x15, 0x14, 0x35, 0x41, + 0x4e, 0x39, 0x32, 0x7f, 0xc8, 0xd5, 0xce, 0xae, 0x3d, 0x1e, 0x55, 0x51, + 0x43, 0x60, 0x3e, 0x23, 0x2f, 0x25, 0x3e, 0x51, 0x37, 0x2b, 0x4c, 0x6c, + 0x69, 0x5c, 0x66, 0x81, 0x7f, 0x58, 0x39, 0x34, 0x17, 0x54, 0x6a, 0x57, + 0x6c, 0xb0, 0xe9, 0xff, 0x63, 0x3a, 0x40, 0x31, 0x2f, 0x73, 0x99, 0x8c, + 0x77, 0x6f, 0x69, 0x6e, 0x77, 0x79, 0x71, 0x68, 0x64, 0x65, 0x69, 0x72, + 0x7b, 0x7d, 0x78, 0x72, 0x7c, 0x7d, 0x7d, 0x7c, 0x78, 0x73, 0x6d, 0x69, + 0x80, 0x79, 0x6c, 0x5f, 0x58, 0x58, 0x5f, 0x64, 0x5d, 0x56, 0x4e, 0x4c, + 0x50, 0x53, 0x53, 0x51, 0x56, 0x40, 0x35, 0x3e, 0x55, 0x66, 0x51, 0x27, + 0x16, 0x2a, 0x3d, 0x3d, 0x2e, 0x22, 0x25, 0x2e, 0x2e, 0x31, 0x3a, 0x41, + 0x3e, 0x33, 0x2e, 0x31, 0x1d, 0x56, 0x7a, 0x5d, 0x28, 0x14, 0x24, 0x38, + 0x2a, 0x3e, 0x51, 0x51, 0x40, 0x2d, 0x26, 0x26, 0x2f, 0x43, 0x2b, 0x0c, + 0x1d, 0x3a, 0x48, 0x56, 0x55, 0x66, 0x3b, 0x1d, 0x3b, 0x35, 0x17, 0x22, + 0x20, 0x32, 0x26, 0x1c, 0x33, 0x42, 0x4b, 0x62, 0x33, 0x20, 0x12, 0x34, + 0x5d, 0x43, 0x17, 0x17, 0x18, 0x30, 0x1d, 0x0c, 0x3b, 0x6b, 0x62, 0x47, + 0x4b, 0x41, 0x31, 0x1d, 0x0c, 0x0c, 0x20, 0x37, 0x3a, 0x29, 0x1e, 0x1d, + 0x19, 0x21, 0x46, 0x70, 0x5a, 0x46, 0x59, 0x58, 0x62, 0x5f, 0x23, 0x0c, + 0xb3, 0xbe, 0x83, 0x2b, 0x37, 0x9a, 0xc5, 0xa6, 0xbb, 0xbc, 0xd3, 0xd5, + 0xc1, 0xc3, 0xa9, 0x66, 0xa2, 0xcb, 0xc0, 0xb8, 0xc5, 0xc3, 0xc3, 0xbf, + 0xc8, 0xc0, 0xb7, 0xbf, 0xd3, 0xde, 0xde, 0xdf, 0xe3, 0xe5, 0xd9, 0xcf, + 0xd8, 0xde, 0xda, 0xd8, 0xa7, 0xd2, 0xcc, 0xd3, 0xd6, 0xc8, 0xd4, 0xd0, + 0x94, 0x8d, 0x7e, 0x75, 0x6e, 0x5d, 0x5b, 0x71, 0x73, 0x70, 0x74, 0x6a, + 0x81, 0x7d, 0x56, 0x78, 0x99, 0x7e, 0xb3, 0xc5, 0x83, 0x91, 0xc0, 0xa0, + 0xbc, 0xd2, 0xc1, 0x7b, 0x3f, 0x49, 0x8b, 0xc2, 0xa0, 0xa0, 0xaa, 0x8d, + 0x6d, 0x9f, 0xd7, 0xca, 0xfc, 0x9f, 0x58, 0x67, 0x96, 0x9c, 0x7b, 0x5f, + 0x1e, 0x7d, 0xc0, 0xb1, 0x96, 0x9c, 0x9d, 0x8a, 0x95, 0xc6, 0xaf, 0x9d, + 0xd3, 0xd8, 0x9c, 0x81, 0xa8, 0xbd, 0x86, 0x87, 0xb0, 0xc5, 0xda, 0xc1, + 0x96, 0xb3, 0xb6, 0xba, 0xcc, 0xb5, 0x90, 0x91, 0x5a, 0x3a, 0x1f, 0x29, + 0x4f, 0x65, 0x5b, 0x49, 0x39, 0x43, 0x45, 0x46, 0x59, 0x6b, 0x59, 0x35, + 0x52, 0x46, 0x44, 0x4f, 0x55, 0x44, 0x27, 0x12, 0x0a, 0x36, 0x35, 0x10, + 0x23, 0x66, 0x71, 0x45, 0x5a, 0x53, 0x57, 0x3b, 0x2f, 0x3e, 0x3d, 0x4d, + 0x41, 0x1d, 0x4a, 0x5f, 0x4f, 0x46, 0x32, 0x3e, 0x27, 0x24, 0x22, 0x3b, + 0x57, 0x41, 0x1f, 0x1e, 0x2a, 0x1a, 0x1a, 0x27, 0x20, 0x10, 0x1b, 0x38, + 0x27, 0x31, 0x20, 0x44, 0x93, 0x87, 0x4d, 0x4d, 0x34, 0x2b, 0x22, 0x23, + 0x57, 0x7f, 0x73, 0x7f, 0x78, 0x7d, 0x82, 0x83, 0x7f, 0x79, 0x73, 0x71, + 0x78, 0x70, 0x67, 0x64, 0x68, 0x6c, 0x6d, 0x6c, 0x67, 0x6a, 0x6e, 0x71, + 0x72, 0x71, 0x6e, 0x6c, 0x7e, 0x79, 0x72, 0x6b, 0x65, 0x5f, 0x5b, 0x59, + 0x63, 0x5d, 0x57, 0x56, 0x59, 0x5c, 0x5a, 0x57, 0x52, 0x40, 0x31, 0x3e, + 0x53, 0x4b, 0x3b, 0x3c, 0x53, 0x54, 0x55, 0x54, 0x4d, 0x40, 0x31, 0x27, + 0x4f, 0x4c, 0x5c, 0x6d, 0x56, 0x2d, 0x2b, 0x47, 0x5e, 0x39, 0x1d, 0x26, + 0x3c, 0x3d, 0x25, 0x0e, 0x39, 0x4a, 0x5a, 0x58, 0x45, 0x34, 0x2e, 0x30, + 0x3b, 0x23, 0x10, 0x2b, 0x4e, 0x3f, 0x36, 0x57, 0x5c, 0x42, 0x30, 0x2b, + 0x29, 0x2d, 0x2f, 0x25, 0x0a, 0x3d, 0x41, 0x26, 0x2b, 0x36, 0x36, 0x3d, + 0x36, 0x2b, 0x31, 0x51, 0x4a, 0x18, 0x38, 0xa5, 0xa2, 0xb2, 0xd0, 0xc4, + 0x89, 0x77, 0x9d, 0xbe, 0x21, 0x1e, 0x1c, 0x23, 0x3b, 0x5c, 0x76, 0x82, + 0x58, 0x45, 0x37, 0x33, 0x2c, 0x2b, 0x43, 0x65, 0x85, 0x6a, 0x6f, 0x5f, + 0x5c, 0x56, 0x21, 0x11, 0x9e, 0xb1, 0x7a, 0x21, 0x33, 0xa1, 0xd2, 0xb0, + 0xa8, 0xad, 0xca, 0xd3, 0xc4, 0xc8, 0xaf, 0x6c, 0x95, 0xc4, 0xc4, 0xbd, + 0xbf, 0xbe, 0xc9, 0xcb, 0xd0, 0xd7, 0xc5, 0xb9, 0xbb, 0xa0, 0x79, 0x6e, + 0x5b, 0x31, 0x5a, 0x95, 0x86, 0x6f, 0x64, 0x42, 0x1d, 0x31, 0x2e, 0x23, + 0x19, 0x3b, 0x7a, 0x88, 0x89, 0x79, 0xad, 0xcb, 0x94, 0x85, 0xaf, 0xbc, + 0xc1, 0x98, 0xb6, 0xe2, 0xd1, 0x97, 0x84, 0xb7, 0xcb, 0xa9, 0x6a, 0x71, + 0xc6, 0xe5, 0xc8, 0xbd, 0x82, 0x65, 0x6d, 0xaf, 0xee, 0xec, 0xb5, 0x83, + 0x7b, 0x38, 0x44, 0x6f, 0x86, 0xc4, 0xc7, 0x63, 0x73, 0xa2, 0xb5, 0x94, + 0x79, 0x8f, 0xbb, 0xd6, 0xff, 0xac, 0x6f, 0x84, 0x9e, 0x9c, 0xb0, 0xdb, + 0xd5, 0xbc, 0x77, 0x60, 0x97, 0xae, 0x84, 0x62, 0x73, 0xae, 0x74, 0x58, + 0x6e, 0x66, 0x79, 0x87, 0x61, 0x89, 0x82, 0x5e, 0x4d, 0x49, 0x70, 0xb8, + 0xc0, 0x5e, 0x41, 0x81, 0x89, 0x43, 0x39, 0x76, 0x3a, 0x4e, 0x56, 0x51, + 0x58, 0x62, 0x4d, 0x28, 0x6c, 0x41, 0x23, 0x29, 0x34, 0x31, 0x32, 0x3c, + 0x2c, 0x46, 0x5a, 0x52, 0x38, 0x27, 0x28, 0x2f, 0x34, 0x47, 0x78, 0x52, + 0x59, 0x8b, 0x62, 0x52, 0x4a, 0x41, 0x30, 0x25, 0x69, 0xc8, 0xb5, 0x64, + 0xb0, 0xa3, 0x5a, 0x28, 0x33, 0x23, 0x16, 0x3d, 0x4e, 0x5b, 0x53, 0x38, + 0x32, 0x41, 0x40, 0x2d, 0x4a, 0x5f, 0x32, 0x0f, 0x26, 0x22, 0x28, 0x66, + 0x8a, 0x79, 0x8d, 0x6e, 0x40, 0x4f, 0x5b, 0x52, 0x78, 0x80, 0x87, 0x83, + 0x77, 0x6f, 0x6f, 0x73, 0x6f, 0x6e, 0x6e, 0x72, 0x76, 0x74, 0x6c, 0x64, + 0x88, 0x89, 0x8a, 0x8a, 0x87, 0x81, 0x7c, 0x79, 0x75, 0x70, 0x6b, 0x6a, + 0x6f, 0x73, 0x73, 0x72, 0x6b, 0x65, 0x5f, 0x5d, 0x5e, 0x5d, 0x59, 0x54, + 0x43, 0x40, 0x2b, 0x2d, 0x45, 0x3f, 0x2e, 0x38, 0x47, 0x49, 0x45, 0x38, + 0x29, 0x27, 0x34, 0x41, 0x4d, 0x3f, 0x38, 0x38, 0x30, 0x2a, 0x3e, 0x5d, + 0x6c, 0x1c, 0x03, 0x3c, 0x52, 0x29, 0x1e, 0x42, 0x27, 0x23, 0x26, 0x36, + 0x49, 0x4e, 0x42, 0x33, 0x0b, 0x28, 0x18, 0x0c, 0x43, 0x7c, 0x7b, 0x67, + 0x5d, 0x2d, 0x47, 0x6d, 0x42, 0x1b, 0x2b, 0x3a, 0x59, 0x8f, 0x89, 0x59, + 0x51, 0x53, 0x3a, 0x25, 0x6d, 0x63, 0x3c, 0x29, 0x40, 0x57, 0x77, 0xa9, + 0xc5, 0xc2, 0xf2, 0xe6, 0x74, 0x49, 0x92, 0xd2, 0xb1, 0x71, 0x2e, 0x2d, + 0x6c, 0x97, 0x73, 0x33, 0x40, 0x2c, 0x1f, 0x20, 0x1d, 0x17, 0x25, 0x3e, + 0x53, 0x3b, 0x43, 0x35, 0x39, 0x41, 0x1e, 0x1d, 0xb7, 0xbf, 0x85, 0x33, + 0x44, 0xa8, 0xd8, 0xc0, 0xb5, 0xb5, 0xcb, 0xcd, 0xb9, 0xbc, 0xa3, 0x61, + 0xbb, 0xdb, 0xd3, 0xc7, 0xc1, 0xbe, 0xc4, 0xba, 0x9e, 0x54, 0x43, 0x61, + 0x4e, 0x27, 0x2d, 0x47, 0x42, 0x9a, 0x9c, 0x73, 0x8f, 0xa8, 0x93, 0x88, + 0xa8, 0xbd, 0xa4, 0x84, 0x9a, 0x91, 0x86, 0xce, 0xb3, 0xb9, 0xa4, 0x87, + 0x94, 0xb6, 0xa9, 0x7a, 0x9c, 0xc7, 0xd1, 0xca, 0xbb, 0xb2, 0xa4, 0x74, + 0x5d, 0x98, 0x9b, 0x9d, 0xc2, 0xae, 0x91, 0xb6, 0x95, 0x71, 0x95, 0xdf, + 0xc5, 0x6f, 0x82, 0xe7, 0x98, 0x95, 0x5f, 0x70, 0xca, 0xc1, 0x8c, 0xa3, + 0x67, 0x75, 0x67, 0x3d, 0x2c, 0x45, 0x60, 0x67, 0x18, 0x33, 0x2c, 0x1a, + 0x48, 0xa4, 0xca, 0xb3, 0xc6, 0x95, 0x8c, 0x8d, 0x6a, 0x55, 0x55, 0x47, + 0x53, 0xa3, 0x72, 0x3a, 0x27, 0x17, 0x4e, 0x87, 0xb5, 0xa2, 0x69, 0x4a, + 0x5e, 0x5a, 0x44, 0x4b, 0x3d, 0x2c, 0x3a, 0x68, 0x62, 0x1b, 0x0d, 0x4a, + 0x46, 0x43, 0x42, 0x40, 0x38, 0x36, 0x46, 0x5a, 0x1c, 0x2f, 0x45, 0x52, + 0x54, 0x4f, 0x46, 0x3e, 0x3e, 0x6a, 0x79, 0x62, 0x62, 0x79, 0x6a, 0x3e, + 0x5b, 0x3a, 0x4c, 0x34, 0x3f, 0x5d, 0x30, 0x32, 0x93, 0x5c, 0x45, 0x81, + 0x9d, 0x6b, 0x52, 0x5f, 0x9a, 0xff, 0xff, 0xee, 0x9c, 0x2f, 0x00, 0x19, + 0xac, 0x98, 0x6b, 0x44, 0x49, 0x64, 0x60, 0x44, 0x63, 0x73, 0x53, 0x29, + 0x27, 0x2a, 0x2a, 0x3a, 0x44, 0x5b, 0x2a, 0x23, 0xa7, 0xdb, 0x90, 0x86, + 0x95, 0x8a, 0x7f, 0x7d, 0x82, 0x84, 0x7f, 0x79, 0x7c, 0x79, 0x76, 0x75, + 0x71, 0x67, 0x58, 0x4d, 0x65, 0x68, 0x6d, 0x72, 0x75, 0x75, 0x74, 0x73, + 0x9c, 0x86, 0x6a, 0x5b, 0x5e, 0x6c, 0x7a, 0x81, 0x7a, 0x75, 0x6e, 0x6b, + 0x6a, 0x66, 0x5e, 0x57, 0x43, 0x41, 0x31, 0x3a, 0x55, 0x4a, 0x2e, 0x2d, + 0x19, 0x1a, 0x1b, 0x1b, 0x1f, 0x2a, 0x3b, 0x48, 0x39, 0x36, 0x29, 0x24, + 0x43, 0x78, 0x97, 0x9b, 0x42, 0x24, 0x40, 0x83, 0x7f, 0x3f, 0x37, 0x6b, + 0x9e, 0x8e, 0x7a, 0x70, 0x68, 0x58, 0x3e, 0x28, 0x3b, 0x31, 0x2d, 0x45, + 0x53, 0x36, 0x39, 0x70, 0x3f, 0x52, 0x5b, 0x74, 0x7b, 0x38, 0x0e, 0x38, + 0x67, 0x81, 0x5d, 0x26, 0x2f, 0x44, 0x32, 0x1a, 0x5c, 0x2e, 0x11, 0x3a, + 0x65, 0x4c, 0x3c, 0x63, 0x88, 0x87, 0xa4, 0xa3, 0x86, 0x96, 0x87, 0x35, + 0x4d, 0xb3, 0xff, 0xef, 0xae, 0x89, 0x8a, 0x91, 0x31, 0x1e, 0x17, 0x22, + 0x27, 0x22, 0x28, 0x38, 0x56, 0x3e, 0x45, 0x2f, 0x2a, 0x2f, 0x11, 0x15, + 0x36, 0x3b, 0x24, 0x0f, 0x3d, 0x9c, 0xd4, 0xd5, 0xcb, 0xc1, 0xc7, 0xbb, + 0xa1, 0xa5, 0x93, 0x56, 0x43, 0x6b, 0x73, 0x68, 0x52, 0x42, 0x44, 0x35, + 0x70, 0x8b, 0xa7, 0xaa, 0xa0, 0xa7, 0xba, 0xc4, 0x9d, 0x94, 0x96, 0xa2, + 0xb0, 0xbe, 0xbc, 0xa9, 0x81, 0x8e, 0xc2, 0xb2, 0xb4, 0xed, 0xb0, 0x31, + 0x66, 0x80, 0x9e, 0xc0, 0xc5, 0x89, 0x55, 0x58, 0x9f, 0xb4, 0x86, 0x77, + 0x6e, 0x4d, 0x6d, 0x99, 0x9e, 0x86, 0x8e, 0xb3, 0xce, 0xd2, 0xab, 0x72, + 0x8f, 0x74, 0x68, 0x81, 0x9f, 0x94, 0x5e, 0x2a, 0x07, 0x12, 0x29, 0x7b, + 0xcc, 0xab, 0x5f, 0x53, 0xa7, 0xb0, 0xc4, 0xc7, 0xa4, 0x83, 0x9a, 0xcc, + 0xe5, 0xc3, 0xcb, 0xfa, 0xfc, 0xc2, 0x94, 0x90, 0x67, 0x5d, 0x99, 0xab, + 0x54, 0x35, 0x72, 0x9b, 0x52, 0x76, 0x4b, 0x43, 0x4e, 0x3b, 0x32, 0x0a, + 0x53, 0x71, 0x64, 0x46, 0x3b, 0x2d, 0x36, 0x63, 0x3c, 0x6a, 0x43, 0x18, + 0x54, 0x85, 0x6a, 0x4d, 0x27, 0x1c, 0x2a, 0x47, 0x42, 0x2f, 0x45, 0x75, + 0xcc, 0xd7, 0xbc, 0x74, 0x37, 0x24, 0x23, 0x1f, 0x2b, 0x69, 0x7c, 0x50, + 0x3f, 0x66, 0x83, 0x7b, 0x4e, 0x2f, 0x43, 0x4f, 0x37, 0x21, 0x44, 0xa4, + 0x2c, 0x6b, 0x61, 0x64, 0x7e, 0x90, 0xb3, 0xb4, 0xdf, 0xea, 0xcd, 0xa6, + 0xa5, 0xaa, 0xa8, 0xae, 0xc1, 0x73, 0x2c, 0x1e, 0x28, 0x2b, 0x33, 0x42, + 0x35, 0x49, 0x51, 0x43, 0x3b, 0x3c, 0x2f, 0x19, 0x25, 0x26, 0x25, 0x11, + 0x3b, 0x8d, 0x9e, 0x93, 0x7f, 0x79, 0x71, 0x6c, 0x6c, 0x6e, 0x71, 0x72, + 0x87, 0x83, 0x7f, 0x81, 0x86, 0x88, 0x85, 0x81, 0x74, 0x78, 0x7e, 0x85, + 0x89, 0x8b, 0x8b, 0x8a, 0x98, 0x82, 0x68, 0x5d, 0x63, 0x6e, 0x74, 0x74, + 0x63, 0x5f, 0x5a, 0x59, 0x58, 0x53, 0x49, 0x41, 0x37, 0x34, 0x30, 0x32, + 0x31, 0x21, 0x21, 0x36, 0x24, 0x1a, 0x16, 0x24, 0x37, 0x3a, 0x27, 0x12, + 0x15, 0x22, 0x22, 0x22, 0x45, 0x74, 0x77, 0x5a, 0x41, 0x33, 0x35, 0x51, + 0x6d, 0x6c, 0x54, 0x3e, 0x49, 0x54, 0x5c, 0x54, 0x45, 0x3d, 0x43, 0x4e, + 0x67, 0xa2, 0x9f, 0x64, 0x3f, 0x31, 0x27, 0x2a, 0x52, 0x63, 0x5e, 0x56, + 0x6c, 0x81, 0x76, 0x61, 0x4c, 0x61, 0x4c, 0x3a, 0x5c, 0x75, 0x64, 0x54, + 0x44, 0x57, 0x73, 0x8c, 0x73, 0x2f, 0x36, 0x8a, 0xb4, 0x69, 0x30, 0x2a, + 0x47, 0x69, 0x57, 0x1d, 0x16, 0x84, 0xd9, 0xc7, 0x86, 0x58, 0x37, 0x1a, + 0x3b, 0x28, 0x26, 0x3a, 0x46, 0x42, 0x41, 0x4a, 0x7e, 0x69, 0x6c, 0x4b, + 0x35, 0x2b, 0x06, 0x08, 0x67, 0x57, 0x41, 0x36, 0x3c, 0x47, 0x46, 0x3e, + 0x45, 0x3a, 0x43, 0x43, 0x3f, 0x60, 0x6b, 0x3f, 0x80, 0xb7, 0xcf, 0xc0, + 0x9a, 0x90, 0xb0, 0xba, 0xc9, 0xa3, 0x85, 0xa6, 0xd6, 0xc2, 0xa0, 0xab, + 0xd2, 0xbc, 0x93, 0x90, 0xb5, 0xbd, 0xb3, 0xbd, 0xad, 0xc0, 0x9c, 0x82, + 0x9c, 0x8a, 0x7c, 0xb9, 0xd4, 0xba, 0xc8, 0xa6, 0x60, 0x81, 0xa5, 0x68, + 0x6e, 0x8b, 0x75, 0x73, 0xb5, 0xde, 0xcd, 0xb1, 0x99, 0x9b, 0x90, 0x75, + 0x62, 0x78, 0xb3, 0xe6, 0x8e, 0xbe, 0xc1, 0x91, 0x83, 0xa3, 0xa3, 0x7f, + 0x6b, 0x7f, 0xe4, 0xe9, 0x6e, 0x69, 0xcf, 0xec, 0x8b, 0x93, 0xb2, 0xce, + 0xc6, 0xaa, 0xae, 0xc9, 0xa1, 0xa0, 0x7c, 0x46, 0x3c, 0x63, 0x83, 0x85, + 0x21, 0x15, 0x22, 0x42, 0x5f, 0x7f, 0x99, 0xa1, 0x60, 0x5d, 0x35, 0x37, + 0x44, 0x77, 0xc4, 0xb1, 0x6c, 0x63, 0x38, 0x28, 0x44, 0x43, 0x2d, 0x34, + 0x68, 0x63, 0xba, 0xff, 0xdc, 0xa8, 0x6e, 0x17, 0x52, 0x32, 0x28, 0x39, + 0x39, 0x2a, 0x3c, 0x64, 0x85, 0xa0, 0xa9, 0x8a, 0x61, 0x4b, 0x41, 0x3c, + 0xa5, 0x6e, 0x28, 0x0e, 0x33, 0x69, 0x7a, 0x6c, 0x93, 0x65, 0x28, 0x29, + 0x34, 0x4c, 0xa2, 0xe3, 0xa2, 0x9e, 0x3d, 0x29, 0x36, 0x23, 0x4b, 0x66, + 0x39, 0x28, 0x37, 0x6c, 0xb0, 0xd8, 0xa0, 0x37, 0x9d, 0x75, 0x5b, 0x5e, + 0x54, 0x32, 0x18, 0x16, 0x0d, 0x33, 0x38, 0x1b, 0x22, 0x4e, 0x57, 0x39, + 0x2b, 0x57, 0x67, 0x3b, 0x32, 0x4b, 0x5c, 0x83, 0x72, 0x79, 0x7f, 0x7a, + 0x70, 0x6d, 0x75, 0x7e, 0x78, 0x7b, 0x80, 0x86, 0x85, 0x7a, 0x67, 0x59, + 0x6d, 0x6d, 0x6b, 0x67, 0x60, 0x57, 0x4f, 0x4b, 0x60, 0x58, 0x55, 0x61, + 0x74, 0x7d, 0x78, 0x6f, 0x61, 0x5f, 0x5e, 0x60, 0x63, 0x60, 0x58, 0x50, + 0x59, 0x55, 0x4d, 0x39, 0x2a, 0x39, 0x4e, 0x50, 0x21, 0x1e, 0x20, 0x2a, + 0x33, 0x32, 0x23, 0x16, 0x3b, 0x49, 0x57, 0x5e, 0x5f, 0x56, 0x40, 0x2b, + 0x2b, 0x3e, 0x43, 0x35, 0x2e, 0x37, 0x3a, 0x32, 0x2f, 0x3a, 0x43, 0x40, + 0x37, 0x37, 0x44, 0x53, 0x5b, 0x49, 0x2d, 0x2f, 0x3c, 0x25, 0x15, 0x2c, + 0x33, 0x2b, 0x33, 0x1d, 0x13, 0x59, 0x7b, 0x3e, 0x27, 0x43, 0x48, 0x4f, + 0x6c, 0x6e, 0x5e, 0x61, 0x28, 0x86, 0x82, 0x25, 0x07, 0x24, 0x27, 0x12, + 0x3e, 0x2f, 0x35, 0x68, 0x88, 0x59, 0x25, 0x27, 0x37, 0x75, 0x87, 0x4d, + 0x1f, 0x2b, 0x40, 0x3d, 0x28, 0x15, 0x14, 0x2c, 0x3b, 0x34, 0x2b, 0x2d, + 0x36, 0x2d, 0x44, 0x35, 0x2c, 0x2e, 0x11, 0x19, 0xe9, 0xd4, 0xce, 0xdb, + 0xd5, 0xb0, 0x8d, 0x81, 0xba, 0xa9, 0xaa, 0xa4, 0xa1, 0xc9, 0xdc, 0xb7, + 0xca, 0xbf, 0x97, 0x7f, 0x7d, 0x94, 0xb0, 0xa1, 0x82, 0x8a, 0x91, 0x8b, + 0x92, 0xb7, 0xc1, 0xa4, 0xa6, 0xa0, 0xb9, 0xbb, 0x88, 0x70, 0x8d, 0xa6, + 0xb5, 0x9b, 0x75, 0x80, 0x7f, 0x6f, 0x7c, 0x73, 0x7c, 0x8a, 0x9f, 0xbb, + 0xbe, 0x98, 0x83, 0x97, 0xb4, 0xb2, 0xd1, 0xc0, 0x9b, 0x85, 0x77, 0x94, + 0xa8, 0xf0, 0xc4, 0x97, 0xb6, 0x80, 0x47, 0x85, 0xa9, 0x8c, 0x99, 0xaa, + 0x69, 0x23, 0x68, 0xf3, 0xf8, 0xa3, 0x6a, 0x4c, 0x48, 0x83, 0x91, 0x48, + 0x64, 0x58, 0x34, 0x12, 0x16, 0x2b, 0x1f, 0x00, 0x24, 0x12, 0x0e, 0x25, + 0x38, 0x2f, 0x18, 0x07, 0x4e, 0x7f, 0x6e, 0x55, 0x76, 0x7a, 0x58, 0x53, + 0x44, 0x32, 0x21, 0x37, 0x38, 0x6c, 0xb4, 0x7f, 0x2e, 0x49, 0x48, 0x4c, + 0x64, 0x59, 0x44, 0x51, 0x35, 0x54, 0x20, 0x1b, 0x61, 0x41, 0x19, 0x63, + 0x3b, 0x21, 0x1d, 0x3a, 0x52, 0x53, 0x54, 0x5e, 0x2c, 0x31, 0x38, 0x38, + 0x2f, 0x2b, 0x38, 0x4a, 0x2c, 0x52, 0x53, 0x29, 0x1e, 0x40, 0x4e, 0x3d, + 0x07, 0x48, 0x3b, 0x50, 0x6e, 0x80, 0x89, 0x34, 0x6e, 0xfe, 0xd6, 0x6b, + 0x27, 0x33, 0xb6, 0xff, 0xff, 0xe7, 0xc9, 0x78, 0x20, 0x34, 0x66, 0x55, + 0x20, 0x37, 0x3a, 0x26, 0x22, 0x33, 0x36, 0x28, 0x27, 0x2e, 0x31, 0x2f, + 0x26, 0x23, 0x59, 0xa9, 0x97, 0x59, 0x5b, 0x49, 0x2d, 0x60, 0x86, 0x75, + 0x73, 0x71, 0x73, 0x79, 0x7f, 0x7f, 0x77, 0x6f, 0x92, 0x8e, 0x8b, 0x8a, + 0x87, 0x7f, 0x71, 0x67, 0x68, 0x6a, 0x6e, 0x72, 0x73, 0x71, 0x6f, 0x6d, + 0x6e, 0x61, 0x57, 0x5a, 0x65, 0x68, 0x5d, 0x50, 0x60, 0x60, 0x62, 0x68, + 0x6e, 0x6e, 0x68, 0x61, 0x53, 0x4b, 0x3e, 0x30, 0x4f, 0x98, 0x9c, 0x57, + 0x18, 0x30, 0x47, 0x4c, 0x49, 0x59, 0x80, 0xa3, 0x3b, 0x40, 0x58, 0x6d, + 0x58, 0x2a, 0x19, 0x27, 0x2a, 0x3d, 0x5a, 0x66, 0x4c, 0x25, 0x16, 0x20, + 0x31, 0x25, 0x1e, 0x27, 0x3b, 0x49, 0x49, 0x43, 0x48, 0x34, 0x1a, 0x42, + 0x9b, 0xa9, 0x5a, 0x14, 0x3e, 0x70, 0x72, 0x55, 0x54, 0x4e, 0x38, 0x33, + 0x1f, 0x2f, 0x27, 0x1f, 0x23, 0x17, 0x1b, 0x40, 0x32, 0x42, 0x33, 0x22, + 0x24, 0x1b, 0x17, 0x2d, 0x15, 0x42, 0x2d, 0x13, 0x33, 0x37, 0x20, 0x2a, + 0x2a, 0x4b, 0x4e, 0x35, 0x42, 0x69, 0x5d, 0x2b, 0x2d, 0x19, 0x18, 0x2f, + 0x3e, 0x33, 0x25, 0x22, 0x1c, 0x1b, 0x3c, 0x36, 0x32, 0x37, 0x1d, 0x27, + 0x60, 0x8c, 0xb9, 0xc2, 0xae, 0x9e, 0xa9, 0xbc, 0x86, 0x9a, 0xaf, 0xb4, + 0xac, 0xa6, 0xaa, 0xb1, 0xbe, 0xbf, 0xae, 0x95, 0xad, 0xb0, 0x90, 0xa5, + 0xad, 0x92, 0x90, 0xa8, 0x9a, 0xbf, 0xbe, 0x92, 0x9b, 0x97, 0x85, 0x8d, + 0x76, 0x96, 0x97, 0x95, 0x89, 0x9c, 0xaa, 0xa4, 0xb1, 0xa3, 0x7f, 0x99, + 0xb0, 0x93, 0x95, 0x97, 0x91, 0x84, 0x68, 0x96, 0xa0, 0x83, 0x92, 0xad, + 0xb0, 0x80, 0x47, 0x4f, 0x55, 0x93, 0xd4, 0xe3, 0xc4, 0xa7, 0xab, 0xbd, + 0xaf, 0xba, 0x77, 0x1c, 0x38, 0xa1, 0xa5, 0x52, 0x6d, 0x4b, 0x60, 0x6f, + 0x46, 0x39, 0x3a, 0x16, 0x2a, 0x3f, 0x40, 0x32, 0x3e, 0x60, 0x68, 0x55, + 0x5f, 0x6d, 0x54, 0x47, 0x5c, 0x50, 0x37, 0x44, 0x56, 0x79, 0x8c, 0x6c, + 0x39, 0x2a, 0x4f, 0x7b, 0x4b, 0x56, 0x63, 0x69, 0x60, 0x4a, 0x31, 0x20, + 0x33, 0x28, 0x5b, 0x2e, 0x13, 0x46, 0x48, 0x5f, 0x43, 0x48, 0x24, 0x16, + 0x42, 0x5c, 0x5d, 0x71, 0x9b, 0x78, 0x51, 0x32, 0x24, 0x30, 0x3f, 0x3e, + 0x2f, 0x37, 0x3c, 0x37, 0x39, 0x52, 0x6c, 0x73, 0x49, 0x42, 0x22, 0x26, + 0x50, 0x4f, 0x3d, 0x4e, 0x48, 0x52, 0x44, 0x1f, 0x0b, 0x17, 0x26, 0x29, + 0x3a, 0x83, 0x98, 0x2c, 0x12, 0xbf, 0xf3, 0x51, 0xb7, 0xef, 0xff, 0xd4, + 0x69, 0x23, 0x29, 0x4b, 0x60, 0x32, 0x14, 0x1c, 0x23, 0x1f, 0x2f, 0x4c, + 0x45, 0x42, 0x5a, 0x45, 0x22, 0x26, 0x29, 0x2e, 0x3f, 0x22, 0x34, 0x3b, + 0x1d, 0x3b, 0x72, 0x6b, 0x79, 0x73, 0x6e, 0x6f, 0x76, 0x7c, 0x7d, 0x7c, + 0x8b, 0x88, 0x83, 0x7f, 0x7b, 0x78, 0x78, 0x77, 0x70, 0x72, 0x74, 0x73, + 0x6f, 0x67, 0x5f, 0x5a, 0x67, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x64, 0x5f, 0x5b, 0x5d, 0x65, 0x6b, 0x6d, 0x6c, 0x59, 0x31, 0x39, 0x81, + 0x73, 0x31, 0x33, 0x37, 0x20, 0x19, 0x31, 0x41, 0x36, 0x45, 0x5d, 0x56, + 0x36, 0x1e, 0x1b, 0x2f, 0x32, 0x1d, 0x15, 0x20, 0x2c, 0x56, 0x55, 0x28, + 0x21, 0x45, 0x46, 0x21, 0x79, 0x8b, 0x73, 0x64, 0x78, 0x6a, 0x59, 0x74, + 0x25, 0x55, 0x6d, 0x59, 0x4b, 0x52, 0x46, 0x28, 0x49, 0x51, 0x45, 0x7a, + 0xcd, 0x9e, 0x2e, 0x0c, 0x2a, 0x21, 0x2c, 0x27, 0x0e, 0x1c, 0x3f, 0x48, + 0x6c, 0x6d, 0x85, 0x75, 0x41, 0x3f, 0x46, 0x23, 0xac, 0x80, 0x52, 0x46, + 0x55, 0x5f, 0x54, 0x42, 0x45, 0x1e, 0x42, 0x4f, 0x2a, 0x54, 0x69, 0x10, + 0x32, 0x18, 0x15, 0x31, 0x3f, 0x31, 0x28, 0x2f, 0x23, 0x16, 0x20, 0x3d, + 0x3f, 0x20, 0x0a, 0x0a, 0x67, 0x6f, 0x84, 0xa5, 0xc3, 0xce, 0xc4, 0xb6, + 0xc0, 0xcf, 0xd4, 0xbe, 0x97, 0x7f, 0x82, 0x8f, 0x95, 0x98, 0x8a, 0x9f, + 0xa4, 0x82, 0x62, 0x39, 0x5f, 0xae, 0xb0, 0xb9, 0xb7, 0x9c, 0x77, 0x8b, + 0xca, 0xd3, 0x98, 0x8b, 0xa0, 0xb9, 0x94, 0x97, 0xae, 0x8f, 0x85, 0xb8, + 0xa4, 0x78, 0x9a, 0xa0, 0x8b, 0x60, 0xa9, 0xb1, 0xac, 0xbf, 0xab, 0xb9, + 0x70, 0x60, 0x88, 0x8e, 0x7b, 0x7b, 0x91, 0xd2, 0xca, 0xb0, 0x86, 0x5e, + 0x4a, 0x51, 0x6a, 0x80, 0x72, 0x85, 0x6e, 0x3e, 0x44, 0x7a, 0x8b, 0x70, + 0x6c, 0x56, 0x4b, 0x34, 0x5f, 0xea, 0xeb, 0x45, 0x12, 0x33, 0x4a, 0x42, + 0x3a, 0x4b, 0x6b, 0x81, 0x22, 0x4e, 0x4f, 0x55, 0x6d, 0x51, 0x69, 0xdb, + 0x77, 0x77, 0x52, 0x1a, 0x10, 0x32, 0x46, 0x3c, 0x43, 0x39, 0x2a, 0x1d, + 0x18, 0x1b, 0x23, 0x28, 0x28, 0x51, 0x26, 0x26, 0x61, 0x46, 0x14, 0x1d, + 0x28, 0x2b, 0x54, 0x5a, 0x25, 0x19, 0x3d, 0x4c, 0x23, 0x5e, 0xd8, 0xfb, + 0x7d, 0x0f, 0x26, 0x65, 0x85, 0x55, 0x29, 0x0c, 0x1a, 0x56, 0x59, 0x14, + 0x24, 0x64, 0x64, 0x29, 0x26, 0x5e, 0x7e, 0x7a, 0x2b, 0x3b, 0x3b, 0x2b, + 0x29, 0x39, 0x41, 0x39, 0x31, 0x2c, 0x34, 0x22, 0x1f, 0x62, 0x6d, 0x17, + 0x92, 0x6c, 0x35, 0x13, 0x1d, 0x37, 0x38, 0x26, 0x4b, 0x30, 0x34, 0x60, + 0x81, 0x7b, 0x6d, 0x6b, 0xa1, 0x69, 0x2a, 0x11, 0x34, 0x3b, 0x21, 0x3d, + 0x58, 0x74, 0x72, 0x6c, 0x5d, 0x50, 0x66, 0x7b, 0x6b, 0x6b, 0x70, 0x78, + 0x7e, 0x7e, 0x77, 0x6f, 0x68, 0x63, 0x5c, 0x57, 0x58, 0x5f, 0x67, 0x6d, + 0x65, 0x68, 0x6d, 0x71, 0x71, 0x6e, 0x6b, 0x68, 0x69, 0x69, 0x69, 0x68, + 0x68, 0x68, 0x67, 0x67, 0x63, 0x5d, 0x57, 0x57, 0x5b, 0x5f, 0x5e, 0x5c, + 0x3f, 0x3a, 0x4c, 0x4a, 0x2a, 0x1a, 0x2f, 0x52, 0x63, 0x4c, 0x4b, 0x42, + 0x26, 0x2c, 0x3f, 0x36, 0x4f, 0x41, 0x2d, 0x23, 0x2a, 0x34, 0x2f, 0x23, + 0x56, 0x53, 0x46, 0x43, 0x63, 0x92, 0xa7, 0xa2, 0x9a, 0x65, 0x3c, 0x2b, + 0x1e, 0x21, 0x39, 0x4e, 0x9d, 0x7f, 0x54, 0x2f, 0x1a, 0x1d, 0x32, 0x48, + 0x43, 0x4b, 0x46, 0x5b, 0x96, 0xaf, 0x86, 0x57, 0x18, 0x13, 0x2a, 0x34, + 0x23, 0x27, 0x34, 0x29, 0x4c, 0x45, 0x38, 0x22, 0x19, 0x2c, 0x35, 0x25, + 0x30, 0x69, 0x74, 0x45, 0x39, 0x62, 0x6d, 0x4f, 0x17, 0x09, 0x17, 0x2b, + 0x35, 0x52, 0x5c, 0x3e, 0x27, 0x36, 0x50, 0x60, 0x54, 0x37, 0x26, 0x26, + 0x3f, 0x27, 0x18, 0x1f, 0x29, 0x23, 0x16, 0x0e, 0x95, 0x9b, 0xa5, 0xb0, + 0xb3, 0xac, 0x9d, 0x91, 0x8a, 0x97, 0x9b, 0x8b, 0x74, 0x73, 0x8e, 0xab, + 0xa4, 0xbb, 0x91, 0x6a, 0x66, 0x7c, 0xa2, 0xa4, 0xc5, 0xb5, 0x8d, 0x85, + 0x52, 0x60, 0x93, 0x9e, 0xa2, 0x93, 0x89, 0xb3, 0xc9, 0xca, 0xac, 0xab, + 0xc3, 0xa6, 0x9d, 0x96, 0x91, 0xa2, 0xb5, 0xc0, 0xa5, 0x89, 0xa9, 0xaf, + 0xd4, 0x8a, 0x52, 0x6c, 0x7d, 0x56, 0xaa, 0xb4, 0x69, 0x53, 0x45, 0x46, + 0x5b, 0x2e, 0x01, 0x01, 0x29, 0x51, 0x5f, 0x5b, 0x92, 0x9d, 0x86, 0x43, + 0x0a, 0x16, 0x61, 0xa6, 0x7d, 0x38, 0x56, 0xa3, 0xb0, 0xab, 0x95, 0x59, + 0xc1, 0x90, 0x60, 0x52, 0x52, 0x4a, 0x3d, 0x36, 0x2f, 0x55, 0x33, 0x40, + 0xb9, 0xce, 0x4f, 0x00, 0x26, 0x4b, 0x48, 0x1a, 0x16, 0x41, 0x50, 0x38, + 0x40, 0x38, 0x2d, 0x25, 0x25, 0x2d, 0x38, 0x3f, 0x3a, 0x6b, 0x54, 0x64, + 0x4f, 0x36, 0x4f, 0x02, 0x29, 0x1f, 0x22, 0x40, 0x9d, 0xfe, 0xb5, 0x00, + 0x46, 0xae, 0xff, 0xff, 0x81, 0x74, 0x83, 0x3c, 0x00, 0x2a, 0xa8, 0xfd, + 0xbd, 0x54, 0x31, 0x36, 0x39, 0x39, 0x3d, 0x2d, 0x14, 0x1b, 0x30, 0x30, + 0x48, 0x58, 0x5e, 0x5b, 0x66, 0x78, 0x74, 0x60, 0x41, 0x25, 0x23, 0x38, + 0x3a, 0x32, 0x38, 0x43, 0x30, 0x16, 0x10, 0x1c, 0x13, 0x01, 0x15, 0x3f, + 0x49, 0x20, 0x0f, 0x33, 0x60, 0x67, 0x50, 0x3c, 0x3d, 0x5c, 0x94, 0x8d, + 0x5c, 0x3a, 0x28, 0x39, 0x3d, 0x31, 0x19, 0x2f, 0x40, 0x54, 0x7f, 0x71, + 0x78, 0x74, 0x72, 0x75, 0x7d, 0x82, 0x81, 0x7f, 0x79, 0x7b, 0x7f, 0x82, + 0x83, 0x81, 0x7e, 0x7c, 0x72, 0x74, 0x78, 0x7b, 0x7b, 0x7a, 0x78, 0x76, + 0x77, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6b, 0x71, 0x6a, 0x62, 0x5f, + 0x61, 0x62, 0x60, 0x5d, 0x50, 0x37, 0x38, 0x31, 0x4a, 0x5a, 0x2f, 0x2a, + 0x16, 0x3c, 0x7a, 0x7f, 0x43, 0x2a, 0x3e, 0x45, 0x49, 0x70, 0x85, 0x79, + 0x73, 0x7a, 0x6a, 0x4b, 0x7c, 0x5d, 0x4f, 0x67, 0x80, 0x79, 0x60, 0x4e, + 0x4a, 0x21, 0x43, 0x73, 0x69, 0x65, 0x62, 0x3c, 0x31, 0x2c, 0x25, 0x1c, + 0x18, 0x25, 0x43, 0x5f, 0x28, 0x28, 0x35, 0x42, 0x53, 0x73, 0x72, 0x4a, + 0x6c, 0x3f, 0x3a, 0x5f, 0x82, 0x94, 0x75, 0x35, 0x1d, 0x6e, 0x52, 0x1d, + 0x32, 0x1b, 0x04, 0x40, 0x16, 0x2e, 0x41, 0x43, 0x43, 0x44, 0x38, 0x27, + 0x2d, 0x1a, 0x0f, 0x36, 0x5f, 0x50, 0x4c, 0x7a, 0x4c, 0x39, 0x2d, 0x47, + 0x7e, 0xa0, 0x88, 0x5c, 0x33, 0x2c, 0x22, 0x23, 0x35, 0x40, 0x2f, 0x13, + 0x75, 0x9c, 0xb8, 0x9e, 0x62, 0x3b, 0x45, 0x61, 0x88, 0x82, 0x79, 0x72, + 0x76, 0x8a, 0xa6, 0xba, 0x97, 0x55, 0x61, 0x9a, 0xba, 0xaf, 0xa5, 0xd1, + 0xb5, 0xad, 0x89, 0xb4, 0xbc, 0xb9, 0xbc, 0xb6, 0xa5, 0xaf, 0xc5, 0xc9, + 0xbb, 0xd6, 0xcf, 0x9a, 0x7c, 0x9b, 0x8e, 0x6b, 0xa2, 0xb2, 0x62, 0x53, + 0x94, 0x89, 0x98, 0xa4, 0xa0, 0x4d, 0xa3, 0xc1, 0xaf, 0x94, 0xb1, 0x83, + 0x6f, 0xb1, 0xb6, 0xad, 0x61, 0x46, 0x36, 0x4d, 0x7a, 0x92, 0x83, 0x69, + 0x50, 0x34, 0x23, 0x43, 0x7e, 0x8d, 0x4e, 0x02, 0x21, 0x53, 0x8d, 0xb3, + 0xb6, 0x9f, 0x9a, 0xb0, 0x30, 0x20, 0x28, 0x43, 0x43, 0x29, 0x25, 0x38, + 0x34, 0x38, 0x64, 0xb2, 0xcf, 0x94, 0x4e, 0x3b, 0x4b, 0x60, 0x5e, 0x42, + 0x33, 0x38, 0x31, 0x1c, 0x10, 0x1b, 0x2b, 0x39, 0x3d, 0x37, 0x2d, 0x25, + 0x39, 0x38, 0x48, 0x78, 0x96, 0xe0, 0xe4, 0x36, 0x0b, 0x21, 0x1f, 0x49, + 0xba, 0xff, 0xf9, 0xed, 0x8d, 0x5c, 0x7f, 0x75, 0x13, 0x1b, 0x4d, 0x20, + 0x74, 0xd8, 0xed, 0x8b, 0x24, 0x07, 0x33, 0x71, 0x86, 0x3c, 0x31, 0x4d, + 0x2e, 0x08, 0x1c, 0x40, 0x27, 0x2f, 0x2b, 0x23, 0x2d, 0x40, 0x3b, 0x26, + 0x20, 0x38, 0x34, 0x19, 0x07, 0x06, 0x31, 0x71, 0x70, 0x4e, 0x2e, 0x27, + 0x30, 0x3a, 0x40, 0x45, 0x4d, 0x57, 0x5d, 0x52, 0x3d, 0x38, 0x53, 0x73, + 0x46, 0x5b, 0xae, 0xbc, 0x71, 0x32, 0x1d, 0x2d, 0x46, 0x35, 0x1f, 0x38, + 0x3c, 0x50, 0x86, 0x6f, 0x79, 0x73, 0x6d, 0x6e, 0x76, 0x7e, 0x82, 0x83, + 0x7b, 0x80, 0x86, 0x87, 0x81, 0x74, 0x66, 0x5c, 0x63, 0x65, 0x68, 0x6c, + 0x6f, 0x71, 0x73, 0x73, 0x6d, 0x6b, 0x69, 0x65, 0x62, 0x5e, 0x5b, 0x5a, + 0x6a, 0x63, 0x5b, 0x58, 0x59, 0x5a, 0x58, 0x55, 0x4d, 0x38, 0x37, 0x50, + 0x79, 0x66, 0x22, 0x18, 0x25, 0x18, 0x32, 0x53, 0x5c, 0x6e, 0x72, 0x56, + 0x67, 0x83, 0x85, 0x57, 0x27, 0x1b, 0x26, 0x30, 0x67, 0x44, 0x27, 0x2a, + 0x36, 0x35, 0x2e, 0x2a, 0x3b, 0x20, 0x1c, 0x22, 0x29, 0x4a, 0x56, 0x34, + 0x1b, 0x4a, 0x60, 0x53, 0x62, 0xa2, 0xda, 0xec, 0xd5, 0xae, 0x86, 0x6b, + 0x51, 0x42, 0x55, 0x75, 0x5e, 0x48, 0x51, 0x61, 0x63, 0x75, 0x80, 0x6d, + 0x49, 0x59, 0x37, 0x1d, 0x3a, 0x41, 0x2a, 0x28, 0x1f, 0x20, 0x2f, 0x46, + 0x4b, 0x3d, 0x32, 0x32, 0x22, 0x41, 0x31, 0x11, 0x24, 0x41, 0x3e, 0x33, + 0x2f, 0x45, 0x45, 0x2e, 0x2b, 0x47, 0x5b, 0x59, 0x29, 0x38, 0x37, 0x28, + 0x2b, 0x33, 0x1e, 0x00, 0xb5, 0xad, 0xa8, 0xad, 0xb5, 0xb3, 0xa6, 0x98, + 0x95, 0x94, 0x9c, 0xaa, 0xad, 0x91, 0x5e, 0x33, 0x55, 0x53, 0x7e, 0x84, + 0x8a, 0xb2, 0xa4, 0x79, 0x53, 0xd5, 0xe3, 0xb8, 0x8f, 0xa4, 0xd1, 0xff, + 0xcb, 0xbb, 0xb9, 0xaf, 0x9f, 0x92, 0x90, 0x86, 0x89, 0xda, 0xc6, 0xbb, + 0xd9, 0xd2, 0xcb, 0xc2, 0x6b, 0x86, 0x8c, 0x7b, 0x78, 0x3a, 0x7b, 0x54, + 0x33, 0x6c, 0xa8, 0xab, 0xc4, 0xab, 0x4d, 0x49, 0x24, 0x56, 0xa4, 0xe5, + 0xf4, 0xc7, 0x78, 0x3c, 0x36, 0x2f, 0x20, 0x37, 0x8f, 0xdc, 0xc3, 0x78, + 0x6d, 0xb0, 0x68, 0x06, 0x19, 0x22, 0x17, 0x44, 0x1b, 0x21, 0x4c, 0x86, + 0x8d, 0x5c, 0x2f, 0x22, 0x44, 0xa0, 0xe4, 0x9d, 0x48, 0x97, 0xff, 0xff, + 0xa2, 0x5b, 0x26, 0x2e, 0x45, 0x3f, 0x28, 0x1c, 0x1f, 0x21, 0x25, 0x2a, + 0x30, 0x35, 0x3a, 0x3c, 0x3f, 0x4d, 0x5a, 0x25, 0x23, 0x47, 0x36, 0x45, + 0x2b, 0x43, 0x33, 0x1e, 0x29, 0x47, 0x98, 0xff, 0xa5, 0x19, 0x0d, 0x3c, + 0x25, 0x45, 0x7d, 0x5e, 0x38, 0x52, 0x60, 0xb6, 0xff, 0xc4, 0x5c, 0x73, + 0xc5, 0x67, 0x2e, 0x3c, 0x48, 0x38, 0x29, 0x25, 0x34, 0x39, 0x2e, 0x1c, + 0x22, 0x3d, 0x49, 0x42, 0x31, 0x5b, 0x55, 0x21, 0x04, 0x12, 0x41, 0x77, + 0x69, 0x66, 0x3a, 0x0e, 0x31, 0x78, 0x72, 0x33, 0x22, 0x2d, 0x33, 0x2f, + 0x2c, 0x33, 0x3d, 0x42, 0x51, 0xb0, 0xbb, 0x4f, 0x2b, 0x53, 0x55, 0x56, + 0x71, 0x69, 0x34, 0x31, 0x4c, 0x58, 0x71, 0x78, 0x74, 0x75, 0x79, 0x82, + 0x8b, 0x8d, 0x87, 0x81, 0x81, 0x7d, 0x77, 0x6e, 0x65, 0x5c, 0x56, 0x52, + 0x62, 0x63, 0x66, 0x6b, 0x71, 0x77, 0x7c, 0x7f, 0x70, 0x6e, 0x6b, 0x68, + 0x64, 0x61, 0x5e, 0x5d, 0x69, 0x62, 0x5a, 0x58, 0x5b, 0x5d, 0x5c, 0x59, + 0x47, 0x46, 0x31, 0x4a, 0x5b, 0x34, 0x21, 0x29, 0x22, 0x14, 0x2b, 0x48, + 0x4d, 0x5a, 0x5c, 0x3e, 0x4d, 0x45, 0x40, 0x3a, 0x27, 0x1b, 0x32, 0x56, + 0x2e, 0x31, 0x29, 0x1d, 0x22, 0x36, 0x43, 0x42, 0x48, 0x6f, 0x5b, 0x38, + 0x56, 0x77, 0x64, 0x47, 0xbd, 0xcc, 0xb8, 0x87, 0x75, 0x84, 0x7e, 0x62, + 0xa6, 0xb8, 0x9d, 0x81, 0x74, 0x41, 0x2f, 0x66, 0x3a, 0x13, 0x11, 0x2e, + 0x46, 0x59, 0x48, 0x17, 0x17, 0x20, 0x8a, 0xad, 0x5d, 0x6c, 0x96, 0x58, + 0x00, 0x45, 0x63, 0x39, 0x26, 0x51, 0x77, 0x76, 0x40, 0x24, 0x28, 0x33, + 0x1d, 0x0f, 0x19, 0x1e, 0x18, 0x2c, 0x31, 0x27, 0x2f, 0x44, 0x42, 0x2b, + 0x56, 0x6d, 0x70, 0x56, 0x42, 0x3a, 0x21, 0x00, 0x50, 0x79, 0x9b, 0x90, + 0x6a, 0x5e, 0x7f, 0xa7, 0xcb, 0xb1, 0x93, 0x89, 0x92, 0x9e, 0x9e, 0x99, + 0x66, 0x89, 0x70, 0x68, 0x7c, 0x76, 0x5f, 0x39, 0x23, 0x23, 0x3e, 0x5f, + 0x5b, 0x85, 0x71, 0x33, 0x10, 0x6a, 0xce, 0xb4, 0x77, 0x71, 0xb4, 0xcb, + 0xbf, 0x87, 0x97, 0xbf, 0x83, 0x45, 0x74, 0xb5, 0xbe, 0x95, 0x52, 0x17, + 0x4a, 0x42, 0x3d, 0x32, 0x98, 0x76, 0x58, 0x36, 0x2b, 0x35, 0x38, 0x43, + 0x63, 0x5c, 0x4d, 0x40, 0x4b, 0x78, 0xbb, 0xed, 0xc4, 0xfa, 0xf2, 0x90, + 0x36, 0x24, 0x31, 0x32, 0x13, 0x5b, 0x78, 0xb3, 0xed, 0x86, 0x20, 0x54, + 0x41, 0x22, 0x1b, 0x40, 0x64, 0x59, 0x26, 0x00, 0x26, 0x62, 0xb6, 0x95, + 0x14, 0x0d, 0x91, 0xf9, 0x64, 0x27, 0x12, 0x39, 0x49, 0x29, 0x1a, 0x2e, + 0x5a, 0x43, 0x23, 0x0e, 0x12, 0x2e, 0x55, 0x6f, 0x98, 0x3a, 0x68, 0x66, + 0x41, 0x3e, 0x16, 0x27, 0x16, 0x21, 0x3e, 0x38, 0x1c, 0x2e, 0x3b, 0x16, + 0x3b, 0x21, 0x19, 0x00, 0x1b, 0xaf, 0xeb, 0x82, 0x73, 0xa5, 0x6f, 0x54, + 0xc6, 0xff, 0xb7, 0x76, 0x31, 0x2b, 0x3e, 0x7b, 0x82, 0x26, 0x00, 0x35, + 0x26, 0x38, 0x37, 0x22, 0x20, 0x3f, 0x5e, 0x6a, 0x47, 0x47, 0x42, 0x2e, + 0x1a, 0x24, 0x3c, 0x46, 0x1e, 0x1d, 0x25, 0x2d, 0x28, 0x29, 0x4c, 0x78, + 0x5d, 0x53, 0x3b, 0x25, 0x2c, 0x44, 0x4a, 0x3d, 0x58, 0x5d, 0x6e, 0x59, + 0x40, 0x37, 0x3e, 0x6b, 0x55, 0x2e, 0x28, 0x2c, 0x32, 0x5c, 0x7e, 0x7c, + 0x73, 0x71, 0x72, 0x79, 0x82, 0x87, 0x86, 0x83, 0x8e, 0x8d, 0x8a, 0x85, + 0x80, 0x7a, 0x75, 0x72, 0x8a, 0x87, 0x82, 0x7d, 0x7a, 0x79, 0x7a, 0x7b, + 0x7f, 0x7e, 0x7c, 0x7a, 0x78, 0x75, 0x74, 0x73, 0x73, 0x6c, 0x65, 0x62, + 0x65, 0x67, 0x65, 0x62, 0x53, 0x56, 0x2b, 0x2d, 0x39, 0x32, 0x40, 0x31, + 0x20, 0x48, 0x8b, 0x97, 0x62, 0x50, 0x69, 0x73, 0x52, 0x35, 0x30, 0x4a, + 0x4f, 0x32, 0x1f, 0x24, 0x1d, 0x34, 0x42, 0x3d, 0x3b, 0x44, 0x46, 0x3e, + 0x1b, 0x72, 0x82, 0x6e, 0x87, 0x7b, 0x3d, 0x1f, 0x34, 0x2c, 0x36, 0x5d, + 0x7e, 0x73, 0x40, 0x12, 0x53, 0x8e, 0x6c, 0x31, 0x3b, 0x3c, 0x45, 0x81, + 0x3a, 0x26, 0x22, 0x1a, 0x13, 0x4c, 0xa6, 0xd3, 0xa4, 0x7b, 0x4e, 0x22, + 0x11, 0x36, 0x57, 0x4c, 0x2d, 0x40, 0x39, 0x17, 0x12, 0x34, 0x52, 0x56, + 0x48, 0x35, 0x4d, 0x63, 0x47, 0x33, 0x3c, 0x3f, 0x05, 0x16, 0x23, 0x26, + 0x2a, 0x2f, 0x29, 0x1d, 0x3a, 0x55, 0x71, 0x7d, 0x78, 0x5d, 0x2d, 0x03, + 0xd9, 0xae, 0x8b, 0x94, 0xb8, 0xc4, 0xa5, 0x7f, 0x6b, 0x8f, 0xba, 0xd0, + 0xcc, 0xbf, 0xb7, 0xb7, 0xba, 0xdb, 0xca, 0xcd, 0xd1, 0xb1, 0xb3, 0xc8, + 0xbe, 0x6d, 0x85, 0xb7, 0x7e, 0x44, 0x13, 0x2d, 0x39, 0x22, 0x3a, 0x33, + 0x25, 0x1d, 0x68, 0x9a, 0x46, 0x1e, 0x56, 0x5f, 0x48, 0x69, 0x5e, 0x39, + 0x64, 0x31, 0x45, 0x5c, 0x59, 0x4d, 0x44, 0x32, 0x34, 0x35, 0x3f, 0x40, + 0x3f, 0x83, 0xa2, 0x45, 0x8a, 0x70, 0x45, 0x1f, 0x1c, 0x49, 0x94, 0xcd, + 0xc6, 0x9e, 0x62, 0x30, 0x1b, 0x23, 0x35, 0x41, 0x80, 0x95, 0xa5, 0xb9, + 0xb5, 0x77, 0x47, 0x54, 0x43, 0x40, 0x2f, 0x19, 0x14, 0x1d, 0x1e, 0x15, + 0x9f, 0xe3, 0xcd, 0xa1, 0xdd, 0xff, 0xdc, 0x95, 0x25, 0x23, 0x38, 0x4f, + 0x39, 0x08, 0x00, 0x17, 0x44, 0x39, 0x2a, 0x20, 0x21, 0x2d, 0x3e, 0x4a, + 0x47, 0x18, 0x78, 0x82, 0x0c, 0x4d, 0xf2, 0xff, 0x98, 0xb6, 0xfb, 0xf8, + 0x84, 0x23, 0x0f, 0x0f, 0x1e, 0x37, 0x42, 0x1c, 0x17, 0x78, 0xbe, 0xa4, + 0x50, 0x4f, 0x3a, 0x10, 0x00, 0x18, 0x28, 0x17, 0x34, 0x1b, 0x10, 0x94, + 0xff, 0xcd, 0x2a, 0x1b, 0x29, 0x4f, 0x60, 0x48, 0x34, 0x43, 0x64, 0x78, + 0x61, 0x50, 0x5d, 0x53, 0x3c, 0x6a, 0x99, 0x80, 0x7f, 0x3a, 0x1f, 0x40, + 0x47, 0x30, 0x4d, 0x8f, 0x5b, 0x75, 0x6e, 0x3b, 0x18, 0x28, 0x4b, 0x5e, + 0x8b, 0x3b, 0x39, 0x58, 0x6a, 0x73, 0x4f, 0x28, 0x39, 0x2b, 0xa1, 0xa9, + 0x4b, 0x5b, 0x81, 0x7a, 0x68, 0x61, 0x5c, 0x5e, 0x68, 0x72, 0x78, 0x7a, + 0x81, 0x83, 0x85, 0x85, 0x82, 0x7d, 0x78, 0x74, 0x8d, 0x88, 0x7f, 0x75, + 0x6e, 0x6b, 0x6b, 0x6b, 0x74, 0x74, 0x74, 0x74, 0x73, 0x73, 0x73, 0x73, + 0x74, 0x6c, 0x63, 0x5e, 0x5e, 0x5d, 0x59, 0x55, 0x4e, 0x50, 0x43, 0x33, + 0x31, 0x49, 0x56, 0x3f, 0x2f, 0x1d, 0x25, 0x29, 0x1a, 0x2c, 0x49, 0x45, + 0x23, 0x26, 0x2d, 0x30, 0x29, 0x1d, 0x1c, 0x23, 0x3d, 0x23, 0x17, 0x26, + 0x3a, 0x48, 0x5e, 0x76, 0x66, 0x72, 0x6f, 0x5b, 0x40, 0x26, 0x27, 0x3d, + 0x48, 0x3d, 0x3e, 0x56, 0x69, 0x5e, 0x36, 0x13, 0x25, 0x5a, 0x58, 0x32, + 0x28, 0x24, 0x2a, 0x47, 0x4e, 0x2b, 0x1f, 0x1d, 0x14, 0x24, 0x30, 0x1e, + 0x4d, 0x79, 0x3b, 0x00, 0x17, 0x2e, 0x4b, 0x9e, 0x6f, 0x36, 0x07, 0x07, + 0x18, 0x1b, 0x16, 0x15, 0x6d, 0xfa, 0xff, 0xa7, 0xaa, 0xf6, 0xe1, 0x8a, + 0x27, 0x12, 0x21, 0x6d, 0xc1, 0xdc, 0xbb, 0x93, 0x35, 0x23, 0x25, 0x48, + 0x61, 0x4d, 0x17, 0x00, 0x67, 0x87, 0x99, 0x7f, 0x4e, 0x3a, 0x55, 0x7a, + 0x6b, 0x82, 0x87, 0x5e, 0x27, 0x1a, 0x46, 0x79, 0x5b, 0x18, 0x44, 0x6e, + 0x6d, 0x98, 0xa7, 0x83, 0x34, 0x26, 0x6e, 0x6d, 0x26, 0x3b, 0x31, 0x3e, + 0x6d, 0x50, 0x28, 0x1e, 0x61, 0x3b, 0x30, 0x58, 0x50, 0x43, 0x30, 0x40, + 0x42, 0x37, 0x3e, 0x2f, 0x3c, 0x47, 0x29, 0x3b, 0x42, 0x3f, 0x53, 0x60, + 0x60, 0x56, 0x28, 0x35, 0x3e, 0x31, 0x3f, 0x27, 0x3b, 0x37, 0x30, 0x28, + 0x25, 0x28, 0x30, 0x37, 0x0f, 0x03, 0x3d, 0xb4, 0xf4, 0xcb, 0x85, 0x64, + 0x91, 0x35, 0x16, 0x21, 0x15, 0x2a, 0x4c, 0x40, 0x3c, 0x3c, 0x31, 0x33, + 0x58, 0x77, 0x56, 0x1b, 0x62, 0xb9, 0x64, 0x12, 0x5b, 0x57, 0x17, 0x3e, + 0x19, 0x0e, 0x0a, 0x17, 0x2d, 0x3a, 0x3d, 0x3c, 0x2d, 0x49, 0x70, 0x8c, + 0x8a, 0x6d, 0x44, 0x27, 0x03, 0xaa, 0xff, 0xff, 0xb7, 0xae, 0xed, 0xa8, + 0x75, 0xa3, 0x73, 0x17, 0x0e, 0x2d, 0x34, 0x34, 0x69, 0x43, 0x1f, 0x19, + 0x3a, 0x63, 0x5a, 0x2e, 0x30, 0x45, 0x85, 0x80, 0x70, 0xe1, 0xff, 0x8b, + 0x5d, 0xe4, 0xdf, 0xb8, 0xdc, 0x8e, 0x16, 0x21, 0x3d, 0x71, 0x8e, 0x71, + 0x47, 0x42, 0x58, 0x6b, 0x2c, 0x39, 0x5a, 0x33, 0x0b, 0x78, 0xdd, 0xb8, + 0xac, 0xc1, 0xb3, 0x8d, 0x8b, 0x9a, 0x74, 0x31, 0x48, 0x30, 0x15, 0x24, + 0x67, 0x92, 0x61, 0x0e, 0x24, 0x1f, 0x23, 0x1f, 0x2e, 0x30, 0x21, 0x3e, + 0x57, 0x62, 0xe5, 0xd5, 0x6e, 0x61, 0x57, 0x66, 0x6e, 0x6f, 0x72, 0x7b, + 0x85, 0x89, 0x87, 0x82, 0x92, 0x8b, 0x80, 0x77, 0x74, 0x77, 0x7d, 0x82, + 0x75, 0x73, 0x71, 0x71, 0x74, 0x7b, 0x83, 0x88, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7a, 0x84, 0x7b, 0x70, 0x68, 0x65, 0x62, 0x5c, 0x57, + 0x56, 0x34, 0x3a, 0x2d, 0x37, 0x65, 0x5a, 0x3d, 0x2d, 0x21, 0x2f, 0x31, + 0x18, 0x1b, 0x28, 0x1b, 0x56, 0xab, 0xe8, 0xca, 0x84, 0x56, 0x45, 0x3e, + 0x57, 0x1d, 0x13, 0x4c, 0x6c, 0x57, 0x4f, 0x65, 0x1a, 0x0e, 0x59, 0x9b, + 0x66, 0x28, 0x30, 0x45, 0x39, 0x60, 0x6c, 0x51, 0x45, 0x56, 0x55, 0x3e, + 0x32, 0x2b, 0x39, 0x40, 0x2b, 0x2b, 0x59, 0x87, 0x91, 0x62, 0x3f, 0x21, + 0x07, 0x19, 0x3a, 0x3c, 0x1b, 0x17, 0x1d, 0x15, 0x0f, 0x39, 0x62, 0x5d, + 0x4e, 0x5b, 0x43, 0x14, 0x13, 0x3b, 0x44, 0x2a, 0x74, 0xe4, 0xe0, 0xb5, + 0xd7, 0xc4, 0x8b, 0x98, 0x0f, 0x48, 0xaf, 0xff, 0xff, 0xff, 0xe9, 0xed, + 0xca, 0x68, 0x15, 0x15, 0x38, 0x3b, 0x21, 0x0c, 0x4c, 0x32, 0x13, 0x31, + 0x64, 0x51, 0x3e, 0x66, 0x5f, 0x27, 0x00, 0x24, 0x71, 0x95, 0x6f, 0x36, + 0x1f, 0x31, 0x67, 0x9f, 0x93, 0x4a, 0x0f, 0x00, 0x00, 0x3c, 0x60, 0x61, + 0x80, 0xb5, 0xb1, 0x82, 0x68, 0xc6, 0x4e, 0x28, 0x63, 0x40, 0x49, 0x68, + 0x45, 0x64, 0x4e, 0x3b, 0x52, 0x49, 0x3f, 0x67, 0x7e, 0x5f, 0x3f, 0x3b, + 0x52, 0x70, 0x80, 0x84, 0x3a, 0x40, 0x17, 0x0e, 0x2e, 0x11, 0x00, 0x2b, + 0x38, 0x36, 0x31, 0x35, 0x46, 0x4e, 0x3b, 0x1f, 0x03, 0x54, 0x84, 0xca, + 0xbd, 0x58, 0x39, 0x33, 0x17, 0x42, 0x6c, 0x6f, 0x53, 0x3d, 0x44, 0x56, + 0x48, 0x65, 0x2e, 0x2c, 0x8e, 0x8c, 0x55, 0x73, 0x29, 0x3e, 0x3f, 0x44, + 0x53, 0x42, 0x25, 0x24, 0x36, 0x1d, 0x39, 0x3c, 0x17, 0x41, 0x7e, 0x6f, + 0x41, 0x73, 0x93, 0x6e, 0x28, 0x0f, 0x40, 0x7e, 0x78, 0x49, 0x92, 0xf7, + 0xd8, 0x89, 0x62, 0x4a, 0x38, 0x69, 0x6a, 0x2c, 0x0b, 0x20, 0x25, 0x0b, + 0x5a, 0x5e, 0x64, 0x68, 0x64, 0x55, 0x40, 0x31, 0x38, 0x2e, 0x73, 0xfc, + 0xfb, 0xfc, 0xff, 0x9a, 0xa1, 0x94, 0x5a, 0x40, 0x83, 0xc2, 0x9b, 0x51, + 0x30, 0x2b, 0x24, 0x1f, 0x1f, 0x24, 0x2b, 0x30, 0x4e, 0x0b, 0x0d, 0x33, + 0x2d, 0x2c, 0x38, 0x2b, 0xb9, 0x84, 0x4b, 0x3a, 0x4a, 0x55, 0x44, 0x2b, + 0x31, 0x1a, 0x1f, 0x4b, 0x67, 0x55, 0x33, 0x21, 0x75, 0x79, 0x5d, 0x3e, + 0x37, 0x2b, 0x23, 0x2f, 0x35, 0x3a, 0x35, 0x0e, 0x31, 0x6e, 0x66, 0x6b, + 0x5c, 0x64, 0x6f, 0x75, 0x76, 0x74, 0x72, 0x71, 0x8c, 0x8d, 0x84, 0x75, + 0x72, 0x77, 0x74, 0x6a, 0x6a, 0x73, 0x7f, 0x8a, 0x8f, 0x8c, 0x85, 0x80, + 0x76, 0x7b, 0x7e, 0x78, 0x6c, 0x66, 0x69, 0x6e, 0x72, 0x6d, 0x66, 0x60, + 0x5e, 0x5f, 0x62, 0x65, 0x47, 0x3a, 0x39, 0x39, 0x2c, 0x27, 0x36, 0x43, + 0x3b, 0x49, 0x35, 0x29, 0x75, 0xd9, 0xce, 0x7b, 0xae, 0x8f, 0x77, 0x6c, + 0x54, 0x3a, 0x41, 0x5e, 0x55, 0x78, 0x9f, 0x93, 0x6a, 0x5c, 0x45, 0x14, + 0x60, 0x7f, 0x80, 0x77, 0x72, 0x52, 0x46, 0x6b, 0x94, 0x76, 0x4f, 0x39, + 0x37, 0x3e, 0x42, 0x41, 0x2e, 0x41, 0x53, 0x4c, 0x2b, 0x11, 0x1b, 0x35, + 0x0f, 0x36, 0x41, 0x22, 0x11, 0x24, 0x2f, 0x24, 0x1c, 0x39, 0x30, 0x21, + 0x2a, 0x1e, 0x19, 0x39, 0x68, 0x4a, 0x29, 0x24, 0x23, 0x1b, 0x49, 0x9e, + 0xf1, 0xef, 0xd7, 0xd4, 0xd3, 0xd1, 0xe5, 0xe4, 0xaf, 0xb3, 0xd1, 0xf0, + 0xe9, 0xd7, 0xf7, 0xff, 0xf0, 0xcb, 0xd9, 0xb1, 0x6b, 0x28, 0x00, 0x18, + 0x6d, 0x96, 0xb8, 0xe5, 0xfc, 0xa8, 0x34, 0x0b, 0x37, 0x3f, 0x4b, 0x5a, + 0x6a, 0x79, 0x85, 0x8d, 0x35, 0x42, 0x49, 0x5b, 0x93, 0xc7, 0xba, 0x89, + 0x7a, 0x3c, 0x19, 0x3e, 0x6d, 0x68, 0x3b, 0x16, 0x33, 0x66, 0x54, 0x56, + 0x5d, 0x40, 0x45, 0x53, 0xae, 0x71, 0x65, 0x67, 0x50, 0x58, 0x54, 0x1c, + 0x2c, 0x2e, 0x37, 0x47, 0x53, 0x51, 0x40, 0x30, 0x31, 0x32, 0x2f, 0x1c, + 0x15, 0x31, 0x42, 0x31, 0x20, 0x1f, 0x1c, 0x1a, 0x20, 0x2a, 0x2c, 0x29, + 0x41, 0x36, 0x5a, 0xab, 0x69, 0x03, 0x37, 0x69, 0x2a, 0x3b, 0x4c, 0x50, + 0x45, 0x39, 0x35, 0x36, 0x3e, 0x3e, 0x29, 0x2d, 0x4e, 0x3d, 0x0a, 0x00, + 0x26, 0x3b, 0x38, 0x32, 0x39, 0x2c, 0x20, 0x2e, 0x18, 0x40, 0x5c, 0x30, + 0x0c, 0x4c, 0x7d, 0x57, 0x2f, 0x33, 0x33, 0x33, 0x47, 0x80, 0xd1, 0xff, + 0xe4, 0x78, 0x87, 0xd9, 0xb7, 0x78, 0xa5, 0xf4, 0xa3, 0x5e, 0x38, 0x4b, + 0x4d, 0x2a, 0x21, 0x39, 0x33, 0x58, 0x7f, 0x84, 0x63, 0x37, 0x17, 0x0b, + 0x13, 0x0a, 0x8b, 0xfc, 0xf8, 0xf7, 0xff, 0xff, 0xff, 0xbd, 0x6e, 0x55, + 0x68, 0x65, 0x41, 0x24, 0x1a, 0x26, 0x37, 0x43, 0x42, 0x35, 0x23, 0x16, + 0x21, 0x40, 0x3b, 0x31, 0x31, 0x0a, 0x00, 0x1f, 0x95, 0x6d, 0x3f, 0x2b, + 0x30, 0x36, 0x2d, 0x1f, 0x1c, 0x26, 0x37, 0x3b, 0x26, 0x25, 0x61, 0xa9, + 0x8e, 0x4b, 0x2c, 0x2b, 0x12, 0x06, 0x2a, 0x50, 0x7c, 0x55, 0x5f, 0x4d, + 0x3f, 0x65, 0x6d, 0x62, 0x5d, 0x63, 0x6b, 0x70, 0x6f, 0x6b, 0x66, 0x63, + 0x7e, 0x82, 0x7d, 0x71, 0x71, 0x7a, 0x7b, 0x73, 0x75, 0x75, 0x75, 0x73, + 0x71, 0x6e, 0x6c, 0x6a, 0x80, 0x84, 0x86, 0x81, 0x77, 0x72, 0x74, 0x79, + 0x83, 0x7d, 0x72, 0x67, 0x5e, 0x58, 0x56, 0x56, 0x47, 0x49, 0x46, 0x30, + 0x1c, 0x2d, 0x46, 0x49, 0x80, 0x4d, 0x45, 0x75, 0x82, 0x54, 0x35, 0x3e, + 0x2c, 0x24, 0x1c, 0x34, 0x77, 0xab, 0x94, 0x5c, 0x47, 0x44, 0x52, 0x72, + 0x7a, 0x58, 0x42, 0x50, 0x6c, 0x6c, 0x48, 0x35, 0x4a, 0x4f, 0x58, 0x7f, + 0x74, 0x5f, 0x46, 0x38, 0x33, 0x2c, 0x1e, 0x10, 0x4e, 0x42, 0x20, 0x05, + 0x19, 0x39, 0x29, 0x00, 0x1f, 0x3a, 0x41, 0x31, 0x35, 0x50, 0x57, 0x48, + 0x69, 0x28, 0x00, 0x52, 0xff, 0xff, 0x80, 0x00, 0x04, 0x0f, 0x82, 0xf0, + 0xa6, 0x16, 0x2d, 0xb4, 0xba, 0xbf, 0xd0, 0xc9, 0xbc, 0xb3, 0xa1, 0xa3, + 0x76, 0x78, 0xa6, 0xf1, 0xff, 0xf1, 0xc4, 0xb1, 0xd9, 0x97, 0x98, 0x99, + 0x9c, 0x7e, 0x29, 0x1c, 0x76, 0x82, 0x56, 0x33, 0x4a, 0x4d, 0x36, 0x39, + 0x43, 0x3b, 0x33, 0x32, 0x35, 0x34, 0x2c, 0x24, 0x49, 0x3b, 0x18, 0x02, + 0x23, 0x55, 0x52, 0x2b, 0x0a, 0x2d, 0x3a, 0x2d, 0x38, 0x59, 0x5b, 0x40, + 0x2d, 0x1c, 0x4c, 0x4b, 0x34, 0x4c, 0x53, 0x56, 0x62, 0x45, 0x56, 0x56, + 0x2d, 0x37, 0x56, 0x43, 0x25, 0x1d, 0x1b, 0x28, 0x3d, 0x49, 0x45, 0x3c, + 0x36, 0x0c, 0x32, 0x50, 0x27, 0x2d, 0x44, 0x20, 0x22, 0x1c, 0x21, 0x36, + 0x48, 0x45, 0x32, 0x21, 0x32, 0x16, 0x19, 0xad, 0xfc, 0xa8, 0x64, 0x38, + 0x78, 0x6d, 0x61, 0x5c, 0x5b, 0x54, 0x44, 0x37, 0x26, 0x17, 0x28, 0x35, + 0x26, 0x2a, 0x30, 0x1a, 0x30, 0x42, 0x38, 0x2a, 0x2d, 0x25, 0x25, 0x3d, + 0x58, 0x5e, 0x50, 0x27, 0x0c, 0x20, 0x40, 0x48, 0x12, 0x1b, 0x29, 0x33, + 0x33, 0x27, 0x15, 0x07, 0x85, 0xa0, 0xd3, 0xbe, 0x53, 0x1c, 0x48, 0x7c, + 0x89, 0x37, 0x06, 0x30, 0x71, 0x79, 0x51, 0x2d, 0x1b, 0x0e, 0x16, 0x46, + 0x7b, 0x82, 0x50, 0x19, 0x31, 0x5c, 0xe1, 0xda, 0xa9, 0xa4, 0x9b, 0xf2, + 0xea, 0x9c, 0x43, 0x13, 0x0f, 0x24, 0x38, 0x3f, 0x3b, 0x35, 0x2d, 0x25, + 0x20, 0x21, 0x24, 0x26, 0x58, 0x73, 0x56, 0x36, 0x45, 0x3d, 0x26, 0x32, + 0x2e, 0x2f, 0x34, 0x3c, 0x45, 0x4b, 0x4c, 0x4b, 0x75, 0x4b, 0x2b, 0x29, + 0x29, 0x23, 0x2d, 0x42, 0x16, 0x1c, 0x40, 0x59, 0x4a, 0x3e, 0x3b, 0x2e, + 0x3d, 0x35, 0x2b, 0x1b, 0x41, 0x79, 0x75, 0x6a, 0x65, 0x68, 0x6d, 0x71, + 0x70, 0x6b, 0x63, 0x5d, 0x6a, 0x71, 0x71, 0x68, 0x6a, 0x76, 0x7b, 0x77, + 0x92, 0x8b, 0x80, 0x77, 0x72, 0x74, 0x78, 0x7c, 0x73, 0x76, 0x77, 0x74, + 0x6e, 0x6b, 0x6c, 0x70, 0x65, 0x64, 0x63, 0x62, 0x65, 0x69, 0x6d, 0x70, + 0x71, 0x57, 0x4e, 0x3e, 0x19, 0x21, 0x67, 0xa3, 0x51, 0x40, 0x31, 0x38, + 0x53, 0x6d, 0x76, 0x73, 0x24, 0x67, 0x87, 0x56, 0x17, 0x16, 0x45, 0x6d, + 0x2a, 0x56, 0x5a, 0x5b, 0x5f, 0x2b, 0x20, 0x6b, 0x53, 0x4f, 0x2e, 0x35, + 0x76, 0x99, 0x97, 0xa3, 0x7a, 0x7f, 0x8b, 0x97, 0x94, 0x75, 0x43, 0x1d, + 0x4b, 0x5c, 0x4f, 0x27, 0x18, 0x2a, 0x2f, 0x1e, 0x50, 0x5c, 0x59, 0x49, + 0x48, 0x55, 0x52, 0x41, 0x57, 0x4d, 0x41, 0x82, 0xf7, 0xff, 0xc7, 0x94, + 0x8e, 0x9f, 0xd4, 0xe0, 0xc3, 0xde, 0xfb, 0xda, 0xd6, 0xaa, 0xbd, 0xac, + 0xc5, 0xef, 0xcd, 0xdd, 0xa4, 0x9a, 0xa7, 0xc9, 0xce, 0xa6, 0x74, 0x59, + 0x6f, 0x40, 0x5e, 0x80, 0x9f, 0x83, 0x0c, 0x00, 0x12, 0x46, 0x3a, 0x1c, + 0x39, 0x4b, 0x33, 0x25, 0x48, 0x32, 0x23, 0x31, 0x4f, 0x5d, 0x4e, 0x38, + 0x1c, 0x0d, 0x19, 0x3b, 0x44, 0x38, 0x46, 0x67, 0x43, 0x73, 0x7a, 0x5d, + 0x73, 0xa7, 0x94, 0x4d, 0x3e, 0x27, 0x5a, 0x2c, 0x2b, 0x7a, 0x5c, 0x49, + 0xb4, 0xa8, 0x75, 0x7b, 0xb7, 0x94, 0x29, 0x00, 0x2a, 0x41, 0x45, 0x21, + 0x03, 0x2a, 0x97, 0xf9, 0x8c, 0x39, 0x3b, 0x53, 0x08, 0x00, 0x62, 0xfa, + 0x52, 0x28, 0x10, 0x27, 0x49, 0x4d, 0x3e, 0x33, 0x3b, 0xaf, 0x73, 0x75, + 0xbc, 0x5e, 0x07, 0x1f, 0x38, 0x32, 0x30, 0x39, 0x4c, 0x5d, 0x65, 0x66, + 0x4a, 0x21, 0x1c, 0x3c, 0x58, 0x64, 0x44, 0x07, 0x41, 0x4c, 0x3d, 0x33, + 0x3f, 0x3a, 0x32, 0x42, 0x11, 0x71, 0x82, 0x3b, 0x2a, 0x60, 0x88, 0x89, + 0x77, 0x66, 0x45, 0x1f, 0x07, 0x0f, 0x2f, 0x4d, 0xce, 0xb1, 0x6d, 0x1d, + 0x0b, 0x3e, 0x5d, 0x48, 0x28, 0x6b, 0x9d, 0x88, 0x53, 0x39, 0x40, 0x4d, + 0x50, 0x38, 0x22, 0x25, 0x3c, 0x4c, 0x4a, 0x40, 0xe0, 0xff, 0xd8, 0x5c, + 0x56, 0x89, 0x77, 0x90, 0xa0, 0xa5, 0x95, 0x63, 0x4c, 0x70, 0x70, 0x34, + 0x00, 0x07, 0x20, 0x36, 0x40, 0x3c, 0x31, 0x28, 0x0d, 0x41, 0x7c, 0x58, + 0x05, 0x0d, 0x43, 0x46, 0x28, 0x45, 0x66, 0x71, 0x64, 0x50, 0x46, 0x44, + 0x40, 0x28, 0x24, 0x3a, 0x4b, 0x4d, 0x5b, 0x71, 0x90, 0x94, 0x71, 0x53, + 0x68, 0x80, 0x7e, 0x7a, 0x5d, 0x6a, 0x5a, 0x49, 0x65, 0x78, 0x71, 0x7d, + 0x6c, 0x6d, 0x71, 0x77, 0x7a, 0x77, 0x6e, 0x66, 0x79, 0x83, 0x84, 0x7b, + 0x7a, 0x85, 0x8c, 0x8b, 0x83, 0x7d, 0x75, 0x6f, 0x6f, 0x74, 0x7c, 0x82, + 0x6c, 0x6f, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x88, 0x76, 0x72, 0x6c, 0x64, + 0x5d, 0x56, 0x52, 0x50, 0x58, 0x4c, 0x41, 0x2c, 0x32, 0x75, 0x9f, 0x86, + 0x33, 0x0f, 0x0c, 0x43, 0x7f, 0x91, 0x84, 0x77, 0xa2, 0x7e, 0x70, 0x82, + 0x83, 0x5a, 0x2c, 0x18, 0xb3, 0xd7, 0x96, 0x79, 0xcb, 0xc5, 0x69, 0x52, + 0xe2, 0xcc, 0x87, 0x67, 0x90, 0x9b, 0x70, 0x54, 0x4b, 0x50, 0x5f, 0x78, + 0x8c, 0x8b, 0x76, 0x62, 0x39, 0x2a, 0x19, 0x19, 0x2d, 0x3c, 0x2f, 0x16, + 0x31, 0x3f, 0x45, 0x39, 0x2b, 0x29, 0x2e, 0x32, 0x2e, 0x53, 0x5e, 0x6d, + 0x8d, 0x81, 0x64, 0x6e, 0x4f, 0x51, 0x9b, 0xba, 0x91, 0xa7, 0xbc, 0x7c, + 0x23, 0x2e, 0x94, 0x75, 0x5d, 0x79, 0x5e, 0xa5, 0x7a, 0x8d, 0x95, 0x77, + 0x3b, 0x11, 0x16, 0x31, 0x2d, 0x43, 0xa1, 0xc8, 0xc9, 0x9c, 0x2b, 0x02, + 0x63, 0x8b, 0x67, 0x2c, 0x37, 0x4a, 0x45, 0x49, 0x49, 0x48, 0x46, 0x43, + 0x3f, 0x3c, 0x3a, 0x39, 0x85, 0x74, 0x7a, 0x8d, 0x7d, 0x51, 0x41, 0x50, + 0x48, 0x44, 0x49, 0x51, 0x49, 0x3e, 0x4a, 0x61, 0x68, 0x5d, 0x4c, 0x00, + 0x48, 0xb9, 0x58, 0x0c, 0x16, 0x3e, 0x32, 0x24, 0x3a, 0x31, 0x2d, 0x5c, + 0x35, 0x28, 0x16, 0x12, 0x30, 0x76, 0xce, 0xff, 0xff, 0x90, 0x1f, 0x5f, + 0xb7, 0x80, 0x3a, 0x53, 0x52, 0x31, 0x22, 0x2c, 0x25, 0x0e, 0x12, 0x2b, + 0x45, 0xe5, 0xb7, 0x81, 0x85, 0x1e, 0x00, 0x43, 0x37, 0x39, 0x38, 0x2f, + 0x26, 0x25, 0x2d, 0x36, 0x2e, 0x38, 0x29, 0x21, 0x31, 0x35, 0x38, 0x4e, + 0x42, 0x48, 0x3a, 0x38, 0x4e, 0x48, 0x32, 0x34, 0x46, 0x39, 0x44, 0x74, + 0x84, 0x4f, 0x26, 0x33, 0x39, 0x42, 0x4c, 0x4e, 0x47, 0x3f, 0x3a, 0x38, + 0x45, 0x22, 0x11, 0x3a, 0x6d, 0x66, 0x3c, 0x25, 0x24, 0x69, 0xb6, 0xc2, + 0x89, 0x5f, 0x81, 0xc1, 0x89, 0x5d, 0x2a, 0x14, 0x21, 0x39, 0x47, 0x49, + 0xf0, 0xe4, 0x56, 0x53, 0xe4, 0xff, 0x8b, 0x00, 0x00, 0x0d, 0x2f, 0x23, + 0x12, 0x42, 0x4f, 0x0c, 0x35, 0x35, 0x34, 0x34, 0x35, 0x36, 0x37, 0x37, + 0x0f, 0x14, 0x34, 0x38, 0x28, 0x40, 0x3a, 0x00, 0x42, 0x5a, 0x6f, 0x6a, + 0x53, 0x44, 0x4b, 0x58, 0x86, 0x64, 0x4d, 0x50, 0x4f, 0x45, 0x4c, 0x5f, + 0x2b, 0x23, 0x28, 0x4e, 0x66, 0x49, 0x3f, 0x66, 0x37, 0x2f, 0x2d, 0x29, + 0x2e, 0x5c, 0x79, 0x57, 0x69, 0x68, 0x6b, 0x75, 0x7f, 0x7f, 0x76, 0x6c, + 0x72, 0x7e, 0x80, 0x73, 0x6b, 0x72, 0x7a, 0x7b, 0x72, 0x72, 0x71, 0x71, + 0x73, 0x76, 0x79, 0x7b, 0x75, 0x71, 0x6b, 0x64, 0x5f, 0x58, 0x52, 0x4e, + 0x5a, 0x5b, 0x5c, 0x5c, 0x5c, 0x5b, 0x5a, 0x59, 0x57, 0x3e, 0x4c, 0x4b, + 0x1f, 0x1b, 0x3e, 0x48, 0x21, 0x00, 0x00, 0x23, 0x50, 0x56, 0x45, 0x3a, + 0x69, 0x5b, 0x62, 0x76, 0x6b, 0x43, 0x2b, 0x2c, 0x00, 0x3d, 0x29, 0x3e, + 0xbb, 0xd3, 0x88, 0x77, 0xd8, 0xc2, 0x6f, 0x39, 0x61, 0x8a, 0x81, 0x76, + 0xa0, 0x7d, 0x51, 0x36, 0x33, 0x3e, 0x46, 0x49, 0xa6, 0xb6, 0x91, 0x45, + 0x27, 0x3d, 0x3b, 0x18, 0x2c, 0x45, 0x61, 0x69, 0x5c, 0x59, 0x76, 0x98, + 0x7c, 0x87, 0x6c, 0x59, 0x66, 0x53, 0x37, 0x42, 0x75, 0x1f, 0x1b, 0x22, + 0x00, 0x22, 0x97, 0xc4, 0x75, 0x38, 0x61, 0x50, 0x73, 0xa3, 0x52, 0x56, + 0x5c, 0x9a, 0xc3, 0x9f, 0x4f, 0x1c, 0x22, 0x3d, 0x00, 0x27, 0x87, 0x93, + 0x7f, 0x60, 0x0f, 0x00, 0x46, 0x6f, 0x61, 0x40, 0x42, 0x37, 0x25, 0x34, + 0x40, 0x36, 0x37, 0x50, 0x76, 0x90, 0x90, 0x86, 0x58, 0x53, 0x3c, 0x2e, + 0x4c, 0x6f, 0x5b, 0x29, 0x18, 0x46, 0x5f, 0x4a, 0x37, 0x5a, 0xa2, 0xd9, + 0x85, 0xfa, 0xff, 0x7a, 0x31, 0x63, 0x9a, 0xe0, 0x93, 0x49, 0x2c, 0x24, + 0x13, 0x32, 0x4c, 0x29, 0x55, 0x4d, 0x55, 0x7f, 0xb9, 0xe1, 0xe8, 0xdf, + 0xd1, 0xba, 0x5a, 0x2e, 0x56, 0x42, 0x19, 0x3a, 0x2b, 0x1a, 0x18, 0x19, + 0x03, 0x0b, 0x6e, 0xe5, 0xf9, 0xbc, 0x50, 0x4d, 0x52, 0x30, 0x47, 0x50, + 0x20, 0x2a, 0x33, 0x32, 0x2a, 0x26, 0x2c, 0x34, 0x0d, 0x38, 0x43, 0x3c, + 0x3f, 0x37, 0x41, 0x6c, 0x34, 0x41, 0x37, 0x34, 0x44, 0x3b, 0x28, 0x2e, + 0x3d, 0x34, 0x37, 0x50, 0x73, 0x84, 0x64, 0x30, 0x6a, 0x54, 0x40, 0x44, + 0x56, 0x5c, 0x4c, 0x38, 0x3d, 0x60, 0x64, 0x5e, 0x62, 0x4a, 0x32, 0x3f, + 0x51, 0x49, 0x30, 0x21, 0x39, 0x58, 0x48, 0x1e, 0x55, 0x26, 0x00, 0x0d, + 0x44, 0x6f, 0x70, 0x5d, 0x60, 0x9a, 0x55, 0x5a, 0x60, 0x2e, 0x69, 0x97, + 0x97, 0x5a, 0x55, 0x51, 0x23, 0x2f, 0x4d, 0x30, 0x1b, 0x3a, 0x67, 0x85, + 0x83, 0x60, 0x30, 0x0e, 0x26, 0x4e, 0x40, 0x29, 0x39, 0x33, 0x23, 0x36, + 0x46, 0x47, 0x3f, 0x2c, 0x1f, 0x2e, 0x54, 0x77, 0x4b, 0x39, 0x3b, 0x52, + 0x56, 0x3c, 0x28, 0x28, 0x14, 0x05, 0x54, 0xc6, 0xc9, 0x74, 0x30, 0x18, + 0x19, 0x17, 0x38, 0x84, 0x8c, 0x5d, 0x59, 0x63, 0x62, 0x5f, 0x61, 0x6d, + 0x7b, 0x7e, 0x73, 0x67, 0x7a, 0x88, 0x8a, 0x79, 0x6d, 0x70, 0x78, 0x7a, + 0x69, 0x6a, 0x6c, 0x6d, 0x6b, 0x67, 0x62, 0x5f, 0x71, 0x6d, 0x69, 0x6a, + 0x6e, 0x6f, 0x6c, 0x68, 0x5a, 0x5c, 0x5e, 0x5e, 0x5d, 0x59, 0x55, 0x53, + 0x58, 0x5b, 0x67, 0x45, 0x1d, 0x46, 0x64, 0x36, 0x35, 0x32, 0x2e, 0x2c, + 0x34, 0x45, 0x58, 0x65, 0x5c, 0x7d, 0x7c, 0x49, 0x1b, 0x18, 0x27, 0x2c, + 0x42, 0x81, 0xa2, 0xb8, 0xc0, 0x7e, 0x5d, 0x98, 0xd1, 0xe6, 0xaf, 0x68, + 0x6b, 0x7e, 0x71, 0x67, 0x74, 0x62, 0x52, 0x55, 0x6a, 0x81, 0x8e, 0x90, + 0xb1, 0xff, 0xe0, 0x45, 0x00, 0x26, 0x4d, 0x32, 0x2d, 0x32, 0x43, 0x51, + 0x46, 0x37, 0x49, 0x6a, 0x6b, 0x7c, 0x67, 0x57, 0x69, 0x67, 0x65, 0x84, + 0x87, 0x60, 0x4e, 0x42, 0x54, 0xb0, 0xe2, 0xb1, 0xdb, 0x9d, 0x9b, 0x81, + 0x9d, 0xcd, 0xaa, 0xb6, 0x86, 0xa7, 0xae, 0x83, 0x4d, 0x2e, 0x1d, 0x10, + 0x93, 0x8e, 0xa6, 0x7f, 0x6b, 0x66, 0x1d, 0x00, 0x55, 0x61, 0x49, 0x3b, + 0x48, 0x41, 0x56, 0x99, 0x83, 0x66, 0x4b, 0x4b, 0x5b, 0x5b, 0x41, 0x24, + 0x39, 0x34, 0x1e, 0x14, 0x38, 0x64, 0x59, 0x2b, 0x25, 0x3d, 0x2d, 0x19, + 0x59, 0xb5, 0xa6, 0x4f, 0x96, 0x96, 0x83, 0x70, 0x44, 0x4b, 0x7e, 0x63, + 0x62, 0x6c, 0x9d, 0x8f, 0x36, 0x1d, 0x3e, 0x3c, 0x03, 0x39, 0x6c, 0x6b, + 0x47, 0x35, 0x4e, 0x72, 0x0d, 0x1b, 0x18, 0x23, 0x51, 0x6a, 0x4d, 0x28, + 0x37, 0x49, 0x83, 0xb1, 0x84, 0x28, 0x10, 0x35, 0x3e, 0x19, 0x07, 0x49, + 0x57, 0x4a, 0x61, 0x35, 0x39, 0x35, 0x33, 0x37, 0x38, 0x2d, 0x15, 0x00, + 0x3b, 0x24, 0x40, 0x76, 0x90, 0x8d, 0x56, 0x04, 0x2e, 0x4b, 0x49, 0x37, + 0x2e, 0x22, 0x2a, 0x4d, 0x37, 0x18, 0x30, 0x43, 0x1e, 0x24, 0x6a, 0x99, + 0x28, 0x24, 0x27, 0x3b, 0x58, 0x6e, 0x74, 0x71, 0x54, 0x68, 0x37, 0x12, + 0x3e, 0x50, 0x25, 0x09, 0x39, 0x4c, 0x3b, 0x15, 0x25, 0x5e, 0x69, 0x47, + 0x1f, 0x2e, 0x39, 0x33, 0x26, 0x2a, 0x42, 0x5a, 0x32, 0x33, 0x2e, 0x4d, + 0x4e, 0x21, 0x2d, 0x5e, 0x50, 0x14, 0x2c, 0x49, 0x29, 0x3b, 0x4e, 0x18, + 0x16, 0x1f, 0x30, 0x44, 0x56, 0x64, 0x6d, 0x72, 0x6b, 0x44, 0x0f, 0x33, + 0x94, 0x97, 0x4e, 0x2b, 0x54, 0x48, 0x32, 0x19, 0x0d, 0x15, 0x2e, 0x43, + 0x00, 0x23, 0x59, 0x6c, 0x42, 0x09, 0x02, 0x1e, 0x25, 0x3c, 0x79, 0x8d, + 0x4f, 0x20, 0x3e, 0x6f, 0x83, 0xe2, 0xd4, 0x9a, 0x7f, 0x77, 0x7f, 0x72, + 0x6a, 0x64, 0x63, 0x6e, 0x7c, 0x7e, 0x70, 0x61, 0x70, 0x80, 0x83, 0x72, + 0x63, 0x66, 0x70, 0x74, 0x81, 0x81, 0x82, 0x80, 0x7c, 0x76, 0x70, 0x6c, + 0x7c, 0x77, 0x73, 0x76, 0x7d, 0x81, 0x7d, 0x77, 0x60, 0x62, 0x65, 0x66, + 0x64, 0x5f, 0x59, 0x55, 0x43, 0x40, 0x65, 0x5c, 0x1f, 0x24, 0x4a, 0x3c, + 0x1d, 0x06, 0x1a, 0x4b, 0x4a, 0x1d, 0x19, 0x3f, 0x41, 0x86, 0xad, 0x87, + 0x4f, 0x44, 0x5c, 0x71, 0x76, 0x71, 0x78, 0x8c, 0x83, 0x4e, 0x28, 0x2c, + 0x34, 0x86, 0x8b, 0x4d, 0x39, 0x3e, 0x37, 0x38, 0x65, 0x5f, 0x5e, 0x6d, + 0x83, 0x90, 0x8f, 0x88, 0x96, 0xa1, 0x8e, 0x75, 0x96, 0xd6, 0xdf, 0xba, + 0x8c, 0x61, 0x4b, 0x5d, 0x64, 0x4c, 0x36, 0x36, 0x1a, 0x2f, 0x2f, 0x46, + 0x76, 0x69, 0x36, 0x26, 0x25, 0x43, 0x7d, 0xa6, 0x9f, 0x81, 0x69, 0x5a, + 0x92, 0x58, 0x36, 0x3f, 0x71, 0x8d, 0x67, 0x41, 0x3d, 0x48, 0x43, 0x3e, + 0x66, 0xab, 0xd3, 0xd3, 0xc4, 0xae, 0xad, 0x78, 0x6f, 0x78, 0x2b, 0x00, + 0x7b, 0x75, 0x5b, 0x5a, 0x67, 0x55, 0x75, 0xd0, 0xb7, 0xcf, 0xd4, 0xa5, + 0x5b, 0x2d, 0x31, 0x49, 0x49, 0x3a, 0x43, 0x5c, 0x55, 0x34, 0x2d, 0x42, + 0x0f, 0x0e, 0x29, 0x69, 0xa3, 0xa2, 0x64, 0x26, 0x28, 0x42, 0xaf, 0xff, + 0x9e, 0x2a, 0x5f, 0x1e, 0x3a, 0x58, 0x34, 0x06, 0x12, 0x2a, 0x68, 0xcc, + 0xa7, 0x64, 0x1e, 0x11, 0x31, 0x46, 0x31, 0x10, 0x69, 0x19, 0x15, 0x36, + 0x2f, 0x48, 0x66, 0x4d, 0x87, 0x4d, 0x3e, 0x65, 0x65, 0x2e, 0x13, 0x26, + 0x2c, 0x57, 0x25, 0x19, 0x36, 0x45, 0x4e, 0x1f, 0x52, 0x43, 0x43, 0x61, + 0x86, 0x8b, 0x67, 0x40, 0x21, 0x02, 0x41, 0x59, 0x1d, 0x4b, 0xa8, 0x9f, + 0x35, 0x5f, 0x64, 0x41, 0x21, 0x13, 0x36, 0x76, 0x7f, 0x4b, 0x3d, 0x28, + 0x0d, 0x4c, 0x88, 0x67, 0x4c, 0x68, 0x7d, 0x70, 0x4d, 0x37, 0x3f, 0x52, + 0x2e, 0x1f, 0x05, 0x2e, 0x71, 0x6b, 0x77, 0xcd, 0x5f, 0x28, 0x1b, 0x45, + 0x51, 0x2f, 0x27, 0x44, 0x46, 0x3b, 0x2b, 0x20, 0x1c, 0x1d, 0x1e, 0x1f, + 0x21, 0x24, 0x73, 0x67, 0x51, 0x55, 0x31, 0x54, 0x32, 0x10, 0x23, 0x1e, + 0x0e, 0x61, 0x87, 0x28, 0x4c, 0x3d, 0x28, 0x19, 0x19, 0x29, 0x3e, 0x4d, + 0x69, 0x31, 0x63, 0xe2, 0xff, 0xff, 0xb1, 0x41, 0x19, 0x1c, 0x22, 0x2a, + 0x32, 0x38, 0x3b, 0x3c, 0x72, 0x4a, 0x37, 0x4b, 0x5a, 0x48, 0x2c, 0x20, + 0x37, 0x47, 0x5b, 0x7d, 0x91, 0x74, 0x5e, 0x70, 0x9b, 0x78, 0x65, 0x9a, + 0xa6, 0x8b, 0x8f, 0x74, 0x79, 0x71, 0x6d, 0x76, 0x83, 0x82, 0x72, 0x61, + 0x77, 0x89, 0x8e, 0x7d, 0x6f, 0x72, 0x7d, 0x83, 0x80, 0x7f, 0x7e, 0x7c, + 0x79, 0x76, 0x74, 0x73, 0x71, 0x6b, 0x67, 0x6b, 0x74, 0x78, 0x73, 0x6d, + 0x61, 0x65, 0x69, 0x6d, 0x6c, 0x69, 0x63, 0x60, 0x5d, 0x49, 0x51, 0x3a, + 0x18, 0x4a, 0x76, 0x4e, 0x21, 0x49, 0x46, 0x28, 0x4e, 0xa0, 0xa7, 0x6d, + 0x56, 0x42, 0x3e, 0x50, 0x58, 0x5b, 0x77, 0x9d, 0x61, 0x76, 0x8a, 0x72, + 0x4c, 0x50, 0x51, 0x30, 0x00, 0x53, 0x74, 0x41, 0x3a, 0x66, 0x99, 0xc6, + 0xa6, 0x84, 0x5b, 0x4c, 0x5e, 0x84, 0xa6, 0xb9, 0x67, 0x4b, 0x77, 0xdf, + 0xff, 0xdd, 0xd4, 0xfb, 0xbc, 0x6e, 0x41, 0x65, 0x90, 0x82, 0x55, 0x39, + 0x70, 0x8f, 0x7e, 0x55, 0x3c, 0x16, 0x08, 0x29, 0x3a, 0x56, 0x69, 0x65, + 0x41, 0x0d, 0x10, 0x45, 0x95, 0x88, 0x5a, 0x3c, 0x25, 0x21, 0x44, 0x52, + 0x81, 0x7d, 0x58, 0x2c, 0x33, 0x64, 0x7b, 0x6e, 0x2d, 0x3d, 0x69, 0x54, + 0x5c, 0x71, 0x2c, 0x00, 0x47, 0x36, 0x3e, 0x5b, 0x58, 0x36, 0x29, 0x37, + 0x88, 0xfb, 0x9b, 0x00, 0x00, 0x37, 0x39, 0x51, 0x00, 0x47, 0xb1, 0xf4, + 0xf1, 0xd0, 0xc6, 0xd2, 0xdd, 0x5b, 0x00, 0x12, 0x2f, 0x1d, 0x16, 0x2e, + 0x22, 0x1f, 0x46, 0x6d, 0x46, 0x04, 0x1c, 0x6f, 0x60, 0x5b, 0x31, 0x05, + 0x25, 0x8c, 0xe2, 0xff, 0x87, 0x5f, 0x82, 0xdf, 0xe3, 0x79, 0x26, 0x1f, + 0x5b, 0x30, 0x18, 0x24, 0x2b, 0x23, 0x2e, 0x4a, 0x71, 0x51, 0x27, 0x0e, + 0x0f, 0x20, 0x31, 0x3b, 0x2e, 0x43, 0x48, 0x2e, 0x24, 0x49, 0x5f, 0x4d, + 0x2d, 0x24, 0x49, 0x4e, 0x60, 0x73, 0x5c, 0x74, 0x37, 0x39, 0x8b, 0xd3, + 0xbe, 0x99, 0x74, 0x3c, 0x62, 0x86, 0xac, 0x66, 0x43, 0x67, 0x5c, 0x66, + 0x23, 0x2a, 0x2e, 0x2b, 0x28, 0x34, 0x4f, 0x65, 0x7e, 0x62, 0x57, 0x5b, + 0x48, 0x2d, 0x3f, 0x6a, 0x0d, 0x03, 0x12, 0x37, 0x4b, 0x40, 0x34, 0x36, + 0x00, 0x86, 0x9e, 0x5d, 0x53, 0x29, 0x23, 0x85, 0x46, 0x48, 0x69, 0x95, + 0x92, 0x5e, 0x37, 0x32, 0x36, 0x1d, 0x14, 0x22, 0x29, 0x32, 0x61, 0x9b, + 0xd1, 0xac, 0x59, 0x7d, 0xe0, 0xff, 0xc0, 0x23, 0x13, 0x4a, 0x13, 0x8d, + 0xfb, 0xf2, 0xed, 0x4e, 0x00, 0x20, 0x9d, 0xff, 0xee, 0xa3, 0x5d, 0x1e, + 0x15, 0x43, 0x76, 0x89, 0x7b, 0x6a, 0x67, 0x6e, 0x8c, 0x85, 0x40, 0x29, + 0x68, 0x75, 0x4d, 0x4c, 0xaf, 0x44, 0x33, 0x72, 0x70, 0x4d, 0x4b, 0x4f, + 0x5e, 0x30, 0x6c, 0x96, 0x70, 0x6f, 0x83, 0x82, 0x62, 0x64, 0x6b, 0x75, + 0x7e, 0x7d, 0x74, 0x6a, 0x7c, 0x82, 0x87, 0x82, 0x78, 0x74, 0x78, 0x7e, + 0x6d, 0x6d, 0x6d, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x77, 0x7b, 0x7c, 0x76, + 0x6d, 0x6b, 0x72, 0x7a, 0x76, 0x72, 0x6f, 0x70, 0x72, 0x6e, 0x65, 0x5c, + 0x4e, 0x54, 0x3f, 0x25, 0x45, 0x83, 0x7b, 0x3c, 0x38, 0x4b, 0x9a, 0xab, + 0x91, 0x75, 0x63, 0x96, 0x84, 0x6c, 0x69, 0x8e, 0x7a, 0x83, 0xcb, 0xbd, + 0x7a, 0x5b, 0xd9, 0xfc, 0x43, 0x00, 0x4e, 0x52, 0x26, 0x30, 0x3f, 0x4d, + 0x56, 0x57, 0x54, 0x50, 0x28, 0x19, 0x3a, 0x6d, 0x5a, 0x22, 0x36, 0x80, + 0x97, 0x61, 0x90, 0xd6, 0x9b, 0x45, 0x5d, 0xa5, 0xb2, 0x91, 0x6c, 0x5e, + 0x66, 0x6e, 0x68, 0x5e, 0x4e, 0x5b, 0x52, 0x37, 0x30, 0x3e, 0x3d, 0x2b, + 0x53, 0x59, 0x2d, 0x04, 0x19, 0x40, 0x67, 0x92, 0xb0, 0x86, 0x6b, 0x4a, + 0x33, 0x5e, 0x6a, 0x28, 0x2e, 0x42, 0x5a, 0x66, 0x66, 0x65, 0x6b, 0x72, + 0x6d, 0x5b, 0x50, 0x5d, 0x6b, 0x5a, 0x25, 0x00, 0x49, 0x46, 0x2e, 0x1a, + 0x34, 0x62, 0x64, 0x44, 0x15, 0x5c, 0x48, 0x14, 0x21, 0x32, 0x5e, 0xba, + 0xf1, 0xf3, 0xe2, 0xac, 0x63, 0x38, 0x44, 0x63, 0x45, 0x10, 0x08, 0x35, + 0x3b, 0x0a, 0x00, 0x10, 0x5d, 0x23, 0x25, 0x81, 0xca, 0xb1, 0x63, 0x2f, + 0x21, 0x34, 0x31, 0x1e, 0x32, 0x68, 0x87, 0x83, 0x4c, 0x30, 0x37, 0x59, + 0x4b, 0x15, 0x08, 0x26, 0x76, 0x3a, 0x2a, 0x4f, 0x4d, 0x28, 0x40, 0x85, + 0x34, 0x53, 0x68, 0x57, 0x30, 0x21, 0x39, 0x5a, 0x6c, 0x57, 0x72, 0x6d, + 0x41, 0x62, 0x77, 0x32, 0x62, 0x55, 0xae, 0x8f, 0x3b, 0x78, 0x9f, 0x72, + 0x42, 0x75, 0xab, 0x8a, 0x43, 0x4b, 0x64, 0x46, 0x39, 0x7c, 0xaa, 0xa1, + 0x67, 0x3d, 0x4b, 0x5f, 0x62, 0x5b, 0x49, 0x31, 0x22, 0x29, 0x43, 0x5b, + 0x9e, 0x89, 0x74, 0x64, 0x53, 0x53, 0x72, 0x99, 0x7c, 0x94, 0x5d, 0x09, + 0x2f, 0xa7, 0xba, 0x6c, 0xb2, 0xed, 0xbe, 0x3b, 0x18, 0x56, 0x69, 0x40, + 0x6a, 0x86, 0xa6, 0xb7, 0xb3, 0x9d, 0x78, 0x59, 0x83, 0x4f, 0x22, 0x37, + 0x89, 0xd3, 0xe2, 0xcd, 0xd1, 0xe0, 0xd6, 0xf9, 0xed, 0xb9, 0xc2, 0xb8, + 0xfd, 0xf9, 0x7b, 0x6c, 0xb5, 0x9b, 0x7b, 0x7f, 0x92, 0x93, 0x68, 0x5b, + 0x8b, 0x99, 0x85, 0x8d, 0x78, 0x76, 0x79, 0x7c, 0x70, 0x66, 0x74, 0x8d, + 0x2e, 0x37, 0x3c, 0x5e, 0x8c, 0x84, 0x62, 0x5c, 0x80, 0x61, 0x54, 0x73, + 0x5f, 0x29, 0x28, 0x2b, 0x27, 0x30, 0x39, 0x34, 0x44, 0x68, 0x6f, 0x5d, + 0x6d, 0x6b, 0x6b, 0x71, 0x79, 0x7d, 0x79, 0x74, 0x75, 0x7a, 0x7e, 0x7a, + 0x72, 0x6e, 0x71, 0x77, 0x6b, 0x71, 0x7a, 0x80, 0x7f, 0x77, 0x6d, 0x65, + 0x69, 0x6b, 0x6c, 0x6c, 0x6c, 0x6f, 0x76, 0x7c, 0x6f, 0x6b, 0x68, 0x68, + 0x6a, 0x66, 0x5c, 0x54, 0x64, 0x5f, 0x82, 0x90, 0x64, 0x48, 0x4d, 0x49, + 0x2d, 0x3b, 0x62, 0x4b, 0x46, 0x50, 0x18, 0x00, 0x00, 0x29, 0x2f, 0x3e, + 0x4a, 0x6a, 0x85, 0x43, 0x3c, 0x90, 0xfb, 0xeb, 0x70, 0x31, 0x2f, 0x19, + 0x43, 0x42, 0x41, 0x44, 0x4b, 0x56, 0x61, 0x68, 0xa0, 0x93, 0x81, 0x6b, + 0x53, 0x44, 0x49, 0x57, 0x74, 0x2e, 0x52, 0xa9, 0x91, 0x4a, 0x49, 0x6d, + 0x75, 0x5a, 0x37, 0x22, 0x23, 0x31, 0x3f, 0x47, 0x35, 0x3f, 0x45, 0x48, + 0x54, 0x69, 0x76, 0x76, 0x84, 0x68, 0x3f, 0x40, 0x5f, 0x66, 0x80, 0xbd, + 0x5d, 0x3f, 0x43, 0x4b, 0x28, 0x0c, 0x1e, 0x39, 0x6c, 0x83, 0x6f, 0x7e, + 0xba, 0x9e, 0x4c, 0x38, 0x84, 0x6b, 0x54, 0x53, 0x5b, 0x4c, 0x23, 0x00, + 0x45, 0x48, 0x3e, 0x3b, 0x5a, 0x72, 0x4b, 0x09, 0x44, 0x3b, 0x33, 0x38, + 0x3e, 0x45, 0x78, 0xc0, 0xd8, 0xbf, 0x92, 0x61, 0x40, 0x34, 0x30, 0x2e, + 0x58, 0x24, 0x13, 0x33, 0x41, 0x35, 0x48, 0x75, 0xa4, 0x86, 0x75, 0x84, + 0x95, 0x89, 0x66, 0x4b, 0x64, 0x76, 0x77, 0x63, 0x58, 0x57, 0x47, 0x2c, + 0x7f, 0x7e, 0x72, 0x54, 0x2f, 0x21, 0x38, 0x58, 0xb3, 0x8f, 0xab, 0xe8, + 0xc2, 0x55, 0x41, 0x81, 0x3b, 0x38, 0x48, 0x77, 0xaa, 0xbc, 0xa5, 0x86, + 0x3e, 0x76, 0xb6, 0xb4, 0x81, 0x6b, 0x66, 0x4f, 0x52, 0x94, 0xc6, 0x65, + 0x36, 0x88, 0xa6, 0x9d, 0x61, 0x41, 0x50, 0x61, 0x31, 0x0c, 0x28, 0x4e, + 0x4a, 0x5b, 0x4f, 0x80, 0x6f, 0x2c, 0x42, 0x45, 0x5b, 0x51, 0x3d, 0x29, + 0x21, 0x2d, 0x49, 0x5f, 0x64, 0x75, 0x73, 0x56, 0x3a, 0x30, 0x2b, 0x23, + 0x51, 0x92, 0xb1, 0x8d, 0x6d, 0x78, 0x85, 0x7e, 0x5a, 0x60, 0x7e, 0x62, + 0x51, 0xbe, 0xdf, 0x62, 0x58, 0x6b, 0x62, 0x40, 0x3e, 0x5b, 0x62, 0x4d, + 0x65, 0x78, 0x7e, 0x81, 0xa7, 0xd4, 0xcb, 0xa1, 0xd0, 0xb3, 0x46, 0x38, + 0x91, 0xe9, 0xe3, 0x67, 0xac, 0xde, 0xf1, 0xc2, 0x9b, 0x5b, 0x4f, 0xd3, + 0xb1, 0x98, 0x3c, 0x12, 0x63, 0xb0, 0xb7, 0xb3, 0xea, 0xa3, 0x7b, 0xa3, + 0xdb, 0xe9, 0xe0, 0xdd, 0x65, 0x2c, 0x22, 0x39, 0x34, 0x36, 0x5b, 0x7a, + 0x25, 0x25, 0x43, 0x55, 0x54, 0x59, 0x61, 0x69, 0x4b, 0x53, 0x6c, 0xa3, + 0xa5, 0x69, 0x65, 0x94, 0x71, 0x6b, 0x66, 0x69, 0x70, 0x76, 0x77, 0x75, + 0x7f, 0x83, 0x85, 0x83, 0x7d, 0x7b, 0x7d, 0x81, 0x82, 0x86, 0x8b, 0x8b, + 0x83, 0x75, 0x66, 0x5c, 0x76, 0x71, 0x6c, 0x6a, 0x6d, 0x70, 0x70, 0x6f, + 0x69, 0x65, 0x61, 0x61, 0x62, 0x5e, 0x54, 0x4b, 0x44, 0x55, 0x5f, 0x48, + 0x26, 0x2a, 0x46, 0x55, 0x1b, 0x2e, 0x4d, 0x21, 0x12, 0x3d, 0x4c, 0x6b, + 0xa9, 0xd8, 0xbd, 0x98, 0x4d, 0x00, 0x0c, 0x2e, 0x64, 0x57, 0x2e, 0x30, + 0x54, 0x40, 0x37, 0x70, 0x75, 0x68, 0x54, 0x42, 0x39, 0x39, 0x40, 0x45, + 0x6a, 0x6a, 0x3a, 0x00, 0x07, 0x53, 0x7c, 0x6f, 0x69, 0x46, 0x46, 0x3c, + 0x0e, 0x16, 0x5c, 0x8a, 0x52, 0x4d, 0x43, 0x3c, 0x44, 0x61, 0x8b, 0xaa, + 0x26, 0x1c, 0x1a, 0x25, 0x32, 0x3e, 0x53, 0x67, 0x41, 0x5d, 0x98, 0xf1, + 0xff, 0xa7, 0x33, 0x16, 0x58, 0x78, 0xb2, 0xe5, 0xc7, 0x5d, 0x2c, 0x51, + 0xd5, 0xf3, 0xc2, 0xc3, 0xff, 0xcd, 0x41, 0x1d, 0x2d, 0x22, 0x20, 0x32, + 0x49, 0x48, 0x2d, 0x10, 0x2c, 0x03, 0x00, 0x1c, 0x3d, 0x43, 0x4e, 0x66, + 0x68, 0x44, 0x45, 0x68, 0x8c, 0xac, 0xa7, 0x7c, 0x9b, 0x88, 0x6f, 0x6e, + 0x8f, 0xa2, 0x7e, 0x48, 0x67, 0x2d, 0x14, 0x3e, 0x6c, 0x72, 0x6c, 0x71, + 0x39, 0x70, 0x8a, 0x59, 0x16, 0x10, 0x4d, 0x8c, 0x56, 0x57, 0x51, 0x48, + 0x49, 0x55, 0x5d, 0x5c, 0x37, 0x58, 0x5d, 0x3d, 0x2c, 0x3c, 0x44, 0x38, + 0x6d, 0x74, 0xa3, 0xc8, 0x91, 0x2b, 0x0f, 0x39, 0x59, 0x4d, 0x45, 0x4b, + 0x56, 0x51, 0x38, 0x20, 0x5f, 0x8a, 0x57, 0x58, 0xc3, 0xbb, 0x6d, 0x7a, + 0xa3, 0x9b, 0x63, 0x00, 0x25, 0x82, 0x5c, 0x2d, 0x33, 0x3c, 0x3d, 0x2c, + 0x2c, 0x5a, 0x8e, 0xa1, 0xff, 0xcd, 0x70, 0x63, 0x4f, 0x27, 0x3a, 0x48, + 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x3a, 0x44, 0x4b, 0x60, 0x71, 0x5d, 0x2b, + 0x1e, 0x45, 0x67, 0x6b, 0x7d, 0x5e, 0x6b, 0x97, 0x87, 0x49, 0x3e, 0x68, + 0x85, 0x40, 0x5c, 0x76, 0x49, 0x6b, 0xad, 0x95, 0x69, 0x64, 0x49, 0x27, + 0x26, 0x47, 0x61, 0x65, 0x53, 0x87, 0xa7, 0x8f, 0x66, 0x54, 0x51, 0x4e, + 0x81, 0x4d, 0x00, 0x1b, 0x65, 0x7e, 0x75, 0x2a, 0x58, 0x52, 0x8d, 0x8c, + 0x5c, 0x67, 0x9b, 0xd7, 0xff, 0xc8, 0x87, 0x6c, 0x78, 0xc1, 0xe7, 0xbe, + 0x6d, 0xa1, 0xe2, 0xe6, 0x93, 0x50, 0x80, 0xe2, 0xdd, 0x59, 0x42, 0x8a, + 0xa1, 0x99, 0x85, 0x56, 0x3f, 0x20, 0x58, 0x57, 0x3c, 0x47, 0x4b, 0x73, + 0xd1, 0xfa, 0xf6, 0xc6, 0x8a, 0x79, 0x85, 0x6e, 0x80, 0x7c, 0x79, 0x7c, + 0x83, 0x87, 0x85, 0x81, 0x79, 0x7a, 0x7b, 0x7a, 0x78, 0x77, 0x78, 0x79, + 0x81, 0x7f, 0x7b, 0x79, 0x78, 0x7a, 0x7d, 0x7f, 0x84, 0x7a, 0x70, 0x6f, + 0x74, 0x77, 0x73, 0x6d, 0x69, 0x65, 0x60, 0x60, 0x60, 0x5b, 0x51, 0x48, + 0x41, 0x4c, 0x31, 0x31, 0x56, 0x42, 0x1d, 0x2d, 0x5f, 0x21, 0x1b, 0x1f, + 0x40, 0x68, 0x73, 0xa4, 0xf4, 0xf8, 0xbe, 0xce, 0xda, 0x9c, 0xb0, 0xf4, + 0xff, 0xa3, 0x22, 0x13, 0x4e, 0x44, 0x45, 0x93, 0x9b, 0x7d, 0x50, 0x2c, + 0x23, 0x36, 0x56, 0x6e, 0x1c, 0x54, 0x6a, 0x53, 0x58, 0x79, 0x6b, 0x38, + 0x31, 0x46, 0x4d, 0x1c, 0x00, 0x39, 0x6d, 0x52, 0x16, 0x29, 0x3b, 0x3f, + 0x3e, 0x4d, 0x6e, 0x8b, 0x93, 0x7d, 0x71, 0x72, 0x6b, 0x5d, 0x60, 0x70, + 0x42, 0x77, 0xa6, 0xda, 0xff, 0xd9, 0x6f, 0x2d, 0x48, 0x5c, 0x4e, 0x4c, + 0x61, 0x51, 0x60, 0xac, 0xeb, 0xdf, 0xa1, 0x86, 0xa6, 0x95, 0x65, 0x61, + 0x3e, 0x3f, 0x48, 0x5a, 0x64, 0x54, 0x2e, 0x0d, 0x5f, 0x4d, 0x4c, 0x57, + 0x4d, 0x3f, 0x5f, 0x94, 0x75, 0x54, 0x6a, 0xa3, 0xb6, 0x9a, 0x54, 0x07, + 0x09, 0x15, 0x0e, 0x03, 0x21, 0x57, 0x65, 0x4f, 0x51, 0x2d, 0x1f, 0x3b, + 0x5a, 0x5b, 0x4c, 0x43, 0x3f, 0x74, 0xa1, 0x9d, 0x7d, 0x66, 0x5e, 0x5c, + 0x7d, 0x68, 0x51, 0x43, 0x3d, 0x3e, 0x4c, 0x5c, 0x65, 0x80, 0x7b, 0x5c, + 0x5f, 0x76, 0x5b, 0x21, 0x31, 0x4e, 0x60, 0x4b, 0x2b, 0x28, 0x4a, 0x6e, + 0x90, 0x80, 0x64, 0x45, 0x31, 0x32, 0x42, 0x51, 0xaf, 0xcf, 0x94, 0x8f, + 0xe9, 0xcf, 0x83, 0xa1, 0xa4, 0x76, 0xb6, 0xaf, 0x81, 0xb7, 0xb7, 0x73, + 0x56, 0x88, 0x95, 0x6b, 0x41, 0x3f, 0x60, 0x85, 0x80, 0x41, 0x33, 0x43, + 0x78, 0x95, 0x65, 0x4e, 0x71, 0x62, 0x4d, 0x3c, 0x35, 0x37, 0x3c, 0x3f, + 0x53, 0x7f, 0x90, 0x75, 0x64, 0x6a, 0x61, 0x46, 0x71, 0x78, 0x79, 0x6c, + 0x5a, 0x4d, 0x4a, 0x4c, 0x55, 0x28, 0x3d, 0x6a, 0x46, 0x0b, 0x15, 0x40, + 0x6f, 0x63, 0x66, 0x78, 0x78, 0x68, 0x66, 0x73, 0x5c, 0x3f, 0x2b, 0x2e, + 0x31, 0x34, 0x49, 0x67, 0x99, 0xc0, 0xb1, 0xa5, 0x70, 0x30, 0x30, 0x16, + 0x13, 0x09, 0x09, 0x16, 0x14, 0x5e, 0xca, 0xc5, 0x40, 0x1d, 0x3e, 0x71, + 0x6e, 0x6a, 0x66, 0x45, 0x3f, 0x30, 0x3d, 0x61, 0x68, 0x44, 0x22, 0x1a, + 0x06, 0x00, 0x62, 0xb2, 0x78, 0x42, 0x5b, 0x74, 0x9f, 0x77, 0x4d, 0x32, + 0x2c, 0x2e, 0x35, 0x4b, 0x1d, 0x16, 0x2b, 0x59, 0x6f, 0x74, 0x78, 0x73, + 0x6b, 0x6a, 0x6e, 0x75, 0x7c, 0x7a, 0x70, 0x67, 0x79, 0x78, 0x77, 0x78, + 0x7a, 0x7b, 0x7a, 0x79, 0x84, 0x7d, 0x74, 0x6d, 0x6e, 0x74, 0x7e, 0x84, + 0x78, 0x70, 0x6a, 0x6d, 0x76, 0x7d, 0x7d, 0x79, 0x6f, 0x6a, 0x65, 0x64, + 0x64, 0x5e, 0x53, 0x4a, 0x34, 0x3e, 0x2c, 0x3d, 0x74, 0x70, 0x5c, 0x7a, + 0x73, 0x3f, 0x45, 0x47, 0x52, 0x53, 0x34, 0x4a, 0xb4, 0xd9, 0xa2, 0x9f, + 0xc3, 0xb1, 0xaf, 0xb2, 0xb3, 0xb7, 0xae, 0x84, 0x50, 0x38, 0x2c, 0x1a, + 0x1d, 0x26, 0x34, 0x44, 0x53, 0x5e, 0x64, 0x67, 0x34, 0x58, 0x72, 0x69, + 0x5d, 0x67, 0x7c, 0x8a, 0x78, 0x5a, 0x62, 0x89, 0xbc, 0xf2, 0xd8, 0x7b, + 0x54, 0x71, 0x8f, 0x90, 0x76, 0x59, 0x4c, 0x4c, 0x54, 0x61, 0x77, 0x87, + 0x80, 0x64, 0x44, 0x31, 0x3e, 0xa6, 0xca, 0xbc, 0xea, 0xff, 0xa9, 0x36, + 0x48, 0x63, 0x5a, 0x57, 0x62, 0x4a, 0x58, 0xa5, 0x76, 0x5e, 0x85, 0xb7, + 0xbc, 0xbd, 0x9f, 0x55, 0x4c, 0x4a, 0x4b, 0x4f, 0x4f, 0x41, 0x28, 0x14, + 0xdb, 0xff, 0xff, 0xd4, 0x9a, 0x8e, 0x93, 0x90, 0x21, 0x08, 0x21, 0x72, + 0x90, 0x5f, 0x53, 0x86, 0x67, 0xa3, 0xa8, 0x5b, 0x1d, 0x28, 0x46, 0x4c, + 0x70, 0x80, 0x91, 0x91, 0x7d, 0x69, 0x67, 0x70, 0x92, 0x98, 0xb2, 0xd5, + 0xdb, 0xb1, 0x74, 0x4a, 0x4a, 0x3b, 0x3e, 0x55, 0x61, 0x62, 0x71, 0x8a, + 0x56, 0x5b, 0x46, 0x2d, 0x3f, 0x60, 0x4e, 0x1c, 0x16, 0x3e, 0x45, 0x1d, + 0x0c, 0x2b, 0x4b, 0x4f, 0x49, 0x48, 0x45, 0x47, 0x5c, 0x8d, 0xce, 0xfc, + 0xcc, 0xcf, 0xdd, 0xb9, 0x5b, 0x2d, 0x55, 0x87, 0x84, 0x5b, 0x84, 0x6c, + 0x2a, 0x33, 0x52, 0x7b, 0x69, 0x4c, 0x27, 0x24, 0x2d, 0x21, 0x48, 0x9f, + 0x28, 0x3e, 0x91, 0x9c, 0xa8, 0xa9, 0x4f, 0x2d, 0x31, 0x45, 0x68, 0x8b, + 0x9c, 0x91, 0x73, 0x5a, 0x97, 0x99, 0x81, 0x52, 0x2f, 0x2b, 0x33, 0x35, + 0x21, 0x5e, 0x8b, 0x7c, 0x53, 0x37, 0x28, 0x1f, 0x41, 0x40, 0x24, 0x21, + 0x39, 0x2e, 0x29, 0x50, 0x50, 0x36, 0x35, 0x50, 0x52, 0x3c, 0x3f, 0x5b, + 0xa5, 0x6f, 0x4c, 0x53, 0x57, 0x4c, 0x59, 0x78, 0xaa, 0xa2, 0x30, 0x00, + 0x06, 0x5f, 0xa7, 0x7a, 0x44, 0x74, 0x5a, 0x4d, 0x63, 0x89, 0xc0, 0xc0, + 0x75, 0x70, 0x51, 0x4d, 0x58, 0x38, 0x38, 0x7a, 0x58, 0x5c, 0x61, 0x6a, + 0x73, 0x74, 0x66, 0x55, 0x88, 0x4d, 0x47, 0x67, 0x5f, 0x40, 0x2b, 0x1c, + 0x1d, 0x24, 0x34, 0xe0, 0xff, 0xa0, 0x8e, 0xc3, 0xff, 0xde, 0xae, 0x72, + 0x70, 0x7f, 0x66, 0x6b, 0x6c, 0x6e, 0x73, 0x7c, 0x81, 0x7d, 0x71, 0x66, + 0x81, 0x7d, 0x7b, 0x7d, 0x83, 0x85, 0x83, 0x7f, 0x85, 0x83, 0x7e, 0x78, + 0x72, 0x6e, 0x6a, 0x69, 0x73, 0x6f, 0x6a, 0x6a, 0x6e, 0x71, 0x72, 0x72, + 0x74, 0x6f, 0x69, 0x68, 0x66, 0x60, 0x55, 0x4b, 0x3e, 0x41, 0x4d, 0x47, + 0x2e, 0x32, 0x5a, 0x7e, 0x5f, 0x73, 0x92, 0x61, 0x49, 0x68, 0x6a, 0x82, + 0x5a, 0x6d, 0x5e, 0x87, 0x9a, 0x83, 0xb0, 0xdb, 0x6d, 0x61, 0xa5, 0xc2, + 0x75, 0x4f, 0x53, 0x2e, 0x08, 0x23, 0x4c, 0x6f, 0x7e, 0x77, 0x64, 0x54, + 0x2b, 0x47, 0x70, 0x80, 0x59, 0x24, 0x1c, 0x35, 0x47, 0x0d, 0x3f, 0xbc, + 0xee, 0xd8, 0xb2, 0x8d, 0x3b, 0x5a, 0x7f, 0x8e, 0x7c, 0x53, 0x29, 0x11, + 0x05, 0x47, 0x87, 0xa4, 0xb1, 0xab, 0x7d, 0x46, 0x54, 0xb5, 0xb2, 0x70, + 0x8d, 0xc6, 0x93, 0x32, 0x33, 0x3e, 0x55, 0x6f, 0x60, 0x3d, 0x72, 0xe3, + 0xd2, 0x68, 0x60, 0x80, 0x7c, 0xb5, 0xd1, 0x81, 0x4c, 0x46, 0x3e, 0x35, + 0x2e, 0x28, 0x21, 0x1d, 0x7c, 0x8b, 0x6f, 0x2c, 0x0b, 0x27, 0x4e, 0x5c, + 0x56, 0x60, 0x4b, 0x5d, 0x7f, 0x4d, 0x3b, 0x8e, 0x7a, 0xca, 0xe3, 0x9d, + 0x65, 0x70, 0x82, 0x76, 0x69, 0x9f, 0xd6, 0xe2, 0xc4, 0x97, 0x6f, 0x59, + 0x4d, 0x4f, 0x71, 0x9a, 0x8f, 0x68, 0x71, 0x9e, 0x6d, 0x50, 0x48, 0x56, + 0x4e, 0x30, 0x2d, 0x44, 0x3d, 0x46, 0x44, 0x3f, 0x4d, 0x67, 0x70, 0x66, + 0x62, 0x74, 0x7c, 0x73, 0x6b, 0x6b, 0x63, 0x56, 0x65, 0x7c, 0x80, 0x53, + 0x13, 0x00, 0x14, 0x3d, 0x39, 0x04, 0x21, 0x3a, 0x0e, 0x30, 0x98, 0xc2, + 0x45, 0x39, 0x62, 0x9c, 0xe7, 0xd1, 0x5d, 0x48, 0x56, 0x85, 0x7e, 0x7a, + 0xb6, 0xc7, 0x84, 0x4b, 0x73, 0xaf, 0xda, 0xa3, 0x4d, 0x28, 0x33, 0x55, + 0x8d, 0x7d, 0x6c, 0x68, 0x6e, 0x73, 0x6f, 0x68, 0x57, 0x60, 0x75, 0x84, + 0x79, 0x61, 0x5d, 0x6a, 0x71, 0x2f, 0x12, 0x36, 0x4e, 0x33, 0x19, 0x1b, + 0x7a, 0xa5, 0x99, 0x7c, 0x87, 0x7b, 0x47, 0x2a, 0x53, 0x3d, 0x26, 0x1d, + 0x20, 0x30, 0x4b, 0x63, 0x27, 0x34, 0x42, 0x40, 0x30, 0x2d, 0x48, 0x6a, + 0x20, 0x28, 0x30, 0x97, 0xe7, 0xf5, 0xff, 0xfb, 0xb6, 0x7e, 0x67, 0x42, + 0x50, 0x6b, 0x3f, 0x34, 0x20, 0x44, 0x41, 0x3d, 0x4c, 0x39, 0x2f, 0x57, + 0x3d, 0x6f, 0x79, 0x44, 0x1c, 0x25, 0x2f, 0x24, 0x4f, 0x52, 0x46, 0x4b, + 0x63, 0x5f, 0x5a, 0x6e, 0x8f, 0xab, 0x84, 0x5d, 0x4b, 0x6f, 0xd1, 0xf2, + 0xee, 0xd7, 0xde, 0x87, 0x57, 0x75, 0x70, 0x96, 0x70, 0x6e, 0x6e, 0x73, + 0x78, 0x77, 0x6f, 0x67, 0x77, 0x71, 0x6e, 0x72, 0x7a, 0x7e, 0x7a, 0x75, + 0x6a, 0x70, 0x79, 0x80, 0x82, 0x7e, 0x77, 0x72, 0x77, 0x77, 0x74, 0x6f, + 0x69, 0x67, 0x6a, 0x6e, 0x73, 0x6e, 0x69, 0x66, 0x65, 0x5e, 0x52, 0x48, + 0x57, 0x47, 0x78, 0xa9, 0x88, 0x5e, 0x66, 0x75, 0x80, 0x6f, 0x6d, 0x41, + 0x4f, 0x8f, 0x9a, 0xab, 0x8d, 0x41, 0x23, 0x73, 0x6c, 0x23, 0x35, 0x4b, + 0x72, 0x29, 0x54, 0x95, 0x5a, 0x1d, 0x1f, 0x19, 0x37, 0x2e, 0x22, 0x19, + 0x18, 0x1e, 0x28, 0x2f, 0x2b, 0x29, 0x35, 0x45, 0x43, 0x3e, 0x5a, 0x83, + 0x0b, 0x15, 0x79, 0xda, 0xc4, 0x81, 0x5e, 0x4c, 0x17, 0x2c, 0x4f, 0x6f, + 0x79, 0x63, 0x39, 0x18, 0x44, 0x8e, 0xb1, 0x9d, 0xaa, 0xd5, 0xc4, 0x85, + 0x34, 0x6b, 0x6b, 0x51, 0x66, 0x76, 0x5a, 0x3d, 0x38, 0x3a, 0x60, 0x70, + 0x40, 0x21, 0x45, 0x76, 0x8f, 0x50, 0x4f, 0x65, 0x61, 0x7b, 0x80, 0x44, + 0xa3, 0xaa, 0xac, 0x9c, 0x77, 0x47, 0x1b, 0x01, 0x83, 0x5f, 0x4a, 0x4e, + 0x43, 0x2b, 0x31, 0x4f, 0x63, 0xc0, 0xac, 0x95, 0xd7, 0xb3, 0x47, 0x37, + 0x85, 0xa4, 0x8b, 0x44, 0x32, 0x56, 0x4f, 0x1c, 0x70, 0x70, 0x69, 0x61, + 0x61, 0x60, 0x4a, 0x2f, 0x63, 0x64, 0x8c, 0xac, 0x7b, 0x39, 0x5e, 0xbe, + 0xb3, 0x87, 0x6e, 0x73, 0x65, 0x48, 0x4d, 0x6f, 0xc8, 0xd2, 0xcf, 0xad, + 0x77, 0x4a, 0x36, 0x35, 0x64, 0x46, 0x3a, 0x4d, 0x5b, 0x5a, 0x64, 0x78, + 0x48, 0x34, 0x35, 0x63, 0xa2, 0xba, 0x9b, 0x71, 0x60, 0x84, 0xce, 0xec, + 0xa4, 0x43, 0x21, 0x2c, 0x25, 0x00, 0x5e, 0x92, 0x7b, 0x83, 0x63, 0x34, + 0x47, 0x3e, 0x10, 0x0d, 0x3d, 0x42, 0x44, 0x77, 0x6b, 0x65, 0x2e, 0x3b, + 0x50, 0x59, 0x83, 0x72, 0x6b, 0x64, 0x61, 0x66, 0x6d, 0x65, 0x4f, 0x3b, + 0x5c, 0x52, 0x62, 0x81, 0x80, 0x6b, 0x7a, 0xa2, 0x81, 0x47, 0x22, 0x2a, + 0x2d, 0x21, 0x31, 0x55, 0x71, 0x7e, 0x68, 0x3e, 0x3a, 0x5e, 0x82, 0x91, + 0x46, 0x55, 0x4b, 0x30, 0x34, 0x56, 0x66, 0x5a, 0xbe, 0xc9, 0xa7, 0x59, + 0x23, 0x21, 0x2c, 0x2a, 0xa9, 0xe3, 0xd0, 0xbb, 0xb1, 0xc5, 0xf8, 0xe2, + 0x97, 0x35, 0xbb, 0xa8, 0x52, 0x6b, 0x44, 0x61, 0x46, 0x4f, 0x6c, 0x62, + 0x3f, 0x53, 0x60, 0x34, 0x4c, 0x86, 0x8e, 0x59, 0x4b, 0x6f, 0x6c, 0x3e, + 0x34, 0x5c, 0x3f, 0x1d, 0x39, 0x44, 0x4e, 0x83, 0x4f, 0x44, 0xa3, 0x91, + 0x7a, 0xe0, 0xd7, 0x7e, 0x43, 0x3a, 0xb4, 0x95, 0x47, 0x69, 0x68, 0x7e, + 0x88, 0x82, 0x7c, 0x7c, 0x81, 0x84, 0x82, 0x7e, 0x7e, 0x78, 0x74, 0x78, + 0x82, 0x87, 0x82, 0x7c, 0x67, 0x6e, 0x79, 0x83, 0x86, 0x83, 0x7d, 0x78, + 0x6f, 0x74, 0x78, 0x74, 0x6f, 0x6f, 0x78, 0x82, 0x71, 0x6b, 0x66, 0x63, + 0x61, 0x5a, 0x4e, 0x45, 0x39, 0x3b, 0x43, 0x5a, 0x88, 0xac, 0x99, 0x69, + 0x68, 0x55, 0x69, 0x47, 0x18, 0x09, 0x14, 0x5d, 0x66, 0x78, 0xaa, 0xda, + 0x8b, 0x3e, 0x51, 0x39, 0x3a, 0x69, 0xc0, 0xd0, 0x7f, 0x42, 0x29, 0x07, + 0x51, 0x62, 0x7a, 0x89, 0x86, 0x72, 0x56, 0x43, 0x27, 0x2c, 0x3a, 0x4e, + 0x5a, 0x56, 0x49, 0x40, 0x5a, 0x67, 0x79, 0x5e, 0x35, 0x40, 0x3d, 0x05, + 0x38, 0x3c, 0x4d, 0x6a, 0x7d, 0x70, 0x45, 0x1f, 0xd2, 0xff, 0xe0, 0x82, + 0x7b, 0xcd, 0xe3, 0xaf, 0x7b, 0x6e, 0x57, 0x57, 0x56, 0x2d, 0x21, 0x4d, + 0x34, 0x40, 0x64, 0x5b, 0x37, 0x4e, 0x59, 0x22, 0x18, 0x35, 0x5a, 0x72, + 0x77, 0x74, 0x73, 0x75, 0x85, 0xad, 0xdd, 0xec, 0xc6, 0x78, 0x24, 0x00, + 0xb5, 0x8c, 0x5e, 0x4d, 0x5f, 0x7b, 0x8c, 0x8f, 0x71, 0x8c, 0xbd, 0xf3, + 0xee, 0x96, 0x4e, 0x4d, 0x6c, 0x80, 0x6e, 0x3f, 0x3e, 0x6a, 0x7a, 0x65, + 0x4f, 0x39, 0x20, 0x36, 0x8e, 0xd6, 0xbd, 0x75, 0x5f, 0x81, 0x88, 0x57, + 0x1c, 0x14, 0x40, 0x6e, 0x8d, 0x5b, 0x1d, 0x06, 0x29, 0x67, 0x91, 0x9e, + 0x88, 0xdc, 0xb4, 0x56, 0x5a, 0x6c, 0x5b, 0x61, 0x8c, 0xc6, 0xa3, 0x2a, + 0x0d, 0x6c, 0xaa, 0x98, 0x4b, 0x86, 0x8e, 0x99, 0xc7, 0xa1, 0x4a, 0x30, + 0x5a, 0xbb, 0xcc, 0x9a, 0x76, 0x4e, 0x59, 0xa8, 0xab, 0xb7, 0xc6, 0xb0, + 0x63, 0x27, 0x46, 0x8e, 0x6e, 0x8b, 0x92, 0x66, 0x27, 0x01, 0x00, 0x01, + 0x8b, 0x84, 0x7b, 0x5a, 0x56, 0x9b, 0xad, 0x65, 0x3e, 0x66, 0x8c, 0x85, + 0x78, 0x88, 0x7d, 0x49, 0x66, 0xff, 0xb5, 0x5e, 0x90, 0x93, 0x89, 0x60, + 0x26, 0x2a, 0x45, 0x63, 0x5a, 0x34, 0x20, 0x27, 0x2a, 0x37, 0x1c, 0x1c, + 0x36, 0x15, 0x18, 0x6f, 0x4f, 0x65, 0x5b, 0x49, 0x75, 0xb0, 0x91, 0x3e, + 0x09, 0x89, 0xc9, 0x89, 0x50, 0x6a, 0x8c, 0x87, 0x8a, 0x84, 0x9e, 0xc4, + 0xb3, 0x7d, 0x6c, 0x84, 0x99, 0x63, 0x68, 0x94, 0x6e, 0x1c, 0x36, 0x9d, + 0x7c, 0x7c, 0x75, 0x67, 0x59, 0x55, 0x5f, 0x69, 0x75, 0x7f, 0x63, 0x4c, + 0x4b, 0x2d, 0x1d, 0x3e, 0x4a, 0x58, 0x63, 0x62, 0x59, 0x5a, 0x69, 0x79, + 0x70, 0x6c, 0x69, 0x59, 0x36, 0x14, 0x0d, 0x1d, 0x1d, 0x45, 0x4b, 0x4a, + 0x6d, 0x83, 0x79, 0x74, 0x84, 0x7c, 0x74, 0x71, 0x74, 0x75, 0x71, 0x6c, + 0x71, 0x74, 0x79, 0x7f, 0x83, 0x86, 0x87, 0x87, 0x7c, 0x7e, 0x81, 0x82, + 0x80, 0x7c, 0x78, 0x75, 0x80, 0x7d, 0x79, 0x76, 0x75, 0x77, 0x7a, 0x7c, + 0x73, 0x69, 0x5d, 0x59, 0x5d, 0x62, 0x63, 0x62, 0x4e, 0x42, 0x3a, 0x39, + 0x71, 0xdc, 0xd7, 0x61, 0x15, 0x12, 0x3e, 0x8c, 0xa9, 0x80, 0x50, 0x41, + 0x67, 0xa3, 0x90, 0x51, 0x49, 0x4e, 0x3e, 0x3b, 0x3b, 0x90, 0xb1, 0x64, + 0x0a, 0x03, 0x3b, 0x6a, 0xb6, 0xa1, 0x98, 0x74, 0x4f, 0x70, 0x8c, 0x69, + 0x29, 0x67, 0x52, 0x31, 0x5b, 0x68, 0x4a, 0x4d, 0x88, 0x73, 0x76, 0x51, + 0x1d, 0x40, 0x56, 0x16, 0x8a, 0x5d, 0x62, 0x6f, 0x48, 0x31, 0x42, 0x48, + 0x80, 0xbb, 0xa1, 0x63, 0x5a, 0x4f, 0x4a, 0x6e, 0x4c, 0x4c, 0x53, 0x40, + 0x26, 0x39, 0x41, 0x19, 0x57, 0x65, 0x50, 0x2c, 0x3b, 0x6a, 0x68, 0x3e, + 0x51, 0x69, 0x6a, 0x4e, 0x41, 0x4f, 0x55, 0x4a, 0x8e, 0xa0, 0x96, 0x7d, + 0x9b, 0x6e, 0x09, 0x23, 0x8c, 0x6b, 0x48, 0x41, 0x59, 0x7a, 0x90, 0x98, + 0x8c, 0x85, 0x7c, 0x80, 0x89, 0x8f, 0xac, 0xd8, 0xfa, 0xe2, 0xac, 0x78, + 0x77, 0xaa, 0xdf, 0xf7, 0xbe, 0xd8, 0xc5, 0xa4, 0xcc, 0xff, 0xd5, 0x66, + 0x34, 0x66, 0x85, 0x96, 0xcd, 0xff, 0xd6, 0x7d, 0x54, 0x6c, 0x8b, 0x84, + 0x46, 0x1a, 0x48, 0x9a, 0x92, 0x8e, 0x46, 0x04, 0x21, 0x5d, 0x70, 0x6f, + 0xfa, 0xff, 0xec, 0xca, 0xc5, 0xca, 0xa6, 0x6e, 0x63, 0x68, 0x49, 0x4d, + 0x78, 0x5e, 0x2b, 0x31, 0x62, 0xa9, 0x82, 0x38, 0x65, 0xaa, 0xa1, 0x86, + 0x59, 0x8e, 0x9e, 0x6c, 0x3f, 0x4a, 0x6a, 0x79, 0x37, 0x4c, 0x40, 0x40, + 0xa1, 0xff, 0xe6, 0x6d, 0x79, 0x5c, 0xa1, 0xf7, 0xd9, 0x90, 0x71, 0x68, + 0x3e, 0x4c, 0x5e, 0x73, 0x9a, 0xbc, 0x9c, 0x55, 0xa9, 0xbd, 0x44, 0x44, + 0x90, 0x70, 0x40, 0x09, 0x0e, 0x20, 0x54, 0x7e, 0x64, 0x29, 0x21, 0x44, + 0x56, 0x3a, 0x28, 0x53, 0x83, 0x61, 0x23, 0x14, 0x59, 0xa0, 0xc5, 0x9e, + 0x70, 0x67, 0x63, 0x52, 0x46, 0x4e, 0x4a, 0x30, 0x12, 0x0c, 0x25, 0x41, + 0x0f, 0x51, 0xb2, 0xf0, 0xe0, 0xa4, 0x7b, 0x76, 0x99, 0x40, 0x19, 0x67, + 0xc8, 0xd1, 0x8f, 0x52, 0x21, 0x26, 0x32, 0x43, 0x54, 0x5e, 0x5f, 0x5c, + 0x89, 0x3d, 0x09, 0x3d, 0x7b, 0x60, 0x5d, 0xa7, 0x4e, 0x40, 0x3c, 0x52, + 0x6f, 0x76, 0x5e, 0x42, 0x82, 0x46, 0x35, 0x25, 0x34, 0x4a, 0x48, 0x75, + 0x8f, 0x50, 0x35, 0x51, 0x5f, 0x5a, 0x6d, 0x91, 0x7d, 0x78, 0x75, 0x78, + 0x81, 0x86, 0x85, 0x82, 0x6c, 0x6b, 0x6a, 0x6b, 0x70, 0x77, 0x7e, 0x83, + 0x7b, 0x7c, 0x7f, 0x80, 0x7e, 0x7b, 0x76, 0x73, 0x6a, 0x69, 0x68, 0x69, + 0x6c, 0x71, 0x77, 0x7b, 0x6e, 0x63, 0x57, 0x52, 0x54, 0x58, 0x58, 0x56, + 0x4d, 0x4d, 0x68, 0x5f, 0x24, 0x15, 0x29, 0x24, 0x6b, 0x4e, 0x41, 0x4d, + 0x50, 0x54, 0x7d, 0xb3, 0x18, 0x3b, 0x31, 0x17, 0x11, 0x00, 0x08, 0x3a, + 0x2d, 0x2d, 0x2f, 0x30, 0x2e, 0x39, 0x5c, 0x80, 0x56, 0x50, 0x5f, 0x54, + 0x41, 0x6c, 0x8c, 0x68, 0x26, 0x3f, 0x46, 0x7e, 0xd8, 0xd0, 0x8f, 0x81, + 0x78, 0x75, 0x95, 0x9d, 0x8e, 0xad, 0xa9, 0x5c, 0x1b, 0x3c, 0x66, 0x52, + 0x23, 0x39, 0x61, 0x56, 0x48, 0x38, 0x16, 0x20, 0x3f, 0x2e, 0x42, 0x9a, + 0x42, 0x19, 0x3d, 0x65, 0x2a, 0x05, 0x6d, 0xf3, 0x7b, 0x71, 0x5c, 0x4b, + 0x52, 0x62, 0x5c, 0x49, 0x3a, 0x31, 0x2e, 0x37, 0x41, 0x44, 0x44, 0x46, + 0x97, 0xb0, 0xa3, 0x73, 0x81, 0x61, 0x07, 0x1b, 0x9c, 0xa5, 0xb9, 0xcf, + 0xd8, 0xc6, 0xa0, 0x81, 0x76, 0x67, 0x63, 0x7f, 0xb1, 0xcd, 0xa8, 0x69, + 0x6f, 0x69, 0x74, 0x89, 0x8a, 0x76, 0x6c, 0x73, 0x8c, 0xd7, 0xdf, 0xa5, + 0xb1, 0xec, 0xc2, 0x51, 0x77, 0x6b, 0x80, 0xb5, 0xd3, 0xc0, 0xa0, 0x91, + 0x91, 0x8e, 0xbb, 0xf1, 0xd0, 0x75, 0x56, 0x78, 0x6d, 0x45, 0x2f, 0x2a, + 0x38, 0x6d, 0x94, 0x89, 0x5f, 0x39, 0x22, 0x27, 0x27, 0x26, 0x46, 0x74, + 0x90, 0x51, 0x26, 0x69, 0xca, 0xbf, 0x7c, 0x6c, 0x64, 0x57, 0x2e, 0x39, + 0x85, 0x9b, 0x69, 0x45, 0x52, 0x71, 0x6e, 0x41, 0x29, 0x39, 0x46, 0x3f, + 0x48, 0x3c, 0x3f, 0x6a, 0xac, 0xcb, 0xa3, 0x68, 0x43, 0x62, 0xa5, 0xb5, + 0x81, 0x69, 0x60, 0x3a, 0x4e, 0x4c, 0x40, 0x4c, 0x85, 0xb7, 0xb2, 0x94, + 0xc1, 0xad, 0x64, 0x49, 0x1c, 0x00, 0x1e, 0x41, 0x4c, 0x16, 0x19, 0x62, + 0x82, 0x57, 0x35, 0x3d, 0x66, 0x58, 0x71, 0x87, 0x6d, 0x5b, 0x66, 0x6c, + 0x57, 0x57, 0x4e, 0x3e, 0x35, 0x30, 0x23, 0x12, 0x38, 0x1f, 0x13, 0x27, + 0x3d, 0x3b, 0x2a, 0x1d, 0x3a, 0x87, 0xd4, 0xea, 0xe0, 0xd7, 0xd3, 0xcf, + 0x6e, 0x47, 0x56, 0x82, 0x60, 0x13, 0x20, 0x73, 0x78, 0x68, 0x5c, 0x61, + 0x68, 0x59, 0x32, 0x0f, 0x38, 0x54, 0x58, 0x65, 0x7f, 0x70, 0x64, 0x86, + 0x60, 0x56, 0x43, 0x2d, 0x1f, 0x21, 0x2e, 0x3b, 0x6d, 0x7e, 0x6e, 0x6d, + 0xe7, 0xd8, 0x3e, 0x59, 0x44, 0x16, 0x24, 0x59, 0x6d, 0x74, 0x74, 0x60, + 0x7b, 0x76, 0x72, 0x74, 0x79, 0x7a, 0x76, 0x70, 0x64, 0x67, 0x6d, 0x74, + 0x7b, 0x81, 0x85, 0x87, 0x8a, 0x8b, 0x8e, 0x8f, 0x8d, 0x8a, 0x85, 0x82, + 0x88, 0x84, 0x7c, 0x73, 0x6d, 0x69, 0x68, 0x68, 0x71, 0x65, 0x58, 0x50, + 0x51, 0x52, 0x51, 0x4f, 0x3f, 0x31, 0x61, 0x8c, 0x5e, 0x1f, 0x16, 0x21, + 0x3d, 0x38, 0x45, 0x5d, 0x58, 0x33, 0x17, 0x12, 0x43, 0x81, 0xc8, 0xff, + 0xf6, 0x84, 0x32, 0x44, 0x4e, 0x21, 0x2b, 0x7c, 0xb2, 0x95, 0x5d, 0x42, + 0x57, 0x47, 0x4b, 0x44, 0x49, 0x9c, 0xe7, 0xdf, 0xb8, 0x90, 0x67, 0x7a, + 0x91, 0x54, 0x11, 0x14, 0x45, 0x33, 0x36, 0x35, 0x38, 0x63, 0x76, 0x4f, + 0x3a, 0x31, 0x39, 0x32, 0x2a, 0x4c, 0x52, 0x1c, 0x11, 0x48, 0x4c, 0x25, + 0x10, 0x12, 0x3e, 0x83, 0x4b, 0x00, 0x00, 0x47, 0x8f, 0xb7, 0xc2, 0xb1, + 0x4a, 0x35, 0x28, 0x2d, 0x34, 0x31, 0x2e, 0x31, 0x50, 0x34, 0x34, 0x58, + 0x67, 0x4e, 0x39, 0x3b, 0xa9, 0xca, 0xb9, 0x69, 0x61, 0x54, 0x0c, 0x14, + 0x5f, 0x64, 0x6d, 0x77, 0x7a, 0x71, 0x61, 0x54, 0x90, 0xbc, 0xe2, 0xc1, + 0x89, 0x8b, 0x93, 0x72, 0x38, 0x48, 0x8e, 0xe2, 0xe5, 0x96, 0x54, 0x46, + 0x00, 0x36, 0x51, 0x37, 0x43, 0x79, 0x7b, 0x4b, 0xa3, 0x6b, 0x59, 0x69, + 0x41, 0x00, 0x00, 0x44, 0x8e, 0x8c, 0xb0, 0xd9, 0xba, 0x61, 0x2a, 0x2b, + 0x40, 0x36, 0x79, 0x9f, 0x6b, 0x5b, 0x6b, 0x50, 0x50, 0x3c, 0x43, 0x63, + 0x68, 0x58, 0x67, 0x8e, 0x48, 0x40, 0x57, 0x7b, 0x62, 0x1f, 0x2c, 0x7c, + 0xb9, 0x8b, 0x6d, 0x84, 0x99, 0x7c, 0x5d, 0x61, 0x6a, 0x44, 0x34, 0x40, + 0x3c, 0x23, 0x22, 0x39, 0x2d, 0x3a, 0x63, 0x85, 0x6e, 0x38, 0x30, 0x4e, + 0x6d, 0x3a, 0x49, 0x64, 0x38, 0x19, 0x35, 0x4d, 0x2b, 0x63, 0x85, 0x97, + 0xa5, 0x87, 0x56, 0x47, 0x77, 0x5a, 0x6c, 0x9e, 0xac, 0xcd, 0xea, 0xba, + 0x39, 0x1e, 0x33, 0x62, 0x4e, 0x13, 0x20, 0x65, 0x79, 0x64, 0x9d, 0xcf, + 0xb9, 0xbc, 0xc0, 0x90, 0x84, 0x74, 0x6d, 0x73, 0x74, 0x6a, 0x64, 0x67, + 0x21, 0x2c, 0x22, 0x19, 0x3d, 0x67, 0x4a, 0x09, 0x8f, 0x74, 0x42, 0x2b, + 0x55, 0x81, 0x58, 0x07, 0x3f, 0x20, 0x2c, 0x59, 0x56, 0x30, 0x44, 0x84, + 0x5e, 0x43, 0x30, 0x42, 0x67, 0x75, 0x5d, 0x3d, 0x35, 0x77, 0x74, 0x43, + 0x3d, 0x48, 0x56, 0x74, 0x56, 0x63, 0x69, 0x60, 0x56, 0x63, 0x8a, 0xad, + 0x76, 0x55, 0x38, 0x1f, 0x4c, 0x7d, 0x6b, 0x6d, 0x57, 0x2b, 0x33, 0x65, + 0x79, 0x74, 0x75, 0x77, 0x65, 0x63, 0x65, 0x6e, 0x79, 0x7e, 0x7c, 0x77, + 0x78, 0x80, 0x89, 0x8d, 0x86, 0x76, 0x62, 0x55, 0x62, 0x64, 0x66, 0x67, + 0x66, 0x62, 0x5d, 0x5b, 0x4e, 0x50, 0x55, 0x5d, 0x69, 0x76, 0x81, 0x88, + 0x7a, 0x6e, 0x5f, 0x57, 0x56, 0x56, 0x54, 0x51, 0x36, 0x2f, 0x41, 0x47, + 0x30, 0x3f, 0x84, 0xbc, 0xb9, 0xab, 0xb6, 0xe1, 0xff, 0xe2, 0x93, 0x50, + 0x88, 0x98, 0xa7, 0xce, 0xe2, 0xa9, 0x83, 0xa8, 0x96, 0x67, 0x52, 0x73, + 0x92, 0x84, 0x60, 0x4b, 0x3d, 0x4a, 0x72, 0x75, 0x58, 0x62, 0x5a, 0x1b, + 0x36, 0x2d, 0x24, 0x26, 0x24, 0x1c, 0x35, 0x68, 0x29, 0x32, 0x44, 0x50, + 0x5e, 0x8a, 0xba, 0xcb, 0x84, 0x32, 0x21, 0x4f, 0x6b, 0x7e, 0x85, 0x70, + 0x5e, 0x96, 0x95, 0x4f, 0x26, 0x42, 0x7c, 0xa5, 0x93, 0xc0, 0xf0, 0xdd, + 0xa6, 0x95, 0x78, 0x36, 0x46, 0x48, 0x4a, 0x50, 0x5c, 0x68, 0x6e, 0x6e, + 0x69, 0x54, 0x4a, 0x54, 0x5c, 0x5c, 0x69, 0x7e, 0xbf, 0xe0, 0xcc, 0x68, + 0x4f, 0x53, 0x1a, 0x15, 0x5d, 0x69, 0x7b, 0x8c, 0x9c, 0xab, 0xba, 0xc3, + 0xb5, 0xbb, 0xc5, 0x8b, 0x3d, 0x54, 0x81, 0x67, 0x86, 0x65, 0x66, 0x8a, + 0x8f, 0x74, 0x7a, 0x9e, 0xc2, 0xb9, 0xa4, 0x83, 0x5d, 0x47, 0x4b, 0x5a, + 0x48, 0x2f, 0x18, 0x1a, 0x31, 0x41, 0x37, 0x24, 0x57, 0x53, 0x5e, 0x7f, + 0x9d, 0x9d, 0x82, 0x68, 0x55, 0x4a, 0x8b, 0xac, 0x6e, 0x52, 0x57, 0x34, + 0x22, 0x82, 0xd2, 0xc0, 0x74, 0x49, 0x60, 0x88, 0x3c, 0x32, 0x51, 0x65, + 0x2f, 0x11, 0x71, 0xf4, 0xe1, 0xc7, 0x8f, 0x4c, 0x3b, 0x68, 0x86, 0x77, + 0x4c, 0x25, 0x19, 0x38, 0x4b, 0x43, 0x47, 0x5c, 0x4a, 0x7c, 0x95, 0x81, + 0x72, 0x77, 0x69, 0x4a, 0x74, 0x51, 0x56, 0x5d, 0x4d, 0x58, 0x5d, 0x37, + 0x45, 0x5c, 0x46, 0x43, 0x72, 0x7b, 0x86, 0xbf, 0x73, 0x36, 0x5d, 0x81, + 0x75, 0xab, 0xe5, 0xe1, 0x61, 0x6a, 0x97, 0xbd, 0x96, 0x51, 0x58, 0x95, + 0x9a, 0xb5, 0xf2, 0xd0, 0x4b, 0x1d, 0x3c, 0x36, 0x18, 0x56, 0x98, 0x9f, + 0x71, 0x58, 0x85, 0xc7, 0xb4, 0xa5, 0x7a, 0x4e, 0x50, 0x70, 0x78, 0x66, + 0x00, 0x35, 0x56, 0x3f, 0x2f, 0x40, 0x44, 0x32, 0x4f, 0xd8, 0xff, 0xbb, + 0x6f, 0x8a, 0xb6, 0xb6, 0xd2, 0x9d, 0x64, 0x4f, 0x5b, 0x60, 0x4b, 0x30, + 0x33, 0x2e, 0x1f, 0x38, 0x5f, 0x4e, 0x46, 0x76, 0x56, 0x5c, 0x74, 0x9c, + 0xbc, 0xb8, 0x93, 0x6e, 0x3e, 0x71, 0x5f, 0xa0, 0xff, 0xd5, 0x78, 0x52, + 0x00, 0x0c, 0x10, 0x25, 0x5d, 0x80, 0x77, 0x6a, 0x86, 0x81, 0x7e, 0x7f, + 0x7f, 0x79, 0x6d, 0x62, 0x5d, 0x67, 0x75, 0x7f, 0x7f, 0x75, 0x66, 0x5c, + 0x6c, 0x6e, 0x70, 0x71, 0x6f, 0x6c, 0x67, 0x64, 0x5e, 0x5d, 0x5d, 0x5e, + 0x62, 0x68, 0x6f, 0x73, 0x7b, 0x6f, 0x61, 0x58, 0x57, 0x58, 0x56, 0x53, + 0x4f, 0x42, 0x4a, 0x70, 0xa5, 0xc6, 0xaa, 0x70, 0x5f, 0x64, 0x7a, 0xa7, + 0xd6, 0xde, 0xb0, 0x7b, 0x99, 0xac, 0xab, 0xbd, 0xd2, 0x97, 0x3f, 0x23, + 0x3e, 0x5a, 0x5c, 0x36, 0x19, 0x1f, 0x2a, 0x28, 0x36, 0x36, 0x4d, 0x44, + 0x29, 0x44, 0x50, 0x20, 0x3f, 0x52, 0x54, 0x2b, 0x04, 0x0f, 0x27, 0x27, + 0xca, 0xdb, 0xd4, 0xaa, 0x71, 0x43, 0x46, 0x6a, 0x4c, 0x14, 0x10, 0x22, + 0x15, 0x22, 0x54, 0x6d, 0x29, 0x20, 0x5c, 0xc6, 0xfb, 0xeb, 0xca, 0xb7, + 0xa1, 0x9d, 0xca, 0xdf, 0x9f, 0x5a, 0x43, 0x38, 0x24, 0x48, 0x53, 0x3e, + 0x44, 0x66, 0x6d, 0x55, 0x4c, 0x54, 0x44, 0x23, 0x25, 0x62, 0xb2, 0xe4, + 0xcd, 0xdc, 0xc9, 0x6a, 0x4d, 0x5b, 0x2b, 0x1a, 0x57, 0x70, 0x8f, 0xa0, + 0xa3, 0xa2, 0xa5, 0xab, 0x3e, 0x07, 0x22, 0x5c, 0x86, 0xdc, 0xff, 0xb6, + 0xd7, 0x9d, 0x61, 0x46, 0x4d, 0x74, 0xba, 0xf9, 0xdc, 0xa5, 0x79, 0x63, + 0x39, 0x0a, 0x10, 0x3b, 0x8b, 0x68, 0x4c, 0x55, 0x70, 0x7b, 0x6d, 0x5b, + 0x9d, 0x7b, 0x52, 0x47, 0x5f, 0x6c, 0x49, 0x19, 0x24, 0x08, 0x05, 0x11, + 0x26, 0x58, 0x77, 0x64, 0x3e, 0x8d, 0xa2, 0x52, 0x08, 0x0e, 0x32, 0x40, + 0x6b, 0x28, 0x20, 0x38, 0x26, 0x21, 0x46, 0x61, 0xae, 0x61, 0x38, 0x37, + 0x38, 0x51, 0x66, 0x56, 0x48, 0x54, 0x47, 0x2b, 0x33, 0x54, 0x57, 0x3d, + 0x40, 0x44, 0x4d, 0x4f, 0x3b, 0x22, 0x1d, 0x29, 0x58, 0x72, 0x74, 0x41, + 0x3f, 0x96, 0x98, 0x27, 0x45, 0x4d, 0x2c, 0x51, 0xb8, 0xbb, 0x98, 0xc0, + 0x9d, 0x23, 0x4e, 0x9d, 0xa7, 0x97, 0x64, 0x50, 0x82, 0x8f, 0xbb, 0xef, + 0xf8, 0xce, 0x9d, 0x86, 0x6e, 0x58, 0x4e, 0x44, 0x45, 0x64, 0x67, 0x3c, + 0x77, 0x6e, 0x5b, 0x4d, 0x56, 0x71, 0x84, 0x89, 0x99, 0x60, 0x49, 0x5e, + 0x53, 0x2e, 0x3d, 0x75, 0x41, 0xa5, 0xe8, 0xb4, 0x47, 0x15, 0x36, 0x69, + 0x85, 0x7d, 0x40, 0x00, 0x10, 0x5f, 0x71, 0x46, 0xe1, 0xb2, 0x79, 0x5c, + 0x60, 0x6c, 0x6d, 0x67, 0x02, 0x42, 0x5b, 0x5a, 0x67, 0x59, 0x46, 0x58, + 0x5a, 0x68, 0x7d, 0x8c, 0x88, 0x6c, 0x44, 0x26, 0x7e, 0x78, 0x8a, 0xba, + 0x61, 0x16, 0x5d, 0x61, 0x7a, 0xec, 0xfd, 0xa5, 0x73, 0x76, 0x79, 0x78, + 0x70, 0x6f, 0x72, 0x79, 0x7f, 0x7d, 0x73, 0x69, 0x77, 0x77, 0x77, 0x76, + 0x74, 0x72, 0x70, 0x6f, 0x76, 0x78, 0x7a, 0x7c, 0x7a, 0x76, 0x72, 0x6f, + 0x70, 0x6e, 0x6a, 0x68, 0x68, 0x6a, 0x6d, 0x70, 0x74, 0x69, 0x5b, 0x54, + 0x54, 0x56, 0x55, 0x53, 0x3b, 0x3b, 0x54, 0x88, 0xb7, 0xb0, 0x69, 0x1e, + 0x2c, 0x6f, 0xb1, 0xc5, 0xc1, 0xb8, 0xa5, 0x8f, 0x7a, 0x7b, 0x5d, 0x5a, + 0x79, 0x67, 0x41, 0x44, 0x6c, 0xbf, 0xe3, 0xa4, 0x57, 0x40, 0x43, 0x3e, + 0x59, 0x72, 0xab, 0xb7, 0x91, 0x83, 0x5e, 0x0b, 0x68, 0x5a, 0x46, 0x1a, + 0x04, 0x38, 0x57, 0x2e, 0x25, 0x76, 0xc2, 0xe8, 0xcf, 0x66, 0x15, 0x19, + 0xe1, 0xbd, 0x91, 0x4a, 0x0b, 0x12, 0x19, 0x00, 0x46, 0x14, 0x0b, 0x25, + 0x3b, 0x60, 0x7b, 0x6e, 0x9b, 0x86, 0xae, 0xcb, 0x82, 0x32, 0x30, 0x4c, + 0x3d, 0x6e, 0x78, 0x50, 0x45, 0x62, 0x61, 0x3e, 0x2d, 0x59, 0x67, 0x47, + 0x3c, 0x6e, 0xb0, 0xd4, 0xc5, 0xb6, 0xa7, 0x65, 0x53, 0x62, 0x31, 0x17, + 0x80, 0x84, 0x7e, 0x69, 0x53, 0x51, 0x66, 0x7c, 0x9d, 0x67, 0x95, 0xb9, + 0x86, 0x9c, 0xd8, 0xc4, 0x68, 0x65, 0x4e, 0x33, 0x3c, 0x65, 0x88, 0x92, + 0x39, 0x25, 0x1f, 0x34, 0x4e, 0x62, 0x7c, 0x95, 0x4d, 0x45, 0x55, 0x75, + 0x83, 0x8f, 0xc1, 0xfd, 0x84, 0x86, 0x8b, 0x83, 0x61, 0x40, 0x44, 0x5e, + 0x48, 0x5f, 0x41, 0x2a, 0x66, 0xb0, 0xc5, 0xc0, 0x91, 0x74, 0x37, 0x14, + 0x3c, 0x69, 0x34, 0x00, 0x27, 0x1c, 0x47, 0x5c, 0x32, 0x36, 0x60, 0x61, + 0x85, 0x17, 0x23, 0x82, 0x89, 0x60, 0x55, 0x4f, 0x60, 0x72, 0x64, 0x37, + 0x25, 0x36, 0x38, 0x24, 0x61, 0x3a, 0x49, 0x76, 0x59, 0x16, 0x36, 0x98, + 0x75, 0x35, 0x3d, 0x66, 0x59, 0x51, 0x6f, 0x7f, 0xd7, 0xcc, 0x81, 0x7f, + 0xc6, 0x9a, 0x56, 0x83, 0xc2, 0x7c, 0x97, 0x6d, 0x1f, 0x00, 0x00, 0x31, + 0x31, 0x63, 0x94, 0xaa, 0xb3, 0xb6, 0xa1, 0x82, 0x27, 0x81, 0xb0, 0xa4, + 0x99, 0x86, 0x6c, 0x65, 0x2e, 0x25, 0x0d, 0x12, 0x5c, 0xb2, 0xbb, 0x8e, + 0x6f, 0x37, 0x33, 0x67, 0x6b, 0x3c, 0x3b, 0x6d, 0x60, 0x3a, 0x21, 0x2c, + 0x40, 0x43, 0x41, 0x45, 0x09, 0x00, 0x2c, 0xb6, 0xff, 0xe9, 0x98, 0x6b, + 0x7b, 0x66, 0x49, 0x36, 0x34, 0x3e, 0x4b, 0x54, 0x44, 0xbc, 0xc5, 0x62, + 0x39, 0x4e, 0x61, 0x6d, 0x39, 0x54, 0x6e, 0x6c, 0x58, 0x50, 0x61, 0x77, + 0x21, 0x3f, 0x39, 0x43, 0x24, 0x09, 0x64, 0xb5, 0xff, 0xdb, 0x9a, 0x68, + 0x58, 0x5d, 0x6b, 0x7b, 0x6d, 0x6d, 0x6f, 0x74, 0x77, 0x71, 0x63, 0x57, + 0x76, 0x75, 0x75, 0x77, 0x7c, 0x84, 0x8c, 0x91, 0x75, 0x77, 0x79, 0x7a, + 0x79, 0x75, 0x71, 0x6e, 0x68, 0x65, 0x61, 0x5e, 0x5d, 0x5f, 0x62, 0x64, + 0x73, 0x69, 0x5c, 0x57, 0x59, 0x5d, 0x5e, 0x5c, 0x4b, 0x3c, 0x3c, 0x56, + 0x6c, 0x61, 0x46, 0x38, 0x4a, 0x8b, 0xad, 0x89, 0x5b, 0x56, 0x65, 0x6a, + 0x9d, 0x8f, 0x73, 0x70, 0x67, 0x30, 0x2e, 0x79, 0x9b, 0xb5, 0xba, 0x8e, + 0x53, 0x34, 0x39, 0x46, 0x62, 0x61, 0x77, 0x74, 0x66, 0x92, 0xb0, 0x8b, + 0x42, 0x23, 0x31, 0x3a, 0x32, 0x6a, 0xa8, 0xa0, 0xa0, 0x9c, 0x81, 0x92, + 0xc1, 0xb1, 0xac, 0xe9, 0xe8, 0xd6, 0xd2, 0xc3, 0xb9, 0xdc, 0xe0, 0xa9, + 0x26, 0x2f, 0x3e, 0x1f, 0x09, 0x58, 0xa5, 0x98, 0x5d, 0x4a, 0x5a, 0x65, + 0x47, 0x36, 0x2f, 0x17, 0x46, 0x6a, 0x77, 0x5e, 0x4b, 0x4e, 0x4b, 0x3b, + 0x2a, 0x4c, 0x69, 0x69, 0x5b, 0x5f, 0x77, 0x8c, 0xab, 0x7b, 0x72, 0x56, + 0x56, 0x60, 0x28, 0x09, 0x8f, 0xab, 0xc8, 0xc9, 0xb2, 0x9c, 0x96, 0x9a, + 0x99, 0x54, 0x8e, 0xc2, 0x78, 0x5b, 0x72, 0x4e, 0x00, 0x20, 0x39, 0x2d, + 0x37, 0x53, 0x46, 0x1c, 0x45, 0x4d, 0x46, 0x3f, 0x57, 0x78, 0x72, 0x51, + 0x12, 0x58, 0x74, 0x51, 0x50, 0x88, 0xa6, 0x95, 0x55, 0x1d, 0x19, 0x55, + 0x6d, 0x41, 0x1d, 0x22, 0x2d, 0x96, 0x8e, 0x4a, 0x57, 0x60, 0x3e, 0x36, + 0x2d, 0x57, 0x6e, 0x65, 0x6f, 0x9b, 0xbf, 0xc6, 0x91, 0x5f, 0x5a, 0x56, + 0x40, 0x6b, 0x8e, 0x66, 0x4b, 0x1e, 0x39, 0x5c, 0x48, 0x4f, 0x58, 0x2d, + 0x54, 0x41, 0x41, 0x4b, 0x39, 0x1d, 0x2d, 0x57, 0x6e, 0x59, 0x41, 0x32, + 0x25, 0x21, 0x30, 0x44, 0x47, 0x40, 0x6d, 0x88, 0x67, 0x64, 0x84, 0x89, + 0x96, 0xd7, 0xdc, 0xf9, 0xff, 0xaf, 0x3f, 0x68, 0xa5, 0x76, 0x78, 0x3f, + 0x60, 0xa9, 0x71, 0x68, 0x72, 0x62, 0x45, 0x53, 0xaf, 0xff, 0xe7, 0x90, + 0x57, 0xc7, 0xd7, 0x9c, 0x7d, 0x4a, 0x1a, 0x27, 0x00, 0x87, 0xf7, 0xc4, + 0x5f, 0x3e, 0x48, 0x4b, 0x89, 0x58, 0x22, 0x0b, 0x11, 0x1e, 0x26, 0x2b, + 0x2b, 0x10, 0x18, 0x43, 0x58, 0x58, 0x77, 0xab, 0x77, 0x52, 0x34, 0x25, + 0x0b, 0x00, 0x2a, 0x6a, 0x49, 0x4b, 0x48, 0x3e, 0x35, 0x36, 0x42, 0x4f, + 0x8f, 0xc1, 0xc3, 0xaa, 0x9f, 0x7c, 0x5a, 0x65, 0x24, 0x25, 0x2f, 0x45, + 0x58, 0x57, 0x40, 0x2a, 0x59, 0x5e, 0x5d, 0x42, 0x35, 0x75, 0xd4, 0xfd, + 0xf3, 0xba, 0x94, 0x7e, 0x68, 0x6e, 0x7a, 0x6d, 0x67, 0x69, 0x70, 0x7b, + 0x84, 0x83, 0x78, 0x6e, 0x78, 0x79, 0x7a, 0x7b, 0x7a, 0x77, 0x74, 0x72, + 0x6b, 0x6d, 0x6f, 0x70, 0x6f, 0x6b, 0x67, 0x64, 0x6e, 0x6b, 0x68, 0x67, + 0x67, 0x6a, 0x6e, 0x71, 0x79, 0x6f, 0x64, 0x60, 0x64, 0x69, 0x6a, 0x69, + 0x63, 0x51, 0x3f, 0x41, 0x45, 0x3b, 0x38, 0x47, 0x6b, 0x9b, 0xab, 0x85, + 0x67, 0x6f, 0x74, 0x68, 0x67, 0x5d, 0x65, 0x85, 0x67, 0x0a, 0x25, 0xb3, + 0x73, 0x71, 0x97, 0xd1, 0xd4, 0x9d, 0x70, 0x69, 0x6a, 0x63, 0x70, 0x65, + 0x53, 0x80, 0xa2, 0x7f, 0x3d, 0x3c, 0x94, 0xcd, 0x93, 0x75, 0x9d, 0xae, + 0xe3, 0xc6, 0x93, 0xac, 0xe5, 0xad, 0x59, 0x5f, 0x7d, 0x78, 0xa7, 0xb9, + 0x78, 0x47, 0x54, 0x63, 0x77, 0x32, 0x2e, 0x3a, 0x19, 0x21, 0x4a, 0x4c, + 0x46, 0x24, 0x2c, 0x3c, 0x2f, 0x3a, 0x5f, 0x6b, 0x32, 0x42, 0x56, 0x5b, + 0x4b, 0x3a, 0x3b, 0x47, 0x28, 0x19, 0x1a, 0x2c, 0x30, 0x32, 0x55, 0x83, + 0x94, 0x4f, 0x49, 0x48, 0x55, 0x5b, 0x1d, 0x00, 0x46, 0x6c, 0xa1, 0xc4, + 0xc1, 0x9b, 0x67, 0x43, 0x2f, 0x65, 0xa2, 0xb6, 0xa0, 0x84, 0x7d, 0x84, + 0x4f, 0x4c, 0x49, 0x49, 0x4a, 0x4a, 0x48, 0x45, 0x65, 0x92, 0x9c, 0x76, + 0x64, 0x70, 0x66, 0x43, 0x80, 0x63, 0x1c, 0x1b, 0x80, 0xb5, 0x7c, 0x3d, + 0x09, 0x2b, 0x38, 0x25, 0x1e, 0x31, 0x3b, 0x32, 0x37, 0x78, 0x9e, 0x83, + 0x5f, 0x5a, 0x5c, 0x53, 0x63, 0x6e, 0x77, 0x76, 0x73, 0x7b, 0x91, 0xa5, + 0x96, 0x6e, 0x52, 0x48, 0x30, 0x1f, 0x49, 0x8b, 0x24, 0x59, 0x3d, 0x11, + 0x2b, 0x36, 0x2f, 0x4b, 0x23, 0x40, 0x5f, 0x88, 0xc6, 0xdb, 0x8a, 0x1d, + 0x76, 0x2e, 0x1d, 0x14, 0x4e, 0x8e, 0x66, 0x5b, 0x6e, 0xa5, 0x7e, 0x58, + 0x97, 0xb7, 0x99, 0x97, 0x9d, 0x9a, 0x64, 0x24, 0x39, 0x81, 0x88, 0x53, + 0x45, 0x8e, 0xb0, 0xa4, 0x80, 0x45, 0x5c, 0xc5, 0xd1, 0x85, 0x96, 0xc8, + 0xa8, 0x8b, 0x93, 0x8b, 0x71, 0xa7, 0x91, 0x2a, 0x00, 0x26, 0x4b, 0x3e, + 0x8b, 0xc8, 0xf5, 0xeb, 0xc9, 0xac, 0x8b, 0x6b, 0xa3, 0xaa, 0x8f, 0x61, + 0x5c, 0x72, 0x60, 0x32, 0x2f, 0x76, 0x6d, 0x43, 0x57, 0x6e, 0x73, 0x8e, + 0xb8, 0xb5, 0x88, 0x77, 0x7a, 0x37, 0x0b, 0x3c, 0x59, 0x37, 0x2c, 0x45, + 0x56, 0x4d, 0x48, 0x50, 0x74, 0x72, 0x5d, 0x70, 0x92, 0x68, 0x40, 0x63, + 0x55, 0x33, 0x45, 0x77, 0x64, 0x1b, 0x0e, 0x3f, 0x47, 0x2d, 0x20, 0x2e, + 0x2c, 0x1f, 0x59, 0xc3, 0xb8, 0x97, 0x7c, 0x7b, 0x80, 0x7d, 0x7d, 0x84, + 0x86, 0x83, 0x7f, 0x7b, 0x79, 0x78, 0x78, 0x78, 0x85, 0x7e, 0x77, 0x75, + 0x76, 0x74, 0x6c, 0x65, 0x6d, 0x6e, 0x70, 0x73, 0x76, 0x78, 0x7a, 0x7b, + 0x77, 0x6e, 0x68, 0x6c, 0x77, 0x7d, 0x7a, 0x74, 0x79, 0x71, 0x67, 0x64, + 0x65, 0x66, 0x63, 0x5f, 0x58, 0x2e, 0x3a, 0x7e, 0x95, 0x66, 0x43, 0x4a, + 0x1b, 0x66, 0x84, 0x5c, 0x50, 0x82, 0xa9, 0xa4, 0x81, 0x55, 0x77, 0xa6, + 0x79, 0x41, 0x49, 0x5f, 0xb6, 0xf0, 0xeb, 0xcb, 0xcf, 0xb5, 0x7a, 0x61, + 0x5b, 0x44, 0x28, 0x23, 0x3b, 0x56, 0x5b, 0x51, 0x05, 0x15, 0x5d, 0xa7, + 0x8c, 0x37, 0x2a, 0x5f, 0x19, 0x4f, 0x99, 0xc5, 0xb7, 0x88, 0x61, 0x53, + 0xa5, 0x7d, 0x73, 0x81, 0x65, 0x2f, 0x32, 0x62, 0x30, 0x3a, 0x43, 0x43, + 0x38, 0x27, 0x17, 0x0e, 0x10, 0x13, 0x37, 0x47, 0x2c, 0x28, 0x2f, 0x1e, + 0x3f, 0x10, 0x32, 0x6b, 0x61, 0x59, 0x5e, 0x46, 0x45, 0x22, 0x0e, 0x16, + 0x18, 0x15, 0x2c, 0x51, 0x49, 0x40, 0x40, 0x26, 0x33, 0x2e, 0x00, 0x01, + 0x5d, 0x61, 0x60, 0x55, 0x4b, 0x52, 0x69, 0x7e, 0x99, 0x7d, 0x5a, 0x45, + 0x45, 0x4f, 0x57, 0x5a, 0x45, 0x3b, 0x39, 0x49, 0x63, 0x72, 0x70, 0x66, + 0x94, 0x96, 0x62, 0x0d, 0x00, 0x47, 0xaf, 0xe9, 0xff, 0xf6, 0xd1, 0xd1, + 0xdb, 0xa7, 0x76, 0x84, 0x5c, 0x74, 0x5f, 0x22, 0x12, 0x3e, 0x5d, 0x57, + 0x0a, 0x0d, 0x24, 0x3c, 0x37, 0x36, 0x6b, 0xb2, 0x5d, 0x5b, 0x5f, 0x6c, + 0x76, 0x6d, 0x52, 0x3a, 0x54, 0x39, 0x2e, 0x41, 0x53, 0x4e, 0x42, 0x3e, + 0x47, 0x6e, 0xa4, 0xa0, 0x54, 0x27, 0x51, 0x8e, 0xac, 0xb9, 0xba, 0xad, + 0xa6, 0xa2, 0x8d, 0x72, 0x19, 0x42, 0xa2, 0xb7, 0xd4, 0xf7, 0xc2, 0xb0, + 0x9a, 0xaf, 0x82, 0x57, 0x91, 0xdf, 0xe5, 0xc9, 0xbd, 0xa6, 0x7b, 0x5c, + 0x62, 0x76, 0x6d, 0x51, 0x28, 0x82, 0xe2, 0xc1, 0x5c, 0x57, 0x7e, 0x6b, + 0x93, 0x79, 0x83, 0x78, 0x4c, 0x63, 0x99, 0x9c, 0xa6, 0xa0, 0x7f, 0x58, + 0x54, 0x62, 0x4c, 0x21, 0x39, 0x60, 0x75, 0x6a, 0x6f, 0x99, 0xc5, 0xd8, + 0x7a, 0xbc, 0xdb, 0xaf, 0x7d, 0x7a, 0x89, 0x8d, 0x94, 0x4e, 0x5d, 0x67, + 0x33, 0x57, 0x9e, 0x8d, 0x4d, 0x87, 0x9c, 0xa7, 0xb3, 0x7e, 0x4a, 0x5b, + 0xcd, 0x82, 0x3f, 0x30, 0x31, 0x26, 0x21, 0x29, 0x01, 0x10, 0x4d, 0x61, + 0x35, 0x32, 0x40, 0x23, 0x48, 0x2b, 0x11, 0x12, 0x28, 0x48, 0x6a, 0x83, + 0x9a, 0x75, 0x7e, 0x44, 0x32, 0x79, 0x72, 0x4b, 0x1c, 0x42, 0x63, 0x6c, + 0x6e, 0x75, 0x77, 0x71, 0x76, 0x74, 0x71, 0x6f, 0x6d, 0x6c, 0x6b, 0x6b, + 0x6b, 0x67, 0x65, 0x6a, 0x73, 0x78, 0x76, 0x72, 0x6d, 0x6d, 0x6d, 0x6c, + 0x6c, 0x6b, 0x6b, 0x6b, 0x67, 0x6a, 0x6c, 0x6a, 0x66, 0x61, 0x5e, 0x5e, + 0x81, 0x79, 0x6f, 0x6b, 0x6d, 0x6d, 0x6a, 0x66, 0x57, 0x3a, 0x2f, 0x3f, + 0x43, 0x34, 0x34, 0x47, 0x4a, 0x2e, 0x12, 0x24, 0x6c, 0xb5, 0xc3, 0xab, + 0xe6, 0xd4, 0xed, 0xe8, 0x9a, 0x7b, 0xb3, 0xe7, 0xf8, 0xae, 0x72, 0xaa, + 0xff, 0xec, 0xab, 0xad, 0xc6, 0xdc, 0xbd, 0x72, 0x53, 0x69, 0x68, 0x46, + 0x6c, 0x38, 0x40, 0x8c, 0xa8, 0x6d, 0x34, 0x2b, 0x59, 0x6a, 0x5f, 0x41, + 0x46, 0x68, 0x6d, 0x55, 0x3c, 0x61, 0x7d, 0x7a, 0x6d, 0x64, 0x56, 0x45, + 0x09, 0x28, 0x49, 0x51, 0x44, 0x37, 0x3b, 0x45, 0x64, 0x4d, 0x4c, 0x41, + 0x26, 0x3a, 0x66, 0x6f, 0xb5, 0x78, 0x5e, 0x67, 0x5d, 0x4e, 0x46, 0x3b, + 0x44, 0x2f, 0x29, 0x33, 0x2c, 0x15, 0x11, 0x20, 0x17, 0x1c, 0x30, 0x2a, + 0x44, 0x43, 0x09, 0x12, 0x5e, 0x56, 0x4d, 0x4d, 0x56, 0x60, 0x67, 0x69, + 0x2b, 0x48, 0x5e, 0x52, 0x3a, 0x41, 0x71, 0xa1, 0x95, 0x83, 0x72, 0x6f, + 0x74, 0x71, 0x5f, 0x4d, 0x10, 0x9c, 0xff, 0xf7, 0xa2, 0x8b, 0xc8, 0xff, + 0xff, 0xbe, 0x65, 0x4e, 0x63, 0x40, 0x13, 0x1d, 0x98, 0xbc, 0xb4, 0x7a, + 0x5a, 0x67, 0x63, 0x45, 0x53, 0x31, 0x3c, 0x84, 0xbd, 0xb4, 0x8f, 0x7b, + 0x8e, 0xa3, 0xa7, 0x82, 0x4f, 0x40, 0x62, 0x8d, 0x6d, 0x65, 0x52, 0x47, + 0x55, 0x68, 0x5e, 0x45, 0x51, 0x67, 0xc9, 0xd6, 0x51, 0x0d, 0x3b, 0x59, + 0x44, 0x3a, 0x54, 0x9c, 0xdb, 0xe9, 0xd4, 0xc0, 0xb6, 0xbd, 0xde, 0xac, + 0x92, 0x9b, 0x68, 0x5f, 0x65, 0x63, 0x61, 0x57, 0x6b, 0xa9, 0xaa, 0x64, + 0x66, 0x71, 0x95, 0xc5, 0xd5, 0xb8, 0x8d, 0x75, 0x4d, 0x2a, 0x40, 0x59, + 0x4b, 0x67, 0x94, 0x90, 0x4d, 0xa3, 0xb0, 0x3e, 0x06, 0x6d, 0xb5, 0x85, + 0xc5, 0xb2, 0xaf, 0xb3, 0x8e, 0x49, 0x1f, 0x1d, 0x45, 0x63, 0x7f, 0x97, + 0xbd, 0xdd, 0xd1, 0xaf, 0xeb, 0xfc, 0xd5, 0x69, 0x12, 0x16, 0x5d, 0x99, + 0x91, 0x59, 0x23, 0x22, 0x30, 0x2e, 0x53, 0x9b, 0xd3, 0xef, 0xe1, 0xc7, + 0xc3, 0xb0, 0xa6, 0xc0, 0xe3, 0x97, 0x54, 0x4a, 0x57, 0x5d, 0x67, 0x79, + 0x14, 0x6f, 0xd4, 0xb5, 0x40, 0x24, 0x3b, 0x26, 0x5b, 0x53, 0x40, 0x56, + 0xb7, 0xff, 0xce, 0x5d, 0x55, 0x55, 0x69, 0xa6, 0xfd, 0xfb, 0xba, 0xbb, + 0xc2, 0xb8, 0x9f, 0x86, 0x84, 0x8d, 0x85, 0x72, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7d, 0x7c, 0x7b, 0x7a, 0x73, 0x6d, 0x67, 0x67, 0x6b, 0x6b, 0x65, 0x5f, + 0x66, 0x67, 0x68, 0x69, 0x6b, 0x6d, 0x6e, 0x6e, 0x68, 0x6e, 0x6f, 0x64, + 0x53, 0x4a, 0x4e, 0x55, 0x69, 0x61, 0x57, 0x52, 0x53, 0x53, 0x50, 0x4b, + 0x48, 0x41, 0x35, 0x2b, 0x2b, 0x32, 0x37, 0x36, 0x26, 0x22, 0x38, 0x69, + 0x93, 0xa3, 0xa8, 0xad, 0xce, 0xa2, 0xa6, 0xb2, 0x8f, 0x7d, 0x83, 0x77, + 0xc5, 0xc1, 0x94, 0x8b, 0xb9, 0xa4, 0x4e, 0x1e, 0x3f, 0x68, 0x81, 0x6f, + 0x55, 0x4f, 0x54, 0x55, 0x36, 0x12, 0x1e, 0x5e, 0x7a, 0x59, 0x43, 0x4f, + 0x47, 0x6c, 0x67, 0x48, 0x69, 0xab, 0x9e, 0x57, 0x7a, 0x6a, 0x92, 0xd6, + 0xcf, 0x8a, 0x79, 0xa2, 0xe6, 0xa1, 0x4a, 0x18, 0x18, 0x2f, 0x41, 0x46, + 0x4a, 0x2f, 0x2c, 0x2c, 0x2c, 0x69, 0xbc, 0xde, 0xcc, 0xc1, 0xaa, 0xa2, + 0x9a, 0x6d, 0x45, 0x48, 0x83, 0x69, 0x52, 0x47, 0x3a, 0x2b, 0x2e, 0x3e, + 0x4a, 0x46, 0x4d, 0x3d, 0x54, 0x56, 0x22, 0x31, 0x4d, 0x4a, 0x5a, 0x86, + 0xb2, 0xb7, 0x92, 0x69, 0x55, 0x58, 0x62, 0x70, 0x7a, 0x79, 0x6b, 0x5f, + 0x7b, 0x81, 0x82, 0x78, 0x67, 0x5d, 0x5f, 0x65, 0xa4, 0xac, 0xac, 0xa1, + 0x96, 0x8f, 0x84, 0x77, 0x5d, 0x91, 0x8f, 0x79, 0x8e, 0x94, 0x7d, 0x76, + 0x72, 0x78, 0x6d, 0x4f, 0x3a, 0x3d, 0x4b, 0x53, 0x77, 0x97, 0x95, 0x68, + 0x51, 0x6b, 0x8b, 0x94, 0x68, 0x5a, 0x4f, 0x57, 0x65, 0x63, 0x4c, 0x34, + 0x57, 0x7b, 0x7a, 0x47, 0x27, 0x30, 0x34, 0x24, 0x64, 0xd2, 0xeb, 0x72, + 0x4c, 0xd7, 0xff, 0xae, 0x7e, 0x5a, 0x6a, 0xbc, 0xf4, 0xde, 0xad, 0x94, + 0xe5, 0x76, 0x3b, 0x16, 0x38, 0x6e, 0x5f, 0x78, 0x84, 0x73, 0xb7, 0xe9, + 0xc1, 0xa8, 0x90, 0x4a, 0x22, 0x4f, 0x8b, 0xb4, 0xbe, 0xad, 0x8d, 0x74, + 0x99, 0x5e, 0x08, 0x00, 0x2e, 0x29, 0x2b, 0x69, 0xa8, 0xc4, 0xa9, 0x69, + 0x7d, 0xd6, 0xd3, 0x78, 0x66, 0x1f, 0x28, 0x9e, 0xec, 0xd1, 0xa8, 0xa8, + 0xc9, 0x90, 0x46, 0x30, 0x6f, 0xc6, 0xe2, 0xcd, 0xd1, 0x96, 0x5d, 0x63, + 0x99, 0xb6, 0x8d, 0x51, 0x61, 0x6c, 0x34, 0x1a, 0x3e, 0x34, 0x46, 0xa9, + 0xee, 0xd0, 0xb1, 0xab, 0xa6, 0x85, 0x71, 0x7c, 0x64, 0x45, 0x3a, 0x51, + 0x68, 0x75, 0x93, 0xb8, 0xf3, 0xec, 0x9c, 0x5f, 0x6f, 0x5c, 0x1a, 0x00, + 0x4f, 0x84, 0x91, 0x6f, 0x72, 0x9d, 0x9c, 0x70, 0x55, 0x47, 0x39, 0xaf, + 0xf9, 0xf8, 0xff, 0xdd, 0x9d, 0x6c, 0x47, 0x4f, 0x67, 0x6c, 0x62, 0x5a, + 0x79, 0x7b, 0x7d, 0x80, 0x80, 0x7f, 0x7d, 0x7c, 0x7b, 0x76, 0x72, 0x74, + 0x79, 0x7b, 0x77, 0x72, 0x5c, 0x5f, 0x65, 0x6c, 0x74, 0x7c, 0x81, 0x84, + 0x8a, 0x88, 0x80, 0x73, 0x66, 0x62, 0x67, 0x6e, 0x6c, 0x63, 0x58, 0x54, + 0x54, 0x53, 0x4f, 0x4a, 0x3c, 0x3a, 0x32, 0x31, 0x3f, 0x4b, 0x3f, 0x29, + 0xa4, 0xd9, 0xff, 0xff, 0xe0, 0xbe, 0xbb, 0xc8, 0xc7, 0xa4, 0xbc, 0xca, + 0x7d, 0x37, 0x3a, 0x4d, 0x62, 0x7d, 0x43, 0x00, 0x17, 0x3c, 0x3a, 0x39, + 0x33, 0x1f, 0x4c, 0x97, 0x89, 0x32, 0x18, 0x44, 0x48, 0x3a, 0x43, 0x5a, + 0x4e, 0x2b, 0x2d, 0x4d, 0x51, 0x67, 0x56, 0x2b, 0x2c, 0x4a, 0x37, 0x00, + 0x36, 0x3c, 0x38, 0x30, 0x48, 0x88, 0xcf, 0xf9, 0xf9, 0xc1, 0x81, 0x64, + 0x69, 0x6e, 0x5d, 0x47, 0x65, 0x4e, 0x50, 0x4e, 0x44, 0x6e, 0xae, 0xc3, + 0x7e, 0xae, 0xb0, 0xa3, 0x9c, 0x5a, 0x1d, 0x29, 0x6f, 0x5b, 0x43, 0x33, + 0x2b, 0x2b, 0x37, 0x44, 0x46, 0x4e, 0x65, 0x5d, 0x6c, 0x59, 0x0c, 0x0a, + 0x4b, 0x53, 0x64, 0x7a, 0x8c, 0x92, 0x8e, 0x87, 0x69, 0x53, 0x3f, 0x42, + 0x59, 0x73, 0x80, 0x81, 0x79, 0x97, 0xa8, 0x8d, 0x5a, 0x3e, 0x50, 0x6e, + 0x64, 0x4b, 0x47, 0x6d, 0x94, 0x92, 0x68, 0x40, 0x43, 0x7e, 0x8c, 0x8d, + 0xb4, 0xbc, 0x96, 0x81, 0x31, 0x28, 0x37, 0x54, 0x54, 0x44, 0x57, 0x7f, + 0x88, 0x6d, 0x33, 0x07, 0x21, 0x64, 0x83, 0x78, 0x36, 0x16, 0x05, 0x25, + 0x5c, 0x73, 0x55, 0x2c, 0x32, 0x6e, 0x8e, 0x74, 0x55, 0x4a, 0x2e, 0x07, + 0x7b, 0xb7, 0x92, 0x47, 0x5f, 0x93, 0x84, 0x5f, 0x90, 0x75, 0x73, 0x8a, + 0x8c, 0x88, 0xb4, 0xf5, 0xee, 0x5c, 0x2c, 0x3e, 0x6b, 0x69, 0x2c, 0x41, + 0x7a, 0x45, 0x8a, 0xd5, 0x93, 0x4e, 0x59, 0x66, 0x76, 0x9c, 0x8d, 0x41, + 0x19, 0x31, 0x43, 0x36, 0x81, 0xd1, 0xc7, 0x82, 0x6e, 0x67, 0x62, 0x7b, + 0x42, 0x6d, 0x96, 0x92, 0x5e, 0x38, 0x70, 0xd2, 0xb6, 0x9f, 0xba, 0xe9, + 0xc8, 0x77, 0x75, 0xb5, 0xa7, 0xbd, 0xce, 0xdb, 0xec, 0xe5, 0xa7, 0x60, + 0x00, 0x2e, 0x8c, 0xad, 0x89, 0x5e, 0x62, 0x80, 0x64, 0x68, 0x9b, 0x8f, + 0x4b, 0x70, 0xb4, 0xa0, 0xb2, 0x63, 0x4e, 0x83, 0x9b, 0x80, 0x6c, 0x6e, + 0x50, 0x4d, 0x5c, 0x71, 0x74, 0x78, 0xa6, 0xe0, 0xeb, 0xe9, 0xc1, 0xb3, + 0xc1, 0x9a, 0x7d, 0xa3, 0x66, 0x78, 0x70, 0x45, 0x21, 0x27, 0x46, 0x5d, + 0x20, 0x56, 0x46, 0x45, 0x1d, 0x16, 0x6f, 0x6c, 0x28, 0x28, 0x38, 0x53, + 0x61, 0x61, 0x6a, 0x7b, 0x71, 0x75, 0x7b, 0x80, 0x82, 0x81, 0x7e, 0x7c, + 0x77, 0x6f, 0x65, 0x60, 0x5e, 0x5a, 0x50, 0x48, 0x55, 0x58, 0x5e, 0x65, + 0x6d, 0x74, 0x7a, 0x7d, 0x76, 0x72, 0x6e, 0x6f, 0x70, 0x6d, 0x63, 0x5a, + 0x7a, 0x70, 0x65, 0x60, 0x5f, 0x5e, 0x59, 0x54, 0x41, 0x33, 0x26, 0x27, + 0x30, 0x35, 0x31, 0x2b, 0x4c, 0x72, 0x7c, 0x6c, 0x84, 0xbb, 0xc5, 0xa6, + 0x7a, 0x00, 0x00, 0x33, 0x69, 0x61, 0x52, 0x42, 0x5c, 0x50, 0x48, 0x7f, + 0xbb, 0x9b, 0x76, 0x97, 0x58, 0x22, 0x2e, 0x7c, 0x8f, 0x54, 0x3c, 0x5d, + 0x61, 0x47, 0x3c, 0x4a, 0x50, 0x43, 0x3a, 0x3e, 0x26, 0x3b, 0x4d, 0x4d, + 0x41, 0x3a, 0x3c, 0x40, 0x28, 0x38, 0x32, 0x1b, 0x28, 0x64, 0x9e, 0xb7, + 0x9a, 0xbd, 0xd9, 0xcc, 0x9e, 0x79, 0x75, 0x81, 0x90, 0x7a, 0x7b, 0x73, + 0x5a, 0x70, 0x9d, 0xa6, 0x94, 0xb8, 0xa7, 0x95, 0xa1, 0x72, 0x2b, 0x20, + 0x2a, 0x34, 0x3e, 0x42, 0x45, 0x48, 0x44, 0x3d, 0x1c, 0x4a, 0x98, 0xb8, + 0xcb, 0x95, 0x16, 0x00, 0xb5, 0xd2, 0xe2, 0xc3, 0x89, 0x69, 0x76, 0x92, + 0x5e, 0x5e, 0x55, 0x41, 0x33, 0x3c, 0x5a, 0x77, 0xc6, 0xdf, 0xeb, 0xcc, + 0x97, 0x78, 0x84, 0x9e, 0x63, 0x62, 0x6d, 0x76, 0x6b, 0x6b, 0x9e, 0xde, + 0xe4, 0xb8, 0x7d, 0x7c, 0x92, 0x5f, 0x1b, 0x14, 0x29, 0x27, 0x39, 0x4e, + 0x3f, 0x1b, 0x14, 0x29, 0x22, 0x3b, 0x6a, 0x84, 0x63, 0x35, 0x42, 0x71, + 0x4b, 0x43, 0x3d, 0x45, 0x5c, 0x79, 0x92, 0xa0, 0x5a, 0x62, 0x68, 0x70, + 0x83, 0x8c, 0x72, 0x4c, 0x6a, 0x6d, 0x4b, 0x54, 0x71, 0x3f, 0x32, 0x8d, + 0xa4, 0x80, 0x5c, 0x4e, 0x4f, 0x64, 0x95, 0xc5, 0x99, 0x54, 0x72, 0x90, + 0x93, 0x69, 0x24, 0x43, 0x9c, 0x50, 0x50, 0x7d, 0x64, 0x48, 0x87, 0xde, + 0xbd, 0xef, 0xd1, 0x58, 0x0c, 0x20, 0x39, 0x2c, 0x00, 0x1f, 0x6b, 0x82, + 0x55, 0x5a, 0x7b, 0x6d, 0x64, 0x6d, 0x4d, 0x44, 0x80, 0xaf, 0xaf, 0xae, + 0xaf, 0x7f, 0x69, 0x83, 0x92, 0x78, 0x57, 0x4b, 0x8a, 0xa5, 0x9e, 0x66, + 0x39, 0x3d, 0x56, 0x64, 0xb1, 0xa3, 0xa1, 0xa4, 0x90, 0x73, 0x74, 0x8b, + 0x52, 0x89, 0xb3, 0x9e, 0x82, 0x96, 0x9f, 0x7e, 0x61, 0x24, 0x2e, 0x6c, + 0x7e, 0x77, 0x69, 0x4e, 0x80, 0x73, 0x74, 0x80, 0x81, 0x8a, 0xbd, 0xfa, + 0xff, 0x9d, 0x87, 0xb3, 0xb9, 0xb8, 0xb5, 0x96, 0x78, 0x4e, 0x3e, 0x5f, + 0x79, 0x66, 0x3f, 0x28, 0x30, 0x3e, 0x2f, 0x19, 0x34, 0x3c, 0x23, 0x3c, + 0x51, 0x6e, 0x7d, 0x70, 0x61, 0x60, 0x62, 0x5f, 0x67, 0x6d, 0x77, 0x7f, + 0x82, 0x81, 0x7e, 0x7a, 0x6b, 0x68, 0x67, 0x6d, 0x76, 0x7c, 0x7b, 0x78, + 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x82, 0x83, 0x83, 0x78, 0x7b, 0x85, 0x94, + 0x9d, 0x93, 0x79, 0x62, 0x72, 0x69, 0x5d, 0x57, 0x56, 0x54, 0x4f, 0x4a, + 0x46, 0x3c, 0x37, 0x33, 0x26, 0x18, 0x1d, 0x2c, 0x26, 0x45, 0x3c, 0x1b, + 0x36, 0x70, 0x62, 0x20, 0x82, 0x44, 0x5f, 0xa9, 0xa3, 0x7b, 0x6f, 0x6b, + 0x52, 0x65, 0x4e, 0x3a, 0x42, 0x35, 0x3d, 0x76, 0x96, 0x78, 0x47, 0x25, + 0x2d, 0x44, 0x3e, 0x24, 0x0d, 0x1c, 0x2f, 0x33, 0x26, 0x1e, 0x2b, 0x3f, + 0x44, 0x50, 0x60, 0x60, 0x43, 0x26, 0x2c, 0x45, 0x2f, 0x2c, 0x40, 0x62, + 0x6e, 0x70, 0x8e, 0xb9, 0xce, 0xce, 0xbd, 0x91, 0x63, 0x53, 0x69, 0x85, + 0x54, 0x3f, 0x42, 0x43, 0x3b, 0x67, 0xa9, 0xbf, 0xa4, 0xac, 0xa2, 0xaf, + 0xd7, 0xc8, 0x74, 0x2f, 0x29, 0x39, 0x42, 0x40, 0x49, 0x5b, 0x5f, 0x56, + 0x4f, 0x79, 0xbe, 0xd5, 0xe1, 0xa8, 0x26, 0x00, 0x93, 0xa4, 0xac, 0x98, + 0x71, 0x54, 0x51, 0x5a, 0x50, 0x39, 0x37, 0x64, 0xa5, 0xc2, 0xa9, 0x83, + 0x95, 0x97, 0x9f, 0xb1, 0xc7, 0xd9, 0xe1, 0xe3, 0xc3, 0x85, 0x5c, 0x64, + 0x65, 0x4a, 0x3d, 0x49, 0x03, 0x37, 0x60, 0x7f, 0x87, 0x6a, 0x7d, 0xcc, + 0xd1, 0xcb, 0x98, 0x47, 0x1f, 0x34, 0x51, 0x56, 0x58, 0x31, 0x2d, 0x5b, + 0x78, 0x5e, 0x37, 0x27, 0x42, 0x3d, 0x44, 0x60, 0x7f, 0x85, 0x6d, 0x52, + 0x6b, 0x4a, 0x39, 0x4a, 0x64, 0x6e, 0x74, 0x7b, 0x90, 0xbb, 0x87, 0x11, + 0x00, 0x3c, 0x71, 0x74, 0x8b, 0x7e, 0x67, 0x5f, 0x75, 0x8d, 0x81, 0x64, + 0x69, 0x76, 0xa9, 0x82, 0x5d, 0x5a, 0x3b, 0x55, 0x8c, 0x68, 0x3b, 0x45, + 0x76, 0x88, 0x9a, 0xc8, 0xac, 0xeb, 0xfd, 0xba, 0x6d, 0x58, 0x60, 0x64, + 0x5f, 0x20, 0x34, 0x64, 0x4a, 0x31, 0x3f, 0x41, 0x3d, 0x77, 0x51, 0x20, + 0x68, 0xaf, 0x8d, 0x55, 0x4a, 0x69, 0x7c, 0x83, 0xa0, 0xc7, 0xc8, 0xad, + 0x3f, 0x8a, 0xca, 0xd1, 0xbf, 0xb7, 0xae, 0xa1, 0xaf, 0xa7, 0xaf, 0xb4, + 0x8f, 0x5e, 0x63, 0x8b, 0x79, 0xa8, 0x84, 0x7a, 0xbb, 0x9c, 0x49, 0x4a, + 0x50, 0x80, 0xd3, 0xeb, 0xcb, 0xcc, 0xad, 0x4f, 0x65, 0x3f, 0x31, 0x4d, + 0x69, 0x6e, 0x74, 0x83, 0x34, 0x06, 0x05, 0x08, 0x00, 0x40, 0xa8, 0xd0, + 0x51, 0x42, 0x44, 0x58, 0x59, 0x4a, 0x4b, 0x5c, 0x4c, 0x24, 0x42, 0x33, + 0x3d, 0x83, 0x72, 0x46, 0x3e, 0x51, 0x61, 0x6a, 0x75, 0x77, 0x60, 0x41, + 0x53, 0x5a, 0x66, 0x70, 0x75, 0x74, 0x6f, 0x6c, 0x7a, 0x75, 0x70, 0x71, + 0x75, 0x77, 0x72, 0x6c, 0x68, 0x68, 0x67, 0x67, 0x66, 0x66, 0x66, 0x65, + 0x6e, 0x76, 0x82, 0x8c, 0x8c, 0x82, 0x71, 0x65, 0x75, 0x6b, 0x5f, 0x59, + 0x57, 0x55, 0x4f, 0x4a, 0x43, 0x43, 0x44, 0x40, 0x2f, 0x1f, 0x1e, 0x27, + 0x02, 0x2b, 0x3d, 0x2d, 0x28, 0x39, 0x37, 0x21, 0x27, 0x2c, 0x66, 0x9f, + 0xae, 0xac, 0x76, 0x19, 0x00, 0x72, 0x91, 0x60, 0x50, 0x48, 0x32, 0x30, + 0x5b, 0x71, 0x5e, 0x33, 0x40, 0x7e, 0x96, 0x7d, 0x7f, 0xa3, 0xbd, 0xaa, + 0x7f, 0x64, 0x67, 0x74, 0x6a, 0x65, 0x4b, 0x31, 0x44, 0x86, 0xc8, 0xe7, + 0xc5, 0xea, 0xc7, 0x66, 0x4c, 0x88, 0xa6, 0x8b, 0x89, 0x6d, 0x50, 0x49, + 0x55, 0x5c, 0x52, 0x44, 0x35, 0x1b, 0x1a, 0x15, 0x0b, 0x36, 0x79, 0x90, + 0x6d, 0x73, 0x89, 0x99, 0xa1, 0xa2, 0x6e, 0x1b, 0x37, 0x42, 0x3a, 0x24, + 0x26, 0x41, 0x4c, 0x43, 0x64, 0x6d, 0x83, 0x77, 0x7f, 0x61, 0x09, 0x00, + 0x8c, 0x6b, 0x57, 0x75, 0xb6, 0xe9, 0xf3, 0xe8, 0x9e, 0xa2, 0xaf, 0xc2, + 0xd0, 0xcd, 0xbb, 0xaa, 0x5a, 0x38, 0x28, 0x4d, 0x90, 0xb6, 0xa5, 0x84, + 0x8b, 0x5f, 0x49, 0x4f, 0x3e, 0x21, 0x32, 0x63, 0x17, 0x53, 0x51, 0x2c, + 0x3f, 0x70, 0xa8, 0xe3, 0xde, 0xff, 0xd1, 0x55, 0x32, 0x79, 0x9b, 0x79, + 0x57, 0x54, 0x41, 0x3c, 0x62, 0x8c, 0x7a, 0x47, 0x36, 0x5f, 0x7a, 0x5f, + 0x2a, 0x19, 0x41, 0x72, 0x6c, 0x66, 0x7b, 0x98, 0x89, 0x62, 0x68, 0x8f, + 0x6f, 0x47, 0x70, 0x99, 0x72, 0x65, 0x7e, 0x76, 0x3f, 0x72, 0x80, 0x52, + 0x29, 0x25, 0x1d, 0x06, 0x41, 0x82, 0xb7, 0x63, 0x47, 0x89, 0x82, 0x7c, + 0x52, 0x72, 0x4a, 0x4a, 0xaf, 0xc6, 0x74, 0x41, 0xa3, 0xc8, 0xe0, 0xbf, + 0x73, 0x43, 0x58, 0x86, 0x9a, 0xcf, 0xb2, 0x6b, 0x50, 0x31, 0x14, 0x22, + 0x62, 0x5b, 0x44, 0x69, 0xa1, 0x69, 0x1a, 0x21, 0x72, 0x80, 0x66, 0x4c, + 0x7c, 0xb5, 0x78, 0x00, 0x52, 0x5b, 0x58, 0x55, 0x6d, 0x8c, 0x88, 0x6b, + 0xb5, 0xa2, 0xac, 0xc9, 0xba, 0x85, 0x72, 0x86, 0xfb, 0x8f, 0x7c, 0xb5, + 0xc0, 0xa6, 0x6b, 0x19, 0x4e, 0xb7, 0xff, 0xcb, 0x87, 0xcc, 0xee, 0x91, + 0x73, 0x3b, 0x25, 0x53, 0x7e, 0x67, 0x26, 0x00, 0x59, 0x79, 0x57, 0x3e, + 0x72, 0x86, 0x5d, 0x48, 0x65, 0x4c, 0x3b, 0x48, 0x64, 0x70, 0x65, 0x55, + 0x5b, 0x4a, 0x30, 0x3a, 0x6c, 0x7f, 0x62, 0x4a, 0x2b, 0x25, 0x38, 0x64, + 0x85, 0x84, 0x75, 0x6c, 0x5d, 0x65, 0x72, 0x7d, 0x83, 0x82, 0x7d, 0x79, + 0x7d, 0x77, 0x70, 0x70, 0x72, 0x72, 0x6b, 0x65, 0x67, 0x68, 0x6a, 0x6d, + 0x70, 0x72, 0x74, 0x75, 0x6f, 0x75, 0x77, 0x70, 0x65, 0x60, 0x66, 0x6e, + 0x73, 0x69, 0x5d, 0x56, 0x54, 0x52, 0x4c, 0x46, 0x41, 0x3b, 0x31, 0x2a, + 0x2a, 0x2c, 0x2a, 0x25, 0x4d, 0x39, 0x22, 0x16, 0x10, 0x16, 0x2b, 0x42, + 0x1f, 0x7f, 0xd4, 0xc2, 0xa0, 0xc9, 0xca, 0x77, 0x9b, 0x8a, 0x6d, 0x86, + 0xaf, 0x81, 0x3f, 0x40, 0x4b, 0x69, 0x82, 0x7e, 0x6a, 0x61, 0x65, 0x6c, + 0x3c, 0x30, 0x28, 0x38, 0x59, 0x61, 0x36, 0x00, 0x0f, 0x2a, 0x1e, 0x06, + 0x3a, 0x9c, 0xba, 0x95, 0x8d, 0x9e, 0x9a, 0x74, 0x49, 0x2c, 0x13, 0x00, + 0x23, 0x25, 0x29, 0x30, 0x33, 0x30, 0x26, 0x1f, 0x35, 0x20, 0x24, 0x20, + 0x0e, 0x2d, 0x61, 0x6e, 0x8b, 0x8d, 0xa0, 0x7b, 0x36, 0x3c, 0x4f, 0x25, + 0x49, 0x62, 0x67, 0x54, 0x4d, 0x53, 0x44, 0x25, 0x39, 0x3e, 0x50, 0x47, + 0x5c, 0x54, 0x13, 0x18, 0xb1, 0x9c, 0x8e, 0x9e, 0xc0, 0xd5, 0xcf, 0xc0, + 0xe2, 0xc5, 0x9e, 0x81, 0x75, 0x75, 0x77, 0x78, 0x71, 0x93, 0xac, 0x9d, + 0x7c, 0x78, 0x9f, 0xcb, 0xb6, 0xc3, 0xad, 0x60, 0x0e, 0x07, 0x55, 0xa8, + 0x63, 0x74, 0x90, 0xa8, 0xaa, 0x8d, 0x5f, 0x3c, 0x93, 0x82, 0x75, 0x79, + 0x80, 0x73, 0x4e, 0x2d, 0x60, 0x53, 0x4d, 0x5b, 0x6f, 0x6e, 0x53, 0x37, + 0x5e, 0x48, 0x50, 0x73, 0x7e, 0x76, 0x90, 0xbf, 0xb2, 0x99, 0x5f, 0x34, + 0x55, 0xa7, 0xd3, 0xce, 0xc6, 0xda, 0xdf, 0xbc, 0x7d, 0x49, 0x38, 0x3d, + 0x24, 0x29, 0x36, 0x52, 0x7b, 0xae, 0xdc, 0xf7, 0xd6, 0xa4, 0x67, 0x46, + 0x42, 0x46, 0x3d, 0x30, 0x13, 0x33, 0x64, 0x94, 0xb1, 0xb4, 0xa6, 0x98, + 0x17, 0x46, 0x88, 0xa4, 0x82, 0x60, 0x85, 0xc8, 0xff, 0xc2, 0x78, 0x5a, + 0x67, 0x78, 0x6f, 0x5c, 0x8a, 0x4b, 0x77, 0xe6, 0xca, 0x3e, 0x2c, 0x91, + 0xc3, 0x74, 0x1a, 0x00, 0x29, 0x5e, 0x6d, 0x5f, 0x19, 0x5d, 0xa0, 0xa6, + 0x80, 0x6f, 0x93, 0xc2, 0xe5, 0xd9, 0xca, 0xc0, 0xb6, 0xa6, 0x90, 0x7e, + 0x31, 0x5f, 0x7a, 0x7a, 0x8f, 0xb3, 0xa8, 0x7c, 0x4a, 0x6e, 0x99, 0xb5, + 0xc8, 0xd6, 0xd9, 0xd3, 0x7e, 0x6f, 0x4f, 0x28, 0x18, 0x35, 0x76, 0xac, + 0xc9, 0xc3, 0xc1, 0xc3, 0xbc, 0x9b, 0x67, 0x3d, 0x8d, 0x74, 0x57, 0x4b, + 0x51, 0x5a, 0x5c, 0x59, 0x43, 0x2c, 0x39, 0x54, 0x53, 0x48, 0x31, 0x0e, + 0x2e, 0x38, 0x48, 0x59, 0x65, 0x6a, 0x6b, 0x6a, 0x5e, 0x6c, 0x7b, 0x82, + 0x7d, 0x76, 0x72, 0x72, 0x7a, 0x74, 0x70, 0x73, 0x7a, 0x7e, 0x79, 0x74, + 0x6b, 0x6f, 0x76, 0x7a, 0x7c, 0x7a, 0x76, 0x73, 0x87, 0x82, 0x79, 0x70, + 0x6a, 0x68, 0x68, 0x68, 0x69, 0x63, 0x5d, 0x5d, 0x60, 0x60, 0x5a, 0x54, + 0x54, 0x49, 0x70, 0xba, 0xf1, 0xb7, 0x45, 0x2d, 0x2d, 0x31, 0x36, 0x39, + 0x39, 0x36, 0x31, 0x2d, 0x4b, 0x8a, 0x98, 0x73, 0x83, 0xc3, 0xc5, 0x8c, + 0x51, 0x1f, 0x1b, 0x49, 0x4d, 0x24, 0x2d, 0x62, 0x88, 0x64, 0x60, 0x7a, + 0x6a, 0x2f, 0x16, 0x27, 0x5a, 0xa8, 0xeb, 0xde, 0x9a, 0x77, 0x9d, 0xd5, + 0x3a, 0x34, 0x15, 0x07, 0x49, 0xae, 0xd1, 0xb5, 0x8f, 0xbb, 0xe0, 0xb7, + 0x4c, 0x1d, 0x82, 0xff, 0xe8, 0x9b, 0x5c, 0x54, 0x53, 0x3f, 0x39, 0x46, + 0x26, 0x13, 0x11, 0x23, 0x27, 0x1d, 0x21, 0x33, 0x45, 0x29, 0x1e, 0x2f, + 0x3b, 0x32, 0x27, 0x28, 0x3b, 0x5b, 0x77, 0x72, 0x51, 0x34, 0x2f, 0x38, + 0x35, 0x3c, 0x42, 0x40, 0x36, 0x2a, 0x22, 0x1f, 0xad, 0x8e, 0x70, 0x71, + 0x8e, 0xad, 0xbc, 0xbc, 0x4b, 0x47, 0x60, 0xa4, 0xed, 0xff, 0xde, 0xad, + 0xb7, 0xa0, 0x86, 0x7a, 0x7f, 0x88, 0x8a, 0x88, 0xbc, 0xe9, 0xff, 0xff, + 0xf2, 0xb1, 0x7c, 0x62, 0x49, 0x65, 0x8f, 0xb2, 0xb8, 0x9d, 0x71, 0x4f, + 0x41, 0x69, 0xa8, 0xdc, 0xe5, 0xb9, 0x6e, 0x36, 0x39, 0x68, 0xa8, 0xcf, + 0xc8, 0x99, 0x5d, 0x36, 0x67, 0x5f, 0x39, 0x13, 0x24, 0x56, 0x5d, 0x3e, + 0x70, 0x7d, 0xa0, 0xcf, 0xea, 0xe4, 0xcf, 0xc0, 0xc5, 0xc4, 0xb3, 0x8a, + 0x5d, 0x44, 0x49, 0x58, 0x94, 0x87, 0x78, 0x77, 0x8b, 0xb3, 0xdf, 0xfb, + 0xce, 0x97, 0x58, 0x3a, 0x3d, 0x3c, 0x26, 0x0d, 0x91, 0x9a, 0xb1, 0xd0, + 0xe5, 0xe0, 0xc3, 0xa8, 0x55, 0x4b, 0x4e, 0x53, 0x3f, 0x27, 0x39, 0x62, + 0x6c, 0x4e, 0x31, 0x30, 0x47, 0x58, 0x54, 0x47, 0x1c, 0x2a, 0x46, 0x54, + 0x3a, 0x1e, 0x37, 0x69, 0x5f, 0x66, 0x64, 0x63, 0x78, 0x8f, 0x84, 0x65, + 0xc0, 0xad, 0x95, 0x89, 0x8e, 0x9d, 0xac, 0xb5, 0xd1, 0xdb, 0xd5, 0xae, + 0x79, 0x5c, 0x63, 0x78, 0x8a, 0x85, 0x85, 0x89, 0x85, 0x81, 0x8a, 0x9b, + 0x65, 0x3d, 0x50, 0xaf, 0xf4, 0xdc, 0x9a, 0x70, 0xbc, 0x81, 0x38, 0x10, + 0x19, 0x3b, 0x58, 0x66, 0x76, 0x53, 0x2b, 0x1d, 0x2c, 0x46, 0x56, 0x5b, + 0x37, 0x71, 0xa2, 0x92, 0x5d, 0x4a, 0x74, 0xaa, 0x51, 0x34, 0x2d, 0x3c, + 0x3b, 0x2c, 0x26, 0x27, 0x36, 0x3f, 0x4e, 0x5d, 0x67, 0x6b, 0x6a, 0x69, + 0x67, 0x72, 0x7d, 0x7e, 0x75, 0x69, 0x63, 0x61, 0x82, 0x7c, 0x78, 0x7b, + 0x81, 0x84, 0x80, 0x7a, 0x61, 0x68, 0x72, 0x7c, 0x82, 0x84, 0x83, 0x81, + 0x79, 0x79, 0x79, 0x77, 0x73, 0x6d, 0x67, 0x63, 0x61, 0x5b, 0x55, 0x55, + 0x58, 0x57, 0x51, 0x4b, 0x46, 0x52, 0x78, 0x96, 0xc0, 0xc5, 0x87, 0x67, + 0x63, 0x55, 0x3f, 0x28, 0x18, 0x11, 0x10, 0x12, 0x23, 0x52, 0x88, 0xa3, + 0xa6, 0x9f, 0x93, 0x88, 0x30, 0x4c, 0x55, 0x46, 0x41, 0x48, 0x38, 0x19, + 0x48, 0x61, 0x7d, 0x78, 0x50, 0x3c, 0x6a, 0xad, 0xe3, 0xf5, 0xf9, 0xd7, + 0x9a, 0x65, 0x51, 0x51, 0x48, 0x28, 0x0f, 0x31, 0x8d, 0xd9, 0xd4, 0xa6, + 0x92, 0x90, 0x9e, 0xb6, 0xc2, 0xc4, 0xd1, 0xe5, 0xd1, 0xbb, 0xb1, 0xac, + 0x87, 0x4f, 0x39, 0x47, 0x0c, 0x57, 0xbe, 0xda, 0x7e, 0x11, 0x10, 0x54, + 0x1c, 0x28, 0x26, 0x23, 0x40, 0x5f, 0x49, 0x17, 0x2f, 0x4b, 0x6d, 0x7e, + 0x75, 0x5c, 0x43, 0x35, 0x2d, 0x2e, 0x2e, 0x29, 0x21, 0x1a, 0x16, 0x15, + 0xd7, 0xaa, 0x6f, 0x4a, 0x45, 0x52, 0x60, 0x66, 0x5f, 0x67, 0x69, 0x59, + 0x41, 0x39, 0x45, 0x56, 0x83, 0x84, 0x7a, 0x62, 0x50, 0x5a, 0x7f, 0xa1, + 0xfd, 0xc5, 0x7d, 0x4f, 0x45, 0x4a, 0x4b, 0x47, 0x8b, 0x94, 0xa1, 0xae, + 0xb8, 0xc0, 0xc5, 0xc8, 0xee, 0xf2, 0xf0, 0xe1, 0xcb, 0xbb, 0xb7, 0xba, + 0xd8, 0xde, 0xd0, 0xa1, 0x62, 0x3a, 0x37, 0x44, 0x62, 0x58, 0x3c, 0x34, + 0x65, 0x9c, 0x8b, 0x51, 0x0a, 0x0c, 0x3b, 0x82, 0x9e, 0x92, 0xa2, 0xcc, + 0xd5, 0xd2, 0xc9, 0xbc, 0xb3, 0xb6, 0xc3, 0xd0, 0x78, 0x70, 0x66, 0x60, + 0x65, 0x72, 0x82, 0x8d, 0xb6, 0xa8, 0x95, 0x83, 0x73, 0x60, 0x4b, 0x3c, + 0x33, 0x54, 0x86, 0xb4, 0xd1, 0xe0, 0xe7, 0xea, 0x81, 0x48, 0x1f, 0x26, + 0x39, 0x3f, 0x4f, 0x66, 0x55, 0x4f, 0x49, 0x46, 0x45, 0x41, 0x3a, 0x33, + 0x35, 0x21, 0x29, 0x48, 0x50, 0x5d, 0xab, 0xff, 0x8b, 0x70, 0x74, 0x88, + 0x65, 0x20, 0x12, 0x37, 0x76, 0x74, 0x89, 0xbd, 0xef, 0xf4, 0xc7, 0x96, + 0x70, 0x52, 0x39, 0x42, 0x5d, 0x61, 0x41, 0x1e, 0x41, 0x2f, 0x49, 0x7d, + 0x76, 0x37, 0x15, 0x24, 0x24, 0x32, 0x82, 0xd9, 0xc2, 0x6e, 0x71, 0xbc, + 0xff, 0xdc, 0xa1, 0x7f, 0x7e, 0x87, 0x87, 0x82, 0x3f, 0x28, 0x13, 0x15, + 0x2c, 0x43, 0x4c, 0x4b, 0x0f, 0x1c, 0x2a, 0x30, 0x2f, 0x31, 0x3a, 0x43, + 0x22, 0x30, 0x3e, 0x47, 0x3f, 0x26, 0x26, 0x40, 0x74, 0x78, 0x7d, 0x7e, + 0x7a, 0x71, 0x66, 0x5f, 0x6c, 0x76, 0x80, 0x81, 0x78, 0x6e, 0x6a, 0x6a, + 0x8c, 0x86, 0x81, 0x83, 0x89, 0x8b, 0x86, 0x80, 0x75, 0x7a, 0x81, 0x86, + 0x85, 0x80, 0x78, 0x73, 0x72, 0x81, 0x96, 0xa4, 0xa2, 0x92, 0x7b, 0x6b, + 0x6e, 0x68, 0x61, 0x61, 0x63, 0x62, 0x5c, 0x55, 0x44, 0x13, 0x28, 0x59, + 0x7b, 0x7d, 0x5d, 0x57, 0x3f, 0x2e, 0x17, 0x06, 0x06, 0x16, 0x2d, 0x3d, + 0x41, 0x33, 0x54, 0x8c, 0x88, 0x59, 0x60, 0x96, 0x9d, 0x5f, 0x30, 0x27, + 0x15, 0x00, 0x11, 0x42, 0x57, 0x63, 0x5e, 0x4d, 0x5a, 0x8d, 0xbf, 0xd6, + 0xae, 0x9b, 0x8e, 0x95, 0xa5, 0xa1, 0x82, 0x64, 0x2b, 0x45, 0x81, 0xc1, + 0xd5, 0xbe, 0xa8, 0xa4, 0x7b, 0x8e, 0x91, 0x79, 0x66, 0x69, 0x74, 0x78, + 0x71, 0x88, 0xa2, 0x94, 0x53, 0x11, 0x0a, 0x27, 0x9b, 0xa8, 0xaf, 0xad, + 0xab, 0x9c, 0x6e, 0x3e, 0x3a, 0x37, 0x35, 0x31, 0x2a, 0x2f, 0x48, 0x62, + 0x7c, 0x6a, 0x52, 0x43, 0x40, 0x3f, 0x3d, 0x39, 0x22, 0x24, 0x27, 0x28, + 0x25, 0x1d, 0x12, 0x0a, 0xbc, 0x99, 0x65, 0x3a, 0x23, 0x1f, 0x25, 0x2a, + 0x08, 0x36, 0x5b, 0x4a, 0x1e, 0x15, 0x45, 0x7b, 0xc8, 0xc6, 0xad, 0x75, + 0x3c, 0x2b, 0x49, 0x6f, 0x35, 0x23, 0x17, 0x28, 0x48, 0x5b, 0x52, 0x41, + 0x6e, 0x6c, 0x63, 0x51, 0x3f, 0x3a, 0x44, 0x50, 0x34, 0x5a, 0x81, 0x86, + 0x6a, 0x47, 0x34, 0x31, 0x1b, 0x2a, 0x39, 0x3b, 0x37, 0x3d, 0x51, 0x65, + 0x41, 0x22, 0x30, 0x6f, 0x8d, 0x64, 0x2d, 0x15, 0xa2, 0xa1, 0xab, 0xae, + 0x92, 0x72, 0x7d, 0xa0, 0x98, 0x9b, 0x9c, 0x95, 0x84, 0x6d, 0x57, 0x4b, + 0xc4, 0xd0, 0xdd, 0xe1, 0xd3, 0xb5, 0x93, 0x7c, 0xa7, 0xb0, 0xae, 0x94, + 0x78, 0x7e, 0xa8, 0xd1, 0x9b, 0xa8, 0xa8, 0x90, 0x78, 0x82, 0xb4, 0xe4, + 0x7c, 0x44, 0x1e, 0x2b, 0x43, 0x4c, 0x59, 0x6d, 0x16, 0x3a, 0x69, 0x86, + 0x84, 0x6d, 0x52, 0x43, 0x40, 0x23, 0x29, 0x56, 0x6b, 0x5f, 0x69, 0x8a, + 0x81, 0x6c, 0x56, 0x4d, 0x51, 0x6e, 0xa8, 0xdd, 0xe9, 0xdd, 0xce, 0xc0, + 0xa6, 0x74, 0x31, 0x00, 0x4b, 0x21, 0x13, 0x52, 0xb1, 0xd7, 0xa7, 0x64, + 0x47, 0x9d, 0xff, 0xff, 0xb8, 0x5c, 0x63, 0xa1, 0xd5, 0x56, 0x1a, 0x71, + 0xd4, 0xcb, 0x7e, 0x48, 0x72, 0x7e, 0x81, 0x6c, 0x4b, 0x39, 0x3f, 0x4d, + 0xe2, 0xb6, 0x7f, 0x63, 0x6b, 0x86, 0x9b, 0xa5, 0x90, 0xa0, 0x9e, 0x73, + 0x36, 0x15, 0x21, 0x3a, 0x46, 0x44, 0x20, 0x01, 0x0d, 0x26, 0x40, 0x5c, + 0x68, 0x6d, 0x74, 0x78, 0x77, 0x70, 0x68, 0x62, 0x6b, 0x76, 0x82, 0x87, + 0x84, 0x82, 0x84, 0x88, 0x7c, 0x76, 0x71, 0x72, 0x77, 0x79, 0x73, 0x6d, + 0x6a, 0x72, 0x7f, 0x89, 0x8e, 0x8b, 0x85, 0x80, 0x69, 0x69, 0x69, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x73, 0x6c, 0x65, 0x64, 0x65, 0x64, 0x5d, 0x56, + 0x4d, 0x2d, 0x6f, 0xa5, 0x83, 0x4e, 0x40, 0x62, 0x54, 0x4e, 0x48, 0x4b, + 0x5a, 0x73, 0x8e, 0xa0, 0xa9, 0x48, 0x2a, 0x85, 0xd9, 0xd4, 0xb2, 0xac, + 0x84, 0x3f, 0x32, 0x63, 0x61, 0x2b, 0x36, 0x79, 0x60, 0x6e, 0x5b, 0x3d, + 0x5c, 0xa8, 0xc7, 0xb5, 0x90, 0x71, 0x5b, 0x69, 0x8b, 0x95, 0x78, 0x55, + 0x80, 0x40, 0x39, 0x8c, 0xcb, 0xaf, 0x6c, 0x47, 0x4f, 0x6f, 0x79, 0x6a, + 0x75, 0x9d, 0xab, 0x9b, 0x5a, 0x77, 0x8f, 0x82, 0x5e, 0x55, 0x7f, 0xb3, + 0xa4, 0xac, 0x9b, 0x7a, 0x75, 0x8e, 0x9c, 0x93, 0x4d, 0x24, 0x15, 0x32, + 0x49, 0x3f, 0x33, 0x35, 0x40, 0x3c, 0x38, 0x39, 0x3b, 0x39, 0x31, 0x29, + 0x28, 0x2b, 0x32, 0x3a, 0x3c, 0x30, 0x1a, 0x09, 0x4a, 0x48, 0x42, 0x39, + 0x33, 0x37, 0x42, 0x4c, 0x6d, 0x68, 0x62, 0x60, 0x63, 0x68, 0x6d, 0x70, + 0x63, 0x39, 0x10, 0x10, 0x32, 0x50, 0x54, 0x49, 0x34, 0x35, 0x36, 0x34, + 0x36, 0x40, 0x53, 0x61, 0x62, 0x82, 0xa5, 0xad, 0x97, 0x7a, 0x6a, 0x66, + 0x88, 0x87, 0x77, 0x54, 0x32, 0x2e, 0x4b, 0x69, 0x4e, 0x4e, 0x57, 0x6a, + 0x7a, 0x74, 0x59, 0x40, 0x0f, 0x12, 0x40, 0x80, 0x8a, 0x59, 0x36, 0x38, + 0x15, 0x63, 0xb0, 0xcc, 0xce, 0xce, 0xc1, 0xac, 0x29, 0x45, 0x6d, 0x8d, + 0xa1, 0xb2, 0xc3, 0xcf, 0x62, 0x7e, 0xab, 0xd3, 0xe8, 0xe8, 0xda, 0xcd, + 0x5c, 0x6b, 0x7f, 0x90, 0xa1, 0xb8, 0xd5, 0xea, 0xaf, 0xa9, 0x99, 0x7f, + 0x61, 0x48, 0x3b, 0x36, 0x18, 0x0b, 0x14, 0x30, 0x38, 0x30, 0x40, 0x5f, + 0x51, 0x51, 0x4b, 0x3f, 0x36, 0x39, 0x48, 0x57, 0x2c, 0x35, 0x18, 0x00, + 0x38, 0x93, 0x91, 0x4c, 0x37, 0x68, 0x59, 0x24, 0x54, 0xd7, 0xff, 0xe4, + 0xd1, 0xb3, 0x94, 0x8a, 0x8a, 0x79, 0x4f, 0x2a, 0x4c, 0x3c, 0x30, 0x38, + 0x50, 0x65, 0x6b, 0x68, 0x7e, 0xab, 0xb9, 0x8d, 0x60, 0x55, 0x55, 0x4f, + 0x9f, 0x99, 0x8f, 0x80, 0x69, 0x51, 0x42, 0x3e, 0x1b, 0x29, 0x31, 0x28, + 0x1a, 0x1e, 0x3a, 0x55, 0xd0, 0xb4, 0x93, 0x84, 0x86, 0x87, 0x7e, 0x72, + 0x81, 0x81, 0x84, 0x89, 0x87, 0x78, 0x60, 0x4c, 0x78, 0x63, 0x89, 0xeb, + 0xff, 0xc7, 0x6f, 0x53, 0x5a, 0x61, 0x6a, 0x71, 0x74, 0x70, 0x6a, 0x66, + 0x6e, 0x77, 0x82, 0x85, 0x83, 0x84, 0x89, 0x8f, 0x82, 0x7b, 0x75, 0x76, + 0x7a, 0x7b, 0x75, 0x6e, 0x69, 0x73, 0x81, 0x8e, 0x92, 0x8e, 0x85, 0x7f, + 0x76, 0x71, 0x6a, 0x65, 0x67, 0x6e, 0x77, 0x7e, 0x55, 0x4e, 0x47, 0x44, + 0x45, 0x43, 0x3b, 0x34, 0x3a, 0x41, 0x73, 0x6b, 0x43, 0x46, 0x49, 0x49, + 0x79, 0x78, 0x76, 0x73, 0x6f, 0x6b, 0x68, 0x66, 0x6c, 0x7a, 0x98, 0xb0, + 0xa2, 0x78, 0x5a, 0x55, 0x54, 0x59, 0x4b, 0x2f, 0x24, 0x2b, 0x29, 0x1b, + 0x1d, 0x65, 0x84, 0x5a, 0x42, 0x6d, 0xa3, 0xb7, 0xaf, 0x99, 0x80, 0x74, + 0x71, 0x69, 0x56, 0x44, 0x48, 0x30, 0x2f, 0x3c, 0x26, 0x0f, 0x3d, 0x8b, + 0x58, 0x93, 0xb5, 0x9f, 0x84, 0x7b, 0x67, 0x47, 0x8c, 0x8f, 0x7f, 0x5b, + 0x41, 0x4a, 0x6b, 0x86, 0x90, 0x4f, 0x43, 0x82, 0xa4, 0x89, 0x7b, 0x92, + 0xc0, 0xad, 0x73, 0x2e, 0x18, 0x2e, 0x3a, 0x2f, 0x28, 0x33, 0x40, 0x42, + 0x39, 0x2d, 0x24, 0x21, 0x3b, 0x2f, 0x26, 0x27, 0x2f, 0x30, 0x26, 0x1b, + 0x2c, 0x3a, 0x47, 0x48, 0x41, 0x42, 0x52, 0x61, 0x37, 0x3a, 0x3d, 0x3f, + 0x43, 0x4c, 0x5a, 0x65, 0x83, 0x70, 0x61, 0x6a, 0x84, 0x98, 0x97, 0x8e, + 0x90, 0xb4, 0xd1, 0xbf, 0x85, 0x4f, 0x37, 0x37, 0xa1, 0xbf, 0xda, 0xd6, + 0xba, 0xa5, 0xa8, 0xb5, 0x87, 0x8c, 0x8a, 0x78, 0x5b, 0x40, 0x31, 0x2d, + 0x6f, 0x42, 0x12, 0x06, 0x1f, 0x3f, 0x4b, 0x49, 0x38, 0x6e, 0x91, 0x8f, + 0x9c, 0xc2, 0xcf, 0xbd, 0x40, 0x7a, 0x9e, 0x9b, 0xab, 0xd4, 0xdf, 0xc9, + 0x5f, 0x70, 0x76, 0x5e, 0x3b, 0x32, 0x4e, 0x70, 0x96, 0x96, 0x94, 0x91, + 0x8c, 0x86, 0x80, 0x7d, 0x85, 0x63, 0x4a, 0x61, 0xa0, 0xdd, 0xfa, 0xfe, + 0x56, 0x42, 0x40, 0x6a, 0xa3, 0xb9, 0x9c, 0x74, 0x33, 0x40, 0x5e, 0x6d, + 0x4b, 0x1a, 0x17, 0x36, 0xa4, 0x7e, 0x48, 0x1d, 0x0f, 0x19, 0x2e, 0x3d, + 0x84, 0x61, 0x31, 0x23, 0x48, 0x6a, 0x4f, 0x19, 0x00, 0x00, 0x2f, 0x87, + 0xc4, 0xce, 0xcc, 0xd4, 0xe7, 0xa6, 0x6e, 0x76, 0xa6, 0xb3, 0x81, 0x46, + 0xad, 0x80, 0x51, 0x4b, 0x77, 0xb8, 0xed, 0xff, 0xbd, 0xcf, 0xb7, 0x7f, + 0x70, 0x7d, 0x5d, 0x1e, 0x1d, 0x53, 0x7c, 0x71, 0x4f, 0x3d, 0x39, 0x37, + 0x5a, 0x36, 0x13, 0x11, 0x33, 0x5d, 0x78, 0x82, 0x45, 0x51, 0x6b, 0x8a, + 0x98, 0x81, 0x4e, 0x23, 0x3e, 0x1c, 0x1c, 0x64, 0xc0, 0xd1, 0x83, 0x2a, + 0x2a, 0x69, 0xbd, 0xe8, 0xf1, 0xec, 0xaa, 0x45, 0x5d, 0x63, 0x6d, 0x74, + 0x76, 0x73, 0x6c, 0x68, 0x73, 0x79, 0x7e, 0x7b, 0x75, 0x73, 0x77, 0x7d, + 0x85, 0x7e, 0x77, 0x77, 0x7b, 0x7a, 0x74, 0x6d, 0x71, 0x7b, 0x88, 0x91, + 0x91, 0x87, 0x79, 0x70, 0x63, 0x6a, 0x73, 0x7a, 0x7b, 0x75, 0x6d, 0x67, + 0x6a, 0x63, 0x5b, 0x58, 0x58, 0x55, 0x4d, 0x45, 0x3e, 0x36, 0x3a, 0x24, + 0x38, 0x74, 0x6e, 0x4f, 0x52, 0x53, 0x52, 0x4d, 0x43, 0x33, 0x24, 0x1b, + 0x5e, 0xb9, 0xf1, 0xbe, 0x61, 0x38, 0x4a, 0x65, 0x66, 0x4a, 0x37, 0x37, + 0x34, 0x2e, 0x3d, 0x56, 0x2c, 0x4e, 0x5f, 0x51, 0x4c, 0x67, 0x8b, 0x9e, + 0xa6, 0x9e, 0x8f, 0x7e, 0x70, 0x6a, 0x6c, 0x70, 0x55, 0x2c, 0x1c, 0x42, + 0x71, 0x7e, 0x71, 0x66, 0x4a, 0x7b, 0x9c, 0x87, 0x5c, 0x48, 0x4c, 0x54, + 0x62, 0x6f, 0x72, 0x6e, 0x81, 0xa8, 0xbf, 0xbf, 0x7e, 0x47, 0x3a, 0x6a, + 0x88, 0x7e, 0x89, 0xae, 0xbc, 0xd6, 0xd4, 0x9b, 0x4b, 0x1d, 0x1f, 0x31, + 0x2e, 0x25, 0x19, 0x14, 0x24, 0x50, 0x87, 0xaf, 0xdb, 0xb0, 0x76, 0x4c, + 0x38, 0x2d, 0x1e, 0x11, 0x52, 0x5b, 0x5c, 0x4c, 0x3b, 0x41, 0x60, 0x7e, + 0x87, 0xae, 0xd7, 0xdf, 0xc2, 0x9d, 0x87, 0x81, 0xe1, 0xe2, 0xd6, 0xb2, + 0x7d, 0x4a, 0x2a, 0x1d, 0x50, 0x74, 0x94, 0x91, 0x73, 0x60, 0x6b, 0x7f, + 0x90, 0x8f, 0x78, 0x43, 0x0c, 0x00, 0x1e, 0x44, 0x26, 0x21, 0x20, 0x2a, + 0x39, 0x41, 0x3d, 0x36, 0x63, 0x4c, 0x2e, 0x1d, 0x21, 0x34, 0x49, 0x56, + 0x90, 0xa4, 0xa0, 0x8a, 0x94, 0xb3, 0xab, 0x85, 0x92, 0x83, 0x6d, 0x64, + 0x79, 0x9f, 0xba, 0xc2, 0xdc, 0xf5, 0xf2, 0xaf, 0x51, 0x1e, 0x31, 0x5a, + 0x56, 0x51, 0x4a, 0x46, 0x46, 0x4a, 0x51, 0x56, 0x21, 0x4e, 0x94, 0xd2, + 0xea, 0xd2, 0x9e, 0x76, 0x69, 0x49, 0x2e, 0x38, 0x66, 0x9a, 0xb9, 0xc3, + 0xb2, 0xb7, 0xc5, 0xbd, 0x80, 0x34, 0x1b, 0x2c, 0x54, 0x49, 0x46, 0x58, + 0x6c, 0x66, 0x43, 0x21, 0x69, 0x50, 0x79, 0xd5, 0xed, 0xae, 0x81, 0x89, + 0xc2, 0x94, 0xb2, 0xfe, 0xdf, 0x6a, 0x4b, 0x88, 0xf5, 0xb4, 0x73, 0x6a, + 0x90, 0xad, 0xa1, 0x86, 0xc1, 0x7b, 0x2c, 0x0d, 0x21, 0x3b, 0x3b, 0x2d, + 0x17, 0x62, 0x96, 0x70, 0x1f, 0x00, 0x1b, 0x49, 0x1a, 0x1b, 0x33, 0x57, + 0x60, 0x4b, 0x3e, 0x44, 0x44, 0x2c, 0x17, 0x1b, 0x33, 0x45, 0x43, 0x39, + 0x1a, 0x11, 0x0e, 0x1d, 0x33, 0x3b, 0x2f, 0x20, 0x28, 0x33, 0x3f, 0x40, + 0x35, 0x27, 0x1f, 0x1c, 0x11, 0x02, 0x67, 0xce, 0xaa, 0x69, 0x56, 0x45, + 0x37, 0x41, 0x51, 0x61, 0x6c, 0x71, 0x72, 0x71, 0x71, 0x76, 0x79, 0x76, + 0x71, 0x70, 0x77, 0x7e, 0x75, 0x6e, 0x67, 0x66, 0x69, 0x68, 0x61, 0x5a, + 0x5c, 0x69, 0x7d, 0x8d, 0x94, 0x8f, 0x84, 0x7c, 0x72, 0x72, 0x72, 0x71, + 0x70, 0x6f, 0x6f, 0x6e, 0x60, 0x59, 0x50, 0x4d, 0x4c, 0x49, 0x40, 0x39, + 0x2b, 0x2b, 0x3e, 0x48, 0x65, 0x77, 0x63, 0x6d, 0x52, 0x51, 0x4f, 0x51, + 0x56, 0x5e, 0x66, 0x6c, 0x59, 0x50, 0x3c, 0x3a, 0x60, 0x84, 0x72, 0x45, + 0x27, 0x0f, 0x53, 0xd7, 0xff, 0xca, 0xc2, 0xfa, 0x9f, 0x6d, 0x44, 0x42, + 0x4f, 0x57, 0x65, 0x77, 0xaa, 0x96, 0x7a, 0x62, 0x55, 0x4f, 0x4c, 0x4a, + 0x4f, 0x85, 0xaf, 0xa7, 0x8f, 0x84, 0x81, 0x7b, 0x4f, 0x2b, 0x11, 0x19, + 0x2a, 0x2c, 0x27, 0x27, 0x5d, 0x78, 0x82, 0x79, 0x87, 0xa8, 0xb1, 0xa1, + 0x90, 0x5f, 0x2c, 0x30, 0x70, 0xb7, 0xce, 0xc3, 0xac, 0x82, 0x71, 0x85, + 0x87, 0x65, 0x49, 0x48, 0x58, 0x41, 0x28, 0x25, 0x42, 0x6f, 0x99, 0xb1, + 0xa2, 0x7d, 0x50, 0x38, 0x36, 0x35, 0x28, 0x19, 0x4b, 0x51, 0x4d, 0x3e, + 0x39, 0x58, 0x98, 0xcc, 0xc2, 0x86, 0x48, 0x3b, 0x57, 0x67, 0x53, 0x35, + 0x37, 0x2c, 0x39, 0x70, 0xb2, 0xcb, 0xac, 0x82, 0x5f, 0x7f, 0xa6, 0xbc, + 0xc2, 0xca, 0xde, 0xf0, 0x90, 0xa2, 0xa8, 0x91, 0x74, 0x7b, 0xab, 0xdb, + 0x70, 0x49, 0x1f, 0x17, 0x32, 0x56, 0x6b, 0x70, 0x4f, 0x51, 0x47, 0x2d, + 0x17, 0x21, 0x49, 0x6f, 0x8c, 0x5e, 0x5c, 0x98, 0xc1, 0xaa, 0x80, 0x6e, + 0x54, 0x48, 0x6c, 0xb9, 0xe0, 0xc3, 0x9a, 0x8c, 0x2f, 0x72, 0xa6, 0x89, + 0x39, 0x0c, 0x29, 0x5c, 0x0f, 0x1d, 0x33, 0x4a, 0x5b, 0x63, 0x64, 0x63, + 0x56, 0x7a, 0x88, 0x5e, 0x23, 0x20, 0x66, 0xb1, 0x9c, 0xcc, 0xf9, 0xf4, + 0xc5, 0x9b, 0x94, 0xa0, 0x74, 0x7b, 0x9a, 0xbb, 0xb5, 0x9a, 0x9d, 0xb9, + 0x96, 0x5e, 0x22, 0x13, 0x2c, 0x43, 0x3c, 0x29, 0x48, 0x57, 0x61, 0x5a, + 0x53, 0x64, 0x8c, 0xaf, 0xba, 0xff, 0xf9, 0x84, 0x36, 0x4e, 0x6f, 0x67, + 0x73, 0x96, 0xc3, 0xd8, 0xc8, 0x9b, 0x6b, 0x4c, 0x7a, 0x9a, 0xb9, 0xba, + 0xa6, 0xa1, 0xb7, 0xd2, 0xc8, 0x71, 0x3e, 0x66, 0xa3, 0xbc, 0xce, 0xe6, + 0xbe, 0x4e, 0x15, 0x47, 0x6a, 0x40, 0x19, 0x1f, 0x6a, 0x93, 0xbf, 0xc8, + 0xa9, 0x7d, 0x5e, 0x51, 0xba, 0xbe, 0xcc, 0xe5, 0xf6, 0xec, 0xc9, 0xaa, + 0xbe, 0x96, 0x68, 0x5b, 0x79, 0xae, 0xdd, 0xf6, 0xd5, 0x81, 0x6f, 0x64, + 0x3c, 0x6e, 0xac, 0x8b, 0x4d, 0x55, 0x62, 0x6d, 0x74, 0x74, 0x71, 0x6f, + 0x6a, 0x70, 0x77, 0x79, 0x79, 0x7e, 0x8a, 0x94, 0x8f, 0x87, 0x80, 0x7f, + 0x82, 0x81, 0x79, 0x72, 0x65, 0x71, 0x82, 0x8f, 0x90, 0x87, 0x78, 0x6d, + 0x6e, 0x72, 0x77, 0x7a, 0x78, 0x72, 0x69, 0x64, 0x69, 0x61, 0x58, 0x54, + 0x54, 0x50, 0x47, 0x3f, 0x47, 0x2f, 0x1d, 0x1d, 0x4b, 0x5d, 0x4a, 0x67, + 0x64, 0x59, 0x4c, 0x48, 0x53, 0x6c, 0x89, 0x9c, 0x67, 0x6d, 0x76, 0x7d, + 0x7a, 0x63, 0x39, 0x16, 0x31, 0x4d, 0x77, 0x9e, 0xb8, 0xc1, 0xbc, 0xb4, + 0xe7, 0xb6, 0x89, 0x61, 0x22, 0x00, 0x2d, 0x85, 0x76, 0x55, 0x33, 0x2a, + 0x38, 0x44, 0x3e, 0x33, 0xc5, 0xcd, 0xa3, 0x59, 0x41, 0x60, 0x6a, 0x52, + 0x4e, 0x58, 0x76, 0x88, 0x66, 0x3a, 0x4a, 0x7d, 0x58, 0x77, 0x7a, 0x5c, + 0x54, 0x70, 0x7e, 0x72, 0x72, 0x3d, 0x24, 0x58, 0xad, 0xdd, 0xdb, 0xc9, + 0xaf, 0xad, 0xab, 0xb7, 0xcd, 0xc0, 0x74, 0x23, 0x64, 0x45, 0x2b, 0x37, + 0x61, 0x8a, 0x99, 0x97, 0xa7, 0x8f, 0x76, 0x6b, 0x67, 0x53, 0x2b, 0x09, + 0x37, 0x38, 0x3e, 0x48, 0x57, 0x6a, 0x7a, 0x84, 0xf6, 0xac, 0x5c, 0x42, + 0x57, 0x62, 0x46, 0x21, 0x25, 0x2e, 0x52, 0x78, 0x70, 0x4b, 0x47, 0x5f, + 0x6b, 0x40, 0x25, 0x47, 0x94, 0xd0, 0xd9, 0xc9, 0x2f, 0x44, 0x68, 0x90, + 0xb3, 0xcd, 0xdc, 0xe3, 0x45, 0x43, 0x42, 0x45, 0x4f, 0x5d, 0x6c, 0x75, + 0x6d, 0x56, 0x42, 0x48, 0x69, 0x8e, 0xa6, 0xae, 0xeb, 0xbd, 0x94, 0x97, + 0xaf, 0xa7, 0x70, 0x37, 0x33, 0x40, 0x49, 0x3e, 0x28, 0x1a, 0x1f, 0x2b, + 0x28, 0x55, 0x8f, 0xb2, 0xb0, 0x95, 0x77, 0x65, 0x49, 0x57, 0x36, 0x22, + 0x3d, 0x41, 0x41, 0x66, 0x62, 0x51, 0x43, 0x47, 0x55, 0x58, 0x49, 0x38, + 0x60, 0x6c, 0x70, 0x69, 0x66, 0x64, 0x55, 0x42, 0x4f, 0x86, 0xc5, 0xdc, + 0xc8, 0xab, 0x9e, 0xa0, 0x8b, 0x54, 0x48, 0x81, 0xb0, 0xa2, 0x7f, 0x6f, + 0x4f, 0x4a, 0x31, 0x28, 0x65, 0xc7, 0xf8, 0xf2, 0xc5, 0xc2, 0x9b, 0x4b, + 0x0b, 0x23, 0x8e, 0xf3, 0x60, 0x68, 0x91, 0xb8, 0xa1, 0x69, 0x5f, 0x7f, + 0x7e, 0xa0, 0xc3, 0xcb, 0xbf, 0xba, 0xca, 0xde, 0x95, 0x5d, 0x44, 0x62, + 0x7d, 0x7e, 0x8e, 0xaf, 0xd2, 0xa8, 0x7c, 0x71, 0x7e, 0x7f, 0x65, 0x48, + 0x88, 0x7c, 0x9a, 0xcd, 0xc7, 0x87, 0x5b, 0x5c, 0x6a, 0x4e, 0x69, 0xc6, + 0xff, 0xe7, 0x9d, 0x6d, 0x38, 0x60, 0x93, 0xaf, 0xa8, 0x8b, 0x6e, 0x5d, + 0x86, 0x3e, 0x58, 0x47, 0x2e, 0x85, 0xbe, 0xbb, 0xa0, 0x82, 0x68, 0x6d, + 0x86, 0x91, 0x80, 0x69, 0x75, 0x7b, 0x85, 0x8d, 0x92, 0x91, 0x8f, 0x8c, + 0x79, 0x81, 0x89, 0x8a, 0x81, 0x71, 0x62, 0x59, 0x6d, 0x77, 0x83, 0x86, + 0x81, 0x7c, 0x7b, 0x7c, 0x72, 0x6c, 0x62, 0x5b, 0x5b, 0x62, 0x6b, 0x72, + 0x6e, 0x66, 0x5c, 0x57, 0x54, 0x4f, 0x45, 0x3d, 0x31, 0x8f, 0xd3, 0xe1, + 0xeb, 0xe3, 0xa8, 0x68, 0x2f, 0x5d, 0x94, 0xb6, 0xc2, 0xcb, 0xd9, 0xe4, + 0x5d, 0x55, 0x58, 0x4f, 0x22, 0x05, 0x3d, 0x94, 0xe4, 0xca, 0xb2, 0xb5, + 0xc6, 0xc8, 0xb1, 0x97, 0xe3, 0x7b, 0x59, 0x9e, 0xb1, 0x5f, 0x20, 0x25, + 0x4a, 0x6d, 0x76, 0x59, 0x44, 0x41, 0x2e, 0x0e, 0xaa, 0xe6, 0xf0, 0xa9, + 0x68, 0x5c, 0x5c, 0x4d, 0x5b, 0x62, 0x6c, 0x73, 0x70, 0x62, 0x4d, 0x3e, + 0x54, 0x59, 0x5e, 0x5e, 0x5c, 0x5b, 0x5d, 0x60, 0x7f, 0x59, 0x46, 0x80, + 0xc8, 0xc4, 0xae, 0xc0, 0x8e, 0x92, 0xb4, 0xc0, 0xb2, 0xba, 0xa2, 0x58, + 0x35, 0x5c, 0x5f, 0x40, 0x4c, 0x8d, 0xb5, 0xaf, 0x97, 0xa5, 0x92, 0x76, + 0x65, 0x3c, 0x16, 0x16, 0x2e, 0x33, 0x3c, 0x49, 0x5b, 0x6d, 0x7d, 0x87, + 0x48, 0x31, 0x24, 0x35, 0x54, 0x5b, 0x3f, 0x1e, 0x37, 0x2b, 0x31, 0x3d, + 0x2d, 0x12, 0x1f, 0x46, 0x30, 0x3c, 0x4f, 0x60, 0x62, 0x4f, 0x31, 0x19, + 0x1d, 0x27, 0x39, 0x4e, 0x61, 0x6f, 0x78, 0x7c, 0x69, 0x60, 0x52, 0x45, + 0x3c, 0x3a, 0x3d, 0x3f, 0x29, 0x36, 0x58, 0x8b, 0xbb, 0xd0, 0xc7, 0xb7, + 0xe5, 0xb9, 0x85, 0x69, 0x5e, 0x45, 0x15, 0x00, 0x1e, 0x58, 0x8f, 0x8c, + 0x5f, 0x42, 0x54, 0x74, 0xda, 0xbb, 0x9b, 0x8f, 0x8c, 0x75, 0x44, 0x1a, + 0x3d, 0x4d, 0x2f, 0x1d, 0x36, 0x32, 0x29, 0x47, 0x30, 0x3e, 0x3e, 0x1f, + 0x00, 0x07, 0x40, 0x78, 0xac, 0xd1, 0xf8, 0xf5, 0xc6, 0x9e, 0xa6, 0xc7, + 0xe8, 0xe2, 0xd8, 0xc9, 0xb1, 0x8d, 0x65, 0x4b, 0x07, 0x5b, 0xb3, 0xd1, + 0xba, 0x9c, 0x8e, 0x8c, 0x10, 0x24, 0x51, 0x85, 0x9a, 0x85, 0x5c, 0x41, + 0x5a, 0x55, 0x69, 0xa0, 0xd0, 0xc0, 0x72, 0x27, 0x06, 0x79, 0xca, 0xac, + 0x6e, 0x65, 0x7f, 0x90, 0xc9, 0xbf, 0xa1, 0x74, 0x4f, 0x4e, 0x71, 0x94, + 0x4e, 0x62, 0x5c, 0x49, 0x63, 0x9c, 0xad, 0x96, 0x6c, 0x89, 0x9b, 0x83, + 0x59, 0x4e, 0x70, 0x9a, 0x93, 0x8e, 0xb5, 0xf5, 0xf9, 0xb2, 0x68, 0x49, + 0x94, 0xab, 0x90, 0x54, 0x4e, 0x6e, 0x55, 0x12, 0x31, 0x68, 0xaa, 0xc9, + 0xbb, 0x98, 0x7c, 0x71, 0x37, 0x24, 0x31, 0x20, 0x1c, 0x22, 0x18, 0x40, + 0x74, 0x6c, 0x61, 0x59, 0x57, 0x55, 0x52, 0x4f, 0x69, 0x6e, 0x75, 0x7b, + 0x7e, 0x7d, 0x7a, 0x77, 0x85, 0x73, 0x63, 0x64, 0x72, 0x7a, 0x74, 0x69, + 0x75, 0x7b, 0x82, 0x80, 0x79, 0x73, 0x73, 0x76, 0x89, 0x83, 0x7a, 0x71, + 0x6c, 0x6c, 0x6f, 0x71, 0x77, 0x6e, 0x65, 0x60, 0x5e, 0x59, 0x50, 0x47, + 0x30, 0x57, 0xa4, 0xc6, 0xc0, 0xd5, 0xc4, 0x73, 0x4a, 0x49, 0x2e, 0x1b, + 0x44, 0x8a, 0x96, 0x73, 0xa8, 0x64, 0x41, 0x6d, 0xa8, 0xbd, 0xbf, 0xc6, + 0xb2, 0xa6, 0x9b, 0x9a, 0x9f, 0x9e, 0x93, 0x87, 0x48, 0x12, 0x00, 0x48, + 0xb8, 0xf7, 0xeb, 0xc9, 0x75, 0x85, 0x73, 0x41, 0x2e, 0x47, 0x5d, 0x5b, + 0xcf, 0xdb, 0xc2, 0x90, 0x81, 0x93, 0x88, 0x64, 0x43, 0x3a, 0x32, 0x31, + 0x33, 0x30, 0x25, 0x1a, 0x3a, 0x6c, 0x98, 0x92, 0x6d, 0x61, 0x83, 0xae, + 0xc2, 0xa4, 0x73, 0x6d, 0x8d, 0x88, 0x73, 0x79, 0x6d, 0x70, 0x99, 0xb8, + 0xb7, 0xbc, 0xa9, 0x73, 0x3c, 0x4c, 0x51, 0x42, 0x36, 0x46, 0x6d, 0x8e, + 0x99, 0xac, 0xa0, 0x8a, 0x76, 0x43, 0x0f, 0x05, 0x19, 0x25, 0x3a, 0x55, + 0x72, 0x8c, 0x9f, 0xaa, 0xa7, 0x94, 0x78, 0x5f, 0x4e, 0x46, 0x43, 0x41, + 0x24, 0x3b, 0x73, 0xa6, 0x9c, 0x67, 0x4c, 0x55, 0x12, 0x4d, 0x8b, 0x98, + 0x73, 0x4a, 0x3b, 0x40, 0x4a, 0x4f, 0x55, 0x57, 0x52, 0x45, 0x37, 0x2e, + 0x40, 0x3f, 0x40, 0x46, 0x52, 0x63, 0x74, 0x7e, 0x8b, 0x79, 0x66, 0x61, + 0x66, 0x62, 0x51, 0x3f, 0x00, 0x05, 0x4f, 0x99, 0xcb, 0xd9, 0xcd, 0xbe, + 0x62, 0x85, 0x9d, 0x89, 0x5e, 0x51, 0x74, 0x9f, 0x9b, 0xb3, 0xc1, 0xa8, + 0x74, 0x49, 0x3e, 0x44, 0x60, 0xab, 0xb9, 0x87, 0x52, 0x28, 0x43, 0x97, + 0x95, 0xa6, 0xb4, 0xad, 0x97, 0x85, 0x84, 0x8a, 0xc1, 0xa2, 0x9e, 0xb4, + 0xab, 0x8c, 0x99, 0xc6, 0xcc, 0xd6, 0xc9, 0x93, 0x53, 0x3e, 0x5f, 0x89, + 0x98, 0x7f, 0x4a, 0x2e, 0x5b, 0x99, 0x89, 0x4a, 0x72, 0x6d, 0x8b, 0xb2, + 0x98, 0x4c, 0x24, 0x2d, 0x23, 0x50, 0x6f, 0x50, 0x10, 0x00, 0x0a, 0x35, + 0x79, 0xa5, 0xa9, 0x73, 0x4d, 0x55, 0x5c, 0x4f, 0x44, 0x44, 0x3f, 0x33, + 0x2f, 0x42, 0x69, 0x89, 0x7d, 0x53, 0x1b, 0x21, 0x8b, 0xff, 0xff, 0xd9, + 0xb9, 0xbb, 0xb1, 0x92, 0x6e, 0x5c, 0x63, 0x72, 0xab, 0x6d, 0x3b, 0x3c, + 0x58, 0x78, 0xa6, 0xd0, 0xda, 0xc4, 0xa6, 0x83, 0x5e, 0x4c, 0x5d, 0x7b, + 0x87, 0xa5, 0xc9, 0xd9, 0xd4, 0xca, 0xc9, 0xcd, 0xf4, 0xbc, 0x6f, 0x29, + 0x68, 0xdc, 0xad, 0x33, 0x41, 0x52, 0x66, 0x70, 0x6c, 0x63, 0x5d, 0x5c, + 0x76, 0x78, 0x7c, 0x7f, 0x7f, 0x7d, 0x7a, 0x77, 0x98, 0x88, 0x78, 0x77, + 0x81, 0x82, 0x75, 0x66, 0x78, 0x7e, 0x83, 0x81, 0x79, 0x73, 0x72, 0x75, + 0x70, 0x70, 0x71, 0x72, 0x74, 0x76, 0x78, 0x79, 0x6e, 0x66, 0x5d, 0x59, + 0x57, 0x53, 0x4a, 0x42, 0x3d, 0x39, 0x81, 0xb3, 0x77, 0x4b, 0x86, 0xcd, + 0xac, 0x9a, 0x51, 0x0b, 0x22, 0x6c, 0x6a, 0x2b, 0x43, 0x0c, 0x00, 0x2a, + 0x7e, 0xb8, 0xd7, 0xe8, 0xbe, 0xc2, 0xbf, 0xae, 0x95, 0x84, 0x81, 0x85, + 0x95, 0x98, 0x6e, 0x42, 0x6d, 0xbf, 0xb8, 0x6f, 0x2b, 0x80, 0xcd, 0xdd, + 0xcc, 0xb0, 0x7d, 0x49, 0x6b, 0x8b, 0x9e, 0x99, 0x94, 0x89, 0x60, 0x2e, + 0x6b, 0x65, 0x51, 0x32, 0x22, 0x38, 0x6e, 0x9d, 0x90, 0x9b, 0x9c, 0x87, + 0x6c, 0x69, 0x84, 0xa1, 0x9f, 0x94, 0x61, 0x3e, 0x51, 0x65, 0x6b, 0x7b, + 0x8c, 0x71, 0x76, 0x86, 0x82, 0x84, 0x8a, 0x80, 0x2f, 0x2a, 0x39, 0x4a, + 0x37, 0x26, 0x52, 0x99, 0xb7, 0xc7, 0xb9, 0xa4, 0x93, 0x5f, 0x24, 0x15, + 0x55, 0x5f, 0x70, 0x81, 0x90, 0x99, 0x9d, 0x9e, 0x3b, 0x48, 0x50, 0x4d, + 0x4d, 0x66, 0x96, 0xbe, 0xce, 0xc8, 0xd2, 0xd7, 0xae, 0x6d, 0x54, 0x62, + 0x2c, 0x53, 0x74, 0x6a, 0x43, 0x30, 0x45, 0x64, 0xc1, 0xa6, 0x7a, 0x51, + 0x38, 0x32, 0x3a, 0x42, 0x54, 0x4f, 0x47, 0x41, 0x42, 0x48, 0x50, 0x56, + 0x87, 0x7e, 0x77, 0x78, 0x75, 0x5d, 0x34, 0x13, 0x5a, 0x78, 0x99, 0xa8, + 0xa9, 0xb0, 0xc7, 0xdd, 0xa3, 0x9f, 0x99, 0x96, 0x98, 0x9d, 0xa3, 0xa8, + 0x5b, 0x59, 0x5c, 0x6a, 0x76, 0x75, 0x64, 0x53, 0x7b, 0xa9, 0xbb, 0xcf, + 0xed, 0xc5, 0x83, 0x77, 0xa9, 0xb4, 0xc4, 0xd2, 0xdc, 0xe3, 0xea, 0xee, + 0xe7, 0x87, 0x48, 0x52, 0x51, 0x3b, 0x5c, 0xa2, 0x7e, 0xa3, 0xaf, 0x78, + 0x26, 0x08, 0x36, 0x73, 0x91, 0xce, 0xe1, 0x9b, 0x4b, 0x47, 0x81, 0xb7, + 0x75, 0x83, 0xa4, 0xb6, 0x99, 0x69, 0x5f, 0x75, 0x99, 0x9b, 0x95, 0x85, + 0x7e, 0x97, 0xca, 0xf5, 0xe0, 0xbb, 0xb0, 0xc0, 0xaa, 0x6b, 0x45, 0x48, + 0x2d, 0x2e, 0x31, 0x3a, 0x4f, 0x73, 0x9d, 0xb9, 0x69, 0x7d, 0xb2, 0xdd, + 0xc4, 0x8b, 0x86, 0xac, 0x9e, 0x7e, 0x5b, 0x50, 0x57, 0x58, 0x47, 0x33, + 0x6d, 0x59, 0x43, 0x39, 0x42, 0x67, 0xa5, 0xd9, 0xe1, 0xbf, 0xbd, 0xd2, + 0xb9, 0x82, 0x80, 0xab, 0x96, 0x71, 0x4c, 0x48, 0x67, 0x8d, 0xa1, 0xa6, + 0xdd, 0xf2, 0xff, 0xdb, 0xaf, 0xb5, 0xae, 0x8d, 0x76, 0x72, 0x6d, 0x6a, + 0x6c, 0x72, 0x79, 0x7d, 0x74, 0x74, 0x74, 0x74, 0x73, 0x70, 0x6e, 0x6d, + 0x81, 0x80, 0x7b, 0x73, 0x69, 0x61, 0x5c, 0x5b, 0x5d, 0x6a, 0x78, 0x7d, + 0x79, 0x71, 0x6c, 0x6c, 0x73, 0x74, 0x74, 0x74, 0x71, 0x6c, 0x68, 0x64, + 0x68, 0x60, 0x58, 0x54, 0x54, 0x50, 0x47, 0x40, 0x43, 0x3d, 0x27, 0x3a, + 0x52, 0x1f, 0x04, 0x3b, 0x7a, 0x83, 0x75, 0x5c, 0x67, 0x8c, 0x93, 0x7d, + 0xaf, 0xc7, 0xc8, 0x92, 0x47, 0x3b, 0x89, 0xe2, 0xc3, 0xd1, 0xd2, 0xb2, + 0x81, 0x62, 0x62, 0x70, 0xa4, 0xdf, 0xd1, 0x6d, 0x35, 0x4d, 0x53, 0x2f, + 0x6e, 0xa4, 0xc1, 0xaa, 0x98, 0xab, 0xc0, 0xc2, 0x0e, 0x4b, 0x81, 0x7d, + 0x4f, 0x26, 0x15, 0x12, 0x5d, 0x67, 0x72, 0x77, 0x72, 0x6b, 0x66, 0x65, + 0x96, 0x95, 0x8e, 0x80, 0x6f, 0x64, 0x63, 0x66, 0x7d, 0x75, 0x4a, 0x2a, + 0x31, 0x39, 0x49, 0x6e, 0x96, 0x72, 0x63, 0x6a, 0x61, 0x53, 0x5c, 0x6e, + 0x64, 0x4f, 0x51, 0x5e, 0x4b, 0x2e, 0x47, 0x7e, 0xa1, 0xad, 0x9d, 0x8c, + 0x84, 0x56, 0x1d, 0x0c, 0xaf, 0xb3, 0xb9, 0xb8, 0xae, 0x9d, 0x8a, 0x7e, + 0x4f, 0x78, 0xa1, 0xa3, 0x86, 0x6c, 0x6e, 0x7b, 0x76, 0x85, 0xb0, 0xd0, + 0xb0, 0x65, 0x38, 0x37, 0x22, 0x2f, 0x42, 0x55, 0x70, 0x97, 0xc4, 0xe4, + 0xb9, 0xa4, 0x82, 0x5c, 0x3d, 0x29, 0x20, 0x1d, 0x4b, 0x43, 0x39, 0x2f, + 0x2b, 0x2d, 0x32, 0x36, 0x60, 0x4d, 0x39, 0x34, 0x3a, 0x38, 0x29, 0x19, + 0x4a, 0x5d, 0x68, 0x5e, 0x52, 0x65, 0x98, 0xc7, 0xa2, 0xb4, 0xd1, 0xef, + 0xf9, 0xe5, 0xbd, 0x9e, 0x77, 0x5b, 0x39, 0x29, 0x30, 0x41, 0x4d, 0x52, + 0x5c, 0x94, 0x96, 0x6f, 0x49, 0x09, 0x00, 0x07, 0x36, 0x72, 0xaf, 0xb7, + 0x92, 0x74, 0x79, 0x8e, 0x76, 0x48, 0x39, 0x44, 0x29, 0x15, 0x65, 0xdd, + 0xb8, 0xd4, 0xf2, 0xf2, 0xca, 0x89, 0x48, 0x22, 0x51, 0x42, 0x46, 0x5b, + 0x5b, 0x45, 0x41, 0x50, 0x48, 0x69, 0x72, 0x57, 0x4c, 0x6b, 0x91, 0xa2, + 0x89, 0x6c, 0x63, 0x90, 0xd8, 0xfe, 0xea, 0xc6, 0xd3, 0xa0, 0x69, 0x3a, + 0x0a, 0x0a, 0x6a, 0xdd, 0xd0, 0xa5, 0x6c, 0x46, 0x49, 0x6f, 0xa0, 0xc0, + 0x92, 0xaa, 0xdd, 0xf8, 0xc7, 0x7e, 0x76, 0xa0, 0xbd, 0xa7, 0x88, 0x6f, + 0x61, 0x55, 0x48, 0x3d, 0x3f, 0x5f, 0x6b, 0x4a, 0x1f, 0x1a, 0x3d, 0x60, + 0xc9, 0xdc, 0xc0, 0x7f, 0x62, 0x62, 0x36, 0x00, 0xa7, 0x5b, 0x16, 0x1e, + 0x61, 0x92, 0x87, 0x63, 0x1e, 0x82, 0x6f, 0x2b, 0x4a, 0x78, 0x5c, 0x27, + 0x5f, 0x61, 0x64, 0x65, 0x67, 0x6d, 0x76, 0x7e, 0x7d, 0x7c, 0x7a, 0x77, + 0x76, 0x76, 0x76, 0x76, 0x79, 0x71, 0x63, 0x57, 0x53, 0x5b, 0x69, 0x74, + 0x55, 0x6a, 0x86, 0x98, 0x9c, 0x96, 0x90, 0x8d, 0x79, 0x7a, 0x7a, 0x7a, + 0x77, 0x72, 0x6e, 0x6b, 0x70, 0x69, 0x61, 0x5e, 0x5e, 0x5b, 0x53, 0x4c, + 0x1b, 0x3c, 0x24, 0x3f, 0x8f, 0x69, 0x33, 0x6d, 0x2f, 0x1d, 0x26, 0x47, + 0x51, 0x42, 0x48, 0x63, 0xe0, 0x9e, 0x5e, 0x63, 0xa1, 0xc8, 0xa8, 0x70, + 0x73, 0x86, 0x90, 0x7c, 0x58, 0x45, 0x4f, 0x61, 0x4d, 0x7e, 0x9a, 0x7d, + 0x50, 0x40, 0x48, 0x50, 0x14, 0x75, 0xcb, 0xd6, 0xbf, 0xb1, 0xa1, 0x8c, + 0x79, 0x82, 0x80, 0x60, 0x2e, 0x18, 0x3a, 0x69, 0x94, 0x80, 0x77, 0x8c, + 0xa5, 0x99, 0x62, 0x2d, 0x3b, 0x68, 0x96, 0x9a, 0x7b, 0x5f, 0x60, 0x6d, + 0x55, 0x47, 0x32, 0x39, 0x45, 0x37, 0x47, 0x84, 0x6f, 0x6b, 0x73, 0x87, + 0x82, 0x5d, 0x49, 0x56, 0x77, 0x67, 0x5b, 0x5c, 0x5d, 0x5b, 0x60, 0x6b, + 0x80, 0x94, 0x94, 0x95, 0x99, 0x6a, 0x24, 0x07, 0x88, 0x99, 0xb1, 0xc7, + 0xd1, 0xce, 0xc3, 0xbb, 0xb4, 0xd2, 0xed, 0xeb, 0xd1, 0xbd, 0xc0, 0xcc, + 0xce, 0xa3, 0x78, 0x56, 0x27, 0x03, 0x16, 0x44, 0x54, 0x4d, 0x4f, 0x62, + 0x7d, 0x8b, 0x84, 0x77, 0xb1, 0x93, 0x64, 0x3a, 0x25, 0x26, 0x36, 0x44, + 0x1e, 0x23, 0x2e, 0x42, 0x5d, 0x7c, 0x98, 0xa8, 0xdf, 0xae, 0x6f, 0x45, + 0x3b, 0x42, 0x48, 0x4a, 0x09, 0x21, 0x39, 0x3f, 0x3e, 0x4f, 0x76, 0x98, + 0xc9, 0xdd, 0xe9, 0xd6, 0xa8, 0x7d, 0x66, 0x61, 0x57, 0x67, 0x6d, 0x56, + 0x34, 0x29, 0x40, 0x5c, 0xa2, 0x99, 0x6f, 0x78, 0xba, 0xbf, 0x91, 0x85, + 0x7d, 0x9e, 0xc7, 0xda, 0xc2, 0x88, 0x46, 0x1b, 0x32, 0x23, 0x32, 0x52, + 0x4e, 0x3b, 0x5a, 0x98, 0xff, 0xe0, 0x84, 0x2d, 0x00, 0x03, 0x2a, 0x4d, + 0x8e, 0x63, 0x4c, 0x53, 0x45, 0x31, 0x4f, 0x8a, 0x8a, 0x9b, 0x7e, 0x3c, + 0x28, 0x4f, 0x6a, 0x62, 0x30, 0x49, 0x67, 0x78, 0x7c, 0x80, 0x8a, 0x95, + 0xa1, 0xcf, 0xe1, 0xc5, 0xb7, 0xc3, 0xb6, 0x94, 0x77, 0x5b, 0x3e, 0x3c, + 0x58, 0x81, 0xa0, 0xae, 0xa3, 0x87, 0x4f, 0x30, 0x62, 0xb1, 0xbf, 0x99, + 0xe3, 0xa4, 0x62, 0x4e, 0x5b, 0x54, 0x24, 0x00, 0x1a, 0x84, 0xeb, 0xff, + 0xd7, 0x9b, 0x5d, 0x2f, 0x45, 0x36, 0x1f, 0x16, 0x31, 0x5a, 0x70, 0x6f, + 0xea, 0xb7, 0x97, 0xbb, 0xfc, 0xff, 0xc1, 0x73, 0x27, 0xcf, 0xff, 0xb0, + 0x6a, 0x77, 0x7c, 0x35, 0x16, 0x3a, 0x64, 0x78, 0x74, 0x6b, 0x6d, 0x75, + 0x8a, 0x87, 0x84, 0x82, 0x82, 0x85, 0x89, 0x8b, 0x89, 0x76, 0x64, 0x63, + 0x6e, 0x73, 0x6a, 0x5d, 0x65, 0x74, 0x83, 0x86, 0x7a, 0x67, 0x57, 0x4e, + 0x6c, 0x6d, 0x6d, 0x6e, 0x70, 0x73, 0x75, 0x76, 0x6b, 0x64, 0x5c, 0x5a, + 0x5b, 0x58, 0x51, 0x4a, 0x4b, 0x57, 0x41, 0x3d, 0x4c, 0x3d, 0x6b, 0xe3, + 0x95, 0x4a, 0x2c, 0x52, 0x5f, 0x42, 0x49, 0x78, 0x44, 0x7d, 0x9c, 0x77, + 0x3c, 0x1e, 0x1a, 0x19, 0x39, 0x48, 0x59, 0x61, 0x64, 0x6c, 0x7d, 0x8c, + 0x6c, 0x53, 0x54, 0x73, 0x76, 0x4f, 0x2e, 0x28, 0x44, 0x9a, 0xdb, 0xd0, + 0xb0, 0xb1, 0xc2, 0xc8, 0x97, 0x72, 0x59, 0x59, 0x50, 0x3c, 0x3b, 0x4d, + 0x9d, 0xa2, 0xa3, 0x9d, 0x98, 0xa1, 0xb7, 0xcb, 0x85, 0x78, 0x6b, 0x69, + 0x70, 0x77, 0x78, 0x75, 0x6e, 0x58, 0x44, 0x52, 0x59, 0x34, 0x33, 0x6b, + 0x86, 0x95, 0x94, 0x90, 0x87, 0x60, 0x44, 0x4f, 0x52, 0x51, 0x48, 0x45, + 0x5b, 0x78, 0x7a, 0x69, 0x74, 0x90, 0x9f, 0xb2, 0xbe, 0x89, 0x33, 0x08, + 0x43, 0x5f, 0x8c, 0xba, 0xdb, 0xeb, 0xec, 0xea, 0xd8, 0xd8, 0xd0, 0xbd, + 0xa9, 0xa0, 0xa7, 0xb1, 0x5d, 0x5e, 0x76, 0x8f, 0x7e, 0x55, 0x4f, 0x68, + 0x52, 0x57, 0x68, 0x87, 0xa3, 0xa9, 0x96, 0x81, 0x0f, 0x38, 0x71, 0x98, + 0x93, 0x63, 0x22, 0x00, 0x51, 0x52, 0x57, 0x62, 0x74, 0x8a, 0x9f, 0xac, + 0x6f, 0x67, 0x62, 0x67, 0x6a, 0x5a, 0x38, 0x1b, 0x53, 0x4b, 0x3d, 0x33, + 0x3c, 0x61, 0x96, 0xbd, 0xe3, 0xcb, 0x9a, 0x5b, 0x26, 0x11, 0x1d, 0x30, + 0x49, 0x45, 0x53, 0x7c, 0xa9, 0xb6, 0x9c, 0x7b, 0x83, 0xd3, 0xfe, 0xff, + 0xf7, 0xb9, 0x85, 0x92, 0xd9, 0xa6, 0x80, 0x96, 0xce, 0xe3, 0xbd, 0x8a, + 0xa0, 0x8e, 0x85, 0x8b, 0x84, 0x64, 0x3d, 0x27, 0x0d, 0x1b, 0x2c, 0x3a, + 0x4e, 0x73, 0xa5, 0xcb, 0xa6, 0x97, 0x8a, 0x83, 0x79, 0x6f, 0x6e, 0x74, + 0x82, 0x8f, 0x99, 0x9b, 0x92, 0x76, 0x45, 0x19, 0x10, 0x0e, 0x1a, 0x40, + 0x6f, 0x87, 0x81, 0x72, 0xb4, 0xb9, 0xaa, 0xa2, 0xc5, 0xe4, 0xba, 0x6f, + 0x0a, 0x0c, 0x23, 0x57, 0x94, 0xbd, 0xc3, 0xba, 0xc0, 0xf1, 0xf8, 0xc1, + 0x9c, 0xb0, 0xcf, 0xd5, 0xe2, 0x9a, 0x5c, 0x6b, 0xab, 0xc7, 0x9a, 0x5e, + 0x73, 0xa2, 0xc0, 0xc1, 0xcb, 0xd6, 0xb7, 0x83, 0x96, 0x55, 0x31, 0x38, + 0x28, 0x14, 0x4c, 0xa7, 0xbb, 0xbb, 0xcb, 0xec, 0xff, 0xde, 0x8f, 0x4d, + 0x4a, 0x1a, 0x52, 0xbb, 0x76, 0x15, 0x2c, 0x29, 0x37, 0x4a, 0x60, 0x68, + 0x65, 0x64, 0x6d, 0x77, 0x78, 0x75, 0x72, 0x71, 0x74, 0x7a, 0x81, 0x86, + 0x7c, 0x72, 0x6d, 0x72, 0x78, 0x6e, 0x53, 0x3a, 0x53, 0x5f, 0x6d, 0x74, + 0x75, 0x74, 0x77, 0x7b, 0x81, 0x7b, 0x72, 0x69, 0x64, 0x64, 0x67, 0x69, + 0x62, 0x5b, 0x54, 0x52, 0x54, 0x52, 0x4b, 0x44, 0x76, 0x7c, 0x69, 0x51, + 0x4e, 0x48, 0x30, 0x1f, 0x49, 0x21, 0x12, 0x25, 0x2f, 0x37, 0x6d, 0xb3, + 0x9c, 0xd4, 0xe2, 0xa1, 0x57, 0x3a, 0x36, 0x30, 0x46, 0x43, 0x47, 0x5a, + 0x75, 0x88, 0x8c, 0x89, 0x7e, 0x51, 0x3f, 0x5d, 0x73, 0x62, 0x49, 0x42, + 0x5b, 0xaa, 0xdc, 0xbf, 0x96, 0x9f, 0xc4, 0xdb, 0xcd, 0xbc, 0xcf, 0xfb, + 0xfc, 0xcc, 0xac, 0xb1, 0x46, 0x74, 0xa2, 0xa6, 0x8e, 0x88, 0xa8, 0xcd, + 0xce, 0x82, 0x3a, 0x3c, 0x75, 0x99, 0x83, 0x5a, 0x4e, 0x44, 0x31, 0x3b, + 0x53, 0x49, 0x49, 0x6e, 0x97, 0xb2, 0x9c, 0x75, 0x6a, 0x54, 0x42, 0x50, + 0x45, 0x4c, 0x48, 0x40, 0x4a, 0x5f, 0x62, 0x55, 0x6e, 0x7d, 0x7c, 0x85, + 0x93, 0x67, 0x1a, 0x00, 0x5a, 0x72, 0x96, 0xb7, 0xc9, 0xc9, 0xbe, 0xb3, + 0xad, 0xb5, 0xbd, 0xba, 0xa3, 0x7b, 0x4f, 0x33, 0x3d, 0x53, 0x8a, 0xbc, + 0xb2, 0x7e, 0x64, 0x6e, 0x2b, 0x31, 0x3d, 0x48, 0x4e, 0x4b, 0x41, 0x38, + 0x2c, 0x23, 0x17, 0x11, 0x19, 0x2b, 0x41, 0x50, 0x61, 0x5b, 0x52, 0x4c, + 0x4b, 0x50, 0x57, 0x5c, 0x61, 0x56, 0x4f, 0x56, 0x61, 0x5e, 0x49, 0x34, + 0x21, 0x31, 0x4e, 0x71, 0x92, 0xaa, 0xb8, 0xbe, 0xac, 0x7a, 0x40, 0x26, + 0x30, 0x41, 0x43, 0x3c, 0x3c, 0x55, 0x78, 0x97, 0xb2, 0xd0, 0xf3, 0xff, + 0xcd, 0xea, 0xc9, 0x8d, 0x68, 0x3b, 0x2d, 0x58, 0x65, 0x50, 0x42, 0x55, + 0x79, 0x8a, 0x7c, 0x66, 0x67, 0x8e, 0xa6, 0x92, 0x6e, 0x5f, 0x65, 0x6d, + 0x4f, 0x41, 0x4b, 0x84, 0xca, 0xe2, 0xbe, 0x8f, 0x67, 0x6f, 0x65, 0x5d, + 0x7e, 0xa7, 0x93, 0x5e, 0x50, 0x32, 0x3f, 0x7f, 0xa6, 0x97, 0x83, 0x85, + 0xd4, 0x96, 0x50, 0x39, 0x59, 0x89, 0xa8, 0xb2, 0x6b, 0x52, 0x56, 0x78, + 0x83, 0x83, 0xac, 0xe8, 0xb7, 0x9c, 0x87, 0x92, 0xb8, 0xd6, 0xdb, 0xd3, + 0x99, 0x8a, 0x8b, 0x8f, 0x6f, 0x55, 0x80, 0xcb, 0xbe, 0xb6, 0xaa, 0x9e, + 0x97, 0x98, 0x9e, 0xa2, 0xc3, 0xd3, 0xd5, 0xdc, 0xff, 0xff, 0xca, 0x63, + 0x56, 0x80, 0x7b, 0x37, 0x0e, 0x39, 0x89, 0xbb, 0x74, 0x92, 0xb3, 0xba, + 0x9f, 0x6e, 0x3f, 0x24, 0x24, 0x14, 0x1a, 0x60, 0x61, 0x41, 0x57, 0x40, + 0x34, 0x37, 0x43, 0x5a, 0x73, 0x7f, 0x7c, 0x74, 0x7a, 0x78, 0x75, 0x74, + 0x79, 0x82, 0x8b, 0x91, 0x7c, 0x7e, 0x80, 0x7e, 0x79, 0x74, 0x71, 0x71, + 0x71, 0x75, 0x76, 0x74, 0x72, 0x77, 0x83, 0x8d, 0x89, 0x82, 0x79, 0x72, + 0x72, 0x78, 0x82, 0x89, 0x6b, 0x64, 0x5d, 0x5c, 0x5d, 0x5c, 0x55, 0x4e, + 0x4e, 0x4e, 0x44, 0x39, 0x29, 0x1c, 0x39, 0x70, 0x3f, 0x66, 0x7f, 0x68, + 0x41, 0x4f, 0xa5, 0xfb, 0xfd, 0xd6, 0x8d, 0x59, 0x6f, 0x9c, 0x89, 0x4f, + 0x56, 0x3f, 0x2f, 0x3a, 0x54, 0x5f, 0x4e, 0x38, 0x7a, 0x6f, 0x62, 0x57, + 0x52, 0x56, 0x66, 0x77, 0x24, 0x75, 0xa6, 0x85, 0x55, 0x5b, 0x83, 0x9d, + 0xa4, 0xaf, 0xd9, 0xfb, 0xdc, 0xa8, 0xb9, 0xf5, 0xa4, 0x82, 0x63, 0x65, + 0x7d, 0x89, 0x78, 0x61, 0x5e, 0x49, 0x45, 0x6a, 0x9c, 0xa7, 0x7f, 0x50, + 0x5b, 0x58, 0x33, 0x1c, 0x2f, 0x34, 0x2c, 0x36, 0x58, 0x8f, 0x8a, 0x68, + 0x69, 0x5f, 0x48, 0x4c, 0x1e, 0x2b, 0x3a, 0x42, 0x4a, 0x58, 0x6b, 0x78, + 0x93, 0x8b, 0x6a, 0x5c, 0x69, 0x4f, 0x1a, 0x05, 0xed, 0xed, 0xcb, 0x97, + 0x8d, 0xad, 0xc0, 0xb8, 0xcc, 0xc1, 0xaf, 0x9c, 0x89, 0x73, 0x5f, 0x52, + 0x9d, 0x8a, 0x6b, 0x4b, 0x35, 0x2b, 0x2b, 0x2d, 0x14, 0x3c, 0x4d, 0x32, + 0x1c, 0x23, 0x2d, 0x2a, 0x2a, 0x10, 0x0e, 0x23, 0x26, 0x27, 0x59, 0x9d, + 0x3f, 0x3f, 0x6c, 0x9e, 0x82, 0x3d, 0x3c, 0x72, 0x56, 0x5e, 0x54, 0x2d, + 0x03, 0x00, 0x29, 0x54, 0x4c, 0x33, 0x38, 0x7e, 0xda, 0xff, 0xd6, 0x9b, + 0x35, 0x2f, 0x4c, 0x80, 0x8c, 0x63, 0x3f, 0x38, 0x3c, 0x4e, 0x73, 0xa3, + 0xc9, 0xd2, 0xc0, 0xab, 0x62, 0x55, 0x4a, 0x4e, 0x61, 0x75, 0x80, 0x83, + 0x3f, 0x25, 0x1f, 0x4d, 0x94, 0xba, 0xa8, 0x85, 0x81, 0x7b, 0x68, 0x45, + 0x20, 0x08, 0x04, 0x09, 0x22, 0x8d, 0xf6, 0xfd, 0xb3, 0x78, 0x84, 0xad, + 0xc8, 0xc3, 0x98, 0x63, 0x62, 0x86, 0x89, 0x6a, 0x5b, 0x7f, 0x89, 0x6f, + 0x65, 0x6d, 0x56, 0x2a, 0x47, 0x24, 0x13, 0x38, 0x77, 0x94, 0x77, 0x4d, + 0x1a, 0x5c, 0xa5, 0xbd, 0xab, 0x9e, 0xb2, 0xcf, 0xb4, 0xcd, 0xc0, 0x9e, + 0xb2, 0xe2, 0xce, 0x8d, 0xa3, 0xd2, 0xa0, 0x3e, 0x34, 0x5c, 0x6a, 0x6a, + 0x79, 0x5d, 0x58, 0x66, 0x57, 0x3c, 0x57, 0x91, 0x97, 0x9f, 0xa3, 0xa0, + 0x9d, 0xa9, 0xc4, 0xdb, 0x85, 0x72, 0x59, 0x4a, 0x51, 0x6f, 0x93, 0xac, + 0x8b, 0x51, 0x29, 0x49, 0x8f, 0xa5, 0x6e, 0x2b, 0x12, 0x19, 0x63, 0x7f, + 0x33, 0x12, 0x40, 0x5f, 0x67, 0x61, 0x60, 0x68, 0x74, 0x78, 0x71, 0x68, + 0x61, 0x6b, 0x7a, 0x87, 0x8d, 0x8b, 0x85, 0x80, 0x83, 0x80, 0x7b, 0x75, + 0x70, 0x6d, 0x6b, 0x6b, 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x83, 0x84, 0x85, + 0x6d, 0x71, 0x76, 0x79, 0x78, 0x73, 0x6c, 0x67, 0x64, 0x65, 0x65, 0x63, + 0x5e, 0x56, 0x4e, 0x4a, 0x56, 0x4b, 0x3c, 0x2f, 0x26, 0x24, 0x2b, 0x34, + 0x4b, 0x83, 0xa6, 0x7d, 0x33, 0x24, 0x6c, 0xbf, 0xa5, 0x60, 0x24, 0x1f, + 0x31, 0x3c, 0x45, 0x53, 0x2f, 0x29, 0x28, 0x33, 0x49, 0x5f, 0x6e, 0x73, + 0x5c, 0x63, 0x5b, 0x67, 0xb0, 0xeb, 0xb9, 0x54, 0x52, 0x8f, 0x9d, 0x6f, + 0x62, 0x78, 0x59, 0x12, 0x6f, 0xbd, 0xd5, 0xc8, 0xd6, 0xd2, 0xbd, 0xc3, + 0xb1, 0x80, 0x44, 0x25, 0x2a, 0x3f, 0x4d, 0x51, 0x74, 0x66, 0x50, 0x3f, + 0x3a, 0x45, 0x58, 0x66, 0x55, 0x56, 0x54, 0x4b, 0x3d, 0x31, 0x29, 0x25, + 0x36, 0x37, 0x3a, 0x3d, 0x41, 0x44, 0x47, 0x49, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x67, 0x7d, 0x71, 0x77, 0x89, 0x81, 0x1f, 0x09, + 0x9c, 0xa6, 0x95, 0x77, 0x82, 0xb4, 0xd5, 0xd4, 0xc9, 0xbf, 0x9f, 0x6d, + 0x47, 0x50, 0x83, 0xb4, 0x88, 0x78, 0x5f, 0x48, 0x3a, 0x38, 0x3e, 0x43, + 0x50, 0x5b, 0x4a, 0x1f, 0x0f, 0x25, 0x39, 0x38, 0x58, 0x5e, 0x79, 0x8d, + 0x6b, 0x32, 0x24, 0x3d, 0x7c, 0x67, 0x45, 0x34, 0x42, 0x4c, 0x2c, 0x00, + 0x1b, 0x3a, 0x62, 0x7c, 0x82, 0x7c, 0x78, 0x77, 0xb1, 0xb7, 0xb9, 0xad, + 0x8f, 0x65, 0x3d, 0x25, 0x3f, 0x38, 0x51, 0x7d, 0x81, 0x56, 0x35, 0x33, + 0x24, 0x61, 0xaa, 0xce, 0xc4, 0xaa, 0x9c, 0x9a, 0x57, 0x8a, 0xbe, 0xc7, + 0xab, 0x93, 0x98, 0xa9, 0x88, 0x8c, 0x9a, 0xab, 0xaf, 0x95, 0x64, 0x3e, + 0xa6, 0x84, 0x66, 0x6d, 0x93, 0xb8, 0xc3, 0xbf, 0xde, 0xdf, 0xe5, 0xe8, + 0xd8, 0xa8, 0x65, 0x32, 0x3b, 0x52, 0x76, 0x8c, 0x7e, 0x59, 0x3d, 0x33, + 0x2d, 0x2d, 0x37, 0x45, 0x46, 0x3a, 0x32, 0x33, 0x3f, 0x12, 0x00, 0x26, + 0x83, 0xc7, 0xcc, 0xb5, 0x91, 0xb8, 0xe3, 0xee, 0xdd, 0xcb, 0xcd, 0xd7, + 0xe4, 0xcc, 0xc1, 0xbc, 0x99, 0x72, 0x80, 0xaf, 0xd1, 0xcb, 0x9f, 0x96, + 0xc9, 0xc8, 0x7b, 0x41, 0x6a, 0x75, 0x68, 0x45, 0x33, 0x44, 0x5d, 0x67, + 0x3e, 0x35, 0x24, 0x13, 0x17, 0x3e, 0x7c, 0xab, 0xa7, 0xae, 0xb5, 0xb7, + 0xae, 0x9c, 0x88, 0x7a, 0x93, 0x97, 0x99, 0x93, 0x89, 0x84, 0x86, 0x8b, + 0x83, 0xaa, 0xa8, 0x7b, 0x59, 0x4f, 0x49, 0x46, 0x68, 0x62, 0x5f, 0x65, + 0x70, 0x77, 0x74, 0x6f, 0x70, 0x73, 0x78, 0x7c, 0x7f, 0x80, 0x80, 0x80, + 0x73, 0x78, 0x80, 0x84, 0x81, 0x77, 0x6b, 0x63, 0x66, 0x67, 0x68, 0x69, + 0x6b, 0x6c, 0x6d, 0x6e, 0x8b, 0x8d, 0x8e, 0x8c, 0x86, 0x7c, 0x73, 0x6d, + 0x65, 0x66, 0x66, 0x64, 0x5e, 0x57, 0x4f, 0x4a, 0x55, 0x43, 0x30, 0x2b, + 0x31, 0x35, 0x31, 0x2b, 0x3a, 0x37, 0x2f, 0x22, 0x19, 0x1c, 0x2b, 0x39, + 0x6b, 0x40, 0x25, 0x32, 0x4b, 0x62, 0x83, 0xa6, 0x92, 0x80, 0x64, 0x48, + 0x3a, 0x40, 0x53, 0x64, 0x49, 0x54, 0x55, 0x4c, 0x51, 0x66, 0x6f, 0x6a, + 0x26, 0x59, 0x97, 0xa7, 0x78, 0x46, 0x4c, 0x72, 0xb3, 0xd4, 0xc3, 0xbb, + 0xed, 0xfa, 0xcd, 0xb1, 0xc9, 0x82, 0x38, 0x28, 0x4d, 0x6c, 0x64, 0x4c, + 0x3c, 0x47, 0x5a, 0x6e, 0x72, 0x5f, 0x3c, 0x20, 0x34, 0x39, 0x3e, 0x41, + 0x40, 0x3e, 0x3c, 0x3b, 0x24, 0x26, 0x2b, 0x31, 0x38, 0x3e, 0x42, 0x45, + 0x50, 0x4f, 0x4d, 0x4a, 0x46, 0x43, 0x41, 0x40, 0x3c, 0x51, 0x4a, 0x55, + 0x6e, 0x73, 0x1f, 0x0f, 0x85, 0x9b, 0x98, 0x7d, 0x76, 0x84, 0x7d, 0x62, + 0x16, 0x21, 0x2b, 0x29, 0x21, 0x21, 0x2e, 0x3c, 0x5c, 0x50, 0x3d, 0x2e, + 0x29, 0x2f, 0x3b, 0x44, 0x72, 0x70, 0x55, 0x36, 0x3d, 0x5f, 0x6a, 0x5b, + 0x58, 0x3c, 0x31, 0x46, 0x59, 0x5d, 0x67, 0x7a, 0x67, 0x36, 0x39, 0x6f, + 0x71, 0x43, 0x4e, 0x8c, 0x75, 0x6a, 0x56, 0x45, 0x4d, 0x7b, 0xc2, 0xf8, + 0xd7, 0xbb, 0xa3, 0xa5, 0xaf, 0x99, 0x60, 0x2b, 0x4e, 0x38, 0x3a, 0x53, + 0x56, 0x44, 0x4b, 0x68, 0xe3, 0xea, 0xe7, 0xce, 0xae, 0x9f, 0xaa, 0xba, + 0x9a, 0x84, 0x69, 0x5f, 0x69, 0x7d, 0x8e, 0x97, 0x92, 0x94, 0x8f, 0x82, + 0x78, 0x80, 0x99, 0xb0, 0xac, 0xb1, 0xa8, 0x8c, 0x75, 0x82, 0xb4, 0xe1, + 0xaf, 0xb3, 0x9b, 0x5d, 0x23, 0x29, 0x73, 0xbb, 0xc9, 0xa5, 0x90, 0x83, + 0x53, 0x20, 0x32, 0x6e, 0x66, 0x3a, 0x2e, 0x4e, 0x5d, 0x58, 0x79, 0xb0, + 0xd1, 0xed, 0xff, 0xff, 0xec, 0xb4, 0x81, 0x63, 0x71, 0x72, 0x74, 0x7a, + 0x87, 0x9e, 0xb8, 0xcb, 0xad, 0x96, 0x99, 0x9c, 0x67, 0x37, 0x76, 0xe6, + 0xd8, 0xa5, 0x5c, 0x53, 0x7f, 0x77, 0x51, 0x50, 0x4f, 0x66, 0x9d, 0xd1, + 0xc5, 0x86, 0x57, 0x4f, 0x87, 0x52, 0x2a, 0x45, 0x8c, 0xb9, 0xac, 0x89, + 0x22, 0x1f, 0x1e, 0x24, 0x37, 0x52, 0x6e, 0x80, 0x73, 0x80, 0x8e, 0x92, + 0x92, 0x9a, 0xaf, 0xc1, 0xb1, 0xd8, 0xda, 0xd6, 0xe7, 0xcc, 0x91, 0x79, + 0x62, 0x63, 0x68, 0x72, 0x7c, 0x7f, 0x7a, 0x74, 0x8e, 0x8a, 0x85, 0x7f, + 0x7c, 0x7c, 0x7e, 0x7f, 0x7d, 0x84, 0x8d, 0x94, 0x94, 0x8c, 0x82, 0x7b, + 0x6f, 0x70, 0x71, 0x72, 0x74, 0x76, 0x77, 0x77, 0x81, 0x82, 0x81, 0x7f, + 0x79, 0x72, 0x6a, 0x66, 0x66, 0x67, 0x67, 0x65, 0x60, 0x58, 0x50, 0x4b, + 0x4a, 0x4e, 0x3a, 0x15, 0x0a, 0x1d, 0x28, 0x23, 0x20, 0x24, 0x2c, 0x38, + 0x48, 0x56, 0x62, 0x68, 0x69, 0x40, 0x2f, 0x51, 0x7c, 0x92, 0x9f, 0xac, + 0x96, 0x9a, 0x92, 0x75, 0x55, 0x49, 0x57, 0x6b, 0x69, 0x51, 0x40, 0x45, + 0x50, 0x56, 0x62, 0x71, 0x86, 0x77, 0x46, 0x12, 0x12, 0x36, 0x3e, 0x28, + 0x50, 0x9b, 0xab, 0x97, 0xa9, 0xba, 0xc6, 0xe6, 0xab, 0xa6, 0x9b, 0x88, + 0x6f, 0x55, 0x41, 0x35, 0x51, 0x43, 0x3b, 0x45, 0x55, 0x54, 0x3c, 0x23, + 0x2b, 0x31, 0x3e, 0x4b, 0x57, 0x5d, 0x5e, 0x5d, 0x6c, 0x6b, 0x69, 0x65, + 0x62, 0x5f, 0x5c, 0x5b, 0x72, 0x70, 0x6e, 0x6a, 0x66, 0x63, 0x60, 0x5f, + 0x4c, 0x59, 0x4d, 0x50, 0x5f, 0x67, 0x1d, 0x0f, 0xac, 0xcc, 0xd4, 0xb5, + 0x96, 0x7b, 0x47, 0x0f, 0x4c, 0x57, 0x7c, 0xba, 0xe9, 0xdf, 0x9f, 0x62, + 0x5b, 0x50, 0x3f, 0x32, 0x2f, 0x38, 0x45, 0x4f, 0x44, 0x4b, 0x48, 0x4b, + 0x6c, 0x90, 0x87, 0x63, 0x54, 0x5f, 0x70, 0x76, 0x61, 0x3f, 0x28, 0x22, + 0x37, 0x33, 0x2e, 0x35, 0x49, 0x50, 0x30, 0x07, 0x57, 0x23, 0x00, 0x00, + 0x38, 0x75, 0x8f, 0x8e, 0x72, 0x91, 0xa5, 0x8f, 0x5c, 0x36, 0x33, 0x41, + 0x47, 0x23, 0x0e, 0x11, 0x10, 0x18, 0x4b, 0x8a, 0xaa, 0x97, 0x90, 0xaa, + 0xd1, 0xdd, 0xc2, 0xa1, 0x6b, 0x43, 0x20, 0x27, 0x4b, 0x5f, 0x4e, 0x33, + 0x68, 0x7c, 0x96, 0xa5, 0xa8, 0xaa, 0xb1, 0xb9, 0x99, 0x84, 0x6e, 0x6a, + 0x79, 0x8f, 0x9d, 0xa2, 0x22, 0x39, 0x54, 0x5e, 0x52, 0x39, 0x21, 0x14, + 0x34, 0x24, 0x26, 0x37, 0x35, 0x25, 0x2c, 0x45, 0x29, 0x36, 0x66, 0x9d, + 0xa4, 0x79, 0x53, 0x4a, 0x09, 0x47, 0x8f, 0xaf, 0x9f, 0x7f, 0x6f, 0x6e, + 0x77, 0x31, 0x00, 0x15, 0x65, 0x93, 0x77, 0x44, 0x6f, 0x8d, 0x97, 0x70, + 0x37, 0x17, 0x19, 0x25, 0x2f, 0x2e, 0x1d, 0x32, 0x66, 0x69, 0x5b, 0x6f, + 0x48, 0x3c, 0x5f, 0x99, 0x8f, 0x44, 0x1a, 0x27, 0x33, 0x2b, 0x33, 0x53, + 0x76, 0x77, 0x52, 0x2c, 0x2f, 0x42, 0x60, 0x7d, 0x8f, 0x93, 0x8e, 0x89, + 0x89, 0x7a, 0x6c, 0x6a, 0x6a, 0x5e, 0x43, 0x2b, 0x4c, 0x3c, 0x2d, 0x32, + 0x3e, 0x39, 0x2f, 0x2e, 0x39, 0x46, 0x5b, 0x71, 0x81, 0x87, 0x83, 0x7f, + 0x7d, 0x7d, 0x7e, 0x80, 0x83, 0x85, 0x87, 0x89, 0x77, 0x76, 0x76, 0x76, + 0x77, 0x7a, 0x7d, 0x7e, 0x72, 0x73, 0x74, 0x76, 0x77, 0x79, 0x7a, 0x7a, + 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6c, 0x6b, 0x6a, 0x68, 0x68, 0x69, 0x67, + 0x61, 0x5a, 0x52, 0x4d, 0x32, 0x1e, 0x20, 0x35, 0x30, 0x17, 0x1d, 0x3c, + 0x23, 0x2d, 0x38, 0x3d, 0x3b, 0x38, 0x39, 0x3b, 0x23, 0x21, 0x38, 0x5d, + 0x67, 0x58, 0x56, 0x65, 0x60, 0x87, 0xaa, 0xa0, 0x6c, 0x36, 0x1c, 0x18, + 0x66, 0x4e, 0x36, 0x34, 0x43, 0x49, 0x36, 0x1d, 0x69, 0x58, 0x3b, 0x4e, + 0xb6, 0xff, 0xfa, 0x9e, 0x45, 0x62, 0x4c, 0x47, 0x8b, 0xb8, 0xaf, 0xac, + 0xa2, 0xa3, 0x90, 0x61, 0x35, 0x30, 0x59, 0x84, 0x5a, 0x30, 0x04, 0x00, + 0x0e, 0x26, 0x2b, 0x24, 0x31, 0x27, 0x1c, 0x1c, 0x27, 0x39, 0x47, 0x4e, + 0x5e, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x59, 0x60, 0x60, 0x60, 0x60, + 0x5f, 0x5f, 0x5f, 0x5f, 0x67, 0x6b, 0x59, 0x53, 0x54, 0x5d, 0x1b, 0x0e, + 0xb2, 0xc9, 0xc7, 0xa6, 0x94, 0x93, 0x7c, 0x57, 0x59, 0x59, 0x69, 0x8e, + 0xb3, 0xb6, 0x95, 0x72, 0x79, 0x6d, 0x5b, 0x4c, 0x48, 0x4f, 0x5c, 0x65, + 0x5c, 0x61, 0x5a, 0x57, 0x72, 0x91, 0x84, 0x5d, 0x29, 0x70, 0xad, 0xa3, + 0x6d, 0x49, 0x51, 0x68, 0x4d, 0x6a, 0x76, 0x69, 0x6a, 0x7b, 0x75, 0x5d, + 0x36, 0x5e, 0x7e, 0x6e, 0x43, 0x31, 0x4d, 0x73, 0x76, 0x9a, 0xb0, 0x94, + 0x59, 0x35, 0x3f, 0x5a, 0xb7, 0xa0, 0x92, 0x8b, 0x70, 0x5a, 0x7a, 0xb2, + 0xb4, 0x95, 0x82, 0x99, 0xc2, 0xcb, 0xa5, 0x78, 0x3e, 0x50, 0x66, 0x70, + 0x6c, 0x60, 0x55, 0x50, 0xe0, 0xc6, 0xa5, 0x91, 0x8d, 0x91, 0x91, 0x8f, + 0x65, 0x5c, 0x54, 0x57, 0x5e, 0x5c, 0x4f, 0x42, 0x5d, 0x36, 0x1a, 0x32, + 0x68, 0x83, 0x6c, 0x49, 0x07, 0x15, 0x21, 0x35, 0x58, 0x62, 0x2b, 0x00, + 0x11, 0x36, 0x57, 0x6f, 0x9f, 0xdf, 0xff, 0xff, 0xe3, 0x94, 0x36, 0x07, + 0x0c, 0x1c, 0x17, 0x07, 0x0f, 0x51, 0x92, 0x9a, 0x7b, 0x77, 0xa7, 0xde, + 0xff, 0xe4, 0x89, 0x1e, 0x00, 0x28, 0x3b, 0x24, 0x03, 0x22, 0x27, 0x39, + 0x6e, 0x74, 0x4b, 0x37, 0x47, 0x46, 0x3b, 0x31, 0x3f, 0x60, 0x76, 0x7a, + 0x27, 0x24, 0x27, 0x32, 0x40, 0x45, 0x3f, 0x36, 0x8f, 0x89, 0x80, 0x77, + 0x72, 0x71, 0x72, 0x74, 0x72, 0x84, 0x9a, 0xa5, 0x9c, 0x85, 0x6b, 0x5b, + 0x30, 0x3e, 0x3f, 0x34, 0x30, 0x2d, 0x27, 0x23, 0x43, 0x4f, 0x62, 0x76, + 0x87, 0x95, 0x9f, 0xa4, 0xa0, 0xa4, 0xa8, 0xa9, 0xa3, 0x98, 0x8c, 0x84, + 0x77, 0x76, 0x76, 0x76, 0x77, 0x7a, 0x7d, 0x7e, 0x7b, 0x7b, 0x7c, 0x7e, + 0x7f, 0x81, 0x82, 0x83, 0x75, 0x74, 0x74, 0x75, 0x76, 0x79, 0x7b, 0x7c, + 0x69, 0x6a, 0x6a, 0x68, 0x63, 0x5b, 0x54, 0x4f, 0x66, 0x6b, 0x61, 0x49, + 0x38, 0x35, 0x31, 0x29, 0x36, 0x27, 0x1d, 0x26, 0x35, 0x36, 0x22, 0x0c, + 0x5b, 0x80, 0xb0, 0xb6, 0x77, 0x2a, 0x13, 0x28, 0x4f, 0x89, 0xc8, 0xd8, + 0xb2, 0x7c, 0x59, 0x4e, 0x5a, 0x72, 0x65, 0x35, 0x25, 0x38, 0x30, 0x0d, + 0x30, 0x26, 0x59, 0xb9, 0xda, 0xa6, 0x73, 0x6c, 0x71, 0x7e, 0x56, 0x43, + 0x7c, 0x9a, 0x7e, 0x6c, 0xa9, 0x96, 0x87, 0x92, 0xb5, 0xdd, 0xf6, 0xff, + 0xe9, 0xda, 0xcf, 0xd4, 0xe2, 0xe3, 0xd2, 0xbf, 0x7a, 0x83, 0x95, 0xa6, + 0xaa, 0x97, 0x73, 0x58, 0x63, 0x62, 0x61, 0x5f, 0x5d, 0x5b, 0x5a, 0x59, + 0x54, 0x54, 0x53, 0x52, 0x51, 0x51, 0x50, 0x50, 0x47, 0x48, 0x3c, 0x3a, + 0x38, 0x4a, 0x18, 0x0d, 0x9a, 0x96, 0x70, 0x3a, 0x31, 0x55, 0x6f, 0x6b, + 0x3d, 0x64, 0x85, 0x7a, 0x52, 0x3c, 0x4e, 0x6b, 0x63, 0x58, 0x47, 0x3b, + 0x39, 0x42, 0x50, 0x5a, 0x20, 0x2b, 0x2b, 0x2e, 0x59, 0x9d, 0xc2, 0xc2, + 0xe1, 0xc7, 0x87, 0x3f, 0x25, 0x3e, 0x5b, 0x63, 0x5c, 0x65, 0x71, 0x61, + 0x2b, 0x0b, 0x3a, 0x86, 0xe1, 0xff, 0xff, 0xac, 0x2f, 0x00, 0x1e, 0x62, + 0xac, 0xa6, 0xa2, 0xa7, 0xb1, 0xb5, 0xb0, 0xa9, 0xbb, 0xbc, 0xc7, 0xbd, + 0x7d, 0x2f, 0x1b, 0x34, 0x84, 0x7f, 0x82, 0x94, 0xb2, 0xcd, 0xde, 0xe3, + 0x54, 0x57, 0x69, 0x8d, 0xab, 0xa6, 0x7f, 0x5a, 0x39, 0x55, 0x85, 0xb0, + 0xbb, 0x94, 0x50, 0x1b, 0x00, 0x26, 0x4f, 0x5a, 0x4d, 0x45, 0x53, 0x66, + 0x75, 0x80, 0x86, 0x7b, 0x67, 0x5c, 0x62, 0x6d, 0x6f, 0x65, 0x48, 0x41, + 0x7a, 0xb3, 0x90, 0x3f, 0x56, 0x88, 0xa3, 0x9b, 0xab, 0xd2, 0xcf, 0xa9, + 0xe1, 0xa4, 0x6a, 0x6e, 0xaa, 0xe7, 0xff, 0xfc, 0xff, 0xf7, 0xe6, 0xd5, + 0xce, 0xd8, 0xee, 0xff, 0xc9, 0xa9, 0x81, 0x6f, 0x77, 0x79, 0x5f, 0x3d, + 0x6b, 0x94, 0x82, 0x4d, 0x38, 0x2e, 0x34, 0x55, 0x4e, 0x32, 0x1e, 0x26, + 0x3a, 0x4d, 0x65, 0x7a, 0x3f, 0x2c, 0x20, 0x2e, 0x4f, 0x67, 0x69, 0x61, + 0x69, 0x76, 0x88, 0x96, 0x99, 0x90, 0x82, 0x78, 0x68, 0x82, 0xa5, 0xb7, + 0xaf, 0x91, 0x6f, 0x5a, 0x39, 0x45, 0x32, 0x26, 0x2d, 0x1b, 0x1c, 0x4b, + 0x72, 0x73, 0x72, 0x6f, 0x70, 0x79, 0x88, 0x95, 0xa2, 0xa7, 0xae, 0xaf, + 0xa8, 0x99, 0x88, 0x7d, 0x7d, 0x84, 0x8d, 0x94, 0x94, 0x8c, 0x82, 0x7b, + 0x7f, 0x80, 0x81, 0x82, 0x84, 0x85, 0x87, 0x87, 0x8b, 0x87, 0x81, 0x7c, + 0x79, 0x79, 0x7a, 0x7c, 0x6b, 0x6c, 0x6c, 0x6a, 0x65, 0x5d, 0x55, 0x50, + 0x8c, 0xc7, 0xd8, 0x97, 0x49, 0x28, 0x24, 0x20, 0x5b, 0x63, 0x6a, 0x69, + 0x64, 0x65, 0x70, 0x7a, 0xd2, 0xc2, 0xc6, 0xda, 0xcb, 0x8c, 0x4b, 0x2b, + 0x0f, 0x37, 0x67, 0x7d, 0x77, 0x69, 0x65, 0x69, 0x53, 0x69, 0x56, 0x31, + 0x4a, 0x8e, 0x99, 0x6d, 0x0f, 0x21, 0x61, 0xac, 0xb5, 0x78, 0x3a, 0x23, + 0x2f, 0x61, 0x59, 0x44, 0x63, 0x73, 0x67, 0x6d, 0x33, 0x4d, 0x7c, 0xb3, + 0xdb, 0xe3, 0xd1, 0xbd, 0xb5, 0xc0, 0xce, 0xd4, 0xce, 0xc0, 0xb2, 0xa8, + 0xab, 0x9c, 0x8c, 0x86, 0x87, 0x81, 0x71, 0x61, 0x6c, 0x6a, 0x65, 0x60, + 0x5a, 0x54, 0x50, 0x4e, 0x4f, 0x4d, 0x49, 0x43, 0x3d, 0x38, 0x34, 0x31, + 0x32, 0x31, 0x2d, 0x2e, 0x27, 0x3d, 0x12, 0x07, 0x97, 0x92, 0x67, 0x2b, + 0x1c, 0x3a, 0x4f, 0x48, 0x6b, 0xac, 0xe0, 0xc3, 0x6e, 0x34, 0x3e, 0x62, + 0x47, 0x3f, 0x35, 0x30, 0x37, 0x49, 0x5d, 0x6b, 0xdb, 0xea, 0xde, 0xbb, + 0xb3, 0xd2, 0xeb, 0xed, 0xff, 0xdf, 0x8c, 0x46, 0x43, 0x62, 0x5c, 0x37, + 0x28, 0x48, 0x2f, 0x00, 0x20, 0x84, 0x95, 0x5a, 0x5d, 0x48, 0x47, 0x75, + 0xb8, 0xda, 0xc6, 0xa5, 0x97, 0xb8, 0xcd, 0xb7, 0x8b, 0x79, 0x96, 0xbb, + 0xd9, 0xda, 0xe1, 0xcc, 0x7f, 0x2c, 0x1d, 0x3d, 0x79, 0x87, 0xa3, 0xc0, + 0xc7, 0xa6, 0x6a, 0x3a, 0x35, 0x26, 0x3a, 0x87, 0xd7, 0xd6, 0x7c, 0x20, + 0x1f, 0x39, 0x56, 0x63, 0x5f, 0x5b, 0x61, 0x6a, 0x80, 0x69, 0x57, 0x5f, + 0x72, 0x71, 0x54, 0x36, 0x43, 0x4c, 0x57, 0x61, 0x69, 0x73, 0x81, 0x8b, + 0xff, 0xec, 0xda, 0xe1, 0xf8, 0xf2, 0xba, 0x7d, 0xf3, 0xed, 0xdb, 0xc6, + 0xc3, 0xd2, 0xe0, 0xe4, 0xa8, 0xa8, 0xae, 0xbe, 0xca, 0xc4, 0xac, 0x96, + 0x8d, 0x8a, 0x7d, 0x69, 0x61, 0x78, 0xa8, 0xd1, 0xa0, 0x88, 0x76, 0x6c, + 0x51, 0x2e, 0x24, 0x31, 0x51, 0x86, 0x98, 0x80, 0x57, 0x32, 0x5d, 0xc1, + 0xdc, 0x82, 0x43, 0x44, 0x39, 0x14, 0x1c, 0x4c, 0x2c, 0x45, 0x5d, 0x61, + 0x58, 0x5a, 0x6f, 0x85, 0x53, 0x5e, 0x6f, 0x7c, 0x81, 0x7c, 0x73, 0x6b, + 0x7e, 0x86, 0x97, 0xaa, 0xaf, 0x97, 0x6a, 0x46, 0x50, 0x39, 0x28, 0x2e, + 0x32, 0x20, 0x21, 0x3e, 0x52, 0x58, 0x5c, 0x5a, 0x55, 0x56, 0x60, 0x6a, + 0x59, 0x5f, 0x6a, 0x74, 0x7c, 0x7f, 0x7e, 0x7d, 0x73, 0x78, 0x80, 0x84, + 0x81, 0x77, 0x6b, 0x63, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, + 0x88, 0x83, 0x7c, 0x76, 0x74, 0x76, 0x79, 0x7c, 0x6c, 0x6d, 0x6d, 0x6b, + 0x66, 0x5e, 0x56, 0x52, 0x55, 0x75, 0xb5, 0xcf, 0x85, 0x1e, 0x17, 0x53, + 0x71, 0x83, 0x8a, 0x72, 0x4f, 0x47, 0x65, 0x88, 0x91, 0x55, 0x39, 0x68, + 0xa1, 0x9f, 0x6d, 0x43, 0x44, 0x48, 0x4a, 0x48, 0x45, 0x45, 0x4a, 0x4e, + 0x3f, 0x49, 0x4c, 0x5a, 0x92, 0xd3, 0xde, 0xc3, 0x4c, 0x3d, 0x3b, 0x67, + 0xa9, 0xae, 0x51, 0x00, 0x1f, 0x28, 0x0d, 0x26, 0x90, 0xbe, 0x87, 0x54, + 0x5b, 0x6c, 0x84, 0x98, 0xa5, 0xad, 0xb4, 0xb9, 0x92, 0xa4, 0xae, 0x9e, + 0x81, 0x79, 0x8d, 0xa7, 0x92, 0x7c, 0x63, 0x5c, 0x64, 0x6a, 0x65, 0x5b, + 0x5c, 0x5d, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6a, 0x64, 0x61, 0x5d, 0x57, + 0x50, 0x4b, 0x46, 0x44, 0x43, 0x41, 0x40, 0x40, 0x30, 0x42, 0x18, 0x09, + 0xa4, 0xb8, 0xb2, 0x93, 0x87, 0x92, 0x88, 0x6c, 0xab, 0xcb, 0xda, 0xb1, + 0x66, 0x30, 0x2d, 0x40, 0x5d, 0x58, 0x54, 0x58, 0x68, 0x81, 0x9b, 0xac, + 0xa0, 0xcc, 0xe4, 0xd4, 0xc8, 0xda, 0xec, 0xed, 0xba, 0xf2, 0xfb, 0xb5, + 0x73, 0x6f, 0x87, 0x91, 0x7e, 0x81, 0x7a, 0x6d, 0x74, 0x83, 0x7e, 0x6a, + 0x9e, 0xc7, 0xf3, 0xfe, 0xea, 0xd3, 0xcc, 0xd1, 0xcc, 0xba, 0xaa, 0xaa, + 0xb6, 0xbe, 0xb8, 0xaf, 0xec, 0xdc, 0xc9, 0xa5, 0x61, 0x33, 0x55, 0x99, + 0xe5, 0xba, 0x9e, 0xb8, 0xe2, 0xd5, 0x83, 0x31, 0x4f, 0x3c, 0x30, 0x42, + 0x6b, 0x8d, 0x97, 0x94, 0xb2, 0xc7, 0xc5, 0x92, 0x4a, 0x2a, 0x44, 0x6c, + 0x3a, 0x40, 0x43, 0x3e, 0x38, 0x3d, 0x50, 0x61, 0x4c, 0x59, 0x65, 0x65, + 0x5b, 0x53, 0x55, 0x5a, 0x66, 0x54, 0x71, 0xb7, 0xda, 0xc3, 0xac, 0xb0, + 0xd1, 0xc0, 0xce, 0xef, 0xdf, 0xa3, 0x7f, 0x83, 0x91, 0x67, 0x43, 0x4c, + 0x72, 0x83, 0x6a, 0x47, 0x29, 0x50, 0x7d, 0x8e, 0x83, 0x77, 0x7b, 0x86, + 0xa7, 0xbe, 0xbf, 0x8d, 0x41, 0x15, 0x23, 0x44, 0x29, 0x1d, 0x1a, 0x3a, + 0x47, 0x22, 0x3f, 0xa6, 0xdb, 0xaf, 0x75, 0x4f, 0x46, 0x4c, 0x4e, 0x4a, + 0x75, 0x62, 0x53, 0x57, 0x6b, 0x78, 0x74, 0x69, 0x88, 0x80, 0x74, 0x6b, + 0x68, 0x6c, 0x74, 0x7a, 0x6d, 0x7a, 0x89, 0x8d, 0x7f, 0x62, 0x42, 0x2e, + 0x3c, 0x23, 0x2d, 0x2f, 0x28, 0x54, 0x60, 0x1f, 0x18, 0x32, 0x54, 0x6d, + 0x78, 0x7d, 0x83, 0x89, 0x7c, 0x79, 0x74, 0x6f, 0x6c, 0x6b, 0x6b, 0x6c, + 0x83, 0x80, 0x7b, 0x75, 0x70, 0x6d, 0x6b, 0x6b, 0x7b, 0x7c, 0x7d, 0x7e, + 0x80, 0x81, 0x82, 0x83, 0x80, 0x7d, 0x79, 0x78, 0x7b, 0x83, 0x8b, 0x91, + 0x6d, 0x6e, 0x6e, 0x6c, 0x66, 0x5f, 0x57, 0x52, 0x46, 0x5b, 0x59, 0x3e, + 0x37, 0x4c, 0x5a, 0x53, 0x4a, 0x31, 0x1a, 0x1d, 0x38, 0x55, 0x62, 0x63, + 0x6c, 0x4d, 0x37, 0x34, 0x2a, 0x18, 0x1b, 0x30, 0x44, 0x3b, 0x31, 0x33, + 0x3e, 0x4a, 0x51, 0x52, 0x63, 0x96, 0xd5, 0xf1, 0xe7, 0xdb, 0xef, 0xff, + 0xff, 0x5f, 0x00, 0x16, 0x6f, 0x86, 0x7e, 0x84, 0x2d, 0x5a, 0x5d, 0x6a, + 0xac, 0xc2, 0x98, 0x7d, 0x70, 0x54, 0x4c, 0x7a, 0xbe, 0xda, 0xba, 0x8c, + 0x46, 0x69, 0x81, 0x6e, 0x42, 0x31, 0x4d, 0x72, 0x7b, 0x60, 0x45, 0x41, + 0x52, 0x65, 0x6c, 0x69, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 0x5e, + 0x57, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4b, 0x4b, 0x49, 0x4d, 0x50, + 0x3d, 0x4f, 0x27, 0x16, 0x0e, 0x26, 0x3a, 0x36, 0x22, 0x16, 0x21, 0x31, + 0x71, 0x80, 0x94, 0x9a, 0x8a, 0x66, 0x3c, 0x20, 0x29, 0x22, 0x1b, 0x20, + 0x3a, 0x66, 0x97, 0xb7, 0xd4, 0xc1, 0xb0, 0xb3, 0xc6, 0xd6, 0xd8, 0xd3, + 0xba, 0xc9, 0xb5, 0x7b, 0x55, 0x5e, 0x73, 0x79, 0x48, 0x5b, 0x70, 0x76, + 0x6e, 0x67, 0x69, 0x70, 0x94, 0xa1, 0xb2, 0xb6, 0xa4, 0x7f, 0x56, 0x3b, + 0x5f, 0x7b, 0xa3, 0xc5, 0xd5, 0xd6, 0xd0, 0xcb, 0xda, 0xd9, 0xcd, 0xb2, + 0x97, 0x91, 0xa3, 0xb7, 0x6d, 0x7a, 0x8a, 0x93, 0x8b, 0x73, 0x58, 0x45, + 0x67, 0x89, 0xad, 0xb6, 0xa3, 0x8d, 0x86, 0x89, 0x83, 0x86, 0x88, 0x85, + 0x7b, 0x6b, 0x5b, 0x50, 0x67, 0x7f, 0x90, 0x83, 0x65, 0x54, 0x5f, 0x72, + 0x29, 0x21, 0x29, 0x38, 0x2e, 0x1a, 0x28, 0x4a, 0x15, 0x19, 0x30, 0x5d, + 0x92, 0xb6, 0xc0, 0xbb, 0xbc, 0xb1, 0x90, 0x5a, 0x2a, 0x1d, 0x38, 0x57, + 0x83, 0x5d, 0x72, 0xc1, 0xd7, 0x8f, 0x44, 0x2c, 0x31, 0x66, 0x9d, 0xaa, + 0x96, 0x8e, 0xa7, 0xc7, 0xcf, 0xc2, 0xac, 0x8f, 0x70, 0x53, 0x3c, 0x30, + 0x3b, 0x38, 0x34, 0x30, 0x2d, 0x2d, 0x2e, 0x2f, 0x0d, 0x13, 0x1e, 0x28, + 0x2e, 0x2f, 0x2d, 0x2b, 0x67, 0x68, 0x6b, 0x6f, 0x72, 0x76, 0x79, 0x7a, + 0x7d, 0x81, 0x87, 0x89, 0x87, 0x7f, 0x76, 0x70, 0x8b, 0x82, 0x74, 0x64, + 0x57, 0x4e, 0x49, 0x48, 0x46, 0x31, 0x1b, 0x1c, 0x3b, 0x6f, 0xa1, 0xbf, + 0x7f, 0x6e, 0x5d, 0x5b, 0x6b, 0x7f, 0x8d, 0x92, 0x8a, 0x79, 0x6b, 0x71, + 0x84, 0x8d, 0x85, 0x77, 0x67, 0x6a, 0x6f, 0x75, 0x7b, 0x81, 0x86, 0x88, + 0x85, 0x84, 0x82, 0x80, 0x7e, 0x7d, 0x7b, 0x7a, 0x6f, 0x6e, 0x6e, 0x6d, + 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x63, 0x5e, 0x5e, 0x5f, 0x59, 0x4c, 0x41, + 0x4d, 0x83, 0xa3, 0x84, 0x52, 0x40, 0x4f, 0x60, 0x7d, 0x8e, 0x9a, 0x91, + 0x7c, 0x6e, 0x74, 0x80, 0x77, 0x6d, 0x61, 0x5e, 0x6a, 0x83, 0x9f, 0xb1, + 0x80, 0x78, 0x67, 0x52, 0x46, 0x4d, 0x65, 0x79, 0xa0, 0xa6, 0xae, 0xb2, + 0xb4, 0xb5, 0xb8, 0xba, 0xd8, 0xbf, 0x8d, 0x56, 0x40, 0x69, 0xc0, 0xff, + 0xb4, 0x94, 0x71, 0x65, 0x6f, 0x77, 0x71, 0x66, 0x4f, 0x4b, 0x54, 0x72, + 0x96, 0xa5, 0x98, 0x84, 0x08, 0x26, 0x5e, 0x80, 0x64, 0x44, 0x6d, 0xb8, + 0xa7, 0x96, 0x6e, 0x45, 0x42, 0x5e, 0x70, 0x6e, 0x66, 0x63, 0x61, 0x65, + 0x6b, 0x6a, 0x61, 0x59, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x48, 0x4d, 0x55, 0x4d, 0x5d, 0x58, 0x1f, 0x07, 0x42, 0x56, 0x76, 0x93, + 0x9c, 0x8b, 0x6a, 0x50, 0x71, 0x64, 0x50, 0x3d, 0x31, 0x30, 0x35, 0x39, + 0x49, 0x76, 0xa0, 0x9d, 0x7b, 0x68, 0x7b, 0x99, 0x6d, 0x96, 0xc3, 0xd1, + 0xc1, 0xb3, 0xb9, 0xc7, 0xc8, 0xd7, 0xc1, 0x81, 0x4d, 0x3f, 0x3a, 0x2e, + 0x79, 0x5d, 0x3b, 0x2d, 0x3c, 0x5d, 0x7e, 0x91, 0x9f, 0xa4, 0xa8, 0xa9, + 0xa2, 0x94, 0x86, 0x7c, 0x7f, 0x92, 0xaf, 0xc9, 0xd6, 0xd3, 0xc6, 0xbb, + 0x5d, 0x81, 0xaa, 0xb6, 0x9f, 0x79, 0x5b, 0x4e, 0x31, 0x57, 0x8d, 0xb6, + 0xbc, 0x9d, 0x6e, 0x4c, 0x5e, 0x68, 0x83, 0xad, 0xcf, 0xcd, 0xa9, 0x86, + 0xab, 0xb5, 0xbf, 0xb9, 0x9b, 0x6a, 0x37, 0x16, 0x3c, 0x3c, 0x3e, 0x43, + 0x49, 0x4f, 0x54, 0x56, 0x5a, 0x3e, 0x2c, 0x2a, 0x24, 0x28, 0x55, 0x8d, + 0xd4, 0x8a, 0x37, 0x1e, 0x42, 0x75, 0x8f, 0x92, 0x1e, 0x53, 0x92, 0xb0, + 0xa1, 0x7c, 0x5c, 0x4d, 0x59, 0x79, 0xa2, 0xbb, 0xb4, 0x84, 0x3a, 0x00, + 0x19, 0x2d, 0x3f, 0x44, 0x4b, 0x6d, 0xa8, 0xd9, 0x90, 0x92, 0x97, 0x9d, + 0xa4, 0xab, 0xaf, 0xb2, 0xb8, 0xad, 0x9b, 0x86, 0x72, 0x62, 0x59, 0x54, + 0x5d, 0x63, 0x6d, 0x77, 0x7c, 0x7d, 0x7b, 0x79, 0x66, 0x6a, 0x70, 0x79, + 0x82, 0x8a, 0x91, 0x94, 0x99, 0x91, 0x85, 0x79, 0x72, 0x70, 0x72, 0x74, + 0x74, 0x6d, 0x60, 0x53, 0x48, 0x42, 0x3f, 0x3f, 0x2e, 0x42, 0x60, 0x7d, + 0x91, 0x9b, 0x9f, 0x9f, 0x7e, 0x73, 0x69, 0x69, 0x72, 0x7a, 0x7c, 0x7a, + 0x7d, 0x72, 0x6c, 0x76, 0x85, 0x87, 0x77, 0x64, 0x91, 0x8f, 0x8b, 0x85, + 0x7f, 0x7a, 0x76, 0x74, 0x79, 0x79, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, + 0x73, 0x72, 0x72, 0x72, 0x71, 0x70, 0x70, 0x70, 0x69, 0x63, 0x5d, 0x5c, + 0x5d, 0x56, 0x49, 0x3d, 0x83, 0xa9, 0xe2, 0xff, 0xe0, 0x9d, 0x6f, 0x65, + 0x6f, 0x77, 0x79, 0x70, 0x64, 0x68, 0x7e, 0x93, 0x7c, 0x65, 0x45, 0x2e, + 0x2b, 0x3d, 0x59, 0x6d, 0x31, 0x36, 0x45, 0x60, 0x7b, 0x86, 0x7d, 0x71, + 0xe1, 0xd5, 0xb4, 0x83, 0x5f, 0x64, 0x8f, 0xb9, 0x86, 0xb0, 0xce, 0xba, + 0x85, 0x68, 0x7a, 0x9a, 0x69, 0x69, 0x67, 0x61, 0x5d, 0x5f, 0x68, 0x71, + 0x50, 0x3d, 0x2e, 0x37, 0x53, 0x6b, 0x72, 0x6f, 0x5f, 0x3f, 0x37, 0x4e, + 0x55, 0x46, 0x4b, 0x64, 0x66, 0x8c, 0x9e, 0x84, 0x61, 0x5c, 0x6b, 0x77, + 0x65, 0x60, 0x5e, 0x61, 0x65, 0x63, 0x59, 0x50, 0x51, 0x4e, 0x4a, 0x46, + 0x45, 0x46, 0x48, 0x4a, 0x49, 0x4d, 0x54, 0x4c, 0x5c, 0x57, 0x1f, 0x07, + 0xa2, 0x8d, 0x7f, 0x8d, 0xab, 0xb8, 0xa9, 0x92, 0x51, 0x56, 0x5d, 0x60, + 0x5c, 0x52, 0x45, 0x3d, 0xa0, 0xa3, 0xae, 0xbd, 0xc1, 0xab, 0x81, 0x5f, + 0x62, 0x72, 0x8f, 0xaf, 0xc5, 0xc9, 0xbe, 0xb2, 0xb0, 0xae, 0x84, 0x3d, + 0x13, 0x19, 0x26, 0x25, 0x2c, 0x1f, 0x1a, 0x31, 0x57, 0x70, 0x71, 0x66, + 0x88, 0x8b, 0x8e, 0x8e, 0x8a, 0x82, 0x79, 0x73, 0x90, 0xaf, 0xcd, 0xcc, + 0xb0, 0x98, 0x93, 0x9a, 0x58, 0x65, 0x6e, 0x6a, 0x61, 0x66, 0x7c, 0x91, + 0xde, 0xe1, 0xe1, 0xd4, 0xb3, 0x85, 0x57, 0x3a, 0x34, 0x42, 0x66, 0x9f, + 0xd4, 0xe8, 0xd7, 0xbe, 0x9a, 0x8d, 0x79, 0x69, 0x64, 0x69, 0x75, 0x7d, + 0xae, 0x91, 0x73, 0x6c, 0x73, 0x6e, 0x53, 0x37, 0x35, 0x2f, 0x3d, 0x51, + 0x4c, 0x3c, 0x4c, 0x6f, 0x8e, 0x82, 0x91, 0xcd, 0xff, 0xff, 0xb7, 0x6a, + 0x00, 0x23, 0x69, 0x98, 0x9e, 0x89, 0x70, 0x61, 0x24, 0x5a, 0xa1, 0xd6, + 0xef, 0xf4, 0xea, 0xde, 0xae, 0x96, 0x70, 0x4f, 0x41, 0x4c, 0x65, 0x79, + 0x96, 0x95, 0x93, 0x91, 0x8e, 0x8c, 0x8a, 0x89, 0x95, 0x8e, 0x82, 0x77, + 0x70, 0x70, 0x73, 0x75, 0x88, 0x8e, 0x97, 0x9f, 0xa4, 0xa4, 0xa1, 0x9f, + 0x66, 0x67, 0x6a, 0x6e, 0x73, 0x77, 0x7a, 0x7b, 0x7b, 0x75, 0x6b, 0x62, + 0x5e, 0x5f, 0x64, 0x67, 0x62, 0x5c, 0x52, 0x49, 0x42, 0x3f, 0x40, 0x41, + 0x4d, 0x5d, 0x69, 0x64, 0x58, 0x5c, 0x74, 0x8d, 0xb2, 0x9d, 0x80, 0x6a, + 0x62, 0x64, 0x69, 0x6b, 0x43, 0x44, 0x4f, 0x67, 0x7f, 0x87, 0x7b, 0x6b, + 0x7f, 0x7e, 0x7c, 0x79, 0x76, 0x74, 0x72, 0x70, 0x76, 0x78, 0x7a, 0x7d, + 0x80, 0x83, 0x85, 0x86, 0x88, 0x86, 0x82, 0x7e, 0x79, 0x74, 0x71, 0x6f, + 0x5e, 0x5a, 0x58, 0x5c, 0x61, 0x5f, 0x55, 0x4c, 0x50, 0x4b, 0x59, 0x75, + 0x7d, 0x6b, 0x5c, 0x5c, 0x73, 0x89, 0xa2, 0xad, 0xa9, 0x9f, 0x9c, 0x9c, + 0x96, 0x84, 0x68, 0x4d, 0x3d, 0x3a, 0x40, 0x46, 0x3d, 0x53, 0x72, 0x89, + 0x8e, 0x85, 0x78, 0x70, 0x8e, 0x8b, 0x81, 0x70, 0x64, 0x64, 0x71, 0x7d, + 0x6d, 0x86, 0x9c, 0x96, 0x78, 0x5f, 0x59, 0x5e, 0x54, 0x6a, 0x7a, 0x6e, + 0x4f, 0x3b, 0x3f, 0x4d, 0x6a, 0x5b, 0x4d, 0x50, 0x63, 0x75, 0x7e, 0x7e, + 0x92, 0x72, 0x51, 0x3a, 0x1f, 0x0c, 0x20, 0x44, 0x3c, 0x69, 0x99, 0xab, + 0xa4, 0x93, 0x7a, 0x65, 0x66, 0x61, 0x5d, 0x5e, 0x61, 0x5d, 0x52, 0x48, + 0x4d, 0x4b, 0x47, 0x43, 0x42, 0x43, 0x45, 0x47, 0x4a, 0x4d, 0x52, 0x49, + 0x59, 0x55, 0x1e, 0x08, 0x75, 0x7d, 0x90, 0xa9, 0xb5, 0xa2, 0x76, 0x51, + 0x40, 0x3b, 0x34, 0x30, 0x32, 0x3a, 0x44, 0x4a, 0xab, 0xc2, 0xd5, 0xcd, + 0xb4, 0xa8, 0xb6, 0xc9, 0x95, 0x6d, 0x3e, 0x27, 0x28, 0x29, 0x1b, 0x0a, + 0x27, 0x31, 0x25, 0x0c, 0x18, 0x4b, 0x74, 0x7d, 0x95, 0x95, 0x97, 0x9e, + 0xa6, 0xa9, 0xa8, 0xa5, 0x79, 0x7d, 0x82, 0x83, 0x7e, 0x72, 0x65, 0x5c, + 0x53, 0x8d, 0xc1, 0xba, 0x8b, 0x73, 0x8f, 0xb9, 0xc5, 0xca, 0xc7, 0xb6, + 0xa2, 0xa1, 0xb5, 0xcb, 0xb4, 0xb0, 0xa7, 0x98, 0x85, 0x70, 0x5d, 0x52, + 0x68, 0x62, 0x4e, 0x2e, 0x1a, 0x2a, 0x5a, 0x84, 0x89, 0x73, 0x53, 0x3c, + 0x3d, 0x56, 0x77, 0x8f, 0xb4, 0x7c, 0x37, 0x11, 0x15, 0x2a, 0x38, 0x3b, + 0x54, 0x48, 0x4a, 0x56, 0x4c, 0x3d, 0x51, 0x78, 0xae, 0x8f, 0x75, 0x7d, + 0x98, 0x9e, 0x80, 0x5e, 0x56, 0x5b, 0x5d, 0x55, 0x43, 0x30, 0x21, 0x1b, + 0x38, 0x16, 0x21, 0x58, 0x64, 0x44, 0x49, 0x74, 0x9f, 0x8c, 0x79, 0x79, + 0x86, 0x8c, 0x82, 0x76, 0x9c, 0x9b, 0x98, 0x95, 0x91, 0x8d, 0x8b, 0x89, + 0x92, 0x89, 0x7a, 0x6e, 0x6a, 0x6e, 0x76, 0x7c, 0x86, 0x8c, 0x94, 0x9c, + 0x9f, 0x9e, 0x9a, 0x97, 0x87, 0x83, 0x7e, 0x76, 0x6e, 0x67, 0x61, 0x5e, + 0x63, 0x6a, 0x75, 0x7f, 0x84, 0x84, 0x81, 0x7e, 0x5d, 0x58, 0x51, 0x4a, + 0x47, 0x47, 0x4a, 0x4c, 0x67, 0x71, 0x7f, 0x8b, 0x91, 0x91, 0x8d, 0x8a, + 0x81, 0x91, 0xaa, 0xc2, 0xcd, 0xc9, 0xbb, 0xb0, 0xa0, 0x99, 0x93, 0x92, + 0x8f, 0x83, 0x6c, 0x5a, 0x48, 0x4a, 0x4c, 0x4f, 0x52, 0x55, 0x57, 0x59, + 0x5b, 0x5c, 0x60, 0x64, 0x68, 0x6c, 0x6f, 0x71, 0x77, 0x76, 0x74, 0x72, + 0x70, 0x6e, 0x6d, 0x6c, 0x6c, 0x67, 0x63, 0x64, 0x66, 0x62, 0x56, 0x4b, + 0x3e, 0x3c, 0x33, 0x34, 0x53, 0x7e, 0x8e, 0x84, 0xa2, 0x92, 0x77, 0x59, + 0x44, 0x3e, 0x45, 0x4e, 0x6f, 0x73, 0x75, 0x71, 0x62, 0x4d, 0x36, 0x28, + 0x1c, 0x46, 0x69, 0x5f, 0x3d, 0x36, 0x5e, 0x8c, 0x83, 0x4f, 0x19, 0x14, + 0x3d, 0x6d, 0x82, 0x82, 0x70, 0x48, 0x24, 0x2a, 0x4f, 0x68, 0x5e, 0x48, + 0x44, 0x58, 0x6c, 0x6c, 0x5a, 0x46, 0x3d, 0x3d, 0x40, 0x47, 0x55, 0x66, + 0x72, 0x74, 0x6c, 0x64, 0x4e, 0x40, 0x2f, 0x22, 0x22, 0x3f, 0x78, 0xab, + 0xad, 0xa0, 0x93, 0x94, 0x9f, 0xa0, 0x8c, 0x75, 0x6c, 0x67, 0x62, 0x63, + 0x64, 0x5f, 0x54, 0x49, 0x4b, 0x49, 0x45, 0x41, 0x40, 0x41, 0x43, 0x45, + 0x4b, 0x4d, 0x50, 0x46, 0x56, 0x53, 0x1e, 0x09, 0x66, 0x89, 0xb1, 0xbb, + 0xa2, 0x78, 0x55, 0x44, 0x1d, 0x27, 0x35, 0x40, 0x45, 0x41, 0x39, 0x32, + 0x83, 0x95, 0xa2, 0x9a, 0x8a, 0x8f, 0xae, 0xcd, 0xb1, 0xa4, 0x82, 0x4b, + 0x1d, 0x15, 0x34, 0x56, 0x3c, 0x70, 0xa2, 0xba, 0xc8, 0xc5, 0x9c, 0x69, + 0x63, 0xa2, 0xe7, 0xf4, 0xc1, 0x76, 0x3d, 0x24, 0x31, 0x28, 0x1d, 0x18, + 0x1f, 0x31, 0x46, 0x54, 0x4b, 0x41, 0x4b, 0x7b, 0xbb, 0xe2, 0xe0, 0xce, + 0xeb, 0xe4, 0xcd, 0xa5, 0x7e, 0x6e, 0x7a, 0x8c, 0x5d, 0x77, 0x9e, 0xbd, + 0xc7, 0xb8, 0x9e, 0x8b, 0x35, 0x54, 0x75, 0x80, 0x76, 0x70, 0x7a, 0x89, + 0x46, 0x66, 0x94, 0xb6, 0xb9, 0x9d, 0x73, 0x56, 0x48, 0x3f, 0x35, 0x36, + 0x44, 0x59, 0x6b, 0x75, 0x5b, 0x58, 0x67, 0x79, 0x6b, 0x4b, 0x4b, 0x64, + 0x7c, 0x82, 0x85, 0x7a, 0x61, 0x41, 0x26, 0x18, 0x08, 0x14, 0x2a, 0x44, + 0x56, 0x5b, 0x53, 0x49, 0x8c, 0x42, 0x21, 0x42, 0x4b, 0x22, 0x0c, 0x1e, + 0x0c, 0x08, 0x16, 0x3f, 0x72, 0x8c, 0x83, 0x70, 0x85, 0x87, 0x8a, 0x8e, + 0x92, 0x96, 0x99, 0x9b, 0x94, 0x87, 0x76, 0x68, 0x65, 0x6e, 0x7b, 0x85, + 0x88, 0x8d, 0x94, 0x9a, 0x9c, 0x99, 0x95, 0x91, 0xaf, 0xac, 0xa5, 0x9c, + 0x93, 0x8a, 0x83, 0x80, 0x5d, 0x64, 0x6f, 0x79, 0x7e, 0x7e, 0x7a, 0x77, + 0x55, 0x51, 0x4b, 0x45, 0x43, 0x45, 0x48, 0x4b, 0x4e, 0x66, 0x7c, 0x79, + 0x63, 0x54, 0x59, 0x65, 0x84, 0x82, 0x7f, 0x7e, 0x81, 0x8c, 0x99, 0xa3, + 0xc8, 0xc6, 0xc6, 0xcd, 0xd7, 0xde, 0xdf, 0xdd, 0xd6, 0xd2, 0xcb, 0xc2, + 0xb8, 0xaf, 0xa8, 0xa4, 0xa1, 0x9e, 0x99, 0x92, 0x8b, 0x84, 0x7f, 0x7c, + 0x7f, 0x81, 0x84, 0x88, 0x8c, 0x90, 0x93, 0x94, 0x99, 0x91, 0x88, 0x82, + 0x7e, 0x73, 0x62, 0x54, 0x4b, 0x53, 0x52, 0x51, 0x65, 0x81, 0x85, 0x76, + 0x72, 0x7c, 0x8c, 0x9b, 0xa0, 0x97, 0x85, 0x76, 0x59, 0x64, 0x73, 0x7e, + 0x7c, 0x6e, 0x5d, 0x50, 0x67, 0x7f, 0x84, 0x5c, 0x24, 0x13, 0x39, 0x68, + 0xa7, 0x6b, 0x29, 0x17, 0x38, 0x62, 0x76, 0x76, 0x6c, 0x47, 0x2e, 0x42, + 0x70, 0x80, 0x60, 0x37, 0x12, 0x17, 0x28, 0x47, 0x65, 0x70, 0x65, 0x56, + 0x30, 0x3f, 0x53, 0x63, 0x69, 0x69, 0x68, 0x67, 0x6d, 0x47, 0x1f, 0x20, + 0x52, 0x8c, 0xa5, 0xa2, 0xad, 0xa0, 0x90, 0x83, 0x7a, 0x76, 0x7b, 0x82, + 0x72, 0x6d, 0x69, 0x6a, 0x6d, 0x69, 0x5e, 0x53, 0x4b, 0x49, 0x45, 0x41, + 0x40, 0x41, 0x43, 0x45, 0x4c, 0x4c, 0x4e, 0x42, 0x52, 0x51, 0x1e, 0x0a, + 0x88, 0xa8, 0xc4, 0xbd, 0x99, 0x7a, 0x73, 0x7b, 0x5e, 0x7e, 0xab, 0xcc, + 0xce, 0xb1, 0x87, 0x68, 0x74, 0x73, 0x7b, 0x8f, 0xa5, 0xaa, 0x9b, 0x8b, + 0xaa, 0xab, 0xaa, 0xa9, 0xab, 0xb6, 0xc8, 0xd6, 0xfc, 0xe3, 0xa9, 0x71, + 0x6f, 0x97, 0xae, 0xa9, 0x4b, 0x75, 0x93, 0x7a, 0x3f, 0x1c, 0x2c, 0x4c, + 0x76, 0x5f, 0x43, 0x38, 0x4e, 0x83, 0xbf, 0xe7, 0xb6, 0xe1, 0xf6, 0xc5, + 0x6d, 0x3b, 0x4f, 0x79, 0x7b, 0x79, 0x6d, 0x58, 0x48, 0x53, 0x75, 0x94, + 0x7a, 0x80, 0x86, 0x86, 0x7b, 0x67, 0x51, 0x43, 0x37, 0x4b, 0x72, 0xa1, + 0xb7, 0x9c, 0x5b, 0x25, 0x51, 0x87, 0xd4, 0xff, 0xff, 0xd5, 0x88, 0x52, + 0x38, 0x39, 0x39, 0x38, 0x35, 0x2d, 0x22, 0x1b, 0x1c, 0x29, 0x4e, 0x70, + 0x64, 0x38, 0x26, 0x32, 0x2a, 0x3e, 0x4c, 0x40, 0x25, 0x17, 0x22, 0x35, + 0x51, 0x4a, 0x47, 0x4f, 0x5a, 0x59, 0x48, 0x37, 0x19, 0x1c, 0x35, 0x75, + 0xc8, 0xfe, 0xfb, 0xe1, 0x73, 0x5f, 0x4f, 0x55, 0x6a, 0x75, 0x6d, 0x5f, + 0x8c, 0x8c, 0x8a, 0x88, 0x87, 0x85, 0x83, 0x83, 0x7e, 0x6f, 0x5a, 0x4b, + 0x49, 0x55, 0x67, 0x74, 0x7e, 0x82, 0x89, 0x8e, 0x8e, 0x8a, 0x85, 0x81, + 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x69, 0x62, 0x58, 0x4f, + 0x4b, 0x4d, 0x51, 0x54, 0x4d, 0x48, 0x41, 0x3b, 0x37, 0x38, 0x3a, 0x3d, + 0x3c, 0x46, 0x47, 0x37, 0x2b, 0x3d, 0x6d, 0x97, 0xb3, 0xb9, 0xbd, 0xbb, + 0xb5, 0xb2, 0xb3, 0xb7, 0x9a, 0x95, 0x8c, 0x84, 0x7f, 0x7c, 0x7b, 0x7b, + 0x95, 0x98, 0x9d, 0xa3, 0xaa, 0xb1, 0xb6, 0xb9, 0xb6, 0xb7, 0xba, 0xbe, + 0xc1, 0xc5, 0xc8, 0xc9, 0xd0, 0xcf, 0xcc, 0xc9, 0xc6, 0xc2, 0xc0, 0xbe, + 0x9f, 0x9b, 0x97, 0x9a, 0x9d, 0x9a, 0x8f, 0x84, 0x80, 0x74, 0x78, 0x8f, + 0x9a, 0x93, 0x91, 0x9a, 0x9b, 0x82, 0x62, 0x4d, 0x48, 0x48, 0x45, 0x40, + 0x6c, 0x6b, 0x6a, 0x6c, 0x72, 0x7c, 0x85, 0x8b, 0x6b, 0x6f, 0x72, 0x74, + 0x76, 0x7c, 0x86, 0x8e, 0x67, 0x7b, 0x91, 0x99, 0x8e, 0x7a, 0x68, 0x5f, + 0x47, 0x44, 0x40, 0x3c, 0x36, 0x2b, 0x1e, 0x15, 0x29, 0x1d, 0x1c, 0x35, + 0x59, 0x6a, 0x5d, 0x49, 0x4f, 0x53, 0x52, 0x4a, 0x43, 0x4b, 0x60, 0x74, + 0x9a, 0x9c, 0x87, 0x65, 0x5b, 0x69, 0x6d, 0x61, 0x65, 0x6d, 0x7f, 0x90, + 0x8b, 0x78, 0x6f, 0x72, 0x6f, 0x6b, 0x69, 0x6d, 0x72, 0x70, 0x67, 0x5e, + 0x4d, 0x4b, 0x47, 0x43, 0x42, 0x43, 0x45, 0x47, 0x4d, 0x4c, 0x4c, 0x3f, + 0x4f, 0x4f, 0x1d, 0x0b, 0x3f, 0x6d, 0xaa, 0xd2, 0xce, 0xa5, 0x71, 0x4e, + 0x3b, 0x36, 0x2e, 0x28, 0x26, 0x28, 0x2c, 0x2f, 0x41, 0x7d, 0xbd, 0xce, + 0xb6, 0xa2, 0xad, 0xc4, 0x9d, 0x8d, 0x85, 0x94, 0xa8, 0xa4, 0x80, 0x5c, + 0x45, 0x4f, 0x4d, 0x4b, 0x66, 0x89, 0x83, 0x63, 0x6f, 0x98, 0xbd, 0xb8, + 0x94, 0x79, 0x7f, 0x92, 0x6d, 0x63, 0x57, 0x55, 0x63, 0x7f, 0x9e, 0xb3, + 0xda, 0x89, 0x44, 0x54, 0x98, 0xad, 0x6f, 0x22, 0x29, 0x49, 0x71, 0x8a, + 0x95, 0xa1, 0xb4, 0xc6, 0xdb, 0xc7, 0xa7, 0x86, 0x6c, 0x5e, 0x59, 0x59, + 0x63, 0x48, 0x31, 0x3c, 0x66, 0x93, 0xac, 0xb3, 0x9f, 0xad, 0xbd, 0xbf, + 0xab, 0x82, 0x55, 0x37, 0x9f, 0x69, 0x29, 0x0b, 0x12, 0x23, 0x26, 0x21, + 0x35, 0x1f, 0x17, 0x1d, 0x1c, 0x21, 0x4c, 0x82, 0x8d, 0x94, 0x96, 0x88, + 0x6e, 0x57, 0x4a, 0x48, 0x6d, 0x50, 0x32, 0x2e, 0x44, 0x5b, 0x62, 0x5f, + 0x39, 0x3a, 0x3e, 0x4b, 0x59, 0x55, 0x35, 0x14, 0x63, 0x50, 0x39, 0x2e, + 0x32, 0x3c, 0x43, 0x45, 0x88, 0x8a, 0x8e, 0x92, 0x97, 0x9c, 0x9f, 0xa1, + 0xaa, 0x95, 0x75, 0x59, 0x4c, 0x50, 0x5d, 0x68, 0x78, 0x7c, 0x82, 0x86, + 0x86, 0x81, 0x7b, 0x76, 0x62, 0x63, 0x65, 0x68, 0x6b, 0x6e, 0x70, 0x72, + 0x7d, 0x75, 0x69, 0x5d, 0x56, 0x54, 0x56, 0x58, 0x55, 0x4f, 0x46, 0x3e, + 0x38, 0x36, 0x37, 0x39, 0x4c, 0x40, 0x3d, 0x55, 0x79, 0x8c, 0x84, 0x74, + 0x8d, 0x99, 0xa5, 0xa6, 0x9d, 0x93, 0x8f, 0x90, 0x97, 0x9d, 0xa5, 0xac, + 0xaf, 0xb2, 0xb5, 0xb8, 0xc4, 0xc2, 0xbe, 0xb9, 0xb4, 0xaf, 0xab, 0xa9, + 0xab, 0xa9, 0xa4, 0x9e, 0x98, 0x92, 0x8d, 0x8b, 0x80, 0x7d, 0x78, 0x70, + 0x68, 0x61, 0x5b, 0x58, 0x5f, 0x5c, 0x5c, 0x63, 0x6b, 0x6d, 0x65, 0x5d, + 0x4e, 0x44, 0x50, 0x73, 0x8a, 0x84, 0x79, 0x78, 0x97, 0x8f, 0x8b, 0x94, + 0x9e, 0x99, 0x82, 0x6c, 0x6b, 0x63, 0x58, 0x51, 0x53, 0x5c, 0x69, 0x72, + 0x6e, 0x68, 0x67, 0x6f, 0x79, 0x77, 0x68, 0x59, 0x5d, 0x7c, 0x9d, 0xa3, + 0x92, 0x85, 0x8b, 0x98, 0xa5, 0xa1, 0x95, 0x81, 0x6f, 0x6c, 0x78, 0x85, + 0x79, 0x6f, 0x62, 0x5a, 0x5a, 0x5b, 0x5a, 0x58, 0x4f, 0x53, 0x4d, 0x36, + 0x1c, 0x15, 0x25, 0x38, 0x43, 0x8f, 0xbd, 0x9a, 0x68, 0x61, 0x73, 0x7c, + 0x8b, 0x78, 0x74, 0x86, 0x90, 0x82, 0x70, 0x6b, 0x64, 0x61, 0x61, 0x68, + 0x70, 0x71, 0x6a, 0x62, 0x51, 0x4e, 0x4a, 0x46, 0x45, 0x46, 0x48, 0x4a, + 0x4e, 0x4c, 0x4a, 0x3c, 0x4c, 0x4d, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, + 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, + 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, + 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, + 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, + 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, + 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, + 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, + 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, + 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, + 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, + 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, + 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, + 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, 0x29, 0x32, 0x4e, 0x7b, + 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, 0xba, 0xcd, 0xdc, 0xd4, + 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, 0x38, 0x49, 0x60, 0x6c, + 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, 0xe4, 0xdd, 0xcc, 0xad, + 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, 0x34, 0x1c, 0x1d, 0x53, + 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, 0x58, 0x3e, 0x27, 0x2a, + 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, 0x73, 0x72, 0x70, 0x6d, + 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, 0x26, 0x3a, 0x55, 0x6b, + 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, 0x9c, 0x99, 0x95, 0x8e, + 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, 0xb3, 0xab, 0xa3, 0x9f, + 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, 0x89, 0x88, 0x84, 0x7f, + 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, 0x8e, 0x81, 0x78, 0x81, + 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, 0x34, 0x79, 0xa7, 0x9b, + 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, 0x53, 0x50, 0x4c, 0x49, + 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, 0x3f, 0x3f, 0x3c, 0x39, + 0x33, 0x2d, 0x27, 0x24, 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, 0x5b, 0x6a, 0x72, 0x78, + 0x95, 0xae, 0x98, 0x6c, 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, 0x5a, 0x40, 0x2b, 0x36, + 0x56, 0x69, 0x60, 0x4d, 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, 0x12, 0x1e, 0x24, 0x1b, + 0x11, 0x1d, 0x40, 0x60, 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, 0x48, 0x36, 0x34, 0x43, + 0x4d, 0x5c, 0x90, 0xcb, 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, 0x59, 0x34, 0x36, 0x59, + 0x4e, 0x1e, 0x1d, 0x49, 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, 0x7e, 0x6f, 0x5b, 0x4f, + 0x54, 0x6a, 0x86, 0x99, 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, 0x5c, 0x60, 0x66, 0x68, + 0x66, 0x5e, 0x56, 0x50, 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, 0xa8, 0xab, 0xaa, 0xa3, + 0x9d, 0xa4, 0xb6, 0xc6, 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, 0x8f, 0x91, 0x95, 0x99, + 0x9e, 0xa3, 0xa6, 0xa8, 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, 0x66, 0x60, 0x52, 0x53, + 0x73, 0x98, 0x9a, 0x85, 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, 0x6a, 0x73, 0x7a, 0x78, + 0x70, 0x6c, 0x71, 0x78, 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, 0x98, 0x9f, 0x9c, 0x89, + 0x73, 0x74, 0x8e, 0xa9, 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, 0x63, 0x51, 0x51, 0x68, + 0x73, 0x65, 0x56, 0x55, 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4c, 0x49, 0x3a, + 0x4a, 0x4c, 0x1d, 0x0c}; + +/* + Initialization- and return-value-related functions +*/ + +__attribute__((always_inline)) static inline void +mpeg2_init(void) { + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = (unsigned char *) &mpeg2_oldorgframe[0]; + __pragma_loopbound(90112, 90112); + for (i = 0; i < sizeof(mpeg2_oldorgframe); ++i, ++p) + *p ^= bitmask; +} + +__attribute__((always_inline)) static inline int +mpeg2_return(void) { + int checksum = 0; + int i, j, k, l; + + __pragma_loopbound(352, 352); + for (i = 0; i < 352; i++) { + j = 0; + __pragma_loopbound(2, 2); + for (; j < 2; j++) { + k = 0; + __pragma_loopbound(2, 2); + for (; k < 2; k++) { + l = 0; + __pragma_loopbound(2, 2); + for (; l < 2; l++) + checksum += mpeg2_mbinfo[i].MV[j][k][l]; + } + } + } + + return (checksum); +} + +/* + Algorithm core functions +*/ + +/* + motion estimation for progressive and interlaced frame pictures + + oldorg: source frame for forward prediction (used for P and B frames) + neworg: source frame for backward prediction (B frames only) + oldref: reconstructed frame for forward prediction (P and B frames) + newref: reconstructed frame for backward prediction (B frames only) + cur: current frame (the one for which the prediction is formed) + sxf,syf: forward search window (frame coordinates) + sxb,syb: backward search window (frame coordinates) + mbi: pointer to macroblock info structure + + results: + mbi-> + mb_type: 0, MB_INTRA, MB_FORWARD, MB_BACKWARD, MB_FORWARD|MB_BACKWARD + MV[][][]: motion vectors (frame format) + mv_field_sel: top/bottom field (for field prediction) + motion_type: MC_FRAME, MC_FIELD + + uses global vars: mpeg2_pict_type, frame_pred_dct +*/ +__attribute__((always_inline)) static inline void +mpeg2_motion_estimation(unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, + unsigned char *cur, unsigned char *curref, int sxf, + int syf, int sxb, int syb, struct mbinfo *mbi, + int secondfield, int ipflag) { + int i, j; + + /* loop through all macroblocks of the picture */ + __pragma_loopbound(16, 16); + for (j = 0; j < mpeg2_height2; j += 16) { + i = 0; + __pragma_loopbound(22, 22); + for (; i < mpeg2_width; i += 16) { + if (mpeg2_pict_struct == 3) + mpeg2_frame_ME(oldorg, neworg, oldref, newref, cur, i, j, sxf, + syf, sxb, syb, mbi); + else + mpeg2_field_ME(oldorg, neworg, oldref, newref, cur, curref, i, + j, sxf, syf, sxb, syb, mbi, secondfield, ipflag); + mbi++; + } + } +} + +__attribute__((always_inline)) static inline void +mpeg2_frame_ME(unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, unsigned char *cur, + int i, int j, int sxf, int syf, int sxb, int syb, + struct mbinfo *mbi) { + int imin, jmin, iminf, jminf, iminr, jminr; + int imint, jmint, iminb, jminb; + int imintf, jmintf, iminbf, jminbf; + int imintr, jmintr, iminbr, jminbr; + int var, v0; + int dmc, dmcf, dmcr, dmci, vmc, vmcf, vmcr, vmci; + int dmcfield, dmcfieldf, dmcfieldr, dmcfieldi; + int tsel, bsel, tself, bself, tselr, bselr; + unsigned char *mb; + int imins[2][2], jmins[2][2]; + int imindp, jmindp, imindmv, jmindmv, dmc_dp, vmc_dp; + + mb = cur + i + mpeg2_width * j; + + var = mpeg2_variance(mb, mpeg2_width); + + if (mpeg2_pict_type == 1) + mbi->mb_type = 1; + else + + if (mpeg2_pict_type == 2) { + if (mpeg2_frame_pred_dct) { + dmc = mpeg2_fullsearch(oldorg, oldref, mb, mpeg2_width, i, j, sxf, + syf, 16, mpeg2_width, mpeg2_height, &imin, + &jmin); + vmc = mpeg2_dist2(oldref + (imin >> 1) + mpeg2_width * (jmin >> 1), + mb, mpeg2_width, imin & 1, jmin & 1, 16); + mbi->motion_type = 2; + } else { + mpeg2_frame_estimate(oldorg, oldref, mb, i, j, sxf, syf, &imin, + &jmin, &imint, &jmint, &iminb, &jminb, &dmc, + &dmcfield, &tsel, &bsel, imins, jmins); + + if (mpeg2_M == 1) + mpeg2_dpframe_estimate(oldref, mb, i, j >> 1, imins, jmins, + &imindp, &jmindp, &imindmv, &jmindmv, + &dmc_dp, &vmc_dp); + + /* select between dual prime, frame and field prediction */ + if ((mpeg2_M == 1) && (dmc_dp < dmc) && (dmc_dp < dmcfield)) { + mbi->motion_type = 3; + dmc = dmc_dp; + vmc = vmc_dp; + } else + + if (dmc <= dmcfield) { + mbi->motion_type = 2; + vmc = mpeg2_dist2(oldref + (imin >> 1) + + mpeg2_width * (jmin >> 1), + mb, mpeg2_width, imin & 1, jmin & 1, 16); + } else { + mbi->motion_type = 1; + dmc = dmcfield; + vmc = mpeg2_dist2( + oldref + (tsel ? mpeg2_width : 0) + (imint >> 1) + + (mpeg2_width << 1) * (jmint >> 1), + mb, mpeg2_width << 1, imint & 1, jmint & 1, 8); + vmc += mpeg2_dist2(oldref + (bsel ? mpeg2_width : 0) + + (iminb >> 1) + + (mpeg2_width << 1) * (jminb >> 1), + mb + mpeg2_width, mpeg2_width << 1, + iminb & 1, jminb & 1, 8); + } + } + + /* + select between intra or non-intra coding: + + selection is based on intra block variance (var) vs. + prediction error variance (vmc) + + blocks with small prediction error are always coded non-intra + even if variance is smaller (is this reasonable?) + */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + /* + select between MC / No-MC + + use No-MC if var(No-MC) <= 1.25*var(MC) + (i.e slightly biased towards No-MC) + + blocks with small prediction error are always coded as No-MC + (requires no motion vectors, allows skipping) + */ + v0 = mpeg2_dist2(oldref + i + mpeg2_width * j, mb, mpeg2_width, 0, + 0, 16); + + if ((4 * v0 > 5 * vmc) && (v0 >= 9 * 256)) { + /* use MC */ + var = vmc; + mbi->mb_type = 8; + + if (mbi->motion_type == 2) { + mbi->MV[0][0][0] = imin - (i << 1); + mbi->MV[0][0][1] = jmin - (j << 1); + } else + + if (mbi->motion_type == 3) { + /* these are FRAME vectors */ + /* same parity vector */ + mbi->MV[0][0][0] = imindp - (i << 1); + mbi->MV[0][0][1] = (jmindp << 1) - (j << 1); + + /* opposite parity vector */ + mbi->dmvector[0] = imindmv; + mbi->dmvector[1] = jmindmv; + } else { + /* these are FRAME vectors */ + mbi->MV[0][0][0] = imint - (i << 1); + mbi->MV[0][0][1] = (jmint << 1) - (j << 1); + mbi->MV[1][0][0] = iminb - (i << 1); + mbi->MV[1][0][1] = (jminb << 1) - (j << 1); + mbi->mv_field_sel[0][0] = tsel; + mbi->mv_field_sel[1][0] = bsel; + } + } else { + /* No-MC */ + var = v0; + mbi->mb_type = 0; + mbi->motion_type = 2; + mbi->MV[0][0][0] = 0; + mbi->MV[0][0][1] = 0; + } + } + } else { /* if (mpeg2_pict_type==B_TYPE) */ + + if (mpeg2_frame_pred_dct) { + /* forward */ + dmcf = mpeg2_fullsearch(oldorg, oldref, mb, mpeg2_width, i, j, sxf, + syf, 16, mpeg2_width, mpeg2_height, &iminf, + &jminf); + vmcf = + mpeg2_dist2(oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + mb, mpeg2_width, iminf & 1, jminf & 1, 16); + + /* backward */ + dmcr = mpeg2_fullsearch(neworg, newref, mb, mpeg2_width, i, j, sxb, + syb, 16, mpeg2_width, mpeg2_height, &iminr, + &jminr); + vmcr = + mpeg2_dist2(newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), + mb, mpeg2_width, iminr & 1, jminr & 1, 16); + + /* interpolated (bidirectional) */ + vmci = mpeg2_bdist2( + oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), mb, + mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16); + + /* decisions */ + + /* + select between forward/backward/interpolated prediction: + use the one with smallest mean sqaured prediction error + */ + if ((vmcf <= vmcr) && (vmcf <= vmci)) { + vmc = vmcf; + mbi->mb_type = 8; + } else + + if (vmcr <= vmci) { + vmc = vmcr; + mbi->mb_type = 4; + } else { + vmc = vmci; + mbi->mb_type = 8 | 4; + } + + mbi->motion_type = 2; + } else { + /* forward prediction */ + mpeg2_frame_estimate(oldorg, oldref, mb, i, j, sxf, syf, &iminf, + &jminf, &imintf, &jmintf, &iminbf, &jminbf, + &dmcf, &dmcfieldf, &tself, &bself, imins, + jmins); + + /* backward prediction */ + mpeg2_frame_estimate(neworg, newref, mb, i, j, sxb, syb, &iminr, + &jminr, &imintr, &jmintr, &iminbr, &jminbr, + &dmcr, &dmcfieldr, &tselr, &bselr, imins, + jmins); + + /* calculate interpolated distance */ + /* frame */ + dmci = mpeg2_bdist1( + oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), mb, + mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16); + + /* top field */ + dmcfieldi = mpeg2_bdist1( + oldref + (imintf >> 1) + (tself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintf >> 1), + newref + (imintr >> 1) + (tselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintr >> 1), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, imintr & 1, + jmintr & 1, 8); + + /* bottom field */ + dmcfieldi += mpeg2_bdist1( + oldref + (iminbf >> 1) + (bself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbf >> 1), + newref + (iminbr >> 1) + (bselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbr >> 1), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, + iminbr & 1, jminbr & 1, 8); + + /* + select prediction type of minimum distance from the + six candidates (field/frame * forward/backward/interpolated) + */ + if ((dmci < dmcfieldi) && (dmci < dmcf) && (dmci < dmcfieldf) && + (dmci < dmcr) && (dmci < dmcfieldr)) { + /* frame, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 2; + vmc = mpeg2_bdist2( + oldref + (iminf >> 1) + mpeg2_width * (jminf >> 1), + newref + (iminr >> 1) + mpeg2_width * (jminr >> 1), mb, + mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, + 16); + } else + + if ((dmcfieldi < dmcf) && (dmcfieldi < dmcfieldf) && + (dmcfieldi < dmcr) && (dmcfieldi < dmcfieldr)) { + /* field, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 1; + vmc = mpeg2_bdist2( + oldref + (imintf >> 1) + (tself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintf >> 1), + newref + (imintr >> 1) + (tselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jmintr >> 1), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, imintr & 1, + jmintr & 1, 8); + vmc += mpeg2_bdist2( + oldref + (iminbf >> 1) + (bself ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbf >> 1), + newref + (iminbr >> 1) + (bselr ? mpeg2_width : 0) + + (mpeg2_width << 1) * (jminbr >> 1), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, + iminbr & 1, jminbr & 1, 8); + } else + + if ((dmcf < dmcfieldf) && (dmcf < dmcr) && (dmcf < dmcfieldr)) { + /* frame, forward */ + mbi->mb_type = 8; + mbi->motion_type = 2; + vmc = mpeg2_dist2(oldref + (iminf >> 1) + + mpeg2_width * (jminf >> 1), + mb, mpeg2_width, iminf & 1, jminf & 1, 16); + } else + + if ((dmcfieldf < dmcr) && (dmcfieldf < dmcfieldr)) { + /* field, forward */ + mbi->mb_type = 8; + mbi->motion_type = 1; + vmc = mpeg2_dist2( + oldref + (tself ? mpeg2_width : 0) + (imintf >> 1) + + (mpeg2_width << 1) * (jmintf >> 1), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, 8); + vmc += mpeg2_dist2(oldref + (bself ? mpeg2_width : 0) + + (iminbf >> 1) + + (mpeg2_width << 1) * (jminbf >> 1), + mb + mpeg2_width, mpeg2_width << 1, + iminbf & 1, jminbf & 1, 8); + } else + + if (dmcr < dmcfieldr) { + /* frame, backward */ + mbi->mb_type = 4; + mbi->motion_type = 2; + vmc = mpeg2_dist2(newref + (iminr >> 1) + + mpeg2_width * (jminr >> 1), + mb, mpeg2_width, iminr & 1, jminr & 1, 16); + } else { + /* field, backward */ + mbi->mb_type = 4; + mbi->motion_type = 1; + vmc = mpeg2_dist2( + newref + (tselr ? mpeg2_width : 0) + (imintr >> 1) + + (mpeg2_width << 1) * (jmintr >> 1), + mb, mpeg2_width << 1, imintr & 1, jmintr & 1, 8); + vmc += mpeg2_dist2(newref + (bselr ? mpeg2_width : 0) + + (iminbr >> 1) + + (mpeg2_width << 1) * (jminbr >> 1), + mb + mpeg2_width, mpeg2_width << 1, + iminbr & 1, jminbr & 1, 8); + } + } + + /* + select between intra or non-intra coding: + + selection is based on intra block variance (var) vs. + prediction error variance (vmc) + + blocks with small prediction error are always coded non-intra + even if variance is smaller (is this reasonable?) + */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + var = vmc; + + if (mbi->motion_type == 2) { + /* forward */ + mbi->MV[0][0][0] = iminf - (i << 1); + mbi->MV[0][0][1] = jminf - (j << 1); + /* backward */ + mbi->MV[0][1][0] = iminr - (i << 1); + mbi->MV[0][1][1] = jminr - (j << 1); + } else { + /* these are FRAME vectors */ + /* forward */ + mbi->MV[0][0][0] = imintf - (i << 1); + mbi->MV[0][0][1] = (jmintf << 1) - (j << 1); + mbi->MV[1][0][0] = iminbf - (i << 1); + mbi->MV[1][0][1] = (jminbf << 1) - (j << 1); + mbi->mv_field_sel[0][0] = tself; + mbi->mv_field_sel[1][0] = bself; + /* backward */ + mbi->MV[0][1][0] = imintr - (i << 1); + mbi->MV[0][1][1] = (jmintr << 1) - (j << 1); + mbi->MV[1][1][0] = iminbr - (i << 1); + mbi->MV[1][1][1] = (jminbr << 1) - (j << 1); + mbi->mv_field_sel[0][1] = tselr; + mbi->mv_field_sel[1][1] = bselr; + } + } + } + + mbi->var = var; +} + +/* + motion estimation for field pictures + + oldorg: original frame for forward prediction (P and B frames) + neworg: original frame for backward prediction (B frames only) + oldref: reconstructed frame for forward prediction (P and B frames) + newref: reconstructed frame for backward prediction (B frames only) + cur: current original frame (the one for which the prediction is formed) + curref: current reconstructed frame (to predict second field from first) + sxf,syf: forward search window (frame coordinates) + sxb,syb: backward search window (frame coordinates) + mbi: pointer to macroblock info structure + secondfield: indicates second field of a frame (in P fields this means + that reference field of opposite parity is in curref instead + of oldref) + ipflag: indicates a P type field which is the second field of a frame + in which the first field is I type (this restricts predictions + to be based only on the opposite parity (=I) field) + + results: + mbi-> + mb_type: 0, MB_INTRA, MB_FORWARD, MB_BACKWARD, MB_FORWARD|MB_BACKWARD + MV[][][]: motion vectors (field format) + mv_field_sel: top/bottom field + motion_type: MC_FIELD, MC_16X8 + + uses global vars: mpeg2_pict_type, mpeg2_pict_struct +*/ +__attribute__((always_inline)) static inline void +mpeg2_field_ME(unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, unsigned char *cur, + unsigned char *curref, int i, int j, int sxf, int syf, int sxb, + int syb, struct mbinfo *mbi, int secondfield, int ipflag) { + int w2; + unsigned char *mb, *toporg, *topref, *botorg, *botref; + int var, vmc, v0, dmcfieldi, dmc8i; + int imin, jmin, imin8u, jmin8u, imin8l, jmin8l, dmcfield, dmc8, sel, sel8u, + sel8l; + int iminf, jminf, imin8uf, jmin8uf, imin8lf, jmin8lf, dmcfieldf, dmc8f, + self, sel8uf, sel8lf; + int iminr, jminr, imin8ur, jmin8ur, imin8lr, jmin8lr, dmcfieldr, dmc8r, + selr, sel8ur, sel8lr; + int imins, jmins, ds, imindmv, jmindmv, vmc_dp, dmc_dp; + + w2 = mpeg2_width << 1; + mb = cur + i + w2 * j; + + if (mpeg2_pict_struct == 2) + mb += mpeg2_width; + + var = mpeg2_variance(mb, w2); + + if (mpeg2_pict_type == 1) + mbi->mb_type = 1; + else + + if (mpeg2_pict_type == 2) { + toporg = oldorg; + topref = oldref; + botorg = oldorg + mpeg2_width; + botref = oldref + mpeg2_width; + + if (secondfield) { + /* opposite parity field is in same frame */ + if (mpeg2_pict_struct == 1) { + /* current is top field */ + botorg = cur + mpeg2_width; + botref = curref + mpeg2_width; + } else { + /* current is bottom field */ + toporg = cur; + topref = curref; + } + } + + mpeg2_field_estimate(toporg, topref, botorg, botref, mb, i, j, sxf, syf, + ipflag, &imin, &jmin, &imin8u, &jmin8u, &imin8l, + &jmin8l, &dmcfield, &dmc8, &sel, &sel8u, &sel8l, + &imins, &jmins, &ds); + + if ((mpeg2_M == 1) && !ipflag) + /* generic condition which permits Dual Prime */ + mpeg2_dpfield_estimate(topref, botref, mb, i, j, imins, jmins, + &imindmv, &jmindmv, &dmc_dp, &vmc_dp); + + /* select between dual prime, field and 16x8 prediction */ + if ((mpeg2_M == 1) && !ipflag && (dmc_dp < dmc8) && + (dmc_dp < dmcfield)) { + /* Dual Prime prediction */ + mbi->motion_type = 3; + vmc = vmc_dp; /* we already calculated L2 error for Dual */ + + } else + + if (dmc8 < dmcfield) { + /* 16x8 prediction */ + mbi->motion_type = 2; + /* upper half block */ + vmc = mpeg2_dist2((sel8u ? botref : topref) + (imin8u >> 1) + + w2 * (jmin8u >> 1), + mb, w2, imin8u & 1, jmin8u & 1, 8); + /* lower half block */ + vmc += mpeg2_dist2((sel8l ? botref : topref) + (imin8l >> 1) + + w2 * (jmin8l >> 1), + mb + 8 * w2, w2, imin8l & 1, jmin8l & 1, 8); + } else { + /* field prediction */ + mbi->motion_type = 1; + vmc = mpeg2_dist2((sel ? botref : topref) + (imin >> 1) + + w2 * (jmin >> 1), + mb, w2, imin & 1, jmin & 1, 16); + } + + /* select between intra and non-intra coding */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + /* + zero MV field prediction from same parity ref. field + (not allowed if ipflag is set) + */ + if (!ipflag) + v0 = mpeg2_dist2(((mpeg2_pict_struct == 2) ? botref : topref) + + i + w2 * j, + mb, w2, 0, 0, 16); + + if (ipflag || ((4 * v0 > 5 * vmc) && (v0 >= 9 * 256))) { + var = vmc; + mbi->mb_type = 8; + + if (mbi->motion_type == 1) { + mbi->MV[0][0][0] = imin - (i << 1); + mbi->MV[0][0][1] = jmin - (j << 1); + mbi->mv_field_sel[0][0] = sel; + } else + + if (mbi->motion_type == 3) { + /* same parity vector */ + mbi->MV[0][0][0] = imins - (i << 1); + mbi->MV[0][0][1] = jmins - (j << 1); + + /* opposite parity vector */ + mbi->dmvector[0] = imindmv; + mbi->dmvector[1] = jmindmv; + } else { + mbi->MV[0][0][0] = imin8u - (i << 1); + mbi->MV[0][0][1] = jmin8u - (j << 1); + mbi->MV[1][0][0] = imin8l - (i << 1); + mbi->MV[1][0][1] = jmin8l - ((j + 8) << 1); + mbi->mv_field_sel[0][0] = sel8u; + mbi->mv_field_sel[1][0] = sel8l; + } + } else { + /* No MC */ + var = v0; + mbi->mb_type = 0; + mbi->motion_type = 1; + mbi->MV[0][0][0] = 0; + mbi->MV[0][0][1] = 0; + mbi->mv_field_sel[0][0] = (mpeg2_pict_struct == 2); + } + } + } else { /* if (mpeg2_pict_type==B_TYPE) */ + /* forward prediction */ + mpeg2_field_estimate(oldorg, oldref, oldorg + mpeg2_width, + oldref + mpeg2_width, mb, i, j, sxf, syf, 0, + &iminf, &jminf, &imin8uf, &jmin8uf, &imin8lf, + &jmin8lf, &dmcfieldf, &dmc8f, &self, &sel8uf, + &sel8lf, &imins, &jmins, &ds); + + /* backward prediction */ + mpeg2_field_estimate(neworg, newref, neworg + mpeg2_width, + newref + mpeg2_width, mb, i, j, sxb, syb, 0, + &iminr, &jminr, &imin8ur, &jmin8ur, &imin8lr, + &jmin8lr, &dmcfieldr, &dmc8r, &selr, &sel8ur, + &sel8lr, &imins, &jmins, &ds); + + /* calculate distances for bidirectional prediction */ + /* field */ + dmcfieldi = mpeg2_bdist1(oldref + (self ? mpeg2_width : 0) + + (iminf >> 1) + w2 * (jminf >> 1), + newref + (selr ? mpeg2_width : 0) + + (iminr >> 1) + w2 * (jminr >> 1), + mb, w2, iminf & 1, jminf & 1, iminr & 1, + jminr & 1, 16); + + /* 16x8 upper half block */ + dmc8i = mpeg2_bdist1(oldref + (sel8uf ? mpeg2_width : 0) + + (imin8uf >> 1) + w2 * (jmin8uf >> 1), + newref + (sel8ur ? mpeg2_width : 0) + + (imin8ur >> 1) + w2 * (jmin8ur >> 1), + mb, w2, imin8uf & 1, jmin8uf & 1, imin8ur & 1, + jmin8ur & 1, 8); + + /* 16x8 lower half block */ + dmc8i += mpeg2_bdist1(oldref + (sel8lf ? mpeg2_width : 0) + + (imin8lf >> 1) + w2 * (jmin8lf >> 1), + newref + (sel8lr ? mpeg2_width : 0) + + (imin8lr >> 1) + w2 * (jmin8lr >> 1), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, + imin8lr & 1, jmin8lr & 1, 8); + + /* select prediction type of minimum distance */ + if ((dmcfieldi < dmc8i) && (dmcfieldi < dmcfieldf) && + (dmcfieldi < dmc8f) && (dmcfieldi < dmcfieldr) && + (dmcfieldi < dmc8r)) { + /* field, interpolated */ + mbi->mb_type = 8 | 5; + mbi->motion_type = 1; + vmc = mpeg2_bdist2(oldref + (self ? mpeg2_width : 0) + + (iminf >> 1) + w2 * (jminf >> 1), + newref + (selr ? mpeg2_width : 0) + + (iminr >> 1) + w2 * (jminr >> 1), + mb, w2, iminf & 1, jminf & 1, iminr & 1, + jminr & 1, 16); + } else + + if ((dmc8i < dmcfieldf) && (dmc8i < dmc8f) && (dmc8i < dmcfieldr) && + (dmc8i < dmc8r)) { + /* 16x8, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 2; + + /* upper half block */ + vmc = mpeg2_bdist2(oldref + (sel8uf ? mpeg2_width : 0) + + (imin8uf >> 1) + w2 * (jmin8uf >> 1), + newref + (sel8ur ? mpeg2_width : 0) + + (imin8ur >> 1) + w2 * (jmin8ur >> 1), + mb, w2, imin8uf & 1, jmin8uf & 1, imin8ur & 1, + jmin8ur & 1, 8); + + /* lower half block */ + vmc += mpeg2_bdist2(oldref + (sel8lf ? mpeg2_width : 0) + + (imin8lf >> 1) + w2 * (jmin8lf >> 1), + newref + (sel8lr ? mpeg2_width : 0) + + (imin8lr >> 1) + w2 * (jmin8lr >> 1), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, + imin8lr & 1, jmin8lr & 1, 8); + } else + + if ((dmcfieldf < dmc8f) && (dmcfieldf < dmcfieldr) && + (dmcfieldf < dmc8r)) { + /* field, forward */ + mbi->mb_type = 8; + mbi->motion_type = 1; + vmc = mpeg2_dist2(oldref + (self ? mpeg2_width : 0) + (iminf >> 1) + + w2 * (jminf >> 1), + mb, w2, iminf & 1, jminf & 1, 16); + } else + + if ((dmc8f < dmcfieldr) && (dmc8f < dmc8r)) { + /* 16x8, forward */ + mbi->mb_type = 8; + mbi->motion_type = 2; + + /* upper half block */ + vmc = mpeg2_dist2(oldref + (sel8uf ? mpeg2_width : 0) + + (imin8uf >> 1) + w2 * (jmin8uf >> 1), + mb, w2, imin8uf & 1, jmin8uf & 1, 8); + + /* lower half block */ + vmc += mpeg2_dist2(oldref + (sel8lf ? mpeg2_width : 0) + + (imin8lf >> 1) + w2 * (jmin8lf >> 1), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, 8); + } else + + if (dmcfieldr < dmc8r) { + /* field, backward */ + mbi->mb_type = 4; + mbi->motion_type = 1; + vmc = mpeg2_dist2(newref + (selr ? mpeg2_width : 0) + (iminr >> 1) + + w2 * (jminr >> 1), + mb, w2, iminr & 1, jminr & 1, 16); + } else { + /* 16x8, backward */ + mbi->mb_type = 4; + mbi->motion_type = 2; + + /* upper half block */ + vmc = mpeg2_dist2(newref + (sel8ur ? mpeg2_width : 0) + + (imin8ur >> 1) + w2 * (jmin8ur >> 1), + mb, w2, imin8ur & 1, jmin8ur & 1, 8); + + /* lower half block */ + vmc += mpeg2_dist2(newref + (sel8lr ? mpeg2_width : 0) + + (imin8lr >> 1) + w2 * (jmin8lr >> 1), + mb + 8 * w2, w2, imin8lr & 1, jmin8lr & 1, 8); + } + + /* select between intra and non-intra coding */ + if ((vmc > var) && (vmc >= 9 * 256)) + mbi->mb_type = 1; + else { + var = vmc; + + if (mbi->motion_type == 1) { + /* forward */ + mbi->MV[0][0][0] = iminf - (i << 1); + mbi->MV[0][0][1] = jminf - (j << 1); + mbi->mv_field_sel[0][0] = self; + /* backward */ + mbi->MV[0][1][0] = iminr - (i << 1); + mbi->MV[0][1][1] = jminr - (j << 1); + mbi->mv_field_sel[0][1] = selr; + } else { /* MC_16X8 */ + /* forward */ + mbi->MV[0][0][0] = imin8uf - (i << 1); + mbi->MV[0][0][1] = jmin8uf - (j << 1); + mbi->mv_field_sel[0][0] = sel8uf; + mbi->MV[1][0][0] = imin8lf - (i << 1); + mbi->MV[1][0][1] = jmin8lf - ((j + 8) << 1); + mbi->mv_field_sel[1][0] = sel8lf; + /* backward */ + mbi->MV[0][1][0] = imin8ur - (i << 1); + mbi->MV[0][1][1] = jmin8ur - (j << 1); + mbi->mv_field_sel[0][1] = sel8ur; + mbi->MV[1][1][0] = imin8lr - (i << 1); + mbi->MV[1][1][1] = jmin8lr - ((j + 8) << 1); + mbi->mv_field_sel[1][1] = sel8lr; + } + } + } + + mbi->var = var; +} + +/* + frame picture motion estimation + + org: top left pel of source reference frame + ref: top left pel of reconstructed reference frame + mb: macroblock to be matched + i,j: location of mb relative to ref (=center of search window) + sx,sy: half widths of search window + iminp,jminp,dframep: location and value of best frame prediction + imintp,jmintp,tselp: location of best field pred. for top field of mb + iminbp,jminbp,bselp: location of best field pred. for bottom field of mb + dfieldp: value of field prediction +*/ +__attribute__((always_inline)) static inline void +mpeg2_frame_estimate(unsigned char *org, unsigned char *ref, unsigned char *mb, + int i, int j, int sx, int sy, int *iminp, int *jminp, + int *imintp, int *jmintp, int *iminbp, int *jminbp, + int *dframep, int *dfieldp, int *tselp, int *bselp, + int imins[2][2], int jmins[2][2]) { + int dt, db, dmint, dminb; + int imint, iminb, jmint, jminb; + + /* frame prediction */ + *dframep = mpeg2_fullsearch(org, ref, mb, mpeg2_width, i, j, sx, sy, 16, + mpeg2_width, mpeg2_height, iminp, jminp); + + /* predict top field from top field */ + dt = + mpeg2_fullsearch(org, ref, mb, mpeg2_width << 1, i, j >> 1, sx, sy >> 1, + 8, mpeg2_width, mpeg2_height >> 1, &imint, &jmint); + + /* predict top field from bottom field */ + db = mpeg2_fullsearch(org + mpeg2_width, ref + mpeg2_width, mb, + mpeg2_width << 1, i, j >> 1, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &iminb, &jminb); + + imins[0][0] = imint; + jmins[0][0] = jmint; + imins[1][0] = iminb; + jmins[1][0] = jminb; + + /* select prediction for top field */ + if (dt <= db) { + dmint = dt; + *imintp = imint; + *jmintp = jmint; + *tselp = 0; + } else { + dmint = db; + *imintp = iminb; + *jmintp = jminb; + *tselp = 1; + } + + /* predict bottom field from top field */ + dt = mpeg2_fullsearch(org, ref, mb + mpeg2_width, mpeg2_width << 1, i, + j >> 1, sx, sy >> 1, 8, mpeg2_width, + mpeg2_height >> 1, &imint, &jmint); + + /* predict bottom field from bottom field */ + db = + mpeg2_fullsearch(org + mpeg2_width, ref + mpeg2_width, mb + mpeg2_width, + mpeg2_width << 1, i, j >> 1, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &iminb, &jminb); + + imins[0][1] = imint; + jmins[0][1] = jmint; + imins[1][1] = iminb; + jmins[1][1] = jminb; + + /* select prediction for bottom field */ + if (db <= dt) { + dminb = db; + *iminbp = iminb; + *jminbp = jminb; + *bselp = 1; + } else { + dminb = dt; + *iminbp = imint; + *jminbp = jmint; + *bselp = 0; + } + + *dfieldp = dmint + dminb; +} + +/* + field picture motion estimation subroutine + + toporg: address of original top reference field + topref: address of reconstructed top reference field + botorg: address of original bottom reference field + botref: address of reconstructed bottom reference field + mb: macroblock to be matched + i,j: location of mb (=center of search window) + sx,sy: half width/height of search window + + iminp,jminp,selp,dfieldp: location and distance of best field prediction + imin8up,jmin8up,sel8up: location of best 16x8 pred. for upper half of mb + imin8lp,jmin8lp,sel8lp: location of best 16x8 pred. for lower half of mb + d8p: distance of best 16x8 prediction + iminsp,jminsp,dsp: location and distance of best same parity field + prediction (needed for dual prime, only valid if + ipflag==0) +*/ +__attribute__((always_inline)) static inline void +mpeg2_field_estimate(unsigned char *toporg, unsigned char *topref, + unsigned char *botorg, unsigned char *botref, + unsigned char *mb, int i, int j, int sx, int sy, + int ipflag, int *iminp, int *jminp, int *imin8up, + int *jmin8up, int *imin8lp, int *jmin8lp, int *dfieldp, + int *d8p, int *selp, int *sel8up, int *sel8lp, int *iminsp, + int *jminsp, int *dsp) { + int dt, db, imint, jmint, iminb, jminb, notop, nobot; + + /* if ipflag is set, predict from field of opposite parity only */ + notop = ipflag && (mpeg2_pict_struct == 1); + nobot = ipflag && (mpeg2_pict_struct == 2); + + /* field prediction */ + + /* predict current field from top field */ + if (notop) + dt = 65536; /* infinity */ + else + dt = mpeg2_fullsearch(toporg, topref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 16, mpeg2_width, mpeg2_height >> 1, + &imint, &jmint); + + /* predict current field from bottom field */ + if (nobot) + db = 65536; /* infinity */ + else + db = mpeg2_fullsearch(botorg, botref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 16, mpeg2_width, mpeg2_height >> 1, + &iminb, &jminb); + + /* same parity prediction (only valid if ipflag==0) */ + if (mpeg2_pict_struct == 1) { + *iminsp = imint; + *jminsp = jmint; + *dsp = dt; + } else { + *iminsp = iminb; + *jminsp = jminb; + *dsp = db; + } + + /* select field prediction */ + if (dt <= db) { + *dfieldp = dt; + *iminp = imint; + *jminp = jmint; + *selp = 0; + } else { + *dfieldp = db; + *iminp = iminb; + *jminp = jminb; + *selp = 1; + } + + /* 16x8 motion compensation */ + + /* predict upper half field from top field */ + if (notop) + dt = 65536; + else + dt = mpeg2_fullsearch(toporg, topref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, + &imint, &jmint); + + /* predict upper half field from bottom field */ + if (nobot) + db = 65536; + else + db = mpeg2_fullsearch(botorg, botref, mb, mpeg2_width << 1, i, j, sx, + sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, + &iminb, &jminb); + + /* select prediction for upper half field */ + if (dt <= db) { + *d8p = dt; + *imin8up = imint; + *jmin8up = jmint; + *sel8up = 0; + } else { + *d8p = db; + *imin8up = iminb; + *jmin8up = jminb; + *sel8up = 1; + } + + /* predict lower half field from top field */ + if (notop) + dt = 65536; + else + dt = mpeg2_fullsearch(toporg, topref, mb + (mpeg2_width << 4), + mpeg2_width << 1, i, j + 8, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &imint, &jmint); + + /* predict lower half field from bottom field */ + if (nobot) + db = 65536; + else + db = mpeg2_fullsearch(botorg, botref, mb + (mpeg2_width << 4), + mpeg2_width << 1, i, j + 8, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &iminb, &jminb); + + /* select prediction for lower half field */ + if (dt <= db) { + *d8p += dt; + *imin8lp = imint; + *jmin8lp = jmint; + *sel8lp = 0; + } else { + *d8p += db; + *imin8lp = iminb; + *jmin8lp = jminb; + *sel8lp = 1; + } +} + +__attribute__((always_inline)) static inline void +mpeg2_dpframe_estimate(unsigned char *ref, unsigned char *mb, int i, int j, + int iminf[2][2], int jminf[2][2], int *iminp, int *jminp, + int *imindmvp, int *jmindmvp, int *dmcp, int *vmcp) { + int pref, ppred, delta_x, delta_y; + int is, js, it, jt, ib, jb, it0, jt0, ib0, jb0; + int imins = 0, jmins = 0, imint = 0, jmint = 0, iminb = 0, jminb = 0, + imindmv = 0, jmindmv = 0; + int vmc, local_dist; + + /* + Calculate Dual Prime distortions for 9 delta candidates + for each of the four minimum field vectors + Note: only for P pictures! + */ + + /* initialize minimum dual prime distortion to large value */ + vmc = 1 << 30; + + __pragma_loopbound(2, 2); + for (pref = 0; pref < 2; pref++) { + ppred = 0; + __pragma_loopbound(2, 2); + for (; ppred < 2; ppred++) { + /* + convert Cartesian absolute to relative motion vector + values (wrt current macroblock address (i,j) + */ + is = iminf[pref][ppred] - (i << 1); + js = jminf[pref][ppred] - (j << 1); + + if (pref != ppred) { + /* vertical field shift adjustment */ + if (ppred == 0) + js++; + else + js--; + + /* mvxs and mvys scaling*/ + is <<= 1; + js <<= 1; + if (mpeg2_topfirst == ppred) { + /* second field: scale by 1/3 */ + is = (is >= 0) ? (is + 1) / 3 : -((-is + 1) / 3); + js = (js >= 0) ? (js + 1) / 3 : -((-js + 1) / 3); + } else + continue; + } + + /* vector for prediction from field of opposite 'parity' */ + if (mpeg2_topfirst) { + /* vector for prediction of top field from bottom field */ + it0 = ((is + (is > 0)) >> 1); + jt0 = ((js + (js > 0)) >> 1) - 1; + + /* vector for prediction of bottom field from top field */ + ib0 = ((3 * is + (is > 0)) >> 1); + jb0 = ((3 * js + (js > 0)) >> 1) + 1; + } else { + /* vector for prediction of top field from bottom field */ + it0 = ((3 * is + (is > 0)) >> 1); + jt0 = ((3 * js + (js > 0)) >> 1) - 1; + + /* vector for prediction of bottom field from top field */ + ib0 = ((is + (is > 0)) >> 1); + jb0 = ((js + (js > 0)) >> 1) + 1; + } + + /* convert back to absolute half-pel field picture coordinates */ + is += i << 1; + js += j << 1; + it0 += i << 1; + jt0 += j << 1; + ib0 += i << 1; + jb0 += j << 1; + + if ((is >= 0) && (is <= (mpeg2_width - 16) << 1) && (js >= 0) && + (js <= (mpeg2_height - 16))) { + __pragma_loopbound(3, 3); + for (delta_y = -1; delta_y <= 1; delta_y++) { + delta_x = -1; + __pragma_loopbound(3, 3); + for (; delta_x <= 1; delta_x++) { + /* opposite field coordinates */ + it = it0 + delta_x; + jt = jt0 + delta_y; + ib = ib0 + delta_x; + jb = jb0 + delta_y; + + if ((it >= 0) && (it <= (mpeg2_width - 16) << 1) && + (jt >= 0) && (jt <= (mpeg2_height - 16)) && + (ib >= 0) && (ib <= (mpeg2_width - 16) << 1) && + (jb >= 0) && (jb <= (mpeg2_height - 16))) { + /* compute prediction error */ + local_dist = mpeg2_bdist2( + ref + (is >> 1) + + (mpeg2_width << 1) * (js >> 1), + ref + mpeg2_width + (it >> 1) + + (mpeg2_width << 1) * (jt >> 1), + mb, /* current mb location */ + mpeg2_width << 1, /* adjacent line distance */ + is & 1, js & 1, it & 1, + jt & 1, /* half-pel flags */ + 8); /* block height */ + local_dist += mpeg2_bdist2( + ref + mpeg2_width + (is >> 1) + + (mpeg2_width << 1) * (js >> 1), + ref + (ib >> 1) + + (mpeg2_width << 1) * (jb >> 1), + mb + mpeg2_width, /* current mb location */ + mpeg2_width << 1, /* adjacent line distance */ + is & 1, js & 1, ib & 1, + jb & 1, /* half-pel flags */ + 8); /* block height */ + + /* update delta with least distortion vector */ + if (local_dist < vmc) { + imins = is; + jmins = js; + imint = it; + jmint = jt; + iminb = ib; + jminb = jb; + imindmv = delta_x; + jmindmv = delta_y; + vmc = local_dist; + } + } + } /* end delta x loop */ + } /* end delta y loop */ + } + } + } + + /* Compute L1 error for decision purposes */ + local_dist = mpeg2_bdist1( + ref + (imins >> 1) + (mpeg2_width << 1) * (jmins >> 1), + ref + mpeg2_width + (imint >> 1) + (mpeg2_width << 1) * (jmint >> 1), + mb, mpeg2_width << 1, imins & 1, jmins & 1, imint & 1, jmint & 1, 8); + local_dist += mpeg2_bdist1( + ref + mpeg2_width + (imins >> 1) + (mpeg2_width << 1) * (jmins >> 1), + ref + (iminb >> 1) + (mpeg2_width << 1) * (jminb >> 1), + mb + mpeg2_width, mpeg2_width << 1, imins & 1, jmins & 1, iminb & 1, + jminb & 1, 8); + + *dmcp = local_dist; + *iminp = imins; + *jminp = jmins; + *imindmvp = imindmv; + *jmindmvp = jmindmv; + *vmcp = vmc; +} + +__attribute__((always_inline)) static inline void +mpeg2_dpfield_estimate(unsigned char *topref, unsigned char *botref, + unsigned char *mb, int i, int j, int imins, int jmins, + int *imindmvp, int *jmindmvp, int *dmcp, int *vmcp) { + unsigned char *sameref, *oppref; + int io0, jo0, io, jo, delta_x, delta_y, mvxs, mvys, mvxo0, mvyo0; + int imino = 0, jmino = 0, imindmv = 0, jmindmv = 0, vmc_dp = 0, + local_dist = 0; + + /* Calculate Dual Prime distortions for 9 delta candidates */ + /* Note: only for P pictures! */ + + /* Assign opposite and same reference pointer */ + if (mpeg2_pict_struct == 1) { + sameref = topref; + oppref = botref; + } else { + sameref = botref; + oppref = topref; + } + + /* + convert Cartesian absolute to relative motion vector + values (wrt current macroblock address (i,j) + */ + mvxs = imins - (i << 1); + mvys = jmins - (j << 1); + + /* vector for prediction from field of opposite 'parity' */ + mvxo0 = (mvxs + (mvxs > 0)) >> 1; /* mvxs // 2 */ + mvyo0 = (mvys + (mvys > 0)) >> 1; /* mvys // 2 */ + + /* vertical field shift correction */ + if (mpeg2_pict_struct == 1) + mvyo0--; + else + mvyo0++; + + /* convert back to absolute coordinates */ + io0 = mvxo0 + (i << 1); + jo0 = mvyo0 + (j << 1); + + /* initialize minimum dual prime distortion to large value */ + vmc_dp = 1 << 30; + + __pragma_loopbound(3, 3); + for (delta_y = -1; delta_y <= 1; delta_y++) { + delta_x = -1; + __pragma_loopbound(3, 3); + for (; delta_x <= 1; delta_x++) { + /* opposite field coordinates */ + io = io0 + delta_x; + jo = jo0 + delta_y; + + if ((io >= 0) && (io <= (mpeg2_width - 16) << 1) && (jo >= 0) && + (jo <= (mpeg2_height2 - 16) << 1)) { + /* compute prediction error */ + local_dist = mpeg2_bdist2( + sameref + (imins >> 1) + mpeg2_width2 * (jmins >> 1), + oppref + (io >> 1) + mpeg2_width2 * (jo >> 1), + mb, /* current mb location */ + mpeg2_width2, /* adjacent line distance */ + imins & 1, jmins & 1, io & 1, jo & 1, /* half-pel flags */ + 16); /* block height */ + + /* update delta with least distortion vector */ + if (local_dist < vmc_dp) { + imino = io; + jmino = jo; + imindmv = delta_x; + jmindmv = delta_y; + vmc_dp = local_dist; + } + } + } /* end delta x loop */ + } /* end delta y loop */ + + /* Compute L1 error for decision purposes */ + *dmcp = mpeg2_bdist1(sameref + (imins >> 1) + mpeg2_width2 * (jmins >> 1), + oppref + (imino >> 1) + mpeg2_width2 * (jmino >> 1), + mb, /* current mb location */ + mpeg2_width2, /* adjacent line distance */ + imins & 1, jmins & 1, imino & 1, + jmino & 1, /* half-pel flags */ + 16); /* block height */ + + *imindmvp = imindmv; + *jmindmvp = jmindmv; + *vmcp = vmc_dp; +} + +/* + full search block matching + + blk: top left pel of (16*h) block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in ref,blk + org: top left pel of source reference picture + ref: top left pel of reconstructed reference picture + i0,j0: center of search window + sx,sy: half widths of search window + xmax,ymax: right/bottom limits of search area + iminp,jminp: pointers to where the result is stored + result is given as half pel offset from ref(0,0) + i.e. NOT relative to (i0,j0) +*/ +__attribute__((always_inline)) static inline int +mpeg2_fullsearch(unsigned char *org, unsigned char *ref, unsigned char *blk, + int lx, int i0, int j0, int sx, int sy, int h, int xmax, + int ymax, int *iminp, int *jminp) { + int i, j, imin, jmin, ilow, ihigh, jlow, jhigh; + int d, dmin; + int k, l, sxy; + + ilow = i0 - sx; + ihigh = i0 + sx; + + if (ilow < 0) + ilow = 0; + + if (ihigh > xmax - 16) + ihigh = xmax - 16; + + jlow = j0 - sy; + jhigh = j0 + sy; + + if (jlow < 0) + jlow = 0; + + if (jhigh > ymax - h) + jhigh = ymax - h; + + /* full pel search, spiraling outwards */ + + imin = i0; + jmin = j0; + dmin = mpeg2_dist1(org + imin + lx * jmin, blk, lx, 0, 0, h, 65536); + + sxy = (sx > sy) ? sx : sy; + + __pragma_loopbound(3, 7); + for (l = 1; l <= sxy; l++) { + i = i0 - l; + j = j0 - l; + __pragma_loopbound(8, 56); + for (k = 0; k < 8 * l; k++) { + if ((i >= ilow) && (i <= ihigh) && (j >= jlow) && (j <= jhigh)) { + d = mpeg2_dist1(org + i + lx * j, blk, lx, 0, 0, h, dmin); + + if (d < dmin) { + dmin = d; + imin = i; + jmin = j; + } + } + + if (k < 2 * l) + i++; + else + + if (k < 4 * l) + j++; + else + + if (k < 6 * l) + i--; + else + j--; + } + } + + /* half pel */ + dmin = 65536; + imin <<= 1; + jmin <<= 1; + ilow = imin - (imin > 0); + ihigh = imin + (imin < ((xmax - 16) << 1)); + jlow = jmin - (jmin > 0); + jhigh = jmin + (jmin < ((ymax - h) << 1)); + + __pragma_loopbound(2, 3); + for (j = jlow; j <= jhigh; j++) { + i = ilow; + __pragma_loopbound(2, 3); + for (; i <= ihigh; i++) { + d = mpeg2_dist1(ref + (i >> 1) + lx * (j >> 1), blk, lx, i & 1, + j & 1, h, dmin); + + if (d < dmin) { + dmin = d; + imin = i; + jmin = j; + } + } + } + + *iminp = imin; + *jminp = jmin; + + return (dmin); +} + +/* + total absolute difference between two (16*h) blocks + including optional half pel interpolation of blk1 (hx,hy) + blk1,blk2: addresses of top left pels of both blocks + lx: distance (in bytes) of vertically adjacent pels + hx,hy: flags for horizontal and/or vertical interpolation + h: height of block (usually 8 or 16) + distlim: bail out if sum exceeds this value +*/ +__attribute__((always_inline)) static inline int +mpeg2_dist1(unsigned char *blk1, unsigned char *blk2, int lx, int hx, int hy, + int h, int distlim) { + unsigned char *p1, *p1a, *p2; + int i, j; + int s, v; + + s = 0; + p1 = blk1; + p2 = blk2; + + if (!hx && !hy) { + __pragma_loopbound(0, 16); + for (j = 0; j < h; j++) { + if ((v = p1[0] - p2[0]) < 0) + v = -v; + s += v; + + if ((v = p1[1] - p2[1]) < 0) + v = -v; + s += v; + + if ((v = p1[2] - p2[2]) < 0) + v = -v; + s += v; + + if ((v = p1[3] - p2[3]) < 0) + v = -v; + s += v; + + if ((v = p1[4] - p2[4]) < 0) + v = -v; + s += v; + + if ((v = p1[5] - p2[5]) < 0) + v = -v; + s += v; + + if ((v = p1[6] - p2[6]) < 0) + v = -v; + s += v; + + if ((v = p1[7] - p2[7]) < 0) + v = -v; + s += v; + + if ((v = p1[8] - p2[8]) < 0) + v = -v; + s += v; + + if ((v = p1[9] - p2[9]) < 0) + v = -v; + s += v; + + if ((v = p1[10] - p2[10]) < 0) + v = -v; + s += v; + + if ((v = p1[11] - p2[11]) < 0) + v = -v; + s += v; + + if ((v = p1[12] - p2[12]) < 0) + v = -v; + s += v; + + if ((v = p1[13] - p2[13]) < 0) + v = -v; + s += v; + + if ((v = p1[14] - p2[14]) < 0) + v = -v; + s += v; + + if ((v = p1[15] - p2[15]) < 0) + v = -v; + s += v; + + if (s >= distlim) + break; + + p1 += lx; + p2 += lx; + } + } else + + if (hx && !hy) { + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + 1) >> 1) - p2[i]; + if (v >= 0) + s += v; + else + s -= v; + } + p1 += lx; + p2 += lx; + } + } else + + if (!hx && hy) { + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1a[i] + 1) >> 1) - p2[i]; + if (v >= 0) + s += v; + else + s -= v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } else { /* if (hx && hy) */ + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + p1a[i] + p1a[i + 1] + + 2) >> + 2) - + p2[i]; + if (v >= 0) + s += v; + else + s -= v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } + + return (s); +} + +/* + total squared difference between two (16*h) blocks + including optional half pel interpolation of blk1 (hx,hy) + blk1,blk2: addresses of top left pels of both blocks + lx: distance (in bytes) of vertically adjacent pels + hx,hy: flags for horizontal and/or vertical interpolation + h: height of block (usually 8 or 16) +*/ +__attribute__((always_inline)) static inline int +mpeg2_dist2(unsigned char *blk1, unsigned char *blk2, int lx, int hx, int hy, + int h) { + unsigned char *p1, *p1a, *p2; + int i, j; + int s, v; + + s = 0; + p1 = blk1; + p2 = blk2; + + if (!hx && !hy) { + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = p1[i] - p2[i]; + s += v * v; + } + p1 += lx; + p2 += lx; + } + } else + + if (hx && !hy) { + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + 1) >> 1) - p2[i]; + s += v * v; + } + p1 += lx; + p2 += lx; + } + } else + + if (!hx && hy) { + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1a[i] + 1) >> 1) - p2[i]; + s += v * v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } else { /* if (hx && hy) */ + p1a = p1 + lx; + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((unsigned int) (p1[i] + p1[i + 1] + p1a[i] + p1a[i + 1] + + 2) >> + 2) - + p2[i]; + s += v * v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } + + return (s); +} + +/* + absolute difference error between a (16*h) block and a bidirectional + prediction + + p2: address of top left pel of block + pf,hxf,hyf: address and half pel flags of forward ref. block + pb,hxb,hyb: address and half pel flags of backward ref. block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in p2,pf,pb +*/ +__attribute__((always_inline)) static inline int +mpeg2_bdist1(unsigned char *pf, unsigned char *pb, unsigned char *p2, int lx, + int hxf, int hyf, int hxb, int hyb, int h) { + unsigned char *pfa, *pfb, *pfc, *pba, *pbb, *pbc; + int i, j; + int s, v; + + pfa = pf + hxf; + pfb = pf + lx * hyf; + pfc = pfb + hxf; + + pba = pb + hxb; + pbb = pb + lx * hyb; + pbc = pbb + hxb; + + s = 0; + + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((((unsigned int) (*pf++ + *pfa++ + *pfb++ + *pfc++ + 2) >> 2) + + ((unsigned int) (*pb++ + *pba++ + *pbb++ + *pbc++ + 2) >> 2) + + 1) >> + 1) - + *p2++; + if (v >= 0) + s += v; + else + s -= v; + } + p2 += lx - 16; + pf += lx - 16; + pfa += lx - 16; + pfb += lx - 16; + pfc += lx - 16; + pb += lx - 16; + pba += lx - 16; + pbb += lx - 16; + pbc += lx - 16; + } + + return (s); +} + +/* + squared error between a (16*h) block and a bidirectional + prediction + + p2: address of top left pel of block + pf,hxf,hyf: address and half pel flags of forward ref. block + pb,hxb,hyb: address and half pel flags of backward ref. block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in p2,pf,pb +*/ +__attribute__((always_inline)) static inline int +mpeg2_bdist2(unsigned char *pf, unsigned char *pb, unsigned char *p2, int lx, + int hxf, int hyf, int hxb, int hyb, int h) { + unsigned char *pfa, *pfb, *pfc, *pba, *pbb, *pbc; + int i, j; + int s, v; + + pfa = pf + hxf; + pfb = pf + lx * hyf; + pfc = pfb + hxf; + + pba = pb + hxb; + pbb = pb + lx * hyb; + pbc = pbb + hxb; + + s = 0; + + __pragma_loopbound(8, 16); + for (j = 0; j < h; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = ((((unsigned int) (*pf++ + *pfa++ + *pfb++ + *pfc++ + 2) >> 2) + + ((unsigned int) (*pb++ + *pba++ + *pbb++ + *pbc++ + 2) >> 2) + + 1) >> + 1) - + *p2++; + s += v * v; + } + p2 += lx - 16; + pf += lx - 16; + pfa += lx - 16; + pfb += lx - 16; + pfc += lx - 16; + pb += lx - 16; + pba += lx - 16; + pbb += lx - 16; + pbc += lx - 16; + } + + return (s); +} + +/* + variance of a (16*16) block, multiplied by 256 + p: address of top left pel of block + lx: distance (in bytes) of vertically adjacent pels +*/ +__attribute__((always_inline)) static inline int +mpeg2_variance(unsigned char *p, int lx) { + int i, j; + unsigned int v, s, s2; + + s = s2 = 0; + + __pragma_loopbound(16, 16); + for (j = 0; j < 16; j++) { + i = 0; + __pragma_loopbound(16, 16); + for (; i < 16; i++) { + v = *p++; + s += v; + s2 += v * v; + } + p += lx - 16; + } + + return (s2 - (s * s) / 256); +} + +/* + Main functions +*/ + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +mpeg2_main(void) { + mpeg2_motion_estimation(mpeg2_oldorgframe, mpeg2_oldorgframe, + mpeg2_oldorgframe, mpeg2_oldorgframe, + mpeg2_oldorgframe, mpeg2_oldorgframe, 7, 7, 3, 3, + mpeg2_mbinfo, 0, 0); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + mpeg2_init(); + mpeg2_main(); + + return (mpeg2_return() - (-116) != 0); +} diff --git a/targets/wasm-tacle/sequential/mpeg2/mpeg2.c b/targets/wasm-tacle/sequential/mpeg2/mpeg2.c new file mode 100755 index 0000000..62b8779 --- /dev/null +++ b/targets/wasm-tacle/sequential/mpeg2/mpeg2.c @@ -0,0 +1,13212 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: mpeg2 + + Author: MPEG Software Simulation Group + + Function: This file contains MPEG 2 motion estimation code. + + Source: MediaBench II + http://euler.slu.edu/~fritts/mediabench (mirror) + + Original name: MPEG-2 + + Changes: For TACLeBench, the code has been changed such that input and + output arrays are scaled down so that the code plus its data fits to the + memories of typical resource-constrained embedded devices. + + License: See the following disclaimer from the original source codes. + + Disclaimer of Warranty + + These software programs are available to the user without any license fee or + royalty on an "as is" basis. The MPEG Software Simulation Group disclaims + any and all warranties, whether express, implied, or statuary, including any + implied warranties or merchantability or of fitness for a particular + purpose. In no event shall the copyright-holder be liable for any + incidental, punitive, or consequential damages of any kind whatsoever + arising from the use of these programs. + + This disclaimer of warranty extends to the user of these programs and user's + customers, employees, agents, transferees, successors, and assigns. + + The MPEG Software Simulation Group does not represent or warrant that the + programs furnished hereunder are free of infringement of any third-party + patents. + + Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, + are subject to royalty fees to patent holders. Many of these patents are + general enough such that they are unavoidable regardless of implementation + design. + +*/ + + +/* + Forward declaration of data types +*/ + +struct mbinfo; + + +/* + Forward declaration of functions +*/ + +void mpeg2_init( void ); +int mpeg2_return( void ); +void mpeg2_motion_estimation( unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, + int, int, int, int, struct mbinfo *, int, int ); +void mpeg2_frame_ME( unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, int, int, int, int, int, + int, struct mbinfo * ); +void mpeg2_field_ME( unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, int, + int, int, int, int, int, struct mbinfo *, int, int ); +void mpeg2_frame_estimate( unsigned char *, unsigned char *, unsigned char *, + int, int, int, int, int *, int *, int *, int *, + int *, int *, int *, int *, int *, int *, + int[ 2 ][ 2 ], int[ 2 ][ 2 ] ); +void mpeg2_field_estimate( unsigned char *, unsigned char *, unsigned char *, + unsigned char *, unsigned char *, int, int, int, int, + int, int *, int *, int *, int *, int *, int *, int *, + int *, int *, int *, int *, int *, int *, int * ); +void mpeg2_dpframe_estimate( unsigned char *, unsigned char *, int, int, + int[ 2 ][ 2 ], int[ 2 ][ 2 ], int *, int *, int *, + int *, int *, int * ); +void mpeg2_dpfield_estimate( unsigned char *, unsigned char *, unsigned char *, + int, int, int, int, int *, int *, int *, int * ); +int mpeg2_fullsearch( unsigned char *, unsigned char *, unsigned char *, int, + int, int, int, int, int, int, int, int *, int * ); +int mpeg2_dist1( unsigned char *, unsigned char *, int, int, int, int, int ); +int mpeg2_dist2( unsigned char *, unsigned char *, int, int, int, int ); +int mpeg2_bdist1( unsigned char *, unsigned char *, unsigned char *, int, int, + int, int, int, int ); +int mpeg2_bdist2( unsigned char *, unsigned char *, unsigned char *, int, int, + int, int, int, int ); +int mpeg2_variance( unsigned char *, int ); +void mpeg2_main( void ); +int main( void ); + + +/* + Declaration of global variables +*/ + +struct mbinfo { + int mb_type; + int motion_type; + int dct_type; + int mquant; + int cbp; + int skipped; + int MV[ 2 ][ 2 ][ 2 ]; + int mv_field_sel[ 2 ][ 2 ]; + int dmvector[ 2 ]; + double act; + int var; +}; + +volatile int mpeg2_width = 352; +volatile int mpeg2_height = 256; +volatile int mpeg2_width2 = 352; +volatile int mpeg2_height2 = 256; +volatile int mpeg2_M = 3; +volatile int mpeg2_pict_type = 3; +volatile int mpeg2_pict_struct = 3; +volatile int mpeg2_topfirst = 1; +volatile int mpeg2_frame_pred_dct = 0; +struct mbinfo mpeg2_mbinfo[ 352 ]; + +unsigned char mpeg2_oldorgframe[] = { + 0x9f, 0x9d, 0x9b, 0x9d, 0x9f, 0xa1, 0xa2, 0xa3, + 0x9e, 0xa2, 0xa5, 0xa5, 0xa2, 0xa1, 0xa4, 0xa7, + 0xa3, 0xa3, 0xa5, 0xa6, 0xa5, 0xa5, 0xa3, 0xa2, + 0x9d, 0xa1, 0xa5, 0xa8, 0xa6, 0xa1, 0x9a, 0x95, + 0x8e, 0x7e, 0x7a, 0x78, 0x70, 0x76, 0x7c, 0x73, + 0x7d, 0x7a, 0x7a, 0x79, 0x7b, 0x83, 0x82, 0x74, + 0x64, 0x57, 0x48, 0x5e, 0x7e, 0x84, 0x6f, 0x4a, + 0x31, 0x43, 0x61, 0x81, 0x9b, 0xac, 0xb6, 0xb9, + 0xb0, 0xa8, 0x9e, 0x9a, 0x9b, 0xa1, 0xaa, 0xb1, + 0x9d, 0x83, 0x65, 0x49, 0x33, 0x30, 0x34, 0x32, + 0x4b, 0x54, 0x68, 0x83, 0x99, 0x9f, 0x94, 0x87, + 0x4f, 0x5e, 0x72, 0x7f, 0x75, 0x52, 0x23, 0x02, + 0x1a, 0x24, 0x24, 0x1b, 0x14, 0x13, 0x1e, 0x30, + 0x43, 0x60, 0x7b, 0x8a, 0x96, 0x9c, 0x97, 0x90, + 0x99, 0x99, 0x92, 0x88, 0x7f, 0x80, 0x97, 0xb5, + 0xa0, 0x94, 0x9a, 0x96, 0x66, 0x2d, 0x14, 0x12, + 0x15, 0x17, 0x27, 0x1c, 0x15, 0x1e, 0x25, 0x3b, + 0x7a, 0xa2, 0xbe, 0xbf, 0xb2, 0x9f, 0x9e, 0xaf, + 0xba, 0x7b, 0x64, 0x8a, 0xa9, 0xa7, 0xa4, 0xaa, + 0xa8, 0xab, 0xad, 0xab, 0xa7, 0xa6, 0xaa, 0xaf, + 0xa4, 0xa6, 0xa9, 0xab, 0xac, 0xac, 0xaa, 0xa9, + 0xa7, 0xaf, 0xba, 0xbc, 0xaf, 0x94, 0x75, 0x60, + 0x7a, 0x85, 0x90, 0x9a, 0xa7, 0xa2, 0x7c, 0x50, + 0x2f, 0x48, 0x65, 0x77, 0x7e, 0x8b, 0xa3, 0xb7, + 0xae, 0x95, 0x7a, 0x6f, 0x75, 0x79, 0x73, 0x69, + 0x56, 0x63, 0x6e, 0x6e, 0x6a, 0x6b, 0x72, 0x78, + 0x65, 0x67, 0x61, 0x51, 0x3f, 0x36, 0x3b, 0x43, + 0x33, 0x24, 0x25, 0x3d, 0x4d, 0x4b, 0x48, 0x4d, + 0x57, 0x4b, 0x42, 0x47, 0x56, 0x62, 0x63, 0x5f, + 0x60, 0x6d, 0x6f, 0x5b, 0x3f, 0x38, 0x4d, 0x67, + 0x4c, 0x3c, 0x2d, 0x2f, 0x3a, 0x3e, 0x33, 0x25, + 0x3b, 0x4e, 0x6d, 0x84, 0x82, 0x75, 0x71, 0x78, + 0x7f, 0x78, 0x6c, 0x61, 0x5a, 0x58, 0x5a, 0x5d, + 0x69, 0x64, 0x59, 0x4c, 0x41, 0x3c, 0x3f, 0x43, + 0x32, 0x3c, 0x26, 0x26, 0x2f, 0x2b, 0x2e, 0x1f, + 0x34, 0x8e, 0xbb, 0xaf, 0xae, 0xb0, 0xa7, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa5, 0xa4, 0xa5, 0xa7, 0xa7, 0xa5, 0xa4, + 0xa0, 0xac, 0xa1, 0x97, 0xa7, 0xac, 0xa5, 0xa9, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x8b, 0x86, 0x87, 0x8e, 0x95, 0x94, 0x90, 0x8d, + 0x92, 0x94, 0x97, 0x9b, 0x9f, 0xa0, 0x9e, 0x9d, + 0x99, 0x9b, 0x9e, 0x9d, 0x98, 0x8e, 0x83, 0x7c, + 0x80, 0x7b, 0x76, 0x74, 0x78, 0x83, 0x8f, 0x97, + 0x92, 0x8f, 0x99, 0xaf, 0xb8, 0xa8, 0x99, 0x9b, + 0x97, 0xb9, 0xc0, 0xb5, 0xb2, 0x9e, 0x8a, 0x90, + 0xa7, 0xc1, 0x9d, 0x6a, 0x56, 0x4a, 0x48, 0x4c, + 0x58, 0x86, 0xb9, 0xca, 0xb8, 0xa1, 0x9c, 0xa1, + 0xbd, 0xc1, 0xba, 0x99, 0x63, 0x30, 0x11, 0x06, + 0x1b, 0x33, 0x5d, 0x7f, 0x91, 0xa7, 0xbf, 0xcb, + 0xbb, 0xb5, 0xb1, 0xb2, 0xb5, 0xb0, 0xa2, 0x95, + 0xca, 0xc3, 0xa6, 0x74, 0x4f, 0x5d, 0x99, 0xd1, + 0xcb, 0xbb, 0xb0, 0x95, 0x69, 0x54, 0x52, 0x48, + 0x5a, 0x51, 0x3d, 0x42, 0x5d, 0x64, 0x73, 0x9c, + 0x9d, 0x91, 0x96, 0x9f, 0x9b, 0x98, 0x91, 0x7f, + 0x64, 0x41, 0x15, 0x12, 0x39, 0x5f, 0x74, 0x83, + 0x86, 0x80, 0x7b, 0x84, 0x8a, 0x7c, 0x5e, 0x41, + 0x36, 0x42, 0x6f, 0xa7, 0xbb, 0xa8, 0x91, 0x89, + 0x88, 0x98, 0xb2, 0xbc, 0xb2, 0xae, 0xb3, 0xb4, + 0xb6, 0xb4, 0xb3, 0xb5, 0xb9, 0xbb, 0xbc, 0xbb, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, + 0x9d, 0x80, 0x61, 0x5e, 0x79, 0x9c, 0xb3, 0xbb, + 0xca, 0xc1, 0xaf, 0xa3, 0xac, 0xb9, 0xaf, 0x98, + 0x6e, 0x48, 0x2b, 0x41, 0x7a, 0xa5, 0xa7, 0x96, + 0x9d, 0x87, 0x6e, 0x65, 0x6c, 0x72, 0x6e, 0x67, + 0x66, 0x78, 0x7d, 0x76, 0x7f, 0x96, 0x99, 0x89, + 0x6a, 0x78, 0x87, 0x8a, 0x80, 0x72, 0x6a, 0x68, + 0x56, 0x5a, 0x59, 0x55, 0x55, 0x59, 0x5e, 0x60, + 0x5a, 0x86, 0xb2, 0xb6, 0x92, 0x69, 0x57, 0x57, + 0x6a, 0x59, 0x46, 0x3b, 0x39, 0x34, 0x29, 0x1f, + 0x26, 0x25, 0x23, 0x21, 0x21, 0x26, 0x2e, 0x35, + 0x5c, 0x6e, 0x7a, 0x74, 0x6c, 0x6f, 0x77, 0x7c, + 0x6a, 0x67, 0x62, 0x5d, 0x5b, 0x5b, 0x5d, 0x5f, + 0x54, 0x50, 0x4c, 0x4d, 0x4f, 0x49, 0x3c, 0x31, + 0x35, 0x24, 0x2d, 0x2f, 0x2e, 0x2a, 0x22, 0x3a, + 0x87, 0xaf, 0xb9, 0xab, 0xac, 0xb0, 0xac, 0xad, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xac, 0xa6, 0xa2, 0xa5, 0xad, 0xb0, 0xac, 0xa6, + 0xb1, 0xaa, 0x9d, 0x99, 0xa5, 0xad, 0xaa, 0xa7, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x97, 0xa2, 0xa5, 0x9b, 0x93, 0x94, 0x97, 0x96, + 0x8c, 0x84, 0x7c, 0x76, 0x73, 0x6f, 0x69, 0x63, + 0x68, 0x6e, 0x79, 0x87, 0x94, 0x9e, 0xa6, 0xa9, + 0xaa, 0xac, 0xaf, 0xb3, 0xb5, 0xb6, 0xb7, 0xb6, + 0xaa, 0xab, 0x98, 0x90, 0xa3, 0xab, 0xa5, 0xa7, + 0x9e, 0x91, 0x82, 0x7a, 0x85, 0xa2, 0xbb, 0xc0, + 0xba, 0x79, 0x34, 0x26, 0x35, 0x53, 0x73, 0x75, + 0x82, 0x83, 0x87, 0x8b, 0x89, 0x7d, 0x69, 0x59, + 0x27, 0x1c, 0x0f, 0x0c, 0x17, 0x29, 0x39, 0x41, + 0x3e, 0x3a, 0x3c, 0x39, 0x2d, 0x25, 0x21, 0x18, + 0x2b, 0x29, 0x2e, 0x42, 0x60, 0x7b, 0x89, 0x8d, + 0xae, 0x89, 0x6b, 0x7a, 0xab, 0xd3, 0xd9, 0xce, + 0x92, 0x7e, 0x99, 0xba, 0xb8, 0xb8, 0xa3, 0x6e, + 0x59, 0x67, 0x79, 0x76, 0x5d, 0x4f, 0x4c, 0x46, + 0x5d, 0x6c, 0x73, 0x86, 0x99, 0x7c, 0x48, 0x34, + 0x4c, 0x6d, 0x82, 0x81, 0x7b, 0x6d, 0x63, 0x67, + 0x8d, 0x87, 0x77, 0x91, 0xa9, 0xa0, 0x8a, 0x61, + 0x39, 0x1f, 0x32, 0x64, 0x79, 0x6e, 0x59, 0x46, + 0x54, 0x74, 0x9f, 0xb7, 0xb8, 0xb8, 0xb6, 0xac, + 0xad, 0xb7, 0xba, 0xa8, 0x8b, 0x79, 0x7c, 0x86, + 0x83, 0x83, 0x84, 0x85, 0x88, 0x8c, 0x90, 0x92, + 0x95, 0xa7, 0xbe, 0xcb, 0xcb, 0xc3, 0xbb, 0xb7, + 0x9e, 0xa8, 0xaf, 0xb7, 0xc6, 0xce, 0xba, 0x9d, + 0x5f, 0x55, 0x54, 0x6a, 0x8c, 0x9d, 0x95, 0x85, + 0x79, 0x68, 0x56, 0x53, 0x5f, 0x6a, 0x6d, 0x6b, + 0x85, 0x7c, 0x6b, 0x5c, 0x59, 0x56, 0x45, 0x31, + 0x5f, 0x67, 0x6e, 0x70, 0x6c, 0x69, 0x6a, 0x6d, + 0x6a, 0x79, 0x76, 0x5c, 0x52, 0x64, 0x76, 0x7a, + 0x6a, 0x63, 0x5d, 0x5f, 0x63, 0x62, 0x58, 0x4e, + 0x3e, 0x3b, 0x37, 0x36, 0x37, 0x37, 0x34, 0x31, + 0x3d, 0x3a, 0x3e, 0x53, 0x6d, 0x7c, 0x78, 0x6f, + 0x67, 0x66, 0x5e, 0x58, 0x5b, 0x62, 0x5d, 0x52, + 0x56, 0x57, 0x58, 0x57, 0x54, 0x50, 0x4b, 0x48, + 0x4a, 0x4d, 0x4e, 0x45, 0x39, 0x30, 0x30, 0x34, + 0x22, 0x2d, 0x23, 0x29, 0x30, 0x1c, 0x3d, 0x8f, + 0xb2, 0xb3, 0xb0, 0xad, 0xad, 0xaf, 0xad, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xad, 0xab, 0xa4, 0xa3, 0xa9, 0xa6, 0x9e, + 0xa4, 0xa4, 0xa1, 0xa3, 0xa8, 0xa8, 0xa8, 0xb0, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0xa6, 0xa3, 0xa0, 0x9f, 0xa2, 0xa4, 0xa0, 0x9b, + 0x89, 0x90, 0x9d, 0xab, 0xb5, 0xb6, 0xb1, 0xab, + 0xa7, 0xa6, 0xa3, 0x9c, 0x92, 0x86, 0x7c, 0x75, + 0x78, 0x79, 0x7b, 0x7c, 0x7c, 0x7a, 0x79, 0x78, + 0x8d, 0x95, 0x87, 0x79, 0x89, 0xa3, 0xae, 0xb2, + 0x9e, 0x86, 0x88, 0x95, 0x97, 0x98, 0x7a, 0x42, + 0x12, 0x2d, 0x4a, 0x85, 0xba, 0xbd, 0xac, 0x9f, + 0xaf, 0x8c, 0x58, 0x2a, 0x18, 0x23, 0x3e, 0x54, + 0x6e, 0x8b, 0xaa, 0xb5, 0xb5, 0xbb, 0xca, 0xd6, + 0xca, 0xc1, 0xc3, 0xcc, 0xce, 0xc9, 0xb6, 0x9f, + 0x88, 0x77, 0x61, 0x52, 0x48, 0x3d, 0x2e, 0x22, + 0x24, 0x32, 0x51, 0x7d, 0xa2, 0xa9, 0x94, 0x7d, + 0x9d, 0x8d, 0x93, 0x93, 0x7b, 0x75, 0x75, 0x5f, + 0x33, 0x3f, 0x2c, 0x2d, 0x61, 0x7e, 0x74, 0x73, + 0x52, 0x5f, 0x82, 0x7e, 0x48, 0x3f, 0x78, 0xa7, + 0xa4, 0x94, 0x83, 0x6a, 0x52, 0x5a, 0x78, 0x8a, + 0x85, 0x84, 0x7a, 0x7f, 0x83, 0x82, 0x86, 0x7f, + 0x6a, 0x4c, 0x39, 0x3f, 0x51, 0x69, 0x79, 0x7a, + 0x71, 0x6e, 0x77, 0x81, 0x80, 0x78, 0x69, 0x57, + 0x4a, 0x4a, 0x54, 0x70, 0x94, 0xae, 0xb7, 0xb6, + 0xb1, 0xb0, 0xb0, 0xb1, 0xb4, 0xb9, 0xbe, 0xc0, + 0xba, 0xc3, 0xbe, 0x9f, 0x7a, 0x71, 0x8b, 0xab, + 0xc3, 0xc2, 0xb6, 0xa7, 0xa4, 0xa6, 0x97, 0x80, + 0x6c, 0x6f, 0x64, 0x49, 0x37, 0x4c, 0x85, 0xb8, + 0xc4, 0xae, 0x91, 0x7b, 0x6f, 0x68, 0x5f, 0x58, + 0x4a, 0x2c, 0x26, 0x3f, 0x46, 0x33, 0x32, 0x46, + 0x57, 0x62, 0x72, 0x7e, 0x83, 0x82, 0x7e, 0x7b, + 0x89, 0x92, 0x8f, 0x7a, 0x68, 0x60, 0x59, 0x51, + 0x2c, 0x3f, 0x48, 0x37, 0x22, 0x2c, 0x59, 0x86, + 0x71, 0x57, 0x42, 0x4b, 0x70, 0x96, 0xa7, 0xa9, + 0x7d, 0x7d, 0x7e, 0x7d, 0x7b, 0x79, 0x76, 0x74, + 0x73, 0x5c, 0x4a, 0x4d, 0x57, 0x5a, 0x58, 0x57, + 0x53, 0x51, 0x4e, 0x4c, 0x4b, 0x4c, 0x4d, 0x4e, + 0x50, 0x45, 0x37, 0x2d, 0x2a, 0x2a, 0x2c, 0x2c, + 0x20, 0x27, 0x28, 0x26, 0x1d, 0x41, 0x91, 0xb8, + 0xad, 0xa5, 0xab, 0xb2, 0xac, 0xaa, 0xac, 0xa6, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xae, 0xa4, 0xa5, 0xaf, 0xb0, 0xa8, 0xa8, 0xb1, + 0xa9, 0xa6, 0x9e, 0xa4, 0xb0, 0xa9, 0xa0, 0xa7, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0xa8, 0x9c, 0x9a, 0xa1, 0x9b, 0x8b, 0x86, 0x8f, + 0xa6, 0xa6, 0xa6, 0xa3, 0xa0, 0xa0, 0xa3, 0xa6, + 0xad, 0xa9, 0xa4, 0xa1, 0xa3, 0xa9, 0xb2, 0xb7, + 0xaf, 0xaf, 0xad, 0xa9, 0xa4, 0x9e, 0x99, 0x96, + 0x88, 0x75, 0x70, 0x73, 0x6f, 0x72, 0x81, 0x89, + 0x94, 0xb7, 0xbf, 0x8e, 0x4b, 0x27, 0x31, 0x4d, + 0x85, 0xa9, 0xb4, 0xb0, 0x99, 0x69, 0x48, 0x3d, + 0x37, 0x49, 0x6b, 0x95, 0xb8, 0xca, 0xcc, 0xc7, + 0xc3, 0xc4, 0xbd, 0xb0, 0xa9, 0xab, 0xac, 0xa9, + 0xa4, 0xa0, 0xa4, 0xa9, 0xa9, 0xab, 0xab, 0xa4, + 0x90, 0x8d, 0x8d, 0x96, 0xa2, 0xa6, 0xa0, 0x97, + 0x7e, 0x7c, 0x67, 0x3d, 0x1d, 0x28, 0x5d, 0x8f, + 0x6f, 0x6e, 0x75, 0x84, 0x8d, 0x82, 0x64, 0x4a, + 0x3e, 0x35, 0x33, 0x38, 0x35, 0x27, 0x26, 0x33, + 0x73, 0x6c, 0x3e, 0x21, 0x3d, 0x62, 0x79, 0x90, + 0x80, 0x75, 0x6c, 0x5e, 0x51, 0x5e, 0x74, 0x7c, + 0x7d, 0x81, 0x8b, 0x7e, 0x71, 0x73, 0x7a, 0x8d, + 0x9c, 0x87, 0x60, 0x4c, 0x5e, 0x7a, 0x89, 0x8f, + 0x92, 0x8b, 0x92, 0x97, 0x82, 0x6a, 0x6a, 0x74, + 0x85, 0x85, 0x82, 0x7e, 0x79, 0x72, 0x6c, 0x68, + 0x73, 0x71, 0x6d, 0x6a, 0x67, 0x64, 0x63, 0x63, + 0x6b, 0x64, 0x61, 0x6a, 0x76, 0x79, 0x6f, 0x63, + 0x58, 0x55, 0x46, 0x38, 0x42, 0x5c, 0x6a, 0x68, + 0x6f, 0x75, 0x79, 0x76, 0x71, 0x73, 0x7f, 0x8b, + 0x7c, 0x6e, 0x5c, 0x51, 0x4e, 0x51, 0x54, 0x55, + 0x57, 0x44, 0x47, 0x5e, 0x5d, 0x4b, 0x57, 0x79, + 0xb3, 0xb0, 0xab, 0xa5, 0x9d, 0x94, 0x8a, 0x83, + 0x8a, 0x73, 0x5e, 0x58, 0x52, 0x48, 0x45, 0x49, + 0x5d, 0x4f, 0x3f, 0x3b, 0x43, 0x4b, 0x4b, 0x48, + 0x47, 0x58, 0x74, 0x8e, 0x92, 0x77, 0x48, 0x23, + 0x44, 0x46, 0x4a, 0x51, 0x5b, 0x66, 0x70, 0x75, + 0x5a, 0x56, 0x57, 0x5d, 0x5d, 0x5a, 0x5f, 0x6a, + 0x66, 0x66, 0x66, 0x61, 0x58, 0x4c, 0x40, 0x39, + 0x34, 0x30, 0x2c, 0x2b, 0x2c, 0x2c, 0x29, 0x27, + 0x26, 0x1d, 0x30, 0x1c, 0x3c, 0x9c, 0xb4, 0xa9, + 0xb0, 0xa7, 0xae, 0xb2, 0xa6, 0xa8, 0xae, 0xa6, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa3, 0xac, 0xb0, 0xac, 0xa8, 0xaa, 0xaf, 0xb1, + 0xaf, 0xa4, 0xa3, 0xaa, 0xac, 0xa9, 0xaa, 0xab, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x91, 0x9d, 0xa0, 0x93, 0x85, 0x88, 0x99, 0xa8, + 0xa1, 0xa5, 0xa7, 0xa5, 0xa1, 0x9f, 0xa2, 0xa6, + 0x98, 0x97, 0x97, 0x99, 0xa0, 0xa9, 0xb2, 0xb8, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb5, 0xb4, 0xb2, 0xb1, + 0xbd, 0x9f, 0x9c, 0xa8, 0xa2, 0x92, 0x7a, 0x5d, + 0x5e, 0x38, 0x1b, 0x1b, 0x3f, 0x82, 0xb5, 0xbe, + 0x90, 0x80, 0x62, 0x48, 0x35, 0x49, 0x82, 0x9f, + 0xc5, 0xc6, 0xc4, 0xbd, 0xb4, 0xac, 0xa9, 0xa8, + 0xa0, 0xa7, 0xa6, 0x9e, 0x9c, 0xa4, 0xa7, 0xa4, + 0x9e, 0x9e, 0xa6, 0xa9, 0xa3, 0xa2, 0xa6, 0xa3, + 0x88, 0x85, 0x85, 0x8e, 0x99, 0x9b, 0x93, 0x8a, + 0x9a, 0x9e, 0xa1, 0x99, 0x84, 0x65, 0x47, 0x33, + 0x36, 0x53, 0x69, 0x6d, 0x64, 0x50, 0x44, 0x49, + 0x3e, 0x37, 0x2c, 0x27, 0x2f, 0x42, 0x60, 0x7a, + 0x4c, 0x2d, 0x34, 0x49, 0x3d, 0x34, 0x45, 0x54, + 0x67, 0x6f, 0x62, 0x51, 0x5b, 0x6c, 0x71, 0x73, + 0x78, 0x75, 0x81, 0x75, 0x6d, 0x73, 0x6e, 0x7c, + 0x79, 0x68, 0x4d, 0x50, 0x77, 0x8e, 0x8f, 0x91, + 0x81, 0x8e, 0x8a, 0x6c, 0x5d, 0x75, 0x8e, 0x8c, + 0x85, 0x88, 0x8b, 0x8d, 0x8b, 0x89, 0x86, 0x85, + 0x85, 0x86, 0x86, 0x85, 0x82, 0x7e, 0x79, 0x76, + 0x70, 0x75, 0x79, 0x77, 0x70, 0x6b, 0x6b, 0x6e, + 0x60, 0x6b, 0x6e, 0x68, 0x69, 0x71, 0x6e, 0x61, + 0x6e, 0x68, 0x67, 0x73, 0x82, 0x82, 0x6f, 0x5b, + 0x69, 0x5e, 0x4e, 0x41, 0x3b, 0x3c, 0x41, 0x45, + 0x5b, 0x68, 0x6d, 0x66, 0x62, 0x6f, 0x81, 0x8c, + 0x82, 0x77, 0x6c, 0x69, 0x71, 0x7d, 0x85, 0x89, + 0x6c, 0x50, 0x42, 0x4f, 0x5a, 0x57, 0x58, 0x62, + 0x32, 0x30, 0x31, 0x38, 0x44, 0x4d, 0x50, 0x50, + 0x46, 0x50, 0x53, 0x45, 0x32, 0x30, 0x43, 0x59, + 0x2b, 0x45, 0x62, 0x69, 0x59, 0x41, 0x31, 0x2b, + 0x3d, 0x4a, 0x54, 0x57, 0x59, 0x5e, 0x5c, 0x56, + 0x58, 0x5b, 0x5d, 0x5c, 0x55, 0x49, 0x3d, 0x35, + 0x25, 0x2c, 0x31, 0x2e, 0x25, 0x20, 0x22, 0x26, + 0x23, 0x20, 0x27, 0x37, 0x81, 0xbb, 0xad, 0xb0, + 0xab, 0xa5, 0xaa, 0xae, 0xa8, 0xac, 0xaf, 0xa4, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xac, 0xac, 0xa5, 0x9e, 0xa7, 0xb2, 0xab, 0x99, + 0x8e, 0x7d, 0x88, 0x9a, 0x9a, 0xa7, 0xb3, 0xa6, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x97, 0x9a, 0x91, 0x82, 0x87, 0x9d, 0xa6, 0x9f, + 0xa3, 0xa1, 0x9f, 0x9d, 0x9d, 0x9f, 0xa3, 0xa7, + 0xac, 0xae, 0xb0, 0xab, 0x9d, 0x89, 0x75, 0x68, + 0x68, 0x65, 0x61, 0x62, 0x69, 0x76, 0x84, 0x8d, + 0x9f, 0x9f, 0xa9, 0xaf, 0x9b, 0x71, 0x44, 0x26, + 0x20, 0x2b, 0x73, 0xb5, 0xc1, 0xc5, 0xa8, 0x62, + 0x51, 0x64, 0x59, 0x6b, 0xa2, 0xbe, 0xbe, 0xb8, + 0xa6, 0xa6, 0xa4, 0xa2, 0xa1, 0xa3, 0xa5, 0xa7, + 0xa5, 0xa7, 0x9f, 0x92, 0x93, 0xa2, 0xaa, 0xa7, + 0x9b, 0x98, 0x9d, 0xa2, 0xa1, 0xa6, 0xab, 0xa8, + 0x92, 0x85, 0x76, 0x6f, 0x71, 0x71, 0x6c, 0x65, + 0x75, 0x82, 0x91, 0x95, 0x89, 0x72, 0x5a, 0x4c, + 0x36, 0x36, 0x41, 0x48, 0x42, 0x3c, 0x34, 0x26, + 0x1f, 0x38, 0x24, 0x32, 0x80, 0x87, 0x44, 0x24, + 0x1a, 0x37, 0x3c, 0x2f, 0x2d, 0x2e, 0x2f, 0x36, + 0x45, 0x5a, 0x5f, 0x58, 0x5c, 0x61, 0x63, 0x69, + 0x53, 0x4f, 0x50, 0x53, 0x5b, 0x65, 0x67, 0x69, + 0x71, 0x5e, 0x4f, 0x59, 0x73, 0x84, 0x87, 0x87, + 0x80, 0x68, 0x6b, 0x84, 0x87, 0x7a, 0x7b, 0x85, + 0x81, 0x83, 0x86, 0x8a, 0x8e, 0x8d, 0x89, 0x85, + 0x84, 0x89, 0x90, 0x95, 0x96, 0x92, 0x8c, 0x88, + 0x7e, 0x6f, 0x63, 0x67, 0x76, 0x7e, 0x78, 0x6e, + 0x6f, 0x79, 0x79, 0x6b, 0x65, 0x69, 0x65, 0x5a, + 0x71, 0x7b, 0x86, 0x8b, 0x87, 0x7f, 0x78, 0x75, + 0x7e, 0x73, 0x61, 0x4c, 0x3d, 0x38, 0x3b, 0x3f, + 0x4c, 0x5c, 0x5a, 0x4b, 0x51, 0x6d, 0x7c, 0x76, + 0x7a, 0x7b, 0x80, 0x8c, 0x96, 0x94, 0x88, 0x7b, + 0x67, 0x70, 0x81, 0x8f, 0x8c, 0x77, 0x5d, 0x4d, + 0x3b, 0x45, 0x4e, 0x4c, 0x40, 0x34, 0x2e, 0x2e, + 0x34, 0x38, 0x41, 0x4d, 0x52, 0x4b, 0x3a, 0x2c, + 0x48, 0x43, 0x3f, 0x40, 0x45, 0x4b, 0x50, 0x52, + 0x50, 0x4c, 0x41, 0x3b, 0x43, 0x51, 0x53, 0x4c, + 0x59, 0x51, 0x45, 0x3a, 0x32, 0x30, 0x31, 0x33, + 0x36, 0x2c, 0x22, 0x20, 0x23, 0x25, 0x22, 0x1d, + 0x24, 0x20, 0x48, 0x80, 0x99, 0xa6, 0xb3, 0xb6, + 0xa2, 0xa0, 0xa5, 0xad, 0xad, 0xac, 0xac, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa7, 0xad, 0xad, 0x92, 0x74, 0x7a, 0x95, + 0x99, 0x9d, 0x9b, 0x8e, 0x84, 0x8a, 0x9b, 0xa9, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x8b, 0x7f, 0x81, 0x95, 0xa5, 0xa5, 0xa2, 0xa4, + 0xa3, 0xa3, 0xa5, 0xa8, 0xa8, 0xa2, 0x96, 0x8d, + 0x5c, 0x56, 0x4f, 0x4d, 0x55, 0x66, 0x78, 0x84, + 0x8f, 0x90, 0x90, 0x8e, 0x86, 0x7b, 0x70, 0x69, + 0x6a, 0x73, 0x75, 0x68, 0x42, 0x1e, 0x41, 0x8e, + 0x9a, 0x98, 0xa1, 0xa8, 0xa7, 0xaa, 0xa0, 0x86, + 0x9d, 0x87, 0x80, 0xa5, 0xba, 0xac, 0xa6, 0xa4, + 0xa5, 0xa5, 0xa5, 0xa4, 0xa3, 0xa3, 0xa4, 0xa6, + 0xa4, 0xa2, 0x97, 0x8c, 0x93, 0xa5, 0xa8, 0x9f, + 0xa2, 0xa3, 0xaa, 0xac, 0xa3, 0xa1, 0xa3, 0xa0, + 0x8d, 0x76, 0x57, 0x43, 0x3e, 0x40, 0x40, 0x3e, + 0x47, 0x43, 0x42, 0x4a, 0x55, 0x57, 0x4e, 0x43, + 0x38, 0x28, 0x36, 0x3a, 0x22, 0x27, 0x35, 0x25, + 0x3a, 0x29, 0x84, 0xaa, 0x52, 0x55, 0x94, 0x7c, + 0x89, 0x77, 0x6e, 0x69, 0x54, 0x39, 0x2c, 0x29, + 0x2e, 0x22, 0x26, 0x33, 0x35, 0x38, 0x3f, 0x3e, + 0x40, 0x45, 0x3e, 0x4c, 0x56, 0x58, 0x66, 0x61, + 0x5e, 0x53, 0x51, 0x52, 0x53, 0x67, 0x7f, 0x84, + 0x6d, 0x6d, 0x6f, 0x6e, 0x6f, 0x7a, 0x7f, 0x76, + 0x69, 0x68, 0x6d, 0x78, 0x86, 0x8c, 0x88, 0x82, + 0x7b, 0x81, 0x8a, 0x8f, 0x8e, 0x87, 0x7d, 0x76, + 0x75, 0x7d, 0x86, 0x88, 0x84, 0x80, 0x80, 0x82, + 0x61, 0x71, 0x78, 0x72, 0x73, 0x7c, 0x7e, 0x76, + 0x6f, 0x80, 0x8d, 0x85, 0x71, 0x6a, 0x79, 0x8b, + 0x7b, 0x72, 0x62, 0x50, 0x42, 0x3e, 0x43, 0x49, + 0x3c, 0x37, 0x34, 0x40, 0x5a, 0x75, 0x84, 0x87, + 0x87, 0x82, 0x7f, 0x84, 0x89, 0x85, 0x77, 0x69, + 0x62, 0x76, 0x7e, 0x6d, 0x60, 0x60, 0x5e, 0x55, + 0x44, 0x49, 0x48, 0x3c, 0x2d, 0x2c, 0x3a, 0x4a, + 0x52, 0x50, 0x49, 0x3e, 0x35, 0x36, 0x41, 0x4b, + 0x3d, 0x4a, 0x54, 0x4e, 0x3f, 0x39, 0x43, 0x51, + 0x51, 0x44, 0x3a, 0x37, 0x35, 0x31, 0x36, 0x3f, + 0x39, 0x3a, 0x3c, 0x3b, 0x38, 0x34, 0x2e, 0x2b, + 0x25, 0x26, 0x26, 0x23, 0x21, 0x22, 0x26, 0x2a, + 0x1e, 0x36, 0x8c, 0x9f, 0x9c, 0xae, 0xa0, 0xab, + 0xab, 0xaa, 0xab, 0xaf, 0xab, 0xa4, 0xaa, 0xba, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa1, 0xa7, 0xa9, 0xa7, 0xad, 0xb9, 0xbb, 0xb3, + 0xb0, 0x8e, 0x41, 0x36, 0x89, 0xb6, 0xa7, 0xa6, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, + 0x9e, 0xa0, 0x9d, 0x9a, 0xa1, 0x95, 0x1d, 0x06, + 0x65, 0x7d, 0x9b, 0xab, 0xaa, 0xa4, 0xa1, 0xa3, + 0xa2, 0x9a, 0x88, 0x6f, 0x5b, 0x54, 0x5c, 0x66, + 0x82, 0x9e, 0xac, 0xb3, 0xbc, 0xb3, 0xb0, 0xc3, + 0xb0, 0xac, 0xb7, 0xb2, 0xa6, 0xbf, 0xc1, 0x94, + 0x4e, 0x4c, 0x53, 0x57, 0x44, 0x5b, 0xa5, 0xc8, + 0xb9, 0xab, 0xa2, 0x8f, 0x8d, 0x84, 0x6f, 0x83, + 0x97, 0x8a, 0x91, 0xa2, 0xa6, 0xa7, 0xa6, 0x9d, + 0xa6, 0xa5, 0xa4, 0xa2, 0xa1, 0x9f, 0x9e, 0x9d, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa1, 0xaa, 0x99, 0xa8, 0xab, 0xa1, 0xa9, 0x8c, + 0xa8, 0xaf, 0xa2, 0x6b, 0x35, 0x32, 0x40, 0x39, + 0x30, 0x32, 0x33, 0x31, 0x30, 0x34, 0x3e, 0x46, + 0x43, 0x40, 0x3b, 0x35, 0x31, 0x3e, 0x6d, 0xa2, + 0xc2, 0xb3, 0x77, 0x50, 0x84, 0xc4, 0xb3, 0x7d, + 0x99, 0xa7, 0x93, 0xab, 0xcc, 0xc0, 0xb5, 0xa6, + 0x77, 0x71, 0x64, 0x4f, 0x36, 0x22, 0x18, 0x15, + 0x25, 0x28, 0x2f, 0x35, 0x33, 0x30, 0x36, 0x3f, + 0x45, 0x46, 0x4f, 0x5b, 0x5e, 0x56, 0x50, 0x4f, + 0x4a, 0x53, 0x5a, 0x5b, 0x5d, 0x64, 0x69, 0x69, + 0x5a, 0x60, 0x69, 0x72, 0x78, 0x7b, 0x7c, 0x7c, + 0x83, 0x8b, 0x7b, 0x6d, 0x76, 0x74, 0x64, 0x5f, + 0x74, 0x82, 0x81, 0x75, 0x70, 0x6f, 0x69, 0x62, + 0x55, 0x62, 0x75, 0x84, 0x8a, 0x84, 0x79, 0x70, + 0x7a, 0x7e, 0x83, 0x87, 0x89, 0x88, 0x85, 0x83, + 0x7b, 0x7e, 0x7b, 0x6a, 0x51, 0x3f, 0x3a, 0x3c, + 0x37, 0x38, 0x3e, 0x4b, 0x5c, 0x69, 0x6f, 0x70, + 0x79, 0x82, 0x86, 0x7d, 0x6c, 0x64, 0x69, 0x72, + 0x86, 0x87, 0x80, 0x6c, 0x52, 0x40, 0x3b, 0x3d, + 0x35, 0x42, 0x41, 0x35, 0x3b, 0x5b, 0x78, 0x83, + 0x63, 0x54, 0x43, 0x39, 0x3a, 0x3f, 0x42, 0x42, + 0x3e, 0x39, 0x34, 0x33, 0x34, 0x34, 0x30, 0x2c, + 0x2b, 0x30, 0x38, 0x3e, 0x40, 0x3f, 0x3c, 0x3a, + 0x35, 0x34, 0x31, 0x2e, 0x2a, 0x27, 0x24, 0x23, + 0x22, 0x23, 0x27, 0x24, 0x1d, 0x1e, 0x23, 0x20, + 0x2f, 0x84, 0x97, 0x90, 0x9d, 0xa2, 0xaa, 0xaf, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa2, 0xa3, 0xac, 0xae, 0xa8, 0xa9, 0xb0, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, + 0xa2, 0xa0, 0x9f, 0xa0, 0xa6, 0x94, 0x1b, 0x06, + 0x7f, 0x89, 0x95, 0x99, 0x92, 0x83, 0x73, 0x6a, + 0x4c, 0x5b, 0x6f, 0x82, 0x92, 0xa3, 0xb5, 0xc2, + 0xb8, 0xa9, 0xa6, 0xad, 0xa9, 0x9e, 0xa0, 0xa8, + 0x98, 0xa8, 0xa0, 0xa3, 0xb2, 0x8c, 0x52, 0x46, + 0x51, 0x5b, 0x81, 0xa4, 0x83, 0x5d, 0x6f, 0x7c, + 0x8b, 0x8f, 0xa0, 0xb2, 0xa7, 0x95, 0xa3, 0xb8, + 0x99, 0x88, 0x8a, 0x9a, 0xa3, 0xaa, 0xaa, 0xa2, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, + 0x9e, 0x9f, 0xa0, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa6, 0x9d, 0xa5, 0xaa, 0xa8, 0x9f, 0x91, 0x8f, + 0xbc, 0xa7, 0x85, 0x8e, 0xa0, 0x6b, 0x42, 0x62, + 0x3a, 0x5f, 0x59, 0x48, 0x4e, 0x42, 0x43, 0x6d, + 0x72, 0x74, 0x7a, 0x87, 0xa8, 0xd5, 0xe3, 0xd1, + 0x7e, 0x3a, 0x67, 0xbc, 0xba, 0xae, 0xa0, 0x6a, + 0x88, 0x92, 0x7f, 0x74, 0x84, 0x9b, 0xb4, 0xc4, + 0xc9, 0xcd, 0xcf, 0xcb, 0xc2, 0xba, 0xb6, 0xb6, + 0xaa, 0x95, 0x6e, 0x4a, 0x3c, 0x3a, 0x2f, 0x1e, + 0x20, 0x29, 0x2f, 0x31, 0x35, 0x3e, 0x40, 0x3d, + 0x3c, 0x47, 0x4f, 0x4c, 0x49, 0x4f, 0x58, 0x5d, + 0x5f, 0x62, 0x63, 0x61, 0x5f, 0x63, 0x6d, 0x76, + 0x6e, 0x62, 0x65, 0x72, 0x6d, 0x5f, 0x64, 0x76, + 0x68, 0x74, 0x76, 0x6f, 0x6e, 0x6f, 0x6a, 0x63, + 0x6a, 0x69, 0x67, 0x67, 0x67, 0x69, 0x6a, 0x6c, + 0x7d, 0x7f, 0x81, 0x81, 0x7f, 0x7a, 0x74, 0x71, + 0x7f, 0x82, 0x83, 0x7c, 0x6f, 0x62, 0x5a, 0x57, + 0x6a, 0x5d, 0x4d, 0x47, 0x4e, 0x5d, 0x6d, 0x75, + 0x77, 0x79, 0x74, 0x69, 0x61, 0x6c, 0x87, 0x9f, + 0xa5, 0x90, 0x71, 0x56, 0x4a, 0x4b, 0x52, 0x58, + 0x48, 0x49, 0x51, 0x60, 0x69, 0x68, 0x62, 0x5e, + 0x3f, 0x45, 0x53, 0x66, 0x77, 0x7b, 0x75, 0x6c, + 0x4b, 0x4f, 0x51, 0x4b, 0x41, 0x3c, 0x3e, 0x43, + 0x40, 0x42, 0x43, 0x41, 0x3d, 0x39, 0x38, 0x38, + 0x37, 0x35, 0x32, 0x2d, 0x27, 0x23, 0x1f, 0x1d, + 0x28, 0x1e, 0x20, 0x24, 0x1e, 0x1e, 0x21, 0x1c, + 0x7f, 0xaa, 0xaf, 0x99, 0x97, 0xa6, 0xaf, 0xa8, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa1, 0x74, 0x68, 0x92, 0xb3, 0xab, 0x9f, 0xa4, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa6, 0xa6, 0xa6, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, + 0xa2, 0xa0, 0x9f, 0xa0, 0xa7, 0x95, 0x1b, 0x06, + 0x74, 0x6c, 0x60, 0x59, 0x5f, 0x73, 0x8c, 0x9e, + 0xad, 0xb3, 0xb7, 0xb5, 0xaf, 0xa9, 0xa9, 0xab, + 0xa1, 0xa8, 0xae, 0xa9, 0xa1, 0xa2, 0xa3, 0xa0, + 0x9c, 0xae, 0xaf, 0x81, 0x4a, 0x4a, 0x81, 0xb1, + 0x78, 0xa3, 0xbd, 0xae, 0x8a, 0x89, 0x97, 0x7e, + 0x6c, 0x6e, 0x7a, 0x9d, 0x9d, 0x94, 0xa7, 0x9c, + 0x8f, 0x90, 0x9b, 0xa4, 0xa1, 0xa1, 0xa7, 0xab, + 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0x97, 0x99, 0x9c, 0xa1, 0xa5, 0xaa, 0xad, 0xaf, + 0xaa, 0xa2, 0xae, 0xa7, 0xa3, 0xa5, 0x98, 0xa3, + 0x95, 0x7e, 0x9c, 0xa2, 0x77, 0x8c, 0xb6, 0xa2, + 0x81, 0x9f, 0x88, 0x90, 0xcf, 0xc8, 0x9c, 0xab, + 0xb9, 0xbb, 0xb8, 0xac, 0x9a, 0x7c, 0x4b, 0x1c, + 0x46, 0xa0, 0xca, 0xb4, 0xab, 0xaf, 0xa1, 0x93, + 0x79, 0x98, 0xaf, 0x9f, 0x95, 0xa0, 0xa1, 0xa1, + 0xab, 0xac, 0xad, 0xad, 0xae, 0xb2, 0xb9, 0xbf, + 0xc4, 0xc9, 0xce, 0xca, 0xbd, 0xaf, 0xaa, 0xac, + 0xa0, 0x89, 0x60, 0x39, 0x28, 0x2a, 0x2f, 0x2e, + 0x2e, 0x31, 0x32, 0x31, 0x32, 0x34, 0x2e, 0x25, + 0x2e, 0x33, 0x39, 0x3e, 0x42, 0x46, 0x4a, 0x4d, + 0x46, 0x4d, 0x54, 0x58, 0x5d, 0x64, 0x62, 0x59, + 0x64, 0x66, 0x65, 0x5e, 0x5c, 0x61, 0x63, 0x5f, + 0x63, 0x65, 0x68, 0x6a, 0x6a, 0x69, 0x67, 0x65, + 0x5f, 0x62, 0x66, 0x69, 0x6a, 0x68, 0x65, 0x62, + 0x72, 0x73, 0x75, 0x77, 0x74, 0x68, 0x57, 0x4a, + 0x45, 0x38, 0x32, 0x44, 0x66, 0x80, 0x85, 0x80, + 0x7e, 0x7c, 0x72, 0x60, 0x54, 0x5b, 0x75, 0x8c, + 0x8c, 0x81, 0x75, 0x72, 0x73, 0x6d, 0x5d, 0x4f, + 0x67, 0x64, 0x71, 0x83, 0x7a, 0x57, 0x40, 0x3f, + 0x3f, 0x5c, 0x77, 0x73, 0x57, 0x3d, 0x38, 0x3e, + 0x46, 0x3e, 0x32, 0x2a, 0x2a, 0x30, 0x38, 0x3d, + 0x3d, 0x35, 0x2b, 0x28, 0x2c, 0x30, 0x30, 0x2e, + 0x2f, 0x2e, 0x2d, 0x2a, 0x28, 0x26, 0x24, 0x23, + 0x23, 0x24, 0x1f, 0x24, 0x2a, 0x21, 0x30, 0x5b, + 0xa7, 0xa9, 0xa9, 0x90, 0x89, 0xa7, 0xb0, 0x9f, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa7, 0xb0, 0xb4, 0xad, 0xa8, 0xaa, 0xae, 0xae, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, + 0xa2, 0xa1, 0x9f, 0xa1, 0xa7, 0x95, 0x1b, 0x06, + 0x74, 0x88, 0xa1, 0xb1, 0xb4, 0xb1, 0xb0, 0xb1, + 0xaa, 0xab, 0xa9, 0xa5, 0x9f, 0x9e, 0xa2, 0xa6, + 0x9e, 0xa9, 0xa7, 0xa2, 0xab, 0xad, 0xa1, 0x99, + 0xb9, 0xb4, 0x72, 0x40, 0x71, 0xac, 0x98, 0x67, + 0x79, 0x9b, 0xac, 0xa1, 0x8a, 0x92, 0xae, 0xa8, + 0xa7, 0x8a, 0x67, 0x6c, 0x8a, 0xaa, 0xb2, 0x90, + 0x9a, 0x94, 0x94, 0x9a, 0xa1, 0xa5, 0xa5, 0xa1, + 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa1, + 0xa1, 0x9d, 0xa2, 0xae, 0xaf, 0x9f, 0x98, 0xa4, + 0x7d, 0xb4, 0x81, 0x4d, 0x8e, 0xb6, 0x96, 0x8d, + 0x53, 0x86, 0xa2, 0xaf, 0xbc, 0xa6, 0x91, 0xa1, + 0xba, 0x9e, 0xa4, 0xd1, 0xb6, 0x4c, 0x3a, 0x92, + 0xbf, 0xb8, 0xaa, 0x9d, 0xa1, 0xab, 0xa2, 0x8b, + 0x95, 0xab, 0xb6, 0xa3, 0x91, 0x9d, 0xab, 0xa8, + 0xa3, 0xa5, 0xa8, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, + 0xac, 0xa9, 0xac, 0xb3, 0xb1, 0xa9, 0xa8, 0xaf, + 0xc6, 0xaf, 0xa4, 0xb6, 0xc9, 0xbd, 0x97, 0x76, + 0x61, 0x5f, 0x59, 0x51, 0x4d, 0x49, 0x3e, 0x32, + 0x1e, 0x19, 0x18, 0x20, 0x2c, 0x33, 0x30, 0x2b, + 0x29, 0x2d, 0x2e, 0x31, 0x35, 0x37, 0x44, 0x5a, + 0x58, 0x4c, 0x45, 0x45, 0x46, 0x4c, 0x4c, 0x40, + 0x49, 0x4d, 0x52, 0x57, 0x5a, 0x5a, 0x58, 0x56, + 0x59, 0x5c, 0x61, 0x66, 0x68, 0x67, 0x65, 0x64, + 0x78, 0x75, 0x75, 0x7a, 0x7b, 0x6e, 0x54, 0x3f, + 0x4b, 0x2e, 0x1c, 0x34, 0x69, 0x93, 0x9b, 0x91, + 0x55, 0x62, 0x6f, 0x71, 0x6e, 0x71, 0x80, 0x8e, + 0x9a, 0x89, 0x73, 0x63, 0x5c, 0x59, 0x56, 0x53, + 0x71, 0x71, 0x71, 0x69, 0x57, 0x54, 0x70, 0x94, + 0x77, 0x6a, 0x5b, 0x55, 0x55, 0x54, 0x4d, 0x45, + 0x23, 0x2c, 0x3e, 0x58, 0x70, 0x7d, 0x7d, 0x79, + 0x5c, 0x52, 0x44, 0x38, 0x33, 0x33, 0x36, 0x39, + 0x3b, 0x39, 0x34, 0x2f, 0x29, 0x23, 0x1f, 0x1c, + 0x21, 0x24, 0x26, 0x29, 0x21, 0x20, 0x54, 0x9f, + 0xa2, 0x99, 0x9f, 0x90, 0x92, 0xb5, 0xb6, 0xa6, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa7, 0xab, 0xab, 0xa7, 0xa8, 0xac, 0xad, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa7, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, + 0xa3, 0xa1, 0xa0, 0xa1, 0xa8, 0x96, 0x1c, 0x07, + 0xa1, 0xa7, 0xac, 0xab, 0xa5, 0xa2, 0xa3, 0xa7, + 0x9d, 0xa0, 0xa3, 0xa4, 0xa4, 0xa4, 0xa6, 0xa8, + 0xa3, 0x9c, 0xa7, 0xaa, 0x99, 0x9b, 0xac, 0xb0, + 0xa6, 0x5f, 0x4e, 0x8d, 0xb0, 0x8f, 0x77, 0x83, + 0x9b, 0xa3, 0xa8, 0xac, 0x95, 0x83, 0x9c, 0xaf, + 0xac, 0xb2, 0xa9, 0x83, 0x74, 0x7c, 0x83, 0x97, + 0xae, 0xa4, 0x98, 0x97, 0xa4, 0xac, 0xaa, 0xa5, + 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, + 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, + 0xa5, 0xae, 0x8f, 0x5f, 0x60, 0x83, 0x91, 0x8b, + 0x9d, 0x33, 0x54, 0xb5, 0xa7, 0x85, 0x92, 0x90, + 0x77, 0x88, 0xb8, 0xc3, 0x9b, 0x91, 0xa3, 0x9f, + 0xb4, 0xb2, 0xb0, 0x6f, 0x28, 0x5b, 0xb4, 0xbe, + 0xb0, 0xa7, 0xb7, 0xad, 0x90, 0xa8, 0xaf, 0x75, + 0x97, 0xa9, 0xa5, 0xa2, 0x93, 0x90, 0xac, 0xaa, + 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xaa, 0xa8, 0xa6, + 0xab, 0xae, 0xac, 0xa9, 0xad, 0xb0, 0xa4, 0x93, + 0x69, 0x7e, 0x9f, 0xb7, 0xba, 0xb0, 0xad, 0xb2, + 0x81, 0xa0, 0xc2, 0xd3, 0xd6, 0xd4, 0xd0, 0xcc, + 0xc2, 0xbd, 0xb7, 0xb2, 0xa7, 0x92, 0x74, 0x5f, + 0x37, 0x25, 0x22, 0x28, 0x2c, 0x37, 0x37, 0x23, + 0x32, 0x2c, 0x35, 0x35, 0x26, 0x26, 0x33, 0x33, + 0x36, 0x31, 0x2a, 0x28, 0x2c, 0x38, 0x45, 0x4e, + 0x4e, 0x51, 0x55, 0x59, 0x5a, 0x58, 0x55, 0x53, + 0x68, 0x67, 0x69, 0x71, 0x75, 0x6b, 0x54, 0x3f, + 0x38, 0x46, 0x64, 0x88, 0x9a, 0x86, 0x55, 0x2c, + 0x56, 0x68, 0x79, 0x79, 0x6b, 0x5c, 0x57, 0x59, + 0x51, 0x53, 0x51, 0x4a, 0x42, 0x40, 0x47, 0x4e, + 0x3e, 0x5e, 0x79, 0x79, 0x71, 0x72, 0x77, 0x78, + 0x67, 0x5f, 0x4d, 0x36, 0x27, 0x2b, 0x3f, 0x51, + 0x88, 0x93, 0x9e, 0xa0, 0x99, 0x8f, 0x88, 0x86, + 0x7c, 0x78, 0x6a, 0x52, 0x38, 0x2b, 0x2f, 0x38, + 0x35, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2c, 0x2b, + 0x25, 0x1f, 0x27, 0x26, 0x1e, 0x3e, 0x7a, 0x9d, + 0x98, 0x99, 0xa0, 0x96, 0xa1, 0xb7, 0xae, 0xa9, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa7, 0xaa, 0xad, 0xa7, 0x9e, 0xa1, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, 0xa5, + 0xa3, 0xa2, 0xa1, 0xa2, 0xa8, 0x96, 0x1d, 0x08, + 0xa4, 0xa2, 0xa1, 0xa4, 0xa7, 0xa8, 0xa5, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0x9a, 0x96, 0xb0, 0xaa, 0x8c, 0xa7, 0xb8, 0x88, + 0x45, 0x5d, 0xaa, 0xc5, 0x91, 0x88, 0x9e, 0x8d, + 0x6d, 0x8c, 0x9e, 0xa5, 0x99, 0x8f, 0x9d, 0xa0, + 0xa7, 0xa4, 0xa9, 0x9b, 0x92, 0x7a, 0x56, 0x67, + 0xa2, 0xa4, 0x9c, 0x99, 0xa1, 0xa6, 0xa4, 0xa2, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, + 0xa9, 0xa8, 0xa7, 0xa6, 0xa4, 0xa3, 0xa2, 0xa1, + 0xa5, 0xa0, 0xac, 0xaa, 0xa7, 0x8a, 0x5d, 0x64, + 0x2c, 0x8f, 0x92, 0x6c, 0x99, 0xc1, 0xb7, 0xbb, + 0xa5, 0x7c, 0x92, 0xa4, 0x8b, 0xa8, 0xcc, 0xad, + 0xbe, 0x9f, 0x49, 0x3d, 0x90, 0xa9, 0x94, 0xaa, + 0xa2, 0xa6, 0xa5, 0xad, 0xbd, 0xb5, 0x99, 0x88, + 0x99, 0xb0, 0xa9, 0xb0, 0xa1, 0x8b, 0xa5, 0xab, + 0xaf, 0xaa, 0xa5, 0xa4, 0xa6, 0xa9, 0xaa, 0xaa, + 0xa9, 0xae, 0xaf, 0xab, 0xa5, 0xa3, 0xa6, 0xa8, + 0xba, 0xaa, 0x97, 0x94, 0xa4, 0xaf, 0xa2, 0x8c, + 0x91, 0xa0, 0xad, 0xad, 0xaa, 0xad, 0xb2, 0xb5, + 0xbc, 0xbf, 0xc2, 0xc5, 0xc6, 0xc8, 0xcb, 0xce, + 0xd4, 0xd1, 0xd4, 0xa0, 0x53, 0x60, 0x9b, 0xa5, + 0x6c, 0x40, 0x2a, 0x2c, 0x2b, 0x34, 0x36, 0x23, + 0x21, 0x22, 0x23, 0x25, 0x28, 0x2b, 0x2e, 0x2f, + 0x2f, 0x34, 0x3c, 0x44, 0x4b, 0x4e, 0x4f, 0x4f, + 0x45, 0x49, 0x52, 0x5d, 0x63, 0x60, 0x56, 0x4d, + 0x4c, 0x59, 0x64, 0x5f, 0x4d, 0x41, 0x42, 0x49, + 0x41, 0x54, 0x6a, 0x74, 0x71, 0x6f, 0x76, 0x7e, + 0x53, 0x52, 0x4c, 0x41, 0x3b, 0x46, 0x5f, 0x75, + 0x50, 0x54, 0x4e, 0x43, 0x4d, 0x5f, 0x5a, 0x46, + 0x4b, 0x36, 0x26, 0x35, 0x5b, 0x79, 0x7f, 0x79, + 0x9d, 0xa0, 0xa2, 0x9f, 0x96, 0x8a, 0x7f, 0x78, + 0x63, 0x59, 0x4b, 0x3e, 0x36, 0x31, 0x2b, 0x28, + 0x41, 0x3f, 0x3b, 0x36, 0x30, 0x2b, 0x27, 0x24, + 0x1b, 0x2d, 0x1f, 0x20, 0x58, 0x87, 0x8d, 0x8e, + 0x91, 0x9d, 0x9b, 0x94, 0xa3, 0xab, 0xa2, 0xa8, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa5, 0xab, 0xa9, 0xa4, 0xa8, 0xb2, 0xb1, 0xa7, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa4, 0xa2, 0xa1, 0xa3, 0xa9, 0x97, 0x1d, 0x08, + 0xaa, 0xa5, 0x9f, 0x9f, 0xa2, 0xa4, 0xa3, 0xa0, + 0xa5, 0xa3, 0xa0, 0x9e, 0x9e, 0xa0, 0xa1, 0xa2, + 0xaf, 0xa7, 0xa0, 0x9d, 0xa5, 0xb0, 0x8a, 0x47, + 0x75, 0xb4, 0xbd, 0x93, 0x80, 0x80, 0x82, 0x8d, + 0x88, 0x95, 0x93, 0x94, 0x89, 0x81, 0x9b, 0xb1, + 0xab, 0x9e, 0x9e, 0xa8, 0xa6, 0x93, 0x87, 0x91, + 0x75, 0x76, 0x6e, 0x75, 0x94, 0xab, 0xad, 0xad, + 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa4, 0xa3, + 0xa1, 0xa2, 0xa3, 0xa5, 0xa6, 0xa8, 0xa9, 0xa9, + 0xad, 0xa9, 0xa9, 0xac, 0xa6, 0x7f, 0x60, 0x72, + 0xaf, 0x7d, 0x88, 0xaa, 0xa3, 0xa7, 0xb9, 0xae, + 0x99, 0x82, 0x90, 0x95, 0x7e, 0x8d, 0xa9, 0x9c, + 0x3e, 0x14, 0x57, 0xbd, 0xc0, 0xa7, 0xad, 0xaa, + 0xaa, 0xa5, 0xa4, 0x9e, 0x9e, 0xae, 0xa5, 0x7e, + 0x94, 0xac, 0xac, 0xaf, 0xa8, 0x94, 0x9b, 0xab, + 0xac, 0xaa, 0xab, 0xae, 0xb1, 0xb0, 0xaa, 0xa5, + 0xaf, 0xa9, 0xa9, 0xb0, 0xaf, 0xa6, 0xa4, 0xa9, + 0xab, 0xb4, 0xb3, 0xa1, 0x91, 0x92, 0x9e, 0xa7, + 0xaf, 0xb0, 0xad, 0xa8, 0xaa, 0xaf, 0xaf, 0xaa, + 0xa6, 0xac, 0xb0, 0xae, 0xa9, 0xa6, 0xa8, 0xab, + 0xb3, 0xa7, 0xb3, 0xb5, 0x89, 0x68, 0x85, 0xb7, + 0x94, 0x3b, 0x08, 0x21, 0x5e, 0xaa, 0xd2, 0xc7, + 0xc9, 0xc8, 0xc0, 0xae, 0x8e, 0x67, 0x42, 0x2c, + 0x27, 0x29, 0x2d, 0x2f, 0x2f, 0x2c, 0x28, 0x26, + 0x3b, 0x44, 0x4f, 0x55, 0x56, 0x56, 0x58, 0x5a, + 0x4d, 0x4d, 0x44, 0x32, 0x27, 0x36, 0x5b, 0x7c, + 0x9c, 0xa4, 0xa5, 0x94, 0x76, 0x5d, 0x52, 0x52, + 0x3e, 0x42, 0x46, 0x45, 0x3f, 0x37, 0x30, 0x2d, + 0x41, 0x3a, 0x39, 0x48, 0x60, 0x67, 0x53, 0x3a, + 0x38, 0x47, 0x5b, 0x6b, 0x75, 0x7d, 0x88, 0x90, + 0x9c, 0x92, 0x86, 0x81, 0x81, 0x80, 0x7a, 0x74, + 0x69, 0x5f, 0x56, 0x59, 0x60, 0x60, 0x56, 0x4a, + 0x39, 0x38, 0x36, 0x33, 0x30, 0x2e, 0x2c, 0x2b, + 0x16, 0x2f, 0x21, 0x3c, 0x94, 0xaa, 0x8b, 0x90, + 0x95, 0xa4, 0x9b, 0x9b, 0xa8, 0xa7, 0xa7, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xaa, 0xa8, 0xa7, 0xaa, 0xab, 0xa9, 0xa9, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa6, + 0xa4, 0xa3, 0xa2, 0xa3, 0xa9, 0x97, 0x1e, 0x09, + 0xa0, 0xa1, 0xa2, 0xa1, 0xa0, 0xa1, 0xa3, 0xa5, + 0xa9, 0xa8, 0xa6, 0xa6, 0xa7, 0xa6, 0xa4, 0xa2, + 0x9e, 0xa7, 0x97, 0xa5, 0xb5, 0x73, 0x4e, 0x8a, + 0xb4, 0xb3, 0x9a, 0x82, 0x8d, 0xa5, 0xa8, 0x9e, + 0x9e, 0xad, 0xa9, 0xa3, 0x93, 0x84, 0x94, 0xa2, + 0xa6, 0x9f, 0x97, 0xa4, 0x99, 0x92, 0xa9, 0xa5, + 0x9d, 0x9b, 0x83, 0x6d, 0x73, 0x83, 0x92, 0xa1, + 0xad, 0xac, 0xab, 0xa9, 0xa8, 0xa6, 0xa5, 0xa4, + 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, 0xa5, 0xa4, 0xa4, + 0xad, 0xaa, 0x79, 0x72, 0x6d, 0x56, 0x75, 0x94, + 0x82, 0xa9, 0xbf, 0xbd, 0xb4, 0xa4, 0x9f, 0xae, + 0xaf, 0x87, 0x65, 0x6a, 0x81, 0x77, 0x40, 0x0a, + 0x4f, 0x9e, 0xc4, 0xb1, 0xaa, 0xad, 0xaa, 0xa9, + 0xa9, 0xa7, 0xa9, 0xa3, 0xa1, 0xb1, 0xa6, 0x7c, + 0x99, 0xaa, 0xad, 0xa7, 0xaa, 0x9c, 0x8f, 0xa1, + 0xac, 0xa8, 0xa5, 0xa6, 0xac, 0xaf, 0xae, 0xac, + 0xa6, 0xaa, 0xab, 0xa8, 0xaa, 0xae, 0xae, 0xa9, + 0xa6, 0xa9, 0xaf, 0xb0, 0xa4, 0x96, 0x96, 0x9f, + 0xae, 0xb2, 0xb0, 0xa9, 0xa6, 0xa9, 0xab, 0xaa, + 0xab, 0xaa, 0xa8, 0xa6, 0xa6, 0xa8, 0xaa, 0xad, + 0xa5, 0xb3, 0xa9, 0xb4, 0xbd, 0x75, 0x3a, 0x55, + 0x7d, 0x80, 0xb1, 0xd7, 0xcb, 0xc3, 0xc8, 0xbd, + 0xb9, 0xbe, 0xc5, 0xcb, 0xce, 0xcb, 0xc7, 0xc4, + 0xa9, 0xa4, 0x98, 0x86, 0x70, 0x59, 0x46, 0x3b, + 0x2b, 0x35, 0x3d, 0x3b, 0x33, 0x31, 0x38, 0x40, + 0x4a, 0x50, 0x5c, 0x69, 0x6e, 0x68, 0x5a, 0x4e, + 0x61, 0x71, 0x7f, 0x7c, 0x6b, 0x5a, 0x53, 0x54, + 0x51, 0x43, 0x35, 0x37, 0x47, 0x5b, 0x67, 0x6b, + 0x68, 0x5b, 0x5f, 0x77, 0x81, 0x72, 0x5e, 0x57, + 0x69, 0x75, 0x82, 0x85, 0x7a, 0x6b, 0x5f, 0x5a, + 0x60, 0x6f, 0x83, 0x8d, 0x88, 0x79, 0x68, 0x5e, + 0x58, 0x60, 0x64, 0x5e, 0x4e, 0x40, 0x3b, 0x3b, + 0x3b, 0x39, 0x36, 0x32, 0x2e, 0x29, 0x26, 0x25, + 0x25, 0x15, 0x2c, 0x6d, 0x97, 0x90, 0x83, 0x87, + 0x99, 0xa6, 0x9a, 0xa1, 0xa9, 0xa3, 0xaa, 0xa8, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xa5, 0xa5, 0xab, 0xac, 0xa7, 0xa7, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, 0xa6, 0xa6, + 0xa5, 0xa3, 0xa2, 0xa3, 0xa9, 0x97, 0x1e, 0x09, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa3, 0xa0, 0xac, 0xa7, 0xa6, 0xa5, 0x97, 0x9e, + 0x99, 0xa8, 0xb5, 0xa4, 0x5e, 0x4d, 0x8e, 0xa9, + 0xb6, 0x99, 0x81, 0x91, 0xae, 0xa9, 0xa1, 0xb0, + 0x9c, 0xa3, 0xa8, 0xad, 0xa3, 0x8b, 0x8f, 0xaf, + 0xaa, 0x9c, 0x8e, 0x8d, 0x9a, 0xa6, 0xab, 0xaa, + 0xab, 0xa4, 0xa1, 0x9e, 0x8e, 0x74, 0x61, 0x5b, + 0x6a, 0x7f, 0x94, 0x9e, 0xa7, 0xb2, 0xb5, 0xb2, + 0xa2, 0xb5, 0xb7, 0xad, 0xae, 0xaf, 0xb0, 0xb7, + 0xb2, 0xab, 0x91, 0x4f, 0x54, 0x86, 0x8e, 0xa5, + 0xb0, 0xb0, 0xaa, 0xa3, 0xa6, 0xac, 0xaa, 0xa5, + 0xaa, 0x9f, 0x7b, 0x73, 0x6f, 0x3f, 0x49, 0xa1, + 0xb9, 0xb6, 0xb1, 0xac, 0xa8, 0xa5, 0xa4, 0xa3, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0x9b, 0xa4, 0xa9, 0xa7, 0xa5, 0xa4, 0x9c, 0x92, + 0xaa, 0xaf, 0xac, 0xa4, 0xa3, 0xaa, 0xab, 0xa5, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x87, 0x9b, 0xab, 0xab, 0xa7, 0xa9, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xb2, 0xaa, 0xa1, 0xab, 0xad, 0x86, 0x58, 0x4d, + 0x6c, 0xaa, 0xc3, 0xac, 0xa3, 0xab, 0xab, 0xa7, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, + 0xb7, 0xbf, 0xca, 0xd2, 0xd2, 0xca, 0xbf, 0xb7, + 0x85, 0x5c, 0x2a, 0x0f, 0x12, 0x1e, 0x24, 0x23, + 0x2f, 0x36, 0x3a, 0x3a, 0x3f, 0x42, 0x37, 0x26, + 0x41, 0x4f, 0x60, 0x6b, 0x6a, 0x5e, 0x50, 0x46, + 0x48, 0x4f, 0x58, 0x5d, 0x63, 0x72, 0x88, 0x9a, + 0x9a, 0x94, 0x8f, 0x91, 0x94, 0x8c, 0x7a, 0x6a, + 0x79, 0x70, 0x64, 0x5a, 0x56, 0x5a, 0x62, 0x68, + 0x76, 0x83, 0x7e, 0x67, 0x61, 0x6c, 0x69, 0x58, + 0x5a, 0x5b, 0x5c, 0x5a, 0x55, 0x4d, 0x45, 0x3f, + 0x3e, 0x34, 0x2a, 0x27, 0x2c, 0x2f, 0x2c, 0x27, + 0x1c, 0x5f, 0x97, 0x89, 0x95, 0x9c, 0x7c, 0x90, + 0xaa, 0x9b, 0xa2, 0xac, 0xa5, 0xa6, 0xac, 0xa6, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa8, 0xa7, 0xa7, 0xa6, 0xa5, 0xa5, + 0xa4, 0xa3, 0xa1, 0xa2, 0xab, 0x9e, 0x16, 0x07, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa3, 0xa6, 0x97, 0xaf, 0xb1, 0x9a, 0xa9, 0xaa, + 0x9f, 0xa8, 0xa5, 0x58, 0x4b, 0x96, 0xb4, 0xbc, + 0x9a, 0x88, 0x91, 0xa8, 0xaa, 0xa6, 0xa7, 0xa2, + 0x9d, 0xa3, 0xa8, 0xac, 0xa4, 0x8d, 0x8f, 0xac, + 0xa6, 0x9b, 0x90, 0x91, 0x9d, 0xa7, 0xaa, 0xa8, + 0xa5, 0xaa, 0xae, 0xaf, 0xae, 0xaa, 0xa3, 0x9d, + 0x99, 0x8e, 0x7e, 0x72, 0x6a, 0x66, 0x67, 0x6a, + 0x7e, 0x75, 0x82, 0x8e, 0x88, 0x87, 0x7d, 0x61, + 0x5c, 0x87, 0x83, 0x6a, 0x8e, 0x87, 0x4f, 0x5e, + 0xa3, 0xa4, 0x9e, 0x9f, 0xac, 0xad, 0xa3, 0x9f, + 0xae, 0xbe, 0xa9, 0x7d, 0x5a, 0x8a, 0xcc, 0xb0, + 0xb2, 0xb0, 0xad, 0xaa, 0xa8, 0xa7, 0xa8, 0xa8, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0x9d, 0xa6, 0xaa, 0xa8, 0xa7, 0xa6, 0x9f, 0x95, + 0xa4, 0xab, 0xad, 0xa7, 0xa5, 0xaa, 0xab, 0xa7, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa2, 0x99, 0x98, 0xa4, 0xac, 0xab, 0xa9, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa2, 0xb1, 0xab, 0x94, 0xa4, 0xac, 0x88, + 0x62, 0x8f, 0xa9, 0xaa, 0xae, 0xae, 0xa6, 0xa3, + 0xab, 0xab, 0xac, 0xac, 0xad, 0xae, 0xaf, 0xaf, + 0xb8, 0xb4, 0xae, 0xaa, 0xaa, 0xae, 0xb4, 0xb8, + 0xb9, 0xbd, 0xc5, 0xcf, 0xcf, 0xbd, 0x9e, 0x86, + 0x5f, 0x40, 0x3c, 0x5a, 0x6c, 0x68, 0x74, 0x90, + 0x8d, 0x7e, 0x6e, 0x69, 0x6a, 0x65, 0x58, 0x4b, + 0x74, 0x77, 0x78, 0x72, 0x6d, 0x71, 0x7e, 0x8b, + 0x8a, 0x74, 0x56, 0x40, 0x3b, 0x42, 0x4c, 0x54, + 0x57, 0x54, 0x4e, 0x48, 0x42, 0x3d, 0x3b, 0x39, + 0x51, 0x5d, 0x66, 0x67, 0x66, 0x64, 0x59, 0x4c, + 0x4c, 0x4f, 0x53, 0x57, 0x57, 0x55, 0x52, 0x50, + 0x28, 0x2c, 0x30, 0x2f, 0x2a, 0x27, 0x28, 0x2a, + 0x16, 0x61, 0x91, 0x93, 0xa3, 0x9c, 0x85, 0xa2, + 0xb1, 0xa1, 0x9b, 0xa0, 0xa2, 0xa6, 0xad, 0xaf, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, 0xa5, + 0xa4, 0xa3, 0xa2, 0xa3, 0xab, 0x9e, 0x17, 0x07, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa6, 0x9a, 0xa2, 0xa3, 0x9f, 0xac, 0xac, 0x9b, + 0xb1, 0x9c, 0x55, 0x4b, 0x91, 0xb1, 0xa9, 0xaf, + 0x83, 0x88, 0xa0, 0xaf, 0xa6, 0xa3, 0xa6, 0x9f, + 0x9d, 0xa4, 0xa7, 0xab, 0xa5, 0x91, 0x90, 0xa6, + 0xa1, 0x9a, 0x94, 0x98, 0xa2, 0xa9, 0xa8, 0xa5, + 0xa0, 0xa8, 0xaa, 0xa4, 0xa4, 0xaa, 0xa8, 0x9f, + 0x8d, 0x8a, 0x95, 0xaa, 0xb6, 0xaf, 0xa5, 0xa3, + 0x99, 0x9e, 0x9d, 0x95, 0x90, 0x93, 0xa3, 0xb6, + 0xcb, 0x91, 0x62, 0x75, 0xa8, 0xb0, 0xa6, 0xb9, + 0xac, 0xa5, 0xa2, 0xa2, 0xa1, 0xa5, 0xa8, 0xa6, + 0xc1, 0x8a, 0x54, 0x3d, 0x81, 0xc0, 0xaa, 0xa4, + 0xaa, 0xa9, 0xa7, 0xa7, 0xa7, 0xa9, 0xab, 0xad, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa0, 0xa8, 0xad, 0xaa, 0xa9, 0xa9, 0xa2, 0x9a, + 0x9b, 0xa6, 0xad, 0xac, 0xa8, 0xaa, 0xab, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xb1, 0xa0, 0x95, 0x9c, 0xa7, 0xaa, 0xa9, 0xaa, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa5, 0xb0, 0xaf, 0x9c, 0x93, 0xa5, 0xb6, 0xb5, + 0xb9, 0xba, 0xb3, 0xae, 0xaf, 0xaa, 0xa8, 0xaf, + 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xac, 0xad, + 0xb1, 0xac, 0xa5, 0xa1, 0xa1, 0xa5, 0xac, 0xb1, + 0xb4, 0xb5, 0xb6, 0xb6, 0xb8, 0xbc, 0xc2, 0xc6, + 0xc4, 0xaf, 0x80, 0x52, 0x49, 0x59, 0x5a, 0x49, + 0x45, 0x4d, 0x53, 0x4d, 0x43, 0x43, 0x4f, 0x5c, + 0x71, 0x6a, 0x64, 0x65, 0x6d, 0x75, 0x79, 0x7a, + 0x64, 0x72, 0x82, 0x88, 0x7f, 0x6e, 0x5e, 0x54, + 0x5f, 0x56, 0x48, 0x3f, 0x40, 0x4a, 0x58, 0x62, + 0x51, 0x50, 0x52, 0x57, 0x57, 0x52, 0x50, 0x52, + 0x48, 0x49, 0x49, 0x48, 0x45, 0x41, 0x3d, 0x3a, + 0x36, 0x34, 0x2e, 0x25, 0x20, 0x24, 0x31, 0x3c, + 0x48, 0x9d, 0x9f, 0x8b, 0xa3, 0xa2, 0x8b, 0x89, + 0xaa, 0xa1, 0x98, 0xa0, 0xae, 0xae, 0xa8, 0xaa, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa6, 0xa6, + 0xa5, 0xa4, 0xa2, 0xa3, 0xac, 0x9f, 0x17, 0x08, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa7, 0xa1, 0xa0, 0x98, 0xab, 0xab, 0x96, 0xb6, + 0xa0, 0x57, 0x52, 0xa5, 0xb4, 0xa3, 0xa7, 0x76, + 0x85, 0xa0, 0xa7, 0xa1, 0xa5, 0xa4, 0xa2, 0xa9, + 0x9f, 0xa5, 0xa7, 0xa9, 0xa7, 0x96, 0x90, 0x9f, + 0x9c, 0x99, 0x99, 0x9e, 0xa6, 0xa9, 0xa7, 0xa3, + 0xa6, 0xaa, 0xaa, 0xa6, 0xa7, 0xac, 0xae, 0xab, + 0xb7, 0xa7, 0x99, 0x96, 0x99, 0xa0, 0xaa, 0xb5, + 0xaa, 0xbb, 0xb7, 0xae, 0xb3, 0xb2, 0xb0, 0xba, + 0x7c, 0x53, 0x6e, 0xb7, 0xc3, 0xb2, 0xb2, 0xa7, + 0xbc, 0xb5, 0xba, 0xb5, 0xaa, 0xb8, 0xbd, 0xa3, + 0x53, 0x2d, 0x77, 0x96, 0x7d, 0x99, 0xa8, 0xa3, + 0xa7, 0xa6, 0xa5, 0xa5, 0xa6, 0xa9, 0xab, 0xad, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa3, 0xab, 0xae, 0xac, 0xab, 0xab, 0xa7, 0x9e, + 0x95, 0xa1, 0xac, 0xae, 0xab, 0xa9, 0xaa, 0xac, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xad, 0xa8, 0x9d, 0x9b, 0xa4, 0xaa, 0xa8, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xb6, 0xa8, 0xab, 0xa3, 0x8c, 0x9b, 0xb0, 0xa4, + 0xae, 0xa7, 0xa2, 0xa7, 0xad, 0xab, 0xaa, 0xb0, + 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xab, 0xab, 0xac, 0xac, 0xab, 0xab, 0xaa, + 0xa1, 0xa6, 0xaa, 0xaa, 0xa7, 0xa5, 0xa8, 0xab, + 0xaa, 0xa1, 0x75, 0x43, 0x44, 0x6a, 0x75, 0x60, + 0x59, 0x4c, 0x3b, 0x33, 0x39, 0x4d, 0x65, 0x76, + 0x7a, 0x68, 0x59, 0x5f, 0x73, 0x7e, 0x76, 0x69, + 0x77, 0x79, 0x75, 0x65, 0x50, 0x44, 0x46, 0x4d, + 0x4c, 0x5c, 0x71, 0x81, 0x83, 0x76, 0x62, 0x54, + 0x59, 0x54, 0x49, 0x3e, 0x39, 0x3b, 0x3f, 0x41, + 0x3c, 0x3d, 0x3d, 0x3e, 0x3e, 0x3d, 0x3c, 0x3c, + 0x55, 0x4c, 0x41, 0x38, 0x34, 0x33, 0x32, 0x31, + 0x56, 0x97, 0x87, 0x88, 0x8c, 0x5d, 0x6d, 0xa5, + 0xaf, 0xa5, 0x91, 0x94, 0xac, 0xaf, 0xaa, 0xb3, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, + 0xa5, 0xa4, 0xa3, 0xa4, 0xad, 0x9f, 0x18, 0x09, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa1, 0xac, 0xa2, 0xa7, 0xa4, 0xa5, 0xb5, 0x9f, + 0x5f, 0x5a, 0xab, 0xc3, 0xa0, 0xa5, 0x99, 0x7c, + 0x9a, 0xaf, 0xac, 0x9f, 0xa4, 0xa9, 0xa6, 0xa7, + 0xa0, 0xa6, 0xa6, 0xa7, 0xa9, 0x9c, 0x91, 0x97, + 0x99, 0x9a, 0x9c, 0xa2, 0xa7, 0xa9, 0xa7, 0xa4, + 0xa4, 0x9f, 0x9f, 0xa3, 0xa5, 0xa4, 0xa7, 0xae, + 0xa8, 0xab, 0xa7, 0x9d, 0x98, 0x9c, 0xa0, 0xa1, + 0xaf, 0xa3, 0x9f, 0x9b, 0x9a, 0xa7, 0x9f, 0x7d, + 0x59, 0x80, 0xab, 0xc2, 0xb4, 0x9d, 0x91, 0x84, + 0x6f, 0x78, 0x8e, 0xae, 0xc6, 0xb4, 0x6c, 0x22, + 0x6c, 0x9c, 0x99, 0xa0, 0x91, 0x77, 0x9c, 0xb0, + 0xaa, 0xa9, 0xa7, 0xa6, 0xa6, 0xa7, 0xa9, 0xaa, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xac, 0xaf, 0xac, 0xab, 0xad, 0xaa, 0xa2, + 0x96, 0x9d, 0xa8, 0xae, 0xad, 0xaa, 0xa9, 0xac, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa5, 0xaf, 0xb2, 0xa6, 0x9d, 0x9f, 0xa4, 0xa5, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xb2, 0xaa, 0xa1, 0x99, 0x9c, 0xaf, 0xb2, 0xa0, + 0xa1, 0xa4, 0xab, 0xb0, 0xb1, 0xaf, 0xaa, 0xa3, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, + 0xac, 0xaa, 0xa8, 0xa7, 0xa7, 0xa8, 0xaa, 0xac, + 0xb1, 0xaf, 0xad, 0xaa, 0xaa, 0xaa, 0xab, 0xac, + 0xa5, 0xa1, 0x8b, 0x67, 0x4e, 0x48, 0x45, 0x40, + 0x42, 0x4f, 0x5a, 0x58, 0x4e, 0x4b, 0x55, 0x62, + 0x6b, 0x63, 0x5d, 0x62, 0x6e, 0x75, 0x73, 0x6d, + 0x67, 0x71, 0x79, 0x75, 0x68, 0x5e, 0x5d, 0x62, + 0x72, 0x68, 0x59, 0x4c, 0x44, 0x44, 0x48, 0x4c, + 0x5e, 0x76, 0x84, 0x7f, 0x7b, 0x78, 0x64, 0x48, + 0x4e, 0x4c, 0x4a, 0x47, 0x44, 0x42, 0x41, 0x41, + 0x37, 0x31, 0x28, 0x22, 0x22, 0x28, 0x30, 0x36, + 0x6d, 0xb2, 0x94, 0x89, 0x8e, 0x73, 0x91, 0xb6, + 0xac, 0xa3, 0x90, 0x95, 0xad, 0xb1, 0xab, 0xb4, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, 0xa7, + 0xa6, 0xa5, 0xa4, 0xa5, 0xad, 0xa0, 0x19, 0x09, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0x9f, 0xa5, 0xab, 0xa4, 0xa1, 0xb4, 0x9e, 0x52, + 0x69, 0xa7, 0xbc, 0xab, 0xa8, 0x90, 0x82, 0xac, + 0xa9, 0xa9, 0xb1, 0xad, 0xa4, 0xac, 0xae, 0x9b, + 0xa1, 0xa7, 0xa5, 0xa5, 0xab, 0xa1, 0x91, 0x90, + 0x9a, 0x9b, 0x9f, 0xa2, 0xa6, 0xa8, 0xa8, 0xa7, + 0xb2, 0xa9, 0xa6, 0xab, 0xa9, 0xa1, 0xa1, 0xa8, + 0xa2, 0xad, 0xaf, 0xa5, 0xa0, 0xa6, 0xab, 0xa9, + 0xa1, 0x9e, 0xa1, 0xab, 0xb4, 0xa9, 0x7b, 0x49, + 0x8b, 0x92, 0x7e, 0x58, 0x52, 0x68, 0x80, 0x98, + 0x97, 0x9c, 0x81, 0x5a, 0x37, 0x1e, 0x4f, 0xb1, + 0xae, 0xa6, 0x93, 0xaf, 0xa4, 0x76, 0x8b, 0xad, + 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa7, 0xa8, 0xa9, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa6, 0xac, 0xae, 0xaa, 0xaa, 0xad, 0xab, 0xa5, + 0x9e, 0x9d, 0xa1, 0xaa, 0xad, 0xaa, 0xa8, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xad, 0xa9, 0xaa, 0xae, 0xab, 0xa1, 0x9e, 0xa2, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xa5, 0x8d, 0x91, 0xb4, 0xb2, 0xa4, 0xb2, + 0xa4, 0xa6, 0xab, 0xa8, 0xa4, 0xad, 0xb2, 0xaa, + 0xad, 0xac, 0xac, 0xab, 0xab, 0xaa, 0xaa, 0xaa, + 0xad, 0xad, 0xab, 0xab, 0xab, 0xab, 0xad, 0xad, + 0xac, 0xa8, 0xa4, 0xa5, 0xaa, 0xaf, 0xb1, 0xb0, + 0xb1, 0xb5, 0xa6, 0x7d, 0x53, 0x45, 0x52, 0x63, + 0x54, 0x3c, 0x2a, 0x33, 0x4e, 0x5e, 0x56, 0x45, + 0x59, 0x65, 0x6f, 0x6e, 0x66, 0x66, 0x71, 0x7c, + 0x81, 0x84, 0x84, 0x7b, 0x6d, 0x5e, 0x55, 0x51, + 0x68, 0x64, 0x5e, 0x57, 0x50, 0x4c, 0x49, 0x48, + 0xa4, 0xab, 0x99, 0x74, 0x66, 0x70, 0x6e, 0x5b, + 0x58, 0x54, 0x4c, 0x44, 0x3d, 0x38, 0x35, 0x34, + 0x2f, 0x30, 0x2c, 0x20, 0x1a, 0x27, 0x44, 0x5d, + 0xa2, 0xa6, 0x7a, 0x92, 0xa4, 0x79, 0x84, 0xa0, + 0xa0, 0x9a, 0x96, 0xa2, 0xb3, 0xb3, 0xab, 0xac, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xa9, 0xa8, 0xa8, + 0xa7, 0xa6, 0xa4, 0xa5, 0xae, 0xa1, 0x19, 0x0a, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa7, 0xa1, 0xa1, 0xa0, 0xb4, 0x92, 0x51, 0x6a, + 0xb0, 0xac, 0x9b, 0xb1, 0xa0, 0x80, 0xa0, 0xad, + 0xa6, 0xa5, 0xae, 0xaf, 0xa4, 0xa8, 0xab, 0x9f, + 0xa2, 0xa8, 0xa4, 0xa4, 0xad, 0xa5, 0x92, 0x8a, + 0x9c, 0x9d, 0xa0, 0xa1, 0xa3, 0xa6, 0xa9, 0xac, + 0xa8, 0xa7, 0xa7, 0xa8, 0xa8, 0xa5, 0xa3, 0xa4, + 0xac, 0xa8, 0xa0, 0x98, 0x96, 0x9b, 0xa3, 0xa7, + 0xa9, 0xaa, 0xa4, 0xad, 0xb5, 0x8c, 0x55, 0x42, + 0x1e, 0x4b, 0x9d, 0xbe, 0xc0, 0xc0, 0xb5, 0xc0, + 0xd2, 0xc7, 0x77, 0x29, 0x4a, 0xa4, 0xca, 0xc0, + 0xb1, 0x8f, 0x9c, 0xae, 0xab, 0x8f, 0x7a, 0xa1, + 0xaf, 0xad, 0xab, 0xa9, 0xa8, 0xa9, 0xaa, 0xab, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xab, 0xac, 0xa9, 0xa9, 0xad, 0xac, 0xa6, + 0xa7, 0x9d, 0x9b, 0xa5, 0xad, 0xab, 0xa8, 0xa8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xb0, 0xa8, 0xa6, 0xad, 0xad, 0xa5, 0x9f, 0xa0, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xae, 0x89, 0x93, 0xb1, 0xa9, 0xa2, 0xac, 0xac, + 0xb1, 0xab, 0xaf, 0xaf, 0xa9, 0xaf, 0xb2, 0xa5, + 0xaf, 0xaf, 0xae, 0xad, 0xac, 0xac, 0xab, 0xab, + 0xab, 0xad, 0xb1, 0xb3, 0xb3, 0xb1, 0xad, 0xab, + 0xaf, 0xac, 0xaa, 0xa9, 0xaa, 0xa9, 0xa7, 0xa4, + 0xac, 0xa8, 0xae, 0xac, 0x85, 0x4d, 0x37, 0x42, + 0x51, 0x57, 0x60, 0x69, 0x6b, 0x66, 0x5d, 0x56, + 0x78, 0x82, 0x88, 0x82, 0x75, 0x6e, 0x73, 0x7c, + 0x61, 0x65, 0x6c, 0x72, 0x70, 0x63, 0x4f, 0x40, + 0x36, 0x39, 0x3c, 0x3e, 0x3e, 0x3c, 0x39, 0x36, + 0x36, 0x44, 0x4b, 0x47, 0x48, 0x4d, 0x47, 0x39, + 0x3f, 0x3d, 0x39, 0x36, 0x36, 0x38, 0x3c, 0x3e, + 0x3c, 0x41, 0x3e, 0x30, 0x20, 0x20, 0x32, 0x45, + 0x8d, 0xa4, 0x8b, 0x81, 0x82, 0x81, 0x97, 0x97, + 0xa2, 0x96, 0x98, 0xa4, 0xa9, 0xae, 0xb2, 0xb3, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xac, 0xac, 0xab, 0xaa, 0xaa, 0xa9, 0xa9, + 0xa7, 0xa6, 0xa5, 0xa6, 0xaf, 0xa1, 0x1a, 0x0b, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xaf, 0x9b, 0xa7, 0xbf, 0x87, 0x4d, 0x79, 0xb3, + 0xb0, 0x96, 0xa6, 0x9d, 0x8d, 0xa7, 0xb1, 0xa6, + 0x9e, 0xaa, 0xa6, 0xa1, 0xa5, 0xa2, 0xa1, 0xaf, + 0xa2, 0xa9, 0xa4, 0xa3, 0xad, 0xa7, 0x92, 0x87, + 0x9d, 0x9f, 0xa0, 0xa0, 0xa1, 0xa4, 0xaa, 0xae, + 0xa3, 0xaa, 0xab, 0xa5, 0xa3, 0xa6, 0xa2, 0x9a, + 0x95, 0x8e, 0x90, 0x9e, 0xa8, 0xa9, 0xa9, 0xac, + 0x9d, 0xa3, 0xbf, 0xc0, 0x88, 0x56, 0x61, 0x83, + 0x6c, 0x92, 0xc5, 0xb6, 0xaa, 0xb1, 0xac, 0xce, + 0x86, 0x2b, 0x2c, 0x8e, 0xc8, 0xc2, 0xb1, 0xa3, + 0xa2, 0x93, 0x97, 0xae, 0xb4, 0x9a, 0x81, 0x84, + 0xae, 0xad, 0xab, 0xaa, 0xaa, 0xab, 0xad, 0xaf, + 0xa8, 0xa8, 0xaa, 0xa7, 0xa7, 0xae, 0xa0, 0x82, + 0xa5, 0xaa, 0xab, 0xa7, 0xa8, 0xac, 0xab, 0xa6, + 0xae, 0x9e, 0x97, 0xa1, 0xac, 0xab, 0xa7, 0xa6, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaf, 0xae, 0xa6, 0xa5, 0xa8, 0xa6, 0x9f, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x99, 0x9a, 0xae, 0xb9, 0xad, 0xaa, 0xb0, 0xac, + 0xb5, 0xa5, 0xa6, 0xac, 0xa9, 0xaf, 0xb3, 0xa7, + 0xb1, 0xb0, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, + 0xaa, 0xaa, 0xab, 0xac, 0xac, 0xab, 0xaa, 0xaa, + 0xab, 0xad, 0xaf, 0xaf, 0xad, 0xac, 0xab, 0xac, + 0xb9, 0xaa, 0xa8, 0xb1, 0x9d, 0x6c, 0x47, 0x3f, + 0x4d, 0x5b, 0x69, 0x6c, 0x65, 0x62, 0x68, 0x71, + 0x6e, 0x6c, 0x6c, 0x72, 0x7b, 0x7f, 0x7d, 0x78, + 0x76, 0x6e, 0x67, 0x67, 0x68, 0x60, 0x4e, 0x3e, + 0x59, 0x4e, 0x3d, 0x30, 0x2e, 0x36, 0x43, 0x4c, + 0x37, 0x37, 0x3a, 0x3f, 0x3f, 0x3c, 0x3a, 0x3b, + 0x48, 0x44, 0x3f, 0x3a, 0x39, 0x3a, 0x3d, 0x40, + 0x4e, 0x45, 0x37, 0x28, 0x23, 0x2d, 0x41, 0x52, + 0x9d, 0xa0, 0x88, 0x79, 0x79, 0x89, 0xa4, 0x9e, + 0x98, 0x8f, 0x9f, 0xb1, 0xae, 0xaf, 0xb2, 0xaa, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xac, 0xab, 0xab, 0xaa, 0xa9, 0xa9, + 0xa8, 0xa7, 0xa5, 0xa6, 0xaf, 0xa2, 0x1a, 0x0b, + 0xac, 0xad, 0x9f, 0xa6, 0xa8, 0xa2, 0xa9, 0x9e, + 0xa5, 0xa5, 0xb6, 0x85, 0x52, 0x77, 0xa7, 0xb5, + 0xab, 0xa6, 0x95, 0x8b, 0x98, 0xaa, 0xab, 0xa4, + 0xa6, 0xa6, 0xa7, 0xa7, 0xa6, 0xa4, 0xa1, 0x9f, + 0xa3, 0x9b, 0xa1, 0xa1, 0xac, 0xa2, 0x7e, 0x8c, + 0x9b, 0x98, 0xa0, 0xa3, 0x9b, 0x9f, 0xa9, 0xa7, + 0xa2, 0xa3, 0xa5, 0xa6, 0xa7, 0xa6, 0xa5, 0xa4, + 0xa1, 0xa9, 0xac, 0xa7, 0xa6, 0xac, 0xb2, 0xb2, + 0xb4, 0xa1, 0x7d, 0x5b, 0x46, 0x71, 0xb8, 0xbc, + 0xbb, 0x88, 0x48, 0x7c, 0xb1, 0xb9, 0xaa, 0x44, + 0x15, 0x85, 0xc0, 0xbd, 0xb3, 0xad, 0xaf, 0xab, + 0x96, 0x74, 0x95, 0xa5, 0xab, 0xba, 0x9b, 0x87, + 0xa2, 0xb4, 0xad, 0xaa, 0xac, 0xa7, 0xaa, 0xa7, + 0xa9, 0xac, 0xa6, 0xa5, 0xa8, 0xb4, 0x90, 0x85, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xab, 0xab, 0x9a, 0x93, 0xa3, 0xa9, 0xa8, 0xb2, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x9b, 0xa7, 0xa5, 0xa5, 0xb0, 0xab, 0x9f, 0xa1, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xb0, 0xac, 0xac, 0xaf, 0xa2, 0x7c, 0x4b, 0x28, + 0x47, 0x55, 0x60, 0x5e, 0x58, 0x59, 0x62, 0x68, + 0x64, 0x67, 0x6b, 0x6c, 0x68, 0x60, 0x57, 0x51, + 0x5e, 0x5c, 0x55, 0x4a, 0x41, 0x44, 0x52, 0x5e, + 0x34, 0x3f, 0x4b, 0x4f, 0x49, 0x40, 0x3c, 0x3b, + 0x40, 0x3b, 0x36, 0x36, 0x3a, 0x3c, 0x3a, 0x37, + 0x3d, 0x3a, 0x36, 0x31, 0x2f, 0x2e, 0x2f, 0x30, + 0x39, 0x32, 0x30, 0x28, 0x31, 0x35, 0x31, 0x4e, + 0xa2, 0xac, 0x88, 0x7c, 0x85, 0x8c, 0xa4, 0xa4, + 0x8c, 0x9a, 0x9e, 0xa4, 0xb3, 0xb2, 0xaa, 0xb1, + 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xae, 0xac, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaa, 0xab, 0xad, 0xb0, 0xb8, 0xa8, 0x1c, 0x0a, + 0xa4, 0x9b, 0xae, 0xae, 0xa5, 0xa5, 0x9d, 0xa3, + 0xa6, 0xb7, 0x7f, 0x56, 0x7b, 0xae, 0xbb, 0x9f, + 0xab, 0xa1, 0x88, 0x8b, 0xa9, 0xab, 0x9f, 0xa9, + 0xa5, 0xa6, 0xa6, 0xa5, 0xa3, 0xa4, 0xa8, 0xab, + 0xad, 0xa8, 0xa5, 0xa5, 0xad, 0x9f, 0x87, 0x8f, + 0x96, 0x98, 0xa7, 0xaf, 0xa7, 0xa6, 0xaa, 0xa4, + 0xaa, 0xa9, 0xa8, 0xa7, 0xa7, 0xa8, 0xa9, 0xaa, + 0xa7, 0xaa, 0xaf, 0xb6, 0xb7, 0xaa, 0x8f, 0x77, + 0x67, 0x91, 0xaa, 0x82, 0x87, 0xaf, 0xac, 0xb6, + 0xac, 0x7d, 0x60, 0x84, 0x5c, 0x0f, 0x1a, 0x1e, + 0x92, 0xaf, 0xb1, 0xaf, 0xab, 0xa1, 0xa4, 0xa3, + 0xb0, 0x8d, 0xad, 0xbd, 0xb5, 0xaf, 0x92, 0x8c, + 0x9f, 0xb2, 0xab, 0xa9, 0xac, 0xa7, 0xab, 0xa8, + 0xa9, 0xac, 0xa6, 0xa6, 0xa9, 0xb3, 0x90, 0x86, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa8, 0xac, 0xa2, 0x96, 0x9d, 0xa9, 0xad, 0xad, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x90, 0x9d, 0xa7, 0xa8, 0xa9, 0xaf, 0xab, 0x9c, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaf, 0xb0, 0xb3, 0xb6, 0xb1, 0x9a, 0x72, 0x52, + 0x56, 0x60, 0x67, 0x66, 0x60, 0x60, 0x66, 0x6c, + 0x5f, 0x63, 0x69, 0x6f, 0x72, 0x71, 0x6f, 0x6e, + 0x5c, 0x4f, 0x46, 0x4d, 0x61, 0x73, 0x78, 0x76, + 0x65, 0x69, 0x6a, 0x65, 0x5e, 0x5c, 0x60, 0x66, + 0x6c, 0x5c, 0x47, 0x39, 0x35, 0x38, 0x3b, 0x3c, + 0x3c, 0x38, 0x31, 0x2b, 0x2a, 0x32, 0x41, 0x4c, + 0x49, 0x34, 0x30, 0x28, 0x24, 0x2c, 0x46, 0x79, + 0x99, 0xaa, 0x8d, 0x75, 0x77, 0x8b, 0xa6, 0x9d, + 0x8c, 0x99, 0x9e, 0xa5, 0xb3, 0xb2, 0xac, 0xb1, + 0xac, 0xad, 0xaf, 0xb0, 0xb0, 0xaf, 0xad, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xaa, 0xac, 0xad, 0xb0, 0xb8, 0xa7, 0x1c, 0x0a, + 0xa3, 0xa3, 0xa3, 0x9c, 0xae, 0xb6, 0xa1, 0xa9, + 0xb8, 0x7b, 0x52, 0x83, 0xb0, 0xa9, 0xa8, 0xa4, + 0xab, 0x8f, 0x80, 0x97, 0xaf, 0xa8, 0x9f, 0xa7, + 0xa4, 0xa9, 0xac, 0xaa, 0xa4, 0xa3, 0xa8, 0xad, + 0xac, 0xaf, 0xa4, 0xa9, 0xae, 0x9e, 0x97, 0x96, + 0x9b, 0x98, 0x9f, 0xa2, 0x9a, 0xa0, 0xab, 0xab, + 0xa7, 0xa6, 0xa5, 0xa5, 0xa8, 0xad, 0xb3, 0xb6, + 0xae, 0xa8, 0x97, 0x7b, 0x66, 0x6d, 0x91, 0xb4, + 0xc0, 0xb8, 0x7e, 0x65, 0x93, 0xb5, 0xb2, 0xaa, + 0xa0, 0x7f, 0x6a, 0x7b, 0x7c, 0x87, 0xb7, 0xcb, + 0xc2, 0xb3, 0xa6, 0xaf, 0xae, 0xa9, 0xb3, 0xae, + 0x71, 0x5f, 0x73, 0x74, 0x80, 0xa3, 0x9b, 0x89, + 0x9b, 0xae, 0xa8, 0xa7, 0xab, 0xa8, 0xac, 0xaa, + 0xaa, 0xac, 0xa7, 0xa8, 0xaa, 0xb1, 0x8f, 0x89, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa5, 0xab, 0xaa, 0x9d, 0x97, 0xa7, 0xb1, 0xa8, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa4, 0x9a, 0xa1, 0xab, 0xaa, 0xaf, 0xa9, 0x8f, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xa8, 0xae, 0xb2, 0xb1, 0xb2, 0xac, 0x91, 0x73, + 0x45, 0x4a, 0x53, 0x5d, 0x63, 0x69, 0x74, 0x7d, + 0x70, 0x6f, 0x6d, 0x6b, 0x67, 0x63, 0x60, 0x5e, + 0x5d, 0x5f, 0x5f, 0x5d, 0x5b, 0x5a, 0x5d, 0x60, + 0x5d, 0x63, 0x6a, 0x6c, 0x6d, 0x72, 0x7c, 0x85, + 0x71, 0x62, 0x4e, 0x43, 0x44, 0x4d, 0x56, 0x5b, + 0x2e, 0x38, 0x44, 0x46, 0x41, 0x3c, 0x3e, 0x42, + 0x29, 0x1d, 0x20, 0x25, 0x31, 0x37, 0x4e, 0x8c, + 0xa6, 0xa1, 0x79, 0x61, 0x75, 0xa2, 0xad, 0x81, + 0x8d, 0x98, 0x9f, 0xa7, 0xb2, 0xb3, 0xae, 0xb1, + 0xab, 0xad, 0xaf, 0xb0, 0xb0, 0xaf, 0xad, 0xac, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xac, 0xae, 0xb0, 0xb8, 0xa7, 0x1b, 0x09, + 0xa7, 0xa6, 0x9a, 0xa9, 0xaa, 0x9a, 0xaa, 0xb9, + 0x82, 0x55, 0x83, 0xb7, 0xaf, 0xa3, 0xa2, 0xa8, + 0xa6, 0x7e, 0x8a, 0xa8, 0xa3, 0xa3, 0xac, 0xa1, + 0xa4, 0xac, 0xb3, 0xb1, 0xa9, 0xa3, 0xa4, 0xa8, + 0xa1, 0xaa, 0x9c, 0xa6, 0xa9, 0x9e, 0xa7, 0xa0, + 0x8b, 0x90, 0xa2, 0xae, 0xac, 0xb0, 0xb7, 0xb4, + 0xad, 0xae, 0xaf, 0xac, 0xa1, 0x92, 0x83, 0x79, + 0x6c, 0x74, 0x89, 0xa5, 0xb7, 0xb8, 0xb1, 0xac, + 0xc0, 0x8f, 0x63, 0x8b, 0xb0, 0xad, 0xb1, 0xa3, + 0x9c, 0x95, 0xa5, 0xb8, 0xbd, 0xc2, 0xbe, 0xb2, + 0xb1, 0xa5, 0xa1, 0xa9, 0xa5, 0xac, 0xb5, 0x95, + 0x32, 0x43, 0x69, 0x75, 0x8c, 0xb5, 0xac, 0x90, + 0x98, 0xac, 0xa6, 0xa6, 0xab, 0xa8, 0xad, 0xab, + 0xaa, 0xac, 0xa8, 0xab, 0xab, 0xaf, 0x8e, 0x8c, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa8, 0xa7, 0xae, 0xa8, 0x99, 0xa2, 0xaf, 0xa7, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xae, 0x98, 0x9b, 0xb0, 0xb3, 0xac, 0xaa, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xa7, 0xb0, 0xb0, 0xaa, 0xac, 0xb0, 0x9f, 0x85, + 0x57, 0x52, 0x54, 0x60, 0x69, 0x6d, 0x73, 0x7b, + 0x74, 0x72, 0x6e, 0x6a, 0x65, 0x61, 0x5f, 0x5d, + 0x82, 0x80, 0x75, 0x63, 0x53, 0x54, 0x65, 0x75, + 0x69, 0x72, 0x7a, 0x78, 0x6c, 0x5f, 0x56, 0x53, + 0x4d, 0x51, 0x58, 0x60, 0x62, 0x58, 0x47, 0x39, + 0x35, 0x47, 0x5b, 0x5f, 0x52, 0x3e, 0x2f, 0x2a, + 0x2d, 0x26, 0x1b, 0x1b, 0x3d, 0x51, 0x61, 0x9b, + 0x8a, 0x95, 0x86, 0x61, 0x57, 0x7f, 0x9b, 0x8a, + 0x90, 0x98, 0xa1, 0xa9, 0xb1, 0xb2, 0xb0, 0xb0, + 0xaa, 0xac, 0xae, 0xb0, 0xb0, 0xb0, 0xae, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xad, 0xae, 0xb1, 0xb8, 0xa6, 0x1a, 0x08, + 0xa7, 0xa4, 0xa5, 0xab, 0x9b, 0xa0, 0xac, 0x85, + 0x4f, 0x7f, 0xb7, 0xb1, 0xa3, 0xb1, 0xae, 0xab, + 0x96, 0x87, 0x9c, 0xaa, 0x99, 0xa1, 0xb1, 0xa2, + 0xa6, 0xaa, 0xad, 0xac, 0xa7, 0xa5, 0xa9, 0xae, + 0xa6, 0xb2, 0xab, 0xb4, 0xad, 0x9f, 0xa5, 0x95, + 0x8c, 0x8c, 0x97, 0x99, 0x8a, 0x82, 0x7f, 0x75, + 0x7a, 0x79, 0x78, 0x7c, 0x86, 0x95, 0xa4, 0xae, + 0xb0, 0xb8, 0xbe, 0xb9, 0xac, 0xa2, 0xa3, 0xa8, + 0xa7, 0x73, 0x87, 0xa4, 0xa7, 0xa7, 0x9c, 0xa5, + 0x93, 0x9a, 0xb5, 0xb9, 0xac, 0xa7, 0xa5, 0xae, + 0xab, 0xa6, 0xa9, 0xb1, 0xa8, 0xaa, 0x9c, 0x5e, + 0x7e, 0xc1, 0xcd, 0x7e, 0x5f, 0x95, 0x9d, 0x70, + 0x99, 0xac, 0xa7, 0xa7, 0xac, 0xa9, 0xae, 0xac, + 0xab, 0xac, 0xa9, 0xae, 0xac, 0xad, 0x8d, 0x8f, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xad, 0xa3, 0xac, 0xb1, 0xa2, 0x9d, 0xa7, 0xa8, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xa6, 0xa5, 0xa8, 0xb4, 0xb4, 0x9c, 0x8f, 0x9c, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xb7, 0xb5, 0xad, 0xb0, 0xb9, 0xb0, 0x9b, + 0x75, 0x65, 0x60, 0x70, 0x7d, 0x7f, 0x82, 0x8a, + 0x7c, 0x7c, 0x7a, 0x78, 0x74, 0x6f, 0x6b, 0x69, + 0x5d, 0x56, 0x54, 0x5e, 0x6d, 0x76, 0x71, 0x6a, + 0x5f, 0x6a, 0x76, 0x79, 0x72, 0x69, 0x65, 0x64, + 0x64, 0x58, 0x48, 0x40, 0x42, 0x49, 0x4e, 0x50, + 0x57, 0x5b, 0x5a, 0x51, 0x43, 0x39, 0x36, 0x38, + 0x2f, 0x23, 0x24, 0x1e, 0x30, 0x59, 0x78, 0x96, + 0x89, 0x90, 0x84, 0x5e, 0x55, 0x77, 0x90, 0x92, + 0x95, 0x99, 0xa4, 0xad, 0xb0, 0xb1, 0xb0, 0xac, + 0xa9, 0xab, 0xae, 0xb0, 0xb1, 0xb0, 0xaf, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xad, 0xae, 0xaf, 0xb1, 0xb8, 0xa6, 0x19, 0x07, + 0xa4, 0xa6, 0xa9, 0x9d, 0xa9, 0xac, 0x7d, 0x5d, + 0x8b, 0xaa, 0xab, 0xad, 0xad, 0xa8, 0xae, 0xa4, + 0x89, 0xa1, 0xa8, 0x9e, 0x9c, 0xa4, 0xa8, 0xaa, + 0xa8, 0xa5, 0xa2, 0xa1, 0xa4, 0xaa, 0xaf, 0xb3, + 0xa9, 0x9f, 0x88, 0x73, 0x60, 0x66, 0x7d, 0x7b, + 0x75, 0x78, 0x8a, 0x97, 0x98, 0xa2, 0xb0, 0xb0, + 0xbb, 0xbc, 0xbd, 0xbc, 0xb9, 0xb4, 0xaf, 0xab, + 0xb2, 0xb3, 0xac, 0xa2, 0xa2, 0xac, 0xb1, 0xaf, + 0x7f, 0x88, 0x9c, 0xa3, 0xab, 0xb5, 0xab, 0x9c, + 0x9d, 0xaa, 0xb3, 0xa6, 0xa3, 0xb2, 0xb3, 0xaf, + 0xab, 0xaa, 0xaf, 0xb9, 0xb0, 0xb1, 0xae, 0x82, + 0x89, 0x86, 0x85, 0x8f, 0xa8, 0xbc, 0xb2, 0x9a, + 0x9d, 0xb0, 0xaa, 0xa9, 0xad, 0xaa, 0xae, 0xac, + 0xac, 0xab, 0xaa, 0xb1, 0xad, 0xab, 0x8c, 0x93, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xb0, 0xa4, 0xa9, 0xb4, 0xac, 0x9e, 0x9f, 0xa7, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xaa, 0xa3, 0x89, 0x7f, 0x95, 0xa1, 0x9e, 0xa1, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xad, 0xb2, 0xb2, 0xad, 0xb2, 0xbb, 0xb8, 0xac, + 0x7e, 0x64, 0x5a, 0x6e, 0x81, 0x82, 0x83, 0x8a, + 0x71, 0x75, 0x7a, 0x7c, 0x7a, 0x75, 0x6e, 0x69, + 0x6a, 0x6d, 0x74, 0x7b, 0x7d, 0x79, 0x6f, 0x67, + 0x57, 0x5e, 0x65, 0x67, 0x68, 0x6d, 0x77, 0x80, + 0x6e, 0x69, 0x64, 0x64, 0x65, 0x63, 0x5d, 0x58, + 0x61, 0x59, 0x4c, 0x43, 0x40, 0x42, 0x46, 0x4a, + 0x3b, 0x25, 0x3b, 0x2e, 0x14, 0x42, 0x74, 0x79, + 0x7d, 0x8f, 0x84, 0x54, 0x4e, 0x6e, 0x80, 0x97, + 0x9c, 0x9d, 0xa8, 0xb0, 0xae, 0xae, 0xae, 0xa7, + 0xa8, 0xaa, 0xad, 0xaf, 0xb1, 0xb1, 0xb0, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xae, 0xaf, 0xaf, 0xb1, 0xb7, 0xa5, 0x19, 0x06, + 0xa4, 0xa1, 0xa8, 0xae, 0xa8, 0x77, 0x5d, 0x98, + 0xbd, 0xb3, 0xa5, 0xab, 0xa7, 0xa8, 0xad, 0x8c, + 0x8f, 0xae, 0xaa, 0x98, 0xa0, 0xa7, 0xa5, 0xad, + 0xaa, 0xa5, 0xa2, 0xa6, 0xac, 0xad, 0xa4, 0x9b, + 0x7b, 0x83, 0x9e, 0xa3, 0xa1, 0xb5, 0xbe, 0xb9, + 0x90, 0x97, 0xad, 0xba, 0xb3, 0xb0, 0xae, 0xa4, + 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xab, 0xaa, 0xa9, + 0xab, 0xb1, 0xac, 0xa2, 0xa8, 0xb4, 0xaa, 0x93, + 0x79, 0xaa, 0xab, 0xad, 0xaf, 0xa9, 0xae, 0x95, + 0xa3, 0xae, 0xb2, 0xb2, 0xb0, 0xad, 0xad, 0xac, + 0xae, 0xae, 0xa9, 0xac, 0xaa, 0xb2, 0xb8, 0x9b, + 0x95, 0xa3, 0xa8, 0xae, 0xb4, 0xb2, 0xa5, 0x92, + 0xa2, 0xb5, 0xae, 0xac, 0xaf, 0xab, 0xae, 0xab, + 0xac, 0xab, 0xaa, 0xb3, 0xae, 0xaa, 0x8c, 0x95, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xab, 0xa8, 0xaf, 0xb2, 0xa5, 0x9c, 0xa1, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xba, 0xaf, 0x9c, 0x98, 0xaf, 0xc1, 0xb3, 0x9b, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xac, 0xad, 0xac, 0xad, 0xb1, 0xb5, 0xb3, 0xaf, + 0x94, 0x6f, 0x5a, 0x68, 0x75, 0x6d, 0x65, 0x69, + 0x55, 0x5f, 0x6e, 0x7c, 0x81, 0x7f, 0x77, 0x71, + 0x78, 0x76, 0x6b, 0x55, 0x41, 0x3e, 0x4d, 0x5d, + 0x40, 0x4a, 0x57, 0x60, 0x69, 0x75, 0x85, 0x91, + 0x8d, 0x84, 0x7a, 0x73, 0x6f, 0x6a, 0x63, 0x5c, + 0x58, 0x4e, 0x45, 0x46, 0x4e, 0x52, 0x4b, 0x43, + 0x34, 0x1e, 0x2f, 0x27, 0x1d, 0x50, 0x8b, 0xa3, + 0x9b, 0xa7, 0x84, 0x4d, 0x6c, 0x9d, 0x93, 0x97, + 0xa3, 0xa0, 0xab, 0xb3, 0xac, 0xab, 0xac, 0xa1, + 0xa8, 0xaa, 0xad, 0xaf, 0xb1, 0xb1, 0xb1, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xae, 0xaf, 0xb0, 0xb1, 0xb7, 0xa5, 0x18, 0x05, + 0xa8, 0xa6, 0xad, 0xae, 0x7a, 0x61, 0x95, 0xb7, + 0xaa, 0xa5, 0xb0, 0xa3, 0xa3, 0xb6, 0xa4, 0x8b, + 0x9e, 0xaa, 0xa8, 0x9d, 0x9e, 0xa8, 0xab, 0xa8, + 0xab, 0xa9, 0xac, 0xb5, 0xba, 0xad, 0x90, 0x78, + 0x9a, 0x99, 0xb7, 0xac, 0x9d, 0xac, 0xa5, 0x9e, + 0x8d, 0x90, 0xa0, 0xaa, 0xa3, 0xa4, 0xa8, 0xa3, + 0xaa, 0xa9, 0xa7, 0xa6, 0xa6, 0xa6, 0xa8, 0xa8, + 0x9c, 0xae, 0xb1, 0xa7, 0xab, 0xb3, 0x9e, 0x79, + 0x9d, 0x9c, 0xab, 0xac, 0xb1, 0xb2, 0x9b, 0x98, + 0xa6, 0xb7, 0xb0, 0xaa, 0xaa, 0xaa, 0xb1, 0xab, + 0xa7, 0xaf, 0xab, 0xb2, 0xb8, 0xaf, 0x83, 0x3a, + 0x8f, 0xb1, 0xac, 0x96, 0x9b, 0xae, 0xa8, 0x84, + 0xa6, 0xb8, 0xb1, 0xae, 0xb0, 0xab, 0xae, 0xab, + 0xac, 0xab, 0xab, 0xb4, 0xae, 0xa9, 0x8b, 0x96, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xac, 0xb2, 0xaa, 0xa9, 0xb4, 0xac, 0x9b, 0x9c, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0x99, 0x86, 0x7d, 0x79, 0x78, 0x8c, 0xa1, 0xa1, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb6, 0xb2, 0xb1, 0xb3, 0xb4, 0xb2, 0xaf, 0xaf, + 0x99, 0x70, 0x5a, 0x6a, 0x7a, 0x73, 0x6a, 0x6e, + 0x69, 0x74, 0x82, 0x8c, 0x8c, 0x81, 0x71, 0x67, + 0x41, 0x42, 0x48, 0x52, 0x5b, 0x59, 0x4d, 0x41, + 0x72, 0x7b, 0x83, 0x81, 0x74, 0x66, 0x5d, 0x5a, + 0x67, 0x65, 0x65, 0x68, 0x6c, 0x6b, 0x64, 0x5d, + 0x5c, 0x4e, 0x42, 0x46, 0x52, 0x56, 0x4a, 0x3b, + 0x35, 0x2f, 0x2d, 0x28, 0x3b, 0x4e, 0x5a, 0x7d, + 0x72, 0xa3, 0x8c, 0x3d, 0x4e, 0x7f, 0x7e, 0x96, + 0xa7, 0xa2, 0xae, 0xb4, 0xab, 0xaa, 0xaa, 0x9e, + 0xa7, 0xa9, 0xac, 0xaf, 0xb1, 0xb1, 0xb1, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xaf, 0xb0, 0xb0, 0xb1, 0xb7, 0xa5, 0x18, 0x05, + 0xa7, 0xb0, 0xa9, 0x7a, 0x5e, 0x8a, 0xb5, 0xa9, + 0xa9, 0xa2, 0xae, 0xa7, 0xa7, 0xaa, 0x97, 0x99, + 0xa7, 0xab, 0xab, 0xa2, 0x98, 0x99, 0xa5, 0xb2, + 0xab, 0xa7, 0xb0, 0xb5, 0x96, 0x70, 0x79, 0xa0, + 0xa8, 0xb3, 0xa2, 0x97, 0xaa, 0xae, 0xa6, 0xad, + 0x8c, 0x81, 0xad, 0xad, 0x9e, 0xaf, 0xa7, 0xa7, + 0xab, 0xa5, 0xa5, 0xab, 0xab, 0xa7, 0xa8, 0xae, + 0xa7, 0xb8, 0xa8, 0xa1, 0xb6, 0x9d, 0x7f, 0x9d, + 0xad, 0x9a, 0xa7, 0xae, 0xb0, 0xa9, 0x97, 0xa4, + 0xb3, 0xb3, 0xb1, 0xb0, 0xaf, 0xae, 0xae, 0xad, + 0xb1, 0xad, 0xa6, 0xad, 0xb4, 0xa4, 0xa1, 0xbc, + 0xc7, 0xb0, 0xa8, 0xa0, 0xa5, 0xb1, 0xa6, 0x9d, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xb2, 0xb2, 0xaa, 0xb1, 0xaf, 0xa7, 0x8a, 0xa2, + 0xb0, 0xb0, 0xaf, 0xae, 0xae, 0xad, 0xac, 0xac, + 0xaf, 0xae, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, + 0x97, 0xae, 0xb0, 0xa9, 0xb0, 0xaf, 0xa8, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0x97, 0x4d, 0x28, 0x59, 0x98, 0xa5, 0x96, 0x8e, + 0xa2, 0xab, 0xb0, 0xac, 0xaa, 0xad, 0xae, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0x95, 0x6e, 0x54, 0x5f, 0x71, 0x74, 0x76, 0x7d, + 0x77, 0x7b, 0x82, 0x85, 0x81, 0x75, 0x66, 0x5b, + 0x63, 0x5a, 0x57, 0x5f, 0x6d, 0x6f, 0x63, 0x54, + 0x65, 0x6f, 0x6f, 0x5b, 0x3f, 0x33, 0x40, 0x53, + 0x6a, 0x6f, 0x75, 0x78, 0x74, 0x6a, 0x5e, 0x56, + 0x55, 0x55, 0x54, 0x51, 0x4c, 0x45, 0x3e, 0x3a, + 0x2c, 0x37, 0x34, 0x27, 0x52, 0x64, 0x49, 0x66, + 0x80, 0x9c, 0x74, 0x4f, 0x68, 0x79, 0x82, 0xa4, + 0xa5, 0x9c, 0xa5, 0xb3, 0xb0, 0xa9, 0xa8, 0xa5, + 0xa2, 0xa9, 0xb1, 0xb4, 0xb3, 0xb0, 0xaf, 0xaf, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xaf, 0xae, 0xae, 0xb3, 0xbc, 0xaa, 0x19, 0x02, + 0xab, 0xac, 0x7b, 0x61, 0x96, 0xbf, 0xb0, 0x9e, + 0xa5, 0xaa, 0xaa, 0xa6, 0xac, 0xa4, 0x94, 0xa0, + 0xa7, 0xab, 0xad, 0xa9, 0xa1, 0x9d, 0xa1, 0xa6, + 0xac, 0xa7, 0x8d, 0x6f, 0x76, 0x9e, 0xb9, 0xba, + 0xb3, 0xab, 0x9f, 0x9d, 0x9f, 0xa0, 0xaa, 0xbc, + 0x96, 0x7c, 0x9f, 0xac, 0xab, 0xb8, 0xab, 0xaa, + 0xab, 0xad, 0xad, 0xaa, 0xa5, 0xa3, 0xa9, 0xb1, + 0xaa, 0xa9, 0xad, 0xad, 0xab, 0x92, 0x89, 0xba, + 0xab, 0x9d, 0xaa, 0xb0, 0xae, 0xa7, 0x99, 0xa7, + 0xb0, 0xac, 0xa8, 0xa5, 0xa5, 0xa9, 0xaf, 0xb3, + 0xb2, 0xae, 0xae, 0xb5, 0xb3, 0xa3, 0xa2, 0xb5, + 0xb9, 0xab, 0xae, 0xae, 0xb3, 0xb6, 0xa0, 0x92, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb2, 0xb2, 0xab, 0xb1, 0xaf, 0xa7, 0x8b, 0xa3, + 0xb0, 0xb0, 0xaf, 0xaf, 0xae, 0xad, 0xad, 0xac, + 0xaf, 0xae, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xaa, + 0x9a, 0xab, 0xb0, 0xac, 0xad, 0xaf, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xba, 0xc2, 0xcb, 0xcb, 0xbf, 0xad, 0xa0, 0x9a, + 0xa3, 0xac, 0xb0, 0xac, 0xaa, 0xad, 0xae, 0xab, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xaf, 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xa6, 0x82, 0x67, 0x6b, 0x74, 0x70, 0x6d, 0x70, + 0x6a, 0x75, 0x7e, 0x79, 0x6a, 0x5f, 0x60, 0x66, + 0x63, 0x63, 0x66, 0x6a, 0x6d, 0x68, 0x5e, 0x56, + 0x69, 0x65, 0x5e, 0x57, 0x55, 0x5c, 0x69, 0x72, + 0x6d, 0x70, 0x73, 0x73, 0x6e, 0x63, 0x58, 0x51, + 0x5b, 0x5b, 0x5b, 0x59, 0x54, 0x4e, 0x48, 0x45, + 0x26, 0x29, 0x31, 0x38, 0x65, 0x7b, 0x62, 0x6e, + 0x9e, 0xa9, 0x86, 0x61, 0x5c, 0x7d, 0xa4, 0x99, + 0xa1, 0xa2, 0xae, 0xb3, 0xa7, 0xa1, 0xa8, 0xaa, + 0xa3, 0xa9, 0xb1, 0xb4, 0xb3, 0xb0, 0xaf, 0xb0, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb0, 0xb1, 0xb5, 0xbe, 0xac, 0x1b, 0x03, + 0xa2, 0x79, 0x6a, 0x94, 0xbc, 0xb3, 0xa5, 0xaf, + 0xa2, 0xb1, 0xa6, 0xa7, 0xaf, 0x9b, 0x95, 0xa8, + 0xa7, 0xaa, 0xae, 0xae, 0xab, 0xa5, 0x9e, 0x9a, + 0xb2, 0xa6, 0x9e, 0xa5, 0xb4, 0xb9, 0xb1, 0xa5, + 0xac, 0xa9, 0xa6, 0xa1, 0xa5, 0xb8, 0xc0, 0xb4, + 0x83, 0x65, 0x7f, 0x91, 0x94, 0x9e, 0x99, 0xa3, + 0xa4, 0xa9, 0xae, 0xae, 0xac, 0xac, 0xae, 0xb1, + 0xac, 0xb3, 0xa7, 0xb7, 0x8f, 0x7d, 0xbd, 0xb7, + 0xa6, 0xa1, 0xae, 0xb2, 0xab, 0xa2, 0x9c, 0xac, + 0xb4, 0xb1, 0xad, 0xaa, 0xab, 0xae, 0xb2, 0xb5, + 0xab, 0xa6, 0xad, 0xb2, 0xa7, 0x9f, 0xa9, 0xb6, + 0xb0, 0xaa, 0xb2, 0xb6, 0xbb, 0xb6, 0x9b, 0x91, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb2, 0xb2, 0xab, 0xb2, 0xb0, 0xa7, 0x8b, 0xa3, + 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xad, 0xad, 0xac, 0xac, 0xab, + 0xa0, 0xa6, 0xaf, 0xb0, 0xab, 0xae, 0xb0, 0xaa, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xa5, 0xb7, 0xbc, 0xb0, 0xaa, 0xaf, 0xab, 0x9e, + 0xa3, 0xac, 0xb1, 0xad, 0xab, 0xae, 0xaf, 0xac, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xad, 0x8a, 0x69, 0x60, 0x64, 0x67, 0x6e, 0x77, + 0x6c, 0x77, 0x82, 0x83, 0x7b, 0x71, 0x6c, 0x6c, + 0x6f, 0x6d, 0x68, 0x61, 0x5d, 0x62, 0x6c, 0x75, + 0x62, 0x5c, 0x58, 0x5b, 0x64, 0x6c, 0x70, 0x6f, + 0x6b, 0x6f, 0x73, 0x75, 0x70, 0x67, 0x5c, 0x55, + 0x58, 0x59, 0x59, 0x58, 0x55, 0x50, 0x4b, 0x48, + 0x4c, 0x30, 0x2a, 0x38, 0x62, 0x82, 0x75, 0x6e, + 0x52, 0x70, 0x84, 0x65, 0x52, 0x7a, 0x99, 0x96, + 0xa3, 0xa7, 0xb0, 0xad, 0xa0, 0xa1, 0xaa, 0xa8, + 0xa5, 0xaa, 0xb1, 0xb4, 0xb2, 0xb0, 0xb0, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb3, 0xb2, 0xb6, 0xc0, 0xad, 0x1c, 0x04, + 0x72, 0x75, 0xa0, 0xbc, 0xa8, 0xa1, 0xaf, 0xab, + 0xa4, 0xb1, 0xa5, 0xac, 0xaa, 0x93, 0x9e, 0xac, + 0xa9, 0xa9, 0xaa, 0xae, 0xb0, 0xac, 0xa2, 0x9a, + 0xad, 0xb0, 0xab, 0x9e, 0x9c, 0xa7, 0xaf, 0xae, + 0xb0, 0xa7, 0x99, 0x9b, 0xb3, 0xb2, 0x73, 0x29, + 0x55, 0x64, 0x9b, 0xaf, 0x9f, 0x98, 0x9f, 0xb6, + 0xb3, 0xab, 0xa6, 0xa9, 0xab, 0xac, 0xb0, 0xb6, + 0xad, 0xa8, 0xc1, 0x9d, 0x84, 0xac, 0xb0, 0xa1, + 0xa3, 0xa6, 0xb2, 0xb4, 0xa9, 0x9f, 0xa2, 0xb1, + 0xb3, 0xb4, 0xb5, 0xb6, 0xb4, 0xb2, 0xaf, 0xad, + 0xb8, 0xb0, 0xb6, 0xb4, 0xa0, 0xa0, 0xb1, 0xb6, + 0xb3, 0xad, 0xb2, 0xb2, 0xb7, 0xb1, 0x9b, 0x9d, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xac, 0xb3, 0xb0, 0xa8, 0x8c, 0xa4, + 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, + 0xa7, 0xa2, 0xad, 0xb2, 0xa9, 0xae, 0xb4, 0xaa, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xae, 0xad, 0xab, 0xac, 0xae, 0xa7, 0x9d, + 0xa4, 0xad, 0xb1, 0xad, 0xab, 0xae, 0xaf, 0xac, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xbb, 0x9e, 0x7b, 0x65, 0x5f, 0x62, 0x6b, 0x74, + 0x74, 0x7b, 0x80, 0x7e, 0x72, 0x62, 0x54, 0x4e, + 0x5f, 0x64, 0x6a, 0x6d, 0x6f, 0x72, 0x77, 0x7b, + 0x77, 0x7d, 0x84, 0x88, 0x85, 0x7c, 0x71, 0x6a, + 0x7c, 0x81, 0x85, 0x82, 0x74, 0x5e, 0x47, 0x38, + 0x4d, 0x4e, 0x4f, 0x4f, 0x4c, 0x48, 0x43, 0x40, + 0x3f, 0x39, 0x4a, 0x4f, 0x43, 0x51, 0x70, 0x85, + 0x92, 0x6f, 0x87, 0x72, 0x66, 0x8e, 0x86, 0x78, + 0xaa, 0xa9, 0xaa, 0xa4, 0x9e, 0xa8, 0xac, 0xa0, + 0xa7, 0xac, 0xb1, 0xb3, 0xb2, 0xb0, 0xb1, 0xb3, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb4, 0xb2, 0xb2, 0xb6, 0xbf, 0xac, 0x1a, 0x02, + 0x6d, 0xa0, 0xbc, 0xae, 0xa6, 0xaf, 0xaf, 0xa2, + 0xab, 0xaa, 0xa7, 0xb0, 0x9f, 0x93, 0xab, 0xaa, + 0xac, 0xa8, 0xa5, 0xa8, 0xae, 0xb0, 0xab, 0xa5, + 0x8c, 0xa1, 0xa9, 0x9d, 0x9b, 0xaa, 0xaf, 0xa7, + 0xab, 0xad, 0xa3, 0xa6, 0xb1, 0x96, 0x65, 0x50, + 0x9f, 0x98, 0xa2, 0xa9, 0xad, 0xb4, 0xae, 0xa8, + 0xb3, 0xab, 0xac, 0xb3, 0xb0, 0xa4, 0xa6, 0xb2, + 0xb5, 0xad, 0xa0, 0x7e, 0x99, 0xbd, 0xa3, 0xa3, + 0xa1, 0xab, 0xb3, 0xb4, 0xa8, 0x9e, 0xa8, 0xb4, + 0xaa, 0xac, 0xaf, 0xb1, 0xb1, 0xaf, 0xac, 0xaa, + 0xad, 0xaa, 0xb2, 0xae, 0x9e, 0xa4, 0xb4, 0xb2, + 0xb5, 0xb0, 0xb2, 0xaf, 0xb5, 0xac, 0x9b, 0xa9, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xad, 0xb3, 0xb1, 0xa9, 0x8d, 0xa5, + 0xb2, 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, + 0xab, 0xa2, 0xaa, 0xb2, 0xab, 0xae, 0xb4, 0xac, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xab, 0xab, 0xaf, 0xb3, 0xb3, 0xac, 0xa5, 0xa1, + 0xa5, 0xae, 0xb2, 0xae, 0xac, 0xaf, 0xb0, 0xad, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xab, 0x97, 0x82, 0x78, 0x79, 0x7e, 0x80, + 0x70, 0x7a, 0x80, 0x78, 0x66, 0x5b, 0x5e, 0x66, + 0x79, 0x6d, 0x60, 0x5c, 0x63, 0x73, 0x82, 0x8c, + 0x85, 0x89, 0x90, 0x95, 0x93, 0x87, 0x75, 0x68, + 0x6c, 0x69, 0x65, 0x60, 0x5c, 0x59, 0x57, 0x56, + 0x4a, 0x4b, 0x4b, 0x4a, 0x47, 0x42, 0x3d, 0x3a, + 0x31, 0x26, 0x3b, 0x56, 0x50, 0x55, 0x6d, 0x6d, + 0x94, 0x74, 0x87, 0x98, 0x86, 0x8b, 0x9a, 0x92, + 0xa8, 0xa7, 0xa8, 0xa3, 0x9e, 0xa8, 0xad, 0xa0, + 0xa9, 0xad, 0xb1, 0xb3, 0xb1, 0xb1, 0xb3, 0xb5, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb2, 0xb1, 0xb4, 0xbd, 0xaa, 0x18, 0x00, + 0xa5, 0xaf, 0xaa, 0xaa, 0xb6, 0xb1, 0xa7, 0xac, + 0xb0, 0xa6, 0xaa, 0xac, 0x97, 0x9b, 0xb2, 0xa8, + 0xae, 0xa9, 0xa4, 0xa6, 0xac, 0xb0, 0xb0, 0xae, + 0xa8, 0x98, 0x97, 0xab, 0xb7, 0xb2, 0xaf, 0xb4, + 0xaa, 0xad, 0x9d, 0xa0, 0xb2, 0x90, 0x53, 0x3b, + 0x93, 0x99, 0xa0, 0xa4, 0xa8, 0xae, 0xae, 0xac, + 0xa4, 0xa6, 0xac, 0xb1, 0xaa, 0xa4, 0xad, 0xbd, + 0xb2, 0x9e, 0x72, 0x9c, 0xb4, 0xa6, 0xbb, 0xa0, + 0xa1, 0xb0, 0xb2, 0xb4, 0xa9, 0xa0, 0xae, 0xb5, + 0xad, 0xad, 0xad, 0xae, 0xb0, 0xb3, 0xb5, 0xb7, + 0xac, 0xb1, 0xb3, 0xaa, 0xa3, 0xac, 0xb2, 0xa9, + 0xb0, 0xb1, 0xb4, 0xb3, 0xb8, 0xab, 0x98, 0xae, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xad, 0xb4, 0xb2, 0xaa, 0x8d, 0xa5, + 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, 0xb0, 0xaf, 0xaf, + 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, + 0xae, 0xa5, 0xa7, 0xaf, 0xaf, 0xaf, 0xb1, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb6, 0xb6, 0xaf, 0xa8, 0xa9, 0xad, 0xa8, 0x9e, + 0xa5, 0xae, 0xb3, 0xaf, 0xad, 0xb0, 0xb1, 0xae, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb3, 0x9c, 0x78, 0x62, 0x61, 0x67, 0x68, + 0x67, 0x6e, 0x77, 0x7c, 0x7e, 0x7e, 0x81, 0x84, + 0x76, 0x72, 0x6e, 0x6f, 0x73, 0x75, 0x73, 0x71, + 0x73, 0x6c, 0x69, 0x71, 0x7e, 0x7f, 0x71, 0x62, + 0x5e, 0x6b, 0x7d, 0x88, 0x85, 0x74, 0x5e, 0x4e, + 0x55, 0x55, 0x54, 0x51, 0x4c, 0x46, 0x3f, 0x3c, + 0x30, 0x30, 0x41, 0x5c, 0x4e, 0x44, 0x63, 0x6c, + 0x94, 0xb1, 0x65, 0x79, 0xbb, 0x9f, 0x8e, 0x86, + 0x9e, 0xa2, 0xac, 0xaa, 0x9e, 0xa1, 0xaa, 0xa8, + 0xab, 0xae, 0xb2, 0xb2, 0xb1, 0xb1, 0xb4, 0xb7, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb6, 0xb4, 0xb3, 0xb6, 0xbe, 0xab, 0x18, 0x00, + 0xb9, 0xad, 0xa9, 0xaa, 0xaa, 0xae, 0xaf, 0xa9, + 0xb1, 0xa9, 0xad, 0x9f, 0x95, 0xa8, 0xb1, 0xa9, + 0xaf, 0xac, 0xa9, 0xa9, 0xab, 0xae, 0xaf, 0xaf, + 0xaf, 0x9f, 0x93, 0x9a, 0xa7, 0xaf, 0xb3, 0xb5, + 0xa6, 0xa7, 0x9f, 0xa3, 0xb4, 0xb1, 0x9f, 0x98, + 0xb1, 0xa4, 0x94, 0x98, 0xa3, 0xa8, 0xae, 0xb0, + 0xab, 0xad, 0xa7, 0x9d, 0x9f, 0xae, 0xb6, 0xb4, + 0x98, 0x7a, 0x9f, 0xc0, 0xba, 0xb9, 0xab, 0x96, + 0xa3, 0xb2, 0xaf, 0xb2, 0xaa, 0xa3, 0xb3, 0xb4, + 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, + 0xc1, 0xc6, 0xb6, 0xa0, 0xa3, 0xb1, 0xb3, 0xad, + 0xae, 0xb1, 0xb5, 0xb5, 0xba, 0xa9, 0x96, 0xb2, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xae, 0xb5, 0xb2, 0xaa, 0x8e, 0xa6, + 0xb4, 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, 0xb0, 0xb0, + 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2, + 0xaf, 0xa9, 0xa4, 0xab, 0xb4, 0xb1, 0xad, 0xb4, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xa4, 0xb0, 0xb5, 0xad, 0xa9, 0xad, 0xae, 0xa9, + 0xa6, 0xaf, 0xb3, 0xaf, 0xad, 0xb0, 0xb1, 0xae, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xbe, 0xbd, 0xa3, 0x77, 0x60, 0x6c, 0x80, 0x88, + 0x82, 0x7f, 0x81, 0x8c, 0x98, 0x98, 0x8c, 0x7f, + 0x7c, 0x79, 0x73, 0x6b, 0x66, 0x68, 0x72, 0x7a, + 0x75, 0x70, 0x6e, 0x74, 0x7d, 0x7d, 0x74, 0x69, + 0x5b, 0x5a, 0x5a, 0x5b, 0x5c, 0x5e, 0x61, 0x62, + 0x60, 0x5f, 0x5d, 0x58, 0x51, 0x49, 0x41, 0x3c, + 0x4e, 0x3d, 0x31, 0x55, 0x64, 0x5a, 0x68, 0x61, + 0x71, 0xc5, 0x60, 0x23, 0x7a, 0x87, 0x75, 0x98, + 0x99, 0x9b, 0xa8, 0xaf, 0xa4, 0xa1, 0xa8, 0xab, + 0xac, 0xaf, 0xb2, 0xb2, 0xb0, 0xb1, 0xb5, 0xb9, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbc, 0xba, 0xb9, 0xbb, 0xc3, 0xaf, 0x1d, 0x05, + 0xad, 0xa9, 0xa6, 0xa7, 0xa9, 0xa9, 0xa8, 0xa5, + 0xb0, 0xae, 0xaf, 0x95, 0x96, 0xb1, 0xac, 0xaa, + 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, 0xab, 0xab, + 0xae, 0xad, 0xa8, 0x9e, 0x98, 0x99, 0xa1, 0xa8, + 0xb9, 0x98, 0x90, 0xa7, 0xb2, 0xae, 0xb4, 0xc1, + 0xba, 0xad, 0x9f, 0xad, 0xb7, 0xac, 0xac, 0xb1, + 0xa9, 0xb4, 0xb3, 0xac, 0xb8, 0xc2, 0xa1, 0x70, + 0x7f, 0xa7, 0xba, 0xad, 0xad, 0xb5, 0xaa, 0xa1, + 0xa5, 0xb4, 0xad, 0xb1, 0xac, 0xa5, 0xb6, 0xb3, + 0xb8, 0xb9, 0xbb, 0xb9, 0xb4, 0xab, 0xa1, 0x9b, + 0xa4, 0xa8, 0x8d, 0x76, 0x8c, 0xae, 0xbc, 0xc2, + 0xb1, 0xb4, 0xb4, 0xb1, 0xb7, 0xa6, 0x97, 0xb9, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb5, 0xb5, 0xae, 0xb5, 0xb3, 0xaa, 0x8e, 0xa6, + 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, 0xb1, 0xb0, 0xb0, + 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xaf, 0xad, 0xa3, 0xa8, 0xb8, 0xb2, 0xaa, 0xb6, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb6, 0xb0, 0xaa, 0xaa, 0xae, 0xaf, 0xaa, 0xa5, + 0xa6, 0xaf, 0xb4, 0xb0, 0xae, 0xb1, 0xb2, 0xaf, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xbd, 0xa8, 0x7d, 0x66, 0x73, 0x88, 0x8f, + 0x79, 0x76, 0x74, 0x74, 0x76, 0x76, 0x73, 0x70, + 0x66, 0x72, 0x7a, 0x76, 0x6a, 0x67, 0x71, 0x7e, + 0x7e, 0x89, 0x93, 0x92, 0x86, 0x77, 0x6e, 0x6b, + 0x66, 0x6d, 0x75, 0x79, 0x73, 0x65, 0x55, 0x4a, + 0x64, 0x63, 0x60, 0x5a, 0x51, 0x47, 0x3e, 0x39, + 0x32, 0x38, 0x3b, 0x6b, 0x7d, 0x69, 0x73, 0x73, + 0x7f, 0xac, 0x8a, 0x1d, 0x50, 0xb5, 0x9a, 0x98, + 0x9c, 0x94, 0x9e, 0xae, 0xad, 0xa8, 0xa8, 0xa7, + 0xad, 0xb0, 0xb2, 0xb1, 0xb0, 0xb1, 0xb5, 0xb9, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xc1, 0xbf, 0xbe, 0xc0, 0xc8, 0xb4, 0x21, 0x09, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xb9, 0x9e, 0x95, 0xaa, 0xae, 0xad, 0xad, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xae, 0xb2, 0xb3, 0xaf, 0xa6, 0x9d, 0x99, 0x98, + 0xaf, 0x9a, 0xa4, 0xb4, 0xac, 0xac, 0xb1, 0xa5, + 0xae, 0xa7, 0x9b, 0xa8, 0xb0, 0xac, 0xb1, 0xad, + 0xb6, 0xa4, 0xb1, 0xcb, 0xb1, 0x79, 0x79, 0xa6, + 0xc6, 0xac, 0xab, 0xac, 0xb7, 0xb5, 0x99, 0x99, + 0xb3, 0xaf, 0xb0, 0xa8, 0x9e, 0xac, 0xba, 0xb2, + 0xb6, 0xb2, 0xb1, 0xb5, 0xb2, 0x99, 0x6e, 0x4c, + 0x77, 0x97, 0xae, 0xae, 0xb0, 0xbb, 0xbc, 0xb1, + 0xb7, 0xb3, 0xab, 0xbf, 0xb3, 0x93, 0xa7, 0xbf, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb3, 0xb4, 0xb9, 0xb1, 0xb6, 0xaa, 0x96, 0xb9, + 0xb5, 0xb5, 0xb4, 0xb3, 0xb3, 0xb2, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xae, 0xb4, 0xa8, 0xa0, 0xae, 0xb5, 0xb0, 0xb2, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xae, 0xaf, 0xb0, 0xb1, 0xb1, 0xaf, 0xad, 0xac, + 0xb2, 0xae, 0xac, 0xaf, 0xb4, 0xb1, 0xa5, 0x9a, + 0x98, 0xa9, 0xb1, 0xaa, 0xab, 0xb6, 0xb8, 0xae, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb4, 0xb4, + 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xc0, 0xb1, 0xa1, 0x80, 0x70, 0x74, 0x6e, 0x70, + 0x77, 0x75, 0x78, 0x7d, 0x7c, 0x78, 0x7c, 0x85, + 0x77, 0x79, 0x7b, 0x7a, 0x78, 0x78, 0x7b, 0x7e, + 0x7b, 0x7a, 0x82, 0x8b, 0x83, 0x71, 0x6f, 0x7a, + 0x82, 0x79, 0x6d, 0x62, 0x5d, 0x5c, 0x5c, 0x5d, + 0x59, 0x54, 0x51, 0x51, 0x53, 0x51, 0x4b, 0x45, + 0x40, 0x43, 0x2f, 0x48, 0x77, 0x55, 0x31, 0x58, + 0x7a, 0x8e, 0x7e, 0x31, 0x3e, 0x68, 0x97, 0x8d, + 0x98, 0x9e, 0xa3, 0xac, 0xa6, 0xa0, 0xae, 0xaf, + 0xb7, 0xb2, 0xad, 0xae, 0xb3, 0xb6, 0xb4, 0xb1, + 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb6, 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb7, 0xb4, 0xb2, 0xb2, 0xb5, 0xb8, 0xba, + 0xc6, 0xc3, 0xbe, 0xb9, 0xb7, 0xb7, 0xb9, 0xba, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, + 0xb6, 0xb8, 0xbb, 0xbf, 0xc4, 0xc8, 0xcc, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xb8, 0x9e, 0x97, 0xab, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xb4, 0xaf, 0xa9, 0xaa, 0xad, 0xac, 0xa4, 0x9c, + 0x90, 0x84, 0x98, 0xb2, 0xb1, 0xb4, 0xb8, 0xab, + 0xb1, 0xa8, 0x99, 0xa5, 0xae, 0xae, 0xb8, 0xb7, + 0xbc, 0xbe, 0xa1, 0x73, 0x70, 0x99, 0xb5, 0xb2, + 0xaf, 0xb2, 0xa9, 0xaf, 0xb6, 0xa0, 0x94, 0xa2, + 0xb2, 0xae, 0xaf, 0xa8, 0xa0, 0xad, 0xb9, 0xb3, + 0xb4, 0xb1, 0xaf, 0xb1, 0xb4, 0xb2, 0xa9, 0xa2, + 0xc0, 0xc9, 0xc4, 0xb1, 0xa5, 0xaa, 0xb2, 0xb2, + 0xb5, 0xb3, 0xb1, 0xbe, 0xad, 0x95, 0xac, 0xbe, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb4, 0xb5, 0xb9, 0xb2, 0xb6, 0xa9, 0x99, 0xba, + 0xb5, 0xb5, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xaf, 0xb4, 0xa9, 0xa2, 0xae, 0xb5, 0xb1, 0xb2, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xad, 0xae, 0xb0, 0xb1, 0xb1, 0xb0, 0xae, 0xad, + 0xac, 0xab, 0xac, 0xaf, 0xb2, 0xb3, 0xb1, 0xaf, + 0x9c, 0xa7, 0xb0, 0xb2, 0xb2, 0xb4, 0xb3, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, + 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb7, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbd, 0xb4, 0xac, 0x90, 0x81, 0x83, 0x7c, 0x7e, + 0x78, 0x72, 0x73, 0x7c, 0x81, 0x7f, 0x7c, 0x7e, + 0x92, 0x86, 0x75, 0x69, 0x68, 0x70, 0x7b, 0x83, + 0x80, 0x7b, 0x7b, 0x7d, 0x75, 0x69, 0x6c, 0x78, + 0x77, 0x64, 0x50, 0x4c, 0x54, 0x5b, 0x57, 0x50, + 0x43, 0x41, 0x43, 0x47, 0x4c, 0x4a, 0x42, 0x3a, + 0x3e, 0x53, 0x46, 0x45, 0x63, 0x56, 0x37, 0x3f, + 0x88, 0x93, 0x7f, 0x5e, 0x47, 0x4a, 0x51, 0x5f, + 0x84, 0xa5, 0xb5, 0xac, 0x99, 0x9b, 0xb0, 0xae, + 0xb1, 0xae, 0xad, 0xaf, 0xb4, 0xb6, 0xb4, 0xb0, + 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb6, 0xb4, 0xb4, 0xb5, 0xb7, 0xb8, + 0xb9, 0xb7, 0xb6, 0xb5, 0xb6, 0xb9, 0xbc, 0xbe, + 0xc3, 0xc1, 0xbe, 0xbb, 0xb8, 0xb7, 0xb7, 0xb7, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, + 0xbe, 0xbf, 0xc1, 0xc4, 0xc7, 0xca, 0xcc, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcc, 0xcb, 0xcb, 0xca, 0xca, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xb5, 0x9d, 0x9a, 0xac, 0xae, 0xaf, 0xae, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xac, 0xab, 0xac, 0xae, 0xb0, + 0xad, 0x93, 0x89, 0x88, 0x81, 0x8e, 0xa4, 0xa7, + 0xa9, 0xa8, 0xa3, 0xb2, 0xb6, 0xa6, 0x9d, 0x90, + 0x6c, 0x6c, 0x80, 0xa5, 0xbf, 0xc0, 0xb7, 0xb4, + 0xa2, 0xb2, 0xad, 0xb7, 0xac, 0x91, 0xa0, 0xac, + 0xb2, 0xad, 0xac, 0xa8, 0xa4, 0xae, 0xb8, 0xb3, + 0xab, 0xb1, 0xb7, 0xb8, 0xb7, 0xb8, 0xbd, 0xc2, + 0xbb, 0xbb, 0xb8, 0xaf, 0xa9, 0xac, 0xb6, 0xbe, + 0xb3, 0xb4, 0xb9, 0xbc, 0xa4, 0x9a, 0xb4, 0xbb, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb5, 0xb6, 0xb8, 0xb4, 0xb6, 0xa8, 0x9e, 0xbb, + 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb0, 0xb4, 0xac, 0xa4, 0xac, 0xb3, 0xb2, 0xb2, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xac, 0xae, 0xb0, 0xb1, 0xb1, 0xb0, 0xae, 0xad, + 0xb5, 0xb5, 0xb4, 0xb1, 0xae, 0xad, 0xb0, 0xb3, + 0x98, 0x9e, 0xaa, 0xb4, 0xb5, 0xb1, 0xaf, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbc, 0xb5, 0xad, 0x91, 0x81, 0x86, 0x85, 0x8c, + 0x84, 0x89, 0x8f, 0x8e, 0x80, 0x72, 0x74, 0x7e, + 0x86, 0x78, 0x6a, 0x67, 0x71, 0x7e, 0x86, 0x89, + 0x7d, 0x80, 0x87, 0x8d, 0x86, 0x76, 0x6f, 0x70, + 0x6a, 0x64, 0x61, 0x65, 0x69, 0x61, 0x4d, 0x3b, + 0x39, 0x46, 0x4d, 0x44, 0x36, 0x36, 0x4b, 0x61, + 0x4c, 0x44, 0x39, 0x43, 0x51, 0x46, 0x46, 0x60, + 0x80, 0xa6, 0x86, 0x68, 0x57, 0x84, 0x76, 0x6b, + 0x8d, 0xc6, 0xae, 0x9e, 0x9f, 0x9d, 0xb5, 0xac, + 0xa9, 0xa9, 0xac, 0xb1, 0xb6, 0xb7, 0xb3, 0xb0, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb9, 0xb7, 0xb6, 0xb5, 0xb5, 0xb6, 0xb8, 0xb9, + 0xba, 0xb9, 0xb9, 0xba, 0xbc, 0xbf, 0xc2, 0xc4, + 0xc0, 0xc0, 0xc0, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4, + 0xb6, 0xb7, 0xb8, 0xba, 0xbc, 0xbe, 0xbf, 0xc0, + 0xc5, 0xc6, 0xc7, 0xc8, 0xca, 0xcb, 0xcd, 0xcd, + 0xce, 0xcd, 0xcc, 0xcc, 0xcb, 0xca, 0xc9, 0xc9, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xb1, 0x9d, 0x9f, 0xae, 0xae, 0xb1, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xab, 0xae, 0xaf, 0xac, 0xa7, 0xa9, 0xb0, 0xb8, + 0xa6, 0xa3, 0xaf, 0xb7, 0xab, 0xa0, 0x95, 0x84, + 0x8d, 0x82, 0x70, 0x7a, 0x86, 0x8b, 0x9c, 0xa0, + 0xb9, 0xc2, 0xc0, 0xb4, 0xb3, 0xba, 0xb3, 0xa1, + 0xad, 0xab, 0xb3, 0xb6, 0x99, 0x9a, 0xb8, 0xae, + 0xb1, 0xac, 0xa9, 0xa7, 0xa9, 0xb0, 0xb5, 0xb4, + 0xab, 0xb5, 0xbf, 0xc0, 0xb8, 0xb2, 0xb1, 0xb3, + 0xb2, 0xb0, 0xb3, 0xb8, 0xb4, 0xad, 0xb0, 0xb8, + 0xb1, 0xb5, 0xbe, 0xb7, 0x9d, 0xa2, 0xba, 0xb9, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb7, 0xb7, 0xb6, 0xb7, 0xb6, 0xa7, 0xa5, 0xbd, + 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb1, 0xb4, 0xaf, 0xa7, 0xaa, 0xb1, 0xb3, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xab, 0xad, 0xaf, 0xb1, 0xb1, 0xb1, 0xaf, 0xae, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb2, 0xb3, 0xb3, + 0x91, 0x9b, 0xa9, 0xb2, 0xb4, 0xb3, 0xb2, 0xb1, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, + 0xb5, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xc0, 0xaf, 0x97, 0x6b, 0x51, 0x56, 0x5a, 0x67, + 0x73, 0x6b, 0x69, 0x71, 0x77, 0x76, 0x74, 0x75, + 0x88, 0x7a, 0x6c, 0x6c, 0x77, 0x7f, 0x7d, 0x77, + 0x78, 0x7f, 0x8b, 0x93, 0x8f, 0x82, 0x75, 0x6f, + 0x79, 0x76, 0x6d, 0x5c, 0x46, 0x35, 0x2c, 0x2a, + 0x4c, 0x41, 0x35, 0x33, 0x3b, 0x44, 0x49, 0x48, + 0x3a, 0x44, 0x44, 0x38, 0x3a, 0x54, 0x67, 0x64, + 0x75, 0xa7, 0x7f, 0x4a, 0x62, 0xaf, 0x96, 0x5c, + 0x91, 0xa5, 0xbd, 0x9d, 0x94, 0xaf, 0xac, 0xb0, + 0xa3, 0xa7, 0xad, 0xb4, 0xb8, 0xb7, 0xb3, 0xb0, + 0xb5, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, + 0xb8, 0xb7, 0xb6, 0xb5, 0xb6, 0xb8, 0xba, 0xbb, + 0xbb, 0xbc, 0xbe, 0xc0, 0xc3, 0xc6, 0xc9, 0xca, + 0xc2, 0xc3, 0xc5, 0xc5, 0xc3, 0xbe, 0xb9, 0xb6, + 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xbf, + 0xc6, 0xc6, 0xc8, 0xc9, 0xcb, 0xcd, 0xce, 0xcf, + 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc8, 0xc7, 0xc7, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0x9d, 0xa4, 0xb0, 0xae, 0xb2, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xb4, 0xad, 0xa6, 0xa6, 0xab, 0xb0, 0xaf, 0xad, + 0x97, 0x9d, 0xac, 0xb7, 0xb9, 0xbc, 0xbd, 0xb6, + 0xb9, 0xb3, 0xa8, 0xb4, 0xbc, 0xb8, 0xbc, 0xb8, + 0xb0, 0xae, 0xae, 0xaf, 0xad, 0xa9, 0xaa, 0xad, + 0xb8, 0xa8, 0xb0, 0x9e, 0x8f, 0xae, 0xbd, 0xac, + 0xb0, 0xab, 0xa6, 0xa7, 0xaf, 0xb2, 0xb2, 0xb5, + 0xb3, 0xb7, 0xba, 0xb9, 0xb7, 0xb7, 0xb9, 0xbc, + 0xbc, 0xb3, 0xaf, 0xb0, 0xa9, 0x9d, 0x9d, 0xa7, + 0xb2, 0xb7, 0xbf, 0xaf, 0x9d, 0xab, 0xbb, 0xb9, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb9, 0xb9, 0xb5, 0xb9, 0xb5, 0xa6, 0xac, 0xbf, + 0xb7, 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb4, 0xb2, 0xab, 0xa8, 0xb0, 0xb5, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xaa, 0xac, 0xaf, 0xb1, 0xb2, 0xb1, 0xb0, 0xaf, + 0xb1, 0xae, 0xad, 0xb1, 0xb6, 0xb5, 0xac, 0xa4, + 0xa2, 0xb3, 0xbc, 0xb7, 0xb4, 0xb8, 0xb4, 0xaa, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, + 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xb9, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xca, 0xb6, 0x9c, 0x72, 0x60, 0x6c, 0x76, 0x86, + 0x7d, 0x6e, 0x65, 0x6e, 0x7b, 0x7e, 0x7c, 0x7a, + 0x84, 0x73, 0x62, 0x60, 0x6b, 0x76, 0x79, 0x75, + 0x78, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x78, 0x74, + 0x7a, 0x7d, 0x7b, 0x72, 0x67, 0x64, 0x6c, 0x75, + 0x60, 0x68, 0x6e, 0x67, 0x57, 0x45, 0x3b, 0x38, + 0x2e, 0x41, 0x52, 0x4d, 0x4a, 0x5f, 0x65, 0x50, + 0x71, 0x8b, 0x74, 0x4a, 0x86, 0xa8, 0x8f, 0x59, + 0x78, 0xb6, 0x9a, 0x84, 0xa3, 0xab, 0xb1, 0xb7, + 0xa2, 0xa8, 0xaf, 0xb5, 0xb7, 0xb6, 0xb4, 0xb2, + 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xb9, + 0xb8, 0xb7, 0xb6, 0xb6, 0xb7, 0xb9, 0xbb, 0xbd, + 0xbe, 0xc0, 0xc2, 0xc5, 0xc8, 0xcb, 0xcc, 0xcd, + 0xc6, 0xc8, 0xca, 0xca, 0xc7, 0xc3, 0xbe, 0xba, + 0xc0, 0xbf, 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xbb, + 0xc2, 0xc3, 0xc5, 0xc8, 0xcb, 0xce, 0xd0, 0xd1, + 0xce, 0xcd, 0xcc, 0xcb, 0xc9, 0xc7, 0xc6, 0xc5, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xa9, 0x9d, 0xa8, 0xb2, 0xaf, 0xb4, 0xb0, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xae, 0xab, 0xab, 0xab, 0xad, 0xad, 0xac, + 0x9b, 0xa3, 0xa9, 0xa9, 0xa7, 0xaa, 0xab, 0xa8, + 0xad, 0xa7, 0x9d, 0xa9, 0xb0, 0xa9, 0xab, 0xa4, + 0xa0, 0xa9, 0xae, 0xac, 0xb0, 0xb5, 0xad, 0x9e, + 0xb5, 0xad, 0xa5, 0x88, 0x94, 0xb5, 0xad, 0xac, + 0xaf, 0xaa, 0xa3, 0xa7, 0xb4, 0xb4, 0xb0, 0xb5, + 0xb1, 0xb1, 0xb1, 0xb3, 0xb7, 0xba, 0xbd, 0xbe, + 0xc0, 0xb8, 0xb7, 0xbc, 0xbb, 0xb4, 0xb5, 0xbd, + 0xb6, 0xba, 0xbb, 0xa5, 0xa3, 0xb5, 0xb7, 0xba, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xbb, 0xba, 0xb4, 0xbc, 0xb5, 0xa5, 0xb3, 0xc0, + 0xb8, 0xb8, 0xb7, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb5, 0xae, 0xa6, 0xae, 0xb6, 0xb2, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xa9, 0xab, 0xae, 0xb0, 0xb2, 0xb2, 0xb1, 0xb0, + 0xb8, 0xb3, 0xb0, 0xb3, 0xb7, 0xb3, 0xa5, 0x98, + 0x91, 0xa4, 0xae, 0xa8, 0xaa, 0xb7, 0xb9, 0xaf, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, + 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xab, 0x96, 0x73, 0x66, 0x6f, 0x6f, 0x76, + 0x7c, 0x77, 0x77, 0x7d, 0x81, 0x80, 0x83, 0x8a, + 0x82, 0x7a, 0x74, 0x78, 0x83, 0x8d, 0x8f, 0x8d, + 0x7b, 0x7d, 0x7b, 0x76, 0x79, 0x7d, 0x79, 0x6f, + 0x78, 0x76, 0x75, 0x74, 0x72, 0x6d, 0x66, 0x61, + 0x5a, 0x4e, 0x47, 0x51, 0x61, 0x61, 0x4d, 0x38, + 0x37, 0x37, 0x46, 0x58, 0x5f, 0x62, 0x64, 0x61, + 0x71, 0x87, 0x78, 0x52, 0x97, 0xa9, 0x9f, 0x84, + 0x6e, 0xc3, 0xa7, 0xa0, 0xb3, 0xa3, 0xb2, 0xb2, + 0xa7, 0xad, 0xb3, 0xb6, 0xb6, 0xb5, 0xb5, 0xb6, + 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, + 0xb8, 0xb7, 0xb6, 0xb6, 0xb8, 0xba, 0xbd, 0xbf, + 0xc1, 0xc3, 0xc6, 0xca, 0xcc, 0xcd, 0xcc, 0xcc, + 0xca, 0xca, 0xca, 0xc9, 0xc6, 0xc3, 0xc0, 0xbe, + 0xc4, 0xc3, 0xc2, 0xc0, 0xbe, 0xbc, 0xbb, 0xba, + 0xc3, 0xc4, 0xc6, 0xc9, 0xcc, 0xcf, 0xd2, 0xd3, + 0xce, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc3, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xa6, 0x9d, 0xac, 0xb3, 0xaf, 0xb5, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xa9, 0xb0, 0xb6, 0xb5, 0xaf, 0xab, 0xaf, 0xb4, + 0x8d, 0x9f, 0xac, 0xaf, 0xb0, 0xb0, 0xab, 0xa6, + 0xb1, 0xab, 0xa0, 0xad, 0xb4, 0xae, 0xb1, 0xac, + 0xb5, 0xb0, 0xaa, 0xaa, 0xb0, 0xb5, 0xb4, 0xb1, + 0xae, 0xb1, 0xa0, 0x91, 0xa1, 0xa9, 0xa4, 0xae, + 0xaf, 0xaa, 0xa0, 0xa7, 0xb8, 0xb5, 0xae, 0xb6, + 0xaf, 0xb1, 0xb4, 0xb6, 0xb6, 0xb5, 0xb4, 0xb4, + 0xb3, 0xb2, 0xb6, 0xbd, 0xbf, 0xbb, 0xb8, 0xb8, + 0xb9, 0xbd, 0xb4, 0x9c, 0xab, 0xbd, 0xb1, 0xbc, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbd, 0xbb, 0xb3, 0xbe, 0xb5, 0xa5, 0xb8, 0xc2, + 0xb9, 0xb8, 0xb8, 0xb7, 0xb6, 0xb6, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb4, 0xb8, 0xb1, 0xa5, 0xad, 0xb8, 0xb2, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xa9, 0xab, 0xae, 0xb0, 0xb2, 0xb2, 0xb2, 0xb1, + 0xaf, 0xae, 0xae, 0xb2, 0xb6, 0xb7, 0xb2, 0xad, + 0xba, 0xc2, 0xc2, 0xb8, 0xb2, 0xb5, 0xb5, 0xb0, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, + 0xb7, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xba, 0xa9, 0x99, 0x7e, 0x76, 0x7c, 0x6f, 0x6b, + 0x76, 0x6e, 0x6d, 0x74, 0x76, 0x6d, 0x62, 0x5d, + 0x70, 0x6e, 0x6b, 0x6b, 0x6c, 0x6d, 0x6d, 0x6d, + 0x84, 0x87, 0x82, 0x7a, 0x7b, 0x7e, 0x74, 0x63, + 0x64, 0x61, 0x5d, 0x58, 0x55, 0x55, 0x56, 0x57, + 0x62, 0x61, 0x5c, 0x51, 0x47, 0x44, 0x48, 0x4d, + 0x3a, 0x4a, 0x4a, 0x45, 0x59, 0x74, 0x74, 0x65, + 0x75, 0x97, 0x76, 0x50, 0x86, 0xaa, 0x94, 0x7c, + 0x80, 0x6f, 0xd4, 0xe6, 0xab, 0xad, 0xa8, 0xa8, + 0xaf, 0xb3, 0xb7, 0xb6, 0xb3, 0xb3, 0xb6, 0xba, + 0xb7, 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, + 0xb8, 0xb7, 0xb6, 0xb7, 0xb8, 0xbb, 0xbe, 0xc0, + 0xc4, 0xc6, 0xca, 0xcc, 0xcd, 0xcc, 0xcb, 0xc9, + 0xcb, 0xc9, 0xc6, 0xc3, 0xc0, 0xbf, 0xbf, 0xbf, + 0xc6, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0, + 0xca, 0xcb, 0xcc, 0xce, 0xd0, 0xd1, 0xd2, 0xd3, + 0xcf, 0xce, 0xcc, 0xca, 0xc7, 0xc5, 0xc3, 0xc2, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xa5, 0x9d, 0xae, 0xb4, 0xaf, 0xb6, 0xb1, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xaf, 0xae, 0xb0, 0xb5, 0xba, 0xba, 0xb5, 0xb0, + 0x9a, 0xab, 0xb2, 0xad, 0xae, 0xb1, 0xb0, 0xae, + 0xb3, 0xac, 0x9e, 0xaa, 0xb3, 0xb1, 0xb9, 0xb7, + 0xb4, 0xb8, 0xb7, 0xb2, 0xb0, 0xb1, 0xae, 0xa8, + 0xac, 0xb0, 0xa3, 0xab, 0xa9, 0x9a, 0xa9, 0xb0, + 0xae, 0xa9, 0x9f, 0xa7, 0xba, 0xb6, 0xad, 0xb6, + 0xb9, 0xbb, 0xbc, 0xb8, 0xb4, 0xb3, 0xb7, 0xbc, + 0xb4, 0xb4, 0xb4, 0xb5, 0xb8, 0xb9, 0xb7, 0xb5, + 0xbc, 0xbe, 0xaf, 0x97, 0xb1, 0xc2, 0xad, 0xbe, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbe, 0xbc, 0xb2, 0xbf, 0xb5, 0xa4, 0xbb, 0xc3, + 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, 0xb6, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb6, 0xb4, 0xb9, 0xb2, 0xa4, 0xac, 0xb8, 0xb2, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xa8, 0xaa, 0xad, 0xb0, 0xb2, 0xb2, 0xb2, 0xb1, + 0xb5, 0xb6, 0xb5, 0xb3, 0xb2, 0xb2, 0xb4, 0xb6, + 0xb5, 0xb4, 0xb4, 0xb2, 0xaf, 0xaf, 0xb3, 0xb9, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, 0xb8, 0xb8, + 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbb, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc4, 0xae, 0x97, 0x77, 0x69, 0x65, 0x4d, 0x3f, + 0x5d, 0x6c, 0x81, 0x8b, 0x81, 0x72, 0x72, 0x7a, + 0x71, 0x6b, 0x61, 0x58, 0x59, 0x66, 0x79, 0x87, + 0x91, 0x8b, 0x78, 0x63, 0x61, 0x6c, 0x6a, 0x5e, + 0x4b, 0x5e, 0x6f, 0x6d, 0x5a, 0x48, 0x42, 0x45, + 0x34, 0x39, 0x40, 0x43, 0x45, 0x4a, 0x54, 0x5b, + 0x52, 0x51, 0x4b, 0x59, 0x70, 0x6a, 0x59, 0x59, + 0x6f, 0x90, 0x66, 0x67, 0x95, 0xbb, 0x82, 0x6a, + 0x97, 0x65, 0x6a, 0xca, 0xd0, 0xa7, 0xbc, 0xa7, + 0xb4, 0xb7, 0xb9, 0xb6, 0xb2, 0xb1, 0xb7, 0xbc, + 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbb, + 0xb7, 0xb7, 0xb6, 0xb7, 0xb9, 0xbc, 0xbf, 0xc1, + 0xc6, 0xc8, 0xcb, 0xcd, 0xce, 0xcc, 0xc9, 0xc7, + 0xca, 0xc6, 0xc1, 0xbd, 0xba, 0xbb, 0xbc, 0xbe, + 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, + 0xcf, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc2, 0xc1, + 0xc6, 0xc7, 0xc3, 0xc9, 0xd4, 0xb4, 0x18, 0x07, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xba, 0xa3, 0xa0, 0xae, 0xb1, 0xb0, 0xb2, 0xb2, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xad, 0x97, 0x8a, 0x87, 0x87, 0x8a, 0x84, 0x75, + 0x9d, 0xa8, 0xb3, 0xb5, 0xb0, 0xad, 0xb2, 0xb9, + 0xba, 0xb3, 0x94, 0x9e, 0xb2, 0xac, 0xb2, 0xb5, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb0, 0xb0, 0xaf, 0xae, 0xac, 0xab, 0xac, 0xaf, + 0xbc, 0x9e, 0x9d, 0xb2, 0xb5, 0xb2, 0xb4, 0xb3, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xbc, 0xbd, 0xbe, 0xbe, 0xbc, 0xb9, 0xb5, 0xb2, + 0xc5, 0xb4, 0xa0, 0xa7, 0xbe, 0xbf, 0xb7, 0xbe, + 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, + 0xbf, 0xba, 0xbd, 0xb9, 0xab, 0xac, 0xba, 0xc1, + 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xbb, 0xb9, 0xb7, 0xbe, 0xa6, 0x9a, 0xb8, 0xb8, + 0xb6, 0xb5, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb4, + 0xb0, 0xa2, 0xa9, 0xb5, 0xb2, 0xb3, 0xb8, 0xb2, + 0xb1, 0xb1, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbb, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, + 0xbc, 0xbb, 0xbd, 0xc1, 0xc5, 0xc3, 0xba, 0xb2, + 0xc2, 0xb4, 0xab, 0x7c, 0x5c, 0x63, 0x59, 0x53, + 0x66, 0x6b, 0x69, 0x64, 0x6c, 0x7b, 0x7f, 0x79, + 0x78, 0x75, 0x78, 0x82, 0x8c, 0x8a, 0x7a, 0x6b, + 0x57, 0x5a, 0x5f, 0x66, 0x6a, 0x6c, 0x6a, 0x68, + 0x7a, 0x78, 0x77, 0x73, 0x65, 0x57, 0x58, 0x61, + 0x63, 0x5c, 0x51, 0x4a, 0x4a, 0x4f, 0x57, 0x5c, + 0x55, 0x46, 0x3d, 0x42, 0x70, 0x5f, 0x54, 0x5a, + 0x69, 0x7e, 0x65, 0x6e, 0x9f, 0xa5, 0x8f, 0x7b, + 0x73, 0x88, 0x94, 0x69, 0xac, 0xab, 0xa8, 0xb3, + 0xb2, 0xb2, 0xb6, 0xb9, 0xb7, 0xb4, 0xb2, 0xb0, + 0xbf, 0xaa, 0xbd, 0xc1, 0xcb, 0xc3, 0xbe, 0xb6, + 0xac, 0xbf, 0xb5, 0xc1, 0xb8, 0xbf, 0xc4, 0xbf, + 0xc5, 0xbf, 0xcc, 0xca, 0xce, 0xd4, 0xc6, 0xc9, + 0xc8, 0xcd, 0xcc, 0xc0, 0xb2, 0xb0, 0xbe, 0xcd, + 0xcd, 0xcb, 0xc8, 0xc6, 0xc4, 0xc4, 0xc5, 0xc6, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xc6, 0xcd, 0xd2, 0xce, 0xc5, 0xc1, 0xc5, 0xcc, + 0xbe, 0xc4, 0xcb, 0xce, 0xd1, 0xb7, 0x1f, 0x03, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xba, 0xa3, 0xa1, 0xaf, 0xb2, 0xb0, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb0, 0xc1, 0xc1, 0xa4, 0xa1, 0xac, 0xa4, + 0xab, 0xa7, 0xa4, 0xa8, 0xaf, 0xb4, 0xb2, 0xaf, + 0xbd, 0xbd, 0xa8, 0xa3, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xbc, 0xaf, 0xa7, 0xab, 0xb0, 0xae, 0xaa, 0xa9, + 0xb4, 0xa0, 0xa4, 0xb4, 0xb5, 0xb4, 0xb7, 0xb4, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb8, 0xb6, 0xb5, 0xb7, 0xba, 0xbe, 0xc0, + 0xbb, 0xa2, 0xa5, 0xba, 0xbb, 0xb4, 0xb9, 0xbd, + 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, + 0xbe, 0xbb, 0xbd, 0xb9, 0xab, 0xad, 0xbb, 0xc1, + 0xbb, 0xbb, 0xba, 0xba, 0xb9, 0xb8, 0xb8, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb1, 0xc0, 0xb7, 0xb8, 0xaf, 0x9d, 0xaa, 0xb5, + 0xb4, 0xb6, 0xb8, 0xb9, 0xb7, 0xb2, 0xac, 0xa8, + 0xb0, 0xa3, 0xa9, 0xb4, 0xb2, 0xb3, 0xb7, 0xb3, + 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, + 0xbe, 0xbd, 0xbd, 0xc0, 0xc3, 0xc1, 0xbb, 0xb5, + 0xb7, 0xb6, 0xb4, 0x80, 0x53, 0x5c, 0x6b, 0x7c, + 0x77, 0x6f, 0x6e, 0x76, 0x7c, 0x78, 0x74, 0x74, + 0x85, 0x74, 0x5f, 0x52, 0x50, 0x53, 0x55, 0x54, + 0x57, 0x5a, 0x60, 0x67, 0x6d, 0x72, 0x75, 0x76, + 0x77, 0x6b, 0x63, 0x63, 0x62, 0x5a, 0x55, 0x56, + 0x44, 0x49, 0x50, 0x58, 0x5b, 0x57, 0x4d, 0x45, + 0x56, 0x4e, 0x5c, 0x54, 0x61, 0x67, 0x77, 0x65, + 0x83, 0x82, 0x6b, 0x64, 0x93, 0xa1, 0x80, 0x84, + 0x78, 0x9f, 0xd0, 0x81, 0x7c, 0xae, 0x9f, 0xab, + 0xae, 0xb1, 0xba, 0xb9, 0xb1, 0xb6, 0xbd, 0xb9, + 0xb4, 0xc0, 0xd6, 0xd2, 0xdf, 0xda, 0xd9, 0xce, + 0xd0, 0xc0, 0xc4, 0xbe, 0xb3, 0xc3, 0xb0, 0xc4, + 0xc2, 0xcd, 0xc6, 0xcb, 0xc7, 0xbf, 0xcb, 0xc8, + 0xce, 0xcb, 0xc6, 0xc0, 0xbd, 0xbf, 0xc3, 0xc6, + 0xcb, 0xc9, 0xc7, 0xc6, 0xc5, 0xc6, 0xc7, 0xc8, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd4, 0xcc, 0xc4, 0xc2, 0xc5, 0xc8, 0xc6, 0xc2, + 0xc0, 0xc2, 0xbb, 0xc0, 0xd8, 0xc1, 0x1f, 0x03, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb8, 0xa4, 0xa3, 0xb2, 0xb4, 0xb1, 0xb4, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb3, 0xb4, 0xc0, 0x97, 0x4a, 0x4d, 0x97, 0xc3, + 0xb8, 0xad, 0xa3, 0xa5, 0xaf, 0xb6, 0xb4, 0xae, + 0xb5, 0xb2, 0xad, 0xa4, 0xab, 0xb2, 0xad, 0xb5, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xbc, 0xaf, 0xa6, 0xaa, 0xb1, 0xb1, 0xae, 0xae, + 0xa7, 0xa5, 0xae, 0xb6, 0xb5, 0xb8, 0xba, 0xb5, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xb8, 0xb6, 0xb5, 0xb4, 0xb6, 0xb9, 0xbc, 0xbf, + 0xa7, 0xa2, 0xb2, 0xc1, 0xb8, 0xb2, 0xb8, 0xba, + 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, + 0xbe, 0xbb, 0xbd, 0xb8, 0xac, 0xb0, 0xbd, 0xc0, + 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xba, 0xbb, 0xb3, 0xb8, 0xb3, 0xa7, 0xb2, 0xbb, + 0xb4, 0xb7, 0xba, 0xbc, 0xba, 0xb6, 0xb0, 0xac, + 0xb0, 0xa5, 0xa8, 0xb2, 0xb2, 0xb3, 0xb6, 0xb5, + 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, + 0xc1, 0xbf, 0xbd, 0xbd, 0xbf, 0xbf, 0xbd, 0xba, + 0xc5, 0xc0, 0xb9, 0x8b, 0x61, 0x62, 0x6d, 0x77, + 0x7f, 0x6d, 0x62, 0x68, 0x71, 0x72, 0x73, 0x77, + 0x78, 0x7e, 0x85, 0x88, 0x83, 0x74, 0x62, 0x55, + 0x6e, 0x6d, 0x70, 0x77, 0x7c, 0x79, 0x6e, 0x63, + 0x59, 0x50, 0x4d, 0x55, 0x5c, 0x59, 0x56, 0x56, + 0x60, 0x66, 0x6a, 0x64, 0x54, 0x45, 0x3d, 0x3b, + 0x49, 0x46, 0x5e, 0x5a, 0x64, 0x6b, 0x7c, 0x62, + 0x7a, 0x71, 0x66, 0x63, 0x95, 0x9c, 0x6a, 0x7b, + 0x96, 0x95, 0x9b, 0x81, 0x76, 0xb0, 0xe2, 0xb7, + 0xb4, 0xbc, 0xba, 0xb4, 0xb6, 0xba, 0xb6, 0xb2, + 0xb3, 0xd2, 0xc4, 0x84, 0x6e, 0x72, 0xb2, 0xe5, + 0xe7, 0xda, 0xc3, 0xcf, 0xca, 0xcb, 0xbe, 0xba, + 0xc0, 0xc7, 0xbf, 0xc9, 0xcc, 0xc7, 0xd0, 0xc9, + 0xc3, 0xc2, 0xc4, 0xc8, 0xcd, 0xcd, 0xc9, 0xc5, + 0xc9, 0xc8, 0xc6, 0xc6, 0xc6, 0xc8, 0xca, 0xcb, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xce, 0xce, 0xcb, 0xc3, 0xbb, 0xba, 0xc1, 0xc8, + 0xba, 0xa7, 0xa8, 0xc2, 0xd4, 0xb2, 0x14, 0x00, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xa4, 0xa6, 0xb5, 0xb6, 0xb2, 0xb5, 0xb8, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb9, 0xac, 0xb4, 0xb6, 0xa9, 0xb2, 0xc5, 0xc0, + 0xb8, 0xb7, 0xb6, 0xb4, 0xb2, 0xb3, 0xb5, 0xb8, + 0xba, 0xad, 0xb2, 0xab, 0xaf, 0xb7, 0xae, 0xbb, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb1, 0xb3, 0xb2, 0xae, 0xae, 0xb4, 0xb8, 0xb9, + 0x9e, 0xab, 0xb7, 0xb8, 0xb6, 0xbb, 0xbd, 0xb7, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbc, 0xbc, 0xbc, 0xb9, 0xb5, 0xb1, 0xae, + 0x9d, 0xba, 0xc0, 0xb5, 0xb8, 0xbc, 0xb7, 0xb6, + 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, + 0xbe, 0xbc, 0xbd, 0xb6, 0xac, 0xb4, 0xc0, 0xbf, + 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb5, 0xb5, 0xb1, 0xbe, 0xc2, 0xae, 0xaa, 0xbb, + 0xc1, 0xbf, 0xbd, 0xb9, 0xb7, 0xb5, 0xb3, 0xb3, + 0xb1, 0xa8, 0xa7, 0xaf, 0xb3, 0xb3, 0xb5, 0xb7, + 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc3, 0xc1, 0xbe, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, + 0xb8, 0xbd, 0xb7, 0x89, 0x52, 0x46, 0x58, 0x68, + 0x6d, 0x6b, 0x6c, 0x73, 0x7f, 0x86, 0x7f, 0x73, + 0x77, 0x7b, 0x7e, 0x7e, 0x7a, 0x76, 0x74, 0x73, + 0x6e, 0x63, 0x5a, 0x5e, 0x69, 0x6a, 0x5e, 0x50, + 0x48, 0x4b, 0x55, 0x61, 0x61, 0x58, 0x55, 0x59, + 0x56, 0x53, 0x4e, 0x49, 0x46, 0x47, 0x4c, 0x50, + 0x41, 0x3e, 0x4c, 0x57, 0x7c, 0x71, 0x6a, 0x5f, + 0x79, 0x7b, 0x64, 0x73, 0xab, 0xa3, 0x7c, 0x8d, + 0x91, 0x9a, 0x90, 0xa3, 0x90, 0x6f, 0xc8, 0xd2, + 0xa8, 0xba, 0xb7, 0xb2, 0xbe, 0xba, 0xb6, 0xc7, + 0xcb, 0xc5, 0x95, 0x71, 0x7e, 0x58, 0x38, 0x29, + 0x62, 0x96, 0xb9, 0xef, 0xeb, 0xd9, 0xd1, 0xc5, + 0xcc, 0xc3, 0xcc, 0xc5, 0xc6, 0xce, 0xc6, 0xcd, + 0xcc, 0xcb, 0xca, 0xc6, 0xc3, 0xc3, 0xc7, 0xca, + 0xc7, 0xc7, 0xc6, 0xc6, 0xc7, 0xca, 0xcc, 0xce, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xc5, 0xce, 0xd3, 0xc9, 0xb8, 0xb2, 0xbc, 0xc9, + 0xc6, 0xba, 0xad, 0xbc, 0xd8, 0xba, 0x18, 0x06, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb4, 0xa4, 0xa9, 0xb9, 0xb8, 0xb3, 0xb7, 0xba, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xba, 0xbb, 0xbb, 0xbd, 0xc0, 0xbe, 0xb8, 0xb6, + 0xb3, 0xba, 0xc1, 0xbf, 0xb7, 0xb2, 0xb5, 0xb9, + 0xba, 0xb1, 0xb6, 0xa7, 0xa7, 0xb8, 0xb2, 0xb4, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb1, 0xbc, 0xbd, 0xb1, 0xaf, 0xba, 0xbb, 0xb1, + 0x9e, 0xb2, 0xbd, 0xb9, 0xb8, 0xbd, 0xbd, 0xba, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xc0, 0xc0, 0xc0, 0xbd, 0xb9, 0xb4, 0xae, 0xab, + 0xae, 0xc6, 0xc4, 0xb3, 0xb7, 0xc0, 0xbb, 0xb5, + 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xbf, + 0xbe, 0xbd, 0xbd, 0xb4, 0xad, 0xb8, 0xc4, 0xbe, + 0xbd, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0xc3, 0xbd, 0xbc, 0xc0, 0xa6, 0xa0, 0xcf, + 0xc3, 0xc1, 0xbd, 0xb8, 0xb3, 0xb0, 0xad, 0xac, + 0xb1, 0xaa, 0xa6, 0xac, 0xb3, 0xb3, 0xb3, 0xba, + 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb9, 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc3, 0xc2, 0xc0, 0xbe, 0xbd, 0xbd, 0xbe, 0xc0, + 0xbb, 0xb9, 0xa8, 0x81, 0x55, 0x4e, 0x69, 0x78, + 0x79, 0x73, 0x6f, 0x72, 0x78, 0x78, 0x71, 0x69, + 0x76, 0x76, 0x75, 0x71, 0x6c, 0x68, 0x68, 0x69, + 0x6e, 0x6f, 0x6b, 0x5e, 0x4d, 0x43, 0x43, 0x48, + 0x42, 0x47, 0x57, 0x68, 0x6a, 0x5c, 0x50, 0x4c, + 0x61, 0x54, 0x49, 0x48, 0x50, 0x51, 0x48, 0x3d, + 0x44, 0x40, 0x50, 0x56, 0x74, 0x71, 0x74, 0x66, + 0x81, 0x91, 0x53, 0x69, 0xa6, 0x91, 0x89, 0x95, + 0x9e, 0x9b, 0x8a, 0xa0, 0xa8, 0x8a, 0x73, 0xc1, + 0xbd, 0xc2, 0xc5, 0xbf, 0xb2, 0xa8, 0xb3, 0xc9, + 0xa5, 0x82, 0x57, 0x5d, 0x98, 0x78, 0x46, 0x39, + 0x1c, 0x29, 0x35, 0x35, 0x52, 0xa7, 0xbc, 0xca, + 0xf6, 0xe3, 0xde, 0xce, 0xcc, 0xd3, 0xc8, 0xcd, + 0xca, 0xcb, 0xca, 0xc7, 0xc4, 0xc4, 0xc7, 0xcb, + 0xc8, 0xc7, 0xc7, 0xc7, 0xc8, 0xca, 0xcd, 0xcf, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xcd, 0xc9, 0xc6, 0xc7, 0xca, 0xc7, 0xbf, 0xb8, + 0xc0, 0xd7, 0xc1, 0xb9, 0xe1, 0xc8, 0x15, 0x00, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb2, 0xa5, 0xac, 0xbc, 0xba, 0xb4, 0xb8, 0xbd, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xba, 0xc1, 0xb9, 0xb5, 0xbe, 0xba, 0xb1, 0xb7, + 0xb4, 0xb7, 0xbb, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, + 0xb1, 0xb8, 0xbc, 0xa6, 0x9f, 0xb9, 0xc4, 0xbd, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb9, 0xbe, 0xba, 0xb2, 0xb6, 0xbd, 0xb1, 0x9d, + 0xa6, 0xb9, 0xbd, 0xb8, 0xba, 0xbd, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xc1, 0xbf, 0xbb, 0xb8, 0xb6, 0xb7, 0xb8, 0xba, + 0xc7, 0xbe, 0xbf, 0xbe, 0xb5, 0xb9, 0xbf, 0xb7, + 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, + 0xbe, 0xbe, 0xbd, 0xb3, 0xad, 0xbc, 0xc7, 0xbd, + 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xc0, 0xbc, 0xc5, 0xaf, 0x86, 0x74, 0x7a, 0x90, + 0xaf, 0xb2, 0xb6, 0xb8, 0xb8, 0xb4, 0xaf, 0xac, + 0xb1, 0xad, 0xa5, 0xa9, 0xb3, 0xb3, 0xb2, 0xbc, + 0xb7, 0xb8, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xba, 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xc1, 0xc0, 0xc0, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc2, 0xbf, 0xbd, 0xbe, 0xc0, + 0xb6, 0xad, 0x96, 0x81, 0x66, 0x5e, 0x71, 0x70, + 0x72, 0x6c, 0x78, 0x93, 0x96, 0x81, 0x73, 0x77, + 0x91, 0x87, 0x79, 0x6f, 0x6c, 0x70, 0x77, 0x7b, + 0x8b, 0x6e, 0x4e, 0x42, 0x4c, 0x5c, 0x63, 0x62, + 0x64, 0x5d, 0x60, 0x6f, 0x75, 0x63, 0x47, 0x33, + 0x3a, 0x3d, 0x40, 0x3e, 0x3b, 0x39, 0x3c, 0x3f, + 0x3c, 0x3b, 0x5e, 0x50, 0x46, 0x60, 0x85, 0x5f, + 0x77, 0x99, 0x4a, 0x60, 0x9d, 0x7e, 0x7b, 0x79, + 0xa8, 0x9f, 0x91, 0xa7, 0x92, 0xb9, 0x67, 0x87, + 0xc5, 0xae, 0xb5, 0xbd, 0xaf, 0xb8, 0xc5, 0xb6, + 0x8a, 0x61, 0x47, 0x4c, 0x8c, 0x85, 0x69, 0x7a, + 0x5d, 0x3d, 0x2d, 0x3d, 0x2f, 0x25, 0x26, 0x4d, + 0x74, 0xa1, 0xc8, 0xea, 0xe9, 0xd3, 0xd1, 0xc7, + 0xd6, 0xd0, 0xc9, 0xc6, 0xc8, 0xca, 0xca, 0xc8, + 0xcb, 0xca, 0xc8, 0xc8, 0xc8, 0xca, 0xcc, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xd1, 0xc8, 0xc3, 0xca, 0xd5, 0xd5, 0xc6, 0xb5, + 0xcc, 0xcc, 0xd4, 0xcf, 0xbc, 0x9f, 0x1a, 0x0e, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb0, 0xa5, 0xaf, 0xbf, 0xbc, 0xb5, 0xb9, 0xbf, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xb5, 0xbd, 0xbf, 0xbd, 0xbd, 0xb7, 0xb4, 0xb8, + 0xba, 0xb8, 0xb7, 0xb9, 0xbd, 0xbe, 0xbb, 0xb8, + 0xb9, 0xc0, 0xc0, 0xb1, 0x98, 0x9c, 0xbb, 0xc3, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb0, 0xae, 0xaf, 0xb7, 0xbc, 0xb5, 0xa6, 0x9a, + 0xb2, 0xbe, 0xbb, 0xb6, 0xbc, 0xbc, 0xb9, 0xbf, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbe, 0xbc, 0xba, 0xb9, 0xba, 0xbc, 0xc0, 0xc2, + 0xc5, 0xba, 0xbd, 0xc0, 0xb6, 0xb6, 0xbd, 0xbb, + 0xbd, 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, + 0xbe, 0xbe, 0xbd, 0xb2, 0xae, 0xbf, 0xc9, 0xbd, + 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbe, 0xc2, 0xd0, 0xb4, 0xa1, 0xb6, 0xb7, 0xad, + 0xb0, 0xb3, 0xb7, 0xba, 0xbb, 0xb8, 0xb3, 0xb0, + 0xb1, 0xae, 0xa5, 0xa7, 0xb4, 0xb2, 0xb1, 0xbe, + 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc2, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xbc, 0xc1, 0xc7, 0xc7, 0xc2, 0xbe, 0xbd, 0xbe, + 0xb2, 0xba, 0xb2, 0xa2, 0x7a, 0x63, 0x79, 0x7e, + 0x8f, 0x7c, 0x75, 0x7b, 0x72, 0x60, 0x64, 0x79, + 0x7f, 0x76, 0x6c, 0x6a, 0x6d, 0x70, 0x6d, 0x69, + 0x5e, 0x70, 0x7c, 0x70, 0x54, 0x43, 0x48, 0x55, + 0x42, 0x3a, 0x3e, 0x54, 0x64, 0x5f, 0x4c, 0x3d, + 0x39, 0x43, 0x4a, 0x45, 0x3a, 0x38, 0x43, 0x51, + 0x32, 0x36, 0x60, 0x52, 0x42, 0x5b, 0x7d, 0x50, + 0x76, 0xa1, 0x5e, 0x67, 0xa7, 0x91, 0x7d, 0x79, + 0x8e, 0x88, 0x91, 0xab, 0x9d, 0xd5, 0xaf, 0x70, + 0xae, 0xaa, 0xb0, 0xb3, 0xb6, 0xbe, 0xa9, 0x7a, + 0x75, 0x71, 0x84, 0x6b, 0x84, 0x81, 0x61, 0x75, + 0x99, 0xa5, 0x80, 0x7d, 0x69, 0x5c, 0x4d, 0x29, + 0x33, 0x2c, 0x1e, 0x43, 0x7c, 0xb0, 0xdf, 0xe7, + 0xde, 0xda, 0xd4, 0xcd, 0xc9, 0xca, 0xcd, 0xd0, + 0xce, 0xcd, 0xcb, 0xc9, 0xc8, 0xc9, 0xca, 0xcb, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcd, 0xcc, 0xcd, 0xd1, 0xd3, 0xd2, 0xcd, 0xc8, + 0xc0, 0xbd, 0xec, 0xf4, 0xb8, 0x92, 0x1e, 0x04, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xaf, 0xa5, 0xb0, 0xc0, 0xbc, 0xb5, 0xba, 0xc0, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb6, 0xb6, 0xbf, 0xc2, 0xba, 0xba, 0xbe, 0xbb, + 0xc0, 0xbe, 0xbc, 0xbb, 0xbc, 0xbf, 0xc3, 0xc5, + 0xbf, 0xb5, 0xac, 0xaa, 0x7a, 0x57, 0x7f, 0xa0, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0x9d, 0x9a, 0xa7, 0xbd, 0xbe, 0xaa, 0xa1, 0xa8, + 0xba, 0xc1, 0xb9, 0xb5, 0xbe, 0xbb, 0xb7, 0xc0, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xba, 0xbc, 0xbf, 0xc1, 0xc1, 0xc0, 0xbe, 0xbc, + 0xb2, 0xc2, 0xbf, 0xb5, 0xb8, 0xb9, 0xb7, 0xbc, + 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, + 0xbd, 0xbf, 0xbc, 0xb1, 0xae, 0xc1, 0xca, 0xbc, + 0xbf, 0xbf, 0xbe, 0xbd, 0xbd, 0xbc, 0xbb, 0xbb, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xb6, 0xd0, 0x9b, 0x58, 0x90, 0xc8, 0xb5, 0xc3, + 0xcf, 0xcb, 0xc6, 0xbf, 0xb7, 0xb2, 0xad, 0xab, + 0xb1, 0xaf, 0xa4, 0xa6, 0xb4, 0xb2, 0xb1, 0xbf, + 0xb9, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc3, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xb9, 0xc1, 0xc9, 0xca, 0xc4, 0xbe, 0xbc, 0xbc, + 0xbb, 0xbb, 0xaa, 0x9e, 0x7e, 0x6b, 0x83, 0x85, + 0x83, 0x76, 0x68, 0x5f, 0x59, 0x60, 0x78, 0x92, + 0x81, 0x77, 0x6d, 0x6d, 0x71, 0x6f, 0x64, 0x58, + 0x84, 0x7f, 0x72, 0x5f, 0x50, 0x4d, 0x57, 0x62, + 0x67, 0x60, 0x60, 0x67, 0x66, 0x5a, 0x4c, 0x47, + 0x4b, 0x45, 0x40, 0x45, 0x4d, 0x4e, 0x44, 0x39, + 0x36, 0x3c, 0x5e, 0x63, 0x6f, 0x6c, 0x6d, 0x4c, + 0x78, 0x9a, 0x5e, 0x53, 0x98, 0x9c, 0x82, 0x8d, + 0x9d, 0x95, 0xb1, 0x8c, 0xa7, 0xb9, 0xbf, 0x88, + 0x6b, 0xa7, 0xb9, 0xaf, 0xbd, 0xb5, 0x84, 0x5f, + 0x60, 0x6c, 0x91, 0x64, 0x79, 0x93, 0x74, 0x7a, + 0x79, 0x81, 0x91, 0x96, 0x86, 0x8a, 0x74, 0x7c, + 0x4d, 0x48, 0x4d, 0x3b, 0x2f, 0x33, 0x32, 0x42, + 0x9c, 0xba, 0xdf, 0xf2, 0xf0, 0xe4, 0xdd, 0xdc, + 0xd0, 0xcf, 0xcc, 0xc9, 0xc8, 0xc8, 0xc9, 0xca, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcf, 0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, + 0xc9, 0xdb, 0xd2, 0xa6, 0x94, 0x9b, 0x24, 0x09, + 0xc3, 0xb9, 0xc0, 0xb3, 0xb2, 0xbc, 0xb5, 0xc1, + 0xa9, 0xa0, 0xb8, 0xb6, 0xbf, 0xc0, 0xc0, 0xb9, + 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xb5, 0xbe, 0xa8, 0x6c, 0x5f, 0xa5, 0xcc, 0xa6, + 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb7, 0xb7, + 0x92, 0x81, 0x91, 0xba, 0xc1, 0xa7, 0xa2, 0xb8, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc0, 0xbf, 0xbd, 0xbc, 0xbc, 0xbd, 0xbf, 0xc0, + 0xbd, 0xbd, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, + 0xc5, 0xc2, 0xb9, 0xbb, 0xaf, 0xca, 0xc2, 0xc8, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbd, 0xc0, 0xc6, 0xcd, 0xcf, 0xc7, 0xb7, 0xaa, + 0x86, 0xb9, 0xcc, 0xbb, 0xb7, 0xba, 0xb7, 0xb6, + 0xbb, 0xaf, 0xa6, 0xa7, 0xa7, 0xb2, 0xb9, 0xb7, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, + 0xc1, 0xc2, 0xc3, 0xc3, 0xc1, 0xbf, 0xbc, 0xbb, + 0xbb, 0xbe, 0xc6, 0xc6, 0xc2, 0xc5, 0xbf, 0xab, + 0xb5, 0xb6, 0xb6, 0xa4, 0x85, 0x75, 0x76, 0x73, + 0x5a, 0x5f, 0x65, 0x6a, 0x6c, 0x6c, 0x6d, 0x6e, + 0x64, 0x5d, 0x65, 0x74, 0x6c, 0x56, 0x5b, 0x75, + 0x7b, 0x68, 0x5d, 0x65, 0x6a, 0x64, 0x5d, 0x5c, + 0x50, 0x69, 0x7f, 0x7c, 0x64, 0x4e, 0x4b, 0x51, + 0x47, 0x4b, 0x51, 0x59, 0x5d, 0x58, 0x4c, 0x43, + 0x3f, 0x44, 0x5d, 0x66, 0x7f, 0x76, 0x7d, 0x7b, + 0x6f, 0x85, 0x5c, 0x65, 0x94, 0x76, 0x67, 0x94, + 0xa3, 0x9d, 0xa1, 0xa2, 0x9c, 0xb1, 0xa9, 0xbd, + 0x86, 0x89, 0xc3, 0xb0, 0x8e, 0x8c, 0x65, 0x5e, + 0x88, 0x80, 0x85, 0x76, 0x67, 0x89, 0x62, 0x5b, + 0x8f, 0x7e, 0x78, 0x85, 0x72, 0x70, 0x95, 0x94, + 0x9b, 0x9a, 0x7c, 0x70, 0x5d, 0x2f, 0x52, 0x2f, + 0x1b, 0x27, 0x35, 0x5e, 0xa1, 0xba, 0xe6, 0xfa, + 0xee, 0xe0, 0xd7, 0xcb, 0xc9, 0xcd, 0xc7, 0xc8, + 0xd3, 0xce, 0xcf, 0xd6, 0xd4, 0xcb, 0xc6, 0xc9, + 0xd8, 0xd6, 0xd7, 0xd7, 0xcc, 0xcb, 0xd7, 0xd8, + 0xf4, 0xe6, 0x96, 0x63, 0x51, 0x52, 0x2f, 0x0a, + 0xbf, 0xb3, 0xbd, 0xbc, 0xbf, 0xc3, 0xb8, 0xc1, + 0xad, 0xa4, 0xbd, 0xba, 0xc2, 0xc1, 0xc0, 0xb9, + 0xbf, 0xbf, 0xbe, 0xbe, 0xbd, 0xbc, 0xbc, 0xbb, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xd0, 0xc7, 0x8a, 0x64, 0x8c, 0xb6, 0xbe, 0xc9, + 0xbc, 0xbb, 0xbb, 0xba, 0xb9, 0xb9, 0xb8, 0xb8, + 0xae, 0x9b, 0x95, 0xa1, 0xa4, 0x9c, 0xa5, 0xba, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xc0, 0xbe, 0xbd, 0xbb, 0xbb, 0xbd, 0xbe, 0xc0, + 0xbe, 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, + 0xcb, 0xc5, 0xd5, 0xb5, 0x9e, 0xcf, 0xbe, 0xcc, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc2, 0xc2, 0xc3, 0xc6, 0xc9, 0xc5, 0xbd, 0xb5, + 0x9f, 0xc0, 0xc9, 0xbd, 0xbd, 0xc0, 0xb8, 0xb3, + 0xb2, 0xb7, 0xa1, 0xb0, 0xa9, 0xb6, 0xb2, 0xb5, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, 0xc2, + 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, + 0xc3, 0xc4, 0xc4, 0xc4, 0xc2, 0xbf, 0xbc, 0xba, + 0xb6, 0xb8, 0xc0, 0xc3, 0xc3, 0xca, 0xc8, 0xb7, + 0xac, 0xb5, 0xb0, 0xb0, 0x8a, 0x64, 0x6c, 0x68, + 0x66, 0x6e, 0x75, 0x77, 0x74, 0x71, 0x71, 0x72, + 0x6f, 0x6f, 0x65, 0x5b, 0x67, 0x7f, 0x85, 0x7a, + 0x71, 0x72, 0x79, 0x82, 0x81, 0x74, 0x64, 0x5c, + 0x58, 0x64, 0x6c, 0x63, 0x52, 0x49, 0x51, 0x5d, + 0x55, 0x58, 0x5b, 0x59, 0x54, 0x4f, 0x4c, 0x4b, + 0x3c, 0x3d, 0x5b, 0x63, 0x74, 0x6d, 0x7a, 0x73, + 0x61, 0x7b, 0x58, 0x62, 0x93, 0x82, 0x7a, 0xa1, + 0x9c, 0x90, 0x96, 0xa9, 0xad, 0xbb, 0xa8, 0xb4, + 0xab, 0x77, 0xa9, 0xcd, 0x72, 0x3c, 0x60, 0x6d, + 0x7e, 0x82, 0x78, 0x7c, 0x6b, 0x89, 0x85, 0x5c, + 0x85, 0x6f, 0x71, 0x87, 0x90, 0x83, 0x7a, 0x86, + 0x79, 0x86, 0x8c, 0x98, 0xa6, 0x83, 0x81, 0x64, + 0x62, 0x3b, 0x3e, 0x2d, 0x26, 0x24, 0x3e, 0x5b, + 0xaa, 0xce, 0xdb, 0xeb, 0xe4, 0xd3, 0xdb, 0xcd, + 0xd2, 0xd8, 0xdd, 0xdb, 0xd6, 0xd0, 0xcb, 0xc7, + 0xda, 0xd2, 0xcd, 0xd3, 0xdf, 0xd0, 0xd0, 0xfd, + 0xe9, 0xab, 0x8e, 0x8f, 0x90, 0x7d, 0x1f, 0x04, + 0xc2, 0xc4, 0xc9, 0xbb, 0xbc, 0xcb, 0xc8, 0xc7, + 0xb1, 0xa7, 0xbc, 0xb6, 0xbc, 0xbe, 0xc2, 0xbf, + 0xc2, 0xc1, 0xc1, 0xc0, 0xbf, 0xbe, 0xbd, 0xbd, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xbe, 0xc4, 0xc9, 0xd2, 0xd3, 0xc2, 0xb6, 0xbb, + 0xbd, 0xbc, 0xbc, 0xbb, 0xba, 0xba, 0xb9, 0xb9, + 0xc3, 0xc2, 0xa9, 0x87, 0x87, 0xa8, 0xc0, 0xc1, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbc, 0xbb, 0xbb, 0xbc, 0xbe, 0xbf, + 0xbf, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc2, 0xc3, + 0xb4, 0xbf, 0xb3, 0xc2, 0xaf, 0xb3, 0xc9, 0xbd, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc7, 0xc3, 0xc0, 0xc0, 0xc2, 0xc4, 0xc4, 0xc3, + 0xc5, 0xce, 0xca, 0xc1, 0xc2, 0xbf, 0xb3, 0xac, + 0xb7, 0xc5, 0x98, 0xa9, 0xa0, 0xb2, 0xb1, 0xc0, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc7, 0xc5, 0xc2, 0xbf, 0xbb, 0xb9, + 0xc1, 0xbe, 0xc2, 0xc3, 0xc0, 0xc6, 0xc5, 0xb8, + 0xab, 0xb6, 0xad, 0xb6, 0x8d, 0x5a, 0x6a, 0x69, + 0x63, 0x6f, 0x7c, 0x7f, 0x79, 0x74, 0x77, 0x7c, + 0x64, 0x62, 0x64, 0x6b, 0x72, 0x74, 0x6f, 0x6a, + 0x66, 0x68, 0x64, 0x5a, 0x55, 0x58, 0x5c, 0x5d, + 0x56, 0x62, 0x70, 0x71, 0x69, 0x60, 0x5d, 0x5f, + 0x5e, 0x5f, 0x5c, 0x53, 0x48, 0x43, 0x47, 0x4d, + 0x39, 0x39, 0x5c, 0x61, 0x65, 0x63, 0x77, 0x6b, + 0x72, 0x8b, 0x67, 0x65, 0x89, 0x7d, 0x76, 0x8e, + 0x9d, 0x99, 0x98, 0x9f, 0xa2, 0xb6, 0xa5, 0xa3, + 0xc7, 0xb7, 0x81, 0xcf, 0xc0, 0x51, 0x7a, 0x98, + 0x8e, 0x84, 0x6f, 0x75, 0x5e, 0x77, 0x8d, 0x5e, + 0x88, 0x7c, 0x8c, 0x8d, 0x85, 0x77, 0x66, 0x80, + 0x96, 0x8b, 0x7e, 0x79, 0x8a, 0x7a, 0x85, 0x9f, + 0x9e, 0x7f, 0x84, 0x67, 0x4f, 0x35, 0x2e, 0x30, + 0x28, 0x21, 0x4f, 0x73, 0xab, 0xe1, 0xdf, 0xf1, + 0xeb, 0xeb, 0xe3, 0xda, 0xda, 0xde, 0xd5, 0xc4, + 0xb8, 0xc2, 0xe5, 0xe3, 0xc6, 0xd4, 0xe3, 0xcb, + 0x80, 0x7e, 0x8e, 0x5f, 0x41, 0x62, 0x25, 0x04, + 0xd8, 0xcc, 0xc9, 0xcb, 0xcd, 0xca, 0xc4, 0xc5, + 0xb4, 0xad, 0xc6, 0xbf, 0xc2, 0xbe, 0xbf, 0xba, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc6, 0xaf, 0xbb, 0xc7, 0xb8, 0xbb, 0xc7, 0xbc, + 0xbe, 0xbe, 0xbd, 0xbd, 0xbc, 0xbb, 0xbb, 0xba, + 0xbb, 0xbb, 0xc0, 0xca, 0xcb, 0xc4, 0xc0, 0xc1, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbc, 0xbb, 0xbb, 0xbc, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, 0xc4, + 0xc3, 0xc1, 0xcd, 0xc2, 0xb4, 0xc8, 0xcd, 0xd0, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc6, 0xc3, 0xc0, 0xbf, 0xc2, 0xc5, 0xc8, 0xca, + 0xc8, 0xc5, 0xc0, 0xc0, 0xc5, 0xc5, 0xc1, 0xc0, + 0xab, 0xc3, 0xa1, 0xad, 0xb2, 0xb0, 0xac, 0xb7, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, + 0xc4, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, + 0xc9, 0xc9, 0xc9, 0xc7, 0xc4, 0xc0, 0xbc, 0xb9, + 0xbc, 0xb7, 0xbb, 0xc1, 0xc2, 0xc9, 0xcd, 0xc5, + 0xc0, 0xb3, 0xa4, 0xa7, 0x90, 0x71, 0x70, 0x65, + 0x67, 0x74, 0x7f, 0x7c, 0x6e, 0x64, 0x66, 0x6c, + 0x60, 0x43, 0x44, 0x6d, 0x85, 0x6f, 0x50, 0x46, + 0x48, 0x5b, 0x6b, 0x73, 0x7e, 0x89, 0x86, 0x7b, + 0x71, 0x75, 0x79, 0x77, 0x6e, 0x63, 0x5a, 0x55, + 0x5b, 0x58, 0x51, 0x49, 0x44, 0x41, 0x43, 0x44, + 0x3b, 0x3e, 0x63, 0x62, 0x5d, 0x5c, 0x77, 0x69, + 0x77, 0x8b, 0x6b, 0x65, 0x7f, 0x7c, 0x7c, 0x87, + 0x8a, 0x93, 0x95, 0xa0, 0x9f, 0xb2, 0xab, 0xac, + 0xc7, 0xaa, 0x51, 0x96, 0xdd, 0x96, 0x71, 0x5f, + 0x6f, 0x71, 0x84, 0x87, 0x68, 0x6e, 0x7e, 0x72, + 0x84, 0x77, 0x7f, 0x76, 0x6d, 0x81, 0x8d, 0x90, + 0x77, 0x7c, 0x77, 0x76, 0x82, 0x7d, 0x78, 0x75, + 0x6d, 0x87, 0x8e, 0x94, 0xa8, 0x8c, 0x74, 0x4d, + 0x41, 0x44, 0x24, 0x34, 0x33, 0x2d, 0x68, 0x7e, + 0xbf, 0xdb, 0xf7, 0xfb, 0xf1, 0xe7, 0xe2, 0xdf, + 0xc8, 0xce, 0xd2, 0xdf, 0xd5, 0xe3, 0xe8, 0x96, + 0x90, 0x72, 0x40, 0x43, 0x7b, 0x77, 0x14, 0x0f, + 0xcc, 0xd3, 0xd6, 0xd7, 0xd2, 0xd2, 0xde, 0xe6, + 0xbb, 0xb3, 0xc9, 0xbf, 0xbe, 0xbb, 0xbf, 0xbd, + 0xbc, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xca, 0xc0, 0xb7, 0xbc, 0xc9, 0xcb, 0xc4, 0xc0, + 0xc0, 0xbf, 0xbf, 0xbe, 0xbd, 0xbd, 0xbc, 0xbc, + 0xbe, 0xb3, 0xb3, 0xbd, 0xbf, 0xb8, 0xbb, 0xc7, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xc1, 0xc0, 0xbe, 0xbd, 0xbd, 0xbe, 0xc0, 0xc1, + 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, + 0xd0, 0xdc, 0xe5, 0xb5, 0xa7, 0xc6, 0xd1, 0xda, + 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc1, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc9, 0xcb, + 0xc8, 0xc1, 0xc0, 0xc2, 0xc1, 0xc1, 0xc5, 0xc9, + 0xa8, 0xba, 0xb0, 0xa7, 0xc0, 0xa9, 0xad, 0xb1, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, 0xc4, + 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, + 0xca, 0xca, 0xca, 0xc8, 0xc6, 0xc2, 0xbe, 0xbc, + 0xbb, 0xb4, 0xb9, 0xc1, 0xc2, 0xc8, 0xcc, 0xc7, + 0xb1, 0xb7, 0xca, 0xac, 0x77, 0x5f, 0x59, 0x68, + 0x5b, 0x67, 0x72, 0x71, 0x66, 0x62, 0x68, 0x72, + 0x63, 0x69, 0x74, 0x7e, 0x80, 0x7a, 0x79, 0x7c, + 0x77, 0x75, 0x6a, 0x60, 0x65, 0x72, 0x70, 0x63, + 0x67, 0x69, 0x6b, 0x6a, 0x64, 0x5c, 0x54, 0x4e, + 0x57, 0x4e, 0x47, 0x49, 0x4f, 0x50, 0x47, 0x3e, + 0x3e, 0x4c, 0x6f, 0x64, 0x5c, 0x5b, 0x76, 0x6e, + 0x73, 0x7e, 0x63, 0x5f, 0x70, 0x72, 0x7a, 0x7d, + 0x97, 0x99, 0x92, 0xa5, 0xa7, 0xb4, 0xb3, 0xb7, + 0xb4, 0xa0, 0x5e, 0x52, 0xd0, 0xe9, 0x7a, 0x71, + 0x86, 0x7b, 0x73, 0x6c, 0x71, 0x7b, 0x7b, 0x63, + 0x5a, 0x73, 0x83, 0x89, 0x7c, 0x78, 0x7d, 0x69, + 0x63, 0x8b, 0x8f, 0x87, 0x7a, 0x87, 0x93, 0x70, + 0x6f, 0x86, 0x83, 0x78, 0x88, 0x85, 0x9b, 0x9a, + 0xa1, 0x7d, 0x7b, 0x54, 0x43, 0x44, 0x20, 0x2a, + 0x2a, 0x2b, 0x46, 0x82, 0xc4, 0xef, 0xff, 0xff, + 0xf4, 0xd4, 0xe0, 0xdf, 0xf9, 0xe2, 0x8a, 0x9f, + 0x94, 0x54, 0x69, 0x98, 0x8a, 0x75, 0x2d, 0x04, + 0xe1, 0xde, 0xdb, 0xe7, 0xdb, 0xba, 0xaf, 0xab, + 0xa2, 0xa6, 0xcc, 0xce, 0xd0, 0xc6, 0xc2, 0xbc, + 0xbf, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc2, 0xc3, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc8, 0xc3, 0xc2, 0xc5, 0xb8, 0xb4, 0xc9, + 0xc1, 0xc1, 0xc0, 0xc0, 0xbf, 0xbe, 0xbe, 0xbd, + 0xbd, 0xc6, 0xc6, 0xbd, 0xbd, 0xc6, 0xc6, 0xbc, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc4, 0xc2, 0xc0, 0xbf, 0xbf, 0xc0, 0xc2, 0xc4, + 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, + 0xc1, 0x7f, 0x40, 0x44, 0x8e, 0xaa, 0xb8, 0xc2, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc0, 0xc4, 0xc9, 0xcb, 0xc9, 0xc8, 0xc8, 0xc9, + 0xd0, 0xca, 0xca, 0xc7, 0xbb, 0xb9, 0xbf, 0xc1, + 0xb4, 0xb2, 0xba, 0x9d, 0xb8, 0xa4, 0xb0, 0xb7, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, + 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, + 0xc8, 0xc9, 0xc9, 0xc9, 0xc8, 0xc5, 0xc2, 0xc0, + 0xbf, 0xb6, 0xbb, 0xc4, 0xc3, 0xc1, 0xc2, 0xbc, + 0xb2, 0xaa, 0xc6, 0xaf, 0x93, 0x8e, 0x71, 0x71, + 0x6c, 0x71, 0x74, 0x6d, 0x62, 0x5f, 0x65, 0x6e, + 0x76, 0x71, 0x69, 0x67, 0x6f, 0x78, 0x76, 0x6e, + 0x6f, 0x6a, 0x65, 0x67, 0x72, 0x7a, 0x72, 0x65, + 0x62, 0x64, 0x66, 0x63, 0x5d, 0x55, 0x4f, 0x4c, + 0x56, 0x4d, 0x48, 0x50, 0x5d, 0x5f, 0x51, 0x42, + 0x3e, 0x5d, 0x79, 0x61, 0x5f, 0x5a, 0x71, 0x74, + 0x87, 0x83, 0x6d, 0x73, 0x7c, 0x7d, 0x8e, 0x90, + 0x82, 0x96, 0x90, 0xa0, 0xa7, 0xb6, 0xa0, 0x7b, + 0x69, 0x65, 0x7f, 0x70, 0x77, 0xcd, 0xcb, 0x62, + 0x5e, 0x81, 0x8a, 0x84, 0x82, 0x78, 0x8d, 0x78, + 0x70, 0x94, 0x89, 0x82, 0x7c, 0x69, 0x78, 0x88, + 0x8f, 0x92, 0x7e, 0x81, 0x6c, 0x7b, 0x99, 0x8f, + 0x83, 0x66, 0x7b, 0x7f, 0x8d, 0x8b, 0x86, 0x82, + 0x6d, 0x97, 0x97, 0xa5, 0xa0, 0x89, 0x80, 0x52, + 0x4b, 0x44, 0x39, 0x2a, 0x1d, 0x2a, 0x5a, 0x8b, + 0xc4, 0xf5, 0xef, 0xff, 0xc2, 0x66, 0x86, 0x8a, + 0x52, 0x67, 0x72, 0x4e, 0x57, 0x6e, 0x17, 0x04, + 0xe8, 0xdd, 0xd8, 0xe7, 0xbf, 0x85, 0xa3, 0xdb, + 0xd0, 0xcd, 0xea, 0xe1, 0xdd, 0xd5, 0xd6, 0xd4, + 0xcb, 0xcb, 0xc9, 0xc7, 0xc6, 0xc4, 0xc2, 0xc2, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc4, 0xb9, 0xba, 0xc0, 0xbc, 0xbd, 0xc6, 0xcb, + 0xc2, 0xc2, 0xc1, 0xc1, 0xc0, 0xbf, 0xbf, 0xbe, + 0xc0, 0xbc, 0xbe, 0xc6, 0xc6, 0xbc, 0xb9, 0xbd, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc6, 0xc5, 0xc3, 0xc2, 0xc2, 0xc3, 0xc5, 0xc6, + 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, + 0xc5, 0xb5, 0xb1, 0x50, 0x85, 0xc4, 0x82, 0x7d, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xc3, 0xc8, 0xcc, 0xcc, 0xc8, 0xc6, 0xc8, 0xca, + 0xca, 0xc6, 0xca, 0xc8, 0xbe, 0xc3, 0xcc, 0xc6, + 0xb6, 0xaa, 0xc0, 0xa5, 0xaf, 0xab, 0xab, 0xb6, + 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, + 0xc6, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, + 0xc6, 0xc7, 0xc8, 0xca, 0xc9, 0xc8, 0xc6, 0xc5, + 0xb4, 0xac, 0xb5, 0xc5, 0xc6, 0xc3, 0xc3, 0xbe, + 0xb0, 0xa9, 0xbd, 0xab, 0x87, 0x71, 0x58, 0x5a, + 0x6f, 0x70, 0x6d, 0x68, 0x65, 0x6a, 0x75, 0x7e, + 0x7b, 0x72, 0x6e, 0x6e, 0x64, 0x59, 0x5f, 0x6e, + 0x68, 0x68, 0x72, 0x82, 0x8c, 0x89, 0x7f, 0x79, + 0x7f, 0x7b, 0x71, 0x61, 0x52, 0x4a, 0x4d, 0x51, + 0x55, 0x4f, 0x4d, 0x54, 0x5e, 0x5f, 0x54, 0x47, + 0x3a, 0x6a, 0x7c, 0x59, 0x60, 0x57, 0x67, 0x78, + 0x65, 0x55, 0x47, 0x5c, 0x66, 0x68, 0x83, 0x8b, + 0x97, 0xa4, 0x8e, 0x99, 0xa0, 0xb2, 0xa9, 0x89, + 0x6b, 0x91, 0x86, 0x75, 0x62, 0x8a, 0xd5, 0xb9, + 0x78, 0x73, 0x7f, 0x75, 0x68, 0x56, 0x6f, 0x6a, + 0x5c, 0x70, 0x65, 0x64, 0x7d, 0x83, 0x7b, 0x7f, + 0x8e, 0x75, 0x68, 0x8d, 0x91, 0x8f, 0x77, 0x76, + 0x7e, 0x70, 0x93, 0x92, 0x86, 0x73, 0x7c, 0x92, + 0x92, 0x8a, 0x8f, 0x78, 0x79, 0x94, 0x97, 0xa5, + 0xa7, 0x87, 0x60, 0x4a, 0x45, 0x3f, 0x33, 0x28, + 0x31, 0x22, 0x72, 0x83, 0x7a, 0x87, 0x51, 0x34, + 0x66, 0x64, 0x75, 0x80, 0x8a, 0x83, 0x24, 0x03, + 0xe0, 0xef, 0xe6, 0xee, 0xf8, 0xf9, 0xf7, 0xd9, + 0x49, 0x66, 0xb3, 0xd8, 0xee, 0xe9, 0xe1, 0xd5, + 0xd6, 0xd5, 0xd2, 0xce, 0xc9, 0xc5, 0xc2, 0xc0, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xbf, 0xc4, 0xc5, 0xc0, 0xbe, 0xc2, 0xc1, 0xbc, + 0xc3, 0xc3, 0xc2, 0xc1, 0xc1, 0xc0, 0xbf, 0xbf, + 0xbc, 0xbc, 0xbd, 0xbf, 0xc0, 0xbf, 0xbf, 0xc0, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc8, 0xc7, 0xc5, 0xc4, 0xc4, 0xc5, 0xc7, 0xc8, + 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, + 0xb9, 0x86, 0x7e, 0x6d, 0xa5, 0x90, 0x73, 0xca, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xc7, 0xcb, 0xcd, 0xcb, 0xc6, 0xc4, 0xc8, 0xcd, + 0xce, 0xc9, 0xcd, 0xca, 0xc1, 0xca, 0xcf, 0xc2, + 0xc5, 0xac, 0xbb, 0x9f, 0x97, 0xae, 0xab, 0xc4, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc3, 0xc4, 0xc4, 0xc5, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, 0xca, 0xca, + 0xc4, 0xc5, 0xc8, 0xca, 0xcb, 0xca, 0xc9, 0xc8, + 0xb8, 0xaf, 0xb8, 0xc8, 0xc6, 0xbe, 0xb9, 0xb3, + 0xac, 0xa8, 0xb3, 0xb0, 0x8c, 0x6d, 0x6a, 0x74, + 0x7a, 0x75, 0x6d, 0x66, 0x65, 0x6c, 0x77, 0x7f, + 0x85, 0x72, 0x62, 0x60, 0x63, 0x64, 0x6a, 0x73, + 0x74, 0x75, 0x81, 0x8e, 0x87, 0x70, 0x5f, 0x5d, + 0x5b, 0x65, 0x6f, 0x6e, 0x64, 0x5b, 0x58, 0x5a, + 0x51, 0x4f, 0x4e, 0x51, 0x55, 0x54, 0x4f, 0x49, + 0x35, 0x70, 0x7c, 0x53, 0x60, 0x54, 0x5e, 0x79, + 0x74, 0x59, 0x49, 0x5e, 0x5e, 0x58, 0x72, 0x7a, + 0x8c, 0x89, 0x89, 0xc1, 0xbb, 0x8f, 0x72, 0x6a, + 0x73, 0x72, 0x76, 0x8b, 0x8d, 0x72, 0x98, 0xfe, + 0xa7, 0x68, 0x90, 0x8d, 0x76, 0x5c, 0x60, 0x78, + 0x68, 0x7b, 0x8f, 0x7d, 0x7f, 0x8d, 0x6f, 0x55, + 0x8d, 0x91, 0x8f, 0x84, 0x71, 0x7e, 0x6a, 0x8f, + 0xa1, 0x94, 0x78, 0x72, 0x89, 0x7c, 0x8b, 0x8e, + 0x86, 0x7e, 0x7c, 0x8e, 0x8f, 0x7e, 0x7e, 0x84, + 0x6b, 0x86, 0xa0, 0xa3, 0x97, 0x81, 0x66, 0x50, + 0x39, 0x46, 0x20, 0x48, 0x92, 0x77, 0x5f, 0x82, + 0x84, 0x8b, 0x74, 0x75, 0x6b, 0x5e, 0x32, 0x08, + 0xf1, 0xeb, 0xe4, 0xf6, 0xb8, 0x65, 0x7a, 0x96, + 0x89, 0x75, 0x7d, 0x83, 0xb4, 0xe4, 0xd8, 0xe3, + 0xe2, 0xe2, 0xe0, 0xdf, 0xdd, 0xdb, 0xda, 0xd9, + 0xdb, 0xd9, 0xd6, 0xd1, 0xcc, 0xc7, 0xc3, 0xc1, + 0xbe, 0xbf, 0xc1, 0xc3, 0xc5, 0xc7, 0xc8, 0xc9, + 0xc5, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, + 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc1, 0xc2, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc2, 0xc3, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xcb, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xc6, 0xca, 0xcc, 0xc9, 0xc3, 0xc0, 0xc2, 0xc6, + 0xc4, 0xc9, 0xcf, 0xcf, 0xcb, 0xc9, 0xcb, 0xce, + 0xc6, 0xa0, 0x74, 0xc7, 0xec, 0xb3, 0xc3, 0xdb, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcc, 0xcb, 0xc9, 0xc8, 0xc8, 0xc9, 0xcb, 0xcc, + 0xae, 0xb8, 0xb6, 0x8a, 0x9e, 0x9d, 0x95, 0xc1, + 0xc5, 0xc6, 0xc9, 0xcb, 0xcb, 0xcb, 0xca, 0xc9, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xbe, 0xc4, 0xc9, 0xca, 0xc7, 0xc6, 0xc9, 0xcd, + 0xc1, 0xa8, 0xa0, 0xcc, 0xcb, 0xca, 0xbb, 0xc7, + 0xa6, 0xa1, 0xbf, 0xbd, 0x9c, 0x7f, 0x65, 0x62, + 0x6a, 0x6b, 0x6f, 0x75, 0x7d, 0x84, 0x87, 0x88, + 0x73, 0x69, 0x5d, 0x5a, 0x64, 0x75, 0x84, 0x8d, + 0x8d, 0x8a, 0x87, 0x86, 0x84, 0x7c, 0x70, 0x66, + 0x7d, 0x74, 0x69, 0x63, 0x61, 0x62, 0x61, 0x5f, + 0x64, 0x56, 0x48, 0x46, 0x4d, 0x53, 0x51, 0x4c, + 0x48, 0x85, 0x74, 0x5d, 0x5d, 0x56, 0x6b, 0x7b, + 0x63, 0x4b, 0x5b, 0x4e, 0x5f, 0x83, 0x80, 0xa5, + 0x93, 0x84, 0xa1, 0xcf, 0xa9, 0x60, 0x5d, 0x7d, + 0x88, 0x7b, 0x87, 0x7f, 0x67, 0x5c, 0x71, 0xa8, + 0xde, 0x80, 0x65, 0x73, 0x7e, 0x7a, 0x6d, 0x7f, + 0x69, 0x79, 0x89, 0x7c, 0x66, 0x73, 0x8b, 0x8f, + 0x7b, 0x7b, 0x86, 0x71, 0x79, 0x95, 0x83, 0x79, + 0x79, 0x84, 0x80, 0x80, 0x8b, 0x85, 0x76, 0x77, + 0x88, 0x8e, 0x96, 0x8a, 0x90, 0x78, 0x5a, 0x8c, + 0x8f, 0x94, 0x84, 0x84, 0x79, 0x7c, 0xa1, 0x9e, + 0x94, 0x6b, 0x46, 0x57, 0x76, 0x67, 0x54, 0x62, + 0x5f, 0x6a, 0x66, 0x6c, 0x6d, 0x78, 0x26, 0x10, + 0xe8, 0xf8, 0xeb, 0xf4, 0xd4, 0x95, 0xb5, 0xf2, + 0xfd, 0xff, 0xf0, 0x92, 0x8c, 0xd8, 0xe9, 0xea, + 0xeb, 0xea, 0xe9, 0xe7, 0xe6, 0xe4, 0xe3, 0xe2, + 0xe8, 0xe6, 0xe3, 0xe0, 0xdc, 0xd8, 0xd5, 0xd3, + 0xcd, 0xcb, 0xca, 0xc7, 0xc4, 0xc2, 0xc0, 0xbf, + 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc4, 0xc4, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcb, 0xc9, 0xc8, 0xc7, 0xc6, 0xc4, 0xc3, + 0xc5, 0xca, 0xcf, 0xcf, 0xcc, 0xca, 0xcc, 0xce, + 0xd8, 0xc8, 0xc8, 0xcc, 0x7e, 0x6c, 0xc5, 0xd4, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcf, 0xcf, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, + 0xab, 0xaa, 0xbd, 0x8f, 0xa1, 0xaa, 0x97, 0xbd, + 0xc6, 0xc7, 0xca, 0xcc, 0xcc, 0xcc, 0xcb, 0xca, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, + 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xd0, 0xcc, 0xc6, 0xc3, 0xc3, 0xc5, 0xc7, 0xc8, + 0xd4, 0xbb, 0xa9, 0xc2, 0xba, 0xba, 0xb6, 0xca, + 0xd6, 0xb8, 0xcd, 0xc0, 0x83, 0x67, 0x66, 0x6b, + 0x74, 0x7f, 0x89, 0x85, 0x76, 0x6a, 0x68, 0x6c, + 0x6e, 0x7b, 0x87, 0x86, 0x7c, 0x75, 0x79, 0x80, + 0x80, 0x75, 0x6c, 0x6d, 0x76, 0x7b, 0x75, 0x6d, + 0x68, 0x64, 0x5e, 0x5c, 0x5c, 0x5a, 0x54, 0x4f, + 0x58, 0x4e, 0x45, 0x46, 0x4d, 0x4f, 0x49, 0x42, + 0x3d, 0x7d, 0x78, 0x67, 0x66, 0x5a, 0x62, 0x67, + 0x5b, 0x4e, 0x51, 0x35, 0x48, 0x70, 0x73, 0xa1, + 0x97, 0x98, 0xab, 0xa0, 0x74, 0x5f, 0x6f, 0x88, + 0x6b, 0x71, 0x8a, 0x8b, 0x85, 0x80, 0x72, 0x7a, + 0xd1, 0xc7, 0x84, 0x6d, 0x74, 0x62, 0x6a, 0x7d, + 0x73, 0x66, 0x75, 0x80, 0x8c, 0x9b, 0x8a, 0x72, + 0x79, 0x73, 0x8c, 0x9f, 0x93, 0x75, 0x6b, 0x84, + 0x77, 0x80, 0x9b, 0x96, 0x73, 0x75, 0x8c, 0x8a, + 0x92, 0x74, 0x82, 0x7f, 0x7d, 0x93, 0x8b, 0x7f, + 0x89, 0x6b, 0x78, 0x8d, 0x8d, 0x91, 0x8d, 0x7c, + 0x73, 0x95, 0xb8, 0x87, 0x3c, 0x56, 0x8e, 0x86, + 0x79, 0x80, 0x74, 0x71, 0x6b, 0x72, 0x1f, 0x09, + 0xec, 0xf3, 0xe5, 0xef, 0xf0, 0xee, 0xfe, 0xf0, + 0x67, 0xa8, 0xec, 0xeb, 0xec, 0xfa, 0xe6, 0xe6, + 0xef, 0xef, 0xee, 0xed, 0xeb, 0xea, 0xe9, 0xe9, + 0xf0, 0xef, 0xee, 0xec, 0xe9, 0xe7, 0xe6, 0xe5, + 0xe4, 0xe3, 0xdf, 0xdb, 0xd6, 0xd2, 0xcf, 0xcd, + 0xcd, 0xcd, 0xcc, 0xca, 0xc9, 0xc8, 0xc7, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, + 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, + 0xc7, 0xc7, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xcb, 0xcc, 0xcd, 0xcd, 0xcd, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xd2, 0xcd, 0xc8, 0xc8, 0xcb, 0xcc, 0xc7, 0xc1, + 0xc7, 0xcb, 0xcf, 0xd0, 0xce, 0xcc, 0xcd, 0xce, + 0xd0, 0xd4, 0xdd, 0xd0, 0xa5, 0xb7, 0xe6, 0xcf, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xd3, 0xd4, 0xd5, 0xd5, 0xd3, 0xcf, 0xca, 0xc7, + 0xc4, 0xb4, 0xd0, 0x9f, 0xa6, 0xb8, 0xa1, 0xbe, + 0xc8, 0xc9, 0xcb, 0xcd, 0xce, 0xce, 0xcc, 0xcb, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xce, 0xca, 0xc6, 0xc7, 0xcb, 0xcb, 0xc5, 0xbf, + 0xc9, 0xbc, 0xb0, 0xbe, 0xb8, 0xb6, 0xb3, 0xc4, + 0xba, 0xa2, 0xca, 0xc2, 0x77, 0x59, 0x5f, 0x63, + 0x69, 0x6f, 0x72, 0x6b, 0x63, 0x65, 0x72, 0x80, + 0x85, 0x87, 0x89, 0x87, 0x83, 0x7f, 0x7d, 0x7d, + 0x85, 0x6f, 0x59, 0x56, 0x65, 0x76, 0x7d, 0x7c, + 0x68, 0x62, 0x5c, 0x5b, 0x5d, 0x5e, 0x5c, 0x5a, + 0x4a, 0x46, 0x44, 0x47, 0x4a, 0x46, 0x39, 0x2d, + 0x30, 0x72, 0x76, 0x62, 0x62, 0x61, 0x61, 0x58, + 0x5a, 0x53, 0x43, 0x2f, 0x69, 0x9c, 0x8b, 0xa2, + 0x9a, 0x86, 0x88, 0x68, 0x5d, 0x7f, 0x85, 0x89, + 0x92, 0x7f, 0x70, 0x5d, 0x71, 0x95, 0x86, 0x72, + 0x81, 0xbf, 0xa9, 0x84, 0x7c, 0x6e, 0x62, 0x4e, + 0x69, 0x69, 0x93, 0x92, 0x7c, 0x78, 0x6f, 0x7c, + 0x8e, 0x84, 0x72, 0x75, 0x78, 0x79, 0x8a, 0x93, + 0x85, 0x7e, 0x7c, 0x85, 0x89, 0x81, 0x83, 0x93, + 0x84, 0x6d, 0x8d, 0x98, 0x86, 0x90, 0x88, 0x69, + 0x73, 0x86, 0x94, 0x80, 0x8b, 0x88, 0x6b, 0x90, + 0x8a, 0x93, 0x6d, 0x60, 0x93, 0xa1, 0x8a, 0x8e, + 0x63, 0x6d, 0x65, 0x68, 0x67, 0x71, 0x20, 0x0a, + 0xea, 0xf6, 0xf3, 0xed, 0xe5, 0xef, 0xf2, 0xc5, + 0x8a, 0xb5, 0xe9, 0xf4, 0xfa, 0xfb, 0xe8, 0xee, + 0xed, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8, 0xe8, + 0xee, 0xed, 0xed, 0xec, 0xec, 0xeb, 0xeb, 0xea, + 0xee, 0xee, 0xec, 0xeb, 0xe9, 0xe7, 0xe6, 0xe5, + 0xdd, 0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd3, 0xd2, + 0xcb, 0xcb, 0xca, 0xca, 0xc9, 0xc9, 0xc8, 0xc8, + 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcc, 0xcc, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd3, 0xd0, 0xcc, 0xcb, 0xcc, 0xcb, 0xc8, 0xc4, + 0xc9, 0xcc, 0xcf, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, + 0xc7, 0xd1, 0xd1, 0xcd, 0xdc, 0xe8, 0xde, 0xd2, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd3, 0xd6, 0xd8, 0xd9, 0xd5, 0xce, 0xc7, 0xc2, + 0xc1, 0xab, 0xc1, 0x9b, 0x9e, 0xb3, 0xb3, 0xc6, + 0xca, 0xcb, 0xce, 0xd0, 0xd0, 0xd0, 0xcf, 0xce, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xd3, 0xcb, 0xc1, 0xbc, 0xc0, 0xc8, 0xcf, 0xd3, + 0xd6, 0xca, 0xb6, 0xb0, 0xaf, 0xae, 0xac, 0xb6, + 0x8c, 0x95, 0xc7, 0xbb, 0x79, 0x5d, 0x5a, 0x5e, + 0x71, 0x67, 0x5a, 0x54, 0x58, 0x64, 0x72, 0x7b, + 0x77, 0x6a, 0x5f, 0x60, 0x6e, 0x7c, 0x83, 0x84, + 0x6e, 0x69, 0x67, 0x6c, 0x74, 0x74, 0x6a, 0x5f, + 0x74, 0x6f, 0x68, 0x64, 0x63, 0x60, 0x5a, 0x55, + 0x44, 0x46, 0x4b, 0x53, 0x56, 0x4f, 0x41, 0x35, + 0x51, 0x91, 0x94, 0x69, 0x64, 0x77, 0x70, 0x54, + 0x54, 0x6c, 0x5c, 0x3e, 0x6d, 0x95, 0x8a, 0xa9, + 0x9f, 0x80, 0x92, 0x78, 0x69, 0x7e, 0x77, 0x8a, + 0x69, 0x7d, 0x94, 0x81, 0x79, 0x84, 0x73, 0x69, + 0x5a, 0x96, 0xe1, 0xb7, 0x69, 0x65, 0x6f, 0x71, + 0x7d, 0x59, 0x69, 0x6d, 0x70, 0x7f, 0x77, 0x84, + 0x6e, 0x80, 0x6c, 0x6e, 0x81, 0x94, 0x9d, 0x76, + 0x75, 0x85, 0x85, 0x89, 0x95, 0x83, 0x6b, 0x70, + 0x97, 0x86, 0x81, 0x83, 0x80, 0x73, 0x74, 0x8d, + 0x89, 0x73, 0x85, 0x73, 0x65, 0x9d, 0xa1, 0x65, + 0x79, 0x56, 0x5f, 0x7d, 0x6f, 0x55, 0x5b, 0x6c, + 0x7a, 0x86, 0x80, 0x82, 0x7a, 0x79, 0x1c, 0x00, + 0xeb, 0xfb, 0xf3, 0xf0, 0xf6, 0xef, 0xf1, 0xfc, + 0xf8, 0xff, 0xff, 0xec, 0xed, 0xf5, 0xf0, 0xf4, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe7, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdd, + 0xd7, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd3, 0xd2, + 0xd1, 0xd1, 0xd0, 0xcf, 0xce, 0xcd, 0xcd, 0xcc, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, + 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd3, 0xd3, 0xcf, 0xca, 0xc6, 0xc6, 0xc8, + 0xcc, 0xcd, 0xcf, 0xd1, 0xd3, 0xd3, 0xd1, 0xcf, + 0xd2, 0xcd, 0xd7, 0xd7, 0xd4, 0xd3, 0xca, 0xce, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd3, 0xd5, 0xd8, 0xd7, 0xd4, 0xcc, 0xc4, 0xbf, + 0xc8, 0xb6, 0xbb, 0xa4, 0x9d, 0x9e, 0xb1, 0xb8, + 0xcc, 0xce, 0xd0, 0xd2, 0xd3, 0xd2, 0xd1, 0xd0, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xc4, 0xc8, 0xcc, 0xcd, 0xca, 0xc8, 0xc9, 0xca, + 0xd4, 0xd0, 0xbe, 0xb0, 0xbd, 0xbd, 0xb3, 0xac, + 0xa1, 0xbd, 0xd2, 0xa9, 0x7a, 0x67, 0x5e, 0x6d, + 0x65, 0x61, 0x5e, 0x5f, 0x65, 0x6e, 0x76, 0x7a, + 0x80, 0x78, 0x6d, 0x66, 0x66, 0x68, 0x68, 0x68, + 0x65, 0x6e, 0x7a, 0x81, 0x7d, 0x71, 0x62, 0x59, + 0x5e, 0x5c, 0x5c, 0x60, 0x63, 0x62, 0x5c, 0x57, + 0x60, 0x62, 0x64, 0x65, 0x60, 0x53, 0x41, 0x35, + 0x5f, 0x9c, 0xa0, 0x64, 0x58, 0x77, 0x63, 0x33, + 0x37, 0x67, 0x6a, 0x5b, 0x86, 0x9e, 0x92, 0xaa, + 0x76, 0x55, 0x74, 0x73, 0x71, 0x80, 0x6f, 0x81, + 0x83, 0x72, 0x6e, 0x63, 0x6f, 0x88, 0x85, 0x89, + 0x68, 0x59, 0xad, 0xd5, 0xa1, 0x7d, 0x6d, 0x66, + 0x77, 0x69, 0x81, 0x81, 0x6b, 0x65, 0x64, 0x77, + 0x76, 0x8f, 0x8e, 0x90, 0x79, 0x63, 0x7f, 0x8a, + 0x86, 0x80, 0x7d, 0x6c, 0x64, 0x87, 0x9c, 0x84, + 0x83, 0x87, 0x77, 0x83, 0x97, 0x7e, 0x6e, 0x85, + 0x82, 0x74, 0x77, 0xa3, 0x98, 0x60, 0x78, 0xb6, + 0x73, 0x5d, 0x56, 0x56, 0x5a, 0x76, 0x8d, 0x86, + 0x85, 0x84, 0x6b, 0x5f, 0x57, 0x63, 0x1a, 0x0a, + 0xfb, 0xf5, 0xea, 0xe9, 0xef, 0xf1, 0xee, 0xed, + 0xf6, 0xf4, 0xee, 0xef, 0xf3, 0xeb, 0xe8, 0xf5, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, + 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, + 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe4, 0xe3, 0xe3, + 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe0, 0xdf, 0xdf, + 0xd3, 0xd3, 0xd2, 0xd0, 0xcf, 0xce, 0xcd, 0xcc, + 0xd3, 0xd3, 0xd2, 0xd2, 0xd1, 0xd1, 0xd0, 0xd0, + 0xd1, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd0, 0xd3, 0xd5, 0xd0, 0xc8, 0xc3, 0xc5, 0xc8, + 0xcf, 0xce, 0xcf, 0xd2, 0xd5, 0xd6, 0xd2, 0xcf, + 0xd6, 0xcf, 0xd2, 0xd3, 0xd9, 0xdc, 0xd1, 0xcd, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd5, 0xd6, 0xd6, 0xd5, 0xd2, 0xcc, 0xc6, 0xc3, + 0xb8, 0xb0, 0xb4, 0xb1, 0xac, 0x9a, 0xb5, 0xc4, + 0xce, 0xd0, 0xd2, 0xd4, 0xd5, 0xd4, 0xd3, 0xd2, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xd1, 0xd3, 0xd1, 0xc9, 0xc2, 0xc0, 0xc5, 0xcc, + 0xc0, 0xcc, 0xc6, 0xb8, 0xd4, 0xd5, 0xc4, 0xb0, + 0xb0, 0xc7, 0xc9, 0x9d, 0x83, 0x74, 0x61, 0x75, + 0x7d, 0x7f, 0x7c, 0x6f, 0x62, 0x61, 0x6d, 0x7b, + 0x78, 0x6e, 0x65, 0x64, 0x6b, 0x70, 0x6f, 0x6c, + 0x64, 0x6b, 0x70, 0x6e, 0x67, 0x62, 0x62, 0x65, + 0x64, 0x5c, 0x53, 0x50, 0x56, 0x5f, 0x66, 0x69, + 0x65, 0x65, 0x63, 0x5e, 0x55, 0x49, 0x3c, 0x34, + 0x3b, 0x6c, 0x80, 0x53, 0x4e, 0x6f, 0x53, 0x23, + 0x35, 0x54, 0x51, 0x54, 0x84, 0x9e, 0x9c, 0xab, + 0x92, 0x74, 0x81, 0x7f, 0x86, 0x98, 0x82, 0x75, + 0x7b, 0x77, 0x89, 0x8a, 0x81, 0x75, 0x61, 0x69, + 0x8e, 0x69, 0x77, 0xc7, 0xb8, 0x63, 0x55, 0x62, + 0x8f, 0x74, 0x64, 0x68, 0x6b, 0x77, 0x88, 0x85, + 0x9e, 0x82, 0x67, 0x74, 0x86, 0x88, 0x90, 0x91, + 0x7e, 0x74, 0x77, 0x86, 0x8e, 0x8f, 0x8e, 0x8b, + 0x71, 0x89, 0x8e, 0x95, 0x8f, 0x7a, 0x74, 0x6a, + 0x90, 0x88, 0x84, 0x87, 0x68, 0x78, 0x9d, 0x61, + 0x55, 0x92, 0x96, 0x82, 0x90, 0x85, 0x6a, 0x72, + 0x60, 0x75, 0x7e, 0x8c, 0x8b, 0x89, 0x28, 0x06, + 0xf1, 0xed, 0xf9, 0xf5, 0xeb, 0xf9, 0xfd, 0xeb, + 0xe9, 0xf4, 0xef, 0xed, 0xf3, 0xf3, 0xf4, 0xf6, + 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xec, 0xeb, 0xea, 0xe9, 0xe7, 0xe5, 0xe4, 0xe4, + 0xdb, 0xda, 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd3, + 0xd6, 0xd6, 0xd5, 0xd4, 0xd3, 0xd3, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd2, 0xd2, 0xd0, 0xcd, 0xc9, 0xc5, 0xc4, 0xc3, + 0xd1, 0xcf, 0xcf, 0xd2, 0xd7, 0xd8, 0xd4, 0xcf, + 0xd0, 0xd9, 0xcd, 0xc6, 0xd0, 0xd4, 0xd4, 0xd9, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd9, 0xd9, 0xd7, 0xd5, 0xd2, 0xcf, 0xcd, 0xcc, + 0xb8, 0xab, 0xb3, 0xae, 0xa7, 0x89, 0x9c, 0xc1, + 0xd0, 0xd2, 0xd4, 0xd6, 0xd7, 0xd6, 0xd5, 0xd4, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xca, 0xce, 0xd3, 0xd4, 0xd0, 0xc9, 0xc1, 0xbc, + 0xc2, 0xd3, 0xcb, 0xac, 0xcb, 0xd0, 0xca, 0xba, + 0xa9, 0xa4, 0xab, 0xa0, 0x91, 0x7b, 0x63, 0x72, + 0x7c, 0x7c, 0x77, 0x6a, 0x60, 0x64, 0x77, 0x88, + 0x6f, 0x64, 0x59, 0x57, 0x5d, 0x64, 0x66, 0x65, + 0x79, 0x7c, 0x7e, 0x7d, 0x79, 0x76, 0x75, 0x76, + 0x7d, 0x70, 0x60, 0x57, 0x56, 0x5c, 0x61, 0x63, + 0x4b, 0x4b, 0x4b, 0x49, 0x48, 0x48, 0x4a, 0x4c, + 0x3c, 0x4d, 0x68, 0x58, 0x5a, 0x72, 0x5a, 0x42, + 0x58, 0x5e, 0x44, 0x34, 0x41, 0x54, 0x73, 0x92, + 0x72, 0x72, 0x84, 0x84, 0x7b, 0x84, 0x8a, 0x86, + 0x88, 0x6b, 0x64, 0x64, 0x74, 0x85, 0x80, 0x8a, + 0x76, 0x66, 0x56, 0x9c, 0xda, 0xb8, 0x85, 0x64, + 0x7f, 0x80, 0x70, 0x84, 0x87, 0x7d, 0x81, 0x55, + 0x78, 0x84, 0x96, 0x8f, 0x84, 0x7e, 0x6c, 0x67, + 0x8c, 0x8c, 0x84, 0x8a, 0x8f, 0x70, 0x6b, 0x96, + 0x94, 0x96, 0x85, 0x7d, 0x67, 0x63, 0x85, 0x84, + 0x76, 0x96, 0x72, 0x54, 0x74, 0x7a, 0x54, 0x3c, + 0x80, 0x5b, 0x64, 0x6f, 0x57, 0x66, 0x87, 0x7d, + 0x86, 0x85, 0x6d, 0x63, 0x5d, 0x6c, 0x24, 0x15, + 0xf6, 0xf3, 0xf2, 0xf0, 0xf7, 0xf3, 0xe8, 0xf4, + 0xfa, 0xfa, 0xea, 0xe9, 0xef, 0xea, 0xec, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xed, 0xec, 0xeb, 0xeb, 0xeb, + 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xec, 0xed, 0xee, + 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, + 0xea, 0xea, 0xe8, 0xe7, 0xe5, 0xe3, 0xe2, 0xe1, + 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, 0xde, 0xdd, 0xdc, + 0xd8, 0xd7, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd3, + 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd7, 0xd7, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd6, 0xd0, 0xcb, 0xc9, 0xca, 0xc9, 0xc3, 0xbe, + 0xd2, 0xd0, 0xcf, 0xd2, 0xd8, 0xd9, 0xd5, 0xcf, + 0xcc, 0xd2, 0xd4, 0xda, 0xd3, 0xd3, 0xe0, 0xd9, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdd, 0xdb, 0xd8, 0xd5, 0xd3, 0xd2, 0xd2, 0xd3, + 0xc0, 0xa9, 0xb8, 0xad, 0xa8, 0x8d, 0x9b, 0xda, + 0xd1, 0xd3, 0xd5, 0xd7, 0xd8, 0xd7, 0xd6, 0xd5, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xc9, 0xc9, 0xca, 0xcf, 0xd3, 0xd1, 0xc8, 0xc0, + 0xa6, 0xc5, 0xc9, 0xaa, 0xcb, 0xd1, 0xcf, 0xc0, + 0xbb, 0x91, 0x99, 0xa6, 0x95, 0x79, 0x66, 0x73, + 0x82, 0x7d, 0x75, 0x6f, 0x69, 0x65, 0x60, 0x5d, + 0x5d, 0x6b, 0x75, 0x70, 0x63, 0x60, 0x6e, 0x7e, + 0x81, 0x76, 0x68, 0x5f, 0x5f, 0x64, 0x69, 0x6b, + 0x57, 0x5a, 0x60, 0x69, 0x70, 0x6f, 0x67, 0x60, + 0x5e, 0x5a, 0x53, 0x4a, 0x44, 0x44, 0x49, 0x4d, + 0x5d, 0x4c, 0x5d, 0x59, 0x58, 0x61, 0x4d, 0x4e, + 0x68, 0x59, 0x3f, 0x44, 0x55, 0x59, 0x5b, 0x56, + 0x73, 0x68, 0x6b, 0x7e, 0x7c, 0x77, 0x7a, 0x6d, + 0x6c, 0x6f, 0x87, 0x88, 0x84, 0x7e, 0x68, 0x67, + 0x83, 0x8b, 0x78, 0x59, 0x8e, 0xc2, 0x8e, 0x5b, + 0x79, 0x8b, 0x6c, 0x74, 0x6a, 0x65, 0x8e, 0x6e, + 0x67, 0x60, 0x72, 0x6d, 0x74, 0x84, 0x7a, 0x84, + 0x81, 0x77, 0x70, 0x6b, 0x77, 0x97, 0x9c, 0x7d, + 0x7d, 0x76, 0x6b, 0x90, 0x9b, 0x81, 0x80, 0x71, + 0x58, 0x75, 0x8d, 0x93, 0xa2, 0x73, 0x3a, 0x6a, + 0x72, 0x7c, 0x78, 0x7b, 0x88, 0x7c, 0x69, 0x6c, + 0x65, 0x73, 0x72, 0x7b, 0x7c, 0x84, 0x2f, 0x16, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe1, 0xe1, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xdb, 0xda, 0xda, 0xd9, 0xd8, 0xd8, 0xd7, 0xd7, + 0xd9, 0xd4, 0xd2, 0xcc, 0xc5, 0xcb, 0xcc, 0xc0, + 0xcd, 0xd8, 0xc5, 0xcf, 0xdd, 0xd3, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd7, 0xd8, 0xd9, 0xdb, 0xdd, 0xdf, 0xe0, 0xe1, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdd, 0xd9, 0xdc, 0xe3, 0xe0, 0xd5, 0xcf, 0xd1, + 0xc6, 0xa7, 0xad, 0xb5, 0xbb, 0x83, 0xaa, 0xcd, + 0xcd, 0xd6, 0xda, 0xd5, 0xd3, 0xd7, 0xd8, 0xd5, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd1, 0xd2, 0xd2, 0xd2, 0xd0, 0xcd, 0xca, 0xc8, + 0xc6, 0xdc, 0xca, 0xcd, 0xd5, 0xbc, 0xbc, 0xd0, + 0xc2, 0xbc, 0xb1, 0xa7, 0xb6, 0xa8, 0xb7, 0xa8, + 0xbe, 0xa2, 0xab, 0xc1, 0x95, 0x73, 0x7f, 0x6b, + 0x76, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6d, 0x69, + 0x7b, 0x76, 0x6c, 0x65, 0x6a, 0x71, 0x6d, 0x62, + 0x5d, 0x5c, 0x5e, 0x67, 0x72, 0x77, 0x75, 0x70, + 0x6d, 0x69, 0x64, 0x5f, 0x5b, 0x56, 0x51, 0x4d, + 0x53, 0x48, 0x4f, 0x52, 0x45, 0x43, 0x43, 0x33, + 0x50, 0x5e, 0x55, 0x43, 0x4e, 0x61, 0x55, 0x3b, + 0x51, 0x54, 0x50, 0x53, 0x58, 0x45, 0x2f, 0x2e, + 0x5f, 0x61, 0x69, 0x74, 0x76, 0x75, 0x80, 0x8f, + 0x75, 0x68, 0x65, 0x72, 0x7c, 0x7b, 0x7a, 0x7f, + 0x71, 0x69, 0x71, 0x71, 0x59, 0x94, 0xc7, 0x72, + 0x65, 0x76, 0x71, 0x7b, 0x90, 0x88, 0x79, 0x7c, + 0x7b, 0x59, 0x7e, 0x77, 0x87, 0x7f, 0x80, 0x81, + 0x67, 0x84, 0x92, 0x9c, 0x81, 0x6f, 0x7d, 0x61, + 0x84, 0x94, 0x80, 0x6b, 0x76, 0x74, 0x6d, 0x7b, + 0x85, 0x5c, 0x4c, 0x7e, 0x71, 0x5d, 0x92, 0x94, + 0x89, 0x70, 0x72, 0x6f, 0x57, 0x63, 0x77, 0x68, + 0x84, 0x8f, 0x87, 0x8a, 0x87, 0x83, 0x1d, 0x00, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe2, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xde, 0xdd, 0xdc, 0xdc, 0xdc, + 0xd7, 0xda, 0xdb, 0xd0, 0xc6, 0xcd, 0xce, 0xbe, + 0xc3, 0xd5, 0xcb, 0xd0, 0xda, 0xd3, 0xd8, 0xd7, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd8, 0xd9, 0xda, 0xdc, 0xdd, 0xdf, 0xe0, 0xe1, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xda, 0xdd, 0xe0, 0xdf, 0xdc, 0xd9, 0xd3, 0xce, + 0xd1, 0xb5, 0x96, 0xb1, 0xc1, 0x88, 0x95, 0xc7, + 0xcc, 0xd5, 0xdb, 0xd7, 0xd5, 0xd8, 0xd7, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd3, 0xd3, 0xd1, 0xce, 0xcb, 0xc9, + 0xba, 0xbc, 0xcf, 0xd2, 0xd4, 0xca, 0xb5, 0xc1, + 0xdc, 0xc4, 0xc0, 0x98, 0x9c, 0xd3, 0xc9, 0xc9, + 0xa1, 0xa7, 0xc1, 0xd2, 0x9c, 0x6a, 0x76, 0x76, + 0x78, 0x7a, 0x7d, 0x80, 0x81, 0x7c, 0x6f, 0x63, + 0x7a, 0x7c, 0x76, 0x6d, 0x6c, 0x74, 0x79, 0x77, + 0x80, 0x7c, 0x75, 0x6d, 0x67, 0x65, 0x67, 0x6a, + 0x6a, 0x60, 0x58, 0x5a, 0x62, 0x64, 0x5c, 0x52, + 0x59, 0x50, 0x56, 0x58, 0x4d, 0x4b, 0x4a, 0x3e, + 0x4c, 0x61, 0x58, 0x40, 0x49, 0x5f, 0x5b, 0x48, + 0x66, 0x74, 0x69, 0x56, 0x56, 0x54, 0x48, 0x43, + 0x76, 0x72, 0x79, 0x89, 0x8d, 0x80, 0x70, 0x69, + 0x84, 0x8d, 0x8c, 0x7f, 0x76, 0x74, 0x6c, 0x60, + 0x8c, 0x7e, 0x89, 0x93, 0x74, 0x76, 0xa4, 0xac, + 0x75, 0x68, 0x60, 0x57, 0x84, 0x8b, 0x5e, 0x89, + 0x7b, 0x74, 0x81, 0x69, 0x81, 0x6e, 0x6f, 0x98, + 0x98, 0x94, 0x73, 0x80, 0x8e, 0x7d, 0x89, 0x98, + 0x92, 0x77, 0x73, 0x6d, 0x60, 0x7d, 0x97, 0x83, + 0x56, 0x7b, 0xae, 0x5d, 0x59, 0x91, 0x5f, 0x6d, + 0x5a, 0x66, 0x7c, 0x87, 0x88, 0x96, 0x98, 0x84, + 0x78, 0x58, 0x4e, 0x75, 0x82, 0x81, 0x29, 0x13, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, 0xe2, 0xe1, 0xe1, + 0xdb, 0xda, 0xdd, 0xd9, 0xce, 0xcc, 0xc9, 0xbc, + 0xb4, 0xd0, 0xd2, 0xd3, 0xd6, 0xd4, 0xd9, 0xd5, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe1, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xd8, 0xe1, 0xe3, 0xdc, 0xd9, 0xdc, 0xd7, 0xcc, + 0xd8, 0xe2, 0x96, 0x92, 0xaf, 0xa1, 0xa7, 0xc9, + 0xca, 0xd5, 0xdc, 0xda, 0xd8, 0xd9, 0xd7, 0xd2, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd4, 0xd4, 0xd2, 0xd0, 0xcd, 0xcb, + 0xbf, 0xb0, 0xc1, 0xc7, 0xc9, 0xd1, 0xca, 0xcd, + 0xd2, 0xe4, 0xd9, 0xb9, 0x98, 0xcc, 0xd1, 0xc1, + 0x5a, 0xaf, 0xd3, 0xb4, 0x7c, 0x67, 0x73, 0x65, + 0x7a, 0x6f, 0x64, 0x62, 0x69, 0x74, 0x7d, 0x83, + 0x7d, 0x81, 0x7b, 0x6a, 0x60, 0x65, 0x6f, 0x75, + 0x87, 0x87, 0x86, 0x82, 0x7c, 0x77, 0x74, 0x72, + 0x5d, 0x62, 0x67, 0x69, 0x68, 0x6a, 0x6f, 0x74, + 0x5e, 0x58, 0x59, 0x56, 0x49, 0x43, 0x41, 0x38, + 0x45, 0x6a, 0x73, 0x67, 0x6d, 0x70, 0x60, 0x52, + 0x40, 0x5d, 0x66, 0x5d, 0x5f, 0x66, 0x72, 0x85, + 0x7e, 0x6e, 0x64, 0x6a, 0x74, 0x79, 0x7f, 0x87, + 0x75, 0x6f, 0x63, 0x5f, 0x6f, 0x83, 0x83, 0x74, + 0x79, 0x5d, 0x5e, 0x6e, 0x6f, 0x69, 0x8d, 0xd9, + 0xc2, 0x7e, 0x72, 0x6e, 0x7b, 0x82, 0x6f, 0x95, + 0x7a, 0x65, 0x6b, 0x63, 0x8b, 0xa3, 0x8f, 0x65, + 0x71, 0x80, 0x72, 0x7b, 0x8f, 0x87, 0x7c, 0x70, + 0x7e, 0x72, 0x77, 0x8b, 0x84, 0x67, 0x69, 0x89, + 0x96, 0xa0, 0x4e, 0x4d, 0x74, 0x6f, 0x84, 0x84, + 0x85, 0x90, 0x82, 0x69, 0x64, 0x5d, 0x4d, 0x45, + 0x7a, 0x7b, 0x88, 0x8a, 0x5b, 0x53, 0x11, 0x00, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe7, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe7, 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, + 0xe3, 0xd5, 0xd6, 0xdd, 0xd6, 0xcc, 0xc3, 0xb8, + 0xa8, 0xc8, 0xd9, 0xd5, 0xd2, 0xd7, 0xdb, 0xd5, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe1, 0xe2, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdc, 0xe1, 0xe1, 0xdd, 0xda, 0xda, 0xd6, 0xd0, + 0xb3, 0xe3, 0xa5, 0x87, 0xad, 0xb3, 0xc1, 0xc8, + 0xc9, 0xd5, 0xdd, 0xdc, 0xda, 0xda, 0xd7, 0xd2, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd3, 0xd3, 0xd4, 0xd5, 0xd4, 0xd2, 0xcf, 0xce, + 0xc5, 0xc6, 0xc3, 0xd4, 0xd6, 0xca, 0xc6, 0xaf, + 0xb7, 0xd4, 0xcb, 0xd2, 0xbc, 0xca, 0xd9, 0xaf, + 0x86, 0xd0, 0xdf, 0xba, 0x84, 0x59, 0x5d, 0x68, + 0x70, 0x6e, 0x75, 0x80, 0x83, 0x77, 0x68, 0x61, + 0x6e, 0x73, 0x6d, 0x60, 0x5b, 0x66, 0x76, 0x7e, + 0x8c, 0x8a, 0x89, 0x89, 0x87, 0x81, 0x78, 0x72, + 0x5c, 0x67, 0x6e, 0x68, 0x5a, 0x54, 0x5b, 0x66, + 0x60, 0x5f, 0x5f, 0x5a, 0x4f, 0x49, 0x48, 0x45, + 0x4e, 0x69, 0x6f, 0x6c, 0x6d, 0x5d, 0x50, 0x5e, + 0x41, 0x34, 0x2e, 0x4a, 0x6e, 0x6d, 0x62, 0x6a, + 0x65, 0x6c, 0x7b, 0x87, 0x82, 0x71, 0x6a, 0x6d, + 0x71, 0x73, 0x7d, 0x87, 0x80, 0x71, 0x6e, 0x76, + 0x79, 0x84, 0x9c, 0x8b, 0x74, 0x61, 0x64, 0xa2, + 0xdd, 0x9d, 0x68, 0x69, 0x72, 0x73, 0x7c, 0x81, + 0x83, 0x67, 0x7b, 0x8e, 0x7e, 0x6b, 0x75, 0x7f, + 0x6e, 0x87, 0x9c, 0x8b, 0x64, 0x67, 0x86, 0x8b, + 0x86, 0x9c, 0x80, 0x6a, 0x83, 0x7d, 0x5b, 0x59, + 0x6a, 0x5a, 0x5c, 0x87, 0x92, 0x7a, 0x7a, 0x7c, + 0x67, 0x71, 0x61, 0x60, 0x7a, 0x78, 0x75, 0x95, + 0x8f, 0x66, 0x5f, 0x6d, 0x4a, 0x4b, 0x18, 0x0e, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xe9, 0xe9, 0xe8, 0xe7, 0xe7, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, + 0xe2, 0xd8, 0xd5, 0xd6, 0xd5, 0xd5, 0xc7, 0xaf, + 0xa3, 0xc0, 0xdb, 0xd7, 0xd1, 0xda, 0xde, 0xd9, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe2, 0xde, 0xdd, 0xe0, 0xde, 0xd6, 0xd4, 0xd6, + 0xc4, 0xd3, 0xab, 0x85, 0x9e, 0x87, 0xb0, 0xca, + 0xcb, 0xd6, 0xde, 0xdc, 0xd9, 0xdb, 0xd9, 0xd4, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd6, 0xd4, 0xd2, 0xd0, + 0xbf, 0xba, 0x9f, 0xaa, 0xc4, 0xcd, 0xd3, 0xc6, + 0xae, 0xb9, 0xd4, 0xd0, 0xb7, 0x9d, 0xb9, 0xc5, + 0x98, 0xc9, 0xc0, 0xa0, 0x81, 0x61, 0x69, 0x7e, + 0x86, 0x77, 0x70, 0x75, 0x74, 0x6a, 0x65, 0x68, + 0x7f, 0x7d, 0x72, 0x62, 0x5d, 0x67, 0x70, 0x72, + 0x85, 0x86, 0x84, 0x7e, 0x77, 0x76, 0x7c, 0x82, + 0x90, 0x8b, 0x82, 0x77, 0x6b, 0x60, 0x57, 0x52, + 0x4a, 0x4f, 0x4f, 0x49, 0x44, 0x3f, 0x40, 0x46, + 0x5b, 0x6a, 0x6d, 0x78, 0x78, 0x4e, 0x3b, 0x61, + 0x48, 0x47, 0x4b, 0x5f, 0x6c, 0x61, 0x66, 0x86, + 0x78, 0x76, 0x7a, 0x7f, 0x7b, 0x76, 0x7e, 0x8b, + 0x7e, 0x67, 0x5b, 0x69, 0x7e, 0x86, 0x87, 0x89, + 0x70, 0x6b, 0x78, 0x6b, 0x72, 0x85, 0x6c, 0x60, + 0x9f, 0xbe, 0x8b, 0x56, 0x6b, 0x7b, 0x7c, 0x8e, + 0x84, 0x75, 0x5a, 0x6d, 0x82, 0x79, 0x79, 0x9b, + 0x91, 0x73, 0x78, 0x88, 0x88, 0x8b, 0x8f, 0x8d, + 0x81, 0x76, 0x8b, 0x9b, 0x88, 0x84, 0x97, 0xa0, + 0x71, 0x5b, 0x8f, 0x7d, 0x5a, 0x6a, 0x61, 0x6f, + 0x91, 0x8d, 0x7f, 0x8a, 0x96, 0x6e, 0x57, 0x7a, + 0x57, 0x68, 0x7a, 0x82, 0x6f, 0x82, 0x37, 0x08, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe7, 0xe6, 0xe6, 0xe5, 0xe4, 0xe4, 0xe3, 0xe3, + 0xdd, 0xe1, 0xdd, 0xce, 0xcd, 0xde, 0xd4, 0xaf, + 0xa6, 0xb8, 0xd9, 0xd9, 0xd2, 0xde, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe6, 0xde, 0xdc, 0xe1, 0xdf, 0xd5, 0xd3, 0xd9, + 0xc9, 0xc6, 0xc4, 0xa5, 0xb0, 0x80, 0x98, 0xb0, + 0xd0, 0xd9, 0xdd, 0xd9, 0xd6, 0xda, 0xdb, 0xd8, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd7, 0xd6, 0xd4, 0xd3, + 0xd4, 0xdb, 0xdb, 0xb7, 0xa4, 0xad, 0xbb, 0xe0, + 0xeb, 0xd8, 0xcc, 0xd0, 0xce, 0x9a, 0xb9, 0xcd, + 0xae, 0xda, 0xc4, 0x96, 0x79, 0x6a, 0x74, 0x78, + 0x77, 0x6b, 0x6b, 0x7a, 0x7b, 0x6b, 0x61, 0x64, + 0x6f, 0x6f, 0x69, 0x5f, 0x60, 0x6d, 0x77, 0x79, + 0x7d, 0x89, 0x90, 0x88, 0x79, 0x73, 0x7c, 0x88, + 0x94, 0x91, 0x8b, 0x82, 0x77, 0x6e, 0x68, 0x65, + 0x59, 0x60, 0x5a, 0x4d, 0x44, 0x3a, 0x37, 0x42, + 0x62, 0x71, 0x75, 0x86, 0x8b, 0x54, 0x36, 0x5e, + 0x67, 0x60, 0x4e, 0x47, 0x52, 0x53, 0x56, 0x66, + 0x82, 0x78, 0x76, 0x7f, 0x83, 0x7c, 0x74, 0x72, + 0x71, 0x7e, 0x84, 0x79, 0x70, 0x6e, 0x68, 0x5e, + 0x91, 0x84, 0x85, 0x73, 0x65, 0x72, 0x70, 0x61, + 0x75, 0x9d, 0xa9, 0x5a, 0x54, 0x8a, 0x73, 0x64, + 0x5d, 0x85, 0x84, 0x8d, 0x82, 0x85, 0x76, 0x61, + 0x80, 0x89, 0x90, 0x86, 0x85, 0x78, 0x61, 0x70, + 0x8f, 0x8e, 0x93, 0x84, 0x77, 0x94, 0x97, 0x65, + 0x50, 0x67, 0x60, 0x75, 0x7d, 0x80, 0x9d, 0x8a, + 0x8b, 0x74, 0x60, 0x66, 0x69, 0x55, 0x58, 0x7a, + 0x76, 0x7d, 0x60, 0x42, 0x2b, 0x3c, 0x0c, 0x18, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe5, + 0xe0, 0xe4, 0xe4, 0xd7, 0xcf, 0xda, 0xd9, 0xc4, + 0xad, 0xb2, 0xd4, 0xd9, 0xd4, 0xe1, 0xe4, 0xe9, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe4, 0xe1, 0xdf, 0xde, 0xdb, 0xd8, 0xd7, 0xd8, + 0xc5, 0xc3, 0xc4, 0xa8, 0xb4, 0xa3, 0xa0, 0xb3, + 0xd5, 0xdb, 0xdc, 0xd5, 0xd3, 0xd8, 0xdd, 0xdd, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd4, 0xd5, 0xd7, 0xd8, 0xd9, 0xd7, 0xd6, 0xd5, + 0xd4, 0xce, 0xdb, 0xcf, 0xc2, 0xbf, 0xa4, 0x91, + 0xba, 0xcb, 0xd0, 0xf5, 0xfd, 0xc7, 0xc4, 0xd6, + 0xa1, 0xbd, 0xb9, 0xa7, 0x7e, 0x59, 0x6a, 0x82, + 0x84, 0x75, 0x75, 0x84, 0x82, 0x6b, 0x5c, 0x5f, + 0x6e, 0x76, 0x75, 0x68, 0x60, 0x65, 0x6e, 0x73, + 0x8f, 0x92, 0x92, 0x8b, 0x7d, 0x70, 0x66, 0x63, + 0x7a, 0x7e, 0x80, 0x7d, 0x76, 0x73, 0x75, 0x79, + 0x5a, 0x63, 0x59, 0x47, 0x3c, 0x2e, 0x2a, 0x38, + 0x67, 0x78, 0x6a, 0x68, 0x75, 0x53, 0x3d, 0x63, + 0x59, 0x5e, 0x58, 0x53, 0x56, 0x57, 0x6b, 0x8f, + 0x71, 0x69, 0x6b, 0x79, 0x82, 0x7e, 0x78, 0x78, + 0x72, 0x71, 0x6b, 0x6a, 0x7a, 0x8e, 0x8f, 0x83, + 0x75, 0x6d, 0x6a, 0x7d, 0x88, 0x8d, 0x8d, 0x76, + 0x5b, 0x7d, 0xe7, 0xc3, 0x59, 0x60, 0x7b, 0x80, + 0x8b, 0x78, 0x5f, 0x80, 0x63, 0x6f, 0x8c, 0x90, + 0x78, 0x81, 0x81, 0x66, 0x74, 0x90, 0x89, 0x99, + 0x78, 0x8b, 0x75, 0x69, 0x77, 0x61, 0x52, 0x76, + 0x7a, 0x92, 0x91, 0x7b, 0x7a, 0x7d, 0x6b, 0x5e, + 0x53, 0x60, 0x7d, 0x8a, 0x79, 0x62, 0x45, 0x22, + 0x20, 0x2d, 0x5c, 0xd8, 0xff, 0xbf, 0x19, 0x18, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xea, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, + 0xe9, 0xe0, 0xe4, 0xe7, 0xd7, 0xce, 0xd5, 0xdd, + 0xb3, 0xae, 0xd1, 0xda, 0xd6, 0xe3, 0xe5, 0xee, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe1, 0xe6, 0xe3, 0xda, 0xd7, 0xdc, 0xdb, 0xd5, + 0xc7, 0xc4, 0xc0, 0xb2, 0xbb, 0xb4, 0x86, 0x97, + 0xd8, 0xdc, 0xdb, 0xd2, 0xd0, 0xd8, 0xdf, 0xe0, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd4, 0xd5, 0xd7, 0xd9, 0xd9, 0xd8, 0xd7, 0xd6, + 0xd4, 0xd3, 0xd7, 0xdd, 0xc9, 0xca, 0xdb, 0xbb, + 0x73, 0x4f, 0x43, 0x3f, 0x5e, 0x8d, 0x7a, 0xc5, + 0xa6, 0xe3, 0xf0, 0xc5, 0x85, 0x69, 0x79, 0x77, + 0x6c, 0x5c, 0x5f, 0x73, 0x76, 0x63, 0x5a, 0x62, + 0x6b, 0x7c, 0x84, 0x78, 0x6a, 0x6d, 0x7b, 0x85, + 0x93, 0x7f, 0x6b, 0x68, 0x6f, 0x70, 0x61, 0x51, + 0x60, 0x56, 0x4e, 0x50, 0x59, 0x5c, 0x54, 0x4a, + 0x4e, 0x5c, 0x55, 0x47, 0x44, 0x3b, 0x3b, 0x4e, + 0x61, 0x82, 0x77, 0x6e, 0x82, 0x6b, 0x4d, 0x62, + 0x73, 0x59, 0x4a, 0x61, 0x76, 0x68, 0x68, 0x86, + 0x88, 0x86, 0x88, 0x88, 0x7d, 0x6e, 0x6c, 0x74, + 0x74, 0x6c, 0x6d, 0x78, 0x7c, 0x75, 0x74, 0x79, + 0x7c, 0x8d, 0x7e, 0x80, 0x79, 0x68, 0x74, 0x6f, + 0x67, 0x50, 0x98, 0xda, 0xa0, 0x6d, 0x7b, 0x73, + 0x79, 0x82, 0x5d, 0x87, 0x8a, 0x84, 0x72, 0x71, + 0x71, 0x67, 0x92, 0x9c, 0x8c, 0x88, 0x78, 0x7c, + 0x63, 0x92, 0x83, 0x84, 0xb4, 0x91, 0x5e, 0x7f, + 0x78, 0x60, 0x58, 0x64, 0x6f, 0x70, 0x77, 0x8c, + 0x6f, 0x5a, 0x3f, 0x13, 0x09, 0x54, 0x97, 0x8f, + 0xbc, 0xff, 0xff, 0xe9, 0xf9, 0xd5, 0x2a, 0x00, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xed, 0xea, 0xe6, 0xe0, 0xdb, 0xda, 0xdc, 0xdf, + 0xc6, 0xac, 0xbb, 0xc2, 0xdb, 0xe8, 0xe9, 0xe6, + 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe4, 0xe3, 0xe2, 0xe0, 0xde, 0xdd, 0xdd, 0xde, + 0xcf, 0xc6, 0xd4, 0xa2, 0xc3, 0xc1, 0x94, 0xa3, + 0xcf, 0xde, 0xce, 0xcf, 0xcc, 0xd7, 0xde, 0xe3, + 0xd8, 0xd9, 0xdb, 0xdc, 0xdb, 0xda, 0xd8, 0xd7, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdd, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, 0xda, 0xda, + 0xd9, 0xd9, 0xd8, 0xd7, 0xd6, 0xd5, 0xd5, 0xd5, + 0xe6, 0xd1, 0xce, 0xce, 0xd3, 0xdc, 0xad, 0x63, + 0x6d, 0x72, 0x48, 0x4d, 0x2a, 0x2e, 0x48, 0x51, + 0x3e, 0x6d, 0x8e, 0x83, 0x6b, 0x67, 0x6f, 0x72, + 0x73, 0x6b, 0x70, 0x7b, 0x74, 0x5f, 0x5a, 0x66, + 0x6b, 0x79, 0x7c, 0x6d, 0x60, 0x5e, 0x5c, 0x57, + 0x4a, 0x4a, 0x53, 0x65, 0x70, 0x6c, 0x66, 0x65, + 0x6a, 0x69, 0x64, 0x5d, 0x5b, 0x5b, 0x52, 0x46, + 0x4f, 0x50, 0x4c, 0x48, 0x41, 0x37, 0x47, 0x69, + 0x7b, 0x77, 0x6e, 0x70, 0x73, 0x60, 0x56, 0x66, + 0x68, 0x49, 0x69, 0x51, 0x57, 0x78, 0x85, 0x86, + 0x7f, 0x7d, 0x75, 0x6f, 0x74, 0x7e, 0x7e, 0x77, + 0x82, 0x62, 0x5c, 0x5d, 0x75, 0x8a, 0x7e, 0x82, + 0x7a, 0x70, 0x61, 0x5b, 0x69, 0x7e, 0x82, 0x7a, + 0x6c, 0x5c, 0x62, 0xaf, 0xcf, 0xa0, 0x83, 0x77, + 0x81, 0x90, 0x7c, 0x53, 0x74, 0x88, 0x69, 0x80, + 0x7d, 0x96, 0x84, 0x65, 0x6c, 0x7b, 0x80, 0x8a, + 0xa4, 0x6f, 0x6b, 0x96, 0x76, 0x55, 0x6a, 0x51, + 0x87, 0x7d, 0x7f, 0x8a, 0x79, 0x49, 0x1f, 0x0f, + 0x39, 0x7a, 0xce, 0xff, 0xff, 0xff, 0xfa, 0xfe, + 0xd3, 0xcc, 0xbf, 0x97, 0x5d, 0x64, 0x2e, 0x00, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xea, 0xe8, 0xe6, 0xe3, 0xdf, 0xdb, 0xd6, 0xd3, + 0xd6, 0xbe, 0xbf, 0xc6, 0xe6, 0xec, 0xe8, 0xe1, + 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe5, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe1, 0xe4, 0xe6, 0xe2, 0xdd, 0xda, 0xdd, 0xe1, + 0xd3, 0xc1, 0xcc, 0xc2, 0xc4, 0xad, 0x82, 0xa0, + 0xcf, 0xd2, 0xce, 0xd9, 0xca, 0xd0, 0xdd, 0xdf, + 0xd9, 0xda, 0xdc, 0xdd, 0xdd, 0xdc, 0xda, 0xd9, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdc, 0xdb, 0xdb, 0xda, 0xda, + 0xd9, 0xd9, 0xd8, 0xd8, 0xd7, 0xd6, 0xd6, 0xd5, + 0xd9, 0xd0, 0xda, 0xcc, 0xe8, 0xd6, 0x6a, 0x4f, + 0x8c, 0x67, 0x49, 0x5f, 0x58, 0x67, 0x6c, 0x7d, + 0x44, 0x3e, 0x36, 0x3a, 0x4d, 0x61, 0x67, 0x62, + 0x53, 0x5a, 0x67, 0x72, 0x71, 0x69, 0x65, 0x67, + 0x78, 0x82, 0x81, 0x72, 0x66, 0x67, 0x6b, 0x6b, + 0x79, 0x6d, 0x65, 0x67, 0x6b, 0x6c, 0x6f, 0x75, + 0x63, 0x65, 0x63, 0x5f, 0x61, 0x65, 0x5f, 0x55, + 0x48, 0x46, 0x41, 0x43, 0x43, 0x39, 0x40, 0x5a, + 0x75, 0x6e, 0x6a, 0x6e, 0x69, 0x59, 0x59, 0x69, + 0x4e, 0x59, 0x66, 0x3c, 0x54, 0x75, 0x70, 0x61, + 0x6c, 0x7a, 0x84, 0x83, 0x80, 0x81, 0x80, 0x7d, + 0x7c, 0x78, 0x70, 0x87, 0x85, 0x6a, 0x71, 0x74, + 0x70, 0x87, 0x93, 0x81, 0x68, 0x60, 0x68, 0x71, + 0x6b, 0x71, 0x67, 0x73, 0xd7, 0xd8, 0x6c, 0x70, + 0x82, 0x68, 0x75, 0x79, 0x7c, 0x87, 0x87, 0x9b, + 0x65, 0x79, 0x87, 0x7c, 0x7b, 0x94, 0x8f, 0x65, + 0x6e, 0x94, 0x76, 0x40, 0x5d, 0x8c, 0x91, 0x97, + 0x75, 0x49, 0x15, 0x10, 0x56, 0xbb, 0xfa, 0xff, + 0xff, 0xfc, 0xf8, 0xf6, 0xe9, 0xc2, 0x8b, 0x61, + 0x51, 0x2f, 0x2d, 0x49, 0x3f, 0x3e, 0x16, 0x13, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe6, 0xe5, 0xe6, 0xe5, 0xde, 0xd2, 0xc8, + 0xd7, 0xbc, 0xad, 0xc7, 0xf1, 0xe0, 0xe0, 0xee, + 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe0, 0xe5, 0xe9, 0xe5, 0xdd, 0xda, 0xdd, 0xe3, + 0xd9, 0xc5, 0xb9, 0xcc, 0xb5, 0xae, 0x86, 0x8d, + 0xdd, 0xd0, 0xce, 0xe2, 0xca, 0xce, 0xdc, 0xd7, + 0xdb, 0xdc, 0xdd, 0xdf, 0xdf, 0xde, 0xdc, 0xdb, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xde, 0xdd, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, + 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, + 0xdd, 0xdb, 0xdb, 0xef, 0xa6, 0x63, 0x82, 0x6f, + 0x84, 0x5f, 0x7c, 0xa8, 0x99, 0x7d, 0x49, 0x50, + 0x61, 0x49, 0x3d, 0x52, 0x73, 0x82, 0x77, 0x67, + 0x61, 0x6e, 0x7a, 0x7b, 0x76, 0x6f, 0x66, 0x5e, + 0x74, 0x79, 0x76, 0x68, 0x5e, 0x62, 0x6c, 0x71, + 0x76, 0x6a, 0x62, 0x61, 0x5c, 0x51, 0x49, 0x48, + 0x5e, 0x61, 0x60, 0x5e, 0x60, 0x64, 0x60, 0x57, + 0x4b, 0x4a, 0x45, 0x44, 0x44, 0x3f, 0x4e, 0x6f, + 0x77, 0x7c, 0x7d, 0x84, 0x81, 0x62, 0x4e, 0x5b, + 0x55, 0x5e, 0x4b, 0x33, 0x69, 0x7a, 0x7d, 0x8e, + 0x72, 0x7a, 0x7b, 0x75, 0x74, 0x7e, 0x89, 0x8e, + 0x68, 0x73, 0x60, 0x5f, 0x71, 0x88, 0x9a, 0x85, + 0x85, 0x7a, 0x68, 0x61, 0x6f, 0x85, 0x8b, 0x83, + 0x77, 0x68, 0x6d, 0x63, 0xa5, 0xe7, 0xab, 0x7c, + 0x64, 0x82, 0x85, 0x6f, 0x7c, 0x7e, 0x6d, 0x85, + 0x96, 0x77, 0x7c, 0x8d, 0x77, 0x65, 0x79, 0x91, + 0x9e, 0x8b, 0x82, 0x63, 0x58, 0x41, 0x10, 0x18, + 0x90, 0xd0, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf9, + 0xe0, 0xb2, 0x71, 0x41, 0x33, 0x40, 0x57, 0x67, + 0x4c, 0x3d, 0x34, 0x50, 0x69, 0x71, 0x21, 0x00, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xe6, 0xe4, 0xe7, 0xe9, 0xe4, 0xd6, 0xcb, + 0xd0, 0xd1, 0xb4, 0xb2, 0xde, 0xdd, 0xe3, 0xe5, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe2, 0xe5, 0xe7, 0xe6, 0xe1, 0xde, 0xdf, 0xe0, + 0xda, 0xbf, 0xa4, 0xcf, 0x94, 0x8a, 0x7c, 0x8b, + 0xc7, 0xbf, 0xc3, 0xde, 0xd2, 0xda, 0xe1, 0xd4, + 0xdc, 0xdd, 0xdf, 0xe0, 0xe1, 0xe0, 0xdf, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xdd, 0xdc, 0xdc, 0xdb, 0xdb, + 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xda, 0xd1, 0xed, 0xd4, 0x6c, 0x54, 0x87, 0x87, + 0x9a, 0x5f, 0x67, 0x7d, 0x71, 0x6b, 0x69, 0x8a, + 0x9e, 0x90, 0x7d, 0x6f, 0x6b, 0x6d, 0x70, 0x71, + 0x6c, 0x72, 0x7a, 0x7a, 0x73, 0x68, 0x61, 0x5e, + 0x68, 0x6b, 0x6a, 0x61, 0x59, 0x5b, 0x66, 0x6f, + 0x6e, 0x6b, 0x70, 0x7c, 0x7f, 0x74, 0x67, 0x62, + 0x6d, 0x71, 0x6f, 0x69, 0x66, 0x66, 0x61, 0x59, + 0x4b, 0x4d, 0x4f, 0x54, 0x54, 0x48, 0x4d, 0x65, + 0x76, 0x9b, 0x89, 0x64, 0x6f, 0x79, 0x63, 0x52, + 0x57, 0x76, 0x59, 0x32, 0x65, 0x76, 0x70, 0x60, + 0x7d, 0x80, 0x80, 0x7d, 0x7d, 0x7a, 0x6c, 0x5c, + 0x7f, 0x7c, 0x87, 0x78, 0x72, 0x78, 0x69, 0x6d, + 0x71, 0x80, 0x87, 0x7e, 0x74, 0x73, 0x74, 0x73, + 0x7b, 0x67, 0x6a, 0x77, 0x66, 0xa8, 0xf3, 0xaf, + 0x6a, 0x63, 0x6b, 0x6b, 0x72, 0x90, 0x8c, 0x67, + 0x68, 0x69, 0x60, 0x6a, 0x91, 0xa3, 0x7c, 0x4c, + 0x31, 0x30, 0x1b, 0x27, 0x94, 0xee, 0xf5, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xd7, 0x91, 0x57, 0x3c, + 0x31, 0x29, 0x25, 0x2e, 0x41, 0x50, 0x54, 0x51, + 0x3f, 0x64, 0x5e, 0x48, 0x48, 0x5e, 0x22, 0x06, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xed, 0xe8, 0xe4, 0xe6, 0xea, 0xe8, 0xdf, 0xd7, + 0xd7, 0xd7, 0xaf, 0xa5, 0xda, 0xe3, 0xeb, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe5, 0xe4, 0xe5, 0xe7, 0xe6, 0xe0, 0xdc, + 0xde, 0xd5, 0xae, 0xc5, 0x97, 0xbe, 0xba, 0x8e, + 0xbb, 0xc0, 0xbc, 0xc9, 0xc0, 0xd1, 0xe0, 0xdd, + 0xdb, 0xdd, 0xdf, 0xe1, 0xe1, 0xe1, 0xe0, 0xdf, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xde, 0xde, 0xdd, 0xdc, 0xdc, 0xdc, + 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd2, 0xe9, 0xa8, 0x65, 0x74, 0x88, 0x79, 0x69, + 0x77, 0x51, 0x69, 0x8f, 0x90, 0x7f, 0x76, 0x6a, + 0x74, 0x7b, 0x71, 0x58, 0x53, 0x6d, 0x8f, 0xa0, + 0x87, 0x7f, 0x7e, 0x82, 0x78, 0x66, 0x62, 0x6c, + 0x68, 0x6b, 0x6e, 0x6b, 0x64, 0x62, 0x6a, 0x75, + 0x75, 0x6c, 0x68, 0x6d, 0x6d, 0x66, 0x60, 0x60, + 0x6b, 0x70, 0x6e, 0x66, 0x5f, 0x5d, 0x59, 0x51, + 0x53, 0x4c, 0x44, 0x44, 0x45, 0x3a, 0x3c, 0x51, + 0x7c, 0x5d, 0x53, 0x66, 0x6c, 0x5b, 0x55, 0x5f, + 0x51, 0x60, 0x4e, 0x35, 0x64, 0x83, 0x92, 0x80, + 0x6e, 0x70, 0x6f, 0x6e, 0x77, 0x82, 0x82, 0x7a, + 0x8c, 0x73, 0x69, 0x59, 0x69, 0x89, 0x89, 0x90, + 0x82, 0x75, 0x63, 0x5c, 0x6b, 0x82, 0x88, 0x81, + 0x7a, 0x93, 0x6c, 0x73, 0x61, 0x5c, 0xb7, 0xc7, + 0x8e, 0x69, 0x67, 0x7e, 0x72, 0x66, 0x83, 0x9c, + 0x73, 0x79, 0x92, 0x9c, 0x6f, 0x34, 0x36, 0x60, + 0xb6, 0xe3, 0xfc, 0xfe, 0xf1, 0xfb, 0xff, 0xe6, + 0xaf, 0x73, 0x43, 0x3b, 0x34, 0x1f, 0x1a, 0x28, + 0x31, 0x30, 0x31, 0x36, 0x41, 0x4f, 0x5c, 0x63, + 0x47, 0x3f, 0x27, 0x31, 0x4c, 0x5c, 0x17, 0x02, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xef, 0xea, 0xe6, 0xe6, 0xe8, 0xe8, 0xe4, 0xe0, + 0xdf, 0xc6, 0x9f, 0xa1, 0xdc, 0xe2, 0xe6, 0xf1, + 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe9, 0xe5, 0xe3, 0xe6, 0xeb, 0xea, 0xe2, 0xd9, + 0xcc, 0xc9, 0xba, 0xcd, 0x9e, 0xb0, 0xc1, 0x9c, + 0xbc, 0xcb, 0xc8, 0xcb, 0xba, 0xca, 0xe0, 0xe4, + 0xda, 0xdc, 0xde, 0xe0, 0xe1, 0xe1, 0xe0, 0xe0, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xdd, 0xdd, 0xdc, + 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, + 0xec, 0xd7, 0x73, 0x5d, 0x7a, 0x85, 0x96, 0x75, + 0x8a, 0x60, 0x6c, 0x76, 0x72, 0x6e, 0x82, 0x78, + 0x79, 0x83, 0x7f, 0x70, 0x76, 0x92, 0xa2, 0x9f, + 0x80, 0x72, 0x6f, 0x74, 0x69, 0x55, 0x54, 0x64, + 0x6b, 0x6b, 0x6e, 0x6e, 0x68, 0x62, 0x6a, 0x77, + 0x6d, 0x63, 0x5e, 0x64, 0x67, 0x65, 0x65, 0x68, + 0x6b, 0x72, 0x73, 0x6c, 0x66, 0x65, 0x63, 0x5e, + 0x5f, 0x5e, 0x55, 0x4a, 0x3e, 0x38, 0x53, 0x7e, + 0x80, 0x68, 0x74, 0x78, 0x64, 0x74, 0x7b, 0x50, + 0x5a, 0x50, 0x5d, 0x5f, 0x76, 0x70, 0x69, 0x5b, + 0x83, 0x8a, 0x88, 0x7b, 0x71, 0x70, 0x71, 0x70, + 0x54, 0x82, 0x8b, 0x83, 0x6d, 0x63, 0x70, 0x64, + 0x5d, 0x74, 0x88, 0x8a, 0x82, 0x79, 0x6b, 0x5e, + 0x61, 0x80, 0x60, 0x64, 0x7f, 0x5b, 0x6c, 0xc1, + 0xe5, 0xa9, 0x52, 0x55, 0x7d, 0x6c, 0x64, 0x7c, + 0x86, 0x70, 0x73, 0x72, 0x7d, 0xca, 0xff, 0xf4, + 0xff, 0xfd, 0xff, 0xe6, 0x89, 0x76, 0x8c, 0x39, + 0x17, 0x11, 0x18, 0x28, 0x2a, 0x24, 0x33, 0x4d, + 0x58, 0x64, 0x70, 0x6e, 0x5f, 0x4d, 0x43, 0x40, + 0x5a, 0x52, 0x4d, 0x60, 0x62, 0x5e, 0x1e, 0x10, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xed, 0xeb, 0xe9, 0xe7, 0xe5, 0xe4, 0xe1, 0xe0, + 0xd8, 0xd2, 0xb9, 0x9d, 0xc8, 0xe5, 0xe3, 0xdc, + 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe6, 0xe6, 0xe9, 0xec, 0xe9, 0xe2, 0xdb, + 0xcf, 0xce, 0xcd, 0xc1, 0xa0, 0xa7, 0xba, 0x7e, + 0xa9, 0xb3, 0xc4, 0xde, 0xcd, 0xd9, 0xe8, 0xdf, + 0xd8, 0xda, 0xdc, 0xdf, 0xe0, 0xe0, 0xe0, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe0, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xdd, 0xdd, + 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xde, 0xde, 0xdf, + 0xb7, 0x5c, 0x77, 0x7f, 0x63, 0x71, 0x6e, 0x77, + 0x84, 0x4b, 0x6c, 0x6a, 0x6c, 0x79, 0x8f, 0x94, + 0x7e, 0x7a, 0x6d, 0x60, 0x64, 0x72, 0x77, 0x71, + 0x6e, 0x6b, 0x6e, 0x74, 0x70, 0x67, 0x69, 0x73, + 0x6e, 0x69, 0x67, 0x66, 0x5e, 0x59, 0x65, 0x77, + 0x7c, 0x73, 0x71, 0x75, 0x73, 0x68, 0x5e, 0x5b, + 0x62, 0x6b, 0x6e, 0x66, 0x60, 0x60, 0x60, 0x5d, + 0x49, 0x53, 0x57, 0x52, 0x43, 0x35, 0x48, 0x70, + 0x89, 0x6d, 0x73, 0x77, 0x5a, 0x56, 0x63, 0x58, + 0x54, 0x50, 0x66, 0x51, 0x6a, 0x83, 0x84, 0x7f, + 0x74, 0x78, 0x73, 0x69, 0x69, 0x79, 0x8c, 0x95, + 0x80, 0x78, 0x65, 0x6d, 0x63, 0x52, 0x72, 0x8a, + 0x8a, 0x8b, 0x7e, 0x66, 0x5b, 0x68, 0x7d, 0x8a, + 0x85, 0x71, 0x70, 0x76, 0x87, 0x69, 0x41, 0x6f, + 0xd7, 0xcb, 0x8d, 0x5f, 0x56, 0x6f, 0x87, 0x67, + 0x7d, 0x87, 0x9b, 0x85, 0x71, 0xb2, 0xdf, 0xb4, + 0x69, 0x39, 0x10, 0x1c, 0x1b, 0x01, 0x39, 0xa4, + 0x58, 0x3e, 0x30, 0x42, 0x5c, 0x68, 0x6a, 0x6c, + 0x6f, 0x63, 0x57, 0x58, 0x62, 0x67, 0x61, 0x59, + 0x61, 0x51, 0x49, 0x50, 0x50, 0x6a, 0x31, 0x03, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xec, 0xeb, 0xe8, 0xe3, 0xdf, 0xdc, 0xdb, + 0xd0, 0xd6, 0xd2, 0xad, 0xc7, 0xe5, 0xe8, 0xe6, + 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xeb, 0xeb, 0xec, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe5, 0xe7, 0xea, 0xeb, 0xeb, 0xe7, 0xe2, 0xde, + 0xd4, 0xcc, 0xdf, 0xd1, 0xb4, 0xa0, 0xc2, 0xa0, + 0xb3, 0x9f, 0xab, 0xd1, 0xc2, 0xd5, 0xeb, 0xd9, + 0xd7, 0xd9, 0xdb, 0xde, 0xdf, 0xe0, 0xdf, 0xdf, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xdf, 0xdf, 0xde, 0xde, 0xdd, 0xdd, + 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xdf, 0xdf, + 0x70, 0x5c, 0x68, 0x85, 0x8f, 0x7f, 0x70, 0x78, + 0xab, 0x55, 0x84, 0x80, 0x8a, 0x8f, 0x73, 0x65, + 0x77, 0x74, 0x70, 0x6a, 0x64, 0x63, 0x6c, 0x76, + 0x6d, 0x75, 0x79, 0x76, 0x6f, 0x6a, 0x66, 0x63, + 0x76, 0x6d, 0x66, 0x62, 0x5a, 0x56, 0x66, 0x7c, + 0x71, 0x68, 0x65, 0x6a, 0x6a, 0x61, 0x59, 0x58, + 0x66, 0x6f, 0x72, 0x69, 0x61, 0x60, 0x5f, 0x5c, + 0x69, 0x5d, 0x50, 0x50, 0x53, 0x45, 0x3f, 0x4c, + 0x72, 0x77, 0x7c, 0x84, 0x7b, 0x59, 0x4f, 0x6b, + 0x60, 0x45, 0x58, 0x48, 0x5f, 0x66, 0x61, 0x81, + 0x74, 0x7b, 0x7e, 0x7e, 0x7e, 0x7a, 0x69, 0x56, + 0x6d, 0x73, 0x92, 0x94, 0x8a, 0x7f, 0x69, 0x71, + 0x6e, 0x75, 0x7b, 0x80, 0x89, 0x8e, 0x81, 0x6f, + 0x7c, 0x55, 0x66, 0x7f, 0x92, 0x8b, 0x62, 0x61, + 0xa2, 0xfd, 0xcd, 0x74, 0x67, 0x7a, 0x8b, 0x82, + 0x87, 0x70, 0x73, 0x80, 0x77, 0x6d, 0x69, 0x60, + 0x60, 0x55, 0x4a, 0x32, 0x37, 0x39, 0x3b, 0x77, + 0x74, 0x67, 0x6b, 0x7c, 0x7b, 0x65, 0x59, 0x5e, + 0x78, 0x8b, 0x9d, 0x9c, 0x84, 0x66, 0x51, 0x48, + 0x38, 0x3f, 0x5e, 0x6e, 0x4f, 0x55, 0x28, 0x04, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xe9, 0xe9, 0xea, 0xea, 0xe9, 0xe6, 0xe4, 0xe2, + 0xe4, 0xdd, 0xda, 0x9a, 0xa0, 0xc9, 0xec, 0xe3, + 0xe2, 0xe5, 0xe8, 0xeb, 0xed, 0xec, 0xeb, 0xea, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xed, 0xe7, 0xe9, 0xec, 0xe7, 0xe4, 0xe2, 0xdc, + 0xe3, 0xa5, 0xb2, 0xb9, 0x8a, 0x83, 0xb6, 0xa5, + 0xbf, 0xa8, 0xad, 0xb6, 0xbd, 0xdc, 0xe0, 0xdb, + 0xd7, 0xe2, 0xe2, 0xe3, 0xed, 0xe8, 0xdf, 0xe4, + 0xdc, 0xdd, 0xe0, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xe1, 0xd8, 0xdf, 0xe1, 0xea, 0xc3, 0x41, + 0x46, 0x79, 0x8d, 0x7c, 0x71, 0x94, 0x8d, 0x95, + 0x88, 0x57, 0x82, 0x8d, 0x6c, 0x7a, 0x71, 0x4c, + 0x6d, 0x6c, 0x6a, 0x66, 0x67, 0x70, 0x7d, 0x86, + 0x68, 0x6f, 0x74, 0x6e, 0x65, 0x62, 0x69, 0x72, + 0x7a, 0x6f, 0x67, 0x6d, 0x7e, 0x89, 0x89, 0x84, + 0x7a, 0x72, 0x71, 0x77, 0x77, 0x69, 0x5b, 0x54, + 0x64, 0x68, 0x6a, 0x68, 0x65, 0x5f, 0x54, 0x4a, + 0x53, 0x56, 0x56, 0x4b, 0x3b, 0x3b, 0x58, 0x78, + 0x83, 0x79, 0x69, 0x6e, 0x7a, 0x67, 0x55, 0x5f, + 0x5c, 0x58, 0x64, 0x50, 0x59, 0x7f, 0x7f, 0x8a, + 0x6f, 0x6c, 0x75, 0x75, 0x70, 0x82, 0x8d, 0x7a, + 0x93, 0x7c, 0x7a, 0x68, 0x6a, 0x7a, 0x72, 0x7d, + 0x82, 0x7c, 0x77, 0x65, 0x68, 0x63, 0x82, 0x7f, + 0x69, 0x65, 0x81, 0x4b, 0x31, 0x10, 0x16, 0x2f, + 0x47, 0xa0, 0xef, 0xac, 0x5a, 0x65, 0x6d, 0x67, + 0x8d, 0x8a, 0x8c, 0x7b, 0x7e, 0x7e, 0x6e, 0x90, + 0x84, 0x8e, 0x9c, 0x88, 0x6e, 0x67, 0x5a, 0x4f, + 0x59, 0x63, 0x5a, 0x49, 0x76, 0xa5, 0xaa, 0x8d, + 0x65, 0x3b, 0x23, 0x33, 0x43, 0x3d, 0x36, 0x3b, + 0x4e, 0x4f, 0x4e, 0x3e, 0x47, 0x45, 0x1a, 0x0b, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xe9, 0xea, 0xea, 0xea, 0xe9, 0xe7, 0xe4, 0xe3, + 0xda, 0xdc, 0xd3, 0x80, 0x8f, 0xd1, 0xdd, 0xed, + 0xe3, 0xe5, 0xe8, 0xeb, 0xec, 0xec, 0xeb, 0xea, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xe7, 0xe9, 0xeb, 0xe7, 0xe7, 0xe1, 0xd5, + 0xea, 0xcc, 0xc0, 0xc7, 0x96, 0x8f, 0xdb, 0xa7, + 0xc0, 0xc1, 0x96, 0xa9, 0xda, 0xda, 0xe7, 0xe3, + 0xdf, 0xe1, 0xde, 0xdb, 0xde, 0xde, 0xdc, 0xe0, + 0xdf, 0xe0, 0xe1, 0xe3, 0xe3, 0xe3, 0xe1, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xd8, 0xdc, 0xd4, 0xd9, 0xf3, 0xcc, 0x78, 0x64, + 0x7d, 0x91, 0x91, 0x85, 0x77, 0x85, 0x73, 0x7f, + 0x71, 0x49, 0x68, 0x85, 0x8f, 0x97, 0x88, 0x8f, + 0x85, 0x7b, 0x6b, 0x60, 0x66, 0x74, 0x78, 0x73, + 0x78, 0x79, 0x78, 0x74, 0x6f, 0x6d, 0x6e, 0x70, + 0x5f, 0x64, 0x6d, 0x76, 0x79, 0x73, 0x65, 0x59, + 0x76, 0x73, 0x75, 0x77, 0x6f, 0x5e, 0x53, 0x53, + 0x5a, 0x59, 0x57, 0x53, 0x4d, 0x4a, 0x4f, 0x56, + 0x55, 0x4d, 0x47, 0x43, 0x40, 0x43, 0x52, 0x63, + 0x77, 0x80, 0x81, 0x7d, 0x70, 0x50, 0x40, 0x50, + 0x69, 0x58, 0x54, 0x37, 0x43, 0x70, 0x75, 0x80, + 0x7d, 0x7e, 0x84, 0x85, 0x7f, 0x7e, 0x79, 0x6c, + 0x72, 0x70, 0x81, 0x7b, 0x7c, 0x7f, 0x65, 0x5e, + 0x6b, 0x71, 0x8f, 0x70, 0x78, 0x6c, 0x4d, 0x4f, + 0x23, 0x4d, 0xa1, 0xb5, 0xf1, 0xff, 0xf4, 0xc2, + 0x88, 0x59, 0x9f, 0xd6, 0xa5, 0x78, 0x77, 0x8f, + 0x65, 0x7c, 0x7d, 0x65, 0x73, 0x8c, 0x87, 0x87, + 0x96, 0x83, 0x74, 0x6a, 0x6e, 0x79, 0x72, 0x66, + 0x69, 0x6e, 0x78, 0x91, 0x5c, 0x18, 0x1c, 0x3d, + 0x23, 0x2c, 0x45, 0x5d, 0x5a, 0x48, 0x46, 0x54, + 0x67, 0x5c, 0x52, 0x48, 0x5e, 0x5d, 0x22, 0x02, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xea, 0xeb, 0xeb, 0xe9, 0xe7, 0xe5, 0xe3, + 0xe1, 0xc7, 0xd7, 0x94, 0x84, 0xe8, 0xe5, 0xd9, + 0xe5, 0xe6, 0xe8, 0xea, 0xeb, 0xeb, 0xeb, 0xea, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xe8, 0xea, 0xe9, 0xe8, 0xeb, 0xe0, 0xca, + 0xe5, 0xd4, 0xbf, 0xdd, 0xb5, 0x7b, 0xbe, 0xae, + 0xaf, 0xb1, 0x81, 0x9c, 0xe5, 0xca, 0xd5, 0xd9, + 0xd9, 0xd7, 0xdb, 0xdd, 0xda, 0xd9, 0xda, 0xd5, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe8, 0xd5, 0xcf, 0xfd, 0xc7, 0x59, 0x63, 0x90, + 0x8b, 0x79, 0x6c, 0x7d, 0x8b, 0x95, 0x72, 0x77, + 0x70, 0x77, 0x9c, 0x97, 0x89, 0x7e, 0x61, 0x6c, + 0x74, 0x80, 0x84, 0x7a, 0x6e, 0x6c, 0x6d, 0x6c, + 0x66, 0x64, 0x63, 0x65, 0x69, 0x6c, 0x6b, 0x69, + 0x5b, 0x63, 0x6c, 0x6f, 0x6a, 0x62, 0x5c, 0x59, + 0x66, 0x67, 0x6c, 0x6e, 0x64, 0x58, 0x57, 0x5f, + 0x63, 0x5b, 0x5e, 0x6c, 0x71, 0x64, 0x56, 0x52, + 0x58, 0x49, 0x3c, 0x3a, 0x3f, 0x4c, 0x62, 0x75, + 0x8b, 0x7d, 0x69, 0x67, 0x70, 0x66, 0x52, 0x4b, + 0x5a, 0x51, 0x5c, 0x4e, 0x61, 0x87, 0x7c, 0x7a, + 0x7f, 0x77, 0x6a, 0x69, 0x74, 0x78, 0x7b, 0x85, + 0x7a, 0x7c, 0x7f, 0x68, 0x61, 0x72, 0x7a, 0x85, + 0x7a, 0x7b, 0x57, 0x53, 0x60, 0x5f, 0xb4, 0xc7, + 0xdc, 0xfc, 0xf2, 0xd0, 0xfb, 0xe3, 0xc3, 0xeb, + 0xff, 0x89, 0x7e, 0xce, 0xdb, 0x88, 0x3c, 0x3b, + 0x57, 0x54, 0x5a, 0x84, 0x92, 0x70, 0x68, 0x7b, + 0x5c, 0x84, 0x97, 0x87, 0x75, 0x74, 0x74, 0x6d, + 0x94, 0xb2, 0xa7, 0xbe, 0x60, 0x2d, 0x4c, 0x5f, + 0x68, 0x60, 0x58, 0x51, 0x47, 0x3c, 0x36, 0x37, + 0x4f, 0x4b, 0x4b, 0x49, 0x61, 0x60, 0x24, 0x04, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xeb, 0xeb, 0xeb, 0xea, 0xe8, 0xe5, 0xe4, + 0xef, 0xd8, 0xdd, 0xa7, 0x8b, 0xef, 0xe9, 0xe9, + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xea, 0xe8, 0xe9, 0xee, 0xe0, 0xc4, + 0xe9, 0xe1, 0xbb, 0xc7, 0xbe, 0x78, 0x98, 0xb9, + 0x81, 0x8e, 0xa3, 0xa4, 0xda, 0xd7, 0xe1, 0xe6, + 0xca, 0xc6, 0xd3, 0xdd, 0xda, 0xe0, 0xe6, 0xdf, + 0xe4, 0xe5, 0xe6, 0xe6, 0xe5, 0xe4, 0xe2, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xdf, 0xdd, 0xf6, 0xcb, 0x71, 0x64, 0x80, 0x7e, + 0x90, 0x87, 0x80, 0x87, 0x82, 0x86, 0x7a, 0x9b, + 0x7a, 0x6d, 0x7e, 0x6c, 0x67, 0x80, 0x78, 0x79, + 0x93, 0x81, 0x6d, 0x64, 0x66, 0x6e, 0x7b, 0x86, + 0x7c, 0x7c, 0x7c, 0x7a, 0x78, 0x74, 0x71, 0x6f, + 0x79, 0x79, 0x78, 0x74, 0x6e, 0x6b, 0x6b, 0x6d, + 0x7d, 0x76, 0x70, 0x6b, 0x61, 0x56, 0x58, 0x60, + 0x6b, 0x5f, 0x5a, 0x5a, 0x4f, 0x42, 0x4c, 0x62, + 0x4e, 0x4e, 0x4f, 0x4d, 0x45, 0x45, 0x58, 0x6e, + 0x83, 0x85, 0x81, 0x7a, 0x74, 0x67, 0x53, 0x46, + 0x52, 0x49, 0x51, 0x3b, 0x46, 0x6b, 0x65, 0x6a, + 0x74, 0x81, 0x83, 0x87, 0x89, 0x74, 0x6b, 0x80, + 0x66, 0x7b, 0x8a, 0x7f, 0x70, 0x64, 0x4d, 0x3a, + 0x31, 0x50, 0x9e, 0xa5, 0xed, 0xff, 0xdd, 0xe5, + 0xf4, 0xa7, 0x7b, 0x65, 0x40, 0x11, 0x12, 0x2c, + 0x5a, 0x70, 0x58, 0x5b, 0xab, 0xd3, 0xcd, 0xe8, + 0x9c, 0x8f, 0x59, 0x40, 0x39, 0x42, 0x72, 0x86, + 0x97, 0x94, 0x7a, 0x7e, 0x9a, 0xad, 0xb7, 0xb2, + 0xb9, 0xc2, 0xa7, 0xf4, 0x90, 0x45, 0x57, 0x5a, + 0x4c, 0x3f, 0x32, 0x33, 0x43, 0x4c, 0x42, 0x32, + 0x35, 0x49, 0x5e, 0x57, 0x59, 0x4c, 0x1c, 0x0d, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xec, 0xec, 0xea, 0xe8, 0xe6, 0xe4, + 0xe7, 0xd7, 0xe1, 0xcf, 0x9c, 0xe4, 0xef, 0xed, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xeb, 0xe8, 0xe9, 0xef, 0xe2, 0xc5, + 0xc1, 0xe4, 0xc1, 0xb0, 0xc0, 0x95, 0x95, 0xa3, + 0xab, 0xb3, 0xd4, 0xa7, 0xc2, 0xdf, 0xe2, 0xd1, + 0xda, 0xd1, 0xd6, 0xd9, 0xd4, 0xdc, 0xe7, 0xe3, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe5, 0xe4, 0xe2, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xdf, 0xff, 0xd6, 0x62, 0x4a, 0x8b, 0x9b, 0x86, + 0x71, 0x81, 0x8e, 0x96, 0x87, 0x80, 0x65, 0x79, + 0x63, 0x55, 0x74, 0x81, 0x89, 0x8c, 0x6f, 0x73, + 0x7f, 0x71, 0x72, 0x82, 0x84, 0x74, 0x6e, 0x75, + 0x63, 0x6d, 0x76, 0x78, 0x73, 0x71, 0x75, 0x7b, + 0x78, 0x7b, 0x81, 0x88, 0x8d, 0x8d, 0x87, 0x82, + 0x7f, 0x70, 0x65, 0x65, 0x68, 0x69, 0x6e, 0x75, + 0x73, 0x5c, 0x50, 0x58, 0x5c, 0x53, 0x50, 0x56, + 0x48, 0x48, 0x47, 0x40, 0x37, 0x40, 0x63, 0x87, + 0x79, 0x7a, 0x78, 0x75, 0x78, 0x79, 0x65, 0x48, + 0x38, 0x3f, 0x57, 0x48, 0x50, 0x73, 0x73, 0x7f, + 0x73, 0x71, 0x64, 0x66, 0x75, 0x71, 0x73, 0x8d, + 0x85, 0x5f, 0x2a, 0x1c, 0x47, 0x8f, 0xcc, 0xe2, + 0xf7, 0xff, 0xac, 0xb9, 0xf3, 0x8f, 0x53, 0x3c, + 0x37, 0x3e, 0x28, 0x3b, 0x54, 0x36, 0x14, 0x27, + 0x4b, 0x3a, 0x27, 0x5b, 0xb1, 0xc1, 0xa7, 0xa0, + 0xad, 0xcd, 0xe2, 0xf8, 0xd5, 0x8d, 0x69, 0x45, + 0x23, 0x3a, 0x53, 0x9e, 0xcd, 0xb7, 0xb0, 0xb6, + 0x9c, 0xa2, 0x94, 0xff, 0xb4, 0x4d, 0x5a, 0x63, + 0x59, 0x5c, 0x58, 0x4c, 0x40, 0x39, 0x35, 0x31, + 0x4d, 0x6a, 0x84, 0x72, 0x60, 0x46, 0x17, 0x10, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xec, 0xec, 0xec, 0xeb, 0xe9, 0xe6, 0xe5, + 0xeb, 0xc3, 0xba, 0xba, 0x86, 0xc4, 0xe9, 0xe1, + 0xea, 0xe9, 0xe8, 0xe7, 0xe7, 0xe8, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe8, 0xea, 0xea, 0xea, 0xee, 0xe4, 0xcf, + 0xcd, 0xeb, 0xc9, 0xb3, 0xb2, 0x7b, 0x88, 0xae, + 0x81, 0x8d, 0xb1, 0xad, 0xca, 0xd6, 0xdd, 0xdc, + 0xe3, 0xdf, 0xde, 0xdd, 0xd9, 0xdb, 0xdf, 0xdd, + 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, 0xe4, 0xe3, 0xe3, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf3, 0xc8, 0x7f, 0x6d, 0x7b, 0x7e, 0x88, 0x87, + 0x92, 0x8c, 0x7c, 0x78, 0x79, 0x8f, 0x80, 0x91, + 0x74, 0x7e, 0x8c, 0x7a, 0x80, 0x82, 0x66, 0x7a, + 0x86, 0x7d, 0x7e, 0x81, 0x75, 0x63, 0x67, 0x79, + 0x69, 0x75, 0x7f, 0x7d, 0x71, 0x6a, 0x6c, 0x71, + 0x7a, 0x7c, 0x82, 0x8a, 0x90, 0x90, 0x8a, 0x85, + 0x81, 0x71, 0x64, 0x64, 0x66, 0x63, 0x61, 0x62, + 0x4e, 0x54, 0x64, 0x72, 0x6b, 0x58, 0x50, 0x54, + 0x40, 0x40, 0x40, 0x3e, 0x37, 0x38, 0x4b, 0x62, + 0x81, 0x87, 0x86, 0x72, 0x62, 0x65, 0x5b, 0x3e, + 0x42, 0x48, 0x5c, 0x43, 0x41, 0x60, 0x65, 0x76, + 0x75, 0x85, 0x90, 0x8d, 0x78, 0x4e, 0x2b, 0x22, + 0x59, 0xa1, 0xe8, 0xff, 0xff, 0xe1, 0xde, 0xdf, + 0xe3, 0x81, 0x5e, 0x34, 0x40, 0x2e, 0x13, 0x3b, + 0x26, 0x31, 0x50, 0x74, 0x3d, 0x2b, 0x2e, 0x17, + 0x41, 0x3e, 0x3e, 0x31, 0x36, 0x98, 0xd1, 0x80, + 0x1d, 0x3b, 0x60, 0x86, 0xa0, 0xc2, 0xe8, 0xe8, + 0xd5, 0xbb, 0x6d, 0x73, 0xa9, 0xb7, 0xba, 0xa7, + 0xae, 0xbf, 0xa6, 0xf3, 0xb0, 0x5d, 0x67, 0x59, + 0x70, 0x6a, 0x5d, 0x48, 0x33, 0x2d, 0x3e, 0x54, + 0x5a, 0x6d, 0x7e, 0x6f, 0x68, 0x53, 0x1f, 0x0f, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xed, 0xed, 0xeb, 0xe9, 0xe7, 0xe5, + 0xeb, 0xe4, 0xc4, 0xb8, 0xaf, 0xcb, 0xce, 0xe5, + 0xec, 0xea, 0xe8, 0xe7, 0xe6, 0xe8, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xe7, 0xea, 0xed, 0xeb, 0xeb, 0xe7, 0xdb, + 0xc3, 0xce, 0xcc, 0xc4, 0xc7, 0x83, 0x7f, 0xd7, + 0xb2, 0x7f, 0x74, 0x9c, 0xca, 0xd0, 0xcc, 0xd1, + 0xd6, 0xdb, 0xdc, 0xdd, 0xe3, 0xe4, 0xe2, 0xe5, + 0xdb, 0xdd, 0xdf, 0xe2, 0xe4, 0xe5, 0xe4, 0xe4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe1, 0x6c, 0x5f, 0x76, 0x86, 0x92, 0x7a, 0x82, + 0x85, 0x8a, 0x84, 0x7b, 0x6c, 0x76, 0x6f, 0x8e, + 0x62, 0x6b, 0x78, 0x61, 0x73, 0x98, 0x89, 0x8b, + 0x96, 0x89, 0x77, 0x6c, 0x6c, 0x6f, 0x6c, 0x66, + 0x5c, 0x65, 0x6f, 0x73, 0x70, 0x6d, 0x6d, 0x6f, + 0x87, 0x86, 0x82, 0x7a, 0x73, 0x71, 0x75, 0x7a, + 0x6f, 0x6c, 0x6f, 0x78, 0x79, 0x71, 0x6b, 0x6c, + 0x6d, 0x63, 0x59, 0x57, 0x5b, 0x60, 0x63, 0x66, + 0x59, 0x51, 0x49, 0x45, 0x44, 0x4d, 0x66, 0x7e, + 0x79, 0x74, 0x72, 0x70, 0x78, 0x88, 0x6a, 0x2b, + 0x30, 0x3e, 0x5e, 0x52, 0x53, 0x69, 0x5c, 0x60, + 0x8a, 0x5a, 0x36, 0x46, 0x86, 0xd2, 0xf9, 0xf7, + 0xf8, 0xff, 0xff, 0xff, 0xd6, 0x83, 0x4e, 0x2a, + 0x1f, 0x31, 0x44, 0x47, 0x4e, 0x66, 0x94, 0x53, + 0x20, 0x46, 0x3b, 0x65, 0x61, 0x42, 0x2d, 0x45, + 0x58, 0x51, 0x46, 0x2c, 0x18, 0x74, 0xe0, 0xc4, + 0x7c, 0x26, 0x18, 0x3e, 0x39, 0x1e, 0x2f, 0x66, + 0x8b, 0xd7, 0xd3, 0xcf, 0xc7, 0xa7, 0xb0, 0xaf, + 0xaf, 0xa6, 0x92, 0xdd, 0xb7, 0x43, 0x3a, 0x39, + 0x42, 0x35, 0x31, 0x38, 0x38, 0x33, 0x3f, 0x54, + 0x50, 0x58, 0x62, 0x5a, 0x62, 0x57, 0x22, 0x0c, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xed, 0xed, 0xed, 0xec, 0xe9, 0xe7, 0xe5, + 0xed, 0xf4, 0xe3, 0xc4, 0xad, 0xba, 0xc0, 0xe9, + 0xed, 0xeb, 0xe8, 0xe6, 0xe6, 0xe7, 0xea, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xec, 0xe6, 0xea, 0xef, 0xeb, 0xe9, 0xe9, 0xe4, + 0xc8, 0xcc, 0xce, 0x9d, 0xb9, 0x9b, 0x68, 0xc8, + 0xb5, 0x98, 0xb1, 0xd3, 0xd1, 0xcd, 0xca, 0xdd, + 0xe2, 0xe6, 0xdc, 0xd6, 0xde, 0xdd, 0xdc, 0xe6, + 0xd8, 0xda, 0xdd, 0xe1, 0xe3, 0xe5, 0xe5, 0xe5, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0x68, 0x64, 0x6c, 0x7a, 0x8d, 0x94, 0x88, 0x82, + 0x7f, 0x82, 0x83, 0x88, 0x7d, 0x7e, 0x6c, 0x88, + 0x62, 0x5c, 0x88, 0x80, 0x62, 0x6c, 0x6b, 0x6e, + 0x79, 0x8a, 0x8a, 0x75, 0x6b, 0x71, 0x6c, 0x5b, + 0x5b, 0x5e, 0x63, 0x69, 0x6b, 0x68, 0x62, 0x5d, + 0x65, 0x6d, 0x72, 0x6e, 0x68, 0x6c, 0x7c, 0x8c, + 0x7c, 0x84, 0x94, 0x9f, 0x98, 0x86, 0x7b, 0x7b, + 0x6a, 0x68, 0x62, 0x59, 0x55, 0x58, 0x5d, 0x5e, + 0x53, 0x50, 0x4c, 0x48, 0x42, 0x45, 0x5b, 0x72, + 0x71, 0x7b, 0x82, 0x75, 0x6d, 0x7f, 0x75, 0x48, + 0x4f, 0x4e, 0x5d, 0x46, 0x49, 0x64, 0x5a, 0x5d, + 0x7b, 0x98, 0xcf, 0xf6, 0xff, 0xff, 0xf3, 0xcd, + 0xbe, 0x7c, 0x26, 0x18, 0x1e, 0x23, 0x49, 0x5b, + 0x2d, 0x3d, 0x54, 0x59, 0x8a, 0x7a, 0x4a, 0x2e, + 0x20, 0x48, 0x37, 0x61, 0x5f, 0x4f, 0x3e, 0x49, + 0x54, 0x53, 0x2a, 0x2f, 0x49, 0x5a, 0x95, 0xc3, + 0xc8, 0x5a, 0x33, 0x33, 0x28, 0x1f, 0x22, 0x48, + 0x3f, 0x2f, 0x03, 0x57, 0xbb, 0xbc, 0xc0, 0xbe, + 0xb4, 0xa5, 0x9c, 0xdc, 0xb9, 0x29, 0x1d, 0x34, + 0x42, 0x37, 0x3c, 0x4c, 0x47, 0x36, 0x3e, 0x58, + 0x55, 0x5b, 0x62, 0x55, 0x5a, 0x4f, 0x1b, 0x06, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xee, 0xee, 0xe9, 0xe6, 0xea, 0xef, 0xe9, 0xdd, + 0xd7, 0xf0, 0xeb, 0xc4, 0xb3, 0xb8, 0xba, 0xde, + 0xf4, 0xeb, 0xd9, 0xf5, 0xe8, 0xe8, 0xee, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xec, 0xed, 0xeb, 0xe9, 0xe9, 0xec, 0xf0, + 0xcd, 0xbc, 0xe0, 0xba, 0x9c, 0x95, 0x90, 0xaa, + 0xad, 0xa6, 0xa7, 0xcb, 0xd2, 0xb8, 0xc5, 0xe2, + 0xd2, 0xc9, 0xd0, 0xd8, 0xd9, 0xe4, 0xe7, 0xd5, + 0xd9, 0xe8, 0xdd, 0xe0, 0xe6, 0xe2, 0xe6, 0xdd, + 0xe1, 0xdf, 0xe1, 0xe8, 0xd2, 0xf7, 0xe4, 0x67, + 0x64, 0x8e, 0x93, 0x90, 0x91, 0x83, 0x84, 0x93, + 0x9f, 0x8b, 0x69, 0x62, 0x7c, 0x86, 0x7a, 0x76, + 0x4a, 0x67, 0x7b, 0x84, 0x85, 0x75, 0x69, 0x6f, + 0x82, 0x82, 0x7b, 0x6d, 0x65, 0x69, 0x74, 0x7d, + 0x74, 0x6e, 0x6f, 0x76, 0x73, 0x65, 0x5d, 0x5f, + 0x60, 0x62, 0x63, 0x65, 0x6b, 0x7a, 0x8d, 0x9b, + 0x90, 0x76, 0x66, 0x6f, 0x7b, 0x77, 0x6a, 0x63, + 0x57, 0x58, 0x4d, 0x3e, 0x3f, 0x50, 0x5c, 0x5d, + 0x42, 0x47, 0x46, 0x3d, 0x3e, 0x53, 0x73, 0x8a, + 0x89, 0x64, 0x69, 0x60, 0x68, 0x7f, 0x61, 0x4c, + 0x54, 0x61, 0x55, 0x2b, 0x4b, 0x57, 0x55, 0xcd, + 0xff, 0xf3, 0xf6, 0xed, 0x84, 0x3b, 0x43, 0x1b, + 0x24, 0x31, 0x2e, 0x2f, 0x2e, 0x2f, 0x28, 0x48, + 0x62, 0x3e, 0x5f, 0x71, 0x5f, 0x5d, 0x4a, 0x32, + 0x48, 0x51, 0x5e, 0x6e, 0x6e, 0x52, 0x44, 0x55, + 0x58, 0x41, 0x2f, 0x52, 0x67, 0x30, 0x30, 0x8f, + 0xe3, 0xe3, 0x5c, 0x12, 0x22, 0x2b, 0x3c, 0x2a, + 0x15, 0x0c, 0x07, 0x39, 0xbe, 0xce, 0xba, 0xbc, + 0xab, 0xab, 0x9d, 0xe8, 0xff, 0x71, 0x4b, 0x62, + 0x4b, 0x38, 0x2e, 0x3a, 0x4a, 0x50, 0x52, 0x55, + 0x43, 0x5b, 0x59, 0x6d, 0x60, 0x47, 0x1f, 0x11, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xf0, 0xec, 0xe9, 0xe9, 0xe9, 0xe6, 0xe3, 0xe2, + 0xd8, 0xe7, 0xf4, 0xc2, 0x9b, 0xc0, 0xcb, 0xd1, + 0xd6, 0xea, 0xda, 0xe7, 0xe7, 0xed, 0xea, 0xea, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xec, 0xed, 0xeb, 0xe8, 0xe8, 0xec, 0xef, + 0xd6, 0xa2, 0xe0, 0xcf, 0x8a, 0x7b, 0x80, 0xab, + 0x9a, 0x94, 0x8e, 0xc6, 0xcc, 0xbb, 0xcb, 0xea, + 0xd2, 0xd4, 0xe2, 0xe7, 0xde, 0xdf, 0xe0, 0xd3, + 0xd3, 0xdc, 0xdd, 0xe5, 0xe7, 0xdc, 0xdd, 0xe5, + 0xdf, 0xe1, 0xe2, 0xe6, 0xfb, 0xce, 0x66, 0x5c, + 0x5f, 0x50, 0x46, 0x52, 0x47, 0x44, 0x50, 0x30, + 0x2b, 0x4c, 0x65, 0x74, 0x7f, 0x79, 0x76, 0x83, + 0x64, 0x72, 0x88, 0x87, 0x81, 0x96, 0x91, 0x62, + 0x6c, 0x7e, 0x85, 0x7a, 0x73, 0x74, 0x6c, 0x5c, + 0x61, 0x5f, 0x64, 0x6f, 0x71, 0x6a, 0x68, 0x6b, + 0x74, 0x79, 0x7b, 0x73, 0x69, 0x68, 0x74, 0x80, + 0x7b, 0x77, 0x79, 0x80, 0x7b, 0x6e, 0x69, 0x6d, + 0x5c, 0x61, 0x5f, 0x56, 0x54, 0x59, 0x58, 0x51, + 0x41, 0x43, 0x42, 0x3d, 0x3c, 0x48, 0x61, 0x76, + 0x8c, 0x7d, 0x8d, 0x77, 0x5d, 0x5e, 0x4b, 0x46, + 0x4a, 0x57, 0x48, 0x28, 0x48, 0x5a, 0x5f, 0xb4, + 0x8e, 0x4a, 0x13, 0x42, 0x56, 0x27, 0x28, 0x3f, + 0x41, 0x39, 0x51, 0x58, 0x3e, 0x48, 0x63, 0x85, + 0x90, 0x7d, 0x86, 0x86, 0x80, 0x69, 0x47, 0x51, + 0x65, 0x8d, 0x8d, 0x84, 0x8f, 0x79, 0x51, 0x4d, + 0x43, 0x37, 0x52, 0x66, 0x46, 0x2f, 0x35, 0x34, + 0x9a, 0xdc, 0xbd, 0x3e, 0x12, 0x3f, 0x3d, 0x17, + 0x1b, 0x16, 0x11, 0x3b, 0xb3, 0xb4, 0x92, 0x8a, + 0xa1, 0xbc, 0xaa, 0xca, 0xe3, 0x6d, 0x48, 0x44, + 0x39, 0x47, 0x4e, 0x41, 0x2e, 0x29, 0x37, 0x47, + 0x48, 0x51, 0x3d, 0x42, 0x3d, 0x37, 0x14, 0x04, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xf1, 0xeb, 0xea, 0xec, 0xe8, 0xdf, 0xde, 0xe4, + 0xc9, 0xce, 0xf9, 0xe3, 0xad, 0xc1, 0xbe, 0xd0, + 0xc6, 0xdf, 0xdb, 0xe6, 0xec, 0xf4, 0xf0, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xec, 0xed, 0xea, 0xe8, 0xe8, 0xeb, 0xee, + 0xe9, 0xa1, 0xc7, 0xd5, 0xb3, 0xa5, 0x8e, 0xbd, + 0xa6, 0x9c, 0x89, 0xc3, 0xcb, 0xbe, 0xd0, 0xde, + 0xde, 0xe5, 0xda, 0xce, 0xda, 0xe6, 0xdd, 0xd1, + 0xec, 0xe8, 0xe6, 0xe3, 0xe4, 0xe1, 0xde, 0xed, + 0xe9, 0xf9, 0xfd, 0xff, 0x9c, 0x1e, 0x43, 0x82, + 0xa0, 0xbf, 0xc9, 0xd3, 0xe0, 0xfc, 0xee, 0x92, + 0x45, 0x5c, 0x6d, 0x7e, 0x90, 0x8b, 0x7c, 0x7d, + 0x63, 0x6a, 0x7e, 0x7f, 0x6c, 0x6a, 0x6a, 0x5b, + 0x6d, 0x6c, 0x70, 0x74, 0x70, 0x67, 0x65, 0x6a, + 0x64, 0x67, 0x6d, 0x6f, 0x68, 0x5e, 0x5c, 0x62, + 0x6a, 0x71, 0x74, 0x6a, 0x5d, 0x5d, 0x6d, 0x7d, + 0x7a, 0x7d, 0x83, 0x84, 0x78, 0x6b, 0x6a, 0x73, + 0x78, 0x79, 0x74, 0x69, 0x63, 0x63, 0x60, 0x5a, + 0x52, 0x58, 0x50, 0x3e, 0x3b, 0x4e, 0x63, 0x6b, + 0x5b, 0x43, 0x48, 0x5b, 0x95, 0xce, 0xa8, 0x64, + 0x59, 0x69, 0x5e, 0x54, 0x68, 0x5e, 0x34, 0x2e, + 0x39, 0x55, 0x47, 0x2c, 0x32, 0x5c, 0x67, 0x2d, + 0x54, 0x2e, 0x5e, 0x95, 0x95, 0x73, 0x5e, 0x71, + 0x54, 0x5e, 0x87, 0x8e, 0x74, 0x53, 0x4a, 0x77, + 0x98, 0xa5, 0x97, 0x77, 0x66, 0x62, 0x5e, 0x5a, + 0x37, 0x55, 0x5a, 0x41, 0x37, 0x45, 0x48, 0x39, + 0x64, 0xae, 0xcc, 0x8d, 0x32, 0x1c, 0x35, 0x2d, + 0x25, 0x1c, 0x0f, 0x31, 0xae, 0xc4, 0xb8, 0xbd, + 0xc1, 0xb9, 0x98, 0xbe, 0xe7, 0x7c, 0x5b, 0x67, + 0x64, 0x74, 0x76, 0x5e, 0x46, 0x41, 0x43, 0x43, + 0x60, 0x6d, 0x60, 0x60, 0x54, 0x4a, 0x1c, 0x08, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xee, 0xeb, 0xeb, 0xed, 0xea, 0xe2, 0xdd, 0xdd, + 0xcf, 0xc5, 0xe3, 0xdf, 0xbe, 0xc3, 0xad, 0xe5, + 0xd6, 0xd2, 0xd8, 0xe9, 0xea, 0xee, 0xef, 0xe5, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xec, 0xec, 0xea, 0xe7, 0xe7, 0xea, 0xed, + 0xea, 0xbc, 0xcc, 0xe1, 0xbc, 0x98, 0x84, 0xad, + 0xa0, 0x9e, 0x9a, 0xc8, 0xdf, 0xcc, 0xe0, 0xd0, + 0xea, 0xea, 0xca, 0xb9, 0xc3, 0xb9, 0xb6, 0xd7, + 0xe1, 0xe7, 0xee, 0xde, 0xe0, 0xef, 0xef, 0xff, + 0xd7, 0x90, 0x45, 0x67, 0xc7, 0xf4, 0xff, 0xe3, + 0xa5, 0x99, 0x8b, 0x7d, 0x67, 0x5b, 0x58, 0x4c, + 0x55, 0x6b, 0x76, 0x7a, 0x81, 0x7f, 0x7f, 0x8e, + 0x4d, 0x6b, 0x72, 0x74, 0x7e, 0x6f, 0x69, 0x87, + 0xa2, 0x7c, 0x63, 0x6b, 0x74, 0x6e, 0x6a, 0x70, + 0x73, 0x6b, 0x65, 0x68, 0x6c, 0x69, 0x5f, 0x56, + 0x56, 0x60, 0x6a, 0x6c, 0x69, 0x6b, 0x75, 0x7e, + 0x76, 0x6f, 0x6a, 0x6b, 0x6f, 0x72, 0x76, 0x79, + 0x80, 0x80, 0x7b, 0x73, 0x6c, 0x67, 0x62, 0x5d, + 0x4e, 0x4f, 0x4c, 0x3f, 0x30, 0x38, 0x60, 0x89, + 0xb6, 0xe5, 0xfa, 0xc7, 0x9a, 0xa1, 0x8d, 0x59, + 0x33, 0x60, 0x69, 0x5b, 0x51, 0x4e, 0x53, 0x4e, + 0x6b, 0x4f, 0x41, 0x4a, 0x50, 0x5c, 0x67, 0x5a, + 0x55, 0x61, 0x69, 0x2b, 0x28, 0x32, 0x2b, 0x3f, + 0x51, 0x2d, 0x5b, 0x7d, 0x6c, 0x6c, 0x78, 0x88, + 0x88, 0x71, 0x94, 0x9e, 0x67, 0x60, 0x79, 0x62, + 0x61, 0x51, 0x41, 0x41, 0x4c, 0x4c, 0x40, 0x37, + 0x25, 0x85, 0xe5, 0xec, 0x81, 0x29, 0x2d, 0x32, + 0x24, 0x25, 0x1d, 0x3b, 0xb3, 0xc6, 0xb5, 0xb4, + 0xb0, 0x99, 0x8c, 0xd2, 0xff, 0x94, 0x4c, 0x4c, + 0x4b, 0x51, 0x55, 0x5b, 0x67, 0x74, 0x75, 0x6f, + 0x54, 0x50, 0x44, 0x50, 0x57, 0x56, 0x21, 0x0f, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xec, 0xec, 0xec, 0xee, 0xec, 0xe1, 0xd4, + 0xd4, 0xcd, 0xd1, 0xc5, 0xb4, 0xc8, 0xa0, 0xd1, + 0xd7, 0xc3, 0xc8, 0xd6, 0xe5, 0xee, 0xee, 0xe4, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xec, 0xea, 0xe6, 0xe6, 0xe8, 0xeb, + 0xf8, 0xc5, 0xc0, 0xec, 0xc2, 0x84, 0x8c, 0x8b, + 0x9b, 0x86, 0x9f, 0xc8, 0xdc, 0xaa, 0xdc, 0xf1, + 0xdb, 0xe9, 0xd0, 0xac, 0xaf, 0xc4, 0xd0, 0xd7, + 0xc9, 0xca, 0xd7, 0xda, 0xe1, 0xc9, 0x80, 0x54, + 0x94, 0xd5, 0xff, 0xeb, 0xb7, 0xcb, 0xf5, 0xeb, + 0x98, 0x8f, 0xa3, 0xa7, 0xaf, 0xbf, 0x97, 0x62, + 0x6b, 0x83, 0x8e, 0x8c, 0x89, 0x7b, 0x74, 0x80, + 0x5a, 0x84, 0x7c, 0x6c, 0x8b, 0x97, 0x83, 0x7f, + 0x80, 0x77, 0x6c, 0x68, 0x6b, 0x6d, 0x6a, 0x66, + 0x66, 0x6a, 0x6e, 0x6d, 0x6b, 0x6b, 0x6c, 0x6c, + 0x68, 0x6e, 0x78, 0x7f, 0x81, 0x7c, 0x72, 0x6b, + 0x66, 0x60, 0x5b, 0x5f, 0x6f, 0x7f, 0x85, 0x84, + 0x70, 0x74, 0x7b, 0x7f, 0x79, 0x6a, 0x5b, 0x52, + 0x4c, 0x4f, 0x40, 0x37, 0x66, 0xbb, 0xf3, 0xfc, + 0xf5, 0xe4, 0xae, 0x67, 0x44, 0x59, 0x65, 0x44, + 0x50, 0x62, 0x58, 0x4d, 0x54, 0x5e, 0x54, 0x2e, + 0x72, 0x7d, 0x6a, 0x58, 0x64, 0x56, 0x42, 0x5b, + 0x42, 0x6e, 0x95, 0x3c, 0x3e, 0x55, 0x47, 0x40, + 0x6d, 0x45, 0x64, 0x72, 0x56, 0x5b, 0x6f, 0x82, + 0x5a, 0x41, 0x71, 0x8f, 0x69, 0x6f, 0x7e, 0x4d, + 0x5b, 0x70, 0x69, 0x59, 0x57, 0x4a, 0x43, 0x54, + 0x49, 0x2c, 0x8e, 0xfa, 0xeb, 0x75, 0x17, 0x2b, + 0x36, 0x39, 0x2c, 0x3c, 0xab, 0xc0, 0xb1, 0xaf, + 0xcd, 0xbe, 0xa9, 0xc6, 0xfa, 0x9d, 0x5c, 0x59, + 0x3c, 0x3a, 0x3e, 0x44, 0x44, 0x3e, 0x3e, 0x43, + 0x50, 0x4c, 0x57, 0x73, 0x7d, 0x70, 0x25, 0x10, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xec, 0xec, 0xea, 0xef, 0xf2, 0xe6, 0xd6, + 0xbf, 0xc4, 0xd3, 0xd8, 0xbc, 0xd4, 0xb3, 0xd5, + 0xd8, 0xc9, 0xc5, 0xc4, 0xe9, 0xf5, 0xed, 0xe9, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe5, 0xe7, 0xea, + 0xe8, 0xd2, 0xbd, 0xe8, 0xdb, 0x7c, 0xa0, 0xb2, + 0x86, 0x78, 0x8e, 0x99, 0xc2, 0xcb, 0xe9, 0xcd, + 0xac, 0x9a, 0xb8, 0xea, 0xf1, 0xe7, 0xea, 0xed, + 0xeb, 0xe9, 0xe9, 0xe8, 0xea, 0xe6, 0xe1, 0xef, + 0xbe, 0xaf, 0xba, 0xde, 0xd8, 0xf3, 0xfa, 0xe3, + 0xac, 0xb6, 0xc4, 0xc2, 0xca, 0xb9, 0x7d, 0x5e, + 0x5f, 0x75, 0x7e, 0x80, 0x83, 0x7a, 0x75, 0x80, + 0x50, 0x66, 0x6d, 0x65, 0x64, 0x63, 0x57, 0x4c, + 0x67, 0x6a, 0x70, 0x77, 0x79, 0x77, 0x75, 0x74, + 0x75, 0x7e, 0x80, 0x74, 0x67, 0x62, 0x64, 0x65, + 0x85, 0x7e, 0x76, 0x75, 0x76, 0x76, 0x6f, 0x69, + 0x75, 0x7c, 0x7f, 0x7d, 0x7f, 0x86, 0x8b, 0x8b, + 0x7c, 0x7c, 0x81, 0x86, 0x81, 0x72, 0x66, 0x63, + 0x62, 0x63, 0x4d, 0x3c, 0x62, 0x9a, 0x95, 0x67, + 0x31, 0x1f, 0x15, 0x34, 0x4f, 0x62, 0x6f, 0x55, + 0x54, 0x64, 0x63, 0x4f, 0x5c, 0x7d, 0x86, 0x86, + 0x7d, 0x4f, 0x43, 0x52, 0x6b, 0x76, 0x71, 0x87, + 0x9c, 0x84, 0xad, 0x51, 0x3f, 0x4d, 0x56, 0x55, + 0x43, 0x5e, 0x87, 0x78, 0x51, 0x37, 0x34, 0x5d, + 0x8a, 0x82, 0x76, 0x65, 0x6a, 0x8c, 0x84, 0x4f, + 0x66, 0x7a, 0x63, 0x50, 0x6c, 0x73, 0x64, 0x6a, + 0x5d, 0x48, 0x58, 0x9a, 0xcb, 0xae, 0x5a, 0x1b, + 0x3d, 0x3f, 0x2a, 0x2f, 0x9f, 0xc2, 0xc4, 0xcb, + 0xa2, 0xa1, 0xa9, 0xc6, 0xf1, 0x90, 0x47, 0x4c, + 0x36, 0x31, 0x34, 0x3c, 0x39, 0x30, 0x34, 0x41, + 0x7e, 0x5e, 0x4f, 0x5b, 0x71, 0x75, 0x22, 0x03, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xee, 0xec, 0xea, 0xea, 0xed, 0xee, 0xea, 0xe5, + 0xcc, 0xc3, 0xc3, 0xd1, 0xa5, 0xb6, 0xa1, 0xc2, + 0xe7, 0xcf, 0xcd, 0xca, 0xed, 0xef, 0xe4, 0xe8, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe4, 0xe6, 0xe9, + 0xf0, 0xe2, 0xae, 0xb9, 0xe6, 0x88, 0xa0, 0xb3, + 0x90, 0x75, 0x9b, 0xc9, 0xbe, 0xaa, 0xa6, 0xbb, + 0xc1, 0xba, 0xd3, 0xeb, 0xdd, 0xd1, 0xdc, 0xe3, + 0xe2, 0xe7, 0xe2, 0xe4, 0xe6, 0xe1, 0xec, 0xfc, + 0xff, 0xc2, 0xaf, 0x73, 0x25, 0xbc, 0xff, 0xe0, + 0x9b, 0xb5, 0xae, 0xbc, 0xc8, 0x94, 0x63, 0x5b, + 0x78, 0x94, 0x9d, 0x8e, 0x7b, 0x6c, 0x73, 0x8f, + 0x56, 0x6f, 0x83, 0x8d, 0x8a, 0x74, 0x6d, 0x7f, + 0x84, 0x6d, 0x5f, 0x6a, 0x79, 0x79, 0x6c, 0x61, + 0x6c, 0x67, 0x61, 0x64, 0x75, 0x84, 0x7e, 0x6f, + 0x7f, 0x77, 0x6c, 0x67, 0x69, 0x6f, 0x75, 0x79, + 0x8b, 0x98, 0x9a, 0x8c, 0x81, 0x84, 0x8a, 0x8c, + 0x90, 0x88, 0x85, 0x88, 0x82, 0x75, 0x6f, 0x72, + 0x7d, 0x65, 0x54, 0x4d, 0x38, 0x22, 0x2e, 0x4d, + 0x49, 0x59, 0x64, 0x7d, 0x74, 0x62, 0x6c, 0x54, + 0x4e, 0x57, 0x60, 0x4d, 0x61, 0x6b, 0x3b, 0x32, + 0x4f, 0x3c, 0x7f, 0x97, 0x7a, 0x8b, 0x96, 0x8a, + 0x5b, 0x8a, 0xef, 0x7a, 0x4f, 0x54, 0x4f, 0x39, + 0x39, 0x53, 0x78, 0x71, 0x66, 0x5c, 0x3c, 0x38, + 0x6f, 0x7c, 0x75, 0x5f, 0x65, 0x7b, 0x66, 0x33, + 0x6b, 0x52, 0x5c, 0x70, 0x65, 0x5b, 0x61, 0x62, + 0x53, 0x65, 0x39, 0x55, 0xa5, 0xdd, 0xcf, 0x56, + 0x3c, 0x47, 0x37, 0x37, 0x9c, 0xb3, 0xa7, 0xa3, + 0xac, 0xa3, 0xa5, 0xbc, 0xf6, 0xad, 0x5f, 0x5b, + 0x5a, 0x54, 0x4b, 0x44, 0x3d, 0x37, 0x36, 0x38, + 0x3b, 0x5d, 0x7b, 0x67, 0x4a, 0x4a, 0x12, 0x12, + 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xf2, 0xec, 0xe9, 0xeb, 0xea, 0xe7, 0xec, 0xf4, + 0xdc, 0xc7, 0xac, 0xbe, 0xaa, 0xca, 0xb3, 0xc6, + 0xde, 0xb0, 0xc1, 0xd2, 0xec, 0xe7, 0xeb, 0xf5, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xec, 0xe9, 0xe5, 0xe3, 0xe6, 0xe8, + 0xeb, 0xe7, 0xcc, 0xad, 0xc7, 0x7b, 0xac, 0xbb, + 0x8f, 0x73, 0x80, 0xb0, 0xac, 0xe1, 0xc9, 0xcd, + 0xd5, 0xe5, 0xe7, 0xe1, 0xe6, 0xe8, 0xe3, 0xe0, + 0xe1, 0xf2, 0xe8, 0xe7, 0xe9, 0xe4, 0xec, 0xe7, + 0xf7, 0xb3, 0x23, 0x41, 0x66, 0xcb, 0xfe, 0xe4, + 0xa7, 0xb6, 0xae, 0xcd, 0xb2, 0x66, 0x65, 0x63, + 0x71, 0x78, 0x74, 0x78, 0x88, 0x86, 0x7a, 0x7a, + 0x4d, 0x86, 0x81, 0x75, 0x9a, 0x94, 0x6e, 0x72, + 0x7c, 0x86, 0x82, 0x6e, 0x68, 0x73, 0x78, 0x71, + 0x74, 0x7e, 0x7e, 0x70, 0x65, 0x65, 0x68, 0x66, + 0x68, 0x6f, 0x77, 0x7b, 0x7a, 0x79, 0x7a, 0x7b, + 0x83, 0x8b, 0x87, 0x77, 0x71, 0x7d, 0x8a, 0x8e, + 0x85, 0x80, 0x82, 0x89, 0x82, 0x6e, 0x61, 0x61, + 0x5f, 0x66, 0x67, 0x5a, 0x44, 0x37, 0x3a, 0x43, + 0x51, 0x6e, 0x69, 0x68, 0x60, 0x69, 0x76, 0x45, + 0x33, 0x4a, 0x66, 0x46, 0x4e, 0x5a, 0x39, 0x5e, + 0x6f, 0x4f, 0x75, 0x8a, 0x85, 0x83, 0x6c, 0x6c, + 0x7b, 0x9e, 0xda, 0x51, 0x45, 0x49, 0x44, 0x55, + 0x42, 0x40, 0x68, 0x5c, 0x3e, 0x57, 0x5a, 0x41, + 0x30, 0x3d, 0x6a, 0x7a, 0x65, 0x6b, 0x6e, 0x4b, + 0x53, 0x6c, 0x6a, 0x5b, 0x5f, 0x63, 0x5e, 0x61, + 0x68, 0x6d, 0x59, 0x53, 0x74, 0xb4, 0xcd, 0x9d, + 0x65, 0x6a, 0x4b, 0x3d, 0x9a, 0xb4, 0xb0, 0xb0, + 0xa1, 0xb7, 0xba, 0xb3, 0xff, 0xe2, 0x69, 0x11, + 0x2e, 0x3b, 0x3d, 0x33, 0x2e, 0x3a, 0x49, 0x4f, + 0x52, 0x70, 0x82, 0x5f, 0x4e, 0x63, 0x1e, 0x01, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xef, 0xf0, 0xe6, 0xe7, 0xf0, 0xf0, 0xf2, + 0xe7, 0xe4, 0xc0, 0xbc, 0xa5, 0xb4, 0xb7, 0x9d, + 0xcf, 0xb3, 0xad, 0xc2, 0xe6, 0xe8, 0xf1, 0xef, + 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xe8, 0xeb, 0xf1, 0xed, 0xe2, 0xde, 0xe1, + 0xe5, 0xdb, 0xd3, 0xd5, 0xc1, 0x84, 0xad, 0xc9, + 0x97, 0xa1, 0x9c, 0x97, 0x7d, 0xae, 0xbc, 0xcc, + 0xef, 0xea, 0xe5, 0xe4, 0xe6, 0xe8, 0xe7, 0xe5, + 0xe7, 0xe8, 0xe6, 0xdd, 0xea, 0xe3, 0xff, 0xea, + 0xf6, 0xb8, 0x7e, 0x96, 0xcc, 0xf9, 0xff, 0xd8, + 0xa2, 0xb6, 0xc0, 0xbe, 0x71, 0x67, 0x5b, 0x75, + 0x94, 0x9a, 0x90, 0x83, 0x69, 0x62, 0x73, 0x61, + 0x42, 0x74, 0x79, 0x87, 0x79, 0x8c, 0x7b, 0x8a, + 0x86, 0x76, 0x62, 0x57, 0x5d, 0x69, 0x6f, 0x6f, + 0x6c, 0x69, 0x61, 0x61, 0x74, 0x89, 0x86, 0x75, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x80, + 0x9c, 0x93, 0x85, 0x7a, 0x77, 0x7c, 0x85, 0x8c, + 0x79, 0x76, 0x7c, 0x88, 0x86, 0x77, 0x6d, 0x6f, + 0x52, 0x62, 0x67, 0x50, 0x34, 0x38, 0x62, 0x8c, + 0x95, 0x8b, 0x5d, 0x51, 0x63, 0x71, 0x7b, 0x6e, + 0x40, 0x4b, 0x46, 0x44, 0x53, 0x5b, 0x5c, 0x66, + 0x5f, 0x61, 0x7a, 0x7f, 0x7b, 0x75, 0x6f, 0x88, + 0x8d, 0x93, 0xbf, 0x70, 0x49, 0x53, 0x50, 0x53, + 0x61, 0x37, 0x4f, 0x6a, 0x57, 0x3a, 0x33, 0x54, + 0x58, 0x43, 0x3e, 0x5e, 0x56, 0x3d, 0x20, 0x63, + 0x78, 0x65, 0x5e, 0x5c, 0x57, 0x61, 0x6b, 0x64, + 0x65, 0x5b, 0x5e, 0x4c, 0x4d, 0x7c, 0xb4, 0xe8, + 0x89, 0x4b, 0x4f, 0x42, 0xa8, 0xcb, 0xb8, 0xcd, + 0xbf, 0xbd, 0xa9, 0xb5, 0xf1, 0xf1, 0x85, 0x13, + 0x24, 0x3b, 0x33, 0x32, 0x2e, 0x3d, 0x38, 0x45, + 0x32, 0x3e, 0x52, 0x47, 0x57, 0x5d, 0x26, 0x0f, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf3, 0xf1, 0xea, 0xe9, 0xe2, 0xec, 0xfb, 0xe3, + 0xf8, 0xdc, 0xbb, 0xb6, 0x8e, 0x91, 0x9e, 0x92, + 0xd5, 0xc6, 0xa7, 0xb2, 0xe7, 0xe7, 0xea, 0xea, + 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xe9, 0xea, 0xee, 0xed, 0xe6, 0xe1, 0xdf, + 0xed, 0xe0, 0xd2, 0xd4, 0xc5, 0x84, 0xa3, 0xcf, + 0x84, 0x7b, 0x8b, 0xd0, 0xa9, 0xb0, 0xe8, 0xe9, + 0xe4, 0xe6, 0xe7, 0xe4, 0xe1, 0xe0, 0xe4, 0xe8, + 0xe1, 0xe6, 0xdf, 0xe8, 0xfd, 0xc4, 0xd3, 0xf3, + 0xff, 0xb5, 0xa9, 0xd6, 0xd3, 0xf9, 0xf8, 0xe1, + 0xa4, 0xaf, 0xc5, 0x9e, 0x64, 0x5a, 0x65, 0x70, + 0x86, 0x77, 0x73, 0x8b, 0x83, 0x70, 0x7d, 0x78, + 0x4c, 0xac, 0x78, 0x4a, 0x69, 0x80, 0x59, 0x87, + 0x79, 0x6a, 0x59, 0x55, 0x5f, 0x6c, 0x6f, 0x6d, + 0x6e, 0x65, 0x60, 0x6d, 0x87, 0x96, 0x8a, 0x74, + 0x6f, 0x7a, 0x83, 0x80, 0x74, 0x6c, 0x6d, 0x72, + 0x87, 0x7f, 0x75, 0x6e, 0x6e, 0x71, 0x74, 0x75, + 0x73, 0x78, 0x88, 0x95, 0x8f, 0x78, 0x67, 0x63, + 0x68, 0x5c, 0x50, 0x50, 0x56, 0x55, 0x49, 0x3c, + 0x46, 0x5b, 0x60, 0x6c, 0x71, 0x75, 0x82, 0x71, + 0x41, 0x6a, 0x5f, 0x34, 0x44, 0x76, 0x80, 0x6d, + 0x5e, 0x3d, 0x73, 0x94, 0x72, 0x69, 0x80, 0x97, + 0x72, 0x75, 0x9b, 0x51, 0x33, 0x44, 0x45, 0x44, + 0x55, 0x37, 0x48, 0x50, 0x4b, 0x57, 0x61, 0x77, + 0x5a, 0x39, 0x38, 0x72, 0x82, 0x6a, 0x36, 0x60, + 0x86, 0x75, 0x6b, 0x63, 0x58, 0x5f, 0x6c, 0x6b, + 0x60, 0x70, 0x62, 0x72, 0x70, 0x65, 0xa4, 0xdf, + 0xb8, 0x6a, 0x39, 0x3a, 0xa2, 0xb4, 0xa3, 0x9b, + 0xb3, 0xb8, 0xad, 0xba, 0xe9, 0xe6, 0x8e, 0x37, + 0x3d, 0x33, 0x39, 0x62, 0x71, 0x8a, 0x7d, 0x68, + 0x7d, 0x7d, 0x72, 0x66, 0x95, 0x91, 0x2e, 0x06, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xf0, 0xe8, 0xf1, 0xe1, 0xd8, 0xf1, 0xdd, + 0xf0, 0xe5, 0xcf, 0xb9, 0xa0, 0xba, 0xb8, 0x8b, + 0xd0, 0xce, 0xa5, 0xa9, 0xd3, 0xc9, 0xde, 0xed, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xea, 0xe9, 0xec, 0xec, 0xe5, 0xdc, + 0xe1, 0xf2, 0xd9, 0xb1, 0xa9, 0x8f, 0xa2, 0xc1, + 0x64, 0x8d, 0x9d, 0xcb, 0xb3, 0xaf, 0xe1, 0xce, + 0xdd, 0xe0, 0xe4, 0xe4, 0xe1, 0xdf, 0xe1, 0xe3, + 0xdd, 0xec, 0xdd, 0xff, 0xd3, 0x5d, 0xc5, 0xff, + 0xff, 0xb4, 0x3a, 0x2d, 0x12, 0xa3, 0xff, 0xe0, + 0xa9, 0xc7, 0xa9, 0x70, 0x5f, 0x5f, 0x7b, 0x91, + 0x84, 0x7b, 0x6e, 0x75, 0x74, 0x79, 0x87, 0x71, + 0x92, 0x6e, 0x48, 0x74, 0x8f, 0x7e, 0x60, 0x86, + 0x76, 0x6c, 0x5f, 0x55, 0x51, 0x55, 0x5e, 0x66, + 0x66, 0x5a, 0x59, 0x6a, 0x7a, 0x77, 0x65, 0x55, + 0x67, 0x75, 0x84, 0x87, 0x7e, 0x74, 0x6f, 0x70, + 0x70, 0x6b, 0x68, 0x6c, 0x77, 0x7f, 0x81, 0x80, + 0x7b, 0x7a, 0x79, 0x74, 0x64, 0x52, 0x4c, 0x4f, + 0x6e, 0x6a, 0x61, 0x54, 0x47, 0x3d, 0x3a, 0x3a, + 0x4b, 0x5d, 0x6f, 0x7a, 0x64, 0x60, 0x72, 0x59, + 0x43, 0x54, 0x4f, 0x45, 0x4f, 0x55, 0x50, 0x51, + 0x74, 0x57, 0x6b, 0x82, 0x84, 0x7d, 0x7b, 0x96, + 0x85, 0x5f, 0x81, 0x6f, 0x64, 0x4a, 0x35, 0x39, + 0x41, 0x45, 0x68, 0x69, 0x64, 0x72, 0x5c, 0x43, + 0x57, 0x52, 0x51, 0x61, 0x5d, 0x69, 0x59, 0x85, + 0x63, 0x66, 0x73, 0x79, 0x70, 0x68, 0x63, 0x59, + 0x57, 0x5e, 0x61, 0x65, 0x66, 0x51, 0x60, 0xa4, + 0xd5, 0xa7, 0x34, 0x1d, 0xa1, 0xcf, 0xc6, 0xb6, + 0xbc, 0xbf, 0xae, 0xb4, 0xe1, 0xee, 0xbc, 0x87, + 0x9a, 0xa1, 0x9b, 0x93, 0x74, 0x7d, 0x6e, 0x55, + 0x67, 0x71, 0x68, 0x43, 0x4f, 0x4b, 0x14, 0x17, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf5, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xed, 0xed, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, + 0xe2, 0xea, 0xe1, 0xed, 0xe7, 0xd0, 0xd9, 0xda, + 0xe3, 0xdd, 0xcb, 0xae, 0xa2, 0xc0, 0xbc, 0x8b, + 0xc0, 0xc7, 0xaa, 0xb8, 0xd4, 0xc2, 0xe8, 0xf8, + 0xe9, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xed, 0xe9, 0xe6, 0xeb, 0xf0, 0xe8, 0xdb, + 0xe5, 0xe5, 0xd8, 0xd5, 0xd4, 0x9c, 0x90, 0xd2, + 0x5b, 0x3f, 0x8a, 0xef, 0xcc, 0xa3, 0xe1, 0xec, + 0xeb, 0xe4, 0xdc, 0xd9, 0xdc, 0xe1, 0xe4, 0xe4, + 0xe1, 0xe3, 0xff, 0xce, 0x50, 0x4d, 0xe8, 0xf8, + 0xfb, 0xcf, 0x30, 0x5c, 0x7e, 0xe6, 0xf9, 0xda, + 0xa6, 0xc8, 0x85, 0x71, 0x6b, 0x70, 0x76, 0x78, + 0x69, 0x7f, 0x8a, 0x91, 0x7e, 0x64, 0x49, 0x0f, + 0x2f, 0x76, 0x8f, 0x86, 0x85, 0x85, 0x76, 0x7a, + 0x7c, 0x71, 0x63, 0x59, 0x53, 0x53, 0x5f, 0x6c, + 0x75, 0x65, 0x5e, 0x64, 0x64, 0x5b, 0x5d, 0x68, + 0x79, 0x73, 0x6c, 0x69, 0x6b, 0x6c, 0x6b, 0x68, + 0x6b, 0x66, 0x65, 0x6e, 0x7f, 0x8c, 0x91, 0x90, + 0x85, 0x7f, 0x74, 0x64, 0x57, 0x56, 0x63, 0x72, + 0x6c, 0x6c, 0x67, 0x5a, 0x49, 0x3f, 0x3e, 0x40, + 0x46, 0x4c, 0x63, 0x77, 0x64, 0x6d, 0x89, 0x67, + 0x54, 0x5f, 0x55, 0x4b, 0x5a, 0x67, 0x6d, 0x77, + 0x74, 0x72, 0x7a, 0x77, 0x87, 0x90, 0x82, 0x8e, + 0x85, 0x6e, 0x75, 0x49, 0x54, 0x6a, 0x5e, 0x36, + 0x42, 0x45, 0x5f, 0x55, 0x50, 0x65, 0x52, 0x34, + 0x3f, 0x55, 0x4f, 0x3c, 0x41, 0x84, 0x7a, 0x75, + 0x7b, 0x69, 0x5b, 0x5f, 0x6c, 0x74, 0x6c, 0x5e, + 0x60, 0x5f, 0x65, 0x5b, 0x65, 0x6a, 0x5c, 0x7a, + 0xbb, 0xf2, 0x94, 0x31, 0x80, 0xb3, 0xa4, 0xb6, + 0xae, 0xa7, 0xb4, 0xda, 0xd9, 0x95, 0x5e, 0x63, + 0x1b, 0x2f, 0x28, 0x33, 0x3b, 0x47, 0x2e, 0x26, + 0x40, 0x4d, 0x6f, 0x62, 0x53, 0x48, 0x1b, 0x0f, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf1, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xf0, 0xef, 0xef, 0xee, 0xed, 0xed, 0xec, 0xec, + 0xed, 0xe5, 0xdd, 0xde, 0xe3, 0xdf, 0xd4, 0xd0, + 0xd7, 0xf0, 0xec, 0xaf, 0x8a, 0xb6, 0xc7, 0x7c, + 0xb2, 0xc5, 0xa1, 0xa1, 0xc5, 0xc3, 0xec, 0xfb, + 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xeb, 0xeb, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xed, 0xed, 0xe9, 0xe5, 0xea, 0xf1, 0xea, 0xde, + 0xe1, 0xe0, 0xd2, 0xc8, 0xd0, 0xb6, 0xa8, 0xf9, + 0x8d, 0x5c, 0x8b, 0xbb, 0x92, 0x77, 0xd9, 0xe5, + 0xe8, 0xe5, 0xe2, 0xe2, 0xe5, 0xe5, 0xe2, 0xdf, + 0xe6, 0xf0, 0xcf, 0x8d, 0x6f, 0x7c, 0xe2, 0xf5, + 0xfe, 0xd9, 0x7b, 0xad, 0xb2, 0xfc, 0xf0, 0xf2, + 0xcb, 0x9c, 0x69, 0x66, 0x64, 0x86, 0x95, 0x88, + 0x84, 0x79, 0x74, 0x83, 0x71, 0x5d, 0x6e, 0x6d, + 0x70, 0x6e, 0x6d, 0x7d, 0x9d, 0x8f, 0x7a, 0x7a, + 0x6e, 0x68, 0x69, 0x72, 0x74, 0x6b, 0x61, 0x60, + 0x5a, 0x59, 0x67, 0x7e, 0x7f, 0x70, 0x70, 0x7d, + 0x70, 0x6b, 0x67, 0x6a, 0x72, 0x76, 0x73, 0x6f, + 0x75, 0x6e, 0x68, 0x6a, 0x73, 0x7d, 0x83, 0x85, + 0x81, 0x80, 0x7a, 0x6d, 0x63, 0x62, 0x67, 0x6c, + 0x70, 0x69, 0x5d, 0x51, 0x48, 0x44, 0x45, 0x47, + 0x43, 0x53, 0x74, 0x8a, 0x6d, 0x65, 0x70, 0x44, + 0x5a, 0x5e, 0x50, 0x45, 0x4e, 0x52, 0x53, 0x5f, + 0x3f, 0x4f, 0x94, 0x98, 0x68, 0x6e, 0x85, 0x8b, + 0x84, 0x59, 0x58, 0x43, 0x45, 0x3e, 0x46, 0x43, + 0x5d, 0x5d, 0x7d, 0x7c, 0x6f, 0x71, 0x56, 0x3e, + 0x56, 0x70, 0x68, 0x3e, 0x29, 0x6a, 0x63, 0x52, + 0x6d, 0x79, 0x7f, 0x79, 0x6d, 0x63, 0x63, 0x69, + 0x68, 0x71, 0x60, 0x66, 0x6d, 0x69, 0x6d, 0x53, + 0x86, 0xc8, 0xb7, 0x5b, 0x75, 0xc1, 0xb2, 0xd0, + 0xaa, 0xc6, 0xa8, 0x79, 0x92, 0xbc, 0xa0, 0x63, + 0x6a, 0xb6, 0xa7, 0x63, 0x4e, 0x81, 0x6e, 0x3e, + 0x49, 0x42, 0x5a, 0x50, 0x45, 0x42, 0x1b, 0x0d, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, 0xef, + 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf0, 0xef, 0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, + 0xf4, 0xe8, 0xeb, 0xdd, 0xce, 0xda, 0xdb, 0xcb, + 0xda, 0xd2, 0xd6, 0xc1, 0x91, 0x95, 0xc3, 0x92, + 0x98, 0xd2, 0xac, 0x89, 0xb0, 0xb3, 0xce, 0xe8, + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xeb, 0xec, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xec, 0xe9, 0xe7, 0xeb, 0xee, 0xea, 0xe3, + 0xe7, 0xe1, 0xd9, 0xcb, 0xc8, 0xb6, 0x96, 0xe4, + 0x9d, 0x87, 0xba, 0xff, 0xee, 0x8d, 0xce, 0xd5, + 0xe1, 0xe5, 0xea, 0xea, 0xe6, 0xe4, 0xe4, 0xe5, + 0xfb, 0xe8, 0x63, 0x4e, 0x81, 0x79, 0xe4, 0xfc, + 0xf9, 0xd5, 0x86, 0x9c, 0x87, 0xca, 0xf1, 0xff, + 0xcb, 0x68, 0x6b, 0x5a, 0x77, 0x87, 0x7a, 0x72, + 0x8c, 0x8b, 0x85, 0x87, 0x73, 0x69, 0x80, 0x7d, + 0x69, 0x74, 0x83, 0x76, 0x82, 0x78, 0x78, 0x6c, + 0x67, 0x5f, 0x5f, 0x67, 0x67, 0x63, 0x6c, 0x7c, + 0x7b, 0x6d, 0x68, 0x6f, 0x6d, 0x63, 0x68, 0x78, + 0x61, 0x62, 0x63, 0x62, 0x60, 0x60, 0x62, 0x64, + 0x79, 0x76, 0x71, 0x6d, 0x6d, 0x72, 0x7a, 0x7f, + 0x8a, 0x8b, 0x85, 0x79, 0x71, 0x6d, 0x65, 0x5c, + 0x67, 0x68, 0x61, 0x4e, 0x3a, 0x36, 0x44, 0x53, + 0x2c, 0x4f, 0x74, 0x86, 0x69, 0x5a, 0x66, 0x4c, + 0x42, 0x49, 0x47, 0x4d, 0x5c, 0x5c, 0x5b, 0x68, + 0x6e, 0x4e, 0x6a, 0x8e, 0x9d, 0x9c, 0x77, 0x5a, + 0x4e, 0x66, 0x79, 0x47, 0x39, 0x4a, 0x6b, 0x59, + 0x60, 0x56, 0x6f, 0x67, 0x50, 0x4e, 0x42, 0x41, + 0x3c, 0x48, 0x57, 0x51, 0x39, 0x6c, 0x77, 0x88, + 0x7b, 0x75, 0x68, 0x64, 0x6e, 0x6f, 0x67, 0x64, + 0x62, 0x61, 0x64, 0x6d, 0x6c, 0x66, 0x60, 0x4f, + 0x5c, 0x82, 0xd1, 0xc2, 0x99, 0xc2, 0xa0, 0xa3, + 0xbc, 0xbd, 0xbe, 0xd9, 0xfc, 0xe7, 0xa5, 0x77, + 0x8a, 0x82, 0x6a, 0x53, 0x2e, 0x3c, 0x39, 0x2c, + 0x32, 0x3d, 0x56, 0x4b, 0x49, 0x3a, 0x0b, 0x0f, + 0xf5, 0xf5, 0xf4, 0xf2, 0xf1, 0xf0, 0xef, 0xee, + 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe7, 0xe7, 0xe6, + 0xeb, 0xec, 0xf1, 0xe8, 0xc8, 0xbe, 0xcb, 0xc5, + 0xd5, 0xda, 0xcb, 0xb5, 0x94, 0x89, 0xc8, 0xac, + 0x7f, 0xca, 0xbf, 0x9d, 0xbb, 0xb1, 0xbb, 0xe0, + 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xeb, 0xec, 0xec, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xeb, 0xe9, 0xeb, 0xeb, 0xe9, 0xe8, 0xea, + 0xd4, 0xeb, 0xe5, 0xae, 0xa6, 0xd0, 0xb3, 0xdd, + 0x91, 0x59, 0xa8, 0xf1, 0xdc, 0x88, 0xda, 0xd8, + 0xe6, 0xe5, 0xe1, 0xdc, 0xdb, 0xe2, 0xee, 0xf7, + 0xd9, 0x66, 0x52, 0x73, 0x6b, 0x6b, 0xd9, 0xf7, + 0xf6, 0xdb, 0x91, 0xc8, 0xf0, 0xe7, 0xe9, 0xff, + 0xb2, 0x5a, 0x6b, 0x65, 0x90, 0x8c, 0x75, 0x80, + 0x6c, 0x7c, 0x79, 0x74, 0x67, 0x6b, 0x77, 0x59, + 0x64, 0x8c, 0x8b, 0x70, 0x95, 0x5e, 0x40, 0x59, + 0x7d, 0x6e, 0x69, 0x72, 0x74, 0x6c, 0x6b, 0x73, + 0x66, 0x64, 0x6a, 0x71, 0x6e, 0x67, 0x6d, 0x7a, + 0x8d, 0x81, 0x6f, 0x60, 0x5a, 0x5c, 0x65, 0x6b, + 0x7b, 0x7f, 0x80, 0x79, 0x6f, 0x6b, 0x71, 0x78, + 0x88, 0x88, 0x82, 0x7d, 0x83, 0x8a, 0x83, 0x75, + 0x5c, 0x5e, 0x5e, 0x56, 0x4c, 0x46, 0x48, 0x4d, + 0x44, 0x64, 0x6f, 0x72, 0x61, 0x55, 0x60, 0x54, + 0x48, 0x5e, 0x50, 0x34, 0x41, 0x5e, 0x66, 0x62, + 0x51, 0x50, 0x5a, 0x5d, 0x66, 0x5b, 0x3e, 0x4d, + 0x4b, 0x47, 0x5c, 0x56, 0x4f, 0x48, 0x84, 0xa3, + 0x32, 0x42, 0x76, 0x79, 0x60, 0x59, 0x49, 0x43, + 0x48, 0x2d, 0x36, 0x5a, 0x66, 0x93, 0x7a, 0x67, + 0x6d, 0x6d, 0x62, 0x5f, 0x6a, 0x6b, 0x64, 0x68, + 0x63, 0x5a, 0x6a, 0x64, 0x68, 0x6d, 0x56, 0x65, + 0x45, 0x77, 0xc6, 0xe1, 0xb2, 0xd8, 0xe6, 0xff, + 0xff, 0xfc, 0xd0, 0x9b, 0x6f, 0x44, 0x32, 0x3f, + 0x2f, 0x36, 0x3e, 0x43, 0x1d, 0x21, 0x30, 0x43, + 0x3a, 0x38, 0x4b, 0x46, 0x4b, 0x41, 0x13, 0x12, + 0xf5, 0xf5, 0xf4, 0xf2, 0xf1, 0xef, 0xee, 0xee, + 0xe8, 0xe9, 0xea, 0xeb, 0xed, 0xee, 0xef, 0xf0, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xe9, 0xe8, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, + 0xe5, 0xec, 0xe2, 0xef, 0xd9, 0xab, 0xb0, 0xb7, + 0xcd, 0xf1, 0xd7, 0xc2, 0xa6, 0x6e, 0xa1, 0xae, + 0x7f, 0xa9, 0xa6, 0x96, 0xb7, 0xb3, 0xc7, 0xf7, + 0xe5, 0xe5, 0xe6, 0xe8, 0xe9, 0xeb, 0xec, 0xec, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xef, 0xe9, 0xe9, 0xed, 0xeb, 0xe6, 0xe7, 0xee, + 0xdd, 0xdd, 0xdf, 0xbb, 0xa7, 0xb5, 0x88, 0xbb, + 0x72, 0x4a, 0xb5, 0xeb, 0xf7, 0xa6, 0xc4, 0xd8, + 0xd9, 0xd9, 0xdb, 0xe2, 0xea, 0xee, 0xee, 0xeb, + 0x6a, 0x59, 0x84, 0x94, 0x7e, 0x93, 0xfc, 0xf7, + 0xe7, 0xd7, 0xcf, 0xc3, 0xcc, 0xf3, 0xff, 0xfc, + 0xae, 0x63, 0x60, 0x7b, 0x7d, 0x7c, 0x81, 0x86, + 0x93, 0x82, 0x75, 0x83, 0x78, 0x65, 0x68, 0x55, + 0x77, 0x33, 0x39, 0x58, 0x97, 0xb6, 0xf8, 0xff, + 0xff, 0xbd, 0x79, 0x67, 0x71, 0x6f, 0x63, 0x5a, + 0x53, 0x61, 0x72, 0x75, 0x66, 0x57, 0x5d, 0x6b, + 0x70, 0x6a, 0x69, 0x72, 0x7f, 0x83, 0x79, 0x6d, + 0x83, 0x8b, 0x8e, 0x81, 0x6b, 0x5b, 0x59, 0x5e, + 0x5d, 0x5e, 0x5c, 0x5d, 0x69, 0x72, 0x64, 0x4d, + 0x60, 0x62, 0x5e, 0x51, 0x44, 0x48, 0x5b, 0x6e, + 0x6d, 0x81, 0x72, 0x6d, 0x6b, 0x5d, 0x54, 0x41, + 0x43, 0x3b, 0x37, 0x49, 0x59, 0x4e, 0x51, 0x6f, + 0x5e, 0x4a, 0x58, 0x43, 0x2f, 0x52, 0x64, 0x5a, + 0x47, 0x40, 0x51, 0x51, 0x4d, 0x38, 0x5b, 0x61, + 0x53, 0x60, 0x81, 0x67, 0x42, 0x47, 0x4a, 0x4d, + 0x5b, 0x3b, 0x33, 0x41, 0x49, 0x88, 0x7d, 0x68, + 0x70, 0x77, 0x6f, 0x6a, 0x70, 0x69, 0x5f, 0x64, + 0x64, 0x6e, 0x4c, 0x3e, 0x44, 0x34, 0x2e, 0x31, + 0x5b, 0x99, 0x9f, 0xca, 0xd0, 0xc1, 0x64, 0x2f, + 0x1c, 0x13, 0x0b, 0x22, 0x47, 0x4c, 0x45, 0x50, + 0x4a, 0x49, 0x2f, 0x34, 0x38, 0x45, 0x3e, 0x4e, + 0x4c, 0x37, 0x54, 0x4d, 0x35, 0x31, 0x19, 0x12, + 0xfb, 0xf6, 0xf7, 0xe5, 0xf0, 0xea, 0xec, 0xf3, + 0xef, 0xe9, 0xf4, 0xf7, 0xec, 0xe5, 0xe7, 0xf2, + 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xec, + 0xf1, 0xf1, 0xf0, 0xef, 0xef, 0xee, 0xed, 0xed, + 0xef, 0xf0, 0xf1, 0xf1, 0xf0, 0xed, 0xeb, 0xe9, + 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, + 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xec, 0xeb, + 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf4, 0xed, 0xe8, 0xe9, 0xeb, 0xe9, 0xe7, 0xe8, + 0xde, 0xde, 0xea, 0xea, 0xd6, 0xde, 0xd2, 0xe0, + 0xdf, 0xdf, 0xe3, 0xe8, 0xe0, 0xbe, 0xac, 0xc0, + 0xcc, 0xc4, 0xfc, 0xde, 0xb9, 0x95, 0x92, 0x87, + 0x95, 0xab, 0xae, 0x8b, 0xc4, 0xbc, 0xc8, 0xd8, + 0xe1, 0xee, 0xef, 0xed, 0xf4, 0xed, 0xe6, 0xef, + 0xe4, 0xdb, 0xe3, 0xef, 0xec, 0xe7, 0xea, 0xeb, + 0xf4, 0xeb, 0xef, 0xf1, 0xe7, 0xea, 0xf0, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe7, 0xc9, 0xea, 0xeb, 0xdd, 0xaf, 0x7b, 0xf4, + 0xaa, 0x2c, 0xa8, 0xfb, 0xee, 0xb2, 0xc9, 0xef, + 0xf5, 0xd3, 0xdd, 0xe8, 0xdf, 0xf0, 0xd6, 0x7b, + 0x79, 0x92, 0x98, 0x77, 0x78, 0xc2, 0xf3, 0xde, + 0xd0, 0xec, 0xf6, 0xf8, 0xff, 0xe0, 0x91, 0x50, + 0x58, 0x73, 0x78, 0x90, 0x8d, 0x78, 0x81, 0x74, + 0x7f, 0x75, 0x7d, 0x55, 0x37, 0x25, 0x1c, 0x5f, + 0xab, 0xff, 0xfd, 0xff, 0xd8, 0xa0, 0xe9, 0xa3, + 0x5e, 0x5d, 0x5d, 0x63, 0x6d, 0x6f, 0x62, 0x52, + 0x69, 0x64, 0x6f, 0x86, 0x8d, 0x7d, 0x6c, 0x68, + 0x61, 0x5d, 0x65, 0x7b, 0x88, 0x82, 0x76, 0x6f, + 0x68, 0x63, 0x66, 0x70, 0x73, 0x6f, 0x70, 0x77, + 0x68, 0x54, 0x49, 0x55, 0x67, 0x6c, 0x67, 0x61, + 0x5b, 0x5f, 0x5a, 0x4f, 0x46, 0x41, 0x51, 0x6c, + 0x48, 0x4b, 0x74, 0x72, 0x66, 0x69, 0x4e, 0x45, + 0x3b, 0x30, 0x4b, 0x6f, 0x72, 0x6c, 0x60, 0x49, + 0x56, 0x61, 0x5c, 0x58, 0x38, 0x34, 0x65, 0x6b, + 0x5f, 0x39, 0x35, 0x3a, 0x32, 0x4c, 0x64, 0x53, + 0x32, 0x26, 0x66, 0x7b, 0x31, 0x55, 0x44, 0x2f, + 0x43, 0x64, 0x7a, 0x79, 0x7b, 0x94, 0x7e, 0x6b, + 0x71, 0x78, 0x76, 0x6b, 0x62, 0x5e, 0x57, 0x4e, + 0x3f, 0x37, 0x46, 0x7e, 0xc6, 0xf6, 0xfd, 0xf3, + 0xe5, 0x9d, 0x67, 0xab, 0xdb, 0xc5, 0x82, 0x00, + 0x21, 0x3b, 0x35, 0x39, 0x37, 0x32, 0x42, 0x36, + 0x38, 0x34, 0x3b, 0x42, 0x37, 0x28, 0x32, 0x4c, + 0x54, 0x53, 0x4e, 0x5f, 0x4e, 0x40, 0x1f, 0x14, + 0xfb, 0xea, 0xed, 0xee, 0xf3, 0xe3, 0xeb, 0xe3, + 0xef, 0xf2, 0xe4, 0xdf, 0xe8, 0xec, 0xed, 0xef, + 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe7, 0xe6, 0xe5, 0xe5, 0xe5, + 0xeb, 0xec, 0xee, 0xef, 0xf0, 0xef, 0xed, 0xec, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, + 0xf0, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xec, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf2, 0xe5, 0xe9, 0xef, 0xe8, 0xe9, 0xe7, 0xd7, + 0xe9, 0xeb, 0xdf, 0xe3, 0xc7, 0xd6, 0xed, 0xe1, + 0xe6, 0xb8, 0xe7, 0xe6, 0xc6, 0xcb, 0xae, 0x9c, + 0x95, 0xce, 0xdb, 0xde, 0xd7, 0x8e, 0x7f, 0x94, + 0x8e, 0x9e, 0xc4, 0x93, 0xb7, 0xb7, 0xb3, 0xc3, + 0xf0, 0xee, 0xed, 0xeb, 0xe7, 0xe7, 0xeb, 0xeb, + 0xed, 0xe1, 0xe4, 0xee, 0xea, 0xe8, 0xeb, 0xea, + 0xed, 0xe6, 0xeb, 0xee, 0xe7, 0xeb, 0xf1, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xeb, 0xd3, 0xea, 0xe9, 0xd7, 0xb3, 0x4c, 0x7c, + 0xab, 0x53, 0xad, 0xf8, 0xff, 0xb0, 0xbf, 0xea, + 0xe8, 0xff, 0xdc, 0xd7, 0xff, 0xdc, 0x71, 0x54, + 0x69, 0x89, 0x9e, 0x86, 0x7d, 0xbf, 0xff, 0xff, + 0xf7, 0xea, 0xa6, 0x60, 0x5d, 0x72, 0x64, 0x49, + 0x46, 0x5c, 0x75, 0x77, 0x7b, 0x84, 0x7b, 0x6f, + 0x5f, 0x40, 0x31, 0x7c, 0xd2, 0xf3, 0xff, 0xf2, + 0xff, 0xfa, 0xd1, 0x7a, 0x64, 0x45, 0x21, 0x00, + 0x14, 0x35, 0x5e, 0x73, 0x75, 0x6f, 0x6d, 0x6e, + 0x80, 0x81, 0x88, 0x8c, 0x7e, 0x6c, 0x6c, 0x79, + 0x7f, 0x6a, 0x62, 0x74, 0x88, 0x86, 0x74, 0x65, + 0x5b, 0x5b, 0x65, 0x74, 0x76, 0x6b, 0x64, 0x65, + 0x6b, 0x62, 0x5f, 0x68, 0x6c, 0x64, 0x58, 0x52, + 0x60, 0x62, 0x54, 0x4a, 0x4b, 0x40, 0x36, 0x3e, + 0x47, 0x34, 0x38, 0x5a, 0x77, 0x5c, 0x3c, 0x56, + 0x3e, 0x30, 0x2b, 0x2a, 0x37, 0x5d, 0x69, 0x4d, + 0x63, 0x60, 0x53, 0x31, 0x46, 0x61, 0x43, 0x3e, + 0x3e, 0x3e, 0x5b, 0x5f, 0x39, 0x31, 0x3d, 0x31, + 0x48, 0x29, 0x6b, 0x94, 0x53, 0x60, 0x4e, 0x4d, + 0x36, 0x50, 0x43, 0x43, 0x5a, 0x76, 0x7a, 0x71, + 0x75, 0x5c, 0x40, 0x38, 0x4c, 0x75, 0xa4, 0xc5, + 0xee, 0xee, 0xed, 0xd2, 0x8a, 0x39, 0x19, 0x22, + 0x22, 0x24, 0x19, 0x4d, 0x93, 0xd5, 0xdf, 0x74, + 0x1a, 0x2a, 0x32, 0x32, 0x3d, 0x3d, 0x2e, 0x2d, + 0x3e, 0x36, 0x39, 0x40, 0x39, 0x2d, 0x35, 0x49, + 0x38, 0x34, 0x2e, 0x43, 0x3c, 0x36, 0x1a, 0x11, + 0xf9, 0xf2, 0xee, 0xe2, 0xe0, 0xec, 0xff, 0xcb, + 0xf0, 0xf3, 0xe7, 0xf3, 0xf0, 0xe0, 0xea, 0xe7, + 0xe6, 0xe7, 0xe7, 0xe8, 0xe9, 0xe9, 0xea, 0xea, + 0xe9, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, + 0xe7, 0xe8, 0xeb, 0xee, 0xef, 0xef, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xef, 0xee, 0xee, 0xed, 0xed, 0xec, 0xec, 0xec, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xf0, 0xdc, 0xe5, 0xee, 0xda, 0xd7, 0xe4, 0xe1, + 0xf6, 0xe8, 0xd3, 0xd2, 0xb5, 0xd7, 0xf7, 0xdd, + 0xd9, 0xab, 0xce, 0xe7, 0xba, 0xbc, 0xde, 0xd8, + 0xaf, 0xdd, 0xc6, 0xd8, 0xe8, 0xbd, 0x95, 0xa2, + 0xb5, 0x8a, 0x90, 0x81, 0xaa, 0xa7, 0xce, 0xed, + 0xf4, 0xe7, 0xe9, 0xeb, 0xe1, 0xe7, 0xef, 0xe5, + 0xec, 0xdf, 0xe0, 0xe8, 0xe9, 0xeb, 0xed, 0xe8, + 0xea, 0xe6, 0xea, 0xec, 0xe7, 0xe9, 0xed, 0xe8, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xef, 0xdf, 0xe3, 0xe4, 0xd7, 0xe3, 0x90, 0xbd, + 0x72, 0x37, 0x88, 0xe1, 0xff, 0xae, 0xc1, 0xdd, + 0xf0, 0xe9, 0xe7, 0xeb, 0xc6, 0x76, 0x5b, 0x85, + 0x80, 0x85, 0x82, 0x6a, 0x67, 0x93, 0x9f, 0x76, + 0x6a, 0x62, 0x4b, 0x36, 0x22, 0x0b, 0x16, 0x3c, + 0x68, 0x68, 0x89, 0x73, 0x4c, 0x40, 0x46, 0x80, + 0xde, 0xfd, 0xf1, 0xf1, 0xfb, 0xfc, 0xdf, 0x8e, + 0x24, 0x00, 0x0d, 0x0e, 0x5c, 0x5d, 0x35, 0x6c, + 0x5d, 0x5e, 0x60, 0x62, 0x65, 0x6e, 0x80, 0x90, + 0xa3, 0x95, 0x88, 0x83, 0x7c, 0x73, 0x71, 0x75, + 0x6c, 0x62, 0x62, 0x70, 0x7b, 0x7c, 0x7c, 0x7f, + 0x7f, 0x78, 0x76, 0x7a, 0x77, 0x6d, 0x69, 0x6d, + 0x7a, 0x71, 0x6b, 0x6a, 0x65, 0x5b, 0x57, 0x5a, + 0x5a, 0x53, 0x4b, 0x4b, 0x44, 0x2b, 0x24, 0x39, + 0x48, 0x5e, 0x68, 0x67, 0x56, 0x52, 0x5b, 0x4b, + 0x43, 0x2b, 0x21, 0x29, 0x38, 0x56, 0x74, 0x7d, + 0x81, 0x5f, 0x42, 0x27, 0x3c, 0x50, 0x42, 0x5c, + 0x4a, 0x34, 0x3e, 0x51, 0x52, 0x58, 0x4e, 0x2a, + 0x4a, 0x2f, 0x74, 0x91, 0x4f, 0x52, 0x4e, 0x5e, + 0x3f, 0x40, 0x34, 0x51, 0x84, 0xa3, 0x9d, 0x60, + 0x6d, 0xb2, 0xec, 0xf8, 0xf5, 0xe5, 0xab, 0x67, + 0x2d, 0x19, 0x15, 0x28, 0x33, 0x29, 0x22, 0x26, + 0x24, 0x2d, 0x25, 0x3c, 0x5b, 0x9b, 0xdf, 0xc5, + 0x43, 0x23, 0x33, 0x38, 0x38, 0x38, 0x26, 0x3a, + 0x3d, 0x35, 0x37, 0x40, 0x3a, 0x28, 0x20, 0x25, + 0x29, 0x29, 0x2b, 0x4b, 0x4c, 0x44, 0x1c, 0x09, + 0xe8, 0xe1, 0xdf, 0xe2, 0xe6, 0xee, 0xe7, 0x73, + 0x96, 0xe5, 0xeb, 0xe3, 0xe2, 0xdf, 0xf0, 0xe5, + 0xe5, 0xe5, 0xe6, 0xe6, 0xe7, 0xe8, 0xe8, 0xe9, + 0xeb, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, 0xe7, 0xe7, + 0xe7, 0xe8, 0xeb, 0xed, 0xed, 0xed, 0xec, 0xeb, + 0xed, 0xed, 0xee, 0xee, 0xef, 0xef, 0xf0, 0xf0, + 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xea, 0xea, 0xea, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe8, 0xe5, 0xe0, 0xc7, 0xab, 0xb6, 0xd9, 0xec, + 0xf5, 0xe7, 0xec, 0xda, 0xb4, 0xd6, 0xe5, 0xe8, + 0xd6, 0xdc, 0xc6, 0xb8, 0xb5, 0xd4, 0xfd, 0xed, + 0x82, 0x88, 0xad, 0xcb, 0xaf, 0xba, 0x8c, 0x77, + 0xb3, 0x94, 0x83, 0x97, 0xb2, 0x95, 0xe5, 0xe8, + 0xea, 0xe3, 0xe6, 0xea, 0xe7, 0xea, 0xea, 0xe2, + 0xe1, 0xd8, 0xdc, 0xe6, 0xe9, 0xee, 0xee, 0xe4, + 0xed, 0xec, 0xed, 0xed, 0xea, 0xe9, 0xe8, 0xe5, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe2, 0xdf, 0xdd, 0xec, 0xdb, 0xdb, 0x79, 0xab, + 0x9f, 0x4a, 0x96, 0xe0, 0xe7, 0xae, 0xda, 0xe8, + 0xdd, 0xd2, 0xff, 0xef, 0x7b, 0x50, 0x79, 0x85, + 0xa9, 0x74, 0x74, 0x9c, 0x9a, 0x78, 0x5a, 0x45, + 0x23, 0x22, 0x23, 0x44, 0x7a, 0x91, 0x89, 0x87, + 0x66, 0x46, 0x5b, 0x96, 0xe1, 0xff, 0xfd, 0xfc, + 0xff, 0xeb, 0xac, 0x4c, 0x18, 0x0c, 0x06, 0x17, + 0x3b, 0x43, 0x45, 0x50, 0x90, 0x7e, 0x6a, 0x78, + 0x78, 0x66, 0x5b, 0x64, 0x78, 0x8d, 0xa2, 0xb1, + 0xa3, 0x88, 0x6a, 0x5a, 0x5c, 0x65, 0x6f, 0x76, + 0x60, 0x60, 0x67, 0x6f, 0x6f, 0x6a, 0x70, 0x7b, + 0x80, 0x75, 0x6f, 0x6f, 0x6b, 0x64, 0x65, 0x6c, + 0x7c, 0x71, 0x69, 0x68, 0x66, 0x60, 0x61, 0x66, + 0x6d, 0x54, 0x43, 0x42, 0x59, 0x82, 0x87, 0x65, + 0x86, 0xa7, 0x8d, 0x63, 0x37, 0x28, 0x4c, 0x52, + 0x32, 0x3b, 0x56, 0x6b, 0x60, 0x4b, 0x4b, 0x57, + 0x51, 0x40, 0x3a, 0x66, 0x78, 0x70, 0x69, 0x39, + 0x3a, 0x32, 0x3d, 0x44, 0x3b, 0x3c, 0x3f, 0x31, + 0x4e, 0x4e, 0x95, 0x88, 0x3f, 0x49, 0x55, 0x64, + 0x3a, 0x31, 0x43, 0x44, 0x5c, 0x8a, 0xa5, 0x73, + 0x9d, 0x8e, 0x6c, 0x41, 0x21, 0x19, 0x22, 0x2c, + 0x23, 0x2c, 0x2f, 0x29, 0x27, 0x2e, 0x32, 0x31, + 0x17, 0x32, 0x2d, 0x20, 0x29, 0x74, 0xda, 0xec, + 0xca, 0x50, 0x21, 0x34, 0x45, 0x4c, 0x38, 0x28, + 0x49, 0x38, 0x2b, 0x2e, 0x32, 0x33, 0x38, 0x41, + 0x48, 0x3e, 0x34, 0x4e, 0x4f, 0x4c, 0x27, 0x15, + 0xed, 0xed, 0xe2, 0xd8, 0xdd, 0xe9, 0xe2, 0x6c, + 0x9c, 0xff, 0xf4, 0xd8, 0xe6, 0xdf, 0xe1, 0xe1, + 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe6, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe6, 0xe5, 0xe5, 0xe4, 0xe3, 0xe3, + 0xe9, 0xea, 0xeb, 0xec, 0xeb, 0xe9, 0xe7, 0xe5, + 0xeb, 0xec, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf0, + 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xed, 0xed, 0xec, 0xeb, 0xeb, 0xea, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xed, 0xf0, 0xf1, 0xd9, 0xaa, 0xa0, 0xc0, + 0xf8, 0xea, 0xe7, 0xdf, 0xc7, 0xd1, 0xc1, 0xc3, + 0xea, 0xd3, 0xab, 0x9f, 0xdb, 0xf9, 0xdd, 0xe9, + 0xc1, 0x72, 0x8b, 0xcb, 0xb5, 0xda, 0xaa, 0x55, + 0x72, 0x96, 0xad, 0xa1, 0xa0, 0x97, 0xf5, 0xe2, + 0xe7, 0xeb, 0xe6, 0xe3, 0xe8, 0xe4, 0xde, 0xe2, + 0xe2, 0xde, 0xe5, 0xeb, 0xeb, 0xed, 0xea, 0xdd, + 0xe9, 0xec, 0xed, 0xee, 0xef, 0xed, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xf1, 0xea, 0xcf, 0xdf, 0xe7, 0xeb, 0x7f, 0xa5, + 0xbe, 0x5d, 0xb4, 0xe8, 0xd1, 0xa0, 0xd7, 0xed, + 0xf1, 0xff, 0xd1, 0x7e, 0x69, 0x84, 0x84, 0x6a, + 0x70, 0x81, 0x93, 0x6c, 0x1d, 0x07, 0x31, 0x53, + 0x73, 0x93, 0x9a, 0x7b, 0x4e, 0x39, 0x62, 0xa7, + 0xf5, 0xff, 0xf2, 0xf8, 0xff, 0xf6, 0x9e, 0x26, + 0x03, 0x23, 0x26, 0x21, 0x32, 0x36, 0x45, 0x74, + 0x73, 0x79, 0x6a, 0x70, 0x87, 0x6b, 0x7b, 0x60, + 0x79, 0x6c, 0x6b, 0x77, 0x7e, 0x7c, 0x81, 0x8c, + 0x72, 0x79, 0x7a, 0x72, 0x6a, 0x6c, 0x76, 0x7f, + 0x5c, 0x58, 0x5d, 0x6e, 0x79, 0x78, 0x74, 0x76, + 0x77, 0x73, 0x76, 0x7f, 0x7e, 0x74, 0x70, 0x73, + 0x72, 0x69, 0x67, 0x6f, 0x73, 0x6b, 0x61, 0x5d, + 0x54, 0x4a, 0x54, 0x4c, 0x4a, 0x9a, 0xe4, 0xdb, + 0xbb, 0xae, 0x91, 0x83, 0x65, 0x60, 0x67, 0x2c, + 0x3e, 0x66, 0x80, 0x7a, 0x6d, 0x65, 0x5c, 0x54, + 0x7d, 0x82, 0x62, 0x46, 0x38, 0x4e, 0x67, 0x38, + 0x25, 0x40, 0x62, 0x65, 0x46, 0x35, 0x3c, 0x42, + 0x4b, 0x52, 0x98, 0x76, 0x36, 0x35, 0x37, 0x36, + 0x43, 0x35, 0x43, 0x20, 0x4c, 0x7b, 0x8e, 0x7e, + 0x3e, 0x2a, 0x23, 0x2c, 0x2e, 0x23, 0x22, 0x2d, + 0x24, 0x27, 0x21, 0x1c, 0x26, 0x35, 0x32, 0x22, + 0x23, 0x2a, 0x2a, 0x2a, 0x25, 0x45, 0x91, 0xc0, + 0xd8, 0x97, 0x4d, 0x45, 0x54, 0x5c, 0x6d, 0x66, + 0x4a, 0x38, 0x26, 0x22, 0x26, 0x28, 0x2b, 0x2e, + 0x3b, 0x3a, 0x3d, 0x5e, 0x5d, 0x4e, 0x1b, 0x00, + 0xe7, 0xdf, 0xdf, 0xec, 0xf5, 0xce, 0x9d, 0x45, + 0x64, 0xc0, 0xf4, 0xfa, 0xe9, 0xdd, 0xe7, 0xde, + 0xe2, 0xe2, 0xe3, 0xe3, 0xe4, 0xe5, 0xe5, 0xe6, + 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe6, 0xe5, 0xe5, + 0xe9, 0xea, 0xeb, 0xeb, 0xe9, 0xe7, 0xe4, 0xe2, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xee, 0xef, 0xef, + 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xec, + 0xee, 0xee, 0xed, 0xec, 0xea, 0xe9, 0xe8, 0xe8, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xee, 0xe9, 0xe5, 0xf5, 0xf4, 0xbf, 0xa0, 0xbb, + 0xcf, 0xda, 0xd1, 0xe7, 0xdc, 0xd4, 0xcf, 0xc6, + 0xcd, 0xdf, 0xb3, 0x9a, 0xc4, 0xda, 0xcd, 0xc6, + 0xc9, 0x81, 0x74, 0xb7, 0xb4, 0xba, 0xb9, 0x76, + 0x69, 0x7d, 0xb0, 0x84, 0x88, 0xa5, 0xec, 0xf7, + 0xee, 0xf5, 0xe7, 0xda, 0xdd, 0xd8, 0xd6, 0xe6, + 0xea, 0xeb, 0xf1, 0xef, 0xe6, 0xe7, 0xe6, 0xda, + 0xe0, 0xe7, 0xe9, 0xeb, 0xf2, 0xef, 0xea, 0xed, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe5, 0xee, 0xd9, 0xdb, 0xeb, 0xfb, 0x96, 0x9a, + 0xbe, 0x6e, 0xc8, 0xf5, 0xda, 0x9a, 0xc8, 0xef, + 0xfd, 0xd7, 0x7c, 0x4e, 0x75, 0x91, 0x88, 0x8e, + 0x7c, 0x7f, 0x87, 0x7e, 0x7a, 0x95, 0x99, 0x73, + 0x4d, 0x52, 0x77, 0xc7, 0xff, 0xff, 0xf2, 0xff, + 0xf5, 0xe9, 0x83, 0x24, 0x00, 0x12, 0x55, 0x58, + 0x79, 0xaa, 0x76, 0x65, 0x54, 0x3c, 0x74, 0x83, + 0x5f, 0x5a, 0x80, 0x97, 0x95, 0x87, 0xbb, 0xc3, + 0xa7, 0x85, 0x6e, 0x73, 0x77, 0x69, 0x5d, 0x5c, + 0x43, 0x52, 0x5e, 0x62, 0x64, 0x68, 0x65, 0x5d, + 0x53, 0x59, 0x69, 0x7a, 0x7e, 0x7a, 0x80, 0x8c, + 0x8b, 0x82, 0x7c, 0x7c, 0x77, 0x6c, 0x69, 0x6e, + 0x77, 0x6a, 0x64, 0x69, 0x6b, 0x65, 0x5c, 0x59, + 0x5f, 0x47, 0x49, 0x4c, 0x69, 0xbf, 0xd1, 0x7f, + 0xa4, 0xd3, 0x8e, 0x43, 0x3d, 0x23, 0x26, 0x63, + 0x43, 0x52, 0x55, 0x56, 0x61, 0x61, 0x5c, 0x60, + 0x50, 0x6a, 0x79, 0x51, 0x41, 0x42, 0x30, 0x45, + 0x30, 0x3a, 0x49, 0x4f, 0x49, 0x3e, 0x34, 0x2d, + 0x37, 0x3c, 0x8d, 0x7c, 0x5d, 0x58, 0x54, 0x4d, + 0x59, 0x56, 0x56, 0x4c, 0xa7, 0x9e, 0x87, 0x80, + 0x56, 0x3d, 0x2a, 0x31, 0x42, 0x44, 0x33, 0x23, + 0x25, 0x29, 0x31, 0x38, 0x39, 0x39, 0x3d, 0x44, + 0x59, 0x43, 0x48, 0x63, 0x58, 0x3b, 0x4e, 0x7c, + 0xb9, 0xce, 0x7a, 0x3f, 0x4b, 0x4f, 0x4b, 0x35, + 0x36, 0x31, 0x2f, 0x34, 0x3b, 0x3d, 0x39, 0x34, + 0x3b, 0x39, 0x37, 0x53, 0x50, 0x46, 0x1d, 0x09, + 0xe9, 0xe5, 0xe4, 0xd2, 0xa7, 0x49, 0x32, 0x4e, + 0x5e, 0x33, 0x69, 0xdf, 0xff, 0xe7, 0xdb, 0xd6, + 0xe1, 0xe1, 0xe2, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, + 0xe9, 0xe9, 0xe9, 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, + 0xe5, 0xe6, 0xe8, 0xe9, 0xe9, 0xe7, 0xe5, 0xe4, + 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xec, 0xed, 0xee, + 0xe8, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xed, + 0xef, 0xef, 0xed, 0xec, 0xea, 0xe9, 0xe7, 0xe7, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe3, 0xf9, 0xf2, 0xdf, 0xe0, 0xd5, 0xb3, 0x99, + 0xb9, 0xdc, 0xee, 0xf9, 0xcd, 0xc3, 0xd3, 0xd3, + 0xcd, 0xd9, 0xb5, 0xd1, 0xe1, 0xc9, 0xed, 0xff, + 0xad, 0x83, 0x66, 0x89, 0xc6, 0xd3, 0xc2, 0x79, + 0x85, 0x7e, 0xae, 0x83, 0x94, 0xa7, 0xcc, 0xe3, + 0xe6, 0xeb, 0xe8, 0xdd, 0xd4, 0xd3, 0xde, 0xec, + 0xe6, 0xe9, 0xed, 0xe3, 0xd6, 0xdc, 0xe6, 0xe2, + 0xdf, 0xe9, 0xe7, 0xe7, 0xee, 0xe7, 0xde, 0xe1, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe3, 0xec, 0xea, 0xd5, 0xd0, 0xe9, 0xaa, 0x98, + 0xb3, 0x62, 0x9f, 0xdd, 0xe0, 0xa2, 0xdd, 0xff, + 0xb3, 0x79, 0x6d, 0x8d, 0x90, 0x7f, 0x7e, 0x85, + 0x9d, 0x6f, 0x71, 0x86, 0x6f, 0x65, 0x9c, 0xdb, + 0xf6, 0xff, 0xff, 0xfe, 0xf7, 0xc3, 0x68, 0x26, + 0x02, 0x0c, 0x17, 0x2f, 0x47, 0x4d, 0x41, 0x29, + 0x4d, 0x48, 0x28, 0x5a, 0x51, 0x39, 0x87, 0x88, + 0xa2, 0xb6, 0xde, 0xc7, 0xa1, 0x96, 0xc4, 0xb8, + 0x97, 0x70, 0x5b, 0x6e, 0x82, 0x7b, 0x6e, 0x6b, + 0x6a, 0x67, 0x5d, 0x57, 0x64, 0x77, 0x79, 0x6d, + 0x66, 0x72, 0x81, 0x81, 0x6f, 0x63, 0x72, 0x8a, + 0xa2, 0x92, 0x84, 0x7c, 0x74, 0x6c, 0x6f, 0x79, + 0x75, 0x6b, 0x63, 0x61, 0x5d, 0x57, 0x58, 0x5f, + 0x5a, 0x55, 0x42, 0x38, 0x7a, 0xea, 0xee, 0x91, + 0x95, 0x33, 0x48, 0x65, 0x32, 0x3b, 0x64, 0x59, + 0x58, 0x5c, 0x60, 0x75, 0x82, 0x67, 0x4e, 0x58, + 0x88, 0x56, 0x3a, 0x2d, 0x38, 0x30, 0x24, 0x57, + 0x5e, 0x59, 0x4e, 0x45, 0x42, 0x3d, 0x39, 0x39, + 0x40, 0x56, 0xa2, 0x6a, 0x3f, 0x38, 0x3b, 0x30, + 0x4b, 0x59, 0x6b, 0x96, 0xc7, 0x6a, 0x87, 0x92, + 0x7a, 0x49, 0x2c, 0x3b, 0x49, 0x41, 0x42, 0x52, + 0x3b, 0x4a, 0x5f, 0x6b, 0x69, 0x60, 0x55, 0x4e, + 0x62, 0x6a, 0x6e, 0x63, 0x5f, 0x5a, 0x46, 0x3a, + 0x82, 0xd2, 0xce, 0x7c, 0x47, 0x41, 0x47, 0x47, + 0x47, 0x3f, 0x32, 0x27, 0x26, 0x2b, 0x2f, 0x30, + 0x30, 0x39, 0x45, 0x65, 0x5e, 0x4b, 0x1c, 0x06, + 0xea, 0xe4, 0x97, 0x22, 0x0f, 0x10, 0x1c, 0x34, + 0x2e, 0x24, 0x0e, 0x1a, 0x76, 0xd0, 0xe4, 0xde, + 0xe0, 0xe0, 0xe1, 0xe2, 0xe2, 0xe3, 0xe4, 0xe4, + 0xe1, 0xe1, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xdd, + 0xe1, 0xe3, 0xe5, 0xe8, 0xe9, 0xe9, 0xe8, 0xe7, + 0xe3, 0xe4, 0xe5, 0xe7, 0xe9, 0xeb, 0xec, 0xed, + 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xed, + 0xf0, 0xef, 0xee, 0xec, 0xea, 0xe8, 0xe7, 0xe6, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xec, 0xe9, 0xe7, 0xe8, 0xe9, 0xe7, 0xe3, 0xdf, + 0x9d, 0xa4, 0xcb, 0xd3, 0xb6, 0xd6, 0xd9, 0xcc, + 0xdf, 0xc0, 0xad, 0xce, 0xf1, 0xe8, 0xe4, 0xf6, + 0xdf, 0xcb, 0xb7, 0x7e, 0xb9, 0xe4, 0xc7, 0x8a, + 0x77, 0x97, 0xb5, 0x82, 0x92, 0xa5, 0xdf, 0xe8, + 0xd4, 0xd7, 0xe6, 0xe7, 0xd5, 0xd7, 0xea, 0xf1, + 0xd8, 0xdc, 0xdf, 0xd3, 0xc6, 0xd4, 0xe9, 0xed, + 0xe7, 0xf0, 0xea, 0xe5, 0xe8, 0xdc, 0xcd, 0xd0, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xf4, 0xeb, 0xf7, 0xde, 0xcc, 0xe4, 0xbc, 0x99, + 0xcc, 0x6a, 0x8a, 0xdc, 0xec, 0xa6, 0xde, 0xe1, + 0x86, 0x88, 0x83, 0x7b, 0x7b, 0x80, 0x72, 0x5b, + 0x4d, 0x6c, 0x8d, 0x96, 0xa8, 0xdf, 0xf0, 0xc6, + 0xda, 0x8e, 0x31, 0x13, 0x30, 0x3b, 0x27, 0x19, + 0x48, 0x5f, 0x84, 0x71, 0x66, 0x6b, 0x46, 0x35, + 0x44, 0x36, 0x4d, 0x61, 0x40, 0x6a, 0xc5, 0xbb, + 0xc8, 0xba, 0xb1, 0xbe, 0xb0, 0x85, 0xb8, 0xac, + 0x9e, 0x7f, 0x6b, 0x6a, 0x61, 0x51, 0x5a, 0x72, + 0x6a, 0x81, 0x90, 0x8c, 0x87, 0x87, 0x80, 0x73, + 0x71, 0x6f, 0x70, 0x71, 0x6b, 0x67, 0x73, 0x85, + 0x6f, 0x69, 0x68, 0x6d, 0x6d, 0x68, 0x68, 0x6f, + 0x5f, 0x61, 0x67, 0x69, 0x60, 0x53, 0x54, 0x5d, + 0x60, 0x59, 0x53, 0x54, 0x47, 0x27, 0x16, 0x1e, + 0x35, 0x45, 0x46, 0x31, 0x4a, 0x4e, 0x28, 0x40, + 0x59, 0x75, 0x74, 0x68, 0x6f, 0x6e, 0x67, 0x6f, + 0x68, 0x45, 0x2f, 0x4c, 0x42, 0x29, 0x3e, 0x3b, + 0x56, 0x49, 0x35, 0x33, 0x44, 0x4e, 0x4a, 0x48, + 0x2e, 0x6a, 0xba, 0x53, 0x17, 0x29, 0x4c, 0x47, + 0x3d, 0x32, 0x57, 0xc8, 0xcc, 0x3b, 0x8b, 0x75, + 0x65, 0x68, 0x67, 0x60, 0x5e, 0x64, 0x68, 0x68, + 0x42, 0x5f, 0x69, 0x56, 0x4b, 0x55, 0x58, 0x4d, + 0x61, 0x64, 0x64, 0x59, 0x60, 0x65, 0x4c, 0x3c, + 0x6a, 0x96, 0xd4, 0x96, 0x35, 0x31, 0x3c, 0x37, + 0x4a, 0x45, 0x39, 0x2c, 0x27, 0x2d, 0x33, 0x36, + 0x39, 0x41, 0x4b, 0x66, 0x59, 0x45, 0x1a, 0x09, + 0xf3, 0xf7, 0xd2, 0xa4, 0xbe, 0xad, 0x8a, 0x84, + 0x5f, 0x56, 0x9b, 0xa0, 0xd3, 0xe2, 0xec, 0xd5, + 0xde, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe2, + 0xdf, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xf0, 0xd4, 0xf4, 0xe9, 0xe1, 0xe5, 0xf2, 0xe7, + 0xea, 0xec, 0xee, 0xef, 0xee, 0xeb, 0xe7, 0xe5, + 0xef, 0xe8, 0xe3, 0xe6, 0xe9, 0xe4, 0xe1, 0xe3, + 0xe1, 0xda, 0xe0, 0xe8, 0xd1, 0xb2, 0xe4, 0xf1, + 0xda, 0xcb, 0xd9, 0xc6, 0xcf, 0xd1, 0xd9, 0xc6, + 0xec, 0xc1, 0xb8, 0xd2, 0xea, 0xec, 0xd1, 0xd5, + 0xd3, 0xd9, 0xda, 0x9f, 0x91, 0xba, 0xd8, 0x9d, + 0x83, 0x62, 0x88, 0x87, 0x6d, 0x8c, 0xe3, 0xe7, + 0xe1, 0xf1, 0xd4, 0xcc, 0xd5, 0xd7, 0xea, 0xf5, + 0xcb, 0xd9, 0xee, 0xf4, 0xd3, 0xcd, 0xe8, 0xd8, + 0xdb, 0xea, 0xea, 0xe9, 0xe2, 0xc7, 0xc4, 0xe4, + 0xeb, 0xef, 0xeb, 0xe0, 0xdf, 0xe8, 0xe9, 0xe3, + 0xe9, 0xef, 0xe7, 0xee, 0xe4, 0xc8, 0xc8, 0xa9, + 0xad, 0x4f, 0x5e, 0xb6, 0xe5, 0xac, 0xbb, 0x7b, + 0x77, 0x66, 0x67, 0x60, 0x4e, 0x70, 0xc3, 0xfe, + 0xf8, 0xff, 0xcd, 0x92, 0x85, 0x6f, 0x4b, 0x41, + 0x1a, 0x24, 0x21, 0x1f, 0x3f, 0x6b, 0x74, 0x64, + 0x4a, 0x4f, 0x40, 0x34, 0x36, 0x33, 0x49, 0x78, + 0x54, 0x2b, 0x38, 0x7b, 0x54, 0x49, 0xac, 0xb2, + 0xb4, 0xb3, 0xaf, 0xb6, 0xa0, 0x7e, 0xbf, 0xb3, + 0x8d, 0x71, 0x5d, 0x64, 0x72, 0x73, 0x6b, 0x66, + 0x73, 0x7c, 0x81, 0x7f, 0x82, 0x87, 0x81, 0x75, + 0x62, 0x6f, 0x76, 0x72, 0x70, 0x75, 0x78, 0x76, + 0x64, 0x6d, 0x7a, 0x83, 0x82, 0x78, 0x6b, 0x61, + 0x58, 0x5a, 0x5f, 0x65, 0x67, 0x62, 0x57, 0x4d, + 0x54, 0x51, 0x54, 0x5f, 0x4a, 0x42, 0x6d, 0x86, + 0x7d, 0x66, 0x57, 0x44, 0x2c, 0x37, 0x53, 0x59, + 0x4f, 0x5b, 0x68, 0x6b, 0x63, 0x5a, 0x57, 0x59, + 0x71, 0x43, 0x3f, 0x40, 0x4e, 0x52, 0x34, 0x3d, + 0x3c, 0x44, 0x3f, 0x2e, 0x2d, 0x48, 0x6b, 0x7f, + 0x59, 0x76, 0x95, 0x65, 0x58, 0x5e, 0x32, 0x3f, + 0x48, 0x31, 0x50, 0xe2, 0x87, 0x41, 0x87, 0x76, + 0x5b, 0x50, 0x5a, 0x4c, 0x42, 0x55, 0x5b, 0x5d, + 0x5d, 0x58, 0x63, 0x4e, 0x49, 0x57, 0x47, 0x4a, + 0x4f, 0x6c, 0x6b, 0x52, 0x4e, 0x57, 0x5b, 0x5e, + 0x42, 0x4c, 0x9b, 0xca, 0x89, 0x47, 0x46, 0x50, + 0x2e, 0x40, 0x37, 0x38, 0x37, 0x36, 0x42, 0x34, + 0x2a, 0x3c, 0x29, 0x3e, 0x4f, 0x46, 0x1d, 0x11, + 0xe7, 0xeb, 0xdb, 0xbf, 0xdb, 0xd7, 0xda, 0xfa, + 0xe2, 0xf2, 0xe7, 0xc8, 0xec, 0xe3, 0xe3, 0xd3, + 0xde, 0xde, 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, 0xe2, + 0xdf, 0xe0, 0xe1, 0xe3, 0xe4, 0xe6, 0xe7, 0xe7, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xee, 0xdd, 0xe8, 0xef, 0xe1, 0xe8, 0xec, 0xec, + 0xea, 0xeb, 0xed, 0xee, 0xed, 0xeb, 0xe8, 0xe5, + 0xe8, 0xef, 0xea, 0xe6, 0xed, 0xec, 0xe5, 0xe7, + 0xc8, 0xdf, 0xdd, 0xe3, 0xcf, 0x95, 0xc3, 0xea, + 0xd8, 0xdb, 0xce, 0xba, 0xe5, 0xe0, 0xce, 0xc9, + 0xf0, 0xa3, 0xdf, 0xf6, 0xed, 0xd9, 0xc2, 0xbe, + 0xc5, 0xf7, 0xd7, 0xd1, 0xa9, 0x6a, 0xaf, 0x86, + 0x79, 0x82, 0x9f, 0x95, 0x9c, 0xb5, 0xe7, 0xea, + 0xcb, 0xcb, 0xd6, 0xde, 0xc8, 0xd7, 0xfa, 0xdf, + 0xd8, 0xf2, 0xdc, 0xe2, 0xd6, 0xcd, 0xee, 0xd2, + 0xc8, 0xe0, 0xe3, 0xeb, 0xdc, 0xd3, 0xf0, 0xf2, + 0xf2, 0xeb, 0xe8, 0xee, 0xf0, 0xeb, 0xe7, 0xe8, + 0xe4, 0xea, 0xe2, 0xea, 0xf1, 0xe5, 0xc4, 0xb7, + 0xae, 0x4f, 0x7f, 0xc1, 0xd5, 0x87, 0x4b, 0x3a, + 0x64, 0x75, 0xb4, 0xef, 0xfa, 0xf9, 0xf9, 0xec, + 0xaa, 0x86, 0x43, 0x26, 0x3e, 0x43, 0x38, 0x43, + 0x64, 0x4e, 0x4d, 0x76, 0x89, 0x5f, 0x38, 0x3f, + 0x61, 0x3b, 0x30, 0x49, 0x56, 0x4c, 0x41, 0x40, + 0x44, 0x56, 0x64, 0x76, 0x4e, 0x5d, 0xc3, 0xce, + 0xb1, 0xb6, 0xc5, 0xd4, 0xb6, 0x89, 0xc1, 0xb4, + 0x84, 0x6f, 0x65, 0x72, 0x7f, 0x7a, 0x6a, 0x5f, + 0x6b, 0x6e, 0x6b, 0x68, 0x6e, 0x76, 0x70, 0x61, + 0x5e, 0x78, 0x8b, 0x84, 0x74, 0x70, 0x76, 0x7c, + 0x81, 0x7f, 0x7b, 0x75, 0x6d, 0x66, 0x5f, 0x5b, + 0x71, 0x72, 0x74, 0x76, 0x76, 0x6e, 0x61, 0x57, + 0x5f, 0x43, 0x4f, 0x66, 0x37, 0x15, 0x2b, 0x29, + 0x0e, 0x3d, 0x58, 0x53, 0x42, 0x27, 0x23, 0x3d, + 0x6a, 0x66, 0x6b, 0x72, 0x6a, 0x5b, 0x5d, 0x6b, + 0x73, 0x3c, 0x34, 0x3b, 0x40, 0x38, 0x2c, 0x4f, + 0x36, 0x36, 0x46, 0x59, 0x54, 0x3d, 0x38, 0x45, + 0x11, 0x54, 0x8c, 0x66, 0x43, 0x3d, 0x30, 0x4f, + 0x67, 0x33, 0x9d, 0xf7, 0x6f, 0x2b, 0x66, 0x83, + 0x67, 0x52, 0x62, 0x64, 0x59, 0x55, 0x48, 0x48, + 0x59, 0x45, 0x49, 0x56, 0x5c, 0x56, 0x4b, 0x55, + 0x5c, 0x51, 0x5e, 0x5f, 0x4d, 0x5a, 0x6c, 0x5c, + 0x55, 0x49, 0x6f, 0xbc, 0xc1, 0x69, 0x28, 0x2d, + 0x47, 0x31, 0x28, 0x27, 0x41, 0x48, 0x37, 0x4f, + 0x60, 0x59, 0x49, 0x58, 0x50, 0x49, 0x24, 0x07, + 0xe1, 0xe1, 0xda, 0xba, 0xc3, 0xb0, 0xa2, 0xb4, + 0xaf, 0xda, 0xb8, 0xc2, 0xeb, 0xe0, 0xe9, 0xe1, + 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe5, 0xe6, 0xe7, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe9, 0xeb, 0xdb, 0xf0, 0xe2, 0xea, 0xe8, 0xef, + 0xea, 0xeb, 0xec, 0xec, 0xec, 0xea, 0xe8, 0xe7, + 0xdd, 0xed, 0xed, 0xe7, 0xec, 0xee, 0xe8, 0xe7, + 0xdb, 0xe1, 0xdf, 0xea, 0xd6, 0xaf, 0xe3, 0xec, + 0xd9, 0xd4, 0xd9, 0xcd, 0xd1, 0xd5, 0xe6, 0xe2, + 0xc6, 0xcb, 0xf3, 0xc9, 0xe9, 0xd8, 0xc8, 0xe4, + 0xe9, 0xc2, 0xd7, 0xd0, 0xc3, 0xae, 0xae, 0xa2, + 0x8e, 0x7e, 0x73, 0x61, 0x83, 0xa6, 0xd8, 0xe9, + 0xd9, 0xcd, 0xd6, 0xe4, 0xd5, 0xde, 0xf2, 0xd5, + 0xd7, 0xe3, 0xc9, 0xdb, 0xd7, 0xbb, 0xdd, 0xec, + 0xde, 0xd9, 0xe9, 0xf2, 0xd7, 0xd7, 0xec, 0xda, + 0xe6, 0xe3, 0xe7, 0xef, 0xee, 0xe3, 0xe0, 0xe5, + 0xe7, 0xda, 0xe2, 0xf0, 0xe3, 0xf4, 0xbc, 0x96, + 0xd4, 0x61, 0x6e, 0xdf, 0xbc, 0x67, 0xaa, 0xff, + 0xff, 0xef, 0xff, 0xf9, 0x9f, 0x3c, 0x1a, 0x1e, + 0x1f, 0x29, 0x36, 0x4f, 0x5f, 0x51, 0x54, 0x78, + 0x57, 0x69, 0x62, 0x45, 0x46, 0x67, 0x66, 0x40, + 0x68, 0x3c, 0x3b, 0x4d, 0x3a, 0x2f, 0x49, 0x5f, + 0x57, 0x61, 0x64, 0x56, 0x22, 0x50, 0xcb, 0xd4, + 0xcd, 0xce, 0xc5, 0xac, 0x96, 0x95, 0xd6, 0xb8, + 0x8f, 0x78, 0x68, 0x70, 0x7c, 0x7b, 0x74, 0x70, + 0x72, 0x6e, 0x67, 0x69, 0x7b, 0x8e, 0x8b, 0x7c, + 0x80, 0x85, 0x82, 0x7b, 0x7b, 0x84, 0x88, 0x84, + 0x6f, 0x72, 0x76, 0x77, 0x75, 0x6f, 0x68, 0x63, + 0x69, 0x69, 0x6a, 0x6b, 0x6b, 0x63, 0x57, 0x4d, + 0x4e, 0x4b, 0x50, 0x54, 0x52, 0x93, 0xf4, 0xff, + 0xfc, 0xee, 0xb5, 0x73, 0x4a, 0x30, 0x2f, 0x49, + 0x4e, 0x6f, 0x7b, 0x68, 0x60, 0x6a, 0x60, 0x44, + 0x42, 0x3c, 0x46, 0x42, 0x4a, 0x5c, 0x5b, 0x65, + 0x4d, 0x4c, 0x4f, 0x57, 0x62, 0x60, 0x4c, 0x36, + 0x31, 0x7e, 0xa3, 0x6b, 0x2f, 0x29, 0x4e, 0x80, + 0x5a, 0x1e, 0xcf, 0xd5, 0x4d, 0x3e, 0x65, 0x8d, + 0x76, 0x4d, 0x53, 0x5f, 0x5c, 0x57, 0x50, 0x5c, + 0x4f, 0x5e, 0x60, 0x5e, 0x53, 0x49, 0x50, 0x4e, + 0x48, 0x50, 0x40, 0x3d, 0x53, 0x4d, 0x42, 0x55, + 0x2d, 0x30, 0x3f, 0x8f, 0xdd, 0xb7, 0x7a, 0x88, + 0x82, 0x92, 0x8d, 0x6a, 0x6b, 0x61, 0x35, 0x36, + 0x2f, 0x32, 0x30, 0x3c, 0x2d, 0x2d, 0x17, 0x0e, + 0xdd, 0xe0, 0xe0, 0xb4, 0xb9, 0xb3, 0xa5, 0xb2, + 0xb9, 0xce, 0xb4, 0xe2, 0xe9, 0xdb, 0xe6, 0xde, + 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe2, 0xe4, 0xe5, 0xe7, 0xe8, 0xe9, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe2, 0xf3, 0xda, 0xe3, 0xe6, 0xea, 0xec, 0xed, + 0xe9, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe8, + 0xda, 0xdd, 0xe7, 0xeb, 0xe7, 0xe7, 0xe9, 0xe5, + 0xd1, 0xc2, 0xd9, 0xf6, 0xe5, 0xbc, 0xd5, 0xd4, + 0xef, 0xe7, 0xcd, 0xbd, 0xc1, 0xc6, 0xd9, 0xe1, + 0xbf, 0xdb, 0xfa, 0xdc, 0xd5, 0xbb, 0xd2, 0xdc, + 0xa9, 0xcd, 0xff, 0xff, 0xf0, 0xc0, 0xa5, 0x9f, + 0xae, 0x7c, 0x7e, 0x91, 0xb2, 0xc2, 0xe4, 0xe2, + 0xcc, 0xe4, 0xcb, 0xc2, 0xea, 0xf0, 0xd1, 0xc4, + 0xfc, 0xe9, 0xe4, 0xee, 0xe0, 0xbd, 0xbf, 0xe7, + 0xe2, 0xb7, 0xde, 0xeb, 0xde, 0xeb, 0xe0, 0xdf, + 0xd9, 0xe4, 0xeb, 0xe8, 0xe1, 0xdf, 0xe3, 0xe5, + 0xf0, 0xee, 0xec, 0xf3, 0xe0, 0xff, 0xbf, 0x86, + 0xdd, 0x60, 0x4d, 0xd7, 0xff, 0xcd, 0xa5, 0xdc, + 0x8a, 0x3b, 0x2b, 0x51, 0x40, 0x1b, 0x32, 0x63, + 0x62, 0x57, 0x50, 0x5c, 0x66, 0x5a, 0x4e, 0x51, + 0x6f, 0x67, 0x87, 0x9b, 0x88, 0x89, 0x95, 0x84, + 0x43, 0x27, 0x2a, 0x43, 0x46, 0x3f, 0x41, 0x42, + 0x31, 0x37, 0x34, 0x3f, 0x3f, 0x5d, 0xa8, 0xbf, + 0xaa, 0x7a, 0x74, 0x97, 0xa9, 0x90, 0xb8, 0xb8, + 0x91, 0x7a, 0x69, 0x6e, 0x77, 0x78, 0x77, 0x79, + 0x73, 0x67, 0x57, 0x54, 0x67, 0x7a, 0x74, 0x61, + 0x61, 0x6f, 0x71, 0x61, 0x51, 0x51, 0x59, 0x5f, + 0x62, 0x69, 0x71, 0x77, 0x74, 0x6a, 0x5e, 0x55, + 0x5a, 0x5a, 0x5b, 0x5e, 0x60, 0x5b, 0x52, 0x4a, + 0x58, 0x4d, 0x50, 0x98, 0xe9, 0xfd, 0xd1, 0x8a, + 0x47, 0x2a, 0x20, 0x24, 0x27, 0x3b, 0x47, 0x3a, + 0x53, 0x5a, 0x68, 0x74, 0x6e, 0x59, 0x46, 0x3f, + 0x73, 0x82, 0x81, 0x66, 0x62, 0x71, 0x67, 0x51, + 0x58, 0x6a, 0x68, 0x47, 0x2d, 0x33, 0x46, 0x50, + 0x2e, 0x53, 0x55, 0x47, 0x4a, 0x5a, 0x5f, 0x48, + 0x36, 0x3c, 0xef, 0x96, 0x25, 0x48, 0x68, 0x81, + 0x6b, 0x43, 0x4b, 0x5e, 0x62, 0x60, 0x55, 0x5a, + 0x45, 0x62, 0x5b, 0x58, 0x51, 0x50, 0x65, 0x59, + 0x52, 0x4c, 0x51, 0x55, 0x51, 0x5a, 0x64, 0x60, + 0x8f, 0x7f, 0x57, 0x65, 0xb7, 0xd9, 0xa2, 0x68, + 0x58, 0x5f, 0x45, 0x41, 0x38, 0x1f, 0x2f, 0x44, + 0x65, 0x6d, 0x65, 0x78, 0x88, 0x75, 0x20, 0x02, + 0xe2, 0xe7, 0xed, 0xba, 0xaa, 0x88, 0x6a, 0x85, + 0xb8, 0xb8, 0xb0, 0xe2, 0xdc, 0xe2, 0xdd, 0xd0, + 0xdc, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, + 0xe1, 0xe2, 0xe3, 0xe5, 0xe6, 0xe8, 0xe9, 0xe9, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xde, 0xf2, 0xdf, 0xd0, 0xe9, 0xe7, 0xf2, 0xe7, + 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xea, + 0xe4, 0xcf, 0xdf, 0xf3, 0xe5, 0xe1, 0xeb, 0xe7, + 0xc5, 0xc1, 0xe1, 0xef, 0xdf, 0xa3, 0xaa, 0xdf, + 0xe1, 0xd6, 0xd1, 0xdc, 0xca, 0xd2, 0xf2, 0xea, + 0xb4, 0xe5, 0xff, 0xd7, 0x9f, 0xb9, 0xdc, 0xb4, + 0xd7, 0xef, 0xeb, 0xca, 0xef, 0xd6, 0xa6, 0xa4, + 0x5c, 0x49, 0x63, 0x70, 0x81, 0x94, 0xce, 0xe4, + 0xe5, 0xe3, 0xba, 0xbc, 0xf1, 0xdd, 0xb8, 0xde, + 0xe8, 0xd4, 0xdc, 0xe9, 0xe8, 0xe0, 0xd6, 0xd9, + 0xf0, 0xcb, 0xe1, 0xe2, 0xdb, 0xe2, 0xd1, 0xdd, + 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe6, 0xea, 0xed, + 0xde, 0xed, 0xd4, 0xe3, 0xca, 0xaa, 0x67, 0x75, + 0xc6, 0x6e, 0x56, 0xde, 0xe5, 0x82, 0x33, 0x1d, + 0x18, 0x00, 0x21, 0x64, 0x76, 0x6b, 0x68, 0x68, + 0x67, 0x64, 0x5e, 0x57, 0x60, 0x7c, 0x8e, 0x8a, + 0x68, 0x81, 0x7f, 0x5d, 0x4e, 0x5b, 0x4c, 0x21, + 0x22, 0x40, 0x54, 0x5d, 0x61, 0x51, 0x41, 0x43, + 0x48, 0x5b, 0x36, 0x2a, 0x3e, 0x2d, 0x26, 0x42, + 0x4f, 0x2b, 0x2c, 0x54, 0x79, 0x4f, 0x4d, 0x51, + 0x77, 0x69, 0x65, 0x70, 0x77, 0x71, 0x68, 0x66, + 0x6b, 0x61, 0x55, 0x58, 0x70, 0x89, 0x87, 0x77, + 0x5c, 0x77, 0x8e, 0x8f, 0x85, 0x7f, 0x7c, 0x78, + 0x76, 0x78, 0x79, 0x79, 0x77, 0x72, 0x6d, 0x6a, + 0x6a, 0x68, 0x67, 0x69, 0x6a, 0x66, 0x5e, 0x57, + 0x3c, 0x4e, 0x43, 0x3e, 0x3f, 0x46, 0x5e, 0x67, + 0x92, 0x84, 0x7b, 0x5f, 0x34, 0x2c, 0x40, 0x46, + 0x6f, 0x5b, 0x5c, 0x70, 0x6d, 0x51, 0x48, 0x57, + 0x6d, 0x64, 0x52, 0x50, 0x55, 0x59, 0x5d, 0x57, + 0x37, 0x27, 0x27, 0x38, 0x42, 0x3a, 0x36, 0x3b, + 0x67, 0x5b, 0x62, 0x81, 0x71, 0x41, 0x37, 0x40, + 0x21, 0x82, 0xf8, 0x77, 0x25, 0x45, 0x78, 0x9f, + 0x72, 0x4c, 0x4b, 0x4f, 0x51, 0x59, 0x52, 0x54, + 0x62, 0x4f, 0x31, 0x47, 0x57, 0x4b, 0x50, 0x43, + 0x4c, 0x5b, 0x6a, 0x64, 0x5f, 0x75, 0x89, 0x84, + 0x85, 0x72, 0x56, 0x45, 0x75, 0xd3, 0xd7, 0x81, + 0x10, 0x12, 0x24, 0x56, 0x66, 0x6a, 0x88, 0x89, + 0x75, 0x78, 0x76, 0x88, 0x99, 0x87, 0x28, 0x09, + 0xeb, 0xe0, 0xea, 0xca, 0xb7, 0x5a, 0x00, 0x18, + 0x58, 0x9c, 0xd1, 0xee, 0xd9, 0xdb, 0xcf, 0xd9, + 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe7, 0xe8, 0xe9, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xdf, 0xe7, 0xdf, 0xc8, 0xe6, 0xe5, 0xf0, 0xe5, + 0xe8, 0xe7, 0xe6, 0xe6, 0xe6, 0xe8, 0xea, 0xeb, + 0xf1, 0xd2, 0xdb, 0xf3, 0xea, 0xe3, 0xec, 0xec, + 0xc3, 0xcb, 0xe7, 0xd6, 0xb8, 0x9f, 0xc0, 0xe7, + 0xf2, 0xcf, 0xd5, 0xef, 0xb7, 0xc9, 0xff, 0xe8, + 0xd0, 0xeb, 0xe9, 0xc4, 0xb5, 0xca, 0xd0, 0xf3, + 0xe6, 0xd3, 0xeb, 0xe5, 0xe6, 0xd8, 0xca, 0xb1, + 0x8a, 0x82, 0x76, 0x5c, 0x81, 0xb1, 0xe2, 0xe6, + 0xfa, 0xd8, 0xcd, 0xdb, 0xe0, 0xc1, 0xb1, 0xda, + 0xdd, 0xd7, 0xd3, 0xe9, 0xe4, 0xcf, 0xd1, 0xc4, + 0xe1, 0xe3, 0xd8, 0xd7, 0xd9, 0xde, 0xed, 0xf0, + 0xf1, 0xd8, 0xcf, 0xe1, 0xec, 0xe6, 0xe4, 0xed, + 0xeb, 0xed, 0xca, 0xa6, 0x61, 0x41, 0x36, 0x5a, + 0x5e, 0x4b, 0x57, 0xde, 0x9f, 0x50, 0x8b, 0x77, + 0x6e, 0x76, 0x7b, 0x65, 0x51, 0x66, 0x6f, 0x4f, + 0x3a, 0x56, 0x70, 0x61, 0x46, 0x55, 0x6d, 0x66, + 0x76, 0x8b, 0x8c, 0xa5, 0xc5, 0x92, 0x4b, 0x45, + 0x2b, 0x42, 0x39, 0x2e, 0x40, 0x40, 0x2e, 0x2c, + 0x24, 0x2e, 0x3b, 0x31, 0x28, 0x44, 0x58, 0x45, + 0x45, 0x5a, 0x55, 0x4a, 0x7f, 0x76, 0x71, 0x7f, + 0x6d, 0x60, 0x5a, 0x62, 0x67, 0x63, 0x61, 0x64, + 0x72, 0x6c, 0x61, 0x5e, 0x6c, 0x7a, 0x74, 0x62, + 0x6a, 0x7b, 0x8b, 0x92, 0x96, 0x97, 0x8d, 0x7f, + 0x7b, 0x7c, 0x7e, 0x7e, 0x7b, 0x77, 0x71, 0x6e, + 0x72, 0x6e, 0x6a, 0x68, 0x65, 0x60, 0x56, 0x4f, + 0x4d, 0x55, 0x51, 0x53, 0x60, 0x86, 0xa0, 0x81, + 0x64, 0x52, 0x33, 0x3a, 0x69, 0x7c, 0x6e, 0x68, + 0x67, 0x5b, 0x59, 0x65, 0x66, 0x57, 0x4e, 0x50, + 0x5d, 0x62, 0x51, 0x52, 0x5a, 0x5f, 0x64, 0x4f, + 0x59, 0x47, 0x32, 0x26, 0x27, 0x32, 0x45, 0x55, + 0x42, 0x56, 0x5e, 0x3d, 0x2f, 0x4d, 0x51, 0x36, + 0x30, 0xa4, 0xa8, 0x50, 0x34, 0x35, 0x6a, 0x9b, + 0x77, 0x4f, 0x47, 0x42, 0x40, 0x50, 0x58, 0x64, + 0x52, 0x46, 0x38, 0x4a, 0x63, 0x6b, 0x6c, 0x5f, + 0x7d, 0xa2, 0x95, 0x70, 0x6d, 0x6c, 0x64, 0x6c, + 0x47, 0x37, 0x3a, 0x31, 0x3d, 0x9d, 0xe7, 0xd1, + 0x98, 0x7a, 0x89, 0x80, 0x6a, 0x75, 0x6e, 0x5f, + 0x6b, 0x5f, 0x67, 0x67, 0x54, 0x51, 0x18, 0x0a, + 0xe4, 0xd1, 0xdd, 0xdb, 0xf1, 0x95, 0x28, 0x4a, + 0xdb, 0xf6, 0xe9, 0xd9, 0xda, 0xe8, 0xdf, 0xe1, + 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xde, + 0xe3, 0xe3, 0xe4, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xe5, 0xd9, 0xd4, 0xcf, 0xde, 0xe5, 0xe3, 0xe9, + 0xe8, 0xe7, 0xe5, 0xe4, 0xe5, 0xe7, 0xea, 0xed, + 0xf4, 0xe0, 0xd5, 0xe2, 0xee, 0xe8, 0xe5, 0xed, + 0xcb, 0xdd, 0xeb, 0xe2, 0xc4, 0xbb, 0xf0, 0xdf, + 0xfb, 0xd5, 0xa5, 0xc1, 0xbc, 0xd4, 0xf2, 0xe0, + 0xc1, 0xe9, 0xdc, 0xa0, 0xb7, 0xd7, 0xd9, 0xe1, + 0xc9, 0xc2, 0xb2, 0xdd, 0xbb, 0x8f, 0xde, 0x8f, + 0x85, 0xb5, 0xdd, 0xa7, 0x7d, 0x89, 0xc6, 0xd1, + 0xab, 0xae, 0xcc, 0xd2, 0xcf, 0xd6, 0xcf, 0xd3, + 0xe8, 0xea, 0xde, 0xe5, 0xe4, 0xcf, 0xce, 0xd4, + 0xdd, 0xdf, 0xca, 0xd6, 0xe3, 0xe5, 0xf7, 0xec, + 0xe4, 0xd0, 0xce, 0xe2, 0xe9, 0xde, 0xdd, 0xea, + 0xe7, 0x98, 0x6e, 0x4e, 0x5a, 0xb2, 0xb7, 0x81, + 0x6b, 0x57, 0x43, 0x62, 0x73, 0x87, 0x94, 0x88, + 0x62, 0x65, 0x75, 0x84, 0x9d, 0xba, 0x98, 0x46, + 0x78, 0x61, 0x60, 0x5f, 0x56, 0x6b, 0x7f, 0x71, + 0x76, 0x7b, 0x89, 0xaf, 0xb9, 0x7a, 0x40, 0x43, + 0x32, 0x46, 0x4d, 0x3f, 0x30, 0x2c, 0x38, 0x49, + 0x40, 0x41, 0x70, 0x61, 0x31, 0x5d, 0x75, 0x33, + 0x44, 0x4f, 0x3f, 0x44, 0x8c, 0x5d, 0x42, 0x87, + 0x79, 0x69, 0x5e, 0x60, 0x64, 0x64, 0x6b, 0x75, + 0x6c, 0x70, 0x70, 0x6f, 0x79, 0x84, 0x80, 0x72, + 0x6b, 0x81, 0x8d, 0x7e, 0x67, 0x5f, 0x63, 0x67, + 0x7b, 0x78, 0x73, 0x6c, 0x65, 0x5e, 0x58, 0x55, + 0x6b, 0x66, 0x60, 0x5d, 0x5a, 0x55, 0x4c, 0x45, + 0x5c, 0x49, 0x42, 0x5f, 0x71, 0x75, 0x80, 0x72, + 0x56, 0x67, 0x63, 0x5b, 0x5c, 0x50, 0x47, 0x54, + 0x6d, 0x4b, 0x4b, 0x70, 0x74, 0x52, 0x47, 0x5c, + 0x44, 0x65, 0x5e, 0x5c, 0x5c, 0x60, 0x68, 0x48, + 0x4d, 0x4c, 0x42, 0x3e, 0x51, 0x64, 0x55, 0x34, + 0x34, 0x3f, 0x79, 0x71, 0x43, 0x3c, 0x48, 0x6f, + 0x80, 0xd8, 0x78, 0x50, 0x56, 0x43, 0x69, 0x96, + 0x6d, 0x48, 0x51, 0x5d, 0x55, 0x4e, 0x4d, 0x60, + 0x36, 0x41, 0x4c, 0x43, 0x46, 0x53, 0x46, 0x37, + 0x37, 0x33, 0x41, 0x3b, 0x25, 0x34, 0x47, 0x36, + 0x65, 0x50, 0x45, 0x45, 0x4d, 0x71, 0xab, 0xd2, + 0xc0, 0x76, 0x61, 0x5e, 0x54, 0x53, 0x54, 0x68, + 0x73, 0x5b, 0x64, 0x6f, 0x6e, 0x70, 0x22, 0x02, + 0xd9, 0xd1, 0xda, 0xcd, 0xe5, 0x8c, 0x1d, 0x46, + 0xd0, 0xe5, 0xdc, 0xd6, 0xd6, 0xd4, 0xd9, 0xda, + 0xda, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, 0xde, 0xde, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9, 0xea, 0xeb, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xeb, 0xcf, 0xc8, 0xda, 0xd7, 0xe7, 0xd7, 0xee, + 0xe8, 0xe6, 0xe4, 0xe3, 0xe4, 0xe7, 0xeb, 0xed, + 0xee, 0xea, 0xcf, 0xce, 0xed, 0xea, 0xdb, 0xea, + 0xd0, 0xe5, 0xcb, 0xd8, 0xcd, 0x9d, 0xd8, 0xdd, + 0xf5, 0xd7, 0xc3, 0xf7, 0xe3, 0xe4, 0xe4, 0xaf, + 0xc1, 0xfe, 0xd5, 0x97, 0xdd, 0xe3, 0xf1, 0xe9, + 0xed, 0xe4, 0xdc, 0xbf, 0xc5, 0xca, 0xe6, 0xe8, + 0x75, 0x78, 0xa9, 0x87, 0x50, 0x73, 0xd5, 0xd8, + 0xdc, 0xc7, 0xc5, 0xc5, 0xca, 0xba, 0xac, 0xd8, + 0xe4, 0xea, 0xde, 0xbe, 0xd8, 0xf1, 0xd6, 0xdc, + 0xe9, 0xc9, 0xc0, 0xdb, 0xf1, 0xf1, 0xe5, 0xd5, + 0xd4, 0xda, 0xe5, 0xec, 0xe7, 0xde, 0xe3, 0xf0, + 0xec, 0x7f, 0x8e, 0x94, 0x7f, 0x72, 0x52, 0x55, + 0x66, 0x66, 0x42, 0x5e, 0x7d, 0x85, 0x9e, 0x8b, + 0xbe, 0xac, 0xbd, 0xd6, 0xcc, 0xb1, 0x8b, 0x5f, + 0x5e, 0x47, 0x57, 0x66, 0x4e, 0x59, 0x8c, 0xa8, + 0x5a, 0x51, 0x79, 0x8c, 0x60, 0x4c, 0x57, 0x4d, + 0x64, 0x3e, 0x33, 0x3e, 0x42, 0x52, 0x5f, 0x56, + 0x52, 0x65, 0x5d, 0x2f, 0x29, 0x46, 0x3f, 0x2c, + 0x31, 0x3e, 0x22, 0x27, 0x8f, 0x6a, 0x45, 0x95, + 0x7b, 0x72, 0x71, 0x7a, 0x7d, 0x76, 0x75, 0x7a, + 0x81, 0x8a, 0x8d, 0x8a, 0x8c, 0x90, 0x89, 0x7c, + 0x6a, 0x7a, 0x85, 0x82, 0x7c, 0x7b, 0x75, 0x6e, + 0x87, 0x7b, 0x69, 0x5d, 0x5c, 0x68, 0x78, 0x84, + 0x6c, 0x67, 0x63, 0x62, 0x62, 0x5f, 0x59, 0x54, + 0x53, 0x61, 0x49, 0x45, 0x55, 0x51, 0x50, 0x4e, + 0x5a, 0x57, 0x64, 0x63, 0x4e, 0x51, 0x64, 0x66, + 0x7a, 0x6b, 0x5f, 0x5f, 0x66, 0x6b, 0x6c, 0x6d, + 0x5e, 0x6a, 0x5e, 0x6e, 0x65, 0x50, 0x6a, 0x70, + 0x48, 0x41, 0x3f, 0x42, 0x3c, 0x2d, 0x27, 0x2c, + 0x18, 0x44, 0x85, 0x4c, 0x22, 0x48, 0x30, 0x12, + 0x6f, 0xc8, 0x4b, 0x3b, 0x41, 0x35, 0x65, 0x9a, + 0x8a, 0x58, 0x5c, 0x69, 0x55, 0x3c, 0x3b, 0x5e, + 0x4e, 0x3e, 0x52, 0x5a, 0x5f, 0x58, 0x33, 0x2f, + 0x38, 0x3c, 0x3b, 0x43, 0x57, 0x5e, 0x61, 0x6e, + 0x64, 0x7d, 0x81, 0x83, 0x7f, 0x5f, 0x7b, 0xd7, + 0xeb, 0xa0, 0x42, 0x35, 0x4f, 0x5f, 0x71, 0x67, + 0x80, 0x79, 0x7c, 0x80, 0x8f, 0x86, 0x23, 0x10, + 0xd9, 0xd9, 0xd3, 0xd9, 0xe0, 0x96, 0x1a, 0x69, + 0xe0, 0xda, 0xd4, 0xd1, 0xd2, 0xd4, 0xd5, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd7, 0xd9, 0xda, 0xda, 0xdb, + 0xdc, 0xdd, 0xde, 0xe0, 0xe2, 0xe4, 0xe5, 0xe6, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe7, 0xef, 0xcd, 0xd0, 0xe4, 0xd1, 0xca, 0xd5, + 0xed, 0xe2, 0xdb, 0xce, 0xdf, 0xf2, 0xdf, 0xde, + 0xdc, 0xf2, 0xc8, 0xcb, 0xdb, 0xed, 0xd1, 0xd2, + 0xd7, 0xde, 0xb9, 0xe5, 0xc5, 0xb9, 0xef, 0xec, + 0xe3, 0xc8, 0xbf, 0xf9, 0xdb, 0xcf, 0xf6, 0x90, + 0xc8, 0xfb, 0x95, 0xc3, 0xf1, 0xe7, 0xf4, 0xde, + 0xe2, 0xf1, 0xe9, 0xcf, 0xd1, 0xc3, 0xbd, 0xf1, + 0x9f, 0x83, 0xa0, 0xad, 0x98, 0x9c, 0xac, 0xbe, + 0xed, 0xe7, 0xda, 0xcd, 0xe2, 0xe0, 0xcb, 0xef, + 0xeb, 0xf3, 0xef, 0xe1, 0xd2, 0xc5, 0xcd, 0xe2, + 0xe6, 0xaa, 0xbc, 0xec, 0xe5, 0xd8, 0xdd, 0xd9, + 0xcb, 0xe9, 0xff, 0xd3, 0xef, 0xe6, 0xd3, 0xdb, + 0xd7, 0xe6, 0x9b, 0x56, 0x55, 0x56, 0x61, 0x79, + 0x81, 0x6a, 0x42, 0x45, 0x71, 0x82, 0x86, 0x9f, + 0xbd, 0xbd, 0xb4, 0xc8, 0xaf, 0x6d, 0x53, 0x40, + 0x68, 0x5e, 0x5e, 0x60, 0x58, 0x60, 0x86, 0xaa, + 0x74, 0x5c, 0x79, 0x60, 0x63, 0x79, 0x47, 0x46, + 0x47, 0x46, 0x45, 0x45, 0x46, 0x44, 0x3e, 0x38, + 0x28, 0x28, 0x29, 0x2c, 0x32, 0x38, 0x3d, 0x3f, + 0x29, 0x1a, 0x3d, 0x6a, 0x96, 0x83, 0x9d, 0xc1, + 0x86, 0x73, 0x70, 0x81, 0x85, 0x78, 0x76, 0x82, + 0x90, 0x96, 0x93, 0x8e, 0x96, 0x9b, 0x80, 0x5a, + 0x6d, 0x6e, 0x68, 0x58, 0x4c, 0x52, 0x6b, 0x81, + 0x6b, 0x67, 0x63, 0x64, 0x68, 0x69, 0x66, 0x61, + 0x4b, 0x4a, 0x4a, 0x51, 0x58, 0x5a, 0x55, 0x4e, + 0x59, 0x5f, 0x59, 0x47, 0x42, 0x51, 0x62, 0x6a, + 0x54, 0x5b, 0x5d, 0x58, 0x56, 0x5d, 0x67, 0x6b, + 0x6c, 0x5e, 0x47, 0x5c, 0x69, 0x5e, 0x60, 0x54, + 0x56, 0x60, 0x66, 0x66, 0x6a, 0x6d, 0x63, 0x53, + 0x41, 0x41, 0x3f, 0x3d, 0x38, 0x32, 0x2b, 0x26, + 0x1b, 0x58, 0xa3, 0x64, 0x1f, 0x45, 0x47, 0x21, + 0xae, 0xa1, 0x2a, 0x53, 0x47, 0x3c, 0x4e, 0x95, + 0x7d, 0x58, 0x38, 0x33, 0x35, 0x34, 0x41, 0x56, + 0x51, 0x39, 0x35, 0x47, 0x5a, 0x6a, 0x70, 0x69, + 0x85, 0x8d, 0x70, 0x5a, 0x74, 0x8c, 0x8d, 0x93, + 0x80, 0x9e, 0x66, 0x4e, 0x82, 0x68, 0x53, 0xa6, + 0xe2, 0xee, 0x92, 0x29, 0x2f, 0x59, 0x67, 0x76, + 0x6d, 0x49, 0x70, 0x7d, 0x77, 0x65, 0x22, 0x0f, + 0xd3, 0xd4, 0xd2, 0xd4, 0xe7, 0xa3, 0x2d, 0x8f, + 0xe3, 0xdd, 0xd6, 0xd3, 0xd4, 0xd6, 0xd7, 0xd6, + 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, + 0xdd, 0xdd, 0xdf, 0xe0, 0xe2, 0xe3, 0xe5, 0xe5, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe4, 0xe7, 0xde, 0xdc, 0xed, 0xe8, 0xcc, 0xc7, + 0xdc, 0xe1, 0xe7, 0xda, 0xd9, 0xef, 0xf3, 0xeb, + 0xec, 0xf4, 0xdf, 0xc4, 0xd9, 0xd6, 0xc0, 0xc0, + 0xe4, 0xdf, 0xc8, 0xf0, 0xc0, 0xcc, 0xf0, 0xde, + 0xdc, 0xcd, 0xc7, 0xea, 0xd3, 0xd9, 0xd5, 0xa4, + 0xe1, 0x9c, 0xab, 0xee, 0xf2, 0xde, 0xeb, 0xd7, + 0xd7, 0xcd, 0xe9, 0xe1, 0xbd, 0xb9, 0xb6, 0xab, + 0x95, 0x93, 0x68, 0x63, 0x74, 0x9c, 0xe6, 0xf6, + 0xc1, 0xc5, 0xc4, 0xbd, 0xd4, 0xd4, 0xc3, 0xeb, + 0xf3, 0xe8, 0xe9, 0xf3, 0xe7, 0xc8, 0xc6, 0xe0, + 0xbb, 0xac, 0xee, 0xda, 0xc4, 0xdf, 0xa2, 0x72, + 0x25, 0x90, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xda, + 0xad, 0x4e, 0x4c, 0x88, 0x7d, 0x73, 0x8e, 0x86, + 0x61, 0x5d, 0x50, 0x60, 0x83, 0x84, 0x7b, 0x8b, + 0xbd, 0xaa, 0x98, 0xa2, 0x99, 0x9d, 0xa7, 0x72, + 0x6c, 0x8c, 0x80, 0x6b, 0x67, 0x51, 0x60, 0xa7, + 0x78, 0x4c, 0x5b, 0x60, 0x50, 0x57, 0x48, 0x2b, + 0x41, 0x42, 0x43, 0x42, 0x41, 0x3f, 0x40, 0x41, + 0x41, 0x46, 0x44, 0x35, 0x26, 0x2e, 0x4c, 0x69, + 0x65, 0x49, 0x34, 0x4c, 0x96, 0x62, 0x3a, 0x4e, + 0x6f, 0x67, 0x61, 0x61, 0x66, 0x6b, 0x6e, 0x70, + 0x6b, 0x52, 0x53, 0x72, 0x7d, 0x69, 0x62, 0x70, + 0x5c, 0x5c, 0x63, 0x71, 0x81, 0x85, 0x7f, 0x76, + 0x7e, 0x75, 0x6a, 0x64, 0x65, 0x67, 0x66, 0x64, + 0x5d, 0x5b, 0x5c, 0x62, 0x69, 0x6a, 0x65, 0x5e, + 0x5f, 0x5d, 0x53, 0x4c, 0x58, 0x6e, 0x75, 0x6f, + 0x6b, 0x66, 0x67, 0x6e, 0x70, 0x67, 0x5b, 0x53, + 0x5a, 0x61, 0x5d, 0x63, 0x44, 0x28, 0x58, 0x8c, + 0x6f, 0x6b, 0x5e, 0x52, 0x55, 0x5f, 0x5e, 0x53, + 0x3a, 0x3a, 0x3d, 0x42, 0x44, 0x3e, 0x31, 0x27, + 0x19, 0x5f, 0x91, 0x54, 0x2c, 0x3a, 0x28, 0x29, + 0xd9, 0x82, 0x27, 0x54, 0x59, 0x35, 0x40, 0x87, + 0x99, 0x4c, 0x58, 0x72, 0x4b, 0x55, 0x6b, 0x3b, + 0x6b, 0x71, 0x6c, 0x59, 0x58, 0x75, 0x8d, 0x8c, + 0x78, 0x92, 0x93, 0x92, 0x9e, 0x8c, 0x6a, 0x61, + 0x7c, 0x7a, 0x74, 0x68, 0x47, 0x27, 0x3b, 0x72, + 0xc3, 0xe0, 0xbe, 0x85, 0x72, 0x64, 0x6b, 0x95, + 0x8d, 0x6f, 0x8b, 0x66, 0x6b, 0x80, 0x19, 0x00, + 0xd8, 0xd9, 0xd7, 0xcc, 0xe4, 0x9b, 0x25, 0x9d, + 0xe6, 0xe0, 0xd9, 0xd6, 0xd8, 0xda, 0xda, 0xda, + 0xd8, 0xd8, 0xd9, 0xd9, 0xda, 0xdb, 0xdb, 0xdb, + 0xde, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe6, 0xe4, 0xe9, 0xce, 0xc5, 0xd4, 0xd0, 0xdb, + 0xd1, 0xe1, 0xe8, 0xdc, 0xcc, 0xdc, 0xef, 0xdc, + 0xe4, 0xe1, 0xed, 0xc1, 0xdf, 0xd6, 0xc9, 0xd5, + 0xef, 0xd2, 0xcf, 0xe9, 0x90, 0xb1, 0xd1, 0xd3, + 0xc8, 0xda, 0xda, 0xca, 0xc9, 0xea, 0xbd, 0xa7, + 0xa8, 0x88, 0xce, 0xe9, 0xf6, 0xe3, 0xea, 0xe0, + 0xdb, 0xe8, 0xe5, 0xdd, 0xe3, 0xbe, 0x9e, 0xcc, + 0xd1, 0x94, 0x7e, 0x6b, 0x5b, 0x96, 0xdc, 0xe7, + 0xea, 0xf4, 0xf6, 0xe7, 0xec, 0xda, 0xc0, 0xe6, + 0xd7, 0xdf, 0xe6, 0xe7, 0xe9, 0xe8, 0xd6, 0xbd, + 0xcf, 0xcd, 0xd4, 0xef, 0xe9, 0xd0, 0x9e, 0x3a, + 0x34, 0x1b, 0x7c, 0xed, 0xc6, 0xd0, 0xd7, 0x7e, + 0x57, 0x4a, 0x6a, 0x88, 0x68, 0x40, 0x51, 0x79, + 0x5e, 0x54, 0x42, 0x42, 0x52, 0x58, 0x65, 0x82, + 0xcd, 0xba, 0xa8, 0xa7, 0xa1, 0xc2, 0xc1, 0x55, + 0x48, 0x62, 0x51, 0x3c, 0x41, 0x36, 0x4f, 0x9b, + 0x83, 0x63, 0x6e, 0x93, 0x6d, 0x39, 0x43, 0x46, + 0x46, 0x46, 0x40, 0x35, 0x2c, 0x30, 0x3e, 0x4c, + 0x54, 0x57, 0x4f, 0x3b, 0x29, 0x30, 0x50, 0x6e, + 0x36, 0x47, 0x46, 0x51, 0x9d, 0x7e, 0x5e, 0x6e, + 0x65, 0x71, 0x71, 0x68, 0x68, 0x6e, 0x63, 0x4e, + 0x48, 0x57, 0x5f, 0x57, 0x4c, 0x4c, 0x54, 0x5b, + 0x52, 0x58, 0x6b, 0x8b, 0xa6, 0xaa, 0x96, 0x80, + 0x83, 0x82, 0x83, 0x87, 0x89, 0x84, 0x79, 0x70, + 0x6f, 0x6b, 0x68, 0x69, 0x6b, 0x68, 0x5f, 0x56, + 0x46, 0x48, 0x45, 0x45, 0x54, 0x6a, 0x6f, 0x67, + 0x70, 0x59, 0x51, 0x5e, 0x66, 0x5c, 0x56, 0x5b, + 0x50, 0x73, 0x74, 0x73, 0x74, 0x78, 0x7b, 0x5c, + 0x4d, 0x56, 0x5a, 0x5a, 0x5e, 0x60, 0x54, 0x42, + 0x51, 0x4b, 0x41, 0x35, 0x2d, 0x2c, 0x30, 0x35, + 0x1f, 0x5d, 0x7b, 0x52, 0x5a, 0x6c, 0x68, 0xa4, + 0xcc, 0x6b, 0x5f, 0x53, 0x3b, 0x0d, 0x2e, 0x72, + 0x9d, 0x64, 0x53, 0x60, 0x65, 0x7b, 0x8a, 0x77, + 0x71, 0x63, 0x67, 0x7a, 0x75, 0x56, 0x4d, 0x5e, + 0x6a, 0x78, 0x76, 0x7c, 0x8d, 0x83, 0x7a, 0x8d, + 0x76, 0x6c, 0x7f, 0x95, 0x9a, 0x9c, 0x7c, 0x40, + 0x5b, 0xa3, 0xca, 0xb4, 0x82, 0x51, 0x5a, 0x93, + 0x99, 0x62, 0x83, 0x60, 0x86, 0xb3, 0x38, 0x13, + 0xe3, 0xe4, 0xe4, 0xce, 0xe6, 0x8e, 0x19, 0xa1, + 0xea, 0xe4, 0xdd, 0xda, 0xdb, 0xdd, 0xde, 0xdd, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, + 0xdf, 0xdf, 0xe0, 0xe1, 0xe1, 0xe2, 0xe3, 0xe3, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe6, 0xe7, 0xf5, 0xe2, 0xc6, 0xcd, 0xd9, 0xe3, + 0xd8, 0xed, 0xe7, 0xe2, 0xda, 0xd9, 0xe8, 0xd8, + 0xeb, 0xe4, 0xfa, 0xd1, 0xdc, 0xdd, 0xc9, 0xe2, + 0xf5, 0xb1, 0xbf, 0xea, 0xa4, 0xd7, 0xc6, 0xb4, + 0xb6, 0xe4, 0xe9, 0xab, 0xcb, 0xf5, 0xc4, 0x8e, + 0x7e, 0xc9, 0xd5, 0xbd, 0xc4, 0xb5, 0xd4, 0xd8, + 0xcd, 0xae, 0xb4, 0xbb, 0xb3, 0xa9, 0xa1, 0xad, + 0xc4, 0x73, 0x7c, 0x6e, 0x4f, 0x94, 0xd4, 0xd8, + 0xbb, 0xd1, 0xe2, 0xde, 0xe8, 0xd9, 0xc4, 0xef, + 0xdc, 0xe4, 0xe2, 0xd2, 0xd7, 0xf4, 0xee, 0xc2, + 0xc3, 0xd7, 0xc4, 0xee, 0xd3, 0xa6, 0xd8, 0xc1, + 0x59, 0x58, 0x58, 0xc5, 0xdd, 0xe2, 0xd4, 0xc5, + 0x5e, 0x64, 0x4d, 0x46, 0x73, 0x68, 0x39, 0x52, + 0x69, 0x60, 0x55, 0x50, 0x4e, 0x4f, 0x64, 0x83, + 0x97, 0xa1, 0x99, 0xa2, 0xb2, 0xc7, 0xac, 0x41, + 0x38, 0x3a, 0x50, 0x6a, 0x6d, 0x69, 0x73, 0x80, + 0x62, 0x54, 0x41, 0x5b, 0x6a, 0x4c, 0x43, 0x52, + 0x35, 0x47, 0x59, 0x5a, 0x4c, 0x3e, 0x39, 0x3c, + 0x44, 0x3a, 0x2e, 0x29, 0x2b, 0x2f, 0x2f, 0x2e, + 0x34, 0x4a, 0x72, 0x87, 0xa0, 0x64, 0x45, 0x49, + 0x6b, 0x74, 0x6f, 0x60, 0x5f, 0x69, 0x63, 0x51, + 0x50, 0x4b, 0x58, 0x76, 0x87, 0x7e, 0x6f, 0x69, + 0x6a, 0x71, 0x7a, 0x7e, 0x79, 0x6e, 0x62, 0x5b, + 0x76, 0x6e, 0x66, 0x66, 0x6e, 0x77, 0x7e, 0x80, + 0x75, 0x6f, 0x68, 0x63, 0x5f, 0x56, 0x49, 0x3e, + 0x2f, 0x40, 0x4a, 0x46, 0x48, 0x55, 0x61, 0x63, + 0x83, 0x65, 0x58, 0x64, 0x64, 0x52, 0x50, 0x60, + 0x7b, 0x51, 0x24, 0x41, 0x64, 0x66, 0x68, 0x58, + 0x59, 0x59, 0x4a, 0x34, 0x2f, 0x43, 0x5c, 0x68, + 0x5a, 0x64, 0x6d, 0x6c, 0x68, 0x6c, 0x7a, 0x88, + 0x96, 0x9e, 0xa0, 0x6f, 0x5b, 0x5c, 0x61, 0xa4, + 0x9f, 0x4e, 0x8c, 0x7b, 0xa5, 0xaa, 0x9f, 0x75, + 0x7b, 0x7d, 0x6a, 0x71, 0x95, 0x97, 0x84, 0x8b, + 0x6d, 0x93, 0x91, 0x6f, 0x6b, 0x7b, 0x7c, 0x74, + 0x6d, 0x78, 0x74, 0x75, 0x7c, 0x6b, 0x65, 0x82, + 0xa9, 0x99, 0x8a, 0xa1, 0xc5, 0xb8, 0x8b, 0x74, + 0xd7, 0xdd, 0xda, 0xd5, 0xd2, 0xca, 0xcb, 0xd9, + 0xc1, 0x77, 0xae, 0xb3, 0xcb, 0xa7, 0x00, 0x00, + 0xe3, 0xe8, 0xee, 0xdb, 0xf2, 0x8b, 0x25, 0xb5, + 0xec, 0xe6, 0xdf, 0xdc, 0xde, 0xe0, 0xe0, 0xe0, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, + 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe9, 0xe3, 0xe7, 0xf0, 0xdc, 0xd0, 0xde, 0xd4, + 0xcd, 0xeb, 0xe1, 0xe3, 0xe7, 0xd4, 0xd9, 0xe5, + 0xec, 0xe7, 0xf2, 0xe2, 0xd0, 0xe0, 0xc2, 0xe5, + 0xdd, 0xaa, 0xc4, 0xcf, 0xa0, 0xec, 0xd4, 0xc2, + 0xbb, 0xdd, 0xde, 0xa6, 0xe0, 0xe8, 0xd2, 0x77, + 0x89, 0xe4, 0xee, 0xff, 0xe2, 0xcd, 0xe4, 0xdb, + 0xeb, 0xf3, 0xf7, 0xed, 0xfd, 0xff, 0xcd, 0xa6, + 0xab, 0x8e, 0x66, 0x65, 0x74, 0xaa, 0xde, 0xb6, + 0xcf, 0xe3, 0xf2, 0xe8, 0xea, 0xd3, 0xb7, 0xde, + 0xde, 0xdd, 0xf1, 0xf3, 0xd7, 0xca, 0xca, 0xbf, + 0xde, 0xd7, 0xdb, 0xd4, 0xd5, 0xda, 0xb2, 0x7e, + 0xad, 0xea, 0xd0, 0xea, 0xdc, 0xcc, 0xaa, 0xa1, + 0x61, 0x3e, 0x5f, 0x71, 0x5f, 0x49, 0x4b, 0x86, + 0x5b, 0x52, 0x54, 0x57, 0x53, 0x5b, 0x7d, 0x9c, + 0x9d, 0xbf, 0xa9, 0xaf, 0xc9, 0xb2, 0x7f, 0x45, + 0x3a, 0x37, 0x47, 0x5c, 0x5b, 0x50, 0x4f, 0x53, + 0x45, 0x67, 0x72, 0x59, 0x54, 0x4e, 0x3c, 0x49, + 0x2c, 0x37, 0x3f, 0x3c, 0x34, 0x36, 0x45, 0x54, + 0x44, 0x36, 0x2a, 0x2e, 0x38, 0x38, 0x28, 0x16, + 0x40, 0x21, 0x1a, 0x36, 0x6c, 0x3e, 0x34, 0x5b, + 0x65, 0x66, 0x64, 0x64, 0x6a, 0x72, 0x72, 0x6d, + 0x67, 0x5a, 0x66, 0x7f, 0x74, 0x51, 0x54, 0x75, + 0x84, 0x88, 0x86, 0x76, 0x61, 0x55, 0x56, 0x5d, + 0x6f, 0x63, 0x57, 0x54, 0x5e, 0x6e, 0x7c, 0x83, + 0x74, 0x6f, 0x68, 0x65, 0x63, 0x5b, 0x4f, 0x45, + 0x45, 0x55, 0x5c, 0x55, 0x53, 0x5d, 0x66, 0x67, + 0x6e, 0x43, 0x33, 0x57, 0x77, 0x6d, 0x52, 0x45, + 0x68, 0x53, 0x4e, 0x7d, 0x82, 0x59, 0x5d, 0x6e, + 0x4a, 0x67, 0x7d, 0x7a, 0x72, 0x79, 0x8a, 0x95, + 0x8f, 0x8a, 0x7e, 0x6f, 0x60, 0x55, 0x50, 0x4e, + 0x72, 0x5b, 0x80, 0x74, 0x52, 0x60, 0x78, 0xa0, + 0x81, 0x62, 0xb9, 0x86, 0x83, 0x84, 0x94, 0x80, + 0x54, 0x61, 0x6f, 0x74, 0x70, 0x67, 0x59, 0x4c, + 0x77, 0x82, 0x8c, 0x9e, 0x9b, 0x6d, 0x5f, 0x89, + 0x96, 0x8a, 0x66, 0x59, 0x69, 0x5c, 0x3f, 0x3c, + 0x75, 0x6d, 0x81, 0xab, 0xa5, 0x71, 0x81, 0xd1, + 0xba, 0xe8, 0xd0, 0x6e, 0x4c, 0x88, 0x99, 0x63, + 0xb3, 0x7c, 0x9e, 0xa4, 0xba, 0x8a, 0x0a, 0x36, + 0xdf, 0xe5, 0xec, 0xe1, 0xf1, 0x7b, 0x2e, 0xbd, + 0xed, 0xe7, 0xe0, 0xdd, 0xdf, 0xe1, 0xe1, 0xe1, + 0xe0, 0xe0, 0xdf, 0xdf, 0xde, 0xdd, 0xdd, 0xdd, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xed, 0xe5, 0xdb, 0xe8, 0xd8, 0xc9, 0xdd, 0xd7, + 0xc2, 0xe6, 0xe5, 0xe2, 0xe4, 0xc7, 0xc4, 0xe7, + 0xe8, 0xe3, 0xe2, 0xe4, 0xc6, 0xd7, 0xbd, 0xdb, + 0xc6, 0xcc, 0xea, 0xab, 0x86, 0xd0, 0xcd, 0xd1, + 0xd3, 0xd2, 0xbf, 0xb9, 0xf2, 0xd2, 0xcb, 0x81, + 0xb0, 0xd2, 0xcc, 0xd8, 0xbf, 0xd9, 0xe3, 0xf0, + 0xe9, 0xda, 0xf7, 0xf2, 0xdb, 0xf4, 0xf0, 0xc4, + 0x82, 0x6e, 0x6e, 0x6d, 0x63, 0x91, 0xd1, 0xd4, + 0xd2, 0xe2, 0xec, 0xe4, 0xed, 0xda, 0xbd, 0xe0, + 0xcc, 0xd4, 0xec, 0xd6, 0x93, 0x7c, 0x8d, 0x8e, + 0x6a, 0xa7, 0xc7, 0xa6, 0x75, 0x74, 0x99, 0xb1, + 0x3f, 0x37, 0x51, 0xa1, 0xbe, 0xcd, 0xb9, 0x87, + 0x5c, 0x20, 0x4f, 0x69, 0x50, 0x43, 0x42, 0x72, + 0x77, 0x63, 0x60, 0x5d, 0x4b, 0x4d, 0x6a, 0x7e, + 0x86, 0xb8, 0xaa, 0xbd, 0xde, 0xa8, 0x69, 0x50, + 0x56, 0x68, 0x52, 0x40, 0x49, 0x38, 0x3d, 0x77, + 0x9d, 0x76, 0x74, 0x76, 0x6a, 0x52, 0x31, 0x2d, + 0x3a, 0x41, 0x45, 0x40, 0x34, 0x2c, 0x2c, 0x30, + 0x46, 0x43, 0x3d, 0x38, 0x34, 0x31, 0x30, 0x30, + 0x2e, 0x51, 0x40, 0x3f, 0x9e, 0x82, 0x54, 0x67, + 0x65, 0x5f, 0x61, 0x6d, 0x74, 0x73, 0x71, 0x73, + 0x77, 0x75, 0x71, 0x6a, 0x66, 0x68, 0x6f, 0x75, + 0x69, 0x69, 0x67, 0x64, 0x60, 0x5f, 0x60, 0x63, + 0x63, 0x5d, 0x57, 0x58, 0x60, 0x68, 0x6c, 0x6d, + 0x75, 0x71, 0x6f, 0x71, 0x73, 0x71, 0x68, 0x60, + 0x60, 0x5f, 0x57, 0x50, 0x59, 0x67, 0x68, 0x5d, + 0x61, 0x5e, 0x62, 0x63, 0x4e, 0x34, 0x36, 0x4a, + 0x77, 0x65, 0x55, 0x76, 0x7f, 0x65, 0x68, 0x6a, + 0x4b, 0x70, 0x90, 0x91, 0x86, 0x85, 0x8d, 0x93, + 0x91, 0x7e, 0x6c, 0x6b, 0x77, 0x81, 0x7e, 0x76, + 0x50, 0x3e, 0x7e, 0x86, 0x60, 0x6b, 0x75, 0x7d, + 0x88, 0x53, 0x61, 0x66, 0x89, 0x91, 0x89, 0x75, + 0x5e, 0x7e, 0x83, 0x78, 0x7d, 0x79, 0x73, 0x7c, + 0x7e, 0x85, 0x56, 0x3a, 0x6b, 0x90, 0x84, 0x7b, + 0x5a, 0xa7, 0xbb, 0x7d, 0x36, 0x0f, 0x1d, 0x4a, + 0xa6, 0x8c, 0x8b, 0x91, 0x87, 0x8c, 0x8e, 0x79, + 0x8e, 0x35, 0x5b, 0xd2, 0xc3, 0x55, 0x3c, 0x6f, + 0x89, 0x94, 0x8f, 0x86, 0xa1, 0x75, 0x1a, 0x25, + 0xe3, 0xe5, 0xe7, 0xe0, 0xe6, 0x65, 0x35, 0xbf, + 0xed, 0xe7, 0xe0, 0xdd, 0xdf, 0xe1, 0xe1, 0xe0, + 0xe2, 0xe1, 0xe1, 0xe0, 0xdf, 0xde, 0xdd, 0xdd, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xea, 0xea, 0xec, 0xef, 0xe5, 0xdc, 0xdc, 0xd7, + 0xc8, 0xe4, 0xf0, 0xe8, 0xe5, 0xd4, 0xc9, 0xe7, + 0xf8, 0xe9, 0xe3, 0xe0, 0xcd, 0xc2, 0xba, 0xc4, + 0xb9, 0xd3, 0xf2, 0xac, 0xbd, 0xd9, 0xb4, 0xb3, + 0xe5, 0xd7, 0xa7, 0xca, 0xe8, 0xcb, 0xb5, 0xa1, + 0xf3, 0xfa, 0xf8, 0xe0, 0xe2, 0xf7, 0xe5, 0xf0, + 0xe4, 0xe2, 0xcc, 0xad, 0xb1, 0xb1, 0xac, 0xd0, + 0xd3, 0x73, 0x6c, 0x6e, 0x6f, 0xab, 0xd3, 0xe3, + 0xdf, 0xe6, 0xe9, 0xe2, 0xf2, 0xe5, 0xc6, 0xe6, + 0xdc, 0xc3, 0xaf, 0x7d, 0x3f, 0x4b, 0x72, 0x6e, + 0x6b, 0xb3, 0xd1, 0xca, 0x7b, 0x35, 0x62, 0x93, + 0x3a, 0x22, 0x28, 0x63, 0xb7, 0x7f, 0x37, 0x4b, + 0x39, 0x2d, 0x4c, 0x3a, 0x3e, 0x4e, 0x38, 0x6a, + 0x56, 0x49, 0x5d, 0x75, 0x72, 0x7b, 0x93, 0x9a, + 0x8e, 0xae, 0x9d, 0xaa, 0xb8, 0x85, 0x4f, 0x2c, + 0x50, 0x68, 0x5b, 0x53, 0x60, 0x48, 0x41, 0x71, + 0x88, 0x5c, 0x47, 0x6e, 0x63, 0x28, 0x2c, 0x4a, + 0x41, 0x3e, 0x3b, 0x3a, 0x3f, 0x49, 0x56, 0x5f, + 0x37, 0x3f, 0x41, 0x35, 0x23, 0x1f, 0x2b, 0x3b, + 0x31, 0x74, 0x63, 0x40, 0x92, 0x82, 0x5a, 0x69, + 0x6d, 0x5e, 0x51, 0x52, 0x58, 0x5d, 0x67, 0x71, + 0x5e, 0x6c, 0x7d, 0x82, 0x76, 0x6b, 0x6d, 0x77, + 0x76, 0x73, 0x70, 0x70, 0x72, 0x6f, 0x67, 0x60, + 0x72, 0x6b, 0x64, 0x65, 0x6e, 0x79, 0x81, 0x83, + 0x76, 0x72, 0x6f, 0x70, 0x72, 0x6e, 0x65, 0x5c, + 0x5b, 0x57, 0x4a, 0x40, 0x48, 0x59, 0x5e, 0x56, + 0x59, 0x47, 0x42, 0x5c, 0x85, 0xa2, 0xaa, 0xa8, + 0x9f, 0x58, 0x32, 0x74, 0x99, 0x70, 0x5b, 0x58, + 0x70, 0x88, 0x99, 0x94, 0x89, 0x81, 0x7a, 0x71, + 0x72, 0x6f, 0x6e, 0x71, 0x74, 0x6d, 0x5d, 0x4e, + 0x61, 0x66, 0x8f, 0x80, 0x6f, 0x7b, 0x73, 0x81, + 0x61, 0x85, 0x73, 0x84, 0x77, 0x69, 0x53, 0x4e, + 0x62, 0x76, 0x70, 0x63, 0x72, 0x89, 0x97, 0xa2, + 0x42, 0x2d, 0x09, 0x2b, 0x7b, 0x7c, 0x51, 0x51, + 0x3d, 0x7d, 0x99, 0xa5, 0xd7, 0xed, 0xb9, 0x7d, + 0xa2, 0x8b, 0x52, 0x34, 0x64, 0xa3, 0xa5, 0x84, + 0xd9, 0xb0, 0xbd, 0xf1, 0xff, 0xff, 0x88, 0x00, + 0x44, 0x80, 0x77, 0xb9, 0xf5, 0x97, 0x32, 0x0a, + 0xe9, 0xe9, 0xe6, 0xe4, 0xe5, 0x61, 0x47, 0xcf, + 0xed, 0xe7, 0xe0, 0xdd, 0xde, 0xe0, 0xe1, 0xe0, + 0xe3, 0xe2, 0xe1, 0xe1, 0xdf, 0xde, 0xde, 0xdd, + 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xec, 0xe2, 0xe6, 0xde, 0xe9, 0xf3, 0xd4, 0xc3, + 0xbd, 0xcd, 0xe4, 0xdd, 0xdf, 0xe5, 0xd6, 0xe1, + 0xee, 0xda, 0xde, 0xd8, 0xe0, 0xc5, 0xd6, 0xd3, + 0x90, 0xae, 0xd6, 0xa1, 0xd3, 0xc1, 0x9b, 0xbb, + 0xe8, 0xe6, 0xa0, 0xce, 0xd2, 0xd3, 0xa4, 0xba, + 0xf8, 0xda, 0xef, 0xe0, 0xde, 0xcd, 0xd8, 0xd7, + 0xc6, 0xb4, 0xd7, 0xe9, 0xe2, 0xef, 0xd9, 0xa8, + 0xc1, 0xb2, 0x8d, 0x86, 0x8a, 0x9c, 0xcc, 0xe0, + 0xe5, 0xe5, 0xe1, 0xd8, 0xec, 0xe0, 0xbf, 0xdb, + 0xe6, 0x97, 0x7b, 0x7d, 0x61, 0x57, 0x60, 0x53, + 0x5a, 0x3d, 0x68, 0x74, 0x8d, 0x93, 0x57, 0x67, + 0x62, 0x50, 0x85, 0xa5, 0xe3, 0xa6, 0x6d, 0x81, + 0x62, 0x4d, 0x6a, 0x43, 0x31, 0x46, 0x3b, 0x6f, + 0x79, 0x55, 0x4f, 0x56, 0x4f, 0x63, 0x8a, 0x96, + 0xad, 0xae, 0x91, 0x97, 0xa6, 0xa6, 0xa3, 0x7d, + 0x72, 0x5b, 0x51, 0x56, 0x54, 0x4f, 0x51, 0x56, + 0x4e, 0x72, 0x52, 0x88, 0xa9, 0x61, 0x42, 0x2d, + 0x33, 0x34, 0x37, 0x3c, 0x3f, 0x3c, 0x35, 0x2e, + 0x45, 0x51, 0x57, 0x4e, 0x3d, 0x36, 0x40, 0x4e, + 0x52, 0x53, 0x50, 0x61, 0xa1, 0x76, 0x5e, 0x80, + 0x63, 0x5b, 0x54, 0x56, 0x5e, 0x69, 0x71, 0x76, + 0x79, 0x75, 0x71, 0x75, 0x7f, 0x86, 0x84, 0x7e, + 0x6d, 0x6d, 0x6f, 0x6f, 0x6e, 0x6a, 0x66, 0x62, + 0x48, 0x4e, 0x5a, 0x6b, 0x79, 0x7d, 0x78, 0x70, + 0x77, 0x70, 0x69, 0x64, 0x60, 0x57, 0x49, 0x3e, + 0x4f, 0x55, 0x50, 0x3f, 0x3a, 0x49, 0x5b, 0x63, + 0x96, 0xa2, 0xa8, 0x9c, 0x8a, 0x80, 0x7e, 0x7f, + 0x7f, 0x6b, 0x53, 0x6f, 0x80, 0x6d, 0x60, 0x49, + 0x64, 0x6f, 0x76, 0x79, 0x82, 0x8d, 0x8b, 0x81, + 0x71, 0x7e, 0x88, 0x84, 0x75, 0x6c, 0x70, 0x79, + 0x7e, 0x93, 0x8e, 0x58, 0x5f, 0x72, 0x64, 0x8f, + 0xbe, 0xfa, 0x86, 0x72, 0x75, 0xbb, 0xc8, 0xbd, + 0xba, 0x63, 0x56, 0x41, 0x11, 0x6b, 0xd4, 0xb5, + 0x58, 0x7d, 0x71, 0x65, 0x7a, 0x60, 0x35, 0x3b, + 0x1d, 0x59, 0x5f, 0x4d, 0x77, 0x96, 0x60, 0x15, + 0x25, 0x50, 0x37, 0x33, 0x4b, 0x12, 0x1f, 0xb1, + 0xd4, 0xac, 0xd0, 0xff, 0xf1, 0xce, 0xb5, 0x8f, + 0xe6, 0xda, 0x72, 0xc0, 0xf6, 0x61, 0x14, 0x05, + 0xe4, 0xe2, 0xd6, 0xe3, 0xdd, 0x44, 0x4c, 0xd6, + 0xea, 0xe6, 0xe0, 0xdf, 0xe0, 0xe0, 0xdf, 0xdd, + 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xb1, 0x9e, 0xd6, 0xd1, 0xe7, 0xf2, 0xd6, 0xcc, + 0xe9, 0xe9, 0xf2, 0xd3, 0xd6, 0xd3, 0xd8, 0xcb, + 0x95, 0xe2, 0xd8, 0xa1, 0xac, 0x8d, 0xa4, 0xd9, + 0xd6, 0xe7, 0xa0, 0xad, 0xe7, 0xd0, 0xa8, 0xea, + 0xf2, 0xe1, 0xdd, 0xe1, 0xdb, 0xd4, 0xd5, 0xd7, + 0xcb, 0xe9, 0xf6, 0xec, 0xce, 0xc6, 0xd3, 0xc5, + 0x98, 0xa0, 0x96, 0x53, 0x6b, 0xaa, 0xea, 0xf1, + 0xdc, 0xdd, 0xe2, 0xf2, 0xe4, 0xd9, 0xb0, 0xcd, + 0xc6, 0xb4, 0xb6, 0x8e, 0x77, 0x90, 0x7d, 0x57, + 0x7a, 0x94, 0x75, 0x90, 0x51, 0x83, 0xab, 0xab, + 0xac, 0xaa, 0xbe, 0xb8, 0xca, 0x85, 0x59, 0x7c, + 0x58, 0x5f, 0x60, 0x59, 0x4f, 0x4b, 0x49, 0x48, + 0x6a, 0x48, 0x71, 0x43, 0x69, 0x7e, 0x7e, 0x98, + 0xa9, 0xa7, 0xa7, 0xac, 0xb6, 0x8a, 0x4a, 0x4c, + 0x44, 0x5e, 0x40, 0x59, 0x75, 0x5a, 0x4f, 0x36, + 0x46, 0x6b, 0x59, 0x69, 0x4e, 0x12, 0x3c, 0x6c, + 0x65, 0x47, 0x3b, 0x48, 0x48, 0x36, 0x35, 0x45, + 0x37, 0x41, 0x48, 0x45, 0x3d, 0x3d, 0x49, 0x56, + 0x7a, 0x69, 0x5a, 0x69, 0xa2, 0x6b, 0x4d, 0x6c, + 0x65, 0x6a, 0x71, 0x74, 0x72, 0x6f, 0x6f, 0x70, + 0x61, 0x52, 0x4f, 0x5c, 0x5d, 0x52, 0x57, 0x69, + 0x70, 0x6a, 0x67, 0x6f, 0x7d, 0x86, 0x87, 0x83, + 0x6c, 0x7b, 0x8f, 0x98, 0x93, 0x87, 0x7c, 0x76, + 0x76, 0x74, 0x71, 0x70, 0x6d, 0x68, 0x61, 0x5b, + 0x5b, 0x6d, 0x71, 0x68, 0x74, 0x92, 0x9a, 0x8d, + 0x9e, 0x9e, 0x90, 0x8f, 0x9e, 0x94, 0x82, 0x83, + 0x8b, 0x70, 0x60, 0x5e, 0x57, 0x68, 0x8a, 0x82, + 0x5e, 0x75, 0x8e, 0x8f, 0x8e, 0x83, 0x76, 0x88, + 0x8d, 0x80, 0x7a, 0x73, 0x64, 0x9f, 0x87, 0x78, + 0x64, 0x75, 0x85, 0x80, 0x7e, 0xa7, 0xbc, 0x96, + 0xc4, 0xd5, 0xa5, 0x57, 0x63, 0xaf, 0xb4, 0x74, + 0x7a, 0x97, 0x7c, 0x5a, 0x90, 0x85, 0x2d, 0x34, + 0x0e, 0x33, 0x63, 0x34, 0x3d, 0x49, 0x57, 0x11, + 0x46, 0x7d, 0xa0, 0x8e, 0x37, 0x18, 0x4a, 0x41, + 0x2f, 0x20, 0x27, 0x31, 0x61, 0x5c, 0x54, 0xd6, + 0xd1, 0x64, 0x81, 0x9a, 0xa6, 0xd5, 0x8f, 0x24, + 0x0f, 0x1b, 0x3f, 0x2a, 0x2e, 0x45, 0x18, 0x02, + 0xe2, 0xe0, 0xd5, 0xe2, 0xd7, 0x41, 0x51, 0xd6, + 0xe8, 0xe3, 0xde, 0xdd, 0xde, 0xdf, 0xdd, 0xdb, + 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xdf, 0xdf, + 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe1, 0x9b, 0x8a, 0xcf, 0xe0, 0xf0, 0xdb, 0xb8, + 0xd1, 0xe7, 0xe2, 0xd9, 0xe2, 0x9e, 0xad, 0xaf, + 0x9f, 0xad, 0xdb, 0xb0, 0xa8, 0x99, 0xbe, 0xd8, + 0xb8, 0xe6, 0xb9, 0xc9, 0xe0, 0xb5, 0xc9, 0xec, + 0xea, 0xdc, 0xe3, 0xdb, 0xc5, 0xd8, 0xe4, 0xc2, + 0xdf, 0xe7, 0xde, 0xd8, 0xdf, 0xe3, 0xde, 0xd7, + 0x8d, 0xa4, 0xad, 0x41, 0x3c, 0x9e, 0xdb, 0xcb, + 0xe2, 0xea, 0xe3, 0xdc, 0xcf, 0xdf, 0xc8, 0xe4, + 0x94, 0x4c, 0x65, 0x78, 0x7f, 0x64, 0x2a, 0x5b, + 0x58, 0x7a, 0x47, 0x5d, 0x81, 0x72, 0x8b, 0xe5, + 0xb4, 0xb8, 0xb2, 0x67, 0x66, 0x69, 0x58, 0x3f, + 0x5c, 0x4b, 0x4c, 0x65, 0x71, 0x64, 0x54, 0x51, + 0x96, 0x3c, 0x5e, 0x62, 0x6e, 0x85, 0x75, 0x6e, + 0x97, 0xa6, 0xb6, 0xc0, 0xad, 0x87, 0x5e, 0x32, + 0x4b, 0x5b, 0x5c, 0x68, 0x4a, 0x48, 0x84, 0x86, + 0x4e, 0xa0, 0x8d, 0x66, 0x4d, 0x40, 0x4e, 0x2c, + 0x42, 0x41, 0x3f, 0x41, 0x49, 0x50, 0x47, 0x39, + 0x29, 0x2f, 0x34, 0x37, 0x38, 0x3c, 0x46, 0x4e, + 0x73, 0x6e, 0x5c, 0x5e, 0x9a, 0x72, 0x4f, 0x5c, + 0x66, 0x63, 0x5e, 0x58, 0x54, 0x55, 0x59, 0x5c, + 0x69, 0x75, 0x77, 0x6a, 0x64, 0x6d, 0x75, 0x74, + 0x7a, 0x6b, 0x61, 0x6d, 0x83, 0x8b, 0x7b, 0x66, + 0x80, 0x7c, 0x7d, 0x83, 0x86, 0x7c, 0x65, 0x52, + 0x3c, 0x4d, 0x62, 0x6d, 0x6e, 0x6a, 0x6a, 0x6c, + 0x76, 0x5b, 0x47, 0x51, 0x70, 0x88, 0x8d, 0x88, + 0x82, 0x8c, 0x82, 0x6c, 0x70, 0x85, 0x84, 0x70, + 0x69, 0x5f, 0x7b, 0x71, 0x78, 0x79, 0x85, 0x6f, + 0x56, 0x5c, 0x85, 0x88, 0x6a, 0x73, 0x82, 0x77, + 0x68, 0x77, 0x77, 0xa6, 0xeb, 0xf9, 0xc5, 0xc5, + 0xc9, 0xc3, 0xa8, 0xcd, 0x98, 0x55, 0x98, 0xa7, + 0xa3, 0x7d, 0x7d, 0xad, 0xbf, 0x9d, 0x80, 0x82, + 0xae, 0xeb, 0xb4, 0xcd, 0xb1, 0x66, 0x8b, 0x57, + 0x4e, 0x3f, 0x34, 0x36, 0x25, 0x2b, 0x2e, 0x2f, + 0x37, 0x33, 0x17, 0x3c, 0x69, 0x62, 0x4c, 0x1b, + 0x38, 0x4f, 0x29, 0x13, 0x60, 0x62, 0x0a, 0x00, + 0x54, 0x80, 0x28, 0x92, 0xff, 0xd3, 0xa7, 0x9f, + 0x61, 0x41, 0x55, 0x67, 0x92, 0x9c, 0x3e, 0x02, + 0xdf, 0xdc, 0xd3, 0xe0, 0xcc, 0x3c, 0x59, 0xd6, + 0xe4, 0xdf, 0xda, 0xd9, 0xdb, 0xdc, 0xda, 0xd8, + 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf4, 0xd7, 0x99, 0xc8, 0xdb, 0xe9, 0xf1, 0xc8, + 0xc7, 0xe1, 0xd6, 0xdc, 0xe5, 0x8e, 0xd3, 0xd5, + 0xa7, 0xdb, 0xdf, 0x98, 0xb3, 0xb8, 0xd2, 0xcb, + 0xb6, 0xdc, 0xb9, 0xe9, 0xde, 0xaa, 0xe3, 0xd6, + 0xda, 0xeb, 0xdc, 0xc4, 0xcd, 0xdb, 0xd1, 0xc4, + 0xd0, 0xda, 0xe6, 0xeb, 0xec, 0xd7, 0xca, 0xe5, + 0x7e, 0x85, 0xa5, 0x4a, 0x5e, 0xd0, 0xb5, 0x5b, + 0xaf, 0xd7, 0xe6, 0xde, 0xcf, 0xe4, 0xca, 0xda, + 0xab, 0xa8, 0x7a, 0x7f, 0x87, 0x5e, 0x50, 0x57, + 0x91, 0x9c, 0x74, 0x21, 0x1f, 0x7d, 0xf1, 0xef, + 0x8c, 0xbc, 0xff, 0xd3, 0xb4, 0x9e, 0x86, 0x60, + 0x47, 0x6d, 0x72, 0x4d, 0x42, 0x60, 0x6d, 0x5c, + 0x70, 0x5d, 0x6f, 0x48, 0x27, 0x76, 0x7b, 0x69, + 0x39, 0x45, 0x5d, 0xa2, 0xb3, 0xb0, 0xb7, 0x71, + 0x66, 0x5d, 0x57, 0x68, 0x5e, 0x5c, 0x71, 0x55, + 0x2e, 0x4c, 0x47, 0x5f, 0x5c, 0x33, 0x34, 0x2e, + 0x3e, 0x63, 0x76, 0x5d, 0x3f, 0x3a, 0x44, 0x4a, + 0x66, 0x5b, 0x4e, 0x49, 0x4c, 0x54, 0x5a, 0x5d, + 0x64, 0x69, 0x58, 0x53, 0x98, 0x81, 0x5c, 0x58, + 0x5d, 0x6a, 0x77, 0x78, 0x70, 0x6b, 0x70, 0x77, + 0x72, 0x87, 0x89, 0x71, 0x64, 0x6e, 0x74, 0x6d, + 0x6f, 0x6e, 0x6c, 0x69, 0x66, 0x64, 0x64, 0x64, + 0x6c, 0x71, 0x76, 0x76, 0x70, 0x68, 0x61, 0x5d, + 0x60, 0x69, 0x6e, 0x62, 0x50, 0x4a, 0x54, 0x63, + 0x36, 0x3d, 0x4c, 0x62, 0x77, 0x87, 0x95, 0x9e, + 0x6e, 0x7b, 0x75, 0x75, 0x7d, 0x6e, 0x6f, 0x94, + 0x8a, 0x3d, 0x52, 0x5a, 0x68, 0x52, 0x5b, 0x86, + 0x44, 0x67, 0x80, 0xa3, 0xc8, 0xbd, 0xb5, 0xd5, + 0xc1, 0xa9, 0xea, 0xc0, 0x78, 0x6a, 0x8b, 0xd0, + 0xca, 0xbf, 0xb9, 0xd2, 0xce, 0xbf, 0xaf, 0x6e, + 0x42, 0x2b, 0x2d, 0x51, 0x65, 0x57, 0x46, 0x45, + 0x40, 0x23, 0x6b, 0xb9, 0x73, 0x1e, 0x3d, 0x71, + 0x1c, 0x34, 0x1f, 0x36, 0x1e, 0x2e, 0x14, 0x2c, + 0x30, 0x64, 0x49, 0x4a, 0x69, 0x54, 0x36, 0x1a, + 0x36, 0x3f, 0x16, 0x1e, 0x56, 0x72, 0x8a, 0x9d, + 0x7e, 0xd7, 0xfe, 0xda, 0xe4, 0xdf, 0x6a, 0x01, + 0x55, 0x31, 0x3d, 0x3e, 0x54, 0x5c, 0x1f, 0x09, + 0xda, 0xd8, 0xd2, 0xdd, 0xbd, 0x35, 0x64, 0xd6, + 0xde, 0xda, 0xd5, 0xd4, 0xd6, 0xd8, 0xd7, 0xd5, + 0xd6, 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xd9, 0xda, + 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xde, 0xde, 0xde, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe9, 0xdf, 0x9e, 0x97, 0xdf, 0xe4, 0xf2, 0xe1, + 0xa3, 0xb1, 0xcd, 0xe1, 0xdf, 0x96, 0xe3, 0xc7, + 0xaf, 0xbf, 0x98, 0xaa, 0xbb, 0xb6, 0xe5, 0xbb, + 0xc1, 0xc9, 0xa2, 0xe5, 0xbb, 0xb1, 0xf6, 0xe5, + 0xda, 0xec, 0xcf, 0xc0, 0xde, 0xda, 0xc2, 0xd1, + 0xdf, 0xd8, 0xd8, 0xd5, 0xe0, 0xe9, 0xd8, 0xd2, + 0x7c, 0x60, 0x8b, 0x55, 0x54, 0x8b, 0x60, 0x56, + 0x90, 0xb1, 0xc5, 0xd6, 0xdf, 0xf2, 0xb8, 0xaa, + 0x90, 0xa0, 0x72, 0x6a, 0x60, 0x3d, 0x45, 0x3c, + 0x87, 0xac, 0x8d, 0x74, 0x8a, 0x8f, 0x9b, 0xc8, + 0x5e, 0x61, 0xb0, 0xd1, 0xc2, 0x69, 0x48, 0x65, + 0x46, 0x56, 0x5a, 0x4f, 0x4c, 0x4d, 0x38, 0x19, + 0x88, 0x6e, 0x60, 0x6f, 0x55, 0x5d, 0x31, 0x52, + 0x82, 0x70, 0x4a, 0x90, 0xb7, 0xa8, 0xaa, 0x5a, + 0x38, 0x51, 0x50, 0x5b, 0x6e, 0x5b, 0x44, 0x41, + 0x3b, 0x56, 0x61, 0x73, 0x5a, 0x2c, 0x3a, 0x4e, + 0x39, 0x38, 0x39, 0x3f, 0x4c, 0x58, 0x5d, 0x5b, + 0x54, 0x3f, 0x29, 0x27, 0x38, 0x4f, 0x5c, 0x5f, + 0x59, 0x5f, 0x52, 0x55, 0xa2, 0x8e, 0x69, 0x65, + 0x65, 0x6c, 0x72, 0x73, 0x6f, 0x6d, 0x70, 0x74, + 0x6d, 0x71, 0x76, 0x79, 0x78, 0x79, 0x80, 0x88, + 0x89, 0x76, 0x60, 0x58, 0x5e, 0x67, 0x69, 0x67, + 0x68, 0x6e, 0x70, 0x68, 0x5a, 0x50, 0x50, 0x54, + 0x4a, 0x56, 0x60, 0x5e, 0x52, 0x4b, 0x4e, 0x55, + 0x4c, 0x56, 0x51, 0x46, 0x56, 0x78, 0x81, 0x73, + 0x98, 0x8c, 0x8a, 0x7a, 0x6e, 0x90, 0xaa, 0x93, + 0x80, 0x6e, 0x90, 0x8a, 0x7b, 0x9b, 0x98, 0xd0, + 0xb3, 0x87, 0x85, 0xb7, 0xb2, 0x88, 0x8d, 0xa1, + 0x79, 0x67, 0x56, 0x32, 0x85, 0xb2, 0x9e, 0x6b, + 0x39, 0x51, 0xb1, 0x59, 0x18, 0x4b, 0x2b, 0x36, + 0x1d, 0x3b, 0x3f, 0x35, 0x66, 0xbf, 0xe2, 0xcc, + 0x6a, 0x43, 0xb1, 0xb9, 0xdd, 0xfd, 0x4a, 0x00, + 0xcc, 0xb9, 0x6b, 0x43, 0x2d, 0x37, 0x18, 0x16, + 0x36, 0xe7, 0xe9, 0x6f, 0x51, 0x90, 0x96, 0x33, + 0x29, 0x25, 0x16, 0x34, 0x28, 0x3e, 0xc7, 0xff, + 0x9d, 0x22, 0x65, 0x64, 0x15, 0x20, 0x21, 0x32, + 0x32, 0x2a, 0x3a, 0x1a, 0x19, 0x33, 0x18, 0x16, + 0xd5, 0xd3, 0xd0, 0xda, 0xae, 0x2e, 0x70, 0xd6, + 0xd8, 0xd4, 0xd0, 0xcf, 0xd2, 0xd3, 0xd3, 0xd1, + 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, + 0xeb, 0xe2, 0xc0, 0x7d, 0x9b, 0xca, 0xde, 0xcc, + 0xcc, 0xb3, 0xcb, 0xd4, 0xd2, 0x95, 0xb9, 0xb7, + 0xdf, 0xce, 0x6b, 0x96, 0xb4, 0xc6, 0xe2, 0xd0, + 0x9a, 0xba, 0xa9, 0xdd, 0x9f, 0xd1, 0xf3, 0xea, + 0xe2, 0xd7, 0xcd, 0xcf, 0xd7, 0xdc, 0xd8, 0xd0, + 0xe5, 0xe0, 0xd8, 0xba, 0xb2, 0xd2, 0xbe, 0x73, + 0x73, 0x65, 0x5e, 0x1d, 0x4e, 0xb2, 0x74, 0x4e, + 0x80, 0xaf, 0xd7, 0xec, 0xda, 0xcb, 0x8a, 0x88, + 0x84, 0x64, 0x9c, 0x6a, 0x3b, 0x4c, 0x3a, 0x72, + 0xb1, 0x5c, 0x37, 0x9c, 0x9c, 0x7c, 0x50, 0x8b, + 0x93, 0x54, 0x68, 0xab, 0xe2, 0x80, 0x35, 0x54, + 0x76, 0x78, 0x67, 0x4b, 0x45, 0x4e, 0x48, 0x35, + 0x6f, 0x69, 0x5d, 0x63, 0x29, 0x28, 0x31, 0x81, + 0xba, 0xb9, 0x61, 0x6f, 0xa4, 0xac, 0xbc, 0x89, + 0x7e, 0x84, 0x77, 0x68, 0x71, 0x65, 0x4b, 0x55, + 0x4b, 0x46, 0x38, 0x43, 0x5c, 0x6f, 0x70, 0x51, + 0x53, 0x4d, 0x47, 0x49, 0x50, 0x54, 0x4f, 0x47, + 0x50, 0x3e, 0x2e, 0x33, 0x48, 0x59, 0x5b, 0x56, + 0x5f, 0x60, 0x57, 0x62, 0xab, 0x8a, 0x66, 0x6b, + 0x66, 0x65, 0x69, 0x74, 0x7f, 0x81, 0x79, 0x6f, + 0x69, 0x5c, 0x5e, 0x71, 0x7c, 0x77, 0x77, 0x80, + 0x8d, 0x7d, 0x6a, 0x62, 0x66, 0x6f, 0x74, 0x75, + 0x7c, 0x73, 0x6b, 0x6c, 0x72, 0x73, 0x6c, 0x64, + 0x76, 0x73, 0x6c, 0x63, 0x58, 0x4c, 0x43, 0x3e, + 0x4d, 0x5c, 0x58, 0x46, 0x4f, 0x75, 0x91, 0x93, + 0x8e, 0x85, 0x82, 0xc0, 0xf6, 0xaf, 0x5a, 0x64, + 0x8f, 0x8e, 0x8b, 0x96, 0x90, 0xe3, 0xaa, 0xb7, + 0x8c, 0x9f, 0x9e, 0xa1, 0x97, 0x98, 0xa6, 0x86, + 0x4f, 0x81, 0x73, 0xa7, 0xd4, 0x63, 0x89, 0xcd, + 0x93, 0x3c, 0x72, 0x67, 0x61, 0x71, 0x26, 0x33, + 0x39, 0x40, 0x31, 0x17, 0x19, 0x32, 0x34, 0x20, + 0x45, 0x9c, 0xea, 0xff, 0xff, 0xc1, 0x75, 0x9d, + 0xd6, 0xff, 0xb0, 0x50, 0xce, 0xff, 0xfa, 0xf0, + 0xdf, 0xab, 0x62, 0x44, 0x21, 0x16, 0x35, 0x1f, + 0x1b, 0x44, 0x34, 0x3e, 0x31, 0x1f, 0x5c, 0x76, + 0x41, 0x4e, 0x0d, 0x33, 0x4d, 0x2b, 0x40, 0x1a, + 0x20, 0x21, 0x30, 0x13, 0x2a, 0x57, 0x21, 0x00, + 0xd0, 0xce, 0xce, 0xd7, 0x9f, 0x27, 0x7b, 0xd7, + 0xd3, 0xcf, 0xcb, 0xcb, 0xcd, 0xd0, 0xcf, 0xce, + 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdc, 0xdd, 0xdd, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xdc, 0xdf, 0xea, 0xa7, 0x50, 0xa3, 0xe1, 0xd9, + 0xca, 0xaf, 0xc1, 0xe3, 0xf1, 0x9a, 0x65, 0x96, + 0xff, 0xeb, 0x8b, 0x86, 0xc3, 0xea, 0xca, 0xd5, + 0x97, 0xcf, 0xb9, 0xb8, 0x9a, 0xef, 0xdf, 0xcc, + 0xd7, 0xd4, 0xc9, 0xc7, 0xd8, 0xe6, 0xe1, 0xd4, + 0xca, 0xd6, 0xe7, 0xe7, 0xc6, 0xc9, 0xcf, 0x8f, + 0x65, 0x75, 0x6d, 0x48, 0x4f, 0x7d, 0x7a, 0xac, + 0xaf, 0xd2, 0xe7, 0xec, 0xdb, 0xe5, 0xcf, 0xee, + 0xda, 0x78, 0x8e, 0x95, 0x91, 0x8c, 0x49, 0x47, + 0x3a, 0x78, 0x7a, 0x9d, 0x84, 0x86, 0x32, 0x52, + 0x7b, 0x4e, 0x3d, 0x4e, 0xa6, 0x8e, 0x53, 0x55, + 0x32, 0x60, 0x6e, 0x4c, 0x39, 0x46, 0x3e, 0x1f, + 0x30, 0x5b, 0x68, 0x41, 0x2b, 0x8b, 0x9c, 0x4b, + 0x7c, 0xc2, 0xa1, 0x8e, 0x9e, 0x90, 0x76, 0x40, + 0x4f, 0x32, 0x45, 0x43, 0x3b, 0x4f, 0x4e, 0x49, + 0x35, 0x30, 0x36, 0x39, 0x30, 0x35, 0x47, 0x4c, + 0x5b, 0x61, 0x5d, 0x58, 0x60, 0x68, 0x52, 0x30, + 0x22, 0x22, 0x2d, 0x48, 0x67, 0x77, 0x72, 0x67, + 0x5e, 0x65, 0x61, 0x69, 0xa7, 0x7e, 0x5a, 0x66, + 0x5a, 0x6c, 0x82, 0x8e, 0x8e, 0x8a, 0x88, 0x89, + 0x83, 0x7a, 0x75, 0x7c, 0x85, 0x85, 0x7d, 0x74, + 0x67, 0x6e, 0x72, 0x6c, 0x61, 0x5d, 0x63, 0x6c, + 0x6c, 0x6d, 0x70, 0x76, 0x7c, 0x81, 0x82, 0x81, + 0x77, 0x6b, 0x5b, 0x52, 0x50, 0x53, 0x56, 0x57, + 0x46, 0x4b, 0x4d, 0x49, 0x4a, 0x63, 0x95, 0xbf, + 0x8e, 0xac, 0x85, 0x70, 0x9a, 0x8c, 0x70, 0x95, + 0xff, 0xdb, 0x92, 0x81, 0x78, 0xaa, 0x4f, 0x35, + 0xa2, 0xd3, 0xcc, 0xe0, 0xe4, 0xb4, 0xb2, 0xbe, + 0xb5, 0xbd, 0xb8, 0xb9, 0xc3, 0x78, 0x4a, 0x66, + 0x2d, 0x2d, 0x46, 0x6d, 0x40, 0x07, 0x17, 0x1a, + 0x27, 0x2e, 0x2a, 0x1c, 0x1f, 0x31, 0x37, 0x2e, + 0x3c, 0x3b, 0x0b, 0x4b, 0x84, 0x29, 0x23, 0x97, + 0xe4, 0xa4, 0xf7, 0xfc, 0xc6, 0xb9, 0xff, 0xc0, + 0x4a, 0x3b, 0x24, 0x23, 0x1c, 0x47, 0x7e, 0x50, + 0x33, 0x56, 0x2b, 0x2b, 0x47, 0x16, 0x1b, 0x75, + 0xff, 0xc2, 0x3a, 0x1d, 0x4e, 0x3c, 0x20, 0x2d, + 0x34, 0x23, 0x25, 0x03, 0x11, 0x39, 0x14, 0x00, + 0xcc, 0xcb, 0xcc, 0xd5, 0x94, 0x22, 0x84, 0xd7, + 0xcf, 0xcb, 0xc7, 0xc7, 0xca, 0xcc, 0xcc, 0xcb, + 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, + 0xd4, 0xd5, 0xd6, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xec, 0xda, 0xde, 0xdc, 0x6c, 0x67, 0xbc, 0xdd, + 0xe4, 0xc8, 0xb9, 0xe7, 0xf7, 0xb5, 0x79, 0xd3, + 0xec, 0xa0, 0xa8, 0xba, 0xde, 0xdb, 0xcc, 0xa9, + 0xb1, 0xe6, 0xba, 0x88, 0xad, 0xe6, 0xd5, 0xd6, + 0xce, 0xc8, 0xb8, 0xc1, 0xdf, 0xe4, 0xd9, 0xde, + 0xde, 0xd9, 0xc8, 0xe5, 0xdc, 0xcb, 0xd4, 0x95, + 0x6e, 0x82, 0x62, 0x65, 0x70, 0x89, 0x7a, 0x72, + 0xbb, 0xd5, 0xde, 0xe7, 0xed, 0xfb, 0xb2, 0x95, + 0x63, 0x3e, 0x4f, 0xa6, 0xa3, 0x50, 0x49, 0x6e, + 0x7f, 0x84, 0xcb, 0xe0, 0xaf, 0xff, 0xdf, 0x69, + 0x4c, 0x65, 0x82, 0x68, 0x87, 0x80, 0x5c, 0x47, + 0x67, 0x4c, 0x40, 0x4e, 0x56, 0x4b, 0x43, 0x45, + 0x55, 0x75, 0x8d, 0x59, 0x3d, 0x70, 0xb0, 0x88, + 0x7f, 0x92, 0x84, 0x66, 0x4b, 0x3a, 0x39, 0x36, + 0x3b, 0x36, 0x66, 0x56, 0x2c, 0x2f, 0x2b, 0x38, + 0x3a, 0x3c, 0x4e, 0x49, 0x3c, 0x49, 0x4c, 0x3e, + 0x30, 0x4d, 0x64, 0x5b, 0x44, 0x36, 0x37, 0x3d, + 0x39, 0x3b, 0x43, 0x53, 0x63, 0x67, 0x5d, 0x51, + 0x3e, 0x5d, 0x64, 0x60, 0x97, 0x7a, 0x5f, 0x66, + 0x64, 0x71, 0x79, 0x71, 0x62, 0x5e, 0x6d, 0x7e, + 0x71, 0x73, 0x72, 0x73, 0x7a, 0x80, 0x7a, 0x6e, + 0x65, 0x5f, 0x5b, 0x5d, 0x63, 0x61, 0x56, 0x4c, + 0x59, 0x64, 0x6f, 0x6f, 0x66, 0x60, 0x63, 0x69, + 0x4d, 0x51, 0x55, 0x55, 0x51, 0x4e, 0x4e, 0x50, + 0x47, 0x41, 0x48, 0x60, 0x77, 0x76, 0x5f, 0x49, + 0x4a, 0x38, 0x91, 0xc1, 0x7b, 0x7c, 0xac, 0x8e, + 0x0f, 0x34, 0x2f, 0x17, 0x60, 0xa9, 0x8f, 0x4d, + 0x19, 0x54, 0x5d, 0x5c, 0x5f, 0xa1, 0xe4, 0xa6, + 0x3a, 0x27, 0x4c, 0x8d, 0xc5, 0xb2, 0x35, 0x1b, + 0x21, 0x62, 0x4e, 0x3a, 0x18, 0x2b, 0x74, 0x3c, + 0x59, 0x68, 0x57, 0x2b, 0x1d, 0x32, 0x36, 0x22, + 0x10, 0x65, 0x71, 0x33, 0x2b, 0x4c, 0x63, 0x7b, + 0x3f, 0xe4, 0xfa, 0x90, 0x71, 0x4d, 0x3b, 0x64, + 0xff, 0xe9, 0x90, 0x4d, 0x20, 0x2e, 0x80, 0x9e, + 0x51, 0x2f, 0x17, 0x13, 0x24, 0x28, 0x5b, 0xd9, + 0x9a, 0x86, 0x99, 0x30, 0x4d, 0xff, 0xff, 0xff, + 0xa2, 0x4d, 0x2f, 0x23, 0x2e, 0x34, 0x17, 0x30, + 0xcb, 0xc9, 0xcc, 0xd4, 0x8d, 0x1f, 0x88, 0xd7, + 0xcc, 0xc8, 0xc5, 0xc5, 0xc8, 0xcb, 0xcb, 0xc9, + 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, + 0xd3, 0xd4, 0xd5, 0xd7, 0xd9, 0xdb, 0xdc, 0xdd, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xd5, 0xe6, 0xdc, 0xea, 0xaf, 0x51, 0xb3, 0xeb, + 0xdc, 0xc9, 0xaf, 0xe5, 0xe0, 0xc0, 0x9a, 0xe9, + 0xe5, 0xc3, 0xca, 0xa7, 0xe1, 0xc4, 0xd8, 0x93, + 0x82, 0xd0, 0xc7, 0x9b, 0xea, 0xd7, 0xcd, 0xec, + 0xdb, 0xa0, 0xa8, 0xd6, 0xd7, 0xd4, 0xe1, 0xdf, + 0xd4, 0xe9, 0xc2, 0xd8, 0xec, 0xe6, 0xd8, 0x6e, + 0x7c, 0x86, 0x52, 0x67, 0x68, 0x82, 0x9f, 0x99, + 0xae, 0xe2, 0xeb, 0xcd, 0xbc, 0xe8, 0xd8, 0xe0, + 0xad, 0x92, 0x6c, 0x4d, 0x5e, 0x67, 0x56, 0x68, + 0x5e, 0x7c, 0xa8, 0x73, 0x72, 0xcb, 0xfd, 0xfd, + 0xab, 0xb1, 0xc0, 0x74, 0x4a, 0x3b, 0x43, 0x43, + 0x58, 0x61, 0x67, 0x62, 0x59, 0x53, 0x4f, 0x4b, + 0x42, 0x4b, 0x64, 0x59, 0x60, 0x3a, 0x74, 0x9a, + 0x44, 0x1d, 0x48, 0x79, 0x60, 0x39, 0x35, 0x4f, + 0x71, 0x61, 0x63, 0x4e, 0x63, 0x68, 0x33, 0x3e, + 0x30, 0x24, 0x45, 0x5a, 0x52, 0x4f, 0x45, 0x3c, + 0x48, 0x31, 0x30, 0x48, 0x4f, 0x3d, 0x34, 0x3f, + 0x4b, 0x45, 0x3e, 0x3e, 0x42, 0x44, 0x42, 0x3e, + 0x16, 0x4d, 0x5e, 0x51, 0x8a, 0x80, 0x6d, 0x6f, + 0x6f, 0x68, 0x62, 0x62, 0x68, 0x6d, 0x6d, 0x6a, + 0x6f, 0x71, 0x73, 0x74, 0x72, 0x6f, 0x6a, 0x66, + 0x6c, 0x6f, 0x6f, 0x68, 0x5d, 0x57, 0x5b, 0x60, + 0x62, 0x63, 0x68, 0x71, 0x7a, 0x7b, 0x73, 0x6b, + 0x71, 0x76, 0x76, 0x69, 0x5a, 0x58, 0x67, 0x77, + 0x64, 0x59, 0x3d, 0x31, 0x58, 0x9a, 0xbd, 0xba, + 0xc0, 0xca, 0xd7, 0xaa, 0x62, 0x55, 0x45, 0x08, + 0x26, 0x14, 0x1a, 0x2f, 0xe5, 0xff, 0xf6, 0x8e, + 0x64, 0x5b, 0x19, 0x22, 0x30, 0x1b, 0x2e, 0x22, + 0x1a, 0x2d, 0x76, 0xeb, 0x7c, 0x70, 0xa6, 0x1f, + 0x25, 0x32, 0x29, 0x27, 0x7b, 0xfe, 0xfa, 0x79, + 0x36, 0x38, 0x3c, 0x3b, 0x34, 0x2c, 0x2b, 0x2f, + 0x40, 0x30, 0x2a, 0x46, 0x28, 0x10, 0x2e, 0x0e, + 0x5d, 0x97, 0xa8, 0xe1, 0xaf, 0x48, 0x31, 0xd2, + 0xff, 0xf2, 0x70, 0x1c, 0x2a, 0x3e, 0x3d, 0x1c, + 0x3d, 0x00, 0x30, 0x2b, 0x29, 0xa6, 0xf5, 0xf8, + 0xf3, 0xff, 0xf8, 0xff, 0xd0, 0x7b, 0xc2, 0xff, + 0xf7, 0x4a, 0x0a, 0x42, 0x82, 0x62, 0x04, 0x00, + 0xc3, 0xcc, 0xba, 0xd6, 0x77, 0x23, 0x96, 0xd3, + 0xc3, 0xc4, 0xc5, 0xc4, 0xc2, 0xc1, 0xc1, 0xc2, + 0xce, 0xca, 0xc9, 0xcb, 0xcb, 0xc9, 0xca, 0xcd, + 0xd2, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xdd, + 0xda, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xde, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe2, 0xd3, 0xe6, 0xec, 0xd7, 0x79, 0x83, 0xd1, + 0xce, 0xcd, 0xb3, 0xd9, 0xe3, 0x9a, 0x86, 0xa3, + 0x96, 0xde, 0xce, 0xbe, 0xc5, 0xb8, 0xbe, 0xbd, + 0xa9, 0xc7, 0xc9, 0xa2, 0xe7, 0xd2, 0xdd, 0xd4, + 0xc7, 0xbf, 0xc5, 0xd6, 0xd8, 0xcd, 0xcd, 0xd7, + 0xdc, 0xe0, 0xe4, 0xd5, 0xe3, 0xdb, 0xd1, 0x66, + 0x50, 0x61, 0x49, 0x54, 0x55, 0x6d, 0x5d, 0x6e, + 0xb3, 0xa0, 0xb7, 0xcd, 0x97, 0x4c, 0x42, 0x60, + 0xca, 0xd0, 0xb1, 0xa0, 0x9d, 0x85, 0x61, 0x3c, + 0x29, 0x27, 0x29, 0x30, 0x30, 0x2d, 0x2f, 0x37, + 0x86, 0xc0, 0xa1, 0x62, 0x68, 0x69, 0x52, 0x58, + 0x56, 0x4f, 0x51, 0x55, 0x48, 0x32, 0x2f, 0x3b, + 0x5e, 0x5b, 0x8e, 0x56, 0x2e, 0x4b, 0x58, 0xac, + 0x4c, 0x2d, 0x4e, 0x77, 0x5c, 0x3f, 0x49, 0x53, + 0x65, 0x49, 0x46, 0x37, 0x52, 0x4c, 0x17, 0x42, + 0x3e, 0x21, 0x42, 0x57, 0x61, 0x57, 0x2f, 0x42, + 0x6c, 0x47, 0x38, 0x4b, 0x51, 0x3a, 0x34, 0x47, + 0x46, 0x5c, 0x65, 0x58, 0x37, 0x11, 0x19, 0x45, + 0x58, 0x75, 0x69, 0x6a, 0x96, 0x99, 0x73, 0x68, + 0x68, 0x60, 0x5a, 0x60, 0x6d, 0x75, 0x73, 0x6c, + 0x78, 0x71, 0x6b, 0x6b, 0x72, 0x78, 0x7b, 0x7a, + 0x61, 0x67, 0x6b, 0x6a, 0x66, 0x64, 0x68, 0x6e, + 0x62, 0x6b, 0x71, 0x69, 0x59, 0x4e, 0x50, 0x57, + 0x6d, 0x66, 0x5d, 0x5a, 0x5c, 0x5d, 0x5a, 0x57, + 0x45, 0x44, 0x34, 0x70, 0x72, 0x63, 0x31, 0x0c, + 0x75, 0xeb, 0xff, 0x98, 0x71, 0x73, 0x4b, 0x3c, + 0x4f, 0x5f, 0x53, 0x31, 0x33, 0x64, 0x92, 0xa1, + 0xcc, 0xd4, 0xf9, 0x73, 0x4b, 0x3d, 0x20, 0x32, + 0x75, 0xb3, 0x3e, 0x3e, 0x36, 0x20, 0x28, 0x35, + 0x44, 0x27, 0x65, 0xaa, 0x73, 0xa7, 0xff, 0xc5, + 0xae, 0x75, 0x28, 0x32, 0x37, 0x43, 0x75, 0x56, + 0x3f, 0x42, 0x2b, 0x22, 0x36, 0x3b, 0x42, 0x60, + 0xff, 0x86, 0x75, 0xdb, 0xc6, 0x4b, 0x6f, 0xff, + 0xfe, 0x86, 0x1c, 0x0a, 0x24, 0x36, 0x35, 0x2c, + 0x39, 0x1a, 0x22, 0x2d, 0x2b, 0x5c, 0x8a, 0x79, + 0xa9, 0x9e, 0xd4, 0xdb, 0x95, 0xa1, 0xeb, 0xf9, + 0xe6, 0xbd, 0x8b, 0x6c, 0x5e, 0x4b, 0x2a, 0x0e, + 0xc3, 0xca, 0xbb, 0xd1, 0x72, 0x27, 0x99, 0xd2, + 0xcc, 0xc7, 0xc2, 0xc1, 0xc6, 0xcc, 0xcf, 0xd0, + 0xcb, 0xca, 0xca, 0xcd, 0xcf, 0xce, 0xce, 0xce, + 0xd2, 0xd3, 0xd4, 0xd6, 0xd8, 0xda, 0xdb, 0xdc, + 0xda, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xde, 0xde, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe3, 0xe4, 0xde, 0xde, 0xe2, 0xad, 0x7c, 0xc2, + 0xe4, 0xd4, 0xbb, 0xce, 0xc6, 0xa9, 0xac, 0x9a, + 0xaf, 0xd8, 0xa8, 0xbe, 0xe2, 0xb8, 0xb5, 0xbd, + 0xbc, 0xf0, 0xbe, 0xa1, 0xd2, 0xc0, 0xd5, 0xc9, + 0xaf, 0xc3, 0xd7, 0xdc, 0xd8, 0xd6, 0xd7, 0xd9, + 0xc0, 0xd4, 0xd1, 0xcd, 0xec, 0xcf, 0xbf, 0x90, + 0x73, 0x7b, 0x70, 0x71, 0x52, 0x63, 0x6a, 0x7b, + 0xb4, 0xf2, 0xf7, 0xa2, 0x54, 0x49, 0x63, 0x77, + 0x76, 0x88, 0x89, 0x52, 0x1e, 0x1b, 0x25, 0x2e, + 0x4b, 0x43, 0x39, 0x36, 0x3f, 0x45, 0x3a, 0x2a, + 0x24, 0x40, 0x33, 0x3e, 0x7a, 0x84, 0x6d, 0x7c, + 0x5b, 0x4f, 0x4d, 0x54, 0x4f, 0x3d, 0x38, 0x41, + 0x1b, 0x4a, 0x88, 0x7a, 0x45, 0x35, 0x5b, 0xa4, + 0x79, 0x55, 0x43, 0x5d, 0x6e, 0x58, 0x4a, 0x5b, + 0x3f, 0x4f, 0x5e, 0x33, 0x40, 0x62, 0x32, 0x1e, + 0x23, 0x2f, 0x3a, 0x59, 0x77, 0x77, 0x54, 0x23, + 0x39, 0x41, 0x33, 0x32, 0x4f, 0x56, 0x41, 0x35, + 0x29, 0x20, 0x24, 0x42, 0x69, 0x81, 0x93, 0xa3, + 0x8b, 0x85, 0x75, 0x73, 0x7d, 0x79, 0x6f, 0x71, + 0x71, 0x70, 0x6f, 0x6c, 0x67, 0x61, 0x5c, 0x59, + 0x6c, 0x68, 0x66, 0x68, 0x6c, 0x6c, 0x67, 0x62, + 0x66, 0x73, 0x82, 0x86, 0x7d, 0x6e, 0x62, 0x5c, + 0x75, 0x7a, 0x7b, 0x6f, 0x60, 0x5b, 0x64, 0x6f, + 0x6a, 0x64, 0x5c, 0x55, 0x51, 0x4d, 0x4b, 0x49, + 0x4b, 0x46, 0x40, 0x3b, 0x20, 0x1b, 0xbc, 0xef, + 0xb3, 0x75, 0x5a, 0xa3, 0xc0, 0x6f, 0x3c, 0x4b, + 0x6b, 0x46, 0x54, 0x98, 0xb4, 0x87, 0x55, 0x49, + 0x1e, 0x40, 0x4e, 0x19, 0x31, 0x22, 0x1b, 0x87, + 0xfe, 0xb6, 0x0e, 0x4e, 0x3e, 0x05, 0x39, 0x44, + 0x3f, 0x59, 0xdc, 0xdb, 0x6a, 0x42, 0x3f, 0x4e, + 0x8d, 0x3b, 0x0e, 0x3c, 0x71, 0x4a, 0x1e, 0x46, + 0x3a, 0x19, 0x1b, 0x29, 0x3d, 0x77, 0x7b, 0x2f, + 0x57, 0x20, 0x19, 0x4e, 0x5e, 0x34, 0x21, 0x36, + 0x0f, 0x20, 0x16, 0x46, 0x9a, 0x84, 0x4d, 0x61, + 0x00, 0x4f, 0xa2, 0x93, 0x3f, 0x1d, 0x39, 0x51, + 0x16, 0x4d, 0x77, 0x3a, 0x0b, 0x7a, 0xd7, 0xaa, + 0x83, 0x6a, 0x4e, 0x44, 0x44, 0x36, 0x17, 0x00, + 0xc1, 0xc8, 0xbc, 0xc8, 0x69, 0x2c, 0x9f, 0xd0, + 0xce, 0xc8, 0xc2, 0xc3, 0xc9, 0xcf, 0xcf, 0xcd, + 0xca, 0xcc, 0xcd, 0xcf, 0xd2, 0xd3, 0xd2, 0xd0, + 0xd2, 0xd3, 0xd4, 0xd5, 0xd7, 0xd9, 0xda, 0xda, + 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xd4, 0xde, 0xd6, 0xd8, 0xdf, 0xcf, 0x64, 0x6a, + 0xe3, 0xbb, 0xb8, 0xe5, 0xcb, 0xa3, 0xab, 0x8d, + 0xcd, 0xcb, 0x82, 0xc4, 0xf7, 0xb4, 0xb5, 0xb9, + 0xb5, 0xfc, 0x91, 0xa8, 0xd5, 0xcb, 0xdd, 0xc4, + 0xa2, 0xca, 0xe6, 0xe2, 0xd9, 0xde, 0xe0, 0xda, + 0xc6, 0xc7, 0xcf, 0xc9, 0xc9, 0xc4, 0xd4, 0xb1, + 0x79, 0x67, 0x60, 0x6c, 0x5b, 0x75, 0x84, 0x85, + 0x73, 0x96, 0x73, 0x36, 0x35, 0x41, 0x38, 0x35, + 0x2f, 0x4c, 0x94, 0x6d, 0x34, 0x49, 0x48, 0x45, + 0x23, 0x4a, 0x5b, 0x3e, 0x22, 0x26, 0x37, 0x3d, + 0x4b, 0x4e, 0x51, 0x82, 0xb7, 0x96, 0x65, 0x71, + 0x40, 0x3d, 0x42, 0x47, 0x3a, 0x29, 0x2f, 0x43, + 0x48, 0x5e, 0x62, 0x62, 0x3d, 0x25, 0x67, 0xa5, + 0x4a, 0x4e, 0x40, 0x4c, 0x65, 0x4b, 0x40, 0x70, + 0x73, 0x58, 0x5a, 0x3e, 0x32, 0x4a, 0x40, 0x37, + 0x18, 0x3a, 0x45, 0x79, 0x76, 0x49, 0x56, 0x4c, + 0x51, 0x75, 0x5e, 0x29, 0x27, 0x40, 0x40, 0x37, + 0x67, 0x90, 0x83, 0x72, 0x90, 0x93, 0x7b, 0x81, + 0x5d, 0x6a, 0x76, 0x81, 0x7d, 0x66, 0x65, 0x81, + 0x6e, 0x6e, 0x6a, 0x5e, 0x55, 0x57, 0x65, 0x73, + 0x76, 0x6f, 0x68, 0x6b, 0x77, 0x86, 0x92, 0x97, + 0x8e, 0x8b, 0x81, 0x75, 0x6c, 0x6e, 0x7a, 0x85, + 0x76, 0x78, 0x74, 0x67, 0x58, 0x57, 0x66, 0x75, + 0x77, 0x74, 0x6d, 0x62, 0x56, 0x4f, 0x4e, 0x4f, + 0x46, 0x3c, 0x42, 0x45, 0x4c, 0x39, 0x5a, 0x23, + 0x14, 0x3d, 0x62, 0xa9, 0x82, 0x33, 0x55, 0x58, + 0xab, 0x45, 0x12, 0x3d, 0x58, 0x39, 0x2f, 0x4e, + 0x73, 0x46, 0x1f, 0x3c, 0x43, 0x22, 0x0b, 0x47, + 0x22, 0x2f, 0x41, 0x38, 0x1b, 0x22, 0x18, 0x5d, + 0x46, 0x1a, 0x6a, 0xdc, 0xff, 0x9e, 0x20, 0x2f, + 0x65, 0x6c, 0xba, 0x91, 0x55, 0x74, 0x74, 0x77, + 0x3d, 0x6d, 0x68, 0x3a, 0x43, 0x72, 0x72, 0x4e, + 0x1c, 0x37, 0x3e, 0x2c, 0x2c, 0x3f, 0x3f, 0x29, + 0x2d, 0x65, 0x40, 0x13, 0x40, 0x57, 0x3c, 0x3d, + 0xe5, 0xeb, 0xf5, 0xef, 0xa9, 0x46, 0x45, 0x99, + 0x62, 0x1d, 0x1b, 0x31, 0x1e, 0x32, 0x63, 0x6b, + 0x38, 0x2e, 0x28, 0x31, 0x3d, 0x37, 0x1d, 0x04, + 0xbf, 0xc4, 0xbd, 0xbd, 0x5c, 0x34, 0xa6, 0xcd, + 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc4, 0xc3, 0xc1, + 0xc9, 0xcf, 0xd2, 0xcf, 0xce, 0xd2, 0xd4, 0xd2, + 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, + 0xd8, 0xd9, 0xd9, 0xda, 0xdb, 0xdc, 0xdc, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xe5, 0xdc, 0xde, 0xe0, 0xde, 0xf1, 0xaa, 0x62, + 0xba, 0xb9, 0xc4, 0xe7, 0xc7, 0x97, 0x9e, 0x8f, + 0xdc, 0xbb, 0x7f, 0xd2, 0xe7, 0xad, 0xcb, 0xb1, + 0xc6, 0xff, 0x78, 0xc7, 0xe1, 0xc7, 0xc2, 0xa1, + 0xbb, 0xd1, 0xe1, 0xe0, 0xdd, 0xdf, 0xdf, 0xda, + 0xd9, 0xc5, 0xd2, 0xd8, 0xc4, 0xc4, 0xd3, 0xb7, + 0x87, 0x68, 0x53, 0x55, 0x56, 0x6f, 0x88, 0x93, + 0x74, 0x8e, 0x6a, 0x49, 0x5c, 0x55, 0x49, 0x6c, + 0x52, 0x4f, 0x99, 0x5e, 0x16, 0x41, 0x41, 0x3c, + 0x2b, 0x51, 0x5d, 0x42, 0x3a, 0x53, 0x5e, 0x51, + 0x76, 0x71, 0x6b, 0x80, 0x86, 0x4f, 0x24, 0x36, + 0x41, 0x4a, 0x58, 0x57, 0x3e, 0x2c, 0x40, 0x63, + 0x64, 0x69, 0x73, 0x68, 0x3d, 0x25, 0x53, 0x98, + 0x5b, 0x6b, 0x71, 0x77, 0x72, 0x4c, 0x3c, 0x59, + 0x50, 0x3a, 0x6b, 0x95, 0x7d, 0x60, 0x46, 0x2b, + 0x4f, 0x44, 0x3f, 0x70, 0x80, 0x69, 0x7c, 0x8b, + 0x65, 0x27, 0x1b, 0x4e, 0x70, 0x6e, 0x66, 0x61, + 0x75, 0x8c, 0x8b, 0x7f, 0x7e, 0x79, 0x8e, 0xbc, + 0xc6, 0xae, 0x81, 0x77, 0x92, 0x8c, 0x77, 0x7f, + 0x61, 0x61, 0x5f, 0x58, 0x55, 0x5e, 0x71, 0x82, + 0x7e, 0x7a, 0x77, 0x76, 0x74, 0x6c, 0x60, 0x56, + 0x62, 0x65, 0x66, 0x63, 0x5e, 0x5f, 0x67, 0x6e, + 0x6d, 0x6f, 0x69, 0x58, 0x44, 0x3c, 0x44, 0x4f, + 0x70, 0x6f, 0x6a, 0x5f, 0x53, 0x4d, 0x4d, 0x50, + 0x66, 0x51, 0x3f, 0x37, 0x2e, 0x58, 0x54, 0x96, + 0xc3, 0xc5, 0x4c, 0x18, 0x26, 0x80, 0xbf, 0x1b, + 0x2c, 0x23, 0x23, 0x2d, 0x31, 0x2f, 0x36, 0x44, + 0x2e, 0x1c, 0x20, 0xc0, 0xff, 0xf2, 0x9d, 0x6b, + 0x4f, 0x55, 0x13, 0x1e, 0x11, 0x0a, 0x39, 0x0f, + 0x83, 0xea, 0xfc, 0xf1, 0xb3, 0x4e, 0x3b, 0x3f, + 0x02, 0xb9, 0xe7, 0x6d, 0x62, 0x80, 0x45, 0x37, + 0x5f, 0x74, 0x59, 0x6f, 0xec, 0xff, 0xe0, 0x80, + 0x34, 0x2d, 0x1f, 0x19, 0x2a, 0x42, 0x43, 0x33, + 0x44, 0x43, 0x3f, 0x32, 0x27, 0x31, 0x3b, 0x37, + 0x85, 0x9b, 0x61, 0x22, 0x35, 0x45, 0x2d, 0x25, + 0x38, 0x28, 0x4c, 0x73, 0x6d, 0x6d, 0x6b, 0x4f, + 0x2c, 0x25, 0x21, 0x28, 0x32, 0x30, 0x21, 0x11, + 0xbd, 0xc1, 0xbf, 0xb1, 0x4f, 0x3c, 0xae, 0xca, + 0xbf, 0xc3, 0xc5, 0xc2, 0xbd, 0xbd, 0xc5, 0xcc, + 0xbd, 0xce, 0xd6, 0xcf, 0xc8, 0xcc, 0xd2, 0xd3, + 0xd3, 0xd3, 0xd4, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, + 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd1, 0xda, 0xd8, 0xd6, 0xe2, 0xd8, 0x66, + 0x92, 0xd7, 0xe7, 0xe8, 0xcc, 0x9b, 0xa5, 0xb9, + 0xd9, 0xaf, 0x9e, 0xdc, 0xbf, 0xa9, 0xe3, 0xac, + 0xc5, 0xef, 0x78, 0xde, 0xd5, 0xb4, 0xb4, 0xb4, + 0xe7, 0xd7, 0xd0, 0xd9, 0xdf, 0xdb, 0xd6, 0xd7, + 0xd9, 0xca, 0xbf, 0xc9, 0xd3, 0xd0, 0xbe, 0xc5, + 0x70, 0x89, 0x99, 0x8c, 0x7a, 0x6e, 0x95, 0xcf, + 0xcb, 0xcf, 0x75, 0x23, 0x3c, 0x54, 0x3f, 0x3a, + 0x49, 0x4c, 0xa1, 0x6f, 0x25, 0x47, 0x48, 0x4a, + 0x30, 0x56, 0x62, 0x49, 0x42, 0x5b, 0x67, 0x5b, + 0x7a, 0x76, 0x65, 0x5f, 0x64, 0x5d, 0x5c, 0x6f, + 0x41, 0x3a, 0x3b, 0x3e, 0x34, 0x29, 0x35, 0x4d, + 0x2d, 0x43, 0x8d, 0x69, 0x2f, 0x31, 0x53, 0xc1, + 0x65, 0x4d, 0x5a, 0x76, 0x78, 0x74, 0x6c, 0x55, + 0x62, 0x56, 0x5d, 0x61, 0x4e, 0x65, 0x8a, 0x75, + 0x70, 0x75, 0x85, 0x64, 0x4d, 0x5a, 0x64, 0x81, + 0x76, 0x4a, 0x62, 0x91, 0x9d, 0xb6, 0xb7, 0x80, + 0x81, 0x66, 0x91, 0xc3, 0xa2, 0x84, 0xab, 0xdb, + 0x81, 0x92, 0xab, 0xbd, 0xc1, 0xb2, 0x8a, 0x5e, + 0x5f, 0x64, 0x6a, 0x6c, 0x6a, 0x66, 0x62, 0x5f, + 0x79, 0x6d, 0x5e, 0x57, 0x59, 0x60, 0x66, 0x68, + 0x67, 0x67, 0x63, 0x5c, 0x58, 0x5c, 0x68, 0x73, + 0x3a, 0x46, 0x52, 0x53, 0x4f, 0x50, 0x5b, 0x67, + 0x72, 0x70, 0x6b, 0x65, 0x60, 0x5e, 0x5f, 0x61, + 0x55, 0x50, 0x46, 0x48, 0x4c, 0x61, 0x1b, 0x24, + 0x2d, 0xb8, 0xcb, 0x97, 0x23, 0x1e, 0x9a, 0x6c, + 0x53, 0x9c, 0xde, 0xe3, 0xbf, 0x90, 0x5e, 0x36, + 0x8d, 0xfb, 0xe9, 0xff, 0xe7, 0xad, 0x8f, 0xbf, + 0x49, 0x39, 0x7e, 0x64, 0x70, 0x73, 0x39, 0x82, + 0xff, 0xd0, 0x4f, 0x1a, 0x28, 0x45, 0x58, 0x1b, + 0x16, 0x55, 0x45, 0x2d, 0x22, 0x24, 0x6a, 0xa6, + 0x35, 0x28, 0x43, 0x60, 0x6e, 0x8d, 0x81, 0x3d, + 0x1f, 0x17, 0x23, 0x3c, 0x3b, 0x23, 0x19, 0x24, + 0x43, 0x74, 0x95, 0x7a, 0x4a, 0x3c, 0x3d, 0x34, + 0x00, 0x55, 0x69, 0x3f, 0x39, 0x3d, 0x43, 0x63, + 0x89, 0x8f, 0x7a, 0x36, 0x09, 0x2d, 0x5a, 0x56, + 0x44, 0x37, 0x26, 0x1b, 0x18, 0x16, 0x11, 0x0c, + 0xbb, 0xbd, 0xc0, 0xa5, 0x43, 0x44, 0xb5, 0xc7, + 0xc2, 0xc0, 0xbd, 0xba, 0xbb, 0xc3, 0xcf, 0xd9, + 0x9b, 0xbf, 0xda, 0xd5, 0xc7, 0xc8, 0xcf, 0xd2, + 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdb, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, + 0xd7, 0xdf, 0xe2, 0xdd, 0xe4, 0xd8, 0xe5, 0x87, + 0x58, 0x93, 0xba, 0xf1, 0xd3, 0x61, 0x67, 0xbe, + 0xd0, 0xac, 0xbd, 0xd4, 0xa6, 0xb1, 0xe0, 0xb3, + 0xb3, 0xc5, 0x90, 0xdd, 0xaf, 0xa8, 0xc1, 0xe8, + 0xfc, 0xda, 0xc7, 0xd2, 0xde, 0xd7, 0xd0, 0xd3, + 0xd2, 0xdb, 0xdc, 0xd1, 0xc6, 0xde, 0xab, 0x77, + 0x73, 0x65, 0x54, 0x44, 0x55, 0x3a, 0x3b, 0x51, + 0xa4, 0xb1, 0x7a, 0x37, 0x35, 0x44, 0x4b, 0x5b, + 0x58, 0x3e, 0x5f, 0x42, 0x21, 0x3d, 0x3c, 0x3c, + 0x30, 0x59, 0x6b, 0x51, 0x37, 0x3e, 0x51, 0x58, + 0x59, 0x60, 0x5d, 0x5c, 0x6c, 0x7f, 0x7e, 0x71, + 0x6f, 0x4f, 0x3b, 0x43, 0x50, 0x4e, 0x4a, 0x4d, + 0x4b, 0x4e, 0x92, 0x5f, 0x39, 0x4e, 0x3c, 0x7b, + 0x81, 0x62, 0x69, 0x6e, 0x51, 0x54, 0x60, 0x47, + 0x6e, 0x76, 0x70, 0x78, 0x68, 0x5f, 0x7a, 0x6c, + 0x89, 0x59, 0x63, 0x68, 0x8d, 0xaf, 0x8f, 0x95, + 0xca, 0xbb, 0xb6, 0x89, 0x5a, 0x8c, 0xce, 0xc4, + 0xf4, 0xd9, 0xa7, 0xa3, 0xcc, 0xc4, 0x96, 0x84, + 0x3a, 0x64, 0xb1, 0xbf, 0x8c, 0x86, 0x94, 0x79, + 0x6a, 0x6c, 0x6e, 0x6e, 0x6b, 0x66, 0x61, 0x5e, + 0x69, 0x67, 0x66, 0x6a, 0x6d, 0x6c, 0x64, 0x5d, + 0x5a, 0x62, 0x69, 0x68, 0x5f, 0x56, 0x51, 0x51, + 0x5c, 0x67, 0x70, 0x6b, 0x5e, 0x55, 0x58, 0x5f, + 0x5c, 0x55, 0x4e, 0x4e, 0x53, 0x57, 0x55, 0x52, + 0x54, 0x46, 0x3b, 0x38, 0x3d, 0x12, 0x35, 0x2a, + 0x70, 0x76, 0x4f, 0x59, 0x45, 0x31, 0x54, 0x2a, + 0x2e, 0x32, 0x40, 0x4b, 0x45, 0x39, 0x42, 0x56, + 0x29, 0x79, 0x5e, 0x4d, 0x36, 0x1b, 0x1b, 0x2c, + 0x6a, 0x12, 0x2e, 0x89, 0x5c, 0x22, 0xad, 0xe4, + 0x6d, 0x26, 0x43, 0x51, 0x3b, 0x33, 0x27, 0x47, + 0x26, 0x00, 0x6e, 0xff, 0x96, 0x27, 0x57, 0x2c, + 0x57, 0x3c, 0x2f, 0x32, 0x30, 0x33, 0x3f, 0x45, + 0x0e, 0x2f, 0x62, 0x84, 0x7f, 0x73, 0x87, 0xab, + 0x2b, 0x60, 0x5f, 0x4c, 0x41, 0x17, 0x37, 0xb3, + 0xe4, 0x9a, 0x64, 0x7a, 0x8e, 0x65, 0x4f, 0x70, + 0x59, 0x28, 0x1d, 0x45, 0x58, 0x4b, 0x51, 0x6b, + 0x68, 0x5a, 0x44, 0x2e, 0x1f, 0x18, 0x17, 0x17, + 0xb9, 0xbb, 0xc1, 0x9d, 0x39, 0x49, 0xbb, 0xc5, + 0xc7, 0xbd, 0xb6, 0xbb, 0xc6, 0xca, 0xc2, 0xb7, + 0x6d, 0xa8, 0xdb, 0xe0, 0xcf, 0xca, 0xce, 0xd0, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd6, 0xd6, 0xd7, 0xd8, 0xd9, 0xd9, 0xda, 0xda, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd5, 0xdd, 0xd2, 0xd4, 0xd6, 0xd8, 0xe8, 0xc8, + 0x7e, 0x90, 0xb6, 0xf9, 0xce, 0x6b, 0x93, 0xf3, + 0xce, 0xb2, 0xc6, 0xbb, 0xaf, 0xc2, 0xc0, 0xc6, + 0xbb, 0xab, 0xb7, 0xd2, 0x94, 0xb6, 0xc2, 0xda, + 0xe9, 0xda, 0xcf, 0xd1, 0xd8, 0xd9, 0xd2, 0xcd, + 0xd7, 0xcd, 0xc7, 0xac, 0x95, 0xe8, 0xde, 0xa8, + 0x84, 0x62, 0x4e, 0x2f, 0x34, 0x26, 0x51, 0x78, + 0xb0, 0x86, 0x70, 0x7f, 0x78, 0x49, 0x2f, 0x3c, + 0x2e, 0x1d, 0x2f, 0x4f, 0x67, 0x67, 0x4c, 0x39, + 0x5f, 0x59, 0x51, 0x53, 0x5f, 0x69, 0x61, 0x52, + 0x59, 0x69, 0x77, 0x73, 0x6a, 0x6d, 0x6a, 0x5b, + 0x6b, 0x52, 0x41, 0x42, 0x42, 0x3b, 0x3e, 0x4a, + 0x43, 0x4a, 0x6f, 0x6c, 0x88, 0xa8, 0x6e, 0x45, + 0x6e, 0x79, 0x84, 0x7b, 0x65, 0x64, 0x73, 0x7b, + 0x81, 0xa9, 0x91, 0x90, 0x8b, 0x74, 0x85, 0x7c, + 0xad, 0x99, 0xab, 0xc9, 0xc8, 0xb1, 0xb0, 0xd4, + 0xe2, 0xb6, 0xb4, 0xd7, 0xba, 0x57, 0x28, 0x44, + 0x78, 0xc7, 0xa7, 0x6b, 0x96, 0xc1, 0xca, 0xed, + 0xff, 0xff, 0xfa, 0xea, 0xd2, 0xb1, 0x8b, 0x6f, + 0x6c, 0x70, 0x6f, 0x67, 0x5f, 0x61, 0x70, 0x7e, + 0x93, 0x89, 0x7d, 0x77, 0x79, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7b, 0x74, 0x68, 0x5f, 0x60, 0x6b, 0x74, + 0x74, 0x7a, 0x7c, 0x71, 0x60, 0x58, 0x5e, 0x67, + 0x64, 0x55, 0x49, 0x4c, 0x5b, 0x63, 0x5c, 0x51, + 0x48, 0x3f, 0x4c, 0x95, 0xa9, 0x40, 0x4d, 0x46, + 0x4e, 0x4a, 0x25, 0x23, 0x41, 0x4f, 0x5d, 0x65, + 0x56, 0x2f, 0x1c, 0x27, 0x26, 0x1c, 0x37, 0x65, + 0x2f, 0x3d, 0x49, 0x4e, 0x53, 0x38, 0x37, 0x1d, + 0x49, 0xce, 0xc5, 0x3a, 0x78, 0x72, 0x36, 0x61, + 0x3b, 0x18, 0x31, 0x25, 0x21, 0x3f, 0x32, 0x38, + 0x1f, 0x19, 0x13, 0x31, 0x3b, 0x15, 0x06, 0x14, + 0x48, 0x4d, 0x32, 0x33, 0x4f, 0x2c, 0x01, 0x14, + 0x2f, 0x23, 0x1c, 0x27, 0x37, 0x3d, 0x37, 0x2f, + 0x7d, 0x4e, 0x4e, 0xb0, 0xca, 0x51, 0x54, 0xff, + 0xd6, 0xc8, 0xa7, 0x60, 0x19, 0x1a, 0x44, 0x59, + 0x33, 0x1a, 0x18, 0x46, 0x78, 0x7c, 0x6b, 0x68, + 0x60, 0x5c, 0x52, 0x43, 0x32, 0x26, 0x20, 0x1f, + 0xb9, 0xb9, 0xc2, 0x98, 0x34, 0x4c, 0xbe, 0xc3, + 0xc7, 0xba, 0xb5, 0xc3, 0xd4, 0xcb, 0xa6, 0x82, + 0x4a, 0x95, 0xdc, 0xe9, 0xd7, 0xcd, 0xce, 0xcf, + 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, + 0xd5, 0xd6, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xda, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xd6, 0xd7, 0xd3, 0xe5, 0xcd, 0xd8, 0xd0, 0xcc, + 0x89, 0xa5, 0xa2, 0x80, 0x48, 0x6a, 0xd8, 0xf3, + 0xd0, 0xb8, 0xc1, 0xa5, 0xc3, 0xd1, 0x9f, 0xd7, + 0xaa, 0x82, 0xbb, 0xc3, 0x9b, 0xe7, 0xd9, 0xc8, + 0xcc, 0xd9, 0xdc, 0xd3, 0xd3, 0xdc, 0xd8, 0xc9, + 0xd6, 0xc9, 0xc4, 0xd1, 0xca, 0xe0, 0xb1, 0xb2, + 0x96, 0x5d, 0x55, 0x4d, 0x5e, 0x57, 0x7b, 0x81, + 0x50, 0x51, 0x85, 0xac, 0x73, 0x27, 0x33, 0x70, + 0x5e, 0x55, 0x42, 0x52, 0x59, 0x3f, 0x40, 0x54, + 0x41, 0x40, 0x46, 0x51, 0x57, 0x57, 0x5d, 0x67, + 0x59, 0x66, 0x72, 0x5c, 0x36, 0x37, 0x5f, 0x7d, + 0x63, 0x67, 0x6a, 0x5c, 0x39, 0x25, 0x3f, 0x69, + 0xa3, 0xad, 0x8d, 0x75, 0x84, 0x96, 0x76, 0x28, + 0x69, 0x7e, 0x71, 0x6a, 0x82, 0x76, 0x52, 0x4f, + 0x71, 0xdd, 0xab, 0x65, 0x79, 0xb7, 0xe5, 0xbe, + 0xab, 0xd1, 0xcd, 0xd1, 0xb5, 0x96, 0xb6, 0xb9, + 0xb3, 0xc4, 0xb4, 0xbd, 0xc6, 0x78, 0x48, 0x81, + 0x82, 0xa4, 0xdc, 0xed, 0xd1, 0xaf, 0x74, 0x29, + 0x0b, 0x29, 0x0f, 0x32, 0x9a, 0x8f, 0x52, 0x6c, + 0x64, 0x73, 0x7c, 0x72, 0x60, 0x5d, 0x6e, 0x82, + 0x82, 0x7a, 0x71, 0x6c, 0x6b, 0x68, 0x62, 0x5c, + 0x5c, 0x69, 0x78, 0x7e, 0x7a, 0x71, 0x6a, 0x68, + 0x7b, 0x7d, 0x77, 0x66, 0x54, 0x4e, 0x59, 0x66, + 0x69, 0x55, 0x44, 0x49, 0x5d, 0x66, 0x5b, 0x4b, + 0x4b, 0x60, 0x2f, 0x70, 0xd8, 0xff, 0xac, 0x51, + 0x15, 0x2f, 0x2e, 0x1a, 0x2a, 0x26, 0x1f, 0x5b, + 0x23, 0x31, 0x51, 0x6a, 0x59, 0x2e, 0x19, 0x1f, + 0x2b, 0x38, 0x46, 0x56, 0xa1, 0x5b, 0x28, 0x2a, + 0x40, 0x39, 0x23, 0x15, 0x41, 0x39, 0x63, 0x3e, + 0x41, 0x57, 0x4d, 0x69, 0x50, 0x11, 0x25, 0x38, + 0x36, 0x7c, 0x96, 0x40, 0x2c, 0x44, 0x39, 0x71, + 0x9a, 0x6e, 0x68, 0x7b, 0x79, 0x6c, 0x4b, 0x1a, + 0x26, 0x1a, 0x16, 0x20, 0x27, 0x25, 0x25, 0x2b, + 0x34, 0x43, 0x6b, 0xa1, 0xc9, 0xcd, 0x9f, 0x64, + 0x50, 0x47, 0x68, 0x73, 0x56, 0x61, 0x71, 0x51, + 0x29, 0x53, 0x82, 0x95, 0x76, 0x38, 0x21, 0x3b, + 0x2d, 0x35, 0x3b, 0x37, 0x2a, 0x1a, 0x0f, 0x0a, + 0xc0, 0xba, 0xca, 0x8d, 0x25, 0x6c, 0xbd, 0xc6, + 0xc3, 0xbc, 0xcc, 0xd1, 0xc1, 0xab, 0x29, 0x16, + 0x1d, 0x0e, 0x3e, 0xb2, 0xc8, 0xce, 0xd8, 0xd1, + 0xcd, 0xce, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd7, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0x99, 0x77, 0xb4, 0x5f, 0x34, 0x55, 0x92, 0x6e, + 0x82, 0x9e, 0xc2, 0xd7, 0xd2, 0xc1, 0xb7, 0xb8, + 0xae, 0x9c, 0xc8, 0xae, 0xd7, 0xde, 0xd7, 0xcf, + 0xce, 0xd1, 0xd6, 0xda, 0xda, 0xd8, 0xd4, 0xd1, + 0xdd, 0xbe, 0xc0, 0xcd, 0xa4, 0xb1, 0xd9, 0x9e, + 0x73, 0x7b, 0x4b, 0x35, 0x43, 0x58, 0x77, 0x76, + 0x43, 0x2e, 0x80, 0x6e, 0x3e, 0x5d, 0x5c, 0x67, + 0x5b, 0x68, 0x61, 0x60, 0x67, 0x50, 0x46, 0x67, + 0x51, 0x69, 0x66, 0x55, 0x53, 0x45, 0x30, 0x31, + 0x2c, 0x1a, 0x4e, 0x58, 0x61, 0x7a, 0x50, 0x38, + 0x50, 0x6b, 0x5c, 0x35, 0x42, 0x7d, 0xad, 0xc1, + 0x97, 0x9b, 0xa3, 0x6e, 0x71, 0xc1, 0xc2, 0x92, + 0x34, 0x66, 0x62, 0xa4, 0xc8, 0xbf, 0xe0, 0xb6, + 0xad, 0xd4, 0x84, 0x73, 0xd3, 0xd0, 0x8b, 0x7d, + 0xc7, 0x66, 0x56, 0xa5, 0xdd, 0xe1, 0xc3, 0x9b, + 0xaf, 0x5c, 0x3d, 0x93, 0xaf, 0xc0, 0xff, 0xde, + 0x96, 0x80, 0x37, 0x25, 0x27, 0x17, 0x29, 0x2e, + 0x36, 0x2c, 0x24, 0x34, 0x2b, 0x25, 0x45, 0x50, + 0x70, 0x73, 0x77, 0x78, 0x73, 0x6a, 0x60, 0x5a, + 0x6a, 0x6e, 0x6e, 0x67, 0x5d, 0x59, 0x5c, 0x61, + 0x5c, 0x64, 0x74, 0x84, 0x8c, 0x83, 0x6f, 0x5f, + 0x81, 0x8a, 0x88, 0x74, 0x63, 0x5c, 0x56, 0x4d, + 0x5d, 0x57, 0x53, 0x55, 0x5a, 0x58, 0x4d, 0x43, + 0x47, 0x40, 0x3e, 0x44, 0x29, 0x2a, 0x65, 0x80, + 0x31, 0x26, 0x1b, 0x1e, 0x29, 0x30, 0x2d, 0x26, + 0x42, 0x3a, 0x2e, 0x25, 0x22, 0x25, 0x2b, 0x2e, + 0x22, 0x4f, 0x8b, 0x72, 0x30, 0x43, 0x55, 0x1a, + 0x3b, 0x27, 0x16, 0x23, 0x3a, 0x35, 0x22, 0x20, + 0x15, 0x44, 0x4d, 0x3c, 0x31, 0x17, 0x0f, 0x2e, + 0x3a, 0x5a, 0x62, 0x3e, 0x21, 0x26, 0x35, 0x38, + 0x54, 0x42, 0x4f, 0x72, 0x70, 0x50, 0x51, 0x73, + 0x77, 0x99, 0x65, 0x39, 0x5e, 0x58, 0x2e, 0x36, + 0x69, 0x5f, 0x4c, 0x36, 0x2a, 0x32, 0x4a, 0x5e, + 0x3d, 0x38, 0x3e, 0x4a, 0x4d, 0x4d, 0x5e, 0x74, + 0x54, 0x34, 0x21, 0x25, 0x21, 0x1a, 0x30, 0x54, + 0x5f, 0x56, 0x61, 0x40, 0x3b, 0x49, 0x1e, 0x0c, + 0xbd, 0xbc, 0xcd, 0x92, 0x2e, 0x74, 0xbf, 0xc4, + 0xc6, 0xc7, 0xca, 0xc4, 0xc2, 0xc7, 0x91, 0xcb, + 0xda, 0xc1, 0x9b, 0xb8, 0xca, 0xdc, 0xd7, 0xc8, + 0xcd, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd6, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xa4, 0x62, 0xc0, 0x7b, 0x51, 0x9a, 0x8a, 0x64, + 0xca, 0xbb, 0xc8, 0xe7, 0xdd, 0xb2, 0xa5, 0xba, + 0xb7, 0x76, 0xa7, 0xc1, 0xe1, 0xd6, 0xd8, 0xda, + 0xed, 0xda, 0xc7, 0xc5, 0xd1, 0xdd, 0xdc, 0xd7, + 0xca, 0xbc, 0xc4, 0xb3, 0xaa, 0xd1, 0xbf, 0x67, + 0x58, 0x88, 0x93, 0x64, 0x42, 0x40, 0x4c, 0x61, + 0x94, 0x2d, 0x2c, 0x52, 0x4a, 0x4e, 0x5a, 0x5b, + 0x42, 0x70, 0x75, 0x5e, 0x5d, 0x52, 0x35, 0x28, + 0x64, 0x5c, 0x5c, 0x50, 0x4e, 0x4d, 0x64, 0xb2, + 0x9f, 0x57, 0x4e, 0x42, 0x44, 0x61, 0x5c, 0x67, + 0x64, 0x60, 0x75, 0x9d, 0xa9, 0x96, 0x9e, 0xc2, + 0x70, 0x39, 0x63, 0x9e, 0xb1, 0xb8, 0xc2, 0xec, + 0xfd, 0xbb, 0xdf, 0xf1, 0xc4, 0xdb, 0xd9, 0x83, + 0x94, 0xad, 0xd5, 0xd6, 0xb3, 0x91, 0x7e, 0x85, + 0xb1, 0xaf, 0xd7, 0xe1, 0x9e, 0x76, 0xad, 0xf3, + 0x50, 0x23, 0x34, 0x31, 0x46, 0x77, 0x6e, 0x6e, + 0x38, 0x3d, 0x1d, 0x17, 0x32, 0x3f, 0x39, 0x27, + 0x18, 0x2f, 0x51, 0x5e, 0x64, 0x92, 0xa9, 0x7c, + 0x60, 0x76, 0x83, 0x73, 0x54, 0x47, 0x58, 0x70, + 0x88, 0x75, 0x5d, 0x4e, 0x4d, 0x52, 0x56, 0x58, + 0x6c, 0x69, 0x66, 0x69, 0x6e, 0x6e, 0x68, 0x62, + 0x7d, 0x84, 0x7e, 0x6a, 0x5e, 0x5f, 0x62, 0x5f, + 0x4e, 0x50, 0x56, 0x60, 0x67, 0x62, 0x53, 0x46, + 0x36, 0x3f, 0x2d, 0x2b, 0x2c, 0x2e, 0x44, 0x47, + 0x50, 0x57, 0x54, 0x3d, 0x1e, 0x11, 0x1d, 0x2e, + 0x75, 0x59, 0x37, 0x27, 0x2d, 0x3a, 0x42, 0x43, + 0x35, 0x40, 0x49, 0x4b, 0x51, 0x5b, 0x4a, 0x28, + 0x24, 0x3a, 0x21, 0x34, 0x85, 0x91, 0x88, 0xba, + 0x4f, 0x47, 0x8d, 0xc8, 0x8d, 0x38, 0x2e, 0x48, + 0x32, 0x31, 0x27, 0x1a, 0x1d, 0x31, 0x41, 0x45, + 0x48, 0x3e, 0x2b, 0x18, 0x19, 0x38, 0x6c, 0x95, + 0x34, 0x3a, 0x27, 0x1e, 0x34, 0x3e, 0x34, 0x34, + 0x4a, 0x38, 0x29, 0x2b, 0x37, 0x36, 0x22, 0x0d, + 0x98, 0x66, 0x38, 0x2a, 0x2b, 0x34, 0x52, 0x75, + 0x66, 0x61, 0x57, 0x45, 0x29, 0x1b, 0x2f, 0x4f, + 0x2d, 0x2b, 0x41, 0x2b, 0x2e, 0x40, 0x15, 0x02, + 0xbc, 0xbb, 0xc6, 0x87, 0x2b, 0x77, 0xc0, 0xc4, + 0xc5, 0xc5, 0xba, 0xbb, 0xca, 0xbf, 0x87, 0xb3, + 0xce, 0xbf, 0xa6, 0xcb, 0xd3, 0xcb, 0xc3, 0xcd, + 0xcb, 0xcc, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd0, + 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd5, + 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xdc, 0x79, 0xc1, 0x76, 0x39, 0x9f, 0x63, 0x77, + 0xd4, 0xbf, 0xc5, 0xe3, 0xe4, 0xc4, 0xb2, 0xbb, + 0xa2, 0x6e, 0xb1, 0xe0, 0xe2, 0xcb, 0xd3, 0xd1, + 0xd7, 0xd4, 0xd2, 0xd4, 0xd5, 0xd3, 0xcc, 0xc6, + 0xc4, 0xab, 0xb7, 0xaf, 0xb5, 0xc3, 0xa0, 0x8e, + 0xa1, 0x6a, 0x51, 0x47, 0x58, 0x52, 0x2b, 0x3b, + 0x5b, 0x68, 0x39, 0x43, 0x6e, 0x50, 0x47, 0x72, + 0x6f, 0x72, 0x67, 0x64, 0x69, 0x57, 0x41, 0x42, + 0x48, 0x1a, 0x28, 0x2a, 0x1c, 0x12, 0x50, 0xfa, + 0xcd, 0x77, 0x6f, 0x8d, 0xa0, 0xae, 0xaf, 0xc7, + 0xe9, 0xce, 0xc0, 0xc0, 0xb1, 0x97, 0x88, 0x87, + 0xa2, 0xa5, 0xa9, 0x64, 0x46, 0x7e, 0x85, 0x69, + 0x41, 0x65, 0xae, 0xc4, 0xc7, 0xe6, 0xc1, 0x68, + 0xbf, 0x9b, 0x6b, 0x15, 0x31, 0x90, 0x94, 0x9b, + 0x87, 0x73, 0x84, 0x95, 0x69, 0x2f, 0x24, 0x32, + 0x3b, 0x47, 0x6e, 0x49, 0x86, 0xcf, 0x5d, 0x12, + 0x47, 0x26, 0x1d, 0x30, 0x42, 0x30, 0x20, 0x44, + 0x40, 0x59, 0x44, 0x1e, 0x37, 0x52, 0x4e, 0x63, + 0x75, 0x79, 0x77, 0x6a, 0x5b, 0x5d, 0x6f, 0x82, + 0x93, 0x80, 0x68, 0x5a, 0x5c, 0x67, 0x71, 0x76, + 0x81, 0x78, 0x6e, 0x6b, 0x6e, 0x70, 0x6f, 0x6c, + 0x61, 0x66, 0x5f, 0x4c, 0x44, 0x4e, 0x58, 0x5b, + 0x63, 0x65, 0x69, 0x6e, 0x6f, 0x68, 0x59, 0x4e, + 0x4c, 0x57, 0x33, 0x28, 0x34, 0x26, 0x22, 0x22, + 0x3b, 0x38, 0x35, 0x33, 0x30, 0x28, 0x1d, 0x14, + 0x3e, 0x41, 0x46, 0x49, 0x4a, 0x4b, 0x4e, 0x50, + 0x80, 0x76, 0x40, 0x21, 0x32, 0x31, 0x46, 0x87, + 0xed, 0xff, 0xff, 0xe6, 0x6d, 0x47, 0x94, 0xe0, + 0xd2, 0x86, 0x93, 0xd6, 0xbf, 0x73, 0x51, 0x51, + 0x37, 0x29, 0x20, 0x23, 0x24, 0x1f, 0x1f, 0x24, + 0x4a, 0x55, 0x51, 0x36, 0x1b, 0x19, 0x2b, 0x3c, + 0x34, 0x1a, 0x1d, 0x2b, 0x28, 0x30, 0x3b, 0x35, + 0x33, 0x30, 0x23, 0x13, 0x13, 0x39, 0x7b, 0xae, + 0x98, 0xcd, 0xdb, 0xbc, 0xbf, 0xd2, 0x9f, 0x45, + 0x24, 0x2f, 0x2e, 0x22, 0x20, 0x2d, 0x3a, 0x3e, + 0x30, 0x34, 0x52, 0x44, 0x48, 0x54, 0x22, 0x0a, + 0xc7, 0xc6, 0xc5, 0x80, 0x2f, 0x82, 0xcc, 0xd0, + 0xba, 0xc2, 0xc4, 0xc6, 0xcd, 0xc2, 0xa0, 0xa7, + 0xcb, 0xaf, 0xa1, 0xd5, 0xd5, 0xc8, 0xc5, 0xcd, + 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce, 0xce, + 0xcf, 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd3, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd1, 0x9c, 0xbc, 0x9b, 0x6b, 0xad, 0x69, 0xc7, + 0xbc, 0xc4, 0xc8, 0xcb, 0xd6, 0xdb, 0xc5, 0xa5, + 0x57, 0x81, 0xd1, 0xe6, 0xd7, 0xd3, 0xdc, 0xd3, + 0xe7, 0xd8, 0xca, 0xca, 0xd4, 0xd8, 0xcf, 0xc4, + 0xbe, 0xb7, 0xb6, 0xb0, 0xb5, 0xa5, 0x86, 0x93, + 0x7f, 0x6c, 0x5d, 0x50, 0x60, 0x5f, 0x38, 0x2e, + 0x65, 0x96, 0x55, 0x25, 0x61, 0x61, 0x46, 0x7d, + 0x53, 0x57, 0x5b, 0x56, 0x3b, 0x1e, 0x2a, 0x51, + 0x4e, 0x4f, 0x80, 0x8a, 0xa4, 0xb6, 0xa7, 0xe5, + 0xec, 0x80, 0x56, 0x6f, 0x74, 0x66, 0x6c, 0x87, + 0x8a, 0x97, 0xa9, 0x9d, 0x81, 0x84, 0x93, 0x8e, + 0x5e, 0x7c, 0x8d, 0x39, 0x0e, 0x42, 0x3e, 0x0f, + 0xab, 0xaf, 0x5a, 0x72, 0x97, 0x7e, 0x9d, 0x9a, + 0x9d, 0x73, 0xa5, 0xb7, 0xda, 0xdd, 0x84, 0x8c, + 0x7b, 0x50, 0x32, 0x29, 0x1f, 0x30, 0x76, 0xbe, + 0x71, 0x6c, 0x6e, 0x5e, 0x7e, 0x97, 0x60, 0x41, + 0x27, 0x3f, 0x64, 0x50, 0x39, 0x32, 0x38, 0x7a, + 0x81, 0x76, 0x3e, 0x1b, 0x4e, 0x65, 0x51, 0x77, + 0x76, 0x68, 0x59, 0x57, 0x62, 0x70, 0x77, 0x78, + 0x78, 0x79, 0x76, 0x6f, 0x67, 0x67, 0x70, 0x79, + 0x7b, 0x7a, 0x7a, 0x7f, 0x83, 0x7f, 0x75, 0x6c, + 0x76, 0x7e, 0x7a, 0x6a, 0x62, 0x6b, 0x74, 0x75, + 0x5e, 0x5b, 0x58, 0x56, 0x55, 0x53, 0x50, 0x4e, + 0x3b, 0x3f, 0x26, 0x2a, 0x35, 0x2f, 0x3f, 0x4d, + 0x4d, 0x38, 0x22, 0x1d, 0x27, 0x2d, 0x25, 0x1a, + 0x1d, 0x21, 0x31, 0x51, 0x71, 0x7d, 0x71, 0x61, + 0x6f, 0x60, 0x2c, 0x1f, 0x3e, 0x3c, 0x4a, 0x8d, + 0xff, 0x87, 0x87, 0xbc, 0xae, 0xb3, 0x86, 0x00, + 0x2e, 0x35, 0x22, 0x18, 0x1f, 0x0f, 0x11, 0x3d, + 0x2b, 0x25, 0x2d, 0x3a, 0x2e, 0x1a, 0x26, 0x44, + 0x26, 0x32, 0x4e, 0x5c, 0x40, 0x15, 0x0f, 0x26, + 0x3a, 0x1c, 0x1d, 0x2f, 0x28, 0x20, 0x2b, 0x33, + 0x5b, 0x42, 0x24, 0x13, 0x18, 0x29, 0x39, 0x41, + 0x31, 0x9c, 0xbd, 0x6f, 0x45, 0x6e, 0x79, 0x4f, + 0x39, 0x39, 0x30, 0x33, 0x5d, 0x8a, 0x82, 0x5c, + 0x4c, 0x52, 0x72, 0x61, 0x5e, 0x61, 0x24, 0x06, + 0xbc, 0xc1, 0xbc, 0x76, 0x2f, 0x87, 0xc8, 0xc7, + 0xc4, 0xb9, 0xb8, 0xc3, 0xd2, 0xd1, 0xaa, 0x55, + 0x36, 0x85, 0xb4, 0xd2, 0xbf, 0xc0, 0xc5, 0xc9, + 0xc8, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, + 0xcd, 0xcd, 0xce, 0xcf, 0xd0, 0xd0, 0xd1, 0xd1, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd8, 0xc9, 0x79, 0x6e, 0x66, 0x64, 0x41, 0xba, + 0xd8, 0xdc, 0xd0, 0xbe, 0xc3, 0xd2, 0xc4, 0xa4, + 0x50, 0xb6, 0xdf, 0xd3, 0xc8, 0xd2, 0xcf, 0xcb, + 0xcc, 0xd4, 0xda, 0xd7, 0xcd, 0xc7, 0xc8, 0xcc, + 0xd6, 0xbf, 0x93, 0x8f, 0x82, 0x59, 0x64, 0x89, + 0x6b, 0x6f, 0x4b, 0x3f, 0x49, 0x46, 0x3d, 0x26, + 0x47, 0x46, 0x67, 0x45, 0x3e, 0x56, 0x3d, 0x53, + 0x5f, 0x65, 0x62, 0x56, 0x61, 0x8c, 0xac, 0xae, + 0x9d, 0x95, 0xad, 0xaf, 0xb0, 0x9d, 0x89, 0xc1, + 0xff, 0xbc, 0xa4, 0xcc, 0xc6, 0x9c, 0x8f, 0x8a, + 0xaa, 0xa8, 0xd2, 0xf2, 0xdd, 0xca, 0xc4, 0xb1, + 0xb9, 0xb1, 0xcb, 0xac, 0x8d, 0xa2, 0xa6, 0xa6, + 0xa7, 0xff, 0xe4, 0x7f, 0x2e, 0x45, 0xb5, 0xaa, + 0x90, 0x66, 0xa9, 0x6b, 0x30, 0x89, 0x8e, 0x5f, + 0x29, 0x18, 0x20, 0x4e, 0x74, 0x70, 0x60, 0x60, + 0x2a, 0x13, 0x1e, 0x1f, 0x50, 0x91, 0x6d, 0x33, + 0x3d, 0x27, 0x25, 0x1e, 0x39, 0x47, 0x24, 0x2e, + 0x36, 0x50, 0x77, 0x72, 0x58, 0x6b, 0x85, 0x81, + 0x6f, 0x70, 0x6f, 0x6a, 0x65, 0x67, 0x70, 0x78, + 0x76, 0x7b, 0x7e, 0x78, 0x6c, 0x63, 0x61, 0x63, + 0x69, 0x6c, 0x73, 0x7e, 0x84, 0x81, 0x74, 0x69, + 0x6e, 0x79, 0x7a, 0x6c, 0x63, 0x65, 0x65, 0x61, + 0x47, 0x49, 0x4b, 0x4d, 0x50, 0x55, 0x5b, 0x60, + 0x4a, 0x48, 0x3b, 0x3b, 0x39, 0x48, 0x63, 0x53, + 0x24, 0x26, 0x23, 0x1d, 0x24, 0x48, 0x80, 0xac, + 0x68, 0x3e, 0x19, 0x20, 0x42, 0x4f, 0x35, 0x12, + 0x28, 0x26, 0x23, 0x2a, 0x35, 0x2d, 0x29, 0x38, + 0x66, 0x35, 0x17, 0x2b, 0x4d, 0x51, 0x34, 0x16, + 0x0d, 0x3c, 0x36, 0x13, 0x17, 0x24, 0x31, 0x4d, + 0x58, 0x49, 0x47, 0x4d, 0x3d, 0x23, 0x26, 0x3d, + 0x37, 0x33, 0x34, 0x30, 0x20, 0x19, 0x32, 0x56, + 0x28, 0x21, 0x1a, 0x25, 0x30, 0x21, 0x22, 0x42, + 0x28, 0x29, 0x2d, 0x37, 0x3d, 0x37, 0x26, 0x16, + 0x44, 0x30, 0x28, 0x43, 0x68, 0x69, 0x3c, 0x0c, + 0x3b, 0x36, 0x23, 0x19, 0x35, 0x54, 0x43, 0x17, + 0x37, 0x3d, 0x5d, 0x4e, 0x4d, 0x50, 0x15, 0x00, + 0xb4, 0xbe, 0xb8, 0x72, 0x36, 0x8f, 0xc6, 0xc0, + 0xc0, 0xc4, 0xc9, 0xbe, 0xb1, 0xba, 0xd3, 0x80, + 0x63, 0xcb, 0xd3, 0xc5, 0xc5, 0xce, 0xc0, 0xc3, + 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xca, 0xcb, + 0xcb, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xcf, 0xd0, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, + 0xde, 0xe0, 0x44, 0x3c, 0x75, 0x6d, 0x8c, 0xdc, + 0xf0, 0xdc, 0xc8, 0xc1, 0xc2, 0xc5, 0xcc, 0xd4, + 0x7e, 0xda, 0xd1, 0xca, 0xcf, 0xdc, 0xd2, 0xda, + 0xd2, 0xda, 0xe4, 0xea, 0xea, 0xe3, 0xda, 0xd3, + 0xd0, 0x95, 0x49, 0x4c, 0x5d, 0x67, 0x86, 0x7d, + 0x5d, 0x7e, 0x83, 0xa5, 0xb7, 0xae, 0xce, 0xe1, + 0x6a, 0x7b, 0x9d, 0x53, 0x58, 0xb1, 0xb6, 0xd5, + 0xc8, 0xbd, 0xc2, 0xcb, 0xcd, 0xd9, 0xd9, 0xc3, + 0xc8, 0xcd, 0xc2, 0xc9, 0xc5, 0x9b, 0x8a, 0x9c, + 0x86, 0x6d, 0x62, 0x85, 0x80, 0x69, 0x6d, 0x54, + 0xa6, 0xab, 0xc0, 0xa5, 0x6e, 0x86, 0xc2, 0xc8, + 0x77, 0x67, 0x79, 0x61, 0x58, 0x87, 0x9d, 0xa4, + 0x75, 0x6b, 0x82, 0xac, 0xb3, 0x72, 0x43, 0x68, + 0x58, 0x19, 0x3d, 0x3b, 0x21, 0x33, 0x2b, 0x31, + 0x47, 0x42, 0x36, 0x35, 0x36, 0x20, 0x16, 0x2a, + 0x33, 0x5d, 0xec, 0xff, 0xe9, 0xd7, 0x6a, 0x42, + 0x21, 0x26, 0x41, 0x62, 0x79, 0x5f, 0x30, 0x30, + 0x45, 0x3b, 0x2a, 0x4f, 0x74, 0x7e, 0x84, 0x64, + 0x81, 0x87, 0x89, 0x81, 0x73, 0x6a, 0x6c, 0x71, + 0x7d, 0x75, 0x6d, 0x6b, 0x6e, 0x6f, 0x6a, 0x64, + 0x70, 0x6e, 0x6d, 0x73, 0x7b, 0x7e, 0x7b, 0x76, + 0x6e, 0x7a, 0x7d, 0x6f, 0x64, 0x62, 0x5f, 0x58, + 0x4d, 0x55, 0x5e, 0x62, 0x60, 0x5e, 0x5e, 0x60, + 0x4c, 0x4d, 0x40, 0x38, 0x38, 0x58, 0x6a, 0x36, + 0x32, 0x33, 0x35, 0x39, 0x43, 0x56, 0x6c, 0x7c, + 0x4a, 0x4d, 0x4a, 0x3a, 0x26, 0x1c, 0x1f, 0x28, + 0x27, 0x22, 0x2a, 0x28, 0x13, 0x13, 0x1d, 0x16, + 0x3b, 0x3d, 0x1b, 0x1e, 0x4b, 0x3c, 0x1a, 0x2e, + 0x3d, 0x25, 0x26, 0x23, 0x0d, 0x18, 0x28, 0x17, + 0x20, 0x1f, 0x34, 0x5e, 0x78, 0x6d, 0x4c, 0x34, + 0x17, 0x33, 0x3a, 0x2b, 0x39, 0x67, 0x83, 0x80, + 0x2a, 0x31, 0x28, 0x24, 0x2b, 0x20, 0x20, 0x3b, + 0x61, 0x6c, 0x6f, 0x5d, 0x42, 0x36, 0x40, 0x51, + 0x2b, 0x36, 0x43, 0x42, 0x30, 0x20, 0x23, 0x2f, + 0x33, 0x3a, 0x32, 0x1c, 0x0e, 0x12, 0x17, 0x17, + 0x1d, 0x22, 0x43, 0x38, 0x3f, 0x4f, 0x1f, 0x08, + 0xc1, 0xc8, 0xb3, 0x65, 0x30, 0x94, 0xd1, 0xce, + 0xb5, 0xbd, 0xbe, 0xc3, 0xcb, 0xc1, 0xd3, 0x6e, + 0x74, 0xd1, 0xcc, 0xbe, 0xbf, 0xbe, 0xb8, 0xd7, + 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, + 0xca, 0xca, 0xcb, 0xcc, 0xcc, 0xcd, 0xce, 0xce, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xcb, 0xe6, 0x6e, 0x45, 0x7c, 0x7a, 0xb3, 0x9e, + 0xd2, 0xd5, 0xd4, 0xce, 0xc6, 0xc3, 0xc6, 0xcb, + 0x9a, 0xef, 0xe1, 0xee, 0xe5, 0xf4, 0xee, 0xeb, + 0xee, 0xc2, 0x9a, 0x9f, 0xc6, 0xe2, 0xdb, 0xc5, + 0x69, 0x2d, 0x53, 0xa7, 0x98, 0x7c, 0xb2, 0xea, + 0xdc, 0xd7, 0xb6, 0xa4, 0xad, 0xb1, 0xab, 0xa3, + 0x8b, 0xbd, 0x9b, 0x43, 0x71, 0xa7, 0x68, 0x4f, + 0x7d, 0x92, 0xd4, 0xf4, 0xc3, 0x92, 0x91, 0x9a, + 0x94, 0xb5, 0x5f, 0x48, 0x89, 0xc4, 0xcf, 0x76, + 0xa6, 0xcb, 0xd8, 0xea, 0xd0, 0xb0, 0xa1, 0x59, + 0xa5, 0x86, 0x8e, 0x9b, 0xa3, 0xc6, 0xa7, 0x3b, + 0x4f, 0x1b, 0x30, 0x42, 0x38, 0x32, 0x28, 0x38, + 0x46, 0x39, 0x33, 0x35, 0x3e, 0x2a, 0x0b, 0x16, + 0x22, 0x4f, 0x44, 0x11, 0x19, 0x32, 0x30, 0x3e, + 0x21, 0x29, 0x21, 0x26, 0x37, 0x2a, 0x20, 0x35, + 0x3c, 0x24, 0x7f, 0xe9, 0xff, 0x95, 0x11, 0x1d, + 0x53, 0x6e, 0x4e, 0x2f, 0x3f, 0x54, 0x47, 0x1f, + 0xb2, 0xb8, 0x49, 0x4a, 0x81, 0x6a, 0x7c, 0x90, + 0x87, 0x81, 0x79, 0x76, 0x76, 0x72, 0x6a, 0x63, + 0x70, 0x68, 0x5f, 0x5e, 0x65, 0x6b, 0x6c, 0x6a, + 0x78, 0x71, 0x69, 0x68, 0x6e, 0x74, 0x75, 0x73, + 0x71, 0x7a, 0x78, 0x68, 0x5d, 0x5f, 0x61, 0x5d, + 0x58, 0x5e, 0x63, 0x5e, 0x54, 0x4b, 0x49, 0x4b, + 0x5b, 0x54, 0x38, 0x30, 0x31, 0x36, 0x42, 0x2d, + 0x4a, 0x3c, 0x34, 0x41, 0x58, 0x63, 0x58, 0x49, + 0x0b, 0x3e, 0x6b, 0x67, 0x44, 0x3d, 0x66, 0x96, + 0x3f, 0x27, 0x26, 0x30, 0x2f, 0x37, 0x3b, 0x2d, + 0x34, 0x2a, 0x24, 0x2d, 0x32, 0x29, 0x25, 0x2c, + 0x34, 0x24, 0x35, 0x3a, 0x19, 0x1b, 0x40, 0x4e, + 0x17, 0x25, 0x3c, 0x59, 0x71, 0x69, 0x38, 0x05, + 0x2b, 0x4c, 0x58, 0x4e, 0x5a, 0x72, 0x63, 0x38, + 0x5d, 0x5f, 0x6c, 0x66, 0x53, 0x60, 0x76, 0x71, + 0x67, 0x54, 0x42, 0x44, 0x53, 0x58, 0x4b, 0x3a, + 0x1d, 0x3c, 0x3e, 0x1f, 0x15, 0x2a, 0x2b, 0x14, + 0x2d, 0x2b, 0x28, 0x1f, 0x0c, 0x06, 0x21, 0x44, + 0x29, 0x29, 0x42, 0x32, 0x3a, 0x51, 0x2a, 0x19, + 0xba, 0xb6, 0x8f, 0x35, 0x04, 0x75, 0xc0, 0xc7, + 0xb8, 0xc2, 0xb5, 0xb9, 0xcb, 0xb5, 0xd0, 0x80, + 0x8a, 0xc6, 0xbe, 0xc1, 0xc7, 0xce, 0xc0, 0xc1, + 0xc4, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, + 0xc9, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xcd, 0xce, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd3, 0xf7, 0xb4, 0x57, 0x73, 0x9b, 0xff, 0xc5, + 0xb1, 0xe5, 0xfb, 0xdb, 0xc0, 0xbc, 0xa3, 0x7a, + 0x4c, 0xac, 0xaa, 0xa7, 0x65, 0x62, 0x52, 0x2c, + 0x5d, 0x5f, 0x5a, 0x4d, 0x44, 0x50, 0x6e, 0x89, + 0x9d, 0xaa, 0xe1, 0xba, 0x92, 0xd2, 0xc3, 0x59, + 0x73, 0x41, 0x45, 0x7a, 0xc3, 0xd5, 0xae, 0xb4, + 0x91, 0xba, 0xb3, 0xa8, 0xb5, 0xbb, 0xbd, 0xba, + 0x9a, 0x88, 0x87, 0x7f, 0x72, 0x8a, 0x99, 0x7f, + 0x7d, 0x9e, 0x65, 0x93, 0xa6, 0x77, 0xa1, 0x99, + 0x79, 0xb0, 0xb0, 0xaa, 0x9a, 0xab, 0xce, 0x91, + 0x8c, 0x59, 0x67, 0x69, 0x26, 0x27, 0x7e, 0xb4, + 0x72, 0x39, 0x39, 0x33, 0x2b, 0x38, 0x31, 0x35, + 0x16, 0x1d, 0x2e, 0x45, 0x17, 0x6e, 0xf3, 0x82, + 0x62, 0x50, 0x38, 0x2b, 0x18, 0x1f, 0x38, 0x23, + 0x2d, 0x32, 0x20, 0x1e, 0x35, 0x2e, 0x24, 0x3b, + 0x3d, 0x59, 0x26, 0x52, 0x93, 0x61, 0x36, 0x23, + 0x26, 0x51, 0x40, 0x3d, 0x44, 0x37, 0x2e, 0x0c, + 0x73, 0xae, 0x49, 0x32, 0x55, 0x62, 0xa4, 0x9a, + 0x87, 0x81, 0x7c, 0x7b, 0x7e, 0x81, 0x80, 0x7e, + 0x7e, 0x81, 0x80, 0x79, 0x70, 0x6b, 0x6f, 0x75, + 0x6a, 0x63, 0x5b, 0x5a, 0x5d, 0x5e, 0x5b, 0x57, + 0x73, 0x79, 0x71, 0x5e, 0x55, 0x5d, 0x66, 0x68, + 0x64, 0x66, 0x63, 0x59, 0x4f, 0x4c, 0x54, 0x5e, + 0x62, 0x53, 0x35, 0x4a, 0x58, 0x43, 0x62, 0x9a, + 0xae, 0x99, 0x73, 0x47, 0x2b, 0x2e, 0x4a, 0x65, + 0x5c, 0x4f, 0x38, 0x1e, 0x0f, 0x14, 0x28, 0x39, + 0x51, 0x51, 0x52, 0x44, 0x21, 0x11, 0x32, 0x5e, + 0x6a, 0x46, 0x26, 0x20, 0x23, 0x21, 0x1f, 0x24, + 0x30, 0x34, 0x1b, 0x1b, 0x44, 0x46, 0x24, 0x1a, + 0x26, 0x36, 0x35, 0x26, 0x28, 0x3a, 0x39, 0x26, + 0x36, 0x2a, 0x1f, 0x25, 0x39, 0x46, 0x40, 0x31, + 0x16, 0x0f, 0x3c, 0x45, 0x24, 0x54, 0x8a, 0x69, + 0x2d, 0x31, 0x33, 0x32, 0x33, 0x3e, 0x52, 0x63, + 0x4d, 0x34, 0x1a, 0x0f, 0x17, 0x2a, 0x3f, 0x4d, + 0x4b, 0x2c, 0x19, 0x1e, 0x1c, 0x15, 0x2c, 0x51, + 0x39, 0x32, 0x41, 0x27, 0x28, 0x3b, 0x15, 0x06, + 0xe4, 0xc7, 0x76, 0x25, 0x2f, 0x85, 0xc4, 0xcb, + 0xc7, 0xbe, 0xc9, 0xc2, 0xad, 0xb6, 0xa8, 0x6d, + 0x8d, 0xcb, 0xce, 0xc8, 0xd0, 0xc2, 0xbd, 0xc1, + 0xbd, 0xc8, 0xc8, 0xc8, 0xcd, 0xc4, 0xc0, 0xd0, + 0xbf, 0xc9, 0xbf, 0xc2, 0xd6, 0xcb, 0xba, 0xc8, + 0xce, 0xc8, 0xd1, 0xc3, 0xc8, 0xd2, 0xc5, 0xd9, + 0xd4, 0xd2, 0xd9, 0xd4, 0xc7, 0xd2, 0xda, 0xc9, + 0xc6, 0xd7, 0xd1, 0xdd, 0xd6, 0xce, 0xe6, 0xdf, + 0xe9, 0xdd, 0xc0, 0x8b, 0x58, 0x56, 0x83, 0xa9, + 0x1c, 0x0d, 0x17, 0x3a, 0x4c, 0x53, 0x74, 0xa2, + 0x9b, 0x9d, 0x83, 0x9a, 0xd5, 0xc8, 0xb4, 0xe1, + 0xcc, 0xcb, 0xbf, 0xb7, 0xc4, 0xc3, 0x8c, 0x47, + 0x92, 0xaa, 0xb2, 0x98, 0x6e, 0x4d, 0x36, 0x27, + 0xa8, 0x9a, 0xbb, 0xb0, 0x58, 0x4a, 0xa1, 0xe2, + 0xe9, 0xb4, 0x7b, 0x7d, 0x78, 0x9a, 0xbc, 0x65, + 0x90, 0xb3, 0xaf, 0x9c, 0x9a, 0x8e, 0x95, 0xbf, + 0xa4, 0xa9, 0x8a, 0x71, 0x81, 0x79, 0x40, 0x0e, + 0x28, 0x13, 0x36, 0x76, 0x67, 0x19, 0x06, 0x32, + 0x18, 0x8a, 0xa2, 0x3c, 0x08, 0x3a, 0x4c, 0x1c, + 0x40, 0x18, 0x4e, 0xbd, 0xaf, 0x30, 0x00, 0x35, + 0x2f, 0x4c, 0x2a, 0x31, 0x32, 0x4e, 0xcd, 0xff, + 0xb0, 0x2d, 0x36, 0x42, 0x2f, 0x36, 0x34, 0x66, + 0x79, 0x26, 0x1a, 0x37, 0x2a, 0x27, 0x2c, 0x10, + 0x39, 0x37, 0x2a, 0x26, 0x45, 0x67, 0x5b, 0x34, + 0x36, 0x29, 0x3c, 0x46, 0x32, 0x38, 0x41, 0x28, + 0x2a, 0x37, 0x42, 0x39, 0x65, 0xa0, 0x91, 0x77, + 0x78, 0x7a, 0x7a, 0x75, 0x71, 0x73, 0x7c, 0x84, + 0x87, 0x80, 0x77, 0x75, 0x78, 0x7b, 0x7a, 0x78, + 0x8b, 0x8b, 0x89, 0x86, 0x80, 0x78, 0x71, 0x6c, + 0x77, 0x75, 0x71, 0x69, 0x61, 0x5c, 0x5b, 0x5d, + 0x70, 0x68, 0x5f, 0x5c, 0x5e, 0x61, 0x60, 0x5e, + 0x42, 0x46, 0x44, 0x37, 0x4f, 0x96, 0xa2, 0x65, + 0x18, 0x43, 0x60, 0x47, 0x14, 0x06, 0x34, 0x6a, + 0x59, 0x52, 0x35, 0x17, 0x1f, 0x3f, 0x42, 0x2b, + 0x55, 0x3d, 0x2c, 0x2b, 0x28, 0x21, 0x24, 0x31, + 0x31, 0x2e, 0x32, 0x3e, 0x47, 0x3f, 0x24, 0x0d, + 0x16, 0x29, 0x2c, 0x32, 0x3a, 0x24, 0x11, 0x21, + 0x5a, 0x38, 0x37, 0x37, 0x14, 0x0d, 0x2b, 0x3b, + 0x20, 0x22, 0x15, 0x1e, 0x3b, 0x30, 0x17, 0x1c, + 0x1c, 0x27, 0x24, 0x32, 0x4d, 0x4a, 0x4a, 0x69, + 0x83, 0x7d, 0x4e, 0x3f, 0x54, 0x34, 0x1c, 0x46, + 0x47, 0x3e, 0x37, 0x34, 0x2c, 0x25, 0x2c, 0x3a, + 0x2b, 0x1d, 0x16, 0x19, 0x1b, 0x29, 0x57, 0x88, + 0x5d, 0x4a, 0x61, 0x64, 0x6d, 0x64, 0x1f, 0x00, + 0xc9, 0xbf, 0x7a, 0x26, 0x30, 0x8a, 0xbe, 0xb2, + 0x9f, 0xa0, 0xb8, 0xc0, 0xb7, 0xc8, 0xbd, 0x83, + 0x90, 0xc8, 0xc4, 0xb7, 0xbc, 0xb6, 0xbe, 0xca, + 0xc4, 0xb6, 0xc5, 0xcc, 0xb8, 0xbb, 0xcd, 0xc9, + 0xc6, 0xc3, 0xd6, 0xd7, 0xb6, 0xb3, 0xc9, 0xcd, + 0xde, 0xe8, 0xd5, 0xcd, 0xde, 0xdb, 0xce, 0xca, + 0xde, 0xd9, 0xe2, 0xe5, 0xda, 0xe1, 0xec, 0xe6, + 0xcd, 0xf4, 0xde, 0xa4, 0xa4, 0xaf, 0x9b, 0x96, + 0x90, 0x43, 0x56, 0x68, 0x3c, 0x6d, 0xaf, 0x81, + 0xbb, 0xc2, 0xe1, 0xf2, 0xbf, 0x77, 0x72, 0x9f, + 0x6c, 0xac, 0x87, 0x5e, 0x79, 0x4e, 0x18, 0x43, + 0x6e, 0x5f, 0x61, 0x71, 0x75, 0x78, 0x9b, 0xc9, + 0xff, 0xbc, 0x87, 0xad, 0xde, 0xc8, 0x7e, 0x46, + 0x6a, 0x76, 0x82, 0x9d, 0xc3, 0xc5, 0x9e, 0x7d, + 0x78, 0xbb, 0xd7, 0xd4, 0x92, 0x67, 0x7b, 0x56, + 0x27, 0x7b, 0xb5, 0xc0, 0xb4, 0x89, 0x76, 0x94, + 0x95, 0x5b, 0xb2, 0xdd, 0x6b, 0x5b, 0x92, 0x67, + 0x7b, 0x54, 0x35, 0x30, 0x2b, 0x23, 0x31, 0x4d, + 0x3a, 0x64, 0x61, 0x2a, 0x16, 0x38, 0x46, 0x30, + 0x8a, 0xd0, 0xd3, 0x6e, 0x15, 0x14, 0x35, 0x41, + 0x4e, 0x39, 0x32, 0x7f, 0xc8, 0xd5, 0xce, 0xae, + 0x3d, 0x1e, 0x55, 0x51, 0x43, 0x60, 0x3e, 0x23, + 0x2f, 0x25, 0x3e, 0x51, 0x37, 0x2b, 0x4c, 0x6c, + 0x69, 0x5c, 0x66, 0x81, 0x7f, 0x58, 0x39, 0x34, + 0x17, 0x54, 0x6a, 0x57, 0x6c, 0xb0, 0xe9, 0xff, + 0x63, 0x3a, 0x40, 0x31, 0x2f, 0x73, 0x99, 0x8c, + 0x77, 0x6f, 0x69, 0x6e, 0x77, 0x79, 0x71, 0x68, + 0x64, 0x65, 0x69, 0x72, 0x7b, 0x7d, 0x78, 0x72, + 0x7c, 0x7d, 0x7d, 0x7c, 0x78, 0x73, 0x6d, 0x69, + 0x80, 0x79, 0x6c, 0x5f, 0x58, 0x58, 0x5f, 0x64, + 0x5d, 0x56, 0x4e, 0x4c, 0x50, 0x53, 0x53, 0x51, + 0x56, 0x40, 0x35, 0x3e, 0x55, 0x66, 0x51, 0x27, + 0x16, 0x2a, 0x3d, 0x3d, 0x2e, 0x22, 0x25, 0x2e, + 0x2e, 0x31, 0x3a, 0x41, 0x3e, 0x33, 0x2e, 0x31, + 0x1d, 0x56, 0x7a, 0x5d, 0x28, 0x14, 0x24, 0x38, + 0x2a, 0x3e, 0x51, 0x51, 0x40, 0x2d, 0x26, 0x26, + 0x2f, 0x43, 0x2b, 0x0c, 0x1d, 0x3a, 0x48, 0x56, + 0x55, 0x66, 0x3b, 0x1d, 0x3b, 0x35, 0x17, 0x22, + 0x20, 0x32, 0x26, 0x1c, 0x33, 0x42, 0x4b, 0x62, + 0x33, 0x20, 0x12, 0x34, 0x5d, 0x43, 0x17, 0x17, + 0x18, 0x30, 0x1d, 0x0c, 0x3b, 0x6b, 0x62, 0x47, + 0x4b, 0x41, 0x31, 0x1d, 0x0c, 0x0c, 0x20, 0x37, + 0x3a, 0x29, 0x1e, 0x1d, 0x19, 0x21, 0x46, 0x70, + 0x5a, 0x46, 0x59, 0x58, 0x62, 0x5f, 0x23, 0x0c, + 0xb3, 0xbe, 0x83, 0x2b, 0x37, 0x9a, 0xc5, 0xa6, + 0xbb, 0xbc, 0xd3, 0xd5, 0xc1, 0xc3, 0xa9, 0x66, + 0xa2, 0xcb, 0xc0, 0xb8, 0xc5, 0xc3, 0xc3, 0xbf, + 0xc8, 0xc0, 0xb7, 0xbf, 0xd3, 0xde, 0xde, 0xdf, + 0xe3, 0xe5, 0xd9, 0xcf, 0xd8, 0xde, 0xda, 0xd8, + 0xa7, 0xd2, 0xcc, 0xd3, 0xd6, 0xc8, 0xd4, 0xd0, + 0x94, 0x8d, 0x7e, 0x75, 0x6e, 0x5d, 0x5b, 0x71, + 0x73, 0x70, 0x74, 0x6a, 0x81, 0x7d, 0x56, 0x78, + 0x99, 0x7e, 0xb3, 0xc5, 0x83, 0x91, 0xc0, 0xa0, + 0xbc, 0xd2, 0xc1, 0x7b, 0x3f, 0x49, 0x8b, 0xc2, + 0xa0, 0xa0, 0xaa, 0x8d, 0x6d, 0x9f, 0xd7, 0xca, + 0xfc, 0x9f, 0x58, 0x67, 0x96, 0x9c, 0x7b, 0x5f, + 0x1e, 0x7d, 0xc0, 0xb1, 0x96, 0x9c, 0x9d, 0x8a, + 0x95, 0xc6, 0xaf, 0x9d, 0xd3, 0xd8, 0x9c, 0x81, + 0xa8, 0xbd, 0x86, 0x87, 0xb0, 0xc5, 0xda, 0xc1, + 0x96, 0xb3, 0xb6, 0xba, 0xcc, 0xb5, 0x90, 0x91, + 0x5a, 0x3a, 0x1f, 0x29, 0x4f, 0x65, 0x5b, 0x49, + 0x39, 0x43, 0x45, 0x46, 0x59, 0x6b, 0x59, 0x35, + 0x52, 0x46, 0x44, 0x4f, 0x55, 0x44, 0x27, 0x12, + 0x0a, 0x36, 0x35, 0x10, 0x23, 0x66, 0x71, 0x45, + 0x5a, 0x53, 0x57, 0x3b, 0x2f, 0x3e, 0x3d, 0x4d, + 0x41, 0x1d, 0x4a, 0x5f, 0x4f, 0x46, 0x32, 0x3e, + 0x27, 0x24, 0x22, 0x3b, 0x57, 0x41, 0x1f, 0x1e, + 0x2a, 0x1a, 0x1a, 0x27, 0x20, 0x10, 0x1b, 0x38, + 0x27, 0x31, 0x20, 0x44, 0x93, 0x87, 0x4d, 0x4d, + 0x34, 0x2b, 0x22, 0x23, 0x57, 0x7f, 0x73, 0x7f, + 0x78, 0x7d, 0x82, 0x83, 0x7f, 0x79, 0x73, 0x71, + 0x78, 0x70, 0x67, 0x64, 0x68, 0x6c, 0x6d, 0x6c, + 0x67, 0x6a, 0x6e, 0x71, 0x72, 0x71, 0x6e, 0x6c, + 0x7e, 0x79, 0x72, 0x6b, 0x65, 0x5f, 0x5b, 0x59, + 0x63, 0x5d, 0x57, 0x56, 0x59, 0x5c, 0x5a, 0x57, + 0x52, 0x40, 0x31, 0x3e, 0x53, 0x4b, 0x3b, 0x3c, + 0x53, 0x54, 0x55, 0x54, 0x4d, 0x40, 0x31, 0x27, + 0x4f, 0x4c, 0x5c, 0x6d, 0x56, 0x2d, 0x2b, 0x47, + 0x5e, 0x39, 0x1d, 0x26, 0x3c, 0x3d, 0x25, 0x0e, + 0x39, 0x4a, 0x5a, 0x58, 0x45, 0x34, 0x2e, 0x30, + 0x3b, 0x23, 0x10, 0x2b, 0x4e, 0x3f, 0x36, 0x57, + 0x5c, 0x42, 0x30, 0x2b, 0x29, 0x2d, 0x2f, 0x25, + 0x0a, 0x3d, 0x41, 0x26, 0x2b, 0x36, 0x36, 0x3d, + 0x36, 0x2b, 0x31, 0x51, 0x4a, 0x18, 0x38, 0xa5, + 0xa2, 0xb2, 0xd0, 0xc4, 0x89, 0x77, 0x9d, 0xbe, + 0x21, 0x1e, 0x1c, 0x23, 0x3b, 0x5c, 0x76, 0x82, + 0x58, 0x45, 0x37, 0x33, 0x2c, 0x2b, 0x43, 0x65, + 0x85, 0x6a, 0x6f, 0x5f, 0x5c, 0x56, 0x21, 0x11, + 0x9e, 0xb1, 0x7a, 0x21, 0x33, 0xa1, 0xd2, 0xb0, + 0xa8, 0xad, 0xca, 0xd3, 0xc4, 0xc8, 0xaf, 0x6c, + 0x95, 0xc4, 0xc4, 0xbd, 0xbf, 0xbe, 0xc9, 0xcb, + 0xd0, 0xd7, 0xc5, 0xb9, 0xbb, 0xa0, 0x79, 0x6e, + 0x5b, 0x31, 0x5a, 0x95, 0x86, 0x6f, 0x64, 0x42, + 0x1d, 0x31, 0x2e, 0x23, 0x19, 0x3b, 0x7a, 0x88, + 0x89, 0x79, 0xad, 0xcb, 0x94, 0x85, 0xaf, 0xbc, + 0xc1, 0x98, 0xb6, 0xe2, 0xd1, 0x97, 0x84, 0xb7, + 0xcb, 0xa9, 0x6a, 0x71, 0xc6, 0xe5, 0xc8, 0xbd, + 0x82, 0x65, 0x6d, 0xaf, 0xee, 0xec, 0xb5, 0x83, + 0x7b, 0x38, 0x44, 0x6f, 0x86, 0xc4, 0xc7, 0x63, + 0x73, 0xa2, 0xb5, 0x94, 0x79, 0x8f, 0xbb, 0xd6, + 0xff, 0xac, 0x6f, 0x84, 0x9e, 0x9c, 0xb0, 0xdb, + 0xd5, 0xbc, 0x77, 0x60, 0x97, 0xae, 0x84, 0x62, + 0x73, 0xae, 0x74, 0x58, 0x6e, 0x66, 0x79, 0x87, + 0x61, 0x89, 0x82, 0x5e, 0x4d, 0x49, 0x70, 0xb8, + 0xc0, 0x5e, 0x41, 0x81, 0x89, 0x43, 0x39, 0x76, + 0x3a, 0x4e, 0x56, 0x51, 0x58, 0x62, 0x4d, 0x28, + 0x6c, 0x41, 0x23, 0x29, 0x34, 0x31, 0x32, 0x3c, + 0x2c, 0x46, 0x5a, 0x52, 0x38, 0x27, 0x28, 0x2f, + 0x34, 0x47, 0x78, 0x52, 0x59, 0x8b, 0x62, 0x52, + 0x4a, 0x41, 0x30, 0x25, 0x69, 0xc8, 0xb5, 0x64, + 0xb0, 0xa3, 0x5a, 0x28, 0x33, 0x23, 0x16, 0x3d, + 0x4e, 0x5b, 0x53, 0x38, 0x32, 0x41, 0x40, 0x2d, + 0x4a, 0x5f, 0x32, 0x0f, 0x26, 0x22, 0x28, 0x66, + 0x8a, 0x79, 0x8d, 0x6e, 0x40, 0x4f, 0x5b, 0x52, + 0x78, 0x80, 0x87, 0x83, 0x77, 0x6f, 0x6f, 0x73, + 0x6f, 0x6e, 0x6e, 0x72, 0x76, 0x74, 0x6c, 0x64, + 0x88, 0x89, 0x8a, 0x8a, 0x87, 0x81, 0x7c, 0x79, + 0x75, 0x70, 0x6b, 0x6a, 0x6f, 0x73, 0x73, 0x72, + 0x6b, 0x65, 0x5f, 0x5d, 0x5e, 0x5d, 0x59, 0x54, + 0x43, 0x40, 0x2b, 0x2d, 0x45, 0x3f, 0x2e, 0x38, + 0x47, 0x49, 0x45, 0x38, 0x29, 0x27, 0x34, 0x41, + 0x4d, 0x3f, 0x38, 0x38, 0x30, 0x2a, 0x3e, 0x5d, + 0x6c, 0x1c, 0x03, 0x3c, 0x52, 0x29, 0x1e, 0x42, + 0x27, 0x23, 0x26, 0x36, 0x49, 0x4e, 0x42, 0x33, + 0x0b, 0x28, 0x18, 0x0c, 0x43, 0x7c, 0x7b, 0x67, + 0x5d, 0x2d, 0x47, 0x6d, 0x42, 0x1b, 0x2b, 0x3a, + 0x59, 0x8f, 0x89, 0x59, 0x51, 0x53, 0x3a, 0x25, + 0x6d, 0x63, 0x3c, 0x29, 0x40, 0x57, 0x77, 0xa9, + 0xc5, 0xc2, 0xf2, 0xe6, 0x74, 0x49, 0x92, 0xd2, + 0xb1, 0x71, 0x2e, 0x2d, 0x6c, 0x97, 0x73, 0x33, + 0x40, 0x2c, 0x1f, 0x20, 0x1d, 0x17, 0x25, 0x3e, + 0x53, 0x3b, 0x43, 0x35, 0x39, 0x41, 0x1e, 0x1d, + 0xb7, 0xbf, 0x85, 0x33, 0x44, 0xa8, 0xd8, 0xc0, + 0xb5, 0xb5, 0xcb, 0xcd, 0xb9, 0xbc, 0xa3, 0x61, + 0xbb, 0xdb, 0xd3, 0xc7, 0xc1, 0xbe, 0xc4, 0xba, + 0x9e, 0x54, 0x43, 0x61, 0x4e, 0x27, 0x2d, 0x47, + 0x42, 0x9a, 0x9c, 0x73, 0x8f, 0xa8, 0x93, 0x88, + 0xa8, 0xbd, 0xa4, 0x84, 0x9a, 0x91, 0x86, 0xce, + 0xb3, 0xb9, 0xa4, 0x87, 0x94, 0xb6, 0xa9, 0x7a, + 0x9c, 0xc7, 0xd1, 0xca, 0xbb, 0xb2, 0xa4, 0x74, + 0x5d, 0x98, 0x9b, 0x9d, 0xc2, 0xae, 0x91, 0xb6, + 0x95, 0x71, 0x95, 0xdf, 0xc5, 0x6f, 0x82, 0xe7, + 0x98, 0x95, 0x5f, 0x70, 0xca, 0xc1, 0x8c, 0xa3, + 0x67, 0x75, 0x67, 0x3d, 0x2c, 0x45, 0x60, 0x67, + 0x18, 0x33, 0x2c, 0x1a, 0x48, 0xa4, 0xca, 0xb3, + 0xc6, 0x95, 0x8c, 0x8d, 0x6a, 0x55, 0x55, 0x47, + 0x53, 0xa3, 0x72, 0x3a, 0x27, 0x17, 0x4e, 0x87, + 0xb5, 0xa2, 0x69, 0x4a, 0x5e, 0x5a, 0x44, 0x4b, + 0x3d, 0x2c, 0x3a, 0x68, 0x62, 0x1b, 0x0d, 0x4a, + 0x46, 0x43, 0x42, 0x40, 0x38, 0x36, 0x46, 0x5a, + 0x1c, 0x2f, 0x45, 0x52, 0x54, 0x4f, 0x46, 0x3e, + 0x3e, 0x6a, 0x79, 0x62, 0x62, 0x79, 0x6a, 0x3e, + 0x5b, 0x3a, 0x4c, 0x34, 0x3f, 0x5d, 0x30, 0x32, + 0x93, 0x5c, 0x45, 0x81, 0x9d, 0x6b, 0x52, 0x5f, + 0x9a, 0xff, 0xff, 0xee, 0x9c, 0x2f, 0x00, 0x19, + 0xac, 0x98, 0x6b, 0x44, 0x49, 0x64, 0x60, 0x44, + 0x63, 0x73, 0x53, 0x29, 0x27, 0x2a, 0x2a, 0x3a, + 0x44, 0x5b, 0x2a, 0x23, 0xa7, 0xdb, 0x90, 0x86, + 0x95, 0x8a, 0x7f, 0x7d, 0x82, 0x84, 0x7f, 0x79, + 0x7c, 0x79, 0x76, 0x75, 0x71, 0x67, 0x58, 0x4d, + 0x65, 0x68, 0x6d, 0x72, 0x75, 0x75, 0x74, 0x73, + 0x9c, 0x86, 0x6a, 0x5b, 0x5e, 0x6c, 0x7a, 0x81, + 0x7a, 0x75, 0x6e, 0x6b, 0x6a, 0x66, 0x5e, 0x57, + 0x43, 0x41, 0x31, 0x3a, 0x55, 0x4a, 0x2e, 0x2d, + 0x19, 0x1a, 0x1b, 0x1b, 0x1f, 0x2a, 0x3b, 0x48, + 0x39, 0x36, 0x29, 0x24, 0x43, 0x78, 0x97, 0x9b, + 0x42, 0x24, 0x40, 0x83, 0x7f, 0x3f, 0x37, 0x6b, + 0x9e, 0x8e, 0x7a, 0x70, 0x68, 0x58, 0x3e, 0x28, + 0x3b, 0x31, 0x2d, 0x45, 0x53, 0x36, 0x39, 0x70, + 0x3f, 0x52, 0x5b, 0x74, 0x7b, 0x38, 0x0e, 0x38, + 0x67, 0x81, 0x5d, 0x26, 0x2f, 0x44, 0x32, 0x1a, + 0x5c, 0x2e, 0x11, 0x3a, 0x65, 0x4c, 0x3c, 0x63, + 0x88, 0x87, 0xa4, 0xa3, 0x86, 0x96, 0x87, 0x35, + 0x4d, 0xb3, 0xff, 0xef, 0xae, 0x89, 0x8a, 0x91, + 0x31, 0x1e, 0x17, 0x22, 0x27, 0x22, 0x28, 0x38, + 0x56, 0x3e, 0x45, 0x2f, 0x2a, 0x2f, 0x11, 0x15, + 0x36, 0x3b, 0x24, 0x0f, 0x3d, 0x9c, 0xd4, 0xd5, + 0xcb, 0xc1, 0xc7, 0xbb, 0xa1, 0xa5, 0x93, 0x56, + 0x43, 0x6b, 0x73, 0x68, 0x52, 0x42, 0x44, 0x35, + 0x70, 0x8b, 0xa7, 0xaa, 0xa0, 0xa7, 0xba, 0xc4, + 0x9d, 0x94, 0x96, 0xa2, 0xb0, 0xbe, 0xbc, 0xa9, + 0x81, 0x8e, 0xc2, 0xb2, 0xb4, 0xed, 0xb0, 0x31, + 0x66, 0x80, 0x9e, 0xc0, 0xc5, 0x89, 0x55, 0x58, + 0x9f, 0xb4, 0x86, 0x77, 0x6e, 0x4d, 0x6d, 0x99, + 0x9e, 0x86, 0x8e, 0xb3, 0xce, 0xd2, 0xab, 0x72, + 0x8f, 0x74, 0x68, 0x81, 0x9f, 0x94, 0x5e, 0x2a, + 0x07, 0x12, 0x29, 0x7b, 0xcc, 0xab, 0x5f, 0x53, + 0xa7, 0xb0, 0xc4, 0xc7, 0xa4, 0x83, 0x9a, 0xcc, + 0xe5, 0xc3, 0xcb, 0xfa, 0xfc, 0xc2, 0x94, 0x90, + 0x67, 0x5d, 0x99, 0xab, 0x54, 0x35, 0x72, 0x9b, + 0x52, 0x76, 0x4b, 0x43, 0x4e, 0x3b, 0x32, 0x0a, + 0x53, 0x71, 0x64, 0x46, 0x3b, 0x2d, 0x36, 0x63, + 0x3c, 0x6a, 0x43, 0x18, 0x54, 0x85, 0x6a, 0x4d, + 0x27, 0x1c, 0x2a, 0x47, 0x42, 0x2f, 0x45, 0x75, + 0xcc, 0xd7, 0xbc, 0x74, 0x37, 0x24, 0x23, 0x1f, + 0x2b, 0x69, 0x7c, 0x50, 0x3f, 0x66, 0x83, 0x7b, + 0x4e, 0x2f, 0x43, 0x4f, 0x37, 0x21, 0x44, 0xa4, + 0x2c, 0x6b, 0x61, 0x64, 0x7e, 0x90, 0xb3, 0xb4, + 0xdf, 0xea, 0xcd, 0xa6, 0xa5, 0xaa, 0xa8, 0xae, + 0xc1, 0x73, 0x2c, 0x1e, 0x28, 0x2b, 0x33, 0x42, + 0x35, 0x49, 0x51, 0x43, 0x3b, 0x3c, 0x2f, 0x19, + 0x25, 0x26, 0x25, 0x11, 0x3b, 0x8d, 0x9e, 0x93, + 0x7f, 0x79, 0x71, 0x6c, 0x6c, 0x6e, 0x71, 0x72, + 0x87, 0x83, 0x7f, 0x81, 0x86, 0x88, 0x85, 0x81, + 0x74, 0x78, 0x7e, 0x85, 0x89, 0x8b, 0x8b, 0x8a, + 0x98, 0x82, 0x68, 0x5d, 0x63, 0x6e, 0x74, 0x74, + 0x63, 0x5f, 0x5a, 0x59, 0x58, 0x53, 0x49, 0x41, + 0x37, 0x34, 0x30, 0x32, 0x31, 0x21, 0x21, 0x36, + 0x24, 0x1a, 0x16, 0x24, 0x37, 0x3a, 0x27, 0x12, + 0x15, 0x22, 0x22, 0x22, 0x45, 0x74, 0x77, 0x5a, + 0x41, 0x33, 0x35, 0x51, 0x6d, 0x6c, 0x54, 0x3e, + 0x49, 0x54, 0x5c, 0x54, 0x45, 0x3d, 0x43, 0x4e, + 0x67, 0xa2, 0x9f, 0x64, 0x3f, 0x31, 0x27, 0x2a, + 0x52, 0x63, 0x5e, 0x56, 0x6c, 0x81, 0x76, 0x61, + 0x4c, 0x61, 0x4c, 0x3a, 0x5c, 0x75, 0x64, 0x54, + 0x44, 0x57, 0x73, 0x8c, 0x73, 0x2f, 0x36, 0x8a, + 0xb4, 0x69, 0x30, 0x2a, 0x47, 0x69, 0x57, 0x1d, + 0x16, 0x84, 0xd9, 0xc7, 0x86, 0x58, 0x37, 0x1a, + 0x3b, 0x28, 0x26, 0x3a, 0x46, 0x42, 0x41, 0x4a, + 0x7e, 0x69, 0x6c, 0x4b, 0x35, 0x2b, 0x06, 0x08, + 0x67, 0x57, 0x41, 0x36, 0x3c, 0x47, 0x46, 0x3e, + 0x45, 0x3a, 0x43, 0x43, 0x3f, 0x60, 0x6b, 0x3f, + 0x80, 0xb7, 0xcf, 0xc0, 0x9a, 0x90, 0xb0, 0xba, + 0xc9, 0xa3, 0x85, 0xa6, 0xd6, 0xc2, 0xa0, 0xab, + 0xd2, 0xbc, 0x93, 0x90, 0xb5, 0xbd, 0xb3, 0xbd, + 0xad, 0xc0, 0x9c, 0x82, 0x9c, 0x8a, 0x7c, 0xb9, + 0xd4, 0xba, 0xc8, 0xa6, 0x60, 0x81, 0xa5, 0x68, + 0x6e, 0x8b, 0x75, 0x73, 0xb5, 0xde, 0xcd, 0xb1, + 0x99, 0x9b, 0x90, 0x75, 0x62, 0x78, 0xb3, 0xe6, + 0x8e, 0xbe, 0xc1, 0x91, 0x83, 0xa3, 0xa3, 0x7f, + 0x6b, 0x7f, 0xe4, 0xe9, 0x6e, 0x69, 0xcf, 0xec, + 0x8b, 0x93, 0xb2, 0xce, 0xc6, 0xaa, 0xae, 0xc9, + 0xa1, 0xa0, 0x7c, 0x46, 0x3c, 0x63, 0x83, 0x85, + 0x21, 0x15, 0x22, 0x42, 0x5f, 0x7f, 0x99, 0xa1, + 0x60, 0x5d, 0x35, 0x37, 0x44, 0x77, 0xc4, 0xb1, + 0x6c, 0x63, 0x38, 0x28, 0x44, 0x43, 0x2d, 0x34, + 0x68, 0x63, 0xba, 0xff, 0xdc, 0xa8, 0x6e, 0x17, + 0x52, 0x32, 0x28, 0x39, 0x39, 0x2a, 0x3c, 0x64, + 0x85, 0xa0, 0xa9, 0x8a, 0x61, 0x4b, 0x41, 0x3c, + 0xa5, 0x6e, 0x28, 0x0e, 0x33, 0x69, 0x7a, 0x6c, + 0x93, 0x65, 0x28, 0x29, 0x34, 0x4c, 0xa2, 0xe3, + 0xa2, 0x9e, 0x3d, 0x29, 0x36, 0x23, 0x4b, 0x66, + 0x39, 0x28, 0x37, 0x6c, 0xb0, 0xd8, 0xa0, 0x37, + 0x9d, 0x75, 0x5b, 0x5e, 0x54, 0x32, 0x18, 0x16, + 0x0d, 0x33, 0x38, 0x1b, 0x22, 0x4e, 0x57, 0x39, + 0x2b, 0x57, 0x67, 0x3b, 0x32, 0x4b, 0x5c, 0x83, + 0x72, 0x79, 0x7f, 0x7a, 0x70, 0x6d, 0x75, 0x7e, + 0x78, 0x7b, 0x80, 0x86, 0x85, 0x7a, 0x67, 0x59, + 0x6d, 0x6d, 0x6b, 0x67, 0x60, 0x57, 0x4f, 0x4b, + 0x60, 0x58, 0x55, 0x61, 0x74, 0x7d, 0x78, 0x6f, + 0x61, 0x5f, 0x5e, 0x60, 0x63, 0x60, 0x58, 0x50, + 0x59, 0x55, 0x4d, 0x39, 0x2a, 0x39, 0x4e, 0x50, + 0x21, 0x1e, 0x20, 0x2a, 0x33, 0x32, 0x23, 0x16, + 0x3b, 0x49, 0x57, 0x5e, 0x5f, 0x56, 0x40, 0x2b, + 0x2b, 0x3e, 0x43, 0x35, 0x2e, 0x37, 0x3a, 0x32, + 0x2f, 0x3a, 0x43, 0x40, 0x37, 0x37, 0x44, 0x53, + 0x5b, 0x49, 0x2d, 0x2f, 0x3c, 0x25, 0x15, 0x2c, + 0x33, 0x2b, 0x33, 0x1d, 0x13, 0x59, 0x7b, 0x3e, + 0x27, 0x43, 0x48, 0x4f, 0x6c, 0x6e, 0x5e, 0x61, + 0x28, 0x86, 0x82, 0x25, 0x07, 0x24, 0x27, 0x12, + 0x3e, 0x2f, 0x35, 0x68, 0x88, 0x59, 0x25, 0x27, + 0x37, 0x75, 0x87, 0x4d, 0x1f, 0x2b, 0x40, 0x3d, + 0x28, 0x15, 0x14, 0x2c, 0x3b, 0x34, 0x2b, 0x2d, + 0x36, 0x2d, 0x44, 0x35, 0x2c, 0x2e, 0x11, 0x19, + 0xe9, 0xd4, 0xce, 0xdb, 0xd5, 0xb0, 0x8d, 0x81, + 0xba, 0xa9, 0xaa, 0xa4, 0xa1, 0xc9, 0xdc, 0xb7, + 0xca, 0xbf, 0x97, 0x7f, 0x7d, 0x94, 0xb0, 0xa1, + 0x82, 0x8a, 0x91, 0x8b, 0x92, 0xb7, 0xc1, 0xa4, + 0xa6, 0xa0, 0xb9, 0xbb, 0x88, 0x70, 0x8d, 0xa6, + 0xb5, 0x9b, 0x75, 0x80, 0x7f, 0x6f, 0x7c, 0x73, + 0x7c, 0x8a, 0x9f, 0xbb, 0xbe, 0x98, 0x83, 0x97, + 0xb4, 0xb2, 0xd1, 0xc0, 0x9b, 0x85, 0x77, 0x94, + 0xa8, 0xf0, 0xc4, 0x97, 0xb6, 0x80, 0x47, 0x85, + 0xa9, 0x8c, 0x99, 0xaa, 0x69, 0x23, 0x68, 0xf3, + 0xf8, 0xa3, 0x6a, 0x4c, 0x48, 0x83, 0x91, 0x48, + 0x64, 0x58, 0x34, 0x12, 0x16, 0x2b, 0x1f, 0x00, + 0x24, 0x12, 0x0e, 0x25, 0x38, 0x2f, 0x18, 0x07, + 0x4e, 0x7f, 0x6e, 0x55, 0x76, 0x7a, 0x58, 0x53, + 0x44, 0x32, 0x21, 0x37, 0x38, 0x6c, 0xb4, 0x7f, + 0x2e, 0x49, 0x48, 0x4c, 0x64, 0x59, 0x44, 0x51, + 0x35, 0x54, 0x20, 0x1b, 0x61, 0x41, 0x19, 0x63, + 0x3b, 0x21, 0x1d, 0x3a, 0x52, 0x53, 0x54, 0x5e, + 0x2c, 0x31, 0x38, 0x38, 0x2f, 0x2b, 0x38, 0x4a, + 0x2c, 0x52, 0x53, 0x29, 0x1e, 0x40, 0x4e, 0x3d, + 0x07, 0x48, 0x3b, 0x50, 0x6e, 0x80, 0x89, 0x34, + 0x6e, 0xfe, 0xd6, 0x6b, 0x27, 0x33, 0xb6, 0xff, + 0xff, 0xe7, 0xc9, 0x78, 0x20, 0x34, 0x66, 0x55, + 0x20, 0x37, 0x3a, 0x26, 0x22, 0x33, 0x36, 0x28, + 0x27, 0x2e, 0x31, 0x2f, 0x26, 0x23, 0x59, 0xa9, + 0x97, 0x59, 0x5b, 0x49, 0x2d, 0x60, 0x86, 0x75, + 0x73, 0x71, 0x73, 0x79, 0x7f, 0x7f, 0x77, 0x6f, + 0x92, 0x8e, 0x8b, 0x8a, 0x87, 0x7f, 0x71, 0x67, + 0x68, 0x6a, 0x6e, 0x72, 0x73, 0x71, 0x6f, 0x6d, + 0x6e, 0x61, 0x57, 0x5a, 0x65, 0x68, 0x5d, 0x50, + 0x60, 0x60, 0x62, 0x68, 0x6e, 0x6e, 0x68, 0x61, + 0x53, 0x4b, 0x3e, 0x30, 0x4f, 0x98, 0x9c, 0x57, + 0x18, 0x30, 0x47, 0x4c, 0x49, 0x59, 0x80, 0xa3, + 0x3b, 0x40, 0x58, 0x6d, 0x58, 0x2a, 0x19, 0x27, + 0x2a, 0x3d, 0x5a, 0x66, 0x4c, 0x25, 0x16, 0x20, + 0x31, 0x25, 0x1e, 0x27, 0x3b, 0x49, 0x49, 0x43, + 0x48, 0x34, 0x1a, 0x42, 0x9b, 0xa9, 0x5a, 0x14, + 0x3e, 0x70, 0x72, 0x55, 0x54, 0x4e, 0x38, 0x33, + 0x1f, 0x2f, 0x27, 0x1f, 0x23, 0x17, 0x1b, 0x40, + 0x32, 0x42, 0x33, 0x22, 0x24, 0x1b, 0x17, 0x2d, + 0x15, 0x42, 0x2d, 0x13, 0x33, 0x37, 0x20, 0x2a, + 0x2a, 0x4b, 0x4e, 0x35, 0x42, 0x69, 0x5d, 0x2b, + 0x2d, 0x19, 0x18, 0x2f, 0x3e, 0x33, 0x25, 0x22, + 0x1c, 0x1b, 0x3c, 0x36, 0x32, 0x37, 0x1d, 0x27, + 0x60, 0x8c, 0xb9, 0xc2, 0xae, 0x9e, 0xa9, 0xbc, + 0x86, 0x9a, 0xaf, 0xb4, 0xac, 0xa6, 0xaa, 0xb1, + 0xbe, 0xbf, 0xae, 0x95, 0xad, 0xb0, 0x90, 0xa5, + 0xad, 0x92, 0x90, 0xa8, 0x9a, 0xbf, 0xbe, 0x92, + 0x9b, 0x97, 0x85, 0x8d, 0x76, 0x96, 0x97, 0x95, + 0x89, 0x9c, 0xaa, 0xa4, 0xb1, 0xa3, 0x7f, 0x99, + 0xb0, 0x93, 0x95, 0x97, 0x91, 0x84, 0x68, 0x96, + 0xa0, 0x83, 0x92, 0xad, 0xb0, 0x80, 0x47, 0x4f, + 0x55, 0x93, 0xd4, 0xe3, 0xc4, 0xa7, 0xab, 0xbd, + 0xaf, 0xba, 0x77, 0x1c, 0x38, 0xa1, 0xa5, 0x52, + 0x6d, 0x4b, 0x60, 0x6f, 0x46, 0x39, 0x3a, 0x16, + 0x2a, 0x3f, 0x40, 0x32, 0x3e, 0x60, 0x68, 0x55, + 0x5f, 0x6d, 0x54, 0x47, 0x5c, 0x50, 0x37, 0x44, + 0x56, 0x79, 0x8c, 0x6c, 0x39, 0x2a, 0x4f, 0x7b, + 0x4b, 0x56, 0x63, 0x69, 0x60, 0x4a, 0x31, 0x20, + 0x33, 0x28, 0x5b, 0x2e, 0x13, 0x46, 0x48, 0x5f, + 0x43, 0x48, 0x24, 0x16, 0x42, 0x5c, 0x5d, 0x71, + 0x9b, 0x78, 0x51, 0x32, 0x24, 0x30, 0x3f, 0x3e, + 0x2f, 0x37, 0x3c, 0x37, 0x39, 0x52, 0x6c, 0x73, + 0x49, 0x42, 0x22, 0x26, 0x50, 0x4f, 0x3d, 0x4e, + 0x48, 0x52, 0x44, 0x1f, 0x0b, 0x17, 0x26, 0x29, + 0x3a, 0x83, 0x98, 0x2c, 0x12, 0xbf, 0xf3, 0x51, + 0xb7, 0xef, 0xff, 0xd4, 0x69, 0x23, 0x29, 0x4b, + 0x60, 0x32, 0x14, 0x1c, 0x23, 0x1f, 0x2f, 0x4c, + 0x45, 0x42, 0x5a, 0x45, 0x22, 0x26, 0x29, 0x2e, + 0x3f, 0x22, 0x34, 0x3b, 0x1d, 0x3b, 0x72, 0x6b, + 0x79, 0x73, 0x6e, 0x6f, 0x76, 0x7c, 0x7d, 0x7c, + 0x8b, 0x88, 0x83, 0x7f, 0x7b, 0x78, 0x78, 0x77, + 0x70, 0x72, 0x74, 0x73, 0x6f, 0x67, 0x5f, 0x5a, + 0x67, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x64, 0x5f, 0x5b, 0x5d, 0x65, 0x6b, 0x6d, 0x6c, + 0x59, 0x31, 0x39, 0x81, 0x73, 0x31, 0x33, 0x37, + 0x20, 0x19, 0x31, 0x41, 0x36, 0x45, 0x5d, 0x56, + 0x36, 0x1e, 0x1b, 0x2f, 0x32, 0x1d, 0x15, 0x20, + 0x2c, 0x56, 0x55, 0x28, 0x21, 0x45, 0x46, 0x21, + 0x79, 0x8b, 0x73, 0x64, 0x78, 0x6a, 0x59, 0x74, + 0x25, 0x55, 0x6d, 0x59, 0x4b, 0x52, 0x46, 0x28, + 0x49, 0x51, 0x45, 0x7a, 0xcd, 0x9e, 0x2e, 0x0c, + 0x2a, 0x21, 0x2c, 0x27, 0x0e, 0x1c, 0x3f, 0x48, + 0x6c, 0x6d, 0x85, 0x75, 0x41, 0x3f, 0x46, 0x23, + 0xac, 0x80, 0x52, 0x46, 0x55, 0x5f, 0x54, 0x42, + 0x45, 0x1e, 0x42, 0x4f, 0x2a, 0x54, 0x69, 0x10, + 0x32, 0x18, 0x15, 0x31, 0x3f, 0x31, 0x28, 0x2f, + 0x23, 0x16, 0x20, 0x3d, 0x3f, 0x20, 0x0a, 0x0a, + 0x67, 0x6f, 0x84, 0xa5, 0xc3, 0xce, 0xc4, 0xb6, + 0xc0, 0xcf, 0xd4, 0xbe, 0x97, 0x7f, 0x82, 0x8f, + 0x95, 0x98, 0x8a, 0x9f, 0xa4, 0x82, 0x62, 0x39, + 0x5f, 0xae, 0xb0, 0xb9, 0xb7, 0x9c, 0x77, 0x8b, + 0xca, 0xd3, 0x98, 0x8b, 0xa0, 0xb9, 0x94, 0x97, + 0xae, 0x8f, 0x85, 0xb8, 0xa4, 0x78, 0x9a, 0xa0, + 0x8b, 0x60, 0xa9, 0xb1, 0xac, 0xbf, 0xab, 0xb9, + 0x70, 0x60, 0x88, 0x8e, 0x7b, 0x7b, 0x91, 0xd2, + 0xca, 0xb0, 0x86, 0x5e, 0x4a, 0x51, 0x6a, 0x80, + 0x72, 0x85, 0x6e, 0x3e, 0x44, 0x7a, 0x8b, 0x70, + 0x6c, 0x56, 0x4b, 0x34, 0x5f, 0xea, 0xeb, 0x45, + 0x12, 0x33, 0x4a, 0x42, 0x3a, 0x4b, 0x6b, 0x81, + 0x22, 0x4e, 0x4f, 0x55, 0x6d, 0x51, 0x69, 0xdb, + 0x77, 0x77, 0x52, 0x1a, 0x10, 0x32, 0x46, 0x3c, + 0x43, 0x39, 0x2a, 0x1d, 0x18, 0x1b, 0x23, 0x28, + 0x28, 0x51, 0x26, 0x26, 0x61, 0x46, 0x14, 0x1d, + 0x28, 0x2b, 0x54, 0x5a, 0x25, 0x19, 0x3d, 0x4c, + 0x23, 0x5e, 0xd8, 0xfb, 0x7d, 0x0f, 0x26, 0x65, + 0x85, 0x55, 0x29, 0x0c, 0x1a, 0x56, 0x59, 0x14, + 0x24, 0x64, 0x64, 0x29, 0x26, 0x5e, 0x7e, 0x7a, + 0x2b, 0x3b, 0x3b, 0x2b, 0x29, 0x39, 0x41, 0x39, + 0x31, 0x2c, 0x34, 0x22, 0x1f, 0x62, 0x6d, 0x17, + 0x92, 0x6c, 0x35, 0x13, 0x1d, 0x37, 0x38, 0x26, + 0x4b, 0x30, 0x34, 0x60, 0x81, 0x7b, 0x6d, 0x6b, + 0xa1, 0x69, 0x2a, 0x11, 0x34, 0x3b, 0x21, 0x3d, + 0x58, 0x74, 0x72, 0x6c, 0x5d, 0x50, 0x66, 0x7b, + 0x6b, 0x6b, 0x70, 0x78, 0x7e, 0x7e, 0x77, 0x6f, + 0x68, 0x63, 0x5c, 0x57, 0x58, 0x5f, 0x67, 0x6d, + 0x65, 0x68, 0x6d, 0x71, 0x71, 0x6e, 0x6b, 0x68, + 0x69, 0x69, 0x69, 0x68, 0x68, 0x68, 0x67, 0x67, + 0x63, 0x5d, 0x57, 0x57, 0x5b, 0x5f, 0x5e, 0x5c, + 0x3f, 0x3a, 0x4c, 0x4a, 0x2a, 0x1a, 0x2f, 0x52, + 0x63, 0x4c, 0x4b, 0x42, 0x26, 0x2c, 0x3f, 0x36, + 0x4f, 0x41, 0x2d, 0x23, 0x2a, 0x34, 0x2f, 0x23, + 0x56, 0x53, 0x46, 0x43, 0x63, 0x92, 0xa7, 0xa2, + 0x9a, 0x65, 0x3c, 0x2b, 0x1e, 0x21, 0x39, 0x4e, + 0x9d, 0x7f, 0x54, 0x2f, 0x1a, 0x1d, 0x32, 0x48, + 0x43, 0x4b, 0x46, 0x5b, 0x96, 0xaf, 0x86, 0x57, + 0x18, 0x13, 0x2a, 0x34, 0x23, 0x27, 0x34, 0x29, + 0x4c, 0x45, 0x38, 0x22, 0x19, 0x2c, 0x35, 0x25, + 0x30, 0x69, 0x74, 0x45, 0x39, 0x62, 0x6d, 0x4f, + 0x17, 0x09, 0x17, 0x2b, 0x35, 0x52, 0x5c, 0x3e, + 0x27, 0x36, 0x50, 0x60, 0x54, 0x37, 0x26, 0x26, + 0x3f, 0x27, 0x18, 0x1f, 0x29, 0x23, 0x16, 0x0e, + 0x95, 0x9b, 0xa5, 0xb0, 0xb3, 0xac, 0x9d, 0x91, + 0x8a, 0x97, 0x9b, 0x8b, 0x74, 0x73, 0x8e, 0xab, + 0xa4, 0xbb, 0x91, 0x6a, 0x66, 0x7c, 0xa2, 0xa4, + 0xc5, 0xb5, 0x8d, 0x85, 0x52, 0x60, 0x93, 0x9e, + 0xa2, 0x93, 0x89, 0xb3, 0xc9, 0xca, 0xac, 0xab, + 0xc3, 0xa6, 0x9d, 0x96, 0x91, 0xa2, 0xb5, 0xc0, + 0xa5, 0x89, 0xa9, 0xaf, 0xd4, 0x8a, 0x52, 0x6c, + 0x7d, 0x56, 0xaa, 0xb4, 0x69, 0x53, 0x45, 0x46, + 0x5b, 0x2e, 0x01, 0x01, 0x29, 0x51, 0x5f, 0x5b, + 0x92, 0x9d, 0x86, 0x43, 0x0a, 0x16, 0x61, 0xa6, + 0x7d, 0x38, 0x56, 0xa3, 0xb0, 0xab, 0x95, 0x59, + 0xc1, 0x90, 0x60, 0x52, 0x52, 0x4a, 0x3d, 0x36, + 0x2f, 0x55, 0x33, 0x40, 0xb9, 0xce, 0x4f, 0x00, + 0x26, 0x4b, 0x48, 0x1a, 0x16, 0x41, 0x50, 0x38, + 0x40, 0x38, 0x2d, 0x25, 0x25, 0x2d, 0x38, 0x3f, + 0x3a, 0x6b, 0x54, 0x64, 0x4f, 0x36, 0x4f, 0x02, + 0x29, 0x1f, 0x22, 0x40, 0x9d, 0xfe, 0xb5, 0x00, + 0x46, 0xae, 0xff, 0xff, 0x81, 0x74, 0x83, 0x3c, + 0x00, 0x2a, 0xa8, 0xfd, 0xbd, 0x54, 0x31, 0x36, + 0x39, 0x39, 0x3d, 0x2d, 0x14, 0x1b, 0x30, 0x30, + 0x48, 0x58, 0x5e, 0x5b, 0x66, 0x78, 0x74, 0x60, + 0x41, 0x25, 0x23, 0x38, 0x3a, 0x32, 0x38, 0x43, + 0x30, 0x16, 0x10, 0x1c, 0x13, 0x01, 0x15, 0x3f, + 0x49, 0x20, 0x0f, 0x33, 0x60, 0x67, 0x50, 0x3c, + 0x3d, 0x5c, 0x94, 0x8d, 0x5c, 0x3a, 0x28, 0x39, + 0x3d, 0x31, 0x19, 0x2f, 0x40, 0x54, 0x7f, 0x71, + 0x78, 0x74, 0x72, 0x75, 0x7d, 0x82, 0x81, 0x7f, + 0x79, 0x7b, 0x7f, 0x82, 0x83, 0x81, 0x7e, 0x7c, + 0x72, 0x74, 0x78, 0x7b, 0x7b, 0x7a, 0x78, 0x76, + 0x77, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6b, + 0x71, 0x6a, 0x62, 0x5f, 0x61, 0x62, 0x60, 0x5d, + 0x50, 0x37, 0x38, 0x31, 0x4a, 0x5a, 0x2f, 0x2a, + 0x16, 0x3c, 0x7a, 0x7f, 0x43, 0x2a, 0x3e, 0x45, + 0x49, 0x70, 0x85, 0x79, 0x73, 0x7a, 0x6a, 0x4b, + 0x7c, 0x5d, 0x4f, 0x67, 0x80, 0x79, 0x60, 0x4e, + 0x4a, 0x21, 0x43, 0x73, 0x69, 0x65, 0x62, 0x3c, + 0x31, 0x2c, 0x25, 0x1c, 0x18, 0x25, 0x43, 0x5f, + 0x28, 0x28, 0x35, 0x42, 0x53, 0x73, 0x72, 0x4a, + 0x6c, 0x3f, 0x3a, 0x5f, 0x82, 0x94, 0x75, 0x35, + 0x1d, 0x6e, 0x52, 0x1d, 0x32, 0x1b, 0x04, 0x40, + 0x16, 0x2e, 0x41, 0x43, 0x43, 0x44, 0x38, 0x27, + 0x2d, 0x1a, 0x0f, 0x36, 0x5f, 0x50, 0x4c, 0x7a, + 0x4c, 0x39, 0x2d, 0x47, 0x7e, 0xa0, 0x88, 0x5c, + 0x33, 0x2c, 0x22, 0x23, 0x35, 0x40, 0x2f, 0x13, + 0x75, 0x9c, 0xb8, 0x9e, 0x62, 0x3b, 0x45, 0x61, + 0x88, 0x82, 0x79, 0x72, 0x76, 0x8a, 0xa6, 0xba, + 0x97, 0x55, 0x61, 0x9a, 0xba, 0xaf, 0xa5, 0xd1, + 0xb5, 0xad, 0x89, 0xb4, 0xbc, 0xb9, 0xbc, 0xb6, + 0xa5, 0xaf, 0xc5, 0xc9, 0xbb, 0xd6, 0xcf, 0x9a, + 0x7c, 0x9b, 0x8e, 0x6b, 0xa2, 0xb2, 0x62, 0x53, + 0x94, 0x89, 0x98, 0xa4, 0xa0, 0x4d, 0xa3, 0xc1, + 0xaf, 0x94, 0xb1, 0x83, 0x6f, 0xb1, 0xb6, 0xad, + 0x61, 0x46, 0x36, 0x4d, 0x7a, 0x92, 0x83, 0x69, + 0x50, 0x34, 0x23, 0x43, 0x7e, 0x8d, 0x4e, 0x02, + 0x21, 0x53, 0x8d, 0xb3, 0xb6, 0x9f, 0x9a, 0xb0, + 0x30, 0x20, 0x28, 0x43, 0x43, 0x29, 0x25, 0x38, + 0x34, 0x38, 0x64, 0xb2, 0xcf, 0x94, 0x4e, 0x3b, + 0x4b, 0x60, 0x5e, 0x42, 0x33, 0x38, 0x31, 0x1c, + 0x10, 0x1b, 0x2b, 0x39, 0x3d, 0x37, 0x2d, 0x25, + 0x39, 0x38, 0x48, 0x78, 0x96, 0xe0, 0xe4, 0x36, + 0x0b, 0x21, 0x1f, 0x49, 0xba, 0xff, 0xf9, 0xed, + 0x8d, 0x5c, 0x7f, 0x75, 0x13, 0x1b, 0x4d, 0x20, + 0x74, 0xd8, 0xed, 0x8b, 0x24, 0x07, 0x33, 0x71, + 0x86, 0x3c, 0x31, 0x4d, 0x2e, 0x08, 0x1c, 0x40, + 0x27, 0x2f, 0x2b, 0x23, 0x2d, 0x40, 0x3b, 0x26, + 0x20, 0x38, 0x34, 0x19, 0x07, 0x06, 0x31, 0x71, + 0x70, 0x4e, 0x2e, 0x27, 0x30, 0x3a, 0x40, 0x45, + 0x4d, 0x57, 0x5d, 0x52, 0x3d, 0x38, 0x53, 0x73, + 0x46, 0x5b, 0xae, 0xbc, 0x71, 0x32, 0x1d, 0x2d, + 0x46, 0x35, 0x1f, 0x38, 0x3c, 0x50, 0x86, 0x6f, + 0x79, 0x73, 0x6d, 0x6e, 0x76, 0x7e, 0x82, 0x83, + 0x7b, 0x80, 0x86, 0x87, 0x81, 0x74, 0x66, 0x5c, + 0x63, 0x65, 0x68, 0x6c, 0x6f, 0x71, 0x73, 0x73, + 0x6d, 0x6b, 0x69, 0x65, 0x62, 0x5e, 0x5b, 0x5a, + 0x6a, 0x63, 0x5b, 0x58, 0x59, 0x5a, 0x58, 0x55, + 0x4d, 0x38, 0x37, 0x50, 0x79, 0x66, 0x22, 0x18, + 0x25, 0x18, 0x32, 0x53, 0x5c, 0x6e, 0x72, 0x56, + 0x67, 0x83, 0x85, 0x57, 0x27, 0x1b, 0x26, 0x30, + 0x67, 0x44, 0x27, 0x2a, 0x36, 0x35, 0x2e, 0x2a, + 0x3b, 0x20, 0x1c, 0x22, 0x29, 0x4a, 0x56, 0x34, + 0x1b, 0x4a, 0x60, 0x53, 0x62, 0xa2, 0xda, 0xec, + 0xd5, 0xae, 0x86, 0x6b, 0x51, 0x42, 0x55, 0x75, + 0x5e, 0x48, 0x51, 0x61, 0x63, 0x75, 0x80, 0x6d, + 0x49, 0x59, 0x37, 0x1d, 0x3a, 0x41, 0x2a, 0x28, + 0x1f, 0x20, 0x2f, 0x46, 0x4b, 0x3d, 0x32, 0x32, + 0x22, 0x41, 0x31, 0x11, 0x24, 0x41, 0x3e, 0x33, + 0x2f, 0x45, 0x45, 0x2e, 0x2b, 0x47, 0x5b, 0x59, + 0x29, 0x38, 0x37, 0x28, 0x2b, 0x33, 0x1e, 0x00, + 0xb5, 0xad, 0xa8, 0xad, 0xb5, 0xb3, 0xa6, 0x98, + 0x95, 0x94, 0x9c, 0xaa, 0xad, 0x91, 0x5e, 0x33, + 0x55, 0x53, 0x7e, 0x84, 0x8a, 0xb2, 0xa4, 0x79, + 0x53, 0xd5, 0xe3, 0xb8, 0x8f, 0xa4, 0xd1, 0xff, + 0xcb, 0xbb, 0xb9, 0xaf, 0x9f, 0x92, 0x90, 0x86, + 0x89, 0xda, 0xc6, 0xbb, 0xd9, 0xd2, 0xcb, 0xc2, + 0x6b, 0x86, 0x8c, 0x7b, 0x78, 0x3a, 0x7b, 0x54, + 0x33, 0x6c, 0xa8, 0xab, 0xc4, 0xab, 0x4d, 0x49, + 0x24, 0x56, 0xa4, 0xe5, 0xf4, 0xc7, 0x78, 0x3c, + 0x36, 0x2f, 0x20, 0x37, 0x8f, 0xdc, 0xc3, 0x78, + 0x6d, 0xb0, 0x68, 0x06, 0x19, 0x22, 0x17, 0x44, + 0x1b, 0x21, 0x4c, 0x86, 0x8d, 0x5c, 0x2f, 0x22, + 0x44, 0xa0, 0xe4, 0x9d, 0x48, 0x97, 0xff, 0xff, + 0xa2, 0x5b, 0x26, 0x2e, 0x45, 0x3f, 0x28, 0x1c, + 0x1f, 0x21, 0x25, 0x2a, 0x30, 0x35, 0x3a, 0x3c, + 0x3f, 0x4d, 0x5a, 0x25, 0x23, 0x47, 0x36, 0x45, + 0x2b, 0x43, 0x33, 0x1e, 0x29, 0x47, 0x98, 0xff, + 0xa5, 0x19, 0x0d, 0x3c, 0x25, 0x45, 0x7d, 0x5e, + 0x38, 0x52, 0x60, 0xb6, 0xff, 0xc4, 0x5c, 0x73, + 0xc5, 0x67, 0x2e, 0x3c, 0x48, 0x38, 0x29, 0x25, + 0x34, 0x39, 0x2e, 0x1c, 0x22, 0x3d, 0x49, 0x42, + 0x31, 0x5b, 0x55, 0x21, 0x04, 0x12, 0x41, 0x77, + 0x69, 0x66, 0x3a, 0x0e, 0x31, 0x78, 0x72, 0x33, + 0x22, 0x2d, 0x33, 0x2f, 0x2c, 0x33, 0x3d, 0x42, + 0x51, 0xb0, 0xbb, 0x4f, 0x2b, 0x53, 0x55, 0x56, + 0x71, 0x69, 0x34, 0x31, 0x4c, 0x58, 0x71, 0x78, + 0x74, 0x75, 0x79, 0x82, 0x8b, 0x8d, 0x87, 0x81, + 0x81, 0x7d, 0x77, 0x6e, 0x65, 0x5c, 0x56, 0x52, + 0x62, 0x63, 0x66, 0x6b, 0x71, 0x77, 0x7c, 0x7f, + 0x70, 0x6e, 0x6b, 0x68, 0x64, 0x61, 0x5e, 0x5d, + 0x69, 0x62, 0x5a, 0x58, 0x5b, 0x5d, 0x5c, 0x59, + 0x47, 0x46, 0x31, 0x4a, 0x5b, 0x34, 0x21, 0x29, + 0x22, 0x14, 0x2b, 0x48, 0x4d, 0x5a, 0x5c, 0x3e, + 0x4d, 0x45, 0x40, 0x3a, 0x27, 0x1b, 0x32, 0x56, + 0x2e, 0x31, 0x29, 0x1d, 0x22, 0x36, 0x43, 0x42, + 0x48, 0x6f, 0x5b, 0x38, 0x56, 0x77, 0x64, 0x47, + 0xbd, 0xcc, 0xb8, 0x87, 0x75, 0x84, 0x7e, 0x62, + 0xa6, 0xb8, 0x9d, 0x81, 0x74, 0x41, 0x2f, 0x66, + 0x3a, 0x13, 0x11, 0x2e, 0x46, 0x59, 0x48, 0x17, + 0x17, 0x20, 0x8a, 0xad, 0x5d, 0x6c, 0x96, 0x58, + 0x00, 0x45, 0x63, 0x39, 0x26, 0x51, 0x77, 0x76, + 0x40, 0x24, 0x28, 0x33, 0x1d, 0x0f, 0x19, 0x1e, + 0x18, 0x2c, 0x31, 0x27, 0x2f, 0x44, 0x42, 0x2b, + 0x56, 0x6d, 0x70, 0x56, 0x42, 0x3a, 0x21, 0x00, + 0x50, 0x79, 0x9b, 0x90, 0x6a, 0x5e, 0x7f, 0xa7, + 0xcb, 0xb1, 0x93, 0x89, 0x92, 0x9e, 0x9e, 0x99, + 0x66, 0x89, 0x70, 0x68, 0x7c, 0x76, 0x5f, 0x39, + 0x23, 0x23, 0x3e, 0x5f, 0x5b, 0x85, 0x71, 0x33, + 0x10, 0x6a, 0xce, 0xb4, 0x77, 0x71, 0xb4, 0xcb, + 0xbf, 0x87, 0x97, 0xbf, 0x83, 0x45, 0x74, 0xb5, + 0xbe, 0x95, 0x52, 0x17, 0x4a, 0x42, 0x3d, 0x32, + 0x98, 0x76, 0x58, 0x36, 0x2b, 0x35, 0x38, 0x43, + 0x63, 0x5c, 0x4d, 0x40, 0x4b, 0x78, 0xbb, 0xed, + 0xc4, 0xfa, 0xf2, 0x90, 0x36, 0x24, 0x31, 0x32, + 0x13, 0x5b, 0x78, 0xb3, 0xed, 0x86, 0x20, 0x54, + 0x41, 0x22, 0x1b, 0x40, 0x64, 0x59, 0x26, 0x00, + 0x26, 0x62, 0xb6, 0x95, 0x14, 0x0d, 0x91, 0xf9, + 0x64, 0x27, 0x12, 0x39, 0x49, 0x29, 0x1a, 0x2e, + 0x5a, 0x43, 0x23, 0x0e, 0x12, 0x2e, 0x55, 0x6f, + 0x98, 0x3a, 0x68, 0x66, 0x41, 0x3e, 0x16, 0x27, + 0x16, 0x21, 0x3e, 0x38, 0x1c, 0x2e, 0x3b, 0x16, + 0x3b, 0x21, 0x19, 0x00, 0x1b, 0xaf, 0xeb, 0x82, + 0x73, 0xa5, 0x6f, 0x54, 0xc6, 0xff, 0xb7, 0x76, + 0x31, 0x2b, 0x3e, 0x7b, 0x82, 0x26, 0x00, 0x35, + 0x26, 0x38, 0x37, 0x22, 0x20, 0x3f, 0x5e, 0x6a, + 0x47, 0x47, 0x42, 0x2e, 0x1a, 0x24, 0x3c, 0x46, + 0x1e, 0x1d, 0x25, 0x2d, 0x28, 0x29, 0x4c, 0x78, + 0x5d, 0x53, 0x3b, 0x25, 0x2c, 0x44, 0x4a, 0x3d, + 0x58, 0x5d, 0x6e, 0x59, 0x40, 0x37, 0x3e, 0x6b, + 0x55, 0x2e, 0x28, 0x2c, 0x32, 0x5c, 0x7e, 0x7c, + 0x73, 0x71, 0x72, 0x79, 0x82, 0x87, 0x86, 0x83, + 0x8e, 0x8d, 0x8a, 0x85, 0x80, 0x7a, 0x75, 0x72, + 0x8a, 0x87, 0x82, 0x7d, 0x7a, 0x79, 0x7a, 0x7b, + 0x7f, 0x7e, 0x7c, 0x7a, 0x78, 0x75, 0x74, 0x73, + 0x73, 0x6c, 0x65, 0x62, 0x65, 0x67, 0x65, 0x62, + 0x53, 0x56, 0x2b, 0x2d, 0x39, 0x32, 0x40, 0x31, + 0x20, 0x48, 0x8b, 0x97, 0x62, 0x50, 0x69, 0x73, + 0x52, 0x35, 0x30, 0x4a, 0x4f, 0x32, 0x1f, 0x24, + 0x1d, 0x34, 0x42, 0x3d, 0x3b, 0x44, 0x46, 0x3e, + 0x1b, 0x72, 0x82, 0x6e, 0x87, 0x7b, 0x3d, 0x1f, + 0x34, 0x2c, 0x36, 0x5d, 0x7e, 0x73, 0x40, 0x12, + 0x53, 0x8e, 0x6c, 0x31, 0x3b, 0x3c, 0x45, 0x81, + 0x3a, 0x26, 0x22, 0x1a, 0x13, 0x4c, 0xa6, 0xd3, + 0xa4, 0x7b, 0x4e, 0x22, 0x11, 0x36, 0x57, 0x4c, + 0x2d, 0x40, 0x39, 0x17, 0x12, 0x34, 0x52, 0x56, + 0x48, 0x35, 0x4d, 0x63, 0x47, 0x33, 0x3c, 0x3f, + 0x05, 0x16, 0x23, 0x26, 0x2a, 0x2f, 0x29, 0x1d, + 0x3a, 0x55, 0x71, 0x7d, 0x78, 0x5d, 0x2d, 0x03, + 0xd9, 0xae, 0x8b, 0x94, 0xb8, 0xc4, 0xa5, 0x7f, + 0x6b, 0x8f, 0xba, 0xd0, 0xcc, 0xbf, 0xb7, 0xb7, + 0xba, 0xdb, 0xca, 0xcd, 0xd1, 0xb1, 0xb3, 0xc8, + 0xbe, 0x6d, 0x85, 0xb7, 0x7e, 0x44, 0x13, 0x2d, + 0x39, 0x22, 0x3a, 0x33, 0x25, 0x1d, 0x68, 0x9a, + 0x46, 0x1e, 0x56, 0x5f, 0x48, 0x69, 0x5e, 0x39, + 0x64, 0x31, 0x45, 0x5c, 0x59, 0x4d, 0x44, 0x32, + 0x34, 0x35, 0x3f, 0x40, 0x3f, 0x83, 0xa2, 0x45, + 0x8a, 0x70, 0x45, 0x1f, 0x1c, 0x49, 0x94, 0xcd, + 0xc6, 0x9e, 0x62, 0x30, 0x1b, 0x23, 0x35, 0x41, + 0x80, 0x95, 0xa5, 0xb9, 0xb5, 0x77, 0x47, 0x54, + 0x43, 0x40, 0x2f, 0x19, 0x14, 0x1d, 0x1e, 0x15, + 0x9f, 0xe3, 0xcd, 0xa1, 0xdd, 0xff, 0xdc, 0x95, + 0x25, 0x23, 0x38, 0x4f, 0x39, 0x08, 0x00, 0x17, + 0x44, 0x39, 0x2a, 0x20, 0x21, 0x2d, 0x3e, 0x4a, + 0x47, 0x18, 0x78, 0x82, 0x0c, 0x4d, 0xf2, 0xff, + 0x98, 0xb6, 0xfb, 0xf8, 0x84, 0x23, 0x0f, 0x0f, + 0x1e, 0x37, 0x42, 0x1c, 0x17, 0x78, 0xbe, 0xa4, + 0x50, 0x4f, 0x3a, 0x10, 0x00, 0x18, 0x28, 0x17, + 0x34, 0x1b, 0x10, 0x94, 0xff, 0xcd, 0x2a, 0x1b, + 0x29, 0x4f, 0x60, 0x48, 0x34, 0x43, 0x64, 0x78, + 0x61, 0x50, 0x5d, 0x53, 0x3c, 0x6a, 0x99, 0x80, + 0x7f, 0x3a, 0x1f, 0x40, 0x47, 0x30, 0x4d, 0x8f, + 0x5b, 0x75, 0x6e, 0x3b, 0x18, 0x28, 0x4b, 0x5e, + 0x8b, 0x3b, 0x39, 0x58, 0x6a, 0x73, 0x4f, 0x28, + 0x39, 0x2b, 0xa1, 0xa9, 0x4b, 0x5b, 0x81, 0x7a, + 0x68, 0x61, 0x5c, 0x5e, 0x68, 0x72, 0x78, 0x7a, + 0x81, 0x83, 0x85, 0x85, 0x82, 0x7d, 0x78, 0x74, + 0x8d, 0x88, 0x7f, 0x75, 0x6e, 0x6b, 0x6b, 0x6b, + 0x74, 0x74, 0x74, 0x74, 0x73, 0x73, 0x73, 0x73, + 0x74, 0x6c, 0x63, 0x5e, 0x5e, 0x5d, 0x59, 0x55, + 0x4e, 0x50, 0x43, 0x33, 0x31, 0x49, 0x56, 0x3f, + 0x2f, 0x1d, 0x25, 0x29, 0x1a, 0x2c, 0x49, 0x45, + 0x23, 0x26, 0x2d, 0x30, 0x29, 0x1d, 0x1c, 0x23, + 0x3d, 0x23, 0x17, 0x26, 0x3a, 0x48, 0x5e, 0x76, + 0x66, 0x72, 0x6f, 0x5b, 0x40, 0x26, 0x27, 0x3d, + 0x48, 0x3d, 0x3e, 0x56, 0x69, 0x5e, 0x36, 0x13, + 0x25, 0x5a, 0x58, 0x32, 0x28, 0x24, 0x2a, 0x47, + 0x4e, 0x2b, 0x1f, 0x1d, 0x14, 0x24, 0x30, 0x1e, + 0x4d, 0x79, 0x3b, 0x00, 0x17, 0x2e, 0x4b, 0x9e, + 0x6f, 0x36, 0x07, 0x07, 0x18, 0x1b, 0x16, 0x15, + 0x6d, 0xfa, 0xff, 0xa7, 0xaa, 0xf6, 0xe1, 0x8a, + 0x27, 0x12, 0x21, 0x6d, 0xc1, 0xdc, 0xbb, 0x93, + 0x35, 0x23, 0x25, 0x48, 0x61, 0x4d, 0x17, 0x00, + 0x67, 0x87, 0x99, 0x7f, 0x4e, 0x3a, 0x55, 0x7a, + 0x6b, 0x82, 0x87, 0x5e, 0x27, 0x1a, 0x46, 0x79, + 0x5b, 0x18, 0x44, 0x6e, 0x6d, 0x98, 0xa7, 0x83, + 0x34, 0x26, 0x6e, 0x6d, 0x26, 0x3b, 0x31, 0x3e, + 0x6d, 0x50, 0x28, 0x1e, 0x61, 0x3b, 0x30, 0x58, + 0x50, 0x43, 0x30, 0x40, 0x42, 0x37, 0x3e, 0x2f, + 0x3c, 0x47, 0x29, 0x3b, 0x42, 0x3f, 0x53, 0x60, + 0x60, 0x56, 0x28, 0x35, 0x3e, 0x31, 0x3f, 0x27, + 0x3b, 0x37, 0x30, 0x28, 0x25, 0x28, 0x30, 0x37, + 0x0f, 0x03, 0x3d, 0xb4, 0xf4, 0xcb, 0x85, 0x64, + 0x91, 0x35, 0x16, 0x21, 0x15, 0x2a, 0x4c, 0x40, + 0x3c, 0x3c, 0x31, 0x33, 0x58, 0x77, 0x56, 0x1b, + 0x62, 0xb9, 0x64, 0x12, 0x5b, 0x57, 0x17, 0x3e, + 0x19, 0x0e, 0x0a, 0x17, 0x2d, 0x3a, 0x3d, 0x3c, + 0x2d, 0x49, 0x70, 0x8c, 0x8a, 0x6d, 0x44, 0x27, + 0x03, 0xaa, 0xff, 0xff, 0xb7, 0xae, 0xed, 0xa8, + 0x75, 0xa3, 0x73, 0x17, 0x0e, 0x2d, 0x34, 0x34, + 0x69, 0x43, 0x1f, 0x19, 0x3a, 0x63, 0x5a, 0x2e, + 0x30, 0x45, 0x85, 0x80, 0x70, 0xe1, 0xff, 0x8b, + 0x5d, 0xe4, 0xdf, 0xb8, 0xdc, 0x8e, 0x16, 0x21, + 0x3d, 0x71, 0x8e, 0x71, 0x47, 0x42, 0x58, 0x6b, + 0x2c, 0x39, 0x5a, 0x33, 0x0b, 0x78, 0xdd, 0xb8, + 0xac, 0xc1, 0xb3, 0x8d, 0x8b, 0x9a, 0x74, 0x31, + 0x48, 0x30, 0x15, 0x24, 0x67, 0x92, 0x61, 0x0e, + 0x24, 0x1f, 0x23, 0x1f, 0x2e, 0x30, 0x21, 0x3e, + 0x57, 0x62, 0xe5, 0xd5, 0x6e, 0x61, 0x57, 0x66, + 0x6e, 0x6f, 0x72, 0x7b, 0x85, 0x89, 0x87, 0x82, + 0x92, 0x8b, 0x80, 0x77, 0x74, 0x77, 0x7d, 0x82, + 0x75, 0x73, 0x71, 0x71, 0x74, 0x7b, 0x83, 0x88, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7a, + 0x84, 0x7b, 0x70, 0x68, 0x65, 0x62, 0x5c, 0x57, + 0x56, 0x34, 0x3a, 0x2d, 0x37, 0x65, 0x5a, 0x3d, + 0x2d, 0x21, 0x2f, 0x31, 0x18, 0x1b, 0x28, 0x1b, + 0x56, 0xab, 0xe8, 0xca, 0x84, 0x56, 0x45, 0x3e, + 0x57, 0x1d, 0x13, 0x4c, 0x6c, 0x57, 0x4f, 0x65, + 0x1a, 0x0e, 0x59, 0x9b, 0x66, 0x28, 0x30, 0x45, + 0x39, 0x60, 0x6c, 0x51, 0x45, 0x56, 0x55, 0x3e, + 0x32, 0x2b, 0x39, 0x40, 0x2b, 0x2b, 0x59, 0x87, + 0x91, 0x62, 0x3f, 0x21, 0x07, 0x19, 0x3a, 0x3c, + 0x1b, 0x17, 0x1d, 0x15, 0x0f, 0x39, 0x62, 0x5d, + 0x4e, 0x5b, 0x43, 0x14, 0x13, 0x3b, 0x44, 0x2a, + 0x74, 0xe4, 0xe0, 0xb5, 0xd7, 0xc4, 0x8b, 0x98, + 0x0f, 0x48, 0xaf, 0xff, 0xff, 0xff, 0xe9, 0xed, + 0xca, 0x68, 0x15, 0x15, 0x38, 0x3b, 0x21, 0x0c, + 0x4c, 0x32, 0x13, 0x31, 0x64, 0x51, 0x3e, 0x66, + 0x5f, 0x27, 0x00, 0x24, 0x71, 0x95, 0x6f, 0x36, + 0x1f, 0x31, 0x67, 0x9f, 0x93, 0x4a, 0x0f, 0x00, + 0x00, 0x3c, 0x60, 0x61, 0x80, 0xb5, 0xb1, 0x82, + 0x68, 0xc6, 0x4e, 0x28, 0x63, 0x40, 0x49, 0x68, + 0x45, 0x64, 0x4e, 0x3b, 0x52, 0x49, 0x3f, 0x67, + 0x7e, 0x5f, 0x3f, 0x3b, 0x52, 0x70, 0x80, 0x84, + 0x3a, 0x40, 0x17, 0x0e, 0x2e, 0x11, 0x00, 0x2b, + 0x38, 0x36, 0x31, 0x35, 0x46, 0x4e, 0x3b, 0x1f, + 0x03, 0x54, 0x84, 0xca, 0xbd, 0x58, 0x39, 0x33, + 0x17, 0x42, 0x6c, 0x6f, 0x53, 0x3d, 0x44, 0x56, + 0x48, 0x65, 0x2e, 0x2c, 0x8e, 0x8c, 0x55, 0x73, + 0x29, 0x3e, 0x3f, 0x44, 0x53, 0x42, 0x25, 0x24, + 0x36, 0x1d, 0x39, 0x3c, 0x17, 0x41, 0x7e, 0x6f, + 0x41, 0x73, 0x93, 0x6e, 0x28, 0x0f, 0x40, 0x7e, + 0x78, 0x49, 0x92, 0xf7, 0xd8, 0x89, 0x62, 0x4a, + 0x38, 0x69, 0x6a, 0x2c, 0x0b, 0x20, 0x25, 0x0b, + 0x5a, 0x5e, 0x64, 0x68, 0x64, 0x55, 0x40, 0x31, + 0x38, 0x2e, 0x73, 0xfc, 0xfb, 0xfc, 0xff, 0x9a, + 0xa1, 0x94, 0x5a, 0x40, 0x83, 0xc2, 0x9b, 0x51, + 0x30, 0x2b, 0x24, 0x1f, 0x1f, 0x24, 0x2b, 0x30, + 0x4e, 0x0b, 0x0d, 0x33, 0x2d, 0x2c, 0x38, 0x2b, + 0xb9, 0x84, 0x4b, 0x3a, 0x4a, 0x55, 0x44, 0x2b, + 0x31, 0x1a, 0x1f, 0x4b, 0x67, 0x55, 0x33, 0x21, + 0x75, 0x79, 0x5d, 0x3e, 0x37, 0x2b, 0x23, 0x2f, + 0x35, 0x3a, 0x35, 0x0e, 0x31, 0x6e, 0x66, 0x6b, + 0x5c, 0x64, 0x6f, 0x75, 0x76, 0x74, 0x72, 0x71, + 0x8c, 0x8d, 0x84, 0x75, 0x72, 0x77, 0x74, 0x6a, + 0x6a, 0x73, 0x7f, 0x8a, 0x8f, 0x8c, 0x85, 0x80, + 0x76, 0x7b, 0x7e, 0x78, 0x6c, 0x66, 0x69, 0x6e, + 0x72, 0x6d, 0x66, 0x60, 0x5e, 0x5f, 0x62, 0x65, + 0x47, 0x3a, 0x39, 0x39, 0x2c, 0x27, 0x36, 0x43, + 0x3b, 0x49, 0x35, 0x29, 0x75, 0xd9, 0xce, 0x7b, + 0xae, 0x8f, 0x77, 0x6c, 0x54, 0x3a, 0x41, 0x5e, + 0x55, 0x78, 0x9f, 0x93, 0x6a, 0x5c, 0x45, 0x14, + 0x60, 0x7f, 0x80, 0x77, 0x72, 0x52, 0x46, 0x6b, + 0x94, 0x76, 0x4f, 0x39, 0x37, 0x3e, 0x42, 0x41, + 0x2e, 0x41, 0x53, 0x4c, 0x2b, 0x11, 0x1b, 0x35, + 0x0f, 0x36, 0x41, 0x22, 0x11, 0x24, 0x2f, 0x24, + 0x1c, 0x39, 0x30, 0x21, 0x2a, 0x1e, 0x19, 0x39, + 0x68, 0x4a, 0x29, 0x24, 0x23, 0x1b, 0x49, 0x9e, + 0xf1, 0xef, 0xd7, 0xd4, 0xd3, 0xd1, 0xe5, 0xe4, + 0xaf, 0xb3, 0xd1, 0xf0, 0xe9, 0xd7, 0xf7, 0xff, + 0xf0, 0xcb, 0xd9, 0xb1, 0x6b, 0x28, 0x00, 0x18, + 0x6d, 0x96, 0xb8, 0xe5, 0xfc, 0xa8, 0x34, 0x0b, + 0x37, 0x3f, 0x4b, 0x5a, 0x6a, 0x79, 0x85, 0x8d, + 0x35, 0x42, 0x49, 0x5b, 0x93, 0xc7, 0xba, 0x89, + 0x7a, 0x3c, 0x19, 0x3e, 0x6d, 0x68, 0x3b, 0x16, + 0x33, 0x66, 0x54, 0x56, 0x5d, 0x40, 0x45, 0x53, + 0xae, 0x71, 0x65, 0x67, 0x50, 0x58, 0x54, 0x1c, + 0x2c, 0x2e, 0x37, 0x47, 0x53, 0x51, 0x40, 0x30, + 0x31, 0x32, 0x2f, 0x1c, 0x15, 0x31, 0x42, 0x31, + 0x20, 0x1f, 0x1c, 0x1a, 0x20, 0x2a, 0x2c, 0x29, + 0x41, 0x36, 0x5a, 0xab, 0x69, 0x03, 0x37, 0x69, + 0x2a, 0x3b, 0x4c, 0x50, 0x45, 0x39, 0x35, 0x36, + 0x3e, 0x3e, 0x29, 0x2d, 0x4e, 0x3d, 0x0a, 0x00, + 0x26, 0x3b, 0x38, 0x32, 0x39, 0x2c, 0x20, 0x2e, + 0x18, 0x40, 0x5c, 0x30, 0x0c, 0x4c, 0x7d, 0x57, + 0x2f, 0x33, 0x33, 0x33, 0x47, 0x80, 0xd1, 0xff, + 0xe4, 0x78, 0x87, 0xd9, 0xb7, 0x78, 0xa5, 0xf4, + 0xa3, 0x5e, 0x38, 0x4b, 0x4d, 0x2a, 0x21, 0x39, + 0x33, 0x58, 0x7f, 0x84, 0x63, 0x37, 0x17, 0x0b, + 0x13, 0x0a, 0x8b, 0xfc, 0xf8, 0xf7, 0xff, 0xff, + 0xff, 0xbd, 0x6e, 0x55, 0x68, 0x65, 0x41, 0x24, + 0x1a, 0x26, 0x37, 0x43, 0x42, 0x35, 0x23, 0x16, + 0x21, 0x40, 0x3b, 0x31, 0x31, 0x0a, 0x00, 0x1f, + 0x95, 0x6d, 0x3f, 0x2b, 0x30, 0x36, 0x2d, 0x1f, + 0x1c, 0x26, 0x37, 0x3b, 0x26, 0x25, 0x61, 0xa9, + 0x8e, 0x4b, 0x2c, 0x2b, 0x12, 0x06, 0x2a, 0x50, + 0x7c, 0x55, 0x5f, 0x4d, 0x3f, 0x65, 0x6d, 0x62, + 0x5d, 0x63, 0x6b, 0x70, 0x6f, 0x6b, 0x66, 0x63, + 0x7e, 0x82, 0x7d, 0x71, 0x71, 0x7a, 0x7b, 0x73, + 0x75, 0x75, 0x75, 0x73, 0x71, 0x6e, 0x6c, 0x6a, + 0x80, 0x84, 0x86, 0x81, 0x77, 0x72, 0x74, 0x79, + 0x83, 0x7d, 0x72, 0x67, 0x5e, 0x58, 0x56, 0x56, + 0x47, 0x49, 0x46, 0x30, 0x1c, 0x2d, 0x46, 0x49, + 0x80, 0x4d, 0x45, 0x75, 0x82, 0x54, 0x35, 0x3e, + 0x2c, 0x24, 0x1c, 0x34, 0x77, 0xab, 0x94, 0x5c, + 0x47, 0x44, 0x52, 0x72, 0x7a, 0x58, 0x42, 0x50, + 0x6c, 0x6c, 0x48, 0x35, 0x4a, 0x4f, 0x58, 0x7f, + 0x74, 0x5f, 0x46, 0x38, 0x33, 0x2c, 0x1e, 0x10, + 0x4e, 0x42, 0x20, 0x05, 0x19, 0x39, 0x29, 0x00, + 0x1f, 0x3a, 0x41, 0x31, 0x35, 0x50, 0x57, 0x48, + 0x69, 0x28, 0x00, 0x52, 0xff, 0xff, 0x80, 0x00, + 0x04, 0x0f, 0x82, 0xf0, 0xa6, 0x16, 0x2d, 0xb4, + 0xba, 0xbf, 0xd0, 0xc9, 0xbc, 0xb3, 0xa1, 0xa3, + 0x76, 0x78, 0xa6, 0xf1, 0xff, 0xf1, 0xc4, 0xb1, + 0xd9, 0x97, 0x98, 0x99, 0x9c, 0x7e, 0x29, 0x1c, + 0x76, 0x82, 0x56, 0x33, 0x4a, 0x4d, 0x36, 0x39, + 0x43, 0x3b, 0x33, 0x32, 0x35, 0x34, 0x2c, 0x24, + 0x49, 0x3b, 0x18, 0x02, 0x23, 0x55, 0x52, 0x2b, + 0x0a, 0x2d, 0x3a, 0x2d, 0x38, 0x59, 0x5b, 0x40, + 0x2d, 0x1c, 0x4c, 0x4b, 0x34, 0x4c, 0x53, 0x56, + 0x62, 0x45, 0x56, 0x56, 0x2d, 0x37, 0x56, 0x43, + 0x25, 0x1d, 0x1b, 0x28, 0x3d, 0x49, 0x45, 0x3c, + 0x36, 0x0c, 0x32, 0x50, 0x27, 0x2d, 0x44, 0x20, + 0x22, 0x1c, 0x21, 0x36, 0x48, 0x45, 0x32, 0x21, + 0x32, 0x16, 0x19, 0xad, 0xfc, 0xa8, 0x64, 0x38, + 0x78, 0x6d, 0x61, 0x5c, 0x5b, 0x54, 0x44, 0x37, + 0x26, 0x17, 0x28, 0x35, 0x26, 0x2a, 0x30, 0x1a, + 0x30, 0x42, 0x38, 0x2a, 0x2d, 0x25, 0x25, 0x3d, + 0x58, 0x5e, 0x50, 0x27, 0x0c, 0x20, 0x40, 0x48, + 0x12, 0x1b, 0x29, 0x33, 0x33, 0x27, 0x15, 0x07, + 0x85, 0xa0, 0xd3, 0xbe, 0x53, 0x1c, 0x48, 0x7c, + 0x89, 0x37, 0x06, 0x30, 0x71, 0x79, 0x51, 0x2d, + 0x1b, 0x0e, 0x16, 0x46, 0x7b, 0x82, 0x50, 0x19, + 0x31, 0x5c, 0xe1, 0xda, 0xa9, 0xa4, 0x9b, 0xf2, + 0xea, 0x9c, 0x43, 0x13, 0x0f, 0x24, 0x38, 0x3f, + 0x3b, 0x35, 0x2d, 0x25, 0x20, 0x21, 0x24, 0x26, + 0x58, 0x73, 0x56, 0x36, 0x45, 0x3d, 0x26, 0x32, + 0x2e, 0x2f, 0x34, 0x3c, 0x45, 0x4b, 0x4c, 0x4b, + 0x75, 0x4b, 0x2b, 0x29, 0x29, 0x23, 0x2d, 0x42, + 0x16, 0x1c, 0x40, 0x59, 0x4a, 0x3e, 0x3b, 0x2e, + 0x3d, 0x35, 0x2b, 0x1b, 0x41, 0x79, 0x75, 0x6a, + 0x65, 0x68, 0x6d, 0x71, 0x70, 0x6b, 0x63, 0x5d, + 0x6a, 0x71, 0x71, 0x68, 0x6a, 0x76, 0x7b, 0x77, + 0x92, 0x8b, 0x80, 0x77, 0x72, 0x74, 0x78, 0x7c, + 0x73, 0x76, 0x77, 0x74, 0x6e, 0x6b, 0x6c, 0x70, + 0x65, 0x64, 0x63, 0x62, 0x65, 0x69, 0x6d, 0x70, + 0x71, 0x57, 0x4e, 0x3e, 0x19, 0x21, 0x67, 0xa3, + 0x51, 0x40, 0x31, 0x38, 0x53, 0x6d, 0x76, 0x73, + 0x24, 0x67, 0x87, 0x56, 0x17, 0x16, 0x45, 0x6d, + 0x2a, 0x56, 0x5a, 0x5b, 0x5f, 0x2b, 0x20, 0x6b, + 0x53, 0x4f, 0x2e, 0x35, 0x76, 0x99, 0x97, 0xa3, + 0x7a, 0x7f, 0x8b, 0x97, 0x94, 0x75, 0x43, 0x1d, + 0x4b, 0x5c, 0x4f, 0x27, 0x18, 0x2a, 0x2f, 0x1e, + 0x50, 0x5c, 0x59, 0x49, 0x48, 0x55, 0x52, 0x41, + 0x57, 0x4d, 0x41, 0x82, 0xf7, 0xff, 0xc7, 0x94, + 0x8e, 0x9f, 0xd4, 0xe0, 0xc3, 0xde, 0xfb, 0xda, + 0xd6, 0xaa, 0xbd, 0xac, 0xc5, 0xef, 0xcd, 0xdd, + 0xa4, 0x9a, 0xa7, 0xc9, 0xce, 0xa6, 0x74, 0x59, + 0x6f, 0x40, 0x5e, 0x80, 0x9f, 0x83, 0x0c, 0x00, + 0x12, 0x46, 0x3a, 0x1c, 0x39, 0x4b, 0x33, 0x25, + 0x48, 0x32, 0x23, 0x31, 0x4f, 0x5d, 0x4e, 0x38, + 0x1c, 0x0d, 0x19, 0x3b, 0x44, 0x38, 0x46, 0x67, + 0x43, 0x73, 0x7a, 0x5d, 0x73, 0xa7, 0x94, 0x4d, + 0x3e, 0x27, 0x5a, 0x2c, 0x2b, 0x7a, 0x5c, 0x49, + 0xb4, 0xa8, 0x75, 0x7b, 0xb7, 0x94, 0x29, 0x00, + 0x2a, 0x41, 0x45, 0x21, 0x03, 0x2a, 0x97, 0xf9, + 0x8c, 0x39, 0x3b, 0x53, 0x08, 0x00, 0x62, 0xfa, + 0x52, 0x28, 0x10, 0x27, 0x49, 0x4d, 0x3e, 0x33, + 0x3b, 0xaf, 0x73, 0x75, 0xbc, 0x5e, 0x07, 0x1f, + 0x38, 0x32, 0x30, 0x39, 0x4c, 0x5d, 0x65, 0x66, + 0x4a, 0x21, 0x1c, 0x3c, 0x58, 0x64, 0x44, 0x07, + 0x41, 0x4c, 0x3d, 0x33, 0x3f, 0x3a, 0x32, 0x42, + 0x11, 0x71, 0x82, 0x3b, 0x2a, 0x60, 0x88, 0x89, + 0x77, 0x66, 0x45, 0x1f, 0x07, 0x0f, 0x2f, 0x4d, + 0xce, 0xb1, 0x6d, 0x1d, 0x0b, 0x3e, 0x5d, 0x48, + 0x28, 0x6b, 0x9d, 0x88, 0x53, 0x39, 0x40, 0x4d, + 0x50, 0x38, 0x22, 0x25, 0x3c, 0x4c, 0x4a, 0x40, + 0xe0, 0xff, 0xd8, 0x5c, 0x56, 0x89, 0x77, 0x90, + 0xa0, 0xa5, 0x95, 0x63, 0x4c, 0x70, 0x70, 0x34, + 0x00, 0x07, 0x20, 0x36, 0x40, 0x3c, 0x31, 0x28, + 0x0d, 0x41, 0x7c, 0x58, 0x05, 0x0d, 0x43, 0x46, + 0x28, 0x45, 0x66, 0x71, 0x64, 0x50, 0x46, 0x44, + 0x40, 0x28, 0x24, 0x3a, 0x4b, 0x4d, 0x5b, 0x71, + 0x90, 0x94, 0x71, 0x53, 0x68, 0x80, 0x7e, 0x7a, + 0x5d, 0x6a, 0x5a, 0x49, 0x65, 0x78, 0x71, 0x7d, + 0x6c, 0x6d, 0x71, 0x77, 0x7a, 0x77, 0x6e, 0x66, + 0x79, 0x83, 0x84, 0x7b, 0x7a, 0x85, 0x8c, 0x8b, + 0x83, 0x7d, 0x75, 0x6f, 0x6f, 0x74, 0x7c, 0x82, + 0x6c, 0x6f, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x88, + 0x76, 0x72, 0x6c, 0x64, 0x5d, 0x56, 0x52, 0x50, + 0x58, 0x4c, 0x41, 0x2c, 0x32, 0x75, 0x9f, 0x86, + 0x33, 0x0f, 0x0c, 0x43, 0x7f, 0x91, 0x84, 0x77, + 0xa2, 0x7e, 0x70, 0x82, 0x83, 0x5a, 0x2c, 0x18, + 0xb3, 0xd7, 0x96, 0x79, 0xcb, 0xc5, 0x69, 0x52, + 0xe2, 0xcc, 0x87, 0x67, 0x90, 0x9b, 0x70, 0x54, + 0x4b, 0x50, 0x5f, 0x78, 0x8c, 0x8b, 0x76, 0x62, + 0x39, 0x2a, 0x19, 0x19, 0x2d, 0x3c, 0x2f, 0x16, + 0x31, 0x3f, 0x45, 0x39, 0x2b, 0x29, 0x2e, 0x32, + 0x2e, 0x53, 0x5e, 0x6d, 0x8d, 0x81, 0x64, 0x6e, + 0x4f, 0x51, 0x9b, 0xba, 0x91, 0xa7, 0xbc, 0x7c, + 0x23, 0x2e, 0x94, 0x75, 0x5d, 0x79, 0x5e, 0xa5, + 0x7a, 0x8d, 0x95, 0x77, 0x3b, 0x11, 0x16, 0x31, + 0x2d, 0x43, 0xa1, 0xc8, 0xc9, 0x9c, 0x2b, 0x02, + 0x63, 0x8b, 0x67, 0x2c, 0x37, 0x4a, 0x45, 0x49, + 0x49, 0x48, 0x46, 0x43, 0x3f, 0x3c, 0x3a, 0x39, + 0x85, 0x74, 0x7a, 0x8d, 0x7d, 0x51, 0x41, 0x50, + 0x48, 0x44, 0x49, 0x51, 0x49, 0x3e, 0x4a, 0x61, + 0x68, 0x5d, 0x4c, 0x00, 0x48, 0xb9, 0x58, 0x0c, + 0x16, 0x3e, 0x32, 0x24, 0x3a, 0x31, 0x2d, 0x5c, + 0x35, 0x28, 0x16, 0x12, 0x30, 0x76, 0xce, 0xff, + 0xff, 0x90, 0x1f, 0x5f, 0xb7, 0x80, 0x3a, 0x53, + 0x52, 0x31, 0x22, 0x2c, 0x25, 0x0e, 0x12, 0x2b, + 0x45, 0xe5, 0xb7, 0x81, 0x85, 0x1e, 0x00, 0x43, + 0x37, 0x39, 0x38, 0x2f, 0x26, 0x25, 0x2d, 0x36, + 0x2e, 0x38, 0x29, 0x21, 0x31, 0x35, 0x38, 0x4e, + 0x42, 0x48, 0x3a, 0x38, 0x4e, 0x48, 0x32, 0x34, + 0x46, 0x39, 0x44, 0x74, 0x84, 0x4f, 0x26, 0x33, + 0x39, 0x42, 0x4c, 0x4e, 0x47, 0x3f, 0x3a, 0x38, + 0x45, 0x22, 0x11, 0x3a, 0x6d, 0x66, 0x3c, 0x25, + 0x24, 0x69, 0xb6, 0xc2, 0x89, 0x5f, 0x81, 0xc1, + 0x89, 0x5d, 0x2a, 0x14, 0x21, 0x39, 0x47, 0x49, + 0xf0, 0xe4, 0x56, 0x53, 0xe4, 0xff, 0x8b, 0x00, + 0x00, 0x0d, 0x2f, 0x23, 0x12, 0x42, 0x4f, 0x0c, + 0x35, 0x35, 0x34, 0x34, 0x35, 0x36, 0x37, 0x37, + 0x0f, 0x14, 0x34, 0x38, 0x28, 0x40, 0x3a, 0x00, + 0x42, 0x5a, 0x6f, 0x6a, 0x53, 0x44, 0x4b, 0x58, + 0x86, 0x64, 0x4d, 0x50, 0x4f, 0x45, 0x4c, 0x5f, + 0x2b, 0x23, 0x28, 0x4e, 0x66, 0x49, 0x3f, 0x66, + 0x37, 0x2f, 0x2d, 0x29, 0x2e, 0x5c, 0x79, 0x57, + 0x69, 0x68, 0x6b, 0x75, 0x7f, 0x7f, 0x76, 0x6c, + 0x72, 0x7e, 0x80, 0x73, 0x6b, 0x72, 0x7a, 0x7b, + 0x72, 0x72, 0x71, 0x71, 0x73, 0x76, 0x79, 0x7b, + 0x75, 0x71, 0x6b, 0x64, 0x5f, 0x58, 0x52, 0x4e, + 0x5a, 0x5b, 0x5c, 0x5c, 0x5c, 0x5b, 0x5a, 0x59, + 0x57, 0x3e, 0x4c, 0x4b, 0x1f, 0x1b, 0x3e, 0x48, + 0x21, 0x00, 0x00, 0x23, 0x50, 0x56, 0x45, 0x3a, + 0x69, 0x5b, 0x62, 0x76, 0x6b, 0x43, 0x2b, 0x2c, + 0x00, 0x3d, 0x29, 0x3e, 0xbb, 0xd3, 0x88, 0x77, + 0xd8, 0xc2, 0x6f, 0x39, 0x61, 0x8a, 0x81, 0x76, + 0xa0, 0x7d, 0x51, 0x36, 0x33, 0x3e, 0x46, 0x49, + 0xa6, 0xb6, 0x91, 0x45, 0x27, 0x3d, 0x3b, 0x18, + 0x2c, 0x45, 0x61, 0x69, 0x5c, 0x59, 0x76, 0x98, + 0x7c, 0x87, 0x6c, 0x59, 0x66, 0x53, 0x37, 0x42, + 0x75, 0x1f, 0x1b, 0x22, 0x00, 0x22, 0x97, 0xc4, + 0x75, 0x38, 0x61, 0x50, 0x73, 0xa3, 0x52, 0x56, + 0x5c, 0x9a, 0xc3, 0x9f, 0x4f, 0x1c, 0x22, 0x3d, + 0x00, 0x27, 0x87, 0x93, 0x7f, 0x60, 0x0f, 0x00, + 0x46, 0x6f, 0x61, 0x40, 0x42, 0x37, 0x25, 0x34, + 0x40, 0x36, 0x37, 0x50, 0x76, 0x90, 0x90, 0x86, + 0x58, 0x53, 0x3c, 0x2e, 0x4c, 0x6f, 0x5b, 0x29, + 0x18, 0x46, 0x5f, 0x4a, 0x37, 0x5a, 0xa2, 0xd9, + 0x85, 0xfa, 0xff, 0x7a, 0x31, 0x63, 0x9a, 0xe0, + 0x93, 0x49, 0x2c, 0x24, 0x13, 0x32, 0x4c, 0x29, + 0x55, 0x4d, 0x55, 0x7f, 0xb9, 0xe1, 0xe8, 0xdf, + 0xd1, 0xba, 0x5a, 0x2e, 0x56, 0x42, 0x19, 0x3a, + 0x2b, 0x1a, 0x18, 0x19, 0x03, 0x0b, 0x6e, 0xe5, + 0xf9, 0xbc, 0x50, 0x4d, 0x52, 0x30, 0x47, 0x50, + 0x20, 0x2a, 0x33, 0x32, 0x2a, 0x26, 0x2c, 0x34, + 0x0d, 0x38, 0x43, 0x3c, 0x3f, 0x37, 0x41, 0x6c, + 0x34, 0x41, 0x37, 0x34, 0x44, 0x3b, 0x28, 0x2e, + 0x3d, 0x34, 0x37, 0x50, 0x73, 0x84, 0x64, 0x30, + 0x6a, 0x54, 0x40, 0x44, 0x56, 0x5c, 0x4c, 0x38, + 0x3d, 0x60, 0x64, 0x5e, 0x62, 0x4a, 0x32, 0x3f, + 0x51, 0x49, 0x30, 0x21, 0x39, 0x58, 0x48, 0x1e, + 0x55, 0x26, 0x00, 0x0d, 0x44, 0x6f, 0x70, 0x5d, + 0x60, 0x9a, 0x55, 0x5a, 0x60, 0x2e, 0x69, 0x97, + 0x97, 0x5a, 0x55, 0x51, 0x23, 0x2f, 0x4d, 0x30, + 0x1b, 0x3a, 0x67, 0x85, 0x83, 0x60, 0x30, 0x0e, + 0x26, 0x4e, 0x40, 0x29, 0x39, 0x33, 0x23, 0x36, + 0x46, 0x47, 0x3f, 0x2c, 0x1f, 0x2e, 0x54, 0x77, + 0x4b, 0x39, 0x3b, 0x52, 0x56, 0x3c, 0x28, 0x28, + 0x14, 0x05, 0x54, 0xc6, 0xc9, 0x74, 0x30, 0x18, + 0x19, 0x17, 0x38, 0x84, 0x8c, 0x5d, 0x59, 0x63, + 0x62, 0x5f, 0x61, 0x6d, 0x7b, 0x7e, 0x73, 0x67, + 0x7a, 0x88, 0x8a, 0x79, 0x6d, 0x70, 0x78, 0x7a, + 0x69, 0x6a, 0x6c, 0x6d, 0x6b, 0x67, 0x62, 0x5f, + 0x71, 0x6d, 0x69, 0x6a, 0x6e, 0x6f, 0x6c, 0x68, + 0x5a, 0x5c, 0x5e, 0x5e, 0x5d, 0x59, 0x55, 0x53, + 0x58, 0x5b, 0x67, 0x45, 0x1d, 0x46, 0x64, 0x36, + 0x35, 0x32, 0x2e, 0x2c, 0x34, 0x45, 0x58, 0x65, + 0x5c, 0x7d, 0x7c, 0x49, 0x1b, 0x18, 0x27, 0x2c, + 0x42, 0x81, 0xa2, 0xb8, 0xc0, 0x7e, 0x5d, 0x98, + 0xd1, 0xe6, 0xaf, 0x68, 0x6b, 0x7e, 0x71, 0x67, + 0x74, 0x62, 0x52, 0x55, 0x6a, 0x81, 0x8e, 0x90, + 0xb1, 0xff, 0xe0, 0x45, 0x00, 0x26, 0x4d, 0x32, + 0x2d, 0x32, 0x43, 0x51, 0x46, 0x37, 0x49, 0x6a, + 0x6b, 0x7c, 0x67, 0x57, 0x69, 0x67, 0x65, 0x84, + 0x87, 0x60, 0x4e, 0x42, 0x54, 0xb0, 0xe2, 0xb1, + 0xdb, 0x9d, 0x9b, 0x81, 0x9d, 0xcd, 0xaa, 0xb6, + 0x86, 0xa7, 0xae, 0x83, 0x4d, 0x2e, 0x1d, 0x10, + 0x93, 0x8e, 0xa6, 0x7f, 0x6b, 0x66, 0x1d, 0x00, + 0x55, 0x61, 0x49, 0x3b, 0x48, 0x41, 0x56, 0x99, + 0x83, 0x66, 0x4b, 0x4b, 0x5b, 0x5b, 0x41, 0x24, + 0x39, 0x34, 0x1e, 0x14, 0x38, 0x64, 0x59, 0x2b, + 0x25, 0x3d, 0x2d, 0x19, 0x59, 0xb5, 0xa6, 0x4f, + 0x96, 0x96, 0x83, 0x70, 0x44, 0x4b, 0x7e, 0x63, + 0x62, 0x6c, 0x9d, 0x8f, 0x36, 0x1d, 0x3e, 0x3c, + 0x03, 0x39, 0x6c, 0x6b, 0x47, 0x35, 0x4e, 0x72, + 0x0d, 0x1b, 0x18, 0x23, 0x51, 0x6a, 0x4d, 0x28, + 0x37, 0x49, 0x83, 0xb1, 0x84, 0x28, 0x10, 0x35, + 0x3e, 0x19, 0x07, 0x49, 0x57, 0x4a, 0x61, 0x35, + 0x39, 0x35, 0x33, 0x37, 0x38, 0x2d, 0x15, 0x00, + 0x3b, 0x24, 0x40, 0x76, 0x90, 0x8d, 0x56, 0x04, + 0x2e, 0x4b, 0x49, 0x37, 0x2e, 0x22, 0x2a, 0x4d, + 0x37, 0x18, 0x30, 0x43, 0x1e, 0x24, 0x6a, 0x99, + 0x28, 0x24, 0x27, 0x3b, 0x58, 0x6e, 0x74, 0x71, + 0x54, 0x68, 0x37, 0x12, 0x3e, 0x50, 0x25, 0x09, + 0x39, 0x4c, 0x3b, 0x15, 0x25, 0x5e, 0x69, 0x47, + 0x1f, 0x2e, 0x39, 0x33, 0x26, 0x2a, 0x42, 0x5a, + 0x32, 0x33, 0x2e, 0x4d, 0x4e, 0x21, 0x2d, 0x5e, + 0x50, 0x14, 0x2c, 0x49, 0x29, 0x3b, 0x4e, 0x18, + 0x16, 0x1f, 0x30, 0x44, 0x56, 0x64, 0x6d, 0x72, + 0x6b, 0x44, 0x0f, 0x33, 0x94, 0x97, 0x4e, 0x2b, + 0x54, 0x48, 0x32, 0x19, 0x0d, 0x15, 0x2e, 0x43, + 0x00, 0x23, 0x59, 0x6c, 0x42, 0x09, 0x02, 0x1e, + 0x25, 0x3c, 0x79, 0x8d, 0x4f, 0x20, 0x3e, 0x6f, + 0x83, 0xe2, 0xd4, 0x9a, 0x7f, 0x77, 0x7f, 0x72, + 0x6a, 0x64, 0x63, 0x6e, 0x7c, 0x7e, 0x70, 0x61, + 0x70, 0x80, 0x83, 0x72, 0x63, 0x66, 0x70, 0x74, + 0x81, 0x81, 0x82, 0x80, 0x7c, 0x76, 0x70, 0x6c, + 0x7c, 0x77, 0x73, 0x76, 0x7d, 0x81, 0x7d, 0x77, + 0x60, 0x62, 0x65, 0x66, 0x64, 0x5f, 0x59, 0x55, + 0x43, 0x40, 0x65, 0x5c, 0x1f, 0x24, 0x4a, 0x3c, + 0x1d, 0x06, 0x1a, 0x4b, 0x4a, 0x1d, 0x19, 0x3f, + 0x41, 0x86, 0xad, 0x87, 0x4f, 0x44, 0x5c, 0x71, + 0x76, 0x71, 0x78, 0x8c, 0x83, 0x4e, 0x28, 0x2c, + 0x34, 0x86, 0x8b, 0x4d, 0x39, 0x3e, 0x37, 0x38, + 0x65, 0x5f, 0x5e, 0x6d, 0x83, 0x90, 0x8f, 0x88, + 0x96, 0xa1, 0x8e, 0x75, 0x96, 0xd6, 0xdf, 0xba, + 0x8c, 0x61, 0x4b, 0x5d, 0x64, 0x4c, 0x36, 0x36, + 0x1a, 0x2f, 0x2f, 0x46, 0x76, 0x69, 0x36, 0x26, + 0x25, 0x43, 0x7d, 0xa6, 0x9f, 0x81, 0x69, 0x5a, + 0x92, 0x58, 0x36, 0x3f, 0x71, 0x8d, 0x67, 0x41, + 0x3d, 0x48, 0x43, 0x3e, 0x66, 0xab, 0xd3, 0xd3, + 0xc4, 0xae, 0xad, 0x78, 0x6f, 0x78, 0x2b, 0x00, + 0x7b, 0x75, 0x5b, 0x5a, 0x67, 0x55, 0x75, 0xd0, + 0xb7, 0xcf, 0xd4, 0xa5, 0x5b, 0x2d, 0x31, 0x49, + 0x49, 0x3a, 0x43, 0x5c, 0x55, 0x34, 0x2d, 0x42, + 0x0f, 0x0e, 0x29, 0x69, 0xa3, 0xa2, 0x64, 0x26, + 0x28, 0x42, 0xaf, 0xff, 0x9e, 0x2a, 0x5f, 0x1e, + 0x3a, 0x58, 0x34, 0x06, 0x12, 0x2a, 0x68, 0xcc, + 0xa7, 0x64, 0x1e, 0x11, 0x31, 0x46, 0x31, 0x10, + 0x69, 0x19, 0x15, 0x36, 0x2f, 0x48, 0x66, 0x4d, + 0x87, 0x4d, 0x3e, 0x65, 0x65, 0x2e, 0x13, 0x26, + 0x2c, 0x57, 0x25, 0x19, 0x36, 0x45, 0x4e, 0x1f, + 0x52, 0x43, 0x43, 0x61, 0x86, 0x8b, 0x67, 0x40, + 0x21, 0x02, 0x41, 0x59, 0x1d, 0x4b, 0xa8, 0x9f, + 0x35, 0x5f, 0x64, 0x41, 0x21, 0x13, 0x36, 0x76, + 0x7f, 0x4b, 0x3d, 0x28, 0x0d, 0x4c, 0x88, 0x67, + 0x4c, 0x68, 0x7d, 0x70, 0x4d, 0x37, 0x3f, 0x52, + 0x2e, 0x1f, 0x05, 0x2e, 0x71, 0x6b, 0x77, 0xcd, + 0x5f, 0x28, 0x1b, 0x45, 0x51, 0x2f, 0x27, 0x44, + 0x46, 0x3b, 0x2b, 0x20, 0x1c, 0x1d, 0x1e, 0x1f, + 0x21, 0x24, 0x73, 0x67, 0x51, 0x55, 0x31, 0x54, + 0x32, 0x10, 0x23, 0x1e, 0x0e, 0x61, 0x87, 0x28, + 0x4c, 0x3d, 0x28, 0x19, 0x19, 0x29, 0x3e, 0x4d, + 0x69, 0x31, 0x63, 0xe2, 0xff, 0xff, 0xb1, 0x41, + 0x19, 0x1c, 0x22, 0x2a, 0x32, 0x38, 0x3b, 0x3c, + 0x72, 0x4a, 0x37, 0x4b, 0x5a, 0x48, 0x2c, 0x20, + 0x37, 0x47, 0x5b, 0x7d, 0x91, 0x74, 0x5e, 0x70, + 0x9b, 0x78, 0x65, 0x9a, 0xa6, 0x8b, 0x8f, 0x74, + 0x79, 0x71, 0x6d, 0x76, 0x83, 0x82, 0x72, 0x61, + 0x77, 0x89, 0x8e, 0x7d, 0x6f, 0x72, 0x7d, 0x83, + 0x80, 0x7f, 0x7e, 0x7c, 0x79, 0x76, 0x74, 0x73, + 0x71, 0x6b, 0x67, 0x6b, 0x74, 0x78, 0x73, 0x6d, + 0x61, 0x65, 0x69, 0x6d, 0x6c, 0x69, 0x63, 0x60, + 0x5d, 0x49, 0x51, 0x3a, 0x18, 0x4a, 0x76, 0x4e, + 0x21, 0x49, 0x46, 0x28, 0x4e, 0xa0, 0xa7, 0x6d, + 0x56, 0x42, 0x3e, 0x50, 0x58, 0x5b, 0x77, 0x9d, + 0x61, 0x76, 0x8a, 0x72, 0x4c, 0x50, 0x51, 0x30, + 0x00, 0x53, 0x74, 0x41, 0x3a, 0x66, 0x99, 0xc6, + 0xa6, 0x84, 0x5b, 0x4c, 0x5e, 0x84, 0xa6, 0xb9, + 0x67, 0x4b, 0x77, 0xdf, 0xff, 0xdd, 0xd4, 0xfb, + 0xbc, 0x6e, 0x41, 0x65, 0x90, 0x82, 0x55, 0x39, + 0x70, 0x8f, 0x7e, 0x55, 0x3c, 0x16, 0x08, 0x29, + 0x3a, 0x56, 0x69, 0x65, 0x41, 0x0d, 0x10, 0x45, + 0x95, 0x88, 0x5a, 0x3c, 0x25, 0x21, 0x44, 0x52, + 0x81, 0x7d, 0x58, 0x2c, 0x33, 0x64, 0x7b, 0x6e, + 0x2d, 0x3d, 0x69, 0x54, 0x5c, 0x71, 0x2c, 0x00, + 0x47, 0x36, 0x3e, 0x5b, 0x58, 0x36, 0x29, 0x37, + 0x88, 0xfb, 0x9b, 0x00, 0x00, 0x37, 0x39, 0x51, + 0x00, 0x47, 0xb1, 0xf4, 0xf1, 0xd0, 0xc6, 0xd2, + 0xdd, 0x5b, 0x00, 0x12, 0x2f, 0x1d, 0x16, 0x2e, + 0x22, 0x1f, 0x46, 0x6d, 0x46, 0x04, 0x1c, 0x6f, + 0x60, 0x5b, 0x31, 0x05, 0x25, 0x8c, 0xe2, 0xff, + 0x87, 0x5f, 0x82, 0xdf, 0xe3, 0x79, 0x26, 0x1f, + 0x5b, 0x30, 0x18, 0x24, 0x2b, 0x23, 0x2e, 0x4a, + 0x71, 0x51, 0x27, 0x0e, 0x0f, 0x20, 0x31, 0x3b, + 0x2e, 0x43, 0x48, 0x2e, 0x24, 0x49, 0x5f, 0x4d, + 0x2d, 0x24, 0x49, 0x4e, 0x60, 0x73, 0x5c, 0x74, + 0x37, 0x39, 0x8b, 0xd3, 0xbe, 0x99, 0x74, 0x3c, + 0x62, 0x86, 0xac, 0x66, 0x43, 0x67, 0x5c, 0x66, + 0x23, 0x2a, 0x2e, 0x2b, 0x28, 0x34, 0x4f, 0x65, + 0x7e, 0x62, 0x57, 0x5b, 0x48, 0x2d, 0x3f, 0x6a, + 0x0d, 0x03, 0x12, 0x37, 0x4b, 0x40, 0x34, 0x36, + 0x00, 0x86, 0x9e, 0x5d, 0x53, 0x29, 0x23, 0x85, + 0x46, 0x48, 0x69, 0x95, 0x92, 0x5e, 0x37, 0x32, + 0x36, 0x1d, 0x14, 0x22, 0x29, 0x32, 0x61, 0x9b, + 0xd1, 0xac, 0x59, 0x7d, 0xe0, 0xff, 0xc0, 0x23, + 0x13, 0x4a, 0x13, 0x8d, 0xfb, 0xf2, 0xed, 0x4e, + 0x00, 0x20, 0x9d, 0xff, 0xee, 0xa3, 0x5d, 0x1e, + 0x15, 0x43, 0x76, 0x89, 0x7b, 0x6a, 0x67, 0x6e, + 0x8c, 0x85, 0x40, 0x29, 0x68, 0x75, 0x4d, 0x4c, + 0xaf, 0x44, 0x33, 0x72, 0x70, 0x4d, 0x4b, 0x4f, + 0x5e, 0x30, 0x6c, 0x96, 0x70, 0x6f, 0x83, 0x82, + 0x62, 0x64, 0x6b, 0x75, 0x7e, 0x7d, 0x74, 0x6a, + 0x7c, 0x82, 0x87, 0x82, 0x78, 0x74, 0x78, 0x7e, + 0x6d, 0x6d, 0x6d, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, + 0x77, 0x7b, 0x7c, 0x76, 0x6d, 0x6b, 0x72, 0x7a, + 0x76, 0x72, 0x6f, 0x70, 0x72, 0x6e, 0x65, 0x5c, + 0x4e, 0x54, 0x3f, 0x25, 0x45, 0x83, 0x7b, 0x3c, + 0x38, 0x4b, 0x9a, 0xab, 0x91, 0x75, 0x63, 0x96, + 0x84, 0x6c, 0x69, 0x8e, 0x7a, 0x83, 0xcb, 0xbd, + 0x7a, 0x5b, 0xd9, 0xfc, 0x43, 0x00, 0x4e, 0x52, + 0x26, 0x30, 0x3f, 0x4d, 0x56, 0x57, 0x54, 0x50, + 0x28, 0x19, 0x3a, 0x6d, 0x5a, 0x22, 0x36, 0x80, + 0x97, 0x61, 0x90, 0xd6, 0x9b, 0x45, 0x5d, 0xa5, + 0xb2, 0x91, 0x6c, 0x5e, 0x66, 0x6e, 0x68, 0x5e, + 0x4e, 0x5b, 0x52, 0x37, 0x30, 0x3e, 0x3d, 0x2b, + 0x53, 0x59, 0x2d, 0x04, 0x19, 0x40, 0x67, 0x92, + 0xb0, 0x86, 0x6b, 0x4a, 0x33, 0x5e, 0x6a, 0x28, + 0x2e, 0x42, 0x5a, 0x66, 0x66, 0x65, 0x6b, 0x72, + 0x6d, 0x5b, 0x50, 0x5d, 0x6b, 0x5a, 0x25, 0x00, + 0x49, 0x46, 0x2e, 0x1a, 0x34, 0x62, 0x64, 0x44, + 0x15, 0x5c, 0x48, 0x14, 0x21, 0x32, 0x5e, 0xba, + 0xf1, 0xf3, 0xe2, 0xac, 0x63, 0x38, 0x44, 0x63, + 0x45, 0x10, 0x08, 0x35, 0x3b, 0x0a, 0x00, 0x10, + 0x5d, 0x23, 0x25, 0x81, 0xca, 0xb1, 0x63, 0x2f, + 0x21, 0x34, 0x31, 0x1e, 0x32, 0x68, 0x87, 0x83, + 0x4c, 0x30, 0x37, 0x59, 0x4b, 0x15, 0x08, 0x26, + 0x76, 0x3a, 0x2a, 0x4f, 0x4d, 0x28, 0x40, 0x85, + 0x34, 0x53, 0x68, 0x57, 0x30, 0x21, 0x39, 0x5a, + 0x6c, 0x57, 0x72, 0x6d, 0x41, 0x62, 0x77, 0x32, + 0x62, 0x55, 0xae, 0x8f, 0x3b, 0x78, 0x9f, 0x72, + 0x42, 0x75, 0xab, 0x8a, 0x43, 0x4b, 0x64, 0x46, + 0x39, 0x7c, 0xaa, 0xa1, 0x67, 0x3d, 0x4b, 0x5f, + 0x62, 0x5b, 0x49, 0x31, 0x22, 0x29, 0x43, 0x5b, + 0x9e, 0x89, 0x74, 0x64, 0x53, 0x53, 0x72, 0x99, + 0x7c, 0x94, 0x5d, 0x09, 0x2f, 0xa7, 0xba, 0x6c, + 0xb2, 0xed, 0xbe, 0x3b, 0x18, 0x56, 0x69, 0x40, + 0x6a, 0x86, 0xa6, 0xb7, 0xb3, 0x9d, 0x78, 0x59, + 0x83, 0x4f, 0x22, 0x37, 0x89, 0xd3, 0xe2, 0xcd, + 0xd1, 0xe0, 0xd6, 0xf9, 0xed, 0xb9, 0xc2, 0xb8, + 0xfd, 0xf9, 0x7b, 0x6c, 0xb5, 0x9b, 0x7b, 0x7f, + 0x92, 0x93, 0x68, 0x5b, 0x8b, 0x99, 0x85, 0x8d, + 0x78, 0x76, 0x79, 0x7c, 0x70, 0x66, 0x74, 0x8d, + 0x2e, 0x37, 0x3c, 0x5e, 0x8c, 0x84, 0x62, 0x5c, + 0x80, 0x61, 0x54, 0x73, 0x5f, 0x29, 0x28, 0x2b, + 0x27, 0x30, 0x39, 0x34, 0x44, 0x68, 0x6f, 0x5d, + 0x6d, 0x6b, 0x6b, 0x71, 0x79, 0x7d, 0x79, 0x74, + 0x75, 0x7a, 0x7e, 0x7a, 0x72, 0x6e, 0x71, 0x77, + 0x6b, 0x71, 0x7a, 0x80, 0x7f, 0x77, 0x6d, 0x65, + 0x69, 0x6b, 0x6c, 0x6c, 0x6c, 0x6f, 0x76, 0x7c, + 0x6f, 0x6b, 0x68, 0x68, 0x6a, 0x66, 0x5c, 0x54, + 0x64, 0x5f, 0x82, 0x90, 0x64, 0x48, 0x4d, 0x49, + 0x2d, 0x3b, 0x62, 0x4b, 0x46, 0x50, 0x18, 0x00, + 0x00, 0x29, 0x2f, 0x3e, 0x4a, 0x6a, 0x85, 0x43, + 0x3c, 0x90, 0xfb, 0xeb, 0x70, 0x31, 0x2f, 0x19, + 0x43, 0x42, 0x41, 0x44, 0x4b, 0x56, 0x61, 0x68, + 0xa0, 0x93, 0x81, 0x6b, 0x53, 0x44, 0x49, 0x57, + 0x74, 0x2e, 0x52, 0xa9, 0x91, 0x4a, 0x49, 0x6d, + 0x75, 0x5a, 0x37, 0x22, 0x23, 0x31, 0x3f, 0x47, + 0x35, 0x3f, 0x45, 0x48, 0x54, 0x69, 0x76, 0x76, + 0x84, 0x68, 0x3f, 0x40, 0x5f, 0x66, 0x80, 0xbd, + 0x5d, 0x3f, 0x43, 0x4b, 0x28, 0x0c, 0x1e, 0x39, + 0x6c, 0x83, 0x6f, 0x7e, 0xba, 0x9e, 0x4c, 0x38, + 0x84, 0x6b, 0x54, 0x53, 0x5b, 0x4c, 0x23, 0x00, + 0x45, 0x48, 0x3e, 0x3b, 0x5a, 0x72, 0x4b, 0x09, + 0x44, 0x3b, 0x33, 0x38, 0x3e, 0x45, 0x78, 0xc0, + 0xd8, 0xbf, 0x92, 0x61, 0x40, 0x34, 0x30, 0x2e, + 0x58, 0x24, 0x13, 0x33, 0x41, 0x35, 0x48, 0x75, + 0xa4, 0x86, 0x75, 0x84, 0x95, 0x89, 0x66, 0x4b, + 0x64, 0x76, 0x77, 0x63, 0x58, 0x57, 0x47, 0x2c, + 0x7f, 0x7e, 0x72, 0x54, 0x2f, 0x21, 0x38, 0x58, + 0xb3, 0x8f, 0xab, 0xe8, 0xc2, 0x55, 0x41, 0x81, + 0x3b, 0x38, 0x48, 0x77, 0xaa, 0xbc, 0xa5, 0x86, + 0x3e, 0x76, 0xb6, 0xb4, 0x81, 0x6b, 0x66, 0x4f, + 0x52, 0x94, 0xc6, 0x65, 0x36, 0x88, 0xa6, 0x9d, + 0x61, 0x41, 0x50, 0x61, 0x31, 0x0c, 0x28, 0x4e, + 0x4a, 0x5b, 0x4f, 0x80, 0x6f, 0x2c, 0x42, 0x45, + 0x5b, 0x51, 0x3d, 0x29, 0x21, 0x2d, 0x49, 0x5f, + 0x64, 0x75, 0x73, 0x56, 0x3a, 0x30, 0x2b, 0x23, + 0x51, 0x92, 0xb1, 0x8d, 0x6d, 0x78, 0x85, 0x7e, + 0x5a, 0x60, 0x7e, 0x62, 0x51, 0xbe, 0xdf, 0x62, + 0x58, 0x6b, 0x62, 0x40, 0x3e, 0x5b, 0x62, 0x4d, + 0x65, 0x78, 0x7e, 0x81, 0xa7, 0xd4, 0xcb, 0xa1, + 0xd0, 0xb3, 0x46, 0x38, 0x91, 0xe9, 0xe3, 0x67, + 0xac, 0xde, 0xf1, 0xc2, 0x9b, 0x5b, 0x4f, 0xd3, + 0xb1, 0x98, 0x3c, 0x12, 0x63, 0xb0, 0xb7, 0xb3, + 0xea, 0xa3, 0x7b, 0xa3, 0xdb, 0xe9, 0xe0, 0xdd, + 0x65, 0x2c, 0x22, 0x39, 0x34, 0x36, 0x5b, 0x7a, + 0x25, 0x25, 0x43, 0x55, 0x54, 0x59, 0x61, 0x69, + 0x4b, 0x53, 0x6c, 0xa3, 0xa5, 0x69, 0x65, 0x94, + 0x71, 0x6b, 0x66, 0x69, 0x70, 0x76, 0x77, 0x75, + 0x7f, 0x83, 0x85, 0x83, 0x7d, 0x7b, 0x7d, 0x81, + 0x82, 0x86, 0x8b, 0x8b, 0x83, 0x75, 0x66, 0x5c, + 0x76, 0x71, 0x6c, 0x6a, 0x6d, 0x70, 0x70, 0x6f, + 0x69, 0x65, 0x61, 0x61, 0x62, 0x5e, 0x54, 0x4b, + 0x44, 0x55, 0x5f, 0x48, 0x26, 0x2a, 0x46, 0x55, + 0x1b, 0x2e, 0x4d, 0x21, 0x12, 0x3d, 0x4c, 0x6b, + 0xa9, 0xd8, 0xbd, 0x98, 0x4d, 0x00, 0x0c, 0x2e, + 0x64, 0x57, 0x2e, 0x30, 0x54, 0x40, 0x37, 0x70, + 0x75, 0x68, 0x54, 0x42, 0x39, 0x39, 0x40, 0x45, + 0x6a, 0x6a, 0x3a, 0x00, 0x07, 0x53, 0x7c, 0x6f, + 0x69, 0x46, 0x46, 0x3c, 0x0e, 0x16, 0x5c, 0x8a, + 0x52, 0x4d, 0x43, 0x3c, 0x44, 0x61, 0x8b, 0xaa, + 0x26, 0x1c, 0x1a, 0x25, 0x32, 0x3e, 0x53, 0x67, + 0x41, 0x5d, 0x98, 0xf1, 0xff, 0xa7, 0x33, 0x16, + 0x58, 0x78, 0xb2, 0xe5, 0xc7, 0x5d, 0x2c, 0x51, + 0xd5, 0xf3, 0xc2, 0xc3, 0xff, 0xcd, 0x41, 0x1d, + 0x2d, 0x22, 0x20, 0x32, 0x49, 0x48, 0x2d, 0x10, + 0x2c, 0x03, 0x00, 0x1c, 0x3d, 0x43, 0x4e, 0x66, + 0x68, 0x44, 0x45, 0x68, 0x8c, 0xac, 0xa7, 0x7c, + 0x9b, 0x88, 0x6f, 0x6e, 0x8f, 0xa2, 0x7e, 0x48, + 0x67, 0x2d, 0x14, 0x3e, 0x6c, 0x72, 0x6c, 0x71, + 0x39, 0x70, 0x8a, 0x59, 0x16, 0x10, 0x4d, 0x8c, + 0x56, 0x57, 0x51, 0x48, 0x49, 0x55, 0x5d, 0x5c, + 0x37, 0x58, 0x5d, 0x3d, 0x2c, 0x3c, 0x44, 0x38, + 0x6d, 0x74, 0xa3, 0xc8, 0x91, 0x2b, 0x0f, 0x39, + 0x59, 0x4d, 0x45, 0x4b, 0x56, 0x51, 0x38, 0x20, + 0x5f, 0x8a, 0x57, 0x58, 0xc3, 0xbb, 0x6d, 0x7a, + 0xa3, 0x9b, 0x63, 0x00, 0x25, 0x82, 0x5c, 0x2d, + 0x33, 0x3c, 0x3d, 0x2c, 0x2c, 0x5a, 0x8e, 0xa1, + 0xff, 0xcd, 0x70, 0x63, 0x4f, 0x27, 0x3a, 0x48, + 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x3a, 0x44, 0x4b, + 0x60, 0x71, 0x5d, 0x2b, 0x1e, 0x45, 0x67, 0x6b, + 0x7d, 0x5e, 0x6b, 0x97, 0x87, 0x49, 0x3e, 0x68, + 0x85, 0x40, 0x5c, 0x76, 0x49, 0x6b, 0xad, 0x95, + 0x69, 0x64, 0x49, 0x27, 0x26, 0x47, 0x61, 0x65, + 0x53, 0x87, 0xa7, 0x8f, 0x66, 0x54, 0x51, 0x4e, + 0x81, 0x4d, 0x00, 0x1b, 0x65, 0x7e, 0x75, 0x2a, + 0x58, 0x52, 0x8d, 0x8c, 0x5c, 0x67, 0x9b, 0xd7, + 0xff, 0xc8, 0x87, 0x6c, 0x78, 0xc1, 0xe7, 0xbe, + 0x6d, 0xa1, 0xe2, 0xe6, 0x93, 0x50, 0x80, 0xe2, + 0xdd, 0x59, 0x42, 0x8a, 0xa1, 0x99, 0x85, 0x56, + 0x3f, 0x20, 0x58, 0x57, 0x3c, 0x47, 0x4b, 0x73, + 0xd1, 0xfa, 0xf6, 0xc6, 0x8a, 0x79, 0x85, 0x6e, + 0x80, 0x7c, 0x79, 0x7c, 0x83, 0x87, 0x85, 0x81, + 0x79, 0x7a, 0x7b, 0x7a, 0x78, 0x77, 0x78, 0x79, + 0x81, 0x7f, 0x7b, 0x79, 0x78, 0x7a, 0x7d, 0x7f, + 0x84, 0x7a, 0x70, 0x6f, 0x74, 0x77, 0x73, 0x6d, + 0x69, 0x65, 0x60, 0x60, 0x60, 0x5b, 0x51, 0x48, + 0x41, 0x4c, 0x31, 0x31, 0x56, 0x42, 0x1d, 0x2d, + 0x5f, 0x21, 0x1b, 0x1f, 0x40, 0x68, 0x73, 0xa4, + 0xf4, 0xf8, 0xbe, 0xce, 0xda, 0x9c, 0xb0, 0xf4, + 0xff, 0xa3, 0x22, 0x13, 0x4e, 0x44, 0x45, 0x93, + 0x9b, 0x7d, 0x50, 0x2c, 0x23, 0x36, 0x56, 0x6e, + 0x1c, 0x54, 0x6a, 0x53, 0x58, 0x79, 0x6b, 0x38, + 0x31, 0x46, 0x4d, 0x1c, 0x00, 0x39, 0x6d, 0x52, + 0x16, 0x29, 0x3b, 0x3f, 0x3e, 0x4d, 0x6e, 0x8b, + 0x93, 0x7d, 0x71, 0x72, 0x6b, 0x5d, 0x60, 0x70, + 0x42, 0x77, 0xa6, 0xda, 0xff, 0xd9, 0x6f, 0x2d, + 0x48, 0x5c, 0x4e, 0x4c, 0x61, 0x51, 0x60, 0xac, + 0xeb, 0xdf, 0xa1, 0x86, 0xa6, 0x95, 0x65, 0x61, + 0x3e, 0x3f, 0x48, 0x5a, 0x64, 0x54, 0x2e, 0x0d, + 0x5f, 0x4d, 0x4c, 0x57, 0x4d, 0x3f, 0x5f, 0x94, + 0x75, 0x54, 0x6a, 0xa3, 0xb6, 0x9a, 0x54, 0x07, + 0x09, 0x15, 0x0e, 0x03, 0x21, 0x57, 0x65, 0x4f, + 0x51, 0x2d, 0x1f, 0x3b, 0x5a, 0x5b, 0x4c, 0x43, + 0x3f, 0x74, 0xa1, 0x9d, 0x7d, 0x66, 0x5e, 0x5c, + 0x7d, 0x68, 0x51, 0x43, 0x3d, 0x3e, 0x4c, 0x5c, + 0x65, 0x80, 0x7b, 0x5c, 0x5f, 0x76, 0x5b, 0x21, + 0x31, 0x4e, 0x60, 0x4b, 0x2b, 0x28, 0x4a, 0x6e, + 0x90, 0x80, 0x64, 0x45, 0x31, 0x32, 0x42, 0x51, + 0xaf, 0xcf, 0x94, 0x8f, 0xe9, 0xcf, 0x83, 0xa1, + 0xa4, 0x76, 0xb6, 0xaf, 0x81, 0xb7, 0xb7, 0x73, + 0x56, 0x88, 0x95, 0x6b, 0x41, 0x3f, 0x60, 0x85, + 0x80, 0x41, 0x33, 0x43, 0x78, 0x95, 0x65, 0x4e, + 0x71, 0x62, 0x4d, 0x3c, 0x35, 0x37, 0x3c, 0x3f, + 0x53, 0x7f, 0x90, 0x75, 0x64, 0x6a, 0x61, 0x46, + 0x71, 0x78, 0x79, 0x6c, 0x5a, 0x4d, 0x4a, 0x4c, + 0x55, 0x28, 0x3d, 0x6a, 0x46, 0x0b, 0x15, 0x40, + 0x6f, 0x63, 0x66, 0x78, 0x78, 0x68, 0x66, 0x73, + 0x5c, 0x3f, 0x2b, 0x2e, 0x31, 0x34, 0x49, 0x67, + 0x99, 0xc0, 0xb1, 0xa5, 0x70, 0x30, 0x30, 0x16, + 0x13, 0x09, 0x09, 0x16, 0x14, 0x5e, 0xca, 0xc5, + 0x40, 0x1d, 0x3e, 0x71, 0x6e, 0x6a, 0x66, 0x45, + 0x3f, 0x30, 0x3d, 0x61, 0x68, 0x44, 0x22, 0x1a, + 0x06, 0x00, 0x62, 0xb2, 0x78, 0x42, 0x5b, 0x74, + 0x9f, 0x77, 0x4d, 0x32, 0x2c, 0x2e, 0x35, 0x4b, + 0x1d, 0x16, 0x2b, 0x59, 0x6f, 0x74, 0x78, 0x73, + 0x6b, 0x6a, 0x6e, 0x75, 0x7c, 0x7a, 0x70, 0x67, + 0x79, 0x78, 0x77, 0x78, 0x7a, 0x7b, 0x7a, 0x79, + 0x84, 0x7d, 0x74, 0x6d, 0x6e, 0x74, 0x7e, 0x84, + 0x78, 0x70, 0x6a, 0x6d, 0x76, 0x7d, 0x7d, 0x79, + 0x6f, 0x6a, 0x65, 0x64, 0x64, 0x5e, 0x53, 0x4a, + 0x34, 0x3e, 0x2c, 0x3d, 0x74, 0x70, 0x5c, 0x7a, + 0x73, 0x3f, 0x45, 0x47, 0x52, 0x53, 0x34, 0x4a, + 0xb4, 0xd9, 0xa2, 0x9f, 0xc3, 0xb1, 0xaf, 0xb2, + 0xb3, 0xb7, 0xae, 0x84, 0x50, 0x38, 0x2c, 0x1a, + 0x1d, 0x26, 0x34, 0x44, 0x53, 0x5e, 0x64, 0x67, + 0x34, 0x58, 0x72, 0x69, 0x5d, 0x67, 0x7c, 0x8a, + 0x78, 0x5a, 0x62, 0x89, 0xbc, 0xf2, 0xd8, 0x7b, + 0x54, 0x71, 0x8f, 0x90, 0x76, 0x59, 0x4c, 0x4c, + 0x54, 0x61, 0x77, 0x87, 0x80, 0x64, 0x44, 0x31, + 0x3e, 0xa6, 0xca, 0xbc, 0xea, 0xff, 0xa9, 0x36, + 0x48, 0x63, 0x5a, 0x57, 0x62, 0x4a, 0x58, 0xa5, + 0x76, 0x5e, 0x85, 0xb7, 0xbc, 0xbd, 0x9f, 0x55, + 0x4c, 0x4a, 0x4b, 0x4f, 0x4f, 0x41, 0x28, 0x14, + 0xdb, 0xff, 0xff, 0xd4, 0x9a, 0x8e, 0x93, 0x90, + 0x21, 0x08, 0x21, 0x72, 0x90, 0x5f, 0x53, 0x86, + 0x67, 0xa3, 0xa8, 0x5b, 0x1d, 0x28, 0x46, 0x4c, + 0x70, 0x80, 0x91, 0x91, 0x7d, 0x69, 0x67, 0x70, + 0x92, 0x98, 0xb2, 0xd5, 0xdb, 0xb1, 0x74, 0x4a, + 0x4a, 0x3b, 0x3e, 0x55, 0x61, 0x62, 0x71, 0x8a, + 0x56, 0x5b, 0x46, 0x2d, 0x3f, 0x60, 0x4e, 0x1c, + 0x16, 0x3e, 0x45, 0x1d, 0x0c, 0x2b, 0x4b, 0x4f, + 0x49, 0x48, 0x45, 0x47, 0x5c, 0x8d, 0xce, 0xfc, + 0xcc, 0xcf, 0xdd, 0xb9, 0x5b, 0x2d, 0x55, 0x87, + 0x84, 0x5b, 0x84, 0x6c, 0x2a, 0x33, 0x52, 0x7b, + 0x69, 0x4c, 0x27, 0x24, 0x2d, 0x21, 0x48, 0x9f, + 0x28, 0x3e, 0x91, 0x9c, 0xa8, 0xa9, 0x4f, 0x2d, + 0x31, 0x45, 0x68, 0x8b, 0x9c, 0x91, 0x73, 0x5a, + 0x97, 0x99, 0x81, 0x52, 0x2f, 0x2b, 0x33, 0x35, + 0x21, 0x5e, 0x8b, 0x7c, 0x53, 0x37, 0x28, 0x1f, + 0x41, 0x40, 0x24, 0x21, 0x39, 0x2e, 0x29, 0x50, + 0x50, 0x36, 0x35, 0x50, 0x52, 0x3c, 0x3f, 0x5b, + 0xa5, 0x6f, 0x4c, 0x53, 0x57, 0x4c, 0x59, 0x78, + 0xaa, 0xa2, 0x30, 0x00, 0x06, 0x5f, 0xa7, 0x7a, + 0x44, 0x74, 0x5a, 0x4d, 0x63, 0x89, 0xc0, 0xc0, + 0x75, 0x70, 0x51, 0x4d, 0x58, 0x38, 0x38, 0x7a, + 0x58, 0x5c, 0x61, 0x6a, 0x73, 0x74, 0x66, 0x55, + 0x88, 0x4d, 0x47, 0x67, 0x5f, 0x40, 0x2b, 0x1c, + 0x1d, 0x24, 0x34, 0xe0, 0xff, 0xa0, 0x8e, 0xc3, + 0xff, 0xde, 0xae, 0x72, 0x70, 0x7f, 0x66, 0x6b, + 0x6c, 0x6e, 0x73, 0x7c, 0x81, 0x7d, 0x71, 0x66, + 0x81, 0x7d, 0x7b, 0x7d, 0x83, 0x85, 0x83, 0x7f, + 0x85, 0x83, 0x7e, 0x78, 0x72, 0x6e, 0x6a, 0x69, + 0x73, 0x6f, 0x6a, 0x6a, 0x6e, 0x71, 0x72, 0x72, + 0x74, 0x6f, 0x69, 0x68, 0x66, 0x60, 0x55, 0x4b, + 0x3e, 0x41, 0x4d, 0x47, 0x2e, 0x32, 0x5a, 0x7e, + 0x5f, 0x73, 0x92, 0x61, 0x49, 0x68, 0x6a, 0x82, + 0x5a, 0x6d, 0x5e, 0x87, 0x9a, 0x83, 0xb0, 0xdb, + 0x6d, 0x61, 0xa5, 0xc2, 0x75, 0x4f, 0x53, 0x2e, + 0x08, 0x23, 0x4c, 0x6f, 0x7e, 0x77, 0x64, 0x54, + 0x2b, 0x47, 0x70, 0x80, 0x59, 0x24, 0x1c, 0x35, + 0x47, 0x0d, 0x3f, 0xbc, 0xee, 0xd8, 0xb2, 0x8d, + 0x3b, 0x5a, 0x7f, 0x8e, 0x7c, 0x53, 0x29, 0x11, + 0x05, 0x47, 0x87, 0xa4, 0xb1, 0xab, 0x7d, 0x46, + 0x54, 0xb5, 0xb2, 0x70, 0x8d, 0xc6, 0x93, 0x32, + 0x33, 0x3e, 0x55, 0x6f, 0x60, 0x3d, 0x72, 0xe3, + 0xd2, 0x68, 0x60, 0x80, 0x7c, 0xb5, 0xd1, 0x81, + 0x4c, 0x46, 0x3e, 0x35, 0x2e, 0x28, 0x21, 0x1d, + 0x7c, 0x8b, 0x6f, 0x2c, 0x0b, 0x27, 0x4e, 0x5c, + 0x56, 0x60, 0x4b, 0x5d, 0x7f, 0x4d, 0x3b, 0x8e, + 0x7a, 0xca, 0xe3, 0x9d, 0x65, 0x70, 0x82, 0x76, + 0x69, 0x9f, 0xd6, 0xe2, 0xc4, 0x97, 0x6f, 0x59, + 0x4d, 0x4f, 0x71, 0x9a, 0x8f, 0x68, 0x71, 0x9e, + 0x6d, 0x50, 0x48, 0x56, 0x4e, 0x30, 0x2d, 0x44, + 0x3d, 0x46, 0x44, 0x3f, 0x4d, 0x67, 0x70, 0x66, + 0x62, 0x74, 0x7c, 0x73, 0x6b, 0x6b, 0x63, 0x56, + 0x65, 0x7c, 0x80, 0x53, 0x13, 0x00, 0x14, 0x3d, + 0x39, 0x04, 0x21, 0x3a, 0x0e, 0x30, 0x98, 0xc2, + 0x45, 0x39, 0x62, 0x9c, 0xe7, 0xd1, 0x5d, 0x48, + 0x56, 0x85, 0x7e, 0x7a, 0xb6, 0xc7, 0x84, 0x4b, + 0x73, 0xaf, 0xda, 0xa3, 0x4d, 0x28, 0x33, 0x55, + 0x8d, 0x7d, 0x6c, 0x68, 0x6e, 0x73, 0x6f, 0x68, + 0x57, 0x60, 0x75, 0x84, 0x79, 0x61, 0x5d, 0x6a, + 0x71, 0x2f, 0x12, 0x36, 0x4e, 0x33, 0x19, 0x1b, + 0x7a, 0xa5, 0x99, 0x7c, 0x87, 0x7b, 0x47, 0x2a, + 0x53, 0x3d, 0x26, 0x1d, 0x20, 0x30, 0x4b, 0x63, + 0x27, 0x34, 0x42, 0x40, 0x30, 0x2d, 0x48, 0x6a, + 0x20, 0x28, 0x30, 0x97, 0xe7, 0xf5, 0xff, 0xfb, + 0xb6, 0x7e, 0x67, 0x42, 0x50, 0x6b, 0x3f, 0x34, + 0x20, 0x44, 0x41, 0x3d, 0x4c, 0x39, 0x2f, 0x57, + 0x3d, 0x6f, 0x79, 0x44, 0x1c, 0x25, 0x2f, 0x24, + 0x4f, 0x52, 0x46, 0x4b, 0x63, 0x5f, 0x5a, 0x6e, + 0x8f, 0xab, 0x84, 0x5d, 0x4b, 0x6f, 0xd1, 0xf2, + 0xee, 0xd7, 0xde, 0x87, 0x57, 0x75, 0x70, 0x96, + 0x70, 0x6e, 0x6e, 0x73, 0x78, 0x77, 0x6f, 0x67, + 0x77, 0x71, 0x6e, 0x72, 0x7a, 0x7e, 0x7a, 0x75, + 0x6a, 0x70, 0x79, 0x80, 0x82, 0x7e, 0x77, 0x72, + 0x77, 0x77, 0x74, 0x6f, 0x69, 0x67, 0x6a, 0x6e, + 0x73, 0x6e, 0x69, 0x66, 0x65, 0x5e, 0x52, 0x48, + 0x57, 0x47, 0x78, 0xa9, 0x88, 0x5e, 0x66, 0x75, + 0x80, 0x6f, 0x6d, 0x41, 0x4f, 0x8f, 0x9a, 0xab, + 0x8d, 0x41, 0x23, 0x73, 0x6c, 0x23, 0x35, 0x4b, + 0x72, 0x29, 0x54, 0x95, 0x5a, 0x1d, 0x1f, 0x19, + 0x37, 0x2e, 0x22, 0x19, 0x18, 0x1e, 0x28, 0x2f, + 0x2b, 0x29, 0x35, 0x45, 0x43, 0x3e, 0x5a, 0x83, + 0x0b, 0x15, 0x79, 0xda, 0xc4, 0x81, 0x5e, 0x4c, + 0x17, 0x2c, 0x4f, 0x6f, 0x79, 0x63, 0x39, 0x18, + 0x44, 0x8e, 0xb1, 0x9d, 0xaa, 0xd5, 0xc4, 0x85, + 0x34, 0x6b, 0x6b, 0x51, 0x66, 0x76, 0x5a, 0x3d, + 0x38, 0x3a, 0x60, 0x70, 0x40, 0x21, 0x45, 0x76, + 0x8f, 0x50, 0x4f, 0x65, 0x61, 0x7b, 0x80, 0x44, + 0xa3, 0xaa, 0xac, 0x9c, 0x77, 0x47, 0x1b, 0x01, + 0x83, 0x5f, 0x4a, 0x4e, 0x43, 0x2b, 0x31, 0x4f, + 0x63, 0xc0, 0xac, 0x95, 0xd7, 0xb3, 0x47, 0x37, + 0x85, 0xa4, 0x8b, 0x44, 0x32, 0x56, 0x4f, 0x1c, + 0x70, 0x70, 0x69, 0x61, 0x61, 0x60, 0x4a, 0x2f, + 0x63, 0x64, 0x8c, 0xac, 0x7b, 0x39, 0x5e, 0xbe, + 0xb3, 0x87, 0x6e, 0x73, 0x65, 0x48, 0x4d, 0x6f, + 0xc8, 0xd2, 0xcf, 0xad, 0x77, 0x4a, 0x36, 0x35, + 0x64, 0x46, 0x3a, 0x4d, 0x5b, 0x5a, 0x64, 0x78, + 0x48, 0x34, 0x35, 0x63, 0xa2, 0xba, 0x9b, 0x71, + 0x60, 0x84, 0xce, 0xec, 0xa4, 0x43, 0x21, 0x2c, + 0x25, 0x00, 0x5e, 0x92, 0x7b, 0x83, 0x63, 0x34, + 0x47, 0x3e, 0x10, 0x0d, 0x3d, 0x42, 0x44, 0x77, + 0x6b, 0x65, 0x2e, 0x3b, 0x50, 0x59, 0x83, 0x72, + 0x6b, 0x64, 0x61, 0x66, 0x6d, 0x65, 0x4f, 0x3b, + 0x5c, 0x52, 0x62, 0x81, 0x80, 0x6b, 0x7a, 0xa2, + 0x81, 0x47, 0x22, 0x2a, 0x2d, 0x21, 0x31, 0x55, + 0x71, 0x7e, 0x68, 0x3e, 0x3a, 0x5e, 0x82, 0x91, + 0x46, 0x55, 0x4b, 0x30, 0x34, 0x56, 0x66, 0x5a, + 0xbe, 0xc9, 0xa7, 0x59, 0x23, 0x21, 0x2c, 0x2a, + 0xa9, 0xe3, 0xd0, 0xbb, 0xb1, 0xc5, 0xf8, 0xe2, + 0x97, 0x35, 0xbb, 0xa8, 0x52, 0x6b, 0x44, 0x61, + 0x46, 0x4f, 0x6c, 0x62, 0x3f, 0x53, 0x60, 0x34, + 0x4c, 0x86, 0x8e, 0x59, 0x4b, 0x6f, 0x6c, 0x3e, + 0x34, 0x5c, 0x3f, 0x1d, 0x39, 0x44, 0x4e, 0x83, + 0x4f, 0x44, 0xa3, 0x91, 0x7a, 0xe0, 0xd7, 0x7e, + 0x43, 0x3a, 0xb4, 0x95, 0x47, 0x69, 0x68, 0x7e, + 0x88, 0x82, 0x7c, 0x7c, 0x81, 0x84, 0x82, 0x7e, + 0x7e, 0x78, 0x74, 0x78, 0x82, 0x87, 0x82, 0x7c, + 0x67, 0x6e, 0x79, 0x83, 0x86, 0x83, 0x7d, 0x78, + 0x6f, 0x74, 0x78, 0x74, 0x6f, 0x6f, 0x78, 0x82, + 0x71, 0x6b, 0x66, 0x63, 0x61, 0x5a, 0x4e, 0x45, + 0x39, 0x3b, 0x43, 0x5a, 0x88, 0xac, 0x99, 0x69, + 0x68, 0x55, 0x69, 0x47, 0x18, 0x09, 0x14, 0x5d, + 0x66, 0x78, 0xaa, 0xda, 0x8b, 0x3e, 0x51, 0x39, + 0x3a, 0x69, 0xc0, 0xd0, 0x7f, 0x42, 0x29, 0x07, + 0x51, 0x62, 0x7a, 0x89, 0x86, 0x72, 0x56, 0x43, + 0x27, 0x2c, 0x3a, 0x4e, 0x5a, 0x56, 0x49, 0x40, + 0x5a, 0x67, 0x79, 0x5e, 0x35, 0x40, 0x3d, 0x05, + 0x38, 0x3c, 0x4d, 0x6a, 0x7d, 0x70, 0x45, 0x1f, + 0xd2, 0xff, 0xe0, 0x82, 0x7b, 0xcd, 0xe3, 0xaf, + 0x7b, 0x6e, 0x57, 0x57, 0x56, 0x2d, 0x21, 0x4d, + 0x34, 0x40, 0x64, 0x5b, 0x37, 0x4e, 0x59, 0x22, + 0x18, 0x35, 0x5a, 0x72, 0x77, 0x74, 0x73, 0x75, + 0x85, 0xad, 0xdd, 0xec, 0xc6, 0x78, 0x24, 0x00, + 0xb5, 0x8c, 0x5e, 0x4d, 0x5f, 0x7b, 0x8c, 0x8f, + 0x71, 0x8c, 0xbd, 0xf3, 0xee, 0x96, 0x4e, 0x4d, + 0x6c, 0x80, 0x6e, 0x3f, 0x3e, 0x6a, 0x7a, 0x65, + 0x4f, 0x39, 0x20, 0x36, 0x8e, 0xd6, 0xbd, 0x75, + 0x5f, 0x81, 0x88, 0x57, 0x1c, 0x14, 0x40, 0x6e, + 0x8d, 0x5b, 0x1d, 0x06, 0x29, 0x67, 0x91, 0x9e, + 0x88, 0xdc, 0xb4, 0x56, 0x5a, 0x6c, 0x5b, 0x61, + 0x8c, 0xc6, 0xa3, 0x2a, 0x0d, 0x6c, 0xaa, 0x98, + 0x4b, 0x86, 0x8e, 0x99, 0xc7, 0xa1, 0x4a, 0x30, + 0x5a, 0xbb, 0xcc, 0x9a, 0x76, 0x4e, 0x59, 0xa8, + 0xab, 0xb7, 0xc6, 0xb0, 0x63, 0x27, 0x46, 0x8e, + 0x6e, 0x8b, 0x92, 0x66, 0x27, 0x01, 0x00, 0x01, + 0x8b, 0x84, 0x7b, 0x5a, 0x56, 0x9b, 0xad, 0x65, + 0x3e, 0x66, 0x8c, 0x85, 0x78, 0x88, 0x7d, 0x49, + 0x66, 0xff, 0xb5, 0x5e, 0x90, 0x93, 0x89, 0x60, + 0x26, 0x2a, 0x45, 0x63, 0x5a, 0x34, 0x20, 0x27, + 0x2a, 0x37, 0x1c, 0x1c, 0x36, 0x15, 0x18, 0x6f, + 0x4f, 0x65, 0x5b, 0x49, 0x75, 0xb0, 0x91, 0x3e, + 0x09, 0x89, 0xc9, 0x89, 0x50, 0x6a, 0x8c, 0x87, + 0x8a, 0x84, 0x9e, 0xc4, 0xb3, 0x7d, 0x6c, 0x84, + 0x99, 0x63, 0x68, 0x94, 0x6e, 0x1c, 0x36, 0x9d, + 0x7c, 0x7c, 0x75, 0x67, 0x59, 0x55, 0x5f, 0x69, + 0x75, 0x7f, 0x63, 0x4c, 0x4b, 0x2d, 0x1d, 0x3e, + 0x4a, 0x58, 0x63, 0x62, 0x59, 0x5a, 0x69, 0x79, + 0x70, 0x6c, 0x69, 0x59, 0x36, 0x14, 0x0d, 0x1d, + 0x1d, 0x45, 0x4b, 0x4a, 0x6d, 0x83, 0x79, 0x74, + 0x84, 0x7c, 0x74, 0x71, 0x74, 0x75, 0x71, 0x6c, + 0x71, 0x74, 0x79, 0x7f, 0x83, 0x86, 0x87, 0x87, + 0x7c, 0x7e, 0x81, 0x82, 0x80, 0x7c, 0x78, 0x75, + 0x80, 0x7d, 0x79, 0x76, 0x75, 0x77, 0x7a, 0x7c, + 0x73, 0x69, 0x5d, 0x59, 0x5d, 0x62, 0x63, 0x62, + 0x4e, 0x42, 0x3a, 0x39, 0x71, 0xdc, 0xd7, 0x61, + 0x15, 0x12, 0x3e, 0x8c, 0xa9, 0x80, 0x50, 0x41, + 0x67, 0xa3, 0x90, 0x51, 0x49, 0x4e, 0x3e, 0x3b, + 0x3b, 0x90, 0xb1, 0x64, 0x0a, 0x03, 0x3b, 0x6a, + 0xb6, 0xa1, 0x98, 0x74, 0x4f, 0x70, 0x8c, 0x69, + 0x29, 0x67, 0x52, 0x31, 0x5b, 0x68, 0x4a, 0x4d, + 0x88, 0x73, 0x76, 0x51, 0x1d, 0x40, 0x56, 0x16, + 0x8a, 0x5d, 0x62, 0x6f, 0x48, 0x31, 0x42, 0x48, + 0x80, 0xbb, 0xa1, 0x63, 0x5a, 0x4f, 0x4a, 0x6e, + 0x4c, 0x4c, 0x53, 0x40, 0x26, 0x39, 0x41, 0x19, + 0x57, 0x65, 0x50, 0x2c, 0x3b, 0x6a, 0x68, 0x3e, + 0x51, 0x69, 0x6a, 0x4e, 0x41, 0x4f, 0x55, 0x4a, + 0x8e, 0xa0, 0x96, 0x7d, 0x9b, 0x6e, 0x09, 0x23, + 0x8c, 0x6b, 0x48, 0x41, 0x59, 0x7a, 0x90, 0x98, + 0x8c, 0x85, 0x7c, 0x80, 0x89, 0x8f, 0xac, 0xd8, + 0xfa, 0xe2, 0xac, 0x78, 0x77, 0xaa, 0xdf, 0xf7, + 0xbe, 0xd8, 0xc5, 0xa4, 0xcc, 0xff, 0xd5, 0x66, + 0x34, 0x66, 0x85, 0x96, 0xcd, 0xff, 0xd6, 0x7d, + 0x54, 0x6c, 0x8b, 0x84, 0x46, 0x1a, 0x48, 0x9a, + 0x92, 0x8e, 0x46, 0x04, 0x21, 0x5d, 0x70, 0x6f, + 0xfa, 0xff, 0xec, 0xca, 0xc5, 0xca, 0xa6, 0x6e, + 0x63, 0x68, 0x49, 0x4d, 0x78, 0x5e, 0x2b, 0x31, + 0x62, 0xa9, 0x82, 0x38, 0x65, 0xaa, 0xa1, 0x86, + 0x59, 0x8e, 0x9e, 0x6c, 0x3f, 0x4a, 0x6a, 0x79, + 0x37, 0x4c, 0x40, 0x40, 0xa1, 0xff, 0xe6, 0x6d, + 0x79, 0x5c, 0xa1, 0xf7, 0xd9, 0x90, 0x71, 0x68, + 0x3e, 0x4c, 0x5e, 0x73, 0x9a, 0xbc, 0x9c, 0x55, + 0xa9, 0xbd, 0x44, 0x44, 0x90, 0x70, 0x40, 0x09, + 0x0e, 0x20, 0x54, 0x7e, 0x64, 0x29, 0x21, 0x44, + 0x56, 0x3a, 0x28, 0x53, 0x83, 0x61, 0x23, 0x14, + 0x59, 0xa0, 0xc5, 0x9e, 0x70, 0x67, 0x63, 0x52, + 0x46, 0x4e, 0x4a, 0x30, 0x12, 0x0c, 0x25, 0x41, + 0x0f, 0x51, 0xb2, 0xf0, 0xe0, 0xa4, 0x7b, 0x76, + 0x99, 0x40, 0x19, 0x67, 0xc8, 0xd1, 0x8f, 0x52, + 0x21, 0x26, 0x32, 0x43, 0x54, 0x5e, 0x5f, 0x5c, + 0x89, 0x3d, 0x09, 0x3d, 0x7b, 0x60, 0x5d, 0xa7, + 0x4e, 0x40, 0x3c, 0x52, 0x6f, 0x76, 0x5e, 0x42, + 0x82, 0x46, 0x35, 0x25, 0x34, 0x4a, 0x48, 0x75, + 0x8f, 0x50, 0x35, 0x51, 0x5f, 0x5a, 0x6d, 0x91, + 0x7d, 0x78, 0x75, 0x78, 0x81, 0x86, 0x85, 0x82, + 0x6c, 0x6b, 0x6a, 0x6b, 0x70, 0x77, 0x7e, 0x83, + 0x7b, 0x7c, 0x7f, 0x80, 0x7e, 0x7b, 0x76, 0x73, + 0x6a, 0x69, 0x68, 0x69, 0x6c, 0x71, 0x77, 0x7b, + 0x6e, 0x63, 0x57, 0x52, 0x54, 0x58, 0x58, 0x56, + 0x4d, 0x4d, 0x68, 0x5f, 0x24, 0x15, 0x29, 0x24, + 0x6b, 0x4e, 0x41, 0x4d, 0x50, 0x54, 0x7d, 0xb3, + 0x18, 0x3b, 0x31, 0x17, 0x11, 0x00, 0x08, 0x3a, + 0x2d, 0x2d, 0x2f, 0x30, 0x2e, 0x39, 0x5c, 0x80, + 0x56, 0x50, 0x5f, 0x54, 0x41, 0x6c, 0x8c, 0x68, + 0x26, 0x3f, 0x46, 0x7e, 0xd8, 0xd0, 0x8f, 0x81, + 0x78, 0x75, 0x95, 0x9d, 0x8e, 0xad, 0xa9, 0x5c, + 0x1b, 0x3c, 0x66, 0x52, 0x23, 0x39, 0x61, 0x56, + 0x48, 0x38, 0x16, 0x20, 0x3f, 0x2e, 0x42, 0x9a, + 0x42, 0x19, 0x3d, 0x65, 0x2a, 0x05, 0x6d, 0xf3, + 0x7b, 0x71, 0x5c, 0x4b, 0x52, 0x62, 0x5c, 0x49, + 0x3a, 0x31, 0x2e, 0x37, 0x41, 0x44, 0x44, 0x46, + 0x97, 0xb0, 0xa3, 0x73, 0x81, 0x61, 0x07, 0x1b, + 0x9c, 0xa5, 0xb9, 0xcf, 0xd8, 0xc6, 0xa0, 0x81, + 0x76, 0x67, 0x63, 0x7f, 0xb1, 0xcd, 0xa8, 0x69, + 0x6f, 0x69, 0x74, 0x89, 0x8a, 0x76, 0x6c, 0x73, + 0x8c, 0xd7, 0xdf, 0xa5, 0xb1, 0xec, 0xc2, 0x51, + 0x77, 0x6b, 0x80, 0xb5, 0xd3, 0xc0, 0xa0, 0x91, + 0x91, 0x8e, 0xbb, 0xf1, 0xd0, 0x75, 0x56, 0x78, + 0x6d, 0x45, 0x2f, 0x2a, 0x38, 0x6d, 0x94, 0x89, + 0x5f, 0x39, 0x22, 0x27, 0x27, 0x26, 0x46, 0x74, + 0x90, 0x51, 0x26, 0x69, 0xca, 0xbf, 0x7c, 0x6c, + 0x64, 0x57, 0x2e, 0x39, 0x85, 0x9b, 0x69, 0x45, + 0x52, 0x71, 0x6e, 0x41, 0x29, 0x39, 0x46, 0x3f, + 0x48, 0x3c, 0x3f, 0x6a, 0xac, 0xcb, 0xa3, 0x68, + 0x43, 0x62, 0xa5, 0xb5, 0x81, 0x69, 0x60, 0x3a, + 0x4e, 0x4c, 0x40, 0x4c, 0x85, 0xb7, 0xb2, 0x94, + 0xc1, 0xad, 0x64, 0x49, 0x1c, 0x00, 0x1e, 0x41, + 0x4c, 0x16, 0x19, 0x62, 0x82, 0x57, 0x35, 0x3d, + 0x66, 0x58, 0x71, 0x87, 0x6d, 0x5b, 0x66, 0x6c, + 0x57, 0x57, 0x4e, 0x3e, 0x35, 0x30, 0x23, 0x12, + 0x38, 0x1f, 0x13, 0x27, 0x3d, 0x3b, 0x2a, 0x1d, + 0x3a, 0x87, 0xd4, 0xea, 0xe0, 0xd7, 0xd3, 0xcf, + 0x6e, 0x47, 0x56, 0x82, 0x60, 0x13, 0x20, 0x73, + 0x78, 0x68, 0x5c, 0x61, 0x68, 0x59, 0x32, 0x0f, + 0x38, 0x54, 0x58, 0x65, 0x7f, 0x70, 0x64, 0x86, + 0x60, 0x56, 0x43, 0x2d, 0x1f, 0x21, 0x2e, 0x3b, + 0x6d, 0x7e, 0x6e, 0x6d, 0xe7, 0xd8, 0x3e, 0x59, + 0x44, 0x16, 0x24, 0x59, 0x6d, 0x74, 0x74, 0x60, + 0x7b, 0x76, 0x72, 0x74, 0x79, 0x7a, 0x76, 0x70, + 0x64, 0x67, 0x6d, 0x74, 0x7b, 0x81, 0x85, 0x87, + 0x8a, 0x8b, 0x8e, 0x8f, 0x8d, 0x8a, 0x85, 0x82, + 0x88, 0x84, 0x7c, 0x73, 0x6d, 0x69, 0x68, 0x68, + 0x71, 0x65, 0x58, 0x50, 0x51, 0x52, 0x51, 0x4f, + 0x3f, 0x31, 0x61, 0x8c, 0x5e, 0x1f, 0x16, 0x21, + 0x3d, 0x38, 0x45, 0x5d, 0x58, 0x33, 0x17, 0x12, + 0x43, 0x81, 0xc8, 0xff, 0xf6, 0x84, 0x32, 0x44, + 0x4e, 0x21, 0x2b, 0x7c, 0xb2, 0x95, 0x5d, 0x42, + 0x57, 0x47, 0x4b, 0x44, 0x49, 0x9c, 0xe7, 0xdf, + 0xb8, 0x90, 0x67, 0x7a, 0x91, 0x54, 0x11, 0x14, + 0x45, 0x33, 0x36, 0x35, 0x38, 0x63, 0x76, 0x4f, + 0x3a, 0x31, 0x39, 0x32, 0x2a, 0x4c, 0x52, 0x1c, + 0x11, 0x48, 0x4c, 0x25, 0x10, 0x12, 0x3e, 0x83, + 0x4b, 0x00, 0x00, 0x47, 0x8f, 0xb7, 0xc2, 0xb1, + 0x4a, 0x35, 0x28, 0x2d, 0x34, 0x31, 0x2e, 0x31, + 0x50, 0x34, 0x34, 0x58, 0x67, 0x4e, 0x39, 0x3b, + 0xa9, 0xca, 0xb9, 0x69, 0x61, 0x54, 0x0c, 0x14, + 0x5f, 0x64, 0x6d, 0x77, 0x7a, 0x71, 0x61, 0x54, + 0x90, 0xbc, 0xe2, 0xc1, 0x89, 0x8b, 0x93, 0x72, + 0x38, 0x48, 0x8e, 0xe2, 0xe5, 0x96, 0x54, 0x46, + 0x00, 0x36, 0x51, 0x37, 0x43, 0x79, 0x7b, 0x4b, + 0xa3, 0x6b, 0x59, 0x69, 0x41, 0x00, 0x00, 0x44, + 0x8e, 0x8c, 0xb0, 0xd9, 0xba, 0x61, 0x2a, 0x2b, + 0x40, 0x36, 0x79, 0x9f, 0x6b, 0x5b, 0x6b, 0x50, + 0x50, 0x3c, 0x43, 0x63, 0x68, 0x58, 0x67, 0x8e, + 0x48, 0x40, 0x57, 0x7b, 0x62, 0x1f, 0x2c, 0x7c, + 0xb9, 0x8b, 0x6d, 0x84, 0x99, 0x7c, 0x5d, 0x61, + 0x6a, 0x44, 0x34, 0x40, 0x3c, 0x23, 0x22, 0x39, + 0x2d, 0x3a, 0x63, 0x85, 0x6e, 0x38, 0x30, 0x4e, + 0x6d, 0x3a, 0x49, 0x64, 0x38, 0x19, 0x35, 0x4d, + 0x2b, 0x63, 0x85, 0x97, 0xa5, 0x87, 0x56, 0x47, + 0x77, 0x5a, 0x6c, 0x9e, 0xac, 0xcd, 0xea, 0xba, + 0x39, 0x1e, 0x33, 0x62, 0x4e, 0x13, 0x20, 0x65, + 0x79, 0x64, 0x9d, 0xcf, 0xb9, 0xbc, 0xc0, 0x90, + 0x84, 0x74, 0x6d, 0x73, 0x74, 0x6a, 0x64, 0x67, + 0x21, 0x2c, 0x22, 0x19, 0x3d, 0x67, 0x4a, 0x09, + 0x8f, 0x74, 0x42, 0x2b, 0x55, 0x81, 0x58, 0x07, + 0x3f, 0x20, 0x2c, 0x59, 0x56, 0x30, 0x44, 0x84, + 0x5e, 0x43, 0x30, 0x42, 0x67, 0x75, 0x5d, 0x3d, + 0x35, 0x77, 0x74, 0x43, 0x3d, 0x48, 0x56, 0x74, + 0x56, 0x63, 0x69, 0x60, 0x56, 0x63, 0x8a, 0xad, + 0x76, 0x55, 0x38, 0x1f, 0x4c, 0x7d, 0x6b, 0x6d, + 0x57, 0x2b, 0x33, 0x65, 0x79, 0x74, 0x75, 0x77, + 0x65, 0x63, 0x65, 0x6e, 0x79, 0x7e, 0x7c, 0x77, + 0x78, 0x80, 0x89, 0x8d, 0x86, 0x76, 0x62, 0x55, + 0x62, 0x64, 0x66, 0x67, 0x66, 0x62, 0x5d, 0x5b, + 0x4e, 0x50, 0x55, 0x5d, 0x69, 0x76, 0x81, 0x88, + 0x7a, 0x6e, 0x5f, 0x57, 0x56, 0x56, 0x54, 0x51, + 0x36, 0x2f, 0x41, 0x47, 0x30, 0x3f, 0x84, 0xbc, + 0xb9, 0xab, 0xb6, 0xe1, 0xff, 0xe2, 0x93, 0x50, + 0x88, 0x98, 0xa7, 0xce, 0xe2, 0xa9, 0x83, 0xa8, + 0x96, 0x67, 0x52, 0x73, 0x92, 0x84, 0x60, 0x4b, + 0x3d, 0x4a, 0x72, 0x75, 0x58, 0x62, 0x5a, 0x1b, + 0x36, 0x2d, 0x24, 0x26, 0x24, 0x1c, 0x35, 0x68, + 0x29, 0x32, 0x44, 0x50, 0x5e, 0x8a, 0xba, 0xcb, + 0x84, 0x32, 0x21, 0x4f, 0x6b, 0x7e, 0x85, 0x70, + 0x5e, 0x96, 0x95, 0x4f, 0x26, 0x42, 0x7c, 0xa5, + 0x93, 0xc0, 0xf0, 0xdd, 0xa6, 0x95, 0x78, 0x36, + 0x46, 0x48, 0x4a, 0x50, 0x5c, 0x68, 0x6e, 0x6e, + 0x69, 0x54, 0x4a, 0x54, 0x5c, 0x5c, 0x69, 0x7e, + 0xbf, 0xe0, 0xcc, 0x68, 0x4f, 0x53, 0x1a, 0x15, + 0x5d, 0x69, 0x7b, 0x8c, 0x9c, 0xab, 0xba, 0xc3, + 0xb5, 0xbb, 0xc5, 0x8b, 0x3d, 0x54, 0x81, 0x67, + 0x86, 0x65, 0x66, 0x8a, 0x8f, 0x74, 0x7a, 0x9e, + 0xc2, 0xb9, 0xa4, 0x83, 0x5d, 0x47, 0x4b, 0x5a, + 0x48, 0x2f, 0x18, 0x1a, 0x31, 0x41, 0x37, 0x24, + 0x57, 0x53, 0x5e, 0x7f, 0x9d, 0x9d, 0x82, 0x68, + 0x55, 0x4a, 0x8b, 0xac, 0x6e, 0x52, 0x57, 0x34, + 0x22, 0x82, 0xd2, 0xc0, 0x74, 0x49, 0x60, 0x88, + 0x3c, 0x32, 0x51, 0x65, 0x2f, 0x11, 0x71, 0xf4, + 0xe1, 0xc7, 0x8f, 0x4c, 0x3b, 0x68, 0x86, 0x77, + 0x4c, 0x25, 0x19, 0x38, 0x4b, 0x43, 0x47, 0x5c, + 0x4a, 0x7c, 0x95, 0x81, 0x72, 0x77, 0x69, 0x4a, + 0x74, 0x51, 0x56, 0x5d, 0x4d, 0x58, 0x5d, 0x37, + 0x45, 0x5c, 0x46, 0x43, 0x72, 0x7b, 0x86, 0xbf, + 0x73, 0x36, 0x5d, 0x81, 0x75, 0xab, 0xe5, 0xe1, + 0x61, 0x6a, 0x97, 0xbd, 0x96, 0x51, 0x58, 0x95, + 0x9a, 0xb5, 0xf2, 0xd0, 0x4b, 0x1d, 0x3c, 0x36, + 0x18, 0x56, 0x98, 0x9f, 0x71, 0x58, 0x85, 0xc7, + 0xb4, 0xa5, 0x7a, 0x4e, 0x50, 0x70, 0x78, 0x66, + 0x00, 0x35, 0x56, 0x3f, 0x2f, 0x40, 0x44, 0x32, + 0x4f, 0xd8, 0xff, 0xbb, 0x6f, 0x8a, 0xb6, 0xb6, + 0xd2, 0x9d, 0x64, 0x4f, 0x5b, 0x60, 0x4b, 0x30, + 0x33, 0x2e, 0x1f, 0x38, 0x5f, 0x4e, 0x46, 0x76, + 0x56, 0x5c, 0x74, 0x9c, 0xbc, 0xb8, 0x93, 0x6e, + 0x3e, 0x71, 0x5f, 0xa0, 0xff, 0xd5, 0x78, 0x52, + 0x00, 0x0c, 0x10, 0x25, 0x5d, 0x80, 0x77, 0x6a, + 0x86, 0x81, 0x7e, 0x7f, 0x7f, 0x79, 0x6d, 0x62, + 0x5d, 0x67, 0x75, 0x7f, 0x7f, 0x75, 0x66, 0x5c, + 0x6c, 0x6e, 0x70, 0x71, 0x6f, 0x6c, 0x67, 0x64, + 0x5e, 0x5d, 0x5d, 0x5e, 0x62, 0x68, 0x6f, 0x73, + 0x7b, 0x6f, 0x61, 0x58, 0x57, 0x58, 0x56, 0x53, + 0x4f, 0x42, 0x4a, 0x70, 0xa5, 0xc6, 0xaa, 0x70, + 0x5f, 0x64, 0x7a, 0xa7, 0xd6, 0xde, 0xb0, 0x7b, + 0x99, 0xac, 0xab, 0xbd, 0xd2, 0x97, 0x3f, 0x23, + 0x3e, 0x5a, 0x5c, 0x36, 0x19, 0x1f, 0x2a, 0x28, + 0x36, 0x36, 0x4d, 0x44, 0x29, 0x44, 0x50, 0x20, + 0x3f, 0x52, 0x54, 0x2b, 0x04, 0x0f, 0x27, 0x27, + 0xca, 0xdb, 0xd4, 0xaa, 0x71, 0x43, 0x46, 0x6a, + 0x4c, 0x14, 0x10, 0x22, 0x15, 0x22, 0x54, 0x6d, + 0x29, 0x20, 0x5c, 0xc6, 0xfb, 0xeb, 0xca, 0xb7, + 0xa1, 0x9d, 0xca, 0xdf, 0x9f, 0x5a, 0x43, 0x38, + 0x24, 0x48, 0x53, 0x3e, 0x44, 0x66, 0x6d, 0x55, + 0x4c, 0x54, 0x44, 0x23, 0x25, 0x62, 0xb2, 0xe4, + 0xcd, 0xdc, 0xc9, 0x6a, 0x4d, 0x5b, 0x2b, 0x1a, + 0x57, 0x70, 0x8f, 0xa0, 0xa3, 0xa2, 0xa5, 0xab, + 0x3e, 0x07, 0x22, 0x5c, 0x86, 0xdc, 0xff, 0xb6, + 0xd7, 0x9d, 0x61, 0x46, 0x4d, 0x74, 0xba, 0xf9, + 0xdc, 0xa5, 0x79, 0x63, 0x39, 0x0a, 0x10, 0x3b, + 0x8b, 0x68, 0x4c, 0x55, 0x70, 0x7b, 0x6d, 0x5b, + 0x9d, 0x7b, 0x52, 0x47, 0x5f, 0x6c, 0x49, 0x19, + 0x24, 0x08, 0x05, 0x11, 0x26, 0x58, 0x77, 0x64, + 0x3e, 0x8d, 0xa2, 0x52, 0x08, 0x0e, 0x32, 0x40, + 0x6b, 0x28, 0x20, 0x38, 0x26, 0x21, 0x46, 0x61, + 0xae, 0x61, 0x38, 0x37, 0x38, 0x51, 0x66, 0x56, + 0x48, 0x54, 0x47, 0x2b, 0x33, 0x54, 0x57, 0x3d, + 0x40, 0x44, 0x4d, 0x4f, 0x3b, 0x22, 0x1d, 0x29, + 0x58, 0x72, 0x74, 0x41, 0x3f, 0x96, 0x98, 0x27, + 0x45, 0x4d, 0x2c, 0x51, 0xb8, 0xbb, 0x98, 0xc0, + 0x9d, 0x23, 0x4e, 0x9d, 0xa7, 0x97, 0x64, 0x50, + 0x82, 0x8f, 0xbb, 0xef, 0xf8, 0xce, 0x9d, 0x86, + 0x6e, 0x58, 0x4e, 0x44, 0x45, 0x64, 0x67, 0x3c, + 0x77, 0x6e, 0x5b, 0x4d, 0x56, 0x71, 0x84, 0x89, + 0x99, 0x60, 0x49, 0x5e, 0x53, 0x2e, 0x3d, 0x75, + 0x41, 0xa5, 0xe8, 0xb4, 0x47, 0x15, 0x36, 0x69, + 0x85, 0x7d, 0x40, 0x00, 0x10, 0x5f, 0x71, 0x46, + 0xe1, 0xb2, 0x79, 0x5c, 0x60, 0x6c, 0x6d, 0x67, + 0x02, 0x42, 0x5b, 0x5a, 0x67, 0x59, 0x46, 0x58, + 0x5a, 0x68, 0x7d, 0x8c, 0x88, 0x6c, 0x44, 0x26, + 0x7e, 0x78, 0x8a, 0xba, 0x61, 0x16, 0x5d, 0x61, + 0x7a, 0xec, 0xfd, 0xa5, 0x73, 0x76, 0x79, 0x78, + 0x70, 0x6f, 0x72, 0x79, 0x7f, 0x7d, 0x73, 0x69, + 0x77, 0x77, 0x77, 0x76, 0x74, 0x72, 0x70, 0x6f, + 0x76, 0x78, 0x7a, 0x7c, 0x7a, 0x76, 0x72, 0x6f, + 0x70, 0x6e, 0x6a, 0x68, 0x68, 0x6a, 0x6d, 0x70, + 0x74, 0x69, 0x5b, 0x54, 0x54, 0x56, 0x55, 0x53, + 0x3b, 0x3b, 0x54, 0x88, 0xb7, 0xb0, 0x69, 0x1e, + 0x2c, 0x6f, 0xb1, 0xc5, 0xc1, 0xb8, 0xa5, 0x8f, + 0x7a, 0x7b, 0x5d, 0x5a, 0x79, 0x67, 0x41, 0x44, + 0x6c, 0xbf, 0xe3, 0xa4, 0x57, 0x40, 0x43, 0x3e, + 0x59, 0x72, 0xab, 0xb7, 0x91, 0x83, 0x5e, 0x0b, + 0x68, 0x5a, 0x46, 0x1a, 0x04, 0x38, 0x57, 0x2e, + 0x25, 0x76, 0xc2, 0xe8, 0xcf, 0x66, 0x15, 0x19, + 0xe1, 0xbd, 0x91, 0x4a, 0x0b, 0x12, 0x19, 0x00, + 0x46, 0x14, 0x0b, 0x25, 0x3b, 0x60, 0x7b, 0x6e, + 0x9b, 0x86, 0xae, 0xcb, 0x82, 0x32, 0x30, 0x4c, + 0x3d, 0x6e, 0x78, 0x50, 0x45, 0x62, 0x61, 0x3e, + 0x2d, 0x59, 0x67, 0x47, 0x3c, 0x6e, 0xb0, 0xd4, + 0xc5, 0xb6, 0xa7, 0x65, 0x53, 0x62, 0x31, 0x17, + 0x80, 0x84, 0x7e, 0x69, 0x53, 0x51, 0x66, 0x7c, + 0x9d, 0x67, 0x95, 0xb9, 0x86, 0x9c, 0xd8, 0xc4, + 0x68, 0x65, 0x4e, 0x33, 0x3c, 0x65, 0x88, 0x92, + 0x39, 0x25, 0x1f, 0x34, 0x4e, 0x62, 0x7c, 0x95, + 0x4d, 0x45, 0x55, 0x75, 0x83, 0x8f, 0xc1, 0xfd, + 0x84, 0x86, 0x8b, 0x83, 0x61, 0x40, 0x44, 0x5e, + 0x48, 0x5f, 0x41, 0x2a, 0x66, 0xb0, 0xc5, 0xc0, + 0x91, 0x74, 0x37, 0x14, 0x3c, 0x69, 0x34, 0x00, + 0x27, 0x1c, 0x47, 0x5c, 0x32, 0x36, 0x60, 0x61, + 0x85, 0x17, 0x23, 0x82, 0x89, 0x60, 0x55, 0x4f, + 0x60, 0x72, 0x64, 0x37, 0x25, 0x36, 0x38, 0x24, + 0x61, 0x3a, 0x49, 0x76, 0x59, 0x16, 0x36, 0x98, + 0x75, 0x35, 0x3d, 0x66, 0x59, 0x51, 0x6f, 0x7f, + 0xd7, 0xcc, 0x81, 0x7f, 0xc6, 0x9a, 0x56, 0x83, + 0xc2, 0x7c, 0x97, 0x6d, 0x1f, 0x00, 0x00, 0x31, + 0x31, 0x63, 0x94, 0xaa, 0xb3, 0xb6, 0xa1, 0x82, + 0x27, 0x81, 0xb0, 0xa4, 0x99, 0x86, 0x6c, 0x65, + 0x2e, 0x25, 0x0d, 0x12, 0x5c, 0xb2, 0xbb, 0x8e, + 0x6f, 0x37, 0x33, 0x67, 0x6b, 0x3c, 0x3b, 0x6d, + 0x60, 0x3a, 0x21, 0x2c, 0x40, 0x43, 0x41, 0x45, + 0x09, 0x00, 0x2c, 0xb6, 0xff, 0xe9, 0x98, 0x6b, + 0x7b, 0x66, 0x49, 0x36, 0x34, 0x3e, 0x4b, 0x54, + 0x44, 0xbc, 0xc5, 0x62, 0x39, 0x4e, 0x61, 0x6d, + 0x39, 0x54, 0x6e, 0x6c, 0x58, 0x50, 0x61, 0x77, + 0x21, 0x3f, 0x39, 0x43, 0x24, 0x09, 0x64, 0xb5, + 0xff, 0xdb, 0x9a, 0x68, 0x58, 0x5d, 0x6b, 0x7b, + 0x6d, 0x6d, 0x6f, 0x74, 0x77, 0x71, 0x63, 0x57, + 0x76, 0x75, 0x75, 0x77, 0x7c, 0x84, 0x8c, 0x91, + 0x75, 0x77, 0x79, 0x7a, 0x79, 0x75, 0x71, 0x6e, + 0x68, 0x65, 0x61, 0x5e, 0x5d, 0x5f, 0x62, 0x64, + 0x73, 0x69, 0x5c, 0x57, 0x59, 0x5d, 0x5e, 0x5c, + 0x4b, 0x3c, 0x3c, 0x56, 0x6c, 0x61, 0x46, 0x38, + 0x4a, 0x8b, 0xad, 0x89, 0x5b, 0x56, 0x65, 0x6a, + 0x9d, 0x8f, 0x73, 0x70, 0x67, 0x30, 0x2e, 0x79, + 0x9b, 0xb5, 0xba, 0x8e, 0x53, 0x34, 0x39, 0x46, + 0x62, 0x61, 0x77, 0x74, 0x66, 0x92, 0xb0, 0x8b, + 0x42, 0x23, 0x31, 0x3a, 0x32, 0x6a, 0xa8, 0xa0, + 0xa0, 0x9c, 0x81, 0x92, 0xc1, 0xb1, 0xac, 0xe9, + 0xe8, 0xd6, 0xd2, 0xc3, 0xb9, 0xdc, 0xe0, 0xa9, + 0x26, 0x2f, 0x3e, 0x1f, 0x09, 0x58, 0xa5, 0x98, + 0x5d, 0x4a, 0x5a, 0x65, 0x47, 0x36, 0x2f, 0x17, + 0x46, 0x6a, 0x77, 0x5e, 0x4b, 0x4e, 0x4b, 0x3b, + 0x2a, 0x4c, 0x69, 0x69, 0x5b, 0x5f, 0x77, 0x8c, + 0xab, 0x7b, 0x72, 0x56, 0x56, 0x60, 0x28, 0x09, + 0x8f, 0xab, 0xc8, 0xc9, 0xb2, 0x9c, 0x96, 0x9a, + 0x99, 0x54, 0x8e, 0xc2, 0x78, 0x5b, 0x72, 0x4e, + 0x00, 0x20, 0x39, 0x2d, 0x37, 0x53, 0x46, 0x1c, + 0x45, 0x4d, 0x46, 0x3f, 0x57, 0x78, 0x72, 0x51, + 0x12, 0x58, 0x74, 0x51, 0x50, 0x88, 0xa6, 0x95, + 0x55, 0x1d, 0x19, 0x55, 0x6d, 0x41, 0x1d, 0x22, + 0x2d, 0x96, 0x8e, 0x4a, 0x57, 0x60, 0x3e, 0x36, + 0x2d, 0x57, 0x6e, 0x65, 0x6f, 0x9b, 0xbf, 0xc6, + 0x91, 0x5f, 0x5a, 0x56, 0x40, 0x6b, 0x8e, 0x66, + 0x4b, 0x1e, 0x39, 0x5c, 0x48, 0x4f, 0x58, 0x2d, + 0x54, 0x41, 0x41, 0x4b, 0x39, 0x1d, 0x2d, 0x57, + 0x6e, 0x59, 0x41, 0x32, 0x25, 0x21, 0x30, 0x44, + 0x47, 0x40, 0x6d, 0x88, 0x67, 0x64, 0x84, 0x89, + 0x96, 0xd7, 0xdc, 0xf9, 0xff, 0xaf, 0x3f, 0x68, + 0xa5, 0x76, 0x78, 0x3f, 0x60, 0xa9, 0x71, 0x68, + 0x72, 0x62, 0x45, 0x53, 0xaf, 0xff, 0xe7, 0x90, + 0x57, 0xc7, 0xd7, 0x9c, 0x7d, 0x4a, 0x1a, 0x27, + 0x00, 0x87, 0xf7, 0xc4, 0x5f, 0x3e, 0x48, 0x4b, + 0x89, 0x58, 0x22, 0x0b, 0x11, 0x1e, 0x26, 0x2b, + 0x2b, 0x10, 0x18, 0x43, 0x58, 0x58, 0x77, 0xab, + 0x77, 0x52, 0x34, 0x25, 0x0b, 0x00, 0x2a, 0x6a, + 0x49, 0x4b, 0x48, 0x3e, 0x35, 0x36, 0x42, 0x4f, + 0x8f, 0xc1, 0xc3, 0xaa, 0x9f, 0x7c, 0x5a, 0x65, + 0x24, 0x25, 0x2f, 0x45, 0x58, 0x57, 0x40, 0x2a, + 0x59, 0x5e, 0x5d, 0x42, 0x35, 0x75, 0xd4, 0xfd, + 0xf3, 0xba, 0x94, 0x7e, 0x68, 0x6e, 0x7a, 0x6d, + 0x67, 0x69, 0x70, 0x7b, 0x84, 0x83, 0x78, 0x6e, + 0x78, 0x79, 0x7a, 0x7b, 0x7a, 0x77, 0x74, 0x72, + 0x6b, 0x6d, 0x6f, 0x70, 0x6f, 0x6b, 0x67, 0x64, + 0x6e, 0x6b, 0x68, 0x67, 0x67, 0x6a, 0x6e, 0x71, + 0x79, 0x6f, 0x64, 0x60, 0x64, 0x69, 0x6a, 0x69, + 0x63, 0x51, 0x3f, 0x41, 0x45, 0x3b, 0x38, 0x47, + 0x6b, 0x9b, 0xab, 0x85, 0x67, 0x6f, 0x74, 0x68, + 0x67, 0x5d, 0x65, 0x85, 0x67, 0x0a, 0x25, 0xb3, + 0x73, 0x71, 0x97, 0xd1, 0xd4, 0x9d, 0x70, 0x69, + 0x6a, 0x63, 0x70, 0x65, 0x53, 0x80, 0xa2, 0x7f, + 0x3d, 0x3c, 0x94, 0xcd, 0x93, 0x75, 0x9d, 0xae, + 0xe3, 0xc6, 0x93, 0xac, 0xe5, 0xad, 0x59, 0x5f, + 0x7d, 0x78, 0xa7, 0xb9, 0x78, 0x47, 0x54, 0x63, + 0x77, 0x32, 0x2e, 0x3a, 0x19, 0x21, 0x4a, 0x4c, + 0x46, 0x24, 0x2c, 0x3c, 0x2f, 0x3a, 0x5f, 0x6b, + 0x32, 0x42, 0x56, 0x5b, 0x4b, 0x3a, 0x3b, 0x47, + 0x28, 0x19, 0x1a, 0x2c, 0x30, 0x32, 0x55, 0x83, + 0x94, 0x4f, 0x49, 0x48, 0x55, 0x5b, 0x1d, 0x00, + 0x46, 0x6c, 0xa1, 0xc4, 0xc1, 0x9b, 0x67, 0x43, + 0x2f, 0x65, 0xa2, 0xb6, 0xa0, 0x84, 0x7d, 0x84, + 0x4f, 0x4c, 0x49, 0x49, 0x4a, 0x4a, 0x48, 0x45, + 0x65, 0x92, 0x9c, 0x76, 0x64, 0x70, 0x66, 0x43, + 0x80, 0x63, 0x1c, 0x1b, 0x80, 0xb5, 0x7c, 0x3d, + 0x09, 0x2b, 0x38, 0x25, 0x1e, 0x31, 0x3b, 0x32, + 0x37, 0x78, 0x9e, 0x83, 0x5f, 0x5a, 0x5c, 0x53, + 0x63, 0x6e, 0x77, 0x76, 0x73, 0x7b, 0x91, 0xa5, + 0x96, 0x6e, 0x52, 0x48, 0x30, 0x1f, 0x49, 0x8b, + 0x24, 0x59, 0x3d, 0x11, 0x2b, 0x36, 0x2f, 0x4b, + 0x23, 0x40, 0x5f, 0x88, 0xc6, 0xdb, 0x8a, 0x1d, + 0x76, 0x2e, 0x1d, 0x14, 0x4e, 0x8e, 0x66, 0x5b, + 0x6e, 0xa5, 0x7e, 0x58, 0x97, 0xb7, 0x99, 0x97, + 0x9d, 0x9a, 0x64, 0x24, 0x39, 0x81, 0x88, 0x53, + 0x45, 0x8e, 0xb0, 0xa4, 0x80, 0x45, 0x5c, 0xc5, + 0xd1, 0x85, 0x96, 0xc8, 0xa8, 0x8b, 0x93, 0x8b, + 0x71, 0xa7, 0x91, 0x2a, 0x00, 0x26, 0x4b, 0x3e, + 0x8b, 0xc8, 0xf5, 0xeb, 0xc9, 0xac, 0x8b, 0x6b, + 0xa3, 0xaa, 0x8f, 0x61, 0x5c, 0x72, 0x60, 0x32, + 0x2f, 0x76, 0x6d, 0x43, 0x57, 0x6e, 0x73, 0x8e, + 0xb8, 0xb5, 0x88, 0x77, 0x7a, 0x37, 0x0b, 0x3c, + 0x59, 0x37, 0x2c, 0x45, 0x56, 0x4d, 0x48, 0x50, + 0x74, 0x72, 0x5d, 0x70, 0x92, 0x68, 0x40, 0x63, + 0x55, 0x33, 0x45, 0x77, 0x64, 0x1b, 0x0e, 0x3f, + 0x47, 0x2d, 0x20, 0x2e, 0x2c, 0x1f, 0x59, 0xc3, + 0xb8, 0x97, 0x7c, 0x7b, 0x80, 0x7d, 0x7d, 0x84, + 0x86, 0x83, 0x7f, 0x7b, 0x79, 0x78, 0x78, 0x78, + 0x85, 0x7e, 0x77, 0x75, 0x76, 0x74, 0x6c, 0x65, + 0x6d, 0x6e, 0x70, 0x73, 0x76, 0x78, 0x7a, 0x7b, + 0x77, 0x6e, 0x68, 0x6c, 0x77, 0x7d, 0x7a, 0x74, + 0x79, 0x71, 0x67, 0x64, 0x65, 0x66, 0x63, 0x5f, + 0x58, 0x2e, 0x3a, 0x7e, 0x95, 0x66, 0x43, 0x4a, + 0x1b, 0x66, 0x84, 0x5c, 0x50, 0x82, 0xa9, 0xa4, + 0x81, 0x55, 0x77, 0xa6, 0x79, 0x41, 0x49, 0x5f, + 0xb6, 0xf0, 0xeb, 0xcb, 0xcf, 0xb5, 0x7a, 0x61, + 0x5b, 0x44, 0x28, 0x23, 0x3b, 0x56, 0x5b, 0x51, + 0x05, 0x15, 0x5d, 0xa7, 0x8c, 0x37, 0x2a, 0x5f, + 0x19, 0x4f, 0x99, 0xc5, 0xb7, 0x88, 0x61, 0x53, + 0xa5, 0x7d, 0x73, 0x81, 0x65, 0x2f, 0x32, 0x62, + 0x30, 0x3a, 0x43, 0x43, 0x38, 0x27, 0x17, 0x0e, + 0x10, 0x13, 0x37, 0x47, 0x2c, 0x28, 0x2f, 0x1e, + 0x3f, 0x10, 0x32, 0x6b, 0x61, 0x59, 0x5e, 0x46, + 0x45, 0x22, 0x0e, 0x16, 0x18, 0x15, 0x2c, 0x51, + 0x49, 0x40, 0x40, 0x26, 0x33, 0x2e, 0x00, 0x01, + 0x5d, 0x61, 0x60, 0x55, 0x4b, 0x52, 0x69, 0x7e, + 0x99, 0x7d, 0x5a, 0x45, 0x45, 0x4f, 0x57, 0x5a, + 0x45, 0x3b, 0x39, 0x49, 0x63, 0x72, 0x70, 0x66, + 0x94, 0x96, 0x62, 0x0d, 0x00, 0x47, 0xaf, 0xe9, + 0xff, 0xf6, 0xd1, 0xd1, 0xdb, 0xa7, 0x76, 0x84, + 0x5c, 0x74, 0x5f, 0x22, 0x12, 0x3e, 0x5d, 0x57, + 0x0a, 0x0d, 0x24, 0x3c, 0x37, 0x36, 0x6b, 0xb2, + 0x5d, 0x5b, 0x5f, 0x6c, 0x76, 0x6d, 0x52, 0x3a, + 0x54, 0x39, 0x2e, 0x41, 0x53, 0x4e, 0x42, 0x3e, + 0x47, 0x6e, 0xa4, 0xa0, 0x54, 0x27, 0x51, 0x8e, + 0xac, 0xb9, 0xba, 0xad, 0xa6, 0xa2, 0x8d, 0x72, + 0x19, 0x42, 0xa2, 0xb7, 0xd4, 0xf7, 0xc2, 0xb0, + 0x9a, 0xaf, 0x82, 0x57, 0x91, 0xdf, 0xe5, 0xc9, + 0xbd, 0xa6, 0x7b, 0x5c, 0x62, 0x76, 0x6d, 0x51, + 0x28, 0x82, 0xe2, 0xc1, 0x5c, 0x57, 0x7e, 0x6b, + 0x93, 0x79, 0x83, 0x78, 0x4c, 0x63, 0x99, 0x9c, + 0xa6, 0xa0, 0x7f, 0x58, 0x54, 0x62, 0x4c, 0x21, + 0x39, 0x60, 0x75, 0x6a, 0x6f, 0x99, 0xc5, 0xd8, + 0x7a, 0xbc, 0xdb, 0xaf, 0x7d, 0x7a, 0x89, 0x8d, + 0x94, 0x4e, 0x5d, 0x67, 0x33, 0x57, 0x9e, 0x8d, + 0x4d, 0x87, 0x9c, 0xa7, 0xb3, 0x7e, 0x4a, 0x5b, + 0xcd, 0x82, 0x3f, 0x30, 0x31, 0x26, 0x21, 0x29, + 0x01, 0x10, 0x4d, 0x61, 0x35, 0x32, 0x40, 0x23, + 0x48, 0x2b, 0x11, 0x12, 0x28, 0x48, 0x6a, 0x83, + 0x9a, 0x75, 0x7e, 0x44, 0x32, 0x79, 0x72, 0x4b, + 0x1c, 0x42, 0x63, 0x6c, 0x6e, 0x75, 0x77, 0x71, + 0x76, 0x74, 0x71, 0x6f, 0x6d, 0x6c, 0x6b, 0x6b, + 0x6b, 0x67, 0x65, 0x6a, 0x73, 0x78, 0x76, 0x72, + 0x6d, 0x6d, 0x6d, 0x6c, 0x6c, 0x6b, 0x6b, 0x6b, + 0x67, 0x6a, 0x6c, 0x6a, 0x66, 0x61, 0x5e, 0x5e, + 0x81, 0x79, 0x6f, 0x6b, 0x6d, 0x6d, 0x6a, 0x66, + 0x57, 0x3a, 0x2f, 0x3f, 0x43, 0x34, 0x34, 0x47, + 0x4a, 0x2e, 0x12, 0x24, 0x6c, 0xb5, 0xc3, 0xab, + 0xe6, 0xd4, 0xed, 0xe8, 0x9a, 0x7b, 0xb3, 0xe7, + 0xf8, 0xae, 0x72, 0xaa, 0xff, 0xec, 0xab, 0xad, + 0xc6, 0xdc, 0xbd, 0x72, 0x53, 0x69, 0x68, 0x46, + 0x6c, 0x38, 0x40, 0x8c, 0xa8, 0x6d, 0x34, 0x2b, + 0x59, 0x6a, 0x5f, 0x41, 0x46, 0x68, 0x6d, 0x55, + 0x3c, 0x61, 0x7d, 0x7a, 0x6d, 0x64, 0x56, 0x45, + 0x09, 0x28, 0x49, 0x51, 0x44, 0x37, 0x3b, 0x45, + 0x64, 0x4d, 0x4c, 0x41, 0x26, 0x3a, 0x66, 0x6f, + 0xb5, 0x78, 0x5e, 0x67, 0x5d, 0x4e, 0x46, 0x3b, + 0x44, 0x2f, 0x29, 0x33, 0x2c, 0x15, 0x11, 0x20, + 0x17, 0x1c, 0x30, 0x2a, 0x44, 0x43, 0x09, 0x12, + 0x5e, 0x56, 0x4d, 0x4d, 0x56, 0x60, 0x67, 0x69, + 0x2b, 0x48, 0x5e, 0x52, 0x3a, 0x41, 0x71, 0xa1, + 0x95, 0x83, 0x72, 0x6f, 0x74, 0x71, 0x5f, 0x4d, + 0x10, 0x9c, 0xff, 0xf7, 0xa2, 0x8b, 0xc8, 0xff, + 0xff, 0xbe, 0x65, 0x4e, 0x63, 0x40, 0x13, 0x1d, + 0x98, 0xbc, 0xb4, 0x7a, 0x5a, 0x67, 0x63, 0x45, + 0x53, 0x31, 0x3c, 0x84, 0xbd, 0xb4, 0x8f, 0x7b, + 0x8e, 0xa3, 0xa7, 0x82, 0x4f, 0x40, 0x62, 0x8d, + 0x6d, 0x65, 0x52, 0x47, 0x55, 0x68, 0x5e, 0x45, + 0x51, 0x67, 0xc9, 0xd6, 0x51, 0x0d, 0x3b, 0x59, + 0x44, 0x3a, 0x54, 0x9c, 0xdb, 0xe9, 0xd4, 0xc0, + 0xb6, 0xbd, 0xde, 0xac, 0x92, 0x9b, 0x68, 0x5f, + 0x65, 0x63, 0x61, 0x57, 0x6b, 0xa9, 0xaa, 0x64, + 0x66, 0x71, 0x95, 0xc5, 0xd5, 0xb8, 0x8d, 0x75, + 0x4d, 0x2a, 0x40, 0x59, 0x4b, 0x67, 0x94, 0x90, + 0x4d, 0xa3, 0xb0, 0x3e, 0x06, 0x6d, 0xb5, 0x85, + 0xc5, 0xb2, 0xaf, 0xb3, 0x8e, 0x49, 0x1f, 0x1d, + 0x45, 0x63, 0x7f, 0x97, 0xbd, 0xdd, 0xd1, 0xaf, + 0xeb, 0xfc, 0xd5, 0x69, 0x12, 0x16, 0x5d, 0x99, + 0x91, 0x59, 0x23, 0x22, 0x30, 0x2e, 0x53, 0x9b, + 0xd3, 0xef, 0xe1, 0xc7, 0xc3, 0xb0, 0xa6, 0xc0, + 0xe3, 0x97, 0x54, 0x4a, 0x57, 0x5d, 0x67, 0x79, + 0x14, 0x6f, 0xd4, 0xb5, 0x40, 0x24, 0x3b, 0x26, + 0x5b, 0x53, 0x40, 0x56, 0xb7, 0xff, 0xce, 0x5d, + 0x55, 0x55, 0x69, 0xa6, 0xfd, 0xfb, 0xba, 0xbb, + 0xc2, 0xb8, 0x9f, 0x86, 0x84, 0x8d, 0x85, 0x72, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, + 0x73, 0x6d, 0x67, 0x67, 0x6b, 0x6b, 0x65, 0x5f, + 0x66, 0x67, 0x68, 0x69, 0x6b, 0x6d, 0x6e, 0x6e, + 0x68, 0x6e, 0x6f, 0x64, 0x53, 0x4a, 0x4e, 0x55, + 0x69, 0x61, 0x57, 0x52, 0x53, 0x53, 0x50, 0x4b, + 0x48, 0x41, 0x35, 0x2b, 0x2b, 0x32, 0x37, 0x36, + 0x26, 0x22, 0x38, 0x69, 0x93, 0xa3, 0xa8, 0xad, + 0xce, 0xa2, 0xa6, 0xb2, 0x8f, 0x7d, 0x83, 0x77, + 0xc5, 0xc1, 0x94, 0x8b, 0xb9, 0xa4, 0x4e, 0x1e, + 0x3f, 0x68, 0x81, 0x6f, 0x55, 0x4f, 0x54, 0x55, + 0x36, 0x12, 0x1e, 0x5e, 0x7a, 0x59, 0x43, 0x4f, + 0x47, 0x6c, 0x67, 0x48, 0x69, 0xab, 0x9e, 0x57, + 0x7a, 0x6a, 0x92, 0xd6, 0xcf, 0x8a, 0x79, 0xa2, + 0xe6, 0xa1, 0x4a, 0x18, 0x18, 0x2f, 0x41, 0x46, + 0x4a, 0x2f, 0x2c, 0x2c, 0x2c, 0x69, 0xbc, 0xde, + 0xcc, 0xc1, 0xaa, 0xa2, 0x9a, 0x6d, 0x45, 0x48, + 0x83, 0x69, 0x52, 0x47, 0x3a, 0x2b, 0x2e, 0x3e, + 0x4a, 0x46, 0x4d, 0x3d, 0x54, 0x56, 0x22, 0x31, + 0x4d, 0x4a, 0x5a, 0x86, 0xb2, 0xb7, 0x92, 0x69, + 0x55, 0x58, 0x62, 0x70, 0x7a, 0x79, 0x6b, 0x5f, + 0x7b, 0x81, 0x82, 0x78, 0x67, 0x5d, 0x5f, 0x65, + 0xa4, 0xac, 0xac, 0xa1, 0x96, 0x8f, 0x84, 0x77, + 0x5d, 0x91, 0x8f, 0x79, 0x8e, 0x94, 0x7d, 0x76, + 0x72, 0x78, 0x6d, 0x4f, 0x3a, 0x3d, 0x4b, 0x53, + 0x77, 0x97, 0x95, 0x68, 0x51, 0x6b, 0x8b, 0x94, + 0x68, 0x5a, 0x4f, 0x57, 0x65, 0x63, 0x4c, 0x34, + 0x57, 0x7b, 0x7a, 0x47, 0x27, 0x30, 0x34, 0x24, + 0x64, 0xd2, 0xeb, 0x72, 0x4c, 0xd7, 0xff, 0xae, + 0x7e, 0x5a, 0x6a, 0xbc, 0xf4, 0xde, 0xad, 0x94, + 0xe5, 0x76, 0x3b, 0x16, 0x38, 0x6e, 0x5f, 0x78, + 0x84, 0x73, 0xb7, 0xe9, 0xc1, 0xa8, 0x90, 0x4a, + 0x22, 0x4f, 0x8b, 0xb4, 0xbe, 0xad, 0x8d, 0x74, + 0x99, 0x5e, 0x08, 0x00, 0x2e, 0x29, 0x2b, 0x69, + 0xa8, 0xc4, 0xa9, 0x69, 0x7d, 0xd6, 0xd3, 0x78, + 0x66, 0x1f, 0x28, 0x9e, 0xec, 0xd1, 0xa8, 0xa8, + 0xc9, 0x90, 0x46, 0x30, 0x6f, 0xc6, 0xe2, 0xcd, + 0xd1, 0x96, 0x5d, 0x63, 0x99, 0xb6, 0x8d, 0x51, + 0x61, 0x6c, 0x34, 0x1a, 0x3e, 0x34, 0x46, 0xa9, + 0xee, 0xd0, 0xb1, 0xab, 0xa6, 0x85, 0x71, 0x7c, + 0x64, 0x45, 0x3a, 0x51, 0x68, 0x75, 0x93, 0xb8, + 0xf3, 0xec, 0x9c, 0x5f, 0x6f, 0x5c, 0x1a, 0x00, + 0x4f, 0x84, 0x91, 0x6f, 0x72, 0x9d, 0x9c, 0x70, + 0x55, 0x47, 0x39, 0xaf, 0xf9, 0xf8, 0xff, 0xdd, + 0x9d, 0x6c, 0x47, 0x4f, 0x67, 0x6c, 0x62, 0x5a, + 0x79, 0x7b, 0x7d, 0x80, 0x80, 0x7f, 0x7d, 0x7c, + 0x7b, 0x76, 0x72, 0x74, 0x79, 0x7b, 0x77, 0x72, + 0x5c, 0x5f, 0x65, 0x6c, 0x74, 0x7c, 0x81, 0x84, + 0x8a, 0x88, 0x80, 0x73, 0x66, 0x62, 0x67, 0x6e, + 0x6c, 0x63, 0x58, 0x54, 0x54, 0x53, 0x4f, 0x4a, + 0x3c, 0x3a, 0x32, 0x31, 0x3f, 0x4b, 0x3f, 0x29, + 0xa4, 0xd9, 0xff, 0xff, 0xe0, 0xbe, 0xbb, 0xc8, + 0xc7, 0xa4, 0xbc, 0xca, 0x7d, 0x37, 0x3a, 0x4d, + 0x62, 0x7d, 0x43, 0x00, 0x17, 0x3c, 0x3a, 0x39, + 0x33, 0x1f, 0x4c, 0x97, 0x89, 0x32, 0x18, 0x44, + 0x48, 0x3a, 0x43, 0x5a, 0x4e, 0x2b, 0x2d, 0x4d, + 0x51, 0x67, 0x56, 0x2b, 0x2c, 0x4a, 0x37, 0x00, + 0x36, 0x3c, 0x38, 0x30, 0x48, 0x88, 0xcf, 0xf9, + 0xf9, 0xc1, 0x81, 0x64, 0x69, 0x6e, 0x5d, 0x47, + 0x65, 0x4e, 0x50, 0x4e, 0x44, 0x6e, 0xae, 0xc3, + 0x7e, 0xae, 0xb0, 0xa3, 0x9c, 0x5a, 0x1d, 0x29, + 0x6f, 0x5b, 0x43, 0x33, 0x2b, 0x2b, 0x37, 0x44, + 0x46, 0x4e, 0x65, 0x5d, 0x6c, 0x59, 0x0c, 0x0a, + 0x4b, 0x53, 0x64, 0x7a, 0x8c, 0x92, 0x8e, 0x87, + 0x69, 0x53, 0x3f, 0x42, 0x59, 0x73, 0x80, 0x81, + 0x79, 0x97, 0xa8, 0x8d, 0x5a, 0x3e, 0x50, 0x6e, + 0x64, 0x4b, 0x47, 0x6d, 0x94, 0x92, 0x68, 0x40, + 0x43, 0x7e, 0x8c, 0x8d, 0xb4, 0xbc, 0x96, 0x81, + 0x31, 0x28, 0x37, 0x54, 0x54, 0x44, 0x57, 0x7f, + 0x88, 0x6d, 0x33, 0x07, 0x21, 0x64, 0x83, 0x78, + 0x36, 0x16, 0x05, 0x25, 0x5c, 0x73, 0x55, 0x2c, + 0x32, 0x6e, 0x8e, 0x74, 0x55, 0x4a, 0x2e, 0x07, + 0x7b, 0xb7, 0x92, 0x47, 0x5f, 0x93, 0x84, 0x5f, + 0x90, 0x75, 0x73, 0x8a, 0x8c, 0x88, 0xb4, 0xf5, + 0xee, 0x5c, 0x2c, 0x3e, 0x6b, 0x69, 0x2c, 0x41, + 0x7a, 0x45, 0x8a, 0xd5, 0x93, 0x4e, 0x59, 0x66, + 0x76, 0x9c, 0x8d, 0x41, 0x19, 0x31, 0x43, 0x36, + 0x81, 0xd1, 0xc7, 0x82, 0x6e, 0x67, 0x62, 0x7b, + 0x42, 0x6d, 0x96, 0x92, 0x5e, 0x38, 0x70, 0xd2, + 0xb6, 0x9f, 0xba, 0xe9, 0xc8, 0x77, 0x75, 0xb5, + 0xa7, 0xbd, 0xce, 0xdb, 0xec, 0xe5, 0xa7, 0x60, + 0x00, 0x2e, 0x8c, 0xad, 0x89, 0x5e, 0x62, 0x80, + 0x64, 0x68, 0x9b, 0x8f, 0x4b, 0x70, 0xb4, 0xa0, + 0xb2, 0x63, 0x4e, 0x83, 0x9b, 0x80, 0x6c, 0x6e, + 0x50, 0x4d, 0x5c, 0x71, 0x74, 0x78, 0xa6, 0xe0, + 0xeb, 0xe9, 0xc1, 0xb3, 0xc1, 0x9a, 0x7d, 0xa3, + 0x66, 0x78, 0x70, 0x45, 0x21, 0x27, 0x46, 0x5d, + 0x20, 0x56, 0x46, 0x45, 0x1d, 0x16, 0x6f, 0x6c, + 0x28, 0x28, 0x38, 0x53, 0x61, 0x61, 0x6a, 0x7b, + 0x71, 0x75, 0x7b, 0x80, 0x82, 0x81, 0x7e, 0x7c, + 0x77, 0x6f, 0x65, 0x60, 0x5e, 0x5a, 0x50, 0x48, + 0x55, 0x58, 0x5e, 0x65, 0x6d, 0x74, 0x7a, 0x7d, + 0x76, 0x72, 0x6e, 0x6f, 0x70, 0x6d, 0x63, 0x5a, + 0x7a, 0x70, 0x65, 0x60, 0x5f, 0x5e, 0x59, 0x54, + 0x41, 0x33, 0x26, 0x27, 0x30, 0x35, 0x31, 0x2b, + 0x4c, 0x72, 0x7c, 0x6c, 0x84, 0xbb, 0xc5, 0xa6, + 0x7a, 0x00, 0x00, 0x33, 0x69, 0x61, 0x52, 0x42, + 0x5c, 0x50, 0x48, 0x7f, 0xbb, 0x9b, 0x76, 0x97, + 0x58, 0x22, 0x2e, 0x7c, 0x8f, 0x54, 0x3c, 0x5d, + 0x61, 0x47, 0x3c, 0x4a, 0x50, 0x43, 0x3a, 0x3e, + 0x26, 0x3b, 0x4d, 0x4d, 0x41, 0x3a, 0x3c, 0x40, + 0x28, 0x38, 0x32, 0x1b, 0x28, 0x64, 0x9e, 0xb7, + 0x9a, 0xbd, 0xd9, 0xcc, 0x9e, 0x79, 0x75, 0x81, + 0x90, 0x7a, 0x7b, 0x73, 0x5a, 0x70, 0x9d, 0xa6, + 0x94, 0xb8, 0xa7, 0x95, 0xa1, 0x72, 0x2b, 0x20, + 0x2a, 0x34, 0x3e, 0x42, 0x45, 0x48, 0x44, 0x3d, + 0x1c, 0x4a, 0x98, 0xb8, 0xcb, 0x95, 0x16, 0x00, + 0xb5, 0xd2, 0xe2, 0xc3, 0x89, 0x69, 0x76, 0x92, + 0x5e, 0x5e, 0x55, 0x41, 0x33, 0x3c, 0x5a, 0x77, + 0xc6, 0xdf, 0xeb, 0xcc, 0x97, 0x78, 0x84, 0x9e, + 0x63, 0x62, 0x6d, 0x76, 0x6b, 0x6b, 0x9e, 0xde, + 0xe4, 0xb8, 0x7d, 0x7c, 0x92, 0x5f, 0x1b, 0x14, + 0x29, 0x27, 0x39, 0x4e, 0x3f, 0x1b, 0x14, 0x29, + 0x22, 0x3b, 0x6a, 0x84, 0x63, 0x35, 0x42, 0x71, + 0x4b, 0x43, 0x3d, 0x45, 0x5c, 0x79, 0x92, 0xa0, + 0x5a, 0x62, 0x68, 0x70, 0x83, 0x8c, 0x72, 0x4c, + 0x6a, 0x6d, 0x4b, 0x54, 0x71, 0x3f, 0x32, 0x8d, + 0xa4, 0x80, 0x5c, 0x4e, 0x4f, 0x64, 0x95, 0xc5, + 0x99, 0x54, 0x72, 0x90, 0x93, 0x69, 0x24, 0x43, + 0x9c, 0x50, 0x50, 0x7d, 0x64, 0x48, 0x87, 0xde, + 0xbd, 0xef, 0xd1, 0x58, 0x0c, 0x20, 0x39, 0x2c, + 0x00, 0x1f, 0x6b, 0x82, 0x55, 0x5a, 0x7b, 0x6d, + 0x64, 0x6d, 0x4d, 0x44, 0x80, 0xaf, 0xaf, 0xae, + 0xaf, 0x7f, 0x69, 0x83, 0x92, 0x78, 0x57, 0x4b, + 0x8a, 0xa5, 0x9e, 0x66, 0x39, 0x3d, 0x56, 0x64, + 0xb1, 0xa3, 0xa1, 0xa4, 0x90, 0x73, 0x74, 0x8b, + 0x52, 0x89, 0xb3, 0x9e, 0x82, 0x96, 0x9f, 0x7e, + 0x61, 0x24, 0x2e, 0x6c, 0x7e, 0x77, 0x69, 0x4e, + 0x80, 0x73, 0x74, 0x80, 0x81, 0x8a, 0xbd, 0xfa, + 0xff, 0x9d, 0x87, 0xb3, 0xb9, 0xb8, 0xb5, 0x96, + 0x78, 0x4e, 0x3e, 0x5f, 0x79, 0x66, 0x3f, 0x28, + 0x30, 0x3e, 0x2f, 0x19, 0x34, 0x3c, 0x23, 0x3c, + 0x51, 0x6e, 0x7d, 0x70, 0x61, 0x60, 0x62, 0x5f, + 0x67, 0x6d, 0x77, 0x7f, 0x82, 0x81, 0x7e, 0x7a, + 0x6b, 0x68, 0x67, 0x6d, 0x76, 0x7c, 0x7b, 0x78, + 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x82, 0x83, 0x83, + 0x78, 0x7b, 0x85, 0x94, 0x9d, 0x93, 0x79, 0x62, + 0x72, 0x69, 0x5d, 0x57, 0x56, 0x54, 0x4f, 0x4a, + 0x46, 0x3c, 0x37, 0x33, 0x26, 0x18, 0x1d, 0x2c, + 0x26, 0x45, 0x3c, 0x1b, 0x36, 0x70, 0x62, 0x20, + 0x82, 0x44, 0x5f, 0xa9, 0xa3, 0x7b, 0x6f, 0x6b, + 0x52, 0x65, 0x4e, 0x3a, 0x42, 0x35, 0x3d, 0x76, + 0x96, 0x78, 0x47, 0x25, 0x2d, 0x44, 0x3e, 0x24, + 0x0d, 0x1c, 0x2f, 0x33, 0x26, 0x1e, 0x2b, 0x3f, + 0x44, 0x50, 0x60, 0x60, 0x43, 0x26, 0x2c, 0x45, + 0x2f, 0x2c, 0x40, 0x62, 0x6e, 0x70, 0x8e, 0xb9, + 0xce, 0xce, 0xbd, 0x91, 0x63, 0x53, 0x69, 0x85, + 0x54, 0x3f, 0x42, 0x43, 0x3b, 0x67, 0xa9, 0xbf, + 0xa4, 0xac, 0xa2, 0xaf, 0xd7, 0xc8, 0x74, 0x2f, + 0x29, 0x39, 0x42, 0x40, 0x49, 0x5b, 0x5f, 0x56, + 0x4f, 0x79, 0xbe, 0xd5, 0xe1, 0xa8, 0x26, 0x00, + 0x93, 0xa4, 0xac, 0x98, 0x71, 0x54, 0x51, 0x5a, + 0x50, 0x39, 0x37, 0x64, 0xa5, 0xc2, 0xa9, 0x83, + 0x95, 0x97, 0x9f, 0xb1, 0xc7, 0xd9, 0xe1, 0xe3, + 0xc3, 0x85, 0x5c, 0x64, 0x65, 0x4a, 0x3d, 0x49, + 0x03, 0x37, 0x60, 0x7f, 0x87, 0x6a, 0x7d, 0xcc, + 0xd1, 0xcb, 0x98, 0x47, 0x1f, 0x34, 0x51, 0x56, + 0x58, 0x31, 0x2d, 0x5b, 0x78, 0x5e, 0x37, 0x27, + 0x42, 0x3d, 0x44, 0x60, 0x7f, 0x85, 0x6d, 0x52, + 0x6b, 0x4a, 0x39, 0x4a, 0x64, 0x6e, 0x74, 0x7b, + 0x90, 0xbb, 0x87, 0x11, 0x00, 0x3c, 0x71, 0x74, + 0x8b, 0x7e, 0x67, 0x5f, 0x75, 0x8d, 0x81, 0x64, + 0x69, 0x76, 0xa9, 0x82, 0x5d, 0x5a, 0x3b, 0x55, + 0x8c, 0x68, 0x3b, 0x45, 0x76, 0x88, 0x9a, 0xc8, + 0xac, 0xeb, 0xfd, 0xba, 0x6d, 0x58, 0x60, 0x64, + 0x5f, 0x20, 0x34, 0x64, 0x4a, 0x31, 0x3f, 0x41, + 0x3d, 0x77, 0x51, 0x20, 0x68, 0xaf, 0x8d, 0x55, + 0x4a, 0x69, 0x7c, 0x83, 0xa0, 0xc7, 0xc8, 0xad, + 0x3f, 0x8a, 0xca, 0xd1, 0xbf, 0xb7, 0xae, 0xa1, + 0xaf, 0xa7, 0xaf, 0xb4, 0x8f, 0x5e, 0x63, 0x8b, + 0x79, 0xa8, 0x84, 0x7a, 0xbb, 0x9c, 0x49, 0x4a, + 0x50, 0x80, 0xd3, 0xeb, 0xcb, 0xcc, 0xad, 0x4f, + 0x65, 0x3f, 0x31, 0x4d, 0x69, 0x6e, 0x74, 0x83, + 0x34, 0x06, 0x05, 0x08, 0x00, 0x40, 0xa8, 0xd0, + 0x51, 0x42, 0x44, 0x58, 0x59, 0x4a, 0x4b, 0x5c, + 0x4c, 0x24, 0x42, 0x33, 0x3d, 0x83, 0x72, 0x46, + 0x3e, 0x51, 0x61, 0x6a, 0x75, 0x77, 0x60, 0x41, + 0x53, 0x5a, 0x66, 0x70, 0x75, 0x74, 0x6f, 0x6c, + 0x7a, 0x75, 0x70, 0x71, 0x75, 0x77, 0x72, 0x6c, + 0x68, 0x68, 0x67, 0x67, 0x66, 0x66, 0x66, 0x65, + 0x6e, 0x76, 0x82, 0x8c, 0x8c, 0x82, 0x71, 0x65, + 0x75, 0x6b, 0x5f, 0x59, 0x57, 0x55, 0x4f, 0x4a, + 0x43, 0x43, 0x44, 0x40, 0x2f, 0x1f, 0x1e, 0x27, + 0x02, 0x2b, 0x3d, 0x2d, 0x28, 0x39, 0x37, 0x21, + 0x27, 0x2c, 0x66, 0x9f, 0xae, 0xac, 0x76, 0x19, + 0x00, 0x72, 0x91, 0x60, 0x50, 0x48, 0x32, 0x30, + 0x5b, 0x71, 0x5e, 0x33, 0x40, 0x7e, 0x96, 0x7d, + 0x7f, 0xa3, 0xbd, 0xaa, 0x7f, 0x64, 0x67, 0x74, + 0x6a, 0x65, 0x4b, 0x31, 0x44, 0x86, 0xc8, 0xe7, + 0xc5, 0xea, 0xc7, 0x66, 0x4c, 0x88, 0xa6, 0x8b, + 0x89, 0x6d, 0x50, 0x49, 0x55, 0x5c, 0x52, 0x44, + 0x35, 0x1b, 0x1a, 0x15, 0x0b, 0x36, 0x79, 0x90, + 0x6d, 0x73, 0x89, 0x99, 0xa1, 0xa2, 0x6e, 0x1b, + 0x37, 0x42, 0x3a, 0x24, 0x26, 0x41, 0x4c, 0x43, + 0x64, 0x6d, 0x83, 0x77, 0x7f, 0x61, 0x09, 0x00, + 0x8c, 0x6b, 0x57, 0x75, 0xb6, 0xe9, 0xf3, 0xe8, + 0x9e, 0xa2, 0xaf, 0xc2, 0xd0, 0xcd, 0xbb, 0xaa, + 0x5a, 0x38, 0x28, 0x4d, 0x90, 0xb6, 0xa5, 0x84, + 0x8b, 0x5f, 0x49, 0x4f, 0x3e, 0x21, 0x32, 0x63, + 0x17, 0x53, 0x51, 0x2c, 0x3f, 0x70, 0xa8, 0xe3, + 0xde, 0xff, 0xd1, 0x55, 0x32, 0x79, 0x9b, 0x79, + 0x57, 0x54, 0x41, 0x3c, 0x62, 0x8c, 0x7a, 0x47, + 0x36, 0x5f, 0x7a, 0x5f, 0x2a, 0x19, 0x41, 0x72, + 0x6c, 0x66, 0x7b, 0x98, 0x89, 0x62, 0x68, 0x8f, + 0x6f, 0x47, 0x70, 0x99, 0x72, 0x65, 0x7e, 0x76, + 0x3f, 0x72, 0x80, 0x52, 0x29, 0x25, 0x1d, 0x06, + 0x41, 0x82, 0xb7, 0x63, 0x47, 0x89, 0x82, 0x7c, + 0x52, 0x72, 0x4a, 0x4a, 0xaf, 0xc6, 0x74, 0x41, + 0xa3, 0xc8, 0xe0, 0xbf, 0x73, 0x43, 0x58, 0x86, + 0x9a, 0xcf, 0xb2, 0x6b, 0x50, 0x31, 0x14, 0x22, + 0x62, 0x5b, 0x44, 0x69, 0xa1, 0x69, 0x1a, 0x21, + 0x72, 0x80, 0x66, 0x4c, 0x7c, 0xb5, 0x78, 0x00, + 0x52, 0x5b, 0x58, 0x55, 0x6d, 0x8c, 0x88, 0x6b, + 0xb5, 0xa2, 0xac, 0xc9, 0xba, 0x85, 0x72, 0x86, + 0xfb, 0x8f, 0x7c, 0xb5, 0xc0, 0xa6, 0x6b, 0x19, + 0x4e, 0xb7, 0xff, 0xcb, 0x87, 0xcc, 0xee, 0x91, + 0x73, 0x3b, 0x25, 0x53, 0x7e, 0x67, 0x26, 0x00, + 0x59, 0x79, 0x57, 0x3e, 0x72, 0x86, 0x5d, 0x48, + 0x65, 0x4c, 0x3b, 0x48, 0x64, 0x70, 0x65, 0x55, + 0x5b, 0x4a, 0x30, 0x3a, 0x6c, 0x7f, 0x62, 0x4a, + 0x2b, 0x25, 0x38, 0x64, 0x85, 0x84, 0x75, 0x6c, + 0x5d, 0x65, 0x72, 0x7d, 0x83, 0x82, 0x7d, 0x79, + 0x7d, 0x77, 0x70, 0x70, 0x72, 0x72, 0x6b, 0x65, + 0x67, 0x68, 0x6a, 0x6d, 0x70, 0x72, 0x74, 0x75, + 0x6f, 0x75, 0x77, 0x70, 0x65, 0x60, 0x66, 0x6e, + 0x73, 0x69, 0x5d, 0x56, 0x54, 0x52, 0x4c, 0x46, + 0x41, 0x3b, 0x31, 0x2a, 0x2a, 0x2c, 0x2a, 0x25, + 0x4d, 0x39, 0x22, 0x16, 0x10, 0x16, 0x2b, 0x42, + 0x1f, 0x7f, 0xd4, 0xc2, 0xa0, 0xc9, 0xca, 0x77, + 0x9b, 0x8a, 0x6d, 0x86, 0xaf, 0x81, 0x3f, 0x40, + 0x4b, 0x69, 0x82, 0x7e, 0x6a, 0x61, 0x65, 0x6c, + 0x3c, 0x30, 0x28, 0x38, 0x59, 0x61, 0x36, 0x00, + 0x0f, 0x2a, 0x1e, 0x06, 0x3a, 0x9c, 0xba, 0x95, + 0x8d, 0x9e, 0x9a, 0x74, 0x49, 0x2c, 0x13, 0x00, + 0x23, 0x25, 0x29, 0x30, 0x33, 0x30, 0x26, 0x1f, + 0x35, 0x20, 0x24, 0x20, 0x0e, 0x2d, 0x61, 0x6e, + 0x8b, 0x8d, 0xa0, 0x7b, 0x36, 0x3c, 0x4f, 0x25, + 0x49, 0x62, 0x67, 0x54, 0x4d, 0x53, 0x44, 0x25, + 0x39, 0x3e, 0x50, 0x47, 0x5c, 0x54, 0x13, 0x18, + 0xb1, 0x9c, 0x8e, 0x9e, 0xc0, 0xd5, 0xcf, 0xc0, + 0xe2, 0xc5, 0x9e, 0x81, 0x75, 0x75, 0x77, 0x78, + 0x71, 0x93, 0xac, 0x9d, 0x7c, 0x78, 0x9f, 0xcb, + 0xb6, 0xc3, 0xad, 0x60, 0x0e, 0x07, 0x55, 0xa8, + 0x63, 0x74, 0x90, 0xa8, 0xaa, 0x8d, 0x5f, 0x3c, + 0x93, 0x82, 0x75, 0x79, 0x80, 0x73, 0x4e, 0x2d, + 0x60, 0x53, 0x4d, 0x5b, 0x6f, 0x6e, 0x53, 0x37, + 0x5e, 0x48, 0x50, 0x73, 0x7e, 0x76, 0x90, 0xbf, + 0xb2, 0x99, 0x5f, 0x34, 0x55, 0xa7, 0xd3, 0xce, + 0xc6, 0xda, 0xdf, 0xbc, 0x7d, 0x49, 0x38, 0x3d, + 0x24, 0x29, 0x36, 0x52, 0x7b, 0xae, 0xdc, 0xf7, + 0xd6, 0xa4, 0x67, 0x46, 0x42, 0x46, 0x3d, 0x30, + 0x13, 0x33, 0x64, 0x94, 0xb1, 0xb4, 0xa6, 0x98, + 0x17, 0x46, 0x88, 0xa4, 0x82, 0x60, 0x85, 0xc8, + 0xff, 0xc2, 0x78, 0x5a, 0x67, 0x78, 0x6f, 0x5c, + 0x8a, 0x4b, 0x77, 0xe6, 0xca, 0x3e, 0x2c, 0x91, + 0xc3, 0x74, 0x1a, 0x00, 0x29, 0x5e, 0x6d, 0x5f, + 0x19, 0x5d, 0xa0, 0xa6, 0x80, 0x6f, 0x93, 0xc2, + 0xe5, 0xd9, 0xca, 0xc0, 0xb6, 0xa6, 0x90, 0x7e, + 0x31, 0x5f, 0x7a, 0x7a, 0x8f, 0xb3, 0xa8, 0x7c, + 0x4a, 0x6e, 0x99, 0xb5, 0xc8, 0xd6, 0xd9, 0xd3, + 0x7e, 0x6f, 0x4f, 0x28, 0x18, 0x35, 0x76, 0xac, + 0xc9, 0xc3, 0xc1, 0xc3, 0xbc, 0x9b, 0x67, 0x3d, + 0x8d, 0x74, 0x57, 0x4b, 0x51, 0x5a, 0x5c, 0x59, + 0x43, 0x2c, 0x39, 0x54, 0x53, 0x48, 0x31, 0x0e, + 0x2e, 0x38, 0x48, 0x59, 0x65, 0x6a, 0x6b, 0x6a, + 0x5e, 0x6c, 0x7b, 0x82, 0x7d, 0x76, 0x72, 0x72, + 0x7a, 0x74, 0x70, 0x73, 0x7a, 0x7e, 0x79, 0x74, + 0x6b, 0x6f, 0x76, 0x7a, 0x7c, 0x7a, 0x76, 0x73, + 0x87, 0x82, 0x79, 0x70, 0x6a, 0x68, 0x68, 0x68, + 0x69, 0x63, 0x5d, 0x5d, 0x60, 0x60, 0x5a, 0x54, + 0x54, 0x49, 0x70, 0xba, 0xf1, 0xb7, 0x45, 0x2d, + 0x2d, 0x31, 0x36, 0x39, 0x39, 0x36, 0x31, 0x2d, + 0x4b, 0x8a, 0x98, 0x73, 0x83, 0xc3, 0xc5, 0x8c, + 0x51, 0x1f, 0x1b, 0x49, 0x4d, 0x24, 0x2d, 0x62, + 0x88, 0x64, 0x60, 0x7a, 0x6a, 0x2f, 0x16, 0x27, + 0x5a, 0xa8, 0xeb, 0xde, 0x9a, 0x77, 0x9d, 0xd5, + 0x3a, 0x34, 0x15, 0x07, 0x49, 0xae, 0xd1, 0xb5, + 0x8f, 0xbb, 0xe0, 0xb7, 0x4c, 0x1d, 0x82, 0xff, + 0xe8, 0x9b, 0x5c, 0x54, 0x53, 0x3f, 0x39, 0x46, + 0x26, 0x13, 0x11, 0x23, 0x27, 0x1d, 0x21, 0x33, + 0x45, 0x29, 0x1e, 0x2f, 0x3b, 0x32, 0x27, 0x28, + 0x3b, 0x5b, 0x77, 0x72, 0x51, 0x34, 0x2f, 0x38, + 0x35, 0x3c, 0x42, 0x40, 0x36, 0x2a, 0x22, 0x1f, + 0xad, 0x8e, 0x70, 0x71, 0x8e, 0xad, 0xbc, 0xbc, + 0x4b, 0x47, 0x60, 0xa4, 0xed, 0xff, 0xde, 0xad, + 0xb7, 0xa0, 0x86, 0x7a, 0x7f, 0x88, 0x8a, 0x88, + 0xbc, 0xe9, 0xff, 0xff, 0xf2, 0xb1, 0x7c, 0x62, + 0x49, 0x65, 0x8f, 0xb2, 0xb8, 0x9d, 0x71, 0x4f, + 0x41, 0x69, 0xa8, 0xdc, 0xe5, 0xb9, 0x6e, 0x36, + 0x39, 0x68, 0xa8, 0xcf, 0xc8, 0x99, 0x5d, 0x36, + 0x67, 0x5f, 0x39, 0x13, 0x24, 0x56, 0x5d, 0x3e, + 0x70, 0x7d, 0xa0, 0xcf, 0xea, 0xe4, 0xcf, 0xc0, + 0xc5, 0xc4, 0xb3, 0x8a, 0x5d, 0x44, 0x49, 0x58, + 0x94, 0x87, 0x78, 0x77, 0x8b, 0xb3, 0xdf, 0xfb, + 0xce, 0x97, 0x58, 0x3a, 0x3d, 0x3c, 0x26, 0x0d, + 0x91, 0x9a, 0xb1, 0xd0, 0xe5, 0xe0, 0xc3, 0xa8, + 0x55, 0x4b, 0x4e, 0x53, 0x3f, 0x27, 0x39, 0x62, + 0x6c, 0x4e, 0x31, 0x30, 0x47, 0x58, 0x54, 0x47, + 0x1c, 0x2a, 0x46, 0x54, 0x3a, 0x1e, 0x37, 0x69, + 0x5f, 0x66, 0x64, 0x63, 0x78, 0x8f, 0x84, 0x65, + 0xc0, 0xad, 0x95, 0x89, 0x8e, 0x9d, 0xac, 0xb5, + 0xd1, 0xdb, 0xd5, 0xae, 0x79, 0x5c, 0x63, 0x78, + 0x8a, 0x85, 0x85, 0x89, 0x85, 0x81, 0x8a, 0x9b, + 0x65, 0x3d, 0x50, 0xaf, 0xf4, 0xdc, 0x9a, 0x70, + 0xbc, 0x81, 0x38, 0x10, 0x19, 0x3b, 0x58, 0x66, + 0x76, 0x53, 0x2b, 0x1d, 0x2c, 0x46, 0x56, 0x5b, + 0x37, 0x71, 0xa2, 0x92, 0x5d, 0x4a, 0x74, 0xaa, + 0x51, 0x34, 0x2d, 0x3c, 0x3b, 0x2c, 0x26, 0x27, + 0x36, 0x3f, 0x4e, 0x5d, 0x67, 0x6b, 0x6a, 0x69, + 0x67, 0x72, 0x7d, 0x7e, 0x75, 0x69, 0x63, 0x61, + 0x82, 0x7c, 0x78, 0x7b, 0x81, 0x84, 0x80, 0x7a, + 0x61, 0x68, 0x72, 0x7c, 0x82, 0x84, 0x83, 0x81, + 0x79, 0x79, 0x79, 0x77, 0x73, 0x6d, 0x67, 0x63, + 0x61, 0x5b, 0x55, 0x55, 0x58, 0x57, 0x51, 0x4b, + 0x46, 0x52, 0x78, 0x96, 0xc0, 0xc5, 0x87, 0x67, + 0x63, 0x55, 0x3f, 0x28, 0x18, 0x11, 0x10, 0x12, + 0x23, 0x52, 0x88, 0xa3, 0xa6, 0x9f, 0x93, 0x88, + 0x30, 0x4c, 0x55, 0x46, 0x41, 0x48, 0x38, 0x19, + 0x48, 0x61, 0x7d, 0x78, 0x50, 0x3c, 0x6a, 0xad, + 0xe3, 0xf5, 0xf9, 0xd7, 0x9a, 0x65, 0x51, 0x51, + 0x48, 0x28, 0x0f, 0x31, 0x8d, 0xd9, 0xd4, 0xa6, + 0x92, 0x90, 0x9e, 0xb6, 0xc2, 0xc4, 0xd1, 0xe5, + 0xd1, 0xbb, 0xb1, 0xac, 0x87, 0x4f, 0x39, 0x47, + 0x0c, 0x57, 0xbe, 0xda, 0x7e, 0x11, 0x10, 0x54, + 0x1c, 0x28, 0x26, 0x23, 0x40, 0x5f, 0x49, 0x17, + 0x2f, 0x4b, 0x6d, 0x7e, 0x75, 0x5c, 0x43, 0x35, + 0x2d, 0x2e, 0x2e, 0x29, 0x21, 0x1a, 0x16, 0x15, + 0xd7, 0xaa, 0x6f, 0x4a, 0x45, 0x52, 0x60, 0x66, + 0x5f, 0x67, 0x69, 0x59, 0x41, 0x39, 0x45, 0x56, + 0x83, 0x84, 0x7a, 0x62, 0x50, 0x5a, 0x7f, 0xa1, + 0xfd, 0xc5, 0x7d, 0x4f, 0x45, 0x4a, 0x4b, 0x47, + 0x8b, 0x94, 0xa1, 0xae, 0xb8, 0xc0, 0xc5, 0xc8, + 0xee, 0xf2, 0xf0, 0xe1, 0xcb, 0xbb, 0xb7, 0xba, + 0xd8, 0xde, 0xd0, 0xa1, 0x62, 0x3a, 0x37, 0x44, + 0x62, 0x58, 0x3c, 0x34, 0x65, 0x9c, 0x8b, 0x51, + 0x0a, 0x0c, 0x3b, 0x82, 0x9e, 0x92, 0xa2, 0xcc, + 0xd5, 0xd2, 0xc9, 0xbc, 0xb3, 0xb6, 0xc3, 0xd0, + 0x78, 0x70, 0x66, 0x60, 0x65, 0x72, 0x82, 0x8d, + 0xb6, 0xa8, 0x95, 0x83, 0x73, 0x60, 0x4b, 0x3c, + 0x33, 0x54, 0x86, 0xb4, 0xd1, 0xe0, 0xe7, 0xea, + 0x81, 0x48, 0x1f, 0x26, 0x39, 0x3f, 0x4f, 0x66, + 0x55, 0x4f, 0x49, 0x46, 0x45, 0x41, 0x3a, 0x33, + 0x35, 0x21, 0x29, 0x48, 0x50, 0x5d, 0xab, 0xff, + 0x8b, 0x70, 0x74, 0x88, 0x65, 0x20, 0x12, 0x37, + 0x76, 0x74, 0x89, 0xbd, 0xef, 0xf4, 0xc7, 0x96, + 0x70, 0x52, 0x39, 0x42, 0x5d, 0x61, 0x41, 0x1e, + 0x41, 0x2f, 0x49, 0x7d, 0x76, 0x37, 0x15, 0x24, + 0x24, 0x32, 0x82, 0xd9, 0xc2, 0x6e, 0x71, 0xbc, + 0xff, 0xdc, 0xa1, 0x7f, 0x7e, 0x87, 0x87, 0x82, + 0x3f, 0x28, 0x13, 0x15, 0x2c, 0x43, 0x4c, 0x4b, + 0x0f, 0x1c, 0x2a, 0x30, 0x2f, 0x31, 0x3a, 0x43, + 0x22, 0x30, 0x3e, 0x47, 0x3f, 0x26, 0x26, 0x40, + 0x74, 0x78, 0x7d, 0x7e, 0x7a, 0x71, 0x66, 0x5f, + 0x6c, 0x76, 0x80, 0x81, 0x78, 0x6e, 0x6a, 0x6a, + 0x8c, 0x86, 0x81, 0x83, 0x89, 0x8b, 0x86, 0x80, + 0x75, 0x7a, 0x81, 0x86, 0x85, 0x80, 0x78, 0x73, + 0x72, 0x81, 0x96, 0xa4, 0xa2, 0x92, 0x7b, 0x6b, + 0x6e, 0x68, 0x61, 0x61, 0x63, 0x62, 0x5c, 0x55, + 0x44, 0x13, 0x28, 0x59, 0x7b, 0x7d, 0x5d, 0x57, + 0x3f, 0x2e, 0x17, 0x06, 0x06, 0x16, 0x2d, 0x3d, + 0x41, 0x33, 0x54, 0x8c, 0x88, 0x59, 0x60, 0x96, + 0x9d, 0x5f, 0x30, 0x27, 0x15, 0x00, 0x11, 0x42, + 0x57, 0x63, 0x5e, 0x4d, 0x5a, 0x8d, 0xbf, 0xd6, + 0xae, 0x9b, 0x8e, 0x95, 0xa5, 0xa1, 0x82, 0x64, + 0x2b, 0x45, 0x81, 0xc1, 0xd5, 0xbe, 0xa8, 0xa4, + 0x7b, 0x8e, 0x91, 0x79, 0x66, 0x69, 0x74, 0x78, + 0x71, 0x88, 0xa2, 0x94, 0x53, 0x11, 0x0a, 0x27, + 0x9b, 0xa8, 0xaf, 0xad, 0xab, 0x9c, 0x6e, 0x3e, + 0x3a, 0x37, 0x35, 0x31, 0x2a, 0x2f, 0x48, 0x62, + 0x7c, 0x6a, 0x52, 0x43, 0x40, 0x3f, 0x3d, 0x39, + 0x22, 0x24, 0x27, 0x28, 0x25, 0x1d, 0x12, 0x0a, + 0xbc, 0x99, 0x65, 0x3a, 0x23, 0x1f, 0x25, 0x2a, + 0x08, 0x36, 0x5b, 0x4a, 0x1e, 0x15, 0x45, 0x7b, + 0xc8, 0xc6, 0xad, 0x75, 0x3c, 0x2b, 0x49, 0x6f, + 0x35, 0x23, 0x17, 0x28, 0x48, 0x5b, 0x52, 0x41, + 0x6e, 0x6c, 0x63, 0x51, 0x3f, 0x3a, 0x44, 0x50, + 0x34, 0x5a, 0x81, 0x86, 0x6a, 0x47, 0x34, 0x31, + 0x1b, 0x2a, 0x39, 0x3b, 0x37, 0x3d, 0x51, 0x65, + 0x41, 0x22, 0x30, 0x6f, 0x8d, 0x64, 0x2d, 0x15, + 0xa2, 0xa1, 0xab, 0xae, 0x92, 0x72, 0x7d, 0xa0, + 0x98, 0x9b, 0x9c, 0x95, 0x84, 0x6d, 0x57, 0x4b, + 0xc4, 0xd0, 0xdd, 0xe1, 0xd3, 0xb5, 0x93, 0x7c, + 0xa7, 0xb0, 0xae, 0x94, 0x78, 0x7e, 0xa8, 0xd1, + 0x9b, 0xa8, 0xa8, 0x90, 0x78, 0x82, 0xb4, 0xe4, + 0x7c, 0x44, 0x1e, 0x2b, 0x43, 0x4c, 0x59, 0x6d, + 0x16, 0x3a, 0x69, 0x86, 0x84, 0x6d, 0x52, 0x43, + 0x40, 0x23, 0x29, 0x56, 0x6b, 0x5f, 0x69, 0x8a, + 0x81, 0x6c, 0x56, 0x4d, 0x51, 0x6e, 0xa8, 0xdd, + 0xe9, 0xdd, 0xce, 0xc0, 0xa6, 0x74, 0x31, 0x00, + 0x4b, 0x21, 0x13, 0x52, 0xb1, 0xd7, 0xa7, 0x64, + 0x47, 0x9d, 0xff, 0xff, 0xb8, 0x5c, 0x63, 0xa1, + 0xd5, 0x56, 0x1a, 0x71, 0xd4, 0xcb, 0x7e, 0x48, + 0x72, 0x7e, 0x81, 0x6c, 0x4b, 0x39, 0x3f, 0x4d, + 0xe2, 0xb6, 0x7f, 0x63, 0x6b, 0x86, 0x9b, 0xa5, + 0x90, 0xa0, 0x9e, 0x73, 0x36, 0x15, 0x21, 0x3a, + 0x46, 0x44, 0x20, 0x01, 0x0d, 0x26, 0x40, 0x5c, + 0x68, 0x6d, 0x74, 0x78, 0x77, 0x70, 0x68, 0x62, + 0x6b, 0x76, 0x82, 0x87, 0x84, 0x82, 0x84, 0x88, + 0x7c, 0x76, 0x71, 0x72, 0x77, 0x79, 0x73, 0x6d, + 0x6a, 0x72, 0x7f, 0x89, 0x8e, 0x8b, 0x85, 0x80, + 0x69, 0x69, 0x69, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x73, 0x6c, 0x65, 0x64, 0x65, 0x64, 0x5d, 0x56, + 0x4d, 0x2d, 0x6f, 0xa5, 0x83, 0x4e, 0x40, 0x62, + 0x54, 0x4e, 0x48, 0x4b, 0x5a, 0x73, 0x8e, 0xa0, + 0xa9, 0x48, 0x2a, 0x85, 0xd9, 0xd4, 0xb2, 0xac, + 0x84, 0x3f, 0x32, 0x63, 0x61, 0x2b, 0x36, 0x79, + 0x60, 0x6e, 0x5b, 0x3d, 0x5c, 0xa8, 0xc7, 0xb5, + 0x90, 0x71, 0x5b, 0x69, 0x8b, 0x95, 0x78, 0x55, + 0x80, 0x40, 0x39, 0x8c, 0xcb, 0xaf, 0x6c, 0x47, + 0x4f, 0x6f, 0x79, 0x6a, 0x75, 0x9d, 0xab, 0x9b, + 0x5a, 0x77, 0x8f, 0x82, 0x5e, 0x55, 0x7f, 0xb3, + 0xa4, 0xac, 0x9b, 0x7a, 0x75, 0x8e, 0x9c, 0x93, + 0x4d, 0x24, 0x15, 0x32, 0x49, 0x3f, 0x33, 0x35, + 0x40, 0x3c, 0x38, 0x39, 0x3b, 0x39, 0x31, 0x29, + 0x28, 0x2b, 0x32, 0x3a, 0x3c, 0x30, 0x1a, 0x09, + 0x4a, 0x48, 0x42, 0x39, 0x33, 0x37, 0x42, 0x4c, + 0x6d, 0x68, 0x62, 0x60, 0x63, 0x68, 0x6d, 0x70, + 0x63, 0x39, 0x10, 0x10, 0x32, 0x50, 0x54, 0x49, + 0x34, 0x35, 0x36, 0x34, 0x36, 0x40, 0x53, 0x61, + 0x62, 0x82, 0xa5, 0xad, 0x97, 0x7a, 0x6a, 0x66, + 0x88, 0x87, 0x77, 0x54, 0x32, 0x2e, 0x4b, 0x69, + 0x4e, 0x4e, 0x57, 0x6a, 0x7a, 0x74, 0x59, 0x40, + 0x0f, 0x12, 0x40, 0x80, 0x8a, 0x59, 0x36, 0x38, + 0x15, 0x63, 0xb0, 0xcc, 0xce, 0xce, 0xc1, 0xac, + 0x29, 0x45, 0x6d, 0x8d, 0xa1, 0xb2, 0xc3, 0xcf, + 0x62, 0x7e, 0xab, 0xd3, 0xe8, 0xe8, 0xda, 0xcd, + 0x5c, 0x6b, 0x7f, 0x90, 0xa1, 0xb8, 0xd5, 0xea, + 0xaf, 0xa9, 0x99, 0x7f, 0x61, 0x48, 0x3b, 0x36, + 0x18, 0x0b, 0x14, 0x30, 0x38, 0x30, 0x40, 0x5f, + 0x51, 0x51, 0x4b, 0x3f, 0x36, 0x39, 0x48, 0x57, + 0x2c, 0x35, 0x18, 0x00, 0x38, 0x93, 0x91, 0x4c, + 0x37, 0x68, 0x59, 0x24, 0x54, 0xd7, 0xff, 0xe4, + 0xd1, 0xb3, 0x94, 0x8a, 0x8a, 0x79, 0x4f, 0x2a, + 0x4c, 0x3c, 0x30, 0x38, 0x50, 0x65, 0x6b, 0x68, + 0x7e, 0xab, 0xb9, 0x8d, 0x60, 0x55, 0x55, 0x4f, + 0x9f, 0x99, 0x8f, 0x80, 0x69, 0x51, 0x42, 0x3e, + 0x1b, 0x29, 0x31, 0x28, 0x1a, 0x1e, 0x3a, 0x55, + 0xd0, 0xb4, 0x93, 0x84, 0x86, 0x87, 0x7e, 0x72, + 0x81, 0x81, 0x84, 0x89, 0x87, 0x78, 0x60, 0x4c, + 0x78, 0x63, 0x89, 0xeb, 0xff, 0xc7, 0x6f, 0x53, + 0x5a, 0x61, 0x6a, 0x71, 0x74, 0x70, 0x6a, 0x66, + 0x6e, 0x77, 0x82, 0x85, 0x83, 0x84, 0x89, 0x8f, + 0x82, 0x7b, 0x75, 0x76, 0x7a, 0x7b, 0x75, 0x6e, + 0x69, 0x73, 0x81, 0x8e, 0x92, 0x8e, 0x85, 0x7f, + 0x76, 0x71, 0x6a, 0x65, 0x67, 0x6e, 0x77, 0x7e, + 0x55, 0x4e, 0x47, 0x44, 0x45, 0x43, 0x3b, 0x34, + 0x3a, 0x41, 0x73, 0x6b, 0x43, 0x46, 0x49, 0x49, + 0x79, 0x78, 0x76, 0x73, 0x6f, 0x6b, 0x68, 0x66, + 0x6c, 0x7a, 0x98, 0xb0, 0xa2, 0x78, 0x5a, 0x55, + 0x54, 0x59, 0x4b, 0x2f, 0x24, 0x2b, 0x29, 0x1b, + 0x1d, 0x65, 0x84, 0x5a, 0x42, 0x6d, 0xa3, 0xb7, + 0xaf, 0x99, 0x80, 0x74, 0x71, 0x69, 0x56, 0x44, + 0x48, 0x30, 0x2f, 0x3c, 0x26, 0x0f, 0x3d, 0x8b, + 0x58, 0x93, 0xb5, 0x9f, 0x84, 0x7b, 0x67, 0x47, + 0x8c, 0x8f, 0x7f, 0x5b, 0x41, 0x4a, 0x6b, 0x86, + 0x90, 0x4f, 0x43, 0x82, 0xa4, 0x89, 0x7b, 0x92, + 0xc0, 0xad, 0x73, 0x2e, 0x18, 0x2e, 0x3a, 0x2f, + 0x28, 0x33, 0x40, 0x42, 0x39, 0x2d, 0x24, 0x21, + 0x3b, 0x2f, 0x26, 0x27, 0x2f, 0x30, 0x26, 0x1b, + 0x2c, 0x3a, 0x47, 0x48, 0x41, 0x42, 0x52, 0x61, + 0x37, 0x3a, 0x3d, 0x3f, 0x43, 0x4c, 0x5a, 0x65, + 0x83, 0x70, 0x61, 0x6a, 0x84, 0x98, 0x97, 0x8e, + 0x90, 0xb4, 0xd1, 0xbf, 0x85, 0x4f, 0x37, 0x37, + 0xa1, 0xbf, 0xda, 0xd6, 0xba, 0xa5, 0xa8, 0xb5, + 0x87, 0x8c, 0x8a, 0x78, 0x5b, 0x40, 0x31, 0x2d, + 0x6f, 0x42, 0x12, 0x06, 0x1f, 0x3f, 0x4b, 0x49, + 0x38, 0x6e, 0x91, 0x8f, 0x9c, 0xc2, 0xcf, 0xbd, + 0x40, 0x7a, 0x9e, 0x9b, 0xab, 0xd4, 0xdf, 0xc9, + 0x5f, 0x70, 0x76, 0x5e, 0x3b, 0x32, 0x4e, 0x70, + 0x96, 0x96, 0x94, 0x91, 0x8c, 0x86, 0x80, 0x7d, + 0x85, 0x63, 0x4a, 0x61, 0xa0, 0xdd, 0xfa, 0xfe, + 0x56, 0x42, 0x40, 0x6a, 0xa3, 0xb9, 0x9c, 0x74, + 0x33, 0x40, 0x5e, 0x6d, 0x4b, 0x1a, 0x17, 0x36, + 0xa4, 0x7e, 0x48, 0x1d, 0x0f, 0x19, 0x2e, 0x3d, + 0x84, 0x61, 0x31, 0x23, 0x48, 0x6a, 0x4f, 0x19, + 0x00, 0x00, 0x2f, 0x87, 0xc4, 0xce, 0xcc, 0xd4, + 0xe7, 0xa6, 0x6e, 0x76, 0xa6, 0xb3, 0x81, 0x46, + 0xad, 0x80, 0x51, 0x4b, 0x77, 0xb8, 0xed, 0xff, + 0xbd, 0xcf, 0xb7, 0x7f, 0x70, 0x7d, 0x5d, 0x1e, + 0x1d, 0x53, 0x7c, 0x71, 0x4f, 0x3d, 0x39, 0x37, + 0x5a, 0x36, 0x13, 0x11, 0x33, 0x5d, 0x78, 0x82, + 0x45, 0x51, 0x6b, 0x8a, 0x98, 0x81, 0x4e, 0x23, + 0x3e, 0x1c, 0x1c, 0x64, 0xc0, 0xd1, 0x83, 0x2a, + 0x2a, 0x69, 0xbd, 0xe8, 0xf1, 0xec, 0xaa, 0x45, + 0x5d, 0x63, 0x6d, 0x74, 0x76, 0x73, 0x6c, 0x68, + 0x73, 0x79, 0x7e, 0x7b, 0x75, 0x73, 0x77, 0x7d, + 0x85, 0x7e, 0x77, 0x77, 0x7b, 0x7a, 0x74, 0x6d, + 0x71, 0x7b, 0x88, 0x91, 0x91, 0x87, 0x79, 0x70, + 0x63, 0x6a, 0x73, 0x7a, 0x7b, 0x75, 0x6d, 0x67, + 0x6a, 0x63, 0x5b, 0x58, 0x58, 0x55, 0x4d, 0x45, + 0x3e, 0x36, 0x3a, 0x24, 0x38, 0x74, 0x6e, 0x4f, + 0x52, 0x53, 0x52, 0x4d, 0x43, 0x33, 0x24, 0x1b, + 0x5e, 0xb9, 0xf1, 0xbe, 0x61, 0x38, 0x4a, 0x65, + 0x66, 0x4a, 0x37, 0x37, 0x34, 0x2e, 0x3d, 0x56, + 0x2c, 0x4e, 0x5f, 0x51, 0x4c, 0x67, 0x8b, 0x9e, + 0xa6, 0x9e, 0x8f, 0x7e, 0x70, 0x6a, 0x6c, 0x70, + 0x55, 0x2c, 0x1c, 0x42, 0x71, 0x7e, 0x71, 0x66, + 0x4a, 0x7b, 0x9c, 0x87, 0x5c, 0x48, 0x4c, 0x54, + 0x62, 0x6f, 0x72, 0x6e, 0x81, 0xa8, 0xbf, 0xbf, + 0x7e, 0x47, 0x3a, 0x6a, 0x88, 0x7e, 0x89, 0xae, + 0xbc, 0xd6, 0xd4, 0x9b, 0x4b, 0x1d, 0x1f, 0x31, + 0x2e, 0x25, 0x19, 0x14, 0x24, 0x50, 0x87, 0xaf, + 0xdb, 0xb0, 0x76, 0x4c, 0x38, 0x2d, 0x1e, 0x11, + 0x52, 0x5b, 0x5c, 0x4c, 0x3b, 0x41, 0x60, 0x7e, + 0x87, 0xae, 0xd7, 0xdf, 0xc2, 0x9d, 0x87, 0x81, + 0xe1, 0xe2, 0xd6, 0xb2, 0x7d, 0x4a, 0x2a, 0x1d, + 0x50, 0x74, 0x94, 0x91, 0x73, 0x60, 0x6b, 0x7f, + 0x90, 0x8f, 0x78, 0x43, 0x0c, 0x00, 0x1e, 0x44, + 0x26, 0x21, 0x20, 0x2a, 0x39, 0x41, 0x3d, 0x36, + 0x63, 0x4c, 0x2e, 0x1d, 0x21, 0x34, 0x49, 0x56, + 0x90, 0xa4, 0xa0, 0x8a, 0x94, 0xb3, 0xab, 0x85, + 0x92, 0x83, 0x6d, 0x64, 0x79, 0x9f, 0xba, 0xc2, + 0xdc, 0xf5, 0xf2, 0xaf, 0x51, 0x1e, 0x31, 0x5a, + 0x56, 0x51, 0x4a, 0x46, 0x46, 0x4a, 0x51, 0x56, + 0x21, 0x4e, 0x94, 0xd2, 0xea, 0xd2, 0x9e, 0x76, + 0x69, 0x49, 0x2e, 0x38, 0x66, 0x9a, 0xb9, 0xc3, + 0xb2, 0xb7, 0xc5, 0xbd, 0x80, 0x34, 0x1b, 0x2c, + 0x54, 0x49, 0x46, 0x58, 0x6c, 0x66, 0x43, 0x21, + 0x69, 0x50, 0x79, 0xd5, 0xed, 0xae, 0x81, 0x89, + 0xc2, 0x94, 0xb2, 0xfe, 0xdf, 0x6a, 0x4b, 0x88, + 0xf5, 0xb4, 0x73, 0x6a, 0x90, 0xad, 0xa1, 0x86, + 0xc1, 0x7b, 0x2c, 0x0d, 0x21, 0x3b, 0x3b, 0x2d, + 0x17, 0x62, 0x96, 0x70, 0x1f, 0x00, 0x1b, 0x49, + 0x1a, 0x1b, 0x33, 0x57, 0x60, 0x4b, 0x3e, 0x44, + 0x44, 0x2c, 0x17, 0x1b, 0x33, 0x45, 0x43, 0x39, + 0x1a, 0x11, 0x0e, 0x1d, 0x33, 0x3b, 0x2f, 0x20, + 0x28, 0x33, 0x3f, 0x40, 0x35, 0x27, 0x1f, 0x1c, + 0x11, 0x02, 0x67, 0xce, 0xaa, 0x69, 0x56, 0x45, + 0x37, 0x41, 0x51, 0x61, 0x6c, 0x71, 0x72, 0x71, + 0x71, 0x76, 0x79, 0x76, 0x71, 0x70, 0x77, 0x7e, + 0x75, 0x6e, 0x67, 0x66, 0x69, 0x68, 0x61, 0x5a, + 0x5c, 0x69, 0x7d, 0x8d, 0x94, 0x8f, 0x84, 0x7c, + 0x72, 0x72, 0x72, 0x71, 0x70, 0x6f, 0x6f, 0x6e, + 0x60, 0x59, 0x50, 0x4d, 0x4c, 0x49, 0x40, 0x39, + 0x2b, 0x2b, 0x3e, 0x48, 0x65, 0x77, 0x63, 0x6d, + 0x52, 0x51, 0x4f, 0x51, 0x56, 0x5e, 0x66, 0x6c, + 0x59, 0x50, 0x3c, 0x3a, 0x60, 0x84, 0x72, 0x45, + 0x27, 0x0f, 0x53, 0xd7, 0xff, 0xca, 0xc2, 0xfa, + 0x9f, 0x6d, 0x44, 0x42, 0x4f, 0x57, 0x65, 0x77, + 0xaa, 0x96, 0x7a, 0x62, 0x55, 0x4f, 0x4c, 0x4a, + 0x4f, 0x85, 0xaf, 0xa7, 0x8f, 0x84, 0x81, 0x7b, + 0x4f, 0x2b, 0x11, 0x19, 0x2a, 0x2c, 0x27, 0x27, + 0x5d, 0x78, 0x82, 0x79, 0x87, 0xa8, 0xb1, 0xa1, + 0x90, 0x5f, 0x2c, 0x30, 0x70, 0xb7, 0xce, 0xc3, + 0xac, 0x82, 0x71, 0x85, 0x87, 0x65, 0x49, 0x48, + 0x58, 0x41, 0x28, 0x25, 0x42, 0x6f, 0x99, 0xb1, + 0xa2, 0x7d, 0x50, 0x38, 0x36, 0x35, 0x28, 0x19, + 0x4b, 0x51, 0x4d, 0x3e, 0x39, 0x58, 0x98, 0xcc, + 0xc2, 0x86, 0x48, 0x3b, 0x57, 0x67, 0x53, 0x35, + 0x37, 0x2c, 0x39, 0x70, 0xb2, 0xcb, 0xac, 0x82, + 0x5f, 0x7f, 0xa6, 0xbc, 0xc2, 0xca, 0xde, 0xf0, + 0x90, 0xa2, 0xa8, 0x91, 0x74, 0x7b, 0xab, 0xdb, + 0x70, 0x49, 0x1f, 0x17, 0x32, 0x56, 0x6b, 0x70, + 0x4f, 0x51, 0x47, 0x2d, 0x17, 0x21, 0x49, 0x6f, + 0x8c, 0x5e, 0x5c, 0x98, 0xc1, 0xaa, 0x80, 0x6e, + 0x54, 0x48, 0x6c, 0xb9, 0xe0, 0xc3, 0x9a, 0x8c, + 0x2f, 0x72, 0xa6, 0x89, 0x39, 0x0c, 0x29, 0x5c, + 0x0f, 0x1d, 0x33, 0x4a, 0x5b, 0x63, 0x64, 0x63, + 0x56, 0x7a, 0x88, 0x5e, 0x23, 0x20, 0x66, 0xb1, + 0x9c, 0xcc, 0xf9, 0xf4, 0xc5, 0x9b, 0x94, 0xa0, + 0x74, 0x7b, 0x9a, 0xbb, 0xb5, 0x9a, 0x9d, 0xb9, + 0x96, 0x5e, 0x22, 0x13, 0x2c, 0x43, 0x3c, 0x29, + 0x48, 0x57, 0x61, 0x5a, 0x53, 0x64, 0x8c, 0xaf, + 0xba, 0xff, 0xf9, 0x84, 0x36, 0x4e, 0x6f, 0x67, + 0x73, 0x96, 0xc3, 0xd8, 0xc8, 0x9b, 0x6b, 0x4c, + 0x7a, 0x9a, 0xb9, 0xba, 0xa6, 0xa1, 0xb7, 0xd2, + 0xc8, 0x71, 0x3e, 0x66, 0xa3, 0xbc, 0xce, 0xe6, + 0xbe, 0x4e, 0x15, 0x47, 0x6a, 0x40, 0x19, 0x1f, + 0x6a, 0x93, 0xbf, 0xc8, 0xa9, 0x7d, 0x5e, 0x51, + 0xba, 0xbe, 0xcc, 0xe5, 0xf6, 0xec, 0xc9, 0xaa, + 0xbe, 0x96, 0x68, 0x5b, 0x79, 0xae, 0xdd, 0xf6, + 0xd5, 0x81, 0x6f, 0x64, 0x3c, 0x6e, 0xac, 0x8b, + 0x4d, 0x55, 0x62, 0x6d, 0x74, 0x74, 0x71, 0x6f, + 0x6a, 0x70, 0x77, 0x79, 0x79, 0x7e, 0x8a, 0x94, + 0x8f, 0x87, 0x80, 0x7f, 0x82, 0x81, 0x79, 0x72, + 0x65, 0x71, 0x82, 0x8f, 0x90, 0x87, 0x78, 0x6d, + 0x6e, 0x72, 0x77, 0x7a, 0x78, 0x72, 0x69, 0x64, + 0x69, 0x61, 0x58, 0x54, 0x54, 0x50, 0x47, 0x3f, + 0x47, 0x2f, 0x1d, 0x1d, 0x4b, 0x5d, 0x4a, 0x67, + 0x64, 0x59, 0x4c, 0x48, 0x53, 0x6c, 0x89, 0x9c, + 0x67, 0x6d, 0x76, 0x7d, 0x7a, 0x63, 0x39, 0x16, + 0x31, 0x4d, 0x77, 0x9e, 0xb8, 0xc1, 0xbc, 0xb4, + 0xe7, 0xb6, 0x89, 0x61, 0x22, 0x00, 0x2d, 0x85, + 0x76, 0x55, 0x33, 0x2a, 0x38, 0x44, 0x3e, 0x33, + 0xc5, 0xcd, 0xa3, 0x59, 0x41, 0x60, 0x6a, 0x52, + 0x4e, 0x58, 0x76, 0x88, 0x66, 0x3a, 0x4a, 0x7d, + 0x58, 0x77, 0x7a, 0x5c, 0x54, 0x70, 0x7e, 0x72, + 0x72, 0x3d, 0x24, 0x58, 0xad, 0xdd, 0xdb, 0xc9, + 0xaf, 0xad, 0xab, 0xb7, 0xcd, 0xc0, 0x74, 0x23, + 0x64, 0x45, 0x2b, 0x37, 0x61, 0x8a, 0x99, 0x97, + 0xa7, 0x8f, 0x76, 0x6b, 0x67, 0x53, 0x2b, 0x09, + 0x37, 0x38, 0x3e, 0x48, 0x57, 0x6a, 0x7a, 0x84, + 0xf6, 0xac, 0x5c, 0x42, 0x57, 0x62, 0x46, 0x21, + 0x25, 0x2e, 0x52, 0x78, 0x70, 0x4b, 0x47, 0x5f, + 0x6b, 0x40, 0x25, 0x47, 0x94, 0xd0, 0xd9, 0xc9, + 0x2f, 0x44, 0x68, 0x90, 0xb3, 0xcd, 0xdc, 0xe3, + 0x45, 0x43, 0x42, 0x45, 0x4f, 0x5d, 0x6c, 0x75, + 0x6d, 0x56, 0x42, 0x48, 0x69, 0x8e, 0xa6, 0xae, + 0xeb, 0xbd, 0x94, 0x97, 0xaf, 0xa7, 0x70, 0x37, + 0x33, 0x40, 0x49, 0x3e, 0x28, 0x1a, 0x1f, 0x2b, + 0x28, 0x55, 0x8f, 0xb2, 0xb0, 0x95, 0x77, 0x65, + 0x49, 0x57, 0x36, 0x22, 0x3d, 0x41, 0x41, 0x66, + 0x62, 0x51, 0x43, 0x47, 0x55, 0x58, 0x49, 0x38, + 0x60, 0x6c, 0x70, 0x69, 0x66, 0x64, 0x55, 0x42, + 0x4f, 0x86, 0xc5, 0xdc, 0xc8, 0xab, 0x9e, 0xa0, + 0x8b, 0x54, 0x48, 0x81, 0xb0, 0xa2, 0x7f, 0x6f, + 0x4f, 0x4a, 0x31, 0x28, 0x65, 0xc7, 0xf8, 0xf2, + 0xc5, 0xc2, 0x9b, 0x4b, 0x0b, 0x23, 0x8e, 0xf3, + 0x60, 0x68, 0x91, 0xb8, 0xa1, 0x69, 0x5f, 0x7f, + 0x7e, 0xa0, 0xc3, 0xcb, 0xbf, 0xba, 0xca, 0xde, + 0x95, 0x5d, 0x44, 0x62, 0x7d, 0x7e, 0x8e, 0xaf, + 0xd2, 0xa8, 0x7c, 0x71, 0x7e, 0x7f, 0x65, 0x48, + 0x88, 0x7c, 0x9a, 0xcd, 0xc7, 0x87, 0x5b, 0x5c, + 0x6a, 0x4e, 0x69, 0xc6, 0xff, 0xe7, 0x9d, 0x6d, + 0x38, 0x60, 0x93, 0xaf, 0xa8, 0x8b, 0x6e, 0x5d, + 0x86, 0x3e, 0x58, 0x47, 0x2e, 0x85, 0xbe, 0xbb, + 0xa0, 0x82, 0x68, 0x6d, 0x86, 0x91, 0x80, 0x69, + 0x75, 0x7b, 0x85, 0x8d, 0x92, 0x91, 0x8f, 0x8c, + 0x79, 0x81, 0x89, 0x8a, 0x81, 0x71, 0x62, 0x59, + 0x6d, 0x77, 0x83, 0x86, 0x81, 0x7c, 0x7b, 0x7c, + 0x72, 0x6c, 0x62, 0x5b, 0x5b, 0x62, 0x6b, 0x72, + 0x6e, 0x66, 0x5c, 0x57, 0x54, 0x4f, 0x45, 0x3d, + 0x31, 0x8f, 0xd3, 0xe1, 0xeb, 0xe3, 0xa8, 0x68, + 0x2f, 0x5d, 0x94, 0xb6, 0xc2, 0xcb, 0xd9, 0xe4, + 0x5d, 0x55, 0x58, 0x4f, 0x22, 0x05, 0x3d, 0x94, + 0xe4, 0xca, 0xb2, 0xb5, 0xc6, 0xc8, 0xb1, 0x97, + 0xe3, 0x7b, 0x59, 0x9e, 0xb1, 0x5f, 0x20, 0x25, + 0x4a, 0x6d, 0x76, 0x59, 0x44, 0x41, 0x2e, 0x0e, + 0xaa, 0xe6, 0xf0, 0xa9, 0x68, 0x5c, 0x5c, 0x4d, + 0x5b, 0x62, 0x6c, 0x73, 0x70, 0x62, 0x4d, 0x3e, + 0x54, 0x59, 0x5e, 0x5e, 0x5c, 0x5b, 0x5d, 0x60, + 0x7f, 0x59, 0x46, 0x80, 0xc8, 0xc4, 0xae, 0xc0, + 0x8e, 0x92, 0xb4, 0xc0, 0xb2, 0xba, 0xa2, 0x58, + 0x35, 0x5c, 0x5f, 0x40, 0x4c, 0x8d, 0xb5, 0xaf, + 0x97, 0xa5, 0x92, 0x76, 0x65, 0x3c, 0x16, 0x16, + 0x2e, 0x33, 0x3c, 0x49, 0x5b, 0x6d, 0x7d, 0x87, + 0x48, 0x31, 0x24, 0x35, 0x54, 0x5b, 0x3f, 0x1e, + 0x37, 0x2b, 0x31, 0x3d, 0x2d, 0x12, 0x1f, 0x46, + 0x30, 0x3c, 0x4f, 0x60, 0x62, 0x4f, 0x31, 0x19, + 0x1d, 0x27, 0x39, 0x4e, 0x61, 0x6f, 0x78, 0x7c, + 0x69, 0x60, 0x52, 0x45, 0x3c, 0x3a, 0x3d, 0x3f, + 0x29, 0x36, 0x58, 0x8b, 0xbb, 0xd0, 0xc7, 0xb7, + 0xe5, 0xb9, 0x85, 0x69, 0x5e, 0x45, 0x15, 0x00, + 0x1e, 0x58, 0x8f, 0x8c, 0x5f, 0x42, 0x54, 0x74, + 0xda, 0xbb, 0x9b, 0x8f, 0x8c, 0x75, 0x44, 0x1a, + 0x3d, 0x4d, 0x2f, 0x1d, 0x36, 0x32, 0x29, 0x47, + 0x30, 0x3e, 0x3e, 0x1f, 0x00, 0x07, 0x40, 0x78, + 0xac, 0xd1, 0xf8, 0xf5, 0xc6, 0x9e, 0xa6, 0xc7, + 0xe8, 0xe2, 0xd8, 0xc9, 0xb1, 0x8d, 0x65, 0x4b, + 0x07, 0x5b, 0xb3, 0xd1, 0xba, 0x9c, 0x8e, 0x8c, + 0x10, 0x24, 0x51, 0x85, 0x9a, 0x85, 0x5c, 0x41, + 0x5a, 0x55, 0x69, 0xa0, 0xd0, 0xc0, 0x72, 0x27, + 0x06, 0x79, 0xca, 0xac, 0x6e, 0x65, 0x7f, 0x90, + 0xc9, 0xbf, 0xa1, 0x74, 0x4f, 0x4e, 0x71, 0x94, + 0x4e, 0x62, 0x5c, 0x49, 0x63, 0x9c, 0xad, 0x96, + 0x6c, 0x89, 0x9b, 0x83, 0x59, 0x4e, 0x70, 0x9a, + 0x93, 0x8e, 0xb5, 0xf5, 0xf9, 0xb2, 0x68, 0x49, + 0x94, 0xab, 0x90, 0x54, 0x4e, 0x6e, 0x55, 0x12, + 0x31, 0x68, 0xaa, 0xc9, 0xbb, 0x98, 0x7c, 0x71, + 0x37, 0x24, 0x31, 0x20, 0x1c, 0x22, 0x18, 0x40, + 0x74, 0x6c, 0x61, 0x59, 0x57, 0x55, 0x52, 0x4f, + 0x69, 0x6e, 0x75, 0x7b, 0x7e, 0x7d, 0x7a, 0x77, + 0x85, 0x73, 0x63, 0x64, 0x72, 0x7a, 0x74, 0x69, + 0x75, 0x7b, 0x82, 0x80, 0x79, 0x73, 0x73, 0x76, + 0x89, 0x83, 0x7a, 0x71, 0x6c, 0x6c, 0x6f, 0x71, + 0x77, 0x6e, 0x65, 0x60, 0x5e, 0x59, 0x50, 0x47, + 0x30, 0x57, 0xa4, 0xc6, 0xc0, 0xd5, 0xc4, 0x73, + 0x4a, 0x49, 0x2e, 0x1b, 0x44, 0x8a, 0x96, 0x73, + 0xa8, 0x64, 0x41, 0x6d, 0xa8, 0xbd, 0xbf, 0xc6, + 0xb2, 0xa6, 0x9b, 0x9a, 0x9f, 0x9e, 0x93, 0x87, + 0x48, 0x12, 0x00, 0x48, 0xb8, 0xf7, 0xeb, 0xc9, + 0x75, 0x85, 0x73, 0x41, 0x2e, 0x47, 0x5d, 0x5b, + 0xcf, 0xdb, 0xc2, 0x90, 0x81, 0x93, 0x88, 0x64, + 0x43, 0x3a, 0x32, 0x31, 0x33, 0x30, 0x25, 0x1a, + 0x3a, 0x6c, 0x98, 0x92, 0x6d, 0x61, 0x83, 0xae, + 0xc2, 0xa4, 0x73, 0x6d, 0x8d, 0x88, 0x73, 0x79, + 0x6d, 0x70, 0x99, 0xb8, 0xb7, 0xbc, 0xa9, 0x73, + 0x3c, 0x4c, 0x51, 0x42, 0x36, 0x46, 0x6d, 0x8e, + 0x99, 0xac, 0xa0, 0x8a, 0x76, 0x43, 0x0f, 0x05, + 0x19, 0x25, 0x3a, 0x55, 0x72, 0x8c, 0x9f, 0xaa, + 0xa7, 0x94, 0x78, 0x5f, 0x4e, 0x46, 0x43, 0x41, + 0x24, 0x3b, 0x73, 0xa6, 0x9c, 0x67, 0x4c, 0x55, + 0x12, 0x4d, 0x8b, 0x98, 0x73, 0x4a, 0x3b, 0x40, + 0x4a, 0x4f, 0x55, 0x57, 0x52, 0x45, 0x37, 0x2e, + 0x40, 0x3f, 0x40, 0x46, 0x52, 0x63, 0x74, 0x7e, + 0x8b, 0x79, 0x66, 0x61, 0x66, 0x62, 0x51, 0x3f, + 0x00, 0x05, 0x4f, 0x99, 0xcb, 0xd9, 0xcd, 0xbe, + 0x62, 0x85, 0x9d, 0x89, 0x5e, 0x51, 0x74, 0x9f, + 0x9b, 0xb3, 0xc1, 0xa8, 0x74, 0x49, 0x3e, 0x44, + 0x60, 0xab, 0xb9, 0x87, 0x52, 0x28, 0x43, 0x97, + 0x95, 0xa6, 0xb4, 0xad, 0x97, 0x85, 0x84, 0x8a, + 0xc1, 0xa2, 0x9e, 0xb4, 0xab, 0x8c, 0x99, 0xc6, + 0xcc, 0xd6, 0xc9, 0x93, 0x53, 0x3e, 0x5f, 0x89, + 0x98, 0x7f, 0x4a, 0x2e, 0x5b, 0x99, 0x89, 0x4a, + 0x72, 0x6d, 0x8b, 0xb2, 0x98, 0x4c, 0x24, 0x2d, + 0x23, 0x50, 0x6f, 0x50, 0x10, 0x00, 0x0a, 0x35, + 0x79, 0xa5, 0xa9, 0x73, 0x4d, 0x55, 0x5c, 0x4f, + 0x44, 0x44, 0x3f, 0x33, 0x2f, 0x42, 0x69, 0x89, + 0x7d, 0x53, 0x1b, 0x21, 0x8b, 0xff, 0xff, 0xd9, + 0xb9, 0xbb, 0xb1, 0x92, 0x6e, 0x5c, 0x63, 0x72, + 0xab, 0x6d, 0x3b, 0x3c, 0x58, 0x78, 0xa6, 0xd0, + 0xda, 0xc4, 0xa6, 0x83, 0x5e, 0x4c, 0x5d, 0x7b, + 0x87, 0xa5, 0xc9, 0xd9, 0xd4, 0xca, 0xc9, 0xcd, + 0xf4, 0xbc, 0x6f, 0x29, 0x68, 0xdc, 0xad, 0x33, + 0x41, 0x52, 0x66, 0x70, 0x6c, 0x63, 0x5d, 0x5c, + 0x76, 0x78, 0x7c, 0x7f, 0x7f, 0x7d, 0x7a, 0x77, + 0x98, 0x88, 0x78, 0x77, 0x81, 0x82, 0x75, 0x66, + 0x78, 0x7e, 0x83, 0x81, 0x79, 0x73, 0x72, 0x75, + 0x70, 0x70, 0x71, 0x72, 0x74, 0x76, 0x78, 0x79, + 0x6e, 0x66, 0x5d, 0x59, 0x57, 0x53, 0x4a, 0x42, + 0x3d, 0x39, 0x81, 0xb3, 0x77, 0x4b, 0x86, 0xcd, + 0xac, 0x9a, 0x51, 0x0b, 0x22, 0x6c, 0x6a, 0x2b, + 0x43, 0x0c, 0x00, 0x2a, 0x7e, 0xb8, 0xd7, 0xe8, + 0xbe, 0xc2, 0xbf, 0xae, 0x95, 0x84, 0x81, 0x85, + 0x95, 0x98, 0x6e, 0x42, 0x6d, 0xbf, 0xb8, 0x6f, + 0x2b, 0x80, 0xcd, 0xdd, 0xcc, 0xb0, 0x7d, 0x49, + 0x6b, 0x8b, 0x9e, 0x99, 0x94, 0x89, 0x60, 0x2e, + 0x6b, 0x65, 0x51, 0x32, 0x22, 0x38, 0x6e, 0x9d, + 0x90, 0x9b, 0x9c, 0x87, 0x6c, 0x69, 0x84, 0xa1, + 0x9f, 0x94, 0x61, 0x3e, 0x51, 0x65, 0x6b, 0x7b, + 0x8c, 0x71, 0x76, 0x86, 0x82, 0x84, 0x8a, 0x80, + 0x2f, 0x2a, 0x39, 0x4a, 0x37, 0x26, 0x52, 0x99, + 0xb7, 0xc7, 0xb9, 0xa4, 0x93, 0x5f, 0x24, 0x15, + 0x55, 0x5f, 0x70, 0x81, 0x90, 0x99, 0x9d, 0x9e, + 0x3b, 0x48, 0x50, 0x4d, 0x4d, 0x66, 0x96, 0xbe, + 0xce, 0xc8, 0xd2, 0xd7, 0xae, 0x6d, 0x54, 0x62, + 0x2c, 0x53, 0x74, 0x6a, 0x43, 0x30, 0x45, 0x64, + 0xc1, 0xa6, 0x7a, 0x51, 0x38, 0x32, 0x3a, 0x42, + 0x54, 0x4f, 0x47, 0x41, 0x42, 0x48, 0x50, 0x56, + 0x87, 0x7e, 0x77, 0x78, 0x75, 0x5d, 0x34, 0x13, + 0x5a, 0x78, 0x99, 0xa8, 0xa9, 0xb0, 0xc7, 0xdd, + 0xa3, 0x9f, 0x99, 0x96, 0x98, 0x9d, 0xa3, 0xa8, + 0x5b, 0x59, 0x5c, 0x6a, 0x76, 0x75, 0x64, 0x53, + 0x7b, 0xa9, 0xbb, 0xcf, 0xed, 0xc5, 0x83, 0x77, + 0xa9, 0xb4, 0xc4, 0xd2, 0xdc, 0xe3, 0xea, 0xee, + 0xe7, 0x87, 0x48, 0x52, 0x51, 0x3b, 0x5c, 0xa2, + 0x7e, 0xa3, 0xaf, 0x78, 0x26, 0x08, 0x36, 0x73, + 0x91, 0xce, 0xe1, 0x9b, 0x4b, 0x47, 0x81, 0xb7, + 0x75, 0x83, 0xa4, 0xb6, 0x99, 0x69, 0x5f, 0x75, + 0x99, 0x9b, 0x95, 0x85, 0x7e, 0x97, 0xca, 0xf5, + 0xe0, 0xbb, 0xb0, 0xc0, 0xaa, 0x6b, 0x45, 0x48, + 0x2d, 0x2e, 0x31, 0x3a, 0x4f, 0x73, 0x9d, 0xb9, + 0x69, 0x7d, 0xb2, 0xdd, 0xc4, 0x8b, 0x86, 0xac, + 0x9e, 0x7e, 0x5b, 0x50, 0x57, 0x58, 0x47, 0x33, + 0x6d, 0x59, 0x43, 0x39, 0x42, 0x67, 0xa5, 0xd9, + 0xe1, 0xbf, 0xbd, 0xd2, 0xb9, 0x82, 0x80, 0xab, + 0x96, 0x71, 0x4c, 0x48, 0x67, 0x8d, 0xa1, 0xa6, + 0xdd, 0xf2, 0xff, 0xdb, 0xaf, 0xb5, 0xae, 0x8d, + 0x76, 0x72, 0x6d, 0x6a, 0x6c, 0x72, 0x79, 0x7d, + 0x74, 0x74, 0x74, 0x74, 0x73, 0x70, 0x6e, 0x6d, + 0x81, 0x80, 0x7b, 0x73, 0x69, 0x61, 0x5c, 0x5b, + 0x5d, 0x6a, 0x78, 0x7d, 0x79, 0x71, 0x6c, 0x6c, + 0x73, 0x74, 0x74, 0x74, 0x71, 0x6c, 0x68, 0x64, + 0x68, 0x60, 0x58, 0x54, 0x54, 0x50, 0x47, 0x40, + 0x43, 0x3d, 0x27, 0x3a, 0x52, 0x1f, 0x04, 0x3b, + 0x7a, 0x83, 0x75, 0x5c, 0x67, 0x8c, 0x93, 0x7d, + 0xaf, 0xc7, 0xc8, 0x92, 0x47, 0x3b, 0x89, 0xe2, + 0xc3, 0xd1, 0xd2, 0xb2, 0x81, 0x62, 0x62, 0x70, + 0xa4, 0xdf, 0xd1, 0x6d, 0x35, 0x4d, 0x53, 0x2f, + 0x6e, 0xa4, 0xc1, 0xaa, 0x98, 0xab, 0xc0, 0xc2, + 0x0e, 0x4b, 0x81, 0x7d, 0x4f, 0x26, 0x15, 0x12, + 0x5d, 0x67, 0x72, 0x77, 0x72, 0x6b, 0x66, 0x65, + 0x96, 0x95, 0x8e, 0x80, 0x6f, 0x64, 0x63, 0x66, + 0x7d, 0x75, 0x4a, 0x2a, 0x31, 0x39, 0x49, 0x6e, + 0x96, 0x72, 0x63, 0x6a, 0x61, 0x53, 0x5c, 0x6e, + 0x64, 0x4f, 0x51, 0x5e, 0x4b, 0x2e, 0x47, 0x7e, + 0xa1, 0xad, 0x9d, 0x8c, 0x84, 0x56, 0x1d, 0x0c, + 0xaf, 0xb3, 0xb9, 0xb8, 0xae, 0x9d, 0x8a, 0x7e, + 0x4f, 0x78, 0xa1, 0xa3, 0x86, 0x6c, 0x6e, 0x7b, + 0x76, 0x85, 0xb0, 0xd0, 0xb0, 0x65, 0x38, 0x37, + 0x22, 0x2f, 0x42, 0x55, 0x70, 0x97, 0xc4, 0xe4, + 0xb9, 0xa4, 0x82, 0x5c, 0x3d, 0x29, 0x20, 0x1d, + 0x4b, 0x43, 0x39, 0x2f, 0x2b, 0x2d, 0x32, 0x36, + 0x60, 0x4d, 0x39, 0x34, 0x3a, 0x38, 0x29, 0x19, + 0x4a, 0x5d, 0x68, 0x5e, 0x52, 0x65, 0x98, 0xc7, + 0xa2, 0xb4, 0xd1, 0xef, 0xf9, 0xe5, 0xbd, 0x9e, + 0x77, 0x5b, 0x39, 0x29, 0x30, 0x41, 0x4d, 0x52, + 0x5c, 0x94, 0x96, 0x6f, 0x49, 0x09, 0x00, 0x07, + 0x36, 0x72, 0xaf, 0xb7, 0x92, 0x74, 0x79, 0x8e, + 0x76, 0x48, 0x39, 0x44, 0x29, 0x15, 0x65, 0xdd, + 0xb8, 0xd4, 0xf2, 0xf2, 0xca, 0x89, 0x48, 0x22, + 0x51, 0x42, 0x46, 0x5b, 0x5b, 0x45, 0x41, 0x50, + 0x48, 0x69, 0x72, 0x57, 0x4c, 0x6b, 0x91, 0xa2, + 0x89, 0x6c, 0x63, 0x90, 0xd8, 0xfe, 0xea, 0xc6, + 0xd3, 0xa0, 0x69, 0x3a, 0x0a, 0x0a, 0x6a, 0xdd, + 0xd0, 0xa5, 0x6c, 0x46, 0x49, 0x6f, 0xa0, 0xc0, + 0x92, 0xaa, 0xdd, 0xf8, 0xc7, 0x7e, 0x76, 0xa0, + 0xbd, 0xa7, 0x88, 0x6f, 0x61, 0x55, 0x48, 0x3d, + 0x3f, 0x5f, 0x6b, 0x4a, 0x1f, 0x1a, 0x3d, 0x60, + 0xc9, 0xdc, 0xc0, 0x7f, 0x62, 0x62, 0x36, 0x00, + 0xa7, 0x5b, 0x16, 0x1e, 0x61, 0x92, 0x87, 0x63, + 0x1e, 0x82, 0x6f, 0x2b, 0x4a, 0x78, 0x5c, 0x27, + 0x5f, 0x61, 0x64, 0x65, 0x67, 0x6d, 0x76, 0x7e, + 0x7d, 0x7c, 0x7a, 0x77, 0x76, 0x76, 0x76, 0x76, + 0x79, 0x71, 0x63, 0x57, 0x53, 0x5b, 0x69, 0x74, + 0x55, 0x6a, 0x86, 0x98, 0x9c, 0x96, 0x90, 0x8d, + 0x79, 0x7a, 0x7a, 0x7a, 0x77, 0x72, 0x6e, 0x6b, + 0x70, 0x69, 0x61, 0x5e, 0x5e, 0x5b, 0x53, 0x4c, + 0x1b, 0x3c, 0x24, 0x3f, 0x8f, 0x69, 0x33, 0x6d, + 0x2f, 0x1d, 0x26, 0x47, 0x51, 0x42, 0x48, 0x63, + 0xe0, 0x9e, 0x5e, 0x63, 0xa1, 0xc8, 0xa8, 0x70, + 0x73, 0x86, 0x90, 0x7c, 0x58, 0x45, 0x4f, 0x61, + 0x4d, 0x7e, 0x9a, 0x7d, 0x50, 0x40, 0x48, 0x50, + 0x14, 0x75, 0xcb, 0xd6, 0xbf, 0xb1, 0xa1, 0x8c, + 0x79, 0x82, 0x80, 0x60, 0x2e, 0x18, 0x3a, 0x69, + 0x94, 0x80, 0x77, 0x8c, 0xa5, 0x99, 0x62, 0x2d, + 0x3b, 0x68, 0x96, 0x9a, 0x7b, 0x5f, 0x60, 0x6d, + 0x55, 0x47, 0x32, 0x39, 0x45, 0x37, 0x47, 0x84, + 0x6f, 0x6b, 0x73, 0x87, 0x82, 0x5d, 0x49, 0x56, + 0x77, 0x67, 0x5b, 0x5c, 0x5d, 0x5b, 0x60, 0x6b, + 0x80, 0x94, 0x94, 0x95, 0x99, 0x6a, 0x24, 0x07, + 0x88, 0x99, 0xb1, 0xc7, 0xd1, 0xce, 0xc3, 0xbb, + 0xb4, 0xd2, 0xed, 0xeb, 0xd1, 0xbd, 0xc0, 0xcc, + 0xce, 0xa3, 0x78, 0x56, 0x27, 0x03, 0x16, 0x44, + 0x54, 0x4d, 0x4f, 0x62, 0x7d, 0x8b, 0x84, 0x77, + 0xb1, 0x93, 0x64, 0x3a, 0x25, 0x26, 0x36, 0x44, + 0x1e, 0x23, 0x2e, 0x42, 0x5d, 0x7c, 0x98, 0xa8, + 0xdf, 0xae, 0x6f, 0x45, 0x3b, 0x42, 0x48, 0x4a, + 0x09, 0x21, 0x39, 0x3f, 0x3e, 0x4f, 0x76, 0x98, + 0xc9, 0xdd, 0xe9, 0xd6, 0xa8, 0x7d, 0x66, 0x61, + 0x57, 0x67, 0x6d, 0x56, 0x34, 0x29, 0x40, 0x5c, + 0xa2, 0x99, 0x6f, 0x78, 0xba, 0xbf, 0x91, 0x85, + 0x7d, 0x9e, 0xc7, 0xda, 0xc2, 0x88, 0x46, 0x1b, + 0x32, 0x23, 0x32, 0x52, 0x4e, 0x3b, 0x5a, 0x98, + 0xff, 0xe0, 0x84, 0x2d, 0x00, 0x03, 0x2a, 0x4d, + 0x8e, 0x63, 0x4c, 0x53, 0x45, 0x31, 0x4f, 0x8a, + 0x8a, 0x9b, 0x7e, 0x3c, 0x28, 0x4f, 0x6a, 0x62, + 0x30, 0x49, 0x67, 0x78, 0x7c, 0x80, 0x8a, 0x95, + 0xa1, 0xcf, 0xe1, 0xc5, 0xb7, 0xc3, 0xb6, 0x94, + 0x77, 0x5b, 0x3e, 0x3c, 0x58, 0x81, 0xa0, 0xae, + 0xa3, 0x87, 0x4f, 0x30, 0x62, 0xb1, 0xbf, 0x99, + 0xe3, 0xa4, 0x62, 0x4e, 0x5b, 0x54, 0x24, 0x00, + 0x1a, 0x84, 0xeb, 0xff, 0xd7, 0x9b, 0x5d, 0x2f, + 0x45, 0x36, 0x1f, 0x16, 0x31, 0x5a, 0x70, 0x6f, + 0xea, 0xb7, 0x97, 0xbb, 0xfc, 0xff, 0xc1, 0x73, + 0x27, 0xcf, 0xff, 0xb0, 0x6a, 0x77, 0x7c, 0x35, + 0x16, 0x3a, 0x64, 0x78, 0x74, 0x6b, 0x6d, 0x75, + 0x8a, 0x87, 0x84, 0x82, 0x82, 0x85, 0x89, 0x8b, + 0x89, 0x76, 0x64, 0x63, 0x6e, 0x73, 0x6a, 0x5d, + 0x65, 0x74, 0x83, 0x86, 0x7a, 0x67, 0x57, 0x4e, + 0x6c, 0x6d, 0x6d, 0x6e, 0x70, 0x73, 0x75, 0x76, + 0x6b, 0x64, 0x5c, 0x5a, 0x5b, 0x58, 0x51, 0x4a, + 0x4b, 0x57, 0x41, 0x3d, 0x4c, 0x3d, 0x6b, 0xe3, + 0x95, 0x4a, 0x2c, 0x52, 0x5f, 0x42, 0x49, 0x78, + 0x44, 0x7d, 0x9c, 0x77, 0x3c, 0x1e, 0x1a, 0x19, + 0x39, 0x48, 0x59, 0x61, 0x64, 0x6c, 0x7d, 0x8c, + 0x6c, 0x53, 0x54, 0x73, 0x76, 0x4f, 0x2e, 0x28, + 0x44, 0x9a, 0xdb, 0xd0, 0xb0, 0xb1, 0xc2, 0xc8, + 0x97, 0x72, 0x59, 0x59, 0x50, 0x3c, 0x3b, 0x4d, + 0x9d, 0xa2, 0xa3, 0x9d, 0x98, 0xa1, 0xb7, 0xcb, + 0x85, 0x78, 0x6b, 0x69, 0x70, 0x77, 0x78, 0x75, + 0x6e, 0x58, 0x44, 0x52, 0x59, 0x34, 0x33, 0x6b, + 0x86, 0x95, 0x94, 0x90, 0x87, 0x60, 0x44, 0x4f, + 0x52, 0x51, 0x48, 0x45, 0x5b, 0x78, 0x7a, 0x69, + 0x74, 0x90, 0x9f, 0xb2, 0xbe, 0x89, 0x33, 0x08, + 0x43, 0x5f, 0x8c, 0xba, 0xdb, 0xeb, 0xec, 0xea, + 0xd8, 0xd8, 0xd0, 0xbd, 0xa9, 0xa0, 0xa7, 0xb1, + 0x5d, 0x5e, 0x76, 0x8f, 0x7e, 0x55, 0x4f, 0x68, + 0x52, 0x57, 0x68, 0x87, 0xa3, 0xa9, 0x96, 0x81, + 0x0f, 0x38, 0x71, 0x98, 0x93, 0x63, 0x22, 0x00, + 0x51, 0x52, 0x57, 0x62, 0x74, 0x8a, 0x9f, 0xac, + 0x6f, 0x67, 0x62, 0x67, 0x6a, 0x5a, 0x38, 0x1b, + 0x53, 0x4b, 0x3d, 0x33, 0x3c, 0x61, 0x96, 0xbd, + 0xe3, 0xcb, 0x9a, 0x5b, 0x26, 0x11, 0x1d, 0x30, + 0x49, 0x45, 0x53, 0x7c, 0xa9, 0xb6, 0x9c, 0x7b, + 0x83, 0xd3, 0xfe, 0xff, 0xf7, 0xb9, 0x85, 0x92, + 0xd9, 0xa6, 0x80, 0x96, 0xce, 0xe3, 0xbd, 0x8a, + 0xa0, 0x8e, 0x85, 0x8b, 0x84, 0x64, 0x3d, 0x27, + 0x0d, 0x1b, 0x2c, 0x3a, 0x4e, 0x73, 0xa5, 0xcb, + 0xa6, 0x97, 0x8a, 0x83, 0x79, 0x6f, 0x6e, 0x74, + 0x82, 0x8f, 0x99, 0x9b, 0x92, 0x76, 0x45, 0x19, + 0x10, 0x0e, 0x1a, 0x40, 0x6f, 0x87, 0x81, 0x72, + 0xb4, 0xb9, 0xaa, 0xa2, 0xc5, 0xe4, 0xba, 0x6f, + 0x0a, 0x0c, 0x23, 0x57, 0x94, 0xbd, 0xc3, 0xba, + 0xc0, 0xf1, 0xf8, 0xc1, 0x9c, 0xb0, 0xcf, 0xd5, + 0xe2, 0x9a, 0x5c, 0x6b, 0xab, 0xc7, 0x9a, 0x5e, + 0x73, 0xa2, 0xc0, 0xc1, 0xcb, 0xd6, 0xb7, 0x83, + 0x96, 0x55, 0x31, 0x38, 0x28, 0x14, 0x4c, 0xa7, + 0xbb, 0xbb, 0xcb, 0xec, 0xff, 0xde, 0x8f, 0x4d, + 0x4a, 0x1a, 0x52, 0xbb, 0x76, 0x15, 0x2c, 0x29, + 0x37, 0x4a, 0x60, 0x68, 0x65, 0x64, 0x6d, 0x77, + 0x78, 0x75, 0x72, 0x71, 0x74, 0x7a, 0x81, 0x86, + 0x7c, 0x72, 0x6d, 0x72, 0x78, 0x6e, 0x53, 0x3a, + 0x53, 0x5f, 0x6d, 0x74, 0x75, 0x74, 0x77, 0x7b, + 0x81, 0x7b, 0x72, 0x69, 0x64, 0x64, 0x67, 0x69, + 0x62, 0x5b, 0x54, 0x52, 0x54, 0x52, 0x4b, 0x44, + 0x76, 0x7c, 0x69, 0x51, 0x4e, 0x48, 0x30, 0x1f, + 0x49, 0x21, 0x12, 0x25, 0x2f, 0x37, 0x6d, 0xb3, + 0x9c, 0xd4, 0xe2, 0xa1, 0x57, 0x3a, 0x36, 0x30, + 0x46, 0x43, 0x47, 0x5a, 0x75, 0x88, 0x8c, 0x89, + 0x7e, 0x51, 0x3f, 0x5d, 0x73, 0x62, 0x49, 0x42, + 0x5b, 0xaa, 0xdc, 0xbf, 0x96, 0x9f, 0xc4, 0xdb, + 0xcd, 0xbc, 0xcf, 0xfb, 0xfc, 0xcc, 0xac, 0xb1, + 0x46, 0x74, 0xa2, 0xa6, 0x8e, 0x88, 0xa8, 0xcd, + 0xce, 0x82, 0x3a, 0x3c, 0x75, 0x99, 0x83, 0x5a, + 0x4e, 0x44, 0x31, 0x3b, 0x53, 0x49, 0x49, 0x6e, + 0x97, 0xb2, 0x9c, 0x75, 0x6a, 0x54, 0x42, 0x50, + 0x45, 0x4c, 0x48, 0x40, 0x4a, 0x5f, 0x62, 0x55, + 0x6e, 0x7d, 0x7c, 0x85, 0x93, 0x67, 0x1a, 0x00, + 0x5a, 0x72, 0x96, 0xb7, 0xc9, 0xc9, 0xbe, 0xb3, + 0xad, 0xb5, 0xbd, 0xba, 0xa3, 0x7b, 0x4f, 0x33, + 0x3d, 0x53, 0x8a, 0xbc, 0xb2, 0x7e, 0x64, 0x6e, + 0x2b, 0x31, 0x3d, 0x48, 0x4e, 0x4b, 0x41, 0x38, + 0x2c, 0x23, 0x17, 0x11, 0x19, 0x2b, 0x41, 0x50, + 0x61, 0x5b, 0x52, 0x4c, 0x4b, 0x50, 0x57, 0x5c, + 0x61, 0x56, 0x4f, 0x56, 0x61, 0x5e, 0x49, 0x34, + 0x21, 0x31, 0x4e, 0x71, 0x92, 0xaa, 0xb8, 0xbe, + 0xac, 0x7a, 0x40, 0x26, 0x30, 0x41, 0x43, 0x3c, + 0x3c, 0x55, 0x78, 0x97, 0xb2, 0xd0, 0xf3, 0xff, + 0xcd, 0xea, 0xc9, 0x8d, 0x68, 0x3b, 0x2d, 0x58, + 0x65, 0x50, 0x42, 0x55, 0x79, 0x8a, 0x7c, 0x66, + 0x67, 0x8e, 0xa6, 0x92, 0x6e, 0x5f, 0x65, 0x6d, + 0x4f, 0x41, 0x4b, 0x84, 0xca, 0xe2, 0xbe, 0x8f, + 0x67, 0x6f, 0x65, 0x5d, 0x7e, 0xa7, 0x93, 0x5e, + 0x50, 0x32, 0x3f, 0x7f, 0xa6, 0x97, 0x83, 0x85, + 0xd4, 0x96, 0x50, 0x39, 0x59, 0x89, 0xa8, 0xb2, + 0x6b, 0x52, 0x56, 0x78, 0x83, 0x83, 0xac, 0xe8, + 0xb7, 0x9c, 0x87, 0x92, 0xb8, 0xd6, 0xdb, 0xd3, + 0x99, 0x8a, 0x8b, 0x8f, 0x6f, 0x55, 0x80, 0xcb, + 0xbe, 0xb6, 0xaa, 0x9e, 0x97, 0x98, 0x9e, 0xa2, + 0xc3, 0xd3, 0xd5, 0xdc, 0xff, 0xff, 0xca, 0x63, + 0x56, 0x80, 0x7b, 0x37, 0x0e, 0x39, 0x89, 0xbb, + 0x74, 0x92, 0xb3, 0xba, 0x9f, 0x6e, 0x3f, 0x24, + 0x24, 0x14, 0x1a, 0x60, 0x61, 0x41, 0x57, 0x40, + 0x34, 0x37, 0x43, 0x5a, 0x73, 0x7f, 0x7c, 0x74, + 0x7a, 0x78, 0x75, 0x74, 0x79, 0x82, 0x8b, 0x91, + 0x7c, 0x7e, 0x80, 0x7e, 0x79, 0x74, 0x71, 0x71, + 0x71, 0x75, 0x76, 0x74, 0x72, 0x77, 0x83, 0x8d, + 0x89, 0x82, 0x79, 0x72, 0x72, 0x78, 0x82, 0x89, + 0x6b, 0x64, 0x5d, 0x5c, 0x5d, 0x5c, 0x55, 0x4e, + 0x4e, 0x4e, 0x44, 0x39, 0x29, 0x1c, 0x39, 0x70, + 0x3f, 0x66, 0x7f, 0x68, 0x41, 0x4f, 0xa5, 0xfb, + 0xfd, 0xd6, 0x8d, 0x59, 0x6f, 0x9c, 0x89, 0x4f, + 0x56, 0x3f, 0x2f, 0x3a, 0x54, 0x5f, 0x4e, 0x38, + 0x7a, 0x6f, 0x62, 0x57, 0x52, 0x56, 0x66, 0x77, + 0x24, 0x75, 0xa6, 0x85, 0x55, 0x5b, 0x83, 0x9d, + 0xa4, 0xaf, 0xd9, 0xfb, 0xdc, 0xa8, 0xb9, 0xf5, + 0xa4, 0x82, 0x63, 0x65, 0x7d, 0x89, 0x78, 0x61, + 0x5e, 0x49, 0x45, 0x6a, 0x9c, 0xa7, 0x7f, 0x50, + 0x5b, 0x58, 0x33, 0x1c, 0x2f, 0x34, 0x2c, 0x36, + 0x58, 0x8f, 0x8a, 0x68, 0x69, 0x5f, 0x48, 0x4c, + 0x1e, 0x2b, 0x3a, 0x42, 0x4a, 0x58, 0x6b, 0x78, + 0x93, 0x8b, 0x6a, 0x5c, 0x69, 0x4f, 0x1a, 0x05, + 0xed, 0xed, 0xcb, 0x97, 0x8d, 0xad, 0xc0, 0xb8, + 0xcc, 0xc1, 0xaf, 0x9c, 0x89, 0x73, 0x5f, 0x52, + 0x9d, 0x8a, 0x6b, 0x4b, 0x35, 0x2b, 0x2b, 0x2d, + 0x14, 0x3c, 0x4d, 0x32, 0x1c, 0x23, 0x2d, 0x2a, + 0x2a, 0x10, 0x0e, 0x23, 0x26, 0x27, 0x59, 0x9d, + 0x3f, 0x3f, 0x6c, 0x9e, 0x82, 0x3d, 0x3c, 0x72, + 0x56, 0x5e, 0x54, 0x2d, 0x03, 0x00, 0x29, 0x54, + 0x4c, 0x33, 0x38, 0x7e, 0xda, 0xff, 0xd6, 0x9b, + 0x35, 0x2f, 0x4c, 0x80, 0x8c, 0x63, 0x3f, 0x38, + 0x3c, 0x4e, 0x73, 0xa3, 0xc9, 0xd2, 0xc0, 0xab, + 0x62, 0x55, 0x4a, 0x4e, 0x61, 0x75, 0x80, 0x83, + 0x3f, 0x25, 0x1f, 0x4d, 0x94, 0xba, 0xa8, 0x85, + 0x81, 0x7b, 0x68, 0x45, 0x20, 0x08, 0x04, 0x09, + 0x22, 0x8d, 0xf6, 0xfd, 0xb3, 0x78, 0x84, 0xad, + 0xc8, 0xc3, 0x98, 0x63, 0x62, 0x86, 0x89, 0x6a, + 0x5b, 0x7f, 0x89, 0x6f, 0x65, 0x6d, 0x56, 0x2a, + 0x47, 0x24, 0x13, 0x38, 0x77, 0x94, 0x77, 0x4d, + 0x1a, 0x5c, 0xa5, 0xbd, 0xab, 0x9e, 0xb2, 0xcf, + 0xb4, 0xcd, 0xc0, 0x9e, 0xb2, 0xe2, 0xce, 0x8d, + 0xa3, 0xd2, 0xa0, 0x3e, 0x34, 0x5c, 0x6a, 0x6a, + 0x79, 0x5d, 0x58, 0x66, 0x57, 0x3c, 0x57, 0x91, + 0x97, 0x9f, 0xa3, 0xa0, 0x9d, 0xa9, 0xc4, 0xdb, + 0x85, 0x72, 0x59, 0x4a, 0x51, 0x6f, 0x93, 0xac, + 0x8b, 0x51, 0x29, 0x49, 0x8f, 0xa5, 0x6e, 0x2b, + 0x12, 0x19, 0x63, 0x7f, 0x33, 0x12, 0x40, 0x5f, + 0x67, 0x61, 0x60, 0x68, 0x74, 0x78, 0x71, 0x68, + 0x61, 0x6b, 0x7a, 0x87, 0x8d, 0x8b, 0x85, 0x80, + 0x83, 0x80, 0x7b, 0x75, 0x70, 0x6d, 0x6b, 0x6b, + 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x83, 0x84, 0x85, + 0x6d, 0x71, 0x76, 0x79, 0x78, 0x73, 0x6c, 0x67, + 0x64, 0x65, 0x65, 0x63, 0x5e, 0x56, 0x4e, 0x4a, + 0x56, 0x4b, 0x3c, 0x2f, 0x26, 0x24, 0x2b, 0x34, + 0x4b, 0x83, 0xa6, 0x7d, 0x33, 0x24, 0x6c, 0xbf, + 0xa5, 0x60, 0x24, 0x1f, 0x31, 0x3c, 0x45, 0x53, + 0x2f, 0x29, 0x28, 0x33, 0x49, 0x5f, 0x6e, 0x73, + 0x5c, 0x63, 0x5b, 0x67, 0xb0, 0xeb, 0xb9, 0x54, + 0x52, 0x8f, 0x9d, 0x6f, 0x62, 0x78, 0x59, 0x12, + 0x6f, 0xbd, 0xd5, 0xc8, 0xd6, 0xd2, 0xbd, 0xc3, + 0xb1, 0x80, 0x44, 0x25, 0x2a, 0x3f, 0x4d, 0x51, + 0x74, 0x66, 0x50, 0x3f, 0x3a, 0x45, 0x58, 0x66, + 0x55, 0x56, 0x54, 0x4b, 0x3d, 0x31, 0x29, 0x25, + 0x36, 0x37, 0x3a, 0x3d, 0x41, 0x44, 0x47, 0x49, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x67, 0x7d, 0x71, 0x77, 0x89, 0x81, 0x1f, 0x09, + 0x9c, 0xa6, 0x95, 0x77, 0x82, 0xb4, 0xd5, 0xd4, + 0xc9, 0xbf, 0x9f, 0x6d, 0x47, 0x50, 0x83, 0xb4, + 0x88, 0x78, 0x5f, 0x48, 0x3a, 0x38, 0x3e, 0x43, + 0x50, 0x5b, 0x4a, 0x1f, 0x0f, 0x25, 0x39, 0x38, + 0x58, 0x5e, 0x79, 0x8d, 0x6b, 0x32, 0x24, 0x3d, + 0x7c, 0x67, 0x45, 0x34, 0x42, 0x4c, 0x2c, 0x00, + 0x1b, 0x3a, 0x62, 0x7c, 0x82, 0x7c, 0x78, 0x77, + 0xb1, 0xb7, 0xb9, 0xad, 0x8f, 0x65, 0x3d, 0x25, + 0x3f, 0x38, 0x51, 0x7d, 0x81, 0x56, 0x35, 0x33, + 0x24, 0x61, 0xaa, 0xce, 0xc4, 0xaa, 0x9c, 0x9a, + 0x57, 0x8a, 0xbe, 0xc7, 0xab, 0x93, 0x98, 0xa9, + 0x88, 0x8c, 0x9a, 0xab, 0xaf, 0x95, 0x64, 0x3e, + 0xa6, 0x84, 0x66, 0x6d, 0x93, 0xb8, 0xc3, 0xbf, + 0xde, 0xdf, 0xe5, 0xe8, 0xd8, 0xa8, 0x65, 0x32, + 0x3b, 0x52, 0x76, 0x8c, 0x7e, 0x59, 0x3d, 0x33, + 0x2d, 0x2d, 0x37, 0x45, 0x46, 0x3a, 0x32, 0x33, + 0x3f, 0x12, 0x00, 0x26, 0x83, 0xc7, 0xcc, 0xb5, + 0x91, 0xb8, 0xe3, 0xee, 0xdd, 0xcb, 0xcd, 0xd7, + 0xe4, 0xcc, 0xc1, 0xbc, 0x99, 0x72, 0x80, 0xaf, + 0xd1, 0xcb, 0x9f, 0x96, 0xc9, 0xc8, 0x7b, 0x41, + 0x6a, 0x75, 0x68, 0x45, 0x33, 0x44, 0x5d, 0x67, + 0x3e, 0x35, 0x24, 0x13, 0x17, 0x3e, 0x7c, 0xab, + 0xa7, 0xae, 0xb5, 0xb7, 0xae, 0x9c, 0x88, 0x7a, + 0x93, 0x97, 0x99, 0x93, 0x89, 0x84, 0x86, 0x8b, + 0x83, 0xaa, 0xa8, 0x7b, 0x59, 0x4f, 0x49, 0x46, + 0x68, 0x62, 0x5f, 0x65, 0x70, 0x77, 0x74, 0x6f, + 0x70, 0x73, 0x78, 0x7c, 0x7f, 0x80, 0x80, 0x80, + 0x73, 0x78, 0x80, 0x84, 0x81, 0x77, 0x6b, 0x63, + 0x66, 0x67, 0x68, 0x69, 0x6b, 0x6c, 0x6d, 0x6e, + 0x8b, 0x8d, 0x8e, 0x8c, 0x86, 0x7c, 0x73, 0x6d, + 0x65, 0x66, 0x66, 0x64, 0x5e, 0x57, 0x4f, 0x4a, + 0x55, 0x43, 0x30, 0x2b, 0x31, 0x35, 0x31, 0x2b, + 0x3a, 0x37, 0x2f, 0x22, 0x19, 0x1c, 0x2b, 0x39, + 0x6b, 0x40, 0x25, 0x32, 0x4b, 0x62, 0x83, 0xa6, + 0x92, 0x80, 0x64, 0x48, 0x3a, 0x40, 0x53, 0x64, + 0x49, 0x54, 0x55, 0x4c, 0x51, 0x66, 0x6f, 0x6a, + 0x26, 0x59, 0x97, 0xa7, 0x78, 0x46, 0x4c, 0x72, + 0xb3, 0xd4, 0xc3, 0xbb, 0xed, 0xfa, 0xcd, 0xb1, + 0xc9, 0x82, 0x38, 0x28, 0x4d, 0x6c, 0x64, 0x4c, + 0x3c, 0x47, 0x5a, 0x6e, 0x72, 0x5f, 0x3c, 0x20, + 0x34, 0x39, 0x3e, 0x41, 0x40, 0x3e, 0x3c, 0x3b, + 0x24, 0x26, 0x2b, 0x31, 0x38, 0x3e, 0x42, 0x45, + 0x50, 0x4f, 0x4d, 0x4a, 0x46, 0x43, 0x41, 0x40, + 0x3c, 0x51, 0x4a, 0x55, 0x6e, 0x73, 0x1f, 0x0f, + 0x85, 0x9b, 0x98, 0x7d, 0x76, 0x84, 0x7d, 0x62, + 0x16, 0x21, 0x2b, 0x29, 0x21, 0x21, 0x2e, 0x3c, + 0x5c, 0x50, 0x3d, 0x2e, 0x29, 0x2f, 0x3b, 0x44, + 0x72, 0x70, 0x55, 0x36, 0x3d, 0x5f, 0x6a, 0x5b, + 0x58, 0x3c, 0x31, 0x46, 0x59, 0x5d, 0x67, 0x7a, + 0x67, 0x36, 0x39, 0x6f, 0x71, 0x43, 0x4e, 0x8c, + 0x75, 0x6a, 0x56, 0x45, 0x4d, 0x7b, 0xc2, 0xf8, + 0xd7, 0xbb, 0xa3, 0xa5, 0xaf, 0x99, 0x60, 0x2b, + 0x4e, 0x38, 0x3a, 0x53, 0x56, 0x44, 0x4b, 0x68, + 0xe3, 0xea, 0xe7, 0xce, 0xae, 0x9f, 0xaa, 0xba, + 0x9a, 0x84, 0x69, 0x5f, 0x69, 0x7d, 0x8e, 0x97, + 0x92, 0x94, 0x8f, 0x82, 0x78, 0x80, 0x99, 0xb0, + 0xac, 0xb1, 0xa8, 0x8c, 0x75, 0x82, 0xb4, 0xe1, + 0xaf, 0xb3, 0x9b, 0x5d, 0x23, 0x29, 0x73, 0xbb, + 0xc9, 0xa5, 0x90, 0x83, 0x53, 0x20, 0x32, 0x6e, + 0x66, 0x3a, 0x2e, 0x4e, 0x5d, 0x58, 0x79, 0xb0, + 0xd1, 0xed, 0xff, 0xff, 0xec, 0xb4, 0x81, 0x63, + 0x71, 0x72, 0x74, 0x7a, 0x87, 0x9e, 0xb8, 0xcb, + 0xad, 0x96, 0x99, 0x9c, 0x67, 0x37, 0x76, 0xe6, + 0xd8, 0xa5, 0x5c, 0x53, 0x7f, 0x77, 0x51, 0x50, + 0x4f, 0x66, 0x9d, 0xd1, 0xc5, 0x86, 0x57, 0x4f, + 0x87, 0x52, 0x2a, 0x45, 0x8c, 0xb9, 0xac, 0x89, + 0x22, 0x1f, 0x1e, 0x24, 0x37, 0x52, 0x6e, 0x80, + 0x73, 0x80, 0x8e, 0x92, 0x92, 0x9a, 0xaf, 0xc1, + 0xb1, 0xd8, 0xda, 0xd6, 0xe7, 0xcc, 0x91, 0x79, + 0x62, 0x63, 0x68, 0x72, 0x7c, 0x7f, 0x7a, 0x74, + 0x8e, 0x8a, 0x85, 0x7f, 0x7c, 0x7c, 0x7e, 0x7f, + 0x7d, 0x84, 0x8d, 0x94, 0x94, 0x8c, 0x82, 0x7b, + 0x6f, 0x70, 0x71, 0x72, 0x74, 0x76, 0x77, 0x77, + 0x81, 0x82, 0x81, 0x7f, 0x79, 0x72, 0x6a, 0x66, + 0x66, 0x67, 0x67, 0x65, 0x60, 0x58, 0x50, 0x4b, + 0x4a, 0x4e, 0x3a, 0x15, 0x0a, 0x1d, 0x28, 0x23, + 0x20, 0x24, 0x2c, 0x38, 0x48, 0x56, 0x62, 0x68, + 0x69, 0x40, 0x2f, 0x51, 0x7c, 0x92, 0x9f, 0xac, + 0x96, 0x9a, 0x92, 0x75, 0x55, 0x49, 0x57, 0x6b, + 0x69, 0x51, 0x40, 0x45, 0x50, 0x56, 0x62, 0x71, + 0x86, 0x77, 0x46, 0x12, 0x12, 0x36, 0x3e, 0x28, + 0x50, 0x9b, 0xab, 0x97, 0xa9, 0xba, 0xc6, 0xe6, + 0xab, 0xa6, 0x9b, 0x88, 0x6f, 0x55, 0x41, 0x35, + 0x51, 0x43, 0x3b, 0x45, 0x55, 0x54, 0x3c, 0x23, + 0x2b, 0x31, 0x3e, 0x4b, 0x57, 0x5d, 0x5e, 0x5d, + 0x6c, 0x6b, 0x69, 0x65, 0x62, 0x5f, 0x5c, 0x5b, + 0x72, 0x70, 0x6e, 0x6a, 0x66, 0x63, 0x60, 0x5f, + 0x4c, 0x59, 0x4d, 0x50, 0x5f, 0x67, 0x1d, 0x0f, + 0xac, 0xcc, 0xd4, 0xb5, 0x96, 0x7b, 0x47, 0x0f, + 0x4c, 0x57, 0x7c, 0xba, 0xe9, 0xdf, 0x9f, 0x62, + 0x5b, 0x50, 0x3f, 0x32, 0x2f, 0x38, 0x45, 0x4f, + 0x44, 0x4b, 0x48, 0x4b, 0x6c, 0x90, 0x87, 0x63, + 0x54, 0x5f, 0x70, 0x76, 0x61, 0x3f, 0x28, 0x22, + 0x37, 0x33, 0x2e, 0x35, 0x49, 0x50, 0x30, 0x07, + 0x57, 0x23, 0x00, 0x00, 0x38, 0x75, 0x8f, 0x8e, + 0x72, 0x91, 0xa5, 0x8f, 0x5c, 0x36, 0x33, 0x41, + 0x47, 0x23, 0x0e, 0x11, 0x10, 0x18, 0x4b, 0x8a, + 0xaa, 0x97, 0x90, 0xaa, 0xd1, 0xdd, 0xc2, 0xa1, + 0x6b, 0x43, 0x20, 0x27, 0x4b, 0x5f, 0x4e, 0x33, + 0x68, 0x7c, 0x96, 0xa5, 0xa8, 0xaa, 0xb1, 0xb9, + 0x99, 0x84, 0x6e, 0x6a, 0x79, 0x8f, 0x9d, 0xa2, + 0x22, 0x39, 0x54, 0x5e, 0x52, 0x39, 0x21, 0x14, + 0x34, 0x24, 0x26, 0x37, 0x35, 0x25, 0x2c, 0x45, + 0x29, 0x36, 0x66, 0x9d, 0xa4, 0x79, 0x53, 0x4a, + 0x09, 0x47, 0x8f, 0xaf, 0x9f, 0x7f, 0x6f, 0x6e, + 0x77, 0x31, 0x00, 0x15, 0x65, 0x93, 0x77, 0x44, + 0x6f, 0x8d, 0x97, 0x70, 0x37, 0x17, 0x19, 0x25, + 0x2f, 0x2e, 0x1d, 0x32, 0x66, 0x69, 0x5b, 0x6f, + 0x48, 0x3c, 0x5f, 0x99, 0x8f, 0x44, 0x1a, 0x27, + 0x33, 0x2b, 0x33, 0x53, 0x76, 0x77, 0x52, 0x2c, + 0x2f, 0x42, 0x60, 0x7d, 0x8f, 0x93, 0x8e, 0x89, + 0x89, 0x7a, 0x6c, 0x6a, 0x6a, 0x5e, 0x43, 0x2b, + 0x4c, 0x3c, 0x2d, 0x32, 0x3e, 0x39, 0x2f, 0x2e, + 0x39, 0x46, 0x5b, 0x71, 0x81, 0x87, 0x83, 0x7f, + 0x7d, 0x7d, 0x7e, 0x80, 0x83, 0x85, 0x87, 0x89, + 0x77, 0x76, 0x76, 0x76, 0x77, 0x7a, 0x7d, 0x7e, + 0x72, 0x73, 0x74, 0x76, 0x77, 0x79, 0x7a, 0x7a, + 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6c, 0x6b, 0x6a, + 0x68, 0x68, 0x69, 0x67, 0x61, 0x5a, 0x52, 0x4d, + 0x32, 0x1e, 0x20, 0x35, 0x30, 0x17, 0x1d, 0x3c, + 0x23, 0x2d, 0x38, 0x3d, 0x3b, 0x38, 0x39, 0x3b, + 0x23, 0x21, 0x38, 0x5d, 0x67, 0x58, 0x56, 0x65, + 0x60, 0x87, 0xaa, 0xa0, 0x6c, 0x36, 0x1c, 0x18, + 0x66, 0x4e, 0x36, 0x34, 0x43, 0x49, 0x36, 0x1d, + 0x69, 0x58, 0x3b, 0x4e, 0xb6, 0xff, 0xfa, 0x9e, + 0x45, 0x62, 0x4c, 0x47, 0x8b, 0xb8, 0xaf, 0xac, + 0xa2, 0xa3, 0x90, 0x61, 0x35, 0x30, 0x59, 0x84, + 0x5a, 0x30, 0x04, 0x00, 0x0e, 0x26, 0x2b, 0x24, + 0x31, 0x27, 0x1c, 0x1c, 0x27, 0x39, 0x47, 0x4e, + 0x5e, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x59, + 0x60, 0x60, 0x60, 0x60, 0x5f, 0x5f, 0x5f, 0x5f, + 0x67, 0x6b, 0x59, 0x53, 0x54, 0x5d, 0x1b, 0x0e, + 0xb2, 0xc9, 0xc7, 0xa6, 0x94, 0x93, 0x7c, 0x57, + 0x59, 0x59, 0x69, 0x8e, 0xb3, 0xb6, 0x95, 0x72, + 0x79, 0x6d, 0x5b, 0x4c, 0x48, 0x4f, 0x5c, 0x65, + 0x5c, 0x61, 0x5a, 0x57, 0x72, 0x91, 0x84, 0x5d, + 0x29, 0x70, 0xad, 0xa3, 0x6d, 0x49, 0x51, 0x68, + 0x4d, 0x6a, 0x76, 0x69, 0x6a, 0x7b, 0x75, 0x5d, + 0x36, 0x5e, 0x7e, 0x6e, 0x43, 0x31, 0x4d, 0x73, + 0x76, 0x9a, 0xb0, 0x94, 0x59, 0x35, 0x3f, 0x5a, + 0xb7, 0xa0, 0x92, 0x8b, 0x70, 0x5a, 0x7a, 0xb2, + 0xb4, 0x95, 0x82, 0x99, 0xc2, 0xcb, 0xa5, 0x78, + 0x3e, 0x50, 0x66, 0x70, 0x6c, 0x60, 0x55, 0x50, + 0xe0, 0xc6, 0xa5, 0x91, 0x8d, 0x91, 0x91, 0x8f, + 0x65, 0x5c, 0x54, 0x57, 0x5e, 0x5c, 0x4f, 0x42, + 0x5d, 0x36, 0x1a, 0x32, 0x68, 0x83, 0x6c, 0x49, + 0x07, 0x15, 0x21, 0x35, 0x58, 0x62, 0x2b, 0x00, + 0x11, 0x36, 0x57, 0x6f, 0x9f, 0xdf, 0xff, 0xff, + 0xe3, 0x94, 0x36, 0x07, 0x0c, 0x1c, 0x17, 0x07, + 0x0f, 0x51, 0x92, 0x9a, 0x7b, 0x77, 0xa7, 0xde, + 0xff, 0xe4, 0x89, 0x1e, 0x00, 0x28, 0x3b, 0x24, + 0x03, 0x22, 0x27, 0x39, 0x6e, 0x74, 0x4b, 0x37, + 0x47, 0x46, 0x3b, 0x31, 0x3f, 0x60, 0x76, 0x7a, + 0x27, 0x24, 0x27, 0x32, 0x40, 0x45, 0x3f, 0x36, + 0x8f, 0x89, 0x80, 0x77, 0x72, 0x71, 0x72, 0x74, + 0x72, 0x84, 0x9a, 0xa5, 0x9c, 0x85, 0x6b, 0x5b, + 0x30, 0x3e, 0x3f, 0x34, 0x30, 0x2d, 0x27, 0x23, + 0x43, 0x4f, 0x62, 0x76, 0x87, 0x95, 0x9f, 0xa4, + 0xa0, 0xa4, 0xa8, 0xa9, 0xa3, 0x98, 0x8c, 0x84, + 0x77, 0x76, 0x76, 0x76, 0x77, 0x7a, 0x7d, 0x7e, + 0x7b, 0x7b, 0x7c, 0x7e, 0x7f, 0x81, 0x82, 0x83, + 0x75, 0x74, 0x74, 0x75, 0x76, 0x79, 0x7b, 0x7c, + 0x69, 0x6a, 0x6a, 0x68, 0x63, 0x5b, 0x54, 0x4f, + 0x66, 0x6b, 0x61, 0x49, 0x38, 0x35, 0x31, 0x29, + 0x36, 0x27, 0x1d, 0x26, 0x35, 0x36, 0x22, 0x0c, + 0x5b, 0x80, 0xb0, 0xb6, 0x77, 0x2a, 0x13, 0x28, + 0x4f, 0x89, 0xc8, 0xd8, 0xb2, 0x7c, 0x59, 0x4e, + 0x5a, 0x72, 0x65, 0x35, 0x25, 0x38, 0x30, 0x0d, + 0x30, 0x26, 0x59, 0xb9, 0xda, 0xa6, 0x73, 0x6c, + 0x71, 0x7e, 0x56, 0x43, 0x7c, 0x9a, 0x7e, 0x6c, + 0xa9, 0x96, 0x87, 0x92, 0xb5, 0xdd, 0xf6, 0xff, + 0xe9, 0xda, 0xcf, 0xd4, 0xe2, 0xe3, 0xd2, 0xbf, + 0x7a, 0x83, 0x95, 0xa6, 0xaa, 0x97, 0x73, 0x58, + 0x63, 0x62, 0x61, 0x5f, 0x5d, 0x5b, 0x5a, 0x59, + 0x54, 0x54, 0x53, 0x52, 0x51, 0x51, 0x50, 0x50, + 0x47, 0x48, 0x3c, 0x3a, 0x38, 0x4a, 0x18, 0x0d, + 0x9a, 0x96, 0x70, 0x3a, 0x31, 0x55, 0x6f, 0x6b, + 0x3d, 0x64, 0x85, 0x7a, 0x52, 0x3c, 0x4e, 0x6b, + 0x63, 0x58, 0x47, 0x3b, 0x39, 0x42, 0x50, 0x5a, + 0x20, 0x2b, 0x2b, 0x2e, 0x59, 0x9d, 0xc2, 0xc2, + 0xe1, 0xc7, 0x87, 0x3f, 0x25, 0x3e, 0x5b, 0x63, + 0x5c, 0x65, 0x71, 0x61, 0x2b, 0x0b, 0x3a, 0x86, + 0xe1, 0xff, 0xff, 0xac, 0x2f, 0x00, 0x1e, 0x62, + 0xac, 0xa6, 0xa2, 0xa7, 0xb1, 0xb5, 0xb0, 0xa9, + 0xbb, 0xbc, 0xc7, 0xbd, 0x7d, 0x2f, 0x1b, 0x34, + 0x84, 0x7f, 0x82, 0x94, 0xb2, 0xcd, 0xde, 0xe3, + 0x54, 0x57, 0x69, 0x8d, 0xab, 0xa6, 0x7f, 0x5a, + 0x39, 0x55, 0x85, 0xb0, 0xbb, 0x94, 0x50, 0x1b, + 0x00, 0x26, 0x4f, 0x5a, 0x4d, 0x45, 0x53, 0x66, + 0x75, 0x80, 0x86, 0x7b, 0x67, 0x5c, 0x62, 0x6d, + 0x6f, 0x65, 0x48, 0x41, 0x7a, 0xb3, 0x90, 0x3f, + 0x56, 0x88, 0xa3, 0x9b, 0xab, 0xd2, 0xcf, 0xa9, + 0xe1, 0xa4, 0x6a, 0x6e, 0xaa, 0xe7, 0xff, 0xfc, + 0xff, 0xf7, 0xe6, 0xd5, 0xce, 0xd8, 0xee, 0xff, + 0xc9, 0xa9, 0x81, 0x6f, 0x77, 0x79, 0x5f, 0x3d, + 0x6b, 0x94, 0x82, 0x4d, 0x38, 0x2e, 0x34, 0x55, + 0x4e, 0x32, 0x1e, 0x26, 0x3a, 0x4d, 0x65, 0x7a, + 0x3f, 0x2c, 0x20, 0x2e, 0x4f, 0x67, 0x69, 0x61, + 0x69, 0x76, 0x88, 0x96, 0x99, 0x90, 0x82, 0x78, + 0x68, 0x82, 0xa5, 0xb7, 0xaf, 0x91, 0x6f, 0x5a, + 0x39, 0x45, 0x32, 0x26, 0x2d, 0x1b, 0x1c, 0x4b, + 0x72, 0x73, 0x72, 0x6f, 0x70, 0x79, 0x88, 0x95, + 0xa2, 0xa7, 0xae, 0xaf, 0xa8, 0x99, 0x88, 0x7d, + 0x7d, 0x84, 0x8d, 0x94, 0x94, 0x8c, 0x82, 0x7b, + 0x7f, 0x80, 0x81, 0x82, 0x84, 0x85, 0x87, 0x87, + 0x8b, 0x87, 0x81, 0x7c, 0x79, 0x79, 0x7a, 0x7c, + 0x6b, 0x6c, 0x6c, 0x6a, 0x65, 0x5d, 0x55, 0x50, + 0x8c, 0xc7, 0xd8, 0x97, 0x49, 0x28, 0x24, 0x20, + 0x5b, 0x63, 0x6a, 0x69, 0x64, 0x65, 0x70, 0x7a, + 0xd2, 0xc2, 0xc6, 0xda, 0xcb, 0x8c, 0x4b, 0x2b, + 0x0f, 0x37, 0x67, 0x7d, 0x77, 0x69, 0x65, 0x69, + 0x53, 0x69, 0x56, 0x31, 0x4a, 0x8e, 0x99, 0x6d, + 0x0f, 0x21, 0x61, 0xac, 0xb5, 0x78, 0x3a, 0x23, + 0x2f, 0x61, 0x59, 0x44, 0x63, 0x73, 0x67, 0x6d, + 0x33, 0x4d, 0x7c, 0xb3, 0xdb, 0xe3, 0xd1, 0xbd, + 0xb5, 0xc0, 0xce, 0xd4, 0xce, 0xc0, 0xb2, 0xa8, + 0xab, 0x9c, 0x8c, 0x86, 0x87, 0x81, 0x71, 0x61, + 0x6c, 0x6a, 0x65, 0x60, 0x5a, 0x54, 0x50, 0x4e, + 0x4f, 0x4d, 0x49, 0x43, 0x3d, 0x38, 0x34, 0x31, + 0x32, 0x31, 0x2d, 0x2e, 0x27, 0x3d, 0x12, 0x07, + 0x97, 0x92, 0x67, 0x2b, 0x1c, 0x3a, 0x4f, 0x48, + 0x6b, 0xac, 0xe0, 0xc3, 0x6e, 0x34, 0x3e, 0x62, + 0x47, 0x3f, 0x35, 0x30, 0x37, 0x49, 0x5d, 0x6b, + 0xdb, 0xea, 0xde, 0xbb, 0xb3, 0xd2, 0xeb, 0xed, + 0xff, 0xdf, 0x8c, 0x46, 0x43, 0x62, 0x5c, 0x37, + 0x28, 0x48, 0x2f, 0x00, 0x20, 0x84, 0x95, 0x5a, + 0x5d, 0x48, 0x47, 0x75, 0xb8, 0xda, 0xc6, 0xa5, + 0x97, 0xb8, 0xcd, 0xb7, 0x8b, 0x79, 0x96, 0xbb, + 0xd9, 0xda, 0xe1, 0xcc, 0x7f, 0x2c, 0x1d, 0x3d, + 0x79, 0x87, 0xa3, 0xc0, 0xc7, 0xa6, 0x6a, 0x3a, + 0x35, 0x26, 0x3a, 0x87, 0xd7, 0xd6, 0x7c, 0x20, + 0x1f, 0x39, 0x56, 0x63, 0x5f, 0x5b, 0x61, 0x6a, + 0x80, 0x69, 0x57, 0x5f, 0x72, 0x71, 0x54, 0x36, + 0x43, 0x4c, 0x57, 0x61, 0x69, 0x73, 0x81, 0x8b, + 0xff, 0xec, 0xda, 0xe1, 0xf8, 0xf2, 0xba, 0x7d, + 0xf3, 0xed, 0xdb, 0xc6, 0xc3, 0xd2, 0xe0, 0xe4, + 0xa8, 0xa8, 0xae, 0xbe, 0xca, 0xc4, 0xac, 0x96, + 0x8d, 0x8a, 0x7d, 0x69, 0x61, 0x78, 0xa8, 0xd1, + 0xa0, 0x88, 0x76, 0x6c, 0x51, 0x2e, 0x24, 0x31, + 0x51, 0x86, 0x98, 0x80, 0x57, 0x32, 0x5d, 0xc1, + 0xdc, 0x82, 0x43, 0x44, 0x39, 0x14, 0x1c, 0x4c, + 0x2c, 0x45, 0x5d, 0x61, 0x58, 0x5a, 0x6f, 0x85, + 0x53, 0x5e, 0x6f, 0x7c, 0x81, 0x7c, 0x73, 0x6b, + 0x7e, 0x86, 0x97, 0xaa, 0xaf, 0x97, 0x6a, 0x46, + 0x50, 0x39, 0x28, 0x2e, 0x32, 0x20, 0x21, 0x3e, + 0x52, 0x58, 0x5c, 0x5a, 0x55, 0x56, 0x60, 0x6a, + 0x59, 0x5f, 0x6a, 0x74, 0x7c, 0x7f, 0x7e, 0x7d, + 0x73, 0x78, 0x80, 0x84, 0x81, 0x77, 0x6b, 0x63, + 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, + 0x88, 0x83, 0x7c, 0x76, 0x74, 0x76, 0x79, 0x7c, + 0x6c, 0x6d, 0x6d, 0x6b, 0x66, 0x5e, 0x56, 0x52, + 0x55, 0x75, 0xb5, 0xcf, 0x85, 0x1e, 0x17, 0x53, + 0x71, 0x83, 0x8a, 0x72, 0x4f, 0x47, 0x65, 0x88, + 0x91, 0x55, 0x39, 0x68, 0xa1, 0x9f, 0x6d, 0x43, + 0x44, 0x48, 0x4a, 0x48, 0x45, 0x45, 0x4a, 0x4e, + 0x3f, 0x49, 0x4c, 0x5a, 0x92, 0xd3, 0xde, 0xc3, + 0x4c, 0x3d, 0x3b, 0x67, 0xa9, 0xae, 0x51, 0x00, + 0x1f, 0x28, 0x0d, 0x26, 0x90, 0xbe, 0x87, 0x54, + 0x5b, 0x6c, 0x84, 0x98, 0xa5, 0xad, 0xb4, 0xb9, + 0x92, 0xa4, 0xae, 0x9e, 0x81, 0x79, 0x8d, 0xa7, + 0x92, 0x7c, 0x63, 0x5c, 0x64, 0x6a, 0x65, 0x5b, + 0x5c, 0x5d, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6a, + 0x64, 0x61, 0x5d, 0x57, 0x50, 0x4b, 0x46, 0x44, + 0x43, 0x41, 0x40, 0x40, 0x30, 0x42, 0x18, 0x09, + 0xa4, 0xb8, 0xb2, 0x93, 0x87, 0x92, 0x88, 0x6c, + 0xab, 0xcb, 0xda, 0xb1, 0x66, 0x30, 0x2d, 0x40, + 0x5d, 0x58, 0x54, 0x58, 0x68, 0x81, 0x9b, 0xac, + 0xa0, 0xcc, 0xe4, 0xd4, 0xc8, 0xda, 0xec, 0xed, + 0xba, 0xf2, 0xfb, 0xb5, 0x73, 0x6f, 0x87, 0x91, + 0x7e, 0x81, 0x7a, 0x6d, 0x74, 0x83, 0x7e, 0x6a, + 0x9e, 0xc7, 0xf3, 0xfe, 0xea, 0xd3, 0xcc, 0xd1, + 0xcc, 0xba, 0xaa, 0xaa, 0xb6, 0xbe, 0xb8, 0xaf, + 0xec, 0xdc, 0xc9, 0xa5, 0x61, 0x33, 0x55, 0x99, + 0xe5, 0xba, 0x9e, 0xb8, 0xe2, 0xd5, 0x83, 0x31, + 0x4f, 0x3c, 0x30, 0x42, 0x6b, 0x8d, 0x97, 0x94, + 0xb2, 0xc7, 0xc5, 0x92, 0x4a, 0x2a, 0x44, 0x6c, + 0x3a, 0x40, 0x43, 0x3e, 0x38, 0x3d, 0x50, 0x61, + 0x4c, 0x59, 0x65, 0x65, 0x5b, 0x53, 0x55, 0x5a, + 0x66, 0x54, 0x71, 0xb7, 0xda, 0xc3, 0xac, 0xb0, + 0xd1, 0xc0, 0xce, 0xef, 0xdf, 0xa3, 0x7f, 0x83, + 0x91, 0x67, 0x43, 0x4c, 0x72, 0x83, 0x6a, 0x47, + 0x29, 0x50, 0x7d, 0x8e, 0x83, 0x77, 0x7b, 0x86, + 0xa7, 0xbe, 0xbf, 0x8d, 0x41, 0x15, 0x23, 0x44, + 0x29, 0x1d, 0x1a, 0x3a, 0x47, 0x22, 0x3f, 0xa6, + 0xdb, 0xaf, 0x75, 0x4f, 0x46, 0x4c, 0x4e, 0x4a, + 0x75, 0x62, 0x53, 0x57, 0x6b, 0x78, 0x74, 0x69, + 0x88, 0x80, 0x74, 0x6b, 0x68, 0x6c, 0x74, 0x7a, + 0x6d, 0x7a, 0x89, 0x8d, 0x7f, 0x62, 0x42, 0x2e, + 0x3c, 0x23, 0x2d, 0x2f, 0x28, 0x54, 0x60, 0x1f, + 0x18, 0x32, 0x54, 0x6d, 0x78, 0x7d, 0x83, 0x89, + 0x7c, 0x79, 0x74, 0x6f, 0x6c, 0x6b, 0x6b, 0x6c, + 0x83, 0x80, 0x7b, 0x75, 0x70, 0x6d, 0x6b, 0x6b, + 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x81, 0x82, 0x83, + 0x80, 0x7d, 0x79, 0x78, 0x7b, 0x83, 0x8b, 0x91, + 0x6d, 0x6e, 0x6e, 0x6c, 0x66, 0x5f, 0x57, 0x52, + 0x46, 0x5b, 0x59, 0x3e, 0x37, 0x4c, 0x5a, 0x53, + 0x4a, 0x31, 0x1a, 0x1d, 0x38, 0x55, 0x62, 0x63, + 0x6c, 0x4d, 0x37, 0x34, 0x2a, 0x18, 0x1b, 0x30, + 0x44, 0x3b, 0x31, 0x33, 0x3e, 0x4a, 0x51, 0x52, + 0x63, 0x96, 0xd5, 0xf1, 0xe7, 0xdb, 0xef, 0xff, + 0xff, 0x5f, 0x00, 0x16, 0x6f, 0x86, 0x7e, 0x84, + 0x2d, 0x5a, 0x5d, 0x6a, 0xac, 0xc2, 0x98, 0x7d, + 0x70, 0x54, 0x4c, 0x7a, 0xbe, 0xda, 0xba, 0x8c, + 0x46, 0x69, 0x81, 0x6e, 0x42, 0x31, 0x4d, 0x72, + 0x7b, 0x60, 0x45, 0x41, 0x52, 0x65, 0x6c, 0x69, + 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 0x5e, + 0x57, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4b, + 0x4b, 0x49, 0x4d, 0x50, 0x3d, 0x4f, 0x27, 0x16, + 0x0e, 0x26, 0x3a, 0x36, 0x22, 0x16, 0x21, 0x31, + 0x71, 0x80, 0x94, 0x9a, 0x8a, 0x66, 0x3c, 0x20, + 0x29, 0x22, 0x1b, 0x20, 0x3a, 0x66, 0x97, 0xb7, + 0xd4, 0xc1, 0xb0, 0xb3, 0xc6, 0xd6, 0xd8, 0xd3, + 0xba, 0xc9, 0xb5, 0x7b, 0x55, 0x5e, 0x73, 0x79, + 0x48, 0x5b, 0x70, 0x76, 0x6e, 0x67, 0x69, 0x70, + 0x94, 0xa1, 0xb2, 0xb6, 0xa4, 0x7f, 0x56, 0x3b, + 0x5f, 0x7b, 0xa3, 0xc5, 0xd5, 0xd6, 0xd0, 0xcb, + 0xda, 0xd9, 0xcd, 0xb2, 0x97, 0x91, 0xa3, 0xb7, + 0x6d, 0x7a, 0x8a, 0x93, 0x8b, 0x73, 0x58, 0x45, + 0x67, 0x89, 0xad, 0xb6, 0xa3, 0x8d, 0x86, 0x89, + 0x83, 0x86, 0x88, 0x85, 0x7b, 0x6b, 0x5b, 0x50, + 0x67, 0x7f, 0x90, 0x83, 0x65, 0x54, 0x5f, 0x72, + 0x29, 0x21, 0x29, 0x38, 0x2e, 0x1a, 0x28, 0x4a, + 0x15, 0x19, 0x30, 0x5d, 0x92, 0xb6, 0xc0, 0xbb, + 0xbc, 0xb1, 0x90, 0x5a, 0x2a, 0x1d, 0x38, 0x57, + 0x83, 0x5d, 0x72, 0xc1, 0xd7, 0x8f, 0x44, 0x2c, + 0x31, 0x66, 0x9d, 0xaa, 0x96, 0x8e, 0xa7, 0xc7, + 0xcf, 0xc2, 0xac, 0x8f, 0x70, 0x53, 0x3c, 0x30, + 0x3b, 0x38, 0x34, 0x30, 0x2d, 0x2d, 0x2e, 0x2f, + 0x0d, 0x13, 0x1e, 0x28, 0x2e, 0x2f, 0x2d, 0x2b, + 0x67, 0x68, 0x6b, 0x6f, 0x72, 0x76, 0x79, 0x7a, + 0x7d, 0x81, 0x87, 0x89, 0x87, 0x7f, 0x76, 0x70, + 0x8b, 0x82, 0x74, 0x64, 0x57, 0x4e, 0x49, 0x48, + 0x46, 0x31, 0x1b, 0x1c, 0x3b, 0x6f, 0xa1, 0xbf, + 0x7f, 0x6e, 0x5d, 0x5b, 0x6b, 0x7f, 0x8d, 0x92, + 0x8a, 0x79, 0x6b, 0x71, 0x84, 0x8d, 0x85, 0x77, + 0x67, 0x6a, 0x6f, 0x75, 0x7b, 0x81, 0x86, 0x88, + 0x85, 0x84, 0x82, 0x80, 0x7e, 0x7d, 0x7b, 0x7a, + 0x6f, 0x6e, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x6a, + 0x69, 0x63, 0x5e, 0x5e, 0x5f, 0x59, 0x4c, 0x41, + 0x4d, 0x83, 0xa3, 0x84, 0x52, 0x40, 0x4f, 0x60, + 0x7d, 0x8e, 0x9a, 0x91, 0x7c, 0x6e, 0x74, 0x80, + 0x77, 0x6d, 0x61, 0x5e, 0x6a, 0x83, 0x9f, 0xb1, + 0x80, 0x78, 0x67, 0x52, 0x46, 0x4d, 0x65, 0x79, + 0xa0, 0xa6, 0xae, 0xb2, 0xb4, 0xb5, 0xb8, 0xba, + 0xd8, 0xbf, 0x8d, 0x56, 0x40, 0x69, 0xc0, 0xff, + 0xb4, 0x94, 0x71, 0x65, 0x6f, 0x77, 0x71, 0x66, + 0x4f, 0x4b, 0x54, 0x72, 0x96, 0xa5, 0x98, 0x84, + 0x08, 0x26, 0x5e, 0x80, 0x64, 0x44, 0x6d, 0xb8, + 0xa7, 0x96, 0x6e, 0x45, 0x42, 0x5e, 0x70, 0x6e, + 0x66, 0x63, 0x61, 0x65, 0x6b, 0x6a, 0x61, 0x59, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x48, 0x4d, 0x55, 0x4d, 0x5d, 0x58, 0x1f, 0x07, + 0x42, 0x56, 0x76, 0x93, 0x9c, 0x8b, 0x6a, 0x50, + 0x71, 0x64, 0x50, 0x3d, 0x31, 0x30, 0x35, 0x39, + 0x49, 0x76, 0xa0, 0x9d, 0x7b, 0x68, 0x7b, 0x99, + 0x6d, 0x96, 0xc3, 0xd1, 0xc1, 0xb3, 0xb9, 0xc7, + 0xc8, 0xd7, 0xc1, 0x81, 0x4d, 0x3f, 0x3a, 0x2e, + 0x79, 0x5d, 0x3b, 0x2d, 0x3c, 0x5d, 0x7e, 0x91, + 0x9f, 0xa4, 0xa8, 0xa9, 0xa2, 0x94, 0x86, 0x7c, + 0x7f, 0x92, 0xaf, 0xc9, 0xd6, 0xd3, 0xc6, 0xbb, + 0x5d, 0x81, 0xaa, 0xb6, 0x9f, 0x79, 0x5b, 0x4e, + 0x31, 0x57, 0x8d, 0xb6, 0xbc, 0x9d, 0x6e, 0x4c, + 0x5e, 0x68, 0x83, 0xad, 0xcf, 0xcd, 0xa9, 0x86, + 0xab, 0xb5, 0xbf, 0xb9, 0x9b, 0x6a, 0x37, 0x16, + 0x3c, 0x3c, 0x3e, 0x43, 0x49, 0x4f, 0x54, 0x56, + 0x5a, 0x3e, 0x2c, 0x2a, 0x24, 0x28, 0x55, 0x8d, + 0xd4, 0x8a, 0x37, 0x1e, 0x42, 0x75, 0x8f, 0x92, + 0x1e, 0x53, 0x92, 0xb0, 0xa1, 0x7c, 0x5c, 0x4d, + 0x59, 0x79, 0xa2, 0xbb, 0xb4, 0x84, 0x3a, 0x00, + 0x19, 0x2d, 0x3f, 0x44, 0x4b, 0x6d, 0xa8, 0xd9, + 0x90, 0x92, 0x97, 0x9d, 0xa4, 0xab, 0xaf, 0xb2, + 0xb8, 0xad, 0x9b, 0x86, 0x72, 0x62, 0x59, 0x54, + 0x5d, 0x63, 0x6d, 0x77, 0x7c, 0x7d, 0x7b, 0x79, + 0x66, 0x6a, 0x70, 0x79, 0x82, 0x8a, 0x91, 0x94, + 0x99, 0x91, 0x85, 0x79, 0x72, 0x70, 0x72, 0x74, + 0x74, 0x6d, 0x60, 0x53, 0x48, 0x42, 0x3f, 0x3f, + 0x2e, 0x42, 0x60, 0x7d, 0x91, 0x9b, 0x9f, 0x9f, + 0x7e, 0x73, 0x69, 0x69, 0x72, 0x7a, 0x7c, 0x7a, + 0x7d, 0x72, 0x6c, 0x76, 0x85, 0x87, 0x77, 0x64, + 0x91, 0x8f, 0x8b, 0x85, 0x7f, 0x7a, 0x76, 0x74, + 0x79, 0x79, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, + 0x73, 0x72, 0x72, 0x72, 0x71, 0x70, 0x70, 0x70, + 0x69, 0x63, 0x5d, 0x5c, 0x5d, 0x56, 0x49, 0x3d, + 0x83, 0xa9, 0xe2, 0xff, 0xe0, 0x9d, 0x6f, 0x65, + 0x6f, 0x77, 0x79, 0x70, 0x64, 0x68, 0x7e, 0x93, + 0x7c, 0x65, 0x45, 0x2e, 0x2b, 0x3d, 0x59, 0x6d, + 0x31, 0x36, 0x45, 0x60, 0x7b, 0x86, 0x7d, 0x71, + 0xe1, 0xd5, 0xb4, 0x83, 0x5f, 0x64, 0x8f, 0xb9, + 0x86, 0xb0, 0xce, 0xba, 0x85, 0x68, 0x7a, 0x9a, + 0x69, 0x69, 0x67, 0x61, 0x5d, 0x5f, 0x68, 0x71, + 0x50, 0x3d, 0x2e, 0x37, 0x53, 0x6b, 0x72, 0x6f, + 0x5f, 0x3f, 0x37, 0x4e, 0x55, 0x46, 0x4b, 0x64, + 0x66, 0x8c, 0x9e, 0x84, 0x61, 0x5c, 0x6b, 0x77, + 0x65, 0x60, 0x5e, 0x61, 0x65, 0x63, 0x59, 0x50, + 0x51, 0x4e, 0x4a, 0x46, 0x45, 0x46, 0x48, 0x4a, + 0x49, 0x4d, 0x54, 0x4c, 0x5c, 0x57, 0x1f, 0x07, + 0xa2, 0x8d, 0x7f, 0x8d, 0xab, 0xb8, 0xa9, 0x92, + 0x51, 0x56, 0x5d, 0x60, 0x5c, 0x52, 0x45, 0x3d, + 0xa0, 0xa3, 0xae, 0xbd, 0xc1, 0xab, 0x81, 0x5f, + 0x62, 0x72, 0x8f, 0xaf, 0xc5, 0xc9, 0xbe, 0xb2, + 0xb0, 0xae, 0x84, 0x3d, 0x13, 0x19, 0x26, 0x25, + 0x2c, 0x1f, 0x1a, 0x31, 0x57, 0x70, 0x71, 0x66, + 0x88, 0x8b, 0x8e, 0x8e, 0x8a, 0x82, 0x79, 0x73, + 0x90, 0xaf, 0xcd, 0xcc, 0xb0, 0x98, 0x93, 0x9a, + 0x58, 0x65, 0x6e, 0x6a, 0x61, 0x66, 0x7c, 0x91, + 0xde, 0xe1, 0xe1, 0xd4, 0xb3, 0x85, 0x57, 0x3a, + 0x34, 0x42, 0x66, 0x9f, 0xd4, 0xe8, 0xd7, 0xbe, + 0x9a, 0x8d, 0x79, 0x69, 0x64, 0x69, 0x75, 0x7d, + 0xae, 0x91, 0x73, 0x6c, 0x73, 0x6e, 0x53, 0x37, + 0x35, 0x2f, 0x3d, 0x51, 0x4c, 0x3c, 0x4c, 0x6f, + 0x8e, 0x82, 0x91, 0xcd, 0xff, 0xff, 0xb7, 0x6a, + 0x00, 0x23, 0x69, 0x98, 0x9e, 0x89, 0x70, 0x61, + 0x24, 0x5a, 0xa1, 0xd6, 0xef, 0xf4, 0xea, 0xde, + 0xae, 0x96, 0x70, 0x4f, 0x41, 0x4c, 0x65, 0x79, + 0x96, 0x95, 0x93, 0x91, 0x8e, 0x8c, 0x8a, 0x89, + 0x95, 0x8e, 0x82, 0x77, 0x70, 0x70, 0x73, 0x75, + 0x88, 0x8e, 0x97, 0x9f, 0xa4, 0xa4, 0xa1, 0x9f, + 0x66, 0x67, 0x6a, 0x6e, 0x73, 0x77, 0x7a, 0x7b, + 0x7b, 0x75, 0x6b, 0x62, 0x5e, 0x5f, 0x64, 0x67, + 0x62, 0x5c, 0x52, 0x49, 0x42, 0x3f, 0x40, 0x41, + 0x4d, 0x5d, 0x69, 0x64, 0x58, 0x5c, 0x74, 0x8d, + 0xb2, 0x9d, 0x80, 0x6a, 0x62, 0x64, 0x69, 0x6b, + 0x43, 0x44, 0x4f, 0x67, 0x7f, 0x87, 0x7b, 0x6b, + 0x7f, 0x7e, 0x7c, 0x79, 0x76, 0x74, 0x72, 0x70, + 0x76, 0x78, 0x7a, 0x7d, 0x80, 0x83, 0x85, 0x86, + 0x88, 0x86, 0x82, 0x7e, 0x79, 0x74, 0x71, 0x6f, + 0x5e, 0x5a, 0x58, 0x5c, 0x61, 0x5f, 0x55, 0x4c, + 0x50, 0x4b, 0x59, 0x75, 0x7d, 0x6b, 0x5c, 0x5c, + 0x73, 0x89, 0xa2, 0xad, 0xa9, 0x9f, 0x9c, 0x9c, + 0x96, 0x84, 0x68, 0x4d, 0x3d, 0x3a, 0x40, 0x46, + 0x3d, 0x53, 0x72, 0x89, 0x8e, 0x85, 0x78, 0x70, + 0x8e, 0x8b, 0x81, 0x70, 0x64, 0x64, 0x71, 0x7d, + 0x6d, 0x86, 0x9c, 0x96, 0x78, 0x5f, 0x59, 0x5e, + 0x54, 0x6a, 0x7a, 0x6e, 0x4f, 0x3b, 0x3f, 0x4d, + 0x6a, 0x5b, 0x4d, 0x50, 0x63, 0x75, 0x7e, 0x7e, + 0x92, 0x72, 0x51, 0x3a, 0x1f, 0x0c, 0x20, 0x44, + 0x3c, 0x69, 0x99, 0xab, 0xa4, 0x93, 0x7a, 0x65, + 0x66, 0x61, 0x5d, 0x5e, 0x61, 0x5d, 0x52, 0x48, + 0x4d, 0x4b, 0x47, 0x43, 0x42, 0x43, 0x45, 0x47, + 0x4a, 0x4d, 0x52, 0x49, 0x59, 0x55, 0x1e, 0x08, + 0x75, 0x7d, 0x90, 0xa9, 0xb5, 0xa2, 0x76, 0x51, + 0x40, 0x3b, 0x34, 0x30, 0x32, 0x3a, 0x44, 0x4a, + 0xab, 0xc2, 0xd5, 0xcd, 0xb4, 0xa8, 0xb6, 0xc9, + 0x95, 0x6d, 0x3e, 0x27, 0x28, 0x29, 0x1b, 0x0a, + 0x27, 0x31, 0x25, 0x0c, 0x18, 0x4b, 0x74, 0x7d, + 0x95, 0x95, 0x97, 0x9e, 0xa6, 0xa9, 0xa8, 0xa5, + 0x79, 0x7d, 0x82, 0x83, 0x7e, 0x72, 0x65, 0x5c, + 0x53, 0x8d, 0xc1, 0xba, 0x8b, 0x73, 0x8f, 0xb9, + 0xc5, 0xca, 0xc7, 0xb6, 0xa2, 0xa1, 0xb5, 0xcb, + 0xb4, 0xb0, 0xa7, 0x98, 0x85, 0x70, 0x5d, 0x52, + 0x68, 0x62, 0x4e, 0x2e, 0x1a, 0x2a, 0x5a, 0x84, + 0x89, 0x73, 0x53, 0x3c, 0x3d, 0x56, 0x77, 0x8f, + 0xb4, 0x7c, 0x37, 0x11, 0x15, 0x2a, 0x38, 0x3b, + 0x54, 0x48, 0x4a, 0x56, 0x4c, 0x3d, 0x51, 0x78, + 0xae, 0x8f, 0x75, 0x7d, 0x98, 0x9e, 0x80, 0x5e, + 0x56, 0x5b, 0x5d, 0x55, 0x43, 0x30, 0x21, 0x1b, + 0x38, 0x16, 0x21, 0x58, 0x64, 0x44, 0x49, 0x74, + 0x9f, 0x8c, 0x79, 0x79, 0x86, 0x8c, 0x82, 0x76, + 0x9c, 0x9b, 0x98, 0x95, 0x91, 0x8d, 0x8b, 0x89, + 0x92, 0x89, 0x7a, 0x6e, 0x6a, 0x6e, 0x76, 0x7c, + 0x86, 0x8c, 0x94, 0x9c, 0x9f, 0x9e, 0x9a, 0x97, + 0x87, 0x83, 0x7e, 0x76, 0x6e, 0x67, 0x61, 0x5e, + 0x63, 0x6a, 0x75, 0x7f, 0x84, 0x84, 0x81, 0x7e, + 0x5d, 0x58, 0x51, 0x4a, 0x47, 0x47, 0x4a, 0x4c, + 0x67, 0x71, 0x7f, 0x8b, 0x91, 0x91, 0x8d, 0x8a, + 0x81, 0x91, 0xaa, 0xc2, 0xcd, 0xc9, 0xbb, 0xb0, + 0xa0, 0x99, 0x93, 0x92, 0x8f, 0x83, 0x6c, 0x5a, + 0x48, 0x4a, 0x4c, 0x4f, 0x52, 0x55, 0x57, 0x59, + 0x5b, 0x5c, 0x60, 0x64, 0x68, 0x6c, 0x6f, 0x71, + 0x77, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6d, 0x6c, + 0x6c, 0x67, 0x63, 0x64, 0x66, 0x62, 0x56, 0x4b, + 0x3e, 0x3c, 0x33, 0x34, 0x53, 0x7e, 0x8e, 0x84, + 0xa2, 0x92, 0x77, 0x59, 0x44, 0x3e, 0x45, 0x4e, + 0x6f, 0x73, 0x75, 0x71, 0x62, 0x4d, 0x36, 0x28, + 0x1c, 0x46, 0x69, 0x5f, 0x3d, 0x36, 0x5e, 0x8c, + 0x83, 0x4f, 0x19, 0x14, 0x3d, 0x6d, 0x82, 0x82, + 0x70, 0x48, 0x24, 0x2a, 0x4f, 0x68, 0x5e, 0x48, + 0x44, 0x58, 0x6c, 0x6c, 0x5a, 0x46, 0x3d, 0x3d, + 0x40, 0x47, 0x55, 0x66, 0x72, 0x74, 0x6c, 0x64, + 0x4e, 0x40, 0x2f, 0x22, 0x22, 0x3f, 0x78, 0xab, + 0xad, 0xa0, 0x93, 0x94, 0x9f, 0xa0, 0x8c, 0x75, + 0x6c, 0x67, 0x62, 0x63, 0x64, 0x5f, 0x54, 0x49, + 0x4b, 0x49, 0x45, 0x41, 0x40, 0x41, 0x43, 0x45, + 0x4b, 0x4d, 0x50, 0x46, 0x56, 0x53, 0x1e, 0x09, + 0x66, 0x89, 0xb1, 0xbb, 0xa2, 0x78, 0x55, 0x44, + 0x1d, 0x27, 0x35, 0x40, 0x45, 0x41, 0x39, 0x32, + 0x83, 0x95, 0xa2, 0x9a, 0x8a, 0x8f, 0xae, 0xcd, + 0xb1, 0xa4, 0x82, 0x4b, 0x1d, 0x15, 0x34, 0x56, + 0x3c, 0x70, 0xa2, 0xba, 0xc8, 0xc5, 0x9c, 0x69, + 0x63, 0xa2, 0xe7, 0xf4, 0xc1, 0x76, 0x3d, 0x24, + 0x31, 0x28, 0x1d, 0x18, 0x1f, 0x31, 0x46, 0x54, + 0x4b, 0x41, 0x4b, 0x7b, 0xbb, 0xe2, 0xe0, 0xce, + 0xeb, 0xe4, 0xcd, 0xa5, 0x7e, 0x6e, 0x7a, 0x8c, + 0x5d, 0x77, 0x9e, 0xbd, 0xc7, 0xb8, 0x9e, 0x8b, + 0x35, 0x54, 0x75, 0x80, 0x76, 0x70, 0x7a, 0x89, + 0x46, 0x66, 0x94, 0xb6, 0xb9, 0x9d, 0x73, 0x56, + 0x48, 0x3f, 0x35, 0x36, 0x44, 0x59, 0x6b, 0x75, + 0x5b, 0x58, 0x67, 0x79, 0x6b, 0x4b, 0x4b, 0x64, + 0x7c, 0x82, 0x85, 0x7a, 0x61, 0x41, 0x26, 0x18, + 0x08, 0x14, 0x2a, 0x44, 0x56, 0x5b, 0x53, 0x49, + 0x8c, 0x42, 0x21, 0x42, 0x4b, 0x22, 0x0c, 0x1e, + 0x0c, 0x08, 0x16, 0x3f, 0x72, 0x8c, 0x83, 0x70, + 0x85, 0x87, 0x8a, 0x8e, 0x92, 0x96, 0x99, 0x9b, + 0x94, 0x87, 0x76, 0x68, 0x65, 0x6e, 0x7b, 0x85, + 0x88, 0x8d, 0x94, 0x9a, 0x9c, 0x99, 0x95, 0x91, + 0xaf, 0xac, 0xa5, 0x9c, 0x93, 0x8a, 0x83, 0x80, + 0x5d, 0x64, 0x6f, 0x79, 0x7e, 0x7e, 0x7a, 0x77, + 0x55, 0x51, 0x4b, 0x45, 0x43, 0x45, 0x48, 0x4b, + 0x4e, 0x66, 0x7c, 0x79, 0x63, 0x54, 0x59, 0x65, + 0x84, 0x82, 0x7f, 0x7e, 0x81, 0x8c, 0x99, 0xa3, + 0xc8, 0xc6, 0xc6, 0xcd, 0xd7, 0xde, 0xdf, 0xdd, + 0xd6, 0xd2, 0xcb, 0xc2, 0xb8, 0xaf, 0xa8, 0xa4, + 0xa1, 0x9e, 0x99, 0x92, 0x8b, 0x84, 0x7f, 0x7c, + 0x7f, 0x81, 0x84, 0x88, 0x8c, 0x90, 0x93, 0x94, + 0x99, 0x91, 0x88, 0x82, 0x7e, 0x73, 0x62, 0x54, + 0x4b, 0x53, 0x52, 0x51, 0x65, 0x81, 0x85, 0x76, + 0x72, 0x7c, 0x8c, 0x9b, 0xa0, 0x97, 0x85, 0x76, + 0x59, 0x64, 0x73, 0x7e, 0x7c, 0x6e, 0x5d, 0x50, + 0x67, 0x7f, 0x84, 0x5c, 0x24, 0x13, 0x39, 0x68, + 0xa7, 0x6b, 0x29, 0x17, 0x38, 0x62, 0x76, 0x76, + 0x6c, 0x47, 0x2e, 0x42, 0x70, 0x80, 0x60, 0x37, + 0x12, 0x17, 0x28, 0x47, 0x65, 0x70, 0x65, 0x56, + 0x30, 0x3f, 0x53, 0x63, 0x69, 0x69, 0x68, 0x67, + 0x6d, 0x47, 0x1f, 0x20, 0x52, 0x8c, 0xa5, 0xa2, + 0xad, 0xa0, 0x90, 0x83, 0x7a, 0x76, 0x7b, 0x82, + 0x72, 0x6d, 0x69, 0x6a, 0x6d, 0x69, 0x5e, 0x53, + 0x4b, 0x49, 0x45, 0x41, 0x40, 0x41, 0x43, 0x45, + 0x4c, 0x4c, 0x4e, 0x42, 0x52, 0x51, 0x1e, 0x0a, + 0x88, 0xa8, 0xc4, 0xbd, 0x99, 0x7a, 0x73, 0x7b, + 0x5e, 0x7e, 0xab, 0xcc, 0xce, 0xb1, 0x87, 0x68, + 0x74, 0x73, 0x7b, 0x8f, 0xa5, 0xaa, 0x9b, 0x8b, + 0xaa, 0xab, 0xaa, 0xa9, 0xab, 0xb6, 0xc8, 0xd6, + 0xfc, 0xe3, 0xa9, 0x71, 0x6f, 0x97, 0xae, 0xa9, + 0x4b, 0x75, 0x93, 0x7a, 0x3f, 0x1c, 0x2c, 0x4c, + 0x76, 0x5f, 0x43, 0x38, 0x4e, 0x83, 0xbf, 0xe7, + 0xb6, 0xe1, 0xf6, 0xc5, 0x6d, 0x3b, 0x4f, 0x79, + 0x7b, 0x79, 0x6d, 0x58, 0x48, 0x53, 0x75, 0x94, + 0x7a, 0x80, 0x86, 0x86, 0x7b, 0x67, 0x51, 0x43, + 0x37, 0x4b, 0x72, 0xa1, 0xb7, 0x9c, 0x5b, 0x25, + 0x51, 0x87, 0xd4, 0xff, 0xff, 0xd5, 0x88, 0x52, + 0x38, 0x39, 0x39, 0x38, 0x35, 0x2d, 0x22, 0x1b, + 0x1c, 0x29, 0x4e, 0x70, 0x64, 0x38, 0x26, 0x32, + 0x2a, 0x3e, 0x4c, 0x40, 0x25, 0x17, 0x22, 0x35, + 0x51, 0x4a, 0x47, 0x4f, 0x5a, 0x59, 0x48, 0x37, + 0x19, 0x1c, 0x35, 0x75, 0xc8, 0xfe, 0xfb, 0xe1, + 0x73, 0x5f, 0x4f, 0x55, 0x6a, 0x75, 0x6d, 0x5f, + 0x8c, 0x8c, 0x8a, 0x88, 0x87, 0x85, 0x83, 0x83, + 0x7e, 0x6f, 0x5a, 0x4b, 0x49, 0x55, 0x67, 0x74, + 0x7e, 0x82, 0x89, 0x8e, 0x8e, 0x8a, 0x85, 0x81, + 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, + 0x69, 0x62, 0x58, 0x4f, 0x4b, 0x4d, 0x51, 0x54, + 0x4d, 0x48, 0x41, 0x3b, 0x37, 0x38, 0x3a, 0x3d, + 0x3c, 0x46, 0x47, 0x37, 0x2b, 0x3d, 0x6d, 0x97, + 0xb3, 0xb9, 0xbd, 0xbb, 0xb5, 0xb2, 0xb3, 0xb7, + 0x9a, 0x95, 0x8c, 0x84, 0x7f, 0x7c, 0x7b, 0x7b, + 0x95, 0x98, 0x9d, 0xa3, 0xaa, 0xb1, 0xb6, 0xb9, + 0xb6, 0xb7, 0xba, 0xbe, 0xc1, 0xc5, 0xc8, 0xc9, + 0xd0, 0xcf, 0xcc, 0xc9, 0xc6, 0xc2, 0xc0, 0xbe, + 0x9f, 0x9b, 0x97, 0x9a, 0x9d, 0x9a, 0x8f, 0x84, + 0x80, 0x74, 0x78, 0x8f, 0x9a, 0x93, 0x91, 0x9a, + 0x9b, 0x82, 0x62, 0x4d, 0x48, 0x48, 0x45, 0x40, + 0x6c, 0x6b, 0x6a, 0x6c, 0x72, 0x7c, 0x85, 0x8b, + 0x6b, 0x6f, 0x72, 0x74, 0x76, 0x7c, 0x86, 0x8e, + 0x67, 0x7b, 0x91, 0x99, 0x8e, 0x7a, 0x68, 0x5f, + 0x47, 0x44, 0x40, 0x3c, 0x36, 0x2b, 0x1e, 0x15, + 0x29, 0x1d, 0x1c, 0x35, 0x59, 0x6a, 0x5d, 0x49, + 0x4f, 0x53, 0x52, 0x4a, 0x43, 0x4b, 0x60, 0x74, + 0x9a, 0x9c, 0x87, 0x65, 0x5b, 0x69, 0x6d, 0x61, + 0x65, 0x6d, 0x7f, 0x90, 0x8b, 0x78, 0x6f, 0x72, + 0x6f, 0x6b, 0x69, 0x6d, 0x72, 0x70, 0x67, 0x5e, + 0x4d, 0x4b, 0x47, 0x43, 0x42, 0x43, 0x45, 0x47, + 0x4d, 0x4c, 0x4c, 0x3f, 0x4f, 0x4f, 0x1d, 0x0b, + 0x3f, 0x6d, 0xaa, 0xd2, 0xce, 0xa5, 0x71, 0x4e, + 0x3b, 0x36, 0x2e, 0x28, 0x26, 0x28, 0x2c, 0x2f, + 0x41, 0x7d, 0xbd, 0xce, 0xb6, 0xa2, 0xad, 0xc4, + 0x9d, 0x8d, 0x85, 0x94, 0xa8, 0xa4, 0x80, 0x5c, + 0x45, 0x4f, 0x4d, 0x4b, 0x66, 0x89, 0x83, 0x63, + 0x6f, 0x98, 0xbd, 0xb8, 0x94, 0x79, 0x7f, 0x92, + 0x6d, 0x63, 0x57, 0x55, 0x63, 0x7f, 0x9e, 0xb3, + 0xda, 0x89, 0x44, 0x54, 0x98, 0xad, 0x6f, 0x22, + 0x29, 0x49, 0x71, 0x8a, 0x95, 0xa1, 0xb4, 0xc6, + 0xdb, 0xc7, 0xa7, 0x86, 0x6c, 0x5e, 0x59, 0x59, + 0x63, 0x48, 0x31, 0x3c, 0x66, 0x93, 0xac, 0xb3, + 0x9f, 0xad, 0xbd, 0xbf, 0xab, 0x82, 0x55, 0x37, + 0x9f, 0x69, 0x29, 0x0b, 0x12, 0x23, 0x26, 0x21, + 0x35, 0x1f, 0x17, 0x1d, 0x1c, 0x21, 0x4c, 0x82, + 0x8d, 0x94, 0x96, 0x88, 0x6e, 0x57, 0x4a, 0x48, + 0x6d, 0x50, 0x32, 0x2e, 0x44, 0x5b, 0x62, 0x5f, + 0x39, 0x3a, 0x3e, 0x4b, 0x59, 0x55, 0x35, 0x14, + 0x63, 0x50, 0x39, 0x2e, 0x32, 0x3c, 0x43, 0x45, + 0x88, 0x8a, 0x8e, 0x92, 0x97, 0x9c, 0x9f, 0xa1, + 0xaa, 0x95, 0x75, 0x59, 0x4c, 0x50, 0x5d, 0x68, + 0x78, 0x7c, 0x82, 0x86, 0x86, 0x81, 0x7b, 0x76, + 0x62, 0x63, 0x65, 0x68, 0x6b, 0x6e, 0x70, 0x72, + 0x7d, 0x75, 0x69, 0x5d, 0x56, 0x54, 0x56, 0x58, + 0x55, 0x4f, 0x46, 0x3e, 0x38, 0x36, 0x37, 0x39, + 0x4c, 0x40, 0x3d, 0x55, 0x79, 0x8c, 0x84, 0x74, + 0x8d, 0x99, 0xa5, 0xa6, 0x9d, 0x93, 0x8f, 0x90, + 0x97, 0x9d, 0xa5, 0xac, 0xaf, 0xb2, 0xb5, 0xb8, + 0xc4, 0xc2, 0xbe, 0xb9, 0xb4, 0xaf, 0xab, 0xa9, + 0xab, 0xa9, 0xa4, 0x9e, 0x98, 0x92, 0x8d, 0x8b, + 0x80, 0x7d, 0x78, 0x70, 0x68, 0x61, 0x5b, 0x58, + 0x5f, 0x5c, 0x5c, 0x63, 0x6b, 0x6d, 0x65, 0x5d, + 0x4e, 0x44, 0x50, 0x73, 0x8a, 0x84, 0x79, 0x78, + 0x97, 0x8f, 0x8b, 0x94, 0x9e, 0x99, 0x82, 0x6c, + 0x6b, 0x63, 0x58, 0x51, 0x53, 0x5c, 0x69, 0x72, + 0x6e, 0x68, 0x67, 0x6f, 0x79, 0x77, 0x68, 0x59, + 0x5d, 0x7c, 0x9d, 0xa3, 0x92, 0x85, 0x8b, 0x98, + 0xa5, 0xa1, 0x95, 0x81, 0x6f, 0x6c, 0x78, 0x85, + 0x79, 0x6f, 0x62, 0x5a, 0x5a, 0x5b, 0x5a, 0x58, + 0x4f, 0x53, 0x4d, 0x36, 0x1c, 0x15, 0x25, 0x38, + 0x43, 0x8f, 0xbd, 0x9a, 0x68, 0x61, 0x73, 0x7c, + 0x8b, 0x78, 0x74, 0x86, 0x90, 0x82, 0x70, 0x6b, + 0x64, 0x61, 0x61, 0x68, 0x70, 0x71, 0x6a, 0x62, + 0x51, 0x4e, 0x4a, 0x46, 0x45, 0x46, 0x48, 0x4a, + 0x4e, 0x4c, 0x4a, 0x3c, 0x4c, 0x4d, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c, + 0x29, 0x32, 0x4e, 0x7b, 0x9d, 0x9a, 0x72, 0x4b, + 0x3f, 0x3f, 0x3c, 0x39, 0x33, 0x2d, 0x27, 0x24, + 0x06, 0x21, 0x4a, 0x70, 0x88, 0x91, 0x90, 0x8d, + 0xba, 0xcd, 0xdc, 0xd4, 0xb7, 0x9a, 0x8b, 0x89, + 0x5b, 0x6a, 0x72, 0x78, 0x95, 0xae, 0x98, 0x6c, + 0xa3, 0xa8, 0xa3, 0x8b, 0x68, 0x4f, 0x48, 0x4c, + 0x38, 0x49, 0x60, 0x6c, 0x63, 0x47, 0x24, 0x0c, + 0x5a, 0x40, 0x2b, 0x36, 0x56, 0x69, 0x60, 0x4d, + 0x6f, 0x63, 0x4a, 0x30, 0x2e, 0x53, 0x94, 0xc7, + 0xe4, 0xdd, 0xcc, 0xad, 0x80, 0x4b, 0x1c, 0x00, + 0x12, 0x1e, 0x24, 0x1b, 0x11, 0x1d, 0x40, 0x60, + 0x45, 0x46, 0x48, 0x4a, 0x4a, 0x49, 0x48, 0x47, + 0x34, 0x1c, 0x1d, 0x53, 0x9b, 0xb3, 0x88, 0x52, + 0x48, 0x36, 0x34, 0x43, 0x4d, 0x5c, 0x90, 0xcb, + 0xd9, 0xb3, 0x81, 0x5e, 0x53, 0x51, 0x4d, 0x47, + 0x58, 0x3e, 0x27, 0x2a, 0x42, 0x52, 0x4c, 0x3e, + 0x59, 0x34, 0x36, 0x59, 0x4e, 0x1e, 0x1d, 0x49, + 0x36, 0x37, 0x3b, 0x44, 0x53, 0x68, 0x7c, 0x89, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x74, + 0x7e, 0x6f, 0x5b, 0x4f, 0x54, 0x6a, 0x86, 0x99, + 0x8c, 0x90, 0x96, 0x99, 0x98, 0x93, 0x8c, 0x88, + 0x73, 0x72, 0x70, 0x6d, 0x6a, 0x67, 0x65, 0x63, + 0x5c, 0x60, 0x66, 0x68, 0x66, 0x5e, 0x56, 0x50, + 0x66, 0x60, 0x56, 0x4b, 0x44, 0x40, 0x40, 0x41, + 0x26, 0x3a, 0x55, 0x6b, 0x7b, 0x8a, 0x9a, 0xa6, + 0xa8, 0xab, 0xaa, 0xa3, 0x9d, 0xa4, 0xb6, 0xc6, + 0xc7, 0xcf, 0xd8, 0xd7, 0xcc, 0xbd, 0xb0, 0xaa, + 0x9c, 0x99, 0x95, 0x8e, 0x87, 0x81, 0x7c, 0x7a, + 0x8f, 0x91, 0x95, 0x99, 0x9e, 0xa3, 0xa6, 0xa8, + 0xb1, 0xb2, 0xb4, 0xb7, 0xba, 0xbd, 0xc0, 0xc1, + 0xb3, 0xab, 0xa3, 0x9f, 0x9b, 0x91, 0x81, 0x74, + 0x66, 0x60, 0x52, 0x53, 0x73, 0x98, 0x9a, 0x85, + 0x83, 0x75, 0x6c, 0x78, 0x93, 0xa4, 0xa2, 0x98, + 0x89, 0x88, 0x84, 0x7f, 0x78, 0x70, 0x6a, 0x66, + 0x6a, 0x73, 0x7a, 0x78, 0x70, 0x6c, 0x71, 0x78, + 0x84, 0x80, 0x78, 0x72, 0x73, 0x80, 0x93, 0xa1, + 0x8e, 0x81, 0x78, 0x81, 0x94, 0x9c, 0x90, 0x80, + 0x98, 0x9f, 0x9c, 0x89, 0x73, 0x74, 0x8e, 0xa9, + 0x70, 0x82, 0x8b, 0x78, 0x4f, 0x2c, 0x1f, 0x21, + 0x34, 0x79, 0xa7, 0x9b, 0x89, 0x88, 0x77, 0x56, + 0x63, 0x51, 0x51, 0x68, 0x73, 0x65, 0x56, 0x55, + 0x5a, 0x58, 0x59, 0x62, 0x6c, 0x6f, 0x69, 0x62, + 0x53, 0x50, 0x4c, 0x49, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4c, 0x49, 0x3a, 0x4a, 0x4c, 0x1d, 0x0c +}; + + +/* + Initialization- and return-value-related functions +*/ + +void mpeg2_init( void ) +{ + unsigned int i; + unsigned char *p; + volatile char bitmask = 0; + + /* + Apply volatile XOR-bitmask to entire input array. + */ + p = ( unsigned char * ) &mpeg2_oldorgframe[ 0 ]; + _Pragma( "loopbound min 90112 max 90112" ) + for ( i = 0; i < sizeof( mpeg2_oldorgframe ); ++i, ++p ) + *p ^= bitmask; +} + + +int mpeg2_return( void ) +{ + int checksum = 0; + int i, j, k, l; + + + _Pragma( "loopbound min 352 max 352" ) + for ( i = 0; i < 352; i++ ) { + j = 0; + _Pragma( "loopbound min 2 max 2" ) + for ( ; j < 2; j++ ) { + k = 0; + _Pragma( "loopbound min 2 max 2" ) + for ( ; k < 2; k++ ) { + l = 0; + _Pragma( "loopbound min 2 max 2" ) + for ( ; l < 2; l++ ) + checksum += mpeg2_mbinfo[ i ].MV[ j ][ k ][ l ]; + } + } + } + + return ( checksum ); +} + + +/* + Algorithm core functions +*/ + +/* + motion estimation for progressive and interlaced frame pictures + + oldorg: source frame for forward prediction (used for P and B frames) + neworg: source frame for backward prediction (B frames only) + oldref: reconstructed frame for forward prediction (P and B frames) + newref: reconstructed frame for backward prediction (B frames only) + cur: current frame (the one for which the prediction is formed) + sxf,syf: forward search window (frame coordinates) + sxb,syb: backward search window (frame coordinates) + mbi: pointer to macroblock info structure + + results: + mbi-> + mb_type: 0, MB_INTRA, MB_FORWARD, MB_BACKWARD, MB_FORWARD|MB_BACKWARD + MV[][][]: motion vectors (frame format) + mv_field_sel: top/bottom field (for field prediction) + motion_type: MC_FRAME, MC_FIELD + + uses global vars: mpeg2_pict_type, frame_pred_dct +*/ +void mpeg2_motion_estimation( unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, + unsigned char *cur, unsigned char *curref, + int sxf, int syf, int sxb, int syb, + struct mbinfo *mbi, int secondfield, int ipflag ) +{ + int i, j; + + + /* loop through all macroblocks of the picture */ + _Pragma( "loopbound min 16 max 16" ) + for ( j = 0; j < mpeg2_height2; j += 16 ) { + i = 0; + _Pragma( "loopbound min 22 max 22" ) + for ( ; i < mpeg2_width; i += 16 ) { + if ( mpeg2_pict_struct == 3 ) + mpeg2_frame_ME( + oldorg, neworg, oldref, newref, cur, i, j, sxf, syf, sxb, syb, mbi ); + else + mpeg2_field_ME( + oldorg, neworg, oldref, newref, cur, curref, i, j, sxf, syf, sxb, syb, + mbi, secondfield, ipflag ); + mbi++; + } + } +} + + +void mpeg2_frame_ME( unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, + unsigned char *cur, int i, int j, int sxf, int syf, + int sxb, int syb, struct mbinfo *mbi ) +{ + int imin, jmin, iminf, jminf, iminr, jminr; + int imint, jmint, iminb, jminb; + int imintf, jmintf, iminbf, jminbf; + int imintr, jmintr, iminbr, jminbr; + int var, v0; + int dmc, dmcf, dmcr, dmci, vmc, vmcf, vmcr, vmci; + int dmcfield, dmcfieldf, dmcfieldr, dmcfieldi; + int tsel, bsel, tself, bself, tselr, bselr; + unsigned char *mb; + int imins[ 2 ][ 2 ], jmins[ 2 ][ 2 ]; + int imindp, jmindp, imindmv, jmindmv, dmc_dp, vmc_dp; + + + mb = cur + i + mpeg2_width * j; + + var = mpeg2_variance( mb, mpeg2_width ); + + if ( mpeg2_pict_type == 1 ) + mbi->mb_type = 1; + else + + if ( mpeg2_pict_type == 2 ) { + if ( mpeg2_frame_pred_dct ) { + dmc = + mpeg2_fullsearch( + oldorg, oldref, mb, mpeg2_width, i, j, sxf, syf, 16, mpeg2_width, + mpeg2_height, &imin, &jmin ); + vmc = + mpeg2_dist2( + oldref + ( imin >> 1 ) + mpeg2_width * ( jmin >> 1 ), mb, mpeg2_width, + imin & 1, jmin & 1, 16 ); + mbi->motion_type = 2; + } else { + mpeg2_frame_estimate( + oldorg, oldref, mb, i, j, sxf, syf, &imin, &jmin, &imint, &jmint, + &iminb, &jminb, &dmc, &dmcfield, &tsel, &bsel, imins, jmins ); + + if ( mpeg2_M == 1 ) + mpeg2_dpframe_estimate( + oldref, mb, i, j >> 1, imins, jmins, &imindp, &jmindp, &imindmv, + &jmindmv, &dmc_dp, &vmc_dp ); + + /* select between dual prime, frame and field prediction */ + if ( ( mpeg2_M == 1 ) && ( dmc_dp < dmc ) && ( dmc_dp < dmcfield ) ) { + mbi->motion_type = 3; + dmc = dmc_dp; + vmc = vmc_dp; + } else + + if ( dmc <= dmcfield ) { + mbi->motion_type = 2; + vmc = + mpeg2_dist2( + oldref + ( imin >> 1 ) + mpeg2_width * ( jmin >> 1 ), mb, + mpeg2_width, imin & 1, jmin & 1, 16 ); + } else { + mbi->motion_type = 1; + dmc = dmcfield; + vmc = + mpeg2_dist2( + oldref + ( tsel ? mpeg2_width : 0 ) + ( imint >> 1 ) + + ( mpeg2_width << 1 ) * ( jmint >> 1 ), + mb, mpeg2_width << 1, imint & 1, jmint & 1, 8 ); + vmc += + mpeg2_dist2( + oldref + ( bsel ? mpeg2_width : 0 ) + ( iminb >> 1 ) + + ( mpeg2_width << 1 ) * ( jminb >> 1 ), + mb + mpeg2_width, mpeg2_width << 1, iminb & 1, jminb & 1, 8 ); + } + } + + /* + select between intra or non-intra coding: + + selection is based on intra block variance (var) vs. + prediction error variance (vmc) + + blocks with small prediction error are always coded non-intra + even if variance is smaller (is this reasonable?) + */ + if ( ( vmc > var ) && ( vmc >= 9 * 256 ) ) + mbi->mb_type = 1; + else { + /* + select between MC / No-MC + + use No-MC if var(No-MC) <= 1.25*var(MC) + (i.e slightly biased towards No-MC) + + blocks with small prediction error are always coded as No-MC + (requires no motion vectors, allows skipping) + */ + v0 = + mpeg2_dist2( oldref + i + mpeg2_width * j, mb, mpeg2_width, 0, 0, 16 ); + + if ( ( 4 * v0 > 5 * vmc ) && ( v0 >= 9 * 256 ) ) { + /* use MC */ + var = vmc; + mbi->mb_type = 8; + + if ( mbi->motion_type == 2 ) { + mbi->MV[ 0 ][ 0 ][ 0 ] = imin - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jmin - ( j << 1 ); + } else + + if ( mbi->motion_type == 3 ) { + /* these are FRAME vectors */ + /* same parity vector */ + mbi->MV[ 0 ][ 0 ][ 0 ] = imindp - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = ( jmindp << 1 ) - ( j << 1 ); + + /* opposite parity vector */ + mbi->dmvector[ 0 ] = imindmv; + mbi->dmvector[ 1 ] = jmindmv; + } else { + /* these are FRAME vectors */ + mbi->MV[ 0 ][ 0 ][ 0 ] = imint - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = ( jmint << 1 ) - ( j << 1 ); + mbi->MV[ 1 ][ 0 ][ 0 ] = iminb - ( i << 1 ); + mbi->MV[ 1 ][ 0 ][ 1 ] = ( jminb << 1 ) - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 0 ] = tsel; + mbi->mv_field_sel[ 1 ][ 0 ] = bsel; + } + } else { + /* No-MC */ + var = v0; + mbi->mb_type = 0; + mbi->motion_type = 2; + mbi->MV[ 0 ][ 0 ][ 0 ] = 0; + mbi->MV[ 0 ][ 0 ][ 1 ] = 0; + } + } + } else { /* if (mpeg2_pict_type==B_TYPE) */ + + if ( mpeg2_frame_pred_dct ) { + /* forward */ + dmcf = + mpeg2_fullsearch( + oldorg, oldref, mb, mpeg2_width, i, j, sxf, syf, 16, mpeg2_width, + mpeg2_height, &iminf, &jminf ); + vmcf = + mpeg2_dist2( + oldref + ( iminf >> 1 ) + mpeg2_width * ( jminf >> 1 ), mb, + mpeg2_width, iminf & 1, jminf & 1, 16 ); + + /* backward */ + dmcr = + mpeg2_fullsearch( + neworg, newref, mb, mpeg2_width, i, j, sxb, syb, 16, mpeg2_width, + mpeg2_height, &iminr, &jminr ); + vmcr = + mpeg2_dist2( + newref + ( iminr >> 1 ) + mpeg2_width * ( jminr >> 1 ), mb, + mpeg2_width, iminr & 1, jminr & 1, 16 ); + + /* interpolated (bidirectional) */ + vmci = + mpeg2_bdist2( + oldref + ( iminf >> 1 ) + mpeg2_width * ( jminf >> 1 ), + newref + ( iminr >> 1 ) + mpeg2_width * ( jminr >> 1 ), + mb, mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16 ); + + /* decisions */ + + /* + select between forward/backward/interpolated prediction: + use the one with smallest mean sqaured prediction error + */ + if ( ( vmcf <= vmcr ) && ( vmcf <= vmci ) ) { + vmc = vmcf; + mbi->mb_type = 8; + } else + + if ( vmcr <= vmci ) { + vmc = vmcr; + mbi->mb_type = 4; + } else { + vmc = vmci; + mbi->mb_type = 8 | 4; + } + + mbi->motion_type = 2; + } else { + /* forward prediction */ + mpeg2_frame_estimate( + oldorg, oldref, mb, i, j, sxf, syf, &iminf, &jminf, &imintf, &jmintf, + &iminbf, &jminbf, &dmcf, &dmcfieldf, &tself, &bself, imins, jmins ); + + /* backward prediction */ + mpeg2_frame_estimate( + neworg, newref, mb, i, j, sxb, syb, &iminr, &jminr, &imintr, &jmintr, + &iminbr, &jminbr, &dmcr, &dmcfieldr, &tselr, &bselr, imins, jmins ); + + /* calculate interpolated distance */ + /* frame */ + dmci = + mpeg2_bdist1( + oldref + ( iminf >> 1 ) + mpeg2_width * ( jminf >> 1 ), + newref + ( iminr >> 1 ) + mpeg2_width * ( jminr >> 1 ), + mb, mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16 ); + + /* top field */ + dmcfieldi = + mpeg2_bdist1( + oldref + ( imintf >> 1 ) + ( tself ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jmintf >> 1 ), + newref + ( imintr >> 1 ) + ( tselr ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jmintr >> 1 ), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, imintr & 1, jmintr & 1, + 8 ); + + /* bottom field */ + dmcfieldi += + mpeg2_bdist1( + oldref + ( iminbf >> 1 ) + ( bself ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jminbf >> 1 ), + newref + ( iminbr >> 1 ) + ( bselr ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jminbr >> 1 ), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, iminbr & 1, + jminbr & 1, 8 ); + + /* + select prediction type of minimum distance from the + six candidates (field/frame * forward/backward/interpolated) + */ + if ( ( dmci < dmcfieldi ) && ( dmci < dmcf ) && ( dmci < dmcfieldf ) && + ( dmci < dmcr ) && ( dmci < dmcfieldr ) ) { + /* frame, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 2; + vmc = + mpeg2_bdist2( + oldref + ( iminf >> 1 ) + mpeg2_width * ( jminf >> 1 ), + newref + ( iminr >> 1 ) + mpeg2_width * ( jminr >> 1 ), + mb, mpeg2_width, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16 ); + } else + + if ( ( dmcfieldi < dmcf ) && ( dmcfieldi < dmcfieldf ) && + ( dmcfieldi < dmcr ) && ( dmcfieldi < dmcfieldr ) ) { + /* field, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 1; + vmc = + mpeg2_bdist2( + oldref + ( imintf >> 1 ) + ( tself ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jmintf >> 1 ), + newref + ( imintr >> 1 ) + ( tselr ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jmintr >> 1 ), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, imintr & 1, jmintr & 1, + 8 ); + vmc += + mpeg2_bdist2( + oldref + ( iminbf >> 1 ) + ( bself ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jminbf >> 1 ), + newref + ( iminbr >> 1 ) + ( bselr ? mpeg2_width : 0 ) + + ( mpeg2_width << 1 ) * ( jminbr >> 1 ), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, + iminbr & 1, jminbr & 1, 8 ); + } else + + if ( ( dmcf < dmcfieldf ) && ( dmcf < dmcr ) && ( dmcf < dmcfieldr ) ) { + /* frame, forward */ + mbi->mb_type = 8; + mbi->motion_type = 2; + vmc = + mpeg2_dist2( + oldref + ( iminf >> 1 ) + mpeg2_width * ( jminf >> 1 ), mb, + mpeg2_width, iminf & 1, jminf & 1, 16 ); + } else + + if ( ( dmcfieldf < dmcr ) && ( dmcfieldf < dmcfieldr ) ) { + /* field, forward */ + mbi->mb_type = 8; + mbi->motion_type = 1; + vmc = + mpeg2_dist2( + oldref + ( tself ? mpeg2_width : 0 ) + ( imintf >> 1 ) + + ( mpeg2_width << 1 ) * ( jmintf >> 1 ), + mb, mpeg2_width << 1, imintf & 1, jmintf & 1, 8 ); + vmc += + mpeg2_dist2( + oldref + ( bself ? mpeg2_width : 0 ) + ( iminbf >> 1 ) + + ( mpeg2_width << 1 ) * ( jminbf >> 1 ), + mb + mpeg2_width, mpeg2_width << 1, iminbf & 1, jminbf & 1, 8 ); + } else + + if ( dmcr < dmcfieldr ) { + /* frame, backward */ + mbi->mb_type = 4; + mbi->motion_type = 2; + vmc = + mpeg2_dist2( + newref + ( iminr >> 1 ) + mpeg2_width * ( jminr >> 1 ), mb, + mpeg2_width, iminr & 1, jminr & 1, 16 ); + } else { + /* field, backward */ + mbi->mb_type = 4; + mbi->motion_type = 1; + vmc = + mpeg2_dist2( + newref + ( tselr ? mpeg2_width : 0 ) + ( imintr >> 1 ) + + ( mpeg2_width << 1 ) * ( jmintr >> 1 ), + mb, mpeg2_width << 1, imintr & 1, jmintr & 1, 8 ); + vmc += + mpeg2_dist2( + newref + ( bselr ? mpeg2_width : 0 ) + ( iminbr >> 1 ) + + ( mpeg2_width << 1 ) * ( jminbr >> 1 ), + mb + mpeg2_width, mpeg2_width << 1, iminbr & 1, jminbr & 1, 8 ); + } + } + + /* + select between intra or non-intra coding: + + selection is based on intra block variance (var) vs. + prediction error variance (vmc) + + blocks with small prediction error are always coded non-intra + even if variance is smaller (is this reasonable?) + */ + if ( ( vmc > var ) && ( vmc >= 9 * 256 ) ) + mbi->mb_type = 1; + else { + var = vmc; + + if ( mbi->motion_type == 2 ) { + /* forward */ + mbi->MV[ 0 ][ 0 ][ 0 ] = iminf - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jminf - ( j << 1 ); + /* backward */ + mbi->MV[ 0 ][ 1 ][ 0 ] = iminr - ( i << 1 ); + mbi->MV[ 0 ][ 1 ][ 1 ] = jminr - ( j << 1 ); + } else { + /* these are FRAME vectors */ + /* forward */ + mbi->MV[ 0 ][ 0 ][ 0 ] = imintf - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = ( jmintf << 1 ) - ( j << 1 ); + mbi->MV[ 1 ][ 0 ][ 0 ] = iminbf - ( i << 1 ); + mbi->MV[ 1 ][ 0 ][ 1 ] = ( jminbf << 1 ) - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 0 ] = tself; + mbi->mv_field_sel[ 1 ][ 0 ] = bself; + /* backward */ + mbi->MV[ 0 ][ 1 ][ 0 ] = imintr - ( i << 1 ); + mbi->MV[ 0 ][ 1 ][ 1 ] = ( jmintr << 1 ) - ( j << 1 ); + mbi->MV[ 1 ][ 1 ][ 0 ] = iminbr - ( i << 1 ); + mbi->MV[ 1 ][ 1 ][ 1 ] = ( jminbr << 1 ) - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 1 ] = tselr; + mbi->mv_field_sel[ 1 ][ 1 ] = bselr; + } + } + } + + mbi->var = var; +} + + +/* + motion estimation for field pictures + + oldorg: original frame for forward prediction (P and B frames) + neworg: original frame for backward prediction (B frames only) + oldref: reconstructed frame for forward prediction (P and B frames) + newref: reconstructed frame for backward prediction (B frames only) + cur: current original frame (the one for which the prediction is formed) + curref: current reconstructed frame (to predict second field from first) + sxf,syf: forward search window (frame coordinates) + sxb,syb: backward search window (frame coordinates) + mbi: pointer to macroblock info structure + secondfield: indicates second field of a frame (in P fields this means + that reference field of opposite parity is in curref instead + of oldref) + ipflag: indicates a P type field which is the second field of a frame + in which the first field is I type (this restricts predictions + to be based only on the opposite parity (=I) field) + + results: + mbi-> + mb_type: 0, MB_INTRA, MB_FORWARD, MB_BACKWARD, MB_FORWARD|MB_BACKWARD + MV[][][]: motion vectors (field format) + mv_field_sel: top/bottom field + motion_type: MC_FIELD, MC_16X8 + + uses global vars: mpeg2_pict_type, mpeg2_pict_struct +*/ +void mpeg2_field_ME( unsigned char *oldorg, unsigned char *neworg, + unsigned char *oldref, unsigned char *newref, + unsigned char *cur, unsigned char *curref, int i, int j, + int sxf, int syf, int sxb, int syb, struct mbinfo *mbi, + int secondfield, int ipflag ) +{ + int w2; + unsigned char *mb, *toporg, *topref, *botorg, *botref; + int var, vmc, v0, dmcfieldi, dmc8i; + int imin, jmin, imin8u, jmin8u, imin8l, jmin8l, dmcfield, dmc8, sel, sel8u, + sel8l; + int iminf, jminf, imin8uf, jmin8uf, imin8lf, jmin8lf, dmcfieldf, dmc8f, self, + sel8uf, sel8lf; + int iminr, jminr, imin8ur, jmin8ur, imin8lr, jmin8lr, dmcfieldr, dmc8r, selr, + sel8ur, sel8lr; + int imins, jmins, ds, imindmv, jmindmv, vmc_dp, dmc_dp; + + + w2 = mpeg2_width << 1; + mb = cur + i + w2 * j; + + if ( mpeg2_pict_struct == 2 ) + mb += mpeg2_width; + + var = mpeg2_variance( mb, w2 ); + + if ( mpeg2_pict_type == 1 ) + mbi->mb_type = 1; + else + + if ( mpeg2_pict_type == 2 ) { + toporg = oldorg; + topref = oldref; + botorg = oldorg + mpeg2_width; + botref = oldref + mpeg2_width; + + if ( secondfield ) { + /* opposite parity field is in same frame */ + if ( mpeg2_pict_struct == 1 ) { + /* current is top field */ + botorg = cur + mpeg2_width; + botref = curref + mpeg2_width; + } else { + /* current is bottom field */ + toporg = cur; + topref = curref; + } + } + + mpeg2_field_estimate( + toporg, topref, botorg, botref, mb, i, j, sxf, syf, ipflag, &imin, &jmin, + &imin8u, &jmin8u, &imin8l, &jmin8l, &dmcfield, &dmc8, &sel, &sel8u, + &sel8l, &imins, &jmins, &ds ); + + if ( ( mpeg2_M == 1 ) && !ipflag ) + /* generic condition which permits Dual Prime */ + mpeg2_dpfield_estimate( + topref, botref, mb, i, j, imins, jmins, &imindmv, &jmindmv, &dmc_dp, + &vmc_dp ); + + /* select between dual prime, field and 16x8 prediction */ + if ( ( mpeg2_M == 1 ) && !ipflag && ( dmc_dp < dmc8 ) && + ( dmc_dp < dmcfield ) ) { + /* Dual Prime prediction */ + mbi->motion_type = 3; + vmc = vmc_dp; /* we already calculated L2 error for Dual */ + + } else + + if ( dmc8 < dmcfield ) { + /* 16x8 prediction */ + mbi->motion_type = 2; + /* upper half block */ + vmc = + mpeg2_dist2( + ( sel8u ? botref : topref ) + ( imin8u >> 1 ) + w2 * ( jmin8u >> 1 ), + mb, w2, imin8u & 1, jmin8u & 1, 8 ); + /* lower half block */ + vmc += + mpeg2_dist2( + ( sel8l ? botref : topref ) + ( imin8l >> 1 ) + w2 * ( jmin8l >> 1 ), + mb + 8 * w2, w2, imin8l & 1, jmin8l & 1, 8 ); + } else { + /* field prediction */ + mbi->motion_type = 1; + vmc = + mpeg2_dist2( + ( sel ? botref : topref ) + ( imin >> 1 ) + w2 * ( jmin >> 1 ), + mb, w2, imin & 1, jmin & 1, 16 ); + } + + /* select between intra and non-intra coding */ + if ( ( vmc > var ) && ( vmc >= 9 * 256 ) ) + mbi->mb_type = 1; + else { + /* + zero MV field prediction from same parity ref. field + (not allowed if ipflag is set) + */ + if ( !ipflag ) + v0 = + mpeg2_dist2( + ( ( mpeg2_pict_struct == 2 ) ? botref : topref ) + i + w2 * j, mb, + w2, 0, 0, 16 ); + + if ( ipflag || ( ( 4 * v0 > 5 * vmc ) && ( v0 >= 9 * 256 ) ) ) { + var = vmc; + mbi->mb_type = 8; + + if ( mbi->motion_type == 1 ) { + mbi->MV[ 0 ][ 0 ][ 0 ] = imin - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jmin - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 0 ] = sel; + } else + + if ( mbi->motion_type == 3 ) { + /* same parity vector */ + mbi->MV[ 0 ][ 0 ][ 0 ] = imins - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jmins - ( j << 1 ); + + /* opposite parity vector */ + mbi->dmvector[ 0 ] = imindmv; + mbi->dmvector[ 1 ] = jmindmv; + } else { + mbi->MV[ 0 ][ 0 ][ 0 ] = imin8u - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jmin8u - ( j << 1 ); + mbi->MV[ 1 ][ 0 ][ 0 ] = imin8l - ( i << 1 ); + mbi->MV[ 1 ][ 0 ][ 1 ] = jmin8l - ( ( j + 8 ) << 1 ); + mbi->mv_field_sel[ 0 ][ 0 ] = sel8u; + mbi->mv_field_sel[ 1 ][ 0 ] = sel8l; + } + } else { + /* No MC */ + var = v0; + mbi->mb_type = 0; + mbi->motion_type = 1; + mbi->MV[ 0 ][ 0 ][ 0 ] = 0; + mbi->MV[ 0 ][ 0 ][ 1 ] = 0; + mbi->mv_field_sel[ 0 ][ 0 ] = ( mpeg2_pict_struct == 2 ); + } + } + } else { /* if (mpeg2_pict_type==B_TYPE) */ + /* forward prediction */ + mpeg2_field_estimate( + oldorg, oldref, oldorg + mpeg2_width, oldref + mpeg2_width, mb, i, j, sxf, + syf, 0, &iminf, &jminf, &imin8uf, &jmin8uf, &imin8lf, &jmin8lf, + &dmcfieldf, &dmc8f, &self, &sel8uf, &sel8lf, &imins, &jmins, &ds ); + + /* backward prediction */ + mpeg2_field_estimate( + neworg, newref, neworg + mpeg2_width, newref + mpeg2_width, mb, i, j, sxb, + syb, 0, &iminr, &jminr, &imin8ur, &jmin8ur, &imin8lr, &jmin8lr, + &dmcfieldr, &dmc8r, &selr, &sel8ur, &sel8lr, &imins, &jmins, &ds ); + + /* calculate distances for bidirectional prediction */ + /* field */ + dmcfieldi = + mpeg2_bdist1( + oldref + ( self ? mpeg2_width : 0 ) + ( iminf >> 1 ) + + w2 * ( jminf >> 1 ), + newref + ( selr ? mpeg2_width : 0 ) + ( iminr >> 1 ) + + w2 * ( jminr >> 1 ), + mb, w2, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16 ); + + /* 16x8 upper half block */ + dmc8i = + mpeg2_bdist1( + oldref + ( sel8uf ? mpeg2_width : 0 ) + ( imin8uf >> 1 ) + + w2 * ( jmin8uf >> 1 ), + newref + ( sel8ur ? mpeg2_width : 0 ) + ( imin8ur >> 1 ) + + w2 * ( jmin8ur >> 1 ), + mb, w2, imin8uf & 1, jmin8uf & 1, imin8ur & 1, jmin8ur & 1, 8 ); + + /* 16x8 lower half block */ + dmc8i += + mpeg2_bdist1( + oldref + ( sel8lf ? mpeg2_width : 0 ) + ( imin8lf >> 1 ) + + w2 * ( jmin8lf >> 1 ), + newref + ( sel8lr ? mpeg2_width : 0 ) + ( imin8lr >> 1 ) + + w2 * ( jmin8lr >> 1 ), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, imin8lr & 1, jmin8lr & 1, + 8 ); + + /* select prediction type of minimum distance */ + if ( ( dmcfieldi < dmc8i ) && ( dmcfieldi < dmcfieldf ) && + ( dmcfieldi < dmc8f ) && ( dmcfieldi < dmcfieldr ) && + ( dmcfieldi < dmc8r ) ) { + /* field, interpolated */ + mbi->mb_type = 8 | 5; + mbi->motion_type = 1; + vmc = + mpeg2_bdist2( + oldref + ( self ? mpeg2_width : 0 ) + ( iminf >> 1 ) + + w2 * ( jminf >> 1 ), + newref + ( selr ? mpeg2_width : 0 ) + ( iminr >> 1 ) + + w2 * ( jminr >> 1 ), + mb, w2, iminf & 1, jminf & 1, iminr & 1, jminr & 1, 16 ); + } else + + if ( ( dmc8i < dmcfieldf ) && ( dmc8i < dmc8f ) && ( dmc8i < dmcfieldr ) && + ( dmc8i < dmc8r ) ) { + /* 16x8, interpolated */ + mbi->mb_type = 8 | 4; + mbi->motion_type = 2; + + /* upper half block */ + vmc = + mpeg2_bdist2( + oldref + ( sel8uf ? mpeg2_width : 0 ) + ( imin8uf >> 1 ) + + w2 * ( jmin8uf >> 1 ), + newref + ( sel8ur ? mpeg2_width : 0 ) + ( imin8ur >> 1 ) + + w2 * ( jmin8ur >> 1 ), + mb, w2, imin8uf & 1, jmin8uf & 1, imin8ur & 1, jmin8ur & 1, 8 ); + + /* lower half block */ + vmc += + mpeg2_bdist2( + oldref + ( sel8lf ? mpeg2_width : 0 ) + ( imin8lf >> 1 ) + + w2 * ( jmin8lf >> 1 ), + newref + ( sel8lr ? mpeg2_width : 0 ) + ( imin8lr >> 1 ) + + w2 * ( jmin8lr >> 1 ), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, imin8lr & 1, jmin8lr & 1, + 8 ); + } else + + if ( ( dmcfieldf < dmc8f ) && ( dmcfieldf < dmcfieldr ) && + ( dmcfieldf < dmc8r ) ) { + /* field, forward */ + mbi->mb_type = 8; + mbi->motion_type = 1; + vmc = + mpeg2_dist2( + oldref + ( self ? mpeg2_width : 0 ) + ( iminf >> 1 ) + + w2 * ( jminf >> 1 ), + mb, w2, iminf & 1, jminf & 1, 16 ); + } else + + if ( ( dmc8f < dmcfieldr ) && ( dmc8f < dmc8r ) ) { + /* 16x8, forward */ + mbi->mb_type = 8; + mbi->motion_type = 2; + + /* upper half block */ + vmc = + mpeg2_dist2( + oldref + ( sel8uf ? mpeg2_width : 0 ) + ( imin8uf >> 1 ) + + w2 * ( jmin8uf >> 1 ), mb, w2, imin8uf & 1, jmin8uf & 1, 8 ); + + /* lower half block */ + vmc += + mpeg2_dist2( + oldref + ( sel8lf ? mpeg2_width : 0 ) + ( imin8lf >> 1 ) + + w2 * ( jmin8lf >> 1 ), + mb + 8 * w2, w2, imin8lf & 1, jmin8lf & 1, 8 ); + } else + + if ( dmcfieldr < dmc8r ) { + /* field, backward */ + mbi->mb_type = 4; + mbi->motion_type = 1; + vmc = + mpeg2_dist2( + newref + ( selr ? mpeg2_width : 0 ) + ( iminr >> 1 ) + + w2 * ( jminr >> 1 ), + mb, w2, iminr & 1, jminr & 1, 16 ); + } else { + /* 16x8, backward */ + mbi->mb_type = 4; + mbi->motion_type = 2; + + /* upper half block */ + vmc = + mpeg2_dist2( + newref + ( sel8ur ? mpeg2_width : 0 ) + ( imin8ur >> 1 ) + + w2 * ( jmin8ur >> 1 ), + mb, w2, imin8ur & 1, jmin8ur & 1, 8 ); + + /* lower half block */ + vmc += + mpeg2_dist2( + newref + ( sel8lr ? mpeg2_width : 0 ) + ( imin8lr >> 1 ) + + w2 * ( jmin8lr >> 1 ), + mb + 8 * w2, w2, imin8lr & 1, jmin8lr & 1, 8 ); + } + + /* select between intra and non-intra coding */ + if ( ( vmc > var ) && ( vmc >= 9 * 256 ) ) + mbi->mb_type = 1; + else { + var = vmc; + + if ( mbi->motion_type == 1 ) { + /* forward */ + mbi->MV[ 0 ][ 0 ][ 0 ] = iminf - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jminf - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 0 ] = self; + /* backward */ + mbi->MV[ 0 ][ 1 ][ 0 ] = iminr - ( i << 1 ); + mbi->MV[ 0 ][ 1 ][ 1 ] = jminr - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 1 ] = selr; + } else { /* MC_16X8 */ + /* forward */ + mbi->MV[ 0 ][ 0 ][ 0 ] = imin8uf - ( i << 1 ); + mbi->MV[ 0 ][ 0 ][ 1 ] = jmin8uf - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 0 ] = sel8uf; + mbi->MV[ 1 ][ 0 ][ 0 ] = imin8lf - ( i << 1 ); + mbi->MV[ 1 ][ 0 ][ 1 ] = jmin8lf - ( ( j + 8 ) << 1 ); + mbi->mv_field_sel[ 1 ][ 0 ] = sel8lf; + /* backward */ + mbi->MV[ 0 ][ 1 ][ 0 ] = imin8ur - ( i << 1 ); + mbi->MV[ 0 ][ 1 ][ 1 ] = jmin8ur - ( j << 1 ); + mbi->mv_field_sel[ 0 ][ 1 ] = sel8ur; + mbi->MV[ 1 ][ 1 ][ 0 ] = imin8lr - ( i << 1 ); + mbi->MV[ 1 ][ 1 ][ 1 ] = jmin8lr - ( ( j + 8 ) << 1 ); + mbi->mv_field_sel[ 1 ][ 1 ] = sel8lr; + } + } + } + + mbi->var = var; +} + + +/* + frame picture motion estimation + + org: top left pel of source reference frame + ref: top left pel of reconstructed reference frame + mb: macroblock to be matched + i,j: location of mb relative to ref (=center of search window) + sx,sy: half widths of search window + iminp,jminp,dframep: location and value of best frame prediction + imintp,jmintp,tselp: location of best field pred. for top field of mb + iminbp,jminbp,bselp: location of best field pred. for bottom field of mb + dfieldp: value of field prediction +*/ +void mpeg2_frame_estimate( unsigned char *org, unsigned char *ref, + unsigned char *mb, int i, int j, int sx, int sy, + int *iminp, int *jminp, int *imintp, int *jmintp, + int *iminbp, int *jminbp, int *dframep, int *dfieldp, + int *tselp, int *bselp, int imins[ 2 ][ 2 ], + int jmins[ 2 ][ 2 ] ) +{ + int dt, db, dmint, dminb; + int imint, iminb, jmint, jminb; + + + /* frame prediction */ + *dframep = + mpeg2_fullsearch( + org, ref, mb, mpeg2_width, i, j, sx, sy, 16, mpeg2_width, mpeg2_height, + iminp, jminp ); + + /* predict top field from top field */ + dt = + mpeg2_fullsearch( + org, ref, mb, mpeg2_width << 1, i, j>>1, sx, sy >> 1, 8, mpeg2_width, + mpeg2_height >> 1, &imint, &jmint ); + + /* predict top field from bottom field */ + db = + mpeg2_fullsearch( + org + mpeg2_width, ref + mpeg2_width, mb, mpeg2_width << 1, i, j>>1, sx, + sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, &iminb, &jminb ); + + imins[ 0 ][ 0 ] = imint; + jmins[ 0 ][ 0 ] = jmint; + imins[ 1 ][ 0 ] = iminb; + jmins[ 1 ][ 0 ] = jminb; + + /* select prediction for top field */ + if ( dt <= db ) { + dmint = dt; + *imintp = imint; + *jmintp = jmint; + *tselp = 0; + } else { + dmint = db; + *imintp = iminb; + *jmintp = jminb; + *tselp = 1; + } + + /* predict bottom field from top field */ + dt = + mpeg2_fullsearch( + org, ref, mb + mpeg2_width, mpeg2_width << 1, i, j>>1, sx, sy >> 1, 8, + mpeg2_width, mpeg2_height >> 1, &imint, &jmint ); + + /* predict bottom field from bottom field */ + db = + mpeg2_fullsearch( + org + mpeg2_width, ref + mpeg2_width, mb + mpeg2_width, mpeg2_width << 1, + i, j>>1, sx, sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, &iminb, &jminb ); + + imins[ 0 ][ 1 ] = imint; + jmins[ 0 ][ 1 ] = jmint; + imins[ 1 ][ 1 ] = iminb; + jmins[ 1 ][ 1 ] = jminb; + + /* select prediction for bottom field */ + if ( db <= dt ) { + dminb = db; + *iminbp = iminb; + *jminbp = jminb; + *bselp = 1; + } else { + dminb = dt; + *iminbp = imint; + *jminbp = jmint; + *bselp = 0; + } + + *dfieldp = dmint + dminb; +} + + +/* + field picture motion estimation subroutine + + toporg: address of original top reference field + topref: address of reconstructed top reference field + botorg: address of original bottom reference field + botref: address of reconstructed bottom reference field + mb: macroblock to be matched + i,j: location of mb (=center of search window) + sx,sy: half width/height of search window + + iminp,jminp,selp,dfieldp: location and distance of best field prediction + imin8up,jmin8up,sel8up: location of best 16x8 pred. for upper half of mb + imin8lp,jmin8lp,sel8lp: location of best 16x8 pred. for lower half of mb + d8p: distance of best 16x8 prediction + iminsp,jminsp,dsp: location and distance of best same parity field + prediction (needed for dual prime, only valid if + ipflag==0) +*/ +void mpeg2_field_estimate( unsigned char *toporg, unsigned char *topref, + unsigned char *botorg, unsigned char *botref, + unsigned char *mb, int i, int j, int sx, int sy, + int ipflag, int *iminp, int *jminp, int *imin8up, + int *jmin8up, int *imin8lp, int *jmin8lp, + int *dfieldp, int *d8p, int *selp, int *sel8up, + int *sel8lp, int *iminsp, int *jminsp, int *dsp ) +{ + int dt, db, imint, jmint, iminb, jminb, notop, nobot; + + + /* if ipflag is set, predict from field of opposite parity only */ + notop = ipflag && ( mpeg2_pict_struct == 1 ); + nobot = ipflag && ( mpeg2_pict_struct == 2 ); + + /* field prediction */ + + /* predict current field from top field */ + if ( notop ) + dt = 65536; /* infinity */ + else + dt = + mpeg2_fullsearch( + toporg, topref, mb, mpeg2_width << 1, i, j, sx, sy>>1, 16, mpeg2_width, + mpeg2_height >> 1, &imint, &jmint ); + + /* predict current field from bottom field */ + if ( nobot ) + db = 65536; /* infinity */ + else + db = + mpeg2_fullsearch( + botorg, botref, mb, mpeg2_width << 1, i, j, sx, sy>>1, 16, mpeg2_width, + mpeg2_height >> 1, &iminb, &jminb ); + + /* same parity prediction (only valid if ipflag==0) */ + if ( mpeg2_pict_struct == 1 ) { + *iminsp = imint; + *jminsp = jmint; + *dsp = dt; + } else { + *iminsp = iminb; + *jminsp = jminb; + *dsp = db; + } + + /* select field prediction */ + if ( dt <= db ) { + *dfieldp = dt; + *iminp = imint; + *jminp = jmint; + *selp = 0; + } else { + *dfieldp = db; + *iminp = iminb; + *jminp = jminb; + *selp = 1; + } + + + /* 16x8 motion compensation */ + + /* predict upper half field from top field */ + if ( notop ) + dt = 65536; + else + dt = + mpeg2_fullsearch( + toporg, topref, mb, mpeg2_width << 1, i, j, sx, sy>>1, 8, mpeg2_width, + mpeg2_height >> 1, &imint, &jmint ); + + /* predict upper half field from bottom field */ + if ( nobot ) + db = 65536; + else + db = + mpeg2_fullsearch( + botorg, botref, mb, mpeg2_width << 1, i, j, sx, sy>>1, 8, mpeg2_width, + mpeg2_height >> 1, &iminb, &jminb ); + + /* select prediction for upper half field */ + if ( dt <= db ) { + *d8p = dt; + *imin8up = imint; + *jmin8up = jmint; + *sel8up = 0; + } else { + *d8p = db; + *imin8up = iminb; + *jmin8up = jminb; + *sel8up = 1; + } + + /* predict lower half field from top field */ + if ( notop ) + dt = 65536; + else + dt = + mpeg2_fullsearch( + toporg, topref, mb + ( mpeg2_width << 4 ), mpeg2_width << 1, i, j + 8, + sx, sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, &imint, &jmint ); + + /* predict lower half field from bottom field */ + if ( nobot ) + db = 65536; + else + db = + mpeg2_fullsearch( + botorg, botref, mb + ( mpeg2_width << 4 ), mpeg2_width << 1, i, j + 8, + sx, sy >> 1, 8, mpeg2_width, mpeg2_height >> 1, &iminb, &jminb ); + + /* select prediction for lower half field */ + if ( dt <= db ) { + *d8p += dt; + *imin8lp = imint; + *jmin8lp = jmint; + *sel8lp = 0; + } else { + *d8p += db; + *imin8lp = iminb; + *jmin8lp = jminb; + *sel8lp = 1; + } +} + + +void mpeg2_dpframe_estimate( unsigned char *ref, unsigned char *mb, int i, + int j, int iminf[ 2 ][ 2 ], int jminf[ 2 ][ 2 ], + int *iminp, int *jminp, int *imindmvp, + int *jmindmvp, int *dmcp, int *vmcp ) +{ + int pref, ppred, delta_x, delta_y; + int is, js, it, jt, ib, jb, it0, jt0, ib0, jb0; + int imins = 0, jmins = 0, imint = 0, jmint = 0, iminb = 0, jminb = 0, imindmv = 0, jmindmv = 0; + int vmc, local_dist; + + + /* + Calculate Dual Prime distortions for 9 delta candidates + for each of the four minimum field vectors + Note: only for P pictures! + */ + + /* initialize minimum dual prime distortion to large value */ + vmc = 1 << 30; + + _Pragma( "loopbound min 2 max 2" ) + for ( pref = 0; pref < 2; pref++ ) { + ppred = 0; + _Pragma( "loopbound min 2 max 2" ) + for ( ; ppred < 2; ppred++ ) { + /* + convert Cartesian absolute to relative motion vector + values (wrt current macroblock address (i,j) + */ + is = iminf[ pref ][ ppred ] - ( i << 1 ); + js = jminf[ pref ][ ppred ] - ( j << 1 ); + + if ( pref != ppred ) { + /* vertical field shift adjustment */ + if ( ppred == 0 ) + js++; + else + js--; + + /* mvxs and mvys scaling*/ + is <<= 1; + js <<= 1; + if ( mpeg2_topfirst == ppred ) { + /* second field: scale by 1/3 */ + is = ( is >= 0 ) ? ( is + 1 ) / 3 : -( ( -is + 1 ) / 3 ); + js = ( js >= 0 ) ? ( js + 1 ) / 3 : -( ( -js + 1 ) / 3 ); + } else + continue; + } + + /* vector for prediction from field of opposite 'parity' */ + if ( mpeg2_topfirst ) { + /* vector for prediction of top field from bottom field */ + it0 = ( ( is + ( is > 0 ) ) >> 1 ); + jt0 = ( ( js + ( js > 0 ) ) >> 1 ) - 1; + + /* vector for prediction of bottom field from top field */ + ib0 = ( ( 3 * is + ( is > 0 ) ) >> 1 ); + jb0 = ( ( 3 * js + ( js > 0 ) ) >> 1 ) + 1; + } else { + /* vector for prediction of top field from bottom field */ + it0 = ( ( 3 * is + ( is > 0 ) ) >> 1 ); + jt0 = ( ( 3 * js + ( js > 0 ) ) >> 1 ) - 1; + + /* vector for prediction of bottom field from top field */ + ib0 = ( ( is + ( is > 0 ) ) >> 1 ); + jb0 = ( ( js + ( js > 0 ) ) >> 1 ) + 1; + } + + /* convert back to absolute half-pel field picture coordinates */ + is += i << 1; + js += j << 1; + it0 += i << 1; + jt0 += j << 1; + ib0 += i << 1; + jb0 += j << 1; + + if ( ( is >= 0 ) && ( is <= ( mpeg2_width - 16 ) << 1 ) && + ( js >= 0 ) && ( js <= ( mpeg2_height - 16 ) ) ) { + _Pragma( "loopbound min 3 max 3" ) + for ( delta_y = -1; delta_y <= 1; delta_y++ ) { + delta_x = -1; + _Pragma( "loopbound min 3 max 3" ) + for ( ; delta_x <= 1; delta_x++ ) { + /* opposite field coordinates */ + it = it0 + delta_x; + jt = jt0 + delta_y; + ib = ib0 + delta_x; + jb = jb0 + delta_y; + + if ( ( it >= 0 ) && ( it <= ( mpeg2_width - 16 ) << 1 ) && + ( jt >= 0 ) && ( jt <= ( mpeg2_height - 16 ) ) && + ( ib >= 0 ) && ( ib <= ( mpeg2_width - 16 ) << 1 ) && + ( jb >= 0 ) && ( jb <= ( mpeg2_height - 16 ) ) ) { + /* compute prediction error */ + local_dist = + mpeg2_bdist2( + ref + ( is >> 1 ) + ( mpeg2_width << 1 ) * ( js >> 1 ), + ref + mpeg2_width + ( it >> 1 ) + + ( mpeg2_width << 1 ) * ( jt >> 1 ), + mb, /* current mb location */ + mpeg2_width << 1, /* adjacent line distance */ + is & 1, js & 1, it & 1, jt & 1, /* half-pel flags */ + 8 ); /* block height */ + local_dist += + mpeg2_bdist2( + ref + mpeg2_width + ( is >> 1 ) + + ( mpeg2_width << 1 ) * ( js >> 1 ), + ref + ( ib >> 1 ) + ( mpeg2_width << 1 ) * ( jb >> 1 ), + mb + mpeg2_width, /* current mb location */ + mpeg2_width << 1, /* adjacent line distance */ + is & 1, js & 1, ib & 1, jb & 1, /* half-pel flags */ + 8 ); /* block height */ + + /* update delta with least distortion vector */ + if ( local_dist < vmc ) { + imins = is; + jmins = js; + imint = it; + jmint = jt; + iminb = ib; + jminb = jb; + imindmv = delta_x; + jmindmv = delta_y; + vmc = local_dist; + } + } + } /* end delta x loop */ + } /* end delta y loop */ + } + } + } + + /* Compute L1 error for decision purposes */ + local_dist = + mpeg2_bdist1( + ref + ( imins >> 1 ) + ( mpeg2_width << 1 ) * ( jmins >> 1 ), + ref + mpeg2_width + ( imint >> 1 ) + + ( mpeg2_width << 1 ) * ( jmint >> 1 ), + mb, mpeg2_width << 1, imins & 1, jmins & 1, imint & 1, jmint & 1, 8 ); + local_dist += + mpeg2_bdist1( + ref + mpeg2_width + ( imins >> 1 ) + + ( mpeg2_width << 1 ) * ( jmins >> 1 ), + ref + ( iminb >> 1 ) + ( mpeg2_width << 1 ) * ( jminb >> 1 ), + mb + mpeg2_width, mpeg2_width << 1, imins & 1, jmins & 1, iminb & 1, + jminb & 1, 8 ); + + *dmcp = local_dist; + *iminp = imins; + *jminp = jmins; + *imindmvp = imindmv; + *jmindmvp = jmindmv; + *vmcp = vmc; +} + + +void mpeg2_dpfield_estimate( unsigned char *topref, unsigned char *botref, + unsigned char *mb, int i, int j, int imins, + int jmins, int *imindmvp, int *jmindmvp, int *dmcp, + int *vmcp ) +{ + unsigned char *sameref, *oppref; + int io0, jo0, io, jo, delta_x, delta_y, mvxs, mvys, mvxo0, mvyo0; + int imino = 0, jmino = 0, imindmv = 0, jmindmv = 0, vmc_dp = 0, local_dist = 0; + + + /* Calculate Dual Prime distortions for 9 delta candidates */ + /* Note: only for P pictures! */ + + /* Assign opposite and same reference pointer */ + if ( mpeg2_pict_struct == 1 ) { + sameref = topref; + oppref = botref; + } else { + sameref = botref; + oppref = topref; + } + + /* + convert Cartesian absolute to relative motion vector + values (wrt current macroblock address (i,j) + */ + mvxs = imins - ( i << 1 ); + mvys = jmins - ( j << 1 ); + + /* vector for prediction from field of opposite 'parity' */ + mvxo0 = ( mvxs + ( mvxs > 0 ) ) >> 1; /* mvxs // 2 */ + mvyo0 = ( mvys + ( mvys > 0 ) ) >> 1; /* mvys // 2 */ + + /* vertical field shift correction */ + if ( mpeg2_pict_struct == 1 ) + mvyo0--; + else + mvyo0++; + + /* convert back to absolute coordinates */ + io0 = mvxo0 + ( i << 1 ); + jo0 = mvyo0 + ( j << 1 ); + + /* initialize minimum dual prime distortion to large value */ + vmc_dp = 1 << 30; + + _Pragma( "loopbound min 3 max 3" ) + for ( delta_y = -1; delta_y <= 1; delta_y++ ) { + delta_x = -1; + _Pragma( "loopbound min 3 max 3" ) + for ( ; delta_x <= 1; delta_x++ ) { + /* opposite field coordinates */ + io = io0 + delta_x; + jo = jo0 + delta_y; + + if ( ( io >= 0 ) && ( io <= ( mpeg2_width - 16 ) << 1 ) && + ( jo >= 0 ) && ( jo <= ( mpeg2_height2 - 16 ) << 1 ) ) { + /* compute prediction error */ + local_dist = + mpeg2_bdist2( + sameref + ( imins >> 1 ) + mpeg2_width2 * ( jmins >> 1 ), + oppref + ( io >> 1 ) + mpeg2_width2 * ( jo >> 1 ), + mb, /* current mb location */ + mpeg2_width2, /* adjacent line distance */ + imins & 1, jmins & 1, io & 1, jo & 1, /* half-pel flags */ + 16 ); /* block height */ + + /* update delta with least distortion vector */ + if ( local_dist < vmc_dp ) { + imino = io; + jmino = jo; + imindmv = delta_x; + jmindmv = delta_y; + vmc_dp = local_dist; + } + } + } /* end delta x loop */ + } /* end delta y loop */ + + /* Compute L1 error for decision purposes */ + *dmcp = + mpeg2_bdist1( + sameref + ( imins >> 1 ) + mpeg2_width2 * ( jmins >> 1 ), + oppref + ( imino >> 1 ) + mpeg2_width2 * ( jmino >> 1 ), + mb, /* current mb location */ + mpeg2_width2, /* adjacent line distance */ + imins & 1, jmins & 1, imino & 1, jmino & 1, /* half-pel flags */ + 16 ); /* block height */ + + *imindmvp = imindmv; + *jmindmvp = jmindmv; + *vmcp = vmc_dp; +} + + +/* + full search block matching + + blk: top left pel of (16*h) block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in ref,blk + org: top left pel of source reference picture + ref: top left pel of reconstructed reference picture + i0,j0: center of search window + sx,sy: half widths of search window + xmax,ymax: right/bottom limits of search area + iminp,jminp: pointers to where the result is stored + result is given as half pel offset from ref(0,0) + i.e. NOT relative to (i0,j0) +*/ +int mpeg2_fullsearch( unsigned char *org, unsigned char *ref, + unsigned char *blk, int lx, int i0, int j0, int sx, + int sy, int h, int xmax, int ymax, int *iminp, + int *jminp ) +{ + int i, j, imin, jmin, ilow, ihigh, jlow, jhigh; + int d, dmin; + int k, l, sxy; + + + ilow = i0 - sx; + ihigh = i0 + sx; + + if ( ilow < 0 ) + ilow = 0; + + if ( ihigh > xmax - 16 ) + ihigh = xmax - 16; + + jlow = j0 - sy; + jhigh = j0 + sy; + + if ( jlow < 0 ) + jlow = 0; + + if ( jhigh > ymax - h ) + jhigh = ymax - h; + + /* full pel search, spiraling outwards */ + + imin = i0; + jmin = j0; + dmin = mpeg2_dist1( org + imin + lx * jmin, blk, lx, 0, 0, h, 65536 ); + + sxy = ( sx > sy ) ? sx : sy; + + _Pragma( "loopbound min 3 max 7" ) + for ( l = 1; l <= sxy; l++ ) { + i = i0 - l; + j = j0 - l; + _Pragma( "loopbound min 8 max 56" ) + for ( k = 0; k < 8 * l; k++ ) { + if ( ( i >= ilow ) && ( i <= ihigh ) && ( j >= jlow ) && + ( j <= jhigh ) ) { + d = mpeg2_dist1( org + i + lx * j, blk, lx, 0, 0, h, dmin ); + + if ( d < dmin ) { + dmin = d; + imin = i; + jmin = j; + } + } + + if ( k < 2 * l ) + i++; + else + + if ( k < 4 * l ) + j++; + else + + if ( k < 6 * l ) + i--; + else + j--; + } + } + + /* half pel */ + dmin = 65536; + imin <<= 1; + jmin <<= 1; + ilow = imin - ( imin > 0 ); + ihigh = imin + ( imin < ( ( xmax - 16 ) << 1 ) ); + jlow = jmin - ( jmin > 0 ); + jhigh = jmin + ( jmin < ( ( ymax - h ) << 1 ) ); + + _Pragma( "loopbound min 2 max 3" ) + for ( j = jlow; j <= jhigh; j++ ) { + i = ilow; + _Pragma( "loopbound min 2 max 3" ) + for ( ; i <= ihigh; i++ ) { + d = + mpeg2_dist1( + ref + ( i >> 1 ) + lx * ( j >> 1 ), blk, lx, i & 1, j & 1, h, dmin ); + + if ( d < dmin ) { + dmin = d; + imin = i; + jmin = j; + } + } + } + + *iminp = imin; + *jminp = jmin; + + return ( dmin ); +} + + +/* + total absolute difference between two (16*h) blocks + including optional half pel interpolation of blk1 (hx,hy) + blk1,blk2: addresses of top left pels of both blocks + lx: distance (in bytes) of vertically adjacent pels + hx,hy: flags for horizontal and/or vertical interpolation + h: height of block (usually 8 or 16) + distlim: bail out if sum exceeds this value +*/ +int mpeg2_dist1( unsigned char *blk1, unsigned char *blk2, int lx, int hx, + int hy, int h, int distlim ) +{ + unsigned char *p1, *p1a, *p2; + int i, j; + int s, v; + + + s = 0; + p1 = blk1; + p2 = blk2; + + if ( !hx && !hy ) { + _Pragma( "loopbound min 0 max 16" ) + for ( j = 0; j < h; j++ ) { + if ( ( v = p1[ 0 ] - p2[ 0 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 1 ] - p2[ 1 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 2 ] - p2[ 2 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 3 ] - p2[ 3 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 4 ] - p2[ 4 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 5 ] - p2[ 5 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 6 ] - p2[ 6 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 7 ] - p2[ 7 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 8 ] - p2[ 8 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 9 ] - p2[ 9 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 10 ] - p2[ 10 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 11 ] - p2[ 11 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 12 ] - p2[ 12 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 13 ] - p2[ 13 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 14 ] - p2[ 14 ] ) < 0 ) + v = -v; + s += v; + + if ( ( v = p1[ 15 ] - p2[ 15 ] ) < 0 ) + v = -v; + s += v; + + if ( s >= distlim ) + break; + + p1 += lx; + p2 += lx; + } + } else + + if ( hx && !hy ) { + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = ( ( unsigned int )( p1[ i ] + p1[ i + 1 ] + 1 ) >> 1 ) - p2[ i ]; + if ( v >= 0 ) + s += v; + else + s -= v; + } + p1 += lx; + p2 += lx; + } + } else + + if ( !hx && hy ) { + p1a = p1 + lx; + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = ( ( unsigned int )( p1[ i ] + p1a[ i ] + 1 ) >> 1 ) - p2[ i ]; + if ( v >= 0 ) + s += v; + else + s -= v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } else { /* if (hx && hy) */ + p1a = p1 + lx; + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = + ( ( unsigned int ) + ( p1[ i ] + p1[ i + 1 ] + p1a[ i ] + p1a[ i + 1 ] + 2 ) >> 2 ) - + p2[ i ]; + if ( v >= 0 ) + s += v; + else + s -= v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } + + return ( s ); +} + + +/* + total squared difference between two (16*h) blocks + including optional half pel interpolation of blk1 (hx,hy) + blk1,blk2: addresses of top left pels of both blocks + lx: distance (in bytes) of vertically adjacent pels + hx,hy: flags for horizontal and/or vertical interpolation + h: height of block (usually 8 or 16) +*/ +int mpeg2_dist2( unsigned char *blk1, unsigned char *blk2, int lx, int hx, + int hy, int h ) +{ + unsigned char *p1, *p1a, *p2; + int i, j; + int s, v; + + + s = 0; + p1 = blk1; + p2 = blk2; + + if ( !hx && !hy ) { + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = p1[ i ] - p2[ i ]; + s += v * v; + } + p1 += lx; + p2 += lx; + } + } else + + if ( hx && !hy ) { + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = ( ( unsigned int )( p1[ i ] + p1[ i + 1 ] + 1 ) >> 1 ) - p2[ i ]; + s += v * v; + } + p1 += lx; + p2 += lx; + } + } else + + if ( !hx && hy ) { + p1a = p1 + lx; + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = ( ( unsigned int )( p1[ i ] + p1a[ i ] + 1 ) >> 1 ) - p2[ i ]; + s += v * v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } else { /* if (hx && hy) */ + p1a = p1 + lx; + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = + ( ( unsigned int ) + ( p1[ i ] + p1[ i + 1 ] + p1a[ i ] + p1a[ i + 1 ] + 2 ) >> 2 ) - + p2[ i ]; + s += v * v; + } + p1 = p1a; + p1a += lx; + p2 += lx; + } + } + + return ( s ); +} + + +/* + absolute difference error between a (16*h) block and a bidirectional + prediction + + p2: address of top left pel of block + pf,hxf,hyf: address and half pel flags of forward ref. block + pb,hxb,hyb: address and half pel flags of backward ref. block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in p2,pf,pb +*/ +int mpeg2_bdist1( unsigned char *pf, unsigned char *pb, unsigned char *p2, + int lx, int hxf, int hyf, int hxb, int hyb, int h ) +{ + unsigned char *pfa, *pfb, *pfc, *pba, *pbb, *pbc; + int i, j; + int s, v; + + + pfa = pf + hxf; + pfb = pf + lx * hyf; + pfc = pfb + hxf; + + pba = pb + hxb; + pbb = pb + lx * hyb; + pbc = pbb + hxb; + + s = 0; + + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = + ( ( ( ( unsigned int )( *pf++ + *pfa++ + *pfb++ + *pfc++ + 2 ) >> 2 ) + + ( ( unsigned int )( *pb++ + *pba++ + *pbb++ + *pbc++ + 2 ) >> 2 ) + + 1 ) >> 1 ) - + *p2++; + if ( v >= 0 ) + s += v; + else + s -= v; + } + p2 += lx - 16; + pf += lx - 16; + pfa += lx - 16; + pfb += lx - 16; + pfc += lx - 16; + pb += lx - 16; + pba += lx - 16; + pbb += lx - 16; + pbc += lx - 16; + } + + return ( s ); +} + + +/* + squared error between a (16*h) block and a bidirectional + prediction + + p2: address of top left pel of block + pf,hxf,hyf: address and half pel flags of forward ref. block + pb,hxb,hyb: address and half pel flags of backward ref. block + h: height of block + lx: distance (in bytes) of vertically adjacent pels in p2,pf,pb +*/ +int mpeg2_bdist2( unsigned char *pf, unsigned char *pb, unsigned char *p2, + int lx, int hxf, int hyf, int hxb, int hyb, int h ) +{ + unsigned char *pfa, *pfb, *pfc, *pba, *pbb, *pbc; + int i, j; + int s, v; + + + pfa = pf + hxf; + pfb = pf + lx * hyf; + pfc = pfb + hxf; + + pba = pb + hxb; + pbb = pb + lx * hyb; + pbc = pbb + hxb; + + s = 0; + + _Pragma( "loopbound min 8 max 16" ) + for ( j = 0; j < h; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = + ( ( ( ( unsigned int )( *pf++ + *pfa++ + *pfb++ + *pfc++ + 2 ) >> 2 ) + + ( ( unsigned int )( *pb++ + *pba++ + *pbb++ + *pbc++ + 2 ) >> 2 ) + + 1 ) >> 1 ) - + *p2++; + s += v * v; + } + p2 += lx - 16; + pf += lx - 16; + pfa += lx - 16; + pfb += lx - 16; + pfc += lx - 16; + pb += lx - 16; + pba += lx - 16; + pbb += lx - 16; + pbc += lx - 16; + } + + return ( s ); +} + + +/* + variance of a (16*16) block, multiplied by 256 + p: address of top left pel of block + lx: distance (in bytes) of vertically adjacent pels +*/ +int mpeg2_variance( unsigned char *p, int lx ) +{ + int i, j; + unsigned int v, s, s2; + + + s = s2 = 0; + + _Pragma( "loopbound min 16 max 16" ) + for ( j = 0; j < 16; j++ ) { + i = 0; + _Pragma( "loopbound min 16 max 16" ) + for ( ; i < 16; i++ ) { + v = *p++; + s += v; + s2 += v * v; + } + p += lx - 16; + } + + return ( s2 - ( s * s ) / 256 ); +} + + +/* + Main functions +*/ + +void _Pragma ( "entrypoint" ) mpeg2_main( void ) +{ + mpeg2_motion_estimation( + mpeg2_oldorgframe, mpeg2_oldorgframe, mpeg2_oldorgframe, mpeg2_oldorgframe, + mpeg2_oldorgframe, mpeg2_oldorgframe, 7, 7, 3, 3, mpeg2_mbinfo, 0, 0 ); +} + + +int main( void ) +{ + mpeg2_init(); + mpeg2_main(); + + return ( mpeg2_return() - ( -116 ) != 0 ); +} diff --git a/targets/wasm-tacle/sequential/ndes/CMakeLists.txt b/targets/wasm-tacle/sequential/ndes/CMakeLists.txt new file mode 100644 index 0000000..4a25bff --- /dev/null +++ b/targets/wasm-tacle/sequential/ndes/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(ndes) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/ndes.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/ndes.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/ndes/ChangeLog.txt b/targets/wasm-tacle/sequential/ndes/ChangeLog.txt new file mode 100755 index 0000000..ae9c168 --- /dev/null +++ b/targets/wasm-tacle/sequential/ndes/ChangeLog.txt @@ -0,0 +1,20 @@ +File: ndes.c +Original provenience: + +2017-04-18: +- Annotated ndes_main as entry-point for timing analysis + +2015-10-21: +- Remove comment on line 1 +- Added generic TACLeBench header to line 1 +- Renamed functions to {name} to ndes_{name} +- Renamed globale variables to {name} to ndes_{name} +- Renamed structs to {name} to ndes_{name} +- Removed the profiling code +- Added forward decleration of functions +- Added ndes_main function +- Added ndes_init function +- Initialize ndes_ipc1 and ndes_ipc2 in ndes_init function +- int main variables to global variables for the ndes_init function +- Applied Code Style + diff --git a/targets/wasm-tacle/sequential/ndes/generated/default/ndes.wasm b/targets/wasm-tacle/sequential/ndes/generated/default/ndes.wasm new file mode 100755 index 0000000000000000000000000000000000000000..dbc66c205fd6731a392186e3fa766f33fa90f249 GIT binary patch literal 11467 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 Sc&1X{64WR5O>M1wtnnWpFM`Sd literal 0 HcmV?d00001 diff --git a/targets/wasm-tacle/sequential/ndes/generated/default/ndes.wat b/targets/wasm-tacle/sequential/ndes/generated/default/ndes.wat new file mode 100644 index 0000000..8811fe5 --- /dev/null +++ b/targets/wasm-tacle/sequential/ndes/generated/default/ndes.wat @@ -0,0 +1,2710 @@ +(module $ndes.wasm + (type (;0;) (func (param i32 i32))) + (type (;1;) (func)) + (type (;2;) (func (param i32 i32 i32 i32 i32))) + (type (;3;) (func (param i32 i32 i32))) + (type (;4;) (func (result i32))) + (import "__pragma" "loopbound" (func $__pragma_loopbound (type 0))) + (func $__wasm_apply_data_relocs (type 1)) + (func $ndes_init (type 1) + (local i32) + i32.const 57 + i32.const 57 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=1056 + i32.store8 offset=4000 + i32.const 0 + i32.const 0 + i32.load8_u offset=1057 + i32.store8 offset=4001 + i32.const 0 + i32.const 0 + i32.load8_u offset=1058 + i32.store8 offset=4002 + i32.const 0 + i32.const 0 + i32.load8_u offset=1059 + i32.store8 offset=4003 + i32.const 0 + i32.const 0 + i32.load8_u offset=1060 + i32.store8 offset=4004 + i32.const 0 + i32.const 0 + i32.load8_u offset=1061 + i32.store8 offset=4005 + i32.const 0 + i32.const 0 + i32.load8_u offset=1062 + i32.store8 offset=4006 + i32.const 0 + i32.const 0 + i32.load8_u offset=1063 + i32.store8 offset=4007 + i32.const 0 + i32.const 0 + i32.load8_u offset=1064 + i32.store8 offset=4008 + i32.const 0 + i32.const 0 + i32.load8_u offset=1065 + i32.store8 offset=4009 + i32.const 0 + i32.const 0 + i32.load8_u offset=1066 + i32.store8 offset=4010 + i32.const 0 + i32.const 0 + i32.load8_u offset=1067 + i32.store8 offset=4011 + i32.const 0 + i32.const 0 + i32.load8_u offset=1068 + i32.store8 offset=4012 + i32.const 0 + i32.const 0 + i32.load8_u offset=1069 + i32.store8 offset=4013 + i32.const 0 + i32.const 0 + i32.load8_u offset=1070 + i32.store8 offset=4014 + i32.const 0 + i32.const 0 + i32.load8_u offset=1071 + i32.store8 offset=4015 + i32.const 0 + i32.const 0 + i32.load8_u offset=1072 + i32.store8 offset=4016 + i32.const 0 + i32.const 0 + i32.load8_u offset=1073 + i32.store8 offset=4017 + i32.const 0 + i32.const 0 + i32.load8_u offset=1074 + i32.store8 offset=4018 + i32.const 0 + i32.const 0 + i32.load8_u offset=1075 + i32.store8 offset=4019 + i32.const 0 + i32.const 0 + i32.load8_u offset=1076 + i32.store8 offset=4020 + i32.const 0 + i32.const 0 + i32.load8_u offset=1077 + i32.store8 offset=4021 + i32.const 0 + i32.const 0 + i32.load8_u offset=1078 + i32.store8 offset=4022 + i32.const 0 + i32.const 0 + i32.load8_u offset=1079 + i32.store8 offset=4023 + i32.const 0 + i32.const 0 + i32.load8_u offset=1080 + i32.store8 offset=4024 + i32.const 0 + i32.const 0 + i32.load8_u offset=1081 + i32.store8 offset=4025 + i32.const 0 + i32.const 0 + i32.load8_u offset=1082 + i32.store8 offset=4026 + i32.const 0 + i32.const 0 + i32.load8_u offset=1083 + i32.store8 offset=4027 + i32.const 0 + i32.const 0 + i32.load8_u offset=1084 + i32.store8 offset=4028 + i32.const 0 + i32.const 0 + i32.load8_u offset=1085 + i32.store8 offset=4029 + i32.const 0 + i32.const 0 + i32.load8_u offset=1086 + i32.store8 offset=4030 + i32.const 0 + i32.const 0 + i32.load8_u offset=1087 + i32.store8 offset=4031 + i32.const 0 + i32.const 0 + i32.load8_u offset=1088 + i32.store8 offset=4032 + i32.const 0 + i32.const 0 + i32.load8_u offset=1089 + i32.store8 offset=4033 + i32.const 0 + i32.const 0 + i32.load8_u offset=1090 + i32.store8 offset=4034 + i32.const 0 + i32.const 0 + i32.load8_u offset=1091 + i32.store8 offset=4035 + i32.const 0 + i32.const 0 + i32.load8_u offset=1092 + i32.store8 offset=4036 + i32.const 0 + i32.const 0 + i32.load8_u offset=1093 + i32.store8 offset=4037 + i32.const 0 + i32.const 0 + i32.load8_u offset=1094 + i32.store8 offset=4038 + i32.const 0 + i32.const 0 + i32.load8_u offset=1095 + i32.store8 offset=4039 + i32.const 0 + i32.const 0 + i32.load8_u offset=1096 + i32.store8 offset=4040 + i32.const 0 + i32.const 0 + i32.load8_u offset=1097 + i32.store8 offset=4041 + i32.const 0 + i32.const 0 + i32.load8_u offset=1098 + i32.store8 offset=4042 + i32.const 0 + i32.const 0 + i32.load8_u offset=1099 + i32.store8 offset=4043 + i32.const 0 + i32.const 0 + i32.load8_u offset=1100 + i32.store8 offset=4044 + i32.const 0 + i32.const 0 + i32.load8_u offset=1101 + i32.store8 offset=4045 + i32.const 0 + i32.const 0 + i32.load8_u offset=1102 + i32.store8 offset=4046 + i32.const 0 + i32.const 0 + i32.load8_u offset=1103 + i32.store8 offset=4047 + i32.const 0 + i32.const 0 + i32.load8_u offset=1104 + i32.store8 offset=4048 + i32.const 0 + i32.const 0 + i32.load8_u offset=1105 + i32.store8 offset=4049 + i32.const 0 + i32.const 0 + i32.load8_u offset=1106 + i32.store8 offset=4050 + i32.const 0 + i32.const 0 + i32.load8_u offset=1107 + i32.store8 offset=4051 + i32.const 0 + i32.const 0 + i32.load8_u offset=1108 + i32.store8 offset=4052 + i32.const 0 + i32.const 0 + i32.load8_u offset=1109 + i32.store8 offset=4053 + i32.const 0 + i32.const 0 + i32.load8_u offset=1110 + i32.store8 offset=4054 + i32.const 0 + i32.const 0 + i32.load8_u offset=1111 + i32.store8 offset=4055 + i32.const 0 + i32.const 0 + i32.load8_u offset=1112 + i32.store8 offset=4056 + i32.const 49 + i32.const 49 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load8_u offset=1120 + i32.store8 offset=4064 + i32.const 0 + i32.const 0 + i32.load8_u offset=1121 + i32.store8 offset=4065 + i32.const 0 + i32.const 0 + i32.load8_u offset=1122 + i32.store8 offset=4066 + i32.const 0 + i32.const 0 + i32.load8_u offset=1123 + i32.store8 offset=4067 + i32.const 0 + i32.const 0 + i32.load8_u offset=1124 + i32.store8 offset=4068 + i32.const 0 + i32.const 0 + i32.load8_u offset=1125 + i32.store8 offset=4069 + i32.const 0 + i32.const 0 + i32.load8_u offset=1126 + i32.store8 offset=4070 + i32.const 0 + i32.const 0 + i32.load8_u offset=1127 + i32.store8 offset=4071 + i32.const 0 + i32.const 0 + i32.load8_u offset=1128 + i32.store8 offset=4072 + i32.const 0 + i32.const 0 + i32.load8_u offset=1129 + i32.store8 offset=4073 + i32.const 0 + i32.const 0 + i32.load8_u offset=1130 + i32.store8 offset=4074 + i32.const 0 + i32.const 0 + i32.load8_u offset=1131 + i32.store8 offset=4075 + i32.const 0 + i32.const 0 + i32.load8_u offset=1132 + i32.store8 offset=4076 + i32.const 0 + i32.const 0 + i32.load8_u offset=1133 + i32.store8 offset=4077 + i32.const 0 + i32.const 0 + i32.load8_u offset=1134 + i32.store8 offset=4078 + i32.const 0 + i32.const 0 + i32.load8_u offset=1135 + i32.store8 offset=4079 + i32.const 0 + i32.const 0 + i32.load8_u offset=1136 + i32.store8 offset=4080 + i32.const 0 + i32.const 0 + i32.load8_u offset=1137 + i32.store8 offset=4081 + i32.const 0 + i32.const 0 + i32.load8_u offset=1138 + i32.store8 offset=4082 + i32.const 0 + i32.const 0 + i32.load8_u offset=1139 + i32.store8 offset=4083 + i32.const 0 + i32.const 0 + i32.load8_u offset=1140 + i32.store8 offset=4084 + i32.const 0 + i32.const 0 + i32.load8_u offset=1141 + i32.store8 offset=4085 + i32.const 0 + i32.const 0 + i32.load8_u offset=1142 + i32.store8 offset=4086 + i32.const 0 + i32.const 0 + i32.load8_u offset=1143 + i32.store8 offset=4087 + i32.const 0 + i32.const 0 + i32.load8_u offset=1144 + i32.store8 offset=4088 + i32.const 0 + i32.const 0 + i32.load8_u offset=1145 + i32.store8 offset=4089 + i32.const 0 + i32.const 0 + i32.load8_u offset=1146 + i32.store8 offset=4090 + i32.const 0 + i32.const 0 + i32.load8_u offset=1147 + i32.store8 offset=4091 + i32.const 0 + i32.const 0 + i32.load8_u offset=1148 + i32.store8 offset=4092 + i32.const 0 + i32.const 0 + i32.load8_u offset=1149 + i32.store8 offset=4093 + i32.const 0 + i32.const 0 + i32.load8_u offset=1150 + i32.store8 offset=4094 + i32.const 0 + i32.const 0 + i32.load8_u offset=1151 + i32.store8 offset=4095 + i32.const 0 + i32.const 0 + i32.load8_u offset=1152 + i32.store8 offset=4096 + i32.const 0 + i32.const 0 + i32.load8_u offset=1153 + i32.store8 offset=4097 + i32.const 0 + i32.const 0 + i32.load8_u offset=1154 + i32.store8 offset=4098 + i32.const 0 + i32.const 0 + i32.load8_u offset=1155 + i32.store8 offset=4099 + i32.const 0 + i32.const 0 + i32.load8_u offset=1156 + i32.store8 offset=4100 + i32.const 0 + i32.const 0 + i32.load8_u offset=1157 + i32.store8 offset=4101 + i32.const 0 + i32.const 0 + i32.load8_u offset=1158 + i32.store8 offset=4102 + i32.const 0 + i32.const 0 + i32.load8_u offset=1159 + i32.store8 offset=4103 + i32.const 0 + i32.const 0 + i32.load8_u offset=1160 + i32.store8 offset=4104 + i32.const 0 + i32.const 0 + i32.load8_u offset=1161 + i32.store8 offset=4105 + i32.const 0 + i32.const 0 + i32.load8_u offset=1162 + i32.store8 offset=4106 + i32.const 0 + i32.const 0 + i32.load8_u offset=1163 + i32.store8 offset=4107 + i32.const 0 + i32.const 0 + i32.load8_u offset=1164 + i32.store8 offset=4108 + i32.const 0 + i32.const 0 + i32.load8_u offset=1165 + i32.store8 offset=4109 + i32.const 0 + i32.const 0 + i32.load8_u offset=1166 + i32.store8 offset=4110 + i32.const 0 + i32.const 0 + i32.load8_u offset=1167 + i32.store8 offset=4111 + i32.const 0 + i32.const 0 + i32.load8_u offset=1168 + i32.store8 offset=4112 + i32.const 0 + i64.const 111669149731 + i64.store offset=4116 align=4 + i32.const 0 + i64.const 68719476738 + i64.store offset=4124 align=4 + i32.const 0 + i32.const 0 + i32.load offset=1040 + local.tee 0 + i32.store offset=4132 + i32.const 0 + local.get 0 + i32.store offset=4136) + (func $ndes_des (type 2) (param i32 i32 i32 i32 i32) + (local i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 528 + i32.sub + local.tee 5 + global.set $__stack_pointer + block ;; label = @1 + i32.const 0 + i32.load8_u offset=4348 + br_if 0 (;@1;) + i32.const 0 + i32.const 1 + i32.store offset=4356 + i32.const 0 + i32.const 1 + i32.store8 offset=4348 + i32.const 31 + i32.const 31 + call $__pragma_loopbound + i32.const 0 + i32.const -2147483648 + i32.store offset=4480 + i32.const 0 + i64.const 4611686018964258816 + i64.store offset=4472 + i32.const 0 + i64.const 1152921504741064704 + i64.store offset=4464 + i32.const 0 + i64.const 288230376185266176 + i64.store offset=4456 + i32.const 0 + i64.const 72057594046316544 + i64.store offset=4448 + i32.const 0 + i64.const 18014398511579136 + i64.store offset=4440 + i32.const 0 + i64.const 4503599627894784 + i64.store offset=4432 + i32.const 0 + i64.const 1125899906973696 + i64.store offset=4424 + i32.const 0 + i64.const 281474976743424 + i64.store offset=4416 + i32.const 0 + i64.const 70368744185856 + i64.store offset=4408 + i32.const 0 + i64.const 17592186046464 + i64.store offset=4400 + i32.const 0 + i64.const 4398046511616 + i64.store offset=4392 + i32.const 0 + i64.const 1099511627904 + i64.store offset=4384 + i32.const 0 + i64.const 274877906976 + i64.store offset=4376 + i32.const 0 + i64.const 68719476744 + i64.store offset=4368 + i32.const 0 + i64.const 17179869186 + i64.store offset=4360 + end + block ;; label = @1 + local.get 2 + i32.load + i32.eqz + br_if 0 (;@1;) + local.get 2 + i32.const 0 + i32.store + i32.const 0 + i32.const 0 + i32.store offset=4484 + i32.const 0 + i32.const 0 + i32.store offset=4488 + i32.const 28 + i32.const 28 + call $__pragma_loopbound + i32.const 0 + i32.load offset=4484 + local.set 6 + i32.const 0 + i32.load offset=4488 + local.set 7 + i32.const 0 + local.set 2 + loop ;; label = @2 + local.get 6 + i32.const 1 + i32.shl + local.get 1 + local.get 2 + i32.const 4056 + i32.add + i32.load8_s + local.tee 8 + i32.const 33 + i32.lt_s + i32.const 2 + i32.shl + i32.add + i32.load + local.get 8 + i32.const -32 + i32.add + local.get 8 + local.get 8 + i32.const 32 + i32.gt_s + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + i32.and + i32.const 0 + i32.ne + i32.or + local.set 6 + local.get 7 + i32.const 1 + i32.shl + local.get 1 + local.get 2 + i32.const 4028 + i32.add + i32.load8_s + local.tee 8 + i32.const 33 + i32.lt_s + i32.const 2 + i32.shl + i32.add + i32.load + local.get 8 + i32.const -32 + i32.add + local.get 8 + local.get 8 + i32.const 32 + i32.gt_s + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + i32.and + i32.const 0 + i32.ne + i32.or + local.set 7 + local.get 2 + i32.const 28 + i32.add + local.set 8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 8 + i32.const 1 + i32.gt_u + br_if 0 (;@2;) + end + i32.const 0 + local.get 6 + i32.store offset=4484 + i32.const 0 + local.get 7 + i32.store offset=4488 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 5 + i32.const 512 + i32.add + i32.const 8 + i32.add + local.tee 2 + i32.const 0 + i32.load offset=4164 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4156 align=4 + i64.store offset=512 + i32.const 1 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4164 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4156 align=4 + local.get 2 + i32.const 0 + i32.load offset=4176 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4168 + i64.store offset=512 + i32.const 2 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4176 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4168 + local.get 2 + i32.const 0 + i32.load offset=4188 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4180 align=4 + i64.store offset=512 + i32.const 3 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4188 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4180 align=4 + local.get 2 + i32.const 0 + i32.load offset=4200 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4192 + i64.store offset=512 + i32.const 4 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4200 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4192 + local.get 2 + i32.const 0 + i32.load offset=4212 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4204 align=4 + i64.store offset=512 + i32.const 5 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4212 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4204 align=4 + local.get 2 + i32.const 0 + i32.load offset=4224 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4216 + i64.store offset=512 + i32.const 6 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4224 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4216 + local.get 2 + i32.const 0 + i32.load offset=4236 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4228 align=4 + i64.store offset=512 + i32.const 7 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4236 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4228 align=4 + local.get 2 + i32.const 0 + i32.load offset=4248 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4240 + i64.store offset=512 + i32.const 8 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4248 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4240 + local.get 2 + i32.const 0 + i32.load offset=4260 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4252 align=4 + i64.store offset=512 + i32.const 9 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4260 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4252 align=4 + local.get 2 + i32.const 0 + i32.load offset=4272 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4264 + i64.store offset=512 + i32.const 10 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4272 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4264 + local.get 2 + i32.const 0 + i32.load offset=4284 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4276 align=4 + i64.store offset=512 + i32.const 11 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4284 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4276 align=4 + local.get 2 + i32.const 0 + i32.load offset=4296 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4288 + i64.store offset=512 + i32.const 12 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4296 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4288 + local.get 2 + i32.const 0 + i32.load offset=4308 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4300 align=4 + i64.store offset=512 + i32.const 13 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4308 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4300 align=4 + local.get 2 + i32.const 0 + i32.load offset=4320 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4312 + i64.store offset=512 + i32.const 14 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4320 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4312 + local.get 2 + i32.const 0 + i32.load offset=4332 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4324 align=4 + i64.store offset=512 + i32.const 15 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4332 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4324 align=4 + local.get 2 + i32.const 0 + i32.load offset=4344 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4336 + i64.store offset=512 + i32.const 16 + local.get 5 + i32.const 512 + i32.add + call $ndes_ks + i32.const 0 + local.get 2 + i32.load + i32.store offset=4344 + i32.const 0 + local.get 5 + i64.load offset=512 + i64.store offset=4336 + end + i32.const 32 + i32.const 32 + call $__pragma_loopbound + i32.const 0 + local.set 2 + i32.const 0 + local.set 7 + i32.const 0 + local.set 6 + loop ;; label = @1 + local.get 7 + i32.const 1 + i32.shl + local.get 0 + local.get 2 + i32.const 1216 + i32.add + i32.load8_s + local.tee 8 + i32.const 33 + i32.lt_s + i32.const 2 + i32.shl + i32.add + i32.load + local.get 8 + i32.const -32 + i32.add + local.get 8 + local.get 8 + i32.const 32 + i32.gt_s + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + i32.and + i32.const 0 + i32.ne + i32.or + local.set 7 + local.get 6 + i32.const 1 + i32.shl + local.get 0 + local.get 2 + i32.const 1248 + i32.add + i32.load8_s + local.tee 8 + i32.const 33 + i32.lt_s + i32.const 2 + i32.shl + i32.add + i32.load + local.get 8 + i32.const -32 + i32.add + local.get 8 + local.get 8 + i32.const 32 + i32.gt_s + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + i32.and + i32.const 0 + i32.ne + i32.or + local.set 6 + local.get 2 + i32.const 32 + i32.add + local.set 8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 8 + i32.const 1 + i32.gt_u + br_if 0 (;@1;) + end + i32.const 16 + i32.const 16 + call $__pragma_loopbound + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.const 1 + i32.eq + br_if 0 (;@2;) + local.get 5 + i32.const 496 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4164 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4156 align=4 + i64.store offset=496 + local.get 6 + local.get 5 + i32.const 496 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 480 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4176 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4168 + i64.store offset=480 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 7 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 480 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 464 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4188 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4180 align=4 + i64.store offset=464 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 6 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 464 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 448 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4200 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4192 + i64.store offset=448 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 448 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 432 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4212 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4204 align=4 + i64.store offset=432 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 432 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 416 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4224 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4216 + i64.store offset=416 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 416 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 400 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4236 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4228 align=4 + i64.store offset=400 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 400 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 384 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4248 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4240 + i64.store offset=384 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 384 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 368 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4260 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4252 align=4 + i64.store offset=368 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 368 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 352 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4272 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4264 + i64.store offset=352 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 352 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 336 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4284 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4276 align=4 + i64.store offset=336 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 336 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 320 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4296 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4288 + i64.store offset=320 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 320 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 304 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4308 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4300 align=4 + i64.store offset=304 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 304 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 288 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4320 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4312 + i64.store offset=288 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 288 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 272 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4332 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4324 align=4 + i64.store offset=272 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 272 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 256 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4344 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4336 + i64.store offset=256 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 6 + i32.store offset=524 + local.get 6 + local.get 5 + i32.const 256 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.set 7 + br 1 (;@1;) + end + local.get 5 + i32.const 240 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4344 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4336 + i64.store offset=240 + local.get 6 + local.get 5 + i32.const 240 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 224 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4332 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4324 align=4 + i64.store offset=224 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 7 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 224 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 208 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4320 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4312 + i64.store offset=208 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 6 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 208 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 192 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4308 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4300 align=4 + i64.store offset=192 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 192 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 176 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4296 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4288 + i64.store offset=176 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 176 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 160 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4284 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4276 align=4 + i64.store offset=160 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 160 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 144 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4272 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4264 + i64.store offset=144 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 144 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 128 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4260 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4252 align=4 + i64.store offset=128 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 128 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 112 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4248 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4240 + i64.store offset=112 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 112 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 96 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4236 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4228 align=4 + i64.store offset=96 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 96 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 80 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4224 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4216 + i64.store offset=80 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 80 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 64 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4212 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4204 align=4 + i64.store offset=64 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 64 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 48 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4200 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4192 + i64.store offset=48 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 48 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 32 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4188 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4180 align=4 + i64.store offset=32 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 2 + i32.store offset=524 + local.get 2 + local.get 5 + i32.const 32 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 16 + i32.add + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4176 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4168 + i64.store offset=16 + local.get 5 + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.tee 8 + i32.store offset=524 + local.get 8 + local.get 5 + i32.const 16 + i32.add + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.const 8 + i32.add + i32.const 0 + i32.load offset=4164 + i32.store + local.get 5 + i32.const 0 + i64.load offset=4156 align=4 + i64.store + local.get 5 + local.get 5 + i32.load offset=524 + local.get 2 + i32.xor + local.tee 6 + i32.store offset=524 + local.get 6 + local.get 5 + local.get 5 + i32.const 524 + i32.add + call $ndes_cyfun + local.get 5 + i32.load offset=524 + local.get 8 + i32.xor + local.set 7 + end + local.get 4 + i64.const 0 + i64.store align=4 + i32.const 32 + i32.const 32 + call $__pragma_loopbound + local.get 4 + i32.load + local.set 0 + local.get 4 + i32.load offset=4 + local.set 1 + i32.const 0 + local.set 2 + loop ;; label = @1 + local.get 4 + local.get 1 + i32.const 1 + i32.shl + local.tee 1 + i32.store offset=4 + local.get 2 + i32.const 1296 + i32.add + i32.load8_s + local.tee 8 + i32.const -32 + i32.add + local.get 8 + local.get 8 + i32.const 32 + i32.gt_s + local.tee 3 + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.set 8 + local.get 4 + local.get 0 + i32.const 1 + i32.shl + local.tee 0 + i32.store + local.get 4 + local.get 1 + local.get 8 + local.get 6 + local.get 7 + local.get 3 + select + i32.and + i32.const 0 + i32.ne + i32.or + local.tee 1 + i32.store offset=4 + local.get 4 + local.get 0 + local.get 6 + local.get 7 + local.get 2 + i32.const 1328 + i32.add + i32.load8_s + local.tee 8 + i32.const 32 + i32.gt_s + local.tee 3 + select + local.get 8 + i32.const -32 + i32.add + local.get 8 + local.get 3 + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + i32.and + i32.const 0 + i32.ne + i32.or + local.tee 0 + i32.store + local.get 2 + i32.const 32 + i32.add + local.set 8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 8 + i32.const 1 + i32.gt_u + br_if 0 (;@1;) + end + local.get 5 + i32.const 528 + i32.add + global.set $__stack_pointer) + (func $ndes_ks (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.const 16 + i32.gt_u + br_if 0 (;@2;) + i32.const 1 + local.get 0 + i32.shl + i32.const 66054 + i32.and + i32.eqz + br_if 0 (;@2;) + i32.const 0 + i32.const 0 + i32.load offset=4488 + local.tee 0 + i32.const 28 + i32.shl + i32.const 268435456 + i32.and + local.get 0 + i32.or + i32.const 1 + i32.shr_u + i32.store offset=4488 + i32.const 0 + i32.load offset=4484 + local.tee 0 + i32.const 28 + i32.shl + i32.const 268435456 + i32.and + local.get 0 + i32.or + local.set 0 + br 1 (;@1;) + end + i32.const 2 + i32.const 2 + call $__pragma_loopbound + i32.const 0 + i32.const 0 + i32.load offset=4488 + local.tee 0 + i32.const 28 + i32.shl + i32.const 268435456 + i32.and + local.get 0 + i32.or + i32.const 2 + i32.shr_u + local.get 0 + i32.const 26 + i32.shl + i32.const 134217728 + i32.and + i32.or + i32.store offset=4488 + i32.const 0 + i32.load offset=4484 + local.tee 0 + i32.const 27 + i32.shl + i32.const 268435456 + i32.and + local.get 0 + i32.const 28 + i32.shl + i32.const 268435456 + i32.and + local.get 0 + i32.or + i32.const 1 + i32.shr_u + i32.or + local.set 0 + end + local.get 1 + i32.const 0 + i32.store offset=8 + local.get 1 + i64.const 0 + i64.store align=4 + i32.const 0 + local.get 0 + i32.const 1 + i32.shr_u + i32.store offset=4484 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + i32.const 0 + i32.load offset=4488 + local.set 2 + i32.const 0 + i32.load offset=4484 + local.set 3 + local.get 1 + i32.load + local.set 4 + local.get 1 + i32.load offset=4 + local.set 5 + local.get 1 + i32.load offset=8 + local.set 6 + i32.const 0 + local.set 0 + loop ;; label = @1 + local.get 1 + local.get 6 + i32.const 1 + i32.shl + local.tee 6 + i32.store offset=8 + local.get 0 + i32.const 4080 + i32.add + i32.load8_s + local.tee 7 + i32.const -28 + i32.add + local.get 7 + local.get 7 + i32.const 28 + i32.gt_s + local.tee 8 + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.set 7 + local.get 1 + local.get 5 + i32.const 1 + i32.shl + local.tee 5 + i32.store offset=4 + local.get 1 + local.get 6 + local.get 7 + local.get 3 + local.get 2 + local.get 8 + select + i32.and + i32.const 0 + i32.ne + i32.or + local.tee 6 + i32.store offset=8 + local.get 0 + i32.const 4096 + i32.add + i32.load8_s + local.tee 7 + i32.const -28 + i32.add + local.get 7 + local.get 7 + i32.const 28 + i32.gt_s + local.tee 8 + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.set 7 + local.get 1 + local.get 4 + i32.const 1 + i32.shl + local.tee 4 + i32.store + local.get 1 + local.get 5 + local.get 7 + local.get 3 + local.get 2 + local.get 8 + select + i32.and + i32.const 0 + i32.ne + i32.or + local.tee 5 + i32.store offset=4 + local.get 1 + local.get 4 + local.get 3 + local.get 2 + local.get 0 + i32.const 4112 + i32.add + i32.load8_s + local.tee 7 + i32.const 28 + i32.gt_s + local.tee 8 + select + local.get 7 + i32.const -28 + i32.add + local.get 7 + local.get 8 + select + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + i32.and + i32.const 0 + i32.ne + i32.or + local.tee 4 + i32.store + local.get 0 + i32.const 16 + i32.add + local.set 7 + local.get 0 + i32.const -1 + i32.add + local.set 0 + local.get 7 + i32.const 1 + i32.gt_u + br_if 0 (;@1;) + end) + (func $ndes_cyfun (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32) + global.get $__stack_pointer + i32.const 48 + i32.sub + local.tee 3 + global.set $__stack_pointer + i32.const 0 + local.set 4 + local.get 3 + i32.const 0 + i64.load offset=1032 + i64.store offset=40 + local.get 3 + i32.const 0 + i64.load offset=1024 + i64.store offset=32 + i32.const 16 + i32.const 16 + call $__pragma_loopbound + local.get 3 + i32.const 16 + i32.store offset=16 + i32.const 0 + local.set 5 + i32.const 0 + local.set 6 + block ;; label = @1 + local.get 3 + i32.load offset=16 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 1536 + local.set 7 + i32.const 0 + local.set 6 + i32.const 0 + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @2 + local.get 3 + i32.load offset=16 + i32.const 2 + i32.shl + i32.const 1344 + i32.add + i32.load + local.set 8 + local.get 7 + i32.const -64 + i32.add + i32.load + local.set 9 + local.get 7 + i32.load + local.set 10 + local.get 3 + local.get 3 + i32.load offset=16 + i32.const -1 + i32.add + i32.store offset=16 + local.get 6 + i32.const 1 + i32.shl + local.get 8 + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.get 0 + i32.and + i32.const 0 + i32.ne + i32.or + local.set 6 + local.get 5 + i32.const 1 + i32.shl + local.get 9 + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.get 0 + i32.and + i32.const 0 + i32.ne + i32.or + local.set 5 + local.get 4 + i32.const 1 + i32.shl + local.get 10 + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.get 0 + i32.and + i32.const 0 + i32.ne + i32.or + local.set 4 + local.get 7 + i32.const -4 + i32.add + local.set 7 + local.get 3 + i32.load offset=16 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + end + end + local.get 1 + i32.load + local.set 0 + local.get 1 + i32.load offset=4 + local.set 7 + local.get 1 + i32.load offset=8 + local.set 8 + i32.const 4 + i32.const 4 + call $__pragma_loopbound + local.get 3 + i32.const 1 + i32.store offset=16 + block ;; label = @1 + local.get 3 + i32.load offset=16 + i32.const 4 + i32.gt_s + br_if 0 (;@1;) + local.get 7 + local.get 5 + i32.xor + local.tee 5 + i32.const 16 + i32.shl + local.get 8 + local.get 6 + i32.xor + i32.add + local.set 7 + local.get 0 + local.get 4 + i32.xor + i32.const 8 + i32.shl + local.get 5 + i32.const 8 + i32.shr_u + i32.add + local.set 0 + local.get 3 + i32.const 23 + i32.add + i32.const 5 + i32.add + local.set 4 + loop ;; label = @2 + local.get 3 + i32.const 23 + i32.add + local.get 3 + i32.load offset=16 + i32.add + local.get 7 + i32.const 63 + i32.and + i32.store8 + local.get 4 + local.get 0 + i32.const 63 + i32.and + i32.store8 + local.get 3 + local.get 3 + i32.load offset=16 + i32.const 1 + i32.add + i32.store offset=16 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 0 + i32.const 6 + i32.shr_u + local.set 0 + local.get 7 + i32.const 6 + i32.shr_u + local.set 7 + local.get 3 + i32.load offset=16 + i32.const 5 + i32.lt_s + br_if 0 (;@2;) + end + end + i32.const 8 + i32.const 8 + call $__pragma_loopbound + local.get 3 + i32.const 8 + i32.store offset=12 + i32.const 0 + local.set 7 + block ;; label = @1 + local.get 3 + i32.load offset=12 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + i32.const 0 + local.set 7 + loop ;; label = @2 + local.get 3 + local.get 3 + i32.const 23 + i32.add + local.get 3 + i32.load offset=12 + i32.add + i32.load8_s + i32.store offset=16 + local.get 3 + i32.load offset=16 + local.set 0 + local.get 3 + i32.load offset=16 + local.set 4 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.load offset=16 + i32.const 2 + i32.shl + i32.const 8 + i32.and + local.get 3 + i32.load offset=16 + i32.const 4 + i32.and + i32.or + local.get 3 + i32.load offset=16 + i32.const 2 + i32.shr_u + i32.const 2 + i32.and + i32.or + local.get 3 + i32.load offset=16 + i32.const 4 + i32.shr_u + i32.const 1 + i32.and + i32.or + i32.const 144 + i32.mul + local.get 4 + i32.const 5 + i32.shr_u + i32.const 1 + i32.and + local.get 0 + i32.const 1 + i32.shl + i32.const 2 + i32.and + i32.or + i32.const 36 + i32.mul + i32.add + local.get 3 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + i32.const 1696 + i32.add + i32.load + i32.add + i32.load8_s + local.set 0 + local.get 3 + local.get 3 + i32.load offset=12 + i32.const -1 + i32.add + i32.store offset=12 + local.get 0 + local.get 7 + i32.const 4 + i32.shl + i32.or + local.set 7 + local.get 3 + i32.load offset=12 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + end + end + local.get 2 + i32.const 0 + i32.store + i32.const 32 + i32.const 32 + call $__pragma_loopbound + local.get 3 + i32.const 32 + i32.store offset=16 + local.get 3 + i32.load offset=16 + local.set 4 + local.get 2 + i32.load + local.set 0 + block ;; label = @1 + local.get 4 + i32.const 1 + i32.lt_s + br_if 0 (;@1;) + loop ;; label = @2 + local.get 2 + local.get 0 + i32.const 1 + i32.shl + local.tee 0 + i32.store + local.get 3 + local.get 3 + i32.load offset=16 + i32.const -1 + i32.add + i32.store offset=16 + local.get 3 + i32.load offset=16 + i32.const 0 + i32.gt_s + br_if 0 (;@2;) + end + end + local.get 2 + local.get 0 + local.get 3 + i32.load offset=16 + i32.const 2 + i32.shl + i32.const 1552 + i32.add + i32.load + i32.const 2 + i32.shl + i32.const 4352 + i32.add + i32.load + local.get 7 + i32.and + i32.const 0 + i32.ne + i32.or + i32.store + local.get 3 + i32.const 48 + i32.add + global.set $__stack_pointer) + (func $ndes_main (type 1) + (local i32) + global.get $__stack_pointer + i32.const 16 + i32.sub + local.tee 0 + global.set $__stack_pointer + local.get 0 + i32.const 0 + i64.load offset=4116 align=4 + i64.store offset=8 + local.get 0 + i32.const 0 + i64.load offset=4124 align=4 + i64.store + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 4132 + i32.const 0 + i32.load offset=4136 + i32.const 4492 + call $ndes_des + local.get 0 + i32.const 16 + i32.add + global.set $__stack_pointer) + (func $__original_main (type 4) (result i32) + call $ndes_init + call $ndes_main + i32.const 0 + i32.load offset=4484 + i32.const 0 + i32.load offset=4488 + i32.add + i32.const 8390656 + i32.ne) + (table (;0;) 1 1 funcref) + (memory (;0;) 1) + (global $__stack_pointer (mut i32) (i32.const 8608)) + (global (;1;) i32 (i32.const 4500)) + (global (;2;) i32 (i32.const 8608)) + (export "memory" (memory 0)) + (export "__wasm_apply_data_relocs" (func $__wasm_apply_data_relocs)) + (export "entrypoint" (func $ndes_main)) + (export "main" (func $__original_main)) + (export "__data_end" (global 1)) + (export "__heap_base" (global 2)) + (data $.rodata (i32.const 1024) "\00\08\04\0c\02\0a\06\0e\01\09\05\0d\03\0b\07\0f") + (data $.data (i32.const 1040) "\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0091)!\19\11\09\01:2*\22\1a\12\0a\02;3+#\1b\13\0b\03<4,$?7/'\1f\17\0f\07>6.&\1e\16\0e\06=5-%\1d\15\0d\05\1c\14\0c\04\00\00\00\00\00\00\00\00\0e\11\0b\18\01\05\03\1c\0f\06\15\0a\17\13\0c\04\1a\08\10\07\1b\14\0d\02)4\1f%/7\1e(3-!0,1'8\225.*2$\1d \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00:2*\22\1a\12\0a\02<4,$\1c\14\0c\04>6.&\1e\16\0e\06@80( \18\10\0891)!\19\11\09\01;3+#\1b\13\0b\03=5-%\1d\15\0d\05?7/'\1f\17\0f\07\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00(\080\108\18@ '\07/\0f7\17?\1f&\06.\0e6\16>\1e%\05-\0d5\15=\1d$\04,\0c4\14<\1c#\03+\0b3\13;\1b\22\02*\0a2\12:\1a!\01)\091\119\19\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\09\00\00\00\08\00\00\00\09\00\00\00\0a\00\00\00\0b\00\00\00\0c\00\00\00\0d\00\00\00\0c\00\00\00\0d\00\00\00\0e\00\00\00\0f\00\00\00\10\00\00\00\11\00\00\00\10\00\00\00\11\00\00\00\12\00\00\00\13\00\00\00\14\00\00\00\15\00\00\00\14\00\00\00\15\00\00\00\16\00\00\00\17\00\00\00\18\00\00\00\19\00\00\00\18\00\00\00\19\00\00\00\1a\00\00\00\1b\00\00\00\1c\00\00\00\1d\00\00\00\1c\00\00\00\1d\00\00\00\1e\00\00\00\1f\00\00\00 \00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\10\00\00\00\07\00\00\00\14\00\00\00\15\00\00\00\1d\00\00\00\0c\00\00\00\1c\00\00\00\11\00\00\00\01\00\00\00\0f\00\00\00\17\00\00\00\1a\00\00\00\05\00\00\00\12\00\00\00\1f\00\00\00\0a\00\00\00\02\00\00\00\08\00\00\00\18\00\00\00\0e\00\00\00 \00\00\00\1b\00\00\00\03\00\00\00\09\00\00\00\13\00\00\00\0d\00\00\00\1e\00\00\00\06\00\00\00\16\00\00\00\0b\00\00\00\04\00\00\00\19\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0e\00\00\00\0f\00\00\00\0a\00\00\00\07\00\00\00\02\00\00\00\0c\00\00\00\04\00\00\00\0d\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\0d\00\00\00\0d\00\00\00\0e\00\00\00\0a\00\00\00\0d\00\00\00\01\00\00\00\00\00\00\00\04\00\00\00\00\00\00\00\0d\00\00\00\0a\00\00\00\04\00\00\00\09\00\00\00\01\00\00\00\07\00\00\00\00\00\00\00\0f\00\00\00\0d\00\00\00\01\00\00\00\03\00\00\00\0b\00\00\00\04\00\00\00\06\00\00\00\02\00\00\00\00\00\00\00\04\00\00\00\01\00\00\00\00\00\00\00\0d\00\00\00\0c\00\00\00\01\00\00\00\0b\00\00\00\02\00\00\00\00\00\00\00\0f\00\00\00\0d\00\00\00\07\00\00\00\08\00\00\00\0b\00\00\00\0f\00\00\00\00\00\00\00\0f\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00\06\00\00\00\06\00\00\00\02\00\00\00\0e\00\00\00\04\00\00\00\0b\00\00\00\00\00\00\00\0c\00\00\00\08\00\00\00\0a\00\00\00\0f\00\00\00\08\00\00\00\03\00\00\00\0b\00\00\00\01\00\00\00\00\00\00\00\0d\00\00\00\08\00\00\00\09\00\00\00\0e\00\00\00\04\00\00\00\0a\00\00\00\02\00\00\00\08\00\00\00\00\00\00\00\07\00\00\00\04\00\00\00\00\00\00\00\0b\00\00\00\02\00\00\00\04\00\00\00\0b\00\00\00\0d\00\00\00\00\00\00\00\0e\00\00\00\07\00\00\00\04\00\00\00\09\00\00\00\01\00\00\00\0f\00\00\00\0b\00\00\00\04\00\00\00\00\00\00\00\08\00\00\00\0a\00\00\00\0d\00\00\00\00\00\00\00\0c\00\00\00\02\00\00\00\0d\00\00\00\0e\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00\0e\00\00\00\03\00\00\00\01\00\00\00\0f\00\00\00\0e\00\00\00\04\00\00\00\00\00\00\00\04\00\00\00\07\00\00\00\09\00\00\00\05\00\00\00\0c\00\00\00\02\00\00\00\07\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\0b\00\00\00\09\00\00\00\00\00\00\00\0b\00\00\00\05\00\00\00\0d\00\00\00\01\00\00\00\00\00\00\00\02\00\00\00\01\00\00\00\00\00\00\00\06\00\00\00\07\00\00\00\0c\00\00\00\08\00\00\00\07\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00\06\00\00\00\00\00\00\00\07\00\00\00\09\00\00\00\0f\00\00\00\06\00\00\00\00\00\00\00\0e\00\00\00\0f\00\00\00\03\00\00\00\06\00\00\00\04\00\00\00\07\00\00\00\04\00\00\00\0a\00\00\00\00\00\00\00\0d\00\00\00\0a\00\00\00\08\00\00\00\0c\00\00\00\0a\00\00\00\02\00\00\00\0c\00\00\00\09\00\00\00\00\00\00\00\04\00\00\00\03\00\00\00\06\00\00\00\0a\00\00\00\01\00\00\00\09\00\00\00\01\00\00\00\04\00\00\00\00\00\00\00\0f\00\00\00\0b\00\00\00\03\00\00\00\06\00\00\00\0a\00\00\00\02\00\00\00\00\00\00\00\0f\00\00\00\00\00\00\00\02\00\00\00\02\00\00\00\04\00\00\00\0f\00\00\00\07\00\00\00\0c\00\00\00\09\00\00\00\03\00\00\00\00\00\00\00\06\00\00\00\04\00\00\00\0f\00\00\00\0b\00\00\00\0d\00\00\00\08\00\00\00\03\00\00\00\0c\00\00\00\00\00\00\00\09\00\00\00\0f\00\00\00\09\00\00\00\01\00\00\00\0e\00\00\00\05\00\00\00\04\00\00\00\0a\00\00\00\00\00\00\00\0b\00\00\00\03\00\00\00\0f\00\00\00\09\00\00\00\0b\00\00\00\06\00\00\00\08\00\00\00\0b\00\00\00\00\00\00\00\0d\00\00\00\08\00\00\00\06\00\00\00\00\00\00\00\0d\00\00\00\09\00\00\00\01\00\00\00\07\00\00\00\00\00\00\00\02\00\00\00\0d\00\00\00\03\00\00\00\07\00\00\00\07\00\00\00\0c\00\00\00\07\00\00\00\0e\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\08\00\00\00\0d\00\00\00\02\00\00\00\0f\00\00\00\0a\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\04\00\00\00\05\00\00\00\0a\00\00\00\06\00\00\00\08\00\00\00\0d\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00\0a\00\00\00\03\00\00\00\01\00\00\00\05\00\00\00\0a\00\00\00\04\00\00\00\00\00\00\00\0b\00\00\00\01\00\00\00\00\00\00\00\0d\00\00\00\08\00\00\00\03\00\00\00\0e\00\00\00\02\00\00\00\00\00\00\00\07\00\00\00\02\00\00\00\07\00\00\00\08\00\00\00\0d\00\00\00\0a\00\00\00\07\00\00\00\0d\00\00\00\00\00\00\00\03\00\00\00\09\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00\00\00\00\00\03\00\00\00\0a\00\00\00\00\00\00\00\0a\00\00\00\0c\00\00\00\02\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\0e\00\00\00\0c\00\00\00\00\00\00\00\0f\00\00\00\05\00\00\00\0b\00\00\00\0f\00\00\00\0f\00\00\00\07\00\00\00\0a\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\0b\00\00\00\04\00\00\00\09\00\00\00\06\00\00\00\0b\00\00\00\09\00\00\00\0f\00\00\00\00\00\00\00\0a\00\00\00\07\00\00\00\0d\00\00\00\02\00\00\00\05\00\00\00\0d\00\00\00\0c\00\00\00\09\00\00\00\00\00\00\00\06\00\00\00\00\00\00\00\08\00\00\00\07\00\00\00\00\00\00\00\01\00\00\00\03\00\00\00\05\00\00\00\00\00\00\00\0c\00\00\00\08\00\00\00\01\00\00\00\01\00\00\00\09\00\00\00\00\00\00\00\0f\00\00\00\06\00\00\00\00\00\00\00\0b\00\00\00\06\00\00\00\0f\00\00\00\04\00\00\00\0f\00\00\00\0e\00\00\00\05\00\00\00\0c\00\00\00\00\00\00\00\06\00\00\00\02\00\00\00\0c\00\00\00\08\00\00\00\03\00\00\00\03\00\00\00\09\00\00\00\03\00\00\00\00\00\00\00\0c\00\00\00\01\00\00\00\05\00\00\00\02\00\00\00\0f\00\00\00\0d\00\00\00\05\00\00\00\06\00\00\00\00\00\00\00\09\00\00\00\0c\00\00\00\02\00\00\00\03\00\00\00\0c\00\00\00\04\00\00\00\06\00\00\00\0a\00\00\00\00\00\00\00\03\00\00\00\07\00\00\00\0e\00\00\00\05\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\09\00\00\00\00\00\00\00\0c\00\00\00\0d\00\00\00\07\00\00\00\05\00\00\00\0f\00\00\00\04\00\00\00\07\00\00\00\0e\00\00\00\00\00\00\00\0b\00\00\00\0a\00\00\00\0e\00\00\00\0c\00\00\00\0a\00\00\00\0e\00\00\00\0c\00\00\00\0b\00\00\00\00\00\00\00\07\00\00\00\06\00\00\00\0c\00\00\00\0e\00\00\00\05\00\00\00\0a\00\00\00\08\00\00\00\0d\00\00\00\00\00\00\00\0e\00\00\00\0c\00\00\00\03\00\00\00\0b\00\00\00\09\00\00\00\07\00\00\00\0f\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\0c\00\00\00\0b\00\00\00\0b\00\00\00\0d\00\00\00\0e\00\00\00\05\00\00\00\05\00\00\00\00\00\00\00\09\00\00\00\06\00\00\00\0c\00\00\00\01\00\00\00\03\00\00\00\00\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\09\00\00\00\05\00\00\00\05\00\00\00\06\00\00\00\01\00\00\00\00\00\00\00\0f\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\0b\00\00\00\0c\00\00\00\0a\00\00\00\06\00\00\00\0e\00\00\00\03\00\00\00\00\00\00\00\09\00\00\00\00\00\00\00\04\00\00\00\0c\00\00\00\00\00\00\00\07\00\00\00\0a\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\09\00\00\00\0b\00\00\00\0a\00\00\00\09\00\00\00\0b\00\00\00\0f\00\00\00\0e\00\00\00\00\00\00\00\0a\00\00\00\03\00\00\00\0a\00\00\00\02\00\00\00\03\00\00\00\0d\00\00\00\05\00\00\00\03\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\05\00\00\00\07\00\00\00\04\00\00\00\00\00\00\00\02\00\00\00\05\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\02\00\00\00\04\00\00\00\0e\00\00\00\05\00\00\00\06\00\00\00\0c\00\00\00\00\00\00\00\03\00\00\00\0b\00\00\00\0f\00\00\00\0e\00\00\00\08\00\00\00\03\00\00\00\08\00\00\00\09\00\00\00\00\00\00\00\05\00\00\00\02\00\00\00\0e\00\00\00\08\00\00\00\00\00\00\00\0b\00\00\00\09\00\00\00\05\00\00\00\00\00\00\00\06\00\00\00\0e\00\00\00\02\00\00\00\02\00\00\00\05\00\00\00\08\00\00\00\03\00\00\00\06\00\00\00\00\00\00\00\07\00\00\00\0a\00\00\00\08\00\00\00\0f\00\00\00\09\00\00\00\0b\00\00\00\01\00\00\00\07\00\00\00\00\00\00\00\08\00\00\00\05\00\00\00\01\00\00\00\09\00\00\00\06\00\00\00\08\00\00\00\06\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\0f\00\00\00\07\00\00\00\04\00\00\00\0e\00\00\00\06\00\00\00\02\00\00\00\08\00\00\00\00\00\00\00\0d\00\00\00\09\00\00\00\0c\00\00\00\0e\00\00\00\03\00\00\00\0d\00\00\00\0c\00\00\00\0b\00\00\00")) diff --git a/targets/wasm-tacle/sequential/ndes/generated/modified_sources/default/ndes.c b/targets/wasm-tacle/sequential/ndes/generated/modified_sources/default/ndes.c new file mode 100644 index 0000000..b05e4c8 --- /dev/null +++ b/targets/wasm-tacle/sequential/ndes/generated/modified_sources/default/ndes.c @@ -0,0 +1,369 @@ +/* + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: ndes + + Author: unknown + + Function: A lot of bit manipulation, shifts, array and matrix calculations. + + Source: + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +/* A read from this address will result in an known value of 1 */ +#define KNOWN_VALUE 1 +#define NDES_WORSTCASE 1 +/* + Declaration of global variables +*/ + +// Wasm loop bounds + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +typedef struct NDES_IMMENSE { + unsigned long l, r; +} ndes_immense; +typedef struct NDES_GREAT { + unsigned long l, c, r; +} ndes_great; + +unsigned long ndes_bit[33]; +ndes_immense ndes_inp, ndes_key, ndes_out; +int ndes_newkey, ndes_isw; + +static ndes_immense ndes_icd; +static char ndes_ipc1[57]; +static char ndes_ipc2[49]; + +#ifdef NDES_WORSTCASE +int ndes_value = 1; +#else +int ndes_value = 0; +#endif + +/* Forward funtion prototypes */ + +void ndes_des(ndes_immense inp, ndes_immense key, int *newkey, int isw, + ndes_immense *out); +void ndes_cyfun(unsigned long ir, ndes_great k, unsigned long *iout); +unsigned long ndes_getbit(ndes_immense source, int bitno, int nbits); +void ndes_ks(/*immense key, */ int n, ndes_great *kn); +void ndes_init(void); +int ndes_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ndes_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +/* + Initialization +*/ +void +ndes_init() { + unsigned int i; + static volatile char ndes_ipc1_tmp[57] = { + 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, + 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, + 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, + 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4}; + static volatile char ndes_ipc2_tmp[49] = { + 0, 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, + 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, + 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32}; + __pragma_loopbound(57, 57); + for (i = 0; i < 57; i++) + ndes_ipc1[i] = ndes_ipc1_tmp[i]; + __pragma_loopbound(49, 49); + for (i = 0; i < 49; i++) + ndes_ipc2[i] = ndes_ipc2_tmp[i]; + + ndes_inp.l = KNOWN_VALUE * 35; + ndes_inp.r = KNOWN_VALUE * 26; + ndes_key.l = KNOWN_VALUE * 2; + ndes_key.r = KNOWN_VALUE * 16; + + ndes_newkey = ndes_value; + ndes_isw = ndes_value; +} +/* + Arithmetic functions +*/ +void +ndes_des(ndes_immense inp, ndes_immense key, int *newkey, int isw, + ndes_immense *out) { + static volatile char ip[65] = { + 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, + 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, + 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, + 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7}; + + static volatile char ipm[65] = { + 0, 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, + 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, + 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, + 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25}; + static ndes_great kns[17]; + +#ifdef NDES_WORSTCASE + static int initflag = 1; +#else + static int initflag = 0; +#endif + + int ii, i, j, k; + unsigned long ic, shifter; + ndes_immense itmp; + ndes_great pg; + + if (initflag) { + initflag = 0; + ndes_bit[1] = shifter = 1L; + + __pragma_loopbound(31, 31); + for (j = 2; j <= 32; j++) + ndes_bit[j] = (shifter <<= 1); + } + + if (*newkey) { + *newkey = 0; + ndes_icd.r = ndes_icd.l = 0L; + + __pragma_loopbound(28, 28); + for (j = 28, k = 56; j >= 1; j--, k--) { + ndes_icd.r = (ndes_icd.r << 1) | ndes_getbit(key, ndes_ipc1[j], 32); + ndes_icd.l = ndes_icd.l << 1; + ndes_icd.l = (ndes_icd.l) | ndes_getbit(key, ndes_ipc1[k], 32); + } + + __pragma_loopbound(16, 16); + for (i = 1; i <= 16; i++) { + pg = kns[i]; + ndes_ks(/* key,*/ i, &pg); + kns[i] = pg; + } + } + + itmp.r = itmp.l = 0L; + + __pragma_loopbound(32, 32); + for (j = 32, k = 64; j >= 1; j--, k--) { + itmp.r = itmp.r << 1; + itmp.r = (itmp.r) | ndes_getbit(inp, ip[j], 32); + itmp.l = itmp.l << 1; + itmp.l = (itmp.l) | ndes_getbit(inp, ip[k], 32); + } + __pragma_loopbound(16, 16); + for (i = 1; i <= 16; i++) { + ii = (isw == 1 ? 17 - i : i); + ndes_cyfun(itmp.l, kns[ii], &ic); + ic ^= itmp.r; + itmp.r = itmp.l; + itmp.l = ic; + } + + ic = itmp.r; + itmp.r = itmp.l; + itmp.l = ic; + (*out).r = (*out).l = 0L; + + __pragma_loopbound(32, 32); + for (j = 32, k = 64; j >= 1; j--, k--) { + (*out).r = (*out).r << 1; + (*out).r = ((*out).r) | ndes_getbit(itmp, ipm[j], 32); + (*out).l = (*out).l << 1; + (*out).l = ((*out).l) | ndes_getbit(itmp, ipm[k], 32); + } +} + +void +ndes_cyfun(unsigned long ir, ndes_great k, unsigned long *iout) { + static volatile long iet[49] = { + 0, 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, + 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, + 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1}; + static volatile long ipp[33] = {0, 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, + 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, + 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25}; + static volatile long is[16][4][9] = {{{0, 14, 15, 10, 7, 2, 12, 4, 13}, + {0, 0, 3, 13, 13, 14, 10, 13, 1}, + {0, 4, 0, 13, 10, 4, 9, 1, 7}, + {0, 15, 13, 1, 3, 11, 4, 6, 2}}, + {{0, 4, 1, 0, 13, 12, 1, 11, 2}, + {0, 15, 13, 7, 8, 11, 15, 0, 15}, + {0, 1, 14, 6, 6, 2, 14, 4, 11}, + {0, 12, 8, 10, 15, 8, 3, 11, 1}}, + {{0, 13, 8, 9, 14, 4, 10, 2, 8}, + {0, 7, 4, 0, 11, 2, 4, 11, 13}, + {0, 14, 7, 4, 9, 1, 15, 11, 4}, + {0, 8, 10, 13, 0, 12, 2, 13, 14}}, + {{0, 1, 14, 14, 3, 1, 15, 14, 4}, + {0, 4, 7, 9, 5, 12, 2, 7, 8}, + {0, 8, 11, 9, 0, 11, 5, 13, 1}, + {0, 2, 1, 0, 6, 7, 12, 8, 7}}, + {{0, 2, 6, 6, 0, 7, 9, 15, 6}, + {0, 14, 15, 3, 6, 4, 7, 4, 10}, + {0, 13, 10, 8, 12, 10, 2, 12, 9}, + {0, 4, 3, 6, 10, 1, 9, 1, 4}}, + {{0, 15, 11, 3, 6, 10, 2, 0, 15}, + {0, 2, 2, 4, 15, 7, 12, 9, 3}, + {0, 6, 4, 15, 11, 13, 8, 3, 12}, + {0, 9, 15, 9, 1, 14, 5, 4, 10}}, + {{0, 11, 3, 15, 9, 11, 6, 8, 11}, + {0, 13, 8, 6, 0, 13, 9, 1, 7}, + {0, 2, 13, 3, 7, 7, 12, 7, 14}, + {0, 1, 4, 8, 13, 2, 15, 10, 8}}, + {{0, 8, 4, 5, 10, 6, 8, 13, 1}, + {0, 1, 14, 10, 3, 1, 5, 10, 4}, + {0, 11, 1, 0, 13, 8, 3, 14, 2}, + {0, 7, 2, 7, 8, 13, 10, 7, 13}}, + {{0, 3, 9, 1, 1, 8, 0, 3, 10}, + {0, 10, 12, 2, 4, 5, 6, 14, 12}, + {0, 15, 5, 11, 15, 15, 7, 10, 0}, + {0, 5, 11, 4, 9, 6, 11, 9, 15}}, + {{0, 10, 7, 13, 2, 5, 13, 12, 9}, + {0, 6, 0, 8, 7, 0, 1, 3, 5}, + {0, 12, 8, 1, 1, 9, 0, 15, 6}, + {0, 11, 6, 15, 4, 15, 14, 5, 12}}, + {{0, 6, 2, 12, 8, 3, 3, 9, 3}, + {0, 12, 1, 5, 2, 15, 13, 5, 6}, + {0, 9, 12, 2, 3, 12, 4, 6, 10}, + {0, 3, 7, 14, 5, 0, 1, 0, 9}}, + {{0, 12, 13, 7, 5, 15, 4, 7, 14}, + {0, 11, 10, 14, 12, 10, 14, 12, 11}, + {0, 7, 6, 12, 14, 5, 10, 8, 13}, + {0, 14, 12, 3, 11, 9, 7, 15, 0}}, + {{0, 5, 12, 11, 11, 13, 14, 5, 5}, + {0, 9, 6, 12, 1, 3, 0, 2, 0}, + {0, 3, 9, 5, 5, 6, 1, 0, 15}, + {0, 10, 0, 11, 12, 10, 6, 14, 3}}, + {{0, 9, 0, 4, 12, 0, 7, 10, 0}, + {0, 5, 9, 11, 10, 9, 11, 15, 14}, + {0, 10, 3, 10, 2, 3, 13, 5, 3}, + {0, 0, 5, 5, 7, 4, 0, 2, 5}}, + {{0, 0, 5, 2, 4, 14, 5, 6, 12}, + {0, 3, 11, 15, 14, 8, 3, 8, 9}, + {0, 5, 2, 14, 8, 0, 11, 9, 5}, + {0, 6, 14, 2, 2, 5, 8, 3, 6}}, + {{0, 7, 10, 8, 15, 9, 11, 1, 7}, + {0, 8, 5, 1, 9, 6, 8, 6, 2}, + {0, 0, 15, 7, 4, 14, 6, 2, 8}, + {0, 13, 9, 12, 14, 3, 13, 12, 11}}}; + + volatile char ibin[16] = {0, 8, 4, 12, 2, 10, 6, 14, + 1, 9, 5, 13, 3, 11, 7, 15}; + ndes_great ie; + unsigned long itmp, ietmp1, ietmp2; + char iec[9]; + int irow, icol, iss, l, m; + int volatile j, jj; + unsigned long *p; + + p = ndes_bit; + ie.r = ie.c = ie.l = 0; + + __pragma_loopbound(16, 16); + for (j = 16, l = 32, m = 48; j >= 1; j--, l--, m--) { + ie.r = (ie.r << 1) | (p[iet[j]] & ir ? 1 : 0); + ie.c = (ie.c << 1) | (p[iet[l]] & ir ? 1 : 0); + ie.l = (ie.l << 1) | (p[iet[m]] & ir ? 1 : 0); + } + ie.r ^= k.r; + ie.c ^= k.c; + ie.l ^= k.l; + ietmp1 = ((unsigned long) ie.c << 16) + (unsigned long) ie.r; + ietmp2 = ((unsigned long) ie.l << 8) + ((unsigned long) ie.c >> 8); + + __pragma_loopbound(4, 4); + for (j = 1, m = 5; j <= 4; j++, m++) { + iec[j] = ietmp1 & 0x3fL; + iec[m] = ietmp2 & 0x3fL; + ietmp1 >>= 6; + ietmp2 >>= 6; + } + + itmp = 0L; + + __pragma_loopbound(8, 8); + for (jj = 8; jj >= 1; jj--) { + j = iec[jj]; + irow = ((j & 0x1) << 1) + ((j & 0x20) >> 5); + icol = + ((j & 0x2) << 2) + (j & 0x4) + ((j & 0x8) >> 2) + ((j & 0x10) >> 4); + iss = is[icol][irow][jj]; + itmp = (itmp << 4) | ibin[iss]; + } + + *iout = 0L; + p = ndes_bit; + + __pragma_loopbound(32, 32); + for (j = 32; j >= 1; j--) + *iout = (*iout << 1); + *iout |= (p[ipp[j]] & itmp ? 1 : 0); +} + +unsigned long +ndes_getbit(ndes_immense source, int bitno, int nbits) { + if (bitno <= nbits) + return ndes_bit[bitno] & source.r ? 1L : 0L; + else + return ndes_bit[bitno - nbits] & source.l ? 1L : 0L; +} + +void +ndes_ks(/*ndes_immense key, */ int n, ndes_great *kn) { + int i, j, k, l; + + if (n == 1 || n == 2 || n == 9 || n == 16) { + ndes_icd.r = (ndes_icd.r | ((ndes_icd.r & 1L) << 28)) >> 1; + ndes_icd.l = (ndes_icd.l | ((ndes_icd.l & 1L) << 28)) >> 1; + } else { + __pragma_loopbound(2, 2); + for (i = 1; i <= 2; i++) { + ndes_icd.r = (ndes_icd.r | ((ndes_icd.r & 1L) << 28)) >> 1; + ndes_icd.l = (ndes_icd.l | ((ndes_icd.l & 1L) << 28)) >> 1; + } + } + + (*kn).r = (*kn).c = (*kn).l = 0; + + __pragma_loopbound(16, 16); + for (j = 16, k = 32, l = 48; j >= 1; j--, k--, l--) { + (*kn).r = (*kn).r << 1; + (*kn).r = ((*kn).r) | + (unsigned short) ndes_getbit(ndes_icd, ndes_ipc2[j], 28); + (*kn).c = (*kn).c << 1; + (*kn).c = ((*kn).c) | + (unsigned short) ndes_getbit(ndes_icd, ndes_ipc2[k], 28); + (*kn).l = (*kn).l << 1; + (*kn).l = ((*kn).l) | + (unsigned short) ndes_getbit(ndes_icd, ndes_ipc2[l], 28); + } +} + +int +ndes_return() { + return (ndes_icd.r + ndes_icd.l + (-8390656)) != 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ndes_main() { + ndes_des(ndes_inp, ndes_key, &ndes_newkey, ndes_isw, &ndes_out); +} + +/* main function */ + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + ndes_init(); + ndes_main(); + + return (ndes_return()); +} diff --git a/targets/wasm-tacle/sequential/ndes/generated/modified_sources/inline/ndes.c b/targets/wasm-tacle/sequential/ndes/generated/modified_sources/inline/ndes.c new file mode 100644 index 0000000..e76bd1b --- /dev/null +++ b/targets/wasm-tacle/sequential/ndes/generated/modified_sources/inline/ndes.c @@ -0,0 +1,381 @@ +/* + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: ndes + + Author: unknown + + Function: A lot of bit manipulation, shifts, array and matrix calculations. + + Source: + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +/* A read from this address will result in an known value of 1 */ +#define KNOWN_VALUE 1 +#define NDES_WORSTCASE 1 +/* + Declaration of global variables +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +typedef struct NDES_IMMENSE { + unsigned long l, r; +} ndes_immense; +typedef struct NDES_GREAT { + unsigned long l, c, r; +} ndes_great; + +unsigned long ndes_bit[33]; +ndes_immense ndes_inp, ndes_key, ndes_out; +int ndes_newkey, ndes_isw; + +static ndes_immense ndes_icd; +static char ndes_ipc1[57]; +static char ndes_ipc2[49]; + +#ifdef NDES_WORSTCASE +int ndes_value = 1; +#else +int ndes_value = 0; +#endif + +/* Forward funtion prototypes */ + +__attribute__((always_inline)) static inline void ndes_des(ndes_immense inp, + ndes_immense key, + int *newkey, int isw, + ndes_immense *out); +__attribute__((always_inline)) static inline void +ndes_cyfun(unsigned long ir, ndes_great k, unsigned long *iout); +__attribute__((always_inline)) static inline unsigned long +ndes_getbit(ndes_immense source, int bitno, int nbits); +void ndes_ks(/*immense key, */ int n, ndes_great *kn); +__attribute__((always_inline)) static inline void ndes_init(void); +__attribute__((always_inline)) static inline int ndes_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ndes_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +/* + Initialization +*/ +__attribute__((always_inline)) static inline void +ndes_init() { + unsigned int i; + static volatile char ndes_ipc1_tmp[57] = { + 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, + 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, + 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, + 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4}; + static volatile char ndes_ipc2_tmp[49] = { + 0, 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, + 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, + 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32}; + __pragma_loopbound(57, 57); + for (i = 0; i < 57; i++) + ndes_ipc1[i] = ndes_ipc1_tmp[i]; + __pragma_loopbound(49, 49); + for (i = 0; i < 49; i++) + ndes_ipc2[i] = ndes_ipc2_tmp[i]; + + ndes_inp.l = KNOWN_VALUE * 35; + ndes_inp.r = KNOWN_VALUE * 26; + ndes_key.l = KNOWN_VALUE * 2; + ndes_key.r = KNOWN_VALUE * 16; + + ndes_newkey = ndes_value; + ndes_isw = ndes_value; +} +/* + Arithmetic functions +*/ +__attribute__((always_inline)) static inline void +ndes_des(ndes_immense inp, ndes_immense key, int *newkey, int isw, + ndes_immense *out) { + static volatile char ip[65] = { + 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, + 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, + 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, + 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7}; + + static volatile char ipm[65] = { + 0, 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, + 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, + 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, + 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25}; + static ndes_great kns[17]; + +#ifdef NDES_WORSTCASE + static int initflag = 1; +#else + static int initflag = 0; +#endif + + int ii, i, j, k; + unsigned long ic, shifter; + ndes_immense itmp; + ndes_great pg; + + if (initflag) { + initflag = 0; + ndes_bit[1] = shifter = 1L; + + __pragma_loopbound(31, 31); + for (j = 2; j <= 32; j++) + ndes_bit[j] = (shifter <<= 1); + } + + if (*newkey) { + *newkey = 0; + ndes_icd.r = ndes_icd.l = 0L; + + __pragma_loopbound(28, 28); + for (j = 28, k = 56; j >= 1; j--, k--) { + ndes_icd.r = (ndes_icd.r << 1) | ndes_getbit(key, ndes_ipc1[j], 32); + ndes_icd.l = ndes_icd.l << 1; + ndes_icd.l = (ndes_icd.l) | ndes_getbit(key, ndes_ipc1[k], 32); + } + + __pragma_loopbound(16, 16); + for (i = 1; i <= 16; i++) { + pg = kns[i]; + ndes_ks(/* key,*/ i, &pg); + kns[i] = pg; + } + } + + itmp.r = itmp.l = 0L; + + __pragma_loopbound(32, 32); + for (j = 32, k = 64; j >= 1; j--, k--) { + itmp.r = itmp.r << 1; + itmp.r = (itmp.r) | ndes_getbit(inp, ip[j], 32); + itmp.l = itmp.l << 1; + itmp.l = (itmp.l) | ndes_getbit(inp, ip[k], 32); + } + __pragma_loopbound(16, 16); + for (i = 1; i <= 16; i++) { + ii = (isw == 1 ? 17 - i : i); + ndes_cyfun(itmp.l, kns[ii], &ic); + ic ^= itmp.r; + itmp.r = itmp.l; + itmp.l = ic; + } + + ic = itmp.r; + itmp.r = itmp.l; + itmp.l = ic; + (*out).r = (*out).l = 0L; + + __pragma_loopbound(32, 32); + for (j = 32, k = 64; j >= 1; j--, k--) { + (*out).r = (*out).r << 1; + (*out).r = ((*out).r) | ndes_getbit(itmp, ipm[j], 32); + (*out).l = (*out).l << 1; + (*out).l = ((*out).l) | ndes_getbit(itmp, ipm[k], 32); + } +} + +__attribute__((always_inline)) static inline void +ndes_cyfun(unsigned long ir, ndes_great k, unsigned long *iout) { + static volatile long iet[49] = { + 0, 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, + 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, + 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1}; + static volatile long ipp[33] = {0, 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, + 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, + 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25}; + static volatile long is[16][4][9] = {{{0, 14, 15, 10, 7, 2, 12, 4, 13}, + {0, 0, 3, 13, 13, 14, 10, 13, 1}, + {0, 4, 0, 13, 10, 4, 9, 1, 7}, + {0, 15, 13, 1, 3, 11, 4, 6, 2}}, + {{0, 4, 1, 0, 13, 12, 1, 11, 2}, + {0, 15, 13, 7, 8, 11, 15, 0, 15}, + {0, 1, 14, 6, 6, 2, 14, 4, 11}, + {0, 12, 8, 10, 15, 8, 3, 11, 1}}, + {{0, 13, 8, 9, 14, 4, 10, 2, 8}, + {0, 7, 4, 0, 11, 2, 4, 11, 13}, + {0, 14, 7, 4, 9, 1, 15, 11, 4}, + {0, 8, 10, 13, 0, 12, 2, 13, 14}}, + {{0, 1, 14, 14, 3, 1, 15, 14, 4}, + {0, 4, 7, 9, 5, 12, 2, 7, 8}, + {0, 8, 11, 9, 0, 11, 5, 13, 1}, + {0, 2, 1, 0, 6, 7, 12, 8, 7}}, + {{0, 2, 6, 6, 0, 7, 9, 15, 6}, + {0, 14, 15, 3, 6, 4, 7, 4, 10}, + {0, 13, 10, 8, 12, 10, 2, 12, 9}, + {0, 4, 3, 6, 10, 1, 9, 1, 4}}, + {{0, 15, 11, 3, 6, 10, 2, 0, 15}, + {0, 2, 2, 4, 15, 7, 12, 9, 3}, + {0, 6, 4, 15, 11, 13, 8, 3, 12}, + {0, 9, 15, 9, 1, 14, 5, 4, 10}}, + {{0, 11, 3, 15, 9, 11, 6, 8, 11}, + {0, 13, 8, 6, 0, 13, 9, 1, 7}, + {0, 2, 13, 3, 7, 7, 12, 7, 14}, + {0, 1, 4, 8, 13, 2, 15, 10, 8}}, + {{0, 8, 4, 5, 10, 6, 8, 13, 1}, + {0, 1, 14, 10, 3, 1, 5, 10, 4}, + {0, 11, 1, 0, 13, 8, 3, 14, 2}, + {0, 7, 2, 7, 8, 13, 10, 7, 13}}, + {{0, 3, 9, 1, 1, 8, 0, 3, 10}, + {0, 10, 12, 2, 4, 5, 6, 14, 12}, + {0, 15, 5, 11, 15, 15, 7, 10, 0}, + {0, 5, 11, 4, 9, 6, 11, 9, 15}}, + {{0, 10, 7, 13, 2, 5, 13, 12, 9}, + {0, 6, 0, 8, 7, 0, 1, 3, 5}, + {0, 12, 8, 1, 1, 9, 0, 15, 6}, + {0, 11, 6, 15, 4, 15, 14, 5, 12}}, + {{0, 6, 2, 12, 8, 3, 3, 9, 3}, + {0, 12, 1, 5, 2, 15, 13, 5, 6}, + {0, 9, 12, 2, 3, 12, 4, 6, 10}, + {0, 3, 7, 14, 5, 0, 1, 0, 9}}, + {{0, 12, 13, 7, 5, 15, 4, 7, 14}, + {0, 11, 10, 14, 12, 10, 14, 12, 11}, + {0, 7, 6, 12, 14, 5, 10, 8, 13}, + {0, 14, 12, 3, 11, 9, 7, 15, 0}}, + {{0, 5, 12, 11, 11, 13, 14, 5, 5}, + {0, 9, 6, 12, 1, 3, 0, 2, 0}, + {0, 3, 9, 5, 5, 6, 1, 0, 15}, + {0, 10, 0, 11, 12, 10, 6, 14, 3}}, + {{0, 9, 0, 4, 12, 0, 7, 10, 0}, + {0, 5, 9, 11, 10, 9, 11, 15, 14}, + {0, 10, 3, 10, 2, 3, 13, 5, 3}, + {0, 0, 5, 5, 7, 4, 0, 2, 5}}, + {{0, 0, 5, 2, 4, 14, 5, 6, 12}, + {0, 3, 11, 15, 14, 8, 3, 8, 9}, + {0, 5, 2, 14, 8, 0, 11, 9, 5}, + {0, 6, 14, 2, 2, 5, 8, 3, 6}}, + {{0, 7, 10, 8, 15, 9, 11, 1, 7}, + {0, 8, 5, 1, 9, 6, 8, 6, 2}, + {0, 0, 15, 7, 4, 14, 6, 2, 8}, + {0, 13, 9, 12, 14, 3, 13, 12, 11}}}; + + volatile char ibin[16] = {0, 8, 4, 12, 2, 10, 6, 14, + 1, 9, 5, 13, 3, 11, 7, 15}; + ndes_great ie; + unsigned long itmp, ietmp1, ietmp2; + char iec[9]; + int irow, icol, iss, l, m; + int volatile j, jj; + unsigned long *p; + + p = ndes_bit; + ie.r = ie.c = ie.l = 0; + + __pragma_loopbound(16, 16); + for (j = 16, l = 32, m = 48; j >= 1; j--, l--, m--) { + ie.r = (ie.r << 1) | (p[iet[j]] & ir ? 1 : 0); + ie.c = (ie.c << 1) | (p[iet[l]] & ir ? 1 : 0); + ie.l = (ie.l << 1) | (p[iet[m]] & ir ? 1 : 0); + } + ie.r ^= k.r; + ie.c ^= k.c; + ie.l ^= k.l; + ietmp1 = ((unsigned long) ie.c << 16) + (unsigned long) ie.r; + ietmp2 = ((unsigned long) ie.l << 8) + ((unsigned long) ie.c >> 8); + + __pragma_loopbound(4, 4); + for (j = 1, m = 5; j <= 4; j++, m++) { + iec[j] = ietmp1 & 0x3fL; + iec[m] = ietmp2 & 0x3fL; + ietmp1 >>= 6; + ietmp2 >>= 6; + } + + itmp = 0L; + + __pragma_loopbound(8, 8); + for (jj = 8; jj >= 1; jj--) { + j = iec[jj]; + irow = ((j & 0x1) << 1) + ((j & 0x20) >> 5); + icol = + ((j & 0x2) << 2) + (j & 0x4) + ((j & 0x8) >> 2) + ((j & 0x10) >> 4); + iss = is[icol][irow][jj]; + itmp = (itmp << 4) | ibin[iss]; + } + + *iout = 0L; + p = ndes_bit; + + __pragma_loopbound(32, 32); + for (j = 32; j >= 1; j--) + *iout = (*iout << 1); + *iout |= (p[ipp[j]] & itmp ? 1 : 0); +} + +__attribute__((always_inline)) static inline unsigned long +ndes_getbit(ndes_immense source, int bitno, int nbits) { + if (bitno <= nbits) + return ndes_bit[bitno] & source.r ? 1L : 0L; + else + return ndes_bit[bitno - nbits] & source.l ? 1L : 0L; +} + +void +ndes_ks(/*ndes_immense key, */ int n, ndes_great *kn) { + int i, j, k, l; + + if (n == 1 || n == 2 || n == 9 || n == 16) { + ndes_icd.r = (ndes_icd.r | ((ndes_icd.r & 1L) << 28)) >> 1; + ndes_icd.l = (ndes_icd.l | ((ndes_icd.l & 1L) << 28)) >> 1; + } else { + __pragma_loopbound(2, 2); + for (i = 1; i <= 2; i++) { + ndes_icd.r = (ndes_icd.r | ((ndes_icd.r & 1L) << 28)) >> 1; + ndes_icd.l = (ndes_icd.l | ((ndes_icd.l & 1L) << 28)) >> 1; + } + } + + (*kn).r = (*kn).c = (*kn).l = 0; + + __pragma_loopbound(16, 16); + for (j = 16, k = 32, l = 48; j >= 1; j--, k--, l--) { + (*kn).r = (*kn).r << 1; + (*kn).r = ((*kn).r) | + (unsigned short) ndes_getbit(ndes_icd, ndes_ipc2[j], 28); + (*kn).c = (*kn).c << 1; + (*kn).c = ((*kn).c) | + (unsigned short) ndes_getbit(ndes_icd, ndes_ipc2[k], 28); + (*kn).l = (*kn).l << 1; + (*kn).l = ((*kn).l) | + (unsigned short) ndes_getbit(ndes_icd, ndes_ipc2[l], 28); + } +} + +__attribute__((always_inline)) static inline int +ndes_return() { + return (ndes_icd.r + ndes_icd.l + (-8390656)) != 0; +} + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +ndes_main() { + ndes_des(ndes_inp, ndes_key, &ndes_newkey, ndes_isw, &ndes_out); +} + +/* main function */ + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + ndes_init(); + ndes_main(); + + return (ndes_return()); +} diff --git a/targets/wasm-tacle/sequential/ndes/ndes.c b/targets/wasm-tacle/sequential/ndes/ndes.c new file mode 100755 index 0000000..1e3e7d3 --- /dev/null +++ b/targets/wasm-tacle/sequential/ndes/ndes.c @@ -0,0 +1,390 @@ +/* + This program is part of the TACLeBench benchmark suite. + Version V 1.x + + Name: ndes + + Author: unknown + + Function: A lot of bit manipulation, shifts, array and matrix calculations. + + Source: + + Changes: no major functional changes + + License: May be used, modified, and re-distributed freely. + +*/ + +/* A read from this address will result in an known value of 1 */ +#define KNOWN_VALUE 1 +#define NDES_WORSTCASE 1 +/* + Declaration of global variables +*/ + +typedef struct NDES_IMMENSE { + unsigned long l, r; +} ndes_immense; +typedef struct NDES_GREAT { + unsigned long l, c, r; +} ndes_great; + +unsigned long ndes_bit[ 33 ]; +ndes_immense ndes_inp, ndes_key, ndes_out; +int ndes_newkey, ndes_isw; + +static ndes_immense ndes_icd; +static char ndes_ipc1[ 57 ]; +static char ndes_ipc2[ 49 ]; + + +#ifdef NDES_WORSTCASE +int ndes_value = 1; +#else +int ndes_value = 0; +#endif + +/* Forward funtion prototypes */ + +void ndes_des( ndes_immense inp, ndes_immense key, int *newkey, int isw, + ndes_immense *out ); +void ndes_cyfun( unsigned long ir, ndes_great k, unsigned long *iout ); +unsigned long ndes_getbit( ndes_immense source, int bitno, int nbits ); +void ndes_ks( /*immense key, */int n, ndes_great *kn ); +void ndes_init( void ); +int ndes_return( void ); +void ndes_main( void ); +int main( void ); + +/* + Initialization +*/ +void ndes_init() +{ + unsigned int i; + static volatile char ndes_ipc1_tmp[ 57 ] = { + 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, + 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, + 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 + }; + static volatile char ndes_ipc2_tmp[ 49 ] = { + 0, 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, + 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, + 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, + 53, 46, 42, 50, 36, 29, 32 + }; + _Pragma( "loopbound min 57 max 57" ) + for ( i = 0; i < 57; i++ ) + ndes_ipc1[ i ] = ndes_ipc1_tmp[ i ]; + _Pragma( "loopbound min 49 max 49" ) + for ( i = 0; i < 49; i++ ) + ndes_ipc2[ i ] = ndes_ipc2_tmp[ i ]; + + ndes_inp.l = KNOWN_VALUE * 35; + ndes_inp.r = KNOWN_VALUE * 26; + ndes_key.l = KNOWN_VALUE * 2; + ndes_key.r = KNOWN_VALUE * 16; + + ndes_newkey = ndes_value; + ndes_isw = ndes_value; +} +/* + Arithmetic functions +*/ +void ndes_des( ndes_immense inp, ndes_immense key, int *newkey, int isw, + ndes_immense *out ) +{ + static volatile char ip[ 65 ] = { + 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, + 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, + 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, + 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, + 31, 23, 15, 7 + }; + + static volatile char ipm[ 65 ] = { + 0, 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, + 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, + 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, + 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, + 49, 17, 57, 25 + }; + static ndes_great kns[ 17 ]; + + #ifdef NDES_WORSTCASE + static int initflag = 1; + #else + static int initflag = 0; + #endif + + int ii, i, j, k; + unsigned long ic, shifter; + ndes_immense itmp; + ndes_great pg; + + if ( initflag ) { + initflag = 0; + ndes_bit[ 1 ] = shifter = 1L; + + _Pragma( "loopbound min 31 max 31" ) + for ( j = 2; j <= 32; j++ ) + ndes_bit[ j ] = ( shifter <<= 1 ); + } + + if ( *newkey ) { + *newkey = 0; + ndes_icd.r = ndes_icd.l = 0L; + + _Pragma( "loopbound min 28 max 28" ) + for ( j = 28, k = 56; j >= 1; j--, k-- ) { + ndes_icd.r = ( ndes_icd.r << 1 ) | ndes_getbit( key, ndes_ipc1[ j ], 32 ); + ndes_icd.l = ndes_icd.l << 1; + ndes_icd.l = ( ndes_icd.l ) | ndes_getbit( key, ndes_ipc1[ k ], 32 ); + } + + _Pragma( "loopbound min 16 max 16" ) + for ( i = 1; i <= 16; i++ ) { + pg = kns[ i ]; + ndes_ks( /* key,*/ i, &pg ); + kns[ i ] = pg; + } + } + + itmp.r = itmp.l = 0L; + + _Pragma( "loopbound min 32 max 32" ) + for ( j = 32, k = 64; j >= 1; j--, k-- ) { + itmp.r = itmp.r << 1; + itmp.r = ( itmp.r ) | ndes_getbit( inp, ip[ j ], 32 ); + itmp.l = itmp.l << 1; + itmp.l = ( itmp.l ) | ndes_getbit( inp, ip[ k ], 32 ); + } + _Pragma( "loopbound min 16 max 16" ) + for ( i = 1; i <= 16; i++ ) { + ii = ( isw == 1 ? 17 - i : i ); + ndes_cyfun( itmp.l, kns[ ii ], &ic ); + ic ^= itmp.r; + itmp.r = itmp.l; + itmp.l = ic; + } + + ic = itmp.r; + itmp.r = itmp.l; + itmp.l = ic; + ( *out ).r = ( *out ).l = 0L; + + _Pragma( "loopbound min 32 max 32" ) + for ( j = 32, k = 64; j >= 1; j--, k-- ) { + ( *out ).r = ( *out ).r << 1; + ( *out ).r = ( ( *out ).r ) | ndes_getbit( itmp, ipm[ j ], 32 ); + ( *out ).l = ( *out ).l << 1; + ( *out ).l = ( ( *out ).l ) | ndes_getbit( itmp, ipm[ k ], 32 ); + } +} + + +void ndes_cyfun( unsigned long ir, ndes_great k, unsigned long *iout ) +{ + static volatile long iet[ 49 ] = {0, 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, + 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, + 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, + 28, 29, 30, 31, 32, 1 + }; + static volatile long ipp[ 33 ] = {0, 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, + 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, + 30, 6, 22, 11, 4, 25 + }; + static volatile long is[ 16 ][ 4 ][ 9 ] = {{{ 0, 14, 15, 10, 7, 2, 12, 4, 13 }, + { 0, 0, 3, 13, 13, 14, 10, 13, 1 }, + { 0, 4, 0, 13, 10, 4, 9, 1, 7 }, + { 0, 15, 13, 1, 3, 11, 4, 6, 2 } + }, + { { 0, 4, 1, 0, 13, 12, 1, 11, 2 }, + { 0, 15, 13, 7, 8, 11, 15, 0, 15 }, + { 0, 1, 14, 6, 6, 2, 14, 4, 11 }, + { 0, 12, 8, 10, 15, 8, 3, 11, 1 } + }, + { { 0, 13, 8, 9, 14, 4, 10, 2, 8 }, + { 0, 7, 4, 0, 11, 2, 4, 11, 13 }, + { 0, 14, 7, 4, 9, 1, 15, 11, 4 }, + { 0, 8, 10, 13, 0, 12, 2, 13, 14 } + }, + { { 0, 1, 14, 14, 3, 1, 15, 14, 4 }, + { 0, 4, 7, 9, 5, 12, 2, 7, 8 }, + { 0, 8, 11, 9, 0, 11, 5, 13, 1 }, + { 0, 2, 1, 0, 6, 7, 12, 8, 7 } + }, + { { 0, 2, 6, 6, 0, 7, 9, 15, 6 }, + { 0, 14, 15, 3, 6, 4, 7, 4, 10 }, + { 0, 13, 10, 8, 12, 10, 2, 12, 9 }, + { 0, 4, 3, 6, 10, 1, 9, 1, 4 } + }, + { { 0, 15, 11, 3, 6, 10, 2, 0, 15 }, + { 0, 2, 2, 4, 15, 7, 12, 9, 3 }, + { 0, 6, 4, 15, 11, 13, 8, 3, 12 }, + { 0, 9, 15, 9, 1, 14, 5, 4, 10 } + }, + { { 0, 11, 3, 15, 9, 11, 6, 8, 11 }, + { 0, 13, 8, 6, 0, 13, 9, 1, 7 }, + { 0, 2, 13, 3, 7, 7, 12, 7, 14 }, + { 0, 1, 4, 8, 13, 2, 15, 10, 8 } + }, + { { 0, 8, 4, 5, 10, 6, 8, 13, 1 }, + { 0, 1, 14, 10, 3, 1, 5, 10, 4 }, + { 0, 11, 1, 0, 13, 8, 3, 14, 2 }, + { 0, 7, 2, 7, 8, 13, 10, 7, 13 } + }, + { { 0, 3, 9, 1, 1, 8, 0, 3, 10 }, + { 0, 10, 12, 2, 4, 5, 6, 14, 12 }, + { 0, 15, 5, 11, 15, 15, 7, 10, 0 }, + { 0, 5, 11, 4, 9, 6, 11, 9, 15 } + }, + { { 0, 10, 7, 13, 2, 5, 13, 12, 9 }, + { 0, 6, 0, 8, 7, 0, 1, 3, 5 }, + { 0, 12, 8, 1, 1, 9, 0, 15, 6 }, + { 0, 11, 6, 15, 4, 15, 14, 5, 12 } + }, + { { 0, 6, 2, 12, 8, 3, 3, 9, 3 }, + { 0, 12, 1, 5, 2, 15, 13, 5, 6 }, + { 0, 9, 12, 2, 3, 12, 4, 6, 10 }, + { 0, 3, 7, 14, 5, 0, 1, 0, 9 } + }, + { { 0, 12, 13, 7, 5, 15, 4, 7, 14 }, + { 0, 11, 10, 14, 12, 10, 14, 12, 11 }, + { 0, 7, 6, 12, 14, 5, 10, 8, 13 }, + { 0, 14, 12, 3, 11, 9, 7, 15, 0 } + }, + { { 0, 5, 12, 11, 11, 13, 14, 5, 5 }, + { 0, 9, 6, 12, 1, 3, 0, 2, 0 }, + { 0, 3, 9, 5, 5, 6, 1, 0, 15 }, + { 0, 10, 0, 11, 12, 10, 6, 14, 3 } + }, + { { 0, 9, 0, 4, 12, 0, 7, 10, 0 }, + { 0, 5, 9, 11, 10, 9, 11, 15, 14 }, + { 0, 10, 3, 10, 2, 3, 13, 5, 3 }, + { 0, 0, 5, 5, 7, 4, 0, 2, 5 } + }, + { { 0, 0, 5, 2, 4, 14, 5, 6, 12 }, + { 0, 3, 11, 15, 14, 8, 3, 8, 9 }, + { 0, 5, 2, 14, 8, 0, 11, 9, 5 }, + { 0, 6, 14, 2, 2, 5, 8, 3, 6 } + }, + { { 0, 7, 10, 8, 15, 9, 11, 1, 7 }, + { 0, 8, 5, 1, 9, 6, 8, 6, 2 }, + { 0, 0, 15, 7, 4, 14, 6, 2, 8 }, + { 0, 13, 9, 12, 14, 3, 13, 12, 11 } + } + }; + + volatile char ibin[ 16 ] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}; + ndes_great ie; + unsigned long itmp, ietmp1, ietmp2; + char iec[ 9 ]; + int irow, icol, iss, l, m; + int volatile j, jj; + unsigned long *p; + + p = ndes_bit; + ie.r = ie.c = ie.l = 0; + + _Pragma( "loopbound min 16 max 16" ) + for ( j = 16, l = 32, m = 48; j >= 1; j--, l--, m-- ) { + ie.r = ( ie.r << 1 ) | ( p[ iet[ j ] ] & ir ? 1 : 0 ); + ie.c = ( ie.c << 1 ) | ( p[ iet[ l ] ] & ir ? 1 : 0 ); + ie.l = ( ie.l << 1 ) | ( p[ iet[ m ] ] & ir ? 1 : 0 ); + } + ie.r ^= k.r; + ie.c ^= k.c; + ie.l ^= k.l; + ietmp1 = ( ( unsigned long ) ie.c << 16 ) + ( unsigned long ) ie.r; + ietmp2 = ( ( unsigned long ) ie.l << 8 ) + ( ( unsigned long ) ie.c >> 8 ); + + _Pragma( "loopbound min 4 max 4" ) + for ( j = 1, m = 5; j <= 4; j++, m++ ) { + iec[ j ] = ietmp1 & 0x3fL; + iec[ m ] = ietmp2 & 0x3fL; + ietmp1 >>= 6; + ietmp2 >>= 6; + } + + itmp = 0L; + + _Pragma( "loopbound min 8 max 8" ) + for ( jj = 8; jj >= 1; jj-- ) { + j = iec[ jj ]; + irow = ( ( j & 0x1 ) << 1 ) + ( ( j & 0x20 ) >> 5 ); + icol = ( ( j & 0x2 ) << 2 ) + ( j & 0x4 ) + + ( ( j & 0x8 ) >> 2 ) + ( ( j & 0x10 ) >> 4 ); + iss = is[ icol ][ irow ][ jj ]; + itmp = ( itmp << 4 ) | ibin[ iss ]; + } + + *iout = 0L; + p = ndes_bit; + + _Pragma( "loopbound min 32 max 32" ) + for ( j = 32; j >= 1; j-- ) + *iout = ( *iout << 1 ); + *iout |= ( p[ ipp[ j ] ] & itmp ? 1 : 0 ); +} + +unsigned long ndes_getbit( ndes_immense source, int bitno, int nbits ) +{ + if ( bitno <= nbits ) + return ndes_bit[ bitno ] & source.r ? 1L : 0L; + else + return ndes_bit[ bitno - nbits ] & source.l ? 1L : 0L; +} + +void ndes_ks( /*ndes_immense key, */int n, ndes_great *kn ) +{ + int i, j, k, l; + + if ( n == 1 || n == 2 || n == 9 || n == 16 ) { + ndes_icd.r = ( ndes_icd.r | ( ( ndes_icd.r & 1L ) << 28 ) ) >> 1; + ndes_icd.l = ( ndes_icd.l | ( ( ndes_icd.l & 1L ) << 28 ) ) >> 1; + } else { + _Pragma( "loopbound min 2 max 2" ) + for ( i = 1; i <= 2; i++ ) { + ndes_icd.r = ( ndes_icd.r | ( ( ndes_icd.r & 1L ) << 28 ) ) >> 1; + ndes_icd.l = ( ndes_icd.l | ( ( ndes_icd.l & 1L ) << 28 ) ) >> 1; + } + } + + ( *kn ).r = ( *kn ).c = ( *kn ).l = 0; + + _Pragma( "loopbound min 16 max 16" ) + for ( j = 16, k = 32, l = 48; j >= 1; j--, k--, l-- ) { + ( *kn ).r = ( *kn ).r << 1; + ( *kn ).r = ( ( *kn ).r ) | ( unsigned short ) + ndes_getbit( ndes_icd, ndes_ipc2[ j ], 28 ); + ( *kn ).c = ( *kn ).c << 1; + ( *kn ).c = ( ( *kn ).c ) | ( unsigned short ) + ndes_getbit( ndes_icd, ndes_ipc2[ k ], 28 ); + ( *kn ).l = ( *kn ).l << 1; + ( *kn ).l = ( ( *kn ).l ) | ( unsigned short ) + ndes_getbit( ndes_icd, ndes_ipc2[ l ], 28 ); + } +} + +int ndes_return() +{ + return ( ndes_icd.r + ndes_icd.l + ( -8390656 ) ) != 0 ; +} + +void _Pragma( "entrypoint" ) ndes_main() +{ + ndes_des( ndes_inp, ndes_key, &ndes_newkey, ndes_isw, &ndes_out ); +} + +/* main function */ + +int main( void ) +{ + ndes_init(); + ndes_main(); + + return ( ndes_return() ); +} diff --git a/targets/wasm-tacle/sequential/petrinet/CMakeLists.txt b/targets/wasm-tacle/sequential/petrinet/CMakeLists.txt new file mode 100644 index 0000000..7e8d823 --- /dev/null +++ b/targets/wasm-tacle/sequential/petrinet/CMakeLists.txt @@ -0,0 +1,25 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(petrinet) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/petrinet.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/petrinet.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/petrinet/ChangeLog.txt b/targets/wasm-tacle/sequential/petrinet/ChangeLog.txt new file mode 100755 index 0000000..3a02ec7 --- /dev/null +++ b/targets/wasm-tacle/sequential/petrinet/ChangeLog.txt @@ -0,0 +1,63 @@ +File: petrinet.c +Original provenience: Mälardalen benchmark suite, +http://www.mrtc.mdh.se/projects/wcet/wcet_bench/nsichneu/nsichneu.c + +2016-02-02: +- Added generic TACLeBench header. +- Removed old file header (keep some information in TACLeBench + header). +- Renamed global variables: + - main_iters_dummy_i -> petrinet_main_iters_dummy_i + - main_min_dummy_i -> petrinet_main_min_dummy_i + - main_max_dummy_i -> petrinet_main_max_dummy_i + - P1_is_marked -> petrinet_P1_is_marked + - P1_marking_member_0 -> petrinet_P1_marking_member_0 + - P2_is_marked -> petrinet_P2_is_marked + - P2_marking_member_0 -> petrinet_P2_marking_member_0 + - P3_is_marked -> petrinet_P3_is_marked + - P3_marking_member_0 -> petrinet_P3_marking_member_0 +- Renamed main function to petrinet_main, set as entrypoint. +- Implemented new function main according to TACLeBench guidelines. +- Implemented function petrinet_return, calculates checksum over + petrinet_P3_marking_member_0. +- Applied code formatting according to the following rules + - Lines shall not be wider than 80 characters; whenever possible, appropriate + line breaks shall be inserted to keep lines below 80 characters + - Indentation is done using whitespaces only, no tabs. Code is indented by + two whitespaces + - Two empty lines are put between any two functions + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - In comma- or colon-separated argument lists, one whitespace is put after + each comma/colon + - Names of functions and global variables all start with a benchmark-specific + prefix (here: bs_) followed by lowercase letter (e.g., bs_square) + - For pointer types, one whitespace is put before the '*' + - Operators within expressions shall be preceded and followed by one + whitespace + - Code of then- and else-parts of if-then-else statements shall be put in + separate lines, not in the same lines as the if-condition or the keyword + "else" + - Opening braces '{' denoting the beginning of code for some if-else or loop + body shall be put at the end of the same line where the keywords "if", + "else", "for", "while" etc. occur + - In non-empty lists or index expressions, opening '(' and '[' are followed by + one whitespace, closing ')' and ']' are preceded by one whitespace + - Operators within expressions shall be preceded and followed by one + whitespace + +2016-04-05: +- Return '0' on success + +2016-04-06: +- Fixed generation of return value + +2016-06-01: +- Changed all prefixes to lower-case + +2016-06-08: +- Prefix +- removed return from petrinet_main + +2016-06-13: +- introduced function petrinet_init diff --git a/targets/wasm-tacle/sequential/petrinet/generated/default/petrinet.wasm b/targets/wasm-tacle/sequential/petrinet/generated/default/petrinet.wasm new file mode 100755 index 0000000000000000000000000000000000000000..1af186a894423466cbad03e3eb03d28f42845dd9 GIT binary patch literal 6234 zcmdUzJ&)5!7{}+u$!6mXL5qZtXeL|jDawjP2t>zJa0i0ssE0{1gzP%D<(E5xKt`u4 zwxGE3N{}chD6Y7Il7fQb3JN{|-+-@x=dqa`CEmL$kg%=Q>Y4vzkLTyV=W+BP880x( zkA7#m^ydEI-UaL+2O->}_ehqZdno_I899qPLWGf=E##&b1mQSH{V77!p%@dVg+q*S zi(-V^XK04`r(HKg{9{M|&*P1s+wFx~1ksY9b3*)@-&M#k^p;{O6DcC)1(O)zuJV&; z83uDdLBv_exsPa96z3>^O0g@%10_Q-ma(Fw`{#%f8JUDI2|B*ja=hs zmpnZJ;YJVX(eK6Rr(*OBM!Ecl4z3sCk&bt;J{$5ojFvZ}u-&u8QiQr7D7`C*;ze-psM%~ID1AYW?&c-)%6_Mmw1;6Y(WBRqhm zmL6CH4e|h1T@n<_Ziol4aQzn99#{m09pC#cdZYI|cPeYqJILh(?{!dmV8nkc@vV*r zU<~AU2*bC&mZ;(ukMj~zMBku9<VJXR33e9axJWH90hjx_NtXS1~g5d9d|aMcQYWo#aqXx0`q{HFW{r;_o9I-9tvM$?X9k#*Rti>Eg z8DS{zkyyv!_46)z?F$h^ z^V!^&9ta!T80A`=$jPCA#<_~n)y*&prs+gQG2Y6+U%9lax(7>Cd+J zukP*dU17TyFQgz}`T_mePh>PxiMX$1l13_ahTTQ#CG%gTm#SfZktTBNsnN^}#?p(2 Z{Yc$ck@6>Mlq^FP4?FRE=8x3F +#endif + +#ifdef PROFILING +/* Profiling variables. Remove for actual WCET analyses. */ +int petrinet_main_iters_dummy_i = 0, petrinet_main_min_dummy_i = 100000, + petrinet_main_max_dummy_i = 0; +#endif + +/* + Forward declaration of functions +*/ +void petrinet_init(void); +int petrinet_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +petrinet_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) int main(void); + +volatile int petrinet_P1_is_marked; +volatile long petrinet_P1_marking_member_0[3]; +volatile int petrinet_P2_is_marked; +volatile long petrinet_P2_marking_member_0[5]; +volatile int petrinet_P3_is_marked; +volatile long petrinet_P3_marking_member_0[6]; + +const long petrinet_CHECKSUM = 0; + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +petrinet_main(void) { + int dummy_i; + /* dummy_i = 17; Takes too much time */ + dummy_i = 2; + +#ifdef PROFILING + main_iters_dummy_i = 0; +#endif + __pragma_loopbound(2, 2); + while (dummy_i > 0) { +#ifdef PROFILING + main_iters_dummy_i++; +#endif + + dummy_i--; + /* Permutation for Place P1 : 0, 1, 2 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[1] == + petrinet_P1_marking_member_0[2])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[0]; + y = petrinet_P1_marking_member_0[1]; + + /* Transition condition */ + if (x < y) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 0, 2, 1 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[2] == + petrinet_P1_marking_member_0[1])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[0]; + y = petrinet_P1_marking_member_0[2]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 1, 0, 2 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[0] == + petrinet_P1_marking_member_0[2])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[1]; + y = petrinet_P1_marking_member_0[0]; + + /* Transition condition */ + if (x < y) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 1, 2, 0 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[2] == + petrinet_P1_marking_member_0[0])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[1]; + y = petrinet_P1_marking_member_0[2]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 2, 0, 1 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[0] == + petrinet_P1_marking_member_0[1])) { + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[2]; + y = petrinet_P1_marking_member_0[0]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 2, 1, 0 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[1] == + petrinet_P1_marking_member_0[0])) { + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[2]; + y = petrinet_P1_marking_member_0[1]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place P2 : 0, 1, 2, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + (((petrinet_P3_is_marked + 3) <= 6)) && + (((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[2])) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3])))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 1, 3, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + (((petrinet_P3_is_marked + 3) <= 6)) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 2, 1, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 2, 3, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 3, 1, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 3, 2, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 0, 2, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 0, 3, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 2, 0, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 2, 3, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 3, 0, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 3, 2, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 0, 1, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 0, 3, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 1, 0, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 1, 3, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 3, 0, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 3, 1, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 3, 0, 1, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[3]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 3, 0, 2, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]))) { + + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[3]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + } +#ifdef PROFILING + if (main_iters_dummy_i < main_min_dummy_i) + main_min_dummy_i = main_iters_dummy_i; + if (main_iters_dummy_i > main_max_dummy_i) + main_max_dummy_i = main_iters_dummy_i; +#endif + +#ifdef PROFILING + printf("main::dummy_i-loop: [%d, %d]\n", main_min_dummy_i, + main_max_dummy_i); +#endif + + // dummy_i = 77; + // TODO: not a good return value + // return dummy_i; +} + +void +petrinet_init(void) { + petrinet_P1_is_marked = 3; + petrinet_P2_is_marked = 5; + petrinet_P3_is_marked = 0; + + /* + Maybe we should also initialise these arrays, as they may be read + in the petrinet_main() function before being written. + */ + /* + volatile long petrinet_P1_marking_member_0[ 3 ]; + volatile long petrinet_P2_marking_member_0[ 5 ]; + volatile long petrinet_P3_marking_member_0[ 6 ]; + */ +} + +int +petrinet_return(void) { + // TODO: use something from the Px_... arrays + int checksum = 0; + int i; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; ++i) + checksum += petrinet_P1_marking_member_0[i]; + + __pragma_loopbound(5, 5); + for (i = 0; i < 5; ++i) + checksum += petrinet_P2_marking_member_0[i]; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; ++i) + checksum += petrinet_P3_marking_member_0[i]; + + return ((checksum == petrinet_CHECKSUM) ? 0 : -1); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + petrinet_main(); + + return (petrinet_return()); +} diff --git a/targets/wasm-tacle/sequential/petrinet/generated/modified_sources/inline/petrinet.c b/targets/wasm-tacle/sequential/petrinet/generated/modified_sources/inline/petrinet.c new file mode 100644 index 0000000..582b79c --- /dev/null +++ b/targets/wasm-tacle/sequential/petrinet/generated/modified_sources/inline/petrinet.c @@ -0,0 +1,981 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: Petrinet + + Author: Friedhelm Stappert, C-LAB, Paderborn, Germany + + Function: Simulate an extended Petri Net + Automatically generated code containing large amounts of + if-statements (more than 250) + + Source: Mälardalen benchmark suite + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* Remove the following #define for actual WCET analyses! */ +/* + #define PROFILING +*/ + +// Wasm loop bounds + + + + +__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void +__pragma_loopbound(unsigned int min_bound, unsigned int max_bound); + +#ifdef PROFILING +#include +#endif + +#ifdef PROFILING +/* Profiling variables. Remove for actual WCET analyses. */ +int petrinet_main_iters_dummy_i = 0, petrinet_main_min_dummy_i = 100000, + petrinet_main_max_dummy_i = 0; +#endif + +/* + Forward declaration of functions +*/ +__attribute__((always_inline)) static inline void petrinet_init(void); +__attribute__((always_inline)) static inline int petrinet_return(void); +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +petrinet_main(void); +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void); + +volatile int petrinet_P1_is_marked; +volatile long petrinet_P1_marking_member_0[3]; +volatile int petrinet_P2_is_marked; +volatile long petrinet_P2_marking_member_0[5]; +volatile int petrinet_P3_is_marked; +volatile long petrinet_P3_marking_member_0[6]; + +const long petrinet_CHECKSUM = 0; + +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) +__attribute__((noinline)) __attribute__((export_name("entrypoint"))) void +petrinet_main(void) { + int dummy_i; + /* dummy_i = 17; Takes too much time */ + dummy_i = 2; + +#ifdef PROFILING + main_iters_dummy_i = 0; +#endif + __pragma_loopbound(2, 2); + while (dummy_i > 0) { +#ifdef PROFILING + main_iters_dummy_i++; +#endif + + dummy_i--; + /* Permutation for Place P1 : 0, 1, 2 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[1] == + petrinet_P1_marking_member_0[2])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[0]; + y = petrinet_P1_marking_member_0[1]; + + /* Transition condition */ + if (x < y) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 0, 2, 1 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[2] == + petrinet_P1_marking_member_0[1])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[0]; + y = petrinet_P1_marking_member_0[2]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 1, 0, 2 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[0] == + petrinet_P1_marking_member_0[2])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[1]; + y = petrinet_P1_marking_member_0[0]; + + /* Transition condition */ + if (x < y) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 1, 2, 0 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[2] == + petrinet_P1_marking_member_0[0])) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[1]; + y = petrinet_P1_marking_member_0[2]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 2, 0, 1 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[0] == + petrinet_P1_marking_member_0[1])) { + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[2]; + y = petrinet_P1_marking_member_0[0]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 2, 1, 0 */ + /* Transition T1 */ + if ((petrinet_P1_is_marked >= 3) && (petrinet_P3_is_marked + 3 <= 6) && + (petrinet_P1_marking_member_0[1] == + petrinet_P1_marking_member_0[0])) { + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[2]; + y = petrinet_P1_marking_member_0[1]; + + /* Transition condition */ + if ((x < y)) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = x; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = y; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place P2 : 0, 1, 2, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + (((petrinet_P3_is_marked + 3) <= 6)) && + (((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[2])) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3])))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 1, 3, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + (((petrinet_P3_is_marked + 3) <= 6)) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 2, 1, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 2, 3, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 3, 1, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 3, 2, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[0]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 0, 2, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 0, 3, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 2, 0, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 2, 3, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[2] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[2]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 3, 0, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 3, 2, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[1]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 0, 1, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 0, 3, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 1, 0, 3 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 1, 3, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[3]) && + (petrinet_P2_marking_member_0[1] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[1]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 3, 0, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 3, 1, 0 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[3] == + petrinet_P2_marking_member_0[0]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[2]; + b = petrinet_P2_marking_member_0[3]; + + /* Transition condition */ + if ((b > a)) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 3, 0, 1, 2 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]))) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[3]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 3, 0, 2, 1 */ + /* Transition T2 */ + if ((petrinet_P2_is_marked >= 4) && + ((petrinet_P3_is_marked + 3) <= 6) && + ((petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[2]) && + (petrinet_P2_marking_member_0[0] == + petrinet_P2_marking_member_0[1]))) { + + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[3]; + b = petrinet_P2_marking_member_0[0]; + + /* Transition condition */ + if ((b > a)) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 0] = a; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 1] = b; + petrinet_P3_marking_member_0[petrinet_P3_is_marked + 2] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + } +#ifdef PROFILING + if (main_iters_dummy_i < main_min_dummy_i) + main_min_dummy_i = main_iters_dummy_i; + if (main_iters_dummy_i > main_max_dummy_i) + main_max_dummy_i = main_iters_dummy_i; +#endif + +#ifdef PROFILING + printf("main::dummy_i-loop: [%d, %d]\n", main_min_dummy_i, + main_max_dummy_i); +#endif + + // dummy_i = 77; + // TODO: not a good return value + // return dummy_i; +} + +__attribute__((always_inline)) static inline void +petrinet_init(void) { + petrinet_P1_is_marked = 3; + petrinet_P2_is_marked = 5; + petrinet_P3_is_marked = 0; + + /* + Maybe we should also initialise these arrays, as they may be read + in the petrinet_main() function before being written. + */ + /* + volatile long petrinet_P1_marking_member_0[ 3 ]; + volatile long petrinet_P2_marking_member_0[ 5 ]; + volatile long petrinet_P3_marking_member_0[ 6 ]; + */ +} + +__attribute__((always_inline)) static inline int +petrinet_return(void) { + // TODO: use something from the Px_... arrays + int checksum = 0; + int i; + + __pragma_loopbound(3, 3); + for (i = 0; i < 3; ++i) + checksum += petrinet_P1_marking_member_0[i]; + + __pragma_loopbound(5, 5); + for (i = 0; i < 5; ++i) + checksum += petrinet_P2_marking_member_0[i]; + + __pragma_loopbound(6, 6); + for (i = 0; i < 6; ++i) + checksum += petrinet_P3_marking_member_0[i]; + + return ((checksum == petrinet_CHECKSUM) ? 0 : -1); +} + +__attribute__((noinline)) __attribute__((export_name("main"))) +__attribute__((noinline)) __attribute__((export_name("main"))) int +main(void) { + petrinet_main(); + + return (petrinet_return()); +} diff --git a/targets/wasm-tacle/sequential/petrinet/petrinet.c b/targets/wasm-tacle/sequential/petrinet/petrinet.c new file mode 100755 index 0000000..99b0cda --- /dev/null +++ b/targets/wasm-tacle/sequential/petrinet/petrinet.c @@ -0,0 +1,982 @@ +/* + + This program is part of the TACLeBench benchmark suite. + Version V 2.0 + + Name: Petrinet + + Author: Friedhelm Stappert, C-LAB, Paderborn, Germany + + Function: Simulate an extended Petri Net + Automatically generated code containing large amounts of + if-statements (more than 250) + + Source: Mälardalen benchmark suite + + Changes: no major functional changes + + License: may be used, modified, and re-distributed freely + +*/ + +/* Remove the following #define for actual WCET analyses! */ +/* + #define PROFILING +*/ + +#ifdef PROFILING +#include +#endif + +#ifdef PROFILING +/* Profiling variables. Remove for actual WCET analyses. */ +int petrinet_main_iters_dummy_i = 0, + petrinet_main_min_dummy_i = 100000, + petrinet_main_max_dummy_i = 0; +#endif + +/* + Forward declaration of functions +*/ +void petrinet_init( void ); +int petrinet_return( void ); +void petrinet_main( void ); +int main( void ); + + +volatile int petrinet_P1_is_marked; +volatile long petrinet_P1_marking_member_0[ 3 ]; +volatile int petrinet_P2_is_marked; +volatile long petrinet_P2_marking_member_0[ 5 ]; +volatile int petrinet_P3_is_marked; +volatile long petrinet_P3_marking_member_0[ 6 ]; + +const long petrinet_CHECKSUM = 0; + +void _Pragma ( "entrypoint" ) petrinet_main( void ) +{ + int dummy_i; + /* dummy_i = 17; Takes too much time */ + dummy_i = 2; + + #ifdef PROFILING + main_iters_dummy_i = 0; + #endif + _Pragma( "loopbound min 2 max 2" ) + while ( dummy_i > 0 ) { + #ifdef PROFILING + main_iters_dummy_i++; + #endif + + dummy_i--; + /* Permutation for Place P1 : 0, 1, 2 */ + /* Transition T1 */ + if ( ( petrinet_P1_is_marked >= 3 ) && + ( petrinet_P3_is_marked + 3 <= 6 ) && + ( petrinet_P1_marking_member_0[ 1 ] + == petrinet_P1_marking_member_0[ 2 ] ) ) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[ 0 ]; + y = petrinet_P1_marking_member_0[ 1 ]; + + /* Transition condition */ + if ( x < y ) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = x; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = y; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 0, 2, 1 */ + /* Transition T1 */ + if ( ( petrinet_P1_is_marked >= 3 ) && + ( petrinet_P3_is_marked + 3 <= 6 ) && + ( petrinet_P1_marking_member_0[ 2 ] + == petrinet_P1_marking_member_0[ 1 ] ) ) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[ 0 ]; + y = petrinet_P1_marking_member_0[ 2 ]; + + /* Transition condition */ + if ( ( x < y ) ) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = x; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = y; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 1, 0, 2 */ + /* Transition T1 */ + if ( ( petrinet_P1_is_marked >= 3 ) && + ( petrinet_P3_is_marked + 3 <= 6 ) && + ( petrinet_P1_marking_member_0[ 0 ] + == petrinet_P1_marking_member_0[ 2 ] ) ) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[ 1 ]; + y = petrinet_P1_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( x < y ) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = x; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = y; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 1, 2, 0 */ + /* Transition T1 */ + if ( ( petrinet_P1_is_marked >= 3 ) && + ( petrinet_P3_is_marked + 3 <= 6 ) && + ( petrinet_P1_marking_member_0[ 2 ] + == petrinet_P1_marking_member_0[ 0 ] ) ) { + + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[ 1 ]; + y = petrinet_P1_marking_member_0[ 2 ]; + + /* Transition condition */ + if ( ( x < y ) ) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = x; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = y; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 2, 0, 1 */ + /* Transition T1 */ + if ( ( petrinet_P1_is_marked >= 3 ) && + ( petrinet_P3_is_marked + 3 <= 6 ) && + ( petrinet_P1_marking_member_0[ 0 ] + == petrinet_P1_marking_member_0[ 1 ] ) ) { + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[ 2 ]; + y = petrinet_P1_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( x < y ) ) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = x; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = y; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P1 : 2, 1, 0 */ + /* Transition T1 */ + if ( ( petrinet_P1_is_marked >= 3 ) && + ( petrinet_P3_is_marked + 3 <= 6 ) && + ( petrinet_P1_marking_member_0[ 1 ] + == petrinet_P1_marking_member_0[ 0 ] ) ) { + long x; + long y; + long z; + + x = petrinet_P1_marking_member_0[ 2 ]; + y = petrinet_P1_marking_member_0[ 1 ]; + + /* Transition condition */ + if ( ( x < y ) ) { + + /* demarking of input places */ + petrinet_P1_is_marked -= 3; + + /* preaction */ + z = x - y; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = x; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = y; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = z; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place P2 : 0, 1, 2, 3 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( ( petrinet_P3_is_marked + 3 ) <= 6 ) ) && + ( ( ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 2 ] ) ) && + ( ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 3 ] ) ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 0 ]; + b = petrinet_P2_marking_member_0[ 1 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 1, 3, 2 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( ( petrinet_P3_is_marked + 3 ) <= 6 ) ) && + ( ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 3 ] ) && + ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 2 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 0 ]; + b = petrinet_P2_marking_member_0[ 1 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 2, 1, 3 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 1 ] ) && + ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 3 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 0 ]; + b = petrinet_P2_marking_member_0[ 2 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 2, 3, 1 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 3 ] ) && + ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 1 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 0 ]; + b = petrinet_P2_marking_member_0[ 2 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 3, 1, 2 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 1 ] ) && + ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 2 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 0 ]; + b = petrinet_P2_marking_member_0[ 3 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 0, 3, 2, 1 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 2 ] ) && + ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 1 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 0 ]; + b = petrinet_P2_marking_member_0[ 3 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 0, 2, 3 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 2 ] ) && + ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 3 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 1 ]; + b = petrinet_P2_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 0, 3, 2 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 3 ] ) && + ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 2 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 1 ]; + b = petrinet_P2_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 2, 0, 3 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 0 ] ) && + ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 3 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 1 ]; + b = petrinet_P2_marking_member_0[ 2 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 2, 3, 0 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 3 ] ) && + ( petrinet_P2_marking_member_0[ 2 ] + == petrinet_P2_marking_member_0[ 0 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 1 ]; + b = petrinet_P2_marking_member_0[ 2 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 1, 3, 0, 2 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 0 ] ) && + ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 2 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 1 ]; + b = petrinet_P2_marking_member_0[ 3 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + + /* Permutation for Place petrinet_P2 : 1, 3, 2, 0 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 2 ] ) && + ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 0 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 1 ]; + b = petrinet_P2_marking_member_0[ 3 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + + /* Permutation for Place petrinet_P2 : 2, 0, 1, 3 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 1 ] ) && + ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 3 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 2 ]; + b = petrinet_P2_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 0, 3, 1 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 3 ] ) && + ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 1 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 2 ]; + b = petrinet_P2_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 1, 0, 3 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 0 ] ) && + ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 3 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 2 ]; + b = petrinet_P2_marking_member_0[ 1 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 1, 3, 0 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 3 ] ) && + ( petrinet_P2_marking_member_0[ 1 ] + == petrinet_P2_marking_member_0[ 0 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 2 ]; + b = petrinet_P2_marking_member_0[ 1 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 3, 0, 1 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 0 ] ) && + ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 1 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 2 ]; + b = petrinet_P2_marking_member_0[ 3 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 2, 3, 1, 0 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 1 ] ) && + ( petrinet_P2_marking_member_0[ 3 ] + == petrinet_P2_marking_member_0[ 0 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 2 ]; + b = petrinet_P2_marking_member_0[ 3 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + /* Permutation for Place petrinet_P2 : 3, 0, 1, 2 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 1 ] ) && + ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 2 ] ) ) ) { + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 3 ]; + b = petrinet_P2_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + + + /* Permutation for Place petrinet_P2 : 3, 0, 2, 1 */ + /* Transition T2 */ + if ( ( petrinet_P2_is_marked >= 4 ) && + ( ( petrinet_P3_is_marked + 3 ) <= 6 ) && + ( ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 2 ] ) && + ( petrinet_P2_marking_member_0[ 0 ] + == petrinet_P2_marking_member_0[ 1 ] ) ) ) { + + long a; + long b; + long c; + + a = petrinet_P2_marking_member_0[ 3 ]; + b = petrinet_P2_marking_member_0[ 0 ]; + + /* Transition condition */ + if ( ( b > a ) ) { + + /* demarking of input places */ + petrinet_P2_is_marked -= 4; + + /* preaction */ + c = a + b; + + /* marking of output places */ + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 0 ] = a; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 1 ] = b; + petrinet_P3_marking_member_0[ petrinet_P3_is_marked + 2 ] = c; + petrinet_P3_is_marked += 3; + + } /* end of if (Transition condition) */ + } + } + #ifdef PROFILING + if ( main_iters_dummy_i < main_min_dummy_i ) + main_min_dummy_i = main_iters_dummy_i; + if ( main_iters_dummy_i > main_max_dummy_i ) + main_max_dummy_i = main_iters_dummy_i; + #endif + + #ifdef PROFILING + printf( "main::dummy_i-loop: [%d, %d]\n", + main_min_dummy_i, main_max_dummy_i ); + #endif + + //dummy_i = 77; + // TODO: not a good return value + //return dummy_i; +} + + +void petrinet_init( void ) +{ + petrinet_P1_is_marked = 3; + petrinet_P2_is_marked = 5; + petrinet_P3_is_marked = 0; + + /* + Maybe we should also initialise these arrays, as they may be read + in the petrinet_main() function before being written. + */ + /* + volatile long petrinet_P1_marking_member_0[ 3 ]; + volatile long petrinet_P2_marking_member_0[ 5 ]; + volatile long petrinet_P3_marking_member_0[ 6 ]; + */ +} + + +int petrinet_return( void ) +{ + // TODO: use something from the Px_... arrays + int checksum = 0; + int i; + + _Pragma( "loopbound min 3 max 3" ) + for ( i = 0; i < 3; ++i ) + checksum += petrinet_P1_marking_member_0[i]; + + _Pragma( "loopbound min 5 max 5" ) + for ( i = 0; i < 5; ++i ) + checksum += petrinet_P2_marking_member_0[i]; + + _Pragma( "loopbound min 6 max 6" ) + for ( i = 0; i < 6; ++i ) + checksum += petrinet_P3_marking_member_0[i]; + + return ( ( checksum == petrinet_CHECKSUM ) ? 0 : -1 ); +} + + +int main( void ) +{ + petrinet_main(); + + return ( petrinet_return() ); +} + diff --git a/targets/wasm-tacle/sequential/rijndael_dec/CMakeLists.txt b/targets/wasm-tacle/sequential/rijndael_dec/CMakeLists.txt new file mode 100644 index 0000000..defb3bc --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/CMakeLists.txt @@ -0,0 +1,28 @@ +# ~~~ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU) +# ~~~ + +cmake_minimum_required(VERSION 3.20) + +project(rijndael_dec) + +set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..") +set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..") + +set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}") + +if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline") + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/inline/rijndael_dec.c") +else() + set(APP_SOURCE_FILE_PATH + "generated/modified_sources/default/rijndael_dec.c" + "generated/modified_sources/default/aes.c" + "generated/modified_sources/default/input_small_enc.c" + "generated/modified_sources/default/rijndael_dec_libc.c") +endif() + +include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake) + + diff --git a/targets/wasm-tacle/sequential/rijndael_dec/ChangeLog.txt b/targets/wasm-tacle/sequential/rijndael_dec/ChangeLog.txt new file mode 100755 index 0000000..75e26a8 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/ChangeLog.txt @@ -0,0 +1,58 @@ +File: rijndael_decoder.c +Source: security section of MiBench + +- Prefix library functions with rijndael_dec +- Move functionality from function main into functions + rijndael_enc_init, rijndael_enc_main, and rijndael_enc_return + (reusing code from rijndael_enc benchmark) +- Added general TACLeBench header to beginning of source code +- Applied code formatting with astyle as in the example +- Rename to rijndael_dec.c +- Make loop counter in rijndael_dec_init unsigned +- Remove dead code in rijndael_dec_decfile + +File: aes.h +Source: security section of MiBench + +2016-04-20: +- Replace with file aes.h from rijndael_enc benchmark +- Declare prototype for rijndael_enc_decrypt instead of rijndael_enc_encrypt + +File: aes.c +Source: security section of MiBench + +2016-04-20: +- Replace with file aes.h from rijndael_enc benchmark, using prefix + rijndael_dec +- Replace implementation for rijndael_enc_encrypt with implementation + for rijndael_enc_decrypt +- Applied code formatting with astyle as in the example +- Remove unused macros s, ff_poly, ff_hi, m1, m2, m3, FFmulX, + fwd_mcol, fwd_var, inv_var, si, so, fwd_rnd, inv_rnd, fwd_lrnd, + inv_lrnd, locals, l_copy, state_in, state_out, round + +2016-06-14: +- Added cast to make C++ compiler happy + +File: aestab.h +Source: security section of MiBench + +2016-04-20: +- Replace with file aestab.h from rijndael_enc benchmark, using prefix + rijndael_dec +- Remove unused arrays rijndael_dec_s_box, rijndael_dec_inv_s_box, + rijndael_dec_ft_tab + +Files: glibc_common.c, my_file.c, glibc_common.h, my_file.h +Source: security section of MiBench + +2016-04-20: +- Replace with files rijndael_enc_libc.c and rijndael_enc_libc.h from + rijndael_enc benchmark (renamed to rijndael_dec_libc.c and + rijndael_dec_libc.h, using prefix rijndael_dec) + +File: input_small_enc.c +Source: security section of MiBench + +2016-02-26: +- Prefix input array with rijndael_dec diff --git a/targets/wasm-tacle/sequential/rijndael_dec/aes.c b/targets/wasm-tacle/sequential/rijndael_dec/aes.c new file mode 100755 index 0000000..f644ee2 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/aes.c @@ -0,0 +1,406 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of 128, + bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. +*/ + +#include "aes.h" + +#include "aestab.h" + +#define four_tables(x,tab,vf,rf,c) ( tab[ 0 ][ bval(vf(x,0,c),rf(0,c)) ] ^ \ + tab[ 1 ][ bval(vf(x,1,c),rf(1,c)) ] ^ \ + tab[ 2 ][ bval(vf(x,2,c),rf(2,c)) ] ^ \ + tab[ 3 ][ bval(vf(x,3,c),rf(3,c)) ] ) + +#define vf1(x,r,c) (x) +#define rf1(r,c) (r) +#define rf2(r,c) ((r-c)&3) + +#define ls_box(x,c) four_tables(x,rijndael_dec_fl_tab,vf1,rf2,c) + +#define inv_mcol(x) four_tables(x,rijndael_dec_im_tab,vf1,rf1,0) + +/* + Subroutine to set the block size (if variable) in bytes, legal + values being 16, 24 and 32. +*/ + +#define nc (Ncol) + +/* + Initialise the key schedule from the user supplied key. The key + length is now specified in bytes - 16, 24 or 32 as appropriate. + This corresponds to bit lengths of 128, 192 and 256 bits, and + to Nk values of 4, 6 and 8 respectively. +*/ + +#define mx(t,f) (*t++ = inv_mcol(*f),f++) +#define cp(t,f) *t++ = *f++ + +#define cpy(d,s) do { cp(d,s); cp(d,s); cp(d,s); cp(d,s); } while (0) //min 1 max 1 +#define mix(d,s) do { mx(d,s); mx(d,s); mx(d,s); mx(d,s); } while (0) //min 1 max 1 + +aes_ret rijndael_dec_set_key( byte in_key[ ], const word n_bytes, + const enum aes_key f, struct aes *cx ) +{ + word *kf, *kt, rci; + + if ( ( n_bytes & 7 ) || n_bytes < 16 || n_bytes > 32 || ( !( f & 1 ) && + !( f & 2 ) ) ) + return ( n_bytes ? cx->mode &= ~0x03, aes_bad : ( aes_ret )( cx->Nkey << 2 ) ); + + cx->mode = ( cx->mode & ~0x03 ) | ( ( byte )f & 0x03 ); + cx->Nkey = n_bytes >> 2; + cx->Nrnd = Nr( cx->Nkey, ( word )nc ); + + cx->e_key[ 0 ] = word_in( in_key ); + cx->e_key[ 1 ] = word_in( in_key + 4 ); + cx->e_key[ 2 ] = word_in( in_key + 8 ); + cx->e_key[ 3 ] = word_in( in_key + 12 ); + + kf = cx->e_key; + kt = kf + nc * ( cx->Nrnd + 1 ) - cx->Nkey; + rci = 0; + + switch ( cx->Nkey ) { + case 4: + _Pragma( "loopbound min 0 max 0" ) + do { + kf[ 4 ] = kf[ 0 ] ^ ls_box( kf[ 3 ], 3 ) ^ rijndael_dec_rcon_tab[ rci++ ]; + kf[ 5 ] = kf[ 1 ] ^ kf[ 4 ]; + kf[ 6 ] = kf[ 2 ] ^ kf[ 5 ]; + kf[ 7 ] = kf[ 3 ] ^ kf[ 6 ]; + kf += 4; + } while ( kf < kt ); + break; + + case 6: + cx->e_key[ 4 ] = word_in( in_key + 16 ); + cx->e_key[ 5 ] = word_in( in_key + 20 ); + _Pragma( "loopbound min 0 max 0" ) + do { + kf[ 6 ] = kf[ 0 ] ^ ls_box( kf[ 5 ], 3 ) ^ rijndael_dec_rcon_tab[ rci++ ]; + kf[ 7 ] = kf[ 1 ] ^ kf[ 6 ]; + kf[ 8 ] = kf[ 2 ] ^ kf[ 7 ]; + kf[ 9 ] = kf[ 3 ] ^ kf[ 8 ]; + kf[ 10 ] = kf[ 4 ] ^ kf[ 9 ]; + kf[ 11 ] = kf[ 5 ] ^ kf[ 10 ]; + kf += 6; + } while ( kf < kt ); + break; + + case 8: + cx->e_key[ 4 ] = word_in( in_key + 16 ); + cx->e_key[ 5 ] = word_in( in_key + 20 ); + cx->e_key[ 6 ] = word_in( in_key + 24 ); + cx->e_key[ 7 ] = word_in( in_key + 28 ); + _Pragma( "loopbound min 7 max 7" ) + do { + kf[ 8 ] = kf[ 0 ] ^ ls_box( kf[ 7 ], 3 ) ^ rijndael_dec_rcon_tab[ rci++ ]; + kf[ 9 ] = kf[ 1 ] ^ kf[ 8 ]; + kf[ 10 ] = kf[ 2 ] ^ kf[ 9 ]; + kf[ 11 ] = kf[ 3 ] ^ kf[ 10 ]; + kf[ 12 ] = kf[ 4 ] ^ ls_box( kf[ 11 ], 0 ); + kf[ 13 ] = kf[ 5 ] ^ kf[ 12 ]; + kf[ 14 ] = kf[ 6 ] ^ kf[ 13 ]; + kf[ 15 ] = kf[ 7 ] ^ kf[ 14 ]; + kf += 8; + } while ( kf < kt ); + break; + } + + if ( ( cx->mode & 3 ) != enc ) { + word i; + + kt = cx->d_key + nc * cx->Nrnd; + kf = cx->e_key; + + cpy( kt, kf ); + kt -= 2 * nc; + + _Pragma( "loopbound min 13 max 13" ) + for ( i = 1; i < cx->Nrnd; ++i ) { + mix( kt, kf ); + kt -= 2 * nc; + } + + cpy( kt, kf ); + } + + return aes_good; +} + +short rijndael_dec_decrypt( const unsigned char in_blk[ ], + unsigned char out_blk[ ], const struct aes *cx ) +{ + const unsigned long *kp = cx->d_key; + if ( !( cx->mode & 2 ) ) + return 0; + unsigned long b0[ 4 ]; + b0[ 0 ] = *( unsigned long * )in_blk ^ kp[ 0 ]; + b0[ 1 ] = *( unsigned long * )( in_blk + 4 )^kp[ 1 ]; + b0[ 2 ] = *( unsigned long * )( in_blk + 8 )^kp[ 2 ]; + b0[ 3 ] = *( unsigned long * )( in_blk + 12 )^kp[ 3 ]; + kp += 4; + unsigned long b1[ 4 ]; + switch ( cx->Nrnd ) { + case 14: + b1[ 0 ] = kp[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = kp[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = kp[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = kp[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + kp += 8; + case 12: + b1[ 0 ] = kp[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = kp[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = kp[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = kp[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + kp += 8; + case 10: + b1[ 0 ] = kp[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = kp[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = kp[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = kp[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 8 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 8 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 8 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 8 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 12 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 12 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 12 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 12 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 16 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 16 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 16 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 16 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 20 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 20 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 20 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 20 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 24 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 24 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 24 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 24 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 28 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 28 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 28 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 28 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + b1[ 0 ] = ( kp + 32 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] ); + b1[ 1 ] = ( kp + 32 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] ); + b1[ 2 ] = ( kp + 32 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] ); + b1[ 3 ] = ( kp + 32 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^ + rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] ); + b0[ 0 ] = ( kp + 36 )[ 0 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^ + rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^ + rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^ + rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] ); + b0[ 1 ] = ( kp + 36 )[ 1 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^ + rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^ + rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^ + rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] ); + b0[ 2 ] = ( kp + 36 )[ 2 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^ + rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^ + rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^ + rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] ); + b0[ 3 ] = ( kp + 36 )[ 3 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^ + rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^ + rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^ + rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] ); + } + *( unsigned long * )out_blk = ( b0[ 0 ] ); + *( unsigned long * )( out_blk + 4 ) = ( b0[ 1 ] ); + *( unsigned long * )( out_blk + 8 ) = ( b0[ 2 ] ); + *( unsigned long * )( out_blk + 12 ) = ( b0[ 3 ] ); + return aes_good; +} + diff --git a/targets/wasm-tacle/sequential/rijndael_dec/aes.h b/targets/wasm-tacle/sequential/rijndael_dec/aes.h new file mode 100755 index 0000000..9477191 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/aes.h @@ -0,0 +1,165 @@ +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- + + 1. FUNCTION + + The AES algorithm Rijndael implemented for block and key sizes of + 128 bits (16 bytes) by Brian Gladman. + + This is an implementation of the AES encryption algorithm (Rijndael) + designed by Joan Daemen and Vincent Rijmen. + + 2. THE CIPHER INTERFACE + + byte (an unsigned 8-bit type) + word (an unsigned 32-bit type) + aes_ret: (a signed 16 bit type for function return values) + aes_good (value != 0, a good return) + aes_bad (value == 0, an error return) + enum aes_key: (encryption direction) + enc (set key for encryption) + dec (set key for decryption) + both (set key for both) + class or struct aes (structure for context) + + C subroutine calls: + + aes_ret set_blk(const word block_length, aes *cx) (variable block size) + aes_ret set_key(const byte key[ ], const word key_length, + const enum aes_key direction, aes *cx) + aes_ret encrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + aes_ret decrypt(const byte input_blk[ ], byte output_blk[ ], const aes *cx) + + IMPORTANT NOTE: If you are using this C interface and your compiler does + not set the memory used for objects to zero before use, you will need to + ensure that cx.mode is set to zero before using the C subroutine calls. + + The block length inputs to set_block and set_key are in numbers of + BYTES, not bits. The calls to subroutines must be made in the above + order but multiple calls can be made without repeating earlier calls + if their parameters have not changed. If the cipher block length is + variable but set_blk has not been called before cipher operations a + value of 16 is assumed (that is, the AES block size). In contrast to + earlier versions the block and key length parameters are now checked + for correctness and the encryption and decryption routines check to + ensure that an appropriate key has been set before they are called. + +*/ + +#ifndef _AES_H +#define _AES_H + +/* The only supported block size for the benchmark is 16 */ +#define BLOCK_SIZE 16 + +/* + The number of key schedule words for different block and key lengths + (allowing for the method of computation which requires the length to + be a multiple of the key length): + + Key Schedule key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 44 60 54 56 64 + length 20 | 60 60 66 70 80 + (bytes) 24 | 80 80 78 84 96 + 28 | 100 100 102 98 112 + 32 | 120 120 120 126 120 + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + The following values assume that the key length will be variable and may + be of maximum length (32 bytes). + + Nk = number_of_key_bytes / 4 + Nc = number_of_columns_in_state / 4 + Nr = number of encryption/decryption rounds + Rc = number of elements in rcon table + Ks = number of 32-bit words in key schedule +*/ + +#define Nr(Nk,Nc) ((Nk > Nc ? Nk : Nc) + 6) +#define Rc(Nk,Nc) ((Nb * (Nr(Nk,Nc) + 1) - 1) / Nk) +#define Ks(Nk,Nc) (Nk * (Rc(Nk,Nc) + 1)) + +#define RC_LENGTH 5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11) +#define KS_LENGTH 4 * BLOCK_SIZE + +/* End of configuration options, but see also aes.c */ + +typedef unsigned char byte; /* must be an 8-bit storage unit */ +typedef unsigned long word; /* must be a 32-bit storage unit */ +typedef short aes_ret; /* function return value */ + +#define aes_bad 0 +#define aes_good 1 + +/* + upr(x,n): rotates bytes within words by n positions, moving bytes + to higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word +*/ + +#define upr(x,n) (((x) << 8 * (n)) | ((x) >> (32 - 8 * (n)))) +#define ups(x,n) ((x) << 8 * (n)) +#define bval(x,n) ((byte)((x) >> 8 * (n))) +#define byte_swap(x) (upr(x,1) & 0x00ff00ff | upr(x,3) & 0xff00ff00) +#define bytes2word(b0, b1, b2, b3) ((word)(b3) << 24 | (word)(b2) << 16 | \ + (word)(b1) << 8 | (b0)) + +#define word_in(x) *(word*)(x) +#define word_out(x,v) *(word*)(x) = (v) + +enum aes_const { Nrow = 4, /* the number of rows in the cipher state */ + Mcol = 8, /* maximum number of columns in the state */ + Ncol = BLOCK_SIZE / 4, + Shr0 = 0, /* the cyclic shift values for rows 0, 1, 2 & 3 */ + Shr1 = 1, + Shr2 = BLOCK_SIZE == 32 ? 3 : 2, + Shr3 = BLOCK_SIZE == 32 ? 4 : 3 + }; + +enum aes_key { enc = 1, /* set if encryption is needed */ + dec = 2, /* set if decryption is needed */ + both = 3 /* set if both are needed */ + }; + +struct aes { + word Nkey; /* the number of words in the key input block */ + word Nrnd; /* the number of cipher rounds */ + word e_key[ KS_LENGTH ]; /* the encryption key schedule */ + word d_key[ KS_LENGTH ]; /* the decryption key schedule */ + byte mode; /* encrypt, decrypt or both */ +}; + +aes_ret rijndael_dec_set_key( byte key[ ], const word n_bytes, + const enum aes_key f, struct aes *cx ); +aes_ret rijndael_dec_decrypt( const byte in_blk[ ], byte out_blk[ ], + const struct aes *cx ); + +#endif diff --git a/targets/wasm-tacle/sequential/rijndael_dec/aestab.h b/targets/wasm-tacle/sequential/rijndael_dec/aestab.h new file mode 100755 index 0000000..bc3cca1 --- /dev/null +++ b/targets/wasm-tacle/sequential/rijndael_dec/aestab.h @@ -0,0 +1,379 @@ + +/* + ----------------------------------------------------------------------- + Copyright (c) 2001 Dr Brian Gladman , Worcester, UK + + TERMS + + 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 'as is' with no guarantees of correctness or + fitness for purpose. + ----------------------------------------------------------------------- +*/ + +/* + Used to ensure table is generated in the right format + depending on the internal byte order required. +*/ + +#define w0(p) 0x000000##p + +/* + Number of elements required in this table for different + block and key lengths is: + + Rcon Table key length (bytes) + Length 16 20 24 28 32 + --------------------- + block 16 | 10 9 8 7 7 + length 20 | 14 11 10 9 9 + (bytes) 24 | 19 15 12 11 11 + 28 | 24 19 16 13 13 + 32 | 29 23 19 17 14 + + this table can be a table of bytes if the key schedule + code is adjusted accordingly +*/ + +const word rijndael_dec_rcon_tab[ 29 ] = { + w0( 01 ), w0( 02 ), w0( 04 ), w0( 08 ), + w0( 10 ), w0( 20 ), w0( 40 ), w0( 80 ), + w0( 1b ), w0( 36 ), w0( 6c ), w0( d8 ), + w0( ab ), w0( 4d ), w0( 9a ), w0( 2f ), + w0( 5e ), w0( bc ), w0( 63 ), w0( c6 ), + w0( 97 ), w0( 35 ), w0( 6a ), w0( d4 ), + w0( b3 ), w0( 7d ), w0( fa ), w0( ef ), + w0( c5 ) +}; + +#undef w0 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +#define r0(p,q,r,s) 0x##p##q##r##s +#define r1(p,q,r,s) 0x##q##r##s##p +#define r2(p,q,r,s) 0x##r##s##p##q +#define r3(p,q,r,s) 0x##s##p##q##r +#define w0(p) 0x000000##p +#define w1(p) 0x0000##p##00 +#define w2(p) 0x00##p##0000 +#define w3(p) 0x##p##000000 + +/* + used to ensure table is generated in the right format + depending on the internal byte order required +*/ + +/* data for forward tables (other than last round) */ + +#define f_table \ + r(a5,63,63,c6), r(84,7c,7c,f8), r(99,77,77,ee), r(8d,7b,7b,f6), \ + r(0d,f2,f2,ff), r(bd,6b,6b,d6), r(b1,6f,6f,de), r(54,c5,c5,91), \ + r(50,30,30,60), r(03,01,01,02), r(a9,67,67,ce), r(7d,2b,2b,56), \ + r(19,fe,fe,e7), r(62,d7,d7,b5), r(e6,ab,ab,4d), r(9a,76,76,ec), \ + r(45,ca,ca,8f), r(9d,82,82,1f), r(40,c9,c9,89), r(87,7d,7d,fa), \ + r(15,fa,fa,ef), r(eb,59,59,b2), r(c9,47,47,8e), r(0b,f0,f0,fb), \ + r(ec,ad,ad,41), r(67,d4,d4,b3), r(fd,a2,a2,5f), r(ea,af,af,45), \ + r(bf,9c,9c,23), r(f7,a4,a4,53), r(96,72,72,e4), r(5b,c0,c0,9b), \ + r(c2,b7,b7,75), r(1c,fd,fd,e1), r(ae,93,93,3d), r(6a,26,26,4c), \ + r(5a,36,36,6c), r(41,3f,3f,7e), r(02,f7,f7,f5), r(4f,cc,cc,83), \ + r(5c,34,34,68), r(f4,a5,a5,51), r(34,e5,e5,d1), r(08,f1,f1,f9), \ + r(93,71,71,e2), r(73,d8,d8,ab), r(53,31,31,62), r(3f,15,15,2a), \ + r(0c,04,04,08), r(52,c7,c7,95), r(65,23,23,46), r(5e,c3,c3,9d), \ + r(28,18,18,30), r(a1,96,96,37), r(0f,05,05,0a), r(b5,9a,9a,2f), \ + r(09,07,07,0e), r(36,12,12,24), r(9b,80,80,1b), r(3d,e2,e2,df), \ + r(26,eb,eb,cd), r(69,27,27,4e), r(cd,b2,b2,7f), r(9f,75,75,ea), \ + r(1b,09,09,12), r(9e,83,83,1d), r(74,2c,2c,58), r(2e,1a,1a,34), \ + r(2d,1b,1b,36), r(b2,6e,6e,dc), r(ee,5a,5a,b4), r(fb,a0,a0,5b), \ + r(f6,52,52,a4), r(4d,3b,3b,76), r(61,d6,d6,b7), r(ce,b3,b3,7d), \ + r(7b,29,29,52), r(3e,e3,e3,dd), r(71,2f,2f,5e), r(97,84,84,13), \ + r(f5,53,53,a6), r(68,d1,d1,b9), r(00,00,00,00), r(2c,ed,ed,c1), \ + r(60,20,20,40), r(1f,fc,fc,e3), r(c8,b1,b1,79), r(ed,5b,5b,b6), \ + r(be,6a,6a,d4), r(46,cb,cb,8d), r(d9,be,be,67), r(4b,39,39,72), \ + r(de,4a,4a,94), r(d4,4c,4c,98), r(e8,58,58,b0), r(4a,cf,cf,85), \ + r(6b,d0,d0,bb), r(2a,ef,ef,c5), r(e5,aa,aa,4f), r(16,fb,fb,ed), \ + r(c5,43,43,86), r(d7,4d,4d,9a), r(55,33,33,66), r(94,85,85,11), \ + r(cf,45,45,8a), r(10,f9,f9,e9), r(06,02,02,04), r(81,7f,7f,fe), \ + r(f0,50,50,a0), r(44,3c,3c,78), r(ba,9f,9f,25), r(e3,a8,a8,4b), \ + r(f3,51,51,a2), r(fe,a3,a3,5d), r(c0,40,40,80), r(8a,8f,8f,05), \ + r(ad,92,92,3f), r(bc,9d,9d,21), r(48,38,38,70), r(04,f5,f5,f1), \ + r(df,bc,bc,63), r(c1,b6,b6,77), r(75,da,da,af), r(63,21,21,42), \ + r(30,10,10,20), r(1a,ff,ff,e5), r(0e,f3,f3,fd), r(6d,d2,d2,bf), \ + r(4c,cd,cd,81), r(14,0c,0c,18), r(35,13,13,26), r(2f,ec,ec,c3), \ + r(e1,5f,5f,be), r(a2,97,97,35), r(cc,44,44,88), r(39,17,17,2e), \ + r(57,c4,c4,93), r(f2,a7,a7,55), r(82,7e,7e,fc), r(47,3d,3d,7a), \ + r(ac,64,64,c8), r(e7,5d,5d,ba), r(2b,19,19,32), r(95,73,73,e6), \ + r(a0,60,60,c0), r(98,81,81,19), r(d1,4f,4f,9e), r(7f,dc,dc,a3), \ + r(66,22,22,44), r(7e,2a,2a,54), r(ab,90,90,3b), r(83,88,88,0b), \ + r(ca,46,46,8c), r(29,ee,ee,c7), r(d3,b8,b8,6b), r(3c,14,14,28), \ + r(79,de,de,a7), r(e2,5e,5e,bc), r(1d,0b,0b,16), r(76,db,db,ad), \ + r(3b,e0,e0,db), r(56,32,32,64), r(4e,3a,3a,74), r(1e,0a,0a,14), \ + r(db,49,49,92), r(0a,06,06,0c), r(6c,24,24,48), r(e4,5c,5c,b8), \ + r(5d,c2,c2,9f), r(6e,d3,d3,bd), r(ef,ac,ac,43), r(a6,62,62,c4), \ + r(a8,91,91,39), r(a4,95,95,31), r(37,e4,e4,d3), r(8b,79,79,f2), \ + r(32,e7,e7,d5), r(43,c8,c8,8b), r(59,37,37,6e), r(b7,6d,6d,da), \ + r(8c,8d,8d,01), r(64,d5,d5,b1), r(d2,4e,4e,9c), r(e0,a9,a9,49), \ + r(b4,6c,6c,d8), r(fa,56,56,ac), r(07,f4,f4,f3), r(25,ea,ea,cf), \ + r(af,65,65,ca), r(8e,7a,7a,f4), r(e9,ae,ae,47), r(18,08,08,10), \ + r(d5,ba,ba,6f), r(88,78,78,f0), r(6f,25,25,4a), r(72,2e,2e,5c), \ + r(24,1c,1c,38), r(f1,a6,a6,57), r(c7,b4,b4,73), r(51,c6,c6,97), \ + r(23,e8,e8,cb), r(7c,dd,dd,a1), r(9c,74,74,e8), r(21,1f,1f,3e), \ + r(dd,4b,4b,96), r(dc,bd,bd,61), r(86,8b,8b,0d), r(85,8a,8a,0f), \ + r(90,70,70,e0), r(42,3e,3e,7c), r(c4,b5,b5,71), r(aa,66,66,cc), \ + r(d8,48,48,90), r(05,03,03,06), r(01,f6,f6,f7), r(12,0e,0e,1c), \ + r(a3,61,61,c2), r(5f,35,35,6a), r(f9,57,57,ae), r(d0,b9,b9,69), \ + r(91,86,86,17), r(58,c1,c1,99), r(27,1d,1d,3a), r(b9,9e,9e,27), \ + r(38,e1,e1,d9), r(13,f8,f8,eb), r(b3,98,98,2b), r(33,11,11,22), \ + r(bb,69,69,d2), r(70,d9,d9,a9), r(89,8e,8e,07), r(a7,94,94,33), \ + r(b6,9b,9b,2d), r(22,1e,1e,3c), r(92,87,87,15), r(20,e9,e9,c9), \ + r(49,ce,ce,87), r(ff,55,55,aa), r(78,28,28,50), r(7a,df,df,a5), \ + r(8f,8c,8c,03), r(f8,a1,a1,59), r(80,89,89,09), r(17,0d,0d,1a), \ + r(da,bf,bf,65), r(31,e6,e6,d7), r(c6,42,42,84), r(b8,68,68,d0), \ + r(c3,41,41,82), r(b0,99,99,29), r(77,2d,2d,5a), r(11,0f,0f,1e), \ + r(cb,b0,b0,7b), r(fc,54,54,a8), r(d6,bb,bb,6d), r(3a,16,16,2c) + +/* data for inverse tables (other than last round) */ + +#define i_table \ + r(50,a7,f4,51), r(53,65,41,7e), r(c3,a4,17,1a), r(96,5e,27,3a), \ + r(cb,6b,ab,3b), r(f1,45,9d,1f), r(ab,58,fa,ac), r(93,03,e3,4b), \ + r(55,fa,30,20), r(f6,6d,76,ad), r(91,76,cc,88), r(25,4c,02,f5), \ + r(fc,d7,e5,4f), r(d7,cb,2a,c5), r(80,44,35,26), r(8f,a3,62,b5), \ + r(49,5a,b1,de), r(67,1b,ba,25), r(98,0e,ea,45), r(e1,c0,fe,5d), \ + r(02,75,2f,c3), r(12,f0,4c,81), r(a3,97,46,8d), r(c6,f9,d3,6b), \ + r(e7,5f,8f,03), r(95,9c,92,15), r(eb,7a,6d,bf), r(da,59,52,95), \ + r(2d,83,be,d4), r(d3,21,74,58), r(29,69,e0,49), r(44,c8,c9,8e), \ + r(6a,89,c2,75), r(78,79,8e,f4), r(6b,3e,58,99), r(dd,71,b9,27), \ + r(b6,4f,e1,be), r(17,ad,88,f0), r(66,ac,20,c9), r(b4,3a,ce,7d), \ + r(18,4a,df,63), r(82,31,1a,e5), r(60,33,51,97), r(45,7f,53,62), \ + r(e0,77,64,b1), r(84,ae,6b,bb), r(1c,a0,81,fe), r(94,2b,08,f9), \ + r(58,68,48,70), r(19,fd,45,8f), r(87,6c,de,94), r(b7,f8,7b,52), \ + r(23,d3,73,ab), r(e2,02,4b,72), r(57,8f,1f,e3), r(2a,ab,55,66), \ + r(07,28,eb,b2), r(03,c2,b5,2f), r(9a,7b,c5,86), r(a5,08,37,d3), \ + r(f2,87,28,30), r(b2,a5,bf,23), r(ba,6a,03,02), r(5c,82,16,ed), \ + r(2b,1c,cf,8a), r(92,b4,79,a7), r(f0,f2,07,f3), r(a1,e2,69,4e), \ + r(cd,f4,da,65), r(d5,be,05,06), r(1f,62,34,d1), r(8a,fe,a6,c4), \ + r(9d,53,2e,34), r(a0,55,f3,a2), r(32,e1,8a,05), r(75,eb,f6,a4), \ + r(39,ec,83,0b), r(aa,ef,60,40), r(06,9f,71,5e), r(51,10,6e,bd), \ + r(f9,8a,21,3e), r(3d,06,dd,96), r(ae,05,3e,dd), r(46,bd,e6,4d), \ + r(b5,8d,54,91), r(05,5d,c4,71), r(6f,d4,06,04), r(ff,15,50,60), \ + r(24,fb,98,19), r(97,e9,bd,d6), r(cc,43,40,89), r(77,9e,d9,67), \ + r(bd,42,e8,b0), r(88,8b,89,07), r(38,5b,19,e7), r(db,ee,c8,79), \ + r(47,0a,7c,a1), r(e9,0f,42,7c), r(c9,1e,84,f8), r(00,00,00,00), \ + r(83,86,80,09), r(48,ed,2b,32), r(ac,70,11,1e), r(4e,72,5a,6c), \ + r(fb,ff,0e,fd), r(56,38,85,0f), r(1e,d5,ae,3d), r(27,39,2d,36), \ + r(64,d9,0f,0a), r(21,a6,5c,68), r(d1,54,5b,9b), r(3a,2e,36,24), \ + r(b1,67,0a,0c), r(0f,e7,57,93), r(d2,96,ee,b4), r(9e,91,9b,1b), \ + r(4f,c5,c0,80), r(a2,20,dc,61), r(69,4b,77,5a), r(16,1a,12,1c), \ + r(0a,ba,93,e2), r(e5,2a,a0,c0), r(43,e0,22,3c), r(1d,17,1b,12), \ + r(0b,0d,09,0e), r(ad,c7,8b,f2), r(b9,a8,b6,2d), r(c8,a9,1e,14), \ + r(85,19,f1,57), r(4c,07,75,af), r(bb,dd,99,ee), r(fd,60,7f,a3), \ + r(9f,26,01,f7), r(bc,f5,72,5c), r(c5,3b,66,44), r(34,7e,fb,5b), \ + r(76,29,43,8b), r(dc,c6,23,cb), r(68,fc,ed,b6), r(63,f1,e4,b8), \ + r(ca,dc,31,d7), r(10,85,63,42), r(40,22,97,13), r(20,11,c6,84), \ + r(7d,24,4a,85), r(f8,3d,bb,d2), r(11,32,f9,ae), r(6d,a1,29,c7), \ + r(4b,2f,9e,1d), r(f3,30,b2,dc), r(ec,52,86,0d), r(d0,e3,c1,77), \ + r(6c,16,b3,2b), r(99,b9,70,a9), r(fa,48,94,11), r(22,64,e9,47), \ + r(c4,8c,fc,a8), r(1a,3f,f0,a0), r(d8,2c,7d,56), r(ef,90,33,22), \ + r(c7,4e,49,87), r(c1,d1,38,d9), r(fe,a2,ca,8c), r(36,0b,d4,98), \ + r(cf,81,f5,a6), r(28,de,7a,a5), r(26,8e,b7,da), r(a4,bf,ad,3f), \ + r(e4,9d,3a,2c), r(0d,92,78,50), r(9b,cc,5f,6a), r(62,46,7e,54), \ + r(c2,13,8d,f6), r(e8,b8,d8,90), r(5e,f7,39,2e), r(f5,af,c3,82), \ + r(be,80,5d,9f), r(7c,93,d0,69), r(a9,2d,d5,6f), r(b3,12,25,cf), \ + r(3b,99,ac,c8), r(a7,7d,18,10), r(6e,63,9c,e8), r(7b,bb,3b,db), \ + r(09,78,26,cd), r(f4,18,59,6e), r(01,b7,9a,ec), r(a8,9a,4f,83), \ + r(65,6e,95,e6), r(7e,e6,ff,aa), r(08,cf,bc,21), r(e6,e8,15,ef), \ + r(d9,9b,e7,ba), r(ce,36,6f,4a), r(d4,09,9f,ea), r(d6,7c,b0,29), \ + r(af,b2,a4,31), r(31,23,3f,2a), r(30,94,a5,c6), r(c0,66,a2,35), \ + r(37,bc,4e,74), r(a6,ca,82,fc), r(b0,d0,90,e0), r(15,d8,a7,33), \ + r(4a,98,04,f1), r(f7,da,ec,41), r(0e,50,cd,7f), r(2f,f6,91,17), \ + r(8d,d6,4d,76), r(4d,b0,ef,43), r(54,4d,aa,cc), r(df,04,96,e4), \ + r(e3,b5,d1,9e), r(1b,88,6a,4c), r(b8,1f,2c,c1), r(7f,51,65,46), \ + r(04,ea,5e,9d), r(5d,35,8c,01), r(73,74,87,fa), r(2e,41,0b,fb), \ + r(5a,1d,67,b3), r(52,d2,db,92), r(33,56,10,e9), r(13,47,d6,6d), \ + r(8c,61,d7,9a), r(7a,0c,a1,37), r(8e,14,f8,59), r(89,3c,13,eb), \ + r(ee,27,a9,ce), r(35,c9,61,b7), r(ed,e5,1c,e1), r(3c,b1,47,7a), \ + r(59,df,d2,9c), r(3f,73,f2,55), r(79,ce,14,18), r(bf,37,c7,73), \ + r(ea,cd,f7,53), r(5b,aa,fd,5f), r(14,6f,3d,df), r(86,db,44,78), \ + r(81,f3,af,ca), r(3e,c4,68,b9), r(2c,34,24,38), r(5f,40,a3,c2), \ + r(72,c3,1d,16), r(0c,25,e2,bc), r(8b,49,3c,28), r(41,95,0d,ff), \ + r(71,01,a8,39), r(de,b3,0c,08), r(9c,e4,b4,d8), r(90,c1,56,64), \ + r(61,84,cb,7b), r(70,b6,32,d5), r(74,5c,6c,48), r(42,57,b8,d0) + +/* generate the required tables in the desired endian format */ + +#undef r +#define r r0 +const word rijndael_dec_it_tab[ 4 ][ 256 ] = { + { i_table }, +#undef r +#define r r1 + { i_table }, +#undef r +#define r r2 + { i_table }, +#undef r +#define r r3 + { i_table } +}; + +/* data for inverse tables (last round) */ + +#define li_table \ + w(52), w(09), w(6a), w(d5), w(30), w(36), w(a5), w(38), \ + w(bf), w(40), w(a3), w(9e), w(81), w(f3), w(d7), w(fb), \ + w(7c), w(e3), w(39), w(82), w(9b), w(2f), w(ff), w(87), \ + w(34), w(8e), w(43), w(44), w(c4), w(de), w(e9), w(cb), \ + w(54), w(7b), w(94), w(32), w(a6), w(c2), w(23), w(3d), \ + w(ee), w(4c), w(95), w(0b), w(42), w(fa), w(c3), w(4e), \ + w(08), w(2e), w(a1), w(66), w(28), w(d9), w(24), w(b2), \ + w(76), w(5b), w(a2), w(49), w(6d), w(8b), w(d1), w(25), \ + w(72), w(f8), w(f6), w(64), w(86), w(68), w(98), w(16), \ + w(d4), w(a4), w(5c), w(cc), w(5d), w(65), w(b6), w(92), \ + w(6c), w(70), w(48), w(50), w(fd), w(ed), w(b9), w(da), \ + w(5e), w(15), w(46), w(57), w(a7), w(8d), w(9d), w(84), \ + w(90), w(d8), w(ab), w(00), w(8c), w(bc), w(d3), w(0a), \ + w(f7), w(e4), w(58), w(05), w(b8), w(b3), w(45), w(06), \ + w(d0), w(2c), w(1e), w(8f), w(ca), w(3f), w(0f), w(02), \ + w(c1), w(af), w(bd), w(03), w(01), w(13), w(8a), w(6b), \ + w(3a), w(91), w(11), w(41), w(4f), w(67), w(dc), w(ea), \ + w(97), w(f2), w(cf), w(ce), w(f0), w(b4), w(e6), w(73), \ + w(96), w(ac), w(74), w(22), w(e7), w(ad), w(35), w(85), \ + w(e2), w(f9), w(37), w(e8), w(1c), w(75), w(df), w(6e), \ + w(47), w(f1), w(1a), w(71), w(1d), w(29), w(c5), w(89), \ + w(6f), w(b7), w(62), w(0e), w(aa), w(18), w(be), w(1b), \ + w(fc), w(56), w(3e), w(4b), w(c6), w(d2), w(79), w(20), \ + w(9a), w(db), w(c0), w(fe), w(78), w(cd), w(5a), w(f4), \ + w(1f), w(dd), w(a8), w(33), w(88), w(07), w(c7), w(31), \ + w(b1), w(12), w(10), w(59), w(27), w(80), w(ec), w(5f), \ + w(60), w(51), w(7f), w(a9), w(19), w(b5), w(4a), w(0d), \ + w(2d), w(e5), w(7a), w(9f), w(93), w(c9), w(9c), w(ef), \ + w(a0), w(e0), w(3b), w(4d), w(ae), w(2a), w(f5), w(b0), \ + w(c8), w(eb), w(bb), w(3c), w(83), w(53), w(99), w(61), \ + w(17), w(2b), w(04), w(7e), w(ba), w(77), w(d6), w(26), \ + w(e1), w(69), w(14), w(63), w(55), w(21), w(0c), w(7d), + +/* generate the required tables in the desired endian format */ + +#undef r +#define r(p,q,r,s) w0(q) +const word rijndael_dec_fl_tab[ 4 ][ 256 ] = { + { f_table }, +#undef r +#define r(p,q,r,s) w1(q) + { f_table }, +#undef r +#define r(p,q,r,s) w2(q) + { f_table }, +#undef r +#define r(p,q,r,s) w3(q) + { f_table } +}; + +#undef w +#define w w0 +const word rijndael_dec_il_tab[ 4 ][ 256 ] = { + { li_table }, +#undef w +#define w w1 + { li_table }, +#undef w +#define w w2 + { li_table }, +#undef w +#define w w3 + { li_table } +}; + +#define m_table \ + r(00,00,00,00), r(0b,0d,09,0e), r(16,1a,12,1c), r(1d,17,1b,12), \ + r(2c,34,24,38), r(27,39,2d,36), r(3a,2e,36,24), r(31,23,3f,2a), \ + r(58,68,48,70), r(53,65,41,7e), r(4e,72,5a,6c), r(45,7f,53,62), \ + r(74,5c,6c,48), r(7f,51,65,46), r(62,46,7e,54), r(69,4b,77,5a), \ + r(b0,d0,90,e0), r(bb,dd,99,ee), r(a6,ca,82,fc), r(ad,c7,8b,f2), \ + r(9c,e4,b4,d8), r(97,e9,bd,d6), r(8a,fe,a6,c4), r(81,f3,af,ca), \ + r(e8,b8,d8,90), r(e3,b5,d1,9e), r(fe,a2,ca,8c), r(f5,af,c3,82), \ + r(c4,8c,fc,a8), r(cf,81,f5,a6), r(d2,96,ee,b4), r(d9,9b,e7,ba), \ + r(7b,bb,3b,db), r(70,b6,32,d5), r(6d,a1,29,c7), r(66,ac,20,c9), \ + r(57,8f,1f,e3), r(5c,82,16,ed), r(41,95,0d,ff), r(4a,98,04,f1), \ + r(23,d3,73,ab), r(28,de,7a,a5), r(35,c9,61,b7), r(3e,c4,68,b9), \ + r(0f,e7,57,93), r(04,ea,5e,9d), r(19,fd,45,8f), r(12,f0,4c,81), \ + r(cb,6b,ab,3b), r(c0,66,a2,35), r(dd,71,b9,27), r(d6,7c,b0,29), \ + r(e7,5f,8f,03), r(ec,52,86,0d), r(f1,45,9d,1f), r(fa,48,94,11), \ + r(93,03,e3,4b), r(98,0e,ea,45), r(85,19,f1,57), r(8e,14,f8,59), \ + r(bf,37,c7,73), r(b4,3a,ce,7d), r(a9,2d,d5,6f), r(a2,20,dc,61), \ + r(f6,6d,76,ad), r(fd,60,7f,a3), r(e0,77,64,b1), r(eb,7a,6d,bf), \ + r(da,59,52,95), r(d1,54,5b,9b), r(cc,43,40,89), r(c7,4e,49,87), \ + r(ae,05,3e,dd), r(a5,08,37,d3), r(b8,1f,2c,c1), r(b3,12,25,cf), \ + r(82,31,1a,e5), r(89,3c,13,eb), r(94,2b,08,f9), r(9f,26,01,f7), \ + r(46,bd,e6,4d), r(4d,b0,ef,43), r(50,a7,f4,51), r(5b,aa,fd,5f), \ + r(6a,89,c2,75), r(61,84,cb,7b), r(7c,93,d0,69), r(77,9e,d9,67), \ + r(1e,d5,ae,3d), r(15,d8,a7,33), r(08,cf,bc,21), r(03,c2,b5,2f), \ + r(32,e1,8a,05), r(39,ec,83,0b), r(24,fb,98,19), r(2f,f6,91,17), \ + r(8d,d6,4d,76), r(86,db,44,78), r(9b,cc,5f,6a), r(90,c1,56,64), \ + r(a1,e2,69,4e), r(aa,ef,60,40), r(b7,f8,7b,52), r(bc,f5,72,5c), \ + r(d5,be,05,06), r(de,b3,0c,08), r(c3,a4,17,1a), r(c8,a9,1e,14), \ + r(f9,8a,21,3e), r(f2,87,28,30), r(ef,90,33,22), r(e4,9d,3a,2c), \ + r(3d,06,dd,96), r(36,0b,d4,98), r(2b,1c,cf,8a), r(20,11,c6,84), \ + r(11,32,f9,ae), r(1a,3f,f0,a0), r(07,28,eb,b2), r(0c,25,e2,bc), \ + r(65,6e,95,e6), r(6e,63,9c,e8), r(73,74,87,fa), r(78,79,8e,f4), \ + r(49,5a,b1,de), r(42,57,b8,d0), r(5f,40,a3,c2), r(54,4d,aa,cc), \ + r(f7,da,ec,41), r(fc,d7,e5,4f), r(e1,c0,fe,5d), r(ea,cd,f7,53), \ + r(db,ee,c8,79), r(d0,e3,c1,77), r(cd,f4,da,65), r(c6,f9,d3,6b), \ + r(af,b2,a4,31), r(a4,bf,ad,3f), r(b9,a8,b6,2d), r(b2,a5,bf,23), \ + r(83,86,80,09), r(88,8b,89,07), r(95,9c,92,15), r(9e,91,9b,1b), \ + r(47,0a,7c,a1), r(4c,07,75,af), r(51,10,6e,bd), r(5a,1d,67,b3), \ + r(6b,3e,58,99), r(60,33,51,97), r(7d,24,4a,85), r(76,29,43,8b), \ + r(1f,62,34,d1), r(14,6f,3d,df), r(09,78,26,cd), r(02,75,2f,c3), \ + r(33,56,10,e9), r(38,5b,19,e7), r(25,4c,02,f5), r(2e,41,0b,fb), \ + r(8c,61,d7,9a), r(87,6c,de,94), r(9a,7b,c5,86), r(91,76,cc,88), \ + r(a0,55,f3,a2), r(ab,58,fa,ac), r(b6,4f,e1,be), r(bd,42,e8,b0), \ + r(d4,09,9f,ea), r(df,04,96,e4), r(c2,13,8d,f6), r(c9,1e,84,f8), \ + r(f8,3d,bb,d2), r(f3,30,b2,dc), r(ee,27,a9,ce), r(e5,2a,a0,c0), \ + r(3c,b1,47,7a), r(37,bc,4e,74), r(2a,ab,55,66), r(21,a6,5c,68), \ + r(10,85,63,42), r(1b,88,6a,4c), r(06,9f,71,5e), r(0d,92,78,50), \ + r(64,d9,0f,0a), r(6f,d4,06,04), r(72,c3,1d,16), r(79,ce,14,18), \ + r(48,ed,2b,32), r(43,e0,22,3c), r(5e,f7,39,2e), r(55,fa,30,20), \ + r(01,b7,9a,ec), r(0a,ba,93,e2), r(17,ad,88,f0), r(1c,a0,81,fe), \ + r(2d,83,be,d4), r(26,8e,b7,da), r(3b,99,ac,c8), r(30,94,a5,c6), \ + r(59,df,d2,9c), r(52,d2,db,92), r(4f,c5,c0,80), r(44,c8,c9,8e), \ + r(75,eb,f6,a4), r(7e,e6,ff,aa), r(63,f1,e4,b8), r(68,fc,ed,b6), \ + r(b1,67,0a,0c), r(ba,6a,03,02), r(a7,7d,18,10), r(ac,70,11,1e), \ + r(9d,53,2e,34), r(96,5e,27,3a), r(8b,49,3c,28), r(80,44,35,26), \ + r(e9,0f,42,7c), r(e2,02,4b,72), r(ff,15,50,60), r(f4,18,59,6e), \ + r(c5,3b,66,44), r(ce,36,6f,4a), r(d3,21,74,58), r(d8,2c,7d,56), \ + r(7a,0c,a1,37), r(71,01,a8,39), r(6c,16,b3,2b), r(67,1b,ba,25), \ + r(56,38,85,0f), r(5d,35,8c,01), r(40,22,97,13), r(4b,2f,9e,1d), \ + r(22,64,e9,47), r(29,69,e0,49), r(34,7e,fb,5b), r(3f,73,f2,55), \ + r(0e,50,cd,7f), r(05,5d,c4,71), r(18,4a,df,63), r(13,47,d6,6d), \ + r(ca,dc,31,d7), r(c1,d1,38,d9), r(dc,c6,23,cb), r(d7,cb,2a,c5), \ + r(e6,e8,15,ef), r(ed,e5,1c,e1), r(f0,f2,07,f3), r(fb,ff,0e,fd), \ + r(92,b4,79,a7), r(99,b9,70,a9), r(84,ae,6b,bb), r(8f,a3,62,b5), \ + r(be,80,5d,9f), r(b5,8d,54,91), r(a8,9a,4f,83), r(a3,97,46,8d) + +#undef r +#define r r0 + +const word rijndael_dec_im_tab[ 4 ][ 256 ] = { + { m_table }, +#undef r +#define r r1 + { m_table }, +#undef r +#define r r2 + { m_table }, +#undef r +#define r r3 + { m_table } +}; diff --git a/targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wasm b/targets/wasm-tacle/sequential/rijndael_dec/generated/default/rijndael_dec.wasm new file mode 100755 index 0000000000000000000000000000000000000000..e73cb8acc0ba58f25edf85ba15ab754baa4e0e74 GIT binary patch literal 58217 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 z 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 z zJ`rNwKxd8m%F$80A2Ss|uG={2A&@3tpW^m6lomdcS4eh_HebHfmyM?zf0{_L(xj%> z1xo?j9n7TZt;}B2B{gA_cpBuVV0ma(Jv)}cu5dK{T z3KLO8ek9yclxz0-#$_9XgFeu?D*%{$-wRArXiHpz$lD=g5CR9^ZS|JzJJ|7_!c})0 zFpbu1{94=^5T5f-TX<6_<2E5LM&)U!biwe5Racj_Zc!X|pHb_@IM!-YP}Lw+*|kAa{!ihb^WMj?dA zEdyECeq6==8E^|b-#Zyz)CF8Zz&m@&Kvz5HtXq{%(RW4`S>KPiQWS0wu6Y%ghZxd1 zKy@aS%DEiUR8+D-(G(mT17_k=oa?4Ifa zVvU_GUv?E6XbfXLrwtoxD2@^|)ly--i~Q|%KN?4Ttz$3d9eYhEmdN&kHX2-pvo_LE zB>HXFjluI`ppJa9WB1`u@5WHMoAl-PW_#9oGD5Dtyyk?g9VNa5Ouv05?)So1{he9g zTuMab$x_0CtG#7?-ra?9K;T4DKMt#u?h4hqbSvL7F^L<*F(bI63g)-(OJEs^v6t&A z!1l;?wq=`W^W>ju$kDVYNct0R;-sLm%l13sPsM5SyEd*YAlm)laFw&FMZ_J`S^-3+ zB<^DIsg&1Cw_!`(e+a(2w((0_jF77?waQl?HC~PWOKF)K1bwzAAOeZ?iL%>G{M6F6 zOFRB-^K`#K9d)?Z<%4=MIe>|hw{$GD*|h9N%`S8N&PxwhzM=$%E1Dx%Ts=qa5>Gb5 zr)sYo6kjedl3KSeeU%_&_$0teP1<^wC2f$=9mY~NHi4s=&a-Mmc)tKIeCgvP@ODcVbr@pjRATB1pB?0k1ME*&~5JNw0BCXC(4{NR+_wN%S|jj zAz5-4Fh$Gg+;tM(X4BrIeYx4eG*K`2y1|dl;~l`ZZy7cC%Jjsq zOJ`>#_?<4xw-a!pd_JROwbZ(H=@-g;?(8?v7v_U``{E`4Kx3CTJb?quU@=RlSX0zs z3yxxC>!Xe-KlzD}VDZ6lQ>AmR5FnOe-(?PVX0-o%^u2GRR4AF=AOxo?>pFBeF{#=X zZ7SMVEFS`NGN%?=67fym-X5hcwR1!KPlP-TKW*H$9q+W5+P5ZT!%lg{KHU+Ug z>YOP)TzGH(j$JCOt!s&XaC{?G&u4#LaZOoq9}rAx;SMR59f$2|_T?*T?o{l@ZGr4~bGf8+IMpd|TTN3dLpzITVD4j@NE&~05 zsWVxUxOQEj(QlJsbc-3=v2ahF420f|Br;mH)-h?@3yl#-SY(}8OVu3da_~EmX2?YGC5nN$6P2gn92bxG{z_aI;DFp?oxcYKJgOpXqgJ+ZRPL1P z)5LR7zvjMt;Mg}NT>GM+Do0e z?A0X(3~R6Dt5W8MgCmoMT&~Ca;u6;fJqSw1*Ob4ib_%#4>uu z{S4q~mKM}x3L>#q8Wnci@ueEV3vM1a`LF&R`ZF8`OV^G3#hy@Fi0^?>Z>Q_O{_2?M z!`w;s<0e$yTqR7{v}7*6eK8iO^vFVVh!CgmBSdu^?P65PL+&gNj@A;-{(*H#JI}UqYT- zfxy~_apBICcU99WoJ$F9e${imb^2aQ3lFS<9AX}u+`+ovJ4d&hIElz?{5W4dN!!TV zw1j;kdX)BXn8=;_Lt4xPq64;dHu#qkp!i9^7h@~HQnGVLOso~%`o->w!%HX!803@> zx?up}1 zW9t$d9N{4wB;nzh;-bZW#XI|ca&X*{Z8Ut5EtDfH%>D0&zqS?&22}lwR5F)E+hQnR zc|{w9>(2k83_>gDuC^WY73mm5I}<=UtFspo1_YS*!iK9oY#wl?GT7` zq!^08{cds5?E#~YhaL~CzIx_92nCF2To9yA@j69_K_PYGj*8zw%;5pTAGowC(MO9P`pT zdizUS-!E%!oAhB<+R#1hJ(U&s-;&f@@|r`M%sS*A^SXN~39nh2;0)=K?QZqg=L{v( zxZRlLhJ1j5&4AW;y{qRbLA~k$=7vjdyDyJ49ntW$gmpGK$|SiA7IMm+36qPUfrZM- ztqCrdzS%+~;3?fags-%l^g}Qv(%|11Gj}!yeO_996T}4~g&KiBw!Al6^l19z#1i}G zqQ9B2A#2cJ5mKMiaRS>p*e$z+10NQUMrRQ!&=6H3i5nfwa(Yg+J9&CSIdO*awuW`( z(Afw*ZOYZx4EgTw;K;ao9>}xAd3=u46%Z1WMSCmCSL^_)W_%;{i0df(QjAqcYnZf6 z7lY08`Yn_gsy%2uW4XLKG$g19<~py%&oR9q5zqvM1t+-X*cKg`Y@d+e6SKIkfJOH9 z5ij13)?8LoqbGmVlRif#t6JPTH!pN$8J*c;VfpLBd9S`L0Q9O{*T~EhYxE_xXfFuT zDgJ6p#X@|qS};kn@Ws)0o|^NBjm=J6_1TJG(X7{diA?#KyZ8_E7roiApBfcDZ$if= zO6BDT7Y1`Aw)cMny;N-bj6nA)rp@%F)m79$-gCe_8xH7DD$P8H z0LcS%`f-A7&wwpH%17XG5^J&bshjT+e_WzQPw-*yKhUJT@xiOgA$DC;ewoX`aJ7aX{)7;ymMb3s6*K>3@67IjzI*6D<9~9+@uT3*G`|-m*2AF-$ zikG&|wiE78miwrdLCISi&fY$NC*TmZo^kijn|lKGt&h)!B;Cv`O#&`}C;f<5B19i3 z7|@G;u$!SeKE>T$#V*#{EEv(GNv3R?kd&VU_P%=j3-K=AFe{6^-NYj~R2C&*@3Wx$ zS;xrV>p#T|@~l)icn8M@c+ch1;7pXb;l5{P@7F&gzzU$G-?<-QtY_~Yh|Q&UGzA=1M%iWRrvIzSllLEU&mB%EeyHD1vrz<$U>v~zq1@I zH|b#c6a~!r!})l#4p3%F=^qL|nv1Juv3|`h4n_d8dBz(l`tm^OC3PfUV7$^%ehQ&~ z?8vd3c4+vSUYR9X3)^&5YHiyT5e~L2zg*j)t>9b@iceEKE4%-=&IJTjQ zmtHE}P(<&bp{6R*n|K&(IkxMy3C)xoo-nOHc@Mut#AXsHlh9!62=?Tu}^xlb_ zo)A50Zbs~Nv5Ijp3u19 z>y$?ud$|<`3O!o3%I1CtXwoAa$c`i_&NWq}FXSSBJq4feEknjlM)H=ETe)%KLv?PE z6)&0@7hCD^<4*!P`7MV{>CY`Z0eQ;c8^^u}mw6xC#45XAjw|(f@il#&QKSm?){@o2 z>7fU6Z5mWCzgoEVW3VaEw9Do3s<}Z&&b7ISh<_k52(+j5eN7|YXBqxrPh@uenFZBZ zoMVe{?>e+W-l%9}UscZjEIZwvy0e4!2hJKim&@Dn1LDlz6Z=bST;-ViEnp-s1Y}o^ z8#}pRWR89Ggl7otrm#hb?oS%;a=dsR*BQmO%sy>}H+fwlz z?oPq~Kz>ma;eM;RRAVRfH|u9j0&1;XDjuPg>F+{8;dut4^VuA)&%+} zk)6TMr({9~-X||Up6B|gX+TCnHtcP7EY5w=n^swlk2!Q~fG+%^;TL|R@CuT6cw82@ ztw|@3My?Bp^hn5)S}xaZ>x#i-_{t~EM~%9Ff`0PcQ`o*Y`Il)tUDRmvdWXr^ z|KEga6Zsh1em@$MuhX7fT1;f?dDjy68(u`5y;LMxwrjpsL9ED#NOp0t@ju-WeGmul zPg-vR!-Gq8K}V8|(pE&fF^8wtKR(%)kligMy5zC4o3)MIu{q?UdF}0n$ zdNK}_BT?ISu{~;nF)~p6Bf;4U5cz8?>AcDg01J6=5;x~So$I4<=aE%UFO~Mzgl0> zm<_tUj=Z*;-aoO|FSy&s-h}&4bYv{W{Fb?@=%Z(R4lh!lYY@ycLj`EB6~JdH?_QH7nKyH!`d@6!w0G`(nV4IWdgKfv+_9 z-&9d;E>PXC;VqGl8}}B_(LGf)YJ(?%u@UA^v4a$ze; z+Njdo>yT@yPg?3cI8tA7v@Y#oj|+;u zL3w59{5D*V1-zqjR8T6-z?mVs?GD`94)3it=_19SZ!_;VJAjTmc>JsmpKE03g>a$2 zKFpP(0{h89bhS6i#?<8|0^k``N~HUu){KM%j~r7g57=lytt#2lv;~a6kCzq)p?@Vy zSH>4Ynt_WsRye%KpRA`R`!;|BTPM5Al)VzQ+J{yBLO=`PUh_(gLGSw;ksQ2IoafVb zRj+^AAi~%Kx)s{?Z#o+`4c0Pd(L+0s*vD107RNuYyaoN_B(r^ip=b5 z&0zH}EdK0UtCYuuf6=B_+|#&M9^l^nO?RJC{8Cbuc zokSw6hJR_VdcG@LNNU<5L{B^oKO84qBozK8DU7RVc%Q!Duw0ba#!!Z<(g$x>Wb=We zUK#7S-|h)DqrfYE61uW1o!Ij^-iy4e1~0E?qMrYgHDWtR=%hLTdt;;X6q?dK!b&KF zeV}5FB$}(FgbFr&m3k=N-u$|q&VSWs_Is#QCBCs!y|HnOs8VMIvQ*SzGg%}&0hQMZBT>ravu<~g`GydTHfu^dP({fr~nM)>ZcVnTO zKpn@sO>p^DEl9B*+(2K{1!46Ml+4obKIdEJIppwO2m4$BF0EN=K<4qJ#mV}^yfvHB zxHEdn?N*EO3u)iueUqHxH{rqBr6hLiBhZNbAU;|!_6RQF2@9S&BvrGlPfZ>2<2_qL=}U=O*N^B_ zVS)2gcHL{J54#D$wt$|&@f|o_R446vptOGPKo&oz|2c5(_*FX8QOQk7&o&&iDvy79 z%_|Yxk+q`w&1I?2moGZstOp>5bTq18FWoxZlML21%3krtLlcAk zDw>|+DhI4P_;D@2|9Af9qN1RDU-H`J0{#lz)5#(wwfei0bVZdHFer*Pjw^yEHNrnVkl8WS zgj{D{4kit7X@&(E^edoxT2b;erqp*-6Th@WuDFerkq_)W@+Nw|@6vh2gZzFEU=E0) zy8xBGW4i)lY;WuHYe9GtlnIwN%t=gYQ4t`j1)P~WXKRWXQ$t0tI1Nn z*>rh+m4ycxl)rqB-w7$qM4N8WNem|!K^tx!eufAoYJN7G7vim;1g*STx37WX#f z&F?%I!0-8*+qMXcDkXB{kPt7p%ZnB)bhY(9^)o8PomI0ezbct3FWWRPb!hY)dux?X zNe8(?xuN6bI8i(e>pb!B>T2nYennBKv-%VIVk^;+`W#&_GQJ)>4-F_Y7s4qx{gQX` zW(^#sgk^h^!i2BDqMm?%&br)SiDKm*yEo(mrhS*l8u(WG;S;tR19|&F#Y=Akv>BQyiuq8} z!}=Lhi9ZkB#~40bQOV8!2WrrgO&Q^=%1IqU{l!G{QC?V%`~zVi#K%tCYPWEW%O;Z3T_YPR%Zm=X~;tFfk&q#IliPlEih$GSmAK|JZuW@hk>? zdn8bW=O7`a2Bg-Xqw0;?QD@7$Wg`Dh^7=M{4SY5Yo~oRYhW-Bb%D6sW&Ooa+^QQPP zV!4(=^e@F8uImGeiKakS57?QXslG)c-XpkxrbgDc}Kb3*=Wb>4b=VqPD zFim3026ewh9TLmy&*+*YsU@QWpGxjhg8zE|10_t-dUb}YOzkFPjB>}Elg=tWnsz>q zJD_~&qGIg2*b9`YKjSW|;0KUSBI?n|u4C=UUk`~ZRW(*co;O#ofH>LPf+&p4-HfJs zzlQSJWaifAElf)vzd}GOLgIvrC^PZ;x5Mwc#r(4PkQ&KdxM7Dw=;qT)k7^`hCBBsf zT&cFm^D~}Xtd&&`v-OHeM^0BGJ>$;`wM{^BWSHrd*f}d}j>bkMda;#PFtjBMo40IY z_nUMNiIdB#aIJI`v+Co1W=$j7xEIN`?E+;OtSYwxmdtR!de&`bZtoxH{zebv{HhBE z5L2|B_rGYsSd{5e`#rt#=?h5hU6$4T%t`5?aH$uPzR}@l148`^3Sw4ZW=oA_R{vyj z8=g>ZsRm@VFnQrY2?qaI1|Gx2p*>8gaTqfZ_VxS}tGe}O;o0_eUj;}Uxf*9JPj*<9 z_uQVWpDlAQk#|<-1`~%u!hgSZXX_?9MC&JHNDZ&0j)YNB0Fwna@-aFoKjq;$&2=cS zMz>mLM_IuE{0d%9?gm-VDt`hIOE9zRkp;>}v+Rq+TQ$92K+krnsGiAJ8O|#krBw?k z#um4^g8p8KIg0y>U-5}d-wt_oL+6==p_z{LZky?f9+=Le3hnBc_TbUIglerr@~LL; zDx&)27uAocx4-E3XMiXoNjOrff$x^3k-1kX(B%hJ2aead?gEAERIl`kvfWKfx7kOF zye$bq#b0Ecqwatl|NI06n*(e%no#<(T?J+1!^L{6yoiXb*Bzgxec8i1_?HEt46oEd zb$_79VXfn;{n&q?!@IL!La5y(*|t%QI2|Ka7Y+McZsIIYlFtm?AGBTV z(MuU2+p&HWei!Fo-#j8C`*GoijsqKZ`?YYpLdcPMh~y3|y?P2P!`oa`{a-7V7)Q@B zi--G`Nwnz%P(N^@=443fye*_cuO4z%O)y3-zj%JdNo$xT{}OHByx|i%-*`wuoTm(~ zo@X|tpO9Xe|2lvybF{kCWYu0jIcFid1@tCG17fO`jG)*6?)=D0;fJ=bSl$-}l5SZm zIo#KHV}h`iXIHx^3c%;`{=d|{8a``pzm6rzQ0>YJ8)5ZZK0=%MCE&d;>EYgBpnFUf z4B6WG2Xe5y7JL;re8SkEd-X{uamjJKTLXGw{5Sjiq~xl``}cT`&uP^MSIN z%37vt7tbgXN>{C6O8eS>y7_fgP|L1Vp^p&{Z(fdlCL<`55zI@B9aX2z>9G(B{mN}} z^D&9g*rjW0Le4LhZffxygFonbxN(h&H&o2`+W7S5ay^w*CJ*s^>)7v!y<8(TOb6<9 z`*#R6rWQo!=Q67N`MLo*<~h6VS|nOJruX0Op`AuJSGc(WjJNTJDR^&o;EG*Vu6^Fm zVEg&%qW3;0u<1?(`42MF}Ye#5ubN$~RfbB>RK8joyCW z+Bu^fYa8!8w~JHCziY9Zk^=NR^68>h%(5;Em#L$y&(q>0n1UlZVc4R)-!;HE!w_DT z;zOg}eR#EW&YTtHk*Q#|RY#=N7Zt7Ni_F~2lZA;JfT(P?8Qog*Dl0bX1w%u;!xzrc$q`}aO^~|ort-pwkOYLD({>E4$WN-!_kngGn9RDpTb6JJgN4*w$-#LYpMHLk;HX*(gyI zxW2WY2^z#*wy*Veg$TQ^n=}Wm+>?0^ietq#m7T#qj)x0~+-QMU(%S*|?o-M357z?N z&LqW#Kt zi*+2owxHyD@vZIbx8eb^OZoEZuS1D{po#C4HFxt0crId?69&Ju(6#qQciesK&Z^^5 zLQ}Jll)8!~QK&<7y?V?((+ZHOJv-9js+9x6@VC=c^ou4J>jvg1+*Oa!TeeL%n4UXu ztF?-9Y5fkDofN07E`VDOknyCdIBd+gLA(qv6aR2oCYG*R;`~1JWF1s1b3`-sd9Cq% zCGCLb{fJ_P2kLQw%6f-y$^WqRB4B7)J<~GYrmh!k2WkcDj36pa)qrY_%O+zh2H{hSZ0+5-4R>=D_>o+six30}63;=j&~S9d&M(1Gmd?IO(t5(9VQ2`2dOM9g;yt z(DUi1V1OKG>0?`<&TWUiCPlOuwRlnM(Zi8H_#Sq$W4H1#)yK!)sqz`0jzr#_S5Ku6 zv$+=AZi6$5#cy{VhxVjLg?bdZo-)*F97;NBuDO6ti<1`Wc5N-s=hXIyK8fxV zC-M8`xmX9b=(qfg^n4A0y`5f+Gn?{f_gpCl-u;!_Z&qgWiAywq${L#claI9NV8w;> z$DBeu9pH(1$o&%Z^aK@PZ^ zOAWFs#Ci!w$46AXSym@N=TUwM#jw-Ci@QC66duKjclO+uJ~Ls!H1G6Iun*zBQ{$iy z`LBUDiQJfWFX(WIhulQ4%RdmM-OeAQ(EdIv0){Yha^r9`0{7>gblP?ZtZ?Gf$#u<_ z-r0^&*>$^XRyj8RYt$ieBiH_cx_O|Hg36z|Mze#DEW>G)+gM7TV=q~0VnEn%nxs~9 zn?i+88%W$F7EAl^A+C5TXGMhaG$dtJo404gzyvp8AGvQ*l$KZ~*tq8oEc&3Hpn`F0 zuWQkYTakVK*FfRtUpJOzTKJ%)?D3(9wo_{8H;vV|Z?u~D4vR%?hZf+!x*yN$Q}>|# z+1J)nSGLmRw7QJWL(~b_@2otND9#;Q_LhT%2@gLPzt^}VP+aAY@Ls-rl;!BSX}Xf` zLMYO1M`OlhvY2Ft*m(o{$c$zt(L(F5d~>nYj@YSLB1ioYtWl#$%CYufyX-?`PE zuEIZ6=d{t|*gZ5?gu)e&s zg2!|cK4j_%5assFC7Fim%l8y_@TT1%kNeXqaiq47?YqjHCiE^u=ndzorV zVu;XTwHp@n4;1reaD!y~-*jL}1bcij%#$eFQ1gUu;03iN+0s2zQAHHnmF9hlzz)pg zdL_zF51$P<50>p+-_I!>M^KiCXxLiAfr1vDzk=ASGw&in#>IX6jJ4XVvNq274tpMe z_ZcPr^fga=?x9IGaYwA_y5pfZia-y4#C3RA906rWNsJCzi0}9At^X2q` z71+%Zz0iN4z!L?3psqCg&YqSM@N)R6^`p@}u3D+5XFu%BP;v(W(e&?2^Eyeq@w=1! z3!Gp1MO1xAecM!L)lmT0S!lVHoO6F?SKhPe5rY8}AzAaDXu)lTBRjO)KhQ5u#xFsL zorZrPpv!K)XNiYNH2W2{ueVAo=5(r8=imIg(~CGpsMVt(%iQ?r3e35<%(ZprlAmiP zeSL&glcRFwb_P+M?P1cz3VoEv@!5~2HWtPY{SRUuO8r&jG=p~92<}<6Vi>oz2gH|o z#pfBX56G!1uo6s75_t_f5RJ$K*^BtVb29*Yf?#=X3@chlD~t zc%b9^;MB|Aybl8QYg)kpT4*;Xn&4xQ6n0`l)vqn9#kY`$7QD zCycc<<{9{ov7=7zdr{qH_u5Vm^N!zhG40N3^uAQ2IAgNWGOv+KtC|Hf5|!MEOK05v zkcl8I|1jzClWOTsbdzONw_eEHj(?0*loQp`yV$jyj=av8F1*2@u_4+lMdgxKGH9aZl+6m}}2l?hZN0F3@OQ4ZbE z><3}7*h$ggXXbUV^5Mk_1Lnn-K6rFt=#!0~=pt_UN8w1NiN0=Rzzeyok?#j5scj4; zsW;TjIfJ8I2l2Ji%ltwrHbRH459C$&szYs;q z!+u~DFAjONt{c8+<=395QUGCA&kTrlQVm(rx9jc@e2411Wj$x9sTOci$hMZn)k>DR z-NEC`xRc8%;!bTn+mywA7D{uQsI`4n1oangL~0K|$Q}=^G(jTl+PV*VyR4|{H>(;j za*OLTp|uy(lykkRzfP*ndpqvH7;JjI-Dr?A{_wS)y&|#ZRZ?VWQ@fS-+J?aysbe3q zrKm7_Hh=n+&I7Af21(UH(F+Al9EYWdlXI924gF1wjSK8{wU>K={H+K5i?;NG z9oq8>r$hdbgE|$}Q!vDr^xrOY`rj@ry~^eiaxXrs&R?qS>WiT2z}%hg;P;RD1l}u0 znemZx=S#Acg-c}IG8^OnkT-av`^xE^k5UOfhQ4!+U5mSQZcxCp-{4+L^nwFsWq?k=6Q28Qys6j1ew-M`jmPSm1zX=T*Ex~I$F5v$EG`)+4GdP!@Z4j04wGc1 z1ie+-$Tokx#C1)dva|1Y|A&^Gwi&H6olOYYV*`_kmnRE*iZimT?MTFqXQ{|iGRsQZ z4`c|$`8?6?B@<={1B`GPGklbq6G;NyZLK3?S*L}GH*#l zW}*#HFofdeRVCU2R`lUL(JRrC?yJs)6HCum8BiQH;W_jZ6Q!@dqSOzVvuB;&-+h_n zKOmZs7svVi59$Xi_=B&hR6{+ZnT9o{OH2o$!Up5K@oeI5me%X4>z8DZ4|0F2X=ki| z;@wtqRJNvU!H!9iWS=Dm4x0oB8{@LZwzU%~9N6nBTBUOwu^it**U0zw6rYDFvR%ub zfAQ+X28P(8v;JNe;wQ6?FD|6^m^wwjG0+-dd#XrSuMAZi^%IMKwbL~__}C#E%&)Cx z-&$#3(|e_&^1TPs9tMFT9HWg&`%_aUf&4=1I2r}!hd0!CEcHT`h8_qr)m2n|<@#MC zbbJk%efZcRGCrK+xO~PaFn#~(dAQkXlU<2R&rtnB#IshWZ$?N?4pA%q>|D%`o!&Lu z0&RNfgFSQXwF){NKrf(aLAC%#{t#((VRvhDseR}(w}X9lMfN+;&cr)a5ydwb1Nqs_ zVSB$Eaay`=-j@Y#K3=cY4n_CC5i7MGk_{-1z*@0bp_aNaj|{!gHO<8$@3^$y4lx~F z8SD^?|0#xugb#5RupSBdp90}oqPN`esYdFG2bbT%wG9Kw??q1y+gUl|E*#9SE+bh6 zmK72rSHwgyP;5^|xc+B9IA);&tc!%2S`|ux&1fsir0&{;AjEQ?{=6F7w z*X~zT{Jk;qs&$|0K|1%<@ugIa1S^|3RgFKgMz4`~gDHxc&+SK6swDmBKN7M}{&c87+xK_0{-|4ef;NDEo3Xr{TYkGVksNgmJAFH&QP5dBs4l~B5!#l&;2D_wvE_4 zl1qEUuSV%T!H${&4BzpcMor@?cO~+p4Yv3fYVzJ_sjIb3Wsk&#eG33=PeWr3q!Rz* zGyXij(AIA+x+fFQrx~I5o&P&|xnQxXsKnyMXM_h-8gJwcck4t9w&k5=w%^a1_X_#I z^cEN0puE7cqFD}e@;rOM#yR}fXD#`D;MRnXjUT$3mf`NeoR$y&D%bZfbCG+&Fr^=d zdYXR+VqzDjqn3N3f}7;S`6fTZyZ1tC<~gMXq`2yOMCmzQnh20+528(R=Z5HWC@bZ= zYxCLuV!e%GEV5MuyFI(LiGj?sbS->vkl)nW4lIWK)|?oMYr@!mJx*{hEZ%W56EGdz zXBD`tN|$RK8I|PT|8r%u)F6+#-`u}_HKE2239;a{nW-_>#Fh764_kBdMce(9t zMqb(74R1;~^>LfQis9T?k;x|RU!a}>r7!99Mv<$~mILk-0aU_YHvQ|$gFe{2w|&rM z%i|B9kvbUvIHaPUQ$xlu)>pJvSO~@(2qU_YSPNNlQ&z-H~oHe5Bxx zyzS{YW1Pxx+<+1u-T2+ljNc~N-}-q3YCWNni++Wb?8Ct7e}VGVZw;K+N_>SB=%2sY zF#pr!46toK!df`=p_Uby4C@4JyWm=5LKKQ6B7nbB*5A*9lUjMO_(ZB&S(X>(htFz9 z)izldfR;Y{`-}=F9>wAP1F6YrnRYwvtz+583YtAS!S6kCkNp&7>bUV&RVp=5Pg3kK zS6dm48P>Wzmfa8~88n-nNGvSy?z5*>p0~IWeE=^?#3(v7f^fuvqC8jpX7$wl)tgkq zHvDYrTMIx@UL+CZJ?ZzyyvCRPY(32I{!s-eZ-{(g#R}`bJ~eP>S87P7wKT7a&=(5F zBO;wc%+ViN!zLKXU5RxWEwKEKytdDyHKWN;p)FQSulz@o0I$zc48QiFWEHcQ zwYa6M_NN?oph)j#fpL=n*`f`Q&SLvI& z#1&_9p)-tUhB_Ud2jQT}(s}M*2mYh(6iT_SC;HX$i4^EWo0JTbI=*Vr=zZc8NxgI% z+mEeS>7rAInZi%1>VI`{Rl^fbkLnBct>` zjRk+NamQsy^)5Xx+AL(TNuF?J^d&!N&{ZlSsm~BTi8RxDB3X?@y~1O5rdbJ>AI!an zuh5-6MT{m~i;{bk+uH?1$V+#B76DVoUFNLaJo>Zy9sHArZpx!@E3)kyWF7mEof$VK z$_XKuWMT8CA4-ef%v|CIh}3g3>rViZhVRGhxGd45f5Yo|%5rJc-LES}Y-WGN!nPcV z$#Wb}Z?v1Ic)dJGz-c!!LX3i!)N_$Jb#@0CxI90mwxVQWAz_1frP|^CrJiqM#wOEv ziDZ)7fD38BlgA<6ooW0kaLbx2xWj$qI(_Pk$y4<3A&T5N3z%Q^P_`ht-+~|6@Z8nW z3h(3ZlGD$)cD!=$b!9ZzIgm;6D_K5glSYs14CLZI&>%YRpwE)m%Wv_PJ^fwF<#9pK ze;>=jo}=|1*Lu3rfSZ(mBvzT~lE?ddrX4$}lfPM+MD z4>*=@>HDe=uCL1+3k)nqIv-NLvvALEnOa27H1PMVV&}!csU2zN1ww`?ck99OE|c&Y zsLeU4pji%-s}(tKbw8cD=}fZ(EnM`3QfMvKec<|4f4enB_%}2cW9gHtCGwDCbw)v|DE(TykOL3>`L)3M⋘Lf^n!#9zozkpQ4tYpa=XjY*(oA`r2p?l<-4R|Z z8*OcCXrjP=0p+P5@tLjA%C$ap>}TBLsd!<6i;@34CFi}ZsvohP5@yg*)m{c}?dlOW zsvg&_PY&9&7Z&!jkfM_q#^)5RGoJgl^$W~YbXb24PMzP`j940&TT524wlp$vBR$!z z(A`Op6+icZrTt4xg=-hlBln$o%_T)BF>igCjjadL>4-gUpC->xDu&~Tp1K(`zl~=+ ziM$o?WAT13D`3;s2}thn`B_#~rtx_3VN41IG>w6t+iGUpu)7J++}0rUL6yiEiRXY) zze?@Z4PI*YzZZsLZ;RAQKmVx%uoIW45bg=30w=T$U_>*26+wQWl(cRkkyVveP$(AA zm5Y*MNlw*r%Gv{e+h#)zL18B?boTda*)OQ5S2R3B=?SxG<5Ez3DV*aWFkewa!aW_C z3!lWom3Q)Txx8e<4bwZ{n`)YLf1@~k`SeO?q-Szz^x6EkUR9_AM{7p^S$S;DuJcVY z+NyE|_nAg;*1A1DQ1;Ns@3E-=5$BMGu=V+CWPiDj75}jLHJ#EzV!>@*J_*Z$&a%iN z2FoW9NmK`K$myv;MGtfR^rmS`!tz!$N7pdE{ednxmJjA;|2ItVal~Sf?9Jb-f?L0? zG>RTEECa(7TN^o~RqeGy#01bWl4rD+*Nhi7jM(otXvUU}vc-UmS})K?+S3Q~lb~Lz z=^^lJGCefy_A0yG?d6m+y@BegW1ul@bF|$N4pU6lx3e>fzOARuUSab)3CUJdjR#N~ zK*)3Jg2GFmKYVYYxUQCgZbidj_}>ih^fLN@W`>f5*$EH`^qZW+6~tNjr;m8RcQ59> zTl^++HmA1nyB}4i>?oV3TBQm?E{>L@AEX@vb(BP#Q1%%OZM4=2UfjqYF1opN z84JC*+J!Bv=jR-$%{65B9YFT%@{4nEuR{UOh6kDkd8-s2R!j50z{;*fc)wez?-P*VNsUA1@nWBcu4 zGZ`QQc7aVMMgPb$f-6oUWQ^tDAm+K;ziSXs!RUjiqOlxjOG)DSG$l3D>*^eP`!PJ7 zyak&`@;YbwHF&6Q>NZ7M-%Fx#D*3TK8X+pGxpT`GFRpp~O>?uwi|pG9mD4YX(sP%C za0ayVEy)2@uyYrAD$K570~6eD4Oa>(7$d9UGxOjK1_g3Cb|QJsFxCDL%vj#N`3nRV z@5{xryE)qNq>IVx&-wFuZ=CeIF=Zu%M-4UG-@;7(lYr&_AN}jx&qVU+;)Fae5_8<$ z6vkI9rdS_y_z)j^c8U58%dDq=vN4UUPOE5Ya$T`w11<+obytVvrq`?ci;jf5BElEC zKNxBk8zGQnw|4T$lPen^)%{hU<@Qz98=Qy&>Zmg7*Qi}v%GpzP8!9zlwojfZZk_Je z3vBp;=C|(H)G502^e0;Bvn^xqX5Y%wAtGqeCi$T4={%76(%Y@hc0{eo7uYpJ`Tmqe zAUXapIx4_#Kx=$%8^>Q1dAB@KDzb-UQ-`cO| z{t)|}{}~I)(*sj2aC2F>Y}ilAdv&<*+&Y>*G`jF}hP5 z3)*#Dc712x7;Y;_>Z7QZ-{hfId8ftBSft~38fE3T*s*A6{uf9IFlV{<(jdoXvBT4?+EOyBbU{@V8&2T#03~T@7lO zYHg&eVKW%n_nQ+VgI8FoE?@<4}B@m-y55+fLzKST% zvc8_Hq#5r}cZ|_H_ZB(*`N{MFku>$lO1okko;Kr5Pfa-Bqx+$1FudZk5B6 z)jlU?mn>b668VOK4}> zSJ^&AYgr9ESq(Zf>)GmSkH_*P@I|U?NfVkGMN2uW-6D2#kL;w08I3~w4omLL^Ih)h zZN=Wn^YgisQ7BEUb6VBMbe7%JM?&_!X7&rEq_nMcw3+e?@_+Bw+gkad!e3Ix(?rTB z{a9$OT*U2 zA?$0afE%)m2JUf2lxt4yL%!s{k<9CEB?YhtzAtOyX_k)%U8daln=#O{$V2n`9bFv~ zlfN_uwS!(KUxKmkqVy{^(ESmMmmAd_o5zRBqB-T&KYW49LLoPUlhakRJ)C#ti}Q0^SPbC>IxVfXGU?9=dhuvYf9|Mz~gVqO_O? z?>Ecnk!C_26rJFmAkIh;W~!5)_n2FKHfc=1w?rW3+;=JhjCO)j3Qkw?LFpL;@g_Ey z&3;gxSMVAoP8Cf_Ia*V*Rd+Y3X}XIFmtiZjxO6U~Q}Al%roY{qV}iQH@wRasZF2UIzXSaWf17(d_%+(L>ZZ^EgHK zJx`+a_GOE7(v|b;!2%)2^mPVCJImr?26g3P0brsT*qptmxRvu3b&>_jP-`~ovGN1C zW!b{RBLwmt(Q;k|i%Off=^ToXhKAsUclfn(cs3I%9}rLR(SP7I#ZJeg7Px$Cst-J7 zXWA#+i4t6-3MRTIHa%aos>kL@F{-Z*udy}2QHLTfRKy!R$(VUvz2EI`XPdf81ALF( zS~SJ(NG(@$e+}ely`cxnkWB#n^(kz9Q5XRfE6|mQA||-qp=!NLt{J_c#cNpvDzqy- zvVUW?+^WW&`<>)&dWcDWQUV}yNLl6WU9;$p4xwsaF%qI&l(=M}cIi@ut82s{L7`Q8 zB0bOvnz5T)^%p7o)}DEI^~5j;j+Bi(Mgy5~Rwd~EVdL%oZ z@3Q#>bRzQRXnu`R%uNyb0s?k!tUy>ax==VVsN`*m5pw^+yXuBW`@26?{;O#^W*B+e z2-wPA)6zJw>W_V#k)il%3R5|WBauIUn?9e0ia%@EeV_U!ivKyBnj%P>p@c!`s<_H3 z;kBMmHVL!)&hvdAqOU90H`6H_V?7hr3H})Dv|SImolTPKh}ASXMJd+kY1Q92Wv#Ec zKUMb8+Pw-QiP}_E&Q2Im2{)-`QpmTuP}mtZ`EqU{45y{P(@5Hsji!+;%*ih7#K*}) zZONro!toxo7J`je7P5UQW9uZ)93P2HH-6c_tHw~o%qh<#Kk|w!tyGzisy^tQh>9|@ zSdjeps!Z8wrov9((E4aZc=#;~zgUtkkmUO>=bqTC{qoGHf$7&)aG#o!hN^lXx!4*5 zvNn^)b&JI-`l)ne4ar9}*3s1nMGEKmg=hMt2!VNJr>ZT##^eUS@%Y&{uaJ6jo+x-V z$~5zd@h1g(We#fZGBZwFE3SNXD`#!!jb0(GZ*Xq0irg|LP1=O&?x(5a44;ws){3Xy z@Hc9Zg~f&ZVN0qYALPJuP?eP@pR~Z5nfR&{x z$NDW6f{fQEkx)O#{VV!o^s-BSNuhfrtusCpLb1lAAoKW*Zm zaGYoxiC=d-tW-Mh2YH62{nXHB{$xiI_Bc{yV*&2tnvOZBEqPDA-=tHGk7LM2^6D0f zmm$4eMFY5$Unu(WfoVgCP(F0SG;~ARR8!Z&U{{u%RKUDLY1{E>`jR1c5g89?+Ks~0 z$pC-7vXYD>6@s6TYkG#+=OC6cqX4i9G4hB^RR}+CM}=bOwPOcw9fh-vy&FNiE0Qyv zbG;M>_wDreP*NLGYkWK-bqtUQ)1Ag$bG(^X%(BkH3Z+7edx3@^!bgl3k5=cBc$GjU zzk&oakI)on4<@K_{8p=R(aW9H==GvRjI+r<>ouvrUvpwJFbEhbv->uL zP^bX{0nwu}35ldTJ7%r)76uv=vpd{1t5>8e_lEAjM-NQhl(U}hUQ&_vygV%*p4*j+ z(ildTv(1#amI>(V>YKhxIU=d{VM#P2psXu-xtlidoqvo#Bl%<|uIFi7B*AQ|#dP@g z`gGxE<>JSfk8L;vAYZ)25{TD8Ye^wB{Qd417@@^kPCO(r)2RfKMWd3-$pQ=q<n zW?fxFjlZ}Jx+Lz_H*tR^;Um#8m5{;qdf0~8@j&KAq}1^6xL)xr^WFkhOy0nxw$fej~2rYI-#QtbkMG*`IE}yKV`Km82$XZH#8za8 zUKU%y$rE!2Y2dEmnn#q~c%(6Vs%xoDz=3%2*6#4g-srr7bu<0%{|PHHTYn<|X~;LG zSP%QO>y$b0XiY2q#?9vb;+Rn_JneTLaH6Tv1v7sSSL=(FUe=hSe8z(->V)RbBqvh@ zyD;o<)5Tem-kkSZX9K;fT>KJ*2vV2$@%gx8?1B!6eOzc_a;uWIrCf{xOSv#D3PLU| zcQ2+CYIVd~sqmD3&>fGlP&e%d8zrpeU(?N_16poJr)&8eF>0e zHl=xc3JGLgkEHCUp$Zy&WYTqn!K#Vnn5js@AU1i6&PZwue`r3ej%L?SUOs58+M3wE z`3vMh4Vo6>usg!t>usrpWY@AV5=k;@g1&a4w1G6j6sFcwMuYo)(>$N|WInr>AP|1* zGr~oa?efWSq|hBv$*-3kQ4O4+5iK6epVyPy0h`%V1AlV^X+|C=qX!1u2jNY|0-Hey zA7S5xn8IJkv8a4Xp^KmaA2$awD8uyX#|2G>hiy@q{)r|29zQj+V8$OT6S@AR{zI6g zRomP3!1V!m00#la3)!Jkj!v9EQo_uTOdZ`$kV+8f#k}e`5N?=qFF^D*kKUdsM5c`M zUld3paj?xB%g#;UVQ;G)W{r%PIfjinVn{M)(@i z_#eoBCVcOe(xD`wQ5oVJCT_emg5%)wE)p|ENf8!ZJM8RMclc&+Yqiyp$%4p0_?nP# z)fa@+RQ@1BL_8gXwRfN^(By=fm%qxV|5?8N{|i?5zrrO-ll%yei3x{woi+rqJaVwL z5Asx}#I}Sdt+6=(n!5>UGv7{}ePLPuAwd3*v&R4KgLJ21t&Cc4y7%ccb-0!h^%e;$ zt;FtU-=b1YF#A$wJ|0XI9fXp{(C$dd>3 zK3#dKa}1C--%Aq1m2FL0P7CBgB^gY<^~`Xtfu?;+Oy@mbQTgq^7j+@ZU|<7 z>exma8_O;Zh)ssdBe!YDF{bZbtr}5)IzCm@yrG(6QTz8-EfJgkRzZcGuuX#$I<$_(* z8=3qC8IYZJ;dXm|R+pfD>_$qHFRVK7e>H~xC*%Kr-~GS6`(HR>{4*_>UU@A-lJkRC zHUK5r0Hz!ZBax^Mz`{oz8Plc*t{KFFv+wqjE<;#UqC4CobF<7wc{UN09sTdULBs1| z(MPBcGTiVRiMeSJY0U?jry>()PY3{m88t~tXgwyWgY6q^{@C3IaW4FP3Tl=S2+4ThCX*{SSYaVe0=-ZS0g6|4EKd|mv) z{-Rq_9x9@Z?fWOiFKX7^)?NSd4f>}AMC9+z$U;Jlg7qaw7P;|Nh__CeHTiX@b>19T zVu%J8m9aZ6DlEC;Q~jrmZuc2I%mpBkkQn*aa5gU23@iH{bEo_Cs;kM? zB17Q1G5_wPe}o=1!J+TPt=30G*x5}IK6-oRCqgLf@-O?Gf18UDHJi5-SkEOw>)&{cSk=mRdNOlPZ`yLvgNP9{03cmBWUlFcbO4hLTeTn%Bo5?@&d3of60F(Gn zefY1ecxlPlYpZMca(U$Oh?kSEy2_0-+MrkvPdQJy^~8VnHj)B4!25etY)cjL_k{Ek z&n0>ZgQ;1B)%~}c?H1VZ<)dbu`%3(S9_XmRu&~`0HBC(maZntm+#OAStfP3w^${#>bLsh!2Q>)k#aui+Z;IOl`YxdDo!f+Y zBh!a}ia@0UyicN=2657XYP3r#$u#Jq>RpIP_ZJ$3E1UA$_HS=P-*e~7cwX=LaT&c< zUi1ufzSm4h^yDRDo4r%+V>8x~h)ZiC>Lov6PqMP-n)x3V_kU5Y5ga4Fg@ZA)Axr(% z4KJ;{Te*+=k?y@TuX0zdYJ$COFHE%h^QEo!jP{Im2hKDr_(C#A{A}&$W4SWljS32k z;gu&mpzm1^wu%)h6#s!XTy$>@a@kq_1!@_@&ykv%`9c8JsQjPi=l^TE{%`&IBBR_I z>S>Th(~xNOg-k~!6qL}lcVggknxioVT(+{>S_6r8()iFQFzyIX<^Te3ob><{N_J)j zd9aXTzA)uLUFL4`OSfs7ey@F-ncpmA8taENmfgVLZe6T<_j$oZ1Sti} z-3~bw3BRfLg*BRK2?)#?rFwrS3q^(2DstJ=-KYi%dgVLGOk>5{fM;Bu6cwy)qVyjWbT8F5e)0<`kcGA9aeVG;UXnkb&52M)E^rPa>q0m5O%!Jy z35wH%o*C;qZg36+1#X$hQ;bdRw40FW1u*?*8o04-Ox``1=g3sVO^o`X%n*gr!V9 zc5v%1?7V7x>!p(er++99C#2}nL51(pQeBbWL*Eq`Q_9KvSTqEVz4l|D z6L)G7rp_ho?3W*$egrz2+k^l98>hmYxf{oQz+~}jXQ*U2X<7_jVuh7Zm)TTBc3NWb z*I>js6!>JGfPgT^4^sW)U0&d&lcQ8oQCsTgAmtGH=Vn6@T)Sk6x z**M^hV77igiuE;%5r4AQ|M=9q|2MPr>|;~Gan9U7$NzZ;;xH)%F7Iw~yoOYl73n5O zp8H6@`F6P5-f=6!VAa<#R#xxHQ=>06585$M*frSV7t-_SUB~??euxeVqug1(ezJpfz!db;pdqU5$@prUD#56Q{XXj`mE(n=$)1{5=CFR zdLF*pEe|kuc_?In_}kFUeS1d!m_72d!zC*PHbLEy89gGUK*LY_sQ?o)|!no)>@{uVBmr%Sf_Hjz`uEroCA+LS_*(oN4j zZBQ*gf$lfixXf75-0GNU2f<#sT=%bXvtRwpSNgf>S<(ox^~fDH4lQh+OYZNYVh%N@ z9}P3DwCENtl%RSvbMxHV=(CzItwLCUr3zCie{<}`N!eP!hgk(=WgvF7vPIv2e5 zS>r;z|2iV9IdjMZ(P)}3N8;rEh9NHa z%c%q3Ju1yVq7>!F z*$rTMJX5(F(f+>PrEWph3%J*ujVaq}o@QlBc8Mz{tr49Bdq+qGcZQOsg9>7PbQsR{**IBSLzIpiu4vP&}*x`Sc(4^^7GG-&?4!^(s3~DEkmnq&-x)=By>pVPPPu&Q+aRuv2<1Bd>4aG)Q zjGqR48v6iKLuQD^^pQ&hlfLv}^Zsz8 z!%Ku8mCImzQ4=Mw8f8-<1Pn@ z^;+hI7BGeTPHL2c)7d#FqszbW_lWD=dgGp9_8n3as`a16MT2u13z8+^xBA zzLDtt?&zlugPxY>~5uzY?oTi^ZxFAu;)$=0t#eo5@^G1nIJC#%gp&e$e zI|3h~-x77cb7sy)6 z$V#>NO&y4NUx0VV_5jTONecMj{%8lCv&L=e{;?T=o8ekf;9TlU?+9DPddZo-lYwWJ zZ!S{bZ!{l-CakRJtO}b*?2f`Q}kq$dMgkVMcLn$QW5b`9B@{c~N%;aA)?ybIYfg~r8G?ud@N4}EH zEWD2y+k-q)o+0Od&F}YdiXFy?#Q8+YudL*GxsgHRVzqbY2}nD#{W7EFlxLTHe zK7SReyDJKz3haD4I5rnG)E2pNO?3IEVvtjkMnZ4!JYJQ1EKfmYS;SDnrNwRL^0}Eb z;-u#YePylJo@{0oi@(R8@!s^SZaeu|LevIYL|bkYSsxcwyo2oZq4hFP?T*$n(31vQ zJPumc0AA5>Zp+FB-c}!yFIQ-QhQS$)3b>?omU}7RMrG-+Ao*lN;k53$@@Wr_? z_wq0|EhlbK&^>p^H%cZi0GMRs9C8a2G4O3fw&A{`b}!kyRW4574regUnu{PsyuFR* zaa!g=ScJSIaRX|mS?c`@aEu^B@9O;pmWCI-b21nvgs51R-758b7jAMXSl;ky`moN1 zw`J=1t)=#+)3xX~XaSQIbMNZOlVqaw+|>?US+S1gHM>XQC#oR#!L7JID9(Dhet0e~ zQ%q#s!&2=z!+k?|vXEw$VgWX8HoOJOk<(T?Ey}5@ucMUsdMGo5?8SN1t(M;gneTA- ztmCrbUAkVZhs}1mk^}fMck@ICfQ>yO0YBky6VcqPFn{Ts??jmDU3C%RCvLF6v05R8 zI2U?!>>&rD&e4Zk+`;hd*&vTyQqH=6fw=Wa<%pXvKckkL=$u^#Oy1_Kic!?D^(3N z8vZEs-F-%UEE-B{-dpl+_k49a*8}%%)<_709*LcZ!FICviUze>^N4QkF=Ku{)ZjDe1xv|utdFCTOL+{ zRYQXFugG^V<>=yq^30z8~h2v9Br%bu`%gv{H};*=V(v`+fEu{uWz~B0Z>!cUOkpze7?E1hm(}TK z>bm)<5lm~9Xxri8ZX3C$y~h!L`8>_&R1h@z>QXOJZv^*y962@cidVMBn;NgID)$Ph zSjg?jTKL|frZZJMx|0mj)fRbtJVj3iX509;F`*)X3tj4lgM+A_^%2Y^^?(Z} zUym`>OZCc{Ib7Mli;`6)bzdhoI>_3;;|IxffQKUZ0Ty=Ms{l}=mzy!d-CpgRtG&C~ z^u7f_=D)o+6kK9;2Mqzv^=fEKsdarbUkdHh0aq6hC|)mJ3FV@K{?stEcA35hUUr>D z6DVBPOJT&~bhm{*LTfv)ts0S1-;sEi9?ytDn=JxY5V6yYIN#Q&!+1VV{t{SY)X3RO~n4{-Kec-Z5tv?$L5KUpdYvz3GWo7;F^r(`aoT`>ocpEUZLr9Pk+_748WWKNy*Rv9PO4`%K) zJW1*kOSdVXawQQ_ov^EY_?G_mnN|cl>yp2*F< znAtBOAs0m18BQtRzO9r}$;7;>q>7 z^-wpkt>SO3aSLNqYRWBQW@^AlT=3-e?U>BzW4qLJ1?wo6(Kox#A`j@j4FGjjjw|=N zA)4Bcgn<&<0Lw<{W7)4Gr)kYes4&CHT80w;Y&e?{gZ`(FWVeSR2mIZl43%drYHhHg z;Fm8Zm0#>;t)&Zy#e>;yyl`jILT(d#pavwhu#GD-N9IF~?+9R`F&alLmof=Vtxti^ z(-};zOHKPCQH?o?%WXgV%xgAU$f$K|Ce2`0c6LKYH~~RRi_%U$meZ|}{5{V{U8&t< z(pZ@tkA4JRLi#v>3WA--i*y(VNTGKzw@{;BYy>CbmDWSGv}DVIqd_H6D$i1Ow>G_S zi%_I6bJIxoK3$>@m{BT`sQK$;s&1C$+K1_d^Q|onRkgAE#~Lug;2r4u7ka#7y(Boo zw81H^uEbYy$Gd>G4zWtO?Fhdq?ND7x^>Z6$1?KId+!<1b#kW=h?Xfs^hFb2NrQuk9kZcQbamr2v7TR?5&?Nbo)*ipk-E|bTm?cm*HkykOP(dGmcn6;C%4DRhs#%LZYl{S_a`@Q z9HN}qx3TkN{b7Ne^N;!YaT{zIHa52Q1q)z5uAZ#Nyq^_h+^Rp^;;KIyFd8TgzP-f$ zt_v;mttWVU{#$Qg(FB*YgyPdRZ_9?F0qZNN6yc{ z4J8};_w73{oLBDNPiyLox&KT8DV@_NXBqOd|D}X;l=o-zmSIQ|J8Mo;eT-SK6h>qL zC5)oR2A*0Dh>a?)(|Xz+++Ud1s-ylNmuiR3$YV@OtyH`Hu#>7vgkH-s&A*3ToCLw? zl8Yev%Z9ovHIUJCNDW0|_~lrcLd1P&FXt)|7rRRikd!EiL!64=eZ1F_%6Sx-*r=2& zmau21(Vvn%UUffr9APYAcNIpLYh%wE8a7YIyiG1x+^cw3-^_r{?f0rm0`OlODDT)1 zZQ~2gM5>K5n_0ZG>^v`tN{Sly zSUdMQ;O=cF2BWm=rfth3pI6ZK0G<2iT)1e6N1>>gBM}o?A0#`fCq_aGinD8g ze){vasND4g=Y1lA9C~)FmIoP_EaZbogu-S9g7)6R$L4fcwIqNRC=c=YJOHM#NEe!Q za(2Fk0cI42ieBDRw(Ta_x5nMiufvSp5#+f1)})&ts5G}h8!b)tDK`s3rJXQE8Qoc z6dU!H`cvzq(F||vioOARs-&y~q7(PN*E5gOF=-eW$ZgGyJ88jSK+f&Cj@f;zJE5I8 z82h!m8{ZV7m}TA!X!P`Cn=&iz|i>Q}(?Ur9}Van+xcJL~O+EC42Sr?(#FR<#e~ z#8myXawsT~+|lBXm=>r**ltCspEm)y1j9M;48r7%rir|W-}>H@xlqai-j1x>SF%x` zLa!i39zIMba2=vZZD8@?Dk&t~Bjt?bjml_NhWr%6@CjWRHDQX9o?|2Kt zq8znYs3CyeWyE(%{S?OZ&1VcRcI_QmwFi^56B9cvyA|{|)857Y>eV^fS=h5U++6$X zPQ&oxG4TDb+(~4gd+M5ISbb;Q9B~JZ7{%D69mB6t@YVDNrLRe!wsNXQ+;bG`Pc6b- z+9Va0@o?*}!(s`LULv-miZB=6mZm(CL&Ticu`eiQgIr3{Ad+I8?O0P4wWz$T=7_E$ zop(s#4&OyJ5HrN}#=>1D)+>l42|^YWpp8K~2p!98IrL*u(RolP8U~<(e%?tZl(Vy zAON&}4_mDKT9h4~p>yDa`~vJ8)`XZdO=h3B>ohefjOX=hndS1k?Wp+U-i8!spL9t9 zOeau+`Gc+N)VRkwVaLYyE2InXr6_+CvG*xie9GV1^Zr%SFjR1SDVkI|7RFbpEt$Cp zk$#J+sv-OE`OD^PO}HUhC#K=f2EV0=EYa(Ts{DT0B_@n9>;ip-pU>EjKNfO z_THeC(qj{I_;i!-pL(r@s}@MB&k40RyFRzCg_GjXjAVq%`&E4*aqMiQwl_IXw?6s$ zNR|_UFnRtwD%?_1m|)=%d}v36h%!IHJ3oKuUx4a!|`H_@AN zB_n@_DBA~Sp@`j*+xM&ijl4(2V4=oL%(Bkv+9o z=L**3)Q7tEX;!MH<|Z&d7iO166A1AL)_I$}E-b=DSZB*6Mkh#fz7y*EhX$9>)1`k~ z$En>8di-np%gOYm82alKyvgq`WPVexLGPq&G{4v4YpJ*Bizzg>eU@zq%B6Jc907S0 zbT8wI;Tjm)G;h4hrbW*h756Qm9!F@zAHN;z@-#aRb96SbOt?vyNDTkkA{j6`iGsrW zChSM*{UvSRxf8QDh1i+mayS;-*ycH_@q%s!@uPI>^Z3#=AMG@q1A2*(R+L)Ytwu*s z#3L)&8cCl^M0*gT6~wSn`Yr+(<) z#ijmy`kYg>&!drmzimj^MQ{%Zw!g9un0I18Y?ydYpR?!rMRV0S(26gLOXoEw^w{HB zqwApF!QF2oJ!!!jHP$WkH_Ed9p^E=?=h&tSA<#Ry473$m)62ItB?@LakogaX!B;81 z!r7bD7t~i}8JM>+3X?94st^IXW(JJO=9jcpquk>f>Ux7xhw2--v0i{Wc?LGbN?E+( z&)HLg`;H2Ie2~fS8N_gZ+Z@^VUq<)wuX70X}ox8bIK}m_02(eeI9;&N^}#0TgHYzF8AZ7ygw41 zB43M8{RNr`0}2%{LQWgHXSpm#idP^~?_AU-oLas!2G3X`Z?M9sv&R_21e z1~V%})RhEl;($~tq9%p&XW*X)gA zK&(LaGWXUeFM|DN!q9MNIZ6hbG!`UNOg!LYGkZpbc%2s+FWw8VRxSKNzNxmM(Z<6( zJbNf7e#F_AT*T#(FnIcm92x=~t7F!fD3<6Pf!;!{rfwfFcv`36^)9XD@!vaOfcV zX42Lb{Qdr$Rv{g1MJ|7#JDBPdMpR#$n(`zId+ptq-MX+L_o2^}B);kKZwiQ72H!A9 zD;<#%bhU(V?$`H|;Pq49rvZ97?^N7>a<6B6*CeM5_sdzTH@l{^_02ep_H8O@hQzxx zh`iF7Hkoo!XcJGe4aPkfQ;S5|aMUyW86lXya--i&QqUZoEl3)ZTJ;EoPvY6~Lt`b6 z0R<-Ge=-p(Uba^6(10Ui*necbV(j|k=REg#uQE(zux^u<5%~ifdH=I_rsN`dc9UO_ zCvy10`{uOmTs1|SJZdh?PD;eg_pT!fa{WJ4<;pc93wqkggepQ7<)_Redx^R^w4XJJ zMma=It?Oef)=$v(#ut{B=KCE$7iKX(xU2R(cFCuiREw;w44Cid$qtX<;g zCEgts0~a0N?#c2l8{iR#I3rv5vXbHcvNWkKm*rFaLQ)aCLF@|(?*9*aZy6Qk|Ni@q zf^;Z?bfc7jbhos0N+TjAARrxsq;v@=-NOI_(p}OWgP`=#%}_GHFrNGS+xx%v@BH`P z>+E&T+7I?x=OHYZd+twvuIqihUw!Gw`kL0V2kLRiAhG_pdrG6$rFj8|-OG`_d)I8?r*|3L({aw&% zfsx)7+XZ-j`Nl^wM_U^?AOAd^gZF5x+@~^$;+*nVLi0{RRg@Nd2ABiiqcEmrG8ObdyX7c$3G*Ee?ElD@E?i4`ADu;M!<1B^^(EyBPzsSR zX){uAjcK?%s>RKgEEQ+l*M}|%M#~6Ko-A<-v|&8e{teJo%G?jmgbmcSp}%%t=HP0v zfix@qK(>q=)v~BD9HFoYaL@&YfU=B7R3eXRU(hiZueqh(mabIjr43s0Gw#K+IvECE zd+o&D#)XLGVnK_g(A#An8_#a)KPAHB4;ZBb``Jn;827HpP+i?g&dRj$&wK5BsCyr_ z8O|e*r5$CM%>+>QmD?Vv`H=O&xT^JAfM1&aB;m@JpNh}WwQYE(j&Pq)) zX|lN<3qnPNTSN3hl4h@ylNdu}kG-Zz{TC#gBUWW-1H%iZ_x04)CN^8Oc-<>JK4D%T z+eVlIqTcJb3DloHycn*()7FmQ+4SLB=dUMwA-_>@paU)8wFmH$!E9x0*R8olZtPhu z`*p_5ea+&r{RfqWk2Ye;CIu}$S3cP)2l|JrW5?FWXw7dJE$1i13rrD~DtG<^&3h2%OumOXfZ0&Ofu z_%H|~w^J|_o$1_E%;_tv&)vu#Fjb4)(C8-$w(T_~sY}hYUHj4P^wJZ|8`Wp%{iHks z+k@*C2RWB&La-P}8T-`$qv7vxmqRaliDjO5j;~xc4ltb-1B>;v8NonlgfwOE!W()e zo~LaCcDe5#;vWi588e?g_jOro%1}vx9~D~E^0ZKKh7Au=4>9IE>>aLlbj#aYyg7bY zcr-CTc_GcNY&VM*gbe%9XzVO1A6K?ur{NY{Rbe51rq%g2nMXQ1lspoAz#DSZn>=WP z^4Hm*w!C|Zcmm_=y0}gc<_~#Z-`RD*h(-62qGO}ORFky_@W~|7pRA?&9q{(;os5pt zT)ZS@omRiqJ(Rv?6Y{R)a=BQP(nmL1W2o&rYzV~o-az(YJGafVC=rN_8-2&}*VV5f za-+GPiSk1?MpBtA9j{YDwX=Ng9Nwc;jIzv-;i5ibkKg+)ReQ8hqrW>(22(nC`!|;O zNTW3bOt~oHBjw+*1EVEyF4dSzt-(3xD)xeyccYi`=nn^(DwChB?-ZwzA)AM!`)e@X zv85G}CSfj9i*;vr2>6>Ye@tZZH1?Z97(K~;OkrqymS(*SKPoYB;hW?8!_kna(w{En zUGvBSG>^~YIUaWB++^OcVhsluE6s*8)q&}URMj%b3fahDHVa>WNOplbKyKgIEq_c&*7cWUn z{;(BR7El|`R+QOE%Trf#BcHni?mnY)g$~o9*Qh0lH@fhKR|V9rU5GaPenIDTB-W3) zBE~aR{yogb&&enZ!}nU`a>=4uKL9{~W1N=3j+=zzZ%v~Qp?*sFz2pHmd(9;JHJk@V z)~jD1ZJj-2`!3F9k{UN*gWef>8VQq5{8ZZ6*z?vU!h`$C@OhM_`Wo~&v+L!B(?nkDD%&v4S;Ga~5S z^&s6*34`Bat;$^H5Sv$k<^uE!$ojH7(p`1i*Z#PigSICaD}3p0*_&xE>2m zk>O)hxs4Grg}hSYJYm)vcAT_+6LXu7QOArClyhSezb2-QZv)ml?oNr>XneWCFN_$O z7<1RTW!E2+TcTCru&2Ws5uqXs{X^0mZbp(Pp0h6RpC9q)Ei5c>Ae0s!atv^f)uZ0b zbP9IBGVu^THcj7`pPVNS)J1UgFSC%7{i-`P)8m0UE(pG|ZL)rr2Y>J#f6&}Ia|Ir# zw${Nl?NaG_R2b()5XHW93P@}Nj2hu>8s|a=9YxxjQZwiY!9j_H$c2*hI>h4F_(KmY zuEI3p1Vx72uQDxFlj}sIUdZEsaBCyONcsBBhZfqG1@Mpad`iEUu?shjYazYFG=08r zq!lzwikn+}Mq4+Jh?K zD^}KjE)00zKJwKcl%Y>lZK`dShYS_n$g?CK5hcK$ck zpUBkK)a(L1#=0M;qGrArz)E}li`~Ib3N(0()n<8$404*%t@%?T)OQ$7_ky41U>>ws zYx6w1LH`I(F?v~?-am;;zk>CBa1;}#tgd2LB)Z@jZ%Fw7=$Gkon@Zac&@OvSvE;37`(9W$0r>=Hqqp zly^c4D((h&N#P#GrBk@+Xt|Abtw_0@_l!5<rHmj4-w9Zt+{WXlrSooBTnjNWJTtk#*;31th zn>R%xf?HsP2(JNrnhca56!}qfANr)CKf`3HB~%c^hQ-$R8oj8chq~`nAtNU?i)K_n znT`MkTgj@UQwJERq}`Y&7D3gvsXDnM&K~&#vBMMo=f7gi;j!)XU#p*1(tn!+|EPYo z>D=@UC>I3Myheenhg-wZfboDXP z0K$j^AYdWs%JLqyE8^?6th|9Oy|Gj|xB>V)j!aTrJ@!Y8{O9P;ihl zZx9*1)w*{H#L`mDbw>4swrn%|J|*Uw{j6w3dwGc_NK`@|**g1iuDXj^*A&I4IMc53 z_U$QAo@;_ZGBa><1!k__od-AGJT^V2j6+OSFu%doyrLlSnBYI0e>q+r_tIdmoC z`F6!pR4~We*^;-f^PG+>20x{IkOar;#c#by+4dHjjIFHOT`=r>`*lH?m6eVH+ubtk z&HZ0yWxFgovdn5Je$@k3mpAe!jaJ)fQ)r!?9s$7ga}d3EuX=3_H(aO^JXs6oTF0<) z{X-PW7yS72-i_avdwUJr!Soh+RKhmOC*_j>{dfe&hIjff#u&>(4QjPbqCop1eTw_o5wQAs_ z&vjb4Pu^&qk%Ie-HBP}8r2wm&I{;y|$I%S4=uIDOnL)j>1@MA*{z`vA`7wx2!Js3? zJyFcC+(YLTY)l{WvazCgoVla+{_9oQfPy7lm#&evL|oq(*+;v>AG~3+V7AkQ@q-I# z@SOp)aeag53eyG`gY3bzjGDw zTDbU3Ii4NNHn<_%w3ZlkX5DzR=;9(6XXnL>e*fNErChIrqZ%WXm1vu+ui2&UJYPeM z^tPegfL0DXpDc452sj>LUI3bAfaCtRl@z{&yF0~X#K#sU?(b&GUjg^hGVEaNM<$F< z*c15hKW71sd7o6^fT)AZ`%qRf;0GYK2nT{L=o^)P+Ur*_Q|0QT#bGZ*hx!V|GFy5r z7ax@C0|!6M)7nz#53jidQ<_dMLc zpiRpTU^%G+K9NTci9Kq&(cz<=O`dM-k<~mg&(8SyJ%*e~rPMfG0qCTG!Sux)Rr3>T zf0tN*Ml#r3j0>HXd*BD|zYEiujtk?A7A4h98wdG^>{-6vK!Oo=yWu`2vKO8@5Ax#D zXM`Iwy!p2V&XiY;K#6zQ^98>wlmcuY{A`Pgap;B8_mK1GlM1GwV1DEbk3}ZHex88o zbHS4K-pyQ7m`m<_kN?M4c(!g`xQ&NRmj%0|it#9c;2`S&MS!3>U-nOZH4tC@k9CW? z{PY-%xZgD(`x9bym7eW$pD$7o!x6ye101Rqg+HBs`3ov?R7~vR1KSnw$X%G}5f`(4 z{MC%E0Nnnsd5o-%tHC$#X72@T-~uMqmhYW zF6|nnyiHY>=1Zd=jv`j$K&qRUM=!Hm#NQkN8i?wHE;*O8=Kh7PRaz9dcY!ke_-VuU zPrT-p?t&?1Y;ha8&ExL_1(;9_L;gZxKycXUt74k#Dinyy`~`)2T9Nkr1x3VHWyjr< z0iWzv>qv8r+J6gVqnf>(2m=~;D!0|`v%mJA>hNRlXL~R(n9&MxaCz;i|MV@Vm(;ob zsZ?fl=tU0BDxdEJ>o=7T5IpgN>@bvZl|$=Cf2~AENPqlyW%4Bc)Fll2v+{rht>eF- zpQE#S4~@S$Ecl{ud;`avcopxPd!wAh12~kJK ztj@9$8s_(Bo(=X)GF=`i0#;ZyBgK`!Cs28at4shwczx4wCOtan{^ zInXXDo+X(y-|3T2)EmL>!#!B1AdG=DmTmB4kIdta+Q{vNJ}E(_w>GREcsFxCpFi?p zqr6wB8whdxsv9Wiqoq9DbMrP{KNre|O#m99Gs>EFnD^_`?j}Z}tV7l5MZXVz>fND_ zJ=PuuRhV_#G7!$729LY`*qXAX)cSA@JLHVtaQ;*8>gTe9PDj;+iawJ)85fc?zvMbS zA>F;Pm`oJb2i)V`jnTKet2lzvWZVVd6V1Vf9LK0Bic2W<>{8+uZ>>8*O%96!- z?K>jLBOx9Mxo2JcNdsQ4bknTX>1jP#`DV6KMDC)s4ZufvwlCGo~ zMpfy&;h9PNNKY z5Dlmw?mGjdq|x#~fpm;mu29aKWW&=W!YT>F*JfkhM(4a}VR0mH-k}|kG>SK`v}L55 zkZlKFYgvXk2kbQ6NFW;wMuDj;pDHJ=XSmn zvSWR4oMy8FtLr$X;h&;q08hQ3Sb|oczT_NOd{eVEsYMlu{)7{;%>aRf{`1sx##s1W z;ei_5`rgjdEQf>hhm_|%XlQ;-(WwQ2ugo~XCTxc2CNSPYB|>)7U`F;}g6|Hbhh+qW z^+Hj=(!#QwcNa{0cdrcV)nCvs=U-5>C}z6yB%JY#+X6g)0N%xaMU;0RJghzMdjv!k ziqhMvp8z{@Nd}{w!q4zr z+=x^$7okUaH#_F5z%#EYtHB3{z$+7~x_RVW4WHIdWv`VD-rd+(@FiaUz91#}c8F@u zl_zqGI~-!m8=@(3F74hC;sYsF{xaKd-7fKR=UGy)DF4-MlbquDdi5b%w9q#|v4JK~ z$+e_;D_3DmhjS8<(?GiLGiQr0Bja+RuYq$kQyTy?s1*9X+WGeb5ku$dXPS$b9xIOM z62=YVN9mpX!0Yj8?O@DAF=56s&lZNg)_mV3mbBN5tSXd%vj{T2i@tU971-vk#@llv zjKp_MZj=;=FAjcFc)Gmg9ZWK7s*kB#>0-HKIzms%^<{{^BV!LYup$yLI8+$3T zCDv%_L9`aB_}wICQdOm3e`$}h>k?>~i^t~LJ%?Z$EB`wPz<(jXw=1M`&(dPePwU$$ ztug#KBz{K#dwDi#F;b>ntu!)Gx0)wZ`$#*Uho_M(=J)4!^r3_Ge?c2dI#|F#@9tj* zJU>|%mFK_TUNs^D&Q1^?0>~&GKejZj2RjLGmlHB_3Xwl;3HQfF1twNJ?0cN zBCgrT;*&P2gVBrw^_N!oC|Nc5yUvd9ghZ_DB)_FY=q{htex%Lly9C%#mr&lc6~LVt z+#}!scR16?Hyw3zg40Fcqs_u%dz<~|AL>bAOhSzDId_`M%VP=+vxa~p63m2PRPKuE zY@S{*0SFQN(30i%zQo&a8lShxj$HAvA4mmI?Cf(-KT8*5_AB|2T$uij9du85Pk7c_ zY7mhk{1+74kn`rnOCma=gfkh$4c~zg8r-IQnh?ECG4$$liP#W`0Zdl8nntN^diXU< zEyY*CZXQq?nEq(ob(vD6bPxT2hkl6hN+l_lqTi5xq{O^PekxRRpTA{tECjszimP)u zFMqC9f;8d@gG!X$?Az;-&aaKfTL#IK8*S&6)#MwPC)kN%5|z1+cbTpOkY33qdz?OY7O>0Ay@S^#TF zFSEm9)m%`Uw(XHFp8A)&d5GH?2IdkSXCWR?4OAE%ev}197uFl_KM+|v;e|a`8l@!q zeC<1IL!$GOxO_iT4Ig3-M%0!o`lVziqgHP-a0uBr(Cm2l1WmMv#hjVpl%HcC&WaoCmD5 z1k7~(>|;DWz4|6_QcWZsi7LD#){~}cja)Fn+RHRGqWJ%8$b&P~w()kD_7gRI#c(|y zT4@btbhbiIrt$0D2f{L0fvOMk)L5`r<;paZZ_K}Vr4Ow3#dGV;3e(eUXxF8$DVX^h z4k@Ow%4Y0Ye$rGEnW4X|*$Ebzz9j6TcbIQX_tYc`*74Czv#2HW-0K?3A(bUlx;1`~tF4nV&bSAVwc2*ZU*ZPM22p^fL6Z*4*3mpYXh6Z@im+8CL z&vk9x1=A4Rn1_NXP%FoRE-v{(k3|`*qZ4Fha5u~>v5;RDsIqi^Qppr~CjAosRlFG* zkfN+9ZVb`on6a$-3qs10qOj6bwUeBp;)tc>gh#3i@vUU7nqb+) za>?2MAX->5#djj`yZ`w~TR)*QS9F6e#7k;N_crR&ZBSEh=5{X4mpIP7aBK~HVgzlZddQM^ zz7nM;{M46Q<(xe$*Vq)G#$l4*0Zdv6UWn}}p>ca_ZHlC0+~PCW_;2^9ZW0{6q|n+I z0NH5ZM)(lf6b<$oB1SZ?G<6_r-S6V`s0RG1}9zNa2n?N6z$|v0%hD_ zweFi4lT7#4Y^#h*=dRu%r+UhMM(zFi8n`d_k39tJMP&qAM;?wJC8RddCU2mw-339I zqkhKY{4#ZPc5U%2H3YRQf5`~b+{_TQ0IpY(4_i`Nm&Sp6d)8nqexn;{@Lv$^%R<)q z`6{l-@W7`~u&eCnKy^el{xY54F!q($n)QbV1{FV?)3YsBZh`u)-1PMF16920ICIlGSyyN_+y>2WO7iQ(zAYbES$ zE|rO2xGjDZZeH)Tv02sL3uphAH(tZmsrSzL44F0=$8-Z4Ba5?Yx*ZQT-0%h#ygG9; z7<%AWQ2;Eie*&~#?8v$D>h_KdZR zjp{OqjCj~T^$;1tGVBfukrkyTgQaF_;(!qEF&%M-b6taxnTg>56-%fz30GCMYfq5N zFGMiAgK2J!O!|#Wk@@HL9wuy%fHC#1Uk@ygaW5mYI-kz5Sl8J^h zOy`^J)gd@?ynZg277nYjJ=>01rkMJ}^s&lpkmgBA849A@UfbxG|0!dPDef7gIJ(SJ zU1}Aw*SwTsEIESs=t8L1fXXP__cUwzwXO1-pEdjF;zpO#BP=cAbUvbi_DFfrVyaly zwTYn9QVyZU6nC{#P##?wsMu~*J6P1~!n`&y9MXwSkISot>Oc7M5NT>QedwAPL|#Ih3!uijX8|p1k5WVH0}+| z(PJ98igT7SE;pZYiY#@l1;%&WUon%$(r#>)OX+p}yicN#l>f-Qy04mK9}qt~?|sJ) zXRuDzu&r7Gvnr+)joaTu9MR@9%h^0?4JBAh__;I3Ksgu4vp&~4%}gm_zVkl$8^})2 zKOp(nPtP-F=lD*;0P_oVAU-zP{u-hATIyvdD{}F;b;v$036I%((>@e$gF+xRp-i)( zoTe%7Q3LZPA-6L~i^e72I{2Sh6x41l$M)svyPUGc^*b!wmgKLTM88Soq?Sf|ExdwW)p8*Byjd=`X|M(_TvkY_Q_a)6rCyqg47=SegQkOnp1y z5BodHn25*(C*=osROV>R+dHpdVkf3^W#`cxJZ6 zeC-o4dX$i;T|-YBPnDO%K!#)G-pns6W{0-}A3n&_g%W?zLHP`<(Azgnx!E??vVAeO zIXmB7CY{MF+iP1m0J2*3Gc7!cp_e(%hJbH`s0NG5mCMh%JXbNSy}6Eu9E9~m|M=$W zkL|EOgZ&0u&5xN+xC~eLfvvVNx49Pf2<<1n&Zf<&z2ijbGmSV`RCW_`)&YsSmW6FG zq1`xxO#VLuv|MN!Vs<>HD@;r|u%c1%h#-|dD{B|gQCqimi8hzpML(dH*f&)p&k)%^ zmxJ{n)8wbY4i;0`JUm8SQ@RnYrsrhlf=Wh-sy9zdiMl~n{DME)jlLJBt6{wmPCI?v zYm8xOtflcuw_INQ;Jw&`)rC+aU3jV}okVK%*D)$l&xhD!fjd>c@Vngw+?bEcG&2Xi5;0PgNh*Rp zA~MQ$*c+@Ameaik)my7)oD;fp+!*`-HKZ0a2=)xNzS!67J7M%doErDjF7EfLu0C(F z{b0t9nkMVo$wx};rA`K0oZ`b~|KMk2`@W87o(luaz%j@gjA2I+d1yo#Daa+s|I6cr zmLo*MT#O2bjunzV{>%xknprF8#v+-F@e)kQkSzaSmhU(f@G`BswXySzYT ziyC#2L*3N*M8J+vM~T|Vnb8?g$YinLk)8Rz2;oMs?6AW2Q3O`D+0dt=`;Fi_HqKU@x*IK45llM0Gu1AM zljpH}HZY;_?1M)i08ppP&g*qMux|67vZ6rwlae{&OuQ!2WA#f`6<_$pn!My`?iCf) z4lYq{G?FN3Zm=Y;!y%BaElw=qbL8@9O%yn~6Gq`r=>E3E#cX}T5XNUdI>xD0DHnxPbcqJEYSH;jQ9?xWe~UmS6EH0?*i*xHwQcpOwKz3- zz}3l|!@SN;Mj5>fBJ<3*yiFCo^iWp+Dtx8@4r;WfkH1WYOVM7k$!p$UMU2txP@!ct zgR~_-y}diD^9P(-6Y8rzyPhkg$d2u>iv0{9eI*u)MjfbR=cyFNYwCc;u(S@MW*fwS zD!$l<)Zo@Ye7KiQs$;IE){fBZ8>FO?gNQplPM5DKWC}R4_wgoYDjhKoW*g{@03)XP zQJ<}g5W29#fP06W5KdC_09x+1$@5k{+|}Qc@_XzA0t3_GRwaSPyWUFVHu11((_A>mB2j{6V4P9%iIK7DefNz_W65%bxyd>ldy|NS0Mmc7@ zmWK0_$8PBGeXY{?*TG;TMDyA*p^NVH7!3_Wgv5LC#7mdESQ{tUj=lD{8i01d8q9fH( zF+B`aEb6UxfCFqW`DX;p`;{c}#U&k8jr0ZK8suTrFg*m`d<|6(#SUz3^%2S+Fg zYw2w}EoWR}?0ME;-2FH7OCprct{>C*+IFz3JUp6rs;i+DY6#~`)K?(Ay)2xJz1cKI zno&n}gZUznpcc@GX4U7 z0K02i*GOyYoY>SVAgu~&vn_cHlZZ`CpR70m4xDDuKeOk#fBPJ|C0w5r`@7YPIqm?ED3RCV?s_FCM;u)<%dIoz=UR^S~z3 zbje~Ou^SR+$o%2}OKijOy5Fb);}s-Xqh4RzhxVvNA4{ z`z8Ji{$ZK$wy6`eHsV3u>HR^sGVToJ*fb+*0@W+rOjnoN^y~O>w21gEvF!S@WY_1< z7go%CJ57Fn)52}^L+`aFhIlQ%nQ=Zc(|dg>T{Im2@R70~_Qt_XYBi@y`ir`gJK0eT zmUR7+pTTqB+N*tGRdj^rb_}pVj7mx?v1)vNJjx<6)V((er|7ftHSSx`jyZ0yBChw~ z85MN(Hjf{Csw#8gdA4BG+_Io{hVH697isrF92xid%Veh?JZy<>(xeXLcdb17x3*5Yy#BE&NvQMZ@`eWLw{_e8na)p zl3Kh%Rdl@}=20BM7NGck2Pk2aSL5Xrzx@`WT4aluw3c_XNl(35R3$7zOKI${(@xAY;J#l zJ~)(ysu!0FwY={Vz3Mt}E#Mp}Nj0*{+qrvh4@{yT^DC^W+5zmJ30-dI6y(Gg_b#gX zm49MQy$N4l_@3(HPpG6TZ|PO#D{I+wYLK}aS!HYVE%t>s2r8|N*MpOqngBKbCeolh zA6-wZ(Pv54P}`hBKKm#|4NsQY8c%j??oX`49~z#t>@1(2`^t;{Z;9M9&BsTbncCc3 zh_o4eJr4RZ?K&E=Yl`|s&fAg7c)-5p?DY6ml^ zGB|S|gA_En@b)d$Rl&2WzXqEW@GgeRR(n>s=Brp4p8nJ^V|_bFYcDGYqP`O9Xi%+E zqP+&L>|49Me$`%ld6(6f`#v|Wc`hZtlY>$j^RZ;(pPH6Pv(ofTa3ga7+s4S#O%K%$jKf)( zc973X*r~3ptCC4SwF_Wq;Ovoz^^|o-AHf0AWh{^<3geZrk%+Z~iZzV98QJFesDkQ&tqjFc4cc(|2zEs24GVkz@f|;t(hlVXMWI?(JG27 z%gG)W%h5Xqb|>NrQmb_2fF8oh&Zro9@q>)^ZCtM8ko)zlcdWzDa#O*We3%X%|+nf+{GgwR8tUm2RbibY}U zgBx&7x04{nDH_94XTqC;)AWwrKLtHkglXFOfp*%Es#pftpzIq7A=#gF&ENPAw zJc}yHq3!+P2xIcZenpr+pf)^&J{Xb0N0gjmQ%+JWE?Alhxe!gKCTSgaE_rXqj?5>- zISzBfsAs`HuwYICh0ZHX0kLo211aX6^QtTDnkM-B!n(RR6(WrYUA2)CHK4xY>0c00 zgx`eu3;?)32Qs$(t)7rR7|FhPU%aOfxMf#|nOe$w@Jx7*!d1^-#BljXjNHH5AOk|0 z|HFO+a=(v-V()AfnxZtD95)j-C0UZ;&P3;zRj~?9DR6oCQ7I5hbD@z)h*1bp;=Y}G zI=WKhA7giKZ=Pby6b4C@l4so$O^T>LmvQvQRt6zG_g2XR3^ko;SLZM8RF23WYl(JM zUtZQeTvaPz;~jiSf5(sxDEbbC^jwtjCG z+lzo8w1_FUD0}+IP}XnYF9^I#w@=gH>DD7dV@14&!%5JwH2CqjLplU-x6r3u)K&g7 z%TZ4CKl5D%N*dwwhBG@gep?amEK1hJtT`7fb6iRsr+)o@HpEP&dy^7$u3>hP-_YXp z|HS*G<)UW!X#DnhF^**g0IuuJe9-vGo=vB1{P|?3WAW{bD75&burt)L&B=NCpK$vB z&T)Zdr*|rW6*?j(lQtMAg#@G*QIt9~AyI<0@A(_muzaj0QvIWwJnIU-j{OB4nvotA zRSHQ~6JV1JN~(N6G9`z>ddE0Q|IZt||2y0C|8I@|4Xvxz0dAL-c>V;CE&OLsobmrM zLztK@SkgoOd#FHR2+^mN|Ng)JX8?@<{OSLLzY|QT|2MGAzq*G+*-&2L#rS9MPH7~TqCacyl7Hzwls?zac{(yzJ&&P1p}3)^ zCyxXc&$>SUs;rF;KF#`Od}rB|w{e9zi^W`i1O5bM!%E8)pH`;zaEzlH(x!yOFIh>m zZMp8d4yZACp&c>wvrm71B;>ySX{5G6(&JB1?UOO)Z#FjbFZRa2j|5!q4O#N>d~L|W z!jDAZjg5fZNAjT4Rq?9y!|!!p2m0xh`%P@a654;tm~p%6H>4#fB1)T}&i+A%nK^^G z)9MsdWmMQ7*Nh$2wT}O=aTNczd4|ggri@lefY~*qC>A9Z8ZNb|;7WN_RV6wCmyGtV zim(j93&0j8?{w>EA`d}$P{El=4YxM7EaJ__gu|uo1$dVED$H#EvCn+xh$Wew8YNb~ zedVVzc4S*rSggXlHc4)diZ%L~uB6n^#KCMxy_UY2d)-~tS?=8#mR6mwtH)FrB6Yi7 zRb94c`-;YEvk~K#)io-%9N&z2*S2d?|EOl);PJJgxW&_7E{!RSN~(aGpaiCl-1Rws zxy2yqM{VNGtTyhkO6bMCtfADFg4x!H(ugmg5mBX8p-|U+*7l`%#^I<;TAE8u>IzW` zEnD4h?K7TFHD^=u#;27Gez#{CVJI%He&~^!>Jst6iUP=}NsMX-5DvpehY;84rcQwjTIiJ?9<(~d^T2oToX+dIGRfyhSspmQybRgd_PXRZN3byPSVw5sjBe1 z%PX;1Ia>bXYiZHhCNFl!orCg$tvWAA|C}pgX^-{L^{xV0l)K+#7SF^Q(O*c6aJ}^K zABe89@EsY{t?S@~^w*7l9_gkNmE|}{KCrOk^;7!|d)SiYe@L$X&z>&uT93*SU;wkE zzmo>hJ7D!z1!`1llxtSYdwTs5JMK0Rc*G#i6;2{S0=~ICYBbgbxUfF1i-ozu$)q*Z zu&2CkFGWruZ~VFWAG|@eX|&IM#D8DOe)jI25pf$R#52@k+kH+lzb&C=DX-UC)YSEp zqg@b3`Z@*I1U}Q5`}`sWL`5*Yb~$3HAsqp*OYHkh)h<4Dla>Xw*oLZxLgfeoTBZj1TB9LkJO3VHc5T4MJMiALLEJcw~CF8ju|+UBwifj4MD~y8SI-a zhCQW+0W0VK+ri2Yb}>(Qnz_Iyqxjh6hpVLfRxbZ#d0e)e4OCs0RDY%n`iNq=&&WH~ zLTm9&1W`f|h+24a+R`^`@Fu>`+gQ`yhI&ge%@8+VY%7s`_WH3i81PY7*Wc8Hjq{<5 zZu*;FSEA*9ApCH*t!8Oj5PalLjW?&r$!JQisgZtB54j2aW4v9k1gmM~-NGu5+x72g zLnymb-p+OIr+=pb{g+kw!|KC!Gq0jyoQ&d~BX~%E=rI?5H^??c3(QrvaAl`Fy!`dl zm$2_9rt+q=d3vZ<(p1@_tBNzjwtwY;!^zVQ%rrdgftUAloFLDU+eiABnKQv>SKzAj z+UrM02O4TF2RH9KRf=|RzR(P$xs{pOkLHMi{Gq$@SGX)ya7Xt1UjX$d22@mK*_l;n zxvE@{yMmi6zpF}Tq#e?rv25QP8&Iao_HEleiN9OQ-O$VV!9~+0khGad0idw|jxVVe zKtZ5Rrok|4q1%J6*x$2@UFFzB%}LNdm9=nxoVl`gMM+nXyiPJxmT^kL~tG}t*v7f_t=ECWwYT;?})vm zfuC73y#(-GM87j6Dyjb09r4~UTBEt80r@4>)La8Q)PT0gr8w08U4s-N5A{&Ka) zwGyW4BO@Q=3H*)uk?D^1$jilX)}d8rR!@F5bj5-8x01I5#WS_`UP{b#dC~2n(EUzU zxEG;h4}C|Cwt$F-VAOCoLt*QP_~zYw?XSSI;Dg`q$#sB@gJ44l=5cerZdp>Q#{2## z-;I~Q8=HLiYTqBOH4j`S56a;Gbg1Q9#wS}Te8i^pdJ>O)^N++Phc4m17Gt@TGdZmd z#V^nE5aib-u4cP*6H84~v;S%L^^gF1^SD8q(!`nHQaNeSFQD*)=UI)E?Y!{3?xbkZ z@Auq|z?BpSh#Xt#Pgg&;%@_&zocRJZA;2x$vq02IKOG+jFP^Y-BrId{0G(VEjQA_L z%xY)uF9LCOR{yv}Qyg-g`)~bYOhM%Y54pZ2gVi9%UTI>K*jHPOpLTQ>#%!_=fzHE~=JDj8KJ0Akc1*Zabf4XFj1 zt*s0mqdEGIH6Ri2>N|ZjPdE8}A*!l~FB@ZV)*CH!Nx|91eljKYIA0dBQ>%YJkrf@I z3vC`6gy9bq1JvHje?r=!?kVPNK(uNeE#93-=bK^HlH}{GY}9D9z?Q7R*tdD_V!O2A zbQ@Z-ulpO-^y*0kyIK*pwf_b?>#i^4h~qp!+HKV=*eY^;CpLrcI%jJPV-eoO?-Eo) zX{Gon+0xVYlux&#UgXb>PV-NOSIWs)-=E>KXQ$4EBWTZo$3~&~)dpnAp5+Z#KA(>B zq4^W_u>K8}kaeiwNs8cQ)&8JPl;Mott!A>tyST5TBvDg|wzGOW5Iw0`xTQ9R`Y|;p zchNV%DdPBYS>a0iCsQP0mV4Su?8jk|6KcEe*Yh?)P;5S-$|qv8b^N=a%}loS%gC{y zOmRj$RPAk_kHnYKIgU!0@s&NUCz;kg@j>~?StD#lvP$9Ir^+ zXR~+C%D0QNTBp6b&?H@-%%|qH`&Op|71t@J8=RNjUTM6m4H>2!G9F_#Ne&H)+A)?Q zT<5MPbJSn9=qGn0-+sY5fww>khNm#%jR-`+edq2~TIacZ1kr8PT{Txd!-iVj&K zBfqis&^{~2>d$>KljhoRgs++4aYTdo5^R52Fk7TGopXHq5z~J3>#3N+@IU>Qx9j99 z*nb7YAusVvsfrpxT*E^YlgzNBZjAX)8MdBxGCLZ3gzDiHB-hLnaz92xC(|*z%hd&y zo$RN%Q0n&Sda9Z6NZa$4cML_zc_Y=nDg$t*R$#U6&u^He6dRCxBN4|SKcJ0JGbnn7 zAU|#eN-yW-#e0U!Aa`IZJE8NVnP>(0&NgZ8*Ga9M@}1t%>W9NNcErnH z@JpU!E4`4Fw1rS((qv``eLGiWZe8xo=`w7afjRQNmQ7cx_Pc@H>#x}$Tz}AcMIyri z%|P*=U^4j2p&Yw3H8%eZCXSnFzBno4e2vGxscP{sleOW8J?I`*nV(uPs>$CC!6%bv zfGmMKel|1^Y6aLacJTV#1YLHP*b*NVe?olo;Rfek?&zUaW>d~}z9$TDR?Te;*BdDB z{9mMfRajJA`0pS{NeGJ4pp<}sAYB6@EnU)5QqqmU5RwwoN(~)Sf(+f=AT`o3bkC3j z4CC3~Ip^Ykd!BQ{12^+9Ywxwz`@X*-kzJnP2${;*`WmnbUlSUJw$-$(Gnn@QNl@P$ zn=Ka?qeh}7Ya_*|8T|GkT!&m@>r$4{+u8<7+_5N^xbfst-sD1~uVb>m2sgiQEP{VD3NbIymyZ0rSj&|Tep{NwFZ+3 zns$1evl^*})uurx&a%VGs~oqDJ+Es?dE2`@Cz4M|uWC<`K5-i~n`hHgZA=Q8W|=Cj z($8R_L~jzQzwB@~bg-vOdjAG&b^RY?nkKwPf}{C7%O$cURHiddvD-3#64pT^^l&){ zLW6!+iBHH$eEvv;bW!m^&OAXve}bd>ldlFYNNfxCK38IVoH-C^aKkVVc@gEcOiQY; ztnxB9LT>gwJ%!0?On{3}TCt$hJ@`>Zh^X@eJn8QY8r4O5xtZ?s0J+9up8cdIW1*zi zRGh`n%Zjv@O8^zFEpySG1vg$dr!+#RtBXA3jDJ5qpU=TYe!+O2`d-gKYs(RSf$h-U z=SomIy#uJI>Yw|}L|c$oF=<12@v6@Vy+Hw+-`vLCX2@po<0^fRZ}sYvoP=0@W%nPU zoCqV!#yzt9C-bb*4?=bz^~G-wDxw>UN^4^S~=vMz`gm$bjsDU0=In5?!fCUsYfhSAFHsC z5)6M$89G_B9vxA#v4hhd6& z{YLvt6kc}sFA87D;-1k8{M`JEJEqr$4zHH?ax59MPV*^yVVqSZ7pm||BFJ;YEG4^% zXE87kxNZ1&@XF;!l=iN%;H|B^zX5Meu>>=bw=W#=^IG(5}#eh_SUQ?7J6{SXs{-T;)4dX z)7w#W%7U{K^asrQ+aC3=a3}YqT_TM-**luY`9ju;VLIu?3 z`-i+vuCWT#fT-`s=3U7v_oh=f#*+~^sxkr3w+|z8_I`CSO6Y;tQkN`Fu&5-XEM9Dk zLmk)N$ncHd-3gX3RoxrT(@|}J-uF7!#o1<}Ne~wWq>ih%Y=#YUl1>O}{SCSLh~YsJ z7S-5}b`7+S9?N|ny7sR(zpiKW7FzazH7QWz=({=ofl%@^f857(^8J1a2}Mh|q^pAO zKhTAN-%khO1@%m+yN#m=su6#vjMNa~=YCO^UiG9{%HdSaPTIm%97glh#LjiV-kSQ$ zM_d9d-u%#wZY2Uj8w++<&jHMy+boSt@U$|7TQq>C!mJ8{|jnLTMx|&%WTFTeb~?S<%1+6!$&Is0DEYo> z`L4dtzU=F_4?^afUt!4Xw$+8}O9ArDKhQ&rhF6}^!lHfb{iBhrfR5KVx`^hzXaQd~QvlOY13=Vhm%UtVU19K7I4RfS6n)2r`5L>5W_xk zMyE&IU4S|5I3P;%e50JnB2i7A^Az}!cMeZ}*Nn*)2guAZtCqp^YRPb4`u%k~25q2< z?b}&V>>-FuC%WDwo?ZizpS2$zMTp{2#J`3MDpHJJn>amfxW2mW()aLo7`eH|a>%3b z7xkfUGSq}mMR^dR`pt3a?7EAS^ltqS@eM4kAv)BKKf-Kx4n?L zk_DkU9e|yX(#&E!u);NSPX1_K(O%f8H8n|zI2JtGc?Qq@Ip^K+@Pc!Frtfck{6~`K zA3@KVbZ`96bPs;ov(a@-Z|jt<)fqteX4(*e5WO07Sm9n8+{TIhRW!>&hwu(FkVycr zDsdeeKezSuyO zR(f?jLL2vb`#X2I@>V*Vys-4>5?!LJW{fBnO&77fKXQ6|d*eV+%_$*TWuA@!7q^#` zYH2GOFrXw1uw%#`V}(w&fE7)e9a|LBNJ9TliCv*4<9Enkz=>hSp7RIS%Y&$q85z(s z9CqHF(4D+4U47X`Y$~iUnx=7jTVS042N%5+Pkv-I0A1imn|;pa+J4Vb|6HFx>xt}D zDR7C6OhSQsa&^l#-j`yIm0%mwzD{T*tOG-WmQtm z_J)cs`>&^I_dm~f)F~+nB%kr_5HJOc7G(Fao!u9q1}Tefi5>(SgwYgY&RoK zvyTg0r<9{flA3mK{(7K^H;s)^d~rg4Yska?5sl!D(eb7D-kc`s(DDU$GbdAQdu9;y zS<}Ml!CgS)KCMq&>uYB((Tgz1V;0XpH81a7u`;fz9AelIgsqANY=~0jl*0^u4A0S_ z|I}qwe!w1k2j9WPDP`$)rO?NYDqyqFGn@b!!cH4)sv6TppCeO8g^^9e{mKO1Qo-PC zyCt;M06Rw$loET2R@A$f&GO1&>!pTv{Oe2jyPdmBXo6nF0Yj`-~4;KH`qT7y~|ib~?C@ zjTu5aO5Q|j8U>qqAt`qW8cDK>a58Z7s;K5^<#wKE>%?*JS^`U{hZgF4z`6g z2pq{fH_oaCjAsg_1RX2im{<~yfYe1qEYMlRe;S0L?uARstLAUr0T}jJC{SVeOn26W zEkmquk+?%P_LyangDKp5mN(!S;lAxd5vBK19hfO?{R1sxSx`B@rK%%8-crTBAI&DD zSxbg=LUy$Sl2+>%qSM^Qm~o0`*|YkJ!d@Wgui|y_TGzyc`KUl_*af zH+N7|gxupo5`5-+T3Fofb?bEnWT)7JG=d z_Q8ksJWp^T{o?MGn#ib)?D{HWh2`0;mwdm7AL%m|>Bv}p{749-G(e*!T`yMAJKi$! z%|_}QE~(a%!UE^jsXNH1N<~Rw63|w^p5M)tS2LQpl~Zc1A^o)^gTg;wA{_JM2oI2T zTMK-1pgwz8NTIaWPB2>Nmbgz!RApT>V=^QN)tM5Upz($1Xl*+1vuv=jOAuoIfr?Br z<)@A>lwkHeNve&V6eBs`_b~fEwe8JIJWclQmPg5>Gup5T`9@>KOLde|oeDOfO((1P zpwws!aGa#o#|H0)MEkiI?>v*RXY`M9G|amb90%*-R^ON^-p`+5MiE3wGE^AkYQt`jvf7mU;lFKClL%qrB8izpbO1@4$6iv*kZZhIV~njwrGaS1Von>D;hlM&SwZ>m`aT z@4>1a1r%vj(R$%r;oYbzonYtLuj&=7ZmOc*=i!O18;EgaU8+X3;XjaRN9Fhn#~?0L z_GVAd&Y`%cQ^Oc5F4O}q-Tif_)nold+U4=Sl){kG8IDBFh3MeTB#KyIQ>)d#W9}CF zbwV@MmdT3;T>WF0mbc8MVo%fIN#V5zuj_wf${X4?6_p9uSJk}eY>Usf2yUi_#@#j% z%s-eZDH3Z%KGUYNQF*I+&+H09qHd^exRwX!bm(ntn0N!fyImuiX{O)7&-a{+l$*7LmY@^aiDm#3n?NqWSzvq| zWNpB)-a+BuiWUIqmHwOC>pqq%Qa=mA8h#xQ(BJ5>CpADitD=2gdv2iyVvZDw$jTT} zE52MilsLO89loCN5fX-0qoF-m)`qD7Ic&O%YnQ&B$v2`-=2)M7QoaffUPFaHCyNsu z7rXDur84S*%;5;907ckr$)ruPMyryOW%St0TaV|c$&G{eV3I@FhxQyGlO<=&OEIdy(iNp8pUX~aACWW$oY~lKd z-4zzPQ{ue#)3gy*0y)6axi4Qd^t#lx=et;~W>!~*0CB-1VA zXIrk_sdh2e!V-{+pL%*)LL<)qu|kMqmy*?tYZ4JaU-{ZM8A~xis!;CUc*gdDT*9N@ z7j#eTr@^;?H-9P_?_ktbNs_IJ!PFtEv1HOID$OO%j;Ik)#qa zKh41CeFG$Kkzcv5{=y|zL%_%O{x5vjUNWf4@Il(#^^bGWKrkR_YMOEJEPp?De5|Y@ zqZ0fK^i6rdY}sMEfS{L$cg|Gp;>9*a)!uWNLaz8$E7+rIYS_qwt0R|=llt~-owAYI z4gd>*RO_uJP=KQas(~7>(lT(MoMYP* zk8Cv741yp?mupI2)jlBX{59IA*TQH6k0l(Z0Vj(d&?s%!VObr;Bck&bm+X_T1=t)W8*QT180dRWiu5!Exm0!2k0tyQi?~gEiK^K&A>KD@oCREosS7Pz1gZE z;cVR~1As4hmf2 z{_J@tt{6qj9mPv6=tC@iB-XDW)f{sU#RrxwugD4;m<%X!%MKi+3(wAgpT)C}aW>(Q zQ)2^Ma7V&FkUa5428bJYjDPpNn+sn%JpBi<4_)7Kv_mDZxr^Q@ZpknF<^8kU{$v`K zExh7#)TZa6`}10cSMnFmgw$=2-rxiRh)5YQ${6W+9hfvs-X`p-G=Y~>AQk*mk5;`f zt*sS!Z&R;m%h*na{fV@obx*XY@`NYd&SIqI!YKcF`k0B_v`oGS(W#R?{ zbk0*=rfSv|T{9l&)E_HteT|ML;Z|yH_7znM}n!rEq0u^WcJ?0~MC23=LAH^dj+syz*3(IdT_%PjZj9 z8X)3;t_Cn`j6+)=r7+ZvmSkOlE^(Ux=e~Xw>9bv;MQt$pO@JW@yKk!+w@LgPzv?h_ z@*THMXFFHRjI-?@7;L`G*f!~v32rDMy>(EXLfyWZ5T&WXg-g%z{yPqiLaZr7P6F`} zR%&-Mp2`z9lUS;K^w6CO*%K;pqxYGK#CJmb6vmzHu4<4K$$woz%y~&qCZUOX6sp2? z0_ZMHt3O{!vwoS$W>H%~hEApt|UB^s)Qat^Ms z7lEHX)<1jR6c=SrP<*^*n^#1lrpRO2 zc;8iaafWsPZRO?Vw{FF=c?y`_*ts$)ymSj$!U}pw7&jh|i;ozhga*C}sd1<_dnX~b zGl5t|Q zth1McnJPuJ`JG*EAanKCq_bK96E{|L>y@Zj;OHiLyuEprMD`%iBL~LOQ|Y2BK6Vv( z;g{pb6Gr7D#$0}%g(HbfmWsdHDCo$v9TMC@=g(UER!4WY27(e=N%`h#M-GkEtd!k^hfkTkF8izl7;A&=8{oG%*~OA;9=6th1n9kJ801|c1iZ_KUfjaBiAqU)vmt<8pX_5E-pR)oTa1s<*^WOy@D!nz zHnVVAwt{kgkWN&3LLYgV|MJyVDhN>a@1`2K(%?Z`CG=-W#7hmeG88g!bnZPM=SBEt z*elUTSPYo0eF&l&37~^1Ky_Q}x;)=+D4r9zS={i*S4GuFen#X$i5)N-cVy;wAUG#7 zx*qL-xiNk84;0U%CC~KbPhf-A?1f{hLE}eF`iuKtpI}q>+mRXX3PXqXVN+~~PPeJdL1HGRIKN0wAb*m=%8-1C^oc@@%m zp{MziN(Mv%k}&wOZ&wdw1b)gQzsP%kr$U8Ik!QFilVKM0WTXs4yIadXp`bQ3LOqcU;U&hVloU zZYHh%7}(OyfE5Gz^Y878P;F!_*eAg(SQ!!XD>yJI{vAYbI=CVW^{!Q!PJF{vvbVvt35&ZkHH*sh)sY0}0g9(Vg;b`kRaRn%8 zPz3!0Hx!d>1qcKp!I8uFE3Q+)*i5Ud+USHWZaJ7oS(~C)dlmvZ z>qvGDsRK$pgPE%DW#8mA*m_I_gFcYpm|38VM4c|iD6en~zY=`%*4KUwa3*LopD~#C zQYwZDJuhK;e$^l3^%MFaFCKiqb2r4u(At(caHBCE0^)>uMqIuL&`yAav3~-B1=ED@ z-0mDzyGX2&X5ampSX?%hauu170Up1j?1Y{APp9IZ#Emi`ruH2;%L{qRBV3&;u3rqCX=idF8?PLBvDZ}AM#6`8+e z&C0>H&c2wgWVCa1InX%J;4f0oZ}n=pfE-x)$0RaZpfXSFcCamw!_?gyPfn*2V_8Z( zC4`T z=Jpd;T-L=k zmg)r#?nhkr{MQZp{7perJ51DF*okRlNxv$7G_jri-}47ASYWlGE02ljwSIEN2jiG9 z^>ceVF=;fhTt&ND5zMC~|L1?2Qc>|PaMo$OYK{#az~sUJzjxCol6q)JzydbfYJXzh z%3bQ~zgwCytZ&n`|2hJ9SMflvwT=c##K?)RoeDfK6)9G<8wa1ih8Fq9aiB!@?gF|n zYB%*Cn?kFJ}TIVT8K8m8Cd zi^uV9F0D?2=kL_`T%r?N2ujM$!^0L4&znA+UqDjh3wjudrX|IJTm23EsV~d8+vI1m zS=&B?jQimg2I3gaAy|idMdtUMju)7p7Rn>bX(u-r!Z;B&TL2}cpTN9SQ$VNw36O9T zmE^7ghjcQ{HDw2#m^Yz>6FjQti+=l+TF6Kc&`gM(m#3;IpUN3rL(Cve4}2J=n- zl9-49&hoQ_b1}#{uE{_*E|g@M1m|o0-s+~2%&2+vlWrHLJtD5-7`yd1BfZ8{NMRp-bfaU_1|CaDr6?@40V_Sk=Nef(&N z-tWhdNH2r_?bc*~gkUK-*;-co63(4t3M%_5YOD2EEBuJ1fy=NG(YbNoBgbQJF0)+z z^S9ZnqdUL5t|NO4zX1e((J^?1GYOE)TFnQVJ7-$$Y6_h^97`Hwd&S6P?+=_~IG0%$ z8K%^J7n(;`JjPkSt@^$Oz=Gvz$o9r&mxQ1>i_f1OuW1-q_hXK}efInmL{l>M<{-%k z3uW&wk*&+)fmDs<%t~^)xv)}}+HGoAkh?07`Ze?nLEoU%OV%^11h(=m{n-429Aq(E z`ZvjNO_U0xTN%aGqo}iOYy|pf;tGx)K-^0xs|rKd{R723KcNSqkl@wFD{EIA$WLh- zox1?hwji{TR!B2F>rD(J&n=m@S(h8s8{zc-`$`0HfDb~ea#MCm0=ad-&_`TeZ zIuEA)y_xKlkL$^cS7O-IDa<=OG~*QkHSk|CW!vK<7m0!KS#7S#=WUrdAlZ=+GvF+5 zLH?xPK!y&+;EqV7OBcF=WnTCfa#Xg)cUv1i^K@w*mc23f5kTv)?J%@R!E{F)l4Pfa zi%QVux$XYSf^RXL^%)pk~f{M|@I)3(V?3cmtkY0_56 zW*HT^Xdh7zxUaros{DX?7CqhLqb=}_wOK-=l(=qDUuL0J!8QtvNJal}EVp`+4!F?~ zt&yyopI#fI$~&lFG_-RAZ|g=zJ~MyRR2;>@QADf`M=dM>1M5!O1|8U+I`nzv^SN&3 zybrOQ3$KWdA&-&`9IQS&ymL;=bqmYMJ~O$$8ej49q_7q_o^Uy@8gN8>s1F3m9OxF1 z$NRHNzYp-()oq=@K+5Jv%Zub~@q1c-ffB=@fJ=iBT5^7}IvsZl=yvAi`5cL%_iD}I z>6>J3(C!L=HfP2AmK@c~P1-X`0JX!R+E1yh>~nJVa|sR7h%uV_z?89(1AH5Kak(9g z%ln->L>>urR z#0xj4pwc3!yME3qBC9f8eO!kEBK$C`}K ziX6-7M>%!)uitS+XF)c%1@KDx)|Gu@EDLNo-Ua*U>KmOoiEof&Q~`Bd z=#lyDCK)vKgYWolpMP3R(gCfz;opjaEf7A>I5~&Z?q!O_vEqNnoRdHKf_6d^l@A(X z4o+M))OZOdVaXv+dw_1&+<* zOr{5i)pd9H+l!j8wB_(28_Ih`_YE-Ib%iD4RVwKMje1&s7G8pBs%|cVxeUk%5*d2> zm?8q!!z%5sX#?Q00BPjWZC&VmWuaA)#V3+GaRa(4G>aCpjXx2Y_G(iXE>3>K!3)A~yp&t#iz$DGx8Pun z>Gh;!gmB;@D?PXM1?^3r263$_yWaRj9#Q|OvL+iO!x>r#z5^)6`(ET^vOepNa{E`b z3H2x6`xM5=l z{Ua;a_gv}M>0lE#^z@gqIg_L*Gf4II(RDm!xQ4e85YpS!w(-ii>!yl2;ryc*lgbd< z$YX6#L0pab&Tf~ZR@CnV#tn%Es6gKA*nOI;m!H+&gw!#LyM<)zMaD{+73?6(lMku2 zy~^Y^0LCypnF&@z%ASn@9PVNwd;JsQ&yOqvDIL8HSrmJ1?cS{=1%1Klecs^1bdwX@ zxe!z%wPV+X?{d0zz7#GAAN~Us`m0qqk{0qS$kCJ8iet>#?*0LF>GzK}?W3>Ibm{ywA*@rVMR4 zNfSyk;ViPXg#Lm^gz0kT*FcE8FI3d>hdIWpqd&{x4JLWDB!e_iVa&i*n;!dOzzeInBk-ihzo7Q~t4>pmj48@=)y z00YDu;+%=~`e=K<`!nv#Pb1_Lsk%<2Js;56x*Zt^W|;^|=3va89?*#h?zU-D>8qm0t>Ba-+f zZU6e)uvwtCI|=h}u9;=-yk?C%yTF4S!bsB;`$rN-tVK8)j>AD-Ks(e5&R3;6E`O|T zRyxX6N~?1$MbP$vFTtx)#!3-6a|~(UOvH3l3YJb^?Msj}O`5JV|s-;9wF^5gh}mr#Urv(+IGYtp?}>n&bS}a-#hqyfJR(9UkC>eH4M9X-rm)8UX#^Fqf zcE83?V*qM%6rBNrJ#<;)*qyv2!_fm#>x}es>UCLO7S5uYYd@vj@Oh!%*yY_31J~ViZF|FTzmD*B z^RGsTEPnn$AI5@hb?`(HuFb^P4J>D-9P~QC47^5e%J(JMoM=x%2DG5yDm9}?z=4W> zU9fj*jdE3xa4*4dt@aWbV(I($Rig3k2k$BpTqC|8e?Yrvp9}pRH9u0GJ7yIUX$1me0CD6LDL9dlbD&T>wvGKzF z8?12(geDjwsx!O%(^(;TO&fO${b;SQbutMP@OiG9*@^-|unZF=494PiF8~M)hdIt9 za4EtV6lZg6kkN1b<6)F{v!|UqQV-@%qFWuw(#s$=dueKcWm)%rifSvk4X|GINx$FU zshx4+F`lO>K0pW;MMTW4^wItPKyfi7l)Cof_z25tE?4@Fz4_r_trD4>uzq^I&J=&` z$sHu=DQxGD0zgQwmrsbz(kMt0;O8UA+v1*1zB9VJ4-)_XRVb2}Q`=XUqm8iR%>DWa z0S=8L0^d44_7wmrm1*U|P(CT6{(I*m!x}pJr`jGlfkSvYF)hD%OyigseTzI9xNTCq zNfj(5i#k7%oGP6UP=zDPO$|)ZF1DqsTz9pUybLVwKE6(zuIa+V3U0Ac&sX}K(HG`d zz@a~;(IUN1n&-luM_xL5Jhou}D$3PqC3-Fthf+1HkL(#M8W3n3n=a)q8zLqtioN}2rG6_?teQNcx{e_fxM-;XpqI#00N@} z*~M=%|03!_x>CiDO;J$1{VGFa_P8aiOPYJe(@Ez_b4lRZfOHyHf=KF>tmF+m@Fzgh zo))}n$+>)@*(9$>GO-IfF(7u&(n*-OIr;}8sBsHRY8C~5nQohFsxTP|V;yElXtGq3 z7!Wm&p{2N8GDdz5y8dZX4nVvS&y58Srd~8Am7Ok^xK)1fS5|bDdEt>6lU**UWm#|7Cl&;keA-n*rvIYMIu>{ z^AD`a?7sWgxGIq+m97u^Rv6m5>i_kSQ@oBoSo{BxVGcm7y+x__a`Q&>*<=l**5{o=eNkDBt|6x)aQlY#Im0bfEB+==HgIQj4cK#BQ10Pe9Kp-RpCtEU#SJ20ahq`Q$G( zS5|CfnA!5Rl#;Y1?3kK`W@D}iO5h9VFfwKlJh57PlcD;Wgr9b{2$o`@-PQANGFmq_ z+k%e6MNb2ihT!-8sxal@Pc!x>SLsVbxT*`4w(g#5e7}avWod)a`oLs)h^xRY6nP?{iRoW=`c}O+; z0XXsJCmU9Ou+M;649`L4QXZUKDTf>lTl@SH^lHlU~) z<6mT|eaBwJP%bfj$IT)mQ`|7fuPdyxQ2~s9_nm-<oE8k?FO;#PCH;}cpPYo>mZ^E1rq(Q6yXHm zaMF1br$w#yhp4K|(!Fo8fgV(_bLINC-;PM*1&B7FDqs7}#OtSdSjf9z4z0kWMacsNUJB=*bryss56R3C{algolA6 z{6hOw$4PoLCg(ioni_B+XUX#aNSb-2^QOONobps1?Q)|)iOll2 zzi{uhLi>wPx`PChb*Be$HN&G=U8#|)Rpc9nm9*`JiVD?be=wX=W7UzHGdAWct4c~7 zReftgEeRW@V^7;Fd|dRYCVVlrT}C-XOf3xHmB(`%#@|;7m873E(#iB~kN~5R=U!F& zMckCBp{)&w4CSZMf|=#L_JWhSR7c;g-OyE>^=TVz@#Cv~?KH-0Nj&OvqM^ti3o_@6 z@bl_dsK{uY_b8sCyJqD}Iz_$cAL{fG_Y+PLl~b2)@J+!2>cwLzh)M8@FGMpG+$K~J z)e)1i*8b?gD6k6ZR=l*-N7|cCw_zZ9CIH%yv}GxJ(KmFOtK~FLf(|Z{er_i~H7Kn_ zbD8oF6z3nPl)!^ZoJX0=0z;)oNO#xDml^lb2IJXo*<3EpwGIrdJkxl%U!!JE2Mhnj-+x?4 zU^NmH;0BLrP}7M!ZvZU$;cv27)PX!qjP%JK!=eN$)#0>4l8hnLZTB8N|-oGgSeJ2seg9SjG?V3h~pHS z=}MvZ>6t#Ko1IKv%}k?KsIo0pYmQB?poeq#P3t4ZQ;L}l)}7v7YuG>t?FRO_9D6uI zO{DKh6w&h5@ay3BWMH8|3|Em?qu>Lohf}pz=f0j5JAwJ}%{V<1KTXu|%%vYI6yTyfFyVQ(07-;T7snsrX16sU${31DU z@)vWYPPvOwcgyX0$kXlPVVg7}5*t&0iftUs9-HskJp+TMUBZd`=A_KE$@~LukN@zi z7x4B-?qqCZn5q--SC)YZjD7?^r|)(bGb8kBs9%=xoV_Wql@oX1X(g!s(`(S zxqVxz%3BKc$2mJJ4MluCr1(x8Z`1aVU(;VzP;>5=N*^mCG&a-={b&=+wZ`1r&5AW5 z)mLL_e+`K#<7>=1PVK+-a|sSIk2YHPMg$nC{-4^pbf3YPcnBpO{WMBYx$c_IN|;up z-&=GSl6T1-L6C`d>4jqno01japEhq_x%V*n5goV1Twxq*|4Xl0Phc6nwa%=8@(nqy zs(-(8*l5Dw_H$S_fsRj%t<|IIL22U?JA%W1{18!-C`MHh*WUza;0?+J6Ka zJ)NE}YJ|~QynBL6m)V3-S9`nQUgvENzc^(ZKCS&v)WVX3&Mbu3`4zwX>`rRN|mT;CYOru!*WN$T}M~-?+m&BYYy0f_%JIbvM^&a%6 zoqKd-qq-qC@b4Hg_<1GB?C<`;rD|F-yT07G=)&h%daUP^w!=$%P9eI#%P7To&x1Iw zK(Jhr@yKE!e|1vi)&$MC_#GFttEsDY=BVb3HJW3a5SUmx6sH6(?u)TK9SKyq9vFB| zNWf8cgiSEZ(^TGOe59xG)o8d>RN8N6ra4&$y+5}jgECG3>hz4VpU@D_Kt_C)ptm8N zpX@!OHqSsJ4MxtSg?e{TBsKBZ3a=l<8W0pYl2&2#e$RLd$g_r98XSgDlf&6zSz=EP z%n!EC1hf3~0n0ygmcP3dgZvo7f^1;AtWUUT*0~3*gq3Yo(l7r8k5(OE7GXVr%&ca z>xFM|f5%J0Ed8#;B=wUce}8o2$Fe8Br12I=*KnZC2Ut{+`Rv3gH zupPDaFFyh~Gp$}li@WI*_68$Tn?tp)9|Vs613d}+$-w<~)(aB(^hrj=nbh)%P2`xn zp<8Hha!z58!cV6zcW%=g@WG~THIomZ+axw4Kn2z(+unsC?#(4HG`;nEyg@Tgec7*3 z&u_Hy0(G2jQ9Rsiy6Gb_-uQL+I#r`gO7y&hnv+ea;bQNUR%O^=8YL9))UCpFm&l`P zVtMJJ(+Z#fRB31N;2E(3@IO~mfBDcweXS<=z8!Fw4eKA(I zflBAHq7&hai#rivEtM&6$D8X+FzLB*99>W3(brnXGLk;REqoB@76ss_0s2#FD`8KH z9=eEkox0uicY+g%A>upQQ`?-&CY?x{CX`~F%^d7u^`&SCZf(uF3?tMR4nfSrBwWZ% zmUc(wmzYIy_3nWL3cZNn$L64a*mJk!4{ph0O`+v zpd;H7@OV>o6x?4OR{Gx9&dhWcWmz$a6EO}T79J-9LWO132nplUJII=YPOSEJY8^m? zKb3mW`)zQA1XzN>mst!2tlwax0bFyRI(~KhW^0U*D9o-`7>jUqb(iu3uBzu*b^9s? zwVdcLCccUT1-;Loq;;QdrG#9$gDfuAC=N^mqy>5xd? zUg8-o)WYn8w0Zp7htz2&i+7B>Aeal) zn`Sf)uC)PmBcyd7N;`|MZPG5x3Y`!y*(b0a9mVysN$)-TyEExEW?rk877a1=!VGWf z>5tqTl#OB->wj3y^0w9+8yZpyXlRSrp5l3!C2M(JKEIm1?*|6vgvmzJ)-0~48pF$? z4*34fcYn@{a>;xK4m!GwzMsc34TbBWZ6-o_2yWdWyC0#dq(@c+>$aGP3sk83#pcEB zgxOcm*Y>ZL3|=h77sN2GT}ke&&HRYePjJ9gKC-3HItB)>@$)eOuBkH1jo*~9OiQ*m zmfxaUjbDmG`W{FuJAegxEK^^$1cNB1+vzfn*?}{Fr?Pdr+=#0GP5*l4DgCShv@T#I zuwxA~thEi_y7SMmwXI}OMa1Ql?xK1G*DWaBP9JJQphgGMugKBGPGlOGAUNDMp3?PZdz>X?G9a|^B=!T4Wn@3V!T1><4C9o=hsJ+xnnb571^RS- zoML1@O;U<12N5zQX!QSTCEbu9tSj}*w$!U_u4B~xA**M@ASOk)Hzul>VFKvJMn}oFJt@(*I)%6#d@pDFEdI08IxUma34mX+Pt-<$m*0PES9UX~reLwyxDS z=i@?*rA6|^^QMH@w9&Z?o4??f?vmD4Eg(f~sDmw|rayx>v~(}%#UJ+i`X*(4CCR4L zpi^fPck&GrzOaj$wKkP28F)$$Mf#|6XwvK8*8|9J1k)Wgbt%SxprM7dF#E@EAckho zDPP03U@5b_1-L3x$Oj2GlM~cupoE0dbS-Nnra6H@^7)SG%lo=;zLr_6^(Xk;dx{XOgdrq$gV{5TXnOgWM`1Y&IXNdBU{okbrAroVKZo9R2HO_Y@dJ z?psVZQ0H;iMYczz_t_V;BE8~fe@8z{+G2R`$)$ya80}+TdaRqWh7*%!nUJl%C}Fd; z7&833iG5Xu?fK<2aBqkDFi6L^IX=nj1V_>G%gZFAe$+-t;|u0M0ePxP_g$6-~$m6`ab?1qR&YbWqB=%Us&85GC+5-Mi&>yPPFSD6h!fymB<;WKO_MjPD51e!`ap4B#ES?V zz2ifKC;aU`crq>L4dsrS<_f&t4CIbO^>=t6=vo~6>yjSaU#jnxy}EG*-;isJ!<>mc z6pVpcM{L8;aE8x+;h`k{12G}eBr~0Ckjd4OTUa#U8?(-VNAjQqmr4FWYchSZ7l|{_ z8|OwGs+4ssrNG9tgRIt)BIS1Ib2643Sr-PwE=DO84DezfoeAkYwe4o2Gd+O+Dilp%6`P?0F&$OkIZP-6$qD00^u~v2)7IC_s_> zXZIh|71r>uSo&Y9(5WhunkznFWCu`t>7BLo<1PT|#Xk_4J;oYOxnR)1JwfoHKjgl@ z1K^ipqDyG>|K*kPA5C-fVija})3>-B##7Xj)$&Gx`eyB_%)z*CKHs`Zt}sCC&-rbh zhx?hiQVI8tl^sR`ZmCPPAj2GM89u(4s_0E5vD~K4r-ybbTv?&ZR4%Uh$XeSM+H}eA zb37c_DGF1(`g@p>kuPHU-;pIVIQhPdwc9*@F| z5z7;EDFk!Ft7g?dv6sMNB4INLLk9{ z2G<04cMT9cxO;+ILvZ(CjRgS5PRbGffA*>y;N#&7K9PrrBtH$pKl%TC|k zxh?d%;ppipP)AZ{nR5S}_=eYTtgI>@?(0rLY31 zVw5^}a~ZA#8RnQ_c?qS4P1!%AD@u&4sa2(o9P{;ZCOICz@Qi!-ce#1Jsc5`exK*xW z$L8hDh;ojpYrkd!ba%7MPF*Zl7h#?Kttfv|^P92jQc5tf1IcH_)CVc#Pi@NPqq1`Y z1VG+hUaa*_3!h^_-_|@g_?LZU4{#(PHwxS1ls^89ZhpY1hp>FgFlCYg ziiibMVQ;QF!oI+1qGrSK!?~3iQuN{ziGw5TNnAAF zGBFvQoupQFQO$ySIemu-!jyAf67ws{Xe*qto|u148&0pRDv&!-F(VzmcGGjqv@C$J zl!vs4qyF^)ptBEYi6y+5az;!3dhyw(ZYOHz6k*K5GFHjA-Q5w5()-^=ykGG2dqr{U z&bIkf^_P{|n+HzWW8fy(k>=BO)mpqn21o8IQZ0Ks$g0nF+NKtXco;L zF6wTcIgt;;=!`93)gHCDK4G%9n6MWMX`vi#K4BvhYi`3_z*{(I0c9mwG$dm&vsVgf zH(!euCYlPZ+HV&Ltt#!1biO^f^`mTDpy7NjfqMnF#zr(Cv!%~t^Q`+-isNS*B;;yE zUB7;=;!~$}{Zg&%hSEGUr)Xirp_;q>CP&2+7j)$=6y4sK@Aw-W0s6&xhU49=AHz9b zY}k76qx`&e`AMX-JiR%o%loW*vA7bjc3oCLinGuQmKdrL=Sr``VJ9fMVm)V7r=aWr&`5@@iJa?&~tzvx7oj|Ar3T#oBG{zs* zF9oW9An3x2ANUKJeDho2VCvcTP{XLW9Wl@L&}rI-dgFWlRuM z(?fE~r{z$5s!r^1EEFMLzA{eCq&61q-|OWNuJw90&+P(*UiBs}!}1<=UJ4l;`AhmW zlMQv*iJ5H&@eI#B%bHsB^3tBg0#yYkW~I13E=~Cf{`?+K$=$o&hk{-M1)E>;gUnM6 zD}%E!iN_S(#2B%H%lfcX3-zRUi&c$BH#|tqfv*tO!J5Ls;=XybMa1S0b29m=8y-l` zzMfw&h?>~WE^g$-^o_~#7R7X(t^RUDeS81Bi=vQ0!vzmex|3P4kLr|!RhNlUcsPyh zSn6x1ChmNi&=r5skk4G1sb(cOYOaS`rMacLJG+|NQzq~4s$r_f`xlp^7WGT%;^CQp zDLb~5oVgy#ja3U9*GYGZ?)x%hbJ#UE7j>-OO-?b#D*DUOyheStub!dQ>xZEL2rhjkRIV2H0h`R|t3}1vo+3 z?X^KK6Z#5GeLqHcTe3C-K1{o$lMzoXSx+IGFdGCeXS{t0s+b)RE?H=buc^`mNh;UQ z9_ztgRs}Zf-I^vvJ7!@mRXo0LkzXk8%xO7&0~(av>Y}tS$`#fytqE=%b(a_WK%1Z; zFmH%hi1{CFt+joL!j{%FRq5(aaqsU{B?6Q@@FqKhghgTCH8hq4=BzJ^+pK@~_)9Yc zS`Gyy(~ArIbFEvVciLBuOGZVi-_TJ%H3_`9=4d3Po70q!9krt=w9jtLR+Qr?G;!<< zIbW=A`$?Ctz?N2*MB0}bxLMhUw%$+gtUgO739S_ebi6tn8SQ)&P=2JDU{X7hn66}2 z8`$i@Z-{QB_Wp+ZaDL5$3O-zVM%I|VWL@eet8e@EF^4ijf-9&U1L>U%=|PB z7ASF%Wp1#1%%{Q+3bu}*fyZq0eY%rZ+SxKjd z_ruK9G3%gw#O6%7X=C(~GvnJ=zSaX7rd5eJi@{n`+~sC@Hd?9^`|M>N@4d{_6F$wn zlYJS+cTA_a-}EGNe!9;~&|mf`xn=&XyQHI6P@c%}7JJX;eHW2{STWBVXx>3fn~8|@ z1XDn#OUs35SW)3-S}h6KW~>-`r!6s4_)gEdsw^)rt|_+A)*|tJE`7I*NtB*+CI*zY z059LxlfHLEuxjh+wNZ(DuY5n6BEjdH&a{X55&8;?$yCZ1eLA{J9>4EpC_40ooaHx} zrbYcbYkIxkGQWc{mn`;pn%n{SY@_sH&z1R#jV0 zSD11se^2q}i0~_2DSWb6#4f}%?*Qi7cZ<&(*Uh}gS>sP2P(W-Wn5)TO9Q4_8GoZ{qxy;Y?+6pOo~c%j4u8N z7Db+K_p)ng25wTS8aTd|mpcF#cwGz_FjG>6H#c|FIR1en4F|gWUBXIs@Hg5 zqBPtDez&1*6c=!k@!%%JV~0~D+sca|$wewAD1mzr>wkRRLc8sNmRl56l-KwsdI7CQ z);DQ}X)v9h4}o$Y;HlqU7r7d~`#g_DTVP50=y!yDiJ5bx$6r`B;;5*bXeUgvaV)y7 z>;RQEQ%_=5Fx^LYQ2Q?6wKhxj`W>D2-wS9;0ERCI*Y)Gu;sdx8ddJiYa~b6(_Tr8h zsmt#W6HJlfYi%?!5M4!_U}4FD;|NR*)O#joisfbPd3G4W~`E)roV^@IufU zx_XEfaWd5tK@uv)r#_hdk~D)XU<<CeHReil#T7R9V5 zD=pZ6=5Bey5wWDjE4(NW@BG$O!7pfRtX3Jafd(OO1s%2N*DMxt)S_?Pcu$T&r=YCW z6WlZcLNmu7w(0(19YogOAtvVC6ThfHPsQ>C?n*t0tf$^24{qt^1xskYqA-5Sqwi$O zo#m2cR(kdg)vQpvTI2|ZcxkSvf8ajI(BzH$oK@434u^w764&iqB(}U+yP5nQw$!;- zp?nL(daMj1d=1%K&axLAx-Fu?g;t@ah5E=oPY&I5{1alSIRnQ+(WR~NhiOWX(ykA) zAk$1Fs&6~W)yFyPWKQ~_dOv!HJKfCMt66mK46H7dC-Q&(0Rll7&VxhP(wW6 zwVYPG{7_w4Sx`-VEXIM}aZr-u?qL}tW^D1lScFW~_06a2=$k(}W0(&E;FeKv5;{)n zRF)!6Gi`a^!NYh!(>H<<&~6XIJX^@h+9+F?UxXH?`5#O}xgvXjGW z9T2tV&-J?kDI;D{0{E2x#=`PE>xVIp{$l;I0}^``IYJR3^_}SjhSE|3Reb(Atgjky zNZDl|{T?scYJseq;m>_vhQh4H3{>fzKLGnkPxpq%8#ENVyqVk!i^0?^g)iIA3q|D$ zLORSK%KCb7QV!Nx)kTegw8)mPg!Bojdbp-Gt9?%gK~fr z6jQJ96>=~T?-LIL+3nNQ58Zseem9EN8-{O24uwh$ISC8HcgUQ7*h;F*9Pdag{(d{cPh6ep*s-Lq{Op_aE|NpJS4QTkpYr z4fAKPr9lS=;z3+_JZvv|ve)9p)^37jXm9dBWPLVEK~4L<{(5czdW~5pi12tl1{qt8 zK9Q0#1{Xfywdl{DS{`LgYr(cGiyU*(Y0y&JnPbKlWn$9Y_qn+U^Ivtp>xQm=ms7=0 zynpqn_q}O>eh^{#-~TWL^Pq<3!GBzbmxvCOqU^{iTs-_yCKyuZj$OQrH}H|if?Fp~ zXG^6hfH80pmAMiK7U&Q4$Wuzz5AoS2dh<9h?`H-5L+cbdl{rThgZPeG?Kj2V>9%m# z1I&tjEsl2cx%JG90_&l>_@SHB$-IXZ&2JLqN;!ZHF#+>?n+W2Ii=JZDHz$ncz$?6( zlA;_{iK2Blemst#m|PVFwf6Z;b5CZq6}^70K4%ia?c$qK?pZa^EiqWJV@LPuh$+43 z#IinAZfjteNZh=8sQY1_F8cadrgt98Xc5*gEHyITMv*dgzEpXj#K@7tWgIRg&ADp@ zp3y%Gt$ejQ26Gzu$V#V)0iD`y0!l|KOLv3)#1?UR7Wy8XmDHwiucS9c0?4dKF^RQ{ z9hAkC7oG+Vr1|0wFQiE0xYa1z?09RchNz}fZEYPa36g9PzYS&_OTk$rfbBPH+6Q_~ ztsNYx&-A58Yo2d4;2QlDb#kOw0;wC`H`LVCS=#DbDF=Ho+X8ujheqgKTP#9*P^=xBl$a?e;N+y7)G=ce%a~f7JZe1b0Vh!$jvH?0H%k< zmG+QZwS9im#q%N2>%=w8>-3B2BO~fGZ}UBq6M?4*MpLbJp#l8H%}%5{o<)N>oE`nY z(4xj)SEV8($_h-#-yPZL=3EqPI(n__nEQON4gpY^%`Y+URz zE6i*{ijl&}v|Bs~&xxXxO3(k)sVn_2)2L1K^=w9>uI+M%%b>`vOf9a?*Kt1AF|omo zR<7Rck6QpRBDnwcIR0J5RfmNDCOjL_&#y9)NF{H6Ib=?vzuZF)lX=fg#Nq2y+K@pWn{p0_3j{nP)|Nn3Q zH|yd56E_F@Cu6e7tH5|=n|z*3`m5P;vC|8nlfr;u!XLHy8&u$lacgUi`+$_%{bph? zTUP_Jrxo~?Gavi-)4>DC1eyXz^uVzuw4CRarz&) zeJbn0XI|s;;%J76r{Y#@RCP#CIvIH}bnKC`qrvU!UnA*8G$RG8L-~E=dol%jH?>Hp zBXB{~F-2g`u|YUg^Y-!fX@Z6*`G5@bUjvByh-)1jU(XtW z>VA!qJ2n%tKhq}>|Ikj+v{q+Y1V+FQDhbZVWaN=s-XGoC>lbcT0LwnkT-Q*N>J2~}A@C-- z)&|B&+z|EOHAMcWZH_)0Rj;DlG!GV;Ded@{c>@7UNe*!5rjgU)G$b#Vj8s$pP+FSZK*uJ?s+vDDD2oU@IkiwXjzlK zA^ndK!T!ICgiy8Q61bt3aLVz&3LruJWgw9tPC5K8s+>zS;0#Cb<48e=LCtq zfPE(n6r}4ng@rRpW5f-C|52xaqaHwBS{sog^PmhR4QNptj>%M3J)~HepU2vAs>D z+wRr}Ce4O0Uvy$d6kyZK{sB)NfaLrU9W1*WZ5A>2D^xRa8(Zn`Z3J=u=>bdpw~Y~j zN)JHI=Li-SxKYK0ezGY@CvU=|ji|J4xx!H_{A?~8u1$lw4k;?#_Gw#S7#P|8t~SV- z43_$aqNcHj=!*LgS|<9Fl{`uFAymy_kjGzFt{Ce0vLT`SNpmH*X^ z`@ipFz)Knp-n_|+@A6IloOE=nEPoEPv)m~y_3b_$Yrm6VX>0E=5(O=_>^;NO+S^z9 zPC*#;9q$g(WeuhO@R>+J4s_JyDt-9pRP~hW4{EOvGs}>SZ*?#)ycGpz3y=9+ZW|x~ zt4bJhv((|0h{ePq(-FOW`I?LRdlv^40H_((CPWb4X6XOb*^yd-BK?Ca0(BU|!+d;; z;)jtNYqIb=)dKffHq7IJyojZPopRPyO!3s#_mt=O3tZGD3EL% zKk&y4NFnWqwl#LWylp(^$sF(RU#`06L_{MF&f;3FPvK)pm@OxGs85)ZVw@q_PM64J5)nRQ7@AVh;D9cvzwTZUJUgD6K z;&ai7Jq;}a4CC!@+9vmQ9|7|8%W?fWQ~Sz`m(Fr|H~AH1i`?uV|4qs+jSQvBTuf4F zj9D-$YD;(;zF>-!K*bjY>I(gW$^gI9A+WU>6RIry7ngKhI;&8Ufe-hX#`kqrMVts% z1wrqVdZ;Ufx)LJx4{_W-gBG~+F3N2qo$B%nSS9;wu8Gg+Ea*BcU(t#T`vb_Ev)R8U zy^pnV`}&pqlXAylr#cwGKSsa2jZ2Dn@CE)Qs$DdxURGQR zPKKusi@|y~hFviE3xjF0fVPVoQ>>;y$&Ool9a9qQX3AGeWUjsDq$!I(Wp0t}vVgEz z=)>O~@_lpA4&Tx^Y3cL!7nuX)xM?2dKe%2Aiv3WFdXh+`aT|aHKahI~6UP=-uv&vS zf^k;E%c&bHY&zXy91g+{ULPuR3BJ+UZo*ECs1Et?^YKFFNFk{t#&%~>N%S%Po{TPp zHvCRo;eHC+nq2w>LSG*8rI%5hJU2A!kCrv^h4gnMS2ZuQE$&0+LCdB!4!%FDt(~n| zR`H)A&_)i!^Jspq!%O|tO#%=Q`9EaHu4@JOQEAltGxbTYN|OG%M2s$bm=QYG@$4ID zMb5wEwr3GkYHT63EX!|vwnlN#*OF*Z6wK&*)PCd3bq$yJ!(a}X+s_>fV-qV`HhZE! z$NAMWuE0$jO6t>$J6+;LNR;3pKyV5L&MX5phqW=kmoA01z$!Ka#6>Ugbhx494E#(Q zCwZv(?Jomq>L86cOlj#M?xo0dZw*Xm;cq$o=v1!}ADk894VD{b1!%@cLDI{sFgrs%ss`rSvv>k8=)b(uHlPq^rzwyb;sR?z+on%{VXI!(!$r(6;<<2o=J%YlMN%_w)nU3* zmgKD+2hFKDg;8BrBbZQln#X_<`+7~RqbAM5m6gRs!JOUn$8Q>A*}?bo;AolLNRsdI ztEii|vt6NTm1Yu26P44`2claa87%PgAhXRUIw>v7WC^}EyAZ<;D_oywZ z1}7KI25pl3{N8YpU)?Az4e-I|w$C!x-OVc;6@h-m%vl@I)6JwA!~^0Dxz zNk6^GB+KF2u{B_Ff*%jq<@$-q(;c^sY*b{}Tqa~6whF9?)sp)MG7745%)PDs;j%_H z88(IOqk~a1e!P+E!o!J-tff_Tbh98^i+mEXWJ?k)b!dCLfpNN{&As9*Kj*~#ct`hz zQ&WEz;b6Ybg$@sB`4ww*T4A7hHa=ONDpQyw@bDYi$Znc@kHgSQPgCWO8ZJKk+dqyY zIH88^0M-C0k=eDr{jp4cR9z!8>sDd8X%DqU3OOkgosV$m?Wqdu{Y2qVd? zPS_W*nBo9d0O#IA|IoQ<1(XA#Abb? z=LxmWX0*Fdb(iX)4YF{g+AMdw`ewfKszEpF&ybICKRrFL_lT}mjB-q!^9G?J$H6d~ zv>+p$s&_HXRMQ#7mkN*u$U+gnk-_9tt*NhV(GprDN%-FPc!WGNGxbW=<1&!Z?uA(> z?!caN0H>pJ(pn-&cd_!hy6_)33v`9!s^{>l^lwWGWPWYh={{ofSC7irw$5v7gM`g? zgVf`V9?L5a?sx_<^At?=o$50VJWM1cE?E~Rgp@xv$YoGTqR!K5$|`aagYto}PJ_R$ zf(ehU-cU@*WBTO=%`HU;v4X&TMocgH;%2@FQ}hN1p@vBQhERGwmCEeZ(g2i_HESwz zTpD?7gj_6LDDg_ztsG7NCmYMWw{Bh<-D5=*vRJf$dZOlUwP0{7m&22C&cOn?)GpM4 zw0*|y@1tl~JzM5V_%w>vWRL60(PXFYlAkniFwE+3bi$&ln;N3oFFzDuCMmc!0qbUZthQKEZ7r;}%7Txyc9EADUsc(SA z#y`?R8YB{Jv2vFpS(858GRIr0Ss>4#~&R7J@78g9wXNdsdK^cdA`(_pwcbW@F*IkU{rkloM| z6w27smLX*0;$qbV#e%9teQnvIEUKwhb)3U_sqTR_0snz|PUN8jC5;`-2=x9zr}~o| zb7=qWnxUjUWHqiQc0Rjy!6ot@(akHVY{H9C9_6V>V|Q-)HU14ZeGxSf%{I0~$7JPH zR;)LoPmOFi-_L64&8HNJj_&UhNsN<$( z<_=+?rY2(f3$_7kB`%m@UmVKl3~u|eOhcyk#$1ZI4^A*a_qcL@WJ6!G_N@oPguy>> zf*<6a?=-t56b&h_)TM+?WX*K3LnRr8cm{mbJHZrhMM?}2vvgGm=R$Xll&LECbEM_< z>_hW-SoowHgDOGhX9KAYWPL20`mFnN-CqNjwZ-LC9am6Q6G5&`ssID*rAkc|-0DiV zJ*F~8&)#LxpZaLd=Z4?LOG>M8Ln!5V3;>6Bj!*n*KdjQz*V>dK)!X?k%JTs!{j&`f zuzchd_ruG1d^xX!ey=Sl4Q9uvDC#z4kyz>3MySy*l(v4s94Ma2(2LZoZj$3JZ{Gfq z$)a5g$KBa>cwQnc^&c|x zP#`^`FYeT8oP)mdoD?VS>HhZh%YIzX$%6&-uh%zp2>$E!p^{R^yDbYCMGd9&`%#2` zeVf*v?d14Ug(V8Dx6wD$U+JT%PZP)!AtJ=qWCYk8{$=z^%tjNbao=lBj&cgCYcK$`r1;S_Itff8g6W! zW0_X@rtS94_k22hCIRGjkFIWS(CT$?pT?^_pK|Wmpv|EKSp^JmH89I=W=(ZKv=8L4 z;I|;S>+$}?-ETj(CFl#7<5wiV;ZPPk@4*KO=*Uc7%(o%1JV(;d7!jw~?2DrSWhWJC$ ziUTSfF%l0O-A}fq5-9wm<}$ld4*$b_`|DJdWHLw@zMzW@IYH@5J1@zkEIw+--7OeZ zx1Dz+@U)MN+gc2n*}Ii`Lio1f3KOjBgbcZUk!aM+*P-2WmlmXI(J77y@-A;diYml5 z>~k!k9(pg{N8#%ctTnn5Vu3ap6nt#PZBCJqJC^DWTgn&)6CYwV!n{e*yNbjj2+PmJ z;evm75j#Wa9bWu@$g|R*tLx6Vg!dlu#eF0>2^EH9AKKEgk>8o<3Rf4GWNfjJ&_4}9 zi80b4e4GD(6sO&O(FsRE&9)h*TBUAJ;XHsf?zt^DSoB zaC{-2(vp}(!gDQZ@(;d;J5F2*P`%w#AJ>gmreMUDpw{BK26(3E)3fko0;TL&AJOC5FZk#JrsS&DtywcJd62+4&X`B>PxpE+APM z0@(n-2>`Um_}MF-B0`iRZIfSRc~=@0B{D#{lBcpJ?6Pw3DY`vTEYnYH+x{*aVZ%_L z4&e^~mDzvOR@r65UUN2Azf4f2{62MVwhw;b4Th6Uy(MmXtsA>wu^*Gw1`2rO8bbO8 z^^IS1StUX@U4)Oh^QJyDLb#FUD|+(86cTxW`>CcHw)`)5KjSm;!#bf#!dE_2rC;J+ zz|W#d<31Gsz{S~LzI05!1k{ru`7(d?k!(_63vcmVZnoNxHTxP9AV5cvG}qO&*@7q+_oyD*;i;k$f~38) zLiT#;>g&1oVdX<@QT8f(Rwe*!OH=TAi&al)*z4%oeW6i&!ntJ!03|CwMaPB#bWVo# zX``wnu4tbfwq7q3Iv!#g_cSZxt=ee$UPBDN?eC!P-H?k*|rHdcbl9 zPwH;S6s)Q*zgW8XG@r@pcJmm^$tqB5mnOD}j`}IsoS4C;7;Z zvhL{)5|QhowuNhwU|0TCRZMzie(F8CG^p4Ov^Uyj`MLO%J2Ee*JPU5XW1kQst3Ity z%l;yz?t7IGIcQOy;>?XhMLAc_719*$d)B|$V$)^u6E&sh0Tl>Hem4!;`nJbdV zA^&-C`xA%?20g-j?3rAIF!5~_vhTchA7Avg%&1}v zuAW+6@OnIKyAwPL5i0J$7tS~FpRL+Bhz8_Dkg~~2@?jx)t-wHq&>Kgl56LOd>IZ|d zdDbx3K2wG)jDw~B$Rh9$i1QJrk!n6s9E z#)(aWgjgnET^WjA2AmN9h?%8ld9sh=4Kr58EH`^JVZz>8lK^1>#-c8uS>(1Wm1-pP zt)Qmh)sHtK9=Me}xyhLk)@x1^3G2S14sS?GzcRG9S0UOb>|lI!9N@nXC>2BDp{Tp_ z^2Vp~&2NTtg)PS}xT+}Pw+JWdXIbvk&4Bdz=*oZGH1 z*-4xnX70l-e5bjH@B>4DB5<5n|AL; zMz-lXViez`v(T=@bWd>x4+!CS?bS1AB$Axg0C`yyr=9jjFM`t!g8jk?BNW)m3-|6;mbGr5x2y>xabtZp;+}-4UvmHI$ z6TRTIb)HQ|F7-5Ca^J*X+8sXuAkxM4AQ34qMfC(oJIh0~(Fnj&#Lq^t5cK@Mz>&d4M0I+-QGi~kc!eD5x zel{5V&UiX|PFT*-QD`i0I7)OXE(S?ib=>r>SJD{qFwG5`tH2m);?`>U+Ht@;2va`G zCdTLZsg727d3pRrChsmq_htC3ejvY1ZYP%6zhM#Kf({^<@WVZ07F^A8g3?!oER{+X6+HucxWSmB1wEsqE{;76FYC`_MV|of>B`S%VNYN| z_+dTbmN|yQwC#CeUVdiT4sUjqEfM(1Vnqw4Ql1ZRm0wSVQcR=XN%f8 ztB>xLvMIy2BPR@OjsObZ?B3vg^^L(W{IRYn`3aeaHTILqqGS1j9V@6AK*hVwV5G>j zALAgAb<{1&ON@9)RQEVw%-rC_XU2d~J&AN#t_)7&3AUOn{W;XG{RxAlt*?-dK;Ec1huK zqw?3-kwU%@n7elb9m(Pe^&Mzqpq8DPi)t(4Q`k4rj--gQh7(&6W6iUt%3bQ$naW=@ z8+b*Van+)7VNUIXh+752!k+$~Wp{wSyqC|5nnJLUW%2g<<7=WpKPIC!;5sSmu|{!g zMFo=b-|sENBpx!1{8AbQM3wEkc^LGBXzl=Njcw-!1+hS3=Qru3r@SdeNpO7BINva5 zNzERJr|){iHl<9KVgXXf$`P9x5G&}0R9`_26W!z0pvJGSv-QoaG_7sq)|8*WkVDjC z{E4qfm~_hQa_Sllt3L)}dBcMzrk$MZ67zS)*6!b_YN&4i1BW-SE38^5V>4k-j76ns zht)s9vF~gsnsj#hsd45P525IS%V?^(B^ApW9+z7Dj?z#n9SfV8v-P_>w84g(`5HOe z^dit}gFX0kiU{?!sRiAwB^Gzp>8;wS!BHxTItq3Mrh(T6mLmyX_0N>|Wfk*%g4(?+ zuO@o9I~ssYX5LubVt{_f8xOnzkHTK%Ge~6JXgj_E>)C}wWm6&Y&~-Obfu+(r<*d^y zTC8}V5dams?%s)YQUMYs@np%X5rCDA&N8th-7j#gi(z_bYfNo=hs5mO?M=uyp=R6= z9Yi^6tsk;#&KPqv2}UNlEC93|0ao4X0xl4|C7U$#5lO3jq7O+C>t|i2MT4KOc-Z>M z7zZ5CCyR$)r4I?$#~7>!7`*k4{W;5Oc`|BV%^>mZ} zW+@lAUCZfM>o5=nF<9`!nWdQuCw!_&*~A1_R9@31Jc=%z3}$@6am#*|1L&g{jEkOx z&z|QJBpvKP=7YnG97Ce(*LXbd5<6HLXjONUPRyRT=2_z}ZhN&)%)B`VXoc6AK<1N$ zvV&VX##k&TtbUY|AX}=k1?)kbxF?|+DAexV!+eZC=tM6mY3+#vW(~pQCKL6xO_D3f zS_uyI(f2I0V)!7>d#~eAgf9R$q2rm`^mdrfbTLkM~Y|!Oys3 zCFh99fATEupaC?mqWvd5IYhD>Q*)=|A?6aQMW2R;YJnkx$nH z71|?!920w#Tjw4p!>H^`7|$vhYOXh$!gC zZ)|6NjF3EDjJ&8^2)s9`^KmGu41VIW%-hfJxwO}`FHrH_f~e^@U+3~U?w!@& zFZnJGUd&*az3r4}^xJddtu1kqaw$UMB7lYvRE8X>qi&%Ng^1GHrXw*?fz^w5Klh@|3?8uK)aRph7pp21HjR>=3pNA_ zKHoRUOsWV4_FBHYl6zt_>hWSqcoLrTuNS7VF$iX9d=R>RA&1|L;9)M4 zYNI2<)(QfHuQ)*-t#%?1?b32m`=+8icg^W&&&Vh6?5-$=c|9s(ER!r#ojRg`*5Frq z3cwe0@aCRmTvNKV;~DPtN4}n>;ukyXO?wkmjBWe8TW|7_DnOUfZECU#{n{9t-?Ag(mi<7n5HU)^zV^Wbi3zV4;>jO@ znb#lJE-o0JOeoG7W+t{?+CznWVF$vJr41qL3+=J5%tLTKy!?j4=*aX(ol#`9E|{B; z>3%^D)2kw02scmjWQ}l<=yS}8$<&EGp!MDip!*Mfk-{G7j#p_%z(ApxJg;OpBM;*XucWO>-qpEUtY+Si zjz0b+bGZkrbNc2Uvtu}@;b!#y&N;U~*H9Un|I48Jo$U7^9S+qDEMG^h7raAlf)^r> z3S+?PW`5k;$6)wg#zd3;| zqKfeE#Wa;adv6p({=RR4_h6k3%GsvTKR^C7djci6n0e|{$uL_J^k+K&D1`Bzh*`=6 zOY>Hx)6LANLkA@jX19oLORo(k^lBG8EN8cF;I37N9+(#l4+O2<5I6GBV54SyOfk`6WWaYZOAC}da8AOMOuu|LtcT*h=WPu6PMXPaAgRu^^XR3nG$E(cnU_( zIWJ{A6n;yTjfBKfFlKeC1N>s?*6seKDLi9K&4(=(nYINwgXX3bDTto1zu=RHw0a3G zEgUT^)QuNi&u}Fm|Tu8 zmu$)fP7ei1tHtL^7d;cZvc#K;@v`j_cCTB!-}-6fX0Xn5s#0&c)eGK>65jciM_Jz_ zrI0G@ZtopT*SruIFYDW+rG(j&4mI>=l28X|2CFH)R))ku*CDJXnVF z9D6M&)az1C%c@i7o$O^KET2z#%~hXG_6CuaHPTc^zqny8OeZcuTJfii7gR?sfAN+- zyRr-8QUh%neN5x81k!A+;o%@(o0SW{$?_DOYk#WorMb=}HIg1C{LsV%P}~j_UvgJm zlR>nsJQ9hF1 zeBr00;{kwZghG~=H=H1*-v0GzXcaSx<3=%c&@mxdB||rP_BEm^pQwX1f&J*i6A$ik zftXcRCc$-OVSCIl>mJb5cGGTbod#R;c`<&UM7r6w*Q-bRBHZ3Q?|Kx0UL%%5YUMa- zfcX)gLe2WJLmNbb_LzJ)u8i#?RMRk%-!Wz6?cHk5$#_cVC$QBdngrcIyK6JwK&qeH z!l|?S0Lk$D*{$_(^(0;#%g6LRD@c3in}cNRG@zwEdQN*Q6HgmIf@kr`LVy$@>d~TQ zlJHJnHnw~EUWIT1@~*vEON@bz+B?X`lO*Y+H~Hk2{)rpl2;hwXm5w^JoXOrf4MyPz zx*TW~NDEQ-3ryaPIlg|o`J2Lo2t|1_Z zr9MR)-YNUo1Jq69Q81+;5jRNseZsva0ODwf8n+|!->grD03|!Gupi_BflZLfFQu!z zzg$nTj@%ls-jV;{O{JiMZypwzBtt4!NdMlPlCsJmB$RvjBzQKWPq+$`@ZZZx46QKk zVdTb)Xe4IIKW53#Nl3_wXd@SjGCk+v-lDhle(vkxjA?8xJ^$|C7vGiq-WQ7a*5Bn) z<<7PXU$8J5qo90Lc)>k*g2rqB!ATTK`og{EPOh`Bk#0=`(5U(M9?ES!t0}Th_x3z+ zTx4w^nlW^v+-mpeKmgKxXwfH}mhV6Op@ZZ}7F$ml2??fe3f*-tGafydM8=M<^!4`Ql*TF*W2T zMJ>?ob2j%6Tm&&0Vk;n{`D{-Si3k-Wwa)ic;5}6=pJM{wRhZHSa;b zbn-G~H{N+~G=UH~b&1jmIfXI@*J6_J-X-OE(=1IsJcXz2)^x1I$V&0`{sTvO~cMLnnYp6!E~)DLp`Q@Wy!Yk6a2@$-ck=*(`5%k&@JaMfQ8KcM8>dk}fYTio)6>(?Go`wpls zTfh_RO(6&-QA^Jxjhqk6wEv(A=juMs$WnB zB56e)5co?u%68|l;lcCU-rf~!($Zccyf)y(*Dv^fx>j{35+G*OE&9z>avmF0$NwbY z>27Y-P`e~;rWKVz>PEF%=SN~R>b-vCz@KcTn~Qi0cm6>9EfQ?=fT+#bC`r4}&DR0} zJMggK)+jr~znAiF;~M<@1%7FEKDlwj7=<;R+F8=tOg=L{40*)c$!qpPzV5U#{-skt zHfc8L`ii3i!*G-)rodv4L*jta8y^w->Rx8omTADtJfyP^#0Vpi)k1?%j}k|{VPSeD zOP*Vzkh&7AJ$o%gf+iyP4n4Zg?K~mAy5fz^I6Xi~@Jf#9eVGHk&hOPbx4Tt|*zKjE z{V}ep5IU-h!fBf^;*LGCv-Ho^&C~Yw6)cqT9w$}tg4;!?`KIS3Yxp_wTZYr`LpnVv zam6#>6yWGpVzHk7XJr(ZyD5P`|gW|(iSO&V#TFJ3k3>=QZ%J4UfhaPplE};1t~7U zX>oUVcc-|!yCrCVknZRG?=@@9nzhfKGwaOxwmy*|VMy*g&voC|^|O=P7;?>}1!Pgl zaGv?Qt9O;vb}MhKzyAfL8rZ!(k-E1S@mbf$+m9#o%sWcpXA+Cn{Q68@pq<4>OD4IH ziL_1|$bLQ;rV&t;VYdb*B6lOseUwf~8FJ>ONISD{_0rxhnUN3%iV=+cUToT$eL=Oo zDTgH4wItDTT-mxwdTONsR>^pM`Yjus%E=0=f2Y*`H+2OM;%i_>vZ!Q&Dxh~sPdxt% z@&nsz?9XtOA;z$BXBiNpSM2&&qferCbOj~+SdyRh<&|gY`IL#R;+5zvcEk_U(~q38 zK6GNiyr4i?hQY<-a&r)vsr5i0IrF!(1<#)$gw_TgB$WFrW`F<3#u;dp$+?$6ZAV z|4R9ss>Pqth3`%n5~QLS9V;D1qPv-~ug3{SNLl33Kp26@3c%=56ugnt48A}@FCLaW zd4qB%ai$~Y?PpdTAGmU`arb)x^r7i_{>@;DLG$MZuv-&07C8mza9RIvaS`&ebewD zMNwsHJ0bK&MCO583cx=WG4AKp-UK~XvSw~~Gd1r4+0tPdg_%?S^hP5}A4K(iXm-Em z+j9UonV3|q%$5+!;}0zRllK;rrBGKyE7KZ;eX{Muei(AzgKwA(l#P|sO!}p5PfxI8U8`=$E#-F;g-l1)@?)8d;5UF zP+8H~k*<03b`s50SQjcRS{eEBH757P`C~VP6oG6h)+UD1`r?}pOIE$2NmSs8P@Sh{ zm;FE&LGum`e@kc%+~K|_iU!cs&hnB=I$C4^Q{!Z2?PLk#&buGRWkw_RH@J1`+}8^` z)_Ip`C|r`A{nS1UG2&MOB=(Xu&Qx1}i8&&)uaSPZ<#gokTzZMW>hB#%MJZ~tOmO0+ zZegEVrH*edt4RUInj*m01KT@EZiS-xz&)9powh%93K~D`(mb9)*XKS4G`$aC*!x2G zlJiC=#OR?Wlo;S2VvDcXrXV)acO)2DYi&2g7iGWdZUxUQt-Ns~HpojkwtUw~H=<+& z>po(4JoXmeIbH9$j9XkrnySAcSeG!&cDJIDoGF5K%54%n(dqV(w6c0VceH$lT1I|b zEqffK9t(9=({)Cdm?CkBV@2ix(zJfy_6;SJlv#Te>#Odf*BK5ck+=cDvhfeP*~`+h zPCzI6Q$?zy|BhP!7L+@k5-^<-(kkS#2{+08-ixO#;VBLBsxJm`!@;f&o9B!H@gLK# zsG7X0;}fqR<^19Lndg;L+CU|3HnRF9p@b{6kM?;jmDun`Sn4XnGwwN3yNd^VPNi3>t#Kjj3*DM-Jf#r^9(g?dd>=o>2vDg>-gptK16 zY?RcLrKfVY4hW*66sa*YfA~+04fr;yEGW*EhI&i!eN9(_j&S}!qm^Dec+Js}LfT1b z3NNi}S1(YKPufz6X&*4L^LK4A_6>P#OZy7piK0AnaqhYr;JEX~gY|!uu)!+t7%1%O z^x~Wnm=^vr{+N#Eg92UrBh^Bg)Y$1&K*6W?VVAY(6EGd~yVu#}9e%}Y9WvwQp- zXxl0QBKl&y*+$MciPEQcF_|);Uf~i=W0+{NTv@GOgjg1xIG{XFqpxW5@gPR zv#3Q%%Dmk2QYSKZuN5y=l%IFpf3(ydL1@)c&t-VO$W(&gJ^qNsQkA3b#;PPcfW zVSD$wp0@2(DgPSKE(Mb!mRuWpg$QDyX`S9|d$LWNw7Fu7HOBAtP^@U6qyPo(@$N=M zoliA}Z98CtTBMir0U)4kr&5DWkZlE$_CYJ^zv$_DV(Psthuu;@uGZmz1)C_V*;qT+ zrS*e}{8uk{+L*mAL5~=q@cEI(`aV_EQy>fSVCJ1L08qb-h#3Iy70mAIn0Pm}a$A@( zLWrpGfp|9i8(^cGJmW^FCz&G~0ms!(WPEU;<+DB6m!)fbB z$FYB;9@WJwdC###x{}VKr0J2*Z_2U%xQyN%YP@Rbc~?ASXCKm7MYdjs3TlMT=--o1 zPpJm6QPpsn3UaNO%@GWG3!krT?Lqk1A$@-|iN4r|J(GYcZ0p6yw*wh~Z*37^&H5n2 z7rW7l9(g=?riZieBFeEY$C#U--vkqbEX3J4?O9J^(mNq;O%r-a0GD&S-Q6~uYu`3LjIH6 zar$XM7MfKToO%W@EqY7c*UNz<%ern;MlU$3rEP{EAcJVb3XC?N0T(}wPy5DJ7y#_Z zIW2tl)ukO2hjbio8mu%ZeVh+Ag9#w37$GHl<8MK#Z{HEnKc`!>bl#{Ug*!d4dc2MS zUOpVXK$&AStX(dy(=b}G+&_OiT3<@Fab$5@8o>-@Bhye}UOJ{qV4;CO1(~sQ@v%|e zdBJ_(0=LoOwC<<%>F{Q@+rZ%O5j=B`JwV!ZDl=&{Jwwa8E%(qrR<%q;0%+)t^8!b) zlNMh}@!K0j7jC9(-w0?8p<%9B!c<>81GC8;pd2FZdl?}4=qv5o7*?Xob9LaR4!hJR z(BYQ)TGjo;_Uw#cBM|J*<(nnSh?vRRkXHNohNj%cMw&`;D=X?i99-UXgzE4Rh5pvq z@GR1C8I=x^c-AFsPM${RaPyNG2{4pu2)YD*Z8wWMDHNyx(3kR6+&2`zb+bjzS17(Z zxPoY3K1?@^V-#V?9@$ z7HxyCEt@kR2m$exT}u`4dD}Gz7)yYM4iz+Auz`IMnj%ud*I*#Uw7*lYCuy6y;g1D& zdNH_rk`-EyG!-c>5%nvP#WZE3qW9TvkQ2*7hIWh6BKT?pHzdzDlMAzqxv3&Z{Tvwt zsK;fpXHO0+ngDhH*FXqS;x$Vlfba5hdH@qp*2xhplm{(zjgP;3ZcFr0%>teeQ&3ZC zI)p*kJrYd$yuH>`cI{dksH2td);N@;uQ9PMNk%EZtNI5CKD+?}BKX4LmcJe2F{wYb@1q>boNdlU$kagl{65}5k{njX zjhqb-LL`RnX%mVN9ecdewM{+t=-9nufhE{Fx3RM2tMwF&FTaa zGalw>S#V!E@`%Yts1~q7_}=9C%3dvf!2;OP^rvfdAGyV9w-(g_dnM}?6B)M=*ECcQ6Q8PqV- z>AArfB<2*rDQ7f)ZOs)DDTFGLk~NwzOMlP+4Q8Qz+;$_j!##TMphXUVLf|cl^4lTc zKBsIrrf~N7J_Td1p zi-+Gp)(C6>|B~!H_0a9;W)DCG++%4VpF^QpR0cjoKaGe!)S!KV{O<1ca_;oU#^)mn zx6Q?{ad_$1Ex3ajEIz_igKk-1^z3Cxj7kxE1({=$vDeMS0+shkv$8y+?Y3@ z8<;3*gf)JJq5u2^t@25B@pHR4_odR8M+O}a^0u3T9^C|@1^do2?9O#$mS&f#;JwRb zr;gTyBiPY9MwFN%WAdAR`-8B~Vwafi+iEm3Ejj!k+ZpSDY#_zr*~$B(H$s!jA&`@V z4L+u#l~vf~*-L%U!F4{kR#?uFrBFhet^gf3f`rQXNg`_iZyojl61;YyO~zl+A|eB% zqBF&-ZI({x;x>X`4F}RIQ0Ggu4|LR<3OwyJ_is?y8gA)bn(7=ORV7Hqr?RpeI68x2m!GY|an<_;F>w~LM z)PvFt__b{9XUeqT?=aUJ;VVUgN#+*X1u)wJYj?nhATrm3IU1KjulZ7o#?{iS*g{#& zL$B=Ee^jVgu`cIn!3$E<(7rZ?vfD1bg4ar;PkMN;!l#M=6)l0qYpiG~D^VKcSoz9= z+B}N|Fk*G{R81Q?R7Qalh1!Az%kYN#Z>TbG+RNLgC)?K7!|XhVp+pTBXW} z{vi<^sZ@1cg+G3a(98I!r9P!B6Kh33JVbC$8Xu70fGQ-wWZgbUMPADpFdlT>f4oFX=^;{zA1BQ zqH#vC-6@MgOi*Z5Gf|Q;hqULP$1J1e@)x&~oWC#GWz%^D^64OhQFe`bZ9AeCmB<|E z;nZn>-TmH100?e|CS0Zyh)y_Vqfi6pTU0(%-m|c392F`~{V0DwzxZ1;O~Lo2Lz< zCl!L=rP#O)+p4zFo@Oapit4#1t3zkjyIaI5OxZL*y;OH=X=zrk9beQ=k6?{_$%=mV z_>oIs;3ZcUha94rTbNCh+@lE5ux{e zEsYF@x3K)-)+2$|!Kbn$>=}1N98TwL3%CqC^>f`*FKzbsL|KnnTF`~&+~#{C%zJj` zS@{_c$BiJzr!wQm7s&pR%NHLpQ~YwJFEg|EdbBu?ul2X)@&qlH{hB=gg4W)-v4oM- z{d82sq1!8)+}Ann$y&MIw0_>n3BHg7Bk)Zsk^V-WTh&7kZ3fDn7q&KG zIhMdjoKTtk)bJMsa0G9sl^jZMmfOly`Pei(&gz!YW}gsp&^;{szaZcrT^8lS(}JPv zOttmNnl0u2o!^p#>PK_l?JX|HSdT-0E#=po$eeDYP3}n_`n$SI(j!-!dwXQ@xUn#= z>9&+19NqH=Br4>}Z}4)Y`Wb*}N{P`_EA?TW$|vJlH}P?D1NjdW^rjUQ45>9aPy`$M zkb2#i!`%QE6P03R*b5Q-$M*7Xb2pY!ikVmswyt>5G%i+~pC(NjrpO@2n-2!%WmxwJ z+8Af3qxwbP72UknfF=9EE@_}SGKrRny3n$Il4{5$5JEaB8zF_}S$WGIXMnV8_G|~p zvhU*87PM0n#JN+I5S$BWeQNXLJaLB6E0;gw8d-sMA}xY5&0yk}wLis*%{6RR%LW1G z+4!r0{yYj5yRDciGGS}e2K_EUy{rvu5@1CYirWoqfp$EzhrVNN+ji1tR%9505`%ZA zzL;c)9!*+Q{$e4I=?4fdL9o0Q*~A#Th}A77_J1JBZ-^Jg96fbG4o&$d88;MBHsmlx zTi8s#0&Nk3Sg+QpDtcD3)~eFBkE%6$liHy$PR2rb+}Zj&5YL%JZSg5V5;&-6(}24n z_`B-xLCL%Va}Gu#>{!oBkS|vKu;Jb+;qecLCU=fcvW*cg421r{k7sbX+Zm1aWvC-$ zc$~(#NG>Nok@Z}=U56CQXEy%0T2RZy&AN1Ap{j_0<~YqvP__9(wk0|O;t@x<_HiHU zJ9cZh%yEX6-M9|cM=8M0)}y1qDC1>9=Vuobw@u||Be11WKZA3B^Euk3G_70fv)f6q zeV)v=@HCYU^a*Aplv`S;D9d$;T+7oN0KrLs;>GBvLw$g`7Il85WuWcK{tQ{@{Ly3>|uDkmaeFdHm_ty`s|4b+$?8>zKJ8-;hp5YLO&@>eBi9DZ;6 z(5@GfP&a!=ywJEw~M&Sn4oANHDU2a35a^+}28NKN#!USSFnziDL2X)xuF z+k~IF+N$P^J~NOIp0D@>d(wHYn3v+a?Br^Jjy15A*}b2mS|}7JBYtM}feuYE8OU+Z zR&$kvcX7^9mc#OkCcsYpu){QNo79wsY=AT>Qdt$ZZy++n7!Pv})gbVKdhFec5N1@O|c)F})XJV_VIyt;D*UO+`L2Q3%OEHI>Z?v3U zVrh}`T9j=TCHrHB@_DF8(U*5E-FX-!x71!W`s@BVD^VLyHRN0BqR8_f$OV35?Y8l} zHYu3SUVTlQg1U30&U<|PwCNf(fReLx@M7D$CR~(d6f=BuMO1YD&h_e0FI;?bE@?$! z%k?_6nZIEE@Nff$@5j+@@ZFDMl)Rs&gGT&w8d2F#T5Y7$+Om)D;}4^g6q$Sg*{-NA z?b7;iDt`p0MrpC`^4{yE3%F~cHgAI&!51Rbp%P#L7C=$t`9R-#kDI>#Ml=DQdE_5|Mp?6Iz_<5>B#Gcya>>(1 z*PHvlplQE_UVt5e{#_u>9mi+30(p7GdTs4OqhYNR$2WjtFK?c_kgY$3Wcw`a+ThnS zLP(OM%|$cqq;rO!rFe(bLGC*6D20hy~uj90>k9f{xX^SVV$ zHa137ef5QmN9wV7eBXHXf&JY$2%}@1NQ|==#l)2)pKL1N=q(*oxCDMM;9Bnz))nq- z!M^T$NSj3}ize28j@>%4LJ6&j>hg!Q#e+)}YJc(;l(!Vq-`|JoJ%yKM^A&iAZwOP( z^B9FC$1xhQl((f=2RLAO1dYGpq*qmumz_{_>rU3DoKgfVXxNr#&@%+ z55u^RzJ!5GES_5S34VMks7qt5#a+XxO5E(k=r@2WxcmBPQwys1MI`$hf8nD+B(U5iPy`AB( zs<~6ED6bVDj2ghA06Fer#^~mSI{fB?;pv%Q?GiO&k{`)L{u2Yu>E&L}&gs29>`eN7 zY}*6Fb>pc(Nj3ZNbE)HJZMR|%Nk+6&`%=M_7lO9Q%w^A%m9-v`^t#TJtcRO^nBAUj zW_$jPn_1h0;;xU;C@k#!fQ>!ex-YR>qIXsDj#&DvdQoQ0dFvvF5}tQ5tY3F|YsNYq z#+%q?3Dw_nSiyx?x|qs4M$Kq9^z-y*MF?VC3=~6TC8vy$Mc)gUipxw2n{wJ0>eWfv zJ?>w^3CoEZ0Q*7p<$n|C7Ex2{al5Jp*}dv zu;l{-Nz51NrE?DE)gClXqPr~QjsAT9-I;f!!WUnGhu(s>xG|a&DBX>_S1bSznw7)H zg@gNCX6`RYIPuqPNT^Qh_4KOd#S|wY>)axs|HB=RUEPg{79Yzg(>&_2-$Nhz2GS48?5? z;r+&G{HF^44rX)#i2oG$R=ErTzGJr+AH2~eN&d66a8Z+;7MTdXTfx4-Z-WHp%EttHEcBVVnF0pJ(>-of9Ld!mVtrVHWEwE zcIqDzJ;e!%!qMF5$pFjAm4qLo_u>5`{KAy2_|R_+ucQaqU+O>5*3ohi?OZv*eArLT zYis~ZsYuJ;MdS;+t_L8PV||z7td4`t>KuMt>RgRrZHu2$rMD(XisT{FdKTmw=PhVy zn%*4ozJB|_~Ygct=A&*jON>@1U}b5( z9*bo9QU#DcYm}sXCGBGF~B#^bN*zR)#aC2vNS9m*j6{{E}5r{KFMF4Ws)}lK2B+l=AL}N2Q=m#Ia4*z=PtEN`?Z2^=fvJDviD2%pWx6Nc#&l3C6l!v zxcY#`$0viW`dgOPUy!;G^vRwg(p@~H_x0QRn`9_e)WAK~woYqI?y5LKU$MnqQ@kka z(eH$9VJ>KA-fwYEtIWm_jRWTkwRqCd&8IxNMxEC)?{3a@G3n6=WpaW(^6XQ{!>h3^ zG@Zq5PEZZ}@+8zIsz{U*H}V;Eov_>8brGfLZ%?cqU5P7MbFZP7@8*AdsYEto-YPqq zS10QMLkiJ}r_8@sHIk9+a;-H;zv3kwEvd+XUC8fQ(2k;nXjWQhuryQtHe<9x{wmS_ zLa)!}a|CCMg|%U_p;S9#8R(hqV#HI0zaX5lpqlsLt#RuO8}+s@o{vr$ms_~`(^*u7 zFtvYr5%34K7i8uDB=hT**{{T`RkWgcYR%G*o9i{gw?nfFGg`>kD|yy&GxSM{Wassp zdHQI_#h1OR?@+W71hwXDAsSAz<*_$qs}+IpJG~Z{k_)O~W|ybcpK%5w^Jp+0I-)F_ z@`iC3*G`mUjmw^s%o7@iM>VKFq|3n+u3Q=IrX#o%iZL>Dq!C;Xqz5EC6nzrA6S>pP z;u~O+xpxV9W^Wg9BIb2rR-2J;ME2RHGF$Fv<$)9Qu4gsNLWemAfKI2)8r8yA0vf>q z=@UDPFXlX!91NG;?k$603J3ykN2sQB30LjWk~ zN{S!RcBCn=q-8^RmR(t;Wr>6l;ZznQ(nz(xfh~N6T;1xqejCH`h*VVj%j$63%zGL zi~W_oq0>!-H$+fe8Jk$ElpYH4627;sjop0`RKD^Uz6f;QYOl=QSoI|l*Rn%4EJ6hS-!Bc-Zz@C1cZ+sYM^pyTD=*JmU zMF+5Ogjh--yb+v%n7Y9N(ZZ(Yi`BkZO0b!j1h$<$=A+WDqOTEFS#(i(E|9g~_2FfE*a#JNLa zp3nxq?*}L7O^<3JVZ94FbVe;>i6>vts!3RB_7Md8$_Kq^edQ_QSf?D=5D$?J0y0aR z16tpAwNJEsn+gLb-*{U)a*A%lF=x7Zk|;=D_-s!)aXo z)`P;aRCk{T9Q2J_CphSXiuo&_5z&TH-!#Fr=2~=ChsZ7uSH4}&O7UT z&(*G+n3DBy7J9HcYhMizc1sC1Bzy|=m-cUSV~72R5Z)qY2cMmg1GBR5B*XvRn}|6p_yja>bGIEsxUiE39O=}OK{Dno|?}^LfSOp9|0FHg(zRc1Uqh+CpZR|SljTN1vYK)dV%NWwe zRZs<#-ouM~sqAo*Jo|e;tGcVVw4@E2wGtB8`%$wudWo~WE3B}iMBlEQul3y-Ug!9m z1-vsaxz)Ft+X(dcQGN^B^4e{{)CmVj#d24HpOh7JIa;Gb-_YvZ1rApy+n(T?i@tQR zS7~djnBjFn?H}9ZioWf#QWkL?{+QO}4%PdpJaL6?j(~N}CJvvZo>|VYo7>Rg7WHno z?^1}IYpZ#T$5*I}=ceYf2?hE0RF_xKOZnr_RC0fyHDCAS??FGG(i?m#Dir!ESB3Fs z80h_Le7pCTS0!a+E>PvEW{oV1=e9WXH4Z!{2JhB8Mz@uY$v8(2Z^uR#+?xOzhBi%! z&B_b-PM$jg^UHKeret;C;5kLo$+4jV-6wggaW~H%g>}n@31sNUYQ*FCD}Gl@p{UtH zena-4s%pe_z^0`TW1wQq7wqelMaepPSPu0`Qj>?X`D`S2AUE7AKYw){QN8m_>yw7u3)CXtoG?;--=D*69ro{rhy zk>AsdnavHLnJ+UP*1^HdEF{+-gADbXhzK%6JPGs2J=of#wI7LJX?w(MiN_2GVe!f* zvt-A0^oWdk#;>AX#Q%aka7Bl#fgS{~gKmAKP@aP-I{AF}-s!WCD(4tT?-ynW?5OrH z==_xI9?q5{LsS_p-(?%Rj9UwTHP}TiI>;vTLjD<2`IC~YF#~8&&71xbtA)`vTeg;0 zl{SQ1Z7```Q*T3+f?YKb2uyid{w+>`=9O^ux$tmk+uhvmdGJwa zCY|U#?=+lC1v0X)iKR~jLyVqf#^b3H2~w-jV(WG_D^=nD%xBJ2UFR4}R#_%eQs)t% z4^YM{@7;2Eoj&FLh#UkG!i~eu`xBqJExppARQ;^V%FKx4K-DDpBaeD?J#XsPFY?~U zBCkLo0}xh@sG57&KaWIXs~Mv!F^YpW@e5a#5)}){%oMTGNg5cuEG^jCm-JFtfjBT+ zRtyTY017eM4SzKye?_eFf-M+7Ukz#e#>6x7Z{7?mNkGa-2#^l|63NeCj03EO+drgJ zdt>BeXU4aasDRSF-NMG}K_CZm08TRVX3fQrcx>;JD92I{yz>8I*bNK=|I4!ke2B}E zF68ycRMziNSg|;`Qsl9zt6CR@z`35jUg^vK>2Ln$cmHJ>|9@MO%=Z5d0{Z_VE8~A& z@;?hJ4*I{W!9xud&(sO?tCO>+G>Su?#B-Ncwo&ev9FMX^gSo+X96Gvu&Pt27mmeV< z1F-J9*c}CY`Jw}3FiOq}Y2TM9-}I*Tri2r=9AWqdJ?NfhRU@rbkn>6x)ixYQMqy4f zQrNt)yAc+-I%<*lDlRiBk~A&GFKiR?ML-n5Hx7O-$Q)UtIG(iKk^%afwmg6cnL|f> z(%%nX>f3+y7qnr1z79?Skn#Sj@{`u{rslRg&S25(apJAT>K);=WX>a#W;8ftVo(b9 z(X{W{l!Xp?%nH0|Ai@WY`>Hx_0J?5AlE%A2_nVkv^cNJFc;Laku`JXbRbI2}SVDA@wyAbSJzP`C_#Ae+_I`u;dEt zvFYrA*9QSS+#rXnqD)+>v%zRnTT}SkV;}Qp$pY+*>qrSuGDd`(+qA^1<%$$J(wDeh z2&WdVKnMSpfYIYG6G4Mk?A~Gmd!Aq|-UBjO`%h9Wf)O$19^e!!mb>DhrZ9EC5{nH%1C^5{wiHlpV+=@!f?-7}sZcI{D4f-!N@gXByJPQaf zu@}A@%;6z^)mJI`Y*Ff&kZl`-K%Yf+T#}Lc0Ypg|2=3yIU-0|`&%JpWoI*yi^nnq# z2d>`aS+-xbWbxd0L273%{S^f{mhip#xtQ6tJ5*O98DiQnuJn)5_rES+LuA|6w2$zk z+wf|$v)=v(t+qoL_ZA9IEGjL%XsV}j!;PX17USF=keAWLsm*dOz+_z$0edI zJ~V4H{Lec%BN86IuJ_h_(jZO|?90+pG9EFiDBnRGRAEYkhV7o{e~RY#H@`Ox4#X4P z)-hfw&gvcUcv&9`&ZYp|3bb#clac($&Pt#wb4JEjy%7>wTdQc%ai8e)WVM5T&qDZ( zAP6Osn!Q-2Wrx0VA7H@yV?#)Bg=Q(SJe*aYHxu+@@d2U{@Jv{sRRzt)TilDt3VJ~tB&-{&< z!IoS=@wi|n{Qcn*0Qt+}TF94NYgJmzp z?yUDM0OHH2^mKBrjGh2gX6_+U@+NoiD5_IvG}uslxY*d(n1`8QriImEC!sc6F3Y;@ zlDN1KLIp5u^3|P#ta2;h=nUr{izdFyTc5(#e4;)Qy+PAhHU_k0>nvHwmoeHODHoE3 zr*Fba9BY)#n{o`ZPfp@|L!v+a`sdi4~eq^$Y_o@cM_y6q!`G%VF# zy%NeX%wb}2C?X5e5@`4vkR~ge$D07zH%^SDTPhb?c)+0f)-EZ}qC5C*UoT&c1MVd*({Ini^23 zQ}XJQ3I6aahJK(VQ@eDjG{w`ro1qF&{F)yqB;jet{>5UI2zU36jVmu6j4V_x!)~%e z$pLjzQSI!>ZUy}Ka_ix1xOR1jR6pKh0I^O52$Tm3 z)hhGar^2Vw2>pnfAmb$YYG0S}+5|!a%vl=GgQe6LNdND2zwNUmU*gNZ091sVC7-%g zLaVcG&~87A`mFRjQV9G!OtFH6hs?j-iCoAwWQ}~n{|W1>(MLoS*k>Y5P8F->cRy8G zA)pC#{_R@%$f`T9(`yuW&N@-KXtE*?y?DoqW zIbUC1?s!8PzXK6-<{GDmGo>AXjTjZ(*~3uuJ@iU7Z4pWsgn9S;HDIg5g&xd0B$=H@ zQQ%fX6X2%S>+_fFDMTx}CK!*-twux%DT(&`^!uq2WBxChty= zCgx?8aDGosFw%VQA&z*0_Et(O#sX-$Sqqbay=B*bK{3RM5r^ljbV0Nnx{`MS)r;1( z##}L5wMUyG{BG)@E`b}*Fa_~+Za*uaht&_qWKOtFfl|R`R#&$+d<@l_=1qGjUf9en znNLXfo2p=;cv<4@y`^Q>^~8bJ)9}mA!XaU{BN7ASh-u+*i+xi2k0BraRqsg$T~<{Q z_(@DYV;o=BhkggfHQR;}{MZ^FC3l~g6POa&t(Xp5GcEbI5*^V&n9|5PPzvqTW7a2@ zbQgBoAy1Ee`B=b&d_+#UCZ#W9Y+RZCzjW%a4#^I4_W3nV{Ck?kul&O2j#WJviigU~ zxDVcTSMWx^$8G`PeaOoR%!#lX?WP3G-x9>#VLTn0XZ~c{x=DfbrlpUZ0p9a*&QB6m z@BfrpV?#?gd#Me0URx|cmdE2~=!Aworb8C#l_uvVvD!iqO{ zvW&?a{7YAH?H%qWIK>T@Ix}V}B#(JQH(+Z)w!He^_q6|JKZ2WBhw|mJk-G0X6NJUi zrg~7)hwI94N=7?7??UNvm}8a*z8Fi8e^(a4F5^R{tmkt;V)Q1Bo}Ya_U?xOm#hjJ* zd8~PfPK%DbI%mpHJctUdMsD?j`39zc z8H!Yo*3yLKz%&-xmg(ZCG{(Ht(yCwvJSY`_?v+~x>^UmXy~p){j4eYxA%9y#)b2dO z>sUp)=#9wJtnk=Car(=L8qr_7NXvQ^*k#quJ`YC*ZiD&~_V=W-Gss(w{l7QtrE))N zeo^S%10C1d@)XqIhx^gN!66bdcr``HHARLLEg}cjx2Cg#YPO0>Ks7{FH9!HHyJxk zoIclrc*Dc&`@}}w>OXRQK8jKb(@Ut3=L)_W5G>8gUS8;3rar&5)$PfdBCCzk)#?Xa zq3|LEpP6|Lms;30qMPToGAuh*Z*P)Q8xX{Dlh#_j6D!(>KOvtZw#?rAw1mB^$# zkAJQ4;VzO!zN|k!QL0LEP8J z8y!I%v`ah92^}j;x?J6E;YYRn8q7!Bi$npALtDE!vbN!y9OT(qR+?s~H?%1mT*Qkm zP}#b+hPp)YdV|8?FkjVF`-@@@l?|&TbGMl*r|1u(F#0Upg^YiUZU(_Deg&~HVnNl%JgUt7sL6$iekSQH7@=MXwOcVBMH zyLaY_r?R(DpF%UvYcC1AL4IB%dTl0IaMFzY66fK0p|6|e@Y+lz16*v3gYPhxXg6ZQ z_+<3XmWig`$sbcL#AjIM%ni7Dz6rtZ)r6hV=GF%wldHaT$&YiM7^;M?t)V|q%0@{h zW>unF9ySm)FNcplb(xf#-F;VBsjY_*gV%Cz<31A@TvH84hcjowc{?aH41SohknoXA zr%XPP*w4!tUGk79zvHDdsH$&iisy6oB~0UDc+W!9Qb+^dP|Hr(H!m_j-`_^!@4m1< zY^Qgh<`WmygXk@K3Etn$S+2iLUW^h#6*Xw$apLd9ZRv1`As9``D(zz zWp5JojN-nEZt;16xzXP5_FY(SvfFVSKyQ^clc-d)a{ssl@@3e$uXe#J+hO_LpsoZ0 zfA;IhgS0PeTWHeH9#Zim>qfJ@R7t$n8(83s2WfnyOgJ*b0ERewz{1L6aw$|K`^y?) z*jO7WjaNuR?)*3>`(K)9-zvvrr>+kbcj_50)L5`Xct$)y8SG6DGz1egkMh{`Xrlz{9qOqs*FoU8~{@v?4ZPB)~vG(SCX!QnzNJ3YSP6u2K8OnA#OHEEUFH7Bnn!2;2fvX^J>AUm^+WLA0Xv z1-ySjLF4x=uP>K*Abd;SG{J154VaiKC4(VpRd%zt=u+yjoh{%7yuFw@kp(pcllR)| za9npAL&S> zCj~FQQ|e?cFtT;^^@H?egWXfFIQ^!bn&n2IJYrey885r+Dz^Yu&p%B+C0;!=6dhYT z{^8h8${&DoYm6x5P0<=Cw*Gpo6H{H6C+xTX(II=8_x`kN68*G8hF~cIIP)CtIL^-2 z-a5wCB}50U`8x~IcGhDeo@h*!8tW67aoOUTQq4VQnaood`MFMhJ~e0F%bo}z7+)H) zJwAXJ*z;VXJF4gB)^)bHM0f}QpX|I%ec~mg$->MA6=Oq)DeIpJ$O2%;yUPHMV`1gZ zqxsd4dA|)%8GblC*HBuS>u|>TW8Yi(>WYD{zhiSNsWviO4lOY3VCj3 z*|(gMh~6ES2WQOh_9?JxHTFA-eJ-Q(h| zB?Yi=2)@#zkIeDs2i7mX9*g zU(g4)kF4f;Z>P2vR#I&PB5^7+#_9NkoXC|PV^Cnz3h?*eNryv& zu!1hcTg+wz;{MoWCi{Q;3!0%HOa1})xZW;_tY|xOApO)sKaE>CQfS!td#R4_bFUGM z6d=K0n`f)_kEs@2)`+A!nLf&^+Qy`LOpJ3l8#Y5qcaE{%zu%f5+@O8gIF8S2wLY9-oGFeUS=0XVfZde6$`94IuCVY?L8`{HxuoUd z5UBY4%0$j#T5ao)(>#5oQ2<;r#AKpclNT_kkG@t)T+de1IetAqm!`^4FyLY8I`JJzQkobe_D!h?m((V?f=-IK+ zU`^t(d&jRtsUB{Ab%NF_()KAH^LCaCvRPsT#IZX(rPtBL?x>HdWRMUE1n3DRGRa1+7buTfI)F*t z{~a+JR4ufZh2V@L5_{2$^ueO(7ofjqAM;;ssJt^x%v>Eh_vmz44BI`+8OG^L#3|F? ze_)~1c$56Ztz>y2IrRtP=@lqp{%j zh=*M7-vB6LoKyj8wsWF<*5i_##nnaA!4yo8+rL(-UIjr5kgt`?6BLMtNsgZu+wAf@ z>$Y>fpn1gCpR}{sARCXq>f&nF-jrh|X_>0lcBtxK_O?sEVqw98m*5C{IFe`7!H0h) zB%Gz2Xpl>JI#ZI$yp@;cP4H?>^n$@jOdmHSntP?~-hUm9=@WhVzbO0asHobvT@(Zf z89_lnU}yxSI|oEs7#bW(1f{!kl$0(3>23y8y1S)Ix;uv)V3_yp_xF8gopt^=>zwn? zuof&}&z@&L&wXF_72|Fq^hmB`BHgn(ZmL+P#lU!C{)rZ9vG2r>=jC0FR8pTAj;VSB zOaY}5`Q24PFs+I4zC#fT3Vne9KjD9Ypuuo5B7 zfq(a~sf9x$PFSQcY+axn9RJTzsUNDR4l#^83GI5v zVk9KsYos+O_>2`zpS1s8hIAkkJ}+>i58E*Ubeyy21w@GPueVgM`#yV}^fCjGu2kln zgds`v3b5NFjG)2CM*tU%e4^^LO@v~Iu16p7Ruq*(X8s^6U{6z(-a-Aq95NRcRn zw}}C9{U0NRiTs2=m?u9CGW3{;@{Rlv#(6D}=C%xRo~q}3nUN4Nn9PTA_zQS{L7B6{ zEmH<$NnmEfAib~S>~y1NwYFrx&`tGL z?<%|4wk$^?k2rf`r$|${@IPAxm$eHtPSE}ztkeEZq(#)Me2WpkYVDnU_TNFGHU2TD zsjPp?rl860RL2)oJE1UfsVJro0j=nrTP>FYwegH&U=ep+${evNC@o`*AeBPlS@_#8 zs74z2c5Dj_?GJ`{cgXf?xczXh?H=h&^}06ws;@jYiJS5*jExaP@yWY6Ra;!MN{+5n zLbHhp*J~q)Zs}&8;?!4vB5L>B{D=!0i-n8rO1vypD)-bKIksnEH*?w7j?3z!%;9*@ zjef;0AyaMv_6YF4-!LwS+h?mm^iDRJ#_e-}d+D+sTh}we^B~XyLWN>Znz>y*GW#8fXOrC)?T ztXHZi-CNHD$$@zbXxqw7Zh5UNGm>Q_UmAUr0*rF`XtBB{{3T|&y*vDc*hBzTGsO<3 zf#8LyfeLLUa8=HdmK6Vu0??|XeeD69-&YKH>ZvZhah$TqssO_vA0QVaHifpuhEX1g z=(J3tvJcD~EjCN*Mul_Zr@1n?)*{g{mA$-PwVJWnmqs&iD987A(`ElYWAzeSV zgn8h?BGpOQ0~Jy%Y|+9+rtdjFH`kblpR`rV22T0Y4GZO8(Na#nRCg8OJFmXSIyyyiZSS^N$$1_0P1)OuaU~2VxdVmKH|Irkg#; zkD0=Ch$F?GdQ-*cl!@b)J#sb{L)!HPFLxWv_leXm8~BiXY4SEZcx&h9PHmgj@~dn; zt_jM)tA4Y0W$`?${P*JxyLVljYRg(VrWDfgXo;ZV4=EY zvODQzU2fg`b+fMHRuve_fxlfqs(R?}24ba;<(;2+jQZH7`j}LgU44oe;d7q@4xv0? zTb`P%%erWzvnMqi17c~S@qN82_OJP3p6nX?lB7HM#{0Km-D+QDLYjY1nf*qpeV<`@ zBQ)58wHFU^aI|jNb@7pO0G`O(m7#35i8hwHlgTq-w3$~K%(8oT#>CnS`*jelnQGBC zZB08`uyy8WJ?RO*TKM|(@$*p*Ap%!CaHwFG1S68=sO{3!r4vGGztpxC-PcRY1%I;d zZOcNjOc?)eWDZE^CFMO-H7$y6R`P*l6`*{FK91J%4bGWju9YjTzRZlvqqw2 z${f-+S7Bm8-qdA@mf2Cu-y3JHLt4IJk|A_8+jry~0JrbdTJUlwuZXYnR z{S#Q|k;?;WlgX$Hs>O-{FWg3zY4O#-zqlD0=RLr>nggkYC| z*OWHeo*AJ&&y3h8(kG9^B?hHzU`u?=YH(w&;$Cc-`7;D;Yi-@INr6m?aoKq`#?kuS zO>buiLRb;GoJZb98?$aF%K0fVfFqj`=c1o!lQ!i!`*(vY>+6$=f3Q3bFmD^W(h~i) zD#PLrIC6(+(n+K;$3fMK&_8WFdq)#htyG4nz&oiCoZnyeUas&b-Q31I^4}keY5OQ5 zsNl1E_lAZCHZN=aDeD8*$+nvhqwEAkWU_upJ*S0W-%R=QAR|+m55+!b0O1@!=&n}! zD^~0xO-IW>gHdx5>+8(^fh=R>ePTm%<2V9F_A*6Bi5-Glk=1F;9N0Z?W7q>u5K#TC zA7Np2D02ZBo77>Of+h;g!ch(f{Tiu>7d27yY(xQ9$ApBU_Q&Z=JS84xe+kZekXd2P zG9C<`X74m?Lut(;(*4w=@fK3cdP!X3>yL9AQX6=Yg>5+|U7+xb{)uH{oUy>ZeVM)j zk9F7h$)l%yjeHLBc=REBY{vXC0y<3r*2;U{nRfYTg=vSQ`58`LU=j?zR(eYRaHC}N z`c}Jc{v@W_$D_6FXN}JX=XNf4Q2Qo<3qqNAu?a&sdx^%`f3;_W$(sFhh~}^8Sm&e_ zM?LR#)>IrA>7!9N$jU)jGnHT9lC7tHuHg#Z$oOpFBj41R`93=sPjlNaa-)t+%mA*`l<@KOXLOJEvsr2wFwG8IL+-W-uZg*kageC&jTFj)baeueU@WAZM{I7$+)F zeLXy$7EnF5?IqPXBEM*{ghM{Ic|I$|kKBYR(K4UPZ;kncKDJ3SWBtNRwq$Bjp{(a6 z)iD$Yy8g_8Z;+DZug+r2*dOAv9%sG5-w0=fk%8HRlNI17_`t(5%2s0)u79v5;qf;w zm&K+}1faw_k=~t*5XD}hyIZlM?h)_ z!f=0Q_E-RduTYE%erg;S!@?yjI`X2;zAegy$~_N>2Me+$S8;e!mEK#CBMY)UQ)mIS z5HZ34Z?zH)8oi)OH>0&TsGGd4+jgN9nW>R{vp+Fw@KeR7iF4r#tL@j?Gs*hPN+**> zsYG^VSgw6$G3?dE0+X!vTzMBZw{)RHq);m{$C`; z8Y;hKnxN@!W75*?-kHsMZ(Q~W*3WE#f*%0YC+Ox&N4;PD#m4P+Jq?SbGnC5OW^Lf% z(n*?&&`QI$%WQOg!HdC4;QTirtu`8|Jj{9qRLrV@=P^JzTT*`1%80mZXlx43CawGd z@fh66T>g%!Z`&CKO8c*bDFAg}Y~{HbhQ!W5QmPNgAF&ybASv(+)d)GNmQ*-&%F$pQ zk>6M-;PR4P4sW{gZzM0=DAz5Lby+i^X@1?d5b_Qv66!yVZiE-CrtSK2uD_TB)W`iT z8MTDD&eD>2W0@PsJ%zeNUBE-~E*|g~arlv;H06)UO!~EJ%tLt^jTiv$R(Re5==YZx zlzasW`#&kF)r74Q@_~=5!d}b@su#eoHsh@y%YNtrqcxB#dVCdfa zr>2A3%~Q~GOFWF35ajv>-dm}^F9eIUV-B7YejG|PF7g3XM3!Ho#(rd}6Ct=&;e_n_ zb<=0OQcw0HMiZFKtod`p`w?~kb{7G7l}ch+{{=?81QRUk&!af#-2cJSJ29;5q+wrH ztP~W@RY+takyjj0<8!(RPfzm>%)L9ozB?f8a*uJOfATQgUHp%d1WY~gsIaXd^Pqu zU6V#;eUlOY=6>^S6LUIMP>>>YZHEHt#349^45s~;Z8~AO8Rp@1(`pOVNMGlbNKK@Q z1mWxQfpdPIQPJCpbTfhPv76r$Q$?YXp;qG|V|v$%enNVM3K)ccKru)Vl~3UrA@j*L zqmRHFy9GYFW`x%bNPC{ktuUExp#7bspQ5=ZIT6ilPu4qg*N;;2T?XiQvHW--u&q|E zIR=~BXWebh^+6@r4Z0i1o6_fGCsT*FKW*Y5+blqcfWvMo>+%8#{o6kFcGRO2} zz~-Mmd>;FCFCG!@6cD`td<=J;yuTG=)}w9*)+PDhHO9^KJXGPK;n5H9+@ZrZVlIko zrYU;g=V0MMt)AVP`)1M46QRRxIWzBJ<^M_0!@uvvhMkK-8f@~i5@Zk#%z|f|Jx*yD+KAMEg8h|jTWTR(L_N-F!zvYmQh zr0dWwS6@fbI6B?|3tD5v*`FQ4q#cO%v(vFHxZo#&hRGd3PTva$g?q_N_$r|^1vxAz z6Bn78JztaXF8N)L1(yB1fv8ryXn+4zMbG65zGvg)oz(gsC?$X~nfIqu_w}t#Z)$lK z*L~aIKUhgyuS%1*fZh#|k0y&r3Uw~L`x!nsASClt9M@%P=XSbun1kbKVq!o;8=0pW zbe5&AY3hV2gyUUC)0a2=3F)`1TGzGFtCQXgl+7+{c4G8Idf`J)=Sy(Rqea@=dmP1* znk*2$auaS(q+TeZcc0z_T73jp;*G@&R%m}Gzp}C45_yHV+}qmudm_d9(D#`~2qTDA z8bGEcAm+EBT@p#%ot0>m@lLcYT6T=LZ!|4wKKpK5G zdY_m_gCstm_A#9p2c zVfx*_+5@);SC*SsHeTIh;$6^uNL0ZminB7(WcFWsFu!ym@~1EZI>lV+(nnr(F&ZCG zF}a2~cNit9O=ZCILtaS99aDk-UcUhua-~?kK*;2-T^~0$<@%w%7fxQW@^%t&(ZVo4 zG9&ml3fECAa|bD?sZ`(EEdlLY&|ic-h1W zo#Z4|%M_Dq;ezs(B%6ImQLKcUSz)9LG~DhX;eEEM1CP<)%`)t`o3G0K8oyyQ+@ULX zTAjL_?%4Oa)4DPTi5(TJYZp=3s4nf(t&Vo*cXDYZ#tO6rYH$J@z2eyv;hvXaZch}H zPmj_*E9Da(>?+OY1H6si7Tm!Zj+d|OIA?9uv*lwW&Sbb}(Xck2OBCHnYQg>OD`NXJT|n>tg8j2{|%W>U5J} z1d3TThVY5!Ec1W0I^2J|jGOA8PL8Pk{8x3cWD1buCLN z^dgk_^@={!-mlC+8x?F(yjQ2IWm&guh^+Q%rzVNKbJ1)GS5-DizDal?&pwd^^n-)k)Ayr+7Ztpi=;{Y`#_y4dV@rD) zp^s)nDJr}l>fv2L60uwXE}aY*WZ&iZrYr6rENs|%GxMs#tbo82q=u=ERQv%Imp8Td z*p^8CUW=R;^RYcpU3FH#Z;3|%Tnc`9VAGlT#DRF9Z>ctqc{YV4#^xb!zv#h{(rk|; zb@k;(mx>E#^q-hWlQX)3+lh zurw9lrU1|;j03_we0#ZjH82VJ>6x0w5VFd52WESB6)VbS60#k%lnLD~OQj})*>yTh z#RIlGEAx#jz|s`iFiykVKsJZ8JmL zSOB2LiYFCjAD4ygkV;z;Uo(XapquRHXRX}kTfOQPE6iGUX~S#VG-=tu7`I)?RbZ<4 z2>_!@ckkX5=FFU?!$Vo2*@el>>IXwT8z6j?^|-(gK2ws25=F3wOQw?97q1GfJ}K^) zZkV>Z!QL!SX97OXMC3z9d66rr8vArM`N^cV%B?mu&y5+*_sq7+H56^aT0&b#qXTf2 zIr1V$X9TMlVuQEWjTuAPeBE)Sy!$y37XM($kfrJAGMAOnhOUeFkFT|;QJc4vfAMoq z*JD2Y3UI44S}1xKa$SIF1k9Z>?X>sRC6sjkwx*wNBZV?O+EO7R`_IsZ7tsG%!uW46QSX9C02`XjaQn<`8mQyQ`M}1eotgB^b!YbV!bb6`me+Dzl{;#Z>CUPCVbZi zPcuET9$wCC8?O2zL9*I|q)n4t*e6|hynR;7aJfp2scCUKEr9WF9*~mv4Kl?r-b^+A z2x>6n6t|Xjnd55+FiP>B&tG;caA8kLsP>WD zuLhv=IRPZsIhjxZl}D8VL1vz(zEFDFZ77C49$|9pfDT;HJ3+ObNfN3Bs2GXO&s#~% zF@$MkW&QXX;5C5W?-8#nTU5T9dX;S|hvg;fglx)$|4%3yYaPR}gCQZt2Q2V{Mh{@d z4}J%Xc9P>#Ov608f0IoAxE2s}^iDtN<#4s*fHqWaQ^V)>iczbEE z`n0<#^x6aq6Eq1Ek4e*Z#tw4S3XY2y&$vrn|U;?hqhSM}TmdCaAmSezwlXlqdZGsKQ zl5MR}iqwz)jp`yr7v*fd!Y)F^L)L>@u6W_QJ;nYnU|pcV>%o3-ppSCq6F@%S}^e_%VS3j4N`I^ zK;t6AOgZ)~6K9M3OV)!fVh%)v(P?NzCWU=-3CkPb`U*X(fr~?zzUOO?r-O3=(=ayz z$0)@)hXuetnYgzM-#7v!zk%^dfM>nPGBwaSsIrTldz2q zu2h%wTt^>Y#5>d<1++3Addukl#MJd!`Q8xxSi(A`GeT&U?*46?}Eqq*QSz_0O=RMWMya|3^y zw?`D|kJ{5JZhTk%@mguVFXl=SUFNevnozWt&%3U-K?iD5Qign5e7@nne(V90E7ygo z7F53?VGNVT^3lsgYXhEj0^;q$Jgi%n^Mi22t1=E8oy6#_K1Po~LFkXlW0$@u9dHQb zj0xt1c82eMF3Y~9`Q$YkEwE$;MXI)iT@*`A{p`hNSz36ELyITUf!;U#u4SucSh7U= z*H`0b?2TAW(A97xuStgAnb@pBwors%9yEv0fkpP5LYn&S?%sMyWWY!9;vOz|Z>gPw z4|5WHRYKC`Ygix8O(aXoODG8VzNtTe{2^FA{Zy`-Nis?LoPeoL$$)0=3lpYV(8mj# z1BDsk7{#-GsP?lcJ(Pyv9H_L=*2!HdnH%j+995tBnLb?iDuG8L9*m%0ex=&buD9&H z&>uIU{^CIjL5>>-uD^=JP*1HH+WWkh9<7*^W{g8gqfWPW8G{>H0WP%3X_0V`5shKY zFB3CJ-cXZd z7Ze%W`-TrfgmL3jF=w@TPn$D~@CpqyBL_cs^AYjGMttJH@%)9-SMF9` zlbX>J{}IYb_{SV+bd_<2?DV48;@QgcuSLGFiDS+$AV*W~lZHs(w4ouJN9A&Zn0QS* zgXuXQ+>iSvWJ%)zQpio0Yjx*_CTesR>3T}7l^EyIiU>|ro@C?a230NfsTvTi<+XQh zs%_Rtu$eqwBB`Ux3PMyl{F;$t=nT_5L0zEgQ?i6Hnazk^ST7z8Oy7)DODDd!fwtG~ zIjk=6nyCwSGD&SUKt^Jtq3b_=qD*9~Ui+5l2ZR=?yc+g?%ge-*uklJ-j-V75>tQIO z`Ro3%S5YtFC#CAL(_#bem$(=@9)-2p^Ga0!ocxYet^U7pa{og_{{MQ>p8j4N=baOt zfE^jV!d5AP;_ISnv@;CEA9cA#-9unl7l#`Nuc96ZiQH@a>^VpZN4?e6d8FU;?GE1Q zb!m9Z-`SKoPgxZ^#x8PQXO;mSVP#302FNH`hp#xD@7w9AGk4W<+O`9|(_$C`e~A_$ z$D3lzw$qu~2FxPgqye-Z!9FxK$9-~fCDLmj{-pZBZp|iyj5*-EM@aYTi>mW495+K} z72mSB5wFV=RhCPd7&)XRYsYOdD-H|-y|zh5Nz0s0|81veviI|s%V&JqyJOMANgp#j z+|Y4!*R^L{rl9V#$WFMRUs-NZl_jN(tabt94B^1^*a>hdH6*h9QWP%CkMw6T^~9#lTXuv}TPY=C}x8m_pFE z{8NumZqB1mV}N+u{;lI%e2pFV@SOK^{WX`uLaj4WZR8?(#|#4ZmSg$3W~}<9Dp6 zJ-&v^4hrxse$K#=guh*^ zkeL`;B{w?vG5>0hUM(Zv4D9>J0}=a!4E=gR;cBoXKhJL=Kq3(Ft5u%PoCs|Ey+}#a zMau^R;oiH&?-2I1A6g-Fus@Mti>S4Dsx~fvsKo3D(wfDIL+P1mZ~Zw2iYrrNBP7eV zLFEf8Z-Mh_cT%r+8zNx-#Mk~`;9`udFI)u<-IM%DPLE=rkf+!yg8h2e;bP|}&zI&@ zko@lqNJzrx6&XGR5>O~5OinUX1>>~rlpXg+2_)WLi*tvy1AW^6YV1*(7k|;hHLYhv zSr)Y(XJcm_D)8X99rM@LG%7(-pnCDG5$H z`-}nS2i9#|1(0R|D>a$AsA%c#E#+GVb-;nA+WPMY@|W zA$!we(*rBZ$6B+-J4M8a+Ypjo35V=jr2#b%^fHlw8*Mnr)G&S|NYN$yca!~K!Db_C zSYgKq8d6i{=O9=g3y2l{q*HAx@ zxAPygP4F}*aLp&Kn#fpKs*OSSAFQaaQpD5JA0gv^k#Aj1X@sZxQFc%3Pf6R=aH7~r zB?kaw_MKMReezV=qGC(2!7id)P0jaul%^e&lHagmN^)dW&m`@cX&u}$qx_r-t*+vY zjM6;U;kI|>3#xKMUTtsZ)t*` zw{QKs@iLqzboBwPS$HyFQu4KWqnewP7;=#3B2D=Z7CC%VQ%w?A3zf)-BNR?hcdIs8Cu)jK11ZU>6!965_11>zr5;ELUJ4Z ztUbM$H++_7WJqSh#U~}#&y?=E7t{Mqy*mBKqXj@Hn=p^pR1(h(fGo_26(VX#fZcbq z&3HM;^*Ce(=pC_;$QRv=_G){r_8ZqNkkNuCM*1m$&!FAQGLd*u{mz(exXI#;rjvT z(m#*=%ZiRcVb2r=ULyD)1Xgjw#jyM^EM4924{DwE_5wCb2>y_`Q7Vbrkc;al{{%$wa23utmbYe3-gfsM}WNV zfMP#J@UlvmgxjtWxpXkC61 zb-wd$-zhNl)t#}8PQ#6};1lT8U@D{KDSgl`b;Ed8K!vX~fba@@;H9qQrfcxpM*(kq6SWp=AN{lDjwob}Mn1y$aUVf3U=!ppLGx z?!T+!dIVa;bOM6u3%|EFD$eb499b;^$}W?!D_LZ_^GQV(h59O99%4)y6-uKfru)`; zwB`-+iB}TmYp;*o$__k0*M)yK?~=@nvy^r1szJK*1ZAZa_bf;cvOmOp;{Osbg-{ST z99CVW{BR*Dt%t(_T|1*&_cjyeQ{@as6UGarw<%aV z!><-1O_Ojuc>m>!#%1!XQemumdP0ChRh0McTfi@kE@53r7}G??_XZz_dw(#!5`q-4 z?rc>^MZa#Xshf3!O1Va=&~EYx@nL%dz~6?}7c8dVMvB$I2JZ2rR7$+y8n!TQWX_kfNcJD=JH`H6&#HMd&H2 zc&-j^^z4wV;L|{B%29OH9x$CJPn?yEOS8Uu3nBa_MNrpHt-=C7Dc!80T(3oq??4&y zZ3Mh5M6h`uD6w3;sgs?4v{ka_f)DUL!cA&n8xYF~@JV>3g;a0mh+i0Eyr`b5T15+A z5kpy5@!wI`tDnmk@PfdD!_Vim3eS6>V zm`6XF!#hI8>PeWc!6PqtFC=M0!5JHi`35RGsLo%AN*Mjh9n<_TYZjorFL(f_V~yVZ z2cVj*h>|ArXXo;LNxvx18WUq|y&U1i9NJYT{+APd9nfR=mRR_M%ir-L^=DnQ^pj|V zLU4_oJ=gO%=Bn7gl&j}ct`#clpTFkpxj$Xjm#@8cR;?R~sy7W#>a%s4oC(voZpdw0 z`#RaQt$5;ESl@UWTxM9s*Rpnl2K4Sj{?I%qj1y zOo22B{gEEEu_Y;WJ6oWRmyA~G35}{&)wDNNPuVCO;PZwzb4+Mn&8TR&CX-MQoSX|k zslOZ+B)^oc^3K$5ET^jLCA3NNAYCZW6XDXiQl1ZR z3M%l@13R?d4_-p#P+a=YgN1wA?1ZV8iHt>LTmN9;#+xH%UqFflc+(WRy-6UBB-V!gU{JIHUaFWj6cF|7-K*WrPRb2$(2Qtnj_BEp1sCSsT zjaLGGR@BG$5+4rgzXmgVbPTt?1alPWMWWGNOZ$6d-q%~tX7_YmEaocR% z?oSs7pms5bv!8QE?0nA26Yaucx-lryDIu9d&GWMcx=H6p8YFEjWbM7rBCPnB&@uL= zqF^mv?h{^I66@`x@>;`RJ#e{auj16GW9YN*nr-O;@}dLU7l z@Zw*IW`K7Tzz2kr0)Esc1pOa~Cgw#l)ZtID0&f8qN{cVPs;0%3Lba-|9RVpUy=BU; z*gPP6ZdEIM+g(;AWsc0B$uoT739b>>%$j*~BfXHkESceX))s1}F3@$L8sLr@7*-4n zN<_DGd{mRle)=lasoJDiNnpaii2u|s=I^CkdwV>8`kANT@&QMaT&rPRnwKbz|6V?0 z#J@2+GQI$FireIlVbH1Yt8=QiNMt)6ct-FW8g5l6{9g;U0|Wo|mNhEM4s{R{E43yHH4*$q(G9^AIz z@U?sF<_A+za2j=twMX~t+{P378XV5T(vlA{9XA;N%mpi@yOHIr*%H30ggOB72|O3? z7mNWd%yTTP=*!_QMn#wMUH}2j;BRy@zJ5i^2D~=nR=H7>zp+ivpa-`El^^!{bUsbq z-mAD~i0mW&9<{O;OA(vZN2&!qSgC}~pN68tVbFVT1)x3+4k8mq#5*K%aOgAKJ zcT!_7!tPN7KH{({X+NHqQRI@^Oz^PmT45rL17NlDT9!Qh-(>s$?I-a6{=KKm?e?}7 zb-I5)Ma2pi%JUmrS)9%q{^qj1+^SoN>SZ_pz>GjGwh>Md4&b4Sn|XK=ds>{eI>`Z2z1E z#4hhuK|HzE+Gf^t2-`O} zxm(r}+o9nPPu9(~)_?&QFTJq)UJ4s28}QpR_f1jd2@_m+q@Co^aiQ&8JWM${b zjR(+T+SZFA%^DMTca_^SMa`Y~EeF}0*>a|-3-O`H1!tM-EYeFMetu;f?aMUvr!$Fy zh^g_xvp?p4KCC{;Hp?o|a(El3w`a!DEA_Z__Hy^~r3z|wjx>9bSUW&X1`HdOdW6(i zMdiMO&%THB#@OjTIg>NEJ^N^{H+c?1$@uC_Vo1Y)C(_6qIMnui8G#&a!J2OG!u;7` z#t`|}eU{io0{1Oedjg1iuZPY)7z-IWY=X_SPJZw=?CyYl{uf##TJ>OV3*3Y@8Sx9T zdA3N7EWpP+AITM&q@nh+@f|Z!7vmR&%lzY{F9tOe#vp>eyp)j3>O0Xm&mDU{_T+$O zQSK1ehVt!trFo^uv^d2>T+v$%kL(&j!6Ce<3xlD@n`iUuERmv=y>jZO?!kaz6R)Yj z0RK(-UF=iQzRHP^Dh~kCnIoHaxKkAH?);0~ivBKG)$+cd>tzg}57s~*e4A<} zEbUnrk22_*&z-O7dhubd|Fv`1;h94;9+)gX-H&lS#v*JoJ-b7KTf>}nPGUfOr1jT`TwT%JjXIAw zNbjZ9YRq%1eLJAtBlXe^I>kNwn%PyiYUMIjc!Kj|stDiZ?Jr1|{@YqT^4XDD4b^Q! z6)A&}P1=k`@JOQxx#e%0TcSo+t#6cb22PaJ)T?9Zm(J7S5=(Bccg370Tvb#h^GRQN zcD}%V(1O%o<~+?`rklDrsIMd?`RuHdEZ%?@Gnm#Aiij?3umKUMSZ&x;J{6qrPY8Jk z5H2=>hBcV@{=rI44Z`xudprF~7?~8+fJ4m}Hx_94&iLW%#nIRP0y*W*k~ z>?p@ET*qerXCeu4Jmk&%b>hN61=oqb?whQPbh-e-*;`^g-rCUoEKo|V6f7g-MP_VA+2&z0izau--I%+>c(cAG`oBBuuBFM}h ztJJ4=?}cNyo?ws}DyKep8&%voSz$XD9`P-eud8-d;j%mn59R1-p_(*#L<>)0i>+OB z#|9UuY&X_+dNkJdT6}B9wkfq{)%@8Q-+LLoZGKnK;wN*f^WgMOvt^FFW?eiY&CT}a zLmecguv9m|DXRSL0@Ga1vd>B0XIHp)HE$H8tE=&C?VG9eJ#+@4LH5bC=RFhID5|Q{ z-IyhWTXOm3H)qB~(RN80n!e}a3o_}4CZJ2_N6i@4MxhU8LvQB#ide}$-mMj;4_LYm zY}O>3`d4D>Tf{phpSDlsnnZ3FF_g`%X)g*9Py0By!KlW81YSIs6co8D>8u2Q-a zE3=2vo~KP}R132!Og`6r&Q>33znPg8MSF=3Ju&IuJi)x|rI7JpTM8lu%UsJ`#~*#e?4}c3WmMMCC}Y zf|S>5prJy)R|Jn^{G>8Cs1qa6*>`4f$`er;!k@#f5N3^(rl;%AJh|M4<^AMBPenyo z7ZXyC8KW4Y%%a}pVwGlpz!KNG-eMJt(O_of@@fKHd2i^abjV#Yc}`0`b2+qq>gw*q zc`4Lg(&53byhX{RtVY=cu$6w;;?{}pGdtlhEu*UDq=`+DxI`@WKVlfO$_-s#=$gKS zf|D6%&!0HI*myE&`risBciYKrpR3PkmdafPM-DL0Lk(tZ1=;NLqsj;4DAZ+5>-;Q} z1zVQdS28Io=sYc=%){l_`@87B9vO1(baBW!pY3@k_QXTKQFdNi<96*trTpy+_=X8Ln|BIO_@ z0~VQIJ-8T4Prsj*FUU9l!#x`_N7EsH(&^||TM6+J$qQl9QTjJw+YinxD%CD0joRyU z6AYTj-p9qpO+Dm&tDW54^L*xT@U$(I6D?@QSx`Ok?zhr5xg&r2gM~d9RYttE*r(yh z=>B990ox(qH`Ig;0vZ={*5DwSwHDq(#I~30pt*%pfD#s5#y}u96?ROb%Bim_9PTTQ z7v{Qqc+8qa7OnBhvVHT50vw^$Ci4TpQJ)CR6}-3Q+WBRdEfN#E=yrwRCPuNUj8#ZY z6{?iA-5d!s`91o4Ulv}(=2MoF8hN8lU5&n1ORcXAuX7(my<1S0NnO_=A>P1a!WjAs zmZ~0FC-_i-LDg-CZTK*b?DrLTS*#SI_9?eqk6dd=7JL%O%%AHJ?KJDGy#zmd4BJ+s zPks7EiB^oZ+apiuv>N6S>LB3JlIeMT9TL}i7NVXHYS&b=nvcryn@$MNVMVqD~_ANnO>0gCXt7P(L;!G|%@}Kq}y(&zq*z6Ig@i3=NGo9}LB({6nS2XZ@{CT%rvDVVy0J2o%&}GF9VT}+*Yb|S|AkeqoUmB%CbIG^ z(*vW-jG}p~Br7Ykhg}4&I$(s*zMA3mC-+)R4YBUh=8%96x%$jSnxBJ80<_8EX}@+x zC|+P3y5v?W4L7EsqiEj#%oK;~xH%rWZ*6;1>G#OOXR&gfhG4Q=%zJLRIzTX1k${>S zIBo^4M>+{r`Di3xxRShOcyKfLHQKUjyXAsVeEF6-YNd;Y)+Quretmz6cVy~=^cCe1 z4Ce7w;3c6~9(k`t3MG}2+I9zp$VJIk@hnq;=M}%}!UR-pW#`^IRf=Ye(^v8nb3wx3 zxJ0JK39+IGaLYoKPFu6`4}`r7etlmwI$mks^c}9>Ko)KY#XDn~o^Px?UOt0 zQ~C9L-wM*|HS;UN!}%}`1?}o)f+vR)qt9O|nlq0mF+I3{B$Q@73jJdzG}+oEp|Exb zC3)Xx<9k-B!1_a?D%w%u5W;HRF#3bQ*eUO0&vK8O)w>0n%$Dd|&TSkx(xEQ5!@sGUPo4N|^S2U)aN zbWY3=a_Ao+KI-R0nv%$4J@-F@rsh`+1W_$5riSOqvUdA}tC3{i-IFUB`lthBw$iCr zWA<$_!Gsq?&es;0dC+P34rSf(;0gmXrEuOa&blrrNcNS7O4u(nH!HZnO;<>_(eL-d zd+FHD3^H6c`Ls5Hj82}aCJ*|V>Lx!Ml{9D*7k%=}T58(IjF%4^Oi$aSfq2wp`1L6~ zShUyf?sr{3Gx?P}2&Hq2hralirx%E3?+NWf5O-ph&sZAxWElFtW-$UuamB9taLB4k zkr3h!P)eN%q7~K_AS4U24#2H{dpA2IvO`e;$B?-P|AQrI48eZQKUnkzX?TfSXSho>R^qkGflABQA~7hPMlkvsxaQVAl)C>5OZfTx z3FZ#G_TE_s18c48I%0E>#M=IeA)l32R_lZzNdGGXeN>5hs6+V|;jri_IR^|ub zk?QqR;z06b$@uo}5iF}8TfM}dlBFg!@fzP-rhzu@wTf2a_kvtZTbcgc_(gGb6a%La zK9grI5n1}?YCIgFdD<6T-Ymc+mmV)#&r#o|5xMGL7*tU3mzh&g$e!LH!s>(bn|{D0 z-cg=|yUUoS`gAG1cE*9R{I|o$dzVPKa$&}FimG@SAA}U8r;4Ojx#}@bByxRFrZ&Z5 z`XbqY7<5wQc*0Ug5WP+>*&GYl)E6kx$jh^bILfZcCs8~rUW(g&1AGdq;Lc$(=%|b9 z#{MJo4UPMPYj_8rQ!!>1=%H|StD%IJx6izi$iFDdOU#O=fwc^n%t`bfpCOJ7%?9fl z0Mx6qbb_z%s7{}i&bQgewXm`?gGoyDegPy~hh`TA%6q=Mw$=El<4ZJTHQFQ?CVe-X zta_sdyOjW~og5k+)7?Slu0btz6r};F{^xD|PLT=C86z4}WV@@rvwEtiuWHcXMmpQ- z>vxjE4>Sh!ZrVU7rZa7fL;Icp^vNEKH0$u-lY(hTT!XVz4Od&fT!rQNULC1~({SDE zAN?ITZh%%rqI8y>cS~2+S3I{X+lsAdq5q7bN@!+%3|D7hpSSyE%#ssJmUK73WB}i} zFI~Xp(=efC_jz#N?9s)j0^-<#HNDTvVRSQK$}iiq^b$h&LVh4ir@g6-VS_Up3vsM{ zJJZC(sd#fud{@w9!O63~iKGSe4zbxu*h;7{N`d%GTY>-^8swLkla71mb$RAKPoF$G zdLC{TChJTU>k_*gee<-i9vW!qdxe`9GLOdFWmOqNC#mAA0_U0lLB zG{UinIT^yQ&~QfRsJJFcO#c|HR_C+>`D9P9n4hF z?{Bb<4-Zlrv4VqREfQ2#LEWlsbuvCy#fuAUDc*4y>)F5QRbXRc)1DTy_Oz6(mEP9V z#xpORxUG^*M;jQc#)*1{i#j6% z=@dk*QQ$VFlckK0YayK5sV`m_%Fm+Dh_HkM*NJR}nJW z9_%#IR6jORgs}l=8x%3m*Z9U2&ZY>l{;RbVRzG8^mE;2^Y<;eLB$n!whj$&m@{!zY z*W%Isb-8Ud5tUBnm97Jix{OM|lOBGUPOCt>@JMrJHDd={=Pp#~rh3vYPi(npl8W9s zHL*^~|G9GswVwWMU@@jHR*hh7RnetZcWtfb2R4+2CeP>}8WOQon}SY}^N)($;Zi#3 zQ|(+E^(4@@Ix1XyIiLCBE?Fl1@xSg|VQ#Te`OIvZTEM^v%w|1}0i6pb5(O@k!KG?h z8W`*cQ#YD=x-#u4j z3|{S0x?S*d6z!m&s;o{> z@Z)tOuX|ndR-uuv*IqS<%ZzpNkf;#ulbbiL=p1-ZIexY(Fvbs%nipZBSyj|N-q+lx zl8k7uxinF@_rhoB5||T*pd{C`kPyvH(Vu}-NLTi-2=PcPB-PtcqvnJ#cS(gYeC6`A zXAR7KjN(GuRiFad{DqbRS06!`6`*MOW487W#`hH_<@+*y2T$X(XJb@t%PSb`8ceEX zgP#Oo>>4c?FIJj3x$5b9aCGn`g*^BT=X5(c@AeW_b9S(l9c?UCl0}=8T2b%ie420a zLD7Ga4D(dz#O7@~!NqPUk=*wxcpMVZ6-y!;T@&)};=cbc^+Nyme5|5mzV0Z?%{E1V zN8n8iBSKcuXjNc5@@ahmE&QV(e*ldlBcH+1CG+KFNotX!0fHpEVwl`M_ag=d#!DPh zx&ON~^1s*p2T9z&kL3T8N0R@d?CK-E_N#{vfRoApth?};vQHs^-S*#=4_?WLU|VWn zPQJqVx0Xb3C;{Na4E`Ti{2w$FFxea{jwt8w)|2u?oMZ8{kF};EbU5`sp9DfCQ(b@n-Hw{o<>m_&3M#Ew_lTBiDwQjY) zPlp7wo#8uNFKi8vdy1_KX20J!h*H^VA*Z0kI}E?~$)vCDAbqtr zb!M9uT)*su#3F!jxh&)IgSw>z%VGS@T3#z~Qp9V?T9Tb#e(U&)IapoN*-kR`y2+t9 z8W6Zj*`e&e98I_blmt%8(lgWIE(800u#p?ruJ_Tp>T$0t=R!4|-p^`f7)(EFH^y^1 zoI3o7`ILb`d58B{lcGtS0eE+`w@2u^#1&t@Cd06J_C17P7LZOz1p~aQEc$=Ot1eI^ z`97qJo&@RdG54YU_-rOU_t|8XBk?j^r#91ORg(p~VM5zIzk!~;NZwjG!)HyBtncv9 z5g~4C^Ttup`N6=b9Pl5VA|X5c0Dc}KZ^neqFR6^y|bA{EB=#oUKXu!b~KJaX5@9mNXc!YLREaU0`oCwvEy z)wS{<2;=)c!1R@*j?h>^PVc{d=sCUP2f%FNgwe0)T0u%sjGwu7sVJf!gqO-+@zK+o?E_an{k*tQ&{ zE~^?-{Of(&w(dw7{!a_o&C`^ox&E|ntNAMU@Q7*td-kR}`3ah8mu)+>jXTSiu>R^H z+rPFy^*?z(0u%Mbxjy&w=s~_v?qi`3*Gf$Wi@)^(8;a9G<(2+5k@$gn<%#st5|3V+ z(@t906u39w&*15RdBMv{ZZdw$X>up3Jh-fWfcbAK?*Dc}n8f!w8PkIv5~*OEgTnpo zn~`J3pZxpVM`m|rf<>^cvtSN!OZC0q5`iz_)t<4$CPg})oE2V+}4R;&Zu z$d#~`6CaF}@{M31o`+kxq`m9@xs~(jpa=Zq5$!CfsaNDNVCeU4-1)mUm2K*3{;L3d zjTApjwF3#@b!U3X$pP<;OsexG}u`D+8}`tuoxvQAkp)pI~+^{^oCmk*^S5b1GlQ0%D^YXvVKaY`Y`T+f_86QksF<&)xaQM z$)A5P>O)bS(Bz`?!29aNXs3b2la+7)^+Onw@SRe*aiL}4*KJe(x!`u7biL|Il#pjK zjAHwY@q+~i<#(6sx$kP6l4^|QtL;>*Sxb= z5_U9{jE+0B9wX}4i}E`anwok)O4}_%eQ$qHuTZ%m?|VVn zv>Y`cPV=aCUyW?-O4%nb_ZI=ovP;xP7FL;pMu#KXCi$&z|pPC*6il?{VU<;^B5(G1*eI zm?y1lsMks+N@|HWvtj1n6y`XwW=JAxo$lbNSbEPg+1H6>7?mRPo(%{(rq1|ePBf_7 zNsQV`m5!Gf7%Oisni}^Y$KZ)rD*s?eD|`PX6?h)9M*XQL{alfQeoX;8Fb!nV9s`=< z-tw7aRid5V!bm2`|9HLSvjtte~!XAGxjhiIQ)3IH)6 zu}J`(j21$RMi|UQHM*%SHXeHS7rLnMW=Pl0tx^oC=9q39uI@Klo@`}rDP@pVliiCT z-=xvY6jKUbw*t<|q9mJS4JQk$6Cf$9b7au&&JBKti zI-*L(cB#^n(sVqS*CNT9v0{wBeY3l=Bh3}Gt#4PP;*3m-&SCFf)1%y$ z-?}z^@AGMFv>RAgnk$Bbq9NkNMpk>lo#sf5lEH&u?UY{t)f~ez5#z|N#*U2djk)Ro zmCP)55OgTjoZX*eEtZAztSsHOg!w=CDE;p_Wc@F=4T6=&doka3^nGKvkDu|C?e(lG zZpr(gOF8LCz}?QevS zk0BP%m$->2y*nR$@lcpP`1LXN8D~;%hihOV)X!~g97~O~cWHH20RHT46D#hX5AMVn z`yF^CBhA%e``T<9Y2cXWICll9;_2D1Q>v6u`!c_1YgG0NPuiPV^D5%OJcNGJ)CNGL zDa{~^V^$89bPpuHs+0h}NfFLfNa)1*_dS}NI?YoK2x`R3tE~#P-wkZ?XUtt)&L*#*-gzm+uP_=Z_)9zfVYiYk|Lsxpag2kJP-#CF2XaYvEmjmdix z#5EQvb@ks_+nFs+i_t9mUN_GR@aTgL0lfHfax}Lh1zO zth24CUziPani0J&@&xLaH!C9pkzI7$&1SVr$V>wpr>tT9_aryYuTbHj)#E37^ZFkn zBU;qE4C(1@n$VZNmRGnGh|z~Fds2q-%$LWTcP4imeXfD~#=sc@F4y+$%cG|XGfvR8 z!V+_?#VMnF=KMD+9CzIvC^i0ms!ITwj)zkeDIh8lRY~HM5sT`%kojiLghD=T{0Z)$fZ6*!xOHp;)Xv?42H~xe>g9O(|H+tbb*GlA^Z8;bw&AifSK3 z2L|n_4KJzmLsoN)Z{4~tGoxN5@X_vx-Nz11_z?P*wR@9kjjpxNWt*_a4P6U?c12Wu zBdMSGv3BTZ(0=M3NHI|vIHEqAtR7Y`Oy?U!K9%LQN>92wS9sRl<3%p~gz)gGxIgk@ zkl~I{RKG-hC{xV?o%sg<45zUV3Vf?aw^u^_#GJ7A=F_Y4CF3=5cmkip48rkL3Zq=Dpp>VIUZD_6kMOsw#cfwN{r)?we z+|{F08w;gX;|0+Q9!&4becjA;r8%AF1@<%R)E&RK7wNZE1dFtniqozDUQqFQ+5|Bv@#gC_9wt+WjRh!vFTEe+l8i8lI1>lDp7A^KWY-}K)zq^ zmExH0jirhKntB9k?#et&#OnNT5vjIRj^r>;*d3%QBjqPaHdEaSq8)K{AZ;XmYh;bvJkI)6vw;(mX&73?_QwC=((rsnWFE5{`w@?N!g% zm8&3bLFma-qIg8sM*+Y3>S+ciL{Qp#y~`jgWv|hU1pAuW!$|}!r)g7@_r0XG_v*hz zMX(bCQ@4%st?caOk!UI)@UdutZ(%$=I}-erP;#X8rfQb`L?Qbdu8{nA$^hw`zM3|& zy@m|D5`d;zGw9;L_F-uAlg%dQ_*b*JvP^jNo;0%#vZ8!x!NkA-e5EbBN(FxXMrZxY zn7H%oPj6{$2eYnA;bdY<%b(XrL!K$fb%E@xx2<7I7YDBOUCdyPfT8_j~mBUd-6zj|Jn3#38-Mp!)D#WC(0Bm-G zh9LxtkRHWL3N}rrq&*qozS(Kxa7lI`(Gt85IwzgAp&X z)tsZ)K~}`M3Cp;CF6VB9`FI^s`toumBK%dlighowmrFz8w&N2o7-~=e43M-q+yXN07 z!MKS;gELjqV>K-flA8@Z1Nqa`!r>N54H&PisUa1D>;VmsGaS)?A~$E0XiJNnONspz zR{-lsui_9o~fV=J_gKU!spcHa3?xDQTLP zbDG^v#Xb`V=SBdxdv$OtwJv?tRC!(XP-S=xX!TkHEp@Pa+%r9CHfw5cTJbAHY1p;N zP*}FfWIb?7%Dm(e*Pc7tY=wMYDGfa!vMc&+BBwQpG6Y2VWY@=|ynHOP58nw}(#!I> z0G!5>IJ>E-yynA&o3n;Bl^n%Do2Kg1r&@CrYqirCA~q}TNpi2YIWo4&t-RS)bsqD6OX0Kh{E{;bn_xSdtA0e)4zqf!_b1_yeX$X?<^}h*ewbS*jG-~&1*oQ+vQeg_( zTP-<%F!&4UiL7T2+kREm=b z*M7ZyM|_LEHbZkX=zK-(A3-(*(i+5^2$3PvJ-&X+hRnrL&pt+B;4)zSgld|C*Z02` zqLf0eQ$`8(Nbt&P9Ir-RyB z;pFNMjK4{V4}D&BrRQJKaAsDL=ib&0JFmF|nM@uWUfeyOn;Hql)(pz0Il4mm!atkj zv{UOK?oa`c{lsz|Bfa!3ZZ2;9rk^Nf$`hflaI_&{XV6>8(-|l}eL?sDeC3%zu+Jp4 z6T}d@pDbFz`0c{6b7mPhlvd=~pe3qY(0c&i(B9j=?*{S_!CF&W-xN2;#J!8TjuHIx zc2-1&3)s8A&S)AwIH!Kvux{0HyU;+8yV88WRV;|9DT=i&of5+`>EU%4Q^49(IK!R#ZJcWZ~(oeHe(d0(zM&G zbZfyinx*fN<1Siy8;Ob~B0~bK+6;xJ>M5(_wY5zGnIxqLMA#d^i?9=z0#tRvsu315 zlz#SVRjC^rYjb=Hw63kmCP=;XPX;%lUF$&C4o94eu3()4LUg#fj`u-#?xcH&7wK;8 zkIB74>UciIDikGLgbhpvU(ndOcf9?Y9s6T*=L9a%7Qm5AP5`%dr)?s%Ft`%0*N-ytM<+ zILjZQf)oLlk>$M1eCCa%5rQe7w#crvKbkcr7!oQrA}|o zaMuluSi9}*vq)g@?WW{2m)036p{HYbM*(()n?rfz_VHd|<^yYcDv#~%3Zn(hsiI^P zF|S|DTEg0Q(@4N7fF7#3PRRP^lstmk*h!$43?$j4*U@Rx&2&Q2x~nj{7nTA*`?CAH zo$$e#ec3m0dqXx2ur3GxN0{FSZZaXg0T0Kfhv%N1oIK`J&0i51q zXve&}=@VGQsO7EN;kV?m>*3(0K&YVbD%T&3c?m(TEYc+~FUBL7aUy6Pc2=sdG6I&` zW;qqwvTr9FV_4P(g=0OL!~-NQtw{I9ByaYpSPHJYqJA4v*c>JEDX!`qP82yt;+$MR zs#~WuGfUx)?tO1<8fekKkw+iL(id9k4eRy7G9)L>8&Zn_p~!M+Kj$*IVdCTy>G zBf6I9xTC410-xAIIrEUODX9rrtCoeuGk>_7+W&DvAwAceL%&)Vkp%(!U;P*rghf4I zz_F&4yqQ(kwwv?>$d9rP!>wzufpLJ1)8J3taR@~gU3B2 z*3V0%czC6#esJ_#m^{iM8u(e(LbVk!0_!bc%Lxpnao(ZwcX9YxKN;Lmv_zV<{*wvX z>6mXM5$c(+0rPvM^W*b}t-ocdJADo5&xh$t@^M+M=r3{m@XWEU#FBZnKxzQI z4;_)OGi_A$F_7J?Q!JzYM-8vd_r*p)347s8VESz(8v1cs&r24?(@tZS2z)OKvTwx}z zASbDH)>|v7^1;9uzQu0GsC8S#DVEmSxKc!~@&K4OJCOB8b5tRI?{MGhX5n;UZrwFp zD#Py|#JhkcN-F*g(DaJ+4c3F5S)E6(Tf&{$+o69Be!m*@fI#Bz< zJ;UpMD@4m`Wift!q`E%O-eM{!;JU$cYws#JAh0kW=;}=%&xWY_ldEUc05wSn-ArrK zEeFN=<$Rw?1`t}Pa|3{Kd=hSJ&tg$${{2-q(@N=;<+jNFPOr>}(&puGw+*u(VRi@D zM+$7Zei}V(@2bAcN92Z6dTT7dhaLkcsE&+;spJX@zaK_Gb0LIoQvP-U0t}@3q#+tG zp9C|fm!6J3!mgIq9hW6?=|q(Q8b8EPlKrV6Vf9!YagR>VrJG=VfqKvlx`7*PG&~Ia zO8nED!xne&{`)#K{50s7mKP<=2#(=XQKqi>YFuo?A;@XBELNWYEsqIYpe&14m~n{M zI`wJLad7aFH;sOt|I0atV}WOd50dfAxM@i&ywO*1$pCaM>&Ug4TDw^XS>?$5=@&qI zs*)n%!gJT49dGRn#rQV-?r^w)7KGt;t$}!jP-;4TVbcNMmLvcefs9;Mwl6@PO+)_S z4vvAxx8rJR?4vweOv3{-&*Ox$By z_543O6^gjJ8tS*-T^QAvW1-1o?%!*33-JqF7s%RjxFS9F9M`JiIdSzdBdx0)_;9@~ zZFujCO|cezvrj+Cy)84`2R?O?3_wkObOlJ2R!y^gNR|)87SE-_0dQf8Sv>Ejv}$Nx zy_n0sw!hZ*tG&BVi`Hf2~;9B~E|1G-kGjiIJdJ9J<$S?3}_jsj++u5N12>?ibe4B4o`n)m!O5uO_J>{xolXar;wPGSKcow z97gB9x}i%MobRjOlh&TE)*|{iAG~;_H^9W-h0 z*b*cZ19DAdcwTqu%3a&)X7ETHG?nrt?rJPr@Rz?4K(bU5Wx8XRrlTs#)bgKRxjB>Z zT-tC#O3ES?l`-z2qazbsGS{S-WFz~Ho+7{!b?7Twc_?PPVqbV^cz zZu>1Zh%XP@r0bhnkO}5a_F~=Qz2s?3**Fd(iu*TnE0;tGE(u7bH6T|8mc&yPT~_)C z;oA`HY>#Mk`%`H>z{3y`9_Jxxz3dUYiAC@ZjoHdgY86g;+Q^1W%dbs223n45Thl4x zvMiSZPDyY5^``k$tyLX~oN{Y-hIhsd@;!BAk7P?@ll>mbN~Clid9+6hi=~s!V_b-T&!`VTBP&F) zkR|Owt$?F9)VuvS_-%iJzhvREx9i!#LO*G5x!McYZ$Ym2odaab?_$Zjk}c2VKSa0V z9kVo@{OD#Mnjf3&gZyF;K7ZbHTTT>LwsJN22jiQ(Lz9|`q5C+)UytzWEx!)1r&;#Y*V z=6p}=F<#7e#%&VZUcr5_NT`0Du_4Z=eZ&VkH=^=v6gbd5^(YsHl9nGj>W@Y^u>j=~ zKNpiC6hkg$KPvPo`bK(PQwu89U_X(WdYy9w|LWM?l}VQKG83*AZbeHG*AwXR<28Hn zP1w7<>J2pcXk;%8$t|UyuH3cVrha-Ijfk!pGhWkaGYjE~I4l^klSF$ApnmAKk-la+ zaTR&%^8@yDe*&TcGA2e;|I($k2i439G?mxU1mwyLF2z0>V3@AEpso7aF?e#WKQ*kj zI_dzIIDDb)Rm2pkkh8Y(#FlD=N?J!_Qyg?;)5<82&os?_7h{=Dv(LGtUC@xYFt3yB5TAr|0mR(e|r&)dS}3C-yM z_5C*-^Co%Eg+6J-y7x_*LRRJO!cUnDr}E!1HfeJZzf_lU#{E5dt@+~z**u>#{w@F- zN(L`;wlVXzC*_4_yYi+}UT#7-s#XvEjZhpj7RwgtzcL>T(Pv#{hhA5sN|U3r*jYy1 z%8?$0al)OK<*TnVUM-5!#a#jF`g&O2MLni$v(|Md-=Lj2Pm}-9VY7N5kIdz`6WDl5#+iqa-5ocbs~EujkDux`J>fDcOwS z$SJWH4Jq)&QAyn_pM@fJ*r?$D0 z1#^A&+k#?{?)qY_dHgBT)j_-S3AiJor8bI6!rexcLHzP18l6W*xTRRMWo*} zH!q`hfzpSm6{m6Lw#RBK>n(ZrT(b+4zb0zauX+PI0>?XX2+q>)3Ql@*XZi!A1}M@h z_I#p)V6XVtjcDX0N@B&L<)B?Z(A3_c>KQWCQ-oby7v}wGA$-DQ1BmrZ7kvl7)RI(+ z!*~$Pol@0t&riAQu_A8HaLR5P(`ktm3De?&-F)pjzsZt$797jv&NSZ1>z~XVzQb8& zuqj~&r=vSHt)eZ#rz?46d2Tw#LOZe=^hY>c39Ox%}&>1}2Q}t9>g7$zO zy)`VKHW6(3bp6epB^ZS(7;3*pXw#efGW7P5aZCWmuhby}jECD><4rp_AEt`v{E8OP zk1hq9LtKq6fdVDdRB?IixcCIxEY`PU%ailrF6ttto#56|P@^9mgoz0sFE85^^Q65D0&8Grgvuw3m(!Ri*# zaTtUv9WIur@uL|wztmnCERfz`2$x=m;peD!3D3>FtL@i?qN5Y8uxt-gHDxEQZ z;HSEaT$zU7w1r-g_+$YQyZ!f$J3W4(vOhT{6XwJ)<4fB3!1g> z!$|*NXm8T?+_?9?)hew68=u`lq_yS26(*TLU$Cu^r^`WVlU{R{IdrhTsjKTjpAYl; zPZu2obMpyL{PQ`oW#wAfl-Kve#*Ktx^Q7EasMuD!>cWPibZcP7ZG5~_loX9BlYrYW zbK^kRYdM=~)`Yp5KzeY-O?9QW&caO{*m#qU^@$C;&3GA!;3s7O|l@|-2q z4dnCAY{ps=^dV3VMQjSAgX}co^?(1tK*cmb5ton)obq-G!?#Gq-j~P>m4rJwPbpV- zlm23n1K&G&*1R{MraAkD%bW4;h1&&oyl7(u^H|Gwu0>~^rS15S{3##zE9cW!ye+Tg z&|A2%N{Et^!kH1>dH)AvGDZW5`JhUQ&e-@(P%qyob%KUTaLJS59p9Y(?j`ko)!D;* zKfL@Enw_TccZ!v-C~2#W#g2O%M9Y~&WzH*|tWB!d7%@{;lE$Y>p-c(ecsEQ6->R&ITcxa{UxQ<@*9os z@hA|BMAw3LfmeK-S;l!k1ypgSF6_lg9!h*nQ=be{7nP10tdgt~4-_7HK$yJPpn02p ziYnDTECz5vUrnu6C3t#sz^}$$FXpxffMYM_9}F-CNeFiujc!LAA33)5GS7)VF-g<% zZ&QC1;ESjn)+lYxjvE!Mr!gZ{&v-@tge{+3s)aFYU`#KX_F^` z5*CBy_acpDY%*j*3pAmVVqK>gC5$*_0m#uNPqvuPIr4aD^+KBV%zY z2O{hAFjoD0wo{ko_YPz{e;v zl}Pf=x4t1D&}0XsppG&w2DP_5jTx#0X7W6c1t1V&8b{~+S*VK>frR7kn zCJetwN$QcoHLJAyI{5rLr{WG`a?f?C{_qZBsz_T>|9zQl+F!21aF9fMk+UxrkGC&Y zgu#_J`xfqYs>hnuB{xj4;P`k|!H+7}d$2w?M3*GXdOIwX2ya&=wS=rXglIya`t+eF zC=Mmf$ix?+9?B4SqB&CGa?V^eaglj$Mkw>bjI7SucE$chqqV81m87i$SLYztsMAL& z%H~;|wu%DCfb4K$URjXq%K({OL@AlsQ?2=hVYvJ7C&%fCvy_MZXlz%GFKZj?!j4^9 z%JXJSf*W(FfT~xMa+2w3_cp3Ic>8>4mG3xbNpLjszEFIf-JX(uh=wB0cHS0^9MXqF z-WZ+nd?b{F_Hg=LG$j9){XRsFiwhp(lS<>t&lz;pRNrbxap6IB?g7&!0D4lsWZYxQ zdiuczG<8u@QBiPh*&+Rs754Zgr=l?tk&nvp=8cek{kOW9cErXQyfctIrrQXtz;TuG zZj|AU#P8t-`epZv3@U9!>H*B*oKhv4s)F}Wj+R(>a}}d);PbcTwsEW1QTXuyZuC^( z7-@JV+K*xaO42Jfz$v_5s_@4;JO|6Ef?9($KA+g05ZC)+ zL}pWs$8@!q^p6h_6o>hZ2CuckIh<8;Khvv34dt}<7rCf7yEsUSUtS36uQ@C{k`Nb_ z8Uvw+4V&BA*AmD&-1lkejO~4#nJJ`&MK?cE(CCUGZS5&dQ0=34-MZic_v1Ss+U-zx zdZc3QgM$r@=_bB6`i1KYCm0Xcco?$%ZI%5$6Ik00yf30SixdTz+nmgYw1(n}dLAoJ z-X}X@o8>DV{lS2V>sUgUxtw!JPt(xBd6n7C%oz_WM`*~jTmvI2)U(an4usi?%7j2Y zt%~UIlJ;ZZthr{_2R+5tXql;SFzcS``!ST1@nVII75i>^))bBp^o=vF6LO`eB{8Fu za%IXFS9aQ;@(8Lrh#9xWorT1Oe(Lxgd>lP1{REL5#u`zu5|792bK{U-I%W10C6|j2 z85xH)oI>JlA~?&mE#4P-jTC73CHh#HW_$w+%|Fi|4F49Cl<>KFxWQ9uD@si#ZLQV} z=nKJrv$AOEtI9VZZgPFrI8}d~+6}qaryI2FyTQyka4ALUvNI7JqA9+-_1U!#*@L&2 zMNbND_o|UGug2%syHzP9k{i2us<5zim86*W>UTHy#IQa`Vi#^;-#w5XOSO}cGKwF7 zf+=7iIev|-9<+2*{IWQc{kw!lM{EwL7DzjEz7?c2{dLN{%n$z^w)694Tgx>I?t>y&^HF*QY|Gqd0TO>O zq`N_hDizOby)vBk%{mSwoL1YB$^uT$$?!a|oWdGp{X!2EFDmsxr+w95=L?|~I~l}k zm|=$ZW!{NwSArS^6r5vfFF;jL#P&62Hshh>6N0&$?H*dadDSf8>M4c~tAmuZr_;)m4Akb|lIHQy*r@v^9yKJpPyS>;Yh@J*i z#M3IVZkYN2P0eZUI-*DNEcp)4>OU#%^Cwt-d4HiM9 z`Ad)x^XECg_t}aPENkwk^}P(VX0}J+)fT!)26HcXp1G&u+>3r( zQT>UASd=EZNGluqf_{9wetkPE=j#jA(z$kLGQ52 zrWuEl25z10KD!jyU#gW*@>^vv^^-saA zLjRo-@joMJ{ik}(dJhnHL9j~$YC;IED? z#N&{V8tmksqciS=Ogf3mkfKih_}Jm`Z7uM;(B}e7fm=3*D-X6tR>0L;vlS>vxBcFf z-zzfD-<`J~x+HU6sQt-D0jI9cZU0;b7Ip>;yDoeih>ic676FjmqKAH*j76FIHl+K0 zc)a-BvpN1Vg$Rm}T}HW(@a+VwwxPAb-mg*1*0@w;Kp@@IbB=6nc?dg%lsQZ$2ybI@ zsLFX$zlrcDsc`QpGrV2{#7MxY6qLwuC`gjiDbMPf`?UaklW#7FujEMLzTDKS|NUeu zrbunu5L|z%e0S0k9ibTXFf5pz_)K#?R%W@i6MDU{6 z8cDOk3fvpT@*mXXZ8c3^a51&|_0-2XzBMnvKYxNi;iw8|f}Y9?*fTrK8dy^0D*dY5 zC@%2x;EN2e#mO3@lKm`O*QAJEaaEy#SYV~PR)vrtX)DIjV8fWg6Mw7nMrNOw5Q8-NE);Bo{v_4_0_)`NY+bxR*=cnrlV`_nvw!soN)0tP!2SBWpoQYE@06r}uq9uvYJsnJc@m6f+yKmgC@n zQ!dMCtHstiHuLtO9iH(3iB?16?$_wG=h5DCN(&Ksl=qV#JgW~kZ-`=y^JOHsht%HG z-`W%BTvW|6_G?7JJ~4fkZr*!PdYP$^WySg#Y~l3u4~7pD#*9iT^U)+<5v6#oN%3|F z^`}_dGXMxLrn6;Xn^{4&$`i)) zPxV>86NCc#)SGm0h@>zg+dS{{1z!TCJreFnX)stB1QtmmEZwl>9kzNk00mbCP?tR(-6TKPy>w`jWDk=mm-rzLLhGz6^vB(pYAq$rOyUS#c6663e{ z=sXPVl0FWO0bY-0w5dwOt_AJgWAa|vm_?LU-l6_!9-3Uq z?BySO$aI3!Dn%X)x`d5vi+<~wz*p7v7H>3!$bEhmH(tgjAW~vGA&|R1 ztEgM@8v-p@j*miz6ALOfzSHpzIWUG%lox#1vMD?^ZeNa zH`8Fr4%6B!#V@F0U>KOceILG*#NpQci5dOnA+O2+X7sy%Wy8frulUH^M5}YCj8HXx z!FYL}tuU?j6^RBWsore|eR09A%Fq?Yzuk$Pa@k9=e?Ewbqq~D~^Uz3zos;1qdyv*+ z3iBYQESC4=Up{n7|2)<^Udb*};utn%QOrP>CotdG^`BD$;C}%- z<^O_KQ^W1g`^{vJRikNoHGT6V%TF6-0)qH7zJ!+r)MZpdK=8xR#lpDPQBatcmUsy~ z_WxAd|Nmnp+y729|2xXRkM7@92mVfmzmwtbWWe~l4E`>Izsun7GWeS#{f&fwBjMjj z_%{;%jf8(A;onI3HxmAhgnuL9-$?j368;y7g!+_g3G~LcS8+uK#&w5h*)MT7wRiVG z-%F!GYo2oF))IjNry<3;W<-vmB|Ykoq{r*rP03H|(%YTqTxBo4O8GYi06eJIHR`!>&16 z43#kdczjW^6~81uO52=StM%{L`>JBo&LRUfKhN7|;i{s2-i2uw*t#d^Dl%Ape{mPcDDS3ZE|pw?DbqJ;J8S$-i+EUIHuV zpe4(6seI*!mm&Y)%szWYjG3OJVOgeRr-BVp6_u=Y5eDg$LQkIad5?LQ!rKI=09~ZV zqxq)CVO?4C)_vp6)L7Zu_me{$2crl2nvkC#!US^@d?afwKE-{xy{L@omSUf7Q6`A9 zG+~LMv(zHs+iq_xxNYK8(6@)|qYmg{_Dfz6IAWrqV&9XBG-JMwvYuT;m*xlb6=#z4 zQ|z$T!ce~#v{3jN?)BttV}E9Od3)8X1V-didsR~1DwGPm{H)R5U_E{LP~Rn56He<4 zcnYpX)Lb@8G#kyoed0z{-Kcq6cYUoD;C&}gycwe={-s5`*_Tv`+B*Twaw$eJ?HG6w zddSg~P$tZJQ5g>+TPTXv?tVWn$M2EBWP2?<^)>;(MLxn$Ish;)W6@0uW~AM2>v$-M z`WoCYVynfM&i8haQ+j(Wj(Hv{6oxxShm~1APs4I052c)o@t96`Z{}V=o<7UHGq0QC zE(l&^RC+LMxn2aYIVw27rmhW$J^iDpmYnt~?J{`Xq4cXC0tJOZSRx4QPnq7rehoklMKYt7Zr9>$9~<_6=Lu*Q$6?tZD@Zmv--=yTmT6` zWfSEODndFg(Otk)x&0dxt+HqXLo@wz5mo0boIijo!qdcfvZN!Oh*wHdSc|Hd=qo&O z=}+%N*QkXWr#D#5=XbgZA{RC8Qqy*aF43^+g?K8wQJXRc2(`#6*;@DvFb zo*dvv3pu!Vlfyl2xoQS?wJdfz#LC!;besOQMXF(2DC@gi5=by|Ig!Yl znP+}D)A+_#P?%8eT0()pyno1#52DPW18~@nsH*97vn&&$9`e$x)8x0@xbcZDh7T?n zjBC{A+}H^xO$ghwDsJDJ1g(Wc<>MPFNRO#OA?3-huw_cOxTd(j0HFD`LOAT8p8)25zE)G}w2 zTRRWzFAQBLSaxQkUf@o;&AeYvSKeNa%mHQYaiBUaJzOGtUv_H;>6hzN{K1JPiFXrbGp|`(+c0F$6DEY-CONyj^u3MaisDDYY0Dm=%&<= zk`}kGI%O22vdFlg+jEnVjY-$?$Zkc6!NZ@(C!#DL=uHKLF<)~NU^d}dKHJWL-dA*$ zDyjOm#{$cb({nH+%`zI*SIWf`KE&XwJztoTtV2` zc=Nf}_cOzEBjEO^Gr{1;6@B{(8|YsoD>Wg<-}pG$J@8I*~PVO#WHiE>|WOf@n2;Sqll}kxAf&-g1)_DpYr|k<2&jB z%4goAHI3-TdZGjcqJdJ=!1Y_rp)k}=ZP~1qkk>9lqBB#Z4kt3(HJS69!zX-+ac1vT z)Js(H9^EaRR5e=?GUyNQ=S>zY7Np{5%&sA$M!v?=dwn(~Bw1Z8BW+-=G zJmGswj5?DD_0p;!>Ja#I;Oa7UBnHA2=K@Xn?uWgfi#IzQwvZtT7+E7RtFr|yW{7K*DOZAP{`r7vOWfj$-ZK(80pscN=|OCgJ9@{rF<3@o%R zt;!JmlUK-$)Lp?z$*%z3r#mf8lE7Vjsz?k;-75Cw@ANHOL{Zwi5^aLV(NIToH zBoD8I#;IdHolhUCD>ZvCJW~8r?BK2!hwFEw6XZ~5E&+ptR5=3&yxuI5N#fG!bE{+8 zfV?bqE(@VY5u}rrswLKXvL{xp_qLLMrEpJ)`o__J=0$Be^zd_K}HN#m^U8-Ef(nfplvq4yhSyOI4y5R$F2>mra->`WuiN z%F4|QT+2QIw3PWgqIb?NeEB?VBx~VP%DO-#_P^c%>wj(;6$QAie1$_S?`jKUzUC*C zm-R(3Zv@YH(YY;D#M<|EXrsexm0r}*S`o6t*x`9FEcne1@hbI=vDmXC8RbdK%t0LO zyw^FyIh6)q>mW$VfP>qwY&41|4!B(vQ|oGzG>nTn9~!^GXm_jj zQ-5llWpjcsXeq!DmZwsVWo`qU)GaBvH^W^tccH#{LR-9JejaVlx9iBIveO`j#kV83 z$5LdIl~;njMofd^wb8aAeeP^FFb1waLza@QXswUJ=5BDnt+(1|xyBk=H5i6N5RabX z_+m7{Oahyn_WctYPh9v`2$<_W8mejJ`FI(Y?sbj$QmoPV+r6b`JYW$bceYQF&Q-h1 zuRS}shqgNdnF4P72Hl~0a1UF|s#{!7%?hsAJc7x*1H|hcwRA0Xz&)Bp0)chj7^B4! z@h|MA@yYt!gRDE7ZHHS@a|ahZ>WVs0Q|G<1vvaD+AwL8Zr78;}V-)5&yrQ#uoF%&u zK(r2s|C79K*&lWHM_dK6Qi8O2ZF?mhxf88%ULUU9EO2aWD0B=>sg&$0U1ThMhe{Q= zhWb9agaQi%i}~-Q=di@XIyl)^C@k}RXx+x)YdmDQEN5k_Ec$yrSM69POf@L zUMFy+2&A>CtUa37e;#~fL$%}1ecUTl^+%!+O>>v%^!~@28Zf`YNgz z0mbQ&Z?|JmlUzHEa5bE}jgWFM=2V@ZVjlb$nC2OV?f9swlvqvxU7HhDb*z3zJwWu~ zwHfdiFO4d&-A#Y<4)-HHYIoXhh;NNRj)tbA%rdo^rS;qJpgK39pgx8VRqF@EQrPk?c*y5&j#hqx@) z68g&|bbVIkFW!*7W`FJZ_g8uTT_3f(hOcXUxyF}ke7Q!#Yb3lz!fPbFM#5_(yhg%n zB)mq#Yb5-~L&A5?{>D*kLLBrxwVZL}F?XYfL%GLTbQR;@R^)`tlaoJY7fc3Ojh33- zoZupVUAF+^yYbR%+O;bV@iNOXGkt!kvw2cd=pyn){da6qXjvAl%cT3WP9PpU+2<2LwOo{8I#sf2`~6v*>Ee%AdvBs&sRQce_W*2ZWc% z^;_uSDDQa%eWIOLN%;057=^d>fa{Yx&8c~Y8*@L0bC@vyK``S$aui>vjCE;4dptzZ z{{8lQ^ZELskNbB|ZCYqFjv7d^H@dPhZdVA#-kwO3|99<0NwWl;#E1{}nSPL2P#a(_ zcN!_omJj2(A!;z`*dy|R_#&%PL2O7QOw_KwK_$1CGw8|F$1C$H(Zr9)oEFWk;!(EL zdiJ;_QT91^iS20$ch=zUcB>+Ekp;ZBtK^-3zNvxcOiB>WNExHr(g!+b8SX{<(*Sq( zrMG)JP_AzEVhiVizZDj`16L&72V01%o9g)G!k5?LMU9`KSz@BMuDobl7pj5TL$rYbqcLNt3SDbSRgbB_K}Mq-+h7Jkb0^^5AsRF8i!S8!Hw1S?d1d z5vCg!cN~Ar&r4z_g?jU%7{13AjL7_6h1i6+sc_Ng1ttnSfg0;1)sDJLC=_TNOTBQ> z_D*|6Q!|wA%Dpp{fBV8z*qz*%_>o$^K5elS_;F!&+#vLZgb!)humW?#EEwlUd&|%w zgN@JULa>)s$dB;{`mfds_0_GzDyc@84(`52&P*k_;7?8H|2)hSq`gBPPlYWs{w!A# z-^v4*KDOi zbbEyTXpIZVdP2Kjh39YNu# zD)<@Gvb@QdxN8v3#G$e7(5YV&Kexz_L_Jm2B(au{uc`(29O75e*hQ#P{TrS8Buwgo zRLleV6V86KF%$(&NqkBc?)MJ-%Fno@Uu=urd&4H&H#tkX7IZ6ZiART5)W}Gv-1;F8 ztsY(R17xYrJ*w|Ll>!^LE2jHKxyVJYREYgw4eft>^!&%5;tzf|?bGwrjKjpDgY^z% z2z*Z^H%8L+wH&MHGs75-2sOlOZ%1IYCbDsu<_F^`<3$VSLRP?+pgVZ*O58OCiKbb4 zj1cq4Y{Lc97&Wi%0RA@`p7D!F4OO?-WntqPX)exKqXE4V7T#@*!I>S#x>*W_SI#Y>=O%3QqLTbt8TjCP4~w=vZTgzh`bkMXN+OqfApfAK9VJ-wEwsu;xqZvUNKn-@Bqi-nLTWZ;CTEn`mv*1^ zZ&42_mPMls{w?U(KbFb$??8r}@>s9ZFi%cTt7n)vTymcA5ppD8lR>WM(ZOR7M%TMw z;nR~`dp`2oB8Rw>9y*07#(Wzky*8|~uo=MsJvmSkItZl~6EaUvPlFO>i4HPYx2#LX zY`8~u=SHWC@`j^c`G<$TI``gU4l9)43+mR6(GqpczKZ26_>n;glwqWWJV^kk+-tCh<=nli~hehM#GZ(!*R_?xLacP zQ`QLU)tfTYi*AguaJRhGmNh2x_f#LZ;K8nL2WvedT4m(tuW7Oy##PTdC#iYUhU;N^ z18D51p?Ijs)%5+;OHiWescNLXDw7Kq+Y9F=ALNZE8U3S29|bGVQ(_~cI(g-}2x!sq zQSe9ZHH2^rrB`8ws%eTmL8F+@jU1oTG0OhiwBUw!a_*S%y6dSJ@@GxBMpJCPZ)sd3 zMWn&-aV`JYGc;%a?M6AT+B`!eq@Hyk!BYK8I>bYwXcK73kulBWL}C38r&-D-cV(|U zxT(r+mYKSAy%SYXBikZJ;K>oega~^;R`&jRfe6@G&1K}2e8=l3eWb)_=LK3gEsc{8<0_MNQk5q1QO4O9%RGq@J zGLyLSIn`71$Ablmgho0dfxO#{f~?q@0;{p>3!MS{Eu-JpfS7iOjk*Mg?S1ucyzL4q zegi2CR4+mF#2|$cR0ju62s*w8L*U3`HP<8cdLZzkTLmcfx?r;3(gt=RCb z9I&5}vnIho<8O26HV97!l!UFWxyS3(oEVj%9^H+(@3`?n$#&=NIwU79Ifuc)>v$1>81~lDv{rpQuv4 ze)RwN@xR(B3y1n<%_XQs5cA`+^kG|Nw#gr^D}K)0ytLwa(^YJxwUNp!2@mud0yO_$?vos9TELKdA z5I191!9L8w8S`upq7O*^5d&jp5t%1-SF@H^8;!C)p>J~B8jM}398s$iS2v&ruR`Ghz;G8uQ*onkXEdFUW!vL z*-2AgocD3X4xwYc7@z1;pyKI)^!-PlNI;=2Zr>ntmZgkRlVbinsxBnpyIj6W{tL2^ z>Kv~~-rU_6hn_FjGL&~cd@m9W-G3UG|Iz=zpM+nEpY{Gb4B}_`HwRSeck`<+VzP@n zj1XTJ-xl)YyblJ#{5j0(k=6|A4;in2I?)Uf5>pjg6;>fZb4br8jJ4O})%K&a`1H7e zDn`!DDO-?&e`k)&0-W;=ZGn=-vET*w84$jRXw~=J@U^pQ&|3LET)f4B6?)quCbVr` zDSn%xuGC3a(I)M1StKH?*sZ${No{0`@g>FjBHV)ORZq*AcbbNpaq&+PotILd-M=~# zq;b@}T!Ki_n9{wvUCwy1)DcA1#J7&Kb!Vuk{IhFs^MRni?R*m33CS88i}bbLN^i!` zVIaJ;H_-`ZNxlA?t^bPBmf*FA zwc&khJs}Q`7%-kf1#X1={A(kFB>H6XOH#*!*{yZibhV2*enx zs_qa$x15T7YTnwo5v56m9AL#RE|+A!Qr7Pv$i6Z&c(+7aEt~10_22J@x4w?Qz%U7* zpdWrKsoRxPjeCHo(4eq7YIc^oBa21hoWE1_G+y^qUP3QTvOhHeq5= z*$vGvq_6BOn8VD1I7FR9zgd)zSKv$HQ%S%i4<|ROjy}Bm|*f zO?uZ(R2njbG|QZvmi(R(6O>|_r;DPMlX9(oy|Uo{p8PL(lnzA;(!XY)DT~HGKnCuOG0e{jj%Qq*swbKmTct@6GGf%Ff&vt@85Fm2oo~D$ruu)Y_fmEfGel+Ld}%a?dJ`~bBFF5 zAE;?_rrch^uCGjI8SwAiZmH3qUS{c(t!n7l0ppaFsrH^5oJExCGPX_oflXHy5?F$II zUJUbE_4zKkVOh4wFu!`9l8(-0AXl<$;j=}e#tEN_P7Ys2+LhmB7y9rph+2M34Bc22 zSD~O~`!#Sy@P*hEuYbQWN`u6hw}6*ZX5+Kiji%_6@PZxckT4m`PUu-nHJh}Um$8%j zPKES(inABNa_oQ8jZGD;%*5>I9Ib8If;#6b#h8>X^oWKnuUUS#{R^|!FVhQ1Wpc5Bc`Mu zrn#K(Rh#j34_R55;kglh9SM2D`@E=y;W;|K{|zCu#E(Ts&@vN3Yl!jwt+enEo?;x} zHfH%{8Fi}Vr9tzcRAYC_@-dJ$Z~gG=$!eGleE7TBD8sWO&h>U>nsupc_7H{lA@vp@aw0p7Gk zw$&bAgB+RZlZ4s_UP!eZ);*48?WhrHbohdmMS;nhw_H@|W03^<+;VH$VT5tM^b!P8 zgDKwWS{x9Py|SNIkL}2}Otv&wdJZd@eAsEVJ(=TX?HsF|t5aBLnfw)|4X5GTcHbn3 zhQjHLMIF8VYE>s$xv~%_)MtYZTwm0Mipe>3OCB<}9uTZ6uP!qTd_=BaybP~?Phap% zpIq$-y}aei!-EhJ7AqwL-}q#&Q`KlN_ZBIXZ!M%qNgaAGertPT*$l8NpKczxNY%br zZlIO7F&{NL=oT>M7hx;ky+EXov7@?n3|ftsMLv09!kP!0=FT&)p}b=@W*bmlj`6h1 zL)H?Q1Q%#FTYRaW*SBE(8L^WkuOWh&YGrE0+_F>|s+x7Dg<-8tbSkMDk}`NhGz2gH zv!lSzYzBSP)m!vw7*Cz_Tne-#2^u9W41)G&L*ghROEcE&AsROrpAoV>KLH2X4dr!6 zD|k=2Nx;Y50^WI{g?li@By<<$w;H9L%E36^+qUY1A@Lk1@#l=e4km4*YiG(pu)J?W zTUdFB7ZN=Jmcqwep9~gg>9@V-V~c*a?Y2s@Ko~dDNPbd2XK6_eD-12m_d*g+Ww$yZ6vN*PUsH;-yO$WuxQYow?z> zT0%Tb+ZZN2>dY0Q^Q`p+>8<(iG^%D|KFt)YhHAZ(ETw(tz^RG?eD(Dl>rOT) zi0b0mRoFKb1k^tuHehhY_kJmw8Vf5?ZfOgJs0e9iCFMe8+Ntylw?%<>p_6@D#{bM- z_zMhxzsSCLyD`3LuW$C&Y~ZJTPJxQxM_97azEFTuHcy=M0uA)8<}SFU+HBKE`)fVx z#?d24o%Y7rCFtXOX$BDzCu|Twn_-^X)l|3TwM+Ce;|G1Y95I>{^@CtK8^i1CPlVWO>ZFtBX+CM5FQHFa(=UjxuC)p z^HF{d*PIO2v#GGj@Duq;Gd=XGIsBrH%5G`3e5bCisUSvlfROww7iV-qq$+o^AT;lGRT1nLrj84i1@jrm{YaDS()PMz zYPfc@b=Fi~OJ@Am&t!h0g7_Hzm){FlFlE=J!CMdbRjVa@Rhmp7`Wws!CiIos=>8WZZnis42ahUcZwhi*ZY4 zAksRFL)?*fR2Tk~EzK~(_>&feD-|p9E9jP4iV(QULzQVm3D*3$Ln$S1Q3gbgP7ssy zpY1=SinRbH(o#3ETBV?reJcOiWAmo{{huJ`g)kS)tTB^gQLzry-i$huz19d8@Eovf zCUHJ3uNQb`n7Ibg!rs%LI!+bz$#43+F8A)nP5w^1g%RN50Mh=fN<%VxVA`jD;eccM zWQ}XBeARyjk6$=zl_yqeR7Qb^rN8xq-;KzHOmb;ag7P4KN%QiJZ1MDo*F4RbcM~!* zWFh3L=-VwjfYN)9`6*eBX-3+H+%rW|?!Du~@y#HT*WmbSohUK&qfqeEuFWNAXN>t|^1z0f}ncYG0X$dZgQAeyzj=1F9JGZPq4<&CO3X$Yo^b1agUw$d0MJ z_5Iva!x7ESv?>NW{?Q%#Pra+^l0_}?(NG7kN=8W#$V-UmH@RbyqVl$1BH(~xGIqH} zC-t0>)6|a zh8A?-%vxtow!=OAuL)`Oc$#m-CD%r!cJQXPew2;71;T)^@vq%F0WW~W(Y$)B)tS+8 z%V4#;BMJ!z?atqz9w{|?KIxkS)zORfUC0;K3Xv&?+9L?cijkC>`9BxY|5(tz8$w{r znzu?s$o@=C{cg-N^bbEV#&h75l2v`Sl*L*(U#CskF>OXJK|`8W`B9`wF4Zxwn7f`P zr&MCS_^)26`p;N{PpwcRomT#|^*I^S4f|OV4x`WOJ#$!&ls#vom31fg>rP_Ufly6; zcE@oSIhxqv+ay(quL|JHwe3f{PfHS}$8j;MHn5<1-~x^%m^TagxU{KCWv#&mY1z+9 z&_ng%DEnc#uPTM&c=X?IRTOa4(Ty7ubWn60Z4*YoIA>0wTJH{3+5aDY^$3>guy3r) zmle@|$CJd3PvxPN_)Oo5KnoQY5_nb9p&?odZ_Sjtv9ydE13G&68R?-Y>~_=j9S~qU zb+6jb@o0&0AXP3j2e>%^L=oX}pzSN~i*T7+Yh~&pZa9tx>@2OAzjKfy$bZkw(!xR| zenK7k22$|Rwo7^_JeeSK)bMrLY=JI~ zuZFxz;Sq^nEAo}!rX>9m8Aym4?Hy?rXUD@w6(7V}CQ}OqD{=yt$iKuZPL_*G{GDch z=@aX!Onu=dkt9u5kxTl7R$f>@0)HKarVNvw_&*zk|3~w4vMoy~(eUUudh5Vq%G63tx=h z`A{l!A$gJ;??hcSa&}6jz#rgt4uxQ}P!}(Vx!#;uPRQ%sk6df~%y653V4i+r0gA&* z6SUT_*7UKK<^M+~hQD$*IF%Fh&bcpiL+GY>9tlOspAVwH|Mq_!A}{oYLqL?wCkwG! zxY=lZ7SbKmu@2_5*D)ZAK5slowY~&7y4$LGeKFVG!2#Y~%$@cb5b9JyYruRw1t&f$ zqF>bfYQZ)22^6|eHz*%dW8^UoJGk!8XI|~MOKzT>vO5JU;$L7h+TFpbqd?k$93_ZRy9Bvm{?7bI`V-gDOVCOR($>1J!GPjD^q>#Q zC(8{!U4@?<9*S5Frj_&sP7pdO_wDhgNd!7%uIRlbb{C=PfS0$59}Gy>Ta0dCeEg=&8P^zDw>wFzGuWIhmbpbY`Br1ngRkHQFp08UmM% z#2cPs)~ci$jOjn0qLZx$mQMEjpQL*%)7iC&#P7j}+VS5{fKtBP>v1qMZ~rzaO2#9! ziNXmpD-mGP1w_^i`4n3vnqzHpjN)YCtO3Z~&0o>Ugl|%`^;|c^kmbi>v<~`G_L>dR z#qksO5i{V999-y(ZZu6b22J(t;|UGJEq35Jqznio-_xXhGMWj9zK!LFTh##4UFWI* z)(JD{$};Quru^p0sC&1j=T=$$!2!UIo~SG{y%WfiI@VEGNjoYGHE`B^0iD&2(1IjJ z|Ke&W*m!Kc`Fu+S-UB1LID8`b_Z7GkrRgy>fn9!8pO8{@pnOMQ!PV%h?>kt2T;xnb zI~;%Y%(z((qCDiP|D_56Jv@%H8vf(OTR@@vE^qJ_=?9r(;5s$oWIf0jsHD6Y!y}*&hIR4DU`pp0?_SmID(X?8&@iF zFb9-X^s8_+`#WrZdyMW5Kssjv6n~PhUk#QXpZ`-LALZ#U%B$>GL-JR4KGwe_{u56i z@z((Smz2K}{~XavZh)Gv)~}>MXI_N-$>x{tuR>RH{&nJS%J}@elQ%rQ%i#fhAz1J1hiY=3j#S7Zy@3L ztX}*=X)w4HOXZQA(eV(XZuWTS5>$PHSx2~s7au|}iDdT_aa3=jxyP?&({u3@-vxry zwye#khB|B$^E1xN4>X4#T!LOVKS$zP;Ndg4s(}SV{RK)bSgVmJGQh72Q%A)n{mA+` zrV2D@A^QusYLh1jUTh8eeleOlp;9he3H|J1a$E+p3mt32Rj>Y>CaB(dGxtD;HSNb%)R&l=*rggj#)na1cHUls$1@q}sJFM`$tDBA(3b`j`@5fP-qq`ZMSg%b`26wO2k~&c=K{-N5c-4s>m{gn#7%sd9XxgZ*~L{AfTG!lK=sUv zW||$w00vXq58(O8zpFh!K*dj%dzBCB51zvss$Vs!2Sj+)aEgih(_r{5%9|#wNQ2z7 z-)~LpQ#XhUwl5mCiUh7|=do*$!{?ZT41tSqY3L#G@iK-w5vSaZF!^!`%8%%qm8vUXxDIbyzEgh#7hg6anuMiYy*Eq7REUC}n# zrfG+9F3PSL+>|{dv4fspC~p;!k4zFpTLNk5J=%Edm!OlgXyiR!@T$Qu8=w0bth`{# zt-;9w2QHM}4V`-ojQO1-jPDA#J$`ncmmsrjhSA`>D*{qiP*Wg0Ty-IH2QVbO+-<_= z1+>9OgQJHn+PtGFBtl`UA25G0$({yAbN z=k_uc@g!$xWE?oL&}mYtUjkb|>Oy~%m(SFnJ19+UEZ@BZF<>-Gy@viYRa`;F;_N1? z6acgU--!{V1N;*7Wf5*>kV&UH*fT7Q#NUCdoIx+pN-59JMe=;1W?>t;l!zML5Fb*@ zjjVMHkQ$!{uPo4w>q1vHP<9ujcih~eTiK~df^Oh)M(_y0J-;Qo z6c}nfEiA6Ghzr1E`B4dI=*s>j2nk&92%ghegC3kiFG0{Cijn(3o;No0052T4Dyb?0 zsST8|AdX;6U_`p_03EQG`l}=&Zfc}^5s=rI_YxFRy>pH*hR$giU2L;L|0KC@H}kvJ z&n`jHaR7x8CAKY~tE@ybCy4&zFR;_IA4fnv77(aFWkZ01f4zYIr~vGVmF4rR%DE5x zs*qMa;sWXc_@!_{PvLc~7xtX6-MmAKQ+O?)XD!hsSFIanoq_hW!Z8qxLBvOiC%>Df zzB&eMAiMl(+izBoas&eEf#ZF~VzUB3>CA%EB?xmygtxQ&3;1xfZ;Ks#aO9N(@N0!b zKhMBbVzJq)c96(kcTyudIB-qc&f0GQ(2Yr*!Y1o~TEfke7D%drHfFSZMsW4sZsXBD zf&bl9Ov6z&S`0UA}-5{@J&@Hv1Tesy+g2{8sR1NK#`YhoTz|5I^yq7fMl zK7sdMk=qf`Aty)$GU$*{3HPoOgeQ`q+^4?U=Bgp|aI?AXHEZZrQF@PW?L{sEqivZU zZZX$4{QPQE!~$iM`#@I`S}%~CHoD-I4Fqb0He3by05FzRDNio400p<0>p5Kl`T`mo z4Cwj65t4FIP%*WivqO_oCb*?d?QO_&5q7%p@See;_H_6B&9r~9ZJ}eDh}(Cx(Of;K z6T0*g_hT^unJ`__S#0+&-muf7I6(g8@WGOaNofu6oI2bP>1F`*)fSQy7#O=fh;wP6 z@Ck%bN&Oe*WmW_u^sXLKfcEbx&boe47+ZIodKpg20u3Mm#ARH+a}Eun+|5Hgy#xt< zgU%cSTEeT3nE9-Bf&*8X{)6V=Hx2vWXf%qE7C)KJeXfcEdiU$h$whrjgzK~2R>axw zx)|?woYqr)+eV#h^=5)dK^c2G*#d7VRxnx ze6Rr&RtB^W0_|+JV3%zSxoe0Nc>KFXD{!Z|Rwb2>*3@K5PFvsG1nbg#kLkDZWpE>~5~=jRH6pTK?zudhq>bkzD3P!i0UMyE@VJow@gWO5};8>HhT(DL*y zZKON+JFk!{&+ZQ5paOh6mJPgibU-=*ua{HcA*aCFG|oN|>z8^!V8CU0{Q2OW0|n@h zvfZ5%maBmphYJileK^K1ikg2$vF*Op^M?j)*5mABYqLXvqOW)Zqh|RECC%n$PFH@Z zSPNc)KBvyr zdGNXA0zx7+h8rhQc&|by^u&LIfK=wykb{24@g65$qn)Klw8{hkrFU2C9I#)^dhlId z0}!YupH(-30ROZ=Fq+}ilz)Pb=>0;0m%s=qum5xO`Y>ys0_cge51{HxG+gEtN&p{# z&R7ubxv%vL6@M3bTSZ+7>T`?rA@#GcNifH%ikxb-7?A0K4FOJIt1Wh>$ z^f0IP>DCn>b2=oP&GW-fi#)&08#_P^Sl<679)!v4oQ?*Bg;uDRZc(=g`Z4x+}|zsFE` z%J9VSZIS~Wz6U{Mi@Ya}oQ;&&_dhIBRM#ffLcVR}wo|6ODM<09ul8FzrssyS%$DS$ zAg(ED&3=xoBRYHw>9`Y?8I3)eP9}!pigq@gb!=k_iC&NG9NE|L1_94U?e(&*4vP}g z2DUBv5ji3s9LQ!2eQXe=!kyC7>~2sUj8}phmv{367Qs%kv}mn&xUSzE-HkT~$lYuV z0ea)SA6@A9pMF(}08gWVrVCS=OrqWi^@jMI^y6bv=}jrohrfUfx5EmJDVMV^*&P2V zN^IEGIo0PH^l4NX(oB{w`#U!tm~eEqg5)9_t*8>ozNnZwDZH6TP5ucEl9bL!_%d!h z=7s+W?Ze;#XIpyktyr}L1x^wJJr8t3l(G>v%^#0TV;%?Yl9N#lmMjqw8F0ti>-=8v+^%V&QuJ&+kE&-$rg-=;_xO%smip^fxPp+h@uuNK&!RRBFfHy)`9}4R zzw-FY|L6bpe~j&d5AX!3)^j9VBYDs+K?BM;3Z@26hc=?%5fZyxNC9BV-4`IqozUy+ zP8jA&g6$$rcaUG_J>l^7@vICAWdbu5CdX4?iT3AF61ED?ZAqfwv^_Gdk3nID=u{sS zE$Fz06s;rb9-=!@dOv2|bKX<)o3XJ?h1rAqW5a_x4fEv{ZW09`_+2H_Ti>xr*R_4B z_UN{})w&@sIoCkviQxm;{Yb5J;IZP3HL%&!^q6Q1MpX$f--*m^Iua`N1fM6=d3 zJxfM*o>n_c{1YP0AzMRxvSmM-Op%ya_xZ(>gF*ii z@=tw*Gnkt~oqT!o^}2xDj+X&k`^^wP53ouF7w2+`O2n|ji=x@0arKhiw7w~@o~lxk z-oazr9vFLKkt(3@xeE1TyI@Aj2%ajwO@Cz%r3nw8;ivpG}Y{@xge=A_HxX(S_^mVNAyyz&WzHd;eHk-c!Zgpx3*_W zD$t#{|E1qo$89V6?*l6E9nUsA8_r^2$Bj3CW87d<+<@lukHz!5>0L7HP1|4x&x`|&hc ztz%w-ank0`-$-{~V67(S_K>h?K+&nf}neNKgKVPmgq#w0B=dEoTDd$$y^;8Y6r)vh0 z##1xf{;ZE$$e*1dWTu;LKT>c> zdxJ`Kl*d~@3nv(3%rgxz}Suh z3KjL(x;9Mekq&HvZvhxm9ncv+d+z|=Ek^M6>=*)5da=S9!v!}YwcXk-uZVDxC3+#F zpAXpR=yr3gg6dd1Gl_v!uWrvd2ZWyr0@|SlK4fU9tKFjv;Fq<@Fb?m^TsvO$4o9~} zX|WkxJS1Q+Nvy6*OtZ0OJX)1<+C5P$Ee~6e9@&mv6Mp|3x8`Ua%fyv)kD$9eT^9Y& zTPluQei^re+K}XkpRzx~L^;ePBPmlpS9KwUhhz%)Cb(@Y3U~FQ!+L z&xXAtXJ_!zFY=RJ=5O;j1<>^F=!M2dZiJXetU%Hfl#M!)1sw6&lPM@LnWm?p=nX9Edon@OAko$$IW>wiIOsFiwHw%8M_qlc zHBCuJf;jM}h1f5pT?h{+4kqMXIFRqIXbl<+793(h^!SIXW5_G1P0ilQT7|L0haFmO zvTLvI2jb;E#B{b)$x&E7sSa_IDoey2DV@--8$RlYb25~Q zNFWclh22y2&kedPuR^B0*Lqb`hIn}@fMd6dNV>c5M?3L43kY{B<+=y!_V*lFhIzMV z{T7UQ7@wi(cRy7oekIc`Z(JNL;|iQShmuD{!rf&yHkyCU;6Q- z+hz@#jI|qwI3>jHNq4+@Sm}>6eYC;II6jy!>2#hcS4MaWO^21O*jl6`C?Q$61*K<6 zX#s9!XLT=HVPt!H&HGI@4Jv$)Z@_;kWfNF_lZaH29FP09uCO~bT{Krumg#+TC!?zD ziw;TKGcrkq%C(;@3@6P3_#GLNU){szO`B|X9T*I=+|tO0WtdL$4CZGJZCfxgQNO2o^JF9mbkv%i zwq7xnxx=9`eKHu=M2Vx@ZyT2&^=i;OO#K~4q`|D$;%u;uCY^_!Qz@{dh-$ysb)Tyy zn6C`fa5fv#;-!!lu1tQ8$q~)U===aXch1xl>Z=0b(CF@+M6=!;vlc8=UQ zn2ElV1|_6@BM81t{G3~zF0qtBnbqmlB`7OpIW5k;&OHr$H(hVG;$5U)Q<%PA4@o|R zmy6Xm@nNO^^ET#^0KLyd!8oYFi?fN&%IA`zymUKINMsLv#=v0Tpdjf**x;lQB&dD* zB@ey*cWZ%G5x|!P$5ocQHnYRR6+G~Mm%J!w-T8s@u8pKpHe*ikMZNY$@0UtfriB_& zr<}$;zT+8*n5gC1R?K&cEQ>O3b)~&9Z^D6zsG1@3r5baHg5%Voz&GjPT=O^8P<3Yl z-gc=d;6%P|d1IcqeDNOoiMK@>M|y?5imoL38|TLL0a?sB*Y^e^TeX}v}G&HiH*leCNk>>teXWGqMD7Ga0ZnYu;4ea-oRLA$XDX9TlW7_}{>}gg-Zbk<9lO7-OV9;O&l|_N zLOcu1-ycpGJrrtKyP_-5cvzAp3u)zplKT<*E)XHB;VwIHN4*)nC;E(#pdRHMN30ol zH~=4D_JbB2i78+QbYxWz!5{1b^^HyAvHm)82mgl}5j?I_1J<1ZZ{F83+VL1w6IAS- z&3jQj6qbKvn1$j6QjK<8-GnEnaHGsm9ss`45SZ{`(Evi4WLI=WfCAjQLSXUzB@Ep- z2IRha2)Il3V$kZg!^q4V`K2M#>G_vw<~_FppC$i3=J9Q$9O<(N+qUm*CxVfI<&^i1g!k1a zjQfh#znh~T$rP<6e@H|*-=(*ore7Q zkeIBcGn)b4Eh!y(d;9T1_=uk<&RgdMI)8*#mB6C20nEgLOVX;0?U}}54_pOO(4;Bq zNmM$}=WXQypfF#i0)AZ&C+sL|vXUUI8v3Efi0~wel5oCkkOh6Jmx<;}aM}-9N*{tv z0v-z$#`0Xu{Q`d?2hwt1rb8?Ni18z`SS|rgAIh);_<+oa+sEUyThP^%i!+rPH=aZki+}7 z-EB|1yL&!#%h`P4dVrDVTF<(F>$bK2!Z8<~=td9tH8f(iky3D<7Oc>Iz!G)Uh2hM1 zqj^`oaT1EdSE!eJ4}`^cXUn{dJjHW}Jf*tlNMv(^F=i^t$JbHNaRCqnGDkhOv=|1s ziO>YDh`k7%`%nd;=%(12zsOD2NzN&*^VFQ)MC_vK-CI|fvf}}YXKE~%;;oyaupAzt z@PC7m#0A(t_WB^abo*dO5BL5}nr4KFx`_C0QA6Nnbj?T(Ry15yBhx+HGcCM>_26fPaQ?dHN!c4Sp^BxgH#W=iV~&F4NK)XFs1TS{IiH z424yA9{d~P!QD1iAZ8Z^y+&ghk#9gZ-uL;1&Gv{8b2Qb=@L{qO zvMlB6GJQ+av!AI-S-Qz#(MOj3X+6_9PG7~sR7MWZci7INklcYb;In7Rsnz^VVBF(n zHSAP^2{X$R^f5>Fo^`5T(p@0YfSe~XEqP=P#K)aXTqHqo|5vg9>DRy6VTrXtgvKoyP*>^HJI~g;*WnWy`!beG1L_&b&;4S8 zD_HZE!RT2@+u5emyI1&Fu>w7}Tes5`D+C%m&rMbQlOS!Q2|$koDEoyvL9I*YM-79*bhxT{Co(@2rIi!!%x_WLn=QVlyiAoqxHHPi8J z-Np;fI=I=B&S{vM4=Ab2wZmAuOkSYQm&Gr=Pq;51R#_t{56Mvg{Wb_|;F1k-ll_*x zuugSMeB_T~Tn;7IQ?cG_gRB~pvXa#`P!R$#I4g#h-fdGui9|(N&BszU@yOb0JvY+z zH+SoTmSIZ=wd__KhYE|Hi*u5?q~U-%o=91-*Gr4FBy5r7xLg$x%7P5WgMDoc_EClu zKS=F$Pq3A$^cXbMKX1g;SLjHtqZ-|-$=K7P0a(Pmiu+P!izON38tTFl#N=GeogKsc zx!)O?2e0#X|Ex9v>@^Y3^*jG)s7U#Mu)SfLsV0D4G;5V8}GbYm$ zv*U+;hiT>xc~X)XJy>-ij|syno#;r39)gmLKDXZ%#g%iX;RkNYYyDpU5`nb4Q_pRK z@K8t);PeQ;(>l{>ceq1FwQ4Y~$9bI!AAR37%w^d!P=n}>-f3=CBw!UQ;E-Z`41y?L zy_ksixCbkV)V~%wvE1#VQBkPMRj0ntHB!{v4%A|}hSi8Tfg4jDhSThR7Hf}84sTV2 z_!FjRA*vy^qn>5Gxe(}y>Lw26j?&Ng2t1N?lAp1TeC+K+{;RQ>iYV zFgq`JYypFN){IqEWw!N`wB)C~O8A>qOP+Qj^r(&x^UR&mKL}b3EqhD7T+t_7@fMR- zHG;K?w1ajxH@@{Fb@2{^e*p@arKF9aAC*jF2Wxc0$H*pVo5+eDqY~UoODInhas!acR>@G&oTjeu^QIb!C_rd^SoTaXufk5YR0d3KA?!` z&3?I{?noQiI>WME^$4|pkLsR_Ny`;=<3-s^?WBDlwjv>}@)L&HG~N@{9CBg#YT4&0VuK8Leg-BFO5oTc|Q@@F?Uwp;TfMfVG=eX63-`QZ5 zYIWhGe!Ky+1o1lFi4l}Sq*|KDNKQw9livcrH)2DnU?WnGETNZF1}<`X#A)Xgqp=6x zIK&O=KWjk-qiAV;J+X|SH=DgYS640^_lyr$_(vYmpg6lI&ieP}i(A-aXQ(Wt8^7^+ z8osg1idU~C9=QbL<33WZP=rpqnz_lEK+YEhi#x08O`ikg<50t)-Fu%^93AJ=Cre!K z{oNQs;#wof@)WPitps0wP@5CTbK{t%+Y0T4RJxXP>-AE?2@hxBlBPCQ;g5zS&BRdV zIGi79G+)OM9Av2)vEayPiq^|gbMv{LBu|0cOHkE}TPt94t#1eM-ZxOX7no$~@v8}7N=OubkR_J! zT?-C(x)*qN)Pbt0>^pbuD3bEd)|-VjoQDRjtLkzBZ>#x6v-;|%3ub{#4bR1cC#h}= zAzG54F*BE(e{=jR9QM=JU6Bjs`6+4hCCPmB`g(UsjO#$KSoU?n)_zVbfynbD*^pTt z#x%`%!xOAM4g7Jquyo}aKz(Mgv!4qNXW9Lk#KA1X;=b|dm;b`;jQ>;CUnv27Q&+P~RqjAEnvCI-Na-ahudE|9wqr}5jO zimHat#v(6%|Mo7bkZG=xa`m1n8wq!w7hb-MZ_3;oF!oL2MEKl%RZFcA>4%q*SZ|s+ zl#7cGaq*mV!@<$@Tnkm~Bkw0$cgt&S$I9U-6bcsoRH zEDGC8g+MF}FyhDF*OY?dEY%dTOSsiHqofBrP~J}A-?zD%po>>l>0@b+n`xyD`wt;( zJlv+kflo=!8jh$qhmtOXAMB~4G0H!8p@;Uk3sxUz4>ErKPHJzJMR8IPO$t&sllP0I z+~kYwf`BVfg8Y9wnELARiJ0%^!Q{tKiYy7oA=EeorUJ9I#sq`=M`E4_xvNJyQVL4- z$$JqW^B#%dTX)p!3J9D_2eHdK?!xBf!eRikbVfUZy7T1$iOzsv^l)Rc*Z>hS5)$Gz z>b!GUOvXYg1;Ez{^r`Rf()SU9g0L{DL%mRt^s0}=AL@Y1KR4i_eD$CzBMSVHOd$?k zL0O}MluDzBltI}S#5##Vs>J1pB%$*2)Sxgy+-%{j5Edc4f?ohT6eP8>X67p7w|xa! zNa<*wDD@R&ieTW&F!zhK%Bup_s(r{8@fk8MJPdV6f&#4A{Re5cg5{klm1vSTcSaCWcq?TbVj>lBHTXH@d8HQO3LiEd z0xXRf`qV~TgOjboR2#6|G}2c|FsRKPvi3c z^W30fMSB#}RST2;=i0^fTt=Q*NLdNr?;xk|_TP+G5X6sj@)za*CiKd04d~M6O-*BF zM&$mwp(}8Z&xZ3TP_)dyBRcKSe+3SNpI`JWp4|G6jhm)n1Ym4y^wca5ImzBkt) z6S2nlVHk@gv8Fjze0dWWalc4!tICh2U@`ire(R1D$NheccBCvOS(nsk@4V=So7k9y z_N1uz0to5RmtTjdWZpgs#<3_0IGN29((Ol$CA<%z<9pZ>3y-wQdcJiJ(vKDRD5|w4 zN;kx>b;8nY)7?Kh3wSu@PWKGqG$8~f&Ize9hkmm8?%i|Flk>Xm$Ij8m$Sq#8Lsr9J zB5RZ^YGHT+cWQQ~FzjJsTeq@&&ODE=n3HNKEFm3*owOt(IN#iaNDCKsuUlXdB-sW< z9uEoMPya68mJgqQQ@6#FLJ`ugDe3}SLUH-3-xFmoaMSq~8qTUCNmTs)p5(Sg^9Ctp z4QSy+>>_n?&hbeSUFJ&qv-yg<9Wnaug7-vJDu?6cPjQJvihx+Iv^nD|(bz4DP}JAm z+M7i?(I*&@6+Q^(%b2Qtkeas7fDPb!qDc0MnaO7(GBaIH09vtF{@1(<1)OTh)c}zq zr&xr3mSiHMotmhgUx2*_`Bx_%`DP@nw;(@VAGx!OM~O#`Vy)vU9Oy@SdCIEdQFl&l z6FjEGDSN|iV!f9irXWJA?r#@J7ilcJ(K>C0>GGOTMMJnfy%#3@cbBZ=4MMu_XcJ>= zb8v8sNm;Q|;-zICwJ(tVO_3XKtSgIVmpiwhx)7Y-+VCwOpB1c9E0g?yDdU^k<74jm z#TR3m+KSP7&`@kmoR&@ea9(5%p3{MJs%~fF0zB4PARh53GpLPU%Q98Y;R8cPxW;~~ zlSxQ6Np88Y6N*_4L+SqE7htM*N)v(gK)*Dn7x|1qZ=ykj4iAKyFn@ZoT(TjFx~iCU3AVIXv%C}vAh$U)0ruRb|1dnh9He(LRV22U)O*fAd_)0D zz@y@++TN)`k7f>1{_K3*mAT_Tx$K0`vh)kEB142&|8>)ZF)BIOj)12Pe8&e`@n*=E zSC!#iVGDSBME*7o9-gpyP0|wi(>0nsHw-*r?U*@f;GJuB;AY-!SXA4Tgwj#C1v?w} z)^C!Bz{)xJBsw9tJDse(Nm^~!#STjp6?Pr{I5PC<^vm`DAN!bUF%7;eo zJg&W^4cis;^&1gSdf<$&9-6W#kYg&EI&+)%XlyK#y zB+xSLw*~S2c^W)j{iRX-?P%mSM5Ny=D()JI{*aAQ8ed~$rS$m5R`mS{S84u}UJz?s zF2l%Xz0nVo370}rd6A2e%qF@Ch{U`&xdIsmqHHLY&V-w!&E9uG0kT6N?9PMxUd3*_ zi6%aT&V^xi0Y~CQeWLL4du0$q@PUU2?7eY!+ig_~$(9^tZ5K||O`=TaigEK|*J_Nx zaytA3ZEHC|n4*{ryJq zV|40%4nlGGzO>9=YsxW45FL@!Oh}=s`R&t^0bPwAvE@+l-VKz!lrr{-Ul&()tR^S0 zP-KZl#O9s@lk8Z%!3NRHA}4UN1||9S-~>B0CnLc^T4=#Sgn9a+M?tMBZlJ`N zHYeYeZz@fOpJ1|HbpgD@KUNKjLKl(ATTPk%%_4X+zE#uD&EH6*?ZmWj@^Qzx4Pbyu7>y2QP*|OIY#D8H)4JZs?Wo~ z(>adaw26v&`)c`lpuu3AChFRVL}ZzOq89j;#cksquv4NmM6$!(m##4LVSU97 z?`W&^>PBno{J1e2QgyEIB9Mq|3SNF4E8_hzPu3f2tYRDlM0|+)K0hB*(eMoJCi+Wk~%sW~M#2cyWPkk7tg*sbE!EenvOv z^!|(A*8%;66CW`xcWYI8V+ZWDE0(hN_i(j^YXws-^`unnl538%1=PXR-shNAU5M`< z4}NO<2Vo`^ZYj5P)Xpc|DHX%0ykSq!rbx4|9aiR0{#E?@iPfq?9;3-RvahxrXBy)) z-;N+_J#1~sXH(^L_qMsM9VTNepIWYPA&KnnCUtW?v(m9ge0e7d`Hm5WU=D0za;Y@6 zt#R-!RlLRCC=_7)u4yJLDlN(4>tCWvOE|80??isBeXRzfLK+YC#@^;L&PI}unwgw5r;POnpU3CUFsJ6A<^s_jysr{2v>Z=;mn2lb_h3@%A*O8e@TR?1=j z6H%WK&2ifYn!L0le1%5^;-Jbq^FnhHHQ_B-Q$3HEQGQgJigFc4I(kbD|1UKURFeR6 z4z?e`QD^93n^ciblByHx5;=vaDZYubF3=!j2(w;AdQv`!`D*7ptX{Cg~FWuhTxn*R_Er^_XPz%CtN?dK=fl(^=U%qi;CA?P&x&pTg~L?0Y!;EBzb4NqxxGG*1BcKF6PiDh zELwCmL*^RMdwASo&9+LKV$$*&?BlI|%{s(wF3?bZP@xQGg(Eptr!p7fHpKd0V%7h- z&*O#d?NF25{5R!S1(f&^tyhC~+Ie@%ry(l0;l{UI{uxg8RL{-!ZM~O6FUEv0t%-$4 zsJ*=ag`M(A9)tUpuj?Ikw;`YYW}Sal{df?jgUkYrhjxf<4O?ENYhltnI@bgVxxvRz z?0uKa!G8RhYeG9W5 zH1tijz8N}i`G!Upmu>HQS{{*r62JXKRgwGfY565=P^U{J$;M_b5E&(^zsxg#S` zY>H9#3&7vPdJv`&HDkl zh7-4UzEk91(EG~IT6S)y79n8w@EQjUFfIjbSkILGjy73|D1VHo&8$)tOKya~CX*Sw zgh^FRpk04bz>iRa<+u7oR4t?sNt2CG3|sMTRV0Q@MZs>3Xho|3*Oi0c*8W9-MMB%{ z%gqY9s_HOZUbKWap0Bouq}4HvI1(GtMeGepnHLn7-dpDvs0kq~1nh;wbQ7hTW;c$n zjOqKUb3JFEC+^DH0B(_vH@eu*=j{JTtD9PK?=J-A<`DMGm)73N2S0}T?zRe`?tDV! z+Dk?x>c?C;QetSv%QQfwS)>G(kc?^U#J#fXo6ptN3kxhWyMoTl))5wa?Xk! zN@08rQ~Iy>FiJlG7+_<#t454()nk)$%xT9sPlfRl8Q4;|LTE{vF$~`u@6132to~eH zg+aMexcrf@DctgK(kb-|;2S1#_FU%xnQ%E26%4 zR#Q))RsKz7^RH&vf5Qd#-?=~eBO3Fg*Jj&@T`-5#Srj;SsA_Gs$3F)!D(l=@UUEx0 zq;l=#dlt=B(`iSvaycBro|Xv6=LCd+v+z=4vQ@rmu+KB`3h#yU7K#lkT$ARj^ zSk1A;_h(pl>~0q{9f@P#1;=&R#n>u#6>6#1OywMH7$R*PqoBsb{yb2O_oD(LYQ;6R z6EZWD+4R4;<}k&0^z9@Ohaik2{_*_-aO&*m=TUFF`CO*XO(l}bcd_>cR@5b2PpBKr z$|%Gah)$jF3o{G5WJ5S0l=*Wj0ydHV&P@ONHfdePnOG7)VBsNV9gA8Y<->NXC>0^7 zb6OlB!_f8VL4I4Ov8N5$RC7~qDzDf)Lur1IxhKr6$Tqg91jmGuRE+KA&37$7t`Bp$ zzF>_?%aQnQb@88!@YUnyD{+K6#He8!7Y0z1UeWBt*=iU8gU6GStOfZm zmBqGxQNYT$B%!3TBK5Lyt_qBGBBou;Y@mJI+Gukd(_c%L66ETF7ikH%UEbBw(#HP_ zK+BrES+@}{!6H{FEFoiYRpz%sNmr@)svpd`WGA!!dORW--vbD_jMZh9$;^x0Va%Z* zORlNT5U|2{?!_qa0^q~=@^6Mwh~`A#p{#{FWoNfFnlbrn54i8ZdParne}-C>sbI)e zgye+W2W8bS^?H87m%sv<$l0KtB0EzlrEVy)eJglgWkD5?X}$~ga_T8g@z6K+siQ%R z$LG|up2|@`9V@f0ZpRJ^|KkIK1u0Bvmy4iF=u6L6X&cvJ-gfpa?@`^QHIzbobz7f5 zRBf;P0?h8z4Lg>J=M~x;>I9T!W>U&ad%=IAB8woA8RIAj%}!QKD@q{8&RDHSR+vRR zTgGkSRFKiQ4pYT&k9bkZX>JG{G9AzH^`mrsluolQsTbE!jmtU?{!lJbFm&}o!od)E z;uj#qQe|dNId|TOG}yBol-NXPk3%xX6^v)&7`LF52}J^y6+k_TjL+wPlSTYvwg@4o z+D9KmL;2&_kF(IB0!(Cy5H!PrRP>e9j z7J*xSjgTJZKphQt_#^|&JhgrzkVon@MoRuM)p+CRt7oAM!&tdRbei^=BY$RX?K|Ia z!j~{u9DN9HqVt)P)0_H{GghLLVZ|c$q_vQ!{cc8DUHcMIgk$s+t9( zM-t%Oy=qz)3n#ghw;#ezQWaGusXlpO&fTG=2K?c`L!)08dJ%|1NH+cB4DScO-j9?+ z>(oWiNCpZswZ>#&;jD8k7z_DySrsdL+>VP|FqkGWXHUxvcMfeu-P6wwl*B%Fdos!2 zg-wY?PeSkuki)4#V)8vkd?Qo6VIT+og)@(frVmFDXsh?n){jI9`%z}9sB-e>eU@W7 z^U#+33G;}PnCi}2$UXwaG;E^_n+bKYd!u-rbA_0VP{MsEShDP!WX-D7)E16`(90dmXS%WWOsIx^(+>hntM^{<=-9O9_)In&=j(=Tt0YNc=>t= zQE&Jo;?=$JRIruZ&&2Dc75R6E?-NF(HKc#{P2q{we2q$&<~xI5g~~yv_5A`krNqs@#igAC1=>_c`rkH?L_@BvddpjAN=%0nbX{HS%bLL~-`o_`2N!We{J4m(;80O!F3hNFc)Dw@3>Ur-bW=98yM=bHNf zpS|SW5wQIO1F3L*s0@fYNA!3!b7oYXYInpMml~tS0J$nEXy7@813qd#tX%s=@u`1Ofb` z4A;L^?fx_0k=+8%hMWH4kN5TL6E4NGQhQXRhGqS76!lsZj;IH$Cc?PNxJbN1o-ZS# z4AyQ1XQ`qW&#D8Fpkx3ZQ3fn^5##b1)%xV>`Za{2t(zc?2rg@2$$1z2lm+c6b2cIvd~FyFOj6^JOIWE zfVDNvLYDa0F_d9N6X=~z)pD% z)pwjo3_=!e6dKiVj{p0~8kiq?)2#W|-ibeHm_=;Jb#nsn{tD11AKT8@51k7dA(%0I8hg z;+gSH$IzbX#M3R|@fhuTNh+L=F}8^we)*=Xx551V&tBlh#BZJ6Q*kimAj&6JuMFzV z3uy{C2#O53UhZiG$DoiY&V?_m#$-TCv{zE-IzK5r z5Ba&n&Rp=EWv4}W!UJndzC*4U)SFza`CvZqEC3O6?7h-+G1EG4)Te*usC;9fY=rky!mRh+H3YKjGp_QkPX*7EP<_A zS*pX5D!}^mSimXm)X~>aoTZJ3iq5^sro|d~bQ%B5wg2!+xvr^3J7>OU`a_;pvmO3p zOvNrA>FcP^M<>y9dW5oIa_gV({4#h+x%MVy=I3ad%6^d>@@uvvWvFYuQ_piRkH$gQ z>jgP0$cV|tkCRhMvr?@5;6+5>vmx$j zD%5z*+fjHXH_D<1iB!6(A$s=fS!oZZN#Bn47RjMe%Tn#`$7#N=V9I=ZL=gQb#hE#a zUP^A10O z(flnPa(ke?vY%DI@NO2*e(Qm4nr>d^p{q(8FEVIA6_kRSmHd+7 zh*Ldd_UGM%?GDl4ec@}V>xkU8Y-PT)8na{2SVoLOz9B7oR&K_q*FdFK0v%Jo&f6k>nPaA&Ph)%s~tJdXJw!sO=gyAN3zX@-i3N3H< zwZ!a(lsWwEL)D1#H9v0!5@~5jU-DNvwXG8f$4#+GBLAZ1wCp?F-X*h{AcPF{(yjn_ zePBLlz`VvmMdYzQ``cQB3BZ7t6^TgJGw>>{{L4-%UN&4VO4#rd!YW&Pn>vZe`t0Oa zWbor9D=Hem<6EQZB(Q$$spLf@%q`M+?n8;clqTkdhhJ|c6lY*DvtjI!Px-F-voqaI zo2yKhw7n3Wy-r8RIC50H(Hz|Q=G&iaB=x1WlEz09W0YeIBDP|mMa)+g`DL}OAq(L} zSu8)E!CV!_sibIA^c{YT_aJy-uIwZ! zR;?dt)HF)TzDU8j2H`;}nCTf0tH=N+MCWc66QEZIMC8fI%M*BY$~R2X6oof-wowu| z4?2(f7KrvMuytp$7Y^fcjd8lXtLP`j$0iytrorQ`D*Q~OP)lD3>r0@>-PS0nFA4u< zV#@uyO)yqgp}}EX`p%r1X!S9b^}QKmSDIs{aZRLi)STe(NGXuKmLjN-I(6(ezRF!= zgY|eYFC=nFSzC5iH7MTL(K=lT(keY}W2?fc$#a6$Clh(b&r|U}uwT7IBc5}7{7bz+ zO9M|r#wyj^LdG!2H_?1g*L(-a#hwd^aSltoPPO3}DZ?DQ78-nuBizus=&^9#E-kXQB@OCIxI=fwc0Ko>T`9*+o8+Xmn7*FC|+8{HU{)jQ|}i)vkpO{pbkN& zf5@Nxtvgy2hJGE?-CoVNdJ$;I7W(dP$h{zo&``TmeP(^-dqt5G4+KcJghF<^{ z&G&E0LJ@~|lvxS6A~zkrx6ggPjU8^LUMJ@E8fi=nV_Lpg=dl-na`_u;zVfZ>a51RJ z6$1~FzL4oyqwr4lZoPnPMy(r*qVZYc3W&ZH5dMp`O~BR`t4L5J$%rTcjJdw=ZDKpE zcw1dSNXtlG9h^*4Jn7GIC!=z$GPTqvVvnybfn$q(Q~v2FwQ7f>tZm%tTgR2YsKOQT z`Jw(jd&Mc8Wj0@vELu3#qtg0e#X!!W`Ynl)wAvs10)}^rF{2Wqx=gp`N=Uc9&-NsL zYjKSze~9UIf=MB-3lhZDdI`@P%67k3j|w3ya)%3@3i|PfmFJN`iuDctV_ai36q%uq zdb#WS{xOT8Hfu@~M~gqoYV_biG3#OZ2MSCjFU63HrmqAQy9I#vgDw_w$EDUPy}n>D zjf4+dB!pm`2`AIE z2^&|jS#hM_h&jOOG;7)hUF5A~eaks0v>e4E&)>e{NckvQQz|8A8I6KtQDvirhl4tj z57*FFr7mL2h*7=C9n81fk9UqZep*~N{`v&GPM-;Fp-g`X->pF!u@xpbmh*G37K1T0 zJNX6VTU*_87nW52&$3Q?cir7P8pQ$^ZkW1L7QX;*`}NTh>ZKOjENIDn@o`^4JTe=y zNkd0w8))&%cIksFh?c@6i|rj$azf7e#7uql*}J)8w%4foD(qJZJiRTK8zRi;xe$2x z#Wbt|!UPi3xQ7P^YmAbdMql#{@MWdVXHm%q)FnG_^?l(!4N_4cVOmK}m6DxUloW&{ zvZRq7Zp+!-yC@ca>yHepgzQI@&=4o*J_w1gEHdu)u~Rh1SDtB=!-l6WT~ugzkY}67 z*#wRB_Vz1aDm?pJYx!>%^ZoIL7^^}|P??{>DW){-8aCRfm^YQJe!ql52UM)s`Y*J% z;cxCuC))U!jO#AAHF8QESU=W(6s9SjLUx)&cZXL=ZJ6!-EnShQz^k?u#7P0y@VS>F z!VYfnx<`B4Q)L=WeI&1d?(4Lj!Tg+4%@-dwVg`xV0E`8lD&3~(-i|q&ykU9m#KWTF zm^2Otvl5fEP682dlzb%5LMt^3Tfg_90=CO~+J~OjZ^XD(JiJP6a>P~B>ynlG!D(1x z1;%(bLsz6%#ihY%aiLI%spKd#4+c;CZ4osZ8O}mG_vEg&iHsk-x{x`lyhvUR>SH~y zp!C`{m#_cb{+T*`H;NUH==Odk0eNeUit*)1^OXVi)8!`4%OBqwc}3-4;NGE9;$FCCcdfb~cCScci|!>VLe2c7OboX!4Lvfjy!ZsMM4f0rwv{eF`kJC%t~ z(AuAfgdi*>h7U85xLy@vW6pPCH;7r$!*8j-6DnwX0V#U-PR22|UqQ}pGI5D$6i2jL zA>n?nnurs8gJv?5*D-ZDiGOQHe&whwp!J;9kzr1y*P6~jkkN|K)N6uMykPgV*D@zP zh~CNO&WdNqbgch)G;dKfiPS{Ilw!n=5Qx-vq|oFV8+>>=a_sq9{bigz!gq@VOS}@b z^dV2Y?T$(NwaiK!KC%tgLGEuKSC24EkX`BwQV+=&u&S?gN90r9w4hfMZ$dvxvfl)2 z-9xV~in+3_l#Ke2mm-)|t))bJ4~M$u#mlRJK66aBv?@CqWV@mkr;hIgNI?qI`*yYJ zInhi(+^eakA%w)!_q^=iMFXeEby#(gYA-Cib6k{Y@YM)R=E%&lfUSL=q%y-T;g$Wi zh3X=lDax2Ds(VXyN+jcUwH;P8*t;TZQgGtBfn9PP+`@$dc8n(S`h)Ky_Z6Tgl zXkPg$kbj*SYJV^lmy5!9r)(CX3P@wsUR7hK+0xkDjNv&I(OqV438RdSqnU5y3}yZw z+}y`?Mu@qC9;KfIJTWd(qsLTI=I6dTkANr)>?dYxAwb-@FYskFtvlks6jNwj5JUu? zmx!ifGie`~x<#1VfExQ_T?k{qbbGV0s{$Wugq?`Kt;qD2sFwl9BQ$M3tk-WPMANv56{&G7XJf~HBi6dVzU;K)AP+Rn`qT@z<=A!eCf4#SN|2wK=!vO2`&j8yJ2gNt}L}5&k)orHYs6@e}4^(%g!}so< z`yuKSU(MfE9;e2acI9uXl7)E(S5T6r4JC=pSjq-ow-uruhS>yhwvj!Lm^PN-Nhp!x zkCxs2@Co@ZZ_>cjWidAlZZ8mLz_K=BeZ2V9F8aI90avFVcsn5!NE(wDGvGG@+#BZt zA$*x$@Y*7ja5(U}-;bkhwZ>y-F4ms-@KN zL6MlJj>GFSKh651`W%zF>v@qBxE)R?J)$D9F89TbLd%`&WagnUu*>A+U0i3Kor&u3 zH{kGXi)V}?^aN`^Z%w?)SoK;sr0gcKiw&N@WV>mlHcxpVJ>t6S+TUo^%gPqCMpz4b zJ6U}kvp86W=U--X3J^wj`^sE&!e)Xe9kT3LMpt#TKN**{^9ulfNdG{%Bh~F{&7A=> zZlxlM|4>7img4dW2*iptWu?B_(bvH@CqHrxaa5Y9D3$t{xK)+*N)V>943%cx%fSV2 zqg~qGpx&Muq*^}hUreW6c6KyEJJ9`(cW81SWDrX(Dz8b`v2>fBSqgygcP&w?lfN%h zuC^pP(!GYiPTXl7xx9$xus^56Zrms*J?8Nz?3F0YhggztygJ(mZBB8p&*iQwR<0@^ z#U)=~SeDAH4I-(n@!up5S|y7BY89gRfYRbxIizhayG(67YqyAE>{d?XDK+B^kam{H zh>im_=1Xp|D>za;r`#s!0$1s0qm&iYbYZOLOSXdcoo+u&*-iFeo;5DWvj0?YEqr&! zHB?6)fiToMKFzE!{-t?ZN7`s?C_TCVeLoS`*+hg!G=)UUd(-~DW}=9q0?}6zqRVML zyLQd6DgxEw3JMM3hU+}L-6M*!FB(`zX&%Lejj~|mv|u#I-{W%fSC1b2v}eb#P&-{d zJtxbo?f;+SMxn=3$LatGL?DW)Cw!JHD#naMk41$2yY9yXuiD4rk9MkY&r2N3;J&Tk z;;mR-Uf7OH1ZbFHlsqjlE^_pXbmr&G`g?%2+!dLw|5J?|z#AY~NCTQ4u ztdJ2CwH418$6hj+g*f8>++3d)>wNSYxC6vl>qqJU1TU}#e(yKxOHFW{X082`=ciewtCtM{}&SL9qm99gpc!24FmMksOSzCv}RV2Dt7G^om$kEF`)GrYAHHzBj>lg`!h?CXbpvsvp#&+zi*)5if(;bT>zrqQgk__M` z#tJMx-#Fc1N7-kW-H{igmM}RLf1?tuz5odpe=XQFap4hzhWFUEw)RY5 z;QCLVwpwl|lF3A-Z1U3F>-lRQ^_yDm-ze48o3uz1@wTH zXElWy@}$7V$kHl{eH9Q)3}k-|ipv99gZXB%MKN+AO!wtd@r7PD9r!4W57lAC8vR>6 zvmG-9yiIB*r(_)9JG#DfRsv1?DE?*iirbDTI7c41)+re@+QQd#?X7mixH zR3IUKiJ-IRwzubae&>?L04+T>6b{M@X3Ni`w07|}5ki;#QiK9(uf5eF<^Dvo-Hx@a z15j}lP{8kl23JQK%;8VyYf#7%2Zr`5w@BFbA>|E8U#ka3lhTe{lvVQjRR_4gl3U>m zrUbZ3tuO79B6RD~V!gwkYFvqHpyf`oGT&r>XM0-q5W|Pdsc&vxvwtGIJJU*haxpx9 zS|StUf@Mr?f2A(!_qlNvl)DXy>i zTAY7YNLa+SLd5rI47oO5ODs(-aRUl#2iSB$uy3n7mu%vxYZTj zVbv;BWuDhB(@S4PkPUWM==`EY64w9w_Y%dGK;tg-t+?JdDy%*DJ77)D2he+ z8AZ8*ybNhR?-``c&efcNl%+tkdR#h#BMJvvtiFHWX8xWX{g?htmOPe?#Q2?6UPGjj z=q>TW8gqz-yW7uipQF7b2ZY=Ror}|6Iys<{5HU)XFNye^>ViuzOJs_gioad5T%|tv zP1OBd44DJ<|Ecf&Pe%9;$~p)T3+>7p=R-2N5I7O?hBc|F3rXzVgWT=DUW3|&Ztz{l zW3K8zBUW9IPNGWEpX0tixG}A1Xuf?874pr1#E<_=i*p6~*&_pxrXZXGhALS}yM|bL zmN8wAt!y zDg*$#0ZTYhwShGCr%!l9w4lCptQL2!7nNj@@#Q|YSadHN0RK$s%7b}4eSt(V!T%HT zLTF|^MUvLJ$XgpLa(%YEyN|Lo5>@` zdx7#%Hq*8$1h|TXW&=O0z38de6=Tmo7bmB70Q=X*G0r zzz)*?Q(jrh8OQ`Pyl8xNStCxDS|D8qm?4Q}na+;E%2HbErcr&|z^Sg7r=9-^`C+3z9lXVf)_+~ z%_7_jtj&ObFjxP2I+Ib79mA7*ah5CVofrmVe1H~{hQ|<8qn)fa@&O|eV%a9B^ID!Y zerdn50t=Pji{+oZn?=iPD1ZDEP|68Kka=Z*=;zNhsBL-MsFwcedlOOuf}BI$Tv^wi zGAF3Zm!VLaUK1sb&#DPrZ2O?bs;Zg_Z>=gnk`Nba6r{ZYP-m53T02o^6vZG24CXTd z4gU9Qefc-v29`$+IzemKog`9$m~)zu`4<3hEe#3cxwqok6_t;$Lw5A@ z|FHMoaZxo}x^N>ZDgvSsB}otg0YN}=3o21S5Sk1MNEDEqX#|xZ&;kNVY9;5Kb8dp< zoTZzbo7i+W&9{BuGiT;}ckY~-`Q0$*4u7coXVg!8<=Ul8oWhnW5rCeSFv3tV*y z`s^fM*s$~2y<>mp`zfgLL#p&`G~g2T?K$+9?2yX}-zmuH6vVOwGs)Zjgx7j?Epoku z=w`xI<(hq}K(Aa(P1|{dRhsg3P6_SBbp)i%Ubd8rfQu+?$ZyeNWBPD%q1G^2H;8qo z)=@-JkWP~tyQeodMG!_2xPU15hIN9lF#2ttdavU8Izd*I$GHUuZ3hHzy9YlyfwsrF zY%^HENHb0d#^~I-GQK|aDTuY|#}pP92(@>gD!{XL!mt=)bSnLJxCF)sj3WT?{F8$l zr=Wt*PLC@NjxJ4ZhdUrXvN7v^IR)vx9g}yzyMDhA zmW$bl)NU#NMKLevuePpuQidv)g^@MZ?mlaw#jhNeHbkF-j9Ij}PC-1lQ_wGB8(#?q z3bGaiR1Bz#yaLtiSWo}{sUP>ef8JkwnKe|X#nudq{mWA^W z0i#WD_ndgN@tOpjC+1?$RM>Y&mW-nVWB2RI_!pp1Jdu~4@&*{F8$MYt)ra@n1aB_` z*(+jkFA!DCX!a7|bHh(OrT(d~wejBO$%^r&8WRdU9%HNqgpL$E8peCdL5tp0pMv_- z2z5-8v3ML%Gw5)?VR;JI&!~p@_Rlq`ZGxFjLH+dI1OoJ6<`Af7%mhDvuLHwb0p9*;gnslE zc!3holi#m;c^dywCilfD2(E$aCwq*j>^oF}4gCZ%cJ$lhy%L~iC7Mb2vmLpkIc8C-^j+8w|Qa^9rc&F1GEDVkDygkovNGR-~s;0AM>Fr~#ry zKh{Lkgb8&FY?b1u$lu<_?_+UVvbmfbR7%>uFLRn|yf}|i$mj8|kVx05?B?(ORL$u! z?NWVIMakptV^2$|NA>IyauQ0Y7hzfX)s@>8YHM3j6;b%kEd5y{l$9s6QOI`$4RR?Q zg5k-(%wSGINFi^s;!zJs`q#^b?1-&SJ$po@La7>-P3;7B3{ zeJfMKc`F}tIQ}?x_LJ5N92wLo<=Nb|Y9F{Vc45$C?piN+V7~$Q1YzLZLEys(;s(fb zj4iOZ#%?r)JvNMgPxxJ~yJ@>#9;U7`r1jZNK2vWCD(4akQ$A1UIA2?69CN7~23k;S zIVS0nB6Fy_Y5F=4Civ(w+j^4KXuSa1r8QmBsy_m;?cO&Ox4IZ@Ssjt)wVomrnlQ3q z)t2Lqv@`L!9q289%q1;gw#bJ8p-=RS(egAFa>kygAOR;uOVo)Es(t{4H-iF5nv;t= zk_H!Tl)YA2P7Ul4t%hA;`Pr9zM*9?CTV}U)Aj)!2n9e8_HrB6SHxdSVG(ao%dQ+84`ITPFeF43tpk> zGtr@rOh+H+s@s-z*;W+l%lo?7G?QyiF|mw<=mY^ivb#enfO5W;EAhMwu$o6#cgDI? z%~qAa#zjYt-mN-{dA&GD0J4cyIF-7qz~0a^&^J07m#DNeNJWw+9eHl;Je$ziIrL6?<+5!g3iOOI8WI0 z#$?fp*|z@M&mMvMj;zNEF~OA-n^IsP*UBkq!zM;2gVXK8iFfy5mhA-qqF>>!Frg2^ zlvSnS%eGvFm>^oy7lmwN%qL-L6{nyK8(>nne|QSo-}D79aZh+ZIZr+8j9N#i;a%h2 z)UzHAJ0qpq!H0UjbH?)p2s~o53`2t=nB>7)Wqoax)tF`ACouu0=o{r383f~#Fn;^V zI6U;HYJ>IfiUpcmkmLi2kVd9o{AzKm)+i&V`4rIoq*vifS*(8EnsSf)<2S^xV^;G~Z`mPYV&;!i73}t;MPH6|h z0DEPgY#8fg0Ubjf70E@R5|}Y?Jpk$1;9_qlpzrJUxC8l7KxXNbqe5((@$Ys&okXER z|Eb*LRCg5fE^|3B2ml{s;IXjTwu6v{y)CfU4csjR^Zxy*-_^;axG#fu|9qA%c|q`z z-!?fM`8|xk`TmeI`~e)J@Jo93Ik1bG0?ddtmUiF@VcKnC+uiazGj&cUcU_iw8HH+x zOv04%Ce;-I^=uSbNwxfoL*_Zrd!aWs*dhh+sj{J=a3HNl`@n9N_`!>%YC4TA0z6!E+2KM)`cULN*6 z8OwD!e{NtAhy zxf~b^SneLP95c?1aP?3P?U74QR^u&4Lqb$~vG;zh(0=DZt|Zv;rzI3SAJh`rQzr z`_E?>c2Rzm^Utw9G5HhKz;AsgB)s6?wIzuo@E-vt0iJc>zcJtPmygJKXdE7>;@A&> ziW^)a=>j_@oA{0Y-zxiO5B?ZxwT(U|XuowI;bbuEAp(&5^T=0VBG)7U#SZHa!N0jc ze*2|!ALBCNu`Bdw{S=g^c=8R^2wo62hi)eF|1MDQdqDoE?qWRZC$z)78+_0Q6qFhA z_6iq{XN9iAffX|>SNYGPe|D#k(1$)cxv&A<1~8!)g##lH`2{B6&EG}g6@M@hK$#~1 z(Eu7ugOfls?9={UaRCe`li`jd1W+3v0U*tjALRgsXADsG;6J|!IUJbmu%tRbZyNwo zn;?LJ0WX7{01CdYzB%`skARAC9?-tBqax`hG;w_nFr|7!4>GBluet7Jj}xx~q?adO z0p0sO3xMr@6DPpp_T$pGx0W@B&;+1aQ$>+z)M~Oj98x^Frd3!e%C@RDRsRJb@R#d< z{A2DL_3IQwy?R|jXHCQ*mLZZ9DxeprhCUJ<*-*;>c3s#J7l$(I?zp!q_>K=&ZMsch zNSinmR@GhrNaOnl$p#=$>3Jr;MZj_?2W$_lrs|Ifuf6^hJRN}~pA}XCORtXY=jX^9 z%1ZHZjIw{&21%Pfxt|dQ8@eeTuIHFao|6=Q*^{=O1AVRHX<6Y6$4^)xw~Kw+h@*$KOb#RO;zEg`+`E;xJsxPG{N|K?_QR|RwoPf@%62=wym6`t;Y^2zuo3&j6b z)7;-}T)VzDq^os1k_@h*o7 zw<&)oJbCiqC1dT4h)tt>!%OWC3iwNk@ zhb2)7d*RkbQgaGFoHVyo>zPaUNNW@beii4^RcO>SpaU%y@UKgSF?=agkKDY9e?nXb zpgI1+Sl(xV_dV77G%mZQr)(6hNvr{Kp?4M^-0w54=7}pGIw+uSwy6HLX{!_VA&{?X zjie#Z^Q+$5mH}+fQ{RrswQF@{UW_8q^M?E?L@~@F&+i+lD&`fQ1FY!e&6NVQ!DF#P zKi^E%CXSavi2vF4con9n(lYGy=%UQZQ$G33Iicg#TRlf9+GYUMr0@ zy?2DJsG`1~no_1vYW%nex8*Ez`H+L8pNjjVnFr)fexm!U`c(O>HF@ft_}b4RQ#Dt3 zK>usy`1eEdKhmWqh-u<8yrQ+0zG#9hq+Ov0^1+$Obin&@iR_ zBK0q;FBV5QFwu6l>Nae{8g|5$1tP8EDyt`p_|>aL1-ds)XW=}IUt3&2r=S?W6Rte3 zb6Ff%t!xb+;^;8_m1)0_o~Ut+_?W(KQh0NG>ga}$>^Hv4qCviQVr@Iyb>#=6zkhI` zr~A4mLQQIR;q&dj%sod(k2HPDFGLj?&*F>*KGwBedm_%it~&m$ zcOcH-=Y=aIj{vy)U5WSm8=wDw>D2Rg!+icFHLzPZ`FL! zUQ649rMWzB>kV1d`>v{N^3#*IRpX-aQ6s?04_2MTx~KQ%7PH;IR`{wrJ!2h+pdsVp z9KMq1+;MJ`qeJ@OdTT{7koAU$ESN zN^$?b&i&mv?5y3hLHxfG7X0rT_CKP94v1|E{uJdRg`*&T0C(u@@2!so`R%U@k&Elb?}KLLfvyOV~a!k6VDVTwd?MaylyzE z{F}2eq=noEY*M}-%WE5gjrRtbd#sZwPjKoCpM_LB0jKkLr3&Z)F=qq~D6xYRtY7k#EVKw2NkP~?@xX#Ao9Q^m+7j6?b&f^J~o>XwoZ-t<5EcHBV%gP1mAwW8AS3KcH| z*VL8drFGsa;ztwKGo^Lf4}o1VIf6R|5;BFp=kA8Q&^X*s?5$?UoA0)9{aq>XN=pTh zD0Yl!a#Ed=RW{IysS^1S#h%8L;_8`_xFdt68PA8#bC7fFkwiDxxuW1T+lIoN!ViB& z2mhG@Lt|7}RLF-9^}Jd%oT`@uBIS3)8DeEPPMwjUXFV%|c8=^x71y2Qu_gJAwKyLI ziEBYpf1;}l!Ah+3o3-kDNY`Gwj9-ai?HvdkJ2-)UJ;|BmQCr7aDE=y-$_VCVS2W$V zw?!`@#$oCN_x!koJTJscSI<2Ekchw8?`aF5;5T7pR-Fr(UfrQVU-qAi7h%n`p58g2 zpI+E-HfFSm;9cy^JdEgi$X!Auy15$;?}fWP441r3Gr7h0;&~C|){*x($ynuy)jiE5 z^pUUeSTE8&xMr3ocJV}i$!(T-lx3_m$c6N!mRX0Hlvdz*Nc44xsrAo4l6Cy{e3Sz9 zIMfrNpKb@+l|iaC6@CbORhOS3tMT_b8PJR?p|`r@>a6)U$JU^IVI=*zbpp#6-y2(( zPeF!MsT_-@jV}eTqY*jWR=Zo$7PR$-y$SA|ZGhb);dUdF{TfPJElL}EVd7J5N#a&~W({7-WNk8ZSA6^!9oF^icgCJq z$nbuwyIUy}@%a(w8U=IS^;RugoYeKbIqVkUmy5MgzpE_9qHQuMIyWP*_IZZG%U}tY z^ZT7!6nUO14>^R=s|nCCl!Ng%C$}rykN#Iv+&@HpyIw67DC?t>eIMw0P=U^O$mkMt zs7vrZKZQ!BUb19R*LSe00+mIJUTAeg;Ksq_0S(0=C+>ZQh!gJoDqCCS>cz6M2Y4qW zDU57oz(}u+AyQGiEpUYhB6bQw*l5eu+nikKCA`cWno7+ld8E*pydE<;%m=)w%D0Dz zi%H4sd_6BEG;?XMTAP6x`bauGIjX(>&HzVntzvTaR8^BZ&X*+uLtkJeCwS;M*RbDU z{L@-0SP~nFKD$HJWjHM7Q2WKpG`uto|A4+!$#Cuf>mOsN+5u3m3vhn#}ULdQU}B4cGe zaypV+8SI~BeXU+I%4aQ@9uFFPu1PB25E-_A8`VC0yWb88YsD(v6HK_wiVDZ9Q4H2y z=elkgsWUDp{!v3BU@)!ghCx4sG)r!MNjxNi$pak(ZB0>olR)~BcJs)ld_dnd_~mT* z037f9!ZSFh6i2-f!5Wqt;h%i&C*nJCoyP(}eB{7KRUdqLHQ5=KJ4l`~R!E#DTKUvT z&159fHewDF)sDTY?2==3IH>1OEJ&WP&(6eC)$gL?Qb#|f?nk8?8x3x5`~_x?E-}D;z>OUN;$3AX=}W?L(?9s>Mms$jrD(s9jw_ zTgEY#C0Hgu^6Tmns6%(=>2>kQUhm(V`=obIW7T0@faONxIz!lyBNIFVv1F6H6Q0MH z@oQawRV>luwbNR61ROz!w@S0|hj4j=(HuuXoBSLN3SU}SGUS@Evx2w%7*6;+liuDE73k>E7Svtob>Fb)9P<1p{a*Fkt_INVTxQ^Xrnsr}* ztZ2RKvD()dtPT^GCDNjsYr_oC*h+m%Gnu|G>Tbh0=om?bokHpQ9twXN0+;r6I zieEhM-D=m=gw-4xz)dEz=GCW(x;GP;hWE;=_mMQWpCb}NDbq<|0pF&uVx2Jx*PKJ=8Uow~ZlEKWOAxDMR<+0vJ@ zB1mXa>$OZkR5Sdo8r7`POpB?7@J#pnk2m=?S1!=JP*R69$a;J^P(maq1@k{7Xr*c2Vu(S9cx7QI#2+FBdnCowrY*u`!EY zI$#%hRp1EmpnvnA&U)y{ApCg^bSCo{w6?H+u2NY=8O;Q_; z6;ER_&&RTQj7aHKIU?HW+hMsaX_)Fs(a|@TwoGYB%GFGye0ch~#N@1$xMv?t#?)N! z$Y|>kS)6Ur3=xT>eHShh`hJ-uV#VWxTfex5qlTx%>k;}eI7^0J?S4sRBN;>ORUA|F zfPuVK_UfKqNp7KmoO=1g=W^m9qnaD}Wpd%v+Iq?LpML0CihE70W_N_Qb(&ARUAqXC z0sL{j)w7K-A8}8|u9~}7+~lr#t2rOokcqbuwXAww@a@`>HqY44E%RuW4@=Sh2>KXv zPCpVoq$DHKM_I3W#O2nQLTS7f2aWlq?Xd}Yu)1cPVwi;U16$yPkH)ESKST3QlZ z9>59BYFcLQ{RF##DQJ$3Sw)Jzsw$0c7?l%4cr&Yyo!1iI(O7U8YS=#osok#5nO8ps z9u{1g?id=a%W3cIqvd%Rf10ffL`#y3?-%f6yl8?_lXftkHkQrDzV7f8ig?EQGD&fgp@jDB9j47>a*A7QcFtGu_7tzix_{Ok9eX&!`((++9+9 zZbA1eLH%c%Rhm8jeGSz?aW|Ebsgq8FMM#1i*S>Hkb3YZn;9o-Y#oQSe^KqV2;|fJ)ay_ zLq5MN*eaA^laLVwQD`_FL);E6TFpWMhcm0jzR+Wdz{Mla!NabEH$U7?tSZHJCpb=A zMZ8In@$hR;o$NDZ77ZsODnGD@_|#B_M~@Cy(BwXKJ|ylR3-=bQFCX$Yh8|8J!{}*@ z1s{h$E}%PF-c9aRj`p}vRX4KW8Hi^We|U0!6T1B?N5nHaY)^b*=Bb!kE#iPUjv_qvkCp5|rw!WuR7484>Cs*TbLZ|&SmtE8P2_j5vhCAuFaFaIx9WGOQUXUXj|JhcT;URU`+sFt(uY^%UuJFJ-`yjzxNr* zAv6?3^sH-Re-e0yc+2)>oGk8HMKg%l*C-E7fmymit%m z#CZ5G|CZe*{JMok{RqD=gG{#7P_1^3U6jBh={G(Ea-Y6=6=_4+O>4s)>T>Mz$K*KV zqoe0VA*P{b;eqJ$n&4{(tIoV2;naG=#nyMMZ0G&NOanF%NN&Oi0h(pwyOi<4ch>u% z88$bMcRF}U;(pVu@JDRp*Ld`jkA~lGXa3t4OZ-Eu^8bTEQrsC9#f$^z=t*ekN?L(# zMnAbS5&(V3o%Kltz^~{w#Ft4FdfqC{skw4_VqAlm4KOv}Lk=4bunkz^p)!fAdjyKM zdz?!)w5EL}wlA4t*%$MpGQTMh@exV;na5F75NEp5|Iw`XTOwt4sn@@B+^Qi!17-iv{b))F@gj&H~e_9mkWL#yD@)w@l;h z3i}J%#HrTweJxWp@yeTG=_L_IH0n*8pJ&8fg&EMHvC{3{UA#_jT%NmkHz%>_Y`WYX zP~FHjY`+q4uxgl~$nZ8@0};n6qQqI@^Ms^D)-Ujl`P8T2HJ)NvJ7B(0dP{k zifbHQZ$L&uK)fZ^8J7%~naVO>o8_s|wauq-*7zZB{9Nu*zOeAzC3jx)q9SuXW9MK> zLB^T;Iw#`lv`$hR@8q^2rWhE4KWF8k>!>)#l#Gy>(C+QY6x=jqyE$X#*8*K{=K`~8 zAhv%-qF&zj*EDnUPh-*rZ-ddte&iFL(AqLLWN$)W+NAZ)Yx9yXJc0?=^7;u^NtQJ_ zE!0f&WgO<8j7|i`@P-z@Ts}|n)%Rt{f-jYhvcsJecx#v&-p;iAmv(SQ-qE)8*7Z8m|Add&M&V< zwR`Ay2eTCWnZ68MOrTIWQV{U^@u3HGVSueDOOJ9Cp$fWBKQpqlQxWLmI zUAI^60jz~C{YUQxCzGk5aj?M81~k_|L4N0os{_`e?iF4rN!QyeySC`7o=%$ECtTPP zKl4Y0^hHH!9i@$YOQQidi(KFexm0s4I#-Za!gCVgJa-z|QFg1;iuP2^KDIm7pT`AWC_n7B(5tABj>HC`}zQ(+lkCL~k^>%1Jxm%WKZpVS$-~AZVg37ZXH3n<*wJGbHGTmK=!j zg9ieJqD~Us+1wY?O^whBl9H_?gg$+y&70RBosKX>+8AEg)YxvNY#h*ENKu@U3e0~i zn(wI=?5es+9h+`s82#&ws#M)-rYzTRd@-T?d~yMo1Vd6?_L_J`$i9BhV`UN17=ddq z-9*VL#DHvJQ{FGWrR=;35?2ncbFnzi(OlJ9=}U z8r{bHp+HMr){oK;^jO&0N;r~fU77?xaBrF^wP20RkyFXmXqdsCud?5w7iRcK_u%|Tk$d;mgT(M$ zlM9o}T-n}Y{rufR0#XTqwIsy5lG?mk7-oZ=1+`2|&xFWau)ve9`hl_Vu>GviYz?fWch2sWc;cG#+{POHlf& zrC%1&$NK2I(8qd;`8LT5BU|ACNJxIU5vBXQcil1NZRQ!tB77y@8hY8?SHk{Wdg9v} zJuJ1=jtG2~JaGCP$-I)Du7EUx4sfoytnHVPbiU|e3^}eiM5$=ChApCz(FUr5fu&dr za@6Noj}|1DKcXYT9;T6~W*<5ZoPzWLLT~x>{$wnL(2$eZQY@7sWOmbxLusFlF{j7( z>dB_*Dg~kMY2Np^@(*gkG!I}*R_hEZ4u|e2XTNi9i3<@hZz2q206khuf)9x`xOy@Q zxEE%2Mf&1!0dYJ|U(v4#RY=#ecmm~mjYZkaN1f@Y1TXTh`C~|3-e2s@|k2PW5Vq zZ*N=XW-F}I$mL%bP8MnhxvR;Rp-Da!DSu90>E9=v7O=F%bHT(g%Gf zcp!)l^Fn23p+x!RYhJ+*wwp;8ENE3Es(j@f-VfD86Ht+uL>NY~794?x;>1U{0Vmeu z>vj$6sZi{-JThfw^7(5RPF3QZK&SQxv3H6H_bD*xc@!to`~<&!9kTdyi1}O&(9Fpf z0k|=Dku(LgqXC$|jE!-u{TJ$t+a{?4vQ+Fd#!qt8oq{1V7oEn=A7yj4Nec|q(7Od* z<%WhB9Ibe?N%W_rR(MW8jejUlyck%+@e9J5L93ZI0$n1Nlv_;ise9y6ZP&e32O|7# zf2d?RI$77K>(omb;rZ#Jr6Vn*EADqS{xTvt>+Nw=Upk)g7BcMLPHkfT zT%ZObde?Z9Xvz5It8g&oiZ*vjkLzTs%WXqo!O$P(X$zuSWTxDEjoRcUyb3zkI#uIc zd>#7C*O_Ro3rMv7S%&VsTiSODFs4P)2FObv!(=nPO*-wDdl@hzesE5r2(S-u?ntF0 zvrY|IX#tPMLx?}^2-uUmuWRh!7lM}izNqZgx zd&iIuJI5cb(AMKN02FIvCFcw*Q)9y;M6J}xN<@btNeuWmXpr)BhBkKmac)r4Egl)v$*a~%+ z>+(_C3y-L}f>NEf+#st%`g#~cd$WM+imz_5FueY9k$CT1a9f`E`{V)n`Hz5AigsX& z@l|z+>n-NRd#O?IO!ff%B!RI!A)j-rlP)yZ+dIz@$J~=6LVRD>qIJ^E`#Nl2-VSc| z5!Y8EQ+5)3^U#UrS-27i1WvM%nD?b=Wx6fX*Lz=$bGuH~?aAyK;st5|eqqf!0{7ir zlyF;1nvMa(`qMO}1B~8N`##&zgy{&_@YLUnU=Ju@B*8$AVChL0h54er1fY_BDZpjTdm^T$U${NjD6(&~_u1UbVg*(0ZD*6`(;&e4; z4yYn(TUc)SZH6BHKupR=qeLL@hmP;YMWQEu+jWMik8u7_QNhl=OLyjM(F zX@)w_6qJLyu8W86gWqL&Zn3pa8Pt^Rg<}4SiLw^2oB6Yd zf}=4^?0O?&Fv?Y%sa@?I-o@hZl5?K9jIG0)WcCP*wt8ddhP=||(ung4%Yz;-yNGv* z?J^-_(S5Vw6*Dp}sfU>vzvW^gCG4&|Cvg@D^G9os1fPY?SB3~paC4H>kc-4!;1`p$BQbB~jnVx%Q9;qKlmSI`ea%4|u+FWNeRBLRjY`yrEXD4yj>H%w20!4Xq{Ls;OX-E`*y2chs1AaIJAFQZnv0|PiP*rJan3td6ADvU=CYO^~Fw>UWuZmcTlN>YR z9~0sgTqLR}3gx+a{R%%jJo8G~2KLkR<8*_%Q0t@1H)ucan-jm&=5%wYaC3s~xP{LT zC&x`0#gW>yI#s+K&#g~5A`yO!^qxE)C%PL}vLqr*w)^_C-9%b6?tBH!dH<-(jt~_jXs1T0@cWI7>JU{RG-Z#fR#Mkxo2L zhN#6%=Cw}Ng&ALDz<`xR0bAi~s&@PfX7uxwCob$eo<0Xz#6vbey}8c;yJtvmBNfzlrtzd@zoR(6>U`lh00iWT=-~c6469-+>L#lY^H* zLTZf14t9Cv;ZMp$jnChEXnfs;w10JJW!6?q;{69?Qk+Sy%Ca)Rtw#m4Xau1i4hHMr zz_rMfPtP&I$kb{9NpZs};^hVIfDWcy2aI-payDx+i0bz~--1g{!@Gv}lC9zllLK0O z(w1Ly$XnS26eF^`VA|2K=#I5xj#k-8Z&oxN7RD7-+jJ`BM0C=1U-Kbl#=FLfB-ESu zG!(2?t!TdZYfi)e9oNDBjqA}@h-}`%f-Y=Mgn5^2msBHbh-e)#$!bhv= z_2$&|^}}NBE(If_iQCt-zJ&TySR?s-X;;bKnibd7mcD3u;tl(`r=)75XZKTBMW}lK z4<5Lo5ZCf1ckg9g3q!|Sr_pLD>0T+YT1D~uD8^bF`lvCGNn~jLlv`!)aeP&u%`EYt zaD0ioi0kEA z>FuO6efs2ib_#IW$AwoIujX=J=GwZd(j*W14gY2h@>xYx=+U;e4WCxwW?Do_u2qpW zR;wK@Q7tdNY5v$>tZzSapNxr&MDdeqd88s+Xc5_+hYXQkK2~cFv((y{XiCt)RT{Hu zlCl@?rL&6l<;(2ndDy;6>dCtksz{m<)79c%+0G?V*RD<E-z+5J&tG#Ge`|dT3iOt+n4j|aUgYu2 zvCxrStf`&rZoQrP*6c#2#Gb+H*bf``YM(mfH4oj2_iJhq(T==~Sk!k>lulzGU6$bY z-}msA70w8M?67oMY3o>-9CKomoE55PTj3zbD>8LIc_$xE6Fk>Sl=jdziPk@brvlbo zVIAos7o}g4FeXX)W8F!rt(AZ+72!`B~h|Ia$5BpTSOjh`_KC6O~&*=HRKF zJbj<%n5f4ZxX@07;u;W0I~B}Y)qW-C)upM5jKMD{V%1FXH}E8o_ghZXSG%Svhh}pANUaupCX549hhGY!+uv+_d(&%K2Aks z#5UI!<*FHWqUSc|sFKXDSz@GB)#-BQlto#jfENN8P@k*-{Y2&r9MiDO54 z>D%rV%*4E?id|jRSS>#qD&ivpWU(*2nx=D(;ynGrwlAZ*=bGEMS1}hIb%GXH%y6zb zR@*e@nkhbspRk+(`-bGk(!Ep8sMJWtpVCRubxM?rGc)f^yGQ4rCDG=yT4scqg?$9} z5W*^Va=WG%w(4)WJ9^L!(*2lr3R)0le&nfH4Q-htAMfJ8@u;?BBrN*j#UZ}E`c4v1 zL$?QSZSkseV}`wHe<-OuhVsSSm1o5E%JdAT8kDlz> zFGu6!u>66}d1PvbF3EBm_XnADU|CDK0KF!an2hSZH&>twpt`CZF%EYulGVe3CMHMOt7h1^3N6~q9F|Z`ttbjkS*fT2^3*BO4jvdTh^K?niF*|e{@F*0! z5X){s!j{Hkr^bic$o*AV5;8a_z#zaktUj*gV=7-bx=B5z5!e%KAbKmPZ^I>N~@_FHhMCgajxKYzSF0F^bH*44ZNSdBz#kc#y{0v!)l#+tTQN zQO?xm=??V(?Agrf&j#^q-&X~5%RRk;Tg3AhYAAjP^L;T&lpu|uVd>wW@`0$Rl4>ef z$xyH!yg49f#>O#y^T}+=G}L2{1x(BfQraYJyF$lQaU?22BeV79VHQ2fRwZi#YsFJM zMo&PBiVJ`heN1zt%X+1s<(drL#j0-jIgH)X!n9(>T}QWT;a!)p#38B=-EM@~EspMt zhV<*pI> z=Wb4Nui8XJ_3eg^?~_rxI3I;CH^XrH`d*^cq&lV_Ip)=AK)yFi`lw3zg?8^buyj9Q z0P#GjW*wAVMp^{r*>CXf+w#4xia|c_Tl8)r{*H};b=ANrta4Hn{nBMa+ zJ&w{6tyGQ`pN&^d zBGt{V|Iq@S&-@%?Yno|uV@}!UZBZXrbTaLlsw%~3)R(~{#^A`<$HgV3{_TSj`U)|3 zO=vaM{Vu4;LLl@I$e)e=hdyM^8ujxvaqmNImaiGIu+m?@`Y$ql`sG6*S50&O(O_@J z-QDudz{zT*pq5z3R>ylW7rTwSIrsj9J_KjTI~%b75Gv0K|7YVp&s6P9)y}l%OnX3Q zYH+3oXKHY!24@R`GbTJ^!ZRj3W5P2gJY&K$COl)pGbTJ^!ZRj3W5P2gJY&K$COl)p zGbTJ^!ZRj3W5P2gJY&K$COl)pGbTJ^!ZRj3W5P2gJY&K$COl)pGba3hf(e&J5lp3^ z|1xo>|23mw&!qYX0LXdd-&_wybQ$aGT=o526j%vlH2j?Ce|m#b+#|)UyQDw7T>o9y zll+fyDgV1(Q+1lU3HrBgj8bq)5_m)+x~cr=9}Ayx{|Lkxe)3=Uik$y*7(5$;zu}a# ztF`{yKrb6o?LTAKd4*4lWH#?Mx!K%Hz5!joe}HN5|5S#M{|j>toixh`>rmbRV{<9O z@{pNOt2rrL5MgchdUB8PCpg;0vGUb%!#BcXtJJV7JYQt~r!)S4wI9y89j5(*Y^O>x zMv?=Krnl$Nb*{SA$bfFt6tH{nj&)ta-u@%EgKe$1K3ykQ6=i({#g=NtNUdU{d(ra%(pIk7B--2&vR zZnN-WQoCpPuI6j3oMMMmAe zKo!*dZ&Z0^()!N~4$rMNcD}e`H~9{Hn2kIp;@~|02LtI~rfI6HZ{?w$q13!7pIop13ft_Q=~%Y5mla2M2_vf=1u%#WM#N|%gZB@ z%q*KEb*qWcyQ#o#kB&I&U)hqb0_O<-g`Pwq@38K zloZ--<;VsFU&4Xtnsr3yp z{QQ*J3zP?WtLjVdQ?WNA%O+C$pY&8_fTN{oUN*ABJiEV5{)`ybd`H$ZERs`gK`co$ zJwh7na(PkR?wyI0ioFskGO1+>qE#QfVH-MRDB$RRuKb>IJngd-^5@s3c$D&#;DV50 zzRfHtst%Svpw;u&QD+DYbx}0hos%ym`dRz4PF0ll#OB99E{*EYAXC1tg>-t&8iyJw z)u>*$qNP!C<#}L6eQspn6E~B3#ju(?d?`Wufx^`q2{s?`8RP$tz4r`@D%cW58xc`J z5Tp^2Bsq#Apu|>kker(&Ns{E;ga!m8M*+z>(_EfZ6%*BiA0{>nFvX|lnUAv8xxSJv< z-0>M&-QSU*Nvig$51Ln?Ss;17mu@2}K4C1;x9K7+HB|1;;o_}NMXPUpe*Q?M0WaY0 zI|kTF)-K0Y`+K23;UnTc-`!~E?>cu&0u({JyU=RRl>(K)t}B^uG@Z` z6X5q-0ObYBtND$Z7r(#k3VRE(V1%;8t6C)|ml1tF=sH0Nb-h}aIYEf6NH~;pfQV6) zq2g9D-tB7D(M6MW$u{LrKaioC$F=gCl*(k7pz@HI{Y;nt3Mdv! zd?;d$8>TdwQaET-sv)80c%TcZ;r#}4k+hj#G#PfHi1b?-X&#uIdR>H(^A?<#{N$UY zm4$3C{>4HD=BZUU^;)1YBk0ek%FHo-v>wT--tC}Bg(L5m)zT@>m^D~k)MgkCR7osM z(5I@31jYG`1+Ti9RQa)azw~*DX1_w<8NpsGq&TYiWv$??+h4W7KcgxCwP*@ORa8g0 zeJ}P)zS54IS@q2mH&&lf{@&^;Hyqiy8xTUHLNH?K=aykUImV%j2JNu3BmS!$!-xjj zEJDb&@sU+)s%pp4hb+m4L&`zW&ld11-ft!Y2NoD->!YBYM4ZQ6;E0cUa;}67#Llx9qi`uZ-h^UIi4}Aan%x+WbDe@xl=c+<->z7+o2cAW_R8ox-U$STE4P&!&`Z# za=pFW4j1H07YQqw`C?r$Qb3r3;T`=`5Bg8!AXc&Mcf=3pe4ar^^-4-YmDm>W9Lcsh zuUZTPt;VF?^K2ZT8}rh=?Ox??tlMBG2A$< znznrS4d~7dXj55)h{_O;9V0af+~Avg@0|XM&X=8D<1?4v@^2#rg`|0Zs&TOMCxhQ% zAZ+7MV`R~To#xII?i-iG?d`V10tsf1lc2OR;cv?wj&|JUIEI_4>s=2_59@oFzUGqc z0SALs?1Nnp%6u!X+Cn;iV)ddsMac#qbGX9a5qnoIzRg>~Rb#bndbLWn>bG9f^|fjU zu|w6mE(0NX33H8@)4I3TA1G!vkv8Ayub_Rc)2@t(a+)e4=uS4Vq7$#C zNmjbib^_fP66!L5WFNy~**Ra@9!C%aTSd&wCZnZA5sW=&jwptjsZC=1Krn73FBldGZt7HS$ucK|X zfu`Y{>tXeeOP@3x2I=M(x$1X}59VRND7|+5cnlnn&e(N_J6e$AKwRn$ zJ$svjB;IPX@))f(7<3q*7vAq`JL5GNFXo6JAI=SB^bE;4RW2KK;u~PdIP~g+WeN2h zv{|Ox>$HF==r`=wbwRpa234hDx$Y>R~YK%-NFp5D5%X6qI3NqJ``SZ!eWcf<^^4A2&~K!PpbK4%H#|>qj%Z zXq8gFTKH8L2{gv250MWav)wbgr$Cm?d2NyvI?DE972}?yX<$r*GT~Oqds;`1fROFn zZbhrIHAlYEJfEVJ-)A6$FrcVsfe{ zeWG2m%efegBs1Rp*?%(f4aTf0yK_N^B-qoq9@aTH5o4B9w|Hw+L)OH;R%I7$knyuf z^=B5S)hRJMzq^lQn|f=$`0B%um6DTddM9H$-EZ@XKCCmOc~G=LQCN)43_a$oygB8< zpxm3ET)+b#D1`|btqMk8YwaD{wio4D$JucwZvFmqb9#}cwsUi1oE^IuS^tZuS1FkG z_}YdG%GkvE7qbf`T#^`7XPfLrrFw*y05;Vk1Pb@I5j8sjf`w8k)`GCf7Hk^3mNZ z--xM|&o1Dl|0Q!weKa#i(#hFoig@V}VbFukxx!y#QUn&>RkM4w z+bazfag0(a<+A1XG{=k$^Db&~&q}+N^*_z#;x0?`0u_p;iucNbKUGKw*+Co=SNc{p z*!M>@d%Z*PGwIihx3q#k6#0s$muRaj1z5)XSk8D=WO-D;r%27>8{X-sOvLWhv!Kxf zGSYpfJoL0ryk1IC|7})z%H2GCC0z_*eIceTeC)IsQ2I6ElX{w!@BPj4n69dQ#Tr(^ z1)plCRkC>7!G>P5KK}F1*9$cXl*4I39OXlL8mn;`TR4p=TKIGCw#>HTg!53$nWH$b z81vr}L2&p|YkBj{*Dh-F3sAx)iWTOg21^)w5#kCN^AuE-8XkUtbqxB)7MbAqe9h9x zSjy(t+z*Qaj@fM%d)P@AMR-#u#Fo6ZJA-^N8?|_4v+iTAA)u^nTl#~6l zV#3r6JE_#|*Ka=W+ zJyO2!7IIJey?VwE9b1IvfKG@GJ%Ml^r6FYXFu#WQI$qky)H@b9=rxPQY`&-@Y-Qe~ zjj)5JQqIbbU;Kj9$v&$uuZI&46)!&hTjDp;ro9$hE@Iiq@z{xP3`tX@!f#Is3?Ad? zi%cMHK;7B9I$ovzn^gz1($6_YS1qJ++6wb)EM78xeZpupq^0jl5nfGi!W95jie_J` zrPM^v&KGHdIXQe)2v-}H5F<9w6Ww%!H(Nusm4BoHbwQ{P$;J(=x;CY|FIH~t{XoF^HB9$;wkMk+jM)@WK8SA4A0|N+J7ap{e zX8P?k$XO-6(Mfgn(n2$o)tu|fQdeuEPKj$)F|c-ptU|<(pf$a@@tSJe=f@b4)~0B; zHuR@kD?X!(Lg;CjFh&lmSgOU_ZE=ZUJgwMgBKlsgm#B?6aM;=w6EmA6TiYEkLG>TN z+5E#XN0xXt*}@*1KvmRyuZ~*sGR}Bxq0t&$OBZaS*$GbFUiG84d5uzoAoZ}oH$a^+ z=)92S{r`@${Vz07LFDDt^5a1mR(PJ1SJc$R$GmCG$wfIt+12=Ndl?hlZ&&pxC=+qt z*L&bYkV88%LcFbMP-EJqK-rq25KUV*!Ey7#5-NWK`jpvslJIjTB63xN*a+`#Ab(B( z=pHCj8P&A9h}!gy-#b87sK9nS%e!A}_fCCV<9>4k(kx3>o{$v9s-KOx zD=wj({dS|AcJS&==K8<_n;mne#VoJ+Yi%}Di zhbl=&AF-84a`!|sI+>rHxZ%8N-wdjchcv?`dzIQGr>N3BjR<+dH-kSY>-r;nl-G05 zqbDcpV&l!?jhVKdyP)IrterF+@<-0@?GbL+Eqz;Ir$I7RtVkA^gWxKz<+ZZ*s55K0dJaxo#{sRtBw)jpv7Gn=|XGf`QFq!Fn zlUN+umC2JvSYXSl54G=7L`{6d0XFvAzSY56D4RCX>-rXxC>ubK*$O#QJ+xQpuMWYt zrK#iZmyEdc z$chA+&yg>DWcK-mLRa2;GtN;(tBa%o6N%w29tk~j$3k6c6sh`}^-xS4Yl0_Pavrsm z%vtCQW;15+-TzL&87tP{+k$`>`4>$sBYTd}1=TI^yCAd5omyW=IxPCLLglZEg7ymN zMS@p`QQ00{;&P<&YIocFZ76#K)XdtRVy4lr{jcuV@|96iAb&>zbMXu9rVyMt)KchP zP&PI4yH4dZGv?sPxowo6094}64BVF8Cua|#J_XA)*@%N0HcGcIK%B8;81GJy&8HN?DxgA!dUzH8kvwY9jE)Yi8={4v`=%xW|l zR9vXTchDkUmAJr;d3eCA5Sv?UaonXaWN z?x2dFc@+6u_hNv!n(V_cvLUm)k~ZuEei18C`Zu7vcRVauO}=9bABY`4G}#(> zrA@hb-QFgzVVos|kqW}X*lM19>8WhKdHig8)!8zaBRYlk-IPHEH~yD)k{%1!$0Zdt z)mRkN`e?FWrEuUtvZn5pH-RGc*by>1B~0eWrgho=!zImUdwU-AU^ALuZ$4baG@Kb_ zcG+56=gv5H-WTmyrLsjv;HP(aW~=TpAlab`c>CP3nC&d@x{wdj-w_&STs4m+T>*q_u`_#KW`I92LV2>gY*0L9jJ3orGD&|!vub~@#H*?b4r9Q*BE6>=9q-6DG6A4 zW4iZO9-pAHug$BQ=tLc~sFNSBl(ji#PPAz2gYz)Jy6P6M!ly@K4mKovrKGd((`Ehk zM^GdbhLeU&V^l?Z-$Gl83u{JI&5oJZF%2FSZE#y^l;EYKLp6QUrWHq*NO^{DKtI?N zihi7v!lRZKjj`(!#qFDV=v3G0KZlWoYmiJ(q8pg+UzsHHeZUN#HNUv}eiX=7jr^)A z{${;=#Z>zWpuqq|^LvHU;@y=1?`p*f;(pLE#KjUI7di zE{rSfFKW2hnNB{wl-`sy7la_^;Ex15dVH+7% z!?pH4Tm!X#mA*f9p5v0e!aeL8t*KW7s+!B@WqCYdT4J(D?vp-n%-<@%x9*C}h_COq z#mjtX4iW)%<>gR@#1N|`YLz8cSySA4d_1hmk2(E2~DJlGG$K@^X?g8mL&Hf~H-SwO0Oy^uzB60*1jp#mO`(Cs$%RHn*vC*(H5gunYjXqdX zaszrc^Q;SF^RgI(KiaH{oeYJZkgC&wxE+@%{8CPd@34c>I;i z|BHF5q!1L^q$Dgc+C-UQo?I&>@W$L|Z2p=>Uq)oPT=-8+Mr_0ePQFR0!U;CLbL#~9 z7h73J!;`Qw12?2jm3V+D#6Y#+yO^pMxbv^7j-pCWP4xq!^bT>{NsDD2dT3CQGd^Q$ zSGB|DY5m3Vj91{=h^r8Fs)4zX#lM8xR4+1$4ANVnD>8&w+vstMLzxU=vO$aDTP@|t zfqm-6E(Z3Dn3{k9wmJ7T#`Lms?@=`GS@s}yLX4CuODVQ(VH~0Qf-4m9UZ@SSzTk|i zM49mZR+d+sTasS5`n}rh8HdQzOGbeuoO*gHwAFjn2N&XsylHiW8=d}^QW`5;zVSr%)UY+;wxLnxZ1ASuIVZ!i@|Nd)P=H|jx+{7><%`j3~Jdb_gX3M zUaxGc8@T_f94j?C4ivBnX|^OZudW})(bmksW=J4PH(2vtN_}Q)kSeRG;_)||`+xdX z&^MG&8@>rEzh_IdsOY68Ag~1&ikiaUD<9r1Yc8HdqcMr{IU$|*oSU;%upt5jRgL#d zVyEFY}xf{Qfp(F-o2KB00k1CHC1sLPFj^V2)xvaE^_l<5y$0 zN-KvCJ?Id(+rEZ0A8xDeIO{IV8+~r;c<8n28DMLExWPDlbVkf6@&vdG?7DZDZ5P8Y=qp0dK(sxC2yQbx;QWuk`LQg79Qzm!A zS0gG!qjHt-jkrqjpUBOVehLjwTmP{!)Rw)$lf5ik*fD!~bY61N0;o%)ti*VTs;Ih$9pksS<8t%qt91I9`c5JbT*`XSaDU>CePOtZ@( ziI$b0uU+Dv5#LA=5GH9!HC0SCZ%d-3w2xY4*k4%cRnC?+FNH1*<0IY}l6JJ#w^;V4 zjY$hIh$A{pAdRya%BZ8t2hs%na}sZlMc_gX_kO1o(MZgeCXJrFrhnc@QgOVkUhbBs z?G%d;j0n^AnJDB_Mlt~rX#wo%mm^eF>p)b_B{I+Ms6$`WTm5*Ad+d&~9aU#_MZ$gn zfuEEJEe}q1E|+UGNsf0EUeA~#317qzy%U`kVmzVh@x~JgeQn+@4?$5i)a;Y|H$Qz? zj=5*}RlL`H6m`&<9BKCvg}ISl0Jpg;Pff!}M!>6p7`yxCiOkfC^*EMt*iY%FMu*0D zs_(-oi1m&j;u}r#w5l9sLRm8!KTM?R)Yc{~t&L*PRA8bS=m6 zs@G&VRVavE5X2Aw;>Or+VCTTRlS#s`-?YQXk+!SyU*f*Wga#Vv zTj!`>XKZ%}eJ&tIS%b7zz5N&F(IAXQ(6{N)?DR@#RVB)gG9UTBA%DH|eUY4eGZA51 zBwQp|l+>66!mu6mA{59Swp#Oy(eq{nyx41#xaycixynZjVJdsk^XR9+%ktiS_1tT0 z+u7N7IbbBdOz&u;tWVR}yQVcZ`RKm4WbBmxz!DIbCf0LhANVR8H%pPXeC77~rS8QYMoHS6#0rfALBT!BhmxforIo~MlOarxJPQdaLhaz^X8Yur{dx1V9 z&D<~D5SQE!2E@m?*^0v>I~dpee(l=-Y4V_B#c!4%#*yG{zkYNO2%p-5)3J`i!I<8; zzO;JrER0pibe(H9Hm^~CC_n6Dz2p1ys0~JCv2>du`qmkdjY&j8u%0=~(!o5|6T8

    ba=Ne)S4=T72aTd^UkX4 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�!C=px0}O%&N>a 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

  • V5RBYmX<(|k9t~#l@+sue*JNo z?O#6qXeHYa5m&bG@L<5f?)z*3kyN;9Ylp5KBNfX4nZ$%2?v8E^ z$FG;tarc!-f>V=i?KJm^ZijVQg@FJ0)cN03j=QZ+)r#w<_!7&Fm>cp0vW*`xMMRKj z0;32Mq)VwpR-u~@_MFlnTu63EK1%`3DQ+^Y8Ztlwawp8@@S9uC3e>sAX}o%n+_`xN z|0fOvXDWzdqu@D^_!zEExDOMme*BAYJ5Lr1%%UTnZE8!_lf^i7HA)BZHfb%rQBHUo zNAc)>MEi2K5aL;CUDXO$vB+H0f8LKAg#Z5XFI-KvIFKusX(cmrTv<1uW08!ut@7dL zV(8`ti3UWh-Z}rD6G+!+HO$h(FIB!KiZ$MIws(Q*oIR+lXwQN!d<(SbB2Tn!dRH94oY0Yt`q`d(iVKpOxmOzYo5zj{Q?DA%b<m^V)M+h8?{VE4PYtwdbxH$+0_@rR_rmV$lqw z_p%HDt)$%=sXhjNsMVEziM%u$ z(#W8un@MSi5~y&zMMaWWPe#{ttlsg?H6fDcAAVcVmL%1#Ls~!G{V?$t?#)h~f2mEg z+^l&wWtmru0ACXI%I=jep8iGStNG{B%ck*Mks#%+fjG-E<*5JmKMVD_zt`zBSw0Ge ziDr_XC_fN(UA)gzj_}<6+{QcjtZ!G(#`NwfOTqtGFPnO7j1t*8ZpJF&b#Z{l}?B@~j0tN-J)oE3_f`cdJ* z#PH7LB1miCdM7?U-a+ZNhDX#^y(lFs+W$9dlh;jp*@6AJ`Kg-Eyy>t9YCmQW^Oqdf zOc}4!T*(0ZMgsGH8MT|Bp|g6r{)A~8BRdL=ibOk+Yq4rPX^{CP;4yXOQr<%1P z7q9n?)Ln$bPu1?-@^WX(0kP(b|9U?ZSxoT?zC2~h&!ecrY(ea$ofxd*dJ<<N3?neR+ydu5D(!3LmGacWk7PbHKu7k!hvWZWTc!q;FUQ)s=1re4iOtH4qB%Y+ z`kO#0MRN|kQ|TWo{-RDh9|i+Rk8fR@y_EUoVr&UEbDhia+TMQCXb;x5%VVN6*D#GumAbaLV^c9~Y4dw9ojhr3f)WK<`ZTmje74~Tyg@EOaLM>Cg#>(jMaNg{~x z_pN*;1jSYZLxj0iDKPsObh9DzJqN!CBY8}?dlnO?khm65JF0>BZ3e2~r%$Mz!ITa0 z^MBDy1|f_c*Gu)5oAzX~XFEwxdJ1>%84Q968jA--@BF`7d3`*K40zqVs#To#li?yeeBroqv#&sQC#;fbnMwPJi0Nx6-L6UYH(y1| z%7x0d3N84}8Pmgl(0(+&cSF8o7}Ts(Jw??UKqQ^133a9wMn`Qx35H6R3RoB%Q%5<& z@TFJJDmTx;GK4{|O+!Z&#cKlZb~4^){d8}P*K2Wa5nUF0S2xWOe*w2l!`kc0nW-NZ zd(%L4p!b;3;+wJM_xneR(oN1WNh^IE9mI9!J?UcWZg6Zq94gl49G;M511o$Lbgn44N#KZX(a|oeY})qJ`G2;v0pz zJ^L|w3(`n|=2T4439%FExr>ybSoYrrG6vnfg>L7{g8s~YC_HdCY>QukTvm+1C}^aw zKs5jiScuFAZ=k$)={L}3DS|W~>%X zy6G1P5J;RdHiDimoao+n4Y?01XOlxn)3)IWZlG??X2*DWG$z5|wOxj_@Sg0A-~Uw3K5?xJnSxvg_nNx@XlRJ z1ihC%e>0%(SF6@Lc%A%A@(_Pp zUy|W`BsFL0A+jPx&u=4wj?4QogvDlZk3Z@9lTLNdA-9N@<|NnAc(a1s`k&8Gj#(#r zC*0*a57G&a*umVm*<8$oE!#9aAVC|ee|qgCQUbkaMigEH{a_1W&|Dy-nPb5X?sN2R zsYV2PBFqy2n8stB)fuCnXSWQP5ZZ?>(=tW17%t+9{oi#$XaRRxtlcr)^!B? zD=!-$b$`?Vxv&9Iq^O^)PU(Q8qDdvtMUA=;I1y{_m>$exJGZP3#?5JlB|FxWcE-@L z7+Y1}Pp6jpzO4yfUz<3p5@3=E_LT3J49S>K!WN%!H<4LVx^QPWyNx*#h?0Wbl3wU9 z^K@~91WTqK`IZ03Qxa9e+mBXsBy%N+*#HynuTVD_IA)~MNg6Bg0Kgu9CM9@{{Va6P*0r>`FM1j0y5*&GFF@XN(i+|0SV$`uof5);ed z?ovKxdsH2Gp=roIcN*FYyx%IQ-^A^Ocsc!+nGVi&1?>@Nws)3;f zhV8}C2-;6bYuV@^m03?c()9V1>w(78mAm&Puty zIbP?Jju=}5EIxN=_=kq=1Tpw;~O1hZ4lPj zd+KQ;Xqcqxk^9|Fj6^`w{Z>MZ?+f8Otu{u+XG#;OcK?o2(~bBD;0DKRcEtlCuI|7^ zDEs>7DIWe4?_GiJ6{NggyR8Y1a=ON1-}h%|*>>o?q>&B>VhqgI%R@Pb>Y)MbTlMFd zNrI`ZP9VbW^ED@v!5@~-3rIlp(bq!X@(QtB$s+R#32fsLna?LZdAGV-Lzii~BDbY? zCA)#uSzEn13-a|0e>FlrZ*oRIw@u#S6;a?zhV@|Y^O(VwJd&xvfa2;lAv~R}z9Gxp z-w4Mp0tD2ctqs=9#GdgLa|wg$CzvaV;5;q_zIqm8GVi4{+#rG+ZHr6Vq`C8hXtlVf z^lP+?XIeVLBwvHzP6+prz7fA)%B%_2YC^QHUB2E;|6iQFWmHse*!De2NrxcKAR#e? zbTfd`(kZQUcgH9Q(kY;HcPKS6Bm6bk=PQ?8enf2!sx!aNIVlU&XE_D{$NifUn8ddw;j%%RGz_jCr*Ywa8_Z9Kk5895|2NhQ>l*|nG znF%4jO|>@___~7dHQtzymaPfO2Q`OeeaMnWxQ9Yu$7u0#TprC{o`~uw6Mrv+1 zt7OxrS~kCS-|_8K{~R#*+OsOw+%&HzKktFCbbZ+^sIW)#l(4!IdusQ_?=q;Z6^La) zaw=usi2@XB$NNl^mhvSVKkeqw4N0Q_43i2qDMn#Cx z?e(VO>f)=R-7h-Zc1U32aM3S!O2Gcrua0fjJv^x)096usT#^c@4I8D+DhGJH@Y2SFwrR$3OOYu&2j_u6pYTXN)YI3q z1Apnzy+2`y3svSptsi%wdX(xY?{jfdI$*o@+`6g3Cic7aj75?IkrctR0Zo{wVF!iJ z$h)``(b&%2B130Gf>tC6J_s zw-Op(HSQnld-ox=TQAC*SXlR1)@%!ztv?zkO&o}uZs9uPSGaJPv!);ryBPjK;qbm3&es{+d zmVN!;AvQA7$l>t6Y74vZ!p+mx3osQj+o<(B(p@p)gwX*jK@l}3HD1rm+RdeR#;Y@H)0sWq72rFa0;; z7VwYf&KgLksy7>%a~)(YZ;BSW1VW6tvmp(XZXgHu1+&Q$GkDZAOzh?gOSrn`3Z**U zZ^HGp#|6L|Wj%iQzA-NSuyuku%8u*J5(@@581M58Ifz(jvoD~A9@sMurj;{IfZutO zMYwx;cvmP)Kzl9-B409qE!&9a)r4Ne&^53Vms@RGa1w~))&5!bCD}FZQJ`SI{ZbRU zOLxnUxVs}GbV)vhUP`mT!HYl*Etn~w(FC?a(Y;?A_5tz*phq@A? znEbR~t-gstJjK4JNytK0zo~DGJe`Alr}ogI_i$F1lf}`<@Xf3Ik0!o~qvX1))LXBn zJ9FX@BWVA3{tw<87Br@;PX8oDNXt__FJVI%ITCKz)_ad?vGK{?v`)82yUgtO3 zfKXf&SJb95SxvJW8I6k&-KUVFg%DK%HdVkp_y9PuxChi;?-lKgJeUGQ72IO9SdrrL zwi|82M$5q$B1@!7zU~iLZEjwx%!t)o;^vx(bt2*>q1+Kd=kHcug|+n3oE|zhe()s* z&)WS~!}VFWON*HDw0~n+5-ern^^0aJOS;d_XWX#y{4sd`<`+{UHreaDete-JPuAm+ zR^x&Ok?-Q}RrboHL9|ooH5}$ABnkw50d80lqSvJyt=^@!_XS>(oYS)3Q@{Lpf+KS1 zrYheku5rTJG z@#&t=V}*NAI1lG3DJp8H%KU_GgdnGMZOiQS5g8a`Pxj`kx8z$!cBu?U=c~;79$z<{ug9)12nkK&6)5=; ze9EqNE+kfL^CH!B*1`is@Q=?u0wjpPQZChn4OAOFCQtY%_W`K4ScP7z)eGVu^yXO- z(xZpB>y|o(!WaHrs0MvfW&t9?Dn#jXe7P~6~@*<#I-fu z&UoNmTZP<+q@*wxekylxXH_U%KT>($adCB*lyB604=kJF(K$&jgl=B8-DH5MN&=;P zYI&SV{{39)mjD}qksZ?W0_{FU~^TJ3W^UF#Gim7=&9;_0Qd6(`>4Wc2lL@bKF0 z7)&&K>-EEFy!))x)+4gGvK}L-xX@rQY>I?ZinZ;b%<<@9<8Hc^>YcjuzPpJ^$zXhd zou1p%yUA!c?MICVTZ4Oo-}`>>Omft<+TVS>i~#)^hpOX>y1(xe{ktSj5;A-7h-1YP z<;jdW)?$A59}h2Qtu+Z?uNZwfjV=F= zGbH5+X{kY+=JI+#>9U&AM|8d?i>jfCPyBXj`Aedv0y^18DX_Xo!4Au5CH%3Y zdX%Q{yb`cMKGIwh;)@HNJc zVA|RRciRttXqivi6jOD`3;gi?aVKsV>b(&1uo$7l<7M{`wDS*y?q=rOe$9k(z8Ua z?M#pZW4b-la`QHG^Y^`^3 zwB0)FD)R=xO2YT*xIu(g4hW{L61_YKdJ(6MAYpFnGOA-+iFL{G+X7dzu)Af~#y$X! zQ;gB{9fci7l>Anp&qJ}?^oQVakvH^X8`lyroTeh5C5_rS#;Ml#W(|o-E=k2W{&?40 zYy9kWg@7^<1WUd1_9C>$mVEnPlIiZ)MPvev>gUZ$rLF$?W`dG|4;ISHi$4~BLdm;ssxa7|kuYUZMq9`|LpLLG z2`auQ5%=AU8YhgR;9uBEJUkd9oB7$}W7{I;t>i;rCl(KOEHOA^h` zks3Z@QwA&#JS?M4vApA2$j}NY?&A-^)V`87v&nMu4Zf97JmlE@mhod30wZy0HRFp1 z`ctW~XSb9hzv&jAr*d<)K#?#c?Xc$umXQ&swRx0~dt+Wf$nW|N+Cx9J$ZJ}W4~F62 z&>NyzMrlGBk7f{8mE5={$W=#8vbjogLrStAD-#edERfkX3$0zILZQ9ggOVpha+7CJ z$6UvG*Jd2$a!)DjBhqQ@#P93N1^jNlgE);loWh&x@Ei5|<++=A*8EpAYz_cqC_*O` z>e+u*oqBzFg{ArW*3tVeh(&n={Jd+^SYk&XmHu7zPcDm?+DD1FD}nT_Z1VOn^Xa+; z)QZwNem>;_A!w_KC8y|{Z}l{=S%u+q2Zb3Jp%m&qnf%6R>wb~~f9Y+$&ojRDo(^Yb ztQ^5>c=z#QbyH~gd1e9Y7Q9fcK1LonvGgGWP>u7Jq3Zkc^Xe-C6@j*a0eb$!MPAO6BD> zb;=4IR!aGtjNcO@f#kC|)Y}fHpFS0iOd`>uC4)DEOb@p1Wxzuh*inv_%D#B~i!ieO z9|+%0{XMdoV!Pq{hEqP>gU|ZbG-cJr%?&O!cC`}?2T^XqclXZxAKH3K<3E#jl}5D2 zIIhPjkTo~H9xR4p=mAd;Tm3CUlGYFv|3H*>CaiT+1PPlIc_|_b{N5Uf7TYmG=bg9Z za;Vm3@5k)xpQ2G|a}!tG=rl+n<%7o@kIKb(o`Cn86ahj70^8vh2}>3{ahnd_S2TLy zVpun96IZ)E_K_OmE4SaJE<|W#mZ9ao9h=Z%4qPLTBU%+VvvKSN=T?~#A?b<>L6>N! zd+5QSZEInMmNTN|-_{!|GN-dQD)=pfF`rzd29H!!6xjr0r4&<$Xa6^(xSJ z`t7qX3^p&MUXy00Mw@}piw|#u#LipoON`gv_}funQDZ)lYy@qsM(8RozP^40=Bl_&e;vYX}6gV3oqJi(;)s|*PAG}A9j!@(qP#y^LI z1otL%UR@XabYIj@J*HkSmzS*SHW7v!_8ZWJx}_zLiiReST2az)|0dXoKF6vKn1gq} z7!R$&oDf`nJ$QD(VlbYa`D*qD&6t0=SmrEg|NpP%$N$&NHt|LT4W+A2U$c&2!oT+` z-Qe*O!Xful-usx3EtPpFXu3{JWO|hJPS!>S2uhPyc|M{lC`kk$)aXtYKN9Ay2Ymwf zmnr|0xZ)AVtIP)`VGJjq=|psSp#8*x#36AXlflvERC~R@SrnJ6NtKFZ#bXN>z-6Ch z+g3#B|B8BuRX>LfR+j@UMJ{*PK4ug23l0Ff$o)jW5-fS#?a%M%-1YMx?ib5}RFuP|q3u!h59K+=Zb}VRMT# zMByj{Z4gaDxbH)N{?v&>{?D1?JVRg9G&TPlC!axaZwdj)A$NDrQ>Eax`>bSJmP~8B zrZMDf?NNf}T(#S{II@e>T(0JuT<-5N+$TeKYJMkm9x)#2g0TWB6EE-N|1#t!iY*u= ztPXrb8Y5TEc=8$%Q123+ii`ukpwbtyF zGQOc|%Gl;AZ&d*VgYwNnoD2jI)x8s$`y|HrHkeNa5=st)upl-Y@y|1xm|ovoSR({N zEMbLqYede~t;+5c4WU2G6#42le&!!UXIDB_B)1$aw20WQZF|RUs$q>doJ*X1{(Ab2 z{WT0vk8$08#E>wYe99t&>q&x>ZsRkw;o|TOxn#!@yLml5 z1?CqvMf@L<@&4TXIts07*$hmsMN0aIJoWu4O6t;DrH^(`Mf2R-hDOWVrsMp^tMObl z?bKJ>0!20)H=)OOJ{?Dj42Mm>0Y=a3Z8Xw1tsi@kSpvqolf^Y|RbMG7{=lOV@p7)l zc}MMJ2+oX@SEpF-lWY|+`zf!+VTH_!x|ja29++`hPMP1ajgPZb?fG@o;=&N5kMZuS zzjelwfgKZT+J*D%Uc;j{r^%gI>-hdo%ucI8*Q{1oJrB@N97BDr`(=6^7+Hb^juMib$@=}$!@4N^C9$sz6Y&V9u;N38%|gZ15LP?fgg+cDeupo`zqPgjs|@g8*D3@OYA>VrmXS_K;_ z6r`W`NjMO;(U4xMdMij$A3dI^Bd4Bi%(Z|EAYh0T?QDo##9 z2JR0Y4dM$$?Issy&r{>9TV_(_=humhQxF0b2}v>l1@?gj|trY(g?}qP1cj3F1%F>j0kID4Azf@yw%-{A$~Yn*#W ziF4-K5E-_#dcSqbxMNCjE}@lR|K^*h=}$(n!u*P_--P>ot|eE^D$KeOBu==!Wgjxl zQsf6VHwO18-?pE7HYVJ*)z+bBb-H0~%bGGM{<(V$6=p8;7HyW7O`xQG1Hl8B8f54h zT(#!|?^+Xzrmg*1M8rVLKkmIMbkE0Q`N69PX;I4qV6hi6FvQ$uo&dY%lFoz2(OqJ( zup@wIy!7sT6n3=R`^&8z^RYumi~3+1)HS^4=jKiZ*B(B2XK?^66kq{SgbA zY5OX>jjnL0-{i_K^PA{OT^1$P>e+H&_L%T?G=coQxE}d=&9L&)Z?#@M`yap}jv3eV zmV_cEkyOl<#ozh34(h>Z$jw{r#J;LZr!*NR(C7LkZSHKE}ngTITwMNcro(%vgbxcaME?6xqwTw`v~8H5u_g-()*g zv^KO=Ps)gI`2>w8EhHniX^GU(@KW6+>{?pgOHTb$RC zfS{gU1rInsAAL${82Sf3Ic(IPdu4CuVA`POg?D~5?cD{D4FyQWjUXd(#;{f|K{tJv`H1+3mX-bsykPD^>$2Xok)IL#ch=i`S~Hr5;M8Vw)V}91u-OVJ-!vM z^wDFB_3~mwx^Eyo#aOjix&6F2TtK^{_JV0f{V6Wnd#rW8c{P>k?V#qb3}Ia+(g>Ls zjflQ)&z1}fed2|3xqA3N%>kK1mVnL(J z@%@p}u&=HTz+0H1jm7A*lLrJzV`%|TP}?j@hLgn#tzTM8x0@;h<@Z)TioHE14r$b! z?Yshi4F1;d5yaSVKATnOSY;m_;Yxrm`#obTA@nSIxAqnCM=>w>_(Agi$&BNJF$dnu~Ul~PUbXYI_@fukoGzQY0+u6gdbX?GKAtM!I6!P2WAg&gzP#Pl4vEiB@wf$F&o zTX#vTl8~-FiY-va{d^u$1nwgb1c4ofT;(CPk4f^Z@Y>!xeur|@w8j9L6ClC|oKUBH-9zs*l>%K+mBIov;y#j++pS8S zS#hz#L-^c0yy5R&y+}+5@tXKnwE%&TZqt8%-N^QrWhjlQtEHsoKQEy1(ZRg$8*e+w z4%R^cY}BjFUb8vN6k#jbQ)Ww*Swg&wx^tcR#;$jlwu;Q?RzqvKAE5+iioMqtkAb4; z_n2?si+nKhov0Y|Px+99LLham`;--m&%dM+bhI`kQ&LZ}*gkrSm(7tS_;*zaz@Gf! zT)))Sry|E6+d(geeyTFv=#9(s$<{gFS&Hw2zs06t_K$Nb0C$)B+KDyvA(Qx<=fmqd z@ZUG+|McYsl?6I(lPBx3bBhokBA^NMR$~J68iS>+qf+|JO3_3oC+`SM?ulL1 ze^%345$Owl`K)8>IzQjI>o841x3%TH&SVg`{)n9*=SFmM^_$jj&=IJ?i-WIPT3cAC zD8cM&WXC<)yw-;E9T|Vz{l!;+Z%q26^t~jcdl7EB{kkHRvn6^w!jbE00YqS=-5P0Z))YnWIH|)hubetnz;srvUtF5z zoU;}TVEkqW8XP^|k;PQ{i2m&=lJHk*HcYNJ(^sSzwvOIv+&eExR+{oInMuw32O1q& zjjftH^keyQJ&Pa+CA*nO+%6~)g%EU1JPLHt5A*|OiPh|f=LU-J)7r+WH@#62MEU4%*m-6XioS)IYoC&L2`QCK+#=vQG5sX)SR=pe~kFtk# z2a&=EmY0?8qv0PdaL|C*8^XCb=ZKV~l&lJghF1ovdZs+h<8l0s)Y|E4E##OsUZ;QP zH$=Yj_@Mt2m##evMSvFo;ltB zedgxmq<5?d12&I};ph3z=pXAm zrf#R3`GM!8Q_3xw81(pC3siPvMQXDS`-i-*_g^c` zj1xslb4<2Zn=@K6SeUhi1axLk1nE43A_4%%v*}-F?S-++KIjFz9r7P2o2}yt&8Va6 zAL#A{kRx#fM0@RHE8s{nsU53Drs)=yhF2?<(`<3Tyw>8`?aq4XJ)uNCFc~A>5utQ; zYor?{jPr_Rg!(>gu=4y?R47WIgHXgVw{`Hd2nE(%vL&jN0lWl+yRORi7#`S0Z!xm- z#8urulL?j^K3I-edD1b%&$mf>%8$Bvn9!g7h!~>Z24R`llQ>5#`s3N&d!9^tP)K22 zm&FK|kGa)6HUKH{0?+zH#&k{R26!CHj1EmnJ&ulAFl!R!)fvsCA$6Zr3%Ng#r;{BJ7=!&YR8|}eHnwmrnpZ5%wVEhl03_UPIV)%2h8N- zOHLI*Fvh!yx`h|%N(s}SQ|#SF#+=25fzRbDg=kvFOz%{z9qrY ziKh?l)DJ&6T0%!q!!SLKnxwy}cUi?72SttNH<vP-94R5kMIi7!St>=be#jn?g>N{ehJw;eu2byF3hn)M%x9PumOQ*qFYqq+En}66arhVO_^t4>5KM*~}(D20y%e z_Un+MJ0kzd;Ee?EGnABh=KHkisU1}(p_C#+Ws9$!XAW&jiFYtbv$wp4NO>dRX7?2$ z;1aUKBxovn+`}x(RiUF3#NNF(;Cc1(fkDj4p{?ej))?mPyVG}xYEpg~K{^ZB;eH9i zrnn}LVjak|=|%OHz2xi>RM$+g_vkgBIL1vs;^bt>c3#ly)^)ItR-cvm^P$vP_E_Qc zOT&MlXn3`Y&_lX=j>Hok9B8IBkSij);&_3|<`}A!)QMw(gMtwLM_?(JX$pv0_hocqk z_!|he5sJJfB=$*qXDEW=5tlRymUV3kUyuEMTj~5^8Tuv$W_8%P93k@zS>74?u%EM3A$W9 z=qcyA-<3`t{!onnm20Llv-F8Irdm_Iyxs||oNOfFI!j;hn`f1zUp9g#=lXc7ndLRXAk)PDw%a&Ug`$jx#nR4vOp#o>2~sL3!2hF z{#dJBj}$Vr!2X8@>6SwiE$B`k@i;;_TyRc~QWXad7{z-rYN^lTebLv=AD`x5lBV5y zVAf5Xh^qkqRD1b9kjejOylNrGgkPP>K_B-Yq3jbFxNI-LF>uyDqd8>{0Xb_^^^Y7m z&e#wVH#n=*^+qVjgYNkNios766FSKNl<=}{9Tf5?1qW3%a{U1m`t%zE+N{W~D={pz zCzbia0FN)SMQLv0dpU$I5D}_4QDN%Z+0-vaQwpGrjsu{q={?O3Ic5?SDsk^hiu#X_ z#|SqTLlN`g?qQa;ppPPeem#Cwt^6UGaYnt*(eTvwYgY|kb0ZEGG5CQ1sD5?R)`;tk zAtvzmcvE7X@56^!Tn-M4uL`z)pPslRYEA=ZIbE@Aq;xA^G|UnxF#^Geia?0~YWppU zx+UBfRMGEb20wk%#ZlaoOwO?3TwYs!XEV_9_s@#v>*0h$h|D+#Qp}gc_)t()TbaEe z;;_r@8A^z76bMH&>a(^M_}%j*l8I~7AH=6poOA3u-~BelKhs*><0Uh|cx+Wdp;6=u0ye!UWdfp@6V10@KXn9Z88rzDBi|tUDivc5TuAI)}N4TA@JHM+v~Y` z(H`4K^J%QnGWM_p<7J9-q{^T_$6#V61HF8+aEI^C?tNkX8t*<3d zGjZx3aBaCmHa2j#s)^-?#I{8S3W`y7!bMbs{n)?vM#zwhi9E;aM6k2MB^^h{<-&^W zbP1@qRcrP81c8pI24VwZhDCn6lNtOkEgq=$y6o<*R#gFUrI8We?tH2 z0==E+!}Vy1aWVUqLd73%A)Ti@jX>dUA6JR*U-R7LIH4F3 zs&+#g;v`JYnW2nH>CyG z|AGc_pq!qnQ9M$r+!@3HpYv#RCUB5SOy4*bgiCMjWwSWI|+?ue~Ya(iox9n z#bpKBs}XV|e`zXum5IDmLz8O;B+ju83_8fSZMgVFrm6F7^{tDf-zW|9x{{_se(j4o zJ~R}6z~9LzXVR=%mwu3}-!mn1`Uk4>rJ;Q)QEK zbJeZk87wUhPjXB>D`4x_X4|?dU!^;@{`zsM(o!(qL}3!bKYocRJj6JiHm2boX-tf7 z%)GGk2w6Uu=(8+bs95Pdn-1Pvu;}Z=)o;b8=$XU6w2&s3EcmWQ(a9p^e)revG8d z8)|TCFCZBuA+?mPC%#%uWQkw*wYunU+i#y z9RujYy)S1QGglPOj>j0^+-ix5`h|tZ(c0PMVuZOY8}pTjW+8l5jd77!It^2fXICRF z;hN+S(cXpiEAuNxaEw7x$gZrr@L`NIu1~ER0wda?mPzl^M}5kl(r0lRhTcLcbMbZa zdc?9+7w;E9?3p6Q@0~P5ylR#&vhkAvd*w*UL5WI%n|Q^xnYpdeBh!4*QL~-hJ?CoH zHlZYMPC|x|I!s)fziMkC-QK(p2Cv#WPe>R$hruv;bcN3KSoux1Rn~KO*zPpf=_%)C zy+=4;${LnNixs6}kyV-seSk?f8_n4Q&7o&jKTu+xG@;QN%L#P;meTaFtm{21G~$_BT&_M&n7&9c6!M zm+%)h!K|!3)pS|OTp4yYbG?mn{*__KTBE4|Av0#dlv<;vUKdbKw$}7#-AbqJnN~99 z>BWc8;`)RyNgc+=lo<3oyeU}uiceKD#9KrtPBQB4dcxNo` z$uj~MKfm=L{u9AV1%zrG*=T~{yBhjS1{aEa^JI~tgMQaqJuD32y2(8{o@obuHS&Xy zo-fQxqO~#=O8HLIf&Kn*i0Y4p!<$X|i}rG4!10Et-86zqg9S-1{tq-Smm^=HAw>i4 z?YJYZzB?m-j5d&@$$Uin1;W^r9(eGu1MLRkWqEoo^8HQ9`Y($=rj#v^_duGyj*D0H zivLMZ04)^3+(Bb~0-Ug=$xP)iBzX^&6dm#}`~%8h_cKoj!`p{g`uu(BPdYwae3N5_ zvaAS?=d7e%y-HP{=EMuFbj*>Saa6}3NGoM#YVD|2chO2rG%=ko-SOipeNm3^5<|*; zOw)U2ScPsWjrw{7D4E1S+B@Vquy2AT!~&{&vMh4HhlcK ziysU_wYQRZ0`+#vayEcYrMXtwZbVoX?DHh#o&<&i1H41#Wj25v!A{=Oo}?G?Vh`u_ zvvGB)V$$v7u%x7#*OHK)?QdJ3ZHprmVdlKZlEW6J?t} z;n(cg#jK4Bl!ZpzeKVXJ_FhTk=|Uew_3aw(G(Ww3jnu# z{mXto(Hx=c`fAFTz63l~>*~GJkXP$R=2;5v&VH_?*NErf97cKbFd>Bpefs2{>PqcI z1$qp1{ObU=>OT`2rFOl}<8d=U*Gh?UAK{nKq&3`nx+Wzg%Qwi#+11@E1&v*sYtz!0 z;pA_TYw7s$;j;q9(#%!fcv@%jO8gP^lB3+1SPNT<4b#}X$yY3_YqF0?x?Y$S$F3b@ zbUWhoYt}0}b^Emme}KyDPs4OO_)RXDz+lL#;kO4-U~V{d&+V8mX@*2zEzmyy<~t8r z=tmY;|B+0kOR#oHd^Z*LO->poUmP5;bx~E_IaRTWKlMj}Ugmk6x&m~#v?pb-s4}CK|Pze0L;hVlo34Gu`9Na>@T@_S`iv%DPIP{~^DLuC>3)G1aP6 zGS!`~DTRfjeT9-1z9m~*uxp@-$y<59BFprSFTN+veBX{CBMC0UNDir=xKyKF>DjC% zKS-1N9yAf(Fz+E^`aNd(FUIz6vvVXnR&e2ya9oZ60@PIEPAX&tO*i=mOAoLN7Y*Vi%lJiod5cQSO<6j;3;_!o6JR&jI~{hX`2*)8#6&%o z{ncZKF+oT7y}zvq_0M0PxJ>GCuL(wdooCWEgI@N%0>;(3d*=ofIBPT}NT8*f@*D3> zm47%@vGfcU0Px*XWXhp9w-d-AD!I~O8aRN}fmEY;T8-I97||qzx5=EEsUB>ihVXHi_xPhq;mfk)q!*SWUl3!j)Y)HX3)G{j zD0}MOAi*h*C~PX+lB%lV1R4!tr$9wo42SdU7d24|vlFGX78SAX8$k))lDVFn64C@# z%M4Z&T%&HI5@p=cYcP39K*miD_ICVU?Dc0w|0qrICmb-Tg_b>@_*}{ZOf1+*8_Q#` zZuadRtRH?~@4RC*LZ~}DX)(7L6SMWLzBSkyjoCb&2W>v`k~T=cqW$&KvXQXB}JT&ccd zYMvj^fu!`)Pf3xSSH@h6mT9Zqt0K=&YjV)_Sbl|`nWrvv-~I|}yrWGjDj;FJFk zMB_Iza~Qz!#z#+)9)zD^M6gC*sYLXWT1<5Udw{ZvuZK>+*i@r=TA+l!rYWXjfLdsE z55xBqYEaUryxdSxQpoMK_^VxVQe0dd>g~_}+Hi#-2`}Np`|O%^&!Li5d|TI2lt4=V zMkLdwO|H`h;rv78EOBsAMZ;sqQ&JI5$4D4neWL?CFoIDuV(*F9n>XlnI<9jc3^h0w zm#zL|lcqh-H0K#8#jTHoxwc{jBbf*)+ERWqe7qr~c64 zaMRGe#bdIx>RRl(XDca({;>Qx+ciz+K(#mX^nZ0jOAIgnF4;bh^JHkO4!PxlnVTAt zYcMRIEoHfA6Ykr=C;U?$AqO3H=ZmH+_akg?tZ7c12#@L>$&xp4cM8jd5AsLpAn3!lJs zm)JPs$qb-q%9c19bUPaKLu1}yZR%#FO+PO>Rt2Ae+_QVU_)J1+79~Qzr-*QzoOBLa zvX{qI5~SAKDFRq5pq9deTAwhFrlwx+jaQ9S-5h!1@w}kbeocuQVrb!x zVjt*Mkf!Gxw(yG<5V1LVfW31=c9i>}egl;waI!5d0IHq>*!{CAz0J(f;TSRFI<1$# zlJ<<7Ko+mfPZC0|OPq$cg)H3*0ogm^s?DwMRq!TLy3OTFtDctwj9K}sKT#jHLZ@E^ zkH}nbb6W(w?!VTUARyHA*KO}(@oJk^)N-BAU0A5^S?IhCk8qhRP1ee55J5wf9*Gr~ z=`tJ~#tLo5rr(_5)OSC%sEJns(Q2Qs<&JL{t$pEM>s^I5v^MS?>oS6F%$_Df*Hvwc zDrP?mlwCY#?;9e6&vK9hiU>R#W2JAdvBK+@hdQy6$?h8}bu~+N2EPX%PL8)R8LLEC z4pJW2Oayl@XDciNLwCW@CcTj#qRyhud1a&G$u|e=JdIaKf?R9%gd_R z{<3JSKo;z>#jBG4>=@j%IaZ)#f40_-7)p!tFbW|s0+OzVs^t*<)usD>tnE`9u`)Fn zseVcIYC(k6;25D1O8XjY0dnt&poC3Fa>J?36vK2KFOA(E$dmeCgI$lFoyZhg9u%yQ zJFJ_(Utu&4j}(tuqV4l|JxSjBLuExvGP^3YwIOrd1TZs?nB7SV3wJt>EyJCcts}3= z)%OSeUej-W63^}-Upo)>$@;52hc;j>@~}LLP4m3I@mPBAy!ve;;#GvB-8`?ISJ7*} zi$RL)99p}B>2F&e)ob_rkzb4+pJ$!xMbyKHkA%i1`kS?VFP5w*XkyAUE?kEyOo{kc ziI8DwM{lR}SEEJHilp$cIzThS8oS30%ym24-dKH9M8AZx7rpxFTiTH;R|7_W_0oad zcw=B6y!kBGyZeSBz*0&EOYK8s)6_TeR_&avd{JmrLz2qIU&HVoUTNqVX#WYi#iKAd z#?c4XmnQKT^<09= z*~I|M&`x=)gYZz#gld`_O`<=ynEtW>_Cjj8hi03MR?Mm%C9;*tsPi*=#rTb_SDE<2 zj$^*WaMFyf%k4^Y5*Ri!i13b$9C0p28o0XpTm+0$eKqpZICMvqdz((4d3K=JCogf| zd=51_-gs9&Ciw-STHJDKXnF*wkCiei%){{4t@xXNA&vt4#&*({p4Q)IMlQlM4%K8t zb)XR@96#HpI%+&xKD!vt?)uzGlw5mdQ_7Ym4~o|R`bY|fa6pGcrCYG8x!`>Y4MmMFouP3JT&!gucr z<$$wDf73YbVa&R*)#cl{+5Gwx6@*&d`VBsCmRBNcN(_{(trbL>Z>b1)yg$B5FKlUP zenS;baPlcuHR#*;7j!V*iVG$;HR6t>Opz&7v#=;r6_}{N_&-R^{})=d=6_-KGOumW z#`p=p!u?F6@;VX~=(@4rZ&5ObcP$}f2{%j5632B7u>%eMFDlApEsr zJMSJS+AJ70uH^kW04ns=L%yMzr|#mNh1*xg9JDLa`rS#i4&H|T)nfab6Ry*7;mZx5 z%g1xZ`+4X(n9#(>TdA?3orgRH_L^eMXA$eF%y9*R5BI3BKo)n4_GYn~68ZS~%&mXY z7Xg)HEG1;UmcxX|8%|tT!n)KK)`p(ieduX=b0LU5a1hs@TIV;Ax=S!RfCxAET*kGCr>Q4+Wik0Sg=V$Tsb>L4GjdPRi%|MQa zxc6y`%Fpt!33^gAc|K3LMql6LXBImd76~ryvxJFr`{yI`b!Ljw$b-+Dq?(p_|AxVE zj=~2Sz8QKqleAZ6z&;1Cd2f_wN>?#QY&9-2V$YbtO~)#I;9WPX3_QyNZ1o-CA6PVI zyfBluXXm21*$U}x`lE{aqLIHx~NW#7g6;Su<#_MlO~g;V_dJsZ>aSzNjE&;IIW2M&J>ME)OTO2 z_w;TjL3q{HEa}ag3w}a%3-q6rfUFU@bEPWv6l?JKLXm!x!|4k#V``=P$-0FKhiM1b z*tUgR7GTGGzh3SbWZ4G)zG(OCHM2=f?2lWzdK@k`Hz4&baqD!cG}`b#D+ z5XZ|`vNoJ~;5?`*cLH_Gc~|>i*L!=$vB@ViCjDolika%-K5dqJdV+%YTUm=d2 zhn9Pv*TLT*2KiIP%{?1sl^}udZqJ<~&+`AiD&CZFeAW}nltPzTi=4O4wV6wM@q;!d z5fwGUb9l0x7I4ij_S;}>Uixw-y>-eY`+TtPd_I(AGC;o6&TVCY-GqEGSHW`Rbg$k7 z0R$$BD?3GbHj8YIC-Zumnjf;>rg=~3I^BwRo|{H)nb!1edK;<>R*(Kcn?|J_1aNOa z2niU)-)Egle{FQVB%Vi`P(Pe2wUi)1!3f7S3pFd1-LFsz;?5hk0cwu+G(w7KQpW>+ z+eGrfEp1kaAHaDj!kz#IWZh7KoJssMYc_PYwziKjH&peF}Q&jqx^^D#b5t8JEp3zF(V(`-j|Yt;%eLr_l_fb&P99&#`0kS zkYc10=8N2dEa`~Ji_yP%dAT#OSgXX|%2txP z>j{%*C!?X)qpQpKG(o4s{yG;uf$`yJ)T75vUv^Wk2UE1U`bCz(OZC|&soQkuc>H%{ zRJ>RZnknYBnzrCn*P||jy{eYTQYAtZmaNaPD)cVfFDifF9$}eF{@4a*mrR6Mu0`cK z;^KM)=4xazrX{C+KloO#S-c&-G=7o+)7)0-1vKPB#TO&Wz0!Fa6VVD#fsD3q&wHTCzU3X)<`jiu{23l=uce-@%`)Nf@vqbt! zWB;o=TN7J>2K($9D9{G3e=-E^ic%+;-}iTA6ZYvpNX&focLvP200h3UnL!}p(|So} z9_8NRwl?3!DN)v1LGqnO^0ueZ*}QO*pT0QavK%T`VJrBdrozf+rK*<>C(;ZXeNUB8 zbQyF5)Ufv}rQX=>@RmPFR8R9WPFEi^eC1532E#;&Pne>|v)9*{FX(*8Q!q@GeDD)p&pf1YN zz5;UeN0Fzzd(l$Yxyw-*;$-MVKbywQAzdDM&H5Sk8ue{#qrFV%`(UB+ZIayY^x*^= zQAnDaBuLoPOloS|g;y9wf+K>3cV-jvVqk)PD0w8$pMKh+l4J*1R@W<@b$?M%L-KG! zeBid~5?c zl?g=AIgOT2NO<}lj8&H_auKHF{WjhV)uF4DCMtLrQl@|68tLsL? zL^n5Xc9p&f`F)%8Gx=|2KJN+(e%Cp{mV&Spkz`D>@5U1%wb^FSIdaYHEMZntE|xC0 z$5banY6S|O?3hgHkB$Z{0DDs(lZ)&?sil4jp5`_`hUJ_o8g4s1sp@xnA{i#>;g)o| zqFmif>=iUTcg})}DP(YeH)k%!#$O%#y2ea8h4LFowsYNxDm;wEa1eBqLPd1CL`7PW zI=k%2sB3odLI^1usgGJQtvi)K;>~1KQ1|5fpsr&n-ngp*s6F?--ejrz$H}8oS~r)v zNIBBRbobH`_s-eIkws;B5Gh|1AYG5m>^XJJ0e)JoDls%#P(fpOOVxa!y zm#OlUSr)fVh!FH>;pL{X1CA&nUoOF->tuO~c%*oQm$WHf5bZa)l1lq+fwf=##j3&u5qq&qQ{j z_(;#pU{SyPC-kXsdl*~c;6S))LQ6)ujq)n|&6Se4GzJW&|2BvJ$B_X`fB%E^N@%mB z#X8%EGHB{M3MbFN&wWC4cay4Ce3==N<+-ZXdy)vWbneo(c?vhG(lNgYqt?MM<~7BkaIVVN2=wbcEk$`e~hT5jnc zWimK3N?b)~#dhEg!u_{AM8Wd2yA^k%(~3~X7B{o-a0cl#o!qGjpKu93AIe09($#w`dtga4kHB(4wLqTLzNjZCQ`jl5091 z{`YhKH$V|gnXZ$@lYjfz!q_cfQ7NyPw^w@yO2N*u$zsHnKHfZ6*tsY-2fpTprqaDt zISmU}DxI{zj_|{CE2|QrCjRLnIb~gOP@3lCVU0Iq^)!vHiCtfz#P4hV0ol_wIi;v0 zN0&2{EapFbI|@Y*55+mmo|cTLCNPHOwcapUetug5A7%w1HZcjE&{fBQs>hQkix{2f zV>X*SS=2!FYE?|5w&vBRUor^JZtYalq2i=rl-{f1yH*fi6~@#? z+J?H|W0;cnuh|dgYUPnU82mjWr){!UbsdiGSQervC6ZHmar3VW=jcJW|HGloSU74beOrj{34#m$zShRN1y)PZTQ=*gM)2LHIb5R zd6mH~RJ;ztYztD~(=q9WdaF-XNA46!QLU<%==s(j-W_+~kWF4axk&@O7y+4Nl*P%a zt;{&5@v*qN*5DaS~T{LsVlATASTkz*2OUz(q61>Z8=(5^&U=>BK zuj=@&1j%IebH>gU{6AfaJM8kal@csFPq+gP-F|lx=zdnxVkO?ucw2_UBW&$3iH5Z( z&b?VBo8UUbNomI>D80*Ai|wu-%7lx}j|L6zh#$hbjKVNqslC*nr2Io8$0sJ{php*x z@HIbn<3-uEyei)^@$O<%3Uldm{X0MYVr_oK?Xhos3AqTZNlaY!^B57Mx9);M604v5 z2*;=8O-%o2`BmlY-N7LXHRP^IB1OCXzVD7es%l!FW@e(nPlR6*ws(%^GPRtyHccR?_3+ZA>?T#!dFZ!$`Ho%EpI?;Agy8UtBVtQ`2vim!;o?Cp)ej3Stc+R zXuo)EQCp3=ASWh$dQb8Ee6<|SSJ z7M`y7Jv6bh^|%gBXkP2Ju97e2t-X#4pblpDvIXz}>ck`4t}A{nn9zBHmnR;BATgCa z0uBCo31Kq1(|u|)#@=T6O}f}02Px)28D54JZ>uXxPK+z-jMCvqHb4-r85jHxtv)R# zm`oousk^+aSK|8qll;L5mme3a4EafAsrZj~E$Z9~K+Vt;Jk@T&(h5UsiUfy<6q0KHqiSQbIM<;cI ziYt{=DakstFzr2b%5&}P-G6{b#HS&PRs0r-1WAiJ%!k8tUHz+lrsloGQ4_YrHSa@^ z<%T6pgsdh%Ihgu^_2`A$JeU zVsW zdUdVcgnZ4z_f3L)dPn7aOr0cOm9}jBJ4x6zZo0UbSrdtw1j*$YfUd#+1E?+`Pxv@I z>aI<0lYRzAiw`B*#AdnKP7&4v^AmG?X}7(#l4-o-Y60M8FqsM<1k{%#`#V20@=$`*vUV!WF2BBcal(uSr;m_BnTcd@AdXou$4ykoBpM@`SyhdXL{l~3xv76A z2L$-xs(>O2lP9fBd4+3fVQNpgXMwqiU?WFK#vwA2Y$IW9GzPo)=j`N?wAwq`-m>%W z*p8Rk7nbXXor>T!H<6NiA=ekAhsVg=pdbpA!0&8aU75sF%|cA~=)d%Q>@9?aNZTJR zt!gtmN~(_~yMYYa83k^S|2FaqBDE0o%o=Z{siW#L5pr_Ag_mqW)J057nU-5VbFJU( zy|%>tyBh67ZR08BXnT1RU4+bmaONld2cB`0BqO={B#j+YiRT}4+3qWAdYEf3-T1kD z$a4(`%np$21mw9fKoiqczMh1+<(Ait$LX_zix0`4R_H!$y5zidRA%HSC*r#os=miy zFT2=!M-s*3?!todw2zT2y8xri6I#x+O4Rb;6cH^nqos+pxa1%55n27R_4XU7*1x^~+{Sg6x$e zd?e?Zywyi*bF`Jl!;d+OK#}FN7|ea zrKLO=HxLr$5{}?p)A%NY?b<=ga1p_{*=DKz`4iG*neXe)JGo%@dA)C(Z_WKv+C-9+ zS9C4G4DiMAg`65b9^x)NJ;aZL945gA2~yhS1js=$UxC#pMs33pnODbi=p_B(Jf zza!gOM_8@(Z(*C(J7Bw2H)}Z+EH;}1>eXVPF_E(wO3ZMSW`FqnE}-}=3sqqbTqI8J zsXdjV1Ghz{g@WUSY%y*F>C-W?fq!l`8r%@>Yq^fwk5PTX^9;6aNgCPiE{B5TsqR$7 z6P)aCD&jl2syY|rh$AUXC9WzaL*L1Kiqvoue$?*pLMwBaBi54o*vEcWA>Fq^Xexi& z8>Wo`q}5vze8J(aGyVz?_m=*WY78qke+=es>U6Ko0Rt~yAT55WU!EGw11w!t zlL>nzL6cCvfVuhSazrLC^90m=&)}@sJGcm{ik=*OLxA^^7JF&uZYF$!jg2TNDYV>n zwW-eA`&Yb<8Ht%=tgJIY9R7x|8NHCK(td>Z*>9<`T7zyXctQmA$r3C@KEfQPmOF7O zzhi`QqRGqj=qSC=xm<&kvR$iECv9cQ4VzMbR98`ezmk2EYLsM}r(e^WVHf*;)S&oA z?B&yUNMmjAIk0f})g3#SZwQutCDfOsW2LJT1DZPG8+vE+`B@iMyfoLx%o-|4-rij^ zEr;B!@U)X4w*2^{14yitz09N_WzF}s;;#|Y&je0!Q9JSIwO*QV(T^3AYnCqemPZ?I z%Y%VP>Bw2*YEgWR6>_W$jcn5Y5$*nefZzY`{`sAUTZ%%mYYf|3k8rsV_JcV>*q9^G ztoDU}X!-h2L4n^}!%Iy;1nvJD$8Er<H_I7j%>{gh>n=I}M~$F8WHs^A;8N3{nJ= zCL88xVBxKS6lzn<|Nf};e<2Ye>H>J_9p)a!#ABL=JCEz7q=Hx(V?Ob< z(9U)kd(=fT9-0cBXj^L6{)XBrHkM^w2mf?6qqmGa<3TqniJPr&dA(Nc*7(EStL3cq zJX(tfVs$wR-g}=fVf3Misa{ciYcrzKJLBsAnDgi->Up8qTNQclh>6^Z#b z3e6?ozg($zG_Eu%&+MpjFLIs!Lh|r)Iqds_1aL}ucq1e4)c%xm5FiBw2+=>YvPAla zyT!kKAUp4)66@0(`v@4S&&7ep9Os$y{%l0v9SS)$l0PySP6S z6mEHZDofW$1cZeGsS`m2KmM158&c9<&%aNF96v;XCsrkrXZeDcyIn;jK~>jS&l)$S z)XtF!*A62d2bO?tb=sM{M~vvuJe3h$G`$P zcYl0$yj(|IyZPtw!11YKy{ZZ>shn6K8L0j-lpgP=;ieg zPycmFF3|MR3{<)OB}0y)6tQcyPO*n> zY{X^pU2BO&u1?Ky_M7PEpYp#aZ(goyI<;_3yD?TY2dY#CpU>QM@r20r^5E2f6-q?^ zn+wOk?ND0N_9g(g>%>mbQ{|02jK_hsHLy(Y0OrtIiH{MH*cC|;o|go5%q#Ow<5sKXm^k??r15WtBq*hP>Fe!k_7bm7?%r83G0-7+C{(s&Tr)AF5yeHa*+GI*aB~`2>R&;bG zD1kFbq+_3AD*BI`1xuL++JVwU`AKgBU+^+7V^>_dE2WKSM=L?YnLrx%VDGur_ zL~^o4plF~v!Rt+fKqwj`2Vg43HCd8Zv@59KgF--*(o`$U1??tV8F)sWOjl%Sl{N(EQ;T)kH~Hn%eW zlHgngD6QenhFqZPw5BGs<71jnUbue2%|mOQ00rKgzCvxo@!+Wnh#txn>DwP%y>2P1 zySlp)7x~VEvG)Pnw37-S{0i(zYsB9NbBjrF&_)H^a9l1E5@z+oS*~y!1HZRZJ1c>@ zgvP?j^0(90=9QzmI_T$~37QGnHtAd)^%G7Yyi6rSsuy&k#%x|w7pZDPxnkjmKd&C$ zZc|ZL&8B2>edp9K`2|dX-if5f%NkjM|>G>HJIfR?EBnfF6S}?po)^Z!Cba>O123=qe2nxWPALouHog4*6g6( zx<`&Gd>+e15O;~jgHeItlDR!xm|KyNBv@8`- z1H49hSpfX;A#Ao_?oG-3F=>FjFv}0f*e;Fv5qzB~GoLC0&!@2D!dqOmDAqAeBGGMDu5@0jVtzlQ|{#SAFE^WxyjP9;SQaJhr8lV3xOlZ@e(z zU^}@_^vl5%`vp!XTi8eaA0f3~5C-acPuqI+W`g-K|}QyGj( zD7HyPK_8!>_tqg^p(Y#TYx=P+wofA4hCCXp`Zt~y$Fc2k?gd9dw8qoE?bVz_)AM&1hx|y?P&SZU^50xewU!yrrKud z>pHxT0js~3-lCrt7+MPm*x~P=W9VGse;~*jEm;7k#lx5wwDD z5;w_wWk8(6$v|^sOl9+ktm=>JZP8ss^5fs^6c;r_6uI$}PTKH~!pF{Q36Or@S@7L5 zt{+v6`;Dqa|EwCnJYwupuBhovK*f9a27aFz>Fd0lS3mvLRywVu{__%#Sl^3>-6$60 zI1Yc@C}H499w=sCX0g!^El{2AU8}g&*jzQc%u!9G%q#6-u5aSgB8v*Ev-#$U9E42< zert<9B^f0$dp>*i0%jm95{((vg?y_i!cUv#=taz`N#_m87MBs9si}D9D5h#JWOz*M zcs=qSSP&#F;6)@*eq>sDtv)VG7N@`c4o!aYn3Cix&o?f5^{8n`@GIp2BdC+RJP+53<*JzSL~+!vl-RY&^= znWN71rf)(Coi;#D+Tjg$;oo0o5xqo!wKiie6}10w;jW%04dPl=`exLhta8y&>Z>%jMQ|~+CSec zp7jKym^Wsw)Q=I;XT}KRnxf{gKxv|7CiJ8*OQeGT<)E^Rvyl+YzaMQrgs+iK^SYp( zTa!l|h^jpwnSPtROYhL|up7z1WLA#%BM(p~yPE&)z#)!NNcJ>hfy=-2%yi;qp!=5e zkG#WJIsAl5*>E{?*`;A5%7G&KyvEVwV?0-KwY~tVOt@`WWCEM4nboGv@S zSYj22@`E!wMs|!JYel!FqfWo@V^`_t-Zg}pN@A^aBm+m>PO3-}Vx;g{Pph`D#D2}5 z*{a!eJU=D1D5*ZBgEJ_*L8WGTr)vTp%S_&O)a6$LLknL{<|1jyf?rSc5;*~|re1zSAH3JbmemdMxu9vj?wPAaF zX6PgmcumXevS5ul4>l3isQ_Hpua)vIZRyJk!+D1LkgzT!acpo0&SW&|8(Osj@&xDG1zLigxx=)aPZnCpVxQPt=jXiOchn8S~nxgw9^ zr65Ipwt^+M>OL$(TKek7aWjiGhj^oe5X;v6A@7*ooHZ~qIjS^^>y?77BAHKFjzoC%?@@tle12&l6i#oP0FtCwf|^RXQz zi^BPp?_cd{>QSIcG++HR{RVxSug86$-bB_>+Z6>m5<`pkmel17^jOxWmTdc^sm6@fe9B}CP1g5R(^<@Y(=Qo?4`D8;#(u?? zX}VD^!EE^>a#R2B5)bYCWh0o5G-FFc_%e^%NnB^-o!NBW=3y9pu+B~pW3X(zAac_5 z=3DWOLi?H*;vx*mPy1{h3$?*l6H#iW+dVW+sU+CynZoY-Q9c zr#OahZn!&0j*lWA#cf3TdSK5V`|E0_*R1q|v<7$fGOO1V)wGT0AdbCh$vyYJTAllM zHf-MYc@2RnbXvE`F&#s zxeXQFB%hqdG!&o7G4>bx{8f8lq(Md;ra{+ivvRJDAHmG}6m({jsN4-#v(XDr>9p$U zeSbamLEeKWL`Z12Q_1vC&hK~sc8mBQ#|r*u?-KSQHhL;|p=c@j-3-&^0Wj{2fOKrp zcrUC%*xez&U4hDkA5FE~Sxuhqb;72ZpP|5P%r`N8*ODazE0Jy!ap`#r8dDE+bh-+3 z>I~*tSI&HLx2Lu-V{X=RJq7)`2YehNM4c)b%)`6u1Jq|pfe{(zwQ3QKPCxTyqLl_F zHK%%@Iwl}UA|%}RIW7jEGK=^fn)(6N3%52c^Kf~>A;SHy2&SGgXz8{48Aofb?ajDj zy#;E3Cy5xIZX2$cav{Q7e@bG2<(`-GHXA1Cf#Sp?Cr_vyZmnSWR@t&Yd907>O^`iM zk!?D;9%~;Ccfz2o>h+iG*YG1d6KFDDpIBSL`;(G>r27^b9hfeK(F*u)v$$Bd_8$EW z-KeXbZuF)ArMOQ7V5L@LYauP-`;_KfJKZ{v%Zl-3U(_NNqr7)?TXd0`Gg~;?V^&t8 z+f3EFtoA{6eC@%veE-kE-Is`LIG^C_^Lq`7V$B!FG+!D+vYoQXVt98a`!SRsgr-e#rkdzs)1HOl_8O zgC)IpY~&zvKdcWZ-_EG>CqvX==R@GW;lt*ijd|@39lWqT(G#Rg4reBt_8?b?ClgHy z!pWxB>)2^f`LzR^46vr|x;k$B5)H{utLNWPGM#Vd6jnJTbpt_FjV&|puhsOp628)* z452^wJo(nQp)j4`zNK{cFt8n$wJ!O3AC}y_OnLhIndLcCRy219Qf7cf!hxz}u$a9C zHO#hIc4xFrFmc#ndFc$KnGc5luwQw4K6kZZ(vp{RMEL02d-APWnX|=0yyeo*DEo`_ zNA4)Noa6kd6B|?SGHaW%9v3#kgSzg6RJ;_AHeC=^x)b;_I8|_GukGsb>nq3!2T-87 zEIhR;m<+ptS-h)Xte_VxB(ImuH+v9h%DnHJn{#I+vicpjsqz+?vtb>wI9QMnl{I7! zRO8$!6|uB=Ts5*FuX`zPSJ`j8(i?mCUQjzhiRzm4yxqy&OIzM^ZH(ONI>y(29h37* zr2X6PAjiE-oT(N`dl4^b!IQfEkR$U~w9z5$nJf|vQ)c(lIY#=p3@;|W?RK3@CVkp# z?9I*dQOx=akrz;&t-W?YE3uG zZzxNj!UrBxtTCb)gw*4u&D>XCUlpo3Y8%fCD3_`3YN+8wY;fHY@EhM<`)?WSbo_V3 zD=Eq&&uLhBP8*3f_}*;AlpQ^x9*{n%XJ#2$=Q2@-N7Rh8QF~-J3m4GBf&}Yyb*d(i z_E!qa{lTX{!%vQ6A5TKt|!4_|iChN(^+D-j~oAc!nF`E}R%utSehnqR3{cq_`)NMDa!)dSSiZarYv~;+>NT zoaBQNc(e-4aJd5PsV_`}A5wzlK?H6aXL)T2-ODJ=!Q1)^{2UzfY@U(eRp-GhnaP+^ z6vR zKjb*G&*8jTLT-PNS-*OAReT+tbO;4}u?+i$H@qp6YU4^g+&jHCmTg`e4qRJUk~==m z&WJ^xV}o~D{0Nuf#vXR-N<%3Yu1)5z=#pu^%0y-r zysRCr5y86qfi7-5Joj{afBm9kT*;L$L8(>BNRAym?42r{#l>u}>cdd%k)<22OxF7( zdjU@4ACA<`1^sw=xi6v>6WT0Tf>4{bNftTk9(i5((^I&E278B2Xmu*dtJvsd?1}u+ zRI`}HJ7#X|?r;d^0{aUo<~NUTS#^s94PK-$oc-6%RJ0A}nX7%s)0+y8q5~!i~?B1-%*meHA z@}z$b+T)y-k^I3`p_p>XekoK<}FB$t$OVQ6J{4*36_{$ zc)Zq{5*7^awT9`F)v3H{1%u2@I@7`e0u?Nq(3n(_3()LN}Dv)u*0lyZIV) zhEMYxd-d5GI*c+zVr{gAoecp(kZi+H>Ji{u8>K5jv9w&&FwK7tX>m;cd?VxSt!a;B z?Uf%BR{p?SG(5%ru9lcSi7h&0JldL0uVm651aE_~`O#`x^INq@LJuG&&>q`Ywr8ag zMZcCtD}L!bM4VH}KVIAcBPca?Ux8IEEPi=Oan3ESB5HB-W55#5WPApA`~238So|MP z!b2l6+GlfN7L%7v1+|l9qm<(ttk^ss4id(_G>4$U@%s9FFi?dH*XteS9pqo$(OG&< zC3>%V(`wp?AHANC_CY+=lx4T6{y09$jwM|ZX~h=z(qkt?B%BR>bkkHgYla#4bIZrC zR*bf6757T37t`{>3Or0KbmmH8fod+#%$VOcMgpn6GR7?pwKX_DemvvxeU^zt$*Z90 zfG}?U8}NI)&*`W6x3eL%KB4;w9Z(ASDb^LXX?TlkVjL@yW2ZXpqr|xAbm}+DZwT@Qm zY^9uT)-ULCEZyfV$Ur(TTbGGi^I*EzV9I2HU4Qdjl@HMyKVgVRrcp3Sh(*4-LMM4B zyuL~=&&;TqYrC4x^t`xOxjVSa{6^Gd!xW6xG!}R5%&j^=LIDN9#~Hhga`|V^_I=g0 zTaw8MVoMz%(46RBC@q45;8m|nmVq7#qqe!L8=|Wfl##VXc>sS>Xh5GFIP78~u}hKV zCrWnkKnw-+Ju<)LT^XMbTMVURr-e9Pk?`fR)Sr(mclQkaOxByfAlGpfSL#izje@|% z@Rkh+IVs#^-S`*xB(d46_n0{RomrJJ!+r)GM0?z+iqxbja?U=ry}3}lvvh=kgT5X= z(HL7+jz})7Vs|9{>4N|f+V+yRv-fk$)TfDVuvg7firJs!kecM`@0WKX{rDO-YtqZ> z{91b4Y7(BBevt`w{W>``Z8>`mpMsAHR@!xZy!Z|lzA7~)u&nZUtyVG3XVdUdq_d@S zV?YU^eD{=?q*(4Zm3F%K=(6}*&Ut&MVb6%sp10#JH)g#e5up4AH&?Z{QZ$`0G>s;D(Jfj@$bgAPn=!X_My!SzL&>lG5nhiwGdBQOrFHwC2N?GJfPX zb!tlPYe%X>2J@S83InVV8&2P7NlEJtL>R-SF|MtD)h3H8L!&%7%J&yU#s}KNi|W4q zWlB5SKEr#L#vvkpX`WWT9MczuQp=_mJ|GBbp=QI$B&C=V}JI-88?qm4?j+MF`34N52;N0(eJqt-*7q5 zBoU#T&eDP;Qyxl+5WuQ~77lszjd?^aZb+ZmYA_hp8*&N`T75rvS%2m0cD;5C1yuKR zTgGdTY~WrZFL-$fWLJWsF6n5{Q~hI`2XX+ic+~(S1g6O2oHkXrwWR74*^qb45z|FU zB&tDtBtFtXEgFXP-8Z1zsx+;`AFq_7`gY6Pra($F=Cp~B)z@+EJcrZTVC3$HXJSLS zt3RQf55@8v=A#Wxrv$Dso)xaO5lusV3KquE+Di>uu0hG4wB3V?_I{)I7Y4J==Iq(W;%_(Z2>hluYfH!?c$GPq7=8eVBQ91w`qy zPwBW)REIwLcZ{8Vwt>s6mwWD#c=j&3xv>kK<*M$n9w-z~{2UUSHQVl)G|hFV+JWJF z6G8JnB`&5}DPh7leT)sz7am07cD>>j-P(e$hg<~nywA?B=>as8z-IOkaqGs6d=d{A zp@-%J1O5TfZ&Oi&5|v25uD%ZN?fpQ)58u5jw#g)kQIUmx3993|(J{lj4Fqu-G*`OU zuFPF6z4mE_W^XQ|jTfBp#qV9f6^PQlF8hRL=q`S{V|i#fm~Q4@)5m$mKcv%KZYOYj zf$e|>RH_jt{EUCyiU4sHWdG!09nBFpdDTnie%pcq5eO6bA(*;bSL5eBB%^sbqe!bd{V}CB$%}qdH zl23K%rxhva#q++Q%i9uJKp?qW!_>r7jj;Hw^qJf@XWhaDeN+Jrhf?aYsQGpF!5vze zyOldvMn0}j0arYR7_O+91#J~5Uts#G^#I5c27F0eJpxP*0Tys=o@o#h>Z%Lnez;ic zP#0`0lK&tLiXTy;&pdX#%0%hKdcEq(?{A2(&6mjsI~FL23BK($Q=T;AMiG)o!gema z&E_Eby8)#rYEn-9y{~rXdf=Eo=Er&2><%)s(T%hoc2Zo$yEU7$&>OfA{mC?ZJe&o1 z-StCC{O8i!?l7Sor_>>wKJus&25@EUq?b)8xEsT<-}*MuchpCi4=8&)IZPWG*6p7a zgh5)NYl~^23^i1yMF|LbHJm!V12JN#za7GwZJ_^Reb{;9erV;4L^29DvBALX#5Rb0 zp}>)w;iTIi*N~{m+n07cps?Zg8xw_B`s*>pg%*S3nqoRd;rE+d2KGngJ%b9ZriJ#wA{xn&jE#-)M?&7!Wn zipfopp2Ap~*R|r&vL6}LPBOI{-fp)wpE#{_i+{N~Ic(<7Ym#^LkWW2G4`M>Hm@1O! z%nMm_i{z*sb9ANObY@%?zEev}0GtIeFZgmYLLcyKpu1j2vr*m@Q&zuU6KtAmT#-m@ z)Rj3sF^1o5te16@83eNxnZ1{%?tH0;`49#<@_gKBT$#3ZpDPxbMtsf%&}U1A3QqF8 zKTrPtuCTk~F{9~bL1(rh%GwK3`!&`@ka+aF2Nr3~*FNV!@s;GkHuHsHgXmJpnU?O+ zgF^0-p2ZPHN(_qRTR)+@*=EUCN1R7u@Gp1A8!Aao7oJ%z8^6asgVeIP=naA0nDJ?s zQ&NL^r3KS(1Dm}P0}tum+euzgxyiT${A|(iI|~417qPbd(<0k&MGx#$CosX+lW}7Y z<8i)KONY?MyVb3;C;}pVGJvw-suZQv*={H*3L72|F^wMzkn=w&^&^Zbw-UJte=xe% zRuV6WvICKmV52+kE9~vE!j0sI>%6_9)gF||f$D)5uuADUZl$^~vEhq-SyhClr&~P0 zZXYgqU;Vj?J_ACJD_&1XaJ%6GpJHSwgAZqgRxZnI+{-|Ol_0erHa>YikAPm42Pz^g z%q^U)JRN-CQfMXAhG+k4T96lxf>6)K2f|=zaM+Y8J7L1EVlh7JF2O_f4iz(#(_r zB!uY(@I@~kZT>}jr&o%dD;iVV70qhnAK$K0P&FJF$*!%uvYKm^n68efhnLw#7Vu-g zYj+@K+O?{_4+J;B5q;WJ_@||B_l9bvpSQGn&LbTlkZ)%tzMbyFjz_p2WcY4~-LdG+ zR-zhq5~fpa2jr8vfZZ?j;1ttnkR{PaAzNwH>i3+OxL6L(Tlzo3?85)pYm}6pG1hTC z(7d+3vs=B8iu~a!wfW5N_v>5r$TDhw$fkzb(TU4LG`M{kf5H_`elMeza%{KhhTUrQ zT)0pCTwd&M=IT@;Hye>Ud()*JXHid@oBWZ&V%yk3{y+_`=(OW?>ji9^_7#Ek57htQ zuA%6R`oo{5)1%p3$JgX(Iu);r_L8X~{28Z1U3WH?$*Dt9%BS%kKj@qd7@T zwAQg%8~9lLxry}Otu2xOB24|f${SDmf|93Xl>^l{DEii3K6;SQ&CKKLBh(+fNf;Qb zrgMa22QU)^aZjV|@=r(FMUYc}pCt1qQg9(nc<7+d(^M+J`fG!>Ck<~6!$4?QV_1SyWJHbsaA}hF_(k9X*?=fiAU3aA>d^2-Equ zW7<$@W~XedV7@{D*|bnuC3k+&sITMvfG(_l(*LBnOZ8%><4*h0yNr2x*7rGi{ukSc zkH4X8GmMRAb5VH{_?sOC3&~69S}>_EH^M?xGm0RVn)(y7Lzj`$ovtra{kR{fsSkX* znj~ssRwEW$aC)@;@LRJ+!<=S^!63m;z8X7}q5K5X*+AEQ=>P6`;GOi~|1uRl(q#o- zzXW6R6C+F{X*H%t=z(ntZ)QW6;Cm^c+TyPX2P;vTt^x8POv&zhxW-o5R|W2LKnDWZ z8S*3a);;a5TDK>mK9aMnwgew{{@L^fXgYUl=}Y9b_o#WRE51=_F~}a~Wf`wxL*ruJ z3Zr_@5_cAv)wRsJWQmS^hpCu~SH>{Ee$b%?>XlJ5Ez*Uu*GBnf?tEqA0(>` z+1ZT#LbB+tFk7{oNAoPjdGR0_a(Hg!k;&`q&5N&^9-BLzxj8-3_RXh8u`Lj{V+==cLU=`o zC5$MAtNT$#IeApDD$FpRaRB9b<91HX^7rU!x8Ebs1%e_uO%gR=~ zTA8)kbH{Q3eg8T5wDQSj43nVVcf~v-TN*6tP%6nWpOd-?5^N;UEO#ceO*sR^OQ$C6mon#}b8WzR^=2*$ORK+VYCG?2T^}1b zNF=6$zg@l(=@cq2U2XWqb;9t=tm5R7kf-^GDpbt?Mxh;Xc)5a&s8ebl-~6Bu%U98R zi}8*+mgW-r{_Gce$6dMq&O%#~F?&vfuCma5>6#z8htZtYA76Pb8Ak#;le(Z$6?Z0T z^@shNZhI^%flNwYC2+NpRT-RjD-umjdNrn7%T`z^rIN$lJA*jr%3&F~X8Kq+t-sck zPLTfA6Nn^i)bx8$OM?lQml1(RXlozy@dcQyzM4HD;UbkWF;2~C>DxlKtvxO}Qthu% z=k5&i+~$ZPw(&^XT`1pCb!BxzAJ}OSJQQxJQvM>L1yHIV`L@`d;n_j|XQ&qKpF5+7 zmD;aDGUs+r6f$u!y-`z!UHLI8#e1e!l#7P>)k+Q@i=OHriN7ggYSR`Cx zgP6TO)sO9fW>Kc3+S_;8h8_&ISJp?PXwQxN(It+xlB&_lQ$_uWt&A5X$XY5@KIRMd z#GF8B{OC>3N+p9D8IPCBRu0OX!C?~Yxp(9yX| zsBv5jLcb_&BY>~?ch11gt+_ZkYBAn?PG1*a$)k|(5354{etfk(8B0iyt`CX4=uwu4On77YMGS(FP5(XG&j>LE>Ib%yBXR{r@jG_MPv^8x9vK_)E%C(mvOAyd~mU?{ZSBwJePvlJF3{E;xvR=U>kt3?c zp#9Y@FD^x4=l8K)8$P;}iW_^I6OLuSTE!$Rx--x)gAw3_^E&u#J`Er_Hp-G$brqXi zXXozQ0Anvj8^Q@gD*FM7+jx{NqEr7KtNWSTBP8ym`Y)uby)v|n=oQ6iq3RN$HI<4| zW&$oLfpCC1R=kYX$}ywIBhhLysR+YQN(x_o!NJu<(yN$7>-rol>G^0QxO(`3FG~7T zt~ZFF>1E&h(SZ%Y$Ye-ZgQ3V2+>yl=Qod4Q)R-$vbb@s-M+G{lndrD#vRccD9Dn z;g!NwcO#Q!{L4|pj|5mS#Mv+2#QX2cWmK~qMtiSb&oRIM~M`OjF>oyfKxdh$8S@Emf(c6mt?yi`N zJ!x%%q?s5nkQ?9yas%Zf+6EvH*2~Oh-pT!a@(um~)B4ZYIQB_J)u}f1qN2b=q(_xv zWNf`n9d(|w8usEDfPOrFN(`9#XLKuN0LZj-^gSS#6iko|tlpzZ;nw^xLw%x#M<;gA z7Ny&Fw6Ps}6(C*s^q)J9E>ZaFU8c&2b#)>WueVmx&=)Wb0C#Wa3JU&>!BxKYr!w_? ztF{Y^*!hrcY^wW-?ToJ+Fi}_X=Cf`6S}z(ieTH~B!y@-0Q}Ib=N9889El#^zk2+#S zrm1IV10n$_H!!;rJuA9>OWiT^WpFRNMyH3o{y1SE!Y3X8*Z;uIDOac ziE1b2{>;w5%%$y>Ko-jU5fa5fy4Q&{m+!Mj?C?vLih68^0)eq9!kxd6(8ac@re~%x z9{LBVrd~=73pX_o_yKk9^LiUz z$66V?;mB*nbAkR`^~hSx&1(vEy^69?z@hEk9Ibw0CZ))-Y6G$g24y`>>W-N6Z|ncU z-dje+@wM%qO|T>o2$tXwT!Onp2p-&my9Wr~XoukLkl^m_?oN>4!Rf}mfyUuKmFJxI zoM+BD^R9Q+%v$qhzBENwcXidSs$F~E_jO;tRL!JC`)Bv}UAC~p8fzk>&8{)%DNYsrbqH`T z84%Z4%|Nb**y!{vO_${F;!>Imwr7M3P~}jZ zU~?AH`5_YqfDoaWJ3lLD`)5a#h-v+;o7sz%<`jCk{!@J?L!{WiI4R#R4h-X~K8~kE z9@nX@%G47td(WaiTxz&<7fRI6CN~i!GXE#jjH+zMoPD?Lsm)G)0jV`)(yWswSk^+g zxGYit%-sP$j^Wpr)h?GFia3J(dc(WmyG%3aJjGd~t76+{e-P!Bs2L>MP7((C2Ndr7 zYxl`;h~f;b$jss=PC1JX~ZzwCV#LR4g-gM{DZ zZ{3(v=nHhBM zV>Y`$TU+bw7jFIRdJvVqZ~n`R?lvN_PMEgA=5Dw$)_&EqEqf?ViMeZ(&CMT3G~ei^Z8&gJ(s!~$20N(y zQ9V-zHNIG%!x%8LcMJWL&$yBHd5_4~=*WnW9+@XaX?TUTH#=RzB!(VdStB$K+xzL%pHqjo$5e51-zxx(XT zhHd3l6^Yl+Lcm3&;8vsi?XJO+19GH=s+`XV3f%JFWe%zgrd%@%D>LBmQzgwCNSxtP zdA*Gv#g-RZlI^^pVn&)^OH&Z_`#jJw$lOoUwn)2ks|>*(LvYi1^~y$AZ1V=CHDZIS z>75)=H-(amrc7|Vyp%Xf%I*EVN?t%c1$F-tYD}mrqQ28KNY7P`u}5oAjG{m?BED`N zL0d#yx%=AZEp!~yN@5-}E_gV`(`af-D<-Jjs${IP(jUq!LGb5RbJq9-h*9kipD^X< zj5urRUP2bOuJ$x+LkgsCAR5*RSWT3cC*b(YGa)(ZOxL9~qp)$rt07GzQ zo)g2?|SSN;q5)4%T3ifX5)%I;&C34xUWb_$gj?=;RcvCl?h~GzTM43zV{iJy=Q6tH2Bp*#1U)oPk2t2%eA zW(qHvA6?kj4zMN&lo=$Pe4tg#x*?$WT!HP*p>+$1vu%(qqv_m!k~&4bQMwnOJ7r@% z-E6u4WG*`8@n$tW;dUPTVSx%;z@ez=PDI`%xlYT{@1o6DS+$Doi~|`O+}b>$I7DA{ zx2eJVc@9ZAir6VGf?4`y!19*U!{Ic;x{B9wvUKm(k(7f#JF1)j|ma33XY zYKZ#sBL(;No8%6OG6%0H&#GW;tAS$^33^60`qkKJ&`oIe&2nE0&CW+y_2WjBJOFz+ zYyTh?k=l#s9bLIgR)4hXTrk74CJvOzTb9LsJhw)Uxe|0Qion6L5mC-uiMne%;K$p8pdHP>{tYo=J9JuO0Wv{v>P^1go@0?@_ch&E zc8I3vg)Fr|JKt5e%|6i^+FYsQC+{c*g$=$PL#>NmoFpj7YwyAq*1vk&FA{X7!paei z_I2H#hGHVxax3==qlu=Ky!tuiYv)(^nEmi<`kuRDOqn|&a%Q$oo5}ARSINq|%Gn}n z0ynZTFrV+L@wbbz`}djaqaC8LKT+vvji@zycI zYPo59@CYJkTOs@K#;@z_mp}oTsdnetn-(YA-$pmZBS@4my*+1zE-jnx& zS2 z6_k7o*`UiR+_S+Dr!sJnT0@LR@*os$+)Iev##}n{}7@CpVUF_!mdge!-O_e~zr%$05PGDl-qv z1bst|cGDK7UP*ghMPgCrw&d>?d}N?{8Q6XC75Ti&^EzoIJwOzA@{@}?`fz$d6(T!f zTd_lKVRIX?GgA(ZKH0FM#ZUJuta~DqAS((-jD1$xgO0wVk0%($Z#mTPNSmpBs<=UR zqla^>iE0{!wxVR{L{g(KsmJWtSwY(^9^N%`AhEuVJDi2+8asd`0&ZmFsGoezC}Ibk z*9rBWXtbC!n*{#F+>&0he%~NK^{RH1tfmT7qY3gAsI>YtY90vq`#M^#2 zQBQ9>RD1Y7af+?zf(p(eco)3JBM(Z1zodouVLTH6k4Fv8X!<&?*? zPnj|ID3jhH5^XnY?Nn!Cnbr(&P9Xi*c!t(-x;p!|ueM>Y%cb4FiEntt+X=FT+$G(; zPu&f5$d5fAA;Cp&65G@`P{NTZ z8;=*6qeTQ4ion0#oH>+ym$~C2XEJju&-lZBZSVVOG6RUGhg zt{ca}D?i3yJeKyr7rto@y&|<8A_H#~zP9RR_!x4Z9VLG_yjMdtXba~u8ERZ>skG`P zj;?^R5v?BBh>Y6cBrlV2EP|Kv$hg+(JqoLQ0bE5{;^RQxIiu|9h7rZ2hYLyL&*FHW z-w91lBl|1lYe`EAFfl9{o2!J<=T<3$5%s_K!{#MNhdWN3cy{-{yah-in1Sp<*eS^{U-aMf=dy)_O8JYs{sSd zSQ0TSLWclOz@X`HYHsF(?S9@Y^I*emr4I?z*Ahej)+-S;&v=o66!Czy`N2kxSLjcn z2S8?WttkY{&p7+D3}0+fcb>>R35DQ9HMkEi= zx+K*7d?Evvo(L6_)tABUTQtnSyc@W7XL&K?Lu=gfISFe=G(8;VN47fY4S#uevae&2 z`GT|zp_iNF>3kG1 z1gi%|uiM4!O=udMAl7L%=TIpD`X5DTF1f>rdzhDmPZSs~?(DPYTGF z)2>Dx^vUv1=$Gj!Vk_$mXYfA%X1%;+M}fx{{cbIJcuo**t8G`3Zt%E03%7qmCaFE= zy8cSvTyJTG0~~taEa3C>(U0f!<+EbIMAR5bIW4t2V<7j(FC(H?Yp>_TX&`w5uzmgA z|5MEC4qdXNioLD(!65)8J!!(*ZzoVRxT?Q{_yj7%;;8uHn%LVS7BjvDg~A8tZZ3)q zDjMWsT)VC`-vshI=M20!l2KJk*I151;A<|+yedDe1&0i_TAT%I)aZr6ny}aj(Me(! z=x??2!KWX5A$_%a%aJR+z1GrBEy2=aua#lp>UM?(kPR$*yHS@;0{C%KaK@XYs`BI% zUR$aamDnCI(Fqn)R-}&tkfYI+$^kntR(^~}WW*xKM5r-6A0e6Bp{xHx&p zu1qIGQntPJRsD)M+~IO1AEJAHigc5T{jy;vu5y63({jDdgjSD`64r!FSQ?d{s8?<9 zWvr7AZZ1j*m~L`E-)V`&=G{>VWXgS5eH?_m1WW`;Z>W$WP36#J?gztkL^ZC^$Gqul z{LkDHSM1(>l{pD@*s?e*x&bmgRIC8);|ma3HJz&WFmqShbL^7@;xcDwm|1ru+C1u4*^@dh+(!X7t#H+&-pY?w*KSEP-F94!R`2F&R%!zqKBL_#h|g#E{gZsBdv+1 z5Q>3q78keNAZg3%XzUoLKi6@SR4DROk&ZbcV*f3U)OK93XxF1{?~Sp;!k|~K(Z@08 zDIvvX-AmW4&F$|c_m-+d?h}k;PUNM5%LcicLgAjiU zlg@NjQdJh|l-^gYUq+kh%0lGq^K4I<`#3o@xqm)~gj`c>sUdqn8`4t@@o)!U-1GE~ zc4Iy?GiN<`<)2Z6b3bY;HB6ggrMS%o_8dL@ozPQ-~Iv`4_CcB^C84q`NS#Lq8uArELg z%O1C5LPW{iXXa0}<`V3;_lI9ye@{rr`jojgw>-<}VrVcN(bcgs1b6?*TCsuC;N!(8@^BQj%sc*Z%xfy3L6a`(-x z`Z8SbZd;Tt@`n5(o*n)q#-EQ)yRrUOAM7FdolI-cYR3Hi{7iq#&@T_<$x53i%K6iF zPnOPv99@0d!pG?m%HAxOJ#>+SmVJf`zRGz(n7vuf!yskQmKlTh`gbkWt^N1~{rrQY zSlD|bxwD-N*J=G7zPQA%Ma3|YwsdWyja6Jl42kHq?dw%ppOG|yT@X^1G3bGD)@es2 zqN53ty)|RY;qCb7M^CX~y&VJ9YBmr1-jo$$A$BqAab2aDpK8A-SGfG?++OY6=%tTx z%N%P(LHxXf2hyC5jAZvlq|3hUlUPm406AgxJa_SStYphC8lM4@lA&TIF~><#HN;>n z@yxcGU+imhnlx51^hL&OPwH#j%R4o3{f;dnEco>VDXFRgm#M%Fx~}*_F2|Y&22pBd zpFMQ+T$0~b!up75bkV|41HBdeTeXo-TMi(T1p@M{^6VZ8z?rI$-%)F5lp#AiVcdj= zgbEMmYgn1JED$|z4qcRyb4|Hnh`6&6SaaMq;lL&WF;BV&oz|nD7cf?Zy%_UkyD^S{ zelcBsq?YQ?%NCF_O3W$&1S^@uGdxu|;B0V&HtzCL|9x)I2+`0g$f^4}e?U6q=g%KyUqlVaZfv*ca6w5&#+M*>33(U8!Ey1^+Ou-D=7C*DG5aj_(WGm2ogFRUjG9d=J* zCl`SSDtPhAEtjR~`*IA^9#0*H+e#`aZHnt%w{A4>-C$M(BTGXRVO+_Q8R#`%u>j%Z zS4f6Rz~CA!$79k17nhM4$v2Bncjsaiv|8y#EHV~TDQX<<$wPdOR;7J#womr?TizpU)Cc_`tCSzEjMOpAxbzorG6mYUKz*ChdHu{zjhnh*zWUX-!c zy5OH5hFS8~vdz$~hb!5jtYMJH3KJ*`FI|hbnm-hoe{sOSdzZ{bu7SXJL^=5_*;}Bc z&2WY`#|B%4zYr~FRdVSMwiVqZ+Flt_&6RJt$Ge$eir0i`e8=~n=@8J$P0Bun^j$o4 zy8oUnOlbwife_`X6H!_zmfZm5KW51vETX>WZpB?5>WSjX#Pqi6$_J6z#}ZJZIITsL zEo$#M0V=u*2Mc&`z}h46L6ybXm49hcId1lF1FxA1HGR^g2JTjlqFH2T7s@ zn~TK_Ak2^9*?aMAEc*%sPtbw6YsQ?xAcd4{ieGF1q z(H+@&Z+6o|Na=ma&1dn|VRQ%UC;Zu6?;taoD?6eVn8Q>MQ-Vpa4fiHUYnNa?Gfd4hp*^aJM__4LfquQ%tjDS??$nPr)Ox*tku zY3WvY_a8mOM&z1awUQo(#PHZNVb|C#(T=Tr;0?oZ>O$^v?Dx}@KC@eY-5`s1RJ&;7 zM7rJ6jS#8zWqR!3ZpnT;UAQ}+*-|f)pG>+3s%?N}uZ(s^M@Lc|Oc`7h)jd#m38O)W zUK_39QX7!0hV5$^2+G+*P7s@cVa89r<@|GR>t?%88&h|)8TJnnGvh3h=P#PRtFM_FN z)esIW3}0;dh`xEjqRnW29QI_b9kCz8dF1WgWq$LWmQ0J43XcNjitXex`3=PaVClj(ZB$%f%J3AatcM=rpCV=h0bREP(Vj_!mI%@~o? z0kQhFTVf+@A0giYy-7$}9m!bNrX@`-0(b)4YB4mW`+VW@#3cltC!aMo{9u(p7jY=C zr0#tTIXuHlORj}1Af_%yFT_xLxQ*}{2IF54d|om6Bl{01IXlL|+MZ>RH_9lKoV2|? zbHU(u0B?>(Oe_R9AXXfKl2vJ&(bZp~wMcss;?4%@(EuKTLveRAksDRS(X0MSIIYD; zt*_3sLP~APY0?G+x9Hw{x#g(c45J3YsxbyW+B;~&w6m^kFzNFPu+|ZT6JBo65LMoF znd+4U`wEjm^QO&IxXF~_?JgMQ@64CYC1KCTAR zu$`i-G5=;zQ>_0%?y@=N3A?E)8->el*UE)h@C#S@C9T@Rf4bT&F1YKib}uiSWF|7w zSL<(y;!1K8qXPE${ffUS1!I**I~zi45ByNzhB;h|a^6-x1A*aK$~4h3L|fk(nPP2t zFHh(h3MyB}!`f|14^`!CHdnFsKEWI_c=2U2p8yrTkMPWCy%_PDj#2j?Ya-#}{1O4J z&5i+$(mvT9fU6}$G09WY z@WaQl`R7Jl-fd`X74o%Y`cu-(4XiJ(UzbGc^|KS~HF0H^RS3=_qk)`FamLS#v)#|_ z&DHkQ8cnIpX|&IHM4u+X(;41I%SMuKF*2; z&Vzgs<@t##Ne`I)W$~@t=|bE`D@E@*_v5>NK-v#IO6jh}M>3mHcv|xhs=&Ndv?5A1lDKd_{kBHKSZV{F&+v@(E(7g4K07OM;P}p3aNYcVM!Bg(JvQ zsfYy#z&%l|9t`&CmD$D0G6@DFHfl4{wSw--izS65qDc`G8Vwt6JrWE!cqK~!KeE0TL%nbqbe&9i^gliomjTSh1 z%*ngj#+j{}Y8lL9R;MhruUtL*27@J=#g4+1u7orkOdrcg?l?ET`{lbJ0Ks_HNoK^w z={Y(r{mGXuyolcqGF9LYzg;u5rINwMG%{3Hg)R%RGQzHf2j_NKujv}<13twMj?%B3 zkI#s3O}V1L*WxQ=lCQ7ZAj)@_q_*nYPuGrzPlTrps{$wOES`l+*crg68e0t=`LdFF zbEnO-h)`I_vp}D9KMn5-wWa4S{PaU2we|R7B8)`(Q(N)=bqI7j>Y#^t`G_cig6ScW zBNZ|bfl;=~*>@B>#ziyUVy1s4qw53LHoJ;z^NrqFrdp!xLpL72gtlKm2eUlAMdRm_ zYgbTk(KOY>x1G|xrtN9n>1hev-S6g;(3c9LBi%Jki-t)$~p^C8~6!UicTT~H(uAble{)Su!9MQMVt=R)>(7CY}tWPh@N$O z(Aju*8@0pNWeLO})6jPxw&KDnw$KM4VM0;6HAHlfkD#B41{Dd`ueT{wZEipM_AtdJ z#|lj&p^yi+>z?-LmK)O9b1uzq*0-=G1^fd-n^bd|eI`ZE^Xl`;t+Hh}O)!2q?aR;{ z4Xke0D%LFJg$FX|ScigQt=*wQZvO^eAMX*VE9G^L68Cgx?~aP@k&PVG=#5?MV}jgN z=D-%AU07JJpRsB78Ea6chPk#4y>%zQAY|ye`?^(2#6xYJFWz!DRaB9}ufuG2AkG=`_Tl{$}}0WlkQ= zh66e!g#*KmVttb&@X|_37g7mM>zxnFH?YPtkio;jV|5v!FGj&hPyuJjz_r8P{{w2M zviHfsv;RIKtk(iGuSKpq2KD2dB_iERL|{~oxaieRYtCZroFw>p)%MTe*Y{GNT~ ziEQ8dvrbX#gTF@9tyh{Tc|#^Py3W!#iIm_{p!o?FGsdQ0Qn8Jo#gT4Q*>c@4B1tnE z(;)8S9ia^AE=QL25Cn-ennmjTM~MUZSX7rROxLkvwht{KDh+m?#9P%`2hwvyj||Ro z`Iu!;qnEa^cI#)cH-?%Dg#xL#Unv&ILPdsPD(#(O^Dth{rJh1**q4N8EFoCJoqCi7 zMv3%e*G9w=|GwQ7P+>eZaieG1n8`f|AN8bc(+EsXA z*i{I?J*|~y>5&pQ&U_^Z($GWOJsRxS`-UwxJOf{g7NsU>y>>6I2Y96j<4D-s(=s4w z!bROrjsfS*!?kUyrQN=-)@o9EMkfM3-9I$+hhlhFNcO&smBfqqSs{xPY2_|@Dwd>H zGR|s6;_3OUc$?L-(?H~97WU=+I9G4=(t5XXhPks!=2v9`w&?o%3guqy0y_bFNvu*FuzU;$81GaD6W#bfmc296gj=vR zdxjsPG*URLms;|4?lMCP4yL8=q7t=V5%#7KbzkNx{QPWzP$?x42VsJQ)MUfn+mnV@ zMzU)LOW^D1_BJL902;H+mO{?PpM*49K{VK-4VTB9Lkc0IGsmV)lCxAWG2IF7c#k$J z?r9G^_30xwJGTJUMmea~8bKQ=PS)&P1lY8(Df;lmZDvy}Zrsrn4URc$ z-O~DKh;g>U8HOhx@>PInVl_OWjO?xos!i@5|y7(K+AesYuD+_*s=W(F89B?4Jt=eXOrMa)Mx#TXxLxh~caZ zs!v#cetcoMa&z}p49_q{-MewV_uvR$1(`mWIh35}w|TUT;OdD5%sEUTgqCN+)G z&qqc+FCdGE70@Mk;DtMErxxC6W!{A!uvuXkvSDxlD%a>PdE!sREzY&9!fe?q6INOB z4W8I)>J^`|3!3?hTHG#|-@Zn#4~&2yBmskK3@Kzv^K*{0^l5zD(K^;zlWaW*TG75%u5F{RQy)o!Lf6mn=zeQiTcR9; z&es=(&@|;5CC2*o4__J8t6C4T4oD7OPH33Wdostv-nL>Njf*|`*ms>y zl}U)JWP?E6fRW_u8_nR{Z27VI=C8sAE_LLMwR*Q@1-Gv_Vmq1B1s1F zt-)&S5=3Za%Qjb9@!Wt?tM_;=4n&s_Xg*_S!e4kYh801T(D{s;S98_pmpNT+zKO>PNSC6yj1o7 zARQM;#T2l|@gY)cSU}rkZu9{dg2a*EKkog_*UVuWg*eI3f4kgD!dbXZXGejQ1G(F9 z{**7OrPxx0CEHP__EMu&-q?k$G!cy-wa6p66!S05Y+MX5?7>X&Q-WIOI9rTf-g;(9%mwb2LEc;;5vh*Nr(A-jVmhsMkNt zRuAhf^C@w@BjG1fHHzmZ53_SbI>|M-A20FVnT7k5RUc7N(XU7uWe*4j#%q0$V|o1z zfgBcBsVw?8q3Yj3 z6T-c7bU3WLC!7?^A{nw#US@AGpfBLp$151~XOY?(zWdF?tSF;wnequq3#^H>#X(O` zL_}(}l<1>$_7CV!f1v(tpbJIH@Pn6DoKxzyJza+zV1MFMv9!K`xZo7#urCH@4IV?i z+dP`;0z#ASGnzqO2%0S2%hAc7a&2D}Y}zWmhZ|FBqEmwW694|{OU7^i!COFi#x5?V zOWe5u0?=~igWTWjal%!r8OPfvmd1xK$uA3 z0E(mfGeaRrTKW}LY1OKV==X$hhhx;B0sJFm`F8>g`FC+j`MC+LA8KDRMoLThkxBYW zTZ0&SzoBQBY-@Kk5G0+jqPc`K7MKLlp>g=f06h9yGNc-Pv-6`j z5_6Yy+J+qyTb^+d8ChV6TTPA<1lpGsr$%`uvRB*ijX+bHK%Bfc1)m|mJTP7l4HbWo z4$Z|sOIKHpwi@m4jx9d>2HKbU##r#W5gGwBhm*1^9k2`kqCm)sivTUBNS}w~rS|%H z59rYv*rW=_bhyoD&^NEh-}0l^pgd%O?(tW2NK))C8IbAwua=_L0-VTWge1M#e^>KQ zV97p6OF1p^^_!Sjzi(HtcWtWP))f!f-ED@Um2xVc%Plt{nqf5SG#TN3@8(V(yjdy} za&?rFb0ugJMw`hvCcj{2Rd^X@*^mWiIa*=)w1Ja(CbJ1k67=UIT0hte=n7HeNlu+o z!rv5B9K=g6yrpOjqMo1*B^Sf{QjOmGBQg-v)^`lR@PDmeQsj#=U&}HH#W#fFvI< zgz_&qyXey2B+^2_ zq~?ccAXu&ZGDJLpD;@AWoIoZU|KLB{)&H^z=HICZ|H+~MkL~TaDI;6AR#x9-KtD|n zYqW;+HiD1=U?Qht8NCVj((lE+_s1+p_GS(BVWzgj6LPk_n!f7N3C zfB75}bD1?8%MwO${O7b&>d3$B6Am6X%QuZvI?DweDEv)4m5_GEo4GLE>v{sDQ3XLI=~DykC}ul35YeE;u-Y0pQA|NG|uFMs#{^%asl8RffN%aZR9 zu4sh-tIt}IzJJY4OFUi=xPSk5R*(PlJrr}}X(p=l(&D?9N{nsw z%POg2{( z81E6fQd5--FckTY+Ry-kpZwVWaa|x|NW(RQ>&gvnl1DhlZQ4A)g81!=Nbly4HS)&n z9sV6{fC<3^hcEYO;TWtAyf354Wv3o=`R<)%J2i7M{SQc~u_H{!tU1g=WmViHE^DH6 zbfNhTL&^W>5Mb~a;QN=%{xl3WLi~?@_!x*-azZ&jfeETk9(JmsA-Pk@>eX+ z36avL7_X(|I2#|hr=kARbI4q0Gx91R zDI82rVYr#;zxE^Lg;>ly&9m~I2v9q4>+rtI8SC& z@#jVP7~1ip@X)f~62@&|4-om~!s*&sduGbq*nhFSus+NTXeancWc8h5QmqLeJ7uge z*d89_&nHW|@BNEffk{Dl6XnB`kCF2>jXP$$KXAheW$WHahn!@--Kf-HS<$mlPqIky zf{0zxe$ZKVm>_ff4wtcMgvV{a6+)F#EZsZlH1j%GRQ?~MEFhY zjDgbVf6!^1$wlB6>%qkRx)PXOHWz%JKVc4QKknwF@*lUeq0@fw1;!Qs4rv?PkES`w) z1qo}qRUEcvW{I?`7W{li^kSqBXI!nZiMX*zaP(jBlK*b7Yj#too$}!fF_DKNM-zvS zWK{GX9Z_&rSV7maxojYBoy_7=Z$pmf9#+%)E_iJUo zyVqMRyVW{>eqBBIB!QrsHi!v&P_Te1;PF(dS>GhT5#yvd5ZO~N zQWZ5Ieri3u4H2gIW)?eaX_AtA_qT!2-@%dluRDpqkCfx0+58E3p#c~J0%%va*c!0v zGLZ!ev}9>aQF`dN8fD=yl>g82NioeM12T56AFVQ;gohJBOE81w`Ha(u$v0lCI?#?3!-F|%58C3qWnun2<7M%gEtV~O{JS8w`VH7Gb z{?`q_90E@XbyK7t(3Q$aJZQY874B!ia=sBp>}$TsJ((MNYvrwf^4|b7#y9J#tMuDZ)~`jYxy~$URrwGj+`~b#Hrgljf^7^@I)=u!Yn5*a;^{{qJ6`=Crki1>t}D z&rjTcVJ&0r2q{N>d}}Vl7#Ass0r>^sU)_*4Dp*fa7a0k=*w=Hver@ofPVZBE|0)^b zYY2|6QerOPg;`}dFp9s*t-Q5OnY$B{c<2;u#+TNmH1%lnb(`qm|yUZ zHuCa^7uC{f@m&XwQdEk>BY0(bm}QK^RHds2jc>HS>aH5d;9sNTP?NqD7@~+$rry~; zVAb~K%*=ykV1H^pXLBPoOLPpRqu3yc> z$M7MpiPXSDeKiIo9&`5B0reZ(5_gvs&H2&R$)7U}`G~aCW2Nv47?`^b7piyVRkR@s zw}5!K(RKZpk^8h!>Z&=#dmvN8`^mH}A6^tf)yythhIaNmtqc{GaN6`P!w~AQKi+P1 zR&0-afli%nwy&qH?LPm8&CQ8w$Psrt{qkAfAMVrjUzrMaE0fJ|=`i~u$zsLgkBt|* zV-9jYZrz6}`)izMPeorFuUf-BE5DW=sMK5%5tQceEuZS%d9eK%{Tm^l%<1^t+7x~% zLheZQbc?GxhyTU|fn4yBa_1;i)zRcjyJn7&o}!a|@yC&8Z(~V=HOZ8)d2)(u-?SFQ z8-D&p>wiwreHaj+q)|Yoqx6b7*}8m~(YCcAIL7`eN_v|zGX2@A+$C~{#UJo`pGTdi zs;z2SW~OZ-I-IH@h)B`E&+Bo(dEX`W#(fKr${Iw1Mtjw}_8Fc$ADL$?0kVp&&DLj_ zM6xA6NXw^k>(A5WD1Beq%v6RsHhjizPooba^=nNYGT9?E*q=D5ZOGpT< z_s<~Lly`U+?Jo{JlAq?EH!+&q(m^5@GSs!cLuNlxpnSo3%{Uk>q~w(~9I8*gW!?&N zmyf2%ylHNv2f#=t=`K3AQX^GcQHX#+uL@up@t;N_KQSIsXQmjNJ%Q%tZ|nnZtmKVz zBX zQ+XzFg=K7>8WsR7%g6Zs19&qgKt+hrEm5!CQQ9k!V#)Z`2&ap0?Y~oB32bdrJV#R_ zkVcv~$#`CF(@6t%X0D=91()lWWrPXAhg2u#6k|*!9?b~E7zRZ$5ZPVw*{gkM6Y^yt_2hj ztfCQx%aE=74v68QCV>D4$80b{d$HcQeulP@=vh^CxVTp@;;pn$p*WZ!dRBxLXcBuL zo~1E+bQwY4K1=^O$8fhq^qU7yT2z5u*x+=-gpyb|G2UcNcDw93`VSRjKN+6DrJ&3r zxQB9Eb-FS}&}|!XO>uGCv`*XkH0r&>6A5GtzJK8uUX$0;2|qKQ?$ z=n?f3Tyr7K}RB_*H+zO$OFPT;2O6F zdk-vWhZ5yBctme{^)d9B&3er>%V-po0=-&yVV_c7sB`Aa%p!C69WKMQR2N zEB-wt!P)Chx`vvw?ZV3B6ix}}w`0*XsEGtL=B~)$DbLxwfBFe|ygOgp{RyV;KeHho z%<*usa&ndxu~==gg+(auQsGJvK)`5b4vbJ&Jo*Gl(MS~ zEg+cN3vadRui)I-w?|;;91%?*%Zc|0;MS@n1D?i{l;U?@bqbp}~&dm>K607QfK*3NYo zcGnYXr}!%ENsIUTLe`$EAC~E@f)ahiD3wn-nuLnBKlS*ZMI(YdZ4fiLE_7lr_Tx+?X0wzvNo}wa}>5m(yD- zxxi1!(fjQF^iFTP#J%Y3!h1br9dbCMUXv_A%Jz=vWkK_4ILuy@W}kCk(L-2mfG^cd z!J@D23`?eoha=pJ&qSKTi_bLnCNp-p%i%ZcMp!go!sM3txQC$IV`GsS!Es`)EG>~1 z#n_=-tF!*>>H=b?|CXZrL?<^tp}$=f`hv~J&Z4+8Ls)uh5CzwFcWDcb824%lMwIZ3 zi<}fxrw-=_@qQAZ2JP;Ti`qI`?E{()quAS$4)t}%g}aAH7Aq)iP||+gjD5kZNQ8)e#7F66P3Ub=mOypv}-Ss>Q7;$Fvbdk%Yxdt5wb8KBA%WsYOiR9d&qx)aPGzJqT#`XA0H) zb{G$8$2DB5dWG+U%0KY}NH&cbgLA80Ij3 zV3F$3S+Qvisw^=hJC4l#44i3#Uk8SwwbKt0-i3zU!;Lj3xWN-wON0#M?N5metX4!~ zhY#(ea)!T3vLD3LKF=K=MMu1s6Ed;Djz!~2=sq@>`;@`^IOOb^yWUC=0yVaePsFA?_*b6}5tFGy(luPau`cl~i< zm?3K!`$|s}+D(WR)kJzfnHuH(PUeulrQ|F-k2>Dc|ofFI9r*++|Y&i+D|~Nfi03Yp2L| zT(@iL`Nq>Kmdkqqhf~_mIbj}Le72Gf^rz&H=iDO3F7%S;#1g7FD zEt3Ub?_&DX0Md8;wCg?s`~7AHHp;y*X^a>V zau|m3Jn#SOIqQ5lXDztTKBs0Uuk=u@~hnhCUS<_}#4B7U#2mYwVe||2 zF~yD}4S;<=)UG4bAO+od`D^|7HcD{In;gGAft+sxKek3~f)0@+xYU^6=SbwW)EZ;n*`f{)ABayG`q zq9FVAI4HNZAH>WD^|T|)JFbBR@%_zaz^T6=1j%m?gs86ggw$Ww^Gf!F05b}8=I^lL z3VMno0lQYQWG>}Xs!v1rdFbk05dS7z*3F!(JJXzOC?`-9PSdK9V@;POG_(5tOS}2S zq@>4y51Iq63wXDFg&HeBPpm$VzFi5$zAozcR`0T?(N?N;<5aLw1@+N+*Pl81mx{YJ zws-c~X#D4GF$M^Dzbcr?2-glTJayn?E{Qw&-Lv6XW>FUW1})8oofEYA{)37AyR-}7 zaPwWVOi42=IiyF7-aO~#eXT?U{kCaKdF;>t*b#m6b7hL`4Gb2hv#G_>q`Klm;1ndZHyZ)v?HpJeu@?wN_?8m=t>DL^Ani0?>Jho8n;Kj~13j9sC82C~s>se0X7yPjEOlCcSga|TiGoHpuOSj@TG*7=-D=y~Ir%Ho;cHHX$aq1QJ@%Cxc8IU+M zd@>)#Zp~0iiRDuzVTK6%Sh&#;p3~m6$nM=7hXQb+ElAx#E;C!J=;=T(6E%G_+4~c^ z|Nd&@jOK7b#Lad+d%_s;<3B$ zP2N2#bql2L0mi1zA^Z;mhQ1hzk_;+75E(CCk>R=C$`+6ZI#B5@86)jLrH+OVw`l5? zP|U>angc`$CCcvM_oreWa~A~UXfB;yzGURkds(5>vBJK_{EwKOHI3DWuvL0DL-JgS z*(+d_T0iiC*K;^zwV(W1cP+;7M{N}1aAl4oA?nK{KdWtiXP{ZfDc|r#R&@^LzH&EU zUMvEEmzv=>ahY-=ji;C6(sKGGAYVgo=BB#=Au1gNE8x_Fyw}=Iy)zqRM`YjJ;Vl zH>H6i>!2Bu>M5USl)*zt*};Oj6>-q7&8Cbd+uzv5QjSICfsOjBwmj8{zI*Ea1#yw3 z_Kk*TBPqWJ*Cq^##12eZ*M5_E*RHM(Ge@v;pZa64*VZ<|T6&b>L`bxc27#T9sa)iP zBw0r;6#Y4l>7`__y{^j2;Pnq>@vrnJ#kgiz)t$w(P3kj3Yp-~JShpRbrK~d6{ZYJm>l3>C@Jfwj21TZ&UH>Bjl!sS@f1U;S$2V-^7e) z;*Lr zRZlSS_9#rZSfOwmyXYUrHJ#YNx z5}5o>Wi@PtnYQCnJKG|=xb|6drIoB?P=&n+d+w`gs%HhF1at~g{^t#08iRZ&Ep*)GhY(RXZ20i(q>LRuZ}rw=z8hk?|Cz=kQUx3K%5e}GA_Rb zqNc?hcztmDILtF@)Iersm3plBg~8X#uc4#%5}xQgOEVM*qIvHciS z`)drGQMgaEP+gwMUo_*)K>O?ozZ&_fQ$;}nI=6mTJ2^0O18|w|@9*GiYNS4(A%KbK zxRbi^4AXue15!Z)SyZSPhYXQJmQV5#7LzCGN^Z>CoX-xiXIljGM>`IVLyWjO!~Iao z+iLhitqb+#eic0r+wy&U+bM~oZBF#M4GW%2)yLWO+W06^sh-<{Vw|LQJ*Y1Gh?<}>8}LR}ywY}~fbe{Hu-e5^n@InI1<7{oDTnLq$DRLq3xpLJa?P4K(vx4q`w zP9FljEc%sZZ=m*z8z(_jCoIu@qtIIiLEPtIl;u{;;zy(OC6ey0yaWIl)tW&TE8E9% zb{7Bh9Zp#G_$&gAU-;ygs=_zMX)cV3dJ;YaKe$#F$^%UWhAQj@dQVvi8^=4|J*8k? zuR19V>dTuu=zKHnsS3 zJSYH{1Zop_6Spp%t7!Rm(h zd(H7wTuuaAy+#KD<;(AJJ_w)uC{o$~6Rsxio={rLtTx~yBK?{GQFJ`{AWiV_s5JNG zxpcZ0>^|VcjM&4&JJ;UE<05R9K7vC{j92$qjMv&J213U3vu;Mvj%SMdWgF8_?rRc@ z)-Foa`qMf7By<7+eYlBd?Xl>A^$Pr2j4vXXs%}oOc&5#q|jH%n_HX^!m66 zOf>j4CMaXv!WXmG+ou(L1paOA*wX63bk`2_#kVXwXg!bHeCJ~)Gs!06E$pyQ%+vex z_03P(&tD8DomaK&Cu(IcO!g5&vA}NAJ3#L4_Y$_3IyFpYBF|{0gjo3e}V@M{iev&Btc)wx4OX zL2t9!*g$LHx6vZQJS!X8m}YG3BUIU9qD$d|q`58ZTiXSX0Mzd8mk6C7lJ~Wgnj<;e znHMi%KvmcIf_R$-9s)eGIHIa5qEErY_`>*5&25peZ?l^Ak8+`Mn?_f!GI>UuvoZF? zFf+UYrl7m=rYnQLVDt2BZ@fANskkCYaZNFo@yUE|=$0A--KMc`$`nfF5BkMFL{NtO`Syn$KT!_N4} zFLELBI{`_$)xTE*f>~KsbJ}R-i;`ec;`2^v5-(hzr>15k&fQiCoE_&9!q?&#q9t7{ zgTm8TgL-5>(f55-+*YCRn+ZGtiBtojpdaF&&zjr>e_BR#gSN8j#3aogB_c2v!uKk9 zQ_p)hG@CSQV=1sc`g45v5p49puD_>ttg)POhu@ zNb%{M7sZwwOxoPM?tgYi$AU8)@X|3AVN|j@Ae{$0YFb_R1eR7_iCFFqu*Cw@W}@tC ziY0lZ)Ft`Y{o;1>!8{`$PQGN?H34y^%-V`Oc>cVFuplZ^`~bn4P}Y}Ut4c&TFhdC{ z-{((S-N=pNXz11Kci~?73dOEOH(=O?_VcCUUW8<)WJ9_k;J=;hc8!>Q3P@_Zt=x6J zK7~B@=RMe$^r=LVf-QxuOXa3(S!lXBxnQiiIbND1ytG>jclG%lbZW0JqhO^4`rZgG zv`Vy^fsr5)iAj4Iw(^5sWhG6I_=`_a7tzeO*_gGQv~uzpQTBp4AmY zOdmq4^u2-RbYZG>!gN#b=FW%YXLPHNrHhjLMq?14z6Y>rs2cXn*AHKt$Ick4Yov0I zny<-yjC$ZVD-u*=H+uMLf7AQ8&D+nCqN4DL$Qk7*r}44heqY{0&i0zEY9!N|T-l?e z3+3>K=cQ^DnxI-eVw ze@>D|I>g6CXg=lrv`8{@-|N7@=AmZ51OLp%=Y0P6du79_C^P@ZWsn^68c)xL>ZxLl zKL?I9d(}ll<$)iP2e-c$rs5`QGQChdh`AP;so!lN8?$s~#I0vbs6`UFihJdYi8PeSL74lBI>N|U4Z27W3-h_f|9=e_PN*t7yE2nFp1oU z{FOF4{SrH(wz%iEp}+)t@3z zU`kCB>V^nA%KSd%dBW<5tUlTy{JB+?*;NJ%w^7NsiII!MrLcZp{te!)ZCy0^-^O=+ z93`qwBq^(HsN)t!8BT1_I~~yt#hN$qSFaFxIP#l6zm~)kdERM$@RBO`=oNK&X8(@< z;t)ETsm#R_;ReP1h6gcM=zH0h3|evMfPaPzh}d{^x6welslq9WJtGTO1o!65)ez=* zSLQ6S#qxD7=XIPRi>nJhz2j8NAcB7w4yshDZeGkUk6So@oD2s4fDUFEL~_lkb0x_i zIw7iiy@Ofm<=h#Xqia(*`;iHJ6VeAA$(frivW9@D46V;xCpJ#uK$en+d`UH_GGl8RRD+ z+gmAfUn(jF5M%wVZwQm3o25XZjh*b~?cHT%`UH+*TlbW@mcmUZ zs>S!`<0%Et*Z`GYDtv_d&EksCyDi|`4}z6ee{tZgfHO5yu)1SnB0LcKfzb{&$qkF8 zjy>s@4!KyN#t{#P{cv)clqLqcfNj!26yt1VRrT5FDU%UPgJHjXgm>CnvJ|4Mq~$EQ zP|bsj_BQSq)^?s&lsrgn-8S6rPN@Jx0@X!XVhmgBr<`=ZWwk(ZL)G z^a)2me-a7sy8s)Us!CI6LUrM6J0rx+`8fGRSKsW}Y7eAR^pCQzXnjEzKbp*5f6CWh zh>r(ve74ghLAIO}^XgSopz+U@BQV|^(a*bbN?&uD@{lAWQBw(EQ&xEUGT&*!wi{d@ zeZGg(XQ7ptc-DRSxoybY9l}|84pomiPne7cS>5&@%Q42Q{`|d zsLXz0xe6+jy7O@>RVDkHZhLAG`#jh0z!sF*zLDT{FQoFL~X;wwcvK$TSJ_SjVEn*VTkJ5JNu z%KP*bi)dD)qt!o*O1FfyCqCp&=9W`zZ3jEc_1OWuc28Zqp4THz^Sc(RK4%^j^GDNI zhjiNj#lbA3#Bk+M|BcbwAWMWEXZJnQpGuumt!Yl3qj5uLGMH?2#J1va8MAXIJY(^& zvZhO#OGNuuq!wayA)S*YdRM{P`OC8~%d29phRz?S3&`BYn!(Rl@}~Kin1$lsEb@Q; zCtUWOIc&AsAmXbIlpCo0kTk<^X!5u+oC32LYo66}dqd_*A|H<1+vEMv(70Xv6@k_p zvZIRs0wN*3;t(<1*fmv2T{g7(OmP1;*tg8Hh04Ba`AM>md}3Vw!y6Sb$svXz=W?_3 z;y=a*H~e5@xtam0aGWPr+uq+Z7xq)+3&Ehlr@xY4-<-H!kT`$2v;K#{y;$zhSYvuX z?p@2yKZ2Ww;UA`&WIp!My?k{m7=I*(49$1C`V=(>3AZ`|TT!JCvedPh!ryBZ=%8dQ zCP47zrT__&8@p@k7{MsHsIt!=*l8Xe#9XR!S)bnyz#MHJub3++Yn(=CFVUZ~q7pb1 zIC> zw~b~noLUw@KInea69M-BzwMV!>w^SVlx9EH)<AsVi z@vBu%P?8KmywFqjV1ddsc&1x|wi=UM++b%XYI)8)vAiy$~76*Ew=N zgS$$96~N|_UOfgqFG`JYGkdh)iA&x#Cv-4$6PKJ^EB=PI;IUHop}J$$T%h&lgUX<> zL|YGwcAoxIwzI!(J(Xni%Vuhofm7~m-pKF3E4j4rr3VHJ`peSMZTM32}ZBTFnQD}<6D=lpw+wX`zt@<`Z3TaUtBb8}}=BT?ONAtOq^5Zs&b~l)4 zKB0UN6;s?3!|xa%&W)ve#c{8q%!bR2mcTM?fRgnlx^o^_J4a;(m%!AqH$$<_uFd-Xly^|w1N%SC8_AfN zgWH??2ldM>!^x29J4uSJD~nladXqkd(-C*;lMzAaA`PQALHb}!oQ=)7_>$A;{XmYjnYtEJEg zYCmlDtWxIbZ9g1}wdStCk_f*WVC$2TrZ#`JV#2LbXOiYePt)}K?E^-^cEI!Ur5!ZK z!SFigZ075iYlAg4LzH-N=${=bql3$XqY|oy+M<@Gd2hGUnVMVlP7_7XO&}JC{7P`R zp7yI{?2qk)L+TMf5m~|2TODuI+mq5Yq7=DD#b|0?xS{`+$2wZ%7j2vmX*q6#o*5al zkTto<6TRSMd5`hH6$MXgDWHFOfZT|*#q$CP8H}2)3U6jhhNb6K365uy9W?}jRr}~o zVCzBNvC_)4p$}zY3Cmt5(2)(tm-@g!R~7)yyyMmKMxTADpWPz4`i2-yxIS0nR3;_@|cOe3tHTB`20rHpmf$scs!OTL~;VxG5(o{7$oxUf#pMM>NW8rteW0(tP zsAg_nOTRquz8DHB)p+49Eu|f(f9(`Az+`Fx@=UO$DO;)E4s3fI zU9if==S&NW-BmEnNehfPx#oUSa5|;1`e?EG=Hx5af}B$M7rpl{9{+Gt?h*6gcLz!# zW6|GC>@erzuC6()DmD;zI=4vN^-xuiLswLw4=gL5_i$L1XAw&Lia8FRw8$2-AV`yv zs?dOL+(6pIWCdTX|HD{Vi$F01ty8tW4_c{1mMuJ4`$oP&xxBE8l_Z##Vd(1i>{D2kuZi}UU@)|Q?@|z~_V<^hI zut&%WUqoLV65|aY+dQzgegaFSR2R3}M$S)SwRE17hL#HuW6C#sQLuU-^$L;{F=0;j z?YO0;OOE0m1pMc-40p{}lj{JuE#7;^+*frlX~0RS-@WyiTYd1%v@sqG4$CmQ?sc#EFr^-ORZ>< zH6>ZSTjW(xTTC>E3wf!4`ZC1{?2HBxByx}$X42mxL3#_>t~3sQ4*#7wzisbd&++7Z zqW4EhpcfWhoLD8Z>HMt&pke{4g+zy{9?go*2J-&*Wb{}fF(T-~m?yrt7{6=VEL}-4 z4RM(mz03wl+o*oz)r%Pg2-&FnmyJru)73u+V4L#tWj&lV`sLoAdjt? z?=r6+4Udyi=$UGg%~WHs5My45Cw`m4Cj6h=*8~J)b`m|xS=8p-+BLAkg534jHjY3v=tCirqs$` zl||u+u>?Zn3-LvYua-_(SQ1uhN$63&i+M(18B1Hz%6dl{Ep|O1hgZkHVTV9JqbJb3 zCiY%nOk1mQOAJ-n7gvgf4u|M~kpsUo6MGMwcSVyOpCsKNH;L87NpdnRrK#DnHbpH* zOvgEQyeKWl-H^P+B`B$`w%R$*g|uZw>~XEQ?awlQ6(n>^<&`;(N3>%cvw&Lz6n;aX z0gRrwKh5VjpBrb$y-gvw0|Y)g$%|NC7UfCOrkLa8yu$E&T&3G$F5vUNm?USGu;|G&H{xB%^hDK&UUM*ps(CtNO~VvV%WsqZEIso?)A|5#+8A zGY-iTfbxXMYKipa32;oMpuHYm1Y<11xA+DA5rOm*EqsrBb2nrfT8Zp^M0C_%y`QSu zjtiPa?4X6z2Ka*hK=f&6%r2)6syZ3Lt1BZeyx}GF?s*1J`KMySV8m;RE~Q4}#6v{l zN?CJZ$cvHlWHgdDXRago%R3Vwff&oY1MogR0Iix?fDMFGO__-PeI=Y zXg|>@mgpP8$-a5b{tPO9kc5m$72mhDULB0VtNnj}6T7giS zLI>ZVZgiG!aI52M?l}5I@kgbY#Mmw$7b3EMAX55%+Ho-M7&PWEBGx>s#8QR%YA$sDBSfaW zrTfSgRJ`r($AKag9UJJr=jFxz-G3R438ULU`@Xe|ZDQGGt!J!Ty7BpQW z4WYr>dntFc1Oxvt?#OsRM{vj$b``X@kB(#pbTmr;fT2SQbY!Gw2{tB>El50&onONCJw22#e|o6Krx-PuKi7nLH_sOVx?ov` zECP_=HyS^XwALhF{L=d}o>a$s9dS(j$@%_S(X`3~U)^pNE`lLNy~7YUWp3e$FpVA@que&&?fgE#H`p>QU1w zxc3Jc1D{+4i1eVbiJnv&Pb-7RC9tkVoq(f0NZPtI_;OY?cFTF$c>Hrmxc`N{7 zkm8GC^y?%rel}O5Dq+jukC#zN-B>7M?O_gEoAWVyQM07*H%xBRn<2L=f?(SKrRSd3 zNjCq=TW_Eu#K)6c_cKUA_4{gzz#TPVaD_2|p_pf^ z>~~(nV=6Z!H)_V9Dt(kWiK5Pc;MP%vAI^5GHqPV(V zFpSivV76qG@jWp{s7uM7vmqz|4HeZJ+7^oycmiTj8R^;jwhkg z*2&du+1uKwHtO`eXFUmB|&{c%y$?c`=4 ztSh~j~!WM7;`?YijW-LCX88q{c)2*dpeDqee6mD1#7s zQB+7WdMEV#ZUL}+Qp!hnFESfDPE_hT^CdBzSc^YbekqSgqSKW6o(y`g&(_o3^`|vy zXng;bMkC(agxUVAE*RCku&vM1?x2)6)ef3qA5FM2snGy^cw~p!2{29jwumUujCLY; z@s&G?quLsmRb4~g0*7??a}1wt-iE%#7?CjK$J}_FGHv(DCXjoMq2;{5+pce--p9b? zGQy(!0oeKn^e=xC*N8mh-TNTi-}6Xxwf_UbM0L7uY-6LCMx?)vNuYE`_#{=>dve+k zQ|NE1Fc>RJb7kZ2C6xEzmB1J0=bIe#A?6E(4#&XTpS;a)j&$h-+X{n3U9O~-5xU7zYT;R?^j_M$Pg;q?KAG-Qx{_NA+HSpWcx?3V= zF(VPG0krMlh*;Oawvv5;PZk2cINd=w=!U-{>6(AQs$L!pNmNbJtWH7zW7)u0{vu#Mih|&J>wk z#So4HlPc3Nj{OzpBl&L~i*rEe$)Uf@l&8&ILY6}is>WnDtpWBA1Mz-QVfN~aeNxo@ zdzEH=jFdai$x2%qDWUS2^#X1w)^Y`rfdQRTyR6Tgs-XmK->TIs@d#emQzAA*YAk2b z-xmv4FP-@ABkwe^vr$yc$E_u&bRZ3d5}`4K;AEWeq7N@~xSrn1uhnpO2)~*$cF9wH z&CzZ^a7c9-U?0%|4>b7$JGnxPwugOnEr9%0OYDuP$g*rmD>SE+cPtE4shMk_AU$^0 zd!H2{!|;iXZiAx=DTOPWE0iWBJw6?wm-+}xS0&D-B_q3J&@m%FYtf4U=Pz=gGtJZP z)Y+OVH9|;2Sya>AKeHI_zTnj~b1f=;Qc+P5a;w~)#%)k9)^yo66M>~WV@u$*D zr*4Y8DwUe&W?2>`D6%Uaf@uKiD4S(dT zZwtZtQx_ySG&I|JH&p>W2Dm>FKmh%W%j-lh#)}atCDw1joPR2rpAB3LY0oi1Ii+~* zEknsOZFS=x*#K@wgUmpo92ZI3YBMJI`oIB8{0`heZu!VhI`KH;VbX)_%gjp@i;v(KFr=XXrxQMCbE$uL zaa4}?uW_rN9dxoZ&M3swG$o6_oR%w4=ts5eSHIKkWM4N`4l4ZnYn6hb&1JpGG7ZCa z$=waCz?q^Z73}ZL$)OVrT!G9dglU}fMRF(ce@GG7Jo|Raw%!b-n=F>!I(ap#k-$El zUz$Fu`C9ccHtjhGJSy0*=U*>pUsyh$1MRQABlIGuFh}w`bbUTy>_WIX+PW9!<=7}< zY%>h69geY>M@my_D*j;+yH1UFIzXxw#TQ5=Kq-~p0$xi$>1!MwiPdnjoKx40r@K#A z^dei^o$ey&XA)x~sWu`f?}6;-JXRx{+y0F^Lf}8$NCcXHQb-T|#j69~e;B!sKZ}8) z3;3ej#rJ;zBvxC1v5Rr(LXe1P7w>xTfIK9Zquxbu@zL1(r{z5!D;|zXeu|a&E$0ti zPY8;AwyM|r&`0wx71lKOuY-j|>bP>w$Iq%9``r-|vU5Dg#Zz0&&CtC+FW#n(bWa4N z=+H>&R$SeW=rWTxB%Hj(!Jxo!mEv%S72AlyZR-*LK0?m~MfvIxgfD*~mnMpsW_=o< z@0BF++3*+WJ^f6nLxsRbzmx(Gs8=MGnLuDS@cW`<@*0FOMYo;w(*hJPBuC{gNsX7_ zR^1iCO=XHT3dR11v18f}yshhic9q8grBt7M*5i|_eQKvNs`yJ1+HE!Cyd36D4qGqA z&x3I(O-E)qbiR+ym7xXkhv`fDl)U>0qka3kTM#bztYtSN0#pUTDR;EdYp4_JdTN(4 zem;uaD9DV=gg>P~zs$enf(}*$a?UdZJ-;fYQ1o)-3O-4oC>5KKE{OSlcry3>C~q23 zryHq!zI)PN%h?j0%%H)&^8sfM4P2KFHvniU^GG1YS;c#1Q)jjYSSgm>gD!t>qaP~$ zNsq^!EZxLQZDL-z=C@!1Ad&CB1oHK8lf~t#4ldJG?mW3qh#|@mx}3sul{o_KHR*fbvn-sGr&eaj*pN$R z!c?<-_kllQC>u>utnA_O4o#y|l(LtI5}QRlzSz3&X?(LbY?bmNYo!#Y{{{MSD^?~4 zMTI*v=^@EJsq;k}mq7`VQ_c-STsU9pX~*Z;R+^_&(7(l;Kp?AO_H1YyyiN|6PmB^o ztcxY_h9-(X-Vn(BhoN<5Kt1mMpVgZw-!GsezQrbnVp+LBPM(r`2m|NBiFVcq(Y&~9 zk=CG0rQrG+(5z`}L2}e8TE5JujuXUoT8a4cESIiOgT|L$>V_bxu44VR{!@^e{!cF| z`O*$t)ZZWp9VB14?IOO~s8eDgyO1GHnsrTK32vB1fos$D`!rYO+QKVf1w+;hacCCch;(3eJT1PZ_llN4TZ8_c zfmLDIRJmiBKrnBb_^UK43?*xc&wugP9jBZ?+cWgYy{^$8DZkNgAeA$qwXA;_R@Iv3 ztI-&ALF+jLNm*)@{le1D5O60gWQPC*q*=zNyIAZ9s@+j zSx8QD+DMZUf7-~4GHlFcooR@ADqm1&9Qu|ewBX*_4H0uvAFn@aF#EH;F4dG)hJi3u zbcbG+LtZ%R__;7NsW;GY?ni6Hm|TO4_(?GliMm^l9=%R$E3Lx_(050qlc}#{u6HZ+ z`!K#0Tz0d^Z1w*dDCFLW6_Vs5P+!1Ty6Rgh$+Oi4B4zze?maCdsgcO^uFV~JA>|<( zXO#_XfaeFSt^_(65k4|ueYfIYT;-j-!vpK+sVCkJN~hMH@2N%yl3OftANTo}I=8)h z33{PBD4Eo7WfAA+Delisxd#jybfWOb+54W^kQEhk5=`KvdMNY^jgh0j%)gW3ZJ*Tv z!Tl?`*32Ks=9zc`4eFW=J=bj3d~hjUw`W;ZphXHGs$;cu^B!O`1Yf?nVPomT>kVjXmEs3{y%z>RawH4)~J&9X0Vt zw8sQZN!L=Mr4!i5%GE|YQCD#Q6b;thxf+!}hl_)<&3n;a7& zpWVfdWe$`Z8;qlmZGbDmWeM*F2)=X6;CzNhlXNq{5uD$6;;Vl#sR=b*%vLU$%qh>l z^E(Xg=m=*66W@MlIAqfnP~lheL03KmMj-NgTR$(R^yktf$zN=a;O4S)57BG&km{k- zw(Vi}+-9^F&c=xnIr$sdD7%~Uh*a|HThbF|@-t@D9%-WH=_+S0HGS(Wt=0+e%Q`lm zNq3ElvS6v{Yo2%gVAk>Yij)CNg4b~$rClNE7p42&9%<<)tky=K)Sd%z>3kQs3Q!Nz zmNjZd;~Q-T@nzvii!yDkhC%P9>H0q+`gj`CC6M(DHLeC9*30lHlB?9Ha3aI$L@Zo%162=YgmUdn&_FNG7P2c zK|#GG3Y<#C66R1&-CbMZh7CaV#Uz$n_g^~H$E2fN$I8GhkUO0EUjK>%(mQO=r{OPS*ouZI2&wgerFe{?Esb$Yy-B|D3Nu~E~2a0 z2g|ojk!m5uX%b&|NkRq}DEAM!@}?P+S7c{5bNOj%j1>~Xet!KyD1VI&XHG-p{B#f> zPmP*&TKA4oSTB3q&EPRP)6}kL?FNBKv~hWY?2_@yek5qncxYsqHqr~1tHq$PW~=I} zaaN2r-SqwjGdsnFV`#dX00^#;p}8FC z%#tD}UBHK!ZSr39tMkr0?p(4QUhX2X3u`Iqd}NHedwfCaecq+enPKUc6LWuNM7T$( zZ{`g#&kmG--1~h6AY~`Tuz2g z3yu|UH4rxyTRXEskm~NJ4gC+s8-a4aJ{xvsk!Zgnj5}(Uc^8nVDn0Dcq!- z1^(3{ie@t*V+eylrA1#SkuyGP4T$0otiB}|&mI}z5^0lq+`c$uhCSCH71V&osFe&O zc~5x*i=;$;z|l^LX(jeHroBll9x6N#ZhTpSi}lg>GyvMavmg?OVk3`s%J=-%6W~mc z!e)64nIv%>+hg@?SnUoqk6Iw>9R{zMY?2yBFh<=@C_p$<-kv)bdsW4I40y2A<>Aq& zc!Y}E(qKq&jCP6dYT0*e+(FDg=O{`HE_9h6WI_o&B~ExQj(kD8KB*2u$*TY~p5+~2_c+h_1fD^0hlyn5>=s$g z^It9ZJoQ9)wUV}!w0D3Wd=X*%Hmt8z)~NU0u=+vaph#2oO!0DnDp*)aJ@95`0i_;@ zu+#?bt)UMcwak{;ryG|9YfcB(4_pm7FTN^MCF62nB&_PF-%<{v#LrI)VMoS)uNhxn z<`@YJZ+DB0pvpA{TlE$iU|F%aw4ENcFDW)@UbAJY7{niAp-E;>1*`Fl4A-CapXa@J zxf8SnNp(kVgbLw0eQZd?F@4DOv6zuH#z=N|I}XC5nTanZEhAlaP^$JQLdni=IZCu; zIXe11U9@7bvRuh^tT?ZZsFV~b{>~t6HS=MdpMp1l;K#@SetFq^{%HF4-Iu*X!IRPS z>phD;Sdfe~t8#Ty@}~(`RY2Y}e{!$_ooNHxuj0RvJ0HyZxc%_X=-c2z`eU`oU}J8X z0|Zsu_9VXAmJ}spgO_m>%jHY{-X;o$X`iaFwqv$1MmSG}hU3;F+;>Er-G}b0Zed3Q zo>zBw4@ZV#Ee#D(RZiQj4Qb0>cqGGGbGKL@7PD6n8Uw*p?dfR3wxz=QulrU7!TF1; z+8(ZfBPL?mV0)8RNvBMGTS*7 z7B4%wg?H1$CAW}Letg#%nC(4OQwbtNn630L;F47Dn#iZT_+e`=l~^K}v+RwhZh=R? zMO)7_$fJ&laVJ;N{fl1vjmAtTz3D+P>+CgahjDo9ezWbwo=5ifCCM(>Lw~mk0y^4x zUntxtg&$)b?k+8H9)|c19&;3scYCUvP9p$4XTBCJ46tJhuyaHh%bQ}#hG{%8n&n|G z8Qf#5zMv1+sIpt|Kh3-m8CDVD?2Ax1mS?Z_(Nr1UVmz;oyONr+^Y3>D1FpMKxB7s` z_#m97d|$FdQ(cF3&UW%ejK?)znn4edMf~qdwKaDfCcC~?i_jU|=FrD_MmJ32ui7tM zaJ#GMhOUWzfE0pymrYvvBAo;e{!l5sb7p^yZwNh-UpsMne0tLu4x#+(fe4dz#I;Xj z6X4oyrSV^gh_paDN84I5b4j&xQCk01qP1(=YpADP`_1@SeJF?!<VfQutHUyoC8yB0Mu z)VCl)WfN}y(Tl|$$YeCz!Fr6X-nmpItbyqW4(@O(@rCFs5&3ZI_54+L4Is=EDI=h^FQ5kuC$-Bdprd+)Lu3cs1nou5^8A-Sn`66fmwt2LMKj2TO3zC%B3 zb+h>VX@0RudnfsVb$$ESt!%DW&V{o1F_9S+;Lc}afwY!f`>%J6Oy=c|g-=KKaR!eXeuF`9IJCyo1ikw$yV zq0~?VnUjOc-oidVc?e4R@k1^F$!J>NXX#HN2MetrT!j8uU(GPQPQ!-}ITkGqzd`Dx zsx)vHJMs-7?-I02B{-zWw_K**+lp-S;X;X5R^)H$Fha(HR>P7^NtAbclM-Q?AWrbc zFz~a3QruKE1tSjiMFb2tQc{>a*%lKbSM|Xt>3J6;%m2mRdj>Vxer>-XDAIec0*Ziu z^qz<)Rl0z5l-@$`B`5+Sy(_(k9z=R?Ql&Q`^xh%V03r9j?)(3gnfH12p1t=o^L~0i zWF`Xy!jzm^@Yjti)L=6;=Kd|{qp;Q+b=!{gl5Ot^9pyM9hZi62tD z1Rv(A2Ybs7ls{T!^4UQp9=-?}P0)|?a$K3va#d!3Ypkub_q6O8FU~IzWfk%n?`8D3 zv4SAez!a(c9=E8+lS+3j6lISx>zv}($26H@(Q|z;!`%RZRaH{ru4S9wvqFK_3jsZT zq;juHbxW*dQ`fj9hbtl35k|i-lu!!Ock28-yte9EiPF__nB*xXI3SaiaavjWD48><;>D$ z-J3l~LhNQePT+lmF7_r0Qb-lqZL_xn9DRzklk$!!ExJt~)Q$s1$Ql6~hy7Fct$qoe zg{ZS^zgID&hu)g!)%-q=e_Qzt@IK@tqregOf&Vc_DmqD{2wBJx_b?s%+W61 z?W9lYrwq@!{mOQ4&ze9kvLBgSOO{;iH5Z8`U&EMt#k(Wm72Ao1Gf$e@tnSfEB3MD; z6<$VKGwlNxroVT)qNIP_aFb^~V`#qcMH_)(wO4!xVA98X!X-2;J$0n6LMR-X;l zLTm8H0QsOcg^D%Bgjt!qBk6W2YQw3!KZeVx7n|=(li4yX>NoFv-yMpmF$~F1&Wv=i zeUY^8<6nX;Rm&KyAT-F68VwBRZv;PoS8$WQ$75_J@LkO7Oi;h0>2QnhB9=l`G(}-& zs(u6yqUMM)>O}fD>$Eo1XS9f8@o|32B3Byjrjp z>b-+#5}}pPu2=MTuGFnFF!p)T-b`^qN(wpcDIX` z`t_{zdmK?z8P4S7SD@3KI(AOzB&JNE5bk9{73|h?4mR{#FkG0X zLezj?gxSjJaIy2xp2i?4cB`vV8}CVZ7F+uyBxU!*Eu&R(>Z35Z_0y8AbUg>B&zn!m zZGB*`ouDt%)eX>z9NbF^int6va_zQN#+^hiJ>w9)WDRu0F(_C?x6wBY_euW#O;M&# z{f9@^b5DojmY;(sn*2nG)y>|V6x4x4T4&Rcma56->~n(~fVMc)VLweYtGTE(`II7h zuxd5#l5M=fFT*(K0g@$)h(RNQMcVizy1^Wptul3T{PEGGC+VTA_HHfV!G`p?&i<&5 z_MTowU`B=W=t=u}4vZ)9Ye;QO@7L-W|GuH-PQz~_U@uaP4DXi{*ykrxzT^9j`_@u)8L=mSJ9w)#h`%BOSy|uPXUP}oNo>^DZ z2W(vOI6K}8ZnKi@D<}!9ZpyOxr-HM$5%}GFq{hf123-oQ+p%lBeyZLwOU_aFgU!SK&sx#bBBj~gx) z%gr+zDq0X6z`v4{b&Vp|{B?43dh~9j9d2ye6P^8(GUPf!sXOG{Q#Il&ugqp^c_wM^tUP1@9YN0ets zyCw?aG9{w)O+*Ao3A=^xVqWtMcC&@(P)oPjK=-v2_-yAohfn?>7G#=Oe!72PMFDJ> zezvr6ASL_w?7ZywkP#6fa4fgLnVOev=6Vwv}U!!dz za}SU2v{ZFB9G+d1j!qmLYt=(2n!0_vmV zDhHRGU^%?pBH@sb)uumtdB>{LM^5=9bZq-k+YtBun_2yeojQiYh?=PnOWzmDN$5$7 zMa9#NtLGe5wxN`hx&5SJ6Fn8g@Gs65_0HEeiRh2NJhB*1>e5&Lw2zau95kDH-wtD_ z(#yn>mLhKee#sLU*KsR3+|%hkaA(hIJ*(<}-rvpkbrpuP!F89m^Q&DfaPEv^Lhb@h zm1yx%+F@dPjqeV4)($@29XHky63rj3yn{E?1WvNw8>O{nHB~0Nzvql*Sa|euDC#3> zoa$(k&xlG#BTfA<&c|CJQf_>0GB>$UX^8CLxw<;E;)6pw>3OT(#j$yc5pSyW_dFTO z{g~xYmQ(%6pUl~cCEByAgA=wfc7ba~CSJ;gl!*HT zA&lz6vD?avMe>n$`|YbckQpKjO-=eQSD(yEUB-6XQi~C~&`$NTP{WE6TSD3jBTEssV)-+nA__*M( zYRd-hNehJgJ+7@m4sR_CNl^)_$XQ*nghi?^WGo#4-LuLNS7+574=Mg+=e%84yUX+_ zK^w?=;s7V6=x2*O;J(?zU%m8dz$O3QyAirr`F;6F``M|0%9*wz(d=$!2K=5>aaw(q zhAyQJ(urnOpGURzF@!!dPxCd4zdonZxmw65I>MJlaOM^N3-bRTaQ^={GTi@%AC{SO z1d`8HkJ`~WtLL6)D$My;bSvlkzx>oVC&{$ly#EjC$9)s+etRja;rRHxvvuxPze@kv zEW5P!h!(b3n7yHHZ$2a{pd{`mlRt~k<)LD&)`Z3)&{9OXo*@*g77h1%FcPn->L#)^ zs;nRArMHm=L?L&0$3-eY%mS+QRrPc+xCF9y8f(6JI-d(~TT|Bt+_Zy^hLC*YFS`Ca z-{`U3wp3Hl#ing1QXKuAWvNTb{b za;8yhMfoP@$@<5*j#DT>WM`9FZ^UYIAm}7FO=z=@Ddz8@$_>FC@!(Usf7&-Ok?cYe zgH@d@)7xez;i!=Aw5VASWpi}J=00v;eeT80Md8TGbwYcbyF_!L>m*=z3SuX8hVPLf z<{vw2GV_puF2Zb$CFeg_|?LX8(tquqK77c9_0{mdcvEp=C%8Pt#wHRfAU{<7SH~6mk%BUoUm7;9C7EJz z&b|L7u6^Hry>)H+!8dzx6r3!Q{>M(d>W2H_KW~wzAgw5ys)*aUV&b*L(+MoO8{L-_ z={34TpC60cmPKLaCfav600lZU6>TfknBpK63b;2H7aL*s2)VO4i5AzpAOO1PG z35Q-WL4cyN?$bfBrUeMUbSO3Z|Bm2D@Dw`{a%yJn?Ih7x;m-1)4M~0A9nzz>B^xS} zV%tTTal{&ix2;$c6*yD-ek8SN2C$dCaEoH$m_n?5ZlX_S=&;#*Dg^dy4gq>D4W)_d z^Y2Qe&#SbwmHt26QE~x^ve8{ef(B_~(T5ULt2co!PZ@bOctPa!@W}9ZLpvJ-P%@C=61vXvQG5zk!}X;C!6`NIda9# znPK$T3>il1JFXD^ojn=BN2%Qm#?jLi>|B^@YM9F5-r_H>EAM}96iGOvE$z)+a*b5r z^4vT(p_npunBaU9q0$ng1bcFbltO8bH=DbBMt1W!PExvR9;WW`Kg*|5XtIZP7EB2d zaa%EvBcBiUbSibzShLTYXr1oOj2Zd&3+6l8?NIi;<#lDB?C(i-@u4kAiEG4ZQNctt ztME^ybNhb_BmWuhc!vY@y*=@M$udY-rw%!D2p&nh7>D#tq&Ybr(Ar5$vn0P}1FUaY zfBoKFmDO5{&-bizqgQ{}Q63w5MGMFfN!@u>y1WT~_hh(EWd}@~Emn#1ayDlMQnUSA zbp7`z>IMk(r!V8zh!r&(TPc5e7=5tZbep@;*HM(&I2PEwzkzW3&lK}tFEZ}y@v=Mt z-f z3bjkea>Ixt8pTjRrh^WaWBr8=)nLNY+X^LjdAxT(&(Du)yJu| znAU$XD&MQfi=kU6>(0C-Em2+6iAa154ozH0;&~s{+Wa(5YmMxKPcQadm9WVC$ZT_P zV1_RS{m7sUSca#keHhwcoii*KA-|w?Q7ymcvM&>XDJ`EMPccHmf3jy|)3TFowP{g< z3w$`g?snioS(MFbAumEs8X+HzJPtVs5Vx?C&6t!{eWXAd`(~^D+$@~o^<{*GugENm z)vqQMgi)}89Hy4(=O(K5{84W}-PY{bUW@E%qyTZJM+)Dgvy*p?11n5Wsr5Eu5VUsc zBLJOQ`p57iSj?$x_*P8ht02=I?3n9>PGb9{qW%%}VyVD4~9MA_p}tzhIx4 z>GXq->w#u(XPgeX#yG~tv1f8R5gZVD(pGC!eXkdWIgMB85I7ua(tps2y5}MkIBH)=J#2kW$oowjwcazM z0)eANw8z|(79O&iVQRftm}kq;uZtpw_&OfU1E#*djAK*W6UA^1*u@6Ft;WjkoiCj! z7jpE{v{)pXX8;aI5#>v0E4)}wa2>X4k3q{96=xfs>?=B|i&yHiX4y54hiGLT-(czv zbdn|JRIZ@27e5wuZVD@Z7Ii}{f8{2*#(#Ra5^}6>r)=;irM#=5ox*4Tz%cbvFWlOb zaK+`;O_vnLtZ@osG1;tU@^$ugv~G_TJ>*f!?qR?Vo0pH?jZ@t24Q!~q?7|>4C)e6) zlSEreTEy$y3z??28cP7}Zt4bwOUe%k|Kl&>sc9keK4z*8jM!smdPzJsx3z+2GUxmkX_;?w%c@vT;dIX4S;rs4wVQajRZyW196S&EwgtF+! zfB7DzBgItHZ4@To%!drr5&8(95qUmI+lZbzuU}o@7^?Z4+Gol!@#L!-^d-4r|DT0M zyc0>btQNhj-1P|lLL)PRcXcpO$I%K|e8?E9pKKw%;yiCby$Muf=$Ii{9RBL7O;HHugQk=^q-4&s934WR$(P81 zOyNiR*U-3y60>AzcMzW66UDl-RVxompll^iWU0@)B0#<9lj+rAEar)ZMJcd>c) zZh0m-p($a?khiE-65*z^{yCT!5qVF;dBFzY@|bLY@kD@0cPsq;dd})Z%vuh2xF37J zf9&O2*T##igt5+_FA}g;*Qq$;ZL#!mfQ|L)!&>a;!-_njt^5Dja~ze7%*wis%Eykt zv!a$cA=%r1gIK9-@IfY#81Y#MS~idGB1uaLTUHD%k;N*@_Z=w zEHfPsZ%6LX#ED|lug_X+az^?-ke;r~*sa~R6FV>ja8qg62_2=grFJ+nxdTRQfYxq| zLrQ=GHTrINE3!bIITii$EKD`lc*DA;g?C+9lv(*a5He-3r`lEAPvQy$3MThs<+m_N z2~KqO#hu>~6EZ2|Lu8OF^8R+Xh!6jP_LBtFkMtCu6vTcUC>FZQ_hxa=JU$DMF2t*g z!umbF?QW6f2IdJkUuPV!2U#(XPn-CBRio{S+w(hDWk$fCEA|?nYh^>)qunl>{=$m6 zsJXRHg>@2_NUH5$g%>Gr?+Gf_!syQCujU+pP$fA%`ey$Q?BuX`}XJ0nBTH9iHbNDYotu5(D^f^ z+AzWwe>C@=FGuX7bVSX*u&_fIzXNDn45!el;X!=Q$y^Xb_r8dJB&$f#BtAq;kAN@w>QE15YMU9$ue z`>3XJ2^$}k^hymdTSu1f&6qMZPX(AzAQ-*6LN)1o@!EuxJ1V^pJwZZ9;Q`P`2jbc^ zLCq07aKv6vQfoPTD~#_}VBc)NpIWJJ$^L2%s=nbJ#Epy%<7amYn!!ITaD-?+2n-i$I&LMi!g(=pi-igw2z1&NG58*p?mc94E+ss&^X0MPzjTUR~Jit`)3^f}(N)H}#9i6Xy z^2wip;dwJFW;E-o-5?zD<2zEkGpfe&nyY9Z~Kc!axA^c3^`J_fdaOdLp1&DUgGgnQG6wq%-*oFx!l0) zceSGJpV$qoC_$$6U6XtlScdDXG|29|5@qE@USROwnPSiHdP-j>p7T_uI#dTD4jDbA z%Hl;vA4tvburLR!1}W)#(Gw_*VBNTB*h93O2Fmz5xyyhz$txS)6B;|pklg4xnk0rX z^QuMTucgP5z4mk}?uj>@e@;S0_He^PmgKcc*`bI_{l(sZwwsfvMHcFFGXTT77V@?2 zla)vXJ`od**jm+L)^2D2_u|PygTc%>pYXRU@aGon_T5I(-HZ232|sPoQ`rm89VxP5 zZ&9yg_cn&sppp~Qhrm7XzpyAZ5KqCMuFzoeGsMC2&4r-ooqz8VYr@mx3&OxN%hF!z zFMV~qO_Q}o!@`{or9ScP6XZlOSXie)x_xjqU8%2Lu{>&kiNqgC)4>@@Cvh!g{a5r* ztCUZ`I5ah(G&k}P@y~VMSfeyyLwRJ7A?%_W6490kYbHhH?J;wZDEVKNFG)sbOLwKOgo5hdGJv2G|tK!ORp% zakrAZat^2FKcrLf zvwuADF1LHzNOfCVnqswo;NpwB*K^I%vzpp9p{qBwT7VQf8@gY-sS6v-&t2Y0t7xk) z=qxtOPSD-d(1onr5&PD{qXJZJW^(fl){eGR!(tXQus82N!z;l!Ma#WGT(MMhNyFe~e<-k-=N@l~FDnoK=bRcI>poAOFZCChY-ERw>;M zvIVT-|H2|sDdFZ-Gh7PSdd(&Q{;KC!o+dM^X&O42|BBMcX*1oYb40dpQ#XkI-9B{g zGBre7u8=12j;cs`Bc`^+BTa3xbG+*GcNq@}ze2RsKNbuJc zUL9pFV6|hwK(H1!j@Ch$g1S7_Fsu9Cv(6~+^w4EBtU$XRFtqp%TY=J;*r!tNGE9Bo zQ~Bd(@f#;3evcGZ@eaBDH8#9F|I=^0_Qw7w^30IiKbV)L$VBa(3rurBPll03Ziq8b zAYis9BW%v}tgwoMkR5Tb^pM=w$nh!Do4D9P%dQpbaIAi4U{>bZ9FbrzL=UC|G$6bn^hZLu>?{?|y~ycPLS%F=Tw|O1Ilk8Vvf* z{<(6dVE)kF%}+KpN=DyORHrgs$vB9AOgzg_CP!*eP8&_4|UVEs~bJ`|X(Qz)rV;870Ng38)cHwhv+ zN$?9|w>0a}bz-kxK5b{R*7|uWWhV3NCO?Dm|Jp(!W zrL!*mE~$_3`_@SBI$~wY^GJYp)Qcfj&gFEj`Fu?wL>%in{jyh7+@pp_kpAO=+?}qc3(7 z!>~10X^F!)wM~E3FXC@ErB|FfxV#ZEuVSbQAan%QAn8zxl5Wwhyen7ZmWq4N|H9H1 zlDJdcG)-L1N>DcuC zeFHTiP+K))cnyK*^gyl%#2?l(QSK)8?HU4GmB~m$Dh)$kXnQRVC;#I9Sb{W}-<=)L zWQorRw-@64AL`;51B2x*8UH~b@ z?Bo}>L0#nWYBs}?;$;aMm_JzePACX&TX5C!!Raw9>@D%maroRiT$)hXy>+erkgHuQ zM7wM-=pZj)_s;n`@vu;qvmCIjECI*1=zAB8Iu-2fXTIFV^AfJ148}TAE>&I?pc|#j zTJJfeIy|GBs>7CTSU=B4sHCZ+HJ@R!Hy32{zp42CuSWZs)lkMI zu)Je#4wvm@9Vthfvm)Qjv)%-l-C^&zZ(o)3L!1nPblaW7#1iauWN5YC{o?Tr*tm}i zm)sN9M$66?%m#oMcCQu@;;Gz6i=F89_=5D>Z%+;f2hiRX%DE_eqex$w<`Q~~&nv9o zGP3f=7=AgE+Z)n$HwUU}#lxl`h^yBf>s~6`IMq>WnKO|$RpQl{?=QO*kVW+tG(|T6 zIR`WLNogH7hEzR+gl9WU6i)sQmE_}Z7F|iUZPl;SM~~iBR*QyCJgqr5;540KZDgvXOq^L_EpuFVSb6Hrht0$W?4$N8|`?A^V zm2HT;6IY!zS|c7#lFI8Vd9wa^Mu^Vbt1p*HbCa_??mA6R>HJXsEr|Z4Y0>^?WcnA) zN9JPJ6aED2B7Xv$)*9Mt6kvDR_8ZqP0vhQL@HqX`;I^wQmT;~+KjOD8`YOjarz|(i z5iQh#M26=fnv+G2_`yS@#;j%*yQX1RmnB7YdDdptUs{fzyNOvyqD#1?BEOe`^0v08 zk9=F(D%M6Bmel8;t!qrKIW_-`?Z~jqe!s763Sbc*6t^|Dn5g%$DKT<6U$7dw!H4*D zS-p`L$9JB1hAK$aMPTY8V%ZkhJ!}7M_uOD9^$$50?FtaOFQc(WH!wgtb+I}h!D~zE zKog*~#%F)_D{>W13XW$Few-BS%O)s!fQ9iiyj4KXL_1zx-mEsCCjIOi;3QGUW*X-? z%1mNU+rI-(bbA)ww}tO-&mQe~W|7Qt&DO}ddqd0{6b1X6m2hL+gn{|Qk`~h+ev}>; zZ-6>v%d8estaXi*LN(v#eQ1jyjq(#VFA2V^?uim*IZ09I{)XsdYA?`!cbnMcq3J22 zhtKtyz45Qa5ow|m2WSTidv=c@?|={Oq1dS} z!?NKuRB5}#XsyENC9*xk+b=W-UogwQ=>UPdzeR_poWw)>i&=Tnz9Xa z!{P>={_)Ls;Ng(6r-)=;AdPLlq4c5bnJ?^xyRY7PI5*W3>Af-ERDTF+^${&xU#6-L z_du=JV8bER?EU>Or0Vx1^7xeh)=W_)+P~@gIVR)n3aOuP2%}%#CX*Zy{u5;$$eW>h zr*gKY@cpiy;qhh*^2ItGlQwr>TwK#4SjTJ=e6LlP#vjG<6^~TOU-kOsjU?dHnSNaHN4)S zvTLq2uN)L?Ra$LpVI8ajN(xRoFOe;(cFz*JoH}WG(B*wDOr!w}l~%+4wm{7Vx6omZ zwDIIBhTn-8owlo*(2V&Fgt)*ZiPAL1=-NB4L1tEs2xu)G`sy8{o?z^^ShLBqg0jW{ z*KsH3p_|*j!;H*LW}2aMO!jXzZw+L47~g}6yOt}#-tOP@67&)qEcsm2J0QksXx%xX znj)6Sz*(>a5eXyf7m?P2Qr=;MYol`|b+_!E7{yM8wp{OZ6UgA+sdCPjfz5(&Y1bzY zz&L0ijK&6NxfhDIB^MCSXU;MDjQrxlfxG#Xwr+ZXoc+K5h1G#+r{oS`Ub_l8BwaJO zKeBM`kDxyv{R_*m5|D7;L@yP(=j@kZ(jD;)#8&D^9)iDhGQU=-kV;cCs$0(Enpe?S z0+b&ON5v)NTYhzb1|;^Eux$`?a)tTFuLE52rx`R{#q=xKGer$2Heb!_><(MhWa@dDYeS2)O9JYMGNNsjIF2)wfPh#|xHx>PP@m zMYiY18g*zm;w?yM1!ep3rze%^BT8!o?jg!w*w7-dwrILwvKPdbFyTu@9mf7b!{XC@ zxm7i9!$}#_CAyiSTg_*>mKG^G^)75zxKJsTn(chmRM>?>#M_L5qvY>n01cw&rw{Z^ zgk!3B>Ki@bs8E~|jIkbd>Sr0P5(M8&*&1WIuO(wklKW|(i|e(vr`5yx%*wwH_QjGl z6~uo(+0w3WN8*LF7}&w=y@vyBymZ|TG;r5BWImBPtL$Ugi=A=y*tUbiW3Of^-n!eX z*%L3CB+1}GuAs#E^KhgK_z=IEZSN7S{rvOWX6?tRRrzOD!GmDw|R2VV$~?TJ$w_aA=2 zjd|zd6(ddDv%RYZn3T{pmRBqk=GwMBLI!4E)*iKswrC5I7rarFj|stYlE-JTOw|NCel-<)@k{ldI7$9ei$;$h)g_B~)nv9#V?)AfF2a?A zVz;q>WxG!J^=9=S!>q!4T%j`JGQd#cVqx1ZQ6f|0x!LH)i%MG6pGewR%aogat%M;B zeV(tMg9C%k`OBh{&Zn~J-YCI3Ys;=J>q(|wSP)tH;BIZIl3_=+Rn0nC1z-{Zn&$- z`h9AhcZ@PdS%Qi#N`vO$__wrfRKjYb~1+mHBg7M!=rbUHeh&x*rYw8OhtM<;K4AqWRsalv#O= zHNE=cxgprDp=IylvGVd$3E3AovQ1~YecfCRCd-Ifg^fyYC<%a`tI0I{p{(t7d?&Df zEHJOmGqo5^dapjB0&-L{>_u-`|AmrzGGiko%BF!M-lR~#w$y*o?do z+;FqEesys++~ab>_u1WoIhjT~xKLEDJWvh^gMvkV!j^`-wHOl+kd zXH!SZXA4Mfb&#R(u$)%0lxo~Fp!VzLceRd1YFH~N9=NQ5y6>*s%F;?m3nj{{|6wOm zp|I<0q1~@)E=>{=lRS>%uKkgB4SE!ju*Jm_)kEWPpe}tuon2cx%ctlrF{tb|q-Wr1q>rHxc6)@y4d7;lx}7!gMQP*TP>QGlrT@Us|L<)R!* zg6>{sZNp*3C_l=Z$!|IG!sNrj^)dM(C0JrX{oxJv*9%%*kEeU|@610*h|IU7LnjUx z>qhxb<|{*xAC6UO`|BDOa;5HH2Xyw;%K_qLXFF&fY68(SW+=K?Mc6>5q=y3`k#g+^ z)u`AhOdy=&782BN8TDAnTV#uWZ7ikM3h~bv=F5oHjq0B@azxOr=ih z>TNH*kH!kR9TZ(Y<7B)3B8##wg4@giN5JobHAi()YW$PxlOkhH_KM6!L?J_xcrmrW zI5;6~*I!s?K+Wn3I2Lz(nRHlm)?KidX##~Jz*Kfky_v;o1q&k4cKBX{)SYbcQ_yOM zRFu3OQ%YJGjOVz~w*@ZP=x8puy^yA@clByyUw@L%Gg``saf*+qVT9yiXFq$R8I3{T zYIeB3n4d*|e9A*YF?Hs)_cv+Do{u@1b@)T>!nah->M9bpOP2 zraGpN*&UkGon_xxX|fNR>LProXwwiLYndz1176wrU z7Wdmf=QqD%@tleoSsa<+!P~u=iH$A)&~_4tN^-{ya$|BMI73&189vuM=A{Z^GHpHn zL{48lb8uqQfD?a1{x17L!Ec6|cdWdx=K6}APs%LVBkBTNU4s!3^s?=)Sv>VU`ztb5 zFgdRxBWX)z1~%aan(KxuECR}^$sc2+5r*3ArFKohniBWe1aD>^t+SGMmhCfm!3qtG zf4SPa4L|c){6ugLHXA7^)zpugo`ql2pH1$JOs>UPo*20H9p^ib)U@C@P{TuNkQAXp zeOrxvdJuQb2`iEBiAd@0`n2KDikYnFXLX_VucWH$gcKV(N*Qc=#vzf;@ZFzsJW({! zE~IGOQ?McX+U5|KxthDdPuLhdK)7sKxp)_B?J&dI;?!)_r!KeEL;zvR7RrzedjI;- zec#xgX3HjIPzdhlq>OS$Y4d)(iyYE7Uq!+=zdnBWC0F-F2bLH7IjVs64f08BSqB(; zm7YbK(he0~dIRf&>DVXlu-&oByC>!#nkm2p@UXcS%qEJ>%9J-zPwY)pBg; zkI*HV%|8_RC_UQ0JGbzVoxXN5}qcpvk{a&z{05|)%0u5az%!X-*3w-78nxh zAGdUkkBS{)tpFgD{vu6!;q(&9(?yA7sQK?>=E~PVuG=a zxq2CG5wCtU@yJXyo_1bZ0obG+_CkfhuCJSVV#g8CFm2(0f?WePB8#g)Udoko@@Rs~ z6}B^$?e~z4``UOI8K{((>MMLhZirV?ZDHt9<};~04#T_cC6@=11C<~!3(8w1)Z>t5 zWNl5t=k+HU?hBc-sS6l`tJ8@30FX7VX@8n=^HSQ9abA;EHJ#uv@Q^G&SpO!T&L&g$ zkU2~$?VOMIs-2WC_>pkY$9Tk5(7B{eVyn0(;Jz6#$amX*vMqYz^|1GQv9S}2#ha4m zwtL&G6{e_q8enYt6%ZOmc1gF&!4+z8j6rxG*-pH^{V3KP!;@fE-pHP5SpE{R>2v$C z@hBiS_R4DXqNoOEatAo{b{pb!Wm8tvKEF4&hj;b)gx0kiqezSzpT>LZgw~lFP7TG3 zQl(o0P32%;?x_0Ju^`csTs!cbDSk{Ji*dWPbrM|jpb-o|%{|wcJ;w{AlspdU!*F`9 zv!0%U&&dsLV&d0W@qH4G-;J}~TGb8-3mralQD1w=bOQLS1T?jVa=VqKmSdjGHQs_6 zi_{#Au&c!3jch9bIrzu}QO1jScqB3#eV7pt2D)z)#o1cGJY>)3{tBQXg=GtTMZb(f zr2AgS>V(^$M@UBWx^`|QE^V|TWcpSHt}k3`Y{;1amYV1Ie%f|efOuJLPs-j+c|H-_ zn}Lu$f19tau#ry1Z@-HVvwk6qlNQlEJr-$1i>3{hXiP>61LLXgMG`I?*&n3^j4LBBkCo$UZi%hbmo zD`(jccfl8cUsEiVPuOgClhLBOyh_KH52HfjD8IDgzVClr0kMey?hb8QZ%%;D8tc*k zml(3?#>3GIr+(XH3wHSk_Io}%`BK+-U~AnLXC@bOs)m5}r{4A=j51!LFeCSk1c-OM zX`lCa!BUzjPq0{Ls#@&IeA0EtRqYuhswZc3C1vXTfub-$qe?W`?J70(0%MxL{W)-P z`QpZpC30nJag`Xj6(&nbCmNtQWT2-GIl<}>Nm=MDL7X+b7aP#>4d;%c+XOJd=UHsY zlPh=4uip4q@O>oQ@%jWxnzSnlOIH)IM~laBo~T8>`dXxRu;J~rVTsZG2{$TS3V}Lv z5k7AI6bRB8R#BOG%ozh-x&3i+cVKf=F{8LvhM~?rxnvK3RyJa{{Cv8gC@BQ+lcL1| z!|lMnqJD9Op}mK2L6pdH%XF&kE;-=)lw$+P44FoI0)SnRxOiQbV;AU6(Ey*G`-(q5 zR<{xud07Ms7hLJ$58~bzGR8Vp+)lD)s^la@H^8+Dr%WKeF))Vt0NbAlOext866cQz zvd645;R>m&bT$33>oIn+iZOFRIwB4yJFReEcjs0TQJnjOpQatL^- zjNaUi+!pue#oedEj#yhJ?ORi$E>F|ofBl|QWA5EO$;(dm27iM9&()`(-+cEkGAuUM zeRNqqyMdDVVL!bS#!^9wrDF>xS3S~d3OCZkD&q%`4fDw6@u z(LtUS4ADt>=hg|TJ_!L5PD>9aW5yaNNMs8j_9;Kt)xfILoYfN^TkTWA5wCcINpsmO z(^SY4TP_U~t(v)+&HCmOs^{&<3?A)Fc;Xv6an9joaaXK47FciUIti7TaTw>S3SAbkRQ}9@(hm=sv$ZP2;p>|?tS1&3cgxY zUY$MzJ-4qAI`S|epxKB85G>)lFIc{7`aVZQSbuuhQ$X|h?Y+LG#IODl1*76DV5Bl` zEUCx-Z3!>z#JauAA?)~8U+tEmhjvKXz}rT0|C~C%Om3GN4oBlC>*kz)ot?#CX9li2 zNSnwV0Jwdqtw!Qj4R5WRY{&Ng+am!Co4sBP$7IeAHJGaek%H_%$#$XQ;wHods3YK> z=@eZ%c>^Ij7epe=EUojB*7p0uivc`vzpj(YL&Umnu@!Mce%!(-hXm$j%5JV~+L2$N z??{wPdsI_ijQq$`Lg#}%ws zNasSza%1)qwz7`%2)h_+%bq)qRA*C(^v?D`9VKoXdMC>906Ysgavj4Rsgr#j0IW+= zMRD;~2VXpK;jP-1nCvbTl)%myi#WrW^y@ z_uheYZ#AfW{ZP0Y3EFwYV{JMI7KW||2YLSSsqY>~g})TT{;aLgrNmfWh3kI!=`}^$ zk{oY_S|KoGhJI{c_j9-Fa)gB{*v$Uso@C#YzWnO)7lt6XUy8Wbv6auZJ@09GpzxnN z`&=H+z{SElsQ$Dc35oEPY3vOKzN3ZeBE2Mzv|KT!(zvoyv-_=7!-0if zK`ag%51{Nvlr?9FW(0|z81v!MlmvdjXM4&|+fLU>k9M$8KqWf3dovgPw7jGgBw#vi z1U1rAt!ihQxdELk4E*X-2|cf>f_IWO7C`22GmC19hc`TD?bDpSYy(bV4x8`VeW&>!Av$HEP+b^ab zeLIXkEFk(jI;y2~DXn8jn^{Sha&OB#<58v4W?{<$kunMeDR-;DCU@Ig+B#DRDSwCb z{(Rw#Qo{QZAj!|KP889M$7aDHL#9Yq8i^z{o>)+X@4VJ;&f!L%l5XoT{Ln~%0XaUO&C$5>=Z# zyRe({gvYm1PV{)WZ0^IN4+oZv*ft|)ObFZ@Kr+*8@lGPP<-mD|Dbp2T#fIvmM0x2v zZC%95UUggz5P=H?9PrVE8oy-=Y);C66i80ApTaE4&%R&$Q!xq>9NZI>4;U%P9+B$1 z4;^wo4}fHeZm1Y2%eK2W-@ILV91RKL+a+6I9>-N6Sj4^`dv-6ZGVSOI@bJ_14Uf`# zgsRBxzn3l2@s51?HwSp=G(R={h5cS1Z2ZM<4ThgwAs5=^Z|^e06x-0xm?|Shu=0T!b z&E6)2(TJuUXCJ64rvD_lHRj%673GuV{i)86u11;r#BZwx;VP0zV>HZ}h- zfqi#2>MRL~S*^5K#j)uYR}B{QTDU<+zHv;~M;3iAwAY@qZE|gEAE*a+$or>DlIjQ<5TK#=@$| zCeCk=w;gJW;fc+$J!vMBd$hH{5w?OR~rbSzfSfFmkl!iO{};+O^g(Ot+(;K9+&mzU@DQp zdpZkdYEhZ}6KyeBfCn;<4MDI~h~U|+1^T}kbDRiN!l#co%_ATbWciNq91@5?+mvqX z8WMC9-VHp#`?x>AI+*5BQfXIKKTdMKQhDLHiPmgmub(+DX;I`9cycmUYC(WQw2iZC znux@LoTwK9H?AHm_9~P-TO_H%nQg0itG>VDq<_1UCII_vV6uJ0A${g-RU@Kq9>!`p z<>RJ~HG%^q@H*3krCg{If4=FF?>PnoXA2G9>OG0I!lJW9m%paf9MpTRwP?u5i3d- z75Mh@iXKMrBehXSartI3=&4I_;n8RiFz%w!cO-`4jKkozT1jeu0Duy|4b8&8B%bb_%iQ0a{h5a?5mo_u+s_NGH+6%er7svT+6pL^FM#68T{cLYO(eT z&>eplJST=0m%Hr(-<)TaE?t-|sF=XlG6nNiRT$i`0y*pk$T4@y?z~cUr7<+8F zeKCw9fQsgT67M+(_E^uT^^G}+cA=$w0p3nKC##^LcDlyn7J&6TlS2r_O9od7e8X;8 zG|xiKH(;z=?*Xv;)oV*s1pGDKZ?m?68x=wHu&M_E+OckQxKUzY_qJ$P&C_gxVq*Ws zG+b?602m?nf7c%Hz9|HxbHQ|h8+5Nxq5{O`W9MZgw2a_-%>|{q>SWE7ui){XKmw|d z_qWROswTqzT_AC(k(_xwnBAr71s;}1fG3?y2vEsQw&T|?7qf7Z)zs1krhH_M*Xh7> zQtl85%Bnu+W|Q#Heh|%sl4j1_ua3i00yri*yJpR-HTEYg3n6GRE!DIyxH@wbu?6UheP}~!1zOqKF@m*dnDR5{=7Y3=;i1 z1LVSqd<7kJty4D$i#2-{bHHaJT&W~33ha?D&K*(=onM({4|)T+6PjMV%}^+-|Lvv- z{-DdzbA*1D8(vYrKxMnC)S3_BzB}Xb2RXkQYKPF(=(NRv$Ad|VB$_O+ag+)tK7#@X zTccrH?6z7e!BwWUwuO4-fF<9;%q7-du!eb?%{vyhFU02C*`1$hFproKiGCUH^V_$H z$S~J6lZKb4{|-oW28S@@=i;3J{(*;@q(?HI`mfPs+&&*xU7L%xVFC)v<9G6zBwGU`oNImqObgpxcgo>|K3{cFG8ONOsPj-Si#X=O z+rhQw&Dto*c$9~uX-e`Twf0>_dpvJ-#ij5<4Rq0+PC@7Co6g9+qYso*2{ipM`yH~t zQe7`|U`65#k>~EX$!EwOsSnBw!g?I~Y$z;}GL^?)vNAQG>@f?-mWj03T z!sGEvgGhUU{UZWUI;gh$F@c%>a9klyo_ia|zH0I8{?`t2;*sn9Eumt^kLOD0lcTvI zuTQ9{)kyf}>$dnUL3CQZ^e|i>KTg)V(tBP34~Jl&zN;{@jnFY{Jz)jM5f^3HP-8-d z)N@76OBz(ziosdvfsUf9jTC>x?Kdd?60<5j;fWO>$w{dlIjU5Ek3&e{VGx)nt`&Ai z!d9%d23|X1J^oD(ec~-!TS-Zyq{z>m`Uik0e?M(E`?DyZ$Jx{V>vtCnHV>cdoroh2_iUytcRbD}xHgOP~T5nY%OcH+fWq8ec6CY$Oy2Pqa8}mOY+=Dr4LkRd*OBw zxDRPe?=LH-C&1r&sM>}}&o7|Iv4<7c>?A+MjmqB^8zKapj-MEC!W*mdE+dS)-OuEk z6QqVGVhrZ#Nmz&4=1R6vPeh04?-(51e^Um}mcJa=6(Kt1Yf_pm2)+BesVU~L|Tzv-R#z0KBxRWTAMR$1B`Ic|v&q3q0>3TrRk#;@J9oGxO{(}Fq1 zBmJ6;Kr3-@kF*M>&R)W$O_aw2qtL6HBoe~2l9+9U#-Remi>uU1kOpWy9HSGgxrm)Pr{m>UmG8^WiI)zrSs z0>bD4mZ9ugy=+|qPu=P_e?T}6quQ+|`w#j0-E`jLIk9sikIHA1VNW@H8tFW#(FSZL zp<5sj;CB>ruc?z6#oZb51q}{1u;ukTn36=(L@j&Z@P<_g-KX!xL&Tl?!5It$I zSRZO)fw_a?VzB<^KdLz)M<};_oAKxB3E5;k9OT{fUl5*BGh%+!vJdqEJS%;oUQo*=><04C_eA5 zB$|2F)Zu+BPO0f+>-v&dC$|u3Bex4q3~SI&ZynkgXP$+VB*t|*ZPwAj$&URk|FVl8t$lbBPpPOO}c8*0h?B@6wuDZIcq4yQvwoM}C>RE^`H^RjN@+dz= z+NGn^*!LmsYh+H@ycdXmrP|b((t7hzL+03}AwI;Bm}@-OOB4x_l);Y0#Bdi>g0SW_ z6n#7YECaKQe=9?7P0B(!xdG6ZWnhjo46*5V-u|*&x}{RLyJnA4FI@*ai=!p4I?~b) zURimnsCeSD_Twe7|5!=-fpf_yxgvY(VVI{^GyA1dboQhNM6$W6nGT-!j|lcurGl(` z>}FKe{sF1mkfX3rta1!-IxJIyjBOU*z;p!G7L_e;6etBI!L z)*9Q0rUq4b;oeGYJ|EOzo3@&}!FF4k&eW%xzW^R?fYp0k=bGqlJWPtvwKzlypP2Rd? z1DG`vjs``h^|hf1+Wq=A(8DV7jyExvfYmz1LA*oV)wVfr+5n6KsblMuHm;q z;ctxMHfDms1|swK`0gE}tED70b&T_Rd=DQa)gKzmK6}}-pXlkhUUYs~8GfD+>v8tC zT8X2}?@Tqj(g&lx+i4Eh>A<krOc)>%g;v?q4y4O&+U(en z-cFD3)96(-vT-+-V3pW+J=ubYEwnnL1!nZMOZRYT&U>D&f#b*7x!X3@wMJo!a=;6- z@be!KSh%y0mqYX1MxzHe^n+jeZ;TA0>k(n(k!zPDSUq~fuF+FaPy@w zeIr>{!bz{#K0Rjdd~W)Bax-72h(Yy|&HDy2JOm)7bhKg__>74Vv-ynzY9+(F*^xZXA>~iw* z!E}-i`T~4I+DP?d&?qYZ$`3smaSFG6`#b_3)80SM(535P-w2BPs+%O<&{d?c68BCQ z2t90$3m@dI*KZAa_~?yTbj52d)1Boeq!EXVxCY-<7JTtK+DsA|9`MRhvjQbeBvIG<+HCow}Wm_%$6Y9!rH9qwlM*N7EX zI=rc;7@I`Hh%UHZwd>wc3rqG1sPi1*PEu6M9FA0K-2TXsFzbiN&dfx=D3?ISyf6#} zY*0GfDEt5@bLy;7y;&_=-CafT=(E3qva)CKLEVm7i`>E1v++u(^U!pX-t5aFdjV6} zHYnoh<&1IWL4$R@xk9>q1&3M7x9=jKBE)VdAs%-~^ecU9EvTz!07<=HlOK{ zdc*OI<85Nmaakq$aSBMP=Hp9`2`ehV@@u|1-2a)()y`7BV=2xn`6n6LxtAdO=M}UW z&B?36Bll~W=@F|An$&)ku5iCx5Z(yA%=3}iiO=BuF_<4V&cAa193zO4(Ht&QWc|T^ zK>DmA8?7rG)kI{=0I<3h?o{2!A($YP3$RPXm+4vNN^!h;w1CVsxfpW(juRqfTQOLq zmF`kbp>pjX1|v%J&T|#dv@Ys?t9LstGWH~nih0nVkeKfqubE((yZbQ;dlC0Qe^xQ$ z@;oHl*D@9!CdG4-8K?4r$04vt1tW%Y(g!ZvdLagq=vGAuLWWK_~nx{AIM6MKeC2-_qkv#hA-n-PnhJjUg zG2@3Z-qW%(`dLZmI-r;qti1r#kpZChzI9su;%}H|e=4&-nkQ{eBOzZ$=pE*3@!BgIeB$!`60(a>?=2)Kze|EO$_hdm@dNQu-8-Hr zY1DA`qmv{%-HFZSR%M8reIg0(8G}AW_=?Es^+Rsb#|bvt_Fj>@i!?v%8TmCxOk3+| z#Fk6Qm&`y=pOEDfH_ABYAd`~!Ve#x%6YBaeM?w=|pns{&$yo0Unj+v)Q;>G0xqmCU zo#|f|NW-n*!0v+r~orn+6h;t4TmN4#>Xw9X1N+lSJ1$ee(J;_qo&7C zw9-My8)@#+K_#aZoTJmYTH{^Ux7{#UioG}8LLMR-W%8f~5sge|9%AE#kZ5riM@rDj z92hzWM@tUiXE{mEcS|FT%|v?&Pgy>)7n*DEo#M=(3}i{Ew!hrO+_gvKpvbu+z4{6n zx>Kk$IGc_q4y~CN-@bk}rbYhPSk`50@n-dT*V-vWONpXz>sYn(#hVxCu=^<)iaVQ< zHHw(6mYn&rg|l>dikO5M{G;<`cL^%$!uqXou9a{mMAZ6U{YMX>XMbU@U8!ux%g>!% z^PW}|amL~qMyvG33JBKH!rJjn>UP{#@*(KINJttgw6>dY&JA~hKf1s_`5><{T~(Gm zO2If^`TLhQ1kea{?`NK+55;IJu!ia_KUe^~*k?HV;4Sx)tYZ&(?3b~eI#`pJg@yQd z1&iY2(R`ud)!WY~XQ0!t?$N+U@i35k35B~NQpWf47m6@@u*iF>6;R2(fUVM+WyixlQso2iX33q z8>#2H)9N8Jq_mZrGZ1^6lD+U-=|_tZ0pjaXOxJ9=;L{++%f26=OErb`AbuaZkcVQI z$FAitm*%5m^f%^hDL$FQqmQ5& z`qK!;HIHsx+6PsX@K!rBc=)!YYG?pws={a&d|$l@{D?8drs?~1u}BFg0LWRDcSsQ; zm0HRSQHjiY%Wm=-rBKIXdVGnmbvcZO2I5hENTPXC|q#}5#P*h zFr(9P9lya@7U{YhC-_|L;}lK?78xY&#crp+(KP+Vd3g{3PhGlV&WAnGtGO|z=zArA zA?(QK(?plvi3uE_OF%1uLT+XfAN(BA%J*bajH}Hy-iwiqnV`VisZr9;%K$pH;>`G` zzJ1$^k%Ya_(DZLe_(#grgU(_TC-;&=q;DU2DWgXz7bLgrzZvoWxLhw2z^BSzC&gc~ z7`ezzf%ww1A}__-^6(H%!}N#s1Rn@w&KXH|ASx^ak!Wmu(?)4xt4}JVh_3O=iVI;pyza~gn7g(&oP)&Dj-69XPa=M=EARMX#o>TjNUNXynYU4L76 z7AVW)^7`Fd#J!vEPj0!@V>W6t_KLw8u3`YwXQ1zEA0#8z;{?<}wn4R+G zl-$;Vr29kibsmmTMA}-DlEz)+(fl1Dj;RyQVg=$a+VVJQKcy^VUz94IwPW7m zDmhvcV1JRai!^I;DUrX{E1rg(Gw34zY2|MM zNJsK3FpF0>@SUE;GQF3Mk^}eb7i9cKRzl576z}TYXDUCX`Z1>L32HMNu5B(|qt$ca zcTw{FwZoGxF7-XPhU=)!#gVW_S<`^y#aOlqoMpiWKdoh+X)8|y&Va^R3}hcHQL_dy4vvIhc$8L8-<%AZHDMyZU_ZJe!FzPABojTvRdAywHu z>TNq5RlP@^8SAY2nmDfyyS~w-mL%x8ZtYj=HBO2_?iN}C+5#@@%d!c-++62-0d0t* zq&yxO^CQ4ZvGn4ch*!HQwdnJ$)!IWd-M}`0q!q1oDMFimXm`IjmKio)MolL;V!yDC zXti15mQ5H;I;p4Ao$(q*|D|!i)jS+tp51Rpq0xn3JU+6FCPK&O*C*^xL5k&Qi2PKr zd`ugN_5-f{e!D6(Ti9M<`nkbeSJ&uHr#yB|$D;JDr$};Fp#=qww2UfEyJ6)Q_?1@o z15d+spIb?Wqhq1|>vY}$L+?eqbTMUIT*k`}j9iv`@jf;aM>d~KgsViO4+S-C5lD-* zGUx9t1^ECCsf(3Rz@2iIW$|O(`ya4lfQdZPaPkIV^b|vko&SKcB+lre1?go^+q=sWgwzz+K|2*Bt|0V44KLzV5tCui(^~<>2e|p65$NuOf zyLug?`O*H(>9lmVg@?~u{a*9lg!VS_T{QZ<)02S96SVn+BE!Kt5~E>2qqv$opQ|~0 z+)}C)5Y!EBJq^J*NU1ZU$%5`6Qi9ElrLgJy{WOe3(?maG2NiY&1i#Ccxg!Y3A%R^b_>O8AU?w5-8*uM*N@uhf;lgN|hQqCKbdX1QtQlB^FmuSNssP4eAmYR(4@ZFd;H?)J_Qw;~71 z-P+`8FEI{3b+Ks<%SE$QiCk2zLySho=zh*-oB#NZVBU6G`}0VE#X2nK zLhd@X{(`k5J-TmYv9ilhB4Kt0C&W;B&B=mK{uk6WXf?0Nx#0dauVlSHQ z@Z@H+kE&!Xyl^)OX4M%(O@xcU_*1+yHfz8Ld&(1?B0-5KaRErWyU{VX%7tKjaYKM| z^@!cz)C)2cAZJl_jxK~5KyG(%pfj)8*-Y01sIm`pJ_d^@^Wx!MpQt=R>am(<>e9LC z{V(}nEA?q+kP~U(`Zv*o*M8RP$Ux$cUdiFJMuo20U2(LDtjUqB!`6klRPCh}c@|QW z+3z&EuTonw!IY3qIR>^+wpw?M25|5^#|WK)|GiC8&x}%Yt>k`i+jDj8+6n?#pTvf1 zjzA~Wa3nsCR8dxOUWR5so2Wh+{W46=7@=t1bz6*D)It~rjq>jp5*jA>10p0r z1YBlBnF|}SzD<-*?%MX-WbB>FSODiE3PD&Zk9Qrm5u6vq4(~ODxx$`3T zb^3CLKD*^ASLQu(jGZuPo9TP#^)f`gt35@4*q8|s!8j0u!KbgB@!WLcZ1RilC=Qbw z^ib}IZ^m4J{6+ZfECg~EDH)CQx~IMGrOyZRqu3%1E*9;Nh{1@{9HY8$Kh#Z!J$BX8 zIge#Hlt(co*chVfI_Xh->BAdtO*0hvW$@BKy_D~6Nk3gec(_h*O)%t(iNlW2JKZ(> zNH`vhwGcaH7aP4fTx0ZVPp{MB<89?RnBRvrWuPtk^^aN$YdfySg*|q>+ma;G$2?6B zVqBlHI;tsdTlR#~j@o`)CAuoHS(h(~ht7fTnWC&i*oTaae!Wn{!#{~uBn^9)mCbk@ zx71oPLy()zwCA-lV>pr4K_5o=z_&?CCoK?-Q;ykAiN#X?$zCHb=#jZ$}W58UlFAzP<`6gWy~{ zbACAW_D757N+k~dWeSp>yIVjY-#(Zx1vhZ!CT9Nu8P5me%zlCAl17bodz7aUi!Uur zn6zXU8M71+wxFy@2`}$^Sa87MZ6lpXFW$X&-}+I}s$u4W&{2aX)vO{<&&7{p$*=}H z{90M_QtZXcj|$Q+Dz9wN!1K*d#Yg-6@@66-7Ll*f+=%Z015=C8nXJ4Q$rNA)MWSGQ zBJ3|7ejoAOxdS;;(PSuKR^p29JGt!b_Ozov3}W{D0Xa?P-xDPC#$w{-Wpj&;aU8us z`U?AIB%|YCZQqq**vzeSx*Ssi_KP4JT}|xj zFuY8vX>|oET}t7AT&&PsCahKOg_5F}l)`w`6WjLw`T!hJyj6n=`Z6!|eUhK{>2y>{ ztd;DT^ezjrj0QaHLpoI)njV81tO;}Nh)*J#@Rf^dELg@~n6D)XCy}IVzRGzZK9t1> z0e^#7=yxnrtqb*B;quA-)2m5GL4MW7+J@#@40%fjOw1d%(F<%YXzsjujTPAEZ5+<~ zSZbp1Slz~h`o9<9?!9Lc&xBE}Mg=mKxce8Ph)E5D$M-G3%b8*1a|6f>5Co~TYTiWe zL9GmyNl$%mEqI@YBA)MsH?$k9qo8}vHef^ZC=qfTM|iRz5YaP8nLxv(@u7obQt$Zr zg3jQ@t+iHYpu7ZiG*+ZA-MHV!39HLH2C_1LMhITii>H(P>^Y{A)qINM&oIXWd8TnI z%Wv;K=0y5sjB1ZgHPL1r;0l9VDm0Vvn2=Pw>kib`oGilHIlm3v<0Lvj#BvqQqP4{$ zn7DSVUn5*_I?p2(TV>V$cp-uDQ-T;^5h-PwdW1=KqiS}}E0l?ub18q?XCVq@c{C^H z?r0#1XGt1W3^FDr3XQs(9EgsYv0i$)np|J0#!zL&*KzLA$S=K~wn3$-UmO#2KOLsu z&1wIn1go;*mWu{+JV>vCTc@!|Jsvm5rsltXd&24=r)!A)f*b{S*?+ES!5FhVnYf-& z45!_&8qj=CdyUN&c2pen+uCCEB{xeI_dAO6vUW}U*JU&9LWEkL?GTZ)I$rYg{8UP6 zkLq2F;HX9{hdDbK|ch20FfzQ84^If6!n-81tFyZ|Ce_Mh- zM)d&1j8(WXjkxJ89i7C6zQ%K!pJWiBDG3IB!3$EUWEYcGB_y|vnQx!Gkj zIdX2MR$i9VH<3AGwQ6>e<~8w|dr4x_^HwR&+qyP1d>at%ms>+Z>K@T^;5Y)0foqM( zHW={)-V9+x>y8Fh0PVV2ZkSP60CHI$$DMi+GA%vcMu!lwR?~Qn_Q{C%4*tEyzz4}6 zYJr{Y(lrXEuGK|Gr~La~mFN&^2XW z_*u8`+mfn0U5B8|6-8B$4bj)!Hy7_hogQCtl_*mlh2>_#`Cc#ct_yb@L}}GLW1c=$ zb$oVA{<3e6q`PsE7t7PX82@sxHc2wohk{LCtCPL`Ij`b8T~Wa|rxkX1MekF&vLI!L zbF@IA8+t!=p2JVJvODh-@mN_~T^q5Rm*M>#`QjuPELTtDfi;CpKuIbDh@ElI|W0PFdQOXFOftkVF~A;3Ta=N zQz~MSO3iD2t)RGX9u8Sc#Z^lf_JE2}KnssLNxM{Rv-Xl?qo7(6ua6;` zF}G9qcD})5V6D%iQyhZKn(z;j1GIg+L%gJ6BDuGQ;uG5!MOC+kza2e|A~HFdqU~EB zS(%cox0_WeCO976BpzEHkq21#CF)5rIi&dz)Rbs3Uis%{!};DX^KJlxn$)ZK@)k_7 z%#kNEVrwt8rOYR*aAPqRB*N|BOp_fz8H}YSfd_28=|d(DC4jQx5}%G7_v?O?co&o$ zdLz&8?om%(1x3HD%I0OcW{-9YXz00>#vD^+jnnRX@QwAuHMdE_K4s+;bxrj%Tv~Ar zm?TXP;B8r#;BE_tG1kOD=k*6YtiV{Bn5IKfl5aLQcg`RL=JX;okg|$BZO{2o_t2Us z&P_ukR)a*TnKMrNg3fYrvwO2C;i~6u^aY=tmX+k(*-m-3Q3&cD1>+#E(xOvI)@6FJAzcTNWy*;f0R!Q>|W%uC8F}i?!;E6ZnO2p zKzl!gVmY&V%B(jtf10o%;NK|R;L)brD0W3?_ovjwHT2GgSyteirePejdeI%VU$7ZQDWrz z8meP{lj>Id^5qk&W{wYLM;j)~8m!+HKRx?~SlGUwtU@JM_hDBm3vdIqIqTb9K>)x9 z^(Wr)GGCnM^HSkdF$m7d9}wyd#%kJTB$&^s`7!=ftCM)Leub_CzjB5u&WfqSkOqvO8lAg^ zG>|+nfi*PZ=nWnd@+I4Q3YE`h^ZH40pFiug_2!F%Ci(2FH_ycrEv;})mx`Odt)3da zxghNcI<#V<4tG1sivCn(lGob@%h+d{j6*}~nT)Ul; zrIQ`Xmypqlkt2{Nl%k{0M#26XX~8JKnkglmk|duI!@INGW-yxc^7R`JSH}16bh@I%>&cY9Ag_6vZg_n# zK-JUUi}&>ii9P?WEFHcZ}Vg{jO`E0>kaI z--tZ2>dBiDhi;TBT*$ym!)+M8Bt-e@!3_(+6f4SgwdOk!0nR)q|5~Y)Gw9lOd%GqF zCWhT5k9AfQRjd9r(kuY4c>Qxmm|>VZ@OTwt9UPqKWA&e;OAZ-MKH@r$%ZDeA5vf`^ zE)cS5PfXy+9RGsLcg$E}*N)!n9!#2#%PW3^9K1chyf4hOjkl%Hs3(GzB(D{eGnEim z<2gJCQHW#z%Pb^)= z7oTLdeSFMDchsf^NYzO{!8T)tJm{T$PVjonO%>QDWY_If7OM*KGL=PtjKKw4MoH1U z_&naWi)R98ZM5T~f zcbbB>tVs;~Xt_CN-+xNzUbS`O=mht1Q9V6qx|Hxjfn^AZ0;l|KO)Ywp$XgpFKTbwU zY~o0YxONGp|E`_OKPyZB+jn^u4R%viI>iFA-?)(~z1f2?%c!knm$AkTI`6Tx9b<}y zLWi3*&3JkDbg*LYgY@V9v3mZAZ^cIKhBOa~&%BkQ4XW+YbEs~Xp!yw~01RaeV1}c+ z5+p#=a9sG+bH)mHwvUW!lY0pLGC!WPd8z;J$4GQ=mhV4$P`Ho7H6I&V;}RA0KGwM+ z{h~c*YU=0IB~Qey#<2OxQ+%oZg5=Kcml0c`)1`q;Z=hx~qUTx^&5a236e}HG1%$;k z=L&z-Pc|hAI0u#k)g{c#{@Kd^>vu1?Ys&TK6v4Jg!LIY%ppEyT1a0GwsF`3~Ij5JX z41M-t^w#rU65^{{GosWaR?L|b;~Jm;lUn}2d<}Q_Hv^1U|Jld`ZeY<4dmvV|KzBWAFHNefsM>p{Q#=GKwOD+9B%p?B)zx1UII({I%Y>Svkj@5EI*BXCnec#=;H{3|H-rq=BvOW^SWCY2 z{+0u!scU4dT0i`6^ziWo#&tR_6hHK0pj4K(DIbI5;+<#8kPdgkU4zK?g z*ZlZq{y(d`(;^`wQG@Kw;Du#o9EUB2pNAT>9#d@Q5qliMTg9|FRYF24>6Eveze>oE z{Rd|M6|uqRvT>`p4V4rz%$9Bn%otz0-m%Hnd7RccpLu<=2kMxey9A!O(4F&wEzhRT zn)nYBoFS;@QzedbUE}13hE<_N@ZsKBrOGttjV$Kv64F2j8w~6sFuGrC5YT+N+=b+N zO~S%HgLk4Gs}lB|CjSMdi#78rXiB;njjmLBve^dD<#vIE_ELbqc|70mT$-h8T4WvS zm)G|MC7O`?@a{pKUnNIm4YgL|pM1qF4e2B$Zhi zOQ5Ggly0X$^Uj#qC!wCWJTh64X^5TPU(J(1l)ei`5Y~oZ-T#h0wj5WH2`RZvR~RcP zwmNBAx{=zPttbAtb5UH78!fZ=_oB(Cu&4{?a^B5|(Gns)qYV7Do+d9m+=YVO)ZMEe zD?^oBFGJ7m@GUs{lMX57-p%~eNC-mmb)nb74HfRzdm_@Fnu46@xy5{n8W&_b8RX#o zZ9;x6Yipx-ofz@Xg5NWcNl0fbo5YMMmjV;Fq-cMg=n{QLzrxN}r--R=A&OS$2b%Ei zXA3=SpW>XVkwK1$e&_Z|%$OQDm`@ zgHj?D9S+T}{1;vBy_yfne!9FX3MR~ZX=G9`734UW zQ{|ZBGQJ~}$P>(jTrT0N)|NHO4Aml+KrqQ)M)E(X({#_DKVH&O9638;sbOF#z2vTC zozqfu;qt5_2a^)pW>ep3m<9^SeO;H{@p$zc5%2W{F0n(zmRdBpF^tk;vDGVI3%pI{ zW*fyZg28DxSpNPCdY5_uk+w`r#`=W(6*8UpSMz5&*kzdcjBLGDSofHyza||wt8#jm z#*wNF#W7cGOx-^?H~;K4n}EbRJu}*Zgy8M(oYHd7>i!XS?Z|;j5u*Oo3YxF!qU`F% z7K?@S`Ww6X6f_x#%q7|7<#kQzLTc}-B7Tfu83E+b?6sA*TDQRia)og3r8m!KrR#Xx zgs1ZYLT}B zP$`G0y?;j^=*z!^l^HuC%cF4-s_(3i-0M1|7!m?;^mM=Q=-vE?eV){-|1n<(Wd!m5 zt#gok^JzZqE*onccJ`lPikcJ~Ab{Z*5>xRvV1-ou`;>tenmad0CUZU=#0HSX{D@Zk zh)~Ztum|9O-cLFqS{*rt+yraku+k`fq}ZSyQ}+mRke`JNHYF|q{zv`W!OI9~Za6&I zDkF!sSZLdYd+xC%#YVMpY;KY4Y=wq^UhlKo5v13O$yjcEP`XJwjo8BNdF-|;fsj{k zxxU0VC0d8Y`M-7&yZd0}?ct@o$%cGfkDESfMnjZeEW$l3tTbP_`e{Azk;9*mFNj}|BSm&4?9*t^ zhD!skILeboz^U07I4U4ev@paZx+RCAG(QHA=}~|UE^;J~cqcsW6`v`*MIzuF@tRfF zkI)kCd>q)$_5#Ki{erLcjm1Wnw&C&{EyfzzZ?ikRZ3x1}Uo3pyeVuS>3}e}=7#d?y z8Q4gJ+q)fWPWEVY_i0CLkY7GtnMssyq51i;CeS{^iSiHVeyTj<@#A=PGNk%xtLWG^ zgayxV7jZpF4GQ7ayZ4Ft>aOxkRC?o+%r~&*n2z6@?^?1UszW9DV^fvZ)30m;+Wg7Q zsV;l4co-e~)>jyHPtJ=1RcKHAD_k!H<`aF4L9oOmo0$s=G!s42M;1IGdqrq4Q}A++ z(mi~|; z^9cXo{11q|C@Vum_a;O@$9OFdbI3qwTkQN}v0sGhE?rj16_JXKsypt*R~go@eL|8% z=;XhIqkjgb|Mk13#-1imwQ(f;{@PW5uBiIaQSf7fpKqI&JR=S$w=(N#TltEE(v}F3 z{Qb7CEt?q}8*56aI}p-uK9gobO>l4`BVWsaJSISz8V^P2W7EuGa5f108LS4E&H}31 zf|6D4iKK6Y3|^Cc1F`q{Xdhyaw;TY+78*v~9DypY5i$|5P(&Ck7t|-yKZ3Po2rqpBpEv4vZaLReau0>l zS{+omjACh(Lkw_m5n%hYcsba)d;g4=ES*2rRoR2$@>ENZa8L|B>Dl@xyJ#N#>|0o zxXga1*7etfha0DsFhnO7R~0sILupeSn%L7$GvXa<3DiaUpfs|=7-d^XQtKMX1y1~M zcAJC?c3gIqL->z*p_Ib@y5vZTYns$xLk)E>7S2OPT2;v&!EscqR6Y;Hgr1Es`GH?F zYkwb4&TH%#S2$Gx4=5BP3L@qLU^)v)ZX}9iZ8k_xAym6%F!{hW{h{>zYiMmlZG-$Z zte5US`-QM9RMuQz*o<2N?7#^)Glk>L%jhX%87GE=^3u+y`M)|)4#~mcW8lI`-%sYr z>X6X@7bElGi3pdA(g<#8+*cUfH^p&zOUlD#XUL=QCu zEXm4UJS+@xlilpFkW#FpIwGc1zzWRK+U4i6%(2HB)iaJE{o)!8sW}xS!O{8Dr^U$m zu-`(IUuuYj^3Ybw>1&d7SDoxI`F03enA*3~m&& zH9sit`YYxvuT2CH3;~qpF1mKuXh+4zH>spN#H~(Rn3Kb|A4N{PXF%W1T1lhmYZ@AA zD}N3<3D|Zu>q{adtb=`Kb z@1zl$XpSYdhO8_Vlw-roqLwf_UsibOT)46wupbtoPV^M5G&ws7+=Bn$ z9L^%V1gs7f`2w1z4C&a8Txuv4h_lvv=lnR2fgEWC9dY^D6Tn{k8;Dq@2m}j(aXExW zB`ic;mU7-|0-K=*u6)kNvvz`kK#vsDEdh_qq6uJtQ~hhhJb4}XI!W^1I`a^=EBOG% zX&_%VG?9W-Za`BMD8qH_T<)CCoe9p*{_?4Avk}PSZwOl{p?B6Y44{fLRST2UN?3(c zKD^^wzCZCf7*il>WlxRoZNU#V#59+c<{8Lld2H*p+Pe>ngIY5&Fd3$?KT6N_&P-It z;!7A@k&;(hWHf|rx;v*jc(51}H_4N~+W&~Z-UQWdKBEqGTxc9esvJMcW;-CvDfzv$NevdQnnM@YD!CpyJs36;sTiyUxJ zQRL7#t%CKH_xLdk*@AM`VP%Wj&b*02WUeN>O|7+YSH?lV9?x`=^oybU*U#RmPDHzC zXt04NDP^@ij?(5IJxk(KS0Si4b4;AHU99|vDk8i*)I?sW%2NV*04hY|{0_dXPyAH^ zTGJ2MSr*4)?3g6#zMu4&b70Zp8xO)M@UOnG$$a5YSH%N~QorRtcTPR(Wtv^!G28t9 zl$|gx_wK4!);e~B7(p}D>WDdh#HJw}f^=_MY)}zD1bKbA|HbnkdhY)b0yL{maLkgp z0~`}hO5ag(MS1VD=*4dmf9xj>6aTV#i4hV5%Y`qeUPV{ z8UlJobQ=7O?mA9XUNAl-Q_nFI@i=?sx#Txe*xrP?Mje;d?*GwqTw zwBkf8i}SZZx#TeiPIt@XU6l_q34uDF$4f z^v1G&V0l-|g@%qd{LK}n4ZB(iyqO^|Zja;H3e(x5_iJ{24|ANCU-DWTgaA1B#6O^) zr1Ap=kEI=O#eW zdkodC6@m3BIp3Cjhg$eY21+{N!8L9R+XSWWhFA0NknI%P9GSSMSMJ`ig|ikoM|Qc3 z3}@MgCLkcej+j)hUCyap=6Cx8^5AUd zC~wDu$7mSrqSDcnyPxz#$-x$ z!R|n7B&77tt~TG3q2GNrv@5p{?u#rM*6bpXjI_%$ka)Afk2L5lmXz1sKZi=+h+pP< z)5+fV&WTb*fo*p{n2kO=Sb96iIB06TNB#HaJ9Rz7qJZM6og{4XxX&$z1?)K%QBdtW$T;HS8WRa5rI{1dqYhDqr?)^{l2WZ|t`t3~i z?Acdq7KG#YAD37POiV)*NzTTMI$he5p`!cT<6S#hPBwiG%HTBmv1+ZKT-rYsX?Me7 zsdrI1W##{dP69uZ&bI}hQ$TDMc&?SAd=4vNqQaHrcgA-QOSTBA)4#uLl}V!Myo&hc zDCj(JsIypf+Wn5bkPJ^0%^vacbp)zh#vhQ$Fm+&;oOuN%bzBbWEdCR#teUn<%U^XY z;W6D*4;;rZhfmXS8Zf44yLWJ>h&}F3_ZndsK(z%6V8oj2xnIW@j&krhO^lqLKZvyL z5Q7_fe>tY&noX9H2PH?QevZ&ZGjC3*uXn%yy$Y+O1240mUPJiWt@1LW!m*8Bv3XVM zTtekL?Rct6OwI4N6SI0E^7SalMzBa^9$%TxyLNWoC%7_J({zRAys}kF&o$4MRM8Yu zvYy_zH+ZcRrso_k5Rx_G#Ld3hi+7k+l|Am1y~m%pg^C3# z1V775V%H`MX^k@a`Tdy5%iYtbAG>nv!r?w^f@ZPM^#VH&*la)j-c4y|y#gvBgJ}LY zTTp+I$okRCz0o`$GpTDwABGw%L+rz)rpYeekL#n>1+$xdhqh9%cH9 z7G}E$L5!{<)a2~?sR z5P=y>bkg1qQKRh=+FhbMVXP~mbdJ|-HCyEvTahUpP z%89S_sBUO-y;W!7O_wL)hQqe9TX#U-i<<=Gy<^6y;UMh6K>!2KI=uB%y)YF=MSiCm z${Ty~HE&5Td0xNpYvF=dwnDwk#t4#XpU_6Nn@xn%lh8xAyJg&kK-6a*Ok-(ev2z3m z*qzeqhT}a_p|!hnNb%nNQRO1Q{Vvb8{H9id#vblnoh=Jg?B1$-931HJO&yn-NPiWH zGvSD~0^Y)12h=n2P7Av&udHv)o9~FT?`NcP&Exp0^Xg&87-p5BrH04+>J85FP!BA? z4)7R=58d+K1M6*O*D!#Lvh`{F==~Skld*F^4gg(m+;pOdBLpAR7{166^{emh`(3!5 zUw_WtiiefY!BC)KSyl!b{klmb*fe8tPf|l?Az?DhpNGE5G%XdbARX0H3Q`hbm{|p} z36c4A&4tdegZz4n4o?jQkU{ZkOn>NngUUnlVP0>(C zQ`|Mp_U$BjB91tFCRvZveTLM5nC6(g-sdaD3LT%(CWD){62l&Sl=5kgJJagg&((;L z3G=MA-oiisfYRuNO|gqKa?U9Wv=h^jIp>%i@2ZmH7O%f>h^NV7!cKV}yA2;dDtS}v zef@51>_^x6{`vGwN2Ym2RX%Fp$GE0PXcR|y5z8xX<=GWD{`W*4oa-!4uZ;M*8-zC> zTp$SQc9Tf*JIfW168`~>ISJjkG5QNCDWv~=rD_9*$I>I!5PaSmqV41#JLNx>V}Uxf z&{<>%_q~TOJdpZvJsL{5ME@q5UM)glV%d$OP^v+xvI@}{zS0W+$zsTpw6{C;lhe~t zAHZ<&oLb&u4EqBL2_(Vx+wQTRG@RKopF0&$CPe@T4uq0Yn7%ntnTXpZP;~e&q`hTW zRBznjm$XtN4H5$g3|&JAh%`fY$1wB&!+7@Z z|2*&h*Lic!yZr(#*c;~F_x)XKeU|?~tY;jQ>rHg=Q+e60LcNfg2dUmP(bZXpv1c-d zU0rmwQXezUH?^V_x84%6UHN17BrWbjr zIJUDmJ)Oi{(90B>kV2TO@zSZGmCk+dqmBBJVh_{HvBS7_+!+_~I1|bw*U?+@EVyNS zo#*@PfC@c%E|th#7!TZK?`oGk5$?6v8%Is_zopjycaQu3B~JaneTgq^H>x3~FOAY< zeV&IxSe_KOs?rBCC0MYE@DV$T$+op<_D9jX@Zf$15?@klA~Py0RuZU-!|R$u-JB#I z5XH{St)(YDua+K8|cDEEkJpp*LkU|Q)0b0p5yAxuJ%1HKQR1)h$Gq%G9SjUKgk}*pqZhoE@N~#~?7IQ4VQ5v$e`Zr3uZO%E|?y-+v`zW8Y_X zPr0{PW;b8B;7Jx7Di&nqWDjw}YGYmkzAJMUx@(`_Yq|-4+itPJGdm9RJe!n#x|{Ap zxdgT^=$O-C6(9c5r|8ztF`@H!#aAil%Oc9{`BV!nbfx*-Pl(H#X5S}IT4dB&I=n8Z zN0yf6cb7;H`OpW8Q!58ne_~_b#-7W>%K;UYx?}mx0N4n=`C@2?-qAW5!xvQwNdWu% zdflryjqxSZWesJ`qLfRwGHnH#1mwbM{}CKiJl1Vg37b%(zw8wM-Djz`JW^(;<=)Ib z-VQ&*5~ix!WG6`hyIY623W)RYn@>E+Dn18vw?1>ZVM8some;4w{C8^2EELsv=Pwbu zrBe0rFUi~Nf7XOJOF<2}gi>f=C~MoEAb@}J#abIbH+sgHnnrAKotdL8NIntIwHWi^ zC**2=$0IS~DLgAdIwsv^w_tKp)2w{(( zQ%~x8g1u{>`)_E(lb7OqokT{3*l6_epkh*2AO(!p-*yKterk(_??oIo%2oQdrKeZ-hmLF`%sTmP%j^)pxW0!_eLM_N)&8-( znN(qvnXRe4XoXVLFCO{}q{-N`3R$sJoJJgRnhIspTOSzy-Cc#eYzv zP;7?CeyNxB%T*lUSOHYwc6&*m^$+!vm)cW@U1^I97|W(A3oWs1GI#76b7|XyseMnm zh&KyX8dTiBsfiao8kTSE=}~ipf zM!*%E4_Flnwm8KqV{9~?nq!m+r7iKix@)W2`Ncb8?#d$by`o=PqL83LP!V@|@=8#e zQ=8^su2<}3|)u_qx1G<5Js3s8a38%`+*w7w??p@ue;G|LTpgE6~3Jb*i4ElJT zEveIth|=$j?z~(sN{lwGP3l)V*qiqGBoSnN{TCdRZJKF$p?iq(@OX{2bs{=PAu__c z5o&upKdc=^-BtW1L9`C0>5&2EZ8T%Hkf-K6XvxR1)#CfabZ7u+G}9=T4!itEkVuh| z-pV`l6oXKvX_g)J+OocJUO}O#VJpl=I{#(EVO<$5n~-m-^mNIgv6c7sRh@f_GD~1Q z*@wV)TgkP!ZkmdD4$4t@Wxv`rv}77xhio+y{Qm8#y%sD80C2%|nogKzHM5rpA6iQD z#1oB*&#-se1qG|Qw9fD=eEXy9SshcRz=QDIeC(n6xYq+jb2MY5RnV^> z$3s`>>YgOxzqMZxjvH|B`+?tVroe;|f-Pdpp{rVaGFBFC4feL?ukx{PT;)=oAoVDd zacQY{`4G!R@7JG_jDOGnuugcd&LKM~JEq<^v~y#e$_f07#*X9Z?Vk;i6|>92WWWpyIu5{U&q zVT^D3S#PYsSKD=c5LP7lsuM4tS99rN@BBBXABMBy>o623OfOld)*_R)J}tIlb%+N` zZd%nkQpu(x*#3J<&WE0Of*E;Snfw~VBiR$;Aj_V!x%Q^%&DKR&zz^U1#C3f3$0b&H z#^dM52;M(%!YE<#NZPC0e=Lbf@1hGz=8N}2JS+>f56~oBQlB&JRn!JpRL4H&IAK22 zG&LPC(P{g`+5z^mYa%3J)nFkZk}rqR*kX+C`+0b0SIOybiL;;PbE-Z+*f|P(Y*j08 zVq;t53#V_K4)qBi)88{>1z30tI{^YNrL%U1=d;Lybe-FUlL#B{ezcnj@V4EXd`z{5 z&Zsq@asxd++l%AYMEt5sU2AN4|A6C7u*WG|qSh#$(OzKZDBHv)=V)B8>T59F86nOt z)0vC&OXZk)3IN(6-Ls@Uign6k9WMAQpYHD(4VKtSl459GYvu2jTr9LNo+j232tFw= zByjHUXDubLj@J3PT0aT3g6jCIGJ7@gDPazgZl;%lX3}x-HufYg_&WC{QV=E2ndVjed!r5TU+zCpbDteS+fu7E#S2e45`fn(rW%@rQcY8X2fkRGM@PA`b%g_r8 zuB-XV((mmg#?UT)&zE=k897kv8psgNpr_cH!vmvF83s`|vrl)0J||S(8=_5lKkqYl zc-_7dL9?0-;98C)V}>Jgm~w`4qiI532h@}ulb@9zMwr&EGlU(6i*N|4e`x65f~7D~ zz_b-uCQ5s{j$Bli8Xtwmr+c3WwOH_?qNRPv!*jo{)qY73VirPph%JlLAD&evK_e`g z(*}Q=*~WD(zpnJLWe$AE6*W|lUH({G%h4uYs>9pE9!kkk)$BCZouu0EkAPN@d{qMH zi27N%2zResEa!T#$L*vzdcgnAYGm?CqW;-u$XrtxN7@X$uS zP1xKM!qdvo)p>RDuuspT6jhnWewJ(#sB{$M+q&+#1u!mWO9tMb0s{XD2g&m)mATWY zaRSGmvG1#JUU{9s3ZgZ6s%+<@rmodp@}U#-nJ9!yHwh-?2f!{Vn*vb4OOD!6D<5mP zrW12xFaHeaoo^t<{Dt0MZ=qgcmeU}$IuU{ok)h0PhSNo$SI9?p* zLFuq!n)PFalb)|lEN0*t(uj_?5^_ow{GlSh;8^bm{i0D5-!>nNy8^;wD0ZStFxqWu zup!A&wYphZAW_qaXsnN?nzcps#UDZaYu(lsK`_%HrEv9@b>hHQFXzm2Fc$%?;+J2F^$4-SCm2BPo!5u8x zQWU7@9Q6}_&E~^g=_GKbS+-bsoh_<`oqGQV8=SEq)6bcnC}GRe5wnDR>4-?DrQNms zJ4ZNpz?$`s;3=+0AMSMb(DAvC@1;uPDzPIU1WMr+(XLI^MNklxfX0KKhUz{-o*U zTz1hix}$#!mUoiiW~y8}r_8;$y>lSVvEpy0Lp)u;jh&I2?Jh!dU{m2xm442$)tjIbBm2fC6`oW&Jh~p!) zh1L&ty%mbpZ-3;%J{e&2Zl$j2nAbQr3%E&%t$DJXb;GJn(~6;InUZC^54z4p^Jb;| zMd>;PAN^Te&saTFhKB}td~nPE8{T{UK=|ne(VZ$NnY$cAbjltZZ z013=w*i?8%Z~pBC3k$V<2AyU*B6!exh{vH}i`g=r$m55Lk<~MctPkgc4BqYaDUwN) z7t*Y6O$;H8WDCL3+^#tf#tn~BEAMpO(+C_}G_#3rT$a1H^A#I3c7>kejw$=r9kyU?JcKT=1mb%=xS@&r0=3AV`=z*tHtC-PPuBI<(v8zI`iL3tFN##Xs=%4nk+Nse_V_}?)||`*T!qvjWXgb-St|Xm+U>vkFhn$qJpk9{l?2#6{&jLD%rN8+LBtG z%l1*ISzgiqUgVcUMhDWB-xqTyW-%}be>Akw9lTIymQ58^tlH%a){&=gV+RW%CG(u; zn#Ocs;IAlJj0aw!>1!XZUK>g%Pu1dIY|^uq{fNEg9iItNDPjY<=mU!LbE+t;%lar~ z%o=vDU*G(8paT%rfW4Ps^*pE+q5hC#wziTGl|jFkiU1r278!MIe02j@@40^4M8EF5W}%Ak$57K~k z`8PUCKOa?7pg}!kfHwWtew0zP-13df`N8i4yC1foBQcXq4a{=%$2<+Q`D=B#cQpE!TN^x za2AN_uE4$uIzLbL}{qO-TCQ5qDsjmV&XlZg7f4syy;GTbBQ^#JUy=yl~|HGQp%Nlz4)|PbYcJE zMkA*<-+_TIGY{fun*6#>(>rNQaYJf_kvaww9J*3g*Ri_4wX|*u~mURDolEb4bYWe)ObYw`)+yV#Yx z&r0@c{0{LQ>u;FWuSdht@G~v_+WIu?%mYv4(2MYwPcrza23@PKni=8=QF*BdWVAMvE5}T40}O33yztc%!C5a?2=1xo?1Agd{0Hr3)&8(DVuWfF zx{9#AaIK$MiyX|R8S947deSZxP=|*#P;f712?d&%%$N|Nr=x4&M@xIAW3^L9FOAnc zdcn$9w{Ux9M`9tu*{T}fOilV+e3)#yj^Y}hxRRHYma^DO1a@TsLxBsrC1Mi%;Dk|Z zRLVbswYod2BzRFXCiLQulevpmZkGl{IsmjMi1`hSPDCdu$V405HY+c;syy^Jf0dUX z`9^JrYJ=gm4^KDg4Z-uKYpeTqhV`(IT7nB-V+A~k5RD>2(b>r}6ylsSLJyFO4_h!7 zG3?D%4dDGo{nDuEv`%`$U2>>KH#X*jJt)>wKJDnU6n{qUT_)d9INXnVw3RF%)=~3JuIHldtHAV*?IS+2Nngpgkrt~s3GdA=0AB6L|eaykj+6UNrp!z^g@cc zE1MHZRLGU|Ru9VW{V+3U6DTh_&~JEij}g?q%w2?uD=fEU9NUbZeX;JZHYoUmXhX$! zPjjXZ0UK_(G#F~)>UD=ceiDYG4HQxdH^#MA%KyGujc<=r#r&O`!&5xq{_OJTTkZF+ zFXn^XB_|q`(JkF$wxHD^VFwsBW#_kp2D{MpQ;U3Y+%33vDDq00CS*!Rbo$j@fsN1% zE(NXYxyLU`WpuW3XrhEc(Fjwm+;>hdAYIje?=Gwz_i~}SZ?x6V;^dI49(QWzSXNFx zhkqiyCVgzmDPlW4sh(dr{vH#a`KiiGz36i+%}3oKw0b3fkDz@H(-C`k1oxk^s*?#0LUIa#)p z)v;TLwYHbzM1Usrk6<|Q)D;-Cb)MXg zC2w)Ndf$?6kf19^#h0w|HReRh_x1GJdjDSE>(Sx!ieqB#>waeXDr}mH>=OAV45#Js ztFL4`hz&6zZEq`bsv7n&aDdF;dkvNz4Sqa~Zg4NY@c}mQ5>^Xof6irO&zE$n!;eRi zor2*iEU6o9kDki%>~gt!i2Tp6Uc~lYHgV59P^84|60COpekjIp_x} znh)UAc4s%3pXH?9Wbg8>yCX1>nq>HfO;2bg#!FZbe<6-0T!40Iys4z^pF_YUcCb2U zsd7FubHi3Aw1}fIX+b@dV^G?2`@7o-75ZqSDd4qXEpc4+}KcJl=XdX4L?IeQH@VfdaGKu2hGMl z*5y!<*M2K_Fd!=a?3b&qGuWLMfI0mMV4Ey#9z}cZM7dN8rf^(W zbF5zlIu6bJIcLwgdc&x{{ZDG=|8w|=`w!048XP0}H1m!IvXj2^gpM3VWqRfF*hmW~ zwEA%LkRrh6hg#Nv=}XnB>$$yKV>*1-%yF?8!<(>Ms5uX?dlaEU`!z&+Jt$QD^I4V=eCPh#~F^&gYHd`lT_coCB~;t2!CJ{ z#LgG+pv0dp0sqSMOA`gP(_Ngf1V$v?B}1X_`oR3K3(~bad-$`4A1@6+*1?4lV}0sJ zFKj!SBC2El5vcHTAkCp&58uiYJ_p~>P2Bo}v*{Yn7r0f$zI-ZO=rg+rcgfuz+ZB5n z{pv2YU$yitE$-%9J+qdOz3%FmIoeR|>hy0H1nMj;u`oDw=o*aNq3L7dLv%%jdcdJ8 zD@E3Uc^T6UQR_Dj}b5Pk6JuEg2Z zn+{?z;ceD(Zv_R31h)B8ZGTTjV>{!;$c1wFP)j)PO|Vy8Iq#pA2opu zUp~&R#`pIO7hl)B^@{-kEUIvP$!brb)k}J~FOC++<3j%V&*$8Ea(U@Rxe7a+6+Nc4 zbStI@u*I-^ZOY~cwAFQeK%x*$%p$)~w!!Z8=x#si1pJuap+1SU^!Mh((e4ncHOFft zU<*&l0Uh-gl|9deKX?uJA;p`5p$k3kc#aYB2%K_3lovg}ZH}^!;2E7;!rrCs`I&8D zQo`Ad!*pxG#uy-U)irKIDNcY&1kpSr8P!5+J34)*N16;ibnExO-5NM$uzc>P_{_wY7ZRvI8Gzd5q^kR`aY3*O7ofC35)|c9kjVE+GUV2#Fwed7`PwXYcJwKkDsL0h`Xc>NdW7Ea zn3rKw2oEB);q-JCA~K1k?LJ(!;4|T4RYOp$&bTVK? zv!$i1mLP!r*|lUff-Yq1E=Vda9vA?hQ15hv++u!6VC!It{$6OVaOY-LiR~Z3?nLOY zIKJ)=q_2Cn!1SO!!jnkHSDa{|o4IkAPBz$9#Cya1(BLLuP&1WNM#mgNYu=`GQ?cq8 zzA(wk0UD{An}@UyXB+*qgxCY8Id6!bD7VIEr2Nz#ZFo zeqcviZ3o>sgPsys2>s_&oh3`iB3o+8FS(lU$7+i~R4(;GoU?9A-t<%|bu7~1m;Bcy zW6yQx4(>d9`_)}yYc^dN)p7P?@mDi4vE@J(mz)oR1+g9M`~(cpF@A_>6q{4;8W9|b?k={z<95U zj-5StqneQ%MRLyl86ewaNPJ*sZ01$&TX5b#W&EzoX#XKKdh2c4HrRHVA^_3x74VW%5OMS{$Q=%N_I8mf>yA$SQLidAl?=RfW#pmJ|B0;} z7)B29pjqp&laLzF+1^H}OjI2Bw8zhaW|uhKETJCvDaq_DTRaW>G)w0D`_LmaS8?=d zvoD^r?`|n8Zy`pJQM|9emh>M%OM3;mg($I4-pDRFlAoLD#va?1j693?a{r14VSqz?WSveRm$MS&ULQg(X%Lh zvqsDa$_k>M!5YEt@30XF+0qgs23{ngc>894 z=d$A;fqTq8_b$w(`!DuQ1Lm_hq1PY`e!CR+4s`UiT0+_aC={eAsGVmmx&j2s$@q3; zAtN%wT7^K#o`Qh%?I-FEY(Xlvv4Dk97W{A|pj%JJaiKl6J0E>)HE^S~6eY{nIN~`6 z`NTNb*!;2k+uzAILfB)jxMHLoI@MWZNOyPBhu)Pj7;Fg^p5LOI&8)kC{#f4_9As$* zeq7WLPHn_9?w04a@N~516ZiEtb)8t-6S)dMa1`0$9S1hIOj>DZqYlY&p^s~HT`d0> z8_<2N;Cxz_EH62(vx|QOdj^M5p|ZrSTluO0O147Q(t;>8UI`gQR6Eu3$VDj;>S~hv z9->vQB5)Xbd2I;zm|Y$XdJtuh<%wDvKP=5D|FIm3E>0Lo;rGs5Iwe^=5cSd5qx&xs zeM`y0;_7Z*Bdcf)X~KmTpo`oc#%Z1j^ik$sY}?(Iiww1m!%1;+IG?Unb%){{$F~1l zAKLpm5~55WQ*=JE#sgv?x<#pEyWa3Uv$wI~gV+-FyFP1hmU%ruuk=qyhb^EzOe2uY z&z3KnoVuqHCSB*!&o-+)2NzsA+xUNt9KvO1>^*<~pwuR;A5rloq8Lk+&}LcB22u&| zon+z{ZHA{ZhS7HoCk|=B<9u)%qKX!+r-W^H-7M{MXB;hM&0-FejMHYvB&6%YS?;=$ zYiHe-koc*W^4M*u`0Hhs!CGT(8J6(X7*3|dQk}i~1nIn=!1nDjc&)gN3;Kl!^l%~e zR?IIfE=I>5F(hHRUdTHqHOm=$0*^IB&sxIVg=!?e(|KQptKvf~7E?W_H&Y!wZrzo5 zZ)omE0ruJ!JvwjR{AT|IzIoTf}dW2eHdwCNZoJz?Ca;7NiOjE zEx9mGyUOPkA3cJ|Fxo&~)SYqWW5Ws1X-&~Lpdi!sO)k#SJU|R{R#=-(E9OIiWJvS2 zCAg(K>A7EQ&7tjsZ72E!Q5jdM9pTeMUZ|`t6uckK`g$$jhoGypUY?S!Fx#MCpp_Y3 z{Hf!1VS^r$U<#Z93N;mPd<4+s>zIO-OTen~OWGdT{v(h#y(_d@_$5)b z7#lJYbTwdLD84NO7+#mIsBN)pda@kJ$Sdufts7w;^bcES^xYtssC`dC=G*MbnJLIH zSYeraPs%``?@m*y!G4KC-}vo@VIr)M^3mN8gvXHFERBk~0pl%g$c=!`AfK7?Y@tj&i4#?0>aX=AOP~j=+CT#rx-*uP_Ed#_a!2XUp&p#F7DpQ zJEh_Tuevu`hI4e?n_`<3zSL*$QmfRzS(P9PA_9oL$ASf~(XK!50olU2SJ&yIvRfGe zOs>P_E7U6QrMGmQF?cbkLIvqdiG{^ka|9;G;zYSqSOqa2}VzBCF@h$o!A_r1n%3i4fxau zj14ZMVOA1(;v)x5IN8(Hu(Z`VqFmGj#(57Ov47?HLazK4ynU}Eh<;vKE~J7|usPRO z^}#fn1J)6W9jR;o>Lpg!{H1P`zmn~JDRXl*D||tQI}B^&!j?ll>AexKV?q&Oz7JZH z?+XAm7*tP`GiwY}b*T`&U5*V3gPH;?ACZ6-^ZS)A=)1@SO5Op)g;^s2LHNs!%33a z13xE^&JfvOz9g$I`M53nQSZ_Q)Z5CJiDuk=JCCjGTIwF%W_+H6)@u22M?W!(B~YSL zb=3vkV(`P9QjJtxM%+toDl0FwZo-Lgs|d)E!uj|-hvV2Q70Z1%NDjA0mnr@c+@{NQ z7()}6pwh96;Cev+DL?o}0Kt4ie4aj>hicnxFTI@+{S;tkAWIdQleZ&qHoJ7=w~gac zf*7ekxdXC^`8*Pk7c64;gUohSP&kKpLNP>*qF&|;z|ackg%Oz~pj$%!5rCe<#Rn+fmz>t!0WMlTQMHM zty!2BO4T3wCm~!KcPI4djFP8uFot1Ri;2e;I@e7TpN ztiuL@fTPAnLb%4>a*WJ!u%%+V)@CFB{m-DDA!YGTgC4^;l8jr-m!JeH!CevfHEfR!)O&s)Q6AX8J{pg@#6>L(87^uKBSN zWyg&KE2a`|&>EpV&gYD_xyPiF#&#o@ZNxjP=D=^`3L|#1(UQ_>wzF&vGx~`z2&l|D-Zj+?zkmH~~jk@yFp5zu2Im-+!OK(dp{gZ zzn~DV8so3$vZ9P{2c=r8VB+I)ml%g6iPgW~r?laD={5~0Zbts|hA0p3=<5HUu1=#A zoEoA%xi7=tzN#ht_M&JEp`2hdY)8E|bvjesBJ*W{W?jfFvWj90WKbwMW$~TX8V6W} zaI0!Jo`;2Fa@o%5-KRO_C+lnIwdu!MSCiWMmw|mjE*Stf zcZSJwmU5JI%~kyO6-MB+JWy;^(bO!)g~Hfe!3Q*;!9gC6m3a{wlg^V}DLkGOn;m>g9zI`zfPk1tj|(D&00YQ^a;p$0a(+8 z!iYbOlQ}VHe7hnjJbG|BQ{)4elKNK_x!BPoJ~5z6`MtZjEmv1cX*Wy+G4G;8eMFNj?1kD+lSKMiB4mW(NzPZ}?TRv|CDP*d zHCI6lTB}+zwJ@@s3m5j`e%6|V=J_DmGXzV>EG<%M?=I3@q_#%G8sz(X=dhP}#Xv&! zy9(bqzFh1@BRj1>8P+rb^o80cE-?&=K@y#owNpIvZFyY6X7_hG_CO~I3aR}uIo>)d zP-CRM4t+Q}-YIIgZT)u4h9dN0ZmLR_x|4^YvWY!zg61_X-SD4N4{n!+%X~*Gk34J) zQxcZ-jap)MySH~qzg&wcID)HxIpz*z;HBUPwI}}w%3VzP>URMU_fWvw5POgsB-i)$ zW#j#Vgyqx9%sxq(zlaqR-U>lyR&K5*;)|*n{42b8>89zNC#{8;LAC3DC&6^NUtTmlbY z;l8CBn`xOWK@9%jNvd@#W9!>=NDCh6J8cK04&$DM+X=^<<nUP8}>cS}$g(Vn0;{x*=|-v`sHP28}^i|3Phq4KR}$M+9D43wVjBwy+r zaQ4jRBhGfg((eyA-VY<&$tqqyQ&fy zNVx9;h8dE+?y>}qcbK!KSwAQGUMLS9kf4Ym{`!qaq-`8Ww|zYtWM8Y6uvxQtcO7XP z*ozEmEwm4=i|J;XS54wo(i5cl-70#V0t*`wbbfv6^@u}C^!h*Y1;u^nTmwH=jIsAw zi7IH>W)`G^{r-G8X7H5Ww5ZEHHi$K~1u?k-^ew5w1zQ*XjHuT#eX$ax^Ts%<|%vz)QVplC7CjI!H>1S31}r( zJ<8Ix!ahHH8?WN~%urwFghip33l#Bk$Yps@t@0V9z%ZF>S3e=^Tv)W8y{WTxE5B$;Gnd`4a|%}orf{Kq7g}o*L?ywI_n_!t`lO+DZUftkDjGAaV}psq z2jl=;jV1T!4kt%dO7b*kO~^=7?0P97)qwQ%ifndZab*c&%H8Zxz{%E}rguL9neg|= zlrXOgQkEmr3Ueyw7`|Se#$yxL$40S}qrzqIDk)>`ly#QR@0t+7O_sOlxU9xe0*6k5Bp#cP zTjpyGtkDsAz7>G&B?8}U$8^z>HhhI|CGK0}e{2b#Igl3MGG`HMl+wRCCO#>b!>Zua zi?9goDSlS58co4L*HO~TfaQb^&tl2bw6CpAZHt;$*G)-fw6remSE_nPO4_XxI4KwE zu$E-NRIwi^=vEgF735ah_u<8CPhXNEI5dx2awo)6yCLH;+?DxCs&5v0EpRI@rWqr38w1gOHYQsM}NPBICH1;RkTiNUX~ZthhjlW zC>^A7b9!zT>ul^C*_YW*a22e2R>6N8qOqppTc>5H@I2R@OvR(>adPr}&gqun<63(w z;57bJvbq$FMB(ourQKFE2d{s74Lv;HHS7rZP8cLXcX4(0Q>hy-lry&0I$ zsL^`%PWcUs^-ufRi-;Bq-Q^PG+!E67HZWR<_25Yx(wLvKPtaiJv}JSxEMOqkq6;W83bLpmA8s{QM!g zS|}K?@g5{(eP^yw_$IFe#Z?0Y9E#sHmeviFr=Q)}+3CE#9Zi5da*23%^gPMQ0@s-D zgz3MT>VrD0m%B&@=9yJy-lQ_`DvAP}(~cd0PtT>1S9Eg*Xb8o)O>Z-WE96>wxP_l=Gg+$T~9CE|Ct_MO+>#!D^j%yFE@2Ue?3B zo-jJBqVLnuL@#EUZz*w+YcfZPp{J`!C)!8FF$=tP;>p@o^AF&aQWwu*Q?&d%`MyCQ z)Ssa71;=!~w(;8LKz>y%$$oED25Ku^u-@5_Z(11eC#SKStJ5T8GSaDE`c?fqReWz( zruC=9hW3;Zbh3ZT^WXz??@ajc>CsYDK7P2lK0&K4i2beVA2~tjeYEgHhB?KtysA1T z4nAzBH@dgdfNBF>#(tTy@#oY~ZPOD>zH11j@M1QFM9gp)-Fx~jM{9WMU{ZZLK?yJO(|OigQMdK<<&#!y)Vtd=_1V-jI(4?<9J|`UbIe5I$tMm) zMk}$E21%Yz^S>}H$A9l5AlGoO7-lhG6l=!UUz)p@{%zF#<^OAhTdG?$X$b;-Q;VQa zbM$#d->c4~H~mo#ImB}DYJ|OR;=S62W4J5T){~#Hupsgc3$548lm7?=pBysc-zn?Z zW;o^$Po7yZSUNoVQ$JEa^E6XJYEu8!=kY|;Y=v47Yd`UHmq{*&v%%cv{4exsQUE>} zWGC7V?--tKXg*%LI-8!uxO`c|>{Dt==dI$`zJKUbKoPcM$6G$EhzDreGxCHp4!Q<> zmts1Xo!2=Oo?A$PJDy4GxnPZ(0uj^QhA445lPvT*EMRxhzakD5VT^Ni%;CzmZPaBD z|NNWClLNt$vSBe{{!`S&2mh)mDSK_uMQ$epN+B$D;I9-ir>*R3-AGCOv5(Ohs$(`Q z(vp_J8&|sdhV$Nqrvgu`2qx#PQ0jz|=hgQphv#hoF;g$aBY` z#y-a0J$hgya^12omO^U)J;mtbUEQIy0;7T$UfE(MM$Kn5Jl6mC1**b7MXO7Ttiq_R z6c^dkq#R$wA3hgCZOa7q7nG@Uuvqw?a?GmpnK>?9Ax?+dnXv9_dYGQd%>3@q{qd*z zyupvS`Om0F?7YWJ>thU)AP6H^P4ae-wL<-I)a2`vIsz$7h#ZKH@ro$5 z=+S)OA?O9%3@}sFgz$A4{O({eLA!%LKR3a$%Ur^sNWkpu(z?|3pjO+~KLVoSW#;GC z%9!n66FQVSLND*nTxv_=>&#X~BcPQ#G*$M$S=6=`2aIpU6?`nzT-dD2J77e6W|)&Z z6`ITqP^nXq#M1tFDlcBC+Ref^aTxT(zNxj=O{Rdw=$l0wdWvm1P||Npr zFK@RdE(3Gfp#e!$u*ibOXx)Rsv*t;Y6yHD!y{zD%x_OIP%O!}YBd4|6;l~;QD&h?? zBf8-t`)gIsX87?b*~bm<_TRafYn8T<(|f!kboudmu77Vctv||VyTU+84d9GB>85>Q z=<;%XVf34y$-%B2u(2Y+3m5qAYtOhdHjFpSqYz>_(0eW%4+(YFmtd-v%X#S0#(^m+ zXnP*oEz3A_p50j#H%E}z8}!9hS@vVPpwgzj1#1Jso@G%iM~=_%jfGHlal^1*($AgU zXz%S0kQ`=>z}vgL3`)!=caEo-ppS;-UQfE*?W{1fE8>5ozG-pK%#mi^`>i#{9t=s< zns2$$2F1MEJWbHLf+8~~^yu{r5&o^u&S#$~4H5P>$P6T!!;voJyQZYHJEclYK^{-F zDw15uJT4Qal2bDb*$0NW?;VjNP2+2(#F}&-x;dy#t1)*H`L7#ph4a-lmvNG{+cMYg zVzsjAtl@f#VZ7$1WKO=Oq9sK-NJu-fsi<&`mqYhgoDBkTjQdkBdhoUShTErSktwFT z2|Qz|L{(jnwHmFC2T-A{W3Nsu>a0_%T_PFSYm5uCTTgXxk?ZRv2Y*#T72te`p2`{VVxkDObSt*Q3t+xnJhHLmgz~24ko_K~JFDk6-;=D`26g5{w zk`K$#njO5tsp-0>l>iDdu<6oVkx?$#^LZq z(1a(Q*PV$UYO@~|!?e{qJ^`qKi80HA)Tq`BL&L{6i#IlmR%hqG2|ie z)3^_ZXOO&`G3wBV4dF6sr)zTAuM5U&b~(jrWGF^$R8$GdNFVt}pQK}o+E)Ti4y8Gs z4cqfCAyV6w_Tu|0^pe9%&7HL+a}gNqMfcZC?if4IJ$qRbUqaWzVGfqb8LX{BJqDeU z28bL&kDE-Sn*GL8l|@qwl5mQ;TMh&LK^y{btft;Cly>`yx&a^C`;VU+9_BQh5jWr* z%10oF-EP^k_!pjgs+S+V=y=+{<5N@+zqG^`PVp`6W&0W>%Lk5tWRqJA#D{$F%uZVT zNisD}B-vm-S|5%PcR3-8!WYeDDcK{2#PR7qp&|+m3G-VCB|ptl5aM!orXgv4%35af zX^fF*lQd0r1p;dEd5OIqJBw{gz9X-0^-8*Z9_zQg!ZP^mVN@Z%(?FK5^OZNgy+EU6 z62%XM8ZBDM7RR`?WOxqrRjJ(e<)uiC*fDeRfQ0IgJ$s=mCo)nr)h|vgHuEyQn0;U?Z|9i3- zE^#gTG~;^4wR@Bbi3;m$J6Si}Eu*K+P9V+ju2DB8&Daa;d6>KXK+u@wZmrRotNWH8 zH=En+;TJDWX2@O}RjRHp-S;2X!5;lrq4WA;G_vAH&u&8Xj)ku|#J}h7BF9UIcNEK) zv&@~Zko1kzQa+quh>&L6Yz5FfBK%gcIO~4Y^G!Z0)30wT-S5uwH7b@U_BM?^HqJAaD&-y^M=?mmoHI9tun(2}S-z9Fw>ks0ctOX84C#Wc<Ae*Ut941@>^1T- zC>*E6u}tN+ta(54k!H*!uASnbZe1W#eB$o>(n~3lW$Sq(YwZhW^xx-lqz>vw0(Cg~ zDXrwBCGnf7#k(?4jfEq*2p*hzabU(CC!0;JAY9*NSLUZxOU7d(i3b*}t7M6w>3x^C zISUY##LrKHSf5qcE#7Nyno_A=9ZYG;cGaZ-@Bzc0$Tiq4Jvho#(n4#i(~@Xf z)Ue!&t^#Hik3Zs*RxMX|rN!zesh#%kVD-|T)u!_%UAHUzZ8c5PV!sHAJY|&9^k-B% zaC&B(8|kF4(?N~IE_KdUHm=f%FiYAcT8HWJO>=cd{l@ixk&L|RSnCg^IsyD^l~9kMJ+mY`(?xssw=HPKe%8w|A9c1$vK?;j47|w5$0M3Z zo{A#l0uw`dv)o=4@-6dJ_-CAnbTS!Ohm4duJ`7n5e)qnr+|FHKKKyhvBzHbvqNJ6k+L7N132<{Mq2X`ldpuycG zNFcZ-xVr>x+})vZcLI%T15K|x*M9rFv-W#+?mh3^Td(R=tty~pb{9QIe`Cz?+3!!D zo*<9U5y2R6o3iI@_gtya9q0(v^Gb+g%GyvvcRV)sMB?l8QrD4a%90y6t`eWtF48ua zSiM~Cf4f@6_-MUC8zP#nW|y^E(yu1T@xPfD0220GIfO4X#GhU@}XRqeueuoCwwGKc#rk zi{7M!%MCD>8*8W=6lF_iy~hmY#@RCj#DzRj8OB} z{6;wQkInbv1|^S${H2}_WJ|IHP}k#XsDBhgomY){+6ju5cqhyBII)ZpMG7Az{1`>U zsZMM>D>u;<WDG*j${D&L5BjWmKZHH4I{DcvIOIpJ+45wuNS@j+jtB=? zNtT#6d1F9dhn)e0n)N7?@l~tm1Rw$R={rjYwy*_ofI~9z7)6p@2r4z?{droPrn++Q z=)Aa6Zax)aqkp#ZzE#;eKu4%&f~8PKvV>HJ`LP34M?-PRw?Q3a_6(NPNgeoV|81b@ zeP_Y7kPQ53o1@7Lt?xS;2a3}8(3)nnqhk4uo&4V9Ae-{z4U5lO@$}v3NwiH?2~e$f z-xUlV|5dTzFPLHFfAF;b8~k}+KMUhe{}}PXvq7Z+$<6ZNQ?8fGOU>tuA^$iVv`6ex z;w63yx^Ahv4mHty%dX?pMsyq7bbR~RzhzRw36yMcy_VLcNDh{%l|`1y&dRQqKY)`=t+Y zuB^$#me7eOf#Q6gSj$5b8ckem)~=9%!t;Uwsk5f(e;T9o|I`Bck8n$WzYeGx{LA2I zCBpC2A@Jl}1y07kFjP*C4rLl!Kdf4mc9%0I`6x4aLBXYg>5cqw(d4W0N-TJx{29K@ zHL={tSGE^lv2y3uPRsf6n!f+ZOM+XdsWgYXSL0T`nE0yk5$){>l%K! z@~uz~MHe54GFIq%FQ={EYybtA@*{Q&g+n`)R}WuY%Qj5drcp8k=LpyExcm+aTC~kq zY0hU+YXu$BuGYP#g76`xm7GdlhAfaXz6KoKQB=KPw)V#!W9-sXMX+`p=Lb$@YYcf0 zy9%6*9wQf}0sc! zB+SF%DN^JoBB1;P%e`Oz46R@lm73S;8M_?2J1nZN@<#D2sABHw!LTo>;4-2P*At`J|LxN!*uMVMq`kZ^zO&cKq=%1VZ`Vtb-XJ+I1|_R>n16WLkW z_e&~nrG+|ofG=X0>pNQ72}F53Mn$7+@PMM{c}&~xn;fvHd*7yj39Q%UODBE}*<)hb zF!}|ZpakctF}PZ<1N`U73m!*t%tnyRUg(&gKK5*li_*7xp1G6H1v*Ma!^E8yZTnaK zs(y?W+D!EiGqY=RTb~+DO545_0@461M|lxeO^;{FzW81%?Zk53 zF6at_MPRIJlEsE)D~jONb9}87c+{v6(;3ExcBp?8Q~%?w!?#ODr=939ovyTxX5W;n zHQ5lljg2l-m!)p6ZCAdt+P@0S7Dp(!-f6~~n=Gd^_R7ue-`+5) zs9IhlE9^7zE(f^!s?IP2pW04ssMJS1;bVSA(ar`l(3q)#S9VThrI%w~;tuTa_leQ? zrWf}%^i8hV%yY{PROadaroe(GO<50X@AmDR#`>G{!}R@n((Sqz+koo*i#$k`d^ffE z@%lDiR60XH*0jeC3_#dTI}}XYj*FdMj=F5Hh-is&E))O}3%AvlwGEy`Yo8KB1A}*Q z4~ay>SezlBJRUIL$H&#s^qtiRqxa4+<-(Ozo9k3wWEjp^bf9tKWFd*m*n)LG;JSMs zIKC0?osJA;8Y<%J^UccaOAX)N(bKn`-KnzMlnS*ga<}#BBq^VXyZyFq!h{e*g3IMk zMN%&8@%?J7$(R{sUcS62y+?RX1hbktTX7Z1`ee{zl&|Wx_H`GdK@*XG} zAmAM?MBt^uYgk5mXJhlk;Cji_f%X`tjC&W{YnDwe6+oyVKaYXTp@O~SiO=Z!oII!x z+RUO)6#Ax5f~Ur6`X=dPT!XR=J#w;u2E6EO^l6gc2-9J&b&Q3^NAfNSCI^`61c^0)+V*SoG{mS*T2lJ6zQgQs4s2>7vHhU3HB?@Gm z;~ZN0fo=}Bcz0T*`qg^6qargD>R%R6$xu>8dwE?YWScX@*A?7kYGzz8m3rQq9jKDf zSq!ho$>T<)mqHrP=7MaGwjmA87jI(as%x>t(ND`0vAl+0MqHS*OUF)Y7~E*lhBI8L zT5q-M_t(u}!NyrgM(G{HY~`6+JC$I3|9{^R|9$VT{=t87G?<2wuRkP#ah&D%>u(*( zJ}fnM=scsl8l|l$qpe607A7`8&3&RtjOJF!dA9vk?d&+LU~yOHGn z4K6^eoOJ5ux5Ak&zm4ssfdP@T>vslIuIA)nSKrBg< z=WwuW>twl$u-XW~>WYv%Ja)KniY`}!#~1vG*580s)dZ4;6+U(iXz<5Usw~`7-e8R1 zjko!EFW3xm`gIz%wm!-UxnqnH`BA~SKKKVHrlDit+~e5yLB-r?tCZLUjDEm#YC1sm z675 zIqc5)$E~8}VLJ}Ku&VMiRsJtmm_#}%ZGs-IiNd^(UirFMzLvBmVZ+ zF{bM54u#K|>xNmV0`xV_vFVS7NROjhU+N4|V5!rwrG)!=*~+RAn*(G z-X0-+rEhNffQ5_7;WY9~f|-s@+f=su^1=na6CC@r zf@e$H$E{lzJ@mETWq@cRC1@Swnk~}8yD!J1WoN9wGOjsSU<2+-cAPJgs;hrPnH${E zv9;Jx33508Fvr!%ZDYg>Q61_0S|#WJJN87rNz6aIee)pe(88}$wZ%k^{q8jKci`CS zGg>7^mLgt4x_Uo6xSB7XT;&F##w(5$0Z3z4CQOcN>(xGhXrOsou9*o4PHj-D!)wYb z4QcsrSPSpwa@Ll7YLpu5=pI?52;G_De#jm6CF#uPUb&7hTM)C0Jr7ZS#YjsVL4YnN49YdJShA>V5|zFbCn_;&FraXlIm#qpC{IIRqNJ+YH?ci`kvG@5<^ z`Eu3EpkB(AOP%bt22|gKwr#IEPRT2s^IX}yozsTqSG6ge4)FJ*;Z8(*Zc?2lf9Fy) zK1J3SOk^g~9(?^R4o+fB*m-8aR8ds0I1kBz6WSeV%(TdQ+a1RQh9M}Ue%^UHSL7N@ zu>i}kjR?#>N{oGYMrIpV%|o_PUW&%;M0kvLxXX}Zis-P(uoj*+o?A68Qd+poImj9ELh(6rGP*ysUx?8<bE4pD$_p$amd^ zReL-$`xfu-l!k3*qA;Z5J+VUIMl?!3uzgBVS(XZp4`trm;I;hst znfwupfQPD9mHwG=Csb9WVw*m?x27fV;r$XLJK%l4>aPo;{Z&q zF2LDkb)h*Pwgtd5x9N(d1&arF-u1kbCm|{W$HGrofd{*eN7c5c)QY_8?s#{zuFWy|yarjC3-uBL zD*vZK_s{tc6fTsIq!Wf0@$m-|dF~3AYp;x8A%`-_;%CHajcz!edrMPI;RJUHj)wH7 z+yxM~hiq#>9i!-5i?1P6*&@izYNHO%hxK!AHavNj$}`GkH|(B?lG(yM9z=U3(=)j| z(j7re)OS@A%#ZWKjq#G5Zqn{j2F{GWj(>9zlpnAEA=&WUgej(*KZjM>5H_u8#UrgD z`SyPk_wrxdRQ>(7{{uVIzX$Q}LCpG>6v*Ee@wY|%Z4rOT3I07H{u2}8YscR<^Z&LP zv}MkSaNWN=&p@2$dx3Jr1;7JLaeNbM|B{IO_c(jRP`ii!U5XXZ=*s*}sYb1a{Kp-` z)Bn&6t(*FSR|1O;WIG7Ji$_(NwUU2;e8R0*4nuNQyL{@W{f0-3ZsrSn9bWW&%a^8# zBdAe|lh?zJ(`*f3eeI!3ok;Tje&E$hksLt4Vs_KP+CC@do2_m65svWmSy$dV@hf_| zvtscVC}=nyXlg(&g7|r}QC6)g&Objej-KJ7K{6qPeMIf#=`xQeP&4J6$-N1bbgDPuAja16tNi1W zYW;4J5!>@+9!^+zJ|Wc7B3#9WC#g3akc|JUlUj1RrmJLseY)IDJ-O$|6gd19kZpZ6 zq*Xm%)H`gdos$<+qExycJ1{v|q+442I$;O}&6Qg@sNjgeapRf7BI72xwH!LS3eZj1 zUW(-M`?7CziTme+VI+6q%)uWZru#^da=lxlW$pUr`X(ta>u&`be9RHAP~j?eE;i0( zv(SEawGjHwUw+R+6|HXch?|@ukL#CH!ULZgx70PnZUt^KP;iE-+si#zS=q7*a5Oah z?h1eRFXsS+9YXY)Ek4T>WKhQ<4{AVqzZv>i6$cyub@KPq{}^F%feAF8IoCO>QELbM zPQ_=DUro-7Oa3vyZ}W-87v)BP;S07sO4%>h+@unS_|YBNefsAM$R|}Ja;?j|!sFik zbNVt0e*eZ|a=~gQ6VJDN2r7uT9kAp%43*kvwx<3<{_3+1AlguSKw`P@RY8zFC+6Qa z^^8oZ-&l+-D?ZEQ7*-tli;@6u3IX1$=k?7tOXnzG_LE=JZ%6Dcl_euxgO)IBC;U+` z7H%igRpB6u^OD1PtM_+&^|=2}byeoNu%^$e#XLXloGab1-1<-kIy+0JhRHa%Y6SAE z-j4Kxo);39@2Y**r1+ERg=ub?vYT3}Af)RvG;+Q767+Ow+U<@6Ur*usWhB%rlHkq1 zjXE_-oc&{IwA1C@UA>_=TAAfgD#~?a?ctHb!s2$q|83I$)ij|8ASg#}r#_hv^{Zi{ zSeBz+#YauE=~p>X5EP6Q6ioaGMN$uw$Z^vr@L`6S4ge_|OWM#)sZ=}z?rAM~@W^Dv zEVU22sGK~W&BlYz=AKurGX?rtAUuiqV?*S}HvcD|)y|s$#)zL$S5s4QzE^q3go-Lv z%GugC^V8!H2w_#J5?6*Q;qNrOG`D@d*|#m%gcmaG=kLq9m;DulS$2h)m1Gte#rXL0 zsFF`L+QV!{f1gpe8Pj~AvlnS@a@{vjcXjk*t|UCdY)GLWUU?Wf^teFzO_y zevE|JT;m9VuThvFV>oTU{x9e;)!ZKEhpFR;pS&CPeB-lCa>BXAC){?h0b51IL;5Uf z;xnRNq6~6K&37erJpCk^d26AY z#5rHX%KR?R9%@N?6 z&#pLduvp}t&1E0z_=)kb>5h6v{oK-E9{4$bAd;SK@u6-C$uAaijcw~dck;K-%{m&j zkv(lRmY_{9)9<%$DP`{%-xz(_qviOpRO`u9CFhiIo0POP48-vQbxuXYTnJ}ApU$>$ zdf1Yh=AFY2ecZRf;s!fd`l~ngtyj+(K*~>rF+l{K2Te0K2o_91S=ogzb1x>NP&uSv zu*DQt5_1o6N*BI7N;Ha4E@c!MKyaN4RQm{9LhSMD&*U;-H8G62{6CY}WbHiw{SKcs zdt8DD8KJu=M83|XgkvG0+}N5yYf1dB?+FO3OPW}V$LqJDwx4;4+k!|&FnM*gVbz|F z_V&!qaegpYE*wFPAUg{WDx3))y&}zZmt$e-C2E>lsV#TeHRA!hIX!^^iWVvPqvd^# zbqx^*|G0W9ixZ>2De11-TYD9N?D@sdM?`G`S>ay%y#PE~iFn8m+A3VZNBym5ra^3m zdSFQ~*#;~1!Lq1Xb~PzRef0Jz6--9reN}wG8@%6`BB=_tgg7y|%wiM;Db&*FCdFG- zIU}y-KM|CV?dtMBGfF4Nct#nviX@&C@wx&AA5DL@2F9z6Q5?E|g_jvCz4?J%ob@Dc zQuc;g>W&P$Upu=#6ZE2xk8-O5lXo@A zMbMYVI?UgZ?l#(x2A}KNcs5B`DjdWV-U_$QGhEX*71ox~%N%CrRFqp}>V~+d(;_6b4S}Tb_OvnlpFmU*pMnYtH@Wf) z3dLklsn^vsCXuk>JCdo9QVP4%8CQ5^kNk8fl>-b}RXSBHd`w#3M{I)rL=x!Uyj-+! zHI^Zl!4IBMB=)DP;woc8p>&~CodC&@E1(5TZ~EiJJdp)?O#$*Rl+jj?x;Pmhb^$x^ zyv*q|2Ik;-^tTr8_ftwnD}PG0R+NiTR7!#z+VQys%Xzz1Qkg?P^3T>@J z!E9Ovxu71WWuW8c^uZd+0L&K(Bdb-TzFT#~((sFnwZ?IPTOmOAqd$cYi zVq{4QWY7p7HJyAT;_t4cE56Ohl*i7GmffGtx&J^~e>-`6xlAwH8bEtZ1Cwp#wOMX% zJE?t=EGYZ79pv(K`{jeXHX;VF%`(Vr-eM^CMC1%QI0S&L)>1oocdJ@m? z0btMfp|Q2L)>JR`N4EKW_VSAd#sun}p`?6z+2KSM*#lHB3)bH3#&7x*v38_Q=7m!U zpLVKgB!^8+EK^v6%{TR$VfyhSS$!MyaOrn0o5>uunO z5AiI{RrzYJ$!BI2gOzTKAqSFXf9-qE$yY;4NlYrQz_>224qIqE zh!zP2!={-nn*nAOW^_kN@hMd87r<=O?dv|W$7r4M-E&{NnZLYqQqQF=Oa8HP7`v#V z^X)%${{C|ZTAH`mAC6<35S)I82`Kxn<~;VetK3NS+x)1fDLUz@T*PKTnJVG$XU;-} z8+~+V$U-NJyv2lskbaa8{*_RG>||YVrW9fOrS4m;@bd**7a~fY<9DW}*cJSD8j?~h zYoF(R4{Yz>geis5w>cz@USI4)nBF@h>k8NX2uCYhXOglXb^2HjGoHRONB=tUbq@C4 znz6~zu^l#=uv=Jb^Wa(Y6JEhx)@K_5Uhs9h6B%!Bwmb9Nnptpv4-Y8Et*f$l&7K`3 zk=`A>c?2bAa4Lk}9ZT3ODZv^Cp&80`1wek4-D`LU6mL>h^|o;39YfxR z)owss_U2XHOZ#|Tn?^jb0&F29Ut`FA4ZM@GN3Y-?w<;XSTdtRsEjN0Xx`>d~xRBh* z#Sxu}Y~OgWR_j=0Zk)?&sRp{0?QA$2Xr(sdu+g*8Z>R4y)D-0{A6!0;X-JG>PUYUYMce?NDEr@CYaR9molAKn&Q1zKP3d?sOu5-Y$T(~1~?2N zU`hI=j!-$c*>*>X9P+aECUc#zC0gO9&W20m5WgxxsD?;gk2_w^T{^PLFV{Mv+{G>~ zj~?uN^bt`7hejlK&5hq3t6H16Lfmi{7DinJZNl*_$?gC_`0!JT#&T;{-TWg&M<>n# z7XBkrw9Ekl#BWtO7CmJJ`npeZ-H~p}bI!w!bqt!)Q8p#-0{SMbLYg;^G%tFj#ZGHw zps$&zN8X~4`}mW;^@8q2E-&6#jZ@=AAf`?h7>KBw^c4sYrdfsx6#b54+;$EWk zazP)X_I-2x$9Ch_I!Y3EB!+Vt`+aM3#c7{uTet1o@z!THrfrtg8>1}9^LetRp0i4$ zuaR0$wTM1xv@;jIUfJfw661IkPb$SfzAvBN%CFfTir~9lx@SVPZ;XIL+Nh?lfPO@R z=^Y)RXy)waD5Mbc!uy=)SMF`+OB&JQr2a*TBAg)W@X9mZWC|I z&yjUZjIH|EEoy`8Gopm19`?{+bXC8AYUgYlxAk*a+t>`HJe87GQy{Je-L%vvQ z+y!Ygw`oqyZ%Jb!*uP3U-6B|NS#C{hL(VJzOeM72XM;8{4PqirrS1>UXF?_E@hR`q9DZ7AbJ4x(Qfaj^l#^0|TY5W5c|S&1qNh|9?Cbg_lJ*zs_S#lBc0S=Hamw4GUPGV^VX>)= za-ZPAn(U&vfhtw4%#kI0cHY-Ii87R)yR~awtK3P1jdr++jUSr_U%cCcQbkV{Z_e=iGE}gn( zA)7zcKWuqXd_`OnbXlgjMF{EGa`V@PLXWn0sr4fwu0STyPP4%(P_6K0M8IILWkX~c z{Cg)!56|NAo-%Y#NOpRw4O>6rl6ww5-ctp4lEy2-cH&=nWZou_`4Ne~#b#NS)GC!f zc8oOV_`H!x1bYs-OKRngm*IV?93x!_@@M!oTetS);QCtRb-JB1EUC)?+|t&bd1)2VeXmj9B@Dr zAH<6ze?#({zb7xOd|CL-u0Y<~;?&id8!J(YwH^_E@nEMu&21M(n8KRw!lgOe>pMY3 zjT-&4CThOx!7AQ)$=X?C*={+y*K@4A1U@LlmS;f9yBs~gqv)#}Jcd!dc)O8(1iwp(H3ey`iv@Lci(n3G zuBDLu7PNAgY1H--<3}5ncs@_LJyb@cZC3UIeMm|F{!?;FW+d9dU0Dc<0$96+cT9yetXPCKP2s6r2&4`_OzhPo84Jy6ny(y&X;Wb1|V@ zXR1^Fyh8rURol=}27}Q952YYBgi`syon%t(TdAHw;o&MX$#r8q=n_Rit+xaqFW$wo zU#@Mfh4*b+g>j%i!+l&R;w;+Ju~O})qc;L+l;x!xR$kL#M3tvo;EOK{e|W8kBU?*vq7Jz10h-9ff6TUK+n z@Af(V{C;6Z=Wh)UP`Br*h%RB}V(c4AA^v85%BM?IZAN(|deYFB|h)2OZ-NEa?0z>$Ejb z3}%m!3zW-)q~5W6z^sC4x`kA@h`w-#A#s~alNxK&Hss^%pU36<@UKs4l#I)YxF+a z%GXNN)zto-(nhUEAblBw3YSb`hws?l9rd&XNq<^C9>lDsIa#MyCQYfO`NfzbosWud zGo@$Nvv+?fzrC`(=%HNdI6c{p4TgO7yGiomAcLg7&7M&HyYUgE26s%9D z^UFkWj{IXx`EZwVeQRG*Y4h(XmvbSj!g$~8;d%e)# zvu znlZsnJ3%cUORm93v!4Zx4NnI~6H!0@7G3A6q&aPVyfZn!@BM58X2AQQc6u|(Jmp{% zBlJtjF-jD=)lPoKAD~U5aM~J3W89i-Ep?K_v@`m0#_B>z#2(uA%9;}E+T4gkLQYz0 z^Zw5M4$>?ncbzGnWbmYgzj%dZ8l$1FKMZuhcXBjUiXi?NY2X?WO}*E6f0-^9Kb70a zFtl8L=;?wFv=2Wv(ALD1lPv?WmFUY*NNhecyM)L0%<1W-MCwMfliklJ z-Ygl7l8=J{;gml>#BIpvam)5=xyw}4bdmXtGq!Vl44``sevyh6y#k>s+H3#^y&Ppt zFD5oMf27{GsmRAQouWXO%OIOK<@q+FxyZ_w^(-iZVyYqqgURvzNFni}eb0?h+NX-) z(`%SK#JU_^r&({lZ%2!g>D~c$qA*j6Ze=@sfzIE1pAM*L1jWm<)|CnOeVAfwj$?PT z<$qAHatC%&0{+wG-u&6kG%I65{f4=2Ak?MljIN-$-U+J07HOjHr;D#?X6xMN-hWP) z>GQhU&6?njRO_aoQ^K@{fGq<*35CtaNgWeqzLVmZpNiD2uC)>@g!=#yBvITxN82f{ zBqZw~vo1k=FH_;2BGzo5ubNJZQILxf{(^M5Ra48aVSCP(^uN>Fe!>)Hi(f5fY$nQu z^Y~}tdq1#3#p=U%HF2o}!kq5An)!t;)-EcQBX+q(x{|rlRO4HN(#jIj#|7ZA%%=dy zc9$Vfc}zrX9_(Xv(_5S$+Rf8PZ1{H03Tu{%$|Q4Ny^w`_>C;1AV%?G*m8kTDiyg6L zSP@LOytf6rw*|*L3nexVd;e&)nyziO1%30GbE$PmTlgmXN7-jWkmq8Dj@ab;j8NP0 zjiWoD*s=R%p>SpPM7uv*ouFTx)#A?Nv?;N1;f;mo5$c4x--|1~nf7UKQ9u5l<Li#rfrut)3N&-Ef%!cUaJy0Pl4+_pAD5sYsw#nATG$ZG-ZdSpGOFR1h?iADf z>VDQp(qE}XGmV)DtkqC{FOmGMc7pMO1p`?Ca94#j;JLmfq@O$RpgMzKoC$-GI*Y-Q~tUdnR#^%bm4riA*}d8#w9I$yM`p# zPXuyksC_OcN4RI2J6s{XhjENjJ*W_8V?6jH>q5Vfav?*Tv1TtC*o&I@^JAnt!t!1> z_QtYV1Sk%@f@7*DI7fXIA%*e&0a{E64Rv9NII(Q#J9LzqUF;U_|KQ7Q*WdQ0wZ6G_ zf=hGB$6d^vTt&9y&OF2GQ%W2>{{qar7^}Lp5#x?nk=AYYDj+tCIDK|^Zp8vtoAGAY zENT%g)32LJU!Zt@{!-gKV0;dccBRrROVOZ+K1H^KMH~oI-yqx9{W@3>`f=JVqGqSV z)E-UGU3oaqAx1;hwd2nY+L&t;?9^xS17-U@Mv8Z3t-GzO99c>6glxGm(pYfX^)Bx8 z2iKBfvJT18O`D06IcEMqG(3)Sij#e?7U|y@UD+13oa0WdtQ)*|+qbZEC<{|soQ_ca zK6CsBNC|dHQq0#YCD^*Qe~0wKp_$EJ$MjsCMV_5-eeVwTct*?4$9LH$J*`>UThx<* z7uLDK8Ve-)s=M!|b{+Mn){1%Uv>Lx}R6aj2q@A>>aPd*y#o&sNwn5YP{@y3EuY8b{ z(%#+rZuNTXT)tJne14GOz#$D6=5H^ZPh*$^J-kMUR<;nxeV703O2J-7L3ygDKQD8i z#NmSSPTZC=N?80&4&1sdU90;Uej(=qm?rGF;Z|v7nSKuE1eT26VxfH&Y0~&z3yiI}yZ=P8S(U2NsT&^lJ*eZgr!&jPD)R zaIVO$7H1cSB?6sjhH=h&8W{ypG8V=S=Sv9vUXknH-_6 zCjd%JHX&8N%9SHaejF8kJgyLUtoNO%+P^e|{RmR{Ay8n>=#1UG1`r;w!AAd7~=}UL%-Db^Hat%kWwFjFk^k=_9 zT6G}tr^`u={Pv$DRaKo?J#0+caKUw2h8wFjq?t>XE|?5lgN?abUyk*du)i{~^yTK|@3?95!xbH3DrTo^MT&En8kz za)Bh4wKU$H5|iQ`O`-&%4e#OX?9~j`C@iT7va2ic;84dw%=i~($FcWjl;)> zhGX4)wwZKlSXlS%4W&EKxTpV_#+*eL8M84;m^#~!zV3&;49}HERc%XmZsz6aeZ<4d zaT_LjGo!G@_N05GoS!=qYu8|*|B%orMJ}cu73~drH4kisO7qU zIzM|A=KAG3c+D0C!I|0BX!Mv7Zr2-2Tpk&o+eB*7<1LHG^Pwu7?DTcO5NZheid#Dgd6DS~rKDpAmKl*>&fI5y)$2&FkXOw*U( zAXy+ZG(T`3(QV1v^U2XQHU=A-GDNn|&0x4K{ga6|J9ZPJbd3l;is1k3YW%By9Kf`l z8MP=?Qor!!u2_5FjQYjo$+mnH%>_UD967`EZeoH#9O5qM_)_UzXkeY-C{fRi2=4SQ zCu0@Q`AgaRX8${az4_f%!U|Q#8m}vc!C|ciKn10&65ld&iGr-H3hXO0sOT5r*j|K> z0w|D9OZJEE{rbeaC?A7vP(JYBrbTxq;K7E_aUc_16~u7H5~P(GM65^(GaqBTKlZE) z<;E>>ckM$Yj>H7Qf4{O{E8^~UClIYic$Ha4Y07NSeEKBXVxI@T!H@0>t((vj_vXqL zVY3Fkbc{=@+DlT?Xk)Rs)(n|bfkfnwj+D_*o+7X;bq^KvPn^jy6eic%3YWg6I2&;U z+yiV8XiQv1qEvLquvaEkrcl;&g|JTy0|K-v1KR^-PH!0%(*x-Vapj{&D)_gib zQYvzfh`h*i@o!F_w0nEED)l(ZqTCN*kRj1Fqsuob!Wn$lavmg>G^}Qg=7z5XMX}v| zySrzN%&R1lc4bLV_;1Q0oit9{L+Yg48^SqDWcYDeO)2m0e7UlvGX`7hkS#5N_$T=z z7h6Z~j>0WPNL!LcUGj#accN#1AxQ`Az5R+Gs=JZ{!L;ICHRO6D5#12hW@Jn6b z#|T&Z$tgPLH5xCOHonu99#)(AoyT4wy6IZsyoOQN@&RqGd^;e+)nr#R862r@=ko-@ z@At&LX}o*!<$`>^VeQD_@mU}Ht&oez4}#>aR?j7arrNfe>Xy0`kj8eb>$W-5z$HK8 z0IzU3@9NOBQ0X&^lFsRBNz-hAWzh@UL{WEiv8@pB5AH7aD!&b4`1eBV(%!m-hkfc( zhq^yNXH(d-#S5ZT(x$fFD${NK8=Nm}C01ps0t?}uncb-1NK1DodF0TkK4CFr zJ-NiML4>qYS3(orgERUh*V=FrAlD;OHSaT)%F%MZP)L8z8$Mkn{|GR1bMhPrN7k z>Ih=FXtO5ToVW#h*vNcHY8J&bU^xl7gat8$)_*wq{S<@?Cky8ys5rKq1xK1kt##hz z4&9^b)f(R=tz(Zsqjp%vyf)Cjw2?NusuCQJO-buB&f2z#Zs5a{txGR!+y4M*%dVS0 z{{xgH;mef-`<3|9YqKqDw{KXgepud%@>3~73^xE?1x|GJq)4TR&DFI$Gr^IK?MJ?V zo7`psYaKti-9~U$y~m~OZuka@Y2?!D=mO91)D6EdHf|YPuBDr|ttC&QG(|b|*8#RC zeNaJsQ2K<_{oDKm`aeLVY`p$*v{&Pm39X`>hKV1{llgGH?TzTSYrMOm>`n&e;Vnu9 z7BAn^`0F2FapKElL9+Odlw#$j2(_kr0FU--KS_+J@r3HkEBgzwt&9Hi3O~6}^{<<) znb*+1n+i96#UC6oqH>0_FK<4Q3j%zUQy+;%DY;1_Q5Yf;Sh8r^e;qziT&q17GzW+| zusOSYY6nXmhn{Q`Z5+lZe;a&ZmnRia+9Z0@r9G+WuK>ao)5E;?NmFv4fJQAN_(tZV zG?>9PCc>9bml=XVnrQrsuaYEQhG=Dfe%B za$g3u{D5M=%AflJx??FCIV(ka!NF+Ro=+Azqx;I$6z@``Kiik+R+N9tUHTp=wL=-1 zYL#^C^O&pRP*uy7oSBfME{-@mWOr5LMRNkXv7}Q|a(6qnVc;i-wH6hqYaaD~r+`J+AMQ}ZY-@e~u5^qx`*Y>9SKZBMc^aQ|ZSIGM#Cpe5f|jS$HdA&Ifj zhbwYX+*tT*l%lf2v6@Z4R&nII-Ak!ev?RR<^r>7^dx1n$Mn6`OoMHr1RnkTs7-!WR zY9OPcU1{jXLD3Tf1gqp`Az8rhRW?A=ewL{=-B*)q;FE$tX{PoEwxdsfJM@}n;=1pN z8^Kd7zq_FMd5WdQUKyPhYp9bK)DqS1xW+;6kd;;QaJ`;cU)pMq^2FS@H-y@mC2@SB z00YO7B9UVK~` zO(ao6VmfPSHu>Zm4`=N;XMd|w?X~Cmg`Z&&6*rNWew|l=w?tb_#?-DCZHOuT7Nsdb zCIUa&CkYAL=&PCz5}(yFJzo-KKrOx+16E~-V09?l)j==+1@~t=CAh0&<`c0CZl{2l z*L%qOiquW*@qo(c-1mOxZ=g8sm>|GRDSG^$d`K6CY6Lkta zYdTXjznal{1wand6j{;PmBLET;O*UC_PX!qu5r|*2qi>B!GD^4c58RPlx)>i2E2>9)g=vjG>s3T;N-EN26x%^k z0|i>&iyl7xDdw#0hgmC3r+nJb&c-Pw*t+B#|}YBc&v zhkUnXu{F5Yeg-Jwz9zr<_6E=0P4!zG>f%rypd0D{fNjG>NZM5T?^OC9PHR!5*B2nrkRB^G~g0l&RlngX>3v<^#H2LN-U|Sc&}zQVyR`H4t0+F6}Y@ z(%0xYE}DFxg)~~)_<4*cE>L9meTYbRQ+!13?9gPo!icy)Bs5<|=21APw8V<=PBT^b zVd>K=A}5pLOVs5IrXa|i(8tXXUJ`uv`FUH$YIz`beS=_3NFd_WI#i7d+_l=lCUp1f z;edMr#qD}?2>9l6?_gDeFk|%p!QNX3#r3^wzD=+|Ah=r++!Nd_!QCB#1sZSMHMj*Q zxVr?mV8J1{J2dVzK^pze&hJc}Q&Z>G+Am;bYp?aLcYWUHQ4+k@ z*1nhx-t@)*y*DTKUyv%AU_7QtO`y93_(ATA8_s_~XwRJ+jLQ~eamLqOPY%0A>Ag(S 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